From 5bfcf6fd7347085c0255af6d67be178e40f00802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Urban=20Lavbi=C4=8D?= Date: Wed, 25 Feb 2026 08:20:02 +0100 Subject: [PATCH 01/12] Fixes --- .gitignore | 6 + .oxfmtrc.json | 2 +- .oxlintrc.json | 1 + openapi-codegen.config.mjs | 11 + package.json | 12 +- povio-openapi-codegen-cli-2.0.8-rc.5.tgz | Bin 0 -> 1494388 bytes src/commands/generate.ts | 90 +- src/generators/core/SchemaResolver.class.ts | 398 ++-- .../core/endpoints/getEndpointBody.ts | 22 +- .../core/endpoints/getEndpointParameter.ts | 21 +- .../endpoints/getEndpointsFromOpenAPIDoc.ts | 294 ++- .../endpoints/resolveEndpointZodSchema.ts | 92 + src/generators/core/getDataFromOpenAPIDoc.ts | 27 +- src/generators/core/zod/getZodChain.ts | 6 +- .../core/zod/getZodSchemasFromOpenAPIDoc.ts | 60 +- .../core/zod/resolveZodSchemaName.ts | 22 +- src/generators/generate/generateAcl.ts | 131 +- src/generators/generate/generateAclCheck.ts | 66 +- .../generate/generateAppRestClient.ts | 14 +- src/generators/generate/generateConfigs.ts | 177 +- src/generators/generate/generateEndpoints.ts | 174 +- src/generators/generate/generateModels.ts | 112 +- src/generators/generate/generateQueries.ts | 605 ++++- .../generate/generateQueryModules.ts | 11 +- .../generate/generateZodExtended.ts | 71 +- src/generators/generateCodeFromOpenAPIDoc.ts | 24 +- src/generators/generated-output-eq.test.ts | 62 + src/generators/templates/endpoints.hbs | 1 - src/generators/utils/file.utils.ts | 12 +- src/generators/utils/generate-files.utils.ts | 2 +- .../utils/generate/generate.openapi.utils.ts | 8 + .../utils/generate/generate.utils.ts | 4 + .../utils/hbs/hbs-template.utils.ts | 35 +- src/helpers/config.helper.ts | 26 +- src/helpers/profile.helper.ts | 68 + test/generated/.gitkeep | 0 .../generated/base/aWBStocks/aWBStocks.acl.ts | 87 + .../generated/base/aWBStocks/aWBStocks.api.ts | 114 + .../base/aWBStocks/aWBStocks.configs.ts | 91 + .../base/aWBStocks/aWBStocks.models.ts | 164 ++ .../base/aWBStocks/aWBStocks.queries.ts | 319 +++ test/generated/base/acl/app.ability.ts | 387 ++++ test/generated/base/acl/useAclCheck.ts | 25 + .../base/airPositions/airPositions.acl.ts | 27 + .../base/airPositions/airPositions.api.ts | 28 + .../base/airPositions/airPositions.models.ts | 77 + .../base/airPositions/airPositions.queries.ts | 83 + test/generated/base/airports/airports.acl.ts | 33 + test/generated/base/airports/airports.api.ts | 105 + .../base/airports/airports.configs.ts | 117 + .../base/airports/airports.models.ts | 157 ++ .../base/airports/airports.queries.ts | 294 +++ test/generated/base/app-rest-client.ts | 7 + .../base/bankAccounts/bankAccounts.acl.ts | 15 + .../base/bankAccounts/bankAccounts.api.ts | 61 + .../base/bankAccounts/bankAccounts.configs.ts | 42 + .../base/bankAccounts/bankAccounts.models.ts | 49 + .../base/bankAccounts/bankAccounts.queries.ts | 139 ++ .../bookkeepingExport.acl.ts | 123 + .../bookkeepingExport.api.ts | 185 ++ .../bookkeepingExport.configs.ts | 122 + .../bookkeepingExport.models.ts | 466 ++++ .../bookkeepingExport.queries.ts | 555 +++++ .../businessPartnerBookkeepingMappings.acl.ts | 63 + .../businessPartnerBookkeepingMappings.api.ts | 72 + ...sinessPartnerBookkeepingMappings.models.ts | 94 + ...inessPartnerBookkeepingMappings.queries.ts | 221 ++ .../businessPartnerContacts.acl.ts | 63 + .../businessPartnerContacts.api.ts | 101 + .../businessPartnerContacts.configs.ts | 41 + .../businessPartnerContacts.models.ts | 125 ++ .../businessPartnerContacts.queries.ts | 321 +++ .../businessPartners/businessPartners.acl.ts | 243 ++ .../businessPartners/businessPartners.api.ts | 286 +++ .../businessPartners.configs.ts | 148 ++ .../businessPartners.models.ts | 814 +++++++ .../businessPartners.queries.ts | 895 ++++++++ .../base/cargoTypes/cargoTypes.acl.ts | 45 + .../base/cargoTypes/cargoTypes.api.ts | 123 + .../base/cargoTypes/cargoTypes.configs.ts | 141 ++ .../base/cargoTypes/cargoTypes.models.ts | 224 ++ .../base/cargoTypes/cargoTypes.queries.ts | 362 +++ .../base/chargeTypes/chargeTypes.acl.ts | 45 + .../base/chargeTypes/chargeTypes.api.ts | 131 ++ .../base/chargeTypes/chargeTypes.configs.ts | 135 ++ .../base/chargeTypes/chargeTypes.models.ts | 230 ++ .../base/chargeTypes/chargeTypes.queries.ts | 362 +++ .../base/checklistItems/checklistItems.acl.ts | 87 + .../base/checklistItems/checklistItems.api.ts | 142 ++ .../checklistItems/checklistItems.configs.ts | 115 + .../checklistItems/checklistItems.models.ts | 144 ++ .../checklistItems/checklistItems.queries.ts | 416 ++++ .../checklistTemplates.acl.ts | 87 + .../checklistTemplates.api.ts | 144 ++ .../checklistTemplates.configs.ts | 117 + .../checklistTemplates.models.ts | 167 ++ .../checklistTemplates.queries.ts | 425 ++++ test/generated/base/cities/cities.acl.ts | 51 + test/generated/base/cities/cities.api.ts | 113 + test/generated/base/cities/cities.configs.ts | 123 + test/generated/base/cities/cities.models.ts | 203 ++ test/generated/base/cities/cities.queries.ts | 370 ++++ test/generated/base/common/common.models.ts | 1969 +++++++++++++++++ .../base/containerYards/containerYards.acl.ts | 51 + .../base/containerYards/containerYards.api.ts | 144 ++ .../containerYards/containerYards.configs.ts | 141 ++ .../containerYards/containerYards.models.ts | 211 ++ .../containerYards/containerYards.queries.ts | 392 ++++ .../controlTowerAuth/controlTowerAuth.api.ts | 24 + .../controlTowerAuth.models.ts | 42 + .../controlTowerAuth.queries.ts | 64 + .../controlTowerBookings.api.ts | 63 + .../controlTowerBookings.configs.ts | 55 + .../controlTowerBookings.models.ts | 248 +++ .../controlTowerBookings.queries.ts | 141 ++ .../controlTowerCalendar.api.ts | 45 + .../controlTowerCalendar.models.ts | 109 + .../controlTowerCalendar.queries.ts | 74 + .../controlTowerContainers.api.ts | 65 + .../controlTowerContainers.configs.ts | 53 + .../controlTowerContainers.models.ts | 209 ++ .../controlTowerContainers.queries.ts | 139 ++ .../base/controlTowerMe/controlTowerMe.api.ts | 54 + .../controlTowerMe/controlTowerMe.models.ts | 225 ++ .../controlTowerMe/controlTowerMe.queries.ts | 169 ++ .../controlTowerPackages.api.ts | 47 + .../controlTowerPackages.configs.ts | 49 + .../controlTowerPackages.models.ts | 74 + .../controlTowerPackages.queries.ts | 97 + .../controlTowerSearch.api.ts | 30 + .../controlTowerSearch.models.ts | 51 + .../controlTowerSearch.queries.ts | 44 + .../generated/base/countries/countries.acl.ts | 21 + .../generated/base/countries/countries.api.ts | 87 + .../base/countries/countries.configs.ts | 83 + .../base/countries/countries.models.ts | 117 + .../base/countries/countries.queries.ts | 233 ++ .../base/currencies/currencies.acl.ts | 39 + .../base/currencies/currencies.api.ts | 154 ++ .../base/currencies/currencies.configs.ts | 152 ++ .../base/currencies/currencies.models.ts | 175 ++ .../base/currencies/currencies.queries.ts | 431 ++++ .../customerAccount/customerAccount.api.ts | 13 + .../customerAccount/customerAccount.models.ts | 51 + .../customerAccount.queries.ts | 32 + .../generated/base/customers/customers.acl.ts | 41 + .../generated/base/customers/customers.api.ts | 91 + .../base/customers/customers.configs.ts | 91 + .../base/customers/customers.models.ts | 199 ++ .../base/customers/customers.queries.ts | 282 +++ test/generated/base/depots/depots.acl.ts | 45 + test/generated/base/depots/depots.api.ts | 113 + test/generated/base/depots/depots.configs.ts | 133 ++ test/generated/base/depots/depots.models.ts | 233 ++ test/generated/base/depots/depots.queries.ts | 349 +++ .../documentTemplates.acl.ts | 111 + .../documentTemplates.api.ts | 170 ++ .../documentTemplates.configs.ts | 118 + .../documentTemplates.models.ts | 195 ++ .../documentTemplates.queries.ts | 509 +++++ .../dunningAccountStatement.acl.ts | 27 + .../dunningAccountStatement.api.ts | 78 + .../dunningAccountStatement.models.ts | 156 ++ .../dunningAccountStatement.queries.ts | 270 +++ .../base/dunningLevels/dunningLevels.acl.ts | 87 + .../base/dunningLevels/dunningLevels.api.ts | 142 ++ .../dunningLevels/dunningLevels.configs.ts | 134 ++ .../dunningLevels/dunningLevels.models.ts | 207 ++ .../dunningLevels/dunningLevels.queries.ts | 420 ++++ .../dunningManagement.acl.ts | 39 + .../dunningManagement.api.ts | 81 + .../dunningManagement.configs.ts | 59 + .../dunningManagement.models.ts | 299 +++ .../dunningManagement.queries.ts | 241 ++ .../dunningPartnerOutstandingInvoices.acl.ts | 39 + .../dunningPartnerOutstandingInvoices.api.ts | 110 + ...nningPartnerOutstandingInvoices.configs.ts | 96 + ...unningPartnerOutstandingInvoices.models.ts | 207 ++ ...nningPartnerOutstandingInvoices.queries.ts | 365 +++ .../base/dunningSystems/dunningSystems.acl.ts | 87 + .../base/dunningSystems/dunningSystems.api.ts | 142 ++ .../dunningSystems/dunningSystems.configs.ts | 119 + .../dunningSystems/dunningSystems.models.ts | 145 ++ .../dunningSystems/dunningSystems.queries.ts | 420 ++++ test/generated/base/employee/employee.acl.ts | 115 + test/generated/base/employee/employee.api.ts | 237 ++ .../base/employee/employee.configs.ts | 134 ++ .../base/employee/employee.models.ts | 325 +++ .../base/employee/employee.queries.ts | 626 ++++++ .../employeeAccount/employeeAccount.api.ts | 13 + .../employeeAccount/employeeAccount.models.ts | 86 + .../employeeAccount.queries.ts | 32 + .../employeePermissions.acl.ts | 15 + .../employeePermissions.api.ts | 62 + .../employeePermissions.configs.ts | 44 + .../employeePermissions.models.ts | 74 + .../employeePermissions.queries.ts | 141 ++ .../employeeProfile/employeeProfile.api.ts | 26 + .../employeeProfile/employeeProfile.models.ts | 52 + .../employeeProfile.queries.ts | 63 + .../base/employeeRoles/employeeRoles.acl.ts | 63 + .../base/employeeRoles/employeeRoles.api.ts | 127 ++ .../employeeRoles/employeeRoles.configs.ts | 89 + .../employeeRoles/employeeRoles.models.ts | 175 ++ .../employeeRoles/employeeRoles.queries.ts | 368 +++ .../employeeSettings/employeeSettings.api.ts | 28 + .../employeeSettings.models.ts | 44 + .../employeeSettings.queries.ts | 63 + .../base/employment/employment.acl.ts | 87 + .../base/employment/employment.api.ts | 112 + .../base/employment/employment.configs.ts | 62 + .../base/employment/employment.models.ts | 139 ++ .../base/employment/employment.queries.ts | 315 +++ .../factoringExport/factoringExport.acl.ts | 27 + .../factoringExport/factoringExport.api.ts | 27 + .../factoringExport/factoringExport.models.ts | 61 + .../factoringExport.queries.ts | 80 + .../base/factoringMerge/factoringMerge.acl.ts | 39 + .../base/factoringMerge/factoringMerge.api.ts | 36 + .../factoringMerge/factoringMerge.models.ts | 137 ++ .../factoringMerge/factoringMerge.queries.ts | 113 + test/generated/base/files/files.api.ts | 96 + test/generated/base/files/files.models.ts | 62 + test/generated/base/files/files.queries.ts | 245 ++ test/generated/base/folders/folders.api.ts | 92 + test/generated/base/folders/folders.models.ts | 133 ++ .../generated/base/folders/folders.queries.ts | 279 +++ test/generated/base/hsCodes/hsCodes.acl.ts | 45 + test/generated/base/hsCodes/hsCodes.api.ts | 123 + .../generated/base/hsCodes/hsCodes.configs.ts | 119 + test/generated/base/hsCodes/hsCodes.models.ts | 158 ++ .../generated/base/hsCodes/hsCodes.queries.ts | 353 +++ .../integrationChannels.acl.ts | 99 + .../integrationChannels.api.ts | 152 ++ .../integrationChannels.configs.ts | 154 ++ .../integrationChannels.models.ts | 283 +++ .../integrationChannels.queries.ts | 471 ++++ .../inttraOfficeIntegration.acl.ts | 39 + .../inttraOfficeIntegration.api.ts | 36 + .../inttraOfficeIntegration.models.ts | 76 + .../inttraOfficeIntegration.queries.ts | 108 + .../inttraShippingInstructionMessages.acl.ts | 67 + .../inttraShippingInstructionMessages.api.ts | 90 + ...ttraShippingInstructionMessages.configs.ts | 87 + ...nttraShippingInstructionMessages.models.ts | 172 ++ ...ttraShippingInstructionMessages.queries.ts | 315 +++ .../invoicePayments/invoicePayments.acl.ts | 111 + .../invoicePayments/invoicePayments.api.ts | 181 ++ .../invoicePayments.configs.ts | 143 ++ .../invoicePayments/invoicePayments.models.ts | 470 ++++ .../invoicePayments.queries.ts | 467 ++++ test/generated/base/invoices/invoices.acl.ts | 375 ++++ test/generated/base/invoices/invoices.api.ts | 537 +++++ .../base/invoices/invoices.configs.ts | 321 +++ .../base/invoices/invoices.models.ts | 1605 ++++++++++++++ .../base/invoices/invoices.queries.ts | 1600 ++++++++++++++ .../base/masterData/masterData.acl.ts | 15 + .../base/masterData/masterData.api.ts | 66 + .../base/masterData/masterData.configs.ts | 28 + .../base/masterData/masterData.models.ts | 94 + .../base/masterData/masterData.queries.ts | 178 ++ .../masterDataImport/masterDataImport.acl.ts | 39 + .../masterDataImport/masterDataImport.api.ts | 40 + .../masterDataImport.models.ts | 110 + .../masterDataImport.queries.ts | 146 ++ test/generated/base/offices/offices.acl.ts | 84 + test/generated/base/offices/offices.api.ts | 177 ++ .../generated/base/offices/offices.configs.ts | 134 ++ test/generated/base/offices/offices.models.ts | 603 +++++ .../generated/base/offices/offices.queries.ts | 510 +++++ .../base/packageTypes/packageTypes.acl.ts | 45 + .../base/packageTypes/packageTypes.api.ts | 131 ++ .../base/packageTypes/packageTypes.configs.ts | 128 ++ .../base/packageTypes/packageTypes.models.ts | 572 +++++ .../base/packageTypes/packageTypes.queries.ts | 365 +++ .../partnerNetworks/partnerNetworks.acl.ts | 45 + .../partnerNetworks/partnerNetworks.api.ts | 135 ++ .../partnerNetworks.configs.ts | 113 + .../partnerNetworks/partnerNetworks.models.ts | 142 ++ .../partnerNetworks.queries.ts | 370 ++++ .../paymentConfirmations.acl.ts | 39 + .../paymentConfirmations.api.ts | 88 + .../paymentConfirmations.configs.ts | 48 + .../paymentConfirmations.models.ts | 95 + .../paymentConfirmations.queries.ts | 204 ++ test/generated/base/ports/ports.acl.ts | 33 + test/generated/base/ports/ports.api.ts | 100 + test/generated/base/ports/ports.configs.ts | 127 ++ test/generated/base/ports/ports.models.ts | 217 ++ test/generated/base/ports/ports.queries.ts | 281 +++ .../positionAccount/positionAccount.acl.ts | 15 + .../positionAccount/positionAccount.api.ts | 13 + .../positionAccount/positionAccount.models.ts | 78 + .../positionAccount.queries.ts | 44 + .../positionAccountItems.acl.ts | 75 + .../positionAccountItems.api.ts | 92 + .../positionAccountItems.models.ts | 251 +++ .../positionAccountItems.queries.ts | 229 ++ .../base/positionCargo/positionCargo.acl.ts | 111 + .../base/positionCargo/positionCargo.api.ts | 135 ++ .../positionCargo/positionCargo.configs.ts | 132 ++ .../positionCargo/positionCargo.models.ts | 57 + .../positionCargo/positionCargo.queries.ts | 415 ++++ .../positionCargoPackage.acl.ts | 63 + .../positionCargoPackage.api.ts | 84 + .../positionCargoPackage.queries.ts | 207 ++ .../positionChecklist.acl.ts | 75 + .../positionChecklist.api.ts | 75 + .../positionChecklist.models.ts | 96 + .../positionChecklist.queries.ts | 227 ++ .../positionInvolvedParties.acl.ts | 51 + .../positionInvolvedParties.api.ts | 59 + .../positionInvolvedParties.models.ts | 11 + .../positionInvolvedParties.queries.ts | 157 ++ .../positionProfitChangeTracking.acl.ts | 29 + .../positionProfitChangeTracking.api.ts | 67 + .../positionProfitChangeTracking.configs.ts | 51 + .../positionProfitChangeTracking.models.ts | 117 + .../positionProfitChangeTracking.queries.ts | 208 ++ .../base/positionRoutes/positionRoutes.acl.ts | 87 + .../base/positionRoutes/positionRoutes.api.ts | 99 + .../positionRoutes/positionRoutes.queries.ts | 263 +++ .../generated/base/positions/positions.acl.ts | 195 ++ .../generated/base/positions/positions.api.ts | 277 +++ .../base/positions/positions.configs.ts | 258 +++ .../base/positions/positions.models.ts | 888 ++++++++ .../base/positions/positions.queries.ts | 757 +++++++ .../base/projectLite/projectLite.acl.ts | 87 + .../base/projectLite/projectLite.api.ts | 142 ++ .../base/projectLite/projectLite.configs.ts | 115 + .../base/projectLite/projectLite.models.ts | 128 ++ .../base/projectLite/projectLite.queries.ts | 415 ++++ test/generated/base/queryModules.ts | 96 + .../base/quoteAccount/quoteAccount.acl.ts | 63 + .../base/quoteAccount/quoteAccount.api.ts | 62 + .../base/quoteAccount/quoteAccount.models.ts | 273 +++ .../base/quoteAccount/quoteAccount.queries.ts | 187 ++ .../base/quoteCargo/quoteCargo.acl.ts | 99 + .../base/quoteCargo/quoteCargo.api.ts | 116 + .../base/quoteCargo/quoteCargo.configs.ts | 99 + .../base/quoteCargo/quoteCargo.models.ts | 55 + .../base/quoteCargo/quoteCargo.queries.ts | 380 ++++ .../quoteCargoPackage.acl.ts | 63 + .../quoteCargoPackage.api.ts | 84 + .../quoteCargoPackage.queries.ts | 207 ++ .../quoteConversion/quoteConversion.acl.ts | 15 + .../quoteConversion/quoteConversion.api.ts | 21 + .../quoteConversion/quoteConversion.models.ts | 13 + .../quoteConversion.queries.ts | 48 + .../base/quoteDocument/quoteDocument.acl.ts | 63 + .../base/quoteDocument/quoteDocument.api.ts | 85 + .../quoteDocument/quoteDocument.models.ts | 198 ++ .../quoteDocument/quoteDocument.queries.ts | 186 ++ .../quoteProfitChangeTracking.acl.ts | 29 + .../quoteProfitChangeTracking.api.ts | 51 + .../quoteProfitChangeTracking.configs.ts | 35 + .../quoteProfitChangeTracking.models.ts | 84 + .../quoteProfitChangeTracking.queries.ts | 142 ++ .../base/quoteRoutes/quoteRoutes.acl.ts | 87 + .../base/quoteRoutes/quoteRoutes.api.ts | 99 + .../base/quoteRoutes/quoteRoutes.queries.ts | 263 +++ test/generated/base/quotes/quotes.acl.ts | 147 ++ test/generated/base/quotes/quotes.api.ts | 193 ++ test/generated/base/quotes/quotes.configs.ts | 136 ++ test/generated/base/quotes/quotes.models.ts | 339 +++ test/generated/base/quotes/quotes.queries.ts | 507 +++++ .../remarkTemplates/remarkTemplates.acl.ts | 87 + .../remarkTemplates/remarkTemplates.api.ts | 142 ++ .../remarkTemplates.configs.ts | 122 + .../remarkTemplates/remarkTemplates.models.ts | 221 ++ .../remarkTemplates.queries.ts | 420 ++++ .../base/roadQuotes/roadQuotes.acl.ts | 27 + .../base/roadQuotes/roadQuotes.api.ts | 28 + .../base/roadQuotes/roadQuotes.models.ts | 45 + .../base/roadQuotes/roadQuotes.queries.ts | 83 + .../base/seaPositions/seaPositions.acl.ts | 27 + .../base/seaPositions/seaPositions.api.ts | 28 + .../base/seaPositions/seaPositions.models.ts | 87 + .../base/seaPositions/seaPositions.queries.ts | 83 + .../generated/base/seaQuotes/seaQuotes.acl.ts | 27 + .../generated/base/seaQuotes/seaQuotes.api.ts | 28 + .../base/seaQuotes/seaQuotes.models.ts | 52 + .../base/seaQuotes/seaQuotes.queries.ts | 83 + .../shippingInstructions.acl.ts | 93 + .../shippingInstructions.api.ts | 84 + .../shippingInstructions.models.ts | 847 +++++++ .../shippingInstructions.queries.ts | 272 +++ .../generated/base/terminals/terminals.acl.ts | 45 + .../generated/base/terminals/terminals.api.ts | 113 + .../base/terminals/terminals.configs.ts | 145 ++ .../base/terminals/terminals.models.ts | 294 +++ .../base/terminals/terminals.queries.ts | 358 +++ .../base/useCrossTabQueryInvalidation.ts | 40 + test/generated/base/useMutationEffects.ts | 95 + .../base/userActivity/userActivity.api.ts | 30 + .../base/userActivity/userActivity.models.ts | 91 + .../base/userActivity/userActivity.queries.ts | 50 + test/generated/base/vatRules/vatRules.acl.ts | 45 + test/generated/base/vatRules/vatRules.api.ts | 123 + .../base/vatRules/vatRules.configs.ts | 150 ++ .../base/vatRules/vatRules.models.ts | 224 ++ .../base/vatRules/vatRules.queries.ts | 341 +++ .../base/warehouses/warehouses.acl.ts | 45 + .../base/warehouses/warehouses.api.ts | 113 + .../base/warehouses/warehouses.configs.ts | 140 ++ .../base/warehouses/warehouses.models.ts | 224 ++ .../base/warehouses/warehouses.queries.ts | 348 +++ .../workingDocuments/workingDocuments.acl.ts | 27 + .../workingDocuments/workingDocuments.api.ts | 57 + .../workingDocuments.configs.ts | 54 + .../workingDocuments.models.ts | 100 + .../workingDocuments.queries.ts | 190 ++ .../workingDocumentsAmsInstructions.acl.ts | 93 + .../workingDocumentsAmsInstructions.api.ts | 94 + .../workingDocumentsAmsInstructions.models.ts | 245 ++ ...workingDocumentsAmsInstructions.queries.ts | 312 +++ .../workingDocumentsBlInstructions.acl.ts | 108 + .../workingDocumentsBlInstructions.api.ts | 116 + .../workingDocumentsBlInstructions.models.ts | 472 ++++ .../workingDocumentsBlInstructions.queries.ts | 341 +++ .../workingDocumentsCmrForm.acl.ts | 75 + .../workingDocumentsCmrForm.api.ts | 79 + .../workingDocumentsCmrForm.models.ts | 320 +++ .../workingDocumentsCmrForm.queries.ts | 266 +++ .../workingDocumentsExportDeclaration.acl.ts | 99 + .../workingDocumentsExportDeclaration.api.ts | 94 + ...orkingDocumentsExportDeclaration.models.ts | 179 ++ ...rkingDocumentsExportDeclaration.queries.ts | 320 +++ .../workingDocumentsFcrForm.acl.ts | 75 + .../workingDocumentsFcrForm.api.ts | 79 + .../workingDocumentsFcrForm.models.ts | 150 ++ .../workingDocumentsFcrForm.queries.ts | 266 +++ .../workingDocumentsHouseAwb.acl.ts | 75 + .../workingDocumentsHouseAwb.api.ts | 89 + .../workingDocumentsHouseAwb.models.ts | 307 +++ .../workingDocumentsHouseAwb.queries.ts | 266 +++ .../workingDocumentsHouseBl.acl.ts | 99 + .../workingDocumentsHouseBl.api.ts | 136 ++ .../workingDocumentsHouseBl.models.ts | 350 +++ .../workingDocumentsHouseBl.queries.ts | 392 ++++ .../workingDocumentsIsfForm.acl.ts | 75 + .../workingDocumentsIsfForm.api.ts | 79 + .../workingDocumentsIsfForm.models.ts | 260 +++ .../workingDocumentsIsfForm.queries.ts | 266 +++ .../workingDocumentsMasterAwb.acl.ts | 75 + .../workingDocumentsMasterAwb.api.ts | 94 + .../workingDocumentsMasterAwb.models.ts | 311 +++ .../workingDocumentsMasterAwb.queries.ts | 266 +++ .../workingDocumentsTemplatedDocument.acl.ts | 115 + .../workingDocumentsTemplatedDocument.api.ts | 123 + ...orkingDocumentsTemplatedDocument.models.ts | 94 + ...rkingDocumentsTemplatedDocument.queries.ts | 332 +++ test/generated/base/zod.extended.ts | 47 + .../generated/dist/aWBStocks/aWBStocks.acl.ts | 87 + .../generated/dist/aWBStocks/aWBStocks.api.ts | 108 + .../dist/aWBStocks/aWBStocks.configs.ts | 91 + .../dist/aWBStocks/aWBStocks.models.ts | 164 ++ .../dist/aWBStocks/aWBStocks.queries.ts | 319 +++ test/generated/dist/acl/app.ability.ts | 387 ++++ test/generated/dist/acl/useAclCheck.ts | 24 + .../dist/airPositions/airPositions.acl.ts | 27 + .../dist/airPositions/airPositions.api.ts | 27 + .../dist/airPositions/airPositions.models.ts | 77 + .../dist/airPositions/airPositions.queries.ts | 83 + test/generated/dist/airports/airports.acl.ts | 33 + test/generated/dist/airports/airports.api.ts | 101 + .../dist/airports/airports.configs.ts | 117 + .../dist/airports/airports.models.ts | 157 ++ .../dist/airports/airports.queries.ts | 294 +++ test/generated/dist/app-rest-client.ts | 7 + .../dist/bankAccounts/bankAccounts.acl.ts | 15 + .../dist/bankAccounts/bankAccounts.api.ts | 60 + .../dist/bankAccounts/bankAccounts.configs.ts | 42 + .../dist/bankAccounts/bankAccounts.models.ts | 49 + .../dist/bankAccounts/bankAccounts.queries.ts | 139 ++ .../bookkeepingExport.acl.ts | 123 + .../bookkeepingExport.api.ts | 176 ++ .../bookkeepingExport.configs.ts | 122 + .../bookkeepingExport.models.ts | 466 ++++ .../bookkeepingExport.queries.ts | 555 +++++ .../businessPartnerBookkeepingMappings.acl.ts | 63 + .../businessPartnerBookkeepingMappings.api.ts | 68 + ...sinessPartnerBookkeepingMappings.models.ts | 94 + ...inessPartnerBookkeepingMappings.queries.ts | 221 ++ .../businessPartnerContacts.acl.ts | 63 + .../businessPartnerContacts.api.ts | 97 + .../businessPartnerContacts.configs.ts | 41 + .../businessPartnerContacts.models.ts | 125 ++ .../businessPartnerContacts.queries.ts | 321 +++ .../businessPartners/businessPartners.acl.ts | 243 ++ .../businessPartners/businessPartners.api.ts | 267 +++ .../businessPartners.configs.ts | 148 ++ .../businessPartners.models.ts | 814 +++++++ .../businessPartners.queries.ts | 895 ++++++++ .../dist/cargoTypes/cargoTypes.acl.ts | 45 + .../dist/cargoTypes/cargoTypes.api.ts | 117 + .../dist/cargoTypes/cargoTypes.configs.ts | 141 ++ .../dist/cargoTypes/cargoTypes.models.ts | 224 ++ .../dist/cargoTypes/cargoTypes.queries.ts | 362 +++ .../dist/chargeTypes/chargeTypes.acl.ts | 45 + .../dist/chargeTypes/chargeTypes.api.ts | 125 ++ .../dist/chargeTypes/chargeTypes.configs.ts | 135 ++ .../dist/chargeTypes/chargeTypes.models.ts | 230 ++ .../dist/chargeTypes/chargeTypes.queries.ts | 362 +++ .../dist/checklistItems/checklistItems.acl.ts | 87 + .../dist/checklistItems/checklistItems.api.ts | 136 ++ .../checklistItems/checklistItems.configs.ts | 115 + .../checklistItems/checklistItems.models.ts | 144 ++ .../checklistItems/checklistItems.queries.ts | 416 ++++ .../checklistTemplates.acl.ts | 87 + .../checklistTemplates.api.ts | 138 ++ .../checklistTemplates.configs.ts | 117 + .../checklistTemplates.models.ts | 167 ++ .../checklistTemplates.queries.ts | 425 ++++ test/generated/dist/cities/cities.acl.ts | 51 + test/generated/dist/cities/cities.api.ts | 106 + test/generated/dist/cities/cities.configs.ts | 123 + test/generated/dist/cities/cities.models.ts | 203 ++ test/generated/dist/cities/cities.queries.ts | 370 ++++ test/generated/dist/common/common.models.ts | 1860 ++++++++++++++++ .../dist/containerYards/containerYards.acl.ts | 51 + .../dist/containerYards/containerYards.api.ts | 137 ++ .../containerYards/containerYards.configs.ts | 141 ++ .../containerYards/containerYards.models.ts | 211 ++ .../containerYards/containerYards.queries.ts | 392 ++++ .../controlTowerAuth/controlTowerAuth.api.ts | 23 + .../controlTowerAuth.models.ts | 42 + .../controlTowerAuth.queries.ts | 64 + .../controlTowerBookings.api.ts | 61 + .../controlTowerBookings.configs.ts | 55 + .../controlTowerBookings.models.ts | 248 +++ .../controlTowerBookings.queries.ts | 141 ++ .../controlTowerCalendar.api.ts | 45 + .../controlTowerCalendar.models.ts | 109 + .../controlTowerCalendar.queries.ts | 74 + .../controlTowerContainers.api.ts | 63 + .../controlTowerContainers.configs.ts | 53 + .../controlTowerContainers.models.ts | 209 ++ .../controlTowerContainers.queries.ts | 139 ++ .../dist/controlTowerMe/controlTowerMe.api.ts | 49 + .../controlTowerMe/controlTowerMe.models.ts | 225 ++ .../controlTowerMe/controlTowerMe.queries.ts | 169 ++ .../controlTowerPackages.api.ts | 47 + .../controlTowerPackages.configs.ts | 49 + .../controlTowerPackages.models.ts | 74 + .../controlTowerPackages.queries.ts | 97 + .../controlTowerSearch.api.ts | 30 + .../controlTowerSearch.models.ts | 51 + .../controlTowerSearch.queries.ts | 44 + .../generated/dist/countries/countries.acl.ts | 21 + .../generated/dist/countries/countries.api.ts | 85 + .../dist/countries/countries.configs.ts | 83 + .../dist/countries/countries.models.ts | 117 + .../dist/countries/countries.queries.ts | 233 ++ .../dist/currencies/currencies.acl.ts | 39 + .../dist/currencies/currencies.api.ts | 149 ++ .../dist/currencies/currencies.configs.ts | 152 ++ .../dist/currencies/currencies.models.ts | 175 ++ .../dist/currencies/currencies.queries.ts | 431 ++++ .../customerAccount/customerAccount.api.ts | 13 + .../customerAccount/customerAccount.models.ts | 51 + .../customerAccount.queries.ts | 32 + .../generated/dist/customers/customers.acl.ts | 41 + .../generated/dist/customers/customers.api.ts | 85 + .../dist/customers/customers.configs.ts | 91 + .../dist/customers/customers.models.ts | 199 ++ .../dist/customers/customers.queries.ts | 282 +++ test/generated/dist/depots/depots.acl.ts | 45 + test/generated/dist/depots/depots.api.ts | 107 + test/generated/dist/depots/depots.configs.ts | 133 ++ test/generated/dist/depots/depots.models.ts | 233 ++ test/generated/dist/depots/depots.queries.ts | 349 +++ .../documentTemplates.acl.ts | 111 + .../documentTemplates.api.ts | 162 ++ .../documentTemplates.configs.ts | 118 + .../documentTemplates.models.ts | 195 ++ .../documentTemplates.queries.ts | 509 +++++ .../dunningAccountStatement.acl.ts | 27 + .../dunningAccountStatement.api.ts | 76 + .../dunningAccountStatement.models.ts | 156 ++ .../dunningAccountStatement.queries.ts | 270 +++ .../dist/dunningLevels/dunningLevels.acl.ts | 87 + .../dist/dunningLevels/dunningLevels.api.ts | 136 ++ .../dunningLevels/dunningLevels.configs.ts | 134 ++ .../dunningLevels/dunningLevels.models.ts | 207 ++ .../dunningLevels/dunningLevels.queries.ts | 420 ++++ .../dunningManagement.acl.ts | 39 + .../dunningManagement.api.ts | 78 + .../dunningManagement.configs.ts | 59 + .../dunningManagement.models.ts | 299 +++ .../dunningManagement.queries.ts | 241 ++ .../dunningPartnerOutstandingInvoices.acl.ts | 39 + .../dunningPartnerOutstandingInvoices.api.ts | 108 + ...nningPartnerOutstandingInvoices.configs.ts | 96 + ...unningPartnerOutstandingInvoices.models.ts | 207 ++ ...nningPartnerOutstandingInvoices.queries.ts | 365 +++ .../dist/dunningSystems/dunningSystems.acl.ts | 87 + .../dist/dunningSystems/dunningSystems.api.ts | 136 ++ .../dunningSystems/dunningSystems.configs.ts | 119 + .../dunningSystems/dunningSystems.models.ts | 145 ++ .../dunningSystems/dunningSystems.queries.ts | 420 ++++ test/generated/dist/employee/employee.acl.ts | 115 + test/generated/dist/employee/employee.api.ts | 223 ++ .../dist/employee/employee.configs.ts | 134 ++ .../dist/employee/employee.models.ts | 325 +++ .../dist/employee/employee.queries.ts | 626 ++++++ .../employeeAccount/employeeAccount.api.ts | 13 + .../employeeAccount/employeeAccount.models.ts | 86 + .../employeeAccount.queries.ts | 32 + .../employeePermissions.acl.ts | 15 + .../employeePermissions.api.ts | 61 + .../employeePermissions.configs.ts | 44 + .../employeePermissions.models.ts | 74 + .../employeePermissions.queries.ts | 141 ++ .../employeeProfile/employeeProfile.api.ts | 25 + .../employeeProfile/employeeProfile.models.ts | 52 + .../employeeProfile.queries.ts | 63 + .../dist/employeeRoles/employeeRoles.acl.ts | 63 + .../dist/employeeRoles/employeeRoles.api.ts | 119 + .../employeeRoles/employeeRoles.configs.ts | 89 + .../employeeRoles/employeeRoles.models.ts | 175 ++ .../employeeRoles/employeeRoles.queries.ts | 368 +++ .../employeeSettings/employeeSettings.api.ts | 27 + .../employeeSettings.models.ts | 44 + .../employeeSettings.queries.ts | 63 + .../dist/employment/employment.acl.ts | 87 + .../dist/employment/employment.api.ts | 106 + .../dist/employment/employment.configs.ts | 62 + .../dist/employment/employment.models.ts | 139 ++ .../dist/employment/employment.queries.ts | 315 +++ .../factoringExport/factoringExport.acl.ts | 27 + .../factoringExport/factoringExport.api.ts | 26 + .../factoringExport/factoringExport.models.ts | 61 + .../factoringExport.queries.ts | 80 + .../dist/factoringMerge/factoringMerge.acl.ts | 39 + .../dist/factoringMerge/factoringMerge.api.ts | 34 + .../factoringMerge/factoringMerge.models.ts | 137 ++ .../factoringMerge/factoringMerge.queries.ts | 113 + test/generated/dist/files/files.api.ts | 90 + test/generated/dist/files/files.models.ts | 62 + test/generated/dist/files/files.queries.ts | 245 ++ test/generated/dist/folders/folders.api.ts | 87 + test/generated/dist/folders/folders.models.ts | 133 ++ .../generated/dist/folders/folders.queries.ts | 279 +++ test/generated/dist/hsCodes/hsCodes.acl.ts | 45 + test/generated/dist/hsCodes/hsCodes.api.ts | 117 + .../generated/dist/hsCodes/hsCodes.configs.ts | 119 + test/generated/dist/hsCodes/hsCodes.models.ts | 158 ++ .../generated/dist/hsCodes/hsCodes.queries.ts | 353 +++ .../integrationChannels.acl.ts | 99 + .../integrationChannels.api.ts | 145 ++ .../integrationChannels.configs.ts | 154 ++ .../integrationChannels.models.ts | 283 +++ .../integrationChannels.queries.ts | 471 ++++ .../inttraOfficeIntegration.acl.ts | 39 + .../inttraOfficeIntegration.api.ts | 34 + .../inttraOfficeIntegration.models.ts | 76 + .../inttraOfficeIntegration.queries.ts | 108 + .../inttraShippingInstructionMessages.acl.ts | 67 + .../inttraShippingInstructionMessages.api.ts | 87 + ...ttraShippingInstructionMessages.configs.ts | 87 + ...nttraShippingInstructionMessages.models.ts | 172 ++ ...ttraShippingInstructionMessages.queries.ts | 315 +++ .../invoicePayments/invoicePayments.acl.ts | 111 + .../invoicePayments/invoicePayments.api.ts | 173 ++ .../invoicePayments.configs.ts | 143 ++ .../invoicePayments/invoicePayments.models.ts | 470 ++++ .../invoicePayments.queries.ts | 467 ++++ test/generated/dist/invoices/invoices.acl.ts | 375 ++++ test/generated/dist/invoices/invoices.api.ts | 507 +++++ .../dist/invoices/invoices.configs.ts | 321 +++ .../dist/invoices/invoices.models.ts | 1605 ++++++++++++++ .../dist/invoices/invoices.queries.ts | 1600 ++++++++++++++ .../dist/masterData/masterData.acl.ts | 15 + .../dist/masterData/masterData.api.ts | 65 + .../dist/masterData/masterData.configs.ts | 28 + .../dist/masterData/masterData.models.ts | 94 + .../dist/masterData/masterData.queries.ts | 178 ++ .../masterDataImport/masterDataImport.acl.ts | 39 + .../masterDataImport/masterDataImport.api.ts | 38 + .../masterDataImport.models.ts | 110 + .../masterDataImport.queries.ts | 146 ++ test/generated/dist/offices/offices.acl.ts | 84 + test/generated/dist/offices/offices.api.ts | 167 ++ .../generated/dist/offices/offices.configs.ts | 134 ++ test/generated/dist/offices/offices.models.ts | 603 +++++ .../generated/dist/offices/offices.queries.ts | 510 +++++ .../dist/packageTypes/packageTypes.acl.ts | 45 + .../dist/packageTypes/packageTypes.api.ts | 125 ++ .../dist/packageTypes/packageTypes.configs.ts | 128 ++ .../dist/packageTypes/packageTypes.models.ts | 572 +++++ .../dist/packageTypes/packageTypes.queries.ts | 365 +++ .../partnerNetworks/partnerNetworks.acl.ts | 45 + .../partnerNetworks/partnerNetworks.api.ts | 129 ++ .../partnerNetworks.configs.ts | 113 + .../partnerNetworks/partnerNetworks.models.ts | 142 ++ .../partnerNetworks.queries.ts | 370 ++++ .../paymentConfirmations.acl.ts | 39 + .../paymentConfirmations.api.ts | 86 + .../paymentConfirmations.configs.ts | 48 + .../paymentConfirmations.models.ts | 95 + .../paymentConfirmations.queries.ts | 204 ++ test/generated/dist/ports/ports.acl.ts | 33 + test/generated/dist/ports/ports.api.ts | 96 + test/generated/dist/ports/ports.configs.ts | 127 ++ test/generated/dist/ports/ports.models.ts | 217 ++ test/generated/dist/ports/ports.queries.ts | 281 +++ .../positionAccount/positionAccount.acl.ts | 15 + .../positionAccount/positionAccount.api.ts | 13 + .../positionAccount/positionAccount.models.ts | 78 + .../positionAccount.queries.ts | 44 + .../positionAccountItems.acl.ts | 75 + .../positionAccountItems.api.ts | 87 + .../positionAccountItems.models.ts | 251 +++ .../positionAccountItems.queries.ts | 229 ++ .../dist/positionCargo/positionCargo.acl.ts | 111 + .../dist/positionCargo/positionCargo.api.ts | 127 ++ .../positionCargo/positionCargo.configs.ts | 132 ++ .../positionCargo/positionCargo.models.ts | 57 + .../positionCargo/positionCargo.queries.ts | 415 ++++ .../positionCargoPackage.acl.ts | 63 + .../positionCargoPackage.api.ts | 80 + .../positionCargoPackage.queries.ts | 207 ++ .../positionChecklist.acl.ts | 75 + .../positionChecklist.api.ts | 70 + .../positionChecklist.models.ts | 96 + .../positionChecklist.queries.ts | 227 ++ .../positionInvolvedParties.acl.ts | 51 + .../positionInvolvedParties.api.ts | 56 + .../positionInvolvedParties.models.ts | 11 + .../positionInvolvedParties.queries.ts | 157 ++ .../positionProfitChangeTracking.acl.ts | 29 + .../positionProfitChangeTracking.api.ts | 66 + .../positionProfitChangeTracking.configs.ts | 51 + .../positionProfitChangeTracking.models.ts | 117 + .../positionProfitChangeTracking.queries.ts | 208 ++ .../dist/positionRoutes/positionRoutes.acl.ts | 87 + .../dist/positionRoutes/positionRoutes.api.ts | 93 + .../positionRoutes/positionRoutes.queries.ts | 263 +++ .../generated/dist/positions/positions.acl.ts | 195 ++ .../generated/dist/positions/positions.api.ts | 262 +++ .../dist/positions/positions.configs.ts | 258 +++ .../dist/positions/positions.models.ts | 888 ++++++++ .../dist/positions/positions.queries.ts | 757 +++++++ .../dist/projectLite/projectLite.acl.ts | 87 + .../dist/projectLite/projectLite.api.ts | 136 ++ .../dist/projectLite/projectLite.configs.ts | 115 + .../dist/projectLite/projectLite.models.ts | 128 ++ .../dist/projectLite/projectLite.queries.ts | 415 ++++ test/generated/dist/queryModules.ts | 96 + .../dist/quoteAccount/quoteAccount.acl.ts | 63 + .../dist/quoteAccount/quoteAccount.api.ts | 58 + .../dist/quoteAccount/quoteAccount.models.ts | 273 +++ .../dist/quoteAccount/quoteAccount.queries.ts | 187 ++ .../dist/quoteCargo/quoteCargo.acl.ts | 99 + .../dist/quoteCargo/quoteCargo.api.ts | 109 + .../dist/quoteCargo/quoteCargo.configs.ts | 99 + .../dist/quoteCargo/quoteCargo.models.ts | 55 + .../dist/quoteCargo/quoteCargo.queries.ts | 380 ++++ .../quoteCargoPackage.acl.ts | 63 + .../quoteCargoPackage.api.ts | 80 + .../quoteCargoPackage.queries.ts | 207 ++ .../quoteConversion/quoteConversion.acl.ts | 15 + .../quoteConversion/quoteConversion.api.ts | 21 + .../quoteConversion/quoteConversion.models.ts | 13 + .../quoteConversion.queries.ts | 48 + .../dist/quoteDocument/quoteDocument.acl.ts | 63 + .../dist/quoteDocument/quoteDocument.api.ts | 81 + .../quoteDocument/quoteDocument.models.ts | 198 ++ .../quoteDocument/quoteDocument.queries.ts | 186 ++ .../quoteProfitChangeTracking.acl.ts | 29 + .../quoteProfitChangeTracking.api.ts | 50 + .../quoteProfitChangeTracking.configs.ts | 35 + .../quoteProfitChangeTracking.models.ts | 84 + .../quoteProfitChangeTracking.queries.ts | 142 ++ .../dist/quoteRoutes/quoteRoutes.acl.ts | 87 + .../dist/quoteRoutes/quoteRoutes.api.ts | 93 + .../dist/quoteRoutes/quoteRoutes.queries.ts | 263 +++ test/generated/dist/quotes/quotes.acl.ts | 147 ++ test/generated/dist/quotes/quotes.api.ts | 182 ++ test/generated/dist/quotes/quotes.configs.ts | 136 ++ test/generated/dist/quotes/quotes.models.ts | 322 +++ test/generated/dist/quotes/quotes.queries.ts | 507 +++++ .../remarkTemplates/remarkTemplates.acl.ts | 87 + .../remarkTemplates/remarkTemplates.api.ts | 136 ++ .../remarkTemplates.configs.ts | 122 + .../remarkTemplates/remarkTemplates.models.ts | 221 ++ .../remarkTemplates.queries.ts | 420 ++++ .../dist/roadQuotes/roadQuotes.acl.ts | 27 + .../dist/roadQuotes/roadQuotes.api.ts | 27 + .../dist/roadQuotes/roadQuotes.models.ts | 45 + .../dist/roadQuotes/roadQuotes.queries.ts | 83 + .../dist/seaPositions/seaPositions.acl.ts | 27 + .../dist/seaPositions/seaPositions.api.ts | 27 + .../dist/seaPositions/seaPositions.models.ts | 87 + .../dist/seaPositions/seaPositions.queries.ts | 83 + .../generated/dist/seaQuotes/seaQuotes.acl.ts | 27 + .../generated/dist/seaQuotes/seaQuotes.api.ts | 27 + .../dist/seaQuotes/seaQuotes.models.ts | 52 + .../dist/seaQuotes/seaQuotes.queries.ts | 83 + .../shippingInstructions.acl.ts | 93 + .../shippingInstructions.api.ts | 79 + .../shippingInstructions.models.ts | 847 +++++++ .../shippingInstructions.queries.ts | 272 +++ .../generated/dist/terminals/terminals.acl.ts | 45 + .../generated/dist/terminals/terminals.api.ts | 107 + .../dist/terminals/terminals.configs.ts | 145 ++ .../dist/terminals/terminals.models.ts | 294 +++ .../dist/terminals/terminals.queries.ts | 358 +++ .../dist/useCrossTabQueryInvalidation.ts | 40 + test/generated/dist/useMutationEffects.ts | 95 + .../dist/userActivity/userActivity.api.ts | 30 + .../dist/userActivity/userActivity.models.ts | 91 + .../dist/userActivity/userActivity.queries.ts | 50 + test/generated/dist/vatRules/vatRules.acl.ts | 45 + test/generated/dist/vatRules/vatRules.api.ts | 117 + .../dist/vatRules/vatRules.configs.ts | 150 ++ .../dist/vatRules/vatRules.models.ts | 224 ++ .../dist/vatRules/vatRules.queries.ts | 341 +++ .../dist/warehouses/warehouses.acl.ts | 45 + .../dist/warehouses/warehouses.api.ts | 107 + .../dist/warehouses/warehouses.configs.ts | 140 ++ .../dist/warehouses/warehouses.models.ts | 224 ++ .../dist/warehouses/warehouses.queries.ts | 348 +++ .../workingDocuments/workingDocuments.acl.ts | 27 + .../workingDocuments/workingDocuments.api.ts | 56 + .../workingDocuments.configs.ts | 54 + .../workingDocuments.models.ts | 100 + .../workingDocuments.queries.ts | 190 ++ .../workingDocumentsAmsInstructions.acl.ts | 93 + .../workingDocumentsAmsInstructions.api.ts | 89 + .../workingDocumentsAmsInstructions.models.ts | 245 ++ ...workingDocumentsAmsInstructions.queries.ts | 312 +++ .../workingDocumentsBlInstructions.acl.ts | 108 + .../workingDocumentsBlInstructions.api.ts | 110 + .../workingDocumentsBlInstructions.models.ts | 472 ++++ .../workingDocumentsBlInstructions.queries.ts | 341 +++ .../workingDocumentsCmrForm.acl.ts | 75 + .../workingDocumentsCmrForm.api.ts | 74 + .../workingDocumentsCmrForm.models.ts | 320 +++ .../workingDocumentsCmrForm.queries.ts | 266 +++ .../workingDocumentsExportDeclaration.acl.ts | 99 + .../workingDocumentsExportDeclaration.api.ts | 89 + ...orkingDocumentsExportDeclaration.models.ts | 179 ++ ...rkingDocumentsExportDeclaration.queries.ts | 320 +++ .../workingDocumentsFcrForm.acl.ts | 75 + .../workingDocumentsFcrForm.api.ts | 74 + .../workingDocumentsFcrForm.models.ts | 150 ++ .../workingDocumentsFcrForm.queries.ts | 266 +++ .../workingDocumentsHouseAwb.acl.ts | 75 + .../workingDocumentsHouseAwb.api.ts | 84 + .../workingDocumentsHouseAwb.models.ts | 307 +++ .../workingDocumentsHouseAwb.queries.ts | 266 +++ .../workingDocumentsHouseBl.acl.ts | 99 + .../workingDocumentsHouseBl.api.ts | 129 ++ .../workingDocumentsHouseBl.models.ts | 350 +++ .../workingDocumentsHouseBl.queries.ts | 392 ++++ .../workingDocumentsIsfForm.acl.ts | 75 + .../workingDocumentsIsfForm.api.ts | 74 + .../workingDocumentsIsfForm.models.ts | 260 +++ .../workingDocumentsIsfForm.queries.ts | 266 +++ .../workingDocumentsMasterAwb.acl.ts | 75 + .../workingDocumentsMasterAwb.api.ts | 89 + .../workingDocumentsMasterAwb.models.ts | 311 +++ .../workingDocumentsMasterAwb.queries.ts | 266 +++ .../workingDocumentsTemplatedDocument.acl.ts | 115 + .../workingDocumentsTemplatedDocument.api.ts | 117 + ...orkingDocumentsTemplatedDocument.models.ts | 94 + ...rkingDocumentsTemplatedDocument.queries.ts | 332 +++ test/generated/dist/zod.extended.ts | 47 + .../generated/full/aWBStocks/aWBStocks.acl.ts | 95 + .../generated/full/aWBStocks/aWBStocks.api.ts | 71 + .../full/aWBStocks/aWBStocks.configs.ts | 92 + .../full/aWBStocks/aWBStocks.models.ts | 114 + .../full/aWBStocks/aWBStocks.queries.ts | 242 ++ test/generated/full/acl/app.ability.ts | 32 + test/generated/full/acl/useAclCheck.ts | 21 + .../full/airPositions/airPositions.acl.ts | 30 + .../full/airPositions/airPositions.api.ts | 22 + .../full/airPositions/airPositions.models.ts | 49 + .../full/airPositions/airPositions.queries.ts | 71 + test/generated/full/airports/airports.acl.ts | 54 + test/generated/full/airports/airports.api.ts | 63 + .../full/airports/airports.configs.ts | 118 + .../full/airports/airports.models.ts | 109 + .../full/airports/airports.queries.ts | 209 ++ test/generated/full/app-rest-client.ts | 7 + .../full/bankAccounts/bankAccounts.acl.ts | 24 + .../full/bankAccounts/bankAccounts.api.ts | 37 + .../full/bankAccounts/bankAccounts.configs.ts | 43 + .../full/bankAccounts/bankAccounts.models.ts | 42 + .../full/bankAccounts/bankAccounts.queries.ts | 97 + .../bookkeepingExport.acl.ts | 134 ++ .../bookkeepingExport.api.ts | 107 + .../bookkeepingExport.configs.ts | 123 + .../bookkeepingExport.models.ts | 293 +++ .../bookkeepingExport.queries.ts | 351 +++ .../businessPartnerBookkeepingMappings.acl.ts | 69 + .../businessPartnerBookkeepingMappings.api.ts | 47 + ...sinessPartnerBookkeepingMappings.models.ts | 62 + ...inessPartnerBookkeepingMappings.queries.ts | 154 ++ .../businessPartnerContacts.acl.ts | 69 + .../businessPartnerContacts.api.ts | 55 + .../businessPartnerContacts.configs.ts | 42 + .../businessPartnerContacts.models.ts | 84 + .../businessPartnerContacts.queries.ts | 186 ++ .../businessPartners/businessPartners.acl.ts | 264 +++ .../businessPartners/businessPartners.api.ts | 179 ++ .../businessPartners.configs.ts | 149 ++ .../businessPartners.models.ts | 489 ++++ .../businessPartners.queries.ts | 642 ++++++ .../full/cargoTypes/cargoTypes.acl.ts | 74 + .../full/cargoTypes/cargoTypes.api.ts | 79 + .../full/cargoTypes/cargoTypes.configs.ts | 142 ++ .../full/cargoTypes/cargoTypes.models.ts | 141 ++ .../full/cargoTypes/cargoTypes.queries.ts | 265 +++ .../full/chargeTypes/chargeTypes.acl.ts | 74 + .../full/chargeTypes/chargeTypes.api.ts | 79 + .../full/chargeTypes/chargeTypes.configs.ts | 136 ++ .../full/chargeTypes/chargeTypes.models.ts | 154 ++ .../full/chargeTypes/chargeTypes.queries.ts | 265 +++ .../full/checklistItems/checklistItems.acl.ts | 95 + .../full/checklistItems/checklistItems.api.ts | 79 + .../checklistItems/checklistItems.configs.ts | 116 + .../checklistItems/checklistItems.models.ts | 107 + .../checklistItems/checklistItems.queries.ts | 270 +++ .../checklistTemplates.acl.ts | 95 + .../checklistTemplates.api.ts | 79 + .../checklistTemplates.configs.ts | 118 + .../checklistTemplates.models.ts | 119 + .../checklistTemplates.queries.ts | 270 +++ test/generated/full/cities/cities.acl.ts | 84 + test/generated/full/cities/cities.api.ts | 86 + test/generated/full/cities/cities.configs.ts | 124 ++ test/generated/full/cities/cities.models.ts | 145 ++ test/generated/full/cities/cities.queries.ts | 283 +++ test/generated/full/common/common.models.ts | 1860 ++++++++++++++++ .../full/containerYards/containerYards.acl.ts | 84 + .../full/containerYards/containerYards.api.ts | 87 + .../containerYards/containerYards.configs.ts | 142 ++ .../containerYards/containerYards.models.ts | 139 ++ .../containerYards/containerYards.queries.ts | 287 +++ .../controlTowerAuth/controlTowerAuth.api.ts | 23 + .../controlTowerAuth.models.ts | 34 + .../controlTowerAuth.queries.ts | 60 + .../controlTowerBookings.api.ts | 38 + .../controlTowerBookings.configs.ts | 56 + .../controlTowerBookings.models.ts | 147 ++ .../controlTowerBookings.queries.ts | 105 + .../controlTowerCalendar.api.ts | 26 + .../controlTowerCalendar.models.ts | 91 + .../controlTowerCalendar.queries.ts | 39 + .../controlTowerContainers.api.ts | 38 + .../controlTowerContainers.configs.ts | 54 + .../controlTowerContainers.models.ts | 133 ++ .../controlTowerContainers.queries.ts | 104 + .../full/controlTowerMe/controlTowerMe.api.ts | 55 + .../controlTowerMe/controlTowerMe.models.ts | 173 ++ .../controlTowerMe/controlTowerMe.queries.ts | 148 ++ .../controlTowerPackages.api.ts | 24 + .../controlTowerPackages.configs.ts | 50 + .../controlTowerPackages.models.ts | 54 + .../controlTowerPackages.queries.ts | 66 + .../controlTowerSearch.api.ts | 22 + .../controlTowerSearch.models.ts | 42 + .../controlTowerSearch.queries.ts | 38 + .../generated/full/countries/countries.acl.ts | 34 + .../generated/full/countries/countries.api.ts | 47 + .../full/countries/countries.configs.ts | 84 + .../full/countries/countries.models.ts | 82 + .../full/countries/countries.queries.ts | 153 ++ .../full/currencies/currencies.acl.ts | 64 + .../full/currencies/currencies.api.ts | 79 + .../full/currencies/currencies.configs.ts | 153 ++ .../full/currencies/currencies.models.ts | 122 + .../full/currencies/currencies.queries.ts | 268 +++ .../customerAccount/customerAccount.api.ts | 13 + .../customerAccount/customerAccount.models.ts | 37 + .../customerAccount.queries.ts | 32 + .../generated/full/customers/customers.acl.ts | 66 + .../generated/full/customers/customers.api.ts | 70 + .../full/customers/customers.configs.ts | 92 + .../full/customers/customers.models.ts | 137 ++ .../full/customers/customers.queries.ts | 222 ++ test/generated/full/depots/depots.acl.ts | 74 + test/generated/full/depots/depots.api.ts | 79 + test/generated/full/depots/depots.configs.ts | 134 ++ test/generated/full/depots/depots.models.ts | 157 ++ test/generated/full/depots/depots.queries.ts | 261 +++ .../documentTemplates.acl.ts | 121 + .../documentTemplates.api.ts | 95 + .../documentTemplates.configs.ts | 119 + .../documentTemplates.models.ts | 138 ++ .../documentTemplates.queries.ts | 334 +++ .../dunningAccountStatement.acl.ts | 30 + .../dunningAccountStatement.api.ts | 52 + .../dunningAccountStatement.models.ts | 83 + .../dunningAccountStatement.queries.ts | 156 ++ .../full/dunningLevels/dunningLevels.acl.ts | 95 + .../full/dunningLevels/dunningLevels.api.ts | 79 + .../dunningLevels/dunningLevels.configs.ts | 135 ++ .../dunningLevels/dunningLevels.models.ts | 136 ++ .../dunningLevels/dunningLevels.queries.ts | 274 +++ .../dunningManagement.acl.ts | 43 + .../dunningManagement.api.ts | 53 + .../dunningManagement.configs.ts | 60 + .../dunningManagement.models.ts | 195 ++ .../dunningManagement.queries.ts | 175 ++ .../dunningPartnerOutstandingInvoices.acl.ts | 43 + .../dunningPartnerOutstandingInvoices.api.ts | 48 + ...nningPartnerOutstandingInvoices.configs.ts | 97 + ...unningPartnerOutstandingInvoices.models.ts | 129 ++ ...nningPartnerOutstandingInvoices.queries.ts | 166 ++ .../full/dunningSystems/dunningSystems.acl.ts | 95 + .../full/dunningSystems/dunningSystems.api.ts | 79 + .../dunningSystems/dunningSystems.configs.ts | 120 + .../dunningSystems/dunningSystems.models.ts | 111 + .../dunningSystems/dunningSystems.queries.ts | 274 +++ test/generated/full/employee/employee.acl.ts | 153 ++ test/generated/full/employee/employee.api.ts | 157 ++ .../full/employee/employee.configs.ts | 135 ++ .../full/employee/employee.models.ts | 227 ++ .../full/employee/employee.queries.ts | 470 ++++ .../employeeAccount/employeeAccount.api.ts | 13 + .../employeeAccount/employeeAccount.models.ts | 53 + .../employeeAccount.queries.ts | 32 + .../employeePermissions.acl.ts | 24 + .../employeePermissions.api.ts | 36 + .../employeePermissions.configs.ts | 45 + .../employeePermissions.models.ts | 54 + .../employeePermissions.queries.ts | 94 + .../employeeProfile/employeeProfile.api.ts | 22 + .../employeeProfile/employeeProfile.models.ts | 33 + .../employeeProfile.queries.ts | 58 + .../full/employeeRoles/employeeRoles.acl.ts | 97 + .../full/employeeRoles/employeeRoles.api.ts | 92 + .../employeeRoles/employeeRoles.configs.ts | 90 + .../employeeRoles/employeeRoles.models.ts | 125 ++ .../employeeRoles/employeeRoles.queries.ts | 283 +++ .../employeeSettings/employeeSettings.api.ts | 23 + .../employeeSettings.models.ts | 20 + .../employeeSettings.queries.ts | 58 + .../full/employment/employment.acl.ts | 95 + .../full/employment/employment.api.ts | 73 + .../full/employment/employment.configs.ts | 63 + .../full/employment/employment.models.ts | 114 + .../full/employment/employment.queries.ts | 235 ++ .../factoringExport/factoringExport.acl.ts | 30 + .../factoringExport/factoringExport.api.ts | 22 + .../factoringExport/factoringExport.models.ts | 41 + .../factoringExport.queries.ts | 68 + .../full/factoringMerge/factoringMerge.acl.ts | 43 + .../full/factoringMerge/factoringMerge.api.ts | 30 + .../factoringMerge/factoringMerge.models.ts | 84 + .../factoringMerge/factoringMerge.queries.ts | 97 + test/generated/full/files/files.api.ts | 72 + test/generated/full/files/files.models.ts | 57 + test/generated/full/files/files.queries.ts | 210 ++ test/generated/full/folders/folders.api.ts | 63 + test/generated/full/folders/folders.models.ts | 96 + .../generated/full/folders/folders.queries.ts | 188 ++ test/generated/full/hsCodes/hsCodes.acl.ts | 74 + test/generated/full/hsCodes/hsCodes.api.ts | 79 + .../generated/full/hsCodes/hsCodes.configs.ts | 120 + test/generated/full/hsCodes/hsCodes.models.ts | 111 + .../generated/full/hsCodes/hsCodes.queries.ts | 265 +++ .../integrationChannels.acl.ts | 108 + .../integrationChannels.api.ts | 87 + .../integrationChannels.configs.ts | 155 ++ .../integrationChannels.models.ts | 197 ++ .../integrationChannels.queries.ts | 303 +++ .../inttraOfficeIntegration.acl.ts | 43 + .../inttraOfficeIntegration.api.ts | 30 + .../inttraOfficeIntegration.models.ts | 52 + .../inttraOfficeIntegration.queries.ts | 93 + .../inttraShippingInstructionMessages.acl.ts | 56 + .../inttraShippingInstructionMessages.api.ts | 46 + ...ttraShippingInstructionMessages.configs.ts | 88 + ...nttraShippingInstructionMessages.models.ts | 104 + ...ttraShippingInstructionMessages.queries.ts | 165 ++ .../invoicePayments/invoicePayments.acl.ts | 121 + .../invoicePayments/invoicePayments.api.ts | 100 + .../invoicePayments.configs.ts | 144 ++ .../invoicePayments/invoicePayments.models.ts | 292 +++ .../invoicePayments.queries.ts | 326 +++ test/generated/full/invoices/invoices.acl.ts | 407 ++++ test/generated/full/invoices/invoices.api.ts | 349 +++ .../full/invoices/invoices.configs.ts | 322 +++ .../full/invoices/invoices.models.ts | 988 +++++++++ .../full/invoices/invoices.queries.ts | 1123 ++++++++++ .../full/masterData/masterData.acl.ts | 24 + .../full/masterData/masterData.api.ts | 37 + .../full/masterData/masterData.configs.ts | 29 + .../full/masterData/masterData.models.ts | 68 + .../full/masterData/masterData.queries.ts | 100 + .../masterDataImport/masterDataImport.acl.ts | 43 + .../masterDataImport/masterDataImport.api.ts | 30 + .../masterDataImport.models.ts | 78 + .../masterDataImport.queries.ts | 121 + test/generated/full/offices/offices.acl.ts | 102 + test/generated/full/offices/offices.api.ts | 115 + .../generated/full/offices/offices.configs.ts | 135 ++ test/generated/full/offices/offices.models.ts | 390 ++++ .../generated/full/offices/offices.queries.ts | 403 ++++ .../full/packageTypes/packageTypes.acl.ts | 74 + .../full/packageTypes/packageTypes.api.ts | 79 + .../full/packageTypes/packageTypes.configs.ts | 129 ++ .../full/packageTypes/packageTypes.models.ts | 128 ++ .../full/packageTypes/packageTypes.queries.ts | 265 +++ .../partnerNetworks/partnerNetworks.acl.ts | 74 + .../partnerNetworks/partnerNetworks.api.ts | 79 + .../partnerNetworks.configs.ts | 114 + .../partnerNetworks/partnerNetworks.models.ts | 105 + .../partnerNetworks.queries.ts | 265 +++ .../paymentConfirmations.acl.ts | 43 + .../paymentConfirmations.api.ts | 54 + .../paymentConfirmations.configs.ts | 49 + .../paymentConfirmations.models.ts | 70 + .../paymentConfirmations.queries.ts | 131 ++ test/generated/full/ports/ports.acl.ts | 54 + test/generated/full/ports/ports.api.ts | 63 + test/generated/full/ports/ports.configs.ts | 128 ++ test/generated/full/ports/ports.models.ts | 151 ++ test/generated/full/ports/ports.queries.ts | 209 ++ .../positionAccount/positionAccount.acl.ts | 17 + .../positionAccount/positionAccount.api.ts | 13 + .../positionAccount/positionAccount.models.ts | 52 + .../positionAccount.queries.ts | 39 + .../positionAccountItems.acl.ts | 82 + .../positionAccountItems.api.ts | 56 + .../positionAccountItems.models.ts | 167 ++ .../positionAccountItems.queries.ts | 185 ++ .../full/positionCargo/positionCargo.acl.ts | 121 + .../full/positionCargo/positionCargo.api.ts | 85 + .../positionCargo/positionCargo.configs.ts | 133 ++ .../positionCargo/positionCargo.models.ts | 47 + .../positionCargo/positionCargo.queries.ts | 294 +++ .../positionCargoPackage.acl.ts | 69 + .../positionCargoPackage.api.ts | 48 + .../positionCargoPackage.queries.ts | 163 ++ .../positionChecklist.acl.ts | 82 + .../positionChecklist.api.ts | 54 + .../positionChecklist.models.ts | 77 + .../positionChecklist.queries.ts | 182 ++ .../positionInvolvedParties.acl.ts | 56 + .../positionInvolvedParties.api.ts | 40 + .../positionInvolvedParties.models.ts | 12 + .../positionInvolvedParties.queries.ts | 126 ++ .../positionProfitChangeTracking.acl.ts | 32 + .../positionProfitChangeTracking.api.ts | 31 + .../positionProfitChangeTracking.configs.ts | 51 + .../positionProfitChangeTracking.models.ts | 74 + .../positionProfitChangeTracking.queries.ts | 102 + .../full/positionRoutes/positionRoutes.acl.ts | 95 + .../full/positionRoutes/positionRoutes.api.ts | 63 + .../positionRoutes/positionRoutes.queries.ts | 213 ++ .../generated/full/positions/positions.acl.ts | 212 ++ .../generated/full/positions/positions.api.ts | 166 ++ .../full/positions/positions.configs.ts | 259 +++ .../full/positions/positions.models.ts | 501 +++++ .../full/positions/positions.queries.ts | 536 +++++ .../full/projectLite/projectLite.acl.ts | 95 + .../full/projectLite/projectLite.api.ts | 79 + .../full/projectLite/projectLite.configs.ts | 116 + .../full/projectLite/projectLite.models.ts | 98 + .../full/projectLite/projectLite.queries.ts | 270 +++ test/generated/full/queryModules.ts | 96 + .../full/quoteAccount/quoteAccount.acl.ts | 69 + .../full/quoteAccount/quoteAccount.api.ts | 47 + .../full/quoteAccount/quoteAccount.models.ts | 170 ++ .../full/quoteAccount/quoteAccount.queries.ts | 154 ++ .../full/quoteCargo/quoteCargo.acl.ts | 108 + .../full/quoteCargo/quoteCargo.api.ts | 77 + .../full/quoteCargo/quoteCargo.configs.ts | 100 + .../full/quoteCargo/quoteCargo.models.ts | 47 + .../full/quoteCargo/quoteCargo.queries.ts | 266 +++ .../quoteCargoPackage.acl.ts | 69 + .../quoteCargoPackage.api.ts | 48 + .../quoteCargoPackage.queries.ts | 163 ++ .../quoteConversion/quoteConversion.acl.ts | 17 + .../quoteConversion/quoteConversion.api.ts | 16 + .../quoteConversion/quoteConversion.models.ts | 12 + .../quoteConversion.queries.ts | 44 + .../full/quoteDocument/quoteDocument.acl.ts | 69 + .../full/quoteDocument/quoteDocument.api.ts | 61 + .../quoteDocument/quoteDocument.models.ts | 134 ++ .../quoteDocument/quoteDocument.queries.ts | 153 ++ .../quoteProfitChangeTracking.acl.ts | 32 + .../quoteProfitChangeTracking.api.ts | 29 + .../quoteProfitChangeTracking.configs.ts | 36 + .../quoteProfitChangeTracking.models.ts | 56 + .../quoteProfitChangeTracking.queries.ts | 97 + .../full/quoteRoutes/quoteRoutes.acl.ts | 95 + .../full/quoteRoutes/quoteRoutes.api.ts | 63 + .../full/quoteRoutes/quoteRoutes.queries.ts | 213 ++ test/generated/full/quotes/quotes.acl.ts | 160 ++ test/generated/full/quotes/quotes.api.ts | 123 + test/generated/full/quotes/quotes.configs.ts | 137 ++ test/generated/full/quotes/quotes.models.ts | 322 +++ test/generated/full/quotes/quotes.queries.ts | 377 ++++ .../remarkTemplates/remarkTemplates.acl.ts | 95 + .../remarkTemplates/remarkTemplates.api.ts | 79 + .../remarkTemplates.configs.ts | 123 + .../remarkTemplates/remarkTemplates.models.ts | 132 ++ .../remarkTemplates.queries.ts | 274 +++ .../full/roadQuotes/roadQuotes.acl.ts | 30 + .../full/roadQuotes/roadQuotes.api.ts | 22 + .../full/roadQuotes/roadQuotes.models.ts | 29 + .../full/roadQuotes/roadQuotes.queries.ts | 71 + .../full/seaPositions/seaPositions.acl.ts | 30 + .../full/seaPositions/seaPositions.api.ts | 22 + .../full/seaPositions/seaPositions.models.ts | 49 + .../full/seaPositions/seaPositions.queries.ts | 71 + .../generated/full/seaQuotes/seaQuotes.acl.ts | 30 + .../generated/full/seaQuotes/seaQuotes.api.ts | 22 + .../full/seaQuotes/seaQuotes.models.ts | 33 + .../full/seaQuotes/seaQuotes.queries.ts | 71 + .../shippingInstructions.acl.ts | 82 + .../shippingInstructions.api.ts | 62 + .../shippingInstructions.models.ts | 510 +++++ .../shippingInstructions.queries.ts | 212 ++ .../generated/full/terminals/terminals.acl.ts | 74 + .../generated/full/terminals/terminals.api.ts | 79 + .../full/terminals/terminals.configs.ts | 146 ++ .../full/terminals/terminals.models.ts | 196 ++ .../full/terminals/terminals.queries.ts | 261 +++ .../full/useCrossTabQueryInvalidation.ts | 40 + test/generated/full/useMutationEffects.ts | 95 + .../full/userActivity/userActivity.api.ts | 20 + .../full/userActivity/userActivity.models.ts | 64 + .../full/userActivity/userActivity.queries.ts | 36 + test/generated/full/vatRules/vatRules.acl.ts | 74 + test/generated/full/vatRules/vatRules.api.ts | 79 + .../full/vatRules/vatRules.configs.ts | 151 ++ .../full/vatRules/vatRules.models.ts | 146 ++ .../full/vatRules/vatRules.queries.ts | 265 +++ .../full/warehouses/warehouses.acl.ts | 74 + .../full/warehouses/warehouses.api.ts | 79 + .../full/warehouses/warehouses.configs.ts | 141 ++ .../full/warehouses/warehouses.models.ts | 152 ++ .../full/warehouses/warehouses.queries.ts | 261 +++ .../workingDocuments/workingDocuments.acl.ts | 30 + .../workingDocuments/workingDocuments.api.ts | 31 + .../workingDocuments.configs.ts | 55 + .../workingDocuments.models.ts | 70 + .../workingDocuments.queries.ts | 102 + .../workingDocumentsAmsInstructions.acl.ts | 82 + .../workingDocumentsAmsInstructions.api.ts | 62 + .../workingDocumentsAmsInstructions.models.ts | 142 ++ ...workingDocumentsAmsInstructions.queries.ts | 212 ++ .../workingDocumentsBlInstructions.acl.ts | 95 + .../workingDocumentsBlInstructions.api.ts | 77 + .../workingDocumentsBlInstructions.models.ts | 260 +++ .../workingDocumentsBlInstructions.queries.ts | 243 ++ .../workingDocumentsCmrForm.acl.ts | 82 + .../workingDocumentsCmrForm.api.ts | 62 + .../workingDocumentsCmrForm.models.ts | 187 ++ .../workingDocumentsCmrForm.queries.ts | 212 ++ .../workingDocumentsExportDeclaration.acl.ts | 82 + .../workingDocumentsExportDeclaration.api.ts | 62 + ...orkingDocumentsExportDeclaration.models.ts | 94 + ...rkingDocumentsExportDeclaration.queries.ts | 212 ++ .../workingDocumentsFcrForm.acl.ts | 82 + .../workingDocumentsFcrForm.api.ts | 62 + .../workingDocumentsFcrForm.models.ts | 86 + .../workingDocumentsFcrForm.queries.ts | 212 ++ .../workingDocumentsHouseAwb.acl.ts | 82 + .../workingDocumentsHouseAwb.api.ts | 62 + .../workingDocumentsHouseAwb.models.ts | 174 ++ .../workingDocumentsHouseAwb.queries.ts | 212 ++ .../workingDocumentsHouseBl.acl.ts | 108 + .../workingDocumentsHouseBl.api.ts | 91 + .../workingDocumentsHouseBl.models.ts | 196 ++ .../workingDocumentsHouseBl.queries.ts | 297 +++ .../workingDocumentsIsfForm.acl.ts | 82 + .../workingDocumentsIsfForm.api.ts | 62 + .../workingDocumentsIsfForm.models.ts | 154 ++ .../workingDocumentsIsfForm.queries.ts | 212 ++ .../workingDocumentsMasterAwb.acl.ts | 82 + .../workingDocumentsMasterAwb.api.ts | 62 + .../workingDocumentsMasterAwb.models.ts | 176 ++ .../workingDocumentsMasterAwb.queries.ts | 212 ++ .../workingDocumentsTemplatedDocument.acl.ts | 95 + .../workingDocumentsTemplatedDocument.api.ts | 78 + ...orkingDocumentsTemplatedDocument.models.ts | 61 + ...rkingDocumentsTemplatedDocument.queries.ts | 217 ++ test/generated/full/zod.extended.ts | 47 + .../generated/next/aWBStocks/aWBStocks.acl.ts | 95 + .../generated/next/aWBStocks/aWBStocks.api.ts | 71 + .../next/aWBStocks/aWBStocks.configs.ts | 92 + .../next/aWBStocks/aWBStocks.models.ts | 114 + .../next/aWBStocks/aWBStocks.queries.ts | 242 ++ test/generated/next/acl/app.ability.ts | 32 + test/generated/next/acl/useAclCheck.ts | 21 + .../next/airPositions/airPositions.acl.ts | 30 + .../next/airPositions/airPositions.api.ts | 22 + .../next/airPositions/airPositions.models.ts | 49 + .../next/airPositions/airPositions.queries.ts | 71 + test/generated/next/airports/airports.acl.ts | 54 + test/generated/next/airports/airports.api.ts | 63 + .../next/airports/airports.configs.ts | 118 + .../next/airports/airports.models.ts | 109 + .../next/airports/airports.queries.ts | 209 ++ test/generated/next/app-rest-client.ts | 7 + .../next/bankAccounts/bankAccounts.acl.ts | 24 + .../next/bankAccounts/bankAccounts.api.ts | 37 + .../next/bankAccounts/bankAccounts.configs.ts | 43 + .../next/bankAccounts/bankAccounts.models.ts | 42 + .../next/bankAccounts/bankAccounts.queries.ts | 97 + .../bookkeepingExport.acl.ts | 134 ++ .../bookkeepingExport.api.ts | 107 + .../bookkeepingExport.configs.ts | 123 + .../bookkeepingExport.models.ts | 293 +++ .../bookkeepingExport.queries.ts | 351 +++ .../businessPartnerBookkeepingMappings.acl.ts | 69 + .../businessPartnerBookkeepingMappings.api.ts | 47 + ...sinessPartnerBookkeepingMappings.models.ts | 62 + ...inessPartnerBookkeepingMappings.queries.ts | 154 ++ .../businessPartnerContacts.acl.ts | 69 + .../businessPartnerContacts.api.ts | 55 + .../businessPartnerContacts.configs.ts | 42 + .../businessPartnerContacts.models.ts | 84 + .../businessPartnerContacts.queries.ts | 186 ++ .../businessPartners/businessPartners.acl.ts | 264 +++ .../businessPartners/businessPartners.api.ts | 179 ++ .../businessPartners.configs.ts | 149 ++ .../businessPartners.models.ts | 489 ++++ .../businessPartners.queries.ts | 642 ++++++ .../next/cargoTypes/cargoTypes.acl.ts | 74 + .../next/cargoTypes/cargoTypes.api.ts | 79 + .../next/cargoTypes/cargoTypes.configs.ts | 142 ++ .../next/cargoTypes/cargoTypes.models.ts | 141 ++ .../next/cargoTypes/cargoTypes.queries.ts | 265 +++ .../next/chargeTypes/chargeTypes.acl.ts | 74 + .../next/chargeTypes/chargeTypes.api.ts | 79 + .../next/chargeTypes/chargeTypes.configs.ts | 136 ++ .../next/chargeTypes/chargeTypes.models.ts | 154 ++ .../next/chargeTypes/chargeTypes.queries.ts | 265 +++ .../next/checklistItems/checklistItems.acl.ts | 95 + .../next/checklistItems/checklistItems.api.ts | 79 + .../checklistItems/checklistItems.configs.ts | 116 + .../checklistItems/checklistItems.models.ts | 107 + .../checklistItems/checklistItems.queries.ts | 270 +++ .../checklistTemplates.acl.ts | 95 + .../checklistTemplates.api.ts | 79 + .../checklistTemplates.configs.ts | 118 + .../checklistTemplates.models.ts | 119 + .../checklistTemplates.queries.ts | 270 +++ test/generated/next/cities/cities.acl.ts | 84 + test/generated/next/cities/cities.api.ts | 86 + test/generated/next/cities/cities.configs.ts | 124 ++ test/generated/next/cities/cities.models.ts | 145 ++ test/generated/next/cities/cities.queries.ts | 283 +++ test/generated/next/common/common.models.ts | 1860 ++++++++++++++++ .../next/containerYards/containerYards.acl.ts | 84 + .../next/containerYards/containerYards.api.ts | 87 + .../containerYards/containerYards.configs.ts | 142 ++ .../containerYards/containerYards.models.ts | 139 ++ .../containerYards/containerYards.queries.ts | 287 +++ .../controlTowerAuth/controlTowerAuth.api.ts | 23 + .../controlTowerAuth.models.ts | 34 + .../controlTowerAuth.queries.ts | 60 + .../controlTowerBookings.api.ts | 38 + .../controlTowerBookings.configs.ts | 56 + .../controlTowerBookings.models.ts | 147 ++ .../controlTowerBookings.queries.ts | 105 + .../controlTowerCalendar.api.ts | 26 + .../controlTowerCalendar.models.ts | 91 + .../controlTowerCalendar.queries.ts | 39 + .../controlTowerContainers.api.ts | 38 + .../controlTowerContainers.configs.ts | 54 + .../controlTowerContainers.models.ts | 133 ++ .../controlTowerContainers.queries.ts | 104 + .../next/controlTowerMe/controlTowerMe.api.ts | 55 + .../controlTowerMe/controlTowerMe.models.ts | 173 ++ .../controlTowerMe/controlTowerMe.queries.ts | 148 ++ .../controlTowerPackages.api.ts | 24 + .../controlTowerPackages.configs.ts | 50 + .../controlTowerPackages.models.ts | 54 + .../controlTowerPackages.queries.ts | 66 + .../controlTowerSearch.api.ts | 22 + .../controlTowerSearch.models.ts | 42 + .../controlTowerSearch.queries.ts | 38 + .../generated/next/countries/countries.acl.ts | 34 + .../generated/next/countries/countries.api.ts | 47 + .../next/countries/countries.configs.ts | 84 + .../next/countries/countries.models.ts | 82 + .../next/countries/countries.queries.ts | 153 ++ .../next/currencies/currencies.acl.ts | 64 + .../next/currencies/currencies.api.ts | 79 + .../next/currencies/currencies.configs.ts | 153 ++ .../next/currencies/currencies.models.ts | 122 + .../next/currencies/currencies.queries.ts | 268 +++ .../customerAccount/customerAccount.api.ts | 13 + .../customerAccount/customerAccount.models.ts | 37 + .../customerAccount.queries.ts | 32 + .../generated/next/customers/customers.acl.ts | 66 + .../generated/next/customers/customers.api.ts | 70 + .../next/customers/customers.configs.ts | 92 + .../next/customers/customers.models.ts | 137 ++ .../next/customers/customers.queries.ts | 222 ++ test/generated/next/depots/depots.acl.ts | 74 + test/generated/next/depots/depots.api.ts | 79 + test/generated/next/depots/depots.configs.ts | 134 ++ test/generated/next/depots/depots.models.ts | 157 ++ test/generated/next/depots/depots.queries.ts | 261 +++ .../documentTemplates.acl.ts | 121 + .../documentTemplates.api.ts | 95 + .../documentTemplates.configs.ts | 119 + .../documentTemplates.models.ts | 138 ++ .../documentTemplates.queries.ts | 334 +++ .../dunningAccountStatement.acl.ts | 30 + .../dunningAccountStatement.api.ts | 52 + .../dunningAccountStatement.models.ts | 83 + .../dunningAccountStatement.queries.ts | 156 ++ .../next/dunningLevels/dunningLevels.acl.ts | 95 + .../next/dunningLevels/dunningLevels.api.ts | 79 + .../dunningLevels/dunningLevels.configs.ts | 135 ++ .../dunningLevels/dunningLevels.models.ts | 136 ++ .../dunningLevels/dunningLevels.queries.ts | 274 +++ .../dunningManagement.acl.ts | 43 + .../dunningManagement.api.ts | 53 + .../dunningManagement.configs.ts | 60 + .../dunningManagement.models.ts | 195 ++ .../dunningManagement.queries.ts | 175 ++ .../dunningPartnerOutstandingInvoices.acl.ts | 43 + .../dunningPartnerOutstandingInvoices.api.ts | 48 + ...nningPartnerOutstandingInvoices.configs.ts | 97 + ...unningPartnerOutstandingInvoices.models.ts | 129 ++ ...nningPartnerOutstandingInvoices.queries.ts | 166 ++ .../next/dunningSystems/dunningSystems.acl.ts | 95 + .../next/dunningSystems/dunningSystems.api.ts | 79 + .../dunningSystems/dunningSystems.configs.ts | 120 + .../dunningSystems/dunningSystems.models.ts | 111 + .../dunningSystems/dunningSystems.queries.ts | 274 +++ test/generated/next/employee/employee.acl.ts | 153 ++ test/generated/next/employee/employee.api.ts | 157 ++ .../next/employee/employee.configs.ts | 135 ++ .../next/employee/employee.models.ts | 225 ++ .../next/employee/employee.queries.ts | 470 ++++ .../employeeAccount/employeeAccount.api.ts | 13 + .../employeeAccount/employeeAccount.models.ts | 53 + .../employeeAccount.queries.ts | 32 + .../employeePermissions.acl.ts | 24 + .../employeePermissions.api.ts | 36 + .../employeePermissions.configs.ts | 45 + .../employeePermissions.models.ts | 54 + .../employeePermissions.queries.ts | 94 + .../employeeProfile/employeeProfile.api.ts | 22 + .../employeeProfile/employeeProfile.models.ts | 33 + .../employeeProfile.queries.ts | 58 + .../next/employeeRoles/employeeRoles.acl.ts | 97 + .../next/employeeRoles/employeeRoles.api.ts | 92 + .../employeeRoles/employeeRoles.configs.ts | 90 + .../employeeRoles/employeeRoles.models.ts | 123 + .../employeeRoles/employeeRoles.queries.ts | 283 +++ .../employeeSettings/employeeSettings.api.ts | 23 + .../employeeSettings.models.ts | 20 + .../employeeSettings.queries.ts | 58 + .../next/employment/employment.acl.ts | 95 + .../next/employment/employment.api.ts | 73 + .../next/employment/employment.configs.ts | 63 + .../next/employment/employment.models.ts | 114 + .../next/employment/employment.queries.ts | 235 ++ .../factoringExport/factoringExport.acl.ts | 30 + .../factoringExport/factoringExport.api.ts | 22 + .../factoringExport/factoringExport.models.ts | 41 + .../factoringExport.queries.ts | 68 + .../next/factoringMerge/factoringMerge.acl.ts | 43 + .../next/factoringMerge/factoringMerge.api.ts | 30 + .../factoringMerge/factoringMerge.models.ts | 84 + .../factoringMerge/factoringMerge.queries.ts | 97 + test/generated/next/files/files.api.ts | 72 + test/generated/next/files/files.models.ts | 57 + test/generated/next/files/files.queries.ts | 210 ++ test/generated/next/folders/folders.api.ts | 63 + test/generated/next/folders/folders.models.ts | 96 + .../generated/next/folders/folders.queries.ts | 188 ++ test/generated/next/hsCodes/hsCodes.acl.ts | 74 + test/generated/next/hsCodes/hsCodes.api.ts | 79 + .../generated/next/hsCodes/hsCodes.configs.ts | 120 + test/generated/next/hsCodes/hsCodes.models.ts | 111 + .../generated/next/hsCodes/hsCodes.queries.ts | 265 +++ .../integrationChannels.acl.ts | 108 + .../integrationChannels.api.ts | 87 + .../integrationChannels.configs.ts | 155 ++ .../integrationChannels.models.ts | 197 ++ .../integrationChannels.queries.ts | 303 +++ .../inttraOfficeIntegration.acl.ts | 43 + .../inttraOfficeIntegration.api.ts | 30 + .../inttraOfficeIntegration.models.ts | 52 + .../inttraOfficeIntegration.queries.ts | 93 + .../inttraShippingInstructionMessages.acl.ts | 56 + .../inttraShippingInstructionMessages.api.ts | 46 + ...ttraShippingInstructionMessages.configs.ts | 88 + ...nttraShippingInstructionMessages.models.ts | 104 + ...ttraShippingInstructionMessages.queries.ts | 165 ++ .../invoicePayments/invoicePayments.acl.ts | 121 + .../invoicePayments/invoicePayments.api.ts | 100 + .../invoicePayments.configs.ts | 144 ++ .../invoicePayments/invoicePayments.models.ts | 292 +++ .../invoicePayments.queries.ts | 326 +++ test/generated/next/invoices/invoices.acl.ts | 407 ++++ test/generated/next/invoices/invoices.api.ts | 349 +++ .../next/invoices/invoices.configs.ts | 322 +++ .../next/invoices/invoices.models.ts | 988 +++++++++ .../next/invoices/invoices.queries.ts | 1123 ++++++++++ .../next/masterData/masterData.acl.ts | 24 + .../next/masterData/masterData.api.ts | 37 + .../next/masterData/masterData.configs.ts | 29 + .../next/masterData/masterData.models.ts | 68 + .../next/masterData/masterData.queries.ts | 100 + .../masterDataImport/masterDataImport.acl.ts | 43 + .../masterDataImport/masterDataImport.api.ts | 30 + .../masterDataImport.models.ts | 78 + .../masterDataImport.queries.ts | 121 + test/generated/next/offices/offices.acl.ts | 102 + test/generated/next/offices/offices.api.ts | 115 + .../generated/next/offices/offices.configs.ts | 135 ++ test/generated/next/offices/offices.models.ts | 390 ++++ .../generated/next/offices/offices.queries.ts | 403 ++++ .../next/packageTypes/packageTypes.acl.ts | 74 + .../next/packageTypes/packageTypes.api.ts | 79 + .../next/packageTypes/packageTypes.configs.ts | 129 ++ .../next/packageTypes/packageTypes.models.ts | 128 ++ .../next/packageTypes/packageTypes.queries.ts | 265 +++ .../partnerNetworks/partnerNetworks.acl.ts | 74 + .../partnerNetworks/partnerNetworks.api.ts | 79 + .../partnerNetworks.configs.ts | 114 + .../partnerNetworks/partnerNetworks.models.ts | 105 + .../partnerNetworks.queries.ts | 265 +++ .../paymentConfirmations.acl.ts | 43 + .../paymentConfirmations.api.ts | 54 + .../paymentConfirmations.configs.ts | 49 + .../paymentConfirmations.models.ts | 70 + .../paymentConfirmations.queries.ts | 131 ++ test/generated/next/ports/ports.acl.ts | 54 + test/generated/next/ports/ports.api.ts | 63 + test/generated/next/ports/ports.configs.ts | 128 ++ test/generated/next/ports/ports.models.ts | 151 ++ test/generated/next/ports/ports.queries.ts | 209 ++ .../positionAccount/positionAccount.acl.ts | 17 + .../positionAccount/positionAccount.api.ts | 13 + .../positionAccount/positionAccount.models.ts | 52 + .../positionAccount.queries.ts | 39 + .../positionAccountItems.acl.ts | 82 + .../positionAccountItems.api.ts | 56 + .../positionAccountItems.models.ts | 167 ++ .../positionAccountItems.queries.ts | 185 ++ .../next/positionCargo/positionCargo.acl.ts | 121 + .../next/positionCargo/positionCargo.api.ts | 85 + .../positionCargo/positionCargo.configs.ts | 133 ++ .../positionCargo/positionCargo.models.ts | 47 + .../positionCargo/positionCargo.queries.ts | 294 +++ .../positionCargoPackage.acl.ts | 69 + .../positionCargoPackage.api.ts | 48 + .../positionCargoPackage.queries.ts | 163 ++ .../positionChecklist.acl.ts | 82 + .../positionChecklist.api.ts | 54 + .../positionChecklist.models.ts | 77 + .../positionChecklist.queries.ts | 182 ++ .../positionInvolvedParties.acl.ts | 56 + .../positionInvolvedParties.api.ts | 40 + .../positionInvolvedParties.models.ts | 12 + .../positionInvolvedParties.queries.ts | 126 ++ .../positionProfitChangeTracking.acl.ts | 32 + .../positionProfitChangeTracking.api.ts | 31 + .../positionProfitChangeTracking.configs.ts | 51 + .../positionProfitChangeTracking.models.ts | 74 + .../positionProfitChangeTracking.queries.ts | 102 + .../next/positionRoutes/positionRoutes.acl.ts | 95 + .../next/positionRoutes/positionRoutes.api.ts | 63 + .../positionRoutes/positionRoutes.queries.ts | 213 ++ .../generated/next/positions/positions.acl.ts | 212 ++ .../generated/next/positions/positions.api.ts | 166 ++ .../next/positions/positions.configs.ts | 259 +++ .../next/positions/positions.models.ts | 501 +++++ .../next/positions/positions.queries.ts | 536 +++++ .../next/projectLite/projectLite.acl.ts | 95 + .../next/projectLite/projectLite.api.ts | 79 + .../next/projectLite/projectLite.configs.ts | 116 + .../next/projectLite/projectLite.models.ts | 98 + .../next/projectLite/projectLite.queries.ts | 270 +++ test/generated/next/queryModules.ts | 96 + .../next/quoteAccount/quoteAccount.acl.ts | 69 + .../next/quoteAccount/quoteAccount.api.ts | 47 + .../next/quoteAccount/quoteAccount.models.ts | 170 ++ .../next/quoteAccount/quoteAccount.queries.ts | 154 ++ .../next/quoteCargo/quoteCargo.acl.ts | 108 + .../next/quoteCargo/quoteCargo.api.ts | 77 + .../next/quoteCargo/quoteCargo.configs.ts | 100 + .../next/quoteCargo/quoteCargo.models.ts | 47 + .../next/quoteCargo/quoteCargo.queries.ts | 266 +++ .../quoteCargoPackage.acl.ts | 69 + .../quoteCargoPackage.api.ts | 48 + .../quoteCargoPackage.queries.ts | 163 ++ .../quoteConversion/quoteConversion.acl.ts | 17 + .../quoteConversion/quoteConversion.api.ts | 16 + .../quoteConversion/quoteConversion.models.ts | 12 + .../quoteConversion.queries.ts | 44 + .../next/quoteDocument/quoteDocument.acl.ts | 69 + .../next/quoteDocument/quoteDocument.api.ts | 61 + .../quoteDocument/quoteDocument.models.ts | 134 ++ .../quoteDocument/quoteDocument.queries.ts | 153 ++ .../quoteProfitChangeTracking.acl.ts | 32 + .../quoteProfitChangeTracking.api.ts | 29 + .../quoteProfitChangeTracking.configs.ts | 36 + .../quoteProfitChangeTracking.models.ts | 56 + .../quoteProfitChangeTracking.queries.ts | 97 + .../next/quoteRoutes/quoteRoutes.acl.ts | 95 + .../next/quoteRoutes/quoteRoutes.api.ts | 63 + .../next/quoteRoutes/quoteRoutes.queries.ts | 213 ++ test/generated/next/quotes/quotes.acl.ts | 160 ++ test/generated/next/quotes/quotes.api.ts | 123 + test/generated/next/quotes/quotes.configs.ts | 137 ++ test/generated/next/quotes/quotes.models.ts | 322 +++ test/generated/next/quotes/quotes.queries.ts | 377 ++++ .../remarkTemplates/remarkTemplates.acl.ts | 95 + .../remarkTemplates/remarkTemplates.api.ts | 79 + .../remarkTemplates.configs.ts | 123 + .../remarkTemplates/remarkTemplates.models.ts | 132 ++ .../remarkTemplates.queries.ts | 274 +++ .../next/roadQuotes/roadQuotes.acl.ts | 30 + .../next/roadQuotes/roadQuotes.api.ts | 22 + .../next/roadQuotes/roadQuotes.models.ts | 29 + .../next/roadQuotes/roadQuotes.queries.ts | 71 + .../next/seaPositions/seaPositions.acl.ts | 30 + .../next/seaPositions/seaPositions.api.ts | 22 + .../next/seaPositions/seaPositions.models.ts | 49 + .../next/seaPositions/seaPositions.queries.ts | 71 + .../generated/next/seaQuotes/seaQuotes.acl.ts | 30 + .../generated/next/seaQuotes/seaQuotes.api.ts | 22 + .../next/seaQuotes/seaQuotes.models.ts | 33 + .../next/seaQuotes/seaQuotes.queries.ts | 71 + .../shippingInstructions.acl.ts | 82 + .../shippingInstructions.api.ts | 62 + .../shippingInstructions.models.ts | 510 +++++ .../shippingInstructions.queries.ts | 212 ++ .../generated/next/terminals/terminals.acl.ts | 74 + .../generated/next/terminals/terminals.api.ts | 79 + .../next/terminals/terminals.configs.ts | 146 ++ .../next/terminals/terminals.models.ts | 196 ++ .../next/terminals/terminals.queries.ts | 261 +++ .../next/useCrossTabQueryInvalidation.ts | 40 + test/generated/next/useMutationEffects.ts | 95 + .../next/userActivity/userActivity.api.ts | 20 + .../next/userActivity/userActivity.models.ts | 64 + .../next/userActivity/userActivity.queries.ts | 36 + test/generated/next/vatRules/vatRules.acl.ts | 74 + test/generated/next/vatRules/vatRules.api.ts | 79 + .../next/vatRules/vatRules.configs.ts | 151 ++ .../next/vatRules/vatRules.models.ts | 146 ++ .../next/vatRules/vatRules.queries.ts | 265 +++ .../next/warehouses/warehouses.acl.ts | 74 + .../next/warehouses/warehouses.api.ts | 79 + .../next/warehouses/warehouses.configs.ts | 141 ++ .../next/warehouses/warehouses.models.ts | 152 ++ .../next/warehouses/warehouses.queries.ts | 261 +++ .../workingDocuments/workingDocuments.acl.ts | 30 + .../workingDocuments/workingDocuments.api.ts | 31 + .../workingDocuments.configs.ts | 55 + .../workingDocuments.models.ts | 70 + .../workingDocuments.queries.ts | 102 + .../workingDocumentsAmsInstructions.acl.ts | 82 + .../workingDocumentsAmsInstructions.api.ts | 62 + .../workingDocumentsAmsInstructions.models.ts | 142 ++ ...workingDocumentsAmsInstructions.queries.ts | 212 ++ .../workingDocumentsBlInstructions.acl.ts | 95 + .../workingDocumentsBlInstructions.api.ts | 77 + .../workingDocumentsBlInstructions.models.ts | 260 +++ .../workingDocumentsBlInstructions.queries.ts | 243 ++ .../workingDocumentsCmrForm.acl.ts | 82 + .../workingDocumentsCmrForm.api.ts | 62 + .../workingDocumentsCmrForm.models.ts | 187 ++ .../workingDocumentsCmrForm.queries.ts | 212 ++ .../workingDocumentsExportDeclaration.acl.ts | 82 + .../workingDocumentsExportDeclaration.api.ts | 62 + ...orkingDocumentsExportDeclaration.models.ts | 94 + ...rkingDocumentsExportDeclaration.queries.ts | 212 ++ .../workingDocumentsFcrForm.acl.ts | 82 + .../workingDocumentsFcrForm.api.ts | 62 + .../workingDocumentsFcrForm.models.ts | 86 + .../workingDocumentsFcrForm.queries.ts | 212 ++ .../workingDocumentsHouseAwb.acl.ts | 82 + .../workingDocumentsHouseAwb.api.ts | 62 + .../workingDocumentsHouseAwb.models.ts | 174 ++ .../workingDocumentsHouseAwb.queries.ts | 212 ++ .../workingDocumentsHouseBl.acl.ts | 108 + .../workingDocumentsHouseBl.api.ts | 91 + .../workingDocumentsHouseBl.models.ts | 196 ++ .../workingDocumentsHouseBl.queries.ts | 297 +++ .../workingDocumentsIsfForm.acl.ts | 82 + .../workingDocumentsIsfForm.api.ts | 62 + .../workingDocumentsIsfForm.models.ts | 154 ++ .../workingDocumentsIsfForm.queries.ts | 212 ++ .../workingDocumentsMasterAwb.acl.ts | 82 + .../workingDocumentsMasterAwb.api.ts | 62 + .../workingDocumentsMasterAwb.models.ts | 176 ++ .../workingDocumentsMasterAwb.queries.ts | 212 ++ .../workingDocumentsTemplatedDocument.acl.ts | 95 + .../workingDocumentsTemplatedDocument.api.ts | 78 + ...orkingDocumentsTemplatedDocument.models.ts | 61 + ...rkingDocumentsTemplatedDocument.queries.ts | 217 ++ test/generated/next/zod.extended.ts | 47 + 1704 files changed, 245856 insertions(+), 613 deletions(-) create mode 100644 openapi-codegen.config.mjs create mode 100644 povio-openapi-codegen-cli-2.0.8-rc.5.tgz create mode 100644 src/generators/core/endpoints/resolveEndpointZodSchema.ts create mode 100644 src/generators/generated-output-eq.test.ts create mode 100644 src/helpers/profile.helper.ts create mode 100644 test/generated/.gitkeep create mode 100644 test/generated/base/aWBStocks/aWBStocks.acl.ts create mode 100644 test/generated/base/aWBStocks/aWBStocks.api.ts create mode 100644 test/generated/base/aWBStocks/aWBStocks.configs.ts create mode 100644 test/generated/base/aWBStocks/aWBStocks.models.ts create mode 100644 test/generated/base/aWBStocks/aWBStocks.queries.ts create mode 100644 test/generated/base/acl/app.ability.ts create mode 100644 test/generated/base/acl/useAclCheck.ts create mode 100644 test/generated/base/airPositions/airPositions.acl.ts create mode 100644 test/generated/base/airPositions/airPositions.api.ts create mode 100644 test/generated/base/airPositions/airPositions.models.ts create mode 100644 test/generated/base/airPositions/airPositions.queries.ts create mode 100644 test/generated/base/airports/airports.acl.ts create mode 100644 test/generated/base/airports/airports.api.ts create mode 100644 test/generated/base/airports/airports.configs.ts create mode 100644 test/generated/base/airports/airports.models.ts create mode 100644 test/generated/base/airports/airports.queries.ts create mode 100644 test/generated/base/app-rest-client.ts create mode 100644 test/generated/base/bankAccounts/bankAccounts.acl.ts create mode 100644 test/generated/base/bankAccounts/bankAccounts.api.ts create mode 100644 test/generated/base/bankAccounts/bankAccounts.configs.ts create mode 100644 test/generated/base/bankAccounts/bankAccounts.models.ts create mode 100644 test/generated/base/bankAccounts/bankAccounts.queries.ts create mode 100644 test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts create mode 100644 test/generated/base/bookkeepingExport/bookkeepingExport.api.ts create mode 100644 test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts create mode 100644 test/generated/base/bookkeepingExport/bookkeepingExport.models.ts create mode 100644 test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts create mode 100644 test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts create mode 100644 test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts create mode 100644 test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts create mode 100644 test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts create mode 100644 test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts create mode 100644 test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts create mode 100644 test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts create mode 100644 test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts create mode 100644 test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts create mode 100644 test/generated/base/businessPartners/businessPartners.acl.ts create mode 100644 test/generated/base/businessPartners/businessPartners.api.ts create mode 100644 test/generated/base/businessPartners/businessPartners.configs.ts create mode 100644 test/generated/base/businessPartners/businessPartners.models.ts create mode 100644 test/generated/base/businessPartners/businessPartners.queries.ts create mode 100644 test/generated/base/cargoTypes/cargoTypes.acl.ts create mode 100644 test/generated/base/cargoTypes/cargoTypes.api.ts create mode 100644 test/generated/base/cargoTypes/cargoTypes.configs.ts create mode 100644 test/generated/base/cargoTypes/cargoTypes.models.ts create mode 100644 test/generated/base/cargoTypes/cargoTypes.queries.ts create mode 100644 test/generated/base/chargeTypes/chargeTypes.acl.ts create mode 100644 test/generated/base/chargeTypes/chargeTypes.api.ts create mode 100644 test/generated/base/chargeTypes/chargeTypes.configs.ts create mode 100644 test/generated/base/chargeTypes/chargeTypes.models.ts create mode 100644 test/generated/base/chargeTypes/chargeTypes.queries.ts create mode 100644 test/generated/base/checklistItems/checklistItems.acl.ts create mode 100644 test/generated/base/checklistItems/checklistItems.api.ts create mode 100644 test/generated/base/checklistItems/checklistItems.configs.ts create mode 100644 test/generated/base/checklistItems/checklistItems.models.ts create mode 100644 test/generated/base/checklistItems/checklistItems.queries.ts create mode 100644 test/generated/base/checklistTemplates/checklistTemplates.acl.ts create mode 100644 test/generated/base/checklistTemplates/checklistTemplates.api.ts create mode 100644 test/generated/base/checklistTemplates/checklistTemplates.configs.ts create mode 100644 test/generated/base/checklistTemplates/checklistTemplates.models.ts create mode 100644 test/generated/base/checklistTemplates/checklistTemplates.queries.ts create mode 100644 test/generated/base/cities/cities.acl.ts create mode 100644 test/generated/base/cities/cities.api.ts create mode 100644 test/generated/base/cities/cities.configs.ts create mode 100644 test/generated/base/cities/cities.models.ts create mode 100644 test/generated/base/cities/cities.queries.ts create mode 100644 test/generated/base/common/common.models.ts create mode 100644 test/generated/base/containerYards/containerYards.acl.ts create mode 100644 test/generated/base/containerYards/containerYards.api.ts create mode 100644 test/generated/base/containerYards/containerYards.configs.ts create mode 100644 test/generated/base/containerYards/containerYards.models.ts create mode 100644 test/generated/base/containerYards/containerYards.queries.ts create mode 100644 test/generated/base/controlTowerAuth/controlTowerAuth.api.ts create mode 100644 test/generated/base/controlTowerAuth/controlTowerAuth.models.ts create mode 100644 test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts create mode 100644 test/generated/base/controlTowerBookings/controlTowerBookings.api.ts create mode 100644 test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts create mode 100644 test/generated/base/controlTowerBookings/controlTowerBookings.models.ts create mode 100644 test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts create mode 100644 test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts create mode 100644 test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts create mode 100644 test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts create mode 100644 test/generated/base/controlTowerContainers/controlTowerContainers.api.ts create mode 100644 test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts create mode 100644 test/generated/base/controlTowerContainers/controlTowerContainers.models.ts create mode 100644 test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts create mode 100644 test/generated/base/controlTowerMe/controlTowerMe.api.ts create mode 100644 test/generated/base/controlTowerMe/controlTowerMe.models.ts create mode 100644 test/generated/base/controlTowerMe/controlTowerMe.queries.ts create mode 100644 test/generated/base/controlTowerPackages/controlTowerPackages.api.ts create mode 100644 test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts create mode 100644 test/generated/base/controlTowerPackages/controlTowerPackages.models.ts create mode 100644 test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts create mode 100644 test/generated/base/controlTowerSearch/controlTowerSearch.api.ts create mode 100644 test/generated/base/controlTowerSearch/controlTowerSearch.models.ts create mode 100644 test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts create mode 100644 test/generated/base/countries/countries.acl.ts create mode 100644 test/generated/base/countries/countries.api.ts create mode 100644 test/generated/base/countries/countries.configs.ts create mode 100644 test/generated/base/countries/countries.models.ts create mode 100644 test/generated/base/countries/countries.queries.ts create mode 100644 test/generated/base/currencies/currencies.acl.ts create mode 100644 test/generated/base/currencies/currencies.api.ts create mode 100644 test/generated/base/currencies/currencies.configs.ts create mode 100644 test/generated/base/currencies/currencies.models.ts create mode 100644 test/generated/base/currencies/currencies.queries.ts create mode 100644 test/generated/base/customerAccount/customerAccount.api.ts create mode 100644 test/generated/base/customerAccount/customerAccount.models.ts create mode 100644 test/generated/base/customerAccount/customerAccount.queries.ts create mode 100644 test/generated/base/customers/customers.acl.ts create mode 100644 test/generated/base/customers/customers.api.ts create mode 100644 test/generated/base/customers/customers.configs.ts create mode 100644 test/generated/base/customers/customers.models.ts create mode 100644 test/generated/base/customers/customers.queries.ts create mode 100644 test/generated/base/depots/depots.acl.ts create mode 100644 test/generated/base/depots/depots.api.ts create mode 100644 test/generated/base/depots/depots.configs.ts create mode 100644 test/generated/base/depots/depots.models.ts create mode 100644 test/generated/base/depots/depots.queries.ts create mode 100644 test/generated/base/documentTemplates/documentTemplates.acl.ts create mode 100644 test/generated/base/documentTemplates/documentTemplates.api.ts create mode 100644 test/generated/base/documentTemplates/documentTemplates.configs.ts create mode 100644 test/generated/base/documentTemplates/documentTemplates.models.ts create mode 100644 test/generated/base/documentTemplates/documentTemplates.queries.ts create mode 100644 test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts create mode 100644 test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts create mode 100644 test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts create mode 100644 test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts create mode 100644 test/generated/base/dunningLevels/dunningLevels.acl.ts create mode 100644 test/generated/base/dunningLevels/dunningLevels.api.ts create mode 100644 test/generated/base/dunningLevels/dunningLevels.configs.ts create mode 100644 test/generated/base/dunningLevels/dunningLevels.models.ts create mode 100644 test/generated/base/dunningLevels/dunningLevels.queries.ts create mode 100644 test/generated/base/dunningManagement/dunningManagement.acl.ts create mode 100644 test/generated/base/dunningManagement/dunningManagement.api.ts create mode 100644 test/generated/base/dunningManagement/dunningManagement.configs.ts create mode 100644 test/generated/base/dunningManagement/dunningManagement.models.ts create mode 100644 test/generated/base/dunningManagement/dunningManagement.queries.ts create mode 100644 test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts create mode 100644 test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts create mode 100644 test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts create mode 100644 test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts create mode 100644 test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts create mode 100644 test/generated/base/dunningSystems/dunningSystems.acl.ts create mode 100644 test/generated/base/dunningSystems/dunningSystems.api.ts create mode 100644 test/generated/base/dunningSystems/dunningSystems.configs.ts create mode 100644 test/generated/base/dunningSystems/dunningSystems.models.ts create mode 100644 test/generated/base/dunningSystems/dunningSystems.queries.ts create mode 100644 test/generated/base/employee/employee.acl.ts create mode 100644 test/generated/base/employee/employee.api.ts create mode 100644 test/generated/base/employee/employee.configs.ts create mode 100644 test/generated/base/employee/employee.models.ts create mode 100644 test/generated/base/employee/employee.queries.ts create mode 100644 test/generated/base/employeeAccount/employeeAccount.api.ts create mode 100644 test/generated/base/employeeAccount/employeeAccount.models.ts create mode 100644 test/generated/base/employeeAccount/employeeAccount.queries.ts create mode 100644 test/generated/base/employeePermissions/employeePermissions.acl.ts create mode 100644 test/generated/base/employeePermissions/employeePermissions.api.ts create mode 100644 test/generated/base/employeePermissions/employeePermissions.configs.ts create mode 100644 test/generated/base/employeePermissions/employeePermissions.models.ts create mode 100644 test/generated/base/employeePermissions/employeePermissions.queries.ts create mode 100644 test/generated/base/employeeProfile/employeeProfile.api.ts create mode 100644 test/generated/base/employeeProfile/employeeProfile.models.ts create mode 100644 test/generated/base/employeeProfile/employeeProfile.queries.ts create mode 100644 test/generated/base/employeeRoles/employeeRoles.acl.ts create mode 100644 test/generated/base/employeeRoles/employeeRoles.api.ts create mode 100644 test/generated/base/employeeRoles/employeeRoles.configs.ts create mode 100644 test/generated/base/employeeRoles/employeeRoles.models.ts create mode 100644 test/generated/base/employeeRoles/employeeRoles.queries.ts create mode 100644 test/generated/base/employeeSettings/employeeSettings.api.ts create mode 100644 test/generated/base/employeeSettings/employeeSettings.models.ts create mode 100644 test/generated/base/employeeSettings/employeeSettings.queries.ts create mode 100644 test/generated/base/employment/employment.acl.ts create mode 100644 test/generated/base/employment/employment.api.ts create mode 100644 test/generated/base/employment/employment.configs.ts create mode 100644 test/generated/base/employment/employment.models.ts create mode 100644 test/generated/base/employment/employment.queries.ts create mode 100644 test/generated/base/factoringExport/factoringExport.acl.ts create mode 100644 test/generated/base/factoringExport/factoringExport.api.ts create mode 100644 test/generated/base/factoringExport/factoringExport.models.ts create mode 100644 test/generated/base/factoringExport/factoringExport.queries.ts create mode 100644 test/generated/base/factoringMerge/factoringMerge.acl.ts create mode 100644 test/generated/base/factoringMerge/factoringMerge.api.ts create mode 100644 test/generated/base/factoringMerge/factoringMerge.models.ts create mode 100644 test/generated/base/factoringMerge/factoringMerge.queries.ts create mode 100644 test/generated/base/files/files.api.ts create mode 100644 test/generated/base/files/files.models.ts create mode 100644 test/generated/base/files/files.queries.ts create mode 100644 test/generated/base/folders/folders.api.ts create mode 100644 test/generated/base/folders/folders.models.ts create mode 100644 test/generated/base/folders/folders.queries.ts create mode 100644 test/generated/base/hsCodes/hsCodes.acl.ts create mode 100644 test/generated/base/hsCodes/hsCodes.api.ts create mode 100644 test/generated/base/hsCodes/hsCodes.configs.ts create mode 100644 test/generated/base/hsCodes/hsCodes.models.ts create mode 100644 test/generated/base/hsCodes/hsCodes.queries.ts create mode 100644 test/generated/base/integrationChannels/integrationChannels.acl.ts create mode 100644 test/generated/base/integrationChannels/integrationChannels.api.ts create mode 100644 test/generated/base/integrationChannels/integrationChannels.configs.ts create mode 100644 test/generated/base/integrationChannels/integrationChannels.models.ts create mode 100644 test/generated/base/integrationChannels/integrationChannels.queries.ts create mode 100644 test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts create mode 100644 test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts create mode 100644 test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts create mode 100644 test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts create mode 100644 test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts create mode 100644 test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts create mode 100644 test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts create mode 100644 test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts create mode 100644 test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts create mode 100644 test/generated/base/invoicePayments/invoicePayments.acl.ts create mode 100644 test/generated/base/invoicePayments/invoicePayments.api.ts create mode 100644 test/generated/base/invoicePayments/invoicePayments.configs.ts create mode 100644 test/generated/base/invoicePayments/invoicePayments.models.ts create mode 100644 test/generated/base/invoicePayments/invoicePayments.queries.ts create mode 100644 test/generated/base/invoices/invoices.acl.ts create mode 100644 test/generated/base/invoices/invoices.api.ts create mode 100644 test/generated/base/invoices/invoices.configs.ts create mode 100644 test/generated/base/invoices/invoices.models.ts create mode 100644 test/generated/base/invoices/invoices.queries.ts create mode 100644 test/generated/base/masterData/masterData.acl.ts create mode 100644 test/generated/base/masterData/masterData.api.ts create mode 100644 test/generated/base/masterData/masterData.configs.ts create mode 100644 test/generated/base/masterData/masterData.models.ts create mode 100644 test/generated/base/masterData/masterData.queries.ts create mode 100644 test/generated/base/masterDataImport/masterDataImport.acl.ts create mode 100644 test/generated/base/masterDataImport/masterDataImport.api.ts create mode 100644 test/generated/base/masterDataImport/masterDataImport.models.ts create mode 100644 test/generated/base/masterDataImport/masterDataImport.queries.ts create mode 100644 test/generated/base/offices/offices.acl.ts create mode 100644 test/generated/base/offices/offices.api.ts create mode 100644 test/generated/base/offices/offices.configs.ts create mode 100644 test/generated/base/offices/offices.models.ts create mode 100644 test/generated/base/offices/offices.queries.ts create mode 100644 test/generated/base/packageTypes/packageTypes.acl.ts create mode 100644 test/generated/base/packageTypes/packageTypes.api.ts create mode 100644 test/generated/base/packageTypes/packageTypes.configs.ts create mode 100644 test/generated/base/packageTypes/packageTypes.models.ts create mode 100644 test/generated/base/packageTypes/packageTypes.queries.ts create mode 100644 test/generated/base/partnerNetworks/partnerNetworks.acl.ts create mode 100644 test/generated/base/partnerNetworks/partnerNetworks.api.ts create mode 100644 test/generated/base/partnerNetworks/partnerNetworks.configs.ts create mode 100644 test/generated/base/partnerNetworks/partnerNetworks.models.ts create mode 100644 test/generated/base/partnerNetworks/partnerNetworks.queries.ts create mode 100644 test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts create mode 100644 test/generated/base/paymentConfirmations/paymentConfirmations.api.ts create mode 100644 test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts create mode 100644 test/generated/base/paymentConfirmations/paymentConfirmations.models.ts create mode 100644 test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts create mode 100644 test/generated/base/ports/ports.acl.ts create mode 100644 test/generated/base/ports/ports.api.ts create mode 100644 test/generated/base/ports/ports.configs.ts create mode 100644 test/generated/base/ports/ports.models.ts create mode 100644 test/generated/base/ports/ports.queries.ts create mode 100644 test/generated/base/positionAccount/positionAccount.acl.ts create mode 100644 test/generated/base/positionAccount/positionAccount.api.ts create mode 100644 test/generated/base/positionAccount/positionAccount.models.ts create mode 100644 test/generated/base/positionAccount/positionAccount.queries.ts create mode 100644 test/generated/base/positionAccountItems/positionAccountItems.acl.ts create mode 100644 test/generated/base/positionAccountItems/positionAccountItems.api.ts create mode 100644 test/generated/base/positionAccountItems/positionAccountItems.models.ts create mode 100644 test/generated/base/positionAccountItems/positionAccountItems.queries.ts create mode 100644 test/generated/base/positionCargo/positionCargo.acl.ts create mode 100644 test/generated/base/positionCargo/positionCargo.api.ts create mode 100644 test/generated/base/positionCargo/positionCargo.configs.ts create mode 100644 test/generated/base/positionCargo/positionCargo.models.ts create mode 100644 test/generated/base/positionCargo/positionCargo.queries.ts create mode 100644 test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts create mode 100644 test/generated/base/positionCargoPackage/positionCargoPackage.api.ts create mode 100644 test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts create mode 100644 test/generated/base/positionChecklist/positionChecklist.acl.ts create mode 100644 test/generated/base/positionChecklist/positionChecklist.api.ts create mode 100644 test/generated/base/positionChecklist/positionChecklist.models.ts create mode 100644 test/generated/base/positionChecklist/positionChecklist.queries.ts create mode 100644 test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts create mode 100644 test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts create mode 100644 test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts create mode 100644 test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts create mode 100644 test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts create mode 100644 test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts create mode 100644 test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts create mode 100644 test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts create mode 100644 test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts create mode 100644 test/generated/base/positionRoutes/positionRoutes.acl.ts create mode 100644 test/generated/base/positionRoutes/positionRoutes.api.ts create mode 100644 test/generated/base/positionRoutes/positionRoutes.queries.ts create mode 100644 test/generated/base/positions/positions.acl.ts create mode 100644 test/generated/base/positions/positions.api.ts create mode 100644 test/generated/base/positions/positions.configs.ts create mode 100644 test/generated/base/positions/positions.models.ts create mode 100644 test/generated/base/positions/positions.queries.ts create mode 100644 test/generated/base/projectLite/projectLite.acl.ts create mode 100644 test/generated/base/projectLite/projectLite.api.ts create mode 100644 test/generated/base/projectLite/projectLite.configs.ts create mode 100644 test/generated/base/projectLite/projectLite.models.ts create mode 100644 test/generated/base/projectLite/projectLite.queries.ts create mode 100644 test/generated/base/queryModules.ts create mode 100644 test/generated/base/quoteAccount/quoteAccount.acl.ts create mode 100644 test/generated/base/quoteAccount/quoteAccount.api.ts create mode 100644 test/generated/base/quoteAccount/quoteAccount.models.ts create mode 100644 test/generated/base/quoteAccount/quoteAccount.queries.ts create mode 100644 test/generated/base/quoteCargo/quoteCargo.acl.ts create mode 100644 test/generated/base/quoteCargo/quoteCargo.api.ts create mode 100644 test/generated/base/quoteCargo/quoteCargo.configs.ts create mode 100644 test/generated/base/quoteCargo/quoteCargo.models.ts create mode 100644 test/generated/base/quoteCargo/quoteCargo.queries.ts create mode 100644 test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts create mode 100644 test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts create mode 100644 test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts create mode 100644 test/generated/base/quoteConversion/quoteConversion.acl.ts create mode 100644 test/generated/base/quoteConversion/quoteConversion.api.ts create mode 100644 test/generated/base/quoteConversion/quoteConversion.models.ts create mode 100644 test/generated/base/quoteConversion/quoteConversion.queries.ts create mode 100644 test/generated/base/quoteDocument/quoteDocument.acl.ts create mode 100644 test/generated/base/quoteDocument/quoteDocument.api.ts create mode 100644 test/generated/base/quoteDocument/quoteDocument.models.ts create mode 100644 test/generated/base/quoteDocument/quoteDocument.queries.ts create mode 100644 test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts create mode 100644 test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts create mode 100644 test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts create mode 100644 test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts create mode 100644 test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts create mode 100644 test/generated/base/quoteRoutes/quoteRoutes.acl.ts create mode 100644 test/generated/base/quoteRoutes/quoteRoutes.api.ts create mode 100644 test/generated/base/quoteRoutes/quoteRoutes.queries.ts create mode 100644 test/generated/base/quotes/quotes.acl.ts create mode 100644 test/generated/base/quotes/quotes.api.ts create mode 100644 test/generated/base/quotes/quotes.configs.ts create mode 100644 test/generated/base/quotes/quotes.models.ts create mode 100644 test/generated/base/quotes/quotes.queries.ts create mode 100644 test/generated/base/remarkTemplates/remarkTemplates.acl.ts create mode 100644 test/generated/base/remarkTemplates/remarkTemplates.api.ts create mode 100644 test/generated/base/remarkTemplates/remarkTemplates.configs.ts create mode 100644 test/generated/base/remarkTemplates/remarkTemplates.models.ts create mode 100644 test/generated/base/remarkTemplates/remarkTemplates.queries.ts create mode 100644 test/generated/base/roadQuotes/roadQuotes.acl.ts create mode 100644 test/generated/base/roadQuotes/roadQuotes.api.ts create mode 100644 test/generated/base/roadQuotes/roadQuotes.models.ts create mode 100644 test/generated/base/roadQuotes/roadQuotes.queries.ts create mode 100644 test/generated/base/seaPositions/seaPositions.acl.ts create mode 100644 test/generated/base/seaPositions/seaPositions.api.ts create mode 100644 test/generated/base/seaPositions/seaPositions.models.ts create mode 100644 test/generated/base/seaPositions/seaPositions.queries.ts create mode 100644 test/generated/base/seaQuotes/seaQuotes.acl.ts create mode 100644 test/generated/base/seaQuotes/seaQuotes.api.ts create mode 100644 test/generated/base/seaQuotes/seaQuotes.models.ts create mode 100644 test/generated/base/seaQuotes/seaQuotes.queries.ts create mode 100644 test/generated/base/shippingInstructions/shippingInstructions.acl.ts create mode 100644 test/generated/base/shippingInstructions/shippingInstructions.api.ts create mode 100644 test/generated/base/shippingInstructions/shippingInstructions.models.ts create mode 100644 test/generated/base/shippingInstructions/shippingInstructions.queries.ts create mode 100644 test/generated/base/terminals/terminals.acl.ts create mode 100644 test/generated/base/terminals/terminals.api.ts create mode 100644 test/generated/base/terminals/terminals.configs.ts create mode 100644 test/generated/base/terminals/terminals.models.ts create mode 100644 test/generated/base/terminals/terminals.queries.ts create mode 100644 test/generated/base/useCrossTabQueryInvalidation.ts create mode 100644 test/generated/base/useMutationEffects.ts create mode 100644 test/generated/base/userActivity/userActivity.api.ts create mode 100644 test/generated/base/userActivity/userActivity.models.ts create mode 100644 test/generated/base/userActivity/userActivity.queries.ts create mode 100644 test/generated/base/vatRules/vatRules.acl.ts create mode 100644 test/generated/base/vatRules/vatRules.api.ts create mode 100644 test/generated/base/vatRules/vatRules.configs.ts create mode 100644 test/generated/base/vatRules/vatRules.models.ts create mode 100644 test/generated/base/vatRules/vatRules.queries.ts create mode 100644 test/generated/base/warehouses/warehouses.acl.ts create mode 100644 test/generated/base/warehouses/warehouses.api.ts create mode 100644 test/generated/base/warehouses/warehouses.configs.ts create mode 100644 test/generated/base/warehouses/warehouses.models.ts create mode 100644 test/generated/base/warehouses/warehouses.queries.ts create mode 100644 test/generated/base/workingDocuments/workingDocuments.acl.ts create mode 100644 test/generated/base/workingDocuments/workingDocuments.api.ts create mode 100644 test/generated/base/workingDocuments/workingDocuments.configs.ts create mode 100644 test/generated/base/workingDocuments/workingDocuments.models.ts create mode 100644 test/generated/base/workingDocuments/workingDocuments.queries.ts create mode 100644 test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts create mode 100644 test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts create mode 100644 test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts create mode 100644 test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts create mode 100644 test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts create mode 100644 test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts create mode 100644 test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts create mode 100644 test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts create mode 100644 test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts create mode 100644 test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts create mode 100644 test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts create mode 100644 test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts create mode 100644 test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts create mode 100644 test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts create mode 100644 test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts create mode 100644 test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts create mode 100644 test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts create mode 100644 test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts create mode 100644 test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts create mode 100644 test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts create mode 100644 test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts create mode 100644 test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts create mode 100644 test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts create mode 100644 test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts create mode 100644 test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts create mode 100644 test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts create mode 100644 test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts create mode 100644 test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts create mode 100644 test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts create mode 100644 test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts create mode 100644 test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts create mode 100644 test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts create mode 100644 test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts create mode 100644 test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts create mode 100644 test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts create mode 100644 test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts create mode 100644 test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts create mode 100644 test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts create mode 100644 test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts create mode 100644 test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts create mode 100644 test/generated/base/zod.extended.ts create mode 100644 test/generated/dist/aWBStocks/aWBStocks.acl.ts create mode 100644 test/generated/dist/aWBStocks/aWBStocks.api.ts create mode 100644 test/generated/dist/aWBStocks/aWBStocks.configs.ts create mode 100644 test/generated/dist/aWBStocks/aWBStocks.models.ts create mode 100644 test/generated/dist/aWBStocks/aWBStocks.queries.ts create mode 100644 test/generated/dist/acl/app.ability.ts create mode 100644 test/generated/dist/acl/useAclCheck.ts create mode 100644 test/generated/dist/airPositions/airPositions.acl.ts create mode 100644 test/generated/dist/airPositions/airPositions.api.ts create mode 100644 test/generated/dist/airPositions/airPositions.models.ts create mode 100644 test/generated/dist/airPositions/airPositions.queries.ts create mode 100644 test/generated/dist/airports/airports.acl.ts create mode 100644 test/generated/dist/airports/airports.api.ts create mode 100644 test/generated/dist/airports/airports.configs.ts create mode 100644 test/generated/dist/airports/airports.models.ts create mode 100644 test/generated/dist/airports/airports.queries.ts create mode 100644 test/generated/dist/app-rest-client.ts create mode 100644 test/generated/dist/bankAccounts/bankAccounts.acl.ts create mode 100644 test/generated/dist/bankAccounts/bankAccounts.api.ts create mode 100644 test/generated/dist/bankAccounts/bankAccounts.configs.ts create mode 100644 test/generated/dist/bankAccounts/bankAccounts.models.ts create mode 100644 test/generated/dist/bankAccounts/bankAccounts.queries.ts create mode 100644 test/generated/dist/bookkeepingExport/bookkeepingExport.acl.ts create mode 100644 test/generated/dist/bookkeepingExport/bookkeepingExport.api.ts create mode 100644 test/generated/dist/bookkeepingExport/bookkeepingExport.configs.ts create mode 100644 test/generated/dist/bookkeepingExport/bookkeepingExport.models.ts create mode 100644 test/generated/dist/bookkeepingExport/bookkeepingExport.queries.ts create mode 100644 test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts create mode 100644 test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts create mode 100644 test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts create mode 100644 test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts create mode 100644 test/generated/dist/businessPartnerContacts/businessPartnerContacts.acl.ts create mode 100644 test/generated/dist/businessPartnerContacts/businessPartnerContacts.api.ts create mode 100644 test/generated/dist/businessPartnerContacts/businessPartnerContacts.configs.ts create mode 100644 test/generated/dist/businessPartnerContacts/businessPartnerContacts.models.ts create mode 100644 test/generated/dist/businessPartnerContacts/businessPartnerContacts.queries.ts create mode 100644 test/generated/dist/businessPartners/businessPartners.acl.ts create mode 100644 test/generated/dist/businessPartners/businessPartners.api.ts create mode 100644 test/generated/dist/businessPartners/businessPartners.configs.ts create mode 100644 test/generated/dist/businessPartners/businessPartners.models.ts create mode 100644 test/generated/dist/businessPartners/businessPartners.queries.ts create mode 100644 test/generated/dist/cargoTypes/cargoTypes.acl.ts create mode 100644 test/generated/dist/cargoTypes/cargoTypes.api.ts create mode 100644 test/generated/dist/cargoTypes/cargoTypes.configs.ts create mode 100644 test/generated/dist/cargoTypes/cargoTypes.models.ts create mode 100644 test/generated/dist/cargoTypes/cargoTypes.queries.ts create mode 100644 test/generated/dist/chargeTypes/chargeTypes.acl.ts create mode 100644 test/generated/dist/chargeTypes/chargeTypes.api.ts create mode 100644 test/generated/dist/chargeTypes/chargeTypes.configs.ts create mode 100644 test/generated/dist/chargeTypes/chargeTypes.models.ts create mode 100644 test/generated/dist/chargeTypes/chargeTypes.queries.ts create mode 100644 test/generated/dist/checklistItems/checklistItems.acl.ts create mode 100644 test/generated/dist/checklistItems/checklistItems.api.ts create mode 100644 test/generated/dist/checklistItems/checklistItems.configs.ts create mode 100644 test/generated/dist/checklistItems/checklistItems.models.ts create mode 100644 test/generated/dist/checklistItems/checklistItems.queries.ts create mode 100644 test/generated/dist/checklistTemplates/checklistTemplates.acl.ts create mode 100644 test/generated/dist/checklistTemplates/checklistTemplates.api.ts create mode 100644 test/generated/dist/checklistTemplates/checklistTemplates.configs.ts create mode 100644 test/generated/dist/checklistTemplates/checklistTemplates.models.ts create mode 100644 test/generated/dist/checklistTemplates/checklistTemplates.queries.ts create mode 100644 test/generated/dist/cities/cities.acl.ts create mode 100644 test/generated/dist/cities/cities.api.ts create mode 100644 test/generated/dist/cities/cities.configs.ts create mode 100644 test/generated/dist/cities/cities.models.ts create mode 100644 test/generated/dist/cities/cities.queries.ts create mode 100644 test/generated/dist/common/common.models.ts create mode 100644 test/generated/dist/containerYards/containerYards.acl.ts create mode 100644 test/generated/dist/containerYards/containerYards.api.ts create mode 100644 test/generated/dist/containerYards/containerYards.configs.ts create mode 100644 test/generated/dist/containerYards/containerYards.models.ts create mode 100644 test/generated/dist/containerYards/containerYards.queries.ts create mode 100644 test/generated/dist/controlTowerAuth/controlTowerAuth.api.ts create mode 100644 test/generated/dist/controlTowerAuth/controlTowerAuth.models.ts create mode 100644 test/generated/dist/controlTowerAuth/controlTowerAuth.queries.ts create mode 100644 test/generated/dist/controlTowerBookings/controlTowerBookings.api.ts create mode 100644 test/generated/dist/controlTowerBookings/controlTowerBookings.configs.ts create mode 100644 test/generated/dist/controlTowerBookings/controlTowerBookings.models.ts create mode 100644 test/generated/dist/controlTowerBookings/controlTowerBookings.queries.ts create mode 100644 test/generated/dist/controlTowerCalendar/controlTowerCalendar.api.ts create mode 100644 test/generated/dist/controlTowerCalendar/controlTowerCalendar.models.ts create mode 100644 test/generated/dist/controlTowerCalendar/controlTowerCalendar.queries.ts create mode 100644 test/generated/dist/controlTowerContainers/controlTowerContainers.api.ts create mode 100644 test/generated/dist/controlTowerContainers/controlTowerContainers.configs.ts create mode 100644 test/generated/dist/controlTowerContainers/controlTowerContainers.models.ts create mode 100644 test/generated/dist/controlTowerContainers/controlTowerContainers.queries.ts create mode 100644 test/generated/dist/controlTowerMe/controlTowerMe.api.ts create mode 100644 test/generated/dist/controlTowerMe/controlTowerMe.models.ts create mode 100644 test/generated/dist/controlTowerMe/controlTowerMe.queries.ts create mode 100644 test/generated/dist/controlTowerPackages/controlTowerPackages.api.ts create mode 100644 test/generated/dist/controlTowerPackages/controlTowerPackages.configs.ts create mode 100644 test/generated/dist/controlTowerPackages/controlTowerPackages.models.ts create mode 100644 test/generated/dist/controlTowerPackages/controlTowerPackages.queries.ts create mode 100644 test/generated/dist/controlTowerSearch/controlTowerSearch.api.ts create mode 100644 test/generated/dist/controlTowerSearch/controlTowerSearch.models.ts create mode 100644 test/generated/dist/controlTowerSearch/controlTowerSearch.queries.ts create mode 100644 test/generated/dist/countries/countries.acl.ts create mode 100644 test/generated/dist/countries/countries.api.ts create mode 100644 test/generated/dist/countries/countries.configs.ts create mode 100644 test/generated/dist/countries/countries.models.ts create mode 100644 test/generated/dist/countries/countries.queries.ts create mode 100644 test/generated/dist/currencies/currencies.acl.ts create mode 100644 test/generated/dist/currencies/currencies.api.ts create mode 100644 test/generated/dist/currencies/currencies.configs.ts create mode 100644 test/generated/dist/currencies/currencies.models.ts create mode 100644 test/generated/dist/currencies/currencies.queries.ts create mode 100644 test/generated/dist/customerAccount/customerAccount.api.ts create mode 100644 test/generated/dist/customerAccount/customerAccount.models.ts create mode 100644 test/generated/dist/customerAccount/customerAccount.queries.ts create mode 100644 test/generated/dist/customers/customers.acl.ts create mode 100644 test/generated/dist/customers/customers.api.ts create mode 100644 test/generated/dist/customers/customers.configs.ts create mode 100644 test/generated/dist/customers/customers.models.ts create mode 100644 test/generated/dist/customers/customers.queries.ts create mode 100644 test/generated/dist/depots/depots.acl.ts create mode 100644 test/generated/dist/depots/depots.api.ts create mode 100644 test/generated/dist/depots/depots.configs.ts create mode 100644 test/generated/dist/depots/depots.models.ts create mode 100644 test/generated/dist/depots/depots.queries.ts create mode 100644 test/generated/dist/documentTemplates/documentTemplates.acl.ts create mode 100644 test/generated/dist/documentTemplates/documentTemplates.api.ts create mode 100644 test/generated/dist/documentTemplates/documentTemplates.configs.ts create mode 100644 test/generated/dist/documentTemplates/documentTemplates.models.ts create mode 100644 test/generated/dist/documentTemplates/documentTemplates.queries.ts create mode 100644 test/generated/dist/dunningAccountStatement/dunningAccountStatement.acl.ts create mode 100644 test/generated/dist/dunningAccountStatement/dunningAccountStatement.api.ts create mode 100644 test/generated/dist/dunningAccountStatement/dunningAccountStatement.models.ts create mode 100644 test/generated/dist/dunningAccountStatement/dunningAccountStatement.queries.ts create mode 100644 test/generated/dist/dunningLevels/dunningLevels.acl.ts create mode 100644 test/generated/dist/dunningLevels/dunningLevels.api.ts create mode 100644 test/generated/dist/dunningLevels/dunningLevels.configs.ts create mode 100644 test/generated/dist/dunningLevels/dunningLevels.models.ts create mode 100644 test/generated/dist/dunningLevels/dunningLevels.queries.ts create mode 100644 test/generated/dist/dunningManagement/dunningManagement.acl.ts create mode 100644 test/generated/dist/dunningManagement/dunningManagement.api.ts create mode 100644 test/generated/dist/dunningManagement/dunningManagement.configs.ts create mode 100644 test/generated/dist/dunningManagement/dunningManagement.models.ts create mode 100644 test/generated/dist/dunningManagement/dunningManagement.queries.ts create mode 100644 test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts create mode 100644 test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts create mode 100644 test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts create mode 100644 test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts create mode 100644 test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts create mode 100644 test/generated/dist/dunningSystems/dunningSystems.acl.ts create mode 100644 test/generated/dist/dunningSystems/dunningSystems.api.ts create mode 100644 test/generated/dist/dunningSystems/dunningSystems.configs.ts create mode 100644 test/generated/dist/dunningSystems/dunningSystems.models.ts create mode 100644 test/generated/dist/dunningSystems/dunningSystems.queries.ts create mode 100644 test/generated/dist/employee/employee.acl.ts create mode 100644 test/generated/dist/employee/employee.api.ts create mode 100644 test/generated/dist/employee/employee.configs.ts create mode 100644 test/generated/dist/employee/employee.models.ts create mode 100644 test/generated/dist/employee/employee.queries.ts create mode 100644 test/generated/dist/employeeAccount/employeeAccount.api.ts create mode 100644 test/generated/dist/employeeAccount/employeeAccount.models.ts create mode 100644 test/generated/dist/employeeAccount/employeeAccount.queries.ts create mode 100644 test/generated/dist/employeePermissions/employeePermissions.acl.ts create mode 100644 test/generated/dist/employeePermissions/employeePermissions.api.ts create mode 100644 test/generated/dist/employeePermissions/employeePermissions.configs.ts create mode 100644 test/generated/dist/employeePermissions/employeePermissions.models.ts create mode 100644 test/generated/dist/employeePermissions/employeePermissions.queries.ts create mode 100644 test/generated/dist/employeeProfile/employeeProfile.api.ts create mode 100644 test/generated/dist/employeeProfile/employeeProfile.models.ts create mode 100644 test/generated/dist/employeeProfile/employeeProfile.queries.ts create mode 100644 test/generated/dist/employeeRoles/employeeRoles.acl.ts create mode 100644 test/generated/dist/employeeRoles/employeeRoles.api.ts create mode 100644 test/generated/dist/employeeRoles/employeeRoles.configs.ts create mode 100644 test/generated/dist/employeeRoles/employeeRoles.models.ts create mode 100644 test/generated/dist/employeeRoles/employeeRoles.queries.ts create mode 100644 test/generated/dist/employeeSettings/employeeSettings.api.ts create mode 100644 test/generated/dist/employeeSettings/employeeSettings.models.ts create mode 100644 test/generated/dist/employeeSettings/employeeSettings.queries.ts create mode 100644 test/generated/dist/employment/employment.acl.ts create mode 100644 test/generated/dist/employment/employment.api.ts create mode 100644 test/generated/dist/employment/employment.configs.ts create mode 100644 test/generated/dist/employment/employment.models.ts create mode 100644 test/generated/dist/employment/employment.queries.ts create mode 100644 test/generated/dist/factoringExport/factoringExport.acl.ts create mode 100644 test/generated/dist/factoringExport/factoringExport.api.ts create mode 100644 test/generated/dist/factoringExport/factoringExport.models.ts create mode 100644 test/generated/dist/factoringExport/factoringExport.queries.ts create mode 100644 test/generated/dist/factoringMerge/factoringMerge.acl.ts create mode 100644 test/generated/dist/factoringMerge/factoringMerge.api.ts create mode 100644 test/generated/dist/factoringMerge/factoringMerge.models.ts create mode 100644 test/generated/dist/factoringMerge/factoringMerge.queries.ts create mode 100644 test/generated/dist/files/files.api.ts create mode 100644 test/generated/dist/files/files.models.ts create mode 100644 test/generated/dist/files/files.queries.ts create mode 100644 test/generated/dist/folders/folders.api.ts create mode 100644 test/generated/dist/folders/folders.models.ts create mode 100644 test/generated/dist/folders/folders.queries.ts create mode 100644 test/generated/dist/hsCodes/hsCodes.acl.ts create mode 100644 test/generated/dist/hsCodes/hsCodes.api.ts create mode 100644 test/generated/dist/hsCodes/hsCodes.configs.ts create mode 100644 test/generated/dist/hsCodes/hsCodes.models.ts create mode 100644 test/generated/dist/hsCodes/hsCodes.queries.ts create mode 100644 test/generated/dist/integrationChannels/integrationChannels.acl.ts create mode 100644 test/generated/dist/integrationChannels/integrationChannels.api.ts create mode 100644 test/generated/dist/integrationChannels/integrationChannels.configs.ts create mode 100644 test/generated/dist/integrationChannels/integrationChannels.models.ts create mode 100644 test/generated/dist/integrationChannels/integrationChannels.queries.ts create mode 100644 test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts create mode 100644 test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.api.ts create mode 100644 test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.models.ts create mode 100644 test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts create mode 100644 test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts create mode 100644 test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts create mode 100644 test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts create mode 100644 test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts create mode 100644 test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts create mode 100644 test/generated/dist/invoicePayments/invoicePayments.acl.ts create mode 100644 test/generated/dist/invoicePayments/invoicePayments.api.ts create mode 100644 test/generated/dist/invoicePayments/invoicePayments.configs.ts create mode 100644 test/generated/dist/invoicePayments/invoicePayments.models.ts create mode 100644 test/generated/dist/invoicePayments/invoicePayments.queries.ts create mode 100644 test/generated/dist/invoices/invoices.acl.ts create mode 100644 test/generated/dist/invoices/invoices.api.ts create mode 100644 test/generated/dist/invoices/invoices.configs.ts create mode 100644 test/generated/dist/invoices/invoices.models.ts create mode 100644 test/generated/dist/invoices/invoices.queries.ts create mode 100644 test/generated/dist/masterData/masterData.acl.ts create mode 100644 test/generated/dist/masterData/masterData.api.ts create mode 100644 test/generated/dist/masterData/masterData.configs.ts create mode 100644 test/generated/dist/masterData/masterData.models.ts create mode 100644 test/generated/dist/masterData/masterData.queries.ts create mode 100644 test/generated/dist/masterDataImport/masterDataImport.acl.ts create mode 100644 test/generated/dist/masterDataImport/masterDataImport.api.ts create mode 100644 test/generated/dist/masterDataImport/masterDataImport.models.ts create mode 100644 test/generated/dist/masterDataImport/masterDataImport.queries.ts create mode 100644 test/generated/dist/offices/offices.acl.ts create mode 100644 test/generated/dist/offices/offices.api.ts create mode 100644 test/generated/dist/offices/offices.configs.ts create mode 100644 test/generated/dist/offices/offices.models.ts create mode 100644 test/generated/dist/offices/offices.queries.ts create mode 100644 test/generated/dist/packageTypes/packageTypes.acl.ts create mode 100644 test/generated/dist/packageTypes/packageTypes.api.ts create mode 100644 test/generated/dist/packageTypes/packageTypes.configs.ts create mode 100644 test/generated/dist/packageTypes/packageTypes.models.ts create mode 100644 test/generated/dist/packageTypes/packageTypes.queries.ts create mode 100644 test/generated/dist/partnerNetworks/partnerNetworks.acl.ts create mode 100644 test/generated/dist/partnerNetworks/partnerNetworks.api.ts create mode 100644 test/generated/dist/partnerNetworks/partnerNetworks.configs.ts create mode 100644 test/generated/dist/partnerNetworks/partnerNetworks.models.ts create mode 100644 test/generated/dist/partnerNetworks/partnerNetworks.queries.ts create mode 100644 test/generated/dist/paymentConfirmations/paymentConfirmations.acl.ts create mode 100644 test/generated/dist/paymentConfirmations/paymentConfirmations.api.ts create mode 100644 test/generated/dist/paymentConfirmations/paymentConfirmations.configs.ts create mode 100644 test/generated/dist/paymentConfirmations/paymentConfirmations.models.ts create mode 100644 test/generated/dist/paymentConfirmations/paymentConfirmations.queries.ts create mode 100644 test/generated/dist/ports/ports.acl.ts create mode 100644 test/generated/dist/ports/ports.api.ts create mode 100644 test/generated/dist/ports/ports.configs.ts create mode 100644 test/generated/dist/ports/ports.models.ts create mode 100644 test/generated/dist/ports/ports.queries.ts create mode 100644 test/generated/dist/positionAccount/positionAccount.acl.ts create mode 100644 test/generated/dist/positionAccount/positionAccount.api.ts create mode 100644 test/generated/dist/positionAccount/positionAccount.models.ts create mode 100644 test/generated/dist/positionAccount/positionAccount.queries.ts create mode 100644 test/generated/dist/positionAccountItems/positionAccountItems.acl.ts create mode 100644 test/generated/dist/positionAccountItems/positionAccountItems.api.ts create mode 100644 test/generated/dist/positionAccountItems/positionAccountItems.models.ts create mode 100644 test/generated/dist/positionAccountItems/positionAccountItems.queries.ts create mode 100644 test/generated/dist/positionCargo/positionCargo.acl.ts create mode 100644 test/generated/dist/positionCargo/positionCargo.api.ts create mode 100644 test/generated/dist/positionCargo/positionCargo.configs.ts create mode 100644 test/generated/dist/positionCargo/positionCargo.models.ts create mode 100644 test/generated/dist/positionCargo/positionCargo.queries.ts create mode 100644 test/generated/dist/positionCargoPackage/positionCargoPackage.acl.ts create mode 100644 test/generated/dist/positionCargoPackage/positionCargoPackage.api.ts create mode 100644 test/generated/dist/positionCargoPackage/positionCargoPackage.queries.ts create mode 100644 test/generated/dist/positionChecklist/positionChecklist.acl.ts create mode 100644 test/generated/dist/positionChecklist/positionChecklist.api.ts create mode 100644 test/generated/dist/positionChecklist/positionChecklist.models.ts create mode 100644 test/generated/dist/positionChecklist/positionChecklist.queries.ts create mode 100644 test/generated/dist/positionInvolvedParties/positionInvolvedParties.acl.ts create mode 100644 test/generated/dist/positionInvolvedParties/positionInvolvedParties.api.ts create mode 100644 test/generated/dist/positionInvolvedParties/positionInvolvedParties.models.ts create mode 100644 test/generated/dist/positionInvolvedParties/positionInvolvedParties.queries.ts create mode 100644 test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts create mode 100644 test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.api.ts create mode 100644 test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts create mode 100644 test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.models.ts create mode 100644 test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts create mode 100644 test/generated/dist/positionRoutes/positionRoutes.acl.ts create mode 100644 test/generated/dist/positionRoutes/positionRoutes.api.ts create mode 100644 test/generated/dist/positionRoutes/positionRoutes.queries.ts create mode 100644 test/generated/dist/positions/positions.acl.ts create mode 100644 test/generated/dist/positions/positions.api.ts create mode 100644 test/generated/dist/positions/positions.configs.ts create mode 100644 test/generated/dist/positions/positions.models.ts create mode 100644 test/generated/dist/positions/positions.queries.ts create mode 100644 test/generated/dist/projectLite/projectLite.acl.ts create mode 100644 test/generated/dist/projectLite/projectLite.api.ts create mode 100644 test/generated/dist/projectLite/projectLite.configs.ts create mode 100644 test/generated/dist/projectLite/projectLite.models.ts create mode 100644 test/generated/dist/projectLite/projectLite.queries.ts create mode 100644 test/generated/dist/queryModules.ts create mode 100644 test/generated/dist/quoteAccount/quoteAccount.acl.ts create mode 100644 test/generated/dist/quoteAccount/quoteAccount.api.ts create mode 100644 test/generated/dist/quoteAccount/quoteAccount.models.ts create mode 100644 test/generated/dist/quoteAccount/quoteAccount.queries.ts create mode 100644 test/generated/dist/quoteCargo/quoteCargo.acl.ts create mode 100644 test/generated/dist/quoteCargo/quoteCargo.api.ts create mode 100644 test/generated/dist/quoteCargo/quoteCargo.configs.ts create mode 100644 test/generated/dist/quoteCargo/quoteCargo.models.ts create mode 100644 test/generated/dist/quoteCargo/quoteCargo.queries.ts create mode 100644 test/generated/dist/quoteCargoPackage/quoteCargoPackage.acl.ts create mode 100644 test/generated/dist/quoteCargoPackage/quoteCargoPackage.api.ts create mode 100644 test/generated/dist/quoteCargoPackage/quoteCargoPackage.queries.ts create mode 100644 test/generated/dist/quoteConversion/quoteConversion.acl.ts create mode 100644 test/generated/dist/quoteConversion/quoteConversion.api.ts create mode 100644 test/generated/dist/quoteConversion/quoteConversion.models.ts create mode 100644 test/generated/dist/quoteConversion/quoteConversion.queries.ts create mode 100644 test/generated/dist/quoteDocument/quoteDocument.acl.ts create mode 100644 test/generated/dist/quoteDocument/quoteDocument.api.ts create mode 100644 test/generated/dist/quoteDocument/quoteDocument.models.ts create mode 100644 test/generated/dist/quoteDocument/quoteDocument.queries.ts create mode 100644 test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts create mode 100644 test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts create mode 100644 test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts create mode 100644 test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts create mode 100644 test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts create mode 100644 test/generated/dist/quoteRoutes/quoteRoutes.acl.ts create mode 100644 test/generated/dist/quoteRoutes/quoteRoutes.api.ts create mode 100644 test/generated/dist/quoteRoutes/quoteRoutes.queries.ts create mode 100644 test/generated/dist/quotes/quotes.acl.ts create mode 100644 test/generated/dist/quotes/quotes.api.ts create mode 100644 test/generated/dist/quotes/quotes.configs.ts create mode 100644 test/generated/dist/quotes/quotes.models.ts create mode 100644 test/generated/dist/quotes/quotes.queries.ts create mode 100644 test/generated/dist/remarkTemplates/remarkTemplates.acl.ts create mode 100644 test/generated/dist/remarkTemplates/remarkTemplates.api.ts create mode 100644 test/generated/dist/remarkTemplates/remarkTemplates.configs.ts create mode 100644 test/generated/dist/remarkTemplates/remarkTemplates.models.ts create mode 100644 test/generated/dist/remarkTemplates/remarkTemplates.queries.ts create mode 100644 test/generated/dist/roadQuotes/roadQuotes.acl.ts create mode 100644 test/generated/dist/roadQuotes/roadQuotes.api.ts create mode 100644 test/generated/dist/roadQuotes/roadQuotes.models.ts create mode 100644 test/generated/dist/roadQuotes/roadQuotes.queries.ts create mode 100644 test/generated/dist/seaPositions/seaPositions.acl.ts create mode 100644 test/generated/dist/seaPositions/seaPositions.api.ts create mode 100644 test/generated/dist/seaPositions/seaPositions.models.ts create mode 100644 test/generated/dist/seaPositions/seaPositions.queries.ts create mode 100644 test/generated/dist/seaQuotes/seaQuotes.acl.ts create mode 100644 test/generated/dist/seaQuotes/seaQuotes.api.ts create mode 100644 test/generated/dist/seaQuotes/seaQuotes.models.ts create mode 100644 test/generated/dist/seaQuotes/seaQuotes.queries.ts create mode 100644 test/generated/dist/shippingInstructions/shippingInstructions.acl.ts create mode 100644 test/generated/dist/shippingInstructions/shippingInstructions.api.ts create mode 100644 test/generated/dist/shippingInstructions/shippingInstructions.models.ts create mode 100644 test/generated/dist/shippingInstructions/shippingInstructions.queries.ts create mode 100644 test/generated/dist/terminals/terminals.acl.ts create mode 100644 test/generated/dist/terminals/terminals.api.ts create mode 100644 test/generated/dist/terminals/terminals.configs.ts create mode 100644 test/generated/dist/terminals/terminals.models.ts create mode 100644 test/generated/dist/terminals/terminals.queries.ts create mode 100644 test/generated/dist/useCrossTabQueryInvalidation.ts create mode 100644 test/generated/dist/useMutationEffects.ts create mode 100644 test/generated/dist/userActivity/userActivity.api.ts create mode 100644 test/generated/dist/userActivity/userActivity.models.ts create mode 100644 test/generated/dist/userActivity/userActivity.queries.ts create mode 100644 test/generated/dist/vatRules/vatRules.acl.ts create mode 100644 test/generated/dist/vatRules/vatRules.api.ts create mode 100644 test/generated/dist/vatRules/vatRules.configs.ts create mode 100644 test/generated/dist/vatRules/vatRules.models.ts create mode 100644 test/generated/dist/vatRules/vatRules.queries.ts create mode 100644 test/generated/dist/warehouses/warehouses.acl.ts create mode 100644 test/generated/dist/warehouses/warehouses.api.ts create mode 100644 test/generated/dist/warehouses/warehouses.configs.ts create mode 100644 test/generated/dist/warehouses/warehouses.models.ts create mode 100644 test/generated/dist/warehouses/warehouses.queries.ts create mode 100644 test/generated/dist/workingDocuments/workingDocuments.acl.ts create mode 100644 test/generated/dist/workingDocuments/workingDocuments.api.ts create mode 100644 test/generated/dist/workingDocuments/workingDocuments.configs.ts create mode 100644 test/generated/dist/workingDocuments/workingDocuments.models.ts create mode 100644 test/generated/dist/workingDocuments/workingDocuments.queries.ts create mode 100644 test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts create mode 100644 test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts create mode 100644 test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts create mode 100644 test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts create mode 100644 test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts create mode 100644 test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts create mode 100644 test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts create mode 100644 test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts create mode 100644 test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts create mode 100644 test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts create mode 100644 test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts create mode 100644 test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts create mode 100644 test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts create mode 100644 test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts create mode 100644 test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts create mode 100644 test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts create mode 100644 test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts create mode 100644 test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts create mode 100644 test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts create mode 100644 test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts create mode 100644 test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts create mode 100644 test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts create mode 100644 test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts create mode 100644 test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts create mode 100644 test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts create mode 100644 test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts create mode 100644 test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts create mode 100644 test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts create mode 100644 test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts create mode 100644 test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts create mode 100644 test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts create mode 100644 test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts create mode 100644 test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts create mode 100644 test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts create mode 100644 test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts create mode 100644 test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts create mode 100644 test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts create mode 100644 test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts create mode 100644 test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts create mode 100644 test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts create mode 100644 test/generated/dist/zod.extended.ts create mode 100644 test/generated/full/aWBStocks/aWBStocks.acl.ts create mode 100644 test/generated/full/aWBStocks/aWBStocks.api.ts create mode 100644 test/generated/full/aWBStocks/aWBStocks.configs.ts create mode 100644 test/generated/full/aWBStocks/aWBStocks.models.ts create mode 100644 test/generated/full/aWBStocks/aWBStocks.queries.ts create mode 100644 test/generated/full/acl/app.ability.ts create mode 100644 test/generated/full/acl/useAclCheck.ts create mode 100644 test/generated/full/airPositions/airPositions.acl.ts create mode 100644 test/generated/full/airPositions/airPositions.api.ts create mode 100644 test/generated/full/airPositions/airPositions.models.ts create mode 100644 test/generated/full/airPositions/airPositions.queries.ts create mode 100644 test/generated/full/airports/airports.acl.ts create mode 100644 test/generated/full/airports/airports.api.ts create mode 100644 test/generated/full/airports/airports.configs.ts create mode 100644 test/generated/full/airports/airports.models.ts create mode 100644 test/generated/full/airports/airports.queries.ts create mode 100644 test/generated/full/app-rest-client.ts create mode 100644 test/generated/full/bankAccounts/bankAccounts.acl.ts create mode 100644 test/generated/full/bankAccounts/bankAccounts.api.ts create mode 100644 test/generated/full/bankAccounts/bankAccounts.configs.ts create mode 100644 test/generated/full/bankAccounts/bankAccounts.models.ts create mode 100644 test/generated/full/bankAccounts/bankAccounts.queries.ts create mode 100644 test/generated/full/bookkeepingExport/bookkeepingExport.acl.ts create mode 100644 test/generated/full/bookkeepingExport/bookkeepingExport.api.ts create mode 100644 test/generated/full/bookkeepingExport/bookkeepingExport.configs.ts create mode 100644 test/generated/full/bookkeepingExport/bookkeepingExport.models.ts create mode 100644 test/generated/full/bookkeepingExport/bookkeepingExport.queries.ts create mode 100644 test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts create mode 100644 test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts create mode 100644 test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts create mode 100644 test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts create mode 100644 test/generated/full/businessPartnerContacts/businessPartnerContacts.acl.ts create mode 100644 test/generated/full/businessPartnerContacts/businessPartnerContacts.api.ts create mode 100644 test/generated/full/businessPartnerContacts/businessPartnerContacts.configs.ts create mode 100644 test/generated/full/businessPartnerContacts/businessPartnerContacts.models.ts create mode 100644 test/generated/full/businessPartnerContacts/businessPartnerContacts.queries.ts create mode 100644 test/generated/full/businessPartners/businessPartners.acl.ts create mode 100644 test/generated/full/businessPartners/businessPartners.api.ts create mode 100644 test/generated/full/businessPartners/businessPartners.configs.ts create mode 100644 test/generated/full/businessPartners/businessPartners.models.ts create mode 100644 test/generated/full/businessPartners/businessPartners.queries.ts create mode 100644 test/generated/full/cargoTypes/cargoTypes.acl.ts create mode 100644 test/generated/full/cargoTypes/cargoTypes.api.ts create mode 100644 test/generated/full/cargoTypes/cargoTypes.configs.ts create mode 100644 test/generated/full/cargoTypes/cargoTypes.models.ts create mode 100644 test/generated/full/cargoTypes/cargoTypes.queries.ts create mode 100644 test/generated/full/chargeTypes/chargeTypes.acl.ts create mode 100644 test/generated/full/chargeTypes/chargeTypes.api.ts create mode 100644 test/generated/full/chargeTypes/chargeTypes.configs.ts create mode 100644 test/generated/full/chargeTypes/chargeTypes.models.ts create mode 100644 test/generated/full/chargeTypes/chargeTypes.queries.ts create mode 100644 test/generated/full/checklistItems/checklistItems.acl.ts create mode 100644 test/generated/full/checklistItems/checklistItems.api.ts create mode 100644 test/generated/full/checklistItems/checklistItems.configs.ts create mode 100644 test/generated/full/checklistItems/checklistItems.models.ts create mode 100644 test/generated/full/checklistItems/checklistItems.queries.ts create mode 100644 test/generated/full/checklistTemplates/checklistTemplates.acl.ts create mode 100644 test/generated/full/checklistTemplates/checklistTemplates.api.ts create mode 100644 test/generated/full/checklistTemplates/checklistTemplates.configs.ts create mode 100644 test/generated/full/checklistTemplates/checklistTemplates.models.ts create mode 100644 test/generated/full/checklistTemplates/checklistTemplates.queries.ts create mode 100644 test/generated/full/cities/cities.acl.ts create mode 100644 test/generated/full/cities/cities.api.ts create mode 100644 test/generated/full/cities/cities.configs.ts create mode 100644 test/generated/full/cities/cities.models.ts create mode 100644 test/generated/full/cities/cities.queries.ts create mode 100644 test/generated/full/common/common.models.ts create mode 100644 test/generated/full/containerYards/containerYards.acl.ts create mode 100644 test/generated/full/containerYards/containerYards.api.ts create mode 100644 test/generated/full/containerYards/containerYards.configs.ts create mode 100644 test/generated/full/containerYards/containerYards.models.ts create mode 100644 test/generated/full/containerYards/containerYards.queries.ts create mode 100644 test/generated/full/controlTowerAuth/controlTowerAuth.api.ts create mode 100644 test/generated/full/controlTowerAuth/controlTowerAuth.models.ts create mode 100644 test/generated/full/controlTowerAuth/controlTowerAuth.queries.ts create mode 100644 test/generated/full/controlTowerBookings/controlTowerBookings.api.ts create mode 100644 test/generated/full/controlTowerBookings/controlTowerBookings.configs.ts create mode 100644 test/generated/full/controlTowerBookings/controlTowerBookings.models.ts create mode 100644 test/generated/full/controlTowerBookings/controlTowerBookings.queries.ts create mode 100644 test/generated/full/controlTowerCalendar/controlTowerCalendar.api.ts create mode 100644 test/generated/full/controlTowerCalendar/controlTowerCalendar.models.ts create mode 100644 test/generated/full/controlTowerCalendar/controlTowerCalendar.queries.ts create mode 100644 test/generated/full/controlTowerContainers/controlTowerContainers.api.ts create mode 100644 test/generated/full/controlTowerContainers/controlTowerContainers.configs.ts create mode 100644 test/generated/full/controlTowerContainers/controlTowerContainers.models.ts create mode 100644 test/generated/full/controlTowerContainers/controlTowerContainers.queries.ts create mode 100644 test/generated/full/controlTowerMe/controlTowerMe.api.ts create mode 100644 test/generated/full/controlTowerMe/controlTowerMe.models.ts create mode 100644 test/generated/full/controlTowerMe/controlTowerMe.queries.ts create mode 100644 test/generated/full/controlTowerPackages/controlTowerPackages.api.ts create mode 100644 test/generated/full/controlTowerPackages/controlTowerPackages.configs.ts create mode 100644 test/generated/full/controlTowerPackages/controlTowerPackages.models.ts create mode 100644 test/generated/full/controlTowerPackages/controlTowerPackages.queries.ts create mode 100644 test/generated/full/controlTowerSearch/controlTowerSearch.api.ts create mode 100644 test/generated/full/controlTowerSearch/controlTowerSearch.models.ts create mode 100644 test/generated/full/controlTowerSearch/controlTowerSearch.queries.ts create mode 100644 test/generated/full/countries/countries.acl.ts create mode 100644 test/generated/full/countries/countries.api.ts create mode 100644 test/generated/full/countries/countries.configs.ts create mode 100644 test/generated/full/countries/countries.models.ts create mode 100644 test/generated/full/countries/countries.queries.ts create mode 100644 test/generated/full/currencies/currencies.acl.ts create mode 100644 test/generated/full/currencies/currencies.api.ts create mode 100644 test/generated/full/currencies/currencies.configs.ts create mode 100644 test/generated/full/currencies/currencies.models.ts create mode 100644 test/generated/full/currencies/currencies.queries.ts create mode 100644 test/generated/full/customerAccount/customerAccount.api.ts create mode 100644 test/generated/full/customerAccount/customerAccount.models.ts create mode 100644 test/generated/full/customerAccount/customerAccount.queries.ts create mode 100644 test/generated/full/customers/customers.acl.ts create mode 100644 test/generated/full/customers/customers.api.ts create mode 100644 test/generated/full/customers/customers.configs.ts create mode 100644 test/generated/full/customers/customers.models.ts create mode 100644 test/generated/full/customers/customers.queries.ts create mode 100644 test/generated/full/depots/depots.acl.ts create mode 100644 test/generated/full/depots/depots.api.ts create mode 100644 test/generated/full/depots/depots.configs.ts create mode 100644 test/generated/full/depots/depots.models.ts create mode 100644 test/generated/full/depots/depots.queries.ts create mode 100644 test/generated/full/documentTemplates/documentTemplates.acl.ts create mode 100644 test/generated/full/documentTemplates/documentTemplates.api.ts create mode 100644 test/generated/full/documentTemplates/documentTemplates.configs.ts create mode 100644 test/generated/full/documentTemplates/documentTemplates.models.ts create mode 100644 test/generated/full/documentTemplates/documentTemplates.queries.ts create mode 100644 test/generated/full/dunningAccountStatement/dunningAccountStatement.acl.ts create mode 100644 test/generated/full/dunningAccountStatement/dunningAccountStatement.api.ts create mode 100644 test/generated/full/dunningAccountStatement/dunningAccountStatement.models.ts create mode 100644 test/generated/full/dunningAccountStatement/dunningAccountStatement.queries.ts create mode 100644 test/generated/full/dunningLevels/dunningLevels.acl.ts create mode 100644 test/generated/full/dunningLevels/dunningLevels.api.ts create mode 100644 test/generated/full/dunningLevels/dunningLevels.configs.ts create mode 100644 test/generated/full/dunningLevels/dunningLevels.models.ts create mode 100644 test/generated/full/dunningLevels/dunningLevels.queries.ts create mode 100644 test/generated/full/dunningManagement/dunningManagement.acl.ts create mode 100644 test/generated/full/dunningManagement/dunningManagement.api.ts create mode 100644 test/generated/full/dunningManagement/dunningManagement.configs.ts create mode 100644 test/generated/full/dunningManagement/dunningManagement.models.ts create mode 100644 test/generated/full/dunningManagement/dunningManagement.queries.ts create mode 100644 test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts create mode 100644 test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts create mode 100644 test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts create mode 100644 test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts create mode 100644 test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts create mode 100644 test/generated/full/dunningSystems/dunningSystems.acl.ts create mode 100644 test/generated/full/dunningSystems/dunningSystems.api.ts create mode 100644 test/generated/full/dunningSystems/dunningSystems.configs.ts create mode 100644 test/generated/full/dunningSystems/dunningSystems.models.ts create mode 100644 test/generated/full/dunningSystems/dunningSystems.queries.ts create mode 100644 test/generated/full/employee/employee.acl.ts create mode 100644 test/generated/full/employee/employee.api.ts create mode 100644 test/generated/full/employee/employee.configs.ts create mode 100644 test/generated/full/employee/employee.models.ts create mode 100644 test/generated/full/employee/employee.queries.ts create mode 100644 test/generated/full/employeeAccount/employeeAccount.api.ts create mode 100644 test/generated/full/employeeAccount/employeeAccount.models.ts create mode 100644 test/generated/full/employeeAccount/employeeAccount.queries.ts create mode 100644 test/generated/full/employeePermissions/employeePermissions.acl.ts create mode 100644 test/generated/full/employeePermissions/employeePermissions.api.ts create mode 100644 test/generated/full/employeePermissions/employeePermissions.configs.ts create mode 100644 test/generated/full/employeePermissions/employeePermissions.models.ts create mode 100644 test/generated/full/employeePermissions/employeePermissions.queries.ts create mode 100644 test/generated/full/employeeProfile/employeeProfile.api.ts create mode 100644 test/generated/full/employeeProfile/employeeProfile.models.ts create mode 100644 test/generated/full/employeeProfile/employeeProfile.queries.ts create mode 100644 test/generated/full/employeeRoles/employeeRoles.acl.ts create mode 100644 test/generated/full/employeeRoles/employeeRoles.api.ts create mode 100644 test/generated/full/employeeRoles/employeeRoles.configs.ts create mode 100644 test/generated/full/employeeRoles/employeeRoles.models.ts create mode 100644 test/generated/full/employeeRoles/employeeRoles.queries.ts create mode 100644 test/generated/full/employeeSettings/employeeSettings.api.ts create mode 100644 test/generated/full/employeeSettings/employeeSettings.models.ts create mode 100644 test/generated/full/employeeSettings/employeeSettings.queries.ts create mode 100644 test/generated/full/employment/employment.acl.ts create mode 100644 test/generated/full/employment/employment.api.ts create mode 100644 test/generated/full/employment/employment.configs.ts create mode 100644 test/generated/full/employment/employment.models.ts create mode 100644 test/generated/full/employment/employment.queries.ts create mode 100644 test/generated/full/factoringExport/factoringExport.acl.ts create mode 100644 test/generated/full/factoringExport/factoringExport.api.ts create mode 100644 test/generated/full/factoringExport/factoringExport.models.ts create mode 100644 test/generated/full/factoringExport/factoringExport.queries.ts create mode 100644 test/generated/full/factoringMerge/factoringMerge.acl.ts create mode 100644 test/generated/full/factoringMerge/factoringMerge.api.ts create mode 100644 test/generated/full/factoringMerge/factoringMerge.models.ts create mode 100644 test/generated/full/factoringMerge/factoringMerge.queries.ts create mode 100644 test/generated/full/files/files.api.ts create mode 100644 test/generated/full/files/files.models.ts create mode 100644 test/generated/full/files/files.queries.ts create mode 100644 test/generated/full/folders/folders.api.ts create mode 100644 test/generated/full/folders/folders.models.ts create mode 100644 test/generated/full/folders/folders.queries.ts create mode 100644 test/generated/full/hsCodes/hsCodes.acl.ts create mode 100644 test/generated/full/hsCodes/hsCodes.api.ts create mode 100644 test/generated/full/hsCodes/hsCodes.configs.ts create mode 100644 test/generated/full/hsCodes/hsCodes.models.ts create mode 100644 test/generated/full/hsCodes/hsCodes.queries.ts create mode 100644 test/generated/full/integrationChannels/integrationChannels.acl.ts create mode 100644 test/generated/full/integrationChannels/integrationChannels.api.ts create mode 100644 test/generated/full/integrationChannels/integrationChannels.configs.ts create mode 100644 test/generated/full/integrationChannels/integrationChannels.models.ts create mode 100644 test/generated/full/integrationChannels/integrationChannels.queries.ts create mode 100644 test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts create mode 100644 test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.api.ts create mode 100644 test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.models.ts create mode 100644 test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts create mode 100644 test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts create mode 100644 test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts create mode 100644 test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts create mode 100644 test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts create mode 100644 test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts create mode 100644 test/generated/full/invoicePayments/invoicePayments.acl.ts create mode 100644 test/generated/full/invoicePayments/invoicePayments.api.ts create mode 100644 test/generated/full/invoicePayments/invoicePayments.configs.ts create mode 100644 test/generated/full/invoicePayments/invoicePayments.models.ts create mode 100644 test/generated/full/invoicePayments/invoicePayments.queries.ts create mode 100644 test/generated/full/invoices/invoices.acl.ts create mode 100644 test/generated/full/invoices/invoices.api.ts create mode 100644 test/generated/full/invoices/invoices.configs.ts create mode 100644 test/generated/full/invoices/invoices.models.ts create mode 100644 test/generated/full/invoices/invoices.queries.ts create mode 100644 test/generated/full/masterData/masterData.acl.ts create mode 100644 test/generated/full/masterData/masterData.api.ts create mode 100644 test/generated/full/masterData/masterData.configs.ts create mode 100644 test/generated/full/masterData/masterData.models.ts create mode 100644 test/generated/full/masterData/masterData.queries.ts create mode 100644 test/generated/full/masterDataImport/masterDataImport.acl.ts create mode 100644 test/generated/full/masterDataImport/masterDataImport.api.ts create mode 100644 test/generated/full/masterDataImport/masterDataImport.models.ts create mode 100644 test/generated/full/masterDataImport/masterDataImport.queries.ts create mode 100644 test/generated/full/offices/offices.acl.ts create mode 100644 test/generated/full/offices/offices.api.ts create mode 100644 test/generated/full/offices/offices.configs.ts create mode 100644 test/generated/full/offices/offices.models.ts create mode 100644 test/generated/full/offices/offices.queries.ts create mode 100644 test/generated/full/packageTypes/packageTypes.acl.ts create mode 100644 test/generated/full/packageTypes/packageTypes.api.ts create mode 100644 test/generated/full/packageTypes/packageTypes.configs.ts create mode 100644 test/generated/full/packageTypes/packageTypes.models.ts create mode 100644 test/generated/full/packageTypes/packageTypes.queries.ts create mode 100644 test/generated/full/partnerNetworks/partnerNetworks.acl.ts create mode 100644 test/generated/full/partnerNetworks/partnerNetworks.api.ts create mode 100644 test/generated/full/partnerNetworks/partnerNetworks.configs.ts create mode 100644 test/generated/full/partnerNetworks/partnerNetworks.models.ts create mode 100644 test/generated/full/partnerNetworks/partnerNetworks.queries.ts create mode 100644 test/generated/full/paymentConfirmations/paymentConfirmations.acl.ts create mode 100644 test/generated/full/paymentConfirmations/paymentConfirmations.api.ts create mode 100644 test/generated/full/paymentConfirmations/paymentConfirmations.configs.ts create mode 100644 test/generated/full/paymentConfirmations/paymentConfirmations.models.ts create mode 100644 test/generated/full/paymentConfirmations/paymentConfirmations.queries.ts create mode 100644 test/generated/full/ports/ports.acl.ts create mode 100644 test/generated/full/ports/ports.api.ts create mode 100644 test/generated/full/ports/ports.configs.ts create mode 100644 test/generated/full/ports/ports.models.ts create mode 100644 test/generated/full/ports/ports.queries.ts create mode 100644 test/generated/full/positionAccount/positionAccount.acl.ts create mode 100644 test/generated/full/positionAccount/positionAccount.api.ts create mode 100644 test/generated/full/positionAccount/positionAccount.models.ts create mode 100644 test/generated/full/positionAccount/positionAccount.queries.ts create mode 100644 test/generated/full/positionAccountItems/positionAccountItems.acl.ts create mode 100644 test/generated/full/positionAccountItems/positionAccountItems.api.ts create mode 100644 test/generated/full/positionAccountItems/positionAccountItems.models.ts create mode 100644 test/generated/full/positionAccountItems/positionAccountItems.queries.ts create mode 100644 test/generated/full/positionCargo/positionCargo.acl.ts create mode 100644 test/generated/full/positionCargo/positionCargo.api.ts create mode 100644 test/generated/full/positionCargo/positionCargo.configs.ts create mode 100644 test/generated/full/positionCargo/positionCargo.models.ts create mode 100644 test/generated/full/positionCargo/positionCargo.queries.ts create mode 100644 test/generated/full/positionCargoPackage/positionCargoPackage.acl.ts create mode 100644 test/generated/full/positionCargoPackage/positionCargoPackage.api.ts create mode 100644 test/generated/full/positionCargoPackage/positionCargoPackage.queries.ts create mode 100644 test/generated/full/positionChecklist/positionChecklist.acl.ts create mode 100644 test/generated/full/positionChecklist/positionChecklist.api.ts create mode 100644 test/generated/full/positionChecklist/positionChecklist.models.ts create mode 100644 test/generated/full/positionChecklist/positionChecklist.queries.ts create mode 100644 test/generated/full/positionInvolvedParties/positionInvolvedParties.acl.ts create mode 100644 test/generated/full/positionInvolvedParties/positionInvolvedParties.api.ts create mode 100644 test/generated/full/positionInvolvedParties/positionInvolvedParties.models.ts create mode 100644 test/generated/full/positionInvolvedParties/positionInvolvedParties.queries.ts create mode 100644 test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts create mode 100644 test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.api.ts create mode 100644 test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts create mode 100644 test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.models.ts create mode 100644 test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts create mode 100644 test/generated/full/positionRoutes/positionRoutes.acl.ts create mode 100644 test/generated/full/positionRoutes/positionRoutes.api.ts create mode 100644 test/generated/full/positionRoutes/positionRoutes.queries.ts create mode 100644 test/generated/full/positions/positions.acl.ts create mode 100644 test/generated/full/positions/positions.api.ts create mode 100644 test/generated/full/positions/positions.configs.ts create mode 100644 test/generated/full/positions/positions.models.ts create mode 100644 test/generated/full/positions/positions.queries.ts create mode 100644 test/generated/full/projectLite/projectLite.acl.ts create mode 100644 test/generated/full/projectLite/projectLite.api.ts create mode 100644 test/generated/full/projectLite/projectLite.configs.ts create mode 100644 test/generated/full/projectLite/projectLite.models.ts create mode 100644 test/generated/full/projectLite/projectLite.queries.ts create mode 100644 test/generated/full/queryModules.ts create mode 100644 test/generated/full/quoteAccount/quoteAccount.acl.ts create mode 100644 test/generated/full/quoteAccount/quoteAccount.api.ts create mode 100644 test/generated/full/quoteAccount/quoteAccount.models.ts create mode 100644 test/generated/full/quoteAccount/quoteAccount.queries.ts create mode 100644 test/generated/full/quoteCargo/quoteCargo.acl.ts create mode 100644 test/generated/full/quoteCargo/quoteCargo.api.ts create mode 100644 test/generated/full/quoteCargo/quoteCargo.configs.ts create mode 100644 test/generated/full/quoteCargo/quoteCargo.models.ts create mode 100644 test/generated/full/quoteCargo/quoteCargo.queries.ts create mode 100644 test/generated/full/quoteCargoPackage/quoteCargoPackage.acl.ts create mode 100644 test/generated/full/quoteCargoPackage/quoteCargoPackage.api.ts create mode 100644 test/generated/full/quoteCargoPackage/quoteCargoPackage.queries.ts create mode 100644 test/generated/full/quoteConversion/quoteConversion.acl.ts create mode 100644 test/generated/full/quoteConversion/quoteConversion.api.ts create mode 100644 test/generated/full/quoteConversion/quoteConversion.models.ts create mode 100644 test/generated/full/quoteConversion/quoteConversion.queries.ts create mode 100644 test/generated/full/quoteDocument/quoteDocument.acl.ts create mode 100644 test/generated/full/quoteDocument/quoteDocument.api.ts create mode 100644 test/generated/full/quoteDocument/quoteDocument.models.ts create mode 100644 test/generated/full/quoteDocument/quoteDocument.queries.ts create mode 100644 test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts create mode 100644 test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts create mode 100644 test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts create mode 100644 test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts create mode 100644 test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts create mode 100644 test/generated/full/quoteRoutes/quoteRoutes.acl.ts create mode 100644 test/generated/full/quoteRoutes/quoteRoutes.api.ts create mode 100644 test/generated/full/quoteRoutes/quoteRoutes.queries.ts create mode 100644 test/generated/full/quotes/quotes.acl.ts create mode 100644 test/generated/full/quotes/quotes.api.ts create mode 100644 test/generated/full/quotes/quotes.configs.ts create mode 100644 test/generated/full/quotes/quotes.models.ts create mode 100644 test/generated/full/quotes/quotes.queries.ts create mode 100644 test/generated/full/remarkTemplates/remarkTemplates.acl.ts create mode 100644 test/generated/full/remarkTemplates/remarkTemplates.api.ts create mode 100644 test/generated/full/remarkTemplates/remarkTemplates.configs.ts create mode 100644 test/generated/full/remarkTemplates/remarkTemplates.models.ts create mode 100644 test/generated/full/remarkTemplates/remarkTemplates.queries.ts create mode 100644 test/generated/full/roadQuotes/roadQuotes.acl.ts create mode 100644 test/generated/full/roadQuotes/roadQuotes.api.ts create mode 100644 test/generated/full/roadQuotes/roadQuotes.models.ts create mode 100644 test/generated/full/roadQuotes/roadQuotes.queries.ts create mode 100644 test/generated/full/seaPositions/seaPositions.acl.ts create mode 100644 test/generated/full/seaPositions/seaPositions.api.ts create mode 100644 test/generated/full/seaPositions/seaPositions.models.ts create mode 100644 test/generated/full/seaPositions/seaPositions.queries.ts create mode 100644 test/generated/full/seaQuotes/seaQuotes.acl.ts create mode 100644 test/generated/full/seaQuotes/seaQuotes.api.ts create mode 100644 test/generated/full/seaQuotes/seaQuotes.models.ts create mode 100644 test/generated/full/seaQuotes/seaQuotes.queries.ts create mode 100644 test/generated/full/shippingInstructions/shippingInstructions.acl.ts create mode 100644 test/generated/full/shippingInstructions/shippingInstructions.api.ts create mode 100644 test/generated/full/shippingInstructions/shippingInstructions.models.ts create mode 100644 test/generated/full/shippingInstructions/shippingInstructions.queries.ts create mode 100644 test/generated/full/terminals/terminals.acl.ts create mode 100644 test/generated/full/terminals/terminals.api.ts create mode 100644 test/generated/full/terminals/terminals.configs.ts create mode 100644 test/generated/full/terminals/terminals.models.ts create mode 100644 test/generated/full/terminals/terminals.queries.ts create mode 100644 test/generated/full/useCrossTabQueryInvalidation.ts create mode 100644 test/generated/full/useMutationEffects.ts create mode 100644 test/generated/full/userActivity/userActivity.api.ts create mode 100644 test/generated/full/userActivity/userActivity.models.ts create mode 100644 test/generated/full/userActivity/userActivity.queries.ts create mode 100644 test/generated/full/vatRules/vatRules.acl.ts create mode 100644 test/generated/full/vatRules/vatRules.api.ts create mode 100644 test/generated/full/vatRules/vatRules.configs.ts create mode 100644 test/generated/full/vatRules/vatRules.models.ts create mode 100644 test/generated/full/vatRules/vatRules.queries.ts create mode 100644 test/generated/full/warehouses/warehouses.acl.ts create mode 100644 test/generated/full/warehouses/warehouses.api.ts create mode 100644 test/generated/full/warehouses/warehouses.configs.ts create mode 100644 test/generated/full/warehouses/warehouses.models.ts create mode 100644 test/generated/full/warehouses/warehouses.queries.ts create mode 100644 test/generated/full/workingDocuments/workingDocuments.acl.ts create mode 100644 test/generated/full/workingDocuments/workingDocuments.api.ts create mode 100644 test/generated/full/workingDocuments/workingDocuments.configs.ts create mode 100644 test/generated/full/workingDocuments/workingDocuments.models.ts create mode 100644 test/generated/full/workingDocuments/workingDocuments.queries.ts create mode 100644 test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts create mode 100644 test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts create mode 100644 test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts create mode 100644 test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts create mode 100644 test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts create mode 100644 test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts create mode 100644 test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts create mode 100644 test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts create mode 100644 test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts create mode 100644 test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts create mode 100644 test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts create mode 100644 test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts create mode 100644 test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts create mode 100644 test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts create mode 100644 test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts create mode 100644 test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts create mode 100644 test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts create mode 100644 test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts create mode 100644 test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts create mode 100644 test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts create mode 100644 test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts create mode 100644 test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts create mode 100644 test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts create mode 100644 test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts create mode 100644 test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts create mode 100644 test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts create mode 100644 test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts create mode 100644 test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts create mode 100644 test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts create mode 100644 test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts create mode 100644 test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts create mode 100644 test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts create mode 100644 test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts create mode 100644 test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts create mode 100644 test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts create mode 100644 test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts create mode 100644 test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts create mode 100644 test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts create mode 100644 test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts create mode 100644 test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts create mode 100644 test/generated/full/zod.extended.ts create mode 100644 test/generated/next/aWBStocks/aWBStocks.acl.ts create mode 100644 test/generated/next/aWBStocks/aWBStocks.api.ts create mode 100644 test/generated/next/aWBStocks/aWBStocks.configs.ts create mode 100644 test/generated/next/aWBStocks/aWBStocks.models.ts create mode 100644 test/generated/next/aWBStocks/aWBStocks.queries.ts create mode 100644 test/generated/next/acl/app.ability.ts create mode 100644 test/generated/next/acl/useAclCheck.ts create mode 100644 test/generated/next/airPositions/airPositions.acl.ts create mode 100644 test/generated/next/airPositions/airPositions.api.ts create mode 100644 test/generated/next/airPositions/airPositions.models.ts create mode 100644 test/generated/next/airPositions/airPositions.queries.ts create mode 100644 test/generated/next/airports/airports.acl.ts create mode 100644 test/generated/next/airports/airports.api.ts create mode 100644 test/generated/next/airports/airports.configs.ts create mode 100644 test/generated/next/airports/airports.models.ts create mode 100644 test/generated/next/airports/airports.queries.ts create mode 100644 test/generated/next/app-rest-client.ts create mode 100644 test/generated/next/bankAccounts/bankAccounts.acl.ts create mode 100644 test/generated/next/bankAccounts/bankAccounts.api.ts create mode 100644 test/generated/next/bankAccounts/bankAccounts.configs.ts create mode 100644 test/generated/next/bankAccounts/bankAccounts.models.ts create mode 100644 test/generated/next/bankAccounts/bankAccounts.queries.ts create mode 100644 test/generated/next/bookkeepingExport/bookkeepingExport.acl.ts create mode 100644 test/generated/next/bookkeepingExport/bookkeepingExport.api.ts create mode 100644 test/generated/next/bookkeepingExport/bookkeepingExport.configs.ts create mode 100644 test/generated/next/bookkeepingExport/bookkeepingExport.models.ts create mode 100644 test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts create mode 100644 test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts create mode 100644 test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts create mode 100644 test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts create mode 100644 test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts create mode 100644 test/generated/next/businessPartnerContacts/businessPartnerContacts.acl.ts create mode 100644 test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts create mode 100644 test/generated/next/businessPartnerContacts/businessPartnerContacts.configs.ts create mode 100644 test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts create mode 100644 test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts create mode 100644 test/generated/next/businessPartners/businessPartners.acl.ts create mode 100644 test/generated/next/businessPartners/businessPartners.api.ts create mode 100644 test/generated/next/businessPartners/businessPartners.configs.ts create mode 100644 test/generated/next/businessPartners/businessPartners.models.ts create mode 100644 test/generated/next/businessPartners/businessPartners.queries.ts create mode 100644 test/generated/next/cargoTypes/cargoTypes.acl.ts create mode 100644 test/generated/next/cargoTypes/cargoTypes.api.ts create mode 100644 test/generated/next/cargoTypes/cargoTypes.configs.ts create mode 100644 test/generated/next/cargoTypes/cargoTypes.models.ts create mode 100644 test/generated/next/cargoTypes/cargoTypes.queries.ts create mode 100644 test/generated/next/chargeTypes/chargeTypes.acl.ts create mode 100644 test/generated/next/chargeTypes/chargeTypes.api.ts create mode 100644 test/generated/next/chargeTypes/chargeTypes.configs.ts create mode 100644 test/generated/next/chargeTypes/chargeTypes.models.ts create mode 100644 test/generated/next/chargeTypes/chargeTypes.queries.ts create mode 100644 test/generated/next/checklistItems/checklistItems.acl.ts create mode 100644 test/generated/next/checklistItems/checklistItems.api.ts create mode 100644 test/generated/next/checklistItems/checklistItems.configs.ts create mode 100644 test/generated/next/checklistItems/checklistItems.models.ts create mode 100644 test/generated/next/checklistItems/checklistItems.queries.ts create mode 100644 test/generated/next/checklistTemplates/checklistTemplates.acl.ts create mode 100644 test/generated/next/checklistTemplates/checklistTemplates.api.ts create mode 100644 test/generated/next/checklistTemplates/checklistTemplates.configs.ts create mode 100644 test/generated/next/checklistTemplates/checklistTemplates.models.ts create mode 100644 test/generated/next/checklistTemplates/checklistTemplates.queries.ts create mode 100644 test/generated/next/cities/cities.acl.ts create mode 100644 test/generated/next/cities/cities.api.ts create mode 100644 test/generated/next/cities/cities.configs.ts create mode 100644 test/generated/next/cities/cities.models.ts create mode 100644 test/generated/next/cities/cities.queries.ts create mode 100644 test/generated/next/common/common.models.ts create mode 100644 test/generated/next/containerYards/containerYards.acl.ts create mode 100644 test/generated/next/containerYards/containerYards.api.ts create mode 100644 test/generated/next/containerYards/containerYards.configs.ts create mode 100644 test/generated/next/containerYards/containerYards.models.ts create mode 100644 test/generated/next/containerYards/containerYards.queries.ts create mode 100644 test/generated/next/controlTowerAuth/controlTowerAuth.api.ts create mode 100644 test/generated/next/controlTowerAuth/controlTowerAuth.models.ts create mode 100644 test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts create mode 100644 test/generated/next/controlTowerBookings/controlTowerBookings.api.ts create mode 100644 test/generated/next/controlTowerBookings/controlTowerBookings.configs.ts create mode 100644 test/generated/next/controlTowerBookings/controlTowerBookings.models.ts create mode 100644 test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts create mode 100644 test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts create mode 100644 test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts create mode 100644 test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts create mode 100644 test/generated/next/controlTowerContainers/controlTowerContainers.api.ts create mode 100644 test/generated/next/controlTowerContainers/controlTowerContainers.configs.ts create mode 100644 test/generated/next/controlTowerContainers/controlTowerContainers.models.ts create mode 100644 test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts create mode 100644 test/generated/next/controlTowerMe/controlTowerMe.api.ts create mode 100644 test/generated/next/controlTowerMe/controlTowerMe.models.ts create mode 100644 test/generated/next/controlTowerMe/controlTowerMe.queries.ts create mode 100644 test/generated/next/controlTowerPackages/controlTowerPackages.api.ts create mode 100644 test/generated/next/controlTowerPackages/controlTowerPackages.configs.ts create mode 100644 test/generated/next/controlTowerPackages/controlTowerPackages.models.ts create mode 100644 test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts create mode 100644 test/generated/next/controlTowerSearch/controlTowerSearch.api.ts create mode 100644 test/generated/next/controlTowerSearch/controlTowerSearch.models.ts create mode 100644 test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts create mode 100644 test/generated/next/countries/countries.acl.ts create mode 100644 test/generated/next/countries/countries.api.ts create mode 100644 test/generated/next/countries/countries.configs.ts create mode 100644 test/generated/next/countries/countries.models.ts create mode 100644 test/generated/next/countries/countries.queries.ts create mode 100644 test/generated/next/currencies/currencies.acl.ts create mode 100644 test/generated/next/currencies/currencies.api.ts create mode 100644 test/generated/next/currencies/currencies.configs.ts create mode 100644 test/generated/next/currencies/currencies.models.ts create mode 100644 test/generated/next/currencies/currencies.queries.ts create mode 100644 test/generated/next/customerAccount/customerAccount.api.ts create mode 100644 test/generated/next/customerAccount/customerAccount.models.ts create mode 100644 test/generated/next/customerAccount/customerAccount.queries.ts create mode 100644 test/generated/next/customers/customers.acl.ts create mode 100644 test/generated/next/customers/customers.api.ts create mode 100644 test/generated/next/customers/customers.configs.ts create mode 100644 test/generated/next/customers/customers.models.ts create mode 100644 test/generated/next/customers/customers.queries.ts create mode 100644 test/generated/next/depots/depots.acl.ts create mode 100644 test/generated/next/depots/depots.api.ts create mode 100644 test/generated/next/depots/depots.configs.ts create mode 100644 test/generated/next/depots/depots.models.ts create mode 100644 test/generated/next/depots/depots.queries.ts create mode 100644 test/generated/next/documentTemplates/documentTemplates.acl.ts create mode 100644 test/generated/next/documentTemplates/documentTemplates.api.ts create mode 100644 test/generated/next/documentTemplates/documentTemplates.configs.ts create mode 100644 test/generated/next/documentTemplates/documentTemplates.models.ts create mode 100644 test/generated/next/documentTemplates/documentTemplates.queries.ts create mode 100644 test/generated/next/dunningAccountStatement/dunningAccountStatement.acl.ts create mode 100644 test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts create mode 100644 test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts create mode 100644 test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts create mode 100644 test/generated/next/dunningLevels/dunningLevels.acl.ts create mode 100644 test/generated/next/dunningLevels/dunningLevels.api.ts create mode 100644 test/generated/next/dunningLevels/dunningLevels.configs.ts create mode 100644 test/generated/next/dunningLevels/dunningLevels.models.ts create mode 100644 test/generated/next/dunningLevels/dunningLevels.queries.ts create mode 100644 test/generated/next/dunningManagement/dunningManagement.acl.ts create mode 100644 test/generated/next/dunningManagement/dunningManagement.api.ts create mode 100644 test/generated/next/dunningManagement/dunningManagement.configs.ts create mode 100644 test/generated/next/dunningManagement/dunningManagement.models.ts create mode 100644 test/generated/next/dunningManagement/dunningManagement.queries.ts create mode 100644 test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts create mode 100644 test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts create mode 100644 test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts create mode 100644 test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts create mode 100644 test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts create mode 100644 test/generated/next/dunningSystems/dunningSystems.acl.ts create mode 100644 test/generated/next/dunningSystems/dunningSystems.api.ts create mode 100644 test/generated/next/dunningSystems/dunningSystems.configs.ts create mode 100644 test/generated/next/dunningSystems/dunningSystems.models.ts create mode 100644 test/generated/next/dunningSystems/dunningSystems.queries.ts create mode 100644 test/generated/next/employee/employee.acl.ts create mode 100644 test/generated/next/employee/employee.api.ts create mode 100644 test/generated/next/employee/employee.configs.ts create mode 100644 test/generated/next/employee/employee.models.ts create mode 100644 test/generated/next/employee/employee.queries.ts create mode 100644 test/generated/next/employeeAccount/employeeAccount.api.ts create mode 100644 test/generated/next/employeeAccount/employeeAccount.models.ts create mode 100644 test/generated/next/employeeAccount/employeeAccount.queries.ts create mode 100644 test/generated/next/employeePermissions/employeePermissions.acl.ts create mode 100644 test/generated/next/employeePermissions/employeePermissions.api.ts create mode 100644 test/generated/next/employeePermissions/employeePermissions.configs.ts create mode 100644 test/generated/next/employeePermissions/employeePermissions.models.ts create mode 100644 test/generated/next/employeePermissions/employeePermissions.queries.ts create mode 100644 test/generated/next/employeeProfile/employeeProfile.api.ts create mode 100644 test/generated/next/employeeProfile/employeeProfile.models.ts create mode 100644 test/generated/next/employeeProfile/employeeProfile.queries.ts create mode 100644 test/generated/next/employeeRoles/employeeRoles.acl.ts create mode 100644 test/generated/next/employeeRoles/employeeRoles.api.ts create mode 100644 test/generated/next/employeeRoles/employeeRoles.configs.ts create mode 100644 test/generated/next/employeeRoles/employeeRoles.models.ts create mode 100644 test/generated/next/employeeRoles/employeeRoles.queries.ts create mode 100644 test/generated/next/employeeSettings/employeeSettings.api.ts create mode 100644 test/generated/next/employeeSettings/employeeSettings.models.ts create mode 100644 test/generated/next/employeeSettings/employeeSettings.queries.ts create mode 100644 test/generated/next/employment/employment.acl.ts create mode 100644 test/generated/next/employment/employment.api.ts create mode 100644 test/generated/next/employment/employment.configs.ts create mode 100644 test/generated/next/employment/employment.models.ts create mode 100644 test/generated/next/employment/employment.queries.ts create mode 100644 test/generated/next/factoringExport/factoringExport.acl.ts create mode 100644 test/generated/next/factoringExport/factoringExport.api.ts create mode 100644 test/generated/next/factoringExport/factoringExport.models.ts create mode 100644 test/generated/next/factoringExport/factoringExport.queries.ts create mode 100644 test/generated/next/factoringMerge/factoringMerge.acl.ts create mode 100644 test/generated/next/factoringMerge/factoringMerge.api.ts create mode 100644 test/generated/next/factoringMerge/factoringMerge.models.ts create mode 100644 test/generated/next/factoringMerge/factoringMerge.queries.ts create mode 100644 test/generated/next/files/files.api.ts create mode 100644 test/generated/next/files/files.models.ts create mode 100644 test/generated/next/files/files.queries.ts create mode 100644 test/generated/next/folders/folders.api.ts create mode 100644 test/generated/next/folders/folders.models.ts create mode 100644 test/generated/next/folders/folders.queries.ts create mode 100644 test/generated/next/hsCodes/hsCodes.acl.ts create mode 100644 test/generated/next/hsCodes/hsCodes.api.ts create mode 100644 test/generated/next/hsCodes/hsCodes.configs.ts create mode 100644 test/generated/next/hsCodes/hsCodes.models.ts create mode 100644 test/generated/next/hsCodes/hsCodes.queries.ts create mode 100644 test/generated/next/integrationChannels/integrationChannels.acl.ts create mode 100644 test/generated/next/integrationChannels/integrationChannels.api.ts create mode 100644 test/generated/next/integrationChannels/integrationChannels.configs.ts create mode 100644 test/generated/next/integrationChannels/integrationChannels.models.ts create mode 100644 test/generated/next/integrationChannels/integrationChannels.queries.ts create mode 100644 test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts create mode 100644 test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts create mode 100644 test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts create mode 100644 test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts create mode 100644 test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts create mode 100644 test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts create mode 100644 test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts create mode 100644 test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts create mode 100644 test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts create mode 100644 test/generated/next/invoicePayments/invoicePayments.acl.ts create mode 100644 test/generated/next/invoicePayments/invoicePayments.api.ts create mode 100644 test/generated/next/invoicePayments/invoicePayments.configs.ts create mode 100644 test/generated/next/invoicePayments/invoicePayments.models.ts create mode 100644 test/generated/next/invoicePayments/invoicePayments.queries.ts create mode 100644 test/generated/next/invoices/invoices.acl.ts create mode 100644 test/generated/next/invoices/invoices.api.ts create mode 100644 test/generated/next/invoices/invoices.configs.ts create mode 100644 test/generated/next/invoices/invoices.models.ts create mode 100644 test/generated/next/invoices/invoices.queries.ts create mode 100644 test/generated/next/masterData/masterData.acl.ts create mode 100644 test/generated/next/masterData/masterData.api.ts create mode 100644 test/generated/next/masterData/masterData.configs.ts create mode 100644 test/generated/next/masterData/masterData.models.ts create mode 100644 test/generated/next/masterData/masterData.queries.ts create mode 100644 test/generated/next/masterDataImport/masterDataImport.acl.ts create mode 100644 test/generated/next/masterDataImport/masterDataImport.api.ts create mode 100644 test/generated/next/masterDataImport/masterDataImport.models.ts create mode 100644 test/generated/next/masterDataImport/masterDataImport.queries.ts create mode 100644 test/generated/next/offices/offices.acl.ts create mode 100644 test/generated/next/offices/offices.api.ts create mode 100644 test/generated/next/offices/offices.configs.ts create mode 100644 test/generated/next/offices/offices.models.ts create mode 100644 test/generated/next/offices/offices.queries.ts create mode 100644 test/generated/next/packageTypes/packageTypes.acl.ts create mode 100644 test/generated/next/packageTypes/packageTypes.api.ts create mode 100644 test/generated/next/packageTypes/packageTypes.configs.ts create mode 100644 test/generated/next/packageTypes/packageTypes.models.ts create mode 100644 test/generated/next/packageTypes/packageTypes.queries.ts create mode 100644 test/generated/next/partnerNetworks/partnerNetworks.acl.ts create mode 100644 test/generated/next/partnerNetworks/partnerNetworks.api.ts create mode 100644 test/generated/next/partnerNetworks/partnerNetworks.configs.ts create mode 100644 test/generated/next/partnerNetworks/partnerNetworks.models.ts create mode 100644 test/generated/next/partnerNetworks/partnerNetworks.queries.ts create mode 100644 test/generated/next/paymentConfirmations/paymentConfirmations.acl.ts create mode 100644 test/generated/next/paymentConfirmations/paymentConfirmations.api.ts create mode 100644 test/generated/next/paymentConfirmations/paymentConfirmations.configs.ts create mode 100644 test/generated/next/paymentConfirmations/paymentConfirmations.models.ts create mode 100644 test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts create mode 100644 test/generated/next/ports/ports.acl.ts create mode 100644 test/generated/next/ports/ports.api.ts create mode 100644 test/generated/next/ports/ports.configs.ts create mode 100644 test/generated/next/ports/ports.models.ts create mode 100644 test/generated/next/ports/ports.queries.ts create mode 100644 test/generated/next/positionAccount/positionAccount.acl.ts create mode 100644 test/generated/next/positionAccount/positionAccount.api.ts create mode 100644 test/generated/next/positionAccount/positionAccount.models.ts create mode 100644 test/generated/next/positionAccount/positionAccount.queries.ts create mode 100644 test/generated/next/positionAccountItems/positionAccountItems.acl.ts create mode 100644 test/generated/next/positionAccountItems/positionAccountItems.api.ts create mode 100644 test/generated/next/positionAccountItems/positionAccountItems.models.ts create mode 100644 test/generated/next/positionAccountItems/positionAccountItems.queries.ts create mode 100644 test/generated/next/positionCargo/positionCargo.acl.ts create mode 100644 test/generated/next/positionCargo/positionCargo.api.ts create mode 100644 test/generated/next/positionCargo/positionCargo.configs.ts create mode 100644 test/generated/next/positionCargo/positionCargo.models.ts create mode 100644 test/generated/next/positionCargo/positionCargo.queries.ts create mode 100644 test/generated/next/positionCargoPackage/positionCargoPackage.acl.ts create mode 100644 test/generated/next/positionCargoPackage/positionCargoPackage.api.ts create mode 100644 test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts create mode 100644 test/generated/next/positionChecklist/positionChecklist.acl.ts create mode 100644 test/generated/next/positionChecklist/positionChecklist.api.ts create mode 100644 test/generated/next/positionChecklist/positionChecklist.models.ts create mode 100644 test/generated/next/positionChecklist/positionChecklist.queries.ts create mode 100644 test/generated/next/positionInvolvedParties/positionInvolvedParties.acl.ts create mode 100644 test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts create mode 100644 test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts create mode 100644 test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts create mode 100644 test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts create mode 100644 test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts create mode 100644 test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts create mode 100644 test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts create mode 100644 test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts create mode 100644 test/generated/next/positionRoutes/positionRoutes.acl.ts create mode 100644 test/generated/next/positionRoutes/positionRoutes.api.ts create mode 100644 test/generated/next/positionRoutes/positionRoutes.queries.ts create mode 100644 test/generated/next/positions/positions.acl.ts create mode 100644 test/generated/next/positions/positions.api.ts create mode 100644 test/generated/next/positions/positions.configs.ts create mode 100644 test/generated/next/positions/positions.models.ts create mode 100644 test/generated/next/positions/positions.queries.ts create mode 100644 test/generated/next/projectLite/projectLite.acl.ts create mode 100644 test/generated/next/projectLite/projectLite.api.ts create mode 100644 test/generated/next/projectLite/projectLite.configs.ts create mode 100644 test/generated/next/projectLite/projectLite.models.ts create mode 100644 test/generated/next/projectLite/projectLite.queries.ts create mode 100644 test/generated/next/queryModules.ts create mode 100644 test/generated/next/quoteAccount/quoteAccount.acl.ts create mode 100644 test/generated/next/quoteAccount/quoteAccount.api.ts create mode 100644 test/generated/next/quoteAccount/quoteAccount.models.ts create mode 100644 test/generated/next/quoteAccount/quoteAccount.queries.ts create mode 100644 test/generated/next/quoteCargo/quoteCargo.acl.ts create mode 100644 test/generated/next/quoteCargo/quoteCargo.api.ts create mode 100644 test/generated/next/quoteCargo/quoteCargo.configs.ts create mode 100644 test/generated/next/quoteCargo/quoteCargo.models.ts create mode 100644 test/generated/next/quoteCargo/quoteCargo.queries.ts create mode 100644 test/generated/next/quoteCargoPackage/quoteCargoPackage.acl.ts create mode 100644 test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts create mode 100644 test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts create mode 100644 test/generated/next/quoteConversion/quoteConversion.acl.ts create mode 100644 test/generated/next/quoteConversion/quoteConversion.api.ts create mode 100644 test/generated/next/quoteConversion/quoteConversion.models.ts create mode 100644 test/generated/next/quoteConversion/quoteConversion.queries.ts create mode 100644 test/generated/next/quoteDocument/quoteDocument.acl.ts create mode 100644 test/generated/next/quoteDocument/quoteDocument.api.ts create mode 100644 test/generated/next/quoteDocument/quoteDocument.models.ts create mode 100644 test/generated/next/quoteDocument/quoteDocument.queries.ts create mode 100644 test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts create mode 100644 test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts create mode 100644 test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts create mode 100644 test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts create mode 100644 test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts create mode 100644 test/generated/next/quoteRoutes/quoteRoutes.acl.ts create mode 100644 test/generated/next/quoteRoutes/quoteRoutes.api.ts create mode 100644 test/generated/next/quoteRoutes/quoteRoutes.queries.ts create mode 100644 test/generated/next/quotes/quotes.acl.ts create mode 100644 test/generated/next/quotes/quotes.api.ts create mode 100644 test/generated/next/quotes/quotes.configs.ts create mode 100644 test/generated/next/quotes/quotes.models.ts create mode 100644 test/generated/next/quotes/quotes.queries.ts create mode 100644 test/generated/next/remarkTemplates/remarkTemplates.acl.ts create mode 100644 test/generated/next/remarkTemplates/remarkTemplates.api.ts create mode 100644 test/generated/next/remarkTemplates/remarkTemplates.configs.ts create mode 100644 test/generated/next/remarkTemplates/remarkTemplates.models.ts create mode 100644 test/generated/next/remarkTemplates/remarkTemplates.queries.ts create mode 100644 test/generated/next/roadQuotes/roadQuotes.acl.ts create mode 100644 test/generated/next/roadQuotes/roadQuotes.api.ts create mode 100644 test/generated/next/roadQuotes/roadQuotes.models.ts create mode 100644 test/generated/next/roadQuotes/roadQuotes.queries.ts create mode 100644 test/generated/next/seaPositions/seaPositions.acl.ts create mode 100644 test/generated/next/seaPositions/seaPositions.api.ts create mode 100644 test/generated/next/seaPositions/seaPositions.models.ts create mode 100644 test/generated/next/seaPositions/seaPositions.queries.ts create mode 100644 test/generated/next/seaQuotes/seaQuotes.acl.ts create mode 100644 test/generated/next/seaQuotes/seaQuotes.api.ts create mode 100644 test/generated/next/seaQuotes/seaQuotes.models.ts create mode 100644 test/generated/next/seaQuotes/seaQuotes.queries.ts create mode 100644 test/generated/next/shippingInstructions/shippingInstructions.acl.ts create mode 100644 test/generated/next/shippingInstructions/shippingInstructions.api.ts create mode 100644 test/generated/next/shippingInstructions/shippingInstructions.models.ts create mode 100644 test/generated/next/shippingInstructions/shippingInstructions.queries.ts create mode 100644 test/generated/next/terminals/terminals.acl.ts create mode 100644 test/generated/next/terminals/terminals.api.ts create mode 100644 test/generated/next/terminals/terminals.configs.ts create mode 100644 test/generated/next/terminals/terminals.models.ts create mode 100644 test/generated/next/terminals/terminals.queries.ts create mode 100644 test/generated/next/useCrossTabQueryInvalidation.ts create mode 100644 test/generated/next/useMutationEffects.ts create mode 100644 test/generated/next/userActivity/userActivity.api.ts create mode 100644 test/generated/next/userActivity/userActivity.models.ts create mode 100644 test/generated/next/userActivity/userActivity.queries.ts create mode 100644 test/generated/next/vatRules/vatRules.acl.ts create mode 100644 test/generated/next/vatRules/vatRules.api.ts create mode 100644 test/generated/next/vatRules/vatRules.configs.ts create mode 100644 test/generated/next/vatRules/vatRules.models.ts create mode 100644 test/generated/next/vatRules/vatRules.queries.ts create mode 100644 test/generated/next/warehouses/warehouses.acl.ts create mode 100644 test/generated/next/warehouses/warehouses.api.ts create mode 100644 test/generated/next/warehouses/warehouses.configs.ts create mode 100644 test/generated/next/warehouses/warehouses.models.ts create mode 100644 test/generated/next/warehouses/warehouses.queries.ts create mode 100644 test/generated/next/workingDocuments/workingDocuments.acl.ts create mode 100644 test/generated/next/workingDocuments/workingDocuments.api.ts create mode 100644 test/generated/next/workingDocuments/workingDocuments.configs.ts create mode 100644 test/generated/next/workingDocuments/workingDocuments.models.ts create mode 100644 test/generated/next/workingDocuments/workingDocuments.queries.ts create mode 100644 test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts create mode 100644 test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts create mode 100644 test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts create mode 100644 test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts create mode 100644 test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts create mode 100644 test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts create mode 100644 test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts create mode 100644 test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts create mode 100644 test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts create mode 100644 test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts create mode 100644 test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts create mode 100644 test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts create mode 100644 test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts create mode 100644 test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts create mode 100644 test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts create mode 100644 test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts create mode 100644 test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts create mode 100644 test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts create mode 100644 test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts create mode 100644 test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts create mode 100644 test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts create mode 100644 test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts create mode 100644 test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts create mode 100644 test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts create mode 100644 test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts create mode 100644 test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts create mode 100644 test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts create mode 100644 test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts create mode 100644 test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts create mode 100644 test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts create mode 100644 test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts create mode 100644 test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts create mode 100644 test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts create mode 100644 test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts create mode 100644 test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts create mode 100644 test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts create mode 100644 test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts create mode 100644 test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts create mode 100644 test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts create mode 100644 test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts create mode 100644 test/generated/next/zod.extended.ts diff --git a/.gitignore b/.gitignore index 18eb6eb..d6b77ec 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,9 @@ node_modules test/* !test/petstore.yaml !test/config.ts +!test/generated/ +!test/generated/.gitkeep +!test/generated/base/ +!test/generated/base/.gitkeep +!test/generated/next/ +!test/generated/next/.gitkeep diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 647b4c8..c99d415 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -1,4 +1,4 @@ { "$schema": "./node_modules/oxfmt/configuration_schema.json", - "ignorePatterns": ["**/*.hbs", "node_modules", ".yarn"] + "ignorePatterns": ["**/*.hbs", "node_modules", ".yarn", "test/generated/**"] } diff --git a/.oxlintrc.json b/.oxlintrc.json index 49679d0..3ace296 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -1,5 +1,6 @@ { "$schema": "node_modules/oxlint/configuration_schema.json", + "ignorePatterns": ["test/generated/**"], "plugins": ["eslint", "typescript", "unicorn", "import", "oxc", "promise", "vitest"], "categories": { "correctness": "off", diff --git a/openapi-codegen.config.mjs b/openapi-codegen.config.mjs new file mode 100644 index 0000000..b108e6e --- /dev/null +++ b/openapi-codegen.config.mjs @@ -0,0 +1,11 @@ +/** @type {import('./src/generators/types/config').OpenAPICodegenConfig} */ +const config = { + input: "http://127.0.0.1:4000/docs-json", + output: "./test/generated/next", + excludeTags: ["auth"], + replaceOptionalWithNullish: true, + builderConfigs: true, + infiniteQueries: true, +}; + +export default config; diff --git a/package.json b/package.json index 1ee6441..1eb3cdf 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,10 @@ "build:cli": "node ./esbuild.mjs && chmod +x ./dist/sh.js", "build": "yarn build:clean && yarn build:cli && yarn build:client", "start:dist": "node ./dist/sh.js", + "gen:base": "rm -rf ./test/generated/base && mkdir -p ./test/generated/base && yarn start generate --config ./test/config.mjs --output ./test/generated/base --no-prettier", + "gen:next": "rm -rf ./test/generated/next && mkdir -p ./test/generated/next && yarn start generate --config ./test/config.mjs --output ./test/generated/next --no-prettier", + "test:generated-eq": "vitest run ./src/generators/generated-output-eq.test.ts", + "gen:verify": "yarn gen:base && yarn gen:next && yarn test:generated-eq", "typecheck": "tsc --noEmit", "lint": "oxlint --type-aware --fix", "lint:check": "oxlint --type-aware", @@ -59,12 +63,13 @@ "format:check": "oxfmt --check", "check": "yarn typecheck && yarn lint && yarn test", "push": "yarn exec ./scripts/publish.sh", - "dev:generate": "rm -rf ./output && yarn start generate --config ./test/config.ts", - "dev:check": "yarn start check --config ./test/config.ts" + "dev:generate": "rm -rf ./output && yarn start generate --config ./test/config.mjs", + "dev:check": "yarn start check --config ./test/config.mjs" }, "dependencies": { "i18next": "^25.8.11", - "import-fresh": "^3.3.1" + "import-fresh": "^3.3.1", + "yargs": "^18.0.0" }, "devDependencies": { "@apidevtools/swagger-parser": "^10.1.0", @@ -93,7 +98,6 @@ "vite": "^7.3.1", "vite-plugin-dts": "^4.5.4", "vitest": "4.0.18", - "yargs": "^18.0.0", "zod": "^4.3.6" }, "peerDependencies": { diff --git a/povio-openapi-codegen-cli-2.0.8-rc.5.tgz b/povio-openapi-codegen-cli-2.0.8-rc.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6bfab59ba275d748c8e0ae9305eddcfa5ae8696c GIT binary patch literal 1494388 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%0AUnwij#iM^#D&Xd6-S8&+A^aSjo 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%0A+Ox^wVYY2u@uCRbN#q!)x!1KGC) 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�=!j+jMQDF|H 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

bLJhbcA)O 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 z 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%0DI`K8j`lw-@~97IIT< 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

?<5ZHy&fzW=K-iOk6Xp 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

Ch`{ZSf*H%p^_?YbqBB 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 hHUSVJp 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

? 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

-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�_S1zp6Qu|f^ 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%0A`Czmo46IRQcGKllDhc9vMh;NUeTyQp=FCqh>lqU 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

  • K!H9Ec;yf8|)Ul2qI97Ble{^CjFVY_#VT^!K?%9ot9d)4P8V&0$Fs8|!;N z;6V#_Z1W|YC$aP=&LK+E52<=6ct;Q<(U0_V!7sv}msODL1F{$ca>&!1aFj*2xlhMb zYA#Aw2R+S6N@LIHCSbnnlSs!93n6*CJ%4WYS-B5!L5l-=jDTnjFd5lE;ZgncAJ8^B zz!;2yaxU-BhQqrf@_`&|W|epFVJ`xOQNi-UXg(-%|04@TMdfk%igTOORIcoqQo66{ zN{aUghkH&>I)N?`sB|K#s;e_iS8$t7V- z3FMy%W0WzuT)oNUHL?CYGykj#a!Cg}I?QB5djiELjQ&Bd7@afv3tz50+-}A#eN1U3 zW;}eH(NsI>tmO<`W9na2VsVVxSEXOj=HH*Q`k~p}J^p~tZX;X(9+=IXwSu5DE2u%q zL+NzREDpmp3lcT~$sl1gF?a1NMoZ6c7P`+#@CQvGe`J(qw4fu2}HLaL9+ceyjWgyXgv?W*FN?rT2$*g!ImXgwbih*tmZ; z9LB>T6h%(q>0Q9EL%tdv;#eP_We127Sy$g13sKMAM*mJ=&9%KWmO4FK8YQ}k#~4VP zARU?cj7)8M3ID56G<;uGkk8GYP$H|@C9loxiLvI|91fo!Fu83t7VZ<8(h!Qk?YJt) z>zx}GSP?b1i`kYlvn}!D34*gSAm*?Xgx@CBh`4JR4poq|y;>^ou)=1R3tZ zL@*p)-6|&z%WCuVV=|932!iA$W%o;q69QFH5rl_yaA)<5ecU!{)TS(Fp6hHz+ zSw*EF#g}F#eRkc)h9dMV_c3S~x3}3E3AHl&+7{;EXQ#i?S}u+jgI53QR?z^ur^gJZ zM^y=rfTs3aP9Uwr1qGHfT}~5EY3xFArQtSEZQk^%UCsx(x~@h+WqV-#3Nm)j3oRX^ zvuR`FXb8xXxs<36UqJT>C0i`K=roU-!qc5 zO3DV&njwJhaTl8;D}VY0kn1DW5EoI9Lp96c0ypQtkz%S__e4eR@YXxnlT71=9Avs1MRwI4$xaBr(mY{7_m-f->U+(7~^6_I8-GTdf@}(cj;0>1dA- zm%6HbY%*i8NXNo6U4eW{A)|eQ$9TeRY8vSjJX2>P9AK9@CARG{-5Wuw+>GADxOKnt zsO2A7usOSBMYg_JNbd!}taUjr&{@^Jbs1r7mUC0r*$tRzh~78rFdhzvNc(@9^K@ zk=QBdfN4KO5WDS`bbFvgyL={F672GJ6j9;1jS05~G%%GY1#6FJDC}#m%9_cC%3?SG z7%xeP4VG)hs$)s7vA|h7Pj3& zSye$wxVm2AHe}yb;XQ}aq$|-_GP476V1m??6>T9mGiYtUPsl1jV9r{$og7EARuQ`< z2e0*%JikpLdQhpwFz!|k@``s^1x#XtL^hhY*6ar8;7ur9yKxjE=yN^@Kw$*}=zwqJ zE*FJX320+^EVn~U3rT99V1ouCi6@@c8N_V2%l>j@%6<5x24pBGu#l{HK<-ixf-P9Sr&3Tl!+y1jPcr5Sduq<`&5e#vy$F^Gw8XCgI zG>S^504W9Vf$PII|BHQQ7(nWPG~Wyb5t^o>CZ2;mD!$PL&Gym%%$OqKhuUyK_=1bQ zs5b&s@Z-?(Xydy)!Sc9}CZFmO5b`$vieO*n4V zrP8p9mh(AY$07VD*BU?z5O6$dA=sTc?X&dX?N%fNpbNgOyHJTLxLvWS>K z0wX1OWq#p*AbV_;uNTqBY`I9j$~*CkB)1%G-@LQs_j==7oXKde!fR?7Iy7)n%!a)% zv=4Eub?YkIDVg#Nc@?JVd@a(RFSKL5c@qGYFfcn~T$&t^6b2;oHYA)(NEp0%=Xt!N zJ8ykJpK555(mD;yt}9_9!~L&_-q=ROYPlyiS}Jfq>C=pnbd)PXRCrfoICXp%7T0LI zRKSr4^$ofcXJ{}??A}h=!Mx12YW~E2U+TQfVZK`8(wxCJ@h4bWZdaCj;sRgaA5!oi z+inH!{I~!=e*&&m!3ntJL~myAfPUf4?47<=Pj=s`A%p4=>hOF^g_>xlB-;J%+Nn3P zuj)0ab5_4&l6W#9v7)H<1kvgmqvJ}UA#nS|aBNsr15A zy<&Do>(xK?+;@M^UjpQ{_<(v;gJXu^hG!8vC0;gSaZ*SUihPu(;eyAdQuB`o;txR? zmyZ_g?uxAnaop4#N6oDj&lAO9vfp)BkQv=0hY&q-1MNR*^=qy91A61gsW*+hDv@fu zc7<)r*r0l?RXms)dr%+799hH@)w^=T)AZJf zBYe*>AFv=hL~rk|tnwl(lBmb>C`?g;T5xZ-OLoInhSN7NOQ!QMV)p&*8Ro;pDIL6h zdoaYCV9ttH;Wa}^Kxnx0@S4q&ya=w28DBptg$Ajw6JwdXb3zBuL-iyQj&;TmfqJ&? zEtYo!$$hK$b6K169nVIYBsfQ`cD_&M_I?Mm0o}T|FPJx(ym?o-%aeX=Al!nW8U#WA zXuHj&2~2kGlQ3uTmHiQ>OdAFYS_2tj#cw$8D4cq<3=*8gtKj7KlB^8XvzmJ=n0ps9 zwC`gKr8NZN3MTYQ^68t^JC*+q@|VB`G9BH*EsFbG-Ff=zVCmku?;9xJImqq|z7eA2 zvl6YYtEzV^09m;q_AdvUyXr3=fL|TPQy-`2P_uj(%8$>!?l_OAoaf8ve) zTqX-L7)`0LawOCHN|4eqpw)HBYB}c6-dk9b*=p%#5?vA`)>+1Q7;L1SGa) zir67ja8%)DO1(%XlZcbWTbYAYT+rWtg=jSYZ$UVs+D2s@6wg)>V=;@b zmPI&!m3(C{lG}vSv@EW2q48*p`;10(nlW#@nkbQ{&fLB7e7W&ANWE#^q$pk2O&*e> zl+zM$9{A-FY+u6T=;Hb%!sc4H%A7Zi&S*(9!z&+sl`a;q!Y_2ZlBQm*z&$QQp*C$dihtL3jjcY0;IN7Pp#mO=zNu!)2WG!W2{Z#}eNGSr zf7ihnGK!+g*yobv1=rY4=jBbZXwbsrzMXLRH%wtgyh8~|#$1pUJayi?V;Sp-n!x?3 zEKr8Z$^}?caYJ5wNwVeQ7RhQphK1y8$a{Yg<^N^Wd$}x7E|pMZ;0TBoLT&hPND%O4 z=!b=kK{TiZ`dgvE5QU2vqe76jBS&;7A;QrCphVF=PruzhE(!nXZMWaOdHeRecW*~; zM-wvf54QNHC&UGj$|cXd`jn(8i+c(S#ctGg+ayO-0uK_p2!cXR^OEGfa6Vt&!QsXW zg2x{k9nu&;Y1#SLR6G`oo4P5nlJcKHTxDXPpJvO|8Z8@Q&jbx<%dk6u2aynX@fX1dtXA0v+}B>RyZSg?^6ele zwIKPnVXX{1e*Im&46Cnnx@oq&O>$O+Fu!|uAs&@hnYq|+$9ohr_ChG4w@;0{hcD$0 zs4MIIWQkeo%*+?5CqAY#jgrc{TR9vWAJo!2w0n?D?MS8^q+3_2^1|M+k64g%-5(Kj zbeRQZ(|3Y?`WaA?+P<(|7gtHBNBkEmfRqtCXS!v=oaeSX4;U`lp9xu z?RNDDRL71J=qZBznI|HXCnS%a$Q`cv+%-AL@wKjI!f77kfj^K2ydEchtc*h_=pT-2 zUf#}K7$TU*UHJMWM^M~-`dCbu#J~@bq82YVK3_Zuqfel}S;QPnz^l|{QSRXqRg)`s zg;`s{-GeT9xiEKRA&)7_$Pw>i6f3il1)A;rklMb!d*|P7Wu)WIr1BQn-Xid!G#O<7 znP8xeHk;IFf>NCp-J)m|$URF0y5=4&K@l1U1sb{p(13x$|8tldRf3UcBTxqvJ!#Iu z%pi$=ywI+5B&86@4WLGl>*0~l?^t019#9sUvzS_Snp|NsG#fqhWc=Hjvlf^PpQ$%q zgJm7XiZx!vqv0?Lf*@7Wb%pxxh~>G;r-anrZ#N{NJcu}kXcjOEvoK?MA-_sHG$)1G zREq!ui^*uNJJmTPtsR|)q^4B;zu8VK}>6%p|pG z=6!oh41>nU;9d6DFjW#|^Oa%QMDa(FPZ_dhJ7b7&auX7>~$jQNuY}C$O zg!^dZR|K<>+nq1iBI&waxsuA{bW-KKi?-OU(A=kk~Zza22GkH@NTzhIJ< z1hx_#A6rp8M7<3QvWkk;x6yR7RY8`|3OeAbruP0Z-FaUeGh&3`jy@%eSZ#<^L0%j) za0k{7!)E3`d1l77Nu+;7@qgd~{3qlyl}vD)EK8+`vO;g4@N!UY=RRu42Llc;fT6&Z zK?EoUVY4m?A}e^xy*m+1mb`yNCJwlOStF4F*XE4Igkv#CJTEYcpKDFmDF}&opujpE zB{q*eZ{lTeDv-kgdmVHoncW z_3u^=@sLMKY4!Z(L_E@)X8R~l#k?fu%ZzV&+FxxfOB#3mHCHN zHC7Zx5C%UhZ*G#s&2T6z?VR*_nk`e76>AdG!Ta}!CO)7r?Zt_gAP3N(hBp}T-t+`# zVJZGpzM#V)ERhwsKI;~*XtLdsL`|*=Fog!(x3;k($RfpeeK^>p6+PI@go=t!uUFhu z&9Y~BXYNR#?N*RzJz9zz!MRM#st-Ku;uBlj@fODH75gFVPJT*_+3L^4U#h~~UsGdx z_$#`5PWjV{2R_KH6QC;q;sSOt{;c*{jc$8x>|r(3^;0hFm#PyzoQHWf4JJ zrTn-{^qyx0ApeveqRi0&f5!=@jOziz9{=(X}_p z$(n`{I!0;8Aq(YNjzCTOA!eEA%R2Zw}wl zBw%ljq-QueVvqisJxILoj@XZ|i-EZFF}q42GUV4}K2LHMEf=vRUHl9PB9uonkh8}G zEGV-_gh2!rAi+G(FBbE)axIlkW^6ZNs0OpzJ=P$?rQT0cccghBy@EUn#D4z!8j#2ZWO!pH@GX_P(I+=bZ zB6@roc|$Wc=h`~Ol;+<+fPC{gJsuguY}Mqe_~%?!J_@;Bd{wJOMYraIxW z(N$)b{Ohsq5l+I$kQ(v95#_{-P^e@*d~gJ1|LZXwM9ak&mK9e^iR5mU`ScNA?s6GJ zZw!YmU7L3%FgrL5+&!_uZ;#~MDXW0dIN;rq24Y|nz83f-52?taIx%+5W47NsX6^I1 zY?;8Ubpk7HC?tkTseFP3?cL|4EqTP&mH+!8KfFQb{U2msl0 z4JwP@BiIzuaN+%ThJm=Si-q&~vp6YoPCqeS=Hlr3#{mnXW8?CCa4a@6ttH0u5@~zL z_n;Z78Mm3nON4tEw@(~w82SoT{=w$+F=1$f{~$c`AHKl309N{=2MLJKWpVxg47}=X z_Fr$a|2o)26<|t$ID2rc7QnB3!W@g1Uq34X^82G8numD~D7`rn2Q4*2=TdSb{eRTG zd3)Q)u{Zkn&8MIcAHL|THciQsIL0EgQV=4Bqw>Ev54Nc>grm41!i9mmlJl-TXv^`fbe&{wAB{24adUB$SAK_^qk0S zRjeTv7CGAsMWoNNs(5Ku+=!WJwgCzbQM-^eFrn2jtD*G>q%VRzXbi%DVSoUs@eND4 z2cBC`JHEMLQ4B15R1a@uG$J2uvCQ8vSXAv-w&a-%_PxoBI;v`~6D!MJQEMlT9DAqj z^`D{vBm8oSQG#<&TxeC*VrVGM%ETIj^rh-;MpY;^a}UJ!*&`)jB$lWcvuI*0Qx`mF z>agOq)28o(&87`XBt@=GT3*%h&`As0CM|27v>2zYe$044-3mfmKtpZq4DxhgApyM> z2HYh>cjj;PsT=!yQ&LGU;%Sx#)7;&g_D0u1#(JkLLq|*}%h`*}mxOq(o9Pv2TMb4hxR#?oYPn`3tIdzZCNMD6;|So z=|?;P+)5a3deDc1@v}Gvk80!?BO6=Eoc&yk%v^vwHm0=4Q6d-m??UE^LXHQ;3 z+F8=>hYe093Z~@QtXC!BceI0wp{aGEDSM!iz^~{*MO5pR$tYC*P{7O$DN`uYTbK!uF|x(Y>v;M}M;)?! ztQ_6IoLNO)Pa(*<@OJ3+dQsqpAng$l)F9j(2W~(QKLgA68)`3-n=u!UB5Y`p&kAEm zZ;e;fyZ5fU1g`oNo>6Iu7zmtq-|6@J{ipwLD*YvYdIfL(GI!smN;2{y2@9~?fYPVT zXlGVUor(ASMX{Ryc*NDoTYW-bJz`Y&x-MY9H4K;0!{7vUMDo>=X3u0)ubhJ4w~X2#CspY;iE=5dfULOBu8=B6N=M zIeeu?;PL@_#}O_O@c1)W8-!FeM!>C*j3-@PtibHkam8{Jp`mPGPX)Wz0DS=$BEeW* zF=8QfyDS6ufQoJ30^B|5%Vb!^x6+V0W{Auow+G)BWd*|e4|uB^{jj|!BYh(XBS|Ve zwQZYWM{EWVT>H=6Ks+q~lnLm%2C;}Skw+R{tQ3{t=UI}KV4Yk6G0vODQ6CANui9?P zXQXO|V%6XX!h5(J!48;nwFGxFB&LVoTtmMkm>cvd?VB=^*0LaRbJ2=)X6l+}=lzR@ z-DuTFGqpfXit1ox##Zh2d3~qPi7|?iJ_;^x?c5pFmYV1C98XnNn~9m}MR=!I8DF}` zW-pf<%lTNCUzFU3O$K5`Q_q3a%yB3P?d%@YBLN>a!sB|R@KKKJ3(g${jpo#QAQVXcAGRyY)W$jO1+^VS9khmr6W`$sx2|pQ$3Jl=pU%MEDBgJATWAzMJ%LT zQqh&;>I5Ndg{bEGFgN-`N2H`DfTl90`~LHvU%C5w>Jh-93{LLv-4lPQ_49~UbLX93 zl+x$!L_3W8jXk%u5DMgql<&iYbi3{XS9qV$6RiNRb03t&K;kdsNzPI@Ir)1H=ZZ4Z-RL zI{b?e!9sQ!5K{qF7?AXp(8#>vrT%W_&)>OZFzd1DZNUoWs>m}bRq^iPl2AVWDl`do zkLZcyg7&rGizj#|#Yo(3^&VCA?w2x*^Vm;o0C997K#;YE;aTztpt)%mDao38p`q|n*tZhB6WMiy)ydOb)XhY6I#Dh1eSS7V$q%P@Me}TTrvS>i?-V7X!>Dy0dIU!0?mPX=5_`}g+> zc)qi*NaPow2K%INztCH8{NDTH-h+a_9?@Ig#(RCtFL^Z@2+n)W3t6@wGw8re3tT7J zikXQr7|EC@)(MPRHG}U3Az(~&VsSGusH6Lm3>d@M7ZnOLqaSoad4^q!8QD6scI2$3 zBWGGiDnj-F3E6ujWC&%f7H=OOq+fP9YduoIhwV`pK4{9>v~e;tfOP059Hx|3xSp)c z-48(QZ-QCHYA9NNe96_U7M<#=M-6p>?8yNAn-wgnh?XD#<3UqU?_{VSUr{a;p2q+* zFFqBvvYI1185Y&c8q^kKk+$l2RUjp$TTgKedy3N)W1=$Qp=V0qO>mr@TzAC&%N zpdH?l;iN1H%Bn-Fsmxt=i+XW+BHOMAeZ)70GW^R9vKMVws2*!Rm~x<+d~5RWuS~O} z>!)tD$r;r}3sNGZCBqpI@&?%T*H5VvX(9#Na}wAzT?O_7Sgly1MMId>v>7BwnZF}! zqx&x9=L}0lvb`g91L!U1w`R-n?YFd?-|8*vf)sn}*EQAO53jzZ^=q++y!C^MA2%9@ zw|aWZ{By^GS>aII*US-C-p$;02t$WDV2JTJ;gTv8U{wy|-1LHb;fvfxIv8c3S*`jm zgJM*w)a>zPF_}O+Q&1d7D)=I(5EWpI%9V*^tpac*g_Ppzie-?wnRdl;mZsY5ft3!h z6zUIcf)FJoG0tc`> zWw(A`>gKNm%>WCo1F(BOyG~hlolGMCFMa9p!$ESDU%e~Lou!{Gn8M^mCd~jjW3?0@ zvEDyfX~4e<;DzXfWwT_O0irP&7h)9-p%%*Ru~ zRv*ky_QI-kF5j?@Zn?J)%ji zdo5_edIvvEle;Pixt=0jj#}7Bjvcfz1tZH5W#AoTe9%Q=WaTz3B;e0g>Y`!u zR;?-o@3PblP*ua3fRmn~(trvmSxcD*srtTC#AJJ$+E%&^D_LJq6~Um}{pY1U1+XGC#+|>bsDKw1 zKP8ZG1xw=<8b%G*7@26oUQx#v1|M*}2Yh^yy?c71wTE1qELQns;$}0qKoPW<5s1C> z+-`Snn@m$ap+7F^*q@F99H`wG^91vJCtwO2`c~e(v{8 z+txAV``lYR9+y-=*Lslzu~lk0(wJctfp-mMtTv!SsJ5>n4q(iI@cyW+`A2OE+z|>= z`fI1AWi}i_**un(`4R{>&ZULmG(kfxs8E{M5$Zq=a1^PO7dWZ*_9bvw#roB6USe>Z zq{(uAOZ7X%QlZ{=omG8ULwd=TV=~xevYJo+y}GbN)-(i)t!c!c-Y+&^Nn0VkWoXux z2ga>GlQ$VByp6g2N4*8TCPK}Z#U?eM871nq*Ip`wnh%pr8aOseSawJ4@k8vdpKony zhqP2obZz4XjcA4h&9P`NG}3&ceM|K_#8M&j9o}@CRczYZ*gB8zN7C|u{N_e>NL$s! ze4K9H5?=1LJ*(HmUncrZXNDQ%LhI@lfjh^%S9EUaQ_76oCc|Wwvjk{Zkz7S4Xk0d- zeCarZs(1P(GxT@J3=<^ak(vu$i2z7L2Jp=-?2u-q=%)Fu$S0@{0t&p*kuytJ2GYm_ z3;(+|gQH36ZRAOmfP4<}Y(#9e{0&m8r2(M@hujBH*(!UzVyz~JP&ga!(icgdGu*YC zUiNP-UIc4o$)M*r}=3fq?Z^{5$;956x}>$Xzq&)$d~tf0M3 zt$uLi)MenCw5OrV7@M#zPDdeO?UUAA_B*we)f&Px))3wQUX6)qvo)a)PFDgvtZBWZ z<&3u|AjoPB#P8LGK3UTcpMzFq=%)Q>t)RZ4SF2uYy^*TdwY^{>N3x}t{s zVUu>rW(xa)f&^MC-1Yi!wjnHk--d!uHZN$5Yb`2iPYods8$bp1!YK)v%uZ4RN_@c?8C@$~AXx>Hv-@w!o} z-cGY#&RQs=&&^&JBC}myUKx-Qo7L(!w6H_0HHr}!Ca)X5lJp{NqcQDkNxOmVH@CS% zR@5%7E$ZgGYg@G!tM7~!+h8spZrBEI#(&pK*~G$4vtw-1Vs^Yqo0ejhMr}6D*lOJ_ zd821zt&DveHSD0Vy>&L!o3y{K4$Ju0nr;JKt{Jti?MkCWlR($)WN{82(1elOGA^U) zc02QLU)3G5s(wOiR_kjUtmU_Cp}J)}X)%rewx)JSTfN5ds7&i0GL==S)kj1#=qD>J z`hSnccgX5CwAUyPxnjI+Yr$k5^8VySP`oo?NOCv6=1*?|h+?J}vxzc|3{KGecW*Wt!Z$FwAU@ihj37n2M@AdtaYUIj81FHgT}nN z{T;HV6@2}nx1c z*7J2YT<5BoaMy^|%HwqMO;pF`@YCiufp)i;#nY?o7!U_16PEIb)yAj$``H(sdA!IO zN22vp?T6?^3P^O&5Bx(9mFcJA57oV&GKPq88Sk0;DIhnC*(}8{Vp2x0GPfm3&f+Bl z&ysgqkUJjpz)x2sBD_X^ohErcVef-D*8$zVxb#yVL=DmJIMiP1H-<7yjSLVSO02Yq zB6O&w0^=i$5QXde(uVyB`vsvoYXG1oKq$`v=JCx$Aqc2ppX&QCtfleScI~5hmY8sk zdM!0PND0B9e-rO!1&62?$Ia^)$sq9&K$T(|NEMZp<5yz*a!39|zOe-lxK=|uZZNO1 zH62U^SH>-{AHa5)lNC`8%0W$$h5n6~hZw1zLq{yHaURtS@?+*{XOA}e;@P`Mi;SJd z(<{KOFeH**+G|UKGPO?{>_(D^vMaODI=%6%go(DFPpTg~uW?do8_n=m5*vCoNyfoM z#5@IfApJMx@gzrSGOnzvJsD=w{7f-eHG&25(yx;sg3Q+M=u`j!-DG(WNwV>YW_U^< zh7Eu~s2?=rK(RP7%83((brS=Y#8&%8<7t?3BmK$GEX5Er9)OZJzLo*huOvy^9eCDFnYMyesZH&<9S3KFUBNokz<8dAML2l^E<@1}cxIof;qt^rANk z(mW0((k9^}-0Eh?#H+*nU)v>RqM&z12Evm#+iw9q-(54sW!X+=5wWd0tDrl^Y`+2O zY)Wg_i5GXf@h!wc#27ASg$^l$D5^sZR}IwalCk&d2*%6O4yS#dUifZH!f@Cp+c7k+ z*%MfL0$@J?2@=q7@W4I^JResEpEYyzqN?2&GN7#qU>QhE%;Nsubwg`4#8%I6=!UlM zwNP;>EpYCN^Z3Hg%9f)HKK_D!q!{Z@L}26`7{)nvI6=0orEsvsT(TE$GKZ$UNd3}} zjdM_sK2(K%9C2sxBC^eSaM>g=ifV=n(V zGuz`$v{tmJ^)63ixDe3bQuI#yBt)5dYV`&EVYL$gAxuOj?JM909enR18uN+)eomRU z{MrSYn1ouO>B(aDR9ja{?8>;_m7Ia2UY;%vWqwa9OJ~6Xt%7)SC3RGOM{W9Y{qB|Y z*t{@|Fzr`KE@6kW4nOsHQH@nyokzw3y=pZ*i^bK=iyW#P7|wd9-^a}(%kxE1$J|RxdijNrQayaC%T0a~K4Fkh zHosM1bI##BWHTQ2b=u)CMi`dh5IW9wJU~P|5ka8ab%SmHqxYwe+dsaoKEwQHc@TaQ z=`tC=sey?_}g6 zAoS@pm}S=qgjgG3Xa5AXcL41GfC(QhxnUoK-udyZJ0s5QLx8+$FC< zeCu#rjLxHFEy_==RQacmR2Ag*7v7&f3Xs1(E&SXCzy-`Aa&-RBqh-|7s6_dHI_{(8 z&C_%B6`Ub2O45M{K)iv78&IAlr#wI`pr>G^k018GKYgU(_I61fxFB^al7a20uo^6k z;#dniA0F1BFV~icYi2T9{<73J+f8-_flUv=Kot2;S7JQEE6VqM5z9c51zm(wovGTk z6|o%*iXeh=bfSc1$X91vZQo)1vDJyMrb)^o{u_44?JmSR`Y53)c(?D;IAu7erSKD03fwcRG2b{r5cq*djENHA_HKbDHsV2~LTKqw zK{&ja>KuGVvm%6mB3{to+g9fu;QAjcKpfTYykcG_;^Ie_Ud1vgv{OYu4?$k*d$1 z5uRHG9ZD-y_(37^;sW}GiXt?P0L4aHm2=vU>wp2%sl@yIkho;9Y4{txGKX?%nra*k z0?EW}AeHKE0dXo}{f7sI7q`P8Hx1(5lt?7+$bY`I#fgvDcrauwuX^^;!ZfaTFzkda zK2NEv;D4X#GHUyp`J$@_wqouq=KO9d?fmEKra@Vu{66zwR`;)+2%B30p9v#n#cXg) zxYPPU(w^8VMh2gidM)-@u~hrjM+%9V;7YHPViLVbPOy5>TL`1-&iwXiIx#w9OckK` zTjN!^=DpIoI5XqzQX4m)`-sjkAR+|Ls)f1|JJLET9$!r8Gu+r;3lwDwZCjIG#5^uS zo}>_UnA>x5910?T9q@4I3Lw}8gy84?S^z=L9$4o{U44R4?L>{>%QeWWlt8R7*l>?S zI`-wp(I1bfEp!+D^OquE%L2lHB3wdIk2xZ8UR}8h2v<~U3Mh9>rIdA@+$o?l8RIOf zy%*dFf)cKS)j`XlJh*^PTl=+@S;i9UWu10tW?wHqGdzS!0W7wEWM)Vx(~ zPwZHH>CUT-qb-q@$}3dRqpu-ZcVuuR-Uqg;>5d-LIiBZ}%KMDli*X`x2mI(sNsrXC z*%&*9h}HI3v+HA=HpEceFei93$x}oI)mf7f`0DL9PF@Bl54|y!lK?U$Krzfm6n`sW zRuD6AG0DIP)e@7;b`fsv5a|}GW)xz`yM!u#Q3WSomdb;4Svi!d&N=e=sDw+-Mz2h{ zAZBIN>s71nD04S_>8hX;_S)rJdQDgBPj1Z^q<0m{^QEtXBhp;rn3*9G<_50F{4vTm zZCsZ~dRaquQ(MrZBvn6S;Fa608e> zvfCNr70&yF7XFvieVMx$z)*XLcDs=oG~D-nZNCjShOIqHlbb4;`-&0|adsn={YPlG zR(@q&+7`fzA_izq8O!yzD>pV`zc&RvRD^ox(q@TvD#>~k?EUX&5N8=fz{kB1?FD$a z_PEFY;1wyugV+dA&wtTaMX+bnXrrv#aTUwn5^X--EZTf*i8gN!G9R}FnJ41BwC<$` zoEp=UcoXd7FRA;L8$9!$Z%MQ~iI}`mlXxi`dn>E$t!%Tsm6>}hv+b=+?5)h$TUpEA z0-_?LPM#&N71XaQnyT%ub=kKw6*tea$Fj}#Shn#V%hv2MeNi+m3>CsiNi#!4`dXp) z;8B6%ZWm;9@FJC5?SYhWgzNaz0v@Ir7FGdFhYvvPrV;UGxOc|<=~~c`j>Rx5C{r1C zm0!9FA>0dAUAkd)&_sL3Q%(|T26SE8*y_=UE|UuIGI&^o*Nleb{{En#ftreVXm7)X zOyVK_%Lx8COX`8VNV%eG)}tqb*WWTXqp`Lg5G*pF;+e!!gb2@i#_uW>pIcfg>S#al zBJdBQ4tiM+{-KvaJYmt^Bo49@h>cX>7S4Ls@9-1>6YbC3<}2!Um(>qXPbo_;D{Fhe z00sU-_Crkw6V!w-U?vv%8*K``tFSFlVi(=tZ$(=1ihIruBMO$R-AjsG$o5EN>Gs$2;u+~V*U8^Xy`~LGg z5nq)H*pB&JzD-`_S|2pM`H_EYoospnGTNh6b56JV$k^6JvO?#xkMp%}&KFMlIEV1D zM)cSdln(4`B!th>7k}>V(_nqXIC^CKlnZ_cUueSM0KvzB&7pu{tq+S&Q9wOX|TXNA4GXCox7}60uA%*oj8|QRd!N zl95t|Ut}qyb$y3VOzj*{J4D4CXDOibrg| zyq}F+vG_-`wLGy@2PVAUue@9y(vTP`;|Qm1eqyTpFa?Mu>gi}%BA{eHOB?gwPFZjF#CResKozk#UtrG9V8 zSfV99O3K__a3l_1=Rq)yVj#pBUIBo9a;cYWjuVf>kI+mLGx547jTUf^^kyhYQ22a3v2HeB&ZXI|Yd)>t?l=RjeWm zF9DSH^ivGcPra=^<-t(6o$C38q3}MxD21Qe3VC_e_v$^I_R=`KmX5LFaje&z%1~>% zsN$RCxrRkI@r<8%xI+~5hTO>83*hPhTgK5@YQSoXpK_*zRJKUu1uu(VqSO-_tBivZ>pa*FU<%`9wC5lYz2jM-?12dV0k7yZz!tQ=M1 zndrxsR9I1`p48z4r88z7unu9a}-baJGjDNvXOxo1M^tVK@39_UchpT1_8M zIjhR5`P1f7t5OT*EXp1j`Lt3c@zPQ|8HR$(PVFcj=Y-oKO^TbT5MZZDrGj!1YmQ$+ zpuhty47isH$@~&PF1!#U;%)Cx9u3b6L5ZIRVb0R+of1UpB4bg@SQr`0(!M8k;k7jB zsf|8>?q|Y+z(~t9aceQ;r%_HN4xtco5%KX5!y~e3RC;0AjG6USy4_Z3RIFrGE96S; z*O%EhjlqNoL1|QGYKodfA_Ver6UNSv4T^q)$GTMOm&hsyHX#@Q|c zGE1zJ=X068#)wB1`Is3ee_Tq3efzGD=!}A~-FiL1Dr9f5Uv-6gHH|I0`)V`?g=c}R zRyw7v9qPjQg6sT2#>W8|W?9)NKAIMgbjx6DM{w=1ni=)Z0kLW8-RkM+Q?vpAX~0A5 z*h6K9+n^3HOkgd;JO58++t)g0S zM$iH>^*`@2cR@#VOhi85yi4L0-a%0|VW_^Ik$LcDSZ%h}>>8M<+3cZXLgeF<+cAhG z_G)a#tn>@*#amF7F|b>4M5I=M`Q+7C!W*N}ytm-C6Z2A-NiWD!K2?r0sg#&g=L|V{ z^wZQHB@xfi$&)LVU$eAx7w6ZVIL|szdC%c$kJ0-1cIRpr>Ae%Nr$_eTE;JjLHF>rd z%CJR@x8&YuMx!Mdk|P_5aAY-K47rq`8RAj8gqe}6lPO5m7n@M&pIax2#a9!>=xa7` z2o@}E>?8LJut2@bBrGz;IyUr^!h2$Yf6T@CANi3zqWD~oLq4y?A-`)crQ(p!Epf=@ z`b&$cyT>DVh|{rORG@LR8j%PXpV67|UXo1nSrwW6EP=ut?sqH<+M0lI;>EBOW=c{% z2aqhA0NS_s>Tg)Mm+(ZIHX^T!4oZHZ4WI0DB( z-S`?R1xbHtZ%2Cmm_}Ny)>)d*yBi02l=p<8T}mz0FMvCn(PlQZR77ppEt{_{o$B0}hLn&cQn1&so*xEInXs1qer zTS3hcdCeid1i7X8(b`+w09x4RKT7P<;4s$P*lWFt@wjTo*|asMAqTUl8}Ew1KpR;3 zf;)HMpBERJ=}6&=2kfftemKnv(EN@REJ~id0LL6*Xzy)sV1!A2eCZY>zQ4D+fj~3t zg|VIjvfC}lK;slT8N4mqkWSDFAFgfP0_6xysJJ zT+8qlH$2{kTCYM`djw#|A5he6*ok1byH)h!>|Hv$4yIsVu$6)JR&am66-YLz+uaI> zUp>s>(BdFr8@U$_cYZP8Z_gQjYSZPVsi=ULkr$LGnnBBp zDF<%Jv@bGFIgRKhc7p?ZcZ8r5-mEXvq?jT1=#5Kr@}wJIstu2ev*b@NLskT0W#G?1 zzT9wBAqAl37uuJCKZYax=S>nJm}KV7s6gS8_OGdOJ^DjiLQC107>}q9=yJ4)QEngt z=}y|QRg0HZGUdRK287h2P4Ws_S6g`zt!ufw87TF}C19EG4lKAw6yUusfI~ok2fFa3 zKt^se{#c#+U$dJBiyl#{O*G8#V)(gV*Y+z&cgsxQP2BqVOKvM(tmb}co zC~ym~y*lYt^Mmi~egAoI%WRvD?gNGa1WpA*8C{i!ZS`OM$k{N-yOlTrmU_U+$1w8f@#|k3mTdm;-m9u$ycm& zK9=6B1oS&CHmA}++lZQ(7gTt4SP?9}wIh9R?f!A{>?pH_Vf78%DQ#k)l#75;DgG(# zubt(FkK|R-+d9!ia#`A5UUiX*U2M@JRne>5P^|Z0n=@VPZqd24zyXxyDiMr!`&cd> zHzp5%KxJl6bqxq~F=yg2RQsgg483)rTOHun4^{O8H=hAny<_1TpF z$DEOab$oYuI1RblRR-7j<3^kIlIdiDL3)5sS;Z38#^2J_n1+J5gK@nwWcfGgc9jHt z`1id^9A4Qj)E5Cvr+Q}JYpbeE<13w8K;tUAS0G8+2Qc1Q0!K3sa`p$W;-+h6=~Ye5 zU1HGU8}=@Jk>ojx;BRg|_HXaJwOgntCx!dP7K|M)ockI_#13dIvqD9*?Y?XVj{Sjqhn?gcC3pbB%iklyj&ny)f zs%h^tOUICJflf-oD_GYs%zQ8p(jQ|-Ns3m%+GRZUUmk(Cul{6{$5*@dYH|wxQT-P7 zonec@yyjHORmm-xe+jkxM5)@v3u|1njh@*J)1#VobU-{lO8x69bLohiO9Ln!#3nh0 z5F3`R7Wv|smUCXj}nX~j2TV#2feEQ$ClxD~43;KyI zHW}~#YSPilkJ_n3W5Pl)PX*z6)=zBV`w$HPv~m&P7F6(|_xHsi*i?rC9|8Rl@X0u% z!5IBql|?G(1A;p8>s~F>9w%=ov*csLUd+1PS&uu*xz4Y@o;u`NUy9RLGT9jVZSME! zh~A;Zf8_V+oj(&}7>u6X4MyAB04_d5erYdvN8oDgbR06@-d2F*wbcIyQvITr2jkQD z3**^%U=T1{+wy(kIezSqw?~6Wh~m+VY;WR@0TWZ&w#G$m1OnzCmHI)%l2^m5< zz%sA=#KXlcsX-=g{mOh;u*1Ob!u}4cIz^OLx&H*m3?fE$8PD(U9fywnM^iWIv1y*h zETeOQ`P+-LH|%E2(yE8|_g9%a7hb^0>*S85AiQ=7oteJ{2*=2u1Af;e2=RppyzcPo z%58kCY^5|4)j6%@@<#MJ$o6<3-FZ*_eSa_Pthn%6nM;+G-nBL<&QJ>;(Cxb8Dw06; zozO86>@2_2g2_p(Ls73KrQ1b;TuUl!dokN!Cu(f;!)cx_Ua&lfC;veQbhBMa;VEW6 zk=FMa-+3wSyaiVVE`%8~YM18{v2H{$PQ+d5i^viS-*-5SgEQoL7c#Hd3s^wx1aDE9 zpsgo0#tHzfnbU}lXv^#OZa50uJ9==K%PmZ_eK(v9$KF_~UQn64Sn)Vo=#L{p8YKb6 zkMDU5e6{FlAK={T0g(A;cMgxs^^UfS##3^WZq8}|j_;Cg5FvfB(90!wUSN+ufQR=5A4W^w$(XJYt|}u38zNYR$H-Ku9F* z_$g!AJB|+Ef!rkFe}hxRK~XY^Ht=<*1=;<*#ng#zWi69QTF?b*fCe=L18-|b2Qe@( z5vWl%G>R6bpY_xT1IoP#^?1iTDi0>}v{w9s_Evs>AcR7CJ1S&b1U%S6os8Y1|390p zv-BD0Z2I5}1i7GYSIPLIUNDnWb5UnV{2yl=+N6wkOO3NsJ;c%eK`_=?b?5YJPw ztuyK65ab6%;Db1ux-{W8+1~h=Ff5__k2XunWcqAZ+)N%#U^O z0iBwey%5}AL)|I26Ez&2i;DZFGoL?U3l7DJ`>3$(qoTHt;><7|^uQ6r_(E^MIq4Oz zQ2i|s&NWaYyfPv?ms42Pno+Abve49;rSc3nd*1EVJ^<#G)9t!5^Rr*e21;TBV;d?m zK4=^S2z~V=zn0ag4CckC3_i3}21$M`E1@%Zu#3%6-x2|A38A^LZZB@n&w)UX@EJE* zcroQN^Pj=M+so)pFh5}#df*jP*m?C=VhAStT<6{NyOtb~I^HA2uidRT+B#Po{;sj% z?^+rC`app-9g*^)G@ZSgZqAW^enDr-*uV0q0aqeo_aq9UJt&nh%h{rS{+(&Dvd7GQY%!6MZF?S@wJ^=3Y*uB#La&k>ui7Su}6;OAS+VMDG+YHS&G`Zn)L=wnq2&TX(~)9dA@SqrQJvKjEVq zO)#=>iZarJ(^L?hkWeG9m|pt^**?j}KZ!O?q9#)`ayY7}GbXEFkTjKDnTl?h1R0ae zPevxC@4KsiD>-To#zRn+mlrPpA%5&g3S|~$#@P~6WNe;&{HAlwZmr5&~QO(Li-vsDJvNw$mt7P3K z4s0fQVPUzwr=&9{>@ol#?5~7l$-WtUrKLA9ze!qGJ|Jy|zDl`x!h(!jG5{N@glv5$Bi5c8NfgGT#hg(zU!bG3SzL9$hSht znY=~?3SXmHyu#ZkNhvvQBJ~5xPDjk<*UBh^jUUrWh(6(!={e@6FIKE?4A0Ti@QvHwP*vbJkqO<_nmOBsN%kAf^0Q~104 zXEd5n@?Z);th1O!(v?<3=DEah0N3oDhi~8r{bfaJ@l&t zk%UvJZ<{?hYfqsv158Cu4M;PG0w-4cBs{*5d>h{@*-&Ah$7U_nycTWqTG;2cu+3{> z%xks*p=fjoCsv{0tiT-CW`0?r2gA%mLL`LO)ert%fgZ>-^cSv8x&2p}Y7l3oSV_zOF}K{F+O0c$|gS(waN56mmTRt6@@ zArFi(CF%&$t4!V1&DE}VMEBsofnbGc5B?brp~6q`>;=m(j86QSRb~y@&^b+zzdT4F z3Po=lR9JaARJOh`TXY(on;nc`p8{ zlF6Xv2OSBQ=aSHPsDdIkS5Gs29~0uuxYde!@&0k_XzjsN7!Rgs-Gd1XHwJmSSk6|O zNs4jQj3nWS!BBacL@ayoVJJh8LbzjTsypt)(<~3BAy{CcQg%4@U<2acz_ZQU;?0cw zbFk=Z#Ximu*<#)X2COGrk#sY1A>o3L{pYXWK^Wl21w9tH3CAkjEpCuw|M@YRP63#p zK1GP`0?At=`8LbkV*;AMG`Z{CX{@xnkYQT4{f~dzi=vpD`gLM0ENN$d@5RCE#%8rXkUgyzrBqB=CjzdZU zhy;~?e`C{&?I38sw%d_XN?C`yL~`u`%>Vp2^5POS^xBQkb{8nQGsv4;?*e`c6g(Je zo5h{kAB}QXp$CGJ#w|Oyg&huvW+Jxan&q_*jzXxQF=Fn`O)!n%u`T~By`to5cXb0D z@T5v{p32;cLS-13?hr2N<%4D~BZHP{Yw1MRIzyzFU$ZGHqDqSYRZlf8{c91^)P-1S z&md!!m8^RjT_a>7U zT7jbK=eio#^jJSNt6MB>?5U7+RFp{dYa?MnN>sseRjx)z_mx~i%;U#c(>6CedY5t- zM>o}CeF=33K)+{iIVb4*TU&9r>$YGDZi17?b(-%m1f%O5&Sz)>+EGn(E|aw5f|Eb# zz^#oK-o1{q{p0Dow>@r69bYcor7GbWT?FI%s&Q{?D+U818V~E>Pbxl)SOsAqA%01F zhXoq%!Yq5IhcKn(DtATQ=z>c(TY`_L4bPbkGH#0>64tr0my(_|sqRU`-TH%&y^-Pl z{z$`#Kg2H6=)TD|s@pRf#zW<>bamyhjmrbDHOzKRx`qf`3lL_lK+Ja9!@}F-VRa~AkiO0RDmuC)lt|>G>IlTs>Y*$@GZyVsV@y zs;x_gGgbO^;U1CULj4}gzl1{f9CZ%8UXR1$!G9JPxKWObc#B7h*BO;WnA2HII*)0L z2CE7tc{C}m;%OV=bu$|>GB-h*pRx(VE2XBhnkYe0R{ANGoLK#ohF^V3i-!aKX>95h z?B7Vdu4m1I8zG<%XQgf91Y_c+9 z%}AT(vno(%ajjZ&v+HpM9@iEQUWi{yVF!ert)=WY60#H7) zd7QgsSxzCM(QOf@EYihkLh&3WB5JsJe=C7F2zMC-P8YgHmZFAa8nPD%v#?BsTdl0z z+uEVET%N5cSpM)5(lNK{ma5cCX|w+RhV=(gBZ#%=$@2qT=S0^YB5tnxSpue ziG7r%J0fQ%n4~O-79BQ^vphqYoS3E#;4PQVNAXZrRf~wk1mi?;7XcUuMq`(hmk%kR%MCS=xwcm*h!h(@=Vb+} zW*;~nCztroW9Wfc;8ogxHs$7WSObf=-~fb}82kAbJ4k7`aa#0fa7Ewv9Fo*FlCrhwd%`oEWiuX&&Dw z+lhM4r$i7$1BE{2lkYuR{`l6Ffj>~@UX25==0)HLI>OyM7d;Hpj8*w4;OYd@dbHcs ze(;Dn+6QTU<;MQrR10mzRr$HQH|>qCgN*e~SqA>j)Db;(=rUus-W(TBuFYI6454nO z*C@hOG^;ZY!kSu9Xv^(f1@*pbQt#si@jfbz<022;98Z)R==}s7ty$aB?F!tY6F)o@ zL`|&q7&NH~7+FN_cVuup)XPJ6@-%cmK3d|yO3#D8Sdx?5r!IKU)pBL${-2KUdsJ}tcB2f z+|d?VLPvzUGkwsr^@GNmzh%T!*u;2u(mJMWxfS(klx2;)N}d7rqL>CZU2}>R16(!?FKPiF zHi6GdMa(=cq{_NV%*>_TfN)J6RSCT_sxrggaD%Fh{AEdV_m>fMeiIwbA@rA#=ED@< zGFQY|OMTYUV02y-T$I@D9%ZgIg}Uc4%`Rl5XCc7>owSDf!l2d&tCKWCv5I?jrFTJE&+BbN=qE-sc_MZuM%-173ZUVP z2SYv+GWwN3nB+Ea;^QG=Niw)YvNCsn-etBf0K+MwW$C>EoqcmEvRjaNvWDWFe}~c5 z5h|I~ro$vG4s#$tt>RX_15l;bfzE4~9x@z5zeMnMc*`q{$9I?2yP6P>wU`2c>sto< z!IrGI|5;7|XXY7qeo_)EclGATHrN~@&vvFjg(^KE>)jN`dYtL)9cW<;El6!Eh)n7W zqBn5L8&Ho(W|)a6_4^KIiBtb9HnXUC(aqR(x7dESYZ!K*E?RD5BX@?6eQC>pfX6uHk9P*) zbH6_bA3x@DI5}B`5tKcWa7DAS^n>&8V!(XX%O)U4>(hvA7u)h@v^`V07gpx(9HtrV zBGJxEA4q`ILNiaQLIlP}h(LhScn{ETdz`NgXv}dFxD8-f(q+WWP$azZ@wAHig@$z8 zHl$_+(1arbv=5-^@LG*9_PFGs&Jc=uX2v&4xs`>&Wgf5VXqmeK5HfWQBbp_8or&H` zQ5ndS^~pM`lQwKLkvD=g-o($3cQl%04_OyiA?sp7B;c$2Nr4j&tUNc z-9D>bHU~QW=~NI@_xG&Z6*!>G_nl-6e27zh>oJ7lr#cPG+BgT znc!v&U{4(6x2>=xlhJUTje_t~aK(Pik}3Cmu~lQu=8ThM!hkJ+89RU(i?cdhDQ8(g z4)V*M{~dk5%Y2vl&s}!TdZUyfE8zDpd`JFpC?xUkI~TsAeLS4zamxJN3*X^?^3QML z$bWj_J8$Ah=8OFAFq8N&N;2Rt{J%gu{BMUcLfrSe?EZdP68h;d_uUWQ`{5+WGKk5} zeS4DB6}CQC$!RgpQ^tJx8iM@>=-PAib@}wY@R6KCFqLU|4fa=DiU)CQ{9XP74+IbG z={t^iBc%aYI$RkaRqeerNpfuB!=9=z%|Qd?pIfq4t%jfM8GwcEM9GvX#(8U}AvuDZH$RxZGKYfqA%;0L~DD8xQ7)XNse5czD&MWeL z;d5vnAvaMm-6g3PN_Vv$72Tf!-Jd;vOw0`DvkPGahA=jnl*JescT~e4|Uc!Rg+2M59OisDjp92I-`s5t9&e zoofZEovzjC`@7w42pqWCmXOR;hs!VMijMl3IBnI{J_DyRF#}`3Mq$CFONL_WI}Y*q z<|{cQrwid~oXeDD*A9W9gh9qSeXo9F>}WT^mhXQDfL^e9Gcw@89kASvXN>W?VWS$) zjrIPT@t=e7BY<#$BC0?dx;QroTsG_d6mY+5!LQnp#-m&I*zqJQ{ zS+^8B^`$7y0zxt@b}w(CoIsBZx}a<8?gz?*=siSW69|N z{pDWqK3arTk4$bercT;F-?@d*ThEfLRv&3rH*9tW-1J$k zg8TdQxupgLWS0Jy*@M!|C+jyQqGq0Y4NSPPs8toyz_&Y^3>?Y~gt|r+!C(B?7hm2M z5SQcZ8Yp5iiSF;?Dvbxu)6x(Cw_ZanmsD9AZ@JR=WeoKTHyVW0cvc9J);b|!4Kn1!}?6yK5Ri!0JsuCW|lxi0L}%1Uq*kxvj? zI1zG@((b{jVJEj&R}WS7?o!0ChfcXE*>>Z{JEUw8{jRUSO=esdkQgQ&wwh=aU@L0| z*a}MF$ZAf__6`_RXPU>Yq{8vKk#Fyk$I64ZxWu>@<_(eUv;2-RxrZ`k-IP8Fd*E? z4610`0Dd6%Zj&ykm6FMixjvK+%5BLkQ_*fx+fAHpNOc>6`BQO2@~->f?hk(vy<#!S zXVt|peDvC@iuKliqUvz7yphbqJk5CG^wxzMKAa6~o2CPbeMtw|2^P zzXstvPV zsx14KjTbd^y&|L=myCxd6ko@-xCiokp1 zILa3ikh=x%UmvqL&Z@4ZdW&Mjp=8Ry3K>@@cU_KPOe67YT+(ARw7jIPsu*BbfIKF_xEn*TQd@IRkU~5MI%VEOd+%WO186Y`4eB|oKL~~`7oyih)pz>r%~H7wI@8@8Cd$1 z(j79$hM6C2XI|z9S55b+wd_`HT$)%a=&ZQb^_n`BkGKc%S)DaU~hG9 z;tWx)9mTq7)s&LWvXKjuEK?8z^C;6ms3H8!?C z2%g1~mT9akmcEInZnpi)9+fqaL3|!u__9&4voZilpqU>U65bZ7Ck9z(`2?LE9ST^< zxQRu8S0RAI;wE_$%)Gc1F^Z~D#|qE_F><70M)BN!e^5LN2F3O^$ld&zTvP8#JM2Gu1>AypN<- zd>fcX?bfZ;1<5*(0mjVl)m6u3`06b%OBslDq=?^W_dMVt1vuK8jCJVNbLlrJMe34c zrBVseRx60C4Mi=#TS|ayJb>(amjm8caj$f{ZqU-}tm<`OR8I^(pt=)yxfYy`!0$^R zWPQZ?{1<-8wO++@KO6{^jT%BhV;azm_6aQ>`ymasx7SpNup!&=Ge4|)sTQ#iGqNjX zjCc>&@`aBJ%(+8M+>!XP8$K?$7HWgeM9;&4r5}A7V(m{=?a^kV!#LI|GMiRkg!O%= z#s$_uu*AkyU0W?ws6LAx?~qEZ7i{kgX3wI*Y`EYyr_D-7|msk=7Kfvk>!{GvU}_YG~V_z<8)ME4UBr^0J7O6&i5_>cu3yw(jC8k zG}7&Di5<;fju{^*=VzvW9i-2)0f{TMygIPy1#E}yLA*-YTt6KFjZ2~8HXpHog^9;c z>QdS|3>?a{OgqZ~NCM#tGEsG+Ql~Q8QtPbhFMyjDdBGG*k=}Ctbhnb-Qq!g2y{TM{Y=hU~S^_{)M>YYxXYZ7Xw2ZU+s+y zur4@Hk!^1eGHfS$CT}P0uJq&c=z?b3+cXmUMSxQE5s3U*NS0&2Vtd{2aYTUUrMh*> zSX!9$HN%wtVDxM(EmAJzrW4j8=Y9V8A7H2EVxZ9lfo_0DOM~{p2;2oE`m^)Jg$CfO zEJGge3`Sr$F?#$M+q6;eZg(d3MS*{!DA+o^ssR|*;@Nnxz@aP}RvKRV1X4jtizwBW=($pq5s(8P0(jr=__&;Qfr;;%Sy9$TU>0b$rzW6SCW8;e@ zhYGsiw875y4ZbPsDSbLVwc9&gDSBQXR#HA%+7CjPKxoeidhVx=@A>Gj7Lu3=-tY7S4Ot8zbHj(eYjNeo-n%(mtGm*XD%_?f2zEDQ#O>%IE~@vmHa zr=!EPAEhkFRW|`@5$wNRQYKS@ zN^t;zX)7{TU(#6>Jl;#2(d7BOV{luM;FP3f(_1(RqFHhHl=HjprtoSkY|Y5v0Z!3p z$9qvQ15XC8bIP5x!J`jQ6!Lt+qD~?qrMSa+03On9XZTtB!RMAN(hXb=ARwOmm7RS7 z=JcuNeF)}>;JF_3w24-o)yYavOsayfu80fnHKPVZ_26g$O?UT!w2u3_F`TfF#h+Q! zQNGs7sh@}tRl?FPd*!v9d3jFUcW8v)W79m1!L-@TYg&uFd*q2-BZ*1NDI}(sX)NFp z;;51=R`D$Z>YQFD#U$zgQ`gC_890eTH3+gHn&^mg;h_Ke291MfJ2xfaEd!DP_kJEi zplT!l?oxabYXl)Ir1z@_xdbM<_-K#0z?lJAKxE^kLTS{q6LO~rh0Ea)4%ZAHEG z@goo4r7h(6d4JfF^7yeQQL3%?VA?woLu=`E_e=SQkdpC{6+!q8 z^fkPIinOFQ#USDc$6i_1Cq?ok-^3KuCL*<7w9U=7yzOb7i~9|xd(@T(Wr79Lt>VEA!Xqbs5-4xwjH$soLC zmdgE|ejm+sCb!HFZy7CanZGOtdv0;d=#oS4A5Y~|!{bx(_7QdJNe-d>)2Mb+iZbt1 znR*6Q@|5Kw^Rdc&3a-^6{k>&pi2~yzS-_SFYEV!&yg>MhI_evw7kR>c=|&unO`ZqY z0QkkWX2J^Q@gxq?g;{RF%b95oq43^EJEBwW2O+Y*hwSw<$PPR=I0xhKSc-R=D07xV z8CwP@$k8)6Y&y^X_eYRl`;OTFE*r`N0J~oM0&8z3t3pMpfsUdqOiiK5vR6J_me8?WF@=f7o1*{G2SCFXz@5KPR) z{tYIqmgErnlA~(L34nzapBzGur|>YUZ<{N~R7-LQeGQTRc%(4logC>4b_MOX<$>Z- ze=PEU`ku?Aq)u7Nr$ln}#SmFZA)843u*Xw{-0gL8g|~r7{bdYY5#Jm_-(**^9HhL- zt{g%EM<05MfC>hSDt9nULwhcVP;=V;F``a2TUyWqYwcs0uGUOd1=^{+d8$f?V<-=% ziDh{TE;M>upS8AH^J>*4L4@&6r*U?z*K@7c)5z4Q01XxO@;A-$Ri3K2gtO*_PIjw8 zBBjcj{e;X@bUfV;!cSKzU>NHyUVc$!TeCWZYJpOCxdIxkzN##`y{^dmCRJH$*1Q5n zN93D=qko00gNEpNlES->XP7{n+GoflMJo!dTT-M9GdGi=ke&UItw1;0Ih0_6P^8&j z%6`n=r7zSy9YKT5R9@sHNpgF!nJ8w-0Yx(ty;stHxESkc;7iEiIl!Afp0HHFA4&T6 zMd5eUGE^lEuqAm5@2PS|a#e~iE*v?0ybAIK%Wln36$HY)7v2`JH0Q*U2fJ0tT8^sd zPZ{tuTA)$hs8+O=qbiD5r8&m4?^Q8970VRU9HK`e;E8tSea0g7L@1%lHccU;DEbPB z?22rv5)Qy{I%6Tidh4fZe^=FE%cZI?_XyZ53F7@om2YHGg*EsFz3m^Xw(B`mQHW>C zBGk)?QgKyEO9X8TJbU$=2L*Mij}FAcnnscbmi>RnsH1;}Y`8tEz&vLP2ufD`J$2eM zsT!o*ix+wX{WcODLLuf*kgNC$YN|UQJxPcD{hCe;a@Sc_TuPD@( z4V2afeLPFFi};5<>e!O8)E#%Il2;5II`t7U6qCt89V=SCu7NsRGl+t921SnM3olkr zb_hVl>!dJ&*_~CCFH^kSF&rNZ5E1P!+K%ug6yLN=d-cW+tu^u6iYBb(pcxtV?-;3& zdSu@2Qm2syFwcq34Bv9}K*{vxiIw?!nLwrn?*%%f73|Of?6bB!4rxf?<(mmug}k|% zTqY`?N0%?+G?%yM*$s7U$>_l$u$jP|A(^meP62>U?@%@vPp<&-(qB#zfeA`!yqvgh!M5qyC9va)Ti}SXhkM|XHP6kP(Zs&Kpx^CSQ=_)@qv{z(^4j6 zS$tsrM2_)GCdT(AlNegyXRQ75Cj?tSxnjEOzfN5@-=)z92GUfg04-FW#$oPYj-N8- zKlz`#c>1K5gB)0Zw)SR|AP4?{(AP(~|K!&vPp;@c;jjO3f4y7o(vo<;!q=G2J}^J} zpxUSVkn8{MJh`Gj;$QtIS2RCl{`r$%hX5+}Ur&!5`sCL?|NU3^yUYJRfWImJ{T)>8{D02HAm8O6u)YX3;5tP*aR~nisX_}_PZysd zM|cpY*y1%|&fXSmh(t`&~lu(qQBCLeekXiv6{H~k{Z*$o1lnZ0P; zlv~`xXrX{FE^mY06SEWJ7K z`-6jLY1Ny9dT-K0c7A{)>ij_Y*_`T|=x?>7AZONl@E-#3$R~>RFSZ@e*;W~M2%*=*OV!R3XZzA~PrTGNS|hm2X;O`y$`-w9=zwjg}-6h-%*M$v+aK6|6bG57>{z;~wG`+5%EcaoYPn_z* zkMQCDI_Lq~=%pjC&G#9Dd-L!o+l_hiLBB@w7#Ph*N4cNwx@2(pQ;)x@{hJR={0Sf9 z=`~Bixf?#qACQpU1)#wk1!-_|!mbYIGylo2OZWVLo|G5cqb zp922N)!y(E{q(4l2q6!3u2~Q{z@7ymb1o`iujwIkCzR8YNv}vJ-7fyaVXrcPmBtyC zB=6BtE)do)2|e|%dy>K4c3|UOquLfCxou-La?9fn|CCMu?{s>If{i(da#?Bsz?-IrAI>FrbrO#%qW1h(F~nfiYiGI1lGAQ`ay* zcWiu}B%dNaxVy=U`HR zk8?=|pH6xx@L{u8Y?1k&PI`F)DE;E zgV6efUZOK4KYqfKe*njH%lF?O4^sTccZ1W|9@ih3*n;sPr@0$$ z!NV0>@bCnD9*(EkjD`6dmR~24e|RDZv$hYfETsJ9QSSc$w;f%4VEz@7Ypkdj7FnL$ z+~4#0gX&yonndiMSr5wA@;TTK(dJck8K|ZHI}kpyoSZK{unYemM|qjMe}_F%@4I6k z(ckrb^N;l#`{hxtPyPQ-+q<{5jUh9|5s_MD`k{jsUB#c!VQ*k+K1RMkO zJq6Ij5Y<5$o#3JkI!{})L1*=%4LXf<@crBS$#5J&h`}rvbkN{WKT%w5urtImD%u-- z|3;6-!hS)Sb=vxKyva`R_r+v9>DB)CY*WwKE-irIpX)9jgfeqE^rFI5r!aBA)=7#5 zGfBhJyA!Va&3Euf z2fjOLRbxU7LKlpJfg(gGc?3G*Y&S4mydk~7VCDpGRIo&dw{X)kp51UoBnv=O&NGZ_b|U_`&X&OMf>Z59Pv&FBxw)ixs;ouD1W zz$px4_vCd>YL>R=X>n|Q-A#gsLf%5uiA2Ta@a8dgbqVZC^emAUfZ)Iz>!2@+pGE`O z{(tqYgXiJ|vu4~%v{56Q?g-YadX3VmHG}|C8~$S>_N=e zAj^i=V>e=n$6x~wVd{-Zah9iPXkvXPaf4__B_r{QlO`L`U(S-(e3NmL3c88cf+Bm1 zxe0^TeX4BHFgFq0JQ6ghpy>>PgqdLUaF)<|V1s@{3K4zo!7>8@Oj$dK)#eS6`2)T$ z>V;=IDJP`(!xCV{DYMxeQ#b$wH+*`{r4^b$<*$Uwhfic=4j*A;4!aF?5fe_Yv%oA6 z*ZC%PPj+&`Zao>7=CM;tgA{`NvpF$u;_5f^(}rE36;|~vzg{oD7FWuCD)}2#eX^5_ zGG85NvW`B}TCxz+MCR@#%w>6Cjy--k+)EQnQ){VN#M&%0f=fvddRu3jiEp)oQ~`&Y z7WKx3nnpx9T-jC^^L&?H0yg!w&6mG=9&0NKjq)rFxfKTTry!vs z+gjW6!=NpE9BQaSD^2_Qda}NrNOzI-bvN7y+_2TJ{a4?29B(7h-YfITba)LZ)o=)Y z0yky1nIEa-Zz0TkYRx-fm{Wmt>5dc=2gIX)c`B9u@)(u=lJUmDcw*x3X~u&#(&Www z55D5B*^cDL7G{ zct~XNFtahC~WA+lq8}cQF@;xhCX6*lS|)X#Mm3Ro>G+PC1+B?0wtsWq;At*bcWgl za74c`$3&OIVE4ONm@N^S!4v>3s-+&tK8|oxa@N=DF*yAgJSTF8S0vJb6u4rs4vto@ z)xlAjc7!K9IE2&Yk=6ipo;rKs3DO=tf!Is3lM{)0q?d!A=q1_7ffN|M-0bA;D?Bw1 zj&Ph}A_D9u$Tf6n2b@i4{T zvR~QPyH}kLNAF(0>vYxYgDJi=P%G_linam2=0!7iQ#j;}+9D^|;c<|5c(c^f;c?UM zY4cyb!L#pc=V$b1>)FoP-`6&W*u+frHS6#ioxfS_@Yo9UK^H&S?3PbmkJYW#NjDLD z9(ecPW2{Cx&>aBj4Ile8pu@GBS(eu>cx_Na|FhZ&`R*YRX_nrRTLe7vRTC0RZ# z&=fYxr)Fe7Fo_wX>RP3=lnHRAXa05pKDzDTskJE48NcPFeT#abVPe(^=A8Oy#v$z~5gS=NFul4BN$F ziF&U5KFcxY2nF?sbv)PDSMSZ98dH8XyW}otlf2+Xe{G%=YxAh+W3E4Q{wsUKmyh;` zH6H2Fjm#td_&KP)dJ!&gpnfeDTONeePdqj+JY4lyZ5pxcpQ9i)woC9iYKpB2So=AG z3`LqBdWV|OMx&v$0zKe~KyIV3N~Ye2+D`LVr@vQF&z;@8CvQWB8vVeK?|rQS_)+cAK+ zCVd6%5sHJ_jQ>b=6e`lh_F_=cz?6td{086k;%D1uEbYZ;sZr9Trc#p{Kig*iV2Rg+ z^rFM@j2H05##!KOI7Pg%fmxqHGKRbK8??DK(kn}i1888yCRKJ}&}CXGj19&+HTY}! z+MdV7BJJtHf)T_o&Mz{!h9pdNO_=&?^HhaTh71~O^SE&OevB#){MdTG5i8||RQua< zfy#)fTUcMOyQvMPKZtBP)F zCU2eny7lXGFvI$jemdosJNo4gUN7ArlQB$G0>omT?vIV^!>i_1VNV5Hky7%w&ym}2 zznPj_$#nkRt-3a(Ar&z_XX3Phd35+)iI{J414? z7v{KlI6`29v|u%0X88k9lwn?58(s;{Xn>(1`j|LZjK^Y9)u3$F^~fAqy9#I0hGsu7 z$t<+48Dgi*Ah(s)?i*?CF7BSjgJ0aO=D{!S8lT`Px}4ndz>6ILWL+5-+D zi0Lmf6jyL4AxQE%1fV(Z@BrTIX1r-gyl_jOQX*b{g(-T)Z->DPk?5CSVU}L?Rs;!~|b-&+kREUST|llimQa7oRN_`uWXtGP~7R#(ltswRuA3z#AJyzp$zykDIWl ziTUT;C~#%tG(Ino;iU`%UU3vBdRBBbtq}3n*CULu7kd&wS$%!IZWoAp-fAjDHERx@ z?X_Ws7(PhT$vwXUtqHVO%V6L2?Z|d&mIATjevH0t5B?SjQ#T!SW1iefwwe!kaMR&U zwUPON_}N4uQ)28-v2OMbg=%I4E|k zjNmi5Sah>19fSM)%TIqT!N61BS(Z4v{_2Ruk zj{EFd4gJ~}Iv?wSwPUX8w!&X1Cv7o zlOeDiYs30|($i0>a0}R&6yb765e_u*3IwRjW4N$RtWQelKmztB(#$6eEL5REW7Di$ z<-V=fabO2IwPXMkhL%_n6tyFWs2a@|{X#$sttnjr!D`(&RlpmwHo@B#JN_qNZLfm0 zCK_u1V^AOnMY&s;sCmKKv?gId`%PH`i~z~Sk#icvy%DZb{nV2(qeQ2uH#)OKpyLQEsFu(nQJC zJMVBDjXh$;B*E>1)S4sdzP3rXAltVc9$c5nc5vH~)}s$8UQDM?yq8WNxt2~FlWFiJ zZ4Aa&@Mk>9;g7&R_(=gzC({fb6!Z2aEgvXW2|TGE^0mRPe@P9&?@MZlJpjcp6;*_s zOAqkp++?Q@X2eeK9|hm=HZ=VW3m%(@Cto-a zmu=aA(++r~8zL}I?I#;>+QCm6fK$IhAlGQVh9mMFUV#~R zA@>0keNcUTFyxfa_hsn}I5O+rODvI;w$SDx5rMCh44neTSA6QudG@=Hl1fr2-+|Wt zk|M>~ADh(*hd!o~nvBM^=K5X`)ha zL;vr(>NlG1(%>sD9o5&SE<>&<-OILQ73@0m=Oj*lfQ5O*W3euG9Uef@fm)b@pIewT zQ92hGfmoAlc*Q$$4AISuwE_9DkVEK;IZTtRu&27&--uUCX5E$Flm-sfz!ak=-{V|M zMTP;6SDyc+Nnf6G<2JOq=hnRNK}1%ad0(bNc8w1CH5eB!kjCvxLBTjfbg}3@ZeU!c+uejl?(M=|2OcUPlE|mt6#HV1oKuscU=JV zC43_QedzE23ilMCdrt?H31XTcuGOxYMty9LT*GEDoGhjV_^ic0|L&L+09bNwBM`RT0*mQJ+yJP&# zxbJUwcmTyO)x5oYWZuw!(waJO)XVhT#WtAuwq&Z1Y(x!J8|@>?6AJdj_@y6H@>h)e zA=E~AbDcbU)-=8B8l@(h_T^&awG4lsZH8vbe$VJ9SoaG64_NSQ z5NI`LLlx^UJeDl&9BQ<@84OlHfzT9o7WFM}30s=Rg%I>f0db_g@lx|f&0uNYVZybp z3)`(QpaPt?z1QD17$ zVyde4wbJS9;kl6>Yt{XfRO>|*`x`PymDb1D`?^`rrt=cB^Z_AC9_9O}BP^?6=u{i> ztVVo8s-O`~PzT}-UUixCPV(QMp9inH&Ck!p?it3kcfPAF_v^%pTzX-O(v49?R0nm#m8#KjvtvZoAds$fC>?Tf=K3R4%$m}Ek=F$ zqeAK&?K&a`ZTW4MPvGVX9q6s4Nr0`7iU4I&{P_oH!RhD5M#WMs<2xYt(o90XUIqH+ z6PnaxF{$WzBF%+6Jb?1gYF0o0?5w7f$*r7HIm3xD!;!Jh7b&;qb{S_y3%2;K*!aoh zRz1iD|1Xdm;Iwf2BIW-fYG0(>#O%*v5#C|QY;yP*@BoV6sx^3P6OR~G7GG|0#MBaNDiU|Yh-j<$vn9272vjwFWXgLKAl4_ms2wXw4Q<+u-8&ol8b3E z4IfcRhb$Y2bN3w{K+&nfz0*gw_2cRUy>$^h*U}`c*pjCJP8;KS5kLpW!D)v#599{H zrf7eBQ80d4wLipm5+kqPlwXhvh#JCY?Kt?-;my~I5Qw+<@)L7;;PifNOw>I2hk#WGqkOhg|27HimFo?r1;^Dv~I zFsEKv9wj>VR9$-}w&fjw#p40RZ0A;e3 zSX1~$LdL)+eUx(b$=zW3q)+Y!Q~8PT#H;$s8qySbN~q*v9_{4?x2j*@44Aicjqueg z;J1oPH1R2$e#cgDhuHOea1A<`!Tq>M)Moe4?r?SF7UXN_S}rlp+&PoRIK7Cq&!87C zQQlPGWsGhnm<>|=j^Nm;2SHnisnS{o;)%%WK4cZ$Vh1zB1I2R_*4CagvTEUw`;5BI zOFWFbL$j^iye_162uJq$IdKT<>yf9ln-G!`WL4Lr$H;3y(#O~}V*ZqBmtIFp_E5iQ z`)5=O)h;Gi-)i^6Jekb$nv*AdOl7}VY!KS`yo;ANaGLSbAPNHck$Pbl@(&}VrCQ@F zr8ILtKW9+!JeEo+tE!&9m}1(Lrs4HOo~=c715k?7(xE0isE4AGq!}zMSx=Rv!P1Tt zR)aK&JR1>4cQ1$gJEcNcjO@?2a0qBOVr{KVixOcmM}QWyVElD6}i}*5;?hS>I!k8yaR?_C$;a+;t|g z1GA3&Af(1{Lz;_sV>K5~Ul1`<)@)3aL->$qUTK&(;|g*!J}1cVUY|vzY7Bp7fpJ{J zamBbKjy|#j-ahvVyvbVHb{18Ph$-ziD~MBK+#%sUv6PJU zAlQD4#0Vy`mQniVWN^o8lQFMB8^4sM%o_TKW3R}k-wdi*Paq)iW1WF0rzsh6yS2gi zs-~FGU!>(Re1G5JRReC92W;&&LM) zAfUoeULPC1MpCM@=j7m+y@qLl8F+k|k0eIGx2uRJ@zZo@8CUP%6d|J-KYLbtvDNep@uW)RFTX-j+IV3o zximlQ6&mZx=qS-#Pz&MYOT)3w?)eYv%h?uXg+1;i2}rhtIAI=n@nQk&m06T{6|0IU zi#FW3Aoh8l-_p}oQEjUuP=(6KEN$`pwfOZA+EdDG5z_u_hSxDk-TB- zl!>Y$HwoSF#9Cj1D_h1XoPyrg8P$+q+x9k8NrfKh#oF;0JavrE%Fb8#UD8YR2LY*4 zPEdD2;}VL5R~;UlK-eyAME%P2_^VFj00{v7(ZfyK-~+4kPod62js5~zROEZzw64#kKpTF!HFqH4v3))h|o41Pg661 zfRZcHa;$`qjUZOSsL~G09R(3Emuyrus#d6+^+(ECUzCkJ7J94)K?1aYvKuPCQpm*; z#*wL)6z_mfXobEj;seWKHuAIzx(!WAoBk>o*VjWi;%sumA*OltP~+Z+B=sNwiBCLf zpMLPvf7jKH`mkc=Vs)gW`J=e?OyO3MgJ}bEve^ZM&Ci!s|A1n_E;~MJ=kY2pbLCK8 zPkqIh*4O4CL|h=3`GXV8qy^>z!s*~ZM3Ok%$%EG?+_mNL53dZc?ssw#?@I;W7pQc& zlcR?>jA{VU*qXw#;eIEl-C5Q8LDy(JT-o?5YCObP2~$V+_kOiye;4*=T3)tY8XP1Lp%w#DtU0{{fg|DZBYsj8xer=Xz zmkGZaba{L*{WM5*$=gBJouxc`Im^2|UM>&hOdOBDjwknHRX9lR2j8+!;AJ1-7f_f_ zFu9N6*D}2g9#Yq1?{;$XXVLLg%zz>D!j5^KdT2UT-_l8Ba`(dy2I3d_esp&qOuRiP z#i%eeU2?CtV&4=lV^8vtL4a{n-8~V1o7G2P2Erh=cN#ak$9tWqF-R!{!~t&2@+=Tw z%ae0p!YJB@n4|bsM6|rkGe2R_6&QM9P?CDmAS9+{6qPcEBVE%-u!;njU-`HD$@D5S z;^ZO;ZKLz#8bZ*Y(W2HwWgi%+5P78>CV@FiOYi8tVPV9c8IWdlqBE6L&{`Q$DQ#Nh zJ@wEqJdwuWYVqsaMedF;29AZB1WO5DMu)mYL^L%m}$t~)qjK0D=e{mrd=*X0qV@WC^q9n`Xt0m3qtQg8ebb3p) z8+<~S3Mqoi+MJ3E*Cx-6h_LVLDUcM#9K51B`{uB_R$=uPv-(hZt#teRkc&R{FfesR52g0^%=YQ?)p2TC6sg2dbtIR6LlBpLZ&|@zHnD7* zQU)Ay35P-GO;Akw&kqf3e`zr}W}n+4yO&XfDfs@4UA}~^RdM9lGi-MI(%S9DCM(C> z@yb*kE_+Zn4pI4GTjR8gqfd-d9)u%nmp~c;JT;NI^HYWobfWq(J&~8NpRg&7 zM#|RO1ts8!oywdA6CP-0xfS{rH#@y0-op*6N>ggf^JDP?epl9Xp~eU}_|Wqclo3?m z;UEY^H3-%;;T7L|t;lV&3HSU72flg#L}a4fw^#_8yAoS5r>Mx~xyxN43k5II#xQm* z3Q(&DK`o!ocx`>1bTCk$^854|Wqc@o7Z8E!IR^)0VlWcRpO)aFHB+_9)v zcGOC!$PgZ{4?!wLoGQWTTgdRV;faBejcUsV*LQyeE6ZW)vxL$)31Fyy35`HTf(Brr zp6XlZ6+@xq3h^b?bvzq!-$Rle3{CKVv4+({G#0YfqCcRLON!bHYNWy}|t02GF7z+>;KV znXrSl%hi|x%@q4IgpZOU;%-L-jnYV>6OokFQIhOS?~@>a@1aL^&)tezY8jlKQ`;b6d!y!@Iep)F z^^5uL7kFuYxhdb8->5>HWvP{U7Gzp#$hAnGv6i$d&>{7V0BD%rlDH;7T^VRi3e~g% zmYDtCWCBQR0Tq8r_lc%(gi|TpOM^bWsoel(5T#%V?Z&b?H};xBz=Oood`hXJV^mVD zDIrK}0-Q?qz?w>k_BH}7#Pslq;mN0mKL}4g+aeKqZ6^=rSA%?jJ_@rf5jYG=FrZl4 ze#q@tROWb0q8ADjRu%IN1IwBwgUH5Xkvefa|)wl8BW_THn zFO$hMD~-{52cxCjEv4bggf5I%yyfzxa`RBHpak-@gXC?!fD+6XKe^?lHx%Q9jk3wu zegh@q#o;7des?&@#Opm?@#!8{Uk|2v#pi=5IO8{`hg?MoUsE9i_c3aBy!ABHi?>!| zUc6;yhRA|=3zBY&otd>KvvE#k5DKyLkWUAcj7XQsN1#>{d;BDk0Jk~dJndl>T-MQ3Xqy?zox7f!SPzJA$@vk8GRSn~vI#SU=;jhsNqOTK1 z!6{w^Zgp2eMh5~9c8bA^xMlQQ>Q4sZLI%cNgFWjZ)m>44n5ht!vbGJUq=rew4v5wO zhbH;nk3u`X3Y6vDi%WH6o!YWyVj@aW9sSKsct2Qbc=0S-P(kf|c^=EyiHatZ(^2`-7 zYqF5Qhu@H~dqv|~OK3EWcQEjIq~5}XIEYFtB(CX>PcJ6u0s3geeXy5WQ3F=Ek9Mhm zOUI=ob(yn#fE=4R^p~CCQZ5iKD?^6t$J-_-ZJX6dZ&IrS7x)Jo3U6J>=nQ5+>Ln^Z zAuKC4Hi!bAh#P20MHH*>K=9r1P}kD zjxg*EoQ6<0;=4)3l0}686{!Tc&!9f6zD;SU0d6W%>xZZD^FSSV(C^2Y;6y|r@X?(<) z11D2sm@B(=ayC};JumwHXC>kRu|**rz9mjf1V~VQsmkbsA(13v^7Iaa-rJqrZNrXy zgLM;6-S>YKABW)4uZ^-p==d}4Ox>~BDYQ6ObjD8$Hn#+YxKO^BEsMOQB=`>o+>+Hi zH^wqxi9jIsK=Unt?5(17PbP_pcLvG0)p*`nl8a%M0;AGg+A#O$7BTeWqF{3aZ4(-2UeB#s;NoJQ{%DT$L9tKXKfhY8#TVj*g!_|X>3DPLZv`>&6MUx8F5q)=kuin;SgjMR3}Th&%%HqA%7y z!@&?#Y=v_{>iO|vVeXMLk4?DDeV9S$W!17MWL25US_!n3(AVlLGd?De*+@a9R@Wr_ z7y~opMgNSM*a@@7LJTHrHEPZiyXI%GyFQ9@PjHB+VpG-#pD9n-hbQI}{qRUW(GT4Q z-02-mJD6aBu9QDOCi>f#OXX%>#+^Lahp>`gc5;%dP9Q5|=RcGvh$} z0(!jCiH1xqQ!NPHBi~1Jf#n%;a6&8Rj_(^xO1__$5A96Sh#+lBqMtO#1E{|3F&wey z`KkKju zKtE}^f>EV%H`^yIv9$Rx5h2@`ny(>Y+U&QdVcP7s z)tEN>twHV*#~ErH0<5MYUA*ztNYHE~hrwBFBM!EAua2sDgf(4n;Z!deHXx|b-H zPUP3DZ>_JtMG6oBLJjtpOie_;4nbWB(!fNswfhri#PZ_K?3>~O>V4# zJNE3*WV|(RlitVVW-vVZn?5(fkquBCdBVO9!2 zzp;RZiEt`b^o`QicTr<{{zQ%G`6C+BbEz^?`Co(cExIQFT_TibOC?w^;nPbVj<4F~ zH`hFu)FKnlke)RoCn8V&R&QyzZ7RyJq`_rQa#w2jV+gS;vjx_%fY=BLop- zk8Z>o@PJW4;E-Kb6d~$Ok=J(EMKKUJ=esd@LxpCBZI;mOZOe+1f{Gc|Os^7gczXp-jRPrp?W~Z>t zO!QR4&LiS>$cbu*o?3*b-OR6Zht}-nrfv- zMefG1($zbgrfS8mkN4@?`O67cT*yyxG-t-nJKrxQY-^>Bc$nr8S}u6;<%H53KzK0B zUrC(8`g)=tJUEzh_gs(WXd>5Jbt9)DF;y41x@}tB5LS1DK?`%bvBY@*X>30Qc3$vO zAV2pZL%XO+Jzg0Vwbs>Zh9;Vr@JB*>NS}bdvK9ojUx@Aa1#DvMT?E~FWGd5^+I0A0 zn^cRD6hGR`XtZ7Qw$A#Vd^cJ#7yyMZtj$6j!#un7Q}AU66^;%3Y1w$kQ`V~2yoNqh zu3X7$?kyJA+?@v8Q=< zKg=`bZ32;+*;$1hoys#!B!uXkZqEk`Al}@jrv{2|z+Y9XC(y zziZpx(_xn2RKhHvBbm~McxwrMv&;JSBTMdprJ3E@w)OE=dEwLaarhns4Pgg|d))!* zD6B4MBR;xras@Q{>pii&bWd3C$|dSS6}ZAJa(BWdosVw$DGE+3aj#>7NWL{;39KWbKyj4&AKsjXv8+{xI=F#9n0ATO27&m~QSujLD&uq)4l z2_;Sks?Q7K*2I|m(5LUlliYJdV+BXKP8DtyhUrv-q>jw74H=+!A7o=0zpTjriBwIuq5%O^4xsFt?>E~)h;m44av>6P4B*w1ue1S4!X}YtD`Obhnr>vO!xowFfwJKnH)7J(z zX|t1PsTZa(20O{>H1_cc%mKUWblX`K8F6}d*Fz7+SsG;$g6+PL6Q-Y;#~8i{v;y0JD(dhIiL$06Ne zES|j-l{@R}uKneN3vzj?c_ym>Bm@$SCY+VJtjVFO%v>J2 zKEukKpk;`;2nx~PpuO$) zui*tk1_)7A)?KP?Y~{DY-}v%Ss5j%^=)UuAX>VVw)JO@d3)1_{4k2$t#6T@o5yMKl zLuEWaL?Y+TZ!~Dg^155>t#X;@7w8X_(&eQ~_EQ(gT2~Iv!DU@B@C$PrN16%0BK8|> zAIPh?D9mU$1Q47(kf@?@Gq`m_w3~fOifPW zNb2!~ElCa8hPSr6&)brJN8*)bH+6~CvXKS#2YNU~-v>VM2-eW183bsFjvSe*H!~UU zpMf-Z6jHk4rr#)rXlOkTp`9IKxR1jMc$aA5%$(cY#jT0%kZW(eyPpu`Lz8q70*np$f{6S;&K4 zFaB+%A==wp(-3V{#n3xrW-D6B!A8czs!EDGJE&!);$9-Jw1Z)kz4(f5z?mY&--CPM@}% z8N}oV!VizY1CXyE3xhT$muglX7q`StISg#?{LpZBV{n9or9)zE-lmjX5GO#v?X)`k zIaIpa&!rC{?7g;EDBtG@W()S=;XZjS3Pz4*%3$mc&AoTOLOzrdo@r$o3-fy98XZ(g zv>VFRLZ#KF+Zn24s7`Am7r3F=(#d-4RHwY6=%jFr%c>MJ6GApy3Lj7U=f~1CJmq7@ zv!lFjPaUaVJw#0vDk9r!tc%Hd9~86ZfSuqB8)8@Cf-juQGn1!#uF2c z9N!9>j{yg~_4T^od1qtgM{J6EqcSRN!{wbsqH~Ewaf9Mu!ipzak|hEzLNSbZuwt?F z$pXt|%cWp@bP64qw{VJfDOnD!_@$@!@Jjg}yCcp{;r6q%$`Aq=-7d(_8=6IRG&;t( z(#wYUP+@KO%3OJrzMKky?3K1x+C}xoW#?&P-(_dD*mv1cz3kGg9fR^KkmcI20Ez(d zL^Y(Rmz~DV;Bq=K%M5`k*(QPN^f}2<;eH;xfgkULMTrs7X<48uuVPs<6w+xPq=+^M z2OS(E^vGo*w8n%7<6RQNPCa?<$uUz?U@f)1zE0nj-iiAix-t!t5{o<#oS(^8G7rOAUY*Rr*4Gndw9^8Mbko`a!eo*S47nVU z=@4w#xN$SN8phv-1;mI#%rAR(bU6> zgmbPb!LD?aF@h3FL(kDvP6XKCb*9tIv91YgQ3E0{LkD>dv{oQ@q~kHzDvYKOImtZoV9w0J zPK?1C?T)x=R}WT0KnC4;?$Xv19ZigmqEbJ3?i!0$o-47136kS+FyTZ(U<(SpbL;fE z;)~Hk+;~RBUK<8=ut-6icOaJ9`g;8o&JNm9gl$c8LCgV9NhS?J)mdU`fz2Cnc06Wl zLx`PWAR1baE1m8qd7dika2Pdh_TzCg(yNcBn0q{4-af};y?>6!uz>(?!I0Z@-X(74 z0LW13ydWx6K12>oB1C&*nc);3y-hrABU5g&xW>esH?tbt{6-Z*6Wm<`xKogkY3jR`kc8(w*Xn zq29aw-15MLJH~?9BoE@(;hh2cELuig`&wiNuf(*FF>Pp%t*_Tp;lNSBfntI)<;*^= z;j?tcgCJH)RfrU$f=a@Pp(CU`61==GyK!LhoLW2>ru?dwPikVX_E(5)(uc9y#|X85 zN#WC9CBh}!CG9?pW(Z%q;r8 zQr$Mym%h@qB8vo0v$i01q>cv1g>zLq!}ux4A9 zvid}aq{kHAKVxvXx?uskexwa(;qnS4Ynx3)ajV3+roHgYQ^K%`>tW&4PzW%C zMGPR^MV`R>sBrvRec-_QnImYE_@+944r z+vTMzq!I4!c{vOM%BuRZd`XvSY>}|!Z%H8%%2^av8L3}PV67z~qf{G$%3|0Pe#L5& zarzBYehkuda?h`Rq1D!{3Z;&`$L__-3&rrfs1%IAnxP{Uu7)QoaXM*d`O0@$hDs|V z6%@Yeua}(tf9bNaJb5}Oo7h0M%S&-UsgVNmN*N1ehqqWPLgV)+c*NPj@Rnya$AUvF ztBEE~Z7}7vDgSFWoC=2oweBkaz`Pp$Y;-GQV^J)@#)o;rrv{cyrW(nl*$pAvFQ^xj zE)H@lIk*+A%{4O5lb7O%oGYzdVk_m8Ex9xt&p>)L-Im3+X&c)n`Qf&~z*#i8vb#rj zjbt59iy&@_2*Jh{GCb*}R&kIg;dBa4)MN$Eiy&s_JUG>M@Tk(17#*X->mxV|T8s&I zNj_Hn1yo&lpkMPs;cVFjJz^nmj5673^lh9E9-!g0f~^h=$P%n$3@YeBq5@v|;aOp= z1reBQ9<)taH0@Ay)V6QUMq7>%GzBALJ>Asuzz#-U5n`!AiXdDzIj7gbH5btD@jIRd zvHrcW&CDixXH58`QNToTmn9rAtkH^A#OE0P5+^0r&)_C5Y-*uQNSe}1Ja=F2tFS57 zVdPXDUfAbLbK|_H(`S@ly&7hh)8Wl<42G(H%trauKFuzV)6oY4~A1V z*+u2D#YIejkUxNsn+3V6@7PtwYOupfbewM}Szp(@b8K?l%TDb=Kr-^G)`K81pJmhA zO_9)-h0P`QI3_2!Nclans2<3iExHA;E^7x-v;FK@JqWg%5VpLYx^b_4h9+j7t||vq zl;I14fbO4^hgc(<%%+!cJC%r^p!JK>!F7gZ_)9U2Gk$<6Bg>4mc;y*4KUm;;*ob z!BUNk&kD6vM(Ed=&a{mpPJfAWXRbe0Y8_`ZIv%XGb)S(*=TQyL?* zwTBx-w5A`#AmC>_ncfU?QC%(A&2X%K&&I>QW?a7-JlKQ38QQa97*Ssil%Wq3!P}+b z2T({wgri4PA(7|JW4HW0?oZs25Ouv4(e{MPiQb5xEfeLC6IG__Wt{P3Yv(-JYM%2y zLM~`a^PF#NczPTm@165A*4}_nxFe2#&N-O!f)Y4_%a1~4k5zqHh(-z(uErj6;{=j$ z>|uJeklQ`)<)xn2_CbN~>F)P(kv~@TE%)VOf#>-y|CWIlu6l2xDcl*G9jeY$2VRjZ zEd{6zF425DpAPQ$G_zu3tyxhwej=5^+J0`OQpj~&l0EeLkM5qPWr*%pYZ; zvxDdku8Ak<9Y3C?@HB?~kq*D}cUSOue$DgOvouA{oxV07hhs>Z4oN}`4a8rVg>VGD7@0x>)#eYlc@2e+03Q zIaxkq-r| zav9jYZ$+G#*wehG2!#mxmnGtpcn~iM^_J&{;N)8sPzkzAbc2PFq~`pPY))x5v>D~D z;i9rt&VnNq?=&@%|JvRpws>QM)sMw606djo2NE|KP`O*|FSv;iSv@>V-^QZgMZ6I} z|B!wY)^mGv%QO10q9*L3SK@4(1Mx8j5YsI|;6U2sc_NGe+&JiVVQxjnQWV=VGe_|G zt_rFW?@}ZKxd|P)r`4{EO-oAp(uzvYr$gM|U{RUfro-HI{^oeSt+Ng1Zw^d8^l-k^ zg+&O?cgf4?&3+zi{_W4r*4n0ViO{u7M>Pq219&N-gSq4Q?E+#(2$KV{ zNtzdEL_)h=V!Y9%sF^p;8x% z33wP zKdoskc>ix$P9E0BV}wK;7mz&WR0BlgLIlL_&$*#bsej+kg?Wr#pFMOPyq3O{;myVH zdNwH&`Vq9Nwz@HZDUbP-k1si1De=Oo2{g&z2K8n#g?paC7*(MnDljT}!5Uq3g}l}m zE3gePLQVy5^hGIZ-XjBc^~7tQt4FSRu28p(+OezO8qz4?A%`b<+4Ne>L)p0PdY1>E zPk@QK-Q__S;v-!hav3sdAc{`*^I#Wiy*v(v$aCEu@?e0!-cRUq=*^{wtGJ&Bd+^np zdt%u}$0aj4-bH?P7`qpE{I0LN5m^)6;UCYNkFkn$aQlWwj!U8KuXlN6=t58AG2>n1 z`pq1-gHu&GBfM*n66j4>Ouwl=>)yTCRERGq@Kv9=1?9D0T4KNXa`o4e4A z-M?r__TtHg(c5yDFHf~)l+-mO7uEgT>fdxND1eW#XT`97S@}lU!IWx9SAil}9x+^Z zX*RZ{fGag&dk7Q(1U7y@0b8m9AHX~b5blbTLUA?)>k3RdV%P(9m3!APc9)i1t~1z% zub7w>YbQ{qv3f$$@VC^kX?OJWW{rh-yiw)f@gFs=*0QP-oGo&)l-+^>(cpia4{+eH6M0Mo(?qhrmb&V7q0r`R@ALPn5T7yYL6#&HWYQMI)lKmU6q={$eX64?d)2~6RM2C zAl{~wp3cm0<>b&LE_T5F3?FZ&lS`guo<0XQ|NgfcRXXnO1(}En-@E9jtG1EZ%%E%7tt$SDO!`&aL`W8)s6etz5mMU0 zGh!++7jzKG&34Yw?tF<7cum~#lvIF%SsU0Kl4YxP2#8b|C?5>OQmv#7gbZM(@aBFw zois4BY(k_a2gDK5jZ`z6Ej{e&e2XG0+$fh`O0^q&+dE_RZRyE?_7b;b9bv@W^jwvW zn?e8Vw9IF zPcs^hKo`?g#|+MadQKy&pB!LCd=RH1KFDxf%M&T8*5F`A@$^zb{$ZlxZx}xIT_ZxR zGK7;k1{EER(Wc>IkbySM-2z$9P=t9B{S2iGlhrX#Z0@E2$Ly9Y|3$nTLmjImLkWWr zMbOw2AcMed8>S)yo+T? z&LSRw@P)+CbaL$ije)>p@+wS_P_t2e{cJ?ZdOwkdP*Jfd>-HJhH)`W=#0-%>6#2gb z+>m|(eSYu!qqfdl~^%m=`Ao6SBJb5p&lSU=fH!WbBtWpa@%6FqyugTobzNI^kXaq z?DbfJ!vq6NJMMH$%4zW}nvA(^8Ch5KQ;On-8avjO;dVV=w|%-;w4b({*XGe;u~pD6 z2;n9R2CUEJB6n{zvs!gtC%b%AmJ>pzxp6xC?E)E2Je5!O^HN+fWYsCSJ4>pTG=vou zIS0J*S^8gCW8`+}WkLVmj4&nY5 zZ^}JJ!9cFJ$`$-ls|7|4A;axQMT+XLQ19*C@mJFlG8Wd)5wGr6`RB}PAP$S zD|_0;WHw^A+s!O#y=Y6DqmOX(B5yoRfoVqpb1;IiRIX=b3Lv)tOR93Kv^w5T#}t_G zpzK!AihPg|O7e_z{V z7x>2QZ9UsL+wk1KEtV>ImhpH8XKJoIo<%$+@{LO@M|G9@oSafq5QLT8e}%maRuWdZ zo5Ei9t}EhFmR<5%ddn$S0_-j)*`7Ic{vveTd~9SSy`a@x034-%BSVPIX$OD5Nf9YAvK zY;5>K(WH3bBo8)^BeRu}2-O|xBn!1s$+aFvAoM!@Hs!}0T!IZr4I>cLFvMFe1%%6L zvs+fXoJ}!a4i>?UEd}~0ap;ADHoN6hb&%rK9fp{4OaUm9vix9lN7A;g9|&T12SAms^2Bz(KIFmO zA#Z*=q9yEH8hrfc7=n0pjW8rZ&97VDx=4O+uRq4p{CMyEx?5)w!uf5;cVmMN~E%SrDNwh}n=1G)irw zyMbVg&D=eL+1OX5=B!7DJUBY!%?D%FBQ@)P;jDj*o;K+pqt$c%F_L2yWBM2Y>}@xGdE`%QMLmptJYc|>s~kL9P*}x1$%}^*H<&$)cr0u{7>kp)WI0E z8Pwj9y@@J4hrlIlGRfskvpLUx_ag@Gl$m53=_3r5KDRQ4Na>BdwMNLLb&ndr>b&7& zsc)Rz@=~*`+zR-~q{<$~Jq<>doJ0GX4S@xMH`>@dtk zipDF$D7qrKVr4~T46WI|Ua7M)iw*2`k3i6)LgE>>jMz)PGqw~V$CnXu?C?_73JF6b zW}}M^H&WlCpo{7b%~(1k=AyFF6R{cPbK%)mGZVgKHY05^S<5j5O@$AXP`GoOAV&C@v@ z1~{4w-SJYCl^?o!rBjbb5tN|K;SD&amZn{n3xiNVZ6lD%hzA(p8rKgfn`>YU7OG^| z=r-0bud1*pUSD@dJg9yLPGqUrT6^S)Ee8O13195^yG5Us3IPgWUAd{~#8RMXE-~0f zAs)z}gh8~~%L|X~$!h{6%Q5n3}Ne5k=q<$C1&%Ben9J zna1_iO)}FYzPi1FsYx*>$bflivQEiMO;ofVuNN%|7$Ds?rsRDvLn zxVW9Mf?d+FA|lDcUA#bxnl^WZg+qakg}jJ|<3XBMZdvNqrCg(556L!Avv&@%i8jag z)k@CPRUX^OyEf$kZnDwU=Qn&L)MhF9#wH~BD#eYk3h#7tlWl;{P)M~yxs3uBeCid~ z17Vn8|11`f4j8G}tK^JnNA6RD8EB4Be1(0#*HxzbBc>}ON%m7okmJJhK(^K~#yle^ z2#zXfTO$ZT!*bNs{_ErxYctwMruSpJ`VD8QvLDdw*p5>o# zS_C75MnU!q&5m93;Iud4%83eEJwOI5K=x@yx6MH*GX*noIhu9R+YmpiTx5+JI25 z3x`iE!{@3aqrG%ww0m1;AkKr%Q(TrxLU>A6U9y!%mJTnuyX_fTQq$urS@!snf?U#b zw?HqVw4yq&@2Q77V8WNeek6uqR~3LK>1ia;UL*CxE=9>X_14!Bed3=uxluujo7vcw ziQz$pE?;QQT^B>DHrf_?3vvgNoB1a=2<*gbh9v?38F>mTSj)&f1xgaFngV_8^MV`CuLptRQb+!uc^-6?Ad^?=7`z{7@xyO403V}FZ8(#TN zlIORXzqvUb+&8X=c{010WqgWevEv*#vCYBg?wO!2lPNrH-VCywPdC%y#U@bCO^}Kk zqiiz%o5QX+L^i#Jjo~{G(e#<{!~si9ymT_uq%Pb|)WWgwaU|Vqh6c;i$?YT?q#h+E z@FjZbAb&lFE_2V!z=Cti-$Mqcl4gsrg}u3m(dSG#@D6wU8Ne*BMx27F3U>KfQLG5E zxLt^;ekZ2-&2Y-X6%i<3b@O1p?Qnj>2Lqa+VIbnzx@yP3jX2#_HV2M|HS_G@9ed|{d>_2 zjX;<4x1BHkt8OkKeJLRQIGnOkHKh1S*v*UJ9R&9d(4W6@&aCL2Lp9fuGF zRU49TVUSX1%kdak;T}p8*YP!)XB&1?QgDq~MxL+nYFU$1vffh{3; zBV2a&oW+8EojIO|x0dkW3(iU|$0=$!>M%|Z(>2QYZvuY!fW{9=FhfY zz*0fq&$iE~dC&?$n@u3L!|{w80WYD(e~Y_hqsI^~(eNI)O`VRo@wsA{lwrLawvq-c zV$c>=^N#1Awgkkw%=1MNtq^$lGz1z1k*b9l_O44Ij@})9`lprRMZ}<+7bb!59q*4{ zs|dtD6@f?s!bQr;h%>kP17T*Ppu^a@;J@-Wu}<+wfj&dIl_>z&z#g6KplZKibVuAz}bIO`3pRwCh`LxUv05 z&;}$4HxNhS#Uk9;MhORY`9?5eNE3WS%D4rc`B1{(ogxshN*_?>gnhrq2Uo-K^(miD zENlEdJA8sBRZ+0jjP%}#Ha5Jp7a=_B>&eDO)97Xo;~xyiS4Wetd@QbLKJ0QZ+GzaQ zX#KglIb#R(y!mItZTWw0F4nxw8GEe?t>Ob=@X>Nxeq-_H*!z3SZ3W`3k;uxVUc%p@ zsX+G7b(jvF54+s+(m)3b`~V<3+D2SfJSbN@fQp+HHD8x&z7{pXoN03F8ehQbHk`$R zel#2}4ID=&*h|#ec+kyh14u)%q_=g}gieULSGIi62RUvOmFZ`k<1v4@<(E0Xs$EU; zTE>x|2R|obU>tprsErNzuShv?Gr8lhCV50(*_p6xWRKD4sYRQ|m-0i?)|YTQ4nCCy ziTa7zMSMkFrYUNhxgtTwo^R2iEy(#;4!xN?3%o z@E2B-VwPP~mSSZk&v^`@g6yL!j3gSMXPS)pIPZ)vCs(LLFk@PlU3U=Cs-{G^;24v^ zq*u=WI?EFy5lOC$oE_E<_A%ZlIj0ks<3&LmUu)b91EAsT;g>p0!Xs6E#L5Qgl7?#2iA7tamFS~R zm_9;OP(*LaS@SoVQ0uhqdGGyUfU3HmE^$5DH)~uR$LmBOeY*0lEJ&qXz#NW|XrXX<;mpJaFUI zZ@>M+f4=2GU~y6CAkvFRv7H4`!(kvT!xINU{7Zru$q>9Im@m6_+;B1R??q4?)Ox_3 z6W-XnvJ+^0Lz2Ok({eV%Zy)$T0fDeGmSj^tLP{6dZui;JoV{0}J&YM3P@Xyst1-wt zV&v-<;)?IwXAV=J=ovK!k4xE$S#lQGFQi(ng%%Dt@_2ncCf!^s_Dj={lqXdXA+-YP z=rAViJxy5U3a%NR(sglusm2JSo#XC@+T~!3-p!bZYMMdduvCWA#;*jgF)H&K;zonR z)XQJaY&v$DX=6OR3X^d5cz#tl=m|1NJC}lbMc}w`hrFSv5`ur`33PRT?CYDltYC znIn>8(1EXU93t~#im_J4S}GaQ1oSaf0k#JXpJJk0$Q{tZ^Ap5}5$tI(q)LSNUUK8s zg3oLQ%LUys{8!F*9n!_5d^&)5SZ&QxUuAf+9gt@hLwGjkSaNFBYEh>hUDCipY^DZYaB9DE% zC%?T2)65CjXC1fA=IBJE=@DA)7P-5-;_mqKvIELoc^ZN0QjaY0;Qv@W$Mg(&m6F9` zUa)#%kSIy1AwrEf(Pa^9Ytb-PKN$%sK}_;Wn|Ov8|G*QF-tWh5EZG|eLe9{69Sd0x zA~!9`T|lZWu?h;HQEgu9{$BzFZ(HJT<1!gc!`$8S$kU`%ZU*@Cv}z1#c?_vN1`i{v zVP9>m%&S_E7ZOT z+Ck#ffBz$NJfW)b9nVA8Pc>^GU1hU49zNjJKDCL_#8CT_7~52-h9vL(1@HAp!!@$U zRo%X9V{_9{4UXi*VDKA@{F3BneCBvdvnWjqsJK~=8iR{$lFo7r`VCBYxLDLftJK3= zrtin@sR!0c2H>Z`sm|^NT655=JDdOg>ubkT5TEKBfMwmLgtetdm?$M@QmN#WpZv}I z#87p%P5tq#!Hk0W-nFl7B-y~gUACnd%PkeR7=8EiTdOXr(#R8`0}hKo^Su3{@=|1V{X^JoZ+8e`u(S0`uF^kznQh| zMx*v+_&3wsHqCALgg^a)fArx+ZM*SH4NW6wUuIu|z6lRi!w45NIcv<~AYCc*^ShyB zkpe3P*r{PKHYozhflV3)XOaA&S~?VSt|LDQw86Q+cK4`iohI=`TEva==e+?`*4Yb>pMoJNp&>#zWsb`wf2Mk&pMA z{TZ!!XMgWoTbsakkUe>4|J?@;YIV6l;hp{e@Rbw;yt9AwEjN7UysNRg7)}J%3YD3> zIf+4VdQ5Bl5%ZUP~K{{9#Y*%^v<-uW?mm$)al;5k#oGt~(%Eowqjv7DTETPri9 zKE!X;2V4gyv+i^`GZd2}#W97c+UVxGG4uylFkwa`)xKU@_~Af7Im_8a1)qeX%HylR zH7td=fLZ6AA?ow4`Uzltpvt4GXr11(A$ygSDYQ+9abq;f)0&3CWnFw<}#oZjEBohF`}Vr}pgjWq=K_owUYr^*9!eVsX5tgiz*H7NGXqH|Ekh}X5))DZay0p) z)&)of&Jwcdx%F&o-Nx>bV#aEGMm-DOgBow*-|?NO z0aqoI-y0yx#|ovZJ+5bZe-kw?omdgnIwI=dG9WqmeB^|*7r5}8D~{eX#nFD*`0)K@ z@!_xD5c@UidtM<1{*c&D@*^jK6Uku7C(V5&nEI6r;NLmMd|!7Z^L^bFZHy$GF#q-&~ojM3Uf125f>cU(VLs?V=7q`@kchBPQ!Et~BXD`y{-YGUS2SE(HE ziON(9WV1@WEM%=j#hf%(shfY2pp&p8qWKA-b`^s59f*=-$$xwH@9@O$P!{{&>#<1x ziO5-Zc*H~gPu~!G7qz&94z=IoFG{FQYy2XD0oi1{cROcFSdmqMJu}QEC6w_1BQDB} z@6!&o&$#bQOS%agh~g_Cp)u1hB++1~sD10IqXs0%7;5zrCD^cK+yu^iP9W(n1MHVU z!~!x$%W%w`n4!r8>J?@RFf7p27#0r|@0-@BL%H|oE)RbOQD3-1U&ydpR&Ap)a;71< zz+>bqsa%DaZz80`8P*NVtAwll#1KCX354f{m5|9b418Gxu|Bc9*nK^07`tR1kO4$E zR=iLUR`+g3o!gvd8E6N@pJ`ub!n)^F5kqE#4dVzvAqZsO5s4&jTso;#-614`q!k8u z47G@q8vxJjU4t(o^JT9a7LV}7pjM+7l8TRR@s$gVmaHuJ`$naPhyj&2473)!a7C~<9xf8I+}OtyAtGDI%)hZJA&F~Y#V_jOLosVBe5hu) zf1>5VR!P8_-Z*z*MbOo-{=~XsS#Jc18M|%>l*7-*%B4Rf6+fr|>SyHw#&-epeZeQ3 zeRff)`9bA^Q~w3;o>@1nfiswphVj;!L-V-oPFTUGV$%79!}D+C4(33LDyx0xcs#2^ z#5|kA&-jI)@kB{i{!B?@4v0g56o~;Ayl@4y8_ocBleW(y>(d)z zKi}L`kl~r~1mT4kzKxoc9+K57xqvN7tsb?!!0OGcs%yESb?aIuGwWku4X4)J!RydV zj2y?MvpxkjQ@21cz6^I7rNW&?G8ErB3hhsU%>dT$2QRtR_!QjVZ(6+&B5!MxRIQU# zt#EGxMjhj#bYnY0w?PTDz6UnOWGQhzap|^Vb!ZGa5>JE6%L_F{4|wI)T5{xF5$?yU zioi&#Us?ZFwTVInpl0IPN?YZWONoY~798W`YCeU!&xu`YDRtvxWhRswT6*P5qTlUvz4Bub z_XC-zYaJ@97cb&kI*N6!L-kovUilQF9dK_kO4Z7Nem?FN_+C?B~|h z_vdjBDaF9>_)**es&s(T#-}#~zulW%T{a*^Hv10#jKAqA-}KlwfU47|dEh7mKb7SP zl;sIv*)K^55anT`)|+8*_NP+)OsRebpTyDJ4M>tbRl~dGXPB3oe^zyoz(g=x%?%}X zgbGUJ#yF1KZrDJWAqY3=g=8o;(Ji#6J&V7;RhqoTCUpeQM(qTKm_P)TpPwiLJ(;PW zi-V{3F;KqePvZ(cDwF#WCztbECJr`gL-5$vp2Z&zr}4+bDVt{c>+`^wjY*?6cW|1; zgZQ(#6Mr^$uuUZi{PzH&6y_bY&NEs&oU;g3CP2TG5LYjg5LXzgp$0umh${{6iXW)* zZ!P%VmWVg_YU*RKfl?L@ODy!(nOmbcBodKJM}S!h2hhl5sqO*$Xu`3Nx=Bc-W{hHj zHToS|M~sjzJOZx=e@+^U$eIUa($f=ToTrl=Ug^~C{4Ck!2e1> zVnYr(wLaxdY(-`$UyAXUq5lnsN}a5bX$_P8PEKn(N_Tc4D&*2q&0ugdh8g9I0At!& z80d)cNhQoyB`T|JpS~eYOmyK64Gd@psyqcRuXf!X+U+>+7S;VYaO{ zM9k;1C=qwFdGnbz@K5JKUQ-*HSvT4-|C8_q;WpI zRB#QuQ>f*Yo1jyPzeH{pm(u92DZ})Xy#)hfi3?*`ff@?m=EAvgTv}y020tzf>b=v*t6cKonK%UO^-z2?vbp`!`i?O zp^|xetvq5Xs6`l_*&-@r5+PFj7MQv%8Eg1C17m;`9KBAL5aIdJDyI?FL@3^5FJ5nLC~mFL5Y)D-#z=a3_m zv7wEL-ub51m;3uP&9q{gu@Z#^H{;9P!fW3o)sL~(5ADQs3)uzftQKT^exTY%7K@tKUI--Hp1JsFd3-B=cnwc20CsKs~z^lrUQ>YUo z6?$a}su|w^uz0Dt;I|^MK+ zkB_dc;Up6V?hov*y}mvXDP;|j%{Hv?6cS)rRjNE8x3m^R{bei?NI7twHq-EKEgrF& zoVZpD!4s+SLMBwz8(rizQ*c!faiT-0E%L-N=)#9yjPNP}Qx=gb%CRUG`$JC${ZYEn z237u=2$yN9a9Z{x_Lf>INK9ZRK))Z)0k{!qh<@z4ryX+KCNQ0{&q6h?6wHxTR1Eql z$~40p7mh};SIou035g+-ofwVs?JjTCR4;G!!IU^6vr!Y9<;&XOUPj54*MYEfY#_B_ z4h1-o$jB=9kI~Gu$9(Y^L&47Qszql;&8#Mvl+?9Hnb1T+phV1#48GdU?pimaYh8|- zEUo~Jto$lB5E0yU9+23?bQ zaC~~QWe-A`%rb&o0zF(JGp#8DAz06REZdmQIk*0Y-_Z*O~Cdvq}=7oN{Ukx@K+% z+gP6hIJ2GZveh;lE&By8Dw48#8Ra0eC*L7sLM4f6*n=`3>Dj2C&r7x^N-ojH+S-J3 zXuVFJ^jV}yb$TMQPjRge9%XDs6;Xg|+Sn6o5fUI%>IaR9 zZCDipajZW$L8EK4R2&g11G(5Wf*==V!Hsu5%K;S{jZyv5nb+F(3k>+IF4}c*27=)j zGG4TWiaEM4>j4>F4M?rlwpynBqWyI8w8ay)>C&Zk;a3vU+L$=9N! zpxwcBx(0vQ0io>DBXKyQ^jVBkqNU><2@)JZvaQr5}z0dRF~`^&7m)V5-lIFoAERasS{8%OQZ8Yh(%IzQ?8X= zRgci^+fYH97fjvt;9}{MNULBJD^XPNS`G9z?{=&zCEX#{NmiU`K%C)Sh1|L!4KK_n zEy|0G<1kO#nz*lWB(w3Mr^8TdA}$0}%iLD0q|lR5(BkVTv-KntZ!@-==*9rlu@rVy z2jj*nCM>_kOK^Z}c_OpM$DaN2h%`U;>WPE_cBmM>KlbX0EHbvDm;<*&;q~~jr^Ly| zVWPId=VB2vZ+BLiO6J{cA-mIX$j`d{8jHmjUMG<7u@1?s&RYHG0uf<9Ls%ZtS8M`{ zLuPeIkgRPvO{htx8ZA!y5C+RJrMrVk0>*jRp-k0ZncB%a1~Ry*nbJyOZZJ(_GUcLi z40(-HlPm>N3qm>%!SLq{hx>5iIO6osl5S(aM151JFYX=}Aw=j*>c!c#-&BkpTwXyq zX-KE7H_oj%TE6*?fcr=dT-tS%Th3I^7OUMnguo`&-w7+1%r8g1exQR8m*JaIk+O-OE$?GE(vcHy0URi&clo94KYHIl9(+)KS^u8kBLcI65!;tl2 zPN17|@4$6v>W^#YBC>E+;0I4UyojQ>GuLw7r!3Tjw{q8^BBPytQh{CApArT>HTA~; zWezRC|0*J1W!g+}JGM;h;FMgiGWEw+1*)hxvms-Dl}kb=K1^FgYu9|R9sHV)@GAyV zojDud&#Qg-Z*$|H=henW|8Lc2ZalnhC&s@>2>2{JtbT`?T9CX7(FLX0-_1B#__DIx zUFfIA4ik}3mZ{~wcBmA)imRA7Qd@_i5*KDnX@$#uH{AV@t;~BUzr^-fm$Vjh1rDs?`{nuTLV=et~e*EFXh+ ze_!)#_Htt32aU6SWQmV?6eqwa%VnST5l(cZ!eF1;3;w<_wUjF*b5O{?Xpc%>v`5-S zJ8F*VU&+W1$o8#v!3UQ+@ycv?>L5;G3~)J}_U%&(RpD}@Wu~2g03>k>_X$r!s&F+Q zt{=4a4g>&aI0Ux^l^$+833!QV>ekza+kSlOotVw;3wv{Ws$Y7$)+Rt+)TZiaMw$-> zWA7L69`odhs4KbYprf~(|L)-IB)fYe!#~l?&edw8$euPwI%pr?b@4gJAJj&8D?{Lo zq}p7!Zi5_)*)*U>eEh(#LxDh#NbkU?(I)!X=-LX8hYm}DX2B7zr&hZ|`*36hgbFwD z!+_ZjX+cF8UmP|o>tlA%-F?q`|rP&`5g85$^R6N8a)Z&oMEgXmx z5)eVcvszY*r*`6b-)JJIHj72TG*WQ2Y--;_POfW~NY$s2+*B7Z`Y{m|#}@Z zETuNwOsAGl%_ggjqVus&)8BQd`rRlq)!J!JiZwsZi+6ji=2-HnNUP>Ueyko;Jd2av z8K#AvmvIJgaTE8co*_<2n09-O3DdO9aFiwzs7)fPM*(Fnku%y0fHV2uYCUR3s-(vz zY7}pQNu*+J$^1K$%xvg<^_1JF*-#cv|40U*ux}z$S=ETvLc#>P4{ zrFce|6!1Ywfo9^=jEMV^fyTaxX@?~cftPlLz zz@coi%?rT7NViGKG|Bbs7clU1CXTT;F9ZKl!|P^@4skV53SVobGvO&>ZI9aEhd$AT zcqJvflp85c#Z6Ep$sBsJC|U18kI|#+>uWt)SCinGJt|8{nTvmDj~$ZWY3xO0_8?;<3U&^mAV|I~8*lw~S-ka8huW_}4!psD%Bl=MzSiaGIcLq z+DKLjb+VcaGqU#8%Y~X>u5(08o@|I?l53X^@r+sf);2j-SF1y{dkA+tkDF&A*|ZKb zh2PfLNWfwdj{x3A>;`;)Utu6KP{O=0Re6t@Wb`o$Dqc*`g3&xs=JlPN*WZs2*P>c>UaL!SEqaVY9qLfF3oh#C$@xK9(C^QCt4kINdX zZ_LBQ#$*ZtEHhEJXBRFVZMbxR=KzXSal1zW8Mq-D^C81Mi1z^r4bwWcTibF_Zvhm> z`5M;nN8n%0hBa{CH7gqx_Wz5@7TKsSTG2&AeuWOcYqnjHh*VhiLgN*(bPaXNAfRpn zhrqHG8;R!`ys|2QCT%i)QB^4ErKF^DwnM*{rKImglq6Zwh^RQvT%NTU_}Zq`W^SV0 ze~p^v{68>DHI&DBg``shlXz(mwrHuhA|>H zBrswpuQ&ftwl&11p>iHiA3AZsx;l!K81jo~$=-hR58T`F@tfGzp1Q5ilpb12Pr?pL3 zQNW*qlGEJuhnTKqhEKXi&nP{XrpRPwwp3j37UjCCHD<2y&;x zm9^In;o8~~r^U5H6uLsRz6!@B0S}F7WUO#rKxIHwyn-yUs%oc&L_o?+;;2N|xPR=JdW-f;q)GKbJD6 z_q}4~^gYF#v|PZKu9_RTpGZeqf=T_p3X=kgYD@m4PS^XM&ZD%yJ10p>VWU<>U*t5L zO`-ox%vD|~r1M>p&L>7Xr)5d!bQ$TK_83$7#7XFbIPQ8$=E7H0MB#}h8qL-;* zkU&KIyC99b$`e@YCwVNVOcN-uCf;XI&_|6AiH;Zrq{4hul9bZR6j>9=g85;FU$%J- zE#O8TD$bcLE3!SNBh-_HCeuHQOzQTj23LXBrMgtXZ;wHJ4hnPYGzq$a`y0_X)EiPg z-k#Qin{t)Bxju~m?SM+x7)qG~FQ~FRR99Jc=ozJbQ^g|nSte;vTQ9h-QzS;;n_Y8@ z+*7Zv8CSq&bCD(z19iAY!tPvgD7@*xn_6PX7tPuxkZv9QDZ2RbEh@G>(7Sou^-KRq z2`(LT%Y#oKUT<3eI`s$N*uMSLLnBd(B>ccSe12-1)@hHmdrSaF>upS&aA0&$MLz~T zvRFLmnUS=6@I~V{8cyK`_hW@#Eu_UyF==472(7<96{>rL2Qn2)0qZ|EPKZt?x;udm zn-(h&+1rvWoua2F}SP8H@0*i0?ZpK?y1n=sg1mFf~3N{3oq zY-%x5Of#&n^Kw0n#|Jd#Q#5k2I%WUC{{+&^)?gqOqeWqtfD!d()SbQ+#1ci#Q{~wB zD36Ud?AZ8R_SpEm?AZ9skBiq2kvJIsSgx?~xs0&E6z|LAjL%Etj8`c+gY^wX4E9q< z7yNiAAzZwExNyN|=5s=>_*^VkeC{P~JPA?avkH7FY2vGcG(m1k(ge9#LKAaB?Gd0r zHs>WS^E`z_49`k#;$F^)=;iDNdl{7NWw5N5^o9dbUfwYhelH}R(+;)2BCzGBJlV%> zOf9c565`0^T^6MdufWyHp@b1>rN;jIn3`{}< z(hfKid~T0@c4^`Fb#&tVfMabu%-A&z8Nl^)d>?hH%yFZc?0LHt_8j$Ht`iK*KHuV8hlc+e8cpcUJ$ z2;Ien+77&XYFCVN<084#@%J<6Opiu=tcIT>7YTWSYWX%(sf7!CW;Uena?v}Fc7@G`29&|5_UP`W2oA>znytNM?Wk010$iKIv&0q_ukw$zk( z0x^uCbTXJ+z!AsjgzaqvY~6%~P^rjOsK`V=$-UpFaE@Wj%_#(gdMRN<6E8TPmxzX4 z(<7?d=1O6R^8U|HzUwacwP~465BvY7SN8+6R`*#G(zw)Tv!(Sth+OP4~xkv5y_-pP_`xE{edenY{zb-v$&u-w? z#G|%@zs4T52l(sGqxP8}lQlFde@~U)SIX~^^7~x*Jy(7YmEV`j@0f>R43Wx1&ZJ?7 zbCZ6g6qh*knOBbpMkgB?dy4PaR9Uw>xo#uIyUE9rH`$N*t42Obcg#3(0Lt2G1O+){ zy#4Biheup{IXA{BnZ@dBa+q~r1T~1zY)pk_W65nWS#6<~d?zks{RLKi9cp03JC*Z71olz(*m z=8kAJ&+3{o>)C|)ymHO*k_IRIv>=B}cPYHbeF8uE-5UJmRm{XOF&7g!c#Z*48SmDj zPU{rFIZ!Jc$8f|m4O0&r7+@d8Z=_Nf7~US=U0p`#!>*V~0FWcQn-h6#;T_0V?$`Wg z4dK+_wvxjRj6z;;|Rp*RV(UPo+7O*NBH;;JkDubF3?(^Ce0bE^A#CmDm zz+J`zgsDutluRLq7pNQ{Oziz;77C-H6zIil@d3Et5sI}qZc%+^K`q=`+(guwYJ2Cb$PYgIRh6?@cO8U8F^mAF3elC~M z&uN#D&#gGJTVAdU&a5%DE}dI$4^ndXfCaj%&<<#}Au*^!D^ucxlu-^tz<{}|h3x8F z;v+Cz&3ugrN6D&|I`%B-IP>nAwOI$G@~Tnr)&f4PK1y1__LE9YEcqB@O#^4}jmN~s z(I;M^$B;(r@=75+7p+rE8=_Avb$Af|-feR4#u)_I);!xMYDOlXSf>y>-tg=#5%xYx ziU@2nQ`eD%|HG`|;bNUe;9Vbk`*^6h1M%TD>jZ0Am>5fR+Nhw1JOozwSF~a%<1reQ zctPTXWb8f{-_t-Jr-b);FHToz{Dt14lJ1Nn!8`$J1hvL$gS`F>_R_K@rW)`n<`VGa zU)bnAdeKz-Thq&dd1HN@1JL8W>NL8L_dH5vFIxJovPF_H@6F_*Y;AW?2PaJ>^0!pd zHE{8^YfQ1(VkSwox63#_x4&7N$w#u1N9ia}x~2UXXY1 zRJcWa0S)vEC{T&GfLag==Z7vuL=<4{pq90Iw8pNP9h$mk#+~$`lh8w9xl;({>C+2! z3vMSD31~{tp01>A=}KByx{Oa55vIS4EsB8F2?Um?xUp(aaMgSPebfO#Bt(_$rE<#d z%TxA*d8v%{${n(!y@K$Vy#$cVE}4h6@>J9!p0iBN>aAK>>fQ+nFZhT8UQ?FNJg?`{ zk<}WKd5Gi*rV}y`8xuSTIjYYHr`QnXjfN3>Z7Lp8lN*wBwZ%{*)O@2BO!`tXK{2e% zVKdI?MYQCEF6^q6bcyQpB!a9K zku|XwQB%W*o$~BHwr!lB&jX+O=jS?3ZKZ7|VE6zAZF|(1G$C`54S#Y>TI^v&YcD-O z5dtvXU3K&-_!8@WhFW7{aVs4UyMZHLbw?kWIgZIKyl`uNsd4U(7zy_jvumLFOsz;8 zF|)-5A5&hE0A%Y~Jg7(al+=A|B#n6riHZgprJmM3-<{O}R~fJ}+KS^eDg=GPeJ%JP z#%ORoHCfN{oq0i@X*Oy?sW=fPW}o1ZUPEiOs3Gy~sns$On1U6_^sQ|HC_8hl#Vh}b zdb3yAlcBLQjd7i*m@e(*v>Jbsww$-`r)txj)zCK!2VMH{Ae zPo7eT@|4Gi1V6>=_0tf`*A!!u1=(^0sQpP(8sp6}RAI8Y^;B zM^fZ9voqY4rO3Nw6xntN(`9)lj50m2S;K>GLSM0yc59KUt5~nE#EBJ=s&~SCS>$(G zv`;<#JVCVwIYv)4kc?`C+Fxq?M8}$*$nXMJ{!9(P&Oj*TLVwf=@il%Y{H^u+Y9ymHpbJujfFYZvBJ%3T_x%WJZqK} zW^tD4$q&9OmQc|#nm~^(=HKDPz5yKD3B5zp!6%Xd0Pv6fVzDOOJlEIPJn?&*T`bw1 z=A6K9^}Z=%N$_}YWs#JA*X?nef)~K-$DXDC;HHL|&1X6k_;ZKB2WN_ASv6iuy#<&} z=4cDk=!S>#^t=O~rrr!Lxh&8}Hn+__@J@vL(3qhAP;aJeG~v{0GxyXBP!t5VcYt$BUyQ)Xg_GYGxmF*#17mGQ9_JA3JOD4P9yJ0-fi5q=SyDYQz zIF2)DEu^D4Fb3Z^lMeb(eB@skP}*U2F4AXl($csM(w0TCK11!;xz&s;;$2 zp5E3VAPyyh=WkgtyItE#NDo!lVw6l_fb;qEE}n4i-Ulc6opOR7$P;{*$&}r)CwO<+ z310Q6eE^X!M*{Zst8ibsA=JJ``_%7Q!d}Vi^+UDZLZ6+t@gQ?g*77RK&zm^m0pkd8 zTvk0==lII)TUu*bN+~OwV7Q^(1Lk%_X!b!hi7!Mgyf}JhtDXv}g)W0RyV=Tc4)7!= zRdM_jbiS`QIbeAs;FIu{`mddEV%9uUf$3wnaIZdcr<4S>7O`Kf@$%W4?6Vf>n`Y|D zo{Y%Jz7DqdwRwzo`)y{vk2Q=ifmyMTEs}lt0|^0YV9?sJ+{-S+c!!fAG-Nj1A2GGF zOYI&=VDy-vo$vO@h>$ok;I&PP-j+WpUdjfl8pYVI>JMrVYmx26o z^jHjpUkVd$ITD)|<@rzt!=_!^0o)Wxu>=VN&@oF(^x9X z006ze7h4)pEEB@B$K5(D~-ixLk9XtRS!}>bfUbH>E%`6?jC{QoM z_B4CQW3x!gxO0>usHA--ZoWrBPc>nu+a_ z@C_3tNm7`MxHD&3X^OKRMa^4M1Lh{_I+B7$GS;wodKQRVSHNLVSk2TkolUtBZ(S@ zwho>Vi>sa4vxM&MRGWC-!19S_GyHxf?VF-yPDCP1R*TTG{8oJ>ia4+2%;5ESA zMSGAitHmIe0?=g(4E_8WpB}@4fEg5Bl3o)D(-PO(kd;eWI;%0#4?MWDw^B8(^T`><}6& zvdbZk63(A*%BDV*o4Ug`^!KE{rRP?3RdtOit}#*RG^sqX+X|=@PSe|8@gS5RZl?1&sBo}h<1fxa{Q{%iCnQwc2ox^&?fyQFyQ-C7;dBYR3@| zJk3h8LsH>cTKbVO;U^PU0D3@$zv$HBBPzRN9>InbCVwiqLBfOJ96SiD7SVj(;+=yI zoCrCPw@y*w91u&Z!N)7{hLt!LNl8RGQJgc^II(ANMs!pHZ4pJ4lu!~ij}(qZb_7SO zGLCjrmZRM)#Z}r7E^#{=rWT`5MqB-*{Gu4+oyC!vcrn%)0NtTk@uC+D;x=Xhzz^bG zk8lt-DjbBIpBA&9@0OjP-DUGL+YuokF3c1%fN)0y$~ZgJ{)*519ctgQkntUApCDeu zbcfn|`0Q#&DC$Q$)ZWEs=R4Fs#9#9rYQMx^!yRhB#b1{@)IP>vlO1Yz@Yi^U+6VaS zZim`c_@!hj-GT5LG+d!;+u3|ai3C@EUn;*R%I~rA`%d{iReoP7zX!_ik@EX|M+y8E z$xgRNEM=jq6m;U>z})ctOnDzF?=Ak`*PcQ4(;b#9t2JlnT`02bDztGeY2$acclOKD z#{M$eczMZ$fv-Eu0i9o7ro;f28hCX$=a-jE0Km_)qJg^FdC$s8uL*&E7yG@GfOY=5 zBaVJO#G0#jtK2XY76FHGZLgmU4jdCDEtyAH?m$pgp5nRf6L}%$d6C5--rfe~WurrD zS+43BZK!5lAe zf=OhUTH*w z6(q~bjB{pwt(o;u22QHM{=B?Ihl1X$W?EGj?8EVjz(ZlS@rkB5XW;KIFTq=(q4dwg zyWv`O;ROf;(wkYv)$H5MznQ(f)XX)|7%sOP+MY;;xGk$%S)3O{m;}Pa ztYq>p7E&cUAs$~?x2_#mDc8;m*xHHC7?|tK4I@#jQ14>Zu^YJ30KWnU4C;smSA;!@ zojOKhDsEkzimGcFJOBo#BB5@tg1PRcAUajiE_X#t`Dd*@+hWvQz$z(j3mA#JrWzE_ zFcQP^g1%jK0rIqo+0I6Atwy=i4Qr`oXPz0UB{vr>qGheU1)7Odmg|>O_A<_?>q>gM z;6$OY(iQ{&b6^Q~CiGoO6z`Zs#zmAMs?>y4-P*0ortD;9-@57D$cZc{P_xqWu)BICHfm)!r>mFz)f8y^FOZS)nam|NHS81y-HjtNcAClJRXc8Bq)-ZP(O z^lW|Ir)=x8^pbLa=jE5=Q~=AaC6!Fi1c~uLGR?Q-p=F+2~MGGb=akD$hTzM zpD}j@BN;~|<|vAq`--^ImEy`F6J_6(6<6LZ6IX6`sQo*Nk0(3SKD$-rw0BAuPGlFp zGl}VC*)F_X>W#WXZ3nyXZHL-J{I$13?H0<$M<5ZiaBJwGL0t-!7()Vz*f~xkW~f7> zec#%JQf)`O`I9oDk)kQtM*cw{D$pgQb=5asoptyqZI-4&hq7HLrXxaP~xCvtedJ z9HYr+tORM}?v;cCRDvgb^;kdQPfZ4e%kBfLu#_nQr$vXTHSHIeFG5r5ZCNS_r*{z2 z^q5GZhID2{u*sMstHyf;SS!LM0}tj(hnmctYhUTJ=&VGg)o@x{fE);5fgrjGdri6i zbM}`phS-5DfvwCxN#H7Xr~(SD{nO<*w%F_;uop zr8-Z)pdz=XBHQ%>6Ht2r7&v+q;>N}FyP>_=bi;oMzr&^*K7Gmtb?e&RnH!=6f9tLx zuAgNldI$X5t$Gy&;z!Liy*!+7|sr`{q z(0cpRYjR9Rn8>!qzJt$YmJmo^Z?$-`5bI-LTDqhO)pSMa^>wKE))kR$aJkAz_SjO6 zZ{d~_xW}wBf!12YrF6)50+p#LPi|c`ltCu&?4%Plcj(z^U*TRSvo$HArjt-67zg7Q zlAgj!%@5Q(=lrp$;G-(egwMdbX)6M`#xYPovrhN*#)xLEjeq|pMD%n;PHIEg6^iT?#QndYGkorSu??huVvSZ)cH~1YCsx~5<+84^$nl^ zy&{V%hK;MhH6pp_g@y2@mFkeX`ssIU@)nV$Yxn<>|r85kJdx%Wot$h_)sZ7PZ zfLsUBI9MNLUhdpV^a9zHhy<36lEfo(ZI=2#kf;HPZ&(h-oaI1uk`Y-6JjKQW{mU9> zi9tkGyodVAnnZ%c#AmXUmDyiq(lmI0P&U~t!#`-d)`0<%c9p6v$ z*)y3uzOSvlfXm|&&B4TaPf(yKli_}nuc$hh)It6Jip=bT3Esot|Cu|5{}@@gqdWcw z{C5uj!~tfiV(#q@wResIwqb|b-&u?#nBP$;`HE2cH9qrDJ^5^|CNph0#4agV8J2fL z?7`Ft!-{u9D&&@u*)W9Gg$TGn;WfA#P(P>vPK~(;ujVAEE$a2U@bcRSf1RNbnbEm3 z9DeWz&eyA{6SxGF?O42?egQ+1F?Yg;Z)Crq6Bom;WNAeCweWG4f2=6aC$iR2Ec4hO z&OzT2>afcnvjD{X$|zv1#qEKJsrqY;?D!oT9=Gvt{HfIOicnY|v+)XmQ+X$q_aj&- z)ZO6AfQ-VkymjNt)wf#?iH31^V}qtLJ@IRsjZypH{=SA~WfH7f%OU1=%OTv_19t#g z^FSrr@~#cGS@s=bdpD%{p2RZ$!NlHo$ip^@1nP1KOHR${y`Z*uqZk$n#w36g0N@)i zCbU6gJ+_>bogFoRGs3HmA(Yg=A1`b1ymUjqAJ@;7>hr4%X|PJAAq2#ftCn$>6)R^S zm1<(P38+G8J=Hyh`2tlel`}4b4u9owDYPon_{X1KkgH$o;3y zMe>UO1VUK4y`!VUMhs1d_twV>{3wd+&!E>--{L3~h z|6617TfK9#XMt-9{C;(!Tn~B47qa9lrDW$M>((hMkLy;d-pjgTibmo#lqU9~$oh~p zlI7)IMHAFJ&3XJQ0Aw6GMzV6NBH^Z!_N|_} zkyIqQLx-4_t^+8MdG*82YMED)iB#VS$KFZA2Qlhn36@M1Jfht2o%4?6ZAb6Xsv46f z$(T?i4QG)i1b09cSQQ2H#;JI z5IGR(gXn=s9~2x=`|P8#UtcS~Un#%eE5A>b-=CDvW zG2_)jUZ?$QXexHjq7-o|+$qN>WOlVKCc%LOhzAsw z;RBytfnP~$&H=TIbLADEFTP1axk-9#lei@}iCeHqT)7^{WTftp8RbZazStoygRT1@EZY_q?HbecBb7;q*S6@NCp6D|T_W#WXB$|!KgAPvQq zy9-mo6NXcFKx$h&VpK-Jm|l&i668JtlcbM8(*vWsw7$nSD15%a>WVjXtFPpG!rITT z(bHf?d3qOr$<~H~DK|sDTgSvYg@2%vr?s}Wtug5f3rWg)#q98wajvYfV(LDvVM<3O zz412B;e-*cHJ;1Hg$?0Mr)Zg;Vn5h0#~6hQ$gMmbYN}vFYp0fR&L5(WU8t}X)*qdQ zLrU=p-!%idYaDj?e=K|We_VF>PY5}s!9!lFdFthu25d~P%8u#PvM~+iqF>6tj4s zoq**S&)FD1l^x@!rB1+t6`dSt@qTKq4NJ?!(a+7eBJXo$!~aBD20aMy_Mlu4;6Tj< zqJ{!~Qk|FO)Xmw{eJ(q7pO-o>A5i-WH}AItYLD>O-T}4G@z)V-=(e(PzbU`>)J^F$y2?j`H)o3h<~v#h)0-dv{2l*>ngr!T9r8EhMM9m> z(soe#vv|v8qXFnAz#cX2NcWtPRU5ZK4@_Gu8f)lk{F;53qW7d z$+qzSyg4WY^ksD|^1xNINT)?KbX6}KT@}0>hm;nl`#C2i5tDK#Pr>%n0kojy7(nZs z@NUY5#323iG~5-Bj88O|#7#xOL#TBj<5$?cuOSQyXtmY^0@pdfqVTA7rP^I46s7PD zu~zQ)d)7}l`?iSLBH+1eGXm;R7J93!`#E9M$sK>2Y6qR!5YdV|R59qPg^8K8{$ zM&W`j$py!Z3zFTET#)Q8i*M&CpC^I~?jMxN z@|{275eI!fYh5;LLD}UDmM!P;0kuCf&zJ*h6I@R3K!ot^fLQ{c9UM@5j=!pK<-lLR zABX_Iuaw%?`0P87!j3`;$I9=H@*D8T<3CNzwDG(0{wt*!YlM$ea|*qaA68Y`3l!S> zE@|(U&0_6?6IdS(&}-?#f#Qa(c~*yc9zf5YZ$97L*m^GAfU3fMdxcM8LvCYH@>~4m z*}xBo0mAS~UpX(F+Y;N_BIlqDpweq*SDwSFmi z=HiZF4mu<{t&1rg7Xw^NYy7n74M}hf5;1W_&UA>s49TT4qwXLqIb!K{n>F%mGX3Ql z&S}!^w_u)9s&93!QkwYOh1Beo^(R(hD~f(OSfIjQY&k3v^JKcJJ?CF-|TR(8j=?B&l1{|YCRpJJ9o}16UROXTtg@gRVL&asqijYTr_C5yQUuJl-=(R+|t-W}z< z0A#$JS8#95TRh#lKZ`UHZv9zB5)S=YMVKppMi*c!fJee=5qen_NygFUjN_vdSRWbV z`1mI<4ppxC0nU*SSC_Dko}wss9*d166$3fMl&Pr9T`ZoOlCRZkC$L_#wR-(0td$T9 zf9N7pUcSbXKe#A~t9B|BGI=}CE5Pkx#mltEm+6%gSg+VJz4}v@DIkw=*(`Gb`mxo4 zktG;nmgp1THQxEN4RSfBchcX7!G&O25HbX*pT}q#|8w>~zx4n1%XU?bqfNEd73+*| zmiHyHs*VsrwX&Mf7|+~s*;@6PUQ)Tbw3*Sx@^s7{Z}#b%2y%?#sZZ_;ejYvaNRLl6 zb!^GVT4ga?8>i03_w)YQ2K%+S@z45s|8KCma#+Q2(&>3GD8C`y$dvtk#P|1mC$QeL z{r&z=*x%{<`wwjPOr6P+ozLLUa`rw3R>aj+SQdn^EKA^PkRUg?1UGyMPMyFyWlM1S zCoDm%TKR#g*EC&Aru?la`-2?!;a~xHC6`ywq9|{nDlaS~mFR_~gnB&_gF(Fp?{d2M zefABuZYvhc(39@?>9q*P~C zC@-7JN0umVYn3kwF(oqenN~{sx)St4R+X{LlwQulO zSf%zZ{&K1*1Omm~s)}JU%xUB7^8tlMp*d&>ny^L~j1FyJ_2TcaO3l6m1(?L3080G) z#Nz10Yg-&1AZ~b6n^;}x?myk0q@we?&~vlVjc9FT8Q|K9CD3!tZ6VV=`g@tFPwu_-vGq1l+`{IfI*cHAlFK zS91k!g8c#iox?v0+{CMSz2#lQ(A0REL6svF71@gqGO6?Y-g@EaaAn=K~ac5fo_{DI(5VX zwK$Y4f2mvW* zEO8=~Zgd`Vjzp`&Dg)ClXf$y$m2PyH)u;ej;3p{c1M9Mi7v9Ti2Dl`gHGy+eAG>sN z_4O(w0oQ0l9P6{g*8a1@IhnPN_BXn!^UAYJC!{3cY%hFvy;Xny%$d8pWH5CCEK&y+ z`52o(s+*tMEQY77~KL^p$nY;2$LW&gC z7AXuBOGW!cis6`lBj``r;PHu#P9G})cZ0jzE5_<3?7lEYVsX3pq? zp^Ts>Pr|%kyiyyKT+XKuk)2qwBBfZ|Ska=&Qi-wW4jyi$%EXqq5y_FjhZ~6R5Ty`E z#m(rD^9+dOn=qa+QF(@Ntf(Ax58qX~u{yWQHd^I*eY4U!+OHdyf?dmZVcqqgT?@(e z=kW%-V2*sl!gYtW&LgA@w+G{YZa0iQ+m2_M170cQ~{j4^C z!##oFZ;!W8893n5h~KT=9?)|RzA2J=0$Vhzpz6;Uv4|EzNswDDf4{4J7Lai6&%(S_ z5wG=+LU4X_>0QoB^0!LC-DP9RC&=wRkdcl|-mcWMbE3F^wW ztj?%35_v^tBygq`CQ_=8wlmMO?ekUB>~2X|61{kQ<@ z4xg#4!-%ZwOgSrAnQ$$Y{E#UI6LsYuyUF^d{tURQ@>Jt!-HCrS9Rl(e^KJ!al2PDa zVhJ2Yy;6DQ($`mCD=(+cHKrYV>jdA1kd@30W2b`1q9nKs4@X@RT)TtfNdxwW#i27H z`v4D7WsK-7IH1|f#$Otd1*j!6^h(Pp#$Td1A?qt3$~G&b5vAyse={RNs4YZ34JsrA zhsn~(a6t*~j_$y_n4LbX8Q$s2oCKjid*%mYXU1j4I-2XJORMf3cPew=ol&TppEQH? zIO|DQ0B{&zUOSemIKyE;!mw1YWi$Axk?niA(vDS#AXhSiNiAX;t1g(jNW67C=IWJw z`XsE7*}%UFoG}@~l!MyVnN<$E`xV7YpMUlv>nN+x*X}Wc*|KRtTCNAAY zm*)(Q@aS7S={Qn62b=N5dnvDyQomr4uTM^nDm;w5uIdH~Sa!T*f0VG7D>fGzSR*UE zy1Z2U40A-WuYpS-hZ2?*6C)?$vBWxAp;cCHTUFAJ7jJ)9PBiAyjT_6c+OYrVOXMn- zWVJp1-2*PIC9jy`7GLsm8Lp-qDCwD2_L9nF1lR>-ndqbLR_2VH*qLA@$gE5f9MIcU znL?;iT2^XEri7B^JRm_L-l8XoLMhG z;@6saI`h0fS#GY`bfcG2-CwhfezR2lMdg#FjHS8S zrD@Q_+oT_CR#~NhA<|l9PSuP}kK*K<*|dCLY@d9L8&u+1QlOmO$#ldQKY3-n>^7?K3nz4|JmJpT|O|4*5+ zM<)P&s`pp9;s0mtnUy4rEI0VSB#gf#jQ>OlBZ{owuSjtB7l-^I4vBO4znMW|MSBpH z&u{a&8aTaD{4T77WCqX-6-QaBuXnsTNc7lee(z{^HSp z@#u%}XdvBPfSvt|P5%g+7Ss3_r~WtQ)RqAX)V~<^Ukv*{m|=ry@egIzn&Sb70_~S$ z;cSntZT26Vng0Y1j)5S5DI)$-MEu1w|JU)%nLpckfOUWy42$fwd0OCH3vRBso%cnK z5+$#A_VJ*5+Z3CiH9JaPGszjn282evz(1l@8FJ3-hN?5aKdLxd;28V*$K75_xW?r0 zGaliJh5V!kl{WROFvZk2V31U27iH)r03iKO8f`svd1J zeoEB^@K+D1U5Cn2g@uRgH6~Fk$xl$|s+GV!?Q4kROzwX8DZ+xXxp2KofAW#Niwxd+ z=Q(!yk5sriB7Je(hyoF>VgjX(?@~CDx0loG25&E?4{-qJcRMzBd7cBY7vH~|s8sAM z_y4$@^!S{s;7TqOm8Gco=a6aQ(q7uV_b>O#zjO}&&+8l>!G$soHz|u(Aim(3p_iD3 zD;<-SE>-SeUOoPcAF!)4jto^N(|?9@XOMowa`2=cJCp|Q*DFevU`aztvBJ=w$5>A4 zj33~$&ZD!J&P`F=!Rmk&k4L;K$F~-0rkv0nw5}ix59LT>-544q4-4xJxm#As2dt^* z`Zy39Wq3`iIPR9#%YA0eVn-W>e&kO*wM*hcaw#G^0T zLx*K4y4=!3WKF{uGq+jV>ZCieT4nsT9%YWQN%rA$HJbW2AaJRmYrRxpcEQZC4xy|z z^>1J;6nNM#2AD(&Yea-j!K zC#p<2E5xNMGeU+86A1joDh>~jW(Wh*sTK>yo0Iy-BAIc%%#xW708U+)Vz7W^1EPU5 z3r8e?=r-yP{HczLm5ISABnV3922VE)Y2w*Gp^?#{v?3$3#zA-uA#V6D#ee7S96>|G z)dq{C>ytieD^_e7cn3~5@Rup|FH`DYrqsVossC=K)W40&50}ui#n%x>znub@2n^K?>h)mcn;cl-rX`l-mM4;UkVG42X^X z46>+Zmut)S#qw@hIQJFySY~5izQ9|+zbTox)7sC#>Qyf}D3(|fg7-(0B^Kkv=5(_d z4z^tm4z?rUU~|BDAGm&z)y~G2U8>J6M)}jmp9#mh0+eb|_d8|bQy+0a5A7>sBn4ef z<1D5-RZO7QPT)e?kst8nV7>gnD-sb64<4?ls1U4)iRb#zbJInp2wz?h%1_k8cT3Ds z^EV8KK}{9OYVyq4_}9o=xd;~RvAUx)nAanL@YQG3 z6hpiHNj=iMq6^?e|F916)CqFQe!n6i-SLO+pSo%6U9BIyb5nQr?a%8{$DMuS9RbzcS7-1icBajHz&iBc!z9xkZ@Dy=pI2CBP)#c{ z)*g^zI6Fb^is^>)vg``AMSc=kMYoYxNKN&+a;o9NmY0-K8(tx`a9S^((|nnNY9Er( zkcAF2`MIt06Iw6wKievFDlE>no1bPE!95>IWXN$)faf*!zL=a&E)u$#xCX-q@Y%B7n!^y;f9{o-(9sxS>N=Vz@?;w@2_y> z{Q;#_NdW9zZ~0GeI}g9~>}I*~XJzW+fRXRgH*WP+n#DTvxjP#_$U+)L)~C0fm9-an zo{9&{Qrw59EPc4n;;k@~8+o$#>LXx6bh$hB!&XuD zdbuv)@s1dc9j%Z=qp$<=`dVtaA;ZwH^oGxDkJs>E?NnhJ1U{NihsS#odb=N4BE4bJ zVr6F2Sf;W=sGj(A(6D=ck}C3bCPa5xE>VC8rJTCuj;!*SMUfTKyJ>E?ii;GecsB4S zFtPKgKTK84+dd{}5n7U2;*odZV{*Jy4g&q|wDs?>=l`HxY85QZr^Dkmn{`})qpT!h zIaaB>v|L9rEtged&mHBY99ar~@DQ%@16IzoezyGOX(=p4p(9rgmDI+B-p{Y-JtQ`{ zXL(ERd0LWtkXY_9smMJIoB_#ApK+*U7b&q?hbyLedPp{=hb`^HZxQ*~kN(V6SJd5i z%XE#3M!HN(OR^CiE7^#06{V|l##rN7N*r1_xzP_gA3U5j{OENhEEYKUt-hE7ij&18 zrZ!v2y|wZ8er+34X)m5f_n$tQ%XQotB*eyq4HYz$WBKd=+;j2LND&ETLwc`7YH(xK-c;Ez%Q-H;3$(+U+6ld$tfoFL7=9 zOeD=gKU=yt-Puap_223K_Sg07Klgf;iOSdiX}7i|z8oD6A!=xQNjyz3JNaHBj~bFM zRo~p4mtu_@m(?nYz|=P7&)T;JtSm)$jDOZEq=YETOtHEr(bcZ8NFlqQ&ZgB!1uqo zB)2*KI(r^6M%D*8R=KF;${O*hRaV}3T>W<$?*4F}KGoT!m;<$r_LU%U;U1IY*>iGo zRIcP<3uEfam7SB>{;=)OW@JFqemYiG4~x8s|LmZ3OCj2y;M|yAgo4RnF?TTrYszMk z9_Cl#1SEKwXVfilyUw3k49e?2^Z?7`_&eB5BXdLoXMq*T;KT3ySw&Qk6!_Hf8wqQ_ zXaK)Sw*u6fMfuCA6+&^thsN;cup8{jORV^(5Msf;T|Qu6{dl$bW%WzEs3fW?>+t?F zrbJG8(d9s(H{^uQ@VBxqRQoaXfjk8_d#ipin7U*}+X2DM=*~1Rwj^1Mf3Agbw^8oT zJUo)clrB7U4pZYVAf}9fcowUkAg2|g(lrtZ$S5G;WQ8xnhli0rbiz{0U$pyj-~yJ% z;s58&OD1jqH8(gn`5Sk&-IgtNI{5%O52Y$iPLt-n%Ki{lp7DcYGRoDo>d~)aa+%a2rxWE-VFY^krB1Of7Y#bH z_Hz7bR8rtq%#*bA^9ZTmU(3|*MIIUtQ7}A)b})Yf$#CtrJY3uL1M7~3Yu~Bi+SM}g z+FNnF_VX=>*WUVjB3?Vp3)qHFHaE7O3m9dqa8ECfr`}@m)KBvQs;fgX3ZJqC}L!;n=2Xn>@wD*|gNRJZvg^?J_Zns3P0iSK_~kz(UIHlXnh zKhP~XS<%w$n}HH1UD6IK#>2{P1gpk>v+t>cSB7l!8Y?2+Z48r^wfso^z9nGFRqtIE zyq~nd$dM=Bh&3?!QQu08T7?nVAOaF8G_0!`0e3erD(DOvKLqt$I-GlXjL$=yC<-IF zGeWinA>;;YvjWrQVcLb^=|4J=O3!~do;y2mJBl8mlhf>|?d5hZ6u3t&39|d2=3DxN zb6aAbv*7x5{xhuGMhwl->Nthi)X>DVl|{k>5&? zRjDBGuy8ZRQRt7c34b6=JZIU4cQfbG9UNodE(vvvqTuc_YcD=dorJ5(`NboWpNZbr!}-mzxEwU<0yhrD}hWXw2$mpQdVD61H4!&vL1PDUDN2tPlW^JiTV$ z(qhqSj&X?tQ+%93W9)YGxI$c>2Pxlb_j147$25K~$nsvJrF*{i_lXs|$LYP7BfFO) zVXmhG{}TPTjJ?^_C0+_4rS4P$4T?}GOavK%p%R{A#BIg->R+Qn&5Qs_rW4#DK2s*6 z0VKv7KloO0!V0;alL6kI)IckUyOP&}IJCQdz5!v~(W9K?^U`kAsuOi$6(2{aFyi_i zJ4WMySD0dt+LB!J(Ve1Mdw%Q={kW5__rI}lN173g;Xg$d;G?Hmu>u-2O-t7r!T5O& z+JCkucJaOJhn%p>9<-X)t@Lr1c=v+0Bo#M{;Q5 zp_;$G$shO#vr2 z^_DryzI`rnf5njbIhny7wJRkFlsk(@(z<|f_V2L3Fh4YuRbR4ESR z3~EZc-C4_g7}cH1TE*C|Ot;AhbOWiSD;&W@S{r_R46@5nq9bhK3;V%o<3ZhEwvZn& zj3hhE>8r5Ef(9R{%jr(w<8&8zRlFD6q0-85!O!T1WL^qrNF>C=;(}WYk@u0r+e}&O zk;PjXMi*IzDyThJL|Aq@l{!IJZ-Suv%h72kRBqGy{M|NPWnJde_vl-$~W zoIwUTI6prH&ZpFlS$d#6s`5F?M>Kkr(ft3J43^f@QL=mg1`PajM5*f&x%%4 zCM~@>TN#J6^g}Vai)NiKyz;SNBt1yb z5{c%R|M5wu3+}}%EXzvAC>4$`ok;jcuNH~X2|vZVIoWXL?l*F`(kD35RX^C^adE4B z$LDXQPu$_4)Ky6xeEOQimYCm?_!4KWOx87NWpj$OqeMBe`5*_zGry#_Y;{WZH9O`r z$_N?NJ0VuHR9`I73V$jnAM>RhfCKbcw!;X5z#WM_p? z=6xhnJr_n%=6%gR*%-v%6o*sh)uVl~F#vpHe+}E5Gnsbvr!a5`Ir-=@p9F#<`MDg zjNE=nhsJay9GaM82V-4{%=A#GGJ13mWVl8IZZVF$kyyJ2Lf!LdwPPNw_HJx_Jcd{` z<0>Q-C^w)+lbIsw7@tRYb$3wKI6o)hTYq>3m-vOyqD5x&-B`qN+40X0ziw%Nsee3I z|JbsxeRo*dY--QmQCd@L{_xyBOg{S6ewli-Wxq{4vlrJ}4Yh9T`nme|bL;w7_3vM; z>tD4Ge%*?oI<9h1y558d_D7YE$F?n&Vtrjcl;MBM%bN0-PqY(;?s%rW5G`5pBh%zd zH{B(;bfF(u9ZFM+2W76S)czQfnrSWkncw(YrIG#eq-I*(Dz#4ut(n$smD>9-PnL`a z^mj>QALHD0XdJqDQl-t&)eLioS5B(5HZ>PhLMtO{(sW0)X+6Ag#$ytg6WiY<_3P)> z$R6yHn%M-|s)9v$6ZMcf0SzJdc+L2=zGax^f`9evRud|1+mkx(l{&jVH%rCryr z(UvF{$4S)V4a+|c>sh>QsV3QeQOUYgpJtX~bG5c*MmSqy zHsl<-quSc2e$A5ZlG?gIuu>M~cPuo>m zYnx3v3H+PN*D9@tcQfkT*4h9-LmhV-HrkQZGNXvrPO8*0M5`S4&WyrWfTGb5@%*-LPuACu_6E=*Vg%e%&*8)Ap< zaOUd!f#qfFP*2%hXU3R-`e%NH|N0?Cb1=|6s%j`ZO!0osoE-;%1;-jX=d57h2iEr- zR`5+{1@leL3HJUkb^qGcHqtDB!k^Fl3R|1Uk;aX&fn*Y!#;;-^AwwX8xXjr2A;NB1 zc7#OaCfw}(+uv2y7qxr|WX}F_W~~Xb)R*e+>gwvcu5kJu_y6q4yCkOD%~Nnxnx8_XNs6L)2rdb zj(z95^|Ee_f~s@V{~ciX&bjT95$?Y)x&3#;dgc}oPz59;p7WIJaCe2PE(6g`Shle7 zVPL!BQ=7UKLtg@4+RiYrJw5(5jDEG|c$J&macH+CB^QL_rmE=1*Rwe)Q`otMyPMBh zL3dFY_6x68p4!t_U!BH|1|3F<3z@LooVu0F!zMSQ0|p~Zm>9)~QKMvMz`Dd`bX2x7 zOY=3WJYbEZ6>bk088K*$xXb}Ah}(DO1jCj$Cpd%BBP~6l6~p0Y(t*kKW?nUT`tbA# zmeHB^V5`~y?(DoJj4YbEm8Wo82>o%Pujepp{i`!oZIAv{+pV9rt?(jc{o5Y1p_u`5 z=(e4($~d`Zw#(?Y%PPZ|QaXUYrIO1kAQlua;K`Xx5++b)z#Nh=hm0y?aMZOOr{S(} zyG>dS*~fx|?L2fuea28jdRLyAtx-%xTQh;<`Dyp%JCtUfO@2*-ZdHVU+x}NC{ z1COXdEe0b=(LF5TAq2HFVVZK=HK!cZwu`5IUu_66@g5B-*NB7PfQ=Bm2i81hgWdZZ z2RDPJOtji)ZK(k_TII5%KDo42t~K23qgyT`E$Xzolv1zbc3(I>a_^{Qofv1ea1;4G z7A6r`u%NSCAI|hnt2_PbG@^wFawAEBNma!u)T*e-1E6@1;dD0 zjx4Rz-MSdeTCl_H5phY|A;3J0hzlea?j%U-u>O-gW7ovi@Kb)VW>S?MpZw2H6kih3o7ooP^P2OH2ymq%h=#>)SCe$gT@|gll?aK>dtytt}kSR|i>w z!-dBW7?2+C!BJavMM40<#u*BYKK+VE7t7L7VySDX;? zNEK*RDuse9Ax^zy!uFEexSvr$IH-p4)FeTAGlz0B%h7-0oLIe(^}g*Tsb=GHBR|Sc z0pQAulq7?KM4)WWO7k%`7S?})LCP(NG7P>&}1^(jR~@VYwg!$fl4cs5haFJU^aEnZPFF zSl~d*eKCJjLVtX87i*cR>y%1%tK)X5SqiwC26lk96h_;CyYgjdyRe|cz~*)cdie+< zVr611%OR2GNJ=Fa=A|+m<6k@b;wX;oY1#&_2cvXmo zW6t^zNkFxSJVHNVW6Z3E@$94(q3!6Q1l1Bj!DfIlD&T&K}4^({W zOHr0X?T^Q_7x`ldjKEpk9~bbw(1oYBJ)WdC?x6AQ4NGl@@Nfvi$UdXi?&;y5hezj! zmUt;8NHh>X$H{HlV>A@MfN`N95FuwM2Z6q9_~L-2mi_UVSTmqm0JYQjv1vbSiit^& z$T{Z=M)4s{Zf~fa9z8#lnSlVY8!L#_0KTp~;cp>z)E6N9x#-h&t!a&|x@AoZNw0UC z0#4k8aEwE4WMJD~tvv04)UN_+l5yoSO%lFx%mSPiXZq^v{H%<@gsfK>Fm4QVZ0j4L zaqmDWpgb~AS250d!at7VNr>T~#fxjDQc>>=dEbC>G0d^;Jju7|QDqj0Z0f}7rAKqC zhf88PBt60>3Lu}E;^STK=-_Pk7!9iW%o@gppi~kFGEA@?u(Y5aUWn`f>p22z+Q-Do z!D~6BEk<^rM)vnH8OgJ1=;La@Htm(FpLX#Lmn2a|5>vZ z4{ZPN%strO$qnq!V`41;)N;t5Vql+OV44B?u?g3k#X8^!xEP)QGpDjxNHuUI?!in% zEV_z>VtC5!ADf`==h!8tb$1%?Pb$OlM?daItS{zFbq+l%{ZK(EWRjrpusNCJUYv72 zg?3_4!GM-%c{}2arFhE1HAVdHbR7~Yb@&IVvAIc7@^P^u<;fs5^%Y)Qj6?6nX_kk~be;WiWtqjNF!480n z3}{f{i6j`X>O#pJP^wfc$g~C(o(`{VN1nl;#!y-l5FpD*fm5j>`VW*iIaJbQP{ysS za643_k3^N*G;*dwMJbyIv@yZ(2q&+fq$EC?n>&qHe~EjutS-Tiwyj%hGKu8+Ou79R z@PxzhVZuWkl)G5c_;cW#C584gOG%_`or_ff)ZkV5&j`Q4fL_+O#h|0Ul z;qC|bWdCgUa{q8||8W20A4+L$4FEeAvwO$}J|F&IZI&jM(}<6>0fSyZ`WNT<4`N>E z_m$jxIl=TX|5^Y{PgiCdF?*)x`LANa=-CRF2+9r+LBVXGyV(iokW&{|5hzAsyJKzJ z5pO0F%bId~d`@OY>omsa*#V#syq7YtOb`I*ulcfO=X89Y|E5MrxvlB9Ms7XzWvgDW zG(wl@Gc!txL8+u?u~f3dGF>*Y4hg{!TK=}2M%$q3<8z5cf67DRAxX(UOSJ8Ob54gx zwz0o%l(0pp5;IJa*m8v=Ug674GDd~4x*kTum{CuyUvzsN)7F&RHz3sb?5E!>r*X5x zjJX^z?#08K8^&|92^^|!C(*>B~Ui76{hiBq=z3wD9o ziq9d#&o&mWsM<~%D@!HYE7MoQxM001XIt-;Re0qPuS_jS+d7O{!IA_Eew1rY*&+pj zpZbgVS*|%Gm`rTBkuzXzhlHZHul3))mVuA;@|*A^f|i_l<2u#`suSl6Vik5X?euCu->A-9Lo2xPPxHyZjP zZTko8W!&>4AMIVh1s3c&(PZ-m?PUxmNF28SW&k2Nb?z1wf0{Edalm$I*YAbd`hfPDVpbWX*hMJ4hevxg2Ni@mJBBjB%n}AfHrA_h1mEHCK{l`Q3WkCR#QlMy zoUpDmz(11-iqPbdfa^>H^)#7ih!vj$DdY2JA`P-gS_f11^Ob@UngqZPxn9z&n)QWr zV9`QxyAAk;sU)2SPqR(j)(qKL+!*fR#;{})r>Qte$)3-|ZvK0P)0NOXTl<+J0}nS4 z{^?tvR13_bZ3}Epp=t}OP8|Yjy2a(@--6lFlZ$u=YB}x?N+nm|BK(F2Fz!HM;s_d- zg2k42mIen|C&bk#mMQXGu{wBv?!#Fxckcnp!?OwaXNB8h>=Atu6bMq}C=vwEk_N$J zp!3O0r!e%a9S;T@bp-g`4i2je<`J@ndeg$Am)oA!M~G!60j-jd`so0je3byW5p0Ex z04^i?i#gMtW8QWCF{spM|Hd39KLDC3w;!%5)$5CvSmKj(8-j20G5ZJ(=JKO@oUb{* z+L9nvqQvk2iA$S3gZfiaePbK#`OLOXlx2iph%r|SloF~jX%3;fM7;?RJzpxVDg~8e zPDU0r?hoy0~$`Wqv>`t%KtSm7U!^_w?Wdk3RS-l0z{vIf#N9f+aM| zG)=j>7o8 zXF*6!987fY4`YR_xvv$W@h*lhgzax2@y`RN4~!Ye0JWCEWqbpu)P05B0eN_m)Sw;^ zg}HTLfQThlLnB>moJTN`;y6mh&90TCWVqx!`cs`gL!$-g{m&I{TM$#>!M~0mi4j?^ zR@dueo?7Gy=xJT^hML2u8yIc~UnCRQj6i2*@~O^LDM1qn>TZ$}e;NP#U4rV*fXcov z293vw`VBA80AC1QtwZzq^x(h(Iz9Z(^@Zsl z|2o1#20Y{MJX3^9f$R7?H)eKGE&uzhs8Lq+zYA%iEI%{3@nS>}UIa5cOu}4;0c1!4 zplL?D4!vovyZ+Sk<0KyT{HUHgb_A5x|KdheMZo4Fxnn7uBnyipP!K#wm9iXidvo)X z8aU@uV(C(rLwf!-i^mQw6J?r3R2Hlgz=ng(MOVPcTL-#0$?zee# zUx>fPd^N>v)#Y-$1ebHQaZc-U$zFoj`P!oIJ=OQG;dm%<{Bx3$>m@iIe3$pi%QHfYqShldcS^Y??q28>ZR2z*6P@5-D(!A^|k-n^-gv5b+-utOS?{aWlb1uM^c0xIzWlT z8A`k_J^u`B9DFxqoe>FXO(;nXF-?&9E?inp5riI6)txeQ-mup$*9OG0Ks-zXxUbos zLP{?~O8E}dJRsE~(1L)rrYgcq#H(ht?#ZX1Q|k)cY=*z1I($DyDH>K?cgVU^S7q+= zWk~IfQ_sD4>(q_m)a7uR(A-Tl0B#svE`XpX2aN?<&Zw>4X>BBoYjWK24w}7wj2_&d;jNk z1yuJr7;0~v3Qtbq*lzjYI1EreQ^bVY=ym?kRv(Bdr`D^|S;yIg1SdF^owqm%R##6! zr&h%gTHV~}I<+_0F@%az%)k%H3>-j0<|WL)Kna>?#n=k?{&o4uEkJctb)Y&4PG0S8MeeY0*xXSmjkK zbFu*9y$wXgHp#lA=apd`SWU2Vsx_tA%9kT=KWDa5UuMrz7fr-|Y&8%4!x{PwyW<(^ z?K)4bJoU!;0k^h{etWb=S_|t2W$OO!5pMzg7VRhsem_US)jGhupM2+Z?Y{{w7X))&IlH zS^s14Ss!5WWv9KDJMHgtr~S9wX%7?e?4|Kq2GMw*q~vPJIkBq*e^)aD*ag9#l0A1m z`^bu2>HLf8+?(nAORn>42p5yJ{7oKzD@jUP zOIp5Dr`~-!d+O;!$@s@vwU_-^u^e*p>y0#Le!(Gm!n>1B;o^dK%TDfN-Rv;;L!89o z&F_vlim`>??e@e5y6DVyldJDE9jBQ)Gj|q>D&eMdkBh*1cH|V*L3%Rx4uToX9GoY^ zYc}TobxyPC&K;h@Jc}fZR>3J3mHi_|Tt+S#T9;A-0z3kxU2{MUFtRU(GDaBrSv#Pe zl7I=X78wkImf@~LJovlbU4^r_9CS9iq!@HIyN;o8fhKJDr*eAIvW01zbT=oR2`Tpd&GW!Q!Ts9`TY&sBv3N@MPaRQig}%nm$LY&1PCNTmEh_!Q{Hi zGNQSYBboqvX1h{{nJ~!a{&%j)$QMaQ9+Q;pE+Hd_bCR^9c^T~1R^H6}Xl8qSX6XQA zS-UeMK3t*(!s5$Ddt{8jl_NM!QnIsT1pW~k$KR!#O7BJDAJMy%+m^82vz&^s#TT~n zPg5kHDJOf1gbsEX{p!AN?dLr_D)XE&j0?W?O*l!EEt5t(YNS2 zPHw)ZV}ASN?*8GiT3g@PeEsH+x9`ep^tX%jYc`FapA+W+$v^>t7VEimu)|Px6w+!V z+-fQDQ9xb8(N~%|g4JEo4z}NHI>OLlt7=G#%JhwvRsH8J-0P>@{yZyzm$%;x>f;%j zX5Ioi7wJVzyW%cDTGY$IO-8gz+RBAbIM%n&pFa4{rjRRu7gbwY*KBXs-jvo~zjjFW z=5783{&L8Oj<&YmOtKm9)C>ep=H^FR|JnTg4MCrY=CAis$4kiDT+Qli&2_Wvda0Cs z*%U?nqo#jU3DV?R{k7X7KAL|7PwgqUkLUFjbE|M*3g0YC$a_)xrg3GYaYZ-|xEPVZ z`_G1$Y7Y*TG97io?d{sz(wmJg(LdL7Ki?R?;1TY1cDS|m)+u9P13AGh>i%Z~g~4#I z`gbkYq58T}y_ze(Y5dySGTM5xDeKmZQLX1nZ{|v8)zF6WV2(`BPx&ZE_57n!$v?`R zcu@K^lG-0tcV~v$?JZIMi1N$G-RB%}KhAN)qZ~(kU=YSbNf#gtt}QKK#`LvC z0M?xmu%kDB3+Uq~U5&U7y26i~5iM35hR>5wjub~ZT}d!&wdVw4PrFXO?o`{Ja{K!X z6+ODnTf9By573;g1-BpP_P?yZKZ8#17o$^R8c}2x9}1nm=g{fVK$$&>GJhp0Ia-1; zX9{IbUxp6n&!Izx3lbAt9Gftl8Ywd{X@WSKGd;ve4s_HBx&V<_V{aj9OeS_K=e6ZI zq$S%cQd%=KDQ+j|(oPHX5gz{OcFpBIpIP27{xBbD=;N|Mce?*4gO&rH8_oi_6?Jx} z-2OO+SPJr^8O%Ccj9E8Wd^u{J=TPgTfm+8Bwf;_0@_7kreNd?N*YniKFl~Px!Q>nV zKn+6J{C_D-2?;n~hMk~WoaMlb^={9sx5skQmcN(n<|hb(@%P-Mi|U_eru@S)>n%QS z5T)k3oty8!jrmT6Pu!mnMR>_{|DyyC2Q!fTlM_6IJ2O&`Zz$>bf|8ER9IxZz>qGo^ z5C1*R3q#&Z6kxrSjFy?<&D}NFBRB2(xy>H4#rWj^@I`W)(^$AN=Nu_H)&;}VM{^CH zsg)W%qNiN?Xfg-S)Q%sQxxr4k9X}#}U{)N>+8ZuLgVA{HR@Yj_D8SShwsMaqqX1oJ zj6(XDp~{L}m$a9XPfONi_&B>RX(2SVLtms(!;xt?LjSL2hF*2|9t&Wq6rVqlnc|E;(L^BSLbOGg*6_QDHv|VPPqN zhVp_e0MBuVAw3I-2XOjJ@Nyo~#Do+=zD6?A48(uUydnlsa^**Y2et+nLkNR~fghKA zdyQ|0gE&bUsA=Tup(QxsWC^m*gVcNc*Ft8|7#d9V#Fo&_f1243!^dU&A!P%0zg#3T z&TR%iw;6i5&5#(I;Y@CZVJ{_*OE$x?&rqK5-H<07`;2}EfdU)fq(iVpmZAhn0q%xz zKe^koZUJqeuy|3C#T}G5d`~%v=62fc<8m>@(&4Po6M0vIyg^ zHd%<_x?sP2Ns~e9Ut5z&Sb=DU20Nr)b*f!meD@ya3^FZv+~*>#gISL0@4AYcrpeu& z97|T;f{;8vskWeono-SggSp+pjlQRC^NpxzxefIEWD#&T64q1yADyl_$?zV=_A2m1 zi-$8O1}!C7)C-0e94}OHN>?aXLT`N8eKfj5YA{R;nb_XjC9`SNN12Eoi{nsd1;VN{~Rf&-%H8)63Tg+N|y870QNNH znWqrDgF*)TnI7cX%=gGzuHe6Cc?L6xWnlhZN|N)10JQIfLCBxVhq(X9>7N)UAN)0; zGjjdNsecaHG&Y}=i5&P0oZDkg*GU?4x(%-@AfWk_xAR7@!!4fq;qk* z^A;-K?!4dI>)OpCylIIyP{NsjUhKd5Vw3+mGsV`(gM=jSFW+4wKkx&&=v;I!o-U@{ zH4?{Qd0;o|#YwR^DR%tT$BWf&x#+B{4aqS3*!gc(3)FA_0mYlY8bCVqiFkgzSpA>I z#o9%){{Jh{i}J+^xxAxPP*H>3wlqyJppsAIqxB zUd`T5eu$>L%cJ927~+GOhBh}v&385VcSE+ct{=eeI6lBO_YRKEFZU03_FL}B(XrX^ zm2nm}78oHnqt(r~bvvNZWMiFxHFQua1!xW33|8O$QLa_%t2LPMD_=?LE$F ziE8WB=6W5UYJW60@#*dB=G!{l>pWwjeT2P{W7?;n?0ObcLFYhXsBpxF_I zW3v$bmCi!6`L=0YR4s($-5*Ws;=cNa`~_dGED7x!IpIy~|52~1&9A?GmCsQ2hx|}o zZ(0|DDz(|PE>iWS1|8Jii=P|o5D7*+ZZ=<8ukdm6kEXRIA%KQ1#Pc7}!~NUW^2=-Z zemy0)F|jtkT3htZ>(?8vn{toAq_(8l zu^l<}MX&8>73#bJsl8Kv{d)b~8=~HoYSr}(r~LZO#yT22o#5FU`sp6Dkn|bGMw9kV zd~?fH3<8J&h|ydE{g`vm7g>H(u-?h!`cZnvCh@tS#t@q$$ezur5gYiu z2O7wS$)qS_q(B5Q8sMMoB}QM3A&!iGG#gX08H{C34bYbO?sDnkyQrje|5Z@pbzZBK z@Mi3k0*@Gld=8JtyzNFr$RMBIK!tNGe0`hvf>uxO9#IQ>EGX;Y=c<{q)|W@MA9Ts>4^!3y6D}*0rxa0VCMx9%75pAVhJrYUeviv+6UrqT)w^rb2B_>P z^PI94n|NrG-=cZ2hEask*&&p$Yze>vm-#seU8*hJfoBI(Nis6ut&4ZAIfUC-Kn)=Z zMU!%VR5uF!K-{6`jsmbGs9<>XgJI0xgU7{~j<(jxNVE=r)=MQ=Wb8$I=Rea4SWIIi zL=gP$7^6FJKP+F^hOs*9YG^0!ho3ACze_TIb)kHRLAlg}xr<|ISJ-kUlewkf{-7YB zEZD&?9dq51qehhL9MES|pmP9`BYxavLpB*^Fr0blhnHE+cEWvA#t|rP64N z)@rrQTCIkojxa_8>j8#|5TX#%u>dXjJ&v9gsC^tf%Gqj*`Hz5>;GKv0*O`w!c-Y^h z!&vMK-3qYDV7@WFjd+>1L85ZC32u2J%p4mCBsNqXDPKG}F!c7F4*zF|jv9u{iGmhA z1*yRpH$>8qH2E>?15ThQQ@Z~H>X_RYk=ayqg^si&QQEu4Xsg|TFkX&JTb)ri!%hN7 zWCswTJ?yxk6?40g+y(S9z!f1>pCwS{K!*oeST`|5F<#7^gr;!0$dWBbF1~o3-BJ)g zl)_q@{b|4xwl!c4Fp8@=Gc9%!*41koGZB6rK8*{0%JLyXAV$Nm&k8U-mX00TGGk}L zZA!FB7wASYjD5no3l!=w*rg3FZEQh9K$3*eq%~vN_=Ms%@Z?=$2H^m6Ktx~C|&?ZD`mLU=RvIPS{N2un=GZ(ZCFE#TamQ1JO>MN{= z@bL zM=MMZ{@oCNtJvPxPMBU1jlj$% zw?e_+L>Lio*n^bbg&}_Og^ZDSAYBNFHU2id@fe7O;e&VM=kJoAd}gTCvW*d%eh+h? z2M#F~Z5yF?4ZBuR)6i1g~=t$f&A zS8q1tLv4LiKE2W3-l+%mY2y!7M!k9WW-_tGE7j8GYw2zNGe{x4C%yjeQjE-H4eC>4Pu@sef?INnEf&!VqYnzA32569_gozt%}Ax zvk8$0RUasT)S6`v%)Bw(M7~e7hyaD-0Hc1nfqxu7uCu<`nqp42YrIL+2H=ua2<`A*NMCnyX zGr3?P9nw1zxNDo=V4W5NpCgQl8s@rHr~_W|3a?z2VbmpqV&L^8^gVw6OXLq@PsWJL zcJJ=vY~*m^fAP$w1k$|m?&av6JH9>IGNz&NY;TU(1_&2+I}F4kc%~SoSalYY&)jSh z*@Q=P5*P!z9Bii5q_n@h+y#d>1wae?6{a3e_j>KvFtOI!kd#3p*w|5mfd065vEHIB%UmoY<(W`rD`#Icd z18!~pOWX>nm&2|0%Wz9vl#PDHb_-__EZ3I^Ez(BuH@2|2PWySJyxg_hj+5b!PFLRs zadD{xqT+Vf$wE6PpMeU(dN)6F;viB8DZ;!8ZAxLBiTm?QIaQmltu`Ov)#A;U zulawz`TEK2)w7!~2f_4LHs9jrArZIQd^=cT+2*^;Z9X_6JtPI(9|$AfiXZnd0fEV) z0dMv+B?p`&oN!J~kv%(omOVQ~o~h;}jK13dRO056|5>aBfW?(1mT-4Ygh9GEt?`oB&|jcZ7jq~2R`r=xZ@Ho(FxfX$@ea2 zGNIc_n+96?2k(G9pcs)oH)@xOdzS;@yfg*Cw{OHc`IDZHgtHsxNv@#0X zeV5_6=!_V8kcqag{C+{%{+P0e!ridXL(#_-Sc^%T-hi~BSr+byjmHHZ`k+vR@Cl>l z9EkCPW=%NjcAEy}5nIKDteP?vSijy80{+xb3NM&UDKCV&QP1|irS+iHjui;E4tX$5n zmv}ACLGuLSu#YKkE|apj&00BO^@ItJz=s`HD!DnS%-7$(I!3M$uPGL!DaqvX4I`Da z#a3QcI)TI)PCXImoCm-vSinIotGN7I1_IEQDx##IE1}7v&mc&{dC5X8;IwOw>Grgv z=%BFAoMV#yN%KTd9%!wMI|3#Keg29ylCWRpPLgM_H(^4oS+wy9#E2*!c;*Bzp8SB6 zFpj#jEIY$jLE@N0N06Av<4h!DcpgR*wZj>HAdR^?YGte0accnad@sb-j6j&*&)eYe zB<9J>1`R)<^>&hq_m-6p{WcCscSjf5H_kIZ%AxOlt>`IPN_MS&VSK&fV z)@7e6si|bjd+w&SDbLqFF^0eKIKlsdC9FtU8-KceMxcP`A@l4 zar=<>n6okHL9!dWsSGRl0lWc@^Ba3u#hjXju~IK&?5E&m)O`nT1^;4gaV=}&aE6^> zXbAKabM9#MJnE8R>mfIEy=1+6Nd$Uvwb)k9{kb6aeLLIt2_wbo^qKDR;}x_9`qDm2 zh-KIQLqRfhCV;3-eE|?N9Gihi3n-&4De(v{JyoIkO?cCo!uo-E2}<~6GQU6v97xmL z5}73YS@fNe%?EIudyZ=7Ch~5kOcGuNckRAT8T-M;w@BZEWP6^$}Ln5-ysvg!82dkuc!595Q--w}Yk5o2tBb zj$Ux>9HGvvX?uduTE(LEqIyu&B6*!D-YrHiy&8-J0|bBGtb@o<71&ZnoK4%EvtG&% z_IWseoZKm?$&%li#AuxUTHt zh07{h@|#t(^tRkF&HBG!{kL3BGa&-b3~kX*ux+U-U-KD9d4vvbfQ`!LdVW#7Uz}Ml zn^{lJtmiZw@BeUSA{+H;e3dD%sd;M&yE(Q4 z7wkwc7_^Yf{BmGsv&HyoDqdkti!KFoDft}KY&0Z~AzTymhRI&pR&v8)i=apfr~qEU zG>XYz$W+K@ITZW_`u{cs&pN!$f}%(4zUF+lZhNYjPpRv z1Q#>WOgIhd@K3oWWb}*N9^|N+(7X`UaJa&VYc+?JbezdVXu1;aG*OvRw@0PYj(Rtl z>}HQ&W=e`Z-n4}hB*%*Zqn#tB`am*v&p1qOqds!_p$``B@q?nNsH}17-(-*EAe#%N zauFFD^|c*Onx^GsbnLlHz2@na%uY1kE|v6TITCvf1Q)-oqU9*|6HdFP%v7P;G%9?{ zrxuj+@G9rGfYX6FI>Ac5xYgW-(-39ba+0oCLCf}W#voUx%H;V9FCJBK@5}iHDJxl* zZC$d4i&nDQV9YGoaaorfaFt^<6GMS}i`<$AJjy(k&8 zjQTI53X{nQLa&YwM5fSW%noNfIQMb^TZ~(h41NgblVskMZ;w1rW_^1i>3K&K0}HZ3 zV>UsT{_Gvp5!{7sp0Ll}TZ_5t_;z(N!JF(KD1R2Qz+QCC%!~ZzZd1=PIC*wTCV$EC zA{eY+xgu@VGzYAmkdO^Ru4j?L%@l>j1 z94RwO5r6Ri)nvAmxPIwuI#b!IRLv>k)=oL`oMt=a9j`0w-<-Oz!+xbUp0=0Crrvs0 z_K=iJ4Lgiki%u$yyq_`c-+cW{p>pkI#nwf!oNEEyFd0y%?#`jn7{v#0k)QD&KyK6= z4=7A~Hc(wzQ$1j)nurU}(hb(Rc{KDZsHAl31&? z%3biHSS!&2eN;>LuE2EflJCN85wa?z0SN@_-VlB`V%bB}KP)IxD+?*4VoNua?~ZVd z^yXY61KaDgx?pJ&DcIe7YSG&`XMU$JP6TJl5KN@1%Yx9=6bvC`iO%97{fU9Pv}#6~ z=ITu$lX!~_Lkd^7ybvU}K%epG!r$i)a`wZK1><8>%e#(v?^B(kK3YRn|JkgKM<}9a?oU0f;6}cufiuvqo zdYgY|z(YSjF8oA~A#9KcIV)rKM7@->cG$w8J<+)c+H-p@V)h)U06n8e8M5a`{F7L; zPNBFZzJP7jhnw-I}KgcQkc}vdW z&pYz*k<-m}avyWLxk*02uh--x=JfSj^4BA$Z)&6sf7Z$0@MnYk1AjJ2E9UfFjeLVY z8{|)b+${S;-t$OO@6oOY}Si&+0y#Cl+3coP5adKR%DOqF$n{~TJxf(QJYzytns1f_xi zN{D~=_N=ZE&hu=s-8>keVBq{*OueV6bEoi$bLP5K<}rwu9761kuF85;$1OPo{zp^5r6gpr(SVW_9$kvp= z$<>hzp zbCGkD=o)`z{xTx6jq>=0&^F@L?U?mN_@5`=FN>_aumN5QUgB=mSA2%pS%k0 z0G1_cIDyd($LHEmC>Mv=jPwQpL1gyn^*57A?M*GqD!u*=?%+jA;Z)U68y0S zQMCh1DRD9UT4uiA}J72 z92_A=tu|aO5ox&PGTsk?=oxighZOw-kOj)&ulTIdrtUTb%`nTY)||RBB)w#%QXlg; zw+)My7k3D9%-%UTZ-Jnf3C$(w``lHRt=6`^QYq@VtSn-h7c7_&H?!vYe+jSb3;JEs zpECLeKC?JrO{iXMfpTvr=5;sb^>F)LsU(o7x#BZ0hd+eWVliM}f=p$YBx5Fw#F4Yi ziHy#SFhWtKe|vpHvshRnSJiwhdF$0H3*8CwEJCTo&v=$jR^;W@RjhJQwqA+5hB_T% z{=31Hg_-TGU|#UNT&>l08SyZTZKD*~tSVV6{$9n1P9EqqG=sGb5~XmP8n2AJ6?Vcj z0TM@B!knp0RLbqPICb3XtKr~wh-M|Qj{-8%=O%GU+YuQ}VJp_v2F5(41y{epS;(?< zy@LE)uU=UWP7Ida&&p1$@--$GSG_ppFvgP}BjGrr!eLfndwGQj0d}3N9w3XT_sV)z zzLnoWklm1}JnMOWe+YV@@eovSn9Q(V7z)l;di)f|0=cGB2ZJ&90QoSs#=L{VbzY1l z@mF2ioVo?Kj@d-Xz(%zwWXm$XtjjOrgh!dAOIuB=Y}LJ{W!0_KEXQlvEr0#(>y+Eq zKupo%^&|89`Sk2zoD07>4?{E3*Gbsfz($79UO!E4cH{mq9vrf}Xoh2o&gNLkHTxol z%$xtch`YZ#YXjotb{?k9W_d1B3mTDfh_v?uR@YG>!%F0j;cQ^{5awY3L(#y3L1^H> z;(#NFNS+`jP9{jSElWO(fxpe|x5b4$osmaF%yCf#DlY-!g9# zsA@w!5nH2%3)hY4NK}QObD*w5`y^LtLA)}xh*h@pw^*bb1<)mUuvl;?f&s5`jK)LK z>R4s3Y+(raKvO!Xy~tzc@@zI*p9qU1hM>as39Jq0V(Ez?lxrw90<}}I3WKnVp3qq1 zuU46=Yn~&4ER}lasP%#$dG4**DnrWFI{qnGq%}KGR}Hi^nOGeh=A|CyQqQ29pDol} z=s?3q-x$9;H~taBJ9bf-0>PpcQ0-@~n*4-D9SNf@%+-L=5M$0sEJ#>}19DnqG8@2W z)p!#cA2Bs0bLasfqJg+s^`)qzIvf}sW-S6Psiv4$Acs^7%=Y^~$En%b zo{fhfECsa`iGtJ72!GodgR8P88RZPUk}RHmHT@j)yF3@6UJGLda3m>QB}v4_P`}GHvxnJfH)!}K!Slrf^rR4rJ8Ld<)1Te zP1b~?NA9J0d?7B=c=WTqc8N%3)h{)2U1q3&ZR7#haE=g8^dEg`H+9)fysJ%Fchy%$sbs-ywRJM<<7PN!8vvZYz#F-WITMi7x+J=doGCoUn z=wfLWmoSI{j6-_`sDdcsWsb*&Ebak0UdCAuS2oA$9+?4K;Z|vw8DooXovO!G6~wI)rRn*#1U_;8?TWArg{A zaN7>Ce?ln+81_S4y+pj|U|XEc7$*&~okuf*Xp94^sQ>RN3ofm4!Wt?NUAt6*TE#`x zkS5H(20Bg_&Vu8WO6H*;C)ZHhH*IyOD6%1-wiSdW1z}lMcIx&`uFBF1R>9JhG(bAgb8t~${1kcAm&Zig_pr@)`yKKy*H9^)h;Fi7jeaV+9Y`*Gh0egmjo5!OnN5ZN{>2(~@fdOUEFij;%KOHXLEFF*4-Qlr zumm#8piRhx?!1gQYY7l6hM)W#gV7Q@}y+DT(vgf%!JXM|{kGm1g?lyZn(a z;rIJ3<;jqwqG0}=rSi9p)I`Z_Ld$THy@iLEXCL!COnuenvGjp#e;AHeZv;>_m$aph@)3w1qg%3(<>Z3L*0C zW#J2#Eu?BcS1?;uVRs_O;~0$B)fu-fD67njIlJeUS~ImuXL6N7NKm_ElibVo7~QbJ zWOOr_42HqvCLT<#u5Tv8UV`)fI6v>3OR?NIot6x@RJva}n?JAF6o2dTGvpLgpY*6d z%25v>x#W^jpPcD*ytWm9ul`dKC-rYTY)bb4O-~`i<5d=ks$? ztKuviGrw;PrrTo zCyN^sTe{^ug*I{lJIwyJ!z#Dw&~A~hpZ!SY#W_9RuNPLHu+|hU=(w=*l>7Eogh|Xbxlye;hNb^D=(gqZI4wlU4>7lY(w#ulesUKB zBM7Lv@&rBt(@NpDlO!ozgYR*+etmVOUmZiD;8rB&RMcvSbsoVa zYDZ79pjhKCw9A0y5R(YgKQ-iO&&}G*d}*+ScW0awR96Mj_g4wEXSA6B zeBEk(JLC1%8FwlJ#_gvt8FO$)tVb2~NML(opz4&98=r^p?DLTLxA+Wyh-$f>b)u<2 zpq2|=nP#_rP?>o%bsCasa4TcRPXzfebr+?Q`2~`vi6;p6m&CRue_F(b(YqD@3Kb($ z^&KrBED(0U?;f)u_xVi{gLCbOZaq+E`P^;3211KaKXir?@FPG=IeKM7!vxcUP}I4Lg>Goary!CFyEbV`Ux+}J7=7J z$0zrU(=&Y9KjZWxJ{_KM`Zx0He;Ty>Zig9GZo(+@%ML@Xi`?xnB`+U4M86i6ZXm{3 zIc9-iagXp422vig5`98~SbqW*zy9Tn6JY)8cW0acvsT|Z`{_g7J>yfIQ2Pl^ z!utLhCxE>5!!u4mAd$v?1j*)!QePj%;+!hhNS~!j)>MD$4b$FjK0?csfkh8+)*1wv{na6N{cRM4Ue%JWv2LQf;y z1+G&EHTI8W*e{?*A11SMrb??0hACfQE@kE}BRpu{#AT6C46He3#90u`GcuJc$84~B ze>4An2b47sNK#mReunOaQL98lSEAv4FC~1q7!BEw(;bvd@L`5jM`zrSX$hkUJjI2& zK|8_!Ec;ueFLN`-JtlRqMS6)F>K^Gy$CP>t zBuz)K`Qs$L_M_n=b5qEwC+9yN3VyHEOG&z9{`Ys7n18Z&#%Y94pU*hG#HVAE^Sk9k zaCl3NbvpHp&3`InYWq8K0dT9I`X&W{Z~o0q^dLU!^qGK0ryw$$r3Gen`h+5MpR>A> zD(;v$=QBQ?HjdFOF=XkGkFmY|9i}E@EGJ{Pmy+Rv$Vx$UbPN7u{mwo^!aP5CX z8-Bdu4G+lxZ{*cr05QuzYw35%8D$GTlr%>=u`jh88`9p3Rw*?~m zt_MdI`Dr;UqJ6AQc}X~h!984Mbmj6KhvD{8a=Ty{w+7(%n^@y$htUN57Wa0Tyr+b{ zV~{4{*XCKatuDLEwr$(CZQHhOce$Qom%D7+Hn-m0nVon3F&i84%e)WrOGcg#88@yI zu(5zv7c} z=k;1Z&aSYnt$^HZWhWcM19tXVP{2S`Y6>_t3EK=X&M4{fsRKjIC)8E718+h-V|!&0 z_kgQ7zP?J=>CoIOf8<}Z1^(ykp``uBoRQBmLE%GesmC{onITUI(c8G9!t8MP5E`61 ziwMJ%y+a zx3VFzn=+yoeT6>->8*5Nnlg*nJeiZd;_kGLo(zP73y@h~r!nhS%*`p*O8A#g_5;v$cNJlYxM}~+H zu{a|NCdzI<+u|kwd*Y5p|bafwtUagZP_gC)B^ zVxhW1Ofv$!h!e1eq~2aGW|X_h4(%ZxUbu9|CWNKl!cT^_nti57gFPiYVYdtA;a>+| z`l1A{LUk{P9hwWgEYpbhafD)iTSJ$_wd)tB)){6!;+M>46st_@sj#~St% z*{IkhYD2tfpivDRU(9tnRTzwX@GaO_fjKg3Iv8pbtJgTl3fDzktcYwQ^(at&A@1b9 zfwQ3ZCXx++zzsQ%CXW~KAfcWO%E}sGoE@s0^kcrGXwjEv&=bC6b*6=)+QP8kT^5sb zCXfvOv_h>tzm^IiN{+NN;03fG8gql`;LUCG#LPF+29W)E@DUV1U`SB6#%aJME3gh0 zs?hwbp+zq<9AA)RXpwWV_GX}Ns55tY+pU5Tt60rG;0Q-G`G{zPf$Mh`MXu^A3^zuJ zD|~RbOTVTRy+F2E-;?kN-;Ia2ODl0Fo--Kt3$;;p_taXa2d4#Fd&o@I3GiGGUv3Q)xahd+}rLlg`BL zz)toBC{}=}bjmY@Lx4~(xd~|6Jk~;t^Z0c%GLDPn0I@a$-T2YDocpw$u%Al8$(FDo%1k=2&j2hc)}*)UmqS}c6junJL5EvaUhbAqK9kA_01_3&J50+ z+)~>}@QljdjC^5nhJ(Kb^tx612%wW#J8gF~VWjDRS?Nf!t6(FBOtj$f7!^|{DnGC# zaa$yHZYJ2tS;ohMYee%6yZqhHWuiJyVLnI#*#t@BHLtgHN>T;!LNE^gg0APEr3&X} z3QAwU6;3mn5UCE}XjS|;U<&8gCh1gMl0w;7THl>eG`PZa?u_?R*IjD_q~-W1_t; z$I1xj3LQOaa!gpf4@G7#I;wX|31{V%Uzuf5;$TUQDQa?{l;HL}nMwK% zHbA4uMxTOM@%YVj)U&@^+P;!>(9OT_pII$3vZi66L%-9aC1E05QriKn z^Y-}#0yo+p2BTE48#*yNx?7oLw@>WGdqB>11YHvs z!r&czq0%LX`c?b=BP7N_$}J^LMj6+?IUvOl!vSi&Zaa8|X*UxEo!WbjB#R`GEdJ+` zLX!LpKXIWruNs7c*do2=XzZvP9op=^)?0|tofj>N^CcxD)-6sk_lVEI$L*rfLR&@SYDuZ4`=%0@r~xTM6=~@3<3e7z->`ohl}yR zifI7QG+-2(+G0cSaC_|F=IJe}H1*%r_Q0IW_l?Q(;FY7>x9BmGWf_TeZP;G@2~$sO zI%E9+WP77RDLlTkLl}a_)zg4TJLpX;e(Hp-k`3qD_OcuJJ*+K(1B|h~p+5-+9S&B9 zHZvxYBe#j;w5nWh^XwyCvl_>amfm4I97^NQvTBOgcxE#npNzmD5GZxXSGxoFm@9Zo z4Pu;&6lRKVDEk1MCc_EjhG*vx-7Xt{z{H0wTvQPK?4?1*L?u^{5t9DbDG&;SU~cEc zMF=QeJQi4MT4B!=siVeKr7i!aLGUBStYvnY!mKHh@^sf_AT{YR&2OttmTD>x1iTxn zKvNKXm717j!@{=p8)e)hqa3J8V!{q&g85R|J>yO#aP&lkrArvb+;EFsx*4A{FAEz? znEOH>3g)&bI5FnFr2kDEC#%J8%5GZOx=o2H1cMmqGnDr)Un{6O8fK-R~iah+O2CFcV;In>#HsAt4-U(_s>FEs%0GMbnLGaqf}bUh!R-j)&_4TyLF0AntmvbnMh_N1mq{;3(o7owMg^Y8wGzh5xfc^|P zm~iCYq$IO0W3!t5lo z`h8_OmP4$sN?9T>X=6ctfskguH51ae%0Cv;*yIBokC4M5EoCo(8a)er!IqhvZL$@I z2M^5B8v=C5I==76BZ*r=a@0kIoh+TYO=zqsSrWz(T(Q2MINl6SK>i{+B5)q9P-JT` zWMUw^J>X5}U?-JHy75d@!4POhzLbeBb_&26Hbo2|djG7nFTOg|FoZck=1xJLd~wZI zC{zf>W9001uX|E1XjTV)ro(rfeCgb7Byc)e++r@VGuN59rgTTSH%GjO?4@nk&&}WA zzv_+7oLa9(FRAQE?8F+Ay6GO~|-+dNf7pl4kNDqx^DW6q)i<(X)W2J+TbkSGnY zRtP>dKk0nhnXjRn_GOg04LB7=2Jk!yhF_=ZA;>;ZDY|kzV{L`;!9V z%ukB|*}C}Tkm8KfuyEIOWEQPn6H>6Lb6^UIOQ6~ifEF%Ud04^03_H!VKpp2+sJe=Lsp}j0zZ?~1>EAWES#D`KNHr4Y_r;4 zYU_;TuvRDQTI(!(_4`l}?)IV;AU;#p+v6&q%>;9eY9nG1jCI6Gn}V&!rT&dKZ&|ccml~qwdgx(NfDgL;&g0eMAs1!%`p7U-4y6^$~%;RKn-`lyxuX%2jnUlv;8+Z?F~vq$(*QQ-O&xMH^3(*i!=Df zWk#1F=KcM)cddidQ~L`L9|Khv3pF+8pv5S(TMEYe+Ha5|<~{DN36nSNMYXCukm94H z_UC=g58OnNyL?>Hj+!g;Q_4pceG~1=~C{+M`q3Rz4Nq!Y8j+80R zpL%)5qeL-SX9V>-ofwl|NnG1`drjW)2$x2-&&RHQR2;P`36lIH_@#(*4ic{n{>EQ( z(-7?A5X(!%R3F)W(xf)4rbd91FNJM#l&5d=tIPH5k<^jh?`!$Qw;M3;;C{{YTsvGcM)Ep&=cx%$d#A<2#$rrL>H z_=JFibZ<(@yH>K=<+Kwek6y-?Q9YZcj%RyZwQZ^JZU4@iC4-B2?K` zS~Yl}k<&$r3B2e{C&9AO*5#1Jpz$u6Bwxxh?;>~glF4P^rSWqSvsacKBvyqXpOmt> z08Q-k{hOIRpE9E1_eE7kKMfJKx%MhX$0aaFnVZ)(B z;&EDgd3fb<`Wo7pJ&l7!B>2}%&*So6Hy_@34W)_iCmv6w8P07-rJGZqW6A#8*ComR z>idY&0N*wkyR;`*Cc}^W+Itl5aJa+RmT=41_{dnA_*8b!aLUvytKnA<{K{4A;(eE7 zQ6`A-*DRW(llptM%*wVcNi);fl6y<>OcRp7)Udkv=VJg)M-Fs5a^UgVdF+=&ef(;6 zCf4Fs9t^STF<61KNL(Dv$qoYgB#u}0y&T)Rt@|iMjsm;kw1_`RD%7RxUTiLp?R0F% zW~dU;0mV@WD5&1SVQ7vEoDXpUA-~*xmIvzHrq79MT`2@N3AIWLiilYurZ5>Ucu}zJ; zqSIBjM(@QH6TRZ-jU{&WM*dFm<+wy;zdW-|Qb8?6KVlGfnWp#VbzH5BJSIDJkP7L{K#$g4JJiv?P*R8mR=fCnWW1WM7RzYu4G}5}e|sCtpgdhE_I^h1 z|5m@z$1!jPQb|4{_+_FRGKF_~;Ks(dG3NF?%lQ4_&v?Y`_Ou;WLePY{;U|LJrSg8C zWK{BKL|(+^8=PAJiOFrgZ8Y|kJCn$RTf36a?Lw+QeOUWm?Cg2|b*xD$@~&^5I6p`j zA8(e}EHL}^IHMZ6ZEqjSba*tGX&l&=@~Q1#WtD0yS`9+HJGJ`LjAZ$*%()-79Qjq0 zNWZ@M_~zTWv7575OI@jlhw}&lq3GObHuEb~rIF%xP9%kdGUN4;jIS+pE7%#cE;h4T zpW02D<=~-=v3s$>?i4xuZwBO@xO2NYT`y31R!LkdqE%at2P$Be(9g>I$$ay~sHb0% zf7)>f0&5Lu`b#cj4MLJ)spL@Fxe{FuP!!L0>oQ(+u-wnGja-1JE$Agk9rk^gxDGhp zFKHz)kejZy0K&J4iRsET4ORIS~EjH`jsUt}Bmy3&N)j**7s>ZMefGridcVcXllA z`~z2>HJYiPhcHVtG>G>+Ws5-5+O$(&;g%DTf>_wSq%a-c|B!f;IsFelIc zQe0Zo+h%!nqux~@nl@LG!briRz4HS(n~+067IoecwCu8K?pyQ?7p0MszhTHXRL7>gskc#8}%eNRKEeFM)sNvqf*nmwN8^@bo=p>h|lAtiUAy;pWl7 z!Q?7`aSd>6_toskjpa}n2K1;8F5Ymt_#H_O9?t0oOjtV1g>6~+@y56JRo;(w%-?0z z9)>SZq>Z#t++2v?yrAJz+(Z%#)4 zu-DHSnQnOPqPw73G!~Twb1!WIm$iP4D?|5@Jer;^jkdg*BC@5|%M-syzmI?%_Ccl3 z%J3qcG+P{QJHBriD;?}f>iJWiztbtT##Aid9KzV_1iY&gSqv9_XE&Jg9z6WpkYblP zf{i0w3oR*?L4rsAP5ANfQSoHq-!YRDC56pdcpo|c!l!Uw0Xi!jI%MqEPXkazfjOA& z>msEcqmw3cY^lKL!tA1ro7rZPD!!O) zS2*(+-48-XA;>yMIFxx&rT)@!J@^?n@BI<3rOk11J{A+<9Ud04jBfL2I{S6RaPt#f z4$xMNNA$MixZqz?k08YyLUkVC*Zduycw!^XtwQSsfP72@D?>CTwy0oi%5@7KW;dx? zfbZRfgqA@Y$R7m;!oKf|(a`ztKxe^tTD^OV_82=gJIs;&ODhhi``2IC-KERo15lpS zpD{zsJ1(KpsIE9U2ooxncxS6w2sWboB*lz|I&*T=>}(KS*Ty1!L(lgQ&r13K)*aWt zIKF2xrDqQi;#T#8lcEPqEyT_r6LJ4V3je`C4m}J!KPUO~D5EG$FT-HC5}d0yoaEY)vny>AcxK1kN6djNb@Xq~by#k&j`%k7P$PSU;b?N0tNJ z=_Y0|Sj3Gdi!9RaFU%@`>xTpOJ1bTg`EWDv2rY^NroY#)B*GYT1KB)DB(lj$a3nBr z{mC7Rxj@#>oEr*>L&2kV^7_5@^^@@Ed2q(`n)zo~`WRVKJEnqc>s7j&`EzXoW=(K& zk36&an&Axqkjzmu&LUbN~5AOY*$7##mHQ1Ls9?#-Ho?++n#y}?MRAL|D`2piR ztgmp9VX4fT-oUsQFU-&mqodjot!9U9zOMlvK?_q6o>9(-0I{ed5Ykf68Zn z5Zz1MVC2qhcJ07uBp|PGh;Aloadn+LzJ2zeD2O`fA0W0go2yA!-OY2z*#JkAZUdO; zwsKzA-$l=!k}unTsb_YuH>~Xif(Bsqk!asIr=gTs(oQ)cc(CsQrHnE~h>o|x_OI0Gn0F<_sokm5 zb!IQdE^S$=;6cLvDJ{dX-PO5dNg~(Fn|ITGcBAV0T@fT5&V)!DStRMsAxf|Div&IS zuz0i`mUy_CRXmqXL>~@_opAaABCmP8z@JMvep8o&*s5VZ(SjRt?Ln_lmY~fd8P{p; zVSUE5&vd42+ikwgonIt-%Qu}ZS2}Cq=etyV;91PsBbG_d|B8X9QuZqDJmx49s`i4Z z^`fa7y@j!b!osoVn@7LQ-slqn9$*~w_%4fiw%6Y0Mcu!IpwkXn{~5Udz8{2-ydQM! z{|ZGmhxm5@02K{V%iFb$+bIO)zh~0ue+tkZ_ox>NW&f}~It+=wWH|Qw6-WHdhDoC{ z_iHHaLlMh2UE^A|H1Kn@54#KViaH>J{G9b0i(O?WGx-JXdj{fZkbs@gv&7r8IRH!P z+f?3@4Dr&I=4&#AjwycA6PDX7c@L8tU_X6>40wU66~)>wW-13E2nQi32ACQ`@QG=^ zVDVzne-L)S880g4D>nmYb3ND5j9i1;9PhvbBPTG`0prEozU-Ju69ys*IzPXF(;?CB ziEyV8DhMe^6{-8Mt{UtpK@O(B_lInESIFe;nQ(RF74i3aiO@dur-7(ik=OZ%OteW z!fKzKD6lk4C^f}?ZchkVeOAsQaYx(X6InKcoe3+2X4Xh_L=P?Zy3jTxrEo}=q~D2d zs?EdQ2{qZ!Z9l2Y!n7WapKixg9NL8k^NF`c4OwvIsiAON7A7dpMrU!4VcEDE&+#kg z(2)&*gWHMQ4Qe%{^&Zzk__K7Eg!m9%T-*AwOUXM#@S|751aEw@Q5F5v`AiaX*!k?M zDsiB*o0R!L3~7~5zBEZ|Z=W=Bu?{yGXGreyE}PK{51Jm!JY$;?X_pV)$@sm{(dAZb z$>7JRvsUo(<-t6=qc8-^Qs#?YCjdOHI|7G=X(2*>{8FBg!ZQ=azG>y6UU>Gk5p9GR zST1UnBj~X*zZ2bc2G@`D&q6kzt5o=3=2~8`o6bMRlYGshVnh2u7I2s;13!k)9SL}hNDXu>inL5m9C6OQ0L&#$?G@wp*Tl3aB4@dbl~9cjTQ1Pd8Lac zg#O~8cT9$8P!1|7%!jgwY)tsz;#>H>1LV~882C^(5M1Ey?ZT9L22@*E5o>+oHX(mt zOV5h+=SSxceC>tJYYp_(4E<%gTo3GZJRNC2Q9aKGpC7{^FtGP;frlrhG&q3 z`8YYEZ(XotVs5zohBGjw(cfOxV(!9zCNcnKJu1!gFMpp~sHBGAi|(_qa{o9oAcr=k zyEU>wlkiU9?acfh&oe+$n^g>xGmGQImD+I`fYr?4+bHcn@s_&DFyX?#Tk%u8?9yUm zB!8>Mr!kAD0lpd(!V0M5ep?8JkvBIi8Mu!swn1w5CCJ(a)g|)})~?9Sm>R&y7UJhS z!X)8GP%q5gH^%XP!|RI9(2+q-ZATth#R-NwsB?#Y{=xiu>-w^`%ma9(e~`9;h#e)LYo!m&Lk4+ zhks{X_P(PqB0||hBqu}zKNg+&yNQY`;n{XNgeubHhyI=^Kg^RjUi8yxg`@wd_&{(& zg&j-I>n?$WiaxN~OaFn-Zcr-iY>PIZi#b*DH~lCg%9TIh`(Ikw8v9kq%#=CYW|ki^ zR=X@;WWYNx%FU@`R)BoGGMJB-PK^1R$E{}@3hg`&3l!S5!`0mwkPK&imzkzI=Rr z8^0$BALmb@^S*EL-UoRH^$5`q{c8i#i- z652J#X^&C&h_Mr~$I!{Z;m7D#vA~TrE`!TD(J)$Q;>yNjEA1R=A8xfhCH@k$!TFuN z!y+{7DVY;BKW`z*D-omU)|XVAQo+n9XO+7iBYh*m-h!IQ`7c4n#DP;+CwWs9{^ILK z0Gq{aj12K%7Lk0q8?(RIO3BBytT!siq0geFRr`aIMTWrGOmwep3;;ljT+NmCm%;2ZicqW1CsgGNW_N1~Cf2rK9 zcX|YuU3ny|KFP@YK}<-9b6nD|r{P;rB;vj>r8}SH=p4Fb^bnyTl|9*NDCsS>Jh_d;nH%#U>I_@7L=dQheTS)(x3xF#Vd#eEbJ|9uv z=;>aqz~*X#VUl*YbNA8dNScmC=K#dNW}^|VTZg9gu;|pGpWT}M_sZ@VtuEv9xO;eE zc9-S=eABOkL z7tmZ8!8`p2MR3K}4s+s+fmi@#`LDfrqXyB{2CfPGuveIU)PuS)0tF+$SzQGAYv2D%Al;p;;e(`n zu=e*e^ibvM{PUXK_xP`adv&{h7d%Lie>#D@Jo4@pZy@p(j{j^us8G++#BrRTw@hKJ zC>m*JV2b#`Y1v`yJ{V!92sU-P)5?(skIVvhwalaOD*bnoPFxw>99LauKW%tud6SUZ zWt{$I_EOh?Q~{9ow1#F-1G5JkP**2T8=u;d0uFJ4D4*zV`u7LGyY7P%c^&r+W^-F; zp^c8hEQQ_}G?@6|vCSb-mpcNYAvZ#i|5iS}3Cdvq)~w$SQ`E|g--2aUz~f^W{l?Fg z8nc2vuvH+d18%=_FhNlNeRP!^xt;|Ivk7g|4MeeM@RWd0An|uGS})}p<>@v98nlt9 z0Vrqp@$anzZq7kzV{}N`OHjPr4$c$!La3?*g!HyVQ=mu5oCe771>HSHa~7C zL39$=?9!L0U>A<{%q;vo4+F8DlO$8iJLqdpVA+N+yZx?|$9j_f6Fo#j0pk=X$6nj= zd0UsB@MKJ+HUK-*Qk+c|;)X8` zQ`K^6wT(#!T%r3+F%Q)!SEE;CS5AKW5R=Ca{fm^aePh0WXKZVL@f$+2ZT<2m@Hb9W zVPu$6D8snHF3oO@2!ciT?hzy25egPbGzQl_4Tz+!;}LeQ(~;vhS5=g2os|oh z&O-psPP+9f2M8I%N-;(SZL#ZYFc#h~;Xp8B%+Mst!hK7S3T2s{-a4R@VF-GN`9*5N z6ndjbuvLIm>Q~8*3Rn5l0z<`513#It{q9odkxOL(U%G+(;BY-2xeGX7eji-YI+NPv z`K4uswKl_fZW`Nt1iuLPw5iTZa5!&JD3+{gAF>fjOy<&y1Udu9n2`$^3*8AMz@FO**?W$c0@|0>tc6XNqr9dZ8l{_^Qf9YNUP19nJnVNU=* zkg(6BBi`jUu`fa341%vA$og^;HYm4ZWIKPvbB4T^qXPC^@?QX7bYQAkN0sV}nlP;u z1f`>oJ)d)fp=7DLN|m$y2+;X0ePr}+{P*^ zpIn*3^D?qNIykcc>R9{bR9N}MT8lrDr-Xw=dN98BtIr+~Dx^fh8HX;F{Z0=h1|-?U zF}H!@nahI6K9P2Z<&hl1rzR{)d6;gp*>*|%!O>IVR}E&Vn=>_n+kk{(raf^FDC9C> zZDpz6b5i=%uGmCgU7)@S6wWdBz`_RuD`uV{iF|O-jtX8&T0JLE^9j_j>Tm<4OoyE~ zwH#i8@iboWFt=3a)vbZ%tIr>O9KzPipkC$al)pz&js_+EFeHADH{?#L>tk36u&e7X zJKHUmAhbFP^KCQLL+|(y7pyZSG z{;2APBYae&!~{KEkX*yf$13F-U+}o8A6O0clSZazUjN5b*`pL^Zs!_Tt``-;c3R*> zp1I7J)AMfjKg4Z(501S-y1n;s5_a3?Z}*=8yPzCFobQ3y@#vN;2Jd7Dk_Y-!bXuI} z$w8hN65@hgB2KO(H%=l}jyRZBZU}gy;?f8mRw6f7WSUXUk<=FTNCdg{bRxEz2=-zVg(okG#(Ly`0td73)W4}a=o20L(S zw2gq;hN!mvHu_qRL!8J*CfpNyIy!D3;;w&TcBMdN0bxu_QD*2kFId;!H?6GYW(#M; z;4I%elsQ z43C@H@ln!wk6Q7~0Fr(O7Vv-MiP29y=dL-?0}?r=2lw9IJae>H;Rne`IXlt|_x1-E zvaVo51BwkUfB*f>oWcL_)6@ZN?Edfo@WKm1y{v-yoEEvM`oKL-)}{A$73bk?e}^^V z5;5m*bHkE!icnh*Xj^*YV?GyxE7n3>eUFT%w;aGCXHa?mKj!=HLPnV7z=gZ5$LVD^C)!=3)D4El$h5v>^JLQRQdF2 zbx5-dL8g;+jR|Kley=2Z4A?KBS&@^-d?4={6puUOpLpNbT8Xj@7AA zGvy1bSCVh-vsvMt?Wc?TeEfEmY4{B-x*2j0}zEuA!?zTAjw$@Uu z_GUd_mj>=dm9Op*TEAw$#b=+twpgXZA2GC;u zn>cM|ufH~>W(_B#thX}3Zq`qv>Z1NS!SC~b9H~?FbZQ#Nk|@zSGr}7ZhxbG5TN=_o zT(2(mM@_r%f@bc#3PB}F=H+iX$Kdw!-Qv4kdvw~%v+XIWVLI`C7hSGXUu43TT>z69 zt3Si?p08uSNdYY{*)rMuW1rXOW5zCZarhdYAHTfdPtrAn-x1wtYo~EgR~J|f z{Mcq=xvSsW`cq3RW@j>dOri6@v8vQj`(Gr_9`Elx?4U{1-fM41oPQST?4`I`a#8hQ%;Oiy{Dc^y=1s}QyZvy z(^od;PcvD`c3V4=ox+cvw{jqmsnMj@Pf$Jd+wVrcwd`vl8_KjN&>kKb|6g?@%2z0e z*)RP`u3k;@AN-qNvWK%P@7QN|A^i6r)1_b3=yu&r^`uu1JiF7F>PsiBsnk6s5u`E) zRgW4{UN2NUa?$n7LzgvoUDf`FskGawlJyabD3H3Wgl;_4SFOcUKe_#4qT+e3%7>!5 z)kl4;ANxmde_v_8b;0ADl`+SM$GST$3(%bO(LaWy3`z!Rb6VGJ;JPWsqXw>wOp+y+ zJ%(nmH$o>hK+k+*2?q&J!qCTL+az-GN0$L_*d%)Wn8!%~^LhX}0twoMhMhr+K>g|l zm0l+;)H5$jbv0LYGgoyzS9LpgaV2*#MYBS$sa4JaK8I*aDiRQi$%B?On&xZzqwVK^ z8=kCS!l(%{sYC~$pvW99Z@7h$Fqq zih{5eNJ-A6^oyZ%K2@cBB2rE}xa1mn^@=Vga2$M^RJ=Nkb>~}Q{qcLS&2o0@@?#<9 zIJw4Ss7PXIu_bg-j@-|rV3@5p(Dxt47$_>w&%T6$S+3Y9l9i`+WAQxXZ+{ok=0D_GH#JptSjF-zAschc@l@ntte8z5}wW~pZpL&wtvwv zaf4OeTDb1pK`S_p2xr-pWbve9QdBBd>0tpo5e`iVXIa?A7G2vf$1zInd+Z@rb~quT zR%SdOm_ohnc)=UDT$1vo-o@2VdiPZg)gb$lZUs8YYN}F?M|cTU;MJ=oC0H`FvcIb} z@wXtnZP)uIf21gM=gZV9uj5_B{8A`w++RO>?yF5}>Z{E{d~p-+T7+!Tt~T-4uJ-$0 ze?!PPM-1rb1wDELHL%lI-DVsAdFJm28$Ltd)UQulzJi}&f5QjB!M@+P*YR`2lEKKV z(nTNL>~sqsz#6bitg)d7$zEvI0A-B!a6R5OM%^}C<+g2?S|_#VyY(Y1c4!34VCgG6t9ybQ7=!do*!MbJUBza_o!09 z35UwZxs!~s&K+r$+t;E%8b=9g0xO_dr=K{QXnJh2>84qyn<$%TI&89Or&*_+Fq?4v zTe-bpd&cUT^(LcRhOZo6*|(s3M(diURXeU$-LzO`)B4lc?Eh>kRkN;A(;{f$wy;>3 zE|~myRxEo9Qjrs6iKWy@`l@T^q;i0 zhe|~r)rc^w7QIr2`Xq#>HtU|>|CzW#axBujM;$Vr3KV=5XvC@zNY#O0 z>RrLqn*u2h1=X7ZXxD6m{ZVZTC0JRjLP=Vd%24vwnG%ew1tDdr1_R$=$6p5wZ{1`?X$%A=joW$}2?3QceNBgBf$QnR#085oK(MH>HAw??%ZB8-ty zsuBMiyU9YcuMw&f1{+i-@xIdCp-(LSF7vr3e za2NYrmDeghgR_;e-o2Jq{&tehm(W&AYO5u)Rgv4O$gWjnwJ5S$7F*4UEtbSqN#d&h zkA$f0Op5k_l(Y41aQjLFF1*O083r}G^fwYUEED8Jl^MHiV?(ycP_{_te-Z_g$5Mq+ zsX{wfsa2xVDp75fsI^GkQzaUu8qHFTQK?2dSF2T`(^_S8lfAUv^&B?FdTFL9<5(Nw zQl&YTvvF28Ry%J0O%BCr(*R-Z)*Obk#7tzffoOPn9W>K)L4NBA`*(&WwMl?Q`iNij zGPThfM8?6&#BpYPwLtZYXl7hvoJQ3cx=gOCkL&XFtYyA>Uanq_yNB!Y;s0^sC%}Uo zG8t`k+Wq%LTGRgw5mzq%*W-8fq8v7fAJ+dt zCHD==B|y3blzz4scd5xTo2*icMY<8c2yJ<;B#)(%LN=&R@`fGys|;jNe`6Qs!1Ci) zwk|MMUa*>cr38+f4 zoPsRaF>n>oJd0+jS+<#E-aeJ~6<5WHbepACQrV0jR6eDw0_Ga_qNTY?d9Grvo0#j5 zBi#sQK630r{_8!<<;r@lzh07}kNnqXmdlg%+-|*O`H%CR}c2izb@0WkYHm8Z%W z;xiK2#2S&u8WHuMoJnm)1whFR*Vr+qcG_m4OTt^_Ok}kBr%hzwnN6@wg`trdtgAQ5 zHb=GtJ)w@9bxPG#{1<0`sToWEgQ|fPEAq&nCg)WUV6Ar9X^}u$Y8U~mMTx9MF|2c+ zixGHB{{dQ@4oQ?g$rgA3r8umr62GeCrwZAla_WNo|L%k;s!zbkX`_oS3&yfl&XTjP zm5608SR~`vDizCGwN%3SGq>#k4Pp_!X_Njh{+6*c(#qP%7$=_C|G!XOq%IuDDkZZ^ za&D1c*r2$vArBg1WNH*HJ;8jwvtf2?4~fwjkzh0;N3TSP+6)o186o2~M#O6TuP~Ij zlAuWTt#eP_*20pZmdtvKl}`lIGkTfp_Xr5}tM^DeR+K2*Fmad>vT$QWp~jE`jS(dV zBU<$T3h$oRj>PuS;0ZJyNKjg%oLZvv|0imu!Wh;gRY=h)L>QGqG)kcwB`}Q==thau zL&T~PqW_VQ2|Y}eh`B70G5CFOB3=12?6;(+|e5 z6oqNh6lUl{86nQ(mUeQYe92LBl)KCjpC40GIX&KKO-cPAs;LyjdIXRK(_pe-o}`*D zY3575`hNjoK%T$#nPk{!l4YMsrhO*a_L*edXOeZFN#=bZAr55lNq+S>wC{Lj60xc< z9W|kzmL`yOz8ggigOs27IWFH9ux3d}%FsO_)iASE5wZp|&5~eI%rs5Gp_pmb1U+P? zu%m>smL-S_Gs{&msxbF7s2Cdf7@hPaZ%#wlA?bM$^YxDK0x8Oa2XS~wd?!O^^SA^K zxEZ`~`fzCjeNFe_QWbafjh55knN`!k?Q)621C&@0ITni|$K>I;eD|xnDu!%9|3XX&nM_KhDFX2*hw?9w=&n)yufpI7O#5(d}-}>oM zz@)=`@|?f_C;(5OB9)%@9|aIzWWls$u3W zx)J?*6znD4R?pGxq^ekjwXYB2Q^;T@`v*nQe zG6WCL?^o3 z3`LjELmu?pV7(PwyLr195M!e~uw~DaPLWqwsCT z!*OUVrx^u};e;VuHaly)9539J2WwJ|oE znWy7?EB=35r>x_M! zai5ho#dM(W-Nghb{#JXy0J4TOi`KH!=xHgRKaKYHllOn^nWw)BDT)O7wdo_I1Mma> z%Mfnp^@-rU3Nh{Kk#pzGR$+97lN-4GnE2_h!u8rT2F17l^M{#5;VQh$VZ8V#@Ncdc z_twaZ@H(@K%UXHfhRs*`ypBL~-T}VJvuejo;J@kGc!oIu-vL80T&f2Z?mhIEA;d|z zf(RXwe=;0M9_dIDxaIH(P((rbm&4X8@B=+}=EcyTja7&yY*H5p5 zl~`z3z8i|QG7c85BRxLIr6&ao7&50M^I)y=9Hf-)Sa|_C4&O$>VvH;TWd*0NJ%9Ne zeP<1*36!Ul6=x=wOG#N_W@2TOL>S?u^d#jXUb9>l;IBxK{lN1=Hxm5-SDIqvG=t63 zBdAKSV*L80K}#8df*emiJcWYVh_3Qn7ghfbR(=?D6ueYv_^9Ih`HM)9YE z33=(AAL@x2krj(h(g+m_hP{=+hl?Ofjn>v+K^!?zR$z?sEY_!Ku=WPrk@Io8$-q3> zH4%vE0)#sZ|CQ(^^f7^)1?6oU)A(~Sy!jYLD?NdVazW4c&BR3SJ98PqBOd*GLE#vz z7EUzB(Iozb!I$JZV?_DaOt!Spxy8h?wP}FvYjA055lD_yp)7P zm+SATRXWs)#iC|wno(%W>h`UYQCzu8e>igWgUiLiglQV*Eg@0Go8>6Do-HO1090b6 zZ1#y&%IEcVAxT1HSFF;$EC}I$+G>tb$c8-|+yscg4VBHwPKc?GI>dAY=8D2NwOcR^ zv5VP{d$31p2~#g$jd|0f5;WDux}O{i0IC^;%b$a!G^@ zNqDhq#h58e3wkLzu;j<_)>+EeS0d=>n;Rb@W24RmqA*fOMvRWB&Kze`n6iS8`aA&R zz+ij&MLw_Z&DU#X{XU(?&lo$$0l=Lrm+d81ujjj84MPNZR9GHF>VX<|aYr_H(}c4C zVJ1b3>>+e97SjI$SyU)tf-274!@1j^C&YHaol?o7YnQ9T%f;b=v4i%hY+M=B4NC|j zkdu%%QVDM8%vD*%+2)=Pr>Y8vO-MYdtVo`yIN>zEBUGr^l9H6LC+(g46RyNlG=HoO zJZ6w3gZ4Ah;t3HA!-^B45eHEYf{>35)?TkgOd4D5mE&mIpf}& zh}Z)v3j05d69Z1{HcU%225O`q?7)5Pfc{;J;*P;^ZB;IZ7Dq5Km>W4^UAcTg8`@2- z7ALtI6|s;>eLHa>{9znIF*ldYWS*3~XNw7xoJ&#a$}O~A2#qswd1%?Ch){u1gQe!_ zLTH^zHU>VFHR9Uew+vW2mzS59+MzxH4S*D_d0(~b8_h86^k=5{Y{y3~|0-P%lhsJ> zYgQ9(U+g$psFTz=mDr~nEcsnIQB1VA8h+8z1uMJi`(fOK-a`wAX4QrfsIsQPQl7UB z=}|V-tJ=<9RgyksMX_2{dXkk14e38t*4!j#uJ?5?F)~&;<)c-6S*?<@RoPsLe5Z;O zt4Y33MM|YkzDsvNP^qLmi$1IzjY7FXzBy$|lRRun*iCX?DdB1)T~_kV0ihwgZ=6N} z#Oh1Bt9;PRS>>(fX`t$5a=R!~Eb^V0PNB{>>g3!o>CSKmJk?6d58;k-<#Ni=V446; zT-{`rD*Rt+2NU*Kdu*^qDdk7-0Utkxtpl6{q&}t*YgEatpiHsInP57FMyydL2YoW7 zLjLn)ib?M7J9CpWeT`yc`S+=;k9+Gg#e9xu_Gd>z==S z*FJrIq>&RkiNa~;R$a~oo&Le^`k~$b{qk$6H2CRIKXmlVyURPnFb6Zun-!H>G?O*@jKD#Vl9<=tK{`<1OfBE|#mv{UB z85H0DYImpVOdK}7GV#;_OvF%F-m z6aKZGa{1F?I_>gcE9Ljg@TV=vWM=pi=!)+v@%yfCK5k{)rBm|hguVU!tt2^qnXSh? zbSSTQS&W}yPWsM&_}m%mfjTcRnX+J5h(|o#*YvxlUtadL!MgvuHZXqDWb$K3ehkTv z2gXm2W%9q}1Ng;6Z~z)Zfy5j7VRp`qbcmUm3qpBj#{OZywBH1@wJ(eO(KyU3ISenu z!sVL!PEY!G7esnksgAx5bYk8A9f-wGmo&ySE02tW0qZLAvvYTSW8Wbyu={n^U`+oN)U}lq9B?gfXz^0N}6=qeLRby72Sq)}2S-Hf@V8O`BWmc}R za+Q^9tXya11}isNrNk;GtANh~yxTBajQpE$_Sv=f%nfrDNUU_`D7dD~S~_zz{6d*! zhVdej1;jB06)G_^4M1tLVO@-L=nE?oFSdl3>OxY#y>;$3ab({q=m3utrtpUuj{SIUY`RVt?f2&+0Pk~y>55MHyoWrKM>z=bQ0YY z-w;EC$*6xw`Sp_e`dpiT3*e|!izzh8Mu@arl!_=bhdHxmnj^F*I zBt(E4=Qs}o;tSS!Do5(B*vYm(k&Z9sl56xziMX&;rz8DYvVBxZ4(1VPkw-9;<)jsq?@ zch~WeQ?QOxVr{1@S$OA3yVWTar2R&>-vOg-ReG8utGnPO0@qo#T^%CNPYp2V9>;HU z2sHzdgJK}_`2dW_oQom`ELAfmpm~Pa4+}W1NPYsjE%8l0zdXYh_DWzu0rlte#}!KQ z^7$(`7UZQ2# z%tbT$yeJm-dJWa!IyN{Tmd)b_?G#)(m4**R9pXcSHVytJi6BX)=p^!zEIXN($x{<( zrp~fY@UUdE?4Jlt?#F$nJT{G!VIj-pt}|sFhf6y7{8YvW!hq&oXNnz%GeGfat0POa zjE>Xc+5AU2L6wF12^No3LE+?aX9H1c^JT9Jl1g8245xQfuh2Wx;<|J}r1 zpiAUxTc#DpJ)QM>Z+gg$2QI^(4j&!Z2m0@8d^dQ4!NZexmGI<|zHGZpn}x4d?&p|S zsY1qhXFsGl8up+ddr-{QAaW z$p*L)Tz#**UUMk-vY-Uu^7(FYHJeN$MEIpUHh7gCr&~m+v?YG!J89v0zY5SJ+S9zoh$F`=4Ds_ z)DwJDc2KQU?O!Sjx_eyV-92?Z=

    E=$st4epO`7k6SY5pIqkr&`k@QAG#@7^Fz1T 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 be=cBf8()p*s#I5Y|>ddnJd!C^=0& z$D1_4Eah=FM03pE*y2rEBqUbXnskP}v2~06*BY)Ww!@Y=I#BpwUMaKKa!8!SIg1`z zo`<>o27$9sFHrm#+bbf;gE+<3TUaW--h{^K}6@CoD7AMILYbP9HNBnz!4WOuvuq3A?r=Lfbqa@tuc5$$o_*n z*q!38ln1jxxxt@Cl?cnX_Q_GbSIZt!S9nAdNRPWpS%|h2|}Ox)-8XPIknwiJ{|$W$3w*{_sA%fbr{1ow5%6k@)C?Xxkp>M(4>AW~Z2qRKNHXcA)jFycLY+!miOUKr2Uie3Xot==qi=%^9R6&^ z>RILA6C@NCUDkRL3WB7}_i6L9#2P2t`fKfrtzR#)S?9{U9UQ%z$I*K^g<^h~|hVxQkkIn&oe}Rs*nY z?Xo{$9s_?hNu<*;8wA4{k1B4K$;0rZH(5VM!qA6{F%g9rE%Zz6Q;cyv9>%MH!&7TRL%N{}s6Dnxjv+$WAn+rrQEN23hUHof zv~pES*t3ai@hYB-r1lV>tIh5^jwj)xKCV7UBDz}B4V)fpw*514x=gxuC4*${d(4f* zjynA?Dw79MiyuE{fI5~_qfn}0NNNYz2PbevA<3O1G^GTS0cfd!UBKEe@I zt9>LRVjY+;tr9hbWOv9dNRG)xs&05>=rZATm~LkLPDOmd9eUzNiG}Qzy^ssSVnD}~ z7H)+-d)Z5=62#PMjhf|jmM&%%OR3YbA-tj2TdF$RZPV$1mXxq$RS>|4EL|}o(0`ts zk!ZiShoG0l?2Wx8E{SMLTxK1u38&+66wzhqKZvSU_XnqAhls{}ByP=W*nZElI-Kt` zucSclD!UaEDfVCL-24FQ5MgX4s)?pyd96mMC7b`r;e!J%&oK`U&ant-{ZNF&eayzJ zx~6~pOAY@szc;wl!mIthCR+ic>m(;KdmWNuM0xgK9Mi7_eCmK{E3WBxuL?W~FENjz1MM;F}d^5 z9qarXOvFBOCS8#fZM$Y)c$-CLL+XN|Ar)SyYrGEG7^aX}v$n|@5jj4U9*JX)F2x7W zWPrN`NpudJr^oq$jOy+-UTo8C_Dkig4Xw@hPCELYNm~{yTJZZC69B2T%uc6mp?}97vBiO|O8Ml=X4LgaY2M zVbNqBCkqjSgoD&9ZG;`YR5FYYFq5RB8K(Kx2P6k*uC2P_2tYfW0YbeB1GBD9r<`OPeW9xRSnJjgKUn1s4ifkh>gU-kSkrk0`}_?^Js=0C*yj1y^@e6V8UZNs z3gBaEJtf!WBSGa%Ud<|(*!qxpRV(fV23_&3J|*Z~Twh8wpxA@dd8;lMsUB2v^Fr(@ zcw_Hpsy0 zim@q~hOu^Vkym|QuX|i~Pllk3*ZpSL1tU^Q(-A67A0VOHop0GvIx)zC8i7hxX+Qnm z*s9g*HAu@i=@cmLf)WczE=lPGjmR}PX;4eEEWTaQesFg?5032Ahe*r{KRiZQq!iOU z-lZWyoULmLJJ1HCJ`z{K8to9lV^2jz~fuC6Syh9{OOr$2I$DIc}Ks3T=DbXMt6Y9~D z0ZfV)3CN7rtyB|$-b3;G+FOI?9}>%YKt$M&!i=j zX3rWCBhoE|O)vH(SME1RMOC?c2BsF5s{4rB_>k%2#g$wKje>^OzZ{b%E}lo3$SaPC zHkZ0u#>KgKsgehXZO9t*Ih~;$u|Q09fiCY;Ddr7{>>Lmm(8#h`3GO|Q?H*xr*sa7} zdx_F({W~Gv)fgfEwj-}+kH>Py;IKiEOMD0c7u;p9k~r^y#hGmxWfM370quz;_zW>T z*DVj>2W3?M15k|KLvjWIGJzGojupu3u?i07tqKSsQG{#Qj#3KQJPawtk(q58G^VMV{IgPQ2{mt%@GH6<|>qcK$%SR?`lc_Pgna`ReExZggsvx zT1QUDH?6L9{8Q~lQqv$gs9+B-d#LhpEXMwFMap*?vjv-z{)bA|A0OYN=$L{E9w`A9l6eW603~A}l3S1(|Gz z4)L)N`6npx9pYh0JjZ7b4lTwt!6Vpl>eJ_J%By+ReH2m~XxG+gXJr7O>RRI1X5oCm2hnF%Z5FR$HAEuD;tNP!vCiB$8n*Xw=@ zb0z3Ww0szC)!5KTqHsxioMu<5>qGF=A4eScLNcaXGzxR$N2<+-k5Zct3u<%ivLkku zZ8e6PwF5}{&;p|{U&|pH4_b9mm4+4LaI)Xqr7|h`G%YYhU;?0xS`SqYRw_)Q?uv8Q zN2BVpHMKYpbz4N<89GUEN30^PK6VMm=qh)8;|j075)Df1Z66Q)Ng`ONHg-{^D`v4#515Tu(?M9$`qmPe18V)(qtmhoy7}BN<>z!3W zz;weH-vXoo$1UXM}pHnBSF*=mFbVrk7i#)GqV^aMdF{~aEb73~#d=1zsTqLi6@ z!`uchjS{jD^un}^gzy(m$1Z(Rb?%c$iE7Xct=R9kjU$IPt2-;Iums4}b-tZ8GACL{EmAe@hBsVL{C6h$~8!s)YEOR!KWQ zi;@slO*&M4QzC-ZA-Y-V1KuNtVRl4NLd(MaQc>6TAUqBPzOnsQ2x&$4dyV@}(sT`? zz&L^M{SbMk{94Jqr__zQQ`&5Hokh9#;dn|XuDCgCfEnS7M*(G7Rh4*^4Tx=utLUTe zkg*L7_gxemmRBsEKlIJ$=+fnC*($$W!Wzzu^{cGsIn{0oKK^hGqlS_bf^WE@74BfZ z*fX-EKrJ4ycPUA4*}jq?v%!z6D42b~e(V9kXU{I{6*wrsqLH(Is$?vFyB6^#PG{J& zhf;WISx(0@Nd-(4Jh!X!OIWuX8homu&;kyAD4hivt%VSpXmu}aK9O8tAR0_ql6{Hc z=a-1Ng|Xy&(uNg}Cgvl?nFz32W!wc9bVJ1W&3$d2>PI)1_Xl9K8_e<=O}2NnILT{S z1esEJ^phI%H?N_CX&B7Fojl0nS?%^dr#1RDr^!64tt1mYqM35WwmgX26=5A%svGR9(ysXVYUy*-k}L+dw>iDt zE*5m7at(z64)_IA>=I$SrGO zu*#^#mxhH1_$3_S9IC}@| zoAN(@7i?lU>fr1$vZM2`Ev4?pt4Y0n`ujL&{^>PG(S!;eo+TRF|ZUH_n5 z-@(vFi?S@dFEx_3R5m?;j}Yao+3XIVEz!IODr<+g$1Hbzm4u`>4y#pBJh%X}r}3Bt zO=zBI5yn}xs(jjyZeXkCSd)%-$iaq*SgaS}*o=`3L|lZZ-+ilvMfg$*i|~qvMR<`? z;#Gu2cyT-|!k72o5f$Of`)>qANH22tO$N3fT`8E04OD_$!3>7%O4QYKBmAeF0Jp_sTVx{|XAN@+z(LVHs*X~vgldM`Ih=U8? zhzGK2mBT!^Q{zL-y0>v(Ls$3{#sxoAkthMDvvixk-J~;$Dpggb^ol?jiWd+DgMm9v!ldybZk+2~r3St`7YE*1V z)a2`hbl-5&;;?EqOVD_|1@T4%l82nKcoU_gQnq1RyPdch8cIrg1$V;(*bfQPGb%2br8hmx!pjELkMGI!dW)m9cH@$k@);fA%l-6$d`{D42 zK6%5%KFN`8U^L%ALTwq3fV*J6I>+?6) zO*b^QPU7izXn1ZAb{!$Nr&f$rM zgUWB%wZNFfP>D_~yz{`y^^Pnk1aB^4L>>W=gk>0(5LCB3slZH}RG#rsoJujCy+Zj! z&-#Bjy?g6j|Jnh`Z~<_5wcr>2iiLo{eggCmOV9lJ4aW97{Q&;_P~n#Kt2g|0S46Hu)hONuape)cg6IPn55Pn=gdb!eMfNg(ffv2I?S{N& z7d^cHrPO_e0f@!5;AN1zZ;(%aRpfqO2DwpyH5j-25<{`ZN#1>}@#3#i?fx_fay>Qg zhVj6*6{2v-1%Z4phY*;<`(y@=nA<%3*>buoy*YW4!puYixMZN1g_$FWY`?tiXV%uL z*ZD(B)&pr>xo~W?q9B>C=xwmctceS4SJ%4buSFoof5ueJCde|n5iI@v)7;%{ATL1Y z`e{yPkUV$O@t@`g^7$!*&v+L@BBI-;x%(5jiK+Wn^4g~^69c{W=}yb>DitJ5;q@h+ z=aByc|Ef@*u8oD8VC~3=?ch1XgPcYkX>gH#fq+?uY#k(atJMmf9Y}(>V0|8cW`*c+ z8zdmZ+0cyUgKZ9Zl7)E(Z$wrHRi4-auIrw0E(6}nuuw2Kp;?a7?P~5p{DppSpKkLP z!#-=MUKgG{U>B_Nl;}rBV1CD}!r3H3%ziv{pC8Q(k*;3Kv^Dn7=?qO~9A?H@8eU7XnXBV45^w=F@O`my!YAyr>v z;0Cip9cNhLY0Pu$KDT%1%;|BLe8Sn14v*0hWZMmW%gR7zj2(BD40F^hdP9-Qi*+tn zXsp&sYGM!O(#jQLBMBcI0_1Bh74h}ppjdlJ7OSA8W6&g`eVBdvA^Y*ksWU#C@WBx6 z-R~c=AN6;WgNnX`9fV+%P{Kd~zI3dK0DKi<cWW-PlLzlX@vN;PeW+7@L?l#I^jXz5S$W>C(8U30(s#OGt^DX3xnDqj1cZTeqy81 zwKigyDVivFZ0Z$T#&gIn3O4f&C{najq2s&kBdv^ht=n`nryJBr3g-#1a<`gt>Xm&o zesUUC%aZ;N)(?;T<_8PCKsc@&{kB>y5F>K!s;Dyl{4}4y76QVxV!0Q1r$;`xEqwrA zNDz-mN&&_ZMAO>uIm(VXHvr+bFw7RJc4!W|`m^qmK3jH|EXT@tNmU?tjKC#L*TwIV z!;!l{&D3d)%e&v7DHKo;iJGo0pK+hVY#LhGJ6;ClTrObLbpIXtETEaPmqOYm`vZ!< zbe}K9P>KYKodk+S;-?hHWyVPQu51SrUb14*N7QVRVbkTMg#X3NHc?OGB8I1t(>YV2 z%#kBtC&f}l+-Lkp@YVLn@M+FY2B))h4u@`TzxFAyZeDRl`lV0Z*S>a{05ZsPUdUSz zgIn)(-1=eCY{0*Q(Q+W%QplMQKJOFP1%4RB(H+Y=RBG0`6kAqIySPpKAF`IS;vJdKK5@W>i+a&Wl=E zK2NuK@tISltXEy!`5C1DUttUjn!k^edHSU^kn5-XuC{Vl9Bf^K4H8JTQpEUK*we^s z*o>UUsspMZxcXRl;EEJ!vLF9n=;yf`_EsIUtLM+#P6PV#WnVsCwmAM=+-f;@8R|$l zU);JOW@&ioQ=2m}_KGLB;$dM|d>`!hxI`@BM7ho;SRXKBE}+tE6>nqSe|E_fDpz!I z{&j6zAHKGKv3s2lAIA9ayfOBE@n4+3y!iWX!|S`r9*VkH{%fc|;y-u$za{%@zukZM z(EI7>coj{Y{f7@<9E(^B9k^FMHKYXM?9O0x7L4->HkssV^=|_Kq!rD_5gAV06+gYR zOX}?RV+%aoCf$|Gdcjrmfj1OX76P?+&!ka+2g;Nag!6+CN^YoC$$N(4r6;Cv=4 zhYS&T_8Bw;7Ogo*LL57CT5AI1F<~g9sTml^ChVJs~r8e_z9)p$V^<@DX#5Zbf zR{Z0z;^UDHN(Npnm%-1l%Ao5zae;26{qzgn_(4W(r(PF@H|w=1-0$sGu_9Byunh86 z(}K)u%{C};W#N<;%5+9uzIu?+3bO9`a#NiC-fWyY8t(f&UuSKLI{_P78c5IXd;oIsJXyob-S`&l~V>>%;s&Kty8=eqL%UFI%Ir5rmeOJ=uY$X^lK8fXtl3gtumepB0-NJDhx@RO} zDgTBd^B?~4gsTI?x3lh2trvQM;+`L(CWEiRlI?e^X4UH_zO%!)JMa)T8eL&ucYrE> zkM+{A@q-_%{T_b&VEy30r%1YoU@wZkU+~9;3nTn!xI?kTV8)aJG0)Ra6wKhf%|fQm zMAO=#W-thBSc@wOR1z|>Y7MWiUcI@HkRq!V(?>`I0MnVPEAOAKg*l0>gJUm;5O@Gg z*tiw%A79AdrTq2pW%=tLU)=D3MlbrkmWRM(j?MNCEy1|JieO*jfe%+a&e9}|7v>X> zQ)L!zd4Nw@NWq^>K5dg+JP4B${z#M0Z#OiIzlwq+*vJl(baRJMQAGg*oqUa86Hn8r z`1Og3`5Yipgzo}IhiFw=ip4~h?x&}@Z32itF%uvbJ%$XK{hR|v@C9&+MQ-BF3&i{& z!)Bzc3HG5)`gI*J1ps@K-rdFtZ6fG13vzi_^E7WJX|8=g-$EeCAcuN9uNV7*y$)AF zp3|hMSL4l{5o@ubbbfCXMZqd>2GC2=WLB}PXMlLtq(PoFh2bnK=d)?9ae=Ikm84A; zGdZJ827KN$D_W;n3?Brm!rOGcUBLjGtl^C2P2}^UbTy}&<|lg3Ux4K*A4GGpNw;g> z0sr%xy~!!@wKdchg?POxLp9 zxTn82Z8%CN4f{ij{lJrv|9o;vZW80Z^Lw*tHAdqS)=wIi-D-eG%2;}s3|k0fKmbRG zwz=ZCBB=UB&d6{-5%lLGS9j&!1%_ttT;${`Gcr(LGgppIV z%o4QG5*zU_9>kMFd9=(I?g|u+H~IJ~n~eL(1QQS3)|*{lYA4?%w`od)y()JC;ems;!oa2KT%vSA|8Ii=Gae4og2L~*5bkb zS(R^(Kn6o%W01tdaY#`O0EMp?XcWae2>qUm@|tibBuff7hO`C=WMPPv zfR3$$r<6a}1eznDrpAIq!68{>4*_yysSZ#@P8^~Wxs)E6CbTX5B`-j>j`&=x*-s!t z08*$Fkr!m(c;R>wv()nRE5Cunn0@PO{D@)XA^ z#eK4$xIXj_B)p#}71Zy|-CxP!lvvGX({jilCWD0B2IM>-*C~0q1%XB%^?^;e9H0K) z$pn~Gr@#FC0N`b ze8*+ZePT@aCi#wu{Zy~pgT!T>zYOd_LM~JISDWPcq&?|CW{K{R<@t`)8UNm#G%DAp z)o@P#)q$6WEZ1d_5FeL=y{}vgR>!_haX&QL6LOuND7}?^a-FJ?!d&I^a^t|ATsDuK zflDdhI*QrBrb9UJCc54q3$2kJ^)`wOlqW_oC+{DBO zIzNSZ%2I%Y2EgK|@QZ(aeU0@fEXSkZ|1BU_PLtzmahkhZoLt5eCN$eZd2AuIbWhrn z`rfbIv+n)+*{zsY_kPXAL)WQl`5>$jdF8#95aKrrA(Y5bEq+1~%{ZI@PFl9NMR2uQ>{ue+pS2tLEVG z0OCBG%lT~DG^KmjsZ+0CruKEJ7SM$e7J4fVsthe@FZ3Qxmg67eQmfb7tr)Cx7$geN z%{JH-k&{7OuMZL-3by};NzLi+c5~lsI)Hl$LjT(&r}7-eTj&$m5Bhe%#Z%kCQDbs+ zXto_<^r3AymvIu#F3wz^R|nWQ`g+BoJsMX@gC>RVjIS7baae5ZuQ6tp;J?}q`4fIQ z;0$nEzV9@bmR9(7d)qZIvwTxA5LC(t)?;4bboMO(T^28Dd)HaO9=GI91Mcw^rN zPOsg$4d7$fJrk;s+Z@C)`@Q`ncF#8(uusix%i{vu+BTtI*UZN~OgEj{zhxEyfZ-PI z;}(WTa*^X58I9ev7a6dogEqbG!xS?_{~rpGI43XonF|;j%2xNjCE9)Me$}LE@UcBph+q zX=i+$P7Zhw>;%S(VZF^5oY_rFuxr;TgZ6c*W6+5WcN^(upbkw?wm>0YOehI5g-*C{ave;W|bk-F&0&TSZ$9Kkaf0HX`YY|9r& z8vgZd$Z<9Sf^f*~b%5B1E1_fGOND)|hs$~@0C17Bi)}TDXUlyXxMgZCPr>s*s;i@) z;pw1}_wGM{h{K-4tvHC?x0xIZ-(ykUMdDO$^*n%9 z574XTO)wgpsQkwb47d2w2*SSs)Ac{NW_R9b@e%{8g{9!u(7~(9CG^~8?>f;L%(>Kl2#j@j@3KVj`S1v{Atck zYg;Y|Bj5YIEZ_{Q@($9O8rBSB(^=f@F5g8a(d{Qr4=)C~@+Xn&ag(w8k8^N3H+-P- z3NdzfFyl;yx{Fm@uuyzoK`{XHId)#4W^ljnC-4{e zmqG00n|s0bpdrs~04vPx_3S^sv}RxCa3PG5L~5D>-h_V4Dy6~>nnht1P~!sz(L%yA zNZjibq!oiikAj7#th0L(yMsjJL1P!zLBhtvEcAd&yqp0p@-|^V4H6c`4}$8`&0UOc z%`a#Y)4A2dCOd5E#S>iw`Gj~#H8!srW;w^Rd=LYxip1~F4H7>etLUqDITM&&RQY~; zAqYwXdi?~vAsSa%=PK*!dt2##VksdkU^+65rK7S35Q5{{>DVXic0EYU+jUW9!$UL<`uWryvoR#gAAhJ z!W3|)(=r&$1f|Ljrn6YxW zT6!Hai19YWaCou7Or5Ly^W-zcST>A?LyZUlI|?QhLz;KLiPdmx0xyv(%-z8d5(pt6 zSWI+vtW>%d^p83Px`7r*A5a7g9UR?SL+Actk7}+$7M+32WcQ!_M49lmEOjzpAUpG%>6F=nxThWX zmEaTGNpF<^?KgUF3}7(Rucj#d)feL`JA%1$E_pTgyS+$D#p1F|K%Q%-IXoZ_X7>~L z{Q!3@aL(+6^TsE%#es?%X?ya9dW2H#Td{wWq6J_ml((Vjm2Nq4zNpI_QVS{zt4_*CsrZB85LH-k)l40xM`LM=Rtwq3O0Pl ztuH6tlj{^YIbAzZuY)S$=9t<0#Z|8ydW;8x-M>^q^1RcG~oQ_@9Fu2_Fx}7omJ8{HUz_2(S zgxJXm$WBjARQFd|hyOCWVjuBW3JY)Lhvz}>D(gVC4z_F;>S~ON)ZrBLJQ8kv$OIab z_Td@3hl@*b`}@#5!9QB-x`M>Zb#5q=uNd6-2!tW4D@c$pSX!SMsaA`pfk zsWs3RWqDUwD~yvlvPgqi$*@42Dh{~;Ttsl|pR|F~Pl+{)=UJuxHGq*=u$V_s>Y7VfXmlcGXfx-J<K9#KwqYA-US@-}$C4mb2oQU$8XHKbB*^2h*}ysl zi1myvIu#;SRsrY0C4evH#9C}=mK8^Sn-|bba6O0IzRlUPiq!1dXJ84tJ7!-2WFE`| ziX-b)3%*RRuiC$5q?WGpjI~#zUm4Y9W!O>+Rs9Yq2{q6m=ltK$1vI4haMD)VJR36C z;gRI)Em{sKy3q)Ku7h^8gFnsUbD_p{LcmtV9N|c~w$XXHLC8KuVTzq6F?jNO$9nGP zkV&bV+kXca=6?c!SPX3LYIqq__wRa`iBEdu2MqU6>Bxj}(LuAXt^cZm^YWctD1wuS zQ*Sl)CzvVL=?=TjZm65(F%MfKwYBDA+-P?_^%C5QA^O_bFS9!%6{c+LDW+@$R$tBb zL4?F`cJQ@}P4Lk{eTYc{XWR@T1hx5exi@$z-izL+XZ&*P8A_jM>_OsLjLwqVpCAAP7nxSENM=j~6&Y{UXm^0c`UNlpl6GOZ zQX`D^Wx?6lwWd>y&^Vo1J!>i-rWS_1n1NGk79?>V|49q?ob#u8EN{(QSxsw&vE!Iq zE&t6tYgglyx`Vr}3om;sO={UDs)B<T0C4cyo{OMD& zx}+{wAE_`SH2G{iwEpQ`T@0tMU%i>W8N4{3zB|7fz8bvgajna@YdW3wPh@*ZUHcE8 zy7m)ac4|i05G_GyW0YOG?EQWZpU9=;wV(L3m85g30wMn4Q?=lK__SmH`N*zRPk&bQ z^rufHHwem??IjhuEch+iN*jF4!MYfj)n}_q%F~=N^8E20=uwSD;)i@881%9h)b8RW zzT4i_-lTKdT4psqrdk@-p6pha^w6qZ(O_Onw;TD6e_mUst9W+bsYQ9d&N`>3i#U(A zw-8116uV>pHd&|tH~)&xn*g|F))bKb$WY_$(_Db7r!8w|cOYvX;p8%=_HOoNE+IJk zG6z58PHx+d`}{3nB27L+G7yt?t(%o5tNR)@rfaLR zTCkxt2~m(ro)2GJEOR3c$O4-6?wwmq?97L=zT^oOAQK2;mqQ{4GAn&P5KEq0@7}fM zG!Nnx)kE@Y@oiK)E7?xy9NT5HNx90KK~LYsLav7|Dp#(dI1mh`ia0S&JlR)H6$2$ zioDq`TL|GgKVQ*VzDW~rZN!Ipp*44MQY0rW%D)2kkTrLtotr{r9R^mMY@-d__zj#Q zQ9P%=#0KMkr^7?^4=XyxkAbhgtAq@v&Hso+bb^1xD!~xqVKG(#CLFRMb_b&?$RLRr ztSkfcKk-A0;GfnkSm)afOK*6+31+ljKk|a*G5tqOS*WgmK*$T;78~Zx+WiMdlLHG5(;^p zGfqc9=_Lc?WLH`co)rY)fp%@KxDsg8hJ1Le5eQX|`6jN(uQH6pujMcj7*b_-AUtd; z5A5TH>i2$cwN6**ELhQu#}MDH=K-6URH=qWp)xz^882kWU)CN3e#0O8y+sq=co?i! zx3IivKS&na0AhEFJ}TZBU6tR<9%qoXqT2PIg|CZqdby=r3PFUYQx!v4q~8+Cf$`bo zq&f)jG!GUF84BFizW_Otd{$xaglXB(H8O!h8qHhFDX5o>B%cMZ)*(wGWn(Db;eKy4 zrshA^fIs1hf2V-JeJo-)#dFn{KNv?79>`Q%Ql6--vbM{kK~HJ&2Y~iH0NLJ2)asa6 zN7$Dgtrar6?Fug9znD@~}?vC=%E z8%P2C--idgG@+e{V9TB1;lBebJirQ%Lt*5OmqHu+pG&24|F=2Vy^TahPC1nE zh#n7>(r=>gw1~99ipsqsb1)>d^ z02Cf#A|-}@7*_07WYeAU^IKaZZYN&gU@$! z`&SfAwts%ZdEoaxb$``mlAlFrPVd?cIadQW@AoVaCztY1r=19>!7a$1BZo|<2^J)> zL=xOi)RMpD+lBUaQF^PB+)mWeA7!1Dc+1K3A-6xn-R8div$)Q9PjeR;Z#Jjvk&0TSUuEkj`NptOzeS43WY%;v0uC+=7h|^mOYI6U8%w(3{ z-34%MDt&zq+cDj+CT`y0{_X`;C^a`Vo_I}o%??=WXz27$0IeCqC45|Pd>N%JA5Dm?#V8>~A2M5%~g zM6$wb?fF130&NGvmVyT2X5E3voeP?uqc~>eKG$S8pEXAK|YJW z;X^-It>^}?T1=d?V>=tr?`CZeFDZyOjEWYbl6jf!z#aE4h!d!Q*~Z^I&G&l)euN1) zI`4c+;6~Wl-3A$}{OYFNO(z!oYdNGO;kt|S_rWH?%n~;4PYt~4CB7k+R$@7Xex)-&szQgN7_OJ>7uJpQ zj;ayoB%xpP>v;A_mWl$B<#V40eKvzh7eYb7W?Chcz+pC3ri4`zK(X>r?PM|kN4a1^D1P2a9YuYvzci|P0 z_g}CCfm4E29>&RHRa7tpSDJvzR7-(+`igMF!lHfa`?Z#R`2*TpT=n^aKwT9|GV5WaRmR(|*> zv`f3$-Mr(=0Sz&g#hk(?blw?H2(wlQR-o}NXW7xxp43tbDm#eUt4$B4W;x{aL#r|V zFnKO)Ga$Rk2%;&=t0~y{Qnc?q{r$sOR_l2!F#>MI2?Ji50~TBfWC8gMnY8Ee4Dzoy z9j_(k@-KW1zWrcG^EV!P(r2I)q4=NX?$`?BO_p0=!Z%BkxkaoziZ}2#Ot+gnf*)~+ zf3x^&9$6DDdUGlw_p1Q=c9kwnSoMx~#}(*luFOql#b;SQ@ZhdvkoLcLp3GOG%?!mWlfgg z=9#t@T+M2bx{s9(tm{qsIfhSa=fcJP$*$DWp?15?Ya2SF@n@_d`#!WdsxPTq`mCWL zmp;_zOIjG)b(+@hg5>_;k=+GfYfpAdS{lxR;yAPchz;aXzI&$BP1VJ!pSzzfsXe7m z7qVvG&4vCr&)w%a*kbha{T_cJj|tuMhQv3-y@&ptUAuscO=gQt^ICJBZbx)?;d$DT3J?P{ z)0lLFHvq%Y)d(XgL?4xf=y>&7tkT@<^2(!7$#? z4v_8B}8)?7jm~S*tx?) zQ6dW`h9*TS0U5N1B292%B)nnj0-j`|6fbSgQRsg%8iAr|Es7>$0Q}(f<(7_Z= zB;=1mR9{5OlQZ^z2PB``8&mpO9O5C|Q2Hkoxf%Hm;O0iHR;%)(iF4Q{@sA~Zih!O z@T5&b#{nK9x8Gv67RKbLzFr3W%AvUq{j3;&$r5hpd^@8y%4^xFas=y7Tvue@sQF#2 z#}VIAU&VB;>c}F9LmG$n`?c*$YXu+qaL5zD+3prFFXJWg>?H{uu;#`JP&9)0qoy?+ zFtARS3z$9ICo-iW+yRzOZ^=F%6+iUh!%ndbvNjRCTP%L&zGTL-Nf_R97`j7w=NlfF zV=~*buhBHBx3ZniN*mG8=?&S4eD`?>aOi}P1XfBf#ezWLA-C^;<{sW&cAw0yXvUJ2 z$Z@fR;uWTef>U6m$Dx+U4Z|){@h29g*J6{KDSx`KVvnak3Z^1(a*)33Gp#yX54haTwwsKeC~Y++r{l$N;uj8RUrY20-kJKd zJGPeKe9iBVvXjq{3Ry>+9xv-aDz>huAnYFb@v)$;CyE&F%}}WbXY}43$vwZI-EtLh ztsOb?B>9ys1~hq)pB)s~TScLYy%X}Ah=f8QH$0G#_|8FVkOP`PLc<+b08Zfg1k~5V zY2Xqtan7NF`vLcdr>N~4qatiHaYLpc5SwH{K|&ik6_b(CnU<^x2}iS+7ANG&?^hOS z{^zocr-8*C@+JVs6Q>&r^W=KnUQo@wXF;Xoovhhx^* z<_v-yb|CteM~#cqlGf{<$i(>M%z~t`xFFEF>!Gf2D$VKpJ8h`jf~ z2zCaA!jOgkFLUqS*0#~@4gcRyVXNL$x)}_lZ8lp}_;H+LLlQtZ2Rq)z*dtrEkfuG(2OJlY45$C=W4HD&G|fQ*5S8UN>Ct16igv!hjU4+6I}gsN_u2&>4%=^ zud|9`f9eBg!Xp!!jAI{(JbOlXQoBR=)YvYbRLZ2-5heMo*z=qhHKp?Pobx`WR6c4m zHZDv~$TZ?O!^Wv>rI!loUuykw;0XBvJ1$ExFtsr4(YgEi0RilIL186^*=# zPGs>i>?m_kIDzyodP2xAL-fh^1|or837ldm<^s%_I2;A|FLDpsrqSlbwoMd6lN07V8K8jNWyC&glkAKIj1!e3%+70F+ z=l=GqyHSpzr8C3k;y^LmAR_FyDWXGYFXab2lx<2OH?6m|_4q!@hbeH!IsFnX1Fdur z<^Mp5m?uBo!B70jD5jx2<@9sW?0}1_SyMUAh3?a)L0^W7Sy4Njytt*~WlH5KiV7&) zt`59R>l?RcwR&t_MX;`<4VB9Ve}6Sb0Hr2E-Fx&filFCy0+4nS z(8~Vt+@{JX%^o)&3U5bH60`gyZRNjJLI7kP%vqkDCqPX?PMEZvqq-=roiBRsliIb& zMPsklSak$T)3CCOj9oGL^Ikg$%V!u!s^%NV==CW1uuQL);D%frck_)aEU(mT!wEYV zbB-E0@RE0(y93jO!{NxB!leNRg=GPiHxrj5KzTl{K^u}KS~4L4sk2g<(JLg=4Ec2T zU56V=zK#;1GGMxJ!`1f@3)^+3*e%lIpR$)Lew@qRL7z9=i10p{Q_G%H;Ki-i^G7dT ze1yNI!Sy?)3T0XZSreOwayDW|L5C|RnRs3?rUkYe7$1*sfH(33c7)8S&^!U$B%wx# zkJg+50p1-rO4rB_uCbimcadxB*AimRRfcS9Gfe^!EmbUQ=x(WeLq= zZcO3U8RjtGn6}TNup@j#tbvtPG*2i`te7X!{y_TpTxEp08eL`lwP>%hjJW)v>j8&!5*3yY-o40dH2ac(HFzB}2 z&7lZ~7GT#M{~Ry>8cF9S04C68_25Qy);90jGR@;sAy^5XwFHwNU|y* z1;Dd~$@Y;PvN}I@yNY~5-I>UO7=k~)rSy?M+%OS1@>9;mYBrmZd1K|nZTmx=n{|JmTrvZ!oW~_C ztzT(oYtDcMS0+a`Q}_P7v9T^gN9stS-2H8V=c~0||8TDRdtd=ijt@2G<9rBBX1G_y z!V`yr5O7pILW{4uiei*^-hHw5eUS=aQ2)RCUk8624gR%DjK*FKWP3lzN8mGEs7mD( zWbE#)O2*kRf{QhijHMYW09c2>?^hOG@niw|R|- zko?r9{x=$;8ayit6esibz?H#48{Ga677hoDOsCB}MVWeX~P^Su3ed6UV%zd4R4wLYo@2%9Cs z1yP0C){TN@R1A3wa&4YXY)LNL{?eh&TU9UQxzJ}*G&Z2XFP%IbjQte_5Dk4mQ!6QJ zrZVklzLOONY2N#SGQkbh;tP%zKRBNQl9XRmE;!Sa6M`oFMnTf;994+u0FsTVDe#i3 zv3uc=c~IYhCKXK-tP8cY<4xKVd}OlJJk}Z|?g`wKd8c)_>jw%g;jE*+$y}?4GYYGR z^{=O901MD_fCW_FlW!}j;f-qZ`Wb7wB!I&e=`MHR1ni_mu%W-6q8|NAWFuCr2K{Q_Y;Z(PF zu1o@BhYrbB2`09q19-4OmR^4#x*m6|ZS2UCpZa7bL3feyT1TqL+( zhN>C&Nn))!!g~;yfUqQn;C(RO7yHu#94Z&ci5uX_eF$HU{6H@Zy=^m`=l=JYoQ?-V zbK@jY-9^{;$VoD=`zHzMCQ_F#s3r*fgz2S8xgc74pN_#I{d7!v&i9zO88P&R$xbkP z0oHlFwW6uD@39kXBu0*->6FGfHG+y4;{7G=xYM!IkqYaFr{g1M?{H`5bj-?cfLq7Y zF+L$-ni~=GU)4=Geb7xH>Lk$=Phmn(VAY6NW8w6~Hxa_>fbrO^FZs6C*4Fo@D7vWw z{~L`QNDqLm6kIS zyNT0H)@!cLe3DqC++Hg`Zg2gRLpcSHW$PAm!(1MU!OZwVHYAg?KR~H5tOKV11pabP z63aRI91G2Dt{=ftyOwP-9SiZC>|>7g+5p%97nm-BQpMwKN|g{Hsc{(Zo5kcTlULvZ z8Hh%VpP7cjO|cCrE5$uaZ%0?xfzseryP`pvP@~5@LIJ0^+6nGS(uh#~`a75z52-Vx z$hDZpAiRkCPX^fQ7+iP_MOBy`s**(v;IxpJIP0NcdSkbSl%cqyDXH5O^kT&p)Nh%S z#A==7P6ocm&e1B*4o*nAiIuyF$Ad+fuBgQOiGsykQOHTs{~p85VjrjdlVsp@lME0x zSqjmk=Q(N1dUecv8%8Ogoohdcrp{+5KT6qPeUABbq$!MKH$8NlH}UA2rGmgc(oLPu zamMQS1aVL{K8Rj~-%NwywmpC2wx1op7=AiypBPpP7O8EfDPn7b-&l)aVF2FDm4afx z$U_Be#_${tZ3D;Nqw$yhgYYR5@9}-H(^xVsMJg`uJP$EI^K0r!Mdn6G z&H~FhGS2`W(HMf(WFzdK1&kTk2raV8xVUC9cI1*l|Fpm!2diUqb%Q3F3xH=DUEB5g zVw|xz=$uJIr$XJ!Qk>B=z=Ow!adYB-GgolA+82#g1H8&9#&wOo-6VNrf&VsD5 zV#Vg1ov)3(T5A`?{@KOhhjBBx9))~mESLF;*dtHK9(gh#Y^8QVmxnCIgjJ7aUs&6} zWrSrNjbTNxc7{XP)1z_!$zW?M3m_ zI12n}XdAIVouvl&8{r#F*=xuPn~a>|8O3BKnrK9`R~EVrIj%2De5f61aB$Qs()JtR zu5dEqPw2A%X$mfSISZu!NQTDH;9d%ZFgkK(rooSLpo1Dwe;NVjo&7+e)U6Lbi$s~E z5s_)cvL`bq#fI(v_m1!qktP&svEbEo9EDT&#!ts!seT%1=W!#l)UGum=!k@xVd6zR zEYSx+;P3?b0gowqOJFhLC7R64 zv!LHw!aV@4fBr!Oq=Ej!ZGdY~B*%@CH)Csy|8oBPJ>@^iZ_GUif%eH-eqea5oU{QN z>MW?d*?LRZd?Xw?$0_{6H_r13qesG_A_|P5nc>iZb)Z1Z%wy@Z4#?5+`WuZQ=LU>E$3jJ`0nHZ%ocCp7RR06VXk{g}Zx5kLUCy zfDnQ2xC*DTtqoV|aR~YC>T8rJ0WUyCfw(PBe>4WPtkZGp5}Y>TA&dAbPGmHE&7^dXEp%{^g2XRWml_+RFouE?)yl|C#dD)+0<-LF_F#lBEoR~>o zGo0;b<)lG@+=AO~xwJ|&*Y=xJj8JH=-jXcFNN$BgHZ8Bxd#GIGYLsYEK-}GdSrmlm zA-&z&s=rEgVus%SO%lc;?Hm-s%qjF2j3HKGbb0hFWIW*WX1JiPHSG6;Gll#p@7gsI#D=D|{VX{B(iqAbs zBA;V9<`BC29y{n~_-b?uaN9YEklDotNjHHV1?%|~UK>_+Vdozfu4nd}e2-xyPr!Ig z7V3w<;X&f`O_&1L@?Xv0EoCIg{vI6H-($dz4#9HumO~gRP&z)B_a@+5!df3-nNiUbquWY0jRA?c2zeaEEJjy=ho+VYb)SdV61XT^EqZ| zPLlF1^c}9RK!gLM1CkZ49-at8MUvuu!_)BFk0+|QWO%yVNj6VfxLkNL43(u7ZWK`z zL-7}+@YoTJlm?heFb-bpNA@WVP{57#MfuhVgsf&*pnFy9T42xCN-x?#@Y z;83KfnpXPEpG+us&6LPWKgZS|d+W7)NTPmGAty>NL~g(jI1d5s2yVpJYN5!o6`~Ht zYn4pPN6U6T$Lv6pk`loJ_^gSSTc2b5Buq)_f~Y)aoS4VWNcj<&p9 z(N5t1n>-G^``I(on9`8OK+x=bWA3GhVHtu?!Ma)`HZ}{l3nJN*guovzW^?u$kS&(K$Lu zRb9Xn2}Lvl4x@gOX!ib0Zq`kI7sw4=GQE{um%@^%oa;GT`ni9755B5uD9Ve6;U*Y4Q$El>tK&m zC9v!R@QXDGh;ieGljug=S}=mwBX)$i!ovdF1lJ=jYJk1*QH}Xu*&f#;+!&~}Qj|Ok zqJqhnBQ9=}!a9Od7Bq4m5R`2JG}K>D0pJNP(fSEqpB74gu>w94FGs*HlsbG&e@7Q` zyc}_jA&?XDgXVNmGeHa%j9iwQ??Jr>i`Ud{ z7W5%S8M;8F8$g5&Q#v`Pw;E6ha3EB7F08~BBi(~0{2@N(W%|!SQ~BEVGMlH=5_tfT z@+T;7j3$#ed4yW=8%_I(SF4q7!`^?x{grGeB~2L;iRg(S7{G9KPU@uY@5gw-<){3QJelZZ&i_}W-?KD;{_e)@3s-0kDf z4*VWu2Bt*pGqaHF{|qw2VkP}t8zl=qjA>L8SG_WnNfQ&w7B~%48;YHsDNT2nFDWHg z4eCTc+e&TFhO-wZ$6p+?)-WOUl!mpPPncNNkQud|o!ZyNN^~=`YO=Y$R|^4{Fdffo zH=~4se3BXNkJD_p39r{;ouQoWWfn69T)LLp`kms`& z@YTHcQ}z=toz`}u8q7JrYvEJ=d|7*7+G}d`Pq6f9IJtk}Uyzr$O(1+iy>bcv4{V7Jdvcz+J^ z9|I?Uc>L!53&&_Y>%M&X;*5u#e0cNz+%X!R?wR}H%&0wjBfu)=JHZmoN&KH`wV`-e z*M4Cf3*JP&ykL6&2Nn>XwedoLKgEj;;7&y#Gb}Hg)iuRoE_4%GY!DfU1?Slf6G8dbqva1L0n~@AZ3w!PXZ4A%P+! z(2^dm;csl5gx>bPfCtjS7&qZnNTUKYTPJ9K#_W8uOj^FFJ?G-Oas}?^;`1oqn$8IRN39 zF!j2Q={G-G0_OhfQPN>OFu`k$f^MYY`{alq{4F*IQ_?nYHPKiT!2>jJtvmacwD}SH z%;Fwy=Zd{t&uRDfQIvHkVsqZF4OrPbEu(C!zoW^Jz9Z|6^1UV+AD{u+eOKD0@631hQ5(G8Q@aw;O}j%%5qoT@>sHYb1*N_u z9mQ$#$xmnK5{FOMlvd7BRz2&?s!+_sANy+SW{&3Lji5sq&7lZp3W)Gb z?yRhE9O-u?+(n+ebkJ;5)v;;ksx;Pin+XgUYC115VGg1?XiDjBZFS6xFxqLXX4!?9 z-};`kOcj`pIZQXqi5dk?-LSlNo;|k&EFYd_Dw;%87y)>)VtIM4xQe=dR;XIv;IaVl zL>*4cN-C3o=!B-$t@{YvzBjm^UlJhOi93s8 zepnb_)Zo|*P|z7ezSbSw@YwCRP`h8sfmrj14-4;Ea=!67)6f`zHPxV>81Eod7C(cTu^ zg*d*X9+ba4J-auHsMaP6>KCER@1{ zKf6D z!Rk3(XjaefxYcuBT5c#?us`P1*RNpm$}B#??^n4mnh9)W8AnjYcMhx0jpyz!=S&!q zqBUO0T}#bVT-bOO@zTW&qg23@4rwme**kRq$ax{|_O^uvzI}JVNIp!~arO>7e>k#~ z4kp_h0E$zG7qnk0h~?Zb<@B24*(h$Orn|Eb*KHuaJ3ISU3#vyXslL0jKj?R0JG(%! zcHkc+?~_tqExK6r6TRpsQ1p|*_P#AbrI=T#d3&Fz!7@-J8Eo(8P>C~n1P%J4!=M^* z25T&!-)NZ3QYzipAD>dE51`Hjt~p{1RsT@)+zAak5N6VLxRd`5NgM3=+RZTHZ(T$( zQze&e4jntB8*RIy6cD7vD`?wn(>}Cl&=Nm*jJ;>=1V8@J0`rw2zyha#z%Llf^*TzA z*vIJB(&Jj<$Gc>j6FDBkB~s$lbVWV9C{@(TR1Lev{w@*u)Fi0?Y1zD%j%g_VsKQ9V zL*)*j?AkO+YyXjuT1e@nHcD#&9VIDh#r~7LQL4ASvayz}j2>DUv7eg<4C7kL@4qo% zquYB2OghQBzspynTmNc#1uqI5tG}0R!!YSh1eOP=qNzIr$kHP2pT1kjkXoxD{i99c zH2J^09EQ-GZNngK_!s+AXgqdEs7bd)nH62)Pb$qDN0b)P+lJJ#%=+V=-jqaX?qHxz z;YEXvKeo1j><4dPtBkOhjx)q)e1;yU90?JvbwyjcrM7@k=!zTA9;f|oIyjuiTU$|@ zvtL0`4MP|^HD>lz_{5Tyem^z923RWPW@u5D&+I!tNx(m@7(+QROvQb3e8LhGS}Y(W zi@~{V%66IpFHZXP%x4Yfk^|Cho=S2Ii=P`AHpc|sTqyHG2 z$|B}oo8~NCAJk~;$ES+UsSn5mk6Tm6Dfxla4_ImDHlVD`cGFJ~q_iDQ+~|twroKtu zN9lWdWBLhf6MU`XV)9WdJx#&x*DqdaM|F5hs0H-|aXqMMeu7TpwY+4XvloQF=iW!ty@;d%InLIP-A0W&($ z^iRO~_!K+*jQtc_q^=eyyYvZ^gX`U}5F&c`36v2t$rw>j+AdrF#cfy&=DSZ80l$F# z4TI|^9O=5{CpIV*`blP7sC&?2s!RG#Q@5YQOt^=V`dj<#7?tOu^ilha(UoSDR;|C> zf_hJ1d*$T$1cI-|)sSjyFNIV5IF)NJO=0aF=e7?mvphY*bBsPaQeljl2Z=<@D@UQ%oPB_o_zNMG5*cp(AG6?({7tC&}fJwUP-0s4{V8=GQ zTe~TfZ9Wq3GOrPEFSfRFRpvH@t6PEdjM)+t-1u%fP%m^|={#1Q?Xm0M;eRzV>3Pg7 z5(NNA;o`-ik<@@H%t%wmH4Wj@lc}75d2^KNgOaA(&c#nPFeNjMwsI*3jOVN3_zB;6bOML$MSKuM9itIyIo~*hx)3!XS^_go= zX1TFuk>J4-vs8KTlqB8;P#1L}0mFACTg1G+_K#DwAdpr(1upYZdHsd2I-DhH+q ziWtg1e9!D&+Bv{}n>v2-e)Jw2-lm{5s}3BuxNNnlGtaNuBd1O6Hq9mZJ7Kib+}^cX z0LxyCFq_-fuGQa11>wh?L#)-7-Ii#*k4aD3G)v7MF&6ah#jT(4+Yv`{JYv8*)#psz1@@|R(6#Sj00I>t&{B&zeKq6g$ z`{y*P?HqwG<`~dM;4&*9n;fSgD}mjw^rz+_yfVm3e!5U0HzGV5(`_e8^F4W-A`Pz& zNRDiVdlIx60)L$T;I90i*^aU?_if0C@*T;3Ja$XwWs6P8^5>fnF{yYWu?ssq0Fe4X zYym!!WKj@USYDeth~CU13NFmhMfs2p^v)lrKpjE2a-*;zPy+b0Do1=$`;Vjs>Y(rk zy$q+zQ4rkK=fKCbw z@Z9kR=YNL_G#>i&F~4MAf6QezpFTP+*E(So?&Ej@#6WkYFcB)QanR(!^&B)-;u8`w^kgIb)y6c5f^SqQguAN|VwvpY z@2NSrNVuRvVUTp3b_*@tn9%am$7W1N6M%~bd6PLO#xnH|49l{4HEJ6t6!q|B2&$d`RSuHN#~O>Ydt%qW`_ht=f(h6%3K@2{>WV$zYyb`&)-KT z?(#hoIwYw2z&hI5S1`A`*XBjXkH^bk6xUcgDQMj*=VM~merc?N?3d;R)cFx)W#btg zFJ4Bm$XZcwlUf+1 zwVT*a!J3RI8est=7=zCJg^b3azYxV}zcK;1Vmhha_~|TKrnONmp(%qD*8Q^P7L9<- z=dIWEj$QZAOK@OSSJ)YaqM5XIExP~|Ihe_e!Wx^m+RZFVXpI>IO#BIUZbHWa+Dhn*lKFIHt%iAMd{&Go@P%=Iv?J0Q{kx@cPlu+{dlDG#XI3u?Qr2CYN6H1nmAr2TSxsqbr>Lvb;b**s#}NSJgv%=$!%ni%hfs%`v6GH4ABNvxx0v)O zG0@B6%Mp68=G*$uQ|h>PSC>%$AVt@A&!gpKKtUvTKBUB22)hKTPGh z^_Nl#z4Fsfqd3G1m3&uXBn9wM2?YLi6a=HVN8`w_$cqCts)A59EYj8UmqBj~izG_h zr%Re7$B3_JSme`bA%+`U8y0!3MBzN-+Q{s655(L^DfxOa?OsEfPxBz*C`%4gn*lMA z<=H)nTtA$m%d{nZ?&Ink!3>f}t*yFfE&cf3^jgwDNt%oR7ydhaOR=SD3{6>}rvxhG z+$&|wI7LU>$z3=G^gex}O700rub2QC-G)Uz>k-m#o?($MdX#SbZdl~49e0CiJ0;CB$wFH(iEBLM2;FL5&M^AQx&N68_}$ zV;=N?TU7w1R7+5OWWxULY16C@@=e~%#d$m$FW!wpeCoNl9H8VYX(M-4w2{Mul2H$e zl2;B!44?tI@7xJ|ez?N>5kiHoBKdYu4tw=64_is;LVrM1Z;p0F5Lc0gu&2v8ob z9@KCNkO*&m=55(xvA7c&d#K6T|9DCVCJXBi7x-J`{%}Qlsr-pqwbK1S#`{42nTN(?ku{gF&sEnoRuLlh(oFR87d4j47;mN8p{FC zjlVb6<$JPcXa@9x`SBvH=OAMV`94z+-h6nptiv-xzL(7+0WoLO{CKNG`uI3*?Hr zIa9rcBOruLC@%Iitwpe(hW2h~19!;TlE3UiyNC-47W;C|jD-o>|K!@`m1wJ%hpFp# z9MO18wex60GsJ?prwIk8nvC76Irr;c!!sAEtc^LvUb|W*Y3&l2K+!jU!eqRh>E;5{ z&9k@#Ft${+<-i^YUkS=_$2oqvy_{RYyweNyzuw5)1df>O#8=$YDRMH|C zGnz~~SnRvf{$X7IAM^<7SuMWrz!pd|?<6zR1#31ivprhDPp2m&q@BMfEMs;c69Z+; zV6De3;p%&qZhMQCd@lO#?Maqhh7HlixF>cINJHI>$YV;%G)vp2D7Jm%hAGfuO}&P^ zR)1=Gj=_Ezn)M3a-r8=Fm-kw3m(tE5?mZ%8?;eJ=XSGZZga@8%`?rIf^69@g7{J6# zD81f6-trD_^kBWN?~}qoSiYDwXRnTVZ?vZI!{^Ad#U`BTuHLw1vmonr+QNGjZ2^J- z;0uEoh6^STN(uU5mWIi*VYO*azN>o!ym@!MM$R51=*9(WIeoH=v&^r?zdPIakCUK! zPcMm=57Fr*c3{0$jilHrsL!^xz?vCILv!XB6^L0JKS>bF`~hzk3P*FY{L+2KkE)Up znJc#mD~8J~NSn+nw@Uv-nlEaN%oDDD6f%zoC50JK zi{MciL(A@nMeghiPNI4aGS#_3t*@&r$}Nqm@5_+O#WsfLd-uLWvMyEi8`?MD5v$% zPo#^!52SsP%T1Fil3VH|$TEK5we-+CN!dSn6@^Wtq1fx2iF?u5)G~SQ7cRJmY0-Sy z7M%LQX)zPk=akdGaYW$d$jtG}#F$c{XhTZJDHG`xuMOVYjW>oMYc3B250|~;!f%C= zs)lbfH>|}KZHhxl!*3@s_553VV+;u54TCoWfp?dsUOjLP7RQVgBUiHg)J|Tdu8gDn zZhYN5dN%Lb;Vwr>5Op=1O*j)uZC9GYn-9KYv1MZNdY5oaX#D1nPXz~F6!@oL1sBN> zA;4$lT3EhtcA$!Kl*&33#d}x6xr>)?eZEbl-R~PsJ!dAia z<0O@qP|ezl+iN;b>7*t#8KStx%c}k2je>;!Qsxz?e5IH9DX6~SwdKQvcP-_&fMu{( zSvCS0aIFHSqeS98j=3{y6`up;vTYcclQ_Ealbnh1P&N|?XwZpn0eq3|nhakht8yix zG`>F|dzjxM~pRRN8y4s9kwE#z})C}%X0&4M`;%g{ghFp{I8N&ws5VG5ySK(PXSjU4^@RWRU zOZ~-7$yILms+uPVX@E;SPRmKo4+=@ji&rG=6q9bOcOgja&HA&!VL92>R)J2*qjKHq!o=kTI;LCTyon)fJ4c;-4~($fwftrN*!K^X ztv!4oM1Ae#o~iyBdq|ceSwtE4RP_(bWe?&?zEh+;&;%J+T$m5><|;VzmM%)tjwuD? zIT3QDjAITf&wR<_H$jbEZ@O3(uNFd+0@kg;)lH4{8nl#wlOpg0X54?8nuMG;V{6dVKS{JM{X0!&#-RX`W7RtJi8tq|{ zg7&lNdo{3g@W;>$%MfLZY7^h{XbiGkj^(nTcLp(LX?mU5ySuE|dD4vH>Fy*NC%Zq7 zuKk^uVx}?O5p5jgs3d|W5$(@aYB!7a_&jiyhE!1CvvVk5qa;F5!*kWkEWp_#;KR)lEzm%^3w z!`e(XLUJC(Zzz)=_KGDOgB#B80P!1A;|W$wE00X}OSIIVD$NABo(yL~PApHHQ=%y4 z{Db7e)u}3FX9aQlek>CNy0R`IV&^|01yUhAfuu;-FN>Hnp^5`@3v=TrZ&9II)y$Pc z3M)@Uh?R#WvSU>#kNc+;r3p=z;wommPPHU{l`BOF-?gGFd9W7>P?F3bZYFtg?C6jsiBB>w$rMUBy@!v4=a>^u0h7|^r6|E|Lr)l$$Rjz` zN#xN4*vmXl2{AqSvQjSWq^tv`+~k>n4nm+^#2(CLNPEf$ac=2&y1-<6 zs0MRRG}c!<{Z>(M1}~%#H0K!>FAj>gkV?Kn1-=c&_y3?%opRk9t0En~h|x}?!u^K2 z!VAE)c98=i%5oo36ytkztO6UenHOL&ohC3HyQH;c!j0N$$W5HZQ5Y?g8h5plklKtp zb0NUs%-=aVZ?nT1S5P1Fs^k_A3Jk!EOl9z1FQ!mzmB9TWE;*;gQ1_T`lo3pnqKd** zYx16;a+9ztg(F?v@GctlLi@`_{9o42aV;@k(wM4Z$ka)=Z^-(&c-bi5Xhx3hLev*u zu6n58P7tn7XAlF16$@ln3jZlXMA=OJc5pZYP8C zeW1D>0ZxgV2h1&TY|7`?MvFsJzSzted zeX~~?5w275CqjCyGRYDeotbR~xryrtg4c}s;7}L+^sH7-GS#@(Vt8-%=g1whd$^$M z<{Ug_g99EG1;K(@CP~u@qN37Ki00&o-PR>MhJPU885d3f@dTfK*_b$9q`rd#WJLn7=r9G8wn)jpkg3kmx^wkLF_o%Sl%ii^v`-WyC z*9aJ&3Et||EK7Da!>B)?z$VTp;h0(x+?6ycA6g~Ggmugg}2d(xK5)2H)8_!6bD#l=|A<@*6MqhfoN z8uF??3a(V8UcrM4s;aKMNM23xsrFBJnR;P4qcmY+BJb~=n&$_ENw1ZYGts3=f3xJy z#*)Pq_cse(Y$!OK{?ifW#6cCeIHmCwJQdJc_+@Pbl{`;V^KNdx{lrts_EXZ(U-eg5?)|DX8%{Beoa)#u_V~u z*T$Y%TQ{s-%eqGw*E%dbY*YbYLsB%bsKx$j zp_+OYD@E5B{J#CfSTCN_ITXe{70LIR3pUjK(ySj{$Ai3VvMMq@DJt3v+FEI8rR`)# z@Ma!u3@Icff9w9io?b5!{LtXJ*oy$tlKZuQu%K0@O{(a*-(=eeG_qkk^+ zPe0JxQ7HPAK7NV53jRE$)_@c4b+0*Guj?LjS0eRn4!!0O6$qLLSY~?7ArWZ~0jZ5E zNANI?%_eA7FXP7Sd||JGXbQMJ&1Tb+yuD=tDb{NM#E1fl4;4&M^*$)@>?HcRNZOtj zlWbr7bfN1#R;2MbxOR=3@B>(I1hPX4=By7k8B_hg&}eLkVPzRR`#ozlIxBLXa&E-T zIbvRLoudvDy(lax!z%bAb&D!NpaG+EFkGvpaA-ULT5BfP2&wKWoDH(Csi8}z9A8Ud z=a@+xz6Zr4keW%&`4ua2gxo5p?`j4fMU~bZeu+IsDzXFrBjXZ={Hey{Ib0-{gcOyQ zi8iSAy<9+!KEG!XMZeZAC=e24@#MimN05>6c0nPH=VPo{{{$&kL}N zc4rad-`Ir!Wk8z0rHSoFOK`i$cAp8%92wK&MX`sxtvu>k(96&+aP?U@hX|69F4vYT z--Qf%$t-Irl_EZDiVzwgw`z*lxF=Pgtx;>%^9JhALYrrjg^K&Q>n(Ss{t*ziybdkVEEIN`ZC zBlj0>e%)Q0{n5_%_D*kLTdl8OE%YER+`GBLaZJZ{Gb=x&xJ!vD8#i=$KdjO`M`y6u zlXg7)_RJ4W(3-io2u0{u5idP6T{KpuF;nq9H|xODF<7^P*68j9AO%^(%b2*Js3;ck zGa~DE)q7CJ2Qr>1w&6`&&@5KZ;LSZd?hM<<$5keXN{V+cT(|w|g?n$Z_WM^4#dq7U zULZq|hQqFF9O9l83VylktA5iSH2;Mzj;)Np64Vzq6X8grdc79TER3xG`jp*Y!a*~0 zr^f%Eov24#hIpI z>Vk$T&{}M>dgZyf8u=j@h{C!(ta}yq8_*AWo8rQT-kKff-o@XsgbG738Tjw*UYi{u z%z-7_Q@o*EkH!mdHw-|)a`Eb+8G}O>%-9ky!F3ey-m*olg5=wlNWKNivpkewHm<1F z=Mfn)nwWr1(T@i1ho&gVAG-let6LKH^}Ru^xSXLlz*8aJ`r`$aL1;q3Mz2^*dw?<> zC?isG{GCF~%3w{@*u%zZrMB@9D$;e9tI4oDa}F|bOTPCZl#_IGMeh=FihVi_U8khzil#0IXSi+D`UU&CoyVN4u_}#GaMQ%V<WpHw|oEiaUi>W!iSWevm+Oe2ACnL)l+CWkkGvw4|Il~+%&0>ZMqLUNS0|)gqP>5NRL-^lLB#G+0U0@)i@&5Z)JKxVV5%vDUjQR zOqp|>KA;5=r6uBAAfr~0=M_;OHb)5(J&(%zuTBex!rg&6Bd&8~g4qffSZ7rzI)YtM zhG4asfbmp6OmZYv7T+t!ORP|q;&VBLj?2oDeJLkX;aORtw;K}aIy|;eYAGZwg8{RY z-EyfK_A5(8d!!P=6wqNXYU!m>nhp(q6ymL)jRyNO7!wuFe(qEv`i zmgKse9we5WVcw_EcrMdB zBBm#)MiI@>$a)Zsj(c zx%qo5%3V2bZJBduTLcc$GC;4*xu~xfL><_U(-&ZlIp$)nk5-iK3&b2vQBEqYX-0Pj zsFd}&(hs9G1s3H)`gj7kOi{rrVOtnQgJ%pX*e)B=gGEQ1*jeS{K+Z86=bm#^hbe~X zZI`qE^|Yb@qGp;Ya19%Q98@UX*+byGts?1w$GYiS_WM(+EBVT&E~yo=DlGf?X~`P71UFnbRW?*!Q0vN-(4V>F-9!EOaP^p?8?M%P73xe1 ziB(yJVU(~Y%IQEvq9}|g;O6W}h8#(idaGnv#55SC{x=4Hk#YTbyf>UZ(gtBObAj#D z>+X8pKJ-)$ick+LuF&Do*?>d3fx_jqlapU9hfL8kzxpaO^rh1QU~IulZzCE&Wqz_! z3t%oUrqtQM_?plZQBzHiJX8&U#j8Z&YV%EL*Z0BAYeX|RYv;u-OsTHx&xs6+J*dG& z7DvGVSFH7Ya35CR*W9emX~DZ;nkr0S31B^^{WKl4pp-pZOCl8`Sdy(Ra7hS49cZqA z5(lkGbsbJA0kPO#8O(MZ&{15WmWW(BfHqZ3m1nB115!0}N_wPT2kQ^(u+)iuAw)8y zhO`u=o!AZEIcoUg8r-)u55?dwv#&VK+}Q^=NG66L=K{xG(f$BJOtnr)(~_oR!Touj zK&Y4I&(*i|4le9DIE_QM_T3b=qVJhXo0zk)RP!_04JDtq;X57h!0ji8*qer*``$Zj z_}kl-?}77b4&*D+fV<0rCv_jp4-1kk=_b5FpHrZ6`3d1{7}D^!_eq;TS0d<&21Sdr zeCy}4EHQ8E-EdR&-O%xq!^@bC7FoU6h}kHSKDM}aQ@$$4oMr|$d|O-fd7MY(*IH4h zyBmW0&#cf4*dWcJqIF+rC3qxH6%#rM81((ADF6(bm1@mA4grMrEGttO;rDj3K98l} z!F#5LIW**xvv>c@bVFrkeDu@2+SDN(G2@Uo#N*<$90TKGXQ#2ccl~D<*7m-&$%;$I z*y)DEZ1}`aIDft2>jpp#UxMx)ntq}a=eNGX5mvRoZ+&Sdz^6gjvGY@@t_@4!MY&#^ z$7yTh%+IAVu~bOrDiqqh+tGc?XRhKcS1IvU6={+BysVw2fSyqjEP;4Er^G=3I*T2 zwki?W(^QNC96{XaBMw%YX2s3Qnk_ags9{`dVi6{!S~Z(ZX8%%wK_zW*=4>~)`qa4j zoD`4EFyimI4w@m)%PdM^&>|hansd^Yq~HEwLEi$_zEfs%qR>+w&2vRb^IYVs_gWkB zsa3G#wDr+KeB)FPuEbw2%`VnpwwaDi$X%hV54ubQ(3wnbH# zL%*Uk=nbBbdD`!8G3iDB&HI-h1~qUFimpMwyO`@u=tXMI&mW69%{|il*i6#9fS%La z)H01}OlfG4i@w|KbY8fwC>4tR{1JoavagRzq*)Cpt2WdXCKa> zDsR0G#O{S!?H|i7TKfC|Tl#`2&*km(68i8ETu#4GKwUA&h2uC57F&Z~tZXk~bMkBy zhUi}sCO7I)XFfCK1bg6jMXC2pGDeLj&AsNqPCRb@4lBt!LpO)g0Uwt3`g01U1wAl~ z!jP%r!;FgrhrokU>UgzO9W{~}P#TccB^|h$f;!sTs^{w&^+1^kZvvW*CZlv@P8Sp` zGy1cE4M_qbG@b1Lm^=uB*t%$}0tE-bFtS=7f<%IBaAD^OP?g&b5D#L#2IWN4b*kzH zQ&WE$+RPLcx?t%jJ8lzH847`&W*QwwH#9~E-f)E-io%(Swbr*bc)JB(k*}8QoM6|1 zI*?1|@{(!iY#O5=hi+guzo*IkHHQhSklVJY zm9er4n1(b=W59r6qm;9IJ<_{c0O8MsaXg17DVjL7qTaAKt=`ecR~76xhY^^~5&X<1xMF zpTFA1`zYLLFVk5Beu;sw8R$w7p@MZtqk(p{+?~Tib5!Jf8REa z@!g}AvX6^|j-zmbe7xFAyoqP6oVsvVEwDVFn_ZFJAxu&@Xg)^Gd2!!RYw z>+2{6*xYw?;*Zb?GDJR=?WB|1*(jV+90GTg`ibZB9`FCBZ7|r~QK1`3h@&*aa5hKCr_XyTsITZ&R&G6pWZ>#Z??fotv#pL;37R7WB5T~1eDQv z@?W+A{d_kH??f$$L4JpoB8a@23s7t^JGUWjpH1i+c)!Ckfs%fQWdm#L)hMMmAYuBQ zE#df^Kc=;AIQlm712z`F!`k8L@|pb|R?zG7^OG9C?%5!UF*h?^ zkzq@a;}6#~Y@fWTxflV5q(};=K{)C={zT8ff@^P{L-H#h50V{Vv+rDw;?WfaAK5q+ zh!uxUUQR>=gOEsfMr^6?_+j9ObO#(V8+^&LnA#hRsl5o7SH(MP$etQf{RhLPBfwFSn4^% zP*&x*S_Y|q9nhVGk;H1&1Zv~)HBK^D6q4b!a5r>PGjNWA=6E)W+rR~Brcw9$T2M9H zfzS;HCt{;(KV{NNi@bhXl~o~#w5$`VW&ZL}WR@zv=FZm}Yj;Y3s_5?z^k$%z-R0== zJnD?DXaMec@5&_%?=K+50si+EySa&gk^T?KNl-ds*YcLSM5+Os}GE)Wu@JXYubT>n0=0x$<`)=_kC z$$#4rxdRE&IH5pk_xA=FVa}z)DNWLMQG!fd^qTx_!KZ8`df^45^xfzh43K)ir{-0U zns-AmH_8S2r@tf6JQkXl)}G8qV;aKOr61y1%*T$H6k-koNSyxEgsdiRlSRCh(dp#Ocm%^c#;(YgT!f>(l zjY%4TMga)@J-8x_$iou@fO8;b1Qdb+#>~dR(&iX6kfp?<o?iGsH@ zW0NJOh>2m8i2@hcGj&%8&G>vH)1O3z0cL*>;|_CQeQ z3`Vkm0=mElm-9KFn2s}w`UMjnOzuy46 zWybEO+XZ!=kh>lQRU)PN(Kw~)PLjrSbS3ZpQJn6=qS|5Y)iT`f+}zykVC*suXb4mR zoD%=q{g*Ky->`zemNZ73TsoSd&Jj>%#(=y(aQfeGnw;SK_-pfZnqG5WWb@UFbFwk= zq5y<^-=_w4dKodHcNcdUN#oS-bOMKrV4y$_QdU zGvHCN#K_x^Fh@b~!NVi?4*y0W{ook`oLIL<9fMJp2Dya~pim8R4nLnolRJZS;3rbN z23f%GGn!mSVL}b^0yDsyAP=Km$N1iaEooW?8J@w{D7=G@DXiP?&71>jJ`18t%OEM{ zL8_UY^mw8avfQvQ4$5j7olbru%s}lX^|D{!^G|oRzK?Ow=+kW zM0z>q;MP`qYfF_c>fmoP5D$Uji$yvhV?AH63gKFZ-_pZHegCjzg(DJ{y!Og09Pw{J zI`B_hr6th%CSYyiJ?uFFfY3pwdmtg|zx_QOwA$>h?^$+R+HuMtSNwv;w^hB3cCL6* z(1FAKASu=?N#8cvILChO-r#RmZ407$gRut@xy^7KJLuNY9aU0Q6Lf^S`u z(O#?(D5Q494u$?$#U~(hxolZXx&dxy2X=9jwZg6$koY&t4!eR0jrJ`tJQ&`G#}1IQ zVOM|Sv9}q35CAnK)J71{vp;~xgGy9=xh%8GxyD=|EV)JjU{6@i5q$~Fb)pO`0rQ{K z^qeDqf=yu03X33Kh36clFH;^4QZ0UTu_(o@#s?&LZTJIIKn#`+?C7)9{BlW*k=kh1 z4$U7 z)DiM0aGd>H$4K^0Z0Qbe=MHxChkGiP_rslq^~C$>Pl%ztnqYPPyZc!aO?!9=1nkxE zzcdh0EXE;)`PKxfw_d&>HVlB7uiSdT5FJI^G7F@Ow;nOB)k0xAve9KM6G7bc_XY~W z6?}5n4rJyim%x)&(BB`})w%d#7$|Sk4Re=Y0;|5)YF#FDV7pmyQO@KB#_I|6a)gIC zbZj)ww3+EVVrE2b(iS^EBl-h7{tbQXR?Hfoqz~}M{HBiQ%bu#ev6rRhOGtC6rs*w| zlTD!}`I{n3&EA3-H`)>Yv^onPYB)fj62n!qyxoxH(x3Wa3R&JhCB~dTibr2k=gXye z>p^=hi$wZ2rlI`0)UOb{UC0Vy^N?rB_ad*E{$}E}Va^- z1MHnV1~6VYGxYHVOZI7@SP>4}&JUT$ij}IAc2p>glbg=WvVaDLEhX|A772c&5XVtU z2}BWBquU>9${%V|L|(%pg5UP|agrRm!Z?X=ppod5-afX(dR@F!3I$>*2$^F5(|PM}?vR`Xycbp=i_lOLx1 z922>20rwDccq-6{02zV27P2f1i+FzMW2F!0e~C#&c9zjVV^|;L_4k$G9iif^A<_aZ zOQ)j;v;D!ciL`9#yob^Kk~*IkuylG0Kt25JN0v_dTh-Ee`}9YaPFmWYZ=c@3bT;SM zxODERWb@Lwr=HT%Da@V7$|m9M(?`x-b+*d6TNoBueo37axBXk#_MW_B#HF?2#^Q`M zu=yE2GEaj1AIx%nUzUJ9+#ucL-gI@54$ric1$D;3C`sT~jozkkvoJ0MYVoDo|C6IUvQni z*WViqNaxVYujF4PPtQZ~WUf-%>NpT&i^NAy;MPRW6f{HPqUCi+G^6@HnZrw@2QLx9 zbXm2*?qJ@Z(t$Il838xRR316J-Ps%tu?Bp1hHbZ7G?ByHd-dkh|`H*rvIR*co`PFZYzZgz7xFa^i<%p zGmdTwfv`Q}E-}vdCVBySdfj~c#f%%0Gdw#BEK5CmxYH7rs71jKdUNPivVQo>1!T<_K zVGXOQVN;vTRuMfBIJ^-BjR|O9_%b!ymaqzLOB;?uRCf@^$h_6+54hzXs6DWVw&Ey> z^!o$S9}GZLy}Fj#M0T-GRLy`xr-Onh93F`V6Ct1RPFY;2O6=W*Jh^)YsxyD!`Uesp&>k=raC=zn|a>=SHUzR z>dbY{>Rd@vV7f*W00CO9RhF^Qprjsio#~pr2&@F1Hd=^g9;H z>9+gd0=V?+&A$W|Yk=BZ28^+B0lFVhA^@lZQ{r?Pr8LPkyYhnPDpRR~{R0a?;iddy z{9>V0MsPtOpd}}YfCu#;OU*f~)ny3vZ?2mSJD&p%KM5SY+}braoZ<|ut*yFzI=&yh z2OTzJXlw^qsSo$nHDYqG5p<#9emI4evTRk&c%v=_sc_Q{0)Sd2#?Sg}Y4JM-&ZeaW z{>%ci)O-VT0O}1WY(I}sK71KaSdo0oyyUC@vPTt-D0oRHCo$No`QIpNj3^C$*3+-L ze0ip@yuN--)rI#pWPza;7_-1w4K({-mwS7Adpr2&0RMf4|90@-7Z|bs68`CsuZ0Uwr+##Hd2#Z&r4Zsa@M;UE9Secm@lRCgagH;*G^okZVb5EX{>B zq&e(>s@`JY+Rx({Jm`9Tr%xUjbmfTv@r$+P?Eq3XfWMcjhnBMLUmIs0@`uQC?TY0%DK-Agp{)T3xffa94o4# zJFvLVdeqr9S6^?oGgukP%hbVh@GBmKd6j>1^CRbOXny%<>U(h4z{AxlZ9D-+={bE6 zGce*BV$XWi8mLnBqdkdWtEi1KJ`Klo-|4Wwminjz=|bS3>6chuXRw|OD|>dwRQS}B z4;Er+QzmdIvE$&+9zPB$PlB5Tb#_br|S}B08+I2$JLt=n;>5eRn;hA!w3< zM!jGKBn7qEzHy7n^w4ntn3_37O^~gveA);+{DLMUAhx#PS-?MVC$gVK7tT_bb8E}Z z@W~M2Eg*IL1>H~H9ps{KsSXIOKLeg}OHth{$6Dgr1vX1Q1Lnf!7v_q!(+S`)zVHzF%4602gi$qQlQMr zYFmb3-&cXwDyfrTS}-u9m#H=~P|*p%b}^%KIZBbH$q@*BU4? zVo^|Oa}>C&O2W+IlNwdDoi7`;>0_1n?GJK=Z#W&-Ycps{QK0M&3@}^WSAJ;1x|V4& z>%t;%A>3}xGrDDYL>kBgnK<(|Pl+NmNDFNg(H2(W<%>E?;XEq!m2K@DaYQ37g2IHU z#04j>feaGSuETts|YnqCgfH)W=JCCBJIC->|OU)lSg|drD^U2=aR2HWy1J19@6?+CA=ok-c}%|z-LEa1!)g9;$&XsVy^&d~*un4Xn2Rst3^=?4Qe zs!z~%2Q95QPvyM`*I`i&+dBBBGCld)#A*&bwE&sm^Pfk2VU!YVo`9-J+uhl_-Qf+M!Qv$^dZ3-u;b^DhorAk&;t zPg{LZU_e%Yy~L|Me^D>^XNV2lq()EV`p1q^UJ zN0W)!wn!&0LxG5@d+T-m`p)bKig~^6s1$QuQ8M4!f(CaqHE&itOqZJxAcb9;!U|t- z^aQQrxSkJkqecOc0Gt4Cdj^h7jbwSHv0bKYRWc+AF&u}C$txAYYr*!DvKG0=E^_JN z4L=nxjjgwrCbx>Pwy`2GGV~bNnxzJ7Kg$lb)s$xkykuMmGw0~d)ZA0E&N9$E!IvfG z$s2&5_qKqi0sdB1wX6WO-kGe6abRU#_*txr*@DQr@KdQvL}Oj7fDLsa3plR}dE3#h8A&Sz1b`j-dgxy8#l*!~XMy%tu0b|t)g_+2XA7RgzkbXibd zG6-c7)*}`pdV~>{U5qId$9Kvmc@eWT)uddU(ok&WyD%%3SRXJ<5GCuEHE7*3hq79w0S^U1D#t(eY zsW1oxqbGJyFl4}6Ks8X2oitYF#wYN7Hc?2m?-vPmWORLpV|pwres)*nq`ti@)GjJ! zTN8_ZB45zV+6uycm0`>hOH0SBo+Ku>HY1|3ycQ+!No5b-Ug{l?Hyl56KS*Vf4+~n< zi2#vatX!n1^UuBT@SDK#nBS|ICQ#?I^zPhakR7cL*iV?s7Wi)X@Ub`?1tt{MWb zQ$$yCiC$f^*)-jvU9OtM0+L~n5mDFHmMl<9$LKHSasc?rhcWdI#f>N~KcMm;=OI!8 z6aElkY6fVsLFRbu6e@%A3htdJR7+Tv0r#RwEs+vmj=NC1j8MGm)kfi@hFA&~*IqE0 zM;tlK1@U5g1HB;|fX#8WR>BA{O3j?#TlgFbKOaqtq)_e^Zzi7avu67Lv-hsuZR5z= z=>D8vL34X)$ZlA+)9IcJy%`N7+ljlKn`I@Av^_R0K_X>ZRFhOHVH{&f5KERWj7(dtZmZSZaNP-@U!7cVQPsSO#}uG?Kw|Bx5^LVx zT=nuxrw92+jDl?ohXmY86!x=o?p0TEynw;u9y)nA4`>pqdFb&DAw`~oHHh?gcn9iB z*^?j|2LZ!ufhFd`wHFi~cA?q;K}sEZT%UL-tY(nW{;qsR4gzeMQwai&RkktW?m z4bmOQ7gt>_ioXkkMn6*~0HlB;gd7bs(O0N5?QHBiWj75#doOB~`%)~i#sQYxT;=AT z{-rfb+{=}*xhg@ZsHND=*BYMA$)`l3d3;N7+{TexnUH?gL3sL(^(|4U(zl&&Nnr;) zo!ibMdQL#O;hfG%N#pGFvz#n^_fx|6pHB%`idrpe;k%QzypOVj^HaiQmW_pPS5XSN zv)1N{m&-9CcLJbioL3Hgx6IR@62_e4D7VR3;vV{InEPjiwHLnlu#Shx`xG2H`>6}Z zNfCG3hpBs?qHU9Pw=?AAo;$;HP=3Ij{m`$`GC%?aZfn_$`D9KL5db?)+(|{FGp2M= z*63`;WmJ`E0=|7#KefTD8QA44A@9@kTw@?Ij(~^8QRfl_fz1_oubj^9+_H_8!TSe; zpBrG;FWx)s>7}ro5W}>gjKnNAfw>!QH2t}I*+!pdupn)&r1oZLjY0@7o0(*y#8eg{gb_txk{{`R1xW&)Mc! zNsPlzy6J`hSP9E8;;CLabyN;pnFV|%{hdDBHM6>>q*UxL`30l?K0kvsrw?PC?p0A z;yin8cRK73e&STooMvuQ4H5Tu)UXO#Ew9*SXNuy4k8>b+v7!t`a)dC}SWIbjV_=Ky zRzZ2sRg1-R&88dG?70J1k%ME}JVm8-)g?h8P>AbHQ%7cq0+lKw3$Oy<(F!oM7hH2M zRnN6twfF(9g6)@GJ<+fE{$6-e3NC}IM@54u@GaB}f>a?kx3*WF{=u3dvvbDa*31oqp)G>oHE#(UZ@ zDz$t0UpAy;KBU;)+9AF9!67Zyy{gJ*Yox5r7vAmKx)*)zGB?qqhGRbaIkn<8h&o!_>STC=tJYbYL0pE zNL~2EtSNkAkh?5$1p>ZiY`su!LcGwr;?ak@5VTqzWK=Gn@GS2upcY)v+}<0MZ?~;h zOqn+BaT}g3R4y?Er~Mtwx)xLE^e_7XC`+5GwF8>B)4*TQ%ZJ#GOU5e$tDHWfN@8rT zW;8c)#-)MaQs9VME}i~6T&l~Rk5gB8t=8dl3E_#h!il{lx9bTA3^` zb6@bQ)l8|sB6Y$A0DxY^4S-is-RIZ~1;|64uPDp_P7AIw!m*WIIGh?6R{*}Kar4BAm>ZLL4alPjcifz&vIRuP zV^8-7@@WvK87NRpVlI=Az4nUN0Gh`h9u*G(Hg5~y%GjH?Rch~2syV{3(cE0katl1j zAU0{rmxYX3s9hS!eUi~4afhBLj94o?PpOceC#4lKKH)}Q5UIIti88km1m?Eooj`2M z_MTungbGz0Pxk%H2MgPnLMc$h3UdGi&oXs>y{do8E_MhOTJKylYkyOJ+nt~|rqKZ9 zaGm}N?ncgItI0`3dUm1pw@cj|taG%f^mk)WH(dBaZ}ZT}cZ^L!F&9*2kA{8W&q9$&GYvx|LZzfdEO7%CdBcB*w>dck zEZ#I3Z8NCbmC!ZkaK>i7CLA3>jCtyq+E0`4pWQfG z-pq^F{I{8t6KEBO?@c^jLdu6xU!Ac(i&tr7x^UKSPFxNNm@-H*G2#c438ZtE(-Oq- zHLG-)(o!LlB+I#o!DfY$<-A-dCy_>6T|H%vdNrV>Pr6B*rld=6iOO+_G!zr~^EKLV&><*Zrl!0+3BuxAB@XsaH22622U|t6zLKi#^ zX3v>}k+@`SgnbL3R3q>z6=|$mty}ae?OXv^0f}tq3!)Z4bTW4$eUSLzq~X3Y@uTR< zA6;`&rBta)jsvN|*Drb~)>s=a0So~=_Q20cxY66KR=~aW3LlpLy1g!J=|WgJeh$%a zQet6rGN)`CL5uf#O}glq+I!fDHE??sZGWnGdT{|w8hi(ZvOg}|Bx4kj*EQ$5uIBGh zk=?rf{BN1DL{5nAgs4`Q=0ISJQAm;i!J0-rhJW|*T*`9aL;^_dSz<{FAme*SwooPF_%y%EXQLV0o7p_ z*>*tghjfrojLD$E2?ST-ER@#=@b;P5Hn;y}bsP=}aItyL|JvF5$HnIPPxr%}t$&>V zY!^5Iu&ZJ;!h1#O4gg%wDoJVnHT;*X_9vFoLPa!C8~VZ2H9P~68V_5O#zu*Kf3C(d ztR&8mX2dQ0*a7`h$rb{LWftbR14L*DV}+!4FP{^05st1kR7?z-kbqE%ig2fJSmps0 z5}&-s(zOQe9|LMByCbH~`wWscnAzV@NJ*x8p^5+vXo!uP<`f<2&!*zeTLyh@wHi>> zF+LhQ!@{EbSa{Nh62(Za&kz{#|HKDFG?arc+qqNFSl9z|b>P6M7G~lGX5sW}%tARe1>OnA0OI3* ze=l4KHj0P|b$%)c_eHD`yMJNBwj6p9m86V0W9!Smi2wR6%qSkPSRM7Y-A1$ZFt3pJQrQL??J3`QcoGE1{Hn4H+)3 z66#-@kbVfnUlV;b;9u}xhJV3(nf=StM4DrIwVX0{Zy{8`UlGmlEuq4HJ9w`Eyg8Ta}C^SxBYNUi$7pgwHrWP0_0v2%`#AA#| z<6k&|)U9wCi(FH>P_zCxp8n`PVzGdBm79I}^@8C&r-1?(gqTESA1Q zt8q$QUZnF zI*yGrhMdN?amMkNSZ-RVr9xv`Y#X)X*pPy@Ah$?9D_$C+2hyVt)`Xmk6bwLD@fg7_ zV}%9Y0^%wOY{m(xKGNPOk}Zk;S32|ZdVOcqytYLTw2Zi{2->2I&D9ZxJml*seR-`> z+LNla3VnXVVAti{tzRaxWrJd#X*zBsyDduCxpB1wTib|+U~3ca#RJ|AUtfA_x)C?= z%-UqY4|OQ;Q$y5Xq-wfgrE{rch^2Z2)^BBjVkct3HM}C8cDU$FTItQ(R8IsMX%Z;d z7t!B0h{rkVV_;{=!B+M*E$y@d>`1TwDAlcTQEph9tI2>4qw^e%Zbu@7UQ(&RCTSos zXJw>6HL#w`7{dU456&^1Ya)I@WF-NkHO|2~%cl#FEjVCFyj;j|Sh%6}m3)vavQ%cA zv?1f8uUWJaSFZmZ#Guf!d>q&Wk)p9?RMG<-`i?R;$9XpzyrE570@a{G6D9 zpT6N~0T_HAnd(ERHK=6jt9jmP1#%Qi^>SJLH1WeoK=PS3*}Q(Jt*zbW*48Y}wS<(Y zU?3)Ew6qZ(mK+mC(YC)>w0&lOuUdk~%(sEr=R-IL-&AW@rW6F6fR3)KHH6PxQ!9`J z?uxf}x?Dum5!QeFWs=1*q5O$szAt{5WD+MMI_@oT*LBQ8^`}Wv_6IY@m!CQ&|HI75 zO<(g@2-+$&B!Sf0vQhY{H46`vmXx0&3F|*cej06y5oLz$s}pyHaQKcHWZA;m-j3pt zAAyIP^K55lXL}rv(k(z>-8M$|5Ip zyqu5yd12JSN>z;v`wbsE=0CZ&2vaMvXW(wY0i2u_^I39MjMziY7tCx}cr=wjo*eTH zdyzxVDyH^ps={A{HQ#%S(98*VX#l=^!>9ap&F3HZo1FNgsIlcyRM+w-GV`MU^`G+B zHJ^9+n>;61eoFgE1e2p0TbPk95bMk_i@!}0ft#me;y;`vHg?DewkwbQ?Q8x?ujrg6 z;Yi&Vf#R!W7>#MdXBeKagH)2^nCyW`U{TdjJLGB8O$;A5&xz*Nq|O`nOIwCzU#I#) zY!{+W;atKjhVBcHuQ?DFxamfIX4&?+qL=a*RuD@~*5^?8BY)mcDMGnjKoE_lKLpHR z=1ckOclWD)Ex{VFXnz%hM-zl&i zJUTu{5uoszW10mJ%z7t!s$M}{;I5-j>PXO+t(v75oVp5(Y1q`-cz{vxgYXk-b@8EX zYd!4hwVF1$JEK29UWFVL09S2LyLgh1+BEezy!JPA4kLj(L`PDv+~?+{^w*ysT$w*XkhU;^G->bS8NPuFz@~V}9>86~WL}N%>k7=*GF4`xa+mlL#n35?K*bg2h z7ZS+Cx}YvZ;!J4`yLt5C<#0h|E5{j$GrpM~XJ9FcGX={+pU`3X2|yn}z8Vz>GNw?= zjB+d~(3a2K`GGc>IE#h=>y0DK10r@|Ic6)>&~f7LkxxA3AS6Pvm@?DUm4nKuNRCr@i09jWd15 z+;K!0!E&9nu(=94(r+4}94=Y2D9#E0Q6YP*txCAWb7?>o3wb@iKYz6JAukRONg!Wp zBoK}EGy2yzdR5bCO^21}j@<&BG*TB6F1LWhbCJ0!cPA1NtJUfW(j-=dDUm|hQVr0$ zyiwZb(U0hlj}jl>0}BMeuMNF(=}gsSaj1X>i($L)2L_tMVp0r}@x<`#3htAQ>p!$IN|GcmLKS5sn~h8y&-OAg))+*7_1cBRZJRqAvKYIpQs9 zfOb@N!Aclh4g&e5Gtu_Kasa}n7G#0DAQEXSS!QUz!@Sv?$)1A2T}w_8A=eb&*V}O2 zpt+~LwH>IoSj^ZSXh}>3%t!;KY_7O9Extmb_tEJy$#}Ul7IEa>OVzAD&P`F9f|=ZWF+sGsP3>^~mwBVW|`>3QD(P8pwd zxa!NuI(gKAyDK19HJzj}Wr79z_mP=9J5nkIVdo4D=6d=;niqZ$<3w59==kpY}ybCxaZjd~~7a&DYaYlUKwqQa<6 znkD;W%7R>=Dtb2&y~{wXy!&GH0BgAze7(!3eGLdZv#!s?2=fMN2tN1$g0(B}50m?) zOzr_Ems^u+h<*S68nIVpV&6;0HO&N8L-cX_{X|PU$`2D9lnFjgrDm{(NdFm}_3p-Q z5%$4s$%-5*O;qd%k9@#bF*|`f>6qf2N4%JXvHR5sQh4T zx3~3517D!gd%1uY;=0uW{X;!>_-WIF^92B35ZxA{YCY|Ga(_Q#dP{1zg&PEyHQ>@}?7U?X60^12uF1h)Y1KV)N`j1AX=8>Jw;z^^dvd z)u}(-4-;o&s#OOma^YB1G@UcygopXHZcmgs(byBVVjc*oX{!skCN#bOC51JG0z$Zq zpk)B7bD@y)0XLi;{O|Q|5bwCnFUjl|Pd^C}VPD1N!=I`|$IGmiZeTeygo`Z`I)V@K z%=&aK>#ASYvsC~3a&uLD-_BAP!C6`%NK4sXafYqBXSl9=byE8V1_X9mSUm?RZHu|h zFP-|TAS*i`Aq}dgzJK1C?({2~8ugWy0Qf*TXa!nIeT_#AHAbZxkE92*<|9&H>Dz`% z-)JKOzRqXz$U-Ny`s&^_RQI)9-Md1p7Pu(&H6Aw9cv!CSu$UWZZmF;G%^7XT@}okp zNhG^cc2IoBf7HUem0xOkiR3T4O>YB#nZmhk!HRhU^e@yD@2BypYA`zGMx58b)tYZK z>9V|3j`dKP2h1oXA$Xl3<&+sxK&BBw7+12DNI}fwvyuz>hU=c3(RDuL+~l7E77N@E zBqV|213m#5$_Y5Zid!=;t&RwP^is7Z@$>67b7$zOnJ_9|S9Q1oL18(+zwa@J644&} z3T$RYr{T6)$Uu&z05hEb3<=TA&DG{^UZT9rzN2S)nBPPl3+^|;Af^eJG|5y1_sM+N z;lz3wScG zz$xCFQG~dhQIJYK7Zx*1tBe>TvO+|Y68_ZLy@k0GuBB_Y;5@Ph+?JY2Ac z_;=Aiwg8I$ZR}Qv#%_nU~=7 zBliH|FH#J(NAQXOt~%h#Rv^c)>@_sa4iR^C!*#E&=@5N*={(!Q6ZsrrV@l85%fEp= zOZz(i8>S9UxT7k2$T9(`Pgo;uZ#1Hd4C>~8$|}{uyv_#(jW0Y~zkdzcc$_Ok1Cd~G zohx#htQO2Id6GM;9Ikq`hhAqDU=yI!a8@~3k6&NwN-l8-78Adz3nFk?WV8qFi+&FS zRf3wH_4tw270!;}2)BN_E;u|F!DGF;;4vIDzOZ`S1(U5mHs-kA#1CNhO%ZyIkxR&% zQmH3`=X&hOXF+Zdz{6RXq+Ed6V6X1)H#Q=+%kRfu=djO1Y3a{nlhczzUQr{vg2$~7Snust9FAPJC} zohx&~cDIt}rQ_wObNp6PKtm9QYVTf8Y`};WnFrD1kD%)&$uiQ<$SfiKIoS+Jn2I!% z+(|U3x*vN~bw4e;h5|$sSUI~ov~yR1A^Y#m;lJAFKmB)m8zIPe;9VPRAVTPMcK|+q zQn@H_`RO(Uf6Lntgqh)#o{LO-0~Z_^XY_&H6`(k5b9NFYkqA{&yWtj`zRY|%H6{)mD zZkE9u!SQA@CdcOfxVHB`C5X5O3AP}YoYnuniu*;yC4*`*#AI`N>A5~?{T}$nFmPED zBF_0vnHylyyR>tJS)8?6Q~F;bCDNWP#;G^)w5UazE2YXQZAxMl z@q}(lF1O-F1$WC_3P+DS05a0BQ1=0$AAw0p*S1N?HVtiDP*+Jo zH=~TYDMf_)HC9>a9xoA49LBHXl=7P?yA5hy2%6VKLAFPKzM$%T6chOyr_WW2n z#+Y75iP|W!BJP(z%!W-o$QbC$Kmo~uoNHP#f*IT?Ffp58C*c*}%%CL8+&I(OG|TL@ zsqj#G#7uYyqK_R05Pf#KAUtcP!DR64i4QV+ma%iVUqis#*x=t8pyhl75gDZDgWa~D zRn7yh?CEs+8B1R8Nv)DKbHxvPFVgabDjpcE)(ncOtmRr7ry;y(J4?bFOJ=wm43w2Y zJgzNb$hqAVL3YKIE&JAhC@CdmY^m~4_xH>)7hw23kTj{p%|C}u==iuOL3J@zPn_k| zjbrw}z7fvRUkWbmkb_m*NOsq5Bs1JczHjNnX3@O!h*S#IL^}4*9<}w2X;8Bl?WxBe zuvDkn8NZ2P6%Om3u_vZQcDMOGz{xSpv_6gU3?Lob6g3*I8! zk4HL?nZmtQ1hVR9!@)Vo&@Z2Z$@=YcWS>uG;Bcf!py1M10H1jjD40@Pq?wx1p-0&k za={SdE@&ea$C-OURp6agOaBd!rOzz=nY~y3<`|VL^%o}qC@X!>(~M+g`43aNVi?&c z_ED+RGQTak4bSl&feT(@-3GI~rPwwC`{}a}3>R16xApBX) zdk=ZLp4+A4{OEbHMi6pAC|M9{0q0G9svtPQV?{IWY;0Um*kBJpIXTfRxuez`i=Q?t~2uK zyzWMPno^rAd~%3afN|8Z6oUA~jbQ>@tLs`lSE;3>avEZq?2;0bi$0EZ=)1H}aH*S5 zcXrI?ar4>SGi)~p3ljka2S1;gIcRVCb3nge_>5=H5>@6{_-lm@aX|t0fPCfUv0eD~ z-l4C`3GY+oygW;ELEtRGG|56aR7y|rLrhy1E#R4&XZtWSiemW?Gwe_s}QGPc|y<>0EuNNUv@Urzu;m?c9ddG#W@jf8M6b%&&?uKJ*D2 zLl|v!J73=xc!eoM-rsB8qJ5cFTwN*Jdc@tH4VKjOhJAZ4OqB%HO{@#Rf+4eFGr`do zoC-tdk0Q5G(c7PE+jDLc%YzdsrK4pMW_QwJ?Lm0Dx6Fb#3BUR5_OQ{giOAcX`D|y` zw3`VB;7Kea>9uAqBe^h@4|mQV*VHeMXzG`usR?`0pBF%|kihzN+2t5gcyV8g{dlDL za%nCxHKEg1gmRAnupeR+P=|&2I1^@EoSdUE@Dp!Vo@AP$9*&A4h!EVpm|MgRU~zd- zROc6ApUXUH!`*XRF&S0-K#stQEOfj*(1!K^6cFMaMPl~AeQ|n-Pz~Vb$hBQ{aIPBN zrz+j7dY*8Y8@`LBcb8W01LBLqBoBx^4!>N8EXJ%p?xvBWN$pf5QdB8}i7dPLywY)v zyFf44ihAxf{u#)-RYE7}K3#y*)qHgKD)ASA6A;K6P=4A23SJd>!oWEqU`#8i#VYZZ zCBQQ2Y1UQ69(kZ-ADuv)4zSz_oj6^hr(ba<YY8P?u%mfo29})OaCQ!nxt3>>$p>WpcV6c?40`?i;sSDzUzSjt zH+D$Z8ju+x8xRxwQ^186s6A)+7olZ_*pGzs`#ox1Lr9fWqxsf&75S2Z`ZekCpHs z59hEF|HNxU5*-T|LP_UQxD_%f}czZW!3$V!rsA%}T20e~IuVI&o9 zU{CPcYAiWAT-5~WH62!qzJ<>J2=03oXMrJ`Lp1Bc%5rJjj<-If?}uBdtF6=?3q^de zfv~=Q_?joh((5gPCz}uShp3lz7}xafYn+TPZCmF)zUp5J7-7LM@2+OrA@-r-eZj5V z@19#-#`$*1V?ZWl9_zfowp29ce^JuT06t{(Jb*)DltQk$2>hg@QHE8k` z_(l0qw5B;Pq3lYl#n?#+<@?zGG4ril7FnzmW;`fOwd-~v1qWLu8?L+CYJEM-Fe?U& zyn`dE*j-N^8dWXsg>}w-3f=pGB@8}7LlI!VHK{IPmMEy4V7}`PIa~I?F~ugOJ~u%p znAP>$&82UK*e!_X4!fO#??IRO;|*}vov$#;DXs_z$a$a8FJZh)`Dm2K_3W$+XaD`o zfaxzL6=n$395{JqoxxHPx)|-Cxh{w1aL*lUKa218Pv6}O=+1lYWpA@=f^aOrVoCjZ zn1$aeF+ZQb<2aZ|4}bd9nlN@k{q)`h{&fSTGac|!DzraJ?iHMY&kybydNcyj8Y0tjdlj@=e}H5Xl*d2{(FnZ`?}58;Bc8*+ z_3Gdp25q$|j^t1>PH3-ZNBp{54cCM zz;)f3y*KDsgLT^-8&H6;kW5@eMasvrU&YIyGYkMCu~eogFzE~@SipAH(#_P1K(RC9 z`rukpouPNm#t}up^J1`5M-aoGrH*JEJg}RDV@RQcv3d)Dv4?O)O>WCConEKo72q0p z-u?m0HNZUS&Ah_=ceM;!pQWKyK%K5~Qj=9wm7WK?&dI)1K6 zrg|b{NLvY>P`dY26GX)TqTwqR0uR#D;Uek;!@)T$o+-5*s8_W^cx634Kw6eu3u5NN zu0U)|5c^v}XAj^yO+S~AJl5z#vw{SjAZTO)NSkU)XX9hYJJ#e^GOLVb z*WTNhu$^V#z8F+aZAg?l!?A{tqLQJ2LFW-%+2a#y#zLt^ z6aHFZ-cIn=juT8wvx0P($^f~OJ^lpy=LYO&>4NEkLK9yUTL{75x@HPvxUryZv-kSs zyD*pdng}{nd%Fwy;DE}~TNKJ&iZAQFlV5-re&|QxHwfcQ<;n$q`KE3+@Ic<=2jw@V z&hM4_Fg)LD-kjlWxmT-vuhf;{`CfU4g=bTm8RK}w8?to7GXOX%O+d4M%L=W$R2oe>|XeUe3NPKQDbUT)?S&p4aV~rH|6mDGcTW5%@8|7V9v>_;EnG zJh?M$`8pS}7NPLF=YVHc+4;4#W_LQ4)n!#YBqxB9qOzJNcEv`lH-HL@psKJKD0$ms zRZ$@ljf09p<`HD-^D1&5-xDR~clA# zozL2%hI^jm*@uYl2^)!ytNt z6y>=Xwu;|>`;OjJ!&+svWCm9yQ2ddBJ5#SmV7qjh#<&=nLG!5O{M3FVOV#w~v0R1f zw(@dLU*2`a?h9lzwOhYMD+F+ z>IS5XGw53EUuLKs#q*J$0T($nRo4jt6D9-%Tzv1H=XUOo3$Vn4TvStU6W1%8rk%R6cN_>LBZktQIOWrw$O)aLdeW?az76?PT4S_(k)@OIt+wS!x#fWEALw);Gf|$yZ_G5=I3DHZ9?|QyZ3i8-ac6?9 zm*Y1?i_DLu=2{^jY@JCSrtEn)Oh(JdPnwR7$5_ZF)l4jah{gCtG{Bn+{BRDNtUD2j zAcp5W{F2Nher++Ufen%YMDxS$7oY=FEnzhl=V5SOI7o4lIt(5=Ad_=PvEl(9$oEuR z3i2zEx!6GkX_Mag3)P82Oh^5A4Diq?VrGlD^&x6fA$S(l1URHGS%NUD*znkGUfJ-J zyG=@yFEpuK+p7Vrz4kJR_Uc4Wo{V#m^LU2 zpAQ}cXe1F;_VyHE8{B|JXvgJ{&?)5t-8re~1VQ%-MrAE`eR)x6VI(t+xKa$qz^(muI6H?)wn7jLhh|_B;wf4&^csp(Fz_W+D({ss>`rs(~1_Iv(K_ ztk$2~d)O-LN-IU2#XF=SIeh8qk8)4nG#WMY=XBuhU8uDWtp@Bfb$Uah{f;Qw$6cS zlEhXE3|mquiyv{>elt|9DPhXl&ZFlgGf$imPK9m<18fKkRIA2f%o4Y5)6h$jB90ri zOS7ao_;)j86^AK53W~y&-G4JYZ;(mB9e>T>=LRPav)$K^c$kvg@CQd+{)Hoc8#azO zgaF5x4U1idjLZ^PeKReTg0ooDP>X1ZS#oZZk`Fkb0h9yx8=@s({KHfR*;pP#M)aG) zBD%vct>8z9@jsnEH2#d{H4|_flGFJQPQb0k@~8902`I-j%#u<}!v$@KX*gyv4Ia(e z^nKu3aRTvP@<>tkhbDc}EV1|ca~6M87!V;Svp=t~7KsdBU=PUGjE%MKm}4ruJ>|69 zYaGiuab{pE#@YdoGh3%L8>~~BmF5HwT|EED=QGVjz$}OR%S9B9Fgdw?TOk8c+|C~; z$`P(a#C@qhasIUu4dtk%z?(f0 zt^SBwI}a9QLY2HpJjT7LSTY-O&DeRqmstaFHxeoswl8t3=I<$W2iLT)3MZcx)Vkq0 z^9(2ulu&WLVmIY5#eXf&zQ4D?hXj~QWFrZNUGzAIBvY*x{9oHOz2Ztgv+wVN;q3hW zzGuyd*G}08;c!kA>?|83MP9uK0RlHY5oJKsqdL+s;ec%L|3I5>0yf_)Uc^y64M%4sjbz1JMM z)WcK}&@afq`|fJ?2fafpwn)w_I~VGm!`XfevrEXbCfuEFK_CnuSex_A3I$EY7XR|@ zl#RVc*Ji5G1&i@_{)qHkKnDoGo&?@20XQHc449&AB_hwJc8Fmi{e+QjE}jcx5r7?t zRTs3^sqfIuJ151t9^C5mrKNl;vi6?D zPA?(W_f&&o$C}iH;@o|)JkqoG($CbIk*=+z_2u@6TrM)P90JwD0}>$G^5);Y_j#7Wu5qp zKAlAsnxCl(P$&^ccP7wZFbfPkH%r zBk|{QBYv9Fj8$8$G8P1TP^w(n+f!@BGkQcsCMqZ;C)gIr3ErNvm_99UfQDbM2gj+S z%ZC+W4wT8Dw_%#4I28dP-4<_duE$}*UceqPS|*SV60iG2DfTr9Gb*POVwsf5@_>6~ z3Gjm6XLV`_`LH7>IU4wd5(h!_2LST5y2_P|_@v0Sdvur~#x0CKe)WoR0)Aa~I*pVw zq_Q9Oa#!r-sL8FmJj!fwe4`q{=3Xgg@0IhY*6lRGHHEk$Ylr-CP1|X97tvFCo7t9` z(6I?QSuO??45H4Zoj=)J&F~l-xGyfZ42)moj_H?A;Qb|B1QmC8v<)zM!agr)dWS;M z`}Q!yOsotzw3(o3Lh0NjCS%9cF_ECIh}1!XyedI5g-dyW^2~~0x<-(xp#JoDEBITc zGv&EuRP=k9ut)|VE30h6vu+fNZB}F#!bsjgJJ`@O^(~L-(-)q$5&sFbK%ERd*NMOh zl_T=5xaTKq-pnC9$R()h=K-~@PDljm7KHQ-h*rGfuEkI@iCH8(H+pRxGj9~RJqTV0 z)N%0yW6b_c3r~0n?+bf-dQh{sU-xUbb}0YuFms0{=!*SCxCQe0l+JlhlXjMx=X-v7 zHy;@V$RHx-uCn9~(_;#oga6eJGvfkRtyC>f01oBdVJ5b(>%MYmAnn#7iAOX|+oP{z z%jPRGJ*eN#s%;gy8(~cI5k#*mc7^@t)@2c&1VA$e>)DcPpuykD2CGy($HL}2g!qdjhKsAeP<`tNUO`PO1c58S$L2^Pa=US zrwuf{&F0M7($3=J_$y7ieo8I2^+7B!%yP9c01`F;V6ump6#BSfBqWkRDKSc$m4FB}P-3MtT6c3ASKbEen21US^rKwk8Qp zfu{*Qz+;*<^?S;W6%rnl=jsgu5(p2}n!^Kk@|g-`x`~U4artGBY(2H}(JZ~(1J-B5 zd~%ps%1{?4GU{6Q0`%etBbvP9KDPY8;P7nV)m|<_RyUY^#t9GFEDy~e;e6bF8;|K* zdYcjU7O%)lWMNsZc&2}m`N@=KP>xOIDgJIB^q%fKeM;u>!A+Ps8@su%St<;vNp_JG z1W4Bn587Gc&r=|sHIKR1_+AX>iLlD=kn}(oDr{>4KzoPC8KNz|cF|24STPW5(7jZ+ z5SbGc=D_XF6Nu{M#qvuMXPHdL6V9i6V`;Y`BP-KgvhDpN zrX?mbw|o$L;uP-Xvby(v0=OXt7cz`=K}SWE1778~Fq5o(wFHf^1qm-8t)8T7IiDj{ zaM%_#Kwt%424^@6(%S)JHqJg;m#5(kg|RPsy4B5Z(o3Gcr7~%_R{|!es0m`)(f5#7%PDEDq$sksrkc5Yc$C(CTiY1t z4nP>j0fJ074>cmcdCHSD>{IvSDd~rqyMl;*e?E3Nt8?J2E9x-D)0VkOu9jgmripWr zQmemDZNjWUiIZ7u>x#I-XTtY^sK}AXsc5w(DYY&|yDKg@6{)sx{kRr-OO{8Rd}B>q*EGS)RNFXssExo+c^widJ~hb{C+|RQ z>2*!PYJ2Y=$tztw(S=ERCx}T<)3;L5YMWml*`|WpXOg=!9L%pZ4JzfTjqN|OF+L-_ zcOTi*?Ke-I-ZxnD(|0v%{@91+JzT{{`2V-~|9ANRL;U|6zPgXq)!jwBllldY)vc!Q znpa$U@aNKxOv01dM9hIMvpj8iu~OABJ9?;o+`4-dM6?X_TbOaLfIUaW->Xt*it@){ zTEqEoA8K?tM@CTEGVXa}Z`H>7^IArD_fY-*c@)nD9%Jc0h zxqM>$bcs#B(^#awiYhUO4-qp<<2e)Q!^s_z@O$sw+jc4*SrKY1$WtWZP$lAb_0ww8 zZyuane-UQrW@(bU3rv@(&82*;asT^gHQYaAC*BFN`LTZD{f_4bnc=&a`2S7z=uf^L zX6ky7z>4)t0-IR9f7aM5s;0;!r?_99ysBxS{&YEJr`(zb!n$0XaJ(I#7026g-SM`* z<=JC<#-I^@XZz%=u4_=D+Q7@lHo)>r#LuAqmv!|+folD~KR9$69&>6Ei{;f4$v43` z#t0DFPfZEJu!$!HHS*|n+88tk3#ZBx2`1mAa?cK ztZFCZFN8VnNf+#1A0W>r(nV^fB;gc7nGy2JP(e!p zB~#QHUamkLsODBN@=JJsURsmi)E>X&Ip?(=zMJZowNIz+3R6-z<}&3;{)m?C6JO|A z0Ex(kh3{k%!JKURnY$9X?w#SM(>B&kKAq|rMB#y`;~cR-9rK@=4`zzd^>#x2QMSbr zW#nZ4lWQ`aFrF&PuEGx3k9d6c@&BLj|F79m`ilMY0iO-nk2ChqXZFt@>>v68|H(c; z!36(5$Nz`;{}li4e_+%9r#k)b{RE;i8s;AjoB@YDW$Oef*I zkX)E#FmYeZK-K}Y_V^k8`%;m8UYBmCwY5|!di5Yh%9wElH<@S&$I*8y`q6~rp#JUj zIv;*>Ow-Y3fvY){S?CJQKU~u*%{V=H{xXWM1R|R=QFEV8Qwjyp*FmJxn3OV>R*6S* z_=n#Jcbb7L#Gtd6-Ce+M{so)%oShA?)-edHyE+{ozL$fM9LdF6FsD)F=`ExdhLmN| z;Mp{I&^*uW>O`e<#jqh9+-Be?IL4D?;g6{EkqK@1gJ8Yzh~DCH#fF7|PvF7rLVdv> z5q~^p%5Oh%HW=_wNf7CDYK4uUNJQ9bsRB-IcB1?Hmw^?j`QiEWe0XsE;?P#7Xz-X7 zg98WdnYdUcDz9@k$HQj})&fk&pIYu+XF|BU#v6GoIs2a^52|NnNR?C%+8G$qlxbPw59fSJ`GnWgGKAFSOHv>iiuWq=Uok0Obie2Xib7RpWitZGE?cA*$`#w z8M%JQ*D_4t%UsfY=J?*tGAG^Ndp|m1qS}MWgpM+GHQnfMNa;7$adRSy!%woTNu}-d z!1_|n`s{Qye(@Uk<#Vmv#Yw5M%pZ?onUb_ER&nD-a(};ZdIGXW5x?57)*r<|qW0QV zt;z9%pLF5Aw1xw+@Tc^>Jj&|3aVNwASrCpX2r7;9r_k)K9e+^VvbVfJF}n!;b5EgcO(OPsj*1H?6~ zkMI$ciG|tqqo~kIb_L2u*X^BvS6mq}Pox0g$wC7ep{XSl(o4aGt>Qz=;NCrepnz}* zuZZ-4;qgb&7H;iZBcM;`IU$#dF0gx$GwoZE-D>st#uCnb2$FNu&EpO&!ibm|ILefYrCus6(8B8syDckOjYqW{q znA$2vtx|;lU*i8q`2WcV9^CRxRWvcqt<^GNMXS5x#!lmMVHO#F5&hDKKlBY6`xk#G zw^?tO89mgdwz0Feuh8r?Qd>AGm#VfDJ=jvpcZxm+;6+;fX~T+NK3r=dwx?+HS?U!x zOL%Mo*H>N@@XGRAo>>#U#ri`Y*{sg^{*kfS#RtvsxL~TzG5hBRIWEBePX*t7RQYZY zkL$Vag7>o7l=>|mAI$-LY|Ku`iTmQVFBM`JB|Z@4s^htMuq9!A)H6UpgMU7ksWBEG zYOIgi7uBZ6-`{k(%bNuSgoj)ii^CFVj2G3^!M-Ypw6=!LArjCJhZd0H}XW*A&8_kDlri4i_7lyM@bQ+;Zl0 z2@8l4zda?sc9y$6GEgl_C6O6}i#zai5+@@%=Ke_}3EC<96Rl*-!gSNecx@Scj8hDv z6CU@9gbg(_av;BUi8>w*UT9j2D@vBirzw%zSLfuy;t3a_EjCKE*|*h>qgBPn7%nM_ zX~vY=d15oP@)rx%myoiH5!1;xO+l~J$!_j`Iit1JLzuQU8;fN^d3B^_astE*Ef!nrr^_q%gwza$`p6mg*WSs9Lbs!L1E=VdHbsjCnjN#!#ty;G6|B;JR>Xy~<#vDHQ$6;122R#K!mn{qmY&4< zV!7uN%+D^tYHrRbz*)gF2qYw)+g0JlB79APLQWww_wGZ6IYZoyU4UO3o&&%fU_9gh z3vUAvL^=~W?Pm$;&t> zsoj>o2Vb325LMmFT4_QzfnIV*n@IbV*g{#=St7v_DNkwh2HG<=cPAzH{OT5Hf)5?5>DqhQt7q7!L)U&0Os1@{8*s{jo0;Ecz8PZU`J0VkO-5h%h$ zoVm@5`F&kQv)YQl3n|Ooj#+2II}@xE?#FD#6G@er*rm_#m_JejdqQ_`=A6sM#A9{kH#K~aPQUAvDa1)OVNd{ z`(oqE3B)hv8txFF2Mgy(wHlFBs@wF&=73K;#=HkH<`WTVSgj8aX^BmIxw-oM5wMx# zg=O3M=IZXknt9aDFP)i3SvpTlpo&PVT~%nP#$)^QzhykzWppRgU-EDy9@vO!FdYt@ zu;;mT1bB9SnM12?FINII?>-a(n%W#yunN8$moQ@xG9ZF~Iwu_Jf*(kEW_>xvX$S3P zCFB)WAy%b&m7=^c(Trvo;VNA%(8;G0xYht*?JUooG`op<4FHp~;nDN+3Yr{0lLB=2 zoIKXulWYXK@wl9;3C+kFZf36xEn1{R=D?W(Tw_Yfj0zy-DJ8=hJ!dE?t70j0x|xPW z-7dxQ=Sp2jF%3})F@x&S^ug)`f5?hy!SzhCjGHeDKOxp3o_I#j~t<4bs==A4Xo1w!WceZvN@nRS56;V9$ zArkopvT;K_{AiuI-f)LwChIxes$(!aXA=D2{(c}cvh%UflerDrAsT3FGPlJ%!_bs! z=?|%U3gO9irwIftrW{cJ;)Il3oxw%AoRg+;6^OaQRnX4}pwY@z0H?N=jw|fXh^IlrkY(TZl8NtUpo0W1e1cjd3n$2Mb8f&vm%FdAN_Koy zZsdC!T+<9iy+Q6q1UG+7b8?&sKwI1bg?5i&Rd`Xvx1SWk72?c2&iKWmy0=Nu6GIy^ zEX#!ZD$^BZa|DQ2v^;UYJ-(a!H{pnF-dsmBEA}GwEgK1tPjb)zD4kNez**CV1zOt@ zXRxNG_-mytMN>2rG5F}NP@2qd^6#_XV50Y{v;(w#O_xB>EpeCld^cV@1qX`Q{!@WVBRV=(1pN||<&V1Q1ut1+yj zp4_q+X1=EWm?q|V0Z6(T;^AsDeHxVB z3?Dc>Ivq_H2J5eQ>D5q^I?8hnzVkV-;*P*NmuU47sa(Qu$31ci^g{7Q_waj-7Q8!`A|VAV|wQT zsLi%Ow|)Yw5`}c0@nznX9%5oYU|wGGHmhwy$5~|;8Wb+vVh_qxzi$38%SzixKl``r z5efobvsEIIy+uL5?>D%^{g{WR3e~DR@yATVK2SHAgJLEWhvj_7@Fz<)$~BSjD0HVOCoBf|VA26DuwJ?>Vv7o<*M9 zV>_+2Qv9i%Lmwc<4}IW-E_hcD+!Z(e3els}yQV@%FE`rmnxm{IFSb1t0b{wF9{T8@ za_FlbDsWcGPts>)Sq_g3C1sX~0gz#hP0C3OSk=DMoQcHuvr-`$PFPqGH~ozF?m|7N z%buji+DUYBEe;^BbO1qO9lGWa(sCvTn)FD6gnL>4z)Ov8k zWnB=`pR0WcpYaynmRi^h*GXQp!G{k|5|pZ$rJ@mR8&7KW5)r0~5OwH-0-f!s zhdwlMmQ;kO+wh@1R1pY5=6=b?yGbAb^VPLbn(F}Lbvw|fq)?cvrTbZ3aeWIFP_XRo zvQDbN@hWZ_HSW_~Z+^$(JJLb`sg^C|j+@#SS*H1?&l2gN&I|NeG>JNakg7@F`ftNx zG{m#hxq1islsx)$V53`iMu;(7b4b)iz9@r*hvCUJ)#kbs2*yQ}&+4J_K}??#^WiH- z2I+OO#Zm4++282kqWeQ24%(=^f6Y+5@=KB&w0nV{(6RcQ z*P9*WM7uJL#g*w$+c~s`CAOHg@~bWwx_^Zfkg04uoKN}F9w`8pGI}dcuGa%vdf~je zrr+nbL6yEbr72Ms`hE7Q<2U>*;d1!y;fK&J-Z} z!ubV6@vRZc;+3n25YBnxM+XHynUzwJ;)}f%rXNEjV%>?Qs8kD!h?_l*i~#b>N#l&f z2!})^T$?rET4Za$r6#YMS*H-1HfHztN?ve?4&*5aF-g_Ki{7hS^q7OG*k$jw7_I>B zwfs+z^B@W%E-h)Xg=#?;HPiGh9&b^8YpaOC{}YkAe+{SCEzeH_w!J0lSSUADEx04j zN(MT)Bt}tZSb*j0xaPb}8Q=WdbL%jrHd9z3vcB%_Het*c<#rAtz@#D^{YZ;%^cG>$ zp4d4GD&RkrS#vfHU{-`Eb&VCm#{QR1Q_OXH^&zu{QJ=gTzy@!V?@m)#m)j5P#K&7}n235}9%$6%MNq=xZyk*mvu8w++|5I;nkwK8dx| zN9(9R(5YvebPlBZf-}^;vqJpU2YqxSCAoHw%d`RMeSmyQJe5J7Sy$ZTg1I;mGdL!uk5>qdR~3jun1(w*#Y%$eO-G4#3;VzaKg)|u4e~fg_$@flXGI<{%5_X0 zbqAmrvZ{lC2lA9M&v1{Y;k}^l<8oX;2r!)QihB}fx!B|R$BWs$pmN?IjU^~3!0tSX zOvp8kg{RccQ3~iv7^SgM9X5`x6I`DBWUz` zP2Y`1uYdmCX!QE$KZr(OTghLGMqk^+}j8Z9iy`vi}= z{LQY70Oq5NKS-^O9lMde+b0DsMXrXJN*RznAim5(|$^gzin+n zJAX4Kabn!W2{pp`BsOg#dPi@=%-Xecn<;NBd+*8iPaDQd6y3)L?`0L2wr*e zB%zatj# z@S@1T7b!#@(Bumpx1SisF(Z6zEawn}kOkE67XB!p;terAvKcj=ws#B*3Yh$rY3~_# z@zS{Q?=Z96GNn%p1Co2QY;*K>L>C#Pnt}-GD1@YW#@8?luo+%S+xX0@h_5m~oEyF| ziWhefrI7`+pwRF$BgnFav%UTG>({oAM7HB(y3NNv-9A3*9=z=xY&~u7JTZ(XhH?7( zsAqKF?H?FNJ>&h!yN^fv2m8jmw}$uD_{r-TN4=knmtOCvM~qKLr?21jPmNFB$%*&& z^yr{xygMc$N>+M&^ycW)gLh_Pl6XSjV<8`!^vw zl~RR^#PmKf{#qV4ezKoDfjyP&C#WGSe*WKCStDg-8QnNp#7y$~-&OX%tL*gcj{nFR%)1BSlhyf<$B)nQeUT{{b_kRCui;w2k(U{J&a1zqQF^+m&EYUn37$sDp z0oEo==a&$()`xQgoD1(zWsK7wg;$9WcLQUI`a-pKSj~`-vpwVFb${<67aa877TEo;@?_p2MqOc6N>b z_~qB%c6N7v`)%i$@gF<8yT3mB&G?U<{~H6aOfx_EkDZ;rpp!d0JBIxC|0Dmco*0G+ zt_Y@MnEzbFU&461bnOA>6BAArlV6&k=+pL2`}tNfYX8b!UDLa-aWYO##~8wjG)!@6 zBJ3xxRQ$x2#1A$11Ap`_9-B`L;~Xmw;u{LEu+T6Z`>C_NJq@#9c?EZ{?FXp7T29mN z{c@Y7EoBw(4GZdc+1uaxWvd(cOSmLILE0B_8fI~FXFA4;5sw(4j$uy2O!Q}&MEuFm z-$O?ms(4};IqOL{FB&OdP93m>j>9zDPJ{L=ExtlyOEE7e2j2dhgZ9l>kcQvNzNUwzjy5K1*+n_BQZK8Wgmc8BMY9mk|CklI2`|<9vlI*~NSD z4uuzIgt{unFq0c&E14LK&~h2{T;nw`u!2enNo{+ZruY{khgwoYZBh71sz#cO>t3>s}ZpfSS7W`Y7Jo0+~Pj0ypVj0{g%Ybk-$d94|Q_E z6feI6izx67MG}EHtmJ3dpUjF##$&;Ucdi(D5!1?JX;}kUc-QyzzSu8DpA;(>WcZzHpf`wSG7^;$>pQ$<&{R-?-i3G>}cuF>8^_Z+;X`=P5G? zz<1#sP98rp#9gzk5+iigyFVNJ29p}!;<54N8LA({6ipCdXz;V}D&mF)Eb&WiMNfY= z1j2%mE*A?1qhO#{9!;6$W*h2@=b+ETo@Uj~_^I)gMiKn$FSCF^nS@TzP@5TnpBm+T z8f&UOEr@|<12OO!_Ul_bZX4QOj*pd%+JH-dAEmJvm$4B}&@KZnriH7f*F9!3ZVFXw zB?d4a zCPfSxs2}#{1bf0=m2F0fKbMU9 z@G}E!1mQQD8W?!l)(I%p21Y61)f=ouuq$>p&HVY;PsS<17x6Mf9+^|VH0bRj3P&OD zeEZ20SPnRD9Njy*Ga|_O;ZJF*I8qG7_(Pl#qyOBh(IWY2<_9-4*{+tijY3b=e)8l$ z{}b|&EEi9nTwY#Y`DyS3uRi{GY&1_fl*LbZKHk#Dr7zSw82UvDgB@ax1#y}=zwGSn zZbOElEzmm4>Y10!l5ay8{lJC_b|1btQyaOtl(xu)FsGrKUw1tMb<}*h5@!QPz#Izs-d^&&T>bvn=IG$KM^I3KY|f} z@&WWw=`yY78rUMu1b{GK%4Aj=?T z@0V0ZkJI)(tw+aBIBjHznzxpgU{3hFHq3x_2!lyh7L)BNYiq4qt;TC>g>ae7`kRU~ z$#tl_^su$GL`9E?nMtu`x9EE8!Z-yZPwZ$hNsTGjKVR3Tg^do_S{cVHTwP2dwgUSW z$0ttax^FBkEoaTx(h}&`ZOfx)1YH(m(6W!h$RC&?PP@yQsAMo+77dC$&1|sAIQ$Dq z#$t457CD#@DF=o|*tOGvpcmdQp%{UTKQNGmjnVD!IHqL(6uE^QdX+kMuS%p1O3Eg+ zv2uQP2<`AA>%TiE$18s}j}B4Kx5@G$z!>k7@pnQ?^qc_OK)VsdqE+xE1sHNvV3!5& zEiGYSUFh*oy%u8laKodpnGIeB>;oqpx)!j5k>wC;Gyet+a2S%~tTzJ9x!8p z+~#`))%PWIz^F%L-B7a$;&02?LNLM!(O~38&d|k43|_%0;Crvw5J(p6DQJ*WW106E zj4r~6*vLSY$VUtUCABe2FGClm?K<=pt1U(hP79cNSbHHFfUKUbAmM_>)5&QoH$9v=zDX+b3poy1s}t<>5khCAgtVn#IDt{=JD-8~0-hRsz1X~q@gKN{ zsDX{T_`N9bT^9#e3<25uz})Q?ErBp8qEdjY1w^}-W>n9ipV1QNeTB=qilz6+zO@{F zLw#TIXchS2c+#w!TbC)EZe*V9U7OxS>1~8u;A zag6*_b%+dM{;JCvjY1VqI}9MI$=Z$waaBFIFLx%845WYyA^ zBlBLFmd2P|>j||vKIsC*32{_H5P<{%3#5xlq&xT);NikiO*;<-WuF0%T!0vdUDSGl zk^UDV!Bb-HkqI)KexiOTY)zx@gHc@RP_>?56G4(Bn8zvku+FXjDVz7oS*@Jan!sxD zi`xOd!>&IhR~EYWx^Nhgi?%zCFNgnvfkp@^B)Kk_ zCEHSLtO4JNZ3=zLYMR(^%-nt~-hvf~+Qh(&3I>|PAtj8IvZ6K!zrkD{3}Bbq9`XZX zN$nE}og;nabaND{w6#oa@khWnP*Dz%L;0UPIw3@w)CZZUpyyO5243i-Cx7dBYKUZ$2rwM2wM7S>d1xA0pqcP|;Etig{L zCW-3J{ry&_bJacht#y3$TkFrbK964V;Zs!M`P+nGh)ScHqv+NTm@0$DWtLIdA?qrE zV6n)>uRFU$Ud3G6=-Y}st`)}TRYoCZ9&tsAiKvViCYBApUR|(TM>}*Yb|N37#t>tx z9pOPS+0)V%sqgerQLg>d4gyBDB(%Hi6uTwe3oA;W(GGh523r9R(0|=aP#)fIF(okh zhj)=l(GYqlZ7sonWCIu`lr6tm=Q4Xbq?sk)!N7!A`^6)^V#y$uX`kgekps^(hr^@< zldl=JiO?5C7q%%Ocv9rTQ++M{RI+ao2mbpe;?m`1yWRJsTIc4aH zTzfGxT4NMCd1jJP?x2?|E2vVbOcc)o^(6PirKL8}bG-_U;G1wdM6*zow5M%OL#o`(K(vho`B1FGwGh0ik>}3dvwL_q*-i zTWALrEE~iIWU$)D@oUEuA0Fb>NTQ1{z0E=76Hs!4#d~s>Zm_1xh~w5k1^TLh9)NWd zg9g9pfE8&0coULe9Lm zH3cK{PTtpkZ7RDt! zejixLKcD|seSLE^Y5%ppx>?WdzZUT)7~BuxXTkUpQ=*j*;pgRGikVNvWL1JO@?g!LL0n#Q;T57kP^yI3 z3|>cY6y36}$?+}Wra=BDZ;8Uz5=keign!;zDi+l@b#Z@V95d;&h!4#N1MMJ6>EVu` zek$t2MDBAG9#M{4ZVV9Zq_t5j(b$nisXFiNjykbL$npW6!uL=j91XzRHqo&P|AHRS z4hKYPB@3QXHkfqs9@)2!+Y7LV9<;0N1)IY%$PgHmOSB_aSyAgPyV=s}WU47T(oDjY z8Xk+RtXQb*Y~`0`26#PYUGbod z27*2mGs=rb9>lMB(u!=Mu}=?WbOGJDWY0`Uu<{!Ha&>ije%89WLa$eV2o?FH@ihb7 zH!*N(Ah9^46+|QqrZp#RdcL(3A&U4G7c9zaSRlztvW6Z?iTw?WCHZOx-9JFr8Q*ZP zp$8Y+7iIq~`~EG~|GT=nTGjl&*EVbU`M=QfKe2-2;K~_Hq0SaGZTHua74!`C`KM&X zeakbH-nTqfFm(@sxM1J%;2*W|7qhv(BmWPD|Cgug`S<_E`bKj9uWqic<@uGWaQ7B;3l{Y5JfwovrL@`@C@i|S>WA$n1}6s#c+tRJJUauc9$A*_U? z4Pt%T0>UMcyG2knegB)TI?uWPYa1Jy|JQnrY^8kve;4=vBRufQ5AEVl?#J;(j9iZ6 z$K=g;!c|nRsop55ZZm`e5E{w`ON}yn*`^mp=ZoXr(08tXxpky4Q1NGOe8k~SZ4yG*%M%4?2^ z5zN;~`T>;p=1b%#x|ME_l9-8HAEjs0-7)_B)Te-%{zHRL#{o{D|7&a7{cnxj33K|t zK>9zE9QTpTqDjbV60gRFH-bZ?x)hl+%-{*{HS%es9oh22nfXN~$%Jg1{>US(hB$gB z9u;{eHN}N$W~ro7vq)_72pK7(i_4fhjoXUZP?`lw>L%wpp$5?+@9gYAToLCEV(LHy zou3lJmCn-w)uKbWR~dPhTnRoERto7{Z=!t&^x|yW^_02r~!*{{|k1SV~-=%5Q=8+DlE$o=uO^DrvKB^>OkeWqux|PA8 z3``b6?VPwsXgL^#-ddW5m87TuAIagDQO|D(O^fd}I9zH9sSule%loEeM%(|yOp+wB zTE1neL7!LuzqwXh*Y5vo)zy6eFLeJqH0wA?5DOQzeXtRC#a^Xxs-!*rMSOygRMH3T z+F@V|Au3*y83c3KbBNI`k%fTRL6gAUj3N-jo8}O#k*J3mi6&2+$Vl4I5D~=Lp6-#Y zOXAuGN7M-h?Fbe?vRf}Q7nw4tR935S)*~DZu_(#73J7^pAr2=yqCNID*{t$RS&#?T zAvqf_X$)d-J4CSy23!b5@IT)>!_jTveC6Z& z7JdqTAAPAne%Kfh5u*$tNN`Jsw!v=Yw0|ObOGQeD99C513ni+Ymb=FT52bXhecWxG z9XAhW=n?R{^6n~P#f~8EGUTlt`d*0lD%7Hs+vfvc9Dn5>cX!ZwwQByhjW(*)Ez!n9 za(KzLfD zE6d)LGOXvvza5|akwt?j3c&~)5xgp+m5Sz&)Aj(mxv-RZ6zuv zkBJm0q))7r0tIFd5Kw0Y5@-zs%=hPXU}$2}viL&IS&9JUS_LrNi6;hbJPY|Bhx9*o z(0lY>_exn6)Pufe2Ju;#vTQP!gFM@Xl4^kUAf0K_VOptF#3^Ywzsf4rFDrzrtZv(~ zvf3`WOo6y+;;;qDGm31uNhS@-TJZ6MfhDgiV*SNK%c+<8okHVwRH};=+o!xnPsn&e z9CZWB3&BVIElYu0jLa+m6N!k!o;9e5w`W=E61uc9c|%49nv|xd(s#UGkq$^q1||)q z0(-7)q+=-9N$R6z;xvnKH!3lGDAKVk(@vJkQfDhBo-&o^+N+4Z@)kwm!2cA#5$3nGK|$}rpbR2 zSM}$Y|JLeN-TrI6p38q1DgR;l3YY|jXD<+9nuzfdu&s_Iw+NaihIpXka0PoSQbCeR zN|p9VUpt4XU_v(y47*hVODFOP@wWly;UjjKD24k}UwGkVL+t|hr4HTHLY+fOn>c(% z?hbhpyd8*jE?S2XLpyvJD^yn9W>g;3f@D8|^8$1Frjdz>^cwuhAaMzej_!h2T%s{} z&k6Ej%6HL!cz^(7)T6BO5s$;7_*lUnG0$KCjynxR%|ZwRJoIVb`Jmv?wubn3YJ5+w za&$~ei9zYIu2-VUHE?wBTcyiFEJcu0@Xf7tUkv>hxsaZ=jY;+&tD5~^y_)O)7A*fa zMB=E#3Lz;xgGqpIioB7mEyb;vMhBo&R+Is9Ob(sdQ&~L|PibgF*LO`}?IN>F*#<8R z0L0)MCt_?UQ2ve!q=E8CKzM%C8KIc8EM}9NRD0iKRijUbW++yeiWQeoDa+OtCN^Ck zIO#2&4|ox;UH&93NdAf}Ff;G}4?dOB`2Uop_$>5axBuSA{Xc#f`)_>@gBiH~c1CM( z0|0|jIK-sI!8tK6W)|Vz9gDlMKMEk62aV*L_~`iFku_v?+z?T)YhAackB_(TR#8hu zOGC+sj%;-OlyINPs@gPnBM=|6s8PCkwJjDys)aQ#vbTrsA7WE$!`TZK*M`>y!)v|N zk9IDY?SB&N-m~)mYxPwv{>R#8EvNsBr2oXcXJ%8MOy=6iQ&YPa>8?TOJq-s8LK_K` zX6UjM2Pov!I*x=#-^lfW0?<7zYrSk9ijVY?32JztMOk^MN}-j&exm$%w1*fx#fTN@>Idn?|fp0Ur-H395O6qaq8n+4lOtw*+pP2U*`|0XG#JdZv{8 z$b*in)rr}sQXTZ{(XHQubl*5CkQVsqC(s!Bp$QLAPCpwq&}KnuNJk1ZuM5YDG8fA}E54$+Ri^ht!nu%B{U?WPBe!c_w=VX0bu~Z>B=@?-P#&VEY>Jejo;+lW5 zhixv}*ilupf~4&4?YcN#Jc&!=0kPjcpTUWh~XLlC&5*sPLwR1Rg9<=)ehSbnj)v z>r3WoOo_{;B zGvu-i|31NcTf?C{ZtF}K{)Rl9d&4TYh5f;&tyhH`T{vnTO+iWN6+ zh+CZ{u_~JQPu5Bj)5>rZ-a=#&Rz+{Q2k#GZ+8Q8nv5}U;Trx^dtb3hux{4n?y^gq_QJ+J<^zFybl z|7#n0{FepG|7A~r>Ak){z%P_*AlDZUu{b||m2Nc*LSNa)p0L`J*lfn-7h-w!vapgZ zBn=vWN_8Ab*dr>HV$Yh1)DE+Zm7PYT&%$AMzCoH}hX(2{UTfWC?PJIrnA>sKVdyYrnMs%m|dd_}!H9l(nJ+#tiE$>_uUR~}L zFaEE>tF6obQCe{-kpHZxS1RpQE^3#k!PaN2I*QFwKw}g?85Bk0pEd4*V){#{I^u@GVe{zG_N*e#9MHVl|(RwE8<%L2%u2M!9>|y$N z)zhiGIocv*(9GIya$v9mF%_rMwODprh#MeD;I3JUILLhDc*yb+A&mGi7R-KTEP7u; zr_LIX)ajy6X_|CeAivPPT>3wqP5)EU|LSHk{!hKSy0)Iv|Aol^2*Kgm7KHWlsTz(aUtjo8UaFvBJWb%?D1?-Ab#I*z za`z5=NHpqv#O@eb=z4SmIc6c38}@n?bn0TrG7Net>jo}1;OZJwpf$w}9~$HSyjoLD zmgmU!JrCOuJB;PFq{!iD58$c(=M7Zo-eQrK`;!$42Vv5>;`m0pI+ES6rRFpGAVYx^ z<#0(ZG|;OIX!PpNoZj!LSNB7Kq)X!d8mb=;b(CRqpNLDOmb60d!BJLgu^vXL$-zX>>WWBKpnmS?pmN+T1yumNs_|A4!|1%Kz4@MB(GMMyCGP zaQ|Oh%j3T-_WlnE3q!J^#qE_|=3kM^{3}TUa5@TjN`*2yvpzw}sgu4auOwqr>akQ+ z=8`mR+bh+-i#9{zwnz!ic>M~b4rVVaBn9QGtvFq} zbVhL~GC@X3M3&r+vDn>;?GXC_pWmU$NJ_Rq5W9S@kqDr}(|YYS#IS6Op_E(My||PD z<)E*cL|Ewo$DyI-S!?LiyRD$ROO>>8uNC=Esq){Q|5REuBm9=$Zk%MJfwsHy#EAfX z%F7+)ahHlfq;;jj*i~8t>;8wF^Lz&W?*@A~ut;unGOZ*b82R<6BVZE$w^7&pzv|We z{=ZoI|0|t)42qjFqM6!bLR(oOdfPs1H5AxW zRcyC9U^gk#fI>#a{dcYX-)3uzR(W@F@*6Y+g)vTj)tz3J(~ER#UxGr(Dwry_c}B#u=q|DJ{zOp5=%soQ^5Yx(|vvG+fPlh3@1#g`+#q)0P!+z_~a zl;qoMAO!$d(elh7d(sJMJ|IiTgJ@4@HxJr#Ir*9Iz`W<&&-ZAW4l{f z8ZB0)XvpgMe0hb-l1=esH5x56C;J}<%XH@FWd97Q3EjLPz$lE_u+ z?aL?5_MvRu=8&3jBe4CTCxpK27R6ZC2kE%i+TQow(ZHLlahq11&^iI=2a$E{;^cMG zh}avt4-|~x(yP{uoG5Ak5n!v=bX^%m%XSTy+@W>jc=SS={N#9jNF0ISbAJ<)U`EyBmX>+X8_nmK_-k5FXIa=w#qT z+sasM$Jp-87><%bU+o;T|w1LC%JBf*L8qFr(P& zi7gTGzi-a}+x}o+dA)GO220oqdwld!FiHQrs`3BptJU29Z?W{B`H+D-*%*Q$3ffGb z((Jw25^2ynm3{h1b4=u9;XB{|PsIXG*#GOA{I9mUS|{lPOSixd)udu{c$^i zDDf?ZaP7cAkzm+w#sHZ-^R$!JO<`B(tNJW4IwH%xc+ZWy2fqEB{$Hyby8Tx*kN>jZ{mYHRze#$Z9UijFXnIM_3I_{8l47?7a=~titc? z^-3zCaQ&O#8A?T2;9jO68_4p;Wd)pS8a24aL8-wEsWKYjv1@tdY3e|pjCtxE`w^t+ zn4@NAL@b!*srrW%c#bz$Kc#FQ4HjhTtC$7`Z*LZWZ!FKlK`JV2NwO?9$U?2--^Id= z7af>x!J_p12!(it#TSllZg2>}zLp6f8W0kGg?8W!BM_?%u^olT@_M{<<|-Wq{$LpW zZUyEw${$6;@@R3^kiN)bQh^r@28LndAYvugQ|W)B#DUl*zW zB^S68;+AvhL^!bA?Jnf;@WvqbPAF5m3D2EFCych6a&fB%hF`>cV7r+tjlG-bcKc8W zuc10rJG>~knS55S>Rp6rl;1-dC2E ze!-uu!O+D^@87>)(zYupw%rlEtKg;7QayIV_C zfzgie0PUbxecykDzM@yxR>1!KLjL_^xjp|Ck16Fum|Vu8c=_52%GcJHGB4udhz@Fl zKn3P_i4O7(#lA?Ym(i>8tI`(f<t57);2*k{<37Acd*}j+kn1>Y5_VvT z7;xM?q# zKN&r#jrQ@cS`0Yz@Uwt%`zOcU)_=NW+LWMRh3P6z*BbFLX`OYh&b#eHF$z7|UR522 zo?^Q^c?jsDI665vKWtsKj?a&vLuAgWc}ii5dYxI@|CHQguQ&7^ z?~ySeCY=8y*JtAV&*MM5VEzBe5LSufdrjK~C0H2|Ll+$3;6#lS1;PUY#Nu zPIav5VXB#Nd@o@z#Jr6OStk}hZ~Pwp@s8vXBtPNa!5ojj_`Qz7cV(#JPl9qQZxY2i zegHXcTHa_t!2#7xpmy!|#sXYy)WFnQZ^Tz{#Lx$Y>e-m@Q)ES>u))-sl3i0_((o9% zYw&J@(6_$VBgqg$unWgQH13kvn`xd-;~`FK$}kiGlWguKf@wHj-{=5N1WbG+*djwa z+PV|sP+MRRSc6enYL_l98^Q@eC_C91R9m zFix&(**5OtG9E@8MsNLKU`5Fhrg=c=x4o3r9X1fv$!J@TImXeIw#S#63ftVGaf!>H z)Zz!J13?tb8ir&a?5Z$21WOPXgvlYIzEX*$!#@si&#}&jAUjB|MDppt|Kue<8n#P| zNak@*EEz7UPplzWART-I7EB7B4=>4cB0K(@IR76N0&c?jU)S}&o2%74{@Y^Df4+Fj z`uf(S0DM_YWfVBkDv+rv!(Va4n{1#W7C-q*BGwZdGX=;g_oJNzEyJjAns&~pW3Rc1 z!~i})Q&YARB(X{sksCx`(a7t8CLH%t8{a2>yU)>lYLn;0clVq1n0nxTv*zCjC*TDR z`VEdwmD8%I$SKmQ{;D&N z|CKxO=KJ5E|Kt1raZ12R`JdLb{12OJ>$(1avHbtM8o&SUoE$^uro;9=(*c~E9W{ye z$QlkI)h2MdE08!gP2+OVdfPld>|VWVH4h|>Sb?aWyl5HZHU(8!(6ntloFWs_o0Ee- zuTGn1&7)Sgbtcr2S?amwf7&OVD~=P@Wr>Q`XU7k-Yo4|KeNL2^R29T)ir{I}R|Q2T z(ZWHaOm4V81(@uNPZ|3k;=cqK_B}{lmTy7Z2*$6^YX4W?Sl!g~f9Clg7QFwvT!AP^ zfK&UQo|5Q^h-K*wmgey#A~;x~L*<;gG17nyK99c>1sUTSkVe8EOI9;(*C3D4v@6GmG@?MS%k%S*>4O01LN3few?IduKSh4g61}lHNb! zc1>rtkul%stG+OIr5M@|<^?2oalXD88|M9GL2pr{J|_CCFSL8!UKxS#NGT4^<*75X zTT)vZSdo2;LxL|~@llthkH&l^lvN_!u&Bg6ZaBH{W}XhQJf8-fvQ0Tu_@qNl1){(J z<%eSnP;3)v>#=XS?zLrq?E2^QRje*3X(S{irm@MSM_G#=q*h;q(RB9xA1o^$o&IHF z{n&|KHC3@4$+zS#AQt zl>hN5UnX6cml90y|E#XpH2L4^dhY+Z*!@q9H_mYAyLUK{cfaiict!nOA?%Y${RfM> z{4~Vm27>}0K!nAfvU_MF0Yj#dz`bPJW|_?#F|*%RzYl)ji)ivMzsL17i)c=oG7v{3Je1LS820AmjjhG1j zG&UpCnvDQ$qfQE{0eqVMND2ohfYBb{-n2j`*mg{6jy2P?semIJ>nZF9VvsD!>Jz}c zwZhmBgqc*%YoHV3x3Ai4rUMiKzD(<}RLQXPoN2ry!^G#9hY6ibwXR5TL*zbjFBpR| z>JdgEvTooyqi@MlLkO^#CNFN7OQ~RfdvpLTmtjq}L723X^n2J1#W(tcm^4l~BvPe{091-d~3X`9GPA%Z}TWWZ>zEDd1nBy#bQ-`6gaR-y@XGrKnZ2z{3-baVVyaoj&i z2YZV}J+#9Tsk=rvdIe zpIaUz3x@!HqzoNU0TF+WAOL8IB(m0*O&uX*fZs~~6MFiJ*6|pR%;#y)E;B3m_Mz(60Ma&5yOwc2At-N$LmWl-LUI(69D?0YBp6y8S^jld9!;j z%m;y&yyvp-r`8QNerK1%)bEZ*>cgp$^&OZW9&VoYD_Ia+_vsg2PGgu#jnw#1Jm6CT zXrzTRBp1W(j6u8-(YnmSNgjBtR7nOW({#Uaq^`_BU24UL3CenP`J2`wAHG}CNtgjM z!=fWR7^JY>!< zjZ#7eNifDn5@%#qODgC3{pkPb+&!iKZ?&eyf2`NnSM&VOi{<~mAyWtRf3dcMit)Fs zUQ_Imh{`d(P|ClX)M~99JCS5x6P4?rdQa8D{AsNyCE(bNwQW-zKvLI8hXg$m+=4NLPy&--V z5z1ghUK8`hu+)C(aKX!1>b`O@h#4T6Iz8QT6564nfR>`Xl2ld+of1=6?Uo72JM;a> z;DVZQ$HBo3<};DjC!)5Y?KXozvWO(SOWfC7gYwU^|5EwC=>mey9{+1~y_U!STF74> z|101Bv+RF%Pk+MuU$tJ{)bD@QJpcDglmBP1HB6rwi_mv6-HWdDv{aY#qR%aq>>{7)C})RZo?+saHewOlyiJNjYsGtOdsV3${U#u z?_wY-*E=q{Nve01TfDXd-^hlfebw zb}$ovGJsOlnWsZi^1+@9XfAvBj`;sCe(#CnztlE2YI^*aJpT8OZ2xCAg*E0T;0R|Nx01^)4)^;c9R6P_>YIWLkX4fvZ8YD9-^Koy#WAxHfl2#ci~mrs)pPytkFo#dRg)8e?{EJ@nvA!BKVX-z z1K)n?`0v%V`nsO~G2j0$SN@Y8-F+UR%?yg6v?W;tRGUNRz_(> z>bm^DnxFsQ_5NqeB_{ws(*Ea$lTT{@U9GQa`oCHp|MLgf|9rXR`uQJV|4XLBv+@8F z_5WJ@$LeM^xBpq}{(m0*pR{Un?ceva|DPuB!<74feN)T-wOXy^`oC{;{wL3VJt+JD zM;4so**;tx-VrNZyhkJ*gQSeR!Jg0tW@H8s;Q}*IDOHl~?M{W=Tb`QzSoe>B*Vi`;_J6tjZ?XG-4*mbc%vpWJzJpXn7uRQ%Kf3>RF|F7o!|M$oLPom}1NSLaD40`uqqvqEhe*W+WBoxzrIn`_kZsH^HR@$$BS^#w``0O%RuNs`(ffs zBN?^2gCq8PcbCVj#>3faJxtAzB;c~tbZ599XP_&`S?u17$(LdfevH!XLwSRK`;fekKH%#*X-2eZ@o&WQj3QWu#%hpv! zt_*r+XB$wZp3uU;iNgVdd?~v|Do`*k$nq<~csN@J&Tv1>Y;Vz7aWnV-7r(bc^PBA7 zT8{Tj`9IdR{ExNGS|0!F09=hE?j(3X#C&IlWtb}h%&P7QYpb5sFqk$+1!Q6}4vo~ED zQVl9tEWk^!iVusJ|BCsmJQL~6^nWI^k4MOVs`b@e{+r8x^1qk0|Kaxf^!eY`>w5h6 zTJHa`VE*q3n7T*Y=i>D>b3$BMU^0!MDU8$mHe`nM9)%yBA!RvufA+*ZGVy6o^0R|` zpro4mz6j||`#+q|3VhQ3*X6(US~ZvdEO!4Z{4-5K{FHLuv^A9F;zhTf*sY)M7E|EaoB z&-wqCa{kX90ycVg9d_BuIlwNyu_Bytyz@ntINje_UeCqXR-nP!w!HD~Bm_>aAaX2M z!(-mo{vrIovi~cV?asILr`i8?gZy`WEw}&p&i8+SZ=5i~LDP2MU5D?mJH$blb%fse zP9A~cW$u659}IkNUJ@`#{;e_74>|Aor`Qg`n@nR#gg=Nt7Oxc@~Uh`C6>#PfgC z5dSro|NS86zla->a{=G&{->)XoRa~Vc>e49zx7%k|L;Yd|7|++IRo&I-v2`?LGaIscgeEO_0yuI1>*s$h_y77)_CLu4nQ#8@djEg% zdyAF-Z{+g7A7%gl<@fU4|9$L#*STJ?eXsA_tT?s*={;2z$O--*n;WZI{>P14e*S-p z`@ijbVT3$ztSB)5kAk+vX(8Cjqre7>dLH<}>iM2KM%d%8l-CTN{EbDpH@zlScehr6 zd#xbwgV6MyXIlH+a#fvGP+U#8wXtBqEx1c?2=49DUSyh};6+6M#PBN$WECdLr@%P=y4r!yG!N#>Mw}80;l}+9CPBdYYBe9X2}hHJ zM_8rhp#rtBN2_=ht`EsAPktzaumEnP4+CGd*IyEDG*W^0m!Rw@S@9nNsJ&s&8&4I^ zKv(7}h*J;BXEvqiNXY2GoVhvJa0qMm*+sNLN@jxJC?XZM6F?w>e^WC`a${mdJ$;8j6gKK@XfBtUnu=|O{R*H|6s z0l%DA&D-U?{uOS0+SxtHZ`h2oeB79r1_Ds23huHDfEI)Kd%!vu__ulrVxqrV(Fspv zj?l_Sk|n~ruqM7?eC;3JaBkeV&R-E?4=-C3Lgj|hOO57glj zWS=#Ey9V`wxzdS1$~kBNN~Je_x+4?>8%QUBkE?o>|6YI=5ny0CKRD(y&PA#Uj2!qn zdCmE1ao3YMaxL@-Jo$dwfDLPtKo9TZ`R)V67kyDsAER~qt8SAQ(u0qwf8l?;a$PM`a>TJvg<`_&@-)u?Ydg&b4Dmd@i%wf{d zvve*gr|tZhl$oucY3u9&n;|qEH`2NKk zbBPYOw1GA}RjTC6oClov<7Dyt4Gqy30s2&_AF`2V8)zqBhd0WKd^)RYNlB#wYHtn* zSRU0jW(!o|+aPimhh`ScVu+{hOs`^C-@OLze{EI&i^q3KnNV)*u*lA@eM$n&%Wqef z(;c-7UHL5$9%gzC=8sxML5)~a+HHrvWw`l;Bh~YE+_1OMDf$!RJ((G>!1LgM_jp4m zqjJ|cUCEknkfzyw^TcT{X)46FU@3#@Bhp+8-Jb@ofG_G)o@hUMVF43o+k2qN2J?|Uli{$+4g_ZL zU+VCJlpd)T8ee^n49 zks*~gI=?vL<%1)?&0*mRb`+{(p5ju!yLiF_`=h{WcH$KK)(b(e1;GbdG+W`D0p)$Y zvw?ZScM2XmYvzgfD}6L>qQfLMo?j1^s9HMg0v^=-AEHJAsXR%>Jgsw0p6N8oHfiHODpJ93rE;%i9$F3b4s`M;A%7Ni9T*! zLH_ONJA|gvd9lXcvRQOz)Jnp_(Wj_su3r8Kf@I>yO_zx3UeB*^aUP2H)2?* z1xp1Q>K@05w7k^h#a^L>hH)>wZLXqGT1go<2v>2G@VTq&>$FYN^aIFyS8F-prlK7k zmN*>}S3=x~uX%O`{=i%)!AF;hcWe#38&28yHZSDWe^`CW#4>0;@ekW#vW(6bq9Bl+vkW@a!@09T{-~Wf+iTf)cZbZ2jT6WS6Z zAsL+f_<8i-QQc|bM^9V1yXuvkX0LJ8#z>9PC^*&*ccVv-cG_uR+{igw3a z>3B~{xplB`9&X2_4p~t+b$-4lI_#S_@0iV5dP`iBqTaFE{#1R-)KJ4QBjS(l>TO+l z?D#4H`l{H!p?eYXV-$wD#h(Zv(Ky%LB9M}JqGDgtjhASjqV$kk2RfC z9snL&Srh&v+R+f%U6vi|TjcefF`VYa|8WqhyoTTEH&Z^)lH;n*e{Vk5TIA#cjgEWH z4HQra%9a)^u@P$)(9KwiTdiFbUid86ulJkC3}m<~heIY1*W9cAO;6ocQxY_Fx^5dn zfL&(OPp{t)&>HD*+Xh=sdBeO~icJ`7I}3DaAr9smjKeG@Xk6$fV=fY<{F!>WfpGPs z%aZOy9$BdNv!pDQ6szk2(h3dbXF%ddIICG;e*UOr5}0>?-1u?`VzFU7{)W+lpf8uI z*K3v5na+S`qQ1(B%<#dEO(vS{gGh)-bS{!UeRdFD|PQT%kE~Y1tL_*BD;4z zN{^Ld62y8n*KfQO`)HATr|^tQbO8cAnJB57b1>D`uXTyx)=0k?mp_)&blAQ0k~kC; zwXxkF-fkw}F;cJ{6phk*1uVZSJIHYJE_uWYAD6bzr|r5|VGH&cOu=R1T}GQH{E@(b z<>U}WgQT$8QI|L4A)^S6dl5+Gv85JwL}0k#qvRTvNcAx)-LTWY6P|5QPF4idh=s@y z3nNSCYP9N-U%bPc*`~liArb7!>t0oP=OGAd7I1&gGXk=Jfag~Y&VLYF*t?7qkihlx223p+lOwECAI>>NiwkFHR^$Es z7+I*7A5Z`J-$%MlJH0_Nay0KS<_@N80}@dg=KwsBsDQMS)adyug}BHAYb3!kM9eXO_p8J|dJ*sdyq0nZ;;SVRPcyup7U0QGi!jcdm!Wy81cQP zX#C3$!S2xQX-+V-`Qv>2zoY|kYnlII*UM||@5hD}pvt+5WE)ho2kqIg1}dRFF*~)e zTVyBB8ODaX2=rTdj_z|HN5+`H->IJWeXkUQ<4eJJbwI^S7x!TZ4?#&DX8RfB_^!ym z+2}s*Uz<{3e;(b`eN*SOWaxM!YhzaW+m_ZH@Uie#HEAs^B{}$fO;k2`)OuPStyoe7 z0n07_5ALSNZ)7Ni`r3@43FOilZbFtIqJS{$ht*m>jo!=!Ab{y%Hk?~59>joGV(t>~ z?L|}R6fEoCiy+bX6rc(Ixka;|syH;F^_C$kSt3!XWz5)!+qlIU51xY(!?SJD&45_; zXj>tDHGxaEK{1dnp~j%W?LO-{a*xBXIqTqOKM8OLA#(mP zzb{oTM;FXphhr@1dD}rxS&(?5qE-O7FuYp9#<-{ zYA(RcJZLelWgtV*>CshwbBl2=Zvwe0?D5}21Um|$%LO67rihcdS^khF_@JXcs^~fL zWz96QTLiDb!}dd}ree%4U0L=IcE-$(|FN1P1l68+ukAK#W+Iqb$P((^Sl)1!P7Pln z8GPb*+`AeyzWbGAd$oKoad+!;4!WIhrvyCt?g72x7pAS{sWqVb(c!ovz{A&Vfq~bY4C7M$TIuK$ab`CXNH{x3Y_F&BI zy~Mbvm3-g_=Sxst%OteZ7e*l)meQEw;Z+6yR%PP#qs7V=oaM{*kb zjx~vGs5|nfhzKVqc!Nw!o|B1d_5ftt-aUdGl)DLhg6*SJ{BF;{n{(ji+&Fug)xR1Auxp*_>TH3af;13+5jF5O+Fc~?;CKtN=H(vB#ibc41 z`v}5l@q^iEV6@2TUpCxqLtTu}Nd&)rv_Q8fDtUajY;k-*ceU*34m1xN#M#rK_yr|{49k9YW!ty~2@o$r#RQp=~uFh3lo&Goqn?|q0e z7OM|R;>)Zjb@wTZGNnMNDv{EorXCY2xK|2hs~-K@|6BxjrKoMm6RUl5PdbJ*BzM}2 zJy7Gx{!TH(A7|RoJY!u*jC^WtK;%8v_PBhA615&T9{%SuJ)vr{fAlj}boN%34Yz8J zTuq;Ps;LzlKF)-jvLy|5UD3RBlE-z9l59%q$B75m;z?;5=^n^WR+kEU{z54Bj5Bi<^{j96wVRw=Lg<$hf0FG$PX8 zi6@9*8s<5P78`z=aOGq!`Ez)T7Vk50s_&&)r(LcGe?ZLUqWX;*O-B+fpyx22M))Yt z$^#>;lO-JVO5!<9`Gn6m#mz~XysfD@7Z-xdL5IDuWu{9YQW^{qw4`<`#;b*p(acX# zveYZuZHL;n$!2}mDBb(|KJnt4u1EUf9_M&ep3xr-BH8)%5}HqTM+PSLUM+F$GjQhz zp;)7N7}>TW+#Rbao0*KBhW3svY>7n1-pgF@_FFE^{L#wMqMf(s9V=W6L^gMdVzz= z61-Y;Tw!P7Z7$8lo8u>C-}x&RR_dmK?128w$DHIZNR?;d_bV`TULCY$5=%NNMU2Wn za)SAzG#FibD@z~f6H6y~0ENPUssdj{l20oF9$LjXxSsZLQleCa3h+wja->zJ_Wi?K>RxBkGYpDT+C2+Cs<@_ZLMnmzi>Y&;sN`x z_)BtHke*yJwMJ)FdewWCI&Vm}`uM?Hkg0sYgl8@LGhOQYYhU=-DQahu#%&WiJ{mXz zJWVq0yWgY6_Vim$VEMloTg1Cb2%IudD*0WISxj`-!R0o9_6(}-PKPD0U|9mw8>owY zpomo?l^JXQ?pyb+n12X^5QRE81fLZVoS^~r3A}X&Z9n)ORY3(BR@u{sx;VVDI)x}b z4D7iq`U1*LRy{g1n_}xQL>%NNsrpQq$wo{K4^GDQq-LZ3Bg#|fySPR1d<;l(o$zG+ zzCWkqm`Bg;n#g4MzWmK<`Ev-da>nWVi)|zVYCsKl*EOE73HeG(Mz?z?EC``uE{}$_M%<#Zv?rz7ZMo0m67nb3qTRUC2jEs z@4#i)Tm?(o3XU%#x}LeahFycBGzNli!6Gc6{kHj@j^`dQ0P4h@qKEd>90OMmoSeac z%{kuhrr}2rZeI68S0iiR+zU_@C&cYBRZAu^CK*t-Zi&pGit~3}&=&C>f`9qTzxyaO zxXSTST_Tm=WmVIL%c{aUcESo#skGM!!x>edKR}d(r_~~RioV0MGBuXgAW!?vNuHFt z7USO+ys#vhzPYND3?v+_MR@$wD~cyH0%$*g4h8+P@nE3~mjJbUpt@%Nk*XUW*g$3t zfGqgDeuP~7 z5>1+){(99g-qK4N!ooVEt`iH#WJ7tFl&RqT63FRO#Jbl-AP*U#c_WD<)^BdRo>b+O zzN01RCXmYJ8#57rZt!7_Wa?OLqgd;;qN%#jC6Tp_O=ia)VdVhff(IugcPOjpc`eiuzjxyref_6 ztpH*$zff!6YpY2E%eqVbWPwvxq*vzT_Lof}2(xOdx>(lCyLw7gV9L0?AD@p=pDjec z%DIU+MFE*$?Y+>alVcjIc>z<)BKcb#OVo>%0dMb!XV>Q3h+NZ=GG|TIItBu#{%Ezt zX%lPI&kg_XZ~mNGHI2+j>DT9^Xm^CVM2USCwXHu*wiC2)nBrN3JfLrV|6(!CgQ^lN zM%EB;!8erDI0!FBj3w!trv78@%4*=GzdnV_iQ%oyPlQ>=Noj6A<~QA=v){Fc?@+?_ zhd_tnas|2V6QpDDneP++{gjdZ%#e;pHQy?KRN-J*rHJ{v({8{6Zn$@$a4ARmZ@+x< z<|V0rs|%M=up>Y1P%@OyWZtu@j0u`p2?Zs#*Nm!Yre*lhm1fA|Ey`O;_uvPMU9)w@Uy=c{8FK+ z@Xsn|;bP5@;zpCtqb~Z*3c6|KUAb@`!SwyE)-udJ?dwR0`K^5#;`90sjc^rNv| zX1Uz;g#8ib_`7pkcjMLUWKj&}_q8S1<9oH0^wH;T2E2VQESX~vYwxXpYg7el;ZO`z z%q@E8vGI)(GB*hQB)Bfg-|1LiXMb9x+TB`&m?y1#)8Ey%ZmT;-x*Kf@LE6%kmHxG) z$Nl+m!A-PHo@AN#V23Z=wZ+1B^3W--SF(}jH7wM9mok59*YmT@sMo*i zpIVtE(T-^HJ_u1=3d$DY)aVkS3!;R*E?F$>Lu(x9G~G_66{U$ZYT@xeZ4TE$iv_9uVYI_{S#tgD z-D|R?lDG4t1gda>4R`3B_1aH&zT9AH)p0;;b{jOuUkTgbPM~?q}HxDUUN5i>QRXd`4xl zHqeF4GJdCEb?4*a>pi!W#FWD;okh8XnSd2=jvP4+#$H(N{WFcFj2`n*q?k8}yUO}J z)XD-ow}v9|fJ-=O`U>pytLn%801cKStE#DvHUY3}Kxx);?4^jHfniQd=j2vGD*kr> zi<#+`XYNT)elmU^r4=6+n^9&_XZmLf)-i7WQ&Dd^(th4c{^Bh}5q#+CB^^^Q{OxMf zop=Ii} zFAj8R!so>j+gj}UpoQzhJF(0RVNw3?zt5Nz#P?0}6o8Z{Kz(+sBnu%!JqAW#^FeF7wKia$eUHpj zUJX0#Wz>NHsz@;GQ0toRk%TIzv^)(Lpti80QkkBnW-`^Q6su1gmAk782d{_rZlTXP z?;&RPgoj({cLG5EL1lSa49(+NEJYwR?%3q2D6CyInraF%bAyV%W+ZxnT>!ws5_;xQ zMPJ_}r`P{3r?1S&7Wb@i=tX+n@cr~1sIGO|y#WQ^ znV*Q3EA3-9>W0)y>!?EdF|9=V5WH)YG}x1(P-H~920KCqOr5@vfk>m;G1m=R`Dd@LxM9q3;jDSJ%s23{yJF?GFe7 zM_l#D1IWU^XpJskG=}he-=~c-|K5Mb2puC1OZ}B}zGYPw?ra3CxHZ*z78FM!6095K zlQ*28T4VGkolH)EJ*#VoxT($Gcvgu=Jce(TI(T!r(b*h)@i=~_8he3z{~?r1BY=sT zMP~8Mc?M2=#4g`RNJ3AnROz?Tzn)(`#CKhro73l((Oh{+-M)-FL`5&#)L9f8Gwlr@ z7JVrM|p_?`RZv7H06I^T=!WK^1ykCT}B>zOxc7O%aXL*T2c~(w1*jUL8tH z^o|Q$SytMZG3_bL`#Lm`7ud3fo4{Qps>DT9li@*rU?7EU8(C8blYm;^BmR;eeD|?a zdm7QJ_v9I#MO)9mtB*1qonZ{~Bk6*2XAfL{=)iV>(f7!b{kAcxB+Tgtq_Q-^IYt&E z-d{#Z!rPRj1{RAgz6FYQP|YW(TH^103CPFQqkC9@%bS=q&(&;(}4YrIagdBr|;@|u=9LZ~rs0oaxiUN+L<^9TI1{@bM z*OCnSwMLK%feM#Y=^y+Ei;{MhhsInSNTv6=s@_}INqVw*DXjHwI=mjwMsy^un#6`@ z)gciWtlcRN`P2uo7>G5?%$PF`lEO?&$!khgT1OOrFv4ti$0-Kfs(N2$9h({4nxg}> z*cc~&=Q%dRVdB51S{v=$vy2GZywj9_2bx&(Mt)I=A?Kkc^@#=-bnRz#C>r|>)Y;JG zo){=|nw;Qz`P^+K^tdQm(R=EQyKP9_V_PvAPcNkNe&zN{suvo6Qs!Vda4%@PeDTF$m%64WSDuBz)&5FwMTQyi6nacny)5g={toa}edAVw-vRJ@CY*62LAt zc9;5Vn%=DaRRr_v#v|K?kR?*&ZsnDBpSJ&gnbSF{iCRBD2S1vX$#UFXFDaI*#$V~( znARdSoT9q4x8ZQcXP-v-!FLMG+;(Gf(!NfV6jl<0h<=k^*p3_COrNAdL9xFOY$NA~ zXnIrlv{;mwbDzq}9E0;f>15yx+riPa_J`nq^GT{TuP0rX*O1H3kDOzo%scHr`&^j5 zNvudoycUCzX1?#L@M|Jo$qutD^FOD~vrq)KDb;JH-fgNKRZTg8#o0T@=;~>e+-F2z zZgj?#Umy2V`9yhWRicG7CJz^DOY9Uo-*k?#PGh=uDC6;HmEOCgI3k=!h z7AbU&DTN6hCYL%_H~z8HYek~tHnh1%s8)|@}X z3mql64V8F{{}}A?;Lu@5*-)2rIKY6TATO;?X9~im#=KHsjy07-dgc-jH=WDX@m^A* z9Ut7)O!j0P9ml9EMw4U7DwQ!Z35xu;0p*uq9a|kACH1n>3$$nryDC*>X5T^j?#z-% zqP8&5L25nUSC=o3lqK;LFfIDFUlIM+XBy7E2EM;=-0*OT+mF{#RdPle$yvQM+A3HDLaQ*m7TIi>bUxT+nivSy$n%dGma zcHvf+Y)rRO81Mf)^J=g2fNHnFELiXVJPKdbsG|8O=K1g|fXKUw5)0GWy4u5~MUN8) z;X6Kx=gfovwUKVv>&458WAAxS`Xgk$6~(IK>(&~`PP=&G@snuHe_wv@gl38!8xvrP zfC=NJQK`a5!y)G>E`g>S)661yhbSvdBf8ZM4Ji$kXL+U7mChZ0OL!(-$h34u{_bx> zzgq%n#rF_mz#^c?ISK$j101^=C5VhfW+;TjmF=p3($NnbUX+)nIYq>-%s0buyexcd z_ z^X18&ni?%y=a(;>-y5AIFeRsFza>iF?!1Go^upA0Sip4Xm(J20TT=l9y|oN6I=5lS zLc(6#ew{Il9K*&gR&rW{L_d)CD<9Fmjw%9KMak*ewN9ADgnXP>IlM!|+K>lR?c>*& zd&(ht0!aMeUw>==hjB=6BxS(EH4ZF}84^Qvzxu1r-R9}(VhwRz{SHfPX{ThsQlp>V z?H6Y*Zc8r}=0;p}xDb(cMEaVM(+ankC>Ri@==*TYJdwfD|8(*A+VG%mbvcFb>-be4{-e|5wRAj z(e%vp1e&*Bd4-`z-MQyL_!Xd3>tBzY+Q{!@5XP;Vkm{tz?=FMt=cTq-C#@4h9RKyj z?u|gB@O~G$V0u%tGEV&%y7SjLGjs92im(q3gW1w5eCbjZ`C8UhNL#x?MiXQsHXLso z^%u03|Af6-@3x9z_=`1w3pHacp59*UL?^Mkbc(R&ZduCe_hBTNb*q}ypZs25FFcLF zX@=rYI4-akv9h+d&2Dqm%SO3T?w>iIQQZxUgUVm_V`Yq<9CZ%b z7b!1MFABN9#{-xSBQ|{D(Ehw({V5SJGW`Q%^Zx=XH<2Y=<_-v@B>tXv8%+tBx;fV^ zE~@~%C-={9;i=ozJJ)pOT-h~tavRy?FFrqmBOBPNhwZMbe2R5xP(B;vG<@E_*=?Pj zsdPopT_ODPFWJOY$YmzzC2&UE>{G$ycXT6@*q@EtFajZMCS5?C^JVX1H(q-M9wZ7G z4(xdtzO7YRPNDxaNHRMoe#S@|J)XtTXNh!)vi-Dm~h5PIq9v0XL4ywKKx@ z&Dir;7;GbIwO<2Eh^XG^hePmn_(`qQNFG$ZRu$MilcakP82dM$O*$0R2@^3Z+ao>&UCMiQ;)o!ysjP;oN=dAKt*~+%1eSe@TR$L2{{~v&B;&kl^$w z3Dj>Fsr7plS(+jbuiD(yO>aTnls21b6h0F}{x|6ag%6ZDrIEWuG)H&EVTDE`B>MxY zJu!MJTg>G?_HUBjYTXv{?FA?Br2j1qi^=4l-&r6CF7sBG|K+oSZ>;P=Y1>0-H_`36 zW)dVOQ)}n!>{HRwr2jrt!AI0P+*r);^2M05=;k9&P`2nNZt1bW^i;=g-mpNeNm-5; zv-|qOwhzSga?P<4BGbgYmN!!tcHai3+Afpz4T}t!c5yqLT{mUr0tjQiVCxHLwIkE$ ku;!2isEn4wxt$tAzXSh3j~f!(=K#t$xaAQ}UK{TJ0p{_LV*mgE literal 0 HcmV?d00001 diff --git a/src/commands/generate.ts b/src/commands/generate.ts index 4117ec3..6d19189 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -1,19 +1,18 @@ +import SwaggerParser from "@apidevtools/swagger-parser"; import { exec } from "child_process"; - import { OpenAPIV3 } from "openapi-types"; - import { resolveConfig } from "@/generators/core/resolveConfig"; import { generateCodeFromOpenAPIDoc } from "@/generators/generateCodeFromOpenAPIDoc"; import { GenerateOptions } from "@/generators/types/options"; import { writeGenerateFileData } from "@/generators/utils/file.utils"; import { logError, logInfo, logSuccess } from "@/helpers/cli.helper"; import { loadConfig } from "@/helpers/config.helper"; -import SwaggerParser from "@apidevtools/swagger-parser"; +import { Profiler } from "@/helpers/profile.helper"; export type GenerateParams = { config?: string; excludeTags?: string; - format?: boolean; + prettier?: boolean; verbose?: boolean; } & Partial< Pick< @@ -29,6 +28,7 @@ export type GenerateParams = { | "extractEnums" | "acl" | "checkAcl" + | "standalone" | "baseUrl" | "replaceOptionalWithNullish" | "infiniteQueries" @@ -39,49 +39,103 @@ export type GenerateParams = { > >; -export async function generate({ format, verbose, config: configParam, ...params }: GenerateParams) { +export async function generate({ prettier, verbose, config: configParam, ...params }: GenerateParams) { const start = Date.now(); + const profiler = new Profiler(process.env.OPENAPI_CODEGEN_PROFILE === "1"); if (verbose) { logInfo("Resolving config..."); } - const fileConfig = await loadConfig(configParam); - const config = resolveConfig({ fileConfig, params }); + const fileConfig = await profiler.runAsync("config.load", async () => await loadConfig(configParam)); + const config = profiler.runSync("config.resolve", () => resolveConfig({ fileConfig, params })); if (verbose) { logInfo("Parsing OpenAPI spec..."); } - const openApiDoc = (await SwaggerParser.bundle(config.input)) as OpenAPIV3.Document; + const openApiDoc = await getOpenApiDoc(config.input, profiler); if (verbose) { logInfo("Generating code..."); } - const filesData = generateCodeFromOpenAPIDoc(openApiDoc, config); + const filesData = profiler.runSync("generate.total", () => generateCodeFromOpenAPIDoc(openApiDoc, config, profiler)); if (verbose) { logInfo("Writing files..."); } - writeGenerateFileData(filesData); + profiler.runSync("files.write", () => writeGenerateFileData(filesData)); if (verbose) { logSuccess(`Time: ${Date.now() - start}ms`); + if (profiler.enabled) { + logInfo("Profile breakdown:"); + profiler.formatLines().forEach((line) => logInfo(` ${line}`)); + } } - if (format) { - execOxfmt({ output: config.output, verbose }); + if (prettier) { + execPrettier({ output: config.output, verbose }); } } -function execOxfmt({ output, verbose }: Pick) { - if (verbose) { - logInfo("Running Oxfmt..."); +async function getOpenApiDoc(input: string, profiler: Profiler): Promise { + const parsedDoc = (await profiler.runAsync( + "openapi.parse", + async () => await SwaggerParser.parse(input), + )) as OpenAPIV3.Document; + const hasExternalRefs = profiler.runSync("openapi.detectExternalRefs", () => hasExternalRef(parsedDoc)); + if (!hasExternalRefs) { + return parsedDoc; } - exec(`oxfmt ${output}`, (error) => { + return (await profiler.runAsync( + "openapi.bundle", + async () => await SwaggerParser.bundle(input), + )) as OpenAPIV3.Document; +} + +function hasExternalRef(value: unknown): boolean { + const stack = [value]; + const visited = new Set(); + + while (stack.length > 0) { + const current = stack.pop(); + if (!current || typeof current !== "object") { + continue; + } + + if (visited.has(current)) { + continue; + } + visited.add(current); + + if ( + "$ref" in current && + typeof (current as { $ref?: unknown }).$ref === "string" && + !(current as { $ref: string }).$ref.startsWith("#/") + ) { + return true; + } + + for (const nested of Object.values(current)) { + if (nested && typeof nested === "object") { + stack.push(nested); + } + } + } + + return false; +} + +function execPrettier({ output, verbose }: Pick) { + if (verbose) { + logInfo("Running Prettier..."); + } + const ignorePathArg = process.env.NODE_ENV === "production" ? "" : "--ignore-path .prettierignore"; + exec(`prettier --write ${output} ${ignorePathArg}`, (error) => { if (verbose) { if (error) { - logError(error, "Oxfmt error"); + logError(error, "Prettier error"); } else { - logSuccess("Oxfmt finished."); + logSuccess("Prettier finished."); } } }); diff --git a/src/generators/core/SchemaResolver.class.ts b/src/generators/core/SchemaResolver.class.ts index 49b544e..0612642 100644 --- a/src/generators/core/SchemaResolver.class.ts +++ b/src/generators/core/SchemaResolver.class.ts @@ -1,6 +1,7 @@ import { OpenAPIV3 } from "openapi-types"; import { ALLOWED_METHODS } from "@/generators/const/openapi.const"; +import { Profiler } from "@/helpers/profile.helper"; import { OperationObject } from "@/generators/types/openapi"; import { GenerateOptions } from "@/generators/types/options"; import { ValidationError } from "@/generators/types/validation"; @@ -52,6 +53,23 @@ interface ZodSchemaData { tags: string[]; } +export interface OperationContext { + path: string; + method: OpenAPIV3.HttpMethods; + operation: OperationObject; + tag: string; + operationName: string; + isUniqueOperationName: boolean; + parameters: OpenAPIV3.ParameterObject[]; + deepRefs: string[]; + responses: { + statusCode: string; + responseObj: OpenAPIV3.ResponseObject; + matchingMediaType?: string; + schema?: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject; + }[]; +} + interface CompositeZodSchemaData { code: string; zodSchemas: { @@ -83,12 +101,25 @@ export class SchemaResolver { private readonly schemaData: SchemaData[] = []; private readonly zodSchemaData: ZodSchemaData[] = []; private readonly compositeZodSchemaData: CompositeZodSchemaData[] = []; + private readonly schemaRefs: string[]; + private readonly schemaByRef = new Map(); + private readonly schemaDataByRef = new Map(); + private readonly schemaDataByName = new Map(); + private readonly refByZodSchemaName = new Map(); + private readonly zodSchemaDataByName = new Map(); + private readonly compositeByCode = new Map(); + private readonly compositeSchemaByZodSchemaName = new Map< + string, + { zodSchema: ZodSchema; schema?: OpenAPIV3.SchemaObject } + >(); readonly dependencyGraph: DependencyGraph; readonly enumZodSchemas: EnumZodSchemaData[] = []; readonly extractedEnumZodSchemaData: ExtractedEnumZodSchemaData[] = []; readonly operationsByTag: Record = {}; readonly operationNames: string[] = []; + private readonly operationNameCounts = new Map(); + private readonly operationContexts: OperationContext[] = []; readonly validationErrors: ValidationError[] = []; @@ -96,28 +127,37 @@ export class SchemaResolver { return this.openApiDoc.components?.schemas ?? {}; } - private get schemaRefs() { - return Object.keys(this.docSchemas).map(getSchemaRef); - } - constructor( public readonly openApiDoc: OpenAPIV3.Document, public readonly options: GenerateOptions, + private readonly profiler?: Profiler, ) { + this.schemaRefs = Object.keys(this.docSchemas).map(getSchemaRef); this.dependencyGraph = getOpenAPISchemaDependencyGraph(this.schemaRefs, this.getSchemaByRef.bind(this)); this.enumZodSchemas = getEnumZodSchemasFromOpenAPIDoc(this); this.operationsByTag = getOperationsByTag(openApiDoc, options); this.operationNames = getUniqueOperationNamesWithoutSplitByTags(openApiDoc, this.operationsByTag, options); + for (const name of this.operationNames) { + this.operationNameCounts.set(name, (this.operationNameCounts.get(name) ?? 0) + 1); + } this.initialize(); } getSchemaByRef(ref: string) { - return this.docSchemas[getSchemaNameByRef(ref)] as OpenAPIV3.SchemaObject; + const correctRef = autocorrectRef(ref); + const cachedSchema = this.schemaByRef.get(correctRef); + if (cachedSchema) { + return cachedSchema; + } + + const schema = this.docSchemas[getSchemaNameByRef(correctRef)] as OpenAPIV3.SchemaObject; + this.schemaByRef.set(correctRef, schema); + return schema; } getSchemaDataByName(name: string) { - return this.schemaData.find((data) => data.name === name); + return this.schemaDataByName.get(name); } getZodSchemaNameByRef(ref: string) { @@ -131,7 +171,7 @@ export class SchemaResolver { } getRefByZodSchemaName(zodSchemaName: string) { - return this.schemaData.find((data) => data.zodSchemaName === zodSchemaName)?.ref; + return this.refByZodSchemaName.get(zodSchemaName); } getTagByZodSchemaName(zodSchemaName: string) { @@ -146,7 +186,7 @@ export class SchemaResolver { const schemaRef = this.getRefByZodSchemaName(zodSchemaName); const schemaTags = schemaRef ? (this.getSchemaDataByRef(schemaRef)?.tags ?? []) : []; - const zodSchemaTags = this.zodSchemaData.find((data) => data.zodSchemaName === zodSchemaName)?.tags ?? []; + const zodSchemaTags = this.zodSchemaDataByName.get(zodSchemaName)?.tags ?? []; const tags = getUniqueArray(schemaTags, zodSchemaTags); const tag = tags.length === 1 ? tags[0] : this.options.defaultTag; @@ -154,22 +194,22 @@ export class SchemaResolver { } getCodeByZodSchemaName(name: string) { - return this.zodSchemaData.find((data) => data.zodSchemaName === name)?.code; + return this.zodSchemaDataByName.get(name)?.code; } getZodSchemaNamesByCompositeCode(code: string) { - return this.compositeZodSchemaData - .find((data) => data.code === code) - ?.zodSchemas.map((schema) => schema.zodSchemaName); + return this.compositeByCode.get(code)?.zodSchemas.map((schema) => schema.zodSchemaName); } setZodSchema(name: string, code: string, tag: string) { - const zodSchema = this.zodSchemaData.find((data) => data.zodSchemaName === name); + const zodSchema = this.zodSchemaDataByName.get(name); if (zodSchema) { zodSchema.code = code; zodSchema.tags = (zodSchema.tags ?? []).concat(tag); } else { - this.zodSchemaData.push({ zodSchemaName: name, code, tags: [tag] }); + const newZodSchemaData = { zodSchemaName: name, code, tags: [tag] }; + this.zodSchemaData.push(newZodSchemaData); + this.zodSchemaDataByName.set(name, newZodSchemaData); } } @@ -180,25 +220,23 @@ export class SchemaResolver { schema?: OpenAPIV3.SchemaObject, ) { const compositeZodSchema = { zodSchemaName, zodSchema, schema }; - const compositeData = this.compositeZodSchemaData.find((data) => data.code === code); + const compositeData = this.compositeByCode.get(code); if (compositeData) { compositeData.zodSchemas.push(compositeZodSchema); } else { - this.compositeZodSchemaData.push({ code, zodSchemas: [compositeZodSchema] }); + const newCompositeData = { code, zodSchemas: [compositeZodSchema] }; + this.compositeZodSchemaData.push(newCompositeData); + this.compositeByCode.set(code, newCompositeData); } + this.compositeSchemaByZodSchemaName.set(zodSchemaName, { zodSchema, schema }); } getCompositeZodSchemaByZodSchemaName(zodSchemaName: string) { - const compositeZodSchema = this.compositeZodSchemaData.find((data) => - data.zodSchemas.some((schema) => schema.zodSchemaName === zodSchemaName), - ); - return compositeZodSchema?.zodSchemas.find((schema) => schema.zodSchemaName === zodSchemaName)?.zodSchema; + return this.compositeSchemaByZodSchemaName.get(zodSchemaName)?.zodSchema; } getSchemaByCompositeZodSchemaName(compositeZodSchemaName: string) { - return this.compositeZodSchemaData - .find((data) => data.zodSchemas.some((schema) => schema.zodSchemaName === compositeZodSchemaName)) - ?.zodSchemas.find((schema) => schema.zodSchemaName === compositeZodSchemaName)?.schema; + return this.compositeSchemaByZodSchemaName.get(compositeZodSchemaName)?.schema; } getEnumZodSchemaDataByCode(code: string) { @@ -219,14 +257,21 @@ export class SchemaResolver { } getZodSchemas() { - return this.zodSchemaData.reduce((acc, { zodSchemaName, code }) => ({ ...acc, [zodSchemaName]: code }), {}); + const zodSchemas = {} as Record; + for (const { zodSchemaName, code } of this.zodSchemaData) { + zodSchemas[zodSchemaName] = code; + } + return zodSchemas; } getExtractedEnumZodSchemas() { - return this.extractedEnumZodSchemaData.reduce( - (acc, { zodSchemaName, code }) => (zodSchemaName ? { ...acc, [zodSchemaName]: code } : acc), - {}, - ); + const zodSchemas = {} as Record; + for (const { zodSchemaName, code } of this.extractedEnumZodSchemaData) { + if (zodSchemaName) { + zodSchemas[zodSchemaName] = code; + } + } + return zodSchemas; } resolveObject(obj: OpenAPIV3.ReferenceObject | T): T { @@ -259,6 +304,14 @@ export class SchemaResolver { return this.options.baseUrl; } + isOperationNameUnique(operationName: string) { + return (this.operationNameCounts.get(operationName) ?? 0) <= 1; + } + + getOperationContexts() { + return this.operationContexts; + } + getZodSchemaObj(zodSchemaName: string) { const ref = this.getRefByZodSchemaName(zodSchemaName); if (ref) { @@ -272,15 +325,16 @@ export class SchemaResolver { const enumZodSchemaData = this.getExtractedEnumZodSchemaDataByName(zodSchemaName); if (enumZodSchemaData) { - return enumZodSchemaData.meta.schemas.reduce( - (acc, curr) => ({ ...acc, ...this.resolveObject(curr) }), - {} as OpenAPIV3.SchemaObject, - ); + const schemaObject = {} as OpenAPIV3.SchemaObject; + for (const schema of enumZodSchemaData.meta.schemas) { + Object.assign(schemaObject, this.resolveObject(schema)); + } + return schemaObject; } } private getSchemaDataByRef(ref: string) { - return this.schemaData.find((data) => data.ref === ref); + return this.schemaDataByRef.get(ref); } private getExtractedEnumZodSchemaDataByName(enumZodSchemaName: string) { @@ -288,131 +342,183 @@ export class SchemaResolver { } private initialize() { - this.schemaRefs.forEach((ref) => { - const correctRef = autocorrectRef(ref); - const name = getSchemaNameByRef(correctRef); - const zodSchemaName = getZodSchemaName(name, this.options.schemaSuffix); - this.schemaData.push({ ref: correctRef, name, zodSchemaName, tags: [], deepRefOperations: [] }); - }); - - for (const path in this.openApiDoc.paths) { - if (isPathExcluded(path, this.options)) { - continue; - } + const p = this.profiler ?? new Profiler(false); - const pathItemObj = this.openApiDoc.paths[path] as OpenAPIV3.PathItemObject; + p.runSync("resolver.init.seedSchemas", () => { + this.schemaRefs.forEach((ref) => { + const correctRef = autocorrectRef(ref); + const name = getSchemaNameByRef(correctRef); + const zodSchemaName = getZodSchemaName(name, this.options.schemaSuffix); + const data = { ref: correctRef, name, zodSchemaName, tags: [], deepRefOperations: [] }; + this.schemaData.push(data); + this.schemaDataByRef.set(correctRef, data); + this.schemaDataByName.set(name, data); + this.refByZodSchemaName.set(zodSchemaName, correctRef); + }); + }); - const pathItem = pick(pathItemObj, ALLOWED_METHODS); - for (const method in pathItem) { - const operation = pathItem[method as keyof typeof pathItem] as OperationObject | undefined; - if (!operation || isOperationExcluded(operation, this.options)) { + p.runSync("resolver.init.operationsLoop", () => { + for (const path in this.openApiDoc.paths) { + if (isPathExcluded(path, this.options)) { continue; } - const tag = getOperationTag(operation, this.options); - const operationName = getUniqueOperationName({ - path, - method, - operation, - operationsByTag: this.operationsByTag, - options: this.options, - }); - const isUniqueOperationName = this.operationNames.filter((name) => name === operationName).length <= 1; - const zodSchemaOperationName = snakeToCamel( - getZodSchemaOperationName(operationName, isUniqueOperationName, tag), - ); - const schemaRefObjs = [] as OpenAPIV3.ReferenceObject[]; - - operation.parameters?.map((parameter) => { - const parameterObject = parameter as OpenAPIV3.ParameterObject; - const parameterSchema = parameterObject.schema; - const schemaInfo = `Operation ${operation.operationId ?? path} parameter ${parameterObject.name}`; - - schemaRefObjs.push(...getSchemaRefObjs(this, parameterSchema, schemaInfo)); - - if (this.options.extractEnums) { - updateExtractedEnumZodSchemaData({ - resolver: this, - schema: parameterSchema, - schemaInfo, - tags: [tag], - nameSegments: [zodSchemaOperationName, parameterObject.name], - includeSelf: true, - }); - } - }); + const pathItemObj = this.openApiDoc.paths[path] as OpenAPIV3.PathItemObject; + const pathParameters = this.getParameters(pathItemObj.parameters ?? []); - if (operation.requestBody) { - const requestBodyObj = this.resolveObject(operation.requestBody); - const mediaTypes = Object.keys(requestBodyObj.content ?? {}); - const matchingMediaType = mediaTypes.find(isParamMediaTypeAllowed); - if (matchingMediaType) { - const matchingMediaSchema = requestBodyObj.content?.[matchingMediaType]?.schema; - const schemaInfo = `Operation ${operation.operationId} request body`; - - schemaRefObjs.push(...getSchemaRefObjs(this, matchingMediaSchema, schemaInfo)); - - if (this.options.extractEnums) { - updateExtractedEnumZodSchemaData({ - resolver: this, - schema: matchingMediaSchema, - schemaInfo, - tags: [tag], - nameSegments: [getBodyZodSchemaName(zodSchemaOperationName)], - }); - } + const pathItem = pick(pathItemObj, ALLOWED_METHODS); + for (const method in pathItem) { + const operation = pathItem[method as keyof typeof pathItem] as OperationObject | undefined; + if (!operation || isOperationExcluded(operation, this.options)) { + continue; } - } - for (const statusCode in operation.responses) { - const responseObj = this.resolveObject(operation.responses[statusCode]); - const mediaTypes = Object.keys(responseObj?.content ?? {}); - const matchingMediaType = mediaTypes.find(isMediaTypeAllowed); - if (matchingMediaType) { - const matchingMediaSchema = responseObj.content?.[matchingMediaType]?.schema; - const schemaInfo = `Operation ${operation.operationId} response body`; - - schemaRefObjs.push(...getSchemaRefObjs(this, matchingMediaSchema, schemaInfo)); - - if (this.options.extractEnums) { - updateExtractedEnumZodSchemaData({ - resolver: this, - schema: matchingMediaSchema, - schemaInfo, - tags: [tag], - nameSegments: [getResponseZodSchemaName({ statusCode, operationName, isUniqueOperationName, tag })], - }); + const tag = getOperationTag(operation, this.options); + const operationName = getUniqueOperationName({ + path, + method, + operation, + operationsByTag: this.operationsByTag, + options: this.options, + }); + const isUniqueOperationName = this.isOperationNameUnique(operationName); + const parameters = p.runSync("resolver.init.parameters.mergeResolve", () => + Object.entries({ + ...pathParameters, + ...this.getParameters(operation.parameters ?? []), + }).map(([, param]) => this.resolveObject(param as OpenAPIV3.ReferenceObject | OpenAPIV3.ParameterObject)), + ); + const responses = p.runSync("resolver.init.responses.prepare", () => + Object.entries(operation.responses).map(([statusCode, response]) => { + const responseObj = this.resolveObject(response) as OpenAPIV3.ResponseObject; + const mediaTypes = Object.keys(responseObj?.content ?? {}); + const matchingMediaType = mediaTypes.find(isMediaTypeAllowed); + const schema = matchingMediaType ? responseObj.content?.[matchingMediaType]?.schema : undefined; + return { statusCode, responseObj, matchingMediaType, schema }; + }), + ); + const zodSchemaOperationName = snakeToCamel( + getZodSchemaOperationName(operationName, isUniqueOperationName, tag), + ); + const schemaRefObjs = [] as OpenAPIV3.ReferenceObject[]; + + p.runSync("resolver.init.parameters.refs", () => { + parameters.forEach((parameter) => { + const parameterObject = this.resolveObject( + parameter as OpenAPIV3.ReferenceObject | OpenAPIV3.ParameterObject, + ); + const parameterSchema = parameterObject.schema; + const schemaInfo = `Operation ${operation.operationId ?? path} parameter ${parameterObject.name}`; + + schemaRefObjs.push(...getSchemaRefObjs(this, parameterSchema, schemaInfo)); + + if (this.options.extractEnums) { + updateExtractedEnumZodSchemaData({ + resolver: this, + schema: parameterSchema, + schemaInfo, + tags: [tag], + nameSegments: [zodSchemaOperationName, parameterObject.name], + includeSelf: true, + }); + } + }); + }); + + p.runSync("resolver.init.requestBody.refs", () => { + if (operation.requestBody) { + const requestBodyObj = this.resolveObject(operation.requestBody); + const mediaTypes = Object.keys(requestBodyObj.content ?? {}); + const matchingMediaType = mediaTypes.find(isParamMediaTypeAllowed); + if (matchingMediaType) { + const matchingMediaSchema = requestBodyObj.content?.[matchingMediaType]?.schema; + const schemaInfo = `Operation ${operation.operationId} request body`; + + schemaRefObjs.push(...getSchemaRefObjs(this, matchingMediaSchema, schemaInfo)); + + if (this.options.extractEnums) { + updateExtractedEnumZodSchemaData({ + resolver: this, + schema: matchingMediaSchema, + schemaInfo, + tags: [tag], + nameSegments: [getBodyZodSchemaName(zodSchemaOperationName)], + }); + } + } } - } + }); + + p.runSync("resolver.init.responses.refs", () => { + for (const responseData of responses) { + if (!responseData.matchingMediaType) { + continue; + } + + const schemaInfo = `Operation ${operation.operationId} response body`; + schemaRefObjs.push(...getSchemaRefObjs(this, responseData.schema, schemaInfo)); + + if (this.options.extractEnums) { + updateExtractedEnumZodSchemaData({ + resolver: this, + schema: responseData.schema, + schemaInfo, + tags: [tag], + nameSegments: [ + getResponseZodSchemaName({ + statusCode: responseData.statusCode, + operationName, + isUniqueOperationName, + tag, + }), + ], + }); + } + } + }); + + const deepRefs = p.runSync("resolver.init.deepRefs", () => getDeepSchemaRefObjs(this, schemaRefObjs)); + const operationContext: OperationContext = { + path, + method: method as OpenAPIV3.HttpMethods, + operation, + tag, + operationName, + isUniqueOperationName, + parameters, + deepRefs, + responses, + }; + this.operationContexts.push(operationContext); + deepRefs.forEach((schemaRef) => { + const schemaData = this.getSchemaDataByRef(schemaRef); + if (schemaData) { + schemaData.tags.push(tag); + schemaData.deepRefOperations.push(operation); + } + }); } - - const deepRefs = getDeepSchemaRefObjs(this, schemaRefObjs); - deepRefs.forEach((schemaRef) => { - const schemaData = this.getSchemaDataByRef(schemaRef); - if (schemaData) { - schemaData.tags.push(tag); - schemaData.deepRefOperations.push(operation); - } - }); } - } + }); if (this.options.extractEnums) { - this.schemaRefs.forEach((ref) => { - const schemaRef = autocorrectRef(ref); - - updateExtractedEnumZodSchemaData({ - resolver: this, - schema: this.getSchemaByRef(schemaRef), - schemaRef, - tags: this.getSchemaDataByRef(schemaRef)?.tags ?? [], - nameSegments: [getSchemaNameByRef(schemaRef)], + p.runSync("resolver.init.enums.finalize", () => { + this.schemaRefs.forEach((ref) => { + const schemaRef = autocorrectRef(ref); + + updateExtractedEnumZodSchemaData({ + resolver: this, + schema: this.getSchemaByRef(schemaRef), + schemaRef, + tags: this.getSchemaDataByRef(schemaRef)?.tags ?? [], + nameSegments: [getSchemaNameByRef(schemaRef)], + }); }); - }); - resolveExtractedEnumZodSchemaTags(this); - this.handleDuplicateEnumZodSchemas(); - resolveExtractedEnumZodSchemaNames(this); + resolveExtractedEnumZodSchemaTags(this); + this.handleDuplicateEnumZodSchemas(); + resolveExtractedEnumZodSchemaNames(this); + }); } } @@ -452,4 +558,10 @@ export class SchemaResolver { ...this.extractedEnumZodSchemaData.filter(({ code }) => !codes.has(code)), ); } + + private getParameters(parameters: NonNullable) { + return Object.fromEntries( + (parameters ?? []).map((param) => [isReferenceObject(param) ? param.$ref : param.name, param] as const), + ); + } } diff --git a/src/generators/core/endpoints/getEndpointBody.ts b/src/generators/core/endpoints/getEndpointBody.ts index 8f18f8e..97a48e2 100644 --- a/src/generators/core/endpoints/getEndpointBody.ts +++ b/src/generators/core/endpoints/getEndpointBody.ts @@ -1,12 +1,10 @@ import { BODY_PARAMETER_NAME } from "@/generators/const/endpoints.const"; import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { getZodChain } from "@/generators/core/zod/getZodChain"; -import { getZodSchema } from "@/generators/core/zod/getZodSchema"; -import { resolveZodSchemaName } from "@/generators/core/zod/resolveZodSchemaName"; import { EndpointParameter } from "@/generators/types/endpoint"; import { OperationObject } from "@/generators/types/openapi"; import { isParamMediaTypeAllowed } from "@/generators/utils/openapi.utils"; import { getBodyZodSchemaName, getZodSchemaOperationName } from "@/generators/utils/zod-schema.utils"; +import { resolveEndpointZodSchema } from "./resolveEndpointZodSchema"; export function getEndpointBody({ resolver, @@ -37,31 +35,21 @@ export function getEndpointBody({ return; } - const zodSchema = getZodSchema({ - schema, + const zodSchema = resolveEndpointZodSchema({ resolver, + schema, meta: { isRequired: requestBodyObj.required ?? true }, tag, - }); - - const schemaObject = resolver.resolveObject(schema); - - const zodSchemaName = resolveZodSchemaName({ - schema: schemaObject, - zodSchema, fallbackName: getBodyZodSchemaName(getZodSchemaOperationName(operationName, isUniqueOperationName, tag)), - resolver, - tag, + composeBeforeResolve: false, }); - const zodChain = getZodChain({ schema: schemaObject, meta: zodSchema.meta, options: resolver.options }); - return { endpointParameter: { name: BODY_PARAMETER_NAME, type: "Body", description: requestBodyObj.description, - zodSchema: zodSchemaName + zodChain, + zodSchema, bodyObject: requestBodyObj, }, requestFormat: matchingMediaType, diff --git a/src/generators/core/endpoints/getEndpointParameter.ts b/src/generators/core/endpoints/getEndpointParameter.ts index ae670c5..be0a4f0 100644 --- a/src/generators/core/endpoints/getEndpointParameter.ts +++ b/src/generators/core/endpoints/getEndpointParameter.ts @@ -3,9 +3,7 @@ import { match } from "ts-pattern"; import { ALLOWED_PATH_IN } from "@/generators/const/openapi.const"; import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { getZodChain } from "@/generators/core/zod/getZodChain"; -import { getEnumZodSchemaCodeFromEnumNames, getZodSchema } from "@/generators/core/zod/getZodSchema"; -import { resolveZodSchemaName } from "@/generators/core/zod/resolveZodSchemaName"; +import { getEnumZodSchemaCodeFromEnumNames } from "@/generators/core/zod/getZodSchema"; import { EndpointParameter } from "@/generators/types/endpoint"; import { ParameterObject } from "@/generators/types/openapi"; import { @@ -18,6 +16,7 @@ import { getParamZodSchemaName, getZodSchemaOperationName, } from "@/generators/utils/zod-schema.utils"; +import { resolveEndpointZodSchema } from "./resolveEndpointZodSchema"; export function getEndpointParameter({ resolver, @@ -80,23 +79,13 @@ export function getEndpointParameter({ parameterSortingEnumSchemaName = enumZodSchemaName; } - const zodSchema = getZodSchema({ - schema, + const zodSchemaName = resolveEndpointZodSchema({ resolver, + schema, meta: { isRequired: paramObj.in === "path" ? true : (paramObj.required ?? false) }, tag, - }); - - const schemaObject = resolver.resolveObject(schema); - - const zodChain = getZodChain({ schema: schemaObject, meta: zodSchema.meta, options: resolver.options }); - - const zodSchemaName = resolveZodSchemaName({ - schema: schemaObject, - zodSchema: zodSchema.assign(zodSchema.getCodeString(tag) + zodChain), fallbackName, - resolver, - tag, + composeBeforeResolve: true, }); return { diff --git a/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts b/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts index 28f116e..ffcf67a 100644 --- a/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts +++ b/src/generators/core/endpoints/getEndpointsFromOpenAPIDoc.ts @@ -1,27 +1,14 @@ import { OpenAPIV3 } from "openapi-types"; import { JSON_APPLICATION_FORMAT } from "@/generators/const/endpoints.const"; -import { ALLOWED_METHODS } from "@/generators/const/openapi.const"; import { HttpStatusCode } from "@/generators/const/validation.const"; import { STRING_SCHEMA, VOID_SCHEMA } from "@/generators/const/zod.const"; -import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { getZodChain } from "@/generators/core/zod/getZodChain"; -import { getZodSchema } from "@/generators/core/zod/getZodSchema"; -import { resolveZodSchemaName } from "@/generators/core/zod/resolveZodSchemaName"; +import { Profiler } from "@/helpers/profile.helper"; import { Endpoint, EndpointParameter } from "@/generators/types/endpoint"; -import { OperationObject } from "@/generators/types/openapi"; import { invalidVariableNameCharactersToCamel } from "@/generators/utils/js.utils"; -import { pick } from "@/generators/utils/object.utils"; import { isReferenceObject } from "@/generators/utils/openapi-schema.utils"; -import { - isErrorStatus, - isMainResponseStatus, - isMediaTypeAllowed, - isPathExcluded, - replaceHyphenatedPath, -} from "@/generators/utils/openapi.utils"; -import { getUniqueOperationName, isOperationExcluded } from "@/generators/utils/operation.utils"; -import { formatTag, getOperationTag } from "@/generators/utils/tag.utils"; +import { isErrorStatus, isMainResponseStatus, replaceHyphenatedPath } from "@/generators/utils/openapi.utils"; +import { formatTag } from "@/generators/utils/tag.utils"; import { getInvalidOperationIdError, getInvalidStatusCodeError, @@ -34,183 +21,158 @@ import { getResponseZodSchemaName } from "@/generators/utils/zod-schema.utils"; import { getEndpointAcl } from "./getEndpointAcl"; import { getEndpointBody } from "./getEndpointBody"; import { getEndpointParameter } from "./getEndpointParameter"; +import { resolveEndpointZodSchema } from "./resolveEndpointZodSchema"; +import type { OperationContext, SchemaResolver } from "../SchemaResolver.class"; -export function getEndpointsFromOpenAPIDoc(resolver: SchemaResolver) { +export function getEndpointsFromOpenAPIDoc(resolver: SchemaResolver, profiler?: Profiler) { const endpoints = []; + const p = profiler ?? new Profiler(false); - for (const path in resolver.openApiDoc.paths) { - if (isPathExcluded(path, resolver.options)) { - continue; - } + for (const context of resolver.getOperationContexts()) { + endpoints.push(buildEndpointFromOperationContext(resolver, context, p)); + } + + return endpoints; +} - const pathItemObj = resolver.openApiDoc.paths[path] as OpenAPIV3.PathItemObject; - const pathItem = pick(pathItemObj, ALLOWED_METHODS); - const pathParameters = getParameters(pathItemObj.parameters ?? []); +export function buildEndpointFromOperationContext( + resolver: SchemaResolver, + context: OperationContext, + profiler?: Profiler, +) { + const p = profiler ?? new Profiler(false); + const { path, method, operation, operationName, isUniqueOperationName, tag, parameters, responses } = context; + + const invalidOperationId = + operation.operationId && operation.operationId !== invalidVariableNameCharactersToCamel(operation.operationId); + if (operation.operationId && invalidOperationId) { + resolver.validationErrors.push(getInvalidOperationIdError(operation.operationId)); + } - for (const method in pathItem) { - const operation = pathItem[method as keyof typeof pathItem] as OperationObject | undefined; - if (!operation || isOperationExcluded(operation, resolver.options)) { - continue; - } + const endpoint: Endpoint = { + method, + path: replaceHyphenatedPath(path), + operationName, + description: operation.description, + summary: operation.summary, + tags: operation.tags?.map(formatTag), + requestFormat: JSON_APPLICATION_FORMAT, + parameters: [], + response: "", + errors: [], + responseStatusCodes: [], + mediaUpload: !!operation["x-media-upload"], + mediaDownload: !!operation["x-media-download"], + }; - const invalidOperationId = - operation.operationId && operation.operationId !== invalidVariableNameCharactersToCamel(operation.operationId); - if (operation.operationId && invalidOperationId) { - resolver.validationErrors.push(getInvalidOperationIdError(operation.operationId)); + p.runSync("endpoints.requestBody", () => { + if (operation.requestBody) { + const body = getEndpointBody({ resolver, operation, operationName, isUniqueOperationName, tag }); + if (body) { + endpoint.parameters.push(body.endpointParameter); + endpoint.requestFormat = body.requestFormat; } + } + }); - const parameters = Object.entries({ - ...pathParameters, - ...getParameters(operation.parameters ?? []), - }).map(([, param]) => param); - const operationName = getUniqueOperationName({ - path, - method, - operation, - operationsByTag: resolver.operationsByTag, - options: resolver.options, - }); - const isUniqueOperationName = resolver.operationNames.filter((name) => name === operationName).length <= 1; - const tag = getOperationTag(operation, resolver.options); - const endpoint: Endpoint = { - method: method as OpenAPIV3.HttpMethods, - path: replaceHyphenatedPath(path), + p.runSync("endpoints.params", () => { + for (const param of parameters) { + const endpointParameter = getEndpointParameter({ + resolver, + param, operationName, - description: operation.description, - summary: operation.summary, - tags: operation.tags?.map(formatTag), - requestFormat: JSON_APPLICATION_FORMAT, - parameters: [], - response: "", - errors: [], - responseStatusCodes: [], - mediaUpload: !!operation["x-media-upload"], - mediaDownload: !!operation["x-media-download"], - }; - - if (operation.requestBody) { - const body = getEndpointBody({ resolver, operation, operationName, isUniqueOperationName, tag }); - if (body) { - endpoint.parameters.push(body.endpointParameter); - endpoint.requestFormat = body.requestFormat; + isUniqueOperationName, + tag, + }); + if (endpointParameter) { + endpoint.parameters.push(endpointParameter); + } + } + }); + + p.runSync("endpoints.pathParams", () => { + const missingPathParameters = getMissingPathParameters(endpoint); + missingPathParameters.forEach((pathParam) => { + endpoint.parameters.push(pathParam); + }); + if (missingPathParameters.length > 0) { + resolver.validationErrors.push(getMissingPathParameterError(missingPathParameters, path)); + } + }); + + p.runSync("endpoints.responses", () => { + for (const responseData of responses) { + const { statusCode, responseObj, matchingMediaType, schema } = responseData; + endpoint.responseStatusCodes.push(statusCode); + let responseZodSchema: string | undefined; + if (matchingMediaType) { + endpoint.responseFormat = matchingMediaType; + } else { + responseZodSchema = VOID_SCHEMA; + if (statusCode === "200") { + resolver.validationErrors.push( + getInvalidStatusCodeError({ received: "200", expected: "204" }, operation, endpoint), + ); } } - for (const param of parameters) { - const endpointParameter = getEndpointParameter({ + if (schema) { + responseZodSchema = resolveEndpointZodSchema({ resolver, - param, - operationName, - isUniqueOperationName, + schema, + meta: { isRequired: true }, tag, + fallbackName: isReferenceObject(schema) + ? undefined + : getResponseZodSchemaName({ statusCode, operationName, isUniqueOperationName, tag }), + composeBeforeResolve: false, }); - if (endpointParameter) { - endpoint.parameters.push(endpointParameter); - } } - const missingPathParameters = getMissingPathParameters(endpoint); - missingPathParameters.forEach((pathParam) => { - endpoint.parameters.push(pathParam); - }); - if (missingPathParameters.length > 0) { - resolver.validationErrors.push(getMissingPathParameterError(missingPathParameters, path)); - } - - for (const statusCode in operation.responses) { - endpoint.responseStatusCodes.push(statusCode); - - const responseObj = resolver.resolveObject(operation.responses[statusCode]); - const mediaTypes = Object.keys(responseObj?.content ?? {}); - const matchingMediaType = mediaTypes.find(isMediaTypeAllowed); - - let schema: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject | undefined; - let responseZodSchema: string | undefined; - if (matchingMediaType) { - endpoint.responseFormat = matchingMediaType; - schema = responseObj.content?.[matchingMediaType]?.schema; - } else { - responseZodSchema = VOID_SCHEMA; - if (statusCode === "200") { - resolver.validationErrors.push( - getInvalidStatusCodeError({ received: "200", expected: "204" }, operation, endpoint), - ); - } - } - - if (schema) { - const zodSchema = getZodSchema({ - schema, - resolver, - meta: { isRequired: true }, - tag, + if (responseZodSchema) { + const status = Number(statusCode); + + if (isMainResponseStatus(status) && !endpoint.response) { + endpoint.response = responseZodSchema; + endpoint.responseObject = responseObj; + endpoint.responseDescription = responseObj?.description; + } else if (statusCode !== "default" && isErrorStatus(status)) { + endpoint.errors.push({ + zodSchema: responseZodSchema, + status, + description: responseObj?.description, }); - - const schemaObject = resolver.resolveObject(schema); - - const zodSchemaName = resolveZodSchemaName({ - schema: schemaObject, - zodSchema, - fallbackName: zodSchema.ref - ? undefined - : getResponseZodSchemaName({ statusCode, operationName, isUniqueOperationName, tag }), - resolver, - tag, - }); - - responseZodSchema = - zodSchemaName + getZodChain({ schema: schemaObject, meta: zodSchema.meta, options: resolver.options }); } - - if (responseZodSchema) { - const status = Number(statusCode); - - if (isMainResponseStatus(status) && !endpoint.response) { - endpoint.response = responseZodSchema; - endpoint.responseObject = responseObj; - endpoint.responseDescription = responseObj?.description; - } else if (statusCode !== "default" && isErrorStatus(status)) { - endpoint.errors.push({ - zodSchema: responseZodSchema, - status, - description: responseObj?.description, - }); - } - } - } - - if (!endpoint.response) { - endpoint.response = VOID_SCHEMA; - } - - const mainStatusCodes = Object.keys(operation.responses).map(Number).filter(isMainResponseStatus); - if (mainStatusCodes.length > 1) { - resolver.validationErrors.push( - getMultipleSuccessStatusCodesError(mainStatusCodes.map(String) as HttpStatusCode[], operation, endpoint), - ); } + } + }); - endpoint.acl = getEndpointAcl({ resolver, endpoint, operation }); + if (!endpoint.response) { + endpoint.response = VOID_SCHEMA; + } - if (operation.security?.[0].Authorization && !endpoint.responseStatusCodes.includes("401")) { - resolver.validationErrors.push(getMissingStatusCodeError("401", operation, endpoint)); - } + p.runSync("endpoints.statusValidation", () => { + const mainStatusCodes = Object.keys(operation.responses).map(Number).filter(isMainResponseStatus); + if (mainStatusCodes.length > 1) { + resolver.validationErrors.push( + getMultipleSuccessStatusCodesError(mainStatusCodes.map(String) as HttpStatusCode[], operation, endpoint), + ); + } + }); - if (endpoint.acl?.[0] && !endpoint.responseStatusCodes.includes("403")) { - resolver.validationErrors.push(getMissingStatusCodeError("403", operation, endpoint)); - } + p.runSync("endpoints.acl", () => { + endpoint.acl = getEndpointAcl({ resolver, endpoint, operation }); + }); - endpoints.push(endpoint); - } + if (operation.security?.[0].Authorization && !endpoint.responseStatusCodes.includes("401")) { + resolver.validationErrors.push(getMissingStatusCodeError("401", operation, endpoint)); } - return endpoints; -} + if (endpoint.acl?.[0] && !endpoint.responseStatusCodes.includes("403")) { + resolver.validationErrors.push(getMissingStatusCodeError("403", operation, endpoint)); + } -function getParameters(parameters: NonNullable) { - return Object.fromEntries( - (parameters ?? []).map((param) => [isReferenceObject(param) ? param.$ref : param.name, param] as const), - ); + return endpoint; } function getMissingPathParameters(endpoint: Endpoint): EndpointParameter[] { diff --git a/src/generators/core/endpoints/resolveEndpointZodSchema.ts b/src/generators/core/endpoints/resolveEndpointZodSchema.ts new file mode 100644 index 0000000..7ee32b7 --- /dev/null +++ b/src/generators/core/endpoints/resolveEndpointZodSchema.ts @@ -0,0 +1,92 @@ +import { OpenAPIV3 } from "openapi-types"; + +import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; +import { getZodChain } from "@/generators/core/zod/getZodChain"; +import { getZodSchema } from "@/generators/core/zod/getZodSchema"; +import { resolveZodSchemaName } from "@/generators/core/zod/resolveZodSchemaName"; +import { ZodSchemaMetaData } from "@/generators/core/zod/ZodSchema.class"; +import { isReferenceObject } from "@/generators/utils/openapi-schema.utils"; + +type EndpointZodSchemaCache = { + byObject: WeakMap>; + byRef: Map>; +}; + +const resolverEndpointZodSchemaCache = new WeakMap(); + +function getResolverSchemaCache(resolver: SchemaResolver) { + let schemaCache = resolverEndpointZodSchemaCache.get(resolver); + if (!schemaCache) { + schemaCache = { + byObject: new WeakMap(), + byRef: new Map(), + }; + resolverEndpointZodSchemaCache.set(resolver, schemaCache); + } + return schemaCache; +} + +function getOrCreateSchemaEntries( + schemaCache: EndpointZodSchemaCache, + schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject, +) { + if (isReferenceObject(schema)) { + let entries = schemaCache.byRef.get(schema.$ref); + if (!entries) { + entries = new Map(); + schemaCache.byRef.set(schema.$ref, entries); + } + return entries; + } + + let entries = schemaCache.byObject.get(schema); + if (!entries) { + entries = new Map(); + schemaCache.byObject.set(schema, entries); + } + return entries; +} + +export function resolveEndpointZodSchema({ + resolver, + schema, + meta, + tag, + fallbackName, + composeBeforeResolve, +}: { + resolver: SchemaResolver; + schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject; + meta: ZodSchemaMetaData; + tag: string; + fallbackName?: string; + composeBeforeResolve: boolean; +}) { + const schemaCache = getResolverSchemaCache(resolver); + const entries = getOrCreateSchemaEntries(schemaCache, schema); + const isRefSchema = isReferenceObject(schema); + const normalizedFallbackName = isRefSchema ? "" : (fallbackName ?? ""); + const normalizedTag = isRefSchema ? "" : tag; + const metaKey = `required:${Boolean(meta.isRequired)}|name:${meta.name ?? ""}|parentPartial:${Boolean(meta.isParentPartial)}|fallback:${normalizedFallbackName}|tag:${normalizedTag}|compose:${composeBeforeResolve ? 1 : 0}`; + const cached = entries.get(metaKey); + if (cached) { + return cached; + } + + const zodSchema = getZodSchema({ schema, resolver, meta, tag }); + const schemaObject = resolver.resolveObject(schema); + const zodChain = getZodChain({ schema: schemaObject, meta: zodSchema.meta, options: resolver.options }); + + const resolved = composeBeforeResolve + ? resolveZodSchemaName({ + schema: schemaObject, + zodSchema: zodSchema.assign(zodSchema.getCodeString(tag) + zodChain), + fallbackName, + resolver, + tag, + }) + : `${resolveZodSchemaName({ schema: schemaObject, zodSchema, fallbackName, resolver, tag })}${zodChain}`; + + entries.set(metaKey, resolved); + return resolved; +} diff --git a/src/generators/core/getDataFromOpenAPIDoc.ts b/src/generators/core/getDataFromOpenAPIDoc.ts index c0b6fd4..98c7b19 100644 --- a/src/generators/core/getDataFromOpenAPIDoc.ts +++ b/src/generators/core/getDataFromOpenAPIDoc.ts @@ -1,30 +1,33 @@ import { OpenAPIV3 } from "openapi-types"; - -import { Endpoint } from "@/generators/types/endpoint"; -import { GenerateData } from "@/generators/types/generate"; -import { GenerateOptions } from "@/generators/types/options"; -import { getEndpointTag } from "@/generators/utils/tag.utils"; - +import { Profiler } from "../../helpers/profile.helper"; +import { Endpoint } from "../types/endpoint"; +import { GenerateData } from "../types/generate"; +import { GenerateOptions } from "../types/options"; +import { getEndpointTag } from "../utils/tag.utils"; import { getEndpointsFromOpenAPIDoc } from "./endpoints/getEndpointsFromOpenAPIDoc"; import { SchemaResolver } from "./SchemaResolver.class"; import { getZodSchemasFromOpenAPIDoc } from "./zod/getZodSchemasFromOpenAPIDoc"; import { sortZodSchemasByTopology } from "./zod/sortZodSchemasByTopology"; -export function getDataFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, options: GenerateOptions) { - const resolver = new SchemaResolver(openApiDoc, options); +export function getDataFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, options: GenerateOptions, profiler?: Profiler) { + const p = profiler ?? new Profiler(false); + const resolver = p.runSync("data.resolver.init", () => new SchemaResolver(openApiDoc, options, p)); - const endpoints = getEndpointsFromOpenAPIDoc(resolver); - const zodSchemasFromDocSchemas = getZodSchemasFromOpenAPIDoc(resolver); + const endpoints = p.runSync("data.endpoints.extract", () => getEndpointsFromOpenAPIDoc(resolver, p)); + const zodSchemasFromDocSchemas = p.runSync("data.zod.extract", () => getZodSchemasFromOpenAPIDoc(resolver, p)); let zodSchemas = { ...zodSchemasFromDocSchemas.zodSchemas, ...resolver.getZodSchemas(), ...zodSchemasFromDocSchemas.enumZodSchemas, }; - zodSchemas = sortZodSchemasByTopology(resolver, zodSchemas); + zodSchemas = p.runSync("data.zod.sortTopology", () => sortZodSchemasByTopology(resolver, zodSchemas)); zodSchemas = { ...resolver.getExtractedEnumZodSchemas(), ...zodSchemas }; - return { resolver, data: splitDataByTags({ resolver, endpoints, zodSchemas, options }) }; + return { + resolver, + data: p.runSync("data.splitByTags", () => splitDataByTags({ resolver, endpoints, zodSchemas, options })), + }; } function splitDataByTags({ diff --git a/src/generators/core/zod/getZodChain.ts b/src/generators/core/zod/getZodChain.ts index ce64c2d..a6df93d 100644 --- a/src/generators/core/zod/getZodChain.ts +++ b/src/generators/core/zod/getZodChain.ts @@ -24,11 +24,7 @@ export function getZodChain({ .otherwise(() => void 0); if (typeof schema.description === "string" && schema.description !== "" && options.withDescription) { - if (["\n", "\r", "\r\n"].some((c) => String.prototype.includes.call(schema.description, c))) { - chains.push(`describe(\`${schema.description}\`)`); - } else { - chains.push(`describe("${schema.description}")`); - } + chains.push(`describe(${JSON.stringify(schema.description)})`); } const output = chains diff --git a/src/generators/core/zod/getZodSchemasFromOpenAPIDoc.ts b/src/generators/core/zod/getZodSchemasFromOpenAPIDoc.ts index ef221b7..b8d4017 100644 --- a/src/generators/core/zod/getZodSchemasFromOpenAPIDoc.ts +++ b/src/generators/core/zod/getZodSchemasFromOpenAPIDoc.ts @@ -1,38 +1,44 @@ import { EnumZodSchemaData, SchemaResolver } from "@/generators/core/SchemaResolver.class"; +import { Profiler } from "@/helpers/profile.helper"; import { getZodSchemaName } from "@/generators/utils/zod-schema.utils"; import { getEnumZodSchemaCode, getZodSchema } from "./getZodSchema"; -export function getZodSchemasFromOpenAPIDoc(resolver: SchemaResolver) { +export function getZodSchemasFromOpenAPIDoc(resolver: SchemaResolver, profiler?: Profiler) { + const p = profiler ?? new Profiler(false); const zodSchemas = {} as Record; const enumZodSchemas = {} as Record; - Object.entries(resolver.openApiDoc.components?.schemas ?? {}).forEach(([name, schema]) => { - const schemaData = resolver.getSchemaDataByName(name); - if ( - resolver.options.excludeRedundantZodSchemas && - (!schemaData || (schemaData.deepRefOperations.length === 0 && schemaData.tags.length === 0)) - ) { - return; - } - - const zodSchemaName = getZodSchemaName(name, resolver.options.schemaSuffix); - if (zodSchemas[zodSchemaName]) { - return; - } - - const tag = resolver.getTagByZodSchemaName(zodSchemaName); - const schemaObject = resolver.resolveObject(schema); - if (schemaObject.enum) { - enumZodSchemas[zodSchemaName] = getEnumZodSchemaCode(schemaObject); - } else { - zodSchemas[zodSchemaName] = getZodSchema({ - schema, - resolver, - tag, - }).getCodeString(tag); - } - }); + Object.entries(resolver.openApiDoc.components?.schemas ?? {}).forEach(([name, schema]) => + p.runSync("zod.extract.schemaEntry", () => { + const schemaData = resolver.getSchemaDataByName(name); + if ( + resolver.options.excludeRedundantZodSchemas && + (!schemaData || (schemaData.deepRefOperations.length === 0 && schemaData.tags.length === 0)) + ) { + return; + } + + const zodSchemaName = getZodSchemaName(name, resolver.options.schemaSuffix); + if (zodSchemas[zodSchemaName]) { + return; + } + + const tag = resolver.getTagByZodSchemaName(zodSchemaName); + const schemaObject = resolver.resolveObject(schema); + if (schemaObject.enum) { + enumZodSchemas[zodSchemaName] = getEnumZodSchemaCode(schemaObject); + } else { + zodSchemas[zodSchemaName] = p.runSync("zod.extract.schemaToCode", () => + getZodSchema({ + schema, + resolver, + tag, + }).getCodeString(tag), + ); + } + }), + ); return { zodSchemas, enumZodSchemas }; } diff --git a/src/generators/core/zod/resolveZodSchemaName.ts b/src/generators/core/zod/resolveZodSchemaName.ts index 9f201c2..b6f1b84 100644 --- a/src/generators/core/zod/resolveZodSchemaName.ts +++ b/src/generators/core/zod/resolveZodSchemaName.ts @@ -7,6 +7,8 @@ import { getZodSchemaName, isNamedZodSchema } from "@/generators/utils/zod-schem import { ZodSchema } from "./ZodSchema.class"; +const resolverResolveZodSchemaNameCache = new WeakMap>(); + export function resolveZodSchemaName({ schema, zodSchema, @@ -21,6 +23,16 @@ export function resolveZodSchemaName({ tag: string; }): string { const result = zodSchema.getCodeString(); + const cacheKey = `${zodSchema.ref ?? ""}|${fallbackName ?? ""}|${tag}|${zodSchema.complexity}|${result}`; + let cacheForResolver = resolverResolveZodSchemaNameCache.get(resolver); + if (!cacheForResolver) { + cacheForResolver = new Map(); + resolverResolveZodSchemaNameCache.set(resolver, cacheForResolver); + } + const cachedName = cacheForResolver.get(cacheKey); + if (cachedName) { + return cachedName; + } if ((!isNamedZodSchema(result) || zodSchema.ref === undefined) && fallbackName) { // result is simple enough that it doesn't need to be assigned to a variable @@ -43,6 +55,7 @@ export function resolveZodSchemaName({ resolver.setZodSchema(zodSchemaName, result, tag); resolver.addZodSchemaForCompositeCode(result, zodSchema, zodSchemaName, schema); + cacheForResolver.set(cacheKey, zodSchemaName); return zodSchemaName; } @@ -57,14 +70,19 @@ export function resolveZodSchemaName({ // ref result is simple enough that it doesn't need to be assigned to a variable if (complexity < COMPLEXITY_THRESHOLD) { - return resolver.getCodeByZodSchemaName(result)!; + const resolvedName = resolver.getCodeByZodSchemaName(result)!; + cacheForResolver.set(cacheKey, resolvedName); + return resolvedName; } + cacheForResolver.set(cacheKey, result); return result; } if (zodSchema.ref) { - return resolver.getZodSchemaNameByRef(zodSchema.ref); + const resolvedRefName = resolver.getZodSchemaNameByRef(zodSchema.ref); + cacheForResolver.set(cacheKey, resolvedRefName); + return resolvedRefName; } throw new Error(`Invalid ref: ${zodSchema.ref}`); diff --git a/src/generators/generate/generateAcl.ts b/src/generators/generate/generateAcl.ts index 967eae2..2e42065 100644 --- a/src/generators/generate/generateAcl.ts +++ b/src/generators/generate/generateAcl.ts @@ -1,7 +1,18 @@ import { ACL_APP_ABILITIES, CASL_ABILITY_BINDING, CASL_ABILITY_IMPORT } from "@/generators/const/acl.const"; +import { Endpoint } from "@/generators/types/endpoint"; import { GenerateType, GenerateTypeParams, Import } from "@/generators/types/generate"; -import { getAclData, getAppAbilitiesType } from "@/generators/utils/generate/generate.acl.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; +import { + getAbilityAction, + getAbilityConditionsTypes, + getAbilityDescription, + getAbilityFunctionName, + getAbilitySubject, + getAbilitySubjectTypes, + getAclData, + getAppAbilitiesType, + hasAbilityConditions, +} from "@/generators/utils/generate/generate.acl.utils"; +import { getInfiniteQueryName, getQueryName } from "@/generators/utils/generate/generate.query.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; export function generateAcl({ resolver, data, tag }: GenerateTypeParams) { @@ -20,15 +31,27 @@ export function generateAcl({ resolver, data, tag }: GenerateTypeParams) { from: CASL_ABILITY_IMPORT.from, }; - const hbsTemplate = getHbsTemplateDelegate(resolver, "acl"); + const lines: string[] = []; + lines.push(renderImport(caslAbilityTupleImport)); + for (const modelsImport of modelsImports) { + lines.push(renderImport(modelsImport)); + } + lines.push(""); + + if (resolver.options.tsNamespaces) { + lines.push(`export namespace ${getNamespaceName({ type: GenerateType.Acl, tag, options: resolver.options })} {`); + } + + for (const endpoint of endpoints) { + lines.push(renderAbilityFunction(endpoint)); + lines.push(""); + } + + if (resolver.options.tsNamespaces) { + lines.push("}"); + } - return hbsTemplate({ - caslAbilityTupleImport, - modelsImports, - includeNamespace: resolver.options.tsNamespaces, - namespace: getNamespaceName({ type: GenerateType.Acl, tag, options: resolver.options }), - endpoints, - }); + return lines.join("\n").trimEnd() + "\n"; } export function generateAppAcl({ resolver, data }: Omit) { @@ -44,14 +67,84 @@ export function generateAppAcl({ resolver, data }: Omit`); + } + } else { + lines.push( + `export type ${ACL_APP_ABILITIES} = ${CASL_ABILITY_BINDING.abilityTuple};`, + ); + } + lines.push(""); + lines.push(`export type AppAbility = PureAbility<${ACL_APP_ABILITIES}>;`); + return lines.join("\n"); +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; +} - return hbsTemplate({ - caslAbilityTupleImport, - modelsImports, - appAbilitiesType, - appAbilities: ACL_APP_ABILITIES, - abilityTuple: CASL_ABILITY_BINDING.abilityTuple, - subjectType: CASL_ABILITY_BINDING.subjectType, - }); +function renderAbilityFunction(endpoint: Endpoint) { + const abilityConditionsTypes = getAbilityConditionsTypes(endpoint) ?? []; + const hasConditions = hasAbilityConditions(endpoint); + const lines: string[] = []; + const abilityQuery = + endpoint.method === "get" + ? endpoint.mediaDownload + ? `\`${getQueryName(endpoint)}\` query or \`${getQueryName(endpoint, true)}\` mutation` + : `\`${getQueryName(endpoint)}\` query` + : `\`${getQueryName(endpoint)}\` mutation`; + lines.push("/**"); + lines.push( + ` * Use for ${abilityQuery} ability. ${hasConditions ? "For global ability, omit the object parameter." : ""}${getAbilityDescription(endpoint) ? "" : ""}`, + ); + if (getAbilityDescription(endpoint)) { + lines.push(` * @description ${getAbilityDescription(endpoint)}`); + } + if (hasConditions) { + for (const propertyType of abilityConditionsTypes) { + lines.push( + ` * @param { ${(propertyType.type ?? "") + (propertyType.zodSchemaName ?? "")} } object.${propertyType.name} ${propertyType.name} from ${propertyType.info}`, + ); + } + } + lines.push(` * @returns { AbilityTuple } An ability tuple indicating the user's ability to use ${abilityQuery}`); + lines.push(" */"); + lines.push(`export const ${getAbilityFunctionName(endpoint)} = (`); + if (hasConditions) { + lines.push( + ` object?: { ${abilityConditionsTypes + .map( + (propertyType) => + `${propertyType.name}${propertyType.required ? "" : "?"}: ${(propertyType.type ?? "") + (propertyType.zodSchemaName ?? "")}, `, + ) + .join("")} } `, + ); + } + lines.push(") => ["); + lines.push(` "${getAbilityAction(endpoint)}",`); + lines.push( + ` ${ + hasConditions + ? `object ? subject("${getAbilitySubject(endpoint)}", object) : "${getAbilitySubject(endpoint)}"` + : `"${getAbilitySubject(endpoint)}"` + }`, + ); + lines.push( + `] as ${CASL_ABILITY_BINDING.abilityTuple}<"${getAbilityAction(endpoint)}", ${getAbilitySubjectTypes(endpoint).join(" | ")}>;`, + ); + return lines.join("\n"); } diff --git a/src/generators/generate/generateAclCheck.ts b/src/generators/generate/generateAclCheck.ts index c41c598..688da2f 100644 --- a/src/generators/generate/generateAclCheck.ts +++ b/src/generators/generate/generateAclCheck.ts @@ -1,47 +1,39 @@ +import { ACL_APP_ABILITIES, ACL_CHECK_HOOK, CASL_ABILITY_BINDING } from "@/generators/const/acl.const"; import { - ACL_APP_ABILITIES, - ACL_CHECK_HOOK, - CASL_ABILITY_BINDING, - CASL_ABILITY_IMPORT, -} from "@/generators/const/acl.const"; -import { ABILITY_CONTEXT, ABILITY_CONTEXT_IMPORT, ERROR_HANDLERS } from "@/generators/const/deps.const"; -import { PACKAGE_IMPORT_PATH } from "@/generators/const/package.const"; + ABILITY_CONTEXT, + ABILITY_CONTEXT_IMPORT, + ERROR_HANDLERS, + ERROR_HANDLING_IMPORT, +} from "@/generators/const/deps.const"; import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { Import } from "@/generators/types/generate"; import { getAppAbilitiesImportPath } from "@/generators/utils/generate/generate.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; export function generateAclCheck(resolver: SchemaResolver) { - const hbsTemplate = getHbsTemplateDelegate(resolver, "acl-check"); + const abilityContextImportPath = resolver.options.abilityContextImportPath ?? ABILITY_CONTEXT_IMPORT.from; + const appAbilitiesImportPath = getAppAbilitiesImportPath(resolver.options); + const errorHandlingImportPath = resolver.options.errorHandlingImportPath ?? ERROR_HANDLING_IMPORT.from; - const abilityTupleImport: Import = { - bindings: [CASL_ABILITY_BINDING.abilityTuple], - from: CASL_ABILITY_IMPORT.from, - typeOnly: true, - }; + const genericAppAbilities = resolver.options.abilityContextGenericAppAbilities ? `<${ACL_APP_ABILITIES}>` : ""; + return `import { ${CASL_ABILITY_BINDING.abilityTuple} } from "@casl/ability"; +import { type ${ERROR_HANDLERS.ErrorHandler}, ${ERROR_HANDLERS.SharedErrorHandler} } from "${errorHandlingImportPath}"; +import { ${ABILITY_CONTEXT} } from "${abilityContextImportPath}"; +import { useCallback } from "react"; +import { ${ACL_APP_ABILITIES} } from "${appAbilitiesImportPath}"; - const errorHandlingImport: Import = { - bindings: [`type ${ERROR_HANDLERS.ErrorHandler}`, ERROR_HANDLERS.SharedErrorHandler], - from: PACKAGE_IMPORT_PATH, - }; +interface UseAclCheckProps { + errorHandler?: ${ERROR_HANDLERS.ErrorHandler}; +} + +export function ${ACL_CHECK_HOOK}({ errorHandler }: UseAclCheckProps = {}) { + const ability = ${ABILITY_CONTEXT}.useAbility${genericAppAbilities}(); - const appAbilitiesImport: Import = { - bindings: [ACL_APP_ABILITIES], - from: getAppAbilitiesImportPath(resolver.options), - typeOnly: true, - }; + const checkAcl = useCallback((appAbility: ${ACL_APP_ABILITIES}) => { + if (!ability.can(...(appAbility as ${CASL_ABILITY_BINDING.abilityTuple}))) { + (errorHandler ?? ${ERROR_HANDLERS.SharedErrorHandler}).rethrowError(new Error("ACL check failed")); + } + }, [ability, errorHandler]); - return hbsTemplate({ - abilityTupleImport, - appAbilitiesImport, - errorHandlingImport, - abilityContextImport: ABILITY_CONTEXT_IMPORT, - abilityContext: ABILITY_CONTEXT, - appAbilities: ACL_APP_ABILITIES, - abilityTuple: CASL_ABILITY_BINDING.abilityTuple, - errorHandler: ERROR_HANDLERS.ErrorHandler, - sharedErrorHandler: ERROR_HANDLERS.SharedErrorHandler, - aclCheckHook: ACL_CHECK_HOOK, - hasGenericAppAbilities: resolver.options.abilityContextGenericAppAbilities, - }); + return { checkAcl }; +} +`; } diff --git a/src/generators/generate/generateAppRestClient.ts b/src/generators/generate/generateAppRestClient.ts index 219af99..f9b3134 100644 --- a/src/generators/generate/generateAppRestClient.ts +++ b/src/generators/generate/generateAppRestClient.ts @@ -1,14 +1,14 @@ import { APP_REST_CLIENT_NAME } from "@/generators/const/deps.const"; import { PACKAGE_IMPORT_PATH } from "@/generators/const/package.const"; import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; export function generateAppRestClient(resolver: SchemaResolver) { - const hbsTemplate = getHbsTemplateDelegate(resolver, "app-rest-client"); + return `import { RestClient } from "${PACKAGE_IMPORT_PATH}"; - return hbsTemplate({ - appRestClientName: APP_REST_CLIENT_NAME, - baseUrl: resolver.getBaseUrl(), - restClientImportPath: PACKAGE_IMPORT_PATH, - }); +export const ${APP_REST_CLIENT_NAME} = new RestClient({ + config: { + baseURL: "${resolver.getBaseUrl()}" + }, +}); +`; } diff --git a/src/generators/generate/generateConfigs.ts b/src/generators/generate/generateConfigs.ts index 756fd31..088b041 100644 --- a/src/generators/generate/generateConfigs.ts +++ b/src/generators/generate/generateConfigs.ts @@ -1,8 +1,8 @@ import { BUILDERS_UTILS } from "@/generators/const/deps.const"; import { ZOD_IMPORT } from "@/generators/const/zod.const"; +import { BuilderConfig, DynamicColumnsConfig, DynamicInputsConfig } from "@/generators/types/builder-config"; import { GenerateType, GenerateTypeParams, Import } from "@/generators/types/generate"; import { getBuilderConfigs } from "@/generators/utils/generate/generate.configs.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; export function generateConfigs(generateTypeParams: GenerateTypeParams) { @@ -27,22 +27,161 @@ export function generateConfigs(generateTypeParams: GenerateTypeParams) { from: resolver.options.dynamicColumnsImportPath, }; - const hbsTemplate = getHbsTemplateDelegate(resolver, "configs"); - - return hbsTemplate({ - hasZodImport, - zodImport: ZOD_IMPORT, - hasDynamicInputsImport, - dynamicInputsImport, - hasDynamicColumnsImport, - dynamicColumnsImport, - modelsImports, - queriesImports, - aclImports, - includeNamespace: resolver.options.tsNamespaces, - namespace: getNamespaceName({ type: GenerateType.Configs, tag, options: resolver.options }), - configs, - dynamicInputs: BUILDERS_UTILS.dynamicInputs, - dynamicColumns: BUILDERS_UTILS.dynamicColumns, - }); + const lines: string[] = []; + if (hasZodImport) { + lines.push(renderImport(ZOD_IMPORT)); + } + if (hasDynamicInputsImport) { + lines.push(renderImport(dynamicInputsImport)); + } + if (hasDynamicColumnsImport) { + lines.push(renderImport(dynamicColumnsImport)); + } + for (const modelsImport of modelsImports) { + lines.push(renderImport(modelsImport)); + } + for (const queriesImport of queriesImports) { + lines.push(renderImport(queriesImport)); + } + for (const aclImport of aclImports) { + lines.push(renderImport(aclImport)); + } + lines.push(""); + + if (resolver.options.tsNamespaces) { + lines.push( + `export namespace ${getNamespaceName({ type: GenerateType.Configs, tag, options: resolver.options })} {`, + ); + } + + for (const config of configs) { + lines.push(renderBuilderConfig(config)); + lines.push(""); + } + + if (resolver.options.tsNamespaces) { + lines.push("}"); + } + + return lines.join("\n").trimEnd() + "\n"; +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; +} + +function renderInputsConfig(inputsConfig: DynamicInputsConfig) { + const lines: string[] = []; + lines.push("{"); + lines.push(` schema: ${inputsConfig.schema},`); + lines.push(" options: {"); + lines.push(" inputs: {"); + for (const key of Object.keys(inputsConfig.options.inputs)) { + lines.push(` ${key}: true,`); + } + lines.push(" },"); + lines.push(" },"); + lines.push("}"); + return lines.join("\n"); +} + +function renderColumnsConfig(columnsConfig: DynamicColumnsConfig) { + const lines: string[] = []; + lines.push("{"); + lines.push(` schema: ${columnsConfig.schema},`); + lines.push(" options: {"); + lines.push(" columns: {"); + for (const key of Object.keys(columnsConfig.options.columns)) { + lines.push(` ${key}: true,`); + } + lines.push(" },"); + if (columnsConfig.options.sortable) { + lines.push(` sortable: ${columnsConfig.options.sortable},`); + } + lines.push(" },"); + lines.push("}"); + return lines.join("\n"); +} + +function renderBuilderConfig(config: BuilderConfig) { + const lines: string[] = []; + lines.push(`export const ${config.name} = {`); + lines.push(" meta: {"); + lines.push(` title: "${config.title}",`); + lines.push(" },"); + lines.push(" readAll: {"); + if (config.readAll.acl) { + lines.push(` acl: ${config.readAll.acl},`); + } + lines.push(` schema: ${config.readAll.columns.schema},`); + lines.push(` paginated: ${config.readAll.paginated},`); + if (config.readAll.infinite) { + lines.push(` infinite: ${config.readAll.infinite},`); + } + if (config.readAll.filters) { + lines.push(" filters: {"); + lines.push(` schema: ${config.readAll.filters.schema},`); + lines.push( + ` filterDefs: ${BUILDERS_UTILS.dynamicInputs}(${renderInputsConfig(config.readAll.filters)})`, + ); + lines.push(" },"); + } + lines.push(` columns: ${BUILDERS_UTILS.dynamicColumns}(${renderColumnsConfig(config.readAll.columns)}),`); + lines.push(" },"); + + if (config.read) { + lines.push(" read: {"); + if (config.read.acl) { + lines.push(` acl: ${config.read.acl},`); + } + lines.push(` schema: ${config.read.schema},`); + lines.push(` query: ${config.read.query},`); + lines.push(" },"); + } + + if (config.create) { + lines.push(" create: {"); + if (config.create.acl) { + lines.push(` acl: ${config.create.acl},`); + } + if (config.create.inputDefs) { + lines.push(` schema: ${config.create.inputDefs.schema},`); + } + lines.push(` mutation: ${config.create.mutation},`); + if (config.create.inputDefs) { + lines.push(` inputDefs: ${BUILDERS_UTILS.dynamicInputs}(${renderInputsConfig(config.create.inputDefs)})`); + } + lines.push(" },"); + } + + if (config.update) { + lines.push(" update: {"); + if (config.update.acl) { + lines.push(` acl: ${config.update.acl},`); + } + if (config.update.inputDefs) { + lines.push(` schema: ${config.update.inputDefs.schema},`); + } + lines.push(` mutation: ${config.update.mutation},`); + if (config.update.inputDefs) { + lines.push(` inputDefs: ${BUILDERS_UTILS.dynamicInputs}(${renderInputsConfig(config.update.inputDefs)})`); + } + lines.push(" },"); + } + + if (config.delete) { + lines.push(" delete: {"); + if (config.delete.acl) { + lines.push(` acl: ${config.delete.acl},`); + } + lines.push(` mutation: ${config.delete.mutation},`); + lines.push(" },"); + } + + lines.push("};"); + return lines.join("\n"); } diff --git a/src/generators/generate/generateEndpoints.ts b/src/generators/generate/generateEndpoints.ts index 33db6cf..1b3d320 100644 --- a/src/generators/generate/generateEndpoints.ts +++ b/src/generators/generate/generateEndpoints.ts @@ -1,12 +1,21 @@ import { APP_REST_CLIENT_NAME, ZOD_EXTENDED } from "@/generators/const/deps.const"; import { AXIOS_IMPORT, AXIOS_REQUEST_CONFIG_NAME, AXIOS_REQUEST_CONFIG_TYPE } from "@/generators/const/endpoints.const"; import { ZOD_IMPORT } from "@/generators/const/zod.const"; -import { EndpointParameter } from "@/generators/types/endpoint"; +import { Endpoint, EndpointParameter } from "@/generators/types/endpoint"; import { GenerateType, GenerateTypeParams, Import } from "@/generators/types/generate"; import { getUniqueArray } from "@/generators/utils/array.utils"; import { getModelsImports } from "@/generators/utils/generate/generate.imports.utils"; +import { + getEndpointBody, + getEndpointConfig, + getEndpointName, + getEndpointPath, + hasEndpointConfig, + mapEndpointParamsToFunctionParams, + requiresBody, +} from "@/generators/utils/generate/generate.endpoints.utils"; import { getAppRestClientImportPath, getZodExtendedImportPath } from "@/generators/utils/generate/generate.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; +import { getImportedZodSchemaName } from "@/generators/utils/generate/generate.zod.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; import { isNamedZodSchema } from "@/generators/utils/zod-schema.utils"; @@ -30,7 +39,7 @@ export function generateEndpoints({ resolver, data, tag }: GenerateTypeParams) { const generateParse = resolver.options.parseRequestParams; - const endpointParams = endpoints.reduce((prev, curr) => [...prev, ...curr.parameters], [] as EndpointParameter[]); + const endpointParams = endpoints.flatMap((endpoint) => endpoint.parameters) as EndpointParameter[]; const endpointParamsParseSchemas = endpointParams .filter((param) => !["Path", "Header"].includes(param.type)) .map((param) => param.parameterSortingEnumSchemaName ?? param.zodSchema); @@ -52,24 +61,143 @@ export function generateEndpoints({ resolver, data, tag }: GenerateTypeParams) { zodSchemasAsTypes: getUniqueArray(endpointParams.map((param) => param.zodSchema).filter(isNamedZodSchema)), }); - const hbsTemplate = getHbsTemplateDelegate(resolver, "endpoints"); - - return hbsTemplate({ - appRestClientImport, - hasAxiosImport, - axiosImport, - hasZodImport, - zodImport: ZOD_IMPORT, - hasZodExtendedImport, - zodExtendedImport, - modelsImports, - includeNamespace: resolver.options.tsNamespaces, - namespace: getNamespaceName({ type: GenerateType.Endpoints, tag, options: resolver.options }), - restClientName: APP_REST_CLIENT_NAME, - hasAxiosRequestConfig, - axiosRequestConfigName: AXIOS_REQUEST_CONFIG_NAME, - axiosRequestConfigType: AXIOS_REQUEST_CONFIG_TYPE, - endpoints, - generateParse, - }); + const lines: string[] = []; + lines.push(renderImport(appRestClientImport)); + if (hasAxiosImport) { + lines.push(renderImport(axiosImport)); + } + if (hasZodImport) { + lines.push(renderImport(ZOD_IMPORT)); + } + if (hasZodExtendedImport) { + lines.push(renderImport(zodExtendedImport)); + } + for (const modelsImport of modelsImports) { + lines.push(renderImport(modelsImport)); + } + lines.push(""); + + if (resolver.options.tsNamespaces) { + lines.push( + `export namespace ${getNamespaceName({ type: GenerateType.Endpoints, tag, options: resolver.options })} {`, + ); + } + + for (const endpoint of endpoints) { + const endpointParams = renderEndpointParams(resolver, endpoint, {}); + const endpointArgs = renderEndpointArgs(resolver, endpoint, {}); + const endpointBody = getEndpointBody(endpoint); + const hasUndefinedEndpointBody = requiresBody(endpoint) && !endpointBody && hasEndpointConfig(endpoint, resolver); + const endpointConfig = renderEndpointConfig(resolver, endpoint); + + lines.push( + `export const ${getEndpointName(endpoint)} = (${endpointParams}${hasAxiosRequestConfig ? `${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + ); + lines.push(` return ${APP_REST_CLIENT_NAME}.${endpoint.method}(`); + lines.push(` { resSchema: ${getImportedZodSchemaName(resolver, endpoint.response)} },`); + lines.push(` \`${getEndpointPath(endpoint)}\`,`); + + if (endpointBody) { + lines.push( + ` ${generateParse ? renderEndpointParamParse(resolver, endpointBody, endpointBody.name) : endpointBody.name},`, + ); + } else if (hasUndefinedEndpointBody) { + lines.push(" undefined,"); + } + + lines.push(` ${endpointConfig}`); + lines.push(" )"); + lines.push("};"); + } + + if (resolver.options.tsNamespaces) { + lines.push("}"); + } + + return lines.join("\n").trimEnd() + "\n"; +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; +} + +function renderEndpointParams( + resolver: GenerateTypeParams["resolver"], + endpoint: Parameters[1], + options: Parameters[2], +) { + return mapEndpointParamsToFunctionParams(resolver, endpoint, options) + .map((param) => `${param.name}${param.required ? "" : "?"}: ${param.type}, `) + .join(""); +} + +function renderEndpointArgs( + resolver: GenerateTypeParams["resolver"], + endpoint: Parameters[1], + options: Parameters[2], +) { + return mapEndpointParamsToFunctionParams(resolver, endpoint, options) + .map((param) => param.name) + .join(", "); +} + +function renderEndpointParamParse( + resolver: GenerateTypeParams["resolver"], + param: EndpointParameter, + paramName: string, +) { + const addOptional = + !(param.parameterObject ?? param.bodyObject)?.required && + (Boolean(param.parameterSortingEnumSchemaName) || isNamedZodSchema(param.zodSchema)); + const schemaValue = param.parameterSortingEnumSchemaName + ? `${ZOD_EXTENDED.namespace}.${ZOD_EXTENDED.exports.sortExp}(${getImportedZodSchemaName( + resolver, + param.parameterSortingEnumSchemaName, + )})${addOptional ? ".optional()" : ""}` + : `${getImportedZodSchemaName(resolver, param.zodSchema)}${addOptional ? ".optional()" : ""}`; + const queryArgs = param.type === "Query" ? `, { type: "query", name: "${paramName}" }` : ""; + return `${ZOD_EXTENDED.namespace}.${ZOD_EXTENDED.exports.parse}(${schemaValue}, ${paramName}${queryArgs})`; +} + +function renderEndpointConfig(resolver: GenerateTypeParams["resolver"], endpoint: Endpoint) { + const endpointConfig = getEndpointConfig(endpoint); + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + if (Object.keys(endpointConfig).length === 0) { + return hasAxiosRequestConfig ? AXIOS_REQUEST_CONFIG_NAME : ""; + } + + const lines: string[] = []; + lines.push("{"); + if (hasAxiosRequestConfig) { + lines.push(` ...${AXIOS_REQUEST_CONFIG_NAME},`); + } + if (endpointConfig.params) { + lines.push(" params: {"); + for (const param of endpointConfig.params) { + const value = resolver.options.parseRequestParams + ? renderEndpointParamParse(resolver, param, param.value) + : param.value; + lines.push(` ${param.name}: ${value},`); + } + lines.push(" },"); + } + if (endpointConfig.headers) { + lines.push(" headers: {"); + for (const [key, value] of Object.entries(endpointConfig.headers)) { + lines.push(` '${key}': ${value},`); + } + lines.push(" },"); + } + if (endpoint.response === "z.instanceof(Blob)") { + lines.push(' responseType: "blob",'); + } + if (endpoint.mediaDownload) { + lines.push(" rawResponse: true,"); + } + lines.push("}"); + return lines.join("\n "); } diff --git a/src/generators/generate/generateModels.ts b/src/generators/generate/generateModels.ts index 92f1862..68879d5 100644 --- a/src/generators/generate/generateModels.ts +++ b/src/generators/generate/generateModels.ts @@ -1,8 +1,13 @@ import { ZOD_IMPORT } from "@/generators/const/zod.const"; import { getZodSchemaRefs } from "@/generators/core/zod/getZodSchemaRefs"; -import { GenerateType, GenerateTypeParams, GenerateZodSchemaData } from "@/generators/types/generate"; +import { GenerateType, GenerateTypeParams, GenerateZodSchemaData, Import } from "@/generators/types/generate"; import { getModelsImports } from "@/generators/utils/generate/generate.imports.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; +import { + getZodSchemaDescription, + getZodSchemaInferedTypeName, + getZodSchemaPropertyDescriptions, + getZodSchemaType, +} from "@/generators/utils/generate/generate.zod.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; import { isEnumZodSchema } from "@/generators/utils/zod-schema.utils"; @@ -12,9 +17,15 @@ export function generateModels({ resolver, data, tag }: GenerateTypeParams) { return; } - const refZodSchemas = Object.keys(zodSchemas) - .reduce((acc, zodSchema) => [...acc, ...getZodSchemaRefs(resolver, zodSchema)], [] as string[]) - .filter((zodSchema) => !zodSchemas[zodSchema]); + const refZodSchemas = [] as string[]; + for (const zodSchema of Object.keys(zodSchemas)) { + const refs = getZodSchemaRefs(resolver, zodSchema); + for (const ref of refs) { + if (!zodSchemas[ref]) { + refZodSchemas.push(ref); + } + } + } const modelsImports = getModelsImports({ resolver, @@ -22,29 +33,78 @@ export function generateModels({ resolver, data, tag }: GenerateTypeParams) { zodSchemas: refZodSchemas, }); - const zodSchemasData: Record = Object.entries(zodSchemas).reduce( - (acc, [key, code]) => { - const schemaObj = resolver.getZodSchemaObj(key); + const zodSchemasData: Record = {}; + for (const [key, code] of Object.entries(zodSchemas)) { + const schemaRef = resolver.getRefByZodSchemaName(key); + zodSchemasData[key] = { + code, + isCiruclar: schemaRef ? resolver.isSchemaCircular(schemaRef) : false, + isEnum: isEnumZodSchema(code), + schemaObj: resolver.getZodSchemaObj(key), + }; + } - const value = { - code, - isEnum: isEnumZodSchema(code), - schemaObj, - }; + const lines: string[] = []; + lines.push(renderImport(ZOD_IMPORT)); + for (const modelsImport of modelsImports) { + lines.push(renderImport(modelsImport)); + } + lines.push(""); - return { ...acc, [key]: value }; - }, - {}, - ); + if (resolver.options.tsNamespaces) { + lines.push(`export namespace ${getNamespaceName({ type: GenerateType.Models, tag, options: resolver.options })} {`); + } - const hbsTemplate = getHbsTemplateDelegate(resolver, "models"); + for (const [name, zodSchema] of Object.entries(zodSchemasData)) { + lines.push(renderModelJsDocs({ name, zodSchema, tag, resolver })); + lines.push(`export const ${name} = ${zodSchema.code};`); + lines.push(`export type ${getZodSchemaInferedTypeName(name, resolver.options)} = z.infer;`); + if (zodSchema.isEnum) { + lines.push(`export const ${getZodSchemaInferedTypeName(name, resolver.options)} = ${name}.enum;`); + } + lines.push(""); + } - return hbsTemplate({ - zodImport: ZOD_IMPORT, - modelsImports, - includeNamespace: resolver.options.tsNamespaces, - namespace: getNamespaceName({ type: GenerateType.Models, tag, options: resolver.options }), - tag, - zodSchemasData, - }); + if (resolver.options.tsNamespaces) { + lines.push("}"); + } + + return lines.join("\n").trimEnd() + "\n"; +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; +} + +function renderModelJsDocs({ + name, + zodSchema, + tag, + resolver, +}: { + name: string; + zodSchema: GenerateZodSchemaData; + tag: string; + resolver: GenerateTypeParams["resolver"]; +}) { + const lines = [`/** `, ` * ${name} `, ` * @type { ${getZodSchemaType(zodSchema)} }`]; + + const description = getZodSchemaDescription(zodSchema); + if (description) { + lines.push(` * @description ${description.replace(/\n/g, "\n *")}`); + } + + const propertyDescriptions = getZodSchemaPropertyDescriptions(resolver, zodSchema, tag); + if (propertyDescriptions) { + for (const [property, info] of Object.entries(propertyDescriptions)) { + lines.push(` * @property { ${info.type} } ${property} ${info.description.replace(/\n/g, "\n *")} `); + } + } + + lines.push(" */"); + return lines.join("\n"); } diff --git a/src/generators/generate/generateQueries.ts b/src/generators/generate/generateQueries.ts index 1c64619..360eaf4 100644 --- a/src/generators/generate/generateQueries.ts +++ b/src/generators/generate/generateQueries.ts @@ -1,30 +1,59 @@ import { ACL_CHECK_HOOK } from "@/generators/const/acl.const"; import { MUTATION_EFFECTS, QUERY_MODULE_ENUM, QUERY_OPTIONS_TYPES } from "@/generators/const/deps.const"; -import { AXIOS_DEFAULT_IMPORT_NAME, AXIOS_IMPORT, AXIOS_REQUEST_CONFIG_TYPE } from "@/generators/const/endpoints.const"; +import { + AXIOS_DEFAULT_IMPORT_NAME, + AXIOS_IMPORT, + AXIOS_REQUEST_CONFIG_NAME, + AXIOS_REQUEST_CONFIG_TYPE, +} from "@/generators/const/endpoints.const"; import { QUERIES_MODULE_NAME, QUERY_HOOKS, QUERY_IMPORT } from "@/generators/const/queries.const"; -import { EndpointParameter } from "@/generators/types/endpoint"; +import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; +import { Endpoint, EndpointParameter } from "@/generators/types/endpoint"; import { GenerateType, GenerateTypeParams, Import } from "@/generators/types/generate"; import { getUniqueArray } from "@/generators/utils/array.utils"; +import { + getAbilityConditionsTypes, + getAbilityFunctionName, + getImportedAbilityFunctionName, + hasAbilityConditions, +} from "@/generators/utils/generate/generate.acl.utils"; +import { + getEndpointName, + getImportedEndpointName, + mapEndpointParamsToFunctionParams, +} from "@/generators/utils/generate/generate.endpoints.utils"; +import { getSchemaDescriptions } from "@/generators/utils/generate/generate.openapi.utils"; import { getAclImports, getEndpointsImports, getModelsImports, } from "@/generators/utils/generate/generate.imports.utils"; +import { getInfiniteQueryName, getQueryName } from "@/generators/utils/generate/generate.query.utils"; import { getAclCheckImportPath, getMutationEffectsImportPath, getQueryModulesImportPath, + getQueryTypesImportPath, } from "@/generators/utils/generate/generate.utils"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; +import { getImportedZodSchemaInferedTypeName } from "@/generators/utils/generate/generate.zod.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; -import { isInfiniteQuery, isMutation, isQuery } from "@/generators/utils/query.utils"; +import { isSchemaObject } from "@/generators/utils/openapi-schema.utils"; +import { isParamMediaTypeAllowed } from "@/generators/utils/openapi.utils"; +import { getDestructuredVariables, isInfiniteQuery, isMutation, isQuery } from "@/generators/utils/query.utils"; import { isNamedZodSchema } from "@/generators/utils/zod-schema.utils"; -export function generateQueries({ resolver, data, tag }: GenerateTypeParams) { +const endpointParamMappingCache = new WeakMap< + SchemaResolver, + WeakMap>> +>(); + +export function generateQueries(params: GenerateTypeParams) { + const { resolver, data, tag } = params; const endpoints = data.get(tag)?.endpoints; if (!endpoints || endpoints.length === 0) { return; } + const endpointGroups = groupEndpoints(endpoints, resolver); const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; const hasAxiosDefaultImport = endpoints.some(({ mediaUpload }) => mediaUpload); @@ -35,9 +64,7 @@ export function generateQueries({ resolver, data, tag }: GenerateTypeParams) { from: AXIOS_IMPORT.from, }; - const queryEndpoints = endpoints.filter(isQuery); - const infiniteQueryEndpoints = queryEndpoints.filter((endpoint) => isInfiniteQuery(endpoint, resolver.options)); - const mutationEndpoints = endpoints.filter(isMutation); + const { queryEndpoints, infiniteQueryEndpoints, mutationEndpoints, aclEndpoints } = endpointGroups; const queryImport: Import = { bindings: [ @@ -56,11 +83,10 @@ export function generateQueries({ resolver, data, tag }: GenerateTypeParams) { const hasMutationEffectsImport = hasMutationEffects && mutationEndpoints.length > 0; const mutationEffectsImport: Import = { - bindings: mutationEndpoints.length > 0 ? [MUTATION_EFFECTS.optionsType, MUTATION_EFFECTS.hookName] : [], + bindings: [...(mutationEndpoints.length > 0 ? [MUTATION_EFFECTS.optionsType, MUTATION_EFFECTS.hookName] : [])], from: getMutationEffectsImportPath(resolver.options), }; - const aclEndpoints = endpoints.filter((endpoint) => endpoint.acl); const hasAclCheck = resolver.options.checkAcl && aclEndpoints.length > 0; const aclCheckImport: Import = { bindings: [ACL_CHECK_HOOK], @@ -75,10 +101,10 @@ export function generateQueries({ resolver, data, tag }: GenerateTypeParams) { : []), ...(mutationEndpoints.length > 0 ? [QUERY_OPTIONS_TYPES.mutation] : []), ], - from: resolver.options.queryTypesImportPath, + from: getQueryTypesImportPath(resolver.options), }; - const endpointParams = endpoints.reduce((prev, curr) => [...prev, ...curr.parameters], [] as EndpointParameter[]); + const endpointParams = endpoints.flatMap((endpoint) => endpoint.parameters) as EndpointParameter[]; const modelsImports = getModelsImports({ resolver, tag, @@ -97,28 +123,537 @@ export function generateQueries({ resolver, data, tag }: GenerateTypeParams) { options: resolver.options, }); - const hbsTemplate = getHbsTemplateDelegate(resolver, "queries"); - - return hbsTemplate({ - hasAxiosImport, - axiosImport, - queryImport, - hasMutationEffects, - queryModulesImport, - hasMutationEffectsImport, - mutationEffectsImport, - hasAclCheck, - aclCheckImport, - queryTypesImport, - modelsImports, - endpointsImports, - aclImports, - includeNamespace: resolver.options.tsNamespaces, - tag, - namespace: getNamespaceName({ type: GenerateType.Queries, tag, options: resolver.options }), - queriesModuleName: QUERIES_MODULE_NAME, - queryModuleEnum: QUERY_MODULE_ENUM, - endpoints, - queryEndpoints, + const namespace = getNamespaceName({ type: GenerateType.Queries, tag, options: resolver.options }); + const lines: string[] = []; + + if (hasAxiosImport) { + lines.push(renderImport(axiosImport)); + } + lines.push(renderImport(queryImport)); + if (hasMutationEffects) { + lines.push(renderImport(queryModulesImport)); + } + if (hasMutationEffectsImport) { + lines.push(renderImport(mutationEffectsImport)); + } + if (hasAclCheck) { + lines.push(renderImport(aclCheckImport)); + for (const aclImport of aclImports) { + lines.push(renderImport(aclImport)); + } + } + lines.push(renderImport(queryTypesImport)); + for (const modelsImport of modelsImports) { + lines.push(renderImport(modelsImport)); + } + for (const endpointsImport of endpointsImports) { + lines.push(renderImport(endpointsImport)); + } + lines.push(""); + + if (resolver.options.tsNamespaces) { + lines.push(`export namespace ${namespace} {`); + } + + lines.push( + `export const ${QUERIES_MODULE_NAME} = ${hasMutationEffects ? `${QUERY_MODULE_ENUM}.${tag}` : `"${namespace}"`};`, + ); + lines.push(""); + + lines.push(renderQueryKeys({ resolver, queryEndpoints })); + lines.push(""); + + for (const endpoint of endpoints) { + const endpointInfo = endpointGroups.infoByEndpoint.get(endpoint); + if (endpointInfo?.query) { + lines.push(renderQuery({ resolver, endpoint })); + lines.push(""); + } + if (endpointInfo?.mutation) { + lines.push( + renderMutation({ + resolver, + endpoint, + precomputed: endpointGroups.mutationDataByEndpoint.get(endpoint), + }), + ); + lines.push(""); + } + if (endpointInfo?.infiniteQuery) { + lines.push(renderInfiniteQuery({ resolver, endpoint })); + lines.push(""); + } + } + + if (resolver.options.tsNamespaces) { + lines.push("}"); + } + + return lines.join("\n").trimEnd() + "\n"; +} + +function getEndpointParamMapping( + resolver: SchemaResolver, + endpoint: Endpoint, + options: Parameters[2], +) { + let resolverCache = endpointParamMappingCache.get(resolver); + if (!resolverCache) { + resolverCache = new WeakMap(); + endpointParamMappingCache.set(resolver, resolverCache); + } + + let endpointCache = resolverCache.get(endpoint); + if (!endpointCache) { + endpointCache = new Map(); + resolverCache.set(endpoint, endpointCache); + } + + const key = JSON.stringify( + Object.entries(options ?? {}) + .sort(([left], [right]) => left.localeCompare(right)) + .map(([optionName, optionValue]) => [optionName, Boolean(optionValue)]), + ); + const cached = endpointCache.get(key); + if (cached) { + return cached; + } + + const computed = mapEndpointParamsToFunctionParams(resolver, endpoint, options); + endpointCache.set(key, computed); + return computed; +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; +} + +function renderEndpointParams( + resolver: SchemaResolver, + endpoint: Endpoint, + options: Parameters[2], +) { + return getEndpointParamMapping(resolver, endpoint, options) + .map((param) => `${param.name}${param.required ? "" : "?"}: ${param.type}`) + .join(", "); +} + +function renderEndpointArgs( + resolver: SchemaResolver, + endpoint: Endpoint, + options: Parameters[2], +) { + return getEndpointParamMapping(resolver, endpoint, options) + .map((param) => param.name) + .join(", "); +} + +function renderEndpointParamDescription(endpointParam: ReturnType[0]) { + const strs = [`${endpointParam.paramType} parameter`]; + const description = endpointParam.parameterObject?.description || endpointParam.bodyObject?.description; + if (description) { + strs.push(description); + } + + let schema: any = undefined; + let mediaTypeObject: any = undefined; + if (endpointParam.parameterObject?.schema && isSchemaObject(endpointParam.parameterObject.schema)) { + schema = endpointParam.parameterObject?.schema; + } + if (endpointParam.bodyObject?.content) { + const mediaTypes = Object.keys(endpointParam.bodyObject.content ?? {}); + const matchingMediaType = mediaTypes.find(isParamMediaTypeAllowed); + if (matchingMediaType) { + mediaTypeObject = endpointParam.bodyObject.content[matchingMediaType]; + if (mediaTypeObject.schema && isSchemaObject(mediaTypeObject.schema)) { + schema = mediaTypeObject.schema; + } + } + } + + if (schema) { + strs.push(...getSchemaDescriptions(schema)); + } + if (mediaTypeObject?.example) { + strs.push(`Example: \`${mediaTypeObject.example}\``); + } + return strs.join(". "); +} + +function renderAclCheckCall(resolver: SchemaResolver, endpoint: Endpoint) { + const checkParams = getAbilityConditionsTypes(endpoint)?.map((condition) => condition.name); + const paramNames = new Set(endpoint.parameters.map((param) => param.name)); + const hasAllCheckParams = checkParams?.every((param) => paramNames.has(param)); + const args = hasAbilityConditions(endpoint) && hasAllCheckParams ? `{ ${(checkParams ?? []).join(", ")} } ` : ""; + return `checkAcl(${getImportedAbilityFunctionName(endpoint, resolver.options)}(${args}));`; +} + +function addAsteriskAfterNewLine(str: string) { + return str.replace(/\n/g, "\n *"); +} + +function renderQueryJsDocs({ + resolver, + endpoint, + mode, +}: { + resolver: SchemaResolver; + endpoint: Endpoint; + mode: "query" | "mutation" | "infiniteQuery"; +}) { + // TODO(perf-migration): parity mismatch vs legacy HBS around infinite-query JSDoc param lines + // for some endpoints; keep experimental renderer opt-in until this is resolved. + const lines: string[] = ["/** "]; + + if (mode === "infiniteQuery") { + lines.push(` * Infinite query \`${getInfiniteQueryName(endpoint)}${endpoint.summary ? "" : ""}`); + } else if (mode === "query") { + lines.push( + ` * Query \`${getQueryName(endpoint)}\`${endpoint.summary && endpoint.mediaDownload ? " - recommended when file should be cached" : ""}`, + ); + } else { + lines.push( + ` * Mutation \`${getQueryName(endpoint, true)}\`${endpoint.summary && endpoint.mediaDownload ? " - recommended when file should not be cached" : ""}`, + ); + } + + if (endpoint.summary) { + lines.push(` * @summary ${addAsteriskAfterNewLine(endpoint.summary)}`); + } + if (endpoint.description) { + lines.push(` * @description ${addAsteriskAfterNewLine(endpoint.description)}`); + } + if (endpoint.acl) { + lines.push(` * @permission Requires \`${getAbilityFunctionName(endpoint)}\` ability `); + } + + const params = getEndpointParamMapping(resolver, endpoint, { + ...(mode !== "infiniteQuery" ? { includeFileParam: true } : {}), }); + for (const endpointParam of params) { + const source = mode === "mutation" ? "mutation" : "object"; + lines.push( + ` * @param { ${endpointParam.type} } ${source}.${endpointParam.name} ${renderEndpointParamDescription(endpointParam)}`, + ); + } + + if (mode === "query") { + lines.push(" * @param { AppQueryOptions } options Query options"); + } else if (mode === "mutation") { + lines.push( + ` * @param { AppMutationOptions${resolver.options.mutationEffects ? ` & ${MUTATION_EFFECTS.optionsType}` : ""} } options Mutation options`, + ); + } else { + lines.push(" * @param { AppInfiniteQueryOptions } options Infinite query options"); + } + + const withAxiosResponse = endpoint.mediaDownload && mode !== "infiniteQuery"; + const resultType = `${withAxiosResponse ? "AxiosResponse<" : ""}${getImportedZodSchemaInferedTypeName( + resolver, + endpoint.response, + )}${withAxiosResponse ? ">" : ""}`; + + if (mode === "query") { + lines.push(` * @returns { UseQueryResult<${resultType}> } ${endpoint.responseDescription ?? ""}`); + } else if (mode === "mutation") { + lines.push(` * @returns { UseMutationResult<${resultType}> } ${endpoint.responseDescription ?? ""}`); + } else { + lines.push(` * @returns { UseInfiniteQueryResult<${resultType}> } ${endpoint.responseDescription ?? ""}`); + } + + lines.push(` * @statusCodes [${endpoint.responseStatusCodes.join(", ")}]`); + lines.push(" */"); + return lines.join("\n"); +} + +function renderQueryKeys({ resolver, queryEndpoints }: { resolver: SchemaResolver; queryEndpoints: Endpoint[] }) { + if (queryEndpoints.length === 0) { + return ""; + } + + const lines: string[] = []; + lines.push("export const keys = {"); + lines.push(` all: [${QUERIES_MODULE_NAME}] as const,`); + for (const endpoint of queryEndpoints) { + lines.push( + ` ${getEndpointName(endpoint)}: (${renderEndpointParams(resolver, endpoint, { pathParamsRequiredOnly: true })}) => [...keys.all, "${endpoint.path}", ${renderEndpointArgs( + resolver, + endpoint, + {}, + )}] as const,`, + ); + if (resolver.options.infiniteQueries && isInfiniteQuery(endpoint, resolver.options)) { + lines.push( + ` ${getEndpointName(endpoint)}Infinite: (${renderEndpointParams(resolver, endpoint, { + excludePageParam: true, + pathParamsRequiredOnly: true, + })}) => [...keys.all, "${endpoint.path}", "infinite", ${renderEndpointArgs(resolver, endpoint, { + excludePageParam: true, + })}] as const,`, + ); + } + } + lines.push("};"); + return lines.join("\n"); +} + +function renderQuery({ resolver, endpoint }: { resolver: SchemaResolver; endpoint: Endpoint }) { + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + const hasAclCheck = resolver.options.checkAcl && endpoint.acl; + const endpointArgs = renderEndpointArgs(resolver, endpoint, {}); + const endpointParams = renderEndpointParams(resolver, endpoint, {}); + const hasQueryFn = endpointArgs.length > 0 || hasAxiosRequestConfig || hasAclCheck; + const hasQueryFnBody = Boolean(hasAclCheck); + const importedEndpoint = getImportedEndpointName(endpoint, resolver.options); + + const lines: string[] = []; + lines.push(renderQueryJsDocs({ resolver, endpoint, mode: "query" })); + lines.push( + `export const ${getQueryName(endpoint)} = (${endpointParams ? `{ ${endpointArgs} }: { ${endpointParams} }, ` : ""}options?: AppQueryOptions${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + ); + if (hasAclCheck) { + lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); + } + lines.push(" "); + lines.push(` return ${QUERY_HOOKS.query}({`); + lines.push(` queryKey: keys.${getEndpointName(endpoint)}(${endpointArgs}),`); + if (hasQueryFn) { + lines.push(` queryFn: () => ${hasQueryFnBody ? "{ " : ""}`); + if (hasAclCheck) { + lines.push(` ${renderAclCheckCall(resolver, endpoint)}`); + } + lines.push( + ` ${hasQueryFnBody ? "return " : ""}${importedEndpoint}(${endpointArgs}${hasAxiosRequestConfig ? `${endpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""})${hasQueryFnBody ? " }" : ""},`, + ); + } else { + lines.push(` queryFn: ${importedEndpoint},`); + } + lines.push(" ...options,"); + lines.push(" });"); + lines.push("};"); + return lines.join("\n"); +} + +function renderMutation({ + resolver, + endpoint, + precomputed, +}: { + resolver: SchemaResolver; + endpoint: Endpoint; + precomputed?: { updateQueryEndpoints: Endpoint[]; destructuredVariables: string[] }; +}) { + const hasAclCheck = resolver.options.checkAcl && endpoint.acl; + const hasMutationEffects = resolver.options.mutationEffects; + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + const endpointParams = renderEndpointParams(resolver, endpoint, { includeFileParam: true }); + const endpointArgs = renderEndpointArgs(resolver, endpoint, {}); + const destructuredMutationArgs = renderEndpointArgs(resolver, endpoint, { includeFileParam: true }); + const importedEndpoint = getImportedEndpointName(endpoint, resolver.options); + + const updateQueryEndpoints = precomputed?.updateQueryEndpoints ?? []; + const destructuredVariables = + precomputed?.destructuredVariables ?? getDestructuredVariables(resolver, endpoint, updateQueryEndpoints); + const hasMutationFnBody = endpoint.mediaUpload || hasAclCheck; + + const mutationVariablesType = endpoint.mediaUpload + ? `${endpointParams}${endpointParams ? "; " : ""}abortController?: AbortController; onUploadProgress?: (progress: { loaded: number; total: number }) => void` + : endpointParams; + + const lines: string[] = []; + lines.push(renderQueryJsDocs({ resolver, endpoint, mode: "mutation" })); + lines.push( + `export const ${getQueryName(endpoint, true)} = (options?: AppMutationOptions${hasMutationEffects ? ` & ${MUTATION_EFFECTS.optionsType}` : ""}${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + ); + if (hasAclCheck) { + lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); + } + if (hasMutationEffects) { + lines.push(` const { runMutationEffects } = useMutationEffects({ currentModule: ${QUERIES_MODULE_NAME} });`); + } + lines.push(""); + lines.push(` return ${QUERY_HOOKS.mutation}({`); + + const mutationFnArg = endpointParams + ? `{ ${destructuredMutationArgs}${endpoint.mediaUpload ? `${destructuredMutationArgs ? ", " : ""}abortController, onUploadProgress` : ""} }` + : ""; + lines.push( + ` mutationFn: ${endpoint.mediaUpload ? "async " : ""}(${mutationFnArg}) => ${hasMutationFnBody ? "{ " : ""}`, + ); + if (hasAclCheck) { + lines.push(` ${renderAclCheckCall(resolver, endpoint)}`); + } + if (endpoint.mediaUpload) { + lines.push( + ` const uploadInstructions = await ${importedEndpoint}(${endpointArgs}${hasAxiosRequestConfig ? `${endpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""});`, + ); + lines.push(" "); + lines.push(" if (file && uploadInstructions.url) {"); + lines.push(' const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post";'); + lines.push(" let dataToSend: File | FormData = file;"); + lines.push(' if (method === "post") {'); + lines.push(" dataToSend = new FormData();"); + lines.push(" if (uploadInstructions.fields) {"); + lines.push(" for (const [key, value] of uploadInstructions.fields) {"); + lines.push(" dataToSend.append(key, value);"); + lines.push(" }"); + lines.push(" }"); + lines.push(' dataToSend.append("file", file);'); + lines.push(" }"); + lines.push(" await axios[method](uploadInstructions.url, dataToSend, {"); + lines.push(" headers: {"); + lines.push(' "Content-Type": file.type,'); + lines.push(" },"); + lines.push(" signal: abortController?.signal,"); + lines.push(" onUploadProgress: onUploadProgress"); + lines.push( + " ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 })", + ); + lines.push(" : undefined,"); + lines.push(" });"); + lines.push(" }"); + lines.push(" "); + lines.push(" return uploadInstructions;"); + } else { + lines.push( + ` ${hasMutationFnBody ? "return " : ""}${importedEndpoint}(${endpointArgs}${hasAxiosRequestConfig ? `${endpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""})`, + ); + } + if (hasMutationFnBody) { + lines.push(" },"); + } else { + lines.push(","); + } + + lines.push(" ...options,"); + if (hasMutationEffects) { + lines.push(" onSuccess: async (resData, variables, onMutateResult, context) => {"); + if (updateQueryEndpoints.length > 0) { + if (destructuredVariables.length > 0) { + lines.push(` const { ${destructuredVariables.join(", ")} } = variables;`); + } + lines.push( + ` const updateKeys = [${updateQueryEndpoints + .map( + (e) => + `keys.${getEndpointName(e)}(${renderEndpointArgs(resolver, e, { + includeOnlyRequiredParams: true, + })})`, + ) + .join(", ")}];`, + ); + lines.push(` await runMutationEffects(resData, variables, options, updateKeys);`); + } else { + lines.push(" await runMutationEffects(resData, variables, options);"); + } + lines.push(" options?.onSuccess?.(resData, variables, onMutateResult, context);"); + lines.push(" },"); + } + + lines.push(" });"); + lines.push("};"); + return lines.join("\n"); +} + +function groupEndpoints(endpoints: Endpoint[], resolver: SchemaResolver) { + const queryEndpoints: Endpoint[] = []; + const mutationEndpoints: Endpoint[] = []; + const infiniteQueryEndpoints: Endpoint[] = []; + const aclEndpoints: Endpoint[] = []; + const infoByEndpoint = new Map(); + const mutationDataByEndpoint = new Map< + Endpoint, + { updateQueryEndpoints: Endpoint[]; destructuredVariables: string[] } + >(); + + for (const endpoint of endpoints) { + const query = isQuery(endpoint); + const mutation = isMutation(endpoint); + const infiniteQuery = resolver.options.infiniteQueries && query && isInfiniteQuery(endpoint, resolver.options); + + if (query) { + queryEndpoints.push(endpoint); + } + if (mutation) { + mutationEndpoints.push(endpoint); + } + if (infiniteQuery) { + infiniteQueryEndpoints.push(endpoint); + } + if (endpoint.acl) { + aclEndpoints.push(endpoint); + } + + infoByEndpoint.set(endpoint, { query, mutation, infiniteQuery }); + } + + for (const endpoint of mutationEndpoints) { + const updateQueryEndpoints = queryEndpoints.filter( + (queryEndpoint) => + queryEndpoint.parameters + .filter((param) => param.parameterObject?.required) + .every((pathParam) => endpoint.parameters.some((param) => param.name === pathParam.name)) && + queryEndpoint.response === endpoint.response, + ); + + mutationDataByEndpoint.set(endpoint, { + updateQueryEndpoints, + destructuredVariables: getDestructuredVariables(resolver, endpoint, updateQueryEndpoints), + }); + } + + return { + queryEndpoints, + mutationEndpoints, + infiniteQueryEndpoints, + aclEndpoints, + infoByEndpoint, + mutationDataByEndpoint, + }; +} + +function renderInfiniteQuery({ resolver, endpoint }: { resolver: SchemaResolver; endpoint: Endpoint }) { + const hasAclCheck = resolver.options.checkAcl && endpoint.acl; + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + const endpointParams = renderEndpointParams(resolver, endpoint, { excludePageParam: true }); + const endpointArgsWithoutPage = renderEndpointArgs(resolver, endpoint, { excludePageParam: true }); + const endpointArgsWithPage = renderEndpointArgs(resolver, endpoint, { replacePageParam: true }); + const importedEndpoint = getImportedEndpointName(endpoint, resolver.options); + const hasQueryFnBody = Boolean(hasAclCheck); + + const lines: string[] = []; + lines.push(renderQueryJsDocs({ resolver, endpoint, mode: "infiniteQuery" })); + lines.push( + `export const ${getInfiniteQueryName(endpoint)} = (${endpointParams ? `{ ${endpointArgsWithoutPage} }: { ${endpointParams} }, ` : ""}options?: AppInfiniteQueryOptions${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + ); + if (hasAclCheck) { + lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); + } + lines.push(""); + lines.push(` return ${QUERY_HOOKS.infiniteQuery}({`); + lines.push(` queryKey: keys.${getEndpointName(endpoint)}Infinite(${endpointArgsWithoutPage}),`); + lines.push(` queryFn: ({ pageParam }) => ${hasQueryFnBody ? "{ " : ""}`); + if (hasAclCheck) { + lines.push(` ${renderAclCheckCall(resolver, endpoint)}`); + } + lines.push( + ` ${hasQueryFnBody ? "return " : ""}${importedEndpoint}(${endpointArgsWithPage}${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}` : ""})${hasQueryFnBody ? " }" : ""},`, + ); + lines.push(" initialPageParam: 1,"); + lines.push( + ` getNextPageParam: ({ ${resolver.options.infiniteQueryResponseParamNames.page}, ${resolver.options.infiniteQueryResponseParamNames.totalItems}, ${resolver.options.infiniteQueryResponseParamNames.limit}: limitParam }) => {`, + ); + lines.push(` const pageParam = ${resolver.options.infiniteQueryResponseParamNames.page} ?? 1;`); + lines.push( + ` return pageParam * limitParam < ${resolver.options.infiniteQueryResponseParamNames.totalItems} ? pageParam + 1 : null;`, + ); + lines.push(" },"); + lines.push(" ...options,"); + lines.push(" });"); + lines.push("};"); + return lines.join("\n"); } diff --git a/src/generators/generate/generateQueryModules.ts b/src/generators/generate/generateQueryModules.ts index f8a75b0..46d9cae 100644 --- a/src/generators/generate/generateQueryModules.ts +++ b/src/generators/generate/generateQueryModules.ts @@ -1,5 +1,4 @@ import { GenerateType, GenerateTypeParams } from "@/generators/types/generate"; -import { getHbsTemplateDelegate } from "@/generators/utils/hbs/hbs-template.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; export function generateQueryModules({ resolver, data }: Omit) { @@ -17,7 +16,11 @@ export function generateQueryModules({ resolver, data }: Omit; + } + + export function ${ZOD_EXTENDED.exports.parse}( + schema: z.ZodType, + data: unknown, + { type, name, errorHandler }: ParseOptions = { type: "body" }, + ) { + try { + return schema.parse(data); + } catch (e) { + if (e instanceof z.ZodError) { + e.name = \`FE Request \${type === "body" ? "body" : "query param"}\${name ? \` ("\${name}")\` : ""} schema mismatch - ZodError\`; + } + (errorHandler ?? ${ERROR_HANDLERS.SharedErrorHandler}).rethrowError(e); + throw e; + } + } + + function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { + if (data === undefined || data === "" || enumSchema.options.length === 0) { + return true; + } + + const prefixedEnumOptions = \`([+-]?(\${enumSchema.options.join("|")}))\`; + const commaSeparatedOptions = \`(\${prefixedEnumOptions})(\\s*,\\s*\${prefixedEnumOptions})*\`; + return new RegExp(\`^\${commaSeparatedOptions}$\`).test(data); + } + + export const ${ZOD_EXTENDED.exports.sortExp} = (enumSchema: z.ZodEnum) => + z.string().superRefine((arg, ctx) => { + if (!isSortExpValid(enumSchema, arg)) { + ctx.addIssue({ + code: "invalid_value", + message: "Invalid sorting string.", + values: [], + }); + } + }); +} +`; +} + +function renderImport(importData: Import) { + const names = [ + ...(importData.defaultImport ? [importData.defaultImport] : []), + ...(importData.bindings ? [`{ ${importData.bindings.join(", ")} }`] : []), + ].join(", "); + return `import ${names} from "${importData.from}";`; } diff --git a/src/generators/generateCodeFromOpenAPIDoc.ts b/src/generators/generateCodeFromOpenAPIDoc.ts index 61f96b8..5f7d56a 100644 --- a/src/generators/generateCodeFromOpenAPIDoc.ts +++ b/src/generators/generateCodeFromOpenAPIDoc.ts @@ -1,5 +1,4 @@ import { OpenAPIV3 } from "openapi-types"; - import { getDataFromOpenAPIDoc } from "./core/getDataFromOpenAPIDoc"; import { generateAcl } from "./generate/generateAcl"; import { generateConfigs } from "./generate/generateConfigs"; @@ -16,9 +15,18 @@ import { getZodExtendedFiles, } from "./utils/generate-files.utils"; import { getTagFileName } from "./utils/generate/generate.utils"; +import { Profiler } from "../helpers/profile.helper"; -export function generateCodeFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, options: GenerateOptions) { - const { resolver, data } = getDataFromOpenAPIDoc(openApiDoc, options); +export function generateCodeFromOpenAPIDoc( + openApiDoc: OpenAPIV3.Document, + options: GenerateOptions, + profiler?: Profiler, +) { + const p = profiler ?? new Profiler(false); + const importPath = options.standalone && options.importPath === "ts" ? "relative" : options.importPath; + const { resolver, data } = p.runSync("data.extract", () => + getDataFromOpenAPIDoc(openApiDoc, { ...options, importPath }, p), + ); const generateFilesData: GenerateFileData[] = []; const appAclTags: string[] = []; @@ -39,7 +47,7 @@ export function generateCodeFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, optio data.forEach((_, tag) => { generateTypes.forEach((type) => { - const content = generateFunctions[type]({ resolver, data, tag }); + const content = p.runSync(`render.${type}`, () => generateFunctions[type]({ resolver, data, tag })); if (content) { const fileName = getOutputFileName({ output: options.output, @@ -54,10 +62,10 @@ export function generateCodeFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, optio }); generateFilesData.push( - ...getAclFiles(data, resolver), - ...getMutationEffectsFiles(data, resolver), - ...getZodExtendedFiles(data, resolver), - ...getAppRestClientFiles(resolver), + ...p.runSync("render.AclShared", () => getAclFiles(data, resolver)), + ...p.runSync("render.MutationEffects", () => getMutationEffectsFiles(data, resolver)), + ...p.runSync("render.ZodExtended", () => getZodExtendedFiles(data, resolver)), + ...p.runSync("render.Standalone", () => getAppRestClientFiles(resolver)), ); return generateFilesData; diff --git a/src/generators/generated-output-eq.test.ts b/src/generators/generated-output-eq.test.ts new file mode 100644 index 0000000..baea74e --- /dev/null +++ b/src/generators/generated-output-eq.test.ts @@ -0,0 +1,62 @@ +import fs from "fs"; +import path from "path"; +import { describe, expect, it } from "vitest"; + +const BASE_DIR = path.resolve(process.cwd(), "test/generated/base"); +const NEXT_DIR = path.resolve(process.cwd(), "test/generated/next"); + +function toPosixPath(filePath: string) { + return filePath.split(path.sep).join("/"); +} + +function getAllFiles(dir: string, rootDir = dir): string[] { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + const files: string[] = []; + + for (const entry of entries) { + if (entry.name === ".gitkeep") { + continue; + } + + const entryPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + files.push(...getAllFiles(entryPath, rootDir)); + continue; + } + + files.push(toPosixPath(path.relative(rootDir, entryPath))); + } + + return files.sort(); +} + +async function normalizeContent(filePath: string, content: string) { + void filePath; + return content + .replace(/\r\n/g, "\n") + .replace(/[ \t]+$/gm, "") + .replace(/\n[ \t]*\n+/g, "\n") + .trim(); +} + +describe("Generated output parity", () => { + it("matches between base and next output folders", async () => { + expect(fs.existsSync(BASE_DIR), `${BASE_DIR} does not exist`).toBe(true); + expect(fs.existsSync(NEXT_DIR), `${NEXT_DIR} does not exist`).toBe(true); + + const baseFiles = getAllFiles(BASE_DIR); + const nextFiles = getAllFiles(NEXT_DIR); + + expect(nextFiles).toEqual(baseFiles); + + for (const relativeFilePath of baseFiles) { + const baseContent = fs.readFileSync(path.join(BASE_DIR, relativeFilePath), "utf-8"); + const nextContent = fs.readFileSync(path.join(NEXT_DIR, relativeFilePath), "utf-8"); + + const normalizedBase = await normalizeContent(relativeFilePath, baseContent); + const normalizedNext = await normalizeContent(relativeFilePath, nextContent); + + expect(normalizedNext).toBe(normalizedBase); + } + }); +}); diff --git a/src/generators/templates/endpoints.hbs b/src/generators/templates/endpoints.hbs index 974707f..a533c75 100644 --- a/src/generators/templates/endpoints.hbs +++ b/src/generators/templates/endpoints.hbs @@ -37,7 +37,6 @@ export const {{endpointName endpoint}} = ({{{genEndpointParams endpoint}}}{{#if {{/if}}{{{genEndpointConfig endpoint}}} ) }; - {{/each}} {{#if includeNamespace}} } diff --git a/src/generators/utils/file.utils.ts b/src/generators/utils/file.utils.ts index d39f447..e45fb39 100644 --- a/src/generators/utils/file.utils.ts +++ b/src/generators/utils/file.utils.ts @@ -11,11 +11,6 @@ function readFileSync(filePath: string) { return fs.readFileSync(filePath, "utf-8"); } -export function readHbsTemplateSync(fileName: string) { - const templatePath = `src/generators/templates/${fileName}.hbs`; - return readFileSync(templatePath); -} - export function readAssetSync(fileName: string) { const assetPath = `src/assets/${fileName}`; return readFileSync(assetPath); @@ -32,6 +27,13 @@ function writeFileWithDirSync(file: string, data: string) { fs.mkdirSync(dir, { recursive: true }); } + if (fs.existsSync(file)) { + const existingData = fs.readFileSync(file, "utf-8"); + if (existingData === data) { + return; + } + } + fs.writeFileSync(file, data, "utf-8"); } diff --git a/src/generators/utils/generate-files.utils.ts b/src/generators/utils/generate-files.utils.ts index b8bbd6a..3c998d0 100644 --- a/src/generators/utils/generate-files.utils.ts +++ b/src/generators/utils/generate-files.utils.ts @@ -97,7 +97,7 @@ export function getAppRestClientFiles(resolver: SchemaResolver): GenerateFileDat } function getAssetFiles(files: GenerateFile[], resolver: SchemaResolver): GenerateFileData[] { - return files.reduce((acc, file) => [...acc, getAssetFile(file, resolver)], [] as GenerateFileData[]); + return files.map((file) => getAssetFile(file, resolver)); } function getAssetFile(file: GenerateFile, resolver: SchemaResolver): GenerateFileData { diff --git a/src/generators/utils/generate/generate.openapi.utils.ts b/src/generators/utils/generate/generate.openapi.utils.ts index e75842b..e9e3dad 100644 --- a/src/generators/utils/generate/generate.openapi.utils.ts +++ b/src/generators/utils/generate/generate.openapi.utils.ts @@ -2,7 +2,14 @@ import { OpenAPIV3 } from "openapi-types"; import { camelToSpaceSeparated, capitalize } from "@/generators/utils/string.utils"; +const schemaDescriptionsCache = new WeakMap(); + export function getSchemaDescriptions(schemaObj: OpenAPIV3.SchemaObject) { + const cachedSchemaDescriptions = schemaDescriptionsCache.get(schemaObj); + if (cachedSchemaDescriptions) { + return cachedSchemaDescriptions; + } + const schemaKeys: (keyof OpenAPIV3.SchemaObject)[] = [ "minimum", "exclusiveMinimum", @@ -22,5 +29,6 @@ export function getSchemaDescriptions(schemaObj: OpenAPIV3.SchemaObject) { .filter((key) => schemaObj[key] !== undefined) .reduce((acc, key) => [...acc, `${capitalize(camelToSpaceSeparated(key))}: \`${schemaObj[key]}\``], [] as string[]); + schemaDescriptionsCache.set(schemaObj, schemaDescriptions); return schemaDescriptions; } diff --git a/src/generators/utils/generate/generate.utils.ts b/src/generators/utils/generate/generate.utils.ts index d398d0d..0856358 100644 --- a/src/generators/utils/generate/generate.utils.ts +++ b/src/generators/utils/generate/generate.utils.ts @@ -53,6 +53,10 @@ export function getQueryModulesImportPath(options: GenerateOptions) { return `${getImportPath(options)}${QUERY_MODULES_FILE.fileName}`; } +export function getQueryTypesImportPath(options: GenerateOptions) { + return options.queryTypesImportPath; +} + export function getMutationEffectsImportPath(options: GenerateOptions) { return `${getImportPath(options)}${MUTATION_EFFECTS_FILE.fileName}`; } diff --git a/src/generators/utils/hbs/hbs-template.utils.ts b/src/generators/utils/hbs/hbs-template.utils.ts index 71348c6..702a446 100644 --- a/src/generators/utils/hbs/hbs-template.utils.ts +++ b/src/generators/utils/hbs/hbs-template.utils.ts @@ -11,8 +11,14 @@ import { registerPartialsHbsHelpers } from "./hbs.partials.utils"; import { registerQueryHbsHelpers } from "./hbs.query.utils"; import { registerZodHbsHelpers } from "./hbs.zod.utils"; -export function getHbsTemplateDelegate(resolver: SchemaResolver, templateName: string) { - const template = readHbsTemplateSync(templateName); +const registeredResolvers = new WeakSet(); +const templateDelegateCache = new Map(); +const partialTemplateDelegateCache = new Map(); + +function registerHelpersIfNeeded(resolver: SchemaResolver) { + if (registeredResolvers.has(resolver)) { + return; + } registerCommonHbsHelpers(); registerImportsHbsHelpers(); @@ -22,10 +28,31 @@ export function getHbsTemplateDelegate(resolver: SchemaResolver, templateName: s registerAclHbsHelpers(resolver); registerPartialsHbsHelpers(resolver); - return Handlebars.compile(template); + registeredResolvers.add(resolver); +} + +export function getHbsTemplateDelegate(resolver: SchemaResolver, templateName: string) { + registerHelpersIfNeeded(resolver); + + const cachedTemplateDelegate = templateDelegateCache.get(templateName); + if (cachedTemplateDelegate) { + return cachedTemplateDelegate; + } + + const template = readHbsTemplateSync(templateName); + const templateDelegate = Handlebars.compile(template); + templateDelegateCache.set(templateName, templateDelegate); + return templateDelegate; } export function getHbsPartialTemplateDelegate(templateName: string) { + const cachedTemplateDelegate = partialTemplateDelegateCache.get(templateName); + if (cachedTemplateDelegate) { + return cachedTemplateDelegate; + } + const template = readHbsTemplateSync(`partials/${templateName}`); - return Handlebars.compile(template); + const templateDelegate = Handlebars.compile(template); + partialTemplateDelegateCache.set(templateName, templateDelegate); + return templateDelegate; } diff --git a/src/helpers/config.helper.ts b/src/helpers/config.helper.ts index ef621c1..0891322 100644 --- a/src/helpers/config.helper.ts +++ b/src/helpers/config.helper.ts @@ -6,7 +6,7 @@ import { OpenAPICodegenConfig } from "@/generators/types/config"; import { logError } from "./cli.helper"; -const CONFIG_FILE_NAMES = ["openapi-codegen.config.ts"]; +const CONFIG_FILE_NAMES = ["openapi-codegen.config.mjs", "openapi-codegen.config.ts"]; export async function loadConfig(configPath?: string): Promise { try { @@ -36,13 +36,26 @@ async function loadConfigFromPath(filePath: string): Promise { + const imported = (await import(`${pathToFileURL(filePath).href}?t=${Date.now()}`)) as { + default?: OpenAPICodegenConfig; + }; + if (!imported.default) { + throw new Error(`ESM config must have a default export: ${filePath}`); + } + return imported.default; +} + let importFresh: typeof import("import-fresh"); export const loadJsSync = function loadJsSync(filepath: string) { if (importFresh === undefined) { @@ -100,3 +113,12 @@ function resolveTsConfig(directory: string) { return config; } + +function pathToFileURL(filePath: string) { + const resolvedPath = path.resolve(filePath); + const normalizedPath = resolvedPath.replace(/\\/g, "/"); + const hasLeadingSlash = normalizedPath.startsWith("/"); + return { + href: hasLeadingSlash ? `file://${normalizedPath}` : `file:///${normalizedPath}`, + }; +} diff --git a/src/helpers/profile.helper.ts b/src/helpers/profile.helper.ts new file mode 100644 index 0000000..4693cd0 --- /dev/null +++ b/src/helpers/profile.helper.ts @@ -0,0 +1,68 @@ +type ProfileEntry = { + totalMs: number; + count: number; +}; + +function nowMs() { + return Number(process.hrtime.bigint()) / 1_000_000; +} + +export class Profiler { + private readonly entries = new Map(); + + constructor(public readonly enabled: boolean) {} + + add(label: string, elapsedMs: number) { + if (!this.enabled) { + return; + } + + const prev = this.entries.get(label); + if (prev) { + prev.totalMs += elapsedMs; + prev.count += 1; + return; + } + + this.entries.set(label, { totalMs: elapsedMs, count: 1 }); + } + + runSync(label: string, fn: () => T): T { + if (!this.enabled) { + return fn(); + } + + const startMs = nowMs(); + try { + return fn(); + } finally { + this.add(label, nowMs() - startMs); + } + } + + async runAsync(label: string, fn: () => Promise): Promise { + if (!this.enabled) { + return await fn(); + } + + const startMs = nowMs(); + try { + return await fn(); + } finally { + this.add(label, nowMs() - startMs); + } + } + + formatLines() { + if (!this.enabled) { + return [] as string[]; + } + + return Array.from(this.entries.entries()) + .sort((a, b) => b[1].totalMs - a[1].totalMs) + .map(([label, entry]) => { + const avgMs = entry.totalMs / entry.count; + return `${label}: ${entry.totalMs.toFixed(1)}ms (count: ${entry.count}, avg: ${avgMs.toFixed(2)}ms)`; + }); + } +} diff --git a/test/generated/.gitkeep b/test/generated/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/generated/base/aWBStocks/aWBStocks.acl.ts b/test/generated/base/aWBStocks/aWBStocks.acl.ts new file mode 100644 index 0000000..aae7050 --- /dev/null +++ b/test/generated/base/aWBStocks/aWBStocks.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace AWBStocksAcl { + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List AWB stocks + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Read", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Create", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get AWB stock details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Read", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Update", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Update", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Update", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useGenerateNextNumber` mutation ability. For global ability, omit the object parameter. + * @description Generate next AWB number + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateNextNumber` mutation + */ + export const canUseGenerateNextNumber = (object?: { officeId: string }) => + ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Update", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; +} diff --git a/test/generated/base/aWBStocks/aWBStocks.api.ts b/test/generated/base/aWBStocks/aWBStocks.api.ts new file mode 100644 index 0000000..7e8f3ac --- /dev/null +++ b/test/generated/base/aWBStocks/aWBStocks.api.ts @@ -0,0 +1,114 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { AWBStocksModels } from "./aWBStocks.models"; + +export namespace AWBStocksApi { + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: AWBStocksModels.AWBStockFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, + `/offices/${officeId}/awb-stocks`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = ( + officeId: string, + data: AWBStocksModels.CreateAWBStockRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks`, + ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), + config, + ); + }; + + export const findById = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}`, + config, + ); + }; + + export const update = ( + stockId: string, + officeId: string, + data: AWBStocksModels.UpdateAWBStockRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}`, + ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), + config, + ); + }; + + export const archive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, + undefined, + config, + ); + }; + + export const generateNextNumber = ( + officeId: string, + data: AWBStocksModels.GenerateAWBNumberRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/generate-number`, + ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/aWBStocks/aWBStocks.configs.ts b/test/generated/base/aWBStocks/aWBStocks.configs.ts new file mode 100644 index 0000000..4317f98 --- /dev/null +++ b/test/generated/base/aWBStocks/aWBStocks.configs.ts @@ -0,0 +1,91 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { AWBStocksModels } from "./aWBStocks.models"; +import { AWBStocksQueries } from "./aWBStocks.queries"; +import { AWBStocksAcl } from "./aWBStocks.acl"; + +export namespace AWBStocksConfigs { + export const awbStocksConfig = { + meta: { + title: "Awb Stocks", + }, + readAll: { + acl: AWBStocksAcl.canUsePaginate, + schema: AWBStocksModels.AWBStockResponseDTOSchema, + paginated: AWBStocksQueries.usePaginate, + infinite: AWBStocksQueries.usePaginateInfinite, + filters: { + schema: AWBStocksModels.AWBStockFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AWBStocksModels.AWBStockFilterDtoSchema, + options: { + inputs: { + archived: true, + carrierId: true, + searchQuery: true, + used: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: AWBStocksModels.AWBStockResponseDTOSchema, + options: { + columns: { + id: true, + carrier: true, + startNumber: true, + lastUsedNumber: true, + stock: true, + usedCodes: true, + priority: true, + archived: true, + comments: true, + createdAt: true, + updatedAt: true, + createdBy: true, + updatedBy: true, + officeId: true, + }, + sortable: AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: AWBStocksAcl.canUseFindById, + schema: AWBStocksModels.AWBStockResponseDTOSchema, + query: AWBStocksQueries.useFindById, + }, + create: { + acl: AWBStocksAcl.canUseCreate, + schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, + mutation: AWBStocksQueries.useCreate, + inputDefs: dynamicInputs({ + schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, + options: { + inputs: { + carrierId: true, + startNumber: true, + stock: true, + priority: true, + comments: true, + officeId: true, + }, + }, + }), + }, + update: { + acl: AWBStocksAcl.canUseUpdate, + schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, + mutation: AWBStocksQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, + options: { + inputs: { + comments: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/base/aWBStocks/aWBStocks.models.ts b/test/generated/base/aWBStocks/aWBStocks.models.ts new file mode 100644 index 0000000..e8fe89f --- /dev/null +++ b/test/generated/base/aWBStocks/aWBStocks.models.ts @@ -0,0 +1,164 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace AWBStocksModels { + /** + * AWBStockBusinessPartnerPreviewDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } name Business partner name + * @property { string } carrierPrefix Carrier prefix (3 digits) + */ + export const AWBStockBusinessPartnerPreviewDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + name: z.string().describe("Business partner name"), + carrierPrefix: z.string().describe("Carrier prefix (3 digits)"), + }) + .readonly(); + export type AWBStockBusinessPartnerPreviewDTO = z.infer; + + /** + * AWBStockEmployeePreviewDTOSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Employee email + */ + export const AWBStockEmployeePreviewDTOSchema = z + .object({ id: z.string().describe("Employee ID"), email: z.string().describe("Employee email") }) + .readonly(); + export type AWBStockEmployeePreviewDTO = z.infer; + + /** + * AWBStockResponseDTOSchema + * @type { object } + * @property { string } id AWB stock ID + * @property { AWBStockBusinessPartnerPreviewDTO } carrier Carrier business partner + * @property { number } startNumber Start number + * @property { number } lastUsedNumber Last used number + * @property { number } stock Stock size + * @property { number } usedCodes Used codes count + * @property { number } priority Priority + * @property { boolean } archived Is archived + * @property { string } comments Comments + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { AWBStockEmployeePreviewDTO } createdBy User who created the stock + * @property { AWBStockEmployeePreviewDTO } updatedBy User who updated the stock + * @property { string } officeId Office ID + */ + export const AWBStockResponseDTOSchema = z + .object({ + id: z.string().describe("AWB stock ID"), + carrier: AWBStockBusinessPartnerPreviewDTOSchema.describe("Carrier business partner"), + startNumber: z.number().describe("Start number"), + lastUsedNumber: z.number().describe("Last used number").nullish(), + stock: z.number().describe("Stock size"), + usedCodes: z.number().describe("Used codes count"), + priority: z.number().describe("Priority"), + archived: z.boolean().describe("Is archived"), + comments: z.string().describe("Comments").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + createdBy: AWBStockEmployeePreviewDTOSchema.describe("User who created the stock"), + updatedBy: AWBStockEmployeePreviewDTOSchema.describe("User who updated the stock").nullish(), + officeId: z.string().describe("Office ID"), + }) + .readonly(); + export type AWBStockResponseDTO = z.infer; + + /** + * AWBStockFilterDtoSchema + * @type { object } + * @property { boolean } archived + * @property { string } carrierId + * @property { string } searchQuery + * @property { boolean } used + */ + export const AWBStockFilterDtoSchema = z + .object({ archived: z.boolean(), carrierId: z.string(), searchQuery: z.string(), used: z.boolean() }) + .readonly(); + export type AWBStockFilterDto = z.infer; + + /** + * CreateAWBStockRequestDTOSchema + * @type { object } + * @property { string } carrierId Carrier business partner ID + * @property { number } startNumber Start number. Minimum: `0` + * @property { number } stock Stock size + * @property { number } priority Priority + * @property { string } comments Comments + * @property { string } officeId Office ID + */ + export const CreateAWBStockRequestDTOSchema = z + .object({ + carrierId: z.string().describe("Carrier business partner ID"), + startNumber: z.number().gte(0).describe("Start number"), + stock: z.number().describe("Stock size"), + priority: z.number().describe("Priority"), + comments: z.string().describe("Comments").nullish(), + officeId: z.string().describe("Office ID"), + }) + .readonly(); + export type CreateAWBStockRequestDTO = z.infer; + + /** + * GenerateAWBNumberRequestDTOSchema + * @type { object } + * @property { string } carrierId Carrier ID. Example: `e847c7dd-a364-4488-bed6-1e5878aff022` + */ + export const GenerateAWBNumberRequestDTOSchema = z + .object({ carrierId: z.string().describe("Carrier ID") }) + .readonly(); + export type GenerateAWBNumberRequestDTO = z.infer; + + /** + * GenerateAWBNumberResponseDTOSchema + * @type { object } + * @property { string } formattedAwbNumber Generated AWB number. Example: `123-45678901` + */ + export const GenerateAWBNumberResponseDTOSchema = z + .object({ formattedAwbNumber: z.string().describe("Generated AWB number") }) + .readonly(); + export type GenerateAWBNumberResponseDTO = z.infer; + + /** + * UpdateAWBStockRequestDTOSchema + * @type { object } + * @property { string } comments Comments + */ + export const UpdateAWBStockRequestDTOSchema = z.object({ comments: z.string().describe("Comments") }).readonly(); + export type UpdateAWBStockRequestDTO = z.infer; + + /** + * AWBStocksPaginateOrderParamEnumSchema + * @type { enum } + */ + export const AWBStocksPaginateOrderParamEnumSchema = z.enum([ + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "carrierName", + "startNumber", + "priority", + ]); + export type AWBStocksPaginateOrderParamEnum = z.infer; + export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSchema.enum; + + /** + * AWBStocksPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { AWBStockResponseDTO[] } items + */ + export const AWBStocksPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(AWBStockResponseDTOSchema).readonly() }).readonly().shape, + }); + export type AWBStocksPaginateResponse = z.infer; +} diff --git a/test/generated/base/aWBStocks/aWBStocks.queries.ts b/test/generated/base/aWBStocks/aWBStocks.queries.ts new file mode 100644 index 0000000..1731fbc --- /dev/null +++ b/test/generated/base/aWBStocks/aWBStocks.queries.ts @@ -0,0 +1,319 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AWBStocksAcl } from "./aWBStocks.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AWBStocksModels } from "./aWBStocks.models"; +import { AWBStocksApi } from "./aWBStocks.api"; + +export namespace AWBStocksQueries { + export const moduleName = QueryModule.AWBStocks; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: AWBStocksModels.AWBStockFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/awb-stocks", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: AWBStocksModels.AWBStockFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/awb-stocks", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (stockId: string, officeId: string) => + [...keys.all, "/offices/:officeId/awb-stocks/:stockId", stockId, officeId] as const, + }; + + /** + * Query `usePaginate` + * @summary List AWB stocks + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` + * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: AWBStocksModels.AWBStockFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AWBStocksAcl.canUsePaginate({ officeId })); + return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary List AWB stocks + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` + * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { officeId: string; limit: number; order?: string; filter?: AWBStocksModels.AWBStockFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AWBStocksAcl.canUsePaginate({ officeId })); + return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create AWB stock + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.CreateAWBStockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof AWBStocksApi.create, + { officeId: string; data: AWBStocksModels.CreateAWBStockRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(AWBStocksAcl.canUseCreate({ officeId })); + return AWBStocksApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get AWB stock details + * @permission Requires `canUseFindById` ability + * @param { string } object.stockId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { stockId, officeId }: { stockId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(stockId, officeId), + queryFn: () => { + checkAcl(AWBStocksAcl.canUseFindById({ officeId })); + return AWBStocksApi.findById(stockId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update AWB stock comments + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.UpdateAWBStockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof AWBStocksApi.update, + { stockId: string; officeId: string; data: AWBStocksModels.UpdateAWBStockRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId, data }) => { + checkAcl(AWBStocksAcl.canUseUpdate({ officeId })); + return AWBStocksApi.update(stockId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive AWB stock + * @permission Requires `canUseArchive` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId }) => { + checkAcl(AWBStocksAcl.canUseArchive({ officeId })); + return AWBStocksApi.archive(stockId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive AWB stock + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId }) => { + checkAcl(AWBStocksAcl.canUseUnarchive({ officeId })); + return AWBStocksApi.unarchive(stockId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateNextNumber` + * @summary Generate next AWB number for carrier + * @permission Requires `canUseGenerateNextNumber` ability + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.GenerateAWBNumberRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateNextNumber = ( + options?: AppMutationOptions< + typeof AWBStocksApi.generateNextNumber, + { officeId: string; data: AWBStocksModels.GenerateAWBNumberRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId })); + return AWBStocksApi.generateNextNumber(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/acl/app.ability.ts b/test/generated/base/acl/app.ability.ts new file mode 100644 index 0000000..3aad6f4 --- /dev/null +++ b/test/generated/base/acl/app.ability.ts @@ -0,0 +1,387 @@ +import { PureAbility, AbilityTuple, ForcedSubject } from "@casl/ability"; + +export type AppAbilities = + | AbilityTuple< + "Read", + | "WorkingDocument" + | (ForcedSubject<"WorkingDocument"> & { officeId: string }) + | "Office" + | "Currency" + | "Country" + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + | "BusinessPartner" + | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + | "City" + | "Depot" + | "PartnerNetwork" + | "Warehouse" + | "DocumentTemplate" + | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + | "HsCode" + | "CargoType" + | "Position" + | (ForcedSubject<"Position"> & { officeId: string }) + | "Terminal" + | "Airport" + | "Port" + | "ContainerYard" + | "PositionAccount" + | (ForcedSubject<"PositionAccount"> & { officeId: string }) + | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + | "PositionCargo" + | (ForcedSubject<"PositionCargo"> & { officeId: string }) + | "PackageType" + | "WorkingDocument-house-bl" + | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + | "WorkingDocument-bl-instructions" + | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + | "WorkingDocument-ams-instructions" + | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + | "WorkingDocument-house-awb" + | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + | "ChargeType" + | "WorkingDocument-master-awb" + | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + | "WorkingDocument-cmr-form" + | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + | "WorkingDocument-isf-form" + | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + | "WorkingDocument-fcr-form" + | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + | "Role" + | (ForcedSubject<"Role"> & { context?: string }) + | "Permission" + | "Employee" + | (ForcedSubject<"Employee"> & { officeId?: string }) + | (ForcedSubject<"Employee"> & { officeId: string }) + | "Employment" + | (ForcedSubject<"Employment"> & { officeId?: string }) + | "Customer" + | "Quote" + | (ForcedSubject<"Quote"> & { officeId: string }) + | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) + | "QuoteCargo" + | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + | "Dunning" + | (ForcedSubject<"Dunning"> & { officeId: string }) + | "PositionInvoice" + | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + | "DunningLevel" + | (ForcedSubject<"DunningLevel"> & { officeId: string }) + | "DunningSystem" + | (ForcedSubject<"DunningSystem"> & { officeId: string }) + | "VatRule" + | "ProjectLite" + | (ForcedSubject<"ProjectLite"> & { officeId: string }) + | "ChecklistTemplate" + | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + | "BookkeepingExportBatch" + | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + | "FactoringExport" + | (ForcedSubject<"FactoringExport"> & { officeId: string }) + | "AWBStock" + | (ForcedSubject<"AWBStock"> & { officeId: string }) + | "ChecklistItem" + | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + | "RemarkTemplate" + | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + | "IntegrationChannel" + | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + | "IntegrationMessage" + | (ForcedSubject<"IntegrationMessage"> & { officeId: string }) + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + | (ForcedSubject<"Office"> & { officeId: string }) + > + | AbilityTuple< + "Create", + | "Office" + | "Currency" + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + | "BusinessPartner" + | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + | "City" + | "Depot" + | "PartnerNetwork" + | "Warehouse" + | "DocumentTemplate" + | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + | "HsCode" + | "CargoType" + | "Terminal" + | "Airport" + | "Port" + | "ContainerYard" + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + | "PositionCargo" + | (ForcedSubject<"PositionCargo"> & { officeId: string }) + | "PackageType" + | "WorkingDocument-house-bl" + | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + | "WorkingDocument-bl-instructions" + | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + | "WorkingDocument-ams-instructions" + | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + | "WorkingDocument-house-awb" + | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + | "ChargeType" + | "WorkingDocument-master-awb" + | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + | "WorkingDocument-cmr-form" + | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + | "WorkingDocument-isf-form" + | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + | "WorkingDocument-fcr-form" + | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + | "Role" + | "Employee" + | (ForcedSubject<"Employee"> & { officeId?: string }) + | (ForcedSubject<"Employee"> & { officeId: string }) + | "Employment" + | (ForcedSubject<"Employment"> & { officeId: string }) + | "Customer" + | "Quote" + | (ForcedSubject<"Quote"> & { officeId: string }) + | "QuoteCargo" + | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + | "Dunning" + | (ForcedSubject<"Dunning"> & { officeId: string }) + | "DunningLevel" + | (ForcedSubject<"DunningLevel"> & { officeId: string }) + | "DunningSystem" + | (ForcedSubject<"DunningSystem"> & { officeId: string }) + | "Position" + | (ForcedSubject<"Position"> & { officeId: string }) + | "PositionInvoice" + | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + | "VatRule" + | "ProjectLite" + | (ForcedSubject<"ProjectLite"> & { officeId: string }) + | "ChecklistTemplate" + | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + | "BookkeepingExportBatch" + | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + | "FactoringExport" + | (ForcedSubject<"FactoringExport"> & { officeId: string }) + | "AWBStock" + | (ForcedSubject<"AWBStock"> & { officeId: string }) + | "ChecklistItem" + | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + | "RemarkTemplate" + | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + | "IntegrationChannel" + | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + > + | AbilityTuple< + "Update", + | "Office" + | (ForcedSubject<"Office"> & { officeId: string }) + | "Currency" + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + | "BusinessPartner" + | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + | "BusinessPartnerBasicTab" + | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) + | "BusinessPartnerBookkeeping" + | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + | "City" + | "Depot" + | "PartnerNetwork" + | "Warehouse" + | "DocumentTemplate" + | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + | "HsCode" + | "CargoType" + | "Position" + | (ForcedSubject<"Position"> & { officeId: string }) + | "Terminal" + | "Airport" + | "Port" + | "ContainerYard" + | "PositionAccount" + | (ForcedSubject<"PositionAccount"> & { officeId: string }) + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + | "PositionCargo" + | (ForcedSubject<"PositionCargo"> & { officeId: string }) + | "PackageType" + | "WorkingDocument-house-bl" + | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + | "WorkingDocument-bl-instructions" + | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + | "WorkingDocument-ams-instructions" + | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + | "WorkingDocument-house-awb" + | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + | "ChargeType" + | "WorkingDocument-master-awb" + | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + | "WorkingDocument-cmr-form" + | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + | "WorkingDocument-isf-form" + | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + | "WorkingDocument-fcr-form" + | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + | "Role" + | "Employee" + | (ForcedSubject<"Employee"> & { officeId: string }) + | "Customer" + | "Quote" + | (ForcedSubject<"Quote"> & { officeId: string }) + | "QuoteCargo" + | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + | "DunningLevel" + | (ForcedSubject<"DunningLevel"> & { officeId: string }) + | "DunningSystem" + | (ForcedSubject<"DunningSystem"> & { officeId: string }) + | "PositionInvoice" + | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + | "VatRule" + | "ProjectLite" + | (ForcedSubject<"ProjectLite"> & { officeId: string }) + | "ChecklistTemplate" + | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + | "BookkeepingExportBatch" + | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + | "FactoringExport" + | (ForcedSubject<"FactoringExport"> & { officeId: string }) + | "AWBStock" + | (ForcedSubject<"AWBStock"> & { officeId: string }) + | "ChecklistItem" + | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + | "RemarkTemplate" + | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + | "IntegrationChannel" + | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + > + | AbilityTuple< + "Delete", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + | "BusinessPartnerBookkeeping" + | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + | "PositionCargo" + | (ForcedSubject<"PositionCargo"> & { officeId: string }) + | "WorkingDocument-house-bl" + | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + | "WorkingDocument-bl-instructions" + | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + | "WorkingDocument-ams-instructions" + | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + | "WorkingDocument-house-awb" + | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + | "WorkingDocument-master-awb" + | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + | "WorkingDocument-cmr-form" + | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + | "WorkingDocument-isf-form" + | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + | "WorkingDocument-fcr-form" + | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + | "Role" + | "QuoteCargo" + | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + | "PositionInvoice" + | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + > + | AbilityTuple< + "Archive", + | "BusinessPartner" + | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + | "City" + | "Depot" + | "PartnerNetwork" + | "Warehouse" + | "DocumentTemplate" + | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + | "HsCode" + | "CargoType" + | "Terminal" + | "PackageType" + | "ChargeType" + | "Employee" + | "Employment" + | (ForcedSubject<"Employment"> & { officeId: string }) + | "DunningLevel" + | (ForcedSubject<"DunningLevel"> & { officeId: string }) + | "DunningSystem" + | (ForcedSubject<"DunningSystem"> & { officeId: string }) + | "ProjectLite" + | (ForcedSubject<"ProjectLite"> & { officeId: string }) + | "ChecklistTemplate" + | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + | "ChecklistItem" + | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + | "RemarkTemplate" + | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + | "IntegrationChannel" + | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + > + | AbilityTuple<"ReadRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> + | AbilityTuple<"CreateRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> + | AbilityTuple<"UpdateRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> + | AbilityTuple<"DeleteRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> + | AbilityTuple< + "Unarchive", + | "DocumentTemplate" + | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + | "Terminal" + | "Employee" + | "Employment" + | (ForcedSubject<"Employment"> & { officeId: string }) + | "DunningLevel" + | (ForcedSubject<"DunningLevel"> & { officeId: string }) + | "RemarkTemplate" + | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + > + | AbilityTuple< + "Duplicate", + | "PositionAccount" + | (ForcedSubject<"PositionAccount"> & { officeId: string }) + | "PositionCargo" + | (ForcedSubject<"PositionCargo"> & { officeId: string }) + | "QuoteCargo" + | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + > + | AbilityTuple<"Reassign", "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string })> + | AbilityTuple<"ListRoles", "Employee" | "Employment" | (ForcedSubject<"Employment"> & { officeId: string })> + | AbilityTuple<"UpdateRoles", "Employee" | "Employment" | (ForcedSubject<"Employment"> & { officeId: string })> + | AbilityTuple<"Deactivate", "Customer"> + | AbilityTuple<"Reactivate", "Customer"> + | AbilityTuple< + "Export", + | "Quote" + | (ForcedSubject<"Quote"> & { officeId: string }) + | "Position" + | (ForcedSubject<"Position"> & { officeId: string }) + | "PositionInvoice" + | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + | "UninvoicedCharge" + | (ForcedSubject<"UninvoicedCharge"> & { officeId: string }) + | "InvoicePayment" + | (ForcedSubject<"InvoicePayment"> & { officeId: string }) + | "BookkeepingExportBatch" + | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + > + | AbilityTuple<"ReadInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> + | AbilityTuple<"CreateInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> + | AbilityTuple<"UpdateInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> + | AbilityTuple<"DeleteInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> + | AbilityTuple<"TotalProfitView", "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string })> + | AbilityTuple<"RevertCancel", "Position" | (ForcedSubject<"Position"> & { officeId: string })> + | AbilityTuple<"Fix", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> + | AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> + | AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> + | AbilityTuple<"Import", "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string })>; + +export type AppAbility = PureAbility; diff --git a/test/generated/base/acl/useAclCheck.ts b/test/generated/base/acl/useAclCheck.ts new file mode 100644 index 0000000..adf3779 --- /dev/null +++ b/test/generated/base/acl/useAclCheck.ts @@ -0,0 +1,25 @@ +import { AbilityTuple } from "@casl/ability"; +import { type ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; +import { AbilityContext } from "@povio/openapi-codegen-cli/acl"; +import { useCallback } from "react"; + +import { AppAbilities } from "@/data/acl/app.ability"; + +interface UseAclCheckProps { + errorHandler?: ErrorHandler; +} + +export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { + const ability = AbilityContext.useAbility(); + + const checkAcl = useCallback( + (appAbility: AppAbilities) => { + if (!ability.can(...(appAbility as AbilityTuple))) { + (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); + } + }, + [ability, errorHandler], + ); + + return { checkAcl }; +} diff --git a/test/generated/base/airPositions/airPositions.acl.ts b/test/generated/base/airPositions/airPositions.acl.ts new file mode 100644 index 0000000..10a4dc7 --- /dev/null +++ b/test/generated/base/airPositions/airPositions.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace AirPositionsAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get air position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update air position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/base/airPositions/airPositions.api.ts b/test/generated/base/airPositions/airPositions.api.ts new file mode 100644 index 0000000..1d17388 --- /dev/null +++ b/test/generated/base/airPositions/airPositions.api.ts @@ -0,0 +1,28 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { AirPositionsModels } from "./airPositions.models"; + +export namespace AirPositionsApi { + export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/air-position`, + config, + ); + }; + + export const update = ( + officeId: string, + positionId: string, + data: AirPositionsModels.UpdateAirPositionRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/air-position`, + ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/airPositions/airPositions.models.ts b/test/generated/base/airPositions/airPositions.models.ts new file mode 100644 index 0000000..a3dd669 --- /dev/null +++ b/test/generated/base/airPositions/airPositions.models.ts @@ -0,0 +1,77 @@ +import { z } from "zod"; + +export namespace AirPositionsModels { + /** + * AirPositionCustomsStatusTypeEnumSchema + * @type { enum } + */ + export const AirPositionCustomsStatusTypeEnumSchema = z.enum(["Other", "X", "C", "TD", "T1"]); + export type AirPositionCustomsStatusTypeEnum = z.infer; + export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnumSchema.enum; + + /** + * AirPositionResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } hawbNumber + * @property { string } mawbNumber + * @property { string } airlineDeadline + * @property { string } customsStatus + * @property { AirPositionCustomsStatusTypeEnum } customsStatusType + * @property { boolean } hawbRequired + * @property { boolean } mawbRequired + * @property { string } mrnT1Number + * @property { boolean } isCourier + * @property { string } deliveryToConsignee + * @property { string } createdAt + * @property { string } updatedAt + */ + export const AirPositionResponseDTOSchema = z + .object({ + id: z.string(), + hawbNumber: z.string().nullish(), + mawbNumber: z.string().nullish(), + airlineDeadline: z.iso.datetime({ offset: true }).nullish(), + customsStatus: z.string().nullish(), + customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), + hawbRequired: z.boolean(), + mawbRequired: z.boolean(), + mrnT1Number: z.string().nullish(), + isCourier: z.boolean().nullish(), + deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type AirPositionResponseDTO = z.infer; + + /** + * UpdateAirPositionRequestDTOSchema + * @type { object } + * @property { string } hawbNumber + * @property { string } mawbNumber + * @property { string } airlineDeadline + * @property { string } customsStatus + * @property { AirPositionCustomsStatusTypeEnum } customsStatusType + * @property { string } mrnT1Number + * @property { boolean } hawbRequired + * @property { boolean } mawbRequired + * @property { boolean } isCourier + * @property { string } deliveryToConsignee + */ + export const UpdateAirPositionRequestDTOSchema = z + .object({ + hawbNumber: z.string(), + mawbNumber: z.string(), + airlineDeadline: z.iso.datetime({ offset: true }), + customsStatus: z.string(), + customsStatusType: AirPositionCustomsStatusTypeEnumSchema, + mrnT1Number: z.string(), + hawbRequired: z.boolean(), + mawbRequired: z.boolean(), + isCourier: z.boolean(), + deliveryToConsignee: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type UpdateAirPositionRequestDTO = z.infer; +} diff --git a/test/generated/base/airPositions/airPositions.queries.ts b/test/generated/base/airPositions/airPositions.queries.ts new file mode 100644 index 0000000..3cddf4f --- /dev/null +++ b/test/generated/base/airPositions/airPositions.queries.ts @@ -0,0 +1,83 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AirPositionsAcl } from "./airPositions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AirPositionsModels } from "./airPositions.models"; +import { AirPositionsApi } from "./airPositions.api"; + +export namespace AirPositionsQueries { + export const moduleName = QueryModule.AirPositions; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/air-position", officeId, positionId] as const, + }; + + /** + * Query `useGet` + * @summary Get air position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(AirPositionsAcl.canUseGet({ officeId })); + return AirPositionsApi.get(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update air position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AirPositionsModels.UpdateAirPositionRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof AirPositionsApi.update, + { officeId: string; positionId: string; data: AirPositionsModels.UpdateAirPositionRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(AirPositionsAcl.canUseUpdate({ officeId })); + return AirPositionsApi.update(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/airports/airports.acl.ts b/test/generated/base/airports/airports.acl.ts new file mode 100644 index 0000000..5ec8aa1 --- /dev/null +++ b/test/generated/base/airports/airports.acl.ts @@ -0,0 +1,33 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace AirportsAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Airport"] as AbilityTuple<"Create", "Airport">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Airport"] as AbilityTuple<"Update", "Airport">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; +} diff --git a/test/generated/base/airports/airports.api.ts b/test/generated/base/airports/airports.api.ts new file mode 100644 index 0000000..c50c8ca --- /dev/null +++ b/test/generated/base/airports/airports.api.ts @@ -0,0 +1,105 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { AirportsModels } from "./airports.models"; + +export namespace AirportsApi { + export const paginate = ( + limit: number, + order?: string, + filter?: AirportsModels.AirportPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: AirportsModels.AirportsPaginateResponseSchema }, `/airports`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: AirportsModels.CreateAirportRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports`, + ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), + config, + ); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: AirportsModels.AirportLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, + `/airports/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports/${id}`, + ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), + config, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: AirportsModels.AirportResponseDTOSchema }, `/airports/${id}`, config); + }; +} diff --git a/test/generated/base/airports/airports.configs.ts b/test/generated/base/airports/airports.configs.ts new file mode 100644 index 0000000..477cb42 --- /dev/null +++ b/test/generated/base/airports/airports.configs.ts @@ -0,0 +1,117 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { AirportsModels } from "./airports.models"; +import { CommonModels } from "@/data/common/common.models"; +import { AirportsQueries } from "./airports.queries"; +import { AirportsAcl } from "./airports.acl"; + +export namespace AirportsConfigs { + export const airportsConfig = { + meta: { + title: "Airports", + }, + readAll: { + acl: AirportsAcl.canUsePaginate, + schema: AirportsModels.AirportResponseDTOSchema, + paginated: AirportsQueries.usePaginate, + infinite: AirportsQueries.usePaginateInfinite, + filters: { + schema: AirportsModels.AirportPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AirportsModels.AirportPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: AirportsModels.AirportResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + iataCode: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: AirportsModels.AirportsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: AirportsAcl.canUseFindById, + schema: AirportsModels.AirportResponseDTOSchema, + query: AirportsQueries.useFindById, + }, + create: { + acl: AirportsAcl.canUseCreate, + schema: AirportsModels.CreateAirportRequestDTOSchema, + mutation: AirportsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: AirportsModels.CreateAirportRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + iataCode: true, + }, + }, + }), + }, + update: { + acl: AirportsAcl.canUseUpdate, + schema: AirportsModels.UpdateAirportRequestDTOSchema, + mutation: AirportsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: AirportsModels.UpdateAirportRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + iataCode: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: AirportsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: AirportsQueries.usePaginateLabels, + infinite: AirportsQueries.usePaginateLabelsInfinite, + filters: { + schema: AirportsModels.AirportLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AirportsModels.AirportLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/airports/airports.models.ts b/test/generated/base/airports/airports.models.ts new file mode 100644 index 0000000..790cc10 --- /dev/null +++ b/test/generated/base/airports/airports.models.ts @@ -0,0 +1,157 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace AirportsModels { + /** + * AirportEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type AirportEmployeeDTO = z.infer; + + /** + * AirportResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the airport + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + * @property { string } createdById + * @property { AirportEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { AirportEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const AirportResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the airport"), + name: z.string().describe("Name of the airport"), + matchCode: z.string().describe("Match code for the airport"), + iataCode: z.string().describe("IATA code of the airport"), + createdById: z.string().nullish(), + createdBy: AirportEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: AirportEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type AirportResponseDTO = z.infer; + + /** + * AirportPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter airports by name, match code or IATA code + */ + export const AirportPaginationFilterDtoSchema = z + .object({ search: z.string().describe("Search term to filter airports by name, match code or IATA code") }) + .readonly(); + export type AirportPaginationFilterDto = z.infer; + + /** + * AirportLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const AirportLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type AirportLabelFilterDto = z.infer; + + /** + * CreateAirportRequestDTOSchema + * @type { object } + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + */ + export const CreateAirportRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the airport"), + matchCode: z.string().describe("Match code for the airport"), + iataCode: z.string().describe("IATA code of the airport"), + }) + .readonly(); + export type CreateAirportRequestDTO = z.infer; + + /** + * UpdateAirportRequestDTOSchema + * @type { object } + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + */ + export const UpdateAirportRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the airport"), + matchCode: z.string().describe("Match code for the airport"), + iataCode: z.string().describe("IATA code of the airport"), + }) + .readonly(); + export type UpdateAirportRequestDTO = z.infer; + + /** + * AirportsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const AirportsPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "iataCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type AirportsPaginateOrderParamEnum = z.infer; + export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSchema.enum; + + /** + * AirportsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { AirportResponseDTO[] } items + */ + export const AirportsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(AirportResponseDTOSchema).readonly() }).readonly().shape, + }); + export type AirportsPaginateResponse = z.infer; + + /** + * AirportsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const AirportsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "iataCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type AirportsPaginateLabelsOrderParamEnum = z.infer; + export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * AirportsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const AirportsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type AirportsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/airports/airports.queries.ts b/test/generated/base/airports/airports.queries.ts new file mode 100644 index 0000000..3f6c5b9 --- /dev/null +++ b/test/generated/base/airports/airports.queries.ts @@ -0,0 +1,294 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AirportsAcl } from "./airports.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AirportsModels } from "./airports.models"; +import { AirportsApi } from "./airports.api"; + +export namespace AirportsQueries { + export const moduleName = QueryModule.Airports; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: AirportsModels.AirportPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/airports", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: AirportsModels.AirportPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/airports", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: AirportsModels.AirportLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/airports/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: AirportsModels.AirportLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/airports/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/airports/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Airports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: AirportsModels.AirportPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AirportsAcl.canUsePaginate()); + return AirportsApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Airports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: AirportsModels.AirportPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AirportsAcl.canUsePaginate()); + return AirportsApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create airport + * @permission Requires `canUseCreate` ability + * @param { AirportsModels.CreateAirportRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(AirportsAcl.canUseCreate()); + return AirportsApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate airports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: AirportsModels.AirportLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AirportsAcl.canUsePaginateLabels()); + return AirportsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate airports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: AirportsModels.AirportLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AirportsAcl.canUsePaginateLabels()); + return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update airport + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { AirportsModels.UpdateAirportRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof AirportsApi.update, + { id: string; data: AirportsModels.UpdateAirportRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(AirportsAcl.canUseUpdate()); + return AirportsApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get airport + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(AirportsAcl.canUseFindById()); + return AirportsApi.findById(id, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/app-rest-client.ts b/test/generated/base/app-rest-client.ts new file mode 100644 index 0000000..389b1f4 --- /dev/null +++ b/test/generated/base/app-rest-client.ts @@ -0,0 +1,7 @@ +import { RestClient } from "@povio/openapi-codegen-cli"; + +export const AppRestClient = new RestClient({ + config: { + baseURL: "http://localhost:4000", + }, +}); diff --git a/test/generated/base/bankAccounts/bankAccounts.acl.ts b/test/generated/base/bankAccounts/bankAccounts.acl.ts new file mode 100644 index 0000000..d8024f8 --- /dev/null +++ b/test/generated/base/bankAccounts/bankAccounts.acl.ts @@ -0,0 +1,15 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace BankAccountsAcl { + /** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; +} diff --git a/test/generated/base/bankAccounts/bankAccounts.api.ts b/test/generated/base/bankAccounts/bankAccounts.api.ts new file mode 100644 index 0000000..2d61663 --- /dev/null +++ b/test/generated/base/bankAccounts/bankAccounts.api.ts @@ -0,0 +1,61 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BankAccountsModels } from "./bankAccounts.models"; + +export namespace BankAccountsApi { + export const findAll = (search?: string, officeId?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, + `/bank-accounts/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), + }, + }, + ); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: BankAccountsModels.BankAccountFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, + `/bank-accounts/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/base/bankAccounts/bankAccounts.configs.ts b/test/generated/base/bankAccounts/bankAccounts.configs.ts new file mode 100644 index 0000000..2659ac4 --- /dev/null +++ b/test/generated/base/bankAccounts/bankAccounts.configs.ts @@ -0,0 +1,42 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { BankAccountsModels } from "./bankAccounts.models"; +import { BankAccountsQueries } from "./bankAccounts.queries"; +import { BankAccountsAcl } from "./bankAccounts.acl"; + +export namespace BankAccountsConfigs { + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: BankAccountsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: BankAccountsQueries.usePaginateLabels, + infinite: BankAccountsQueries.usePaginateLabelsInfinite, + filters: { + schema: BankAccountsModels.BankAccountFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BankAccountsModels.BankAccountFilterDtoSchema, + options: { + inputs: { + search: true, + officeId: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/bankAccounts/bankAccounts.models.ts b/test/generated/base/bankAccounts/bankAccounts.models.ts new file mode 100644 index 0000000..8c8b664 --- /dev/null +++ b/test/generated/base/bankAccounts/bankAccounts.models.ts @@ -0,0 +1,49 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BankAccountsModels { + /** + * BankAccountFilterDtoSchema + * @type { object } + * @property { string } search Search by name or bank name + * @property { string } officeId Office ID to filter by + */ + export const BankAccountFilterDtoSchema = z + .object({ + search: z.string().describe("Search by name or bank name"), + officeId: z.string().describe("Office ID to filter by"), + }) + .readonly(); + export type BankAccountFilterDto = z.infer; + + /** + * BankAccountsFindAllResponseSchema + * @type { array } + */ + export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type BankAccountsFindAllResponse = z.infer; + + /** + * BankAccountsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const BankAccountsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "bankName", "createdAt", "updatedAt"]); + export type BankAccountsPaginateLabelsOrderParamEnum = z.infer; + export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * BankAccountsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const BankAccountsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type BankAccountsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/bankAccounts/bankAccounts.queries.ts b/test/generated/base/bankAccounts/bankAccounts.queries.ts new file mode 100644 index 0000000..5ac3804 --- /dev/null +++ b/test/generated/base/bankAccounts/bankAccounts.queries.ts @@ -0,0 +1,139 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BankAccountsAcl } from "./bankAccounts.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { BankAccountsModels } from "./bankAccounts.models"; +import { BankAccountsApi } from "./bankAccounts.api"; + +export namespace BankAccountsQueries { + export const moduleName = QueryModule.BankAccounts; + + export const keys = { + all: [moduleName] as const, + findAll: (search?: string, officeId?: string) => [...keys.all, "/bank-accounts/labels", search, officeId] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: BankAccountsModels.BankAccountFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/bank-accounts/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: BankAccountsModels.BankAccountFilterDto, + cursor?: string, + ) => [...keys.all, "/bank-accounts/labels/paginate", "infinite", limit, order, filter, cursor] as const, + }; + + /** + * Query `useFindAll` + * @summary List all bank accounts with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { string } object.officeId Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { search, officeId }: { search?: string; officeId?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search, officeId), + queryFn: () => { + checkAcl(BankAccountsAcl.canUseFindAll()); + return BankAccountsApi.findAll(search, officeId, config); + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate bank account labels (id and name only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` + * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: BankAccountsModels.BankAccountFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BankAccountsAcl.canUsePaginateLabels()); + return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate bank account labels (id and name only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` + * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: BankAccountsModels.BankAccountFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BankAccountsAcl.canUsePaginateLabels()); + return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts new file mode 100644 index 0000000..7fa63b1 --- /dev/null +++ b/test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts @@ -0,0 +1,123 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BookkeepingExportAcl { + /** + * Use for `useCreateBatch` mutation ability. For global ability, omit the object parameter. + * @description Create bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBatch` mutation + */ + export const canUseCreateBatch = (object?: { officeId: string }) => + ["Create", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Create", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `usePaginateBatches` query ability. For global ability, omit the object parameter. + * @description List bookkeeping export batches + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatches` query + */ + export const canUsePaginateBatches = (object?: { officeId: string }) => + ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Read", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useGetBatch` query ability. For global ability, omit the object parameter. + * @description Get bookkeeping export batch details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query + */ + export const canUseGetBatch = (object?: { officeId: string }) => + ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Read", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBatchFormat` mutation ability. For global ability, omit the object parameter. + * @description Update bookkeeping export batch format + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchFormat` mutation + */ + export const canUseUpdateBatchFormat = (object?: { officeId: string }) => + ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Update", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBatchItem` mutation ability. For global ability, omit the object parameter. + * @description Update bookkeeping export batch item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchItem` mutation + */ + export const canUseUpdateBatchItem = (object?: { officeId: string }) => + ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Update", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `usePaginateBatchItems` query ability. For global ability, omit the object parameter. + * @description List batch items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatchItems` query + */ + export const canUsePaginateBatchItems = (object?: { officeId: string }) => + ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Read", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useValidateBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Export bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useValidateBookkeepingBatch` mutation + */ + export const canUseValidateBookkeepingBatch = (object?: { officeId: string }) => + ["Export", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Export", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useExportBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Export bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportBookkeepingBatch` mutation + */ + export const canUseExportBookkeepingBatch = (object?: { officeId: string }) => + ["Export", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Export", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useRevertBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Revert bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertBookkeepingBatch` mutation + */ + export const canUseRevertBookkeepingBatch = (object?: { officeId: string }) => + ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Update", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useGetVatLineItems` query ability. For global ability, omit the object parameter. + * @description Get VAT line items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetVatLineItems` query + */ + export const canUseGetVatLineItems = (object?: { officeId: string }) => + ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Read", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; +} diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.api.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.api.ts new file mode 100644 index 0000000..07b2114 --- /dev/null +++ b/test/generated/base/bookkeepingExport/bookkeepingExport.api.ts @@ -0,0 +1,185 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; + +export namespace BookkeepingExportApi { + export const createBatch = ( + officeId: string, + data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, + `/offices/${officeId}/bookkeeping-exports`, + ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), + config, + ); + }; + + export const paginateBatches = ( + officeId: string, + limit: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, + `/offices/${officeId}/bookkeeping-exports`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const getBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, + `/offices/${officeId}/bookkeeping-exports/${batchId}`, + config, + ); + }; + + export const updateBatchFormat = ( + officeId: string, + batchId: string, + data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, + `/offices/${officeId}/bookkeeping-exports/${batchId}`, + ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), + config, + ); + }; + + export const updateBatchItem = ( + officeId: string, + batchId: string, + data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, + ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), + config, + ); + }; + + export const paginateBatchItems = ( + officeId: string, + batchId: string, + limit: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, + `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const validateBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, + undefined, + config, + ); + }; + + export const exportBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, + undefined, + config, + ); + }; + + export const revertBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, + undefined, + config, + ); + }; + + export const getVatLineItems = (officeId: string, batchId: string, order?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, + `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + }, + }, + ); + }; +} diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts new file mode 100644 index 0000000..da4a913 --- /dev/null +++ b/test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts @@ -0,0 +1,122 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; +import { BookkeepingExportQueries } from "./bookkeepingExport.queries"; +import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; + +export namespace BookkeepingExportConfigs { + export const bookkeepingExportsConfig = { + meta: { + title: "Bookkeeping Exports", + }, + readAll: { + acl: BookkeepingExportAcl.canUsePaginateBatches, + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, + paginated: BookkeepingExportQueries.usePaginateBatches, + infinite: BookkeepingExportQueries.usePaginateBatchesInfinite, + filters: { + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, + options: { + inputs: { + createdDate: true, + status: true, + format: true, + createdBy: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, + options: { + columns: { + id: true, + format: true, + status: true, + totalInvoiceCount: true, + exportedInvoiceCount: true, + createdBy: true, + createdAt: true, + exportedAt: true, + revertedAt: true, + files: true, + }, + sortable: BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema, + }, + }), + }, + read: { + acl: BookkeepingExportAcl.canUseGetBatch, + schema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema, + query: BookkeepingExportQueries.useGetBatch, + }, + create: { + acl: BookkeepingExportAcl.canUseCreateBatch, + schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, + mutation: BookkeepingExportQueries.useCreateBatch, + inputDefs: dynamicInputs({ + schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, + options: { + inputs: { + format: true, + invoiceFilters: true, + }, + }, + }), + }, + update: { + acl: BookkeepingExportAcl.canUseUpdateBatchFormat, + schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, + mutation: BookkeepingExportQueries.useUpdateBatchFormat, + inputDefs: dynamicInputs({ + schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, + options: { + inputs: { + format: true, + }, + }, + }), + }, + }; + + export const itemsConfig = { + meta: { + title: "Items", + }, + readAll: { + acl: BookkeepingExportAcl.canUsePaginateBatchItems, + schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, + paginated: BookkeepingExportQueries.usePaginateBatchItems, + infinite: BookkeepingExportQueries.usePaginateBatchItemsInfinite, + filters: { + schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, + options: { + inputs: { + status: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, + options: { + columns: { + id: true, + invoiceId: true, + status: true, + includedInExport: true, + validationIssues: true, + invoice: true, + receiver: true, + comments: true, + }, + sortable: BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.models.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.models.ts new file mode 100644 index 0000000..98765c8 --- /dev/null +++ b/test/generated/base/bookkeepingExport/bookkeepingExport.models.ts @@ -0,0 +1,466 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BookkeepingExportModels { + /** + * BookkeepingExportFormatEnumSchema + * @type { enum } + */ + export const BookkeepingExportFormatEnumSchema = z.enum(["Bmd", "BmdWithoutCost", "BmdHamburg", "Abra", "Pantheon"]); + export type BookkeepingExportFormatEnum = z.infer; + export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enum; + + /** + * CreateBookkeepingExportBatchRequestDtoSchema + * @type { object } + * @property { BookkeepingExportFormatEnum } format + * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters + */ + export const CreateBookkeepingExportBatchRequestDtoSchema = z + .object({ + format: BookkeepingExportFormatEnumSchema.nullish(), + invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema, + }) + .readonly(); + export type CreateBookkeepingExportBatchRequestDto = z.infer; + + /** + * BookkeepingExportFileTypeEnumSchema + * @type { enum } + */ + export const BookkeepingExportFileTypeEnumSchema = z.enum([ + "Invoices", + "BusinessPartners", + "Report", + "AbraAddressBook", + "AbraIssuedInvoices", + "AbraIssuedInvoiceItems", + "AbraReceivedInvoices", + "AbraReceivedInvoiceItems", + "PantheonInvoicesOutgoingEur", + "PantheonInvoicesOutgoingUsd", + "PantheonInvoicesIncomingEur", + "PantheonInvoicesIncomingUsd", + "PantheonCostCenters", + ]); + export type BookkeepingExportFileTypeEnum = z.infer; + export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema.enum; + + /** + * BookkeepingExportFileDtoSchema + * @type { object } + * @property { BookkeepingExportFileTypeEnum } variant + * @property { string } downloadUrl + * @property { string } fileName + */ + export const BookkeepingExportFileDtoSchema = z + .object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }) + .readonly(); + export type BookkeepingExportFileDto = z.infer; + + /** + * BookkeepingExportBatchStatusEnumSchema + * @type { enum } + */ + export const BookkeepingExportBatchStatusEnumSchema = z.enum([ + "Initializing", + "Preparing", + "Exported", + "Reverted", + "Failed", + ]); + export type BookkeepingExportBatchStatusEnum = z.infer; + export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnumSchema.enum; + + /** + * BookkeepingExportBatchSummaryDtoSchema + * @type { object } + * @property { number } totalCount + * @property { number } needsReviewCount + * @property { number } readyForExportCount + * @property { number } excludedCount + * @property { object } invoiceNumberRange + * @property { string } invoiceNumberRange.from + * @property { string } invoiceNumberRange.to + * @property { object } dateRange + * @property { string } dateRange.from + * @property { string } dateRange.to + */ + export const BookkeepingExportBatchSummaryDtoSchema = z + .object({ + totalCount: z.number(), + needsReviewCount: z.number(), + readyForExportCount: z.number(), + excludedCount: z.number(), + invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).readonly().nullish(), + dateRange: z + .object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }) + .readonly() + .nullish(), + }) + .readonly(); + export type BookkeepingExportBatchSummaryDto = z.infer; + + /** + * BookkeepingExportBatchDetailsDtoSchema + * @type { object } + * @property { string } id + * @property { BookkeepingExportFormatEnum } format + * @property { BookkeepingExportBatchStatusEnum } status + * @property { number } totalInvoiceCount + * @property { number } exportedInvoiceCount + * @property { object } createdBy + * @property { string } createdBy.id + * @property { string } createdBy.fullName + * @property { string } createdBy.email + * @property { string } createdAt + * @property { string } exportedAt + * @property { string } revertedAt + * @property { object } revertedBy + * @property { string } revertedBy.id + * @property { string } revertedBy.fullName + * @property { string } revertedBy.email + * @property { BookkeepingExportBatchSummaryDto } summary + * @property { BookkeepingExportFileDto[] } files + */ + export const BookkeepingExportBatchDetailsDtoSchema = z + .object({ + id: z.string(), + format: BookkeepingExportFormatEnumSchema, + status: BookkeepingExportBatchStatusEnumSchema, + totalInvoiceCount: z.number(), + exportedInvoiceCount: z.number(), + createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), + createdAt: z.iso.datetime({ offset: true }), + exportedAt: z.iso.datetime({ offset: true }).nullish(), + revertedAt: z.iso.datetime({ offset: true }).nullish(), + revertedBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly().nullish(), + summary: BookkeepingExportBatchSummaryDtoSchema, + files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish(), + }) + .readonly(); + export type BookkeepingExportBatchDetailsDto = z.infer; + + /** + * UpdateBookkeepingExportBatchRequestDtoSchema + * @type { object } + * @property { BookkeepingExportFormatEnum } format + */ + export const UpdateBookkeepingExportBatchRequestDtoSchema = z + .object({ format: BookkeepingExportFormatEnumSchema }) + .readonly(); + export type UpdateBookkeepingExportBatchRequestDto = z.infer; + + /** + * BookkeepingExportBatchPreviewDtoSchema + * @type { object } + * @property { string } id + * @property { BookkeepingExportFormatEnum } format + * @property { BookkeepingExportBatchStatusEnum } status + * @property { number } totalInvoiceCount + * @property { number } exportedInvoiceCount + * @property { object } createdBy + * @property { string } createdBy.id + * @property { string } createdBy.fullName + * @property { string } createdBy.email + * @property { string } createdAt + * @property { string } exportedAt + * @property { string } revertedAt + * @property { BookkeepingExportFileDto[] } files + */ + export const BookkeepingExportBatchPreviewDtoSchema = z + .object({ + id: z.string(), + format: BookkeepingExportFormatEnumSchema, + status: BookkeepingExportBatchStatusEnumSchema, + totalInvoiceCount: z.number(), + exportedInvoiceCount: z.number(), + createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), + createdAt: z.iso.datetime({ offset: true }), + exportedAt: z.iso.datetime({ offset: true }).nullish(), + revertedAt: z.iso.datetime({ offset: true }).nullish(), + files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish(), + }) + .readonly(); + export type BookkeepingExportBatchPreviewDto = z.infer; + + /** + * DateRangeSchema + * @type { object } + * @property { string } from + * @property { string } to + */ + export const DateRangeSchema = z + .object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }) + .readonly(); + export type DateRange = z.infer; + + /** + * BookkeepingExportBatchPreviewFilterDtoSchema + * @type { object } + * @property { DateRange } createdDate + * @property { BookkeepingExportBatchStatusEnum[] } status + * @property { BookkeepingExportFormatEnum[] } format + * @property { string[] } createdBy + */ + export const BookkeepingExportBatchPreviewFilterDtoSchema = z + .object({ + createdDate: DateRangeSchema, + status: z.array(BookkeepingExportBatchStatusEnumSchema).readonly(), + format: z.array(BookkeepingExportFormatEnumSchema).readonly(), + createdBy: z.array(z.string()).readonly(), + }) + .readonly(); + export type BookkeepingExportBatchPreviewFilterDto = z.infer; + + /** + * BookkeepingExportBatchItemStatusEnumSchema + * @type { enum } + */ + export const BookkeepingExportBatchItemStatusEnumSchema = z.enum([ + "Selected", + "NeedsReview", + "ReadyForExport", + "Exported", + "Excluded", + ]); + export type BookkeepingExportBatchItemStatusEnum = z.infer; + export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemStatusEnumSchema.enum; + + /** + * BookkeepingExportItemDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } invoiceId + * @property { BookkeepingExportBatchItemStatusEnum } status + * @property { boolean } includedInExport + * @property { string[] } validationIssues + * @property { object } invoice + * @property { string } invoice.invoiceNumber + * @property { string } invoice.issuingDate + * @property { string } invoice.currency + * @property { number } invoice.amount + * @property { number } invoice.tax + * @property { string[] } invoice.vatRules + * @property { object } receiver + * @property { string } receiver.id + * @property { string } receiver.name + * @property { string } receiver.matchCode + * @property { string } receiver.label + * @property { string } receiver.account + * @property { string } receiver.contraAccount + * @property { string } comments + */ + export const BookkeepingExportItemDetailDtoSchema = z + .object({ + id: z.string(), + invoiceId: z.string(), + status: BookkeepingExportBatchItemStatusEnumSchema, + includedInExport: z.boolean(), + validationIssues: z.array(z.string()).readonly().nullish(), + invoice: z + .object({ + invoiceNumber: z.string(), + issuingDate: z.iso.datetime({ offset: true }), + currency: z.string(), + amount: z.number(), + tax: z.number(), + vatRules: z.array(z.string()).readonly(), + }) + .readonly(), + receiver: z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string(), + account: z.string(), + contraAccount: z.string(), + }) + .readonly(), + comments: z.string().nullish(), + }) + .readonly(); + export type BookkeepingExportItemDetailDto = z.infer; + + /** + * BookkeepingExportItemDetailFilterDtoSchema + * @type { object } + * @property { BookkeepingExportBatchItemStatusEnum[] } status + */ + export const BookkeepingExportItemDetailFilterDtoSchema = z + .object({ status: z.array(BookkeepingExportBatchItemStatusEnumSchema).readonly() }) + .readonly(); + export type BookkeepingExportItemDetailFilterDto = z.infer; + + /** + * BookkeepingExportVatLineItemDtoSchema + * @type { object } + * @property { string } invoiceId + * @property { string } batchId + * @property { string } batchItemId + * @property { BookkeepingExportBatchItemStatusEnum } status + * @property { boolean } includedInExport + * @property { string[] } validationIssues + * @property { object } invoice + * @property { string } invoice.invoiceNumber + * @property { string } invoice.issuingDate + * @property { string } invoice.currency + * @property { number } invoice.amount + * @property { number } invoice.tax + * @property { string } invoice.comments + * @property { object } receiver + * @property { string } receiver.id + * @property { string } receiver.name + * @property { string } receiver.matchCode + * @property { string } receiver.label + * @property { string } receiver.account + * @property { string } receiver.contraAccount + * @property { number } vatPercentage + * @property { string } vatRule + * @property { number } netAmount + * @property { number } vatAmount + * @property { number } grossAmount + * @property { number } vatAmountInOfficeCurrency + * @property { number } netAmountInOfficeCurrency + * @property { number } grossAmountInOfficeCurrency + * @property { string } officeCurrency + */ + export const BookkeepingExportVatLineItemDtoSchema = z + .object({ + invoiceId: z.string(), + batchId: z.string(), + batchItemId: z.string(), + status: BookkeepingExportBatchItemStatusEnumSchema, + includedInExport: z.boolean(), + validationIssues: z.array(z.string()).readonly().nullish(), + invoice: z + .object({ + invoiceNumber: z.string(), + issuingDate: z.iso.datetime({ offset: true }), + currency: z.string(), + amount: z.number(), + tax: z.number(), + comments: z.string().nullish(), + }) + .readonly(), + receiver: z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string(), + account: z.string(), + contraAccount: z.string(), + }) + .readonly(), + vatPercentage: z.number(), + vatRule: z.string(), + netAmount: z.number(), + vatAmount: z.number(), + grossAmount: z.number(), + vatAmountInOfficeCurrency: z.number().nullish(), + netAmountInOfficeCurrency: z.number().nullish(), + grossAmountInOfficeCurrency: z.number().nullish(), + officeCurrency: z.string(), + }) + .readonly(); + export type BookkeepingExportVatLineItemDto = z.infer; + + /** + * CreateBookkeepingExportBatchResponseDtoSchema + * @type { object } + * @property { string } batchId + */ + export const CreateBookkeepingExportBatchResponseDtoSchema = z.object({ batchId: z.string() }).readonly(); + export type CreateBookkeepingExportBatchResponseDto = z.infer; + + /** + * UpdateBookkeepingExportBatchItemRequestDtoSchema + * @type { object } + * @property { boolean } includedInExport Whether the item should be included in the export + * @property { string[] } itemIds Min Items: `0` + * @property { boolean } vatOk + * @property { boolean } invoiceOk + */ + export const UpdateBookkeepingExportBatchItemRequestDtoSchema = z + .object({ + includedInExport: z.boolean().describe("Whether the item should be included in the export").nullish(), + itemIds: z.array(z.string()).readonly(), + vatOk: z.boolean().nullish(), + invoiceOk: z.boolean().nullish(), + }) + .readonly(); + export type UpdateBookkeepingExportBatchItemRequestDto = z.infer< + typeof UpdateBookkeepingExportBatchItemRequestDtoSchema + >; + + /** + * PaginateBatchesOrderParamEnumSchema + * @type { enum } + */ + export const PaginateBatchesOrderParamEnumSchema = z.enum(["createdAt", "status", "format", "totalInvoiceCount"]); + export type PaginateBatchesOrderParamEnum = z.infer; + export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema.enum; + + /** + * PaginateBatchesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookkeepingExportBatchPreviewDto[] } items + */ + export const PaginateBatchesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).readonly() }).readonly().shape, + }); + export type PaginateBatchesResponse = z.infer; + + /** + * PaginateBatchItemsOrderParamEnumSchema + * @type { enum } + */ + export const PaginateBatchItemsOrderParamEnumSchema = z.enum(["issuingDate"]); + export type PaginateBatchItemsOrderParamEnum = z.infer; + export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnumSchema.enum; + + /** + * PaginateBatchItemsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookkeepingExportItemDetailDto[] } items + */ + export const PaginateBatchItemsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).readonly() }).readonly().shape, + }); + export type PaginateBatchItemsResponse = z.infer; + + /** + * GetVatLineItemsOrderParamEnumSchema + * @type { enum } + */ + export const GetVatLineItemsOrderParamEnumSchema = z.enum([ + "account", + "contraAccount", + "issuingDate", + "invoiceNumber", + "receiver", + ]); + export type GetVatLineItemsOrderParamEnum = z.infer; + export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema.enum; + + /** + * GetVatLineItemsResponseSchema + * @type { array } + */ + export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema).readonly(); + export type GetVatLineItemsResponse = z.infer; +} diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts new file mode 100644 index 0000000..c7faed1 --- /dev/null +++ b/test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts @@ -0,0 +1,555 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; +import { BookkeepingExportApi } from "./bookkeepingExport.api"; + +export namespace BookkeepingExportQueries { + export const moduleName = QueryModule.BookkeepingExport; + + export const keys = { + all: [moduleName] as const, + paginateBatches: ( + officeId: string, + limit?: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/bookkeeping-exports", officeId, limit, order, filter, page, cursor] as const, + paginateBatchesInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/bookkeeping-exports", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + getBatch: (officeId: string, batchId: string) => + [...keys.all, "/offices/:officeId/bookkeeping-exports/:batchId", officeId, batchId] as const, + paginateBatchItems: ( + officeId: string, + batchId: string, + limit?: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", + officeId, + batchId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateBatchItemsInfinite: ( + officeId: string, + batchId: string, + limit?: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", + "infinite", + officeId, + batchId, + limit, + order, + filter, + cursor, + ] as const, + getVatLineItems: (officeId: string, batchId: string, order?: string) => + [ + ...keys.all, + "/offices/:officeId/bookkeeping-exports/batches/:batchId/vat-line-items", + officeId, + batchId, + order, + ] as const, + }; + + /** + * Mutation `useCreateBatch` + * @summary Create bookkeeping export batch + * @permission Requires `canUseCreateBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateBatch = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.createBatch, + { officeId: string; data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId })); + return BookkeepingExportApi.createBatch(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateBatches` + * @summary List bookkeeping export batches + * @permission Requires `canUsePaginateBatches` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` + * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateBatches = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId })); + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateBatchesInfinite + * @summary List bookkeeping export batches + * @permission Requires `canUsePaginateBatches` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` + * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateBatchesInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId })); + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetBatch` + * @summary Get bookkeeping export batch details + * @permission Requires `canUseGetBatch` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetBatch = ( + { officeId, batchId }: { officeId: string; batchId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBatch(officeId, batchId), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId })); + return BookkeepingExportApi.getBatch(officeId, batchId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateBatchFormat` + * @summary Update bookkeeping export batch format + * @permission Requires `canUseUpdateBatchFormat` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBatchFormat = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.updateBatchFormat, + { officeId: string; batchId: string; data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId, data }) => { + checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId })); + return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, batchId } = variables; + const updateKeys = [keys.getBatch(officeId, batchId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateBatchItem` + * @summary Update bookkeeping export batch item inclusion + * @permission Requires `canUseUpdateBatchItem` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBatchItem = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.updateBatchItem, + { officeId: string; batchId: string; data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId, data }) => { + checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId })); + return BookkeepingExportApi.updateBatchItem(officeId, batchId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateBatchItems` + * @summary List batch items with filters and pagination + * @permission Requires `canUsePaginateBatchItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` + * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateBatchItems = ( + { + officeId, + batchId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + batchId: string; + limit: number; + order?: string; + filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId })); + return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateBatchItemsInfinite + * @summary List batch items with filters and pagination + * @permission Requires `canUsePaginateBatchItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` + * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateBatchItemsInfinite = ( + { + officeId, + batchId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + batchId: string; + limit: number; + order?: string; + filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId })); + return BookkeepingExportApi.paginateBatchItems( + officeId, + batchId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useValidateBookkeepingBatch` + * @summary Validate bookkeeping batch + * @permission Requires `canUseValidateBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useValidateBookkeepingBatch = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.validateBookkeepingBatch, + { officeId: string; batchId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId })); + return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useExportBookkeepingBatch` + * @summary Export bookkeeping batch + * @permission Requires `canUseExportBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useExportBookkeepingBatch = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.exportBookkeepingBatch, + { officeId: string; batchId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId })); + return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useRevertBookkeepingBatch` + * @summary Revert bookkeeping export batch + * @permission Requires `canUseRevertBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useRevertBookkeepingBatch = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.revertBookkeepingBatch, + { officeId: string; batchId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId })); + return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetVatLineItems` + * @summary Get VAT line items for bookkeeping export batch + * @permission Requires `canUseGetVatLineItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): account, contraAccount, issuingDate, invoiceNumber, receiver. Example: `account` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetVatLineItems = ( + { officeId, batchId, order }: { officeId: string; batchId: string; order?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getVatLineItems(officeId, batchId, order), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId })); + return BookkeepingExportApi.getVatLineItems(officeId, batchId, order, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts new file mode 100644 index 0000000..016a650 --- /dev/null +++ b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnerBookkeepingMappingsAcl { + /** + * Use for `useGetBookkeepingMappings` query ability. For global ability, omit the object parameter. + * @description List business partner bookkeeping mappings + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBookkeepingMappings` query + */ + export const canUseGetBookkeepingMappings = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useCreateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Create business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBookkeepingMapping` mutation + */ + export const canUseCreateBookkeepingMapping = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< + "Update", + "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Update business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMapping` mutation + */ + export const canUseUpdateBookkeepingMapping = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< + "Update", + "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBookkeepingMappingById` mutation ability. For global ability, omit the object parameter. + * @description Update business partner bookkeeping mapping by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMappingById` mutation + */ + export const canUseUpdateBookkeepingMappingById = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< + "Update", + "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + >; + + /** + * Use for `useDeleteBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBookkeepingMapping` mutation + */ + export const canUseDeleteBookkeepingMapping = (object?: { officeId: string }) => + ["Delete", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< + "Delete", + "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + >; +} diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts new file mode 100644 index 0000000..ac6b120 --- /dev/null +++ b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts @@ -0,0 +1,72 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; + +export namespace BusinessPartnerBookkeepingMappingsApi { + export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + config, + ); + }; + + export const createBookkeepingMapping = ( + officeId: string, + businessPartnerId: string, + data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), + config, + ); + }; + + export const updateBookkeepingMapping = ( + officeId: string, + businessPartnerId: string, + data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), + config, + ); + }; + + export const updateBookkeepingMappingById = ( + officeId: string, + businessPartnerId: string, + id: string, + data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), + config, + ); + }; + + export const deleteBookkeepingMapping = ( + officeId: string, + businessPartnerId: string, + id: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts new file mode 100644 index 0000000..93818c1 --- /dev/null +++ b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts @@ -0,0 +1,94 @@ +import { z } from "zod"; + +export namespace BusinessPartnerBookkeepingMappingsModels { + /** + * BusinessPartnerBookkeepingMappingResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { string } businessPartnerId + * @property { boolean } paysTaxInEurForFactoring + */ + export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z + .object({ + id: z.string(), + debtorId: z.string().nullish(), + creditorId: z.string().nullish(), + currencyNotation: z.string().nullish(), + businessPartnerId: z.string(), + paysTaxInEurForFactoring: z.boolean().nullish(), + }) + .readonly(); + export type BusinessPartnerBookkeepingMappingResponseDto = z.infer< + typeof BusinessPartnerBookkeepingMappingResponseDtoSchema + >; + + /** + * BusinessPartnerBookkeepingMappingsResponseDtoSchema + * @type { object } + * @property { BusinessPartnerBookkeepingMappingResponseDto[] } bookkeepingMappings + */ + export const BusinessPartnerBookkeepingMappingsResponseDtoSchema = z + .object({ bookkeepingMappings: z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly() }) + .readonly(); + export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer< + typeof BusinessPartnerBookkeepingMappingsResponseDtoSchema + >; + + /** + * UpdateBookkeepingMappingDtoSchema + * @type { object } + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) + */ + export const UpdateBookkeepingMappingDtoSchema = z + .object({ + debtorId: z.string(), + creditorId: z.string(), + currencyNotation: z.string(), + paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)"), + }) + .readonly(); + export type UpdateBookkeepingMappingDto = z.infer; + + /** + * UpdateBookkeepingMappingRequestDtoSchema + * @type { object } + * @property { UpdateBookkeepingMappingDto[] } bookkeepingMappings + */ + export const UpdateBookkeepingMappingRequestDtoSchema = z + .object({ bookkeepingMappings: z.array(UpdateBookkeepingMappingDtoSchema).readonly() }) + .readonly(); + export type UpdateBookkeepingMappingRequestDto = z.infer; + + /** + * CreateBookkeepingMappingDtoSchema + * @type { object } + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) + */ + export const CreateBookkeepingMappingDtoSchema = z + .object({ + debtorId: z.string(), + creditorId: z.string(), + currencyNotation: z.string(), + paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)"), + }) + .readonly(); + export type CreateBookkeepingMappingDto = z.infer; + + /** + * UpdateBookkeepingMappingResponseSchema + * @type { array } + */ + export const UpdateBookkeepingMappingResponseSchema = z + .array(BusinessPartnerBookkeepingMappingResponseDtoSchema) + .readonly(); + export type UpdateBookkeepingMappingResponse = z.infer; +} diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts new file mode 100644 index 0000000..8b15dfc --- /dev/null +++ b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts @@ -0,0 +1,221 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnerBookkeepingMappingsAcl } from "./businessPartnerBookkeepingMappings.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; +import { BusinessPartnerBookkeepingMappingsApi } from "./businessPartnerBookkeepingMappings.api"; + +export namespace BusinessPartnerBookkeepingMappingsQueries { + export const moduleName = QueryModule.BusinessPartnerBookkeepingMappings; + + export const keys = { + all: [moduleName] as const, + getBookkeepingMappings: (officeId: string, businessPartnerId: string) => + [ + ...keys.all, + "/offices/:officeId/business-partners/:businessPartnerId/bookkeeping-mappings", + officeId, + businessPartnerId, + ] as const, + }; + + /** + * Query `useGetBookkeepingMappings` + * @summary Fetch all bookkeeping mappings for a business partner + * @permission Requires `canUseGetBookkeepingMappings` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetBookkeepingMappings = ( + { officeId, businessPartnerId }: { officeId: string; businessPartnerId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), + queryFn: () => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId })); + return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateBookkeepingMapping` + * @summary Create a bookkeeping mapping for a business partner + * @permission Requires `canUseCreateBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateBookkeepingMapping = ( + options?: AppMutationOptions< + typeof BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping, + { + officeId: string; + businessPartnerId: string; + data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId })); + return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping( + officeId, + businessPartnerId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateBookkeepingMapping` + * @summary Update an existing bookkeeping mapping for a business partner + * @permission Requires `canUseUpdateBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBookkeepingMapping = ( + options?: AppMutationOptions< + typeof BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping, + { + officeId: string; + businessPartnerId: string; + data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId })); + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping( + officeId, + businessPartnerId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateBookkeepingMappingById` + * @summary Update a specific bookkeeping mapping by ID for a business partner + * @permission Requires `canUseUpdateBookkeepingMappingById` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBookkeepingMappingById = ( + options?: AppMutationOptions< + typeof BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById, + { + officeId: string; + businessPartnerId: string; + id: string; + data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, id, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId })); + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById( + officeId, + businessPartnerId, + id, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteBookkeepingMapping` + * @summary Delete an existing bookkeeping mapping for a business partner + * @permission Requires `canUseDeleteBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteBookkeepingMapping = ( + options?: AppMutationOptions< + typeof BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping, + { officeId: string; businessPartnerId: string; id: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, id }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId })); + return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts new file mode 100644 index 0000000..908af98 --- /dev/null +++ b/test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnerContactsAcl { + /** + * Use for `useGetContacts` query ability. For global ability, omit the object parameter. + * @description List business partner contacts + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetContacts` query + */ + export const canUseGetContacts = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useCreateContact` mutation ability. For global ability, omit the object parameter. + * @description Create business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateContact` mutation + */ + export const canUseCreateContact = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `usePaginateContactLabels` query ability. For global ability, omit the object parameter. + * @description Paginate business partner contact labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateContactLabels` query + */ + export const canUsePaginateContactLabels = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdateContact` mutation ability. For global ability, omit the object parameter. + * @description Update business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateContact` mutation + */ + export const canUseUpdateContact = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useDeleteContact` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteContact` mutation + */ + export const canUseDeleteContact = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; +} diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts new file mode 100644 index 0000000..7a930b4 --- /dev/null +++ b/test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts @@ -0,0 +1,101 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; + +export namespace BusinessPartnerContactsApi { + export const getContacts = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, + config, + ); + }; + + export const createContact = ( + officeId: string, + businessPartnerId: string, + data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, + ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), + config, + ); + }; + + export const paginateContactLabels = ( + officeId: string, + businessPartnerId: string, + limit: number, + order?: string, + filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const updateContact = ( + contactId: string, + officeId: string, + businessPartnerId: string, + data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, + ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), + config, + ); + }; + + export const deleteContact = ( + contactId: string, + officeId: string, + businessPartnerId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts new file mode 100644 index 0000000..cf71eb6 --- /dev/null +++ b/test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts @@ -0,0 +1,41 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; +import { BusinessPartnerContactsQueries } from "./businessPartnerContacts.queries"; +import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; + +export namespace BusinessPartnerContactsConfigs { + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: BusinessPartnerContactsAcl.canUsePaginateContactLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: BusinessPartnerContactsQueries.usePaginateContactLabels, + infinite: BusinessPartnerContactsQueries.usePaginateContactLabelsInfinite, + filters: { + schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts new file mode 100644 index 0000000..875a0ca --- /dev/null +++ b/test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts @@ -0,0 +1,125 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BusinessPartnerContactsModels { + /** + * BusinessPartnerContactRoleEnumSchema + * @type { enum } + */ + export const BusinessPartnerContactRoleEnumSchema = z.enum([ + "General", + "CommercialManager", + "SystemEngineer", + "TechnicalEngineer", + "Logistics", + "Operations", + "Sales", + "Accounting", + "Invoice", + "Dunnings", + "Reclamations", + "Management", + ]); + export type BusinessPartnerContactRoleEnum = z.infer; + export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSchema.enum; + + /** + * BusinessPartnerContactResponseDTOSchema + * @type { object } + * @property { string } id Contact ID + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ + export const BusinessPartnerContactResponseDTOSchema = z + .object({ + id: z.string().describe("Contact ID"), + role: BusinessPartnerContactRoleEnumSchema.nullish(), + name: z.string().describe("Contact name").nullish(), + email: z.string().describe("Contact email").nullish(), + phone: z.string().describe("Contact phone").nullish(), + }) + .readonly(); + export type BusinessPartnerContactResponseDTO = z.infer; + + /** + * BusinessPartnerContactListResponseDTOSchema + * @type { object } + * @property { BusinessPartnerContactResponseDTO[] } contacts List of contacts + */ + export const BusinessPartnerContactListResponseDTOSchema = z + .object({ contacts: z.array(BusinessPartnerContactResponseDTOSchema).readonly().describe("List of contacts") }) + .readonly(); + export type BusinessPartnerContactListResponseDTO = z.infer; + + /** + * CreateBusinessPartnerContactRequestDTOSchema + * @type { object } + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ + export const CreateBusinessPartnerContactRequestDTOSchema = z + .object({ + role: BusinessPartnerContactRoleEnumSchema, + name: z.string().describe("Contact name"), + email: z.string().describe("Contact email"), + phone: z.string().describe("Contact phone"), + }) + .readonly(); + export type CreateBusinessPartnerContactRequestDTO = z.infer; + + /** + * UpdateBusinessPartnerContactRequestDTOSchema + * @type { object } + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ + export const UpdateBusinessPartnerContactRequestDTOSchema = z + .object({ + role: BusinessPartnerContactRoleEnumSchema, + name: z.string().describe("Contact name"), + email: z.string().describe("Contact email"), + phone: z.string().describe("Contact phone"), + }) + .readonly(); + export type UpdateBusinessPartnerContactRequestDTO = z.infer; + + /** + * BusinessPartnerContactFilterDtoSchema + * @type { object } + * @property { string } search Search by name, email, or phone + */ + export const BusinessPartnerContactFilterDtoSchema = z + .object({ search: z.string().describe("Search by name, email, or phone") }) + .readonly(); + export type BusinessPartnerContactFilterDto = z.infer; + + /** + * PaginateContactLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PaginateContactLabelsOrderParamEnumSchema = z.enum(["name", "role", "email", "createdAt", "updatedAt"]); + export type PaginateContactLabelsOrderParamEnum = z.infer; + export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderParamEnumSchema.enum; + + /** + * PaginateContactLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PaginateContactLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PaginateContactLabelsResponse = z.infer; +} diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts new file mode 100644 index 0000000..a29ac21 --- /dev/null +++ b/test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts @@ -0,0 +1,321 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; +import { BusinessPartnerContactsApi } from "./businessPartnerContacts.api"; + +export namespace BusinessPartnerContactsQueries { + export const moduleName = QueryModule.BusinessPartnerContacts; + + export const keys = { + all: [moduleName] as const, + getContacts: (officeId: string, businessPartnerId: string) => + [ + ...keys.all, + "/offices/:officeId/business-partners/:businessPartnerId/contacts", + officeId, + businessPartnerId, + ] as const, + paginateContactLabels: ( + officeId: string, + businessPartnerId: string, + limit?: number, + order?: string, + filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", + officeId, + businessPartnerId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateContactLabelsInfinite: ( + officeId: string, + businessPartnerId: string, + limit?: number, + order?: string, + filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", + "infinite", + officeId, + businessPartnerId, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useGetContacts` + * @summary Get all contacts for a business partner + * @permission Requires `canUseGetContacts` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetContacts = ( + { officeId, businessPartnerId }: { officeId: string; businessPartnerId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getContacts(officeId, businessPartnerId), + queryFn: () => { + checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId })); + return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateContact` + * @summary Create a new contact for a business partner + * @permission Requires `canUseCreateContact` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateContact = ( + options?: AppMutationOptions< + typeof BusinessPartnerContactsApi.createContact, + { + officeId: string; + businessPartnerId: string; + data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId })); + return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateContactLabels` + * @summary Paginate business partner contact labels (id and name only) + * @permission Requires `canUsePaginateContactLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` + * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateContactLabels = ( + { + officeId, + businessPartnerId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + businessPartnerId: string; + limit: number; + order?: string; + filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId })); + return BusinessPartnerContactsApi.paginateContactLabels( + officeId, + businessPartnerId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateContactLabelsInfinite + * @summary Paginate business partner contact labels (id and name only) + * @permission Requires `canUsePaginateContactLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` + * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateContactLabelsInfinite = ( + { + officeId, + businessPartnerId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + businessPartnerId: string; + limit: number; + order?: string; + filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId })); + return BusinessPartnerContactsApi.paginateContactLabels( + officeId, + businessPartnerId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateContact` + * @summary Update a business partner contact + * @permission Requires `canUseUpdateContact` ability + * @param { string } mutation.contactId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateContact = ( + options?: AppMutationOptions< + typeof BusinessPartnerContactsApi.updateContact, + { + contactId: string; + officeId: string; + businessPartnerId: string; + data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId })); + return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteContact` + * @permission Requires `canUseDeleteContact` ability + * @param { string } mutation.contactId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 204, 401] + */ + export const useDeleteContact = ( + options?: AppMutationOptions< + typeof BusinessPartnerContactsApi.deleteContact, + { contactId: string; officeId: string; businessPartnerId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ contactId, officeId, businessPartnerId }) => { + checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId })); + return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/businessPartners/businessPartners.acl.ts b/test/generated/base/businessPartners/businessPartners.acl.ts new file mode 100644 index 0000000..3139313 --- /dev/null +++ b/test/generated/base/businessPartners/businessPartners.acl.ts @@ -0,0 +1,243 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnersAcl { + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List business partners + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Create", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Paginate business partner labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Read business partner details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ + export const canUseGetById = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Archive", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Archive", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useLock` mutation ability. For global ability, omit the object parameter. + * @description Lock business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLock` mutation + */ + export const canUseLock = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUnlock` mutation ability. For global ability, omit the object parameter. + * @description Unlock business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlock` mutation + */ + export const canUseUnlock = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useGetRemarks` query ability. For global ability, omit the object parameter. + * @description List business partner remarks + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetRemarks` query + */ + export const canUseGetRemarks = (object?: { officeId: string }) => + ["ReadRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "ReadRemark", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useCreateRemark` mutation ability. For global ability, omit the object parameter. + * @description Create business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRemark` mutation + */ + export const canUseCreateRemark = (object?: { officeId: string }) => + ["CreateRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "CreateRemark", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdateRemark` mutation ability. For global ability, omit the object parameter. + * @description Update business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRemark` mutation + */ + export const canUseUpdateRemark = (object?: { officeId: string }) => + ["UpdateRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "UpdateRemark", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useDeleteRemark` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemark` mutation + */ + export const canUseDeleteRemark = (object?: { officeId: string }) => + ["DeleteRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "DeleteRemark", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useGetBasicInfo` query ability. For global ability, omit the object parameter. + * @description Read business partner basic info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBasicInfo` query + */ + export const canUseGetBasicInfo = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBasicInfo` mutation ability. For global ability, omit the object parameter. + * @description Update business partner basic info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBasicInfo` mutation + */ + export const canUseUpdateBasicInfo = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab"] as AbilityTuple< + "Update", + "BusinessPartnerBasicTab" | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) + >; + + /** + * Use for `useCreateSignatureUploadInstructions` mutation ability. For global ability, omit the object parameter. + * @description Create business partner signature upload instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateSignatureUploadInstructions` mutation + */ + export const canUseCreateSignatureUploadInstructions = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab"] as AbilityTuple< + "Update", + "BusinessPartnerBasicTab" | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) + >; + + /** + * Use for `useGetCargoAgentInfo` query ability. For global ability, omit the object parameter. + * @description Read business partner cargo agent info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoAgentInfo` query + */ + export const canUseGetCargoAgentInfo = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCargoAgent` mutation ability. For global ability, omit the object parameter. + * @description Update business partner cargo agent info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargoAgent` mutation + */ + export const canUseUpdateCargoAgent = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useGetCarrierInformation` query ability. For global ability, omit the object parameter. + * @description Read business partner carrier info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCarrierInformation` query + */ + export const canUseGetCarrierInformation = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCarrier` mutation ability. For global ability, omit the object parameter. + * @description Update business partner carrier info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCarrier` mutation + */ + export const canUseUpdateCarrier = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; +} diff --git a/test/generated/base/businessPartners/businessPartners.api.ts b/test/generated/base/businessPartners/businessPartners.api.ts new file mode 100644 index 0000000..e374b3c --- /dev/null +++ b/test/generated/base/businessPartners/businessPartners.api.ts @@ -0,0 +1,286 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnersModels } from "./businessPartners.models"; + +export namespace BusinessPartnersApi { + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, + `/offices/${officeId}/business-partners`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = ( + officeId: string, + data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, + `/offices/${officeId}/business-partners`, + ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), + config, + ); + }; + + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, + `/offices/${officeId}/business-partners/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const getById = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}`, + config, + ); + }; + + export const update = ( + officeId: string, + id: string, + data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), + config, + ); + }; + + export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/unarchive`, + undefined, + config, + ); + }; + + export const lock = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/lock`, + undefined, + config, + ); + }; + + export const unlock = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/unlock`, + undefined, + config, + ); + }; + + export const getRemarks = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, + `/offices/${officeId}/business-partners/${id}/remarks`, + config, + ); + }; + + export const createRemark = ( + officeId: string, + id: string, + data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/remarks`, + ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), + config, + ); + }; + + export const updateRemark = ( + officeId: string, + id: string, + remarkId: string, + data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), + config, + ); + }; + + export const deleteRemark = (officeId: string, id: string, remarkId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, + undefined, + config, + ); + }; + + export const getBasicInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic`, + config, + ); + }; + + export const updateBasicInfo = ( + officeId: string, + id: string, + data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), + config, + ); + }; + + export const createSignatureUploadInstructions = ( + officeId: string, + id: string, + data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, + ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), + config, + ); + }; + + export const getCargoAgentInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/cargo-agent`, + config, + ); + }; + + export const updateCargoAgent = ( + officeId: string, + id: string, + data: BusinessPartnersModels.UpdateCargoAgentDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/cargo-agent`, + ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), + config, + ); + }; + + export const getCarrierInformation = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/carrier`, + config, + ); + }; + + export const updateCarrier = ( + officeId: string, + id: string, + data: BusinessPartnersModels.UpdateCarrierDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/carrier`, + ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/businessPartners/businessPartners.configs.ts b/test/generated/base/businessPartners/businessPartners.configs.ts new file mode 100644 index 0000000..3ba3ac7 --- /dev/null +++ b/test/generated/base/businessPartners/businessPartners.configs.ts @@ -0,0 +1,148 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { BusinessPartnersModels } from "./businessPartners.models"; +import { BusinessPartnersQueries } from "./businessPartners.queries"; +import { BusinessPartnersAcl } from "./businessPartners.acl"; + +export namespace BusinessPartnersConfigs { + export const businessPartnersConfig = { + meta: { + title: "Business Partners", + }, + readAll: { + acl: BusinessPartnersAcl.canUsePaginate, + schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, + paginated: BusinessPartnersQueries.usePaginate, + infinite: BusinessPartnersQueries.usePaginateInfinite, + filters: { + schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, + options: { + inputs: { + search: true, + types: true, + shortName: true, + name: true, + vat: true, + debtorId: true, + creditorId: true, + matchCode: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + address: true, + types: true, + archived: true, + shortName: true, + vat: true, + debtorId: true, + creditorId: true, + locked: true, + currency: true, + remarks: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: BusinessPartnersAcl.canUseGetById, + schema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema, + query: BusinessPartnersQueries.useGetById, + }, + create: { + acl: BusinessPartnersAcl.canUseCreate, + schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, + mutation: BusinessPartnersQueries.useCreate, + inputDefs: dynamicInputs({ + schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, + options: { + inputs: { + name: true, + secondaryName: true, + types: true, + matchCode: true, + shortName: true, + address: true, + }, + }, + }), + }, + update: { + acl: BusinessPartnersAcl.canUseUpdate, + schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, + mutation: BusinessPartnersQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + secondaryName: true, + types: true, + address: true, + blAddress: true, + belongsToId: true, + salesRepId: true, + operationsId: true, + addressIsDifferentForBl: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: BusinessPartnersAcl.canUsePaginateLabels, + schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, + paginated: BusinessPartnersQueries.usePaginateLabels, + infinite: BusinessPartnersQueries.usePaginateLabelsInfinite, + filters: { + schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, + options: { + inputs: { + search: true, + ids: true, + types: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + types: true, + }, + sortable: BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/businessPartners/businessPartners.models.ts b/test/generated/base/businessPartners/businessPartners.models.ts new file mode 100644 index 0000000..c247589 --- /dev/null +++ b/test/generated/base/businessPartners/businessPartners.models.ts @@ -0,0 +1,814 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BusinessPartnersModels { + /** + * RemarkVisibilitySchema + * @type { enum } + */ + export const RemarkVisibilitySchema = z.enum(["internal", "popup"]); + export type RemarkVisibility = z.infer; + export const RemarkVisibility = RemarkVisibilitySchema.enum; + + /** + * RemarkTypeSchema + * @type { enum } + */ + export const RemarkTypeSchema = z.enum(["INFORMATIONAL", "WARNING"]); + export type RemarkType = z.infer; + export const RemarkType = RemarkTypeSchema.enum; + + /** + * BusinessPartnerRemarkResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the remark + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of the remark + */ + export const BusinessPartnerRemarkResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the remark"), + visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), + content: z.string().describe("Content of the remark"), + type: RemarkTypeSchema.describe("Type of the remark"), + }) + .readonly(); + export type BusinessPartnerRemarkResponseDTO = z.infer; + + /** + * BusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { string } city City name + * @property { string } isoCode Country code + */ + export const BusinessPartnerAddressDtoSchema = z + .object({ + street: z.string().describe("Street address"), + zip: z.string().describe("ZIP/Postal code"), + city: z.string().describe("City name"), + isoCode: z.string().describe("Country code"), + }) + .readonly(); + export type BusinessPartnerAddressDto = z.infer; + + /** + * BusinessPartnerEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const BusinessPartnerEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type BusinessPartnerEmployeeDTO = z.infer; + + /** + * BusinessPartnerListResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + * @property { string } matchCode Match code of the business partner + * @property { BusinessPartnerAddressDto } address Address information + * @property { CommonModels.BusinessPartnerType[] } types List of business partner types + * @property { boolean } archived Archive status + * @property { string } shortName Short name of the business partner + * @property { string } vat VAT number of the business partner + * @property { string } debtorId Debtor ID for the local currency + * @property { string } creditorId Creditor ID for the local currency + * @property { boolean } locked Whether the business partner is locked + * @property { string } currency Currency (invoice currency) + * @property { BusinessPartnerRemarkResponseDTO[] } remarks Remarks for the business partner + * @property { string } createdById ID of the employee who created this business partner + * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this business partner + * @property { string } createdAt Date when the business partner was created + * @property { string } updatedById ID of the employee who last updated this business partner + * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this business partner + * @property { string } updatedAt Date when the business partner was last updated + */ + export const BusinessPartnerListResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the business partner"), + name: z.string().describe("Name of the business partner"), + matchCode: z.string().describe("Match code of the business partner"), + address: BusinessPartnerAddressDtoSchema.describe("Address information"), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), + archived: z.boolean().describe("Archive status"), + shortName: z.string().describe("Short name of the business partner").nullish(), + vat: z.string().describe("VAT number of the business partner").nullish(), + debtorId: z.string().describe("Debtor ID for the local currency").nullish(), + creditorId: z.string().describe("Creditor ID for the local currency").nullish(), + locked: z.boolean().describe("Whether the business partner is locked"), + currency: z.string().describe("Currency (invoice currency)").nullish(), + remarks: z.array(BusinessPartnerRemarkResponseDTOSchema).readonly().describe("Remarks for the business partner"), + createdById: z.string().describe("ID of the employee who created this business partner").nullish(), + createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this business partner").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was created"), + updatedById: z.string().describe("ID of the employee who last updated this business partner").nullish(), + updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this business partner").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was last updated"), + }) + .readonly(); + export type BusinessPartnerListResponseDTO = z.infer; + + /** + * BusinessPartnerFilterDtoSchema + * @type { object } + * @property { string } search + * @property { CommonModels.BusinessPartnerType[] } types + * @property { string } shortName + * @property { string } name + * @property { string } vat + * @property { string } debtorId + * @property { string } creditorId + * @property { string } matchCode + * @property { boolean } archived Filter by archived status + */ + export const BusinessPartnerFilterDtoSchema = z + .object({ + search: z.string(), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly(), + shortName: z.string(), + name: z.string(), + vat: z.string(), + debtorId: z.string(), + creditorId: z.string(), + matchCode: z.string(), + archived: z.boolean().describe("Filter by archived status"), + }) + .readonly(); + export type BusinessPartnerFilterDto = z.infer; + + /** + * BusinessPartnerPaginatedLabelResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } label Label of the business partner + * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types + */ + export const BusinessPartnerPaginatedLabelResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the business partner"), + label: z.string().describe("Label of the business partner"), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types"), + }) + .readonly(); + export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; + + /** + * BusinessPartnerLabelsFilterDtoSchema + * @type { object } + * @property { string } search + * @property { string[] } ids Business partner ids to filter by + * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types to filter by + * @property { boolean } archived Filter by archived status + */ + export const BusinessPartnerLabelsFilterDtoSchema = z + .object({ + search: z.string(), + ids: z.array(z.string()).readonly().describe("Business partner ids to filter by"), + types: z + .array(CommonModels.BusinessPartnerTypeSchema) + .readonly() + .describe("Array of business partner types to filter by"), + archived: z.boolean().describe("Filter by archived status"), + }) + .readonly(); + export type BusinessPartnerLabelsFilterDto = z.infer; + + /** + * CreateBusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } district + * @property { string } countryId + */ + export const CreateBusinessPartnerAddressDtoSchema = z + .object({ + street: z.string(), + secondaryStreet: z.string(), + zip: z.string(), + cityId: z.string(), + district: z.string(), + countryId: z.string(), + }) + .readonly(); + export type CreateBusinessPartnerAddressDto = z.infer; + + /** + * CreateBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } name Full name of the business partner. Min Length: `3` + * @property { string } secondaryName Full name of the business partner. Min Length: `3` + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { string } matchCode Unique identifier code + * @property { string } shortName Short name for the business partner + * @property { CreateBusinessPartnerAddressDto } address Address information + */ + export const CreateBusinessPartnerRequestDTOSchema = z + .object({ + name: z.string().min(3).describe("Full name of the business partner"), + secondaryName: z.string().min(3).describe("Full name of the business partner").nullish(), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), + matchCode: z.string().describe("Unique identifier code").nullish(), + shortName: z.string().describe("Short name for the business partner").nullish(), + address: CreateBusinessPartnerAddressDtoSchema.describe("Address information").nullish(), + }) + .readonly(); + export type CreateBusinessPartnerRequestDTO = z.infer; + + /** + * BusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { string } rootFolderId Root folder identifier associated with this business partner + */ + export const BusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the business partner"), + name: z.string().describe("Name of the business partner"), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), + rootFolderId: z.string().describe("Root folder identifier associated with this business partner").nullish(), + }) + .readonly(); + export type BusinessPartnerResponseDTO = z.infer; + + /** + * BusinessPartnerLabelResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + */ + export const BusinessPartnerLabelResponseDtoSchema = z + .object({ + id: z.string().describe("Unique identifier of the business partner"), + name: z.string().describe("Name of the business partner"), + }) + .readonly(); + export type BusinessPartnerLabelResponseDto = z.infer; + + /** + * ContactResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the contact + * @property { string } name Name of the contact + */ + export const ContactResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the contact"), + name: z.string().describe("Name of the contact"), + }) + .readonly(); + export type ContactResponseDTO = z.infer; + + /** + * BusinessPartnerDetailResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } createdById ID of the employee who created this record + * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this record + * @property { string } createdAt Creation timestamp + * @property { string } updatedById ID of the employee who last updated this record + * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this record + * @property { string } updatedAt Last update timestamp + * @property { string } matchCode Match code of the business partner + * @property { string } shortName Short name + * @property { string } name Full name + * @property { string } secondaryName Secondary name + * @property { CommonModels.BusinessPartnerType[] } types List of business partner types + * @property { boolean } archived Archived status + * @property { CommonModels.BusinessPartnerAddressResponseDTO } address Main address information + * @property { CommonModels.BusinessPartnerAddressResponseDTO } blAddress BL address information + * @property { BusinessPartnerLabelResponseDto[] } similar Similar named business partners + * @property { boolean } locked + * @property { boolean } addressIsDifferentForBl + * @property { string } lockedById Unique identifier of the employee who locked the business partner + * @property { string } lockedByName + * @property { string } lockedAt Unique identifier of the employee who locked the business partner + * @property { ContactResponseDTO } belongsTo Parent business partner + * @property { ContactResponseDTO } salesRep Sales representative + * @property { ContactResponseDTO } operations Operations contact + */ + export const BusinessPartnerDetailResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the business partner"), + createdById: z.string().describe("ID of the employee who created this record").nullish(), + createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this record").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Creation timestamp"), + updatedById: z.string().describe("ID of the employee who last updated this record").nullish(), + updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this record").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Last update timestamp"), + matchCode: z.string().describe("Match code of the business partner"), + shortName: z.string().describe("Short name"), + name: z.string().describe("Full name"), + secondaryName: z.string().describe("Secondary name"), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), + archived: z.boolean().describe("Archived status"), + address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information"), + blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("BL address information"), + similar: z + .array(BusinessPartnerLabelResponseDtoSchema) + .readonly() + .describe("Similar named business partners") + .nullish(), + locked: z.boolean(), + addressIsDifferentForBl: z.boolean(), + lockedById: z.string().describe("Unique identifier of the employee who locked the business partner").nullish(), + lockedByName: z.string().nullish(), + lockedAt: z.iso + .datetime({ offset: true }) + .describe("Unique identifier of the employee who locked the business partner") + .nullish(), + belongsTo: ContactResponseDTOSchema.describe("Parent business partner"), + salesRep: ContactResponseDTOSchema.describe("Sales representative"), + operations: ContactResponseDTOSchema.describe("Operations contact"), + }) + .readonly(); + export type BusinessPartnerDetailResponseDTO = z.infer; + + /** + * UpdateBusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } district + * @property { string } countryId + */ + export const UpdateBusinessPartnerAddressDtoSchema = z + .object({ + street: z.string(), + secondaryStreet: z.string(), + zip: z.string(), + cityId: z.string().nullable(), + district: z.string(), + countryId: z.string(), + }) + .readonly(); + export type UpdateBusinessPartnerAddressDto = z.infer; + + /** + * UpdateBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code + * @property { string } shortName Updated short name + * @property { string } name Updated full name + * @property { string } secondaryName Updated secondary name + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { UpdateBusinessPartnerAddressDto } address Address information + * @property { UpdateBusinessPartnerAddressDto } blAddress Bl address information + * @property { string } belongsToId Parent business partner + * @property { string } salesRepId Sales representative + * @property { string } operationsId Operations contact + * @property { boolean } addressIsDifferentForBl Different address for BL + */ + export const UpdateBusinessPartnerRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Updated match code"), + shortName: z.string().describe("Updated short name"), + name: z.string().describe("Updated full name"), + secondaryName: z.string().describe("Updated secondary name"), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), + address: UpdateBusinessPartnerAddressDtoSchema.describe("Address information"), + blAddress: UpdateBusinessPartnerAddressDtoSchema.describe("Bl address information"), + belongsToId: z.string().describe("Parent business partner"), + salesRepId: z.string().describe("Sales representative"), + operationsId: z.string().describe("Operations contact"), + addressIsDifferentForBl: z.boolean().describe("Different address for BL"), + }) + .readonly(); + export type UpdateBusinessPartnerRequestDTO = z.infer; + + /** + * CreateBusinessPartnerRemarkRequestDTOSchema + * @type { object } + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of remark + */ + export const CreateBusinessPartnerRemarkRequestDTOSchema = z + .object({ + visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), + content: z.string().describe("Content of the remark"), + type: RemarkTypeSchema.describe("Type of remark"), + }) + .readonly(); + export type CreateBusinessPartnerRemarkRequestDTO = z.infer; + + /** + * UpdateBusinessPartnerRemarkRequestDtoSchema + * @type { object } + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of remark + */ + export const UpdateBusinessPartnerRemarkRequestDtoSchema = z + .object({ + visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), + content: z.string().describe("Content of the remark"), + type: RemarkTypeSchema.describe("Type of remark"), + }) + .readonly(); + export type UpdateBusinessPartnerRemarkRequestDto = z.infer; + + /** + * AccountTypeEnumSchema + * @type { enum } + */ + export const AccountTypeEnumSchema = z.enum([ + "Direct Account", + "Logistic Provider / Forwarder", + "4PL/NVOCC", + "LLP", + "Carrier", + "Service Provider (other)", + "Strategic", + "Key Account", + "Transactional", + "Agent", + "Other", + ]); + export type AccountTypeEnum = z.infer; + export const AccountTypeEnum = AccountTypeEnumSchema.enum; + + /** + * BusinessPartnerAuthorizationSchema + * @type { enum } + */ + export const BusinessPartnerAuthorizationSchema = z.enum(["requiresApproval", "blocked", "regularBusinessPartner"]); + export type BusinessPartnerAuthorization = z.infer; + export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.enum; + + /** + * BusinessPartnerPaymentTermsResponseDtoSchema + * @type { object } + * @property { string } relativeTo + * @property { number } days Minimum: `0` + */ + export const BusinessPartnerPaymentTermsResponseDtoSchema = z + .object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }) + .readonly(); + export type BusinessPartnerPaymentTermsResponseDto = z.infer; + + /** + * BusinessPartnerBankAccountResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const BusinessPartnerBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type BusinessPartnerBankAccountResponseDto = z.infer; + + /** + * PartnerNetworkInfoDtoSchema + * @type { object } + * @property { string } id Partner network ID + * @property { string } name Partner network name + */ + export const PartnerNetworkInfoDtoSchema = z + .object({ id: z.string().describe("Partner network ID"), name: z.string().describe("Partner network name") }) + .readonly(); + export type PartnerNetworkInfoDto = z.infer; + + /** + * BusinessPartnerBasicResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Reference to the business partner + * @property { string[] } relationship List of relationships + * @property { AccountTypeEnum } accountType + * @property { string } vat VAT number + * @property { string } legacySystemId Legacy system (move) id + * @property { string } registrationNumber + * @property { string } eori EORI number + * @property { BusinessPartnerAuthorization } authorization Authorization status + * @property { number } creditLimit Credit limit + * @property { string } invoiceLanguage Invoice language + * @property { string } invoiceCurrency Invoice currency + * @property { string } iban IBAN + * @property { string } bankNumber Bank number + * @property { string } bankAccountNumber Bank account number + * @property { BusinessPartnerPaymentTermsResponseDto } termsExport + * @property { BusinessPartnerPaymentTermsResponseDto } termsImport + * @property { CommonModels.EditorContentResponseDto } notes Notes + * @property { string } bankAccountId + * @property { BusinessPartnerBankAccountResponseDto } bankAccount + * @property { PartnerNetworkInfoDto[] } partnerNetworks Partner networks + * @property { string } dunningSystemId + * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem + * @property { string } hblIssuerSigner HBL issuer/signer prefill + * @property { string } signatureFileAttachmentId Signature file attachment ID + * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment + */ + export const BusinessPartnerBasicResponseDTOSchema = z + .object({ + businessPartnerId: z.string().describe("Reference to the business partner"), + relationship: z.array(z.string()).readonly().describe("List of relationships"), + accountType: AccountTypeEnumSchema.nullish(), + vat: z.string().describe("VAT number"), + legacySystemId: z.string().describe("Legacy system (move) id").nullish(), + registrationNumber: z.string().nullish(), + eori: z.string().describe("EORI number"), + authorization: BusinessPartnerAuthorizationSchema.describe("Authorization status").nullable(), + creditLimit: z.number().describe("Credit limit"), + invoiceLanguage: z.string().describe("Invoice language"), + invoiceCurrency: z.string().describe("Invoice currency"), + iban: z.string().describe("IBAN"), + bankNumber: z.string().describe("Bank number"), + bankAccountNumber: z.string().describe("Bank account number"), + termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, + termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, + notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), + bankAccountId: z.string().nullish(), + bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), + partnerNetworks: z.array(PartnerNetworkInfoDtoSchema).readonly().describe("Partner networks"), + dunningSystemId: z.string().nullish(), + dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), + hblIssuerSigner: z.string().describe("HBL issuer/signer prefill"), + signatureFileAttachmentId: z.string().describe("Signature file attachment ID"), + signatureFileAttachmentUrl: z.string().describe("Signed URL for signature file attachment").nullish(), + }) + .readonly(); + export type BusinessPartnerBasicResponseDTO = z.infer; + + /** + * UpdateBusinessPartnerPaymentTermsDtoSchema + * @type { object } + * @property { string } relativeTo + * @property { number } days Minimum: `0` + */ + export const UpdateBusinessPartnerPaymentTermsDtoSchema = z + .object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }) + .readonly(); + export type UpdateBusinessPartnerPaymentTermsDto = z.infer; + + /** + * UpdateBusinessPartnerBasicRequestDTOSchema + * @type { object } + * @property { string[] } relationship Updated relationships + * @property { string } vat Updated VAT number + * @property { string } eori Updated EORI number + * @property { AccountTypeEnum } accountType + * @property { BusinessPartnerAuthorization } authorization Updated authorization status + * @property { number } creditLimit Updated credit limit + * @property { string } invoiceLanguage Invoice language + * @property { string } invoiceCurrency Invoice currency + * @property { string } iban IBAN + * @property { string } bankNumber Bank number + * @property { string } bankAccountNumber Bank account number + * @property { string } legacySystemId Legacy system (move) id + * @property { string } registrationNumber + * @property { UpdateBusinessPartnerPaymentTermsDto } termsExport + * @property { UpdateBusinessPartnerPaymentTermsDto } termsImport + * @property { CommonModels.EditorContentUpdateDto } notes Notes + * @property { string } bankAccountId + * @property { string[] } partnerNetworkIds Partner network IDs + * @property { string } dunningSystemId Dunning system ID + * @property { string } hblIssuerSigner HBL issuer/signer prefill + * @property { string } signatureFileAttachmentId Signature file attachment ID + */ + export const UpdateBusinessPartnerBasicRequestDTOSchema = z + .object({ + relationship: z.array(z.string()).readonly().describe("Updated relationships"), + vat: z.string().describe("Updated VAT number"), + eori: z.string().describe("Updated EORI number"), + accountType: AccountTypeEnumSchema, + authorization: BusinessPartnerAuthorizationSchema.describe("Updated authorization status"), + creditLimit: z.number().describe("Updated credit limit"), + invoiceLanguage: z.string().describe("Invoice language"), + invoiceCurrency: z.string().describe("Invoice currency"), + iban: z.string().describe("IBAN"), + bankNumber: z.string().describe("Bank number"), + bankAccountNumber: z.string().describe("Bank account number"), + legacySystemId: z.string().describe("Legacy system (move) id"), + registrationNumber: z.string(), + termsExport: UpdateBusinessPartnerPaymentTermsDtoSchema, + termsImport: UpdateBusinessPartnerPaymentTermsDtoSchema, + notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), + bankAccountId: z.string().nullable(), + partnerNetworkIds: z.array(z.string()).readonly().describe("Partner network IDs"), + dunningSystemId: z.string().describe("Dunning system ID").nullable(), + hblIssuerSigner: z.string().describe("HBL issuer/signer prefill").nullable(), + signatureFileAttachmentId: z.string().describe("Signature file attachment ID").nullable(), + }) + .readonly(); + export type UpdateBusinessPartnerBasicRequestDTO = z.infer; + + /** + * BusinessPartnerSignatureUploadRequestDTOSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType Mime type + * @property { number } fileSize File size in bytes. Minimum: `1` + */ + export const BusinessPartnerSignatureUploadRequestDTOSchema = z + .object({ + fileName: z.string().describe("File name"), + mimeType: z.string().describe("Mime type"), + fileSize: z.number().gte(1).describe("File size in bytes"), + }) + .readonly(); + export type BusinessPartnerSignatureUploadRequestDTO = z.infer; + + /** + * BusinessPartnerSignatureUploadResponseDTOSchema + * @type { object } + * @property { string } mediaId Media ID for the uploaded signature + * @property { string } method HTTP method to use for upload + * @property { string } url URL to upload the file to + */ + export const BusinessPartnerSignatureUploadResponseDTOSchema = z + .object({ + mediaId: z.string().describe("Media ID for the uploaded signature"), + method: z.string().describe("HTTP method to use for upload"), + url: z.string().describe("URL to upload the file to"), + }) + .readonly(); + export type BusinessPartnerSignatureUploadResponseDTO = z.infer< + typeof BusinessPartnerSignatureUploadResponseDTOSchema + >; + + /** + * CargoAgentResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Business partner identifier + * @property { string } portOfHamburgAccountNumber Port of Hamburg account number + * @property { string } iataAccountNumber IATA account number + * @property { string } regulatedAgentCode Regulated agent code + */ + export const CargoAgentResponseDTOSchema = z + .object({ + businessPartnerId: z.string().describe("Business partner identifier"), + portOfHamburgAccountNumber: z.string().describe("Port of Hamburg account number"), + iataAccountNumber: z.string().describe("IATA account number"), + regulatedAgentCode: z.string().describe("Regulated agent code"), + }) + .readonly(); + export type CargoAgentResponseDTO = z.infer; + + /** + * UpdateCargoAgentDTOSchema + * @type { object } + * @property { string } portOfHamburgAccountNumber Hamburg port account number + * @property { string } iataAccountNumber IATA account number + * @property { string } regulatedAgentCode Regulated agent code + */ + export const UpdateCargoAgentDTOSchema = z + .object({ + portOfHamburgAccountNumber: z.string().describe("Hamburg port account number"), + iataAccountNumber: z.string().describe("IATA account number"), + regulatedAgentCode: z.string().describe("Regulated agent code"), + }) + .readonly(); + export type UpdateCargoAgentDTO = z.infer; + + /** + * CarrierResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Business partner identifier + * @property { string } scac SCAC code + * @property { string } iataAirlinePrefix IATA airline prefix + * @property { string } iataCode IATA code + * @property { string } registrationAddress Registration address + * @property { string } masterBlSuffix Master BL suffix + * @property { string } houseBlSuffix House BL suffix + * @property { string } airWaybillSuffix Air waybill suffix + * @property { string } cargoManifestSuffix Cargo manifest suffix + * @property { string } fundReportSuffix Fund report suffix + * @property { string } invoiceSuffix Invoice suffix + */ + export const CarrierResponseDTOSchema = z + .object({ + businessPartnerId: z.string().describe("Business partner identifier"), + scac: z.string().describe("SCAC code"), + iataAirlinePrefix: z.string().describe("IATA airline prefix"), + iataCode: z.string().describe("IATA code"), + registrationAddress: z.string().describe("Registration address"), + masterBlSuffix: z.string().describe("Master BL suffix"), + houseBlSuffix: z.string().describe("House BL suffix"), + airWaybillSuffix: z.string().describe("Air waybill suffix"), + cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), + fundReportSuffix: z.string().describe("Fund report suffix"), + invoiceSuffix: z.string().describe("Invoice suffix"), + }) + .readonly(); + export type CarrierResponseDTO = z.infer; + + /** + * UpdateCarrierDTOSchema + * @type { object } + * @property { string } scac SCAC code + * @property { string } iataAirlinePrefix IATA airline prefix + * @property { string } iataCode IATA code + * @property { string } registrationAddress Registration address + * @property { string } masterBlSuffix Master BL suffix + * @property { string } houseBlSuffix House BL suffix + * @property { string } airWaybillSuffix Air waybill suffix + * @property { string } cargoManifestSuffix Cargo manifest suffix + * @property { string } fundReportSuffix Fund report suffix + * @property { string } invoiceSuffix Invoice suffix + */ + export const UpdateCarrierDTOSchema = z + .object({ + scac: z.string().describe("SCAC code"), + iataAirlinePrefix: z.string().describe("IATA airline prefix"), + iataCode: z.string().describe("IATA code"), + registrationAddress: z.string().describe("Registration address"), + masterBlSuffix: z.string().describe("Master BL suffix"), + houseBlSuffix: z.string().describe("House BL suffix"), + airWaybillSuffix: z.string().describe("Air waybill suffix"), + cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), + fundReportSuffix: z.string().describe("Fund report suffix"), + invoiceSuffix: z.string().describe("Invoice suffix"), + }) + .readonly(); + export type UpdateCarrierDTO = z.infer; + + /** + * BusinessPartnersPaginateOrderParamEnumSchema + * @type { enum } + */ + export const BusinessPartnersPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "vat", + "shortName", + "address", + "locked", + "currency", + "archived", + ]); + export type BusinessPartnersPaginateOrderParamEnum = z.infer; + export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOrderParamEnumSchema.enum; + + /** + * BusinessPartnersPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BusinessPartnerListResponseDTO[] } items + */ + export const BusinessPartnersPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).readonly() }).readonly().shape, + }); + export type BusinessPartnersPaginateResponse = z.infer; + + /** + * BusinessPartnersPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const BusinessPartnersPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "vat", + "shortName", + "address", + "locked", + "currency", + "archived", + ]); + export type BusinessPartnersPaginateLabelsOrderParamEnum = z.infer< + typeof BusinessPartnersPaginateLabelsOrderParamEnumSchema + >; + export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPaginateLabelsOrderParamEnumSchema.enum; + + /** + * BusinessPartnersPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items + */ + export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type BusinessPartnersPaginateLabelsResponse = z.infer; + + /** + * GetRemarksResponseSchema + * @type { array } + */ + export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema).readonly(); + export type GetRemarksResponse = z.infer; +} diff --git a/test/generated/base/businessPartners/businessPartners.queries.ts b/test/generated/base/businessPartners/businessPartners.queries.ts new file mode 100644 index 0000000..330f8f0 --- /dev/null +++ b/test/generated/base/businessPartners/businessPartners.queries.ts @@ -0,0 +1,895 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnersAcl } from "./businessPartners.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnersModels } from "./businessPartners.models"; +import { BusinessPartnersApi } from "./businessPartners.api"; + +export namespace BusinessPartnersQueries { + export const moduleName = QueryModule.BusinessPartners; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/business-partners", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/business-partners", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/business-partners/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/business-partners/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + getById: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/business-partners/:id", officeId, id] as const, + getRemarks: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/business-partners/:id/remarks", officeId, id] as const, + getBasicInfo: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/business-partners/:id/basic", officeId, id] as const, + getCargoAgentInfo: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/business-partners/:id/cargo-agent", officeId, id] as const, + getCarrierInformation: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/business-partners/:id/carrier", officeId, id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate business partners + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BusinessPartnersModels.BusinessPartnerFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId })); + return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate business partners + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BusinessPartnersModels.BusinessPartnerFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId })); + return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create business partner + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { BusinessPartnersModels.CreateBusinessPartnerRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.create, + { officeId: string; data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(BusinessPartnersAcl.canUseCreate({ officeId })); + return BusinessPartnersApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId })); + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId })); + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetById` + * @summary Get business partner by ID + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetById = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetById({ officeId })); + return BusinessPartnersApi.getById(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update business partner + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.update, + { officeId: string; id: string; data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId })); + return BusinessPartnersApi.update(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive business partner + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseArchive({ officeId })); + return BusinessPartnersApi.archive(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive business partner + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId })); + return BusinessPartnersApi.unarchive(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useLock` + * @summary Lock business partner + * @permission Requires `canUseLock` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useLock = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseLock({ officeId })); + return BusinessPartnersApi.lock(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnlock` + * @summary Unlock business partner + * @permission Requires `canUseUnlock` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnlock = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId })); + return BusinessPartnersApi.unlock(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetRemarks` + * @summary Get business partner remarks + * @permission Requires `canUseGetRemarks` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetRemarks = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getRemarks(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId })); + return BusinessPartnersApi.getRemarks(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateRemark` + * @summary Create business partner remark + * @permission Requires `canUseCreateRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateRemark = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.createRemark, + { officeId: string; id: string; data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId })); + return BusinessPartnersApi.createRemark(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateRemark` + * @permission Requires `canUseUpdateRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { string } mutation.remarkId Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateRemark = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.updateRemark, + { + officeId: string; + id: string; + remarkId: string; + data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, remarkId, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId })); + return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteRemark` + * @summary Delete business partner remark + * @permission Requires `canUseDeleteRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { string } mutation.remarkId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteRemark = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.deleteRemark, + { officeId: string; id: string; remarkId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, remarkId }) => { + checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId })); + return BusinessPartnersApi.deleteRemark(officeId, id, remarkId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetBasicInfo` + * @summary Get business partner basic info + * @permission Requires `canUseGetBasicInfo` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetBasicInfo = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBasicInfo(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId })); + return BusinessPartnersApi.getBasicInfo(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateBasicInfo` + * @summary Update business partner basic info + * @permission Requires `canUseUpdateBasicInfo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBasicInfo = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.updateBasicInfo, + { officeId: string; id: string; data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId })); + return BusinessPartnersApi.updateBasicInfo(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getBasicInfo(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreateSignatureUploadInstructions` + * @summary Create upload instructions for business partner signature + * @permission Requires `canUseCreateSignatureUploadInstructions` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateSignatureUploadInstructions = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.createSignatureUploadInstructions, + { + officeId: string; + id: string; + data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { + checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId })); + const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions( + officeId, + id, + data, + config, + ); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetCargoAgentInfo` + * @summary Get cargo agent information for business partner + * @permission Requires `canUseGetCargoAgentInfo` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCargoAgentInfo = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoAgentInfo(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId })); + return BusinessPartnersApi.getCargoAgentInfo(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCargoAgent` + * @summary Update cargo agent information for business partner + * @permission Requires `canUseUpdateCargoAgent` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateCargoAgentDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCargoAgent = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.updateCargoAgent, + { officeId: string; id: string; data: BusinessPartnersModels.UpdateCargoAgentDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId })); + return BusinessPartnersApi.updateCargoAgent(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getCargoAgentInfo(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetCarrierInformation` + * @summary Get carrier information for business partner + * @permission Requires `canUseGetCarrierInformation` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCarrierInformation = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCarrierInformation(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId })); + return BusinessPartnersApi.getCarrierInformation(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCarrier` + * @summary Update carrier information for business partner + * @permission Requires `canUseUpdateCarrier` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateCarrierDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCarrier = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.updateCarrier, + { officeId: string; id: string; data: BusinessPartnersModels.UpdateCarrierDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId })); + return BusinessPartnersApi.updateCarrier(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getCarrierInformation(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/cargoTypes/cargoTypes.acl.ts b/test/generated/base/cargoTypes/cargoTypes.acl.ts new file mode 100644 index 0000000..342fe0d --- /dev/null +++ b/test/generated/base/cargoTypes/cargoTypes.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CargoTypesAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "CargoType"] as AbilityTuple<"Create", "CargoType">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "CargoType"] as AbilityTuple<"Update", "CargoType">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "CargoType"] as AbilityTuple<"Archive", "CargoType">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "CargoType"] as AbilityTuple<"Archive", "CargoType">; +} diff --git a/test/generated/base/cargoTypes/cargoTypes.api.ts b/test/generated/base/cargoTypes/cargoTypes.api.ts new file mode 100644 index 0000000..1cb0076 --- /dev/null +++ b/test/generated/base/cargoTypes/cargoTypes.api.ts @@ -0,0 +1,123 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CargoTypesModels } from "./cargoTypes.models"; + +export namespace CargoTypesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: CargoTypesModels.CargoTypePaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, `/cargo-types`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types`, + ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), + config, + ); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: CargoTypesModels.CargoTypeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, + `/cargo-types/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, `/cargo-types/${id}`, config); + }; + + export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}`, + ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/cargoTypes/cargoTypes.configs.ts b/test/generated/base/cargoTypes/cargoTypes.configs.ts new file mode 100644 index 0000000..c2d613d --- /dev/null +++ b/test/generated/base/cargoTypes/cargoTypes.configs.ts @@ -0,0 +1,141 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CargoTypesModels } from "./cargoTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CargoTypesQueries } from "./cargoTypes.queries"; +import { CargoTypesAcl } from "./cargoTypes.acl"; + +export namespace CargoTypesConfigs { + export const cargoTypesConfig = { + meta: { + title: "Cargo Types", + }, + readAll: { + acl: CargoTypesAcl.canUsePaginate, + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + paginated: CargoTypesQueries.usePaginate, + infinite: CargoTypesQueries.usePaginateInfinite, + filters: { + schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, + options: { + inputs: { + module: true, + archived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + shortName: true, + length: true, + width: true, + height: true, + unit: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + modules: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: CargoTypesAcl.canUseFindById, + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + query: CargoTypesQueries.useFindById, + }, + create: { + acl: CargoTypesAcl.canUseCreate, + schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, + mutation: CargoTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + length: true, + width: true, + height: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + unit: true, + modules: true, + }, + }, + }), + }, + update: { + acl: CargoTypesAcl.canUseUpdate, + schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, + mutation: CargoTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + length: true, + width: true, + height: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + unit: true, + modules: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CargoTypesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CargoTypesQueries.usePaginateLabels, + infinite: CargoTypesQueries.usePaginateLabelsInfinite, + filters: { + schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/cargoTypes/cargoTypes.models.ts b/test/generated/base/cargoTypes/cargoTypes.models.ts new file mode 100644 index 0000000..bf04326 --- /dev/null +++ b/test/generated/base/cargoTypes/cargoTypes.models.ts @@ -0,0 +1,224 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CargoTypesModels { + /** + * CargoTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CargoTypeEmployeeDTO = z.infer; + + /** + * CargoTypeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the cargo type + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { string } unit Measurement unit for dimensions + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type + * @property { boolean } archived Indicates if the cargo type is archived + * @property { string } createdById + * @property { CargoTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CargoTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const CargoTypeResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier for the cargo type"), + name: z.string().describe("Name of the cargo type"), + shortName: z.string().describe("Short name of the cargo type").nullish(), + length: z.number().describe("Length of the cargo type").nullish(), + width: z.number().describe("Width of the cargo type").nullish(), + height: z.number().describe("Height of the cargo type").nullish(), + unit: z.string().describe("Measurement unit for dimensions"), + emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), + containerIsoCode: z.string().describe("Container ISO code").nullish(), + isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), + modules: z + .array(CommonModels.TransportModeEnumSchema) + .readonly() + .describe("Transport modules applicable to the cargo type"), + archived: z.boolean().describe("Indicates if the cargo type is archived"), + createdById: z.string().nullish(), + createdBy: CargoTypeEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: CargoTypeEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type CargoTypeResponseDTO = z.infer; + + /** + * TransportModuleEnumSchema + * @type { enum } + */ + export const TransportModuleEnumSchema = z.enum(["Air", "Sea", "Road"]); + export type TransportModuleEnum = z.infer; + export const TransportModuleEnum = TransportModuleEnumSchema.enum; + + /** + * CargoTypePaginationFilterDtoSchema + * @type { object } + * @property { TransportModuleEnum } module + * @property { boolean } archived Archived status filter + * @property { string } search + */ + export const CargoTypePaginationFilterDtoSchema = z + .object({ + module: TransportModuleEnumSchema, + archived: z.boolean().describe("Archived status filter"), + search: z.string(), + }) + .readonly(); + export type CargoTypePaginationFilterDto = z.infer; + + /** + * CreateCargoTypeRequestDTOSchema + * @type { object } + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { string } unit Measurement unit for dimensions + * @property { CommonModels.TransportModeEnum[] } modules Transport modes applicable to the cargo type + */ + export const CreateCargoTypeRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the cargo type"), + shortName: z.string().describe("Short name of the cargo type").nullish(), + length: z.number().describe("Length of the cargo type").nullish(), + width: z.number().describe("Width of the cargo type").nullish(), + height: z.number().describe("Height of the cargo type").nullish(), + emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), + containerIsoCode: z.string().describe("Container ISO code").nullish(), + isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), + unit: z.string().describe("Measurement unit for dimensions"), + modules: z + .array(CommonModels.TransportModeEnumSchema) + .readonly() + .describe("Transport modes applicable to the cargo type"), + }) + .readonly(); + export type CreateCargoTypeRequestDTO = z.infer; + + /** + * UpdateCargoTypeRequestDTOSchema + * @type { object } + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { string } unit Measurement unit for dimensions + * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type + */ + export const UpdateCargoTypeRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the cargo type"), + shortName: z.string().describe("Short name of the cargo type"), + length: z.number().describe("Length of the cargo type").nullable(), + width: z.number().describe("Width of the cargo type").nullable(), + height: z.number().describe("Height of the cargo type").nullable(), + emptyWeight: z.number().describe("Empty weight of the cargo container").nullable(), + containerIsoCode: z.string().describe("Container ISO code").nullable(), + isContainer: z.boolean().describe("Whether this cargo type is a container").nullable(), + unit: z.string().describe("Measurement unit for dimensions"), + modules: z + .array(CommonModels.TransportModeEnumSchema) + .readonly() + .describe("Transport modules applicable to the cargo type"), + }) + .readonly(); + export type UpdateCargoTypeRequestDTO = z.infer; + + /** + * CargoTypeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const CargoTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type CargoTypeLabelFilterDto = z.infer; + + /** + * CargoTypesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const CargoTypesPaginateOrderParamEnumSchema = z.enum([ + "matchcode", + "description", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "name", + ]); + export type CargoTypesPaginateOrderParamEnum = z.infer; + export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnumSchema.enum; + + /** + * CargoTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CargoTypeResponseDTO[] } items + */ + export const CargoTypesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CargoTypeResponseDTOSchema).readonly() }).readonly().shape, + }); + export type CargoTypesPaginateResponse = z.infer; + + /** + * CargoTypesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const CargoTypesPaginateLabelsOrderParamEnumSchema = z.enum([ + "matchcode", + "description", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "name", + ]); + export type CargoTypesPaginateLabelsOrderParamEnum = z.infer; + export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * CargoTypesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const CargoTypesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type CargoTypesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/cargoTypes/cargoTypes.queries.ts b/test/generated/base/cargoTypes/cargoTypes.queries.ts new file mode 100644 index 0000000..483b369 --- /dev/null +++ b/test/generated/base/cargoTypes/cargoTypes.queries.ts @@ -0,0 +1,362 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CargoTypesAcl } from "./cargoTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CargoTypesModels } from "./cargoTypes.models"; +import { CargoTypesApi } from "./cargoTypes.api"; + +export namespace CargoTypesQueries { + export const moduleName = QueryModule.CargoTypes; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: CargoTypesModels.CargoTypePaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/cargo-types", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: CargoTypesModels.CargoTypePaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/cargo-types", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: CargoTypesModels.CargoTypeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/cargo-types/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: CargoTypesModels.CargoTypeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/cargo-types/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/cargo-types/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Cargo Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CargoTypesModels.CargoTypePaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CargoTypesAcl.canUsePaginate()); + return CargoTypesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Cargo Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CargoTypesModels.CargoTypePaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CargoTypesAcl.canUsePaginate()); + return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create Cargo Type + * @permission Requires `canUseCreate` ability + * @param { CargoTypesModels.CreateCargoTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CargoTypesAcl.canUseCreate()); + return CargoTypesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate cargo types with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CargoTypesModels.CargoTypeLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CargoTypesAcl.canUsePaginateLabels()); + return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate cargo types with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CargoTypesModels.CargoTypeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CargoTypesAcl.canUsePaginateLabels()); + return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get Cargo Type by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(CargoTypesAcl.canUseFindById()); + return CargoTypesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Cargo Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { CargoTypesModels.UpdateCargoTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof CargoTypesApi.update, + { id: string; data: CargoTypesModels.UpdateCargoTypeRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(CargoTypesAcl.canUseUpdate()); + return CargoTypesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive Cargo Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CargoTypesAcl.canUseArchive()); + return CargoTypesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive Cargo Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CargoTypesAcl.canUseUnarchive()); + return CargoTypesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/chargeTypes/chargeTypes.acl.ts b/test/generated/base/chargeTypes/chargeTypes.acl.ts new file mode 100644 index 0000000..a76453f --- /dev/null +++ b/test/generated/base/chargeTypes/chargeTypes.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace ChargeTypesAcl { + /** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "ChargeType"] as AbilityTuple<"Create", "ChargeType">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "ChargeType"] as AbilityTuple<"Update", "ChargeType">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "ChargeType"] as AbilityTuple<"Archive", "ChargeType">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "ChargeType"] as AbilityTuple<"Archive", "ChargeType">; +} diff --git a/test/generated/base/chargeTypes/chargeTypes.api.ts b/test/generated/base/chargeTypes/chargeTypes.api.ts new file mode 100644 index 0000000..da50e3c --- /dev/null +++ b/test/generated/base/chargeTypes/chargeTypes.api.ts @@ -0,0 +1,131 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChargeTypesModels } from "./chargeTypes.models"; + +export namespace ChargeTypesApi { + export const findAll = ( + limit: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, + `/charge-types/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const paginate = ( + limit: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, `/charge-types`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types`, + ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), + config, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}`, + config, + ); + }; + + export const update = ( + id: string, + data: ChargeTypesModels.UpdateChargeTypeRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}`, + ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/chargeTypes/chargeTypes.configs.ts b/test/generated/base/chargeTypes/chargeTypes.configs.ts new file mode 100644 index 0000000..2aab959 --- /dev/null +++ b/test/generated/base/chargeTypes/chargeTypes.configs.ts @@ -0,0 +1,135 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChargeTypesModels } from "./chargeTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChargeTypesQueries } from "./chargeTypes.queries"; +import { ChargeTypesAcl } from "./chargeTypes.acl"; + +export namespace ChargeTypesConfigs { + export const chargeTypesConfig = { + meta: { + title: "Charge Types", + }, + readAll: { + acl: ChargeTypesAcl.canUsePaginate, + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + paginated: ChargeTypesQueries.usePaginate, + infinite: ChargeTypesQueries.usePaginateInfinite, + filters: { + schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, + options: { + inputs: { + name: true, + search: true, + archived: true, + direction: true, + transportModes: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: ChargeTypesAcl.canUseFindById, + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + query: ChargeTypesQueries.useFindById, + }, + create: { + acl: ChargeTypesAcl.canUseCreate, + schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, + mutation: ChargeTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, + options: { + inputs: { + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + }, + }, + }), + }, + update: { + acl: ChargeTypesAcl.canUseUpdate, + schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, + mutation: ChargeTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, + options: { + inputs: { + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ChargeTypesAcl.canUseFindAll, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChargeTypesQueries.useFindAll, + infinite: ChargeTypesQueries.useFindAllInfinite, + filters: { + schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, + options: { + inputs: { + direction: true, + transportModes: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/chargeTypes/chargeTypes.models.ts b/test/generated/base/chargeTypes/chargeTypes.models.ts new file mode 100644 index 0000000..688b640 --- /dev/null +++ b/test/generated/base/chargeTypes/chargeTypes.models.ts @@ -0,0 +1,230 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChargeTypesModels { + /** + * ChargeTypeLabelFilterDtoSchema + * @type { object } + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum[] } transportModes + * @property { string } search + */ + export const ChargeTypeLabelFilterDtoSchema = z + .object({ + direction: CommonModels.DirectionEnumSchema, + transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), + search: z.string(), + }) + .readonly(); + export type ChargeTypeLabelFilterDto = z.infer; + + /** + * ChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ + export const ChargeTypeTranslationDtoSchema = z + .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) + .readonly(); + export type ChargeTypeTranslationDto = z.infer; + + /** + * ChargeTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ChargeTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ChargeTypeEmployeeDTO = z.infer; + + /** + * ChargeTypeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { ChargeTypeTranslationDto[] } translations + * @property { string } createdById + * @property { ChargeTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { ChargeTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const ChargeTypeResponseDTOSchema = z + .object({ + id: z.string(), + matchCode: z.string(), + englishName: z.string(), + archived: z.boolean(), + description: z.string().nullish(), + modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), + directions: z.array(CommonModels.DirectionEnumSchema).readonly(), + translations: z.array(ChargeTypeTranslationDtoSchema).readonly(), + createdById: z.string().nullish(), + createdBy: ChargeTypeEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type ChargeTypeResponseDTO = z.infer; + + /** + * ChargeTypePaginationFilterDtoSchema + * @type { object } + * @property { string } name + * @property { string } search + * @property { boolean } archived + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum[] } transportModes + */ + export const ChargeTypePaginationFilterDtoSchema = z + .object({ + name: z.string(), + search: z.string(), + archived: z.boolean(), + direction: CommonModels.DirectionEnumSchema, + transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), + }) + .readonly(); + export type ChargeTypePaginationFilterDto = z.infer; + + /** + * CreateChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ + export const CreateChargeTypeTranslationDtoSchema = z + .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) + .readonly(); + export type CreateChargeTypeTranslationDto = z.infer; + + /** + * CreateChargeTypeRequestDTOSchema + * @type { object } + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { CreateChargeTypeTranslationDto[] } translations + */ + export const CreateChargeTypeRequestDTOSchema = z + .object({ + matchCode: z.string(), + englishName: z.string().nullish(), + archived: z.boolean().nullish(), + description: z.string().nullish(), + modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), + directions: z.array(CommonModels.DirectionEnumSchema).readonly(), + translations: z.array(CreateChargeTypeTranslationDtoSchema).readonly().nullish(), + }) + .readonly(); + export type CreateChargeTypeRequestDTO = z.infer; + + /** + * UpdateChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ + export const UpdateChargeTypeTranslationDtoSchema = z + .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) + .readonly(); + export type UpdateChargeTypeTranslationDto = z.infer; + + /** + * UpdateChargeTypeRequestDTOSchema + * @type { object } + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { UpdateChargeTypeTranslationDto[] } translations + */ + export const UpdateChargeTypeRequestDTOSchema = z + .object({ + matchCode: z.string(), + englishName: z.string(), + archived: z.boolean(), + description: z.string(), + modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), + directions: z.array(CommonModels.DirectionEnumSchema).readonly(), + translations: z.array(UpdateChargeTypeTranslationDtoSchema).readonly(), + }) + .readonly(); + export type UpdateChargeTypeRequestDTO = z.infer; + + /** + * ChargeTypesFindAllOrderParamEnumSchema + * @type { enum } + */ + export const ChargeTypesFindAllOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "englishName", + ]); + export type ChargeTypesFindAllOrderParamEnum = z.infer; + export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnumSchema.enum; + + /** + * ChargeTypesFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const ChargeTypesFindAllResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChargeTypesFindAllResponse = z.infer; + + /** + * ChargeTypesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const ChargeTypesPaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "englishName", + ]); + export type ChargeTypesPaginateOrderParamEnum = z.infer; + export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEnumSchema.enum; + + /** + * ChargeTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChargeTypeResponseDTO[] } items + */ + export const ChargeTypesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChargeTypesPaginateResponse = z.infer; +} diff --git a/test/generated/base/chargeTypes/chargeTypes.queries.ts b/test/generated/base/chargeTypes/chargeTypes.queries.ts new file mode 100644 index 0000000..1613130 --- /dev/null +++ b/test/generated/base/chargeTypes/chargeTypes.queries.ts @@ -0,0 +1,362 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChargeTypesAcl } from "./chargeTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChargeTypesModels } from "./chargeTypes.models"; +import { ChargeTypesApi } from "./chargeTypes.api"; + +export namespace ChargeTypesQueries { + export const moduleName = QueryModule.ChargeTypes; + + export const keys = { + all: [moduleName] as const, + findAll: ( + limit?: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/charge-types/paginate/labels", limit, order, filter, page, cursor] as const, + findAllInfinite: ( + limit?: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/charge-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: ( + limit?: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/charge-types", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/charge-types", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/charge-types/:id", id] as const, + }; + + /** + * Query `useFindAll` + * @summary Paginate charge types with only their labels + * @permission Requires `canUseFindAll` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ChargeTypesModels.ChargeTypeLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUseFindAll()); + return ChargeTypesApi.findAll(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindAllInfinite + * @summary Paginate charge types with only their labels + * @permission Requires `canUseFindAll` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ChargeTypesModels.ChargeTypeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChargeTypesAcl.canUseFindAll()); + return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginate` + * @summary Paginate Charge Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ChargeTypesModels.ChargeTypePaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUsePaginate()); + return ChargeTypesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Charge Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ChargeTypesModels.ChargeTypePaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChargeTypesAcl.canUsePaginate()); + return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new Charge Type + * @permission Requires `canUseCreate` ability + * @param { ChargeTypesModels.CreateChargeTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(ChargeTypesAcl.canUseCreate()); + return ChargeTypesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get Charge Type Details by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUseFindById()); + return ChargeTypesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update an existing Charge Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { ChargeTypesModels.UpdateChargeTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ChargeTypesApi.update, + { id: string; data: ChargeTypesModels.UpdateChargeTypeRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(ChargeTypesAcl.canUseUpdate()); + return ChargeTypesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive a Charge Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ChargeTypesAcl.canUseArchive()); + return ChargeTypesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive a Charge Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ChargeTypesAcl.canUseUnarchive()); + return ChargeTypesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/checklistItems/checklistItems.acl.ts b/test/generated/base/checklistItems/checklistItems.acl.ts new file mode 100644 index 0000000..01dc0d4 --- /dev/null +++ b/test/generated/base/checklistItems/checklistItems.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ChecklistItemsAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create checklist item in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Create", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List checklist items for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Read", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Paginate checklist item labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Read", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get checklist item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Read", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Update", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Archive", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Archive", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; +} diff --git a/test/generated/base/checklistItems/checklistItems.api.ts b/test/generated/base/checklistItems/checklistItems.api.ts new file mode 100644 index 0000000..314a00f --- /dev/null +++ b/test/generated/base/checklistItems/checklistItems.api.ts @@ -0,0 +1,142 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChecklistItemsModels } from "./checklistItems.models"; + +export namespace ChecklistItemsApi { + export const create = ( + officeId: string, + data: ChecklistItemsModels.CreateChecklistItemRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items`, + ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), + config, + ); + }; + + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, + `/offices/${officeId}/checklist-items`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, + `/offices/${officeId}/checklist-items/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items/${id}`, + config, + ); + }; + + export const update = ( + id: string, + officeId: string, + data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items/${id}`, + ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-items/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-items/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/checklistItems/checklistItems.configs.ts b/test/generated/base/checklistItems/checklistItems.configs.ts new file mode 100644 index 0000000..014d56c --- /dev/null +++ b/test/generated/base/checklistItems/checklistItems.configs.ts @@ -0,0 +1,115 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChecklistItemsModels } from "./checklistItems.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChecklistItemsQueries } from "./checklistItems.queries"; +import { ChecklistItemsAcl } from "./checklistItems.acl"; + +export namespace ChecklistItemsConfigs { + export const checklistItemsConfig = { + meta: { + title: "Checklist Items", + }, + readAll: { + acl: ChecklistItemsAcl.canUsePaginate, + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + paginated: ChecklistItemsQueries.usePaginate, + infinite: ChecklistItemsQueries.usePaginateInfinite, + filters: { + schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: ChecklistItemsAcl.canUseFindById, + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + query: ChecklistItemsQueries.useFindById, + }, + create: { + acl: ChecklistItemsAcl.canUseCreate, + schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, + mutation: ChecklistItemsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + update: { + acl: ChecklistItemsAcl.canUseUpdate, + schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, + mutation: ChecklistItemsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: ChecklistItemsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChecklistItemsQueries.usePaginateLabels, + infinite: ChecklistItemsQueries.usePaginateLabelsInfinite, + filters: { + schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/checklistItems/checklistItems.models.ts b/test/generated/base/checklistItems/checklistItems.models.ts new file mode 100644 index 0000000..0951314 --- /dev/null +++ b/test/generated/base/checklistItems/checklistItems.models.ts @@ -0,0 +1,144 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChecklistItemsModels { + /** + * ChecklistItemEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ChecklistItemEmployeeDTO = z.infer; + + /** + * ChecklistItemResponseDTOSchema + * @type { object } + * @property { string } id Checklist item ID + * @property { string } name Checklist item name + * @property { string } officeId Office ID + * @property { boolean } archived Is archived + * @property { string } archivedAt Archived at + * @property { string } createdById ID of the employee who created this checklist item + * @property { ChecklistItemEmployeeDTO } createdBy Employee who created this checklist item + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this checklist item + * @property { ChecklistItemEmployeeDTO } updatedBy Employee who last updated this checklist item + * @property { string } updatedAt Updated at + */ + export const ChecklistItemResponseDTOSchema = z + .object({ + id: z.string().describe("Checklist item ID"), + name: z.string().describe("Checklist item name"), + officeId: z.string().describe("Office ID"), + archived: z.boolean().describe("Is archived"), + archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), + createdById: z.string().describe("ID of the employee who created this checklist item").nullish(), + createdBy: ChecklistItemEmployeeDTOSchema.describe("Employee who created this checklist item").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedById: z.string().describe("ID of the employee who last updated this checklist item").nullish(), + updatedBy: ChecklistItemEmployeeDTOSchema.describe("Employee who last updated this checklist item").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + }) + .readonly(); + export type ChecklistItemResponseDTO = z.infer; + + /** + * CreateChecklistItemRequestDTOSchema + * @type { object } + * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` + */ + export const CreateChecklistItemRequestDTOSchema = z + .object({ name: z.string().min(3).max(256).describe("Checklist item name") }) + .readonly(); + export type CreateChecklistItemRequestDTO = z.infer; + + /** + * ChecklistItemLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const ChecklistItemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type ChecklistItemLabelFilterDto = z.infer; + + /** + * ChecklistItemFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ + export const ChecklistItemFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); + export type ChecklistItemFilterDto = z.infer; + + /** + * UpdateChecklistItemRequestDTOSchema + * @type { object } + * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` + */ + export const UpdateChecklistItemRequestDTOSchema = z + .object({ name: z.string().min(3).max(256).describe("Checklist item name") }) + .readonly(); + export type UpdateChecklistItemRequestDTO = z.infer; + + /** + * ChecklistItemsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const ChecklistItemsPaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ChecklistItemsPaginateOrderParamEnum = z.infer; + export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderParamEnumSchema.enum; + + /** + * ChecklistItemsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChecklistItemResponseDTO[] } items + */ + export const ChecklistItemsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChecklistItemsPaginateResponse = z.infer; + + /** + * ChecklistItemsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const ChecklistItemsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ChecklistItemsPaginateLabelsOrderParamEnum = z.infer< + typeof ChecklistItemsPaginateLabelsOrderParamEnumSchema + >; + export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * ChecklistItemsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChecklistItemsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/checklistItems/checklistItems.queries.ts b/test/generated/base/checklistItems/checklistItems.queries.ts new file mode 100644 index 0000000..2b1dfcc --- /dev/null +++ b/test/generated/base/checklistItems/checklistItems.queries.ts @@ -0,0 +1,416 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChecklistItemsAcl } from "./checklistItems.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChecklistItemsModels } from "./checklistItems.models"; +import { ChecklistItemsApi } from "./checklistItems.api"; + +export namespace ChecklistItemsQueries { + export const moduleName = QueryModule.ChecklistItems; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/checklist-items", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemFilterDto, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/checklist-items", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/checklist-items/labels/paginate", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/checklist-items/labels/paginate", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/checklist-items/:id", id, officeId] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create checklist item + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ChecklistItemsModels.CreateChecklistItemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof ChecklistItemsApi.create, + { officeId: string; data: ChecklistItemsModels.CreateChecklistItemRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ChecklistItemsAcl.canUseCreate({ officeId })); + return ChecklistItemsApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Get paginated checklist items + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistItemsModels.ChecklistItemFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId })); + return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Get paginated checklist items + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistItemsModels.ChecklistItemFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId })); + return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate checklist item labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId })); + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate checklist item labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId })); + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get checklist item by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUseFindById({ officeId })); + return ChecklistItemsApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update checklist item + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ChecklistItemsModels.UpdateChecklistItemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ChecklistItemsApi.update, + { id: string; officeId: string; data: ChecklistItemsModels.UpdateChecklistItemRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId })); + return ChecklistItemsApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive checklist item + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistItemsAcl.canUseArchive({ officeId })); + return ChecklistItemsApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive checklist item + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId })); + return ChecklistItemsApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/checklistTemplates/checklistTemplates.acl.ts b/test/generated/base/checklistTemplates/checklistTemplates.acl.ts new file mode 100644 index 0000000..7f4682b --- /dev/null +++ b/test/generated/base/checklistTemplates/checklistTemplates.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ChecklistTemplatesAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create checklist template in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Create", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List checklist templates for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Read", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Get checklist template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Read", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get checklist template by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Read", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Update", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Archive", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Archive", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; +} diff --git a/test/generated/base/checklistTemplates/checklistTemplates.api.ts b/test/generated/base/checklistTemplates/checklistTemplates.api.ts new file mode 100644 index 0000000..bd631a0 --- /dev/null +++ b/test/generated/base/checklistTemplates/checklistTemplates.api.ts @@ -0,0 +1,144 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; + +export namespace ChecklistTemplatesApi { + export const create = ( + officeId: string, + data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates`, + ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), + config, + ); + }; + + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, + `/offices/${officeId}/checklist-templates`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/checklist-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates/${id}`, + config, + ); + }; + + export const update = ( + id: string, + officeId: string, + data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates/${id}`, + ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-templates/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-templates/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/checklistTemplates/checklistTemplates.configs.ts b/test/generated/base/checklistTemplates/checklistTemplates.configs.ts new file mode 100644 index 0000000..0c9d106 --- /dev/null +++ b/test/generated/base/checklistTemplates/checklistTemplates.configs.ts @@ -0,0 +1,117 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChecklistTemplatesQueries } from "./checklistTemplates.queries"; +import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; + +export namespace ChecklistTemplatesConfigs { + export const checklistTemplatesConfig = { + meta: { + title: "Checklist Templates", + }, + readAll: { + acl: ChecklistTemplatesAcl.canUsePaginate, + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + paginated: ChecklistTemplatesQueries.usePaginate, + infinite: ChecklistTemplatesQueries.usePaginateInfinite, + filters: { + schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + items: true, + }, + sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: ChecklistTemplatesAcl.canUseFindById, + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + query: ChecklistTemplatesQueries.useFindById, + }, + create: { + acl: ChecklistTemplatesAcl.canUseCreate, + schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, + mutation: ChecklistTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + update: { + acl: ChecklistTemplatesAcl.canUseUpdate, + schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, + mutation: ChecklistTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + items: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ChecklistTemplatesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChecklistTemplatesQueries.usePaginateLabels, + infinite: ChecklistTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/checklistTemplates/checklistTemplates.models.ts b/test/generated/base/checklistTemplates/checklistTemplates.models.ts new file mode 100644 index 0000000..e8309ff --- /dev/null +++ b/test/generated/base/checklistTemplates/checklistTemplates.models.ts @@ -0,0 +1,167 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChecklistTemplatesModels { + /** + * ChecklistTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ChecklistTemplateEmployeeDTO = z.infer; + + /** + * ChecklistTemplateItemResponseDTOSchema + * @type { object } + * @property { string } checklistItemId Checklist item id + * @property { number } order Order index + * @property { string } name Checklist item name + */ + export const ChecklistTemplateItemResponseDTOSchema = z + .object({ + checklistItemId: z.string().describe("Checklist item id"), + order: z.number().describe("Order index"), + name: z.string().describe("Checklist item name").nullish(), + }) + .readonly(); + export type ChecklistTemplateItemResponseDTO = z.infer; + + /** + * ChecklistTemplateResponseDTOSchema + * @type { object } + * @property { string } id Template id + * @property { string } name Template name + * @property { string } officeId Office id + * @property { boolean } archived Is archived + * @property { string } archivedAt Archived at + * @property { string } createdById ID of the employee who created this template + * @property { ChecklistTemplateEmployeeDTO } createdBy Employee who created this template + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this template + * @property { ChecklistTemplateEmployeeDTO } updatedBy Employee who last updated this template + * @property { string } updatedAt Updated at + * @property { ChecklistTemplateItemResponseDTO[] } items Ordered items + */ + export const ChecklistTemplateResponseDTOSchema = z + .object({ + id: z.string().describe("Template id"), + name: z.string().describe("Template name"), + officeId: z.string().describe("Office id"), + archived: z.boolean().describe("Is archived"), + archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), + createdById: z.string().describe("ID of the employee who created this template").nullish(), + createdBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), + updatedBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + items: z.array(ChecklistTemplateItemResponseDTOSchema).readonly().describe("Ordered items"), + }) + .readonly(); + export type ChecklistTemplateResponseDTO = z.infer; + + /** + * CreateChecklistTemplateRequestDTOSchema + * @type { object } + * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` + */ + export const CreateChecklistTemplateRequestDTOSchema = z + .object({ name: z.string().min(3).max(120).describe("Checklist template name") }) + .readonly(); + export type CreateChecklistTemplateRequestDTO = z.infer; + + /** + * ChecklistTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const ChecklistTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type ChecklistTemplateLabelFilterDto = z.infer; + + /** + * ChecklistTemplateFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ + export const ChecklistTemplateFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); + export type ChecklistTemplateFilterDto = z.infer; + + /** + * UpdateChecklistTemplateRequestDTOSchema + * @type { object } + * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` + * @property { string[] } items Ordered checklist item ids + */ + export const UpdateChecklistTemplateRequestDTOSchema = z + .object({ + name: z.string().min(3).max(120).describe("Checklist template name"), + items: z.array(z.uuid()).readonly().describe("Ordered checklist item ids"), + }) + .readonly(); + export type UpdateChecklistTemplateRequestDTO = z.infer; + + /** + * ChecklistTemplatesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const ChecklistTemplatesPaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ChecklistTemplatesPaginateOrderParamEnum = z.infer; + export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPaginateOrderParamEnumSchema.enum; + + /** + * ChecklistTemplatesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChecklistTemplateResponseDTO[] } items + */ + export const ChecklistTemplatesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChecklistTemplatesPaginateResponse = z.infer; + + /** + * ChecklistTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const ChecklistTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ChecklistTemplatesPaginateLabelsOrderParamEnum = z.infer< + typeof ChecklistTemplatesPaginateLabelsOrderParamEnumSchema + >; + export const ChecklistTemplatesPaginateLabelsOrderParamEnum = + ChecklistTemplatesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * ChecklistTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChecklistTemplatesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/checklistTemplates/checklistTemplates.queries.ts b/test/generated/base/checklistTemplates/checklistTemplates.queries.ts new file mode 100644 index 0000000..9baea8c --- /dev/null +++ b/test/generated/base/checklistTemplates/checklistTemplates.queries.ts @@ -0,0 +1,425 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; +import { ChecklistTemplatesApi } from "./checklistTemplates.api"; + +export namespace ChecklistTemplatesQueries { + export const moduleName = QueryModule.ChecklistTemplates; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/checklist-templates", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/checklist-templates", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/checklist-templates/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/checklist-templates/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/checklist-templates/:id", id, officeId] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create checklist template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof ChecklistTemplatesApi.create, + { officeId: string; data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId })); + return ChecklistTemplatesApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Get paginated checklist templates + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId })); + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Get paginated checklist templates + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId })); + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate checklist template labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId })); + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate checklist template labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId })); + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get checklist template by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId })); + return ChecklistTemplatesApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Replace checklist template + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ChecklistTemplatesApi.update, + { id: string; officeId: string; data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId })); + return ChecklistTemplatesApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive checklist template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId })); + return ChecklistTemplatesApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive checklist template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId })); + return ChecklistTemplatesApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/cities/cities.acl.ts b/test/generated/base/cities/cities.acl.ts new file mode 100644 index 0000000..1511597 --- /dev/null +++ b/test/generated/base/cities/cities.acl.ts @@ -0,0 +1,51 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CitiesAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "City"] as AbilityTuple<"Read", "City">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "City"] as AbilityTuple<"Create", "City">; + + /** + * Use for `useListCityLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCityLabels` query + */ + export const canUseListCityLabels = () => ["Read", "City"] as AbilityTuple<"Read", "City">; + + /** + * Use for `useGetCityLabelById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCityLabelById` query + */ + export const canUseGetCityLabelById = () => ["Read", "City"] as AbilityTuple<"Read", "City">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "City"] as AbilityTuple<"Read", "City">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "City"] as AbilityTuple<"Update", "City">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "City"] as AbilityTuple<"Archive", "City">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "City"] as AbilityTuple<"Archive", "City">; +} diff --git a/test/generated/base/cities/cities.api.ts b/test/generated/base/cities/cities.api.ts new file mode 100644 index 0000000..a9730f5 --- /dev/null +++ b/test/generated/base/cities/cities.api.ts @@ -0,0 +1,113 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CitiesModels } from "./cities.models"; + +export namespace CitiesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: CitiesModels.CityPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CitiesModels.CitiesPaginateResponseSchema }, `/cities`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: CitiesModels.CreateCityRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities`, + ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), + config, + ); + }; + + export const listCityLabels = ( + limit: number, + order?: string, + filter?: CitiesModels.CityLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CitiesModels.ListCityLabelsResponseSchema }, `/cities/paginate/labels`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const getCityLabelById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: CitiesModels.CityLabelResponseDTOSchema }, `/cities/${id}/labels`, config); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: CitiesModels.CityResponseDTOSchema }, `/cities/${id}`, config); + }; + + export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities/${id}`, + ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/cities/${id}/archive`, undefined, config); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/cities/${id}/unarchive`, undefined, config); + }; +} diff --git a/test/generated/base/cities/cities.configs.ts b/test/generated/base/cities/cities.configs.ts new file mode 100644 index 0000000..5498521 --- /dev/null +++ b/test/generated/base/cities/cities.configs.ts @@ -0,0 +1,123 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CitiesModels } from "./cities.models"; +import { CitiesQueries } from "./cities.queries"; +import { CitiesAcl } from "./cities.acl"; + +export namespace CitiesConfigs { + export const citiesConfig = { + meta: { + title: "Cities", + }, + readAll: { + acl: CitiesAcl.canUsePaginate, + schema: CitiesModels.CityResponseDTOSchema, + paginated: CitiesQueries.usePaginate, + infinite: CitiesQueries.usePaginateInfinite, + filters: { + schema: CitiesModels.CityPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CitiesModels.CityPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CitiesModels.CityResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + isoCode: true, + stateCode: true, + archived: true, + countryId: true, + country: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CitiesModels.CitiesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: CitiesAcl.canUseFindById, + schema: CitiesModels.CityResponseDTOSchema, + query: CitiesQueries.useFindById, + }, + create: { + acl: CitiesAcl.canUseCreate, + schema: CitiesModels.CreateCityRequestDTOSchema, + mutation: CitiesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CitiesModels.CreateCityRequestDTOSchema, + options: { + inputs: { + name: true, + isoCode: true, + stateCode: true, + countryId: true, + }, + }, + }), + }, + update: { + acl: CitiesAcl.canUseUpdate, + schema: CitiesModels.UpdateCityRequestDTOSchema, + mutation: CitiesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CitiesModels.UpdateCityRequestDTOSchema, + options: { + inputs: { + name: true, + isoCode: true, + stateCode: true, + countryId: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: CitiesAcl.canUseListCityLabels, + schema: CitiesModels.CityLabelResponseDTOSchema, + paginated: CitiesQueries.useListCityLabels, + infinite: CitiesQueries.useListCityLabelsInfinite, + filters: { + schema: CitiesModels.CityLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CitiesModels.CityLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CitiesModels.CityLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + country: true, + }, + sortable: CitiesModels.ListCityLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/cities/cities.models.ts b/test/generated/base/cities/cities.models.ts new file mode 100644 index 0000000..6fc2ac8 --- /dev/null +++ b/test/generated/base/cities/cities.models.ts @@ -0,0 +1,203 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CitiesModels { + /** + * CityCountryDtoSchema + * @type { object } + * @property { string } id Unique identifier of the country + * @property { string } name Name of the country + * @property { string } isoCode2 2 character iso code of the country + * @property { string } isoCode3 3 character iso code of the country + */ + export const CityCountryDtoSchema = z + .object({ + id: z.string().describe("Unique identifier of the country"), + name: z.string().describe("Name of the country"), + isoCode2: z.string().describe("2 character iso code of the country"), + isoCode3: z.string().describe("3 character iso code of the country"), + }) + .readonly(); + export type CityCountryDto = z.infer; + + /** + * CityEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CityEmployeeDTO = z.infer; + + /** + * CityResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the city + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { boolean } archived Whether the city is archived + * @property { string } countryId Country ID + * @property { CityCountryDto } country + * @property { string } createdById + * @property { CityEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CityEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const CityResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the city"), + name: z.string().describe("Name of the city"), + isoCode: z.string().describe("ISO code of the city").nullish(), + stateCode: z.string().describe("State code of the city").nullish(), + archived: z.boolean().describe("Whether the city is archived").nullish(), + countryId: z.string().describe("Country ID").nullish(), + country: CityCountryDtoSchema.nullish(), + createdById: z.string().nullish(), + createdBy: CityEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: CityEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type CityResponseDTO = z.infer; + + /** + * CityLabelCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CityLabelCountryDto = z.infer; + + /** + * CityLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { CityLabelCountryDto } country + */ + export const CityLabelResponseDTOSchema = z + .object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }) + .readonly(); + export type CityLabelResponseDTO = z.infer; + + /** + * CityPaginationFilterDtoSchema + * @type { object } + * @property { string } search Free search + * @property { boolean } archived + */ + export const CityPaginationFilterDtoSchema = z + .object({ search: z.string().describe("Free search"), archived: z.boolean() }) + .readonly(); + export type CityPaginationFilterDto = z.infer; + + /** + * CityLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const CityLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type CityLabelFilterDto = z.infer; + + /** + * CreateCityRequestDTOSchema + * @type { object } + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { string } countryId Country ID + */ + export const CreateCityRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the city"), + isoCode: z.string().describe("ISO code of the city").nullish(), + stateCode: z.string().describe("State code of the city").nullish(), + countryId: z.string().describe("Country ID"), + }) + .readonly(); + export type CreateCityRequestDTO = z.infer; + + /** + * UpdateCityRequestDTOSchema + * @type { object } + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { string } countryId Country ID + */ + export const UpdateCityRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the city"), + isoCode: z.string().describe("ISO code of the city"), + stateCode: z.string().describe("State code of the city"), + countryId: z.string().describe("Country ID"), + }) + .readonly(); + export type UpdateCityRequestDTO = z.infer; + + /** + * CitiesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const CitiesPaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type CitiesPaginateOrderParamEnum = z.infer; + export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.enum; + + /** + * CitiesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CityResponseDTO[] } items + */ + export const CitiesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CityResponseDTOSchema).readonly() }).readonly().shape, + }); + export type CitiesPaginateResponse = z.infer; + + /** + * ListCityLabelsOrderParamEnumSchema + * @type { enum } + */ + export const ListCityLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ListCityLabelsOrderParamEnum = z.infer; + export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.enum; + + /** + * ListCityLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CityLabelResponseDTO[] } items + */ + export const ListCityLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CityLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ListCityLabelsResponse = z.infer; +} diff --git a/test/generated/base/cities/cities.queries.ts b/test/generated/base/cities/cities.queries.ts new file mode 100644 index 0000000..1ea1e83 --- /dev/null +++ b/test/generated/base/cities/cities.queries.ts @@ -0,0 +1,370 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CitiesAcl } from "./cities.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CitiesModels } from "./cities.models"; +import { CitiesApi } from "./cities.api"; + +export namespace CitiesQueries { + export const moduleName = QueryModule.Cities; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: CitiesModels.CityPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/cities", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: CitiesModels.CityPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/cities", "infinite", limit, order, filter, cursor] as const, + listCityLabels: ( + limit?: number, + order?: string, + filter?: CitiesModels.CityLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/cities/paginate/labels", limit, order, filter, page, cursor] as const, + listCityLabelsInfinite: ( + limit?: number, + order?: string, + filter?: CitiesModels.CityLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/cities/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getCityLabelById: (id: string) => [...keys.all, "/cities/:id/labels", id] as const, + findById: (id: string) => [...keys.all, "/cities/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Cities + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: CitiesModels.CityPaginationFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CitiesAcl.canUsePaginate()); + return CitiesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Cities + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CitiesModels.CityPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CitiesAcl.canUsePaginate()); + return CitiesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create city + * @permission Requires `canUseCreate` ability + * @param { CitiesModels.CreateCityRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CitiesAcl.canUseCreate()); + return CitiesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListCityLabels` + * @summary Paginate cities with only their labels (id and name) and country information + * @permission Requires `canUseListCityLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListCityLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: CitiesModels.CityLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCityLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CitiesAcl.canUseListCityLabels()); + return CitiesApi.listCityLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListCityLabelsInfinite + * @summary Paginate cities with only their labels (id and name) and country information + * @permission Requires `canUseListCityLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListCityLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CitiesModels.CityLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CitiesAcl.canUseListCityLabels()); + return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetCityLabelById` + * @summary Get city by ID with label format (id and formatted name) and country information + * @permission Requires `canUseGetCityLabelById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCityLabelById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCityLabelById(id), + queryFn: () => { + checkAcl(CitiesAcl.canUseGetCityLabelById()); + return CitiesApi.getCityLabelById(id, config); + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get city by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(CitiesAcl.canUseFindById()); + return CitiesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update city + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { CitiesModels.UpdateCityRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(CitiesAcl.canUseUpdate()); + return CitiesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive city + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CitiesAcl.canUseArchive()); + return CitiesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive city + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CitiesAcl.canUseUnarchive()); + return CitiesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/common/common.models.ts b/test/generated/base/common/common.models.ts new file mode 100644 index 0000000..1f7c6e6 --- /dev/null +++ b/test/generated/base/common/common.models.ts @@ -0,0 +1,1969 @@ +import { z } from "zod"; + +export namespace CommonModels { +/** + * PositionCargoPackageEnumSchema + * @type { enum } + */ +export const PositionCargoPackageEnumSchema = z.enum(["Hazardous", "NonStackable", "TemperatureControlled", "OversizedCargo", "DiplomaticCargo"]); +export type PositionCargoPackageEnum = z.infer; +export const PositionCargoPackageEnum = PositionCargoPackageEnumSchema.enum; + +/** + * HazardousSpecialtyEnumSchema + * @type { enum } + */ +export const HazardousSpecialtyEnumSchema = z.enum(["Explosives", "FlammableGas", "NonToxicAndFlammableGas", "PoisonGases", "FlammableLiquid", "FlammableSolid", "SpontaneouslyCombustible", "DangerousWhenWet", "Oxidizers", "OrganicPeroxides", "Poison", "InfectiousSubstances", "Radioactive", "Corrosive", "MiscellaneousDangerousSubstances"]); +export type HazardousSpecialtyEnum = z.infer; +export const HazardousSpecialtyEnum = HazardousSpecialtyEnumSchema.enum; + +/** + * RateOptionsEnumSchema + * @type { enum } + */ +export const RateOptionsEnumSchema = z.enum(["AsAgreed", "SpotRate"]); +export type RateOptionsEnum = z.infer; +export const RateOptionsEnum = RateOptionsEnumSchema.enum; + +/** + * RateClassEnumSchema + * @type { enum } + */ +export const RateClassEnumSchema = z.enum(["MinimumCharge", "NormalRate", "QuantityRate"]); +export type RateClassEnum = z.infer; +export const RateClassEnum = RateClassEnumSchema.enum; + +/** + * AccountInformationEnumSchema + * @type { enum } + * @description Account information + */ +export const AccountInformationEnumSchema = z.enum(["FreightCollect", "FreightPrepaid"]); +export type AccountInformationEnum = z.infer; +export const AccountInformationEnum = AccountInformationEnumSchema.enum; + +/** + * LanguageEnumSchema + * @type { enum } + */ +export const LanguageEnumSchema = z.enum(["English", "German", "Hungarian", "Czech", "Turkish", "Slovenian"]); +export type LanguageEnum = z.infer; +export const LanguageEnum = LanguageEnumSchema.enum; + +/** + * LocaleEnumSchema + * @type { enum } + */ +export const LocaleEnumSchema = z.enum(["en-US", "de-DE", "cs-CZ", "sl-SI", "tr-TR", "hu-HU"]); +export type LocaleEnum = z.infer; +export const LocaleEnum = LocaleEnumSchema.enum; + +/** + * OfficePaymentTermsDateTypeSchema + * @type { enum } + */ +export const OfficePaymentTermsDateTypeSchema = z.enum(["InvoiceDate", "ServiceDate"]); +export type OfficePaymentTermsDateType = z.infer; +export const OfficePaymentTermsDateType = OfficePaymentTermsDateTypeSchema.enum; + +/** + * FolderEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type FolderEmployeeDTO = z.infer; + + +/** + * FileResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } archived + * @property { boolean } isSystem + * @property { string } createdAt + * @property { string } updatedAt + * @property { FolderEmployeeDTO } createdBy + * @property { FolderEmployeeDTO } updatedBy + * @property { string } downloadUrl + */ +export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }).readonly(); +export type FileResponseDTO = z.infer; + + +/** + * EditorContentUpdateDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const EditorContentUpdateDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export type EditorContentUpdateDto = z.infer; + + +/** + * RemarkBlockDTOSchema + * @type { object } + * @property { string } id + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { EditorContentUpdateDto } content + */ +export const RemarkBlockDTOSchema = z.object({ id: z.string(), enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), content: CommonModels.EditorContentUpdateDtoSchema }).readonly(); +export type RemarkBlockDTO = z.infer; + + +/** + * TitleBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { string } defaultTitle + * @property { boolean } includePositionNumber + * @property { boolean } allowManualOverride + */ +export const TitleBlockDTOSchema = z.object({ enabled: z.boolean(), defaultTitle: z.string(), includePositionNumber: z.boolean(), allowManualOverride: z.boolean() }).readonly(); +export type TitleBlockDTO = z.infer; + + +/** + * PositionInvolvedPartyTypeEnumSchema + * @type { enum } + */ +export const PositionInvolvedPartyTypeEnumSchema = z.enum(["Customer", "Notify", "AlsoNotify", "FOBForwarder", "RoutingAgent", "DeliveryAgent", "TransportProvider", "OceanCarrier", "OriginServiceProvider", "DestinationServiceProvider", "InsuranceProvider", "OriginCustomsAgent", "DestinationCustomsAgent", "StuffingProvider", "StrippingProvider", "Shipper", "Consignee", "CustomsBroker", "Courier", "Trucker", "Airline", "DestinationAgent", "OriginAgent"]); +export type PositionInvolvedPartyTypeEnum = z.infer; +export const PositionInvolvedPartyTypeEnum = PositionInvolvedPartyTypeEnumSchema.enum; + +/** + * ReceiverBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { string } defaultRole + */ +export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema }).readonly(); +export type ReceiverBlockDTO = z.infer; + + +/** + * OurInformationBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } showName + * @property { boolean } showPhone + * @property { boolean } showDate + * @property { boolean } showBookingNumber + * @property { boolean } showCustomerReference + * @property { boolean } showMasterBillOfLadingNumber + * @property { boolean } showHouseBillOfLadingNumber + */ +export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean(), showName: z.boolean(), showPhone: z.boolean(), showDate: z.boolean(), showBookingNumber: z.boolean(), showCustomerReference: z.boolean(), showMasterBillOfLadingNumber: z.boolean(), showHouseBillOfLadingNumber: z.boolean() }).readonly(); +export type OurInformationBlockDTO = z.infer; + + +/** + * RouteTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } showDate + * @property { boolean } showLocation + * @property { boolean } showType + * @property { boolean } showReference + * @property { boolean } showVesselVoyage + * @property { boolean } showAddress + * @property { boolean } showProvider + */ +export const RouteTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showDate: z.boolean(), showLocation: z.boolean(), showType: z.boolean(), showReference: z.boolean(), showVesselVoyage: z.boolean(), showAddress: z.boolean(), showProvider: z.boolean() }).readonly(); +export type RouteTableBlockDTO = z.infer; + + +/** + * CargoTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + */ +export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export type CargoTableBlockDTO = z.infer; + + +/** + * CargoSummaryBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + */ +export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export type CargoSummaryBlockDTO = z.infer; + + +/** + * FinanceTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } showOnlyForReceiver + * @property { boolean } showVendor + * @property { boolean } showBuyRate + * @property { boolean } showCustomer + * @property { boolean } showSellRate + * @property { boolean } showGrid + * @property { boolean } showCharges + * @property { boolean } showAdditionalText + * @property { boolean } showQuantity + * @property { boolean } showProfit + * @property { boolean } showTotalsByCurrency + * @property { boolean } includeSubPositions + * @property { boolean } subPositionTotals + * @property { boolean } showBuyRateExchangeRates + * @property { boolean } showSellRateExchangeRates + * @property { boolean } showTotal + */ +export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showOnlyForReceiver: z.boolean(), showVendor: z.boolean(), showBuyRate: z.boolean(), showCustomer: z.boolean(), showSellRate: z.boolean(), showGrid: z.boolean(), showCharges: z.boolean(), showAdditionalText: z.boolean(), showQuantity: z.boolean(), showProfit: z.boolean(), showTotalsByCurrency: z.boolean(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean(), showSellRateExchangeRates: z.boolean(), showTotal: z.boolean() }).readonly(); +export type FinanceTableBlockDTO = z.infer; + + +/** + * FooterBlockDTOSchema + * @type { object } + * @property { boolean } enabled + */ +export const FooterBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export type FooterBlockDTO = z.infer; + + +/** + * TermsBlockDTOSchema + * @type { object } + * @property { boolean } enabled + */ +export const TermsBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export type TermsBlockDTO = z.infer; + + +/** + * CutOffDatesBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } billOfLadingFromCustomer + * @property { boolean } billOfLadingToCarrier + * @property { boolean } customsAMS + * @property { boolean } vgmCustomer + */ +export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), billOfLadingFromCustomer: z.boolean(), billOfLadingToCarrier: z.boolean(), customsAMS: z.boolean(), vgmCustomer: z.boolean() }).readonly(); +export type CutOffDatesBlockDTO = z.infer; + + +/** + * TemplateBlocksResponseDTOSchema + * @type { object } + * @property { TitleBlockDTO } titleBlock + * @property { ReceiverBlockDTO } receiverBlock + * @property { OurInformationBlockDTO } ourInformationBlock + * @property { RouteTableBlockDTO } routeTableBlock + * @property { CargoTableBlockDTO } cargoTableBlock + * @property { CargoSummaryBlockDTO } cargoSummaryBlock + * @property { FinanceTableBlockDTO } financeTableBlock + * @property { RemarkBlockDTO[] } remarkBlocks + * @property { FooterBlockDTO } footerBlock + * @property { TermsBlockDTO } termsBlock + * @property { CutOffDatesBlockDTO } cutOffDatesBlock + */ +export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); +export type TemplateBlocksResponseDTO = z.infer; + + +/** + * RouteTableProviderDtoSchema + * @type { object } + * @property { string } id Provider ID + * @property { string } name Provider name + */ +export const RouteTableProviderDtoSchema = z.object({ id: z.string().describe("Provider ID"), name: z.string().describe("Provider name") }).readonly(); +export type RouteTableProviderDto = z.infer; + + +/** + * RouteTablePointDtoSchema + * @type { object } + * @property { string } id Route point ID + * @property { string } type Route point type + * @property { string } datetime Route point datetime + * @property { string } secondaryDatetime Route point secondary datetime + * @property { string } address Route point address + * @property { string } name Route point address name + * @property { string } reference Route point reference + * @property { RouteTableProviderDto } provider Route point provider + * @property { string } vessel Vessel information + * @property { string } voyage Voyage information + * @property { string } carrier Carrier name + */ +export const RouteTablePointDtoSchema = z.object({ id: z.string().describe("Route point ID"), type: z.string().describe("Route point type"), datetime: z.string().describe("Route point datetime").nullish(), secondaryDatetime: z.string().describe("Route point secondary datetime").nullish(), address: z.string().describe("Route point address").nullish(), name: z.string().describe("Route point address name").nullish(), reference: z.string().describe("Route point reference").nullish(), provider: CommonModels.RouteTableProviderDtoSchema.describe("Route point provider").nullish(), vessel: z.string().describe("Vessel information").nullish(), voyage: z.string().describe("Voyage information").nullish(), carrier: z.string().describe("Carrier name").nullish() }).readonly(); +export type RouteTablePointDto = z.infer; + + +/** + * RouteTableBlockResponseDtoSchema + * @type { object } + * @property { string } selectedRouteId Selected route ID + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { boolean } showReference Show reference column + * @property { boolean } showVesselVoyage Show vessel/voyage column + * @property { boolean } showProvider Show provider column + * @property { RouteTablePointDto[] } points Route points + * @property { boolean } showAddress Show address + * @property { boolean } showDates Show dates + * @property { boolean } showType Show type + * @property { boolean } showLocation Show location + * @property { boolean } showGrid Show grid + * @property { boolean } suppressRoute Suppress route + */ +export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID").nullish(), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish(), showAddress: z.boolean().describe("Show address").nullish(), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); +export type RouteTableBlockResponseDto = z.infer; + + +/** + * CargoSpecialtyDtoSchema + * @type { object } + * @property { string } name + * @property { string } unNumber UN number for hazardous specialty + * @property { string } IMOClass IMO class for hazardous specialty + * @property { number } temperatureFrom Temperature from (°C) for temperature-controlled specialty + * @property { number } temperatureUntil Temperature until (°C) for temperature-controlled specialty + */ +export const CargoSpecialtyDtoSchema = z.object({ name: CommonModels.PositionCargoPackageEnumSchema, unNumber: z.string().describe("UN number for hazardous specialty").nullish(), IMOClass: z.string().describe("IMO class for hazardous specialty").nullish(), temperatureFrom: z.number().describe("Temperature from (°C) for temperature-controlled specialty").nullish(), temperatureUntil: z.number().describe("Temperature until (°C) for temperature-controlled specialty").nullish() }).readonly(); +export type CargoSpecialtyDto = z.infer; + + +/** + * CargoPackageDtoSchema + * @type { object } + * @property { string } id Package ID + * @property { string } description Package description + * @property { string } weight Weight + * @property { string } hsCodes HS codes (numeric only) + * @property { number } quantity Quantity + * @property { number } width Width (cm) + * @property { number } length Length (cm) + * @property { number } height Height (cm) + * @property { number } volume Total volume in m3 for this package group + * @property { string } packageType Package type name + * @property { string } caseMarks Case marks + * @property { CargoSpecialtyDto[] } specialties Package specialties + * @property { number } chargeableWeight Chargeable weight in kg + * @property { number } volumetricWeight Volumetric weight in kg + */ +export const CargoPackageDtoSchema = z.object({ id: z.string().describe("Package ID"), description: z.string().describe("Package description").nullish(), weight: z.string().describe("Weight").nullish(), hsCodes: z.string().describe("HS codes (numeric only)").nullish(), quantity: z.number().describe("Quantity").nullish(), width: z.number().describe("Width (cm)").nullish(), length: z.number().describe("Length (cm)").nullish(), height: z.number().describe("Height (cm)").nullish(), volume: z.number().describe("Total volume in m3 for this package group").nullish(), packageType: z.string().describe("Package type name").nullish(), caseMarks: z.string().describe("Case marks").nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).readonly().describe("Package specialties").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg").nullish() }).readonly(); +export type CargoPackageDto = z.infer; + + +/** + * CargoItemRouteDtoSchema + * @type { object } + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { RouteTablePointDto[] } points Route points + */ +export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish() }).readonly(); +export type CargoItemRouteDto = z.infer; + + +/** + * CargoItemDtoSchema + * @type { object } + * @property { string } cargoId Cargo ID + * @property { string } cargoType Cargo type + * @property { string } containerNumber Container number + * @property { string } seal1 First seal (sea cargo only) + * @property { string } seal2 Second seal (sea cargo only) + * @property { string } vgm Verified gross mass (VGM) for container, sea cargo only + * @property { number } totalGrossWeight Total gross weight from cargo details + * @property { number } totalVolume Total volume (m3) calculated from cargo packages + * @property { number } chargeableWeight Chargeable weight in kg for transport unit + * @property { number } volumetricWeight Volumetric weight in kg for transport unit + * @property { CargoPackageDto[] } packages Cargo packages + * @property { string[] } selectedPackageIds Selected cargo package IDs + * @property { CargoItemRouteDto } route Cargo route (when routes are split) + */ +export const CargoItemDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID"), cargoType: z.string().describe("Cargo type"), containerNumber: z.string().describe("Container number").nullish(), seal1: z.string().describe("First seal (sea cargo only)").nullish(), seal2: z.string().describe("Second seal (sea cargo only)").nullish(), vgm: z.string().describe("Verified gross mass (VGM) for container, sea cargo only").nullish(), totalGrossWeight: z.number().describe("Total gross weight from cargo details").nullish(), totalVolume: z.number().describe("Total volume (m3) calculated from cargo packages").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg for transport unit").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg for transport unit").nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema).readonly().describe("Cargo packages"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteDtoSchema.describe("Cargo route (when routes are split)").nullish() }).readonly(); +export type CargoItemDto = z.infer; + + +/** + * CargoTableBlockDtoSchema + * @type { object } + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { boolean } suppressWeight Suppress weight column display + * @property { boolean } showGrid Show grid borders in cargo table + * @property { boolean } suppressVolume Suppress volume column display + * @property { boolean } suppressSpecialities Suppress specialities column display + * @property { boolean } suppressDimensions Suppress dimensions column display + * @property { boolean } suppressPackageVolume Suppress package volume column display + * @property { boolean } suppressPackageWeight Suppress package weight column display + * @property { boolean } showGrandTotal Show grand total + * @property { boolean } showTransportUnitTotal Show transport unit total + * @property { boolean } showRoute Show route information (only applicable when routes are split) + * @property { boolean } suppressCargo Suppress cargo table display + * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units + * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units + * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages + * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages + * @property { boolean } showPackageHSCodes Show HS codes for packages + * @property { boolean } showPackageType Show package type for packages + * @property { boolean } showPackageQuantity Show quantity for packages + * @property { boolean } showPackageDescription Show description for packages + * @property { boolean } showPackageCaseMarks Show case marks for packages + * @property { boolean } showTransportUnitNumber Show transport unit number + * @property { boolean } showTransportUnitType Show transport unit type + * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 + * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 + * @property { CargoItemDto[] } items Cargo items + */ +export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs").nullish(), suppressWeight: z.boolean().describe("Suppress weight column display").nullish(), showGrid: z.boolean().describe("Show grid borders in cargo table").nullish(), suppressVolume: z.boolean().describe("Suppress volume column display").nullish(), suppressSpecialities: z.boolean().describe("Suppress specialities column display").nullish(), suppressDimensions: z.boolean().describe("Suppress dimensions column display").nullish(), suppressPackageVolume: z.boolean().describe("Suppress package volume column display").nullish(), suppressPackageWeight: z.boolean().describe("Suppress package weight column display").nullish(), showGrandTotal: z.boolean().describe("Show grand total").nullish(), showTransportUnitTotal: z.boolean().describe("Show transport unit total").nullish(), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullish(), suppressCargo: z.boolean().describe("Suppress cargo table display").nullish(), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units").nullish(), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units").nullish(), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages").nullish(), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages").nullish(), showPackageHSCodes: z.boolean().describe("Show HS codes for packages").nullish(), showPackageType: z.boolean().describe("Show package type for packages").nullish(), showPackageQuantity: z.boolean().describe("Show quantity for packages").nullish(), showPackageDescription: z.boolean().describe("Show description for packages").nullish(), showPackageCaseMarks: z.boolean().describe("Show case marks for packages").nullish(), showTransportUnitNumber: z.boolean().describe("Show transport unit number").nullish(), showTransportUnitType: z.boolean().describe("Show transport unit type").nullish(), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1").nullish(), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2").nullish(), items: z.array(CommonModels.CargoItemDtoSchema).readonly().describe("Cargo items") }).readonly(); +export type CargoTableBlockDto = z.infer; + + +/** + * SummaryCargoItemDtoSchema + * @type { object } + * @property { string } transportUnitType Cargo type name (transport unit type) + * @property { number } quantity Count of cargos for this type + * @property { string } description Comma-joined transport unit numbers or custom description + */ +export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), quantity: z.number().describe("Count of cargos for this type"), description: z.string().describe("Comma-joined transport unit numbers or custom description") }).readonly(); +export type SummaryCargoItemDto = z.infer; + + +/** + * SummaryCargoBlockResponseDtoSchema + * @type { object } + * @property { SummaryCargoItemDto[] } items + */ +export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema).readonly() }).readonly(); +export type SummaryCargoBlockResponseDto = z.infer; + + +/** + * PositionAccountItemTypeEnumSchema + * @type { enum } + */ +export const PositionAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); +export type PositionAccountItemTypeEnum = z.infer; +export const PositionAccountItemTypeEnum = PositionAccountItemTypeEnumSchema.enum; + +/** + * FinanceRowDtoSchema + * @type { object } + * @property { string } id Finance row ID + * @property { PositionAccountItemTypeEnum } type Item type + * @property { string } chargeType Charge type + * @property { string } additionalText Additional text + * @property { string } text Text content + * @property { number } buyAmount Buy amount + * @property { string } buyCurrencyNotation Buy currency notation + * @property { number } sellAmount Sell amount + * @property { string } sellCurrencyNotation Sell currency notation + * @property { string } buyBPName Buy business partner name + * @property { string } sellBPName Sell business partner name + * @property { number } sellExchangeRate Sell exchange rate + * @property { number } buyExchangeRate Buy exchange rate + * @property { number } quantity Quantity + */ +export const FinanceRowDtoSchema = z.object({ id: z.string().describe("Finance row ID"), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), chargeType: z.string().describe("Charge type").nullish(), additionalText: z.string().describe("Additional text").nullish(), text: z.string().describe("Text content").nullish(), buyAmount: z.number().describe("Buy amount").nullish(), buyCurrencyNotation: z.string().describe("Buy currency notation").nullish(), sellAmount: z.number().describe("Sell amount").nullish(), sellCurrencyNotation: z.string().describe("Sell currency notation").nullish(), buyBPName: z.string().describe("Buy business partner name").nullish(), sellBPName: z.string().describe("Sell business partner name").nullish(), sellExchangeRate: z.number().describe("Sell exchange rate").nullish(), buyExchangeRate: z.number().describe("Buy exchange rate").nullish(), quantity: z.number().describe("Quantity").nullish() }).readonly(); +export type FinanceRowDto = z.infer; + + +/** + * FinanceTotalsDtoSchema + * @type { object } + * @property { number } customerTotal Customer total + * @property { number } vendorTotal Vendor total + * @property { number } combinedTotal Combined total + * @property { string } currencyNotation Currency notation + */ +export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().describe("Customer total"), vendorTotal: z.number().describe("Vendor total"), combinedTotal: z.number().describe("Combined total"), currencyNotation: z.string().describe("Currency notation") }).readonly(); +export type FinanceTotalsDto = z.infer; + + +/** + * FinanceTotalsByCurrencyDtoSchema + * @type { object } + * @property { string } currencyNotation Currency notation + * @property { number } vendorTotal Total for vendor side in this currency + * @property { number } customerTotal Total for customer side in this currency + */ +export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string().describe("Currency notation"), vendorTotal: z.number().describe("Total for vendor side in this currency").nullish(), customerTotal: z.number().describe("Total for customer side in this currency").nullish() }).readonly(); +export type FinanceTotalsByCurrencyDto = z.infer; + + +/** + * FinanceTablePositionDtoSchema + * @type { object } + * @property { FinanceRowDto[] } rows Finance rows + * @property { FinanceTotalsDto } totals Finance totals + * @property { string[] } selectedFinanceRowIds Selected finance row IDs + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency + */ +export const FinanceTablePositionDtoSchema = z.object({ rows: z.array(CommonModels.FinanceRowDtoSchema).readonly().describe("Finance rows"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); +export type FinanceTablePositionDto = z.infer; + + +/** + * FinanceTableBlockDtoSchema + * @type { object } + * @property { string } selectedBpId Selected business partner ID + * @property { boolean } showVendor Show vendor + * @property { boolean } showBuyRate Show buy rate + * @property { boolean } showCustomer Show customer + * @property { boolean } showSellRate Show sell rate + * @property { boolean } showGrid Show grid + * @property { boolean } showCharges Show charges + * @property { boolean } showAdditionalText Show additional text + * @property { boolean } showQuantity Show quantity + * @property { boolean } showTotalsByCurrency Show totals grouped by currency + * @property { boolean } suppressFinances Suppress finances from output + * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero + * @property { boolean } showTotal Show total from output + * @property { boolean } showProfit Show profit from output + * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output + * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output + * @property { boolean } includeSubPositions Include sub-positions + * @property { boolean } subPositionTotals Show sub-position totals + * @property { FinanceTablePositionDto[] } positions Finance positions + * @property { FinanceTotalsDto } totals Finance totals + * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency + */ +export const FinanceTableBlockDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionDtoSchema).readonly().describe("Finance positions"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); +export type FinanceTableBlockDto = z.infer; + + +/** + * RemarkBlockDtoSchema + * @type { object } + * @property { string } id + * @property { number } position Minimum: `1` + * @property { EditorContentUpdateDto } content + * @property { boolean } enabled + */ +export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }).readonly(); +export type RemarkBlockDto = z.infer; + + +/** + * ConfigBlockDtoSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + * @property { boolean } showWatermarkOnDocuments Show watermark on documents + * @property { LocaleEnum } locale + */ +export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), showWatermarkOnDocuments: z.boolean().describe("Show watermark on documents"), locale: CommonModels.LocaleEnumSchema }).readonly(); +export type ConfigBlockDto = z.infer; + + +/** + * TitleBlockUpdateDtoSchema + * @type { object } + * @property { string } value Title value + */ +export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().describe("Title value") }).readonly(); +export type TitleBlockUpdateDto = z.infer; + + +/** + * ReceiverBlockUpdateDtoSchema + * @type { object } + * @property { string } selectedBpId Receiver business partner ID + * @property { string } address Receiver address + */ +export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Receiver business partner ID"), address: z.string().describe("Receiver address") }).readonly(); +export type ReceiverBlockUpdateDto = z.infer; + + +/** + * OurInformationBlockUpdateDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } phone Phone number + * @property { string } date Date + * @property { string } bookingNumber Booking number + * @property { string } customerReference Customer reference + * @property { string } masterBillOfLadingNumber Master bill of lading number + * @property { string } houseBillOfLadingNumber House bill of lading number + * @property { string } positionNumber Position number + */ +export const OurInformationBlockUpdateDtoSchema = z.object({ name: z.string().describe("Name"), phone: z.string().describe("Phone number"), date: z.string().describe("Date"), bookingNumber: z.string().describe("Booking number"), customerReference: z.string().describe("Customer reference"), masterBillOfLadingNumber: z.string().describe("Master bill of lading number"), houseBillOfLadingNumber: z.string().describe("House bill of lading number"), positionNumber: z.string().describe("Position number") }).readonly(); +export type OurInformationBlockUpdateDto = z.infer; + + +/** + * TermsBlockDtoSchema + * @type { object } + * @property { string } termsImageUrl Terms image URL + */ +export const TermsBlockDtoSchema = z.object({ termsImageUrl: z.string().describe("Terms image URL") }).readonly(); +export type TermsBlockDto = z.infer; + + +/** + * CutOffDatesBlockUpdateDtoSchema + * @type { object } + * @property { string } billOfLadingFromCustomer Bill of lading from customer date + * @property { string } billOfLadingToCarrier Bill of lading to carrier date + * @property { string } customsAMS Customs AMS date + * @property { string } vgmCustomer VGM customer date + */ +export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().describe("Bill of lading from customer date"), billOfLadingToCarrier: z.string().describe("Bill of lading to carrier date"), customsAMS: z.string().describe("Customs AMS date"), vgmCustomer: z.string().describe("VGM customer date") }).readonly(); +export type CutOffDatesBlockUpdateDto = z.infer; + + +/** + * TemplatedDocumentDataDtoSchema + * @type { object } + * @property { TitleBlockUpdateDto } title Title block data + * @property { ReceiverBlockUpdateDto } receiver Receiver block data + * @property { OurInformationBlockUpdateDto } ourInformation Our information block data + * @property { RouteTableBlockResponseDto } routeTable Route table block data + * @property { CargoTableBlockDto } cargoTable Cargo table block data + * @property { SummaryCargoBlockResponseDto } summaryCargo Summary cargo block data + * @property { FinanceTableBlockDto } financeTable Finance table block data + * @property { RemarkBlockDto[] } remarks Remark blocks + * @property { TermsBlockDto } terms Terms block data + * @property { ConfigBlockDto } config Config block data + * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data + */ +export const TemplatedDocumentDataDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableBlockResponseDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockResponseDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockDtoSchema).readonly().describe("Remark blocks"), terms: CommonModels.TermsBlockDtoSchema.describe("Terms block data"), config: CommonModels.ConfigBlockDtoSchema.describe("Config block data"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); +export type TemplatedDocumentDataDto = z.infer; + + +/** + * RouteTableUpdateBlockDtoSchema + * @type { object } + * @property { string } selectedRouteId Selected route ID + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { boolean } showReference Show reference column + * @property { boolean } showVesselVoyage Show vessel/voyage column + * @property { boolean } showProvider Show provider column + * @property { RouteTablePointDto[] } points Route points + * @property { boolean } showAddress Show address + * @property { boolean } showDates Show dates + * @property { boolean } showType Show type + * @property { boolean } showLocation Show location + * @property { boolean } showGrid Show grid + * @property { boolean } suppressRoute Suppress route + */ +export const RouteTableUpdateBlockDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID"), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points"), showAddress: z.boolean().describe("Show address"), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); +export type RouteTableUpdateBlockDto = z.infer; + + +/** + * CargoItemRouteUpdateDtoSchema + * @type { object } + * @property { string[] } selectedRoutePointIds Selected route point IDs + */ +export const CargoItemRouteUpdateDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs") }).readonly(); +export type CargoItemRouteUpdateDto = z.infer; + + +/** + * CargoItemUpdateDtoSchema + * @type { object } + * @property { string } cargoId Cargo ID to update packages for + * @property { string[] } selectedPackageIds Selected cargo package IDs + * @property { CargoItemRouteUpdateDto } route Cargo route (when routes are split) + */ +export const CargoItemUpdateDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID to update packages for"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteUpdateDtoSchema.describe("Cargo route (when routes are split)") }).readonly(); +export type CargoItemUpdateDto = z.infer; + + +/** + * CargoTableBlockUpdateDtoSchema + * @type { object } + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { CargoItemUpdateDto[] } items Cargo items for package updates + * @property { boolean } suppressWeight Suppress weight column display + * @property { boolean } showGrid Show grid borders in cargo table + * @property { boolean } suppressVolume Suppress volume column display + * @property { boolean } suppressSpecialities Suppress specialities column display + * @property { boolean } suppressDimensions Suppress dimensions column display + * @property { boolean } suppressPackageVolume Suppress package volume column display + * @property { boolean } suppressPackageWeight Suppress package weight column display + * @property { boolean } showRoute Show route information (only applicable when routes are split) + * @property { boolean } showGrandTotal Show grand total + * @property { boolean } showTransportUnitTotal Show transport unit total + * @property { boolean } suppressCargo Suppress cargo table display + * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units + * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units + * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages + * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages + * @property { boolean } showPackageHSCodes Show HS codes for packages + * @property { boolean } showPackageType Show package type for packages + * @property { boolean } showPackageQuantity Show quantity for packages + * @property { boolean } showPackageDescription Show description for packages + * @property { boolean } showPackageCaseMarks Show case marks for packages + * @property { boolean } showTransportUnitNumber Show transport unit number + * @property { boolean } showTransportUnitType Show transport unit type + * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 + * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 + */ +export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), items: z.array(CommonModels.CargoItemUpdateDtoSchema).readonly().describe("Cargo items for package updates"), suppressWeight: z.boolean().describe("Suppress weight column display"), showGrid: z.boolean().describe("Show grid borders in cargo table"), suppressVolume: z.boolean().describe("Suppress volume column display"), suppressSpecialities: z.boolean().describe("Suppress specialities column display"), suppressDimensions: z.boolean().describe("Suppress dimensions column display"), suppressPackageVolume: z.boolean().describe("Suppress package volume column display"), suppressPackageWeight: z.boolean().describe("Suppress package weight column display"), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullable(), showGrandTotal: z.boolean().describe("Show grand total"), showTransportUnitTotal: z.boolean().describe("Show transport unit total"), suppressCargo: z.boolean().describe("Suppress cargo table display"), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units"), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units"), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages"), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages"), showPackageHSCodes: z.boolean().describe("Show HS codes for packages"), showPackageType: z.boolean().describe("Show package type for packages"), showPackageQuantity: z.boolean().describe("Show quantity for packages"), showPackageDescription: z.boolean().describe("Show description for packages"), showPackageCaseMarks: z.boolean().describe("Show case marks for packages"), showTransportUnitNumber: z.boolean().describe("Show transport unit number"), showTransportUnitType: z.boolean().describe("Show transport unit type"), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1"), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2") }).readonly(); +export type CargoTableBlockUpdateDto = z.infer; + + +/** + * SummaryCargoItemUpdateDtoSchema + * @type { object } + * @property { string } transportUnitType Cargo type name (transport unit type) + * @property { string } description Updated description for this cargo type + */ +export const SummaryCargoItemUpdateDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), description: z.string().describe("Updated description for this cargo type") }).readonly(); +export type SummaryCargoItemUpdateDto = z.infer; + + +/** + * SummaryCargoBlockUpdateDtoSchema + * @type { object } + * @property { SummaryCargoItemUpdateDto[] } items + */ +export const SummaryCargoBlockUpdateDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemUpdateDtoSchema).readonly() }).readonly(); +export type SummaryCargoBlockUpdateDto = z.infer; + + +/** + * FinanceTablePositionUpdateDtoSchema + * @type { object } + * @property { string[] } selectedFinanceRowIds Selected finance row IDs + * @property { string } positionId Position ID + */ +export const FinanceTablePositionUpdateDtoSchema = z.object({ selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID") }).readonly(); +export type FinanceTablePositionUpdateDto = z.infer; + + +/** + * FinanceTableBlockUpdateDtoSchema + * @type { object } + * @property { string } selectedBpId Selected business partner ID + * @property { boolean } showVendor Show vendor + * @property { boolean } showBuyRate Show buy rate + * @property { boolean } showCustomer Show customer + * @property { boolean } showSellRate Show sell rate + * @property { boolean } showGrid Show grid + * @property { boolean } showCharges Show charges + * @property { boolean } showAdditionalText Show additional text + * @property { boolean } showQuantity Show quantity + * @property { boolean } showTotalsByCurrency Show totals grouped by currency + * @property { boolean } suppressFinances Suppress finances from output + * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero + * @property { boolean } showTotal Show total from output + * @property { boolean } showProfit Show profit from output + * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output + * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output + * @property { boolean } includeSubPositions Include sub-positions + * @property { boolean } subPositionTotals Show sub-position totals + * @property { FinanceTablePositionUpdateDto[] } positions Finance positions + */ +export const FinanceTableBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionUpdateDtoSchema).readonly().describe("Finance positions") }).readonly(); +export type FinanceTableBlockUpdateDto = z.infer; + + +/** + * RemarkBlockUpdateDtoSchema + * @type { object } + * @property { string } id + * @property { number } position Minimum: `1` + * @property { EditorContentUpdateDto } content + * @property { boolean } enabled + */ +export const RemarkBlockUpdateDtoSchema = z.object({ id: z.string(), position: z.number().gte(1).nullish(), content: CommonModels.EditorContentUpdateDtoSchema.nullish(), enabled: z.boolean().nullish() }).readonly(); +export type RemarkBlockUpdateDto = z.infer; + + +/** + * TemplatedDocumentDataUpdateDtoSchema + * @type { object } + * @property { TitleBlockUpdateDto } title Title block data + * @property { ReceiverBlockUpdateDto } receiver Receiver block data + * @property { OurInformationBlockUpdateDto } ourInformation Our information block data + * @property { RouteTableUpdateBlockDto } routeTable Route table block data + * @property { CargoTableBlockUpdateDto } cargoTable Cargo table block data + * @property { SummaryCargoBlockUpdateDto } summaryCargo Summary cargo block data + * @property { FinanceTableBlockUpdateDto } financeTable Finance table block data + * @property { RemarkBlockUpdateDto[] } remarks Remark blocks + * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data + */ +export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).readonly().describe("Remark blocks"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); +export type TemplatedDocumentDataUpdateDto = z.infer; + + +/** + * BusinessPartnerTypeSchema + * @type { enum } + */ +export const BusinessPartnerTypeSchema = z.enum(["businessPartner", "destinationAgent", "oceanCarrier", "office", "customsAgent", "stuffingStrippingProvider", "shipper", "fobForwarder", "routingAgent", "transportProvider", "originServiceProvider", "insuranceProvider", "consignee", "courier", "trucker", "airline", "originAgent"]); +export type BusinessPartnerType = z.infer; +export const BusinessPartnerType = BusinessPartnerTypeSchema.enum; + +/** + * BusinessPartnerAddressCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type BusinessPartnerAddressCityDto = z.infer; + + +/** + * BusinessPartnerAddressCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const BusinessPartnerAddressCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type BusinessPartnerAddressCountryDto = z.infer; + + +/** + * BusinessPartnerAddressResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the address + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street information + * @property { string } zip ZIP/Postal code + * @property { BusinessPartnerAddressCityDto } city Country data + * @property { string } district District information + * @property { BusinessPartnerAddressCountryDto } country Country data + */ +export const BusinessPartnerAddressResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the address"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street information"), zip: z.string().describe("ZIP/Postal code"), city: CommonModels.BusinessPartnerAddressCityDtoSchema.describe("Country data"), district: z.string().describe("District information"), country: CommonModels.BusinessPartnerAddressCountryDtoSchema.describe("Country data") }).readonly(); +export type BusinessPartnerAddressResponseDTO = z.infer; + + +/** + * EditorContentResponseDtoSchema + * @type { object } + * @property { string } html HTML content + * @property { object } json JSON content + * @property { any } json.[key] + */ +export const EditorContentResponseDtoSchema = z.object({ html: z.string().describe("HTML content"), json: z.object({}).catchall(z.any()).readonly().describe("JSON content") }).readonly(); +export type EditorContentResponseDto = z.infer; + + +/** + * DunningSystemReferenceDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } isDefault + */ +export const DunningSystemReferenceDTOSchema = z.object({ id: z.string(), name: z.string(), isDefault: z.boolean() }).readonly(); +export type DunningSystemReferenceDTO = z.infer; + + +/** + * TransportModeEnumSchema + * @type { enum } + */ +export const TransportModeEnumSchema = z.enum(["Air", "Sea", "Road"]); +export type TransportModeEnum = z.infer; +export const TransportModeEnum = TransportModeEnumSchema.enum; + +/** + * SeaRoutingEnumSchema + * @type { enum } + */ +export const SeaRoutingEnumSchema = z.enum(["Direct", "Transhipment"]); +export type SeaRoutingEnum = z.infer; +export const SeaRoutingEnum = SeaRoutingEnumSchema.enum; + +/** + * InvolvedPartyBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { BusinessPartnerAddressResponseDTO } address Main address information + */ +export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information").nullish() }).readonly(); +export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; + + +/** + * InvolvedPartyContactResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvolvedPartyContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvolvedPartyContactResponseDTO = z.infer; + + +/** + * InvolvedPartyResponseDtoSchema + * @type { object } + * @property { string } id + * @property { PositionInvolvedPartyTypeEnum } type + * @property { string } reference + * @property { InvolvedPartyBusinessPartnerResponseDTO } businessPartner + * @property { InvolvedPartyContactResponseDTO } contact + */ +export const InvolvedPartyResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionInvolvedPartyTypeEnumSchema, reference: z.string().nullish(), businessPartner: CommonModels.InvolvedPartyBusinessPartnerResponseDTOSchema.nullish(), contact: CommonModels.InvolvedPartyContactResponseDTOSchema.nullish() }).readonly(); +export type InvolvedPartyResponseDto = z.infer; + + +/** + * CreateInvolvedPartyRequestDtoSchema + * @type { object } + * @property { PositionInvolvedPartyTypeEnum } type Type of the involved party to create + */ +export const CreateInvolvedPartyRequestDtoSchema = z.object({ type: CommonModels.PositionInvolvedPartyTypeEnumSchema.describe("Type of the involved party to create") }).readonly(); +export type CreateInvolvedPartyRequestDto = z.infer; + + +/** + * RouteLocationTypeEnumSchema + * @type { enum } + */ +export const RouteLocationTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Port", "Terminal", "City", "Warehouse", "ContainerYard", "Airport"]); +export type RouteLocationTypeEnum = z.infer; +export const RouteLocationTypeEnum = RouteLocationTypeEnumSchema.enum; + +/** + * RoutePointLocationResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { RouteLocationTypeEnum } type + */ +export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }).readonly(); +export type RoutePointLocationResponseDto = z.infer; + + +/** + * RoutePointTypeEnumSchema + * @type { enum } + */ +export const RoutePointTypeEnumSchema = z.enum(["EmptyContainerDepot", "LoadingAddress", "Stop", "FumigationStop", "OriginCustomsStop", "StuffingLocation", "PortTerminal", "PortOfLoading", "TransshipmentPort", "PortOfDischarge", "StrippingLocation", "ContainerYard", "DestinationCustomsStop", "FinalDestination", "EmptyContainerReturn", "OriginAgent", "HandlingAgent", "XRay", "CustomsBroker", "AirportOfDeparture", "StopAirport", "DestinationAirport", "CustomsStop", "DestinationAgent", "DeliveryAddress", "Courier", "PickupAddress", "StopAddress"]); +export type RoutePointTypeEnum = z.infer; +export const RoutePointTypeEnum = RoutePointTypeEnumSchema.enum; + +/** + * IncotermsEnumSchema + * @type { enum } + */ +export const IncotermsEnumSchema = z.enum(["EXW", "FCA", "CPT", "CIP", "DAP", "DPU", "DDP", "FAS", "FOB", "CFR", "CIF"]); +export type IncotermsEnum = z.infer; +export const IncotermsEnum = IncotermsEnumSchema.enum; + +/** + * PositionRouteTransportModeEnumSchema + * @type { enum } + */ +export const PositionRouteTransportModeEnumSchema = z.enum(["Truck", "Rail/Truck", "Rail", "Barge"]); +export type PositionRouteTransportModeEnum = z.infer; +export const PositionRouteTransportModeEnum = PositionRouteTransportModeEnumSchema.enum; + +/** + * RoutePointProviderResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type RoutePointProviderResponseDto = z.infer; + + +/** + * RoutePointResponseDtoSchema + * @type { object } + * @property { string } id + * @property { RoutePointTypeEnum } type + * @property { string } name + * @property { number } sequenceNumber + * @property { RoutePointLocationResponseDto } location + * @property { string } estimatedTime + * @property { string } secondaryEstimatedTime Secondary estimated time (sea positions only) + * @property { string } reference + * @property { string } secondaryReference + * @property { IncotermsEnum } incoterm + * @property { PositionRouteTransportModeEnum } transportMode + * @property { RoutePointProviderResponseDto } provider + * @property { string } vessel Vessel name (sea positions only) + * @property { string } voyage Voyage number (sea positions only) + * @property { string } carrier Carrier name (sea positions only) + */ +export const RoutePointResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.RoutePointTypeEnumSchema, name: z.string(), sequenceNumber: z.number(), location: CommonModels.RoutePointLocationResponseDtoSchema.nullish(), estimatedTime: z.iso.datetime({ offset: true }).nullish(), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time (sea positions only)").nullish(), reference: z.string().nullish(), secondaryReference: z.string().nullish(), incoterm: CommonModels.IncotermsEnumSchema.nullish(), transportMode: CommonModels.PositionRouteTransportModeEnumSchema.nullish(), provider: CommonModels.RoutePointProviderResponseDtoSchema.nullish(), vessel: z.string().describe("Vessel name (sea positions only)").nullish(), voyage: z.string().describe("Voyage number (sea positions only)").nullish(), carrier: z.string().describe("Carrier name (sea positions only)").nullish() }).readonly(); +export type RoutePointResponseDto = z.infer; + + +/** + * RouteResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } cargoId Cargo ID (sea positions only) + * @property { string } cargoNumber Cargo number (sea positions only) + * @property { RoutePointResponseDto[] } points + */ +export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().describe("Cargo ID (sea positions only)").nullish(), cargoNumber: z.string().describe("Cargo number (sea positions only)").nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema).readonly() }).readonly(); +export type RouteResponseDto = z.infer; + + +/** + * RouteListResponseDtoSchema + * @type { object } + * @property { RouteResponseDto[] } routes + * @property { boolean } splitRoute Whether the position routes are split by cargo (sea positions only) + */ +export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema).readonly(), splitRoute: z.boolean().describe("Whether the position routes are split by cargo (sea positions only)") }).readonly(); +export type RouteListResponseDto = z.infer; + + +/** + * CreateRoutePointRequestDtoSchema + * @type { object } + * @property { RoutePointTypeEnum } type + */ +export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }).readonly(); +export type CreateRoutePointRequestDto = z.infer; + + +/** + * UpdateRoutePointRequestDtoSchema + * @type { object } + * @property { string } locationId Location ID for the route point + * @property { RouteLocationTypeEnum } locationType Type of location + * @property { string } estimatedTime Updated estimated time for the route point + * @property { string } secondaryEstimatedTime Secondary estimated time for the route point (sea positions only) + * @property { string } reference Reference for the route point + * @property { string } secondaryReference Secondary reference for the route point + * @property { IncotermsEnum } incoterm + * @property { PositionRouteTransportModeEnum } transportMode + * @property { string } providerId + * @property { string } vessel Vessel name (sea positions only) + * @property { string } voyage Voyage number (sea positions only) + * @property { string } carrier Carrier name (sea positions only) + */ +export const UpdateRoutePointRequestDtoSchema = z.object({ locationId: z.string().describe("Location ID for the route point").nullable(), locationType: CommonModels.RouteLocationTypeEnumSchema.describe("Type of location").nullable(), estimatedTime: z.iso.datetime({ offset: true }).describe("Updated estimated time for the route point"), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time for the route point (sea positions only)"), reference: z.string().describe("Reference for the route point"), secondaryReference: z.string().describe("Secondary reference for the route point"), incoterm: CommonModels.IncotermsEnumSchema, transportMode: CommonModels.PositionRouteTransportModeEnumSchema, providerId: z.string(), vessel: z.string().describe("Vessel name (sea positions only)"), voyage: z.string().describe("Voyage number (sea positions only)"), carrier: z.string().describe("Carrier name (sea positions only)") }).readonly(); +export type UpdateRoutePointRequestDto = z.infer; + + +/** + * PositionChargeDtoResponseSchema + * @type { object } + * @property { object } chargeType + * @property { string } chargeType.id + * @property { string } chargeType.name + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { object } buyVatRule + * @property { string } buyVatRule.id + * @property { string } buyVatRule.name + * @property { string } buyVatRule.matchcode + * @property { object } vendor + * @property { string } vendor.id + * @property { string } vendor.name + * @property { string } vendor.matchCode + * @property { string } vendor.label + * @property { string } vendor.debtorId + * @property { string } vendor.creditorId + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { object } sellVatRule + * @property { string } sellVatRule.id + * @property { string } sellVatRule.name + * @property { string } sellVatRule.matchcode + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { string } customer.debtorId + * @property { string } customer.creditorId + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + * @property { number } profit Profit amount + * @property { string } profitCurrencyCode Profit currency code + */ +export const PositionChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge").nullish(), buyRate: z.number().describe("Buy rate amount").nullish(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), sellRate: z.number().describe("Sell rate amount").nullish(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), profit: z.number().describe("Profit amount").nullish(), profitCurrencyCode: z.string().describe("Profit currency code").nullish() }).readonly(); +export type PositionChargeDtoResponse = z.infer; + + +/** + * PositionTextDtoResponseSchema + * @type { object } + * @property { string } content Text content + */ +export const PositionTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type PositionTextDtoResponse = z.infer; + + +/** + * PositionAccountItemDtoResponseSchema + * @type { object } + * @property { string } id Item ID + * @property { string } outgoingInvoiceId + * @property { string } registeredInvoiceId + * @property { PositionAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { PositionChargeDtoResponse } charge Charge data if type is CHARGE + * @property { PositionTextDtoResponse } text Text data if type is TEXT + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + */ +export const PositionAccountItemDtoResponseSchema = z.object({ id: z.string().describe("Item ID"), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish(), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item"), charge: CommonModels.PositionChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), text: CommonModels.PositionTextDtoResponseSchema.describe("Text data if type is TEXT").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); +export type PositionAccountItemDtoResponse = z.infer; + + +/** + * UserPreviewDtoSchema + * @type { object } + * @property { string } userId + * @property { string } name + */ +export const UserPreviewDtoSchema = z.object({ userId: z.string(), name: z.string() }).readonly(); +export type UserPreviewDto = z.infer; + + +/** + * HBLDocumentConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + * @property { string } blTermsAndConditionsImageUrl BL terms and conditions image URL + * @property { string } signatureImageUrl Signature image URL + * @property { boolean } hasSignatureImage Whether office has a signature image configured + */ +export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), blTermsAndConditionsImageUrl: z.string().describe("BL terms and conditions image URL"), signatureImageUrl: z.string().describe("Signature image URL"), hasSignatureImage: z.boolean().describe("Whether office has a signature image configured") }).readonly(); +export type HBLDocumentConfigDto = z.infer; + + +/** + * DirectionEnumSchema + * @type { enum } + */ +export const DirectionEnumSchema = z.enum(["Import", "Export"]); +export type DirectionEnum = z.infer; +export const DirectionEnum = DirectionEnumSchema.enum; + +/** + * HazardousPackingGroupEnumSchema + * @type { enum } + */ +export const HazardousPackingGroupEnumSchema = z.enum(["PG I", "PG II", "PG III"]); +export type HazardousPackingGroupEnum = z.infer; +export const HazardousPackingGroupEnum = HazardousPackingGroupEnumSchema.enum; + +/** + * PositionCargoPackageHazardousSpecialtyResponseDTOSchema + * @type { object } + * @property { number } totalLength + * @property { number } totalWidth + * @property { number } temperature + * @property { string } unNumber + * @property { string } IMOClass + * @property { string } shippingName + * @property { string } technicalName + * @property { HazardousPackingGroupEnum } packagingGroup + * @property { number } netWeight + * @property { number } flashpoint + * @property { string[] } properties + * @property { string } acceptanceNumber + * @property { string } medGuide + * @property { string } emergencyPhone + * @property { string } emergencySchedule + */ +export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number(), totalWidth: z.number(), temperature: z.number(), unNumber: z.string(), IMOClass: z.string(), shippingName: z.string(), technicalName: z.string(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema, netWeight: z.number(), flashpoint: z.number(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly(), acceptanceNumber: z.string(), medGuide: z.string(), emergencyPhone: z.string(), emergencySchedule: z.string() }).readonly(); +export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; + + +/** + * PositionCargoPackageTypeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionCargoPackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionCargoPackageTypeResponseDTO = z.infer; + + +/** + * HsCodeLabelDtoSchema + * @type { object } + * @property { string } id + * @property { string } label + */ +export const HsCodeLabelDtoSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export type HsCodeLabelDto = z.infer; + + +/** + * PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema + * @type { object } + * @property { number } temperatureFrom + * @property { number } temperatureUntil + */ +export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.infer; + + +/** + * PositionCargoSourcePackageResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } positionNumber + */ +export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }).readonly(); +export type PositionCargoSourcePackageResponseDTO = z.infer; + + +/** + * PositionCargoPackageResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } cargoId + * @property { string } rootFolderId + * @property { number } quantity + * @property { string } packageTypeId + * @property { PositionCargoPackageTypeResponseDTO } packageType + * @property { number } length + * @property { number } width + * @property { number } height + * @property { number } netWeight + * @property { number } grossWeight + * @property { number } chargeableWeight + * @property { string } note + * @property { string } name + * @property { number } orderNumber + * @property { number } volume + * @property { number } volumetricWeight + * @property { string } caseMarks + * @property { string } description + * @property { string[] } hsCodes + * @property { HsCodeLabelDto[] } hsCodeLabels HS code details + * @property { string } customsRemarks + * @property { number } loadMeter + * @property { string[] } specialties + * @property { PositionCargoPackageHazardousSpecialtyResponseDTO } hazardousSpecialty + * @property { PositionCargoPackageTemperatureControlledSpecialtyResponseDto } temperatureControlledSpecialty + * @property { PositionCargoSourcePackageResponseDTO } sourcePackage + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const PositionCargoPackageResponseDTOSchema = z.object({ id: z.string(), cargoId: z.string(), rootFolderId: z.string().nullish(), quantity: z.number().nullish(), packageTypeId: z.string().nullish(), packageType: CommonModels.PositionCargoPackageTypeResponseDTOSchema.nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), netWeight: z.number().nullish(), grossWeight: z.number().nullish(), chargeableWeight: z.number().nullish(), note: z.string().nullish(), name: z.string().nullish(), orderNumber: z.number().nullish(), volume: z.number().nullish(), volumetricWeight: z.number().nullish(), caseMarks: z.string().nullish(), description: z.string().nullish(), hsCodes: z.array(z.string()).readonly().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), customsRemarks: z.string().nullish(), loadMeter: z.number().nullish(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.PositionCargoPackageHazardousSpecialtyResponseDTOSchema.nullish(), temperatureControlledSpecialty: CommonModels.PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema.nullish(), sourcePackage: CommonModels.PositionCargoSourcePackageResponseDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), mrn: z.string().describe("MRN (Movement Reference Number)").nullish(), exportPortFilling: z.string().describe("Export port filling").nullish(), customsReleased: z.boolean().describe("Customs released status").nullish(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullish(), portCustomsNumber: z.string().describe("Port customs number").nullish() }).readonly(); +export type PositionCargoPackageResponseDTO = z.infer; + + +/** + * PackageTotalsDtoSchema + * @type { object } + * @property { number } quantity + * @property { number } weightPerPiece + * @property { number } volume + * @property { number } chargeableWeight + * @property { number } loadMeter + */ +export const PackageTotalsDtoSchema = z.object({ quantity: z.number(), weightPerPiece: z.number(), volume: z.number(), chargeableWeight: z.number().nullish(), loadMeter: z.number().nullish() }).readonly(); +export type PackageTotalsDto = z.infer; + + +/** + * PackageSpecialtyTotalsResponseDtoSchema + * @type { object } + * @property { PackageTotalsDto } noSpecialties + * @property { PackageTotalsDto } hazardous + * @property { PackageTotalsDto } nonStackable + * @property { PackageTotalsDto } temperatureControlled + * @property { PackageTotalsDto } diplomatic + * @property { PackageTotalsDto } oversized + * @property { PackageTotalsDto } total + */ +export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }).readonly(); +export type PackageSpecialtyTotalsResponseDto = z.infer; + + +/** + * PositionCargoCargoTypeResponseDTOSchema + * @type { object } + * @property { string } id Cargo type ID. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } name Cargo type name. Example: `Electronics` + * @property { string } shortName Cargo type short name. Example: `ELEC` + */ +export const PositionCargoCargoTypeResponseDTOSchema = z.object({ id: z.string().describe("Cargo type ID"), name: z.string().describe("Cargo type name"), shortName: z.string().describe("Cargo type short name").nullish() }).readonly(); +export type PositionCargoCargoTypeResponseDTO = z.infer; + + +/** + * PositionCargoResponseDTOSchema + * @type { object } + * @property { string } id Cargo ID. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } positionId Position ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } quoteId Quote ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } rootFolderId Folder id bound to this cargo. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { PositionCargoCargoTypeResponseDTO } cargoType Cargo type + * @property { boolean } autoCalculateTotals + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { string } rateOptions + * @property { string } rateClass + * @property { string } textForCustoms + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { number } ratePerKg + * @property { number } totalRate + * @property { number } tare + * @property { number } vgm + * @property { HsCodeLabelDto[] } hsCodeLabels HS code details + * @property { string } note + * @property { PositionCargoPackageResponseDTO[] } packages Packages for the cargo + * @property { string } createdAt Creation date. Example: `2023-04-09T12:00:00Z` + * @property { string } updatedAt Last update date. Example: `2023-04-09T12:00:00Z` + * @property { number } completeWeight + * @property { PackageSpecialtyTotalsResponseDto } packageTotals + */ +export const PositionCargoResponseDTOSchema = z.object({ id: z.string().describe("Cargo ID"), positionId: z.string().describe("Position ID this cargo belongs to").nullish(), quoteId: z.string().describe("Quote ID this cargo belongs to").nullish(), rootFolderId: z.string().describe("Folder id bound to this cargo").nullish(), cargoType: CommonModels.PositionCargoCargoTypeResponseDTOSchema.describe("Cargo type").nullish(), autoCalculateTotals: z.boolean(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean(), transportUnitNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), rateOptions: z.string().nullish(), rateClass: z.string().nullish(), textForCustoms: z.string().nullish(), totalVolume: z.number().nullish(), totalGrossWeight: z.number().nullish(), totalNetWeight: z.number().nullish(), totalVolumetricWeight: z.number().nullish(), totalChargeableWeight: z.number().nullish(), totalLoadMeter: z.number().nullish(), ratePerKg: z.number().nullish(), totalRate: z.number().nullish(), tare: z.number().nullish(), vgm: z.number().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), note: z.string().nullish(), packages: z.array(CommonModels.PositionCargoPackageResponseDTOSchema).readonly().describe("Packages for the cargo").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Creation date"), updatedAt: z.iso.datetime({ offset: true }).describe("Last update date"), completeWeight: z.number().nullish(), packageTotals: CommonModels.PackageSpecialtyTotalsResponseDtoSchema.nullish() }).readonly(); +export type PositionCargoResponseDTO = z.infer; + + +/** + * HazardousSpecialtyDTOSchema + * @type { object } + * @property { number } totalLength Total length + * @property { number } totalWidth Total width + * @property { number } temperature Temperature + * @property { string } unNumber UN number + * @property { string } IMOClass IMOClass + * @property { string } shippingName Shipping name + * @property { string } technicalName Technical name + * @property { HazardousPackingGroupEnum } packagingGroup Packaging + * @property { number } netWeight Net weight + * @property { number } flashpoint Flashpoint + * @property { string[] } properties Properties + * @property { string } acceptanceNumber Acceptance number + * @property { string } medGuide Medical guide + * @property { string } emergencyPhone Emergency phone + * @property { string } emergencySchedule Emergency schedule + */ +export const HazardousSpecialtyDTOSchema = z.object({ totalLength: z.number().describe("Total length"), totalWidth: z.number().describe("Total width"), temperature: z.number().describe("Temperature"), unNumber: z.string().describe("UN number"), IMOClass: z.string().describe("IMOClass"), shippingName: z.string().describe("Shipping name"), technicalName: z.string().describe("Technical name"), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.describe("Packaging"), netWeight: z.number().describe("Net weight"), flashpoint: z.number().describe("Flashpoint"), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly().describe("Properties"), acceptanceNumber: z.string().describe("Acceptance number"), medGuide: z.string().describe("Medical guide"), emergencyPhone: z.string().describe("Emergency phone"), emergencySchedule: z.string().describe("Emergency schedule") }).readonly(); +export type HazardousSpecialtyDTO = z.infer; + + +/** + * TemperatureControlledSpecialtyDtoSchema + * @type { object } + * @property { number } temperatureFrom + * @property { number } temperatureUntil + */ +export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export type TemperatureControlledSpecialtyDto = z.infer; + + +/** + * CreatePositionCargoPackageDTOSchema + * @type { object } + * @property { number } quantity Package quantity + * @property { string } packageTypeId Package type ID + * @property { number } length Package length + * @property { number } width Package width + * @property { number } height Package height + * @property { number } netWeight Package net weight + * @property { number } grossWeight Package gross weight + * @property { number } loadMeter Package load meter + * @property { number } chargeableWeight Package chargeable weight + * @property { number } volume Package volume + * @property { number } volumetricWeight Package volumetric weight + * @property { string } caseMarks Package case marks + * @property { string } note Package note + * @property { string } description Package description + * @property { string[] } hsCodes Package HS codes + * @property { string } customsRemarks Text for customs + * @property { string[] } specialties + * @property { HazardousSpecialtyDTO } hazardousSpecialty + * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const CreatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity"), packageTypeId: z.string().describe("Package type ID"), length: z.number().describe("Package length"), width: z.number().describe("Package width"), height: z.number().describe("Package height"), netWeight: z.number().describe("Package net weight"), grossWeight: z.number().describe("Package gross weight"), loadMeter: z.number().describe("Package load meter"), chargeableWeight: z.number().describe("Package chargeable weight"), volume: z.number().describe("Package volume"), volumetricWeight: z.number().describe("Package volumetric weight"), caseMarks: z.string().describe("Package case marks"), note: z.string().describe("Package note"), description: z.string().describe("Package description"), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs"), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema, temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)"), exportPortFilling: z.string().describe("Export port filling"), customsReleased: z.boolean().describe("Customs released status"), importCustomsReleaseNumber: z.string().describe("Import customs release number"), portCustomsNumber: z.string().describe("Port customs number") }).readonly(); +export type CreatePositionCargoPackageDTO = z.infer; + + +/** + * UpdatePositionCargoPackageDTOSchema + * @type { object } + * @property { number } quantity Package quantity + * @property { string } packageTypeId Package type ID + * @property { number } length Package length + * @property { number } width Package width + * @property { number } height Package height + * @property { number } netWeight Package net weight + * @property { number } grossWeight Package gross weight + * @property { number } chargeableWeight Package chargeable weight + * @property { string } note Package case marks + * @property { number } volume Package volume + * @property { number } volumetricWeight Package volumetric weight + * @property { number } orderNumber Package order number + * @property { string } caseMarks Package case marks + * @property { string } description Package description + * @property { string[] } hsCodes Package HS codes + * @property { string } customsRemarks Text for customs + * @property { number } loadMeter Load meter + * @property { string[] } specialties Package specialties + * @property { HazardousSpecialtyDTO } hazardousSpecialty Hazardous specialty details + * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const UpdatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity").nullable(), packageTypeId: z.string().describe("Package type ID").nullable(), length: z.number().describe("Package length").nullable(), width: z.number().describe("Package width").nullable(), height: z.number().describe("Package height").nullable(), netWeight: z.number().describe("Package net weight").nullable(), grossWeight: z.number().describe("Package gross weight").nullable(), chargeableWeight: z.number().describe("Package chargeable weight").nullable(), note: z.string().describe("Package case marks").nullable(), volume: z.number().describe("Package volume").nullable(), volumetricWeight: z.number().describe("Package volumetric weight").nullable(), orderNumber: z.number().describe("Package order number"), caseMarks: z.string().describe("Package case marks").nullable(), description: z.string().describe("Package description").nullable(), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs").nullable(), loadMeter: z.number().describe("Load meter").nullable(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly().describe("Package specialties"), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema.describe("Hazardous specialty details"), temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)").nullable(), exportPortFilling: z.string().describe("Export port filling").nullable(), customsReleased: z.boolean().describe("Customs released status").nullable(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullable(), portCustomsNumber: z.string().describe("Port customs number").nullable() }).readonly(); +export type UpdatePositionCargoPackageDTO = z.infer; + + +/** + * QuantityOfOriginalBlDocumentsEnumSchema + * @type { enum } + */ +export const QuantityOfOriginalBlDocumentsEnumSchema = z.enum(["ZERO", "ONE", "TWO", "THREE"]); +export type QuantityOfOriginalBlDocumentsEnum = z.infer; +export const QuantityOfOriginalBlDocumentsEnum = QuantityOfOriginalBlDocumentsEnumSchema.enum; + +/** + * MovementTypeEnumSchema + * @type { enum } + */ +export const MovementTypeEnumSchema = z.enum(["DoorToDoor", "PortToPort", "PortToDoor", "DoorToPort"]); +export type MovementTypeEnum = z.infer; +export const MovementTypeEnum = MovementTypeEnumSchema.enum; + +/** + * ChargePaymentEnumSchema + * @type { enum } + */ +export const ChargePaymentEnumSchema = z.enum(["Prepaid", "Collect", "PayableElsewhere"]); +export type ChargePaymentEnum = z.infer; +export const ChargePaymentEnum = ChargePaymentEnumSchema.enum; + +/** + * DocumentConfigDTOSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + */ +export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL") }).readonly(); +export type DocumentConfigDTO = z.infer; + + +/** + * EmployeeRoleContextSchema + * @type { enum } + */ +export const EmployeeRoleContextSchema = z.enum(["global", "office"]); +export type EmployeeRoleContext = z.infer; +export const EmployeeRoleContext = EmployeeRoleContextSchema.enum; + +/** + * EmployeeRoleResponseSchema + * @type { object } + * @property { string } id Unique identifier of the role + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string } context Role context + * @property { string[] } permissions Permissions associated with the role + */ +export const EmployeeRoleResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export type EmployeeRoleResponse = z.infer; + + +/** + * EmploymentEmployeeResponseSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { boolean } archived Archived + * @property { EmployeeRoleResponse[] } roles Global Roles + */ +export const EmploymentEmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish() }).readonly(); +export type EmploymentEmployeeResponse = z.infer; + + +/** + * EmployeeOfficeResponseSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const EmployeeOfficeResponseSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type EmployeeOfficeResponse = z.infer; + + +/** + * EmploymentResponseSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { EmployeeOfficeResponse } office + * @property { string } employeeId + * @property { EmploymentEmployeeResponse } employee + * @property { boolean } archived + * @property { string } costCenter + * @property { EmployeeRoleResponse[] } roles Employment Roles + */ +export const EmploymentResponseSchema = z.object({ id: z.string(), officeId: z.string(), office: CommonModels.EmployeeOfficeResponseSchema.nullish(), employeeId: z.string(), employee: CommonModels.EmploymentEmployeeResponseSchema.nullish(), archived: z.boolean(), costCenter: z.string().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Employment Roles").nullish() }).readonly(); +export type EmploymentResponse = z.infer; + + +/** + * LoadTypeEnumSchema + * @type { enum } + */ +export const LoadTypeEnumSchema = z.enum(["LCL", "FCL", "Trailer", "Container", "BreakBulk", "Roro", "MAFI", "LTL_ROAD", "FTL_ROAD", "Standard"]); +export type LoadTypeEnum = z.infer; +export const LoadTypeEnum = LoadTypeEnumSchema.enum; + +/** + * ServiceTypeEnumSchema + * @type { enum } + */ +export const ServiceTypeEnumSchema = z.enum(["InlandTransport", "DoorToPortOfDischarge", "PortOfLoadingToDoor", "DoorToDoor", "PortToPort", "DoorToAirport", "AirportToAirport", "AirportToDoor", "PortOfDischargeRampToDoor"]); +export type ServiceTypeEnum = z.infer; +export const ServiceTypeEnum = ServiceTypeEnumSchema.enum; + +/** + * DateRangeDtoSchema + * @type { object } + * @property { string } start + * @property { string } end + */ +export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }), end: z.iso.datetime({ offset: true }) }).readonly(); +export type DateRangeDto = z.infer; + + +/** + * BusinessPartnerLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { BusinessPartnerType[] } types Array of business partner types + */ +export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); +export type BusinessPartnerLabelResponseDTO = z.infer; + + +/** + * SectionEnumSchema + * @type { enum } + */ +export const SectionEnumSchema = z.enum(["Logistics"]); +export type SectionEnum = z.infer; +export const SectionEnum = SectionEnumSchema.enum; + +/** + * FrequencyEnumSchema + * @type { enum } + */ +export const FrequencyEnumSchema = z.enum(["Daily", "Weekly", "Monthly"]); +export type FrequencyEnum = z.infer; +export const FrequencyEnum = FrequencyEnumSchema.enum; + +/** + * InvoiceDirectionEnumSchema + * @type { enum } + */ +export const InvoiceDirectionEnumSchema = z.enum(["Incoming", "Outgoing"]); +export type InvoiceDirectionEnum = z.infer; +export const InvoiceDirectionEnum = InvoiceDirectionEnumSchema.enum; + +/** + * InvoiceTypeEnumSchema + * @type { enum } + */ +export const InvoiceTypeEnumSchema = z.enum(["CreditNote", "Invoice", "CollectiveInvoice", "ProForma", "PartialCreditNote", "DirectInvoice"]); +export type InvoiceTypeEnum = z.infer; +export const InvoiceTypeEnum = InvoiceTypeEnumSchema.enum; + +/** + * BooleanFilterEnumSchema + * @type { enum } + */ +export const BooleanFilterEnumSchema = z.enum(["Yes", "No"]); +export type BooleanFilterEnum = z.infer; +export const BooleanFilterEnum = BooleanFilterEnumSchema.enum; + +/** + * InvoiceStatusEnumSchema + * @type { enum } + */ +export const InvoiceStatusEnumSchema = z.enum(["Credited", "Draft", "Overpaid", "PartiallyPaid", "Outstanding", "Paid", "CreditNote", "ProForma"]); +export type InvoiceStatusEnum = z.infer; +export const InvoiceStatusEnum = InvoiceStatusEnumSchema.enum; + +/** + * OfficeInvoiceFilterDtoSchema + * @type { object } + * @property { string } search + * @property { DateRangeDto } issuingDate + * @property { DateRangeDto } serviceDate + * @property { InvoiceDirectionEnum[] } invoiceDirection + * @property { InvoiceTypeEnum[] } invoiceType + * @property { BooleanFilterEnum[] } collective + * @property { number } amountMin + * @property { number } amountMax + * @property { string[] } currencyNotation + * @property { string[] } vatRule + * @property { DateRangeDto } dueDate + * @property { InvoiceStatusEnum[] } status + * @property { string[] } receiver Filter by invoice receiver/customer IDs (UUID) + * @property { string[] } receiverCountry Filter by invoice receiver/customer country IDs + * @property { string[] } salesRep Filter by sales rep id + * @property { string } positionNumbersString + * @property { string[] } positionNumbers + * @property { string } invoiceNumbersString + * @property { string[] } invoiceNumbers + * @property { BooleanFilterEnum[] } bookkeepingExportStatus + * @property { BooleanFilterEnum[] } dunningBlock + * @property { BooleanFilterEnum[] } invoiceInReview + * @property { BooleanFilterEnum[] } isInvoiceOk + * @property { BooleanFilterEnum[] } isVatOk + * @property { number } invoiceNumberMin + * @property { number } invoiceNumberMax + * @property { number } internalNumberMin + * @property { number } internalNumberMax + * @property { string } externalSystemId Filter invoices by position external system ID (substring match) + * @property { string } hblNumber Filter invoices by HBL/HAWB (substring match) + * @property { string } mblNumber Filter invoices by MBL/MAWB (substring match) + * @property { string } bookingNumber Filter invoices by booking number (substring match) + * @property { string } vessel Filter invoices by vessel name (substring match) + * @property { string } voyage Filter invoices by voyage number (substring match) + * @property { string } creditorId Filter invoices by creditor ID (substring match) + * @property { string } debtorId Filter invoices by debtor ID (substring match) + */ +export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), vatRule: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer IDs (UUID)"), receiverCountry: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer country IDs"), salesRep: z.array(z.string()).readonly().describe("Filter by sales rep id"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number(), externalSystemId: z.string().describe("Filter invoices by position external system ID (substring match)"), hblNumber: z.string().describe("Filter invoices by HBL/HAWB (substring match)"), mblNumber: z.string().describe("Filter invoices by MBL/MAWB (substring match)"), bookingNumber: z.string().describe("Filter invoices by booking number (substring match)"), vessel: z.string().describe("Filter invoices by vessel name (substring match)"), voyage: z.string().describe("Filter invoices by voyage number (substring match)"), creditorId: z.string().describe("Filter invoices by creditor ID (substring match)"), debtorId: z.string().describe("Filter invoices by debtor ID (substring match)") }).readonly(); +export type OfficeInvoiceFilterDto = z.infer; + + +/** + * PositionStatusEnumSchema + * @type { enum } + */ +export const PositionStatusEnumSchema = z.enum(["Preparing", "NeedsDocumentation", "Executing", "Done"]); +export type PositionStatusEnum = z.infer; +export const PositionStatusEnum = PositionStatusEnumSchema.enum; + +/** + * PositionCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionCustomerDto = z.infer; + + +/** + * PositionQuoteDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type PositionQuoteDto = z.infer; + + +/** + * ParentPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type ParentPositionDto = z.infer; + + +/** + * PositionTypeEnumSchema + * @type { enum } + */ +export const PositionTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); +export type PositionTypeEnum = z.infer; +export const PositionTypeEnum = PositionTypeEnumSchema.enum; + +/** + * PositionProjectLiteDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionProjectLiteDto = z.infer; + + +/** + * EmployeeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const EmployeeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type EmployeeDto = z.infer; + + +/** + * PositionCoreResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } rootFolderId + * @property { string } externalSystemId + * @property { MovementTypeEnum } inttraTypeOfMove + * @property { PositionCustomerDto } customer + * @property { boolean } isCancelled + * @property { string } owningOfficeId + * @property { string } originOfficeId + * @property { PositionQuoteDto } quote + * @property { string } number + * @property { SectionEnum } section + * @property { DirectionEnum } direction + * @property { TransportModeEnum } transportMode + * @property { string } statusDate + * @property { string } serviceDate + * @property { string } dateOfDeparture + * @property { string } dateOfArrival + * @property { PositionStatusEnum } status + * @property { LoadTypeEnum } loadType + * @property { IncotermsEnum } incoterms + * @property { IncotermsEnum } secondIncoterms + * @property { ServiceTypeEnum } serviceType + * @property { ParentPositionDto } parentPosition + * @property { string } buyRateReference + * @property { FrequencyEnum } frequency + * @property { PositionTypeEnum } positionType + * @property { boolean } isParentPosition + * @property { boolean } hasParentPosition + * @property { boolean } hasChildPositions + * @property { PositionProjectLiteDto } projectLite + * @property { boolean } isExcludedFromStatistics + * @property { EmployeeDto } salesRep + * @property { string } fillingCompany + * @property { string } sellingContract + * @property { string } fillingScacCode + * @property { string } serviceValidity + * @property { string } ratesValidity + * @property { EmployeeDto } responsibleEmployee + * @property { EmployeeDto } receivedByEmployee + * @property { string } team + * @property { string } createdAt + * @property { string } updatedAt + * @property { EditorContentResponseDto } notes Notes + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); +export type PositionCoreResponseDto = z.infer; + + +/** + * VesselDtoSchema + * @type { object } + * @property { string } name + * @property { number } imo + * @property { number } mmsi + */ +export const VesselDtoSchema = z.object({ name: z.string(), imo: z.number().nullish(), mmsi: z.number().nullish() }).readonly(); +export type VesselDto = z.infer; + + +/** + * StatusResponseDtoSchema + * @type { object } + * @property { string } status Status + * @property { string } message Message + * @property { string } code Alphanumeric code of the message type + */ +export const StatusResponseDtoSchema = z.object({ status: z.string().describe("Status"), message: z.string().describe("Message"), code: z.string().describe("Alphanumeric code of the message type") }).readonly(); +export type StatusResponseDto = z.infer; + + +/** + * PaginationDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const PaginationDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type PaginationDto = z.infer; + + +/** + * LabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + */ +export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export type LabelResponseDTO = z.infer; + + +/** + * GenerateWorkingDocumentRequestDtoSchema + * @type { object } + * @property { string } issuedAt + * @property { string } fileName + */ +export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); +export type GenerateWorkingDocumentRequestDto = z.infer; + + +/** + * UpdateInvolvedPartyDtoSchema + * @type { object } + * @property { string } reference + * @property { string } businessPartnerId + * @property { string } contactId + */ +export const UpdateInvolvedPartyDtoSchema = z.object({ reference: z.string(), businessPartnerId: z.string(), contactId: z.string() }).readonly(); +export type UpdateInvolvedPartyDto = z.infer; + + +/** + * MergeRoutesRequestDtoSchema + * @type { object } + * @property { string } sourceCargoId Source cargo ID to merge from (sea positions only) + */ +export const MergeRoutesRequestDtoSchema = z.object({ sourceCargoId: z.string().describe("Source cargo ID to merge from (sea positions only)").nullable() }).readonly(); +export type MergeRoutesRequestDto = z.infer; + + +/** + * CopyRouteRequestDtoSchema + * @type { object } + * @property { string } targetCargoId Target cargo ID to copy to (sea positions only) + */ +export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to copy to (sea positions only)").nullable() }).readonly(); +export type CopyRouteRequestDto = z.infer; + + +/** + * CargoSummaryResponseDTOSchema + * @type { object } + * @property { string } transportUnitTypeName Transport unit type name (e.g., "40' DRY", "20'") + * @property { number } quantity Total quantity of this transport unit type + */ +export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string().describe("Transport unit type name (e.g., "40' DRY", "20'")"), quantity: z.number().describe("Total quantity of this transport unit type") }).readonly(); +export type CargoSummaryResponseDTO = z.infer; + + +/** + * CreatePositionCargoDTOSchema + * @type { object } + * @property { string } cargoTypeId Cargo type ID + * @property { string } note + * @property { boolean } autoCalculateTotals + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { string } rateOptions + * @property { string } rateClass + * @property { number } ratePerKg + * @property { number } totalRate + * @property { string } textForCustoms + * @property { number } tare + * @property { number } vgm + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + */ +export const CreatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); +export type CreatePositionCargoDTO = z.infer; + + +/** + * UpdatePositionCargoDTOSchema + * @type { object } + * @property { string } cargoTypeId Cargo type ID + * @property { string } note + * @property { boolean } autoCalculateTotals + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { string } rateOptions + * @property { string } rateClass + * @property { number } ratePerKg + * @property { number } totalRate + * @property { string } textForCustoms + * @property { number } tare + * @property { number } vgm + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + */ +export const UpdatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); +export type UpdatePositionCargoDTO = z.infer; + + +/** + * MovePositionCargoPackageRequestDTOSchema + * @type { object } + * @property { string } targetCargoId Target cargo ID to move the package to + */ +export const MovePositionCargoPackageRequestDTOSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to move the package to") }).readonly(); +export type MovePositionCargoPackageRequestDTO = z.infer; + + +/** + * PositionCargoPaginationOrderFieldSchema + * @type { enum } + */ +export const PositionCargoPaginationOrderFieldSchema = z.enum(["createdAt", "updatedAt"]); +export type PositionCargoPaginationOrderField = z.infer; +export const PositionCargoPaginationOrderField = PositionCargoPaginationOrderFieldSchema.enum; + +/** + * PositionAvailablePartnersUseCaseSchema + * @type { enum } + */ +export const PositionAvailablePartnersUseCaseSchema = z.enum(["financeCustomer", "financeVendor"]); +export type PositionAvailablePartnersUseCase = z.infer; +export const PositionAvailablePartnersUseCase = PositionAvailablePartnersUseCaseSchema.enum; + +} diff --git a/test/generated/base/containerYards/containerYards.acl.ts b/test/generated/base/containerYards/containerYards.acl.ts new file mode 100644 index 0000000..daa83f7 --- /dev/null +++ b/test/generated/base/containerYards/containerYards.acl.ts @@ -0,0 +1,51 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace ContainerYardsAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "ContainerYard"] as AbilityTuple<"Create", "ContainerYard">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; + + /** + * Use for `useGetLabelById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetLabelById` query + */ + export const canUseGetLabelById = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; +} diff --git a/test/generated/base/containerYards/containerYards.api.ts b/test/generated/base/containerYards/containerYards.api.ts new file mode 100644 index 0000000..8cde8f4 --- /dev/null +++ b/test/generated/base/containerYards/containerYards.api.ts @@ -0,0 +1,144 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ContainerYardsModels } from "./containerYards.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ContainerYardsApi { + export const paginate = ( + limit: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, + `/container-yards`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards`, + ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), + config, + ); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, + `/container-yards/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const getLabelById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.LabelResponseDTOSchema }, + `/container-yards/${id}/labels`, + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}/unarchive`, + undefined, + config, + ); + }; + + export const update = ( + id: string, + data: ContainerYardsModels.UpdateContainerYardRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}`, + ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), + config, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}`, + config, + ); + }; +} diff --git a/test/generated/base/containerYards/containerYards.configs.ts b/test/generated/base/containerYards/containerYards.configs.ts new file mode 100644 index 0000000..62b81ca --- /dev/null +++ b/test/generated/base/containerYards/containerYards.configs.ts @@ -0,0 +1,141 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ContainerYardsModels } from "./containerYards.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ContainerYardsQueries } from "./containerYards.queries"; +import { ContainerYardsAcl } from "./containerYards.acl"; + +export namespace ContainerYardsConfigs { + export const containerYardsConfig = { + meta: { + title: "Container Yards", + }, + readAll: { + acl: ContainerYardsAcl.canUsePaginate, + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + paginated: ContainerYardsQueries.usePaginate, + infinite: ContainerYardsQueries.usePaginateInfinite, + filters: { + schema: ContainerYardsModels.ContainerYardFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ContainerYardsModels.ContainerYardFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + shortName: true, + name: true, + archived: true, + street: true, + secondaryStreet: true, + zip: true, + city: true, + country: true, + district: true, + additionalInformation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: ContainerYardsAcl.canUseFindById, + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + query: ContainerYardsQueries.useFindById, + }, + create: { + acl: ContainerYardsAcl.canUseCreate, + schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, + mutation: ContainerYardsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, + options: { + inputs: { + matchCode: true, + name: true, + shortName: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + additionalInformation: true, + }, + }, + }), + }, + update: { + acl: ContainerYardsAcl.canUseUpdate, + schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, + mutation: ContainerYardsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, + options: { + inputs: { + matchCode: true, + name: true, + shortName: true, + addressId: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + additionalInformation: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ContainerYardsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ContainerYardsQueries.usePaginateLabels, + infinite: ContainerYardsQueries.usePaginateLabelsInfinite, + filters: { + schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/containerYards/containerYards.models.ts b/test/generated/base/containerYards/containerYards.models.ts new file mode 100644 index 0000000..7deddd9 --- /dev/null +++ b/test/generated/base/containerYards/containerYards.models.ts @@ -0,0 +1,211 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ContainerYardsModels { + /** + * ContainerYardEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ContainerYardEmployeeDTO = z.infer; + + /** + * ContainerYardResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchCode Container yard match code + * @property { string } shortName Container yard short name + * @property { string } name Container yard name + * @property { boolean } archived Whether the container yard is archived + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { object } city + * @property { string } city.id + * @property { string } city.name + * @property { object } country + * @property { string } country.id + * @property { string } country.name + * @property { string } country.isoCode2 + * @property { string } country.isoCode3 + * @property { string } district District + * @property { string } additionalInformation Additional information + * @property { string } createdById + * @property { ContainerYardEmployeeDTO } createdBy + * @property { string } createdAt Date when the container yard was created + * @property { string } updatedById + * @property { ContainerYardEmployeeDTO } updatedBy + * @property { string } updatedAt Date when the container yard was last updated + */ + export const ContainerYardResponseDTOSchema = z + .object({ + id: z.string(), + matchCode: z.string().describe("Container yard match code"), + shortName: z.string().describe("Container yard short name").nullish(), + name: z.string().describe("Container yard name"), + archived: z.boolean().describe("Whether the container yard is archived"), + street: z.string().describe("Street address").nullish(), + secondaryStreet: z.string().describe("Secondary street address").nullish(), + zip: z.string().describe("ZIP/Postal code").nullish(), + city: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), + country: z + .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) + .readonly() + .nullish(), + district: z.string().describe("District").nullish(), + additionalInformation: z.string().describe("Additional information").nullish(), + createdById: z.string().nullish(), + createdBy: ContainerYardEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was created"), + updatedById: z.string().nullish(), + updatedBy: ContainerYardEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was last updated"), + }) + .readonly(); + export type ContainerYardResponseDTO = z.infer; + + /** + * ContainerYardFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ + export const ContainerYardFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); + export type ContainerYardFilterDto = z.infer; + + /** + * ContainerYardLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const ContainerYardLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type ContainerYardLabelFilterDto = z.infer; + + /** + * CreateContainerYardRequestDTOSchema + * @type { object } + * @property { string } matchCode Match code + * @property { string } name Name + * @property { string } shortName Short name + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } cityId City ID + * @property { string } countryId Country ID + * @property { string } district District + * @property { string } additionalInformation Additional information + */ + export const CreateContainerYardRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Match code"), + name: z.string().describe("Name"), + shortName: z.string().describe("Short name").nullish(), + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street address").nullish(), + zip: z.string().describe("ZIP/Postal code"), + cityId: z.string().describe("City ID"), + countryId: z.string().describe("Country ID"), + district: z.string().describe("District").nullish(), + additionalInformation: z.string().describe("Additional information").nullish(), + }) + .readonly(); + export type CreateContainerYardRequestDTO = z.infer; + + /** + * UpdateContainerYardRequestDTOSchema + * @type { object } + * @property { string } matchCode Match code + * @property { string } name Name + * @property { string } shortName Short name + * @property { string } addressId Address ID + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } cityId City ID + * @property { string } countryId Country ID + * @property { string } district District + * @property { string } additionalInformation Additional information + */ + export const UpdateContainerYardRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Match code"), + name: z.string().describe("Name"), + shortName: z.string().describe("Short name"), + addressId: z.string().describe("Address ID"), + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street address"), + zip: z.string().describe("ZIP/Postal code"), + cityId: z.string().describe("City ID"), + countryId: z.string().describe("Country ID"), + district: z.string().describe("District"), + additionalInformation: z.string().describe("Additional information"), + }) + .readonly(); + export type UpdateContainerYardRequestDTO = z.infer; + + /** + * ContainerYardsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const ContainerYardsPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ContainerYardsPaginateOrderParamEnum = z.infer; + export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderParamEnumSchema.enum; + + /** + * ContainerYardsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ContainerYardResponseDTO[] } items + */ + export const ContainerYardsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ContainerYardResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ContainerYardsPaginateResponse = z.infer; + + /** + * ContainerYardsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const ContainerYardsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ContainerYardsPaginateLabelsOrderParamEnum = z.infer< + typeof ContainerYardsPaginateLabelsOrderParamEnumSchema + >; + export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * ContainerYardsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const ContainerYardsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ContainerYardsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/containerYards/containerYards.queries.ts b/test/generated/base/containerYards/containerYards.queries.ts new file mode 100644 index 0000000..1f81835 --- /dev/null +++ b/test/generated/base/containerYards/containerYards.queries.ts @@ -0,0 +1,392 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ContainerYardsAcl } from "./containerYards.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ContainerYardsModels } from "./containerYards.models"; +import { ContainerYardsApi } from "./containerYards.api"; + +export namespace ContainerYardsQueries { + export const moduleName = QueryModule.ContainerYards; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/container-yards", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardFilterDto, + cursor?: string, + ) => [...keys.all, "/container-yards", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/container-yards/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/container-yards/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getLabelById: (id: string) => [...keys.all, "/container-yards/:id/labels", id] as const, + findById: (id: string) => [...keys.all, "/container-yards/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Container Yards + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ContainerYardsModels.ContainerYardFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUsePaginate()); + return ContainerYardsApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Container Yards + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ContainerYardsModels.ContainerYardFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ContainerYardsAcl.canUsePaginate()); + return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create container yard + * @permission Requires `canUseCreate` ability + * @param { ContainerYardsModels.CreateContainerYardRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof ContainerYardsApi.create, + { data: ContainerYardsModels.CreateContainerYardRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(ContainerYardsAcl.canUseCreate()); + return ContainerYardsApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate container yard labels (id and name) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ContainerYardsModels.ContainerYardLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUsePaginateLabels()); + return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate container yard labels (id and name) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ContainerYardsModels.ContainerYardLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ContainerYardsAcl.canUsePaginateLabels()); + return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetLabelById` + * @summary Get container yard by ID with label format (id and formatted name) + * @permission Requires `canUseGetLabelById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetLabelById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getLabelById(id), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUseGetLabelById()); + return ContainerYardsApi.getLabelById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive container yard + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ContainerYardsAcl.canUseArchive()); + return ContainerYardsApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive container yard + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ContainerYardsAcl.canUseUnarchive()); + return ContainerYardsApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update container yard + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { ContainerYardsModels.UpdateContainerYardRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ContainerYardsApi.update, + { id: string; data: ContainerYardsModels.UpdateContainerYardRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(ContainerYardsAcl.canUseUpdate()); + return ContainerYardsApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get container yard + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUseFindById()); + return ContainerYardsApi.findById(id, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/controlTowerAuth/controlTowerAuth.api.ts b/test/generated/base/controlTowerAuth/controlTowerAuth.api.ts new file mode 100644 index 0000000..abdd1bf --- /dev/null +++ b/test/generated/base/controlTowerAuth/controlTowerAuth.api.ts @@ -0,0 +1,24 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerAuthModels } from "./controlTowerAuth.models"; + +export namespace ControlTowerAuthApi { + export const login = (data: ControlTowerAuthModels.LoginRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, + `/auth/move/login`, + ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), + config, + ); + }; + + export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, + `/auth/reset-password`, + ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/controlTowerAuth/controlTowerAuth.models.ts b/test/generated/base/controlTowerAuth/controlTowerAuth.models.ts new file mode 100644 index 0000000..797b408 --- /dev/null +++ b/test/generated/base/controlTowerAuth/controlTowerAuth.models.ts @@ -0,0 +1,42 @@ +import { z } from "zod"; + +export namespace ControlTowerAuthModels { + /** + * LoginRequestDtoSchema + * @type { object } + * @property { string } username + * @property { string } password + */ + export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }).readonly(); + export type LoginRequestDto = z.infer; + + /** + * LoginResponseDtoSchema + * @type { object } + * @property { string } accessToken + * @property { boolean } resetPasswordRequired + * @property { string } passwordResetToken + * @property { string } username + */ + export const LoginResponseDtoSchema = z + .object({ + accessToken: z.string().nullable(), + resetPasswordRequired: z.boolean().nullish(), + passwordResetToken: z.string().nullish(), + username: z.string().nullish(), + }) + .readonly(); + export type LoginResponseDto = z.infer; + + /** + * PasswordResetDtoSchema + * @type { object } + * @property { string } password + * @property { string } username + * @property { string } token + */ + export const PasswordResetDtoSchema = z + .object({ password: z.string(), username: z.string(), token: z.string() }) + .readonly(); + export type PasswordResetDto = z.infer; +} diff --git a/test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts b/test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts new file mode 100644 index 0000000..db1fe88 --- /dev/null +++ b/test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts @@ -0,0 +1,64 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerAuthModels } from "./controlTowerAuth.models"; +import { ControlTowerAuthApi } from "./controlTowerAuth.api"; + +export namespace ControlTowerAuthQueries { + export const moduleName = QueryModule.ControlTowerAuth; + + /** + * Mutation `useLogin` + * @description Returns an access token to authenticate for protected endpoints + * @param { ControlTowerAuthModels.LoginRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 400, 401] + */ + export const useLogin = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerAuthApi.login(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useResetPassword` + * @description Resets the password for the requesting user + * @param { ControlTowerAuthModels.PasswordResetDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 400, 401] + */ + export const useResetPassword = ( + options?: AppMutationOptions< + typeof ControlTowerAuthApi.resetPassword, + { data: ControlTowerAuthModels.PasswordResetDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerAuthApi.resetPassword(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.api.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.api.ts new file mode 100644 index 0000000..857ed87 --- /dev/null +++ b/test/generated/base/controlTowerBookings/controlTowerBookings.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; + +export namespace ControlTowerBookingsApi { + export const findAll = ( + limit: number, + order?: string, + filter?: ControlTowerBookingsModels.BookingFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, + `/bookings`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, + `/bookings/${id}`, + config, + ); + }; + + export const findPackageById = (packageId: string, bookingId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, + `/bookings/${bookingId}/packages/${packageId}`, + config, + ); + }; +} diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts new file mode 100644 index 0000000..93c0533 --- /dev/null +++ b/test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts @@ -0,0 +1,55 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; +import { ControlTowerBookingsQueries } from "./controlTowerBookings.queries"; + +export namespace ControlTowerBookingsConfigs { + export const bookingsConfig = { + meta: { + title: "Bookings", + }, + readAll: { + schema: ControlTowerBookingsModels.BookingListItemDtoSchema, + paginated: ControlTowerBookingsQueries.useFindAll, + infinite: ControlTowerBookingsQueries.useFindAllInfinite, + filters: { + schema: ControlTowerBookingsModels.BookingFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerBookingsModels.BookingFilterDtoSchema, + options: { + inputs: { + projectId: true, + search: true, + companyIds: true, + purchaseOrderId: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ControlTowerBookingsModels.BookingListItemDtoSchema, + options: { + columns: { + id: true, + bookingNumber: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema, + }, + }), + }, + read: { + schema: ControlTowerBookingsModels.BookingResponseDtoSchema, + query: ControlTowerBookingsQueries.useFindById, + }, + }; +} diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.models.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.models.ts new file mode 100644 index 0000000..011e334 --- /dev/null +++ b/test/generated/base/controlTowerBookings/controlTowerBookings.models.ts @@ -0,0 +1,248 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerBookingsModels { + /** + * BookingListItemDtoSchema + * @type { object } + * @property { string } id + * @property { string } bookingNumber + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ + export const BookingListItemDtoSchema = z + .object({ + id: z.string(), + bookingNumber: z.string().nullable(), + ets: z.iso.datetime({ offset: true }).nullable(), + eta: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + }) + .readonly(); + export type BookingListItemDto = z.infer; + + /** + * BookingContainerDtoSchema + * @type { object } + * @property { string } id + * @property { string } containerNumber + * @property { string } type + * @property { string } loadType + * @property { string } stuffedInContainer + * @property { string[] } hsCode + * @property { number } noS + * @property { number } weight + * @property { string } lastEventLocation + * @property { string } lastEventName + * @property { string } lastEventDate + * @property { string } seals + */ + export const BookingContainerDtoSchema = z + .object({ + id: z.string(), + containerNumber: z.string().nullable(), + type: z.string().nullable(), + loadType: z.string().nullable(), + stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), + hsCode: z.array(z.string()).readonly().nullable(), + noS: z.number().nullable(), + weight: z.number().nullable(), + lastEventLocation: z.string().nullable(), + lastEventName: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + seals: z.string().nullable(), + }) + .readonly(); + export type BookingContainerDto = z.infer; + + /** + * BookingPackageDtoSchema + * @type { object } + * @property { string } id + * @property { string } packageNumber + * @property { string } containerNumber + * @property { string } type + * @property { string } description + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + */ + export const BookingPackageDtoSchema = z + .object({ + id: z.string(), + packageNumber: z.string(), + containerNumber: z.string().nullable(), + type: z.string().nullable(), + description: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + }) + .readonly(); + export type BookingPackageDto = z.infer; + + /** + * BookingResponseDtoSchema + * @type { object } + * @property { string } bookingNumber + * @property { string } ets + * @property { string } etaPod + * @property { string } etaFinalDeliveryPlace + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } destination + * @property { string } lastEvent + * @property { string[] } files + * @property { string } poNumber + * @property { string } blNumber + * @property { BookingContainerDto[] } containers + * @property { BookingPackageDto[] } packages + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + * @property { string } id + */ + export const BookingResponseDtoSchema = z + .object({ + bookingNumber: z.string().nullable(), + ets: z.iso.datetime({ offset: true }).nullable(), + etaPod: z.iso.datetime({ offset: true }).nullable(), + etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + destination: z.string().nullable(), + lastEvent: z.string().nullable(), + files: z.array(z.string()).readonly().nullable(), + poNumber: z.string().nullable(), + blNumber: z.string().nullable(), + containers: z.array(BookingContainerDtoSchema).readonly().nullish(), + packages: z.array(BookingPackageDtoSchema).readonly().nullish(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + id: z.string(), + }) + .readonly(); + export type BookingResponseDto = z.infer; + + /** + * PackageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } poNumber + * @property { string } bookingNumber + * @property { string } blNumber + * @property { string } containerNumber + * @property { string } packageNumber + * @property { string } description + * @property { number } netWeight + * @property { number } grossWeight + * @property { number } length + * @property { number } width + * @property { number } height + * @property { number } volume + * @property { string } storageInstruction + * @property { string } destination + * @property { string[] } files + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ + export const PackageResponseDtoSchema = z + .object({ + id: z.string(), + poNumber: z.string().nullable(), + bookingNumber: z.string().nullable(), + blNumber: z.string().nullable(), + containerNumber: z.string().nullable(), + packageNumber: z.string().nullable(), + description: z.string().nullable(), + netWeight: z.number().nullable(), + grossWeight: z.number().nullable(), + length: z.number().nullable(), + width: z.number().nullable(), + height: z.number().nullable(), + volume: z.number().nullable(), + storageInstruction: z.string().nullable(), + destination: z.string().nullable(), + files: z.array(z.string()).readonly().nullable(), + ets: z.iso.datetime({ offset: true }).nullable(), + eta: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + }) + .readonly(); + export type PackageResponseDto = z.infer; + + /** + * BookingFilterDtoSchema + * @type { object } + * @property { string } projectId + * @property { string } search Min Length: `1` + * @property { string[] } companyIds + * @property { string } purchaseOrderId + */ + export const BookingFilterDtoSchema = z + .object({ + projectId: z.string(), + search: z.string().min(1), + companyIds: z.array(z.string()).readonly(), + purchaseOrderId: z.string(), + }) + .readonly(); + export type BookingFilterDto = z.infer; + + /** + * ControlTowerBookingsFindAllOrderParamEnumSchema + * @type { enum } + */ + export const ControlTowerBookingsFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); + export type ControlTowerBookingsFindAllOrderParamEnum = z.infer< + typeof ControlTowerBookingsFindAllOrderParamEnumSchema + >; + export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFindAllOrderParamEnumSchema.enum; + + /** + * ControlTowerBookingsFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookingListItemDto[] } items + */ + export const ControlTowerBookingsFindAllResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(BookingListItemDtoSchema).readonly() }).readonly().shape, + }); + export type ControlTowerBookingsFindAllResponse = z.infer; +} diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts new file mode 100644 index 0000000..491a3af --- /dev/null +++ b/test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts @@ -0,0 +1,141 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; +import { ControlTowerBookingsApi } from "./controlTowerBookings.api"; + +export namespace ControlTowerBookingsQueries { + export const moduleName = QueryModule.ControlTowerBookings; + + export const keys = { + all: [moduleName] as const, + findAll: ( + limit?: number, + order?: string, + filter?: ControlTowerBookingsModels.BookingFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/bookings", limit, order, filter, page, cursor] as const, + findAllInfinite: ( + limit?: number, + order?: string, + filter?: ControlTowerBookingsModels.BookingFilterDto, + cursor?: string, + ) => [...keys.all, "/bookings", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/bookings/:id", id] as const, + findPackageById: (packageId: string, bookingId: string) => + [...keys.all, "/bookings/:bookingId/packages/:packageId", packageId, bookingId] as const, + }; + + /** + * Query `useFindAll` + * @summary Get all accessible bookings for the customer + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ControlTowerBookingsModels.BookingFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `useFindAllInfinite + * @summary Get all accessible bookings for the customer + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ControlTowerBookingsModels.BookingFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @description Returns a booking with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => ControlTowerBookingsApi.findById(id, config), + ...options, + }); + }; + + /** + * Query `useFindPackageById` + * @description Returns a package with the specified id + * @param { string } object.packageId Path parameter + * @param { string } object.bookingId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindPackageById = ( + { packageId, bookingId }: { packageId: string; bookingId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findPackageById(packageId, bookingId), + queryFn: () => ControlTowerBookingsApi.findPackageById(packageId, bookingId, config), + ...options, + }); + }; +} diff --git a/test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts b/test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts new file mode 100644 index 0000000..5889980 --- /dev/null +++ b/test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts @@ -0,0 +1,45 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; + +export namespace ControlTowerCalendarApi { + export const getCalendar = ( + from: string, + to: string, + type: ControlTowerCalendarModels.CalendarTypeEnum, + search?: string, + poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, + containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, + bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, `/calendar`, { + ...config, + params: { + from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), + to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), + type: ZodExtended.parse(ControlTowerCalendarModels.CalendarTypeEnumSchema, type, { + type: "query", + name: "type", + }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + poNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarPoNumbersParamSchema.optional(), poNumbers, { + type: "query", + name: "poNumbers", + }), + containerNumbers: ZodExtended.parse( + ControlTowerCalendarModels.GetCalendarContainerNumbersParamSchema.optional(), + containerNumbers, + { type: "query", name: "containerNumbers" }, + ), + bookingNumbers: ZodExtended.parse( + ControlTowerCalendarModels.GetCalendarBookingNumbersParamSchema.optional(), + bookingNumbers, + { type: "query", name: "bookingNumbers" }, + ), + }, + }); + }; +} diff --git a/test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts b/test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts new file mode 100644 index 0000000..9659a01 --- /dev/null +++ b/test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts @@ -0,0 +1,109 @@ +import { z } from "zod"; + +export namespace ControlTowerCalendarModels { + /** + * EventRelationTypeEnumSchema + * @type { enum } + */ + export const EventRelationTypeEnumSchema = z.enum(["Booking", "Container", "PurchaseOrder"]); + export type EventRelationTypeEnum = z.infer; + export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; + + /** + * CalendarEventRelationDtoSchema + * @type { object } + * @property { EventRelationTypeEnum } type + * @property { string } id + * @property { string } number + */ + export const CalendarEventRelationDtoSchema = z + .object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }) + .readonly(); + export type CalendarEventRelationDto = z.infer; + + /** + * CalendarTypeEnumSchema + * @type { enum } + */ + export const CalendarTypeEnumSchema = z.enum(["PurchaseOrder", "Booking", "Container", "Package"]); + export type CalendarTypeEnum = z.infer; + export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; + + /** + * CalendarEventDtoSchema + * @type { object } + * @property { string } entityId + * @property { string } entityNumber + * @property { CalendarTypeEnum } entityType + * @property { string } date + * @property { string } title + * @property { CalendarEventRelationDto[] } relations + */ + export const CalendarEventDtoSchema = z + .object({ + entityId: z.string(), + entityNumber: z.string(), + entityType: CalendarTypeEnumSchema, + date: z.iso.datetime({ offset: true }), + title: z.string(), + relations: z.array(CalendarEventRelationDtoSchema).readonly(), + }) + .readonly(); + export type CalendarEventDto = z.infer; + + /** + * FiltersDtoSchema + * @type { object } + * @property { string[] } poNumbers + * @property { string[] } bookingNumbers + * @property { string[] } containerNumbers + */ + export const FiltersDtoSchema = z + .object({ + poNumbers: z.array(z.string()).readonly(), + bookingNumbers: z.array(z.string()).readonly(), + containerNumbers: z.array(z.string()).readonly(), + }) + .readonly(); + export type FiltersDto = z.infer; + + /** + * CalendarDtoSchema + * @type { object } + * @property { CalendarEventDto[] } events + * @property { FiltersDto } filters + */ + export const CalendarDtoSchema = z + .object({ events: z.array(CalendarEventDtoSchema).readonly(), filters: FiltersDtoSchema }) + .readonly(); + export type CalendarDto = z.infer; + + /** + * CalendarResponseDtoSchema + * @type { object } + * @property { CalendarDto } data + */ + export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }).readonly(); + export type CalendarResponseDto = z.infer; + + /** + * GetCalendarPoNumbersParamSchema + * @type { array } + */ + export const GetCalendarPoNumbersParamSchema = z.array(z.string()).readonly().nullish(); + export type GetCalendarPoNumbersParam = z.infer; + + /** + * GetCalendarContainerNumbersParamSchema + * @type { array } + */ + export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).readonly().nullish(); + export type GetCalendarContainerNumbersParam = z.infer; + + /** + * GetCalendarBookingNumbersParamSchema + * @type { array } + */ + export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).readonly().nullish(); + export type GetCalendarBookingNumbersParam = z.infer; +} diff --git a/test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts b/test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts new file mode 100644 index 0000000..e49a9d2 --- /dev/null +++ b/test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts @@ -0,0 +1,74 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; +import { ControlTowerCalendarApi } from "./controlTowerCalendar.api"; + +export namespace ControlTowerCalendarQueries { + export const moduleName = QueryModule.ControlTowerCalendar; + + export const keys = { + all: [moduleName] as const, + getCalendar: ( + from?: string, + to?: string, + type?: ControlTowerCalendarModels.CalendarTypeEnum, + search?: string, + poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, + containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, + bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, + ) => [...keys.all, "/calendar", from, to, type, search, poNumbers, containerNumbers, bookingNumbers] as const, + }; + + /** + * Query `useGetCalendar` + * @param { string } object.from Query parameter + * @param { string } object.to Query parameter + * @param { ControlTowerCalendarModels.CalendarTypeEnum } object.type Query parameter + * @param { string } object.search Query parameter + * @param { ControlTowerCalendarModels.GetCalendarPoNumbersParam } object.poNumbers Query parameter + * @param { ControlTowerCalendarModels.GetCalendarContainerNumbersParam } object.containerNumbers Query parameter + * @param { ControlTowerCalendarModels.GetCalendarBookingNumbersParam } object.bookingNumbers Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCalendar = ( + { + from, + to, + type, + search, + poNumbers, + containerNumbers, + bookingNumbers, + }: { + from: string; + to: string; + type: ControlTowerCalendarModels.CalendarTypeEnum; + search?: string; + poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam; + containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam; + bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), + queryFn: () => + ControlTowerCalendarApi.getCalendar( + from, + to, + type, + search, + poNumbers, + containerNumbers, + bookingNumbers, + config, + ), + ...options, + }); + }; +} diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.api.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.api.ts new file mode 100644 index 0000000..fc7f3d4 --- /dev/null +++ b/test/generated/base/controlTowerContainers/controlTowerContainers.api.ts @@ -0,0 +1,65 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; + +export namespace ControlTowerContainersApi { + export const findAll = ( + limit: number, + order?: string, + filter?: ControlTowerContainersModels.ContainerFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, + `/containers`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, + `/containers/${id}`, + config, + ); + }; + + export const getJourney = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, + `/containers/${id}/journey`, + config, + ); + }; +} diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts new file mode 100644 index 0000000..79e4a85 --- /dev/null +++ b/test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts @@ -0,0 +1,53 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; +import { ControlTowerContainersQueries } from "./controlTowerContainers.queries"; + +export namespace ControlTowerContainersConfigs { + export const containersConfig = { + meta: { + title: "Containers", + }, + readAll: { + schema: ControlTowerContainersModels.ContainerListItemDtoSchema, + paginated: ControlTowerContainersQueries.useFindAll, + infinite: ControlTowerContainersQueries.useFindAllInfinite, + filters: { + schema: ControlTowerContainersModels.ContainerFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerContainersModels.ContainerFilterDtoSchema, + options: { + inputs: { + companyIds: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ControlTowerContainersModels.ContainerListItemDtoSchema, + options: { + columns: { + containerNumber: true, + id: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, + }, + }), + }, + read: { + schema: ControlTowerContainersModels.ContainerResponseDtoSchema, + query: ControlTowerContainersQueries.useFindById, + }, + }; +} diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.models.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.models.ts new file mode 100644 index 0000000..8b5f4ff --- /dev/null +++ b/test/generated/base/controlTowerContainers/controlTowerContainers.models.ts @@ -0,0 +1,209 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerContainersModels { + /** + * ContainerListItemDtoSchema + * @type { object } + * @property { string } containerNumber + * @property { string } id + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ + export const ContainerListItemDtoSchema = z + .object({ + containerNumber: z.string().nullable(), + id: z.string(), + ets: z.iso.datetime({ offset: true }).nullable(), + eta: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + }) + .readonly(); + export type ContainerListItemDto = z.infer; + + /** + * ContainerEventDtoSchema + * @type { object } + * @property { CommonModels.VesselDto } vessel + * @property { string } name + * @property { string } date + * @property { boolean } checkedIn + */ + export const ContainerEventDtoSchema = z + .object({ + vessel: CommonModels.VesselDtoSchema.nullable(), + name: z.string(), + date: z.iso.datetime({ offset: true }).nullable(), + checkedIn: z.boolean(), + }) + .readonly(); + export type ContainerEventDto = z.infer; + + /** + * ContainerJourneyDtoSchema + * @type { object } + * @property { string } id + * @property { string } country + * @property { string } terminal + * @property { boolean } checkedIn + * @property { ContainerEventDto[] } events + */ + export const ContainerJourneyDtoSchema = z + .object({ + id: z.string(), + country: z.string().nullable(), + terminal: z.string().nullable(), + checkedIn: z.boolean(), + events: z.array(ContainerEventDtoSchema).readonly(), + }) + .readonly(); + export type ContainerJourneyDto = z.infer; + + /** + * PackageNumberDtoSchema + * @type { object } + * @property { string } id + * @property { string } type + * @property { string } description + */ + export const PackageNumberDtoSchema = z + .object({ id: z.string(), type: z.string().nullable(), description: z.string() }) + .readonly(); + export type PackageNumberDto = z.infer; + + /** + * ContainerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } containerNumber + * @property { string } poNumber + * @property { string } bookingNumber + * @property { string } blNumber + * @property { string } stuffedInContainer + * @property { string } containerType + * @property { string } loadType + * @property { string[] } hsCode + * @property { number } totalVolume + * @property { number } totalWeight + * @property { string } cargoDescription + * @property { number } noS + * @property { ContainerJourneyDto[] } journeys + * @property { PackageNumberDto[] } packages + * @property { string } bookingId + * @property { string } destination + * @property { string[] } files + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ + export const ContainerResponseDtoSchema = z + .object({ + id: z.string(), + containerNumber: z.string().nullable(), + poNumber: z.string().nullable(), + bookingNumber: z.string().nullable(), + blNumber: z.string().nullable(), + stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), + containerType: z.string().nullable(), + loadType: z.string().nullable(), + hsCode: z.array(z.string()).readonly().nullable(), + totalVolume: z.number().nullable(), + totalWeight: z.number().nullable(), + cargoDescription: z.string().nullable(), + noS: z.number().nullable(), + journeys: z.array(ContainerJourneyDtoSchema).readonly().nullish(), + packages: z.array(PackageNumberDtoSchema).readonly().nullish(), + bookingId: z.string().nullable(), + destination: z.string().nullable(), + files: z.array(z.string()).readonly().nullable(), + ets: z.iso.datetime({ offset: true }).nullable(), + eta: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + }) + .readonly(); + export type ContainerResponseDto = z.infer; + + /** + * ContainerJourneyResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { ContainerJourneyDto[] } journeys + * @property { string[] } packageNumbers + */ + export const ContainerJourneyResponseDtoSchema = z + .object({ + id: z.string(), + number: z.string(), + journeys: z.array(ContainerJourneyDtoSchema).readonly(), + packageNumbers: z.array(z.string()).readonly(), + }) + .readonly(); + export type ContainerJourneyResponseDto = z.infer; + + /** + * ContainerFilterDtoSchema + * @type { object } + * @property { number[] } companyIds + * @property { string } search + */ + export const ContainerFilterDtoSchema = z + .object({ companyIds: z.array(z.number()).readonly(), search: z.string() }) + .readonly(); + export type ContainerFilterDto = z.infer; + + /** + * ControlTowerContainersFindAllOrderParamEnumSchema + * @type { enum } + */ + export const ControlTowerContainersFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); + export type ControlTowerContainersFindAllOrderParamEnum = z.infer< + typeof ControlTowerContainersFindAllOrderParamEnumSchema + >; + export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainersFindAllOrderParamEnumSchema.enum; + + /** + * ControlTowerContainersFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ContainerListItemDto[] } items + */ + export const ControlTowerContainersFindAllResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ContainerListItemDtoSchema).readonly() }).readonly().shape, + }); + export type ControlTowerContainersFindAllResponse = z.infer; +} diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts new file mode 100644 index 0000000..138e21d --- /dev/null +++ b/test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts @@ -0,0 +1,139 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; +import { ControlTowerContainersApi } from "./controlTowerContainers.api"; + +export namespace ControlTowerContainersQueries { + export const moduleName = QueryModule.ControlTowerContainers; + + export const keys = { + all: [moduleName] as const, + findAll: ( + limit?: number, + order?: string, + filter?: ControlTowerContainersModels.ContainerFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/containers", limit, order, filter, page, cursor] as const, + findAllInfinite: ( + limit?: number, + order?: string, + filter?: ControlTowerContainersModels.ContainerFilterDto, + cursor?: string, + ) => [...keys.all, "/containers", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/containers/:id", id] as const, + getJourney: (id: string) => [...keys.all, "/containers/:id/journey", id] as const, + }; + + /** + * Query `useFindAll` + * @description Lists containers + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ControlTowerContainersModels.ContainerFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => ControlTowerContainersApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `useFindAllInfinite + * @description Lists containers + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ControlTowerContainersModels.ContainerFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @description Returns a container with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => ControlTowerContainersApi.findById(id, config), + ...options, + }); + }; + + /** + * Query `useGetJourney` + * @description Returns the journey and package numbers of a container with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetJourney = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getJourney(id), + queryFn: () => ControlTowerContainersApi.getJourney(id, config), + ...options, + }); + }; +} diff --git a/test/generated/base/controlTowerMe/controlTowerMe.api.ts b/test/generated/base/controlTowerMe/controlTowerMe.api.ts new file mode 100644 index 0000000..e3ce360 --- /dev/null +++ b/test/generated/base/controlTowerMe/controlTowerMe.api.ts @@ -0,0 +1,54 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerMeModels } from "./controlTowerMe.models"; + +export namespace ControlTowerMeApi { + export const getUserProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, `/me`, config); + }; + + export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, + `/me`, + ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), + config, + ); + }; + + export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, + `/me/basic`, + ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), + config, + ); + }; + + export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/password`, + ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), + config, + ); + }; + + export const updateEmailPreferences = ( + data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/email-preferences`, + ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), + config, + ); + }; + + export const updateProjectAccess = (config?: AxiosRequestConfig) => { + return AppRestClient.put({ resSchema: z.void() }, `/me/access`, undefined, config); + }; +} diff --git a/test/generated/base/controlTowerMe/controlTowerMe.models.ts b/test/generated/base/controlTowerMe/controlTowerMe.models.ts new file mode 100644 index 0000000..9b37d77 --- /dev/null +++ b/test/generated/base/controlTowerMe/controlTowerMe.models.ts @@ -0,0 +1,225 @@ +import { z } from "zod"; + +export namespace ControlTowerMeModels { + /** + * LinksDtoSchema + * @type { object } + * @property { string } self + * @property { string } related + */ + export const LinksDtoSchema = z.object({ self: z.string(), related: z.string() }).readonly(); + export type LinksDto = z.infer; + + /** + * ApiResponseDataDtoSchema + * @type { object } + * @property { string } type + * @property { string } id + * @property { object } attributes + * @property { object } relationships + * @property { LinksDto } links + */ + export const ApiResponseDataDtoSchema = z + .object({ + type: z.string(), + id: z.string(), + attributes: z.object({}).readonly().nullish(), + relationships: z.object({}).readonly().nullish(), + links: LinksDtoSchema.nullish(), + }) + .readonly(); + export type ApiResponseDataDto = z.infer; + + /** + * PaginationLinksDtoSchema + * @type { object } + * @property { string } next + * @property { string } self + * @property { string } last + */ + export const PaginationLinksDtoSchema = z.object({ next: z.string(), self: z.string(), last: z.string() }).readonly(); + export type PaginationLinksDto = z.infer; + + /** + * ApiResponseDtoSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + */ + export const ApiResponseDtoSchema = z + .object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }) + .readonly(); + export type ApiResponseDto = z.infer; + + /** + * DelayNotificationEnumSchema + * @type { enum } + */ + export const DelayNotificationEnumSchema = z.enum(["EveryDelay", "LongerThan24Hours", "LongerThan3Days"]); + export type DelayNotificationEnum = z.infer; + export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; + + /** + * UserEmailPreferencesDtoSchema + * @type { object } + * @property { boolean } originDeparture + * @property { boolean } loadedOnVessel + * @property { boolean } destinationArrival + * @property { boolean } onsiteDelivery + * @property { DelayNotificationEnum } delay + */ + export const UserEmailPreferencesDtoSchema = z + .object({ + originDeparture: z.boolean(), + loadedOnVessel: z.boolean(), + destinationArrival: z.boolean(), + onsiteDelivery: z.boolean(), + delay: DelayNotificationEnumSchema, + }) + .readonly(); + export type UserEmailPreferencesDto = z.infer; + + /** + * UserProjectAccessDtoSchema + * @type { object } + * @property { string[] } projectIds + */ + export const UserProjectAccessDtoSchema = z.object({ projectIds: z.array(z.string()).readonly() }).readonly(); + export type UserProjectAccessDto = z.infer; + + /** + * UserRoleEnumSchema + * @type { enum } + */ + export const UserRoleEnumSchema = z.enum(["User", "Admin"]); + export type UserRoleEnum = z.infer; + export const UserRoleEnum = UserRoleEnumSchema.enum; + + /** + * UserDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } name Min Length: `3` + * @property { string } email + * @property { UserEmailPreferencesDto } emailPreferences + * @property { UserProjectAccessDto } projectAccess + * @property { UserRoleEnum } role + * @property { boolean } isAdmin + */ + export const UserDetailDtoSchema = z + .object({ + id: z.string(), + name: z.string().min(3), + email: z.email(), + emailPreferences: UserEmailPreferencesDtoSchema.nullable(), + projectAccess: UserProjectAccessDtoSchema.nullable(), + role: UserRoleEnumSchema.nullable(), + isAdmin: z.boolean(), + }) + .readonly(); + export type UserDetailDto = z.infer; + + /** + * UserEmailPreferencesUpdateDtoSchema + * @type { object } + * @property { boolean } originDeparture + * @property { boolean } loadedOnVessel + * @property { boolean } destinationArrival + * @property { boolean } onsiteDelivery + * @property { DelayNotificationEnum } delay + */ + export const UserEmailPreferencesUpdateDtoSchema = z + .object({ + originDeparture: z.boolean(), + loadedOnVessel: z.boolean(), + destinationArrival: z.boolean(), + onsiteDelivery: z.boolean(), + delay: DelayNotificationEnumSchema, + }) + .readonly(); + export type UserEmailPreferencesUpdateDto = z.infer; + + /** + * UserProjectAccessUpdateDtoSchema + * @type { object } + * @property { number[] } projectIds + */ + export const UserProjectAccessUpdateDtoSchema = z.object({ projectIds: z.array(z.number()).readonly() }).readonly(); + export type UserProjectAccessUpdateDto = z.infer; + + /** + * UserUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } password + * @property { UserEmailPreferencesUpdateDto } emailPreferences + * @property { UserProjectAccessUpdateDto } projectAccess + */ + export const UserUpdateDtoSchema = z + .object({ + name: z.string(), + email: z.email(), + password: z.string(), + emailPreferences: UserEmailPreferencesUpdateDtoSchema, + projectAccess: UserProjectAccessUpdateDtoSchema, + }) + .readonly(); + export type UserUpdateDto = z.infer; + + /** + * UserBasicUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + */ + export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }).readonly(); + export type UserBasicUpdateDto = z.infer; + + /** + * UserPasswordUpdateDtoSchema + * @type { object } + * @property { string } password + */ + export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }).readonly(); + export type UserPasswordUpdateDto = z.infer; + + /** + * GetUserProfileResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ + export const GetUserProfileResponseSchema = z.object({ + ...ApiResponseDtoSchema.shape, + ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, + }); + export type GetUserProfileResponse = z.infer; + + /** + * UpdateUserDataResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ + export const UpdateUserDataResponseSchema = z.object({ + ...ApiResponseDtoSchema.shape, + ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, + }); + export type UpdateUserDataResponse = z.infer; + + /** + * UpdateUserProfileResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ + export const UpdateUserProfileResponseSchema = z.object({ + ...ApiResponseDtoSchema.shape, + ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, + }); + export type UpdateUserProfileResponse = z.infer; +} diff --git a/test/generated/base/controlTowerMe/controlTowerMe.queries.ts b/test/generated/base/controlTowerMe/controlTowerMe.queries.ts new file mode 100644 index 0000000..9b5825c --- /dev/null +++ b/test/generated/base/controlTowerMe/controlTowerMe.queries.ts @@ -0,0 +1,169 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerMeModels } from "./controlTowerMe.models"; +import { ControlTowerMeApi } from "./controlTowerMe.api"; + +export namespace ControlTowerMeQueries { + export const moduleName = QueryModule.ControlTowerMe; + + export const keys = { + all: [moduleName] as const, + getUserProfile: () => [...keys.all, "/me"] as const, + }; + + /** + * Query `useGetUserProfile` + * @description Get basic user profile data + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200] + */ + export const useGetUserProfile = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getUserProfile(), + queryFn: () => ControlTowerMeApi.getUserProfile(config), + ...options, + }); + }; + + /** + * Mutation `useUpdateUserData` + * @description Update user data + * @param { ControlTowerMeModels.UserUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ + export const useUpdateUserData = ( + options?: AppMutationOptions< + typeof ControlTowerMeApi.updateUserData, + { data: ControlTowerMeModels.UserUpdateDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerMeApi.updateUserData(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateUserProfile` + * @description Update basic user profile data + * @param { ControlTowerMeModels.UserBasicUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ + export const useUpdateUserProfile = ( + options?: AppMutationOptions< + typeof ControlTowerMeApi.updateUserProfile, + { data: ControlTowerMeModels.UserBasicUpdateDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerMeApi.updateUserProfile(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdatePassword` + * @description Update user password + * @param { ControlTowerMeModels.UserPasswordUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ + export const useUpdatePassword = ( + options?: AppMutationOptions< + typeof ControlTowerMeApi.updatePassword, + { data: ControlTowerMeModels.UserPasswordUpdateDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerMeApi.updatePassword(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateEmailPreferences` + * @description Update user email notification preferences + * @param { ControlTowerMeModels.UserEmailPreferencesUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ + export const useUpdateEmailPreferences = ( + options?: AppMutationOptions< + typeof ControlTowerMeApi.updateEmailPreferences, + { data: ControlTowerMeModels.UserEmailPreferencesUpdateDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerMeApi.updateEmailPreferences(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateProjectAccess` + * @description Update user project access + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ + export const useUpdateProjectAccess = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: () => ControlTowerMeApi.updateProjectAccess(config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.api.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.api.ts new file mode 100644 index 0000000..c98ec95 --- /dev/null +++ b/test/generated/base/controlTowerPackages/controlTowerPackages.api.ts @@ -0,0 +1,47 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; + +export namespace ControlTowerPackagesApi { + export const findAll = ( + limit: number, + order?: string, + filter?: ControlTowerPackagesModels.PackageFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, + `/packages`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts new file mode 100644 index 0000000..ae15a46 --- /dev/null +++ b/test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts @@ -0,0 +1,49 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; +import { ControlTowerPackagesQueries } from "./controlTowerPackages.queries"; + +export namespace ControlTowerPackagesConfigs { + export const packagesConfig = { + meta: { + title: "Packages", + }, + readAll: { + schema: ControlTowerPackagesModels.PackageListItemDtoSchema, + paginated: ControlTowerPackagesQueries.useFindAll, + infinite: ControlTowerPackagesQueries.useFindAllInfinite, + filters: { + schema: ControlTowerPackagesModels.PackageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerPackagesModels.PackageFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ControlTowerPackagesModels.PackageListItemDtoSchema, + options: { + columns: { + packageNumber: true, + bookingId: true, + id: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.models.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.models.ts new file mode 100644 index 0000000..d5f8c5a --- /dev/null +++ b/test/generated/base/controlTowerPackages/controlTowerPackages.models.ts @@ -0,0 +1,74 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerPackagesModels { + /** + * PackageListItemDtoSchema + * @type { object } + * @property { string } packageNumber + * @property { string } bookingId + * @property { string } id + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ + export const PackageListItemDtoSchema = z + .object({ + packageNumber: z.string(), + bookingId: z.string(), + id: z.string(), + ets: z.iso.datetime({ offset: true }).nullable(), + eta: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + }) + .readonly(); + export type PackageListItemDto = z.infer; + + /** + * PackageFilterDtoSchema + * @type { object } + * @property { string } search Min Length: `1` + */ + export const PackageFilterDtoSchema = z.object({ search: z.string().min(1) }).readonly(); + export type PackageFilterDto = z.infer; + + /** + * ControlTowerPackagesFindAllOrderParamEnumSchema + * @type { enum } + */ + export const ControlTowerPackagesFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); + export type ControlTowerPackagesFindAllOrderParamEnum = z.infer< + typeof ControlTowerPackagesFindAllOrderParamEnumSchema + >; + export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFindAllOrderParamEnumSchema.enum; + + /** + * ControlTowerPackagesFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PackageListItemDto[] } items + */ + export const ControlTowerPackagesFindAllResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PackageListItemDtoSchema).readonly() }).readonly().shape, + }); + export type ControlTowerPackagesFindAllResponse = z.infer; +} diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts new file mode 100644 index 0000000..9db4707 --- /dev/null +++ b/test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts @@ -0,0 +1,97 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; +import { ControlTowerPackagesApi } from "./controlTowerPackages.api"; + +export namespace ControlTowerPackagesQueries { + export const moduleName = QueryModule.ControlTowerPackages; + + export const keys = { + all: [moduleName] as const, + findAll: ( + limit?: number, + order?: string, + filter?: ControlTowerPackagesModels.PackageFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/packages", limit, order, filter, page, cursor] as const, + findAllInfinite: ( + limit?: number, + order?: string, + filter?: ControlTowerPackagesModels.PackageFilterDto, + cursor?: string, + ) => [...keys.all, "/packages", "infinite", limit, order, filter, cursor] as const, + }; + + /** + * Query `useFindAll` + * @description Lists packages + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ControlTowerPackagesModels.PackageFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `useFindAllInfinite + * @description Lists packages + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ControlTowerPackagesModels.PackageFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/base/controlTowerSearch/controlTowerSearch.api.ts b/test/generated/base/controlTowerSearch/controlTowerSearch.api.ts new file mode 100644 index 0000000..862a8ac --- /dev/null +++ b/test/generated/base/controlTowerSearch/controlTowerSearch.api.ts @@ -0,0 +1,30 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerSearchModels } from "./controlTowerSearch.models"; + +export namespace ControlTowerSearchApi { + export const search = ( + data: ControlTowerSearchModels.SearchRequestDto, + type?: ControlTowerSearchModels.SearchItemTypeEnum, + limit?: number, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, + `/search`, + ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), + { + ...config, + params: { + type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { + type: "query", + name: "type", + }), + limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), + }, + }, + ); + }; +} diff --git a/test/generated/base/controlTowerSearch/controlTowerSearch.models.ts b/test/generated/base/controlTowerSearch/controlTowerSearch.models.ts new file mode 100644 index 0000000..c66a4c7 --- /dev/null +++ b/test/generated/base/controlTowerSearch/controlTowerSearch.models.ts @@ -0,0 +1,51 @@ +import { z } from "zod"; + +export namespace ControlTowerSearchModels { + /** + * SearchItemTypeEnumSchema + * @type { enum } + */ + export const SearchItemTypeEnumSchema = z.enum(["Project", "Booking", "Container"]); + export type SearchItemTypeEnum = z.infer; + export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; + + /** + * SearchItemDtoSchema + * @type { object } + * @property { SearchItemTypeEnum } type + * @property { string } id + * @property { string } label + */ + export const SearchItemDtoSchema = z + .object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }) + .readonly(); + export type SearchItemDto = z.infer; + + /** + * SearchResponseDtoSchema + * @type { object } + * @property { SearchItemDto[] } items + * @property { number } projectsCount + * @property { number } bookingsCount + * @property { number } containersCount + * @property { number } totalCount + */ + export const SearchResponseDtoSchema = z + .object({ + items: z.array(SearchItemDtoSchema).readonly(), + projectsCount: z.number(), + bookingsCount: z.number(), + containersCount: z.number(), + totalCount: z.number(), + }) + .readonly(); + export type SearchResponseDto = z.infer; + + /** + * SearchRequestDtoSchema + * @type { object } + * @property { string } search + */ + export const SearchRequestDtoSchema = z.object({ search: z.string() }).readonly(); + export type SearchRequestDto = z.infer; +} diff --git a/test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts b/test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts new file mode 100644 index 0000000..2ee15d8 --- /dev/null +++ b/test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts @@ -0,0 +1,44 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerSearchModels } from "./controlTowerSearch.models"; +import { ControlTowerSearchApi } from "./controlTowerSearch.api"; + +export namespace ControlTowerSearchQueries { + export const moduleName = QueryModule.ControlTowerSearch; + + /** + * Mutation `useSearch` + * @param { ControlTowerSearchModels.SearchRequestDto } mutation.data Body parameter + * @param { ControlTowerSearchModels.SearchItemTypeEnum } mutation.type Query parameter + * @param { number } mutation.limit Query parameter. Minimum: `1` + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useSearch = ( + options?: AppMutationOptions< + typeof ControlTowerSearchApi.search, + { + data: ControlTowerSearchModels.SearchRequestDto; + type?: ControlTowerSearchModels.SearchItemTypeEnum; + limit?: number; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data, type, limit }) => ControlTowerSearchApi.search(data, type, limit, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/countries/countries.acl.ts b/test/generated/base/countries/countries.acl.ts new file mode 100644 index 0000000..f8322d8 --- /dev/null +++ b/test/generated/base/countries/countries.acl.ts @@ -0,0 +1,21 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CountriesAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; + + /** + * Use for `usePaginateCountryLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCountryLabels` query + */ + export const canUsePaginateCountryLabels = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; + + /** + * Use for `useGetCountryById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCountryById` query + */ + export const canUseGetCountryById = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; +} diff --git a/test/generated/base/countries/countries.api.ts b/test/generated/base/countries/countries.api.ts new file mode 100644 index 0000000..2fa38fc --- /dev/null +++ b/test/generated/base/countries/countries.api.ts @@ -0,0 +1,87 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CountriesModels } from "./countries.models"; + +export namespace CountriesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CountriesModels.CountriesPaginateResponseSchema }, `/countries/paginate`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const paginateCountryLabels = ( + limit: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, + `/countries/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const getCountryById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: CountriesModels.CountryResponseDTOSchema }, `/countries/${id}`, config); + }; +} diff --git a/test/generated/base/countries/countries.configs.ts b/test/generated/base/countries/countries.configs.ts new file mode 100644 index 0000000..44ddf5b --- /dev/null +++ b/test/generated/base/countries/countries.configs.ts @@ -0,0 +1,83 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CountriesModels } from "./countries.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CountriesQueries } from "./countries.queries"; +import { CountriesAcl } from "./countries.acl"; + +export namespace CountriesConfigs { + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CountriesAcl.canUsePaginate, + schema: CountriesModels.CountryResponseDTOSchema, + paginated: CountriesQueries.usePaginate, + infinite: CountriesQueries.usePaginateInfinite, + filters: { + schema: CountriesModels.CountryPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CountriesModels.CountryPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CountriesModels.CountryResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + isoCode2: true, + isoCode3: true, + currencyNotation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CountriesModels.CountriesPaginateOrderParamEnumSchema, + }, + }), + }, + }; + + export const labelsPaginateConfig = { + meta: { + title: "Labels Paginate", + }, + readAll: { + acl: CountriesAcl.canUsePaginateCountryLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CountriesQueries.usePaginateCountryLabels, + infinite: CountriesQueries.usePaginateCountryLabelsInfinite, + filters: { + schema: CountriesModels.CountryPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CountriesModels.CountryPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CountriesModels.PaginateCountryLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/countries/countries.models.ts b/test/generated/base/countries/countries.models.ts new file mode 100644 index 0000000..50d14ae --- /dev/null +++ b/test/generated/base/countries/countries.models.ts @@ -0,0 +1,117 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CountriesModels { + /** + * CountryEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CountryEmployeeDTO = z.infer; + + /** + * CountryResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the country + * @property { string } name Name of the country + * @property { string } isoCode2 ISO 2-letter code + * @property { string } isoCode3 ISO 3-letter code + * @property { string } currencyNotation Currency notation + * @property { string } createdById + * @property { CountryEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CountryEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const CountryResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the country"), + name: z.string().describe("Name of the country"), + isoCode2: z.string().describe("ISO 2-letter code"), + isoCode3: z.string().describe("ISO 3-letter code"), + currencyNotation: z.string().describe("Currency notation"), + createdById: z.string().nullish(), + createdBy: CountryEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: CountryEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type CountryResponseDTO = z.infer; + + /** + * CountryPaginationFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const CountryPaginationFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type CountryPaginationFilterDto = z.infer; + + /** + * CountriesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const CountriesPaginateOrderParamEnumSchema = z.enum([ + "name", + "isoCode2", + "isoCode3", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type CountriesPaginateOrderParamEnum = z.infer; + export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSchema.enum; + + /** + * CountriesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CountryResponseDTO[] } items + */ + export const CountriesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CountryResponseDTOSchema).readonly() }).readonly().shape, + }); + export type CountriesPaginateResponse = z.infer; + + /** + * PaginateCountryLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PaginateCountryLabelsOrderParamEnumSchema = z.enum([ + "name", + "isoCode2", + "isoCode3", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PaginateCountryLabelsOrderParamEnum = z.infer; + export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderParamEnumSchema.enum; + + /** + * PaginateCountryLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PaginateCountryLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PaginateCountryLabelsResponse = z.infer; +} diff --git a/test/generated/base/countries/countries.queries.ts b/test/generated/base/countries/countries.queries.ts new file mode 100644 index 0000000..437d0c0 --- /dev/null +++ b/test/generated/base/countries/countries.queries.ts @@ -0,0 +1,233 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CountriesAcl } from "./countries.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { CountriesModels } from "./countries.models"; +import { CountriesApi } from "./countries.api"; + +export namespace CountriesQueries { + export const moduleName = QueryModule.Countries; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/countries/paginate", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/countries/paginate", "infinite", limit, order, filter, cursor] as const, + paginateCountryLabels: ( + limit?: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/countries/labels/paginate", limit, order, filter, page, cursor] as const, + paginateCountryLabelsInfinite: ( + limit?: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/countries/labels/paginate", "infinite", limit, order, filter, cursor] as const, + getCountryById: (id: string) => [...keys.all, "/countries/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Countries + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CountriesModels.CountryPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CountriesAcl.canUsePaginate()); + return CountriesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Countries + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CountriesModels.CountryPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CountriesAcl.canUsePaginate()); + return CountriesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateCountryLabels` + * @summary Paginate country labels (id and name only) + * @permission Requires `canUsePaginateCountryLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCountryLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CountriesModels.CountryPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CountriesAcl.canUsePaginateCountryLabels()); + return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateCountryLabelsInfinite + * @summary Paginate country labels (id and name only) + * @permission Requires `canUsePaginateCountryLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCountryLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CountriesModels.CountryPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CountriesAcl.canUsePaginateCountryLabels()); + return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetCountryById` + * @summary Get country by ID with complete details + * @permission Requires `canUseGetCountryById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCountryById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCountryById(id), + queryFn: () => { + checkAcl(CountriesAcl.canUseGetCountryById()); + return CountriesApi.getCountryById(id, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/currencies/currencies.acl.ts b/test/generated/base/currencies/currencies.acl.ts new file mode 100644 index 0000000..6756e17 --- /dev/null +++ b/test/generated/base/currencies/currencies.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CurrenciesAcl { + /** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; + + /** + * Use for `useCreateCurrency` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCurrency` mutation + */ + export const canUseCreateCurrency = () => ["Create", "Currency"] as AbilityTuple<"Create", "Currency">; + + /** + * Use for `usePaginateCurrencyLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabels` query + */ + export const canUsePaginateCurrencyLabels = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; + + /** + * Use for `useGetCurrencyById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCurrencyById` query + */ + export const canUseGetCurrencyById = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; + + /** + * Use for `useUpdateCurrency` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCurrency` mutation + */ + export const canUseUpdateCurrency = () => ["Update", "Currency"] as AbilityTuple<"Update", "Currency">; + + /** + * Use for `usePaginateCurrencyLabelsByOffice` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabelsByOffice` query + */ + export const canUsePaginateCurrencyLabelsByOffice = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; +} diff --git a/test/generated/base/currencies/currencies.api.ts b/test/generated/base/currencies/currencies.api.ts new file mode 100644 index 0000000..1197a78 --- /dev/null +++ b/test/generated/base/currencies/currencies.api.ts @@ -0,0 +1,154 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CurrenciesModels } from "./currencies.models"; + +export namespace CurrenciesApi { + export const list = ( + limit: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CurrenciesModels.CurrenciesListResponseSchema }, `/currencies`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies`, + ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), + config, + ); + }; + + export const paginateCurrencyLabels = ( + limit: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, + `/currencies/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const getCurrencyById = (isoCode: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies/${isoCode}`, + config, + ); + }; + + export const updateCurrency = ( + isoCode: string, + data: CurrenciesModels.UpdateCurrencyRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies/${isoCode}`, + ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), + config, + ); + }; + + export const paginateCurrencyLabelsByOffice = ( + officeId: string, + limit: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, + `/offices/${officeId}/currencies/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/base/currencies/currencies.configs.ts b/test/generated/base/currencies/currencies.configs.ts new file mode 100644 index 0000000..0496bec --- /dev/null +++ b/test/generated/base/currencies/currencies.configs.ts @@ -0,0 +1,152 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CurrenciesModels } from "./currencies.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CurrenciesQueries } from "./currencies.queries"; +import { CurrenciesAcl } from "./currencies.acl"; + +export namespace CurrenciesConfigs { + export const currenciesConfig = { + meta: { + title: "Currencies", + }, + readAll: { + acl: CurrenciesAcl.canUseList, + schema: CurrenciesModels.CurrencyResponseDtoSchema, + paginated: CurrenciesQueries.useList, + infinite: CurrenciesQueries.useListInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CurrenciesModels.CurrencyResponseDtoSchema, + options: { + columns: { + isoCode: true, + name: true, + symbol: true, + alignment: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CurrenciesModels.CurrenciesListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: CurrenciesAcl.canUseGetCurrencyById, + schema: CurrenciesModels.CurrencyResponseDtoSchema, + query: CurrenciesQueries.useGetCurrencyById, + }, + create: { + acl: CurrenciesAcl.canUseCreateCurrency, + schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, + mutation: CurrenciesQueries.useCreateCurrency, + inputDefs: dynamicInputs({ + schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, + options: { + inputs: { + isoCode: true, + name: true, + symbol: true, + alignment: true, + }, + }, + }), + }, + update: { + acl: CurrenciesAcl.canUseUpdateCurrency, + schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, + mutation: CurrenciesQueries.useUpdateCurrency, + inputDefs: dynamicInputs({ + schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CurrenciesAcl.canUsePaginateCurrencyLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CurrenciesQueries.usePaginateCurrencyLabels, + infinite: CurrenciesQueries.usePaginateCurrencyLabelsInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema, + }, + }), + }, + }; + + export const labelsPaginateConfig = { + meta: { + title: "Labels Paginate", + }, + readAll: { + acl: CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CurrenciesQueries.usePaginateCurrencyLabelsByOffice, + infinite: CurrenciesQueries.usePaginateCurrencyLabelsByOfficeInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/currencies/currencies.models.ts b/test/generated/base/currencies/currencies.models.ts new file mode 100644 index 0000000..7330e3c --- /dev/null +++ b/test/generated/base/currencies/currencies.models.ts @@ -0,0 +1,175 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CurrenciesModels { + /** + * CurrencyEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CurrencyEmployeeDTO = z.infer; + + /** + * CurrencyResponseDtoSchema + * @type { object } + * @property { string } isoCode isoCode of the currency + * @property { string } name Name of the currency + * @property { string } symbol Symbol of the currency + * @property { string } alignment Alignment of the currency + * @property { string } createdById ID of the employee who created this currency + * @property { CurrencyEmployeeDTO } createdBy Employee who created this currency + * @property { string } createdAt Date when the currency was created + * @property { string } updatedById ID of the employee who last updated this currency + * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency + * @property { string } updatedAt Date when the currency was last updated + */ + export const CurrencyResponseDtoSchema = z + .object({ + isoCode: z.string().describe("isoCode of the currency"), + name: z.string().describe("Name of the currency"), + symbol: z.string().describe("Symbol of the currency").nullish(), + alignment: z.string().describe("Alignment of the currency").nullish(), + createdById: z.string().describe("ID of the employee who created this currency").nullish(), + createdBy: CurrencyEmployeeDTOSchema.describe("Employee who created this currency").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Date when the currency was created"), + updatedById: z.string().describe("ID of the employee who last updated this currency").nullish(), + updatedBy: CurrencyEmployeeDTOSchema.describe("Employee who last updated this currency").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Date when the currency was last updated"), + }) + .readonly(); + export type CurrencyResponseDto = z.infer; + + /** + * CurrencyPaginationFilterDtoSchema + * @type { object } + * @property { string } officeId + * @property { string } search + */ + export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string(), search: z.string() }).readonly(); + export type CurrencyPaginationFilterDto = z.infer; + + /** + * CreateCurrencyRequestDTOSchema + * @type { object } + * @property { string } isoCode Unique identifier for the currency + * @property { string } name Name of the currency + * @property { string } symbol Symbol of the currency + * @property { string } alignment Alignment of the currency + */ + export const CreateCurrencyRequestDTOSchema = z + .object({ + isoCode: z.string().describe("Unique identifier for the currency"), + name: z.string().describe("Name of the currency"), + symbol: z.string().describe("Symbol of the currency"), + alignment: z.string().describe("Alignment of the currency"), + }) + .readonly(); + export type CreateCurrencyRequestDTO = z.infer; + + /** + * UpdateCurrencyRequestDTOSchema + * @type { object } + * @property { string } name Name of the currency + */ + export const UpdateCurrencyRequestDTOSchema = z + .object({ name: z.string().describe("Name of the currency") }) + .readonly(); + export type UpdateCurrencyRequestDTO = z.infer; + + /** + * CurrenciesListOrderParamEnumSchema + * @type { enum } + */ + export const CurrenciesListOrderParamEnumSchema = z.enum([ + "isoCode", + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type CurrenciesListOrderParamEnum = z.infer; + export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.enum; + + /** + * CurrenciesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CurrencyResponseDto[] } items + */ + export const CurrenciesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CurrencyResponseDtoSchema).readonly() }).readonly().shape, + }); + export type CurrenciesListResponse = z.infer; + + /** + * PaginateCurrencyLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PaginateCurrencyLabelsOrderParamEnumSchema = z.enum([ + "isoCode", + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PaginateCurrencyLabelsOrderParamEnum = z.infer; + export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderParamEnumSchema.enum; + + /** + * PaginateCurrencyLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PaginateCurrencyLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PaginateCurrencyLabelsResponse = z.infer; + + /** + * PaginateCurrencyLabelsByOfficeOrderParamEnumSchema + * @type { enum } + */ + export const PaginateCurrencyLabelsByOfficeOrderParamEnumSchema = z.enum([ + "isoCode", + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PaginateCurrencyLabelsByOfficeOrderParamEnum = z.infer< + typeof PaginateCurrencyLabelsByOfficeOrderParamEnumSchema + >; + export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabelsByOfficeOrderParamEnumSchema.enum; + + /** + * PaginateCurrencyLabelsByOfficeResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PaginateCurrencyLabelsByOfficeResponse = z.infer; +} diff --git a/test/generated/base/currencies/currencies.queries.ts b/test/generated/base/currencies/currencies.queries.ts new file mode 100644 index 0000000..6845288 --- /dev/null +++ b/test/generated/base/currencies/currencies.queries.ts @@ -0,0 +1,431 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CurrenciesAcl } from "./currencies.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CurrenciesModels } from "./currencies.models"; +import { CurrenciesApi } from "./currencies.api"; + +export namespace CurrenciesQueries { + export const moduleName = QueryModule.Currencies; + + export const keys = { + all: [moduleName] as const, + list: ( + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/currencies", limit, order, filter, page, cursor] as const, + listInfinite: ( + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/currencies", "infinite", limit, order, filter, cursor] as const, + paginateCurrencyLabels: ( + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/currencies/labels/paginate", limit, order, filter, page, cursor] as const, + paginateCurrencyLabelsInfinite: ( + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/currencies/labels/paginate", "infinite", limit, order, filter, cursor] as const, + getCurrencyById: (isoCode: string) => [...keys.all, "/currencies/:isoCode", isoCode] as const, + paginateCurrencyLabelsByOffice: ( + officeId: string, + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/currencies/labels/paginate", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateCurrencyLabelsByOfficeInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/currencies/labels/paginate", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useList` + * @summary List Currencies + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CurrenciesModels.CurrencyPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUseList()); + return CurrenciesApi.list(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List Currencies + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CurrenciesModels.CurrencyPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUseList()); + return CurrenciesApi.list(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreateCurrency` + * @summary Create Currency + * @permission Requires `canUseCreateCurrency` ability + * @param { CurrenciesModels.CreateCurrencyRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateCurrency = ( + options?: AppMutationOptions< + typeof CurrenciesApi.createCurrency, + { data: CurrenciesModels.CreateCurrencyRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CurrenciesAcl.canUseCreateCurrency()); + return CurrenciesApi.createCurrency(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateCurrencyLabels` + * @summary Paginate Currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCurrencyLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CurrenciesModels.CurrencyPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateCurrencyLabelsInfinite + * @summary Paginate Currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCurrencyLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CurrenciesModels.CurrencyPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetCurrencyById` + * @summary Get Currency by iso code + * @permission Requires `canUseGetCurrencyById` ability + * @param { string } object.isoCode Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCurrencyById = ( + { isoCode }: { isoCode: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCurrencyById(isoCode), + queryFn: () => { + checkAcl(CurrenciesAcl.canUseGetCurrencyById()); + return CurrenciesApi.getCurrencyById(isoCode, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCurrency` + * @summary Update Currency + * @permission Requires `canUseUpdateCurrency` ability + * @param { string } mutation.isoCode Path parameter + * @param { CurrenciesModels.UpdateCurrencyRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCurrency = ( + options?: AppMutationOptions< + typeof CurrenciesApi.updateCurrency, + { isoCode: string; data: CurrenciesModels.UpdateCurrencyRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ isoCode, data }) => { + checkAcl(CurrenciesAcl.canUseUpdateCurrency()); + return CurrenciesApi.updateCurrency(isoCode, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { isoCode } = variables; + const updateKeys = [keys.getCurrencyById(isoCode)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateCurrencyLabelsByOffice` + * @summary Paginate office currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCurrencyLabelsByOffice = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CurrenciesModels.CurrencyPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateCurrencyLabelsByOfficeInfinite + * @summary Paginate office currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCurrencyLabelsByOfficeInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CurrenciesModels.CurrencyPaginationFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/base/customerAccount/customerAccount.api.ts b/test/generated/base/customerAccount/customerAccount.api.ts new file mode 100644 index 0000000..f109278 --- /dev/null +++ b/test/generated/base/customerAccount/customerAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { CustomerAccountModels } from "./customerAccount.models"; + +export namespace CustomerAccountApi { + export const get = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, + `/customers/account`, + config, + ); + }; +} diff --git a/test/generated/base/customerAccount/customerAccount.models.ts b/test/generated/base/customerAccount/customerAccount.models.ts new file mode 100644 index 0000000..c89279e --- /dev/null +++ b/test/generated/base/customerAccount/customerAccount.models.ts @@ -0,0 +1,51 @@ +import { z } from "zod"; + +export namespace CustomerAccountModels { + /** + * CustomerCompanyDtoSchema + * @type { object } + * @property { string } id Company ID + * @property { string } name Company name + */ + export const CustomerCompanyDtoSchema = z + .object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name").nullish() }) + .readonly(); + export type CustomerCompanyDto = z.infer; + + /** + * CustomerBusinessPartnerDtoSchema + * @type { object } + * @property { string } id Company ID + * @property { string } name Company name + */ + export const CustomerBusinessPartnerDtoSchema = z + .object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name") }) + .readonly(); + export type CustomerBusinessPartnerDto = z.infer; + + /** + * CustomerAccountDtoSchema + * @type { object } + * @property { array[] } aclRules Can hold any type of value + * @property { string } id Customer ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { CustomerCompanyDto } company Company + * @property { CustomerBusinessPartnerDto } businessPartner + */ + export const CustomerAccountDtoSchema = z + .object({ + aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), + id: z.string().describe("Customer ID"), + email: z.email().describe("Email"), + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + phone: z.string().describe("Phone number").nullish(), + company: CustomerCompanyDtoSchema.describe("Company").nullish(), + businessPartner: CustomerBusinessPartnerDtoSchema.nullish(), + }) + .readonly(); + export type CustomerAccountDto = z.infer; +} diff --git a/test/generated/base/customerAccount/customerAccount.queries.ts b/test/generated/base/customerAccount/customerAccount.queries.ts new file mode 100644 index 0000000..fbe2767 --- /dev/null +++ b/test/generated/base/customerAccount/customerAccount.queries.ts @@ -0,0 +1,32 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { CustomerAccountApi } from "./customerAccount.api"; + +export namespace CustomerAccountQueries { + export const moduleName = QueryModule.CustomerAccount; + + export const keys = { + all: [moduleName] as const, + get: () => [...keys.all, "/customers/account"] as const, + }; + + /** + * Query `useGet` + * @summary Get profile of logged-in user + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.get(), + queryFn: () => CustomerAccountApi.get(config), + ...options, + }); + }; +} diff --git a/test/generated/base/customers/customers.acl.ts b/test/generated/base/customers/customers.acl.ts new file mode 100644 index 0000000..2e7c40d --- /dev/null +++ b/test/generated/base/customers/customers.acl.ts @@ -0,0 +1,41 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CustomersAcl { + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Customer"] as AbilityTuple<"Create", "Customer">; + + /** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = () => ["Read", "Customer"] as AbilityTuple<"Read", "Customer">; + + /** + * Use for `useFindById` query ability. + * @description Read a customer with id + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "Customer"] as AbilityTuple<"Read", "Customer">; + + /** + * Use for `useUpdate` mutation ability. + * @description Update Customer + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Customer"] as AbilityTuple<"Update", "Customer">; + + /** + * Use for `useDeactivate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeactivate` mutation + */ + export const canUseDeactivate = () => ["Deactivate", "Customer"] as AbilityTuple<"Deactivate", "Customer">; + + /** + * Use for `useReactivate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReactivate` mutation + */ + export const canUseReactivate = () => ["Reactivate", "Customer"] as AbilityTuple<"Reactivate", "Customer">; +} diff --git a/test/generated/base/customers/customers.api.ts b/test/generated/base/customers/customers.api.ts new file mode 100644 index 0000000..b3d25b2 --- /dev/null +++ b/test/generated/base/customers/customers.api.ts @@ -0,0 +1,91 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CustomersModels } from "./customers.models"; + +export namespace CustomersApi { + export const findProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, `/customers/me`, config); + }; + + export const create = (data: CustomersModels.CreateCustomerDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers`, + ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), + config, + ); + }; + + export const list = ( + limit: number, + order?: string, + filter?: CustomersModels.CustomerPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CustomersModels.CustomersListResponseSchema }, `/customers`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const findById = (customerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${customerId}`, + config, + ); + }; + + export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${customerId}`, + ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), + config, + ); + }; + + export const deactivate = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${id}/deactivate`, + undefined, + config, + ); + }; + + export const reactivate = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${id}/reactivate`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/customers/customers.configs.ts b/test/generated/base/customers/customers.configs.ts new file mode 100644 index 0000000..d9a2643 --- /dev/null +++ b/test/generated/base/customers/customers.configs.ts @@ -0,0 +1,91 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CustomersModels } from "./customers.models"; +import { CustomersQueries } from "./customers.queries"; +import { CustomersAcl } from "./customers.acl"; + +export namespace CustomersConfigs { + export const customersConfig = { + meta: { + title: "Customers", + }, + readAll: { + acl: CustomersAcl.canUseList, + schema: CustomersModels.CustomerListItemDTOSchema, + paginated: CustomersQueries.useList, + infinite: CustomersQueries.useListInfinite, + filters: { + schema: CustomersModels.CustomerPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CustomersModels.CustomerPaginationFilterDtoSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + companyId: true, + businessPartnerId: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CustomersModels.CustomerListItemDTOSchema, + options: { + columns: { + id: true, + firstName: true, + lastName: true, + email: true, + phone: true, + companyId: true, + businessPartnerId: true, + businessPartner: true, + }, + sortable: CustomersModels.CustomersListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: CustomersAcl.canUseFindById, + schema: CustomersModels.CustomerResponseDTOSchema, + query: CustomersQueries.useFindById, + }, + create: { + acl: CustomersAcl.canUseCreate, + schema: CustomersModels.CreateCustomerDTOSchema, + mutation: CustomersQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CustomersModels.CreateCustomerDTOSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + phone: true, + companyId: true, + businessPartnerId: true, + }, + }, + }), + }, + update: { + acl: CustomersAcl.canUseUpdate, + schema: CustomersModels.UpdateCustomerDTOSchema, + mutation: CustomersQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CustomersModels.UpdateCustomerDTOSchema, + options: { + inputs: { + firstName: true, + lastName: true, + phone: true, + companyId: true, + businessPartnerId: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/base/customers/customers.models.ts b/test/generated/base/customers/customers.models.ts new file mode 100644 index 0000000..cc1328f --- /dev/null +++ b/test/generated/base/customers/customers.models.ts @@ -0,0 +1,199 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CustomersModels { + /** + * CustomerProfileBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CustomerProfileBusinessPartnerDto = z.infer; + + /** + * CustomerProfileResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + * @property { CustomerProfileBusinessPartnerDto } businessPartner + */ + export const CustomerProfileResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the customer"), + firstName: z.string().describe("First name of the customer"), + lastName: z.string().describe("Last name of the customer"), + email: z.email().describe("Email of the customer"), + phone: z.string().describe("Phone number of the customer"), + companyId: z.string().describe("Company id of the customer").nullish(), + businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), + businessPartner: CustomerProfileBusinessPartnerDtoSchema.nullish(), + }) + .readonly(); + export type CustomerProfileResponseDTO = z.infer; + + /** + * CustomerBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CustomerBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CustomerBusinessPartnerResponseDto = z.infer; + + /** + * CustomerResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company Id of the customer + * @property { string } businessPartnerId Business partner Id of the customer + * @property { boolean } archived Wether the customer is archived + * @property { CustomerBusinessPartnerResponseDto } businessPartner + */ + export const CustomerResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the customer"), + firstName: z.string().describe("First name of the customer"), + lastName: z.string().describe("Last name of the customer"), + email: z.email().describe("Email of the customer"), + phone: z.string().describe("Phone number of the customer"), + companyId: z.string().describe("Company Id of the customer").nullish(), + businessPartnerId: z.string().describe("Business partner Id of the customer").nullish(), + archived: z.boolean().describe("Wether the customer is archived"), + businessPartner: CustomerBusinessPartnerResponseDtoSchema.nullish(), + }) + .readonly(); + export type CustomerResponseDTO = z.infer; + + /** + * CustomerListItemBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CustomerListItemBusinessPartnerDto = z.infer; + + /** + * CustomerListItemDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + * @property { CustomerListItemBusinessPartnerDto } businessPartner + */ + export const CustomerListItemDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the customer"), + firstName: z.string().describe("First name of the customer"), + lastName: z.string().describe("Last name of the customer"), + email: z.string().describe("Email of the customer"), + phone: z.string().describe("Phone number of the customer"), + companyId: z.string().describe("Company id of the customer").nullish(), + businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), + businessPartner: CustomerListItemBusinessPartnerDtoSchema.nullish(), + }) + .readonly(); + export type CustomerListItemDTO = z.infer; + + /** + * CreateCustomerDTOSchema + * @type { object } + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + */ + export const CreateCustomerDTOSchema = z + .object({ + firstName: z.string().describe("First name of the customer"), + lastName: z.string().describe("Last name of the customer"), + email: z.email().describe("Email of the customer"), + phone: z.string().describe("Phone number of the customer").nullish(), + companyId: z.string().describe("Company id of the customer").nullish(), + businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), + }) + .readonly(); + export type CreateCustomerDTO = z.infer; + + /** + * CustomerPaginationFilterDtoSchema + * @type { object } + * @property { string } firstName + * @property { string } lastName + * @property { string } email + * @property { string } companyId + * @property { string } businessPartnerId + * @property { string } search + */ + export const CustomerPaginationFilterDtoSchema = z + .object({ + firstName: z.string(), + lastName: z.string(), + email: z.string(), + companyId: z.string(), + businessPartnerId: z.string(), + search: z.string(), + }) + .readonly(); + export type CustomerPaginationFilterDto = z.infer; + + /** + * UpdateCustomerDTOSchema + * @type { object } + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + */ + export const UpdateCustomerDTOSchema = z + .object({ + firstName: z.string().describe("First name of the customer"), + lastName: z.string().describe("Last name of the customer"), + phone: z.string().describe("Phone number of the customer"), + companyId: z.string().describe("Company id of the customer"), + businessPartnerId: z.string().describe("Business partner id of the customer"), + }) + .readonly(); + export type UpdateCustomerDTO = z.infer; + + /** + * CustomersListOrderParamEnumSchema + * @type { enum } + */ + export const CustomersListOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "createdAt"]); + export type CustomersListOrderParamEnum = z.infer; + export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enum; + + /** + * CustomersListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CustomerListItemDTO[] } items + */ + export const CustomersListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CustomerListItemDTOSchema).readonly() }).readonly().shape, + }); + export type CustomersListResponse = z.infer; +} diff --git a/test/generated/base/customers/customers.queries.ts b/test/generated/base/customers/customers.queries.ts new file mode 100644 index 0000000..c617a48 --- /dev/null +++ b/test/generated/base/customers/customers.queries.ts @@ -0,0 +1,282 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CustomersAcl } from "./customers.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CustomersModels } from "./customers.models"; +import { CustomersApi } from "./customers.api"; + +export namespace CustomersQueries { + export const moduleName = QueryModule.Customers; + + export const keys = { + all: [moduleName] as const, + findProfile: () => [...keys.all, "/customers/me"] as const, + list: ( + limit?: number, + order?: string, + filter?: CustomersModels.CustomerPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/customers", limit, order, filter, page, cursor] as const, + listInfinite: ( + limit?: number, + order?: string, + filter?: CustomersModels.CustomerPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/customers", "infinite", limit, order, filter, cursor] as const, + findById: (customerId: string) => [...keys.all, "/customers/:customerId", customerId] as const, + }; + + /** + * Query `useFindProfile` + * @summary Get customer by id + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfile = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findProfile(), + queryFn: () => CustomersApi.findProfile(config), + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create new customer + * @permission Requires `canUseCreate` ability + * @param { CustomersModels.CreateCustomerDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CustomersAcl.canUseCreate()); + return CustomersApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useList` + * @summary List customers + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` + * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CustomersModels.CustomerPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CustomersAcl.canUseList()); + return CustomersApi.list(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List customers + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` + * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CustomersModels.CustomerPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CustomersAcl.canUseList()); + return CustomersApi.list(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get customer by id + * @permission Requires `canUseFindById` ability + * @param { string } object.customerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { customerId }: { customerId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(customerId), + queryFn: () => { + checkAcl(CustomersAcl.canUseFindById()); + return CustomersApi.findById(customerId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update customer + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.customerId Path parameter + * @param { CustomersModels.UpdateCustomerDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof CustomersApi.update, + { customerId: string; data: CustomersModels.UpdateCustomerDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ customerId, data }) => { + checkAcl(CustomersAcl.canUseUpdate()); + return CustomersApi.update(customerId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { customerId } = variables; + const updateKeys = [keys.findById(customerId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeactivate` + * @summary Deactivate customer + * @permission Requires `canUseDeactivate` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeactivate = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CustomersAcl.canUseDeactivate()); + return CustomersApi.deactivate(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useReactivate` + * @summary Reactivate customer + * @permission Requires `canUseReactivate` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useReactivate = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CustomersAcl.canUseReactivate()); + return CustomersApi.reactivate(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/depots/depots.acl.ts b/test/generated/base/depots/depots.acl.ts new file mode 100644 index 0000000..58d424a --- /dev/null +++ b/test/generated/base/depots/depots.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace DepotsAcl { + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Depot"] as AbilityTuple<"Create", "Depot">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Depot"] as AbilityTuple<"Update", "Depot">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "Depot"] as AbilityTuple<"Archive", "Depot">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "Depot"] as AbilityTuple<"Archive", "Depot">; +} diff --git a/test/generated/base/depots/depots.api.ts b/test/generated/base/depots/depots.api.ts new file mode 100644 index 0000000..5885f5b --- /dev/null +++ b/test/generated/base/depots/depots.api.ts @@ -0,0 +1,113 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DepotsModels } from "./depots.models"; + +export namespace DepotsApi { + export const create = (data: DepotsModels.CreateDepotRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots`, + ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), + config, + ); + }; + + export const paginate = ( + limit: number, + order?: string, + filter?: DepotsModels.DepotPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: DepotsModels.DepotsPaginateResponseSchema }, `/depots`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: DepotsModels.DepotLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, + `/depots/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: DepotsModels.DepotResponseDTOSchema }, `/depots/${id}`, config); + }; + + export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots/${id}`, + ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/depots/${id}/archive`, undefined, config); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/depots/${id}/unarchive`, undefined, config); + }; +} diff --git a/test/generated/base/depots/depots.configs.ts b/test/generated/base/depots/depots.configs.ts new file mode 100644 index 0000000..0eb5ea1 --- /dev/null +++ b/test/generated/base/depots/depots.configs.ts @@ -0,0 +1,133 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DepotsModels } from "./depots.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DepotsQueries } from "./depots.queries"; +import { DepotsAcl } from "./depots.acl"; + +export namespace DepotsConfigs { + export const depotsConfig = { + meta: { + title: "Depots", + }, + readAll: { + acl: DepotsAcl.canUsePaginate, + schema: DepotsModels.DepotResponseDTOSchema, + paginated: DepotsQueries.usePaginate, + infinite: DepotsQueries.usePaginateInfinite, + filters: { + schema: DepotsModels.DepotPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DepotsModels.DepotPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DepotsModels.DepotResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + name: true, + shortName: true, + additionalInformation: true, + address: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: DepotsModels.DepotsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: DepotsAcl.canUseFindById, + schema: DepotsModels.DepotResponseDTOSchema, + query: DepotsQueries.useFindById, + }, + create: { + acl: DepotsAcl.canUseCreate, + schema: DepotsModels.CreateDepotRequestDTOSchema, + mutation: DepotsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DepotsModels.CreateDepotRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + additionalInformation: true, + name: true, + street: true, + zip: true, + district: true, + cityId: true, + countryId: true, + }, + }, + }), + }, + update: { + acl: DepotsAcl.canUseUpdate, + schema: DepotsModels.UpdateDepotRequestDTOSchema, + mutation: DepotsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DepotsModels.UpdateDepotRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + additionalInformation: true, + name: true, + street: true, + zip: true, + district: true, + cityId: true, + countryId: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DepotsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DepotsQueries.usePaginateLabels, + infinite: DepotsQueries.usePaginateLabelsInfinite, + filters: { + schema: DepotsModels.DepotLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DepotsModels.DepotLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/depots/depots.models.ts b/test/generated/base/depots/depots.models.ts new file mode 100644 index 0000000..f10cf95 --- /dev/null +++ b/test/generated/base/depots/depots.models.ts @@ -0,0 +1,233 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DepotsModels { + /** + * DepotCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DepotCityDto = z.infer; + + /** + * DepotCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ + export const DepotCountryDtoSchema = z + .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) + .readonly(); + export type DepotCountryDto = z.infer; + + /** + * AddressDTOSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { DepotCityDto } city + * @property { string } district District name + * @property { DepotCountryDto } country + */ + export const AddressDTOSchema = z + .object({ + street: z.string().describe("Street address"), + zip: z.string().describe("ZIP/Postal code"), + city: DepotCityDtoSchema.nullish(), + district: z.string().describe("District name").nullish(), + country: DepotCountryDtoSchema.nullish(), + }) + .readonly(); + export type AddressDTO = z.infer; + + /** + * DepotEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DepotEmployeeDTO = z.infer; + + /** + * DepotResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the depot + * @property { string } matchCode Match code for the depot + * @property { string } name Name of the depot + * @property { string } shortName Short name of the depot + * @property { string } additionalInformation Additional info of the depot + * @property { AddressDTO } address Address details of the depot + * @property { boolean } archived + * @property { string } createdById + * @property { DepotEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DepotEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const DepotResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the depot"), + matchCode: z.string().describe("Match code for the depot"), + name: z.string().describe("Name of the depot"), + shortName: z.string().describe("Short name of the depot").nullish(), + additionalInformation: z.string().describe("Additional info of the depot").nullish(), + address: AddressDTOSchema.describe("Address details of the depot"), + archived: z.boolean(), + createdById: z.string().nullish(), + createdBy: DepotEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: DepotEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type DepotResponseDTO = z.infer; + + /** + * CreateDepotRequestDTOSchema + * @type { object } + * @property { string } matchCode Unique identifier code for the depot + * @property { string } shortName Optional short name for the depot + * @property { string } additionalInformation + * @property { string } name Full name of the depot + * @property { string } street Street address of the depot + * @property { string } zip ZIP/Postal code + * @property { string } district District information + * @property { string } cityId City id + * @property { string } countryId Country code + */ + export const CreateDepotRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Unique identifier code for the depot"), + shortName: z.string().describe("Optional short name for the depot").nullish(), + additionalInformation: z.string().nullish(), + name: z.string().describe("Full name of the depot"), + street: z.string().describe("Street address of the depot"), + zip: z.string().describe("ZIP/Postal code"), + district: z.string().describe("District information").nullish(), + cityId: z.string().describe("City id"), + countryId: z.string().describe("Country code"), + }) + .readonly(); + export type CreateDepotRequestDTO = z.infer; + + /** + * DepotPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter depots by name, matchCode, or shortName + * @property { boolean } archived + */ + export const DepotPaginationFilterDtoSchema = z + .object({ + search: z.string().describe("Search term to filter depots by name, matchCode, or shortName"), + archived: z.boolean(), + }) + .readonly(); + export type DepotPaginationFilterDto = z.infer; + + /** + * DepotLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const DepotLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type DepotLabelFilterDto = z.infer; + + /** + * UpdateDepotRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code for the depot + * @property { string } shortName Updated short name + * @property { string } additionalInformation Updated short name + * @property { string } name Updated full name + * @property { string } street Updated street address + * @property { string } zip Updated ZIP/Postal code + * @property { string } district Updated district information + * @property { string } cityId Updated city id + * @property { string } countryId Updated country code + */ + export const UpdateDepotRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Updated match code for the depot"), + shortName: z.string().describe("Updated short name"), + additionalInformation: z.string().describe("Updated short name"), + name: z.string().describe("Updated full name"), + street: z.string().describe("Updated street address"), + zip: z.string().describe("Updated ZIP/Postal code"), + district: z.string().describe("Updated district information"), + cityId: z.string().describe("Updated city id"), + countryId: z.string().describe("Updated country code"), + }) + .readonly(); + export type UpdateDepotRequestDTO = z.infer; + + /** + * DepotsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const DepotsPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DepotsPaginateOrderParamEnum = z.infer; + export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.enum; + + /** + * DepotsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DepotResponseDTO[] } items + */ + export const DepotsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(DepotResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DepotsPaginateResponse = z.infer; + + /** + * DepotsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const DepotsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DepotsPaginateLabelsOrderParamEnum = z.infer; + export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * DepotsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const DepotsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DepotsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/depots/depots.queries.ts b/test/generated/base/depots/depots.queries.ts new file mode 100644 index 0000000..dc58f63 --- /dev/null +++ b/test/generated/base/depots/depots.queries.ts @@ -0,0 +1,349 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DepotsAcl } from "./depots.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DepotsModels } from "./depots.models"; +import { DepotsApi } from "./depots.api"; + +export namespace DepotsQueries { + export const moduleName = QueryModule.Depots; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: DepotsModels.DepotPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/depots", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: DepotsModels.DepotPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/depots", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: DepotsModels.DepotLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/depots/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: DepotsModels.DepotLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/depots/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/depots/:id", id] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a new depot + * @permission Requires `canUseCreate` ability + * @param { DepotsModels.CreateDepotRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(DepotsAcl.canUseCreate()); + return DepotsApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Paginate Depots + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: DepotsModels.DepotPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DepotsAcl.canUsePaginate()); + return DepotsApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Depots + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: DepotsModels.DepotPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DepotsAcl.canUsePaginate()); + return DepotsApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate depots with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: DepotsModels.DepotLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DepotsAcl.canUsePaginateLabels()); + return DepotsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate depots with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: DepotsModels.DepotLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DepotsAcl.canUsePaginateLabels()); + return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Fetch depot by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(DepotsAcl.canUseFindById()); + return DepotsApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update a depot + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { DepotsModels.UpdateDepotRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(DepotsAcl.canUseUpdate()); + return DepotsApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive a depot + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(DepotsAcl.canUseArchive()); + return DepotsApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive a depot + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(DepotsAcl.canUseUnarchive()); + return DepotsApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/documentTemplates/documentTemplates.acl.ts b/test/generated/base/documentTemplates/documentTemplates.acl.ts new file mode 100644 index 0000000..299eec8 --- /dev/null +++ b/test/generated/base/documentTemplates/documentTemplates.acl.ts @@ -0,0 +1,111 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DocumentTemplatesAcl { + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List document template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Read", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List document templates + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Read", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Create", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get document template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Read", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update document template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Update", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useAddRemarkBlock` mutation ability. For global ability, omit the object parameter. + * @description Add remark block to document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddRemarkBlock` mutation + */ + export const canUseAddRemarkBlock = (object?: { officeId: string }) => + ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Update", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useDeleteRemarkBlock` mutation ability. For global ability, omit the object parameter. + * @description Delete remark block from document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemarkBlock` mutation + */ + export const canUseDeleteRemarkBlock = (object?: { officeId: string }) => + ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Update", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Archive", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Unarchive", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Unarchive", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; +} diff --git a/test/generated/base/documentTemplates/documentTemplates.api.ts b/test/generated/base/documentTemplates/documentTemplates.api.ts new file mode 100644 index 0000000..e263512 --- /dev/null +++ b/test/generated/base/documentTemplates/documentTemplates.api.ts @@ -0,0 +1,170 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; + +export namespace DocumentTemplatesApi { + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/document-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const list = ( + officeId: string, + limit: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, + `/offices/${officeId}/document-templates`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = ( + officeId: string, + data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates`, + ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), + config, + ); + }; + + export const findById = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}`, + config, + ); + }; + + export const update = ( + documentTemplateId: string, + officeId: string, + data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}`, + ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), + config, + ); + }; + + export const addRemarkBlock = ( + documentTemplateId: string, + officeId: string, + data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, + ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), + config, + ); + }; + + export const deleteRemarkBlock = ( + documentTemplateId: string, + remarkBlockId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, + undefined, + config, + ); + }; + + export const archive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/documentTemplates/documentTemplates.configs.ts b/test/generated/base/documentTemplates/documentTemplates.configs.ts new file mode 100644 index 0000000..291245b --- /dev/null +++ b/test/generated/base/documentTemplates/documentTemplates.configs.ts @@ -0,0 +1,118 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DocumentTemplatesQueries } from "./documentTemplates.queries"; +import { DocumentTemplatesAcl } from "./documentTemplates.acl"; + +export namespace DocumentTemplatesConfigs { + export const documentTemplatesConfig = { + meta: { + title: "Document Templates", + }, + readAll: { + acl: DocumentTemplatesAcl.canUseList, + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + paginated: DocumentTemplatesQueries.useList, + infinite: DocumentTemplatesQueries.useListInfinite, + filters: { + schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, + options: { + inputs: { + isArchived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + isArchived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + blocks: true, + }, + sortable: DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: DocumentTemplatesAcl.canUseFindById, + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + query: DocumentTemplatesQueries.useFindById, + }, + create: { + acl: DocumentTemplatesAcl.canUseCreate, + schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, + mutation: DocumentTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + blocks: true, + }, + }, + }), + }, + update: { + acl: DocumentTemplatesAcl.canUseUpdate, + schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, + mutation: DocumentTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + isArchived: true, + blocks: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DocumentTemplatesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DocumentTemplatesQueries.usePaginateLabels, + infinite: DocumentTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/documentTemplates/documentTemplates.models.ts b/test/generated/base/documentTemplates/documentTemplates.models.ts new file mode 100644 index 0000000..1841a56 --- /dev/null +++ b/test/generated/base/documentTemplates/documentTemplates.models.ts @@ -0,0 +1,195 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DocumentTemplatesModels { + /** + * DocumentTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DocumentTemplateEmployeeDTO = z.infer; + + /** + * DocumentTemplateResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name + * @property { boolean } isArchived + * @property { string } createdById ID of the employee who created this template + * @property { DocumentTemplateEmployeeDTO } createdBy Employee who created this template + * @property { string } createdAt + * @property { string } updatedById ID of the employee who last updated this template + * @property { DocumentTemplateEmployeeDTO } updatedBy Employee who last updated this template + * @property { string } updatedAt + * @property { CommonModels.TemplateBlocksResponseDTO } blocks + */ + export const DocumentTemplateResponseDTOSchema = z + .object({ + id: z.string(), + officeId: z.string(), + name: z.string(), + isArchived: z.boolean(), + createdById: z.string().describe("ID of the employee who created this template").nullish(), + createdBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), + updatedBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), + updatedAt: z.iso.datetime({ offset: true }), + blocks: CommonModels.TemplateBlocksResponseDTOSchema, + }) + .readonly(); + export type DocumentTemplateResponseDTO = z.infer; + + /** + * TemplateBlocksDTOSchema + * @type { object } + * @property { CommonModels.TitleBlockDTO } titleBlock + * @property { CommonModels.ReceiverBlockDTO } receiverBlock + * @property { CommonModels.OurInformationBlockDTO } ourInformationBlock + * @property { CommonModels.RouteTableBlockDTO } routeTableBlock + * @property { CommonModels.CargoTableBlockDTO } cargoTableBlock + * @property { CommonModels.CargoSummaryBlockDTO } cargoSummaryBlock + * @property { CommonModels.FinanceTableBlockDTO } financeTableBlock + * @property { CommonModels.RemarkBlockDTO[] } remarkBlocks + * @property { CommonModels.FooterBlockDTO } footerBlock + * @property { CommonModels.TermsBlockDTO } termsBlock + * @property { CommonModels.CutOffDatesBlockDTO } cutOffDatesBlock + */ + export const TemplateBlocksDTOSchema = z + .object({ + titleBlock: CommonModels.TitleBlockDTOSchema, + receiverBlock: CommonModels.ReceiverBlockDTOSchema, + ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, + routeTableBlock: CommonModels.RouteTableBlockDTOSchema, + cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, + cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, + financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, + remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), + footerBlock: CommonModels.FooterBlockDTOSchema, + termsBlock: CommonModels.TermsBlockDTOSchema, + cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema, + }) + .readonly(); + export type TemplateBlocksDTO = z.infer; + + /** + * CreateDocumentTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { TemplateBlocksDTO } blocks + */ + export const CreateDocumentTemplateRequestDTOSchema = z + .object({ name: z.string().describe("Template name"), blocks: TemplateBlocksDTOSchema.nullish() }) + .readonly(); + export type CreateDocumentTemplateRequestDTO = z.infer; + + /** + * UpdateDocumentTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { boolean } isArchived + * @property { TemplateBlocksDTO } blocks + */ + export const UpdateDocumentTemplateRequestDTOSchema = z + .object({ name: z.string().describe("Template name"), isArchived: z.boolean(), blocks: TemplateBlocksDTOSchema }) + .readonly(); + export type UpdateDocumentTemplateRequestDTO = z.infer; + + /** + * CreateRemarkBlockRequestDTOSchema + * @type { object } + * @property { CommonModels.EditorContentUpdateDto } content + * @property { number } position 1-based position of the remark block. Minimum: `1` + * @property { boolean } enabled + */ + export const CreateRemarkBlockRequestDTOSchema = z + .object({ + content: CommonModels.EditorContentUpdateDtoSchema, + position: z.number().gte(1).describe("1-based position of the remark block").nullish(), + enabled: z.boolean().nullish(), + }) + .readonly(); + export type CreateRemarkBlockRequestDTO = z.infer; + + /** + * DocumentTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const DocumentTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type DocumentTemplateLabelFilterDto = z.infer; + + /** + * DocumentTemplateFilterDtoSchema + * @type { object } + * @property { boolean } isArchived + * @property { string } search + */ + export const DocumentTemplateFilterDtoSchema = z.object({ isArchived: z.boolean(), search: z.string() }).readonly(); + export type DocumentTemplateFilterDto = z.infer; + + /** + * DocumentTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const DocumentTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DocumentTemplatesPaginateLabelsOrderParamEnum = z.infer< + typeof DocumentTemplatesPaginateLabelsOrderParamEnumSchema + >; + export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * DocumentTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DocumentTemplatesPaginateLabelsResponse = z.infer; + + /** + * DocumentTemplatesListOrderParamEnumSchema + * @type { enum } + */ + export const DocumentTemplatesListOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DocumentTemplatesListOrderParamEnum = z.infer; + export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderParamEnumSchema.enum; + + /** + * DocumentTemplatesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DocumentTemplateResponseDTO[] } items + */ + export const DocumentTemplatesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DocumentTemplatesListResponse = z.infer; +} diff --git a/test/generated/base/documentTemplates/documentTemplates.queries.ts b/test/generated/base/documentTemplates/documentTemplates.queries.ts new file mode 100644 index 0000000..6b47315 --- /dev/null +++ b/test/generated/base/documentTemplates/documentTemplates.queries.ts @@ -0,0 +1,509 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DocumentTemplatesAcl } from "./documentTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; +import { DocumentTemplatesApi } from "./documentTemplates.api"; + +export namespace DocumentTemplatesQueries { + export const moduleName = QueryModule.DocumentTemplates; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/document-templates/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/document-templates/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + list: ( + officeId: string, + limit?: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/document-templates", officeId, limit, order, filter, page, cursor] as const, + listInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/document-templates", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (documentTemplateId: string, officeId: string) => + [...keys.all, "/offices/:officeId/document-templates/:documentTemplateId", documentTemplateId, officeId] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate document template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId })); + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate document template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId })); + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useList` + * @summary List document templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DocumentTemplatesModels.DocumentTemplateFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUseList({ officeId })); + return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List document templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DocumentTemplatesModels.DocumentTemplateFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DocumentTemplatesAcl.canUseList({ officeId })); + return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new document template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.create, + { officeId: string; data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId })); + return DocumentTemplatesApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get document template by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.documentTemplateId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ + export const useFindById = ( + { documentTemplateId, officeId }: { documentTemplateId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(documentTemplateId, officeId), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId })); + return DocumentTemplatesApi.findById(documentTemplateId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update document template by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.update, + { documentTemplateId: string; officeId: string; data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId })); + return DocumentTemplatesApi.update(documentTemplateId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useAddRemarkBlock` + * @summary Add a remark block to a document template + * @permission Requires `canUseAddRemarkBlock` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.CreateRemarkBlockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useAddRemarkBlock = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.addRemarkBlock, + { documentTemplateId: string; officeId: string; data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId })); + return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteRemarkBlock` + * @summary Delete a remark block from a document template + * @permission Requires `canUseDeleteRemarkBlock` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.remarkBlockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteRemarkBlock = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.deleteRemarkBlock, + { documentTemplateId: string; remarkBlockId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId })); + return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive document template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useArchive = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.archive, + { documentTemplateId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId })); + return DocumentTemplatesApi.archive(documentTemplateId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive document template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUnarchive = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.unarchive, + { documentTemplateId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId })); + return DocumentTemplatesApi.unarchive(documentTemplateId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts new file mode 100644 index 0000000..cd053fc --- /dev/null +++ b/test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningAccountStatementAcl { + /** + * Use for `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation ability. For global ability, omit the object parameter. + * @description Generate account statement + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation + */ + export const canUseGenerateAccountStatement = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetAccountStatementEml` mutation ability. For global ability, omit the object parameter. + * @description Download account statement as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAccountStatementEml` mutation + */ + export const canUseGetAccountStatementEml = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; +} diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts new file mode 100644 index 0000000..ef2ea94 --- /dev/null +++ b/test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts @@ -0,0 +1,78 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningAccountStatementApi { + export const dataGenFake = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, + `/data-gen-fake/account-statement`, + config, + ); + }; + + export const generateAccountStatement = ( + officeId: string, + limit: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/account-statement`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }); + }; + + export const getAccountStatementEml = ( + officeId: string, + data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/account-statement/eml`, + ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts new file mode 100644 index 0000000..1a07b4f --- /dev/null +++ b/test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts @@ -0,0 +1,156 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningAccountStatementModels { + /** + * AccountStatementPdfPayloadInvoiceDtoSchema + * @type { object } + * @property { string } number + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } dueDays + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + */ + export const AccountStatementPdfPayloadInvoiceDtoSchema = z + .object({ + number: z.string(), + issuingDate: z.iso.datetime({ offset: true }), + dueDate: z.iso.datetime({ offset: true }), + dueDays: z.number(), + invoiceAmount: z.number(), + outstandingAmount: z.number(), + currencyNotation: z.string(), + }) + .readonly(); + export type AccountStatementPdfPayloadInvoiceDto = z.infer; + + /** + * AccountStatementInvoicesByCurrencyAndDirectionDtoSchema + * @type { object } + * @property { string } direction + * @property { string } currency + * @property { AccountStatementPdfPayloadInvoiceDto[] } invoices + * @property { number } totalOutstandingAmount + */ + export const AccountStatementInvoicesByCurrencyAndDirectionDtoSchema = z + .object({ + direction: CommonModels.InvoiceDirectionEnumSchema, + currency: z.string(), + invoices: z.array(AccountStatementPdfPayloadInvoiceDtoSchema).readonly(), + totalOutstandingAmount: z.number(), + }) + .readonly(); + export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer< + typeof AccountStatementInvoicesByCurrencyAndDirectionDtoSchema + >; + + /** + * AccountStatementPdfPayloadBusinessPartnerDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + * @property { string } referenceNumber + */ + export const AccountStatementPdfPayloadBusinessPartnerDtoSchema = z + .object({ name: z.string(), address: z.string().nullish(), referenceNumber: z.string().nullish() }) + .readonly(); + export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer< + typeof AccountStatementPdfPayloadBusinessPartnerDtoSchema + >; + + /** + * AccountStatementPdfPayloadBankAccountDtoSchema + * @type { object } + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + */ + export const AccountStatementPdfPayloadBankAccountDtoSchema = z + .object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }) + .readonly(); + export type AccountStatementPdfPayloadBankAccountDto = z.infer; + + /** + * AccountStatementPdfPayloadDTOSchema + * @type { object } + * @property { AccountStatementPdfPayloadBusinessPartnerDto } businessPartner + * @property { AccountStatementInvoicesByCurrencyAndDirectionDto[] } invoicesByCurrencyAndDirection + * @property { AccountStatementPdfPayloadBankAccountDto } bankAccount + * @property { string } employeeName + * @property { CommonModels.ConfigBlockDto } config + */ + export const AccountStatementPdfPayloadDTOSchema = z + .object({ + businessPartner: AccountStatementPdfPayloadBusinessPartnerDtoSchema, + invoicesByCurrencyAndDirection: z.array(AccountStatementInvoicesByCurrencyAndDirectionDtoSchema).readonly(), + bankAccount: AccountStatementPdfPayloadBankAccountDtoSchema, + employeeName: z.string().nullable(), + config: CommonModels.ConfigBlockDtoSchema, + }) + .readonly(); + export type AccountStatementPdfPayloadDTO = z.infer; + + /** + * OfficeInvoiceListQueryDtoSchema + * @type { object } + * @property { string } order Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @property { CommonModels.OfficeInvoiceFilterDto } filter + * @property { number } limit Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + */ + export const OfficeInvoiceListQueryDtoSchema = z + .object({ + order: z + .string() + .describe( + "Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId", + ) + .nullish(), + filter: CommonModels.OfficeInvoiceFilterDtoSchema.nullish(), + limit: z.number().gte(1).lte(100).describe("Items per response").default(20), + page: z.number().describe("1-indexed page number to begin from").nullish(), + cursor: z.string().describe("ID of item to start after").nullish(), + }) + .readonly(); + export type OfficeInvoiceListQueryDto = z.infer; + + /** + * GenerateAccountStatementOrderParamEnumSchema + * @type { enum } + */ + export const GenerateAccountStatementOrderParamEnumSchema = z.enum([ + "invoiceNumber", + "issuingDate", + "invoiceType", + "amount", + "netAmount", + "currencyNotation", + "dueDate", + "status", + "paidOn", + "serviceDate", + "internalNumber", + "positionNumber", + "invoiceDirection", + "receiver", + "receiverCountry", + "paidAmount", + "totalVat", + "dunningBlock", + "invoiceInReview", + "isInvoiceOk", + "isVatOk", + "comments", + "salesRepName", + "isExportedToBookkeeping", + "createdAt", + "customerReferenceOverride", + "externalSystemId", + ]); + export type GenerateAccountStatementOrderParamEnum = z.infer; + export const GenerateAccountStatementOrderParamEnum = GenerateAccountStatementOrderParamEnumSchema.enum; +} diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts new file mode 100644 index 0000000..9697954 --- /dev/null +++ b/test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts @@ -0,0 +1,270 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningAccountStatementAcl } from "./dunningAccountStatement.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; +import { DunningAccountStatementApi } from "./dunningAccountStatement.api"; + +export namespace DunningAccountStatementQueries { + export const moduleName = QueryModule.DunningAccountStatement; + + export const keys = { + all: [moduleName] as const, + dataGenFake: () => [...keys.all, "/data-gen-fake/account-statement"] as const, + generateAccountStatement: ( + officeId: string, + limit?: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/invoices/account-statement", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + generateAccountStatementInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/invoices/account-statement", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useDataGenFake` + * @summary Expose account statement PDF payload DTO for model generation + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useDataGenFake = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.dataGenFake(), + queryFn: () => DunningAccountStatementApi.dataGenFake(config), + ...options, + }); + }; + + /** + * Query `useGenerateAccountStatement` - recommended when file should be cached + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const useGenerateAccountStatement = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CommonModels.OfficeInvoiceFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); + return DunningAccountStatementApi.generateAccountStatement( + officeId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `useGenerateAccountStatementMutation` - recommended when file should not be cached + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } mutation.officeId Path parameter + * @param { number } mutation.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } mutation.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } mutation.filter Query parameter + * @param { number } mutation.page Query parameter. 1-indexed page number to begin from + * @param { string } mutation.cursor Query parameter. ID of item to start after + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGenerateAccountStatementMutation = ( + options?: AppMutationOptions< + typeof DunningAccountStatementApi.generateAccountStatement, + { + officeId: string; + limit: number; + order?: string; + filter?: CommonModels.OfficeInvoiceFilterDto; + page?: number; + cursor?: string; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); + return DunningAccountStatementApi.generateAccountStatement( + officeId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, limit } = variables; + const updateKeys = [keys.generateAccountStatement(officeId, limit)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Infinite query `useGenerateAccountStatementInfinite + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useGenerateAccountStatementInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CommonModels.OfficeInvoiceFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); + return DunningAccountStatementApi.generateAccountStatement( + officeId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useGetAccountStatementEml` - recommended when file should not be cached + * @summary Get account statement as EML file with PDF attachment + * @permission Requires `canUseGetAccountStatementEml` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningAccountStatementModels.OfficeInvoiceListQueryDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useGetAccountStatementEml = ( + options?: AppMutationOptions< + typeof DunningAccountStatementApi.getAccountStatementEml, + { officeId: string; data: DunningAccountStatementModels.OfficeInvoiceListQueryDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId })); + return DunningAccountStatementApi.getAccountStatementEml(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/dunningLevels/dunningLevels.acl.ts b/test/generated/base/dunningLevels/dunningLevels.acl.ts new file mode 100644 index 0000000..55850c2 --- /dev/null +++ b/test/generated/base/dunningLevels/dunningLevels.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningLevelsAcl { + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List dunning level labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Read", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List dunning levels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Read", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Create", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get dunning level by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Read", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Update", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive a dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Archive", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive a dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Unarchive", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Unarchive", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; +} diff --git a/test/generated/base/dunningLevels/dunningLevels.api.ts b/test/generated/base/dunningLevels/dunningLevels.api.ts new file mode 100644 index 0000000..790f933 --- /dev/null +++ b/test/generated/base/dunningLevels/dunningLevels.api.ts @@ -0,0 +1,142 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningLevelsModels } from "./dunningLevels.models"; + +export namespace DunningLevelsApi { + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, + `/offices/${officeId}/dunning-levels/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const list = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, + `/offices/${officeId}/dunning-levels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = ( + officeId: string, + data: DunningLevelsModels.CreateDunningLevelRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels`, + ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), + config, + ); + }; + + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}`, + config, + ); + }; + + export const update = ( + id: string, + officeId: string, + data: DunningLevelsModels.UpdateDunningLevelRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}`, + ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/dunningLevels/dunningLevels.configs.ts b/test/generated/base/dunningLevels/dunningLevels.configs.ts new file mode 100644 index 0000000..73a46f7 --- /dev/null +++ b/test/generated/base/dunningLevels/dunningLevels.configs.ts @@ -0,0 +1,134 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningLevelsModels } from "./dunningLevels.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningLevelsQueries } from "./dunningLevels.queries"; +import { DunningLevelsAcl } from "./dunningLevels.acl"; + +export namespace DunningLevelsConfigs { + export const dunningLevelsConfig = { + meta: { + title: "Dunning Levels", + }, + readAll: { + acl: DunningLevelsAcl.canUseList, + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + paginated: DunningLevelsQueries.useList, + infinite: DunningLevelsQueries.useListInfinite, + filters: { + schema: DunningLevelsModels.DunningLevelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningLevelsModels.DunningLevelFilterDtoSchema, + options: { + inputs: { + dunningSystemId: true, + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + options: { + columns: { + id: true, + level: true, + daysOverdue: true, + dunningFee: true, + interestRate: true, + usedInOfficeId: true, + usedInOffice: true, + dunningSystem: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + archived: true, + bodyRemarks: true, + footerRemarks: true, + }, + sortable: DunningLevelsModels.DunningLevelsListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: DunningLevelsAcl.canUseFindById, + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + query: DunningLevelsQueries.useFindById, + }, + create: { + acl: DunningLevelsAcl.canUseCreate, + schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, + mutation: DunningLevelsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, + options: { + inputs: { + level: true, + daysOverdue: true, + dunningFee: true, + dunningSystemId: true, + interestRate: true, + bodyRemarks: true, + footerRemarks: true, + }, + }, + }), + }, + update: { + acl: DunningLevelsAcl.canUseUpdate, + schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, + mutation: DunningLevelsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, + options: { + inputs: { + level: true, + daysOverdue: true, + dunningFee: true, + interestRate: true, + dunningSystemId: true, + bodyRemarks: true, + footerRemarks: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DunningLevelsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DunningLevelsQueries.usePaginateLabels, + infinite: DunningLevelsQueries.usePaginateLabelsInfinite, + filters: { + schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/dunningLevels/dunningLevels.models.ts b/test/generated/base/dunningLevels/dunningLevels.models.ts new file mode 100644 index 0000000..2046ede --- /dev/null +++ b/test/generated/base/dunningLevels/dunningLevels.models.ts @@ -0,0 +1,207 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningLevelsModels { + /** + * DunningLevelOfficeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } currencyNotation + */ + export const DunningLevelOfficeDTOSchema = z + .object({ id: z.string(), name: z.string(), currencyNotation: z.string() }) + .readonly(); + export type DunningLevelOfficeDTO = z.infer; + + /** + * DunningLevelEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DunningLevelEmployeeDTO = z.infer; + + /** + * DunningLevelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { number } level + * @property { number } daysOverdue + * @property { number } dunningFee + * @property { number } interestRate + * @property { string } usedInOfficeId + * @property { DunningLevelOfficeDTO } usedInOffice + * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem + * @property { string } createdById + * @property { DunningLevelEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DunningLevelEmployeeDTO } updatedBy + * @property { string } updatedAt + * @property { boolean } archived + * @property { CommonModels.EditorContentResponseDto } bodyRemarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks + */ + export const DunningLevelResponseDTOSchema = z + .object({ + id: z.string(), + level: z.number(), + daysOverdue: z.number(), + dunningFee: z.number(), + interestRate: z.number().nullish(), + usedInOfficeId: z.string(), + usedInOffice: DunningLevelOfficeDTOSchema.nullish(), + dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), + createdById: z.string().nullish(), + createdBy: DunningLevelEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: DunningLevelEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + archived: z.boolean(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), + }) + .readonly(); + export type DunningLevelResponseDTO = z.infer; + + /** + * CreateDunningLevelRequestDTOSchema + * @type { object } + * @property { number } level Dunning level number. Minimum: `1` + * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` + * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` + * @property { string } dunningSystemId Dunning system ID + * @property { number } interestRate Minimum: `0`. Maximum: `100` + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const CreateDunningLevelRequestDTOSchema = z + .object({ + level: z.number().gte(1).describe("Dunning level number"), + daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), + dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), + dunningSystemId: z.string().describe("Dunning system ID").nullish(), + interestRate: z.number().gte(0).lte(100).nullish(), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks").nullish(), + }) + .readonly(); + export type CreateDunningLevelRequestDTO = z.infer; + + /** + * UpdateDunningLevelRequestDTOSchema + * @type { object } + * @property { number } level Dunning level number. Minimum: `1` + * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` + * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` + * @property { number } interestRate Minimum: `0`. Maximum: `100` + * @property { string } dunningSystemId Dunning system ID + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateDunningLevelRequestDTOSchema = z + .object({ + level: z.number().gte(1).describe("Dunning level number"), + daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), + dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), + interestRate: z.number().gte(0).lte(100), + dunningSystemId: z.string().describe("Dunning system ID"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateDunningLevelRequestDTO = z.infer; + + /** + * DunningLevelLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const DunningLevelLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type DunningLevelLabelFilterDto = z.infer; + + /** + * DunningLevelFilterDtoSchema + * @type { object } + * @property { string } dunningSystemId Dunning system ID to filter by + * @property { string } search Search to filter by + * @property { boolean } archived Filter by archived status + */ + export const DunningLevelFilterDtoSchema = z + .object({ + dunningSystemId: z.string().describe("Dunning system ID to filter by"), + search: z.string().describe("Search to filter by"), + archived: z.boolean().describe("Filter by archived status"), + }) + .readonly(); + export type DunningLevelFilterDto = z.infer; + + /** + * DunningLevelsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const DunningLevelsPaginateLabelsOrderParamEnumSchema = z.enum([ + "level", + "daysOverdue", + "dunningFee", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DunningLevelsPaginateLabelsOrderParamEnum = z.infer< + typeof DunningLevelsPaginateLabelsOrderParamEnumSchema + >; + export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * DunningLevelsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const DunningLevelsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DunningLevelsPaginateLabelsResponse = z.infer; + + /** + * DunningLevelsListOrderParamEnumSchema + * @type { enum } + */ + export const DunningLevelsListOrderParamEnumSchema = z.enum([ + "level", + "daysOverdue", + "dunningFee", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DunningLevelsListOrderParamEnum = z.infer; + export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSchema.enum; + + /** + * DunningLevelsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningLevelResponseDTO[] } items + */ + export const DunningLevelsListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(DunningLevelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DunningLevelsListResponse = z.infer; +} diff --git a/test/generated/base/dunningLevels/dunningLevels.queries.ts b/test/generated/base/dunningLevels/dunningLevels.queries.ts new file mode 100644 index 0000000..9792c9b --- /dev/null +++ b/test/generated/base/dunningLevels/dunningLevels.queries.ts @@ -0,0 +1,420 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningLevelsAcl } from "./dunningLevels.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningLevelsModels } from "./dunningLevels.models"; +import { DunningLevelsApi } from "./dunningLevels.api"; + +export namespace DunningLevelsQueries { + export const moduleName = QueryModule.DunningLevels; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/dunning-levels/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/dunning-levels/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + list: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/dunning-levels", officeId, limit, order, filter, page, cursor] as const, + listInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelFilterDto, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/dunning-levels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/dunning-levels/:id", id, officeId] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate dunning level labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningLevelsModels.DunningLevelLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId })); + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate dunning level labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningLevelsModels.DunningLevelLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId })); + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useList` + * @summary List dunning levels + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningLevelsModels.DunningLevelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUseList({ officeId })); + return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List dunning levels + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningLevelsModels.DunningLevelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningLevelsAcl.canUseList({ officeId })); + return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create dunning level + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningLevelsModels.CreateDunningLevelRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof DunningLevelsApi.create, + { officeId: string; data: DunningLevelsModels.CreateDunningLevelRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningLevelsAcl.canUseCreate({ officeId })); + return DunningLevelsApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get dunning level by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUseFindById({ officeId })); + return DunningLevelsApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update dunning level + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningLevelsModels.UpdateDunningLevelRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof DunningLevelsApi.update, + { id: string; officeId: string; data: DunningLevelsModels.UpdateDunningLevelRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(DunningLevelsAcl.canUseUpdate({ officeId })); + return DunningLevelsApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive a dunning level + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningLevelsAcl.canUseArchive({ officeId })); + return DunningLevelsApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive a dunning level + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId })); + return DunningLevelsApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/dunningManagement/dunningManagement.acl.ts b/test/generated/base/dunningManagement/dunningManagement.acl.ts new file mode 100644 index 0000000..6e5c932 --- /dev/null +++ b/test/generated/base/dunningManagement/dunningManagement.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningManagementAcl { + /** + * Use for `useListDunnings` query ability. For global ability, omit the object parameter. + * @description List dunnings + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListDunnings` query + */ + export const canUseListDunnings = (object?: { officeId: string }) => + ["Read", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< + "Read", + "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) + >; + + /** + * Use for `useCreateDunningWithInvoices` mutation ability. For global ability, omit the object parameter. + * @description Create dunning + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDunningWithInvoices` mutation + */ + export const canUseCreateDunningWithInvoices = (object?: { officeId: string }) => + ["Create", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< + "Create", + "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) + >; + + /** + * Use for `useGetDunningEml` query or `useGetDunningEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download dunning as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDunningEml` query or `useGetDunningEmlMutation` mutation + */ + export const canUseGetDunningEml = (object?: { officeId: string }) => + ["Read", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< + "Read", + "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) + >; +} diff --git a/test/generated/base/dunningManagement/dunningManagement.api.ts b/test/generated/base/dunningManagement/dunningManagement.api.ts new file mode 100644 index 0000000..bd41108 --- /dev/null +++ b/test/generated/base/dunningManagement/dunningManagement.api.ts @@ -0,0 +1,81 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningManagementModels } from "./dunningManagement.models"; + +export namespace DunningManagementApi { + export const listDunnings = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningManagementModels.DunningFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningManagementModels.ListDunningsResponseSchema }, + `/offices/${officeId}/dunnings`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const createDunningWithInvoices = ( + partnerId: string, + officeId: string, + data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DunningManagementModels.DunningResponseDtoSchema }, + `/offices/${officeId}/partners/${partnerId}/dunnings`, + ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), + config, + ); + }; + + export const dataGenFake = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, + `/data-gen-fake`, + config, + ); + }; + + export const getDunningEml = (officeId: string, dunningId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/dunnings/${dunningId}/eml`, { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }); + }; +} diff --git a/test/generated/base/dunningManagement/dunningManagement.configs.ts b/test/generated/base/dunningManagement/dunningManagement.configs.ts new file mode 100644 index 0000000..6c13fc7 --- /dev/null +++ b/test/generated/base/dunningManagement/dunningManagement.configs.ts @@ -0,0 +1,59 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningManagementModels } from "./dunningManagement.models"; +import { DunningManagementQueries } from "./dunningManagement.queries"; +import { DunningManagementAcl } from "./dunningManagement.acl"; + +export namespace DunningManagementConfigs { + export const dunningsConfig = { + meta: { + title: "Dunnings", + }, + readAll: { + acl: DunningManagementAcl.canUseListDunnings, + schema: DunningManagementModels.DunningResponseDtoSchema, + paginated: DunningManagementQueries.useListDunnings, + infinite: DunningManagementQueries.useListDunningsInfinite, + filters: { + schema: DunningManagementModels.DunningFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningManagementModels.DunningFilterDtoSchema, + options: { + inputs: { + status: true, + partnerId: true, + level: true, + outstandingAmountMin: true, + outstandingAmountMax: true, + createdFrom: true, + createdTo: true, + confirmedBy: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DunningManagementModels.DunningResponseDtoSchema, + options: { + columns: { + id: true, + partner: true, + level: true, + dunningLevelId: true, + status: true, + invoiceCount: true, + outstandingAmount: true, + currencyNotation: true, + daysOverdue: true, + dunningFee: true, + createdAt: true, + statusChangedOn: true, + confirmedBy: true, + documentUrl: true, + }, + sortable: DunningManagementModels.ListDunningsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/dunningManagement/dunningManagement.models.ts b/test/generated/base/dunningManagement/dunningManagement.models.ts new file mode 100644 index 0000000..1e56fe9 --- /dev/null +++ b/test/generated/base/dunningManagement/dunningManagement.models.ts @@ -0,0 +1,299 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningManagementModels { + /** + * DunningPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ + export const DunningPartnerDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), + }) + .readonly(); + export type DunningPartnerDto = z.infer; + + /** + * DunningConfirmedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DunningConfirmedByDto = z.infer; + + /** + * DunningStatusSchema + * @type { enum } + */ + export const DunningStatusSchema = z.enum(["PREPARED", "ISSUED"]); + export type DunningStatus = z.infer; + export const DunningStatus = DunningStatusSchema.enum; + + /** + * DunningResponseDtoSchema + * @type { object } + * @property { string } id + * @property { DunningPartnerDto } partner + * @property { number } level + * @property { string } dunningLevelId + * @property { string } status + * @property { number } invoiceCount + * @property { number } outstandingAmount + * @property { string } currencyNotation + * @property { number } daysOverdue + * @property { number } dunningFee + * @property { string } createdAt + * @property { string } statusChangedOn + * @property { DunningConfirmedByDto } confirmedBy + * @property { string } documentUrl + */ + export const DunningResponseDtoSchema = z + .object({ + id: z.string(), + partner: DunningPartnerDtoSchema, + level: z.number(), + dunningLevelId: z.string().nullish(), + status: DunningStatusSchema, + invoiceCount: z.number(), + outstandingAmount: z.number(), + currencyNotation: z.string(), + daysOverdue: z.number(), + dunningFee: z.number(), + createdAt: z.iso.datetime({ offset: true }), + statusChangedOn: z.iso.datetime({ offset: true }), + confirmedBy: DunningConfirmedByDtoSchema.nullish(), + documentUrl: z.string().nullish(), + }) + .readonly(); + export type DunningResponseDto = z.infer; + + /** + * DunningFilterDtoSchema + * @type { object } + * @property { DunningStatus[] } status + * @property { string } partnerId Partner ID to filter by + * @property { array[] } level Dunning level(s) to filter by + * @property { number } outstandingAmountMin Minimum outstanding amount + * @property { number } outstandingAmountMax Maximum outstanding amount + * @property { string } createdFrom Created from (ISO date string) + * @property { string } createdTo Created to (ISO date string) + * @property { string } confirmedBy Confirmed by employee ID + */ + export const DunningFilterDtoSchema = z + .object({ + status: z.array(DunningStatusSchema).readonly(), + partnerId: z.string().describe("Partner ID to filter by"), + level: z.array(z.array(z.any()).readonly()).readonly().describe("Dunning level(s) to filter by"), + outstandingAmountMin: z.number().describe("Minimum outstanding amount"), + outstandingAmountMax: z.number().describe("Maximum outstanding amount"), + createdFrom: z.iso.datetime({ offset: true }).describe("Created from (ISO date string)"), + createdTo: z.iso.datetime({ offset: true }).describe("Created to (ISO date string)"), + confirmedBy: z.string().describe("Confirmed by employee ID"), + }) + .readonly(); + export type DunningFilterDto = z.infer; + + /** + * DunningPdfConfigDTOSchema + * @type { object } + * @property { string } headerImageUrl + * @property { string } footerImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ + export const DunningPdfConfigDTOSchema = z + .object({ + headerImageUrl: z.string(), + footerImageUrl: z.string(), + showWatermarkOnDocuments: z.boolean(), + locale: CommonModels.LocaleEnumSchema.nullish(), + }) + .readonly(); + export type DunningPdfConfigDTO = z.infer; + + /** + * DunningPdfBusinessPartnerDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } address + * @property { string } referenceNumber + */ + export const DunningPdfBusinessPartnerDTOSchema = z + .object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }) + .readonly(); + export type DunningPdfBusinessPartnerDTO = z.infer; + + /** + * DunningPdfInvoiceDTOSchema + * @type { object } + * @property { string } invoiceNumber + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } daysOverdue + * @property { number } dunningLevel + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + * @property { number } interest + */ + export const DunningPdfInvoiceDTOSchema = z + .object({ + invoiceNumber: z.string(), + issuingDate: z.iso.datetime({ offset: true }), + dueDate: z.iso.datetime({ offset: true }).nullish(), + daysOverdue: z.number(), + dunningLevel: z.number(), + invoiceAmount: z.number(), + outstandingAmount: z.number(), + currencyNotation: z.string(), + interest: z.number().nullish(), + }) + .readonly(); + export type DunningPdfInvoiceDTO = z.infer; + + /** + * DunningPdfTotalDTOSchema + * @type { object } + * @property { number } invoicesSum + * @property { number } dunningFee + * @property { number } interest + * @property { string } currencyNotation + */ + export const DunningPdfTotalDTOSchema = z + .object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }) + .readonly(); + export type DunningPdfTotalDTO = z.infer; + + /** + * DunningPdfBankAccountDTOSchema + * @type { object } + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + */ + export const DunningPdfBankAccountDTOSchema = z + .object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }) + .readonly(); + export type DunningPdfBankAccountDTO = z.infer; + + /** + * DunningPdfUpcomingInvoiceDTOSchema + * @type { object } + * @property { string } number + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } dueDays + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + */ + export const DunningPdfUpcomingInvoiceDTOSchema = z + .object({ + number: z.string(), + issuingDate: z.iso.datetime({ offset: true }).nullish(), + dueDate: z.iso.datetime({ offset: true }).nullish(), + dueDays: z.number().nullish(), + invoiceAmount: z.number().nullish(), + outstandingAmount: z.number().nullish(), + currencyNotation: z.string().nullish(), + }) + .readonly(); + export type DunningPdfUpcomingInvoiceDTO = z.infer; + + /** + * DunningPdfPayloadDTOSchema + * @type { object } + * @property { string } dunningId + * @property { number } dunningLevel + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { DunningPdfBusinessPartnerDTO } businessPartner + * @property { DunningPdfInvoiceDTO[] } invoices + * @property { DunningPdfTotalDTO } total + * @property { DunningPdfBankAccountDTO } bankAccount + * @property { string } employeeName + * @property { DunningPdfConfigDTO } config + * @property { CommonModels.LanguageEnum } language + * @property { DunningPdfUpcomingInvoiceDTO[] } upcomingInvoices + */ + export const DunningPdfPayloadDTOSchema = z + .object({ + dunningId: z.string(), + dunningLevel: z.number(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + businessPartner: DunningPdfBusinessPartnerDTOSchema, + invoices: z.array(DunningPdfInvoiceDTOSchema).readonly(), + total: DunningPdfTotalDTOSchema, + bankAccount: DunningPdfBankAccountDTOSchema, + employeeName: z.string().nullable(), + config: DunningPdfConfigDTOSchema, + language: CommonModels.LanguageEnumSchema.nullish(), + upcomingInvoices: z.array(DunningPdfUpcomingInvoiceDTOSchema).readonly().nullish(), + }) + .readonly(); + export type DunningPdfPayloadDTO = z.infer; + + /** + * CreateDunningWithInvoicesRequestDTOSchema + * @type { object } + * @property { string[] } invoiceIds Array of outstanding invoice IDs to include in the dunning. Example: `123e4567-e89b-12d3-a456-426614174000,123e4567-e89b-12d3-a456-426614174001` + * @property { string } dunningLevelId The ID of the dunning level to use for this dunning. Example: `123e4567-e89b-12d3-a456-426614174002` + * @property { number } dunningFee Optional dunning fee to use. If not provided, the fee from the dunning level will be used. Minimum: `0`. Example: `25.5` + * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` + * @property { boolean } includeUpcomingInvoices + */ + export const CreateDunningWithInvoicesRequestDTOSchema = z + .object({ + invoiceIds: z.array(z.string()).readonly().describe("Array of outstanding invoice IDs to include in the dunning"), + dunningLevelId: z.string().describe("The ID of the dunning level to use for this dunning"), + dunningFee: z + .number() + .gte(0) + .describe("Optional dunning fee to use. If not provided, the fee from the dunning level will be used") + .nullish(), + interestRate: z.number().gte(0).lte(100).nullish(), + includeUpcomingInvoices: z.boolean().nullish(), + }) + .readonly(); + export type CreateDunningWithInvoicesRequestDTO = z.infer; + + /** + * ListDunningsOrderParamEnumSchema + * @type { enum } + */ + export const ListDunningsOrderParamEnumSchema = z.enum([ + "createdAt", + "level", + "outstandingAmount", + "statusChangedOn", + ]); + export type ListDunningsOrderParamEnum = z.infer; + export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; + + /** + * ListDunningsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningResponseDto[] } items + */ + export const ListDunningsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(DunningResponseDtoSchema).readonly() }).readonly().shape, + }); + export type ListDunningsResponse = z.infer; +} diff --git a/test/generated/base/dunningManagement/dunningManagement.queries.ts b/test/generated/base/dunningManagement/dunningManagement.queries.ts new file mode 100644 index 0000000..270d1d2 --- /dev/null +++ b/test/generated/base/dunningManagement/dunningManagement.queries.ts @@ -0,0 +1,241 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningManagementAcl } from "./dunningManagement.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningManagementModels } from "./dunningManagement.models"; +import { DunningManagementApi } from "./dunningManagement.api"; + +export namespace DunningManagementQueries { + export const moduleName = QueryModule.DunningManagement; + + export const keys = { + all: [moduleName] as const, + listDunnings: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningManagementModels.DunningFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/dunnings", officeId, limit, order, filter, page, cursor] as const, + listDunningsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningManagementModels.DunningFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/dunnings", "infinite", officeId, limit, order, filter, cursor] as const, + dataGenFake: () => [...keys.all, "/data-gen-fake"] as const, + getDunningEml: (officeId: string, dunningId: string) => + [...keys.all, "/offices/:officeId/dunnings/:dunningId/eml", officeId, dunningId] as const, + }; + + /** + * Query `useListDunnings` + * @summary List dunnings for an office + * @permission Requires `canUseListDunnings` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` + * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListDunnings = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningManagementModels.DunningFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningManagementAcl.canUseListDunnings({ officeId })); + return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListDunningsInfinite + * @summary List dunnings for an office + * @permission Requires `canUseListDunnings` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` + * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListDunningsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningManagementModels.DunningFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningManagementAcl.canUseListDunnings({ officeId })); + return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreateDunningWithInvoices` + * @summary Create a dunning with outstanding invoices + * @permission Requires `canUseCreateDunningWithInvoices` ability + * @param { string } mutation.partnerId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningManagementModels.CreateDunningWithInvoicesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateDunningWithInvoices = ( + options?: AppMutationOptions< + typeof DunningManagementApi.createDunningWithInvoices, + { partnerId: string; officeId: string; data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ partnerId, officeId, data }) => { + checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId })); + return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useDataGenFake` + * @summary Expose dunning PDF payload DTO for model generation + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useDataGenFake = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.dataGenFake(), + queryFn: () => DunningManagementApi.dataGenFake(config), + ...options, + }); + }; + + /** + * Query `useGetDunningEml` - recommended when file should be cached + * @summary Get dunning as EML file with PDF attachment + * @permission Requires `canUseGetDunningEml` ability + * @param { string } object.officeId Path parameter + * @param { string } object.dunningId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const useGetDunningEml = ( + { officeId, dunningId }: { officeId: string; dunningId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDunningEml(officeId, dunningId), + queryFn: () => { + checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId })); + return DunningManagementApi.getDunningEml(officeId, dunningId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useGetDunningEmlMutation` - recommended when file should not be cached + * @summary Get dunning as EML file with PDF attachment + * @permission Requires `canUseGetDunningEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.dunningId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGetDunningEmlMutation = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, dunningId }) => { + checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId })); + return DunningManagementApi.getDunningEml(officeId, dunningId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, dunningId } = variables; + const updateKeys = [keys.getDunningEml(officeId, dunningId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts new file mode 100644 index 0000000..48fca0f --- /dev/null +++ b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningPartnerOutstandingInvoicesAcl { + /** + * Use for `useListPartnerOutstandingInvoiceSummaries` query ability. For global ability, omit the object parameter. + * @description List office outstanding invoice summaries per partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoiceSummaries` query + */ + export const canUseListPartnerOutstandingInvoiceSummaries = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useListPartnerOutstandingInvoices` query ability. For global ability, omit the object parameter. + * @description List partner outstanding invoices + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoices` query + */ + export const canUseListPartnerOutstandingInvoices = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useListRecommendedDunningLevels` mutation ability. For global ability, omit the object parameter. + * @description List recommended dunning levels for a partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRecommendedDunningLevels` mutation + */ + export const canUseListRecommendedDunningLevels = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; +} diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts new file mode 100644 index 0000000..73bbbaf --- /dev/null +++ b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts @@ -0,0 +1,110 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; + +export namespace DunningPartnerOutstandingInvoicesApi { + export const listPartnerOutstandingInvoiceSummaries = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, + `/offices/${officeId}/partner-outstanding-invoices`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const listPartnerOutstandingInvoices = ( + partnerId: string, + officeId: string, + limit: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, + `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const listRecommendedDunningLevels = ( + partnerId: string, + officeId: string, + data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, + `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, + ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts new file mode 100644 index 0000000..66cb46a --- /dev/null +++ b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts @@ -0,0 +1,96 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; +import { DunningPartnerOutstandingInvoicesQueries } from "./dunningPartnerOutstandingInvoices.queries"; +import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; + +export namespace DunningPartnerOutstandingInvoicesConfigs { + export const partnerOutstandingInvoicesConfig = { + meta: { + title: "Partner Outstanding Invoices", + }, + readAll: { + acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries, + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, + paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummaries, + infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummariesInfinite, + filters: { + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, + options: { + inputs: { + search: true, + daysOverdueMin: true, + partnerId: true, + outstandingAmountMin: true, + currency: true, + dunningSystemId: true, + lastDunningDate: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, + options: { + columns: { + partnerId: true, + partnerName: true, + partnerCountry: true, + dunningSystemId: true, + dunningSystemName: true, + invoiceCount: true, + daysOverdue: true, + outstandingAmount: true, + currencyNotation: true, + lastDunningDate: true, + }, + sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, + }, + }), + }, + }; + + export const outstandingInvoicesConfig = { + meta: { + title: "Outstanding Invoices", + }, + readAll: { + acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices, + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, + paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoices, + infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoicesInfinite, + filters: { + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, + options: { + inputs: { + partnerId: true, + currency: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, + options: { + columns: { + invoiceId: true, + invoiceNumber: true, + invoiceDate: true, + invoiceAmount: true, + owedAmount: true, + currencyNotation: true, + daysOverdue: true, + dueDate: true, + invoiceInReview: true, + dunningBlock: true, + }, + sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts new file mode 100644 index 0000000..23aa85a --- /dev/null +++ b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts @@ -0,0 +1,207 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningPartnerOutstandingInvoicesModels { + /** + * PartnerOutstandingInvoiceSummaryFilterDtoSchema + * @type { object } + * @property { string } search Search string (partner name) + * @property { number } daysOverdueMin Minimum days overdue + * @property { string } partnerId Partner ID + * @property { number } outstandingAmountMin Minimum outstanding amount + * @property { string } currency Currency + * @property { string } dunningSystemId Dunning system ID + * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range + */ + export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z + .object({ + search: z.string().describe("Search string (partner name)"), + daysOverdueMin: z.number().describe("Minimum days overdue"), + partnerId: z.string().describe("Partner ID"), + outstandingAmountMin: z.number().describe("Minimum outstanding amount"), + currency: z.string().describe("Currency"), + dunningSystemId: z.string().describe("Dunning system ID"), + lastDunningDate: CommonModels.DateRangeDtoSchema.describe("Last dunning date range"), + }) + .readonly(); + export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer< + typeof PartnerOutstandingInvoiceSummaryFilterDtoSchema + >; + + /** + * PartnerOutstandingInvoiceSummaryResponseDtoSchema + * @type { object } + * @property { string } partnerId Business partner ID + * @property { string } partnerName Business partner name + * @property { string } partnerCountry Business partner country + * @property { string } dunningSystemId Dunning system ID + * @property { string } dunningSystemName Dunning system name + * @property { number } invoiceCount Number of outstanding invoices + * @property { number } daysOverdue Maximum days overdue across all partner invoices + * @property { number } outstandingAmount Total outstanding amount + * @property { string } currencyNotation Currency of partner invoices + * @property { string } lastDunningDate Date of the most recent issued dunning document + */ + export const PartnerOutstandingInvoiceSummaryResponseDtoSchema = z + .object({ + partnerId: z.string().describe("Business partner ID"), + partnerName: z.string().describe("Business partner name"), + partnerCountry: z.string().describe("Business partner country").nullish(), + dunningSystemId: z.string().describe("Dunning system ID"), + dunningSystemName: z.string().describe("Dunning system name"), + invoiceCount: z.number().describe("Number of outstanding invoices"), + daysOverdue: z.number().describe("Maximum days overdue across all partner invoices").nullish(), + outstandingAmount: z.number().describe("Total outstanding amount"), + currencyNotation: z.string().describe("Currency of partner invoices"), + lastDunningDate: z.iso + .datetime({ offset: true }) + .describe("Date of the most recent issued dunning document") + .nullish(), + }) + .readonly(); + export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer< + typeof PartnerOutstandingInvoiceSummaryResponseDtoSchema + >; + + /** + * PartnerOutstandingInvoiceResponseDtoSchema + * @type { object } + * @property { string } invoiceId Invoice ID + * @property { string } invoiceNumber Invoice number + * @property { string } invoiceDate Invoice date + * @property { number } invoiceAmount Invoice amount + * @property { number } owedAmount Owed amount + * @property { string } currencyNotation Currency notation + * @property { number } daysOverdue Days overdue + * @property { string } dueDate Due date + * @property { boolean } invoiceInReview + * @property { boolean } dunningBlock + */ + export const PartnerOutstandingInvoiceResponseDtoSchema = z + .object({ + invoiceId: z.string().describe("Invoice ID"), + invoiceNumber: z.string().describe("Invoice number").nullish(), + invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date").nullish(), + invoiceAmount: z.number().describe("Invoice amount"), + owedAmount: z.number().describe("Owed amount"), + currencyNotation: z.string().describe("Currency notation"), + daysOverdue: z.number().describe("Days overdue").nullish(), + dueDate: z.iso.datetime({ offset: true }).describe("Due date").nullish(), + invoiceInReview: z.boolean().nullish(), + dunningBlock: z.boolean().nullish(), + }) + .readonly(); + export type PartnerOutstandingInvoiceResponseDto = z.infer; + + /** + * PartnerOutstandingInvoiceFilterDtoSchema + * @type { object } + * @property { string } partnerId Partner ID to filter by + * @property { string } currency Invoice currency notation to filter by + */ + export const PartnerOutstandingInvoiceFilterDtoSchema = z + .object({ + partnerId: z.string().describe("Partner ID to filter by"), + currency: z.string().describe("Invoice currency notation to filter by"), + }) + .readonly(); + export type PartnerOutstandingInvoiceFilterDto = z.infer; + + /** + * RecommendedDunningLevelsRequestDtoSchema + * @type { object } + * @property { string[] } invoiceIds Invoice IDs used to calculate the recommended dunning level. Min Items: `1`. Example: `123e4567-e89b-12d3-a456-426614174000` + */ + export const RecommendedDunningLevelsRequestDtoSchema = z + .object({ + invoiceIds: z + .array(z.string()) + .readonly() + .min(1) + .describe("Invoice IDs used to calculate the recommended dunning level"), + }) + .readonly(); + export type RecommendedDunningLevelsRequestDto = z.infer; + + /** + * RecommendedLabelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { boolean } isRecommended + */ + export const RecommendedLabelResponseDtoSchema = z + .object({ id: z.string(), label: z.string(), isRecommended: z.boolean() }) + .readonly(); + export type RecommendedLabelResponseDto = z.infer; + + /** + * ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema + * @type { enum } + */ + export const ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema = z.enum([ + "outstandingAmount", + "daysOverdue", + "lastDunningDate", + "invoiceCount", + "partnerCountry", + "partnerName", + "dunningSystemName", + ]); + export type ListPartnerOutstandingInvoiceSummariesOrderParamEnum = z.infer< + typeof ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema + >; + export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = + ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema.enum; + + /** + * ListPartnerOutstandingInvoiceSummariesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items + */ + export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).readonly() }).readonly().shape, + }); + export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer< + typeof ListPartnerOutstandingInvoiceSummariesResponseSchema + >; + + /** + * ListPartnerOutstandingInvoicesOrderParamEnumSchema + * @type { enum } + */ + export const ListPartnerOutstandingInvoicesOrderParamEnumSchema = z.enum(["dueDate", "invoiceDate", "owedAmount"]); + export type ListPartnerOutstandingInvoicesOrderParamEnum = z.infer< + typeof ListPartnerOutstandingInvoicesOrderParamEnumSchema + >; + export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandingInvoicesOrderParamEnumSchema.enum; + + /** + * ListPartnerOutstandingInvoicesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerOutstandingInvoiceResponseDto[] } items + */ + export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).readonly() }).readonly().shape, + }); + export type ListPartnerOutstandingInvoicesResponse = z.infer; + + /** + * ListRecommendedDunningLevelsResponseSchema + * @type { array } + */ + export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema).readonly(); + export type ListRecommendedDunningLevelsResponse = z.infer; +} diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts new file mode 100644 index 0000000..5719173 --- /dev/null +++ b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts @@ -0,0 +1,365 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; +import { DunningPartnerOutstandingInvoicesApi } from "./dunningPartnerOutstandingInvoices.api"; + +export namespace DunningPartnerOutstandingInvoicesQueries { + export const moduleName = QueryModule.DunningPartnerOutstandingInvoices; + + export const keys = { + all: [moduleName] as const, + listPartnerOutstandingInvoiceSummaries: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/partner-outstanding-invoices", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + listPartnerOutstandingInvoiceSummariesInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/partner-outstanding-invoices", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + listPartnerOutstandingInvoices: ( + partnerId: string, + officeId: string, + limit?: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/partners/:partnerId/outstanding-invoices", + partnerId, + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + listPartnerOutstandingInvoicesInfinite: ( + partnerId: string, + officeId: string, + limit?: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/partners/:partnerId/outstanding-invoices", + "infinite", + partnerId, + officeId, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useListPartnerOutstandingInvoiceSummaries` + * @summary List office outstanding invoice summaries per partner + * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListPartnerOutstandingInvoiceSummaries = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions< + typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries, + TData + >, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId })); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries( + officeId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + }); + }; + + /** + * Infinite query `useListPartnerOutstandingInvoiceSummariesInfinite + * @summary List office outstanding invoice summaries per partner + * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListPartnerOutstandingInvoiceSummariesInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions< + typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries, + TData + >, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId })); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries( + officeId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useListPartnerOutstandingInvoices` + * @summary List outstanding invoices for a specific partner + * @permission Requires `canUseListPartnerOutstandingInvoices` ability + * @param { string } object.partnerId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListPartnerOutstandingInvoices = ( + { + partnerId, + officeId, + limit, + order, + filter, + page, + cursor, + }: { + partnerId: string; + officeId: string; + limit: number; + order?: string; + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId })); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices( + partnerId, + officeId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + }); + }; + + /** + * Infinite query `useListPartnerOutstandingInvoicesInfinite + * @summary List outstanding invoices for a specific partner + * @permission Requires `canUseListPartnerOutstandingInvoices` ability + * @param { string } object.partnerId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListPartnerOutstandingInvoicesInfinite = ( + { + partnerId, + officeId, + limit, + order, + filter, + cursor, + }: { + partnerId: string; + officeId: string; + limit: number; + order?: string; + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions< + typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices, + TData + >, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId })); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices( + partnerId, + officeId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useListRecommendedDunningLevels` + * @summary List recommended dunning levels for a partner + * @permission Requires `canUseListRecommendedDunningLevels` ability + * @param { string } mutation.partnerId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useListRecommendedDunningLevels = ( + options?: AppMutationOptions< + typeof DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels, + { + partnerId: string; + officeId: string; + data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ partnerId, officeId, data }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId })); + return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/dunningSystems/dunningSystems.acl.ts b/test/generated/base/dunningSystems/dunningSystems.acl.ts new file mode 100644 index 0000000..2074067 --- /dev/null +++ b/test/generated/base/dunningSystems/dunningSystems.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningSystemsAcl { + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List dunning system labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Read", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List dunning systems + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Read", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Create", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get dunning system by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Read", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Update", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Archive", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Archive", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; +} diff --git a/test/generated/base/dunningSystems/dunningSystems.api.ts b/test/generated/base/dunningSystems/dunningSystems.api.ts new file mode 100644 index 0000000..9166e80 --- /dev/null +++ b/test/generated/base/dunningSystems/dunningSystems.api.ts @@ -0,0 +1,142 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningSystemsModels } from "./dunningSystems.models"; + +export namespace DunningSystemsApi { + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, + `/offices/${officeId}/dunning-systems/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, + `/offices/${officeId}/dunning-systems`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = ( + officeId: string, + data: DunningSystemsModels.CreateDunningSystemRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems`, + ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), + config, + ); + }; + + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}`, + config, + ); + }; + + export const update = ( + id: string, + officeId: string, + data: DunningSystemsModels.UpdateDunningSystemRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}`, + ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/dunningSystems/dunningSystems.configs.ts b/test/generated/base/dunningSystems/dunningSystems.configs.ts new file mode 100644 index 0000000..4928e9a --- /dev/null +++ b/test/generated/base/dunningSystems/dunningSystems.configs.ts @@ -0,0 +1,119 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningSystemsModels } from "./dunningSystems.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningSystemsQueries } from "./dunningSystems.queries"; +import { DunningSystemsAcl } from "./dunningSystems.acl"; + +export namespace DunningSystemsConfigs { + export const dunningSystemsConfig = { + meta: { + title: "Dunning Systems", + }, + readAll: { + acl: DunningSystemsAcl.canUsePaginate, + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + paginated: DunningSystemsQueries.usePaginate, + infinite: DunningSystemsQueries.usePaginateInfinite, + filters: { + schema: DunningSystemsModels.DunningSystemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningSystemsModels.DunningSystemFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + isDefault: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + isDefault: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: DunningSystemsAcl.canUseFindById, + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + query: DunningSystemsQueries.useFindById, + }, + create: { + acl: DunningSystemsAcl.canUseCreate, + schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, + mutation: DunningSystemsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, + options: { + inputs: { + name: true, + isDefault: true, + }, + }, + }), + }, + update: { + acl: DunningSystemsAcl.canUseUpdate, + schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, + mutation: DunningSystemsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, + options: { + inputs: { + name: true, + isDefault: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DunningSystemsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DunningSystemsQueries.usePaginateLabels, + infinite: DunningSystemsQueries.usePaginateLabelsInfinite, + filters: { + schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/dunningSystems/dunningSystems.models.ts b/test/generated/base/dunningSystems/dunningSystems.models.ts new file mode 100644 index 0000000..f3465f1 --- /dev/null +++ b/test/generated/base/dunningSystems/dunningSystems.models.ts @@ -0,0 +1,145 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningSystemsModels { + /** + * DunningSystemEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DunningSystemEmployeeDTO = z.infer; + + /** + * DunningSystemResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name + * @property { boolean } isDefault + * @property { boolean } archived + * @property { string } archivedAt + * @property { string } createdById + * @property { DunningSystemEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DunningSystemEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const DunningSystemResponseDTOSchema = z + .object({ + id: z.string(), + officeId: z.string(), + name: z.string(), + isDefault: z.boolean(), + archived: z.boolean(), + archivedAt: z.iso.datetime({ offset: true }).nullish(), + createdById: z.string().nullish(), + createdBy: DunningSystemEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: DunningSystemEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type DunningSystemResponseDTO = z.infer; + + /** + * DunningSystemLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const DunningSystemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type DunningSystemLabelFilterDto = z.infer; + + /** + * DunningSystemFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + * @property { boolean } isDefault + */ + export const DunningSystemFilterDtoSchema = z + .object({ search: z.string(), archived: z.boolean(), isDefault: z.boolean() }) + .readonly(); + export type DunningSystemFilterDto = z.infer; + + /** + * CreateDunningSystemRequestDTOSchema + * @type { object } + * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` + * @property { boolean } isDefault Is default dunning system + */ + export const CreateDunningSystemRequestDTOSchema = z + .object({ + name: z.string().min(3).max(100).describe("Dunning system name"), + isDefault: z.boolean().describe("Is default dunning system").nullish(), + }) + .readonly(); + export type CreateDunningSystemRequestDTO = z.infer; + + /** + * UpdateDunningSystemRequestDTOSchema + * @type { object } + * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` + * @property { boolean } isDefault Is default dunning system + */ + export const UpdateDunningSystemRequestDTOSchema = z + .object({ + name: z.string().min(3).max(100).describe("Dunning system name"), + isDefault: z.boolean().describe("Is default dunning system"), + }) + .readonly(); + export type UpdateDunningSystemRequestDTO = z.infer; + + /** + * DunningSystemsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const DunningSystemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); + export type DunningSystemsPaginateLabelsOrderParamEnum = z.infer< + typeof DunningSystemsPaginateLabelsOrderParamEnumSchema + >; + export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * DunningSystemsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const DunningSystemsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DunningSystemsPaginateLabelsResponse = z.infer; + + /** + * DunningSystemsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const DunningSystemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); + export type DunningSystemsPaginateOrderParamEnum = z.infer; + export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderParamEnumSchema.enum; + + /** + * DunningSystemsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningSystemResponseDTO[] } items + */ + export const DunningSystemsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(DunningSystemResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DunningSystemsPaginateResponse = z.infer; +} diff --git a/test/generated/base/dunningSystems/dunningSystems.queries.ts b/test/generated/base/dunningSystems/dunningSystems.queries.ts new file mode 100644 index 0000000..acd8234 --- /dev/null +++ b/test/generated/base/dunningSystems/dunningSystems.queries.ts @@ -0,0 +1,420 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningSystemsAcl } from "./dunningSystems.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningSystemsModels } from "./dunningSystems.models"; +import { DunningSystemsApi } from "./dunningSystems.api"; + +export namespace DunningSystemsQueries { + export const moduleName = QueryModule.DunningSystems; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/dunning-systems/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/dunning-systems/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/dunning-systems", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemFilterDto, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/dunning-systems", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/dunning-systems/:id", id, officeId] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate dunning system labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningSystemsModels.DunningSystemLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId })); + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate dunning system labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningSystemsModels.DunningSystemLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId })); + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginate` + * @summary List dunning systems + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningSystemsModels.DunningSystemFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUsePaginate({ officeId })); + return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary List dunning systems + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningSystemsModels.DunningSystemFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningSystemsAcl.canUsePaginate({ officeId })); + return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create dunning system + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningSystemsModels.CreateDunningSystemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof DunningSystemsApi.create, + { officeId: string; data: DunningSystemsModels.CreateDunningSystemRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningSystemsAcl.canUseCreate({ officeId })); + return DunningSystemsApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get dunning system by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUseFindById({ officeId })); + return DunningSystemsApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update dunning system + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningSystemsModels.UpdateDunningSystemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof DunningSystemsApi.update, + { id: string; officeId: string; data: DunningSystemsModels.UpdateDunningSystemRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(DunningSystemsAcl.canUseUpdate({ officeId })); + return DunningSystemsApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive dunning system + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningSystemsAcl.canUseArchive({ officeId })); + return DunningSystemsApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive dunning system + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId })); + return DunningSystemsApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/employee/employee.acl.ts b/test/generated/base/employee/employee.acl.ts new file mode 100644 index 0000000..29c1627 --- /dev/null +++ b/test/generated/base/employee/employee.acl.ts @@ -0,0 +1,115 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmployeeAcl { + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List employees + * @param { string } object.officeId officeId from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId?: string }) => + ["Read", object ? subject("Employee", object) : "Employee"] as AbilityTuple< + "Read", + "Employee" | (ForcedSubject<"Employee"> & { officeId?: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new employee + * @param { string } object.officeId officeId from mutation data + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId?: string }) => + ["Create", object ? subject("Employee", object) : "Employee"] as AbilityTuple< + "Create", + "Employee" | (ForcedSubject<"Employee"> & { officeId?: string }) + >; + + /** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; + + /** + * Use for `useResendOnboardingWithOffice` mutation ability. For global ability, omit the object parameter. + * @description Resend employee onboarding email + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useResendOnboardingWithOffice` mutation + */ + export const canUseResendOnboardingWithOffice = (object?: { officeId: string }) => + ["Create", object ? subject("Employee", object) : "Employee"] as AbilityTuple< + "Create", + "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) + >; + + /** + * Use for `useGet` query ability. + * @description Read Office Employee + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; + + /** + * Use for `useUpdate` mutation ability. + * @description Update Office Employee + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Employee"] as AbilityTuple<"Update", "Employee">; + + /** + * Use for `useGetWithOffice` query ability. For global ability, omit the object parameter. + * @description Read Office Employee + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetWithOffice` query + */ + export const canUseGetWithOffice = (object?: { officeId: string }) => + ["Read", object ? subject("Employee", object) : "Employee"] as AbilityTuple< + "Read", + "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) + >; + + /** + * Use for `useUpdateWithOffice` mutation ability. For global ability, omit the object parameter. + * @description Update Office Employee + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateWithOffice` mutation + */ + export const canUseUpdateWithOffice = (object?: { officeId: string }) => + ["Update", object ? subject("Employee", object) : "Employee"] as AbilityTuple< + "Update", + "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) + >; + + /** + * Use for `useListRoles` query ability. + * @description List employee (global) roles + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query + */ + export const canUseListRoles = () => ["ListRoles", "Employee"] as AbilityTuple<"ListRoles", "Employee">; + + /** + * Use for `useUpdateRoles` mutation ability. + * @description Update employee (global) roles + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation + */ + export const canUseUpdateRoles = () => ["UpdateRoles", "Employee"] as AbilityTuple<"UpdateRoles", "Employee">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "Employee"] as AbilityTuple<"Archive", "Employee">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Unarchive", "Employee"] as AbilityTuple<"Unarchive", "Employee">; +} diff --git a/test/generated/base/employee/employee.api.ts b/test/generated/base/employee/employee.api.ts new file mode 100644 index 0000000..8cb33e8 --- /dev/null +++ b/test/generated/base/employee/employee.api.ts @@ -0,0 +1,237 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeModels } from "./employee.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeApi { + export const paginate = ( + limit: number, + order?: string, + populate?: EmployeeModels.EmployeePaginatePopulateParam, + filter?: EmployeeModels.EmployeeFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: EmployeeModels.EmployeePaginateResponseSchema }, `/employees`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { + type: "query", + name: "populate", + }), + filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: EmployeeModels.EmployeeCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees`, + ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), + config, + ); + }; + + export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/one-step`, + ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), + config, + ); + }; + + export const findAll = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, `/employees/labels`, { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + }); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: EmployeeModels.EmployeeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, + `/employees/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const resendOnboarding = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/employees/${employeeId}/resend-onboarding`, + undefined, + config, + ); + }; + + export const resendOnboardingWithOffice = (officeId: string, employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, + undefined, + config, + ); + }; + + export const get = ( + employeeId: string, + populate?: EmployeeModels.EmployeeGetPopulateParam, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: EmployeeModels.EmployeeResponseSchema }, `/employees/${employeeId}`, { + ...config, + params: { + populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { + type: "query", + name: "populate", + }), + }, + }); + }; + + export const update = ( + employeeId: string, + data: EmployeeModels.EmployeeUpdateRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}`, + ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), + config, + ); + }; + + export const getWithOffice = ( + officeId: string, + employeeId: string, + populate?: EmployeeModels.GetWithOfficePopulateParam, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/offices/${officeId}/employees/${employeeId}`, + { + ...config, + params: { + populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { + type: "query", + name: "populate", + }), + }, + }, + ); + }; + + export const updateWithOffice = ( + officeId: string, + employeeId: string, + data: EmployeeModels.EmployeeUpdateRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/offices/${officeId}/employees/${employeeId}`, + ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), + config, + ); + }; + + export const listRoles = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, + `/employees/${employeeId}/roles`, + config, + ); + }; + + export const updateRoles = ( + employeeId: string, + data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, + `/employees/${employeeId}/roles`, + ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), + config, + ); + }; + + export const archive = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/employee/employee.configs.ts b/test/generated/base/employee/employee.configs.ts new file mode 100644 index 0000000..d2e574e --- /dev/null +++ b/test/generated/base/employee/employee.configs.ts @@ -0,0 +1,134 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeeModels } from "./employee.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeQueries } from "./employee.queries"; +import { EmployeeAcl } from "./employee.acl"; + +export namespace EmployeeConfigs { + export const employeesConfig = { + meta: { + title: "Employees", + }, + readAll: { + acl: EmployeeAcl.canUsePaginate, + schema: EmployeeModels.EmployeeResponseSchema, + paginated: EmployeeQueries.usePaginate, + infinite: EmployeeQueries.usePaginateInfinite, + filters: { + schema: EmployeeModels.EmployeeFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeFilterDtoSchema, + options: { + inputs: { + office: true, + roles: true, + primaryOfficeId: true, + firstName: true, + lastName: true, + email: true, + ids: true, + archived: true, + search: true, + officeRole: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: EmployeeModels.EmployeeResponseSchema, + options: { + columns: { + id: true, + email: true, + firstName: true, + lastName: true, + locale: true, + phone: true, + archived: true, + primaryOfficeId: true, + primaryOffice: true, + employments: true, + roles: true, + createdAt: true, + updatedAt: true, + }, + sortable: EmployeeModels.EmployeePaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: EmployeeAcl.canUseGet, + schema: EmployeeModels.EmployeeResponseSchema, + query: EmployeeQueries.useGet, + }, + create: { + acl: EmployeeAcl.canUseCreate, + schema: EmployeeModels.EmployeeCreateRequestSchema, + mutation: EmployeeQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeCreateRequestSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + locale: true, + primaryOfficeId: true, + phone: true, + }, + }, + }), + }, + update: { + acl: EmployeeAcl.canUseUpdate, + schema: EmployeeModels.EmployeeUpdateRequestSchema, + mutation: EmployeeQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeUpdateRequestSchema, + options: { + inputs: { + firstName: true, + lastName: true, + phone: true, + locale: true, + primaryOfficeId: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: EmployeeAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: EmployeeQueries.usePaginateLabels, + infinite: EmployeeQueries.usePaginateLabelsInfinite, + filters: { + schema: EmployeeModels.EmployeeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/employee/employee.models.ts b/test/generated/base/employee/employee.models.ts new file mode 100644 index 0000000..6aa71fa --- /dev/null +++ b/test/generated/base/employee/employee.models.ts @@ -0,0 +1,325 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeModels { + /** + * EmployeeResponseSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { CommonModels.LocaleEnum } locale + * @property { string } phone Phone number + * @property { boolean } archived Archived + * @property { string } primaryOfficeId Primary office id + * @property { CommonModels.EmployeeOfficeResponse } primaryOffice Primary office + * @property { CommonModels.EmploymentResponse[] } employments Employments + * @property { CommonModels.EmployeeRoleResponse[] } roles Global Roles + * @property { string } createdAt + * @property { string } updatedAt + */ + export const EmployeeResponseSchema = z + .object({ + id: z.string().describe("Employee ID"), + email: z.email().describe("Email"), + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + locale: CommonModels.LocaleEnumSchema.nullish(), + phone: z.string().describe("Phone number").nullish(), + archived: z.boolean().describe("Archived").nullish(), + primaryOfficeId: z.string().describe("Primary office id").nullish(), + primaryOffice: CommonModels.EmployeeOfficeResponseSchema.describe("Primary office").nullish(), + employments: z.array(CommonModels.EmploymentResponseSchema).readonly().describe("Employments").nullish(), + roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type EmployeeResponse = z.infer; + + /** + * EmployeeCreateRequestSchema + * @type { object } + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { CommonModels.LocaleEnum } locale + * @property { string } primaryOfficeId Primary office ID + * @property { string } phone Phone number + */ + export const EmployeeCreateRequestSchema = z + .object({ + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + email: z.email().describe("Email"), + locale: CommonModels.LocaleEnumSchema.nullish(), + primaryOfficeId: z.string().describe("Primary office ID").nullish(), + phone: z.string().describe("Phone number").nullish(), + }) + .readonly(); + export type EmployeeCreateRequest = z.infer; + + /** + * EmployeeOneStepCreateEmploymentRequestSchema + * @type { object } + * @property { string } officeId + * @property { string[] } roleIds Array of office role IDs + */ + export const EmployeeOneStepCreateEmploymentRequestSchema = z + .object({ + officeId: z.string(), + roleIds: z.array(z.string()).readonly().describe("Array of office role IDs").nullish(), + }) + .readonly(); + export type EmployeeOneStepCreateEmploymentRequest = z.infer; + + /** + * EmployeeOneStepCreateRequestSchema + * @type { object } + * @property { CommonModels.LocaleEnum } locale + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { string } phone Phone number + * @property { string[] } roleIds Array of global role IDs + * @property { string } primaryOfficeId Primary office ID + * @property { EmployeeOneStepCreateEmploymentRequest[] } employments Employments. Min Items: `1` + */ + export const EmployeeOneStepCreateRequestSchema = z + .object({ + locale: CommonModels.LocaleEnumSchema.nullish(), + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + email: z.email().describe("Email"), + phone: z.string().describe("Phone number").nullish(), + roleIds: z.array(z.string()).readonly().describe("Array of global role IDs").nullish(), + primaryOfficeId: z.string().describe("Primary office ID").nullish(), + employments: z.array(EmployeeOneStepCreateEmploymentRequestSchema).readonly().min(1).describe("Employments"), + }) + .readonly(); + export type EmployeeOneStepCreateRequest = z.infer; + + /** + * EmployeeUpdateRequestSchema + * @type { object } + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number of the employee + * @property { CommonModels.LocaleEnum } locale + * @property { string } primaryOfficeId + */ + export const EmployeeUpdateRequestSchema = z + .object({ + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + phone: z.string().describe("Phone number of the employee"), + locale: CommonModels.LocaleEnumSchema, + primaryOfficeId: z.string(), + }) + .readonly(); + export type EmployeeUpdateRequest = z.infer; + + /** + * EmployeeFilterDtoSchema + * @type { object } + * @property { string } office Office ID (single select, offices the user has access to) + * @property { string[] } roles Role IDs (multiselect) + * @property { string } primaryOfficeId Primary office id + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { string[] } ids Ids + * @property { boolean } archived Archived + * set to true to only return archived employees + * does not return archived employees by default. Default: `false` + * @property { string } search Free text search multiple fields + * @property { string } officeRole Office role + */ + export const EmployeeFilterDtoSchema = z + .object({ + office: z.string().describe("Office ID (single select, offices the user has access to)"), + roles: z.array(z.string()).readonly().describe("Role IDs (multiselect)"), + primaryOfficeId: z.string().describe("Primary office id"), + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + email: z.string().describe("Email"), + ids: z.array(z.string()).readonly().describe("Ids"), + archived: z + .boolean() + .describe(`Archived + set to true to only return archived employees + does not return archived employees by default`) + .default(false), + search: z.string().describe("Free text search multiple fields"), + officeRole: z.string().describe("Office role"), + }) + .readonly(); + export type EmployeeFilterDto = z.infer; + + /** + * EmployeeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type EmployeeLabelFilterDto = z.infer; + + /** + * EmployeeRoleMemberResponseSchema + * @type { object } + * @property { string } roleId + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string[] } permissions Permissions associated with the role + */ + export const EmployeeRoleMemberResponseSchema = z + .object({ + roleId: z.string(), + name: z.string().describe("Name of the role"), + color: z.string().describe("Color associated with the role").nullish(), + description: z.string().describe("Description of the role").nullish(), + permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), + }) + .readonly(); + export type EmployeeRoleMemberResponse = z.infer; + + /** + * EmployeeRoleMembershipsUpdateRequestSchema + * @type { object } + * @property { string[] } roleIds Array of role IDs + */ + export const EmployeeRoleMembershipsUpdateRequestSchema = z + .object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }) + .readonly(); + export type EmployeeRoleMembershipsUpdateRequest = z.infer; + + /** + * EmployeePaginateOrderParamEnumSchema + * @type { enum } + */ + export const EmployeePaginateOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); + export type EmployeePaginateOrderParamEnum = z.infer; + export const EmployeePaginateOrderParamEnum = EmployeePaginateOrderParamEnumSchema.enum; + + /** + * EmployeePopulateFieldSchema + * @type { enum } + */ + export const EmployeePopulateFieldSchema = z.enum([ + "employments", + "primaryOffice", + "roles", + "employments.roles", + "employments.office", + ]); + export type EmployeePopulateField = z.infer; + export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; + + /** + * EmployeePaginatePopulateParamSchema + * @type { array } + */ + export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); + export type EmployeePaginatePopulateParam = z.infer; + + /** + * EmployeePaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeResponse[] } items + */ + export const EmployeePaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeeResponseSchema).readonly() }).readonly().shape, + }); + export type EmployeePaginateResponse = z.infer; + + /** + * EmployeeFindAllResponseSchema + * @type { array } + */ + export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type EmployeeFindAllResponse = z.infer; + + /** + * EmployeePaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const EmployeePaginateLabelsOrderParamEnumSchema = z.enum([ + "firstName", + "lastName", + "email", + "name", + "createdAt", + ]); + export type EmployeePaginateLabelsOrderParamEnum = z.infer; + export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderParamEnumSchema.enum; + + /** + * EmployeePaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const EmployeePaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type EmployeePaginateLabelsResponse = z.infer; + + /** + * EmployeeGetPopulateParamSchema + * @type { array } + */ + export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); + export type EmployeeGetPopulateParam = z.infer; + + /** + * GetWithOfficePopulateParamSchema + * @type { array } + */ + export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); + export type GetWithOfficePopulateParam = z.infer; + + /** + * EmployeeListRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleMemberResponse[] } items + */ + export const EmployeeListRolesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape, + }); + export type EmployeeListRolesResponse = z.infer; + + /** + * EmployeeUpdateRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleMemberResponse[] } items + */ + export const EmployeeUpdateRolesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape, + }); + export type EmployeeUpdateRolesResponse = z.infer; +} diff --git a/test/generated/base/employee/employee.queries.ts b/test/generated/base/employee/employee.queries.ts new file mode 100644 index 0000000..ab095fe --- /dev/null +++ b/test/generated/base/employee/employee.queries.ts @@ -0,0 +1,626 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeeAcl } from "./employee.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeModels } from "./employee.models"; +import { EmployeeApi } from "./employee.api"; + +export namespace EmployeeQueries { + export const moduleName = QueryModule.Employee; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + populate?: EmployeeModels.EmployeePaginatePopulateParam, + filter?: EmployeeModels.EmployeeFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/employees", limit, order, populate, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + populate?: EmployeeModels.EmployeePaginatePopulateParam, + filter?: EmployeeModels.EmployeeFilterDto, + cursor?: string, + ) => [...keys.all, "/employees", "infinite", limit, order, populate, filter, cursor] as const, + findAll: (search?: string) => [...keys.all, "/employees/labels", search] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: EmployeeModels.EmployeeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/employees/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: EmployeeModels.EmployeeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/employees/labels/paginate", "infinite", limit, order, filter, cursor] as const, + get: (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam) => + [...keys.all, "/employees/:employeeId", employeeId, populate] as const, + getWithOffice: (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam) => + [...keys.all, "/offices/:officeId/employees/:employeeId", officeId, employeeId, populate] as const, + listRoles: (employeeId: string) => [...keys.all, "/employees/:employeeId/roles", employeeId] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Employees + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter + * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + populate, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + populate?: EmployeeModels.EmployeePaginatePopulateParam; + filter?: EmployeeModels.EmployeeFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, populate, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeAcl.canUsePaginate()); + return EmployeeApi.paginate(limit, order, populate, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Employees + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter + * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + populate, + filter, + cursor, + }: { + limit: number; + order?: string; + populate?: EmployeeModels.EmployeePaginatePopulateParam; + filter?: EmployeeModels.EmployeeFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeAcl.canUsePaginate()); + return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create Employee + * @permission Requires `canUseCreate` ability + * @param { EmployeeModels.EmployeeCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmployeeAcl.canUseCreate()); + return EmployeeApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useSingeStepCreate` + * @summary Create Employee in a single step + * - requires Employee:Create for creating a global employee + * - requires Employee:Create{officeId} for creating an office employee (first office is primary) + * - requires Employment:Create{officeId} for creating office employments + * - requires Employee:UpdateRoles for setting global roles + * - requires Employee:UpdateRoles{officeId} for setting office roles + * @param { EmployeeModels.EmployeeOneStepCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useSingeStepCreate = ( + options?: AppMutationOptions< + typeof EmployeeApi.singeStepCreate, + { data: EmployeeModels.EmployeeOneStepCreateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => EmployeeApi.singeStepCreate(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindAll` + * @summary List all employees with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { search }: { search?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search), + queryFn: () => { + checkAcl(EmployeeAcl.canUseFindAll()); + return EmployeeApi.findAll(search, config); + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate employees with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: EmployeeModels.EmployeeLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeAcl.canUsePaginateLabels()); + return EmployeeApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate employees with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: EmployeeModels.EmployeeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeAcl.canUsePaginateLabels()); + return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useResendOnboarding` + * @summary Resend Employee Onboarding Email + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useResendOnboarding = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => EmployeeApi.resendOnboarding(employeeId, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useResendOnboardingWithOffice` + * @permission Requires `canUseResendOnboardingWithOffice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useResendOnboardingWithOffice = ( + options?: AppMutationOptions< + typeof EmployeeApi.resendOnboardingWithOffice, + { officeId: string; employeeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employeeId }) => { + checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId })); + return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGet` + * @summary Get Employee + * - allow global admins and office admins of primary office + * @permission Requires `canUseGet` ability + * @param { string } object.employeeId Path parameter + * @param { EmployeeModels.EmployeeGetPopulateParam } object.populate Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { employeeId, populate }: { employeeId: string; populate?: EmployeeModels.EmployeeGetPopulateParam }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(employeeId, populate), + queryFn: () => { + checkAcl(EmployeeAcl.canUseGet()); + return EmployeeApi.get(employeeId, populate, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Employee + * - allow global admins and office admins of primary office + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof EmployeeApi.update, + { employeeId: string; data: EmployeeModels.EmployeeUpdateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdate()); + return EmployeeApi.update(employeeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetWithOffice` + * @permission Requires `canUseGetWithOffice` ability + * @param { string } object.officeId Path parameter + * @param { string } object.employeeId Path parameter + * @param { EmployeeModels.GetWithOfficePopulateParam } object.populate Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetWithOffice = ( + { + officeId, + employeeId, + populate, + }: { officeId: string; employeeId: string; populate?: EmployeeModels.GetWithOfficePopulateParam }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getWithOffice(officeId, employeeId, populate), + queryFn: () => { + checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId })); + return EmployeeApi.getWithOffice(officeId, employeeId, populate, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateWithOffice` + * @permission Requires `canUseUpdateWithOffice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateWithOffice = ( + options?: AppMutationOptions< + typeof EmployeeApi.updateWithOffice, + { officeId: string; employeeId: string; data: EmployeeModels.EmployeeUpdateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId })); + return EmployeeApi.updateWithOffice(officeId, employeeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, employeeId } = variables; + const updateKeys = [keys.get(employeeId), keys.getWithOffice(officeId, employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListRoles` + * @summary List Employee (global) Roles + * @permission Requires `canUseListRoles` ability + * @param { string } object.employeeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListRoles = ( + { employeeId }: { employeeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoles(employeeId), + queryFn: () => { + checkAcl(EmployeeAcl.canUseListRoles()); + return EmployeeApi.listRoles(employeeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateRoles` + * @summary Update Employee (global) Roles + * @permission Requires `canUseUpdateRoles` ability + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeRoleMembershipsUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateRoles = ( + options?: AppMutationOptions< + typeof EmployeeApi.updateRoles, + { employeeId: string; data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdateRoles()); + return EmployeeApi.updateRoles(employeeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive Employee + * @permission Requires `canUseArchive` ability + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => { + checkAcl(EmployeeAcl.canUseArchive()); + return EmployeeApi.archive(employeeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Un-archive Employee + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => { + checkAcl(EmployeeAcl.canUseUnarchive()); + return EmployeeApi.unarchive(employeeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/employeeAccount/employeeAccount.api.ts b/test/generated/base/employeeAccount/employeeAccount.api.ts new file mode 100644 index 0000000..e4fa223 --- /dev/null +++ b/test/generated/base/employeeAccount/employeeAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { EmployeeAccountModels } from "./employeeAccount.models"; + +export namespace EmployeeAccountApi { + export const get = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, + `/employees/account`, + config, + ); + }; +} diff --git a/test/generated/base/employeeAccount/employeeAccount.models.ts b/test/generated/base/employeeAccount/employeeAccount.models.ts new file mode 100644 index 0000000..bedbc9f --- /dev/null +++ b/test/generated/base/employeeAccount/employeeAccount.models.ts @@ -0,0 +1,86 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeAccountModels { + /** + * EmployeeAccountEmploymentDtoSchema + * @type { object } + * @property { string } officeId Office ID + * @property { string } officeName Office name + */ + export const EmployeeAccountEmploymentDtoSchema = z + .object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }) + .readonly(); + export type EmployeeAccountEmploymentDto = z.infer; + + /** + * EmployeeAccountPrimaryOfficeDtoSchema + * @type { object } + * @property { string } officeId Office ID + * @property { string } officeName Office name + */ + export const EmployeeAccountPrimaryOfficeDtoSchema = z + .object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }) + .readonly(); + export type EmployeeAccountPrimaryOfficeDto = z.infer; + + /** + * EmployeeAccountRoleDtoSchema + * @type { object } + * @property { string } name Role name + * @property { string[] } permissions Role permissions + * @property { string } officeId Office ID + */ + export const EmployeeAccountRoleDtoSchema = z + .object({ + name: z.string().describe("Role name"), + permissions: z.array(z.string()).readonly().describe("Role permissions"), + officeId: z.string().describe("Office ID").nullish(), + }) + .readonly(); + export type EmployeeAccountRoleDto = z.infer; + + /** + * EmployeeAccountDtoSchema + * @type { object } + * @property { string } defaultUrl + * @property { string } costCenter + * @property { CommonModels.LocaleEnum } locale + * @property { array[] } aclRules Can hold any type of value + * @property { object } settings Employee settings keyed by setting name + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { EmployeeAccountEmploymentDto[] } employments Employments + * @property { EmployeeAccountPrimaryOfficeDto } primaryOffice Primary office + * @property { EmployeeAccountRoleDto[] } roles Roles + */ + export const EmployeeAccountDtoSchema = z + .object({ + defaultUrl: z.string().nullish(), + costCenter: z.string().nullish(), + locale: CommonModels.LocaleEnumSchema.nullish(), + aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), + settings: z + .union([ + z.object({}).catchall(z.any()).readonly(), + z.array(z.object({}).catchall(z.any()).readonly()).readonly(), + z.string(), + z.array(z.string()).readonly(), + z.array(z.number()).readonly(), + ]) + .describe("Employee settings keyed by setting name"), + id: z.string().describe("Employee ID"), + email: z.email().describe("Email"), + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + phone: z.string().describe("Phone number").nullish(), + employments: z.array(EmployeeAccountEmploymentDtoSchema).readonly().describe("Employments"), + primaryOffice: EmployeeAccountPrimaryOfficeDtoSchema.describe("Primary office"), + roles: z.array(EmployeeAccountRoleDtoSchema).readonly().describe("Roles"), + }) + .readonly(); + export type EmployeeAccountDto = z.infer; +} diff --git a/test/generated/base/employeeAccount/employeeAccount.queries.ts b/test/generated/base/employeeAccount/employeeAccount.queries.ts new file mode 100644 index 0000000..becd6e1 --- /dev/null +++ b/test/generated/base/employeeAccount/employeeAccount.queries.ts @@ -0,0 +1,32 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeAccountApi } from "./employeeAccount.api"; + +export namespace EmployeeAccountQueries { + export const moduleName = QueryModule.EmployeeAccount; + + export const keys = { + all: [moduleName] as const, + get: () => [...keys.all, "/employees/account"] as const, + }; + + /** + * Query `useGet` + * @summary Get profile of logged-in user + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.get(), + queryFn: () => EmployeeAccountApi.get(config), + ...options, + }); + }; +} diff --git a/test/generated/base/employeePermissions/employeePermissions.acl.ts b/test/generated/base/employeePermissions/employeePermissions.acl.ts new file mode 100644 index 0000000..fb09450 --- /dev/null +++ b/test/generated/base/employeePermissions/employeePermissions.acl.ts @@ -0,0 +1,15 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace EmployeePermissionsAcl { + /** + * Use for `usePaginatePermissions` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query + */ + export const canUsePaginatePermissions = () => ["Read", "Permission"] as AbilityTuple<"Read", "Permission">; + + /** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = () => ["Read", "Permission"] as AbilityTuple<"Read", "Permission">; +} diff --git a/test/generated/base/employeePermissions/employeePermissions.api.ts b/test/generated/base/employeePermissions/employeePermissions.api.ts new file mode 100644 index 0000000..1a4e180 --- /dev/null +++ b/test/generated/base/employeePermissions/employeePermissions.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; + +export namespace EmployeePermissionsApi { + export const paginatePermissions = ( + limit: number, + order?: string, + filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, + `/employees/permissions`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findAll = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, + `/employees/permissions/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + }, + ); + }; +} diff --git a/test/generated/base/employeePermissions/employeePermissions.configs.ts b/test/generated/base/employeePermissions/employeePermissions.configs.ts new file mode 100644 index 0000000..7b89c81 --- /dev/null +++ b/test/generated/base/employeePermissions/employeePermissions.configs.ts @@ -0,0 +1,44 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; +import { EmployeePermissionsQueries } from "./employeePermissions.queries"; +import { EmployeePermissionsAcl } from "./employeePermissions.acl"; + +export namespace EmployeePermissionsConfigs { + export const permissionsConfig = { + meta: { + title: "Permissions", + }, + readAll: { + acl: EmployeePermissionsAcl.canUsePaginatePermissions, + schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, + paginated: EmployeePermissionsQueries.usePaginatePermissions, + infinite: EmployeePermissionsQueries.usePaginatePermissionsInfinite, + filters: { + schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, + options: { + inputs: { + context: true, + ids: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, + options: { + columns: { + id: true, + label: true, + group: true, + description: true, + context: true, + }, + sortable: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/employeePermissions/employeePermissions.models.ts b/test/generated/base/employeePermissions/employeePermissions.models.ts new file mode 100644 index 0000000..08a273a --- /dev/null +++ b/test/generated/base/employeePermissions/employeePermissions.models.ts @@ -0,0 +1,74 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeePermissionsModels { + /** + * EmployeePermissionResponseSchema + * @type { object } + * @property { string } id Employee Permission unique identifier + * @property { string } label + * @property { string } group + * @property { string } description + * @property { string } context Scope where this rule is applied + */ + export const EmployeePermissionResponseSchema = z + .object({ + id: z.string().describe("Employee Permission unique identifier"), + label: z.string(), + group: z.string(), + description: z.string().nullish(), + context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), + }) + .readonly(); + export type EmployeePermissionResponse = z.infer; + + /** + * EmployeePermissionFilterDtoSchema + * @type { object } + * @property { string } context Role context + * @property { string[] } ids Ids + */ + export const EmployeePermissionFilterDtoSchema = z + .object({ + context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), + ids: z.array(z.string()).readonly().describe("Ids"), + }) + .readonly(); + export type EmployeePermissionFilterDto = z.infer; + + /** + * EmployeePermissionsPaginatePermissionsOrderParamEnumSchema + * @type { enum } + */ + export const EmployeePermissionsPaginatePermissionsOrderParamEnumSchema = z.enum(["id"]); + export type EmployeePermissionsPaginatePermissionsOrderParamEnum = z.infer< + typeof EmployeePermissionsPaginatePermissionsOrderParamEnumSchema + >; + export const EmployeePermissionsPaginatePermissionsOrderParamEnum = + EmployeePermissionsPaginatePermissionsOrderParamEnumSchema.enum; + + /** + * EmployeePermissionsPaginatePermissionsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeePermissionResponse[] } items + */ + export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeePermissionResponseSchema).readonly() }).readonly().shape, + }); + export type EmployeePermissionsPaginatePermissionsResponse = z.infer< + typeof EmployeePermissionsPaginatePermissionsResponseSchema + >; + + /** + * EmployeePermissionsFindAllResponseSchema + * @type { array } + */ + export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type EmployeePermissionsFindAllResponse = z.infer; +} diff --git a/test/generated/base/employeePermissions/employeePermissions.queries.ts b/test/generated/base/employeePermissions/employeePermissions.queries.ts new file mode 100644 index 0000000..cd0f4ae --- /dev/null +++ b/test/generated/base/employeePermissions/employeePermissions.queries.ts @@ -0,0 +1,141 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeePermissionsAcl } from "./employeePermissions.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; +import { EmployeePermissionsApi } from "./employeePermissions.api"; + +export namespace EmployeePermissionsQueries { + export const moduleName = QueryModule.EmployeePermissions; + + export const keys = { + all: [moduleName] as const, + paginatePermissions: ( + limit?: number, + order?: string, + filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/employees/permissions", limit, order, filter, page, cursor] as const, + paginatePermissionsInfinite: ( + limit?: number, + order?: string, + filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, + cursor?: string, + ) => [...keys.all, "/employees/permissions", "infinite", limit, order, filter, cursor] as const, + findAll: (search?: string) => [...keys.all, "/employees/permissions/labels", search] as const, + }; + + /** + * Query `usePaginatePermissions` + * @permission Requires `canUsePaginatePermissions` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` + * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginatePermissions = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: EmployeePermissionsModels.EmployeePermissionFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginatePermissionsInfinite + * @permission Requires `canUsePaginatePermissions` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` + * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginatePermissionsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { + limit: number; + order?: string; + filter?: EmployeePermissionsModels.EmployeePermissionFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindAll` + * @summary List all permissions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { search }: { search?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search), + queryFn: () => { + checkAcl(EmployeePermissionsAcl.canUseFindAll()); + return EmployeePermissionsApi.findAll(search, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/employeeProfile/employeeProfile.api.ts b/test/generated/base/employeeProfile/employeeProfile.api.ts new file mode 100644 index 0000000..868a30c --- /dev/null +++ b/test/generated/base/employeeProfile/employeeProfile.api.ts @@ -0,0 +1,26 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeProfileModels } from "./employeeProfile.models"; + +export namespace EmployeeProfileApi { + export const getProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, + `/employee-profile`, + config, + ); + }; + + export const updateProfile = ( + data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, + `/employee-profile`, + ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/employeeProfile/employeeProfile.models.ts b/test/generated/base/employeeProfile/employeeProfile.models.ts new file mode 100644 index 0000000..019ef91 --- /dev/null +++ b/test/generated/base/employeeProfile/employeeProfile.models.ts @@ -0,0 +1,52 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeProfileModels { + /** + * EmployeeProfileResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } firstName Employee first name + * @property { string } lastName Employee last name + * @property { string } email Employee email + * @property { string } phone Employee phone number + * @property { string } defaultUrl Employee default URL + * @property { CommonModels.LocaleEnum } locale Employee locale + */ + export const EmployeeProfileResponseDTOSchema = z + .object({ + id: z.string(), + firstName: z.string().describe("Employee first name"), + lastName: z.string().describe("Employee last name"), + email: z.string().describe("Employee email"), + phone: z.string().describe("Employee phone number").nullish(), + defaultUrl: z.string().describe("Employee default URL").nullish(), + locale: CommonModels.LocaleEnumSchema.describe("Employee locale").nullish(), + }) + .readonly(); + export type EmployeeProfileResponseDTO = z.infer; + + /** + * UpdateEmployeeProfileRequestDTOSchema + * @type { object } + * @property { string } firstName Employee first name. Example: `John` + * @property { string } lastName Employee last name. Example: `Doe` + * @property { string } email Employee email address. Example: `john.doe@example.com` + * @property { string } phone Employee phone number. Example: `+1234567890` + * @property { string } defaultUrl Default URL for the employee profile. Example: `https://example.com` + * @property { string } costCenter Employee cost center + * @property { CommonModels.LocaleEnum } locale Employee locale preference. Example: `en-US` + */ + export const UpdateEmployeeProfileRequestDTOSchema = z + .object({ + firstName: z.string().describe("Employee first name"), + lastName: z.string().describe("Employee last name"), + email: z.email().describe("Employee email address"), + phone: z.string().describe("Employee phone number"), + defaultUrl: z.url().describe("Default URL for the employee profile"), + costCenter: z.string().describe("Employee cost center"), + locale: CommonModels.LocaleEnumSchema.describe("Employee locale preference"), + }) + .readonly(); + export type UpdateEmployeeProfileRequestDTO = z.infer; +} diff --git a/test/generated/base/employeeProfile/employeeProfile.queries.ts b/test/generated/base/employeeProfile/employeeProfile.queries.ts new file mode 100644 index 0000000..9d9e747 --- /dev/null +++ b/test/generated/base/employeeProfile/employeeProfile.queries.ts @@ -0,0 +1,63 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeProfileModels } from "./employeeProfile.models"; +import { EmployeeProfileApi } from "./employeeProfile.api"; + +export namespace EmployeeProfileQueries { + export const moduleName = QueryModule.EmployeeProfile; + + export const keys = { + all: [moduleName] as const, + getProfile: () => [...keys.all, "/employee-profile"] as const, + }; + + /** + * Query `useGetProfile` + * @summary Get employee profile + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetProfile = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getProfile(), + queryFn: () => EmployeeProfileApi.getProfile(config), + ...options, + }); + }; + + /** + * Mutation `useUpdateProfile` + * @summary Update employee profile + * @param { EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateProfile = ( + options?: AppMutationOptions< + typeof EmployeeProfileApi.updateProfile, + { data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => EmployeeProfileApi.updateProfile(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.getProfile()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/employeeRoles/employeeRoles.acl.ts b/test/generated/base/employeeRoles/employeeRoles.acl.ts new file mode 100644 index 0000000..79b4ce6 --- /dev/null +++ b/test/generated/base/employeeRoles/employeeRoles.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmployeeRolesAcl { + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List all possible roles + * @param { string } object.context context from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { context?: string }) => + ["Read", object ? subject("Role", object) : "Role"] as AbilityTuple< + "Read", + "Role" | (ForcedSubject<"Role"> & { context?: string }) + >; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Role"] as AbilityTuple<"Create", "Role">; + + /** + * Use for `useLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLabels` query + */ + export const canUseLabels = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; + + /** + * Use for `useFind` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query + */ + export const canUseFind = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Role"] as AbilityTuple<"Update", "Role">; + + /** + * Use for `useDeleteEmployeesRolesByRoleId` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteEmployeesRolesByRoleId` mutation + */ + export const canUseDeleteEmployeesRolesByRoleId = () => ["Delete", "Role"] as AbilityTuple<"Delete", "Role">; + + /** + * Use for `usePaginatePermissions` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query + */ + export const canUsePaginatePermissions = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; + + /** + * Use for `useTogglePermission` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTogglePermission` mutation + */ + export const canUseTogglePermission = () => ["Update", "Role"] as AbilityTuple<"Update", "Role">; + + /** + * Use for `useCopy` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopy` mutation + */ + export const canUseCopy = () => ["Create", "Role"] as AbilityTuple<"Create", "Role">; +} diff --git a/test/generated/base/employeeRoles/employeeRoles.api.ts b/test/generated/base/employeeRoles/employeeRoles.api.ts new file mode 100644 index 0000000..52f5e62 --- /dev/null +++ b/test/generated/base/employeeRoles/employeeRoles.api.ts @@ -0,0 +1,127 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeRolesApi { + export const list = ( + limit: number, + order?: string, + filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, `/employees/roles`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), + config, + ); + }; + + export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: EmployeeRolesModels.LabelsResponseSchema }, `/employees/roles/labels`, { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { + type: "query", + name: "context", + }), + }, + }); + }; + + export const find = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}`, + config, + ); + }; + + export const update = ( + roleId: string, + data: EmployeeRolesModels.EmployeeRoleUpdateRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), + config, + ); + }; + + export const deleteEmployeesRolesByRoleId = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/employees/roles/${roleId}`, + undefined, + config, + ); + }; + + export const paginatePermissions = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, + `/employees/roles/${roleId}/permissions`, + config, + ); + }; + + export const togglePermission = ( + roleId: string, + permission: string, + data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/employees/roles/${roleId}/permissions/${permission}/toggle`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), + config, + ); + }; + + export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}/copy`, + ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/employeeRoles/employeeRoles.configs.ts b/test/generated/base/employeeRoles/employeeRoles.configs.ts new file mode 100644 index 0000000..56a73dd --- /dev/null +++ b/test/generated/base/employeeRoles/employeeRoles.configs.ts @@ -0,0 +1,89 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeRolesQueries } from "./employeeRoles.queries"; +import { EmployeeRolesAcl } from "./employeeRoles.acl"; + +export namespace EmployeeRolesConfigs { + export const rolesConfig = { + meta: { + title: "Roles", + }, + readAll: { + acl: EmployeeRolesAcl.canUseList, + schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, + paginated: EmployeeRolesQueries.useList, + infinite: EmployeeRolesQueries.useListInfinite, + filters: { + schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, + options: { + inputs: { + name: true, + context: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, + options: { + columns: { + id: true, + name: true, + color: true, + description: true, + context: true, + permissions: true, + numberOfUsers: true, + }, + sortable: EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: EmployeeRolesAcl.canUseFind, + schema: CommonModels.EmployeeRoleResponseSchema, + query: EmployeeRolesQueries.useFind, + }, + create: { + acl: EmployeeRolesAcl.canUseCreate, + schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, + mutation: EmployeeRolesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, + options: { + inputs: { + name: true, + color: true, + description: true, + context: true, + permissions: true, + }, + }, + }), + }, + update: { + acl: EmployeeRolesAcl.canUseUpdate, + schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, + mutation: EmployeeRolesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, + options: { + inputs: { + name: true, + color: true, + description: true, + }, + }, + }), + }, + delete: { + acl: EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId, + mutation: EmployeeRolesQueries.useDeleteEmployeesRolesByRoleId, + }, + }; +} diff --git a/test/generated/base/employeeRoles/employeeRoles.models.ts b/test/generated/base/employeeRoles/employeeRoles.models.ts new file mode 100644 index 0000000..ee2459c --- /dev/null +++ b/test/generated/base/employeeRoles/employeeRoles.models.ts @@ -0,0 +1,175 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeRolesModels { + /** + * EmployeeRoleListItemResponseSchema + * @type { object } + * @property { string } id Unique identifier of the role + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string } context Role context + * @property { string[] } permissions Permissions associated with the role + * @property { number } numberOfUsers Number of users associated with the role + */ + export const EmployeeRoleListItemResponseSchema = z + .object({ + id: z.string().describe("Unique identifier of the role"), + name: z.string().describe("Name of the role"), + color: z.string().describe("Color associated with the role").nullish(), + description: z.string().describe("Description of the role").nullish(), + context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), + permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), + numberOfUsers: z.number().describe("Number of users associated with the role"), + }) + .readonly(); + export type EmployeeRoleListItemResponse = z.infer; + + /** + * EmployeeRolePaginationFilterDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } context Role context + * @property { string } search + */ + export const EmployeeRolePaginationFilterDtoSchema = z + .object({ + name: z.string().describe("Name"), + context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), + search: z.string(), + }) + .readonly(); + export type EmployeeRolePaginationFilterDto = z.infer; + + /** + * EmployeeRoleCreateRequestSchema + * @type { object } + * @property { string } name Name of the role + * @property { string } color Color of the role + * @property { string } description Color of the role + * @property { string } context Role context + * - office or global + * @property { string[] } permissions Permission IDs associated with the role + * can only be either office or global. Default: `` + */ + export const EmployeeRoleCreateRequestSchema = z + .object({ + name: z.string().describe("Name of the role"), + color: z.string().describe("Color of the role"), + description: z.string().describe("Color of the role").nullish(), + context: CommonModels.EmployeeRoleContextSchema.describe(`Role context + - office or global`), + permissions: z + .array(z.string()) + .readonly() + .describe(`Permission IDs associated with the role + can only be either office or global`) + .default([]), + }) + .readonly(); + export type EmployeeRoleCreateRequest = z.infer; + + /** + * EmployeeRolePermissionDtoSchema + * @type { object } + * @property { string } id Employee Permission unique identifier + * @property { string } label + * @property { string } group + * @property { string } description + * @property { string } context Scope where this rule is applied + * @property { boolean } enabled + */ + export const EmployeeRolePermissionDtoSchema = z + .object({ + id: z.string().describe("Employee Permission unique identifier"), + label: z.string(), + group: z.string(), + description: z.string().nullish(), + context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), + enabled: z.boolean(), + }) + .readonly(); + export type EmployeeRolePermissionDto = z.infer; + + /** + * EmployeeRoleUpdateRequestSchema + * @type { object } + * @property { string } name Role Id + * @property { string } color Role Color + * @property { string } description Role Description + */ + export const EmployeeRoleUpdateRequestSchema = z + .object({ + name: z.string().describe("Role Id"), + color: z.string().describe("Role Color"), + description: z.string().describe("Role Description"), + }) + .readonly(); + export type EmployeeRoleUpdateRequest = z.infer; + + /** + * EmployeeRoleTogglePermissionRequestSchema + * @type { object } + * @property { boolean } toggled Turn the permission on or off + */ + export const EmployeeRoleTogglePermissionRequestSchema = z + .object({ toggled: z.boolean().describe("Turn the permission on or off") }) + .readonly(); + export type EmployeeRoleTogglePermissionRequest = z.infer; + + /** + * CopyEmployeeRoleDtoSchema + * @type { object } + * @property { string } newRoleName + */ + export const CopyEmployeeRoleDtoSchema = z.object({ newRoleName: z.string() }).readonly(); + export type CopyEmployeeRoleDto = z.infer; + + /** + * EmployeeRolesListOrderParamEnumSchema + * @type { enum } + */ + export const EmployeeRolesListOrderParamEnumSchema = z.enum(["name", "numberOfUsers"]); + export type EmployeeRolesListOrderParamEnum = z.infer; + export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSchema.enum; + + /** + * EmployeeRolesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleListItemResponse[] } items + */ + export const EmployeeRolesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).readonly() }).readonly().shape, + }); + export type EmployeeRolesListResponse = z.infer; + + /** + * LabelsResponseSchema + * @type { array } + */ + export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type LabelsResponse = z.infer; + + /** + * EmployeeRolesPaginatePermissionsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRolePermissionDto[] } items + */ + export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).readonly() }).readonly().shape, + }); + export type EmployeeRolesPaginatePermissionsResponse = z.infer; +} diff --git a/test/generated/base/employeeRoles/employeeRoles.queries.ts b/test/generated/base/employeeRoles/employeeRoles.queries.ts new file mode 100644 index 0000000..68a5d1e --- /dev/null +++ b/test/generated/base/employeeRoles/employeeRoles.queries.ts @@ -0,0 +1,368 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeeRolesAcl } from "./employeeRoles.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeRolesApi } from "./employeeRoles.api"; + +export namespace EmployeeRolesQueries { + export const moduleName = QueryModule.EmployeeRoles; + + export const keys = { + all: [moduleName] as const, + list: ( + limit?: number, + order?: string, + filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/employees/roles", limit, order, filter, page, cursor] as const, + listInfinite: ( + limit?: number, + order?: string, + filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/employees/roles", "infinite", limit, order, filter, cursor] as const, + labels: (search?: string, context?: CommonModels.EmployeeRoleContext) => + [...keys.all, "/employees/roles/labels", search, context] as const, + find: (roleId: string) => [...keys.all, "/employees/roles/:roleId", roleId] as const, + paginatePermissions: (roleId: string) => [...keys.all, "/employees/roles/:roleId/permissions", roleId] as const, + }; + + /** + * Query `useList` + * @summary Paginate Employee Role Definitions + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` + * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseList()); + return EmployeeRolesApi.list(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary Paginate Employee Role Definitions + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` + * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeRolesAcl.canUseList()); + return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create Employee Role Definition + * @permission Requires `canUseCreate` ability + * @param { EmployeeRolesModels.EmployeeRoleCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof EmployeeRolesApi.create, + { data: EmployeeRolesModels.EmployeeRoleCreateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmployeeRolesAcl.canUseCreate()); + return EmployeeRolesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useLabels` + * @summary List all employee roles with only their labels + * @permission Requires `canUseLabels` ability + * @param { string } object.search Query parameter + * @param { CommonModels.EmployeeRoleContext } object.context Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useLabels = ( + { search, context }: { search?: string; context?: CommonModels.EmployeeRoleContext }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.labels(search, context), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseLabels()); + return EmployeeRolesApi.labels(search, context, config); + }, + ...options, + }); + }; + + /** + * Query `useFind` + * @summary Get Employee Role Definition + * @permission Requires `canUseFind` ability + * @param { string } object.roleId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFind = ( + { roleId }: { roleId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.find(roleId), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseFind()); + return EmployeeRolesApi.find(roleId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Employee Role Definition + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.roleId Path parameter + * @param { EmployeeRolesModels.EmployeeRoleUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof EmployeeRolesApi.update, + { roleId: string; data: EmployeeRolesModels.EmployeeRoleUpdateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, data }) => { + checkAcl(EmployeeRolesAcl.canUseUpdate()); + return EmployeeRolesApi.update(roleId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { roleId } = variables; + const updateKeys = [keys.find(roleId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteEmployeesRolesByRoleId` + * @summary Delete Employee Role Definition + * @permission Requires `canUseDeleteEmployeesRolesByRoleId` ability + * @param { string } mutation.roleId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteEmployeesRolesByRoleId = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId }) => { + checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); + return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginatePermissions` + * @summary Get All Employee Role Definition Permissions + * - convenience endpoint to expand the permissions of a role + * - only returns the enabled permissions + * @permission Requires `canUsePaginatePermissions` ability + * @param { string } object.roleId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginatePermissions = ( + { roleId }: { roleId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginatePermissions(roleId), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); + return EmployeeRolesApi.paginatePermissions(roleId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useTogglePermission` + * @summary Toggle Employee Role Definition Permission + * @permission Requires `canUseTogglePermission` ability + * @param { string } mutation.roleId Path parameter + * @param { string } mutation.permission Path parameter + * @param { EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useTogglePermission = ( + options?: AppMutationOptions< + typeof EmployeeRolesApi.togglePermission, + { roleId: string; permission: string; data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, permission, data }) => { + checkAcl(EmployeeRolesAcl.canUseTogglePermission()); + return EmployeeRolesApi.togglePermission(roleId, permission, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCopy` + * @summary Copy Employee Role Definition + * @permission Requires `canUseCopy` ability + * @param { string } mutation.roleId Path parameter + * @param { EmployeeRolesModels.CopyEmployeeRoleDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCopy = ( + options?: AppMutationOptions< + typeof EmployeeRolesApi.copy, + { roleId: string; data: EmployeeRolesModels.CopyEmployeeRoleDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, data }) => { + checkAcl(EmployeeRolesAcl.canUseCopy()); + return EmployeeRolesApi.copy(roleId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { roleId } = variables; + const updateKeys = [keys.find(roleId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/employeeSettings/employeeSettings.api.ts b/test/generated/base/employeeSettings/employeeSettings.api.ts new file mode 100644 index 0000000..6035a86 --- /dev/null +++ b/test/generated/base/employeeSettings/employeeSettings.api.ts @@ -0,0 +1,28 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeSettingsModels } from "./employeeSettings.models"; + +export namespace EmployeeSettingsApi { + export const getAll = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, + `/employees/settings`, + config, + ); + }; + + export const update = ( + key: string, + data: EmployeeSettingsModels.UpdateEmployeeSettingDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/employees/settings/${key}`, + ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/employeeSettings/employeeSettings.models.ts b/test/generated/base/employeeSettings/employeeSettings.models.ts new file mode 100644 index 0000000..7614af9 --- /dev/null +++ b/test/generated/base/employeeSettings/employeeSettings.models.ts @@ -0,0 +1,44 @@ +import { z } from "zod"; + +export namespace EmployeeSettingsModels { + /** + * EmployeeSettingsResponseDtoSchema + * @type { object } + * @property { object } settings Map of all settings for the employee + */ + export const EmployeeSettingsResponseDtoSchema = z + .object({ + settings: z + .union([ + z.object({}).catchall(z.any()).readonly(), + z.array(z.object({}).catchall(z.any()).readonly()).readonly(), + z.string(), + z.array(z.string()).readonly(), + z.array(z.number()).readonly(), + ]) + .describe("Map of all settings for the employee"), + }) + .readonly(); + export type EmployeeSettingsResponseDto = z.infer; + + /** + * UpdateEmployeeSettingDtoSchema + * @type { object } + * @property { object } value The value to store for the setting. If null, the setting will be deleted. + */ + export const UpdateEmployeeSettingDtoSchema = z + .object({ + value: z + .union([ + z.object({}).catchall(z.any()).readonly(), + z.array(z.unknown()).readonly(), + z.string(), + z.number(), + z.boolean(), + ]) + .describe("The value to store for the setting. If null, the setting will be deleted.") + .nullable(), + }) + .readonly(); + export type UpdateEmployeeSettingDto = z.infer; +} diff --git a/test/generated/base/employeeSettings/employeeSettings.queries.ts b/test/generated/base/employeeSettings/employeeSettings.queries.ts new file mode 100644 index 0000000..7aff1c3 --- /dev/null +++ b/test/generated/base/employeeSettings/employeeSettings.queries.ts @@ -0,0 +1,63 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeSettingsModels } from "./employeeSettings.models"; +import { EmployeeSettingsApi } from "./employeeSettings.api"; + +export namespace EmployeeSettingsQueries { + export const moduleName = QueryModule.EmployeeSettings; + + export const keys = { + all: [moduleName] as const, + getAll: () => [...keys.all, "/employees/settings"] as const, + }; + + /** + * Query `useGetAll` + * @summary Get all employee settings + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetAll = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getAll(), + queryFn: () => EmployeeSettingsApi.getAll(config), + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update employee setting + * @param { string } mutation.key Path parameter + * @param { EmployeeSettingsModels.UpdateEmployeeSettingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof EmployeeSettingsApi.update, + { key: string; data: EmployeeSettingsModels.UpdateEmployeeSettingDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ key, data }) => EmployeeSettingsApi.update(key, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/employment/employment.acl.ts b/test/generated/base/employment/employment.acl.ts new file mode 100644 index 0000000..f842629 --- /dev/null +++ b/test/generated/base/employment/employment.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmploymentAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create new employment + * @param { string } object.officeId officeId from mutation data + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "Create", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; + + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List employments + * @param { string } object.officeId officeId from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId?: string }) => + ["Read", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "Read", + "Employment" | (ForcedSubject<"Employment"> & { officeId?: string }) + >; + + /** + * Use for `useListRoles` query ability. For global ability, omit the object parameter. + * @description List employment roles + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query + */ + export const canUseListRoles = (object?: { officeId: string }) => + ["ListRoles", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "ListRoles", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; + + /** + * Use for `useUpdateRoles` mutation ability. For global ability, omit the object parameter. + * @description Update employment roles + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation + */ + export const canUseUpdateRoles = (object?: { officeId: string }) => + ["UpdateRoles", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "UpdateRoles", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Create", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "Create", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "Archive", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Unarchive", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "Unarchive", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; +} diff --git a/test/generated/base/employment/employment.api.ts b/test/generated/base/employment/employment.api.ts new file mode 100644 index 0000000..022120c --- /dev/null +++ b/test/generated/base/employment/employment.api.ts @@ -0,0 +1,112 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; +import { EmploymentModels } from "./employment.models"; + +export namespace EmploymentApi { + export const create = (data: EmploymentModels.EmploymentCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/employees/employments`, + ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), + config, + ); + }; + + export const list = ( + limit: number, + order?: string, + populate?: EmploymentModels.EmploymentListPopulateParam, + filter?: EmploymentModels.EmploymentFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: EmploymentModels.EmploymentListResponseSchema }, `/employees/employments`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { + type: "query", + name: "populate", + }), + filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const listRoles = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/roles`, + config, + ); + }; + + export const updateRoles = ( + officeId: string, + employmentId: string, + data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/roles`, + ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), + config, + ); + }; + + export const update = ( + officeId: string, + employmentId: string, + data: EmploymentModels.UpdateEmploymentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}`, + ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), + config, + ); + }; + + export const archive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/employment/employment.configs.ts b/test/generated/base/employment/employment.configs.ts new file mode 100644 index 0000000..b1b2136 --- /dev/null +++ b/test/generated/base/employment/employment.configs.ts @@ -0,0 +1,62 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { EmploymentModels } from "./employment.models"; +import { EmploymentQueries } from "./employment.queries"; +import { EmploymentAcl } from "./employment.acl"; + +export namespace EmploymentConfigs { + export const employmentsConfig = { + meta: { + title: "Employments", + }, + readAll: { + acl: EmploymentAcl.canUseList, + schema: CommonModels.EmploymentResponseSchema, + paginated: EmploymentQueries.useList, + infinite: EmploymentQueries.useListInfinite, + filters: { + schema: EmploymentModels.EmploymentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmploymentModels.EmploymentFilterDtoSchema, + options: { + inputs: { + officeId: true, + employeeId: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.EmploymentResponseSchema, + options: { + columns: { + id: true, + officeId: true, + office: true, + employeeId: true, + employee: true, + archived: true, + costCenter: true, + roles: true, + }, + sortable: EmploymentModels.EmploymentListOrderParamEnumSchema, + }, + }), + }, + create: { + acl: EmploymentAcl.canUseCreate, + schema: EmploymentModels.EmploymentCreateRequestSchema, + mutation: EmploymentQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmploymentModels.EmploymentCreateRequestSchema, + options: { + inputs: { + officeId: true, + employeeId: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/base/employment/employment.models.ts b/test/generated/base/employment/employment.models.ts new file mode 100644 index 0000000..ceba63b --- /dev/null +++ b/test/generated/base/employment/employment.models.ts @@ -0,0 +1,139 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmploymentModels { + /** + * EmploymentCreateRequestSchema + * @type { object } + * @property { string } officeId + * @property { string } employeeId + */ + export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }).readonly(); + export type EmploymentCreateRequest = z.infer; + + /** + * EmploymentFilterDtoSchema + * @type { object } + * @property { string } officeId Office IDs + * @property { string } employeeId Employee IDs + */ + export const EmploymentFilterDtoSchema = z + .object({ officeId: z.string().describe("Office IDs"), employeeId: z.string().describe("Employee IDs") }) + .readonly(); + export type EmploymentFilterDto = z.infer; + + /** + * EmploymentRoleMemberResponseSchema + * @type { object } + * @property { string } roleId + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string[] } permissions Permissions associated with the role + */ + export const EmploymentRoleMemberResponseSchema = z + .object({ + roleId: z.string(), + name: z.string().describe("Name of the role"), + color: z.string().describe("Color associated with the role").nullish(), + description: z.string().describe("Description of the role").nullish(), + permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), + }) + .readonly(); + export type EmploymentRoleMemberResponse = z.infer; + + /** + * EmploymentRoleMembershipsUpdateRequestSchema + * @type { object } + * @property { string[] } roleIds Array of role IDs + */ + export const EmploymentRoleMembershipsUpdateRequestSchema = z + .object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }) + .readonly(); + export type EmploymentRoleMembershipsUpdateRequest = z.infer; + + /** + * UpdateEmploymentRequestDtoSchema + * @type { object } + * @property { string } costCenter + * @property { string[] } roleIds + */ + export const UpdateEmploymentRequestDtoSchema = z + .object({ costCenter: z.string(), roleIds: z.array(z.string()).readonly() }) + .readonly(); + export type UpdateEmploymentRequestDto = z.infer; + + /** + * EmploymentListOrderParamEnumSchema + * @type { enum } + */ + export const EmploymentListOrderParamEnumSchema = z.enum(["officeId", "createdAt"]); + export type EmploymentListOrderParamEnum = z.infer; + export const EmploymentListOrderParamEnum = EmploymentListOrderParamEnumSchema.enum; + + /** + * EmploymentPaginationPopulateFieldsSchema + * @type { enum } + */ + export const EmploymentPaginationPopulateFieldsSchema = z.enum(["office", "employee"]); + export type EmploymentPaginationPopulateFields = z.infer; + export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFieldsSchema.enum; + + /** + * EmploymentListPopulateParamSchema + * @type { array } + */ + export const EmploymentListPopulateParamSchema = z + .array(EmploymentPaginationPopulateFieldsSchema) + .readonly() + .nullish(); + export type EmploymentListPopulateParam = z.infer; + + /** + * EmploymentListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.EmploymentResponse[] } items + */ + export const EmploymentListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.EmploymentResponseSchema).readonly() }).readonly().shape, + }); + export type EmploymentListResponse = z.infer; + + /** + * EmploymentListRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmploymentRoleMemberResponse[] } items + */ + export const EmploymentListRolesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape, + }); + export type EmploymentListRolesResponse = z.infer; + + /** + * EmploymentUpdateRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmploymentRoleMemberResponse[] } items + */ + export const EmploymentUpdateRolesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape, + }); + export type EmploymentUpdateRolesResponse = z.infer; +} diff --git a/test/generated/base/employment/employment.queries.ts b/test/generated/base/employment/employment.queries.ts new file mode 100644 index 0000000..c0e6627 --- /dev/null +++ b/test/generated/base/employment/employment.queries.ts @@ -0,0 +1,315 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmploymentAcl } from "./employment.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmploymentModels } from "./employment.models"; +import { EmploymentApi } from "./employment.api"; + +export namespace EmploymentQueries { + export const moduleName = QueryModule.Employment; + + export const keys = { + all: [moduleName] as const, + list: ( + limit?: number, + order?: string, + populate?: EmploymentModels.EmploymentListPopulateParam, + filter?: EmploymentModels.EmploymentFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/employees/employments", limit, order, populate, filter, page, cursor] as const, + listInfinite: ( + limit?: number, + order?: string, + populate?: EmploymentModels.EmploymentListPopulateParam, + filter?: EmploymentModels.EmploymentFilterDto, + cursor?: string, + ) => [...keys.all, "/employees/employments", "infinite", limit, order, populate, filter, cursor] as const, + listRoles: (officeId: string, employmentId: string) => + [...keys.all, "/offices/:officeId/employments/:employmentId/roles", officeId, employmentId] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create new employment + * @permission Requires `canUseCreate` ability + * @param { EmploymentModels.EmploymentCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmploymentAcl.canUseCreate()); + return EmploymentApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useList` + * @summary List Employments + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` + * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter + * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + limit, + order, + populate, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + populate?: EmploymentModels.EmploymentListPopulateParam; + filter?: EmploymentModels.EmploymentFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, populate, filter, page, cursor), + queryFn: () => { + checkAcl(EmploymentAcl.canUseList()); + return EmploymentApi.list(limit, order, populate, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List Employments + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` + * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter + * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + limit, + order, + populate, + filter, + cursor, + }: { + limit: number; + order?: string; + populate?: EmploymentModels.EmploymentListPopulateParam; + filter?: EmploymentModels.EmploymentFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, populate, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmploymentAcl.canUseList()); + return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useListRoles` + * @summary List Employments Roles + * @permission Requires `canUseListRoles` ability + * @param { string } object.officeId Path parameter + * @param { string } object.employmentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListRoles = ( + { officeId, employmentId }: { officeId: string; employmentId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoles(officeId, employmentId), + queryFn: () => { + checkAcl(EmploymentAcl.canUseListRoles({ officeId })); + return EmploymentApi.listRoles(officeId, employmentId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateRoles` + * @summary Update Employment Roles + * @permission Requires `canUseUpdateRoles` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { EmploymentModels.EmploymentRoleMembershipsUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateRoles = ( + options?: AppMutationOptions< + typeof EmploymentApi.updateRoles, + { officeId: string; employmentId: string; data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId, data }) => { + checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId })); + return EmploymentApi.updateRoles(officeId, employmentId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdate` + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { EmploymentModels.UpdateEmploymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof EmploymentApi.update, + { officeId: string; employmentId: string; data: EmploymentModels.UpdateEmploymentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId, data }) => { + checkAcl(EmploymentAcl.canUseUpdate({ officeId })); + return EmploymentApi.update(officeId, employmentId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive Employment + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId }) => { + checkAcl(EmploymentAcl.canUseArchive({ officeId })); + return EmploymentApi.archive(officeId, employmentId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Un-archive Employment + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId }) => { + checkAcl(EmploymentAcl.canUseUnarchive({ officeId })); + return EmploymentApi.unarchive(officeId, employmentId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/factoringExport/factoringExport.acl.ts b/test/generated/base/factoringExport/factoringExport.acl.ts new file mode 100644 index 0000000..b4cf272 --- /dev/null +++ b/test/generated/base/factoringExport/factoringExport.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace FactoringExportAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create factoring export + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< + "Create", + "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) + >; + + /** + * Use for `useGetBatch` query ability. For global ability, omit the object parameter. + * @description Read factoring export + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query + */ + export const canUseGetBatch = (object?: { officeId: string }) => + ["Read", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< + "Read", + "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) + >; +} diff --git a/test/generated/base/factoringExport/factoringExport.api.ts b/test/generated/base/factoringExport/factoringExport.api.ts new file mode 100644 index 0000000..a1f1749 --- /dev/null +++ b/test/generated/base/factoringExport/factoringExport.api.ts @@ -0,0 +1,27 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { FactoringExportModels } from "./factoringExport.models"; + +export namespace FactoringExportApi { + export const create = ( + officeId: string, + data: FactoringExportModels.CreateFactoringExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-exports`, + ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), + config, + ); + }; + + export const getBatch = (batchId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-exports/${batchId}`, + config, + ); + }; +} diff --git a/test/generated/base/factoringExport/factoringExport.models.ts b/test/generated/base/factoringExport/factoringExport.models.ts new file mode 100644 index 0000000..3b5ef07 --- /dev/null +++ b/test/generated/base/factoringExport/factoringExport.models.ts @@ -0,0 +1,61 @@ +import { z } from "zod"; + +export namespace FactoringExportModels { + /** + * FactoringExportBatchStatusEnumSchema + * @type { enum } + */ + export const FactoringExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Failed"]); + export type FactoringExportBatchStatusEnum = z.infer; + export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSchema.enum; + + /** + * FactoringExportBatchResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { FactoringExportBatchStatusEnum } status + * @property { number } totalInvoices + * @property { number } totalAmount + * @property { string } currencyNotation + * @property { string } jobId + * @property { string } eurFileUrl + * @property { string } usdFileUrl + * @property { string } createdById + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } exportedAt + */ + export const FactoringExportBatchResponseDtoSchema = z + .object({ + id: z.string(), + officeId: z.string(), + status: FactoringExportBatchStatusEnumSchema, + totalInvoices: z.number(), + totalAmount: z.number(), + currencyNotation: z.string(), + jobId: z.string().nullish(), + eurFileUrl: z.string().nullish(), + usdFileUrl: z.string().nullish(), + createdById: z.string(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + exportedAt: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type FactoringExportBatchResponseDto = z.infer; + + /** + * CreateFactoringExportRequestDtoSchema + * @type { object } + * @property { string } invoiceDateFrom Invoice date from + * @property { string } invoiceDateUntil Invoice date until + */ + export const CreateFactoringExportRequestDtoSchema = z + .object({ + invoiceDateFrom: z.iso.datetime({ offset: true }).describe("Invoice date from"), + invoiceDateUntil: z.iso.datetime({ offset: true }).describe("Invoice date until"), + }) + .readonly(); + export type CreateFactoringExportRequestDto = z.infer; +} diff --git a/test/generated/base/factoringExport/factoringExport.queries.ts b/test/generated/base/factoringExport/factoringExport.queries.ts new file mode 100644 index 0000000..c2d5093 --- /dev/null +++ b/test/generated/base/factoringExport/factoringExport.queries.ts @@ -0,0 +1,80 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { FactoringExportAcl } from "./factoringExport.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FactoringExportModels } from "./factoringExport.models"; +import { FactoringExportApi } from "./factoringExport.api"; + +export namespace FactoringExportQueries { + export const moduleName = QueryModule.FactoringExport; + + export const keys = { + all: [moduleName] as const, + getBatch: (batchId: string, officeId: string) => + [...keys.all, "/offices/:officeId/factoring-exports/:batchId", batchId, officeId] as const, + }; + + /** + * Mutation `useCreate` + * @summary Generate factoring export files for Raiffeisen Factor Bank + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { FactoringExportModels.CreateFactoringExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof FactoringExportApi.create, + { officeId: string; data: FactoringExportModels.CreateFactoringExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(FactoringExportAcl.canUseCreate({ officeId })); + return FactoringExportApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetBatch` + * @summary Get factoring export batch status + * @permission Requires `canUseGetBatch` ability + * @param { string } object.batchId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetBatch = ( + { batchId, officeId }: { batchId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBatch(batchId, officeId), + queryFn: () => { + checkAcl(FactoringExportAcl.canUseGetBatch({ officeId })); + return FactoringExportApi.getBatch(batchId, officeId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/factoringMerge/factoringMerge.acl.ts b/test/generated/base/factoringMerge/factoringMerge.acl.ts new file mode 100644 index 0000000..7a01e13 --- /dev/null +++ b/test/generated/base/factoringMerge/factoringMerge.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace FactoringMergeAcl { + /** + * Use for `usePrepareUpload` mutation ability. For global ability, omit the object parameter. + * @description Prepare factoring merge upload + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareUpload` mutation + */ + export const canUsePrepareUpload = (object?: { officeId: string }) => + ["Update", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< + "Update", + "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) + >; + + /** + * Use for `useProcessMerge` mutation ability. For global ability, omit the object parameter. + * @description Process factoring merge + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useProcessMerge` mutation + */ + export const canUseProcessMerge = (object?: { officeId: string }) => + ["Update", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< + "Update", + "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) + >; + + /** + * Use for `useGetMergeBatch` query ability. For global ability, omit the object parameter. + * @description Read merge batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMergeBatch` query + */ + export const canUseGetMergeBatch = (object?: { officeId: string }) => + ["Read", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< + "Read", + "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) + >; +} diff --git a/test/generated/base/factoringMerge/factoringMerge.api.ts b/test/generated/base/factoringMerge/factoringMerge.api.ts new file mode 100644 index 0000000..17891c8 --- /dev/null +++ b/test/generated/base/factoringMerge/factoringMerge.api.ts @@ -0,0 +1,36 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { FactoringMergeModels } from "./factoringMerge.models"; + +export namespace FactoringMergeApi { + export const prepareUpload = ( + officeId: string, + data: FactoringMergeModels.PrepareFactoringMergeRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/prepare-upload`, + ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), + config, + ); + }; + + export const processMerge = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/${batchId}/process`, + undefined, + config, + ); + }; + + export const getMergeBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/${batchId}`, + config, + ); + }; +} diff --git a/test/generated/base/factoringMerge/factoringMerge.models.ts b/test/generated/base/factoringMerge/factoringMerge.models.ts new file mode 100644 index 0000000..70763bd --- /dev/null +++ b/test/generated/base/factoringMerge/factoringMerge.models.ts @@ -0,0 +1,137 @@ +import { z } from "zod"; + +export namespace FactoringMergeModels { + /** + * FileMetadataDtoSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType File MIME type + * @property { number } fileSize File size in bytes. Minimum: `1` + */ + export const FileMetadataDtoSchema = z + .object({ + fileName: z.string().describe("File name"), + mimeType: z.string().describe("File MIME type"), + fileSize: z.number().gte(1).describe("File size in bytes"), + }) + .readonly(); + export type FileMetadataDto = z.infer; + + /** + * PrepareFactoringMergeRequestDtoSchema + * @type { object } + * @property { FileMetadataDto } eurDebtorFile EUR debtor file metadata + * @property { FileMetadataDto } eurOperationsFile EUR operations file metadata + * @property { FileMetadataDto } eurExistingFactoringFile EUR existing factoring file metadata (optional) + * @property { FileMetadataDto } usdDebtorFile USD debtor file metadata + * @property { FileMetadataDto } usdOperationsFile USD operations file metadata + * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) + */ + export const PrepareFactoringMergeRequestDtoSchema = z + .object({ + eurDebtorFile: FileMetadataDtoSchema.describe("EUR debtor file metadata"), + eurOperationsFile: FileMetadataDtoSchema.describe("EUR operations file metadata"), + eurExistingFactoringFile: FileMetadataDtoSchema.describe( + "EUR existing factoring file metadata (optional)", + ).nullish(), + usdDebtorFile: FileMetadataDtoSchema.describe("USD debtor file metadata"), + usdOperationsFile: FileMetadataDtoSchema.describe("USD operations file metadata"), + usdExistingFactoringFile: FileMetadataDtoSchema.describe( + "USD existing factoring file metadata (optional)", + ).nullish(), + }) + .readonly(); + export type PrepareFactoringMergeRequestDto = z.infer; + + /** + * MediaUploadInstructionsDtoSchema + * @type { object } + * @property { string } id + * @property { string } method + * @property { string } url + */ + export const MediaUploadInstructionsDtoSchema = z + .object({ id: z.string(), method: z.string(), url: z.string() }) + .readonly(); + export type MediaUploadInstructionsDto = z.infer; + + /** + * FactoringMergeUploadInstructionsResponseDtoSchema + * @type { object } + * @property { string } batchId + * @property { MediaUploadInstructionsDto } eurDebtorFile + * @property { MediaUploadInstructionsDto } eurOperationsFile + * @property { MediaUploadInstructionsDto } eurExistingFactoringFile + * @property { MediaUploadInstructionsDto } usdDebtorFile + * @property { MediaUploadInstructionsDto } usdOperationsFile + * @property { MediaUploadInstructionsDto } usdExistingFactoringFile + */ + export const FactoringMergeUploadInstructionsResponseDtoSchema = z + .object({ + batchId: z.string(), + eurDebtorFile: MediaUploadInstructionsDtoSchema, + eurOperationsFile: MediaUploadInstructionsDtoSchema, + eurExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), + usdDebtorFile: MediaUploadInstructionsDtoSchema, + usdOperationsFile: MediaUploadInstructionsDtoSchema, + usdExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), + }) + .readonly(); + export type FactoringMergeUploadInstructionsResponseDto = z.infer< + typeof FactoringMergeUploadInstructionsResponseDtoSchema + >; + + /** + * FactoringMergeBatchStatusEnumSchema + * @type { enum } + */ + export const FactoringMergeBatchStatusEnumSchema = z.enum(["Initializing", "Processing", "Completed", "Failed"]); + export type FactoringMergeBatchStatusEnum = z.infer; + export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema.enum; + + /** + * FactoringMergeBatchResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { FactoringMergeBatchStatusEnum } status + * @property { string } eurDebtorFileMediaId + * @property { string } eurOperationsFileMediaId + * @property { string } eurExistingFactoringFileMediaId + * @property { string } usdDebtorFileMediaId + * @property { string } usdOperationsFileMediaId + * @property { string } usdExistingFactoringFileMediaId + * @property { string } eurResultFileMediaId + * @property { string } eurResultFileUrl + * @property { string } usdResultFileMediaId + * @property { string } usdResultFileUrl + * @property { string } jobId + * @property { string } errorMessage + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } completedAt + */ + export const FactoringMergeBatchResponseDtoSchema = z + .object({ + id: z.string(), + officeId: z.string(), + status: FactoringMergeBatchStatusEnumSchema, + eurDebtorFileMediaId: z.string(), + eurOperationsFileMediaId: z.string(), + eurExistingFactoringFileMediaId: z.string().nullish(), + usdDebtorFileMediaId: z.string(), + usdOperationsFileMediaId: z.string(), + usdExistingFactoringFileMediaId: z.string().nullish(), + eurResultFileMediaId: z.string().nullish(), + eurResultFileUrl: z.string().nullish(), + usdResultFileMediaId: z.string().nullish(), + usdResultFileUrl: z.string().nullish(), + jobId: z.string().nullish(), + errorMessage: z.string().nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + completedAt: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type FactoringMergeBatchResponseDto = z.infer; +} diff --git a/test/generated/base/factoringMerge/factoringMerge.queries.ts b/test/generated/base/factoringMerge/factoringMerge.queries.ts new file mode 100644 index 0000000..45c7497 --- /dev/null +++ b/test/generated/base/factoringMerge/factoringMerge.queries.ts @@ -0,0 +1,113 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { FactoringMergeAcl } from "./factoringMerge.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FactoringMergeModels } from "./factoringMerge.models"; +import { FactoringMergeApi } from "./factoringMerge.api"; + +export namespace FactoringMergeQueries { + export const moduleName = QueryModule.FactoringMerge; + + export const keys = { + all: [moduleName] as const, + getMergeBatch: (officeId: string, batchId: string) => + [...keys.all, "/offices/:officeId/factoring-merge/:batchId", officeId, batchId] as const, + }; + + /** + * Mutation `usePrepareUpload` + * @summary Prepare upload instructions for MOVE files merge + * @permission Requires `canUsePrepareUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { FactoringMergeModels.PrepareFactoringMergeRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const usePrepareUpload = ( + options?: AppMutationOptions< + typeof FactoringMergeApi.prepareUpload, + { officeId: string; data: FactoringMergeModels.PrepareFactoringMergeRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId })); + return FactoringMergeApi.prepareUpload(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useProcessMerge` + * @summary Start processing the merge batch + * @permission Requires `canUseProcessMerge` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const useProcessMerge = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId })); + return FactoringMergeApi.processMerge(officeId, batchId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, batchId } = variables; + const updateKeys = [keys.getMergeBatch(officeId, batchId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetMergeBatch` + * @summary Get merge batch status + * @permission Requires `canUseGetMergeBatch` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, default] + */ + export const useGetMergeBatch = ( + { officeId, batchId }: { officeId: string; batchId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getMergeBatch(officeId, batchId), + queryFn: () => { + checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId })); + return FactoringMergeApi.getMergeBatch(officeId, batchId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/files/files.api.ts b/test/generated/base/files/files.api.ts new file mode 100644 index 0000000..fd93086 --- /dev/null +++ b/test/generated/base/files/files.api.ts @@ -0,0 +1,96 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { FilesModels } from "./files.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace FilesApi { + export const createUpload = ( + officeId: string, + folderId: string, + data: FilesModels.CreateFileRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: FilesModels.FileUploadResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}/files`, + ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), + config, + ); + }; + + export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/files/eml`, + ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const rename = ( + officeId: string, + fileId: string, + data: FilesModels.RenameFileRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.FileResponseDTOSchema }, + `/offices/${officeId}/files/${fileId}`, + ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), + config, + ); + }; + + export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/move`, + ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), + config, + ); + }; + + export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/copy`, + ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), + config, + ); + }; + + export const archive = ( + officeId: string, + data: FilesModels.SetFilesArchivedRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/archive`, + ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), + config, + ); + }; + + export const unarchive = ( + officeId: string, + data: FilesModels.SetFilesArchivedRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/unarchive`, + ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/files/files.models.ts b/test/generated/base/files/files.models.ts new file mode 100644 index 0000000..2f07427 --- /dev/null +++ b/test/generated/base/files/files.models.ts @@ -0,0 +1,62 @@ +import { z } from "zod"; + +export namespace FilesModels { + /** + * CreateFileRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } mimeType + * @property { number } fileSize Minimum: `0` + */ + export const CreateFileRequestDTOSchema = z + .object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }) + .readonly(); + export type CreateFileRequestDTO = z.infer; + + /** + * FileUploadResponseDTOSchema + * @type { object } + * @property { string } fileId + * @property { string } method + * @property { string } url + */ + export const FileUploadResponseDTOSchema = z + .object({ fileId: z.string(), method: z.string(), url: z.string() }) + .readonly(); + export type FileUploadResponseDTO = z.infer; + + /** + * GetFilesEmlRequestDTOSchema + * @type { object } + * @property { string[] } ids Min Items: `1` + */ + export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); + export type GetFilesEmlRequestDTO = z.infer; + + /** + * RenameFileRequestDTOSchema + * @type { object } + * @property { string } name + */ + export const RenameFileRequestDTOSchema = z.object({ name: z.string() }).readonly(); + export type RenameFileRequestDTO = z.infer; + + /** + * MoveFilesRequestDTOSchema + * @type { object } + * @property { string[] } fileIds Min Items: `1` + * @property { string } targetFolderId + */ + export const MoveFilesRequestDTOSchema = z + .object({ fileIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }) + .readonly(); + export type MoveFilesRequestDTO = z.infer; + + /** + * SetFilesArchivedRequestDTOSchema + * @type { object } + * @property { string[] } ids Min Items: `1` + */ + export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); + export type SetFilesArchivedRequestDTO = z.infer; +} diff --git a/test/generated/base/files/files.queries.ts b/test/generated/base/files/files.queries.ts new file mode 100644 index 0000000..a37c4f3 --- /dev/null +++ b/test/generated/base/files/files.queries.ts @@ -0,0 +1,245 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FilesModels } from "./files.models"; +import { FilesApi } from "./files.api"; + +export namespace FilesQueries { + export const moduleName = QueryModule.Files; + + /** + * Mutation `useCreateUpload` + * @summary Create file upload instructions + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { FilesModels.CreateFileRequestDTO } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateUpload = ( + options?: AppMutationOptions< + typeof FilesApi.createUpload, + { + officeId: string; + folderId: string; + data: FilesModels.CreateFileRequestDTO; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { + const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGetEml` - recommended when file should not be cached + * @summary Get files as EML file with attachments + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.GetFilesEmlRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGetEml = ( + options?: AppMutationOptions< + typeof FilesApi.getEml, + { officeId: string; data: FilesModels.GetFilesEmlRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FilesApi.getEml(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useRename` + * @summary Rename file + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.fileId Path parameter + * @param { FilesModels.RenameFileRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useRename = ( + options?: AppMutationOptions< + typeof FilesApi.rename, + { officeId: string; fileId: string; data: FilesModels.RenameFileRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, fileId, data }) => FilesApi.rename(officeId, fileId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMove` + * @summary Move files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useMove = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FilesApi.move(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCopy` + * @summary Copy files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useCopy = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FilesApi.copy(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useArchive = ( + options?: AppMutationOptions< + typeof FilesApi.archive, + { officeId: string; data: FilesModels.SetFilesArchivedRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FilesApi.archive(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions< + typeof FilesApi.unarchive, + { officeId: string; data: FilesModels.SetFilesArchivedRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FilesApi.unarchive(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/folders/folders.api.ts b/test/generated/base/folders/folders.api.ts new file mode 100644 index 0000000..eb72bda --- /dev/null +++ b/test/generated/base/folders/folders.api.ts @@ -0,0 +1,92 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { FoldersModels } from "./folders.models"; + +export namespace FoldersApi { + export const getTree = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}/tree`, + config, + ); + }; + + export const getContent = ( + officeId: string, + folderId: string, + limit: number, + order?: FoldersModels.GetContentOrderParam, + filter?: FoldersModels.FolderContentFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}`, + { + ...config, + params: { + order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { + type: "query", + name: "order", + }), + filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const rename = ( + officeId: string, + folderId: string, + data: FoldersModels.RenameFolderRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}`, + ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), + config, + ); + }; + + export const deleteFolder = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete({ resSchema: z.void() }, `/offices/${officeId}/folders/${folderId}`, undefined, config); + }; + + export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders`, + ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), + config, + ); + }; + + export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/folders/move`, + ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/folders/folders.models.ts b/test/generated/base/folders/folders.models.ts new file mode 100644 index 0000000..c9908a5 --- /dev/null +++ b/test/generated/base/folders/folders.models.ts @@ -0,0 +1,133 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace FoldersModels { + /** + * TargetEntityNameEnumSchema + * @type { enum } + */ + export const TargetEntityNameEnumSchema = z.enum(["invoice", "quote"]); + export type TargetEntityNameEnum = z.infer; + export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; + + /** + * FolderSymlinkResponseDTOSchema + * @type { object } + * @property { string } targetEntityName + * @property { string } targetEntityId + */ + export const FolderSymlinkResponseDTOSchema = z + .object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }) + .readonly(); + export type FolderSymlinkResponseDTO = z.infer; + + /** + * FolderTreeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } isSystem + * @property { boolean } isSymlink + * @property { FolderSymlinkResponseDTO } symlink + * @property { FolderTreeResponseDTO[] } folders + */ + export const FolderTreeResponseDTOSchema = z + .object({ + id: z.string(), + name: z.string(), + isSystem: z.boolean(), + isSymlink: z.boolean(), + symlink: FolderSymlinkResponseDTOSchema.nullable(), + get folders() { + return z.array(FolderTreeResponseDTOSchema).readonly(); + }, + }) + .readonly(); + export type FolderTreeResponseDTO = z.infer; + + /** + * FolderResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } archived + * @property { boolean } isSystem + * @property { boolean } isSymlink + * @property { FolderSymlinkResponseDTO } symlink + * @property { string } createdAt + * @property { string } updatedAt + * @property { CommonModels.FolderEmployeeDTO } createdBy + * @property { CommonModels.FolderEmployeeDTO } updatedBy + * @property { CommonModels.FileResponseDTO[] } files + * @property { FolderResponseDTO[] } folders + */ + export const FolderResponseDTOSchema = z + .object({ + id: z.string(), + name: z.string(), + archived: z.boolean(), + isSystem: z.boolean(), + isSymlink: z.boolean(), + symlink: FolderSymlinkResponseDTOSchema.nullable(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + createdBy: CommonModels.FolderEmployeeDTOSchema, + updatedBy: CommonModels.FolderEmployeeDTOSchema, + files: z.array(CommonModels.FileResponseDTOSchema).readonly(), + get folders() { + return z.array(FolderResponseDTOSchema).readonly(); + }, + }) + .readonly(); + export type FolderResponseDTO = z.infer; + + /** + * FolderContentFilterDtoSchema + * @type { object } + * @property { boolean } archived When omitted, both archived and unarchived files are returned. + */ + export const FolderContentFilterDtoSchema = z + .object({ archived: z.boolean().describe("When omitted, both archived and unarchived files are returned.") }) + .readonly(); + export type FolderContentFilterDto = z.infer; + + /** + * CreateFolderRequestDTOSchema + * @type { object } + * @property { string } parentFolderId + * @property { string } name + */ + export const CreateFolderRequestDTOSchema = z.object({ parentFolderId: z.string(), name: z.string() }).readonly(); + export type CreateFolderRequestDTO = z.infer; + + /** + * RenameFolderRequestDTOSchema + * @type { object } + * @property { string } name + */ + export const RenameFolderRequestDTOSchema = z.object({ name: z.string() }).readonly(); + export type RenameFolderRequestDTO = z.infer; + + /** + * MoveFoldersRequestDTOSchema + * @type { object } + * @property { string[] } folderIds Min Items: `1` + * @property { string } targetFolderId + */ + export const MoveFoldersRequestDTOSchema = z + .object({ folderIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }) + .readonly(); + export type MoveFoldersRequestDTO = z.infer; + + /** + * GetContentOrderParamSchema + * @type { array } + * @description Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + */ + export const GetContentOrderParamSchema = z + .array(z.string()) + .readonly() + .describe("Order by fields (comma separated with +/- prefix): name, createdAt") + .nullish(); + export type GetContentOrderParam = z.infer; +} diff --git a/test/generated/base/folders/folders.queries.ts b/test/generated/base/folders/folders.queries.ts new file mode 100644 index 0000000..ce4299d --- /dev/null +++ b/test/generated/base/folders/folders.queries.ts @@ -0,0 +1,279 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FoldersModels } from "./folders.models"; +import { FoldersApi } from "./folders.api"; + +export namespace FoldersQueries { + export const moduleName = QueryModule.Folders; + + export const keys = { + all: [moduleName] as const, + getTree: (officeId: string, folderId: string) => + [...keys.all, "/offices/:officeId/folders/:folderId/tree", officeId, folderId] as const, + getContent: ( + officeId: string, + folderId: string, + limit?: number, + order?: FoldersModels.GetContentOrderParam, + filter?: FoldersModels.FolderContentFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/folders/:folderId", + officeId, + folderId, + limit, + order, + filter, + page, + cursor, + ] as const, + getContentInfinite: ( + officeId: string, + folderId: string, + limit?: number, + order?: FoldersModels.GetContentOrderParam, + filter?: FoldersModels.FolderContentFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/folders/:folderId", + "infinite", + officeId, + folderId, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useGetTree` + * @summary Get folder tree + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetTree = ( + { officeId, folderId }: { officeId: string; folderId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getTree(officeId, folderId), + queryFn: () => FoldersApi.getTree(officeId, folderId, config), + ...options, + }); + }; + + /** + * Query `useGetContent` + * @summary Get folder content + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetContent = ( + { + officeId, + folderId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + folderId: string; + limit: number; + order?: FoldersModels.GetContentOrderParam; + filter?: FoldersModels.FolderContentFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), + queryFn: () => FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `useGetContentInfinite + * @summary Get folder content + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useGetContentInfinite = ( + { + officeId, + folderId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + folderId: string; + limit: number; + order?: FoldersModels.GetContentOrderParam; + filter?: FoldersModels.FolderContentFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => + FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useRename` + * @summary Rename folder + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { FoldersModels.RenameFolderRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useRename = ( + options?: AppMutationOptions< + typeof FoldersApi.rename, + { officeId: string; folderId: string; data: FoldersModels.RenameFolderRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, folderId, data }) => FoldersApi.rename(officeId, folderId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteFolder` + * @summary Delete folder + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteFolder = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, folderId }) => FoldersApi.deleteFolder(officeId, folderId, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create folder + * @param { string } mutation.officeId Path parameter + * @param { FoldersModels.CreateFolderRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof FoldersApi.create, + { officeId: string; data: FoldersModels.CreateFolderRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FoldersApi.create(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMove` + * @summary Move folders + * @param { string } mutation.officeId Path parameter + * @param { FoldersModels.MoveFoldersRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useMove = ( + options?: AppMutationOptions< + typeof FoldersApi.move, + { officeId: string; data: FoldersModels.MoveFoldersRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FoldersApi.move(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/hsCodes/hsCodes.acl.ts b/test/generated/base/hsCodes/hsCodes.acl.ts new file mode 100644 index 0000000..e893613 --- /dev/null +++ b/test/generated/base/hsCodes/hsCodes.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace HsCodesAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "HsCode"] as AbilityTuple<"Create", "HsCode">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "HsCode"] as AbilityTuple<"Update", "HsCode">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "HsCode"] as AbilityTuple<"Archive", "HsCode">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "HsCode"] as AbilityTuple<"Archive", "HsCode">; +} diff --git a/test/generated/base/hsCodes/hsCodes.api.ts b/test/generated/base/hsCodes/hsCodes.api.ts new file mode 100644 index 0000000..98854f3 --- /dev/null +++ b/test/generated/base/hsCodes/hsCodes.api.ts @@ -0,0 +1,123 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { HsCodesModels } from "./hsCodes.models"; + +export namespace HsCodesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: HsCodesModels.HsCodePaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, `/hs-codes`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes`, + ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), + config, + ); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: HsCodesModels.HsCodeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, + `/hs-codes/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: HsCodesModels.HsCodeResponseDTOSchema }, `/hs-codes/${id}`, config); + }; + + export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}`, + ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/hsCodes/hsCodes.configs.ts b/test/generated/base/hsCodes/hsCodes.configs.ts new file mode 100644 index 0000000..a69eec4 --- /dev/null +++ b/test/generated/base/hsCodes/hsCodes.configs.ts @@ -0,0 +1,119 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { HsCodesModels } from "./hsCodes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { HsCodesQueries } from "./hsCodes.queries"; +import { HsCodesAcl } from "./hsCodes.acl"; + +export namespace HsCodesConfigs { + export const hsCodesConfig = { + meta: { + title: "Hs Codes", + }, + readAll: { + acl: HsCodesAcl.canUsePaginate, + schema: HsCodesModels.HsCodeResponseDTOSchema, + paginated: HsCodesQueries.usePaginate, + infinite: HsCodesQueries.usePaginateInfinite, + filters: { + schema: HsCodesModels.HsCodePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: HsCodesModels.HsCodePaginationFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: HsCodesModels.HsCodeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + description: true, + customArea: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: HsCodesModels.HsCodesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: HsCodesAcl.canUseFindById, + schema: HsCodesModels.HsCodeResponseDTOSchema, + query: HsCodesQueries.useFindById, + }, + create: { + acl: HsCodesAcl.canUseCreate, + schema: HsCodesModels.CreateHsCodeRequestDTOSchema, + mutation: HsCodesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: HsCodesModels.CreateHsCodeRequestDTOSchema, + options: { + inputs: { + name: true, + description: true, + customArea: true, + }, + }, + }), + }, + update: { + acl: HsCodesAcl.canUseUpdate, + schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, + mutation: HsCodesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, + options: { + inputs: { + name: true, + description: true, + customArea: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: HsCodesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: HsCodesQueries.usePaginateLabels, + infinite: HsCodesQueries.usePaginateLabelsInfinite, + filters: { + schema: HsCodesModels.HsCodeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: HsCodesModels.HsCodeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/hsCodes/hsCodes.models.ts b/test/generated/base/hsCodes/hsCodes.models.ts new file mode 100644 index 0000000..2631d56 --- /dev/null +++ b/test/generated/base/hsCodes/hsCodes.models.ts @@ -0,0 +1,158 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace HsCodesModels { + /** + * HsCodeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type HsCodeEmployeeDTO = z.infer; + + /** + * HsCodeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the HS Code + * @property { string } name Name of the HS Code + * @property { string } description Description of the HS Code + * @property { string } customArea Custom area associated with the HS Code + * @property { boolean } archived Indicates if the HS Code is archived + * @property { string } createdById + * @property { HsCodeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { HsCodeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const HsCodeResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier for the HS Code"), + name: z.string().describe("Name of the HS Code"), + description: z.string().describe("Description of the HS Code"), + customArea: z.string().describe("Custom area associated with the HS Code"), + archived: z.boolean().describe("Indicates if the HS Code is archived"), + createdById: z.string().nullish(), + createdBy: HsCodeEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: HsCodeEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type HsCodeResponseDTO = z.infer; + + /** + * HsCodePaginationFilterDtoSchema + * @type { object } + * @property { boolean } archived Archived status + * @property { string } search + */ + export const HsCodePaginationFilterDtoSchema = z + .object({ archived: z.boolean().describe("Archived status"), search: z.string() }) + .readonly(); + export type HsCodePaginationFilterDto = z.infer; + + /** + * HsCodeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const HsCodeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type HsCodeLabelFilterDto = z.infer; + + /** + * CreateHsCodeRequestDTOSchema + * @type { object } + * @property { string } name Unique name for the HS Code + * @property { string } description Description of the HS Code + * @property { string } customArea Custom area associated with the HS Code + */ + export const CreateHsCodeRequestDTOSchema = z + .object({ + name: z.string().describe("Unique name for the HS Code"), + description: z.string().describe("Description of the HS Code"), + customArea: z.string().describe("Custom area associated with the HS Code"), + }) + .readonly(); + export type CreateHsCodeRequestDTO = z.infer; + + /** + * UpdateHsCodeRequestDTOSchema + * @type { object } + * @property { string } name Updated name of the HS Code. + * @property { string } description Updated description of the HS Code. + * @property { string } customArea Updated custom area associated with the HS Code. + */ + export const UpdateHsCodeRequestDTOSchema = z + .object({ + name: z.string().describe("Updated name of the HS Code."), + description: z.string().describe("Updated description of the HS Code."), + customArea: z.string().describe("Updated custom area associated with the HS Code."), + }) + .readonly(); + export type UpdateHsCodeRequestDTO = z.infer; + + /** + * HsCodesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const HsCodesPaginateOrderParamEnumSchema = z.enum([ + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "name", + ]); + export type HsCodesPaginateOrderParamEnum = z.infer; + export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema.enum; + + /** + * HsCodesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { HsCodeResponseDTO[] } items + */ + export const HsCodesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(HsCodeResponseDTOSchema).readonly() }).readonly().shape, + }); + export type HsCodesPaginateResponse = z.infer; + + /** + * HsCodesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const HsCodesPaginateLabelsOrderParamEnumSchema = z.enum([ + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "name", + ]); + export type HsCodesPaginateLabelsOrderParamEnum = z.infer; + export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * HsCodesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const HsCodesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type HsCodesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/hsCodes/hsCodes.queries.ts b/test/generated/base/hsCodes/hsCodes.queries.ts new file mode 100644 index 0000000..fb9390b --- /dev/null +++ b/test/generated/base/hsCodes/hsCodes.queries.ts @@ -0,0 +1,353 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { HsCodesAcl } from "./hsCodes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { HsCodesModels } from "./hsCodes.models"; +import { HsCodesApi } from "./hsCodes.api"; + +export namespace HsCodesQueries { + export const moduleName = QueryModule.HsCodes; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: HsCodesModels.HsCodePaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/hs-codes", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: HsCodesModels.HsCodePaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/hs-codes", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: HsCodesModels.HsCodeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/hs-codes/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: HsCodesModels.HsCodeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/hs-codes/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/hs-codes/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate HS Codes + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: HsCodesModels.HsCodePaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(HsCodesAcl.canUsePaginate()); + return HsCodesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate HS Codes + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: HsCodesModels.HsCodePaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(HsCodesAcl.canUsePaginate()); + return HsCodesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new HS Code + * @permission Requires `canUseCreate` ability + * @param { HsCodesModels.CreateHsCodeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(HsCodesAcl.canUseCreate()); + return HsCodesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate HS codes with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: HsCodesModels.HsCodeLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(HsCodesAcl.canUsePaginateLabels()); + return HsCodesApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate HS codes with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: HsCodesModels.HsCodeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(HsCodesAcl.canUsePaginateLabels()); + return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get HS Code Details by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(HsCodesAcl.canUseFindById()); + return HsCodesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update an existing HS Code + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { HsCodesModels.UpdateHsCodeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(HsCodesAcl.canUseUpdate()); + return HsCodesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive an HS Code + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(HsCodesAcl.canUseArchive()); + return HsCodesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive an HS Code + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(HsCodesAcl.canUseUnarchive()); + return HsCodesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/integrationChannels/integrationChannels.acl.ts b/test/generated/base/integrationChannels/integrationChannels.acl.ts new file mode 100644 index 0000000..497b407 --- /dev/null +++ b/test/generated/base/integrationChannels/integrationChannels.acl.ts @@ -0,0 +1,99 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace IntegrationChannelsAcl { + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List integration channels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Read", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Create", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Read integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Read", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Update", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Archive", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Archive", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useTestConnection` mutation ability. For global ability, omit the object parameter. + * @description Test integration channel connection + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTestConnection` mutation + */ + export const canUseTestConnection = (object?: { officeId: string }) => + ["Update", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Update", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useListMessages` query ability. For global ability, omit the object parameter. + * @description List integration channel messages + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListMessages` query + */ + export const canUseListMessages = (object?: { officeId: string }) => + ["Read", object ? subject("IntegrationMessage", object) : "IntegrationMessage"] as AbilityTuple< + "Read", + "IntegrationMessage" | (ForcedSubject<"IntegrationMessage"> & { officeId: string }) + >; +} diff --git a/test/generated/base/integrationChannels/integrationChannels.api.ts b/test/generated/base/integrationChannels/integrationChannels.api.ts new file mode 100644 index 0000000..a01d120 --- /dev/null +++ b/test/generated/base/integrationChannels/integrationChannels.api.ts @@ -0,0 +1,152 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; + +export namespace IntegrationChannelsApi { + export const list = ( + officeId: string, + limit: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, + `/offices/${officeId}/integration-channels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = ( + officeId: string, + data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels`, + ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), + config, + ); + }; + + export const findById = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}`, + config, + ); + }; + + export const update = ( + officeId: string, + id: string, + data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}`, + ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), + config, + ); + }; + + export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/unarchive`, + undefined, + config, + ); + }; + + export const testConnection = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/test-connection`, + undefined, + config, + ); + }; + + export const listMessages = ( + officeId: string, + id: string, + limit: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, + `/offices/${officeId}/integration-channels/${id}/messages`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/base/integrationChannels/integrationChannels.configs.ts b/test/generated/base/integrationChannels/integrationChannels.configs.ts new file mode 100644 index 0000000..4105a84 --- /dev/null +++ b/test/generated/base/integrationChannels/integrationChannels.configs.ts @@ -0,0 +1,154 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; +import { IntegrationChannelsQueries } from "./integrationChannels.queries"; +import { IntegrationChannelsAcl } from "./integrationChannels.acl"; + +export namespace IntegrationChannelsConfigs { + export const integrationChannelsConfig = { + meta: { + title: "Integration Channels", + }, + readAll: { + acl: IntegrationChannelsAcl.canUseList, + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + paginated: IntegrationChannelsQueries.useList, + infinite: IntegrationChannelsQueries.useListInfinite, + filters: { + schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + options: { + columns: { + id: true, + officeId: true, + businessPartnerId: true, + businessPartner: true, + employeeId: true, + name: true, + archived: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + lastPolledAt: true, + createdAt: true, + createdById: true, + createdBy: true, + updatedAt: true, + updatedById: true, + updatedBy: true, + }, + sortable: IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: IntegrationChannelsAcl.canUseFindById, + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + query: IntegrationChannelsQueries.useFindById, + }, + create: { + acl: IntegrationChannelsAcl.canUseCreate, + schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, + mutation: IntegrationChannelsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, + options: { + inputs: { + businessPartnerId: true, + employeeId: true, + name: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + sftpPassword: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + }, + }, + }), + }, + update: { + acl: IntegrationChannelsAcl.canUseUpdate, + schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, + mutation: IntegrationChannelsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, + options: { + inputs: { + businessPartnerId: true, + employeeId: true, + name: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + sftpPassword: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + }, + }, + }), + }, + }; + + export const messagesConfig = { + meta: { + title: "Messages", + }, + readAll: { + acl: IntegrationChannelsAcl.canUseListMessages, + schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, + paginated: IntegrationChannelsQueries.useListMessages, + infinite: IntegrationChannelsQueries.useListMessagesInfinite, + filters: { + schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, + options: { + inputs: { + direction: true, + format: true, + status: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, + options: { + columns: { + id: true, + integrationChannelId: true, + positionId: true, + positionNumber: true, + direction: true, + format: true, + status: true, + rawContent: true, + fileName: true, + errorMessage: true, + processedAt: true, + sentAt: true, + createdAt: true, + }, + sortable: IntegrationChannelsModels.ListMessagesOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/integrationChannels/integrationChannels.models.ts b/test/generated/base/integrationChannels/integrationChannels.models.ts new file mode 100644 index 0000000..cbd4d90 --- /dev/null +++ b/test/generated/base/integrationChannels/integrationChannels.models.ts @@ -0,0 +1,283 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace IntegrationChannelsModels { + /** + * IntegrationChannelBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const IntegrationChannelBusinessPartnerResponseDtoSchema = z + .object({ id: z.string(), name: z.string() }) + .readonly(); + export type IntegrationChannelBusinessPartnerResponseDto = z.infer< + typeof IntegrationChannelBusinessPartnerResponseDtoSchema + >; + + /** + * IntegrationChannelEmployeeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const IntegrationChannelEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type IntegrationChannelEmployeeResponseDto = z.infer; + + /** + * IntegrationChannelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } businessPartnerId + * @property { IntegrationChannelBusinessPartnerResponseDto } businessPartner + * @property { string } employeeId + * @property { string } name + * @property { boolean } archived + * @property { string } sftpHost + * @property { number } sftpPort + * @property { string } sftpUsername + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes + * @property { string } lastPolledAt + * @property { string } createdAt + * @property { string } createdById + * @property { IntegrationChannelEmployeeResponseDto } createdBy + * @property { string } updatedAt + * @property { string } updatedById + * @property { IntegrationChannelEmployeeResponseDto } updatedBy + */ + export const IntegrationChannelResponseDtoSchema = z + .object({ + id: z.string(), + officeId: z.string(), + businessPartnerId: z.string(), + businessPartner: IntegrationChannelBusinessPartnerResponseDtoSchema, + employeeId: z.string(), + name: z.string(), + archived: z.boolean(), + sftpHost: z.string(), + sftpPort: z.number(), + sftpUsername: z.string(), + inboundPath: z.string(), + outboundPath: z.string(), + pollingFrequencyMinutes: z.number(), + lastPolledAt: z.iso.datetime({ offset: true }).nullish(), + createdAt: z.iso.datetime({ offset: true }), + createdById: z.string(), + createdBy: IntegrationChannelEmployeeResponseDtoSchema, + updatedAt: z.iso.datetime({ offset: true }), + updatedById: z.string(), + updatedBy: IntegrationChannelEmployeeResponseDtoSchema, + }) + .readonly(); + export type IntegrationChannelResponseDto = z.infer; + + /** + * IntegrationMessageDirectionEnumSchema + * @type { enum } + */ + export const IntegrationMessageDirectionEnumSchema = z.enum(["Inbound", "Outbound"]); + export type IntegrationMessageDirectionEnum = z.infer; + export const IntegrationMessageDirectionEnum = IntegrationMessageDirectionEnumSchema.enum; + + /** + * IntegrationMessageFormatEnumSchema + * @type { enum } + */ + export const IntegrationMessageFormatEnumSchema = z.enum(["IFTMBF", "IFTMBC"]); + export type IntegrationMessageFormatEnum = z.infer; + export const IntegrationMessageFormatEnum = IntegrationMessageFormatEnumSchema.enum; + + /** + * IntegrationMessageStatusEnumSchema + * @type { enum } + */ + export const IntegrationMessageStatusEnumSchema = z.enum(["Received", "Processed", "Failed", "Sent"]); + export type IntegrationMessageStatusEnum = z.infer; + export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.enum; + + /** + * IntegrationMessageFilterDtoSchema + * @type { object } + * @property { IntegrationMessageDirectionEnum } direction + * @property { IntegrationMessageFormatEnum } format + * @property { IntegrationMessageStatusEnum } status + * @property { string } search + */ + export const IntegrationMessageFilterDtoSchema = z + .object({ + direction: IntegrationMessageDirectionEnumSchema, + format: IntegrationMessageFormatEnumSchema, + status: IntegrationMessageStatusEnumSchema, + search: z.string(), + }) + .readonly(); + export type IntegrationMessageFilterDto = z.infer; + + /** + * IntegrationChannelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const IntegrationChannelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type IntegrationChannelFilterDto = z.infer; + + /** + * CreateIntegrationChannelRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } employeeId + * @property { string } name + * @property { string } sftpHost + * @property { number } sftpPort Minimum: `1`. Maximum: `65535` + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes Minimum: `1` + */ + export const CreateIntegrationChannelRequestDtoSchema = z + .object({ + businessPartnerId: z.string(), + employeeId: z.string(), + name: z.string(), + sftpHost: z.string(), + sftpPort: z.number().gte(1).lte(65535), + sftpUsername: z.string(), + sftpPassword: z.string(), + inboundPath: z.string(), + outboundPath: z.string(), + pollingFrequencyMinutes: z.number().gte(1), + }) + .readonly(); + export type CreateIntegrationChannelRequestDto = z.infer; + + /** + * UpdateIntegrationChannelRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } employeeId + * @property { string } name + * @property { string } sftpHost + * @property { number } sftpPort Minimum: `1`. Maximum: `65535` + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes Minimum: `1` + */ + export const UpdateIntegrationChannelRequestDtoSchema = z + .object({ + businessPartnerId: z.string(), + employeeId: z.string(), + name: z.string(), + sftpHost: z.string(), + sftpPort: z.number().gte(1).lte(65535), + sftpUsername: z.string(), + sftpPassword: z.string(), + inboundPath: z.string(), + outboundPath: z.string(), + pollingFrequencyMinutes: z.number().gte(1), + }) + .readonly(); + export type UpdateIntegrationChannelRequestDto = z.infer; + + /** + * TestConnectionResponseDtoSchema + * @type { object } + * @property { boolean } success + */ + export const TestConnectionResponseDtoSchema = z.object({ success: z.boolean() }).readonly(); + export type TestConnectionResponseDto = z.infer; + + /** + * IntegrationMessageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } integrationChannelId + * @property { string } positionId + * @property { string } positionNumber + * @property { string } direction + * @property { string } format + * @property { string } status + * @property { string } rawContent + * @property { string } fileName + * @property { string } errorMessage + * @property { string } processedAt + * @property { string } sentAt + * @property { string } createdAt + */ + export const IntegrationMessageResponseDtoSchema = z + .object({ + id: z.string(), + integrationChannelId: z.string(), + positionId: z.string().nullish(), + positionNumber: z.string().nullish(), + direction: z.string(), + format: z.string(), + status: z.string(), + rawContent: z.string(), + fileName: z.string(), + errorMessage: z.string().nullish(), + processedAt: z.iso.datetime({ offset: true }).nullish(), + sentAt: z.iso.datetime({ offset: true }).nullish(), + createdAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type IntegrationMessageResponseDto = z.infer; + + /** + * IntegrationChannelsListOrderParamEnumSchema + * @type { enum } + */ + export const IntegrationChannelsListOrderParamEnumSchema = z.enum([ + "createdAt", + "name", + "businessPartner", + "lastPolledAt", + ]); + export type IntegrationChannelsListOrderParamEnum = z.infer; + export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrderParamEnumSchema.enum; + + /** + * IntegrationChannelsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { IntegrationChannelResponseDto[] } items + */ + export const IntegrationChannelsListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).readonly() }).readonly().shape, + }); + export type IntegrationChannelsListResponse = z.infer; + + /** + * ListMessagesOrderParamEnumSchema + * @type { enum } + */ + export const ListMessagesOrderParamEnumSchema = z.enum(["createdAt", "status", "direction", "format"]); + export type ListMessagesOrderParamEnum = z.infer; + export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; + + /** + * ListMessagesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { IntegrationMessageResponseDto[] } items + */ + export const ListMessagesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).readonly() }).readonly().shape, + }); + export type ListMessagesResponse = z.infer; +} diff --git a/test/generated/base/integrationChannels/integrationChannels.queries.ts b/test/generated/base/integrationChannels/integrationChannels.queries.ts new file mode 100644 index 0000000..9ba5b53 --- /dev/null +++ b/test/generated/base/integrationChannels/integrationChannels.queries.ts @@ -0,0 +1,471 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { IntegrationChannelsAcl } from "./integrationChannels.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; +import { IntegrationChannelsApi } from "./integrationChannels.api"; + +export namespace IntegrationChannelsQueries { + export const moduleName = QueryModule.IntegrationChannels; + + export const keys = { + all: [moduleName] as const, + list: ( + officeId: string, + limit?: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, + page?: number, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/integration-channels", officeId, limit, order, filter, page, cursor] as const, + listInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/integration-channels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/integration-channels/:id", officeId, id] as const, + listMessages: ( + officeId: string, + id: string, + limit?: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/integration-channels/:id/messages", + officeId, + id, + limit, + order, + filter, + page, + cursor, + ] as const, + listMessagesInfinite: ( + officeId: string, + id: string, + limit?: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/integration-channels/:id/messages", + "infinite", + officeId, + id, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useList` + * @summary List integration channels for an office + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: IntegrationChannelsModels.IntegrationChannelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseList({ officeId })); + return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List integration channels for an office + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: IntegrationChannelsModels.IntegrationChannelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(IntegrationChannelsAcl.canUseList({ officeId })); + return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create integration channel + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { IntegrationChannelsModels.CreateIntegrationChannelRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof IntegrationChannelsApi.create, + { officeId: string; data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId })); + return IntegrationChannelsApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get integration channel by id + * @permission Requires `canUseFindById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(officeId, id), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId })); + return IntegrationChannelsApi.findById(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update integration channel by id + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof IntegrationChannelsApi.update, + { officeId: string; id: string; data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId })); + return IntegrationChannelsApi.update(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive integration channel by id + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId })); + return IntegrationChannelsApi.archive(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive integration channel by id + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId })); + return IntegrationChannelsApi.unarchive(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useTestConnection` + * @summary Test integration channel SFTP connection + * @permission Requires `canUseTestConnection` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useTestConnection = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId })); + return IntegrationChannelsApi.testConnection(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListMessages` + * @summary Paginate integration channel messages + * @permission Requires `canUseListMessages` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListMessages = ( + { + officeId, + id, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + id: string; + limit: number; + order?: string; + filter?: IntegrationChannelsModels.IntegrationMessageFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId })); + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListMessagesInfinite + * @summary Paginate integration channel messages + * @permission Requires `canUseListMessages` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListMessagesInfinite = ( + { + officeId, + id, + limit, + order, + filter, + cursor, + }: { + officeId: string; + id: string; + limit: number; + order?: string; + filter?: IntegrationChannelsModels.IntegrationMessageFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId })); + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts new file mode 100644 index 0000000..f0a32a5 --- /dev/null +++ b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InttraOfficeIntegrationAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Read", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ + export const canUseGenerate = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; +} diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts new file mode 100644 index 0000000..e54a3b6 --- /dev/null +++ b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts @@ -0,0 +1,36 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; + +export namespace InttraOfficeIntegrationApi { + export const get = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + config, + ); + }; + + export const generate = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + undefined, + config, + ); + }; + + export const update = ( + officeId: string, + data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts new file mode 100644 index 0000000..607c312 --- /dev/null +++ b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts @@ -0,0 +1,76 @@ +import { z } from "zod"; + +export namespace InttraOfficeIntegrationModels { + /** + * OfficeInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } rotatedByUserId + * @property { string } officeId + * @property { string } sftpUsername + * @property { string } sftpPublicKey + * @property { string } partnerCode + * @property { string } ediId + * @property { string } notificationEmail + */ + export const OfficeInttraCredentialsResponseDtoSchema = z + .object({ + id: z.string(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + rotatedByUserId: z.string().nullish(), + officeId: z.string(), + sftpUsername: z.string().nullish(), + sftpPublicKey: z.string().nullish(), + partnerCode: z.string().nullish(), + ediId: z.string().nullish(), + notificationEmail: z.string().nullish(), + }) + .readonly(); + export type OfficeInttraCredentialsResponseDto = z.infer; + + /** + * GenerateInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } publicKey + * @property { string } rotatedAt + * @property { string } rotatedByUserId + */ + export const GenerateInttraCredentialsResponseDtoSchema = z + .object({ publicKey: z.string(), rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }) + .readonly(); + export type GenerateInttraCredentialsResponseDto = z.infer; + + /** + * UpdateInttraCredentialsRequestDtoSchema + * @type { object } + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } partnerCode + * @property { string } ediId + * @property { string } notificationEmail + */ + export const UpdateInttraCredentialsRequestDtoSchema = z + .object({ + sftpUsername: z.string(), + sftpPassword: z.string(), + partnerCode: z.string(), + ediId: z.string(), + notificationEmail: z.string(), + }) + .readonly(); + export type UpdateInttraCredentialsRequestDto = z.infer; + + /** + * UpdateInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } rotatedAt + * @property { string } rotatedByUserId + */ + export const UpdateInttraCredentialsResponseDtoSchema = z + .object({ rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }) + .readonly(); + export type UpdateInttraCredentialsResponseDto = z.infer; +} diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts new file mode 100644 index 0000000..39b82e3 --- /dev/null +++ b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts @@ -0,0 +1,108 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InttraOfficeIntegrationAcl } from "./inttraOfficeIntegration.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; +import { InttraOfficeIntegrationApi } from "./inttraOfficeIntegration.api"; + +export namespace InttraOfficeIntegrationQueries { + export const moduleName = QueryModule.InttraOfficeIntegration; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string) => [...keys.all, "/offices/:officeId/inttra/credentials", officeId] as const, + }; + + /** + * Query `useGet` + * @summary Get INTTRA credentials for an office + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId }: { officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId), + queryFn: () => { + checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId })); + return InttraOfficeIntegrationApi.get(officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useGenerate` + * @summary Generate and persist INTTRA SFTP RSA key pair for an office + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useGenerate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId }) => { + checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId })); + return InttraOfficeIntegrationApi.generate(officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Manually update INTTRA credentials (username/password/passphrase) + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof InttraOfficeIntegrationApi.update, + { officeId: string; data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId })); + return InttraOfficeIntegrationApi.update(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts new file mode 100644 index 0000000..85c97fc --- /dev/null +++ b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts @@ -0,0 +1,67 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InttraShippingInstructionMessagesAcl { + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List SI messages + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", + ] as AbilityTuple< + "Read", + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create SI message + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", + ] as AbilityTuple< + "Update", + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Get SI message details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ + export const canUseGetById = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", + ] as AbilityTuple< + "Read", + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update SI message + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", + ] as AbilityTuple< + "Update", + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + >; +} diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts new file mode 100644 index 0000000..bc8aaf4 --- /dev/null +++ b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts @@ -0,0 +1,90 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; + +export namespace InttraShippingInstructionMessagesApi { + export const list = ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + limit: number, + page?: number, + cursor?: string, + filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + filter: ZodExtended.parse( + InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + }, + }, + ); + }; + + export const create = ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, + ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), + config, + ); + }; + + export const getById = ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + messageId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, + config, + ); + }; + + export const update = ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + messageId: string, + data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, + ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts new file mode 100644 index 0000000..7942b4b --- /dev/null +++ b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts @@ -0,0 +1,87 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; +import { InttraShippingInstructionMessagesQueries } from "./inttraShippingInstructionMessages.queries"; +import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; + +export namespace InttraShippingInstructionMessagesConfigs { + export const messagesConfig = { + meta: { + title: "Messages", + }, + readAll: { + acl: InttraShippingInstructionMessagesAcl.canUseList, + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, + paginated: InttraShippingInstructionMessagesQueries.useList, + infinite: InttraShippingInstructionMessagesQueries.useListInfinite, + filters: { + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, + options: { + inputs: { + status: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, + options: { + columns: { + id: true, + createdAt: true, + updatedAt: true, + shippingInstructionsId: true, + positionId: true, + createdByUserId: true, + status: true, + fileName: true, + sftpPath: true, + sentAt: true, + uploadAttemptCount: true, + lastUploadError: true, + notes: true, + contrlStatus: true, + contrlReceivedAt: true, + contrlRaw: true, + aperakStatus: true, + aperakReceivedAt: true, + aperakRaw: true, + }, + }, + }), + }, + read: { + acl: InttraShippingInstructionMessagesAcl.canUseGetById, + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema, + query: InttraShippingInstructionMessagesQueries.useGetById, + }, + create: { + acl: InttraShippingInstructionMessagesAcl.canUseCreate, + schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, + mutation: InttraShippingInstructionMessagesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, + options: { + inputs: { + isAmendment: true, + }, + }, + }), + }, + update: { + acl: InttraShippingInstructionMessagesAcl.canUseUpdate, + schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, + mutation: InttraShippingInstructionMessagesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, + options: { + inputs: { + notes: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts new file mode 100644 index 0000000..cf33dde --- /dev/null +++ b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts @@ -0,0 +1,172 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InttraShippingInstructionMessagesModels { + /** + * InttraShippingInstructionStatusEnumSchema + * @type { enum } + */ + export const InttraShippingInstructionStatusEnumSchema = z.enum([ + "PendingUpload", + "Uploaded", + "ContrlAccepted", + "ContrlRejected", + "AperakAccepted", + "AperakRejected", + "FailedUpload", + ]); + export type InttraShippingInstructionStatusEnum = z.infer; + export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStatusEnumSchema.enum; + + /** + * ShippingInstructionMessageListItemResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } shippingInstructionsId + * @property { string } positionId + * @property { string } createdByUserId + * @property { InttraShippingInstructionStatusEnum } status + * @property { string } fileName + * @property { string } sftpPath + * @property { string } sentAt + * @property { number } uploadAttemptCount + * @property { string } lastUploadError + * @property { string } notes + * @property { string } contrlStatus + * @property { string } contrlReceivedAt + * @property { string } contrlRaw + * @property { string } aperakStatus + * @property { string } aperakReceivedAt + * @property { string } aperakRaw + */ + export const ShippingInstructionMessageListItemResponseDtoSchema = z + .object({ + id: z.string(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + shippingInstructionsId: z.string(), + positionId: z.string(), + createdByUserId: z.string(), + status: InttraShippingInstructionStatusEnumSchema, + fileName: z.string(), + sftpPath: z.string(), + sentAt: z.iso.datetime({ offset: true }), + uploadAttemptCount: z.number(), + lastUploadError: z.string().nullish(), + notes: z.string().nullish(), + contrlStatus: z.string().nullish(), + contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), + contrlRaw: z.string().nullish(), + aperakStatus: z.string().nullish(), + aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), + aperakRaw: z.string().nullish(), + }) + .readonly(); + export type ShippingInstructionMessageListItemResponseDto = z.infer< + typeof ShippingInstructionMessageListItemResponseDtoSchema + >; + + /** + * ShippingInstructionMessageFilterDtoSchema + * @type { object } + * @property { InttraShippingInstructionStatusEnum[] } status + */ + export const ShippingInstructionMessageFilterDtoSchema = z + .object({ status: z.array(InttraShippingInstructionStatusEnumSchema).readonly() }) + .readonly(); + export type ShippingInstructionMessageFilterDto = z.infer; + + /** + * ShippingInstructionMessageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } shippingInstructionsId + * @property { string } positionId + * @property { string } createdByUserId + * @property { InttraShippingInstructionStatusEnum } status + * @property { object } shippingInstructionSnapshot + * @property { string } renderedRequestPayload + * @property { string } fileName + * @property { string } sftpPath + * @property { string } sentAt + * @property { number } uploadAttemptCount + * @property { string } lastUploadError + * @property { string } notes + * @property { string } contrlStatus + * @property { string } contrlReceivedAt + * @property { string } contrlRaw + * @property { string } aperakStatus + * @property { string } aperakReceivedAt + * @property { string } aperakRaw + */ + export const ShippingInstructionMessageResponseDtoSchema = z + .object({ + id: z.string(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + shippingInstructionsId: z.string(), + positionId: z.string(), + createdByUserId: z.string(), + status: InttraShippingInstructionStatusEnumSchema, + shippingInstructionSnapshot: z.object({}).readonly(), + renderedRequestPayload: z.string(), + fileName: z.string(), + sftpPath: z.string(), + sentAt: z.iso.datetime({ offset: true }), + uploadAttemptCount: z.number(), + lastUploadError: z.string().nullish(), + notes: z.string().nullish(), + contrlStatus: z.string().nullish(), + contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), + contrlRaw: z.string().nullish(), + aperakStatus: z.string().nullish(), + aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), + aperakRaw: z.string().nullish(), + }) + .readonly(); + export type ShippingInstructionMessageResponseDto = z.infer; + + /** + * UpdateShippingInstructionMessageRequestDtoSchema + * @type { object } + * @property { string } notes + */ + export const UpdateShippingInstructionMessageRequestDtoSchema = z.object({ notes: z.string() }).readonly(); + export type UpdateShippingInstructionMessageRequestDto = z.infer< + typeof UpdateShippingInstructionMessageRequestDtoSchema + >; + + /** + * CreateShippingInstructionMessageRequestDtoSchema + * @type { object } + * @property { boolean } isAmendment Default: `false` + */ + export const CreateShippingInstructionMessageRequestDtoSchema = z + .object({ isAmendment: z.boolean().default(false) }) + .readonly(); + export type CreateShippingInstructionMessageRequestDto = z.infer< + typeof CreateShippingInstructionMessageRequestDtoSchema + >; + + /** + * InttraShippingInstructionMessagesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ShippingInstructionMessageListItemResponseDto[] } items + */ + export const InttraShippingInstructionMessagesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ShippingInstructionMessageListItemResponseDtoSchema).readonly() }).readonly().shape, + }); + export type InttraShippingInstructionMessagesListResponse = z.infer< + typeof InttraShippingInstructionMessagesListResponseSchema + >; +} diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts new file mode 100644 index 0000000..cd6ec39 --- /dev/null +++ b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts @@ -0,0 +1,315 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; +import { InttraShippingInstructionMessagesApi } from "./inttraShippingInstructionMessages.api"; + +export namespace InttraShippingInstructionMessagesQueries { + export const moduleName = QueryModule.InttraShippingInstructionMessages; + + export const keys = { + all: [moduleName] as const, + list: ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + limit?: number, + page?: number, + cursor?: string, + filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", + officeId, + positionId, + shippingInstructionsId, + limit, + page, + cursor, + filter, + ] as const, + listInfinite: ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + limit?: number, + cursor?: string, + filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", + "infinite", + officeId, + positionId, + shippingInstructionsId, + limit, + cursor, + filter, + ] as const, + getById: (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages/:messageId", + officeId, + positionId, + shippingInstructionsId, + messageId, + ] as const, + }; + + /** + * Query `useList` + * @summary List Inttra shipping instruction messages for a position/BL instructions + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + positionId, + shippingInstructionsId, + limit, + page, + cursor, + filter, + }: { + officeId: string; + positionId: string; + shippingInstructionsId: string; + limit: number; + page?: number; + cursor?: string; + filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), + queryFn: () => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId })); + return InttraShippingInstructionMessagesApi.list( + officeId, + positionId, + shippingInstructionsId, + limit, + page, + cursor, + filter, + config, + ); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List Inttra shipping instruction messages for a position/BL instructions + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + officeId, + positionId, + shippingInstructionsId, + limit, + cursor, + filter, + }: { + officeId: string; + positionId: string; + shippingInstructionsId: string; + limit: number; + cursor?: string; + filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), + queryFn: ({ pageParam }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId })); + return InttraShippingInstructionMessagesApi.list( + officeId, + positionId, + shippingInstructionsId, + limit, + pageParam, + cursor, + filter, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create Inttra shipping instruction message + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.shippingInstructionsId Path parameter + * @param { InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof InttraShippingInstructionMessagesApi.create, + { + officeId: string; + positionId: string; + shippingInstructionsId: string; + data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId })); + return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetById` + * @summary Get Inttra shipping instruction message details + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { string } object.messageId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetById = ( + { + officeId, + positionId, + shippingInstructionsId, + messageId, + }: { officeId: string; positionId: string; shippingInstructionsId: string; messageId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), + queryFn: () => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId })); + return InttraShippingInstructionMessagesApi.getById( + officeId, + positionId, + shippingInstructionsId, + messageId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Inttra shipping instruction message + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.shippingInstructionsId Path parameter + * @param { string } mutation.messageId Path parameter + * @param { InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof InttraShippingInstructionMessagesApi.update, + { + officeId: string; + positionId: string; + shippingInstructionsId: string; + messageId: string; + data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId })); + return InttraShippingInstructionMessagesApi.update( + officeId, + positionId, + shippingInstructionsId, + messageId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, shippingInstructionsId, messageId } = variables; + const updateKeys = [keys.getById(officeId, positionId, shippingInstructionsId, messageId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/invoicePayments/invoicePayments.acl.ts b/test/generated/base/invoicePayments/invoicePayments.acl.ts new file mode 100644 index 0000000..6abcc9b --- /dev/null +++ b/test/generated/base/invoicePayments/invoicePayments.acl.ts @@ -0,0 +1,111 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InvoicePaymentsAcl { + /** + * Use for `useListOfficePayments` query ability. For global ability, omit the object parameter. + * @description List office payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListOfficePayments` query + */ + export const canUseListOfficePayments = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useBulkCreatePayments` mutation ability. For global ability, omit the object parameter. + * @description Bulk create invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useBulkCreatePayments` mutation + */ + export const canUseBulkCreatePayments = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useCalculatePayments` mutation ability. For global ability, omit the object parameter. + * @description Calculate invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCalculatePayments` mutation + */ + export const canUseCalculatePayments = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useExportOfficePayments` mutation ability. For global ability, omit the object parameter. + * @description Export office invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportOfficePayments` mutation + */ + export const canUseExportOfficePayments = (object?: { officeId: string }) => + ["Export", object ? subject("InvoicePayment", object) : "InvoicePayment"] as AbilityTuple< + "Export", + "InvoicePayment" | (ForcedSubject<"InvoicePayment"> & { officeId: string }) + >; + + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetPaymentById` query ability. For global ability, omit the object parameter. + * @description Create invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPaymentById` query + */ + export const canUseGetPaymentById = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useDeleteInvoicePayment` mutation ability. For global ability, omit the object parameter. + * @description Delete invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoicePayment` mutation + */ + export const canUseDeleteInvoicePayment = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; +} diff --git a/test/generated/base/invoicePayments/invoicePayments.api.ts b/test/generated/base/invoicePayments/invoicePayments.api.ts new file mode 100644 index 0000000..84e29be --- /dev/null +++ b/test/generated/base/invoicePayments/invoicePayments.api.ts @@ -0,0 +1,181 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; + +export namespace InvoicePaymentsApi { + export const listOfficePayments = ( + officeId: string, + limit: number, + order?: string, + filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, + `/offices/${officeId}/payments`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const bulkCreatePayments = ( + officeId: string, + data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, + `/offices/${officeId}/payments`, + ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), + config, + ); + }; + + export const calculatePayments = ( + officeId: string, + data: InvoicePaymentsModels.CalculatePaymentsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, + `/offices/${officeId}/payments/calculate`, + ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), + config, + ); + }; + + export const exportOfficePayments = ( + officeId: string, + data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payments/exports`, + ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const list = ( + officeId: string, + invoiceId: string, + limit: number, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = ( + officeId: string, + invoiceId: string, + data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments`, + ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), + config, + ); + }; + + export const getPaymentById = ( + officeId: string, + invoiceId: string, + paymentId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + config, + ); + }; + + export const update = ( + officeId: string, + invoiceId: string, + paymentId: string, + data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), + config, + ); + }; + + export const deleteInvoicePayment = ( + officeId: string, + invoiceId: string, + paymentId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/invoicePayments/invoicePayments.configs.ts b/test/generated/base/invoicePayments/invoicePayments.configs.ts new file mode 100644 index 0000000..a5d2a8d --- /dev/null +++ b/test/generated/base/invoicePayments/invoicePayments.configs.ts @@ -0,0 +1,143 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; +import { InvoicePaymentsQueries } from "./invoicePayments.queries"; +import { InvoicePaymentsAcl } from "./invoicePayments.acl"; + +export namespace InvoicePaymentsConfigs { + export const paymentsConfig = { + meta: { + title: "Payments", + }, + readAll: { + acl: InvoicePaymentsAcl.canUseListOfficePayments, + schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, + paginated: InvoicePaymentsQueries.useListOfficePayments, + infinite: InvoicePaymentsQueries.useListOfficePaymentsInfinite, + filters: { + schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, + options: { + inputs: { + search: true, + paymentDate: true, + invoiceIssuingDate: true, + invoiceDirection: true, + createdBy: true, + businessPartner: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, + options: { + columns: { + id: true, + amount: true, + positionNumber: true, + currencyNotation: true, + paymentDate: true, + paymentMethod: true, + comment: true, + createdAt: true, + updatedAt: true, + createdBy: true, + invoice: true, + businessPartner: true, + }, + sortable: InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema, + }, + }), + }, + create: { + acl: InvoicePaymentsAcl.canUseBulkCreatePayments, + schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, + mutation: InvoicePaymentsQueries.useBulkCreatePayments, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, + options: { + inputs: { + paymentDate: true, + invoiceIds: true, + comment: true, + }, + }, + }), + }, + }; + + export const invoicesPaymentsConfig = { + meta: { + title: "Invoices Payments", + }, + readAll: { + acl: InvoicePaymentsAcl.canUseList, + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + paginated: InvoicePaymentsQueries.useList, + infinite: InvoicePaymentsQueries.useListInfinite, + columns: dynamicColumns({ + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + options: { + columns: { + id: true, + amount: true, + currencyNotation: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + bankAccount: true, + comment: true, + createdAt: true, + updatedAt: true, + createdBy: true, + }, + }, + }), + }, + read: { + acl: InvoicePaymentsAcl.canUseGetPaymentById, + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + query: InvoicePaymentsQueries.useGetPaymentById, + }, + create: { + acl: InvoicePaymentsAcl.canUseCreate, + schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, + mutation: InvoicePaymentsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, + options: { + inputs: { + amount: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + comment: true, + }, + }, + }), + }, + update: { + acl: InvoicePaymentsAcl.canUseUpdate, + schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, + mutation: InvoicePaymentsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, + options: { + inputs: { + amount: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + comment: true, + }, + }, + }), + }, + delete: { + acl: InvoicePaymentsAcl.canUseDeleteInvoicePayment, + mutation: InvoicePaymentsQueries.useDeleteInvoicePayment, + }, + }; +} diff --git a/test/generated/base/invoicePayments/invoicePayments.models.ts b/test/generated/base/invoicePayments/invoicePayments.models.ts new file mode 100644 index 0000000..02ad0be --- /dev/null +++ b/test/generated/base/invoicePayments/invoicePayments.models.ts @@ -0,0 +1,470 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicePaymentsModels { + /** + * OfficePaymentTotalAmountsDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ + export const OfficePaymentTotalAmountsDtoSchema = z + .object({ amount: z.number(), currencyNotation: z.string() }) + .readonly(); + export type OfficePaymentTotalAmountsDto = z.infer; + + /** + * OfficePaymentListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { OfficePaymentTotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ + export const OfficePaymentListResponseDtoSchema = z + .object({ + items: z.array(z.string()).readonly().describe("Items"), + totalAmounts: z.array(OfficePaymentTotalAmountsDtoSchema).readonly(), + page: z.number().describe("1-indexed page number to begin from").nullish(), + cursor: z.string().describe("ID of item to start after").nullish(), + nextCursor: z.string().describe("Cursor for next set of items").nullish(), + limit: z.number().describe("Items per response"), + totalItems: z.number().describe("Total available items"), + }) + .readonly(); + export type OfficePaymentListResponseDto = z.infer; + + /** + * OfficePaymentPreviewInvoiceDtoSchema + * @type { object } + * @property { string } id + * @property { string } invoiceNumber + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection + * @property { number } grossAmount + * @property { CommonModels.InvoiceStatusEnum } status + * @property { string } paidOn + * @property { string } issuingDate + */ + export const OfficePaymentPreviewInvoiceDtoSchema = z + .object({ + id: z.string(), + invoiceNumber: z.string(), + invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, + grossAmount: z.number(), + status: CommonModels.InvoiceStatusEnumSchema, + paidOn: z.iso.datetime({ offset: true }).nullable(), + issuingDate: z.iso.datetime({ offset: true }).nullable(), + }) + .readonly(); + export type OfficePaymentPreviewInvoiceDto = z.infer; + + /** + * PaymentMethodEnumSchema + * @type { enum } + */ + export const PaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); + export type PaymentMethodEnum = z.infer; + export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; + + /** + * OfficePaymentPreviewCreatedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type OfficePaymentPreviewCreatedByDto = z.infer; + + /** + * OfficePaymentBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ + export const OfficePaymentBusinessPartnerDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), + }) + .readonly(); + export type OfficePaymentBusinessPartnerDto = z.infer; + + /** + * OfficePaymentPreviewDtoSchema + * @type { object } + * @property { string } id + * @property { number } amount + * @property { string } positionNumber + * @property { string } currencyNotation + * @property { string } paymentDate + * @property { PaymentMethodEnum } paymentMethod + * @property { string } comment + * @property { string } createdAt + * @property { string } updatedAt + * @property { OfficePaymentPreviewCreatedByDto } createdBy + * @property { OfficePaymentPreviewInvoiceDto } invoice + * @property { OfficePaymentBusinessPartnerDto } businessPartner + */ + export const OfficePaymentPreviewDtoSchema = z + .object({ + id: z.string(), + amount: z.number(), + positionNumber: z.string(), + currencyNotation: z.string(), + paymentDate: z.iso.datetime({ offset: true }), + paymentMethod: PaymentMethodEnumSchema, + comment: z.string().nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + createdBy: OfficePaymentPreviewCreatedByDtoSchema, + invoice: OfficePaymentPreviewInvoiceDtoSchema, + businessPartner: OfficePaymentBusinessPartnerDtoSchema.nullish(), + }) + .readonly(); + export type OfficePaymentPreviewDto = z.infer; + + /** + * OfficeInvoicePaymentFilterDtoSchema + * @type { object } + * @property { string } search Search by invoice number + * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range + * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction + * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) + * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) + */ + export const OfficeInvoicePaymentFilterDtoSchema = z + .object({ + search: z.string().describe("Search by invoice number"), + paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), + invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), + invoiceDirection: z + .array(CommonModels.InvoiceDirectionEnumSchema) + .readonly() + .describe("Filter by invoice direction"), + createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), + businessPartner: z + .array(z.string()) + .readonly() + .describe("Filter by invoice customer/business partner (array of UUIDs)"), + }) + .readonly(); + export type OfficeInvoicePaymentFilterDto = z.infer; + + /** + * BulkCreatePaymentBusinessPartnerDtoSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } name Business partner name + * @property { string } paymentDate Payment date applied to the partner invoices + */ + export const BulkCreatePaymentBusinessPartnerDtoSchema = z + .object({ + id: z.string().describe("Business partner ID"), + name: z.string().describe("Business partner name"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date applied to the partner invoices"), + }) + .readonly(); + export type BulkCreatePaymentBusinessPartnerDto = z.infer; + + /** + * BulkCreatePaymentsResponseDtoSchema + * @type { object } + * @property { BulkCreatePaymentBusinessPartnerDto[] } businessPartners List of business partners paid in this bulk operation + */ + export const BulkCreatePaymentsResponseDtoSchema = z + .object({ + businessPartners: z + .array(BulkCreatePaymentBusinessPartnerDtoSchema) + .readonly() + .describe("List of business partners paid in this bulk operation"), + }) + .readonly(); + export type BulkCreatePaymentsResponseDto = z.infer; + + /** + * CalculatePaymentItemDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } businessPartnerName + * @property { number } amount + * @property { string } currency + */ + export const CalculatePaymentItemDtoSchema = z + .object({ + businessPartnerId: z.string(), + businessPartnerName: z.string(), + amount: z.number(), + currency: z.string(), + }) + .readonly(); + export type CalculatePaymentItemDto = z.infer; + + /** + * CalculatePaymentTotalDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currency + */ + export const CalculatePaymentTotalDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); + export type CalculatePaymentTotalDto = z.infer; + + /** + * CalculatePaymentsResponseDtoSchema + * @type { object } + * @property { CalculatePaymentItemDto[] } payments + * @property { CalculatePaymentTotalDto[] } totals + */ + export const CalculatePaymentsResponseDtoSchema = z + .object({ + payments: z.array(CalculatePaymentItemDtoSchema).readonly(), + totals: z.array(CalculatePaymentTotalDtoSchema).readonly(), + }) + .readonly(); + export type CalculatePaymentsResponseDto = z.infer; + + /** + * OfficeInvoicePaymentExportFilterDtoSchema + * @type { object } + * @property { string } search Search by invoice number + * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range + * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction + * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) + * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) + */ + export const OfficeInvoicePaymentExportFilterDtoSchema = z + .object({ + search: z.string().describe("Search by invoice number"), + paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), + invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), + invoiceDirection: z + .array(CommonModels.InvoiceDirectionEnumSchema) + .readonly() + .describe("Filter by invoice direction"), + createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), + businessPartner: z + .array(z.string()) + .readonly() + .describe("Filter by invoice customer/business partner (array of UUIDs)"), + }) + .readonly(); + export type OfficeInvoicePaymentExportFilterDto = z.infer; + + /** + * OfficeInvoicePaymentExportColumnSchema + * @type { enum } + */ + export const OfficeInvoicePaymentExportColumnSchema = z.enum([ + "amount", + "currency", + "paymentDate", + "paymentMethod", + "comment", + "positionNumber", + "invoiceNumber", + "invoiceDirection", + "invoiceStatus", + "invoiceIssuingDate", + "invoiceGrossAmount", + "invoicePaidOn", + "businessPartnerName", + "createdByName", + ]); + export type OfficeInvoicePaymentExportColumn = z.infer; + export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumnSchema.enum; + + /** + * OfficeInvoicePaymentExportRequestDtoSchema + * @type { object } + * @property { OfficeInvoicePaymentExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { OfficeInvoicePaymentExportFilterDto } filter + */ + export const OfficeInvoicePaymentExportRequestDtoSchema = z + .object({ + columns: z.array(OfficeInvoicePaymentExportColumnSchema).readonly().min(1), + order: z.array(z.string()).readonly(), + filter: OfficeInvoicePaymentExportFilterDtoSchema, + }) + .readonly(); + export type OfficeInvoicePaymentExportRequestDto = z.infer; + + /** + * PaymentCreatedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PaymentCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type PaymentCreatedByDto = z.infer; + + /** + * PaymentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { number } amount + * @property { string } currencyNotation + * @property { string } paymentDate + * @property { PaymentMethodEnum } paymentMethod + * @property { string } bankAccountId + * @property { string } bankAccount + * @property { string } comment + * @property { string } createdAt + * @property { string } updatedAt + * @property { PaymentCreatedByDto } createdBy + */ + export const PaymentResponseDtoSchema = z + .object({ + id: z.string(), + amount: z.number(), + currencyNotation: z.string(), + paymentDate: z.iso.datetime({ offset: true }), + paymentMethod: PaymentMethodEnumSchema, + bankAccountId: z.string().nullish(), + bankAccount: z.string().nullish(), + comment: z.string().nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + createdBy: PaymentCreatedByDtoSchema.nullish(), + }) + .readonly(); + export type PaymentResponseDto = z.infer; + + /** + * PositionInvoicePaymentMethodEnumSchema + * @type { enum } + */ + export const PositionInvoicePaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); + export type PositionInvoicePaymentMethodEnum = z.infer; + export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnumSchema.enum; + + /** + * CreateInvoicePaymentRequestDtoSchema + * @type { object } + * @property { number } amount Payment amount + * @property { string } paymentDate Payment date + * @property { PositionInvoicePaymentMethodEnum } paymentMethod Payment method + * @property { string } bankAccountId Bank account ID + * @property { string } comment Optional comment + */ + export const CreateInvoicePaymentRequestDtoSchema = z + .object({ + amount: z.number().describe("Payment amount"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), + paymentMethod: PositionInvoicePaymentMethodEnumSchema.describe("Payment method"), + bankAccountId: z.string().describe("Bank account ID").nullish(), + comment: z.string().describe("Optional comment").nullish(), + }) + .readonly(); + export type CreateInvoicePaymentRequestDto = z.infer; + + /** + * UpdateInvoicePaymentRequestDtoSchema + * @type { object } + * @property { number } amount Payment amount. Minimum: `0.01` + * @property { string } paymentDate Payment date + * @property { string } paymentMethod Payment method + * @property { string } bankAccountId Bank account ID + * @property { string } comment Payment comment + */ + export const UpdateInvoicePaymentRequestDtoSchema = z + .object({ + amount: z.number().gte(0.01).describe("Payment amount"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), + paymentMethod: PaymentMethodEnumSchema.describe("Payment method"), + bankAccountId: z.string().describe("Bank account ID"), + comment: z.string().describe("Payment comment"), + }) + .readonly(); + export type UpdateInvoicePaymentRequestDto = z.infer; + + /** + * BulkCreatePaymentsRequestDtoSchema + * @type { object } + * @property { string } paymentDate Payment date for all payments + * @property { string[] } invoiceIds List of invoice IDs to create payments for. Min Items: `1` + * @property { string } comment + */ + export const BulkCreatePaymentsRequestDtoSchema = z + .object({ + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date for all payments"), + invoiceIds: z.array(z.string()).readonly().min(1).describe("List of invoice IDs to create payments for"), + comment: z.string().nullish(), + }) + .readonly(); + export type BulkCreatePaymentsRequestDto = z.infer; + + /** + * CalculatePaymentsRequestDtoSchema + * @type { object } + * @property { string[] } invoiceIds Invoice IDs (UUID v4). Min Items: `1`. Max Items: `30` + */ + export const CalculatePaymentsRequestDtoSchema = z + .object({ invoiceIds: z.array(z.string()).readonly().min(1).max(30).describe("Invoice IDs (UUID v4)") }) + .readonly(); + export type CalculatePaymentsRequestDto = z.infer; + + /** + * ListOfficePaymentsOrderParamEnumSchema + * @type { enum } + */ + export const ListOfficePaymentsOrderParamEnumSchema = z.enum([ + "paymentDate", + "amount", + "paymentMethod", + "comment", + "createdAt", + "updatedAt", + "currencyNotation", + "createdByName", + "invoiceNumber", + "invoiceDirection", + "invoiceGrossAmount", + "invoiceStatus", + "invoicePaidOn", + "invoiceIssuingDate", + ]); + export type ListOfficePaymentsOrderParamEnum = z.infer; + export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnumSchema.enum; + + /** + * ListOfficePaymentsResponseSchema + * @type { object } + * @property { OfficePaymentTotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficePaymentPreviewDto[] } items + */ + export const ListOfficePaymentsResponseSchema = z.object({ + ...OfficePaymentListResponseDtoSchema.shape, + ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).readonly() }).readonly().shape, + }); + export type ListOfficePaymentsResponse = z.infer; + + /** + * InvoicePaymentsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PaymentResponseDto[] } items + */ + export const InvoicePaymentsListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PaymentResponseDtoSchema).readonly() }).readonly().shape, + }); + export type InvoicePaymentsListResponse = z.infer; +} diff --git a/test/generated/base/invoicePayments/invoicePayments.queries.ts b/test/generated/base/invoicePayments/invoicePayments.queries.ts new file mode 100644 index 0000000..2616d8a --- /dev/null +++ b/test/generated/base/invoicePayments/invoicePayments.queries.ts @@ -0,0 +1,467 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InvoicePaymentsAcl } from "./invoicePayments.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; +import { InvoicePaymentsApi } from "./invoicePayments.api"; + +export namespace InvoicePaymentsQueries { + export const moduleName = QueryModule.InvoicePayments; + + export const keys = { + all: [moduleName] as const, + listOfficePayments: ( + officeId: string, + limit?: number, + order?: string, + filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/payments", officeId, limit, order, filter, page, cursor] as const, + listOfficePaymentsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/payments", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, invoiceId: string, limit?: number, page?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/invoices/:invoiceId/payments", + officeId, + invoiceId, + limit, + page, + cursor, + ] as const, + listInfinite: (officeId: string, invoiceId: string, limit?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/invoices/:invoiceId/payments", + "infinite", + officeId, + invoiceId, + limit, + cursor, + ] as const, + getPaymentById: (officeId: string, invoiceId: string, paymentId: string) => + [ + ...keys.all, + "/offices/:officeId/invoices/:invoiceId/payments/:paymentId", + officeId, + invoiceId, + paymentId, + ] as const, + }; + + /** + * Query `useListOfficePayments` + * @summary List all payments for an office + * @permission Requires `canUseListOfficePayments` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` + * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListOfficePayments = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId })); + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListOfficePaymentsInfinite + * @summary List all payments for an office + * @permission Requires `canUseListOfficePayments` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` + * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListOfficePaymentsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId })); + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useBulkCreatePayments` + * @summary Bulk create payments for multiple invoices + * @permission Requires `canUseBulkCreatePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.BulkCreatePaymentsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useBulkCreatePayments = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.bulkCreatePayments, + { officeId: string; data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId })); + return InvoicePaymentsApi.bulkCreatePayments(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCalculatePayments` + * @summary Calculate grouped payments for provided invoices + * @permission Requires `canUseCalculatePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.CalculatePaymentsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useCalculatePayments = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.calculatePayments, + { officeId: string; data: InvoicePaymentsModels.CalculatePaymentsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId })); + return InvoicePaymentsApi.calculatePayments(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useExportOfficePayments` - recommended when file should not be cached + * @summary Export office invoice payments to Excel + * @permission Requires `canUseExportOfficePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportOfficePayments = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.exportOfficePayments, + { officeId: string; data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId })); + return InvoicePaymentsApi.exportOfficePayments(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useList` + * @summary List payments for an invoice + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + invoiceId, + limit, + page, + cursor, + }: { officeId: string; invoiceId: string; limit: number; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, invoiceId, limit, page, cursor), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseList({ officeId })); + return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List payments for an invoice + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { officeId, invoiceId, limit, cursor }: { officeId: string; invoiceId: string; limit: number; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicePaymentsAcl.canUseList({ officeId })); + return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a payment for an invoice + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicePaymentsModels.CreateInvoicePaymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.create, + { officeId: string; invoiceId: string; data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId })); + return InvoicePaymentsApi.create(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetPaymentById` + * @summary Get a payment by ID + * @permission Requires `canUseGetPaymentById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { string } object.paymentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetPaymentById = ( + { officeId, invoiceId, paymentId }: { officeId: string; invoiceId: string; paymentId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId })); + return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update a payment + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.paymentId Path parameter + * @param { InvoicePaymentsModels.UpdateInvoicePaymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.update, + { + officeId: string; + invoiceId: string; + paymentId: string; + data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, paymentId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId })); + return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId, paymentId } = variables; + const updateKeys = [keys.getPaymentById(officeId, invoiceId, paymentId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteInvoicePayment` + * @summary Delete a payment + * @permission Requires `canUseDeleteInvoicePayment` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.paymentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteInvoicePayment = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.deleteInvoicePayment, + { officeId: string; invoiceId: string; paymentId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, paymentId }) => { + checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId })); + return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/invoices/invoices.acl.ts b/test/generated/base/invoices/invoices.acl.ts new file mode 100644 index 0000000..c9eae2a --- /dev/null +++ b/test/generated/base/invoices/invoices.acl.ts @@ -0,0 +1,375 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InvoicesAcl { + /** + * Use for `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download invoices as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation + */ + export const canUseGetInvoicesEml = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useFind` query ability. For global ability, omit the object parameter. + * @description List invoices for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query + */ + export const canUseFind = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useChangeIncomingCustomer` mutation ability. For global ability, omit the object parameter. + * @description PositionInvoice Fix + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useChangeIncomingCustomer` mutation + */ + export const canUseChangeIncomingCustomer = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useFindByOffice` query ability. For global ability, omit the object parameter. + * @description List invoices for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByOffice` query + */ + export const canUseFindByOffice = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useCreateDraft` mutation ability. For global ability, omit the object parameter. + * @description Create invoice for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDraft` mutation + */ + export const canUseCreateDraft = (object?: { officeId: string }) => + ["Create", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Create", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useExportInvoices` mutation ability. For global ability, omit the object parameter. + * @description Export invoices for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportInvoices` mutation + */ + export const canUseExportInvoices = (object?: { officeId: string }) => + ["Export", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Export", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useExportCharges` mutation ability. For global ability, omit the object parameter. + * @description Export invoice charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportCharges` mutation + */ + export const canUseExportCharges = (object?: { officeId: string }) => + ["Export", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Export", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetUnCharges` query ability. For global ability, omit the object parameter. + * @description List uninvoiced charges for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetUnCharges` query + */ + export const canUseGetUnCharges = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ + export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetOfficeUnCharges` query ability. For global ability, omit the object parameter. + * @description List uninvoiced charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetOfficeUnCharges` query + */ + export const canUseGetOfficeUnCharges = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useExportUnCharges` mutation ability. For global ability, omit the object parameter. + * @description Export uninvoiced charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportUnCharges` mutation + */ + export const canUseExportUnCharges = (object?: { officeId: string }) => + ["Export", object ? subject("UninvoicedCharge", object) : "UninvoicedCharge"] as AbilityTuple< + "Export", + "UninvoicedCharge" | (ForcedSubject<"UninvoicedCharge"> & { officeId: string }) + >; + + /** + * Use for `useCreateDirect` mutation ability. For global ability, omit the object parameter. + * @description Create direct invoice for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDirect` mutation + */ + export const canUseCreateDirect = (object?: { officeId: string }) => + ["CreateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "CreateDirectInvoice", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useAddChargeToDirect` mutation ability. For global ability, omit the object parameter. + * @description Add charge to direct invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddChargeToDirect` mutation + */ + export const canUseAddChargeToDirect = (object?: { officeId: string }) => + ["UpdateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "UpdateDirectInvoice", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCharges` mutation ability. For global ability, omit the object parameter. + * @description Update invoice charges + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCharges` mutation + */ + export const canUseUpdateCharges = (object?: { officeId: string }) => + ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Update", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useRemoveChargeFromDirect` mutation ability. For global ability, omit the object parameter. + * @description Remove charge from direct invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRemoveChargeFromDirect` mutation + */ + export const canUseRemoveChargeFromDirect = (object?: { officeId: string }) => + ["UpdateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "UpdateDirectInvoice", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetDetail` query ability. For global ability, omit the object parameter. + * @description Read invoice details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDetail` query + */ + export const canUseGetDetail = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useDeleteInvoice` mutation ability. For global ability, omit the object parameter. + * @description Delete invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoice` mutation + */ + export const canUseDeleteInvoice = (object?: { officeId: string }) => + ["Delete", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Delete", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useFix` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice accounting issues + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFix` mutation + */ + export const canUseFix = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ + export const canUseGenerate = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useUpdateIssuedVatRules` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice VAT rules + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedVatRules` mutation + */ + export const canUseUpdateIssuedVatRules = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useUpdateIssuedCharges` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice charges + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedCharges` mutation + */ + export const canUseUpdateIssuedCharges = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useIssue` mutation ability. For global ability, omit the object parameter. + * @description Issue invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssue` mutation + */ + export const canUseIssue = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useReportHungarian` mutation ability. For global ability, omit the object parameter. + * @description Report invoice to Hungarian tax authority + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReportHungarian` mutation + */ + export const canUseReportHungarian = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGenerateIncoming` mutation ability. For global ability, omit the object parameter. + * @description Generate incoming invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIncoming` mutation + */ + export const canUseGenerateIncoming = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useRegister` mutation ability. For global ability, omit the object parameter. + * @description Register invoice for bookkeeping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRegister` mutation + */ + export const canUseRegister = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetPreview` query or `useGetPreviewMutation` mutation ability. For global ability, omit the object parameter. + * @description View invoice preview + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` query or `useGetPreviewMutation` mutation + */ + export const canUseGetPreview = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download invoice as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation + */ + export const canUseGetInvoiceEml = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `usePrepareDocumentUpload` mutation ability. For global ability, omit the object parameter. + * @description Upload invoice document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareDocumentUpload` mutation + */ + export const canUsePrepareDocumentUpload = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ + export const canUseCancel = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useIssueCreditNote` mutation ability. For global ability, omit the object parameter. + * @description Issue credit note invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueCreditNote` mutation + */ + export const canUseIssueCreditNote = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; +} diff --git a/test/generated/base/invoices/invoices.api.ts b/test/generated/base/invoices/invoices.api.ts new file mode 100644 index 0000000..2ac0990 --- /dev/null +++ b/test/generated/base/invoices/invoices.api.ts @@ -0,0 +1,537 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicesApi { + export const getInvoicesEml = ( + officeId: string, + invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/eml`, { + ...config, + params: { + invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { + type: "query", + name: "invoiceIds", + }), + }, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }); + }; + + export const find = ( + officeId: string, + positionId: string, + limit: number, + order?: string, + filter?: InvoicesModels.InvoiceFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoicesFindResponseSchema }, + `/offices/${officeId}/positions/${positionId}/invoices`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const changeIncomingCustomer = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.ChangeInvoiceCustomerRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/customer`, + ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), + config, + ); + }; + + export const findByOffice = ( + officeId: string, + limit: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.FindByOfficeResponseSchema }, + `/offices/${officeId}/invoices`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const createDraft = ( + officeId: string, + data: InvoicesModels.CreateDraftInvoiceRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices`, + ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), + config, + ); + }; + + export const exportInvoices = ( + officeId: string, + data: InvoicesModels.InvoiceExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/exports`, + ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const exportCharges = ( + officeId: string, + data: InvoicesModels.InvoiceExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/charges/exports`, + ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const getUnCharges = ( + officeId: string, + positionId: string, + limit: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargePaginationDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.GetUnChargesResponseSchema }, + `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const listAvailablePartnersFor = ( + officeId: string, + invoiceId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/invoices/${invoiceId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { + type: "query", + name: "useCase", + }), + }, + }, + ); + }; + + export const getOfficeUnCharges = ( + officeId: string, + limit: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargesFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, + `/offices/${officeId}/uninvoiced-charges`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const exportUnCharges = ( + officeId: string, + data: InvoicesModels.UninvoicedChargesExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/uninvoiced-charges/exports`, + ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const createDirect = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/offices/${officeId}/direct-invoices`, undefined, config); + }; + + export const addChargeToDirect = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges`, + ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), + config, + ); + }; + + export const updateCharges = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.UpdateInvoiceChargesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges`, + ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), + config, + ); + }; + + export const removeChargeFromDirect = ( + officeId: string, + invoiceId: string, + chargeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, + undefined, + config, + ); + }; + + export const getDetail = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}`, + config, + ); + }; + + export const update = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.UpdateInvoiceRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}`, + ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), + config, + ); + }; + + export const deleteInvoice = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}`, + undefined, + config, + ); + }; + + export const fix = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.FixInvoiceRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix`, + ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), + config, + ); + }; + + export const generate = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/document`, + undefined, + config, + ); + }; + + export const updateIssuedVatRules = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, + ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), + config, + ); + }; + + export const updateIssuedCharges = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, + ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), + config, + ); + }; + + export const issue = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/issue`, + undefined, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const reportHungarian = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, + undefined, + config, + ); + }; + + export const generateIncoming = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, + undefined, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const register = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/register`, + undefined, + config, + ); + }; + + export const getPreview = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/preview`, { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }); + }; + + export const getInvoiceEml = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/eml`, { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }); + }; + + export const prepareDocumentUpload = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.PrepareUploadRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/upload-document`, + ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), + config, + ); + }; + + export const cancel = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/cancel`, + undefined, + config, + ); + }; + + export const issueCreditNote = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/invoices/invoices.configs.ts b/test/generated/base/invoices/invoices.configs.ts new file mode 100644 index 0000000..ced8ba2 --- /dev/null +++ b/test/generated/base/invoices/invoices.configs.ts @@ -0,0 +1,321 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { InvoicesQueries } from "./invoices.queries"; +import { InvoicesAcl } from "./invoices.acl"; + +export namespace InvoicesConfigs { + export const invoicesConfig = { + meta: { + title: "Invoices", + }, + readAll: { + acl: InvoicesAcl.canUseFindByOffice, + schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, + paginated: InvoicesQueries.useFindByOffice, + infinite: InvoicesQueries.useFindByOfficeInfinite, + filters: { + schema: CommonModels.OfficeInvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CommonModels.OfficeInvoiceFilterDtoSchema, + options: { + inputs: { + search: true, + issuingDate: true, + serviceDate: true, + invoiceDirection: true, + invoiceType: true, + collective: true, + amountMin: true, + amountMax: true, + currencyNotation: true, + vatRule: true, + dueDate: true, + status: true, + receiver: true, + receiverCountry: true, + salesRep: true, + positionNumbersString: true, + positionNumbers: true, + invoiceNumbersString: true, + invoiceNumbers: true, + bookkeepingExportStatus: true, + dunningBlock: true, + invoiceInReview: true, + isInvoiceOk: true, + isVatOk: true, + invoiceNumberMin: true, + invoiceNumberMax: true, + internalNumberMin: true, + internalNumberMax: true, + externalSystemId: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + creditorId: true, + debtorId: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, + options: { + columns: { + id: true, + createdAt: true, + invoiceNumber: true, + invoiceDirection: true, + issuingDate: true, + invoiceType: true, + collective: true, + serviceDate: true, + internalNumber: true, + reference: true, + amount: true, + netAmount: true, + tax: true, + currency: true, + dueDate: true, + status: true, + payDate: true, + paidAmount: true, + position: true, + receiver: true, + receiverCountry: true, + clerk: true, + cancelled: true, + ok: true, + isExportedToBookkeeping: true, + dunningBlock: true, + invoiceInReview: true, + vatOk: true, + comments: true, + paymentComment: true, + creditorId: true, + debtorId: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vatRules: true, + }, + sortable: InvoicesModels.FindByOfficeOrderParamEnumSchema, + }, + }), + }, + read: { + acl: InvoicesAcl.canUseGetDetail, + schema: InvoicesModels.InvoiceDetailDtoSchema, + query: InvoicesQueries.useGetDetail, + }, + create: { + acl: InvoicesAcl.canUseCreateDraft, + schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, + mutation: InvoicesQueries.useCreateDraft, + inputDefs: dynamicInputs({ + schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, + options: { + inputs: { + chargeItemIds: true, + invoiceType: true, + customerId: true, + direction: true, + }, + }, + }), + }, + update: { + acl: InvoicesAcl.canUseUpdate, + schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, + mutation: InvoicesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, + options: { + inputs: { + issuingDate: true, + receiptDate: true, + serviceDate: true, + serviceDateUntil: true, + dueDate: true, + invoiceNumber: true, + internalNumber: true, + paymentTermDays: true, + paymentTermType: true, + serviceRecipientId: true, + bankAccountId: true, + remarks: true, + language: true, + showPaymentInstructions: true, + customer: true, + salesRepId: true, + currencyNotation: true, + exchangeRate: true, + }, + }, + }), + }, + delete: { + acl: InvoicesAcl.canUseDeleteInvoice, + mutation: InvoicesQueries.useDeleteInvoice, + }, + }; + + export const uninvoicedChargesConfig = { + meta: { + title: "Uninvoiced Charges", + }, + readAll: { + acl: InvoicesAcl.canUseGetOfficeUnCharges, + schema: InvoicesModels.UninvoicedChargeDtoSchema, + paginated: InvoicesQueries.useGetOfficeUnCharges, + infinite: InvoicesQueries.useGetOfficeUnChargesInfinite, + filters: { + schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, + options: { + inputs: { + direction: true, + chargeItemId: true, + receiverIds: true, + positionIds: true, + chargeTypeIds: true, + serviceDate: true, + currencies: true, + vatRuleIds: true, + employeeIds: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InvoicesModels.UninvoicedChargeDtoSchema, + options: { + columns: { + chargeItemId: true, + invoiceDirection: true, + receiver: true, + position: true, + chargeType: true, + currencyNotation: true, + amount: true, + amountInOfficeCurrency: true, + officeCurrency: true, + exchangeRate: true, + vatRule: true, + serviceDate: true, + status: true, + missingInformation: true, + employee: true, + }, + sortable: InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema, + }, + }), + }, + }; + + export const positionsInvoicesConfig = { + meta: { + title: "Positions Invoices", + }, + readAll: { + acl: InvoicesAcl.canUseFind, + schema: InvoicesModels.InvoicePreviewDtoSchema, + paginated: InvoicesQueries.useFind, + infinite: InvoicesQueries.useFindInfinite, + filters: { + schema: InvoicesModels.InvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.InvoiceFilterDtoSchema, + options: { + inputs: { + status: true, + direction: true, + receiver: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InvoicesModels.InvoicePreviewDtoSchema, + options: { + columns: { + id: true, + invoiceDirection: true, + invoiceType: true, + invoiceNumber: true, + issuingDate: true, + amount: true, + currencyNotation: true, + status: true, + isExportedToBookkeeping: true, + internalNumber: true, + receiver: true, + representative: true, + collective: true, + creditNote: true, + cancelledInvoice: true, + }, + sortable: InvoicesModels.InvoicesFindOrderParamEnumSchema, + }, + }), + }, + }; + + export const positionsUninvoicedChargesConfig = { + meta: { + title: "Positions Uninvoiced Charges", + }, + readAll: { + acl: InvoicesAcl.canUseGetUnCharges, + schema: InvoicesModels.UninvoicedChargeDtoSchema, + paginated: InvoicesQueries.useGetUnCharges, + infinite: InvoicesQueries.useGetUnChargesInfinite, + filters: { + schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, + options: { + inputs: { + direction: true, + chargeItemId: true, + receiverId: true, + chargeTypeId: true, + serviceDate: true, + currency: true, + vatRuleId: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InvoicesModels.UninvoicedChargeDtoSchema, + options: { + columns: { + chargeItemId: true, + invoiceDirection: true, + receiver: true, + position: true, + chargeType: true, + currencyNotation: true, + amount: true, + amountInOfficeCurrency: true, + officeCurrency: true, + exchangeRate: true, + vatRule: true, + serviceDate: true, + status: true, + missingInformation: true, + employee: true, + }, + sortable: InvoicesModels.GetUnChargesOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/invoices/invoices.models.ts b/test/generated/base/invoices/invoices.models.ts new file mode 100644 index 0000000..6d1207e --- /dev/null +++ b/test/generated/base/invoices/invoices.models.ts @@ -0,0 +1,1605 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicesModels { + /** + * InvoiceBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + */ + export const InvoiceBusinessPartnerResponseDtoSchema = z + .object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }) + .readonly(); + export type InvoiceBusinessPartnerResponseDto = z.infer; + + /** + * InvoiceEmployeeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const InvoiceEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type InvoiceEmployeeResponseDto = z.infer; + + /** + * InvoiceRelatedInvoiceResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } internalNumber + */ + export const InvoiceRelatedInvoiceResponseDtoSchema = z + .object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }) + .readonly(); + export type InvoiceRelatedInvoiceResponseDto = z.infer; + + /** + * InvoicePreviewDtoSchema + * @type { object } + * @property { string } id + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection + * @property { CommonModels.InvoiceTypeEnum } invoiceType + * @property { string } invoiceNumber + * @property { string } issuingDate + * @property { number } amount + * @property { string } currencyNotation + * @property { CommonModels.InvoiceStatusEnum } status + * @property { boolean } isExportedToBookkeeping + * @property { string } internalNumber + * @property { InvoiceBusinessPartnerResponseDto } receiver + * @property { InvoiceEmployeeResponseDto } representative + * @property { boolean } collective + * @property { InvoiceRelatedInvoiceResponseDto } creditNote + * @property { InvoiceRelatedInvoiceResponseDto } cancelledInvoice + */ + export const InvoicePreviewDtoSchema = z + .object({ + id: z.string(), + invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, + invoiceType: CommonModels.InvoiceTypeEnumSchema, + invoiceNumber: z.string().nullable(), + issuingDate: z.iso.datetime({ offset: true }).nullish(), + amount: z.number(), + currencyNotation: z.string(), + status: CommonModels.InvoiceStatusEnumSchema, + isExportedToBookkeeping: z.boolean(), + internalNumber: z.string().nullish(), + receiver: InvoiceBusinessPartnerResponseDtoSchema.nullish(), + representative: InvoiceEmployeeResponseDtoSchema.nullish(), + collective: z.boolean(), + creditNote: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), + cancelledInvoice: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), + }) + .readonly(); + export type InvoicePreviewDto = z.infer; + + /** + * InvoicePartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ + export const InvoicePartnerDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), + }) + .readonly(); + export type InvoicePartnerDto = z.infer; + + /** + * InvoicePositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } transportType + * @property { string } ourReference + * @property { string } finalDestination + * @property { InvoicePartnerDto } shipper + * @property { InvoicePartnerDto } consignee + * @property { string } vessel + * @property { string } emptyPickup + * @property { string } loadingAddress + * @property { string } portOfLoading + * @property { string } portOfDischarge + * @property { string } carrierBl + * @property { string } houseBillOfLadingNumber + * @property { string } masterAWB + * @property { string } hawbNumber + * @property { string } flightNo + * @property { string } pickupAddress + * @property { string } originAirport + * @property { string } destinationAirport + * @property { string } originLocation + * @property { string } destinationLocation + * @property { string } dateOfDeparture + * @property { string } dateOfArrival + */ + export const InvoicePositionDtoSchema = z + .object({ + id: z.string(), + number: z.string(), + transportType: z.string(), + ourReference: z.string().nullish(), + finalDestination: z.string().nullish(), + shipper: InvoicePartnerDtoSchema.nullish(), + consignee: InvoicePartnerDtoSchema.nullish(), + vessel: z.string().nullish(), + emptyPickup: z.string().nullish(), + loadingAddress: z.string().nullish(), + portOfLoading: z.string().nullish(), + portOfDischarge: z.string().nullish(), + carrierBl: z.string().nullish(), + houseBillOfLadingNumber: z.string().nullish(), + masterAWB: z.string().nullish(), + hawbNumber: z.string().nullish(), + flightNo: z.string().nullish(), + pickupAddress: z.string().nullish(), + originAirport: z.string().nullish(), + destinationAirport: z.string().nullish(), + originLocation: z.string().nullish(), + destinationLocation: z.string().nullish(), + dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), + dateOfArrival: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type InvoicePositionDto = z.infer; + + /** + * InvoiceChargeTypeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type InvoiceChargeTypeDto = z.infer; + + /** + * InvoiceVatRuleDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { number } rate + */ + export const InvoiceVatRuleDtoSchema = z + .object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }) + .readonly(); + export type InvoiceVatRuleDto = z.infer; + + /** + * InvoiceFinanceLineDtoSchema + * @type { object } + * @property { string } positionChargeItemId + * @property { InvoiceChargeTypeDto } chargeType + * @property { string } additionalText + * @property { number } quantity + * @property { number } netAmount + * @property { number } grossAmount + * @property { number } sumInInvoiceCurrency + * @property { number } sumInOfficeCurrency + * @property { string } currencyNotation + * @property { number } exchangeRate + * @property { InvoiceVatRuleDto } vatRule + * @property { number } exchangedNetAmount + * @property { string } positionNumber + * @property { string } positionId + * @property { string } outgoingInvoiceId + * @property { string } registeredInvoiceId + */ + export const InvoiceFinanceLineDtoSchema = z + .object({ + positionChargeItemId: z.string(), + chargeType: InvoiceChargeTypeDtoSchema, + additionalText: z.string(), + quantity: z.number(), + netAmount: z.number(), + grossAmount: z.number(), + sumInInvoiceCurrency: z.number().nullish(), + sumInOfficeCurrency: z.number().nullish(), + currencyNotation: z.string(), + exchangeRate: z.number().nullish(), + vatRule: InvoiceVatRuleDtoSchema, + exchangedNetAmount: z.number().nullish(), + positionNumber: z.string().nullish(), + positionId: z.string().nullish(), + outgoingInvoiceId: z.string().nullish(), + registeredInvoiceId: z.string().nullish(), + }) + .readonly(); + export type InvoiceFinanceLineDto = z.infer; + + /** + * InvoiceConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl + * @property { string } headerImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ + export const InvoiceConfigDtoSchema = z + .object({ + footerImageUrl: z.string().nullish(), + headerImageUrl: z.string().nullish(), + showWatermarkOnDocuments: z.boolean(), + locale: CommonModels.LocaleEnumSchema.nullish(), + }) + .readonly(); + export type InvoiceConfigDto = z.infer; + + /** + * InvoiceCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { string } address + * @property { string } vatNumber + * @property { string } reference + * @property { string } contact + * @property { string } partnerRegistrationNumber + */ + export const InvoiceCustomerDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string().nullish(), + label: z.string().nullish(), + address: z.string().nullish(), + vatNumber: z.string(), + reference: z.string().nullish(), + contact: z.string().nullish(), + partnerRegistrationNumber: z.string().nullish(), + }) + .readonly(); + export type InvoiceCustomerDto = z.infer; + + /** + * InvoiceOfficeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type InvoiceOfficeDto = z.infer; + + /** + * InvoiceSalesRepDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } phoneNumber + */ + export const InvoiceSalesRepDtoSchema = z + .object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }) + .readonly(); + export type InvoiceSalesRepDto = z.infer; + + /** + * InvoiceServiceRecipientDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } address + * @property { string } vatNumber + * @property { string } partnerRegistrationNumber + */ + export const InvoiceServiceRecipientDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + address: z.string().nullish(), + vatNumber: z.string(), + partnerRegistrationNumber: z.string().nullish(), + }) + .readonly(); + export type InvoiceServiceRecipientDto = z.infer; + + /** + * InvoiceBankAccountDtoSchema + * @type { object } + * @property { string } id + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + * @property { string } name + * @property { boolean } useFooterOnInvoice + * @property { object } footer + * @property { string } footer.mediaUrl + */ + export const InvoiceBankAccountDtoSchema = z + .object({ + id: z.string(), + displayValue: z.string(), + iban: z.string(), + bankName: z.string(), + swiftBic: z.string(), + name: z.string(), + useFooterOnInvoice: z.boolean(), + footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), + }) + .readonly(); + export type InvoiceBankAccountDto = z.infer; + + /** + * InvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ + export const InvoiceRemarksDtoSchema = z + .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) + .readonly(); + export type InvoiceRemarksDto = z.infer; + + /** + * InvoiceVatLineDtoSchema + * @type { object } + * @property { string } vatRuleId ID of the VAT rule + * @property { string } name Name of the VAT rule + * @property { string } printNumber Reference numerical string for vat rules + * @property { string } matchCode Match code of the VAT rule + * @property { number } vatPercentage The actual VAT rate (e.g., 19 for 19%) + * @property { number } netAmount Sum of net amounts from financeLines using this vatRuleId + * @property { number } vatAmount Calculated total VAT for this rate (netAmount * vatPercentage / 100) + * @property { number } grossAmount Sum of netAmount + vatAmount for this rate + * @property { number } vatAmountInOfficeCurrency + * @property { number } netAmountInOfficeCurrency + * @property { number } grossAmountInOfficeCurrency + */ + export const InvoiceVatLineDtoSchema = z + .object({ + vatRuleId: z.string().describe("ID of the VAT rule"), + name: z.string().describe("Name of the VAT rule"), + printNumber: z.string().describe("Reference numerical string for vat rules"), + matchCode: z.string().describe("Match code of the VAT rule"), + vatPercentage: z.number().describe("The actual VAT rate (e.g., 19 for 19%)"), + netAmount: z.number().describe("Sum of net amounts from financeLines using this vatRuleId"), + vatAmount: z.number().describe("Calculated total VAT for this rate (netAmount * vatPercentage / 100)"), + grossAmount: z.number().describe("Sum of netAmount + vatAmount for this rate"), + vatAmountInOfficeCurrency: z.number().nullish(), + netAmountInOfficeCurrency: z.number().nullish(), + grossAmountInOfficeCurrency: z.number().nullish(), + }) + .readonly(); + export type InvoiceVatLineDto = z.infer; + + /** + * RelatedInvoiceDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } internalNumber + */ + export const RelatedInvoiceDetailDtoSchema = z + .object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }) + .readonly(); + export type RelatedInvoiceDetailDto = z.infer; + + /** + * InvoiceLanguageEnumSchema + * @type { enum } + */ + export const InvoiceLanguageEnumSchema = z.enum(["en", "de", "sl", "hu", "cs"]); + export type InvoiceLanguageEnum = z.infer; + export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; + + /** + * InvoiceDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } rootFolderId + * @property { string } invoiceDirection + * @property { string } invoiceType + * @property { string } invoiceNumber + * @property { string } costCenter + * @property { string } status + * @property { string } language + * @property { boolean } isVatOk + * @property { boolean } isInvoiceOk + * @property { string } issuingDate + * @property { string } receiptDate + * @property { string } serviceDate + * @property { string } serviceDateUntil + * @property { string } dueDate + * @property { string } internalNumber + * @property { boolean } isExportedToBookkeeping + * @property { string } sentAt + * @property { string } creditNoteId + * @property { string } draftCreditNoteId + * @property { string } cancelledInvoiceId + * @property { string } uploadedDocumentUrl + * @property { InvoiceCustomerDto } customer + * @property { string } customerNumber + * @property { string } customerNameOverride + * @property { string } customerReferenceOverride + * @property { string } customerContactOverride + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { InvoicePositionDto } position + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { InvoiceOfficeDto } salesOffice + * @property { InvoiceSalesRepDto } salesRep + * @property { number } totalNet + * @property { number } totalVat + * @property { number } totalGross + * @property { string } currencyNotation + * @property { number } exchangeRate + * @property { number } paymentTermDays + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { InvoiceServiceRecipientDto } serviceRecipient + * @property { boolean } showPaymentInstructions + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { string } comments + * @property { InvoiceBankAccountDto } bankAccount + * @property { InvoiceFinanceLineDto[] } financeLines + * @property { InvoiceRemarksDto } remarks + * @property { InvoiceVatLineDto[] } vatLines + * @property { InvoiceConfigDto } config + * @property { RelatedInvoiceDetailDto } creditNote + * @property { RelatedInvoiceDetailDto } draftCreditNote + * @property { RelatedInvoiceDetailDto } cancelledInvoice + * @property { string } officeCurrencyNotation + * @property { string } inverseCurrencyNotation + * @property { number } inverseExchangeRate + * @property { boolean } requiresSpecialTablePresentation + * @property { number } paidAmount + * @property { number } outstandingAmount + * @property { string } paidOn + * @property { boolean } isIssued + * @property { number } grossAmountInOfficeCurrency + * @property { string } createdAt + */ + export const InvoiceDetailDtoSchema = z + .object({ + id: z.string(), + rootFolderId: z.string().nullish(), + invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, + invoiceType: CommonModels.InvoiceTypeEnumSchema, + invoiceNumber: z.string().nullish(), + costCenter: z.string().nullish(), + status: CommonModels.InvoiceStatusEnumSchema, + language: InvoiceLanguageEnumSchema, + isVatOk: z.boolean(), + isInvoiceOk: z.boolean(), + issuingDate: z.iso.datetime({ offset: true }).nullish(), + receiptDate: z.iso.datetime({ offset: true }).nullish(), + serviceDate: z.iso.datetime({ offset: true }).nullish(), + serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), + dueDate: z.iso.datetime({ offset: true }).nullish(), + internalNumber: z.string().nullish(), + isExportedToBookkeeping: z.boolean(), + sentAt: z.iso.datetime({ offset: true }).nullish(), + creditNoteId: z.string().nullish(), + draftCreditNoteId: z.string().nullish(), + cancelledInvoiceId: z.string().nullish(), + uploadedDocumentUrl: z.string().nullish(), + customer: InvoiceCustomerDtoSchema.nullish(), + customerNumber: z.string().nullish(), + customerNameOverride: z.string().nullish(), + customerReferenceOverride: z.string().nullish(), + customerContactOverride: z.string().nullish(), + showInvoiceVatLinesInOfficeCurrency: z.boolean(), + position: InvoicePositionDtoSchema.nullish(), + serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), + salesOffice: InvoiceOfficeDtoSchema, + salesRep: InvoiceSalesRepDtoSchema, + totalNet: z.number(), + totalVat: z.number().nullish(), + totalGross: z.number(), + currencyNotation: z.string(), + exchangeRate: z.number().nullish(), + paymentTermDays: z.number().nullish(), + paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), + serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), + showPaymentInstructions: z.boolean().nullish(), + dunningBlock: z.boolean().nullish(), + invoiceInReview: z.boolean().nullish(), + comments: z.string().nullish(), + bankAccount: InvoiceBankAccountDtoSchema.nullish(), + financeLines: z.array(InvoiceFinanceLineDtoSchema).readonly(), + remarks: InvoiceRemarksDtoSchema.nullish(), + vatLines: z.array(InvoiceVatLineDtoSchema).readonly(), + config: InvoiceConfigDtoSchema.nullish(), + creditNote: RelatedInvoiceDetailDtoSchema.nullish(), + draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), + cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), + officeCurrencyNotation: z.string().nullish(), + inverseCurrencyNotation: z.string().nullish(), + inverseExchangeRate: z.number().nullish(), + requiresSpecialTablePresentation: z.boolean().nullish(), + paidAmount: z.number(), + outstandingAmount: z.number(), + paidOn: z.iso.datetime({ offset: true }).nullish(), + isIssued: z.boolean(), + grossAmountInOfficeCurrency: z.number().nullish(), + createdAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type InvoiceDetailDto = z.infer; + + /** + * TotalAmountsDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ + export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); + export type TotalAmountsDto = z.infer; + + /** + * OfficeInvoiceListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalAmountInDefaultCurrency + * @property { string } defaultCurrencyNotation + * @property { TotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ + export const OfficeInvoiceListResponseDtoSchema = z + .object({ + items: z.array(z.string()).readonly().describe("Items"), + totalAmountInDefaultCurrency: z.number().nullish(), + defaultCurrencyNotation: z.string().nullish(), + totalAmounts: z.array(TotalAmountsDtoSchema).readonly(), + page: z.number().describe("1-indexed page number to begin from").nullish(), + cursor: z.string().describe("ID of item to start after").nullish(), + nextCursor: z.string().describe("Cursor for next set of items").nullish(), + limit: z.number().describe("Items per response"), + totalItems: z.number().describe("Total available items"), + }) + .readonly(); + export type OfficeInvoiceListResponseDto = z.infer; + + /** + * InvoicePreviewPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } externalSystemId + */ + export const InvoicePreviewPositionDtoSchema = z + .object({ id: z.string(), number: z.string(), externalSystemId: z.string().nullish() }) + .readonly(); + export type InvoicePreviewPositionDto = z.infer; + + /** + * InvoicePreviewReceiverDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + */ + export const InvoicePreviewReceiverDtoSchema = z + .object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }) + .readonly(); + export type InvoicePreviewReceiverDto = z.infer; + + /** + * InvoicePreviewReceiverCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const InvoicePreviewReceiverCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type InvoicePreviewReceiverCountryDto = z.infer; + + /** + * InvoicePreviewClerkDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const InvoicePreviewClerkDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type InvoicePreviewClerkDto = z.infer; + + /** + * VatRuleLabelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } matchCode + * @property { string } name + */ + export const VatRuleLabelResponseDtoSchema = z + .object({ id: z.string(), matchCode: z.string(), name: z.string() }) + .readonly(); + export type VatRuleLabelResponseDto = z.infer; + + /** + * OfficeInvoicePreviewDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } invoiceNumber + * @property { string } invoiceDirection + * @property { string } issuingDate + * @property { CommonModels.InvoiceTypeEnum } invoiceType + * @property { boolean } collective + * @property { string } serviceDate + * @property { string } internalNumber + * @property { string } reference + * @property { number } amount + * @property { number } netAmount + * @property { number } tax + * @property { string } currency + * @property { string } dueDate + * @property { CommonModels.InvoiceStatusEnum } status + * @property { string } payDate + * @property { number } paidAmount + * @property { InvoicePreviewPositionDto } position + * @property { InvoicePreviewReceiverDto } receiver + * @property { InvoicePreviewReceiverCountryDto } receiverCountry + * @property { InvoicePreviewClerkDto } clerk + * @property { boolean } cancelled + * @property { boolean } ok + * @property { boolean } isExportedToBookkeeping + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { boolean } vatOk + * @property { string } comments + * @property { string } paymentComment + * @property { string } creditorId + * @property { string } debtorId + * @property { string } hblNumber + * @property { string } mblNumber + * @property { string } bookingNumber + * @property { string } vessel + * @property { string } voyage + * @property { VatRuleLabelResponseDto[] } vatRules + */ + export const OfficeInvoicePreviewDtoSchema = z + .object({ + id: z.string(), + createdAt: z.iso.datetime({ offset: true }), + invoiceNumber: z.string().nullish(), + invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, + issuingDate: z.iso.datetime({ offset: true }).nullish(), + invoiceType: CommonModels.InvoiceTypeEnumSchema, + collective: z.boolean(), + serviceDate: z.iso.datetime({ offset: true }).nullish(), + internalNumber: z.string().nullish(), + reference: z.string().nullish(), + amount: z.number(), + netAmount: z.number(), + tax: z.number(), + currency: z.string(), + dueDate: z.iso.datetime({ offset: true }).nullish(), + status: CommonModels.InvoiceStatusEnumSchema, + payDate: z.iso.datetime({ offset: true }).nullish(), + paidAmount: z.number().nullish(), + position: InvoicePreviewPositionDtoSchema.nullish(), + receiver: InvoicePreviewReceiverDtoSchema.nullish(), + receiverCountry: InvoicePreviewReceiverCountryDtoSchema.nullish(), + clerk: InvoicePreviewClerkDtoSchema.nullish(), + cancelled: z.boolean(), + ok: z.boolean(), + isExportedToBookkeeping: z.boolean(), + dunningBlock: z.boolean(), + invoiceInReview: z.boolean(), + vatOk: z.boolean(), + comments: z.string().nullish(), + paymentComment: z.string().nullish(), + creditorId: z.string().nullish(), + debtorId: z.string().nullish(), + hblNumber: z.string().nullish(), + mblNumber: z.string().nullish(), + bookingNumber: z.string().nullish(), + vessel: z.string().nullish(), + voyage: z.string().nullish(), + vatRules: z.array(VatRuleLabelResponseDtoSchema).readonly().nullish(), + }) + .readonly(); + export type OfficeInvoicePreviewDto = z.infer; + + /** + * InvoiceExportFilterDtoSchema + * @type { object } + * @property { string } search + * @property { CommonModels.DateRangeDto } issuingDate + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection + * @property { CommonModels.InvoiceTypeEnum[] } invoiceType + * @property { CommonModels.BooleanFilterEnum[] } collective + * @property { number } amountMin + * @property { number } amountMax + * @property { string[] } currencyNotation + * @property { CommonModels.DateRangeDto } dueDate + * @property { CommonModels.InvoiceStatusEnum[] } status + * @property { string[] } receiver Filter by invoice receiver/customer ID (UUID) + * @property { string } positionNumbersString + * @property { string[] } positionNumbers + * @property { string } invoiceNumbersString + * @property { string[] } invoiceNumbers + * @property { CommonModels.BooleanFilterEnum[] } bookkeepingExportStatus + * @property { CommonModels.BooleanFilterEnum[] } dunningBlock + * @property { CommonModels.BooleanFilterEnum[] } invoiceInReview + * @property { CommonModels.BooleanFilterEnum[] } isInvoiceOk + * @property { CommonModels.BooleanFilterEnum[] } isVatOk + * @property { number } invoiceNumberMin + * @property { number } invoiceNumberMax + * @property { number } internalNumberMin + * @property { number } internalNumberMax + */ + export const InvoiceExportFilterDtoSchema = z + .object({ + search: z.string(), + issuingDate: CommonModels.DateRangeDtoSchema, + serviceDate: CommonModels.DateRangeDtoSchema, + invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), + invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), + collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + amountMin: z.number(), + amountMax: z.number(), + currencyNotation: z.array(z.string()).readonly(), + dueDate: CommonModels.DateRangeDtoSchema, + status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), + receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer ID (UUID)"), + positionNumbersString: z.string(), + positionNumbers: z.array(z.string()).readonly(), + invoiceNumbersString: z.string(), + invoiceNumbers: z.array(z.string()).readonly(), + bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + invoiceNumberMin: z.number(), + invoiceNumberMax: z.number(), + internalNumberMin: z.number(), + internalNumberMax: z.number(), + }) + .readonly(); + export type InvoiceExportFilterDto = z.infer; + + /** + * InvoiceExportColumnSchema + * @type { enum } + */ + export const InvoiceExportColumnSchema = z.enum([ + "invoiceNumber", + "invoiceDirection", + "issuingDate", + "invoiceType", + "collective", + "serviceDate", + "internalNumber", + "reference", + "totalGross", + "totalNet", + "totalVat", + "currency", + "dueDate", + "status", + "payDate", + "paidAmount", + "positionNumber", + "hblHawb", + "mblMawb", + "bookingNumber", + "vessel", + "voyage", + "receiverName", + "receiverCountry", + "clerkName", + "cancelled", + "ok", + "vatOk", + "dunningBlock", + "invoiceInReview", + "exportedToBookkeeping", + "comments", + "paymentComment", + "vatRuleIds", + "creditorId", + "debtorId", + "createdAt", + ]); + export type InvoiceExportColumn = z.infer; + export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; + + /** + * InvoiceExportRequestDtoSchema + * @type { object } + * @property { InvoiceExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { InvoiceExportFilterDto } filter + */ + export const InvoiceExportRequestDtoSchema = z + .object({ + columns: z.array(InvoiceExportColumnSchema).readonly().min(1), + order: z.array(z.string()).readonly(), + filter: InvoiceExportFilterDtoSchema, + }) + .readonly(); + export type InvoiceExportRequestDto = z.infer; + + /** + * UninvoicedChargeTotalAmountDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ + export const UninvoicedChargeTotalAmountDtoSchema = z + .object({ amount: z.number(), currencyNotation: z.string() }) + .readonly(); + export type UninvoicedChargeTotalAmountDto = z.infer; + + /** + * UninvoicedChargeListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ + export const UninvoicedChargeListResponseDtoSchema = z + .object({ + items: z.array(z.string()).readonly().describe("Items"), + totalAmounts: z.array(UninvoicedChargeTotalAmountDtoSchema).readonly(), + page: z.number().describe("1-indexed page number to begin from").nullish(), + cursor: z.string().describe("ID of item to start after").nullish(), + nextCursor: z.string().describe("Cursor for next set of items").nullish(), + limit: z.number().describe("Items per response"), + totalItems: z.number().describe("Total available items"), + }) + .readonly(); + export type UninvoicedChargeListResponseDto = z.infer; + + /** + * ReceiverDtoSchema + * @type { object } + * @property { string } id Business Partner ID (Customer or Vendor) + * @property { string } name Business Partner name + * @property { string } matchCode Business Partner match code + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ + export const ReceiverDtoSchema = z + .object({ + id: z.string().describe("Business Partner ID (Customer or Vendor)"), + name: z.string().describe("Business Partner name"), + matchCode: z.string().describe("Business Partner match code"), + label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), + }) + .readonly(); + export type ReceiverDto = z.infer; + + /** + * UninvoicedChargePositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ + export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); + export type UninvoicedChargePositionDto = z.infer; + + /** + * UninvoicedChargeChargeTypeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const UninvoicedChargeChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type UninvoicedChargeChargeTypeDto = z.infer; + + /** + * UninvoicedChargeVatRuleDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchcode + */ + export const UninvoicedChargeVatRuleDtoSchema = z + .object({ id: z.string(), name: z.string(), matchcode: z.string() }) + .readonly(); + export type UninvoicedChargeVatRuleDto = z.infer; + + /** + * UninvoicedChargeGroupStatusEnumSchema + * @type { enum } + */ + export const UninvoicedChargeGroupStatusEnumSchema = z.enum(["ReadyForInvoice", "MissingInformation"]); + export type UninvoicedChargeGroupStatusEnum = z.infer; + export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSchema.enum; + + /** + * UninvoicedChargeEmployeeDtoSchema + * @type { object } + * @property { string } id + * @property { string } firstName + * @property { string } lastName + * @property { string } fullName + */ + export const UninvoicedChargeEmployeeDtoSchema = z + .object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }) + .readonly(); + export type UninvoicedChargeEmployeeDto = z.infer; + + /** + * UninvoicedChargeDtoSchema + * @type { object } + * @property { string } chargeItemId + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection Invoice direction (Incoming or Outgoing) + * @property { ReceiverDto } receiver Business Partner receiving the invoice + * @property { UninvoicedChargePositionDto } position + * @property { UninvoicedChargeChargeTypeDto } chargeType + * @property { string } currencyNotation ISO 4217 currency code + * @property { number } amount Charge amount in charge currency + * @property { number } amountInOfficeCurrency Charge amount in office currency + * @property { string } officeCurrency Office currency code + * @property { number } exchangeRate + * @property { UninvoicedChargeVatRuleDto } vatRule + * @property { string } serviceDate + * @property { UninvoicedChargeGroupStatusEnum } status Status of charge group + * @property { string[] } missingInformation Missing fields required for invoicing this charge + * @property { UninvoicedChargeEmployeeDto } employee + */ + export const UninvoicedChargeDtoSchema = z + .object({ + chargeItemId: z.string(), + invoiceDirection: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction (Incoming or Outgoing)"), + receiver: ReceiverDtoSchema.describe("Business Partner receiving the invoice"), + position: UninvoicedChargePositionDtoSchema, + chargeType: UninvoicedChargeChargeTypeDtoSchema.nullish(), + currencyNotation: z.string().describe("ISO 4217 currency code"), + amount: z.number().describe("Charge amount in charge currency"), + amountInOfficeCurrency: z.number().describe("Charge amount in office currency"), + officeCurrency: z.string().describe("Office currency code"), + exchangeRate: z.number().nullish(), + vatRule: UninvoicedChargeVatRuleDtoSchema.nullish(), + serviceDate: z.iso.datetime({ offset: true }).nullish(), + status: UninvoicedChargeGroupStatusEnumSchema.describe("Status of charge group"), + missingInformation: z + .array(z.string()) + .readonly() + .describe("Missing fields required for invoicing this charge") + .nullish(), + employee: UninvoicedChargeEmployeeDtoSchema.nullish(), + }) + .readonly(); + export type UninvoicedChargeDto = z.infer; + + /** + * UninvoicedChargePaginationDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string } receiverId + * @property { string } chargeTypeId + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currency + * @property { string } vatRuleId + */ + export const UninvoicedChargePaginationDtoSchema = z + .object({ + direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), + chargeItemId: z.string(), + receiverId: z.string(), + chargeTypeId: z.string(), + serviceDate: CommonModels.DateRangeDtoSchema, + currency: z.array(z.string()).readonly(), + vatRuleId: z.string(), + }) + .readonly(); + export type UninvoicedChargePaginationDto = z.infer; + + /** + * UninvoicedChargesFilterDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string[] } receiverIds + * @property { string[] } positionIds + * @property { string[] } chargeTypeIds + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currencies + * @property { string[] } vatRuleIds + * @property { string[] } employeeIds + */ + export const UninvoicedChargesFilterDtoSchema = z + .object({ + direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), + chargeItemId: z.string(), + receiverIds: z.array(z.string()).readonly(), + positionIds: z.array(z.string()).readonly(), + chargeTypeIds: z.array(z.string()).readonly(), + serviceDate: CommonModels.DateRangeDtoSchema, + currencies: z.array(z.string()).readonly(), + vatRuleIds: z.array(z.string()).readonly(), + employeeIds: z.array(z.string()).readonly(), + }) + .readonly(); + export type UninvoicedChargesFilterDto = z.infer; + + /** + * UninvoicedChargesExportFilterDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string[] } receiverIds + * @property { string[] } positionIds + * @property { string[] } chargeTypeIds + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currencies + * @property { string[] } vatRuleIds + */ + export const UninvoicedChargesExportFilterDtoSchema = z + .object({ + direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), + chargeItemId: z.string(), + receiverIds: z.array(z.string()).readonly(), + positionIds: z.array(z.string()).readonly(), + chargeTypeIds: z.array(z.string()).readonly(), + serviceDate: CommonModels.DateRangeDtoSchema, + currencies: z.array(z.string()).readonly(), + vatRuleIds: z.array(z.string()).readonly(), + }) + .readonly(); + export type UninvoicedChargesExportFilterDto = z.infer; + + /** + * UninvoicedChargeExportColumnSchema + * @type { enum } + */ + export const UninvoicedChargeExportColumnSchema = z.enum([ + "chargeItemId", + "invoiceDirection", + "status", + "receiverName", + "positionNumber", + "serviceDate", + "employee", + "chargeTypeName", + "amount", + "currency", + "exchangeRate", + "amountInOfficeCurrency", + "officeCurrency", + "vatRule", + ]); + export type UninvoicedChargeExportColumn = z.infer; + export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.enum; + + /** + * UninvoicedChargesExportRequestDtoSchema + * @type { object } + * @property { UninvoicedChargeExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { UninvoicedChargesExportFilterDto } filter + */ + export const UninvoicedChargesExportRequestDtoSchema = z + .object({ + columns: z.array(UninvoicedChargeExportColumnSchema).readonly().min(1), + order: z.array(z.string()).readonly(), + filter: UninvoicedChargesExportFilterDtoSchema, + }) + .readonly(); + export type UninvoicedChargesExportRequestDto = z.infer; + + /** + * CreateDraftInvoiceRequestDtoSchema + * @type { object } + * @property { string[] } chargeItemIds Charge item IDs to include in the invoice. Min Items: `1` + * @property { CommonModels.InvoiceTypeEnum } invoiceType Type of invoice + * @property { string } customerId Customer ID (required for outgoing invoices) + * @property { CommonModels.InvoiceDirectionEnum } direction Invoice direction + */ + export const CreateDraftInvoiceRequestDtoSchema = z + .object({ + chargeItemIds: z + .array(z.string()) + .readonly() + .min(1) + .describe("Charge item IDs to include in the invoice") + .nullish(), + invoiceType: CommonModels.InvoiceTypeEnumSchema.describe("Type of invoice"), + customerId: z.string().describe("Customer ID (required for outgoing invoices)"), + direction: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction"), + }) + .readonly(); + export type CreateDraftInvoiceRequestDto = z.infer; + + /** + * UpdateInvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ + export const UpdateInvoiceRemarksDtoSchema = z + .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) + .readonly(); + export type UpdateInvoiceRemarksDto = z.infer; + + /** + * UpdateInvoiceCustomerDtoSchema + * @type { object } + * @property { string } name + * @property { string } reference + * @property { string } contact + */ + export const UpdateInvoiceCustomerDtoSchema = z + .object({ name: z.string(), reference: z.string(), contact: z.string() }) + .readonly(); + export type UpdateInvoiceCustomerDto = z.infer; + + /** + * UpdateInvoiceRequestDtoSchema + * @type { object } + * @property { string } issuingDate Invoice date in ISO format + * @property { string } receiptDate Receipt date in ISO format + * @property { string } serviceDate Service date in ISO format + * @property { string } serviceDateUntil Service end date in ISO format + * @property { string } dueDate Due date in ISO format + * @property { string } invoiceNumber Invoice number + * @property { string } internalNumber Internal reference number + * @property { number } paymentTermDays Payment term in days + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { string } serviceRecipientId Service recipient ID + * @property { string } bankAccountId Bank account ID + * @property { UpdateInvoiceRemarksDto } remarks Additional remarks + * @property { InvoiceLanguageEnum } language Invoice language + * @property { boolean } showPaymentInstructions + * @property { UpdateInvoiceCustomerDto } customer + * @property { string } salesRepId + * @property { string } currencyNotation + * @property { number } exchangeRate Invoice exchange rate + */ + export const UpdateInvoiceRequestDtoSchema = z + .object({ + issuingDate: z.iso.datetime({ offset: true }).describe("Invoice date in ISO format"), + receiptDate: z.iso.datetime({ offset: true }).describe("Receipt date in ISO format"), + serviceDate: z.iso.datetime({ offset: true }).describe("Service date in ISO format"), + serviceDateUntil: z.iso.datetime({ offset: true }).describe("Service end date in ISO format"), + dueDate: z.iso.datetime({ offset: true }).describe("Due date in ISO format").nullable(), + invoiceNumber: z.string().describe("Invoice number").nullable(), + internalNumber: z.string().describe("Internal reference number").nullable(), + paymentTermDays: z.number().describe("Payment term in days").nullable(), + paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, + serviceRecipientId: z.string().describe("Service recipient ID").nullable(), + bankAccountId: z.string().describe("Bank account ID").nullable(), + remarks: UpdateInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), + language: InvoiceLanguageEnumSchema.describe("Invoice language"), + showPaymentInstructions: z.boolean(), + customer: UpdateInvoiceCustomerDtoSchema, + salesRepId: z.string(), + currencyNotation: z.string(), + exchangeRate: z.number().describe("Invoice exchange rate").nullable(), + }) + .readonly(); + export type UpdateInvoiceRequestDto = z.infer; + + /** + * FixInvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ + export const FixInvoiceRemarksDtoSchema = z + .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) + .readonly(); + export type FixInvoiceRemarksDto = z.infer; + + /** + * FixInvoiceCustomerDtoSchema + * @type { object } + * @property { string } reference Customer reference number + */ + export const FixInvoiceCustomerDtoSchema = z + .object({ reference: z.string().describe("Customer reference number") }) + .readonly(); + export type FixInvoiceCustomerDto = z.infer; + + /** + * FixInvoiceRequestDtoSchema + * @type { object } + * @property { string } currencyNotation Invoice currency (incoming invoices only) + * @property { string } issuingDate Update invoice date in ISO format + * @property { string } dueDate Update invoice due date in ISO format + * @property { number } exchangeRate Invoice exchange rate + * @property { number } paymentTermDays Payment term in days + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { string } receiptDate Update receipt date in ISO format + * @property { string } serviceDate Update service date in ISO format + * @property { string } serviceDateUntil Update service end date in ISO format + * @property { boolean } isVatOk Mark VAT as checked/OK by accounting + * @property { boolean } isInvoiceOk Mark overall invoice as checked/OK by accounting + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { string } comments + * @property { FixInvoiceRemarksDto } remarks Additional remarks + * @property { string } invoiceNumber Invoice number (incoming invoices only) + * @property { string } bankAccountId Bank account ID + * @property { string } serviceRecipientId Service recipient ID + * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) + */ + export const FixInvoiceRequestDtoSchema = z + .object({ + currencyNotation: z.string().describe("Invoice currency (incoming invoices only)"), + issuingDate: z.iso.datetime({ offset: true }).describe("Update invoice date in ISO format"), + dueDate: z.iso.datetime({ offset: true }).describe("Update invoice due date in ISO format"), + exchangeRate: z.number().describe("Invoice exchange rate").nullable(), + paymentTermDays: z.number().describe("Payment term in days").nullable(), + paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, + receiptDate: z.iso.datetime({ offset: true }).describe("Update receipt date in ISO format"), + serviceDate: z.iso.datetime({ offset: true }).describe("Update service date in ISO format").nullable(), + serviceDateUntil: z.iso.datetime({ offset: true }).describe("Update service end date in ISO format"), + isVatOk: z.boolean().describe("Mark VAT as checked/OK by accounting"), + isInvoiceOk: z.boolean().describe("Mark overall invoice as checked/OK by accounting"), + dunningBlock: z.boolean(), + invoiceInReview: z.boolean(), + comments: z.string(), + remarks: FixInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), + invoiceNumber: z.string().describe("Invoice number (incoming invoices only)").nullable(), + bankAccountId: z.string().describe("Bank account ID").nullable(), + serviceRecipientId: z.string().describe("Service recipient ID").nullable(), + customer: FixInvoiceCustomerDtoSchema.describe("Customer reference (incoming invoices only)"), + }) + .readonly(); + export type FixInvoiceRequestDto = z.infer; + + /** + * UpdateIssuedInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity. Minimum: `0` + * @property { number } amount Amount (must be positive). Minimum: `0.01` + * @property { string } vatRuleId VAT rule ID + * @property { number } exchangeRate Charge exchange rate (incoming invoices only) + * @property { string } currencyNotation + */ + export const UpdateIssuedInvoiceChargeRequestDtoSchema = z + .object({ + positionChargeItemId: z.string().describe("Position charge item ID"), + chargeTypeId: z.string().describe("Charge type ID").nullish(), + additionalText: z.string().describe("Additional text for the charge").nullish(), + quantity: z.number().gte(0).describe("Quantity").nullish(), + amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), + vatRuleId: z.string().describe("VAT rule ID").nullish(), + exchangeRate: z.number().describe("Charge exchange rate (incoming invoices only)").nullish(), + currencyNotation: z.string().nullish(), + }) + .readonly(); + export type UpdateIssuedInvoiceChargeRequestDto = z.infer; + + /** + * UpdateIssuedInvoiceChargesRequestDtoSchema + * @type { object } + * @property { UpdateIssuedInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` + */ + export const UpdateIssuedInvoiceChargesRequestDtoSchema = z + .object({ + charges: z.array(UpdateIssuedInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates"), + }) + .readonly(); + export type UpdateIssuedInvoiceChargesRequestDto = z.infer; + + /** + * UpdateInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity. Minimum: `0` + * @property { number } amount Amount (must be positive). Minimum: `0.01` + * @property { string } vatRuleId VAT rule ID + * @property { number } exchangeRate + * @property { string } currencyNotation + */ + export const UpdateInvoiceChargeRequestDtoSchema = z + .object({ + positionChargeItemId: z.string().describe("Position charge item ID"), + chargeTypeId: z.string().describe("Charge type ID").nullish(), + additionalText: z.string().describe("Additional text for the charge").nullish(), + quantity: z.number().gte(0).describe("Quantity").nullish(), + amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), + vatRuleId: z.string().describe("VAT rule ID").nullish(), + exchangeRate: z.number().nullish(), + currencyNotation: z.string().nullish(), + }) + .readonly(); + export type UpdateInvoiceChargeRequestDto = z.infer; + + /** + * UpdateInvoiceChargesRequestDtoSchema + * @type { object } + * @property { UpdateInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` + */ + export const UpdateInvoiceChargesRequestDtoSchema = z + .object({ + charges: z.array(UpdateInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates"), + }) + .readonly(); + export type UpdateInvoiceChargesRequestDto = z.infer; + + /** + * InvoiceFilterDtoSchema + * @type { object } + * @property { string[] } status + * @property { string } direction + * @property { string } receiver Filter by invoice receiver/customer ID (UUID) + */ + export const InvoiceFilterDtoSchema = z + .object({ + status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), + direction: CommonModels.InvoiceDirectionEnumSchema, + receiver: z.string().describe("Filter by invoice receiver/customer ID (UUID)"), + }) + .readonly(); + export type InvoiceFilterDto = z.infer; + + /** + * ChangeInvoiceCustomerRequestDtoSchema + * @type { object } + * @property { string } newCustomerId + */ + export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }).readonly(); + export type ChangeInvoiceCustomerRequestDto = z.infer; + + /** + * CreateDirectInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ + export const CreateDirectInvoiceChargeRequestDtoSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID"), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().describe("Quantity of the charge"), + buyRate: z.number().describe("Buy rate amount"), + buyCurrencyCode: z.string().describe("Buy rate currency code"), + buyVatRuleId: z.string().describe("Buy VAT rule ID"), + vendorId: z.string().describe("Vendor ID"), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), + sellRate: z.number().describe("Sell rate amount"), + sellCurrencyCode: z.string().describe("Sell rate currency code"), + sellVatRuleId: z.string().describe("Sell VAT rule ID"), + customerId: z.string().describe("Customer ID"), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), + }) + .readonly(); + export type CreateDirectInvoiceChargeRequestDto = z.infer; + + /** + * UpdateIssuedInvoiceVatRulesRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } vatRuleId VAT rule ID + */ + export const UpdateIssuedInvoiceVatRulesRequestDtoSchema = z + .object({ + positionChargeItemId: z.string().describe("Position charge item ID"), + vatRuleId: z.string().describe("VAT rule ID"), + }) + .readonly(); + export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; + + /** + * PrepareUploadRequestDtoSchema + * @type { object } + * @property { string } filename + * @property { string } mimeType + * @property { number } fileSize + */ + export const PrepareUploadRequestDtoSchema = z + .object({ filename: z.string().nullish(), mimeType: z.string(), fileSize: z.number() }) + .readonly(); + export type PrepareUploadRequestDto = z.infer; + + /** + * InvoiceUploadInstructionsDtoSchema + * @type { object } + * @property { string } url Pre-signed URL for the PUT request to storage + * @property { string } method HTTP method to use for upload + */ + export const InvoiceUploadInstructionsDtoSchema = z + .object({ + url: z.string().describe("Pre-signed URL for the PUT request to storage"), + method: z.string().describe("HTTP method to use for upload"), + }) + .readonly(); + export type InvoiceUploadInstructionsDto = z.infer; + + /** + * GetInvoicesEmlInvoiceIdsParamSchema + * @type { array } + * @description Invoice IDs + */ + export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).readonly().describe("Invoice IDs").nullish(); + export type GetInvoicesEmlInvoiceIdsParam = z.infer; + + /** + * InvoicesFindOrderParamEnumSchema + * @type { enum } + */ + export const InvoicesFindOrderParamEnumSchema = z.enum(["status", "createdAt", "serviceDate"]); + export type InvoicesFindOrderParamEnum = z.infer; + export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; + + /** + * InvoicesFindResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { InvoicePreviewDto[] } items + */ + export const InvoicesFindResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(InvoicePreviewDtoSchema).readonly() }).readonly().shape, + }); + export type InvoicesFindResponse = z.infer; + + /** + * FindByOfficeOrderParamEnumSchema + * @type { enum } + */ + export const FindByOfficeOrderParamEnumSchema = z.enum([ + "invoiceNumber", + "issuingDate", + "invoiceType", + "amount", + "netAmount", + "currencyNotation", + "dueDate", + "status", + "paidOn", + "serviceDate", + "internalNumber", + "positionNumber", + "invoiceDirection", + "receiver", + "receiverCountry", + "paidAmount", + "totalVat", + "dunningBlock", + "invoiceInReview", + "isInvoiceOk", + "isVatOk", + "comments", + "salesRepName", + "isExportedToBookkeeping", + "createdAt", + "customerReferenceOverride", + "externalSystemId", + ]); + export type FindByOfficeOrderParamEnum = z.infer; + export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; + + /** + * FindByOfficeResponseSchema + * @type { object } + * @property { number } totalAmountInDefaultCurrency + * @property { string } defaultCurrencyNotation + * @property { TotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficeInvoicePreviewDto[] } items + */ + export const FindByOfficeResponseSchema = z.object({ + ...OfficeInvoiceListResponseDtoSchema.shape, + ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).readonly() }).readonly().shape, + }); + export type FindByOfficeResponse = z.infer; + + /** + * GetUnChargesOrderParamEnumSchema + * @type { enum } + */ + export const GetUnChargesOrderParamEnumSchema = z.enum([ + "chargeItemId", + "orderPosition", + "serviceDate", + "receiverId", + "positionNumber", + "chargeTypeId", + "currency", + "vatRuleId", + ]); + export type GetUnChargesOrderParamEnum = z.infer; + export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; + + /** + * GetUnChargesResponseSchema + * @type { object } + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { UninvoicedChargeDto[] } items + */ + export const GetUnChargesResponseSchema = z.object({ + ...UninvoicedChargeListResponseDtoSchema.shape, + ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape, + }); + export type GetUnChargesResponse = z.infer; + + /** + * InvoicesListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ + export const InvoicesListAvailablePartnersForResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type InvoicesListAvailablePartnersForResponse = z.infer; + + /** + * GetOfficeUnChargesOrderParamEnumSchema + * @type { enum } + */ + export const GetOfficeUnChargesOrderParamEnumSchema = z.enum([ + "chargeItemId", + "orderPosition", + "serviceDate", + "receiverId", + "positionNumber", + "chargeTypeId", + "currency", + "vatRuleId", + ]); + export type GetOfficeUnChargesOrderParamEnum = z.infer; + export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnumSchema.enum; + + /** + * GetOfficeUnChargesResponseSchema + * @type { object } + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { UninvoicedChargeDto[] } items + */ + export const GetOfficeUnChargesResponseSchema = z.object({ + ...UninvoicedChargeListResponseDtoSchema.shape, + ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape, + }); + export type GetOfficeUnChargesResponse = z.infer; +} diff --git a/test/generated/base/invoices/invoices.queries.ts b/test/generated/base/invoices/invoices.queries.ts new file mode 100644 index 0000000..5aa63ba --- /dev/null +++ b/test/generated/base/invoices/invoices.queries.ts @@ -0,0 +1,1600 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InvoicesAcl } from "./invoices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { InvoicesApi } from "./invoices.api"; + +export namespace InvoicesQueries { + export const moduleName = QueryModule.Invoices; + + export const keys = { + all: [moduleName] as const, + getInvoicesEml: (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam) => + [...keys.all, "/offices/:officeId/invoices/eml", officeId, invoiceIds] as const, + find: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.InvoiceFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/invoices", + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + ] as const, + findInfinite: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.InvoiceFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/invoices", + "infinite", + officeId, + positionId, + limit, + order, + filter, + cursor, + ] as const, + findByOffice: ( + officeId: string, + limit?: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/invoices", officeId, limit, order, filter, page, cursor] as const, + findByOfficeInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/invoices", "infinite", officeId, limit, order, filter, cursor] as const, + getUnCharges: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargePaginationDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/uninvoiced-charges", + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + ] as const, + getUnChargesInfinite: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargePaginationDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/uninvoiced-charges", + "infinite", + officeId, + positionId, + limit, + order, + filter, + cursor, + ] as const, + listAvailablePartnersFor: ( + officeId: string, + invoiceId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + ) => + [ + ...keys.all, + "/offices/:officeId/invoices/:invoiceId/available-partners", + officeId, + invoiceId, + search, + useCase, + ] as const, + getOfficeUnCharges: ( + officeId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargesFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/uninvoiced-charges", officeId, limit, order, filter, page, cursor] as const, + getOfficeUnChargesInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargesFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/uninvoiced-charges", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + getDetail: (officeId: string, invoiceId: string) => + [...keys.all, "/offices/:officeId/invoices/:invoiceId", officeId, invoiceId] as const, + getPreview: (officeId: string, invoiceId: string) => + [...keys.all, "/offices/:officeId/invoices/:invoiceId/preview", officeId, invoiceId] as const, + getInvoiceEml: (officeId: string, invoiceId: string) => + [...keys.all, "/offices/:officeId/invoices/:invoiceId/eml", officeId, invoiceId] as const, + }; + + /** + * Query `useGetInvoicesEml` - recommended when file should be cached + * @summary Get invoices as EML file with PDF attachments + * @permission Requires `canUseGetInvoicesEml` ability + * @param { string } object.officeId Path parameter + * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } object.invoiceIds Query parameter. Invoice IDs + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const useGetInvoicesEml = ( + { officeId, invoiceIds }: { officeId: string; invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvoicesEml(officeId, invoiceIds), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId })); + return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config); + }, + ...options, + }); + }; + + /** + * Mutation `useGetInvoicesEmlMutation` - recommended when file should not be cached + * @summary Get invoices as EML file with PDF attachments + * @permission Requires `canUseGetInvoicesEml` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } mutation.invoiceIds Query parameter. Invoice IDs + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGetInvoicesEmlMutation = ( + options?: AppMutationOptions< + typeof InvoicesApi.getInvoicesEml, + { officeId: string; invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceIds }) => { + checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId })); + return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFind` + * @summary List invoices for a position + * @permission Requires `canUseFind` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` + * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFind = ( + { + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: InvoicesModels.InvoiceFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseFind({ officeId })); + return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindInfinite + * @summary List invoices for a position + * @permission Requires `canUseFind` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` + * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindInfinite = ( + { + officeId, + positionId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: InvoicesModels.InvoiceFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseFind({ officeId })); + return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useChangeIncomingCustomer` + * @summary Change incoming invoice customer and update vendors on registered charges + * @permission Requires `canUseChangeIncomingCustomer` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.ChangeInvoiceCustomerRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useChangeIncomingCustomer = ( + options?: AppMutationOptions< + typeof InvoicesApi.changeIncomingCustomer, + { officeId: string; invoiceId: string; data: InvoicesModels.ChangeInvoiceCustomerRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId })); + return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindByOffice` + * @summary List invoices for an office + * @permission Requires `canUseFindByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindByOffice = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CommonModels.OfficeInvoiceFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseFindByOffice({ officeId })); + return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindByOfficeInfinite + * @summary List invoices for an office + * @permission Requires `canUseFindByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindByOfficeInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CommonModels.OfficeInvoiceFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseFindByOffice({ officeId })); + return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreateDraft` + * @summary Create a draft invoice from charge items + * @permission Requires `canUseCreateDraft` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.CreateDraftInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const useCreateDraft = ( + options?: AppMutationOptions< + typeof InvoicesApi.createDraft, + { officeId: string; data: InvoicesModels.CreateDraftInvoiceRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseCreateDraft({ officeId })); + return InvoicesApi.createDraft(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useExportInvoices` - recommended when file should not be cached + * @summary Export invoices to Excel + * @permission Requires `canUseExportInvoices` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportInvoices = ( + options?: AppMutationOptions< + typeof InvoicesApi.exportInvoices, + { officeId: string; data: InvoicesModels.InvoiceExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportInvoices({ officeId })); + return InvoicesApi.exportInvoices(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useExportCharges` - recommended when file should not be cached + * @summary Export invoice charges as Excel file + * @permission Requires `canUseExportCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportCharges = ( + options?: AppMutationOptions< + typeof InvoicesApi.exportCharges, + { officeId: string; data: InvoicesModels.InvoiceExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportCharges({ officeId })); + return InvoicesApi.exportCharges(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetUnCharges` + * @summary Get uninvoiced charges for a position + * @permission Requires `canUseGetUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetUnCharges = ( + { + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: InvoicesModels.UninvoicedChargePaginationDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId })); + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useGetUnChargesInfinite + * @summary Get uninvoiced charges for a position + * @permission Requires `canUseGetUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useGetUnChargesInfinite = ( + { + officeId, + positionId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: InvoicesModels.UninvoicedChargePaginationDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId })); + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for an invoice (union of position involved parties) + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListAvailablePartnersFor = ( + { + officeId, + invoiceId, + search, + useCase, + }: { + officeId: string; + invoiceId: string; + search?: string; + useCase?: CommonModels.PositionAvailablePartnersUseCase; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), + queryFn: () => { + checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId })); + return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase, config); + }, + ...options, + }); + }; + + /** + * Query `useGetOfficeUnCharges` + * @summary Get uninvoiced charges for all positions in an office + * @permission Requires `canUseGetOfficeUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetOfficeUnCharges = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: InvoicesModels.UninvoicedChargesFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId })); + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useGetOfficeUnChargesInfinite + * @summary Get uninvoiced charges for all positions in an office + * @permission Requires `canUseGetOfficeUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useGetOfficeUnChargesInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: InvoicesModels.UninvoicedChargesFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId })); + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useExportUnCharges` - recommended when file should not be cached + * @summary Export uninvoiced charges as Excel file + * @permission Requires `canUseExportUnCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.UninvoicedChargesExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportUnCharges = ( + options?: AppMutationOptions< + typeof InvoicesApi.exportUnCharges, + { officeId: string; data: InvoicesModels.UninvoicedChargesExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId })); + return InvoicesApi.exportUnCharges(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreateDirect` + * @summary Dummy endpoint to expose direct invoice permission to FE + * @permission Requires `canUseCreateDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const useCreateDirect = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId }) => { + checkAcl(InvoicesAcl.canUseCreateDirect({ officeId })); + return InvoicesApi.createDirect(officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useAddChargeToDirect` + * @summary Add a charge to a direct invoice + * @permission Requires `canUseAddChargeToDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.CreateDirectInvoiceChargeRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const useAddChargeToDirect = ( + options?: AppMutationOptions< + typeof InvoicesApi.addChargeToDirect, + { officeId: string; invoiceId: string; data: InvoicesModels.CreateDirectInvoiceChargeRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId })); + return InvoicesApi.addChargeToDirect(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateCharges` + * @summary Update charges on a draft invoice + * @permission Requires `canUseUpdateCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateInvoiceChargesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useUpdateCharges = ( + options?: AppMutationOptions< + typeof InvoicesApi.updateCharges, + { officeId: string; invoiceId: string; data: InvoicesModels.UpdateInvoiceChargesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId })); + return InvoicesApi.updateCharges(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useRemoveChargeFromDirect` + * @summary Remove a charge from a direct invoice + * @permission Requires `canUseRemoveChargeFromDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.chargeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useRemoveChargeFromDirect = ( + options?: AppMutationOptions< + typeof InvoicesApi.removeChargeFromDirect, + { officeId: string; invoiceId: string; chargeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, chargeId }) => { + checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId })); + return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetDetail` + * @summary Get invoice details + * @permission Requires `canUseGetDetail` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, default] + */ + export const useGetDetail = ( + { officeId, invoiceId }: { officeId: string; invoiceId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDetail(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetDetail({ officeId })); + return InvoicesApi.getDetail(officeId, invoiceId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update invoice details + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof InvoicesApi.update, + { officeId: string; invoiceId: string; data: InvoicesModels.UpdateInvoiceRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdate({ officeId })); + return InvoicesApi.update(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteInvoice` + * @summary Delete invoice + * @permission Requires `canUseDeleteInvoice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteInvoice = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId })); + return InvoicesApi.deleteInvoice(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useFix` + * @summary Fix invoice with accounting permission + * @permission Requires `canUseFix` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.FixInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useFix = ( + options?: AppMutationOptions< + typeof InvoicesApi.fix, + { officeId: string; invoiceId: string; data: InvoicesModels.FixInvoiceRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseFix({ officeId })); + return InvoicesApi.fix(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerate` - recommended when file should not be cached + * @summary Generate an invoice PDF + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [201, 401] + */ + export const useGenerate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGenerate({ officeId })); + return InvoicesApi.generate(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateIssuedVatRules` + * @summary Update VAT rules on issued invoice charges + * @permission Requires `canUseUpdateIssuedVatRules` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useUpdateIssuedVatRules = ( + options?: AppMutationOptions< + typeof InvoicesApi.updateIssuedVatRules, + { officeId: string; invoiceId: string; data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId })); + return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateIssuedCharges` + * @summary Update charges on issued invoice + * @permission Requires `canUseUpdateIssuedCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useUpdateIssuedCharges = ( + options?: AppMutationOptions< + typeof InvoicesApi.updateIssuedCharges, + { officeId: string; invoiceId: string; data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId })); + return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useIssue` - recommended when file should not be cached + * @summary Issue outgoing invoice + * @permission Requires `canUseIssue` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useIssue = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseIssue({ officeId })); + return InvoicesApi.issue(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [ + keys.getInvoicesEml(officeId), + keys.getPreview(officeId, invoiceId), + keys.getInvoiceEml(officeId, invoiceId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useReportHungarian` + * @summary Report invoice to Hungarian tax authority + * @permission Requires `canUseReportHungarian` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useReportHungarian = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseReportHungarian({ officeId })); + return InvoicesApi.reportHungarian(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateIncoming` - recommended when file should not be cached + * @summary Re-Generate an invoice PDF + * @permission Requires `canUseGenerateIncoming` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useGenerateIncoming = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId })); + return InvoicesApi.generateIncoming(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [ + keys.getInvoicesEml(officeId), + keys.getPreview(officeId, invoiceId), + keys.getInvoiceEml(officeId, invoiceId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useRegister` + * @summary Register incoming invoice + * @permission Requires `canUseRegister` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useRegister = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseRegister({ officeId })); + return InvoicesApi.register(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetPreview` - recommended when file should be cached + * @summary Get invoice PDF preview + * @permission Requires `canUseGetPreview` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const useGetPreview = ( + { officeId, invoiceId }: { officeId: string; invoiceId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getPreview(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetPreview({ officeId })); + return InvoicesApi.getPreview(officeId, invoiceId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useGetPreviewMutation` - recommended when file should not be cached + * @summary Get invoice PDF preview + * @permission Requires `canUseGetPreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGetPreviewMutation = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGetPreview({ officeId })); + return InvoicesApi.getPreview(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [ + keys.getInvoicesEml(officeId), + keys.getPreview(officeId, invoiceId), + keys.getInvoiceEml(officeId, invoiceId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetInvoiceEml` - recommended when file should be cached + * @summary Get invoice as EML file with PDF attachment + * @permission Requires `canUseGetInvoiceEml` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const useGetInvoiceEml = ( + { officeId, invoiceId }: { officeId: string; invoiceId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvoiceEml(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId })); + return InvoicesApi.getInvoiceEml(officeId, invoiceId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useGetInvoiceEmlMutation` - recommended when file should not be cached + * @summary Get invoice as EML file with PDF attachment + * @permission Requires `canUseGetInvoiceEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGetInvoiceEmlMutation = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId })); + return InvoicesApi.getInvoiceEml(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [ + keys.getInvoicesEml(officeId), + keys.getPreview(officeId, invoiceId), + keys.getInvoiceEml(officeId, invoiceId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `usePrepareDocumentUpload` + * @summary Prepare for invoice document upload + * @permission Requires `canUsePrepareDocumentUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.PrepareUploadRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const usePrepareDocumentUpload = ( + options?: AppMutationOptions< + typeof InvoicesApi.prepareDocumentUpload, + { + officeId: string; + invoiceId: string; + data: InvoicesModels.PrepareUploadRequestDto; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { + checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId })); + const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCancel` + * @summary Cancel invoice (create draft credit note) + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const useCancel = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseCancel({ officeId })); + return InvoicesApi.cancel(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useIssueCreditNote` + * @summary Issue credit invoice + * @permission Requires `canUseIssueCreditNote` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useIssueCreditNote = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId })); + return InvoicesApi.issueCreditNote(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/masterData/masterData.acl.ts b/test/generated/base/masterData/masterData.acl.ts new file mode 100644 index 0000000..90517a8 --- /dev/null +++ b/test/generated/base/masterData/masterData.acl.ts @@ -0,0 +1,15 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace MasterDataAcl { + /** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; +} diff --git a/test/generated/base/masterData/masterData.api.ts b/test/generated/base/masterData/masterData.api.ts new file mode 100644 index 0000000..c73f4c2 --- /dev/null +++ b/test/generated/base/masterData/masterData.api.ts @@ -0,0 +1,66 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { MasterDataModels } from "./masterData.models"; + +export namespace MasterDataApi { + export const findAll = ( + officeId: string, + types: MasterDataModels.MasterDataFindAllTypesParam, + search?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, + `/offices/${officeId}/master-data/autocomplete`, + { + ...config, + params: { + types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { + type: "query", + name: "types", + }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + }, + ); + }; + + export const paginate = ( + officeId: string, + types: MasterDataModels.MasterDataPaginateTypesParam, + limit: number, + search?: string, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, + `/offices/${officeId}/master-data/labels/paginated`, + { + ...config, + params: { + types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { + type: "query", + name: "types", + }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/base/masterData/masterData.configs.ts b/test/generated/base/masterData/masterData.configs.ts new file mode 100644 index 0000000..3f2dbff --- /dev/null +++ b/test/generated/base/masterData/masterData.configs.ts @@ -0,0 +1,28 @@ +import { dynamicColumns } from "@povio/ui"; +import { MasterDataModels } from "./masterData.models"; +import { MasterDataQueries } from "./masterData.queries"; +import { MasterDataAcl } from "./masterData.acl"; + +export namespace MasterDataConfigs { + export const paginatedConfig = { + meta: { + title: "Paginated", + }, + readAll: { + acl: MasterDataAcl.canUsePaginate, + schema: MasterDataModels.MasterDataLabelResponseDTOSchema, + paginated: MasterDataQueries.usePaginate, + infinite: MasterDataQueries.usePaginateInfinite, + columns: dynamicColumns({ + schema: MasterDataModels.MasterDataLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + type: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/base/masterData/masterData.models.ts b/test/generated/base/masterData/masterData.models.ts new file mode 100644 index 0000000..3a0dfae --- /dev/null +++ b/test/generated/base/masterData/masterData.models.ts @@ -0,0 +1,94 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace MasterDataModels { + /** + * MasterDataTypeEnumSchema + * @type { enum } + */ + export const MasterDataTypeEnumSchema = z.enum([ + "BusinessPartner", + "Depot", + "City", + "Warehouse", + "ContainerYard", + "PortTerminal", + "AirportTerminal", + "Port", + "Airport", + ]); + export type MasterDataTypeEnum = z.infer; + export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; + + /** + * MasterDataItemResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the item + * @property { string } name Name of the item + * @property { MasterDataTypeEnum } type Type of the item + */ + export const MasterDataItemResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the item"), + name: z.string().describe("Name of the item"), + type: MasterDataTypeEnumSchema.describe("Type of the item"), + }) + .readonly(); + export type MasterDataItemResponseDTO = z.infer; + + /** + * MasterDataItemsResponseDTOSchema + * @type { object } + * @property { MasterDataItemResponseDTO[] } items List of master data items + */ + export const MasterDataItemsResponseDTOSchema = z + .object({ items: z.array(MasterDataItemResponseDTOSchema).readonly().describe("List of master data items") }) + .readonly(); + export type MasterDataItemsResponseDTO = z.infer; + + /** + * MasterDataLabelResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the item + * @property { string } label Label of the item + * @property { MasterDataTypeEnum } type Type of the item + */ + export const MasterDataLabelResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the item"), + label: z.string().describe("Label of the item"), + type: MasterDataTypeEnumSchema.describe("Type of the item"), + }) + .readonly(); + export type MasterDataLabelResponseDTO = z.infer; + + /** + * MasterDataFindAllTypesParamSchema + * @type { array } + */ + export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); + export type MasterDataFindAllTypesParam = z.infer; + + /** + * MasterDataPaginateTypesParamSchema + * @type { array } + */ + export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); + export type MasterDataPaginateTypesParam = z.infer; + + /** + * MasterDataPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { MasterDataLabelResponseDTO[] } items + */ + export const MasterDataPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(MasterDataLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type MasterDataPaginateResponse = z.infer; +} diff --git a/test/generated/base/masterData/masterData.queries.ts b/test/generated/base/masterData/masterData.queries.ts new file mode 100644 index 0000000..7ba7283 --- /dev/null +++ b/test/generated/base/masterData/masterData.queries.ts @@ -0,0 +1,178 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { MasterDataAcl } from "./masterData.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { MasterDataModels } from "./masterData.models"; +import { MasterDataApi } from "./masterData.api"; + +export namespace MasterDataQueries { + export const moduleName = QueryModule.MasterData; + + export const keys = { + all: [moduleName] as const, + findAll: (officeId: string, types?: MasterDataModels.MasterDataFindAllTypesParam, search?: string) => + [...keys.all, "/offices/:officeId/master-data/autocomplete", officeId, types, search] as const, + paginate: ( + officeId: string, + types?: MasterDataModels.MasterDataPaginateTypesParam, + limit?: number, + search?: string, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/master-data/labels/paginated", + officeId, + types, + limit, + search, + page, + cursor, + ] as const, + paginateInfinite: ( + officeId: string, + types?: MasterDataModels.MasterDataPaginateTypesParam, + limit?: number, + search?: string, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/master-data/labels/paginated", + "infinite", + officeId, + types, + limit, + search, + cursor, + ] as const, + }; + + /** + * Query `useFindAll` + * @summary List master data based on provided type + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataFindAllTypesParam } object.types Query parameter + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + officeId, + types, + search, + }: { officeId: string; types: MasterDataModels.MasterDataFindAllTypesParam; search?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(officeId, types, search), + queryFn: () => { + checkAcl(MasterDataAcl.canUseFindAll()); + return MasterDataApi.findAll(officeId, types, search, config); + }, + ...options, + }); + }; + + /** + * Query `usePaginate` + * @summary Paginate master data based on provided type + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.search Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + types, + limit, + search, + page, + cursor, + }: { + officeId: string; + types: MasterDataModels.MasterDataPaginateTypesParam; + limit: number; + search?: string; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, types, limit, search, page, cursor), + queryFn: () => { + checkAcl(MasterDataAcl.canUsePaginate()); + return MasterDataApi.paginate(officeId, types, limit, search, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate master data based on provided type + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.search Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + types, + limit, + search, + cursor, + }: { + officeId: string; + types: MasterDataModels.MasterDataPaginateTypesParam; + limit: number; + search?: string; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), + queryFn: ({ pageParam }) => { + checkAcl(MasterDataAcl.canUsePaginate()); + return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/base/masterDataImport/masterDataImport.acl.ts b/test/generated/base/masterDataImport/masterDataImport.acl.ts new file mode 100644 index 0000000..6146a3a --- /dev/null +++ b/test/generated/base/masterDataImport/masterDataImport.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace MasterDataImportAcl { + /** + * Use for `useUpload` mutation ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpload` mutation + */ + export const canUseUpload = (object?: { officeId: string }) => + ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< + "Import", + "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) + >; + + /** + * Use for `usePostOfficesMasterDataImportByOfficeId` mutation ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePostOfficesMasterDataImportByOfficeId` mutation + */ + export const canUsePostOfficesMasterDataImportByOfficeId = (object?: { officeId: string }) => + ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< + "Import", + "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) + >; + + /** + * Use for `useGetImportStatus` query ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetImportStatus` query + */ + export const canUseGetImportStatus = (object?: { officeId: string }) => + ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< + "Import", + "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) + >; +} diff --git a/test/generated/base/masterDataImport/masterDataImport.api.ts b/test/generated/base/masterDataImport/masterDataImport.api.ts new file mode 100644 index 0000000..8568423 --- /dev/null +++ b/test/generated/base/masterDataImport/masterDataImport.api.ts @@ -0,0 +1,40 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { MasterDataImportModels } from "./masterDataImport.models"; + +export namespace MasterDataImportApi { + export const upload = ( + officeId: string, + data: MasterDataImportModels.MasterDataImportUploadRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, + `/offices/${officeId}/master-data/upload`, + ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), + config, + ); + }; + + export const postOfficesMasterDataImportByOfficeId = ( + officeId: string, + data: MasterDataImportModels.MasterDataImportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, + `/offices/${officeId}/master-data/import`, + ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), + config, + ); + }; + + export const getImportStatus = (jobId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, + `/offices/${officeId}/master-data/import/${jobId}/status`, + config, + ); + }; +} diff --git a/test/generated/base/masterDataImport/masterDataImport.models.ts b/test/generated/base/masterDataImport/masterDataImport.models.ts new file mode 100644 index 0000000..27c6a3e --- /dev/null +++ b/test/generated/base/masterDataImport/masterDataImport.models.ts @@ -0,0 +1,110 @@ +import { z } from "zod"; + +export namespace MasterDataImportModels { + /** + * ImportStatusEnumSchema + * @type { enum } + * @description Import result status + */ + export const ImportStatusEnumSchema = z.enum(["Success", "Warning", "Error"]); + export type ImportStatusEnum = z.infer; + export const ImportStatusEnum = ImportStatusEnumSchema.enum; + + /** + * ImportTypeEnumSchema + * @type { enum } + */ + export const ImportTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Warehouse"]); + export type ImportTypeEnum = z.infer; + export const ImportTypeEnum = ImportTypeEnumSchema.enum; + + /** + * MasterDataImportRequestDtoSchema + * @type { object } + * @property { string } mediaId Media ID of the uploaded file + * @property { ImportTypeEnum } type Type of data to import + */ + export const MasterDataImportRequestDtoSchema = z + .object({ + mediaId: z.string().describe("Media ID of the uploaded file"), + type: ImportTypeEnumSchema.describe("Type of data to import"), + }) + .readonly(); + export type MasterDataImportRequestDto = z.infer; + + /** + * ImportResultDtoSchema + * @type { object } + * @property { string } importStatus Import result status + * @property { string } downloadUrl S3 presigned URL for result file download + * @property { string } expiresAt Download URL expiration time + * @property { string } errorCode + */ + export const ImportResultDtoSchema = z + .object({ + importStatus: ImportStatusEnumSchema.describe("Import result status").nullish(), + downloadUrl: z.string().describe("S3 presigned URL for result file download"), + expiresAt: z.iso.datetime({ offset: true }).describe("Download URL expiration time").nullish(), + errorCode: z.string().nullish(), + }) + .readonly(); + export type ImportResultDto = z.infer; + + /** + * ImportStatusResponseDtoSchema + * @type { object } + * @property { string } status Current job status + * @property { ImportResultDto } result Import result data when job is completed + */ + export const ImportStatusResponseDtoSchema = z + .object({ + status: z.string().describe("Current job status").nullable(), + result: ImportResultDtoSchema.describe("Import result data when job is completed").nullish(), + }) + .readonly(); + export type ImportStatusResponseDto = z.infer; + + /** + * MasterDataImportUploadRequestDtoSchema + * @type { object } + * @property { string } filename File name + * @property { string } contentType Content type of the file + * @property { number } fileSize File size in bytes. Minimum: `1` + */ + export const MasterDataImportUploadRequestDtoSchema = z + .object({ + filename: z.string().describe("File name"), + contentType: z.string().describe("Content type of the file"), + fileSize: z.number().gte(1).describe("File size in bytes"), + }) + .readonly(); + export type MasterDataImportUploadRequestDto = z.infer; + + /** + * MasterDataImportUploadResponseDtoSchema + * @type { object } + * @property { string } mediaId Media ID for the uploaded file + * @property { string } url S3 presigned upload URL + */ + export const MasterDataImportUploadResponseDtoSchema = z + .object({ + mediaId: z.string().describe("Media ID for the uploaded file"), + url: z.string().describe("S3 presigned upload URL"), + }) + .readonly(); + export type MasterDataImportUploadResponseDto = z.infer; + + /** + * MasterDataImportResponseDtoSchema + * @type { object } + * @property { string } jobId PG Boss job ID + * @property { string } status Initial job status + */ + export const MasterDataImportResponseDtoSchema = z + .object({ + jobId: z.string().describe("PG Boss job ID"), + status: z.string().describe("Initial job status").nullish(), + }) + .readonly(); + export type MasterDataImportResponseDto = z.infer; +} diff --git a/test/generated/base/masterDataImport/masterDataImport.queries.ts b/test/generated/base/masterDataImport/masterDataImport.queries.ts new file mode 100644 index 0000000..60d6af7 --- /dev/null +++ b/test/generated/base/masterDataImport/masterDataImport.queries.ts @@ -0,0 +1,146 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { MasterDataImportAcl } from "./masterDataImport.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { MasterDataImportModels } from "./masterDataImport.models"; +import { MasterDataImportApi } from "./masterDataImport.api"; + +export namespace MasterDataImportQueries { + export const moduleName = QueryModule.MasterDataImport; + + export const keys = { + all: [moduleName] as const, + getImportStatus: (jobId: string, officeId: string) => + [...keys.all, "/offices/:officeId/master-data/import/:jobId/status", jobId, officeId] as const, + }; + + /** + * Mutation `useUpload` + * @summary Create upload instructions for master data import file + * @permission Requires `canUseUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { MasterDataImportModels.MasterDataImportUploadRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useUpload = ( + options?: AppMutationOptions< + typeof MasterDataImportApi.upload, + { + officeId: string; + data: MasterDataImportModels.MasterDataImportUploadRequestDto; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(MasterDataImportAcl.canUseUpload({ officeId })); + const uploadInstructions = await MasterDataImportApi.upload(officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `usePostOfficesMasterDataImportByOfficeId` + * @summary Start master data import process + * @permission Requires `canUsePostOfficesMasterDataImportByOfficeId` ability + * @param { string } mutation.officeId Path parameter + * @param { MasterDataImportModels.MasterDataImportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const usePostOfficesMasterDataImportByOfficeId = ( + options?: AppMutationOptions< + typeof MasterDataImportApi.postOfficesMasterDataImportByOfficeId, + { officeId: string; data: MasterDataImportModels.MasterDataImportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId })); + return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetImportStatus` + * @summary Get import job status + * @permission Requires `canUseGetImportStatus` ability + * @param { string } object.jobId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetImportStatus = ( + { jobId, officeId }: { jobId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getImportStatus(jobId, officeId), + queryFn: () => { + checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId })); + return MasterDataImportApi.getImportStatus(jobId, officeId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/offices/offices.acl.ts b/test/generated/base/offices/offices.acl.ts new file mode 100644 index 0000000..aec8ce6 --- /dev/null +++ b/test/generated/base/offices/offices.acl.ts @@ -0,0 +1,84 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace OfficesAcl { + /** + * Use for `useCreate` mutation ability. + * @description Create office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Office"] as AbilityTuple<"Create", "Office">; + + /** + * Use for `useGet` query ability. + * @description Read office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; + + /** + * Use for `useUpdate` mutation ability. + * @description Update office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Office"] as AbilityTuple<"Update", "Office">; + + /** + * Use for `useUploadDocumentImage` mutation ability. For global ability, omit the object parameter. + * @description Upload office document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadDocumentImage` mutation + */ + export const canUseUploadDocumentImage = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useCreateBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Create office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBankAccount` mutation + */ + export const canUseCreateBankAccount = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Update office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBankAccount` mutation + */ + export const canUseUpdateBankAccount = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useDeleteBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Delete office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBankAccount` mutation + */ + export const canUseDeleteBankAccount = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useUploadBankAccountFooter` mutation ability. For global ability, omit the object parameter. + * @description Upload bank account footer + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadBankAccountFooter` mutation + */ + export const canUseUploadBankAccountFooter = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; +} diff --git a/test/generated/base/offices/offices.api.ts b/test/generated/base/offices/offices.api.ts new file mode 100644 index 0000000..877e43b --- /dev/null +++ b/test/generated/base/offices/offices.api.ts @@ -0,0 +1,177 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { OfficesModels } from "./offices.models"; + +export namespace OfficesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: OfficesModels.OfficeFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: OfficesModels.OfficesPaginateResponseSchema }, `/offices`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: OfficesModels.CreateOfficeRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: OfficesModels.OfficeResponseDtoSchema }, + `/offices`, + ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), + config, + ); + }; + + export const findAllLabels = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: OfficesModels.FindAllLabelsResponseSchema }, `/offices/labels`, { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + }); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: OfficesModels.OfficeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, + `/offices/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const get = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, `/offices/${id}`, config); + }; + + export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: OfficesModels.OfficeResponseDtoSchema }, + `/offices/${id}`, + ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), + config, + ); + }; + + export const uploadDocumentImage = ( + officeId: string, + data: OfficesModels.UploadOfficeDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, + `/offices/${officeId}/document-image`, + ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), + config, + ); + }; + + export const createBankAccount = ( + officeId: string, + data: OfficesModels.CreateOfficeBankAccountDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, + `/offices/${officeId}/bank-accounts`, + ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), + config, + ); + }; + + export const updateBankAccount = ( + accountId: string, + officeId: string, + data: OfficesModels.UpdateOfficeBankAccountDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, + `/offices/${officeId}/bank-accounts/${accountId}`, + ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), + config, + ); + }; + + export const deleteBankAccount = (accountId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/bank-accounts/${accountId}`, + undefined, + config, + ); + }; + + export const uploadBankAccountFooter = ( + accountId: string, + officeId: string, + data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, + `/offices/${officeId}/bank-accounts/${accountId}/footer`, + ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/offices/offices.configs.ts b/test/generated/base/offices/offices.configs.ts new file mode 100644 index 0000000..c595c05 --- /dev/null +++ b/test/generated/base/offices/offices.configs.ts @@ -0,0 +1,134 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { OfficesModels } from "./offices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { OfficesQueries } from "./offices.queries"; +import { OfficesAcl } from "./offices.acl"; + +export namespace OfficesConfigs { + export const officesConfig = { + meta: { + title: "Offices", + }, + readAll: { + schema: OfficesModels.OfficeListItemResponseSchema, + paginated: OfficesQueries.usePaginate, + infinite: OfficesQueries.usePaginateInfinite, + filters: { + schema: OfficesModels.OfficeFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: OfficesModels.OfficeFilterDtoSchema, + options: { + inputs: { + name: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: OfficesModels.OfficeListItemResponseSchema, + options: { + columns: { + id: true, + name: true, + numberOfEmployees: true, + }, + sortable: OfficesModels.OfficesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: OfficesAcl.canUseGet, + schema: OfficesModels.OfficeDetailResponseDtoSchema, + query: OfficesQueries.useGet, + }, + create: { + acl: OfficesAcl.canUseCreate, + schema: OfficesModels.CreateOfficeRequestSchema, + mutation: OfficesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: OfficesModels.CreateOfficeRequestSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + update: { + acl: OfficesAcl.canUseUpdate, + schema: OfficesModels.UpdateOfficeRequestSchema, + mutation: OfficesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: OfficesModels.UpdateOfficeRequestSchema, + options: { + inputs: { + name: true, + symbol: true, + invoicePrefix: true, + autoClosePositionsAfterDays: true, + defaultLanguage: true, + locale: true, + vatId: true, + taxNumber: true, + termsExport: true, + termsImport: true, + showPaymentInstructions: true, + showCompanyRegistrationNumber: true, + reportInvoicesToHungarianTaxAuthority: true, + restrictPositionInvolvedParties: true, + showWatermarkOnDocuments: true, + showInvoiceVatLinesInOfficeCurrency: true, + usePartnerMatchCodes: true, + restrictFinancePartnersToRelationship: true, + costCenterId: true, + minimumOutgoingInvoiceDate: true, + minimumOutgoingInvoiceServiceDate: true, + minimumIncomingInvoiceDate: true, + minimumIncomingInvoiceServiceDate: true, + countryId: true, + defaultCurrencyId: true, + representingBusinessPartnerId: true, + availableCurrencyIds: true, + generalLedgerSystem: true, + factoringReportingEnabled: true, + bankAccountCurrencyMapping: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + schema: CommonModels.LabelResponseDTOSchema, + paginated: OfficesQueries.usePaginateLabels, + infinite: OfficesQueries.usePaginateLabelsInfinite, + filters: { + schema: OfficesModels.OfficeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: OfficesModels.OfficeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/offices/offices.models.ts b/test/generated/base/offices/offices.models.ts new file mode 100644 index 0000000..ca066ec --- /dev/null +++ b/test/generated/base/offices/offices.models.ts @@ -0,0 +1,603 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace OfficesModels { + /** + * OfficeCurrencyResponseDtoSchema + * @type { object } + * @property { string } isoCode + * @property { string } name + */ + export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }).readonly(); + export type OfficeCurrencyResponseDto = z.infer; + + /** + * OfficeBankAccountCurrencyMappingResponseDtoSchema + * @type { object } + * @property { string } currency + * @property { string } bankAccountId + * @property { string } bankAccountName + */ + export const OfficeBankAccountCurrencyMappingResponseDtoSchema = z + .object({ currency: z.string(), bankAccountId: z.string(), bankAccountName: z.string() }) + .readonly(); + export type OfficeBankAccountCurrencyMappingResponseDto = z.infer< + typeof OfficeBankAccountCurrencyMappingResponseDtoSchema + >; + + /** + * OfficeBookkeepingResponseDtoSchema + * @type { object } + * @property { string } generalLedgerSystem + * @property { OfficeCurrencyResponseDto } defaultCurrency + * @property { OfficeCurrencyResponseDto[] } availableCurrencies + * @property { boolean } showPaymentInstructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { OfficeBankAccountCurrencyMappingResponseDto[] } bankAccountCurrencyMapping + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { boolean } factoringReportingEnabled + */ + export const OfficeBookkeepingResponseDtoSchema = z + .object({ + generalLedgerSystem: z.string(), + defaultCurrency: OfficeCurrencyResponseDtoSchema.nullish(), + availableCurrencies: z.array(OfficeCurrencyResponseDtoSchema).readonly(), + showPaymentInstructions: z.boolean(), + showCompanyRegistrationNumber: z.boolean(), + showInvoiceVatLinesInOfficeCurrency: z.boolean(), + reportInvoicesToHungarianTaxAuthority: z.boolean(), + bankAccountCurrencyMapping: z.array(OfficeBankAccountCurrencyMappingResponseDtoSchema).readonly(), + costCenterId: z.string().nullish(), + minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), + factoringReportingEnabled: z.boolean(), + }) + .readonly(); + export type OfficeBookkeepingResponseDto = z.infer; + + /** + * OfficeDocumentPartEnumSchema + * @type { enum } + */ + export const OfficeDocumentPartEnumSchema = z.enum([ + "DocumentFooter", + "DocumentHeader", + "GeneralTermsAndConditions", + "BLTermsAndConditions", + "FinanceDocumentFooter", + ]); + export type OfficeDocumentPartEnum = z.infer; + export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; + + /** + * OfficeDocumentSettingsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } mediaUrl + * @property { CommonModels.LanguageEnum } language + * @property { OfficeDocumentPartEnum } documentPart + */ + export const OfficeDocumentSettingsResponseDtoSchema = z + .object({ + id: z.string(), + mediaUrl: z.string(), + language: CommonModels.LanguageEnumSchema, + documentPart: OfficeDocumentPartEnumSchema, + }) + .readonly(); + export type OfficeDocumentSettingsResponseDto = z.infer; + + /** + * AddressResponseDTOSchema + * @type { object } + * @property { string } id ID of the address + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } city City name + * @property { string } district District + * @property { string } isoCode2 2 letter country code + * @property { string } country Country name + * @property { string } isoCode3 3 letter country code + */ + export const AddressResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the address"), + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street address"), + zip: z.string().describe("ZIP/Postal code"), + city: z.string().describe("City name"), + district: z.string().describe("District"), + isoCode2: z.string().describe("2 letter country code"), + country: z.string().describe("Country name"), + isoCode3: z.string().describe("3 letter country code"), + }) + .readonly(); + export type AddressResponseDTO = z.infer; + + /** + * OfficeRepresentingBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string[] } types + * @property { string[] } email + * @property { string[] } phone + * @property { string } addressId + * @property { AddressResponseDTO } address + */ + export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + types: z.array(z.string()).readonly(), + email: z.array(z.string()).readonly().nullish(), + phone: z.array(z.string()).readonly().nullish(), + addressId: z.string().nullish(), + address: AddressResponseDTOSchema.nullish(), + }) + .readonly(); + export type OfficeRepresentingBusinessPartnerResponseDto = z.infer< + typeof OfficeRepresentingBusinessPartnerResponseDtoSchema + >; + + /** + * OfficePaymentTermsResponseDtoSchema + * @type { object } + * @property { number } days + * @property { string } relativeTo + */ + export const OfficePaymentTermsResponseDtoSchema = z + .object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }) + .readonly(); + export type OfficePaymentTermsResponseDto = z.infer; + + /** + * OfficeCountryResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const OfficeCountryResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type OfficeCountryResponseDto = z.infer; + + /** + * OfficeBankAccountResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } bankName + * @property { string } iban + * @property { string } swiftBic + * @property { boolean } useFooterOnInvoice + * @property { object } footer + * @property { string } footer.mediaUrl + * @property { boolean } isFactoringBank + */ + export const OfficeBankAccountResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + bankName: z.string(), + iban: z.string(), + swiftBic: z.string(), + useFooterOnInvoice: z.boolean(), + footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), + isFactoringBank: z.boolean(), + }) + .readonly(); + export type OfficeBankAccountResponseDto = z.infer; + + /** + * OfficeDetailResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } symbol + * @property { number } invoicePrefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage + * @property { CommonModels.LocaleEnum } locale + * @property { string } vatId + * @property { string } taxNumber + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { OfficePaymentTermsResponseDto } termsExport + * @property { OfficePaymentTermsResponseDto } termsImport + * @property { OfficeCountryResponseDto } country + * @property { OfficeBankAccountResponseDto[] } bankAccounts + * @property { OfficeBookkeepingResponseDto } bookkeeping + * @property { OfficeDocumentSettingsResponseDto[] } documentSettings + * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner + * @property { boolean } hasInttraCredentials + */ + export const OfficeDetailResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + symbol: z.string().nullable(), + invoicePrefix: z.number().nullable(), + autoClosePositionsAfterDays: z.number().nullish(), + defaultLanguage: z.string().nullable(), + locale: CommonModels.LocaleEnumSchema.nullish(), + vatId: z.string().nullable(), + taxNumber: z.string().nullable(), + restrictPositionInvolvedParties: z.boolean(), + showWatermarkOnDocuments: z.boolean(), + usePartnerMatchCodes: z.boolean(), + restrictFinancePartnersToRelationship: z.boolean(), + termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), + termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), + country: OfficeCountryResponseDtoSchema.nullable(), + bankAccounts: z.array(OfficeBankAccountResponseDtoSchema).readonly(), + bookkeeping: OfficeBookkeepingResponseDtoSchema, + documentSettings: z.array(OfficeDocumentSettingsResponseDtoSchema).readonly(), + representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), + hasInttraCredentials: z.boolean().nullish(), + }) + .readonly(); + export type OfficeDetailResponseDto = z.infer; + + /** + * OfficeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } symbol + * @property { number } invoicePrefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage + * @property { CommonModels.LocaleEnum } locale + * @property { string } vatId + * @property { string } taxNumber + * @property { OfficePaymentTermsResponseDto } termsExport + * @property { OfficePaymentTermsResponseDto } termsImport + * @property { boolean } showPaymentInstructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { string } countryId + * @property { string } defaultCurrencyId + * @property { string[] } availableCurrencyIds + * @property { string } generalLedgerSystem + * @property { string } representingBusinessPartnerId + * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner + * @property { boolean } factoringReportingEnabled + */ + export const OfficeResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + symbol: z.string().nullable(), + invoicePrefix: z.number().nullable(), + autoClosePositionsAfterDays: z.number().nullish(), + defaultLanguage: z.string().nullable(), + locale: CommonModels.LocaleEnumSchema.nullish(), + vatId: z.string().nullable(), + taxNumber: z.string().nullable(), + termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), + termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), + showPaymentInstructions: z.boolean(), + showCompanyRegistrationNumber: z.boolean(), + restrictPositionInvolvedParties: z.boolean(), + showWatermarkOnDocuments: z.boolean(), + showInvoiceVatLinesInOfficeCurrency: z.boolean(), + usePartnerMatchCodes: z.boolean(), + restrictFinancePartnersToRelationship: z.boolean(), + reportInvoicesToHungarianTaxAuthority: z.boolean(), + costCenterId: z.string().nullish(), + minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), + countryId: z.string().nullable(), + defaultCurrencyId: z.string().nullable(), + availableCurrencyIds: z.array(z.string()).readonly().nullable(), + generalLedgerSystem: z.string().nullable(), + representingBusinessPartnerId: z.string().nullable(), + representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), + factoringReportingEnabled: z.boolean(), + }) + .readonly(); + export type OfficeResponseDto = z.infer; + + /** + * UpdateOfficePaymentTermsRequestSchema + * @type { object } + * @property { number } days + * @property { string } relativeTo + */ + export const UpdateOfficePaymentTermsRequestSchema = z + .object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }) + .readonly(); + export type UpdateOfficePaymentTermsRequest = z.infer; + + /** + * UpdateOfficeBankAccountCurrencyMappingSchema + * @type { object } + * @property { string } currency + * @property { string } bankAccountId + */ + export const UpdateOfficeBankAccountCurrencyMappingSchema = z + .object({ currency: z.string(), bankAccountId: z.string() }) + .readonly(); + export type UpdateOfficeBankAccountCurrencyMapping = z.infer; + + /** + * UpdateOfficeRequestSchema + * @type { object } + * @property { string } name Office Name + * @property { string } symbol Office Symbol + * @property { number } invoicePrefix Office Invoice Prefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage Office Default Language + * @property { string } locale + * @property { string } vatId Office Vat Id + * @property { string } taxNumber Office Tax Number + * @property { UpdateOfficePaymentTermsRequest } termsExport Office Terms Export + * @property { UpdateOfficePaymentTermsRequest } termsImport Office Terms Import + * @property { boolean } showPaymentInstructions Office Show Payment Instructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { string } countryId Office country id + * @property { string } defaultCurrencyId Office default currency id + * @property { string } representingBusinessPartnerId Representing business partner id + * @property { string[] } availableCurrencyIds Office availableCurrencyIds + * @property { string } generalLedgerSystem Office general ledger system + * @property { boolean } factoringReportingEnabled + * @property { UpdateOfficeBankAccountCurrencyMapping[] } bankAccountCurrencyMapping Office bank account currency mapping + */ + export const UpdateOfficeRequestSchema = z + .object({ + name: z.string().describe("Office Name"), + symbol: z.string().describe("Office Symbol"), + invoicePrefix: z.number().describe("Office Invoice Prefix"), + autoClosePositionsAfterDays: z.number(), + defaultLanguage: z.string().describe("Office Default Language"), + locale: CommonModels.LocaleEnumSchema, + vatId: z.string().describe("Office Vat Id"), + taxNumber: z.string().describe("Office Tax Number"), + termsExport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Export"), + termsImport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Import"), + showPaymentInstructions: z.boolean().describe("Office Show Payment Instructions"), + showCompanyRegistrationNumber: z.boolean(), + reportInvoicesToHungarianTaxAuthority: z.boolean(), + restrictPositionInvolvedParties: z.boolean(), + showWatermarkOnDocuments: z.boolean(), + showInvoiceVatLinesInOfficeCurrency: z.boolean(), + usePartnerMatchCodes: z.boolean(), + restrictFinancePartnersToRelationship: z.boolean(), + costCenterId: z.string(), + minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }), + minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }), + minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }), + minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }), + countryId: z.string().describe("Office country id"), + defaultCurrencyId: z.string().describe("Office default currency id"), + representingBusinessPartnerId: z.string().describe("Representing business partner id"), + availableCurrencyIds: z.array(z.string()).readonly().describe("Office availableCurrencyIds"), + generalLedgerSystem: z.string().describe("Office general ledger system"), + factoringReportingEnabled: z.boolean(), + bankAccountCurrencyMapping: z + .array(UpdateOfficeBankAccountCurrencyMappingSchema) + .readonly() + .describe("Office bank account currency mapping"), + }) + .readonly(); + export type UpdateOfficeRequest = z.infer; + + /** + * UploadOfficeDocumentRequestDtoSchema + * @type { object } + * @property { string } fileName File name with extension + * @property { string } mimeType MIME type of the file + * @property { number } fileSize Size of the file + * @property { string } language Language of the document + * @property { string } documentPart Part of the document this image represents + */ + export const UploadOfficeDocumentRequestDtoSchema = z + .object({ + fileName: z.string().describe("File name with extension"), + mimeType: z.string().describe("MIME type of the file"), + fileSize: z.number().describe("Size of the file"), + language: CommonModels.LanguageEnumSchema.describe("Language of the document"), + documentPart: OfficeDocumentPartEnumSchema.describe("Part of the document this image represents"), + }) + .readonly(); + export type UploadOfficeDocumentRequestDto = z.infer; + + /** + * OfficeListItemResponseSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { number } numberOfEmployees + */ + export const OfficeListItemResponseSchema = z + .object({ id: z.string(), name: z.string(), numberOfEmployees: z.number() }) + .readonly(); + export type OfficeListItemResponse = z.infer; + + /** + * OfficeFilterDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } search + */ + export const OfficeFilterDtoSchema = z.object({ name: z.string().describe("Name"), search: z.string() }).readonly(); + export type OfficeFilterDto = z.infer; + + /** + * OfficeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const OfficeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type OfficeLabelFilterDto = z.infer; + + /** + * CreateOfficeRequestSchema + * @type { object } + * @property { string } name + */ + export const CreateOfficeRequestSchema = z.object({ name: z.string() }).readonly(); + export type CreateOfficeRequest = z.infer; + + /** + * DocumentImageUploadInstructionsDtoSchema + * @type { object } + * @property { string } method HTTP method to use for upload + * @property { string } url URL to upload the file to + * @property { string } documentId ID of the created/updated document setting + */ + export const DocumentImageUploadInstructionsDtoSchema = z + .object({ + method: z.string().describe("HTTP method to use for upload"), + url: z.string().describe("URL to upload the file to"), + documentId: z.string().describe("ID of the created/updated document setting"), + }) + .readonly(); + export type DocumentImageUploadInstructionsDto = z.infer; + + /** + * CreateOfficeBankAccountDtoSchema + * @type { object } + * @property { string } name Bank account name + * @property { string } bankName Bank name + * @property { string } iban IBAN + * @property { string } swiftBic SWIFT/BIC code + * @property { boolean } useFooterOnInvoice Use footer on invoice + */ + export const CreateOfficeBankAccountDtoSchema = z + .object({ + name: z.string().describe("Bank account name"), + bankName: z.string().describe("Bank name"), + iban: z.string().describe("IBAN"), + swiftBic: z.string().describe("SWIFT/BIC code"), + useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), + }) + .readonly(); + export type CreateOfficeBankAccountDto = z.infer; + + /** + * UpdateOfficeBankAccountDtoSchema + * @type { object } + * @property { string } name Bank account name + * @property { string } bankName Bank name + * @property { string } iban IBAN + * @property { string } swiftBic SWIFT/BIC code + * @property { boolean } useFooterOnInvoice Use footer on invoice + * @property { boolean } isFactoringBank Is factoring bank + */ + export const UpdateOfficeBankAccountDtoSchema = z + .object({ + name: z.string().describe("Bank account name"), + bankName: z.string().describe("Bank name"), + iban: z.string().describe("IBAN"), + swiftBic: z.string().describe("SWIFT/BIC code"), + useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), + isFactoringBank: z.boolean().describe("Is factoring bank"), + }) + .readonly(); + export type UpdateOfficeBankAccountDto = z.infer; + + /** + * UploadOfficeBankAccountFooterRequestDtoSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType File MIME type + * @property { number } fileSize Size of the file + */ + export const UploadOfficeBankAccountFooterRequestDtoSchema = z + .object({ + fileName: z.string().describe("File name"), + mimeType: z.string().describe("File MIME type"), + fileSize: z.number().describe("Size of the file"), + }) + .readonly(); + export type UploadOfficeBankAccountFooterRequestDto = z.infer; + + /** + * OfficesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const OfficesPaginateOrderParamEnumSchema = z.enum(["name"]); + export type OfficesPaginateOrderParamEnum = z.infer; + export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema.enum; + + /** + * OfficesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficeListItemResponse[] } items + */ + export const OfficesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(OfficeListItemResponseSchema).readonly() }).readonly().shape, + }); + export type OfficesPaginateResponse = z.infer; + + /** + * FindAllLabelsResponseSchema + * @type { array } + */ + export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type FindAllLabelsResponse = z.infer; + + /** + * OfficesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const OfficesPaginateLabelsOrderParamEnumSchema = z.enum(["name"]); + export type OfficesPaginateLabelsOrderParamEnum = z.infer; + export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * OfficesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const OfficesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type OfficesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/offices/offices.queries.ts b/test/generated/base/offices/offices.queries.ts new file mode 100644 index 0000000..a752a7b --- /dev/null +++ b/test/generated/base/offices/offices.queries.ts @@ -0,0 +1,510 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { OfficesAcl } from "./offices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { OfficesModels } from "./offices.models"; +import { OfficesApi } from "./offices.api"; + +export namespace OfficesQueries { + export const moduleName = QueryModule.Offices; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: OfficesModels.OfficeFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string) => + [...keys.all, "/offices", "infinite", limit, order, filter, cursor] as const, + findAllLabels: (search?: string) => [...keys.all, "/offices/labels", search] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: OfficesModels.OfficeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: OfficesModels.OfficeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/labels/paginate", "infinite", limit, order, filter, cursor] as const, + get: (id: string) => [...keys.all, "/offices/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate offices + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: OfficesModels.OfficeFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => OfficesApi.paginate(limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate offices + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: OfficesModels.OfficeFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => OfficesApi.paginate(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create new office + * @permission Requires `canUseCreate` ability + * @param { OfficesModels.CreateOfficeRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(OfficesAcl.canUseCreate()); + return OfficesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindAllLabels` + * @summary List all offices with only their labels + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllLabels = ( + { search }: { search?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findAllLabels(search), + queryFn: () => OfficesApi.findAllLabels(search, config), + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate offices with only their labels + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: OfficesModels.OfficeLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => OfficesApi.paginateLabels(limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate offices with only their labels + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: OfficesModels.OfficeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGet` + * @summary Get office by id + * @permission Requires `canUseGet` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(id), + queryFn: () => { + checkAcl(OfficesAcl.canUseGet()); + return OfficesApi.get(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update office + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { OfficesModels.UpdateOfficeRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(OfficesAcl.canUseUpdate()); + return OfficesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUploadDocumentImage` + * @summary Upload document image for an office + * @permission Requires `canUseUploadDocumentImage` ability + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UploadOfficeDocumentRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useUploadDocumentImage = ( + options?: AppMutationOptions< + typeof OfficesApi.uploadDocumentImage, + { + officeId: string; + data: OfficesModels.UploadOfficeDocumentRequestDto; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId })); + const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreateBankAccount` + * @summary Create office bank account + * @permission Requires `canUseCreateBankAccount` ability + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.CreateOfficeBankAccountDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateBankAccount = ( + options?: AppMutationOptions< + typeof OfficesApi.createBankAccount, + { officeId: string; data: OfficesModels.CreateOfficeBankAccountDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId })); + return OfficesApi.createBankAccount(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateBankAccount` + * @summary Update office bank account + * @permission Requires `canUseUpdateBankAccount` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UpdateOfficeBankAccountDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBankAccount = ( + options?: AppMutationOptions< + typeof OfficesApi.updateBankAccount, + { accountId: string; officeId: string; data: OfficesModels.UpdateOfficeBankAccountDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ accountId, officeId, data }) => { + checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId })); + return OfficesApi.updateBankAccount(accountId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteBankAccount` + * @summary Delete office bank account + * @permission Requires `canUseDeleteBankAccount` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteBankAccount = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ accountId, officeId }) => { + checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId })); + return OfficesApi.deleteBankAccount(accountId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUploadBankAccountFooter` + * @summary Upload office bank account footer + * @permission Requires `canUseUploadBankAccountFooter` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UploadOfficeBankAccountFooterRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useUploadBankAccountFooter = ( + options?: AppMutationOptions< + typeof OfficesApi.uploadBankAccountFooter, + { + accountId: string; + officeId: string; + data: OfficesModels.UploadOfficeBankAccountFooterRequestDto; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId })); + const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/packageTypes/packageTypes.acl.ts b/test/generated/base/packageTypes/packageTypes.acl.ts new file mode 100644 index 0000000..625e4db --- /dev/null +++ b/test/generated/base/packageTypes/packageTypes.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PackageTypesAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "PackageType"] as AbilityTuple<"Create", "PackageType">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "PackageType"] as AbilityTuple<"Update", "PackageType">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "PackageType"] as AbilityTuple<"Archive", "PackageType">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "PackageType"] as AbilityTuple<"Archive", "PackageType">; +} diff --git a/test/generated/base/packageTypes/packageTypes.api.ts b/test/generated/base/packageTypes/packageTypes.api.ts new file mode 100644 index 0000000..36375cd --- /dev/null +++ b/test/generated/base/packageTypes/packageTypes.api.ts @@ -0,0 +1,131 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PackageTypesModels } from "./packageTypes.models"; + +export namespace PackageTypesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: PackageTypesModels.PackageTypePaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, `/package-types`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types`, + ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), + config, + ); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: PackageTypesModels.PackageTypeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, + `/package-types/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}`, + config, + ); + }; + + export const update = ( + id: string, + data: PackageTypesModels.UpdatePackageTypeRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}`, + ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/packageTypes/packageTypes.configs.ts b/test/generated/base/packageTypes/packageTypes.configs.ts new file mode 100644 index 0000000..786762d --- /dev/null +++ b/test/generated/base/packageTypes/packageTypes.configs.ts @@ -0,0 +1,128 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PackageTypesModels } from "./packageTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PackageTypesQueries } from "./packageTypes.queries"; +import { PackageTypesAcl } from "./packageTypes.acl"; + +export namespace PackageTypesConfigs { + export const packageTypesConfig = { + meta: { + title: "Package Types", + }, + readAll: { + acl: PackageTypesAcl.canUsePaginate, + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + paginated: PackageTypesQueries.usePaginate, + infinite: PackageTypesQueries.usePaginateInfinite, + filters: { + schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + length: true, + width: true, + height: true, + unit: true, + archived: true, + code: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: PackageTypesAcl.canUseFindById, + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + query: PackageTypesQueries.useFindById, + }, + create: { + acl: PackageTypesAcl.canUseCreate, + schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, + mutation: PackageTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, + options: { + inputs: { + name: true, + length: true, + width: true, + height: true, + unit: true, + code: true, + }, + }, + }), + }, + update: { + acl: PackageTypesAcl.canUseUpdate, + schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, + mutation: PackageTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, + options: { + inputs: { + name: true, + length: true, + width: true, + height: true, + unit: true, + code: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: PackageTypesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PackageTypesQueries.usePaginateLabels, + infinite: PackageTypesQueries.usePaginateLabelsInfinite, + filters: { + schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/packageTypes/packageTypes.models.ts b/test/generated/base/packageTypes/packageTypes.models.ts new file mode 100644 index 0000000..ab3d38c --- /dev/null +++ b/test/generated/base/packageTypes/packageTypes.models.ts @@ -0,0 +1,572 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PackageTypesModels { + /** + * PackageTypeCodeEnumSchema + * @type { enum } + */ + export const PackageTypeCodeEnumSchema = z.enum([ + "1A", + "1B", + "1D", + "1F", + "1G", + "1W", + "2C", + "3A", + "3H", + "43", + "44", + "4A", + "4B", + "4C", + "4D", + "4F", + "4G", + "4H", + "5H", + "5L", + "5M", + "6H", + "6P", + "7A", + "7B", + "8A", + "8B", + "8C", + "AA", + "AB", + "AC", + "AD", + "AE", + "AF", + "AG", + "AH", + "AI", + "AJ", + "AL", + "AM", + "AP", + "AT", + "AV", + "B4", + "BA", + "BB", + "BC", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BK", + "BL", + "BM", + "BN", + "BO", + "BP", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BX", + "BY", + "BZ", + "CA", + "CB", + "CC", + "CD", + "CE", + "CF", + "CG", + "CH", + "CI", + "CJ", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CQ", + "CR", + "CS", + "CT", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DA", + "DB", + "DC", + "DG", + "DH", + "DI", + "DJ", + "DK", + "DL", + "DM", + "DN", + "DP", + "DR", + "DS", + "DT", + "DU", + "DV", + "DW", + "DX", + "DY", + "EC", + "ED", + "EE", + "EF", + "EG", + "EH", + "EI", + "EN", + "FB", + "FC", + "FD", + "FE", + "FI", + "FL", + "FO", + "FP", + "FR", + "FT", + "FW", + "FX", + "GB", + "GI", + "GL", + "GR", + "GU", + "GY", + "GZ", + "HA", + "HB", + "HC", + "HG", + "HN", + "HR", + "IA", + "IB", + "IC", + "ID", + "IE", + "IF", + "IG", + "IH", + "IK", + "IL", + "IN", + "IZ", + "JB", + "JC", + "JG", + "JR", + "JT", + "JY", + "KG", + "KI", + "LE", + "LG", + "LT", + "LU", + "LV", + "LZ", + "MA", + "MB", + "MC", + "ME", + "MR", + "MS", + "MT", + "MW", + "MX", + "NA", + "NE", + "NF", + "NG", + "NS", + "NT", + "NU", + "NV", + "OA", + "OB", + "OC", + "OD", + "OE", + "OF", + "OK", + "OT", + "OU", + "P2", + "PA", + "PB", + "PC", + "PD", + "PE", + "PF", + "PG", + "PH", + "PI", + "PJ", + "PK", + "PL", + "PN", + "PO", + "PP", + "PR", + "PT", + "PU", + "PV", + "PX", + "PY", + "PZ", + "QA", + "QB", + "QC", + "QD", + "QF", + "QG", + "QH", + "QJ", + "QK", + "QL", + "QM", + "QN", + "QP", + "QQ", + "QR", + "QS", + "RD", + "RG", + "RJ", + "RK", + "RL", + "RO", + "RT", + "RZ", + "SA", + "SB", + "SC", + "SD", + "SE", + "SH", + "SI", + "SK", + "SL", + "SM", + "SO", + "SP", + "SS", + "ST", + "SU", + "SV", + "SW", + "SY", + "SZ", + "T1", + "TB", + "TC", + "TD", + "TE", + "TG", + "TI", + "TK", + "TL", + "TN", + "TO", + "TR", + "TS", + "TT", + "TU", + "TV", + "TW", + "TY", + "TZ", + "UC", + "UN", + "VA", + "VG", + "VI", + "VK", + "VL", + "VO", + "VP", + "VQ", + "VN", + "VR", + "VS", + "VY", + "WA", + "WB", + "WC", + "WD", + "WF", + "WG", + "WH", + "WJ", + "WK", + "WL", + "WM", + "WN", + "WP", + "WQ", + "WR", + "WS", + "WT", + "WU", + "WV", + "WW", + "WX", + "WY", + "WZ", + "XA", + "XB", + "XC", + "XD", + "XF", + "XG", + "XH", + "XJ", + "XK", + "YA", + "YB", + "YC", + "YD", + "YF", + "YG", + "YH", + "YJ", + "YK", + "YL", + "YM", + "YN", + "YP", + "YQ", + "YR", + "YS", + "YT", + "YV", + "YW", + "YX", + "YY", + "YZ", + "ZA", + "ZB", + "ZC", + "ZD", + "ZF", + "ZG", + "ZH", + "ZJ", + "ZK", + "ZL", + "ZM", + "ZN", + "ZP", + "ZQ", + "ZR", + "ZS", + "ZT", + "ZU", + "ZV", + "ZW", + "ZX", + "ZY", + "ZZ", + ]); + export type PackageTypeCodeEnum = z.infer; + export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; + + /** + * PackageTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type PackageTypeEmployeeDTO = z.infer; + + /** + * PackageTypeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the package type + * @property { string } name Unique name for the package type + * @property { number } length Length of the package type + * @property { number } width Width of the package type + * @property { number } height Height of the package type + * @property { string } unit Measurement unit for dimensions + * @property { boolean } archived Indicates if the package type is archived + * @property { PackageTypeCodeEnum } code + * @property { string } createdById + * @property { PackageTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PackageTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const PackageTypeResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier for the package type"), + name: z.string().describe("Unique name for the package type"), + length: z.number().describe("Length of the package type").nullish(), + width: z.number().describe("Width of the package type").nullish(), + height: z.number().describe("Height of the package type").nullish(), + unit: z.string().describe("Measurement unit for dimensions"), + archived: z.boolean().describe("Indicates if the package type is archived"), + code: PackageTypeCodeEnumSchema.nullish(), + createdById: z.string().nullish(), + createdBy: PackageTypeEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: PackageTypeEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type PackageTypeResponseDTO = z.infer; + + /** + * CreatePackageTypeRequestDTOSchema + * @type { object } + * @property { string } name Unique name for the package type + * @property { number } length Length of the package type + * @property { number } width Width of the package type + * @property { number } height Height of the package type + * @property { string } unit Measurement unit for dimensions + * @property { PackageTypeCodeEnum } code + */ + export const CreatePackageTypeRequestDTOSchema = z + .object({ + name: z.string().describe("Unique name for the package type"), + length: z.number().describe("Length of the package type").nullish(), + width: z.number().describe("Width of the package type").nullish(), + height: z.number().describe("Height of the package type").nullish(), + unit: z.string().describe("Measurement unit for dimensions"), + code: PackageTypeCodeEnumSchema.nullish(), + }) + .readonly(); + export type CreatePackageTypeRequestDTO = z.infer; + + /** + * UpdatePackageTypeRequestDTOSchema + * @type { object } + * @property { string } name Updated name for package type + * @property { number } length Updated length of the package type + * @property { number } width Updated width of the package type + * @property { number } height Updated height of the package type + * @property { string } unit Updated measurement unit for dimensions + * @property { PackageTypeCodeEnum } code + */ + export const UpdatePackageTypeRequestDTOSchema = z + .object({ + name: z.string().describe("Updated name for package type"), + length: z.number().describe("Updated length of the package type").nullable(), + width: z.number().describe("Updated width of the package type").nullable(), + height: z.number().describe("Updated height of the package type").nullable(), + unit: z.string().describe("Updated measurement unit for dimensions"), + code: PackageTypeCodeEnumSchema, + }) + .readonly(); + export type UpdatePackageTypeRequestDTO = z.infer; + + /** + * PackageTypePaginationFilterDtoSchema + * @type { object } + * @property { boolean } archived Archived + * @property { string } search + */ + export const PackageTypePaginationFilterDtoSchema = z + .object({ archived: z.boolean().describe("Archived"), search: z.string() }) + .readonly(); + export type PackageTypePaginationFilterDto = z.infer; + + /** + * PackageTypeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const PackageTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type PackageTypeLabelFilterDto = z.infer; + + /** + * PackageTypesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const PackageTypesPaginateOrderParamEnumSchema = z.enum([ + "matchCode", + "description", + "length", + "width", + "height", + "unit", + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PackageTypesPaginateOrderParamEnum = z.infer; + export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParamEnumSchema.enum; + + /** + * PackageTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PackageTypeResponseDTO[] } items + */ + export const PackageTypesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PackageTypeResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PackageTypesPaginateResponse = z.infer; + + /** + * PackageTypesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PackageTypesPaginateLabelsOrderParamEnumSchema = z.enum([ + "matchCode", + "description", + "length", + "width", + "height", + "unit", + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PackageTypesPaginateLabelsOrderParamEnum = z.infer; + export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * PackageTypesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PackageTypesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PackageTypesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/packageTypes/packageTypes.queries.ts b/test/generated/base/packageTypes/packageTypes.queries.ts new file mode 100644 index 0000000..2550517 --- /dev/null +++ b/test/generated/base/packageTypes/packageTypes.queries.ts @@ -0,0 +1,365 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PackageTypesAcl } from "./packageTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PackageTypesModels } from "./packageTypes.models"; +import { PackageTypesApi } from "./packageTypes.api"; + +export namespace PackageTypesQueries { + export const moduleName = QueryModule.PackageTypes; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: PackageTypesModels.PackageTypePaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/package-types", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: PackageTypesModels.PackageTypePaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/package-types", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: PackageTypesModels.PackageTypeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/package-types/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: PackageTypesModels.PackageTypeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/package-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/package-types/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Package Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: PackageTypesModels.PackageTypePaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PackageTypesAcl.canUsePaginate()); + return PackageTypesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Package Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: PackageTypesModels.PackageTypePaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PackageTypesAcl.canUsePaginate()); + return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new Package Type + * @permission Requires `canUseCreate` ability + * @param { PackageTypesModels.CreatePackageTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof PackageTypesApi.create, + { data: PackageTypesModels.CreatePackageTypeRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PackageTypesAcl.canUseCreate()); + return PackageTypesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate package type labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: PackageTypesModels.PackageTypeLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PackageTypesAcl.canUsePaginateLabels()); + return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate package type labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: PackageTypesModels.PackageTypeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PackageTypesAcl.canUsePaginateLabels()); + return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get Package Type by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PackageTypesAcl.canUseFindById()); + return PackageTypesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Package Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PackageTypesModels.UpdatePackageTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof PackageTypesApi.update, + { id: string; data: PackageTypesModels.UpdatePackageTypeRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PackageTypesAcl.canUseUpdate()); + return PackageTypesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive Package Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PackageTypesAcl.canUseArchive()); + return PackageTypesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive Package Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PackageTypesAcl.canUseUnarchive()); + return PackageTypesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/partnerNetworks/partnerNetworks.acl.ts b/test/generated/base/partnerNetworks/partnerNetworks.acl.ts new file mode 100644 index 0000000..ff36863 --- /dev/null +++ b/test/generated/base/partnerNetworks/partnerNetworks.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PartnerNetworksAcl { + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "PartnerNetwork"] as AbilityTuple<"Create", "PartnerNetwork">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "PartnerNetwork"] as AbilityTuple<"Update", "PartnerNetwork">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "PartnerNetwork"] as AbilityTuple<"Archive", "PartnerNetwork">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "PartnerNetwork"] as AbilityTuple<"Archive", "PartnerNetwork">; +} diff --git a/test/generated/base/partnerNetworks/partnerNetworks.api.ts b/test/generated/base/partnerNetworks/partnerNetworks.api.ts new file mode 100644 index 0000000..075c13e --- /dev/null +++ b/test/generated/base/partnerNetworks/partnerNetworks.api.ts @@ -0,0 +1,135 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; + +export namespace PartnerNetworksApi { + export const paginateLabels = ( + limit: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, + `/partner-networks/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const paginate = ( + limit: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, + `/partner-networks`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks`, + ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), + config, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}`, + config, + ); + }; + + export const update = ( + id: string, + data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}`, + ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/partnerNetworks/partnerNetworks.configs.ts b/test/generated/base/partnerNetworks/partnerNetworks.configs.ts new file mode 100644 index 0000000..1f87ddf --- /dev/null +++ b/test/generated/base/partnerNetworks/partnerNetworks.configs.ts @@ -0,0 +1,113 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PartnerNetworksQueries } from "./partnerNetworks.queries"; +import { PartnerNetworksAcl } from "./partnerNetworks.acl"; + +export namespace PartnerNetworksConfigs { + export const partnerNetworksConfig = { + meta: { + title: "Partner Networks", + }, + readAll: { + acl: PartnerNetworksAcl.canUsePaginate, + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + paginated: PartnerNetworksQueries.usePaginate, + infinite: PartnerNetworksQueries.usePaginateInfinite, + filters: { + schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: PartnerNetworksAcl.canUseFindById, + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + query: PartnerNetworksQueries.useFindById, + }, + create: { + acl: PartnerNetworksAcl.canUseCreate, + schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, + mutation: PartnerNetworksQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + update: { + acl: PartnerNetworksAcl.canUseUpdate, + schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, + mutation: PartnerNetworksQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: PartnerNetworksAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PartnerNetworksQueries.usePaginateLabels, + infinite: PartnerNetworksQueries.usePaginateLabelsInfinite, + filters: { + schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/partnerNetworks/partnerNetworks.models.ts b/test/generated/base/partnerNetworks/partnerNetworks.models.ts new file mode 100644 index 0000000..694c1ed --- /dev/null +++ b/test/generated/base/partnerNetworks/partnerNetworks.models.ts @@ -0,0 +1,142 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PartnerNetworksModels { + /** + * PartnerNetworkEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type PartnerNetworkEmployeeDTO = z.infer; + + /** + * PartnerNetworkResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the partner network + * @property { string } name Name of the partner network + * @property { boolean } archived Whether the partner network is archived + * @property { string } createdById + * @property { PartnerNetworkEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PartnerNetworkEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const PartnerNetworkResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the partner network"), + name: z.string().describe("Name of the partner network"), + archived: z.boolean().describe("Whether the partner network is archived"), + createdById: z.string().nullish(), + createdBy: PartnerNetworkEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: PartnerNetworkEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type PartnerNetworkResponseDTO = z.infer; + + /** + * PartnerNetworkLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const PartnerNetworkLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type PartnerNetworkLabelFilterDto = z.infer; + + /** + * PartnerNetworkPaginationFilterDtoSchema + * @type { object } + * @property { string } search Free search + * @property { boolean } archived + */ + export const PartnerNetworkPaginationFilterDtoSchema = z + .object({ search: z.string().describe("Free search"), archived: z.boolean() }) + .readonly(); + export type PartnerNetworkPaginationFilterDto = z.infer; + + /** + * CreatePartnerNetworkRequestDTOSchema + * @type { object } + * @property { string } name Name of the partner network + */ + export const CreatePartnerNetworkRequestDTOSchema = z + .object({ name: z.string().describe("Name of the partner network") }) + .readonly(); + export type CreatePartnerNetworkRequestDTO = z.infer; + + /** + * UpdatePartnerNetworkRequestDTOSchema + * @type { object } + * @property { string } name Name of the partner network + */ + export const UpdatePartnerNetworkRequestDTOSchema = z + .object({ name: z.string().describe("Name of the partner network") }) + .readonly(); + export type UpdatePartnerNetworkRequestDTO = z.infer; + + /** + * PartnerNetworksPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PartnerNetworksPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PartnerNetworksPaginateLabelsOrderParamEnum = z.infer< + typeof PartnerNetworksPaginateLabelsOrderParamEnumSchema + >; + export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPaginateLabelsOrderParamEnumSchema.enum; + + /** + * PartnerNetworksPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PartnerNetworksPaginateLabelsResponse = z.infer; + + /** + * PartnerNetworksPaginateOrderParamEnumSchema + * @type { enum } + */ + export const PartnerNetworksPaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PartnerNetworksPaginateOrderParamEnum = z.infer; + export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrderParamEnumSchema.enum; + + /** + * PartnerNetworksPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerNetworkResponseDTO[] } items + */ + export const PartnerNetworksPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PartnerNetworksPaginateResponse = z.infer; +} diff --git a/test/generated/base/partnerNetworks/partnerNetworks.queries.ts b/test/generated/base/partnerNetworks/partnerNetworks.queries.ts new file mode 100644 index 0000000..cd0e2ae --- /dev/null +++ b/test/generated/base/partnerNetworks/partnerNetworks.queries.ts @@ -0,0 +1,370 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PartnerNetworksAcl } from "./partnerNetworks.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; +import { PartnerNetworksApi } from "./partnerNetworks.api"; + +export namespace PartnerNetworksQueries { + export const moduleName = QueryModule.PartnerNetworks; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/partner-networks/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/partner-networks/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginate: ( + limit?: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/partner-networks", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/partner-networks", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/partner-networks/:id", id] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate partner networks with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); + return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate partner networks with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); + return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginate` + * @summary Paginate Partner Networks + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUsePaginate()); + return PartnerNetworksApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Partner Networks + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { + limit: number; + order?: string; + filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PartnerNetworksAcl.canUsePaginate()); + return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new Partner Network + * @permission Requires `canUseCreate` ability + * @param { PartnerNetworksModels.CreatePartnerNetworkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof PartnerNetworksApi.create, + { data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PartnerNetworksAcl.canUseCreate()); + return PartnerNetworksApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get Partner Network by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUseFindById()); + return PartnerNetworksApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Partner Network + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof PartnerNetworksApi.update, + { id: string; data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PartnerNetworksAcl.canUseUpdate()); + return PartnerNetworksApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive Partner Network + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PartnerNetworksAcl.canUseArchive()); + return PartnerNetworksApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive Partner Network + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PartnerNetworksAcl.canUseUnarchive()); + return PartnerNetworksApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts new file mode 100644 index 0000000..972a857 --- /dev/null +++ b/test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PaymentConfirmationsAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read payment confirmation items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate payment confirmation document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ + export const canUseGenerate = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetEml` mutation ability. For global ability, omit the object parameter. + * @description Download payment confirmation as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetEml` mutation + */ + export const canUseGetEml = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; +} diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.api.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.api.ts new file mode 100644 index 0000000..f91b0f7 --- /dev/null +++ b/test/generated/base/paymentConfirmations/paymentConfirmations.api.ts @@ -0,0 +1,88 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; + +export namespace PaymentConfirmationsApi { + export const get = ( + officeId: string, + filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, + limit: number, + order?: string, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, + `/offices/${officeId}/payment-confirmations`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const generate = ( + officeId: string, + data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payment-confirmations/generate`, + ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const getEml = ( + officeId: string, + data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payment-confirmations/eml`, + ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts new file mode 100644 index 0000000..79c3145 --- /dev/null +++ b/test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts @@ -0,0 +1,48 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; +import { PaymentConfirmationsQueries } from "./paymentConfirmations.queries"; +import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; + +export namespace PaymentConfirmationsConfigs { + export const paymentConfirmationsConfig = { + meta: { + title: "Payment Confirmations", + }, + readAll: { + acl: PaymentConfirmationsAcl.canUseGet, + schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, + paginated: PaymentConfirmationsQueries.useGet, + infinite: PaymentConfirmationsQueries.useGetInfinite, + filters: { + schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, + options: { + inputs: { + businessPartnerId: true, + paymentDate: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, + options: { + columns: { + invoiceId: true, + invoiceNumber: true, + invoiceDate: true, + invoiceAmount: true, + amount: true, + currencyNotation: true, + reference: true, + position: true, + paymentDate: true, + }, + sortable: PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.models.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.models.ts new file mode 100644 index 0000000..f7c4296 --- /dev/null +++ b/test/generated/base/paymentConfirmations/paymentConfirmations.models.ts @@ -0,0 +1,95 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PaymentConfirmationsModels { + /** + * PaymentConfirmationPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ + export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); + export type PaymentConfirmationPositionDto = z.infer; + + /** + * PaymentConfirmationItemDtoSchema + * @type { object } + * @property { string } invoiceId Invoice ID + * @property { string } invoiceNumber Invoice number + * @property { string } invoiceDate Invoice date + * @property { number } invoiceAmount Invoice amount + * @property { number } amount Payment amount + * @property { string } currencyNotation Currency notation + * @property { string } reference Reference + * @property { PaymentConfirmationPositionDto } position Position information + * @property { string } paymentDate Payment date + */ + export const PaymentConfirmationItemDtoSchema = z + .object({ + invoiceId: z.string().describe("Invoice ID"), + invoiceNumber: z.string().describe("Invoice number"), + invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date"), + invoiceAmount: z.number().describe("Invoice amount"), + amount: z.number().describe("Payment amount"), + currencyNotation: z.string().describe("Currency notation"), + reference: z.string().describe("Reference").nullish(), + position: PaymentConfirmationPositionDtoSchema.describe("Position information"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), + }) + .readonly(); + export type PaymentConfirmationItemDto = z.infer; + + /** + * PaymentConfirmationItemFilterDtoSchema + * @type { object } + * @property { string } businessPartnerId Business partner ID + * @property { string } paymentDate Payment date + */ + export const PaymentConfirmationItemFilterDtoSchema = z + .object({ + businessPartnerId: z.string().describe("Business partner ID"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), + }) + .readonly(); + export type PaymentConfirmationItemFilterDto = z.infer; + + /** + * GeneratePaymentConfirmationRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId Business partner ID + * @property { string } paymentDate Payment date + * @property { string } positionId Position ID (optional) + */ + export const GeneratePaymentConfirmationRequestDtoSchema = z + .object({ + businessPartnerId: z.string().describe("Business partner ID"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), + positionId: z.string().describe("Position ID (optional)").nullish(), + }) + .readonly(); + export type GeneratePaymentConfirmationRequestDto = z.infer; + + /** + * PaymentConfirmationsGetOrderParamEnumSchema + * @type { enum } + */ + export const PaymentConfirmationsGetOrderParamEnumSchema = z.enum(["paymentDate", "invoiceNumber", "amount"]); + export type PaymentConfirmationsGetOrderParamEnum = z.infer; + export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrderParamEnumSchema.enum; + + /** + * PaymentConfirmationsGetResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PaymentConfirmationItemDto[] } items + */ + export const PaymentConfirmationsGetResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).readonly() }).readonly().shape, + }); + export type PaymentConfirmationsGetResponse = z.infer; +} diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts new file mode 100644 index 0000000..265dcc4 --- /dev/null +++ b/test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts @@ -0,0 +1,204 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; +import { PaymentConfirmationsApi } from "./paymentConfirmations.api"; + +export namespace PaymentConfirmationsQueries { + export const moduleName = QueryModule.PaymentConfirmations; + + export const keys = { + all: [moduleName] as const, + get: ( + officeId: string, + filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, + limit?: number, + order?: string, + page?: number, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/payment-confirmations", officeId, filter, limit, order, page, cursor] as const, + getInfinite: ( + officeId: string, + filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, + limit?: number, + order?: string, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/payment-confirmations", + "infinite", + officeId, + filter, + limit, + order, + cursor, + ] as const, + }; + + /** + * Query `useGet` + * @summary Get payment confirmation items + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { + officeId, + filter, + limit, + order, + page, + cursor, + }: { + officeId: string; + filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto; + limit: number; + order?: string; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, filter, limit, order, page, cursor), + queryFn: () => { + checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId })); + return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useGetInfinite + * @summary Get payment confirmation items + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useGetInfinite = ( + { + officeId, + filter, + limit, + order, + cursor, + }: { + officeId: string; + filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto; + limit: number; + order?: string; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId })); + return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useGenerate` - recommended when file should not be cached + * @summary Generate payment confirmation PDF + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useGenerate = ( + options?: AppMutationOptions< + typeof PaymentConfirmationsApi.generate, + { officeId: string; data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId })); + return PaymentConfirmationsApi.generate(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGetEml` - recommended when file should not be cached + * @summary Get payment confirmation as EML file with PDF attachment + * @permission Requires `canUseGetEml` ability + * @param { string } mutation.officeId Path parameter + * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useGetEml = ( + options?: AppMutationOptions< + typeof PaymentConfirmationsApi.getEml, + { officeId: string; data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId })); + return PaymentConfirmationsApi.getEml(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/ports/ports.acl.ts b/test/generated/base/ports/ports.acl.ts new file mode 100644 index 0000000..41bc6d7 --- /dev/null +++ b/test/generated/base/ports/ports.acl.ts @@ -0,0 +1,33 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PortsAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Port"] as AbilityTuple<"Create", "Port">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Port"] as AbilityTuple<"Update", "Port">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; +} diff --git a/test/generated/base/ports/ports.api.ts b/test/generated/base/ports/ports.api.ts new file mode 100644 index 0000000..86eba5f --- /dev/null +++ b/test/generated/base/ports/ports.api.ts @@ -0,0 +1,100 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PortsModels } from "./ports.models"; + +export namespace PortsApi { + export const paginate = ( + limit: number, + order?: string, + filter?: PortsModels.PortPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: PortsModels.PortsPaginateResponseSchema }, `/ports`, { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { + type: "query", + name: "order", + }), + filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: PortsModels.CreatePortRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports`, + ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), + config, + ); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: PortsModels.PortLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, `/ports/labels/paginate`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports/${id}`, + ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), + config, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: PortsModels.PortResponseDTOSchema }, `/ports/${id}`, config); + }; +} diff --git a/test/generated/base/ports/ports.configs.ts b/test/generated/base/ports/ports.configs.ts new file mode 100644 index 0000000..de7e09d --- /dev/null +++ b/test/generated/base/ports/ports.configs.ts @@ -0,0 +1,127 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PortsModels } from "./ports.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PortsQueries } from "./ports.queries"; +import { PortsAcl } from "./ports.acl"; + +export namespace PortsConfigs { + export const portsConfig = { + meta: { + title: "Ports", + }, + readAll: { + acl: PortsAcl.canUsePaginate, + schema: PortsModels.PortResponseDTOSchema, + paginated: PortsQueries.usePaginate, + infinite: PortsQueries.usePaginateInfinite, + filters: { + schema: PortsModels.PortPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PortsModels.PortPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PortsModels.PortResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + address: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PortsModels.PortsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: PortsAcl.canUseFindById, + schema: PortsModels.PortResponseDTOSchema, + query: PortsQueries.useFindById, + }, + create: { + acl: PortsAcl.canUseCreate, + schema: PortsModels.CreatePortRequestDTOSchema, + mutation: PortsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PortsModels.CreatePortRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, + }), + }, + update: { + acl: PortsAcl.canUseUpdate, + schema: PortsModels.UpdatePortRequestDTOSchema, + mutation: PortsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PortsModels.UpdatePortRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: PortsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PortsQueries.usePaginateLabels, + infinite: PortsQueries.usePaginateLabelsInfinite, + filters: { + schema: PortsModels.PortLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PortsModels.PortLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PortsModels.PortsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/ports/ports.models.ts b/test/generated/base/ports/ports.models.ts new file mode 100644 index 0000000..caec629 --- /dev/null +++ b/test/generated/base/ports/ports.models.ts @@ -0,0 +1,217 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PortsModels { + /** + * PortCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type PortCityDto = z.infer; + + /** + * PortCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ + export const PortCountryDtoSchema = z + .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) + .readonly(); + export type PortCountryDto = z.infer; + + /** + * PortAddressDtoSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { PortCityDto } city + * @property { string } district District name + * @property { PortCountryDto } country + */ + export const PortAddressDtoSchema = z + .object({ + street: z.string().describe("Street address"), + zip: z.string().describe("ZIP/Postal code"), + city: PortCityDtoSchema.nullish(), + district: z.string().describe("District name").nullish(), + country: PortCountryDtoSchema.nullish(), + }) + .readonly(); + export type PortAddressDto = z.infer; + + /** + * PortEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type PortEmployeeDTO = z.infer; + + /** + * PortResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the port + * @property { string } name Name of the port + * @property { string } matchCode Match code for the port + * @property { PortAddressDto } address Address details of the port + * @property { string } createdById + * @property { PortEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PortEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const PortResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the port"), + name: z.string().describe("Name of the port"), + matchCode: z.string().describe("Match code for the port"), + address: PortAddressDtoSchema.describe("Address details of the port"), + createdById: z.string().nullish(), + createdBy: PortEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: PortEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type PortResponseDTO = z.infer; + + /** + * PortPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter ports by name or match code + */ + export const PortPaginationFilterDtoSchema = z + .object({ search: z.string().describe("Search term to filter ports by name or match code") }) + .readonly(); + export type PortPaginationFilterDto = z.infer; + + /** + * PortLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const PortLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type PortLabelFilterDto = z.infer; + + /** + * CreatePortRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } matchCode + * @property { string } street Street address + * @property { string } secondaryStreet + * @property { string } zip ZIP / Postal code + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } district + */ + export const CreatePortRequestDTOSchema = z + .object({ + name: z.string(), + matchCode: z.string(), + street: z.string().describe("Street address"), + secondaryStreet: z.string().nullish(), + zip: z.string().describe("ZIP / Postal code"), + cityId: z.string().describe("City id"), + countryId: z.string().describe("Country id"), + district: z.string().nullish(), + }) + .readonly(); + export type CreatePortRequestDTO = z.infer; + + /** + * UpdatePortRequestDTOSchema + * @type { object } + * @property { string } name Updated name + * @property { string } matchCode Updated match code + * @property { string } street Updated street address + * @property { string } secondaryStreet Updated secondary street + * @property { string } zip Updated ZIP/Postal code + * @property { string } cityId Updated city id + * @property { string } countryId Updated country id + * @property { string } district + */ + export const UpdatePortRequestDTOSchema = z + .object({ + name: z.string().describe("Updated name"), + matchCode: z.string().describe("Updated match code"), + street: z.string().describe("Updated street address"), + secondaryStreet: z.string().describe("Updated secondary street"), + zip: z.string().describe("Updated ZIP/Postal code"), + cityId: z.string().describe("Updated city id"), + countryId: z.string().describe("Updated country id"), + district: z.string(), + }) + .readonly(); + export type UpdatePortRequestDTO = z.infer; + + /** + * PortsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const PortsPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PortsPaginateOrderParamEnum = z.infer; + export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enum; + + /** + * PortsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PortResponseDTO[] } items + */ + export const PortsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PortResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PortsPaginateResponse = z.infer; + + /** + * PortsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PortsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PortsPaginateLabelsOrderParamEnum = z.infer; + export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * PortsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PortsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PortsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/ports/ports.queries.ts b/test/generated/base/ports/ports.queries.ts new file mode 100644 index 0000000..41a7842 --- /dev/null +++ b/test/generated/base/ports/ports.queries.ts @@ -0,0 +1,281 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PortsAcl } from "./ports.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PortsModels } from "./ports.models"; +import { PortsApi } from "./ports.api"; + +export namespace PortsQueries { + export const moduleName = QueryModule.Ports; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: PortsModels.PortPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/ports", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string) => + [...keys.all, "/ports", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: PortsModels.PortLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/ports/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: PortsModels.PortLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/ports/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/ports/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Ports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: PortsModels.PortPaginationFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PortsAcl.canUsePaginate()); + return PortsApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Ports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: PortsModels.PortPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PortsAcl.canUsePaginate()); + return PortsApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create port + * @permission Requires `canUseCreate` ability + * @param { PortsModels.CreatePortRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PortsAcl.canUseCreate()); + return PortsApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate ports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: PortsModels.PortLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PortsAcl.canUsePaginateLabels()); + return PortsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate ports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: PortsModels.PortLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PortsAcl.canUsePaginateLabels()); + return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update port + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PortsModels.UpdatePortRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PortsAcl.canUseUpdate()); + return PortsApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get port by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PortsAcl.canUseFindById()); + return PortsApi.findById(id, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/positionAccount/positionAccount.acl.ts b/test/generated/base/positionAccount/positionAccount.acl.ts new file mode 100644 index 0000000..b5691fd --- /dev/null +++ b/test/generated/base/positionAccount/positionAccount.acl.ts @@ -0,0 +1,15 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionAccountAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Read", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; +} diff --git a/test/generated/base/positionAccount/positionAccount.api.ts b/test/generated/base/positionAccount/positionAccount.api.ts new file mode 100644 index 0000000..817f5b6 --- /dev/null +++ b/test/generated/base/positionAccount/positionAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { PositionAccountModels } from "./positionAccount.models"; + +export namespace PositionAccountApi { + export const get = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/account`, + config, + ); + }; +} diff --git a/test/generated/base/positionAccount/positionAccount.models.ts b/test/generated/base/positionAccount/positionAccount.models.ts new file mode 100644 index 0000000..c4b204a --- /dev/null +++ b/test/generated/base/positionAccount/positionAccount.models.ts @@ -0,0 +1,78 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionAccountModels { + /** + * PositionAccountTotalsResponseDtoSchema + * @type { object } + * @property { number } totalBuyRates Total buy rates + * @property { number } totalSellRates Total sell rates + * @property { number } totalProfit Total profit + * @property { number } margin Margin percentage + * @property { number } displayAmount Display amount + * @property { string } displayCurrencyCode Display currency code + */ + export const PositionAccountTotalsResponseDtoSchema = z + .object({ + totalBuyRates: z.number().describe("Total buy rates"), + totalSellRates: z.number().describe("Total sell rates"), + totalProfit: z.number().describe("Total profit"), + margin: z.number().describe("Margin percentage").nullish(), + displayAmount: z.number().describe("Display amount"), + displayCurrencyCode: z.string().describe("Display currency code"), + }) + .readonly(); + export type PositionAccountTotalsResponseDto = z.infer; + + /** + * PositionAccountMasterTotalsDtoSchema + * @type { object } + * @property { PositionAccountTotalsResponseDto } totals + * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency + */ + export const PositionAccountMasterTotalsDtoSchema = z + .object({ + totals: PositionAccountTotalsResponseDtoSchema, + totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), + }) + .readonly(); + export type PositionAccountMasterTotalsDto = z.infer; + + /** + * ChildPositionAccountReferenceDtoSchema + * @type { object } + * @property { string } positionId + * @property { string } positionNumber + * @property { string } accountId + */ + export const ChildPositionAccountReferenceDtoSchema = z + .object({ positionId: z.string().nullish(), positionNumber: z.string(), accountId: z.string() }) + .readonly(); + export type ChildPositionAccountReferenceDto = z.infer; + + /** + * PositionAccountResponseDtoSchema + * @type { object } + * @property { string } id Account ID + * @property { string } positionId Position ID + * @property { string } invoiceId Invoice ID + * @property { CommonModels.PositionAccountItemDtoResponse[] } items Account items + * @property { PositionAccountTotalsResponseDto } totals + * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency + * @property { PositionAccountMasterTotalsDto } masterTotals + * @property { ChildPositionAccountReferenceDto[] } childPositionAccounts + */ + export const PositionAccountResponseDtoSchema = z + .object({ + id: z.string().describe("Account ID"), + positionId: z.string().describe("Position ID").nullish(), + invoiceId: z.string().describe("Invoice ID").nullish(), + items: z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly().describe("Account items"), + totals: PositionAccountTotalsResponseDtoSchema, + totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), + masterTotals: PositionAccountMasterTotalsDtoSchema.nullish(), + childPositionAccounts: z.array(ChildPositionAccountReferenceDtoSchema).readonly().nullish(), + }) + .readonly(); + export type PositionAccountResponseDto = z.infer; +} diff --git a/test/generated/base/positionAccount/positionAccount.queries.ts b/test/generated/base/positionAccount/positionAccount.queries.ts new file mode 100644 index 0000000..ed77533 --- /dev/null +++ b/test/generated/base/positionAccount/positionAccount.queries.ts @@ -0,0 +1,44 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionAccountAcl } from "./positionAccount.acl"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { PositionAccountApi } from "./positionAccount.api"; + +export namespace PositionAccountQueries { + export const moduleName = QueryModule.PositionAccount; + + export const keys = { + all: [moduleName] as const, + get: (positionId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/account", positionId, officeId] as const, + }; + + /** + * Query `useGet` + * @summary Get position account details + * @permission Requires `canUseGet` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { positionId, officeId }: { positionId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(positionId, officeId), + queryFn: () => { + checkAcl(PositionAccountAcl.canUseGet({ officeId })); + return PositionAccountApi.get(positionId, officeId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/positionAccountItems/positionAccountItems.acl.ts b/test/generated/base/positionAccountItems/positionAccountItems.acl.ts new file mode 100644 index 0000000..8602826 --- /dev/null +++ b/test/generated/base/positionAccountItems/positionAccountItems.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionAccountItemsAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Update", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useDeletePositionAccountItems` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePositionAccountItems` mutation + */ + export const canUseDeletePositionAccountItems = (object?: { officeId: string }) => + ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Update", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Update", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ + export const canUseDuplicate = (object?: { officeId: string }) => + ["Duplicate", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Duplicate", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useReassign` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReassign` mutation + */ + export const canUseReassign = (object?: { officeId: string }) => + ["Reassign", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Reassign", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useReorder` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation + */ + export const canUseReorder = (object?: { officeId: string }) => + ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Update", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; +} diff --git a/test/generated/base/positionAccountItems/positionAccountItems.api.ts b/test/generated/base/positionAccountItems/positionAccountItems.api.ts new file mode 100644 index 0000000..5be80b9 --- /dev/null +++ b/test/generated/base/positionAccountItems/positionAccountItems.api.ts @@ -0,0 +1,92 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionAccountItemsModels } from "./positionAccountItems.models"; + +export namespace PositionAccountItemsApi { + export const create = ( + positionId: string, + officeId: string, + data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), + config, + ); + }; + + export const deletePositionAccountItems = ( + positionId: string, + officeId: string, + data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), + config, + ); + }; + + export const update = ( + positionId: string, + officeId: string, + data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), + config, + ); + }; + + export const duplicate = ( + positionId: string, + officeId: string, + data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, + ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), + config, + ); + }; + + export const reassign = ( + positionId: string, + officeId: string, + data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items/reassign`, + ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), + config, + ); + }; + + export const reorder = ( + positionId: string, + itemId: string, + officeId: string, + data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, + ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/positionAccountItems/positionAccountItems.models.ts b/test/generated/base/positionAccountItems/positionAccountItems.models.ts new file mode 100644 index 0000000..3d0aeb7 --- /dev/null +++ b/test/generated/base/positionAccountItems/positionAccountItems.models.ts @@ -0,0 +1,251 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionAccountItemsModels { + /** + * CreatePositionChargeDataRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ + export const CreatePositionChargeDataRequestDtoSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID"), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().gte(1).describe("Quantity of the charge"), + buyRate: z.number().describe("Buy rate amount"), + buyCurrencyCode: z.string().describe("Buy rate currency code"), + buyVatRuleId: z.string().describe("Buy VAT rule ID"), + vendorId: z.string().describe("Vendor ID"), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), + sellRate: z.number().describe("Sell rate amount"), + sellCurrencyCode: z.string().describe("Sell rate currency code"), + sellVatRuleId: z.string().describe("Sell VAT rule ID"), + customerId: z.string().describe("Customer ID"), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), + }) + .readonly(); + export type CreatePositionChargeDataRequestDto = z.infer; + + /** + * CreatePositionTextDataRequestDtoSchema + * @type { object } + * @property { string } content Text content + */ + export const CreatePositionTextDataRequestDtoSchema = z + .object({ content: z.string().describe("Text content") }) + .readonly(); + export type CreatePositionTextDataRequestDto = z.infer; + + /** + * CreatePositionAccountItemRequestDtoSchema + * @type { object } + * @property { CommonModels.PositionAccountItemTypeEnum } type Item type + * @property { CreatePositionChargeDataRequestDto } charge Charge data if type is CHARGE + * @property { CreatePositionTextDataRequestDto } text Text data if type is TEXT + */ + export const CreatePositionAccountItemRequestDtoSchema = z + .object({ + type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), + charge: CreatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), + text: CreatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish(), + }) + .readonly(); + export type CreatePositionAccountItemRequestDto = z.infer; + + /** + * CreatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { CreatePositionAccountItemRequestDto[] } items Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER) + */ + export const CreatePositionAccountItemsRequestDtoSchema = z + .object({ + items: z + .array(CreatePositionAccountItemRequestDtoSchema) + .readonly() + .describe( + "Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER)", + ), + }) + .readonly(); + export type CreatePositionAccountItemsRequestDto = z.infer; + + /** + * UpdatePositionChargeDataRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ + export const UpdatePositionChargeDataRequestDtoSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID"), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().gte(1).describe("Quantity of the charge"), + buyRate: z.number().describe("Buy rate amount").nullable(), + buyCurrencyCode: z.string().describe("Buy rate currency code"), + buyVatRuleId: z.string().describe("Buy VAT rule ID"), + vendorId: z.string().describe("Vendor ID"), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), + sellRate: z.number().describe("Sell rate amount").nullable(), + sellCurrencyCode: z.string().describe("Sell rate currency code"), + sellVatRuleId: z.string().describe("Sell VAT rule ID"), + customerId: z.string().describe("Customer ID"), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), + }) + .readonly(); + export type UpdatePositionChargeDataRequestDto = z.infer; + + /** + * UpdatePositionTextDataRequestDtoSchema + * @type { object } + * @property { string } content Text content + */ + export const UpdatePositionTextDataRequestDtoSchema = z + .object({ content: z.string().describe("Text content") }) + .readonly(); + export type UpdatePositionTextDataRequestDto = z.infer; + + /** + * UpdatePositionAccountItemRequestDtoSchema + * @type { object } + * @property { CommonModels.PositionAccountItemTypeEnum } type Item type + * @property { UpdatePositionChargeDataRequestDto } charge Charge data if type is CHARGE + * @property { UpdatePositionTextDataRequestDto } text Text data if type is TEXT + */ + export const UpdatePositionAccountItemRequestDtoSchema = z + .object({ + type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), + charge: UpdatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), + text: UpdatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish(), + }) + .readonly(); + export type UpdatePositionAccountItemRequestDto = z.infer; + + /** + * UpdatePositionAccountItemWithIdRequestDtoSchema + * @type { object } + * @property { string } id ID of the item to update + * @property { UpdatePositionAccountItemRequestDto } data Data to update + */ + export const UpdatePositionAccountItemWithIdRequestDtoSchema = z + .object({ + id: z.string().describe("ID of the item to update"), + data: UpdatePositionAccountItemRequestDtoSchema.describe("Data to update"), + }) + .readonly(); + export type UpdatePositionAccountItemWithIdRequestDto = z.infer< + typeof UpdatePositionAccountItemWithIdRequestDtoSchema + >; + + /** + * UpdatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { UpdatePositionAccountItemWithIdRequestDto[] } items Array of items to update + */ + export const UpdatePositionAccountItemsRequestDtoSchema = z + .object({ + items: z.array(UpdatePositionAccountItemWithIdRequestDtoSchema).readonly().describe("Array of items to update"), + }) + .readonly(); + export type UpdatePositionAccountItemsRequestDto = z.infer; + + /** + * DeletePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to delete + */ + export const DeletePositionAccountItemsRequestDtoSchema = z + .object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to delete") }) + .readonly(); + export type DeletePositionAccountItemsRequestDto = z.infer; + + /** + * DuplicatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to duplicate + */ + export const DuplicatePositionAccountItemsRequestDtoSchema = z + .object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to duplicate") }) + .readonly(); + export type DuplicatePositionAccountItemsRequestDto = z.infer; + + /** + * ReassignPositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to reassign + * @property { string } targetPositionId Target position ID to reassign items to + */ + export const ReassignPositionAccountItemsRequestDtoSchema = z + .object({ + ids: z.array(z.string()).readonly().describe("Array of item IDs to reassign"), + targetPositionId: z.string().describe("Target position ID to reassign items to"), + }) + .readonly(); + export type ReassignPositionAccountItemsRequestDto = z.infer; + + /** + * ReorderPositionAccountItemRequestDtoSchema + * @type { object } + * @property { number } orderPosition New order position for the item + */ + export const ReorderPositionAccountItemRequestDtoSchema = z + .object({ orderPosition: z.number().describe("New order position for the item") }) + .readonly(); + export type ReorderPositionAccountItemRequestDto = z.infer; + + /** + * PositionAccountItemsCreateResponseSchema + * @type { array } + */ + export const PositionAccountItemsCreateResponseSchema = z + .array(CommonModels.PositionAccountItemDtoResponseSchema) + .readonly(); + export type PositionAccountItemsCreateResponse = z.infer; + + /** + * PositionAccountItemsUpdateResponseSchema + * @type { array } + */ + export const PositionAccountItemsUpdateResponseSchema = z + .array(CommonModels.PositionAccountItemDtoResponseSchema) + .readonly(); + export type PositionAccountItemsUpdateResponse = z.infer; + + /** + * PositionAccountItemsDuplicateResponseSchema + * @type { array } + */ + export const PositionAccountItemsDuplicateResponseSchema = z + .array(CommonModels.PositionAccountItemDtoResponseSchema) + .readonly(); + export type PositionAccountItemsDuplicateResponse = z.infer; + + /** + * ReassignResponseSchema + * @type { array } + */ + export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); + export type ReassignResponse = z.infer; +} diff --git a/test/generated/base/positionAccountItems/positionAccountItems.queries.ts b/test/generated/base/positionAccountItems/positionAccountItems.queries.ts new file mode 100644 index 0000000..909d03c --- /dev/null +++ b/test/generated/base/positionAccountItems/positionAccountItems.queries.ts @@ -0,0 +1,229 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionAccountItemsAcl } from "./positionAccountItems.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionAccountItemsModels } from "./positionAccountItems.models"; +import { PositionAccountItemsApi } from "./positionAccountItems.api"; + +export namespace PositionAccountItemsQueries { + export const moduleName = QueryModule.PositionAccountItems; + + /** + * Mutation `useCreate` + * @summary Create position account items (bulk) + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.create, + { positionId: string; officeId: string; data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId })); + return PositionAccountItemsApi.create(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeletePositionAccountItems` + * @summary Delete position account items (bulk) + * @permission Requires `canUseDeletePositionAccountItems` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeletePositionAccountItems = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.deletePositionAccountItems, + { positionId: string; officeId: string; data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId })); + return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update position account items (bulk) + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.update, + { positionId: string; officeId: string; data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId })); + return PositionAccountItemsApi.update(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicate` + * @summary Duplicate position account items (bulk) + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicate = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.duplicate, + { positionId: string; officeId: string; data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId })); + return PositionAccountItemsApi.duplicate(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useReassign` + * @summary Reassign position account items to another position (bulk) + * @permission Requires `canUseReassign` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useReassign = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.reassign, + { positionId: string; officeId: string; data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId })); + return PositionAccountItemsApi.reassign(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useReorder` + * @summary Reorder position account item + * @permission Requires `canUseReorder` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.ReorderPositionAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useReorder = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.reorder, + { + positionId: string; + itemId: string; + officeId: string; + data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, itemId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId })); + return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/positionCargo/positionCargo.acl.ts b/test/generated/base/positionCargo/positionCargo.acl.ts new file mode 100644 index 0000000..3be8f2a --- /dev/null +++ b/test/generated/base/positionCargo/positionCargo.acl.ts @@ -0,0 +1,111 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionCargoAcl { + /** + * Use for `useListCargosByPositionId` query ability. For global ability, omit the object parameter. + * @description List cargo items by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByPositionId` query + */ + export const canUseListCargosByPositionId = (object?: { officeId: string }) => + ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Read", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useCreateCargo` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCargo` mutation + */ + export const canUseCreateCargo = (object?: { officeId: string }) => + ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Create", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. + * @description List cargo labels by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query + */ + export const canUseListCargoLabels = (object?: { officeId: string }) => + ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Read", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. + * @description Get cargo summary by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query + */ + export const canUseGetCargoSummary = (object?: { officeId: string }) => + ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Read", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. + * @description Get cargo item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query + */ + export const canUseGetCargoById = (object?: { officeId: string }) => + ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Read", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. + * @description Update cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation + */ + export const canUseUpdateCargo = (object?: { officeId: string }) => + ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Update", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation + */ + export const canUseDeleteCargo = (object?: { officeId: string }) => + ["Delete", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Delete", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation + */ + export const canUseCreateBulkCargos = (object?: { officeId: string }) => + ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Create", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation + */ + export const canUseDuplicateCargo = (object?: { officeId: string }) => + ["Duplicate", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Duplicate", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; +} diff --git a/test/generated/base/positionCargo/positionCargo.api.ts b/test/generated/base/positionCargo/positionCargo.api.ts new file mode 100644 index 0000000..69b09c6 --- /dev/null +++ b/test/generated/base/positionCargo/positionCargo.api.ts @@ -0,0 +1,135 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionCargoModels } from "./positionCargo.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoApi { + export const listCargosByPositionId = ( + officeId: string, + positionId: string, + limit: number, + order?: PositionCargoModels.ListCargosByPositionIdOrderParam, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos`, + { + ...config, + params: { + order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { + type: "query", + name: "order", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const createCargo = ( + officeId: string, + positionId: string, + data: CommonModels.CreatePositionCargoDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config, + ); + }; + + export const listCargoLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/labels`, + config, + ); + }; + + export const getCargoSummary = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/summary`, + config, + ); + }; + + export const getCargoById = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + config, + ); + }; + + export const updateCargo = ( + officeId: string, + positionId: string, + cargoId: string, + data: CommonModels.UpdatePositionCargoDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), + config, + ); + }; + + export const deleteCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + undefined, + config, + ); + }; + + export const createBulkCargos = ( + numberOfCargos: number, + officeId: string, + positionId: string, + data: CommonModels.CreatePositionCargoDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config, + ); + }; + + export const duplicateCargo = ( + officeId: string, + positionId: string, + cargoId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/positionCargo/positionCargo.configs.ts b/test/generated/base/positionCargo/positionCargo.configs.ts new file mode 100644 index 0000000..318b8e9 --- /dev/null +++ b/test/generated/base/positionCargo/positionCargo.configs.ts @@ -0,0 +1,132 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoQueries } from "./positionCargo.queries"; +import { PositionCargoAcl } from "./positionCargo.acl"; + +export namespace PositionCargoConfigs { + export const cargosConfig = { + meta: { + title: "Cargos", + }, + readAll: { + acl: PositionCargoAcl.canUseListCargosByPositionId, + schema: CommonModels.PositionCargoResponseDTOSchema, + paginated: PositionCargoQueries.useListCargosByPositionId, + infinite: PositionCargoQueries.useListCargosByPositionIdInfinite, + columns: dynamicColumns({ + schema: CommonModels.PositionCargoResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + quoteId: true, + rootFolderId: true, + cargoType: true, + autoCalculateTotals: true, + autoCalculateRates: true, + autoCalculateVgm: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + rateOptions: true, + rateClass: true, + textForCustoms: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + ratePerKg: true, + totalRate: true, + tare: true, + vgm: true, + hsCodeLabels: true, + note: true, + packages: true, + createdAt: true, + updatedAt: true, + completeWeight: true, + packageTotals: true, + }, + }, + }), + }, + read: { + acl: PositionCargoAcl.canUseGetCargoById, + schema: CommonModels.PositionCargoResponseDTOSchema, + query: PositionCargoQueries.useGetCargoById, + }, + create: { + acl: PositionCargoAcl.canUseCreateCargo, + schema: CommonModels.CreatePositionCargoDTOSchema, + mutation: PositionCargoQueries.useCreateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.CreatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, + }), + }, + update: { + acl: PositionCargoAcl.canUseUpdateCargo, + schema: CommonModels.UpdatePositionCargoDTOSchema, + mutation: PositionCargoQueries.useUpdateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.UpdatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, + }), + }, + delete: { + acl: PositionCargoAcl.canUseDeleteCargo, + mutation: PositionCargoQueries.useDeleteCargo, + }, + }; +} diff --git a/test/generated/base/positionCargo/positionCargo.models.ts b/test/generated/base/positionCargo/positionCargo.models.ts new file mode 100644 index 0000000..5649851 --- /dev/null +++ b/test/generated/base/positionCargo/positionCargo.models.ts @@ -0,0 +1,57 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoModels { + /** + * ListCargosByPositionIdOrderParamSchema + * @type { array } + * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + */ + export const ListCargosByPositionIdOrderParamSchema = z + .array(CommonModels.PositionCargoPaginationOrderFieldSchema) + .readonly() + .describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt") + .nullish(); + export type ListCargosByPositionIdOrderParam = z.infer; + + /** + * ListCargosByPositionIdResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.PositionCargoResponseDTO[] } items + */ + export const ListCargosByPositionIdResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ListCargosByPositionIdResponse = z.infer; + + /** + * PositionCargoListCargoLabelsResponseSchema + * @type { array } + */ + export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type PositionCargoListCargoLabelsResponse = z.infer; + + /** + * PositionCargoGetCargoSummaryResponseSchema + * @type { array } + */ + export const PositionCargoGetCargoSummaryResponseSchema = z + .array(CommonModels.CargoSummaryResponseDTOSchema) + .readonly(); + export type PositionCargoGetCargoSummaryResponse = z.infer; + + /** + * PositionCargoCreateBulkCargosResponseSchema + * @type { array } + */ + export const PositionCargoCreateBulkCargosResponseSchema = z + .array(CommonModels.PositionCargoResponseDTOSchema) + .readonly(); + export type PositionCargoCreateBulkCargosResponse = z.infer; +} diff --git a/test/generated/base/positionCargo/positionCargo.queries.ts b/test/generated/base/positionCargo/positionCargo.queries.ts new file mode 100644 index 0000000..4c2f731 --- /dev/null +++ b/test/generated/base/positionCargo/positionCargo.queries.ts @@ -0,0 +1,415 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionCargoAcl } from "./positionCargo.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionCargoModels } from "./positionCargo.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoApi } from "./positionCargo.api"; + +export namespace PositionCargoQueries { + export const moduleName = QueryModule.PositionCargo; + + export const keys = { + all: [moduleName] as const, + listCargosByPositionId: ( + officeId: string, + positionId: string, + limit?: number, + order?: PositionCargoModels.ListCargosByPositionIdOrderParam, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/cargos", + officeId, + positionId, + limit, + order, + page, + cursor, + ] as const, + listCargosByPositionIdInfinite: ( + officeId: string, + positionId: string, + limit?: number, + order?: PositionCargoModels.ListCargosByPositionIdOrderParam, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/cargos", + "infinite", + officeId, + positionId, + limit, + order, + cursor, + ] as const, + listCargoLabels: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/cargos/labels", officeId, positionId] as const, + getCargoSummary: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/cargos/summary", officeId, positionId] as const, + getCargoById: (officeId: string, positionId: string, cargoId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/cargos/:cargoId", officeId, positionId, cargoId] as const, + }; + + /** + * Query `useListCargosByPositionId` + * @summary List all cargo items for a position + * @permission Requires `canUseListCargosByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargosByPositionId = ( + { + officeId, + positionId, + limit, + order, + page, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: PositionCargoModels.ListCargosByPositionIdOrderParam; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId })); + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListCargosByPositionIdInfinite + * @summary List all cargo items for a position + * @permission Requires `canUseListCargosByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargosByPositionIdInfinite = ( + { + officeId, + positionId, + limit, + order, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: PositionCargoModels.ListCargosByPositionIdOrderParam; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId })); + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreateCargo` + * @summary Create a new cargo item + * @permission Requires `canUseCreateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateCargo = ( + options?: AppMutationOptions< + typeof PositionCargoApi.createCargo, + { officeId: string; positionId: string; data: CommonModels.CreatePositionCargoDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId })); + return PositionCargoApi.createCargo(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListCargoLabels` + * @summary List all cargo labels for a position + * @permission Requires `canUseListCargoLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargoLabels = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargoLabels(officeId, positionId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId })); + return PositionCargoApi.listCargoLabels(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Query `useGetCargoSummary` + * @summary Get cargo summary grouped by transport unit type + * @permission Requires `canUseGetCargoSummary` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCargoSummary = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoSummary(officeId, positionId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId })); + return PositionCargoApi.getCargoSummary(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Query `useGetCargoById` + * @summary Get a specific cargo item + * @permission Requires `canUseGetCargoById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.cargoId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCargoById = ( + { officeId, positionId, cargoId }: { officeId: string; positionId: string; cargoId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoById(officeId, positionId, cargoId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId })); + return PositionCargoApi.getCargoById(officeId, positionId, cargoId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCargo` + * @summary Update a cargo item + * @permission Requires `canUseUpdateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCargo = ( + options?: AppMutationOptions< + typeof PositionCargoApi.updateCargo, + { officeId: string; positionId: string; cargoId: string; data: CommonModels.UpdatePositionCargoDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, data }) => { + checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId })); + return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteCargo` + * @summary Delete a cargo item + * @permission Requires `canUseDeleteCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteCargo = ( + options?: AppMutationOptions< + typeof PositionCargoApi.deleteCargo, + { officeId: string; positionId: string; cargoId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId }) => { + checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId })); + return PositionCargoApi.deleteCargo(officeId, positionId, cargoId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreateBulkCargos` + * @summary Create a new cargo item + * @permission Requires `canUseCreateBulkCargos` ability + * @param { number } mutation.numberOfCargos Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateBulkCargos = ( + options?: AppMutationOptions< + typeof PositionCargoApi.createBulkCargos, + { numberOfCargos: number; officeId: string; positionId: string; data: CommonModels.CreatePositionCargoDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { + checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId })); + return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicateCargo` + * @summary Duplicate a cargo item + * @permission Requires `canUseDuplicateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicateCargo = ( + options?: AppMutationOptions< + typeof PositionCargoApi.duplicateCargo, + { officeId: string; positionId: string; cargoId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId }) => { + checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId })); + return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts b/test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts new file mode 100644 index 0000000..1b45ca0 --- /dev/null +++ b/test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionCargoPackageAcl { + /** + * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. + * @description Create cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation + */ + export const canUseCreatePackage = (object?: { officeId: string }) => + ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Create", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. + * @description Update cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation + */ + export const canUseUpdatePackage = (object?: { officeId: string }) => + ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Update", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation + */ + export const canUseDeletePackage = (object?: { officeId: string }) => + ["Delete", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Delete", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation + */ + export const canUseDuplicatePackage = (object?: { officeId: string }) => + ["Duplicate", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Duplicate", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. + * @description Move cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation + */ + export const canUseMovePackage = (object?: { officeId: string }) => + ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Update", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; +} diff --git a/test/generated/base/positionCargoPackage/positionCargoPackage.api.ts b/test/generated/base/positionCargoPackage/positionCargoPackage.api.ts new file mode 100644 index 0000000..db2562e --- /dev/null +++ b/test/generated/base/positionCargoPackage/positionCargoPackage.api.ts @@ -0,0 +1,84 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoPackageApi { + export const createPackage = ( + officeId: string, + positionId: string, + cargoId: string, + data: CommonModels.CreatePositionCargoPackageDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, + ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), + config, + ); + }; + + export const updatePackage = ( + officeId: string, + positionId: string, + cargoId: string, + packageId: string, + data: CommonModels.UpdatePositionCargoPackageDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), + config, + ); + }; + + export const deletePackage = ( + officeId: string, + positionId: string, + cargoId: string, + packageId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, + undefined, + config, + ); + }; + + export const duplicatePackage = ( + officeId: string, + positionId: string, + cargoId: string, + packageId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, + undefined, + config, + ); + }; + + export const movePackage = ( + officeId: string, + positionId: string, + cargoId: string, + packageId: string, + data: CommonModels.MovePositionCargoPackageRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, + ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts b/test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts new file mode 100644 index 0000000..3c69275 --- /dev/null +++ b/test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts @@ -0,0 +1,207 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionCargoPackageAcl } from "./positionCargoPackage.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoPackageApi } from "./positionCargoPackage.api"; + +export namespace PositionCargoPackageQueries { + export const moduleName = QueryModule.PositionCargoPackage; + + /** + * Mutation `useCreatePackage` + * @summary Create a new package for a cargo + * @permission Requires `canUseCreatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreatePackage = ( + options?: AppMutationOptions< + typeof PositionCargoPackageApi.createPackage, + { officeId: string; positionId: string; cargoId: string; data: CommonModels.CreatePositionCargoPackageDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId })); + return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdatePackage` + * @summary Update a package + * @permission Requires `canUseUpdatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdatePackage = ( + options?: AppMutationOptions< + typeof PositionCargoPackageApi.updatePackage, + { + officeId: string; + positionId: string; + cargoId: string; + packageId: string; + data: CommonModels.UpdatePositionCargoPackageDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId })); + return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeletePackage` + * @summary Delete a package + * @permission Requires `canUseDeletePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeletePackage = ( + options?: AppMutationOptions< + typeof PositionCargoPackageApi.deletePackage, + { officeId: string; positionId: string; cargoId: string; packageId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId }) => { + checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId })); + return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicatePackage` + * @summary Duplicate a package + * @permission Requires `canUseDuplicatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicatePackage = ( + options?: AppMutationOptions< + typeof PositionCargoPackageApi.duplicatePackage, + { officeId: string; positionId: string; cargoId: string; packageId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId }) => { + checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId })); + return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMovePackage` + * @summary Move a package to a different cargo + * @permission Requires `canUseMovePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useMovePackage = ( + options?: AppMutationOptions< + typeof PositionCargoPackageApi.movePackage, + { + officeId: string; + positionId: string; + cargoId: string; + packageId: string; + data: CommonModels.MovePositionCargoPackageRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId })); + return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/positionChecklist/positionChecklist.acl.ts b/test/generated/base/positionChecklist/positionChecklist.acl.ts new file mode 100644 index 0000000..6047fe4 --- /dev/null +++ b/test/generated/base/positionChecklist/positionChecklist.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionChecklistAcl { + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List checklist items for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useApplyTemplates` mutation ability. For global ability, omit the object parameter. + * @description Apply checklist templates to position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useApplyTemplates` mutation + */ + export const canUseApplyTemplates = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useComplete` mutation ability. For global ability, omit the object parameter. + * @description Complete position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useComplete` mutation + */ + export const canUseComplete = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUncomplete` mutation ability. For global ability, omit the object parameter. + * @description Uncomplete position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUncomplete` mutation + */ + export const canUseUncomplete = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdateNotes` mutation ability. For global ability, omit the object parameter. + * @description Update position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateNotes` mutation + */ + export const canUseUpdateNotes = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useReorder` mutation ability. For global ability, omit the object parameter. + * @description Reorder position checklist items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation + */ + export const canUseReorder = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/base/positionChecklist/positionChecklist.api.ts b/test/generated/base/positionChecklist/positionChecklist.api.ts new file mode 100644 index 0000000..729b72a --- /dev/null +++ b/test/generated/base/positionChecklist/positionChecklist.api.ts @@ -0,0 +1,75 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionChecklistModels } from "./positionChecklist.models"; + +export namespace PositionChecklistApi { + export const list = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist`, + config, + ); + }; + + export const applyTemplates = ( + officeId: string, + positionId: string, + data: PositionChecklistModels.ApplyTemplatesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, + ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), + config, + ); + }; + + export const complete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, + undefined, + config, + ); + }; + + export const uncomplete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, + undefined, + config, + ); + }; + + export const updateNotes = ( + officeId: string, + positionId: string, + itemId: string, + data: PositionChecklistModels.UpdatePositionChecklistItemDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, + ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), + config, + ); + }; + + export const reorder = ( + officeId: string, + positionId: string, + data: PositionChecklistModels.ReorderPositionChecklistDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/reorder`, + ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/positionChecklist/positionChecklist.models.ts b/test/generated/base/positionChecklist/positionChecklist.models.ts new file mode 100644 index 0000000..58a0db3 --- /dev/null +++ b/test/generated/base/positionChecklist/positionChecklist.models.ts @@ -0,0 +1,96 @@ +import { z } from "zod"; + +export namespace PositionChecklistModels { + /** + * PositionChecklistCompletedByResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PositionChecklistCompletedByResponseDtoSchema = z + .object({ id: z.string(), name: z.string().nullable() }) + .readonly(); + export type PositionChecklistCompletedByResponseDto = z.infer; + + /** + * PositionChecklistItemResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } checklistItemId + * @property { string } templateId + * @property { number } order + * @property { boolean } completed + * @property { string } completedAt + * @property { PositionChecklistCompletedByResponseDto } completedBy + * @property { string } notes + * @property { string } name + */ + export const PositionChecklistItemResponseDtoSchema = z + .object({ + id: z.string(), + positionId: z.string(), + checklistItemId: z.string(), + templateId: z.string().nullable(), + order: z.number(), + completed: z.boolean(), + completedAt: z.iso.datetime({ offset: true }).nullable(), + completedBy: PositionChecklistCompletedByResponseDtoSchema.nullable(), + notes: z.string().nullable(), + name: z.string().nullable(), + }) + .readonly(); + export type PositionChecklistItemResponseDto = z.infer; + + /** + * PositionChecklistResponseDtoSchema + * @type { object } + * @property { PositionChecklistItemResponseDto[] } items + * @property { string[] } appliedTemplateIds + */ + export const PositionChecklistResponseDtoSchema = z + .object({ + items: z.array(PositionChecklistItemResponseDtoSchema).readonly(), + appliedTemplateIds: z.array(z.string()).readonly(), + }) + .readonly(); + export type PositionChecklistResponseDto = z.infer; + + /** + * ApplyTemplatesRequestDtoSchema + * @type { object } + * @property { string[] } templateIds + */ + export const ApplyTemplatesRequestDtoSchema = z.object({ templateIds: z.array(z.string()).readonly() }).readonly(); + export type ApplyTemplatesRequestDto = z.infer; + + /** + * UpdatePositionChecklistItemDtoSchema + * @type { object } + * @property { string } notes Max Length: `512` + */ + export const UpdatePositionChecklistItemDtoSchema = z.object({ notes: z.string().max(512) }).readonly(); + export type UpdatePositionChecklistItemDto = z.infer; + + /** + * ReorderPositionChecklistDtoSchema + * @type { object } + * @property { string[] } itemIds + */ + export const ReorderPositionChecklistDtoSchema = z.object({ itemIds: z.array(z.string()).readonly() }).readonly(); + export type ReorderPositionChecklistDto = z.infer; + + /** + * ApplyTemplatesResponseSchema + * @type { array } + */ + export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); + export type ApplyTemplatesResponse = z.infer; + + /** + * PositionChecklistReorderResponseSchema + * @type { array } + */ + export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); + export type PositionChecklistReorderResponse = z.infer; +} diff --git a/test/generated/base/positionChecklist/positionChecklist.queries.ts b/test/generated/base/positionChecklist/positionChecklist.queries.ts new file mode 100644 index 0000000..0309124 --- /dev/null +++ b/test/generated/base/positionChecklist/positionChecklist.queries.ts @@ -0,0 +1,227 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionChecklistAcl } from "./positionChecklist.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionChecklistModels } from "./positionChecklist.models"; +import { PositionChecklistApi } from "./positionChecklist.api"; + +export namespace PositionChecklistQueries { + export const moduleName = QueryModule.PositionChecklist; + + export const keys = { + all: [moduleName] as const, + list: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/checklist", officeId, positionId] as const, + }; + + /** + * Query `useList` + * @summary Get position checklist items + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, positionId), + queryFn: () => { + checkAcl(PositionChecklistAcl.canUseList({ officeId })); + return PositionChecklistApi.list(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useApplyTemplates` + * @summary Apply checklist templates to position + * @permission Requires `canUseApplyTemplates` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionChecklistModels.ApplyTemplatesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useApplyTemplates = ( + options?: AppMutationOptions< + typeof PositionChecklistApi.applyTemplates, + { officeId: string; positionId: string; data: PositionChecklistModels.ApplyTemplatesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId })); + return PositionChecklistApi.applyTemplates(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useComplete` + * @summary Complete a checklist item + * @permission Requires `canUseComplete` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useComplete = ( + options?: AppMutationOptions< + typeof PositionChecklistApi.complete, + { officeId: string; positionId: string; itemId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId }) => { + checkAcl(PositionChecklistAcl.canUseComplete({ officeId })); + return PositionChecklistApi.complete(officeId, positionId, itemId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUncomplete` + * @summary Mark checklist item as not completed + * @permission Requires `canUseUncomplete` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useUncomplete = ( + options?: AppMutationOptions< + typeof PositionChecklistApi.uncomplete, + { officeId: string; positionId: string; itemId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId }) => { + checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId })); + return PositionChecklistApi.uncomplete(officeId, positionId, itemId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateNotes` + * @summary Update checklist item notes + * @permission Requires `canUseUpdateNotes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { PositionChecklistModels.UpdatePositionChecklistItemDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateNotes = ( + options?: AppMutationOptions< + typeof PositionChecklistApi.updateNotes, + { + officeId: string; + positionId: string; + itemId: string; + data: PositionChecklistModels.UpdatePositionChecklistItemDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId, data }) => { + checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId })); + return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useReorder` + * @summary Reorder checklist items + * @permission Requires `canUseReorder` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionChecklistModels.ReorderPositionChecklistDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useReorder = ( + options?: AppMutationOptions< + typeof PositionChecklistApi.reorder, + { officeId: string; positionId: string; data: PositionChecklistModels.ReorderPositionChecklistDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionChecklistAcl.canUseReorder({ officeId })); + return PositionChecklistApi.reorder(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts new file mode 100644 index 0000000..7716790 --- /dev/null +++ b/test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts @@ -0,0 +1,51 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionInvolvedPartiesAcl { + /** + * Use for `useFindByPositionId` query ability. For global ability, omit the object parameter. + * @description List position involved parties + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByPositionId` query + */ + export const canUseFindByPositionId = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation ability. For global ability, omit the object parameter. + * @description Delete position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation + */ + export const canUseDeleteOfficesPositionsInvolvedPartiesByPartyId = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts new file mode 100644 index 0000000..ca5c543 --- /dev/null +++ b/test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts @@ -0,0 +1,59 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionInvolvedPartiesModels } from "./positionInvolvedParties.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionInvolvedPartiesApi { + export const findByPositionId = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties`, + config, + ); + }; + + export const create = ( + officeId: string, + positionId: string, + data: CommonModels.CreateInvolvedPartyRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties`, + ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), + config, + ); + }; + + export const update = ( + officeId: string, + positionId: string, + partyId: string, + data: CommonModels.UpdateInvolvedPartyDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, + ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), + config, + ); + }; + + export const deleteOfficesPositionsInvolvedPartiesByPartyId = ( + officeId: string, + positionId: string, + partyId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts new file mode 100644 index 0000000..aeea1e4 --- /dev/null +++ b/test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionInvolvedPartiesModels { + /** + * FindByPositionIdResponseSchema + * @type { array } + */ + export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); + export type FindByPositionIdResponse = z.infer; +} diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts new file mode 100644 index 0000000..ed6dde7 --- /dev/null +++ b/test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts @@ -0,0 +1,157 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionInvolvedPartiesAcl } from "./positionInvolvedParties.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionInvolvedPartiesApi } from "./positionInvolvedParties.api"; + +export namespace PositionInvolvedPartiesQueries { + export const moduleName = QueryModule.PositionInvolvedParties; + + export const keys = { + all: [moduleName] as const, + findByPositionId: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/involved-parties", officeId, positionId] as const, + }; + + /** + * Query `useFindByPositionId` + * @summary List position involved parties + * @permission Requires `canUseFindByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindByPositionId = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findByPositionId(officeId, positionId), + queryFn: () => { + checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId })); + return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create position involved party + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof PositionInvolvedPartiesApi.create, + { officeId: string; positionId: string; data: CommonModels.CreateInvolvedPartyRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId })); + return PositionInvolvedPartiesApi.create(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update position involved party + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof PositionInvolvedPartiesApi.update, + { officeId: string; positionId: string; partyId: string; data: CommonModels.UpdateInvolvedPartyDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, partyId, data }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId })); + return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteOfficesPositionsInvolvedPartiesByPartyId` + * @summary Delete position involved party + * @permission Requires `canUseDeleteOfficesPositionsInvolvedPartiesByPartyId` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = ( + options?: AppMutationOptions< + typeof PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId, + { officeId: string; positionId: string; partyId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, partyId }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId })); + return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId( + officeId, + positionId, + partyId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts new file mode 100644 index 0000000..0060022 --- /dev/null +++ b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts @@ -0,0 +1,29 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionProfitChangeTrackingAcl { + /** + * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. + * @description List position profit change groups + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.positionId positionId from positionId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query + */ + export const canUseFindProfitChangeGroups = (object?: { officeId: string; positionId: string }) => + ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Read", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) + >; + + /** + * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. + * @description Get position profit change group details + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.positionId positionId from positionId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query + */ + export const canUseFindProfitChangeGroupDetail = (object?: { officeId: string; positionId: string }) => + ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Read", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) + >; +} diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts new file mode 100644 index 0000000..ead5b67 --- /dev/null +++ b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts @@ -0,0 +1,67 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; + +export namespace PositionProfitChangeTrackingApi { + export const findProfitChangeGroups = ( + officeId: string, + positionId: string, + limit: number, + order?: string, + filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { + resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema, + }, + `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findProfitChangeGroupDetail = ( + groupId: string, + officeId: string, + positionId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, + `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, + config, + ); + }; +} diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts new file mode 100644 index 0000000..260a0d2 --- /dev/null +++ b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts @@ -0,0 +1,51 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; +import { PositionProfitChangeTrackingQueries } from "./positionProfitChangeTracking.queries"; +import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; + +export namespace PositionProfitChangeTrackingConfigs { + export const profitChangeGroupsConfig = { + meta: { + title: "Profit Change Groups", + }, + readAll: { + acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups, + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, + paginated: PositionProfitChangeTrackingQueries.useFindProfitChangeGroups, + infinite: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, + filters: { + schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, + options: { + inputs: { + userId: true, + dateFrom: true, + dateTo: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, + options: { + columns: { + id: true, + timestamp: true, + users: true, + profit: true, + changeCount: true, + }, + sortable: + PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, + }, + }), + }, + read: { + acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema, + query: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, + }, + }; +} diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts new file mode 100644 index 0000000..e06233f --- /dev/null +++ b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts @@ -0,0 +1,117 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionProfitChangeTrackingModels { + /** + * PositionAccountProfitChangeGroupDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto[] } users + * @property { object } profit + * @property { number } profit.amount + * @property { string } profit.currencyCode + * @property { number } changeCount + */ + export const PositionAccountProfitChangeGroupDtoSchema = z + .object({ + id: z.string(), + timestamp: z.iso.datetime({ offset: true }), + users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), + profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), + changeCount: z.number(), + }) + .readonly(); + export type PositionAccountProfitChangeGroupDto = z.infer; + + /** + * PositionAccountProfitChangeEntryDtoSchema + * @type { object } + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto } user + * @property { number } changeNumber + * @property { number } oldProfit + * @property { number } newProfit + * @property { string } currencyCode + */ + export const PositionAccountProfitChangeEntryDtoSchema = z + .object({ + timestamp: z.iso.datetime({ offset: true }), + user: CommonModels.UserPreviewDtoSchema, + changeNumber: z.number(), + oldProfit: z.number(), + newProfit: z.number(), + currencyCode: z.string(), + }) + .readonly(); + export type PositionAccountProfitChangeEntryDto = z.infer; + + /** + * PositionAccountProfitChangeGroupDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { string } currencyCode + * @property { PositionAccountProfitChangeEntryDto[] } entries + */ + export const PositionAccountProfitChangeGroupDetailDtoSchema = z + .object({ + id: z.string(), + timestamp: z.iso.datetime({ offset: true }), + currencyCode: z.string(), + entries: z.array(PositionAccountProfitChangeEntryDtoSchema).readonly(), + }) + .readonly(); + export type PositionAccountProfitChangeGroupDetailDto = z.infer< + typeof PositionAccountProfitChangeGroupDetailDtoSchema + >; + + /** + * PositionProfitChangeTrackingFilterDtoSchema + * @type { object } + * @property { string } userId User IDs who made the changes + * @property { string } dateFrom Date range start + * @property { string } dateTo Date range end + */ + export const PositionProfitChangeTrackingFilterDtoSchema = z + .object({ + userId: z.string().describe("User IDs who made the changes"), + dateFrom: z.string().describe("Date range start"), + dateTo: z.string().describe("Date range end"), + }) + .readonly(); + export type PositionProfitChangeTrackingFilterDto = z.infer; + + /** + * PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema + * @type { enum } + */ + export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema = z.enum([ + "timestamp", + "profitAmount", + "changeCount", + ]); + export type PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = z.infer< + typeof PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema + >; + export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = + PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema.enum; + + /** + * PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionAccountProfitChangeGroupDto[] } items + */ + export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape, + }); + export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer< + typeof PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema + >; +} diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts new file mode 100644 index 0000000..313343b --- /dev/null +++ b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts @@ -0,0 +1,208 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; +import { PositionProfitChangeTrackingApi } from "./positionProfitChangeTracking.api"; + +export namespace PositionProfitChangeTrackingQueries { + export const moduleName = QueryModule.PositionProfitChangeTracking; + + export const keys = { + all: [moduleName] as const, + findProfitChangeGroups: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/account/profit-change-groups", + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + ] as const, + findProfitChangeGroupsInfinite: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/account/profit-change-groups", + "infinite", + officeId, + positionId, + limit, + order, + filter, + cursor, + ] as const, + findProfitChangeGroupDetail: (groupId: string, officeId: string, positionId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/account/profit-change-groups/:groupId", + groupId, + officeId, + positionId, + ] as const, + }; + + /** + * Query `useFindProfitChangeGroups` + * @summary List position profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` + * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroups = ( + { + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId })); + return PositionProfitChangeTrackingApi.findProfitChangeGroups( + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindProfitChangeGroupsInfinite + * @summary List position profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` + * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroupsInfinite = ( + { + officeId, + positionId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId })); + return PositionProfitChangeTrackingApi.findProfitChangeGroups( + officeId, + positionId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindProfitChangeGroupDetail` + * @summary Get position profit change group details + * @permission Requires `canUseFindProfitChangeGroupDetail` ability + * @param { string } object.groupId Path parameter + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroupDetail = ( + { groupId, officeId, positionId }: { groupId: string; officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), + queryFn: () => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId })); + return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/positionRoutes/positionRoutes.acl.ts b/test/generated/base/positionRoutes/positionRoutes.acl.ts new file mode 100644 index 0000000..1ef520c --- /dev/null +++ b/test/generated/base/positionRoutes/positionRoutes.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionRoutesAcl { + /** + * Use for `useListRoutes` query ability. For global ability, omit the object parameter. + * @description List position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query + */ + export const canUseListRoutes = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Create position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation + */ + export const canUseCreateRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Update position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation + */ + export const canUseUpdateRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Delete position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation + */ + export const canUseDeleteRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. + * @description Split position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation + */ + export const canUseSplitRoutes = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. + * @description Merge position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation + */ + export const canUseMergeRoutes = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. + * @description Copy position route + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation + */ + export const canUseCopyRoute = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/base/positionRoutes/positionRoutes.api.ts b/test/generated/base/positionRoutes/positionRoutes.api.ts new file mode 100644 index 0000000..9330fa4 --- /dev/null +++ b/test/generated/base/positionRoutes/positionRoutes.api.ts @@ -0,0 +1,99 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionRoutesApi { + export const listRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.RouteListResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes`, + config, + ); + }; + + export const createRoutePoint = ( + officeId: string, + positionId: string, + routeId: string, + data: CommonModels.CreateRoutePointRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, + ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), + config, + ); + }; + + export const updateRoutePoint = ( + officeId: string, + positionId: string, + routeId: string, + pointId: string, + data: CommonModels.UpdateRoutePointRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, + ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), + config, + ); + }; + + export const deleteRoutePoint = ( + officeId: string, + positionId: string, + routeId: string, + pointId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, + undefined, + config, + ); + }; + + export const splitRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/split`, + undefined, + config, + ); + }; + + export const mergeRoutes = ( + officeId: string, + positionId: string, + data: CommonModels.MergeRoutesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/merge`, + ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), + config, + ); + }; + + export const copyRoute = ( + officeId: string, + positionId: string, + routeId: string, + data: CommonModels.CopyRouteRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, + ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/positionRoutes/positionRoutes.queries.ts b/test/generated/base/positionRoutes/positionRoutes.queries.ts new file mode 100644 index 0000000..78de073 --- /dev/null +++ b/test/generated/base/positionRoutes/positionRoutes.queries.ts @@ -0,0 +1,263 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionRoutesAcl } from "./positionRoutes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionRoutesApi } from "./positionRoutes.api"; + +export namespace PositionRoutesQueries { + export const moduleName = QueryModule.PositionRoutes; + + export const keys = { + all: [moduleName] as const, + listRoutes: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/routes", officeId, positionId] as const, + }; + + /** + * Query `useListRoutes` + * @summary List routes with points for a position (unified for sea/air/road) + * @permission Requires `canUseListRoutes` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListRoutes = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoutes(officeId, positionId), + queryFn: () => { + checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId })); + return PositionRoutesApi.listRoutes(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateRoutePoint` + * @summary Create a route point + * @permission Requires `canUseCreateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateRoutePoint = ( + options?: AppMutationOptions< + typeof PositionRoutesApi.createRoutePoint, + { officeId: string; positionId: string; routeId: string; data: CommonModels.CreateRoutePointRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, data }) => { + checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId })); + return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateRoutePoint` + * @summary Update a route point + * @permission Requires `canUseUpdateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateRoutePoint = ( + options?: AppMutationOptions< + typeof PositionRoutesApi.updateRoutePoint, + { + officeId: string; + positionId: string; + routeId: string; + pointId: string; + data: CommonModels.UpdateRoutePointRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { + checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId })); + return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteRoutePoint` + * @summary Delete a route point + * @permission Requires `canUseDeleteRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteRoutePoint = ( + options?: AppMutationOptions< + typeof PositionRoutesApi.deleteRoutePoint, + { officeId: string; positionId: string; routeId: string; pointId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, pointId }) => { + checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId })); + return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useSplitRoutes` + * @summary Split routes by cargo (sea positions only) + * @permission Requires `canUseSplitRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useSplitRoutes = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId })); + return PositionRoutesApi.splitRoutes(officeId, positionId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMergeRoutes` + * @summary Merge routes (sea positions only) + * @permission Requires `canUseMergeRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useMergeRoutes = ( + options?: AppMutationOptions< + typeof PositionRoutesApi.mergeRoutes, + { officeId: string; positionId: string; data: CommonModels.MergeRoutesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId })); + return PositionRoutesApi.mergeRoutes(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCopyRoute` + * @summary Copy route points to another route (sea positions only) + * @permission Requires `canUseCopyRoute` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useCopyRoute = ( + options?: AppMutationOptions< + typeof PositionRoutesApi.copyRoute, + { officeId: string; positionId: string; routeId: string; data: CommonModels.CopyRouteRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, data }) => { + checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId })); + return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/positions/positions.acl.ts b/test/generated/base/positions/positions.acl.ts new file mode 100644 index 0000000..d2624a2 --- /dev/null +++ b/test/generated/base/positions/positions.acl.ts @@ -0,0 +1,195 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionsAcl { + /** + * Use for `useFindAll` query ability. For global ability, omit the object parameter. + * @description List position labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Create", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useTotalProfit` query ability. For global ability, omit the object parameter. + * @description Fake endpoint + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTotalProfit` query + */ + export const canUseTotalProfit = (object?: { officeId: string }) => + ["TotalProfitView", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "TotalProfitView", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ + export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useExportPositions` mutation ability. For global ability, omit the object parameter. + * @description Export positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportPositions` mutation + */ + export const canUseExportPositions = (object?: { officeId: string }) => + ["Export", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Export", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useListRouteLabels` query ability. For global ability, omit the object parameter. + * @description List route labels for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRouteLabels` query + */ + export const canUseListRouteLabels = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useGetDuplicateDefaultParameters` query ability. For global ability, omit the object parameter. + * @description Read position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDuplicateDefaultParameters` query + */ + export const canUseGetDuplicateDefaultParameters = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ + export const canUseDuplicate = (object?: { officeId: string }) => + ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Create", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ + export const canUseCancel = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useRevertCancel` mutation ability. For global ability, omit the object parameter. + * @description Revert cancelled position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertCancel` mutation + */ + export const canUseRevertCancel = (object?: { officeId: string }) => + ["RevertCancel", object ? subject("Position", object) : "Position"] as AbilityTuple< + "RevertCancel", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useLinkChild` mutation ability. For global ability, omit the object parameter. + * @description Link positions to parent + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLinkChild` mutation + */ + export const canUseLinkChild = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUnlinkChild` mutation ability. For global ability, omit the object parameter. + * @description Link positions to parent + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlinkChild` mutation + */ + export const canUseUnlinkChild = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useListChild` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListChild` query + */ + export const canUseListChild = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/base/positions/positions.api.ts b/test/generated/base/positions/positions.api.ts new file mode 100644 index 0000000..7793f57 --- /dev/null +++ b/test/generated/base/positions/positions.api.ts @@ -0,0 +1,277 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionsApi { + export const findAll = ( + officeId: string, + limit: number, + filter?: PositionsModels.PositionLabelsFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsFindAllResponseSchema }, + `/offices/${officeId}/positions/labels`, + { + ...config, + params: { + filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: PositionsModels.PositionFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsPaginateResponseSchema }, + `/offices/${officeId}/positions`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = ( + officeId: string, + data: PositionsModels.CreatePositionRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions`, + ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), + config, + ); + }; + + export const totalProfit = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.TotalProfitResponseSchema }, + `/offices/${officeId}/positions/fake-total-profit`, + config, + ); + }; + + export const listAvailablePartnersFor = ( + officeId: string, + positionId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/positions/${positionId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { + type: "query", + name: "useCase", + }), + }, + }, + ); + }; + + export const exportPositions = ( + officeId: string, + data: PositionsModels.PositionExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/exports`, + ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}`, + config, + ); + }; + + export const update = ( + officeId: string, + positionId: string, + data: PositionsModels.UpdatePositionDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}`, + ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), + config, + ); + }; + + export const listRouteLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/routes/labels`, + config, + ); + }; + + export const getDuplicateDefaultParameters = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, + config, + ); + }; + + export const duplicate = ( + officeId: string, + positionId: string, + data: PositionsModels.DuplicatePositionRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/duplicate`, + ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), + config, + ); + }; + + export const cancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/cancel`, + undefined, + config, + ); + }; + + export const revertCancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/uncancel`, + undefined, + config, + ); + }; + + export const linkChild = ( + officeId: string, + positionId: string, + data: PositionsModels.LinkChildPositionsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/children`, + ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), + config, + ); + }; + + export const unlinkChild = ( + officeId: string, + positionId: string, + data: PositionsModels.UnlinkChildPositionsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/children`, + ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), + config, + ); + }; + + export const listChild = ( + officeId: string, + positionId: string, + limit: number, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionsModels.ListChildResponseSchema }, + `/offices/${officeId}/positions/${positionId}/children`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/base/positions/positions.configs.ts b/test/generated/base/positions/positions.configs.ts new file mode 100644 index 0000000..a75b161 --- /dev/null +++ b/test/generated/base/positions/positions.configs.ts @@ -0,0 +1,258 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionsQueries } from "./positions.queries"; +import { PositionsAcl } from "./positions.acl"; + +export namespace PositionsConfigs { + export const positionsConfig = { + meta: { + title: "Positions", + }, + readAll: { + acl: PositionsAcl.canUsePaginate, + schema: PositionsModels.PositionPreviewResponseDtoSchema, + paginated: PositionsQueries.usePaginate, + infinite: PositionsQueries.usePaginateInfinite, + filters: { + schema: PositionsModels.PositionFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionsModels.PositionFilterDtoSchema, + options: { + inputs: { + transportMode: true, + customerId: true, + carrierId: true, + consigneeId: true, + isCancelled: true, + status: true, + number: true, + direction: true, + loadType: true, + serviceType: true, + employee: true, + searchQuery: true, + externalSystemId: true, + createdAt: true, + serviceDate: true, + departureDate: true, + arrivalDate: true, + blfromCostumerDate: true, + blfromCarrierDate: true, + customsDate: true, + vgmCustomerDate: true, + partnerNetworkId: true, + projectLiteId: true, + checklistItemsDone: true, + checklistItemsNotDone: true, + routing: true, + isExcludedFromStatistics: true, + isMasterPosition: true, + loadingPortId: true, + dischargePortId: true, + customerReference: true, + carrierReference: true, + consigneeReference: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PositionsModels.PositionPreviewResponseDtoSchema, + options: { + columns: { + id: true, + externalSystemId: true, + transportMode: true, + direction: true, + loadType: true, + createdAt: true, + number: true, + isCancelled: true, + customer: true, + customerReference: true, + consignee: true, + consigneeReference: true, + carrier: true, + carrierReference: true, + positionNumber: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + origin: true, + loadDate: true, + loadingPort: true, + dischargePort: true, + destination: true, + deliveryDate: true, + equipment: true, + serviceType: true, + destinationOffice: true, + currency: true, + profit: true, + margin: true, + employee: true, + project: true, + serviceDate: true, + departureDate: true, + arrivalDate: true, + blfromCostumerDate: true, + blfromCarrierDate: true, + customsDate: true, + vgmCustomerDate: true, + routing: true, + notes: true, + isMasterPosition: true, + hasInvoices: true, + parentPosition: true, + }, + sortable: PositionsModels.PositionsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: PositionsAcl.canUseGet, + schema: CommonModels.PositionCoreResponseDtoSchema, + query: PositionsQueries.useGet, + }, + create: { + acl: PositionsAcl.canUseCreate, + schema: PositionsModels.CreatePositionRequestDtoSchema, + mutation: PositionsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PositionsModels.CreatePositionRequestDtoSchema, + options: { + inputs: { + section: true, + direction: true, + transportMode: true, + loadType: true, + serviceType: true, + estimatedServiceDate: true, + customerBusinessPartnerId: true, + }, + }, + }), + }, + update: { + acl: PositionsAcl.canUseUpdate, + schema: PositionsModels.UpdatePositionDtoSchema, + mutation: PositionsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PositionsModels.UpdatePositionDtoSchema, + options: { + inputs: { + externalSystemId: true, + statusDate: true, + status: true, + loadType: true, + incoterms: true, + secondIncoterms: true, + fillingCompany: true, + sellingContract: true, + fillingScacCode: true, + serviceValidity: true, + ratesValidity: true, + serviceType: true, + buyRateReference: true, + frequency: true, + isParentPosition: true, + isExcludedFromStatistics: true, + team: true, + salesRepId: true, + responsibleEmployeeId: true, + receivedByEmployeeId: true, + originOfficeId: true, + projectLiteId: true, + notes: true, + inttraTypeOfMove: true, + volumetricWeightModifier: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: PositionsAcl.canUseFindAll, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PositionsQueries.useFindAll, + infinite: PositionsQueries.useFindAllInfinite, + filters: { + schema: PositionsModels.PositionLabelsFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionsModels.PositionLabelsFilterDtoSchema, + options: { + inputs: { + search: true, + isParentPosition: true, + isLinkedPosition: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + }, + }), + }, + }; + + export const childrenConfig = { + meta: { + title: "Children", + }, + readAll: { + acl: PositionsAcl.canUseListChild, + schema: PositionsModels.ChildPositionResponseDtoSchema, + paginated: PositionsQueries.useListChild, + infinite: PositionsQueries.useListChildInfinite, + columns: dynamicColumns({ + schema: PositionsModels.ChildPositionResponseDtoSchema, + options: { + columns: { + id: true, + number: true, + packages: true, + weight: true, + volume: true, + customer: true, + profit: true, + }, + }, + }), + }, + create: { + acl: PositionsAcl.canUseLinkChild, + schema: PositionsModels.LinkChildPositionsRequestDtoSchema, + mutation: PositionsQueries.useLinkChild, + inputDefs: dynamicInputs({ + schema: PositionsModels.LinkChildPositionsRequestDtoSchema, + options: { + inputs: { + childPositionIds: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/base/positions/positions.models.ts b/test/generated/base/positions/positions.models.ts new file mode 100644 index 0000000..8949f00 --- /dev/null +++ b/test/generated/base/positions/positions.models.ts @@ -0,0 +1,888 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionsModels { + /** + * PositionPreviewResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } externalSystemId + * @property { CommonModels.TransportModeEnum } transportMode + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { string } createdAt + * @property { string } number + * @property { boolean } isCancelled + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { string } customer.phone + * @property { string } customer.email + * @property { string } customerReference + * @property { object } consignee + * @property { string } consignee.id + * @property { string } consignee.name + * @property { string } consignee.matchCode + * @property { string } consignee.label + * @property { string } consigneeReference + * @property { object } carrier + * @property { string } carrier.id + * @property { string } carrier.name + * @property { string } carrier.matchCode + * @property { string } carrier.label + * @property { string } carrierReference + * @property { number } positionNumber + * @property { string } hblNumber + * @property { string } mblNumber + * @property { string } bookingNumber + * @property { string } vessel + * @property { string } voyage + * @property { string } vesselCarrier Carrier name from route point (sea positions only) + * @property { object } origin + * @property { string } origin.id + * @property { string } origin.name + * @property { string } loadDate + * @property { object } loadingPort + * @property { string } loadingPort.id + * @property { string } loadingPort.name + * @property { object } dischargePort + * @property { string } dischargePort.id + * @property { string } dischargePort.name + * @property { object } destination + * @property { string } destination.id + * @property { string } destination.name + * @property { string } deliveryDate + * @property { string } equipment + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { object } destinationOffice + * @property { string } destinationOffice.id + * @property { string } destinationOffice.name + * @property { string } currency + * @property { number } profit + * @property { number } margin + * @property { object } employee + * @property { string } employee.id + * @property { string } employee.name + * @property { object } project + * @property { string } project.id + * @property { string } project.name + * @property { string } serviceDate + * @property { string } departureDate + * @property { string } arrivalDate + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.EditorContentResponseDto } notes Notes + * @property { boolean } isMasterPosition + * @property { boolean } hasInvoices Whether this position has at least one invoice + * @property { object } parentPosition + * @property { string } parentPosition.id + * @property { string } parentPosition.number + */ + export const PositionPreviewResponseDtoSchema = z + .object({ + id: z.string(), + externalSystemId: z.string().nullish(), + transportMode: CommonModels.TransportModeEnumSchema, + direction: CommonModels.DirectionEnumSchema, + loadType: CommonModels.LoadTypeEnumSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }).nullish(), + number: z.string(), + isCancelled: z.boolean(), + customer: z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string(), + phone: z.string().nullish(), + email: z.string().nullish(), + }) + .readonly(), + customerReference: z.string().nullish(), + consignee: z + .object({ + id: z.string().nullable(), + name: z.string().nullable(), + matchCode: z.string().nullable(), + label: z.string().nullable(), + }) + .readonly() + .nullish(), + consigneeReference: z.string().nullish(), + carrier: z + .object({ + id: z.string().nullable(), + name: z.string().nullable(), + matchCode: z.string().nullable(), + label: z.string().nullable(), + }) + .readonly() + .nullish(), + carrierReference: z.string().nullish(), + positionNumber: z.number().nullish(), + hblNumber: z.string().nullish(), + mblNumber: z.string().nullish(), + bookingNumber: z.string().nullish(), + vessel: z.string().nullish(), + voyage: z.string().nullish(), + vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), + origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + loadDate: z.iso.datetime({ offset: true }).nullish(), + loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + deliveryDate: z.iso.datetime({ offset: true }).nullish(), + equipment: z.string().nullish(), + serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), + destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + currency: z.string().nullish(), + profit: z.number().nullish(), + margin: z.number().nullish(), + employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + serviceDate: z.iso.datetime({ offset: true }).nullish(), + departureDate: z.iso.datetime({ offset: true }).nullish(), + arrivalDate: z.iso.datetime({ offset: true }).nullish(), + blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), + blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), + customsDate: z.iso.datetime({ offset: true }).nullish(), + vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), + routing: CommonModels.SeaRoutingEnumSchema.nullish(), + notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), + isMasterPosition: z.boolean(), + hasInvoices: z.boolean().describe("Whether this position has at least one invoice").nullish(), + parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).readonly().nullish(), + }) + .readonly(); + export type PositionPreviewResponseDto = z.infer; + + /** + * PositionFilterDtoSchema + * @type { object } + * @property { CommonModels.TransportModeEnum } transportMode + * @property { string[] } customerId + * @property { string[] } carrierId Filter positions by carrier IDs + * @property { string[] } consigneeId Filter positions by consignee IDs + * @property { boolean } isCancelled + * @property { CommonModels.PositionStatusEnum } status + * @property { string } number + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } employee Filter positions by employee IDs + * @property { string } searchQuery + * @property { string } externalSystemId Filter positions by external system ID (substring match) + * @property { CommonModels.DateRangeDto } createdAt + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.DateRangeDto } departureDate + * @property { CommonModels.DateRangeDto } arrivalDate + * @property { CommonModels.DateRangeDto } blfromCostumerDate + * @property { CommonModels.DateRangeDto } blfromCarrierDate + * @property { CommonModels.DateRangeDto } customsDate + * @property { CommonModels.DateRangeDto } vgmCustomerDate + * @property { string } partnerNetworkId Filter positions by partner network ID + * @property { string[] } projectLiteId Filter positions by project IDs + * @property { string[] } checklistItemsDone Checklist item ids that must be completed + * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics + * @property { boolean } isMasterPosition + * @property { string[] } loadingPortId Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure) + * @property { string[] } dischargePortId Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport) + * @property { string } customerReference Filter positions by customer reference + * @property { string } carrierReference Filter positions by carrier reference + * @property { string } consigneeReference Filter positions by consignee reference + * @property { string } hblNumber Filter positions by HBL/HAWB number + * @property { string } mblNumber Filter positions by MBL/MAWB number + * @property { string } bookingNumber Filter positions by booking number + * @property { string } vessel Filter positions by vessel name + * @property { string } voyage Filter positions by voyage number + * @property { string } vesselCarrier Filter positions by vessel or carrier name + */ + export const PositionFilterDtoSchema = z + .object({ + transportMode: CommonModels.TransportModeEnumSchema, + customerId: z.array(z.string()).readonly(), + carrierId: z.array(z.string()).readonly().describe("Filter positions by carrier IDs"), + consigneeId: z.array(z.string()).readonly().describe("Filter positions by consignee IDs"), + isCancelled: z.boolean(), + status: CommonModels.PositionStatusEnumSchema, + number: z.string(), + direction: CommonModels.DirectionEnumSchema, + loadType: CommonModels.LoadTypeEnumSchema, + serviceType: CommonModels.ServiceTypeEnumSchema, + employee: z.array(z.string()).readonly().describe("Filter positions by employee IDs"), + searchQuery: z.string(), + externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), + createdAt: CommonModels.DateRangeDtoSchema, + serviceDate: CommonModels.DateRangeDtoSchema, + departureDate: CommonModels.DateRangeDtoSchema, + arrivalDate: CommonModels.DateRangeDtoSchema, + blfromCostumerDate: CommonModels.DateRangeDtoSchema, + blfromCarrierDate: CommonModels.DateRangeDtoSchema, + customsDate: CommonModels.DateRangeDtoSchema, + vgmCustomerDate: CommonModels.DateRangeDtoSchema, + partnerNetworkId: z.string().describe("Filter positions by partner network ID"), + projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), + checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), + checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), + routing: CommonModels.SeaRoutingEnumSchema, + isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + isMasterPosition: z.boolean(), + loadingPortId: z + .array(z.string()) + .readonly() + .describe( + "Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure)", + ), + dischargePortId: z + .array(z.string()) + .readonly() + .describe( + "Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport)", + ), + customerReference: z.string().describe("Filter positions by customer reference"), + carrierReference: z.string().describe("Filter positions by carrier reference"), + consigneeReference: z.string().describe("Filter positions by consignee reference"), + hblNumber: z.string().describe("Filter positions by HBL/HAWB number"), + mblNumber: z.string().describe("Filter positions by MBL/MAWB number"), + bookingNumber: z.string().describe("Filter positions by booking number"), + vessel: z.string().describe("Filter positions by vessel name"), + voyage: z.string().describe("Filter positions by voyage number"), + vesselCarrier: z.string().describe("Filter positions by vessel or carrier name"), + }) + .readonly(); + export type PositionFilterDto = z.infer; + + /** + * PositionExportFilterDtoSchema + * @type { object } + * @property { CommonModels.TransportModeEnum } transportMode + * @property { string[] } customerId + * @property { boolean } isCancelled + * @property { CommonModels.PositionStatusEnum } status + * @property { string } number + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } responsibleEmployee Filter positions by responsible employee IDs + * @property { string } searchQuery + * @property { string } externalSystemId Filter positions by external system ID (substring match) + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.DateRangeDto } dateOfDeparture + * @property { CommonModels.DateRangeDto } dateOfArrival + * @property { CommonModels.DateRangeDto } blfromCostumerDate + * @property { CommonModels.DateRangeDto } blfromCarrierDate + * @property { CommonModels.DateRangeDto } customsDate + * @property { CommonModels.DateRangeDto } vgmCustomerDate + * @property { string } partnerNetworkId Filter positions by partner network ID + * @property { string[] } projectLiteId Filter positions by project IDs + * @property { string[] } checklistItemsDone Checklist item ids that must be completed + * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics + */ + export const PositionExportFilterDtoSchema = z + .object({ + transportMode: CommonModels.TransportModeEnumSchema, + customerId: z.array(z.string()).readonly(), + isCancelled: z.boolean(), + status: CommonModels.PositionStatusEnumSchema, + number: z.string(), + direction: CommonModels.DirectionEnumSchema, + loadType: CommonModels.LoadTypeEnumSchema, + serviceType: CommonModels.ServiceTypeEnumSchema, + responsibleEmployee: z.array(z.string()).readonly().describe("Filter positions by responsible employee IDs"), + searchQuery: z.string(), + externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), + statusDate: CommonModels.DateRangeDtoSchema, + serviceDate: CommonModels.DateRangeDtoSchema, + dateOfDeparture: CommonModels.DateRangeDtoSchema, + dateOfArrival: CommonModels.DateRangeDtoSchema, + blfromCostumerDate: CommonModels.DateRangeDtoSchema, + blfromCarrierDate: CommonModels.DateRangeDtoSchema, + customsDate: CommonModels.DateRangeDtoSchema, + vgmCustomerDate: CommonModels.DateRangeDtoSchema, + partnerNetworkId: z.string().describe("Filter positions by partner network ID"), + projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), + checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), + checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), + routing: CommonModels.SeaRoutingEnumSchema, + isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + }) + .readonly(); + export type PositionExportFilterDto = z.infer; + + /** + * PositionExportColumnSchema + * @type { enum } + */ + export const PositionExportColumnSchema = z.enum([ + "id", + "externalSystemId", + "transportMode", + "direction", + "loadType", + "createdAt", + "number", + "isCancelled", + "customerName", + "customerPhone", + "customerEmail", + "customerReference", + "consigneeName", + "consigneeReference", + "carrierName", + "carrierReference", + "positionNumber", + "hblNumber", + "mblNumber", + "bookingNumber", + "vessel", + "voyage", + "originName", + "loadDate", + "loadingPortName", + "dischargePortName", + "destinationName", + "deliveryDate", + "equipment", + "serviceTypeName", + "departureDate", + "arrivalDate", + "destinationOfficeName", + "currency", + "profit", + "margin", + "employeeName", + "projectName", + "serviceDate", + "routing", + "notes", + "blFromCustomerDate", + "blFromCarrierDate", + "customsDate", + "vgmCustomerDate", + "isMasterPosition", + "parentPositionId", + "parentPositionNumber", + ]); + export type PositionExportColumn = z.infer; + export const PositionExportColumn = PositionExportColumnSchema.enum; + + /** + * PositionExportRequestDtoSchema + * @type { object } + * @property { string } order Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @property { PositionExportColumn[] } columns Min Items: `1` + * @property { PositionExportFilterDto } filter + */ + export const PositionExportRequestDtoSchema = z + .object({ + order: z + .string() + .describe( + "Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition", + ), + columns: z.array(PositionExportColumnSchema).readonly().min(1), + filter: PositionExportFilterDtoSchema, + }) + .readonly(); + export type PositionExportRequestDto = z.infer; + + /** + * CreatePositionRequestDtoSchema + * @type { object } + * @property { CommonModels.SectionEnum } section + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum } transportMode + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } estimatedServiceDate + * @property { string } customerBusinessPartnerId + */ + export const CreatePositionRequestDtoSchema = z + .object({ + section: CommonModels.SectionEnumSchema, + direction: CommonModels.DirectionEnumSchema, + transportMode: CommonModels.TransportModeEnumSchema, + loadType: CommonModels.LoadTypeEnumSchema, + serviceType: CommonModels.ServiceTypeEnumSchema, + estimatedServiceDate: z.iso.datetime({ offset: true }), + customerBusinessPartnerId: z.string(), + }) + .readonly(); + export type CreatePositionRequestDto = z.infer; + + /** + * DuplicatePositionPackageInformationParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } packageType + * @property { boolean } packageQuantity + * @property { boolean } packageDescription + * @property { boolean } packageHsCodes + * @property { boolean } packageNetWeight + * @property { boolean } packageGrossWeight + * @property { boolean } packageCaseMark + * @property { boolean } packageNote + * @property { boolean } packageCustomsMark + */ + export const DuplicatePositionPackageInformationParametersDtoSchema = z + .object({ + enabled: z.boolean(), + packageType: z.boolean(), + packageQuantity: z.boolean(), + packageDescription: z.boolean(), + packageHsCodes: z.boolean(), + packageNetWeight: z.boolean(), + packageGrossWeight: z.boolean(), + packageCaseMark: z.boolean(), + packageNote: z.boolean(), + packageCustomsMark: z.boolean(), + }) + .readonly(); + export type DuplicatePositionPackageInformationParametersDto = z.infer< + typeof DuplicatePositionPackageInformationParametersDtoSchema + >; + + /** + * DuplicatePositionCargoParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { DuplicatePositionPackageInformationParametersDto } packageInformation + */ + export const DuplicatePositionCargoParametersDtoSchema = z + .object({ enabled: z.boolean(), packageInformation: DuplicatePositionPackageInformationParametersDtoSchema }) + .readonly(); + export type DuplicatePositionCargoParametersDto = z.infer; + + /** + * DuplicatePositionOverviewParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } quoteReference + */ + export const DuplicatePositionOverviewParametersDtoSchema = z + .object({ enabled: z.boolean(), quoteReference: z.boolean() }) + .readonly(); + export type DuplicatePositionOverviewParametersDto = z.infer; + + /** + * DuplicatePositionInvolvedPartiesParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } involvedPartySection + */ + export const DuplicatePositionInvolvedPartiesParametersDtoSchema = z + .object({ enabled: z.boolean(), involvedPartySection: z.boolean() }) + .readonly(); + export type DuplicatePositionInvolvedPartiesParametersDto = z.infer< + typeof DuplicatePositionInvolvedPartiesParametersDtoSchema + >; + + /** + * DuplicatePositionRoutesParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } routeDates + * @property { boolean } routeLocation + */ + export const DuplicatePositionRoutesParametersDtoSchema = z + .object({ enabled: z.boolean(), routeDates: z.boolean(), routeLocation: z.boolean() }) + .readonly(); + export type DuplicatePositionRoutesParametersDto = z.infer; + + /** + * DuplicatePositionFinanceAccountParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } exchangeRate + */ + export const DuplicatePositionFinanceAccountParametersDtoSchema = z + .object({ enabled: z.boolean(), exchangeRate: z.boolean() }) + .readonly(); + export type DuplicatePositionFinanceAccountParametersDto = z.infer< + typeof DuplicatePositionFinanceAccountParametersDtoSchema + >; + + /** + * DuplicatePositionDocumentsParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } hblWorkingDocument + * @property { boolean } siWorkingDocument + */ + export const DuplicatePositionDocumentsParametersDtoSchema = z + .object({ enabled: z.boolean(), hblWorkingDocument: z.boolean(), siWorkingDocument: z.boolean() }) + .readonly(); + export type DuplicatePositionDocumentsParametersDto = z.infer; + + /** + * DuplicatePositionParametersDtoSchema + * @type { object } + * @property { DuplicatePositionOverviewParametersDto } overview + * @property { DuplicatePositionInvolvedPartiesParametersDto } involvedParties + * @property { DuplicatePositionCargoParametersDto } cargo + * @property { DuplicatePositionRoutesParametersDto } routes + * @property { DuplicatePositionFinanceAccountParametersDto } financeAccount + * @property { DuplicatePositionDocumentsParametersDto } documents + */ + export const DuplicatePositionParametersDtoSchema = z + .object({ + overview: DuplicatePositionOverviewParametersDtoSchema, + involvedParties: DuplicatePositionInvolvedPartiesParametersDtoSchema, + cargo: DuplicatePositionCargoParametersDtoSchema, + routes: DuplicatePositionRoutesParametersDtoSchema, + financeAccount: DuplicatePositionFinanceAccountParametersDtoSchema, + documents: DuplicatePositionDocumentsParametersDtoSchema, + }) + .readonly(); + export type DuplicatePositionParametersDto = z.infer; + + /** + * DuplicatePositionDefaultParametersResponseDtoSchema + * @type { object } + * @property { string } estimatedServiceDate Suggested estimated service date for the duplicated position (ISO 8601) + * @property { DuplicatePositionParametersDto } parameters Default duplication parameters with section and sub-parameter flags + */ + export const DuplicatePositionDefaultParametersResponseDtoSchema = z + .object({ + estimatedServiceDate: z + .string() + .describe("Suggested estimated service date for the duplicated position (ISO 8601)"), + parameters: DuplicatePositionParametersDtoSchema.describe( + "Default duplication parameters with section and sub-parameter flags", + ), + }) + .readonly(); + export type DuplicatePositionDefaultParametersResponseDto = z.infer< + typeof DuplicatePositionDefaultParametersResponseDtoSchema + >; + + /** + * PositionSectionEnumSchema + * @type { enum } + */ + export const PositionSectionEnumSchema = z.enum([ + "overview", + "involvedParties", + "cargo", + "financeAccount", + "routes", + "routeDates", + "documents", + ]); + export type PositionSectionEnum = z.infer; + export const PositionSectionEnum = PositionSectionEnumSchema.enum; + + /** + * DuplicatePositionRequestDtoSchema + * @type { object } + * @property { PositionSectionEnum[] } sections Legacy: sections to duplicate. Ignored when parameters is provided. + * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. + * @property { string } estimatedServiceDate + */ + export const DuplicatePositionRequestDtoSchema = z + .object({ + sections: z + .array(PositionSectionEnumSchema) + .readonly() + .describe("Legacy: sections to duplicate. Ignored when parameters is provided.") + .nullish(), + parameters: DuplicatePositionParametersDtoSchema.describe( + "Nested parameters for duplication control. Preferred over sections.", + ).nullish(), + estimatedServiceDate: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type DuplicatePositionRequestDto = z.infer; + + /** + * UpdatePositionDtoSchema + * @type { object } + * @property { string } externalSystemId + * @property { string } statusDate + * @property { CommonModels.PositionStatusEnum } status + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.IncotermsEnum } incoterms + * @property { CommonModels.IncotermsEnum } secondIncoterms + * @property { string } fillingCompany + * @property { string } sellingContract + * @property { string } fillingScacCode + * @property { string } serviceValidity + * @property { string } ratesValidity + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } buyRateReference + * @property { CommonModels.FrequencyEnum } frequency + * @property { boolean } isParentPosition + * @property { boolean } isExcludedFromStatistics + * @property { string } team + * @property { string } salesRepId + * @property { string } responsibleEmployeeId + * @property { string } receivedByEmployeeId + * @property { string } originOfficeId + * @property { string } projectLiteId + * @property { CommonModels.EditorContentUpdateDto } notes Notes + * @property { CommonModels.MovementTypeEnum } inttraTypeOfMove + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ + export const UpdatePositionDtoSchema = z + .object({ + externalSystemId: z.string(), + statusDate: z.iso.datetime({ offset: true }), + status: CommonModels.PositionStatusEnumSchema, + loadType: CommonModels.LoadTypeEnumSchema, + incoterms: CommonModels.IncotermsEnumSchema, + secondIncoterms: CommonModels.IncotermsEnumSchema, + fillingCompany: z.string(), + sellingContract: z.string(), + fillingScacCode: z.string(), + serviceValidity: z.iso.datetime({ offset: true }), + ratesValidity: z.iso.datetime({ offset: true }), + serviceType: CommonModels.ServiceTypeEnumSchema, + buyRateReference: z.string(), + frequency: CommonModels.FrequencyEnumSchema, + isParentPosition: z.boolean(), + isExcludedFromStatistics: z.boolean(), + team: z.string(), + salesRepId: z.string(), + responsibleEmployeeId: z.string(), + receivedByEmployeeId: z.string(), + originOfficeId: z.string(), + projectLiteId: z.string(), + notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), + inttraTypeOfMove: CommonModels.MovementTypeEnumSchema, + volumetricWeightModifier: z.number().describe("Volumetric weight modifier"), + }) + .readonly(); + export type UpdatePositionDto = z.infer; + + /** + * ChildPositionCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ChildPositionCustomerDto = z.infer; + + /** + * ChildPositionProfitDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currency + */ + export const ChildPositionProfitDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); + export type ChildPositionProfitDto = z.infer; + + /** + * ChildPositionResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { number } packages + * @property { number } weight + * @property { number } volume + * @property { ChildPositionCustomerDto } customer + * @property { ChildPositionProfitDto } profit + */ + export const ChildPositionResponseDtoSchema = z + .object({ + id: z.string(), + number: z.string(), + packages: z.number(), + weight: z.number(), + volume: z.number(), + customer: ChildPositionCustomerDtoSchema, + profit: ChildPositionProfitDtoSchema, + }) + .readonly(); + export type ChildPositionResponseDto = z.infer; + + /** + * PositionLabelsFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } isParentPosition + * @property { boolean } isLinkedPosition + */ + export const PositionLabelsFilterDtoSchema = z + .object({ search: z.string(), isParentPosition: z.boolean(), isLinkedPosition: z.boolean() }) + .readonly(); + export type PositionLabelsFilterDto = z.infer; + + /** + * PositionListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ + export const PositionListResponseDtoSchema = z + .object({ + items: z.array(z.string()).readonly().describe("Items"), + totalProfit: z.number(), + profitPerPosition: z.number(), + page: z.number().describe("1-indexed page number to begin from").nullish(), + cursor: z.string().describe("ID of item to start after").nullish(), + nextCursor: z.string().describe("Cursor for next set of items").nullish(), + limit: z.number().describe("Items per response"), + totalItems: z.number().describe("Total available items"), + }) + .readonly(); + export type PositionListResponseDto = z.infer; + + /** + * LinkChildPositionsRequestDtoSchema + * @type { object } + * @property { string[] } childPositionIds + */ + export const LinkChildPositionsRequestDtoSchema = z + .object({ childPositionIds: z.array(z.string()).readonly() }) + .readonly(); + export type LinkChildPositionsRequestDto = z.infer; + + /** + * UnlinkChildPositionsRequestDtoSchema + * @type { object } + * @property { string[] } childPositionIds + */ + export const UnlinkChildPositionsRequestDtoSchema = z + .object({ childPositionIds: z.array(z.string()).readonly() }) + .readonly(); + export type UnlinkChildPositionsRequestDto = z.infer; + + /** + * PositionsFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PositionsFindAllResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PositionsFindAllResponse = z.infer; + + /** + * PositionsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const PositionsPaginateOrderParamEnumSchema = z.enum([ + "number", + "transportMode", + "isCancelled", + "direction", + "loadType", + "serviceDate", + "createdAt", + "departureDate", + "arrivalDate", + "blfromCostumerDate", + "blfromCarrierDate", + "customsDate", + "vgmCustomerDate", + "serviceType", + "externalSystemId", + "employee", + "project", + "profit", + "margin", + "isMasterPosition", + ]); + export type PositionsPaginateOrderParamEnum = z.infer; + export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSchema.enum; + + /** + * PositionsPaginateResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionPreviewResponseDto[] } items + */ + export const PositionsPaginateResponseSchema = z.object({ + ...PositionListResponseDtoSchema.shape, + ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape, + }); + export type PositionsPaginateResponse = z.infer; + + /** + * TotalProfitResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionPreviewResponseDto[] } items + */ + export const TotalProfitResponseSchema = z.object({ + ...PositionListResponseDtoSchema.shape, + ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape, + }); + export type TotalProfitResponse = z.infer; + + /** + * PositionsListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ + export const PositionsListAvailablePartnersForResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PositionsListAvailablePartnersForResponse = z.infer< + typeof PositionsListAvailablePartnersForResponseSchema + >; + + /** + * ListRouteLabelsResponseSchema + * @type { array } + */ + export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type ListRouteLabelsResponse = z.infer; + + /** + * ListChildResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChildPositionResponseDto[] } items + */ + export const ListChildResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ChildPositionResponseDtoSchema).readonly() }).readonly().shape, + }); + export type ListChildResponse = z.infer; +} diff --git a/test/generated/base/positions/positions.queries.ts b/test/generated/base/positions/positions.queries.ts new file mode 100644 index 0000000..b3e5df0 --- /dev/null +++ b/test/generated/base/positions/positions.queries.ts @@ -0,0 +1,757 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionsAcl } from "./positions.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionsApi } from "./positions.api"; + +export namespace PositionsQueries { + export const moduleName = QueryModule.Positions; + + export const keys = { + all: [moduleName] as const, + findAll: ( + officeId: string, + limit?: number, + filter?: PositionsModels.PositionLabelsFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/positions/labels", officeId, limit, filter, page, cursor] as const, + findAllInfinite: ( + officeId: string, + limit?: number, + filter?: PositionsModels.PositionLabelsFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/positions/labels", "infinite", officeId, limit, filter, cursor] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: PositionsModels.PositionFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/positions", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: PositionsModels.PositionFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/positions", "infinite", officeId, limit, order, filter, cursor] as const, + totalProfit: (officeId: string) => + [...keys.all, "/offices/:officeId/positions/fake-total-profit", officeId] as const, + listAvailablePartnersFor: ( + officeId: string, + positionId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/available-partners", + officeId, + positionId, + search, + useCase, + ] as const, + get: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId", officeId, positionId] as const, + listRouteLabels: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/routes/labels", officeId, positionId] as const, + getDuplicateDefaultParameters: (officeId: string, positionId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/duplicate/default-parameters", + officeId, + positionId, + ] as const, + listChild: (officeId: string, positionId: string, limit?: number, page?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/children", + officeId, + positionId, + limit, + page, + cursor, + ] as const, + listChildInfinite: (officeId: string, positionId: string, limit?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/children", + "infinite", + officeId, + positionId, + limit, + cursor, + ] as const, + }; + + /** + * Query `useFindAll` + * @summary List all positions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + officeId, + limit, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + filter?: PositionsModels.PositionLabelsFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(officeId, limit, filter, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUseFindAll({ officeId })); + return PositionsApi.findAll(officeId, limit, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindAllInfinite + * @summary List all positions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllInfinite = ( + { + officeId, + limit, + filter, + cursor, + }: { officeId: string; limit: number; filter?: PositionsModels.PositionLabelsFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUseFindAll({ officeId })); + return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginate` + * @summary List positions + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @param { PositionsModels.PositionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: PositionsModels.PositionFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUsePaginate({ officeId })); + return PositionsApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary List positions + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @param { PositionsModels.PositionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { officeId: string; limit: number; order?: string; filter?: PositionsModels.PositionFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUsePaginate({ officeId })); + return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create position + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { PositionsModels.CreatePositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position created successfully + * @statusCodes [201, 400, 401, 404] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof PositionsApi.create, + { officeId: string; data: PositionsModels.CreatePositionRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PositionsAcl.canUseCreate({ officeId })); + return PositionsApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useTotalProfit` + * @summary List positions + * @permission Requires `canUseTotalProfit` ability + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useTotalProfit = ( + { officeId }: { officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.totalProfit(officeId), + queryFn: () => { + checkAcl(PositionsAcl.canUseTotalProfit({ officeId })); + return PositionsApi.totalProfit(officeId, config); + }, + ...options, + }); + }; + + /** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for a position + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListAvailablePartnersFor = ( + { + officeId, + positionId, + search, + useCase, + }: { + officeId: string; + positionId: string; + search?: string; + useCase?: CommonModels.PositionAvailablePartnersUseCase; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), + queryFn: () => { + checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId })); + return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase, config); + }, + ...options, + }); + }; + + /** + * Mutation `useExportPositions` - recommended when file should not be cached + * @summary Export positions to Excel + * @permission Requires `canUseExportPositions` ability + * @param { string } mutation.officeId Path parameter + * @param { PositionsModels.PositionExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportPositions = ( + options?: AppMutationOptions< + typeof PositionsApi.exportPositions, + { officeId: string; data: PositionsModels.PositionExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PositionsAcl.canUseExportPositions({ officeId })); + return PositionsApi.exportPositions(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGet` + * @summary Get position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Position retrieved successfully + * @statusCodes [200, 401, 403, 404] + */ + export const useGet = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseGet({ officeId })); + return PositionsApi.get(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.UpdatePositionDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position updated successfully + * @statusCodes [200, 400, 401, 404] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof PositionsApi.update, + { officeId: string; positionId: string; data: PositionsModels.UpdatePositionDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseUpdate({ officeId })); + return PositionsApi.update(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListRouteLabels` + * @summary List all route labels for a position + * @permission Requires `canUseListRouteLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListRouteLabels = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRouteLabels(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseListRouteLabels({ officeId })); + return PositionsApi.listRouteLabels(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Query `useGetDuplicateDefaultParameters` + * @summary Get default duplication parameters for a position + * @permission Requires `canUseGetDuplicateDefaultParameters` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Default parameters and suggested estimated service date + * @statusCodes [200, 401, 404] + */ + export const useGetDuplicateDefaultParameters = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId })); + return PositionsApi.getDuplicateDefaultParameters(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useDuplicate` + * @summary Duplicate position + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.DuplicatePositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position duplicated successfully + * @statusCodes [201, 400, 401, 404] + */ + export const useDuplicate = ( + options?: AppMutationOptions< + typeof PositionsApi.duplicate, + { officeId: string; positionId: string; data: PositionsModels.DuplicatePositionRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseDuplicate({ officeId })); + return PositionsApi.duplicate(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCancel` + * @summary Cancel position + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position cancelled successfully + * @statusCodes [200, 400, 401, 403, 404] + */ + export const useCancel = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionsAcl.canUseCancel({ officeId })); + return PositionsApi.cancel(officeId, positionId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useRevertCancel` + * @summary Revert cancelled position (accounting) + * @permission Requires `canUseRevertCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position reverted successfully + * @statusCodes [200, 400, 401, 403, 404] + */ + export const useRevertCancel = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionsAcl.canUseRevertCancel({ officeId })); + return PositionsApi.revertCancel(officeId, positionId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useLinkChild` + * @summary Link child positions to parent + * @permission Requires `canUseLinkChild` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.LinkChildPositionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useLinkChild = ( + options?: AppMutationOptions< + typeof PositionsApi.linkChild, + { officeId: string; positionId: string; data: PositionsModels.LinkChildPositionsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseLinkChild({ officeId })); + return PositionsApi.linkChild(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnlinkChild` + * @summary Unlink child positions from parent + * @permission Requires `canUseUnlinkChild` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.UnlinkChildPositionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnlinkChild = ( + options?: AppMutationOptions< + typeof PositionsApi.unlinkChild, + { officeId: string; positionId: string; data: PositionsModels.UnlinkChildPositionsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseUnlinkChild({ officeId })); + return PositionsApi.unlinkChild(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListChild` + * @summary Get child positions for parent + * @permission Requires `canUseListChild` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListChild = ( + { + officeId, + positionId, + limit, + page, + cursor, + }: { officeId: string; positionId: string; limit: number; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listChild(officeId, positionId, limit, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUseListChild({ officeId })); + return PositionsApi.listChild(officeId, positionId, limit, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListChildInfinite + * @summary Get child positions for parent + * @permission Requires `canUseListChild` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListChildInfinite = ( + { officeId, positionId, limit, cursor }: { officeId: string; positionId: string; limit: number; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUseListChild({ officeId })); + return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/base/projectLite/projectLite.acl.ts b/test/generated/base/projectLite/projectLite.acl.ts new file mode 100644 index 0000000..746ff45 --- /dev/null +++ b/test/generated/base/projectLite/projectLite.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ProjectLiteAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create project in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Create", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List projects for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Read", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `usePaginateProjectLabels` query ability. For global ability, omit the object parameter. + * @description Paginate project labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateProjectLabels` query + */ + export const canUsePaginateProjectLabels = (object?: { officeId: string }) => + ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Read", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get project by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Read", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Update", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Archive", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Archive", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; +} diff --git a/test/generated/base/projectLite/projectLite.api.ts b/test/generated/base/projectLite/projectLite.api.ts new file mode 100644 index 0000000..e27b360 --- /dev/null +++ b/test/generated/base/projectLite/projectLite.api.ts @@ -0,0 +1,142 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ProjectLiteModels } from "./projectLite.models"; + +export namespace ProjectLiteApi { + export const create = ( + officeId: string, + data: ProjectLiteModels.CreateProjectLiteRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite`, + ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), + config, + ); + }; + + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, + `/offices/${officeId}/project-lite`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const paginateProjectLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, + `/offices/${officeId}/project-lite/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite/${id}`, + config, + ); + }; + + export const update = ( + id: string, + officeId: string, + data: ProjectLiteModels.UpdateProjectLiteRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite/${id}`, + ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/project-lite/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/project-lite/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/projectLite/projectLite.configs.ts b/test/generated/base/projectLite/projectLite.configs.ts new file mode 100644 index 0000000..c5f3f45 --- /dev/null +++ b/test/generated/base/projectLite/projectLite.configs.ts @@ -0,0 +1,115 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ProjectLiteModels } from "./projectLite.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ProjectLiteQueries } from "./projectLite.queries"; +import { ProjectLiteAcl } from "./projectLite.acl"; + +export namespace ProjectLiteConfigs { + export const projectLiteConfig = { + meta: { + title: "Project Lite", + }, + readAll: { + acl: ProjectLiteAcl.canUsePaginate, + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + paginated: ProjectLiteQueries.usePaginate, + infinite: ProjectLiteQueries.usePaginateInfinite, + filters: { + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: ProjectLiteAcl.canUseFindById, + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + query: ProjectLiteQueries.useFindById, + }, + create: { + acl: ProjectLiteAcl.canUseCreate, + schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, + mutation: ProjectLiteQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + update: { + acl: ProjectLiteAcl.canUseUpdate, + schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, + mutation: ProjectLiteQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: ProjectLiteAcl.canUsePaginateProjectLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ProjectLiteQueries.usePaginateProjectLabels, + infinite: ProjectLiteQueries.usePaginateProjectLabelsInfinite, + filters: { + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/projectLite/projectLite.models.ts b/test/generated/base/projectLite/projectLite.models.ts new file mode 100644 index 0000000..b70c907 --- /dev/null +++ b/test/generated/base/projectLite/projectLite.models.ts @@ -0,0 +1,128 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ProjectLiteModels { + /** + * ProjectLiteEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ProjectLiteEmployeeDTO = z.infer; + + /** + * ProjectLiteResponseDTOSchema + * @type { object } + * @property { string } id Project ID + * @property { string } name Project name + * @property { string } officeId Office ID + * @property { boolean } archived Is archived + * @property { string } createdById ID of the employee who created this project + * @property { ProjectLiteEmployeeDTO } createdBy Employee who created this project + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this project + * @property { ProjectLiteEmployeeDTO } updatedBy Employee who last updated this project + * @property { string } updatedAt Updated at + */ + export const ProjectLiteResponseDTOSchema = z + .object({ + id: z.string().describe("Project ID"), + name: z.string().describe("Project name"), + officeId: z.string().describe("Office ID"), + archived: z.boolean().describe("Is archived"), + createdById: z.string().describe("ID of the employee who created this project").nullish(), + createdBy: ProjectLiteEmployeeDTOSchema.describe("Employee who created this project").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedById: z.string().describe("ID of the employee who last updated this project").nullish(), + updatedBy: ProjectLiteEmployeeDTOSchema.describe("Employee who last updated this project").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + }) + .readonly(); + export type ProjectLiteResponseDTO = z.infer; + + /** + * CreateProjectLiteRequestDTOSchema + * @type { object } + * @property { string } name Project name + */ + export const CreateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); + export type CreateProjectLiteRequestDTO = z.infer; + + /** + * ProjectLiteFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ + export const ProjectLiteFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); + export type ProjectLiteFilterDto = z.infer; + + /** + * UpdateProjectLiteRequestDTOSchema + * @type { object } + * @property { string } name Project name + */ + export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); + export type UpdateProjectLiteRequestDTO = z.infer; + + /** + * ProjectLitePaginateOrderParamEnumSchema + * @type { enum } + */ + export const ProjectLitePaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ProjectLitePaginateOrderParamEnum = z.infer; + export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEnumSchema.enum; + + /** + * ProjectLitePaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ProjectLiteResponseDTO[] } items + */ + export const ProjectLitePaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ProjectLitePaginateResponse = z.infer; + + /** + * PaginateProjectLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PaginateProjectLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PaginateProjectLabelsOrderParamEnum = z.infer; + export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderParamEnumSchema.enum; + + /** + * PaginateProjectLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PaginateProjectLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PaginateProjectLabelsResponse = z.infer; +} diff --git a/test/generated/base/projectLite/projectLite.queries.ts b/test/generated/base/projectLite/projectLite.queries.ts new file mode 100644 index 0000000..aa91db8 --- /dev/null +++ b/test/generated/base/projectLite/projectLite.queries.ts @@ -0,0 +1,415 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ProjectLiteAcl } from "./projectLite.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ProjectLiteModels } from "./projectLite.models"; +import { ProjectLiteApi } from "./projectLite.api"; + +export namespace ProjectLiteQueries { + export const moduleName = QueryModule.ProjectLite; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/project-lite", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/project-lite", "infinite", officeId, limit, order, filter, cursor] as const, + paginateProjectLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/project-lite/labels/paginate", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateProjectLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/project-lite/labels/paginate", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/project-lite/:id", id, officeId] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create project + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ProjectLiteModels.CreateProjectLiteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof ProjectLiteApi.create, + { officeId: string; data: ProjectLiteModels.CreateProjectLiteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ProjectLiteAcl.canUseCreate({ officeId })); + return ProjectLiteApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Get paginated projects + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ProjectLiteModels.ProjectLiteFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUsePaginate({ officeId })); + return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Get paginated projects + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ProjectLiteModels.ProjectLiteFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ProjectLiteAcl.canUsePaginate({ officeId })); + return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateProjectLabels` + * @summary Paginate project labels + * @permission Requires `canUsePaginateProjectLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateProjectLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ProjectLiteModels.ProjectLiteFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId })); + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateProjectLabelsInfinite + * @summary Paginate project labels + * @permission Requires `canUsePaginateProjectLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateProjectLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ProjectLiteModels.ProjectLiteFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId })); + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get project by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUseFindById({ officeId })); + return ProjectLiteApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update project + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ProjectLiteModels.UpdateProjectLiteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ProjectLiteApi.update, + { id: string; officeId: string; data: ProjectLiteModels.UpdateProjectLiteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ProjectLiteAcl.canUseUpdate({ officeId })); + return ProjectLiteApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive project + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ProjectLiteAcl.canUseArchive({ officeId })); + return ProjectLiteApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive project + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId })); + return ProjectLiteApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/queryModules.ts b/test/generated/base/queryModules.ts new file mode 100644 index 0000000..cb83878 --- /dev/null +++ b/test/generated/base/queryModules.ts @@ -0,0 +1,96 @@ +export const enum QueryModule { + WorkingDocuments = "WorkingDocumentsQueries", + Offices = "OfficesQueries", + BankAccounts = "BankAccountsQueries", + Currencies = "CurrenciesQueries", + Countries = "CountriesQueries", + Folders = "FoldersQueries", + Files = "FilesQueries", + WorkingDocumentsTemplatedDocument = "WorkingDocumentsTemplatedDocumentQueries", + BusinessPartners = "BusinessPartnersQueries", + BusinessPartnerBookkeepingMappings = "BusinessPartnerBookkeepingMappingsQueries", + BusinessPartnerContacts = "BusinessPartnerContactsQueries", + Cities = "CitiesQueries", + Depots = "DepotsQueries", + PartnerNetworks = "PartnerNetworksQueries", + Warehouses = "WarehousesQueries", + UserActivity = "UserActivityQueries", + DocumentTemplates = "DocumentTemplatesQueries", + HsCodes = "HsCodesQueries", + CargoTypes = "CargoTypesQueries", + SeaPositions = "SeaPositionsQueries", + Terminals = "TerminalsQueries", + Airports = "AirportsQueries", + Ports = "PortsQueries", + ContainerYards = "ContainerYardsQueries", + PositionInvolvedParties = "PositionInvolvedPartiesQueries", + PositionRoutes = "PositionRoutesQueries", + AirPositions = "AirPositionsQueries", + PositionAccount = "PositionAccountQueries", + PositionAccountItems = "PositionAccountItemsQueries", + PositionProfitChangeTracking = "PositionProfitChangeTrackingQueries", + WorkingDocumentsExportDeclaration = "WorkingDocumentsExportDeclarationQueries", + PositionCargo = "PositionCargoQueries", + PositionCargoPackage = "PositionCargoPackageQueries", + PackageTypes = "PackageTypesQueries", + WorkingDocumentsHouseBl = "WorkingDocumentsHouseBlQueries", + WorkingDocumentsBlInstructions = "WorkingDocumentsBlInstructionsQueries", + WorkingDocumentsAmsInstructions = "WorkingDocumentsAmsInstructionsQueries", + WorkingDocumentsHouseAwb = "WorkingDocumentsHouseAwbQueries", + ChargeTypes = "ChargeTypesQueries", + WorkingDocumentsMasterAwb = "WorkingDocumentsMasterAwbQueries", + WorkingDocumentsCmrForm = "WorkingDocumentsCmrFormQueries", + WorkingDocumentsIsfForm = "WorkingDocumentsIsfFormQueries", + WorkingDocumentsFcrForm = "WorkingDocumentsFcrFormQueries", + ShippingInstructions = "ShippingInstructionsQueries", + EmployeeAccount = "EmployeeAccountQueries", + EmployeeSettings = "EmployeeSettingsQueries", + EmployeeRoles = "EmployeeRolesQueries", + EmployeePermissions = "EmployeePermissionsQueries", + EmployeeProfile = "EmployeeProfileQueries", + Employee = "EmployeeQueries", + Employment = "EmploymentQueries", + CustomerAccount = "CustomerAccountQueries", + Customers = "CustomersQueries", + Quotes = "QuotesQueries", + QuoteAccount = "QuoteAccountQueries", + QuoteProfitChangeTracking = "QuoteProfitChangeTrackingQueries", + SeaQuotes = "SeaQuotesQueries", + RoadQuotes = "RoadQuotesQueries", + QuoteDocument = "QuoteDocumentQueries", + QuoteCargo = "QuoteCargoQueries", + QuoteCargoPackage = "QuoteCargoPackageQueries", + QuoteRoutes = "QuoteRoutesQueries", + DunningManagement = "DunningManagementQueries", + DunningPartnerOutstandingInvoices = "DunningPartnerOutstandingInvoicesQueries", + DunningLevels = "DunningLevelsQueries", + DunningSystems = "DunningSystemsQueries", + DunningAccountStatement = "DunningAccountStatementQueries", + Positions = "PositionsQueries", + QuoteConversion = "QuoteConversionQueries", + Invoices = "InvoicesQueries", + VatRules = "VatRulesQueries", + InvoicePayments = "InvoicePaymentsQueries", + PaymentConfirmations = "PaymentConfirmationsQueries", + ProjectLite = "ProjectLiteQueries", + PositionChecklist = "PositionChecklistQueries", + ChecklistTemplates = "ChecklistTemplatesQueries", + BookkeepingExport = "BookkeepingExportQueries", + FactoringExport = "FactoringExportQueries", + FactoringMerge = "FactoringMergeQueries", + AWBStocks = "AWBStocksQueries", + MasterData = "MasterDataQueries", + ChecklistItems = "ChecklistItemsQueries", + MasterDataImport = "MasterDataImportQueries", + RemarkTemplates = "RemarkTemplatesQueries", + IntegrationChannels = "IntegrationChannelsQueries", + ControlTowerBookings = "ControlTowerBookingsQueries", + ControlTowerPackages = "ControlTowerPackagesQueries", + ControlTowerContainers = "ControlTowerContainersQueries", + ControlTowerAuth = "ControlTowerAuthQueries", + ControlTowerMe = "ControlTowerMeQueries", + ControlTowerSearch = "ControlTowerSearchQueries", + ControlTowerCalendar = "ControlTowerCalendarQueries", + InttraShippingInstructionMessages = "InttraShippingInstructionMessagesQueries", + InttraOfficeIntegration = "InttraOfficeIntegrationQueries", +} diff --git a/test/generated/base/quoteAccount/quoteAccount.acl.ts b/test/generated/base/quoteAccount/quoteAccount.acl.ts new file mode 100644 index 0000000..a86beb5 --- /dev/null +++ b/test/generated/base/quoteAccount/quoteAccount.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteAccountAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description List quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCreateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateItem` mutation + */ + export const canUseCreateItem = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useDeleteItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteItem` mutation + */ + export const canUseDeleteItem = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateItem` mutation + */ + export const canUseUpdateItem = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useDuplicateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateItem` mutation + */ + export const canUseDuplicateItem = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/base/quoteAccount/quoteAccount.api.ts b/test/generated/base/quoteAccount/quoteAccount.api.ts new file mode 100644 index 0000000..517d13e --- /dev/null +++ b/test/generated/base/quoteAccount/quoteAccount.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteAccountModels } from "./quoteAccount.models"; + +export namespace QuoteAccountApi { + export const get = (quoteId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/account`, + config, + ); + }; + + export const createItem = ( + quoteId: string, + officeId: string, + data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items`, + ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), + config, + ); + }; + + export const deleteItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, + undefined, + config, + ); + }; + + export const updateItem = ( + quoteId: string, + itemId: string, + officeId: string, + data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, + ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), + config, + ); + }; + + export const duplicateItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/quoteAccount/quoteAccount.models.ts b/test/generated/base/quoteAccount/quoteAccount.models.ts new file mode 100644 index 0000000..cc26d54 --- /dev/null +++ b/test/generated/base/quoteAccount/quoteAccount.models.ts @@ -0,0 +1,273 @@ +import { z } from "zod"; + +export namespace QuoteAccountModels { + /** + * QuoteAccountItemTypeEnumSchema + * @type { enum } + */ + export const QuoteAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); + export type QuoteAccountItemTypeEnum = z.infer; + export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; + + /** + * QuoteChargeDtoResponseSchema + * @type { object } + * @property { object } chargeType + * @property { string } chargeType.id + * @property { string } chargeType.name + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { object } buyVatRule + * @property { string } buyVatRule.id + * @property { string } buyVatRule.name + * @property { string } buyVatRule.matchcode + * @property { string } buyVatRule.printCode + * @property { object } vendor + * @property { string } vendor.id + * @property { string } vendor.name + * @property { string } vendor.matchCode + * @property { string } vendor.label + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { object } sellVatRule + * @property { string } sellVatRule.id + * @property { string } sellVatRule.name + * @property { string } sellVatRule.matchcode + * @property { string } sellVatRule.printCode + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + * @property { number } profit Profit amount + */ + export const QuoteChargeDtoResponseSchema = z + .object({ + chargeType: z.object({ id: z.string(), name: z.string() }).readonly(), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().describe("Quantity of the charge").nullish(), + buyRate: z.number().describe("Buy rate amount").nullish(), + buyCurrencyCode: z.string().describe("Buy rate currency code"), + buyVatRule: z + .object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }) + .readonly(), + vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), + sellRate: z.number().describe("Sell rate amount").nullish(), + sellCurrencyCode: z.string().describe("Sell rate currency code"), + sellVatRule: z + .object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }) + .readonly(), + customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), + profit: z.number().describe("Profit amount").nullish(), + }) + .readonly(); + export type QuoteChargeDtoResponse = z.infer; + + /** + * QuoteTextDtoResponseSchema + * @type { object } + * @property { string } content Text content + */ + export const QuoteTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); + export type QuoteTextDtoResponse = z.infer; + + /** + * QuoteAccountItemDtoResponseSchema + * @type { object } + * @property { string } id Item ID + * @property { QuoteAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE + * @property { QuoteTextDtoResponse } text Text data if type is TEXT + */ + export const QuoteAccountItemDtoResponseSchema = z + .object({ + id: z.string().describe("Item ID"), + type: QuoteAccountItemTypeEnumSchema.describe("Item type"), + orderPosition: z.number().describe("Order position of the item"), + charge: QuoteChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), + text: QuoteTextDtoResponseSchema.describe("Text data if type is TEXT").nullish(), + }) + .readonly(); + export type QuoteAccountItemDtoResponse = z.infer; + + /** + * QuoteAccountResponseDtoSchema + * @type { object } + * @property { string } id Account ID + * @property { string } quoteId Quote ID + * @property { QuoteAccountItemDtoResponse[] } items Account items + * @property { object } totals Account totals + * @property { number } totals.totalBuyRates + * @property { number } totals.totalSellRates + * @property { number } totals.totalProfit + * @property { number } totals.displayAmount + * @property { string } totals.displayCurrencyCode + * @property { object[] } totalsPerCurrency Account totals per currency + * @property { number } totalsPerCurrency.[0].totalBuyRates + * @property { number } totalsPerCurrency.[0].totalSellRates + * @property { number } totalsPerCurrency.[0].totalProfit + * @property { number } totalsPerCurrency.[0].displayAmount + * @property { string } totalsPerCurrency.[0].displayCurrencyCode + */ + export const QuoteAccountResponseDtoSchema = z + .object({ + id: z.string().describe("Account ID"), + quoteId: z.string().describe("Quote ID"), + items: z.array(QuoteAccountItemDtoResponseSchema).readonly().describe("Account items"), + totals: z + .object({ + totalBuyRates: z.number(), + totalSellRates: z.number(), + totalProfit: z.number(), + displayAmount: z.number(), + displayCurrencyCode: z.string(), + }) + .readonly() + .describe("Account totals"), + totalsPerCurrency: z + .array( + z + .object({ + totalBuyRates: z.number(), + totalSellRates: z.number(), + totalProfit: z.number(), + displayAmount: z.number(), + displayCurrencyCode: z.string(), + }) + .readonly(), + ) + .readonly() + .describe("Account totals per currency"), + }) + .readonly(); + export type QuoteAccountResponseDto = z.infer; + + /** + * CreateQuoteChargeDataDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1`. Default: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code. Default: `EUR` + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code. Default: `EUR` + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ + export const CreateQuoteChargeDataDtoSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID"), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().gte(1).describe("Quantity of the charge").default(1), + buyRate: z.number().describe("Buy rate amount"), + buyCurrencyCode: z.string().describe("Buy rate currency code").default("EUR"), + buyVatRuleId: z.string().describe("Buy VAT rule ID"), + vendorId: z.string().describe("Vendor ID"), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), + sellRate: z.number().describe("Sell rate amount"), + sellCurrencyCode: z.string().describe("Sell rate currency code").default("EUR"), + sellVatRuleId: z.string().describe("Sell VAT rule ID"), + customerId: z.string().describe("Customer ID"), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), + }) + .readonly(); + export type CreateQuoteChargeDataDto = z.infer; + + /** + * CreateQuoteTextDataDtoSchema + * @type { object } + * @property { string } content Text content + */ + export const CreateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); + export type CreateQuoteTextDataDto = z.infer; + + /** + * CreateQuoteAccountItemRequestDtoSchema + * @type { object } + * @property { QuoteAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { CreateQuoteChargeDataDto } charge Charge data if type is CHARGE + * @property { CreateQuoteTextDataDto } text Text data if type is TEXT + */ + export const CreateQuoteAccountItemRequestDtoSchema = z + .object({ + type: QuoteAccountItemTypeEnumSchema.describe("Item type"), + orderPosition: z.number().describe("Order position of the item").nullish(), + charge: CreateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE").nullish(), + text: CreateQuoteTextDataDtoSchema.describe("Text data if type is TEXT").nullish(), + }) + .readonly(); + export type CreateQuoteAccountItemRequestDto = z.infer; + + /** + * UpdateQuoteChargeDataDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ + export const UpdateQuoteChargeDataDtoSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID"), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().gte(1).describe("Quantity of the charge"), + buyRate: z.number().describe("Buy rate amount").nullable(), + buyCurrencyCode: z.string().describe("Buy rate currency code"), + buyVatRuleId: z.string().describe("Buy VAT rule ID").nullable(), + vendorId: z.string().describe("Vendor ID").nullable(), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), + sellRate: z.number().describe("Sell rate amount").nullable(), + sellCurrencyCode: z.string().describe("Sell rate currency code"), + sellVatRuleId: z.string().describe("Sell VAT rule ID").nullable(), + customerId: z.string().describe("Customer ID").nullable(), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), + }) + .readonly(); + export type UpdateQuoteChargeDataDto = z.infer; + + /** + * UpdateQuoteTextDataDtoSchema + * @type { object } + * @property { string } content Text content + */ + export const UpdateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); + export type UpdateQuoteTextDataDto = z.infer; + + /** + * UpdateQuoteAccountItemRequestDtoSchema + * @type { object } + * @property { number } orderPosition Order position of the item + * @property { UpdateQuoteChargeDataDto } charge Charge data if type is CHARGE + * @property { UpdateQuoteTextDataDto } text Text data if type is TEXT + */ + export const UpdateQuoteAccountItemRequestDtoSchema = z + .object({ + orderPosition: z.number().describe("Order position of the item"), + charge: UpdateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE"), + text: UpdateQuoteTextDataDtoSchema.describe("Text data if type is TEXT"), + }) + .readonly(); + export type UpdateQuoteAccountItemRequestDto = z.infer; +} diff --git a/test/generated/base/quoteAccount/quoteAccount.queries.ts b/test/generated/base/quoteAccount/quoteAccount.queries.ts new file mode 100644 index 0000000..abb1ca4 --- /dev/null +++ b/test/generated/base/quoteAccount/quoteAccount.queries.ts @@ -0,0 +1,187 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteAccountAcl } from "./quoteAccount.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteAccountModels } from "./quoteAccount.models"; +import { QuoteAccountApi } from "./quoteAccount.api"; + +export namespace QuoteAccountQueries { + export const moduleName = QueryModule.QuoteAccount; + + export const keys = { + all: [moduleName] as const, + get: (quoteId: string, officeId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/account", quoteId, officeId] as const, + }; + + /** + * Query `useGet` + * @summary Get quote account details + * @permission Requires `canUseGet` ability + * @param { string } object.quoteId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { quoteId, officeId }: { quoteId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(quoteId, officeId), + queryFn: () => { + checkAcl(QuoteAccountAcl.canUseGet({ officeId })); + return QuoteAccountApi.get(quoteId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateItem` + * @summary Create quote account item + * @permission Requires `canUseCreateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { QuoteAccountModels.CreateQuoteAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateItem = ( + options?: AppMutationOptions< + typeof QuoteAccountApi.createItem, + { quoteId: string; officeId: string; data: QuoteAccountModels.CreateQuoteAccountItemRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, officeId, data }) => { + checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId })); + return QuoteAccountApi.createItem(quoteId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteItem` + * @summary Delete quote account item + * @permission Requires `canUseDeleteItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteItem = ( + options?: AppMutationOptions< + typeof QuoteAccountApi.deleteItem, + { quoteId: string; itemId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId }) => { + checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId })); + return QuoteAccountApi.deleteItem(quoteId, itemId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateItem` + * @summary Update quote account item + * @permission Requires `canUseUpdateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { QuoteAccountModels.UpdateQuoteAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateItem = ( + options?: AppMutationOptions< + typeof QuoteAccountApi.updateItem, + { quoteId: string; itemId: string; officeId: string; data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId, data }) => { + checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId })); + return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicateItem` + * @summary Duplicate quote account item + * @permission Requires `canUseDuplicateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicateItem = ( + options?: AppMutationOptions< + typeof QuoteAccountApi.duplicateItem, + { quoteId: string; itemId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId }) => { + checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId })); + return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/quoteCargo/quoteCargo.acl.ts b/test/generated/base/quoteCargo/quoteCargo.acl.ts new file mode 100644 index 0000000..fcf6fb3 --- /dev/null +++ b/test/generated/base/quoteCargo/quoteCargo.acl.ts @@ -0,0 +1,99 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteCargoAcl { + /** + * Use for `useListCargosByQuoteId` query ability. For global ability, omit the object parameter. + * @description List cargo items by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByQuoteId` query + */ + export const canUseListCargosByQuoteId = (object?: { officeId: string }) => + ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Read", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. + * @description List cargo labels by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query + */ + export const canUseListCargoLabels = (object?: { officeId: string }) => + ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Read", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. + * @description Get cargo summary by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query + */ + export const canUseGetCargoSummary = (object?: { officeId: string }) => + ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Read", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. + * @description Get cargo item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query + */ + export const canUseGetCargoById = (object?: { officeId: string }) => + ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Read", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. + * @description Update cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation + */ + export const canUseUpdateCargo = (object?: { officeId: string }) => + ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Update", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation + */ + export const canUseDeleteCargo = (object?: { officeId: string }) => + ["Delete", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Delete", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation + */ + export const canUseCreateBulkCargos = (object?: { officeId: string }) => + ["Create", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Create", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation + */ + export const canUseDuplicateCargo = (object?: { officeId: string }) => + ["Duplicate", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Duplicate", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; +} diff --git a/test/generated/base/quoteCargo/quoteCargo.api.ts b/test/generated/base/quoteCargo/quoteCargo.api.ts new file mode 100644 index 0000000..ad1b5ae --- /dev/null +++ b/test/generated/base/quoteCargo/quoteCargo.api.ts @@ -0,0 +1,116 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteCargoModels } from "./quoteCargo.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoApi { + export const listCargosByQuoteId = ( + officeId: string, + quoteId: string, + limit: number, + order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos`, + { + ...config, + params: { + order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { + type: "query", + name: "order", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const listCargoLabels = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, + config, + ); + }; + + export const getCargoSummary = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, + config, + ); + }; + + export const getCargoById = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + config, + ); + }; + + export const updateCargo = ( + officeId: string, + quoteId: string, + cargoId: string, + data: CommonModels.UpdatePositionCargoDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), + config, + ); + }; + + export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + undefined, + config, + ); + }; + + export const createBulkCargos = ( + numberOfCargos: number, + officeId: string, + quoteId: string, + data: CommonModels.CreatePositionCargoDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config, + ); + }; + + export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/quoteCargo/quoteCargo.configs.ts b/test/generated/base/quoteCargo/quoteCargo.configs.ts new file mode 100644 index 0000000..a00a304 --- /dev/null +++ b/test/generated/base/quoteCargo/quoteCargo.configs.ts @@ -0,0 +1,99 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoQueries } from "./quoteCargo.queries"; +import { QuoteCargoAcl } from "./quoteCargo.acl"; + +export namespace QuoteCargoConfigs { + export const cargosConfig = { + meta: { + title: "Cargos", + }, + readAll: { + acl: QuoteCargoAcl.canUseListCargosByQuoteId, + schema: CommonModels.PositionCargoResponseDTOSchema, + paginated: QuoteCargoQueries.useListCargosByQuoteId, + infinite: QuoteCargoQueries.useListCargosByQuoteIdInfinite, + columns: dynamicColumns({ + schema: CommonModels.PositionCargoResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + quoteId: true, + rootFolderId: true, + cargoType: true, + autoCalculateTotals: true, + autoCalculateRates: true, + autoCalculateVgm: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + rateOptions: true, + rateClass: true, + textForCustoms: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + ratePerKg: true, + totalRate: true, + tare: true, + vgm: true, + hsCodeLabels: true, + note: true, + packages: true, + createdAt: true, + updatedAt: true, + completeWeight: true, + packageTotals: true, + }, + }, + }), + }, + read: { + acl: QuoteCargoAcl.canUseGetCargoById, + schema: CommonModels.PositionCargoResponseDTOSchema, + query: QuoteCargoQueries.useGetCargoById, + }, + update: { + acl: QuoteCargoAcl.canUseUpdateCargo, + schema: CommonModels.UpdatePositionCargoDTOSchema, + mutation: QuoteCargoQueries.useUpdateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.UpdatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, + }), + }, + delete: { + acl: QuoteCargoAcl.canUseDeleteCargo, + mutation: QuoteCargoQueries.useDeleteCargo, + }, + }; +} diff --git a/test/generated/base/quoteCargo/quoteCargo.models.ts b/test/generated/base/quoteCargo/quoteCargo.models.ts new file mode 100644 index 0000000..8549bbb --- /dev/null +++ b/test/generated/base/quoteCargo/quoteCargo.models.ts @@ -0,0 +1,55 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoModels { + /** + * ListCargosByQuoteIdOrderParamSchema + * @type { array } + * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + */ + export const ListCargosByQuoteIdOrderParamSchema = z + .array(CommonModels.PositionCargoPaginationOrderFieldSchema) + .readonly() + .describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt") + .nullish(); + export type ListCargosByQuoteIdOrderParam = z.infer; + + /** + * ListCargosByQuoteIdResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.PositionCargoResponseDTO[] } items + */ + export const ListCargosByQuoteIdResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ListCargosByQuoteIdResponse = z.infer; + + /** + * QuoteCargoListCargoLabelsResponseSchema + * @type { array } + */ + export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type QuoteCargoListCargoLabelsResponse = z.infer; + + /** + * QuoteCargoGetCargoSummaryResponseSchema + * @type { array } + */ + export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); + export type QuoteCargoGetCargoSummaryResponse = z.infer; + + /** + * QuoteCargoCreateBulkCargosResponseSchema + * @type { array } + */ + export const QuoteCargoCreateBulkCargosResponseSchema = z + .array(CommonModels.PositionCargoResponseDTOSchema) + .readonly(); + export type QuoteCargoCreateBulkCargosResponse = z.infer; +} diff --git a/test/generated/base/quoteCargo/quoteCargo.queries.ts b/test/generated/base/quoteCargo/quoteCargo.queries.ts new file mode 100644 index 0000000..4b8d52a --- /dev/null +++ b/test/generated/base/quoteCargo/quoteCargo.queries.ts @@ -0,0 +1,380 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteCargoAcl } from "./quoteCargo.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteCargoModels } from "./quoteCargo.models"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoApi } from "./quoteCargo.api"; + +export namespace QuoteCargoQueries { + export const moduleName = QueryModule.QuoteCargo; + + export const keys = { + all: [moduleName] as const, + listCargosByQuoteId: ( + officeId: string, + quoteId: string, + limit?: number, + order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/cargos", + officeId, + quoteId, + limit, + order, + page, + cursor, + ] as const, + listCargosByQuoteIdInfinite: ( + officeId: string, + quoteId: string, + limit?: number, + order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/cargos", + "infinite", + officeId, + quoteId, + limit, + order, + cursor, + ] as const, + listCargoLabels: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/labels", officeId, quoteId] as const, + getCargoSummary: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/summary", officeId, quoteId] as const, + getCargoById: (officeId: string, quoteId: string, cargoId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/:cargoId", officeId, quoteId, cargoId] as const, + }; + + /** + * Query `useListCargosByQuoteId` + * @summary List all cargo items for a quote + * @permission Requires `canUseListCargosByQuoteId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargosByQuoteId = ( + { + officeId, + quoteId, + limit, + order, + page, + cursor, + }: { + officeId: string; + quoteId: string; + limit: number; + order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId })); + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListCargosByQuoteIdInfinite + * @summary List all cargo items for a quote + * @permission Requires `canUseListCargosByQuoteId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargosByQuoteIdInfinite = ( + { + officeId, + quoteId, + limit, + order, + cursor, + }: { + officeId: string; + quoteId: string; + limit: number; + order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId })); + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useListCargoLabels` + * @summary List all cargo labels for a quote + * @permission Requires `canUseListCargoLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargoLabels = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargoLabels(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId })); + return QuoteCargoApi.listCargoLabels(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Query `useGetCargoSummary` + * @summary Get cargo summary grouped by transport unit type + * @permission Requires `canUseGetCargoSummary` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCargoSummary = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoSummary(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId })); + return QuoteCargoApi.getCargoSummary(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Query `useGetCargoById` + * @summary Get a specific cargo item + * @permission Requires `canUseGetCargoById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { string } object.cargoId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCargoById = ( + { officeId, quoteId, cargoId }: { officeId: string; quoteId: string; cargoId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoById(officeId, quoteId, cargoId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId })); + return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCargo` + * @summary Update a cargo item + * @permission Requires `canUseUpdateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCargo = ( + options?: AppMutationOptions< + typeof QuoteCargoApi.updateCargo, + { officeId: string; quoteId: string; cargoId: string; data: CommonModels.UpdatePositionCargoDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, data }) => { + checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId })); + return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteCargo` + * @summary Delete a cargo item + * @permission Requires `canUseDeleteCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteCargo = ( + options?: AppMutationOptions< + typeof QuoteCargoApi.deleteCargo, + { officeId: string; quoteId: string; cargoId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId }) => { + checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId })); + return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreateBulkCargos` + * @summary Create a new cargo item + * @permission Requires `canUseCreateBulkCargos` ability + * @param { number } mutation.numberOfCargos Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateBulkCargos = ( + options?: AppMutationOptions< + typeof QuoteCargoApi.createBulkCargos, + { numberOfCargos: number; officeId: string; quoteId: string; data: CommonModels.CreatePositionCargoDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { + checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId })); + return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicateCargo` + * @summary Duplicate a cargo item + * @permission Requires `canUseDuplicateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicateCargo = ( + options?: AppMutationOptions< + typeof QuoteCargoApi.duplicateCargo, + { officeId: string; quoteId: string; cargoId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId }) => { + checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId })); + return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts b/test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts new file mode 100644 index 0000000..d129f69 --- /dev/null +++ b/test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteCargoPackageAcl { + /** + * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. + * @description Create cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation + */ + export const canUseCreatePackage = (object?: { officeId: string }) => + ["Create", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Create", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. + * @description Update cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation + */ + export const canUseUpdatePackage = (object?: { officeId: string }) => + ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Update", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation + */ + export const canUseDeletePackage = (object?: { officeId: string }) => + ["Delete", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Delete", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation + */ + export const canUseDuplicatePackage = (object?: { officeId: string }) => + ["Duplicate", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Duplicate", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. + * @description Move cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation + */ + export const canUseMovePackage = (object?: { officeId: string }) => + ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Update", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; +} diff --git a/test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts b/test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts new file mode 100644 index 0000000..8e9191a --- /dev/null +++ b/test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts @@ -0,0 +1,84 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoPackageApi { + export const createPackage = ( + officeId: string, + quoteId: string, + cargoId: string, + data: CommonModels.CreatePositionCargoPackageDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, + ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), + config, + ); + }; + + export const updatePackage = ( + officeId: string, + quoteId: string, + cargoId: string, + packageId: string, + data: CommonModels.UpdatePositionCargoPackageDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), + config, + ); + }; + + export const deletePackage = ( + officeId: string, + quoteId: string, + cargoId: string, + packageId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, + undefined, + config, + ); + }; + + export const duplicatePackage = ( + officeId: string, + quoteId: string, + cargoId: string, + packageId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, + undefined, + config, + ); + }; + + export const movePackage = ( + officeId: string, + quoteId: string, + cargoId: string, + packageId: string, + data: CommonModels.MovePositionCargoPackageRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, + ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts b/test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts new file mode 100644 index 0000000..38cf1ca --- /dev/null +++ b/test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts @@ -0,0 +1,207 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteCargoPackageAcl } from "./quoteCargoPackage.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoPackageApi } from "./quoteCargoPackage.api"; + +export namespace QuoteCargoPackageQueries { + export const moduleName = QueryModule.QuoteCargoPackage; + + /** + * Mutation `useCreatePackage` + * @summary Create a new package for a cargo + * @permission Requires `canUseCreatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreatePackage = ( + options?: AppMutationOptions< + typeof QuoteCargoPackageApi.createPackage, + { officeId: string; quoteId: string; cargoId: string; data: CommonModels.CreatePositionCargoPackageDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId })); + return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdatePackage` + * @summary Update a package + * @permission Requires `canUseUpdatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdatePackage = ( + options?: AppMutationOptions< + typeof QuoteCargoPackageApi.updatePackage, + { + officeId: string; + quoteId: string; + cargoId: string; + packageId: string; + data: CommonModels.UpdatePositionCargoPackageDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId })); + return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeletePackage` + * @summary Delete a package + * @permission Requires `canUseDeletePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeletePackage = ( + options?: AppMutationOptions< + typeof QuoteCargoPackageApi.deletePackage, + { officeId: string; quoteId: string; cargoId: string; packageId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { + checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId })); + return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicatePackage` + * @summary Duplicate a package + * @permission Requires `canUseDuplicatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicatePackage = ( + options?: AppMutationOptions< + typeof QuoteCargoPackageApi.duplicatePackage, + { officeId: string; quoteId: string; cargoId: string; packageId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { + checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId })); + return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMovePackage` + * @summary Move a package to a different cargo + * @permission Requires `canUseMovePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useMovePackage = ( + options?: AppMutationOptions< + typeof QuoteCargoPackageApi.movePackage, + { + officeId: string; + quoteId: string; + cargoId: string; + packageId: string; + data: CommonModels.MovePositionCargoPackageRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId })); + return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/quoteConversion/quoteConversion.acl.ts b/test/generated/base/quoteConversion/quoteConversion.acl.ts new file mode 100644 index 0000000..3c9b7f1 --- /dev/null +++ b/test/generated/base/quoteConversion/quoteConversion.acl.ts @@ -0,0 +1,15 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteConversionAcl { + /** + * Use for `useConvertQuoteToPosition` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useConvertQuoteToPosition` mutation + */ + export const canUseConvertQuoteToPosition = (object?: { officeId: string }) => + ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Create", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/base/quoteConversion/quoteConversion.api.ts b/test/generated/base/quoteConversion/quoteConversion.api.ts new file mode 100644 index 0000000..7bc1111 --- /dev/null +++ b/test/generated/base/quoteConversion/quoteConversion.api.ts @@ -0,0 +1,21 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteConversionModels } from "./quoteConversion.models"; + +export namespace QuoteConversionApi { + export const convertQuoteToPosition = ( + officeId: string, + quoteId: string, + data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/convert`, + ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/quoteConversion/quoteConversion.models.ts b/test/generated/base/quoteConversion/quoteConversion.models.ts new file mode 100644 index 0000000..9eab729 --- /dev/null +++ b/test/generated/base/quoteConversion/quoteConversion.models.ts @@ -0,0 +1,13 @@ +import { z } from "zod"; + +export namespace QuoteConversionModels { + /** + * ConvertQuoteToPositionRequestDtoSchema + * @type { object } + * @property { string } estimatedServiceDate + */ + export const ConvertQuoteToPositionRequestDtoSchema = z + .object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }) + .readonly(); + export type ConvertQuoteToPositionRequestDto = z.infer; +} diff --git a/test/generated/base/quoteConversion/quoteConversion.queries.ts b/test/generated/base/quoteConversion/quoteConversion.queries.ts new file mode 100644 index 0000000..3695789 --- /dev/null +++ b/test/generated/base/quoteConversion/quoteConversion.queries.ts @@ -0,0 +1,48 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteConversionAcl } from "./quoteConversion.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteConversionModels } from "./quoteConversion.models"; +import { QuoteConversionApi } from "./quoteConversion.api"; + +export namespace QuoteConversionQueries { + export const moduleName = QueryModule.QuoteConversion; + + /** + * Mutation `useConvertQuoteToPosition` + * @summary Convert quote to position + * @permission Requires `canUseConvertQuoteToPosition` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteConversionModels.ConvertQuoteToPositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Quote converted to position successfully + * @statusCodes [201, 400, 401, 404] + */ + export const useConvertQuoteToPosition = ( + options?: AppMutationOptions< + typeof QuoteConversionApi.convertQuoteToPosition, + { officeId: string; quoteId: string; data: QuoteConversionModels.ConvertQuoteToPositionRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId })); + return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/quoteDocument/quoteDocument.acl.ts b/test/generated/base/quoteDocument/quoteDocument.acl.ts new file mode 100644 index 0000000..bb144a6 --- /dev/null +++ b/test/generated/base/quoteDocument/quoteDocument.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteDocumentAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useGetPreview` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` mutation + */ + export const canUseGetPreview = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ + export const canUseGenerate = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useGenerateEml` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateEml` mutation + */ + export const canUseGenerateEml = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/base/quoteDocument/quoteDocument.api.ts b/test/generated/base/quoteDocument/quoteDocument.api.ts new file mode 100644 index 0000000..7544692 --- /dev/null +++ b/test/generated/base/quoteDocument/quoteDocument.api.ts @@ -0,0 +1,85 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteDocumentModels } from "./quoteDocument.models"; + +export namespace QuoteDocumentApi { + export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/document`, + config, + ); + }; + + export const update = ( + officeId: string, + quoteId: string, + data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/document`, + ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), + config, + ); + }; + + export const getPreview = ( + officeId: string, + quoteId: string, + data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/${quoteId}/document/preview`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generate = ( + officeId: string, + quoteId: string, + data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/document/generate`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), + config, + ); + }; + + export const generateEml = ( + officeId: string, + quoteId: string, + data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/${quoteId}/document/eml`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/base/quoteDocument/quoteDocument.models.ts b/test/generated/base/quoteDocument/quoteDocument.models.ts new file mode 100644 index 0000000..ea237e2 --- /dev/null +++ b/test/generated/base/quoteDocument/quoteDocument.models.ts @@ -0,0 +1,198 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteDocumentModels { + /** + * QuoteDocumentDataDtoSchema + * @type { object } + * @property { CommonModels.RouteTableBlockResponseDto } routeTable + * @property { CommonModels.CargoTableBlockDto } cargoTable + * @property { CommonModels.FinanceTableBlockDto } financeTable + */ + export const QuoteDocumentDataDtoSchema = z + .object({ + routeTable: CommonModels.RouteTableBlockResponseDtoSchema, + cargoTable: CommonModels.CargoTableBlockDtoSchema, + financeTable: CommonModels.FinanceTableBlockDtoSchema, + }) + .readonly(); + export type QuoteDocumentDataDto = z.infer; + + /** + * QuoteDocumentConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl + * @property { string } headerImageUrl + * @property { string } termsAndConditionsImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ + export const QuoteDocumentConfigDtoSchema = z + .object({ + footerImageUrl: z.string().nullish(), + headerImageUrl: z.string().nullish(), + termsAndConditionsImageUrl: z.string().nullish(), + showWatermarkOnDocuments: z.boolean(), + locale: CommonModels.LocaleEnumSchema.nullish(), + }) + .readonly(); + export type QuoteDocumentConfigDto = z.infer; + + /** + * CustomerDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + */ + export const CustomerDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); + export type CustomerDto = z.infer; + + /** + * ContactDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } phone + * @property { string } date + * @property { string } validFrom + * @property { string } validUntil + */ + export const ContactDtoSchema = z + .object({ + name: z.string(), + email: z.string(), + phone: z.string(), + date: z.iso.datetime({ offset: true }), + validFrom: z.iso.datetime({ offset: true }).nullish(), + validUntil: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type ContactDto = z.infer; + + /** + * QuoteDocumentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } quoteId + * @property { string } quoteNumber + * @property { CommonModels.TransportModeEnum } quoteTransportMode Mode of transport + * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote + * @property { string } transitDurationInDays Transit duration in days + * @property { CustomerDto } customer + * @property { ContactDto } contact + * @property { QuoteDocumentDataDto } data + * @property { boolean } suspendCargoTable + * @property { boolean } suspendFinanceTable + * @property { CommonModels.EditorContentResponseDto } bodyRemarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks + * @property { boolean } isIssued + * @property { number } version + * @property { QuoteDocumentConfigDto } config + * @property { string } issuedAt + */ + export const QuoteDocumentResponseDtoSchema = z + .object({ + id: z.string(), + quoteId: z.string(), + quoteNumber: z.string(), + quoteTransportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), + frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), + transitDurationInDays: z.string().describe("Transit duration in days").nullish(), + customer: CustomerDtoSchema, + contact: ContactDtoSchema, + data: QuoteDocumentDataDtoSchema.nullish(), + suspendCargoTable: z.boolean(), + suspendFinanceTable: z.boolean(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), + isIssued: z.boolean(), + version: z.number(), + config: QuoteDocumentConfigDtoSchema.nullish(), + issuedAt: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type QuoteDocumentResponseDto = z.infer; + + /** + * QuoteDocumentDataUpdateDtoSchema + * @type { object } + * @property { CommonModels.RouteTableUpdateBlockDto } routeTable + * @property { CommonModels.CargoTableBlockUpdateDto } cargoTable + * @property { CommonModels.FinanceTableBlockUpdateDto } financeTable + */ + export const QuoteDocumentDataUpdateDtoSchema = z + .object({ + routeTable: CommonModels.RouteTableUpdateBlockDtoSchema, + cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema, + financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema, + }) + .readonly(); + export type QuoteDocumentDataUpdateDto = z.infer; + + /** + * CustomerUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + */ + export const CustomerUpdateDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); + export type CustomerUpdateDto = z.infer; + + /** + * ContactUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } phone + * @property { string } date + */ + export const ContactUpdateDtoSchema = z + .object({ name: z.string(), email: z.email(), phone: z.string(), date: z.iso.datetime({ offset: true }) }) + .readonly(); + export type ContactUpdateDto = z.infer; + + /** + * UpdateQuoteDocumentRequestDtoSchema + * @type { object } + * @property { CustomerUpdateDto } customer + * @property { ContactUpdateDto } contact + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks + * @property { boolean } suspendCargoTable + * @property { boolean } suspendFinanceTable + * @property { QuoteDocumentDataUpdateDto } data + */ + export const UpdateQuoteDocumentRequestDtoSchema = z + .object({ + customer: CustomerUpdateDtoSchema, + contact: ContactUpdateDtoSchema, + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema, + footerRemarks: CommonModels.EditorContentUpdateDtoSchema, + suspendCargoTable: z.boolean(), + suspendFinanceTable: z.boolean(), + data: QuoteDocumentDataUpdateDtoSchema, + }) + .readonly(); + export type UpdateQuoteDocumentRequestDto = z.infer; + + /** + * GenerateQuoteDocumentPreviewRequestDtoSchema + * @type { object } + * @property { string } issuedAt + */ + export const GenerateQuoteDocumentPreviewRequestDtoSchema = z + .object({ issuedAt: z.iso.datetime({ offset: true }) }) + .readonly(); + export type GenerateQuoteDocumentPreviewRequestDto = z.infer; + + /** + * GenerateQuoteDocumentRequestDtoSchema + * @type { object } + * @property { string } issuedAt + * @property { string } fileName + */ + export const GenerateQuoteDocumentRequestDtoSchema = z + .object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }) + .readonly(); + export type GenerateQuoteDocumentRequestDto = z.infer; +} diff --git a/test/generated/base/quoteDocument/quoteDocument.queries.ts b/test/generated/base/quoteDocument/quoteDocument.queries.ts new file mode 100644 index 0000000..394be8c --- /dev/null +++ b/test/generated/base/quoteDocument/quoteDocument.queries.ts @@ -0,0 +1,186 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteDocumentAcl } from "./quoteDocument.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteDocumentModels } from "./quoteDocument.models"; +import { QuoteDocumentApi } from "./quoteDocument.api"; + +export namespace QuoteDocumentQueries { + export const moduleName = QueryModule.QuoteDocument; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/document", officeId, quoteId] as const, + }; + + /** + * Query `useGet` + * @summary Get quote document + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteDocumentAcl.canUseGet({ officeId })); + return QuoteDocumentApi.get(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update quote document + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.UpdateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof QuoteDocumentApi.update, + { officeId: string; quoteId: string; data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId })); + return QuoteDocumentApi.update(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGetPreview` - recommended when file should not be cached + * @summary Get quote document pdf preview + * @permission Requires `canUseGetPreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useGetPreview = ( + options?: AppMutationOptions< + typeof QuoteDocumentApi.getPreview, + { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId })); + return QuoteDocumentApi.getPreview(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerate` + * @summary Get quote document pdf preview + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerate = ( + options?: AppMutationOptions< + typeof QuoteDocumentApi.generate, + { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId })); + return QuoteDocumentApi.generate(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateEml` - recommended when file should not be cached + * @summary Generate quote document and return EML file + * @permission Requires `canUseGenerateEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGenerateEml = ( + options?: AppMutationOptions< + typeof QuoteDocumentApi.generateEml, + { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId })); + return QuoteDocumentApi.generateEml(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts new file mode 100644 index 0000000..e68b397 --- /dev/null +++ b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts @@ -0,0 +1,29 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteProfitChangeTrackingAcl { + /** + * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. + * @description List quote profit change groups + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.quoteId quoteId from quoteId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query + */ + export const canUseFindProfitChangeGroups = (object?: { officeId: string; quoteId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) + >; + + /** + * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. + * @description Get quote profit change group details + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.quoteId quoteId from quoteId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query + */ + export const canUseFindProfitChangeGroupDetail = (object?: { officeId: string; quoteId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) + >; +} diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts new file mode 100644 index 0000000..876a0b2 --- /dev/null +++ b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts @@ -0,0 +1,51 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; + +export namespace QuoteProfitChangeTrackingApi { + export const findProfitChangeGroups = ( + officeId: string, + quoteId: string, + limit: number, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findProfitChangeGroupDetail = ( + groupId: string, + officeId: string, + quoteId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, + config, + ); + }; +} diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts new file mode 100644 index 0000000..269b961 --- /dev/null +++ b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts @@ -0,0 +1,35 @@ +import { dynamicColumns } from "@povio/ui"; +import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; +import { QuoteProfitChangeTrackingQueries } from "./quoteProfitChangeTracking.queries"; +import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; + +export namespace QuoteProfitChangeTrackingConfigs { + export const profitChangeGroupsConfig = { + meta: { + title: "Profit Change Groups", + }, + readAll: { + acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups, + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, + paginated: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroups, + infinite: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, + columns: dynamicColumns({ + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, + options: { + columns: { + id: true, + timestamp: true, + users: true, + profit: true, + changeCount: true, + }, + }, + }), + }, + read: { + acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema, + query: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, + }, + }; +} diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts new file mode 100644 index 0000000..4b453b4 --- /dev/null +++ b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts @@ -0,0 +1,84 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteProfitChangeTrackingModels { + /** + * QuoteAccountProfitChangeGroupDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto[] } users + * @property { object } profit + * @property { number } profit.amount + * @property { string } profit.currencyCode + * @property { number } changeCount + */ + export const QuoteAccountProfitChangeGroupDtoSchema = z + .object({ + id: z.string(), + timestamp: z.iso.datetime({ offset: true }), + users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), + profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), + changeCount: z.number(), + }) + .readonly(); + export type QuoteAccountProfitChangeGroupDto = z.infer; + + /** + * QuoteAccountProfitChangeEntryDtoSchema + * @type { object } + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto } user + * @property { number } changeNumber + * @property { number } oldProfit + * @property { number } newProfit + * @property { string } currencyCode + */ + export const QuoteAccountProfitChangeEntryDtoSchema = z + .object({ + timestamp: z.iso.datetime({ offset: true }), + user: CommonModels.UserPreviewDtoSchema, + changeNumber: z.number(), + oldProfit: z.number(), + newProfit: z.number(), + currencyCode: z.string(), + }) + .readonly(); + export type QuoteAccountProfitChangeEntryDto = z.infer; + + /** + * QuoteAccountProfitChangeGroupDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { string } currencyCode + * @property { QuoteAccountProfitChangeEntryDto[] } entries + */ + export const QuoteAccountProfitChangeGroupDetailDtoSchema = z + .object({ + id: z.string(), + timestamp: z.iso.datetime({ offset: true }), + currencyCode: z.string(), + entries: z.array(QuoteAccountProfitChangeEntryDtoSchema).readonly(), + }) + .readonly(); + export type QuoteAccountProfitChangeGroupDetailDto = z.infer; + + /** + * QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { QuoteAccountProfitChangeGroupDto[] } items + */ + export const QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(QuoteAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape, + }); + export type QuoteProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer< + typeof QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema + >; +} diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts new file mode 100644 index 0000000..d39ed96 --- /dev/null +++ b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts @@ -0,0 +1,142 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { QuoteProfitChangeTrackingApi } from "./quoteProfitChangeTracking.api"; + +export namespace QuoteProfitChangeTrackingQueries { + export const moduleName = QueryModule.QuoteProfitChangeTracking; + + export const keys = { + all: [moduleName] as const, + findProfitChangeGroups: (officeId: string, quoteId: string, limit?: number, page?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", + officeId, + quoteId, + limit, + page, + cursor, + ] as const, + findProfitChangeGroupsInfinite: (officeId: string, quoteId: string, limit?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", + "infinite", + officeId, + quoteId, + limit, + cursor, + ] as const, + findProfitChangeGroupDetail: (groupId: string, officeId: string, quoteId: string) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/account/profit-change-groups/:groupId", + groupId, + officeId, + quoteId, + ] as const, + }; + + /** + * Query `useFindProfitChangeGroups` + * @summary List quote profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroups = ( + { + officeId, + quoteId, + limit, + page, + cursor, + }: { officeId: string; quoteId: string; limit: number; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), + queryFn: () => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId })); + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindProfitChangeGroupsInfinite + * @summary List quote profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroupsInfinite = ( + { officeId, quoteId, limit, cursor }: { officeId: string; quoteId: string; limit: number; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId })); + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindProfitChangeGroupDetail` + * @summary Get quote profit change group details + * @permission Requires `canUseFindProfitChangeGroupDetail` ability + * @param { string } object.groupId Path parameter + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroupDetail = ( + { groupId, officeId, quoteId }: { groupId: string; officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), + queryFn: () => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId })); + return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/quoteRoutes/quoteRoutes.acl.ts b/test/generated/base/quoteRoutes/quoteRoutes.acl.ts new file mode 100644 index 0000000..ee5334d --- /dev/null +++ b/test/generated/base/quoteRoutes/quoteRoutes.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteRoutesAcl { + /** + * Use for `useListRoutes` query ability. For global ability, omit the object parameter. + * @description List quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query + */ + export const canUseListRoutes = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Create quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation + */ + export const canUseCreateRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Update quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation + */ + export const canUseUpdateRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Delete quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation + */ + export const canUseDeleteRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. + * @description Split quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation + */ + export const canUseSplitRoutes = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. + * @description Merge quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation + */ + export const canUseMergeRoutes = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. + * @description Copy quote route points + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation + */ + export const canUseCopyRoute = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/base/quoteRoutes/quoteRoutes.api.ts b/test/generated/base/quoteRoutes/quoteRoutes.api.ts new file mode 100644 index 0000000..6a6b65e --- /dev/null +++ b/test/generated/base/quoteRoutes/quoteRoutes.api.ts @@ -0,0 +1,99 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteRoutesApi { + export const listRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.RouteListResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes`, + config, + ); + }; + + export const createRoutePoint = ( + officeId: string, + quoteId: string, + routeId: string, + data: CommonModels.CreateRoutePointRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, + ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), + config, + ); + }; + + export const updateRoutePoint = ( + officeId: string, + quoteId: string, + routeId: string, + pointId: string, + data: CommonModels.UpdateRoutePointRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, + ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), + config, + ); + }; + + export const deleteRoutePoint = ( + officeId: string, + quoteId: string, + routeId: string, + pointId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, + undefined, + config, + ); + }; + + export const splitRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/split`, + undefined, + config, + ); + }; + + export const mergeRoutes = ( + officeId: string, + quoteId: string, + data: CommonModels.MergeRoutesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/merge`, + ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), + config, + ); + }; + + export const copyRoute = ( + officeId: string, + quoteId: string, + routeId: string, + data: CommonModels.CopyRouteRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, + ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/quoteRoutes/quoteRoutes.queries.ts b/test/generated/base/quoteRoutes/quoteRoutes.queries.ts new file mode 100644 index 0000000..5269238 --- /dev/null +++ b/test/generated/base/quoteRoutes/quoteRoutes.queries.ts @@ -0,0 +1,263 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteRoutesAcl } from "./quoteRoutes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteRoutesApi } from "./quoteRoutes.api"; + +export namespace QuoteRoutesQueries { + export const moduleName = QueryModule.QuoteRoutes; + + export const keys = { + all: [moduleName] as const, + listRoutes: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/routes", officeId, quoteId] as const, + }; + + /** + * Query `useListRoutes` + * @summary List routes with points for a quote + * @permission Requires `canUseListRoutes` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListRoutes = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoutes(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId })); + return QuoteRoutesApi.listRoutes(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateRoutePoint` + * @summary Create a route point for a quote route + * @permission Requires `canUseCreateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateRoutePoint = ( + options?: AppMutationOptions< + typeof QuoteRoutesApi.createRoutePoint, + { officeId: string; quoteId: string; routeId: string; data: CommonModels.CreateRoutePointRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, data }) => { + checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId })); + return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateRoutePoint` + * @summary Update a route point for a quote route + * @permission Requires `canUseUpdateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateRoutePoint = ( + options?: AppMutationOptions< + typeof QuoteRoutesApi.updateRoutePoint, + { + officeId: string; + quoteId: string; + routeId: string; + pointId: string; + data: CommonModels.UpdateRoutePointRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { + checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId })); + return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteRoutePoint` + * @summary Delete a route point from a quote route + * @permission Requires `canUseDeleteRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteRoutePoint = ( + options?: AppMutationOptions< + typeof QuoteRoutesApi.deleteRoutePoint, + { officeId: string; quoteId: string; routeId: string; pointId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, pointId }) => { + checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId })); + return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useSplitRoutes` + * @summary Split quote routes by cargo (sea only) + * @permission Requires `canUseSplitRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useSplitRoutes = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId }) => { + checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId })); + return QuoteRoutesApi.splitRoutes(officeId, quoteId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMergeRoutes` + * @summary Merge quote cargo routes into single route (sea only) + * @permission Requires `canUseMergeRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useMergeRoutes = ( + options?: AppMutationOptions< + typeof QuoteRoutesApi.mergeRoutes, + { officeId: string; quoteId: string; data: CommonModels.MergeRoutesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId })); + return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCopyRoute` + * @summary Copy route points from one route to another (sea only) + * @permission Requires `canUseCopyRoute` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useCopyRoute = ( + options?: AppMutationOptions< + typeof QuoteRoutesApi.copyRoute, + { officeId: string; quoteId: string; routeId: string; data: CommonModels.CopyRouteRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, data }) => { + checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId })); + return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/quotes/quotes.acl.ts b/test/generated/base/quotes/quotes.acl.ts new file mode 100644 index 0000000..c9ec7f0 --- /dev/null +++ b/test/generated/base/quotes/quotes.acl.ts @@ -0,0 +1,147 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuotesAcl { + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Create", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ + export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useExportQuotes` mutation ability. For global ability, omit the object parameter. + * @description Export quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportQuotes` mutation + */ + export const canUseExportQuotes = (object?: { officeId: string }) => + ["Export", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Export", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Get quote by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ + export const canUseGetById = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ + export const canUseCancel = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Duplicate quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ + export const canUseDuplicate = (object?: { officeId: string }) => + ["Create", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Create", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useGetInvolvedParties` query ability. For global ability, omit the object parameter. + * @description Get involved parties for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvolvedParties` query + */ + export const canUseGetInvolvedParties = (object?: { officeId: string }) => + ["ReadInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "ReadInvolvedParties", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCreateInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Create involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateInvolvedParty` mutation + */ + export const canUseCreateInvolvedParty = (object?: { officeId: string }) => + ["CreateInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "CreateInvolvedParties", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdateInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Update involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateInvolvedParty` mutation + */ + export const canUseUpdateInvolvedParty = (object?: { officeId: string }) => + ["UpdateInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "UpdateInvolvedParties", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useDeleteInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Delete involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvolvedParty` mutation + */ + export const canUseDeleteInvolvedParty = (object?: { officeId: string }) => + ["DeleteInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "DeleteInvolvedParties", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/base/quotes/quotes.api.ts b/test/generated/base/quotes/quotes.api.ts new file mode 100644 index 0000000..97c0391 --- /dev/null +++ b/test/generated/base/quotes/quotes.api.ts @@ -0,0 +1,193 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuotesModels } from "./quotes.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuotesApi { + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: QuotesModels.QuoteFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: QuotesModels.QuotesPaginateResponseSchema }, `/offices/${officeId}/quotes`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes`, + ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), + config, + ); + }; + + export const listAvailablePartnersFor = ( + officeId: string, + quoteId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { + type: "query", + name: "useCase", + }), + }, + }, + ); + }; + + export const exportQuotes = ( + officeId: string, + data: QuotesModels.QuoteExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/exports`, + ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const getById = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}`, + config, + ); + }; + + export const update = ( + officeId: string, + quoteId: string, + data: QuotesModels.UpdateQuoteRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}`, + ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), + config, + ); + }; + + export const cancel = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cancel`, + undefined, + config, + ); + }; + + export const duplicate = ( + officeId: string, + quoteId: string, + data: QuotesModels.DuplicateQuoteRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/duplicate`, + ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), + config, + ); + }; + + export const getInvolvedParties = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties`, + config, + ); + }; + + export const createInvolvedParty = ( + officeId: string, + quoteId: string, + data: CommonModels.CreateInvolvedPartyRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties`, + ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), + config, + ); + }; + + export const updateInvolvedParty = ( + officeId: string, + quoteId: string, + partyId: string, + data: CommonModels.UpdateInvolvedPartyDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, + ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), + config, + ); + }; + + export const deleteInvolvedParty = ( + officeId: string, + quoteId: string, + partyId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/quotes/quotes.configs.ts b/test/generated/base/quotes/quotes.configs.ts new file mode 100644 index 0000000..fa74aae --- /dev/null +++ b/test/generated/base/quotes/quotes.configs.ts @@ -0,0 +1,136 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { QuotesModels } from "./quotes.models"; +import { QuotesQueries } from "./quotes.queries"; +import { QuotesAcl } from "./quotes.acl"; + +export namespace QuotesConfigs { + export const quotesConfig = { + meta: { + title: "Quotes", + }, + readAll: { + acl: QuotesAcl.canUsePaginate, + schema: QuotesModels.QuotePreviewResponseDTOSchema, + paginated: QuotesQueries.usePaginate, + infinite: QuotesQueries.usePaginateInfinite, + filters: { + schema: QuotesModels.QuoteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: QuotesModels.QuoteFilterDtoSchema, + options: { + inputs: { + statusDate: true, + transportMode: true, + status: true, + direction: true, + loadType: true, + serviceType: true, + carrierId: true, + consigneeId: true, + employee: true, + routing: true, + number: true, + createdAt: true, + vesselCarrier: true, + searchQuery: true, + customer: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: QuotesModels.QuotePreviewResponseDTOSchema, + options: { + columns: { + id: true, + transportMode: true, + statusDate: true, + createdAt: true, + number: true, + status: true, + direction: true, + loadType: true, + customer: true, + customerReference: true, + consignee: true, + consigneeReference: true, + carrier: true, + carrierReference: true, + employee: true, + origin: true, + destination: true, + portOfLoading: true, + dischargePort: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + equipment: true, + serviceType: true, + currency: true, + profit: true, + margin: true, + numberOfConvertedPositions: true, + departureDate: true, + arrivalDate: true, + routing: true, + }, + sortable: QuotesModels.QuotesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: QuotesAcl.canUseGetById, + schema: QuotesModels.QuoteCoreResponseDTOSchema, + query: QuotesQueries.useGetById, + }, + create: { + acl: QuotesAcl.canUseCreate, + schema: QuotesModels.CreateQuoteRequestDTOSchema, + mutation: QuotesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: QuotesModels.CreateQuoteRequestDTOSchema, + options: { + inputs: { + section: true, + direction: true, + transportMode: true, + loadType: true, + serviceType: true, + customerBusinessPartnerId: true, + }, + }, + }), + }, + update: { + acl: QuotesAcl.canUseUpdate, + schema: QuotesModels.UpdateQuoteRequestDTOSchema, + mutation: QuotesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: QuotesModels.UpdateQuoteRequestDTOSchema, + options: { + inputs: { + number: true, + statusDate: true, + cargoType: true, + loadType: true, + incoterms: true, + secondIncoterms: true, + serviceType: true, + buyRateReference: true, + frequency: true, + transitDurationInDays: true, + quoteType: true, + defaultCurrencyId: true, + salesRepId: true, + responsibleEmployeeId: true, + receivedByEmployeeId: true, + team: true, + volumetricWeightModifier: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/base/quotes/quotes.models.ts b/test/generated/base/quotes/quotes.models.ts new file mode 100644 index 0000000..0411bf7 --- /dev/null +++ b/test/generated/base/quotes/quotes.models.ts @@ -0,0 +1,339 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuotesModels { +/** + * QuoteStatusEnumSchema + * @type { enum } + */ +export const QuoteStatusEnumSchema = z.enum(["Pending", "Cancelled", "Converted"]); +export type QuoteStatusEnum = z.infer; +export const QuoteStatusEnum = QuoteStatusEnumSchema.enum; + +/** + * QuoteCustomerResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { string } phone The phone number of the customer + * @property { string } email The email of the customer + */ +export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().describe("The phone number of the customer").nullish(), email: z.string().describe("The email of the customer").nullish() }).readonly(); +export type QuoteCustomerResponseDto = z.infer; + + +/** + * QuoteNamedReferenceResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the entity + * @property { string } name Name of the entity + * @property { string } matchCode + * @property { string } label Display label (name or match code depending on office settings) + */ +export const QuoteNamedReferenceResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the entity").nullable(), name: z.string().describe("Name of the entity").nullable(), matchCode: z.string().nullable(), label: z.string().describe("Display label (name or match code depending on office settings)").nullable() }).readonly(); +export type QuoteNamedReferenceResponseDto = z.infer; + + +/** + * QuotePreviewResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the quote + * @property { CommonModels.TransportModeEnum } transportMode Transport mode + * @property { string } statusDate The date of the quote status + * @property { string } createdAt The date when the quote was created + * @property { string } number The quote number + * @property { QuoteStatusEnum } status Status of the quote + * @property { CommonModels.DirectionEnum } direction Direction of the quote + * @property { CommonModels.LoadTypeEnum } loadType Load type + * @property { QuoteCustomerResponseDto } customer The customer information + * @property { string } customerReference Customer reference number + * @property { QuoteNamedReferenceResponseDto } consignee Consignee information + * @property { string } consigneeReference Consignee reference number + * @property { QuoteNamedReferenceResponseDto } carrier The carrier + * @property { string } carrierReference Carrier reference number + * @property { QuoteNamedReferenceResponseDto } employee Responsible employee + * @property { QuoteNamedReferenceResponseDto } origin Origin location + * @property { QuoteNamedReferenceResponseDto } destination Destination location + * @property { QuoteNamedReferenceResponseDto } portOfLoading Port of loading + * @property { QuoteNamedReferenceResponseDto } dischargePort Discharge port + * @property { string } bookingNumber Booking reference number + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } vesselCarrier Carrier name from route point (sea positions only) + * @property { string } equipment Equipment summary (e.g., "2x20DC, 1x40HC") + * @property { CommonModels.ServiceTypeEnum } serviceType Service type + * @property { string } currency Currency code + * @property { number } profit Total profit + * @property { number } margin Profit margin percentage + * @property { number } numberOfConvertedPositions Number of positions converted from this quote + * @property { string } departureDate Departure date + * @property { string } arrivalDate Arrival date + * @property { CommonModels.SeaRoutingEnum } routing Sea routing type + */ +export const QuotePreviewResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status").nullable(), createdAt: z.iso.datetime({ offset: true }).describe("The date when the quote was created"), number: z.string().describe("The quote number"), status: QuoteStatusEnumSchema.describe("Status of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type").nullish(), customer: QuoteCustomerResponseDtoSchema.describe("The customer information"), customerReference: z.string().describe("Customer reference number").nullish(), consignee: QuoteNamedReferenceResponseDtoSchema.describe("Consignee information").nullish(), consigneeReference: z.string().describe("Consignee reference number").nullish(), carrier: QuoteNamedReferenceResponseDtoSchema.describe("The carrier").nullish(), carrierReference: z.string().describe("Carrier reference number").nullish(), employee: QuoteNamedReferenceResponseDtoSchema.describe("Responsible employee").nullish(), origin: QuoteNamedReferenceResponseDtoSchema.describe("Origin location"), destination: QuoteNamedReferenceResponseDtoSchema.describe("Destination location"), portOfLoading: QuoteNamedReferenceResponseDtoSchema.describe("Port of loading").nullish(), dischargePort: QuoteNamedReferenceResponseDtoSchema.describe("Discharge port").nullish(), bookingNumber: z.string().describe("Booking reference number").nullish(), vessel: z.string().describe("Vessel name").nullish(), voyage: z.string().describe("Voyage number").nullish(), vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), equipment: z.string().describe("Equipment summary (e.g., "2x20DC, 1x40HC")").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.describe("Service type").nullish(), currency: z.string().describe("Currency code").nullish(), profit: z.number().describe("Total profit").nullish(), margin: z.number().describe("Profit margin percentage").nullish(), numberOfConvertedPositions: z.number().describe("Number of positions converted from this quote"), departureDate: z.iso.datetime({ offset: true }).describe("Departure date").nullish(), arrivalDate: z.iso.datetime({ offset: true }).describe("Arrival date").nullish(), routing: CommonModels.SeaRoutingEnumSchema.describe("Sea routing type").nullish() }).readonly(); +export type QuotePreviewResponseDTO = z.infer; + + +/** + * QuoteFilterDtoSchema + * @type { object } + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.TransportModeEnum } transportMode + * @property { QuoteStatusEnum[] } status + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } carrierId Filter quotes by carrier IDs + * @property { string[] } consigneeId Filter quotes by consignee IDs + * @property { string[] } employee Filter quotes by employee IDs + * @property { CommonModels.SeaRoutingEnum } routing + * @property { string } number Filter quotes by quote number + * @property { CommonModels.DateRangeDto } createdAt + * @property { string } vesselCarrier Filter quotes by carrier name from route point + * @property { string } searchQuery + * @property { string[] } customer + */ +export const QuoteFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, carrierId: z.array(z.string()).readonly().describe("Filter quotes by carrier IDs"), consigneeId: z.array(z.string()).readonly().describe("Filter quotes by consignee IDs"), employee: z.array(z.string()).readonly().describe("Filter quotes by employee IDs"), routing: CommonModels.SeaRoutingEnumSchema, number: z.string().describe("Filter quotes by quote number"), createdAt: CommonModels.DateRangeDtoSchema, vesselCarrier: z.string().describe("Filter quotes by carrier name from route point"), searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); +export type QuoteFilterDto = z.infer; + + +/** + * QuoteExportFilterDtoSchema + * @type { object } + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.TransportModeEnum } transportMode + * @property { QuoteStatusEnum[] } status + * @property { CommonModels.DirectionEnum } direction + * @property { string } searchQuery + * @property { string[] } customer + */ +export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); +export type QuoteExportFilterDto = z.infer; + + +/** + * QuoteExportColumnSchema + * @type { enum } + */ +export const QuoteExportColumnSchema = z.enum(["id", "transportMode", "statusDate", "createdAt", "number", "status", "direction", "loadType", "serviceType", "customerId", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeId", "consigneeName", "consigneeReference", "carrierId", "carrierName", "carrierReference", "responsibleEmployeeName", "originLocationId", "originLocationName", "destinationLocationId", "destinationLocationName", "portOfLoadingId", "portOfLoadingName", "dischargePortId", "dischargePortName", "bookingNumber", "vessel", "voyage", "equipment", "departureDate", "arrivalDate", "routing", "currency", "profit", "margin"]); +export type QuoteExportColumn = z.infer; +export const QuoteExportColumn = QuoteExportColumnSchema.enum; + +/** + * QuoteExportRequestDtoSchema + * @type { object } + * @property { QuoteExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { QuoteExportFilterDto } filter + */ +export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: QuoteExportFilterDtoSchema }).readonly(); +export type QuoteExportRequestDto = z.infer; + + +/** + * CreateQuoteRequestDTOSchema + * @type { object } + * @property { CommonModels.SectionEnum } section The section of the quote + * @property { CommonModels.DirectionEnum } direction The direction of the quote + * @property { CommonModels.TransportModeEnum } transportMode The mode of transport for the quote + * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote + * @property { CommonModels.ServiceTypeEnum } serviceType The service type for the quote + * @property { string } customerBusinessPartnerId The ID of the business partner that is the customer + */ +export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema.describe("The section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("The direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("The mode of transport for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The service type for the quote"), customerBusinessPartnerId: z.string().describe("The ID of the business partner that is the customer") }).readonly(); +export type CreateQuoteRequestDTO = z.infer; + + +/** + * QuoteCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type QuoteCustomerDto = z.infer; + + +/** + * QuoteEmployeeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the employee + * @property { string } name Name of the employee + */ +export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the employee"), name: z.string().describe("Name of the employee") }).readonly(); +export type QuoteEmployeeResponseDTO = z.infer; + + +/** + * CargoTypeEnumSchema + * @type { enum } + */ +export const CargoTypeEnumSchema = z.enum(["Trailer", "Container", "BreakBulk", "Roro", "Project"]); +export type CargoTypeEnum = z.infer; +export const CargoTypeEnum = CargoTypeEnumSchema.enum; + +/** + * QuoteTypeEnumSchema + * @type { enum } + */ +export const QuoteTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); +export type QuoteTypeEnum = z.infer; +export const QuoteTypeEnum = QuoteTypeEnumSchema.enum; + +/** + * QuoteConvertedPositionDtoSchema + * @type { object } + * @property { string } positionId + * @property { string } positionNumber + */ +export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }).readonly(); +export type QuoteConvertedPositionDto = z.infer; + + +/** + * QuoteCoreResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the quote + * @property { string } rootFolderId Root folder identifier bound to this quote + * @property { QuoteCustomerDto } customer + * @property { QuoteStatusEnum } status Current status of the quote + * @property { string } responsibleEmployeeId Unique identifier of the responsible employee + * @property { string } receivedByEmployeeId Unique identifier of the employee receiving the quote + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } salesRepId Unique identifier of the sales rep + * @property { QuoteEmployeeResponseDTO } responsibleEmployee The responsible employee + * @property { QuoteEmployeeResponseDTO } receivedByEmployee The employee who received the quote + * @property { string } owningOfficeId ID of the office owning the quote + * @property { string } name Name of the quote + * @property { string } number Quote number + * @property { CommonModels.SectionEnum } section Section of the quote + * @property { CommonModels.DirectionEnum } direction Direction of the quote + * @property { CommonModels.TransportModeEnum } transportMode Mode of transport + * @property { string } statusDate Date of the quote status + * @property { CargoTypeEnum } cargoType Type of cargo + * @property { CommonModels.IncotermsEnum } incoterms Incoterms for the quote + * @property { CommonModels.IncotermsEnum } secondIncoterms Second incoterms for the quote + * @property { string } buyRateReference Reference for buy rate + * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote + * @property { string } transitDurationInDays Transit duration in days + * @property { QuoteTypeEnum } quoteType Type of quote + * @property { string } defaultCurrencyId Default currency + * @property { QuoteEmployeeResponseDTO } salesRep The sales rep for the quote + * @property { string } team Team + * @property { string } createdAt + * @property { string } updatedAt + * @property { QuoteConvertedPositionDto[] } convertedPositions Positions converted from this quote. Default: `` + * @property { CommonModels.LoadTypeEnum } loadType Load type of quote + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const QuoteCoreResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), rootFolderId: z.string().describe("Root folder identifier bound to this quote").nullish(), customer: QuoteCustomerDtoSchema.nullish(), status: QuoteStatusEnumSchema.describe("Current status of the quote"), responsibleEmployeeId: z.string().describe("Unique identifier of the responsible employee").nullish(), receivedByEmployeeId: z.string().describe("Unique identifier of the employee receiving the quote").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesRepId: z.string().describe("Unique identifier of the sales rep").nullish(), responsibleEmployee: QuoteEmployeeResponseDTOSchema.describe("The responsible employee").nullish(), receivedByEmployee: QuoteEmployeeResponseDTOSchema.describe("The employee who received the quote").nullish(), owningOfficeId: z.string().describe("ID of the office owning the quote"), name: z.string().describe("Name of the quote"), number: z.string().describe("Quote number"), section: CommonModels.SectionEnumSchema.describe("Section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), statusDate: z.iso.datetime({ offset: true }).describe("Date of the quote status"), cargoType: CargoTypeEnumSchema.describe("Type of cargo").nullish(), incoterms: CommonModels.IncotermsEnumSchema.describe("Incoterms for the quote").nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("Second incoterms for the quote").nullish(), buyRateReference: z.string().describe("Reference for buy rate").nullish(), frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), transitDurationInDays: z.string().describe("Transit duration in days").nullish(), quoteType: QuoteTypeEnumSchema.describe("Type of quote").nullish(), defaultCurrencyId: z.string().describe("Default currency").nullish(), salesRep: QuoteEmployeeResponseDTOSchema.describe("The sales rep for the quote").nullish(), team: z.string().describe("Team").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), convertedPositions: z.array(QuoteConvertedPositionDtoSchema).readonly().describe("Positions converted from this quote").default([]), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type of quote").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); +export type QuoteCoreResponseDTO = z.infer; + + +/** + * UpdateQuoteRequestDTOSchema + * @type { object } + * @property { string } number The quote number + * @property { string } statusDate The date of the quote status + * @property { CargoTypeEnum } cargoType The type of cargo for the quote + * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote + * @property { CommonModels.IncotermsEnum } incoterms The incoterms for the quote + * @property { CommonModels.IncotermsEnum } secondIncoterms The second incoterms for the quote + * @property { CommonModels.ServiceTypeEnum } serviceType The type of service for the quote + * @property { string } buyRateReference The reference for the buy rate + * @property { CommonModels.FrequencyEnum } frequency The frequency of the quote + * @property { string } transitDurationInDays The transit duration in days + * @property { QuoteTypeEnum } quoteType The type of quote + * @property { string } defaultCurrencyId The default currency for the quote + * @property { string } salesRepId The sales representative for the quote + * @property { string } responsibleEmployeeId The responsible employee for the quote + * @property { string } receivedByEmployeeId The employee who receieved the quote + * @property { string } team The team responsible for the quote + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().describe("The quote number"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status"), cargoType: CargoTypeEnumSchema.describe("The type of cargo for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), incoterms: CommonModels.IncotermsEnumSchema.describe("The incoterms for the quote"), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("The second incoterms for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The type of service for the quote"), buyRateReference: z.string().describe("The reference for the buy rate"), frequency: CommonModels.FrequencyEnumSchema.describe("The frequency of the quote"), transitDurationInDays: z.string().describe("The transit duration in days").nullable(), quoteType: QuoteTypeEnumSchema.describe("The type of quote"), defaultCurrencyId: z.string().describe("The default currency for the quote"), salesRepId: z.string().describe("The sales representative for the quote"), responsibleEmployeeId: z.string().describe("The responsible employee for the quote"), receivedByEmployeeId: z.string().describe("The employee who receieved the quote"), team: z.string().describe("The team responsible for the quote"), volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); +export type UpdateQuoteRequestDTO = z.infer; + + +/** + * QuoteSectionEnumSchema + * @type { enum } + */ +export const QuoteSectionEnumSchema = z.enum(["Customer", "Overview", "Cargo", "Finances", "Documents"]); +export type QuoteSectionEnum = z.infer; +export const QuoteSectionEnum = QuoteSectionEnumSchema.enum; + +/** + * DuplicateQuoteRequestDtoSchema + * @type { object } + * @property { QuoteSectionEnum[] } sections The sections to duplicate. Min Items: `1` + */ +export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).readonly().min(1).describe("The sections to duplicate") }).readonly(); +export type DuplicateQuoteRequestDto = z.infer; + + +/** + * QuoteListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalProfit + * @property { number } profitPerQuote + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const QuoteListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalProfit: z.number(), profitPerQuote: z.number(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type QuoteListResponseDto = z.infer; + + +/** + * QuotesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const QuotesPaginateOrderParamEnumSchema = z.enum(["number", "statusDate", "transportMode", "status", "direction", "loadType", "serviceType", "createdAt", "employee", "profit"]); +export type QuotesPaginateOrderParamEnum = z.infer; +export const QuotesPaginateOrderParamEnum = QuotesPaginateOrderParamEnumSchema.enum; + +/** + * QuotesPaginateResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerQuote + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { QuotePreviewResponseDTO[] } items + */ +export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).readonly() }).readonly().shape }); +export type QuotesPaginateResponse = z.infer; + + +/** + * QuotesListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ +export const QuotesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type QuotesListAvailablePartnersForResponse = z.infer; + + +/** + * GetInvolvedPartiesResponseSchema + * @type { array } + */ +export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); +export type GetInvolvedPartiesResponse = z.infer; + + +} diff --git a/test/generated/base/quotes/quotes.queries.ts b/test/generated/base/quotes/quotes.queries.ts new file mode 100644 index 0000000..42c7089 --- /dev/null +++ b/test/generated/base/quotes/quotes.queries.ts @@ -0,0 +1,507 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuotesAcl } from "./quotes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuotesModels } from "./quotes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { QuotesApi } from "./quotes.api"; + +export namespace QuotesQueries { + export const moduleName = QueryModule.Quotes; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: QuotesModels.QuoteFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/quotes", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: QuotesModels.QuoteFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/quotes", "infinite", officeId, limit, order, filter, cursor] as const, + listAvailablePartnersFor: ( + officeId: string, + quoteId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + ) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/available-partners", + officeId, + quoteId, + search, + useCase, + ] as const, + getById: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId", officeId, quoteId] as const, + getInvolvedParties: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/involved-parties", officeId, quoteId] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Quotes + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` + * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: QuotesModels.QuoteFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(QuotesAcl.canUsePaginate({ officeId })); + return QuotesApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Quotes + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` + * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { officeId: string; limit: number; order?: string; filter?: QuotesModels.QuoteFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuotesAcl.canUsePaginate({ officeId })); + return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create Quote + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { QuotesModels.CreateQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof QuotesApi.create, + { officeId: string; data: QuotesModels.CreateQuoteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(QuotesAcl.canUseCreate({ officeId })); + return QuotesApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for a quote + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListAvailablePartnersFor = ( + { + officeId, + quoteId, + search, + useCase, + }: { officeId: string; quoteId: string; search?: string; useCase?: CommonModels.PositionAvailablePartnersUseCase }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), + queryFn: () => { + checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId })); + return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase, config); + }, + ...options, + }); + }; + + /** + * Mutation `useExportQuotes` - recommended when file should not be cached + * @summary Export quotes to Excel + * @permission Requires `canUseExportQuotes` ability + * @param { string } mutation.officeId Path parameter + * @param { QuotesModels.QuoteExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportQuotes = ( + options?: AppMutationOptions< + typeof QuotesApi.exportQuotes, + { officeId: string; data: QuotesModels.QuoteExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(QuotesAcl.canUseExportQuotes({ officeId })); + return QuotesApi.exportQuotes(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetById` + * @summary Get quote by id + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetById = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, quoteId), + queryFn: () => { + checkAcl(QuotesAcl.canUseGetById({ officeId })); + return QuotesApi.getById(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuotesModels.UpdateQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof QuotesApi.update, + { officeId: string; quoteId: string; data: QuotesModels.UpdateQuoteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseUpdate({ officeId })); + return QuotesApi.update(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCancel` + * @summary Cancel quote + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useCancel = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId }) => { + checkAcl(QuotesAcl.canUseCancel({ officeId })); + return QuotesApi.cancel(officeId, quoteId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicate` + * @summary Duplicate quote + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuotesModels.DuplicateQuoteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicate = ( + options?: AppMutationOptions< + typeof QuotesApi.duplicate, + { officeId: string; quoteId: string; data: QuotesModels.DuplicateQuoteRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseDuplicate({ officeId })); + return QuotesApi.duplicate(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetInvolvedParties` + * @summary Get involved parties for quote + * @permission Requires `canUseGetInvolvedParties` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetInvolvedParties = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvolvedParties(officeId, quoteId), + queryFn: () => { + checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId })); + return QuotesApi.getInvolvedParties(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateInvolvedParty` + * @summary Create involved party for quote + * @permission Requires `canUseCreateInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateInvolvedParty = ( + options?: AppMutationOptions< + typeof QuotesApi.createInvolvedParty, + { officeId: string; quoteId: string; data: CommonModels.CreateInvolvedPartyRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId })); + return QuotesApi.createInvolvedParty(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateInvolvedParty` + * @summary Update involved party for quote + * @permission Requires `canUseUpdateInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateInvolvedParty = ( + options?: AppMutationOptions< + typeof QuotesApi.updateInvolvedParty, + { officeId: string; quoteId: string; partyId: string; data: CommonModels.UpdateInvolvedPartyDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, partyId, data }) => { + checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId })); + return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteInvolvedParty` + * @summary Delete involved party for quote + * @permission Requires `canUseDeleteInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteInvolvedParty = ( + options?: AppMutationOptions< + typeof QuotesApi.deleteInvolvedParty, + { officeId: string; quoteId: string; partyId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, partyId }) => { + checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId })); + return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/remarkTemplates/remarkTemplates.acl.ts b/test/generated/base/remarkTemplates/remarkTemplates.acl.ts new file mode 100644 index 0000000..d7492ee --- /dev/null +++ b/test/generated/base/remarkTemplates/remarkTemplates.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace RemarkTemplatesAcl { + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List remark template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Read", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List remark templates + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Read", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Create", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get remark template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Read", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update remark template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Update", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Archive", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Unarchive", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Unarchive", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; +} diff --git a/test/generated/base/remarkTemplates/remarkTemplates.api.ts b/test/generated/base/remarkTemplates/remarkTemplates.api.ts new file mode 100644 index 0000000..93d8bc3 --- /dev/null +++ b/test/generated/base/remarkTemplates/remarkTemplates.api.ts @@ -0,0 +1,142 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; + +export namespace RemarkTemplatesApi { + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/remark-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const list = ( + officeId: string, + limit: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, + `/offices/${officeId}/remark-templates`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const create = ( + officeId: string, + data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates`, + ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), + config, + ); + }; + + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}`, + config, + ); + }; + + export const update = ( + id: string, + officeId: string, + data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}`, + ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/remarkTemplates/remarkTemplates.configs.ts b/test/generated/base/remarkTemplates/remarkTemplates.configs.ts new file mode 100644 index 0000000..d004179 --- /dev/null +++ b/test/generated/base/remarkTemplates/remarkTemplates.configs.ts @@ -0,0 +1,122 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; +import { RemarkTemplatesQueries } from "./remarkTemplates.queries"; +import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; + +export namespace RemarkTemplatesConfigs { + export const remarkTemplatesConfig = { + meta: { + title: "Remark Templates", + }, + readAll: { + acl: RemarkTemplatesAcl.canUseList, + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + paginated: RemarkTemplatesQueries.useList, + infinite: RemarkTemplatesQueries.useListInfinite, + filters: { + schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + onlyUsedFor: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + content: true, + onlyUsedFor: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: RemarkTemplatesAcl.canUseFindById, + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + query: RemarkTemplatesQueries.useFindById, + }, + create: { + acl: RemarkTemplatesAcl.canUseCreate, + schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, + mutation: RemarkTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + content: true, + onlyUsedFor: true, + }, + }, + }), + }, + update: { + acl: RemarkTemplatesAcl.canUseUpdate, + schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, + mutation: RemarkTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + content: true, + onlyUsedFor: true, + archived: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: RemarkTemplatesAcl.canUsePaginateLabels, + schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, + paginated: RemarkTemplatesQueries.usePaginateLabels, + infinite: RemarkTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + content: true, + }, + sortable: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/remarkTemplates/remarkTemplates.models.ts b/test/generated/base/remarkTemplates/remarkTemplates.models.ts new file mode 100644 index 0000000..21a682a --- /dev/null +++ b/test/generated/base/remarkTemplates/remarkTemplates.models.ts @@ -0,0 +1,221 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace RemarkTemplatesModels { + /** + * RemarkTemplateLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { CommonModels.EditorContentResponseDto } content Remark template content + */ + export const RemarkTemplateLabelResponseDTOSchema = z + .object({ + id: z.string(), + label: z.string(), + content: CommonModels.EditorContentResponseDtoSchema.describe("Remark template content"), + }) + .readonly(); + export type RemarkTemplateLabelResponseDTO = z.infer; + + /** + * RemarkTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const RemarkTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type RemarkTemplateEmployeeDTO = z.infer; + + /** + * OnlyUsedForEnumSchema + * @type { enum } + */ + export const OnlyUsedForEnumSchema = z.enum([ + "transport-order", + "export-declaration", + "house-bl", + "master-bl", + "house-awb", + "master-awb", + "bl-instructions", + "ams-instructions", + "cmr-form", + "fcr-form", + "isf-form", + "templated-document", + "invoice", + "quote-document", + "shipping-instructions", + "position-office-notes", + "invoice-body-remarks", + "business-partner-office-notes", + ]); + export type OnlyUsedForEnum = z.infer; + export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; + + /** + * RemarkTemplateResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name Template name + * @property { CommonModels.EditorContentResponseDto } content Template content + * @property { string[] } onlyUsedFor Restrict template usage to specific document types + * @property { boolean } archived + * @property { string } createdById + * @property { RemarkTemplateEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { RemarkTemplateEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const RemarkTemplateResponseDTOSchema = z + .object({ + id: z.string(), + officeId: z.string(), + name: z.string().describe("Template name"), + content: CommonModels.EditorContentResponseDtoSchema.describe("Template content"), + onlyUsedFor: z + .array(OnlyUsedForEnumSchema) + .readonly() + .describe("Restrict template usage to specific document types") + .nullish(), + archived: z.boolean(), + createdById: z.string().nullish(), + createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type RemarkTemplateResponseDTO = z.infer; + + /** + * CreateRemarkTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { CommonModels.EditorContentUpdateDto } content Template content + * @property { OnlyUsedForEnum[] } onlyUsedFor Restrict template usage to specific document types + */ + export const CreateRemarkTemplateRequestDTOSchema = z + .object({ + name: z.string().describe("Template name"), + content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), + onlyUsedFor: z + .array(OnlyUsedForEnumSchema) + .readonly() + .describe("Restrict template usage to specific document types") + .nullish(), + }) + .readonly(); + export type CreateRemarkTemplateRequestDTO = z.infer; + + /** + * UpdateRemarkTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { CommonModels.EditorContentUpdateDto } content Template content + * @property { string[] } onlyUsedFor Restrict template usage to specific document types + * @property { boolean } archived Archive status + */ + export const UpdateRemarkTemplateRequestDTOSchema = z + .object({ + name: z.string().describe("Template name"), + content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), + onlyUsedFor: z + .array(OnlyUsedForEnumSchema) + .readonly() + .describe("Restrict template usage to specific document types"), + archived: z.boolean().describe("Archive status"), + }) + .readonly(); + export type UpdateRemarkTemplateRequestDTO = z.infer; + + /** + * RemarkTemplateFilterDtoSchema + * @type { object } + * @property { boolean } archived + * @property { string } search + * @property { string } onlyUsedFor Filter by document type + */ + export const RemarkTemplateFilterDtoSchema = z + .object({ + archived: z.boolean(), + search: z.string(), + onlyUsedFor: OnlyUsedForEnumSchema.describe("Filter by document type"), + }) + .readonly(); + export type RemarkTemplateFilterDto = z.infer; + + /** + * RemarkTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const RemarkTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type RemarkTemplateLabelFilterDto = z.infer; + + /** + * RemarkTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const RemarkTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type RemarkTemplatesPaginateLabelsOrderParamEnum = z.infer< + typeof RemarkTemplatesPaginateLabelsOrderParamEnumSchema + >; + export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * RemarkTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { RemarkTemplateLabelResponseDTO[] } items + */ + export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type RemarkTemplatesPaginateLabelsResponse = z.infer; + + /** + * RemarkTemplatesListOrderParamEnumSchema + * @type { enum } + */ + export const RemarkTemplatesListOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type RemarkTemplatesListOrderParamEnum = z.infer; + export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEnumSchema.enum; + + /** + * RemarkTemplatesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { RemarkTemplateResponseDTO[] } items + */ + export const RemarkTemplatesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).readonly() }).readonly().shape, + }); + export type RemarkTemplatesListResponse = z.infer; +} diff --git a/test/generated/base/remarkTemplates/remarkTemplates.queries.ts b/test/generated/base/remarkTemplates/remarkTemplates.queries.ts new file mode 100644 index 0000000..e169038 --- /dev/null +++ b/test/generated/base/remarkTemplates/remarkTemplates.queries.ts @@ -0,0 +1,420 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; +import { RemarkTemplatesApi } from "./remarkTemplates.api"; + +export namespace RemarkTemplatesQueries { + export const moduleName = QueryModule.RemarkTemplates; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/remark-templates/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/remark-templates/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + list: ( + officeId: string, + limit?: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/remark-templates", officeId, limit, order, filter, page, cursor] as const, + listInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/remark-templates", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/remark-templates/:id", id, officeId] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate remark template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId })); + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate remark template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId })); + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useList` + * @summary List remark templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: RemarkTemplatesModels.RemarkTemplateFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUseList({ officeId })); + return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List remark templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: RemarkTemplatesModels.RemarkTemplateFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(RemarkTemplatesAcl.canUseList({ officeId })); + return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new remark template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof RemarkTemplatesApi.create, + { officeId: string; data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId })); + return RemarkTemplatesApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get remark template by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId })); + return RemarkTemplatesApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update remark template by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof RemarkTemplatesApi.update, + { id: string; officeId: string; data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId })); + return RemarkTemplatesApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive remark template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId })); + return RemarkTemplatesApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive remark template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId })); + return RemarkTemplatesApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/roadQuotes/roadQuotes.acl.ts b/test/generated/base/roadQuotes/roadQuotes.acl.ts new file mode 100644 index 0000000..599c783 --- /dev/null +++ b/test/generated/base/roadQuotes/roadQuotes.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace RoadQuotesAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get road quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update road quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/base/roadQuotes/roadQuotes.api.ts b/test/generated/base/roadQuotes/roadQuotes.api.ts new file mode 100644 index 0000000..8c1ddbe --- /dev/null +++ b/test/generated/base/roadQuotes/roadQuotes.api.ts @@ -0,0 +1,28 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { RoadQuotesModels } from "./roadQuotes.models"; + +export namespace RoadQuotesApi { + export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/road-quote`, + config, + ); + }; + + export const update = ( + officeId: string, + quoteId: string, + data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/road-quote`, + ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/roadQuotes/roadQuotes.models.ts b/test/generated/base/roadQuotes/roadQuotes.models.ts new file mode 100644 index 0000000..f50ac2e --- /dev/null +++ b/test/generated/base/roadQuotes/roadQuotes.models.ts @@ -0,0 +1,45 @@ +import { z } from "zod"; + +export namespace RoadQuotesModels { + /** + * RoadQuoteResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the road quote + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + */ + export const RoadQuoteResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier for the road quote"), + bookingMatchingCode: z.string().describe("Code for matching bookings"), + validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), + validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), + buyServiceContract: z.string().describe("Service contract for buying"), + sellServiceContract: z.string().describe("Service contract for selling"), + }) + .readonly(); + export type RoadQuoteResponseDTO = z.infer; + + /** + * UpdateRoadQuoteRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + */ + export const UpdateRoadQuoteRequestDTOSchema = z + .object({ + bookingMatchingCode: z.string().describe("Code for matching bookings"), + validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), + validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), + buyServiceContract: z.string().describe("Service contract for buying"), + sellServiceContract: z.string().describe("Service contract for selling"), + }) + .readonly(); + export type UpdateRoadQuoteRequestDTO = z.infer; +} diff --git a/test/generated/base/roadQuotes/roadQuotes.queries.ts b/test/generated/base/roadQuotes/roadQuotes.queries.ts new file mode 100644 index 0000000..ddd3e83 --- /dev/null +++ b/test/generated/base/roadQuotes/roadQuotes.queries.ts @@ -0,0 +1,83 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { RoadQuotesAcl } from "./roadQuotes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { RoadQuotesModels } from "./roadQuotes.models"; +import { RoadQuotesApi } from "./roadQuotes.api"; + +export namespace RoadQuotesQueries { + export const moduleName = QueryModule.RoadQuotes; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/road-quote", officeId, quoteId] as const, + }; + + /** + * Query `useGet` + * @summary Get road quote by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(RoadQuotesAcl.canUseGet({ officeId })); + return RoadQuotesApi.get(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update road quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { RoadQuotesModels.UpdateRoadQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof RoadQuotesApi.update, + { officeId: string; quoteId: string; data: RoadQuotesModels.UpdateRoadQuoteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(RoadQuotesAcl.canUseUpdate({ officeId })); + return RoadQuotesApi.update(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.get(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/seaPositions/seaPositions.acl.ts b/test/generated/base/seaPositions/seaPositions.acl.ts new file mode 100644 index 0000000..7b8c6cb --- /dev/null +++ b/test/generated/base/seaPositions/seaPositions.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace SeaPositionsAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get sea position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update sea position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/base/seaPositions/seaPositions.api.ts b/test/generated/base/seaPositions/seaPositions.api.ts new file mode 100644 index 0000000..ffdb6e9 --- /dev/null +++ b/test/generated/base/seaPositions/seaPositions.api.ts @@ -0,0 +1,28 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { SeaPositionsModels } from "./seaPositions.models"; + +export namespace SeaPositionsApi { + export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/sea-position`, + config, + ); + }; + + export const update = ( + officeId: string, + positionId: string, + data: SeaPositionsModels.UpdateSeaPositionRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/sea-position`, + ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/seaPositions/seaPositions.models.ts b/test/generated/base/seaPositions/seaPositions.models.ts new file mode 100644 index 0000000..738a8c5 --- /dev/null +++ b/test/generated/base/seaPositions/seaPositions.models.ts @@ -0,0 +1,87 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace SeaPositionsModels { + /** + * SeaPositionResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } bookingMatchingCode + * @property { string } houseBillOfLadingNumber + * @property { string } masterBillOfLadingNumber + * @property { boolean } hblRequired + * @property { boolean } mblRequired + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { string } buyServiceContract + * @property { string } sellServiceContract + * @property { string } quoteReference + * @property { string } createdAt + * @property { string } updatedAt + * @property { CommonModels.SeaRoutingEnum } routing + * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route + */ + export const SeaPositionResponseDTOSchema = z + .object({ + id: z.string(), + bookingMatchingCode: z.string().nullish(), + houseBillOfLadingNumber: z.string().nullish(), + masterBillOfLadingNumber: z.string().nullish(), + hblRequired: z.boolean(), + mblRequired: z.boolean(), + blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), + blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), + customsDate: z.iso.datetime({ offset: true }).nullish(), + vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), + buyServiceContract: z.string().nullish(), + sellServiceContract: z.string().nullish(), + quoteReference: z.string().nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + routing: CommonModels.SeaRoutingEnumSchema.nullish(), + defaultBookingNumber: z + .string() + .describe("Default booking number from the port of loading point of the default route") + .nullish(), + }) + .readonly(); + export type SeaPositionResponseDTO = z.infer; + + /** + * UpdateSeaPositionRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode + * @property { string } houseBillOfLadingNumber + * @property { boolean } mblRequired + * @property { boolean } hblRequired + * @property { string } masterBillOfLadingNumber + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { string } buyServiceContract + * @property { string } quoteReference + * @property { string } sellServiceContract + * @property { CommonModels.SeaRoutingEnum } routing + */ + export const UpdateSeaPositionRequestDTOSchema = z + .object({ + bookingMatchingCode: z.string(), + houseBillOfLadingNumber: z.string(), + mblRequired: z.boolean(), + hblRequired: z.boolean(), + masterBillOfLadingNumber: z.string(), + blfromCostumerDate: z.iso.datetime({ offset: true }), + blfromCarrierDate: z.iso.datetime({ offset: true }), + customsDate: z.iso.datetime({ offset: true }), + vgmCustomerDate: z.iso.datetime({ offset: true }), + buyServiceContract: z.string(), + quoteReference: z.string(), + sellServiceContract: z.string(), + routing: CommonModels.SeaRoutingEnumSchema, + }) + .readonly(); + export type UpdateSeaPositionRequestDTO = z.infer; +} diff --git a/test/generated/base/seaPositions/seaPositions.queries.ts b/test/generated/base/seaPositions/seaPositions.queries.ts new file mode 100644 index 0000000..f562c59 --- /dev/null +++ b/test/generated/base/seaPositions/seaPositions.queries.ts @@ -0,0 +1,83 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { SeaPositionsAcl } from "./seaPositions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { SeaPositionsModels } from "./seaPositions.models"; +import { SeaPositionsApi } from "./seaPositions.api"; + +export namespace SeaPositionsQueries { + export const moduleName = QueryModule.SeaPositions; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/sea-position", officeId, positionId] as const, + }; + + /** + * Query `useGet` + * @summary Get sea position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(SeaPositionsAcl.canUseGet({ officeId })); + return SeaPositionsApi.get(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update sea position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { SeaPositionsModels.UpdateSeaPositionRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof SeaPositionsApi.update, + { officeId: string; positionId: string; data: SeaPositionsModels.UpdateSeaPositionRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(SeaPositionsAcl.canUseUpdate({ officeId })); + return SeaPositionsApi.update(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/seaQuotes/seaQuotes.acl.ts b/test/generated/base/seaQuotes/seaQuotes.acl.ts new file mode 100644 index 0000000..4841eaf --- /dev/null +++ b/test/generated/base/seaQuotes/seaQuotes.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace SeaQuotesAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get sea quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update sea quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/base/seaQuotes/seaQuotes.api.ts b/test/generated/base/seaQuotes/seaQuotes.api.ts new file mode 100644 index 0000000..5c9df3d --- /dev/null +++ b/test/generated/base/seaQuotes/seaQuotes.api.ts @@ -0,0 +1,28 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { SeaQuotesModels } from "./seaQuotes.models"; + +export namespace SeaQuotesApi { + export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/sea-quote`, + config, + ); + }; + + export const update = ( + officeId: string, + quoteId: string, + data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/sea-quote`, + ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/seaQuotes/seaQuotes.models.ts b/test/generated/base/seaQuotes/seaQuotes.models.ts new file mode 100644 index 0000000..f5b1795 --- /dev/null +++ b/test/generated/base/seaQuotes/seaQuotes.models.ts @@ -0,0 +1,52 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace SeaQuotesModels { + /** + * SeaQuoteResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the sea quote + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + * @property { CommonModels.SeaRoutingEnum } routing + * @property { boolean } splitRoute Indicates if the route is split + */ + export const SeaQuoteResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier for the sea quote"), + bookingMatchingCode: z.string().describe("Code for matching bookings"), + validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), + validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), + buyServiceContract: z.string().describe("Service contract for buying"), + sellServiceContract: z.string().describe("Service contract for selling"), + routing: CommonModels.SeaRoutingEnumSchema.nullish(), + splitRoute: z.boolean().describe("Indicates if the route is split").nullish(), + }) + .readonly(); + export type SeaQuoteResponseDTO = z.infer; + + /** + * UpdateSeaQuoteRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + * @property { CommonModels.SeaRoutingEnum } routing + */ + export const UpdateSeaQuoteRequestDTOSchema = z + .object({ + bookingMatchingCode: z.string().describe("Code for matching bookings"), + validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), + validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), + buyServiceContract: z.string().describe("Service contract for buying"), + sellServiceContract: z.string().describe("Service contract for selling"), + routing: CommonModels.SeaRoutingEnumSchema, + }) + .readonly(); + export type UpdateSeaQuoteRequestDTO = z.infer; +} diff --git a/test/generated/base/seaQuotes/seaQuotes.queries.ts b/test/generated/base/seaQuotes/seaQuotes.queries.ts new file mode 100644 index 0000000..f147e95 --- /dev/null +++ b/test/generated/base/seaQuotes/seaQuotes.queries.ts @@ -0,0 +1,83 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { SeaQuotesAcl } from "./seaQuotes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { SeaQuotesModels } from "./seaQuotes.models"; +import { SeaQuotesApi } from "./seaQuotes.api"; + +export namespace SeaQuotesQueries { + export const moduleName = QueryModule.SeaQuotes; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/sea-quote", officeId, quoteId] as const, + }; + + /** + * Query `useGet` + * @summary Get sea quote by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(SeaQuotesAcl.canUseGet({ officeId })); + return SeaQuotesApi.get(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update sea quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { SeaQuotesModels.UpdateSeaQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof SeaQuotesApi.update, + { officeId: string; quoteId: string; data: SeaQuotesModels.UpdateSeaQuoteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(SeaQuotesAcl.canUseUpdate({ officeId })); + return SeaQuotesApi.update(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.get(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/shippingInstructions/shippingInstructions.acl.ts b/test/generated/base/shippingInstructions/shippingInstructions.acl.ts new file mode 100644 index 0000000..b0dc4c8 --- /dev/null +++ b/test/generated/base/shippingInstructions/shippingInstructions.acl.ts @@ -0,0 +1,93 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ShippingInstructionsAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Create", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Create", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useDeleteOfficesPositionsShippingInstructionsById` mutation ability. For global ability, omit the object parameter. + * @description Delete shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsShippingInstructionsById` mutation + */ + export const canUseDeleteOfficesPositionsShippingInstructionsById = (object?: { officeId: string }) => + [ + "Delete", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Delete", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `usePreview` query or `usePreviewMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreview` query or `usePreviewMutation` mutation + */ + export const canUsePreview = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ + export const canUseGenerate = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; +} diff --git a/test/generated/base/shippingInstructions/shippingInstructions.api.ts b/test/generated/base/shippingInstructions/shippingInstructions.api.ts new file mode 100644 index 0000000..6793650 --- /dev/null +++ b/test/generated/base/shippingInstructions/shippingInstructions.api.ts @@ -0,0 +1,84 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ShippingInstructionsModels } from "./shippingInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ShippingInstructionsApi { + export const create = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions`, + undefined, + config, + ); + }; + + export const get = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + config, + ); + }; + + export const update = ( + officeId: string, + positionId: string, + id: string, + data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), + config, + ); + }; + + export const deleteOfficesPositionsShippingInstructionsById = ( + officeId: string, + positionId: string, + id: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + undefined, + config, + ); + }; + + export const preview = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generate = ( + officeId: string, + positionId: string, + id: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/shippingInstructions/shippingInstructions.models.ts b/test/generated/base/shippingInstructions/shippingInstructions.models.ts new file mode 100644 index 0000000..50182eb --- /dev/null +++ b/test/generated/base/shippingInstructions/shippingInstructions.models.ts @@ -0,0 +1,847 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ShippingInstructionsModels { + /** + * EnsDeclarationEnumSchema + * @type { enum } + * @description ENS declaration + */ + export const EnsDeclarationEnumSchema = z.enum(["Carrier", "Self"]); + export type EnsDeclarationEnum = z.infer; + export const EnsDeclarationEnum = EnsDeclarationEnumSchema.enum; + + /** + * IssuedHouseBillsEnumSchema + * @type { enum } + * @description Issued house bills + */ + export const IssuedHouseBillsEnumSchema = z.enum(["None", "One", "Multiple"]); + export type IssuedHouseBillsEnum = z.infer; + export const IssuedHouseBillsEnum = IssuedHouseBillsEnumSchema.enum; + + /** + * WoodDeclarationEnumSchema + * @type { enum } + * @description Wood declaration + */ + export const WoodDeclarationEnumSchema = z.enum([ + "NoWood", + "TreatedAndCertified", + "NotTreatedAndNotCertified", + "Processed", + ]); + export type WoodDeclarationEnum = z.infer; + export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; + + /** + * ShippingInstructionsPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } addressLine1 + * @property { string } addressLine2 + * @property { string } city + * @property { string } postalCode + * @property { string } state + * @property { string } countryCode + * @property { string } contactName + * @property { string } contactPhone + * @property { string } contactEmail + */ + export const ShippingInstructionsPartnerResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + addressLine1: z.string(), + addressLine2: z.string(), + city: z.string(), + postalCode: z.string(), + state: z.string(), + countryCode: z.string(), + contactName: z.string(), + contactPhone: z.string(), + contactEmail: z.string(), + }) + .readonly(); + export type ShippingInstructionsPartnerResponseDto = z.infer; + + /** + * ShippingInstructionsGeneralDetailsDtoSchema + * @type { object } + * @property { ShippingInstructionsPartnerResponseDto } shipper + * @property { ShippingInstructionsPartnerResponseDto } consignee + * @property { ShippingInstructionsPartnerResponseDto } freightForwarder + * @property { ShippingInstructionsPartnerResponseDto } notifyParty + * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty1 + * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty2 + * @property { ShippingInstructionsPartnerResponseDto } contractParty + * @property { ShippingInstructionsPartnerResponseDto } manufacturer + * @property { ShippingInstructionsPartnerResponseDto } consolidator + * @property { ShippingInstructionsPartnerResponseDto } importer + * @property { ShippingInstructionsPartnerResponseDto } warehouseKeeper + */ + export const ShippingInstructionsGeneralDetailsDtoSchema = z + .object({ + shipper: ShippingInstructionsPartnerResponseDtoSchema, + consignee: ShippingInstructionsPartnerResponseDtoSchema, + freightForwarder: ShippingInstructionsPartnerResponseDtoSchema, + notifyParty: ShippingInstructionsPartnerResponseDtoSchema, + additionalNotifyParty1: ShippingInstructionsPartnerResponseDtoSchema, + additionalNotifyParty2: ShippingInstructionsPartnerResponseDtoSchema, + contractParty: ShippingInstructionsPartnerResponseDtoSchema, + manufacturer: ShippingInstructionsPartnerResponseDtoSchema, + consolidator: ShippingInstructionsPartnerResponseDtoSchema, + importer: ShippingInstructionsPartnerResponseDtoSchema, + warehouseKeeper: ShippingInstructionsPartnerResponseDtoSchema, + }) + .readonly(); + export type ShippingInstructionsGeneralDetailsDto = z.infer; + + /** + * ShippingInstructionsLocationResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } code + * @property { string } countryCode + * @property { string } eta + * @property { string } vessel + * @property { string } voyage + */ + export const ShippingInstructionsLocationResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + code: z.string(), + countryCode: z.string(), + eta: z.iso.datetime({ offset: true }), + vessel: z.string(), + voyage: z.string(), + }) + .readonly(); + export type ShippingInstructionsLocationResponseDto = z.infer; + + /** + * SIMoveTypeEnumSchema + * @type { enum } + */ + export const SIMoveTypeEnumSchema = z.enum(["DoorToDoor", "DoorToPort", "PortToDoor", "PortToPort"]); + export type SIMoveTypeEnum = z.infer; + export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; + + /** + * ShippingInstructionsTransportDtoSchema + * @type { object } + * @property { string } vessel + * @property { string } voyage + * @property { string } imo + * @property { ShippingInstructionsLocationResponseDto } placeOfReceipt + * @property { ShippingInstructionsLocationResponseDto } portOfLoading + * @property { ShippingInstructionsLocationResponseDto } portOfDischarge + * @property { ShippingInstructionsLocationResponseDto } placeOfDelivery + * @property { SIMoveTypeEnum } moveType + * @property { string } shipmentType + */ + export const ShippingInstructionsTransportDtoSchema = z + .object({ + vessel: z.string(), + voyage: z.string(), + imo: z.string(), + placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema, + portOfLoading: ShippingInstructionsLocationResponseDtoSchema, + portOfDischarge: ShippingInstructionsLocationResponseDtoSchema, + placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema, + moveType: SIMoveTypeEnumSchema, + shipmentType: z.string(), + }) + .readonly(); + export type ShippingInstructionsTransportDto = z.infer; + + /** + * ShippingInstructionsHazardousDtoSchema + * @type { object } + * @property { string } IMOClass + * @property { string } UNDGNumber + * @property { string } contact + */ + export const ShippingInstructionsHazardousDtoSchema = z + .object({ IMOClass: z.string(), UNDGNumber: z.string(), contact: z.string() }) + .readonly(); + export type ShippingInstructionsHazardousDto = z.infer; + + /** + * ShippingInstructionsPackageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { number } quantity + * @property { string } packageType + * @property { string } packageTypeDescription + * @property { string } packageDescription + * @property { string } hsCode + * @property { number } volume + * @property { number } grossWeight + * @property { string } caseMarks + * @property { ShippingInstructionsHazardousDto } hazardous + * @property { string } ncmCodes + * @property { string } cusCode + */ + export const ShippingInstructionsPackageResponseDtoSchema = z + .object({ + id: z.string(), + quantity: z.number(), + packageType: z.string(), + packageTypeDescription: z.string(), + packageDescription: z.string(), + hsCode: z.string(), + volume: z.number(), + grossWeight: z.number(), + caseMarks: z.string(), + hazardous: ShippingInstructionsHazardousDtoSchema, + ncmCodes: z.string(), + cusCode: z.string(), + }) + .readonly(); + export type ShippingInstructionsPackageResponseDto = z.infer; + + /** + * ShippingInstructionsCargoResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } transportUnitNumber + * @property { string } transportUnitType + * @property { string } transportUnitDescription + * @property { string } containerSupplier + * @property { number } grossWeight + * @property { number } tare + * @property { number } volume + * @property { string } seal1 + * @property { string } seal2 + * @property { string } woodDeclaration + * @property { ShippingInstructionsPackageResponseDto[] } packages + */ + export const ShippingInstructionsCargoResponseDtoSchema = z + .object({ + id: z.string().nullish(), + transportUnitNumber: z.string().nullish(), + transportUnitType: z.string().nullish(), + transportUnitDescription: z.string().nullish(), + containerSupplier: z.string().nullish(), + grossWeight: z.number().nullish(), + tare: z.number().nullish(), + volume: z.number().nullish(), + seal1: z.string().nullish(), + seal2: z.string().nullish(), + woodDeclaration: WoodDeclarationEnumSchema.nullish(), + packages: z.array(ShippingInstructionsPackageResponseDtoSchema).readonly(), + }) + .readonly(); + export type ShippingInstructionsCargoResponseDto = z.infer; + + /** + * ShippingInstructionsHeaderDtoSchema + * @type { object } + * @property { string } name + * @property { string } nameSuffix + * @property { number } versionNumber + * @property { string } shippingInstructionNumber + * @property { string } carrierScac + * @property { string } carrierBookingNumber + */ + export const ShippingInstructionsHeaderDtoSchema = z + .object({ + name: z.string(), + nameSuffix: z.string().nullish(), + versionNumber: z.number(), + shippingInstructionNumber: z.string().nullish(), + carrierScac: z.string().nullish(), + carrierBookingNumber: z.string().nullish(), + }) + .readonly(); + export type ShippingInstructionsHeaderDto = z.infer; + + /** + * ShippingInstructionsReferencesDtoSchema + * @type { object } + * @property { string } shipperReference + * @property { string } forwarderReference + * @property { string } transactionReferenceNumber + * @property { string } blReferenceNumber + * @property { string } uniqueConsignmentReference + * @property { string } purchaseOrderNumber + * @property { string } contractReferenceNumber + * @property { string } rucNumber + * @property { string } consigneeOrderNumber + * @property { string } invoiceReferenceNumber + * @property { string } letterOfCreditReference + * @property { string } customsHouseBrokerReference + * @property { string } fmcNumber + * @property { string } exportLicenseNumber + */ + export const ShippingInstructionsReferencesDtoSchema = z + .object({ + shipperReference: z.string(), + forwarderReference: z.string(), + transactionReferenceNumber: z.string(), + blReferenceNumber: z.string(), + uniqueConsignmentReference: z.string(), + purchaseOrderNumber: z.string(), + contractReferenceNumber: z.string(), + rucNumber: z.string(), + consigneeOrderNumber: z.string(), + invoiceReferenceNumber: z.string(), + letterOfCreditReference: z.string(), + customsHouseBrokerReference: z.string(), + fmcNumber: z.string(), + exportLicenseNumber: z.string(), + }) + .readonly(); + export type ShippingInstructionsReferencesDto = z.infer; + + /** + * ShippingInstructionsCustomsComplianceDtoSchema + * @type { object } + * @property { string } shipperTaxId + * @property { string } shipperEORI + * @property { string } consigneeTaxId + * @property { string } consigneeEORI + * @property { string } notifyPartyTaxId + * @property { string } notifyPartyEORI + */ + export const ShippingInstructionsCustomsComplianceDtoSchema = z + .object({ + shipperTaxId: z.string(), + shipperEORI: z.string(), + consigneeTaxId: z.string(), + consigneeEORI: z.string(), + notifyPartyTaxId: z.string(), + notifyPartyEORI: z.string(), + }) + .readonly(); + export type ShippingInstructionsCustomsComplianceDto = z.infer; + + /** + * ShippingInstructionsIcs2DtoSchema + * @type { object } + * @property { boolean } goodsDeliveredInEu + * @property { string } ensDeclaration + * @property { string } issuedHouseBills + */ + export const ShippingInstructionsIcs2DtoSchema = z + .object({ + goodsDeliveredInEu: z.boolean(), + ensDeclaration: EnsDeclarationEnumSchema, + issuedHouseBills: IssuedHouseBillsEnumSchema, + }) + .readonly(); + export type ShippingInstructionsIcs2Dto = z.infer; + + /** + * ShippingInstructionsCargoIdentificationNumbersDtoSchema + * @type { object } + * @property { string } PCINNumber + * @property { string } CSNNumber + * @property { string } MCINNumber + */ + export const ShippingInstructionsCargoIdentificationNumbersDtoSchema = z + .object({ PCINNumber: z.string(), CSNNumber: z.string(), MCINNumber: z.string() }) + .readonly(); + export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer< + typeof ShippingInstructionsCargoIdentificationNumbersDtoSchema + >; + + /** + * ShippingInstructionsControlTotalsDtoSchema + * @type { object } + * @property { number } totalNumberOfContainers + * @property { number } totalNumberOfPackages + * @property { number } totalShipmentWeight + * @property { number } totalShipmentVolume + */ + export const ShippingInstructionsControlTotalsDtoSchema = z + .object({ + totalNumberOfContainers: z.number(), + totalNumberOfPackages: z.number(), + totalShipmentWeight: z.number(), + totalShipmentVolume: z.number(), + }) + .readonly(); + export type ShippingInstructionsControlTotalsDto = z.infer; + + /** + * FreightChargesDtoSchema + * @type { object } + * @property { string } freightPayer + * @property { string } freightTerm + */ + export const FreightChargesDtoSchema = z + .object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }) + .readonly(); + export type FreightChargesDto = z.infer; + + /** + * ShippingInstructionsShippersDeclaredValueDtoSchema + * @type { object } + * @property { string } currency + * @property { number } shipperDeclaredValue + */ + export const ShippingInstructionsShippersDeclaredValueDtoSchema = z + .object({ currency: z.string(), shipperDeclaredValue: z.number() }) + .readonly(); + export type ShippingInstructionsShippersDeclaredValueDto = z.infer< + typeof ShippingInstructionsShippersDeclaredValueDtoSchema + >; + + /** + * ShippingInstructionsNotificationEmailsDtoSchema + * @type { object } + * @property { string } siRequestorEmails + */ + export const ShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string() }).readonly(); + export type ShippingInstructionsNotificationEmailsDto = z.infer< + typeof ShippingInstructionsNotificationEmailsDtoSchema + >; + + /** + * ShippingInstructionsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } name + * @property { string } nameSuffix + * @property { string } date + * @property { string } createdAt + * @property { string } updatedAt + * @property { number } versionNumber + * @property { ShippingInstructionsHeaderDto } header + * @property { ShippingInstructionsGeneralDetailsDto } generalDetails + * @property { ShippingInstructionsReferencesDto } references + * @property { ShippingInstructionsTransportDto } transport + * @property { ShippingInstructionsCustomsComplianceDto } customsCompliance + * @property { ShippingInstructionsIcs2Dto } ics2 + * @property { ShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers + * @property { ShippingInstructionsCargoResponseDto[] } cargo + * @property { ShippingInstructionsControlTotalsDto } controlTotals + * @property { FreightChargesDto } freightCharges + * @property { ShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue + * @property { ShippingInstructionsNotificationEmailsDto } notificationEmails + * @property { string } defaultFileName + */ + export const ShippingInstructionsResponseDtoSchema = z + .object({ + id: z.string(), + positionId: z.string(), + name: z.string(), + nameSuffix: z.string().nullish(), + date: z.iso.datetime({ offset: true }).nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + versionNumber: z.number(), + header: ShippingInstructionsHeaderDtoSchema, + generalDetails: ShippingInstructionsGeneralDetailsDtoSchema, + references: ShippingInstructionsReferencesDtoSchema, + transport: ShippingInstructionsTransportDtoSchema, + customsCompliance: ShippingInstructionsCustomsComplianceDtoSchema, + ics2: ShippingInstructionsIcs2DtoSchema, + cargoIdentificationNumbers: ShippingInstructionsCargoIdentificationNumbersDtoSchema, + cargo: z.array(ShippingInstructionsCargoResponseDtoSchema).readonly().nullish(), + controlTotals: ShippingInstructionsControlTotalsDtoSchema, + freightCharges: FreightChargesDtoSchema, + shippersDeclaredValue: ShippingInstructionsShippersDeclaredValueDtoSchema, + notificationEmails: ShippingInstructionsNotificationEmailsDtoSchema, + defaultFileName: z.string(), + }) + .readonly(); + export type ShippingInstructionsResponseDto = z.infer; + + /** + * UpdateShippingInstructionsPartnerDtoSchema + * @type { object } + * @property { string } id Partner id + * @property { string } name Partner name + * @property { string } addressLine1 Address line 1 + * @property { string } addressLine2 Address line 2 + * @property { string } city City + * @property { string } postalCode Postal code + * @property { string } state State + * @property { string } countryCode Country code + * @property { string } taxId Tax ID + * @property { string } contactName Contact name + * @property { string } contactPhone Contact phone + * @property { string } contactEmail Contact email + */ + export const UpdateShippingInstructionsPartnerDtoSchema = z + .object({ + id: z.string().describe("Partner id"), + name: z.string().describe("Partner name"), + addressLine1: z.string().describe("Address line 1"), + addressLine2: z.string().describe("Address line 2"), + city: z.string().describe("City"), + postalCode: z.string().describe("Postal code"), + state: z.string().describe("State"), + countryCode: z.string().describe("Country code"), + taxId: z.string().describe("Tax ID"), + contactName: z.string().describe("Contact name"), + contactPhone: z.string().describe("Contact phone"), + contactEmail: z.string().describe("Contact email"), + }) + .readonly(); + export type UpdateShippingInstructionsPartnerDto = z.infer; + + /** + * UpdateShippingInstructionsGeneralDetailsDtoSchema + * @type { object } + * @property { UpdateShippingInstructionsPartnerDto } shipper Shipper + * @property { UpdateShippingInstructionsPartnerDto } consignee Consignee + * @property { UpdateShippingInstructionsPartnerDto } freightForwarder Freight forwarder + * @property { UpdateShippingInstructionsPartnerDto } notifyParty Notify party + * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty1 Additional notify party 1 + * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty2 Additional notify party 2 + * @property { UpdateShippingInstructionsPartnerDto } contractParty Contract party + * @property { UpdateShippingInstructionsPartnerDto } manufacturer Manufacturer + * @property { UpdateShippingInstructionsPartnerDto } consolidator Consolidator + * @property { UpdateShippingInstructionsPartnerDto } importer Importer + * @property { UpdateShippingInstructionsPartnerDto } warehouseKeeper Warehouse keeper + */ + export const UpdateShippingInstructionsGeneralDetailsDtoSchema = z + .object({ + shipper: UpdateShippingInstructionsPartnerDtoSchema.describe("Shipper"), + consignee: UpdateShippingInstructionsPartnerDtoSchema.describe("Consignee"), + freightForwarder: UpdateShippingInstructionsPartnerDtoSchema.describe("Freight forwarder"), + notifyParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Notify party"), + additionalNotifyParty1: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 1"), + additionalNotifyParty2: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 2"), + contractParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Contract party"), + manufacturer: UpdateShippingInstructionsPartnerDtoSchema.describe("Manufacturer"), + consolidator: UpdateShippingInstructionsPartnerDtoSchema.describe("Consolidator"), + importer: UpdateShippingInstructionsPartnerDtoSchema.describe("Importer"), + warehouseKeeper: UpdateShippingInstructionsPartnerDtoSchema.describe("Warehouse keeper"), + }) + .readonly(); + export type UpdateShippingInstructionsGeneralDetailsDto = z.infer< + typeof UpdateShippingInstructionsGeneralDetailsDtoSchema + >; + + /** + * UpdateShippingInstructionsLocationDtoSchema + * @type { object } + * @property { string } id Location id + * @property { string } name Location name + * @property { string } code Location code + * @property { string } countryCode Country code + */ + export const UpdateShippingInstructionsLocationDtoSchema = z + .object({ + id: z.string().describe("Location id"), + name: z.string().describe("Location name"), + code: z.string().describe("Location code"), + countryCode: z.string().describe("Country code"), + }) + .readonly(); + export type UpdateShippingInstructionsLocationDto = z.infer; + + /** + * UpdateShippingInstructionsTransportDtoSchema + * @type { object } + * @property { string } vessel Vessel + * @property { string } voyage Voyage + * @property { string } imo IMO + * @property { UpdateShippingInstructionsLocationDto } placeOfReceipt Place of receipt + * @property { UpdateShippingInstructionsLocationDto } portOfLoading Port of loading + * @property { UpdateShippingInstructionsLocationDto } portOfDischarge Port of discharge + * @property { UpdateShippingInstructionsLocationDto } placeOfDelivery Place of delivery + * @property { SIMoveTypeEnum } moveType Move type + * @property { string } shipmentType Shipment type + */ + export const UpdateShippingInstructionsTransportDtoSchema = z + .object({ + vessel: z.string().describe("Vessel"), + voyage: z.string().describe("Voyage"), + imo: z.string().describe("IMO"), + placeOfReceipt: UpdateShippingInstructionsLocationDtoSchema.describe("Place of receipt"), + portOfLoading: UpdateShippingInstructionsLocationDtoSchema.describe("Port of loading"), + portOfDischarge: UpdateShippingInstructionsLocationDtoSchema.describe("Port of discharge"), + placeOfDelivery: UpdateShippingInstructionsLocationDtoSchema.describe("Place of delivery"), + moveType: SIMoveTypeEnumSchema.describe("Move type"), + shipmentType: z.string().describe("Shipment type"), + }) + .readonly(); + export type UpdateShippingInstructionsTransportDto = z.infer; + + /** + * UpdateShippingInstructionsHazardousDtoSchema + * @type { object } + * @property { string } IMOClass IMO class + * @property { string } UNDGNumber UNDG number + * @property { string } contact Contact + */ + export const UpdateShippingInstructionsHazardousDtoSchema = z + .object({ + IMOClass: z.string().describe("IMO class"), + UNDGNumber: z.string().describe("UNDG number"), + contact: z.string().describe("Contact"), + }) + .readonly(); + export type UpdateShippingInstructionsHazardousDto = z.infer; + + /** + * UpdateShippingInstructionsPackageDtoSchema + * @type { object } + * @property { string } id Package id + * @property { number } quantity Quantity + * @property { string } packageType Package type + * @property { string } packageTypeDescription Package type description + * @property { string } packageDescription Package description + * @property { string } hsCode HS code + * @property { number } volume Volume + * @property { number } grossWeight Gross weight + * @property { string } caseMarks Case marks + * @property { UpdateShippingInstructionsHazardousDto } hazardous Hazardous + * @property { string } ncmCodes NCM codes + * @property { string } cusCode CUS code + */ + export const UpdateShippingInstructionsPackageDtoSchema = z + .object({ + id: z.string().describe("Package id"), + quantity: z.number().describe("Quantity"), + packageType: z.string().describe("Package type"), + packageTypeDescription: z.string().describe("Package type description"), + packageDescription: z.string().describe("Package description"), + hsCode: z.string().describe("HS code"), + volume: z.number().describe("Volume"), + grossWeight: z.number().describe("Gross weight"), + caseMarks: z.string().describe("Case marks"), + hazardous: UpdateShippingInstructionsHazardousDtoSchema.describe("Hazardous"), + ncmCodes: z.string().describe("NCM codes"), + cusCode: z.string().describe("CUS code"), + }) + .readonly(); + export type UpdateShippingInstructionsPackageDto = z.infer; + + /** + * UpdateShippingInstructionsCargoDtoSchema + * @type { object } + * @property { string } id Cargo id + * @property { string } transportUnitNumber Transport unit number + * @property { string } transportUnitType Transport unit type + * @property { string } transportUnitDescription Transport unit description + * @property { string } containerSupplier Container supplier + * @property { number } grossWeight Gross weight + * @property { number } tare Tare + * @property { number } volume Volume + * @property { string } seal1 Seal 1 + * @property { string } seal2 Seal 2 + * @property { string } woodDeclaration Wood declaration + * @property { UpdateShippingInstructionsPackageDto[] } packages Packages + */ + export const UpdateShippingInstructionsCargoDtoSchema = z + .object({ + id: z.string().describe("Cargo id"), + transportUnitNumber: z.string().describe("Transport unit number"), + transportUnitType: z.string().describe("Transport unit type"), + transportUnitDescription: z.string().describe("Transport unit description"), + containerSupplier: z.string().describe("Container supplier"), + grossWeight: z.number().describe("Gross weight"), + tare: z.number().describe("Tare"), + volume: z.number().describe("Volume"), + seal1: z.string().describe("Seal 1"), + seal2: z.string().describe("Seal 2"), + woodDeclaration: WoodDeclarationEnumSchema.describe("Wood declaration"), + packages: z.array(UpdateShippingInstructionsPackageDtoSchema).readonly().describe("Packages"), + }) + .readonly(); + export type UpdateShippingInstructionsCargoDto = z.infer; + + /** + * UpdateShippingInstructionsHeaderDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } nameSuffix Name suffix + * @property { number } versionNumber Version number + * @property { string } shippingInstructionNumber Shipping instruction number + * @property { string } carrierScac Carrier SCAC + * @property { string } carrierBookingNumber Carrier booking number + */ + export const UpdateShippingInstructionsHeaderDtoSchema = z + .object({ + name: z.string().describe("Name"), + nameSuffix: z.string().describe("Name suffix"), + versionNumber: z.number().describe("Version number"), + shippingInstructionNumber: z.string().describe("Shipping instruction number"), + carrierScac: z.string().describe("Carrier SCAC"), + carrierBookingNumber: z.string().describe("Carrier booking number"), + }) + .readonly(); + export type UpdateShippingInstructionsHeaderDto = z.infer; + + /** + * UpdateShippingInstructionsReferencesDtoSchema + * @type { object } + * @property { string } shipperReference Shipper reference + * @property { string } forwarderReference Forwarder reference + * @property { string } transactionReferenceNumber Transaction reference number + * @property { string } blReferenceNumber BL reference number + * @property { string } uniqueConsignmentReference Unique consignment reference + * @property { string } purchaseOrderNumber Purchase order number + * @property { string } contractReferenceNumber Contract reference number + * @property { string } rucNumber RUC number + * @property { string } consigneeOrderNumber Consignee order number + * @property { string } invoiceReferenceNumber Invoice reference number + * @property { string } letterOfCreditReference Letter of credit reference + * @property { string } customsHouseBrokerReference Customs house broker reference + * @property { string } fmcNumber FMC number + * @property { string } exportLicenseNumber Export license number + */ + export const UpdateShippingInstructionsReferencesDtoSchema = z + .object({ + shipperReference: z.string().describe("Shipper reference"), + forwarderReference: z.string().describe("Forwarder reference"), + transactionReferenceNumber: z.string().describe("Transaction reference number"), + blReferenceNumber: z.string().describe("BL reference number"), + uniqueConsignmentReference: z.string().describe("Unique consignment reference"), + purchaseOrderNumber: z.string().describe("Purchase order number"), + contractReferenceNumber: z.string().describe("Contract reference number"), + rucNumber: z.string().describe("RUC number"), + consigneeOrderNumber: z.string().describe("Consignee order number"), + invoiceReferenceNumber: z.string().describe("Invoice reference number"), + letterOfCreditReference: z.string().describe("Letter of credit reference"), + customsHouseBrokerReference: z.string().describe("Customs house broker reference"), + fmcNumber: z.string().describe("FMC number"), + exportLicenseNumber: z.string().describe("Export license number"), + }) + .readonly(); + export type UpdateShippingInstructionsReferencesDto = z.infer; + + /** + * UpdateShippingInstructionsCustomsComplianceDtoSchema + * @type { object } + * @property { string } shipperTaxId Shipper tax ID + * @property { string } shipperEORI Shipper EORI + * @property { string } consigneeTaxId Consignee tax ID + * @property { string } consigneeEORI Consignee EORI + * @property { string } notifyPartyTaxId Notify party tax ID + * @property { string } notifyPartyEORI Notify party EORI + */ + export const UpdateShippingInstructionsCustomsComplianceDtoSchema = z + .object({ + shipperTaxId: z.string().describe("Shipper tax ID"), + shipperEORI: z.string().describe("Shipper EORI"), + consigneeTaxId: z.string().describe("Consignee tax ID"), + consigneeEORI: z.string().describe("Consignee EORI"), + notifyPartyTaxId: z.string().describe("Notify party tax ID"), + notifyPartyEORI: z.string().describe("Notify party EORI"), + }) + .readonly(); + export type UpdateShippingInstructionsCustomsComplianceDto = z.infer< + typeof UpdateShippingInstructionsCustomsComplianceDtoSchema + >; + + /** + * UpdateShippingInstructionsIcs2DtoSchema + * @type { object } + * @property { boolean } goodsDeliveredInEu Goods delivered in EU + * @property { string } ensDeclaration ENS declaration + * @property { string } issuedHouseBills Issued house bills + */ + export const UpdateShippingInstructionsIcs2DtoSchema = z + .object({ + goodsDeliveredInEu: z.boolean().describe("Goods delivered in EU"), + ensDeclaration: EnsDeclarationEnumSchema.describe("ENS declaration"), + issuedHouseBills: IssuedHouseBillsEnumSchema.describe("Issued house bills"), + }) + .readonly(); + export type UpdateShippingInstructionsIcs2Dto = z.infer; + + /** + * UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema + * @type { object } + * @property { string } PCINNumber PCIN number + * @property { string } CSNNumber CSN number + * @property { string } MCINNumber MCIN number + */ + export const UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema = z + .object({ + PCINNumber: z.string().describe("PCIN number"), + CSNNumber: z.string().describe("CSN number"), + MCINNumber: z.string().describe("MCIN number"), + }) + .readonly(); + export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer< + typeof UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema + >; + + /** + * UpdateFreightChargesDtoSchema + * @type { object } + * @property { string } freightPayer + * @property { string } freightTerm + */ + export const UpdateFreightChargesDtoSchema = z + .object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }) + .readonly(); + export type UpdateFreightChargesDto = z.infer; + + /** + * UpdateShippingInstructionsShippersDeclaredValueDtoSchema + * @type { object } + * @property { string } currency Currency + * @property { number } shipperDeclaredValue Shipper declared value + */ + export const UpdateShippingInstructionsShippersDeclaredValueDtoSchema = z + .object({ + currency: z.string().describe("Currency"), + shipperDeclaredValue: z.number().describe("Shipper declared value"), + }) + .readonly(); + export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer< + typeof UpdateShippingInstructionsShippersDeclaredValueDtoSchema + >; + + /** + * UpdateShippingInstructionsNotificationEmailsDtoSchema + * @type { object } + * @property { string } siRequestorEmails SI requestor emails + */ + export const UpdateShippingInstructionsNotificationEmailsDtoSchema = z + .object({ siRequestorEmails: z.string().describe("SI requestor emails") }) + .readonly(); + export type UpdateShippingInstructionsNotificationEmailsDto = z.infer< + typeof UpdateShippingInstructionsNotificationEmailsDtoSchema + >; + + /** + * UpdateShippingInstructionsRequestDtoSchema + * @type { object } + * @property { string } date Date + * @property { UpdateShippingInstructionsHeaderDto } header Header + * @property { UpdateShippingInstructionsGeneralDetailsDto } generalDetails General details + * @property { UpdateShippingInstructionsReferencesDto } references References + * @property { UpdateShippingInstructionsTransportDto } transport Transport + * @property { UpdateShippingInstructionsCustomsComplianceDto } customsCompliance Customs compliance + * @property { UpdateShippingInstructionsIcs2Dto } ics2 ICS2 + * @property { UpdateShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers Cargo identification numbers + * @property { UpdateShippingInstructionsCargoDto[] } cargo Cargo + * @property { UpdateFreightChargesDto } freightCharges + * @property { UpdateShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue Shipper's declared value + * @property { UpdateShippingInstructionsNotificationEmailsDto } notificationEmails Notification emails + */ + export const UpdateShippingInstructionsRequestDtoSchema = z + .object({ + date: z.iso.datetime({ offset: true }).describe("Date"), + header: UpdateShippingInstructionsHeaderDtoSchema.describe("Header"), + generalDetails: UpdateShippingInstructionsGeneralDetailsDtoSchema.describe("General details"), + references: UpdateShippingInstructionsReferencesDtoSchema.describe("References"), + transport: UpdateShippingInstructionsTransportDtoSchema.describe("Transport"), + customsCompliance: UpdateShippingInstructionsCustomsComplianceDtoSchema.describe("Customs compliance"), + ics2: UpdateShippingInstructionsIcs2DtoSchema.describe("ICS2"), + cargoIdentificationNumbers: + UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema.describe("Cargo identification numbers"), + cargo: z.array(UpdateShippingInstructionsCargoDtoSchema).readonly().describe("Cargo"), + freightCharges: UpdateFreightChargesDtoSchema, + shippersDeclaredValue: + UpdateShippingInstructionsShippersDeclaredValueDtoSchema.describe("Shipper's declared value"), + notificationEmails: UpdateShippingInstructionsNotificationEmailsDtoSchema.describe("Notification emails"), + }) + .readonly(); + export type UpdateShippingInstructionsRequestDto = z.infer; +} diff --git a/test/generated/base/shippingInstructions/shippingInstructions.queries.ts b/test/generated/base/shippingInstructions/shippingInstructions.queries.ts new file mode 100644 index 0000000..f8e3607 --- /dev/null +++ b/test/generated/base/shippingInstructions/shippingInstructions.queries.ts @@ -0,0 +1,272 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ShippingInstructionsAcl } from "./shippingInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ShippingInstructionsModels } from "./shippingInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ShippingInstructionsApi } from "./shippingInstructions.api"; + +export namespace ShippingInstructionsQueries { + export const moduleName = QueryModule.ShippingInstructions; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string, id: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/shipping-instructions/:id", + officeId, + positionId, + id, + ] as const, + preview: (officeId: string, positionId: string, id: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/shipping-instructions/:id/preview", + officeId, + positionId, + id, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create shipping instructions + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId })); + return ShippingInstructionsApi.create(officeId, positionId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGet` + * @summary Get shipping instructions data + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, positionId, id }: { officeId: string; positionId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId, id), + queryFn: () => { + checkAcl(ShippingInstructionsAcl.canUseGet({ officeId })); + return ShippingInstructionsApi.get(officeId, positionId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update shipping instructions + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { ShippingInstructionsModels.UpdateShippingInstructionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Shipping instructions updated successfully + * @statusCodes [200, 401, 404] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ShippingInstructionsApi.update, + { + officeId: string; + positionId: string; + id: string; + data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id, data }) => { + checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId })); + return ShippingInstructionsApi.update(officeId, positionId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, id } = variables; + const updateKeys = [keys.get(officeId, positionId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteOfficesPositionsShippingInstructionsById` + * @summary Delete shipping instructions + * @permission Requires `canUseDeleteOfficesPositionsShippingInstructionsById` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Shipping instructions deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteOfficesPositionsShippingInstructionsById = ( + options?: AppMutationOptions< + typeof ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById, + { officeId: string; positionId: string; id: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id }) => { + checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId })); + return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreview` - recommended when file should be cached + * @summary Preview shipping instructions document + * @permission Requires `canUsePreview` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreview = ( + { officeId, positionId, id }: { officeId: string; positionId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.preview(officeId, positionId, id), + queryFn: () => { + checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId })); + return ShippingInstructionsApi.preview(officeId, positionId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewMutation` - recommended when file should not be cached + * @summary Preview shipping instructions document + * @permission Requires `canUsePreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewMutation = ( + options?: AppMutationOptions< + typeof ShippingInstructionsApi.preview, + { officeId: string; positionId: string; id: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id }) => { + checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId })); + return ShippingInstructionsApi.preview(officeId, positionId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, id } = variables; + const updateKeys = [keys.preview(officeId, positionId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerate` + * @summary Generate shipping instructions document + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerate = ( + options?: AppMutationOptions< + typeof ShippingInstructionsApi.generate, + { officeId: string; positionId: string; id: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id, data }) => { + checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId })); + return ShippingInstructionsApi.generate(officeId, positionId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/terminals/terminals.acl.ts b/test/generated/base/terminals/terminals.acl.ts new file mode 100644 index 0000000..b7aa7d6 --- /dev/null +++ b/test/generated/base/terminals/terminals.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace TerminalsAcl { + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Terminal"] as AbilityTuple<"Create", "Terminal">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; + + /** + * Use for `useGetById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ + export const canUseGetById = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Terminal"] as AbilityTuple<"Update", "Terminal">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "Terminal"] as AbilityTuple<"Archive", "Terminal">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Unarchive", "Terminal"] as AbilityTuple<"Unarchive", "Terminal">; +} diff --git a/test/generated/base/terminals/terminals.api.ts b/test/generated/base/terminals/terminals.api.ts new file mode 100644 index 0000000..ff8bf00 --- /dev/null +++ b/test/generated/base/terminals/terminals.api.ts @@ -0,0 +1,113 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { TerminalsModels } from "./terminals.models"; + +export namespace TerminalsApi { + export const create = (data: TerminalsModels.CreateTerminalRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals`, + ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), + config, + ); + }; + + export const paginate = ( + limit: number, + order?: string, + filter?: TerminalsModels.TerminalPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, `/terminals`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: TerminalsModels.TerminalLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, + `/terminals/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const getById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: TerminalsModels.TerminalResponseDTOSchema }, `/terminals/${id}`, config); + }; + + export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals/${id}`, + ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/terminals/${id}/archive`, undefined, config); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/terminals/${id}/unarchive`, undefined, config); + }; +} diff --git a/test/generated/base/terminals/terminals.configs.ts b/test/generated/base/terminals/terminals.configs.ts new file mode 100644 index 0000000..ee3eb18 --- /dev/null +++ b/test/generated/base/terminals/terminals.configs.ts @@ -0,0 +1,145 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { TerminalsModels } from "./terminals.models"; +import { CommonModels } from "@/data/common/common.models"; +import { TerminalsQueries } from "./terminals.queries"; +import { TerminalsAcl } from "./terminals.acl"; + +export namespace TerminalsConfigs { + export const terminalsConfig = { + meta: { + title: "Terminals", + }, + readAll: { + acl: TerminalsAcl.canUsePaginate, + schema: TerminalsModels.TerminalResponseDTOSchema, + paginated: TerminalsQueries.usePaginate, + infinite: TerminalsQueries.usePaginateInfinite, + filters: { + schema: TerminalsModels.TerminalPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: TerminalsModels.TerminalPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + type: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: TerminalsModels.TerminalResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + name: true, + type: true, + airport: true, + port: true, + archived: true, + shortName: true, + address: true, + additionalInformation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: TerminalsModels.TerminalsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: TerminalsAcl.canUseGetById, + schema: TerminalsModels.TerminalResponseDTOSchema, + query: TerminalsQueries.useGetById, + }, + create: { + acl: TerminalsAcl.canUseCreate, + schema: TerminalsModels.CreateTerminalRequestDTOSchema, + mutation: TerminalsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: TerminalsModels.CreateTerminalRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + type: true, + portId: true, + airportId: true, + street: true, + secondaryStreet: true, + zip: true, + district: true, + cityId: true, + countryId: true, + additionalInformation: true, + }, + }, + }), + }, + update: { + acl: TerminalsAcl.canUseUpdate, + schema: TerminalsModels.UpdateTerminalRequestDTOSchema, + mutation: TerminalsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: TerminalsModels.UpdateTerminalRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + type: true, + portId: true, + airportId: true, + street: true, + secondaryStreet: true, + zip: true, + district: true, + cityId: true, + countryId: true, + additionalInformation: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: TerminalsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: TerminalsQueries.usePaginateLabels, + infinite: TerminalsQueries.usePaginateLabelsInfinite, + filters: { + schema: TerminalsModels.TerminalLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: TerminalsModels.TerminalLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/terminals/terminals.models.ts b/test/generated/base/terminals/terminals.models.ts new file mode 100644 index 0000000..56c6644 --- /dev/null +++ b/test/generated/base/terminals/terminals.models.ts @@ -0,0 +1,294 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace TerminalsModels { + /** + * TerminalTypeSchema + * @type { enum } + */ + export const TerminalTypeSchema = z.enum(["port", "airport"]); + export type TerminalType = z.infer; + export const TerminalType = TerminalTypeSchema.enum; + + /** + * CreateTerminalRequestDTOSchema + * @type { object } + * @property { string } matchCode Unique identifier code for the terminal + * @property { string } shortName Optional short name for the terminal + * @property { string } name Full name of the terminal + * @property { TerminalType } type Type of the terminal + * @property { string } portId ID of associated port, required if type is port + * @property { string } airportId ID of associated airport, required if type is airport + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP / Postal code + * @property { string } district District + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } additionalInformation Additional information + */ + export const CreateTerminalRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Unique identifier code for the terminal"), + shortName: z.string().describe("Optional short name for the terminal").nullish(), + name: z.string().describe("Full name of the terminal"), + type: TerminalTypeSchema.describe("Type of the terminal"), + portId: z.string().describe("ID of associated port, required if type is port").nullish(), + airportId: z.string().describe("ID of associated airport, required if type is airport").nullish(), + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street").nullish(), + zip: z.string().describe("ZIP / Postal code"), + district: z.string().describe("District").nullish(), + cityId: z.string().describe("City id"), + countryId: z.string().describe("Country id"), + additionalInformation: z.string().describe("Additional information").nullish(), + }) + .readonly(); + export type CreateTerminalRequestDTO = z.infer; + + /** + * TerminalCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const TerminalCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type TerminalCityDto = z.infer; + + /** + * TerminalCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ + export const TerminalCountryDtoSchema = z + .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) + .readonly(); + export type TerminalCountryDto = z.infer; + + /** + * TerminalAddressDTOSchema + * @type { object } + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP/Postal code + * @property { TerminalCityDto } city + * @property { string } district District name + * @property { TerminalCountryDto } country + */ + export const TerminalAddressDTOSchema = z + .object({ + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street").nullish(), + zip: z.string().describe("ZIP/Postal code"), + city: TerminalCityDtoSchema.nullish(), + district: z.string().describe("District name").nullish(), + country: TerminalCountryDtoSchema.nullish(), + }) + .readonly(); + export type TerminalAddressDTO = z.infer; + + /** + * AirportReferenceDTOSchema + * @type { object } + * @property { string } id Unique identifier of the airport + * @property { string } name Name of the airport + */ + export const AirportReferenceDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the airport"), + name: z.string().describe("Name of the airport"), + }) + .readonly(); + export type AirportReferenceDTO = z.infer; + + /** + * PortReferenceDTOSchema + * @type { object } + * @property { string } id Unique identifier of the port + * @property { string } name Name of the port + */ + export const PortReferenceDTOSchema = z + .object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port") }) + .readonly(); + export type PortReferenceDTO = z.infer; + + /** + * TerminalEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type TerminalEmployeeDTO = z.infer; + + /** + * TerminalResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the terminal + * @property { string } matchCode Match code for the terminal + * @property { string } name Name of the terminal + * @property { TerminalType } type Type of the terminal + * @property { AirportReferenceDTO } airport Associated airport information if terminal type is airport + * @property { PortReferenceDTO } port Associated port information if terminal type is port + * @property { boolean } archived Archived status of the terminal + * @property { string } shortName Short name of the terminal + * @property { TerminalAddressDTO } address Address of the terminal + * @property { string } additionalInformation Additional information + * @property { string } createdById + * @property { TerminalEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { TerminalEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const TerminalResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the terminal"), + matchCode: z.string().describe("Match code for the terminal"), + name: z.string().describe("Name of the terminal"), + type: TerminalTypeSchema.describe("Type of the terminal").nullish(), + airport: AirportReferenceDTOSchema.describe( + "Associated airport information if terminal type is airport", + ).nullish(), + port: PortReferenceDTOSchema.describe("Associated port information if terminal type is port").nullish(), + archived: z.boolean().describe("Archived status of the terminal"), + shortName: z.string().describe("Short name of the terminal").nullish(), + address: TerminalAddressDTOSchema.describe("Address of the terminal").nullish(), + additionalInformation: z.string().describe("Additional information").nullish(), + createdById: z.string().nullish(), + createdBy: TerminalEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: TerminalEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type TerminalResponseDTO = z.infer; + + /** + * UpdateTerminalRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code for the terminal + * @property { string } shortName Updated short name + * @property { string } name Updated name + * @property { TerminalType } type Type of the terminal + * @property { string } portId ID of associated port, required if type is port + * @property { string } airportId ID of associated airport, required if type is airport + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP / Postal code + * @property { string } district District + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } additionalInformation Additional information + */ + export const UpdateTerminalRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Updated match code for the terminal"), + shortName: z.string().describe("Updated short name"), + name: z.string().describe("Updated name"), + type: TerminalTypeSchema.describe("Type of the terminal"), + portId: z.string().describe("ID of associated port, required if type is port"), + airportId: z.string().describe("ID of associated airport, required if type is airport"), + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street"), + zip: z.string().describe("ZIP / Postal code"), + district: z.string().describe("District"), + cityId: z.string().describe("City id"), + countryId: z.string().describe("Country id"), + additionalInformation: z.string().describe("Additional information"), + }) + .readonly(); + export type UpdateTerminalRequestDTO = z.infer; + + /** + * TerminalPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter terminals by matchCode, shortName, or name + * @property { boolean } archived + * @property { string } type + */ + export const TerminalPaginationFilterDtoSchema = z + .object({ + search: z.string().describe("Search term to filter terminals by matchCode, shortName, or name"), + archived: z.boolean(), + type: TerminalTypeSchema, + }) + .readonly(); + export type TerminalPaginationFilterDto = z.infer; + + /** + * TerminalLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const TerminalLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type TerminalLabelFilterDto = z.infer; + + /** + * TerminalsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const TerminalsPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type TerminalsPaginateOrderParamEnum = z.infer; + export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSchema.enum; + + /** + * TerminalsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { TerminalResponseDTO[] } items + */ + export const TerminalsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(TerminalResponseDTOSchema).readonly() }).readonly().shape, + }); + export type TerminalsPaginateResponse = z.infer; + + /** + * TerminalsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const TerminalsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type TerminalsPaginateLabelsOrderParamEnum = z.infer; + export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * TerminalsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const TerminalsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type TerminalsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/terminals/terminals.queries.ts b/test/generated/base/terminals/terminals.queries.ts new file mode 100644 index 0000000..4de8274 --- /dev/null +++ b/test/generated/base/terminals/terminals.queries.ts @@ -0,0 +1,358 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { TerminalsAcl } from "./terminals.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { TerminalsModels } from "./terminals.models"; +import { TerminalsApi } from "./terminals.api"; + +export namespace TerminalsQueries { + export const moduleName = QueryModule.Terminals; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: TerminalsModels.TerminalPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/terminals", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: TerminalsModels.TerminalPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/terminals", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: TerminalsModels.TerminalLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/terminals/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: TerminalsModels.TerminalLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/terminals/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getById: (id: string) => [...keys.all, "/terminals/:id", id] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a new terminal + * @permission Requires `canUseCreate` ability + * @param { TerminalsModels.CreateTerminalRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(TerminalsAcl.canUseCreate()); + return TerminalsApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Paginate Terminals + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: TerminalsModels.TerminalPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(TerminalsAcl.canUsePaginate()); + return TerminalsApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Terminals + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: TerminalsModels.TerminalPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(TerminalsAcl.canUsePaginate()); + return TerminalsApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate terminals with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: TerminalsModels.TerminalLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(TerminalsAcl.canUsePaginateLabels()); + return TerminalsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate terminals with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: TerminalsModels.TerminalLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(TerminalsAcl.canUsePaginateLabels()); + return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetById` + * @summary Get terminal details by ID + * @permission Requires `canUseGetById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(id), + queryFn: () => { + checkAcl(TerminalsAcl.canUseGetById()); + return TerminalsApi.getById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update terminal details + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { TerminalsModels.UpdateTerminalRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof TerminalsApi.update, + { id: string; data: TerminalsModels.UpdateTerminalRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(TerminalsAcl.canUseUpdate()); + return TerminalsApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.getById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive a terminal + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(TerminalsAcl.canUseArchive()); + return TerminalsApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive a terminal + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(TerminalsAcl.canUseUnarchive()); + return TerminalsApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/useCrossTabQueryInvalidation.ts b/test/generated/base/useCrossTabQueryInvalidation.ts new file mode 100644 index 0000000..d74d707 --- /dev/null +++ b/test/generated/base/useCrossTabQueryInvalidation.ts @@ -0,0 +1,40 @@ +import type { QueryClient, QueryKey } from "@tanstack/react-query"; + +const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; + +/** + * Broadcasts a query invalidation event to all other open tabs via localStorage. + * + * @param queryKeys - An array of query keys to invalidate (array of arrays). + * + * NOTE: The `storage` event only fires in *other* tabs — the calling tab + * must invalidate its own queryClient separately if needed. + */ +export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { + localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); +}; + +/** + * Registers a one-time global `storage` event listener that reacts to + * cross-tab invalidation broadcasts. Safe to call from multiple hooks — + * only the first call sets up the listener. + */ +let isListenerSetUp = false; + +export const setupCrossTabListener = (queryClient: QueryClient) => { + if (isListenerSetUp) return; + isListenerSetUp = true; + + window.addEventListener("storage", (e: StorageEvent) => { + if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; + + try { + const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; + for (const queryKey of keys) { + queryClient.invalidateQueries({ queryKey }); + } + } catch { + // Ignore malformed payloads + } + }); +}; diff --git a/test/generated/base/useMutationEffects.ts b/test/generated/base/useMutationEffects.ts new file mode 100644 index 0000000..ed61406 --- /dev/null +++ b/test/generated/base/useMutationEffects.ts @@ -0,0 +1,95 @@ +import { useCallback, useEffect } from "react"; + +import { QueryKey, useQueryClient } from "@tanstack/react-query"; +import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; +import { QueryModule } from "./queryModules"; +import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; + +export interface MutationEffectsOptions { + invalidateCurrentModule?: boolean; + crossTabInvalidation?: boolean; + invalidationMap?: InvalidationMap; + invalidateModules?: QueryModule[]; + invalidateKeys?: QueryKey[]; + preferUpdate?: boolean; +} + +export interface UseMutationEffectsProps { + currentModule: QueryModule; +} + +export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { + const queryClient = useQueryClient(); + const config = OpenApiQueryConfig.useConfig(); + + useEffect(() => { + if (!config.crossTabInvalidation) return; + setupCrossTabListener(queryClient); + }, [queryClient, config.crossTabInvalidation]); + + const runMutationEffects = useCallback( + async ( + data: TData, + variables: TVariables, + options: MutationEffectsOptions = {}, + updateKeys?: QueryKey[], + ) => { + const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; + const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; + const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; + + const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => + keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); + const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => + prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); + const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); + + const shouldInvalidateQuery = (queryKey: QueryKey) => { + const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); + if (shouldUpdate && isUpdateKey) { + return false; + } + + const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; + const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); + const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + const isMappedKey = + !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + + return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; + }; + + const invalidatedQueryKeys: QueryKey[] = []; + + queryClient.invalidateQueries({ + predicate: ({ queryKey }) => { + const shouldInvalidate = shouldInvalidateQuery(queryKey); + + if (shouldInvalidate && config.crossTabInvalidation) { + invalidatedQueryKeys.push([...queryKey]); + } + + return shouldInvalidate; + }, + }); + + if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { + broadcastQueryInvalidation(invalidatedQueryKeys); + } + + if (shouldUpdate && updateKeys) { + updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); + } + }, + [ + queryClient, + currentModule, + config.preferUpdate, + config.invalidateCurrentModule, + config.invalidationMap, + config.crossTabInvalidation, + ], + ); + + return { runMutationEffects }; +} diff --git a/test/generated/base/userActivity/userActivity.api.ts b/test/generated/base/userActivity/userActivity.api.ts new file mode 100644 index 0000000..94229d9 --- /dev/null +++ b/test/generated/base/userActivity/userActivity.api.ts @@ -0,0 +1,30 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { UserActivityModels } from "./userActivity.models"; + +export namespace UserActivityApi { + export const get = ( + officeId: string, + entityType: string, + entityId: string, + activeThresholdMinutes?: number, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, + `/offices/${officeId}/${entityType}/${entityId}/activity`, + { + ...config, + params: { + activeThresholdMinutes: ZodExtended.parse( + z.number().gte(1).describe("Active threshold in minutes").nullish(), + activeThresholdMinutes, + { type: "query", name: "activeThresholdMinutes" }, + ), + }, + }, + ); + }; +} diff --git a/test/generated/base/userActivity/userActivity.models.ts b/test/generated/base/userActivity/userActivity.models.ts new file mode 100644 index 0000000..149f572 --- /dev/null +++ b/test/generated/base/userActivity/userActivity.models.ts @@ -0,0 +1,91 @@ +import { z } from "zod"; + +export namespace UserActivityModels { + /** + * ActivityTypeEnumSchema + * @type { enum } + */ + export const ActivityTypeEnumSchema = z.enum(["View", "Modify"]); + export type ActivityTypeEnum = z.infer; + export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; + + /** + * UserSectionActivityDtoSchema + * @type { object } + * @property { string } section Section name + * @property { ActivityTypeEnum } activityType Type of activity + * @property { string } lastSeen Last seen timestamp + */ + export const UserSectionActivityDtoSchema = z + .object({ + section: z.string().describe("Section name"), + activityType: ActivityTypeEnumSchema.describe("Type of activity"), + lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), + }) + .readonly(); + export type UserSectionActivityDto = z.infer; + + /** + * ActiveUserDtoSchema + * @type { object } + * @property { string } userId User ID + * @property { string } firstName User first name + * @property { string } lastName User last name + * @property { string } userAvatar User avatar URL + * @property { UserSectionActivityDto } section User section activity + * @property { string } lastSeen Last seen timestamp + * @property { boolean } isCurrentlyActive Is currently active + */ + export const ActiveUserDtoSchema = z + .object({ + userId: z.string().describe("User ID"), + firstName: z.string().describe("User first name"), + lastName: z.string().describe("User last name"), + userAvatar: z.string().describe("User avatar URL").nullish(), + section: UserSectionActivityDtoSchema.describe("User section activity"), + lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), + isCurrentlyActive: z.boolean().describe("Is currently active"), + }) + .readonly(); + export type ActiveUserDto = z.infer; + + /** + * ActivityEntityTypeEnumSchema + * @type { enum } + */ + export const ActivityEntityTypeEnumSchema = z.enum(["Position", "Invoice", "BusinessPartner", "Quote"]); + export type ActivityEntityTypeEnum = z.infer; + export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; + + /** + * ActivityMetadataDtoSchema + * @type { object } + * @property { number } totalActiveUsers Total number of active users + * @property { string } entityId Entity ID + * @property { ActivityEntityTypeEnum } entityType Entity type + * @property { number } activeThresholdMinutes Active threshold in minutes + */ + export const ActivityMetadataDtoSchema = z + .object({ + totalActiveUsers: z.number().describe("Total number of active users"), + entityId: z.string().describe("Entity ID"), + entityType: ActivityEntityTypeEnumSchema.describe("Entity type"), + activeThresholdMinutes: z.number().describe("Active threshold in minutes"), + }) + .readonly(); + export type ActivityMetadataDto = z.infer; + + /** + * UserActivityResponseDtoSchema + * @type { object } + * @property { ActiveUserDto[] } activeUsers List of active users + * @property { ActivityMetadataDto } metadata Activity metadata + */ + export const UserActivityResponseDtoSchema = z + .object({ + activeUsers: z.array(ActiveUserDtoSchema).readonly().describe("List of active users"), + metadata: ActivityMetadataDtoSchema.describe("Activity metadata"), + }) + .readonly(); + export type UserActivityResponseDto = z.infer; +} diff --git a/test/generated/base/userActivity/userActivity.queries.ts b/test/generated/base/userActivity/userActivity.queries.ts new file mode 100644 index 0000000..89790ac --- /dev/null +++ b/test/generated/base/userActivity/userActivity.queries.ts @@ -0,0 +1,50 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { UserActivityApi } from "./userActivity.api"; + +export namespace UserActivityQueries { + export const moduleName = QueryModule.UserActivity; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number) => + [ + ...keys.all, + "/offices/:officeId/:entityType/:entityId/activity", + officeId, + entityType, + entityId, + activeThresholdMinutes, + ] as const, + }; + + /** + * Query `useGet` + * @summary Get user activity for an entity + * @param { string } object.officeId Path parameter + * @param { string } object.entityType Path parameter + * @param { string } object.entityId Path parameter + * @param { number } object.activeThresholdMinutes Query parameter. Active threshold in minutes. Minimum: `1` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { + officeId, + entityType, + entityId, + activeThresholdMinutes, + }: { officeId: string; entityType: string; entityId: string; activeThresholdMinutes?: number }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), + queryFn: () => UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes, config), + ...options, + }); + }; +} diff --git a/test/generated/base/vatRules/vatRules.acl.ts b/test/generated/base/vatRules/vatRules.acl.ts new file mode 100644 index 0000000..25b5cb3 --- /dev/null +++ b/test/generated/base/vatRules/vatRules.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace VatRulesAcl { + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; + + /** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "VatRule"] as AbilityTuple<"Create", "VatRule">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; +} diff --git a/test/generated/base/vatRules/vatRules.api.ts b/test/generated/base/vatRules/vatRules.api.ts new file mode 100644 index 0000000..a8e66b1 --- /dev/null +++ b/test/generated/base/vatRules/vatRules.api.ts @@ -0,0 +1,123 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { VatRulesModels } from "./vatRules.models"; + +export namespace VatRulesApi { + export const paginateLabels = ( + limit: number, + order?: string, + filter?: VatRulesModels.VatRuleFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, + `/vat-rules/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const list = ( + limit: number, + order?: string, + filter?: VatRulesModels.VatRuleFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: VatRulesModels.VatRulesListResponseSchema }, `/vat-rules`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules`, + ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), + config, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: VatRulesModels.VatRuleResponseDTOSchema }, `/vat-rules/${id}`, config); + }; + + export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}`, + ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}/archive`, + undefined, + config, + ); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/base/vatRules/vatRules.configs.ts b/test/generated/base/vatRules/vatRules.configs.ts new file mode 100644 index 0000000..b822df6 --- /dev/null +++ b/test/generated/base/vatRules/vatRules.configs.ts @@ -0,0 +1,150 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { VatRulesModels } from "./vatRules.models"; +import { CommonModels } from "@/data/common/common.models"; +import { VatRulesQueries } from "./vatRules.queries"; +import { VatRulesAcl } from "./vatRules.acl"; + +export namespace VatRulesConfigs { + export const vatRulesConfig = { + meta: { + title: "Vat Rules", + }, + readAll: { + acl: VatRulesAcl.canUseList, + schema: VatRulesModels.VatRuleResponseDTOSchema, + paginated: VatRulesQueries.useList, + infinite: VatRulesQueries.useListInfinite, + filters: { + schema: VatRulesModels.VatRuleFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: VatRulesModels.VatRuleFilterDtoSchema, + options: { + inputs: { + matchcode: true, + name: true, + type: true, + officeId: true, + archived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: VatRulesModels.VatRuleResponseDTOSchema, + options: { + columns: { + id: true, + matchcode: true, + name: true, + vatPercentage: true, + vatNumber: true, + noTax: true, + type: true, + archived: true, + isReverseCharge: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + officeId: true, + office: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + sortable: VatRulesModels.VatRulesListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: VatRulesAcl.canUseFindById, + schema: VatRulesModels.VatRuleResponseDTOSchema, + query: VatRulesQueries.useFindById, + }, + create: { + acl: VatRulesAcl.canUseCreate, + schema: VatRulesModels.CreateVatRuleRequestDTOSchema, + mutation: VatRulesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: VatRulesModels.CreateVatRuleRequestDTOSchema, + options: { + inputs: { + matchcode: true, + name: true, + noTax: true, + vatPercentage: true, + vatNumber: true, + type: true, + officeId: true, + isReverseCharge: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + }, + }), + }, + update: { + acl: VatRulesAcl.canUseUpdate, + schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, + mutation: VatRulesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, + options: { + inputs: { + matchcode: true, + name: true, + noTax: true, + vatPercentage: true, + vatNumber: true, + type: true, + officeId: true, + isReverseCharge: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: VatRulesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: VatRulesQueries.usePaginateLabels, + infinite: VatRulesQueries.usePaginateLabelsInfinite, + filters: { + schema: VatRulesModels.VatRuleFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: VatRulesModels.VatRuleFilterDtoSchema, + options: { + inputs: { + matchcode: true, + name: true, + type: true, + officeId: true, + archived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/vatRules/vatRules.models.ts b/test/generated/base/vatRules/vatRules.models.ts new file mode 100644 index 0000000..5ff8a61 --- /dev/null +++ b/test/generated/base/vatRules/vatRules.models.ts @@ -0,0 +1,224 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace VatRulesModels { + /** + * VatRuleTypeEnumSchema + * @type { enum } + */ + export const VatRuleTypeEnumSchema = z.enum(["Outgoing", "Incoming"]); + export type VatRuleTypeEnum = z.infer; + export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; + + /** + * VatRuleFilterDtoSchema + * @type { object } + * @property { string } matchcode Matchcode to filter by + * @property { string } name Name to filter by + * @property { VatRuleTypeEnum } type + * @property { string } officeId Office ID to filter by + * @property { boolean } archived Filter by archived status + * @property { string } search Search to filter by + */ + export const VatRuleFilterDtoSchema = z + .object({ + matchcode: z.string().describe("Matchcode to filter by"), + name: z.string().describe("Name to filter by"), + type: VatRuleTypeEnumSchema, + officeId: z.string().describe("Office ID to filter by"), + archived: z.boolean().describe("Filter by archived status"), + search: z.string().describe("Search to filter by"), + }) + .readonly(); + export type VatRuleFilterDto = z.infer; + + /** + * VatRuleEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type VatRuleEmployeeDTO = z.infer; + + /** + * VatRuleOfficeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type VatRuleOfficeDTO = z.infer; + + /** + * VatRuleResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchcode + * @property { string } name + * @property { number } vatPercentage + * @property { number } vatNumber VAT rule reference number + * @property { boolean } noTax + * @property { VatRuleTypeEnum } type + * @property { boolean } archived + * @property { boolean } isReverseCharge + * @property { string } createdById + * @property { VatRuleEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { VatRuleEmployeeDTO } updatedBy + * @property { string } updatedAt + * @property { string } officeId + * @property { VatRuleOfficeDTO } office + * @property { string } bookkeepingId + * @property { string } bookkeepingTargetAccountNumber + */ + export const VatRuleResponseDTOSchema = z + .object({ + id: z.string(), + matchcode: z.string(), + name: z.string(), + vatPercentage: z.number(), + vatNumber: z.number().describe("VAT rule reference number").nullish(), + noTax: z.boolean().nullish(), + type: VatRuleTypeEnumSchema, + archived: z.boolean(), + isReverseCharge: z.boolean(), + createdById: z.string().nullish(), + createdBy: VatRuleEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: VatRuleEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + officeId: z.string(), + office: VatRuleOfficeDTOSchema.nullish(), + bookkeepingId: z.string().nullish(), + bookkeepingTargetAccountNumber: z.string().nullish(), + }) + .readonly(); + export type VatRuleResponseDTO = z.infer; + + /** + * CreateVatRuleRequestDTOSchema + * @type { object } + * @property { string } matchcode Unique matchcode for the VAT rule + * @property { string } name Name of the VAT rule + * @property { boolean } noTax + * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` + * @property { number } vatNumber VAT rule reference number + * @property { VatRuleTypeEnum } type Type of VAT rule + * @property { string } officeId Office ID + * @property { boolean } isReverseCharge Is reverse charge VAT rule + * @property { string } bookkeepingId Bookkeeping ID + * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number + */ + export const CreateVatRuleRequestDTOSchema = z + .object({ + matchcode: z.string().describe("Unique matchcode for the VAT rule"), + name: z.string().describe("Name of the VAT rule"), + noTax: z.boolean().nullish(), + vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), + vatNumber: z.number().describe("VAT rule reference number").nullish(), + type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), + officeId: z.string().describe("Office ID"), + isReverseCharge: z.boolean().describe("Is reverse charge VAT rule").nullish(), + bookkeepingId: z.string().describe("Bookkeeping ID").nullish(), + bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullish(), + }) + .readonly(); + export type CreateVatRuleRequestDTO = z.infer; + + /** + * UpdateVatRuleRequestDTOSchema + * @type { object } + * @property { string } matchcode Unique matchcode for the VAT rule + * @property { string } name Name of the VAT rule + * @property { boolean } noTax + * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` + * @property { number } vatNumber VAT rule reference number. Minimum: `0` + * @property { VatRuleTypeEnum } type Type of VAT rule + * @property { string } officeId Office ID + * @property { boolean } isReverseCharge Is reverse charge VAT rule + * @property { string } bookkeepingId Bookkeeping ID + * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number + */ + export const UpdateVatRuleRequestDTOSchema = z + .object({ + matchcode: z.string().describe("Unique matchcode for the VAT rule"), + name: z.string().describe("Name of the VAT rule"), + noTax: z.boolean(), + vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), + vatNumber: z.number().gte(0).describe("VAT rule reference number").nullable(), + type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), + officeId: z.string().describe("Office ID"), + isReverseCharge: z.boolean().describe("Is reverse charge VAT rule"), + bookkeepingId: z.string().describe("Bookkeeping ID").nullable(), + bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullable(), + }) + .readonly(); + export type UpdateVatRuleRequestDTO = z.infer; + + /** + * VatRulesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const VatRulesPaginateLabelsOrderParamEnumSchema = z.enum([ + "matchcode", + "name", + "type", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type VatRulesPaginateLabelsOrderParamEnum = z.infer; + export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * VatRulesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const VatRulesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type VatRulesPaginateLabelsResponse = z.infer; + + /** + * VatRulesListOrderParamEnumSchema + * @type { enum } + */ + export const VatRulesListOrderParamEnumSchema = z.enum([ + "matchcode", + "name", + "type", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type VatRulesListOrderParamEnum = z.infer; + export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; + + /** + * VatRulesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { VatRuleResponseDTO[] } items + */ + export const VatRulesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(VatRuleResponseDTOSchema).readonly() }).readonly().shape, + }); + export type VatRulesListResponse = z.infer; +} diff --git a/test/generated/base/vatRules/vatRules.queries.ts b/test/generated/base/vatRules/vatRules.queries.ts new file mode 100644 index 0000000..e0654f3 --- /dev/null +++ b/test/generated/base/vatRules/vatRules.queries.ts @@ -0,0 +1,341 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { VatRulesAcl } from "./vatRules.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { VatRulesModels } from "./vatRules.models"; +import { VatRulesApi } from "./vatRules.api"; + +export namespace VatRulesQueries { + export const moduleName = QueryModule.VatRules; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: VatRulesModels.VatRuleFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/vat-rules/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: VatRulesModels.VatRuleFilterDto, + cursor?: string, + ) => [...keys.all, "/vat-rules/labels/paginate", "infinite", limit, order, filter, cursor] as const, + list: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => + [...keys.all, "/vat-rules", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => + [...keys.all, "/vat-rules", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/vat-rules/:id", id] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate VAT rule labels (id and matchcode only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(VatRulesAcl.canUsePaginateLabels()); + return VatRulesApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate VAT rule labels (id and matchcode only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(VatRulesAcl.canUsePaginateLabels()); + return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useList` + * @summary List VAT rules + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(VatRulesAcl.canUseList()); + return VatRulesApi.list(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List VAT rules + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(VatRulesAcl.canUseList()); + return VatRulesApi.list(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new VAT rule + * @permission Requires `canUseCreate` ability + * @param { VatRulesModels.CreateVatRuleRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(VatRulesAcl.canUseCreate()); + return VatRulesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get VAT rule by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(VatRulesAcl.canUseFindById()); + return VatRulesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update VAT rule by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { VatRulesModels.UpdateVatRuleRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof VatRulesApi.update, + { id: string; data: VatRulesModels.UpdateVatRuleRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(VatRulesAcl.canUseUpdate()); + return VatRulesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive VAT rule + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(VatRulesAcl.canUseArchive()); + return VatRulesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive VAT rule + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(VatRulesAcl.canUseUnarchive()); + return VatRulesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/warehouses/warehouses.acl.ts b/test/generated/base/warehouses/warehouses.acl.ts new file mode 100644 index 0000000..7465f13 --- /dev/null +++ b/test/generated/base/warehouses/warehouses.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace WarehousesAcl { + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Warehouse"] as AbilityTuple<"Create", "Warehouse">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Warehouse"] as AbilityTuple<"Update", "Warehouse">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "Warehouse"] as AbilityTuple<"Archive", "Warehouse">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "Warehouse"] as AbilityTuple<"Archive", "Warehouse">; +} diff --git a/test/generated/base/warehouses/warehouses.api.ts b/test/generated/base/warehouses/warehouses.api.ts new file mode 100644 index 0000000..1520779 --- /dev/null +++ b/test/generated/base/warehouses/warehouses.api.ts @@ -0,0 +1,113 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WarehousesModels } from "./warehouses.models"; + +export namespace WarehousesApi { + export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses`, + ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), + config, + ); + }; + + export const paginate = ( + limit: number, + order?: string, + filter?: WarehousesModels.WarehouseFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, `/warehouses`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + + export const paginateLabels = ( + limit: number, + order?: string, + filter?: WarehousesModels.WarehouseLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, + `/warehouses/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: WarehousesModels.WarehouseResponseDTOSchema }, `/warehouses/${id}`, config); + }; + + export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses/${id}`, + ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), + config, + ); + }; + + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/warehouses/${id}/archive`, undefined, config); + }; + + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/warehouses/${id}/unarchive`, undefined, config); + }; +} diff --git a/test/generated/base/warehouses/warehouses.configs.ts b/test/generated/base/warehouses/warehouses.configs.ts new file mode 100644 index 0000000..dfcf9ed --- /dev/null +++ b/test/generated/base/warehouses/warehouses.configs.ts @@ -0,0 +1,140 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { WarehousesModels } from "./warehouses.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WarehousesQueries } from "./warehouses.queries"; +import { WarehousesAcl } from "./warehouses.acl"; + +export namespace WarehousesConfigs { + export const warehousesConfig = { + meta: { + title: "Warehouses", + }, + readAll: { + acl: WarehousesAcl.canUsePaginate, + schema: WarehousesModels.WarehouseResponseDTOSchema, + paginated: WarehousesQueries.usePaginate, + infinite: WarehousesQueries.usePaginateInfinite, + filters: { + schema: WarehousesModels.WarehouseFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WarehousesModels.WarehouseFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: WarehousesModels.WarehouseResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + city: true, + country: true, + district: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: WarehousesModels.WarehousesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: WarehousesAcl.canUseFindById, + schema: WarehousesModels.WarehouseResponseDTOSchema, + query: WarehousesQueries.useFindById, + }, + create: { + acl: WarehousesAcl.canUseCreate, + schema: WarehousesModels.CreateWarehouseRequestDTOSchema, + mutation: WarehousesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: WarehousesModels.CreateWarehouseRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, + }), + }, + update: { + acl: WarehousesAcl.canUseUpdate, + schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, + mutation: WarehousesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: WarehousesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: WarehousesQueries.usePaginateLabels, + infinite: WarehousesQueries.usePaginateLabelsInfinite, + filters: { + schema: WarehousesModels.WarehouseLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WarehousesModels.WarehouseLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/base/warehouses/warehouses.models.ts b/test/generated/base/warehouses/warehouses.models.ts new file mode 100644 index 0000000..dfa717d --- /dev/null +++ b/test/generated/base/warehouses/warehouses.models.ts @@ -0,0 +1,224 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WarehousesModels { + /** + * WarehouseCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type WarehouseCityDto = z.infer; + + /** + * WarehouseCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ + export const WarehouseCountryDtoSchema = z + .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) + .readonly(); + export type WarehouseCountryDto = z.infer; + + /** + * WarehouseEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type WarehouseEmployeeDTO = z.infer; + + /** + * WarehouseResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { WarehouseCityDto } city + * @property { WarehouseCountryDto } country + * @property { string } district + * @property { boolean } archived + * @property { string } createdById + * @property { WarehouseEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { WarehouseEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const WarehouseResponseDTOSchema = z + .object({ + id: z.string(), + name: z.string().nullish(), + shortName: z.string().nullish(), + additionalInformation: z.string().nullish(), + matchCode: z.string(), + street: z.string().nullish(), + secondaryStreet: z.string().nullish(), + zip: z.string().nullish(), + city: WarehouseCityDtoSchema.nullish(), + country: WarehouseCountryDtoSchema.nullish(), + district: z.string().nullish(), + archived: z.boolean(), + createdById: z.string().nullish(), + createdBy: WarehouseEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: WarehouseEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type WarehouseResponseDTO = z.infer; + + /** + * CreateWarehouseRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } countryId + * @property { string } district + */ + export const CreateWarehouseRequestDTOSchema = z + .object({ + name: z.string().nullish(), + shortName: z.string().nullish(), + additionalInformation: z.string().nullish(), + matchCode: z.string(), + street: z.string().nullish(), + secondaryStreet: z.string().nullish(), + zip: z.string().nullish(), + cityId: z.string().nullish(), + countryId: z.string().nullish(), + district: z.string().nullish(), + }) + .readonly(); + export type CreateWarehouseRequestDTO = z.infer; + + /** + * WarehouseLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const WarehouseLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type WarehouseLabelFilterDto = z.infer; + + /** + * WarehouseFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived Filter by archived status + */ + export const WarehouseFilterDtoSchema = z + .object({ search: z.string(), archived: z.boolean().describe("Filter by archived status") }) + .readonly(); + export type WarehouseFilterDto = z.infer; + + /** + * UpdateWarehouseRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } countryId + * @property { string } district + */ + export const UpdateWarehouseRequestDTOSchema = z + .object({ + name: z.string(), + shortName: z.string(), + additionalInformation: z.string(), + matchCode: z.string(), + street: z.string(), + secondaryStreet: z.string(), + zip: z.string(), + cityId: z.string(), + countryId: z.string(), + district: z.string(), + }) + .readonly(); + export type UpdateWarehouseRequestDTO = z.infer; + + /** + * WarehousesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const WarehousesPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type WarehousesPaginateOrderParamEnum = z.infer; + export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnumSchema.enum; + + /** + * WarehousesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { WarehouseResponseDTO[] } items + */ + export const WarehousesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(WarehouseResponseDTOSchema).readonly() }).readonly().shape, + }); + export type WarehousesPaginateResponse = z.infer; + + /** + * WarehousesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const WarehousesPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type WarehousesPaginateLabelsOrderParamEnum = z.infer; + export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * WarehousesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const WarehousesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type WarehousesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/base/warehouses/warehouses.queries.ts b/test/generated/base/warehouses/warehouses.queries.ts new file mode 100644 index 0000000..9fc4da2 --- /dev/null +++ b/test/generated/base/warehouses/warehouses.queries.ts @@ -0,0 +1,348 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WarehousesAcl } from "./warehouses.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WarehousesModels } from "./warehouses.models"; +import { WarehousesApi } from "./warehouses.api"; + +export namespace WarehousesQueries { + export const moduleName = QueryModule.Warehouses; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: WarehousesModels.WarehouseFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/warehouses", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string) => + [...keys.all, "/warehouses", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: WarehousesModels.WarehouseLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/warehouses/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: WarehousesModels.WarehouseLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/warehouses/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/warehouses/:id", id] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create warehouse + * @permission Requires `canUseCreate` ability + * @param { WarehousesModels.CreateWarehouseRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(WarehousesAcl.canUseCreate()); + return WarehousesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Get paginated warehouses + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WarehousesAcl.canUsePaginate()); + return WarehousesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Get paginated warehouses + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WarehousesAcl.canUsePaginate()); + return WarehousesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate warehouse labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: WarehousesModels.WarehouseLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WarehousesAcl.canUsePaginateLabels()); + return WarehousesApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate warehouse labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WarehousesAcl.canUsePaginateLabels()); + return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get warehouse by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(WarehousesAcl.canUseFindById()); + return WarehousesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update warehouse + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { WarehousesModels.UpdateWarehouseRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof WarehousesApi.update, + { id: string; data: WarehousesModels.UpdateWarehouseRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(WarehousesAcl.canUseUpdate()); + return WarehousesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive warehouse + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(WarehousesAcl.canUseArchive()); + return WarehousesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive warehouse + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(WarehousesAcl.canUseUnarchive()); + return WarehousesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/workingDocuments/workingDocuments.acl.ts b/test/generated/base/workingDocuments/workingDocuments.acl.ts new file mode 100644 index 0000000..5ef0f52 --- /dev/null +++ b/test/generated/base/workingDocuments/workingDocuments.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsAcl { + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List working documents + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument", object) : "WorkingDocument"] as AbilityTuple< + "Read", + "WorkingDocument" | (ForcedSubject<"WorkingDocument"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get working document by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument", object) : "WorkingDocument"] as AbilityTuple< + "Read", + "WorkingDocument" | (ForcedSubject<"WorkingDocument"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocuments/workingDocuments.api.ts b/test/generated/base/workingDocuments/workingDocuments.api.ts new file mode 100644 index 0000000..7afc369 --- /dev/null +++ b/test/generated/base/workingDocuments/workingDocuments.api.ts @@ -0,0 +1,57 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; + +export namespace WorkingDocumentsApi { + export const list = ( + positionId: string, + officeId: string, + limit: number, + order?: string, + filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, + `/offices/${officeId}/positions/${positionId}/working-documents`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + + export const findById = (positionId: string, id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, + config, + ); + }; +} diff --git a/test/generated/base/workingDocuments/workingDocuments.configs.ts b/test/generated/base/workingDocuments/workingDocuments.configs.ts new file mode 100644 index 0000000..041fdcc --- /dev/null +++ b/test/generated/base/workingDocuments/workingDocuments.configs.ts @@ -0,0 +1,54 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; +import { WorkingDocumentsQueries } from "./workingDocuments.queries"; +import { WorkingDocumentsAcl } from "./workingDocuments.acl"; + +export namespace WorkingDocumentsConfigs { + export const workingDocumentsConfig = { + meta: { + title: "Working Documents", + }, + readAll: { + acl: WorkingDocumentsAcl.canUseList, + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + paginated: WorkingDocumentsQueries.useList, + infinite: WorkingDocumentsQueries.useListInfinite, + filters: { + schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, + options: { + inputs: { + search: true, + type: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + name: true, + nameSuffix: true, + type: true, + referenceTable: true, + referenceId: true, + createdById: true, + createdAt: true, + createdBy: true, + }, + sortable: WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: WorkingDocumentsAcl.canUseFindById, + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + query: WorkingDocumentsQueries.useFindById, + }, + }; +} diff --git a/test/generated/base/workingDocuments/workingDocuments.models.ts b/test/generated/base/workingDocuments/workingDocuments.models.ts new file mode 100644 index 0000000..5fc10dd --- /dev/null +++ b/test/generated/base/workingDocuments/workingDocuments.models.ts @@ -0,0 +1,100 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsModels { + /** + * TypeEnumSchema + * @type { enum } + * @description Working document type + */ + export const TypeEnumSchema = z.enum([ + "export-declaration", + "house-bl", + "master-bl", + "house-awb", + "master-awb", + "bl-instructions", + "ams-instructions", + "cmr-form", + "fcr-form", + "isf-form", + "templated-document", + "shipping-instructions", + ]); + export type TypeEnum = z.infer; + export const TypeEnum = TypeEnumSchema.enum; + + /** + * WorkingDocumentCreatedByResponseDTOSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } name Employee name + */ + export const WorkingDocumentCreatedByResponseDTOSchema = z + .object({ id: z.string().describe("Employee ID"), name: z.string().describe("Employee name").nullable() }) + .readonly(); + export type WorkingDocumentCreatedByResponseDTO = z.infer; + + /** + * WorkingDocumentResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } positionId Position ID + * @property { string } name Working document name + * @property { string } nameSuffix Working document name suffix + * @property { string } type Working document type + * @property { string } referenceTable Reference table + * @property { string } referenceId Reference ID + * @property { string } createdById Created by + * @property { string } createdAt Created at + * @property { WorkingDocumentCreatedByResponseDTO } createdBy Created by + */ + export const WorkingDocumentResponseDTOSchema = z + .object({ + id: z.string(), + positionId: z.string().describe("Position ID"), + name: z.string().describe("Working document name"), + nameSuffix: z.string().describe("Working document name suffix").nullish(), + type: TypeEnumSchema.describe("Working document type"), + referenceTable: z.string().describe("Reference table"), + referenceId: z.string().describe("Reference ID"), + createdById: z.string().describe("Created by"), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + createdBy: WorkingDocumentCreatedByResponseDTOSchema.describe("Created by"), + }) + .readonly(); + export type WorkingDocumentResponseDTO = z.infer; + + /** + * WorkingDocumentFilterDtoSchema + * @type { object } + * @property { string } search + * @property { string } type + */ + export const WorkingDocumentFilterDtoSchema = z.object({ search: z.string(), type: z.string() }).readonly(); + export type WorkingDocumentFilterDto = z.infer; + + /** + * WorkingDocumentsListOrderParamEnumSchema + * @type { enum } + */ + export const WorkingDocumentsListOrderParamEnumSchema = z.enum(["NAME", "TYPE", "CREATED_AT", "UPDATED_AT"]); + export type WorkingDocumentsListOrderParamEnum = z.infer; + export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParamEnumSchema.enum; + + /** + * WorkingDocumentsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { WorkingDocumentResponseDTO[] } items + */ + export const WorkingDocumentsListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).readonly() }).readonly().shape, + }); + export type WorkingDocumentsListResponse = z.infer; +} diff --git a/test/generated/base/workingDocuments/workingDocuments.queries.ts b/test/generated/base/workingDocuments/workingDocuments.queries.ts new file mode 100644 index 0000000..09fb3dc --- /dev/null +++ b/test/generated/base/workingDocuments/workingDocuments.queries.ts @@ -0,0 +1,190 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsAcl } from "./workingDocuments.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; +import { WorkingDocumentsApi } from "./workingDocuments.api"; + +export namespace WorkingDocumentsQueries { + export const moduleName = QueryModule.WorkingDocuments; + + export const keys = { + all: [moduleName] as const, + list: ( + positionId: string, + officeId: string, + limit?: number, + order?: string, + filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/working-documents", + positionId, + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + listInfinite: ( + positionId: string, + officeId: string, + limit?: number, + order?: string, + filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/working-documents", + "infinite", + positionId, + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (positionId: string, id: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/working-documents/:id", + positionId, + id, + officeId, + ] as const, + }; + + /** + * Query `useList` + * @summary List working documents + * @permission Requires `canUseList` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` + * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + positionId, + officeId, + limit, + order, + filter, + page, + cursor, + }: { + positionId: string; + officeId: string; + limit: number; + order?: string; + filter?: WorkingDocumentsModels.WorkingDocumentFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WorkingDocumentsAcl.canUseList({ officeId })); + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List working documents + * @permission Requires `canUseList` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` + * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + positionId, + officeId, + limit, + order, + filter, + cursor, + }: { + positionId: string; + officeId: string; + limit: number; + order?: string; + filter?: WorkingDocumentsModels.WorkingDocumentFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WorkingDocumentsAcl.canUseList({ officeId })); + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get working document by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ + export const useFindById = ( + { positionId, id, officeId }: { positionId: string; id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(positionId, id, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId })); + return WorkingDocumentsApi.findById(positionId, id, officeId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts new file mode 100644 index 0000000..231e7ac --- /dev/null +++ b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts @@ -0,0 +1,93 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsAmsInstructionsAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Create", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Create", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGetAMSInstructionsData` query ability. For global ability, omit the object parameter. + * @description Read AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAMSInstructionsData` query + */ + export const canUseGetAMSInstructionsData = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; + + /** + * Use for `useUpdateAMSInstructionsData` mutation ability. For global ability, omit the object parameter. + * @description Update AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateAMSInstructionsData` mutation + */ + export const canUseUpdateAMSInstructionsData = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; + + /** + * Use for `useDeleteAMSInstructions` mutation ability. For global ability, omit the object parameter. + * @description Delete AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteAMSInstructions` mutation + */ + export const canUseDeleteAMSInstructions = (object?: { officeId: string }) => + [ + "Delete", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Delete", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; + + /** + * Use for `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation + */ + export const canUsePreviewAMSInstructions = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGenerateAMSInstructions` mutation ability. For global ability, omit the object parameter. + * @description Generate AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAMSInstructions` mutation + */ + export const canUseGenerateAMSInstructions = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts new file mode 100644 index 0000000..3963a2b --- /dev/null +++ b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts @@ -0,0 +1,94 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsAmsInstructionsApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions`, + undefined, + config, + ); + }; + + export const getAMSInstructionsData = ( + positionId: string, + amsInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + config, + ); + }; + + export const updateAMSInstructionsData = ( + positionId: string, + amsInstructionsId: string, + officeId: string, + data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), + config, + ); + }; + + export const deleteAMSInstructions = ( + positionId: string, + amsInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + undefined, + config, + ); + }; + + export const previewAMSInstructions = ( + positionId: string, + amsInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generateAMSInstructions = ( + positionId: string, + amsInstructionsId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts new file mode 100644 index 0000000..f48fd4d --- /dev/null +++ b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts @@ -0,0 +1,245 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsAmsInstructionsModels { + /** + * AMSInstructionsDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ + export const AMSInstructionsDocumentPortResponseDTOSchema = z + .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) + .readonly(); + export type AMSInstructionsDocumentPortResponseDTO = z.infer; + + /** + * AMSInstructionsDocumentCityResponseDTOSchema + * @type { object } + * @property { string } id ID of the city + * @property { string } name Name of the city + */ + export const AMSInstructionsDocumentCityResponseDTOSchema = z + .object({ id: z.string().describe("ID of the city"), name: z.string().describe("Name of the city") }) + .readonly(); + export type AMSInstructionsDocumentCityResponseDTO = z.infer; + + /** + * AMSInstructionsDocumentSignedByResponseDTOSchema + * @type { object } + * @property { string } id ID of the employee + * @property { string } name Name of the employee + */ + export const AMSInstructionsDocumentSignedByResponseDTOSchema = z + .object({ id: z.string().describe("ID of the employee"), name: z.string().describe("Name of the employee") }) + .readonly(); + export type AMSInstructionsDocumentSignedByResponseDTO = z.infer< + typeof AMSInstructionsDocumentSignedByResponseDTOSchema + >; + + /** + * AMSInstructionsDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const AMSInstructionsDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer< + typeof AMSInstructionsDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * AMSInstructionsDocumentCargoDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { string } containerNumber Container number of the cargo + * @property { number } nrOfPackages Number of packages in the cargo + * @property { string } description Description of the cargo + * @property { number } weight Weight of the cargo + * @property { number } volume Volume of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + */ + export const AMSInstructionsDocumentCargoDTOSchema = z + .object({ + caseMarks: z.string().describe("Case marks of the cargo"), + containerNumber: z.string().describe("Container number of the cargo"), + nrOfPackages: z.number().describe("Number of packages in the cargo"), + description: z.string().describe("Description of the cargo"), + weight: z.number().describe("Weight of the cargo"), + volume: z.number().describe("Volume of the cargo"), + seal1: z.string().describe("Seal number 1 of the cargo"), + seal2: z.string().describe("Seal number 2 of the cargo"), + }) + .readonly(); + export type AMSInstructionsDocumentCargoDTO = z.infer; + + /** + * AMSInstructionsDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the AMS Instructions document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the AMS Instructions document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } date Date of the AMS Instructions document + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { CommonModels.EditorContentResponseDto } additionalAMSText Additional AMS text + * @property { string } principalName Principal name + * @property { string } blNumber Bill of lading number + * @property { string } vessel Vessel + * @property { AMSInstructionsDocumentPortResponseDTO } portOfLoading Port of loading + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfDelivery Port of delivery + * @property { AMSInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfIssue Place of issue + * @property { string } dateOfIssue Date of issue + * @property { AMSInstructionsDocumentSignedByResponseDTO } signedBy Signed by + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } deliveryBusinessPartner Delivery business partner + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfAcceptance Port of acceptance + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Also notify party + * @property { string } applyTo Apply to + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string[] } availableContainerNumbers Available container numbers + * @property { string[] } selectedContainerNumbers Selected container numbers + * @property { string[] } selectedContainerLabels Selected container labels + * @property { AMSInstructionsDocumentCargoDTO[] } cargo Cargo information + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + */ + export const AMSInstructionsDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the AMS Instructions document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference").nullish(), + name: z.string().describe("Name of the AMS Instructions document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document").nullish(), + direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), + transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), + versionNumber: z.number().describe("Version number of the document"), + additionalAMSText: CommonModels.EditorContentResponseDtoSchema.describe("Additional AMS text").nullish(), + principalName: z.string().describe("Principal name").nullish(), + blNumber: z.string().describe("Bill of lading number").nullish(), + vessel: z.string().describe("Vessel").nullish(), + portOfLoading: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of loading").nullish(), + placeOfDelivery: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of delivery").nullish(), + portOfDischarge: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), + placeOfIssue: AMSInstructionsDocumentCityResponseDTOSchema.describe("Place of issue").nullish(), + dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue").nullish(), + signedBy: AMSInstructionsDocumentSignedByResponseDTOSchema.describe("Signed by").nullish(), + deliveryBusinessPartner: + AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Delivery business partner").nullish(), + placeOfAcceptance: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of acceptance").nullish(), + consignee: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), + shipper: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), + notify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Notify party").nullish(), + alsoNotify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Also notify party").nullish(), + applyTo: z.string().describe("Apply to").nullish(), + suppressWeight: z.boolean().describe("Whether to suppress weight information").nullish(), + suppressMeasurement: z.boolean().describe("Whether to suppress measurement information").nullish(), + availableContainerNumbers: z.array(z.string()).readonly().describe("Available container numbers").nullish(), + selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers").nullish(), + selectedContainerLabels: z.array(z.string()).readonly().describe("Selected container labels").nullish(), + cargo: z.array(AMSInstructionsDocumentCargoDTOSchema).readonly().describe("Cargo information").nullish(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at").nullish(), + }) + .readonly(); + export type AMSInstructionsDocumentResponseDTO = z.infer; + + /** + * UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateAMSInstructionsDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { CommonModels.EditorContentUpdateDto } additionalAMSText Additional AMS text + * @property { string } principalName Principal name + * @property { string } blNumber Bill of lading number + * @property { string } vessel Vessel + * @property { string } portOfLoadingId Port of loading id + * @property { string } placeOfDeliveryId Place of delivery id + * @property { string } portOfDischargeId Port of discharge id + * @property { string } placeOfIssueId Place of issue + * @property { string } dateOfIssue Date of issue + * @property { string } signedById Signed by employee ID + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } deliveryBusinessPartner Delivery business partner + * @property { string } placeOfAcceptanceId Port of acceptance + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party + * @property { string } applyTo Apply to + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string[] } selectedContainerNumbers Selected container numbers + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { string } date Date of the AMS Instructions document + */ + export const UpdateAMSInstructionsDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Document name suffix"), + additionalAMSText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional AMS text"), + principalName: z.string().describe("Principal name"), + blNumber: z.string().describe("Bill of lading number"), + vessel: z.string().describe("Vessel"), + portOfLoadingId: z.string().describe("Port of loading id"), + placeOfDeliveryId: z.string().describe("Place of delivery id"), + portOfDischargeId: z.string().describe("Port of discharge id"), + placeOfIssueId: z.string().describe("Place of issue"), + dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue"), + signedById: z.string().describe("Signed by employee ID"), + deliveryBusinessPartner: + UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Delivery business partner"), + placeOfAcceptanceId: z.string().describe("Port of acceptance"), + consignee: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), + shipper: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), + notify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party"), + alsoNotify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party"), + applyTo: z.string().describe("Apply to"), + suppressWeight: z.boolean().describe("Whether to suppress weight information"), + suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), + selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document"), + }) + .readonly(); + export type UpdateAMSInstructionsDocumentRequestDTO = z.infer; +} diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts new file mode 100644 index 0000000..5337c6a --- /dev/null +++ b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts @@ -0,0 +1,312 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsAmsInstructionsAcl } from "./workingDocumentsAmsInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsAmsInstructionsApi } from "./workingDocumentsAmsInstructions.api"; + +export namespace WorkingDocumentsAmsInstructionsQueries { + export const moduleName = QueryModule.WorkingDocumentsAmsInstructions; + + export const keys = { + all: [moduleName] as const, + getAMSInstructionsData: (positionId: string, amsInstructionsId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId", + positionId, + amsInstructionsId, + officeId, + ] as const, + previewAMSInstructions: (positionId: string, amsInstructionsId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId/preview", + positionId, + amsInstructionsId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create an AMS Instructions document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof WorkingDocumentsAmsInstructionsApi.create, + { positionId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId })); + return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetAMSInstructionsData` + * @summary Get AMS Instructions document data + * @permission Requires `canUseGetAMSInstructionsData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.amsInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetAMSInstructionsData = ( + { positionId, amsInstructionsId, officeId }: { positionId: string; amsInstructionsId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId })); + return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData( + positionId, + amsInstructionsId, + officeId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateAMSInstructionsData` + * @summary Update AMS Instructions document data + * @permission Requires `canUseUpdateAMSInstructionsData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateAMSInstructionsData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData, + { + positionId: string; + amsInstructionsId: string; + officeId: string; + data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId })); + return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData( + positionId, + amsInstructionsId, + officeId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, amsInstructionsId, officeId } = variables; + const updateKeys = [keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteAMSInstructions` + * @summary Delete AMS Instructions document + * @permission Requires `canUseDeleteAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } AMS Instructions document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteAMSInstructions = ( + options?: AppMutationOptions< + typeof WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions, + { positionId: string; amsInstructionsId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId })); + return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions( + positionId, + amsInstructionsId, + officeId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewAMSInstructions` - recommended when file should be cached + * @summary Preview AMS Instructions document + * @permission Requires `canUsePreviewAMSInstructions` ability + * @param { string } object.positionId Path parameter + * @param { string } object.amsInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewAMSInstructions = ( + { positionId, amsInstructionsId, officeId }: { positionId: string; amsInstructionsId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId })); + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions( + positionId, + amsInstructionsId, + officeId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewAMSInstructionsMutation` - recommended when file should not be cached + * @summary Preview AMS Instructions document + * @permission Requires `canUsePreviewAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewAMSInstructionsMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsAmsInstructionsApi.previewAMSInstructions, + { positionId: string; amsInstructionsId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId })); + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions( + positionId, + amsInstructionsId, + officeId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, amsInstructionsId, officeId } = variables; + const updateKeys = [keys.previewAMSInstructions(positionId, amsInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateAMSInstructions` + * @summary Generate AMS Instructions document + * @permission Requires `canUseGenerateAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateAMSInstructions = ( + options?: AppMutationOptions< + typeof WorkingDocumentsAmsInstructionsApi.generateAMSInstructions, + { + positionId: string; + amsInstructionsId: string; + officeId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId })); + return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions( + positionId, + amsInstructionsId, + officeId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts new file mode 100644 index 0000000..11d2d8f --- /dev/null +++ b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts @@ -0,0 +1,108 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsBlInstructionsAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Create", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Create", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGetBlInstructionsData` query ability. For global ability, omit the object parameter. + * @description Read BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBlInstructionsData` query + */ + export const canUseGetBlInstructionsData = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBlInstructionsData` mutation ability. For global ability, omit the object parameter. + * @description Update BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBlInstructionsData` mutation + */ + export const canUseUpdateBlInstructionsData = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useDeleteBlInstructions` mutation ability. For global ability, omit the object parameter. + * @description Delete BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBlInstructions` mutation + */ + export const canUseDeleteBlInstructions = (object?: { officeId: string }) => + [ + "Delete", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Delete", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation + */ + export const canUsePreviewBlInstructions = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGenerateBlInstructions` mutation ability. For global ability, omit the object parameter. + * @description Generate BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateBlInstructions` mutation + */ + export const canUseGenerateBlInstructions = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate BL Instructions document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ + export const canUseGenerateDocumentEml = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts new file mode 100644 index 0000000..ff9b232 --- /dev/null +++ b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts @@ -0,0 +1,116 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsBlInstructionsApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions`, + undefined, + config, + ); + }; + + export const getBlInstructionsData = ( + positionId: string, + blInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + config, + ); + }; + + export const updateBlInstructionsData = ( + positionId: string, + blInstructionsId: string, + officeId: string, + data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), + config, + ); + }; + + export const deleteBlInstructions = ( + positionId: string, + blInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + undefined, + config, + ); + }; + + export const previewBlInstructions = ( + positionId: string, + blInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generateBlInstructions = ( + positionId: string, + blInstructionsId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; + + export const generateDocumentEml = ( + positionId: string, + blInstructionsId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts new file mode 100644 index 0000000..f1fe31c --- /dev/null +++ b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts @@ -0,0 +1,472 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsBlInstructionsModels { + /** + * BlInstructionsDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { string } date Date + * @property { string } location Location + * @property { string } signer Siger + */ + export const BlInstructionsDocumentSettingsDtoDTOSchema = z + .object({ + quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), + date: z.iso.datetime({ offset: true }).describe("Date"), + location: z.string().describe("Location"), + signer: z.string().describe("Siger"), + }) + .readonly(); + export type BlInstructionsDocumentSettingsDtoDTO = z.infer; + + /** + * BlInstructionsDocumentCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ + export const BlInstructionsDocumentCountryResponseDTOSchema = z + .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) + .readonly(); + export type BlInstructionsDocumentCountryResponseDTO = z.infer; + + /** + * BlInstructionsDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + * @property { string } eori EORI number of the business partner + * @property { string } vatNumber VAT number of the business partner + */ + export const BlInstructionsDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + eori: z.string().describe("EORI number of the business partner"), + vatNumber: z.string().describe("VAT number of the business partner"), + }) + .readonly(); + export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer< + typeof BlInstructionsDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * BlInstructionsDocumentPlaceResponseDTOSchema + * @type { object } + * @property { string } id ID of the place + * @property { string } name Name of the place + */ + export const BlInstructionsDocumentPlaceResponseDTOSchema = z + .object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }) + .readonly(); + export type BlInstructionsDocumentPlaceResponseDTO = z.infer; + + /** + * AllChargesEnumSchema + * @type { enum } + */ + export const AllChargesEnumSchema = z.enum(["Prepaid", "Collect", "Automatic", "Detailed"]); + export type AllChargesEnum = z.infer; + export const AllChargesEnum = AllChargesEnumSchema.enum; + + /** + * BlInstructionsDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + * @property { string } countryCode Country ISO2 code of the port + */ + export const BlInstructionsDocumentPortResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the port"), + name: z.string().describe("Name of the port"), + countryCode: z.string().describe("Country ISO2 code of the port"), + }) + .readonly(); + export type BlInstructionsDocumentPortResponseDTO = z.infer; + + /** + * RequestedDocumentTypeEnumSchema + * @type { enum } + */ + export const RequestedDocumentTypeEnumSchema = z.enum(["SeawayBill", "Original"]); + export type RequestedDocumentTypeEnum = z.infer; + export const RequestedDocumentTypeEnum = RequestedDocumentTypeEnumSchema.enum; + + /** + * ManifestFilerStatusEnumSchema + * @type { enum } + */ + export const ManifestFilerStatusEnumSchema = z.enum(["Self", "Carrier"]); + export type ManifestFilerStatusEnum = z.infer; + export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; + + /** + * BlInstructionsDocumentCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type BlInstructionsDocumentCountryDto = z.infer; + + /** + * BlInstructionsDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the BL Instructions document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the BL Instructions document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } date Date of the BL Instructions document + * @property { string } blNumber Bill of lading number + * @property { string } exportReference Export reference number + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { BlInstructionsDocumentCountryResponseDTO } originCountry Origin country + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } additionalText Additional text for the document + * @property { number } versionNumber Version number of the document + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } buyer Buyer information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } seller Seller information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } forwarder Forwarder party information + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information + * @property { BlInstructionsDocumentPlaceResponseDTO } stowedIntoContainerCity Stowed into container city information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfAcceptanceCity Place of acceptance city information + * @property { BlInstructionsDocumentPlaceResponseDTO } originalsToBeReleasedAt + * @property { string } originalsToBeReleasedAtText + * @property { BlInstructionsDocumentPlaceResponseDTO } loadingPierTerminal + * @property { string } loadingPierTerminalText + * @property { string } precarriageByText + * @property { string } placeOfReceiptText + * @property { string } portOfLoadingText + * @property { string } portOfDischargeText + * @property { string } placeOfDeliveryText + * @property { string } vessel Name of the vessel + * @property { string } voyage Name of the vessel + * @property { CommonModels.MovementTypeEnum } movementType + * @property { string } carrierBookingNumber + * @property { string } csnNumber + * @property { string } mcinNumber + * @property { string } pcinNumber + * @property { string } dueNumber + * @property { boolean } goodsDeliveredInEu + * @property { string } rucNumber + * @property { number } shipmentDeclaredValue + * @property { string } shipmentDeclaredValueCurrency + * @property { AllChargesEnum } allCharges Base freight payment term + * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term + * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term + * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term + * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term + * @property { string } shippingInstructionsComments Free-text shipping instructions comments + * @property { string } chargePayerId Charge payer business partner ID + * @property { string } chargePayLocationId Charge pay location ID + * @property { BlInstructionsDocumentPortResponseDTO } portOfLoading Port of loading information + * @property { BlInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information + * @property { BlInstructionsDocumentSettingsDtoDTO } settings Settings for the BL Instructions document + * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data + * @property { CommonModels.CargoTableBlockDto } cargo Cargo table block (identical to House BL cargo) + * @property { string } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document + * @property { RequestedDocumentTypeEnum } requestedDocumentType + * @property { boolean } requestedDocumentFreighted + * @property { number } requestedDocumentQuantity + * @property { ManifestFilerStatusEnum } manifestFilerStatus + * @property { string } manifestFilerIdentifier + * @property { BlInstructionsDocumentCountryDto } manifestFilingCountry + */ + export const BlInstructionsDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the BL Instructions document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference").nullish(), + name: z.string().describe("Name of the BL Instructions document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document").nullish(), + blNumber: z.string().describe("Bill of lading number").nullish(), + exportReference: z.string().describe("Export reference number").nullish(), + direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), + transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), + originCountry: BlInstructionsDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), + useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), + additionalText: z.string().describe("Additional text for the document").nullish(), + versionNumber: z.number().describe("Version number of the document"), + buyer: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( + "Buyer information for the shipment", + ).nullish(), + seller: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( + "Seller information for the shipment", + ).nullish(), + consignee: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( + "Consignee information for the shipment", + ), + shipper: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), + notify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( + "Notify party information for the shipment", + ), + alsoNotify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( + "Additional notify party information", + ), + forwarder: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Forwarder party information"), + precarriageBy: + BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), + placeOfReceipt: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), + stowedIntoContainerCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe( + "Stowed into container city information", + ).nullish(), + placeOfAcceptanceCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe( + "Place of acceptance city information", + ).nullish(), + originalsToBeReleasedAt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), + originalsToBeReleasedAtText: z.string().nullish(), + loadingPierTerminal: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), + loadingPierTerminalText: z.string().nullish(), + precarriageByText: z.string().nullish(), + placeOfReceiptText: z.string().nullish(), + portOfLoadingText: z.string().nullish(), + portOfDischargeText: z.string().nullish(), + placeOfDeliveryText: z.string().nullish(), + vessel: z.string().describe("Name of the vessel").nullish(), + voyage: z.string().describe("Name of the vessel").nullish(), + movementType: CommonModels.MovementTypeEnumSchema.nullish(), + carrierBookingNumber: z.string().nullish(), + csnNumber: z.string().nullish(), + mcinNumber: z.string().nullish(), + pcinNumber: z.string().nullish(), + dueNumber: z.string().nullish(), + goodsDeliveredInEu: z.boolean().nullish(), + rucNumber: z.string().nullish(), + shipmentDeclaredValue: z.number().nullish(), + shipmentDeclaredValueCurrency: z.string().nullish(), + allCharges: AllChargesEnumSchema.describe("Base freight payment term").nullish(), + baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term").nullish(), + additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term").nullish(), + originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( + "Origin haulage charges payment term", + ).nullish(), + originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term").nullish(), + destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe( + "Destination port charges payment term", + ).nullish(), + destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( + "Destination haulage charges payment term", + ).nullish(), + shippingInstructionsComments: z.string().describe("Free-text shipping instructions comments").nullish(), + chargePayerId: z.string().describe("Charge payer business partner ID").nullish(), + chargePayLocationId: z.string().describe("Charge pay location ID").nullish(), + portOfLoading: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), + portOfDischarge: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), + placeOfDelivery: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), + settings: BlInstructionsDocumentSettingsDtoDTOSchema.describe( + "Settings for the BL Instructions document", + ).nullish(), + data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), + cargo: CommonModels.CargoTableBlockDtoSchema.describe( + "Cargo table block (identical to House BL cargo)", + ).nullish(), + bodyRemarks: z.string().describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document"), + requestedDocumentType: RequestedDocumentTypeEnumSchema.nullish(), + requestedDocumentFreighted: z.boolean().nullish(), + requestedDocumentQuantity: z.number().nullish(), + manifestFilerStatus: ManifestFilerStatusEnumSchema.nullish(), + manifestFilerIdentifier: z.string().nullish(), + manifestFilingCountry: BlInstructionsDocumentCountryDtoSchema.nullish(), + }) + .readonly(); + export type BlInstructionsDocumentResponseDTO = z.infer; + + /** + * UpdateBlInstructionsDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { string } blNumber BL number + * @property { string } exportReference Export reference number + * @property { string } location Location + * @property { string } signer Signer + * @property { string } date Date + */ + export const UpdateBlInstructionsDocumentSettingsRequestDTOSchema = z + .object({ + quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), + blNumber: z.string().describe("BL number"), + exportReference: z.string().describe("Export reference number"), + location: z.string().describe("Location"), + signer: z.string().describe("Signer"), + date: z.iso.datetime({ offset: true }).describe("Date"), + }) + .readonly(); + export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer< + typeof UpdateBlInstructionsDocumentSettingsRequestDTOSchema + >; + + /** + * UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateBlInstructionsDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } blNumber Bill of lading number + * @property { string } exportReference Export reference number + * @property { string } csnNumber + * @property { string } mcinNumber + * @property { string } pcinNumber + * @property { string } dueNumber + * @property { boolean } goodsDeliveredInEu + * @property { string } rucNumber + * @property { string } shipmentDeclaredValueCurrency + * @property { number } shipmentDeclaredValue + * @property { AllChargesEnum } allCharges All charges payment term + * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term + * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term + * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term + * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term + * @property { string } originCountryId Origin country ID + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } additionalText Additional text + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } buyer Buyer information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } seller Seller information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } forwarder Forwarder information + * @property { string } originalsToBeReleasedAtId Originals to be released at ID + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information + * @property { string } shippingInstructionsComments Shipping instructions free-text comments + * @property { string } chargePayerId Charge payer business partner ID + * @property { string } chargePayLocationId Charge pay location ID + * @property { string } precarriageById Pre-carriage by ID + * @property { string } placeOfReceiptId Place of receipt ID + * @property { string } stowedIntoContainerCityId Stowed into container city ID + * @property { string } loadingPierTerminalId Loading pier/terminal ID + * @property { string } loadingPierTerminalText + * @property { string } placeOfAcceptanceCityId Place of acceptance city ID + * @property { string } vessel Vessel name + * @property { string } voyage Vessel name + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } portOfLoadingId Port of loading ID + * @property { string } portOfDischargeId Port of discharge ID + * @property { string } placeOfDeliveryId Place of delivery ID + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { string } date Date of the BL Instructions document + * @property { UpdateBlInstructionsDocumentSettingsRequestDTO } settings Settings + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data + * @property { RequestedDocumentTypeEnum } requestedDocumentType + * @property { boolean } requestedDocumentFreighted + * @property { number } requestedDocumentQuantity + * @property { string } precarriageByText + * @property { string } placeOfReceiptText + * @property { string } portOfLoadingText + * @property { string } portOfDischargeText + * @property { string } placeOfDeliveryText + * @property { ManifestFilerStatusEnum } manifestFilerStatus + * @property { string } manifestFilingCountryId + * @property { string } manifestFilerIdentifier + */ + export const UpdateBlInstructionsDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Document name suffix"), + blNumber: z.string().describe("Bill of lading number"), + exportReference: z.string().describe("Export reference number"), + csnNumber: z.string(), + mcinNumber: z.string(), + pcinNumber: z.string(), + dueNumber: z.string(), + goodsDeliveredInEu: z.boolean(), + rucNumber: z.string(), + shipmentDeclaredValueCurrency: z.string(), + shipmentDeclaredValue: z.number(), + allCharges: AllChargesEnumSchema.describe("All charges payment term"), + baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term"), + additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term"), + originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin haulage charges payment term"), + originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term"), + destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination port charges payment term"), + destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( + "Destination haulage charges payment term", + ), + originCountryId: z.string().describe("Origin country ID"), + useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), + additionalText: z.string().describe("Additional text"), + consignee: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), + shipper: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), + buyer: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), + seller: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), + forwarder: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), + originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), + originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), + notify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), + alsoNotify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), + shippingInstructionsComments: z.string().describe("Shipping instructions free-text comments"), + chargePayerId: z.string().describe("Charge payer business partner ID"), + chargePayLocationId: z.string().describe("Charge pay location ID"), + precarriageById: z.string().describe("Pre-carriage by ID"), + placeOfReceiptId: z.string().describe("Place of receipt ID"), + stowedIntoContainerCityId: z.string().describe("Stowed into container city ID"), + loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), + loadingPierTerminalText: z.string(), + placeOfAcceptanceCityId: z.string().describe("Place of acceptance city ID"), + vessel: z.string().describe("Vessel name"), + voyage: z.string().describe("Vessel name"), + carrierBookingNumber: z.string().describe("Carrier booking number"), + portOfLoadingId: z.string().describe("Port of loading ID"), + portOfDischargeId: z.string().describe("Port of discharge ID"), + placeOfDeliveryId: z.string().describe("Place of delivery ID"), + suppressWeight: z.boolean().describe("Whether to suppress weight information"), + suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), + bodyRemarks: z.string().describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document"), + settings: UpdateBlInstructionsDocumentSettingsRequestDTOSchema.describe("Settings"), + data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), + requestedDocumentType: RequestedDocumentTypeEnumSchema, + requestedDocumentFreighted: z.boolean(), + requestedDocumentQuantity: z.number(), + precarriageByText: z.string(), + placeOfReceiptText: z.string(), + portOfLoadingText: z.string(), + portOfDischargeText: z.string(), + placeOfDeliveryText: z.string(), + manifestFilerStatus: ManifestFilerStatusEnumSchema, + manifestFilingCountryId: z.string(), + manifestFilerIdentifier: z.string(), + }) + .readonly(); + export type UpdateBlInstructionsDocumentRequestDTO = z.infer; +} diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts new file mode 100644 index 0000000..9736675 --- /dev/null +++ b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts @@ -0,0 +1,341 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsBlInstructionsAcl } from "./workingDocumentsBlInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsBlInstructionsApi } from "./workingDocumentsBlInstructions.api"; + +export namespace WorkingDocumentsBlInstructionsQueries { + export const moduleName = QueryModule.WorkingDocumentsBlInstructions; + + export const keys = { + all: [moduleName] as const, + getBlInstructionsData: (positionId: string, blInstructionsId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId", + positionId, + blInstructionsId, + officeId, + ] as const, + previewBlInstructions: (positionId: string, blInstructionsId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId/preview", + positionId, + blInstructionsId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a BL Instructions document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.create, + { positionId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId })); + return WorkingDocumentsBlInstructionsApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetBlInstructionsData` + * @summary Get BL Instructions document data + * @permission Requires `canUseGetBlInstructionsData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.blInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetBlInstructionsData = ( + { positionId, blInstructionsId, officeId }: { positionId: string; blInstructionsId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId })); + return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateBlInstructionsData` + * @summary Update BL Instructions document data + * @permission Requires `canUseUpdateBlInstructionsData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBlInstructionsData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.updateBlInstructionsData, + { + positionId: string; + blInstructionsId: string; + officeId: string; + data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId })); + return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData( + positionId, + blInstructionsId, + officeId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.getBlInstructionsData(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteBlInstructions` + * @summary Delete BL Instructions document + * @permission Requires `canUseDeleteBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } BL Instructions document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteBlInstructions = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.deleteBlInstructions, + { positionId: string; blInstructionsId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId })); + return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewBlInstructions` - recommended when file should be cached + * @summary Preview BL Instructions document + * @permission Requires `canUsePreviewBlInstructions` ability + * @param { string } object.positionId Path parameter + * @param { string } object.blInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewBlInstructions = ( + { positionId, blInstructionsId, officeId }: { positionId: string; blInstructionsId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId })); + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewBlInstructionsMutation` - recommended when file should not be cached + * @summary Preview BL Instructions document + * @permission Requires `canUsePreviewBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewBlInstructionsMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.previewBlInstructions, + { positionId: string; blInstructionsId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId })); + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateBlInstructions` + * @summary Generate BL Instructions document + * @permission Requires `canUseGenerateBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateBlInstructions = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.generateBlInstructions, + { + positionId: string; + blInstructionsId: string; + officeId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId })); + return WorkingDocumentsBlInstructionsApi.generateBlInstructions( + positionId, + blInstructionsId, + officeId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate BL Instructions document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGenerateDocumentEml = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.generateDocumentEml, + { + positionId: string; + blInstructionsId: string; + officeId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId })); + return WorkingDocumentsBlInstructionsApi.generateDocumentEml( + positionId, + blInstructionsId, + officeId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts new file mode 100644 index 0000000..2e1de75 --- /dev/null +++ b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsCmrFormAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Create", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; + + /** + * Use for `useGetCmrData` query ability. For global ability, omit the object parameter. + * @description Read CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCmrData` query + */ + export const canUseGetCmrData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Read", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCmrData` mutation ability. For global ability, omit the object parameter. + * @description Update CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCmrData` mutation + */ + export const canUseUpdateCmrData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Update", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; + + /** + * Use for `useDeleteCmr` mutation ability. For global ability, omit the object parameter. + * @description Delete CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCmr` mutation + */ + export const canUseDeleteCmr = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Delete", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; + + /** + * Use for `usePreviewCmr` query or `usePreviewCmrMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewCmr` query or `usePreviewCmrMutation` mutation + */ + export const canUsePreviewCmr = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Read", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; + + /** + * Use for `useGenerateCmr` mutation ability. For global ability, omit the object parameter. + * @description Generate CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateCmr` mutation + */ + export const canUseGenerateCmr = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Update", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts new file mode 100644 index 0000000..982a193 --- /dev/null +++ b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsCmrFormApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs`, + undefined, + config, + ); + }; + + export const getCmrData = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + config, + ); + }; + + export const updateCmrData = ( + positionId: string, + cmrId: string, + officeId: string, + data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), + config, + ); + }; + + export const deleteCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + undefined, + config, + ); + }; + + export const previewCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generateCmr = ( + positionId: string, + cmrId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts new file mode 100644 index 0000000..4cc9266 --- /dev/null +++ b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts @@ -0,0 +1,320 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsCmrFormModels { + /** + * CmrDocumentLanguageSchema + * @type { enum } + */ + export const CmrDocumentLanguageSchema = z.enum(["en", "fr", "de"]); + export type CmrDocumentLanguage = z.infer; + export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; + + /** + * CmrDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CmrDocumentLanguage } primaryLanguage Primary language + * @property { CmrDocumentLanguage } secondaryLanguage Secondary language + */ + export const CmrDocumentSettingsDtoDTOSchema = z + .object({ + primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), + secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language"), + }) + .readonly(); + export type CmrDocumentSettingsDtoDTO = z.infer; + + /** + * CmrDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const CmrDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type CmrDocumentBusinessPartnerResponseDTO = z.infer; + + /** + * CmrDocumentCityResponseDTOSchema + * @type { object } + * @property { string } cityId ID of the city + * @property { string } cityName Name of the city + * @property { string } date Date of delivery/takeover + * @property { string } countryName Country name + */ + export const CmrDocumentCityResponseDTOSchema = z + .object({ + cityId: z.string().describe("ID of the city"), + cityName: z.string().describe("Name of the city"), + date: z.iso.datetime({ offset: true }).describe("Date of delivery/takeover").nullish(), + countryName: z.string().describe("Country name").nullish(), + }) + .readonly(); + export type CmrDocumentCityResponseDTO = z.infer; + + /** + * CmrDocumentCostsResponseDTOSchema + * @type { object } + * @property { number } carriageCharges Carriage charges + * @property { number } reductions Reductions + * @property { number } balance Balance + * @property { number } supplements Supplements + * @property { number } miscellaneous Miscellaneous charges + * @property { number } total Total amount + */ + export const CmrDocumentCostsResponseDTOSchema = z + .object({ + carriageCharges: z.number().describe("Carriage charges"), + reductions: z.number().describe("Reductions"), + balance: z.number().describe("Balance"), + supplements: z.number().describe("Supplements"), + miscellaneous: z.number().describe("Miscellaneous charges"), + total: z.number().describe("Total amount"), + }) + .readonly(); + export type CmrDocumentCostsResponseDTO = z.infer; + + /** + * CmrDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { number } quantity Quantity of packages + * @property { string } description Description of the cargo + * @property { string } packageType + * @property { string } statisticNumber + * @property { string } positionNumber Position number of the cargo + * @property { number } grossWeight Gross weight of the cargo + * @property { number } volume Volume of the cargo + * @property { string } containerNumber Container number of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + */ + export const CmrDocumentCargoResponseDTOSchema = z + .object({ + caseMarks: z.string().describe("Case marks of the cargo"), + quantity: z.number().describe("Quantity of packages"), + description: z.string().describe("Description of the cargo"), + packageType: z.string(), + statisticNumber: z.string(), + positionNumber: z.string().describe("Position number of the cargo"), + grossWeight: z.number().describe("Gross weight of the cargo"), + volume: z.number().describe("Volume of the cargo"), + containerNumber: z.string().describe("Container number of the cargo"), + seal1: z.string().describe("Seal number 1 of the cargo"), + seal2: z.string().describe("Seal number 2 of the cargo"), + }) + .readonly(); + export type CmrDocumentCargoResponseDTO = z.infer; + + /** + * CmrDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } positionNumber Position number + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { number } versionNumber Version number of the document + * @property { string } cmrNumber CMR number + * @property { CmrDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { CmrDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { CmrDocumentBusinessPartnerResponseDTO } carrier Carrier information + * @property { CmrDocumentBusinessPartnerResponseDTO } successiveCarrier Successive carrier information + * @property { CmrDocumentCityResponseDTO } delivery Delivery information + * @property { CmrDocumentCityResponseDTO } takeover Takeover information + * @property { string } annexedDocuments Annexed documents + * @property { string } carriersObservations Carriers observations + * @property { string } senderInstructions Sender instructions + * @property { string } reimbursement Reimbursement information + * @property { string } specialAgreements Special agreements + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { boolean } freightPaid Whether freight is paid + * @property { boolean } freightToBePaid Whether freight is to be paid + * @property { string } creationPlace Place of creation + * @property { string } creationDate Date of creation + * @property { CmrDocumentCostsResponseDTO } costsForShipper Costs for shipper + * @property { CmrDocumentCostsResponseDTO } costsForConsignee Costs for consignee + * @property { string[] } selectedCargoIds List of selected cargo IDs + * @property { CmrDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CmrDocumentSettingsDtoDTO } settings Settings for the BL Instructions document + */ + export const CmrDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the document"), + name: z.string().describe("Name of the document"), + positionNumber: z.string().describe("Position number"), + nameSuffix: z.string().describe("Name suffix of the document").nullish(), + defaultFileName: z.string(), + positionId: z.string().describe("Position ID"), + versionNumber: z.number().describe("Version number of the document"), + cmrNumber: z.string().describe("CMR number").nullish(), + consignee: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), + shipper: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), + carrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Carrier information").nullish(), + successiveCarrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe( + "Successive carrier information", + ).nullish(), + delivery: CmrDocumentCityResponseDTOSchema.describe("Delivery information").nullish(), + takeover: CmrDocumentCityResponseDTOSchema.describe("Takeover information").nullish(), + annexedDocuments: z.string().describe("Annexed documents").nullish(), + carriersObservations: z.string().describe("Carriers observations").nullish(), + senderInstructions: z.string().describe("Sender instructions").nullish(), + reimbursement: z.string().describe("Reimbursement information").nullish(), + specialAgreements: z.string().describe("Special agreements").nullish(), + suppressWeight: z.boolean().describe("Whether to suppress weight information"), + suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), + freightPaid: z.boolean().describe("Whether freight is paid"), + freightToBePaid: z.boolean().describe("Whether freight is to be paid"), + creationPlace: z.string().describe("Place of creation"), + creationDate: z.string().describe("Date of creation"), + costsForShipper: CmrDocumentCostsResponseDTOSchema.describe("Costs for shipper").nullish(), + costsForConsignee: CmrDocumentCostsResponseDTOSchema.describe("Costs for consignee").nullish(), + selectedCargoIds: z.array(z.string()).readonly().describe("List of selected cargo IDs"), + cargo: z.array(CmrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), + config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + settings: CmrDocumentSettingsDtoDTOSchema.describe("Settings for the BL Instructions document").nullish(), + }) + .readonly(); + export type CmrDocumentResponseDTO = z.infer; + + /** + * UpdateCmrDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CmrDocumentLanguage } primaryLanguage Primary language + * @property { CmrDocumentLanguage } secondaryLanguage Secondary language + */ + export const UpdateCmrDocumentSettingsRequestDTOSchema = z + .object({ + primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), + secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language"), + }) + .readonly(); + export type UpdateCmrDocumentSettingsRequestDTO = z.infer; + + /** + * UpdateCmrDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateCmrDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateCmrDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateCmrDocumentDeliveryRequestDTOSchema + * @type { object } + * @property { string } cityId City ID + * @property { string } cityName City name + * @property { string } date Date + */ + export const UpdateCmrDocumentDeliveryRequestDTOSchema = z + .object({ + cityId: z.string().describe("City ID"), + cityName: z.string().describe("City name"), + date: z.iso.datetime({ offset: true }).describe("Date"), + }) + .readonly(); + export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; + + /** + * UpdateCmrDocumentCostsRequestDTOSchema + * @type { object } + * @property { number } carriageCharges Carriage charges + * @property { number } reductions Reductions + * @property { number } balance Balance + * @property { number } supplements Supplements + * @property { number } miscellaneous Miscellaneous + * @property { number } total Total + */ + export const UpdateCmrDocumentCostsRequestDTOSchema = z + .object({ + carriageCharges: z.number().describe("Carriage charges"), + reductions: z.number().describe("Reductions"), + balance: z.number().describe("Balance"), + supplements: z.number().describe("Supplements"), + miscellaneous: z.number().describe("Miscellaneous"), + total: z.number().describe("Total"), + }) + .readonly(); + export type UpdateCmrDocumentCostsRequestDTO = z.infer; + + /** + * UpdateCmrDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } cmrNumber CMR number + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } carrier Carrier information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } successiveCarrier Successive carrier information + * @property { UpdateCmrDocumentDeliveryRequestDTO } delivery Delivery information + * @property { UpdateCmrDocumentDeliveryRequestDTO } takeover Takeover information + * @property { string } annexedDocuments Annexed documents + * @property { string } carriersObservations Carriers observations + * @property { string } senderInstructions Sender instructions + * @property { string } reimbursement Reimbursement + * @property { string } specialAgreements Special agreements + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { boolean } freightPaid Whether freight is paid + * @property { boolean } freightToBePaid Whether freight is to be paid + * @property { string } creationPlace Place of creation + * @property { string } creationDate Date of creation + * @property { UpdateCmrDocumentCostsRequestDTO } costsForShipper Costs for shipper + * @property { UpdateCmrDocumentCostsRequestDTO } costsForConsignee Costs for consignee + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { UpdateCmrDocumentSettingsRequestDTO } settings Settings + */ + export const UpdateCmrDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Name suffix"), + cmrNumber: z.string().describe("CMR number"), + consignee: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), + shipper: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), + carrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Carrier information"), + successiveCarrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Successive carrier information"), + delivery: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Delivery information"), + takeover: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Takeover information"), + annexedDocuments: z.string().describe("Annexed documents"), + carriersObservations: z.string().describe("Carriers observations"), + senderInstructions: z.string().describe("Sender instructions"), + reimbursement: z.string().describe("Reimbursement"), + specialAgreements: z.string().describe("Special agreements"), + suppressWeight: z.boolean().describe("Whether to suppress weight information"), + suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), + freightPaid: z.boolean().describe("Whether freight is paid"), + freightToBePaid: z.boolean().describe("Whether freight is to be paid"), + creationPlace: z.string().describe("Place of creation"), + creationDate: z.string().describe("Date of creation"), + costsForShipper: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for shipper"), + costsForConsignee: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for consignee"), + selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + settings: UpdateCmrDocumentSettingsRequestDTOSchema.describe("Settings"), + }) + .readonly(); + export type UpdateCmrDocumentRequestDTO = z.infer; +} diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts new file mode 100644 index 0000000..213063b --- /dev/null +++ b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsCmrFormAcl } from "./workingDocumentsCmrForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsCmrFormApi } from "./workingDocumentsCmrForm.api"; + +export namespace WorkingDocumentsCmrFormQueries { + export const moduleName = QueryModule.WorkingDocumentsCmrForm; + + export const keys = { + all: [moduleName] as const, + getCmrData: (positionId: string, cmrId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId", positionId, cmrId, officeId] as const, + previewCmr: (positionId: string, cmrId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/cmrs/:cmrId/preview", + positionId, + cmrId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a CMR document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId })); + return WorkingDocumentsCmrFormApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetCmrData` + * @summary Get CMR document data + * @permission Requires `canUseGetCmrData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.cmrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCmrData = ( + { positionId, cmrId, officeId }: { positionId: string; cmrId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCmrData(positionId, cmrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId })); + return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCmrData` + * @summary Update CMR document data + * @permission Requires `canUseUpdateCmrData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCmrData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsCmrFormApi.updateCmrData, + { + positionId: string; + cmrId: string; + officeId: string; + data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId, data }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId })); + return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, cmrId, officeId } = variables; + const updateKeys = [keys.getCmrData(positionId, cmrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteCmr` + * @summary Delete CMR document + * @permission Requires `canUseDeleteCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } CMR document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteCmr = ( + options?: AppMutationOptions< + typeof WorkingDocumentsCmrFormApi.deleteCmr, + { positionId: string; cmrId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId })); + return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewCmr` - recommended when file should be cached + * @summary Preview CMR document + * @permission Requires `canUsePreviewCmr` ability + * @param { string } object.positionId Path parameter + * @param { string } object.cmrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewCmr = ( + { positionId, cmrId, officeId }: { positionId: string; cmrId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewCmr(positionId, cmrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId })); + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewCmrMutation` - recommended when file should not be cached + * @summary Preview CMR document + * @permission Requires `canUsePreviewCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewCmrMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsCmrFormApi.previewCmr, + { positionId: string; cmrId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId })); + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, cmrId, officeId } = variables; + const updateKeys = [keys.previewCmr(positionId, cmrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateCmr` + * @summary Generate CMR document + * @permission Requires `canUseGenerateCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateCmr = ( + options?: AppMutationOptions< + typeof WorkingDocumentsCmrFormApi.generateCmr, + { positionId: string; cmrId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId, data }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId })); + return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts new file mode 100644 index 0000000..96a5c3a --- /dev/null +++ b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts @@ -0,0 +1,99 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsExportDeclarationAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Create", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Create", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; + + /** + * Use for `useGetExportDeclarationData` query ability. For global ability, omit the object parameter. + * @description Read export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetExportDeclarationData` query + */ + export const canUseGetExportDeclarationData = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Read", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; + + /** + * Use for `useUpdateExportDeclarationData` mutation ability. For global ability, omit the object parameter. + * @description Update export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateExportDeclarationData` mutation + */ + export const canUseUpdateExportDeclarationData = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Update", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; + + /** + * Use for `useDeleteExportDeclaration` mutation ability. For global ability, omit the object parameter. + * @description Delete export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteExportDeclaration` mutation + */ + export const canUseDeleteExportDeclaration = (object?: { officeId: string }) => + [ + "Delete", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Delete", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; + + /** + * Use for `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation + */ + export const canUsePreviewExportDeclaration = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Read", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; + + /** + * Use for `useGenerateExportDeclaration` mutation ability. For global ability, omit the object parameter. + * @description Generate export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateExportDeclaration` mutation + */ + export const canUseGenerateExportDeclaration = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Update", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts new file mode 100644 index 0000000..e1bd922 --- /dev/null +++ b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts @@ -0,0 +1,94 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsExportDeclarationApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations`, + undefined, + config, + ); + }; + + export const getExportDeclarationData = ( + officeId: string, + positionId: string, + exportDeclarationId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + config, + ); + }; + + export const updateExportDeclarationData = ( + officeId: string, + positionId: string, + exportDeclarationId: string, + data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), + config, + ); + }; + + export const deleteExportDeclaration = ( + positionId: string, + exportDeclarationId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + undefined, + config, + ); + }; + + export const previewExportDeclaration = ( + officeId: string, + positionId: string, + exportDeclarationId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generateExportDeclaration = ( + officeId: string, + positionId: string, + exportDeclarationId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts new file mode 100644 index 0000000..3aca835 --- /dev/null +++ b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts @@ -0,0 +1,179 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsExportDeclarationModels { + /** + * ExportDeclarationDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer< + typeof ExportDeclarationDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * ExportDeclarationDocumentCargoResponseDTOSchema + * @type { object } + * @property { number } quantity Quantity of packages + * @property { number } weight Weight of the cargo + * @property { number } length Length of the cargo + * @property { number } width Width of the cargo + * @property { number } height Height of the cargo + * @property { string } packageType Type of package + * @property { string } positionNumber Position number + */ + export const ExportDeclarationDocumentCargoResponseDTOSchema = z + .object({ + quantity: z.number().describe("Quantity of packages"), + weight: z.number().describe("Weight of the cargo"), + length: z.number().describe("Length of the cargo"), + width: z.number().describe("Width of the cargo"), + height: z.number().describe("Height of the cargo"), + packageType: z.string().describe("Type of package"), + positionNumber: z.string().describe("Position number"), + }) + .readonly(); + export type ExportDeclarationDocumentCargoResponseDTO = z.infer< + typeof ExportDeclarationDocumentCargoResponseDTOSchema + >; + + /** + * ExportDeclarationDocumentRouteResponseDTOSchema + * @type { object } + * @property { string } pickupDate Pickup date + * @property { string } deliveryDate Delivery date + * @property { string } pickupCity Pickup city + * @property { string } deliveryCity Delivery city + */ + export const ExportDeclarationDocumentRouteResponseDTOSchema = z + .object({ + pickupDate: z.string().describe("Pickup date"), + deliveryDate: z.string().describe("Delivery date"), + pickupCity: z.string().describe("Pickup city"), + deliveryCity: z.string().describe("Delivery city"), + }) + .readonly(); + export type ExportDeclarationDocumentRouteResponseDTO = z.infer< + typeof ExportDeclarationDocumentRouteResponseDTOSchema + >; + + /** + * ExportDeclarationDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the export declaration document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the export declaration document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } dateOfHandover Date when the goods are handed over for export + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { string } issuerName Name of the issuer + * @property { string } issuerAddress Address of the issuer + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } customer Customer information + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { string } selectedCargoId ID of the selected cargo + * @property { ExportDeclarationDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { ExportDeclarationDocumentRouteResponseDTO } route Route information + * @property { string } signingPlace Place where the document is signed + * @property { string } signingDate Date when the document is signed + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } signedBy Information about who signed the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ + export const ExportDeclarationDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the export declaration document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference").nullish(), + name: z.string().describe("Name of the export declaration document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + dateOfHandover: z.iso + .datetime({ offset: true }) + .describe("Date when the goods are handed over for export") + .nullish(), + direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), + transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), + versionNumber: z.number().describe("Version number of the document"), + issuerName: z.string().describe("Name of the issuer").nullish(), + issuerAddress: z.string().describe("Address of the issuer").nullish(), + customer: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Customer information").nullish(), + shipper: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), + consignee: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), + selectedCargoId: z.string().describe("ID of the selected cargo").nullish(), + cargo: z + .array(ExportDeclarationDocumentCargoResponseDTOSchema) + .readonly() + .describe("List of cargo information") + .nullish(), + route: ExportDeclarationDocumentRouteResponseDTOSchema.describe("Route information").nullish(), + signingPlace: z.string().describe("Place where the document is signed").nullish(), + signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed").nullish(), + signedBy: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe( + "Information about who signed the document", + ).nullish(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document").nullish(), + }) + .readonly(); + export type ExportDeclarationDocumentResponseDTO = z.infer; + + /** + * UpdateExportDeclarationDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } dateOfHandover Date when goods are handed over for export + * @property { string } issuerName Name of the issuer + * @property { string } issuerAddress Address of the issuer + * @property { string } customerId Customer ID + * @property { string } customerAddress Customer address + * @property { string } shipperId Shipper ID + * @property { string } shipperAddress Shipper address + * @property { string } consigneeId Consignee ID + * @property { string } consigneeAddress Consignee address + * @property { string } selectedCargoId Selected cargo ID + * @property { string } signingPlace Place where the document is signed + * @property { string } signingDate Date when the document is signed + * @property { string } signedByEmployeeId ID of the employee who signed the document + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateExportDeclarationDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Name suffix"), + dateOfHandover: z.iso.datetime({ offset: true }).describe("Date when goods are handed over for export"), + issuerName: z.string().describe("Name of the issuer"), + issuerAddress: z.string().describe("Address of the issuer"), + customerId: z.string().describe("Customer ID"), + customerAddress: z.string().describe("Customer address"), + shipperId: z.string().describe("Shipper ID"), + shipperAddress: z.string().describe("Shipper address"), + consigneeId: z.string().describe("Consignee ID"), + consigneeAddress: z.string().describe("Consignee address"), + selectedCargoId: z.string().describe("Selected cargo ID"), + signingPlace: z.string().describe("Place where the document is signed"), + signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed"), + signedByEmployeeId: z.string().describe("ID of the employee who signed the document"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateExportDeclarationDocumentRequestDTO = z.infer< + typeof UpdateExportDeclarationDocumentRequestDTOSchema + >; +} diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts new file mode 100644 index 0000000..cd2bfa6 --- /dev/null +++ b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts @@ -0,0 +1,320 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsExportDeclarationAcl } from "./workingDocumentsExportDeclaration.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsExportDeclarationApi } from "./workingDocumentsExportDeclaration.api"; + +export namespace WorkingDocumentsExportDeclarationQueries { + export const moduleName = QueryModule.WorkingDocumentsExportDeclaration; + + export const keys = { + all: [moduleName] as const, + getExportDeclarationData: (officeId: string, positionId: string, exportDeclarationId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId", + officeId, + positionId, + exportDeclarationId, + ] as const, + previewExportDeclaration: (officeId: string, positionId: string, exportDeclarationId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId/preview", + officeId, + positionId, + exportDeclarationId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create an export declaration document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof WorkingDocumentsExportDeclarationApi.create, + { positionId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId })); + return WorkingDocumentsExportDeclarationApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetExportDeclarationData` + * @summary Get export declaration document data + * @permission Requires `canUseGetExportDeclarationData` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.exportDeclarationId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetExportDeclarationData = ( + { + officeId, + positionId, + exportDeclarationId, + }: { officeId: string; positionId: string; exportDeclarationId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), + queryFn: () => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId })); + return WorkingDocumentsExportDeclarationApi.getExportDeclarationData( + officeId, + positionId, + exportDeclarationId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateExportDeclarationData` + * @summary Update export declaration document data + * @permission Requires `canUseUpdateExportDeclarationData` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateExportDeclarationData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsExportDeclarationApi.updateExportDeclarationData, + { + officeId: string; + positionId: string; + exportDeclarationId: string; + data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId })); + return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData( + officeId, + positionId, + exportDeclarationId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, exportDeclarationId } = variables; + const updateKeys = [keys.getExportDeclarationData(officeId, positionId, exportDeclarationId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteExportDeclaration` + * @summary Delete export declaration document + * @permission Requires `canUseDeleteExportDeclaration` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Export declaration document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteExportDeclaration = ( + options?: AppMutationOptions< + typeof WorkingDocumentsExportDeclarationApi.deleteExportDeclaration, + { positionId: string; exportDeclarationId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, exportDeclarationId, officeId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId })); + return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration( + positionId, + exportDeclarationId, + officeId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewExportDeclaration` - recommended when file should be cached + * @summary Preview export declaration document + * @permission Requires `canUsePreviewExportDeclaration` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.exportDeclarationId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewExportDeclaration = ( + { + officeId, + positionId, + exportDeclarationId, + }: { officeId: string; positionId: string; exportDeclarationId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), + queryFn: () => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId })); + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration( + officeId, + positionId, + exportDeclarationId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewExportDeclarationMutation` - recommended when file should not be cached + * @summary Preview export declaration document + * @permission Requires `canUsePreviewExportDeclaration` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewExportDeclarationMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsExportDeclarationApi.previewExportDeclaration, + { officeId: string; positionId: string; exportDeclarationId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId })); + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration( + officeId, + positionId, + exportDeclarationId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, exportDeclarationId } = variables; + const updateKeys = [keys.previewExportDeclaration(officeId, positionId, exportDeclarationId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateExportDeclaration` + * @summary Generate export declaration document + * @permission Requires `canUseGenerateExportDeclaration` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateExportDeclaration = ( + options?: AppMutationOptions< + typeof WorkingDocumentsExportDeclarationApi.generateExportDeclaration, + { + officeId: string; + positionId: string; + exportDeclarationId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId })); + return WorkingDocumentsExportDeclarationApi.generateExportDeclaration( + officeId, + positionId, + exportDeclarationId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts new file mode 100644 index 0000000..3860d00 --- /dev/null +++ b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsFcrFormAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Create", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; + + /** + * Use for `useGetFcrData` query ability. For global ability, omit the object parameter. + * @description Read FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetFcrData` query + */ + export const canUseGetFcrData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Read", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; + + /** + * Use for `useUpdateFcrData` mutation ability. For global ability, omit the object parameter. + * @description Update FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateFcrData` mutation + */ + export const canUseUpdateFcrData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Update", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; + + /** + * Use for `useDeleteFcr` mutation ability. For global ability, omit the object parameter. + * @description Delete FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteFcr` mutation + */ + export const canUseDeleteFcr = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Delete", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; + + /** + * Use for `usePreviewFcr` query or `usePreviewFcrMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewFcr` query or `usePreviewFcrMutation` mutation + */ + export const canUsePreviewFcr = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Read", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; + + /** + * Use for `useGenerateFcr` mutation ability. For global ability, omit the object parameter. + * @description Generate FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateFcr` mutation + */ + export const canUseGenerateFcr = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Update", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts new file mode 100644 index 0000000..590f307 --- /dev/null +++ b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsFcrFormApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs`, + undefined, + config, + ); + }; + + export const getFcrData = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + config, + ); + }; + + export const updateFcrData = ( + positionId: string, + fcrId: string, + officeId: string, + data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), + config, + ); + }; + + export const deleteFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + undefined, + config, + ); + }; + + export const previewFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generateFcr = ( + positionId: string, + fcrId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts new file mode 100644 index 0000000..ea713a5 --- /dev/null +++ b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts @@ -0,0 +1,150 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsFcrFormModels { + /** + * FcrDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const FcrDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type FcrDocumentBusinessPartnerResponseDTO = z.infer; + + /** + * FcrDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { string } containerNumber Container number + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + * @property { number } quantity Quantity of the cargo + * @property { string } description Description of the cargo + * @property { number } weight Weight of the cargo + * @property { number } volume Volume of the cargo + */ + export const FcrDocumentCargoResponseDTOSchema = z + .object({ + caseMarks: z.string().describe("Case marks of the cargo"), + containerNumber: z.string().describe("Container number"), + seal1: z.string().describe("Seal number 1 of the cargo"), + seal2: z.string().describe("Seal number 2 of the cargo"), + quantity: z.number().describe("Quantity of the cargo"), + description: z.string().describe("Description of the cargo"), + weight: z.number().describe("Weight of the cargo"), + volume: z.number().describe("Volume of the cargo"), + }) + .readonly(); + export type FcrDocumentCargoResponseDTO = z.infer; + + /** + * FcrDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { number } versionNumber Version number of the document + * @property { string } fcrNumber FCR number + * @property { string } edvNumber EDV number + * @property { number } numberOfOriginals Number of originals + * @property { string } placeOfLoading Place of loading + * @property { string } dateOfLoading Date of loading + * @property { string } viaCity Via city + * @property { string } toDestination To destination + * @property { string } transportMode Transport mode + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } issuePlace Issue place + * @property { string } issueDate Issue date + * @property { string } deliveryTerms Delivery terms + * @property { FcrDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { FcrDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { FcrDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ + export const FcrDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the document"), + name: z.string().describe("Name of the document"), + nameSuffix: z.string().describe("Name suffix of the document").nullish(), + defaultFileName: z.string(), + positionId: z.string().describe("Position ID"), + positionNumber: z.string().describe("Position number"), + versionNumber: z.number().describe("Version number of the document"), + fcrNumber: z.string().describe("FCR number").nullish(), + edvNumber: z.string().describe("EDV number").nullish(), + numberOfOriginals: z.number().describe("Number of originals"), + placeOfLoading: z.string().describe("Place of loading").nullish(), + dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading").nullish(), + viaCity: z.string().describe("Via city").nullish(), + toDestination: z.string().describe("To destination").nullish(), + transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + issuePlace: z.string().describe("Issue place").nullish(), + issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), + deliveryTerms: z.string().describe("Delivery terms").nullish(), + shipper: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), + consignee: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), + cargo: z.array(FcrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), + config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), + }) + .readonly(); + export type FcrDocumentResponseDTO = z.infer; + + /** + * UpdateFcrDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } fcrNumber FCR number + * @property { string } edvNumber EDV number + * @property { number } numberOfOriginals Number of originals + * @property { string } placeOfLoading Place of loading + * @property { string } dateOfLoading Date of loading + * @property { string } viaCity Via city + * @property { string } toDestination To destination + * @property { string } transportMode Transport mode + * @property { string } issuePlace Issue place + * @property { string } issueDate Issue date + * @property { string } deliveryTerms Delivery terms + * @property { string } shipperId Shipper ID + * @property { string } shipperAddress Shipper address + * @property { string } consigneeId Consignee ID + * @property { string } consigneeAddress Consignee address + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateFcrDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Name suffix"), + fcrNumber: z.string().describe("FCR number"), + edvNumber: z.string().describe("EDV number"), + numberOfOriginals: z.number().describe("Number of originals"), + placeOfLoading: z.string().describe("Place of loading"), + dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading"), + viaCity: z.string().describe("Via city"), + toDestination: z.string().describe("To destination"), + transportMode: z.string().describe("Transport mode"), + issuePlace: z.string().describe("Issue place"), + issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), + deliveryTerms: z.string().describe("Delivery terms"), + shipperId: z.string().describe("Shipper ID"), + shipperAddress: z.string().describe("Shipper address"), + consigneeId: z.string().describe("Consignee ID"), + consigneeAddress: z.string().describe("Consignee address"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateFcrDocumentRequestDTO = z.infer; +} diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts new file mode 100644 index 0000000..7e9a7d2 --- /dev/null +++ b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsFcrFormAcl } from "./workingDocumentsFcrForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsFcrFormApi } from "./workingDocumentsFcrForm.api"; + +export namespace WorkingDocumentsFcrFormQueries { + export const moduleName = QueryModule.WorkingDocumentsFcrForm; + + export const keys = { + all: [moduleName] as const, + getFcrData: (positionId: string, fcrId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId", positionId, fcrId, officeId] as const, + previewFcr: (positionId: string, fcrId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/fcrs/:fcrId/preview", + positionId, + fcrId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create an FCR document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId })); + return WorkingDocumentsFcrFormApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetFcrData` + * @summary Get FCR document data + * @permission Requires `canUseGetFcrData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.fcrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetFcrData = ( + { positionId, fcrId, officeId }: { positionId: string; fcrId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getFcrData(positionId, fcrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId })); + return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateFcrData` + * @summary Update FCR document data + * @permission Requires `canUseUpdateFcrData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateFcrData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsFcrFormApi.updateFcrData, + { + positionId: string; + fcrId: string; + officeId: string; + data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId, data }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId })); + return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, fcrId, officeId } = variables; + const updateKeys = [keys.getFcrData(positionId, fcrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteFcr` + * @summary Delete FCR document + * @permission Requires `canUseDeleteFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } FCR document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteFcr = ( + options?: AppMutationOptions< + typeof WorkingDocumentsFcrFormApi.deleteFcr, + { positionId: string; fcrId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId })); + return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewFcr` - recommended when file should be cached + * @summary Preview FCR document + * @permission Requires `canUsePreviewFcr` ability + * @param { string } object.positionId Path parameter + * @param { string } object.fcrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewFcr = ( + { positionId, fcrId, officeId }: { positionId: string; fcrId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewFcr(positionId, fcrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId })); + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewFcrMutation` - recommended when file should not be cached + * @summary Preview FCR document + * @permission Requires `canUsePreviewFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewFcrMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsFcrFormApi.previewFcr, + { positionId: string; fcrId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId })); + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, fcrId, officeId } = variables; + const updateKeys = [keys.previewFcr(positionId, fcrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateFcr` + * @summary Generate FCR document + * @permission Requires `canUseGenerateFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateFcr = ( + options?: AppMutationOptions< + typeof WorkingDocumentsFcrFormApi.generateFcr, + { positionId: string; fcrId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId, data }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId })); + return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts new file mode 100644 index 0000000..9d5e584 --- /dev/null +++ b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsHouseAwbAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Create", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; + + /** + * Use for `useGetHouseAwbData` query ability. For global ability, omit the object parameter. + * @description Read House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseAwbData` query + */ + export const canUseGetHouseAwbData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Read", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; + + /** + * Use for `useUpdateHouseAwbData` mutation ability. For global ability, omit the object parameter. + * @description Update House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseAwbData` mutation + */ + export const canUseUpdateHouseAwbData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Update", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; + + /** + * Use for `useDeleteHouseAwb` mutation ability. For global ability, omit the object parameter. + * @description Delete House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseAwb` mutation + */ + export const canUseDeleteHouseAwb = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Delete", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; + + /** + * Use for `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation + */ + export const canUsePreviewHouseAwb = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Read", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; + + /** + * Use for `useGenerateHouseAwb` mutation ability. For global ability, omit the object parameter. + * @description Generate House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseAwb` mutation + */ + export const canUseGenerateHouseAwb = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Update", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts new file mode 100644 index 0000000..26bc759 --- /dev/null +++ b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts @@ -0,0 +1,89 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseAwbApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs`, + undefined, + config, + ); + }; + + export const getHouseAwbData = ( + positionId: string, + hawbId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + config, + ); + }; + + export const updateHouseAwbData = ( + positionId: string, + hawbId: string, + officeId: string, + data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), + config, + ); + }; + + export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + undefined, + config, + ); + }; + + export const previewHouseAwb = ( + positionId: string, + hawbId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generateHouseAwb = ( + positionId: string, + hawbId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts new file mode 100644 index 0000000..e45408f --- /dev/null +++ b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts @@ -0,0 +1,307 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseAwbModels { + /** + * HouseAwbDocumentOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + * @property { string } name Name + */ + export const HouseAwbDocumentOtherChargeDTOSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID").nullish(), + sellRate: z.number().describe("Sell rate"), + name: z.string().describe("Name").nullish(), + }) + .readonly(); + export type HouseAwbDocumentOtherChargeDTO = z.infer; + + /** + * HouseAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { number } totalOtherCharges Total other charges + * @property { number } total Total + * @property { HouseAwbDocumentOtherChargeDTO[] } otherCharges Other charges + */ + export const HouseAwbDocumentChargesDTOSchema = z + .object({ + weightCharge: z.number().describe("Weight charge"), + totalOtherCharges: z.number().describe("Total other charges"), + total: z.number().describe("Total"), + otherCharges: z.array(HouseAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges"), + }) + .readonly(); + export type HouseAwbDocumentChargesDTO = z.infer; + + /** + * HouseAwbDocumentCargoDTOSchema + * @type { object } + * @property { number } quantity Quantity + * @property { number } grossWeight Gross weight + * @property { string } rateClass Rate class + * @property { string } commodityItemNo Commodity item number + * @property { number } rateOrCharge Rate or charge + * @property { number } total Total + * @property { string } description Description + */ + export const HouseAwbDocumentCargoDTOSchema = z + .object({ + quantity: z.number().describe("Quantity"), + grossWeight: z.number().describe("Gross weight").nullish(), + rateClass: z.string().describe("Rate class").nullish(), + commodityItemNo: z.string().describe("Commodity item number").nullish(), + rateOrCharge: z.number().describe("Rate or charge").nullish(), + total: z.number().describe("Total").nullish(), + description: z.string().describe("Description").nullish(), + }) + .readonly(); + export type HouseAwbDocumentCargoDTO = z.infer; + + /** + * HouseAwbDocumentRouteDTOSchema + * @type { object } + * @property { string } airportOfDeparture Airport of departure + * @property { string } airportOfDestination Airport of destination + * @property { string } toAirport1 To airport 1 + * @property { string } byCarrier1 By carrier 1 + * @property { string } toAirport2 To airport 2 + * @property { string } byCarrier2 By carrier 2 + * @property { string } toAirport3 To airport 3 + * @property { string } byCarrier3 By carrier 3 + * @property { string } flightNumber1 Flight number 1 + * @property { string } flightDay1 Flight day 1 + * @property { string } flightNumber2 Flight number 2 + * @property { string } flightDay2 Flight day 2 + */ + export const HouseAwbDocumentRouteDTOSchema = z + .object({ + airportOfDeparture: z.string().describe("Airport of departure"), + airportOfDestination: z.string().describe("Airport of destination"), + toAirport1: z.string().describe("To airport 1").nullish(), + byCarrier1: z.string().describe("By carrier 1").nullish(), + toAirport2: z.string().describe("To airport 2").nullish(), + byCarrier2: z.string().describe("By carrier 2").nullish(), + toAirport3: z.string().describe("To airport 3").nullish(), + byCarrier3: z.string().describe("By carrier 3").nullish(), + flightNumber1: z.string().describe("Flight number 1").nullish(), + flightDay1: z.string().describe("Flight day 1").nullish(), + flightNumber2: z.string().describe("Flight number 2").nullish(), + flightDay2: z.string().describe("Flight day 2").nullish(), + }) + .readonly(); + export type HouseAwbDocumentRouteDTO = z.infer; + + /** + * HouseAwbDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const HouseAwbDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer< + typeof HouseAwbDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * HouseAwbDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the House AWB document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the House AWB document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } currency Currency + * @property { number } versionNumber Version number of the document + * @property { string } hawbNumber HAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { HouseAwbDocumentCargoDTO[] } cargo Cargo packages + * @property { HouseAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } signingLocation Signing location + * @property { string } issuerIataCode Issuer IATA code + * @property { HouseAwbDocumentRouteDTO } route Route + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } issuer Issuer + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { CommonModels.DocumentConfigDTO } config Config + */ + export const HouseAwbDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the House AWB document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference"), + name: z.string().describe("Name of the House AWB document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + currency: z.string().describe("Currency").nullish(), + versionNumber: z.number().describe("Version number of the document"), + hawbNumber: z.string().describe("HAWB number").nullish(), + sciReference: z.string().describe("SCI reference").nullish(), + reference1: z.string().describe("Reference 1").nullish(), + reference2: z.string().describe("Reference 2").nullish(), + reference3: z.string().describe("Reference 3").nullish(), + exchangeRate: z.number().describe("Exchange rate").nullish(), + additionalText: CommonModels.EditorContentResponseDtoSchema.describe( + "Additional text for the document", + ).nullish(), + handlingInstructions: z.string().describe("Handling instructions").nullish(), + accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), + additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), + isSecured: z.boolean().describe("Is secured"), + suppressContainerWeight: z.boolean().describe("Suppress container weight"), + suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), + cargo: z.array(HouseAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), + charges: HouseAwbDocumentChargesDTOSchema.describe("Charges").nullish(), + shipperSigner: z.string().describe("Shipper signer").nullish(), + shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), + signer: z.string().describe("Signer").nullish(), + signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), + signingLocation: z.string().describe("Signing location").nullish(), + issuerIataCode: z.string().describe("Issuer IATA code").nullish(), + route: HouseAwbDocumentRouteDTOSchema.describe("Route").nullish(), + issuer: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), + consignee: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), + shipper: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish(), + }) + .readonly(); + export type HouseAwbDocumentResponseDTO = z.infer; + + /** + * UpdateHouseAwbDocumentChargesOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + */ + export const UpdateHouseAwbDocumentChargesOtherChargeDTOSchema = z + .object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }) + .readonly(); + export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer< + typeof UpdateHouseAwbDocumentChargesOtherChargeDTOSchema + >; + + /** + * UpdateHouseAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { UpdateHouseAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges + */ + export const UpdateHouseAwbDocumentChargesDTOSchema = z + .object({ + weightCharge: z.number().describe("Weight charge"), + otherCharges: z.array(UpdateHouseAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges"), + }) + .readonly(); + export type UpdateHouseAwbDocumentChargesDTO = z.infer; + + /** + * UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateHouseAwbDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } hawbNumber HAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { UpdateHouseAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } issuerId Issuer ID + * @property { string } issuerName Issuer name + * @property { string } issuerAddress Issuer address + * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateHouseAwbDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Document name suffix"), + hawbNumber: z.string().describe("HAWB number"), + sciReference: z.string().describe("SCI reference"), + reference1: z.string().describe("Reference 1"), + reference2: z.string().describe("Reference 2"), + reference3: z.string().describe("Reference 3"), + exchangeRate: z.number().describe("Exchange rate"), + additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), + handlingInstructions: z.string().describe("Handling instructions"), + accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), + additionalAccountingNotes: z.string().describe("Additional accounting notes"), + isSecured: z.boolean().describe("Is secured"), + suppressContainerWeight: z.boolean().describe("Suppress container weight"), + suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), + charges: UpdateHouseAwbDocumentChargesDTOSchema.describe("Charges"), + shipperSigner: z.string().describe("Shipper signer"), + shipperSignerUserName: z.string().describe("Shipper signer user name"), + signer: z.string().describe("Signer"), + signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), + issuerId: z.string().describe("Issuer ID"), + issuerName: z.string().describe("Issuer name"), + issuerAddress: z.string().describe("Issuer address"), + consignee: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), + shipper: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateHouseAwbDocumentRequestDTO = z.infer; +} diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts new file mode 100644 index 0000000..6f91afa --- /dev/null +++ b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsHouseAwbAcl } from "./workingDocumentsHouseAwb.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsHouseAwbApi } from "./workingDocumentsHouseAwb.api"; + +export namespace WorkingDocumentsHouseAwbQueries { + export const moduleName = QueryModule.WorkingDocumentsHouseAwb; + + export const keys = { + all: [moduleName] as const, + getHouseAwbData: (positionId: string, hawbId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId", positionId, hawbId, officeId] as const, + previewHouseAwb: (positionId: string, hawbId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/hawbs/:hawbId/preview", + positionId, + hawbId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a House AWB document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId })); + return WorkingDocumentsHouseAwbApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetHouseAwbData` + * @summary Get House AWB document data + * @permission Requires `canUseGetHouseAwbData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.hawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetHouseAwbData = ( + { positionId, hawbId, officeId }: { positionId: string; hawbId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId })); + return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateHouseAwbData` + * @summary Update House AWB document data + * @permission Requires `canUseUpdateHouseAwbData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateHouseAwbData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseAwbApi.updateHouseAwbData, + { + positionId: string; + hawbId: string; + officeId: string; + data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId })); + return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, hawbId, officeId } = variables; + const updateKeys = [keys.getHouseAwbData(positionId, hawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteHouseAwb` + * @summary Delete House AWB document + * @permission Requires `canUseDeleteHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } House AWB document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteHouseAwb = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseAwbApi.deleteHouseAwb, + { positionId: string; hawbId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId })); + return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewHouseAwb` - recommended when file should be cached + * @summary Preview House AWB document + * @permission Requires `canUsePreviewHouseAwb` ability + * @param { string } object.positionId Path parameter + * @param { string } object.hawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseAwb = ( + { positionId, hawbId, officeId }: { positionId: string; hawbId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId })); + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewHouseAwbMutation` - recommended when file should not be cached + * @summary Preview House AWB document + * @permission Requires `canUsePreviewHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseAwbMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseAwbApi.previewHouseAwb, + { positionId: string; hawbId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId })); + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, hawbId, officeId } = variables; + const updateKeys = [keys.previewHouseAwb(positionId, hawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateHouseAwb` + * @summary Generate House AWB document + * @permission Requires `canUseGenerateHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateHouseAwb = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseAwbApi.generateHouseAwb, + { positionId: string; hawbId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId })); + return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts new file mode 100644 index 0000000..d23cec5 --- /dev/null +++ b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts @@ -0,0 +1,99 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsHouseBlAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Create", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `useGetHouseBlData` query ability. For global ability, omit the object parameter. + * @description Read house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseBlData` query + */ + export const canUseGetHouseBlData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Read", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `useUpdateHouseBlData` mutation ability. For global ability, omit the object parameter. + * @description Update house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseBlData` mutation + */ + export const canUseUpdateHouseBlData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Update", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `useDeleteHouseBl` mutation ability. For global ability, omit the object parameter. + * @description Delete house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseBl` mutation + */ + export const canUseDeleteHouseBl = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Delete", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation + */ + export const canUsePreviewHouseBl = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Read", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview house BL document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation + */ + export const canUsePreviewHouseBlEml = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Read", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `useGenerateHouseBl` mutation ability. For global ability, omit the object parameter. + * @description Generate house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseBl` mutation + */ + export const canUseGenerateHouseBl = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Update", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate house BL document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ + export const canUseGenerateDocumentEml = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Update", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts new file mode 100644 index 0000000..9efb3f5 --- /dev/null +++ b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts @@ -0,0 +1,136 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseBlApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls`, + undefined, + config, + ); + }; + + export const getHouseBlData = ( + positionId: string, + houseBlId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + config, + ); + }; + + export const updateHouseBlData = ( + positionId: string, + houseBlId: string, + officeId: string, + data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), + config, + ); + }; + + export const deleteHouseBl = ( + positionId: string, + houseBlId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + undefined, + config, + ); + }; + + export const previewHouseBl = ( + positionId: string, + houseBlId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const previewHouseBlEml = ( + positionId: string, + houseBlId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generateHouseBl = ( + positionId: string, + houseBlId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; + + export const generateDocumentEml = ( + positionId: string, + houseBlId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts new file mode 100644 index 0000000..1feb430 --- /dev/null +++ b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts @@ -0,0 +1,350 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseBlModels { + /** + * HouseBlDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { number } quantityOfCopies Quantity of copies + * @property { string } date Date + * @property { string } location Location + * @property { string } signer Signer + * @property { boolean } hideSignature Hide signature + * @property { boolean } capsLock Render issuer/signer in caps lock + * @property { string } documentTitle Document title + */ + export const HouseBlDocumentSettingsDtoDTOSchema = z + .object({ + quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), + quantityOfCopies: z.number().describe("Quantity of copies"), + date: z.iso.datetime({ offset: true }).describe("Date"), + location: z.string().describe("Location"), + signer: z.string().describe("Signer"), + hideSignature: z.boolean().describe("Hide signature"), + capsLock: z.boolean().describe("Render issuer/signer in caps lock"), + documentTitle: z.string().describe("Document title"), + }) + .readonly(); + export type HouseBlDocumentSettingsDtoDTO = z.infer; + + /** + * HouseBlDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const HouseBlDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer< + typeof HouseBlDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * HouseBlDocumentCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ + export const HouseBlDocumentCountryResponseDTOSchema = z + .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) + .readonly(); + export type HouseBlDocumentCountryResponseDTO = z.infer; + + /** + * HouseBlDocumentPlaceResponseDTOSchema + * @type { object } + * @property { string } id ID of the place + * @property { string } name Name of the place + */ + export const HouseBlDocumentPlaceResponseDTOSchema = z + .object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }) + .readonly(); + export type HouseBlDocumentPlaceResponseDTO = z.infer; + + /** + * HouseBlDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ + export const HouseBlDocumentPortResponseDTOSchema = z + .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) + .readonly(); + export type HouseBlDocumentPortResponseDTO = z.infer; + + /** + * HouseBlDocumentTerminalResponseDTOSchema + * @type { object } + * @property { string } id ID of the terminal + * @property { string } name Name of the terminal + */ + export const HouseBlDocumentTerminalResponseDTOSchema = z + .object({ id: z.string().describe("ID of the terminal"), name: z.string().describe("Name of the terminal") }) + .readonly(); + export type HouseBlDocumentTerminalResponseDTO = z.infer; + + /** + * HouseBlDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the house BL document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the house BL document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } blNumber Bill of lading number + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } exportReference Export reference number + * @property { HouseBlDocumentBusinessPartnerResponseDTO } forwarder Forwarder information for the shipment + * @property { HouseBlDocumentCountryResponseDTO } originCountry Origin country + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { CommonModels.EditorContentResponseDto } additionalTextTop Additional text for the document + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { HouseBlDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } cargoReleaseBy Delivery agent information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information + * @property { HouseBlDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information + * @property { string } precarriageByText Pre-carriage by free-text override + * @property { HouseBlDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information + * @property { string } placeOfReceiptText Place of receipt free-text override + * @property { string } vessel Name of the vessel + * @property { string } voyage Voyage number of the vessel + * @property { string } declaredValue Declared value of the shipment + * @property { number } rateOfExchange Rate of exchange of the shipment + * @property { string } currency Currency of the shipment + * @property { string } freightPayable Freight payable of the shipment + * @property { string } issuer Issuer + * @property { HouseBlDocumentPortResponseDTO } portOfLoading Port of loading information + * @property { string } portOfLoadingText Port of loading free-text override + * @property { HouseBlDocumentTerminalResponseDTO } loadingPierTerminal Loading pier/terminal information + * @property { string } loadingPierTerminalText Loading pier/terminal free-text override + * @property { HouseBlDocumentPortResponseDTO } portOfDischarge Port of discharge information + * @property { string } portOfDischargeText Port of discharge free-text override + * @property { HouseBlDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information + * @property { string } placeOfDeliveryText Place of delivery free-text override + * @property { HouseBlDocumentPlaceResponseDTO } originalsToBeReleasedAt Originals to be released at information + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { string } typeOfMove Type of move + * @property { string } placeOfIssue + * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data + * @property { HouseBlDocumentSettingsDtoDTO } settings Settings for the House BL document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ + export const HouseBlDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the house BL document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference").nullish(), + name: z.string().describe("Name of the house BL document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + blNumber: z.string().describe("Bill of lading number").nullish(), + carrierBookingNumber: z.string().describe("Carrier booking number").nullish(), + exportReference: z.string().describe("Export reference number").nullish(), + forwarder: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe( + "Forwarder information for the shipment", + ).nullish(), + originCountry: HouseBlDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), + useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), + additionalText: CommonModels.EditorContentResponseDtoSchema.describe( + "Additional text for the document", + ).nullish(), + additionalTextTop: CommonModels.EditorContentResponseDtoSchema.describe( + "Additional text for the document", + ).nullish(), + direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), + transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), + versionNumber: z.number().describe("Version number of the document"), + consignee: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information for the shipment"), + shipper: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), + cargoReleaseBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe( + "Delivery agent information for the shipment", + ).nullish(), + notify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Notify party information for the shipment"), + alsoNotify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Additional notify party information"), + precarriageBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), + precarriageByText: z.string().describe("Pre-carriage by free-text override").nullish(), + placeOfReceipt: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), + placeOfReceiptText: z.string().describe("Place of receipt free-text override").nullish(), + vessel: z.string().describe("Name of the vessel").nullish(), + voyage: z.string().describe("Voyage number of the vessel").nullish(), + declaredValue: z.string().describe("Declared value of the shipment").nullish(), + rateOfExchange: z.number().describe("Rate of exchange of the shipment").nullish(), + currency: z.string().describe("Currency of the shipment").nullish(), + freightPayable: z.string().describe("Freight payable of the shipment").nullish(), + issuer: z.string().describe("Issuer").nullish(), + portOfLoading: HouseBlDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), + portOfLoadingText: z.string().describe("Port of loading free-text override").nullish(), + loadingPierTerminal: HouseBlDocumentTerminalResponseDTOSchema.describe( + "Loading pier/terminal information", + ).nullish(), + loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override").nullish(), + portOfDischarge: HouseBlDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), + portOfDischargeText: z.string().describe("Port of discharge free-text override").nullish(), + placeOfDelivery: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), + placeOfDeliveryText: z.string().describe("Place of delivery free-text override").nullish(), + originalsToBeReleasedAt: HouseBlDocumentPlaceResponseDTOSchema.describe( + "Originals to be released at information", + ).nullish(), + originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override").nullish(), + typeOfMove: z.string().describe("Type of move").nullish(), + placeOfIssue: z.string().nullish(), + data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), + settings: HouseBlDocumentSettingsDtoDTOSchema.describe("Settings for the House BL document").nullish(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), + }) + .readonly(); + export type HouseBlDocumentResponseDTO = z.infer; + + /** + * UpdateHouseBlDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { number } quantityOfCopies Quantity of copies + * @property { string } blNumber BL number + * @property { string } exportReference Export reference number + * @property { string } location Location + * @property { string } signer Signer + * @property { boolean } hideSignature Hide signature + * @property { boolean } capsLock Render issuer/signer in caps lock + * @property { string } date Date + * @property { string } documentTitle Document title + */ + export const UpdateHouseBlDocumentSettingsRequestDTOSchema = z + .object({ + quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), + quantityOfCopies: z.number().describe("Quantity of copies"), + blNumber: z.string().describe("BL number"), + exportReference: z.string().describe("Export reference number"), + location: z.string().describe("Location"), + signer: z.string().describe("Signer"), + hideSignature: z.boolean().describe("Hide signature"), + capsLock: z.boolean().describe("Render issuer/signer in caps lock"), + date: z.iso.datetime({ offset: true }).describe("Date"), + documentTitle: z.string().describe("Document title"), + }) + .readonly(); + export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; + + /** + * UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateHouseBlDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } blNumber Bill of lading number + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } exportReference Export reference number + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } forwarder Forwarder information + * @property { string } originCountryId Origin country ID + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } declaredValue Declared value + * @property { number } rateOfExchange Rate of exchange + * @property { string } freightPayable Freight payable + * @property { string } issuer Issuer + * @property { string } placeOfIssue Place of issue + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text + * @property { CommonModels.EditorContentUpdateDto } additionalTextTop Additional text top + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } notify Notify party information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } cargoReleaseBy Cargo release party information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information + * @property { string } precarriageById Pre-carriage by ID + * @property { string } precarriageByText Pre-carriage by free-text override + * @property { string } placeOfReceiptId Place of receipt ID + * @property { string } placeOfReceiptText Place of receipt free-text override + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } portOfLoadingId Port of loading ID + * @property { string } portOfLoadingText Port of loading free-text override + * @property { string } loadingPierTerminalId Loading pier/terminal ID + * @property { string } loadingPierTerminalText Loading pier/terminal free-text override + * @property { string } portOfDischargeId Port of discharge ID + * @property { string } portOfDischargeText Port of discharge free-text override + * @property { string } placeOfDeliveryId Place of delivery ID + * @property { string } placeOfDeliveryText Place of delivery free-text override + * @property { string } originalsToBeReleasedAtId Originals to be released at ID + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { string } typeOfMove Type of move + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { UpdateHouseBlDocumentSettingsRequestDTO } settings Settings + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data + */ + export const UpdateHouseBlDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Document name suffix"), + blNumber: z.string().describe("Bill of lading number"), + carrierBookingNumber: z.string().describe("Carrier booking number"), + exportReference: z.string().describe("Export reference number"), + forwarder: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), + originCountryId: z.string().describe("Origin country ID"), + useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), + declaredValue: z.string().describe("Declared value"), + rateOfExchange: z.number().describe("Rate of exchange"), + freightPayable: z.string().describe("Freight payable"), + issuer: z.string().describe("Issuer"), + placeOfIssue: z.string().describe("Place of issue"), + additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), + additionalTextTop: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text top"), + consignee: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), + shipper: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), + notify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), + cargoReleaseBy: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Cargo release party information"), + alsoNotify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), + precarriageById: z.string().describe("Pre-carriage by ID"), + precarriageByText: z.string().describe("Pre-carriage by free-text override"), + placeOfReceiptId: z.string().describe("Place of receipt ID"), + placeOfReceiptText: z.string().describe("Place of receipt free-text override"), + vessel: z.string().describe("Vessel name"), + voyage: z.string().describe("Voyage number"), + portOfLoadingId: z.string().describe("Port of loading ID"), + portOfLoadingText: z.string().describe("Port of loading free-text override"), + loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), + loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override"), + portOfDischargeId: z.string().describe("Port of discharge ID"), + portOfDischargeText: z.string().describe("Port of discharge free-text override"), + placeOfDeliveryId: z.string().describe("Place of delivery ID"), + placeOfDeliveryText: z.string().describe("Place of delivery free-text override"), + originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), + originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), + typeOfMove: z.string().describe("Type of move"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + settings: UpdateHouseBlDocumentSettingsRequestDTOSchema.describe("Settings"), + data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), + }) + .readonly(); + export type UpdateHouseBlDocumentRequestDTO = z.infer; +} diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts new file mode 100644 index 0000000..37c9f40 --- /dev/null +++ b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts @@ -0,0 +1,392 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsHouseBlAcl } from "./workingDocumentsHouseBl.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsHouseBlApi } from "./workingDocumentsHouseBl.api"; + +export namespace WorkingDocumentsHouseBlQueries { + export const moduleName = QueryModule.WorkingDocumentsHouseBl; + + export const keys = { + all: [moduleName] as const, + getHouseBlData: (positionId: string, houseBlId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/house-bls/:houseBlId", + positionId, + houseBlId, + officeId, + ] as const, + previewHouseBl: (positionId: string, houseBlId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview", + positionId, + houseBlId, + officeId, + ] as const, + previewHouseBlEml: (positionId: string, houseBlId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview/eml", + positionId, + houseBlId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a house BL document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId })); + return WorkingDocumentsHouseBlApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetHouseBlData` + * @summary Get house BL document data + * @permission Requires `canUseGetHouseBlData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetHouseBlData = ( + { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId })); + return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateHouseBlData` + * @summary Update house BL document data + * @permission Requires `canUseUpdateHouseBlData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateHouseBlData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.updateHouseBlData, + { + positionId: string; + houseBlId: string; + officeId: string; + data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId })); + return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.getHouseBlData(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteHouseBl` + * @summary Delete house BL document + * @permission Requires `canUseDeleteHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } House BL document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteHouseBl = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.deleteHouseBl, + { positionId: string; houseBlId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId })); + return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewHouseBl` - recommended when file should be cached + * @summary Preview house BL document + * @permission Requires `canUsePreviewHouseBl` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseBl = ( + { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId })); + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewHouseBlMutation` - recommended when file should not be cached + * @summary Preview house BL document + * @permission Requires `canUsePreviewHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseBlMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.previewHouseBl, + { positionId: string; houseBlId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId })); + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [ + keys.previewHouseBl(positionId, houseBlId, officeId), + keys.previewHouseBlEml(positionId, houseBlId, officeId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewHouseBlEml` - recommended when file should be cached + * @summary Preview house BL document and return EML file + * @permission Requires `canUsePreviewHouseBlEml` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseBlEml = ( + { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId })); + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewHouseBlEmlMutation` - recommended when file should not be cached + * @summary Preview house BL document and return EML file + * @permission Requires `canUsePreviewHouseBlEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseBlEmlMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.previewHouseBlEml, + { positionId: string; houseBlId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId })); + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [ + keys.previewHouseBl(positionId, houseBlId, officeId), + keys.previewHouseBlEml(positionId, houseBlId, officeId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateHouseBl` + * @summary Generate house BL document + * @permission Requires `canUseGenerateHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateHouseBl = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.generateHouseBl, + { positionId: string; houseBlId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId })); + return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate house BL document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGenerateDocumentEml = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.generateDocumentEml, + { positionId: string; houseBlId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId })); + return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [ + keys.previewHouseBl(positionId, houseBlId, officeId), + keys.previewHouseBlEml(positionId, houseBlId, officeId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts new file mode 100644 index 0000000..7d64f70 --- /dev/null +++ b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsIsfFormAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Create", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; + + /** + * Use for `useGetIsfData` query ability. For global ability, omit the object parameter. + * @description Read ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetIsfData` query + */ + export const canUseGetIsfData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Read", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; + + /** + * Use for `useUpdateIsfData` mutation ability. For global ability, omit the object parameter. + * @description Update ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIsfData` mutation + */ + export const canUseUpdateIsfData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Update", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; + + /** + * Use for `useDeleteIsf` mutation ability. For global ability, omit the object parameter. + * @description Delete ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteIsf` mutation + */ + export const canUseDeleteIsf = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Delete", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; + + /** + * Use for `usePreviewIsf` query or `usePreviewIsfMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewIsf` query or `usePreviewIsfMutation` mutation + */ + export const canUsePreviewIsf = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Read", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; + + /** + * Use for `useGenerateIsf` mutation ability. For global ability, omit the object parameter. + * @description Generate ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIsf` mutation + */ + export const canUseGenerateIsf = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Update", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts new file mode 100644 index 0000000..9dd47c9 --- /dev/null +++ b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsIsfFormApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs`, + undefined, + config, + ); + }; + + export const getIsfData = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + config, + ); + }; + + export const updateIsfData = ( + positionId: string, + isfId: string, + officeId: string, + data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), + config, + ); + }; + + export const deleteIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + undefined, + config, + ); + }; + + export const previewIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generateIsf = ( + positionId: string, + isfId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts new file mode 100644 index 0000000..97121fe --- /dev/null +++ b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts @@ -0,0 +1,260 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsIsfFormModels { + /** + * IsfDocumentCargoCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ + export const IsfDocumentCargoCountryResponseDTOSchema = z + .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) + .readonly(); + export type IsfDocumentCargoCountryResponseDTO = z.infer; + + /** + * IsfDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } productCode Product code of the cargo + * @property { string } descriptionOfGoods Description of goods + * @property { string } htsCode HTS code of the cargo + * @property { string } manufacturerSupplier Manufacturer supplier of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + * @property { IsfDocumentCargoCountryResponseDTO } countryOfOrigin Country of origin of the cargo + */ + export const IsfDocumentCargoResponseDTOSchema = z + .object({ + productCode: z.string().describe("Product code of the cargo"), + descriptionOfGoods: z.string().describe("Description of goods"), + htsCode: z.string().describe("HTS code of the cargo"), + manufacturerSupplier: z.string().describe("Manufacturer supplier of the cargo"), + seal1: z.string().describe("Seal number 1 of the cargo"), + seal2: z.string().describe("Seal number 2 of the cargo"), + countryOfOrigin: IsfDocumentCargoCountryResponseDTOSchema.describe("Country of origin of the cargo"), + }) + .readonly(); + export type IsfDocumentCargoResponseDTO = z.infer; + + /** + * IsfDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ + export const IsfDocumentPortResponseDTOSchema = z + .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) + .readonly(); + export type IsfDocumentPortResponseDTO = z.infer; + + /** + * IsfDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + * @property { string } number Number of the business partner + */ + export const IsfDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + number: z.string().describe("Number of the business partner"), + }) + .readonly(); + export type IsfDocumentBusinessPartnerResponseDTO = z.infer; + + /** + * IsfDocumentContainerLocationResponseDTOSchema + * @type { object } + * @property { string } id ID of the container location + * @property { string } name Name of the container location + * @property { string } address Address of the container location + */ + export const IsfDocumentContainerLocationResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the container location"), + name: z.string().describe("Name of the container location"), + address: z.string().describe("Address of the container location"), + }) + .readonly(); + export type IsfDocumentContainerLocationResponseDTO = z.infer; + + /** + * IsfDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { number } versionNumber Version number of the document + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } hBLNumber HBL number + * @property { string } mBLNumber MBL number + * @property { string } scacCodeHBL SCAC code for HBL + * @property { string } scacCodeMBL SCAC code for MBL + * @property { IsfDocumentPortResponseDTO } portOfDischarge Port of discharge + * @property { string } issueLocation Issue location + * @property { string } issueDate Issue date + * @property { string } companyName Company name + * @property { object } completedBy + * @property { string } completedBy.name + * @property { string } completedBy.email + * @property { object } container + * @property { string } container.id + * @property { string } container.name + * @property { IsfDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { IsfDocumentBusinessPartnerResponseDTO } manufacturer Manufacturer information + * @property { IsfDocumentBusinessPartnerResponseDTO } seller Seller information + * @property { IsfDocumentBusinessPartnerResponseDTO } buyer Buyer information + * @property { IsfDocumentBusinessPartnerResponseDTO } consolidator Consolidator information + * @property { IsfDocumentContainerLocationResponseDTO } containerLocation Container location information + * @property { IsfDocumentBusinessPartnerResponseDTO } shipTo Ship to information + * @property { IsfDocumentBusinessPartnerResponseDTO } importer Importer information + * @property { IsfDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + */ + export const IsfDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the document"), + name: z.string().describe("Name of the document"), + nameSuffix: z.string().describe("Name suffix of the document").nullish(), + defaultFileName: z.string(), + positionId: z.string().describe("Position ID"), + positionNumber: z.string().describe("Position number"), + versionNumber: z.number().describe("Version number of the document"), + vessel: z.string().describe("Vessel name").nullish(), + voyage: z.string().describe("Voyage number").nullish(), + hBLNumber: z.string().describe("HBL number").nullish(), + mBLNumber: z.string().describe("MBL number").nullish(), + scacCodeHBL: z.string().describe("SCAC code for HBL").nullish(), + scacCodeMBL: z.string().describe("SCAC code for MBL").nullish(), + portOfDischarge: IsfDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), + issueLocation: z.string().describe("Issue location").nullish(), + issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), + companyName: z.string().describe("Company name").nullish(), + completedBy: z.object({ name: z.string(), email: z.string() }).readonly().nullish(), + container: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), + consignee: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), + manufacturer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Manufacturer information").nullish(), + seller: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Seller information").nullish(), + buyer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Buyer information").nullish(), + consolidator: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consolidator information").nullish(), + containerLocation: IsfDocumentContainerLocationResponseDTOSchema.describe( + "Container location information", + ).nullish(), + shipTo: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Ship to information").nullish(), + importer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Importer information").nullish(), + cargo: z.array(IsfDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), + config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + }) + .readonly(); + export type IsfDocumentResponseDTO = z.infer; + + /** + * UpdateIsfDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + * @property { string } number Business partner number + */ + export const UpdateIsfDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + number: z.string().describe("Business partner number"), + }) + .readonly(); + export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateIsfDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateIsfDocumentCargoRequestDTOSchema + * @type { object } + * @property { string } productCode Product code + * @property { string } descriptionOfGoods Description of goods + * @property { string } htsCode HTS code + * @property { string } manufacturerSupplier Manufacturer supplier + * @property { string } countryOfOriginId Country of origin ID + */ + export const UpdateIsfDocumentCargoRequestDTOSchema = z + .object({ + productCode: z.string().describe("Product code"), + descriptionOfGoods: z.string().describe("Description of goods"), + htsCode: z.string().describe("HTS code"), + manufacturerSupplier: z.string().describe("Manufacturer supplier"), + countryOfOriginId: z.string().describe("Country of origin ID"), + }) + .readonly(); + export type UpdateIsfDocumentCargoRequestDTO = z.infer; + + /** + * UpdateIsfDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } hBLNumber HBL number + * @property { string } mBLNumber MBL number + * @property { string } scacCodeHBL SCAC code for HBL + * @property { string } scacCodeMBL SCAC code for MBL + * @property { string } portOfDischargeId Port of discharge Id + * @property { string } issueLocation Issue location + * @property { string } issueDate Issue date + * @property { string } companyName Company name + * @property { string } completedByName Completed by name + * @property { string } completedByEmail Completed by email + * @property { string } containerId Container ID + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } manufacturer Manufacturer information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } seller Seller information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } buyer Buyer information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consolidator Consolidator information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } containerLocation Container location information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } shipTo Ship to information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } importer Importer information + * @property { UpdateIsfDocumentCargoRequestDTO[] } cargo Cargo information + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateIsfDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Name suffix"), + vessel: z.string().describe("Vessel name"), + voyage: z.string().describe("Voyage number"), + hBLNumber: z.string().describe("HBL number"), + mBLNumber: z.string().describe("MBL number"), + scacCodeHBL: z.string().describe("SCAC code for HBL"), + scacCodeMBL: z.string().describe("SCAC code for MBL"), + portOfDischargeId: z.string().describe("Port of discharge Id"), + issueLocation: z.string().describe("Issue location"), + issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), + companyName: z.string().describe("Company name"), + completedByName: z.string().describe("Completed by name"), + completedByEmail: z.string().describe("Completed by email"), + containerId: z.string().describe("Container ID"), + consignee: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), + manufacturer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Manufacturer information"), + seller: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), + buyer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), + consolidator: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consolidator information"), + containerLocation: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Container location information"), + shipTo: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Ship to information"), + importer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Importer information"), + cargo: z.array(UpdateIsfDocumentCargoRequestDTOSchema).readonly().describe("Cargo information"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateIsfDocumentRequestDTO = z.infer; +} diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts new file mode 100644 index 0000000..592b755 --- /dev/null +++ b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsIsfFormAcl } from "./workingDocumentsIsfForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsIsfFormApi } from "./workingDocumentsIsfForm.api"; + +export namespace WorkingDocumentsIsfFormQueries { + export const moduleName = QueryModule.WorkingDocumentsIsfForm; + + export const keys = { + all: [moduleName] as const, + getIsfData: (positionId: string, isfId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId", positionId, isfId, officeId] as const, + previewIsf: (positionId: string, isfId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/isfs/:isfId/preview", + positionId, + isfId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create an ISF document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId })); + return WorkingDocumentsIsfFormApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetIsfData` + * @summary Get ISF document data + * @permission Requires `canUseGetIsfData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.isfId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetIsfData = ( + { positionId, isfId, officeId }: { positionId: string; isfId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getIsfData(positionId, isfId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId })); + return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateIsfData` + * @summary Update ISF document data + * @permission Requires `canUseUpdateIsfData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateIsfData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsIsfFormApi.updateIsfData, + { + positionId: string; + isfId: string; + officeId: string; + data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId, data }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId })); + return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, isfId, officeId } = variables; + const updateKeys = [keys.getIsfData(positionId, isfId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteIsf` + * @summary Delete ISF document + * @permission Requires `canUseDeleteIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } ISF document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteIsf = ( + options?: AppMutationOptions< + typeof WorkingDocumentsIsfFormApi.deleteIsf, + { positionId: string; isfId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId })); + return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewIsf` - recommended when file should be cached + * @summary Preview ISF document + * @permission Requires `canUsePreviewIsf` ability + * @param { string } object.positionId Path parameter + * @param { string } object.isfId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewIsf = ( + { positionId, isfId, officeId }: { positionId: string; isfId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewIsf(positionId, isfId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId })); + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewIsfMutation` - recommended when file should not be cached + * @summary Preview ISF document + * @permission Requires `canUsePreviewIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewIsfMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsIsfFormApi.previewIsf, + { positionId: string; isfId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId })); + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, isfId, officeId } = variables; + const updateKeys = [keys.previewIsf(positionId, isfId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateIsf` + * @summary Generate ISF document + * @permission Requires `canUseGenerateIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateIsf = ( + options?: AppMutationOptions< + typeof WorkingDocumentsIsfFormApi.generateIsf, + { positionId: string; isfId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId, data }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId })); + return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts new file mode 100644 index 0000000..6d3d1a9 --- /dev/null +++ b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsMasterAwbAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Create", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; + + /** + * Use for `useGetMasterAwbData` query ability. For global ability, omit the object parameter. + * @description Read Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMasterAwbData` query + */ + export const canUseGetMasterAwbData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Read", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; + + /** + * Use for `useUpdateMasterAwbData` mutation ability. For global ability, omit the object parameter. + * @description Update Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateMasterAwbData` mutation + */ + export const canUseUpdateMasterAwbData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Update", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; + + /** + * Use for `useDeleteMasterAwb` mutation ability. For global ability, omit the object parameter. + * @description Delete Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteMasterAwb` mutation + */ + export const canUseDeleteMasterAwb = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Delete", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; + + /** + * Use for `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation + */ + export const canUsePreviewMasterAwb = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Read", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; + + /** + * Use for `useGenerateMasterAwb` mutation ability. For global ability, omit the object parameter. + * @description Generate Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateMasterAwb` mutation + */ + export const canUseGenerateMasterAwb = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Update", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts new file mode 100644 index 0000000..64f0399 --- /dev/null +++ b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts @@ -0,0 +1,94 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsMasterAwbApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs`, + undefined, + config, + ); + }; + + export const getMasterAwbData = ( + positionId: string, + mawbId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + config, + ); + }; + + export const updateMasterAwbData = ( + positionId: string, + mawbId: string, + officeId: string, + data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), + config, + ); + }; + + export const deleteMasterAwb = ( + positionId: string, + mawbId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + undefined, + config, + ); + }; + + export const previewMasterAwb = ( + positionId: string, + mawbId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const generateMasterAwb = ( + positionId: string, + mawbId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts new file mode 100644 index 0000000..e4e0a26 --- /dev/null +++ b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts @@ -0,0 +1,311 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsMasterAwbModels { + /** + * MasterAwbDocumentOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + * @property { string } name Name + */ + export const MasterAwbDocumentOtherChargeDTOSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID").nullish(), + sellRate: z.number().describe("Sell rate"), + name: z.string().describe("Name").nullish(), + }) + .readonly(); + export type MasterAwbDocumentOtherChargeDTO = z.infer; + + /** + * MasterAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { number } totalOtherCharges Total other charges + * @property { number } total Total + * @property { MasterAwbDocumentOtherChargeDTO[] } otherCharges Other charges + */ + export const MasterAwbDocumentChargesDTOSchema = z + .object({ + weightCharge: z.number().describe("Weight charge"), + totalOtherCharges: z.number().describe("Total other charges"), + total: z.number().describe("Total"), + otherCharges: z.array(MasterAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges"), + }) + .readonly(); + export type MasterAwbDocumentChargesDTO = z.infer; + + /** + * MasterAwbDocumentCargoDTOSchema + * @type { object } + * @property { number } quantity Quantity + * @property { number } grossWeight Gross weight + * @property { string } rateClass Rate class + * @property { string } commodityItemNo Commodity item number + * @property { number } rateOrCharge Rate or charge + * @property { number } total Total + * @property { string } description Description + */ + export const MasterAwbDocumentCargoDTOSchema = z + .object({ + quantity: z.number().describe("Quantity"), + grossWeight: z.number().describe("Gross weight").nullish(), + rateClass: z.string().describe("Rate class").nullish(), + commodityItemNo: z.string().describe("Commodity item number").nullish(), + rateOrCharge: z.number().describe("Rate or charge").nullish(), + total: z.number().describe("Total").nullish(), + description: z.string().describe("Description").nullish(), + }) + .readonly(); + export type MasterAwbDocumentCargoDTO = z.infer; + + /** + * MasterAwbDocumentRouteDTOSchema + * @type { object } + * @property { string } airportOfDeparture Airport of departure + * @property { string } airportOfDestination Airport of destination + * @property { string } toAirport1 To airport 1 + * @property { string } byCarrier1 By carrier 1 + * @property { string } toAirport2 To airport 2 + * @property { string } byCarrier2 By carrier 2 + * @property { string } toAirport3 To airport 3 + * @property { string } byCarrier3 By carrier 3 + * @property { string } flightNumber1 Flight number 1 + * @property { string } flightDay1 Flight day 1 + * @property { string } flightNumber2 Flight number 2 + * @property { string } flightDay2 Flight day 2 + */ + export const MasterAwbDocumentRouteDTOSchema = z + .object({ + airportOfDeparture: z.string().describe("Airport of departure"), + airportOfDestination: z.string().describe("Airport of destination"), + toAirport1: z.string().describe("To airport 1").nullish(), + byCarrier1: z.string().describe("By carrier 1").nullish(), + toAirport2: z.string().describe("To airport 2").nullish(), + byCarrier2: z.string().describe("By carrier 2").nullish(), + toAirport3: z.string().describe("To airport 3").nullish(), + byCarrier3: z.string().describe("By carrier 3").nullish(), + flightNumber1: z.string().describe("Flight number 1").nullish(), + flightDay1: z.string().describe("Flight day 1").nullish(), + flightNumber2: z.string().describe("Flight number 2").nullish(), + flightDay2: z.string().describe("Flight day 2").nullish(), + }) + .readonly(); + export type MasterAwbDocumentRouteDTO = z.infer; + + /** + * MasterAwbDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const MasterAwbDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer< + typeof MasterAwbDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * MasterAwbDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the Master AWB document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the Master AWB document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } currency Currency + * @property { number } versionNumber Version number of the document + * @property { string } mawbNumber MAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { MasterAwbDocumentCargoDTO[] } cargo Cargo packages + * @property { MasterAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } signingLocation Signing location + * @property { string } issuerIataCode Issuer IATA code + * @property { number } exchangeRate Exchange rate + * @property { MasterAwbDocumentRouteDTO } route Route + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } issuer Issuer + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { CommonModels.DocumentConfigDTO } config Config + */ + export const MasterAwbDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the Master AWB document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference"), + name: z.string().describe("Name of the Master AWB document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + currency: z.string().describe("Currency").nullish(), + versionNumber: z.number().describe("Version number of the document"), + mawbNumber: z.string().describe("MAWB number").nullish(), + sciReference: z.string().describe("SCI reference").nullish(), + reference1: z.string().describe("Reference 1").nullish(), + reference2: z.string().describe("Reference 2").nullish(), + reference3: z.string().describe("Reference 3").nullish(), + additionalText: CommonModels.EditorContentResponseDtoSchema.describe( + "Additional text for the document", + ).nullish(), + handlingInstructions: z.string().describe("Handling instructions").nullish(), + accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), + additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), + isSecured: z.boolean().describe("Is secured"), + suppressContainerWeight: z.boolean().describe("Suppress container weight"), + suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), + cargo: z.array(MasterAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), + charges: MasterAwbDocumentChargesDTOSchema.describe("Charges").nullish(), + shipperSigner: z.string().describe("Shipper signer").nullish(), + shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), + signer: z.string().describe("Signer").nullish(), + signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), + signingLocation: z.string().describe("Signing location").nullish(), + issuerIataCode: z.string().describe("Issuer IATA code").nullish(), + exchangeRate: z.number().describe("Exchange rate").nullish(), + route: MasterAwbDocumentRouteDTOSchema.describe("Route").nullish(), + consignee: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), + shipper: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), + issuer: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish(), + }) + .readonly(); + export type MasterAwbDocumentResponseDTO = z.infer; + + /** + * UpdateMasterAwbDocumentChargesOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + */ + export const UpdateMasterAwbDocumentChargesOtherChargeDTOSchema = z + .object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }) + .readonly(); + export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer< + typeof UpdateMasterAwbDocumentChargesOtherChargeDTOSchema + >; + + /** + * UpdateMasterAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { UpdateMasterAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges + */ + export const UpdateMasterAwbDocumentChargesDTOSchema = z + .object({ + weightCharge: z.number().describe("Weight charge"), + otherCharges: z.array(UpdateMasterAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges"), + }) + .readonly(); + export type UpdateMasterAwbDocumentChargesDTO = z.infer; + + /** + * UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateMasterAwbDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } mawbNumber MAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { UpdateMasterAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } issuerId Issuer ID + * @property { string } issuerName Issuer name + * @property { string } issuerAddress Issuer address + * @property { string } issuerCity Issuer city + * @property { string } issuerIataCode Issuer IATA code + * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateMasterAwbDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Document name suffix"), + mawbNumber: z.string().describe("MAWB number"), + sciReference: z.string().describe("SCI reference"), + reference1: z.string().describe("Reference 1"), + reference2: z.string().describe("Reference 2"), + reference3: z.string().describe("Reference 3"), + additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text for the document"), + handlingInstructions: z.string().describe("Handling instructions"), + accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), + additionalAccountingNotes: z.string().describe("Additional accounting notes"), + isSecured: z.boolean().describe("Is secured"), + suppressContainerWeight: z.boolean().describe("Suppress container weight"), + suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), + charges: UpdateMasterAwbDocumentChargesDTOSchema.describe("Charges"), + shipperSigner: z.string().describe("Shipper signer"), + shipperSignerUserName: z.string().describe("Shipper signer user name"), + signer: z.string().describe("Signer"), + signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), + issuerId: z.string().describe("Issuer ID"), + issuerName: z.string().describe("Issuer name"), + issuerAddress: z.string().describe("Issuer address"), + issuerCity: z.string().describe("Issuer city"), + issuerIataCode: z.string().describe("Issuer IATA code"), + consignee: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), + shipper: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), + exchangeRate: z.number().describe("Exchange rate"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateMasterAwbDocumentRequestDTO = z.infer; +} diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts new file mode 100644 index 0000000..236a943 --- /dev/null +++ b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsMasterAwbAcl } from "./workingDocumentsMasterAwb.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsMasterAwbApi } from "./workingDocumentsMasterAwb.api"; + +export namespace WorkingDocumentsMasterAwbQueries { + export const moduleName = QueryModule.WorkingDocumentsMasterAwb; + + export const keys = { + all: [moduleName] as const, + getMasterAwbData: (positionId: string, mawbId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId", positionId, mawbId, officeId] as const, + previewMasterAwb: (positionId: string, mawbId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/mawbs/:mawbId/preview", + positionId, + mawbId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a Master AWB document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId })); + return WorkingDocumentsMasterAwbApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetMasterAwbData` + * @summary Get Master AWB document data + * @permission Requires `canUseGetMasterAwbData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.mawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetMasterAwbData = ( + { positionId, mawbId, officeId }: { positionId: string; mawbId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId })); + return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateMasterAwbData` + * @summary Update Master AWB document data + * @permission Requires `canUseUpdateMasterAwbData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateMasterAwbData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsMasterAwbApi.updateMasterAwbData, + { + positionId: string; + mawbId: string; + officeId: string; + data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId, data }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId })); + return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, mawbId, officeId } = variables; + const updateKeys = [keys.getMasterAwbData(positionId, mawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteMasterAwb` + * @summary Delete Master AWB document + * @permission Requires `canUseDeleteMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Master AWB document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteMasterAwb = ( + options?: AppMutationOptions< + typeof WorkingDocumentsMasterAwbApi.deleteMasterAwb, + { positionId: string; mawbId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId })); + return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewMasterAwb` - recommended when file should be cached + * @summary Preview Master AWB document + * @permission Requires `canUsePreviewMasterAwb` ability + * @param { string } object.positionId Path parameter + * @param { string } object.mawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewMasterAwb = ( + { positionId, mawbId, officeId }: { positionId: string; mawbId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId })); + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewMasterAwbMutation` - recommended when file should not be cached + * @summary Preview Master AWB document + * @permission Requires `canUsePreviewMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewMasterAwbMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsMasterAwbApi.previewMasterAwb, + { positionId: string; mawbId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId })); + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, mawbId, officeId } = variables; + const updateKeys = [keys.previewMasterAwb(positionId, mawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateMasterAwb` + * @summary Generate Master AWB document + * @permission Requires `canUseGenerateMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateMasterAwb = ( + options?: AppMutationOptions< + typeof WorkingDocumentsMasterAwbApi.generateMasterAwb, + { positionId: string; mawbId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId, data }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId })); + return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts new file mode 100644 index 0000000..5e29a04 --- /dev/null +++ b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts @@ -0,0 +1,115 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsTemplatedDocumentAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Create", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Create", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `useGetTemplatedDocument` query ability. For global ability, omit the object parameter. + * @description Read templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetTemplatedDocument` query + */ + export const canUseGetTemplatedDocument = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Read", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `useUpdateTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Update templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateTemplatedDocument` mutation + */ + export const canUseUpdateTemplatedDocument = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Update", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `useDeleteTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Delete templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteTemplatedDocument` mutation + */ + export const canUseDeleteTemplatedDocument = (object?: { officeId: string }) => + [ + "Delete", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Delete", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `usePreviewTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Preview templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewTemplatedDocument` mutation + */ + export const canUsePreviewTemplatedDocument = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Read", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `useIssueTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Issue templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueTemplatedDocument` mutation + */ + export const canUseIssueTemplatedDocument = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Update", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate templated document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ + export const canUseGenerateDocumentEml = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Update", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; +} diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts new file mode 100644 index 0000000..91883ef --- /dev/null +++ b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts @@ -0,0 +1,123 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsTemplatedDocumentApi { + export const create = ( + positionId: string, + officeId: string, + data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), + config, + ); + }; + + export const getTemplatedDocument = ( + officeId: string, + positionId: string, + templatedDocumentId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + config, + ); + }; + + export const updateTemplatedDocument = ( + officeId: string, + positionId: string, + templatedDocumentId: string, + data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), + config, + ); + }; + + export const deleteTemplatedDocument = ( + positionId: string, + templatedDocumentId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + undefined, + config, + ); + }; + + export const previewTemplatedDocument = ( + officeId: string, + positionId: string, + templatedDocumentId: string, + data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + + export const issueTemplatedDocument = ( + officeId: string, + positionId: string, + templatedDocumentId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; + + export const generateDocumentEml = ( + officeId: string, + positionId: string, + templatedDocumentId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts new file mode 100644 index 0000000..a2d225e --- /dev/null +++ b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts @@ -0,0 +1,94 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsTemplatedDocumentModels { + /** + * TemplatedDocumentBlueprintDtoSchema + * @type { object } + * @property { string } templateId + * @property { string } templateName + * @property { string } capturedAt + * @property { CommonModels.TemplateBlocksResponseDTO } blocks + */ + export const TemplatedDocumentBlueprintDtoSchema = z + .object({ + templateId: z.string(), + templateName: z.string(), + capturedAt: z.string(), + blocks: CommonModels.TemplateBlocksResponseDTOSchema, + }) + .readonly(); + export type TemplatedDocumentBlueprintDto = z.infer; + + /** + * TemplatedDocumentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } officeId + * @property { string } name + * @property { string } nameSuffix + * @property { string } defaultFileName + * @property { number } versionNumber + * @property { TemplatedDocumentBlueprintDto } blueprint Captured template blueprint + * @property { CommonModels.TemplatedDocumentDataDto } data Document data + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } issuedAt + */ + export const TemplatedDocumentResponseDtoSchema = z + .object({ + id: z.string(), + positionId: z.string(), + officeId: z.string(), + name: z.string(), + nameSuffix: z.string().nullish(), + defaultFileName: z.string(), + versionNumber: z.number(), + blueprint: TemplatedDocumentBlueprintDtoSchema.describe("Captured template blueprint"), + data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Document data"), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + issuedAt: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type TemplatedDocumentResponseDto = z.infer; + + /** + * UpdateTemplatedDocumentRequestDtoSchema + * @type { object } + * @property { string } nameSuffix Optional suffix for the document name + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data Partial document data to update + */ + export const UpdateTemplatedDocumentRequestDtoSchema = z + .object({ + nameSuffix: z.string().describe("Optional suffix for the document name"), + data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("Partial document data to update"), + }) + .readonly(); + export type UpdateTemplatedDocumentRequestDto = z.infer; + + /** + * CreateTemplatedDocumentRequestDtoSchema + * @type { object } + * @property { string } templateId Template ID to use for creating the document + * @property { string } nameSuffix Optional suffix for the document name + */ + export const CreateTemplatedDocumentRequestDtoSchema = z + .object({ + templateId: z.string().describe("Template ID to use for creating the document"), + nameSuffix: z.string().describe("Optional suffix for the document name").nullish(), + }) + .readonly(); + export type CreateTemplatedDocumentRequestDto = z.infer; + + /** + * GenerateWorkingDocumentPreviewRequestDtoSchema + * @type { object } + * @property { string } issuedAt + */ + export const GenerateWorkingDocumentPreviewRequestDtoSchema = z + .object({ issuedAt: z.iso.datetime({ offset: true }) }) + .readonly(); + export type GenerateWorkingDocumentPreviewRequestDto = z.infer; +} diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts new file mode 100644 index 0000000..ac57ead --- /dev/null +++ b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts @@ -0,0 +1,332 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsTemplatedDocumentAcl } from "./workingDocumentsTemplatedDocument.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsTemplatedDocumentApi } from "./workingDocumentsTemplatedDocument.api"; + +export namespace WorkingDocumentsTemplatedDocumentQueries { + export const moduleName = QueryModule.WorkingDocumentsTemplatedDocument; + + export const keys = { + all: [moduleName] as const, + getTemplatedDocument: (officeId: string, positionId: string, templatedDocumentId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/templated-documents/:templatedDocumentId", + officeId, + positionId, + templatedDocumentId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a templated document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.create, + { + positionId: string; + officeId: string; + data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetTemplatedDocument` + * @summary Get templated document data + * @permission Requires `canUseGetTemplatedDocument` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.templatedDocumentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetTemplatedDocument = ( + { + officeId, + positionId, + templatedDocumentId, + }: { officeId: string; positionId: string; templatedDocumentId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), + queryFn: () => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument( + officeId, + positionId, + templatedDocumentId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateTemplatedDocument` + * @summary Update templated document data + * @permission Requires `canUseUpdateTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateTemplatedDocument = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument, + { + officeId: string; + positionId: string; + templatedDocumentId: string; + data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument( + officeId, + positionId, + templatedDocumentId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, templatedDocumentId } = variables; + const updateKeys = [keys.getTemplatedDocument(officeId, positionId, templatedDocumentId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteTemplatedDocument` + * @summary Delete templated document + * @permission Requires `canUseDeleteTemplatedDocument` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Templated document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteTemplatedDocument = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument, + { positionId: string; templatedDocumentId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, templatedDocumentId, officeId }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument( + positionId, + templatedDocumentId, + officeId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `usePreviewTemplatedDocument` - recommended when file should not be cached + * @summary Preview templated document + * @permission Requires `canUsePreviewTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const usePreviewTemplatedDocument = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument, + { + officeId: string; + positionId: string; + templatedDocumentId: string; + data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument( + officeId, + positionId, + templatedDocumentId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useIssueTemplatedDocument` + * @summary Issue templated document (generate final PDF) + * @permission Requires `canUseIssueTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useIssueTemplatedDocument = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument, + { + officeId: string; + positionId: string; + templatedDocumentId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument( + officeId, + positionId, + templatedDocumentId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate templated document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGenerateDocumentEml = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.generateDocumentEml, + { + officeId: string; + positionId: string; + templatedDocumentId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml( + officeId, + positionId, + templatedDocumentId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/base/zod.extended.ts b/test/generated/base/zod.extended.ts new file mode 100644 index 0000000..205405c --- /dev/null +++ b/test/generated/base/zod.extended.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; + +export namespace ZodExtended { + interface ParseOptions { + type: "body" | "query"; + name?: string; + errorHandler?: ErrorHandler; + } + + export function parse( + schema: z.ZodType, + data: unknown, + { type, name, errorHandler }: ParseOptions = { type: "body" }, + ) { + try { + return schema.parse(data); + } catch (e) { + if (e instanceof z.ZodError) { + e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; + } + (errorHandler ?? SharedErrorHandler).rethrowError(e); + throw e; + } + } + + function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { + if (data === undefined || data === "" || enumSchema.options.length === 0) { + return true; + } + + const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; + const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; + return new RegExp(`^${commaSeparatedOptions}$`).test(data); + } + + export const sortExp = (enumSchema: z.ZodEnum) => + z.string().superRefine((arg, ctx) => { + if (!isSortExpValid(enumSchema, arg)) { + ctx.addIssue({ + code: "invalid_value", + message: "Invalid sorting string.", + values: [], + }); + } + }); +} diff --git a/test/generated/dist/aWBStocks/aWBStocks.acl.ts b/test/generated/dist/aWBStocks/aWBStocks.acl.ts new file mode 100644 index 0000000..aae7050 --- /dev/null +++ b/test/generated/dist/aWBStocks/aWBStocks.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace AWBStocksAcl { + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List AWB stocks + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Read", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Create", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get AWB stock details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Read", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Update", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Update", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Update", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; + + /** + * Use for `useGenerateNextNumber` mutation ability. For global ability, omit the object parameter. + * @description Generate next AWB number + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateNextNumber` mutation + */ + export const canUseGenerateNextNumber = (object?: { officeId: string }) => + ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< + "Update", + "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/aWBStocks/aWBStocks.api.ts b/test/generated/dist/aWBStocks/aWBStocks.api.ts new file mode 100644 index 0000000..ae8ee09 --- /dev/null +++ b/test/generated/dist/aWBStocks/aWBStocks.api.ts @@ -0,0 +1,108 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { AWBStocksModels } from "./aWBStocks.models"; + +export namespace AWBStocksApi { + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: AWBStocksModels.AWBStockFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, + `/offices/${officeId}/awb-stocks`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = ( + officeId: string, + data: AWBStocksModels.CreateAWBStockRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks`, + ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), + config, + ); + }; + export const findById = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}`, + config, + ); + }; + export const update = ( + stockId: string, + officeId: string, + data: AWBStocksModels.UpdateAWBStockRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}`, + ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), + config, + ); + }; + export const archive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}/archive`, + undefined, + config, + ); + }; + export const unarchive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, + undefined, + config, + ); + }; + export const generateNextNumber = ( + officeId: string, + data: AWBStocksModels.GenerateAWBNumberRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/generate-number`, + ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/aWBStocks/aWBStocks.configs.ts b/test/generated/dist/aWBStocks/aWBStocks.configs.ts new file mode 100644 index 0000000..4317f98 --- /dev/null +++ b/test/generated/dist/aWBStocks/aWBStocks.configs.ts @@ -0,0 +1,91 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { AWBStocksModels } from "./aWBStocks.models"; +import { AWBStocksQueries } from "./aWBStocks.queries"; +import { AWBStocksAcl } from "./aWBStocks.acl"; + +export namespace AWBStocksConfigs { + export const awbStocksConfig = { + meta: { + title: "Awb Stocks", + }, + readAll: { + acl: AWBStocksAcl.canUsePaginate, + schema: AWBStocksModels.AWBStockResponseDTOSchema, + paginated: AWBStocksQueries.usePaginate, + infinite: AWBStocksQueries.usePaginateInfinite, + filters: { + schema: AWBStocksModels.AWBStockFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AWBStocksModels.AWBStockFilterDtoSchema, + options: { + inputs: { + archived: true, + carrierId: true, + searchQuery: true, + used: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: AWBStocksModels.AWBStockResponseDTOSchema, + options: { + columns: { + id: true, + carrier: true, + startNumber: true, + lastUsedNumber: true, + stock: true, + usedCodes: true, + priority: true, + archived: true, + comments: true, + createdAt: true, + updatedAt: true, + createdBy: true, + updatedBy: true, + officeId: true, + }, + sortable: AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: AWBStocksAcl.canUseFindById, + schema: AWBStocksModels.AWBStockResponseDTOSchema, + query: AWBStocksQueries.useFindById, + }, + create: { + acl: AWBStocksAcl.canUseCreate, + schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, + mutation: AWBStocksQueries.useCreate, + inputDefs: dynamicInputs({ + schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, + options: { + inputs: { + carrierId: true, + startNumber: true, + stock: true, + priority: true, + comments: true, + officeId: true, + }, + }, + }), + }, + update: { + acl: AWBStocksAcl.canUseUpdate, + schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, + mutation: AWBStocksQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, + options: { + inputs: { + comments: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/dist/aWBStocks/aWBStocks.models.ts b/test/generated/dist/aWBStocks/aWBStocks.models.ts new file mode 100644 index 0000000..e8fe89f --- /dev/null +++ b/test/generated/dist/aWBStocks/aWBStocks.models.ts @@ -0,0 +1,164 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace AWBStocksModels { + /** + * AWBStockBusinessPartnerPreviewDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } name Business partner name + * @property { string } carrierPrefix Carrier prefix (3 digits) + */ + export const AWBStockBusinessPartnerPreviewDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + name: z.string().describe("Business partner name"), + carrierPrefix: z.string().describe("Carrier prefix (3 digits)"), + }) + .readonly(); + export type AWBStockBusinessPartnerPreviewDTO = z.infer; + + /** + * AWBStockEmployeePreviewDTOSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Employee email + */ + export const AWBStockEmployeePreviewDTOSchema = z + .object({ id: z.string().describe("Employee ID"), email: z.string().describe("Employee email") }) + .readonly(); + export type AWBStockEmployeePreviewDTO = z.infer; + + /** + * AWBStockResponseDTOSchema + * @type { object } + * @property { string } id AWB stock ID + * @property { AWBStockBusinessPartnerPreviewDTO } carrier Carrier business partner + * @property { number } startNumber Start number + * @property { number } lastUsedNumber Last used number + * @property { number } stock Stock size + * @property { number } usedCodes Used codes count + * @property { number } priority Priority + * @property { boolean } archived Is archived + * @property { string } comments Comments + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { AWBStockEmployeePreviewDTO } createdBy User who created the stock + * @property { AWBStockEmployeePreviewDTO } updatedBy User who updated the stock + * @property { string } officeId Office ID + */ + export const AWBStockResponseDTOSchema = z + .object({ + id: z.string().describe("AWB stock ID"), + carrier: AWBStockBusinessPartnerPreviewDTOSchema.describe("Carrier business partner"), + startNumber: z.number().describe("Start number"), + lastUsedNumber: z.number().describe("Last used number").nullish(), + stock: z.number().describe("Stock size"), + usedCodes: z.number().describe("Used codes count"), + priority: z.number().describe("Priority"), + archived: z.boolean().describe("Is archived"), + comments: z.string().describe("Comments").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + createdBy: AWBStockEmployeePreviewDTOSchema.describe("User who created the stock"), + updatedBy: AWBStockEmployeePreviewDTOSchema.describe("User who updated the stock").nullish(), + officeId: z.string().describe("Office ID"), + }) + .readonly(); + export type AWBStockResponseDTO = z.infer; + + /** + * AWBStockFilterDtoSchema + * @type { object } + * @property { boolean } archived + * @property { string } carrierId + * @property { string } searchQuery + * @property { boolean } used + */ + export const AWBStockFilterDtoSchema = z + .object({ archived: z.boolean(), carrierId: z.string(), searchQuery: z.string(), used: z.boolean() }) + .readonly(); + export type AWBStockFilterDto = z.infer; + + /** + * CreateAWBStockRequestDTOSchema + * @type { object } + * @property { string } carrierId Carrier business partner ID + * @property { number } startNumber Start number. Minimum: `0` + * @property { number } stock Stock size + * @property { number } priority Priority + * @property { string } comments Comments + * @property { string } officeId Office ID + */ + export const CreateAWBStockRequestDTOSchema = z + .object({ + carrierId: z.string().describe("Carrier business partner ID"), + startNumber: z.number().gte(0).describe("Start number"), + stock: z.number().describe("Stock size"), + priority: z.number().describe("Priority"), + comments: z.string().describe("Comments").nullish(), + officeId: z.string().describe("Office ID"), + }) + .readonly(); + export type CreateAWBStockRequestDTO = z.infer; + + /** + * GenerateAWBNumberRequestDTOSchema + * @type { object } + * @property { string } carrierId Carrier ID. Example: `e847c7dd-a364-4488-bed6-1e5878aff022` + */ + export const GenerateAWBNumberRequestDTOSchema = z + .object({ carrierId: z.string().describe("Carrier ID") }) + .readonly(); + export type GenerateAWBNumberRequestDTO = z.infer; + + /** + * GenerateAWBNumberResponseDTOSchema + * @type { object } + * @property { string } formattedAwbNumber Generated AWB number. Example: `123-45678901` + */ + export const GenerateAWBNumberResponseDTOSchema = z + .object({ formattedAwbNumber: z.string().describe("Generated AWB number") }) + .readonly(); + export type GenerateAWBNumberResponseDTO = z.infer; + + /** + * UpdateAWBStockRequestDTOSchema + * @type { object } + * @property { string } comments Comments + */ + export const UpdateAWBStockRequestDTOSchema = z.object({ comments: z.string().describe("Comments") }).readonly(); + export type UpdateAWBStockRequestDTO = z.infer; + + /** + * AWBStocksPaginateOrderParamEnumSchema + * @type { enum } + */ + export const AWBStocksPaginateOrderParamEnumSchema = z.enum([ + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "carrierName", + "startNumber", + "priority", + ]); + export type AWBStocksPaginateOrderParamEnum = z.infer; + export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSchema.enum; + + /** + * AWBStocksPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { AWBStockResponseDTO[] } items + */ + export const AWBStocksPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(AWBStockResponseDTOSchema).readonly() }).readonly().shape, + }); + export type AWBStocksPaginateResponse = z.infer; +} diff --git a/test/generated/dist/aWBStocks/aWBStocks.queries.ts b/test/generated/dist/aWBStocks/aWBStocks.queries.ts new file mode 100644 index 0000000..1731fbc --- /dev/null +++ b/test/generated/dist/aWBStocks/aWBStocks.queries.ts @@ -0,0 +1,319 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AWBStocksAcl } from "./aWBStocks.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AWBStocksModels } from "./aWBStocks.models"; +import { AWBStocksApi } from "./aWBStocks.api"; + +export namespace AWBStocksQueries { + export const moduleName = QueryModule.AWBStocks; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: AWBStocksModels.AWBStockFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/awb-stocks", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: AWBStocksModels.AWBStockFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/awb-stocks", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (stockId: string, officeId: string) => + [...keys.all, "/offices/:officeId/awb-stocks/:stockId", stockId, officeId] as const, + }; + + /** + * Query `usePaginate` + * @summary List AWB stocks + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` + * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: AWBStocksModels.AWBStockFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AWBStocksAcl.canUsePaginate({ officeId })); + return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary List AWB stocks + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` + * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { officeId: string; limit: number; order?: string; filter?: AWBStocksModels.AWBStockFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AWBStocksAcl.canUsePaginate({ officeId })); + return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create AWB stock + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.CreateAWBStockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof AWBStocksApi.create, + { officeId: string; data: AWBStocksModels.CreateAWBStockRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(AWBStocksAcl.canUseCreate({ officeId })); + return AWBStocksApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get AWB stock details + * @permission Requires `canUseFindById` ability + * @param { string } object.stockId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { stockId, officeId }: { stockId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(stockId, officeId), + queryFn: () => { + checkAcl(AWBStocksAcl.canUseFindById({ officeId })); + return AWBStocksApi.findById(stockId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update AWB stock comments + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.UpdateAWBStockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof AWBStocksApi.update, + { stockId: string; officeId: string; data: AWBStocksModels.UpdateAWBStockRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId, data }) => { + checkAcl(AWBStocksAcl.canUseUpdate({ officeId })); + return AWBStocksApi.update(stockId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive AWB stock + * @permission Requires `canUseArchive` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId }) => { + checkAcl(AWBStocksAcl.canUseArchive({ officeId })); + return AWBStocksApi.archive(stockId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive AWB stock + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId }) => { + checkAcl(AWBStocksAcl.canUseUnarchive({ officeId })); + return AWBStocksApi.unarchive(stockId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateNextNumber` + * @summary Generate next AWB number for carrier + * @permission Requires `canUseGenerateNextNumber` ability + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.GenerateAWBNumberRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateNextNumber = ( + options?: AppMutationOptions< + typeof AWBStocksApi.generateNextNumber, + { officeId: string; data: AWBStocksModels.GenerateAWBNumberRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId })); + return AWBStocksApi.generateNextNumber(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/acl/app.ability.ts b/test/generated/dist/acl/app.ability.ts new file mode 100644 index 0000000..3aad6f4 --- /dev/null +++ b/test/generated/dist/acl/app.ability.ts @@ -0,0 +1,387 @@ +import { PureAbility, AbilityTuple, ForcedSubject } from "@casl/ability"; + +export type AppAbilities = + | AbilityTuple< + "Read", + | "WorkingDocument" + | (ForcedSubject<"WorkingDocument"> & { officeId: string }) + | "Office" + | "Currency" + | "Country" + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + | "BusinessPartner" + | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + | "City" + | "Depot" + | "PartnerNetwork" + | "Warehouse" + | "DocumentTemplate" + | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + | "HsCode" + | "CargoType" + | "Position" + | (ForcedSubject<"Position"> & { officeId: string }) + | "Terminal" + | "Airport" + | "Port" + | "ContainerYard" + | "PositionAccount" + | (ForcedSubject<"PositionAccount"> & { officeId: string }) + | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + | "PositionCargo" + | (ForcedSubject<"PositionCargo"> & { officeId: string }) + | "PackageType" + | "WorkingDocument-house-bl" + | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + | "WorkingDocument-bl-instructions" + | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + | "WorkingDocument-ams-instructions" + | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + | "WorkingDocument-house-awb" + | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + | "ChargeType" + | "WorkingDocument-master-awb" + | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + | "WorkingDocument-cmr-form" + | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + | "WorkingDocument-isf-form" + | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + | "WorkingDocument-fcr-form" + | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + | "Role" + | (ForcedSubject<"Role"> & { context?: string }) + | "Permission" + | "Employee" + | (ForcedSubject<"Employee"> & { officeId?: string }) + | (ForcedSubject<"Employee"> & { officeId: string }) + | "Employment" + | (ForcedSubject<"Employment"> & { officeId?: string }) + | "Customer" + | "Quote" + | (ForcedSubject<"Quote"> & { officeId: string }) + | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) + | "QuoteCargo" + | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + | "Dunning" + | (ForcedSubject<"Dunning"> & { officeId: string }) + | "PositionInvoice" + | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + | "DunningLevel" + | (ForcedSubject<"DunningLevel"> & { officeId: string }) + | "DunningSystem" + | (ForcedSubject<"DunningSystem"> & { officeId: string }) + | "VatRule" + | "ProjectLite" + | (ForcedSubject<"ProjectLite"> & { officeId: string }) + | "ChecklistTemplate" + | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + | "BookkeepingExportBatch" + | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + | "FactoringExport" + | (ForcedSubject<"FactoringExport"> & { officeId: string }) + | "AWBStock" + | (ForcedSubject<"AWBStock"> & { officeId: string }) + | "ChecklistItem" + | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + | "RemarkTemplate" + | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + | "IntegrationChannel" + | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + | "IntegrationMessage" + | (ForcedSubject<"IntegrationMessage"> & { officeId: string }) + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + | (ForcedSubject<"Office"> & { officeId: string }) + > + | AbilityTuple< + "Create", + | "Office" + | "Currency" + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + | "BusinessPartner" + | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + | "City" + | "Depot" + | "PartnerNetwork" + | "Warehouse" + | "DocumentTemplate" + | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + | "HsCode" + | "CargoType" + | "Terminal" + | "Airport" + | "Port" + | "ContainerYard" + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + | "PositionCargo" + | (ForcedSubject<"PositionCargo"> & { officeId: string }) + | "PackageType" + | "WorkingDocument-house-bl" + | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + | "WorkingDocument-bl-instructions" + | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + | "WorkingDocument-ams-instructions" + | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + | "WorkingDocument-house-awb" + | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + | "ChargeType" + | "WorkingDocument-master-awb" + | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + | "WorkingDocument-cmr-form" + | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + | "WorkingDocument-isf-form" + | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + | "WorkingDocument-fcr-form" + | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + | "Role" + | "Employee" + | (ForcedSubject<"Employee"> & { officeId?: string }) + | (ForcedSubject<"Employee"> & { officeId: string }) + | "Employment" + | (ForcedSubject<"Employment"> & { officeId: string }) + | "Customer" + | "Quote" + | (ForcedSubject<"Quote"> & { officeId: string }) + | "QuoteCargo" + | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + | "Dunning" + | (ForcedSubject<"Dunning"> & { officeId: string }) + | "DunningLevel" + | (ForcedSubject<"DunningLevel"> & { officeId: string }) + | "DunningSystem" + | (ForcedSubject<"DunningSystem"> & { officeId: string }) + | "Position" + | (ForcedSubject<"Position"> & { officeId: string }) + | "PositionInvoice" + | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + | "VatRule" + | "ProjectLite" + | (ForcedSubject<"ProjectLite"> & { officeId: string }) + | "ChecklistTemplate" + | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + | "BookkeepingExportBatch" + | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + | "FactoringExport" + | (ForcedSubject<"FactoringExport"> & { officeId: string }) + | "AWBStock" + | (ForcedSubject<"AWBStock"> & { officeId: string }) + | "ChecklistItem" + | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + | "RemarkTemplate" + | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + | "IntegrationChannel" + | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + > + | AbilityTuple< + "Update", + | "Office" + | (ForcedSubject<"Office"> & { officeId: string }) + | "Currency" + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + | "BusinessPartner" + | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + | "BusinessPartnerBasicTab" + | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) + | "BusinessPartnerBookkeeping" + | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + | "City" + | "Depot" + | "PartnerNetwork" + | "Warehouse" + | "DocumentTemplate" + | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + | "HsCode" + | "CargoType" + | "Position" + | (ForcedSubject<"Position"> & { officeId: string }) + | "Terminal" + | "Airport" + | "Port" + | "ContainerYard" + | "PositionAccount" + | (ForcedSubject<"PositionAccount"> & { officeId: string }) + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + | "PositionCargo" + | (ForcedSubject<"PositionCargo"> & { officeId: string }) + | "PackageType" + | "WorkingDocument-house-bl" + | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + | "WorkingDocument-bl-instructions" + | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + | "WorkingDocument-ams-instructions" + | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + | "WorkingDocument-house-awb" + | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + | "ChargeType" + | "WorkingDocument-master-awb" + | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + | "WorkingDocument-cmr-form" + | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + | "WorkingDocument-isf-form" + | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + | "WorkingDocument-fcr-form" + | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + | "Role" + | "Employee" + | (ForcedSubject<"Employee"> & { officeId: string }) + | "Customer" + | "Quote" + | (ForcedSubject<"Quote"> & { officeId: string }) + | "QuoteCargo" + | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + | "DunningLevel" + | (ForcedSubject<"DunningLevel"> & { officeId: string }) + | "DunningSystem" + | (ForcedSubject<"DunningSystem"> & { officeId: string }) + | "PositionInvoice" + | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + | "VatRule" + | "ProjectLite" + | (ForcedSubject<"ProjectLite"> & { officeId: string }) + | "ChecklistTemplate" + | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + | "BookkeepingExportBatch" + | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + | "FactoringExport" + | (ForcedSubject<"FactoringExport"> & { officeId: string }) + | "AWBStock" + | (ForcedSubject<"AWBStock"> & { officeId: string }) + | "ChecklistItem" + | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + | "RemarkTemplate" + | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + | "IntegrationChannel" + | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + > + | AbilityTuple< + "Delete", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + | "BusinessPartnerBookkeeping" + | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + | "PositionCargo" + | (ForcedSubject<"PositionCargo"> & { officeId: string }) + | "WorkingDocument-house-bl" + | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + | "WorkingDocument-bl-instructions" + | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + | "WorkingDocument-ams-instructions" + | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + | "WorkingDocument-house-awb" + | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + | "WorkingDocument-master-awb" + | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + | "WorkingDocument-cmr-form" + | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + | "WorkingDocument-isf-form" + | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + | "WorkingDocument-fcr-form" + | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + | "Role" + | "QuoteCargo" + | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + | "PositionInvoice" + | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + > + | AbilityTuple< + "Archive", + | "BusinessPartner" + | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + | "City" + | "Depot" + | "PartnerNetwork" + | "Warehouse" + | "DocumentTemplate" + | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + | "HsCode" + | "CargoType" + | "Terminal" + | "PackageType" + | "ChargeType" + | "Employee" + | "Employment" + | (ForcedSubject<"Employment"> & { officeId: string }) + | "DunningLevel" + | (ForcedSubject<"DunningLevel"> & { officeId: string }) + | "DunningSystem" + | (ForcedSubject<"DunningSystem"> & { officeId: string }) + | "ProjectLite" + | (ForcedSubject<"ProjectLite"> & { officeId: string }) + | "ChecklistTemplate" + | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + | "ChecklistItem" + | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + | "RemarkTemplate" + | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + | "IntegrationChannel" + | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + > + | AbilityTuple<"ReadRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> + | AbilityTuple<"CreateRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> + | AbilityTuple<"UpdateRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> + | AbilityTuple<"DeleteRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> + | AbilityTuple< + "Unarchive", + | "DocumentTemplate" + | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + | "Terminal" + | "Employee" + | "Employment" + | (ForcedSubject<"Employment"> & { officeId: string }) + | "DunningLevel" + | (ForcedSubject<"DunningLevel"> & { officeId: string }) + | "RemarkTemplate" + | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + > + | AbilityTuple< + "Duplicate", + | "PositionAccount" + | (ForcedSubject<"PositionAccount"> & { officeId: string }) + | "PositionCargo" + | (ForcedSubject<"PositionCargo"> & { officeId: string }) + | "QuoteCargo" + | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + > + | AbilityTuple<"Reassign", "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string })> + | AbilityTuple<"ListRoles", "Employee" | "Employment" | (ForcedSubject<"Employment"> & { officeId: string })> + | AbilityTuple<"UpdateRoles", "Employee" | "Employment" | (ForcedSubject<"Employment"> & { officeId: string })> + | AbilityTuple<"Deactivate", "Customer"> + | AbilityTuple<"Reactivate", "Customer"> + | AbilityTuple< + "Export", + | "Quote" + | (ForcedSubject<"Quote"> & { officeId: string }) + | "Position" + | (ForcedSubject<"Position"> & { officeId: string }) + | "PositionInvoice" + | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + | "UninvoicedCharge" + | (ForcedSubject<"UninvoicedCharge"> & { officeId: string }) + | "InvoicePayment" + | (ForcedSubject<"InvoicePayment"> & { officeId: string }) + | "BookkeepingExportBatch" + | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + > + | AbilityTuple<"ReadInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> + | AbilityTuple<"CreateInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> + | AbilityTuple<"UpdateInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> + | AbilityTuple<"DeleteInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> + | AbilityTuple<"TotalProfitView", "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string })> + | AbilityTuple<"RevertCancel", "Position" | (ForcedSubject<"Position"> & { officeId: string })> + | AbilityTuple<"Fix", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> + | AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> + | AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> + | AbilityTuple<"Import", "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string })>; + +export type AppAbility = PureAbility; diff --git a/test/generated/dist/acl/useAclCheck.ts b/test/generated/dist/acl/useAclCheck.ts new file mode 100644 index 0000000..40d64ad --- /dev/null +++ b/test/generated/dist/acl/useAclCheck.ts @@ -0,0 +1,24 @@ +import { AbilityTuple } from "@casl/ability"; +import { type ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; +import { AbilityContext } from "@povio/openapi-codegen-cli/acl"; +import { useCallback } from "react"; +import { AppAbilities } from "@/data/acl/app.ability"; + +interface UseAclCheckProps { + errorHandler?: ErrorHandler; +} + +export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { + const ability = AbilityContext.useAbility(); + + const checkAcl = useCallback( + (appAbility: AppAbilities) => { + if (!ability.can(...(appAbility as AbilityTuple))) { + (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); + } + }, + [ability, errorHandler], + ); + + return { checkAcl }; +} diff --git a/test/generated/dist/airPositions/airPositions.acl.ts b/test/generated/dist/airPositions/airPositions.acl.ts new file mode 100644 index 0000000..10a4dc7 --- /dev/null +++ b/test/generated/dist/airPositions/airPositions.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace AirPositionsAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get air position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update air position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/airPositions/airPositions.api.ts b/test/generated/dist/airPositions/airPositions.api.ts new file mode 100644 index 0000000..172bf2e --- /dev/null +++ b/test/generated/dist/airPositions/airPositions.api.ts @@ -0,0 +1,27 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { AirPositionsModels } from "./airPositions.models"; + +export namespace AirPositionsApi { + export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/air-position`, + config, + ); + }; + export const update = ( + officeId: string, + positionId: string, + data: AirPositionsModels.UpdateAirPositionRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/air-position`, + ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/airPositions/airPositions.models.ts b/test/generated/dist/airPositions/airPositions.models.ts new file mode 100644 index 0000000..a3dd669 --- /dev/null +++ b/test/generated/dist/airPositions/airPositions.models.ts @@ -0,0 +1,77 @@ +import { z } from "zod"; + +export namespace AirPositionsModels { + /** + * AirPositionCustomsStatusTypeEnumSchema + * @type { enum } + */ + export const AirPositionCustomsStatusTypeEnumSchema = z.enum(["Other", "X", "C", "TD", "T1"]); + export type AirPositionCustomsStatusTypeEnum = z.infer; + export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnumSchema.enum; + + /** + * AirPositionResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } hawbNumber + * @property { string } mawbNumber + * @property { string } airlineDeadline + * @property { string } customsStatus + * @property { AirPositionCustomsStatusTypeEnum } customsStatusType + * @property { boolean } hawbRequired + * @property { boolean } mawbRequired + * @property { string } mrnT1Number + * @property { boolean } isCourier + * @property { string } deliveryToConsignee + * @property { string } createdAt + * @property { string } updatedAt + */ + export const AirPositionResponseDTOSchema = z + .object({ + id: z.string(), + hawbNumber: z.string().nullish(), + mawbNumber: z.string().nullish(), + airlineDeadline: z.iso.datetime({ offset: true }).nullish(), + customsStatus: z.string().nullish(), + customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), + hawbRequired: z.boolean(), + mawbRequired: z.boolean(), + mrnT1Number: z.string().nullish(), + isCourier: z.boolean().nullish(), + deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type AirPositionResponseDTO = z.infer; + + /** + * UpdateAirPositionRequestDTOSchema + * @type { object } + * @property { string } hawbNumber + * @property { string } mawbNumber + * @property { string } airlineDeadline + * @property { string } customsStatus + * @property { AirPositionCustomsStatusTypeEnum } customsStatusType + * @property { string } mrnT1Number + * @property { boolean } hawbRequired + * @property { boolean } mawbRequired + * @property { boolean } isCourier + * @property { string } deliveryToConsignee + */ + export const UpdateAirPositionRequestDTOSchema = z + .object({ + hawbNumber: z.string(), + mawbNumber: z.string(), + airlineDeadline: z.iso.datetime({ offset: true }), + customsStatus: z.string(), + customsStatusType: AirPositionCustomsStatusTypeEnumSchema, + mrnT1Number: z.string(), + hawbRequired: z.boolean(), + mawbRequired: z.boolean(), + isCourier: z.boolean(), + deliveryToConsignee: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type UpdateAirPositionRequestDTO = z.infer; +} diff --git a/test/generated/dist/airPositions/airPositions.queries.ts b/test/generated/dist/airPositions/airPositions.queries.ts new file mode 100644 index 0000000..3cddf4f --- /dev/null +++ b/test/generated/dist/airPositions/airPositions.queries.ts @@ -0,0 +1,83 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AirPositionsAcl } from "./airPositions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AirPositionsModels } from "./airPositions.models"; +import { AirPositionsApi } from "./airPositions.api"; + +export namespace AirPositionsQueries { + export const moduleName = QueryModule.AirPositions; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/air-position", officeId, positionId] as const, + }; + + /** + * Query `useGet` + * @summary Get air position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(AirPositionsAcl.canUseGet({ officeId })); + return AirPositionsApi.get(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update air position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AirPositionsModels.UpdateAirPositionRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof AirPositionsApi.update, + { officeId: string; positionId: string; data: AirPositionsModels.UpdateAirPositionRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(AirPositionsAcl.canUseUpdate({ officeId })); + return AirPositionsApi.update(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/airports/airports.acl.ts b/test/generated/dist/airports/airports.acl.ts new file mode 100644 index 0000000..5ec8aa1 --- /dev/null +++ b/test/generated/dist/airports/airports.acl.ts @@ -0,0 +1,33 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace AirportsAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Airport"] as AbilityTuple<"Create", "Airport">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Airport"] as AbilityTuple<"Update", "Airport">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; +} diff --git a/test/generated/dist/airports/airports.api.ts b/test/generated/dist/airports/airports.api.ts new file mode 100644 index 0000000..0ea10f9 --- /dev/null +++ b/test/generated/dist/airports/airports.api.ts @@ -0,0 +1,101 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { AirportsModels } from "./airports.models"; + +export namespace AirportsApi { + export const paginate = ( + limit: number, + order?: string, + filter?: AirportsModels.AirportPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: AirportsModels.AirportsPaginateResponseSchema }, `/airports`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: AirportsModels.CreateAirportRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports`, + ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), + config, + ); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: AirportsModels.AirportLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, + `/airports/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports/${id}`, + ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), + config, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: AirportsModels.AirportResponseDTOSchema }, `/airports/${id}`, config); + }; +} diff --git a/test/generated/dist/airports/airports.configs.ts b/test/generated/dist/airports/airports.configs.ts new file mode 100644 index 0000000..477cb42 --- /dev/null +++ b/test/generated/dist/airports/airports.configs.ts @@ -0,0 +1,117 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { AirportsModels } from "./airports.models"; +import { CommonModels } from "@/data/common/common.models"; +import { AirportsQueries } from "./airports.queries"; +import { AirportsAcl } from "./airports.acl"; + +export namespace AirportsConfigs { + export const airportsConfig = { + meta: { + title: "Airports", + }, + readAll: { + acl: AirportsAcl.canUsePaginate, + schema: AirportsModels.AirportResponseDTOSchema, + paginated: AirportsQueries.usePaginate, + infinite: AirportsQueries.usePaginateInfinite, + filters: { + schema: AirportsModels.AirportPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AirportsModels.AirportPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: AirportsModels.AirportResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + iataCode: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: AirportsModels.AirportsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: AirportsAcl.canUseFindById, + schema: AirportsModels.AirportResponseDTOSchema, + query: AirportsQueries.useFindById, + }, + create: { + acl: AirportsAcl.canUseCreate, + schema: AirportsModels.CreateAirportRequestDTOSchema, + mutation: AirportsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: AirportsModels.CreateAirportRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + iataCode: true, + }, + }, + }), + }, + update: { + acl: AirportsAcl.canUseUpdate, + schema: AirportsModels.UpdateAirportRequestDTOSchema, + mutation: AirportsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: AirportsModels.UpdateAirportRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + iataCode: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: AirportsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: AirportsQueries.usePaginateLabels, + infinite: AirportsQueries.usePaginateLabelsInfinite, + filters: { + schema: AirportsModels.AirportLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AirportsModels.AirportLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/airports/airports.models.ts b/test/generated/dist/airports/airports.models.ts new file mode 100644 index 0000000..790cc10 --- /dev/null +++ b/test/generated/dist/airports/airports.models.ts @@ -0,0 +1,157 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace AirportsModels { + /** + * AirportEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type AirportEmployeeDTO = z.infer; + + /** + * AirportResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the airport + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + * @property { string } createdById + * @property { AirportEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { AirportEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const AirportResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the airport"), + name: z.string().describe("Name of the airport"), + matchCode: z.string().describe("Match code for the airport"), + iataCode: z.string().describe("IATA code of the airport"), + createdById: z.string().nullish(), + createdBy: AirportEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: AirportEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type AirportResponseDTO = z.infer; + + /** + * AirportPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter airports by name, match code or IATA code + */ + export const AirportPaginationFilterDtoSchema = z + .object({ search: z.string().describe("Search term to filter airports by name, match code or IATA code") }) + .readonly(); + export type AirportPaginationFilterDto = z.infer; + + /** + * AirportLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const AirportLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type AirportLabelFilterDto = z.infer; + + /** + * CreateAirportRequestDTOSchema + * @type { object } + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + */ + export const CreateAirportRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the airport"), + matchCode: z.string().describe("Match code for the airport"), + iataCode: z.string().describe("IATA code of the airport"), + }) + .readonly(); + export type CreateAirportRequestDTO = z.infer; + + /** + * UpdateAirportRequestDTOSchema + * @type { object } + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + */ + export const UpdateAirportRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the airport"), + matchCode: z.string().describe("Match code for the airport"), + iataCode: z.string().describe("IATA code of the airport"), + }) + .readonly(); + export type UpdateAirportRequestDTO = z.infer; + + /** + * AirportsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const AirportsPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "iataCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type AirportsPaginateOrderParamEnum = z.infer; + export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSchema.enum; + + /** + * AirportsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { AirportResponseDTO[] } items + */ + export const AirportsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(AirportResponseDTOSchema).readonly() }).readonly().shape, + }); + export type AirportsPaginateResponse = z.infer; + + /** + * AirportsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const AirportsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "iataCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type AirportsPaginateLabelsOrderParamEnum = z.infer; + export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * AirportsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const AirportsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type AirportsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/airports/airports.queries.ts b/test/generated/dist/airports/airports.queries.ts new file mode 100644 index 0000000..3f6c5b9 --- /dev/null +++ b/test/generated/dist/airports/airports.queries.ts @@ -0,0 +1,294 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AirportsAcl } from "./airports.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AirportsModels } from "./airports.models"; +import { AirportsApi } from "./airports.api"; + +export namespace AirportsQueries { + export const moduleName = QueryModule.Airports; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: AirportsModels.AirportPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/airports", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: AirportsModels.AirportPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/airports", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: AirportsModels.AirportLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/airports/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: AirportsModels.AirportLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/airports/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/airports/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Airports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: AirportsModels.AirportPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AirportsAcl.canUsePaginate()); + return AirportsApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Airports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: AirportsModels.AirportPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AirportsAcl.canUsePaginate()); + return AirportsApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create airport + * @permission Requires `canUseCreate` ability + * @param { AirportsModels.CreateAirportRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(AirportsAcl.canUseCreate()); + return AirportsApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate airports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: AirportsModels.AirportLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AirportsAcl.canUsePaginateLabels()); + return AirportsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate airports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: AirportsModels.AirportLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AirportsAcl.canUsePaginateLabels()); + return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update airport + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { AirportsModels.UpdateAirportRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof AirportsApi.update, + { id: string; data: AirportsModels.UpdateAirportRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(AirportsAcl.canUseUpdate()); + return AirportsApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get airport + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(AirportsAcl.canUseFindById()); + return AirportsApi.findById(id, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/app-rest-client.ts b/test/generated/dist/app-rest-client.ts new file mode 100644 index 0000000..389b1f4 --- /dev/null +++ b/test/generated/dist/app-rest-client.ts @@ -0,0 +1,7 @@ +import { RestClient } from "@povio/openapi-codegen-cli"; + +export const AppRestClient = new RestClient({ + config: { + baseURL: "http://localhost:4000", + }, +}); diff --git a/test/generated/dist/bankAccounts/bankAccounts.acl.ts b/test/generated/dist/bankAccounts/bankAccounts.acl.ts new file mode 100644 index 0000000..d8024f8 --- /dev/null +++ b/test/generated/dist/bankAccounts/bankAccounts.acl.ts @@ -0,0 +1,15 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace BankAccountsAcl { + /** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; +} diff --git a/test/generated/dist/bankAccounts/bankAccounts.api.ts b/test/generated/dist/bankAccounts/bankAccounts.api.ts new file mode 100644 index 0000000..bd4a5d1 --- /dev/null +++ b/test/generated/dist/bankAccounts/bankAccounts.api.ts @@ -0,0 +1,60 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BankAccountsModels } from "./bankAccounts.models"; + +export namespace BankAccountsApi { + export const findAll = (search?: string, officeId?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, + `/bank-accounts/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), + }, + }, + ); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: BankAccountsModels.BankAccountFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, + `/bank-accounts/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/dist/bankAccounts/bankAccounts.configs.ts b/test/generated/dist/bankAccounts/bankAccounts.configs.ts new file mode 100644 index 0000000..2659ac4 --- /dev/null +++ b/test/generated/dist/bankAccounts/bankAccounts.configs.ts @@ -0,0 +1,42 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { BankAccountsModels } from "./bankAccounts.models"; +import { BankAccountsQueries } from "./bankAccounts.queries"; +import { BankAccountsAcl } from "./bankAccounts.acl"; + +export namespace BankAccountsConfigs { + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: BankAccountsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: BankAccountsQueries.usePaginateLabels, + infinite: BankAccountsQueries.usePaginateLabelsInfinite, + filters: { + schema: BankAccountsModels.BankAccountFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BankAccountsModels.BankAccountFilterDtoSchema, + options: { + inputs: { + search: true, + officeId: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/bankAccounts/bankAccounts.models.ts b/test/generated/dist/bankAccounts/bankAccounts.models.ts new file mode 100644 index 0000000..8c8b664 --- /dev/null +++ b/test/generated/dist/bankAccounts/bankAccounts.models.ts @@ -0,0 +1,49 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BankAccountsModels { + /** + * BankAccountFilterDtoSchema + * @type { object } + * @property { string } search Search by name or bank name + * @property { string } officeId Office ID to filter by + */ + export const BankAccountFilterDtoSchema = z + .object({ + search: z.string().describe("Search by name or bank name"), + officeId: z.string().describe("Office ID to filter by"), + }) + .readonly(); + export type BankAccountFilterDto = z.infer; + + /** + * BankAccountsFindAllResponseSchema + * @type { array } + */ + export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type BankAccountsFindAllResponse = z.infer; + + /** + * BankAccountsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const BankAccountsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "bankName", "createdAt", "updatedAt"]); + export type BankAccountsPaginateLabelsOrderParamEnum = z.infer; + export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * BankAccountsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const BankAccountsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type BankAccountsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/bankAccounts/bankAccounts.queries.ts b/test/generated/dist/bankAccounts/bankAccounts.queries.ts new file mode 100644 index 0000000..5ac3804 --- /dev/null +++ b/test/generated/dist/bankAccounts/bankAccounts.queries.ts @@ -0,0 +1,139 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BankAccountsAcl } from "./bankAccounts.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { BankAccountsModels } from "./bankAccounts.models"; +import { BankAccountsApi } from "./bankAccounts.api"; + +export namespace BankAccountsQueries { + export const moduleName = QueryModule.BankAccounts; + + export const keys = { + all: [moduleName] as const, + findAll: (search?: string, officeId?: string) => [...keys.all, "/bank-accounts/labels", search, officeId] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: BankAccountsModels.BankAccountFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/bank-accounts/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: BankAccountsModels.BankAccountFilterDto, + cursor?: string, + ) => [...keys.all, "/bank-accounts/labels/paginate", "infinite", limit, order, filter, cursor] as const, + }; + + /** + * Query `useFindAll` + * @summary List all bank accounts with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { string } object.officeId Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { search, officeId }: { search?: string; officeId?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search, officeId), + queryFn: () => { + checkAcl(BankAccountsAcl.canUseFindAll()); + return BankAccountsApi.findAll(search, officeId, config); + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate bank account labels (id and name only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` + * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: BankAccountsModels.BankAccountFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BankAccountsAcl.canUsePaginateLabels()); + return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate bank account labels (id and name only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` + * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: BankAccountsModels.BankAccountFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BankAccountsAcl.canUsePaginateLabels()); + return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/bookkeepingExport/bookkeepingExport.acl.ts b/test/generated/dist/bookkeepingExport/bookkeepingExport.acl.ts new file mode 100644 index 0000000..7fa63b1 --- /dev/null +++ b/test/generated/dist/bookkeepingExport/bookkeepingExport.acl.ts @@ -0,0 +1,123 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BookkeepingExportAcl { + /** + * Use for `useCreateBatch` mutation ability. For global ability, omit the object parameter. + * @description Create bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBatch` mutation + */ + export const canUseCreateBatch = (object?: { officeId: string }) => + ["Create", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Create", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `usePaginateBatches` query ability. For global ability, omit the object parameter. + * @description List bookkeeping export batches + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatches` query + */ + export const canUsePaginateBatches = (object?: { officeId: string }) => + ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Read", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useGetBatch` query ability. For global ability, omit the object parameter. + * @description Get bookkeeping export batch details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query + */ + export const canUseGetBatch = (object?: { officeId: string }) => + ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Read", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBatchFormat` mutation ability. For global ability, omit the object parameter. + * @description Update bookkeeping export batch format + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchFormat` mutation + */ + export const canUseUpdateBatchFormat = (object?: { officeId: string }) => + ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Update", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBatchItem` mutation ability. For global ability, omit the object parameter. + * @description Update bookkeeping export batch item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchItem` mutation + */ + export const canUseUpdateBatchItem = (object?: { officeId: string }) => + ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Update", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `usePaginateBatchItems` query ability. For global ability, omit the object parameter. + * @description List batch items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatchItems` query + */ + export const canUsePaginateBatchItems = (object?: { officeId: string }) => + ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Read", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useValidateBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Export bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useValidateBookkeepingBatch` mutation + */ + export const canUseValidateBookkeepingBatch = (object?: { officeId: string }) => + ["Export", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Export", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useExportBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Export bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportBookkeepingBatch` mutation + */ + export const canUseExportBookkeepingBatch = (object?: { officeId: string }) => + ["Export", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Export", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useRevertBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Revert bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertBookkeepingBatch` mutation + */ + export const canUseRevertBookkeepingBatch = (object?: { officeId: string }) => + ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Update", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; + + /** + * Use for `useGetVatLineItems` query ability. For global ability, omit the object parameter. + * @description Get VAT line items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetVatLineItems` query + */ + export const canUseGetVatLineItems = (object?: { officeId: string }) => + ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< + "Read", + "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/bookkeepingExport/bookkeepingExport.api.ts b/test/generated/dist/bookkeepingExport/bookkeepingExport.api.ts new file mode 100644 index 0000000..e6b7a21 --- /dev/null +++ b/test/generated/dist/bookkeepingExport/bookkeepingExport.api.ts @@ -0,0 +1,176 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; + +export namespace BookkeepingExportApi { + export const createBatch = ( + officeId: string, + data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, + `/offices/${officeId}/bookkeeping-exports`, + ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), + config, + ); + }; + export const paginateBatches = ( + officeId: string, + limit: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, + `/offices/${officeId}/bookkeeping-exports`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const getBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, + `/offices/${officeId}/bookkeeping-exports/${batchId}`, + config, + ); + }; + export const updateBatchFormat = ( + officeId: string, + batchId: string, + data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, + `/offices/${officeId}/bookkeeping-exports/${batchId}`, + ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), + config, + ); + }; + export const updateBatchItem = ( + officeId: string, + batchId: string, + data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, + ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), + config, + ); + }; + export const paginateBatchItems = ( + officeId: string, + batchId: string, + limit: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, + `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const validateBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, + undefined, + config, + ); + }; + export const exportBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, + undefined, + config, + ); + }; + export const revertBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, + undefined, + config, + ); + }; + export const getVatLineItems = (officeId: string, batchId: string, order?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, + `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + }, + }, + ); + }; +} diff --git a/test/generated/dist/bookkeepingExport/bookkeepingExport.configs.ts b/test/generated/dist/bookkeepingExport/bookkeepingExport.configs.ts new file mode 100644 index 0000000..da4a913 --- /dev/null +++ b/test/generated/dist/bookkeepingExport/bookkeepingExport.configs.ts @@ -0,0 +1,122 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; +import { BookkeepingExportQueries } from "./bookkeepingExport.queries"; +import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; + +export namespace BookkeepingExportConfigs { + export const bookkeepingExportsConfig = { + meta: { + title: "Bookkeeping Exports", + }, + readAll: { + acl: BookkeepingExportAcl.canUsePaginateBatches, + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, + paginated: BookkeepingExportQueries.usePaginateBatches, + infinite: BookkeepingExportQueries.usePaginateBatchesInfinite, + filters: { + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, + options: { + inputs: { + createdDate: true, + status: true, + format: true, + createdBy: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, + options: { + columns: { + id: true, + format: true, + status: true, + totalInvoiceCount: true, + exportedInvoiceCount: true, + createdBy: true, + createdAt: true, + exportedAt: true, + revertedAt: true, + files: true, + }, + sortable: BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema, + }, + }), + }, + read: { + acl: BookkeepingExportAcl.canUseGetBatch, + schema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema, + query: BookkeepingExportQueries.useGetBatch, + }, + create: { + acl: BookkeepingExportAcl.canUseCreateBatch, + schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, + mutation: BookkeepingExportQueries.useCreateBatch, + inputDefs: dynamicInputs({ + schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, + options: { + inputs: { + format: true, + invoiceFilters: true, + }, + }, + }), + }, + update: { + acl: BookkeepingExportAcl.canUseUpdateBatchFormat, + schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, + mutation: BookkeepingExportQueries.useUpdateBatchFormat, + inputDefs: dynamicInputs({ + schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, + options: { + inputs: { + format: true, + }, + }, + }), + }, + }; + + export const itemsConfig = { + meta: { + title: "Items", + }, + readAll: { + acl: BookkeepingExportAcl.canUsePaginateBatchItems, + schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, + paginated: BookkeepingExportQueries.usePaginateBatchItems, + infinite: BookkeepingExportQueries.usePaginateBatchItemsInfinite, + filters: { + schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, + options: { + inputs: { + status: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, + options: { + columns: { + id: true, + invoiceId: true, + status: true, + includedInExport: true, + validationIssues: true, + invoice: true, + receiver: true, + comments: true, + }, + sortable: BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/bookkeepingExport/bookkeepingExport.models.ts b/test/generated/dist/bookkeepingExport/bookkeepingExport.models.ts new file mode 100644 index 0000000..98765c8 --- /dev/null +++ b/test/generated/dist/bookkeepingExport/bookkeepingExport.models.ts @@ -0,0 +1,466 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BookkeepingExportModels { + /** + * BookkeepingExportFormatEnumSchema + * @type { enum } + */ + export const BookkeepingExportFormatEnumSchema = z.enum(["Bmd", "BmdWithoutCost", "BmdHamburg", "Abra", "Pantheon"]); + export type BookkeepingExportFormatEnum = z.infer; + export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enum; + + /** + * CreateBookkeepingExportBatchRequestDtoSchema + * @type { object } + * @property { BookkeepingExportFormatEnum } format + * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters + */ + export const CreateBookkeepingExportBatchRequestDtoSchema = z + .object({ + format: BookkeepingExportFormatEnumSchema.nullish(), + invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema, + }) + .readonly(); + export type CreateBookkeepingExportBatchRequestDto = z.infer; + + /** + * BookkeepingExportFileTypeEnumSchema + * @type { enum } + */ + export const BookkeepingExportFileTypeEnumSchema = z.enum([ + "Invoices", + "BusinessPartners", + "Report", + "AbraAddressBook", + "AbraIssuedInvoices", + "AbraIssuedInvoiceItems", + "AbraReceivedInvoices", + "AbraReceivedInvoiceItems", + "PantheonInvoicesOutgoingEur", + "PantheonInvoicesOutgoingUsd", + "PantheonInvoicesIncomingEur", + "PantheonInvoicesIncomingUsd", + "PantheonCostCenters", + ]); + export type BookkeepingExportFileTypeEnum = z.infer; + export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema.enum; + + /** + * BookkeepingExportFileDtoSchema + * @type { object } + * @property { BookkeepingExportFileTypeEnum } variant + * @property { string } downloadUrl + * @property { string } fileName + */ + export const BookkeepingExportFileDtoSchema = z + .object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }) + .readonly(); + export type BookkeepingExportFileDto = z.infer; + + /** + * BookkeepingExportBatchStatusEnumSchema + * @type { enum } + */ + export const BookkeepingExportBatchStatusEnumSchema = z.enum([ + "Initializing", + "Preparing", + "Exported", + "Reverted", + "Failed", + ]); + export type BookkeepingExportBatchStatusEnum = z.infer; + export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnumSchema.enum; + + /** + * BookkeepingExportBatchSummaryDtoSchema + * @type { object } + * @property { number } totalCount + * @property { number } needsReviewCount + * @property { number } readyForExportCount + * @property { number } excludedCount + * @property { object } invoiceNumberRange + * @property { string } invoiceNumberRange.from + * @property { string } invoiceNumberRange.to + * @property { object } dateRange + * @property { string } dateRange.from + * @property { string } dateRange.to + */ + export const BookkeepingExportBatchSummaryDtoSchema = z + .object({ + totalCount: z.number(), + needsReviewCount: z.number(), + readyForExportCount: z.number(), + excludedCount: z.number(), + invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).readonly().nullish(), + dateRange: z + .object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }) + .readonly() + .nullish(), + }) + .readonly(); + export type BookkeepingExportBatchSummaryDto = z.infer; + + /** + * BookkeepingExportBatchDetailsDtoSchema + * @type { object } + * @property { string } id + * @property { BookkeepingExportFormatEnum } format + * @property { BookkeepingExportBatchStatusEnum } status + * @property { number } totalInvoiceCount + * @property { number } exportedInvoiceCount + * @property { object } createdBy + * @property { string } createdBy.id + * @property { string } createdBy.fullName + * @property { string } createdBy.email + * @property { string } createdAt + * @property { string } exportedAt + * @property { string } revertedAt + * @property { object } revertedBy + * @property { string } revertedBy.id + * @property { string } revertedBy.fullName + * @property { string } revertedBy.email + * @property { BookkeepingExportBatchSummaryDto } summary + * @property { BookkeepingExportFileDto[] } files + */ + export const BookkeepingExportBatchDetailsDtoSchema = z + .object({ + id: z.string(), + format: BookkeepingExportFormatEnumSchema, + status: BookkeepingExportBatchStatusEnumSchema, + totalInvoiceCount: z.number(), + exportedInvoiceCount: z.number(), + createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), + createdAt: z.iso.datetime({ offset: true }), + exportedAt: z.iso.datetime({ offset: true }).nullish(), + revertedAt: z.iso.datetime({ offset: true }).nullish(), + revertedBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly().nullish(), + summary: BookkeepingExportBatchSummaryDtoSchema, + files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish(), + }) + .readonly(); + export type BookkeepingExportBatchDetailsDto = z.infer; + + /** + * UpdateBookkeepingExportBatchRequestDtoSchema + * @type { object } + * @property { BookkeepingExportFormatEnum } format + */ + export const UpdateBookkeepingExportBatchRequestDtoSchema = z + .object({ format: BookkeepingExportFormatEnumSchema }) + .readonly(); + export type UpdateBookkeepingExportBatchRequestDto = z.infer; + + /** + * BookkeepingExportBatchPreviewDtoSchema + * @type { object } + * @property { string } id + * @property { BookkeepingExportFormatEnum } format + * @property { BookkeepingExportBatchStatusEnum } status + * @property { number } totalInvoiceCount + * @property { number } exportedInvoiceCount + * @property { object } createdBy + * @property { string } createdBy.id + * @property { string } createdBy.fullName + * @property { string } createdBy.email + * @property { string } createdAt + * @property { string } exportedAt + * @property { string } revertedAt + * @property { BookkeepingExportFileDto[] } files + */ + export const BookkeepingExportBatchPreviewDtoSchema = z + .object({ + id: z.string(), + format: BookkeepingExportFormatEnumSchema, + status: BookkeepingExportBatchStatusEnumSchema, + totalInvoiceCount: z.number(), + exportedInvoiceCount: z.number(), + createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), + createdAt: z.iso.datetime({ offset: true }), + exportedAt: z.iso.datetime({ offset: true }).nullish(), + revertedAt: z.iso.datetime({ offset: true }).nullish(), + files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish(), + }) + .readonly(); + export type BookkeepingExportBatchPreviewDto = z.infer; + + /** + * DateRangeSchema + * @type { object } + * @property { string } from + * @property { string } to + */ + export const DateRangeSchema = z + .object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }) + .readonly(); + export type DateRange = z.infer; + + /** + * BookkeepingExportBatchPreviewFilterDtoSchema + * @type { object } + * @property { DateRange } createdDate + * @property { BookkeepingExportBatchStatusEnum[] } status + * @property { BookkeepingExportFormatEnum[] } format + * @property { string[] } createdBy + */ + export const BookkeepingExportBatchPreviewFilterDtoSchema = z + .object({ + createdDate: DateRangeSchema, + status: z.array(BookkeepingExportBatchStatusEnumSchema).readonly(), + format: z.array(BookkeepingExportFormatEnumSchema).readonly(), + createdBy: z.array(z.string()).readonly(), + }) + .readonly(); + export type BookkeepingExportBatchPreviewFilterDto = z.infer; + + /** + * BookkeepingExportBatchItemStatusEnumSchema + * @type { enum } + */ + export const BookkeepingExportBatchItemStatusEnumSchema = z.enum([ + "Selected", + "NeedsReview", + "ReadyForExport", + "Exported", + "Excluded", + ]); + export type BookkeepingExportBatchItemStatusEnum = z.infer; + export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemStatusEnumSchema.enum; + + /** + * BookkeepingExportItemDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } invoiceId + * @property { BookkeepingExportBatchItemStatusEnum } status + * @property { boolean } includedInExport + * @property { string[] } validationIssues + * @property { object } invoice + * @property { string } invoice.invoiceNumber + * @property { string } invoice.issuingDate + * @property { string } invoice.currency + * @property { number } invoice.amount + * @property { number } invoice.tax + * @property { string[] } invoice.vatRules + * @property { object } receiver + * @property { string } receiver.id + * @property { string } receiver.name + * @property { string } receiver.matchCode + * @property { string } receiver.label + * @property { string } receiver.account + * @property { string } receiver.contraAccount + * @property { string } comments + */ + export const BookkeepingExportItemDetailDtoSchema = z + .object({ + id: z.string(), + invoiceId: z.string(), + status: BookkeepingExportBatchItemStatusEnumSchema, + includedInExport: z.boolean(), + validationIssues: z.array(z.string()).readonly().nullish(), + invoice: z + .object({ + invoiceNumber: z.string(), + issuingDate: z.iso.datetime({ offset: true }), + currency: z.string(), + amount: z.number(), + tax: z.number(), + vatRules: z.array(z.string()).readonly(), + }) + .readonly(), + receiver: z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string(), + account: z.string(), + contraAccount: z.string(), + }) + .readonly(), + comments: z.string().nullish(), + }) + .readonly(); + export type BookkeepingExportItemDetailDto = z.infer; + + /** + * BookkeepingExportItemDetailFilterDtoSchema + * @type { object } + * @property { BookkeepingExportBatchItemStatusEnum[] } status + */ + export const BookkeepingExportItemDetailFilterDtoSchema = z + .object({ status: z.array(BookkeepingExportBatchItemStatusEnumSchema).readonly() }) + .readonly(); + export type BookkeepingExportItemDetailFilterDto = z.infer; + + /** + * BookkeepingExportVatLineItemDtoSchema + * @type { object } + * @property { string } invoiceId + * @property { string } batchId + * @property { string } batchItemId + * @property { BookkeepingExportBatchItemStatusEnum } status + * @property { boolean } includedInExport + * @property { string[] } validationIssues + * @property { object } invoice + * @property { string } invoice.invoiceNumber + * @property { string } invoice.issuingDate + * @property { string } invoice.currency + * @property { number } invoice.amount + * @property { number } invoice.tax + * @property { string } invoice.comments + * @property { object } receiver + * @property { string } receiver.id + * @property { string } receiver.name + * @property { string } receiver.matchCode + * @property { string } receiver.label + * @property { string } receiver.account + * @property { string } receiver.contraAccount + * @property { number } vatPercentage + * @property { string } vatRule + * @property { number } netAmount + * @property { number } vatAmount + * @property { number } grossAmount + * @property { number } vatAmountInOfficeCurrency + * @property { number } netAmountInOfficeCurrency + * @property { number } grossAmountInOfficeCurrency + * @property { string } officeCurrency + */ + export const BookkeepingExportVatLineItemDtoSchema = z + .object({ + invoiceId: z.string(), + batchId: z.string(), + batchItemId: z.string(), + status: BookkeepingExportBatchItemStatusEnumSchema, + includedInExport: z.boolean(), + validationIssues: z.array(z.string()).readonly().nullish(), + invoice: z + .object({ + invoiceNumber: z.string(), + issuingDate: z.iso.datetime({ offset: true }), + currency: z.string(), + amount: z.number(), + tax: z.number(), + comments: z.string().nullish(), + }) + .readonly(), + receiver: z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string(), + account: z.string(), + contraAccount: z.string(), + }) + .readonly(), + vatPercentage: z.number(), + vatRule: z.string(), + netAmount: z.number(), + vatAmount: z.number(), + grossAmount: z.number(), + vatAmountInOfficeCurrency: z.number().nullish(), + netAmountInOfficeCurrency: z.number().nullish(), + grossAmountInOfficeCurrency: z.number().nullish(), + officeCurrency: z.string(), + }) + .readonly(); + export type BookkeepingExportVatLineItemDto = z.infer; + + /** + * CreateBookkeepingExportBatchResponseDtoSchema + * @type { object } + * @property { string } batchId + */ + export const CreateBookkeepingExportBatchResponseDtoSchema = z.object({ batchId: z.string() }).readonly(); + export type CreateBookkeepingExportBatchResponseDto = z.infer; + + /** + * UpdateBookkeepingExportBatchItemRequestDtoSchema + * @type { object } + * @property { boolean } includedInExport Whether the item should be included in the export + * @property { string[] } itemIds Min Items: `0` + * @property { boolean } vatOk + * @property { boolean } invoiceOk + */ + export const UpdateBookkeepingExportBatchItemRequestDtoSchema = z + .object({ + includedInExport: z.boolean().describe("Whether the item should be included in the export").nullish(), + itemIds: z.array(z.string()).readonly(), + vatOk: z.boolean().nullish(), + invoiceOk: z.boolean().nullish(), + }) + .readonly(); + export type UpdateBookkeepingExportBatchItemRequestDto = z.infer< + typeof UpdateBookkeepingExportBatchItemRequestDtoSchema + >; + + /** + * PaginateBatchesOrderParamEnumSchema + * @type { enum } + */ + export const PaginateBatchesOrderParamEnumSchema = z.enum(["createdAt", "status", "format", "totalInvoiceCount"]); + export type PaginateBatchesOrderParamEnum = z.infer; + export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema.enum; + + /** + * PaginateBatchesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookkeepingExportBatchPreviewDto[] } items + */ + export const PaginateBatchesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).readonly() }).readonly().shape, + }); + export type PaginateBatchesResponse = z.infer; + + /** + * PaginateBatchItemsOrderParamEnumSchema + * @type { enum } + */ + export const PaginateBatchItemsOrderParamEnumSchema = z.enum(["issuingDate"]); + export type PaginateBatchItemsOrderParamEnum = z.infer; + export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnumSchema.enum; + + /** + * PaginateBatchItemsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookkeepingExportItemDetailDto[] } items + */ + export const PaginateBatchItemsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).readonly() }).readonly().shape, + }); + export type PaginateBatchItemsResponse = z.infer; + + /** + * GetVatLineItemsOrderParamEnumSchema + * @type { enum } + */ + export const GetVatLineItemsOrderParamEnumSchema = z.enum([ + "account", + "contraAccount", + "issuingDate", + "invoiceNumber", + "receiver", + ]); + export type GetVatLineItemsOrderParamEnum = z.infer; + export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema.enum; + + /** + * GetVatLineItemsResponseSchema + * @type { array } + */ + export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema).readonly(); + export type GetVatLineItemsResponse = z.infer; +} diff --git a/test/generated/dist/bookkeepingExport/bookkeepingExport.queries.ts b/test/generated/dist/bookkeepingExport/bookkeepingExport.queries.ts new file mode 100644 index 0000000..c7faed1 --- /dev/null +++ b/test/generated/dist/bookkeepingExport/bookkeepingExport.queries.ts @@ -0,0 +1,555 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; +import { BookkeepingExportApi } from "./bookkeepingExport.api"; + +export namespace BookkeepingExportQueries { + export const moduleName = QueryModule.BookkeepingExport; + + export const keys = { + all: [moduleName] as const, + paginateBatches: ( + officeId: string, + limit?: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/bookkeeping-exports", officeId, limit, order, filter, page, cursor] as const, + paginateBatchesInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/bookkeeping-exports", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + getBatch: (officeId: string, batchId: string) => + [...keys.all, "/offices/:officeId/bookkeeping-exports/:batchId", officeId, batchId] as const, + paginateBatchItems: ( + officeId: string, + batchId: string, + limit?: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", + officeId, + batchId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateBatchItemsInfinite: ( + officeId: string, + batchId: string, + limit?: number, + order?: string, + filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", + "infinite", + officeId, + batchId, + limit, + order, + filter, + cursor, + ] as const, + getVatLineItems: (officeId: string, batchId: string, order?: string) => + [ + ...keys.all, + "/offices/:officeId/bookkeeping-exports/batches/:batchId/vat-line-items", + officeId, + batchId, + order, + ] as const, + }; + + /** + * Mutation `useCreateBatch` + * @summary Create bookkeeping export batch + * @permission Requires `canUseCreateBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateBatch = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.createBatch, + { officeId: string; data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId })); + return BookkeepingExportApi.createBatch(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateBatches` + * @summary List bookkeeping export batches + * @permission Requires `canUsePaginateBatches` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` + * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateBatches = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId })); + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateBatchesInfinite + * @summary List bookkeeping export batches + * @permission Requires `canUsePaginateBatches` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` + * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateBatchesInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId })); + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetBatch` + * @summary Get bookkeeping export batch details + * @permission Requires `canUseGetBatch` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetBatch = ( + { officeId, batchId }: { officeId: string; batchId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBatch(officeId, batchId), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId })); + return BookkeepingExportApi.getBatch(officeId, batchId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateBatchFormat` + * @summary Update bookkeeping export batch format + * @permission Requires `canUseUpdateBatchFormat` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBatchFormat = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.updateBatchFormat, + { officeId: string; batchId: string; data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId, data }) => { + checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId })); + return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, batchId } = variables; + const updateKeys = [keys.getBatch(officeId, batchId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateBatchItem` + * @summary Update bookkeeping export batch item inclusion + * @permission Requires `canUseUpdateBatchItem` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBatchItem = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.updateBatchItem, + { officeId: string; batchId: string; data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId, data }) => { + checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId })); + return BookkeepingExportApi.updateBatchItem(officeId, batchId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateBatchItems` + * @summary List batch items with filters and pagination + * @permission Requires `canUsePaginateBatchItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` + * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateBatchItems = ( + { + officeId, + batchId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + batchId: string; + limit: number; + order?: string; + filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId })); + return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateBatchItemsInfinite + * @summary List batch items with filters and pagination + * @permission Requires `canUsePaginateBatchItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` + * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateBatchItemsInfinite = ( + { + officeId, + batchId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + batchId: string; + limit: number; + order?: string; + filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId })); + return BookkeepingExportApi.paginateBatchItems( + officeId, + batchId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useValidateBookkeepingBatch` + * @summary Validate bookkeeping batch + * @permission Requires `canUseValidateBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useValidateBookkeepingBatch = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.validateBookkeepingBatch, + { officeId: string; batchId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId })); + return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useExportBookkeepingBatch` + * @summary Export bookkeeping batch + * @permission Requires `canUseExportBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useExportBookkeepingBatch = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.exportBookkeepingBatch, + { officeId: string; batchId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId })); + return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useRevertBookkeepingBatch` + * @summary Revert bookkeeping export batch + * @permission Requires `canUseRevertBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useRevertBookkeepingBatch = ( + options?: AppMutationOptions< + typeof BookkeepingExportApi.revertBookkeepingBatch, + { officeId: string; batchId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId })); + return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetVatLineItems` + * @summary Get VAT line items for bookkeeping export batch + * @permission Requires `canUseGetVatLineItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): account, contraAccount, issuingDate, invoiceNumber, receiver. Example: `account` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetVatLineItems = ( + { officeId, batchId, order }: { officeId: string; batchId: string; order?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getVatLineItems(officeId, batchId, order), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId })); + return BookkeepingExportApi.getVatLineItems(officeId, batchId, order, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts new file mode 100644 index 0000000..016a650 --- /dev/null +++ b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnerBookkeepingMappingsAcl { + /** + * Use for `useGetBookkeepingMappings` query ability. For global ability, omit the object parameter. + * @description List business partner bookkeeping mappings + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBookkeepingMappings` query + */ + export const canUseGetBookkeepingMappings = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useCreateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Create business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBookkeepingMapping` mutation + */ + export const canUseCreateBookkeepingMapping = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< + "Update", + "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Update business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMapping` mutation + */ + export const canUseUpdateBookkeepingMapping = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< + "Update", + "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBookkeepingMappingById` mutation ability. For global ability, omit the object parameter. + * @description Update business partner bookkeeping mapping by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMappingById` mutation + */ + export const canUseUpdateBookkeepingMappingById = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< + "Update", + "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + >; + + /** + * Use for `useDeleteBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBookkeepingMapping` mutation + */ + export const canUseDeleteBookkeepingMapping = (object?: { officeId: string }) => + ["Delete", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< + "Delete", + "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts new file mode 100644 index 0000000..716e4e0 --- /dev/null +++ b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts @@ -0,0 +1,68 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; + +export namespace BusinessPartnerBookkeepingMappingsApi { + export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + config, + ); + }; + export const createBookkeepingMapping = ( + officeId: string, + businessPartnerId: string, + data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), + config, + ); + }; + export const updateBookkeepingMapping = ( + officeId: string, + businessPartnerId: string, + data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), + config, + ); + }; + export const updateBookkeepingMappingById = ( + officeId: string, + businessPartnerId: string, + id: string, + data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), + config, + ); + }; + export const deleteBookkeepingMapping = ( + officeId: string, + businessPartnerId: string, + id: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts new file mode 100644 index 0000000..93818c1 --- /dev/null +++ b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts @@ -0,0 +1,94 @@ +import { z } from "zod"; + +export namespace BusinessPartnerBookkeepingMappingsModels { + /** + * BusinessPartnerBookkeepingMappingResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { string } businessPartnerId + * @property { boolean } paysTaxInEurForFactoring + */ + export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z + .object({ + id: z.string(), + debtorId: z.string().nullish(), + creditorId: z.string().nullish(), + currencyNotation: z.string().nullish(), + businessPartnerId: z.string(), + paysTaxInEurForFactoring: z.boolean().nullish(), + }) + .readonly(); + export type BusinessPartnerBookkeepingMappingResponseDto = z.infer< + typeof BusinessPartnerBookkeepingMappingResponseDtoSchema + >; + + /** + * BusinessPartnerBookkeepingMappingsResponseDtoSchema + * @type { object } + * @property { BusinessPartnerBookkeepingMappingResponseDto[] } bookkeepingMappings + */ + export const BusinessPartnerBookkeepingMappingsResponseDtoSchema = z + .object({ bookkeepingMappings: z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly() }) + .readonly(); + export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer< + typeof BusinessPartnerBookkeepingMappingsResponseDtoSchema + >; + + /** + * UpdateBookkeepingMappingDtoSchema + * @type { object } + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) + */ + export const UpdateBookkeepingMappingDtoSchema = z + .object({ + debtorId: z.string(), + creditorId: z.string(), + currencyNotation: z.string(), + paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)"), + }) + .readonly(); + export type UpdateBookkeepingMappingDto = z.infer; + + /** + * UpdateBookkeepingMappingRequestDtoSchema + * @type { object } + * @property { UpdateBookkeepingMappingDto[] } bookkeepingMappings + */ + export const UpdateBookkeepingMappingRequestDtoSchema = z + .object({ bookkeepingMappings: z.array(UpdateBookkeepingMappingDtoSchema).readonly() }) + .readonly(); + export type UpdateBookkeepingMappingRequestDto = z.infer; + + /** + * CreateBookkeepingMappingDtoSchema + * @type { object } + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) + */ + export const CreateBookkeepingMappingDtoSchema = z + .object({ + debtorId: z.string(), + creditorId: z.string(), + currencyNotation: z.string(), + paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)"), + }) + .readonly(); + export type CreateBookkeepingMappingDto = z.infer; + + /** + * UpdateBookkeepingMappingResponseSchema + * @type { array } + */ + export const UpdateBookkeepingMappingResponseSchema = z + .array(BusinessPartnerBookkeepingMappingResponseDtoSchema) + .readonly(); + export type UpdateBookkeepingMappingResponse = z.infer; +} diff --git a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts new file mode 100644 index 0000000..8b15dfc --- /dev/null +++ b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts @@ -0,0 +1,221 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnerBookkeepingMappingsAcl } from "./businessPartnerBookkeepingMappings.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; +import { BusinessPartnerBookkeepingMappingsApi } from "./businessPartnerBookkeepingMappings.api"; + +export namespace BusinessPartnerBookkeepingMappingsQueries { + export const moduleName = QueryModule.BusinessPartnerBookkeepingMappings; + + export const keys = { + all: [moduleName] as const, + getBookkeepingMappings: (officeId: string, businessPartnerId: string) => + [ + ...keys.all, + "/offices/:officeId/business-partners/:businessPartnerId/bookkeeping-mappings", + officeId, + businessPartnerId, + ] as const, + }; + + /** + * Query `useGetBookkeepingMappings` + * @summary Fetch all bookkeeping mappings for a business partner + * @permission Requires `canUseGetBookkeepingMappings` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetBookkeepingMappings = ( + { officeId, businessPartnerId }: { officeId: string; businessPartnerId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), + queryFn: () => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId })); + return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateBookkeepingMapping` + * @summary Create a bookkeeping mapping for a business partner + * @permission Requires `canUseCreateBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateBookkeepingMapping = ( + options?: AppMutationOptions< + typeof BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping, + { + officeId: string; + businessPartnerId: string; + data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId })); + return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping( + officeId, + businessPartnerId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateBookkeepingMapping` + * @summary Update an existing bookkeeping mapping for a business partner + * @permission Requires `canUseUpdateBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBookkeepingMapping = ( + options?: AppMutationOptions< + typeof BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping, + { + officeId: string; + businessPartnerId: string; + data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId })); + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping( + officeId, + businessPartnerId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateBookkeepingMappingById` + * @summary Update a specific bookkeeping mapping by ID for a business partner + * @permission Requires `canUseUpdateBookkeepingMappingById` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBookkeepingMappingById = ( + options?: AppMutationOptions< + typeof BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById, + { + officeId: string; + businessPartnerId: string; + id: string; + data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, id, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId })); + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById( + officeId, + businessPartnerId, + id, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteBookkeepingMapping` + * @summary Delete an existing bookkeeping mapping for a business partner + * @permission Requires `canUseDeleteBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteBookkeepingMapping = ( + options?: AppMutationOptions< + typeof BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping, + { officeId: string; businessPartnerId: string; id: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, id }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId })); + return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.acl.ts b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.acl.ts new file mode 100644 index 0000000..908af98 --- /dev/null +++ b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnerContactsAcl { + /** + * Use for `useGetContacts` query ability. For global ability, omit the object parameter. + * @description List business partner contacts + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetContacts` query + */ + export const canUseGetContacts = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useCreateContact` mutation ability. For global ability, omit the object parameter. + * @description Create business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateContact` mutation + */ + export const canUseCreateContact = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `usePaginateContactLabels` query ability. For global ability, omit the object parameter. + * @description Paginate business partner contact labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateContactLabels` query + */ + export const canUsePaginateContactLabels = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdateContact` mutation ability. For global ability, omit the object parameter. + * @description Update business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateContact` mutation + */ + export const canUseUpdateContact = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useDeleteContact` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteContact` mutation + */ + export const canUseDeleteContact = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.api.ts b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.api.ts new file mode 100644 index 0000000..edc4612 --- /dev/null +++ b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.api.ts @@ -0,0 +1,97 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; + +export namespace BusinessPartnerContactsApi { + export const getContacts = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, + config, + ); + }; + export const createContact = ( + officeId: string, + businessPartnerId: string, + data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, + ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), + config, + ); + }; + export const paginateContactLabels = ( + officeId: string, + businessPartnerId: string, + limit: number, + order?: string, + filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const updateContact = ( + contactId: string, + officeId: string, + businessPartnerId: string, + data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, + ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), + config, + ); + }; + export const deleteContact = ( + contactId: string, + officeId: string, + businessPartnerId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.configs.ts b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.configs.ts new file mode 100644 index 0000000..cf71eb6 --- /dev/null +++ b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.configs.ts @@ -0,0 +1,41 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; +import { BusinessPartnerContactsQueries } from "./businessPartnerContacts.queries"; +import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; + +export namespace BusinessPartnerContactsConfigs { + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: BusinessPartnerContactsAcl.canUsePaginateContactLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: BusinessPartnerContactsQueries.usePaginateContactLabels, + infinite: BusinessPartnerContactsQueries.usePaginateContactLabelsInfinite, + filters: { + schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.models.ts b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.models.ts new file mode 100644 index 0000000..875a0ca --- /dev/null +++ b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.models.ts @@ -0,0 +1,125 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BusinessPartnerContactsModels { + /** + * BusinessPartnerContactRoleEnumSchema + * @type { enum } + */ + export const BusinessPartnerContactRoleEnumSchema = z.enum([ + "General", + "CommercialManager", + "SystemEngineer", + "TechnicalEngineer", + "Logistics", + "Operations", + "Sales", + "Accounting", + "Invoice", + "Dunnings", + "Reclamations", + "Management", + ]); + export type BusinessPartnerContactRoleEnum = z.infer; + export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSchema.enum; + + /** + * BusinessPartnerContactResponseDTOSchema + * @type { object } + * @property { string } id Contact ID + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ + export const BusinessPartnerContactResponseDTOSchema = z + .object({ + id: z.string().describe("Contact ID"), + role: BusinessPartnerContactRoleEnumSchema.nullish(), + name: z.string().describe("Contact name").nullish(), + email: z.string().describe("Contact email").nullish(), + phone: z.string().describe("Contact phone").nullish(), + }) + .readonly(); + export type BusinessPartnerContactResponseDTO = z.infer; + + /** + * BusinessPartnerContactListResponseDTOSchema + * @type { object } + * @property { BusinessPartnerContactResponseDTO[] } contacts List of contacts + */ + export const BusinessPartnerContactListResponseDTOSchema = z + .object({ contacts: z.array(BusinessPartnerContactResponseDTOSchema).readonly().describe("List of contacts") }) + .readonly(); + export type BusinessPartnerContactListResponseDTO = z.infer; + + /** + * CreateBusinessPartnerContactRequestDTOSchema + * @type { object } + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ + export const CreateBusinessPartnerContactRequestDTOSchema = z + .object({ + role: BusinessPartnerContactRoleEnumSchema, + name: z.string().describe("Contact name"), + email: z.string().describe("Contact email"), + phone: z.string().describe("Contact phone"), + }) + .readonly(); + export type CreateBusinessPartnerContactRequestDTO = z.infer; + + /** + * UpdateBusinessPartnerContactRequestDTOSchema + * @type { object } + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ + export const UpdateBusinessPartnerContactRequestDTOSchema = z + .object({ + role: BusinessPartnerContactRoleEnumSchema, + name: z.string().describe("Contact name"), + email: z.string().describe("Contact email"), + phone: z.string().describe("Contact phone"), + }) + .readonly(); + export type UpdateBusinessPartnerContactRequestDTO = z.infer; + + /** + * BusinessPartnerContactFilterDtoSchema + * @type { object } + * @property { string } search Search by name, email, or phone + */ + export const BusinessPartnerContactFilterDtoSchema = z + .object({ search: z.string().describe("Search by name, email, or phone") }) + .readonly(); + export type BusinessPartnerContactFilterDto = z.infer; + + /** + * PaginateContactLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PaginateContactLabelsOrderParamEnumSchema = z.enum(["name", "role", "email", "createdAt", "updatedAt"]); + export type PaginateContactLabelsOrderParamEnum = z.infer; + export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderParamEnumSchema.enum; + + /** + * PaginateContactLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PaginateContactLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PaginateContactLabelsResponse = z.infer; +} diff --git a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.queries.ts b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.queries.ts new file mode 100644 index 0000000..a29ac21 --- /dev/null +++ b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.queries.ts @@ -0,0 +1,321 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; +import { BusinessPartnerContactsApi } from "./businessPartnerContacts.api"; + +export namespace BusinessPartnerContactsQueries { + export const moduleName = QueryModule.BusinessPartnerContacts; + + export const keys = { + all: [moduleName] as const, + getContacts: (officeId: string, businessPartnerId: string) => + [ + ...keys.all, + "/offices/:officeId/business-partners/:businessPartnerId/contacts", + officeId, + businessPartnerId, + ] as const, + paginateContactLabels: ( + officeId: string, + businessPartnerId: string, + limit?: number, + order?: string, + filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", + officeId, + businessPartnerId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateContactLabelsInfinite: ( + officeId: string, + businessPartnerId: string, + limit?: number, + order?: string, + filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", + "infinite", + officeId, + businessPartnerId, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useGetContacts` + * @summary Get all contacts for a business partner + * @permission Requires `canUseGetContacts` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetContacts = ( + { officeId, businessPartnerId }: { officeId: string; businessPartnerId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getContacts(officeId, businessPartnerId), + queryFn: () => { + checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId })); + return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateContact` + * @summary Create a new contact for a business partner + * @permission Requires `canUseCreateContact` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateContact = ( + options?: AppMutationOptions< + typeof BusinessPartnerContactsApi.createContact, + { + officeId: string; + businessPartnerId: string; + data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId })); + return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateContactLabels` + * @summary Paginate business partner contact labels (id and name only) + * @permission Requires `canUsePaginateContactLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` + * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateContactLabels = ( + { + officeId, + businessPartnerId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + businessPartnerId: string; + limit: number; + order?: string; + filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId })); + return BusinessPartnerContactsApi.paginateContactLabels( + officeId, + businessPartnerId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateContactLabelsInfinite + * @summary Paginate business partner contact labels (id and name only) + * @permission Requires `canUsePaginateContactLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` + * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateContactLabelsInfinite = ( + { + officeId, + businessPartnerId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + businessPartnerId: string; + limit: number; + order?: string; + filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId })); + return BusinessPartnerContactsApi.paginateContactLabels( + officeId, + businessPartnerId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateContact` + * @summary Update a business partner contact + * @permission Requires `canUseUpdateContact` ability + * @param { string } mutation.contactId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateContact = ( + options?: AppMutationOptions< + typeof BusinessPartnerContactsApi.updateContact, + { + contactId: string; + officeId: string; + businessPartnerId: string; + data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId })); + return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteContact` + * @permission Requires `canUseDeleteContact` ability + * @param { string } mutation.contactId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 204, 401] + */ + export const useDeleteContact = ( + options?: AppMutationOptions< + typeof BusinessPartnerContactsApi.deleteContact, + { contactId: string; officeId: string; businessPartnerId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ contactId, officeId, businessPartnerId }) => { + checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId })); + return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/businessPartners/businessPartners.acl.ts b/test/generated/dist/businessPartners/businessPartners.acl.ts new file mode 100644 index 0000000..3139313 --- /dev/null +++ b/test/generated/dist/businessPartners/businessPartners.acl.ts @@ -0,0 +1,243 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnersAcl { + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List business partners + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Create", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Paginate business partner labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Read business partner details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ + export const canUseGetById = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Archive", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Archive", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useLock` mutation ability. For global ability, omit the object parameter. + * @description Lock business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLock` mutation + */ + export const canUseLock = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUnlock` mutation ability. For global ability, omit the object parameter. + * @description Unlock business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlock` mutation + */ + export const canUseUnlock = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useGetRemarks` query ability. For global ability, omit the object parameter. + * @description List business partner remarks + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetRemarks` query + */ + export const canUseGetRemarks = (object?: { officeId: string }) => + ["ReadRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "ReadRemark", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useCreateRemark` mutation ability. For global ability, omit the object parameter. + * @description Create business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRemark` mutation + */ + export const canUseCreateRemark = (object?: { officeId: string }) => + ["CreateRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "CreateRemark", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdateRemark` mutation ability. For global ability, omit the object parameter. + * @description Update business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRemark` mutation + */ + export const canUseUpdateRemark = (object?: { officeId: string }) => + ["UpdateRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "UpdateRemark", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useDeleteRemark` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemark` mutation + */ + export const canUseDeleteRemark = (object?: { officeId: string }) => + ["DeleteRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "DeleteRemark", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useGetBasicInfo` query ability. For global ability, omit the object parameter. + * @description Read business partner basic info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBasicInfo` query + */ + export const canUseGetBasicInfo = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBasicInfo` mutation ability. For global ability, omit the object parameter. + * @description Update business partner basic info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBasicInfo` mutation + */ + export const canUseUpdateBasicInfo = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab"] as AbilityTuple< + "Update", + "BusinessPartnerBasicTab" | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) + >; + + /** + * Use for `useCreateSignatureUploadInstructions` mutation ability. For global ability, omit the object parameter. + * @description Create business partner signature upload instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateSignatureUploadInstructions` mutation + */ + export const canUseCreateSignatureUploadInstructions = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab"] as AbilityTuple< + "Update", + "BusinessPartnerBasicTab" | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) + >; + + /** + * Use for `useGetCargoAgentInfo` query ability. For global ability, omit the object parameter. + * @description Read business partner cargo agent info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoAgentInfo` query + */ + export const canUseGetCargoAgentInfo = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCargoAgent` mutation ability. For global ability, omit the object parameter. + * @description Update business partner cargo agent info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargoAgent` mutation + */ + export const canUseUpdateCargoAgent = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useGetCarrierInformation` query ability. For global ability, omit the object parameter. + * @description Read business partner carrier info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCarrierInformation` query + */ + export const canUseGetCarrierInformation = (object?: { officeId: string }) => + ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Read", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCarrier` mutation ability. For global ability, omit the object parameter. + * @description Update business partner carrier info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCarrier` mutation + */ + export const canUseUpdateCarrier = (object?: { officeId: string }) => + ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< + "Update", + "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/businessPartners/businessPartners.api.ts b/test/generated/dist/businessPartners/businessPartners.api.ts new file mode 100644 index 0000000..21d03e5 --- /dev/null +++ b/test/generated/dist/businessPartners/businessPartners.api.ts @@ -0,0 +1,267 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnersModels } from "./businessPartners.models"; + +export namespace BusinessPartnersApi { + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, + `/offices/${officeId}/business-partners`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = ( + officeId: string, + data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, + `/offices/${officeId}/business-partners`, + ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), + config, + ); + }; + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, + `/offices/${officeId}/business-partners/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const getById = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}`, + config, + ); + }; + export const update = ( + officeId: string, + id: string, + data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), + config, + ); + }; + export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/unarchive`, + undefined, + config, + ); + }; + export const lock = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/lock`, + undefined, + config, + ); + }; + export const unlock = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/unlock`, + undefined, + config, + ); + }; + export const getRemarks = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, + `/offices/${officeId}/business-partners/${id}/remarks`, + config, + ); + }; + export const createRemark = ( + officeId: string, + id: string, + data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/remarks`, + ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), + config, + ); + }; + export const updateRemark = ( + officeId: string, + id: string, + remarkId: string, + data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), + config, + ); + }; + export const deleteRemark = (officeId: string, id: string, remarkId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, + undefined, + config, + ); + }; + export const getBasicInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic`, + config, + ); + }; + export const updateBasicInfo = ( + officeId: string, + id: string, + data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), + config, + ); + }; + export const createSignatureUploadInstructions = ( + officeId: string, + id: string, + data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, + ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), + config, + ); + }; + export const getCargoAgentInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/cargo-agent`, + config, + ); + }; + export const updateCargoAgent = ( + officeId: string, + id: string, + data: BusinessPartnersModels.UpdateCargoAgentDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/cargo-agent`, + ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), + config, + ); + }; + export const getCarrierInformation = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/carrier`, + config, + ); + }; + export const updateCarrier = ( + officeId: string, + id: string, + data: BusinessPartnersModels.UpdateCarrierDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/carrier`, + ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/businessPartners/businessPartners.configs.ts b/test/generated/dist/businessPartners/businessPartners.configs.ts new file mode 100644 index 0000000..3ba3ac7 --- /dev/null +++ b/test/generated/dist/businessPartners/businessPartners.configs.ts @@ -0,0 +1,148 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { BusinessPartnersModels } from "./businessPartners.models"; +import { BusinessPartnersQueries } from "./businessPartners.queries"; +import { BusinessPartnersAcl } from "./businessPartners.acl"; + +export namespace BusinessPartnersConfigs { + export const businessPartnersConfig = { + meta: { + title: "Business Partners", + }, + readAll: { + acl: BusinessPartnersAcl.canUsePaginate, + schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, + paginated: BusinessPartnersQueries.usePaginate, + infinite: BusinessPartnersQueries.usePaginateInfinite, + filters: { + schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, + options: { + inputs: { + search: true, + types: true, + shortName: true, + name: true, + vat: true, + debtorId: true, + creditorId: true, + matchCode: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + address: true, + types: true, + archived: true, + shortName: true, + vat: true, + debtorId: true, + creditorId: true, + locked: true, + currency: true, + remarks: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: BusinessPartnersAcl.canUseGetById, + schema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema, + query: BusinessPartnersQueries.useGetById, + }, + create: { + acl: BusinessPartnersAcl.canUseCreate, + schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, + mutation: BusinessPartnersQueries.useCreate, + inputDefs: dynamicInputs({ + schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, + options: { + inputs: { + name: true, + secondaryName: true, + types: true, + matchCode: true, + shortName: true, + address: true, + }, + }, + }), + }, + update: { + acl: BusinessPartnersAcl.canUseUpdate, + schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, + mutation: BusinessPartnersQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + secondaryName: true, + types: true, + address: true, + blAddress: true, + belongsToId: true, + salesRepId: true, + operationsId: true, + addressIsDifferentForBl: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: BusinessPartnersAcl.canUsePaginateLabels, + schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, + paginated: BusinessPartnersQueries.usePaginateLabels, + infinite: BusinessPartnersQueries.usePaginateLabelsInfinite, + filters: { + schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, + options: { + inputs: { + search: true, + ids: true, + types: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + types: true, + }, + sortable: BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/businessPartners/businessPartners.models.ts b/test/generated/dist/businessPartners/businessPartners.models.ts new file mode 100644 index 0000000..c247589 --- /dev/null +++ b/test/generated/dist/businessPartners/businessPartners.models.ts @@ -0,0 +1,814 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BusinessPartnersModels { + /** + * RemarkVisibilitySchema + * @type { enum } + */ + export const RemarkVisibilitySchema = z.enum(["internal", "popup"]); + export type RemarkVisibility = z.infer; + export const RemarkVisibility = RemarkVisibilitySchema.enum; + + /** + * RemarkTypeSchema + * @type { enum } + */ + export const RemarkTypeSchema = z.enum(["INFORMATIONAL", "WARNING"]); + export type RemarkType = z.infer; + export const RemarkType = RemarkTypeSchema.enum; + + /** + * BusinessPartnerRemarkResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the remark + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of the remark + */ + export const BusinessPartnerRemarkResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the remark"), + visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), + content: z.string().describe("Content of the remark"), + type: RemarkTypeSchema.describe("Type of the remark"), + }) + .readonly(); + export type BusinessPartnerRemarkResponseDTO = z.infer; + + /** + * BusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { string } city City name + * @property { string } isoCode Country code + */ + export const BusinessPartnerAddressDtoSchema = z + .object({ + street: z.string().describe("Street address"), + zip: z.string().describe("ZIP/Postal code"), + city: z.string().describe("City name"), + isoCode: z.string().describe("Country code"), + }) + .readonly(); + export type BusinessPartnerAddressDto = z.infer; + + /** + * BusinessPartnerEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const BusinessPartnerEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type BusinessPartnerEmployeeDTO = z.infer; + + /** + * BusinessPartnerListResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + * @property { string } matchCode Match code of the business partner + * @property { BusinessPartnerAddressDto } address Address information + * @property { CommonModels.BusinessPartnerType[] } types List of business partner types + * @property { boolean } archived Archive status + * @property { string } shortName Short name of the business partner + * @property { string } vat VAT number of the business partner + * @property { string } debtorId Debtor ID for the local currency + * @property { string } creditorId Creditor ID for the local currency + * @property { boolean } locked Whether the business partner is locked + * @property { string } currency Currency (invoice currency) + * @property { BusinessPartnerRemarkResponseDTO[] } remarks Remarks for the business partner + * @property { string } createdById ID of the employee who created this business partner + * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this business partner + * @property { string } createdAt Date when the business partner was created + * @property { string } updatedById ID of the employee who last updated this business partner + * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this business partner + * @property { string } updatedAt Date when the business partner was last updated + */ + export const BusinessPartnerListResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the business partner"), + name: z.string().describe("Name of the business partner"), + matchCode: z.string().describe("Match code of the business partner"), + address: BusinessPartnerAddressDtoSchema.describe("Address information"), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), + archived: z.boolean().describe("Archive status"), + shortName: z.string().describe("Short name of the business partner").nullish(), + vat: z.string().describe("VAT number of the business partner").nullish(), + debtorId: z.string().describe("Debtor ID for the local currency").nullish(), + creditorId: z.string().describe("Creditor ID for the local currency").nullish(), + locked: z.boolean().describe("Whether the business partner is locked"), + currency: z.string().describe("Currency (invoice currency)").nullish(), + remarks: z.array(BusinessPartnerRemarkResponseDTOSchema).readonly().describe("Remarks for the business partner"), + createdById: z.string().describe("ID of the employee who created this business partner").nullish(), + createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this business partner").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was created"), + updatedById: z.string().describe("ID of the employee who last updated this business partner").nullish(), + updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this business partner").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was last updated"), + }) + .readonly(); + export type BusinessPartnerListResponseDTO = z.infer; + + /** + * BusinessPartnerFilterDtoSchema + * @type { object } + * @property { string } search + * @property { CommonModels.BusinessPartnerType[] } types + * @property { string } shortName + * @property { string } name + * @property { string } vat + * @property { string } debtorId + * @property { string } creditorId + * @property { string } matchCode + * @property { boolean } archived Filter by archived status + */ + export const BusinessPartnerFilterDtoSchema = z + .object({ + search: z.string(), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly(), + shortName: z.string(), + name: z.string(), + vat: z.string(), + debtorId: z.string(), + creditorId: z.string(), + matchCode: z.string(), + archived: z.boolean().describe("Filter by archived status"), + }) + .readonly(); + export type BusinessPartnerFilterDto = z.infer; + + /** + * BusinessPartnerPaginatedLabelResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } label Label of the business partner + * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types + */ + export const BusinessPartnerPaginatedLabelResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the business partner"), + label: z.string().describe("Label of the business partner"), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types"), + }) + .readonly(); + export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; + + /** + * BusinessPartnerLabelsFilterDtoSchema + * @type { object } + * @property { string } search + * @property { string[] } ids Business partner ids to filter by + * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types to filter by + * @property { boolean } archived Filter by archived status + */ + export const BusinessPartnerLabelsFilterDtoSchema = z + .object({ + search: z.string(), + ids: z.array(z.string()).readonly().describe("Business partner ids to filter by"), + types: z + .array(CommonModels.BusinessPartnerTypeSchema) + .readonly() + .describe("Array of business partner types to filter by"), + archived: z.boolean().describe("Filter by archived status"), + }) + .readonly(); + export type BusinessPartnerLabelsFilterDto = z.infer; + + /** + * CreateBusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } district + * @property { string } countryId + */ + export const CreateBusinessPartnerAddressDtoSchema = z + .object({ + street: z.string(), + secondaryStreet: z.string(), + zip: z.string(), + cityId: z.string(), + district: z.string(), + countryId: z.string(), + }) + .readonly(); + export type CreateBusinessPartnerAddressDto = z.infer; + + /** + * CreateBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } name Full name of the business partner. Min Length: `3` + * @property { string } secondaryName Full name of the business partner. Min Length: `3` + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { string } matchCode Unique identifier code + * @property { string } shortName Short name for the business partner + * @property { CreateBusinessPartnerAddressDto } address Address information + */ + export const CreateBusinessPartnerRequestDTOSchema = z + .object({ + name: z.string().min(3).describe("Full name of the business partner"), + secondaryName: z.string().min(3).describe("Full name of the business partner").nullish(), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), + matchCode: z.string().describe("Unique identifier code").nullish(), + shortName: z.string().describe("Short name for the business partner").nullish(), + address: CreateBusinessPartnerAddressDtoSchema.describe("Address information").nullish(), + }) + .readonly(); + export type CreateBusinessPartnerRequestDTO = z.infer; + + /** + * BusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { string } rootFolderId Root folder identifier associated with this business partner + */ + export const BusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the business partner"), + name: z.string().describe("Name of the business partner"), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), + rootFolderId: z.string().describe("Root folder identifier associated with this business partner").nullish(), + }) + .readonly(); + export type BusinessPartnerResponseDTO = z.infer; + + /** + * BusinessPartnerLabelResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + */ + export const BusinessPartnerLabelResponseDtoSchema = z + .object({ + id: z.string().describe("Unique identifier of the business partner"), + name: z.string().describe("Name of the business partner"), + }) + .readonly(); + export type BusinessPartnerLabelResponseDto = z.infer; + + /** + * ContactResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the contact + * @property { string } name Name of the contact + */ + export const ContactResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the contact"), + name: z.string().describe("Name of the contact"), + }) + .readonly(); + export type ContactResponseDTO = z.infer; + + /** + * BusinessPartnerDetailResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } createdById ID of the employee who created this record + * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this record + * @property { string } createdAt Creation timestamp + * @property { string } updatedById ID of the employee who last updated this record + * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this record + * @property { string } updatedAt Last update timestamp + * @property { string } matchCode Match code of the business partner + * @property { string } shortName Short name + * @property { string } name Full name + * @property { string } secondaryName Secondary name + * @property { CommonModels.BusinessPartnerType[] } types List of business partner types + * @property { boolean } archived Archived status + * @property { CommonModels.BusinessPartnerAddressResponseDTO } address Main address information + * @property { CommonModels.BusinessPartnerAddressResponseDTO } blAddress BL address information + * @property { BusinessPartnerLabelResponseDto[] } similar Similar named business partners + * @property { boolean } locked + * @property { boolean } addressIsDifferentForBl + * @property { string } lockedById Unique identifier of the employee who locked the business partner + * @property { string } lockedByName + * @property { string } lockedAt Unique identifier of the employee who locked the business partner + * @property { ContactResponseDTO } belongsTo Parent business partner + * @property { ContactResponseDTO } salesRep Sales representative + * @property { ContactResponseDTO } operations Operations contact + */ + export const BusinessPartnerDetailResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the business partner"), + createdById: z.string().describe("ID of the employee who created this record").nullish(), + createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this record").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Creation timestamp"), + updatedById: z.string().describe("ID of the employee who last updated this record").nullish(), + updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this record").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Last update timestamp"), + matchCode: z.string().describe("Match code of the business partner"), + shortName: z.string().describe("Short name"), + name: z.string().describe("Full name"), + secondaryName: z.string().describe("Secondary name"), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), + archived: z.boolean().describe("Archived status"), + address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information"), + blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("BL address information"), + similar: z + .array(BusinessPartnerLabelResponseDtoSchema) + .readonly() + .describe("Similar named business partners") + .nullish(), + locked: z.boolean(), + addressIsDifferentForBl: z.boolean(), + lockedById: z.string().describe("Unique identifier of the employee who locked the business partner").nullish(), + lockedByName: z.string().nullish(), + lockedAt: z.iso + .datetime({ offset: true }) + .describe("Unique identifier of the employee who locked the business partner") + .nullish(), + belongsTo: ContactResponseDTOSchema.describe("Parent business partner"), + salesRep: ContactResponseDTOSchema.describe("Sales representative"), + operations: ContactResponseDTOSchema.describe("Operations contact"), + }) + .readonly(); + export type BusinessPartnerDetailResponseDTO = z.infer; + + /** + * UpdateBusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } district + * @property { string } countryId + */ + export const UpdateBusinessPartnerAddressDtoSchema = z + .object({ + street: z.string(), + secondaryStreet: z.string(), + zip: z.string(), + cityId: z.string().nullable(), + district: z.string(), + countryId: z.string(), + }) + .readonly(); + export type UpdateBusinessPartnerAddressDto = z.infer; + + /** + * UpdateBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code + * @property { string } shortName Updated short name + * @property { string } name Updated full name + * @property { string } secondaryName Updated secondary name + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { UpdateBusinessPartnerAddressDto } address Address information + * @property { UpdateBusinessPartnerAddressDto } blAddress Bl address information + * @property { string } belongsToId Parent business partner + * @property { string } salesRepId Sales representative + * @property { string } operationsId Operations contact + * @property { boolean } addressIsDifferentForBl Different address for BL + */ + export const UpdateBusinessPartnerRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Updated match code"), + shortName: z.string().describe("Updated short name"), + name: z.string().describe("Updated full name"), + secondaryName: z.string().describe("Updated secondary name"), + types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), + address: UpdateBusinessPartnerAddressDtoSchema.describe("Address information"), + blAddress: UpdateBusinessPartnerAddressDtoSchema.describe("Bl address information"), + belongsToId: z.string().describe("Parent business partner"), + salesRepId: z.string().describe("Sales representative"), + operationsId: z.string().describe("Operations contact"), + addressIsDifferentForBl: z.boolean().describe("Different address for BL"), + }) + .readonly(); + export type UpdateBusinessPartnerRequestDTO = z.infer; + + /** + * CreateBusinessPartnerRemarkRequestDTOSchema + * @type { object } + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of remark + */ + export const CreateBusinessPartnerRemarkRequestDTOSchema = z + .object({ + visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), + content: z.string().describe("Content of the remark"), + type: RemarkTypeSchema.describe("Type of remark"), + }) + .readonly(); + export type CreateBusinessPartnerRemarkRequestDTO = z.infer; + + /** + * UpdateBusinessPartnerRemarkRequestDtoSchema + * @type { object } + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of remark + */ + export const UpdateBusinessPartnerRemarkRequestDtoSchema = z + .object({ + visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), + content: z.string().describe("Content of the remark"), + type: RemarkTypeSchema.describe("Type of remark"), + }) + .readonly(); + export type UpdateBusinessPartnerRemarkRequestDto = z.infer; + + /** + * AccountTypeEnumSchema + * @type { enum } + */ + export const AccountTypeEnumSchema = z.enum([ + "Direct Account", + "Logistic Provider / Forwarder", + "4PL/NVOCC", + "LLP", + "Carrier", + "Service Provider (other)", + "Strategic", + "Key Account", + "Transactional", + "Agent", + "Other", + ]); + export type AccountTypeEnum = z.infer; + export const AccountTypeEnum = AccountTypeEnumSchema.enum; + + /** + * BusinessPartnerAuthorizationSchema + * @type { enum } + */ + export const BusinessPartnerAuthorizationSchema = z.enum(["requiresApproval", "blocked", "regularBusinessPartner"]); + export type BusinessPartnerAuthorization = z.infer; + export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.enum; + + /** + * BusinessPartnerPaymentTermsResponseDtoSchema + * @type { object } + * @property { string } relativeTo + * @property { number } days Minimum: `0` + */ + export const BusinessPartnerPaymentTermsResponseDtoSchema = z + .object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }) + .readonly(); + export type BusinessPartnerPaymentTermsResponseDto = z.infer; + + /** + * BusinessPartnerBankAccountResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const BusinessPartnerBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type BusinessPartnerBankAccountResponseDto = z.infer; + + /** + * PartnerNetworkInfoDtoSchema + * @type { object } + * @property { string } id Partner network ID + * @property { string } name Partner network name + */ + export const PartnerNetworkInfoDtoSchema = z + .object({ id: z.string().describe("Partner network ID"), name: z.string().describe("Partner network name") }) + .readonly(); + export type PartnerNetworkInfoDto = z.infer; + + /** + * BusinessPartnerBasicResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Reference to the business partner + * @property { string[] } relationship List of relationships + * @property { AccountTypeEnum } accountType + * @property { string } vat VAT number + * @property { string } legacySystemId Legacy system (move) id + * @property { string } registrationNumber + * @property { string } eori EORI number + * @property { BusinessPartnerAuthorization } authorization Authorization status + * @property { number } creditLimit Credit limit + * @property { string } invoiceLanguage Invoice language + * @property { string } invoiceCurrency Invoice currency + * @property { string } iban IBAN + * @property { string } bankNumber Bank number + * @property { string } bankAccountNumber Bank account number + * @property { BusinessPartnerPaymentTermsResponseDto } termsExport + * @property { BusinessPartnerPaymentTermsResponseDto } termsImport + * @property { CommonModels.EditorContentResponseDto } notes Notes + * @property { string } bankAccountId + * @property { BusinessPartnerBankAccountResponseDto } bankAccount + * @property { PartnerNetworkInfoDto[] } partnerNetworks Partner networks + * @property { string } dunningSystemId + * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem + * @property { string } hblIssuerSigner HBL issuer/signer prefill + * @property { string } signatureFileAttachmentId Signature file attachment ID + * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment + */ + export const BusinessPartnerBasicResponseDTOSchema = z + .object({ + businessPartnerId: z.string().describe("Reference to the business partner"), + relationship: z.array(z.string()).readonly().describe("List of relationships"), + accountType: AccountTypeEnumSchema.nullish(), + vat: z.string().describe("VAT number"), + legacySystemId: z.string().describe("Legacy system (move) id").nullish(), + registrationNumber: z.string().nullish(), + eori: z.string().describe("EORI number"), + authorization: BusinessPartnerAuthorizationSchema.describe("Authorization status").nullable(), + creditLimit: z.number().describe("Credit limit"), + invoiceLanguage: z.string().describe("Invoice language"), + invoiceCurrency: z.string().describe("Invoice currency"), + iban: z.string().describe("IBAN"), + bankNumber: z.string().describe("Bank number"), + bankAccountNumber: z.string().describe("Bank account number"), + termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, + termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, + notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), + bankAccountId: z.string().nullish(), + bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), + partnerNetworks: z.array(PartnerNetworkInfoDtoSchema).readonly().describe("Partner networks"), + dunningSystemId: z.string().nullish(), + dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), + hblIssuerSigner: z.string().describe("HBL issuer/signer prefill"), + signatureFileAttachmentId: z.string().describe("Signature file attachment ID"), + signatureFileAttachmentUrl: z.string().describe("Signed URL for signature file attachment").nullish(), + }) + .readonly(); + export type BusinessPartnerBasicResponseDTO = z.infer; + + /** + * UpdateBusinessPartnerPaymentTermsDtoSchema + * @type { object } + * @property { string } relativeTo + * @property { number } days Minimum: `0` + */ + export const UpdateBusinessPartnerPaymentTermsDtoSchema = z + .object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }) + .readonly(); + export type UpdateBusinessPartnerPaymentTermsDto = z.infer; + + /** + * UpdateBusinessPartnerBasicRequestDTOSchema + * @type { object } + * @property { string[] } relationship Updated relationships + * @property { string } vat Updated VAT number + * @property { string } eori Updated EORI number + * @property { AccountTypeEnum } accountType + * @property { BusinessPartnerAuthorization } authorization Updated authorization status + * @property { number } creditLimit Updated credit limit + * @property { string } invoiceLanguage Invoice language + * @property { string } invoiceCurrency Invoice currency + * @property { string } iban IBAN + * @property { string } bankNumber Bank number + * @property { string } bankAccountNumber Bank account number + * @property { string } legacySystemId Legacy system (move) id + * @property { string } registrationNumber + * @property { UpdateBusinessPartnerPaymentTermsDto } termsExport + * @property { UpdateBusinessPartnerPaymentTermsDto } termsImport + * @property { CommonModels.EditorContentUpdateDto } notes Notes + * @property { string } bankAccountId + * @property { string[] } partnerNetworkIds Partner network IDs + * @property { string } dunningSystemId Dunning system ID + * @property { string } hblIssuerSigner HBL issuer/signer prefill + * @property { string } signatureFileAttachmentId Signature file attachment ID + */ + export const UpdateBusinessPartnerBasicRequestDTOSchema = z + .object({ + relationship: z.array(z.string()).readonly().describe("Updated relationships"), + vat: z.string().describe("Updated VAT number"), + eori: z.string().describe("Updated EORI number"), + accountType: AccountTypeEnumSchema, + authorization: BusinessPartnerAuthorizationSchema.describe("Updated authorization status"), + creditLimit: z.number().describe("Updated credit limit"), + invoiceLanguage: z.string().describe("Invoice language"), + invoiceCurrency: z.string().describe("Invoice currency"), + iban: z.string().describe("IBAN"), + bankNumber: z.string().describe("Bank number"), + bankAccountNumber: z.string().describe("Bank account number"), + legacySystemId: z.string().describe("Legacy system (move) id"), + registrationNumber: z.string(), + termsExport: UpdateBusinessPartnerPaymentTermsDtoSchema, + termsImport: UpdateBusinessPartnerPaymentTermsDtoSchema, + notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), + bankAccountId: z.string().nullable(), + partnerNetworkIds: z.array(z.string()).readonly().describe("Partner network IDs"), + dunningSystemId: z.string().describe("Dunning system ID").nullable(), + hblIssuerSigner: z.string().describe("HBL issuer/signer prefill").nullable(), + signatureFileAttachmentId: z.string().describe("Signature file attachment ID").nullable(), + }) + .readonly(); + export type UpdateBusinessPartnerBasicRequestDTO = z.infer; + + /** + * BusinessPartnerSignatureUploadRequestDTOSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType Mime type + * @property { number } fileSize File size in bytes. Minimum: `1` + */ + export const BusinessPartnerSignatureUploadRequestDTOSchema = z + .object({ + fileName: z.string().describe("File name"), + mimeType: z.string().describe("Mime type"), + fileSize: z.number().gte(1).describe("File size in bytes"), + }) + .readonly(); + export type BusinessPartnerSignatureUploadRequestDTO = z.infer; + + /** + * BusinessPartnerSignatureUploadResponseDTOSchema + * @type { object } + * @property { string } mediaId Media ID for the uploaded signature + * @property { string } method HTTP method to use for upload + * @property { string } url URL to upload the file to + */ + export const BusinessPartnerSignatureUploadResponseDTOSchema = z + .object({ + mediaId: z.string().describe("Media ID for the uploaded signature"), + method: z.string().describe("HTTP method to use for upload"), + url: z.string().describe("URL to upload the file to"), + }) + .readonly(); + export type BusinessPartnerSignatureUploadResponseDTO = z.infer< + typeof BusinessPartnerSignatureUploadResponseDTOSchema + >; + + /** + * CargoAgentResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Business partner identifier + * @property { string } portOfHamburgAccountNumber Port of Hamburg account number + * @property { string } iataAccountNumber IATA account number + * @property { string } regulatedAgentCode Regulated agent code + */ + export const CargoAgentResponseDTOSchema = z + .object({ + businessPartnerId: z.string().describe("Business partner identifier"), + portOfHamburgAccountNumber: z.string().describe("Port of Hamburg account number"), + iataAccountNumber: z.string().describe("IATA account number"), + regulatedAgentCode: z.string().describe("Regulated agent code"), + }) + .readonly(); + export type CargoAgentResponseDTO = z.infer; + + /** + * UpdateCargoAgentDTOSchema + * @type { object } + * @property { string } portOfHamburgAccountNumber Hamburg port account number + * @property { string } iataAccountNumber IATA account number + * @property { string } regulatedAgentCode Regulated agent code + */ + export const UpdateCargoAgentDTOSchema = z + .object({ + portOfHamburgAccountNumber: z.string().describe("Hamburg port account number"), + iataAccountNumber: z.string().describe("IATA account number"), + regulatedAgentCode: z.string().describe("Regulated agent code"), + }) + .readonly(); + export type UpdateCargoAgentDTO = z.infer; + + /** + * CarrierResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Business partner identifier + * @property { string } scac SCAC code + * @property { string } iataAirlinePrefix IATA airline prefix + * @property { string } iataCode IATA code + * @property { string } registrationAddress Registration address + * @property { string } masterBlSuffix Master BL suffix + * @property { string } houseBlSuffix House BL suffix + * @property { string } airWaybillSuffix Air waybill suffix + * @property { string } cargoManifestSuffix Cargo manifest suffix + * @property { string } fundReportSuffix Fund report suffix + * @property { string } invoiceSuffix Invoice suffix + */ + export const CarrierResponseDTOSchema = z + .object({ + businessPartnerId: z.string().describe("Business partner identifier"), + scac: z.string().describe("SCAC code"), + iataAirlinePrefix: z.string().describe("IATA airline prefix"), + iataCode: z.string().describe("IATA code"), + registrationAddress: z.string().describe("Registration address"), + masterBlSuffix: z.string().describe("Master BL suffix"), + houseBlSuffix: z.string().describe("House BL suffix"), + airWaybillSuffix: z.string().describe("Air waybill suffix"), + cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), + fundReportSuffix: z.string().describe("Fund report suffix"), + invoiceSuffix: z.string().describe("Invoice suffix"), + }) + .readonly(); + export type CarrierResponseDTO = z.infer; + + /** + * UpdateCarrierDTOSchema + * @type { object } + * @property { string } scac SCAC code + * @property { string } iataAirlinePrefix IATA airline prefix + * @property { string } iataCode IATA code + * @property { string } registrationAddress Registration address + * @property { string } masterBlSuffix Master BL suffix + * @property { string } houseBlSuffix House BL suffix + * @property { string } airWaybillSuffix Air waybill suffix + * @property { string } cargoManifestSuffix Cargo manifest suffix + * @property { string } fundReportSuffix Fund report suffix + * @property { string } invoiceSuffix Invoice suffix + */ + export const UpdateCarrierDTOSchema = z + .object({ + scac: z.string().describe("SCAC code"), + iataAirlinePrefix: z.string().describe("IATA airline prefix"), + iataCode: z.string().describe("IATA code"), + registrationAddress: z.string().describe("Registration address"), + masterBlSuffix: z.string().describe("Master BL suffix"), + houseBlSuffix: z.string().describe("House BL suffix"), + airWaybillSuffix: z.string().describe("Air waybill suffix"), + cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), + fundReportSuffix: z.string().describe("Fund report suffix"), + invoiceSuffix: z.string().describe("Invoice suffix"), + }) + .readonly(); + export type UpdateCarrierDTO = z.infer; + + /** + * BusinessPartnersPaginateOrderParamEnumSchema + * @type { enum } + */ + export const BusinessPartnersPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "vat", + "shortName", + "address", + "locked", + "currency", + "archived", + ]); + export type BusinessPartnersPaginateOrderParamEnum = z.infer; + export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOrderParamEnumSchema.enum; + + /** + * BusinessPartnersPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BusinessPartnerListResponseDTO[] } items + */ + export const BusinessPartnersPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).readonly() }).readonly().shape, + }); + export type BusinessPartnersPaginateResponse = z.infer; + + /** + * BusinessPartnersPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const BusinessPartnersPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "vat", + "shortName", + "address", + "locked", + "currency", + "archived", + ]); + export type BusinessPartnersPaginateLabelsOrderParamEnum = z.infer< + typeof BusinessPartnersPaginateLabelsOrderParamEnumSchema + >; + export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPaginateLabelsOrderParamEnumSchema.enum; + + /** + * BusinessPartnersPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items + */ + export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type BusinessPartnersPaginateLabelsResponse = z.infer; + + /** + * GetRemarksResponseSchema + * @type { array } + */ + export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema).readonly(); + export type GetRemarksResponse = z.infer; +} diff --git a/test/generated/dist/businessPartners/businessPartners.queries.ts b/test/generated/dist/businessPartners/businessPartners.queries.ts new file mode 100644 index 0000000..330f8f0 --- /dev/null +++ b/test/generated/dist/businessPartners/businessPartners.queries.ts @@ -0,0 +1,895 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnersAcl } from "./businessPartners.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnersModels } from "./businessPartners.models"; +import { BusinessPartnersApi } from "./businessPartners.api"; + +export namespace BusinessPartnersQueries { + export const moduleName = QueryModule.BusinessPartners; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/business-partners", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/business-partners", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/business-partners/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/business-partners/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + getById: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/business-partners/:id", officeId, id] as const, + getRemarks: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/business-partners/:id/remarks", officeId, id] as const, + getBasicInfo: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/business-partners/:id/basic", officeId, id] as const, + getCargoAgentInfo: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/business-partners/:id/cargo-agent", officeId, id] as const, + getCarrierInformation: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/business-partners/:id/carrier", officeId, id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate business partners + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BusinessPartnersModels.BusinessPartnerFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId })); + return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate business partners + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BusinessPartnersModels.BusinessPartnerFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId })); + return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create business partner + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { BusinessPartnersModels.CreateBusinessPartnerRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.create, + { officeId: string; data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(BusinessPartnersAcl.canUseCreate({ officeId })); + return BusinessPartnersApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId })); + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId })); + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetById` + * @summary Get business partner by ID + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetById = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetById({ officeId })); + return BusinessPartnersApi.getById(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update business partner + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.update, + { officeId: string; id: string; data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId })); + return BusinessPartnersApi.update(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive business partner + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseArchive({ officeId })); + return BusinessPartnersApi.archive(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive business partner + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId })); + return BusinessPartnersApi.unarchive(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useLock` + * @summary Lock business partner + * @permission Requires `canUseLock` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useLock = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseLock({ officeId })); + return BusinessPartnersApi.lock(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnlock` + * @summary Unlock business partner + * @permission Requires `canUseUnlock` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnlock = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId })); + return BusinessPartnersApi.unlock(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetRemarks` + * @summary Get business partner remarks + * @permission Requires `canUseGetRemarks` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetRemarks = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getRemarks(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId })); + return BusinessPartnersApi.getRemarks(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateRemark` + * @summary Create business partner remark + * @permission Requires `canUseCreateRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateRemark = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.createRemark, + { officeId: string; id: string; data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId })); + return BusinessPartnersApi.createRemark(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateRemark` + * @permission Requires `canUseUpdateRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { string } mutation.remarkId Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateRemark = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.updateRemark, + { + officeId: string; + id: string; + remarkId: string; + data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, remarkId, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId })); + return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteRemark` + * @summary Delete business partner remark + * @permission Requires `canUseDeleteRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { string } mutation.remarkId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteRemark = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.deleteRemark, + { officeId: string; id: string; remarkId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, remarkId }) => { + checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId })); + return BusinessPartnersApi.deleteRemark(officeId, id, remarkId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetBasicInfo` + * @summary Get business partner basic info + * @permission Requires `canUseGetBasicInfo` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetBasicInfo = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBasicInfo(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId })); + return BusinessPartnersApi.getBasicInfo(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateBasicInfo` + * @summary Update business partner basic info + * @permission Requires `canUseUpdateBasicInfo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBasicInfo = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.updateBasicInfo, + { officeId: string; id: string; data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId })); + return BusinessPartnersApi.updateBasicInfo(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getBasicInfo(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreateSignatureUploadInstructions` + * @summary Create upload instructions for business partner signature + * @permission Requires `canUseCreateSignatureUploadInstructions` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateSignatureUploadInstructions = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.createSignatureUploadInstructions, + { + officeId: string; + id: string; + data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { + checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId })); + const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions( + officeId, + id, + data, + config, + ); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetCargoAgentInfo` + * @summary Get cargo agent information for business partner + * @permission Requires `canUseGetCargoAgentInfo` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCargoAgentInfo = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoAgentInfo(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId })); + return BusinessPartnersApi.getCargoAgentInfo(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCargoAgent` + * @summary Update cargo agent information for business partner + * @permission Requires `canUseUpdateCargoAgent` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateCargoAgentDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCargoAgent = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.updateCargoAgent, + { officeId: string; id: string; data: BusinessPartnersModels.UpdateCargoAgentDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId })); + return BusinessPartnersApi.updateCargoAgent(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getCargoAgentInfo(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetCarrierInformation` + * @summary Get carrier information for business partner + * @permission Requires `canUseGetCarrierInformation` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCarrierInformation = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCarrierInformation(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId })); + return BusinessPartnersApi.getCarrierInformation(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCarrier` + * @summary Update carrier information for business partner + * @permission Requires `canUseUpdateCarrier` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateCarrierDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCarrier = ( + options?: AppMutationOptions< + typeof BusinessPartnersApi.updateCarrier, + { officeId: string; id: string; data: BusinessPartnersModels.UpdateCarrierDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId })); + return BusinessPartnersApi.updateCarrier(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getCarrierInformation(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/cargoTypes/cargoTypes.acl.ts b/test/generated/dist/cargoTypes/cargoTypes.acl.ts new file mode 100644 index 0000000..342fe0d --- /dev/null +++ b/test/generated/dist/cargoTypes/cargoTypes.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CargoTypesAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "CargoType"] as AbilityTuple<"Create", "CargoType">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "CargoType"] as AbilityTuple<"Update", "CargoType">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "CargoType"] as AbilityTuple<"Archive", "CargoType">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "CargoType"] as AbilityTuple<"Archive", "CargoType">; +} diff --git a/test/generated/dist/cargoTypes/cargoTypes.api.ts b/test/generated/dist/cargoTypes/cargoTypes.api.ts new file mode 100644 index 0000000..0772804 --- /dev/null +++ b/test/generated/dist/cargoTypes/cargoTypes.api.ts @@ -0,0 +1,117 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CargoTypesModels } from "./cargoTypes.models"; + +export namespace CargoTypesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: CargoTypesModels.CargoTypePaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, `/cargo-types`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types`, + ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), + config, + ); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: CargoTypesModels.CargoTypeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, + `/cargo-types/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, `/cargo-types/${id}`, config); + }; + export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}`, + ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/cargoTypes/cargoTypes.configs.ts b/test/generated/dist/cargoTypes/cargoTypes.configs.ts new file mode 100644 index 0000000..c2d613d --- /dev/null +++ b/test/generated/dist/cargoTypes/cargoTypes.configs.ts @@ -0,0 +1,141 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CargoTypesModels } from "./cargoTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CargoTypesQueries } from "./cargoTypes.queries"; +import { CargoTypesAcl } from "./cargoTypes.acl"; + +export namespace CargoTypesConfigs { + export const cargoTypesConfig = { + meta: { + title: "Cargo Types", + }, + readAll: { + acl: CargoTypesAcl.canUsePaginate, + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + paginated: CargoTypesQueries.usePaginate, + infinite: CargoTypesQueries.usePaginateInfinite, + filters: { + schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, + options: { + inputs: { + module: true, + archived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + shortName: true, + length: true, + width: true, + height: true, + unit: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + modules: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: CargoTypesAcl.canUseFindById, + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + query: CargoTypesQueries.useFindById, + }, + create: { + acl: CargoTypesAcl.canUseCreate, + schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, + mutation: CargoTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + length: true, + width: true, + height: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + unit: true, + modules: true, + }, + }, + }), + }, + update: { + acl: CargoTypesAcl.canUseUpdate, + schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, + mutation: CargoTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + length: true, + width: true, + height: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + unit: true, + modules: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CargoTypesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CargoTypesQueries.usePaginateLabels, + infinite: CargoTypesQueries.usePaginateLabelsInfinite, + filters: { + schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/cargoTypes/cargoTypes.models.ts b/test/generated/dist/cargoTypes/cargoTypes.models.ts new file mode 100644 index 0000000..bf04326 --- /dev/null +++ b/test/generated/dist/cargoTypes/cargoTypes.models.ts @@ -0,0 +1,224 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CargoTypesModels { + /** + * CargoTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CargoTypeEmployeeDTO = z.infer; + + /** + * CargoTypeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the cargo type + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { string } unit Measurement unit for dimensions + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type + * @property { boolean } archived Indicates if the cargo type is archived + * @property { string } createdById + * @property { CargoTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CargoTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const CargoTypeResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier for the cargo type"), + name: z.string().describe("Name of the cargo type"), + shortName: z.string().describe("Short name of the cargo type").nullish(), + length: z.number().describe("Length of the cargo type").nullish(), + width: z.number().describe("Width of the cargo type").nullish(), + height: z.number().describe("Height of the cargo type").nullish(), + unit: z.string().describe("Measurement unit for dimensions"), + emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), + containerIsoCode: z.string().describe("Container ISO code").nullish(), + isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), + modules: z + .array(CommonModels.TransportModeEnumSchema) + .readonly() + .describe("Transport modules applicable to the cargo type"), + archived: z.boolean().describe("Indicates if the cargo type is archived"), + createdById: z.string().nullish(), + createdBy: CargoTypeEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: CargoTypeEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type CargoTypeResponseDTO = z.infer; + + /** + * TransportModuleEnumSchema + * @type { enum } + */ + export const TransportModuleEnumSchema = z.enum(["Air", "Sea", "Road"]); + export type TransportModuleEnum = z.infer; + export const TransportModuleEnum = TransportModuleEnumSchema.enum; + + /** + * CargoTypePaginationFilterDtoSchema + * @type { object } + * @property { TransportModuleEnum } module + * @property { boolean } archived Archived status filter + * @property { string } search + */ + export const CargoTypePaginationFilterDtoSchema = z + .object({ + module: TransportModuleEnumSchema, + archived: z.boolean().describe("Archived status filter"), + search: z.string(), + }) + .readonly(); + export type CargoTypePaginationFilterDto = z.infer; + + /** + * CreateCargoTypeRequestDTOSchema + * @type { object } + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { string } unit Measurement unit for dimensions + * @property { CommonModels.TransportModeEnum[] } modules Transport modes applicable to the cargo type + */ + export const CreateCargoTypeRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the cargo type"), + shortName: z.string().describe("Short name of the cargo type").nullish(), + length: z.number().describe("Length of the cargo type").nullish(), + width: z.number().describe("Width of the cargo type").nullish(), + height: z.number().describe("Height of the cargo type").nullish(), + emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), + containerIsoCode: z.string().describe("Container ISO code").nullish(), + isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), + unit: z.string().describe("Measurement unit for dimensions"), + modules: z + .array(CommonModels.TransportModeEnumSchema) + .readonly() + .describe("Transport modes applicable to the cargo type"), + }) + .readonly(); + export type CreateCargoTypeRequestDTO = z.infer; + + /** + * UpdateCargoTypeRequestDTOSchema + * @type { object } + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { string } unit Measurement unit for dimensions + * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type + */ + export const UpdateCargoTypeRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the cargo type"), + shortName: z.string().describe("Short name of the cargo type"), + length: z.number().describe("Length of the cargo type").nullable(), + width: z.number().describe("Width of the cargo type").nullable(), + height: z.number().describe("Height of the cargo type").nullable(), + emptyWeight: z.number().describe("Empty weight of the cargo container").nullable(), + containerIsoCode: z.string().describe("Container ISO code").nullable(), + isContainer: z.boolean().describe("Whether this cargo type is a container").nullable(), + unit: z.string().describe("Measurement unit for dimensions"), + modules: z + .array(CommonModels.TransportModeEnumSchema) + .readonly() + .describe("Transport modules applicable to the cargo type"), + }) + .readonly(); + export type UpdateCargoTypeRequestDTO = z.infer; + + /** + * CargoTypeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const CargoTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type CargoTypeLabelFilterDto = z.infer; + + /** + * CargoTypesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const CargoTypesPaginateOrderParamEnumSchema = z.enum([ + "matchcode", + "description", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "name", + ]); + export type CargoTypesPaginateOrderParamEnum = z.infer; + export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnumSchema.enum; + + /** + * CargoTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CargoTypeResponseDTO[] } items + */ + export const CargoTypesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CargoTypeResponseDTOSchema).readonly() }).readonly().shape, + }); + export type CargoTypesPaginateResponse = z.infer; + + /** + * CargoTypesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const CargoTypesPaginateLabelsOrderParamEnumSchema = z.enum([ + "matchcode", + "description", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "name", + ]); + export type CargoTypesPaginateLabelsOrderParamEnum = z.infer; + export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * CargoTypesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const CargoTypesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type CargoTypesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/cargoTypes/cargoTypes.queries.ts b/test/generated/dist/cargoTypes/cargoTypes.queries.ts new file mode 100644 index 0000000..483b369 --- /dev/null +++ b/test/generated/dist/cargoTypes/cargoTypes.queries.ts @@ -0,0 +1,362 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CargoTypesAcl } from "./cargoTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CargoTypesModels } from "./cargoTypes.models"; +import { CargoTypesApi } from "./cargoTypes.api"; + +export namespace CargoTypesQueries { + export const moduleName = QueryModule.CargoTypes; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: CargoTypesModels.CargoTypePaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/cargo-types", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: CargoTypesModels.CargoTypePaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/cargo-types", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: CargoTypesModels.CargoTypeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/cargo-types/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: CargoTypesModels.CargoTypeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/cargo-types/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/cargo-types/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Cargo Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CargoTypesModels.CargoTypePaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CargoTypesAcl.canUsePaginate()); + return CargoTypesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Cargo Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CargoTypesModels.CargoTypePaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CargoTypesAcl.canUsePaginate()); + return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create Cargo Type + * @permission Requires `canUseCreate` ability + * @param { CargoTypesModels.CreateCargoTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CargoTypesAcl.canUseCreate()); + return CargoTypesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate cargo types with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CargoTypesModels.CargoTypeLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CargoTypesAcl.canUsePaginateLabels()); + return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate cargo types with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CargoTypesModels.CargoTypeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CargoTypesAcl.canUsePaginateLabels()); + return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get Cargo Type by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(CargoTypesAcl.canUseFindById()); + return CargoTypesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Cargo Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { CargoTypesModels.UpdateCargoTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof CargoTypesApi.update, + { id: string; data: CargoTypesModels.UpdateCargoTypeRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(CargoTypesAcl.canUseUpdate()); + return CargoTypesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive Cargo Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CargoTypesAcl.canUseArchive()); + return CargoTypesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive Cargo Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CargoTypesAcl.canUseUnarchive()); + return CargoTypesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/chargeTypes/chargeTypes.acl.ts b/test/generated/dist/chargeTypes/chargeTypes.acl.ts new file mode 100644 index 0000000..a76453f --- /dev/null +++ b/test/generated/dist/chargeTypes/chargeTypes.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace ChargeTypesAcl { + /** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "ChargeType"] as AbilityTuple<"Create", "ChargeType">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "ChargeType"] as AbilityTuple<"Update", "ChargeType">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "ChargeType"] as AbilityTuple<"Archive", "ChargeType">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "ChargeType"] as AbilityTuple<"Archive", "ChargeType">; +} diff --git a/test/generated/dist/chargeTypes/chargeTypes.api.ts b/test/generated/dist/chargeTypes/chargeTypes.api.ts new file mode 100644 index 0000000..53f6e68 --- /dev/null +++ b/test/generated/dist/chargeTypes/chargeTypes.api.ts @@ -0,0 +1,125 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChargeTypesModels } from "./chargeTypes.models"; + +export namespace ChargeTypesApi { + export const findAll = ( + limit: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, + `/charge-types/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const paginate = ( + limit: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, `/charge-types`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types`, + ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), + config, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}`, + config, + ); + }; + export const update = ( + id: string, + data: ChargeTypesModels.UpdateChargeTypeRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}`, + ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/chargeTypes/chargeTypes.configs.ts b/test/generated/dist/chargeTypes/chargeTypes.configs.ts new file mode 100644 index 0000000..2aab959 --- /dev/null +++ b/test/generated/dist/chargeTypes/chargeTypes.configs.ts @@ -0,0 +1,135 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChargeTypesModels } from "./chargeTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChargeTypesQueries } from "./chargeTypes.queries"; +import { ChargeTypesAcl } from "./chargeTypes.acl"; + +export namespace ChargeTypesConfigs { + export const chargeTypesConfig = { + meta: { + title: "Charge Types", + }, + readAll: { + acl: ChargeTypesAcl.canUsePaginate, + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + paginated: ChargeTypesQueries.usePaginate, + infinite: ChargeTypesQueries.usePaginateInfinite, + filters: { + schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, + options: { + inputs: { + name: true, + search: true, + archived: true, + direction: true, + transportModes: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: ChargeTypesAcl.canUseFindById, + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + query: ChargeTypesQueries.useFindById, + }, + create: { + acl: ChargeTypesAcl.canUseCreate, + schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, + mutation: ChargeTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, + options: { + inputs: { + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + }, + }, + }), + }, + update: { + acl: ChargeTypesAcl.canUseUpdate, + schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, + mutation: ChargeTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, + options: { + inputs: { + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ChargeTypesAcl.canUseFindAll, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChargeTypesQueries.useFindAll, + infinite: ChargeTypesQueries.useFindAllInfinite, + filters: { + schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, + options: { + inputs: { + direction: true, + transportModes: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/chargeTypes/chargeTypes.models.ts b/test/generated/dist/chargeTypes/chargeTypes.models.ts new file mode 100644 index 0000000..688b640 --- /dev/null +++ b/test/generated/dist/chargeTypes/chargeTypes.models.ts @@ -0,0 +1,230 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChargeTypesModels { + /** + * ChargeTypeLabelFilterDtoSchema + * @type { object } + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum[] } transportModes + * @property { string } search + */ + export const ChargeTypeLabelFilterDtoSchema = z + .object({ + direction: CommonModels.DirectionEnumSchema, + transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), + search: z.string(), + }) + .readonly(); + export type ChargeTypeLabelFilterDto = z.infer; + + /** + * ChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ + export const ChargeTypeTranslationDtoSchema = z + .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) + .readonly(); + export type ChargeTypeTranslationDto = z.infer; + + /** + * ChargeTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ChargeTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ChargeTypeEmployeeDTO = z.infer; + + /** + * ChargeTypeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { ChargeTypeTranslationDto[] } translations + * @property { string } createdById + * @property { ChargeTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { ChargeTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const ChargeTypeResponseDTOSchema = z + .object({ + id: z.string(), + matchCode: z.string(), + englishName: z.string(), + archived: z.boolean(), + description: z.string().nullish(), + modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), + directions: z.array(CommonModels.DirectionEnumSchema).readonly(), + translations: z.array(ChargeTypeTranslationDtoSchema).readonly(), + createdById: z.string().nullish(), + createdBy: ChargeTypeEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type ChargeTypeResponseDTO = z.infer; + + /** + * ChargeTypePaginationFilterDtoSchema + * @type { object } + * @property { string } name + * @property { string } search + * @property { boolean } archived + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum[] } transportModes + */ + export const ChargeTypePaginationFilterDtoSchema = z + .object({ + name: z.string(), + search: z.string(), + archived: z.boolean(), + direction: CommonModels.DirectionEnumSchema, + transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), + }) + .readonly(); + export type ChargeTypePaginationFilterDto = z.infer; + + /** + * CreateChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ + export const CreateChargeTypeTranslationDtoSchema = z + .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) + .readonly(); + export type CreateChargeTypeTranslationDto = z.infer; + + /** + * CreateChargeTypeRequestDTOSchema + * @type { object } + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { CreateChargeTypeTranslationDto[] } translations + */ + export const CreateChargeTypeRequestDTOSchema = z + .object({ + matchCode: z.string(), + englishName: z.string().nullish(), + archived: z.boolean().nullish(), + description: z.string().nullish(), + modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), + directions: z.array(CommonModels.DirectionEnumSchema).readonly(), + translations: z.array(CreateChargeTypeTranslationDtoSchema).readonly().nullish(), + }) + .readonly(); + export type CreateChargeTypeRequestDTO = z.infer; + + /** + * UpdateChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ + export const UpdateChargeTypeTranslationDtoSchema = z + .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) + .readonly(); + export type UpdateChargeTypeTranslationDto = z.infer; + + /** + * UpdateChargeTypeRequestDTOSchema + * @type { object } + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { UpdateChargeTypeTranslationDto[] } translations + */ + export const UpdateChargeTypeRequestDTOSchema = z + .object({ + matchCode: z.string(), + englishName: z.string(), + archived: z.boolean(), + description: z.string(), + modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), + directions: z.array(CommonModels.DirectionEnumSchema).readonly(), + translations: z.array(UpdateChargeTypeTranslationDtoSchema).readonly(), + }) + .readonly(); + export type UpdateChargeTypeRequestDTO = z.infer; + + /** + * ChargeTypesFindAllOrderParamEnumSchema + * @type { enum } + */ + export const ChargeTypesFindAllOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "englishName", + ]); + export type ChargeTypesFindAllOrderParamEnum = z.infer; + export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnumSchema.enum; + + /** + * ChargeTypesFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const ChargeTypesFindAllResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChargeTypesFindAllResponse = z.infer; + + /** + * ChargeTypesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const ChargeTypesPaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "englishName", + ]); + export type ChargeTypesPaginateOrderParamEnum = z.infer; + export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEnumSchema.enum; + + /** + * ChargeTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChargeTypeResponseDTO[] } items + */ + export const ChargeTypesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChargeTypesPaginateResponse = z.infer; +} diff --git a/test/generated/dist/chargeTypes/chargeTypes.queries.ts b/test/generated/dist/chargeTypes/chargeTypes.queries.ts new file mode 100644 index 0000000..1613130 --- /dev/null +++ b/test/generated/dist/chargeTypes/chargeTypes.queries.ts @@ -0,0 +1,362 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChargeTypesAcl } from "./chargeTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChargeTypesModels } from "./chargeTypes.models"; +import { ChargeTypesApi } from "./chargeTypes.api"; + +export namespace ChargeTypesQueries { + export const moduleName = QueryModule.ChargeTypes; + + export const keys = { + all: [moduleName] as const, + findAll: ( + limit?: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/charge-types/paginate/labels", limit, order, filter, page, cursor] as const, + findAllInfinite: ( + limit?: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/charge-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: ( + limit?: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/charge-types", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/charge-types", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/charge-types/:id", id] as const, + }; + + /** + * Query `useFindAll` + * @summary Paginate charge types with only their labels + * @permission Requires `canUseFindAll` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ChargeTypesModels.ChargeTypeLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUseFindAll()); + return ChargeTypesApi.findAll(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindAllInfinite + * @summary Paginate charge types with only their labels + * @permission Requires `canUseFindAll` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ChargeTypesModels.ChargeTypeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChargeTypesAcl.canUseFindAll()); + return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginate` + * @summary Paginate Charge Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ChargeTypesModels.ChargeTypePaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUsePaginate()); + return ChargeTypesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Charge Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ChargeTypesModels.ChargeTypePaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChargeTypesAcl.canUsePaginate()); + return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new Charge Type + * @permission Requires `canUseCreate` ability + * @param { ChargeTypesModels.CreateChargeTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(ChargeTypesAcl.canUseCreate()); + return ChargeTypesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get Charge Type Details by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUseFindById()); + return ChargeTypesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update an existing Charge Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { ChargeTypesModels.UpdateChargeTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ChargeTypesApi.update, + { id: string; data: ChargeTypesModels.UpdateChargeTypeRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(ChargeTypesAcl.canUseUpdate()); + return ChargeTypesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive a Charge Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ChargeTypesAcl.canUseArchive()); + return ChargeTypesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive a Charge Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ChargeTypesAcl.canUseUnarchive()); + return ChargeTypesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/checklistItems/checklistItems.acl.ts b/test/generated/dist/checklistItems/checklistItems.acl.ts new file mode 100644 index 0000000..01dc0d4 --- /dev/null +++ b/test/generated/dist/checklistItems/checklistItems.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ChecklistItemsAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create checklist item in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Create", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List checklist items for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Read", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Paginate checklist item labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Read", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get checklist item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Read", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Update", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Archive", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< + "Archive", + "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/checklistItems/checklistItems.api.ts b/test/generated/dist/checklistItems/checklistItems.api.ts new file mode 100644 index 0000000..3891cc6 --- /dev/null +++ b/test/generated/dist/checklistItems/checklistItems.api.ts @@ -0,0 +1,136 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChecklistItemsModels } from "./checklistItems.models"; + +export namespace ChecklistItemsApi { + export const create = ( + officeId: string, + data: ChecklistItemsModels.CreateChecklistItemRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items`, + ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), + config, + ); + }; + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, + `/offices/${officeId}/checklist-items`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, + `/offices/${officeId}/checklist-items/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items/${id}`, + config, + ); + }; + export const update = ( + id: string, + officeId: string, + data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items/${id}`, + ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-items/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-items/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/checklistItems/checklistItems.configs.ts b/test/generated/dist/checklistItems/checklistItems.configs.ts new file mode 100644 index 0000000..014d56c --- /dev/null +++ b/test/generated/dist/checklistItems/checklistItems.configs.ts @@ -0,0 +1,115 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChecklistItemsModels } from "./checklistItems.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChecklistItemsQueries } from "./checklistItems.queries"; +import { ChecklistItemsAcl } from "./checklistItems.acl"; + +export namespace ChecklistItemsConfigs { + export const checklistItemsConfig = { + meta: { + title: "Checklist Items", + }, + readAll: { + acl: ChecklistItemsAcl.canUsePaginate, + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + paginated: ChecklistItemsQueries.usePaginate, + infinite: ChecklistItemsQueries.usePaginateInfinite, + filters: { + schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: ChecklistItemsAcl.canUseFindById, + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + query: ChecklistItemsQueries.useFindById, + }, + create: { + acl: ChecklistItemsAcl.canUseCreate, + schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, + mutation: ChecklistItemsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + update: { + acl: ChecklistItemsAcl.canUseUpdate, + schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, + mutation: ChecklistItemsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: ChecklistItemsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChecklistItemsQueries.usePaginateLabels, + infinite: ChecklistItemsQueries.usePaginateLabelsInfinite, + filters: { + schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/checklistItems/checklistItems.models.ts b/test/generated/dist/checklistItems/checklistItems.models.ts new file mode 100644 index 0000000..0951314 --- /dev/null +++ b/test/generated/dist/checklistItems/checklistItems.models.ts @@ -0,0 +1,144 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChecklistItemsModels { + /** + * ChecklistItemEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ChecklistItemEmployeeDTO = z.infer; + + /** + * ChecklistItemResponseDTOSchema + * @type { object } + * @property { string } id Checklist item ID + * @property { string } name Checklist item name + * @property { string } officeId Office ID + * @property { boolean } archived Is archived + * @property { string } archivedAt Archived at + * @property { string } createdById ID of the employee who created this checklist item + * @property { ChecklistItemEmployeeDTO } createdBy Employee who created this checklist item + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this checklist item + * @property { ChecklistItemEmployeeDTO } updatedBy Employee who last updated this checklist item + * @property { string } updatedAt Updated at + */ + export const ChecklistItemResponseDTOSchema = z + .object({ + id: z.string().describe("Checklist item ID"), + name: z.string().describe("Checklist item name"), + officeId: z.string().describe("Office ID"), + archived: z.boolean().describe("Is archived"), + archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), + createdById: z.string().describe("ID of the employee who created this checklist item").nullish(), + createdBy: ChecklistItemEmployeeDTOSchema.describe("Employee who created this checklist item").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedById: z.string().describe("ID of the employee who last updated this checklist item").nullish(), + updatedBy: ChecklistItemEmployeeDTOSchema.describe("Employee who last updated this checklist item").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + }) + .readonly(); + export type ChecklistItemResponseDTO = z.infer; + + /** + * CreateChecklistItemRequestDTOSchema + * @type { object } + * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` + */ + export const CreateChecklistItemRequestDTOSchema = z + .object({ name: z.string().min(3).max(256).describe("Checklist item name") }) + .readonly(); + export type CreateChecklistItemRequestDTO = z.infer; + + /** + * ChecklistItemLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const ChecklistItemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type ChecklistItemLabelFilterDto = z.infer; + + /** + * ChecklistItemFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ + export const ChecklistItemFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); + export type ChecklistItemFilterDto = z.infer; + + /** + * UpdateChecklistItemRequestDTOSchema + * @type { object } + * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` + */ + export const UpdateChecklistItemRequestDTOSchema = z + .object({ name: z.string().min(3).max(256).describe("Checklist item name") }) + .readonly(); + export type UpdateChecklistItemRequestDTO = z.infer; + + /** + * ChecklistItemsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const ChecklistItemsPaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ChecklistItemsPaginateOrderParamEnum = z.infer; + export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderParamEnumSchema.enum; + + /** + * ChecklistItemsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChecklistItemResponseDTO[] } items + */ + export const ChecklistItemsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChecklistItemsPaginateResponse = z.infer; + + /** + * ChecklistItemsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const ChecklistItemsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ChecklistItemsPaginateLabelsOrderParamEnum = z.infer< + typeof ChecklistItemsPaginateLabelsOrderParamEnumSchema + >; + export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * ChecklistItemsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChecklistItemsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/checklistItems/checklistItems.queries.ts b/test/generated/dist/checklistItems/checklistItems.queries.ts new file mode 100644 index 0000000..2b1dfcc --- /dev/null +++ b/test/generated/dist/checklistItems/checklistItems.queries.ts @@ -0,0 +1,416 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChecklistItemsAcl } from "./checklistItems.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChecklistItemsModels } from "./checklistItems.models"; +import { ChecklistItemsApi } from "./checklistItems.api"; + +export namespace ChecklistItemsQueries { + export const moduleName = QueryModule.ChecklistItems; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/checklist-items", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemFilterDto, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/checklist-items", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/checklist-items/labels/paginate", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/checklist-items/labels/paginate", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/checklist-items/:id", id, officeId] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create checklist item + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ChecklistItemsModels.CreateChecklistItemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof ChecklistItemsApi.create, + { officeId: string; data: ChecklistItemsModels.CreateChecklistItemRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ChecklistItemsAcl.canUseCreate({ officeId })); + return ChecklistItemsApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Get paginated checklist items + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistItemsModels.ChecklistItemFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId })); + return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Get paginated checklist items + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistItemsModels.ChecklistItemFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId })); + return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate checklist item labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId })); + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate checklist item labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId })); + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get checklist item by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUseFindById({ officeId })); + return ChecklistItemsApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update checklist item + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ChecklistItemsModels.UpdateChecklistItemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ChecklistItemsApi.update, + { id: string; officeId: string; data: ChecklistItemsModels.UpdateChecklistItemRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId })); + return ChecklistItemsApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive checklist item + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistItemsAcl.canUseArchive({ officeId })); + return ChecklistItemsApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive checklist item + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId })); + return ChecklistItemsApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/checklistTemplates/checklistTemplates.acl.ts b/test/generated/dist/checklistTemplates/checklistTemplates.acl.ts new file mode 100644 index 0000000..7f4682b --- /dev/null +++ b/test/generated/dist/checklistTemplates/checklistTemplates.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ChecklistTemplatesAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create checklist template in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Create", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List checklist templates for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Read", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Get checklist template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Read", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get checklist template by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Read", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Update", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Archive", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< + "Archive", + "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/checklistTemplates/checklistTemplates.api.ts b/test/generated/dist/checklistTemplates/checklistTemplates.api.ts new file mode 100644 index 0000000..cc79cfc --- /dev/null +++ b/test/generated/dist/checklistTemplates/checklistTemplates.api.ts @@ -0,0 +1,138 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; + +export namespace ChecklistTemplatesApi { + export const create = ( + officeId: string, + data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates`, + ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), + config, + ); + }; + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, + `/offices/${officeId}/checklist-templates`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/checklist-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates/${id}`, + config, + ); + }; + export const update = ( + id: string, + officeId: string, + data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates/${id}`, + ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-templates/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-templates/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/checklistTemplates/checklistTemplates.configs.ts b/test/generated/dist/checklistTemplates/checklistTemplates.configs.ts new file mode 100644 index 0000000..0c9d106 --- /dev/null +++ b/test/generated/dist/checklistTemplates/checklistTemplates.configs.ts @@ -0,0 +1,117 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChecklistTemplatesQueries } from "./checklistTemplates.queries"; +import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; + +export namespace ChecklistTemplatesConfigs { + export const checklistTemplatesConfig = { + meta: { + title: "Checklist Templates", + }, + readAll: { + acl: ChecklistTemplatesAcl.canUsePaginate, + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + paginated: ChecklistTemplatesQueries.usePaginate, + infinite: ChecklistTemplatesQueries.usePaginateInfinite, + filters: { + schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + items: true, + }, + sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: ChecklistTemplatesAcl.canUseFindById, + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + query: ChecklistTemplatesQueries.useFindById, + }, + create: { + acl: ChecklistTemplatesAcl.canUseCreate, + schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, + mutation: ChecklistTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + update: { + acl: ChecklistTemplatesAcl.canUseUpdate, + schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, + mutation: ChecklistTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + items: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ChecklistTemplatesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChecklistTemplatesQueries.usePaginateLabels, + infinite: ChecklistTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/checklistTemplates/checklistTemplates.models.ts b/test/generated/dist/checklistTemplates/checklistTemplates.models.ts new file mode 100644 index 0000000..e8309ff --- /dev/null +++ b/test/generated/dist/checklistTemplates/checklistTemplates.models.ts @@ -0,0 +1,167 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChecklistTemplatesModels { + /** + * ChecklistTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ChecklistTemplateEmployeeDTO = z.infer; + + /** + * ChecklistTemplateItemResponseDTOSchema + * @type { object } + * @property { string } checklistItemId Checklist item id + * @property { number } order Order index + * @property { string } name Checklist item name + */ + export const ChecklistTemplateItemResponseDTOSchema = z + .object({ + checklistItemId: z.string().describe("Checklist item id"), + order: z.number().describe("Order index"), + name: z.string().describe("Checklist item name").nullish(), + }) + .readonly(); + export type ChecklistTemplateItemResponseDTO = z.infer; + + /** + * ChecklistTemplateResponseDTOSchema + * @type { object } + * @property { string } id Template id + * @property { string } name Template name + * @property { string } officeId Office id + * @property { boolean } archived Is archived + * @property { string } archivedAt Archived at + * @property { string } createdById ID of the employee who created this template + * @property { ChecklistTemplateEmployeeDTO } createdBy Employee who created this template + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this template + * @property { ChecklistTemplateEmployeeDTO } updatedBy Employee who last updated this template + * @property { string } updatedAt Updated at + * @property { ChecklistTemplateItemResponseDTO[] } items Ordered items + */ + export const ChecklistTemplateResponseDTOSchema = z + .object({ + id: z.string().describe("Template id"), + name: z.string().describe("Template name"), + officeId: z.string().describe("Office id"), + archived: z.boolean().describe("Is archived"), + archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), + createdById: z.string().describe("ID of the employee who created this template").nullish(), + createdBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), + updatedBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + items: z.array(ChecklistTemplateItemResponseDTOSchema).readonly().describe("Ordered items"), + }) + .readonly(); + export type ChecklistTemplateResponseDTO = z.infer; + + /** + * CreateChecklistTemplateRequestDTOSchema + * @type { object } + * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` + */ + export const CreateChecklistTemplateRequestDTOSchema = z + .object({ name: z.string().min(3).max(120).describe("Checklist template name") }) + .readonly(); + export type CreateChecklistTemplateRequestDTO = z.infer; + + /** + * ChecklistTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const ChecklistTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type ChecklistTemplateLabelFilterDto = z.infer; + + /** + * ChecklistTemplateFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ + export const ChecklistTemplateFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); + export type ChecklistTemplateFilterDto = z.infer; + + /** + * UpdateChecklistTemplateRequestDTOSchema + * @type { object } + * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` + * @property { string[] } items Ordered checklist item ids + */ + export const UpdateChecklistTemplateRequestDTOSchema = z + .object({ + name: z.string().min(3).max(120).describe("Checklist template name"), + items: z.array(z.uuid()).readonly().describe("Ordered checklist item ids"), + }) + .readonly(); + export type UpdateChecklistTemplateRequestDTO = z.infer; + + /** + * ChecklistTemplatesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const ChecklistTemplatesPaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ChecklistTemplatesPaginateOrderParamEnum = z.infer; + export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPaginateOrderParamEnumSchema.enum; + + /** + * ChecklistTemplatesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChecklistTemplateResponseDTO[] } items + */ + export const ChecklistTemplatesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChecklistTemplatesPaginateResponse = z.infer; + + /** + * ChecklistTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const ChecklistTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ChecklistTemplatesPaginateLabelsOrderParamEnum = z.infer< + typeof ChecklistTemplatesPaginateLabelsOrderParamEnumSchema + >; + export const ChecklistTemplatesPaginateLabelsOrderParamEnum = + ChecklistTemplatesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * ChecklistTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ChecklistTemplatesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/checklistTemplates/checklistTemplates.queries.ts b/test/generated/dist/checklistTemplates/checklistTemplates.queries.ts new file mode 100644 index 0000000..9baea8c --- /dev/null +++ b/test/generated/dist/checklistTemplates/checklistTemplates.queries.ts @@ -0,0 +1,425 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; +import { ChecklistTemplatesApi } from "./checklistTemplates.api"; + +export namespace ChecklistTemplatesQueries { + export const moduleName = QueryModule.ChecklistTemplates; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/checklist-templates", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/checklist-templates", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/checklist-templates/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/checklist-templates/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/checklist-templates/:id", id, officeId] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create checklist template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof ChecklistTemplatesApi.create, + { officeId: string; data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId })); + return ChecklistTemplatesApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Get paginated checklist templates + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId })); + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Get paginated checklist templates + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId })); + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate checklist template labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId })); + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate checklist template labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId })); + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get checklist template by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId })); + return ChecklistTemplatesApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Replace checklist template + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ChecklistTemplatesApi.update, + { id: string; officeId: string; data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId })); + return ChecklistTemplatesApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive checklist template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId })); + return ChecklistTemplatesApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive checklist template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId })); + return ChecklistTemplatesApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/cities/cities.acl.ts b/test/generated/dist/cities/cities.acl.ts new file mode 100644 index 0000000..1511597 --- /dev/null +++ b/test/generated/dist/cities/cities.acl.ts @@ -0,0 +1,51 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CitiesAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "City"] as AbilityTuple<"Read", "City">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "City"] as AbilityTuple<"Create", "City">; + + /** + * Use for `useListCityLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCityLabels` query + */ + export const canUseListCityLabels = () => ["Read", "City"] as AbilityTuple<"Read", "City">; + + /** + * Use for `useGetCityLabelById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCityLabelById` query + */ + export const canUseGetCityLabelById = () => ["Read", "City"] as AbilityTuple<"Read", "City">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "City"] as AbilityTuple<"Read", "City">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "City"] as AbilityTuple<"Update", "City">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "City"] as AbilityTuple<"Archive", "City">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "City"] as AbilityTuple<"Archive", "City">; +} diff --git a/test/generated/dist/cities/cities.api.ts b/test/generated/dist/cities/cities.api.ts new file mode 100644 index 0000000..63d76eb --- /dev/null +++ b/test/generated/dist/cities/cities.api.ts @@ -0,0 +1,106 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CitiesModels } from "./cities.models"; + +export namespace CitiesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: CitiesModels.CityPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CitiesModels.CitiesPaginateResponseSchema }, `/cities`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: CitiesModels.CreateCityRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities`, + ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), + config, + ); + }; + export const listCityLabels = ( + limit: number, + order?: string, + filter?: CitiesModels.CityLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CitiesModels.ListCityLabelsResponseSchema }, `/cities/paginate/labels`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const getCityLabelById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: CitiesModels.CityLabelResponseDTOSchema }, `/cities/${id}/labels`, config); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: CitiesModels.CityResponseDTOSchema }, `/cities/${id}`, config); + }; + export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities/${id}`, + ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/cities/${id}/archive`, undefined, config); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/cities/${id}/unarchive`, undefined, config); + }; +} diff --git a/test/generated/dist/cities/cities.configs.ts b/test/generated/dist/cities/cities.configs.ts new file mode 100644 index 0000000..5498521 --- /dev/null +++ b/test/generated/dist/cities/cities.configs.ts @@ -0,0 +1,123 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CitiesModels } from "./cities.models"; +import { CitiesQueries } from "./cities.queries"; +import { CitiesAcl } from "./cities.acl"; + +export namespace CitiesConfigs { + export const citiesConfig = { + meta: { + title: "Cities", + }, + readAll: { + acl: CitiesAcl.canUsePaginate, + schema: CitiesModels.CityResponseDTOSchema, + paginated: CitiesQueries.usePaginate, + infinite: CitiesQueries.usePaginateInfinite, + filters: { + schema: CitiesModels.CityPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CitiesModels.CityPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CitiesModels.CityResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + isoCode: true, + stateCode: true, + archived: true, + countryId: true, + country: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CitiesModels.CitiesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: CitiesAcl.canUseFindById, + schema: CitiesModels.CityResponseDTOSchema, + query: CitiesQueries.useFindById, + }, + create: { + acl: CitiesAcl.canUseCreate, + schema: CitiesModels.CreateCityRequestDTOSchema, + mutation: CitiesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CitiesModels.CreateCityRequestDTOSchema, + options: { + inputs: { + name: true, + isoCode: true, + stateCode: true, + countryId: true, + }, + }, + }), + }, + update: { + acl: CitiesAcl.canUseUpdate, + schema: CitiesModels.UpdateCityRequestDTOSchema, + mutation: CitiesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CitiesModels.UpdateCityRequestDTOSchema, + options: { + inputs: { + name: true, + isoCode: true, + stateCode: true, + countryId: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: CitiesAcl.canUseListCityLabels, + schema: CitiesModels.CityLabelResponseDTOSchema, + paginated: CitiesQueries.useListCityLabels, + infinite: CitiesQueries.useListCityLabelsInfinite, + filters: { + schema: CitiesModels.CityLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CitiesModels.CityLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CitiesModels.CityLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + country: true, + }, + sortable: CitiesModels.ListCityLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/cities/cities.models.ts b/test/generated/dist/cities/cities.models.ts new file mode 100644 index 0000000..6fc2ac8 --- /dev/null +++ b/test/generated/dist/cities/cities.models.ts @@ -0,0 +1,203 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CitiesModels { + /** + * CityCountryDtoSchema + * @type { object } + * @property { string } id Unique identifier of the country + * @property { string } name Name of the country + * @property { string } isoCode2 2 character iso code of the country + * @property { string } isoCode3 3 character iso code of the country + */ + export const CityCountryDtoSchema = z + .object({ + id: z.string().describe("Unique identifier of the country"), + name: z.string().describe("Name of the country"), + isoCode2: z.string().describe("2 character iso code of the country"), + isoCode3: z.string().describe("3 character iso code of the country"), + }) + .readonly(); + export type CityCountryDto = z.infer; + + /** + * CityEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CityEmployeeDTO = z.infer; + + /** + * CityResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the city + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { boolean } archived Whether the city is archived + * @property { string } countryId Country ID + * @property { CityCountryDto } country + * @property { string } createdById + * @property { CityEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CityEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const CityResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the city"), + name: z.string().describe("Name of the city"), + isoCode: z.string().describe("ISO code of the city").nullish(), + stateCode: z.string().describe("State code of the city").nullish(), + archived: z.boolean().describe("Whether the city is archived").nullish(), + countryId: z.string().describe("Country ID").nullish(), + country: CityCountryDtoSchema.nullish(), + createdById: z.string().nullish(), + createdBy: CityEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: CityEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type CityResponseDTO = z.infer; + + /** + * CityLabelCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CityLabelCountryDto = z.infer; + + /** + * CityLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { CityLabelCountryDto } country + */ + export const CityLabelResponseDTOSchema = z + .object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }) + .readonly(); + export type CityLabelResponseDTO = z.infer; + + /** + * CityPaginationFilterDtoSchema + * @type { object } + * @property { string } search Free search + * @property { boolean } archived + */ + export const CityPaginationFilterDtoSchema = z + .object({ search: z.string().describe("Free search"), archived: z.boolean() }) + .readonly(); + export type CityPaginationFilterDto = z.infer; + + /** + * CityLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const CityLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type CityLabelFilterDto = z.infer; + + /** + * CreateCityRequestDTOSchema + * @type { object } + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { string } countryId Country ID + */ + export const CreateCityRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the city"), + isoCode: z.string().describe("ISO code of the city").nullish(), + stateCode: z.string().describe("State code of the city").nullish(), + countryId: z.string().describe("Country ID"), + }) + .readonly(); + export type CreateCityRequestDTO = z.infer; + + /** + * UpdateCityRequestDTOSchema + * @type { object } + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { string } countryId Country ID + */ + export const UpdateCityRequestDTOSchema = z + .object({ + name: z.string().describe("Name of the city"), + isoCode: z.string().describe("ISO code of the city"), + stateCode: z.string().describe("State code of the city"), + countryId: z.string().describe("Country ID"), + }) + .readonly(); + export type UpdateCityRequestDTO = z.infer; + + /** + * CitiesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const CitiesPaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type CitiesPaginateOrderParamEnum = z.infer; + export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.enum; + + /** + * CitiesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CityResponseDTO[] } items + */ + export const CitiesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CityResponseDTOSchema).readonly() }).readonly().shape, + }); + export type CitiesPaginateResponse = z.infer; + + /** + * ListCityLabelsOrderParamEnumSchema + * @type { enum } + */ + export const ListCityLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ListCityLabelsOrderParamEnum = z.infer; + export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.enum; + + /** + * ListCityLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CityLabelResponseDTO[] } items + */ + export const ListCityLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CityLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ListCityLabelsResponse = z.infer; +} diff --git a/test/generated/dist/cities/cities.queries.ts b/test/generated/dist/cities/cities.queries.ts new file mode 100644 index 0000000..1ea1e83 --- /dev/null +++ b/test/generated/dist/cities/cities.queries.ts @@ -0,0 +1,370 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CitiesAcl } from "./cities.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CitiesModels } from "./cities.models"; +import { CitiesApi } from "./cities.api"; + +export namespace CitiesQueries { + export const moduleName = QueryModule.Cities; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: CitiesModels.CityPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/cities", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: CitiesModels.CityPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/cities", "infinite", limit, order, filter, cursor] as const, + listCityLabels: ( + limit?: number, + order?: string, + filter?: CitiesModels.CityLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/cities/paginate/labels", limit, order, filter, page, cursor] as const, + listCityLabelsInfinite: ( + limit?: number, + order?: string, + filter?: CitiesModels.CityLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/cities/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getCityLabelById: (id: string) => [...keys.all, "/cities/:id/labels", id] as const, + findById: (id: string) => [...keys.all, "/cities/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Cities + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: CitiesModels.CityPaginationFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CitiesAcl.canUsePaginate()); + return CitiesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Cities + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CitiesModels.CityPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CitiesAcl.canUsePaginate()); + return CitiesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create city + * @permission Requires `canUseCreate` ability + * @param { CitiesModels.CreateCityRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CitiesAcl.canUseCreate()); + return CitiesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListCityLabels` + * @summary Paginate cities with only their labels (id and name) and country information + * @permission Requires `canUseListCityLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListCityLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: CitiesModels.CityLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCityLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CitiesAcl.canUseListCityLabels()); + return CitiesApi.listCityLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListCityLabelsInfinite + * @summary Paginate cities with only their labels (id and name) and country information + * @permission Requires `canUseListCityLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListCityLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CitiesModels.CityLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CitiesAcl.canUseListCityLabels()); + return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetCityLabelById` + * @summary Get city by ID with label format (id and formatted name) and country information + * @permission Requires `canUseGetCityLabelById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCityLabelById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCityLabelById(id), + queryFn: () => { + checkAcl(CitiesAcl.canUseGetCityLabelById()); + return CitiesApi.getCityLabelById(id, config); + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get city by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(CitiesAcl.canUseFindById()); + return CitiesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update city + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { CitiesModels.UpdateCityRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(CitiesAcl.canUseUpdate()); + return CitiesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive city + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CitiesAcl.canUseArchive()); + return CitiesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive city + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CitiesAcl.canUseUnarchive()); + return CitiesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/common/common.models.ts b/test/generated/dist/common/common.models.ts new file mode 100644 index 0000000..42415c1 --- /dev/null +++ b/test/generated/dist/common/common.models.ts @@ -0,0 +1,1860 @@ +import { z } from "zod"; + +export namespace CommonModels { +/** + * PositionCargoPackageEnumSchema + * @type { enum } + */ +export const PositionCargoPackageEnumSchema = z.enum(["Hazardous", "NonStackable", "TemperatureControlled", "OversizedCargo", "DiplomaticCargo"]); +export type PositionCargoPackageEnum = z.infer; +export const PositionCargoPackageEnum = PositionCargoPackageEnumSchema.enum; + +/** + * HazardousSpecialtyEnumSchema + * @type { enum } + */ +export const HazardousSpecialtyEnumSchema = z.enum(["Explosives", "FlammableGas", "NonToxicAndFlammableGas", "PoisonGases", "FlammableLiquid", "FlammableSolid", "SpontaneouslyCombustible", "DangerousWhenWet", "Oxidizers", "OrganicPeroxides", "Poison", "InfectiousSubstances", "Radioactive", "Corrosive", "MiscellaneousDangerousSubstances"]); +export type HazardousSpecialtyEnum = z.infer; +export const HazardousSpecialtyEnum = HazardousSpecialtyEnumSchema.enum; + +/** + * RateOptionsEnumSchema + * @type { enum } + */ +export const RateOptionsEnumSchema = z.enum(["AsAgreed", "SpotRate"]); +export type RateOptionsEnum = z.infer; +export const RateOptionsEnum = RateOptionsEnumSchema.enum; + +/** + * RateClassEnumSchema + * @type { enum } + */ +export const RateClassEnumSchema = z.enum(["MinimumCharge", "NormalRate", "QuantityRate"]); +export type RateClassEnum = z.infer; +export const RateClassEnum = RateClassEnumSchema.enum; + +/** + * AccountInformationEnumSchema + * @type { enum } + * @description Account information + */ +export const AccountInformationEnumSchema = z.enum(["FreightCollect", "FreightPrepaid"]); +export type AccountInformationEnum = z.infer; +export const AccountInformationEnum = AccountInformationEnumSchema.enum; + +/** + * LanguageEnumSchema + * @type { enum } + */ +export const LanguageEnumSchema = z.enum(["English", "German", "Hungarian", "Czech", "Turkish", "Slovenian"]); +export type LanguageEnum = z.infer; +export const LanguageEnum = LanguageEnumSchema.enum; + +/** + * LocaleEnumSchema + * @type { enum } + */ +export const LocaleEnumSchema = z.enum(["en-US", "de-DE", "cs-CZ", "sl-SI", "tr-TR", "hu-HU"]); +export type LocaleEnum = z.infer; +export const LocaleEnum = LocaleEnumSchema.enum; + +/** + * OfficePaymentTermsDateTypeSchema + * @type { enum } + */ +export const OfficePaymentTermsDateTypeSchema = z.enum(["InvoiceDate", "ServiceDate"]); +export type OfficePaymentTermsDateType = z.infer; +export const OfficePaymentTermsDateType = OfficePaymentTermsDateTypeSchema.enum; + +/** + * FolderEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type FolderEmployeeDTO = z.infer; + +/** + * FileResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } archived + * @property { boolean } isSystem + * @property { string } createdAt + * @property { string } updatedAt + * @property { FolderEmployeeDTO } createdBy + * @property { FolderEmployeeDTO } updatedBy + * @property { string } downloadUrl + */ +export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }).readonly(); +export type FileResponseDTO = z.infer; + +/** + * EditorContentUpdateDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const EditorContentUpdateDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export type EditorContentUpdateDto = z.infer; + +/** + * RemarkBlockDTOSchema + * @type { object } + * @property { string } id + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { EditorContentUpdateDto } content + */ +export const RemarkBlockDTOSchema = z.object({ id: z.string(), enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), content: CommonModels.EditorContentUpdateDtoSchema }).readonly(); +export type RemarkBlockDTO = z.infer; + +/** + * TitleBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { string } defaultTitle + * @property { boolean } includePositionNumber + * @property { boolean } allowManualOverride + */ +export const TitleBlockDTOSchema = z.object({ enabled: z.boolean(), defaultTitle: z.string(), includePositionNumber: z.boolean(), allowManualOverride: z.boolean() }).readonly(); +export type TitleBlockDTO = z.infer; + +/** + * PositionInvolvedPartyTypeEnumSchema + * @type { enum } + */ +export const PositionInvolvedPartyTypeEnumSchema = z.enum(["Customer", "Notify", "AlsoNotify", "FOBForwarder", "RoutingAgent", "DeliveryAgent", "TransportProvider", "OceanCarrier", "OriginServiceProvider", "DestinationServiceProvider", "InsuranceProvider", "OriginCustomsAgent", "DestinationCustomsAgent", "StuffingProvider", "StrippingProvider", "Shipper", "Consignee", "CustomsBroker", "Courier", "Trucker", "Airline", "DestinationAgent", "OriginAgent"]); +export type PositionInvolvedPartyTypeEnum = z.infer; +export const PositionInvolvedPartyTypeEnum = PositionInvolvedPartyTypeEnumSchema.enum; + +/** + * ReceiverBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { string } defaultRole + */ +export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema }).readonly(); +export type ReceiverBlockDTO = z.infer; + +/** + * OurInformationBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } showName + * @property { boolean } showPhone + * @property { boolean } showDate + * @property { boolean } showBookingNumber + * @property { boolean } showCustomerReference + * @property { boolean } showMasterBillOfLadingNumber + * @property { boolean } showHouseBillOfLadingNumber + */ +export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean(), showName: z.boolean(), showPhone: z.boolean(), showDate: z.boolean(), showBookingNumber: z.boolean(), showCustomerReference: z.boolean(), showMasterBillOfLadingNumber: z.boolean(), showHouseBillOfLadingNumber: z.boolean() }).readonly(); +export type OurInformationBlockDTO = z.infer; + +/** + * RouteTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } showDate + * @property { boolean } showLocation + * @property { boolean } showType + * @property { boolean } showReference + * @property { boolean } showVesselVoyage + * @property { boolean } showAddress + * @property { boolean } showProvider + */ +export const RouteTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showDate: z.boolean(), showLocation: z.boolean(), showType: z.boolean(), showReference: z.boolean(), showVesselVoyage: z.boolean(), showAddress: z.boolean(), showProvider: z.boolean() }).readonly(); +export type RouteTableBlockDTO = z.infer; + +/** + * CargoTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + */ +export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export type CargoTableBlockDTO = z.infer; + +/** + * CargoSummaryBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + */ +export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export type CargoSummaryBlockDTO = z.infer; + +/** + * FinanceTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } showOnlyForReceiver + * @property { boolean } showVendor + * @property { boolean } showBuyRate + * @property { boolean } showCustomer + * @property { boolean } showSellRate + * @property { boolean } showGrid + * @property { boolean } showCharges + * @property { boolean } showAdditionalText + * @property { boolean } showQuantity + * @property { boolean } showProfit + * @property { boolean } showTotalsByCurrency + * @property { boolean } includeSubPositions + * @property { boolean } subPositionTotals + * @property { boolean } showBuyRateExchangeRates + * @property { boolean } showSellRateExchangeRates + * @property { boolean } showTotal + */ +export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showOnlyForReceiver: z.boolean(), showVendor: z.boolean(), showBuyRate: z.boolean(), showCustomer: z.boolean(), showSellRate: z.boolean(), showGrid: z.boolean(), showCharges: z.boolean(), showAdditionalText: z.boolean(), showQuantity: z.boolean(), showProfit: z.boolean(), showTotalsByCurrency: z.boolean(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean(), showSellRateExchangeRates: z.boolean(), showTotal: z.boolean() }).readonly(); +export type FinanceTableBlockDTO = z.infer; + +/** + * FooterBlockDTOSchema + * @type { object } + * @property { boolean } enabled + */ +export const FooterBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export type FooterBlockDTO = z.infer; + +/** + * TermsBlockDTOSchema + * @type { object } + * @property { boolean } enabled + */ +export const TermsBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export type TermsBlockDTO = z.infer; + +/** + * CutOffDatesBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } billOfLadingFromCustomer + * @property { boolean } billOfLadingToCarrier + * @property { boolean } customsAMS + * @property { boolean } vgmCustomer + */ +export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), billOfLadingFromCustomer: z.boolean(), billOfLadingToCarrier: z.boolean(), customsAMS: z.boolean(), vgmCustomer: z.boolean() }).readonly(); +export type CutOffDatesBlockDTO = z.infer; + +/** + * TemplateBlocksResponseDTOSchema + * @type { object } + * @property { TitleBlockDTO } titleBlock + * @property { ReceiverBlockDTO } receiverBlock + * @property { OurInformationBlockDTO } ourInformationBlock + * @property { RouteTableBlockDTO } routeTableBlock + * @property { CargoTableBlockDTO } cargoTableBlock + * @property { CargoSummaryBlockDTO } cargoSummaryBlock + * @property { FinanceTableBlockDTO } financeTableBlock + * @property { RemarkBlockDTO[] } remarkBlocks + * @property { FooterBlockDTO } footerBlock + * @property { TermsBlockDTO } termsBlock + * @property { CutOffDatesBlockDTO } cutOffDatesBlock + */ +export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); +export type TemplateBlocksResponseDTO = z.infer; + +/** + * RouteTableProviderDtoSchema + * @type { object } + * @property { string } id Provider ID + * @property { string } name Provider name + */ +export const RouteTableProviderDtoSchema = z.object({ id: z.string().describe("Provider ID"), name: z.string().describe("Provider name") }).readonly(); +export type RouteTableProviderDto = z.infer; + +/** + * RouteTablePointDtoSchema + * @type { object } + * @property { string } id Route point ID + * @property { string } type Route point type + * @property { string } datetime Route point datetime + * @property { string } secondaryDatetime Route point secondary datetime + * @property { string } address Route point address + * @property { string } name Route point address name + * @property { string } reference Route point reference + * @property { RouteTableProviderDto } provider Route point provider + * @property { string } vessel Vessel information + * @property { string } voyage Voyage information + * @property { string } carrier Carrier name + */ +export const RouteTablePointDtoSchema = z.object({ id: z.string().describe("Route point ID"), type: z.string().describe("Route point type"), datetime: z.string().describe("Route point datetime").nullish(), secondaryDatetime: z.string().describe("Route point secondary datetime").nullish(), address: z.string().describe("Route point address").nullish(), name: z.string().describe("Route point address name").nullish(), reference: z.string().describe("Route point reference").nullish(), provider: CommonModels.RouteTableProviderDtoSchema.describe("Route point provider").nullish(), vessel: z.string().describe("Vessel information").nullish(), voyage: z.string().describe("Voyage information").nullish(), carrier: z.string().describe("Carrier name").nullish() }).readonly(); +export type RouteTablePointDto = z.infer; + +/** + * RouteTableBlockResponseDtoSchema + * @type { object } + * @property { string } selectedRouteId Selected route ID + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { boolean } showReference Show reference column + * @property { boolean } showVesselVoyage Show vessel/voyage column + * @property { boolean } showProvider Show provider column + * @property { RouteTablePointDto[] } points Route points + * @property { boolean } showAddress Show address + * @property { boolean } showDates Show dates + * @property { boolean } showType Show type + * @property { boolean } showLocation Show location + * @property { boolean } showGrid Show grid + * @property { boolean } suppressRoute Suppress route + */ +export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID").nullish(), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish(), showAddress: z.boolean().describe("Show address").nullish(), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); +export type RouteTableBlockResponseDto = z.infer; + +/** + * CargoSpecialtyDtoSchema + * @type { object } + * @property { string } name + * @property { string } unNumber UN number for hazardous specialty + * @property { string } IMOClass IMO class for hazardous specialty + * @property { number } temperatureFrom Temperature from (°C) for temperature-controlled specialty + * @property { number } temperatureUntil Temperature until (°C) for temperature-controlled specialty + */ +export const CargoSpecialtyDtoSchema = z.object({ name: CommonModels.PositionCargoPackageEnumSchema, unNumber: z.string().describe("UN number for hazardous specialty").nullish(), IMOClass: z.string().describe("IMO class for hazardous specialty").nullish(), temperatureFrom: z.number().describe("Temperature from (°C) for temperature-controlled specialty").nullish(), temperatureUntil: z.number().describe("Temperature until (°C) for temperature-controlled specialty").nullish() }).readonly(); +export type CargoSpecialtyDto = z.infer; + +/** + * CargoPackageDtoSchema + * @type { object } + * @property { string } id Package ID + * @property { string } description Package description + * @property { string } weight Weight + * @property { string } hsCodes HS codes (numeric only) + * @property { number } quantity Quantity + * @property { number } width Width (cm) + * @property { number } length Length (cm) + * @property { number } height Height (cm) + * @property { number } volume Total volume in m3 for this package group + * @property { string } packageType Package type name + * @property { string } caseMarks Case marks + * @property { CargoSpecialtyDto[] } specialties Package specialties + * @property { number } chargeableWeight Chargeable weight in kg + * @property { number } volumetricWeight Volumetric weight in kg + */ +export const CargoPackageDtoSchema = z.object({ id: z.string().describe("Package ID"), description: z.string().describe("Package description").nullish(), weight: z.string().describe("Weight").nullish(), hsCodes: z.string().describe("HS codes (numeric only)").nullish(), quantity: z.number().describe("Quantity").nullish(), width: z.number().describe("Width (cm)").nullish(), length: z.number().describe("Length (cm)").nullish(), height: z.number().describe("Height (cm)").nullish(), volume: z.number().describe("Total volume in m3 for this package group").nullish(), packageType: z.string().describe("Package type name").nullish(), caseMarks: z.string().describe("Case marks").nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).readonly().describe("Package specialties").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg").nullish() }).readonly(); +export type CargoPackageDto = z.infer; + +/** + * CargoItemRouteDtoSchema + * @type { object } + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { RouteTablePointDto[] } points Route points + */ +export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish() }).readonly(); +export type CargoItemRouteDto = z.infer; + +/** + * CargoItemDtoSchema + * @type { object } + * @property { string } cargoId Cargo ID + * @property { string } cargoType Cargo type + * @property { string } containerNumber Container number + * @property { string } seal1 First seal (sea cargo only) + * @property { string } seal2 Second seal (sea cargo only) + * @property { string } vgm Verified gross mass (VGM) for container, sea cargo only + * @property { number } totalGrossWeight Total gross weight from cargo details + * @property { number } totalVolume Total volume (m3) calculated from cargo packages + * @property { number } chargeableWeight Chargeable weight in kg for transport unit + * @property { number } volumetricWeight Volumetric weight in kg for transport unit + * @property { CargoPackageDto[] } packages Cargo packages + * @property { string[] } selectedPackageIds Selected cargo package IDs + * @property { CargoItemRouteDto } route Cargo route (when routes are split) + */ +export const CargoItemDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID"), cargoType: z.string().describe("Cargo type"), containerNumber: z.string().describe("Container number").nullish(), seal1: z.string().describe("First seal (sea cargo only)").nullish(), seal2: z.string().describe("Second seal (sea cargo only)").nullish(), vgm: z.string().describe("Verified gross mass (VGM) for container, sea cargo only").nullish(), totalGrossWeight: z.number().describe("Total gross weight from cargo details").nullish(), totalVolume: z.number().describe("Total volume (m3) calculated from cargo packages").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg for transport unit").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg for transport unit").nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema).readonly().describe("Cargo packages"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteDtoSchema.describe("Cargo route (when routes are split)").nullish() }).readonly(); +export type CargoItemDto = z.infer; + +/** + * CargoTableBlockDtoSchema + * @type { object } + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { boolean } suppressWeight Suppress weight column display + * @property { boolean } showGrid Show grid borders in cargo table + * @property { boolean } suppressVolume Suppress volume column display + * @property { boolean } suppressSpecialities Suppress specialities column display + * @property { boolean } suppressDimensions Suppress dimensions column display + * @property { boolean } suppressPackageVolume Suppress package volume column display + * @property { boolean } suppressPackageWeight Suppress package weight column display + * @property { boolean } showGrandTotal Show grand total + * @property { boolean } showTransportUnitTotal Show transport unit total + * @property { boolean } showRoute Show route information (only applicable when routes are split) + * @property { boolean } suppressCargo Suppress cargo table display + * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units + * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units + * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages + * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages + * @property { boolean } showPackageHSCodes Show HS codes for packages + * @property { boolean } showPackageType Show package type for packages + * @property { boolean } showPackageQuantity Show quantity for packages + * @property { boolean } showPackageDescription Show description for packages + * @property { boolean } showPackageCaseMarks Show case marks for packages + * @property { boolean } showTransportUnitNumber Show transport unit number + * @property { boolean } showTransportUnitType Show transport unit type + * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 + * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 + * @property { CargoItemDto[] } items Cargo items + */ +export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs").nullish(), suppressWeight: z.boolean().describe("Suppress weight column display").nullish(), showGrid: z.boolean().describe("Show grid borders in cargo table").nullish(), suppressVolume: z.boolean().describe("Suppress volume column display").nullish(), suppressSpecialities: z.boolean().describe("Suppress specialities column display").nullish(), suppressDimensions: z.boolean().describe("Suppress dimensions column display").nullish(), suppressPackageVolume: z.boolean().describe("Suppress package volume column display").nullish(), suppressPackageWeight: z.boolean().describe("Suppress package weight column display").nullish(), showGrandTotal: z.boolean().describe("Show grand total").nullish(), showTransportUnitTotal: z.boolean().describe("Show transport unit total").nullish(), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullish(), suppressCargo: z.boolean().describe("Suppress cargo table display").nullish(), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units").nullish(), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units").nullish(), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages").nullish(), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages").nullish(), showPackageHSCodes: z.boolean().describe("Show HS codes for packages").nullish(), showPackageType: z.boolean().describe("Show package type for packages").nullish(), showPackageQuantity: z.boolean().describe("Show quantity for packages").nullish(), showPackageDescription: z.boolean().describe("Show description for packages").nullish(), showPackageCaseMarks: z.boolean().describe("Show case marks for packages").nullish(), showTransportUnitNumber: z.boolean().describe("Show transport unit number").nullish(), showTransportUnitType: z.boolean().describe("Show transport unit type").nullish(), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1").nullish(), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2").nullish(), items: z.array(CommonModels.CargoItemDtoSchema).readonly().describe("Cargo items") }).readonly(); +export type CargoTableBlockDto = z.infer; + +/** + * SummaryCargoItemDtoSchema + * @type { object } + * @property { string } transportUnitType Cargo type name (transport unit type) + * @property { number } quantity Count of cargos for this type + * @property { string } description Comma-joined transport unit numbers or custom description + */ +export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), quantity: z.number().describe("Count of cargos for this type"), description: z.string().describe("Comma-joined transport unit numbers or custom description") }).readonly(); +export type SummaryCargoItemDto = z.infer; + +/** + * SummaryCargoBlockResponseDtoSchema + * @type { object } + * @property { SummaryCargoItemDto[] } items + */ +export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema).readonly() }).readonly(); +export type SummaryCargoBlockResponseDto = z.infer; + +/** + * PositionAccountItemTypeEnumSchema + * @type { enum } + */ +export const PositionAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); +export type PositionAccountItemTypeEnum = z.infer; +export const PositionAccountItemTypeEnum = PositionAccountItemTypeEnumSchema.enum; + +/** + * FinanceRowDtoSchema + * @type { object } + * @property { string } id Finance row ID + * @property { PositionAccountItemTypeEnum } type Item type + * @property { string } chargeType Charge type + * @property { string } additionalText Additional text + * @property { string } text Text content + * @property { number } buyAmount Buy amount + * @property { string } buyCurrencyNotation Buy currency notation + * @property { number } sellAmount Sell amount + * @property { string } sellCurrencyNotation Sell currency notation + * @property { string } buyBPName Buy business partner name + * @property { string } sellBPName Sell business partner name + * @property { number } sellExchangeRate Sell exchange rate + * @property { number } buyExchangeRate Buy exchange rate + * @property { number } quantity Quantity + */ +export const FinanceRowDtoSchema = z.object({ id: z.string().describe("Finance row ID"), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), chargeType: z.string().describe("Charge type").nullish(), additionalText: z.string().describe("Additional text").nullish(), text: z.string().describe("Text content").nullish(), buyAmount: z.number().describe("Buy amount").nullish(), buyCurrencyNotation: z.string().describe("Buy currency notation").nullish(), sellAmount: z.number().describe("Sell amount").nullish(), sellCurrencyNotation: z.string().describe("Sell currency notation").nullish(), buyBPName: z.string().describe("Buy business partner name").nullish(), sellBPName: z.string().describe("Sell business partner name").nullish(), sellExchangeRate: z.number().describe("Sell exchange rate").nullish(), buyExchangeRate: z.number().describe("Buy exchange rate").nullish(), quantity: z.number().describe("Quantity").nullish() }).readonly(); +export type FinanceRowDto = z.infer; + +/** + * FinanceTotalsDtoSchema + * @type { object } + * @property { number } customerTotal Customer total + * @property { number } vendorTotal Vendor total + * @property { number } combinedTotal Combined total + * @property { string } currencyNotation Currency notation + */ +export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().describe("Customer total"), vendorTotal: z.number().describe("Vendor total"), combinedTotal: z.number().describe("Combined total"), currencyNotation: z.string().describe("Currency notation") }).readonly(); +export type FinanceTotalsDto = z.infer; + +/** + * FinanceTotalsByCurrencyDtoSchema + * @type { object } + * @property { string } currencyNotation Currency notation + * @property { number } vendorTotal Total for vendor side in this currency + * @property { number } customerTotal Total for customer side in this currency + */ +export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string().describe("Currency notation"), vendorTotal: z.number().describe("Total for vendor side in this currency").nullish(), customerTotal: z.number().describe("Total for customer side in this currency").nullish() }).readonly(); +export type FinanceTotalsByCurrencyDto = z.infer; + +/** + * FinanceTablePositionDtoSchema + * @type { object } + * @property { FinanceRowDto[] } rows Finance rows + * @property { FinanceTotalsDto } totals Finance totals + * @property { string[] } selectedFinanceRowIds Selected finance row IDs + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency + */ +export const FinanceTablePositionDtoSchema = z.object({ rows: z.array(CommonModels.FinanceRowDtoSchema).readonly().describe("Finance rows"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); +export type FinanceTablePositionDto = z.infer; + +/** + * FinanceTableBlockDtoSchema + * @type { object } + * @property { string } selectedBpId Selected business partner ID + * @property { boolean } showVendor Show vendor + * @property { boolean } showBuyRate Show buy rate + * @property { boolean } showCustomer Show customer + * @property { boolean } showSellRate Show sell rate + * @property { boolean } showGrid Show grid + * @property { boolean } showCharges Show charges + * @property { boolean } showAdditionalText Show additional text + * @property { boolean } showQuantity Show quantity + * @property { boolean } showTotalsByCurrency Show totals grouped by currency + * @property { boolean } suppressFinances Suppress finances from output + * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero + * @property { boolean } showTotal Show total from output + * @property { boolean } showProfit Show profit from output + * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output + * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output + * @property { boolean } includeSubPositions Include sub-positions + * @property { boolean } subPositionTotals Show sub-position totals + * @property { FinanceTablePositionDto[] } positions Finance positions + * @property { FinanceTotalsDto } totals Finance totals + * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency + */ +export const FinanceTableBlockDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionDtoSchema).readonly().describe("Finance positions"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); +export type FinanceTableBlockDto = z.infer; + +/** + * RemarkBlockDtoSchema + * @type { object } + * @property { string } id + * @property { number } position Minimum: `1` + * @property { EditorContentUpdateDto } content + * @property { boolean } enabled + */ +export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }).readonly(); +export type RemarkBlockDto = z.infer; + +/** + * ConfigBlockDtoSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + * @property { boolean } showWatermarkOnDocuments Show watermark on documents + * @property { LocaleEnum } locale + */ +export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), showWatermarkOnDocuments: z.boolean().describe("Show watermark on documents"), locale: CommonModels.LocaleEnumSchema }).readonly(); +export type ConfigBlockDto = z.infer; + +/** + * TitleBlockUpdateDtoSchema + * @type { object } + * @property { string } value Title value + */ +export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().describe("Title value") }).readonly(); +export type TitleBlockUpdateDto = z.infer; + +/** + * ReceiverBlockUpdateDtoSchema + * @type { object } + * @property { string } selectedBpId Receiver business partner ID + * @property { string } address Receiver address + */ +export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Receiver business partner ID"), address: z.string().describe("Receiver address") }).readonly(); +export type ReceiverBlockUpdateDto = z.infer; + +/** + * OurInformationBlockUpdateDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } phone Phone number + * @property { string } date Date + * @property { string } bookingNumber Booking number + * @property { string } customerReference Customer reference + * @property { string } masterBillOfLadingNumber Master bill of lading number + * @property { string } houseBillOfLadingNumber House bill of lading number + * @property { string } positionNumber Position number + */ +export const OurInformationBlockUpdateDtoSchema = z.object({ name: z.string().describe("Name"), phone: z.string().describe("Phone number"), date: z.string().describe("Date"), bookingNumber: z.string().describe("Booking number"), customerReference: z.string().describe("Customer reference"), masterBillOfLadingNumber: z.string().describe("Master bill of lading number"), houseBillOfLadingNumber: z.string().describe("House bill of lading number"), positionNumber: z.string().describe("Position number") }).readonly(); +export type OurInformationBlockUpdateDto = z.infer; + +/** + * TermsBlockDtoSchema + * @type { object } + * @property { string } termsImageUrl Terms image URL + */ +export const TermsBlockDtoSchema = z.object({ termsImageUrl: z.string().describe("Terms image URL") }).readonly(); +export type TermsBlockDto = z.infer; + +/** + * CutOffDatesBlockUpdateDtoSchema + * @type { object } + * @property { string } billOfLadingFromCustomer Bill of lading from customer date + * @property { string } billOfLadingToCarrier Bill of lading to carrier date + * @property { string } customsAMS Customs AMS date + * @property { string } vgmCustomer VGM customer date + */ +export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().describe("Bill of lading from customer date"), billOfLadingToCarrier: z.string().describe("Bill of lading to carrier date"), customsAMS: z.string().describe("Customs AMS date"), vgmCustomer: z.string().describe("VGM customer date") }).readonly(); +export type CutOffDatesBlockUpdateDto = z.infer; + +/** + * TemplatedDocumentDataDtoSchema + * @type { object } + * @property { TitleBlockUpdateDto } title Title block data + * @property { ReceiverBlockUpdateDto } receiver Receiver block data + * @property { OurInformationBlockUpdateDto } ourInformation Our information block data + * @property { RouteTableBlockResponseDto } routeTable Route table block data + * @property { CargoTableBlockDto } cargoTable Cargo table block data + * @property { SummaryCargoBlockResponseDto } summaryCargo Summary cargo block data + * @property { FinanceTableBlockDto } financeTable Finance table block data + * @property { RemarkBlockDto[] } remarks Remark blocks + * @property { TermsBlockDto } terms Terms block data + * @property { ConfigBlockDto } config Config block data + * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data + */ +export const TemplatedDocumentDataDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableBlockResponseDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockResponseDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockDtoSchema).readonly().describe("Remark blocks"), terms: CommonModels.TermsBlockDtoSchema.describe("Terms block data"), config: CommonModels.ConfigBlockDtoSchema.describe("Config block data"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); +export type TemplatedDocumentDataDto = z.infer; + +/** + * RouteTableUpdateBlockDtoSchema + * @type { object } + * @property { string } selectedRouteId Selected route ID + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { boolean } showReference Show reference column + * @property { boolean } showVesselVoyage Show vessel/voyage column + * @property { boolean } showProvider Show provider column + * @property { RouteTablePointDto[] } points Route points + * @property { boolean } showAddress Show address + * @property { boolean } showDates Show dates + * @property { boolean } showType Show type + * @property { boolean } showLocation Show location + * @property { boolean } showGrid Show grid + * @property { boolean } suppressRoute Suppress route + */ +export const RouteTableUpdateBlockDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID"), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points"), showAddress: z.boolean().describe("Show address"), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); +export type RouteTableUpdateBlockDto = z.infer; + +/** + * CargoItemRouteUpdateDtoSchema + * @type { object } + * @property { string[] } selectedRoutePointIds Selected route point IDs + */ +export const CargoItemRouteUpdateDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs") }).readonly(); +export type CargoItemRouteUpdateDto = z.infer; + +/** + * CargoItemUpdateDtoSchema + * @type { object } + * @property { string } cargoId Cargo ID to update packages for + * @property { string[] } selectedPackageIds Selected cargo package IDs + * @property { CargoItemRouteUpdateDto } route Cargo route (when routes are split) + */ +export const CargoItemUpdateDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID to update packages for"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteUpdateDtoSchema.describe("Cargo route (when routes are split)") }).readonly(); +export type CargoItemUpdateDto = z.infer; + +/** + * CargoTableBlockUpdateDtoSchema + * @type { object } + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { CargoItemUpdateDto[] } items Cargo items for package updates + * @property { boolean } suppressWeight Suppress weight column display + * @property { boolean } showGrid Show grid borders in cargo table + * @property { boolean } suppressVolume Suppress volume column display + * @property { boolean } suppressSpecialities Suppress specialities column display + * @property { boolean } suppressDimensions Suppress dimensions column display + * @property { boolean } suppressPackageVolume Suppress package volume column display + * @property { boolean } suppressPackageWeight Suppress package weight column display + * @property { boolean } showRoute Show route information (only applicable when routes are split) + * @property { boolean } showGrandTotal Show grand total + * @property { boolean } showTransportUnitTotal Show transport unit total + * @property { boolean } suppressCargo Suppress cargo table display + * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units + * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units + * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages + * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages + * @property { boolean } showPackageHSCodes Show HS codes for packages + * @property { boolean } showPackageType Show package type for packages + * @property { boolean } showPackageQuantity Show quantity for packages + * @property { boolean } showPackageDescription Show description for packages + * @property { boolean } showPackageCaseMarks Show case marks for packages + * @property { boolean } showTransportUnitNumber Show transport unit number + * @property { boolean } showTransportUnitType Show transport unit type + * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 + * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 + */ +export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), items: z.array(CommonModels.CargoItemUpdateDtoSchema).readonly().describe("Cargo items for package updates"), suppressWeight: z.boolean().describe("Suppress weight column display"), showGrid: z.boolean().describe("Show grid borders in cargo table"), suppressVolume: z.boolean().describe("Suppress volume column display"), suppressSpecialities: z.boolean().describe("Suppress specialities column display"), suppressDimensions: z.boolean().describe("Suppress dimensions column display"), suppressPackageVolume: z.boolean().describe("Suppress package volume column display"), suppressPackageWeight: z.boolean().describe("Suppress package weight column display"), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullable(), showGrandTotal: z.boolean().describe("Show grand total"), showTransportUnitTotal: z.boolean().describe("Show transport unit total"), suppressCargo: z.boolean().describe("Suppress cargo table display"), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units"), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units"), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages"), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages"), showPackageHSCodes: z.boolean().describe("Show HS codes for packages"), showPackageType: z.boolean().describe("Show package type for packages"), showPackageQuantity: z.boolean().describe("Show quantity for packages"), showPackageDescription: z.boolean().describe("Show description for packages"), showPackageCaseMarks: z.boolean().describe("Show case marks for packages"), showTransportUnitNumber: z.boolean().describe("Show transport unit number"), showTransportUnitType: z.boolean().describe("Show transport unit type"), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1"), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2") }).readonly(); +export type CargoTableBlockUpdateDto = z.infer; + +/** + * SummaryCargoItemUpdateDtoSchema + * @type { object } + * @property { string } transportUnitType Cargo type name (transport unit type) + * @property { string } description Updated description for this cargo type + */ +export const SummaryCargoItemUpdateDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), description: z.string().describe("Updated description for this cargo type") }).readonly(); +export type SummaryCargoItemUpdateDto = z.infer; + +/** + * SummaryCargoBlockUpdateDtoSchema + * @type { object } + * @property { SummaryCargoItemUpdateDto[] } items + */ +export const SummaryCargoBlockUpdateDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemUpdateDtoSchema).readonly() }).readonly(); +export type SummaryCargoBlockUpdateDto = z.infer; + +/** + * FinanceTablePositionUpdateDtoSchema + * @type { object } + * @property { string[] } selectedFinanceRowIds Selected finance row IDs + * @property { string } positionId Position ID + */ +export const FinanceTablePositionUpdateDtoSchema = z.object({ selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID") }).readonly(); +export type FinanceTablePositionUpdateDto = z.infer; + +/** + * FinanceTableBlockUpdateDtoSchema + * @type { object } + * @property { string } selectedBpId Selected business partner ID + * @property { boolean } showVendor Show vendor + * @property { boolean } showBuyRate Show buy rate + * @property { boolean } showCustomer Show customer + * @property { boolean } showSellRate Show sell rate + * @property { boolean } showGrid Show grid + * @property { boolean } showCharges Show charges + * @property { boolean } showAdditionalText Show additional text + * @property { boolean } showQuantity Show quantity + * @property { boolean } showTotalsByCurrency Show totals grouped by currency + * @property { boolean } suppressFinances Suppress finances from output + * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero + * @property { boolean } showTotal Show total from output + * @property { boolean } showProfit Show profit from output + * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output + * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output + * @property { boolean } includeSubPositions Include sub-positions + * @property { boolean } subPositionTotals Show sub-position totals + * @property { FinanceTablePositionUpdateDto[] } positions Finance positions + */ +export const FinanceTableBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionUpdateDtoSchema).readonly().describe("Finance positions") }).readonly(); +export type FinanceTableBlockUpdateDto = z.infer; + +/** + * RemarkBlockUpdateDtoSchema + * @type { object } + * @property { string } id + * @property { number } position Minimum: `1` + * @property { EditorContentUpdateDto } content + * @property { boolean } enabled + */ +export const RemarkBlockUpdateDtoSchema = z.object({ id: z.string(), position: z.number().gte(1).nullish(), content: CommonModels.EditorContentUpdateDtoSchema.nullish(), enabled: z.boolean().nullish() }).readonly(); +export type RemarkBlockUpdateDto = z.infer; + +/** + * TemplatedDocumentDataUpdateDtoSchema + * @type { object } + * @property { TitleBlockUpdateDto } title Title block data + * @property { ReceiverBlockUpdateDto } receiver Receiver block data + * @property { OurInformationBlockUpdateDto } ourInformation Our information block data + * @property { RouteTableUpdateBlockDto } routeTable Route table block data + * @property { CargoTableBlockUpdateDto } cargoTable Cargo table block data + * @property { SummaryCargoBlockUpdateDto } summaryCargo Summary cargo block data + * @property { FinanceTableBlockUpdateDto } financeTable Finance table block data + * @property { RemarkBlockUpdateDto[] } remarks Remark blocks + * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data + */ +export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).readonly().describe("Remark blocks"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); +export type TemplatedDocumentDataUpdateDto = z.infer; + +/** + * BusinessPartnerTypeSchema + * @type { enum } + */ +export const BusinessPartnerTypeSchema = z.enum(["businessPartner", "destinationAgent", "oceanCarrier", "office", "customsAgent", "stuffingStrippingProvider", "shipper", "fobForwarder", "routingAgent", "transportProvider", "originServiceProvider", "insuranceProvider", "consignee", "courier", "trucker", "airline", "originAgent"]); +export type BusinessPartnerType = z.infer; +export const BusinessPartnerType = BusinessPartnerTypeSchema.enum; + +/** + * BusinessPartnerAddressCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type BusinessPartnerAddressCityDto = z.infer; + +/** + * BusinessPartnerAddressCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const BusinessPartnerAddressCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type BusinessPartnerAddressCountryDto = z.infer; + +/** + * BusinessPartnerAddressResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the address + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street information + * @property { string } zip ZIP/Postal code + * @property { BusinessPartnerAddressCityDto } city Country data + * @property { string } district District information + * @property { BusinessPartnerAddressCountryDto } country Country data + */ +export const BusinessPartnerAddressResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the address"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street information"), zip: z.string().describe("ZIP/Postal code"), city: CommonModels.BusinessPartnerAddressCityDtoSchema.describe("Country data"), district: z.string().describe("District information"), country: CommonModels.BusinessPartnerAddressCountryDtoSchema.describe("Country data") }).readonly(); +export type BusinessPartnerAddressResponseDTO = z.infer; + +/** + * EditorContentResponseDtoSchema + * @type { object } + * @property { string } html HTML content + * @property { object } json JSON content + * @property { any } json.[key] + */ +export const EditorContentResponseDtoSchema = z.object({ html: z.string().describe("HTML content"), json: z.object({}).catchall(z.any()).readonly().describe("JSON content") }).readonly(); +export type EditorContentResponseDto = z.infer; + +/** + * DunningSystemReferenceDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } isDefault + */ +export const DunningSystemReferenceDTOSchema = z.object({ id: z.string(), name: z.string(), isDefault: z.boolean() }).readonly(); +export type DunningSystemReferenceDTO = z.infer; + +/** + * TransportModeEnumSchema + * @type { enum } + */ +export const TransportModeEnumSchema = z.enum(["Air", "Sea", "Road"]); +export type TransportModeEnum = z.infer; +export const TransportModeEnum = TransportModeEnumSchema.enum; + +/** + * SeaRoutingEnumSchema + * @type { enum } + */ +export const SeaRoutingEnumSchema = z.enum(["Direct", "Transhipment"]); +export type SeaRoutingEnum = z.infer; +export const SeaRoutingEnum = SeaRoutingEnumSchema.enum; + +/** + * InvolvedPartyBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { BusinessPartnerAddressResponseDTO } address Main address information + */ +export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information").nullish() }).readonly(); +export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; + +/** + * InvolvedPartyContactResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvolvedPartyContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvolvedPartyContactResponseDTO = z.infer; + +/** + * InvolvedPartyResponseDtoSchema + * @type { object } + * @property { string } id + * @property { PositionInvolvedPartyTypeEnum } type + * @property { string } reference + * @property { InvolvedPartyBusinessPartnerResponseDTO } businessPartner + * @property { InvolvedPartyContactResponseDTO } contact + */ +export const InvolvedPartyResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionInvolvedPartyTypeEnumSchema, reference: z.string().nullish(), businessPartner: CommonModels.InvolvedPartyBusinessPartnerResponseDTOSchema.nullish(), contact: CommonModels.InvolvedPartyContactResponseDTOSchema.nullish() }).readonly(); +export type InvolvedPartyResponseDto = z.infer; + +/** + * CreateInvolvedPartyRequestDtoSchema + * @type { object } + * @property { PositionInvolvedPartyTypeEnum } type Type of the involved party to create + */ +export const CreateInvolvedPartyRequestDtoSchema = z.object({ type: CommonModels.PositionInvolvedPartyTypeEnumSchema.describe("Type of the involved party to create") }).readonly(); +export type CreateInvolvedPartyRequestDto = z.infer; + +/** + * RouteLocationTypeEnumSchema + * @type { enum } + */ +export const RouteLocationTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Port", "Terminal", "City", "Warehouse", "ContainerYard", "Airport"]); +export type RouteLocationTypeEnum = z.infer; +export const RouteLocationTypeEnum = RouteLocationTypeEnumSchema.enum; + +/** + * RoutePointLocationResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { RouteLocationTypeEnum } type + */ +export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }).readonly(); +export type RoutePointLocationResponseDto = z.infer; + +/** + * RoutePointTypeEnumSchema + * @type { enum } + */ +export const RoutePointTypeEnumSchema = z.enum(["EmptyContainerDepot", "LoadingAddress", "Stop", "FumigationStop", "OriginCustomsStop", "StuffingLocation", "PortTerminal", "PortOfLoading", "TransshipmentPort", "PortOfDischarge", "StrippingLocation", "ContainerYard", "DestinationCustomsStop", "FinalDestination", "EmptyContainerReturn", "OriginAgent", "HandlingAgent", "XRay", "CustomsBroker", "AirportOfDeparture", "StopAirport", "DestinationAirport", "CustomsStop", "DestinationAgent", "DeliveryAddress", "Courier", "PickupAddress", "StopAddress"]); +export type RoutePointTypeEnum = z.infer; +export const RoutePointTypeEnum = RoutePointTypeEnumSchema.enum; + +/** + * IncotermsEnumSchema + * @type { enum } + */ +export const IncotermsEnumSchema = z.enum(["EXW", "FCA", "CPT", "CIP", "DAP", "DPU", "DDP", "FAS", "FOB", "CFR", "CIF"]); +export type IncotermsEnum = z.infer; +export const IncotermsEnum = IncotermsEnumSchema.enum; + +/** + * PositionRouteTransportModeEnumSchema + * @type { enum } + */ +export const PositionRouteTransportModeEnumSchema = z.enum(["Truck", "Rail/Truck", "Rail", "Barge"]); +export type PositionRouteTransportModeEnum = z.infer; +export const PositionRouteTransportModeEnum = PositionRouteTransportModeEnumSchema.enum; + +/** + * RoutePointProviderResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type RoutePointProviderResponseDto = z.infer; + +/** + * RoutePointResponseDtoSchema + * @type { object } + * @property { string } id + * @property { RoutePointTypeEnum } type + * @property { string } name + * @property { number } sequenceNumber + * @property { RoutePointLocationResponseDto } location + * @property { string } estimatedTime + * @property { string } secondaryEstimatedTime Secondary estimated time (sea positions only) + * @property { string } reference + * @property { string } secondaryReference + * @property { IncotermsEnum } incoterm + * @property { PositionRouteTransportModeEnum } transportMode + * @property { RoutePointProviderResponseDto } provider + * @property { string } vessel Vessel name (sea positions only) + * @property { string } voyage Voyage number (sea positions only) + * @property { string } carrier Carrier name (sea positions only) + */ +export const RoutePointResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.RoutePointTypeEnumSchema, name: z.string(), sequenceNumber: z.number(), location: CommonModels.RoutePointLocationResponseDtoSchema.nullish(), estimatedTime: z.iso.datetime({ offset: true }).nullish(), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time (sea positions only)").nullish(), reference: z.string().nullish(), secondaryReference: z.string().nullish(), incoterm: CommonModels.IncotermsEnumSchema.nullish(), transportMode: CommonModels.PositionRouteTransportModeEnumSchema.nullish(), provider: CommonModels.RoutePointProviderResponseDtoSchema.nullish(), vessel: z.string().describe("Vessel name (sea positions only)").nullish(), voyage: z.string().describe("Voyage number (sea positions only)").nullish(), carrier: z.string().describe("Carrier name (sea positions only)").nullish() }).readonly(); +export type RoutePointResponseDto = z.infer; + +/** + * RouteResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } cargoId Cargo ID (sea positions only) + * @property { string } cargoNumber Cargo number (sea positions only) + * @property { RoutePointResponseDto[] } points + */ +export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().describe("Cargo ID (sea positions only)").nullish(), cargoNumber: z.string().describe("Cargo number (sea positions only)").nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema).readonly() }).readonly(); +export type RouteResponseDto = z.infer; + +/** + * RouteListResponseDtoSchema + * @type { object } + * @property { RouteResponseDto[] } routes + * @property { boolean } splitRoute Whether the position routes are split by cargo (sea positions only) + */ +export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema).readonly(), splitRoute: z.boolean().describe("Whether the position routes are split by cargo (sea positions only)") }).readonly(); +export type RouteListResponseDto = z.infer; + +/** + * CreateRoutePointRequestDtoSchema + * @type { object } + * @property { RoutePointTypeEnum } type + */ +export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }).readonly(); +export type CreateRoutePointRequestDto = z.infer; + +/** + * UpdateRoutePointRequestDtoSchema + * @type { object } + * @property { string } locationId Location ID for the route point + * @property { RouteLocationTypeEnum } locationType Type of location + * @property { string } estimatedTime Updated estimated time for the route point + * @property { string } secondaryEstimatedTime Secondary estimated time for the route point (sea positions only) + * @property { string } reference Reference for the route point + * @property { string } secondaryReference Secondary reference for the route point + * @property { IncotermsEnum } incoterm + * @property { PositionRouteTransportModeEnum } transportMode + * @property { string } providerId + * @property { string } vessel Vessel name (sea positions only) + * @property { string } voyage Voyage number (sea positions only) + * @property { string } carrier Carrier name (sea positions only) + */ +export const UpdateRoutePointRequestDtoSchema = z.object({ locationId: z.string().describe("Location ID for the route point").nullable(), locationType: CommonModels.RouteLocationTypeEnumSchema.describe("Type of location").nullable(), estimatedTime: z.iso.datetime({ offset: true }).describe("Updated estimated time for the route point"), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time for the route point (sea positions only)"), reference: z.string().describe("Reference for the route point"), secondaryReference: z.string().describe("Secondary reference for the route point"), incoterm: CommonModels.IncotermsEnumSchema, transportMode: CommonModels.PositionRouteTransportModeEnumSchema, providerId: z.string(), vessel: z.string().describe("Vessel name (sea positions only)"), voyage: z.string().describe("Voyage number (sea positions only)"), carrier: z.string().describe("Carrier name (sea positions only)") }).readonly(); +export type UpdateRoutePointRequestDto = z.infer; + +/** + * PositionChargeDtoResponseSchema + * @type { object } + * @property { object } chargeType + * @property { string } chargeType.id + * @property { string } chargeType.name + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { object } buyVatRule + * @property { string } buyVatRule.id + * @property { string } buyVatRule.name + * @property { string } buyVatRule.matchcode + * @property { object } vendor + * @property { string } vendor.id + * @property { string } vendor.name + * @property { string } vendor.matchCode + * @property { string } vendor.label + * @property { string } vendor.debtorId + * @property { string } vendor.creditorId + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { object } sellVatRule + * @property { string } sellVatRule.id + * @property { string } sellVatRule.name + * @property { string } sellVatRule.matchcode + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { string } customer.debtorId + * @property { string } customer.creditorId + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + * @property { number } profit Profit amount + * @property { string } profitCurrencyCode Profit currency code + */ +export const PositionChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge").nullish(), buyRate: z.number().describe("Buy rate amount").nullish(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), sellRate: z.number().describe("Sell rate amount").nullish(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), profit: z.number().describe("Profit amount").nullish(), profitCurrencyCode: z.string().describe("Profit currency code").nullish() }).readonly(); +export type PositionChargeDtoResponse = z.infer; + +/** + * PositionTextDtoResponseSchema + * @type { object } + * @property { string } content Text content + */ +export const PositionTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type PositionTextDtoResponse = z.infer; + +/** + * PositionAccountItemDtoResponseSchema + * @type { object } + * @property { string } id Item ID + * @property { string } outgoingInvoiceId + * @property { string } registeredInvoiceId + * @property { PositionAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { PositionChargeDtoResponse } charge Charge data if type is CHARGE + * @property { PositionTextDtoResponse } text Text data if type is TEXT + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + */ +export const PositionAccountItemDtoResponseSchema = z.object({ id: z.string().describe("Item ID"), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish(), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item"), charge: CommonModels.PositionChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), text: CommonModels.PositionTextDtoResponseSchema.describe("Text data if type is TEXT").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); +export type PositionAccountItemDtoResponse = z.infer; + +/** + * UserPreviewDtoSchema + * @type { object } + * @property { string } userId + * @property { string } name + */ +export const UserPreviewDtoSchema = z.object({ userId: z.string(), name: z.string() }).readonly(); +export type UserPreviewDto = z.infer; + +/** + * HBLDocumentConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + * @property { string } blTermsAndConditionsImageUrl BL terms and conditions image URL + * @property { string } signatureImageUrl Signature image URL + * @property { boolean } hasSignatureImage Whether office has a signature image configured + */ +export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), blTermsAndConditionsImageUrl: z.string().describe("BL terms and conditions image URL"), signatureImageUrl: z.string().describe("Signature image URL"), hasSignatureImage: z.boolean().describe("Whether office has a signature image configured") }).readonly(); +export type HBLDocumentConfigDto = z.infer; + +/** + * DirectionEnumSchema + * @type { enum } + */ +export const DirectionEnumSchema = z.enum(["Import", "Export"]); +export type DirectionEnum = z.infer; +export const DirectionEnum = DirectionEnumSchema.enum; + +/** + * HazardousPackingGroupEnumSchema + * @type { enum } + */ +export const HazardousPackingGroupEnumSchema = z.enum(["PG I", "PG II", "PG III"]); +export type HazardousPackingGroupEnum = z.infer; +export const HazardousPackingGroupEnum = HazardousPackingGroupEnumSchema.enum; + +/** + * PositionCargoPackageHazardousSpecialtyResponseDTOSchema + * @type { object } + * @property { number } totalLength + * @property { number } totalWidth + * @property { number } temperature + * @property { string } unNumber + * @property { string } IMOClass + * @property { string } shippingName + * @property { string } technicalName + * @property { HazardousPackingGroupEnum } packagingGroup + * @property { number } netWeight + * @property { number } flashpoint + * @property { string[] } properties + * @property { string } acceptanceNumber + * @property { string } medGuide + * @property { string } emergencyPhone + * @property { string } emergencySchedule + */ +export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number(), totalWidth: z.number(), temperature: z.number(), unNumber: z.string(), IMOClass: z.string(), shippingName: z.string(), technicalName: z.string(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema, netWeight: z.number(), flashpoint: z.number(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly(), acceptanceNumber: z.string(), medGuide: z.string(), emergencyPhone: z.string(), emergencySchedule: z.string() }).readonly(); +export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; + +/** + * PositionCargoPackageTypeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionCargoPackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionCargoPackageTypeResponseDTO = z.infer; + +/** + * HsCodeLabelDtoSchema + * @type { object } + * @property { string } id + * @property { string } label + */ +export const HsCodeLabelDtoSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export type HsCodeLabelDto = z.infer; + +/** + * PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema + * @type { object } + * @property { number } temperatureFrom + * @property { number } temperatureUntil + */ +export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.infer; + +/** + * PositionCargoSourcePackageResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } positionNumber + */ +export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }).readonly(); +export type PositionCargoSourcePackageResponseDTO = z.infer; + +/** + * PositionCargoPackageResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } cargoId + * @property { string } rootFolderId + * @property { number } quantity + * @property { string } packageTypeId + * @property { PositionCargoPackageTypeResponseDTO } packageType + * @property { number } length + * @property { number } width + * @property { number } height + * @property { number } netWeight + * @property { number } grossWeight + * @property { number } chargeableWeight + * @property { string } note + * @property { string } name + * @property { number } orderNumber + * @property { number } volume + * @property { number } volumetricWeight + * @property { string } caseMarks + * @property { string } description + * @property { string[] } hsCodes + * @property { HsCodeLabelDto[] } hsCodeLabels HS code details + * @property { string } customsRemarks + * @property { number } loadMeter + * @property { string[] } specialties + * @property { PositionCargoPackageHazardousSpecialtyResponseDTO } hazardousSpecialty + * @property { PositionCargoPackageTemperatureControlledSpecialtyResponseDto } temperatureControlledSpecialty + * @property { PositionCargoSourcePackageResponseDTO } sourcePackage + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const PositionCargoPackageResponseDTOSchema = z.object({ id: z.string(), cargoId: z.string(), rootFolderId: z.string().nullish(), quantity: z.number().nullish(), packageTypeId: z.string().nullish(), packageType: CommonModels.PositionCargoPackageTypeResponseDTOSchema.nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), netWeight: z.number().nullish(), grossWeight: z.number().nullish(), chargeableWeight: z.number().nullish(), note: z.string().nullish(), name: z.string().nullish(), orderNumber: z.number().nullish(), volume: z.number().nullish(), volumetricWeight: z.number().nullish(), caseMarks: z.string().nullish(), description: z.string().nullish(), hsCodes: z.array(z.string()).readonly().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), customsRemarks: z.string().nullish(), loadMeter: z.number().nullish(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.PositionCargoPackageHazardousSpecialtyResponseDTOSchema.nullish(), temperatureControlledSpecialty: CommonModels.PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema.nullish(), sourcePackage: CommonModels.PositionCargoSourcePackageResponseDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), mrn: z.string().describe("MRN (Movement Reference Number)").nullish(), exportPortFilling: z.string().describe("Export port filling").nullish(), customsReleased: z.boolean().describe("Customs released status").nullish(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullish(), portCustomsNumber: z.string().describe("Port customs number").nullish() }).readonly(); +export type PositionCargoPackageResponseDTO = z.infer; + +/** + * PackageTotalsDtoSchema + * @type { object } + * @property { number } quantity + * @property { number } weightPerPiece + * @property { number } volume + * @property { number } chargeableWeight + * @property { number } loadMeter + */ +export const PackageTotalsDtoSchema = z.object({ quantity: z.number(), weightPerPiece: z.number(), volume: z.number(), chargeableWeight: z.number().nullish(), loadMeter: z.number().nullish() }).readonly(); +export type PackageTotalsDto = z.infer; + +/** + * PackageSpecialtyTotalsResponseDtoSchema + * @type { object } + * @property { PackageTotalsDto } noSpecialties + * @property { PackageTotalsDto } hazardous + * @property { PackageTotalsDto } nonStackable + * @property { PackageTotalsDto } temperatureControlled + * @property { PackageTotalsDto } diplomatic + * @property { PackageTotalsDto } oversized + * @property { PackageTotalsDto } total + */ +export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }).readonly(); +export type PackageSpecialtyTotalsResponseDto = z.infer; + +/** + * PositionCargoCargoTypeResponseDTOSchema + * @type { object } + * @property { string } id Cargo type ID. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } name Cargo type name. Example: `Electronics` + * @property { string } shortName Cargo type short name. Example: `ELEC` + */ +export const PositionCargoCargoTypeResponseDTOSchema = z.object({ id: z.string().describe("Cargo type ID"), name: z.string().describe("Cargo type name"), shortName: z.string().describe("Cargo type short name").nullish() }).readonly(); +export type PositionCargoCargoTypeResponseDTO = z.infer; + +/** + * PositionCargoResponseDTOSchema + * @type { object } + * @property { string } id Cargo ID. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } positionId Position ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } quoteId Quote ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } rootFolderId Folder id bound to this cargo. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { PositionCargoCargoTypeResponseDTO } cargoType Cargo type + * @property { boolean } autoCalculateTotals + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { string } rateOptions + * @property { string } rateClass + * @property { string } textForCustoms + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { number } ratePerKg + * @property { number } totalRate + * @property { number } tare + * @property { number } vgm + * @property { HsCodeLabelDto[] } hsCodeLabels HS code details + * @property { string } note + * @property { PositionCargoPackageResponseDTO[] } packages Packages for the cargo + * @property { string } createdAt Creation date. Example: `2023-04-09T12:00:00Z` + * @property { string } updatedAt Last update date. Example: `2023-04-09T12:00:00Z` + * @property { number } completeWeight + * @property { PackageSpecialtyTotalsResponseDto } packageTotals + */ +export const PositionCargoResponseDTOSchema = z.object({ id: z.string().describe("Cargo ID"), positionId: z.string().describe("Position ID this cargo belongs to").nullish(), quoteId: z.string().describe("Quote ID this cargo belongs to").nullish(), rootFolderId: z.string().describe("Folder id bound to this cargo").nullish(), cargoType: CommonModels.PositionCargoCargoTypeResponseDTOSchema.describe("Cargo type").nullish(), autoCalculateTotals: z.boolean(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean(), transportUnitNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), rateOptions: z.string().nullish(), rateClass: z.string().nullish(), textForCustoms: z.string().nullish(), totalVolume: z.number().nullish(), totalGrossWeight: z.number().nullish(), totalNetWeight: z.number().nullish(), totalVolumetricWeight: z.number().nullish(), totalChargeableWeight: z.number().nullish(), totalLoadMeter: z.number().nullish(), ratePerKg: z.number().nullish(), totalRate: z.number().nullish(), tare: z.number().nullish(), vgm: z.number().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), note: z.string().nullish(), packages: z.array(CommonModels.PositionCargoPackageResponseDTOSchema).readonly().describe("Packages for the cargo").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Creation date"), updatedAt: z.iso.datetime({ offset: true }).describe("Last update date"), completeWeight: z.number().nullish(), packageTotals: CommonModels.PackageSpecialtyTotalsResponseDtoSchema.nullish() }).readonly(); +export type PositionCargoResponseDTO = z.infer; + +/** + * HazardousSpecialtyDTOSchema + * @type { object } + * @property { number } totalLength Total length + * @property { number } totalWidth Total width + * @property { number } temperature Temperature + * @property { string } unNumber UN number + * @property { string } IMOClass IMOClass + * @property { string } shippingName Shipping name + * @property { string } technicalName Technical name + * @property { HazardousPackingGroupEnum } packagingGroup Packaging + * @property { number } netWeight Net weight + * @property { number } flashpoint Flashpoint + * @property { string[] } properties Properties + * @property { string } acceptanceNumber Acceptance number + * @property { string } medGuide Medical guide + * @property { string } emergencyPhone Emergency phone + * @property { string } emergencySchedule Emergency schedule + */ +export const HazardousSpecialtyDTOSchema = z.object({ totalLength: z.number().describe("Total length"), totalWidth: z.number().describe("Total width"), temperature: z.number().describe("Temperature"), unNumber: z.string().describe("UN number"), IMOClass: z.string().describe("IMOClass"), shippingName: z.string().describe("Shipping name"), technicalName: z.string().describe("Technical name"), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.describe("Packaging"), netWeight: z.number().describe("Net weight"), flashpoint: z.number().describe("Flashpoint"), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly().describe("Properties"), acceptanceNumber: z.string().describe("Acceptance number"), medGuide: z.string().describe("Medical guide"), emergencyPhone: z.string().describe("Emergency phone"), emergencySchedule: z.string().describe("Emergency schedule") }).readonly(); +export type HazardousSpecialtyDTO = z.infer; + +/** + * TemperatureControlledSpecialtyDtoSchema + * @type { object } + * @property { number } temperatureFrom + * @property { number } temperatureUntil + */ +export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export type TemperatureControlledSpecialtyDto = z.infer; + +/** + * CreatePositionCargoPackageDTOSchema + * @type { object } + * @property { number } quantity Package quantity + * @property { string } packageTypeId Package type ID + * @property { number } length Package length + * @property { number } width Package width + * @property { number } height Package height + * @property { number } netWeight Package net weight + * @property { number } grossWeight Package gross weight + * @property { number } loadMeter Package load meter + * @property { number } chargeableWeight Package chargeable weight + * @property { number } volume Package volume + * @property { number } volumetricWeight Package volumetric weight + * @property { string } caseMarks Package case marks + * @property { string } note Package note + * @property { string } description Package description + * @property { string[] } hsCodes Package HS codes + * @property { string } customsRemarks Text for customs + * @property { string[] } specialties + * @property { HazardousSpecialtyDTO } hazardousSpecialty + * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const CreatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity"), packageTypeId: z.string().describe("Package type ID"), length: z.number().describe("Package length"), width: z.number().describe("Package width"), height: z.number().describe("Package height"), netWeight: z.number().describe("Package net weight"), grossWeight: z.number().describe("Package gross weight"), loadMeter: z.number().describe("Package load meter"), chargeableWeight: z.number().describe("Package chargeable weight"), volume: z.number().describe("Package volume"), volumetricWeight: z.number().describe("Package volumetric weight"), caseMarks: z.string().describe("Package case marks"), note: z.string().describe("Package note"), description: z.string().describe("Package description"), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs"), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema, temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)"), exportPortFilling: z.string().describe("Export port filling"), customsReleased: z.boolean().describe("Customs released status"), importCustomsReleaseNumber: z.string().describe("Import customs release number"), portCustomsNumber: z.string().describe("Port customs number") }).readonly(); +export type CreatePositionCargoPackageDTO = z.infer; + +/** + * UpdatePositionCargoPackageDTOSchema + * @type { object } + * @property { number } quantity Package quantity + * @property { string } packageTypeId Package type ID + * @property { number } length Package length + * @property { number } width Package width + * @property { number } height Package height + * @property { number } netWeight Package net weight + * @property { number } grossWeight Package gross weight + * @property { number } chargeableWeight Package chargeable weight + * @property { string } note Package case marks + * @property { number } volume Package volume + * @property { number } volumetricWeight Package volumetric weight + * @property { number } orderNumber Package order number + * @property { string } caseMarks Package case marks + * @property { string } description Package description + * @property { string[] } hsCodes Package HS codes + * @property { string } customsRemarks Text for customs + * @property { number } loadMeter Load meter + * @property { string[] } specialties Package specialties + * @property { HazardousSpecialtyDTO } hazardousSpecialty Hazardous specialty details + * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const UpdatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity").nullable(), packageTypeId: z.string().describe("Package type ID").nullable(), length: z.number().describe("Package length").nullable(), width: z.number().describe("Package width").nullable(), height: z.number().describe("Package height").nullable(), netWeight: z.number().describe("Package net weight").nullable(), grossWeight: z.number().describe("Package gross weight").nullable(), chargeableWeight: z.number().describe("Package chargeable weight").nullable(), note: z.string().describe("Package case marks").nullable(), volume: z.number().describe("Package volume").nullable(), volumetricWeight: z.number().describe("Package volumetric weight").nullable(), orderNumber: z.number().describe("Package order number"), caseMarks: z.string().describe("Package case marks").nullable(), description: z.string().describe("Package description").nullable(), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs").nullable(), loadMeter: z.number().describe("Load meter").nullable(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly().describe("Package specialties"), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema.describe("Hazardous specialty details"), temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)").nullable(), exportPortFilling: z.string().describe("Export port filling").nullable(), customsReleased: z.boolean().describe("Customs released status").nullable(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullable(), portCustomsNumber: z.string().describe("Port customs number").nullable() }).readonly(); +export type UpdatePositionCargoPackageDTO = z.infer; + +/** + * QuantityOfOriginalBlDocumentsEnumSchema + * @type { enum } + */ +export const QuantityOfOriginalBlDocumentsEnumSchema = z.enum(["ZERO", "ONE", "TWO", "THREE"]); +export type QuantityOfOriginalBlDocumentsEnum = z.infer; +export const QuantityOfOriginalBlDocumentsEnum = QuantityOfOriginalBlDocumentsEnumSchema.enum; + +/** + * MovementTypeEnumSchema + * @type { enum } + */ +export const MovementTypeEnumSchema = z.enum(["DoorToDoor", "PortToPort", "PortToDoor", "DoorToPort"]); +export type MovementTypeEnum = z.infer; +export const MovementTypeEnum = MovementTypeEnumSchema.enum; + +/** + * ChargePaymentEnumSchema + * @type { enum } + */ +export const ChargePaymentEnumSchema = z.enum(["Prepaid", "Collect", "PayableElsewhere"]); +export type ChargePaymentEnum = z.infer; +export const ChargePaymentEnum = ChargePaymentEnumSchema.enum; + +/** + * DocumentConfigDTOSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + */ +export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL") }).readonly(); +export type DocumentConfigDTO = z.infer; + +/** + * EmployeeRoleContextSchema + * @type { enum } + */ +export const EmployeeRoleContextSchema = z.enum(["global", "office"]); +export type EmployeeRoleContext = z.infer; +export const EmployeeRoleContext = EmployeeRoleContextSchema.enum; + +/** + * EmployeeRoleResponseSchema + * @type { object } + * @property { string } id Unique identifier of the role + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string } context Role context + * @property { string[] } permissions Permissions associated with the role + */ +export const EmployeeRoleResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export type EmployeeRoleResponse = z.infer; + +/** + * EmploymentEmployeeResponseSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { boolean } archived Archived + * @property { EmployeeRoleResponse[] } roles Global Roles + */ +export const EmploymentEmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish() }).readonly(); +export type EmploymentEmployeeResponse = z.infer; + +/** + * EmployeeOfficeResponseSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const EmployeeOfficeResponseSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type EmployeeOfficeResponse = z.infer; + +/** + * EmploymentResponseSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { EmployeeOfficeResponse } office + * @property { string } employeeId + * @property { EmploymentEmployeeResponse } employee + * @property { boolean } archived + * @property { string } costCenter + * @property { EmployeeRoleResponse[] } roles Employment Roles + */ +export const EmploymentResponseSchema = z.object({ id: z.string(), officeId: z.string(), office: CommonModels.EmployeeOfficeResponseSchema.nullish(), employeeId: z.string(), employee: CommonModels.EmploymentEmployeeResponseSchema.nullish(), archived: z.boolean(), costCenter: z.string().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Employment Roles").nullish() }).readonly(); +export type EmploymentResponse = z.infer; + +/** + * LoadTypeEnumSchema + * @type { enum } + */ +export const LoadTypeEnumSchema = z.enum(["LCL", "FCL", "Trailer", "Container", "BreakBulk", "Roro", "MAFI", "LTL_ROAD", "FTL_ROAD", "Standard"]); +export type LoadTypeEnum = z.infer; +export const LoadTypeEnum = LoadTypeEnumSchema.enum; + +/** + * ServiceTypeEnumSchema + * @type { enum } + */ +export const ServiceTypeEnumSchema = z.enum(["InlandTransport", "DoorToPortOfDischarge", "PortOfLoadingToDoor", "DoorToDoor", "PortToPort", "DoorToAirport", "AirportToAirport", "AirportToDoor", "PortOfDischargeRampToDoor"]); +export type ServiceTypeEnum = z.infer; +export const ServiceTypeEnum = ServiceTypeEnumSchema.enum; + +/** + * DateRangeDtoSchema + * @type { object } + * @property { string } start + * @property { string } end + */ +export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }), end: z.iso.datetime({ offset: true }) }).readonly(); +export type DateRangeDto = z.infer; + +/** + * BusinessPartnerLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { BusinessPartnerType[] } types Array of business partner types + */ +export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); +export type BusinessPartnerLabelResponseDTO = z.infer; + +/** + * SectionEnumSchema + * @type { enum } + */ +export const SectionEnumSchema = z.enum(["Logistics"]); +export type SectionEnum = z.infer; +export const SectionEnum = SectionEnumSchema.enum; + +/** + * FrequencyEnumSchema + * @type { enum } + */ +export const FrequencyEnumSchema = z.enum(["Daily", "Weekly", "Monthly"]); +export type FrequencyEnum = z.infer; +export const FrequencyEnum = FrequencyEnumSchema.enum; + +/** + * InvoiceDirectionEnumSchema + * @type { enum } + */ +export const InvoiceDirectionEnumSchema = z.enum(["Incoming", "Outgoing"]); +export type InvoiceDirectionEnum = z.infer; +export const InvoiceDirectionEnum = InvoiceDirectionEnumSchema.enum; + +/** + * InvoiceTypeEnumSchema + * @type { enum } + */ +export const InvoiceTypeEnumSchema = z.enum(["CreditNote", "Invoice", "CollectiveInvoice", "ProForma", "PartialCreditNote", "DirectInvoice"]); +export type InvoiceTypeEnum = z.infer; +export const InvoiceTypeEnum = InvoiceTypeEnumSchema.enum; + +/** + * BooleanFilterEnumSchema + * @type { enum } + */ +export const BooleanFilterEnumSchema = z.enum(["Yes", "No"]); +export type BooleanFilterEnum = z.infer; +export const BooleanFilterEnum = BooleanFilterEnumSchema.enum; + +/** + * InvoiceStatusEnumSchema + * @type { enum } + */ +export const InvoiceStatusEnumSchema = z.enum(["Credited", "Draft", "Overpaid", "PartiallyPaid", "Outstanding", "Paid", "CreditNote", "ProForma"]); +export type InvoiceStatusEnum = z.infer; +export const InvoiceStatusEnum = InvoiceStatusEnumSchema.enum; + +/** + * OfficeInvoiceFilterDtoSchema + * @type { object } + * @property { string } search + * @property { DateRangeDto } issuingDate + * @property { DateRangeDto } serviceDate + * @property { InvoiceDirectionEnum[] } invoiceDirection + * @property { InvoiceTypeEnum[] } invoiceType + * @property { BooleanFilterEnum[] } collective + * @property { number } amountMin + * @property { number } amountMax + * @property { string[] } currencyNotation + * @property { string[] } vatRule + * @property { DateRangeDto } dueDate + * @property { InvoiceStatusEnum[] } status + * @property { string[] } receiver Filter by invoice receiver/customer IDs (UUID) + * @property { string[] } receiverCountry Filter by invoice receiver/customer country IDs + * @property { string[] } salesRep Filter by sales rep id + * @property { string } positionNumbersString + * @property { string[] } positionNumbers + * @property { string } invoiceNumbersString + * @property { string[] } invoiceNumbers + * @property { BooleanFilterEnum[] } bookkeepingExportStatus + * @property { BooleanFilterEnum[] } dunningBlock + * @property { BooleanFilterEnum[] } invoiceInReview + * @property { BooleanFilterEnum[] } isInvoiceOk + * @property { BooleanFilterEnum[] } isVatOk + * @property { number } invoiceNumberMin + * @property { number } invoiceNumberMax + * @property { number } internalNumberMin + * @property { number } internalNumberMax + * @property { string } externalSystemId Filter invoices by position external system ID (substring match) + * @property { string } hblNumber Filter invoices by HBL/HAWB (substring match) + * @property { string } mblNumber Filter invoices by MBL/MAWB (substring match) + * @property { string } bookingNumber Filter invoices by booking number (substring match) + * @property { string } vessel Filter invoices by vessel name (substring match) + * @property { string } voyage Filter invoices by voyage number (substring match) + * @property { string } creditorId Filter invoices by creditor ID (substring match) + * @property { string } debtorId Filter invoices by debtor ID (substring match) + */ +export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), vatRule: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer IDs (UUID)"), receiverCountry: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer country IDs"), salesRep: z.array(z.string()).readonly().describe("Filter by sales rep id"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number(), externalSystemId: z.string().describe("Filter invoices by position external system ID (substring match)"), hblNumber: z.string().describe("Filter invoices by HBL/HAWB (substring match)"), mblNumber: z.string().describe("Filter invoices by MBL/MAWB (substring match)"), bookingNumber: z.string().describe("Filter invoices by booking number (substring match)"), vessel: z.string().describe("Filter invoices by vessel name (substring match)"), voyage: z.string().describe("Filter invoices by voyage number (substring match)"), creditorId: z.string().describe("Filter invoices by creditor ID (substring match)"), debtorId: z.string().describe("Filter invoices by debtor ID (substring match)") }).readonly(); +export type OfficeInvoiceFilterDto = z.infer; + +/** + * PositionStatusEnumSchema + * @type { enum } + */ +export const PositionStatusEnumSchema = z.enum(["Preparing", "NeedsDocumentation", "Executing", "Done"]); +export type PositionStatusEnum = z.infer; +export const PositionStatusEnum = PositionStatusEnumSchema.enum; + +/** + * PositionCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionCustomerDto = z.infer; + +/** + * PositionQuoteDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type PositionQuoteDto = z.infer; + +/** + * ParentPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type ParentPositionDto = z.infer; + +/** + * PositionTypeEnumSchema + * @type { enum } + */ +export const PositionTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); +export type PositionTypeEnum = z.infer; +export const PositionTypeEnum = PositionTypeEnumSchema.enum; + +/** + * PositionProjectLiteDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionProjectLiteDto = z.infer; + +/** + * EmployeeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const EmployeeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type EmployeeDto = z.infer; + +/** + * PositionCoreResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } rootFolderId + * @property { string } externalSystemId + * @property { MovementTypeEnum } inttraTypeOfMove + * @property { PositionCustomerDto } customer + * @property { boolean } isCancelled + * @property { string } owningOfficeId + * @property { string } originOfficeId + * @property { PositionQuoteDto } quote + * @property { string } number + * @property { SectionEnum } section + * @property { DirectionEnum } direction + * @property { TransportModeEnum } transportMode + * @property { string } statusDate + * @property { string } serviceDate + * @property { string } dateOfDeparture + * @property { string } dateOfArrival + * @property { PositionStatusEnum } status + * @property { LoadTypeEnum } loadType + * @property { IncotermsEnum } incoterms + * @property { IncotermsEnum } secondIncoterms + * @property { ServiceTypeEnum } serviceType + * @property { ParentPositionDto } parentPosition + * @property { string } buyRateReference + * @property { FrequencyEnum } frequency + * @property { PositionTypeEnum } positionType + * @property { boolean } isParentPosition + * @property { boolean } hasParentPosition + * @property { boolean } hasChildPositions + * @property { PositionProjectLiteDto } projectLite + * @property { boolean } isExcludedFromStatistics + * @property { EmployeeDto } salesRep + * @property { string } fillingCompany + * @property { string } sellingContract + * @property { string } fillingScacCode + * @property { string } serviceValidity + * @property { string } ratesValidity + * @property { EmployeeDto } responsibleEmployee + * @property { EmployeeDto } receivedByEmployee + * @property { string } team + * @property { string } createdAt + * @property { string } updatedAt + * @property { EditorContentResponseDto } notes Notes + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); +export type PositionCoreResponseDto = z.infer; + +/** + * VesselDtoSchema + * @type { object } + * @property { string } name + * @property { number } imo + * @property { number } mmsi + */ +export const VesselDtoSchema = z.object({ name: z.string(), imo: z.number().nullish(), mmsi: z.number().nullish() }).readonly(); +export type VesselDto = z.infer; + +/** + * StatusResponseDtoSchema + * @type { object } + * @property { string } status Status + * @property { string } message Message + * @property { string } code Alphanumeric code of the message type + */ +export const StatusResponseDtoSchema = z.object({ status: z.string().describe("Status"), message: z.string().describe("Message"), code: z.string().describe("Alphanumeric code of the message type") }).readonly(); +export type StatusResponseDto = z.infer; + +/** + * PaginationDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const PaginationDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type PaginationDto = z.infer; + +/** + * LabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + */ +export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export type LabelResponseDTO = z.infer; + +/** + * GenerateWorkingDocumentRequestDtoSchema + * @type { object } + * @property { string } issuedAt + * @property { string } fileName + */ +export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); +export type GenerateWorkingDocumentRequestDto = z.infer; + +/** + * UpdateInvolvedPartyDtoSchema + * @type { object } + * @property { string } reference + * @property { string } businessPartnerId + * @property { string } contactId + */ +export const UpdateInvolvedPartyDtoSchema = z.object({ reference: z.string(), businessPartnerId: z.string(), contactId: z.string() }).readonly(); +export type UpdateInvolvedPartyDto = z.infer; + +/** + * MergeRoutesRequestDtoSchema + * @type { object } + * @property { string } sourceCargoId Source cargo ID to merge from (sea positions only) + */ +export const MergeRoutesRequestDtoSchema = z.object({ sourceCargoId: z.string().describe("Source cargo ID to merge from (sea positions only)").nullable() }).readonly(); +export type MergeRoutesRequestDto = z.infer; + +/** + * CopyRouteRequestDtoSchema + * @type { object } + * @property { string } targetCargoId Target cargo ID to copy to (sea positions only) + */ +export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to copy to (sea positions only)").nullable() }).readonly(); +export type CopyRouteRequestDto = z.infer; + +/** + * CargoSummaryResponseDTOSchema + * @type { object } + * @property { string } transportUnitTypeName Transport unit type name (e.g., "40' DRY", "20'") + * @property { number } quantity Total quantity of this transport unit type + */ +export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string().describe("Transport unit type name (e.g., "40' DRY", "20'")"), quantity: z.number().describe("Total quantity of this transport unit type") }).readonly(); +export type CargoSummaryResponseDTO = z.infer; + +/** + * CreatePositionCargoDTOSchema + * @type { object } + * @property { string } cargoTypeId Cargo type ID + * @property { string } note + * @property { boolean } autoCalculateTotals + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { string } rateOptions + * @property { string } rateClass + * @property { number } ratePerKg + * @property { number } totalRate + * @property { string } textForCustoms + * @property { number } tare + * @property { number } vgm + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + */ +export const CreatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); +export type CreatePositionCargoDTO = z.infer; + +/** + * UpdatePositionCargoDTOSchema + * @type { object } + * @property { string } cargoTypeId Cargo type ID + * @property { string } note + * @property { boolean } autoCalculateTotals + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { string } rateOptions + * @property { string } rateClass + * @property { number } ratePerKg + * @property { number } totalRate + * @property { string } textForCustoms + * @property { number } tare + * @property { number } vgm + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + */ +export const UpdatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); +export type UpdatePositionCargoDTO = z.infer; + +/** + * MovePositionCargoPackageRequestDTOSchema + * @type { object } + * @property { string } targetCargoId Target cargo ID to move the package to + */ +export const MovePositionCargoPackageRequestDTOSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to move the package to") }).readonly(); +export type MovePositionCargoPackageRequestDTO = z.infer; + +/** + * PositionCargoPaginationOrderFieldSchema + * @type { enum } + */ +export const PositionCargoPaginationOrderFieldSchema = z.enum(["createdAt", "updatedAt"]); +export type PositionCargoPaginationOrderField = z.infer; +export const PositionCargoPaginationOrderField = PositionCargoPaginationOrderFieldSchema.enum; + +/** + * PositionAvailablePartnersUseCaseSchema + * @type { enum } + */ +export const PositionAvailablePartnersUseCaseSchema = z.enum(["financeCustomer", "financeVendor"]); +export type PositionAvailablePartnersUseCase = z.infer; +export const PositionAvailablePartnersUseCase = PositionAvailablePartnersUseCaseSchema.enum; + +} diff --git a/test/generated/dist/containerYards/containerYards.acl.ts b/test/generated/dist/containerYards/containerYards.acl.ts new file mode 100644 index 0000000..daa83f7 --- /dev/null +++ b/test/generated/dist/containerYards/containerYards.acl.ts @@ -0,0 +1,51 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace ContainerYardsAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "ContainerYard"] as AbilityTuple<"Create", "ContainerYard">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; + + /** + * Use for `useGetLabelById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetLabelById` query + */ + export const canUseGetLabelById = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; +} diff --git a/test/generated/dist/containerYards/containerYards.api.ts b/test/generated/dist/containerYards/containerYards.api.ts new file mode 100644 index 0000000..3b95a41 --- /dev/null +++ b/test/generated/dist/containerYards/containerYards.api.ts @@ -0,0 +1,137 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ContainerYardsModels } from "./containerYards.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ContainerYardsApi { + export const paginate = ( + limit: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, + `/container-yards`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards`, + ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), + config, + ); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, + `/container-yards/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const getLabelById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.LabelResponseDTOSchema }, + `/container-yards/${id}/labels`, + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}/unarchive`, + undefined, + config, + ); + }; + export const update = ( + id: string, + data: ContainerYardsModels.UpdateContainerYardRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}`, + ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), + config, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}`, + config, + ); + }; +} diff --git a/test/generated/dist/containerYards/containerYards.configs.ts b/test/generated/dist/containerYards/containerYards.configs.ts new file mode 100644 index 0000000..62b81ca --- /dev/null +++ b/test/generated/dist/containerYards/containerYards.configs.ts @@ -0,0 +1,141 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ContainerYardsModels } from "./containerYards.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ContainerYardsQueries } from "./containerYards.queries"; +import { ContainerYardsAcl } from "./containerYards.acl"; + +export namespace ContainerYardsConfigs { + export const containerYardsConfig = { + meta: { + title: "Container Yards", + }, + readAll: { + acl: ContainerYardsAcl.canUsePaginate, + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + paginated: ContainerYardsQueries.usePaginate, + infinite: ContainerYardsQueries.usePaginateInfinite, + filters: { + schema: ContainerYardsModels.ContainerYardFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ContainerYardsModels.ContainerYardFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + shortName: true, + name: true, + archived: true, + street: true, + secondaryStreet: true, + zip: true, + city: true, + country: true, + district: true, + additionalInformation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: ContainerYardsAcl.canUseFindById, + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + query: ContainerYardsQueries.useFindById, + }, + create: { + acl: ContainerYardsAcl.canUseCreate, + schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, + mutation: ContainerYardsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, + options: { + inputs: { + matchCode: true, + name: true, + shortName: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + additionalInformation: true, + }, + }, + }), + }, + update: { + acl: ContainerYardsAcl.canUseUpdate, + schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, + mutation: ContainerYardsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, + options: { + inputs: { + matchCode: true, + name: true, + shortName: true, + addressId: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + additionalInformation: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ContainerYardsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ContainerYardsQueries.usePaginateLabels, + infinite: ContainerYardsQueries.usePaginateLabelsInfinite, + filters: { + schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/containerYards/containerYards.models.ts b/test/generated/dist/containerYards/containerYards.models.ts new file mode 100644 index 0000000..7deddd9 --- /dev/null +++ b/test/generated/dist/containerYards/containerYards.models.ts @@ -0,0 +1,211 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ContainerYardsModels { + /** + * ContainerYardEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ContainerYardEmployeeDTO = z.infer; + + /** + * ContainerYardResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchCode Container yard match code + * @property { string } shortName Container yard short name + * @property { string } name Container yard name + * @property { boolean } archived Whether the container yard is archived + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { object } city + * @property { string } city.id + * @property { string } city.name + * @property { object } country + * @property { string } country.id + * @property { string } country.name + * @property { string } country.isoCode2 + * @property { string } country.isoCode3 + * @property { string } district District + * @property { string } additionalInformation Additional information + * @property { string } createdById + * @property { ContainerYardEmployeeDTO } createdBy + * @property { string } createdAt Date when the container yard was created + * @property { string } updatedById + * @property { ContainerYardEmployeeDTO } updatedBy + * @property { string } updatedAt Date when the container yard was last updated + */ + export const ContainerYardResponseDTOSchema = z + .object({ + id: z.string(), + matchCode: z.string().describe("Container yard match code"), + shortName: z.string().describe("Container yard short name").nullish(), + name: z.string().describe("Container yard name"), + archived: z.boolean().describe("Whether the container yard is archived"), + street: z.string().describe("Street address").nullish(), + secondaryStreet: z.string().describe("Secondary street address").nullish(), + zip: z.string().describe("ZIP/Postal code").nullish(), + city: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), + country: z + .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) + .readonly() + .nullish(), + district: z.string().describe("District").nullish(), + additionalInformation: z.string().describe("Additional information").nullish(), + createdById: z.string().nullish(), + createdBy: ContainerYardEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was created"), + updatedById: z.string().nullish(), + updatedBy: ContainerYardEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was last updated"), + }) + .readonly(); + export type ContainerYardResponseDTO = z.infer; + + /** + * ContainerYardFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ + export const ContainerYardFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); + export type ContainerYardFilterDto = z.infer; + + /** + * ContainerYardLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const ContainerYardLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type ContainerYardLabelFilterDto = z.infer; + + /** + * CreateContainerYardRequestDTOSchema + * @type { object } + * @property { string } matchCode Match code + * @property { string } name Name + * @property { string } shortName Short name + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } cityId City ID + * @property { string } countryId Country ID + * @property { string } district District + * @property { string } additionalInformation Additional information + */ + export const CreateContainerYardRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Match code"), + name: z.string().describe("Name"), + shortName: z.string().describe("Short name").nullish(), + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street address").nullish(), + zip: z.string().describe("ZIP/Postal code"), + cityId: z.string().describe("City ID"), + countryId: z.string().describe("Country ID"), + district: z.string().describe("District").nullish(), + additionalInformation: z.string().describe("Additional information").nullish(), + }) + .readonly(); + export type CreateContainerYardRequestDTO = z.infer; + + /** + * UpdateContainerYardRequestDTOSchema + * @type { object } + * @property { string } matchCode Match code + * @property { string } name Name + * @property { string } shortName Short name + * @property { string } addressId Address ID + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } cityId City ID + * @property { string } countryId Country ID + * @property { string } district District + * @property { string } additionalInformation Additional information + */ + export const UpdateContainerYardRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Match code"), + name: z.string().describe("Name"), + shortName: z.string().describe("Short name"), + addressId: z.string().describe("Address ID"), + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street address"), + zip: z.string().describe("ZIP/Postal code"), + cityId: z.string().describe("City ID"), + countryId: z.string().describe("Country ID"), + district: z.string().describe("District"), + additionalInformation: z.string().describe("Additional information"), + }) + .readonly(); + export type UpdateContainerYardRequestDTO = z.infer; + + /** + * ContainerYardsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const ContainerYardsPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ContainerYardsPaginateOrderParamEnum = z.infer; + export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderParamEnumSchema.enum; + + /** + * ContainerYardsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ContainerYardResponseDTO[] } items + */ + export const ContainerYardsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ContainerYardResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ContainerYardsPaginateResponse = z.infer; + + /** + * ContainerYardsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const ContainerYardsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ContainerYardsPaginateLabelsOrderParamEnum = z.infer< + typeof ContainerYardsPaginateLabelsOrderParamEnumSchema + >; + export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * ContainerYardsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const ContainerYardsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ContainerYardsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/containerYards/containerYards.queries.ts b/test/generated/dist/containerYards/containerYards.queries.ts new file mode 100644 index 0000000..1f81835 --- /dev/null +++ b/test/generated/dist/containerYards/containerYards.queries.ts @@ -0,0 +1,392 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ContainerYardsAcl } from "./containerYards.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ContainerYardsModels } from "./containerYards.models"; +import { ContainerYardsApi } from "./containerYards.api"; + +export namespace ContainerYardsQueries { + export const moduleName = QueryModule.ContainerYards; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/container-yards", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardFilterDto, + cursor?: string, + ) => [...keys.all, "/container-yards", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/container-yards/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: ContainerYardsModels.ContainerYardLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/container-yards/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getLabelById: (id: string) => [...keys.all, "/container-yards/:id/labels", id] as const, + findById: (id: string) => [...keys.all, "/container-yards/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Container Yards + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ContainerYardsModels.ContainerYardFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUsePaginate()); + return ContainerYardsApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Container Yards + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ContainerYardsModels.ContainerYardFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ContainerYardsAcl.canUsePaginate()); + return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create container yard + * @permission Requires `canUseCreate` ability + * @param { ContainerYardsModels.CreateContainerYardRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof ContainerYardsApi.create, + { data: ContainerYardsModels.CreateContainerYardRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(ContainerYardsAcl.canUseCreate()); + return ContainerYardsApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate container yard labels (id and name) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ContainerYardsModels.ContainerYardLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUsePaginateLabels()); + return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate container yard labels (id and name) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ContainerYardsModels.ContainerYardLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ContainerYardsAcl.canUsePaginateLabels()); + return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetLabelById` + * @summary Get container yard by ID with label format (id and formatted name) + * @permission Requires `canUseGetLabelById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetLabelById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getLabelById(id), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUseGetLabelById()); + return ContainerYardsApi.getLabelById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive container yard + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ContainerYardsAcl.canUseArchive()); + return ContainerYardsApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive container yard + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ContainerYardsAcl.canUseUnarchive()); + return ContainerYardsApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update container yard + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { ContainerYardsModels.UpdateContainerYardRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ContainerYardsApi.update, + { id: string; data: ContainerYardsModels.UpdateContainerYardRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(ContainerYardsAcl.canUseUpdate()); + return ContainerYardsApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get container yard + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUseFindById()); + return ContainerYardsApi.findById(id, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/controlTowerAuth/controlTowerAuth.api.ts b/test/generated/dist/controlTowerAuth/controlTowerAuth.api.ts new file mode 100644 index 0000000..301befe --- /dev/null +++ b/test/generated/dist/controlTowerAuth/controlTowerAuth.api.ts @@ -0,0 +1,23 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerAuthModels } from "./controlTowerAuth.models"; + +export namespace ControlTowerAuthApi { + export const login = (data: ControlTowerAuthModels.LoginRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, + `/auth/move/login`, + ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), + config, + ); + }; + export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, + `/auth/reset-password`, + ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/controlTowerAuth/controlTowerAuth.models.ts b/test/generated/dist/controlTowerAuth/controlTowerAuth.models.ts new file mode 100644 index 0000000..797b408 --- /dev/null +++ b/test/generated/dist/controlTowerAuth/controlTowerAuth.models.ts @@ -0,0 +1,42 @@ +import { z } from "zod"; + +export namespace ControlTowerAuthModels { + /** + * LoginRequestDtoSchema + * @type { object } + * @property { string } username + * @property { string } password + */ + export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }).readonly(); + export type LoginRequestDto = z.infer; + + /** + * LoginResponseDtoSchema + * @type { object } + * @property { string } accessToken + * @property { boolean } resetPasswordRequired + * @property { string } passwordResetToken + * @property { string } username + */ + export const LoginResponseDtoSchema = z + .object({ + accessToken: z.string().nullable(), + resetPasswordRequired: z.boolean().nullish(), + passwordResetToken: z.string().nullish(), + username: z.string().nullish(), + }) + .readonly(); + export type LoginResponseDto = z.infer; + + /** + * PasswordResetDtoSchema + * @type { object } + * @property { string } password + * @property { string } username + * @property { string } token + */ + export const PasswordResetDtoSchema = z + .object({ password: z.string(), username: z.string(), token: z.string() }) + .readonly(); + export type PasswordResetDto = z.infer; +} diff --git a/test/generated/dist/controlTowerAuth/controlTowerAuth.queries.ts b/test/generated/dist/controlTowerAuth/controlTowerAuth.queries.ts new file mode 100644 index 0000000..db1fe88 --- /dev/null +++ b/test/generated/dist/controlTowerAuth/controlTowerAuth.queries.ts @@ -0,0 +1,64 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerAuthModels } from "./controlTowerAuth.models"; +import { ControlTowerAuthApi } from "./controlTowerAuth.api"; + +export namespace ControlTowerAuthQueries { + export const moduleName = QueryModule.ControlTowerAuth; + + /** + * Mutation `useLogin` + * @description Returns an access token to authenticate for protected endpoints + * @param { ControlTowerAuthModels.LoginRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 400, 401] + */ + export const useLogin = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerAuthApi.login(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useResetPassword` + * @description Resets the password for the requesting user + * @param { ControlTowerAuthModels.PasswordResetDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 400, 401] + */ + export const useResetPassword = ( + options?: AppMutationOptions< + typeof ControlTowerAuthApi.resetPassword, + { data: ControlTowerAuthModels.PasswordResetDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerAuthApi.resetPassword(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/controlTowerBookings/controlTowerBookings.api.ts b/test/generated/dist/controlTowerBookings/controlTowerBookings.api.ts new file mode 100644 index 0000000..25bc9dd --- /dev/null +++ b/test/generated/dist/controlTowerBookings/controlTowerBookings.api.ts @@ -0,0 +1,61 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; + +export namespace ControlTowerBookingsApi { + export const findAll = ( + limit: number, + order?: string, + filter?: ControlTowerBookingsModels.BookingFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, + `/bookings`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, + `/bookings/${id}`, + config, + ); + }; + export const findPackageById = (packageId: string, bookingId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, + `/bookings/${bookingId}/packages/${packageId}`, + config, + ); + }; +} diff --git a/test/generated/dist/controlTowerBookings/controlTowerBookings.configs.ts b/test/generated/dist/controlTowerBookings/controlTowerBookings.configs.ts new file mode 100644 index 0000000..93c0533 --- /dev/null +++ b/test/generated/dist/controlTowerBookings/controlTowerBookings.configs.ts @@ -0,0 +1,55 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; +import { ControlTowerBookingsQueries } from "./controlTowerBookings.queries"; + +export namespace ControlTowerBookingsConfigs { + export const bookingsConfig = { + meta: { + title: "Bookings", + }, + readAll: { + schema: ControlTowerBookingsModels.BookingListItemDtoSchema, + paginated: ControlTowerBookingsQueries.useFindAll, + infinite: ControlTowerBookingsQueries.useFindAllInfinite, + filters: { + schema: ControlTowerBookingsModels.BookingFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerBookingsModels.BookingFilterDtoSchema, + options: { + inputs: { + projectId: true, + search: true, + companyIds: true, + purchaseOrderId: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ControlTowerBookingsModels.BookingListItemDtoSchema, + options: { + columns: { + id: true, + bookingNumber: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema, + }, + }), + }, + read: { + schema: ControlTowerBookingsModels.BookingResponseDtoSchema, + query: ControlTowerBookingsQueries.useFindById, + }, + }; +} diff --git a/test/generated/dist/controlTowerBookings/controlTowerBookings.models.ts b/test/generated/dist/controlTowerBookings/controlTowerBookings.models.ts new file mode 100644 index 0000000..011e334 --- /dev/null +++ b/test/generated/dist/controlTowerBookings/controlTowerBookings.models.ts @@ -0,0 +1,248 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerBookingsModels { + /** + * BookingListItemDtoSchema + * @type { object } + * @property { string } id + * @property { string } bookingNumber + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ + export const BookingListItemDtoSchema = z + .object({ + id: z.string(), + bookingNumber: z.string().nullable(), + ets: z.iso.datetime({ offset: true }).nullable(), + eta: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + }) + .readonly(); + export type BookingListItemDto = z.infer; + + /** + * BookingContainerDtoSchema + * @type { object } + * @property { string } id + * @property { string } containerNumber + * @property { string } type + * @property { string } loadType + * @property { string } stuffedInContainer + * @property { string[] } hsCode + * @property { number } noS + * @property { number } weight + * @property { string } lastEventLocation + * @property { string } lastEventName + * @property { string } lastEventDate + * @property { string } seals + */ + export const BookingContainerDtoSchema = z + .object({ + id: z.string(), + containerNumber: z.string().nullable(), + type: z.string().nullable(), + loadType: z.string().nullable(), + stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), + hsCode: z.array(z.string()).readonly().nullable(), + noS: z.number().nullable(), + weight: z.number().nullable(), + lastEventLocation: z.string().nullable(), + lastEventName: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + seals: z.string().nullable(), + }) + .readonly(); + export type BookingContainerDto = z.infer; + + /** + * BookingPackageDtoSchema + * @type { object } + * @property { string } id + * @property { string } packageNumber + * @property { string } containerNumber + * @property { string } type + * @property { string } description + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + */ + export const BookingPackageDtoSchema = z + .object({ + id: z.string(), + packageNumber: z.string(), + containerNumber: z.string().nullable(), + type: z.string().nullable(), + description: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + }) + .readonly(); + export type BookingPackageDto = z.infer; + + /** + * BookingResponseDtoSchema + * @type { object } + * @property { string } bookingNumber + * @property { string } ets + * @property { string } etaPod + * @property { string } etaFinalDeliveryPlace + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } destination + * @property { string } lastEvent + * @property { string[] } files + * @property { string } poNumber + * @property { string } blNumber + * @property { BookingContainerDto[] } containers + * @property { BookingPackageDto[] } packages + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + * @property { string } id + */ + export const BookingResponseDtoSchema = z + .object({ + bookingNumber: z.string().nullable(), + ets: z.iso.datetime({ offset: true }).nullable(), + etaPod: z.iso.datetime({ offset: true }).nullable(), + etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + destination: z.string().nullable(), + lastEvent: z.string().nullable(), + files: z.array(z.string()).readonly().nullable(), + poNumber: z.string().nullable(), + blNumber: z.string().nullable(), + containers: z.array(BookingContainerDtoSchema).readonly().nullish(), + packages: z.array(BookingPackageDtoSchema).readonly().nullish(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + id: z.string(), + }) + .readonly(); + export type BookingResponseDto = z.infer; + + /** + * PackageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } poNumber + * @property { string } bookingNumber + * @property { string } blNumber + * @property { string } containerNumber + * @property { string } packageNumber + * @property { string } description + * @property { number } netWeight + * @property { number } grossWeight + * @property { number } length + * @property { number } width + * @property { number } height + * @property { number } volume + * @property { string } storageInstruction + * @property { string } destination + * @property { string[] } files + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ + export const PackageResponseDtoSchema = z + .object({ + id: z.string(), + poNumber: z.string().nullable(), + bookingNumber: z.string().nullable(), + blNumber: z.string().nullable(), + containerNumber: z.string().nullable(), + packageNumber: z.string().nullable(), + description: z.string().nullable(), + netWeight: z.number().nullable(), + grossWeight: z.number().nullable(), + length: z.number().nullable(), + width: z.number().nullable(), + height: z.number().nullable(), + volume: z.number().nullable(), + storageInstruction: z.string().nullable(), + destination: z.string().nullable(), + files: z.array(z.string()).readonly().nullable(), + ets: z.iso.datetime({ offset: true }).nullable(), + eta: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + }) + .readonly(); + export type PackageResponseDto = z.infer; + + /** + * BookingFilterDtoSchema + * @type { object } + * @property { string } projectId + * @property { string } search Min Length: `1` + * @property { string[] } companyIds + * @property { string } purchaseOrderId + */ + export const BookingFilterDtoSchema = z + .object({ + projectId: z.string(), + search: z.string().min(1), + companyIds: z.array(z.string()).readonly(), + purchaseOrderId: z.string(), + }) + .readonly(); + export type BookingFilterDto = z.infer; + + /** + * ControlTowerBookingsFindAllOrderParamEnumSchema + * @type { enum } + */ + export const ControlTowerBookingsFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); + export type ControlTowerBookingsFindAllOrderParamEnum = z.infer< + typeof ControlTowerBookingsFindAllOrderParamEnumSchema + >; + export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFindAllOrderParamEnumSchema.enum; + + /** + * ControlTowerBookingsFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookingListItemDto[] } items + */ + export const ControlTowerBookingsFindAllResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(BookingListItemDtoSchema).readonly() }).readonly().shape, + }); + export type ControlTowerBookingsFindAllResponse = z.infer; +} diff --git a/test/generated/dist/controlTowerBookings/controlTowerBookings.queries.ts b/test/generated/dist/controlTowerBookings/controlTowerBookings.queries.ts new file mode 100644 index 0000000..491a3af --- /dev/null +++ b/test/generated/dist/controlTowerBookings/controlTowerBookings.queries.ts @@ -0,0 +1,141 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; +import { ControlTowerBookingsApi } from "./controlTowerBookings.api"; + +export namespace ControlTowerBookingsQueries { + export const moduleName = QueryModule.ControlTowerBookings; + + export const keys = { + all: [moduleName] as const, + findAll: ( + limit?: number, + order?: string, + filter?: ControlTowerBookingsModels.BookingFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/bookings", limit, order, filter, page, cursor] as const, + findAllInfinite: ( + limit?: number, + order?: string, + filter?: ControlTowerBookingsModels.BookingFilterDto, + cursor?: string, + ) => [...keys.all, "/bookings", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/bookings/:id", id] as const, + findPackageById: (packageId: string, bookingId: string) => + [...keys.all, "/bookings/:bookingId/packages/:packageId", packageId, bookingId] as const, + }; + + /** + * Query `useFindAll` + * @summary Get all accessible bookings for the customer + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ControlTowerBookingsModels.BookingFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `useFindAllInfinite + * @summary Get all accessible bookings for the customer + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ControlTowerBookingsModels.BookingFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @description Returns a booking with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => ControlTowerBookingsApi.findById(id, config), + ...options, + }); + }; + + /** + * Query `useFindPackageById` + * @description Returns a package with the specified id + * @param { string } object.packageId Path parameter + * @param { string } object.bookingId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindPackageById = ( + { packageId, bookingId }: { packageId: string; bookingId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findPackageById(packageId, bookingId), + queryFn: () => ControlTowerBookingsApi.findPackageById(packageId, bookingId, config), + ...options, + }); + }; +} diff --git a/test/generated/dist/controlTowerCalendar/controlTowerCalendar.api.ts b/test/generated/dist/controlTowerCalendar/controlTowerCalendar.api.ts new file mode 100644 index 0000000..5889980 --- /dev/null +++ b/test/generated/dist/controlTowerCalendar/controlTowerCalendar.api.ts @@ -0,0 +1,45 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; + +export namespace ControlTowerCalendarApi { + export const getCalendar = ( + from: string, + to: string, + type: ControlTowerCalendarModels.CalendarTypeEnum, + search?: string, + poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, + containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, + bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, `/calendar`, { + ...config, + params: { + from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), + to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), + type: ZodExtended.parse(ControlTowerCalendarModels.CalendarTypeEnumSchema, type, { + type: "query", + name: "type", + }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + poNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarPoNumbersParamSchema.optional(), poNumbers, { + type: "query", + name: "poNumbers", + }), + containerNumbers: ZodExtended.parse( + ControlTowerCalendarModels.GetCalendarContainerNumbersParamSchema.optional(), + containerNumbers, + { type: "query", name: "containerNumbers" }, + ), + bookingNumbers: ZodExtended.parse( + ControlTowerCalendarModels.GetCalendarBookingNumbersParamSchema.optional(), + bookingNumbers, + { type: "query", name: "bookingNumbers" }, + ), + }, + }); + }; +} diff --git a/test/generated/dist/controlTowerCalendar/controlTowerCalendar.models.ts b/test/generated/dist/controlTowerCalendar/controlTowerCalendar.models.ts new file mode 100644 index 0000000..9659a01 --- /dev/null +++ b/test/generated/dist/controlTowerCalendar/controlTowerCalendar.models.ts @@ -0,0 +1,109 @@ +import { z } from "zod"; + +export namespace ControlTowerCalendarModels { + /** + * EventRelationTypeEnumSchema + * @type { enum } + */ + export const EventRelationTypeEnumSchema = z.enum(["Booking", "Container", "PurchaseOrder"]); + export type EventRelationTypeEnum = z.infer; + export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; + + /** + * CalendarEventRelationDtoSchema + * @type { object } + * @property { EventRelationTypeEnum } type + * @property { string } id + * @property { string } number + */ + export const CalendarEventRelationDtoSchema = z + .object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }) + .readonly(); + export type CalendarEventRelationDto = z.infer; + + /** + * CalendarTypeEnumSchema + * @type { enum } + */ + export const CalendarTypeEnumSchema = z.enum(["PurchaseOrder", "Booking", "Container", "Package"]); + export type CalendarTypeEnum = z.infer; + export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; + + /** + * CalendarEventDtoSchema + * @type { object } + * @property { string } entityId + * @property { string } entityNumber + * @property { CalendarTypeEnum } entityType + * @property { string } date + * @property { string } title + * @property { CalendarEventRelationDto[] } relations + */ + export const CalendarEventDtoSchema = z + .object({ + entityId: z.string(), + entityNumber: z.string(), + entityType: CalendarTypeEnumSchema, + date: z.iso.datetime({ offset: true }), + title: z.string(), + relations: z.array(CalendarEventRelationDtoSchema).readonly(), + }) + .readonly(); + export type CalendarEventDto = z.infer; + + /** + * FiltersDtoSchema + * @type { object } + * @property { string[] } poNumbers + * @property { string[] } bookingNumbers + * @property { string[] } containerNumbers + */ + export const FiltersDtoSchema = z + .object({ + poNumbers: z.array(z.string()).readonly(), + bookingNumbers: z.array(z.string()).readonly(), + containerNumbers: z.array(z.string()).readonly(), + }) + .readonly(); + export type FiltersDto = z.infer; + + /** + * CalendarDtoSchema + * @type { object } + * @property { CalendarEventDto[] } events + * @property { FiltersDto } filters + */ + export const CalendarDtoSchema = z + .object({ events: z.array(CalendarEventDtoSchema).readonly(), filters: FiltersDtoSchema }) + .readonly(); + export type CalendarDto = z.infer; + + /** + * CalendarResponseDtoSchema + * @type { object } + * @property { CalendarDto } data + */ + export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }).readonly(); + export type CalendarResponseDto = z.infer; + + /** + * GetCalendarPoNumbersParamSchema + * @type { array } + */ + export const GetCalendarPoNumbersParamSchema = z.array(z.string()).readonly().nullish(); + export type GetCalendarPoNumbersParam = z.infer; + + /** + * GetCalendarContainerNumbersParamSchema + * @type { array } + */ + export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).readonly().nullish(); + export type GetCalendarContainerNumbersParam = z.infer; + + /** + * GetCalendarBookingNumbersParamSchema + * @type { array } + */ + export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).readonly().nullish(); + export type GetCalendarBookingNumbersParam = z.infer; +} diff --git a/test/generated/dist/controlTowerCalendar/controlTowerCalendar.queries.ts b/test/generated/dist/controlTowerCalendar/controlTowerCalendar.queries.ts new file mode 100644 index 0000000..e49a9d2 --- /dev/null +++ b/test/generated/dist/controlTowerCalendar/controlTowerCalendar.queries.ts @@ -0,0 +1,74 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; +import { ControlTowerCalendarApi } from "./controlTowerCalendar.api"; + +export namespace ControlTowerCalendarQueries { + export const moduleName = QueryModule.ControlTowerCalendar; + + export const keys = { + all: [moduleName] as const, + getCalendar: ( + from?: string, + to?: string, + type?: ControlTowerCalendarModels.CalendarTypeEnum, + search?: string, + poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, + containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, + bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, + ) => [...keys.all, "/calendar", from, to, type, search, poNumbers, containerNumbers, bookingNumbers] as const, + }; + + /** + * Query `useGetCalendar` + * @param { string } object.from Query parameter + * @param { string } object.to Query parameter + * @param { ControlTowerCalendarModels.CalendarTypeEnum } object.type Query parameter + * @param { string } object.search Query parameter + * @param { ControlTowerCalendarModels.GetCalendarPoNumbersParam } object.poNumbers Query parameter + * @param { ControlTowerCalendarModels.GetCalendarContainerNumbersParam } object.containerNumbers Query parameter + * @param { ControlTowerCalendarModels.GetCalendarBookingNumbersParam } object.bookingNumbers Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCalendar = ( + { + from, + to, + type, + search, + poNumbers, + containerNumbers, + bookingNumbers, + }: { + from: string; + to: string; + type: ControlTowerCalendarModels.CalendarTypeEnum; + search?: string; + poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam; + containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam; + bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), + queryFn: () => + ControlTowerCalendarApi.getCalendar( + from, + to, + type, + search, + poNumbers, + containerNumbers, + bookingNumbers, + config, + ), + ...options, + }); + }; +} diff --git a/test/generated/dist/controlTowerContainers/controlTowerContainers.api.ts b/test/generated/dist/controlTowerContainers/controlTowerContainers.api.ts new file mode 100644 index 0000000..444147a --- /dev/null +++ b/test/generated/dist/controlTowerContainers/controlTowerContainers.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; + +export namespace ControlTowerContainersApi { + export const findAll = ( + limit: number, + order?: string, + filter?: ControlTowerContainersModels.ContainerFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, + `/containers`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, + `/containers/${id}`, + config, + ); + }; + export const getJourney = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, + `/containers/${id}/journey`, + config, + ); + }; +} diff --git a/test/generated/dist/controlTowerContainers/controlTowerContainers.configs.ts b/test/generated/dist/controlTowerContainers/controlTowerContainers.configs.ts new file mode 100644 index 0000000..79e4a85 --- /dev/null +++ b/test/generated/dist/controlTowerContainers/controlTowerContainers.configs.ts @@ -0,0 +1,53 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; +import { ControlTowerContainersQueries } from "./controlTowerContainers.queries"; + +export namespace ControlTowerContainersConfigs { + export const containersConfig = { + meta: { + title: "Containers", + }, + readAll: { + schema: ControlTowerContainersModels.ContainerListItemDtoSchema, + paginated: ControlTowerContainersQueries.useFindAll, + infinite: ControlTowerContainersQueries.useFindAllInfinite, + filters: { + schema: ControlTowerContainersModels.ContainerFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerContainersModels.ContainerFilterDtoSchema, + options: { + inputs: { + companyIds: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ControlTowerContainersModels.ContainerListItemDtoSchema, + options: { + columns: { + containerNumber: true, + id: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, + }, + }), + }, + read: { + schema: ControlTowerContainersModels.ContainerResponseDtoSchema, + query: ControlTowerContainersQueries.useFindById, + }, + }; +} diff --git a/test/generated/dist/controlTowerContainers/controlTowerContainers.models.ts b/test/generated/dist/controlTowerContainers/controlTowerContainers.models.ts new file mode 100644 index 0000000..8b5f4ff --- /dev/null +++ b/test/generated/dist/controlTowerContainers/controlTowerContainers.models.ts @@ -0,0 +1,209 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerContainersModels { + /** + * ContainerListItemDtoSchema + * @type { object } + * @property { string } containerNumber + * @property { string } id + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ + export const ContainerListItemDtoSchema = z + .object({ + containerNumber: z.string().nullable(), + id: z.string(), + ets: z.iso.datetime({ offset: true }).nullable(), + eta: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + }) + .readonly(); + export type ContainerListItemDto = z.infer; + + /** + * ContainerEventDtoSchema + * @type { object } + * @property { CommonModels.VesselDto } vessel + * @property { string } name + * @property { string } date + * @property { boolean } checkedIn + */ + export const ContainerEventDtoSchema = z + .object({ + vessel: CommonModels.VesselDtoSchema.nullable(), + name: z.string(), + date: z.iso.datetime({ offset: true }).nullable(), + checkedIn: z.boolean(), + }) + .readonly(); + export type ContainerEventDto = z.infer; + + /** + * ContainerJourneyDtoSchema + * @type { object } + * @property { string } id + * @property { string } country + * @property { string } terminal + * @property { boolean } checkedIn + * @property { ContainerEventDto[] } events + */ + export const ContainerJourneyDtoSchema = z + .object({ + id: z.string(), + country: z.string().nullable(), + terminal: z.string().nullable(), + checkedIn: z.boolean(), + events: z.array(ContainerEventDtoSchema).readonly(), + }) + .readonly(); + export type ContainerJourneyDto = z.infer; + + /** + * PackageNumberDtoSchema + * @type { object } + * @property { string } id + * @property { string } type + * @property { string } description + */ + export const PackageNumberDtoSchema = z + .object({ id: z.string(), type: z.string().nullable(), description: z.string() }) + .readonly(); + export type PackageNumberDto = z.infer; + + /** + * ContainerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } containerNumber + * @property { string } poNumber + * @property { string } bookingNumber + * @property { string } blNumber + * @property { string } stuffedInContainer + * @property { string } containerType + * @property { string } loadType + * @property { string[] } hsCode + * @property { number } totalVolume + * @property { number } totalWeight + * @property { string } cargoDescription + * @property { number } noS + * @property { ContainerJourneyDto[] } journeys + * @property { PackageNumberDto[] } packages + * @property { string } bookingId + * @property { string } destination + * @property { string[] } files + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ + export const ContainerResponseDtoSchema = z + .object({ + id: z.string(), + containerNumber: z.string().nullable(), + poNumber: z.string().nullable(), + bookingNumber: z.string().nullable(), + blNumber: z.string().nullable(), + stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), + containerType: z.string().nullable(), + loadType: z.string().nullable(), + hsCode: z.array(z.string()).readonly().nullable(), + totalVolume: z.number().nullable(), + totalWeight: z.number().nullable(), + cargoDescription: z.string().nullable(), + noS: z.number().nullable(), + journeys: z.array(ContainerJourneyDtoSchema).readonly().nullish(), + packages: z.array(PackageNumberDtoSchema).readonly().nullish(), + bookingId: z.string().nullable(), + destination: z.string().nullable(), + files: z.array(z.string()).readonly().nullable(), + ets: z.iso.datetime({ offset: true }).nullable(), + eta: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + }) + .readonly(); + export type ContainerResponseDto = z.infer; + + /** + * ContainerJourneyResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { ContainerJourneyDto[] } journeys + * @property { string[] } packageNumbers + */ + export const ContainerJourneyResponseDtoSchema = z + .object({ + id: z.string(), + number: z.string(), + journeys: z.array(ContainerJourneyDtoSchema).readonly(), + packageNumbers: z.array(z.string()).readonly(), + }) + .readonly(); + export type ContainerJourneyResponseDto = z.infer; + + /** + * ContainerFilterDtoSchema + * @type { object } + * @property { number[] } companyIds + * @property { string } search + */ + export const ContainerFilterDtoSchema = z + .object({ companyIds: z.array(z.number()).readonly(), search: z.string() }) + .readonly(); + export type ContainerFilterDto = z.infer; + + /** + * ControlTowerContainersFindAllOrderParamEnumSchema + * @type { enum } + */ + export const ControlTowerContainersFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); + export type ControlTowerContainersFindAllOrderParamEnum = z.infer< + typeof ControlTowerContainersFindAllOrderParamEnumSchema + >; + export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainersFindAllOrderParamEnumSchema.enum; + + /** + * ControlTowerContainersFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ContainerListItemDto[] } items + */ + export const ControlTowerContainersFindAllResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ContainerListItemDtoSchema).readonly() }).readonly().shape, + }); + export type ControlTowerContainersFindAllResponse = z.infer; +} diff --git a/test/generated/dist/controlTowerContainers/controlTowerContainers.queries.ts b/test/generated/dist/controlTowerContainers/controlTowerContainers.queries.ts new file mode 100644 index 0000000..138e21d --- /dev/null +++ b/test/generated/dist/controlTowerContainers/controlTowerContainers.queries.ts @@ -0,0 +1,139 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; +import { ControlTowerContainersApi } from "./controlTowerContainers.api"; + +export namespace ControlTowerContainersQueries { + export const moduleName = QueryModule.ControlTowerContainers; + + export const keys = { + all: [moduleName] as const, + findAll: ( + limit?: number, + order?: string, + filter?: ControlTowerContainersModels.ContainerFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/containers", limit, order, filter, page, cursor] as const, + findAllInfinite: ( + limit?: number, + order?: string, + filter?: ControlTowerContainersModels.ContainerFilterDto, + cursor?: string, + ) => [...keys.all, "/containers", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/containers/:id", id] as const, + getJourney: (id: string) => [...keys.all, "/containers/:id/journey", id] as const, + }; + + /** + * Query `useFindAll` + * @description Lists containers + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ControlTowerContainersModels.ContainerFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => ControlTowerContainersApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `useFindAllInfinite + * @description Lists containers + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ControlTowerContainersModels.ContainerFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @description Returns a container with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => ControlTowerContainersApi.findById(id, config), + ...options, + }); + }; + + /** + * Query `useGetJourney` + * @description Returns the journey and package numbers of a container with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetJourney = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getJourney(id), + queryFn: () => ControlTowerContainersApi.getJourney(id, config), + ...options, + }); + }; +} diff --git a/test/generated/dist/controlTowerMe/controlTowerMe.api.ts b/test/generated/dist/controlTowerMe/controlTowerMe.api.ts new file mode 100644 index 0000000..07b2631 --- /dev/null +++ b/test/generated/dist/controlTowerMe/controlTowerMe.api.ts @@ -0,0 +1,49 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerMeModels } from "./controlTowerMe.models"; + +export namespace ControlTowerMeApi { + export const getUserProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, `/me`, config); + }; + export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, + `/me`, + ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), + config, + ); + }; + export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, + `/me/basic`, + ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), + config, + ); + }; + export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/password`, + ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), + config, + ); + }; + export const updateEmailPreferences = ( + data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/email-preferences`, + ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), + config, + ); + }; + export const updateProjectAccess = (config?: AxiosRequestConfig) => { + return AppRestClient.put({ resSchema: z.void() }, `/me/access`, undefined, config); + }; +} diff --git a/test/generated/dist/controlTowerMe/controlTowerMe.models.ts b/test/generated/dist/controlTowerMe/controlTowerMe.models.ts new file mode 100644 index 0000000..9b37d77 --- /dev/null +++ b/test/generated/dist/controlTowerMe/controlTowerMe.models.ts @@ -0,0 +1,225 @@ +import { z } from "zod"; + +export namespace ControlTowerMeModels { + /** + * LinksDtoSchema + * @type { object } + * @property { string } self + * @property { string } related + */ + export const LinksDtoSchema = z.object({ self: z.string(), related: z.string() }).readonly(); + export type LinksDto = z.infer; + + /** + * ApiResponseDataDtoSchema + * @type { object } + * @property { string } type + * @property { string } id + * @property { object } attributes + * @property { object } relationships + * @property { LinksDto } links + */ + export const ApiResponseDataDtoSchema = z + .object({ + type: z.string(), + id: z.string(), + attributes: z.object({}).readonly().nullish(), + relationships: z.object({}).readonly().nullish(), + links: LinksDtoSchema.nullish(), + }) + .readonly(); + export type ApiResponseDataDto = z.infer; + + /** + * PaginationLinksDtoSchema + * @type { object } + * @property { string } next + * @property { string } self + * @property { string } last + */ + export const PaginationLinksDtoSchema = z.object({ next: z.string(), self: z.string(), last: z.string() }).readonly(); + export type PaginationLinksDto = z.infer; + + /** + * ApiResponseDtoSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + */ + export const ApiResponseDtoSchema = z + .object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }) + .readonly(); + export type ApiResponseDto = z.infer; + + /** + * DelayNotificationEnumSchema + * @type { enum } + */ + export const DelayNotificationEnumSchema = z.enum(["EveryDelay", "LongerThan24Hours", "LongerThan3Days"]); + export type DelayNotificationEnum = z.infer; + export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; + + /** + * UserEmailPreferencesDtoSchema + * @type { object } + * @property { boolean } originDeparture + * @property { boolean } loadedOnVessel + * @property { boolean } destinationArrival + * @property { boolean } onsiteDelivery + * @property { DelayNotificationEnum } delay + */ + export const UserEmailPreferencesDtoSchema = z + .object({ + originDeparture: z.boolean(), + loadedOnVessel: z.boolean(), + destinationArrival: z.boolean(), + onsiteDelivery: z.boolean(), + delay: DelayNotificationEnumSchema, + }) + .readonly(); + export type UserEmailPreferencesDto = z.infer; + + /** + * UserProjectAccessDtoSchema + * @type { object } + * @property { string[] } projectIds + */ + export const UserProjectAccessDtoSchema = z.object({ projectIds: z.array(z.string()).readonly() }).readonly(); + export type UserProjectAccessDto = z.infer; + + /** + * UserRoleEnumSchema + * @type { enum } + */ + export const UserRoleEnumSchema = z.enum(["User", "Admin"]); + export type UserRoleEnum = z.infer; + export const UserRoleEnum = UserRoleEnumSchema.enum; + + /** + * UserDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } name Min Length: `3` + * @property { string } email + * @property { UserEmailPreferencesDto } emailPreferences + * @property { UserProjectAccessDto } projectAccess + * @property { UserRoleEnum } role + * @property { boolean } isAdmin + */ + export const UserDetailDtoSchema = z + .object({ + id: z.string(), + name: z.string().min(3), + email: z.email(), + emailPreferences: UserEmailPreferencesDtoSchema.nullable(), + projectAccess: UserProjectAccessDtoSchema.nullable(), + role: UserRoleEnumSchema.nullable(), + isAdmin: z.boolean(), + }) + .readonly(); + export type UserDetailDto = z.infer; + + /** + * UserEmailPreferencesUpdateDtoSchema + * @type { object } + * @property { boolean } originDeparture + * @property { boolean } loadedOnVessel + * @property { boolean } destinationArrival + * @property { boolean } onsiteDelivery + * @property { DelayNotificationEnum } delay + */ + export const UserEmailPreferencesUpdateDtoSchema = z + .object({ + originDeparture: z.boolean(), + loadedOnVessel: z.boolean(), + destinationArrival: z.boolean(), + onsiteDelivery: z.boolean(), + delay: DelayNotificationEnumSchema, + }) + .readonly(); + export type UserEmailPreferencesUpdateDto = z.infer; + + /** + * UserProjectAccessUpdateDtoSchema + * @type { object } + * @property { number[] } projectIds + */ + export const UserProjectAccessUpdateDtoSchema = z.object({ projectIds: z.array(z.number()).readonly() }).readonly(); + export type UserProjectAccessUpdateDto = z.infer; + + /** + * UserUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } password + * @property { UserEmailPreferencesUpdateDto } emailPreferences + * @property { UserProjectAccessUpdateDto } projectAccess + */ + export const UserUpdateDtoSchema = z + .object({ + name: z.string(), + email: z.email(), + password: z.string(), + emailPreferences: UserEmailPreferencesUpdateDtoSchema, + projectAccess: UserProjectAccessUpdateDtoSchema, + }) + .readonly(); + export type UserUpdateDto = z.infer; + + /** + * UserBasicUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + */ + export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }).readonly(); + export type UserBasicUpdateDto = z.infer; + + /** + * UserPasswordUpdateDtoSchema + * @type { object } + * @property { string } password + */ + export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }).readonly(); + export type UserPasswordUpdateDto = z.infer; + + /** + * GetUserProfileResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ + export const GetUserProfileResponseSchema = z.object({ + ...ApiResponseDtoSchema.shape, + ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, + }); + export type GetUserProfileResponse = z.infer; + + /** + * UpdateUserDataResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ + export const UpdateUserDataResponseSchema = z.object({ + ...ApiResponseDtoSchema.shape, + ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, + }); + export type UpdateUserDataResponse = z.infer; + + /** + * UpdateUserProfileResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ + export const UpdateUserProfileResponseSchema = z.object({ + ...ApiResponseDtoSchema.shape, + ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, + }); + export type UpdateUserProfileResponse = z.infer; +} diff --git a/test/generated/dist/controlTowerMe/controlTowerMe.queries.ts b/test/generated/dist/controlTowerMe/controlTowerMe.queries.ts new file mode 100644 index 0000000..9b5825c --- /dev/null +++ b/test/generated/dist/controlTowerMe/controlTowerMe.queries.ts @@ -0,0 +1,169 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerMeModels } from "./controlTowerMe.models"; +import { ControlTowerMeApi } from "./controlTowerMe.api"; + +export namespace ControlTowerMeQueries { + export const moduleName = QueryModule.ControlTowerMe; + + export const keys = { + all: [moduleName] as const, + getUserProfile: () => [...keys.all, "/me"] as const, + }; + + /** + * Query `useGetUserProfile` + * @description Get basic user profile data + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200] + */ + export const useGetUserProfile = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getUserProfile(), + queryFn: () => ControlTowerMeApi.getUserProfile(config), + ...options, + }); + }; + + /** + * Mutation `useUpdateUserData` + * @description Update user data + * @param { ControlTowerMeModels.UserUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ + export const useUpdateUserData = ( + options?: AppMutationOptions< + typeof ControlTowerMeApi.updateUserData, + { data: ControlTowerMeModels.UserUpdateDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerMeApi.updateUserData(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateUserProfile` + * @description Update basic user profile data + * @param { ControlTowerMeModels.UserBasicUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ + export const useUpdateUserProfile = ( + options?: AppMutationOptions< + typeof ControlTowerMeApi.updateUserProfile, + { data: ControlTowerMeModels.UserBasicUpdateDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerMeApi.updateUserProfile(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdatePassword` + * @description Update user password + * @param { ControlTowerMeModels.UserPasswordUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ + export const useUpdatePassword = ( + options?: AppMutationOptions< + typeof ControlTowerMeApi.updatePassword, + { data: ControlTowerMeModels.UserPasswordUpdateDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerMeApi.updatePassword(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateEmailPreferences` + * @description Update user email notification preferences + * @param { ControlTowerMeModels.UserEmailPreferencesUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ + export const useUpdateEmailPreferences = ( + options?: AppMutationOptions< + typeof ControlTowerMeApi.updateEmailPreferences, + { data: ControlTowerMeModels.UserEmailPreferencesUpdateDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => ControlTowerMeApi.updateEmailPreferences(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateProjectAccess` + * @description Update user project access + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ + export const useUpdateProjectAccess = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: () => ControlTowerMeApi.updateProjectAccess(config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/controlTowerPackages/controlTowerPackages.api.ts b/test/generated/dist/controlTowerPackages/controlTowerPackages.api.ts new file mode 100644 index 0000000..c98ec95 --- /dev/null +++ b/test/generated/dist/controlTowerPackages/controlTowerPackages.api.ts @@ -0,0 +1,47 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; + +export namespace ControlTowerPackagesApi { + export const findAll = ( + limit: number, + order?: string, + filter?: ControlTowerPackagesModels.PackageFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, + `/packages`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/dist/controlTowerPackages/controlTowerPackages.configs.ts b/test/generated/dist/controlTowerPackages/controlTowerPackages.configs.ts new file mode 100644 index 0000000..ae15a46 --- /dev/null +++ b/test/generated/dist/controlTowerPackages/controlTowerPackages.configs.ts @@ -0,0 +1,49 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; +import { ControlTowerPackagesQueries } from "./controlTowerPackages.queries"; + +export namespace ControlTowerPackagesConfigs { + export const packagesConfig = { + meta: { + title: "Packages", + }, + readAll: { + schema: ControlTowerPackagesModels.PackageListItemDtoSchema, + paginated: ControlTowerPackagesQueries.useFindAll, + infinite: ControlTowerPackagesQueries.useFindAllInfinite, + filters: { + schema: ControlTowerPackagesModels.PackageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerPackagesModels.PackageFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ControlTowerPackagesModels.PackageListItemDtoSchema, + options: { + columns: { + packageNumber: true, + bookingId: true, + id: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/controlTowerPackages/controlTowerPackages.models.ts b/test/generated/dist/controlTowerPackages/controlTowerPackages.models.ts new file mode 100644 index 0000000..d5f8c5a --- /dev/null +++ b/test/generated/dist/controlTowerPackages/controlTowerPackages.models.ts @@ -0,0 +1,74 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerPackagesModels { + /** + * PackageListItemDtoSchema + * @type { object } + * @property { string } packageNumber + * @property { string } bookingId + * @property { string } id + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ + export const PackageListItemDtoSchema = z + .object({ + packageNumber: z.string(), + bookingId: z.string(), + id: z.string(), + ets: z.iso.datetime({ offset: true }).nullable(), + eta: z.iso.datetime({ offset: true }).nullable(), + supplierName: z.string().nullable(), + supplierAddress: z.string().nullable(), + lastEvent: z.string().nullable(), + lastEventLocation: z.string().nullable(), + lastEventDate: z.iso.datetime({ offset: true }).nullable(), + journeyFrom: z.string().nullable(), + journeyTo: z.string().nullable(), + vessel: CommonModels.VesselDtoSchema.nullable(), + }) + .readonly(); + export type PackageListItemDto = z.infer; + + /** + * PackageFilterDtoSchema + * @type { object } + * @property { string } search Min Length: `1` + */ + export const PackageFilterDtoSchema = z.object({ search: z.string().min(1) }).readonly(); + export type PackageFilterDto = z.infer; + + /** + * ControlTowerPackagesFindAllOrderParamEnumSchema + * @type { enum } + */ + export const ControlTowerPackagesFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); + export type ControlTowerPackagesFindAllOrderParamEnum = z.infer< + typeof ControlTowerPackagesFindAllOrderParamEnumSchema + >; + export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFindAllOrderParamEnumSchema.enum; + + /** + * ControlTowerPackagesFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PackageListItemDto[] } items + */ + export const ControlTowerPackagesFindAllResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PackageListItemDtoSchema).readonly() }).readonly().shape, + }); + export type ControlTowerPackagesFindAllResponse = z.infer; +} diff --git a/test/generated/dist/controlTowerPackages/controlTowerPackages.queries.ts b/test/generated/dist/controlTowerPackages/controlTowerPackages.queries.ts new file mode 100644 index 0000000..9db4707 --- /dev/null +++ b/test/generated/dist/controlTowerPackages/controlTowerPackages.queries.ts @@ -0,0 +1,97 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; +import { ControlTowerPackagesApi } from "./controlTowerPackages.api"; + +export namespace ControlTowerPackagesQueries { + export const moduleName = QueryModule.ControlTowerPackages; + + export const keys = { + all: [moduleName] as const, + findAll: ( + limit?: number, + order?: string, + filter?: ControlTowerPackagesModels.PackageFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/packages", limit, order, filter, page, cursor] as const, + findAllInfinite: ( + limit?: number, + order?: string, + filter?: ControlTowerPackagesModels.PackageFilterDto, + cursor?: string, + ) => [...keys.all, "/packages", "infinite", limit, order, filter, cursor] as const, + }; + + /** + * Query `useFindAll` + * @description Lists packages + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: ControlTowerPackagesModels.PackageFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `useFindAllInfinite + * @description Lists packages + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: ControlTowerPackagesModels.PackageFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/controlTowerSearch/controlTowerSearch.api.ts b/test/generated/dist/controlTowerSearch/controlTowerSearch.api.ts new file mode 100644 index 0000000..862a8ac --- /dev/null +++ b/test/generated/dist/controlTowerSearch/controlTowerSearch.api.ts @@ -0,0 +1,30 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerSearchModels } from "./controlTowerSearch.models"; + +export namespace ControlTowerSearchApi { + export const search = ( + data: ControlTowerSearchModels.SearchRequestDto, + type?: ControlTowerSearchModels.SearchItemTypeEnum, + limit?: number, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, + `/search`, + ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), + { + ...config, + params: { + type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { + type: "query", + name: "type", + }), + limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), + }, + }, + ); + }; +} diff --git a/test/generated/dist/controlTowerSearch/controlTowerSearch.models.ts b/test/generated/dist/controlTowerSearch/controlTowerSearch.models.ts new file mode 100644 index 0000000..c66a4c7 --- /dev/null +++ b/test/generated/dist/controlTowerSearch/controlTowerSearch.models.ts @@ -0,0 +1,51 @@ +import { z } from "zod"; + +export namespace ControlTowerSearchModels { + /** + * SearchItemTypeEnumSchema + * @type { enum } + */ + export const SearchItemTypeEnumSchema = z.enum(["Project", "Booking", "Container"]); + export type SearchItemTypeEnum = z.infer; + export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; + + /** + * SearchItemDtoSchema + * @type { object } + * @property { SearchItemTypeEnum } type + * @property { string } id + * @property { string } label + */ + export const SearchItemDtoSchema = z + .object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }) + .readonly(); + export type SearchItemDto = z.infer; + + /** + * SearchResponseDtoSchema + * @type { object } + * @property { SearchItemDto[] } items + * @property { number } projectsCount + * @property { number } bookingsCount + * @property { number } containersCount + * @property { number } totalCount + */ + export const SearchResponseDtoSchema = z + .object({ + items: z.array(SearchItemDtoSchema).readonly(), + projectsCount: z.number(), + bookingsCount: z.number(), + containersCount: z.number(), + totalCount: z.number(), + }) + .readonly(); + export type SearchResponseDto = z.infer; + + /** + * SearchRequestDtoSchema + * @type { object } + * @property { string } search + */ + export const SearchRequestDtoSchema = z.object({ search: z.string() }).readonly(); + export type SearchRequestDto = z.infer; +} diff --git a/test/generated/dist/controlTowerSearch/controlTowerSearch.queries.ts b/test/generated/dist/controlTowerSearch/controlTowerSearch.queries.ts new file mode 100644 index 0000000..2ee15d8 --- /dev/null +++ b/test/generated/dist/controlTowerSearch/controlTowerSearch.queries.ts @@ -0,0 +1,44 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerSearchModels } from "./controlTowerSearch.models"; +import { ControlTowerSearchApi } from "./controlTowerSearch.api"; + +export namespace ControlTowerSearchQueries { + export const moduleName = QueryModule.ControlTowerSearch; + + /** + * Mutation `useSearch` + * @param { ControlTowerSearchModels.SearchRequestDto } mutation.data Body parameter + * @param { ControlTowerSearchModels.SearchItemTypeEnum } mutation.type Query parameter + * @param { number } mutation.limit Query parameter. Minimum: `1` + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useSearch = ( + options?: AppMutationOptions< + typeof ControlTowerSearchApi.search, + { + data: ControlTowerSearchModels.SearchRequestDto; + type?: ControlTowerSearchModels.SearchItemTypeEnum; + limit?: number; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data, type, limit }) => ControlTowerSearchApi.search(data, type, limit, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/countries/countries.acl.ts b/test/generated/dist/countries/countries.acl.ts new file mode 100644 index 0000000..f8322d8 --- /dev/null +++ b/test/generated/dist/countries/countries.acl.ts @@ -0,0 +1,21 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CountriesAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; + + /** + * Use for `usePaginateCountryLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCountryLabels` query + */ + export const canUsePaginateCountryLabels = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; + + /** + * Use for `useGetCountryById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCountryById` query + */ + export const canUseGetCountryById = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; +} diff --git a/test/generated/dist/countries/countries.api.ts b/test/generated/dist/countries/countries.api.ts new file mode 100644 index 0000000..4782b3e --- /dev/null +++ b/test/generated/dist/countries/countries.api.ts @@ -0,0 +1,85 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CountriesModels } from "./countries.models"; + +export namespace CountriesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CountriesModels.CountriesPaginateResponseSchema }, `/countries/paginate`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const paginateCountryLabels = ( + limit: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, + `/countries/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const getCountryById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: CountriesModels.CountryResponseDTOSchema }, `/countries/${id}`, config); + }; +} diff --git a/test/generated/dist/countries/countries.configs.ts b/test/generated/dist/countries/countries.configs.ts new file mode 100644 index 0000000..44ddf5b --- /dev/null +++ b/test/generated/dist/countries/countries.configs.ts @@ -0,0 +1,83 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CountriesModels } from "./countries.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CountriesQueries } from "./countries.queries"; +import { CountriesAcl } from "./countries.acl"; + +export namespace CountriesConfigs { + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CountriesAcl.canUsePaginate, + schema: CountriesModels.CountryResponseDTOSchema, + paginated: CountriesQueries.usePaginate, + infinite: CountriesQueries.usePaginateInfinite, + filters: { + schema: CountriesModels.CountryPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CountriesModels.CountryPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CountriesModels.CountryResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + isoCode2: true, + isoCode3: true, + currencyNotation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CountriesModels.CountriesPaginateOrderParamEnumSchema, + }, + }), + }, + }; + + export const labelsPaginateConfig = { + meta: { + title: "Labels Paginate", + }, + readAll: { + acl: CountriesAcl.canUsePaginateCountryLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CountriesQueries.usePaginateCountryLabels, + infinite: CountriesQueries.usePaginateCountryLabelsInfinite, + filters: { + schema: CountriesModels.CountryPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CountriesModels.CountryPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CountriesModels.PaginateCountryLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/countries/countries.models.ts b/test/generated/dist/countries/countries.models.ts new file mode 100644 index 0000000..50d14ae --- /dev/null +++ b/test/generated/dist/countries/countries.models.ts @@ -0,0 +1,117 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CountriesModels { + /** + * CountryEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CountryEmployeeDTO = z.infer; + + /** + * CountryResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the country + * @property { string } name Name of the country + * @property { string } isoCode2 ISO 2-letter code + * @property { string } isoCode3 ISO 3-letter code + * @property { string } currencyNotation Currency notation + * @property { string } createdById + * @property { CountryEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CountryEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const CountryResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the country"), + name: z.string().describe("Name of the country"), + isoCode2: z.string().describe("ISO 2-letter code"), + isoCode3: z.string().describe("ISO 3-letter code"), + currencyNotation: z.string().describe("Currency notation"), + createdById: z.string().nullish(), + createdBy: CountryEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: CountryEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type CountryResponseDTO = z.infer; + + /** + * CountryPaginationFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const CountryPaginationFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type CountryPaginationFilterDto = z.infer; + + /** + * CountriesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const CountriesPaginateOrderParamEnumSchema = z.enum([ + "name", + "isoCode2", + "isoCode3", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type CountriesPaginateOrderParamEnum = z.infer; + export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSchema.enum; + + /** + * CountriesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CountryResponseDTO[] } items + */ + export const CountriesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CountryResponseDTOSchema).readonly() }).readonly().shape, + }); + export type CountriesPaginateResponse = z.infer; + + /** + * PaginateCountryLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PaginateCountryLabelsOrderParamEnumSchema = z.enum([ + "name", + "isoCode2", + "isoCode3", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PaginateCountryLabelsOrderParamEnum = z.infer; + export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderParamEnumSchema.enum; + + /** + * PaginateCountryLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PaginateCountryLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PaginateCountryLabelsResponse = z.infer; +} diff --git a/test/generated/dist/countries/countries.queries.ts b/test/generated/dist/countries/countries.queries.ts new file mode 100644 index 0000000..437d0c0 --- /dev/null +++ b/test/generated/dist/countries/countries.queries.ts @@ -0,0 +1,233 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CountriesAcl } from "./countries.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { CountriesModels } from "./countries.models"; +import { CountriesApi } from "./countries.api"; + +export namespace CountriesQueries { + export const moduleName = QueryModule.Countries; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/countries/paginate", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/countries/paginate", "infinite", limit, order, filter, cursor] as const, + paginateCountryLabels: ( + limit?: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/countries/labels/paginate", limit, order, filter, page, cursor] as const, + paginateCountryLabelsInfinite: ( + limit?: number, + order?: string, + filter?: CountriesModels.CountryPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/countries/labels/paginate", "infinite", limit, order, filter, cursor] as const, + getCountryById: (id: string) => [...keys.all, "/countries/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Countries + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CountriesModels.CountryPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CountriesAcl.canUsePaginate()); + return CountriesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Countries + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CountriesModels.CountryPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CountriesAcl.canUsePaginate()); + return CountriesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateCountryLabels` + * @summary Paginate country labels (id and name only) + * @permission Requires `canUsePaginateCountryLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCountryLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CountriesModels.CountryPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CountriesAcl.canUsePaginateCountryLabels()); + return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateCountryLabelsInfinite + * @summary Paginate country labels (id and name only) + * @permission Requires `canUsePaginateCountryLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCountryLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CountriesModels.CountryPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CountriesAcl.canUsePaginateCountryLabels()); + return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetCountryById` + * @summary Get country by ID with complete details + * @permission Requires `canUseGetCountryById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCountryById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCountryById(id), + queryFn: () => { + checkAcl(CountriesAcl.canUseGetCountryById()); + return CountriesApi.getCountryById(id, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/currencies/currencies.acl.ts b/test/generated/dist/currencies/currencies.acl.ts new file mode 100644 index 0000000..6756e17 --- /dev/null +++ b/test/generated/dist/currencies/currencies.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CurrenciesAcl { + /** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; + + /** + * Use for `useCreateCurrency` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCurrency` mutation + */ + export const canUseCreateCurrency = () => ["Create", "Currency"] as AbilityTuple<"Create", "Currency">; + + /** + * Use for `usePaginateCurrencyLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabels` query + */ + export const canUsePaginateCurrencyLabels = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; + + /** + * Use for `useGetCurrencyById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCurrencyById` query + */ + export const canUseGetCurrencyById = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; + + /** + * Use for `useUpdateCurrency` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCurrency` mutation + */ + export const canUseUpdateCurrency = () => ["Update", "Currency"] as AbilityTuple<"Update", "Currency">; + + /** + * Use for `usePaginateCurrencyLabelsByOffice` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabelsByOffice` query + */ + export const canUsePaginateCurrencyLabelsByOffice = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; +} diff --git a/test/generated/dist/currencies/currencies.api.ts b/test/generated/dist/currencies/currencies.api.ts new file mode 100644 index 0000000..80a7d39 --- /dev/null +++ b/test/generated/dist/currencies/currencies.api.ts @@ -0,0 +1,149 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CurrenciesModels } from "./currencies.models"; + +export namespace CurrenciesApi { + export const list = ( + limit: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CurrenciesModels.CurrenciesListResponseSchema }, `/currencies`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies`, + ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), + config, + ); + }; + export const paginateCurrencyLabels = ( + limit: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, + `/currencies/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const getCurrencyById = (isoCode: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies/${isoCode}`, + config, + ); + }; + export const updateCurrency = ( + isoCode: string, + data: CurrenciesModels.UpdateCurrencyRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies/${isoCode}`, + ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), + config, + ); + }; + export const paginateCurrencyLabelsByOffice = ( + officeId: string, + limit: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, + `/offices/${officeId}/currencies/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/dist/currencies/currencies.configs.ts b/test/generated/dist/currencies/currencies.configs.ts new file mode 100644 index 0000000..0496bec --- /dev/null +++ b/test/generated/dist/currencies/currencies.configs.ts @@ -0,0 +1,152 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CurrenciesModels } from "./currencies.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CurrenciesQueries } from "./currencies.queries"; +import { CurrenciesAcl } from "./currencies.acl"; + +export namespace CurrenciesConfigs { + export const currenciesConfig = { + meta: { + title: "Currencies", + }, + readAll: { + acl: CurrenciesAcl.canUseList, + schema: CurrenciesModels.CurrencyResponseDtoSchema, + paginated: CurrenciesQueries.useList, + infinite: CurrenciesQueries.useListInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CurrenciesModels.CurrencyResponseDtoSchema, + options: { + columns: { + isoCode: true, + name: true, + symbol: true, + alignment: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CurrenciesModels.CurrenciesListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: CurrenciesAcl.canUseGetCurrencyById, + schema: CurrenciesModels.CurrencyResponseDtoSchema, + query: CurrenciesQueries.useGetCurrencyById, + }, + create: { + acl: CurrenciesAcl.canUseCreateCurrency, + schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, + mutation: CurrenciesQueries.useCreateCurrency, + inputDefs: dynamicInputs({ + schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, + options: { + inputs: { + isoCode: true, + name: true, + symbol: true, + alignment: true, + }, + }, + }), + }, + update: { + acl: CurrenciesAcl.canUseUpdateCurrency, + schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, + mutation: CurrenciesQueries.useUpdateCurrency, + inputDefs: dynamicInputs({ + schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CurrenciesAcl.canUsePaginateCurrencyLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CurrenciesQueries.usePaginateCurrencyLabels, + infinite: CurrenciesQueries.usePaginateCurrencyLabelsInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema, + }, + }), + }, + }; + + export const labelsPaginateConfig = { + meta: { + title: "Labels Paginate", + }, + readAll: { + acl: CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CurrenciesQueries.usePaginateCurrencyLabelsByOffice, + infinite: CurrenciesQueries.usePaginateCurrencyLabelsByOfficeInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/currencies/currencies.models.ts b/test/generated/dist/currencies/currencies.models.ts new file mode 100644 index 0000000..7330e3c --- /dev/null +++ b/test/generated/dist/currencies/currencies.models.ts @@ -0,0 +1,175 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CurrenciesModels { + /** + * CurrencyEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CurrencyEmployeeDTO = z.infer; + + /** + * CurrencyResponseDtoSchema + * @type { object } + * @property { string } isoCode isoCode of the currency + * @property { string } name Name of the currency + * @property { string } symbol Symbol of the currency + * @property { string } alignment Alignment of the currency + * @property { string } createdById ID of the employee who created this currency + * @property { CurrencyEmployeeDTO } createdBy Employee who created this currency + * @property { string } createdAt Date when the currency was created + * @property { string } updatedById ID of the employee who last updated this currency + * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency + * @property { string } updatedAt Date when the currency was last updated + */ + export const CurrencyResponseDtoSchema = z + .object({ + isoCode: z.string().describe("isoCode of the currency"), + name: z.string().describe("Name of the currency"), + symbol: z.string().describe("Symbol of the currency").nullish(), + alignment: z.string().describe("Alignment of the currency").nullish(), + createdById: z.string().describe("ID of the employee who created this currency").nullish(), + createdBy: CurrencyEmployeeDTOSchema.describe("Employee who created this currency").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Date when the currency was created"), + updatedById: z.string().describe("ID of the employee who last updated this currency").nullish(), + updatedBy: CurrencyEmployeeDTOSchema.describe("Employee who last updated this currency").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Date when the currency was last updated"), + }) + .readonly(); + export type CurrencyResponseDto = z.infer; + + /** + * CurrencyPaginationFilterDtoSchema + * @type { object } + * @property { string } officeId + * @property { string } search + */ + export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string(), search: z.string() }).readonly(); + export type CurrencyPaginationFilterDto = z.infer; + + /** + * CreateCurrencyRequestDTOSchema + * @type { object } + * @property { string } isoCode Unique identifier for the currency + * @property { string } name Name of the currency + * @property { string } symbol Symbol of the currency + * @property { string } alignment Alignment of the currency + */ + export const CreateCurrencyRequestDTOSchema = z + .object({ + isoCode: z.string().describe("Unique identifier for the currency"), + name: z.string().describe("Name of the currency"), + symbol: z.string().describe("Symbol of the currency"), + alignment: z.string().describe("Alignment of the currency"), + }) + .readonly(); + export type CreateCurrencyRequestDTO = z.infer; + + /** + * UpdateCurrencyRequestDTOSchema + * @type { object } + * @property { string } name Name of the currency + */ + export const UpdateCurrencyRequestDTOSchema = z + .object({ name: z.string().describe("Name of the currency") }) + .readonly(); + export type UpdateCurrencyRequestDTO = z.infer; + + /** + * CurrenciesListOrderParamEnumSchema + * @type { enum } + */ + export const CurrenciesListOrderParamEnumSchema = z.enum([ + "isoCode", + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type CurrenciesListOrderParamEnum = z.infer; + export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.enum; + + /** + * CurrenciesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CurrencyResponseDto[] } items + */ + export const CurrenciesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CurrencyResponseDtoSchema).readonly() }).readonly().shape, + }); + export type CurrenciesListResponse = z.infer; + + /** + * PaginateCurrencyLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PaginateCurrencyLabelsOrderParamEnumSchema = z.enum([ + "isoCode", + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PaginateCurrencyLabelsOrderParamEnum = z.infer; + export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderParamEnumSchema.enum; + + /** + * PaginateCurrencyLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PaginateCurrencyLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PaginateCurrencyLabelsResponse = z.infer; + + /** + * PaginateCurrencyLabelsByOfficeOrderParamEnumSchema + * @type { enum } + */ + export const PaginateCurrencyLabelsByOfficeOrderParamEnumSchema = z.enum([ + "isoCode", + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PaginateCurrencyLabelsByOfficeOrderParamEnum = z.infer< + typeof PaginateCurrencyLabelsByOfficeOrderParamEnumSchema + >; + export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabelsByOfficeOrderParamEnumSchema.enum; + + /** + * PaginateCurrencyLabelsByOfficeResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PaginateCurrencyLabelsByOfficeResponse = z.infer; +} diff --git a/test/generated/dist/currencies/currencies.queries.ts b/test/generated/dist/currencies/currencies.queries.ts new file mode 100644 index 0000000..6845288 --- /dev/null +++ b/test/generated/dist/currencies/currencies.queries.ts @@ -0,0 +1,431 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CurrenciesAcl } from "./currencies.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CurrenciesModels } from "./currencies.models"; +import { CurrenciesApi } from "./currencies.api"; + +export namespace CurrenciesQueries { + export const moduleName = QueryModule.Currencies; + + export const keys = { + all: [moduleName] as const, + list: ( + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/currencies", limit, order, filter, page, cursor] as const, + listInfinite: ( + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/currencies", "infinite", limit, order, filter, cursor] as const, + paginateCurrencyLabels: ( + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/currencies/labels/paginate", limit, order, filter, page, cursor] as const, + paginateCurrencyLabelsInfinite: ( + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/currencies/labels/paginate", "infinite", limit, order, filter, cursor] as const, + getCurrencyById: (isoCode: string) => [...keys.all, "/currencies/:isoCode", isoCode] as const, + paginateCurrencyLabelsByOffice: ( + officeId: string, + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/currencies/labels/paginate", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateCurrencyLabelsByOfficeInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: CurrenciesModels.CurrencyPaginationFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/currencies/labels/paginate", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useList` + * @summary List Currencies + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CurrenciesModels.CurrencyPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUseList()); + return CurrenciesApi.list(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List Currencies + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CurrenciesModels.CurrencyPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUseList()); + return CurrenciesApi.list(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreateCurrency` + * @summary Create Currency + * @permission Requires `canUseCreateCurrency` ability + * @param { CurrenciesModels.CreateCurrencyRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateCurrency = ( + options?: AppMutationOptions< + typeof CurrenciesApi.createCurrency, + { data: CurrenciesModels.CreateCurrencyRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CurrenciesAcl.canUseCreateCurrency()); + return CurrenciesApi.createCurrency(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateCurrencyLabels` + * @summary Paginate Currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCurrencyLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CurrenciesModels.CurrencyPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateCurrencyLabelsInfinite + * @summary Paginate Currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCurrencyLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CurrenciesModels.CurrencyPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetCurrencyById` + * @summary Get Currency by iso code + * @permission Requires `canUseGetCurrencyById` ability + * @param { string } object.isoCode Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCurrencyById = ( + { isoCode }: { isoCode: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCurrencyById(isoCode), + queryFn: () => { + checkAcl(CurrenciesAcl.canUseGetCurrencyById()); + return CurrenciesApi.getCurrencyById(isoCode, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCurrency` + * @summary Update Currency + * @permission Requires `canUseUpdateCurrency` ability + * @param { string } mutation.isoCode Path parameter + * @param { CurrenciesModels.UpdateCurrencyRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCurrency = ( + options?: AppMutationOptions< + typeof CurrenciesApi.updateCurrency, + { isoCode: string; data: CurrenciesModels.UpdateCurrencyRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ isoCode, data }) => { + checkAcl(CurrenciesAcl.canUseUpdateCurrency()); + return CurrenciesApi.updateCurrency(isoCode, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { isoCode } = variables; + const updateKeys = [keys.getCurrencyById(isoCode)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateCurrencyLabelsByOffice` + * @summary Paginate office currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCurrencyLabelsByOffice = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CurrenciesModels.CurrencyPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateCurrencyLabelsByOfficeInfinite + * @summary Paginate office currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateCurrencyLabelsByOfficeInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CurrenciesModels.CurrencyPaginationFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/customerAccount/customerAccount.api.ts b/test/generated/dist/customerAccount/customerAccount.api.ts new file mode 100644 index 0000000..f109278 --- /dev/null +++ b/test/generated/dist/customerAccount/customerAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { CustomerAccountModels } from "./customerAccount.models"; + +export namespace CustomerAccountApi { + export const get = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, + `/customers/account`, + config, + ); + }; +} diff --git a/test/generated/dist/customerAccount/customerAccount.models.ts b/test/generated/dist/customerAccount/customerAccount.models.ts new file mode 100644 index 0000000..c89279e --- /dev/null +++ b/test/generated/dist/customerAccount/customerAccount.models.ts @@ -0,0 +1,51 @@ +import { z } from "zod"; + +export namespace CustomerAccountModels { + /** + * CustomerCompanyDtoSchema + * @type { object } + * @property { string } id Company ID + * @property { string } name Company name + */ + export const CustomerCompanyDtoSchema = z + .object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name").nullish() }) + .readonly(); + export type CustomerCompanyDto = z.infer; + + /** + * CustomerBusinessPartnerDtoSchema + * @type { object } + * @property { string } id Company ID + * @property { string } name Company name + */ + export const CustomerBusinessPartnerDtoSchema = z + .object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name") }) + .readonly(); + export type CustomerBusinessPartnerDto = z.infer; + + /** + * CustomerAccountDtoSchema + * @type { object } + * @property { array[] } aclRules Can hold any type of value + * @property { string } id Customer ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { CustomerCompanyDto } company Company + * @property { CustomerBusinessPartnerDto } businessPartner + */ + export const CustomerAccountDtoSchema = z + .object({ + aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), + id: z.string().describe("Customer ID"), + email: z.email().describe("Email"), + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + phone: z.string().describe("Phone number").nullish(), + company: CustomerCompanyDtoSchema.describe("Company").nullish(), + businessPartner: CustomerBusinessPartnerDtoSchema.nullish(), + }) + .readonly(); + export type CustomerAccountDto = z.infer; +} diff --git a/test/generated/dist/customerAccount/customerAccount.queries.ts b/test/generated/dist/customerAccount/customerAccount.queries.ts new file mode 100644 index 0000000..fbe2767 --- /dev/null +++ b/test/generated/dist/customerAccount/customerAccount.queries.ts @@ -0,0 +1,32 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { CustomerAccountApi } from "./customerAccount.api"; + +export namespace CustomerAccountQueries { + export const moduleName = QueryModule.CustomerAccount; + + export const keys = { + all: [moduleName] as const, + get: () => [...keys.all, "/customers/account"] as const, + }; + + /** + * Query `useGet` + * @summary Get profile of logged-in user + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.get(), + queryFn: () => CustomerAccountApi.get(config), + ...options, + }); + }; +} diff --git a/test/generated/dist/customers/customers.acl.ts b/test/generated/dist/customers/customers.acl.ts new file mode 100644 index 0000000..2e7c40d --- /dev/null +++ b/test/generated/dist/customers/customers.acl.ts @@ -0,0 +1,41 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CustomersAcl { + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Customer"] as AbilityTuple<"Create", "Customer">; + + /** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = () => ["Read", "Customer"] as AbilityTuple<"Read", "Customer">; + + /** + * Use for `useFindById` query ability. + * @description Read a customer with id + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "Customer"] as AbilityTuple<"Read", "Customer">; + + /** + * Use for `useUpdate` mutation ability. + * @description Update Customer + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Customer"] as AbilityTuple<"Update", "Customer">; + + /** + * Use for `useDeactivate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeactivate` mutation + */ + export const canUseDeactivate = () => ["Deactivate", "Customer"] as AbilityTuple<"Deactivate", "Customer">; + + /** + * Use for `useReactivate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReactivate` mutation + */ + export const canUseReactivate = () => ["Reactivate", "Customer"] as AbilityTuple<"Reactivate", "Customer">; +} diff --git a/test/generated/dist/customers/customers.api.ts b/test/generated/dist/customers/customers.api.ts new file mode 100644 index 0000000..075b13e --- /dev/null +++ b/test/generated/dist/customers/customers.api.ts @@ -0,0 +1,85 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CustomersModels } from "./customers.models"; + +export namespace CustomersApi { + export const findProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, `/customers/me`, config); + }; + export const create = (data: CustomersModels.CreateCustomerDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers`, + ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), + config, + ); + }; + export const list = ( + limit: number, + order?: string, + filter?: CustomersModels.CustomerPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: CustomersModels.CustomersListResponseSchema }, `/customers`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const findById = (customerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${customerId}`, + config, + ); + }; + export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${customerId}`, + ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), + config, + ); + }; + export const deactivate = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${id}/deactivate`, + undefined, + config, + ); + }; + export const reactivate = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${id}/reactivate`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/customers/customers.configs.ts b/test/generated/dist/customers/customers.configs.ts new file mode 100644 index 0000000..d9a2643 --- /dev/null +++ b/test/generated/dist/customers/customers.configs.ts @@ -0,0 +1,91 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CustomersModels } from "./customers.models"; +import { CustomersQueries } from "./customers.queries"; +import { CustomersAcl } from "./customers.acl"; + +export namespace CustomersConfigs { + export const customersConfig = { + meta: { + title: "Customers", + }, + readAll: { + acl: CustomersAcl.canUseList, + schema: CustomersModels.CustomerListItemDTOSchema, + paginated: CustomersQueries.useList, + infinite: CustomersQueries.useListInfinite, + filters: { + schema: CustomersModels.CustomerPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CustomersModels.CustomerPaginationFilterDtoSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + companyId: true, + businessPartnerId: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CustomersModels.CustomerListItemDTOSchema, + options: { + columns: { + id: true, + firstName: true, + lastName: true, + email: true, + phone: true, + companyId: true, + businessPartnerId: true, + businessPartner: true, + }, + sortable: CustomersModels.CustomersListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: CustomersAcl.canUseFindById, + schema: CustomersModels.CustomerResponseDTOSchema, + query: CustomersQueries.useFindById, + }, + create: { + acl: CustomersAcl.canUseCreate, + schema: CustomersModels.CreateCustomerDTOSchema, + mutation: CustomersQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CustomersModels.CreateCustomerDTOSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + phone: true, + companyId: true, + businessPartnerId: true, + }, + }, + }), + }, + update: { + acl: CustomersAcl.canUseUpdate, + schema: CustomersModels.UpdateCustomerDTOSchema, + mutation: CustomersQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CustomersModels.UpdateCustomerDTOSchema, + options: { + inputs: { + firstName: true, + lastName: true, + phone: true, + companyId: true, + businessPartnerId: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/dist/customers/customers.models.ts b/test/generated/dist/customers/customers.models.ts new file mode 100644 index 0000000..cc1328f --- /dev/null +++ b/test/generated/dist/customers/customers.models.ts @@ -0,0 +1,199 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CustomersModels { + /** + * CustomerProfileBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CustomerProfileBusinessPartnerDto = z.infer; + + /** + * CustomerProfileResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + * @property { CustomerProfileBusinessPartnerDto } businessPartner + */ + export const CustomerProfileResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the customer"), + firstName: z.string().describe("First name of the customer"), + lastName: z.string().describe("Last name of the customer"), + email: z.email().describe("Email of the customer"), + phone: z.string().describe("Phone number of the customer"), + companyId: z.string().describe("Company id of the customer").nullish(), + businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), + businessPartner: CustomerProfileBusinessPartnerDtoSchema.nullish(), + }) + .readonly(); + export type CustomerProfileResponseDTO = z.infer; + + /** + * CustomerBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CustomerBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CustomerBusinessPartnerResponseDto = z.infer; + + /** + * CustomerResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company Id of the customer + * @property { string } businessPartnerId Business partner Id of the customer + * @property { boolean } archived Wether the customer is archived + * @property { CustomerBusinessPartnerResponseDto } businessPartner + */ + export const CustomerResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the customer"), + firstName: z.string().describe("First name of the customer"), + lastName: z.string().describe("Last name of the customer"), + email: z.email().describe("Email of the customer"), + phone: z.string().describe("Phone number of the customer"), + companyId: z.string().describe("Company Id of the customer").nullish(), + businessPartnerId: z.string().describe("Business partner Id of the customer").nullish(), + archived: z.boolean().describe("Wether the customer is archived"), + businessPartner: CustomerBusinessPartnerResponseDtoSchema.nullish(), + }) + .readonly(); + export type CustomerResponseDTO = z.infer; + + /** + * CustomerListItemBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type CustomerListItemBusinessPartnerDto = z.infer; + + /** + * CustomerListItemDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + * @property { CustomerListItemBusinessPartnerDto } businessPartner + */ + export const CustomerListItemDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the customer"), + firstName: z.string().describe("First name of the customer"), + lastName: z.string().describe("Last name of the customer"), + email: z.string().describe("Email of the customer"), + phone: z.string().describe("Phone number of the customer"), + companyId: z.string().describe("Company id of the customer").nullish(), + businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), + businessPartner: CustomerListItemBusinessPartnerDtoSchema.nullish(), + }) + .readonly(); + export type CustomerListItemDTO = z.infer; + + /** + * CreateCustomerDTOSchema + * @type { object } + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + */ + export const CreateCustomerDTOSchema = z + .object({ + firstName: z.string().describe("First name of the customer"), + lastName: z.string().describe("Last name of the customer"), + email: z.email().describe("Email of the customer"), + phone: z.string().describe("Phone number of the customer").nullish(), + companyId: z.string().describe("Company id of the customer").nullish(), + businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), + }) + .readonly(); + export type CreateCustomerDTO = z.infer; + + /** + * CustomerPaginationFilterDtoSchema + * @type { object } + * @property { string } firstName + * @property { string } lastName + * @property { string } email + * @property { string } companyId + * @property { string } businessPartnerId + * @property { string } search + */ + export const CustomerPaginationFilterDtoSchema = z + .object({ + firstName: z.string(), + lastName: z.string(), + email: z.string(), + companyId: z.string(), + businessPartnerId: z.string(), + search: z.string(), + }) + .readonly(); + export type CustomerPaginationFilterDto = z.infer; + + /** + * UpdateCustomerDTOSchema + * @type { object } + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + */ + export const UpdateCustomerDTOSchema = z + .object({ + firstName: z.string().describe("First name of the customer"), + lastName: z.string().describe("Last name of the customer"), + phone: z.string().describe("Phone number of the customer"), + companyId: z.string().describe("Company id of the customer"), + businessPartnerId: z.string().describe("Business partner id of the customer"), + }) + .readonly(); + export type UpdateCustomerDTO = z.infer; + + /** + * CustomersListOrderParamEnumSchema + * @type { enum } + */ + export const CustomersListOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "createdAt"]); + export type CustomersListOrderParamEnum = z.infer; + export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enum; + + /** + * CustomersListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CustomerListItemDTO[] } items + */ + export const CustomersListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CustomerListItemDTOSchema).readonly() }).readonly().shape, + }); + export type CustomersListResponse = z.infer; +} diff --git a/test/generated/dist/customers/customers.queries.ts b/test/generated/dist/customers/customers.queries.ts new file mode 100644 index 0000000..c617a48 --- /dev/null +++ b/test/generated/dist/customers/customers.queries.ts @@ -0,0 +1,282 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CustomersAcl } from "./customers.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CustomersModels } from "./customers.models"; +import { CustomersApi } from "./customers.api"; + +export namespace CustomersQueries { + export const moduleName = QueryModule.Customers; + + export const keys = { + all: [moduleName] as const, + findProfile: () => [...keys.all, "/customers/me"] as const, + list: ( + limit?: number, + order?: string, + filter?: CustomersModels.CustomerPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/customers", limit, order, filter, page, cursor] as const, + listInfinite: ( + limit?: number, + order?: string, + filter?: CustomersModels.CustomerPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/customers", "infinite", limit, order, filter, cursor] as const, + findById: (customerId: string) => [...keys.all, "/customers/:customerId", customerId] as const, + }; + + /** + * Query `useFindProfile` + * @summary Get customer by id + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfile = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findProfile(), + queryFn: () => CustomersApi.findProfile(config), + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create new customer + * @permission Requires `canUseCreate` ability + * @param { CustomersModels.CreateCustomerDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CustomersAcl.canUseCreate()); + return CustomersApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useList` + * @summary List customers + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` + * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: CustomersModels.CustomerPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CustomersAcl.canUseList()); + return CustomersApi.list(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List customers + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` + * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: CustomersModels.CustomerPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CustomersAcl.canUseList()); + return CustomersApi.list(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get customer by id + * @permission Requires `canUseFindById` ability + * @param { string } object.customerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { customerId }: { customerId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(customerId), + queryFn: () => { + checkAcl(CustomersAcl.canUseFindById()); + return CustomersApi.findById(customerId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update customer + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.customerId Path parameter + * @param { CustomersModels.UpdateCustomerDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof CustomersApi.update, + { customerId: string; data: CustomersModels.UpdateCustomerDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ customerId, data }) => { + checkAcl(CustomersAcl.canUseUpdate()); + return CustomersApi.update(customerId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { customerId } = variables; + const updateKeys = [keys.findById(customerId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeactivate` + * @summary Deactivate customer + * @permission Requires `canUseDeactivate` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeactivate = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CustomersAcl.canUseDeactivate()); + return CustomersApi.deactivate(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useReactivate` + * @summary Reactivate customer + * @permission Requires `canUseReactivate` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useReactivate = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CustomersAcl.canUseReactivate()); + return CustomersApi.reactivate(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/depots/depots.acl.ts b/test/generated/dist/depots/depots.acl.ts new file mode 100644 index 0000000..58d424a --- /dev/null +++ b/test/generated/dist/depots/depots.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace DepotsAcl { + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Depot"] as AbilityTuple<"Create", "Depot">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Depot"] as AbilityTuple<"Update", "Depot">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "Depot"] as AbilityTuple<"Archive", "Depot">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "Depot"] as AbilityTuple<"Archive", "Depot">; +} diff --git a/test/generated/dist/depots/depots.api.ts b/test/generated/dist/depots/depots.api.ts new file mode 100644 index 0000000..da2d019 --- /dev/null +++ b/test/generated/dist/depots/depots.api.ts @@ -0,0 +1,107 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DepotsModels } from "./depots.models"; + +export namespace DepotsApi { + export const create = (data: DepotsModels.CreateDepotRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots`, + ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), + config, + ); + }; + export const paginate = ( + limit: number, + order?: string, + filter?: DepotsModels.DepotPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: DepotsModels.DepotsPaginateResponseSchema }, `/depots`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: DepotsModels.DepotLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, + `/depots/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: DepotsModels.DepotResponseDTOSchema }, `/depots/${id}`, config); + }; + export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots/${id}`, + ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/depots/${id}/archive`, undefined, config); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/depots/${id}/unarchive`, undefined, config); + }; +} diff --git a/test/generated/dist/depots/depots.configs.ts b/test/generated/dist/depots/depots.configs.ts new file mode 100644 index 0000000..0eb5ea1 --- /dev/null +++ b/test/generated/dist/depots/depots.configs.ts @@ -0,0 +1,133 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DepotsModels } from "./depots.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DepotsQueries } from "./depots.queries"; +import { DepotsAcl } from "./depots.acl"; + +export namespace DepotsConfigs { + export const depotsConfig = { + meta: { + title: "Depots", + }, + readAll: { + acl: DepotsAcl.canUsePaginate, + schema: DepotsModels.DepotResponseDTOSchema, + paginated: DepotsQueries.usePaginate, + infinite: DepotsQueries.usePaginateInfinite, + filters: { + schema: DepotsModels.DepotPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DepotsModels.DepotPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DepotsModels.DepotResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + name: true, + shortName: true, + additionalInformation: true, + address: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: DepotsModels.DepotsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: DepotsAcl.canUseFindById, + schema: DepotsModels.DepotResponseDTOSchema, + query: DepotsQueries.useFindById, + }, + create: { + acl: DepotsAcl.canUseCreate, + schema: DepotsModels.CreateDepotRequestDTOSchema, + mutation: DepotsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DepotsModels.CreateDepotRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + additionalInformation: true, + name: true, + street: true, + zip: true, + district: true, + cityId: true, + countryId: true, + }, + }, + }), + }, + update: { + acl: DepotsAcl.canUseUpdate, + schema: DepotsModels.UpdateDepotRequestDTOSchema, + mutation: DepotsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DepotsModels.UpdateDepotRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + additionalInformation: true, + name: true, + street: true, + zip: true, + district: true, + cityId: true, + countryId: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DepotsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DepotsQueries.usePaginateLabels, + infinite: DepotsQueries.usePaginateLabelsInfinite, + filters: { + schema: DepotsModels.DepotLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DepotsModels.DepotLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/depots/depots.models.ts b/test/generated/dist/depots/depots.models.ts new file mode 100644 index 0000000..f10cf95 --- /dev/null +++ b/test/generated/dist/depots/depots.models.ts @@ -0,0 +1,233 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DepotsModels { + /** + * DepotCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DepotCityDto = z.infer; + + /** + * DepotCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ + export const DepotCountryDtoSchema = z + .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) + .readonly(); + export type DepotCountryDto = z.infer; + + /** + * AddressDTOSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { DepotCityDto } city + * @property { string } district District name + * @property { DepotCountryDto } country + */ + export const AddressDTOSchema = z + .object({ + street: z.string().describe("Street address"), + zip: z.string().describe("ZIP/Postal code"), + city: DepotCityDtoSchema.nullish(), + district: z.string().describe("District name").nullish(), + country: DepotCountryDtoSchema.nullish(), + }) + .readonly(); + export type AddressDTO = z.infer; + + /** + * DepotEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DepotEmployeeDTO = z.infer; + + /** + * DepotResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the depot + * @property { string } matchCode Match code for the depot + * @property { string } name Name of the depot + * @property { string } shortName Short name of the depot + * @property { string } additionalInformation Additional info of the depot + * @property { AddressDTO } address Address details of the depot + * @property { boolean } archived + * @property { string } createdById + * @property { DepotEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DepotEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const DepotResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the depot"), + matchCode: z.string().describe("Match code for the depot"), + name: z.string().describe("Name of the depot"), + shortName: z.string().describe("Short name of the depot").nullish(), + additionalInformation: z.string().describe("Additional info of the depot").nullish(), + address: AddressDTOSchema.describe("Address details of the depot"), + archived: z.boolean(), + createdById: z.string().nullish(), + createdBy: DepotEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: DepotEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type DepotResponseDTO = z.infer; + + /** + * CreateDepotRequestDTOSchema + * @type { object } + * @property { string } matchCode Unique identifier code for the depot + * @property { string } shortName Optional short name for the depot + * @property { string } additionalInformation + * @property { string } name Full name of the depot + * @property { string } street Street address of the depot + * @property { string } zip ZIP/Postal code + * @property { string } district District information + * @property { string } cityId City id + * @property { string } countryId Country code + */ + export const CreateDepotRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Unique identifier code for the depot"), + shortName: z.string().describe("Optional short name for the depot").nullish(), + additionalInformation: z.string().nullish(), + name: z.string().describe("Full name of the depot"), + street: z.string().describe("Street address of the depot"), + zip: z.string().describe("ZIP/Postal code"), + district: z.string().describe("District information").nullish(), + cityId: z.string().describe("City id"), + countryId: z.string().describe("Country code"), + }) + .readonly(); + export type CreateDepotRequestDTO = z.infer; + + /** + * DepotPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter depots by name, matchCode, or shortName + * @property { boolean } archived + */ + export const DepotPaginationFilterDtoSchema = z + .object({ + search: z.string().describe("Search term to filter depots by name, matchCode, or shortName"), + archived: z.boolean(), + }) + .readonly(); + export type DepotPaginationFilterDto = z.infer; + + /** + * DepotLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const DepotLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type DepotLabelFilterDto = z.infer; + + /** + * UpdateDepotRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code for the depot + * @property { string } shortName Updated short name + * @property { string } additionalInformation Updated short name + * @property { string } name Updated full name + * @property { string } street Updated street address + * @property { string } zip Updated ZIP/Postal code + * @property { string } district Updated district information + * @property { string } cityId Updated city id + * @property { string } countryId Updated country code + */ + export const UpdateDepotRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Updated match code for the depot"), + shortName: z.string().describe("Updated short name"), + additionalInformation: z.string().describe("Updated short name"), + name: z.string().describe("Updated full name"), + street: z.string().describe("Updated street address"), + zip: z.string().describe("Updated ZIP/Postal code"), + district: z.string().describe("Updated district information"), + cityId: z.string().describe("Updated city id"), + countryId: z.string().describe("Updated country code"), + }) + .readonly(); + export type UpdateDepotRequestDTO = z.infer; + + /** + * DepotsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const DepotsPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DepotsPaginateOrderParamEnum = z.infer; + export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.enum; + + /** + * DepotsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DepotResponseDTO[] } items + */ + export const DepotsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(DepotResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DepotsPaginateResponse = z.infer; + + /** + * DepotsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const DepotsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DepotsPaginateLabelsOrderParamEnum = z.infer; + export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * DepotsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const DepotsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DepotsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/depots/depots.queries.ts b/test/generated/dist/depots/depots.queries.ts new file mode 100644 index 0000000..dc58f63 --- /dev/null +++ b/test/generated/dist/depots/depots.queries.ts @@ -0,0 +1,349 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DepotsAcl } from "./depots.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DepotsModels } from "./depots.models"; +import { DepotsApi } from "./depots.api"; + +export namespace DepotsQueries { + export const moduleName = QueryModule.Depots; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: DepotsModels.DepotPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/depots", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: DepotsModels.DepotPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/depots", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: DepotsModels.DepotLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/depots/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: DepotsModels.DepotLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/depots/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/depots/:id", id] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a new depot + * @permission Requires `canUseCreate` ability + * @param { DepotsModels.CreateDepotRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(DepotsAcl.canUseCreate()); + return DepotsApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Paginate Depots + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: DepotsModels.DepotPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DepotsAcl.canUsePaginate()); + return DepotsApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Depots + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: DepotsModels.DepotPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DepotsAcl.canUsePaginate()); + return DepotsApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate depots with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: DepotsModels.DepotLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DepotsAcl.canUsePaginateLabels()); + return DepotsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate depots with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: DepotsModels.DepotLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DepotsAcl.canUsePaginateLabels()); + return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Fetch depot by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(DepotsAcl.canUseFindById()); + return DepotsApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update a depot + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { DepotsModels.UpdateDepotRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(DepotsAcl.canUseUpdate()); + return DepotsApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive a depot + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(DepotsAcl.canUseArchive()); + return DepotsApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive a depot + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(DepotsAcl.canUseUnarchive()); + return DepotsApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/documentTemplates/documentTemplates.acl.ts b/test/generated/dist/documentTemplates/documentTemplates.acl.ts new file mode 100644 index 0000000..299eec8 --- /dev/null +++ b/test/generated/dist/documentTemplates/documentTemplates.acl.ts @@ -0,0 +1,111 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DocumentTemplatesAcl { + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List document template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Read", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List document templates + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Read", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Create", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get document template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Read", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update document template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Update", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useAddRemarkBlock` mutation ability. For global ability, omit the object parameter. + * @description Add remark block to document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddRemarkBlock` mutation + */ + export const canUseAddRemarkBlock = (object?: { officeId: string }) => + ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Update", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useDeleteRemarkBlock` mutation ability. For global ability, omit the object parameter. + * @description Delete remark block from document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemarkBlock` mutation + */ + export const canUseDeleteRemarkBlock = (object?: { officeId: string }) => + ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Update", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Archive", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Unarchive", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< + "Unarchive", + "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/documentTemplates/documentTemplates.api.ts b/test/generated/dist/documentTemplates/documentTemplates.api.ts new file mode 100644 index 0000000..cd84ccd --- /dev/null +++ b/test/generated/dist/documentTemplates/documentTemplates.api.ts @@ -0,0 +1,162 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; + +export namespace DocumentTemplatesApi { + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/document-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const list = ( + officeId: string, + limit: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, + `/offices/${officeId}/document-templates`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = ( + officeId: string, + data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates`, + ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), + config, + ); + }; + export const findById = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}`, + config, + ); + }; + export const update = ( + documentTemplateId: string, + officeId: string, + data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}`, + ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), + config, + ); + }; + export const addRemarkBlock = ( + documentTemplateId: string, + officeId: string, + data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, + ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), + config, + ); + }; + export const deleteRemarkBlock = ( + documentTemplateId: string, + remarkBlockId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, + undefined, + config, + ); + }; + export const archive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, + undefined, + config, + ); + }; + export const unarchive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/documentTemplates/documentTemplates.configs.ts b/test/generated/dist/documentTemplates/documentTemplates.configs.ts new file mode 100644 index 0000000..291245b --- /dev/null +++ b/test/generated/dist/documentTemplates/documentTemplates.configs.ts @@ -0,0 +1,118 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DocumentTemplatesQueries } from "./documentTemplates.queries"; +import { DocumentTemplatesAcl } from "./documentTemplates.acl"; + +export namespace DocumentTemplatesConfigs { + export const documentTemplatesConfig = { + meta: { + title: "Document Templates", + }, + readAll: { + acl: DocumentTemplatesAcl.canUseList, + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + paginated: DocumentTemplatesQueries.useList, + infinite: DocumentTemplatesQueries.useListInfinite, + filters: { + schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, + options: { + inputs: { + isArchived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + isArchived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + blocks: true, + }, + sortable: DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: DocumentTemplatesAcl.canUseFindById, + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + query: DocumentTemplatesQueries.useFindById, + }, + create: { + acl: DocumentTemplatesAcl.canUseCreate, + schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, + mutation: DocumentTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + blocks: true, + }, + }, + }), + }, + update: { + acl: DocumentTemplatesAcl.canUseUpdate, + schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, + mutation: DocumentTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + isArchived: true, + blocks: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DocumentTemplatesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DocumentTemplatesQueries.usePaginateLabels, + infinite: DocumentTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/documentTemplates/documentTemplates.models.ts b/test/generated/dist/documentTemplates/documentTemplates.models.ts new file mode 100644 index 0000000..1841a56 --- /dev/null +++ b/test/generated/dist/documentTemplates/documentTemplates.models.ts @@ -0,0 +1,195 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DocumentTemplatesModels { + /** + * DocumentTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DocumentTemplateEmployeeDTO = z.infer; + + /** + * DocumentTemplateResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name + * @property { boolean } isArchived + * @property { string } createdById ID of the employee who created this template + * @property { DocumentTemplateEmployeeDTO } createdBy Employee who created this template + * @property { string } createdAt + * @property { string } updatedById ID of the employee who last updated this template + * @property { DocumentTemplateEmployeeDTO } updatedBy Employee who last updated this template + * @property { string } updatedAt + * @property { CommonModels.TemplateBlocksResponseDTO } blocks + */ + export const DocumentTemplateResponseDTOSchema = z + .object({ + id: z.string(), + officeId: z.string(), + name: z.string(), + isArchived: z.boolean(), + createdById: z.string().describe("ID of the employee who created this template").nullish(), + createdBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), + updatedBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), + updatedAt: z.iso.datetime({ offset: true }), + blocks: CommonModels.TemplateBlocksResponseDTOSchema, + }) + .readonly(); + export type DocumentTemplateResponseDTO = z.infer; + + /** + * TemplateBlocksDTOSchema + * @type { object } + * @property { CommonModels.TitleBlockDTO } titleBlock + * @property { CommonModels.ReceiverBlockDTO } receiverBlock + * @property { CommonModels.OurInformationBlockDTO } ourInformationBlock + * @property { CommonModels.RouteTableBlockDTO } routeTableBlock + * @property { CommonModels.CargoTableBlockDTO } cargoTableBlock + * @property { CommonModels.CargoSummaryBlockDTO } cargoSummaryBlock + * @property { CommonModels.FinanceTableBlockDTO } financeTableBlock + * @property { CommonModels.RemarkBlockDTO[] } remarkBlocks + * @property { CommonModels.FooterBlockDTO } footerBlock + * @property { CommonModels.TermsBlockDTO } termsBlock + * @property { CommonModels.CutOffDatesBlockDTO } cutOffDatesBlock + */ + export const TemplateBlocksDTOSchema = z + .object({ + titleBlock: CommonModels.TitleBlockDTOSchema, + receiverBlock: CommonModels.ReceiverBlockDTOSchema, + ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, + routeTableBlock: CommonModels.RouteTableBlockDTOSchema, + cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, + cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, + financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, + remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), + footerBlock: CommonModels.FooterBlockDTOSchema, + termsBlock: CommonModels.TermsBlockDTOSchema, + cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema, + }) + .readonly(); + export type TemplateBlocksDTO = z.infer; + + /** + * CreateDocumentTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { TemplateBlocksDTO } blocks + */ + export const CreateDocumentTemplateRequestDTOSchema = z + .object({ name: z.string().describe("Template name"), blocks: TemplateBlocksDTOSchema.nullish() }) + .readonly(); + export type CreateDocumentTemplateRequestDTO = z.infer; + + /** + * UpdateDocumentTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { boolean } isArchived + * @property { TemplateBlocksDTO } blocks + */ + export const UpdateDocumentTemplateRequestDTOSchema = z + .object({ name: z.string().describe("Template name"), isArchived: z.boolean(), blocks: TemplateBlocksDTOSchema }) + .readonly(); + export type UpdateDocumentTemplateRequestDTO = z.infer; + + /** + * CreateRemarkBlockRequestDTOSchema + * @type { object } + * @property { CommonModels.EditorContentUpdateDto } content + * @property { number } position 1-based position of the remark block. Minimum: `1` + * @property { boolean } enabled + */ + export const CreateRemarkBlockRequestDTOSchema = z + .object({ + content: CommonModels.EditorContentUpdateDtoSchema, + position: z.number().gte(1).describe("1-based position of the remark block").nullish(), + enabled: z.boolean().nullish(), + }) + .readonly(); + export type CreateRemarkBlockRequestDTO = z.infer; + + /** + * DocumentTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const DocumentTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type DocumentTemplateLabelFilterDto = z.infer; + + /** + * DocumentTemplateFilterDtoSchema + * @type { object } + * @property { boolean } isArchived + * @property { string } search + */ + export const DocumentTemplateFilterDtoSchema = z.object({ isArchived: z.boolean(), search: z.string() }).readonly(); + export type DocumentTemplateFilterDto = z.infer; + + /** + * DocumentTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const DocumentTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DocumentTemplatesPaginateLabelsOrderParamEnum = z.infer< + typeof DocumentTemplatesPaginateLabelsOrderParamEnumSchema + >; + export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * DocumentTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DocumentTemplatesPaginateLabelsResponse = z.infer; + + /** + * DocumentTemplatesListOrderParamEnumSchema + * @type { enum } + */ + export const DocumentTemplatesListOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DocumentTemplatesListOrderParamEnum = z.infer; + export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderParamEnumSchema.enum; + + /** + * DocumentTemplatesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DocumentTemplateResponseDTO[] } items + */ + export const DocumentTemplatesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DocumentTemplatesListResponse = z.infer; +} diff --git a/test/generated/dist/documentTemplates/documentTemplates.queries.ts b/test/generated/dist/documentTemplates/documentTemplates.queries.ts new file mode 100644 index 0000000..6b47315 --- /dev/null +++ b/test/generated/dist/documentTemplates/documentTemplates.queries.ts @@ -0,0 +1,509 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DocumentTemplatesAcl } from "./documentTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; +import { DocumentTemplatesApi } from "./documentTemplates.api"; + +export namespace DocumentTemplatesQueries { + export const moduleName = QueryModule.DocumentTemplates; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/document-templates/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/document-templates/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + list: ( + officeId: string, + limit?: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/document-templates", officeId, limit, order, filter, page, cursor] as const, + listInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/document-templates", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (documentTemplateId: string, officeId: string) => + [...keys.all, "/offices/:officeId/document-templates/:documentTemplateId", documentTemplateId, officeId] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate document template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId })); + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate document template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId })); + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useList` + * @summary List document templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DocumentTemplatesModels.DocumentTemplateFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUseList({ officeId })); + return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List document templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DocumentTemplatesModels.DocumentTemplateFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DocumentTemplatesAcl.canUseList({ officeId })); + return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new document template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.create, + { officeId: string; data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId })); + return DocumentTemplatesApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get document template by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.documentTemplateId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ + export const useFindById = ( + { documentTemplateId, officeId }: { documentTemplateId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(documentTemplateId, officeId), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId })); + return DocumentTemplatesApi.findById(documentTemplateId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update document template by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.update, + { documentTemplateId: string; officeId: string; data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId })); + return DocumentTemplatesApi.update(documentTemplateId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useAddRemarkBlock` + * @summary Add a remark block to a document template + * @permission Requires `canUseAddRemarkBlock` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.CreateRemarkBlockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useAddRemarkBlock = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.addRemarkBlock, + { documentTemplateId: string; officeId: string; data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId })); + return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteRemarkBlock` + * @summary Delete a remark block from a document template + * @permission Requires `canUseDeleteRemarkBlock` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.remarkBlockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteRemarkBlock = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.deleteRemarkBlock, + { documentTemplateId: string; remarkBlockId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId })); + return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive document template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useArchive = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.archive, + { documentTemplateId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId })); + return DocumentTemplatesApi.archive(documentTemplateId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive document template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUnarchive = ( + options?: AppMutationOptions< + typeof DocumentTemplatesApi.unarchive, + { documentTemplateId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId })); + return DocumentTemplatesApi.unarchive(documentTemplateId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.acl.ts b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.acl.ts new file mode 100644 index 0000000..cd053fc --- /dev/null +++ b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningAccountStatementAcl { + /** + * Use for `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation ability. For global ability, omit the object parameter. + * @description Generate account statement + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation + */ + export const canUseGenerateAccountStatement = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetAccountStatementEml` mutation ability. For global ability, omit the object parameter. + * @description Download account statement as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAccountStatementEml` mutation + */ + export const canUseGetAccountStatementEml = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.api.ts b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.api.ts new file mode 100644 index 0000000..0475302 --- /dev/null +++ b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.api.ts @@ -0,0 +1,76 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningAccountStatementApi { + export const dataGenFake = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, + `/data-gen-fake/account-statement`, + config, + ); + }; + export const generateAccountStatement = ( + officeId: string, + limit: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/account-statement`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }); + }; + export const getAccountStatementEml = ( + officeId: string, + data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/account-statement/eml`, + ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.models.ts b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.models.ts new file mode 100644 index 0000000..1a07b4f --- /dev/null +++ b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.models.ts @@ -0,0 +1,156 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningAccountStatementModels { + /** + * AccountStatementPdfPayloadInvoiceDtoSchema + * @type { object } + * @property { string } number + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } dueDays + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + */ + export const AccountStatementPdfPayloadInvoiceDtoSchema = z + .object({ + number: z.string(), + issuingDate: z.iso.datetime({ offset: true }), + dueDate: z.iso.datetime({ offset: true }), + dueDays: z.number(), + invoiceAmount: z.number(), + outstandingAmount: z.number(), + currencyNotation: z.string(), + }) + .readonly(); + export type AccountStatementPdfPayloadInvoiceDto = z.infer; + + /** + * AccountStatementInvoicesByCurrencyAndDirectionDtoSchema + * @type { object } + * @property { string } direction + * @property { string } currency + * @property { AccountStatementPdfPayloadInvoiceDto[] } invoices + * @property { number } totalOutstandingAmount + */ + export const AccountStatementInvoicesByCurrencyAndDirectionDtoSchema = z + .object({ + direction: CommonModels.InvoiceDirectionEnumSchema, + currency: z.string(), + invoices: z.array(AccountStatementPdfPayloadInvoiceDtoSchema).readonly(), + totalOutstandingAmount: z.number(), + }) + .readonly(); + export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer< + typeof AccountStatementInvoicesByCurrencyAndDirectionDtoSchema + >; + + /** + * AccountStatementPdfPayloadBusinessPartnerDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + * @property { string } referenceNumber + */ + export const AccountStatementPdfPayloadBusinessPartnerDtoSchema = z + .object({ name: z.string(), address: z.string().nullish(), referenceNumber: z.string().nullish() }) + .readonly(); + export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer< + typeof AccountStatementPdfPayloadBusinessPartnerDtoSchema + >; + + /** + * AccountStatementPdfPayloadBankAccountDtoSchema + * @type { object } + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + */ + export const AccountStatementPdfPayloadBankAccountDtoSchema = z + .object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }) + .readonly(); + export type AccountStatementPdfPayloadBankAccountDto = z.infer; + + /** + * AccountStatementPdfPayloadDTOSchema + * @type { object } + * @property { AccountStatementPdfPayloadBusinessPartnerDto } businessPartner + * @property { AccountStatementInvoicesByCurrencyAndDirectionDto[] } invoicesByCurrencyAndDirection + * @property { AccountStatementPdfPayloadBankAccountDto } bankAccount + * @property { string } employeeName + * @property { CommonModels.ConfigBlockDto } config + */ + export const AccountStatementPdfPayloadDTOSchema = z + .object({ + businessPartner: AccountStatementPdfPayloadBusinessPartnerDtoSchema, + invoicesByCurrencyAndDirection: z.array(AccountStatementInvoicesByCurrencyAndDirectionDtoSchema).readonly(), + bankAccount: AccountStatementPdfPayloadBankAccountDtoSchema, + employeeName: z.string().nullable(), + config: CommonModels.ConfigBlockDtoSchema, + }) + .readonly(); + export type AccountStatementPdfPayloadDTO = z.infer; + + /** + * OfficeInvoiceListQueryDtoSchema + * @type { object } + * @property { string } order Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @property { CommonModels.OfficeInvoiceFilterDto } filter + * @property { number } limit Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + */ + export const OfficeInvoiceListQueryDtoSchema = z + .object({ + order: z + .string() + .describe( + "Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId", + ) + .nullish(), + filter: CommonModels.OfficeInvoiceFilterDtoSchema.nullish(), + limit: z.number().gte(1).lte(100).describe("Items per response").default(20), + page: z.number().describe("1-indexed page number to begin from").nullish(), + cursor: z.string().describe("ID of item to start after").nullish(), + }) + .readonly(); + export type OfficeInvoiceListQueryDto = z.infer; + + /** + * GenerateAccountStatementOrderParamEnumSchema + * @type { enum } + */ + export const GenerateAccountStatementOrderParamEnumSchema = z.enum([ + "invoiceNumber", + "issuingDate", + "invoiceType", + "amount", + "netAmount", + "currencyNotation", + "dueDate", + "status", + "paidOn", + "serviceDate", + "internalNumber", + "positionNumber", + "invoiceDirection", + "receiver", + "receiverCountry", + "paidAmount", + "totalVat", + "dunningBlock", + "invoiceInReview", + "isInvoiceOk", + "isVatOk", + "comments", + "salesRepName", + "isExportedToBookkeeping", + "createdAt", + "customerReferenceOverride", + "externalSystemId", + ]); + export type GenerateAccountStatementOrderParamEnum = z.infer; + export const GenerateAccountStatementOrderParamEnum = GenerateAccountStatementOrderParamEnumSchema.enum; +} diff --git a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.queries.ts b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.queries.ts new file mode 100644 index 0000000..9697954 --- /dev/null +++ b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.queries.ts @@ -0,0 +1,270 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningAccountStatementAcl } from "./dunningAccountStatement.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; +import { DunningAccountStatementApi } from "./dunningAccountStatement.api"; + +export namespace DunningAccountStatementQueries { + export const moduleName = QueryModule.DunningAccountStatement; + + export const keys = { + all: [moduleName] as const, + dataGenFake: () => [...keys.all, "/data-gen-fake/account-statement"] as const, + generateAccountStatement: ( + officeId: string, + limit?: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/invoices/account-statement", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + generateAccountStatementInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/invoices/account-statement", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useDataGenFake` + * @summary Expose account statement PDF payload DTO for model generation + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useDataGenFake = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.dataGenFake(), + queryFn: () => DunningAccountStatementApi.dataGenFake(config), + ...options, + }); + }; + + /** + * Query `useGenerateAccountStatement` - recommended when file should be cached + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const useGenerateAccountStatement = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CommonModels.OfficeInvoiceFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); + return DunningAccountStatementApi.generateAccountStatement( + officeId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `useGenerateAccountStatementMutation` - recommended when file should not be cached + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } mutation.officeId Path parameter + * @param { number } mutation.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } mutation.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } mutation.filter Query parameter + * @param { number } mutation.page Query parameter. 1-indexed page number to begin from + * @param { string } mutation.cursor Query parameter. ID of item to start after + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGenerateAccountStatementMutation = ( + options?: AppMutationOptions< + typeof DunningAccountStatementApi.generateAccountStatement, + { + officeId: string; + limit: number; + order?: string; + filter?: CommonModels.OfficeInvoiceFilterDto; + page?: number; + cursor?: string; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); + return DunningAccountStatementApi.generateAccountStatement( + officeId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, limit } = variables; + const updateKeys = [keys.generateAccountStatement(officeId, limit)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Infinite query `useGenerateAccountStatementInfinite + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useGenerateAccountStatementInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CommonModels.OfficeInvoiceFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); + return DunningAccountStatementApi.generateAccountStatement( + officeId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useGetAccountStatementEml` - recommended when file should not be cached + * @summary Get account statement as EML file with PDF attachment + * @permission Requires `canUseGetAccountStatementEml` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningAccountStatementModels.OfficeInvoiceListQueryDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useGetAccountStatementEml = ( + options?: AppMutationOptions< + typeof DunningAccountStatementApi.getAccountStatementEml, + { officeId: string; data: DunningAccountStatementModels.OfficeInvoiceListQueryDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId })); + return DunningAccountStatementApi.getAccountStatementEml(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/dunningLevels/dunningLevels.acl.ts b/test/generated/dist/dunningLevels/dunningLevels.acl.ts new file mode 100644 index 0000000..55850c2 --- /dev/null +++ b/test/generated/dist/dunningLevels/dunningLevels.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningLevelsAcl { + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List dunning level labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Read", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List dunning levels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Read", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Create", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get dunning level by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Read", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Update", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive a dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Archive", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive a dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Unarchive", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< + "Unarchive", + "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/dunningLevels/dunningLevels.api.ts b/test/generated/dist/dunningLevels/dunningLevels.api.ts new file mode 100644 index 0000000..8a08b80 --- /dev/null +++ b/test/generated/dist/dunningLevels/dunningLevels.api.ts @@ -0,0 +1,136 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningLevelsModels } from "./dunningLevels.models"; + +export namespace DunningLevelsApi { + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, + `/offices/${officeId}/dunning-levels/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const list = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, + `/offices/${officeId}/dunning-levels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = ( + officeId: string, + data: DunningLevelsModels.CreateDunningLevelRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels`, + ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), + config, + ); + }; + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}`, + config, + ); + }; + export const update = ( + id: string, + officeId: string, + data: DunningLevelsModels.UpdateDunningLevelRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}`, + ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/dunningLevels/dunningLevels.configs.ts b/test/generated/dist/dunningLevels/dunningLevels.configs.ts new file mode 100644 index 0000000..73a46f7 --- /dev/null +++ b/test/generated/dist/dunningLevels/dunningLevels.configs.ts @@ -0,0 +1,134 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningLevelsModels } from "./dunningLevels.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningLevelsQueries } from "./dunningLevels.queries"; +import { DunningLevelsAcl } from "./dunningLevels.acl"; + +export namespace DunningLevelsConfigs { + export const dunningLevelsConfig = { + meta: { + title: "Dunning Levels", + }, + readAll: { + acl: DunningLevelsAcl.canUseList, + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + paginated: DunningLevelsQueries.useList, + infinite: DunningLevelsQueries.useListInfinite, + filters: { + schema: DunningLevelsModels.DunningLevelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningLevelsModels.DunningLevelFilterDtoSchema, + options: { + inputs: { + dunningSystemId: true, + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + options: { + columns: { + id: true, + level: true, + daysOverdue: true, + dunningFee: true, + interestRate: true, + usedInOfficeId: true, + usedInOffice: true, + dunningSystem: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + archived: true, + bodyRemarks: true, + footerRemarks: true, + }, + sortable: DunningLevelsModels.DunningLevelsListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: DunningLevelsAcl.canUseFindById, + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + query: DunningLevelsQueries.useFindById, + }, + create: { + acl: DunningLevelsAcl.canUseCreate, + schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, + mutation: DunningLevelsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, + options: { + inputs: { + level: true, + daysOverdue: true, + dunningFee: true, + dunningSystemId: true, + interestRate: true, + bodyRemarks: true, + footerRemarks: true, + }, + }, + }), + }, + update: { + acl: DunningLevelsAcl.canUseUpdate, + schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, + mutation: DunningLevelsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, + options: { + inputs: { + level: true, + daysOverdue: true, + dunningFee: true, + interestRate: true, + dunningSystemId: true, + bodyRemarks: true, + footerRemarks: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DunningLevelsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DunningLevelsQueries.usePaginateLabels, + infinite: DunningLevelsQueries.usePaginateLabelsInfinite, + filters: { + schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/dunningLevels/dunningLevels.models.ts b/test/generated/dist/dunningLevels/dunningLevels.models.ts new file mode 100644 index 0000000..2046ede --- /dev/null +++ b/test/generated/dist/dunningLevels/dunningLevels.models.ts @@ -0,0 +1,207 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningLevelsModels { + /** + * DunningLevelOfficeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } currencyNotation + */ + export const DunningLevelOfficeDTOSchema = z + .object({ id: z.string(), name: z.string(), currencyNotation: z.string() }) + .readonly(); + export type DunningLevelOfficeDTO = z.infer; + + /** + * DunningLevelEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DunningLevelEmployeeDTO = z.infer; + + /** + * DunningLevelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { number } level + * @property { number } daysOverdue + * @property { number } dunningFee + * @property { number } interestRate + * @property { string } usedInOfficeId + * @property { DunningLevelOfficeDTO } usedInOffice + * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem + * @property { string } createdById + * @property { DunningLevelEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DunningLevelEmployeeDTO } updatedBy + * @property { string } updatedAt + * @property { boolean } archived + * @property { CommonModels.EditorContentResponseDto } bodyRemarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks + */ + export const DunningLevelResponseDTOSchema = z + .object({ + id: z.string(), + level: z.number(), + daysOverdue: z.number(), + dunningFee: z.number(), + interestRate: z.number().nullish(), + usedInOfficeId: z.string(), + usedInOffice: DunningLevelOfficeDTOSchema.nullish(), + dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), + createdById: z.string().nullish(), + createdBy: DunningLevelEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: DunningLevelEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + archived: z.boolean(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), + }) + .readonly(); + export type DunningLevelResponseDTO = z.infer; + + /** + * CreateDunningLevelRequestDTOSchema + * @type { object } + * @property { number } level Dunning level number. Minimum: `1` + * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` + * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` + * @property { string } dunningSystemId Dunning system ID + * @property { number } interestRate Minimum: `0`. Maximum: `100` + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const CreateDunningLevelRequestDTOSchema = z + .object({ + level: z.number().gte(1).describe("Dunning level number"), + daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), + dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), + dunningSystemId: z.string().describe("Dunning system ID").nullish(), + interestRate: z.number().gte(0).lte(100).nullish(), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks").nullish(), + }) + .readonly(); + export type CreateDunningLevelRequestDTO = z.infer; + + /** + * UpdateDunningLevelRequestDTOSchema + * @type { object } + * @property { number } level Dunning level number. Minimum: `1` + * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` + * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` + * @property { number } interestRate Minimum: `0`. Maximum: `100` + * @property { string } dunningSystemId Dunning system ID + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateDunningLevelRequestDTOSchema = z + .object({ + level: z.number().gte(1).describe("Dunning level number"), + daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), + dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), + interestRate: z.number().gte(0).lte(100), + dunningSystemId: z.string().describe("Dunning system ID"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateDunningLevelRequestDTO = z.infer; + + /** + * DunningLevelLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const DunningLevelLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type DunningLevelLabelFilterDto = z.infer; + + /** + * DunningLevelFilterDtoSchema + * @type { object } + * @property { string } dunningSystemId Dunning system ID to filter by + * @property { string } search Search to filter by + * @property { boolean } archived Filter by archived status + */ + export const DunningLevelFilterDtoSchema = z + .object({ + dunningSystemId: z.string().describe("Dunning system ID to filter by"), + search: z.string().describe("Search to filter by"), + archived: z.boolean().describe("Filter by archived status"), + }) + .readonly(); + export type DunningLevelFilterDto = z.infer; + + /** + * DunningLevelsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const DunningLevelsPaginateLabelsOrderParamEnumSchema = z.enum([ + "level", + "daysOverdue", + "dunningFee", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DunningLevelsPaginateLabelsOrderParamEnum = z.infer< + typeof DunningLevelsPaginateLabelsOrderParamEnumSchema + >; + export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * DunningLevelsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const DunningLevelsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DunningLevelsPaginateLabelsResponse = z.infer; + + /** + * DunningLevelsListOrderParamEnumSchema + * @type { enum } + */ + export const DunningLevelsListOrderParamEnumSchema = z.enum([ + "level", + "daysOverdue", + "dunningFee", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type DunningLevelsListOrderParamEnum = z.infer; + export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSchema.enum; + + /** + * DunningLevelsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningLevelResponseDTO[] } items + */ + export const DunningLevelsListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(DunningLevelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DunningLevelsListResponse = z.infer; +} diff --git a/test/generated/dist/dunningLevels/dunningLevels.queries.ts b/test/generated/dist/dunningLevels/dunningLevels.queries.ts new file mode 100644 index 0000000..9792c9b --- /dev/null +++ b/test/generated/dist/dunningLevels/dunningLevels.queries.ts @@ -0,0 +1,420 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningLevelsAcl } from "./dunningLevels.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningLevelsModels } from "./dunningLevels.models"; +import { DunningLevelsApi } from "./dunningLevels.api"; + +export namespace DunningLevelsQueries { + export const moduleName = QueryModule.DunningLevels; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/dunning-levels/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/dunning-levels/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + list: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/dunning-levels", officeId, limit, order, filter, page, cursor] as const, + listInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningLevelsModels.DunningLevelFilterDto, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/dunning-levels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/dunning-levels/:id", id, officeId] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate dunning level labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningLevelsModels.DunningLevelLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId })); + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate dunning level labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningLevelsModels.DunningLevelLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId })); + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useList` + * @summary List dunning levels + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningLevelsModels.DunningLevelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUseList({ officeId })); + return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List dunning levels + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningLevelsModels.DunningLevelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningLevelsAcl.canUseList({ officeId })); + return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create dunning level + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningLevelsModels.CreateDunningLevelRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof DunningLevelsApi.create, + { officeId: string; data: DunningLevelsModels.CreateDunningLevelRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningLevelsAcl.canUseCreate({ officeId })); + return DunningLevelsApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get dunning level by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUseFindById({ officeId })); + return DunningLevelsApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update dunning level + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningLevelsModels.UpdateDunningLevelRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof DunningLevelsApi.update, + { id: string; officeId: string; data: DunningLevelsModels.UpdateDunningLevelRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(DunningLevelsAcl.canUseUpdate({ officeId })); + return DunningLevelsApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive a dunning level + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningLevelsAcl.canUseArchive({ officeId })); + return DunningLevelsApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive a dunning level + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId })); + return DunningLevelsApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/dunningManagement/dunningManagement.acl.ts b/test/generated/dist/dunningManagement/dunningManagement.acl.ts new file mode 100644 index 0000000..6e5c932 --- /dev/null +++ b/test/generated/dist/dunningManagement/dunningManagement.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningManagementAcl { + /** + * Use for `useListDunnings` query ability. For global ability, omit the object parameter. + * @description List dunnings + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListDunnings` query + */ + export const canUseListDunnings = (object?: { officeId: string }) => + ["Read", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< + "Read", + "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) + >; + + /** + * Use for `useCreateDunningWithInvoices` mutation ability. For global ability, omit the object parameter. + * @description Create dunning + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDunningWithInvoices` mutation + */ + export const canUseCreateDunningWithInvoices = (object?: { officeId: string }) => + ["Create", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< + "Create", + "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) + >; + + /** + * Use for `useGetDunningEml` query or `useGetDunningEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download dunning as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDunningEml` query or `useGetDunningEmlMutation` mutation + */ + export const canUseGetDunningEml = (object?: { officeId: string }) => + ["Read", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< + "Read", + "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/dunningManagement/dunningManagement.api.ts b/test/generated/dist/dunningManagement/dunningManagement.api.ts new file mode 100644 index 0000000..57126e1 --- /dev/null +++ b/test/generated/dist/dunningManagement/dunningManagement.api.ts @@ -0,0 +1,78 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningManagementModels } from "./dunningManagement.models"; + +export namespace DunningManagementApi { + export const listDunnings = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningManagementModels.DunningFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningManagementModels.ListDunningsResponseSchema }, + `/offices/${officeId}/dunnings`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const createDunningWithInvoices = ( + partnerId: string, + officeId: string, + data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DunningManagementModels.DunningResponseDtoSchema }, + `/offices/${officeId}/partners/${partnerId}/dunnings`, + ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), + config, + ); + }; + export const dataGenFake = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, + `/data-gen-fake`, + config, + ); + }; + export const getDunningEml = (officeId: string, dunningId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/dunnings/${dunningId}/eml`, { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }); + }; +} diff --git a/test/generated/dist/dunningManagement/dunningManagement.configs.ts b/test/generated/dist/dunningManagement/dunningManagement.configs.ts new file mode 100644 index 0000000..6c13fc7 --- /dev/null +++ b/test/generated/dist/dunningManagement/dunningManagement.configs.ts @@ -0,0 +1,59 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningManagementModels } from "./dunningManagement.models"; +import { DunningManagementQueries } from "./dunningManagement.queries"; +import { DunningManagementAcl } from "./dunningManagement.acl"; + +export namespace DunningManagementConfigs { + export const dunningsConfig = { + meta: { + title: "Dunnings", + }, + readAll: { + acl: DunningManagementAcl.canUseListDunnings, + schema: DunningManagementModels.DunningResponseDtoSchema, + paginated: DunningManagementQueries.useListDunnings, + infinite: DunningManagementQueries.useListDunningsInfinite, + filters: { + schema: DunningManagementModels.DunningFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningManagementModels.DunningFilterDtoSchema, + options: { + inputs: { + status: true, + partnerId: true, + level: true, + outstandingAmountMin: true, + outstandingAmountMax: true, + createdFrom: true, + createdTo: true, + confirmedBy: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DunningManagementModels.DunningResponseDtoSchema, + options: { + columns: { + id: true, + partner: true, + level: true, + dunningLevelId: true, + status: true, + invoiceCount: true, + outstandingAmount: true, + currencyNotation: true, + daysOverdue: true, + dunningFee: true, + createdAt: true, + statusChangedOn: true, + confirmedBy: true, + documentUrl: true, + }, + sortable: DunningManagementModels.ListDunningsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/dunningManagement/dunningManagement.models.ts b/test/generated/dist/dunningManagement/dunningManagement.models.ts new file mode 100644 index 0000000..1e56fe9 --- /dev/null +++ b/test/generated/dist/dunningManagement/dunningManagement.models.ts @@ -0,0 +1,299 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningManagementModels { + /** + * DunningPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ + export const DunningPartnerDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), + }) + .readonly(); + export type DunningPartnerDto = z.infer; + + /** + * DunningConfirmedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DunningConfirmedByDto = z.infer; + + /** + * DunningStatusSchema + * @type { enum } + */ + export const DunningStatusSchema = z.enum(["PREPARED", "ISSUED"]); + export type DunningStatus = z.infer; + export const DunningStatus = DunningStatusSchema.enum; + + /** + * DunningResponseDtoSchema + * @type { object } + * @property { string } id + * @property { DunningPartnerDto } partner + * @property { number } level + * @property { string } dunningLevelId + * @property { string } status + * @property { number } invoiceCount + * @property { number } outstandingAmount + * @property { string } currencyNotation + * @property { number } daysOverdue + * @property { number } dunningFee + * @property { string } createdAt + * @property { string } statusChangedOn + * @property { DunningConfirmedByDto } confirmedBy + * @property { string } documentUrl + */ + export const DunningResponseDtoSchema = z + .object({ + id: z.string(), + partner: DunningPartnerDtoSchema, + level: z.number(), + dunningLevelId: z.string().nullish(), + status: DunningStatusSchema, + invoiceCount: z.number(), + outstandingAmount: z.number(), + currencyNotation: z.string(), + daysOverdue: z.number(), + dunningFee: z.number(), + createdAt: z.iso.datetime({ offset: true }), + statusChangedOn: z.iso.datetime({ offset: true }), + confirmedBy: DunningConfirmedByDtoSchema.nullish(), + documentUrl: z.string().nullish(), + }) + .readonly(); + export type DunningResponseDto = z.infer; + + /** + * DunningFilterDtoSchema + * @type { object } + * @property { DunningStatus[] } status + * @property { string } partnerId Partner ID to filter by + * @property { array[] } level Dunning level(s) to filter by + * @property { number } outstandingAmountMin Minimum outstanding amount + * @property { number } outstandingAmountMax Maximum outstanding amount + * @property { string } createdFrom Created from (ISO date string) + * @property { string } createdTo Created to (ISO date string) + * @property { string } confirmedBy Confirmed by employee ID + */ + export const DunningFilterDtoSchema = z + .object({ + status: z.array(DunningStatusSchema).readonly(), + partnerId: z.string().describe("Partner ID to filter by"), + level: z.array(z.array(z.any()).readonly()).readonly().describe("Dunning level(s) to filter by"), + outstandingAmountMin: z.number().describe("Minimum outstanding amount"), + outstandingAmountMax: z.number().describe("Maximum outstanding amount"), + createdFrom: z.iso.datetime({ offset: true }).describe("Created from (ISO date string)"), + createdTo: z.iso.datetime({ offset: true }).describe("Created to (ISO date string)"), + confirmedBy: z.string().describe("Confirmed by employee ID"), + }) + .readonly(); + export type DunningFilterDto = z.infer; + + /** + * DunningPdfConfigDTOSchema + * @type { object } + * @property { string } headerImageUrl + * @property { string } footerImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ + export const DunningPdfConfigDTOSchema = z + .object({ + headerImageUrl: z.string(), + footerImageUrl: z.string(), + showWatermarkOnDocuments: z.boolean(), + locale: CommonModels.LocaleEnumSchema.nullish(), + }) + .readonly(); + export type DunningPdfConfigDTO = z.infer; + + /** + * DunningPdfBusinessPartnerDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } address + * @property { string } referenceNumber + */ + export const DunningPdfBusinessPartnerDTOSchema = z + .object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }) + .readonly(); + export type DunningPdfBusinessPartnerDTO = z.infer; + + /** + * DunningPdfInvoiceDTOSchema + * @type { object } + * @property { string } invoiceNumber + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } daysOverdue + * @property { number } dunningLevel + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + * @property { number } interest + */ + export const DunningPdfInvoiceDTOSchema = z + .object({ + invoiceNumber: z.string(), + issuingDate: z.iso.datetime({ offset: true }), + dueDate: z.iso.datetime({ offset: true }).nullish(), + daysOverdue: z.number(), + dunningLevel: z.number(), + invoiceAmount: z.number(), + outstandingAmount: z.number(), + currencyNotation: z.string(), + interest: z.number().nullish(), + }) + .readonly(); + export type DunningPdfInvoiceDTO = z.infer; + + /** + * DunningPdfTotalDTOSchema + * @type { object } + * @property { number } invoicesSum + * @property { number } dunningFee + * @property { number } interest + * @property { string } currencyNotation + */ + export const DunningPdfTotalDTOSchema = z + .object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }) + .readonly(); + export type DunningPdfTotalDTO = z.infer; + + /** + * DunningPdfBankAccountDTOSchema + * @type { object } + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + */ + export const DunningPdfBankAccountDTOSchema = z + .object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }) + .readonly(); + export type DunningPdfBankAccountDTO = z.infer; + + /** + * DunningPdfUpcomingInvoiceDTOSchema + * @type { object } + * @property { string } number + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } dueDays + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + */ + export const DunningPdfUpcomingInvoiceDTOSchema = z + .object({ + number: z.string(), + issuingDate: z.iso.datetime({ offset: true }).nullish(), + dueDate: z.iso.datetime({ offset: true }).nullish(), + dueDays: z.number().nullish(), + invoiceAmount: z.number().nullish(), + outstandingAmount: z.number().nullish(), + currencyNotation: z.string().nullish(), + }) + .readonly(); + export type DunningPdfUpcomingInvoiceDTO = z.infer; + + /** + * DunningPdfPayloadDTOSchema + * @type { object } + * @property { string } dunningId + * @property { number } dunningLevel + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { DunningPdfBusinessPartnerDTO } businessPartner + * @property { DunningPdfInvoiceDTO[] } invoices + * @property { DunningPdfTotalDTO } total + * @property { DunningPdfBankAccountDTO } bankAccount + * @property { string } employeeName + * @property { DunningPdfConfigDTO } config + * @property { CommonModels.LanguageEnum } language + * @property { DunningPdfUpcomingInvoiceDTO[] } upcomingInvoices + */ + export const DunningPdfPayloadDTOSchema = z + .object({ + dunningId: z.string(), + dunningLevel: z.number(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + businessPartner: DunningPdfBusinessPartnerDTOSchema, + invoices: z.array(DunningPdfInvoiceDTOSchema).readonly(), + total: DunningPdfTotalDTOSchema, + bankAccount: DunningPdfBankAccountDTOSchema, + employeeName: z.string().nullable(), + config: DunningPdfConfigDTOSchema, + language: CommonModels.LanguageEnumSchema.nullish(), + upcomingInvoices: z.array(DunningPdfUpcomingInvoiceDTOSchema).readonly().nullish(), + }) + .readonly(); + export type DunningPdfPayloadDTO = z.infer; + + /** + * CreateDunningWithInvoicesRequestDTOSchema + * @type { object } + * @property { string[] } invoiceIds Array of outstanding invoice IDs to include in the dunning. Example: `123e4567-e89b-12d3-a456-426614174000,123e4567-e89b-12d3-a456-426614174001` + * @property { string } dunningLevelId The ID of the dunning level to use for this dunning. Example: `123e4567-e89b-12d3-a456-426614174002` + * @property { number } dunningFee Optional dunning fee to use. If not provided, the fee from the dunning level will be used. Minimum: `0`. Example: `25.5` + * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` + * @property { boolean } includeUpcomingInvoices + */ + export const CreateDunningWithInvoicesRequestDTOSchema = z + .object({ + invoiceIds: z.array(z.string()).readonly().describe("Array of outstanding invoice IDs to include in the dunning"), + dunningLevelId: z.string().describe("The ID of the dunning level to use for this dunning"), + dunningFee: z + .number() + .gte(0) + .describe("Optional dunning fee to use. If not provided, the fee from the dunning level will be used") + .nullish(), + interestRate: z.number().gte(0).lte(100).nullish(), + includeUpcomingInvoices: z.boolean().nullish(), + }) + .readonly(); + export type CreateDunningWithInvoicesRequestDTO = z.infer; + + /** + * ListDunningsOrderParamEnumSchema + * @type { enum } + */ + export const ListDunningsOrderParamEnumSchema = z.enum([ + "createdAt", + "level", + "outstandingAmount", + "statusChangedOn", + ]); + export type ListDunningsOrderParamEnum = z.infer; + export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; + + /** + * ListDunningsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningResponseDto[] } items + */ + export const ListDunningsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(DunningResponseDtoSchema).readonly() }).readonly().shape, + }); + export type ListDunningsResponse = z.infer; +} diff --git a/test/generated/dist/dunningManagement/dunningManagement.queries.ts b/test/generated/dist/dunningManagement/dunningManagement.queries.ts new file mode 100644 index 0000000..270d1d2 --- /dev/null +++ b/test/generated/dist/dunningManagement/dunningManagement.queries.ts @@ -0,0 +1,241 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningManagementAcl } from "./dunningManagement.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningManagementModels } from "./dunningManagement.models"; +import { DunningManagementApi } from "./dunningManagement.api"; + +export namespace DunningManagementQueries { + export const moduleName = QueryModule.DunningManagement; + + export const keys = { + all: [moduleName] as const, + listDunnings: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningManagementModels.DunningFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/dunnings", officeId, limit, order, filter, page, cursor] as const, + listDunningsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningManagementModels.DunningFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/dunnings", "infinite", officeId, limit, order, filter, cursor] as const, + dataGenFake: () => [...keys.all, "/data-gen-fake"] as const, + getDunningEml: (officeId: string, dunningId: string) => + [...keys.all, "/offices/:officeId/dunnings/:dunningId/eml", officeId, dunningId] as const, + }; + + /** + * Query `useListDunnings` + * @summary List dunnings for an office + * @permission Requires `canUseListDunnings` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` + * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListDunnings = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningManagementModels.DunningFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningManagementAcl.canUseListDunnings({ officeId })); + return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListDunningsInfinite + * @summary List dunnings for an office + * @permission Requires `canUseListDunnings` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` + * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListDunningsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningManagementModels.DunningFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningManagementAcl.canUseListDunnings({ officeId })); + return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreateDunningWithInvoices` + * @summary Create a dunning with outstanding invoices + * @permission Requires `canUseCreateDunningWithInvoices` ability + * @param { string } mutation.partnerId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningManagementModels.CreateDunningWithInvoicesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateDunningWithInvoices = ( + options?: AppMutationOptions< + typeof DunningManagementApi.createDunningWithInvoices, + { partnerId: string; officeId: string; data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ partnerId, officeId, data }) => { + checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId })); + return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useDataGenFake` + * @summary Expose dunning PDF payload DTO for model generation + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useDataGenFake = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.dataGenFake(), + queryFn: () => DunningManagementApi.dataGenFake(config), + ...options, + }); + }; + + /** + * Query `useGetDunningEml` - recommended when file should be cached + * @summary Get dunning as EML file with PDF attachment + * @permission Requires `canUseGetDunningEml` ability + * @param { string } object.officeId Path parameter + * @param { string } object.dunningId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const useGetDunningEml = ( + { officeId, dunningId }: { officeId: string; dunningId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDunningEml(officeId, dunningId), + queryFn: () => { + checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId })); + return DunningManagementApi.getDunningEml(officeId, dunningId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useGetDunningEmlMutation` - recommended when file should not be cached + * @summary Get dunning as EML file with PDF attachment + * @permission Requires `canUseGetDunningEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.dunningId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGetDunningEmlMutation = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, dunningId }) => { + checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId })); + return DunningManagementApi.getDunningEml(officeId, dunningId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, dunningId } = variables; + const updateKeys = [keys.getDunningEml(officeId, dunningId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts new file mode 100644 index 0000000..48fca0f --- /dev/null +++ b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningPartnerOutstandingInvoicesAcl { + /** + * Use for `useListPartnerOutstandingInvoiceSummaries` query ability. For global ability, omit the object parameter. + * @description List office outstanding invoice summaries per partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoiceSummaries` query + */ + export const canUseListPartnerOutstandingInvoiceSummaries = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useListPartnerOutstandingInvoices` query ability. For global ability, omit the object parameter. + * @description List partner outstanding invoices + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoices` query + */ + export const canUseListPartnerOutstandingInvoices = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useListRecommendedDunningLevels` mutation ability. For global ability, omit the object parameter. + * @description List recommended dunning levels for a partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRecommendedDunningLevels` mutation + */ + export const canUseListRecommendedDunningLevels = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts new file mode 100644 index 0000000..68e22c8 --- /dev/null +++ b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts @@ -0,0 +1,108 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; + +export namespace DunningPartnerOutstandingInvoicesApi { + export const listPartnerOutstandingInvoiceSummaries = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, + `/offices/${officeId}/partner-outstanding-invoices`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const listPartnerOutstandingInvoices = ( + partnerId: string, + officeId: string, + limit: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, + `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const listRecommendedDunningLevels = ( + partnerId: string, + officeId: string, + data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, + `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, + ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts new file mode 100644 index 0000000..66cb46a --- /dev/null +++ b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts @@ -0,0 +1,96 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; +import { DunningPartnerOutstandingInvoicesQueries } from "./dunningPartnerOutstandingInvoices.queries"; +import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; + +export namespace DunningPartnerOutstandingInvoicesConfigs { + export const partnerOutstandingInvoicesConfig = { + meta: { + title: "Partner Outstanding Invoices", + }, + readAll: { + acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries, + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, + paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummaries, + infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummariesInfinite, + filters: { + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, + options: { + inputs: { + search: true, + daysOverdueMin: true, + partnerId: true, + outstandingAmountMin: true, + currency: true, + dunningSystemId: true, + lastDunningDate: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, + options: { + columns: { + partnerId: true, + partnerName: true, + partnerCountry: true, + dunningSystemId: true, + dunningSystemName: true, + invoiceCount: true, + daysOverdue: true, + outstandingAmount: true, + currencyNotation: true, + lastDunningDate: true, + }, + sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, + }, + }), + }, + }; + + export const outstandingInvoicesConfig = { + meta: { + title: "Outstanding Invoices", + }, + readAll: { + acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices, + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, + paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoices, + infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoicesInfinite, + filters: { + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, + options: { + inputs: { + partnerId: true, + currency: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, + options: { + columns: { + invoiceId: true, + invoiceNumber: true, + invoiceDate: true, + invoiceAmount: true, + owedAmount: true, + currencyNotation: true, + daysOverdue: true, + dueDate: true, + invoiceInReview: true, + dunningBlock: true, + }, + sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts new file mode 100644 index 0000000..23aa85a --- /dev/null +++ b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts @@ -0,0 +1,207 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningPartnerOutstandingInvoicesModels { + /** + * PartnerOutstandingInvoiceSummaryFilterDtoSchema + * @type { object } + * @property { string } search Search string (partner name) + * @property { number } daysOverdueMin Minimum days overdue + * @property { string } partnerId Partner ID + * @property { number } outstandingAmountMin Minimum outstanding amount + * @property { string } currency Currency + * @property { string } dunningSystemId Dunning system ID + * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range + */ + export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z + .object({ + search: z.string().describe("Search string (partner name)"), + daysOverdueMin: z.number().describe("Minimum days overdue"), + partnerId: z.string().describe("Partner ID"), + outstandingAmountMin: z.number().describe("Minimum outstanding amount"), + currency: z.string().describe("Currency"), + dunningSystemId: z.string().describe("Dunning system ID"), + lastDunningDate: CommonModels.DateRangeDtoSchema.describe("Last dunning date range"), + }) + .readonly(); + export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer< + typeof PartnerOutstandingInvoiceSummaryFilterDtoSchema + >; + + /** + * PartnerOutstandingInvoiceSummaryResponseDtoSchema + * @type { object } + * @property { string } partnerId Business partner ID + * @property { string } partnerName Business partner name + * @property { string } partnerCountry Business partner country + * @property { string } dunningSystemId Dunning system ID + * @property { string } dunningSystemName Dunning system name + * @property { number } invoiceCount Number of outstanding invoices + * @property { number } daysOverdue Maximum days overdue across all partner invoices + * @property { number } outstandingAmount Total outstanding amount + * @property { string } currencyNotation Currency of partner invoices + * @property { string } lastDunningDate Date of the most recent issued dunning document + */ + export const PartnerOutstandingInvoiceSummaryResponseDtoSchema = z + .object({ + partnerId: z.string().describe("Business partner ID"), + partnerName: z.string().describe("Business partner name"), + partnerCountry: z.string().describe("Business partner country").nullish(), + dunningSystemId: z.string().describe("Dunning system ID"), + dunningSystemName: z.string().describe("Dunning system name"), + invoiceCount: z.number().describe("Number of outstanding invoices"), + daysOverdue: z.number().describe("Maximum days overdue across all partner invoices").nullish(), + outstandingAmount: z.number().describe("Total outstanding amount"), + currencyNotation: z.string().describe("Currency of partner invoices"), + lastDunningDate: z.iso + .datetime({ offset: true }) + .describe("Date of the most recent issued dunning document") + .nullish(), + }) + .readonly(); + export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer< + typeof PartnerOutstandingInvoiceSummaryResponseDtoSchema + >; + + /** + * PartnerOutstandingInvoiceResponseDtoSchema + * @type { object } + * @property { string } invoiceId Invoice ID + * @property { string } invoiceNumber Invoice number + * @property { string } invoiceDate Invoice date + * @property { number } invoiceAmount Invoice amount + * @property { number } owedAmount Owed amount + * @property { string } currencyNotation Currency notation + * @property { number } daysOverdue Days overdue + * @property { string } dueDate Due date + * @property { boolean } invoiceInReview + * @property { boolean } dunningBlock + */ + export const PartnerOutstandingInvoiceResponseDtoSchema = z + .object({ + invoiceId: z.string().describe("Invoice ID"), + invoiceNumber: z.string().describe("Invoice number").nullish(), + invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date").nullish(), + invoiceAmount: z.number().describe("Invoice amount"), + owedAmount: z.number().describe("Owed amount"), + currencyNotation: z.string().describe("Currency notation"), + daysOverdue: z.number().describe("Days overdue").nullish(), + dueDate: z.iso.datetime({ offset: true }).describe("Due date").nullish(), + invoiceInReview: z.boolean().nullish(), + dunningBlock: z.boolean().nullish(), + }) + .readonly(); + export type PartnerOutstandingInvoiceResponseDto = z.infer; + + /** + * PartnerOutstandingInvoiceFilterDtoSchema + * @type { object } + * @property { string } partnerId Partner ID to filter by + * @property { string } currency Invoice currency notation to filter by + */ + export const PartnerOutstandingInvoiceFilterDtoSchema = z + .object({ + partnerId: z.string().describe("Partner ID to filter by"), + currency: z.string().describe("Invoice currency notation to filter by"), + }) + .readonly(); + export type PartnerOutstandingInvoiceFilterDto = z.infer; + + /** + * RecommendedDunningLevelsRequestDtoSchema + * @type { object } + * @property { string[] } invoiceIds Invoice IDs used to calculate the recommended dunning level. Min Items: `1`. Example: `123e4567-e89b-12d3-a456-426614174000` + */ + export const RecommendedDunningLevelsRequestDtoSchema = z + .object({ + invoiceIds: z + .array(z.string()) + .readonly() + .min(1) + .describe("Invoice IDs used to calculate the recommended dunning level"), + }) + .readonly(); + export type RecommendedDunningLevelsRequestDto = z.infer; + + /** + * RecommendedLabelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { boolean } isRecommended + */ + export const RecommendedLabelResponseDtoSchema = z + .object({ id: z.string(), label: z.string(), isRecommended: z.boolean() }) + .readonly(); + export type RecommendedLabelResponseDto = z.infer; + + /** + * ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema + * @type { enum } + */ + export const ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema = z.enum([ + "outstandingAmount", + "daysOverdue", + "lastDunningDate", + "invoiceCount", + "partnerCountry", + "partnerName", + "dunningSystemName", + ]); + export type ListPartnerOutstandingInvoiceSummariesOrderParamEnum = z.infer< + typeof ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema + >; + export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = + ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema.enum; + + /** + * ListPartnerOutstandingInvoiceSummariesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items + */ + export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).readonly() }).readonly().shape, + }); + export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer< + typeof ListPartnerOutstandingInvoiceSummariesResponseSchema + >; + + /** + * ListPartnerOutstandingInvoicesOrderParamEnumSchema + * @type { enum } + */ + export const ListPartnerOutstandingInvoicesOrderParamEnumSchema = z.enum(["dueDate", "invoiceDate", "owedAmount"]); + export type ListPartnerOutstandingInvoicesOrderParamEnum = z.infer< + typeof ListPartnerOutstandingInvoicesOrderParamEnumSchema + >; + export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandingInvoicesOrderParamEnumSchema.enum; + + /** + * ListPartnerOutstandingInvoicesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerOutstandingInvoiceResponseDto[] } items + */ + export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).readonly() }).readonly().shape, + }); + export type ListPartnerOutstandingInvoicesResponse = z.infer; + + /** + * ListRecommendedDunningLevelsResponseSchema + * @type { array } + */ + export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema).readonly(); + export type ListRecommendedDunningLevelsResponse = z.infer; +} diff --git a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts new file mode 100644 index 0000000..5719173 --- /dev/null +++ b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts @@ -0,0 +1,365 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; +import { DunningPartnerOutstandingInvoicesApi } from "./dunningPartnerOutstandingInvoices.api"; + +export namespace DunningPartnerOutstandingInvoicesQueries { + export const moduleName = QueryModule.DunningPartnerOutstandingInvoices; + + export const keys = { + all: [moduleName] as const, + listPartnerOutstandingInvoiceSummaries: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/partner-outstanding-invoices", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + listPartnerOutstandingInvoiceSummariesInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/partner-outstanding-invoices", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + listPartnerOutstandingInvoices: ( + partnerId: string, + officeId: string, + limit?: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/partners/:partnerId/outstanding-invoices", + partnerId, + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + listPartnerOutstandingInvoicesInfinite: ( + partnerId: string, + officeId: string, + limit?: number, + order?: string, + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/partners/:partnerId/outstanding-invoices", + "infinite", + partnerId, + officeId, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useListPartnerOutstandingInvoiceSummaries` + * @summary List office outstanding invoice summaries per partner + * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListPartnerOutstandingInvoiceSummaries = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions< + typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries, + TData + >, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId })); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries( + officeId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + }); + }; + + /** + * Infinite query `useListPartnerOutstandingInvoiceSummariesInfinite + * @summary List office outstanding invoice summaries per partner + * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListPartnerOutstandingInvoiceSummariesInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions< + typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries, + TData + >, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId })); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries( + officeId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useListPartnerOutstandingInvoices` + * @summary List outstanding invoices for a specific partner + * @permission Requires `canUseListPartnerOutstandingInvoices` ability + * @param { string } object.partnerId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListPartnerOutstandingInvoices = ( + { + partnerId, + officeId, + limit, + order, + filter, + page, + cursor, + }: { + partnerId: string; + officeId: string; + limit: number; + order?: string; + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId })); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices( + partnerId, + officeId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + }); + }; + + /** + * Infinite query `useListPartnerOutstandingInvoicesInfinite + * @summary List outstanding invoices for a specific partner + * @permission Requires `canUseListPartnerOutstandingInvoices` ability + * @param { string } object.partnerId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListPartnerOutstandingInvoicesInfinite = ( + { + partnerId, + officeId, + limit, + order, + filter, + cursor, + }: { + partnerId: string; + officeId: string; + limit: number; + order?: string; + filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions< + typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices, + TData + >, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId })); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices( + partnerId, + officeId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useListRecommendedDunningLevels` + * @summary List recommended dunning levels for a partner + * @permission Requires `canUseListRecommendedDunningLevels` ability + * @param { string } mutation.partnerId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useListRecommendedDunningLevels = ( + options?: AppMutationOptions< + typeof DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels, + { + partnerId: string; + officeId: string; + data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ partnerId, officeId, data }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId })); + return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/dunningSystems/dunningSystems.acl.ts b/test/generated/dist/dunningSystems/dunningSystems.acl.ts new file mode 100644 index 0000000..2074067 --- /dev/null +++ b/test/generated/dist/dunningSystems/dunningSystems.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningSystemsAcl { + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List dunning system labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Read", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List dunning systems + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Read", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Create", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get dunning system by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Read", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Update", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Archive", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< + "Archive", + "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/dunningSystems/dunningSystems.api.ts b/test/generated/dist/dunningSystems/dunningSystems.api.ts new file mode 100644 index 0000000..684714b --- /dev/null +++ b/test/generated/dist/dunningSystems/dunningSystems.api.ts @@ -0,0 +1,136 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningSystemsModels } from "./dunningSystems.models"; + +export namespace DunningSystemsApi { + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, + `/offices/${officeId}/dunning-systems/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, + `/offices/${officeId}/dunning-systems`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = ( + officeId: string, + data: DunningSystemsModels.CreateDunningSystemRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems`, + ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), + config, + ); + }; + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}`, + config, + ); + }; + export const update = ( + id: string, + officeId: string, + data: DunningSystemsModels.UpdateDunningSystemRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}`, + ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/dunningSystems/dunningSystems.configs.ts b/test/generated/dist/dunningSystems/dunningSystems.configs.ts new file mode 100644 index 0000000..4928e9a --- /dev/null +++ b/test/generated/dist/dunningSystems/dunningSystems.configs.ts @@ -0,0 +1,119 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningSystemsModels } from "./dunningSystems.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningSystemsQueries } from "./dunningSystems.queries"; +import { DunningSystemsAcl } from "./dunningSystems.acl"; + +export namespace DunningSystemsConfigs { + export const dunningSystemsConfig = { + meta: { + title: "Dunning Systems", + }, + readAll: { + acl: DunningSystemsAcl.canUsePaginate, + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + paginated: DunningSystemsQueries.usePaginate, + infinite: DunningSystemsQueries.usePaginateInfinite, + filters: { + schema: DunningSystemsModels.DunningSystemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningSystemsModels.DunningSystemFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + isDefault: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + isDefault: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: DunningSystemsAcl.canUseFindById, + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + query: DunningSystemsQueries.useFindById, + }, + create: { + acl: DunningSystemsAcl.canUseCreate, + schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, + mutation: DunningSystemsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, + options: { + inputs: { + name: true, + isDefault: true, + }, + }, + }), + }, + update: { + acl: DunningSystemsAcl.canUseUpdate, + schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, + mutation: DunningSystemsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, + options: { + inputs: { + name: true, + isDefault: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DunningSystemsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DunningSystemsQueries.usePaginateLabels, + infinite: DunningSystemsQueries.usePaginateLabelsInfinite, + filters: { + schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/dunningSystems/dunningSystems.models.ts b/test/generated/dist/dunningSystems/dunningSystems.models.ts new file mode 100644 index 0000000..f3465f1 --- /dev/null +++ b/test/generated/dist/dunningSystems/dunningSystems.models.ts @@ -0,0 +1,145 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningSystemsModels { + /** + * DunningSystemEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type DunningSystemEmployeeDTO = z.infer; + + /** + * DunningSystemResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name + * @property { boolean } isDefault + * @property { boolean } archived + * @property { string } archivedAt + * @property { string } createdById + * @property { DunningSystemEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DunningSystemEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const DunningSystemResponseDTOSchema = z + .object({ + id: z.string(), + officeId: z.string(), + name: z.string(), + isDefault: z.boolean(), + archived: z.boolean(), + archivedAt: z.iso.datetime({ offset: true }).nullish(), + createdById: z.string().nullish(), + createdBy: DunningSystemEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: DunningSystemEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type DunningSystemResponseDTO = z.infer; + + /** + * DunningSystemLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const DunningSystemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type DunningSystemLabelFilterDto = z.infer; + + /** + * DunningSystemFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + * @property { boolean } isDefault + */ + export const DunningSystemFilterDtoSchema = z + .object({ search: z.string(), archived: z.boolean(), isDefault: z.boolean() }) + .readonly(); + export type DunningSystemFilterDto = z.infer; + + /** + * CreateDunningSystemRequestDTOSchema + * @type { object } + * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` + * @property { boolean } isDefault Is default dunning system + */ + export const CreateDunningSystemRequestDTOSchema = z + .object({ + name: z.string().min(3).max(100).describe("Dunning system name"), + isDefault: z.boolean().describe("Is default dunning system").nullish(), + }) + .readonly(); + export type CreateDunningSystemRequestDTO = z.infer; + + /** + * UpdateDunningSystemRequestDTOSchema + * @type { object } + * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` + * @property { boolean } isDefault Is default dunning system + */ + export const UpdateDunningSystemRequestDTOSchema = z + .object({ + name: z.string().min(3).max(100).describe("Dunning system name"), + isDefault: z.boolean().describe("Is default dunning system"), + }) + .readonly(); + export type UpdateDunningSystemRequestDTO = z.infer; + + /** + * DunningSystemsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const DunningSystemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); + export type DunningSystemsPaginateLabelsOrderParamEnum = z.infer< + typeof DunningSystemsPaginateLabelsOrderParamEnumSchema + >; + export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * DunningSystemsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const DunningSystemsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DunningSystemsPaginateLabelsResponse = z.infer; + + /** + * DunningSystemsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const DunningSystemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); + export type DunningSystemsPaginateOrderParamEnum = z.infer; + export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderParamEnumSchema.enum; + + /** + * DunningSystemsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningSystemResponseDTO[] } items + */ + export const DunningSystemsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(DunningSystemResponseDTOSchema).readonly() }).readonly().shape, + }); + export type DunningSystemsPaginateResponse = z.infer; +} diff --git a/test/generated/dist/dunningSystems/dunningSystems.queries.ts b/test/generated/dist/dunningSystems/dunningSystems.queries.ts new file mode 100644 index 0000000..acd8234 --- /dev/null +++ b/test/generated/dist/dunningSystems/dunningSystems.queries.ts @@ -0,0 +1,420 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningSystemsAcl } from "./dunningSystems.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningSystemsModels } from "./dunningSystems.models"; +import { DunningSystemsApi } from "./dunningSystems.api"; + +export namespace DunningSystemsQueries { + export const moduleName = QueryModule.DunningSystems; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/dunning-systems/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/dunning-systems/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/dunning-systems", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: DunningSystemsModels.DunningSystemFilterDto, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/dunning-systems", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/dunning-systems/:id", id, officeId] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate dunning system labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningSystemsModels.DunningSystemLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId })); + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate dunning system labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningSystemsModels.DunningSystemLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId })); + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginate` + * @summary List dunning systems + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningSystemsModels.DunningSystemFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUsePaginate({ officeId })); + return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary List dunning systems + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: DunningSystemsModels.DunningSystemFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningSystemsAcl.canUsePaginate({ officeId })); + return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create dunning system + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningSystemsModels.CreateDunningSystemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof DunningSystemsApi.create, + { officeId: string; data: DunningSystemsModels.CreateDunningSystemRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningSystemsAcl.canUseCreate({ officeId })); + return DunningSystemsApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get dunning system by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUseFindById({ officeId })); + return DunningSystemsApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update dunning system + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningSystemsModels.UpdateDunningSystemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof DunningSystemsApi.update, + { id: string; officeId: string; data: DunningSystemsModels.UpdateDunningSystemRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(DunningSystemsAcl.canUseUpdate({ officeId })); + return DunningSystemsApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive dunning system + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningSystemsAcl.canUseArchive({ officeId })); + return DunningSystemsApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive dunning system + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId })); + return DunningSystemsApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/employee/employee.acl.ts b/test/generated/dist/employee/employee.acl.ts new file mode 100644 index 0000000..29c1627 --- /dev/null +++ b/test/generated/dist/employee/employee.acl.ts @@ -0,0 +1,115 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmployeeAcl { + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List employees + * @param { string } object.officeId officeId from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId?: string }) => + ["Read", object ? subject("Employee", object) : "Employee"] as AbilityTuple< + "Read", + "Employee" | (ForcedSubject<"Employee"> & { officeId?: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new employee + * @param { string } object.officeId officeId from mutation data + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId?: string }) => + ["Create", object ? subject("Employee", object) : "Employee"] as AbilityTuple< + "Create", + "Employee" | (ForcedSubject<"Employee"> & { officeId?: string }) + >; + + /** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; + + /** + * Use for `useResendOnboardingWithOffice` mutation ability. For global ability, omit the object parameter. + * @description Resend employee onboarding email + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useResendOnboardingWithOffice` mutation + */ + export const canUseResendOnboardingWithOffice = (object?: { officeId: string }) => + ["Create", object ? subject("Employee", object) : "Employee"] as AbilityTuple< + "Create", + "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) + >; + + /** + * Use for `useGet` query ability. + * @description Read Office Employee + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; + + /** + * Use for `useUpdate` mutation ability. + * @description Update Office Employee + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Employee"] as AbilityTuple<"Update", "Employee">; + + /** + * Use for `useGetWithOffice` query ability. For global ability, omit the object parameter. + * @description Read Office Employee + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetWithOffice` query + */ + export const canUseGetWithOffice = (object?: { officeId: string }) => + ["Read", object ? subject("Employee", object) : "Employee"] as AbilityTuple< + "Read", + "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) + >; + + /** + * Use for `useUpdateWithOffice` mutation ability. For global ability, omit the object parameter. + * @description Update Office Employee + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateWithOffice` mutation + */ + export const canUseUpdateWithOffice = (object?: { officeId: string }) => + ["Update", object ? subject("Employee", object) : "Employee"] as AbilityTuple< + "Update", + "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) + >; + + /** + * Use for `useListRoles` query ability. + * @description List employee (global) roles + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query + */ + export const canUseListRoles = () => ["ListRoles", "Employee"] as AbilityTuple<"ListRoles", "Employee">; + + /** + * Use for `useUpdateRoles` mutation ability. + * @description Update employee (global) roles + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation + */ + export const canUseUpdateRoles = () => ["UpdateRoles", "Employee"] as AbilityTuple<"UpdateRoles", "Employee">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "Employee"] as AbilityTuple<"Archive", "Employee">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Unarchive", "Employee"] as AbilityTuple<"Unarchive", "Employee">; +} diff --git a/test/generated/dist/employee/employee.api.ts b/test/generated/dist/employee/employee.api.ts new file mode 100644 index 0000000..fdf9cd7 --- /dev/null +++ b/test/generated/dist/employee/employee.api.ts @@ -0,0 +1,223 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeModels } from "./employee.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeApi { + export const paginate = ( + limit: number, + order?: string, + populate?: EmployeeModels.EmployeePaginatePopulateParam, + filter?: EmployeeModels.EmployeeFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: EmployeeModels.EmployeePaginateResponseSchema }, `/employees`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { + type: "query", + name: "populate", + }), + filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: EmployeeModels.EmployeeCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees`, + ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), + config, + ); + }; + export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/one-step`, + ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), + config, + ); + }; + export const findAll = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, `/employees/labels`, { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + }); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: EmployeeModels.EmployeeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, + `/employees/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const resendOnboarding = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/employees/${employeeId}/resend-onboarding`, + undefined, + config, + ); + }; + export const resendOnboardingWithOffice = (officeId: string, employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, + undefined, + config, + ); + }; + export const get = ( + employeeId: string, + populate?: EmployeeModels.EmployeeGetPopulateParam, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: EmployeeModels.EmployeeResponseSchema }, `/employees/${employeeId}`, { + ...config, + params: { + populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { + type: "query", + name: "populate", + }), + }, + }); + }; + export const update = ( + employeeId: string, + data: EmployeeModels.EmployeeUpdateRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}`, + ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), + config, + ); + }; + export const getWithOffice = ( + officeId: string, + employeeId: string, + populate?: EmployeeModels.GetWithOfficePopulateParam, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/offices/${officeId}/employees/${employeeId}`, + { + ...config, + params: { + populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { + type: "query", + name: "populate", + }), + }, + }, + ); + }; + export const updateWithOffice = ( + officeId: string, + employeeId: string, + data: EmployeeModels.EmployeeUpdateRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/offices/${officeId}/employees/${employeeId}`, + ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), + config, + ); + }; + export const listRoles = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, + `/employees/${employeeId}/roles`, + config, + ); + }; + export const updateRoles = ( + employeeId: string, + data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, + `/employees/${employeeId}/roles`, + ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), + config, + ); + }; + export const archive = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}/archive`, + undefined, + config, + ); + }; + export const unarchive = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/employee/employee.configs.ts b/test/generated/dist/employee/employee.configs.ts new file mode 100644 index 0000000..d2e574e --- /dev/null +++ b/test/generated/dist/employee/employee.configs.ts @@ -0,0 +1,134 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeeModels } from "./employee.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeQueries } from "./employee.queries"; +import { EmployeeAcl } from "./employee.acl"; + +export namespace EmployeeConfigs { + export const employeesConfig = { + meta: { + title: "Employees", + }, + readAll: { + acl: EmployeeAcl.canUsePaginate, + schema: EmployeeModels.EmployeeResponseSchema, + paginated: EmployeeQueries.usePaginate, + infinite: EmployeeQueries.usePaginateInfinite, + filters: { + schema: EmployeeModels.EmployeeFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeFilterDtoSchema, + options: { + inputs: { + office: true, + roles: true, + primaryOfficeId: true, + firstName: true, + lastName: true, + email: true, + ids: true, + archived: true, + search: true, + officeRole: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: EmployeeModels.EmployeeResponseSchema, + options: { + columns: { + id: true, + email: true, + firstName: true, + lastName: true, + locale: true, + phone: true, + archived: true, + primaryOfficeId: true, + primaryOffice: true, + employments: true, + roles: true, + createdAt: true, + updatedAt: true, + }, + sortable: EmployeeModels.EmployeePaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: EmployeeAcl.canUseGet, + schema: EmployeeModels.EmployeeResponseSchema, + query: EmployeeQueries.useGet, + }, + create: { + acl: EmployeeAcl.canUseCreate, + schema: EmployeeModels.EmployeeCreateRequestSchema, + mutation: EmployeeQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeCreateRequestSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + locale: true, + primaryOfficeId: true, + phone: true, + }, + }, + }), + }, + update: { + acl: EmployeeAcl.canUseUpdate, + schema: EmployeeModels.EmployeeUpdateRequestSchema, + mutation: EmployeeQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeUpdateRequestSchema, + options: { + inputs: { + firstName: true, + lastName: true, + phone: true, + locale: true, + primaryOfficeId: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: EmployeeAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: EmployeeQueries.usePaginateLabels, + infinite: EmployeeQueries.usePaginateLabelsInfinite, + filters: { + schema: EmployeeModels.EmployeeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/employee/employee.models.ts b/test/generated/dist/employee/employee.models.ts new file mode 100644 index 0000000..6aa71fa --- /dev/null +++ b/test/generated/dist/employee/employee.models.ts @@ -0,0 +1,325 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeModels { + /** + * EmployeeResponseSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { CommonModels.LocaleEnum } locale + * @property { string } phone Phone number + * @property { boolean } archived Archived + * @property { string } primaryOfficeId Primary office id + * @property { CommonModels.EmployeeOfficeResponse } primaryOffice Primary office + * @property { CommonModels.EmploymentResponse[] } employments Employments + * @property { CommonModels.EmployeeRoleResponse[] } roles Global Roles + * @property { string } createdAt + * @property { string } updatedAt + */ + export const EmployeeResponseSchema = z + .object({ + id: z.string().describe("Employee ID"), + email: z.email().describe("Email"), + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + locale: CommonModels.LocaleEnumSchema.nullish(), + phone: z.string().describe("Phone number").nullish(), + archived: z.boolean().describe("Archived").nullish(), + primaryOfficeId: z.string().describe("Primary office id").nullish(), + primaryOffice: CommonModels.EmployeeOfficeResponseSchema.describe("Primary office").nullish(), + employments: z.array(CommonModels.EmploymentResponseSchema).readonly().describe("Employments").nullish(), + roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type EmployeeResponse = z.infer; + + /** + * EmployeeCreateRequestSchema + * @type { object } + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { CommonModels.LocaleEnum } locale + * @property { string } primaryOfficeId Primary office ID + * @property { string } phone Phone number + */ + export const EmployeeCreateRequestSchema = z + .object({ + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + email: z.email().describe("Email"), + locale: CommonModels.LocaleEnumSchema.nullish(), + primaryOfficeId: z.string().describe("Primary office ID").nullish(), + phone: z.string().describe("Phone number").nullish(), + }) + .readonly(); + export type EmployeeCreateRequest = z.infer; + + /** + * EmployeeOneStepCreateEmploymentRequestSchema + * @type { object } + * @property { string } officeId + * @property { string[] } roleIds Array of office role IDs + */ + export const EmployeeOneStepCreateEmploymentRequestSchema = z + .object({ + officeId: z.string(), + roleIds: z.array(z.string()).readonly().describe("Array of office role IDs").nullish(), + }) + .readonly(); + export type EmployeeOneStepCreateEmploymentRequest = z.infer; + + /** + * EmployeeOneStepCreateRequestSchema + * @type { object } + * @property { CommonModels.LocaleEnum } locale + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { string } phone Phone number + * @property { string[] } roleIds Array of global role IDs + * @property { string } primaryOfficeId Primary office ID + * @property { EmployeeOneStepCreateEmploymentRequest[] } employments Employments. Min Items: `1` + */ + export const EmployeeOneStepCreateRequestSchema = z + .object({ + locale: CommonModels.LocaleEnumSchema.nullish(), + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + email: z.email().describe("Email"), + phone: z.string().describe("Phone number").nullish(), + roleIds: z.array(z.string()).readonly().describe("Array of global role IDs").nullish(), + primaryOfficeId: z.string().describe("Primary office ID").nullish(), + employments: z.array(EmployeeOneStepCreateEmploymentRequestSchema).readonly().min(1).describe("Employments"), + }) + .readonly(); + export type EmployeeOneStepCreateRequest = z.infer; + + /** + * EmployeeUpdateRequestSchema + * @type { object } + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number of the employee + * @property { CommonModels.LocaleEnum } locale + * @property { string } primaryOfficeId + */ + export const EmployeeUpdateRequestSchema = z + .object({ + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + phone: z.string().describe("Phone number of the employee"), + locale: CommonModels.LocaleEnumSchema, + primaryOfficeId: z.string(), + }) + .readonly(); + export type EmployeeUpdateRequest = z.infer; + + /** + * EmployeeFilterDtoSchema + * @type { object } + * @property { string } office Office ID (single select, offices the user has access to) + * @property { string[] } roles Role IDs (multiselect) + * @property { string } primaryOfficeId Primary office id + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { string[] } ids Ids + * @property { boolean } archived Archived + * set to true to only return archived employees + * does not return archived employees by default. Default: `false` + * @property { string } search Free text search multiple fields + * @property { string } officeRole Office role + */ + export const EmployeeFilterDtoSchema = z + .object({ + office: z.string().describe("Office ID (single select, offices the user has access to)"), + roles: z.array(z.string()).readonly().describe("Role IDs (multiselect)"), + primaryOfficeId: z.string().describe("Primary office id"), + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + email: z.string().describe("Email"), + ids: z.array(z.string()).readonly().describe("Ids"), + archived: z + .boolean() + .describe(`Archived + set to true to only return archived employees + does not return archived employees by default`) + .default(false), + search: z.string().describe("Free text search multiple fields"), + officeRole: z.string().describe("Office role"), + }) + .readonly(); + export type EmployeeFilterDto = z.infer; + + /** + * EmployeeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type EmployeeLabelFilterDto = z.infer; + + /** + * EmployeeRoleMemberResponseSchema + * @type { object } + * @property { string } roleId + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string[] } permissions Permissions associated with the role + */ + export const EmployeeRoleMemberResponseSchema = z + .object({ + roleId: z.string(), + name: z.string().describe("Name of the role"), + color: z.string().describe("Color associated with the role").nullish(), + description: z.string().describe("Description of the role").nullish(), + permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), + }) + .readonly(); + export type EmployeeRoleMemberResponse = z.infer; + + /** + * EmployeeRoleMembershipsUpdateRequestSchema + * @type { object } + * @property { string[] } roleIds Array of role IDs + */ + export const EmployeeRoleMembershipsUpdateRequestSchema = z + .object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }) + .readonly(); + export type EmployeeRoleMembershipsUpdateRequest = z.infer; + + /** + * EmployeePaginateOrderParamEnumSchema + * @type { enum } + */ + export const EmployeePaginateOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); + export type EmployeePaginateOrderParamEnum = z.infer; + export const EmployeePaginateOrderParamEnum = EmployeePaginateOrderParamEnumSchema.enum; + + /** + * EmployeePopulateFieldSchema + * @type { enum } + */ + export const EmployeePopulateFieldSchema = z.enum([ + "employments", + "primaryOffice", + "roles", + "employments.roles", + "employments.office", + ]); + export type EmployeePopulateField = z.infer; + export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; + + /** + * EmployeePaginatePopulateParamSchema + * @type { array } + */ + export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); + export type EmployeePaginatePopulateParam = z.infer; + + /** + * EmployeePaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeResponse[] } items + */ + export const EmployeePaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeeResponseSchema).readonly() }).readonly().shape, + }); + export type EmployeePaginateResponse = z.infer; + + /** + * EmployeeFindAllResponseSchema + * @type { array } + */ + export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type EmployeeFindAllResponse = z.infer; + + /** + * EmployeePaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const EmployeePaginateLabelsOrderParamEnumSchema = z.enum([ + "firstName", + "lastName", + "email", + "name", + "createdAt", + ]); + export type EmployeePaginateLabelsOrderParamEnum = z.infer; + export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderParamEnumSchema.enum; + + /** + * EmployeePaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const EmployeePaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type EmployeePaginateLabelsResponse = z.infer; + + /** + * EmployeeGetPopulateParamSchema + * @type { array } + */ + export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); + export type EmployeeGetPopulateParam = z.infer; + + /** + * GetWithOfficePopulateParamSchema + * @type { array } + */ + export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); + export type GetWithOfficePopulateParam = z.infer; + + /** + * EmployeeListRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleMemberResponse[] } items + */ + export const EmployeeListRolesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape, + }); + export type EmployeeListRolesResponse = z.infer; + + /** + * EmployeeUpdateRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleMemberResponse[] } items + */ + export const EmployeeUpdateRolesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape, + }); + export type EmployeeUpdateRolesResponse = z.infer; +} diff --git a/test/generated/dist/employee/employee.queries.ts b/test/generated/dist/employee/employee.queries.ts new file mode 100644 index 0000000..ab095fe --- /dev/null +++ b/test/generated/dist/employee/employee.queries.ts @@ -0,0 +1,626 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeeAcl } from "./employee.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeModels } from "./employee.models"; +import { EmployeeApi } from "./employee.api"; + +export namespace EmployeeQueries { + export const moduleName = QueryModule.Employee; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + populate?: EmployeeModels.EmployeePaginatePopulateParam, + filter?: EmployeeModels.EmployeeFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/employees", limit, order, populate, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + populate?: EmployeeModels.EmployeePaginatePopulateParam, + filter?: EmployeeModels.EmployeeFilterDto, + cursor?: string, + ) => [...keys.all, "/employees", "infinite", limit, order, populate, filter, cursor] as const, + findAll: (search?: string) => [...keys.all, "/employees/labels", search] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: EmployeeModels.EmployeeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/employees/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: EmployeeModels.EmployeeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/employees/labels/paginate", "infinite", limit, order, filter, cursor] as const, + get: (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam) => + [...keys.all, "/employees/:employeeId", employeeId, populate] as const, + getWithOffice: (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam) => + [...keys.all, "/offices/:officeId/employees/:employeeId", officeId, employeeId, populate] as const, + listRoles: (employeeId: string) => [...keys.all, "/employees/:employeeId/roles", employeeId] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Employees + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter + * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + populate, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + populate?: EmployeeModels.EmployeePaginatePopulateParam; + filter?: EmployeeModels.EmployeeFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, populate, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeAcl.canUsePaginate()); + return EmployeeApi.paginate(limit, order, populate, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Employees + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter + * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + populate, + filter, + cursor, + }: { + limit: number; + order?: string; + populate?: EmployeeModels.EmployeePaginatePopulateParam; + filter?: EmployeeModels.EmployeeFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeAcl.canUsePaginate()); + return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create Employee + * @permission Requires `canUseCreate` ability + * @param { EmployeeModels.EmployeeCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmployeeAcl.canUseCreate()); + return EmployeeApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useSingeStepCreate` + * @summary Create Employee in a single step + * - requires Employee:Create for creating a global employee + * - requires Employee:Create{officeId} for creating an office employee (first office is primary) + * - requires Employment:Create{officeId} for creating office employments + * - requires Employee:UpdateRoles for setting global roles + * - requires Employee:UpdateRoles{officeId} for setting office roles + * @param { EmployeeModels.EmployeeOneStepCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useSingeStepCreate = ( + options?: AppMutationOptions< + typeof EmployeeApi.singeStepCreate, + { data: EmployeeModels.EmployeeOneStepCreateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => EmployeeApi.singeStepCreate(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindAll` + * @summary List all employees with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { search }: { search?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search), + queryFn: () => { + checkAcl(EmployeeAcl.canUseFindAll()); + return EmployeeApi.findAll(search, config); + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate employees with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: EmployeeModels.EmployeeLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeAcl.canUsePaginateLabels()); + return EmployeeApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate employees with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: EmployeeModels.EmployeeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeAcl.canUsePaginateLabels()); + return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useResendOnboarding` + * @summary Resend Employee Onboarding Email + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useResendOnboarding = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => EmployeeApi.resendOnboarding(employeeId, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useResendOnboardingWithOffice` + * @permission Requires `canUseResendOnboardingWithOffice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useResendOnboardingWithOffice = ( + options?: AppMutationOptions< + typeof EmployeeApi.resendOnboardingWithOffice, + { officeId: string; employeeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employeeId }) => { + checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId })); + return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGet` + * @summary Get Employee + * - allow global admins and office admins of primary office + * @permission Requires `canUseGet` ability + * @param { string } object.employeeId Path parameter + * @param { EmployeeModels.EmployeeGetPopulateParam } object.populate Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { employeeId, populate }: { employeeId: string; populate?: EmployeeModels.EmployeeGetPopulateParam }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(employeeId, populate), + queryFn: () => { + checkAcl(EmployeeAcl.canUseGet()); + return EmployeeApi.get(employeeId, populate, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Employee + * - allow global admins and office admins of primary office + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof EmployeeApi.update, + { employeeId: string; data: EmployeeModels.EmployeeUpdateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdate()); + return EmployeeApi.update(employeeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetWithOffice` + * @permission Requires `canUseGetWithOffice` ability + * @param { string } object.officeId Path parameter + * @param { string } object.employeeId Path parameter + * @param { EmployeeModels.GetWithOfficePopulateParam } object.populate Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetWithOffice = ( + { + officeId, + employeeId, + populate, + }: { officeId: string; employeeId: string; populate?: EmployeeModels.GetWithOfficePopulateParam }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getWithOffice(officeId, employeeId, populate), + queryFn: () => { + checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId })); + return EmployeeApi.getWithOffice(officeId, employeeId, populate, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateWithOffice` + * @permission Requires `canUseUpdateWithOffice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateWithOffice = ( + options?: AppMutationOptions< + typeof EmployeeApi.updateWithOffice, + { officeId: string; employeeId: string; data: EmployeeModels.EmployeeUpdateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId })); + return EmployeeApi.updateWithOffice(officeId, employeeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, employeeId } = variables; + const updateKeys = [keys.get(employeeId), keys.getWithOffice(officeId, employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListRoles` + * @summary List Employee (global) Roles + * @permission Requires `canUseListRoles` ability + * @param { string } object.employeeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListRoles = ( + { employeeId }: { employeeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoles(employeeId), + queryFn: () => { + checkAcl(EmployeeAcl.canUseListRoles()); + return EmployeeApi.listRoles(employeeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateRoles` + * @summary Update Employee (global) Roles + * @permission Requires `canUseUpdateRoles` ability + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeRoleMembershipsUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateRoles = ( + options?: AppMutationOptions< + typeof EmployeeApi.updateRoles, + { employeeId: string; data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdateRoles()); + return EmployeeApi.updateRoles(employeeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive Employee + * @permission Requires `canUseArchive` ability + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => { + checkAcl(EmployeeAcl.canUseArchive()); + return EmployeeApi.archive(employeeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Un-archive Employee + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => { + checkAcl(EmployeeAcl.canUseUnarchive()); + return EmployeeApi.unarchive(employeeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/employeeAccount/employeeAccount.api.ts b/test/generated/dist/employeeAccount/employeeAccount.api.ts new file mode 100644 index 0000000..e4fa223 --- /dev/null +++ b/test/generated/dist/employeeAccount/employeeAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { EmployeeAccountModels } from "./employeeAccount.models"; + +export namespace EmployeeAccountApi { + export const get = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, + `/employees/account`, + config, + ); + }; +} diff --git a/test/generated/dist/employeeAccount/employeeAccount.models.ts b/test/generated/dist/employeeAccount/employeeAccount.models.ts new file mode 100644 index 0000000..bedbc9f --- /dev/null +++ b/test/generated/dist/employeeAccount/employeeAccount.models.ts @@ -0,0 +1,86 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeAccountModels { + /** + * EmployeeAccountEmploymentDtoSchema + * @type { object } + * @property { string } officeId Office ID + * @property { string } officeName Office name + */ + export const EmployeeAccountEmploymentDtoSchema = z + .object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }) + .readonly(); + export type EmployeeAccountEmploymentDto = z.infer; + + /** + * EmployeeAccountPrimaryOfficeDtoSchema + * @type { object } + * @property { string } officeId Office ID + * @property { string } officeName Office name + */ + export const EmployeeAccountPrimaryOfficeDtoSchema = z + .object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }) + .readonly(); + export type EmployeeAccountPrimaryOfficeDto = z.infer; + + /** + * EmployeeAccountRoleDtoSchema + * @type { object } + * @property { string } name Role name + * @property { string[] } permissions Role permissions + * @property { string } officeId Office ID + */ + export const EmployeeAccountRoleDtoSchema = z + .object({ + name: z.string().describe("Role name"), + permissions: z.array(z.string()).readonly().describe("Role permissions"), + officeId: z.string().describe("Office ID").nullish(), + }) + .readonly(); + export type EmployeeAccountRoleDto = z.infer; + + /** + * EmployeeAccountDtoSchema + * @type { object } + * @property { string } defaultUrl + * @property { string } costCenter + * @property { CommonModels.LocaleEnum } locale + * @property { array[] } aclRules Can hold any type of value + * @property { object } settings Employee settings keyed by setting name + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { EmployeeAccountEmploymentDto[] } employments Employments + * @property { EmployeeAccountPrimaryOfficeDto } primaryOffice Primary office + * @property { EmployeeAccountRoleDto[] } roles Roles + */ + export const EmployeeAccountDtoSchema = z + .object({ + defaultUrl: z.string().nullish(), + costCenter: z.string().nullish(), + locale: CommonModels.LocaleEnumSchema.nullish(), + aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), + settings: z + .union([ + z.object({}).catchall(z.any()).readonly(), + z.array(z.object({}).catchall(z.any()).readonly()).readonly(), + z.string(), + z.array(z.string()).readonly(), + z.array(z.number()).readonly(), + ]) + .describe("Employee settings keyed by setting name"), + id: z.string().describe("Employee ID"), + email: z.email().describe("Email"), + firstName: z.string().describe("First name"), + lastName: z.string().describe("Last name"), + phone: z.string().describe("Phone number").nullish(), + employments: z.array(EmployeeAccountEmploymentDtoSchema).readonly().describe("Employments"), + primaryOffice: EmployeeAccountPrimaryOfficeDtoSchema.describe("Primary office"), + roles: z.array(EmployeeAccountRoleDtoSchema).readonly().describe("Roles"), + }) + .readonly(); + export type EmployeeAccountDto = z.infer; +} diff --git a/test/generated/dist/employeeAccount/employeeAccount.queries.ts b/test/generated/dist/employeeAccount/employeeAccount.queries.ts new file mode 100644 index 0000000..becd6e1 --- /dev/null +++ b/test/generated/dist/employeeAccount/employeeAccount.queries.ts @@ -0,0 +1,32 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeAccountApi } from "./employeeAccount.api"; + +export namespace EmployeeAccountQueries { + export const moduleName = QueryModule.EmployeeAccount; + + export const keys = { + all: [moduleName] as const, + get: () => [...keys.all, "/employees/account"] as const, + }; + + /** + * Query `useGet` + * @summary Get profile of logged-in user + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.get(), + queryFn: () => EmployeeAccountApi.get(config), + ...options, + }); + }; +} diff --git a/test/generated/dist/employeePermissions/employeePermissions.acl.ts b/test/generated/dist/employeePermissions/employeePermissions.acl.ts new file mode 100644 index 0000000..fb09450 --- /dev/null +++ b/test/generated/dist/employeePermissions/employeePermissions.acl.ts @@ -0,0 +1,15 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace EmployeePermissionsAcl { + /** + * Use for `usePaginatePermissions` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query + */ + export const canUsePaginatePermissions = () => ["Read", "Permission"] as AbilityTuple<"Read", "Permission">; + + /** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = () => ["Read", "Permission"] as AbilityTuple<"Read", "Permission">; +} diff --git a/test/generated/dist/employeePermissions/employeePermissions.api.ts b/test/generated/dist/employeePermissions/employeePermissions.api.ts new file mode 100644 index 0000000..1309156 --- /dev/null +++ b/test/generated/dist/employeePermissions/employeePermissions.api.ts @@ -0,0 +1,61 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; + +export namespace EmployeePermissionsApi { + export const paginatePermissions = ( + limit: number, + order?: string, + filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, + `/employees/permissions`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findAll = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, + `/employees/permissions/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + }, + ); + }; +} diff --git a/test/generated/dist/employeePermissions/employeePermissions.configs.ts b/test/generated/dist/employeePermissions/employeePermissions.configs.ts new file mode 100644 index 0000000..7b89c81 --- /dev/null +++ b/test/generated/dist/employeePermissions/employeePermissions.configs.ts @@ -0,0 +1,44 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; +import { EmployeePermissionsQueries } from "./employeePermissions.queries"; +import { EmployeePermissionsAcl } from "./employeePermissions.acl"; + +export namespace EmployeePermissionsConfigs { + export const permissionsConfig = { + meta: { + title: "Permissions", + }, + readAll: { + acl: EmployeePermissionsAcl.canUsePaginatePermissions, + schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, + paginated: EmployeePermissionsQueries.usePaginatePermissions, + infinite: EmployeePermissionsQueries.usePaginatePermissionsInfinite, + filters: { + schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, + options: { + inputs: { + context: true, + ids: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, + options: { + columns: { + id: true, + label: true, + group: true, + description: true, + context: true, + }, + sortable: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/employeePermissions/employeePermissions.models.ts b/test/generated/dist/employeePermissions/employeePermissions.models.ts new file mode 100644 index 0000000..08a273a --- /dev/null +++ b/test/generated/dist/employeePermissions/employeePermissions.models.ts @@ -0,0 +1,74 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeePermissionsModels { + /** + * EmployeePermissionResponseSchema + * @type { object } + * @property { string } id Employee Permission unique identifier + * @property { string } label + * @property { string } group + * @property { string } description + * @property { string } context Scope where this rule is applied + */ + export const EmployeePermissionResponseSchema = z + .object({ + id: z.string().describe("Employee Permission unique identifier"), + label: z.string(), + group: z.string(), + description: z.string().nullish(), + context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), + }) + .readonly(); + export type EmployeePermissionResponse = z.infer; + + /** + * EmployeePermissionFilterDtoSchema + * @type { object } + * @property { string } context Role context + * @property { string[] } ids Ids + */ + export const EmployeePermissionFilterDtoSchema = z + .object({ + context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), + ids: z.array(z.string()).readonly().describe("Ids"), + }) + .readonly(); + export type EmployeePermissionFilterDto = z.infer; + + /** + * EmployeePermissionsPaginatePermissionsOrderParamEnumSchema + * @type { enum } + */ + export const EmployeePermissionsPaginatePermissionsOrderParamEnumSchema = z.enum(["id"]); + export type EmployeePermissionsPaginatePermissionsOrderParamEnum = z.infer< + typeof EmployeePermissionsPaginatePermissionsOrderParamEnumSchema + >; + export const EmployeePermissionsPaginatePermissionsOrderParamEnum = + EmployeePermissionsPaginatePermissionsOrderParamEnumSchema.enum; + + /** + * EmployeePermissionsPaginatePermissionsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeePermissionResponse[] } items + */ + export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeePermissionResponseSchema).readonly() }).readonly().shape, + }); + export type EmployeePermissionsPaginatePermissionsResponse = z.infer< + typeof EmployeePermissionsPaginatePermissionsResponseSchema + >; + + /** + * EmployeePermissionsFindAllResponseSchema + * @type { array } + */ + export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type EmployeePermissionsFindAllResponse = z.infer; +} diff --git a/test/generated/dist/employeePermissions/employeePermissions.queries.ts b/test/generated/dist/employeePermissions/employeePermissions.queries.ts new file mode 100644 index 0000000..cd0f4ae --- /dev/null +++ b/test/generated/dist/employeePermissions/employeePermissions.queries.ts @@ -0,0 +1,141 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeePermissionsAcl } from "./employeePermissions.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; +import { EmployeePermissionsApi } from "./employeePermissions.api"; + +export namespace EmployeePermissionsQueries { + export const moduleName = QueryModule.EmployeePermissions; + + export const keys = { + all: [moduleName] as const, + paginatePermissions: ( + limit?: number, + order?: string, + filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/employees/permissions", limit, order, filter, page, cursor] as const, + paginatePermissionsInfinite: ( + limit?: number, + order?: string, + filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, + cursor?: string, + ) => [...keys.all, "/employees/permissions", "infinite", limit, order, filter, cursor] as const, + findAll: (search?: string) => [...keys.all, "/employees/permissions/labels", search] as const, + }; + + /** + * Query `usePaginatePermissions` + * @permission Requires `canUsePaginatePermissions` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` + * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginatePermissions = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: EmployeePermissionsModels.EmployeePermissionFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginatePermissionsInfinite + * @permission Requires `canUsePaginatePermissions` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` + * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginatePermissionsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { + limit: number; + order?: string; + filter?: EmployeePermissionsModels.EmployeePermissionFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindAll` + * @summary List all permissions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { search }: { search?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search), + queryFn: () => { + checkAcl(EmployeePermissionsAcl.canUseFindAll()); + return EmployeePermissionsApi.findAll(search, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/employeeProfile/employeeProfile.api.ts b/test/generated/dist/employeeProfile/employeeProfile.api.ts new file mode 100644 index 0000000..387f220 --- /dev/null +++ b/test/generated/dist/employeeProfile/employeeProfile.api.ts @@ -0,0 +1,25 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeProfileModels } from "./employeeProfile.models"; + +export namespace EmployeeProfileApi { + export const getProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, + `/employee-profile`, + config, + ); + }; + export const updateProfile = ( + data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, + `/employee-profile`, + ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/employeeProfile/employeeProfile.models.ts b/test/generated/dist/employeeProfile/employeeProfile.models.ts new file mode 100644 index 0000000..019ef91 --- /dev/null +++ b/test/generated/dist/employeeProfile/employeeProfile.models.ts @@ -0,0 +1,52 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeProfileModels { + /** + * EmployeeProfileResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } firstName Employee first name + * @property { string } lastName Employee last name + * @property { string } email Employee email + * @property { string } phone Employee phone number + * @property { string } defaultUrl Employee default URL + * @property { CommonModels.LocaleEnum } locale Employee locale + */ + export const EmployeeProfileResponseDTOSchema = z + .object({ + id: z.string(), + firstName: z.string().describe("Employee first name"), + lastName: z.string().describe("Employee last name"), + email: z.string().describe("Employee email"), + phone: z.string().describe("Employee phone number").nullish(), + defaultUrl: z.string().describe("Employee default URL").nullish(), + locale: CommonModels.LocaleEnumSchema.describe("Employee locale").nullish(), + }) + .readonly(); + export type EmployeeProfileResponseDTO = z.infer; + + /** + * UpdateEmployeeProfileRequestDTOSchema + * @type { object } + * @property { string } firstName Employee first name. Example: `John` + * @property { string } lastName Employee last name. Example: `Doe` + * @property { string } email Employee email address. Example: `john.doe@example.com` + * @property { string } phone Employee phone number. Example: `+1234567890` + * @property { string } defaultUrl Default URL for the employee profile. Example: `https://example.com` + * @property { string } costCenter Employee cost center + * @property { CommonModels.LocaleEnum } locale Employee locale preference. Example: `en-US` + */ + export const UpdateEmployeeProfileRequestDTOSchema = z + .object({ + firstName: z.string().describe("Employee first name"), + lastName: z.string().describe("Employee last name"), + email: z.email().describe("Employee email address"), + phone: z.string().describe("Employee phone number"), + defaultUrl: z.url().describe("Default URL for the employee profile"), + costCenter: z.string().describe("Employee cost center"), + locale: CommonModels.LocaleEnumSchema.describe("Employee locale preference"), + }) + .readonly(); + export type UpdateEmployeeProfileRequestDTO = z.infer; +} diff --git a/test/generated/dist/employeeProfile/employeeProfile.queries.ts b/test/generated/dist/employeeProfile/employeeProfile.queries.ts new file mode 100644 index 0000000..9d9e747 --- /dev/null +++ b/test/generated/dist/employeeProfile/employeeProfile.queries.ts @@ -0,0 +1,63 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeProfileModels } from "./employeeProfile.models"; +import { EmployeeProfileApi } from "./employeeProfile.api"; + +export namespace EmployeeProfileQueries { + export const moduleName = QueryModule.EmployeeProfile; + + export const keys = { + all: [moduleName] as const, + getProfile: () => [...keys.all, "/employee-profile"] as const, + }; + + /** + * Query `useGetProfile` + * @summary Get employee profile + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetProfile = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getProfile(), + queryFn: () => EmployeeProfileApi.getProfile(config), + ...options, + }); + }; + + /** + * Mutation `useUpdateProfile` + * @summary Update employee profile + * @param { EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateProfile = ( + options?: AppMutationOptions< + typeof EmployeeProfileApi.updateProfile, + { data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => EmployeeProfileApi.updateProfile(data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.getProfile()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/employeeRoles/employeeRoles.acl.ts b/test/generated/dist/employeeRoles/employeeRoles.acl.ts new file mode 100644 index 0000000..79b4ce6 --- /dev/null +++ b/test/generated/dist/employeeRoles/employeeRoles.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmployeeRolesAcl { + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List all possible roles + * @param { string } object.context context from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { context?: string }) => + ["Read", object ? subject("Role", object) : "Role"] as AbilityTuple< + "Read", + "Role" | (ForcedSubject<"Role"> & { context?: string }) + >; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Role"] as AbilityTuple<"Create", "Role">; + + /** + * Use for `useLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLabels` query + */ + export const canUseLabels = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; + + /** + * Use for `useFind` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query + */ + export const canUseFind = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Role"] as AbilityTuple<"Update", "Role">; + + /** + * Use for `useDeleteEmployeesRolesByRoleId` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteEmployeesRolesByRoleId` mutation + */ + export const canUseDeleteEmployeesRolesByRoleId = () => ["Delete", "Role"] as AbilityTuple<"Delete", "Role">; + + /** + * Use for `usePaginatePermissions` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query + */ + export const canUsePaginatePermissions = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; + + /** + * Use for `useTogglePermission` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTogglePermission` mutation + */ + export const canUseTogglePermission = () => ["Update", "Role"] as AbilityTuple<"Update", "Role">; + + /** + * Use for `useCopy` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopy` mutation + */ + export const canUseCopy = () => ["Create", "Role"] as AbilityTuple<"Create", "Role">; +} diff --git a/test/generated/dist/employeeRoles/employeeRoles.api.ts b/test/generated/dist/employeeRoles/employeeRoles.api.ts new file mode 100644 index 0000000..ba16037 --- /dev/null +++ b/test/generated/dist/employeeRoles/employeeRoles.api.ts @@ -0,0 +1,119 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeRolesApi { + export const list = ( + limit: number, + order?: string, + filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, `/employees/roles`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), + config, + ); + }; + export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: EmployeeRolesModels.LabelsResponseSchema }, `/employees/roles/labels`, { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { + type: "query", + name: "context", + }), + }, + }); + }; + export const find = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}`, + config, + ); + }; + export const update = ( + roleId: string, + data: EmployeeRolesModels.EmployeeRoleUpdateRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), + config, + ); + }; + export const deleteEmployeesRolesByRoleId = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/employees/roles/${roleId}`, + undefined, + config, + ); + }; + export const paginatePermissions = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, + `/employees/roles/${roleId}/permissions`, + config, + ); + }; + export const togglePermission = ( + roleId: string, + permission: string, + data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/employees/roles/${roleId}/permissions/${permission}/toggle`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), + config, + ); + }; + export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}/copy`, + ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/employeeRoles/employeeRoles.configs.ts b/test/generated/dist/employeeRoles/employeeRoles.configs.ts new file mode 100644 index 0000000..56a73dd --- /dev/null +++ b/test/generated/dist/employeeRoles/employeeRoles.configs.ts @@ -0,0 +1,89 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeRolesQueries } from "./employeeRoles.queries"; +import { EmployeeRolesAcl } from "./employeeRoles.acl"; + +export namespace EmployeeRolesConfigs { + export const rolesConfig = { + meta: { + title: "Roles", + }, + readAll: { + acl: EmployeeRolesAcl.canUseList, + schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, + paginated: EmployeeRolesQueries.useList, + infinite: EmployeeRolesQueries.useListInfinite, + filters: { + schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, + options: { + inputs: { + name: true, + context: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, + options: { + columns: { + id: true, + name: true, + color: true, + description: true, + context: true, + permissions: true, + numberOfUsers: true, + }, + sortable: EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: EmployeeRolesAcl.canUseFind, + schema: CommonModels.EmployeeRoleResponseSchema, + query: EmployeeRolesQueries.useFind, + }, + create: { + acl: EmployeeRolesAcl.canUseCreate, + schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, + mutation: EmployeeRolesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, + options: { + inputs: { + name: true, + color: true, + description: true, + context: true, + permissions: true, + }, + }, + }), + }, + update: { + acl: EmployeeRolesAcl.canUseUpdate, + schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, + mutation: EmployeeRolesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, + options: { + inputs: { + name: true, + color: true, + description: true, + }, + }, + }), + }, + delete: { + acl: EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId, + mutation: EmployeeRolesQueries.useDeleteEmployeesRolesByRoleId, + }, + }; +} diff --git a/test/generated/dist/employeeRoles/employeeRoles.models.ts b/test/generated/dist/employeeRoles/employeeRoles.models.ts new file mode 100644 index 0000000..ee2459c --- /dev/null +++ b/test/generated/dist/employeeRoles/employeeRoles.models.ts @@ -0,0 +1,175 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeRolesModels { + /** + * EmployeeRoleListItemResponseSchema + * @type { object } + * @property { string } id Unique identifier of the role + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string } context Role context + * @property { string[] } permissions Permissions associated with the role + * @property { number } numberOfUsers Number of users associated with the role + */ + export const EmployeeRoleListItemResponseSchema = z + .object({ + id: z.string().describe("Unique identifier of the role"), + name: z.string().describe("Name of the role"), + color: z.string().describe("Color associated with the role").nullish(), + description: z.string().describe("Description of the role").nullish(), + context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), + permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), + numberOfUsers: z.number().describe("Number of users associated with the role"), + }) + .readonly(); + export type EmployeeRoleListItemResponse = z.infer; + + /** + * EmployeeRolePaginationFilterDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } context Role context + * @property { string } search + */ + export const EmployeeRolePaginationFilterDtoSchema = z + .object({ + name: z.string().describe("Name"), + context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), + search: z.string(), + }) + .readonly(); + export type EmployeeRolePaginationFilterDto = z.infer; + + /** + * EmployeeRoleCreateRequestSchema + * @type { object } + * @property { string } name Name of the role + * @property { string } color Color of the role + * @property { string } description Color of the role + * @property { string } context Role context + * - office or global + * @property { string[] } permissions Permission IDs associated with the role + * can only be either office or global. Default: `` + */ + export const EmployeeRoleCreateRequestSchema = z + .object({ + name: z.string().describe("Name of the role"), + color: z.string().describe("Color of the role"), + description: z.string().describe("Color of the role").nullish(), + context: CommonModels.EmployeeRoleContextSchema.describe(`Role context + - office or global`), + permissions: z + .array(z.string()) + .readonly() + .describe(`Permission IDs associated with the role + can only be either office or global`) + .default([]), + }) + .readonly(); + export type EmployeeRoleCreateRequest = z.infer; + + /** + * EmployeeRolePermissionDtoSchema + * @type { object } + * @property { string } id Employee Permission unique identifier + * @property { string } label + * @property { string } group + * @property { string } description + * @property { string } context Scope where this rule is applied + * @property { boolean } enabled + */ + export const EmployeeRolePermissionDtoSchema = z + .object({ + id: z.string().describe("Employee Permission unique identifier"), + label: z.string(), + group: z.string(), + description: z.string().nullish(), + context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), + enabled: z.boolean(), + }) + .readonly(); + export type EmployeeRolePermissionDto = z.infer; + + /** + * EmployeeRoleUpdateRequestSchema + * @type { object } + * @property { string } name Role Id + * @property { string } color Role Color + * @property { string } description Role Description + */ + export const EmployeeRoleUpdateRequestSchema = z + .object({ + name: z.string().describe("Role Id"), + color: z.string().describe("Role Color"), + description: z.string().describe("Role Description"), + }) + .readonly(); + export type EmployeeRoleUpdateRequest = z.infer; + + /** + * EmployeeRoleTogglePermissionRequestSchema + * @type { object } + * @property { boolean } toggled Turn the permission on or off + */ + export const EmployeeRoleTogglePermissionRequestSchema = z + .object({ toggled: z.boolean().describe("Turn the permission on or off") }) + .readonly(); + export type EmployeeRoleTogglePermissionRequest = z.infer; + + /** + * CopyEmployeeRoleDtoSchema + * @type { object } + * @property { string } newRoleName + */ + export const CopyEmployeeRoleDtoSchema = z.object({ newRoleName: z.string() }).readonly(); + export type CopyEmployeeRoleDto = z.infer; + + /** + * EmployeeRolesListOrderParamEnumSchema + * @type { enum } + */ + export const EmployeeRolesListOrderParamEnumSchema = z.enum(["name", "numberOfUsers"]); + export type EmployeeRolesListOrderParamEnum = z.infer; + export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSchema.enum; + + /** + * EmployeeRolesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleListItemResponse[] } items + */ + export const EmployeeRolesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).readonly() }).readonly().shape, + }); + export type EmployeeRolesListResponse = z.infer; + + /** + * LabelsResponseSchema + * @type { array } + */ + export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type LabelsResponse = z.infer; + + /** + * EmployeeRolesPaginatePermissionsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRolePermissionDto[] } items + */ + export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).readonly() }).readonly().shape, + }); + export type EmployeeRolesPaginatePermissionsResponse = z.infer; +} diff --git a/test/generated/dist/employeeRoles/employeeRoles.queries.ts b/test/generated/dist/employeeRoles/employeeRoles.queries.ts new file mode 100644 index 0000000..68a5d1e --- /dev/null +++ b/test/generated/dist/employeeRoles/employeeRoles.queries.ts @@ -0,0 +1,368 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeeRolesAcl } from "./employeeRoles.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeRolesApi } from "./employeeRoles.api"; + +export namespace EmployeeRolesQueries { + export const moduleName = QueryModule.EmployeeRoles; + + export const keys = { + all: [moduleName] as const, + list: ( + limit?: number, + order?: string, + filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/employees/roles", limit, order, filter, page, cursor] as const, + listInfinite: ( + limit?: number, + order?: string, + filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/employees/roles", "infinite", limit, order, filter, cursor] as const, + labels: (search?: string, context?: CommonModels.EmployeeRoleContext) => + [...keys.all, "/employees/roles/labels", search, context] as const, + find: (roleId: string) => [...keys.all, "/employees/roles/:roleId", roleId] as const, + paginatePermissions: (roleId: string) => [...keys.all, "/employees/roles/:roleId/permissions", roleId] as const, + }; + + /** + * Query `useList` + * @summary Paginate Employee Role Definitions + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` + * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseList()); + return EmployeeRolesApi.list(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary Paginate Employee Role Definitions + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` + * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeRolesAcl.canUseList()); + return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create Employee Role Definition + * @permission Requires `canUseCreate` ability + * @param { EmployeeRolesModels.EmployeeRoleCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof EmployeeRolesApi.create, + { data: EmployeeRolesModels.EmployeeRoleCreateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmployeeRolesAcl.canUseCreate()); + return EmployeeRolesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useLabels` + * @summary List all employee roles with only their labels + * @permission Requires `canUseLabels` ability + * @param { string } object.search Query parameter + * @param { CommonModels.EmployeeRoleContext } object.context Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useLabels = ( + { search, context }: { search?: string; context?: CommonModels.EmployeeRoleContext }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.labels(search, context), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseLabels()); + return EmployeeRolesApi.labels(search, context, config); + }, + ...options, + }); + }; + + /** + * Query `useFind` + * @summary Get Employee Role Definition + * @permission Requires `canUseFind` ability + * @param { string } object.roleId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFind = ( + { roleId }: { roleId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.find(roleId), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseFind()); + return EmployeeRolesApi.find(roleId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Employee Role Definition + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.roleId Path parameter + * @param { EmployeeRolesModels.EmployeeRoleUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof EmployeeRolesApi.update, + { roleId: string; data: EmployeeRolesModels.EmployeeRoleUpdateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, data }) => { + checkAcl(EmployeeRolesAcl.canUseUpdate()); + return EmployeeRolesApi.update(roleId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { roleId } = variables; + const updateKeys = [keys.find(roleId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteEmployeesRolesByRoleId` + * @summary Delete Employee Role Definition + * @permission Requires `canUseDeleteEmployeesRolesByRoleId` ability + * @param { string } mutation.roleId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteEmployeesRolesByRoleId = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId }) => { + checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); + return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginatePermissions` + * @summary Get All Employee Role Definition Permissions + * - convenience endpoint to expand the permissions of a role + * - only returns the enabled permissions + * @permission Requires `canUsePaginatePermissions` ability + * @param { string } object.roleId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginatePermissions = ( + { roleId }: { roleId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginatePermissions(roleId), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); + return EmployeeRolesApi.paginatePermissions(roleId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useTogglePermission` + * @summary Toggle Employee Role Definition Permission + * @permission Requires `canUseTogglePermission` ability + * @param { string } mutation.roleId Path parameter + * @param { string } mutation.permission Path parameter + * @param { EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useTogglePermission = ( + options?: AppMutationOptions< + typeof EmployeeRolesApi.togglePermission, + { roleId: string; permission: string; data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, permission, data }) => { + checkAcl(EmployeeRolesAcl.canUseTogglePermission()); + return EmployeeRolesApi.togglePermission(roleId, permission, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCopy` + * @summary Copy Employee Role Definition + * @permission Requires `canUseCopy` ability + * @param { string } mutation.roleId Path parameter + * @param { EmployeeRolesModels.CopyEmployeeRoleDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCopy = ( + options?: AppMutationOptions< + typeof EmployeeRolesApi.copy, + { roleId: string; data: EmployeeRolesModels.CopyEmployeeRoleDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, data }) => { + checkAcl(EmployeeRolesAcl.canUseCopy()); + return EmployeeRolesApi.copy(roleId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { roleId } = variables; + const updateKeys = [keys.find(roleId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/employeeSettings/employeeSettings.api.ts b/test/generated/dist/employeeSettings/employeeSettings.api.ts new file mode 100644 index 0000000..ee7fac4 --- /dev/null +++ b/test/generated/dist/employeeSettings/employeeSettings.api.ts @@ -0,0 +1,27 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeSettingsModels } from "./employeeSettings.models"; + +export namespace EmployeeSettingsApi { + export const getAll = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, + `/employees/settings`, + config, + ); + }; + export const update = ( + key: string, + data: EmployeeSettingsModels.UpdateEmployeeSettingDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/employees/settings/${key}`, + ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/employeeSettings/employeeSettings.models.ts b/test/generated/dist/employeeSettings/employeeSettings.models.ts new file mode 100644 index 0000000..7614af9 --- /dev/null +++ b/test/generated/dist/employeeSettings/employeeSettings.models.ts @@ -0,0 +1,44 @@ +import { z } from "zod"; + +export namespace EmployeeSettingsModels { + /** + * EmployeeSettingsResponseDtoSchema + * @type { object } + * @property { object } settings Map of all settings for the employee + */ + export const EmployeeSettingsResponseDtoSchema = z + .object({ + settings: z + .union([ + z.object({}).catchall(z.any()).readonly(), + z.array(z.object({}).catchall(z.any()).readonly()).readonly(), + z.string(), + z.array(z.string()).readonly(), + z.array(z.number()).readonly(), + ]) + .describe("Map of all settings for the employee"), + }) + .readonly(); + export type EmployeeSettingsResponseDto = z.infer; + + /** + * UpdateEmployeeSettingDtoSchema + * @type { object } + * @property { object } value The value to store for the setting. If null, the setting will be deleted. + */ + export const UpdateEmployeeSettingDtoSchema = z + .object({ + value: z + .union([ + z.object({}).catchall(z.any()).readonly(), + z.array(z.unknown()).readonly(), + z.string(), + z.number(), + z.boolean(), + ]) + .describe("The value to store for the setting. If null, the setting will be deleted.") + .nullable(), + }) + .readonly(); + export type UpdateEmployeeSettingDto = z.infer; +} diff --git a/test/generated/dist/employeeSettings/employeeSettings.queries.ts b/test/generated/dist/employeeSettings/employeeSettings.queries.ts new file mode 100644 index 0000000..7aff1c3 --- /dev/null +++ b/test/generated/dist/employeeSettings/employeeSettings.queries.ts @@ -0,0 +1,63 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeSettingsModels } from "./employeeSettings.models"; +import { EmployeeSettingsApi } from "./employeeSettings.api"; + +export namespace EmployeeSettingsQueries { + export const moduleName = QueryModule.EmployeeSettings; + + export const keys = { + all: [moduleName] as const, + getAll: () => [...keys.all, "/employees/settings"] as const, + }; + + /** + * Query `useGetAll` + * @summary Get all employee settings + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetAll = ( + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getAll(), + queryFn: () => EmployeeSettingsApi.getAll(config), + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update employee setting + * @param { string } mutation.key Path parameter + * @param { EmployeeSettingsModels.UpdateEmployeeSettingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof EmployeeSettingsApi.update, + { key: string; data: EmployeeSettingsModels.UpdateEmployeeSettingDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ key, data }) => EmployeeSettingsApi.update(key, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/employment/employment.acl.ts b/test/generated/dist/employment/employment.acl.ts new file mode 100644 index 0000000..f842629 --- /dev/null +++ b/test/generated/dist/employment/employment.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmploymentAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create new employment + * @param { string } object.officeId officeId from mutation data + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "Create", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; + + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List employments + * @param { string } object.officeId officeId from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId?: string }) => + ["Read", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "Read", + "Employment" | (ForcedSubject<"Employment"> & { officeId?: string }) + >; + + /** + * Use for `useListRoles` query ability. For global ability, omit the object parameter. + * @description List employment roles + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query + */ + export const canUseListRoles = (object?: { officeId: string }) => + ["ListRoles", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "ListRoles", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; + + /** + * Use for `useUpdateRoles` mutation ability. For global ability, omit the object parameter. + * @description Update employment roles + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation + */ + export const canUseUpdateRoles = (object?: { officeId: string }) => + ["UpdateRoles", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "UpdateRoles", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Create", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "Create", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "Archive", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Unarchive", object ? subject("Employment", object) : "Employment"] as AbilityTuple< + "Unarchive", + "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/employment/employment.api.ts b/test/generated/dist/employment/employment.api.ts new file mode 100644 index 0000000..5fa32e0 --- /dev/null +++ b/test/generated/dist/employment/employment.api.ts @@ -0,0 +1,106 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; +import { EmploymentModels } from "./employment.models"; + +export namespace EmploymentApi { + export const create = (data: EmploymentModels.EmploymentCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/employees/employments`, + ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), + config, + ); + }; + export const list = ( + limit: number, + order?: string, + populate?: EmploymentModels.EmploymentListPopulateParam, + filter?: EmploymentModels.EmploymentFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: EmploymentModels.EmploymentListResponseSchema }, `/employees/employments`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { + type: "query", + name: "populate", + }), + filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const listRoles = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/roles`, + config, + ); + }; + export const updateRoles = ( + officeId: string, + employmentId: string, + data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/roles`, + ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), + config, + ); + }; + export const update = ( + officeId: string, + employmentId: string, + data: EmploymentModels.UpdateEmploymentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}`, + ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), + config, + ); + }; + export const archive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/archive`, + undefined, + config, + ); + }; + export const unarchive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/employment/employment.configs.ts b/test/generated/dist/employment/employment.configs.ts new file mode 100644 index 0000000..b1b2136 --- /dev/null +++ b/test/generated/dist/employment/employment.configs.ts @@ -0,0 +1,62 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { EmploymentModels } from "./employment.models"; +import { EmploymentQueries } from "./employment.queries"; +import { EmploymentAcl } from "./employment.acl"; + +export namespace EmploymentConfigs { + export const employmentsConfig = { + meta: { + title: "Employments", + }, + readAll: { + acl: EmploymentAcl.canUseList, + schema: CommonModels.EmploymentResponseSchema, + paginated: EmploymentQueries.useList, + infinite: EmploymentQueries.useListInfinite, + filters: { + schema: EmploymentModels.EmploymentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmploymentModels.EmploymentFilterDtoSchema, + options: { + inputs: { + officeId: true, + employeeId: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.EmploymentResponseSchema, + options: { + columns: { + id: true, + officeId: true, + office: true, + employeeId: true, + employee: true, + archived: true, + costCenter: true, + roles: true, + }, + sortable: EmploymentModels.EmploymentListOrderParamEnumSchema, + }, + }), + }, + create: { + acl: EmploymentAcl.canUseCreate, + schema: EmploymentModels.EmploymentCreateRequestSchema, + mutation: EmploymentQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmploymentModels.EmploymentCreateRequestSchema, + options: { + inputs: { + officeId: true, + employeeId: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/dist/employment/employment.models.ts b/test/generated/dist/employment/employment.models.ts new file mode 100644 index 0000000..ceba63b --- /dev/null +++ b/test/generated/dist/employment/employment.models.ts @@ -0,0 +1,139 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmploymentModels { + /** + * EmploymentCreateRequestSchema + * @type { object } + * @property { string } officeId + * @property { string } employeeId + */ + export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }).readonly(); + export type EmploymentCreateRequest = z.infer; + + /** + * EmploymentFilterDtoSchema + * @type { object } + * @property { string } officeId Office IDs + * @property { string } employeeId Employee IDs + */ + export const EmploymentFilterDtoSchema = z + .object({ officeId: z.string().describe("Office IDs"), employeeId: z.string().describe("Employee IDs") }) + .readonly(); + export type EmploymentFilterDto = z.infer; + + /** + * EmploymentRoleMemberResponseSchema + * @type { object } + * @property { string } roleId + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string[] } permissions Permissions associated with the role + */ + export const EmploymentRoleMemberResponseSchema = z + .object({ + roleId: z.string(), + name: z.string().describe("Name of the role"), + color: z.string().describe("Color associated with the role").nullish(), + description: z.string().describe("Description of the role").nullish(), + permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), + }) + .readonly(); + export type EmploymentRoleMemberResponse = z.infer; + + /** + * EmploymentRoleMembershipsUpdateRequestSchema + * @type { object } + * @property { string[] } roleIds Array of role IDs + */ + export const EmploymentRoleMembershipsUpdateRequestSchema = z + .object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }) + .readonly(); + export type EmploymentRoleMembershipsUpdateRequest = z.infer; + + /** + * UpdateEmploymentRequestDtoSchema + * @type { object } + * @property { string } costCenter + * @property { string[] } roleIds + */ + export const UpdateEmploymentRequestDtoSchema = z + .object({ costCenter: z.string(), roleIds: z.array(z.string()).readonly() }) + .readonly(); + export type UpdateEmploymentRequestDto = z.infer; + + /** + * EmploymentListOrderParamEnumSchema + * @type { enum } + */ + export const EmploymentListOrderParamEnumSchema = z.enum(["officeId", "createdAt"]); + export type EmploymentListOrderParamEnum = z.infer; + export const EmploymentListOrderParamEnum = EmploymentListOrderParamEnumSchema.enum; + + /** + * EmploymentPaginationPopulateFieldsSchema + * @type { enum } + */ + export const EmploymentPaginationPopulateFieldsSchema = z.enum(["office", "employee"]); + export type EmploymentPaginationPopulateFields = z.infer; + export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFieldsSchema.enum; + + /** + * EmploymentListPopulateParamSchema + * @type { array } + */ + export const EmploymentListPopulateParamSchema = z + .array(EmploymentPaginationPopulateFieldsSchema) + .readonly() + .nullish(); + export type EmploymentListPopulateParam = z.infer; + + /** + * EmploymentListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.EmploymentResponse[] } items + */ + export const EmploymentListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.EmploymentResponseSchema).readonly() }).readonly().shape, + }); + export type EmploymentListResponse = z.infer; + + /** + * EmploymentListRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmploymentRoleMemberResponse[] } items + */ + export const EmploymentListRolesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape, + }); + export type EmploymentListRolesResponse = z.infer; + + /** + * EmploymentUpdateRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmploymentRoleMemberResponse[] } items + */ + export const EmploymentUpdateRolesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape, + }); + export type EmploymentUpdateRolesResponse = z.infer; +} diff --git a/test/generated/dist/employment/employment.queries.ts b/test/generated/dist/employment/employment.queries.ts new file mode 100644 index 0000000..c0e6627 --- /dev/null +++ b/test/generated/dist/employment/employment.queries.ts @@ -0,0 +1,315 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmploymentAcl } from "./employment.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmploymentModels } from "./employment.models"; +import { EmploymentApi } from "./employment.api"; + +export namespace EmploymentQueries { + export const moduleName = QueryModule.Employment; + + export const keys = { + all: [moduleName] as const, + list: ( + limit?: number, + order?: string, + populate?: EmploymentModels.EmploymentListPopulateParam, + filter?: EmploymentModels.EmploymentFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/employees/employments", limit, order, populate, filter, page, cursor] as const, + listInfinite: ( + limit?: number, + order?: string, + populate?: EmploymentModels.EmploymentListPopulateParam, + filter?: EmploymentModels.EmploymentFilterDto, + cursor?: string, + ) => [...keys.all, "/employees/employments", "infinite", limit, order, populate, filter, cursor] as const, + listRoles: (officeId: string, employmentId: string) => + [...keys.all, "/offices/:officeId/employments/:employmentId/roles", officeId, employmentId] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create new employment + * @permission Requires `canUseCreate` ability + * @param { EmploymentModels.EmploymentCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmploymentAcl.canUseCreate()); + return EmploymentApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useList` + * @summary List Employments + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` + * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter + * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + limit, + order, + populate, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + populate?: EmploymentModels.EmploymentListPopulateParam; + filter?: EmploymentModels.EmploymentFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, populate, filter, page, cursor), + queryFn: () => { + checkAcl(EmploymentAcl.canUseList()); + return EmploymentApi.list(limit, order, populate, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List Employments + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` + * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter + * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + limit, + order, + populate, + filter, + cursor, + }: { + limit: number; + order?: string; + populate?: EmploymentModels.EmploymentListPopulateParam; + filter?: EmploymentModels.EmploymentFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, populate, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmploymentAcl.canUseList()); + return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useListRoles` + * @summary List Employments Roles + * @permission Requires `canUseListRoles` ability + * @param { string } object.officeId Path parameter + * @param { string } object.employmentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListRoles = ( + { officeId, employmentId }: { officeId: string; employmentId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoles(officeId, employmentId), + queryFn: () => { + checkAcl(EmploymentAcl.canUseListRoles({ officeId })); + return EmploymentApi.listRoles(officeId, employmentId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateRoles` + * @summary Update Employment Roles + * @permission Requires `canUseUpdateRoles` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { EmploymentModels.EmploymentRoleMembershipsUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateRoles = ( + options?: AppMutationOptions< + typeof EmploymentApi.updateRoles, + { officeId: string; employmentId: string; data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId, data }) => { + checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId })); + return EmploymentApi.updateRoles(officeId, employmentId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdate` + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { EmploymentModels.UpdateEmploymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof EmploymentApi.update, + { officeId: string; employmentId: string; data: EmploymentModels.UpdateEmploymentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId, data }) => { + checkAcl(EmploymentAcl.canUseUpdate({ officeId })); + return EmploymentApi.update(officeId, employmentId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive Employment + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId }) => { + checkAcl(EmploymentAcl.canUseArchive({ officeId })); + return EmploymentApi.archive(officeId, employmentId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Un-archive Employment + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId }) => { + checkAcl(EmploymentAcl.canUseUnarchive({ officeId })); + return EmploymentApi.unarchive(officeId, employmentId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/factoringExport/factoringExport.acl.ts b/test/generated/dist/factoringExport/factoringExport.acl.ts new file mode 100644 index 0000000..b4cf272 --- /dev/null +++ b/test/generated/dist/factoringExport/factoringExport.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace FactoringExportAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create factoring export + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< + "Create", + "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) + >; + + /** + * Use for `useGetBatch` query ability. For global ability, omit the object parameter. + * @description Read factoring export + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query + */ + export const canUseGetBatch = (object?: { officeId: string }) => + ["Read", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< + "Read", + "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/factoringExport/factoringExport.api.ts b/test/generated/dist/factoringExport/factoringExport.api.ts new file mode 100644 index 0000000..a03108e --- /dev/null +++ b/test/generated/dist/factoringExport/factoringExport.api.ts @@ -0,0 +1,26 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { FactoringExportModels } from "./factoringExport.models"; + +export namespace FactoringExportApi { + export const create = ( + officeId: string, + data: FactoringExportModels.CreateFactoringExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-exports`, + ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), + config, + ); + }; + export const getBatch = (batchId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-exports/${batchId}`, + config, + ); + }; +} diff --git a/test/generated/dist/factoringExport/factoringExport.models.ts b/test/generated/dist/factoringExport/factoringExport.models.ts new file mode 100644 index 0000000..3b5ef07 --- /dev/null +++ b/test/generated/dist/factoringExport/factoringExport.models.ts @@ -0,0 +1,61 @@ +import { z } from "zod"; + +export namespace FactoringExportModels { + /** + * FactoringExportBatchStatusEnumSchema + * @type { enum } + */ + export const FactoringExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Failed"]); + export type FactoringExportBatchStatusEnum = z.infer; + export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSchema.enum; + + /** + * FactoringExportBatchResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { FactoringExportBatchStatusEnum } status + * @property { number } totalInvoices + * @property { number } totalAmount + * @property { string } currencyNotation + * @property { string } jobId + * @property { string } eurFileUrl + * @property { string } usdFileUrl + * @property { string } createdById + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } exportedAt + */ + export const FactoringExportBatchResponseDtoSchema = z + .object({ + id: z.string(), + officeId: z.string(), + status: FactoringExportBatchStatusEnumSchema, + totalInvoices: z.number(), + totalAmount: z.number(), + currencyNotation: z.string(), + jobId: z.string().nullish(), + eurFileUrl: z.string().nullish(), + usdFileUrl: z.string().nullish(), + createdById: z.string(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + exportedAt: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type FactoringExportBatchResponseDto = z.infer; + + /** + * CreateFactoringExportRequestDtoSchema + * @type { object } + * @property { string } invoiceDateFrom Invoice date from + * @property { string } invoiceDateUntil Invoice date until + */ + export const CreateFactoringExportRequestDtoSchema = z + .object({ + invoiceDateFrom: z.iso.datetime({ offset: true }).describe("Invoice date from"), + invoiceDateUntil: z.iso.datetime({ offset: true }).describe("Invoice date until"), + }) + .readonly(); + export type CreateFactoringExportRequestDto = z.infer; +} diff --git a/test/generated/dist/factoringExport/factoringExport.queries.ts b/test/generated/dist/factoringExport/factoringExport.queries.ts new file mode 100644 index 0000000..c2d5093 --- /dev/null +++ b/test/generated/dist/factoringExport/factoringExport.queries.ts @@ -0,0 +1,80 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { FactoringExportAcl } from "./factoringExport.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FactoringExportModels } from "./factoringExport.models"; +import { FactoringExportApi } from "./factoringExport.api"; + +export namespace FactoringExportQueries { + export const moduleName = QueryModule.FactoringExport; + + export const keys = { + all: [moduleName] as const, + getBatch: (batchId: string, officeId: string) => + [...keys.all, "/offices/:officeId/factoring-exports/:batchId", batchId, officeId] as const, + }; + + /** + * Mutation `useCreate` + * @summary Generate factoring export files for Raiffeisen Factor Bank + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { FactoringExportModels.CreateFactoringExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof FactoringExportApi.create, + { officeId: string; data: FactoringExportModels.CreateFactoringExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(FactoringExportAcl.canUseCreate({ officeId })); + return FactoringExportApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetBatch` + * @summary Get factoring export batch status + * @permission Requires `canUseGetBatch` ability + * @param { string } object.batchId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetBatch = ( + { batchId, officeId }: { batchId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBatch(batchId, officeId), + queryFn: () => { + checkAcl(FactoringExportAcl.canUseGetBatch({ officeId })); + return FactoringExportApi.getBatch(batchId, officeId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/factoringMerge/factoringMerge.acl.ts b/test/generated/dist/factoringMerge/factoringMerge.acl.ts new file mode 100644 index 0000000..7a01e13 --- /dev/null +++ b/test/generated/dist/factoringMerge/factoringMerge.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace FactoringMergeAcl { + /** + * Use for `usePrepareUpload` mutation ability. For global ability, omit the object parameter. + * @description Prepare factoring merge upload + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareUpload` mutation + */ + export const canUsePrepareUpload = (object?: { officeId: string }) => + ["Update", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< + "Update", + "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) + >; + + /** + * Use for `useProcessMerge` mutation ability. For global ability, omit the object parameter. + * @description Process factoring merge + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useProcessMerge` mutation + */ + export const canUseProcessMerge = (object?: { officeId: string }) => + ["Update", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< + "Update", + "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) + >; + + /** + * Use for `useGetMergeBatch` query ability. For global ability, omit the object parameter. + * @description Read merge batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMergeBatch` query + */ + export const canUseGetMergeBatch = (object?: { officeId: string }) => + ["Read", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< + "Read", + "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/factoringMerge/factoringMerge.api.ts b/test/generated/dist/factoringMerge/factoringMerge.api.ts new file mode 100644 index 0000000..8ba3ec5 --- /dev/null +++ b/test/generated/dist/factoringMerge/factoringMerge.api.ts @@ -0,0 +1,34 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { FactoringMergeModels } from "./factoringMerge.models"; + +export namespace FactoringMergeApi { + export const prepareUpload = ( + officeId: string, + data: FactoringMergeModels.PrepareFactoringMergeRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/prepare-upload`, + ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), + config, + ); + }; + export const processMerge = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/${batchId}/process`, + undefined, + config, + ); + }; + export const getMergeBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/${batchId}`, + config, + ); + }; +} diff --git a/test/generated/dist/factoringMerge/factoringMerge.models.ts b/test/generated/dist/factoringMerge/factoringMerge.models.ts new file mode 100644 index 0000000..70763bd --- /dev/null +++ b/test/generated/dist/factoringMerge/factoringMerge.models.ts @@ -0,0 +1,137 @@ +import { z } from "zod"; + +export namespace FactoringMergeModels { + /** + * FileMetadataDtoSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType File MIME type + * @property { number } fileSize File size in bytes. Minimum: `1` + */ + export const FileMetadataDtoSchema = z + .object({ + fileName: z.string().describe("File name"), + mimeType: z.string().describe("File MIME type"), + fileSize: z.number().gte(1).describe("File size in bytes"), + }) + .readonly(); + export type FileMetadataDto = z.infer; + + /** + * PrepareFactoringMergeRequestDtoSchema + * @type { object } + * @property { FileMetadataDto } eurDebtorFile EUR debtor file metadata + * @property { FileMetadataDto } eurOperationsFile EUR operations file metadata + * @property { FileMetadataDto } eurExistingFactoringFile EUR existing factoring file metadata (optional) + * @property { FileMetadataDto } usdDebtorFile USD debtor file metadata + * @property { FileMetadataDto } usdOperationsFile USD operations file metadata + * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) + */ + export const PrepareFactoringMergeRequestDtoSchema = z + .object({ + eurDebtorFile: FileMetadataDtoSchema.describe("EUR debtor file metadata"), + eurOperationsFile: FileMetadataDtoSchema.describe("EUR operations file metadata"), + eurExistingFactoringFile: FileMetadataDtoSchema.describe( + "EUR existing factoring file metadata (optional)", + ).nullish(), + usdDebtorFile: FileMetadataDtoSchema.describe("USD debtor file metadata"), + usdOperationsFile: FileMetadataDtoSchema.describe("USD operations file metadata"), + usdExistingFactoringFile: FileMetadataDtoSchema.describe( + "USD existing factoring file metadata (optional)", + ).nullish(), + }) + .readonly(); + export type PrepareFactoringMergeRequestDto = z.infer; + + /** + * MediaUploadInstructionsDtoSchema + * @type { object } + * @property { string } id + * @property { string } method + * @property { string } url + */ + export const MediaUploadInstructionsDtoSchema = z + .object({ id: z.string(), method: z.string(), url: z.string() }) + .readonly(); + export type MediaUploadInstructionsDto = z.infer; + + /** + * FactoringMergeUploadInstructionsResponseDtoSchema + * @type { object } + * @property { string } batchId + * @property { MediaUploadInstructionsDto } eurDebtorFile + * @property { MediaUploadInstructionsDto } eurOperationsFile + * @property { MediaUploadInstructionsDto } eurExistingFactoringFile + * @property { MediaUploadInstructionsDto } usdDebtorFile + * @property { MediaUploadInstructionsDto } usdOperationsFile + * @property { MediaUploadInstructionsDto } usdExistingFactoringFile + */ + export const FactoringMergeUploadInstructionsResponseDtoSchema = z + .object({ + batchId: z.string(), + eurDebtorFile: MediaUploadInstructionsDtoSchema, + eurOperationsFile: MediaUploadInstructionsDtoSchema, + eurExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), + usdDebtorFile: MediaUploadInstructionsDtoSchema, + usdOperationsFile: MediaUploadInstructionsDtoSchema, + usdExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), + }) + .readonly(); + export type FactoringMergeUploadInstructionsResponseDto = z.infer< + typeof FactoringMergeUploadInstructionsResponseDtoSchema + >; + + /** + * FactoringMergeBatchStatusEnumSchema + * @type { enum } + */ + export const FactoringMergeBatchStatusEnumSchema = z.enum(["Initializing", "Processing", "Completed", "Failed"]); + export type FactoringMergeBatchStatusEnum = z.infer; + export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema.enum; + + /** + * FactoringMergeBatchResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { FactoringMergeBatchStatusEnum } status + * @property { string } eurDebtorFileMediaId + * @property { string } eurOperationsFileMediaId + * @property { string } eurExistingFactoringFileMediaId + * @property { string } usdDebtorFileMediaId + * @property { string } usdOperationsFileMediaId + * @property { string } usdExistingFactoringFileMediaId + * @property { string } eurResultFileMediaId + * @property { string } eurResultFileUrl + * @property { string } usdResultFileMediaId + * @property { string } usdResultFileUrl + * @property { string } jobId + * @property { string } errorMessage + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } completedAt + */ + export const FactoringMergeBatchResponseDtoSchema = z + .object({ + id: z.string(), + officeId: z.string(), + status: FactoringMergeBatchStatusEnumSchema, + eurDebtorFileMediaId: z.string(), + eurOperationsFileMediaId: z.string(), + eurExistingFactoringFileMediaId: z.string().nullish(), + usdDebtorFileMediaId: z.string(), + usdOperationsFileMediaId: z.string(), + usdExistingFactoringFileMediaId: z.string().nullish(), + eurResultFileMediaId: z.string().nullish(), + eurResultFileUrl: z.string().nullish(), + usdResultFileMediaId: z.string().nullish(), + usdResultFileUrl: z.string().nullish(), + jobId: z.string().nullish(), + errorMessage: z.string().nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + completedAt: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type FactoringMergeBatchResponseDto = z.infer; +} diff --git a/test/generated/dist/factoringMerge/factoringMerge.queries.ts b/test/generated/dist/factoringMerge/factoringMerge.queries.ts new file mode 100644 index 0000000..45c7497 --- /dev/null +++ b/test/generated/dist/factoringMerge/factoringMerge.queries.ts @@ -0,0 +1,113 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { FactoringMergeAcl } from "./factoringMerge.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FactoringMergeModels } from "./factoringMerge.models"; +import { FactoringMergeApi } from "./factoringMerge.api"; + +export namespace FactoringMergeQueries { + export const moduleName = QueryModule.FactoringMerge; + + export const keys = { + all: [moduleName] as const, + getMergeBatch: (officeId: string, batchId: string) => + [...keys.all, "/offices/:officeId/factoring-merge/:batchId", officeId, batchId] as const, + }; + + /** + * Mutation `usePrepareUpload` + * @summary Prepare upload instructions for MOVE files merge + * @permission Requires `canUsePrepareUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { FactoringMergeModels.PrepareFactoringMergeRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const usePrepareUpload = ( + options?: AppMutationOptions< + typeof FactoringMergeApi.prepareUpload, + { officeId: string; data: FactoringMergeModels.PrepareFactoringMergeRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId })); + return FactoringMergeApi.prepareUpload(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useProcessMerge` + * @summary Start processing the merge batch + * @permission Requires `canUseProcessMerge` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const useProcessMerge = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId })); + return FactoringMergeApi.processMerge(officeId, batchId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, batchId } = variables; + const updateKeys = [keys.getMergeBatch(officeId, batchId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetMergeBatch` + * @summary Get merge batch status + * @permission Requires `canUseGetMergeBatch` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, default] + */ + export const useGetMergeBatch = ( + { officeId, batchId }: { officeId: string; batchId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getMergeBatch(officeId, batchId), + queryFn: () => { + checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId })); + return FactoringMergeApi.getMergeBatch(officeId, batchId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/files/files.api.ts b/test/generated/dist/files/files.api.ts new file mode 100644 index 0000000..c0ae919 --- /dev/null +++ b/test/generated/dist/files/files.api.ts @@ -0,0 +1,90 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { FilesModels } from "./files.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace FilesApi { + export const createUpload = ( + officeId: string, + folderId: string, + data: FilesModels.CreateFileRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: FilesModels.FileUploadResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}/files`, + ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), + config, + ); + }; + export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/files/eml`, + ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const rename = ( + officeId: string, + fileId: string, + data: FilesModels.RenameFileRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.FileResponseDTOSchema }, + `/offices/${officeId}/files/${fileId}`, + ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), + config, + ); + }; + export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/move`, + ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), + config, + ); + }; + export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/copy`, + ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), + config, + ); + }; + export const archive = ( + officeId: string, + data: FilesModels.SetFilesArchivedRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/archive`, + ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), + config, + ); + }; + export const unarchive = ( + officeId: string, + data: FilesModels.SetFilesArchivedRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/unarchive`, + ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/files/files.models.ts b/test/generated/dist/files/files.models.ts new file mode 100644 index 0000000..2f07427 --- /dev/null +++ b/test/generated/dist/files/files.models.ts @@ -0,0 +1,62 @@ +import { z } from "zod"; + +export namespace FilesModels { + /** + * CreateFileRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } mimeType + * @property { number } fileSize Minimum: `0` + */ + export const CreateFileRequestDTOSchema = z + .object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }) + .readonly(); + export type CreateFileRequestDTO = z.infer; + + /** + * FileUploadResponseDTOSchema + * @type { object } + * @property { string } fileId + * @property { string } method + * @property { string } url + */ + export const FileUploadResponseDTOSchema = z + .object({ fileId: z.string(), method: z.string(), url: z.string() }) + .readonly(); + export type FileUploadResponseDTO = z.infer; + + /** + * GetFilesEmlRequestDTOSchema + * @type { object } + * @property { string[] } ids Min Items: `1` + */ + export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); + export type GetFilesEmlRequestDTO = z.infer; + + /** + * RenameFileRequestDTOSchema + * @type { object } + * @property { string } name + */ + export const RenameFileRequestDTOSchema = z.object({ name: z.string() }).readonly(); + export type RenameFileRequestDTO = z.infer; + + /** + * MoveFilesRequestDTOSchema + * @type { object } + * @property { string[] } fileIds Min Items: `1` + * @property { string } targetFolderId + */ + export const MoveFilesRequestDTOSchema = z + .object({ fileIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }) + .readonly(); + export type MoveFilesRequestDTO = z.infer; + + /** + * SetFilesArchivedRequestDTOSchema + * @type { object } + * @property { string[] } ids Min Items: `1` + */ + export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); + export type SetFilesArchivedRequestDTO = z.infer; +} diff --git a/test/generated/dist/files/files.queries.ts b/test/generated/dist/files/files.queries.ts new file mode 100644 index 0000000..a37c4f3 --- /dev/null +++ b/test/generated/dist/files/files.queries.ts @@ -0,0 +1,245 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FilesModels } from "./files.models"; +import { FilesApi } from "./files.api"; + +export namespace FilesQueries { + export const moduleName = QueryModule.Files; + + /** + * Mutation `useCreateUpload` + * @summary Create file upload instructions + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { FilesModels.CreateFileRequestDTO } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateUpload = ( + options?: AppMutationOptions< + typeof FilesApi.createUpload, + { + officeId: string; + folderId: string; + data: FilesModels.CreateFileRequestDTO; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { + const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGetEml` - recommended when file should not be cached + * @summary Get files as EML file with attachments + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.GetFilesEmlRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGetEml = ( + options?: AppMutationOptions< + typeof FilesApi.getEml, + { officeId: string; data: FilesModels.GetFilesEmlRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FilesApi.getEml(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useRename` + * @summary Rename file + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.fileId Path parameter + * @param { FilesModels.RenameFileRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useRename = ( + options?: AppMutationOptions< + typeof FilesApi.rename, + { officeId: string; fileId: string; data: FilesModels.RenameFileRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, fileId, data }) => FilesApi.rename(officeId, fileId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMove` + * @summary Move files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useMove = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FilesApi.move(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCopy` + * @summary Copy files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useCopy = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FilesApi.copy(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useArchive = ( + options?: AppMutationOptions< + typeof FilesApi.archive, + { officeId: string; data: FilesModels.SetFilesArchivedRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FilesApi.archive(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions< + typeof FilesApi.unarchive, + { officeId: string; data: FilesModels.SetFilesArchivedRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FilesApi.unarchive(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/folders/folders.api.ts b/test/generated/dist/folders/folders.api.ts new file mode 100644 index 0000000..6115ad4 --- /dev/null +++ b/test/generated/dist/folders/folders.api.ts @@ -0,0 +1,87 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { FoldersModels } from "./folders.models"; + +export namespace FoldersApi { + export const getTree = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}/tree`, + config, + ); + }; + export const getContent = ( + officeId: string, + folderId: string, + limit: number, + order?: FoldersModels.GetContentOrderParam, + filter?: FoldersModels.FolderContentFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}`, + { + ...config, + params: { + order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { + type: "query", + name: "order", + }), + filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const rename = ( + officeId: string, + folderId: string, + data: FoldersModels.RenameFolderRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}`, + ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), + config, + ); + }; + export const deleteFolder = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete({ resSchema: z.void() }, `/offices/${officeId}/folders/${folderId}`, undefined, config); + }; + export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders`, + ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), + config, + ); + }; + export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/folders/move`, + ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/folders/folders.models.ts b/test/generated/dist/folders/folders.models.ts new file mode 100644 index 0000000..c9908a5 --- /dev/null +++ b/test/generated/dist/folders/folders.models.ts @@ -0,0 +1,133 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace FoldersModels { + /** + * TargetEntityNameEnumSchema + * @type { enum } + */ + export const TargetEntityNameEnumSchema = z.enum(["invoice", "quote"]); + export type TargetEntityNameEnum = z.infer; + export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; + + /** + * FolderSymlinkResponseDTOSchema + * @type { object } + * @property { string } targetEntityName + * @property { string } targetEntityId + */ + export const FolderSymlinkResponseDTOSchema = z + .object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }) + .readonly(); + export type FolderSymlinkResponseDTO = z.infer; + + /** + * FolderTreeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } isSystem + * @property { boolean } isSymlink + * @property { FolderSymlinkResponseDTO } symlink + * @property { FolderTreeResponseDTO[] } folders + */ + export const FolderTreeResponseDTOSchema = z + .object({ + id: z.string(), + name: z.string(), + isSystem: z.boolean(), + isSymlink: z.boolean(), + symlink: FolderSymlinkResponseDTOSchema.nullable(), + get folders() { + return z.array(FolderTreeResponseDTOSchema).readonly(); + }, + }) + .readonly(); + export type FolderTreeResponseDTO = z.infer; + + /** + * FolderResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } archived + * @property { boolean } isSystem + * @property { boolean } isSymlink + * @property { FolderSymlinkResponseDTO } symlink + * @property { string } createdAt + * @property { string } updatedAt + * @property { CommonModels.FolderEmployeeDTO } createdBy + * @property { CommonModels.FolderEmployeeDTO } updatedBy + * @property { CommonModels.FileResponseDTO[] } files + * @property { FolderResponseDTO[] } folders + */ + export const FolderResponseDTOSchema = z + .object({ + id: z.string(), + name: z.string(), + archived: z.boolean(), + isSystem: z.boolean(), + isSymlink: z.boolean(), + symlink: FolderSymlinkResponseDTOSchema.nullable(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + createdBy: CommonModels.FolderEmployeeDTOSchema, + updatedBy: CommonModels.FolderEmployeeDTOSchema, + files: z.array(CommonModels.FileResponseDTOSchema).readonly(), + get folders() { + return z.array(FolderResponseDTOSchema).readonly(); + }, + }) + .readonly(); + export type FolderResponseDTO = z.infer; + + /** + * FolderContentFilterDtoSchema + * @type { object } + * @property { boolean } archived When omitted, both archived and unarchived files are returned. + */ + export const FolderContentFilterDtoSchema = z + .object({ archived: z.boolean().describe("When omitted, both archived and unarchived files are returned.") }) + .readonly(); + export type FolderContentFilterDto = z.infer; + + /** + * CreateFolderRequestDTOSchema + * @type { object } + * @property { string } parentFolderId + * @property { string } name + */ + export const CreateFolderRequestDTOSchema = z.object({ parentFolderId: z.string(), name: z.string() }).readonly(); + export type CreateFolderRequestDTO = z.infer; + + /** + * RenameFolderRequestDTOSchema + * @type { object } + * @property { string } name + */ + export const RenameFolderRequestDTOSchema = z.object({ name: z.string() }).readonly(); + export type RenameFolderRequestDTO = z.infer; + + /** + * MoveFoldersRequestDTOSchema + * @type { object } + * @property { string[] } folderIds Min Items: `1` + * @property { string } targetFolderId + */ + export const MoveFoldersRequestDTOSchema = z + .object({ folderIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }) + .readonly(); + export type MoveFoldersRequestDTO = z.infer; + + /** + * GetContentOrderParamSchema + * @type { array } + * @description Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + */ + export const GetContentOrderParamSchema = z + .array(z.string()) + .readonly() + .describe("Order by fields (comma separated with +/- prefix): name, createdAt") + .nullish(); + export type GetContentOrderParam = z.infer; +} diff --git a/test/generated/dist/folders/folders.queries.ts b/test/generated/dist/folders/folders.queries.ts new file mode 100644 index 0000000..ce4299d --- /dev/null +++ b/test/generated/dist/folders/folders.queries.ts @@ -0,0 +1,279 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FoldersModels } from "./folders.models"; +import { FoldersApi } from "./folders.api"; + +export namespace FoldersQueries { + export const moduleName = QueryModule.Folders; + + export const keys = { + all: [moduleName] as const, + getTree: (officeId: string, folderId: string) => + [...keys.all, "/offices/:officeId/folders/:folderId/tree", officeId, folderId] as const, + getContent: ( + officeId: string, + folderId: string, + limit?: number, + order?: FoldersModels.GetContentOrderParam, + filter?: FoldersModels.FolderContentFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/folders/:folderId", + officeId, + folderId, + limit, + order, + filter, + page, + cursor, + ] as const, + getContentInfinite: ( + officeId: string, + folderId: string, + limit?: number, + order?: FoldersModels.GetContentOrderParam, + filter?: FoldersModels.FolderContentFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/folders/:folderId", + "infinite", + officeId, + folderId, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useGetTree` + * @summary Get folder tree + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetTree = ( + { officeId, folderId }: { officeId: string; folderId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getTree(officeId, folderId), + queryFn: () => FoldersApi.getTree(officeId, folderId, config), + ...options, + }); + }; + + /** + * Query `useGetContent` + * @summary Get folder content + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetContent = ( + { + officeId, + folderId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + folderId: string; + limit: number; + order?: FoldersModels.GetContentOrderParam; + filter?: FoldersModels.FolderContentFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), + queryFn: () => FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `useGetContentInfinite + * @summary Get folder content + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useGetContentInfinite = ( + { + officeId, + folderId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + folderId: string; + limit: number; + order?: FoldersModels.GetContentOrderParam; + filter?: FoldersModels.FolderContentFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => + FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useRename` + * @summary Rename folder + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { FoldersModels.RenameFolderRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useRename = ( + options?: AppMutationOptions< + typeof FoldersApi.rename, + { officeId: string; folderId: string; data: FoldersModels.RenameFolderRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, folderId, data }) => FoldersApi.rename(officeId, folderId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteFolder` + * @summary Delete folder + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteFolder = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, folderId }) => FoldersApi.deleteFolder(officeId, folderId, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create folder + * @param { string } mutation.officeId Path parameter + * @param { FoldersModels.CreateFolderRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof FoldersApi.create, + { officeId: string; data: FoldersModels.CreateFolderRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FoldersApi.create(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMove` + * @summary Move folders + * @param { string } mutation.officeId Path parameter + * @param { FoldersModels.MoveFoldersRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useMove = ( + options?: AppMutationOptions< + typeof FoldersApi.move, + { officeId: string; data: FoldersModels.MoveFoldersRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => FoldersApi.move(officeId, data, config), + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/hsCodes/hsCodes.acl.ts b/test/generated/dist/hsCodes/hsCodes.acl.ts new file mode 100644 index 0000000..e893613 --- /dev/null +++ b/test/generated/dist/hsCodes/hsCodes.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace HsCodesAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "HsCode"] as AbilityTuple<"Create", "HsCode">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "HsCode"] as AbilityTuple<"Update", "HsCode">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "HsCode"] as AbilityTuple<"Archive", "HsCode">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "HsCode"] as AbilityTuple<"Archive", "HsCode">; +} diff --git a/test/generated/dist/hsCodes/hsCodes.api.ts b/test/generated/dist/hsCodes/hsCodes.api.ts new file mode 100644 index 0000000..8b3305c --- /dev/null +++ b/test/generated/dist/hsCodes/hsCodes.api.ts @@ -0,0 +1,117 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { HsCodesModels } from "./hsCodes.models"; + +export namespace HsCodesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: HsCodesModels.HsCodePaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, `/hs-codes`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes`, + ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), + config, + ); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: HsCodesModels.HsCodeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, + `/hs-codes/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: HsCodesModels.HsCodeResponseDTOSchema }, `/hs-codes/${id}`, config); + }; + export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}`, + ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/hsCodes/hsCodes.configs.ts b/test/generated/dist/hsCodes/hsCodes.configs.ts new file mode 100644 index 0000000..a69eec4 --- /dev/null +++ b/test/generated/dist/hsCodes/hsCodes.configs.ts @@ -0,0 +1,119 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { HsCodesModels } from "./hsCodes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { HsCodesQueries } from "./hsCodes.queries"; +import { HsCodesAcl } from "./hsCodes.acl"; + +export namespace HsCodesConfigs { + export const hsCodesConfig = { + meta: { + title: "Hs Codes", + }, + readAll: { + acl: HsCodesAcl.canUsePaginate, + schema: HsCodesModels.HsCodeResponseDTOSchema, + paginated: HsCodesQueries.usePaginate, + infinite: HsCodesQueries.usePaginateInfinite, + filters: { + schema: HsCodesModels.HsCodePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: HsCodesModels.HsCodePaginationFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: HsCodesModels.HsCodeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + description: true, + customArea: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: HsCodesModels.HsCodesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: HsCodesAcl.canUseFindById, + schema: HsCodesModels.HsCodeResponseDTOSchema, + query: HsCodesQueries.useFindById, + }, + create: { + acl: HsCodesAcl.canUseCreate, + schema: HsCodesModels.CreateHsCodeRequestDTOSchema, + mutation: HsCodesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: HsCodesModels.CreateHsCodeRequestDTOSchema, + options: { + inputs: { + name: true, + description: true, + customArea: true, + }, + }, + }), + }, + update: { + acl: HsCodesAcl.canUseUpdate, + schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, + mutation: HsCodesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, + options: { + inputs: { + name: true, + description: true, + customArea: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: HsCodesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: HsCodesQueries.usePaginateLabels, + infinite: HsCodesQueries.usePaginateLabelsInfinite, + filters: { + schema: HsCodesModels.HsCodeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: HsCodesModels.HsCodeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/hsCodes/hsCodes.models.ts b/test/generated/dist/hsCodes/hsCodes.models.ts new file mode 100644 index 0000000..2631d56 --- /dev/null +++ b/test/generated/dist/hsCodes/hsCodes.models.ts @@ -0,0 +1,158 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace HsCodesModels { + /** + * HsCodeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type HsCodeEmployeeDTO = z.infer; + + /** + * HsCodeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the HS Code + * @property { string } name Name of the HS Code + * @property { string } description Description of the HS Code + * @property { string } customArea Custom area associated with the HS Code + * @property { boolean } archived Indicates if the HS Code is archived + * @property { string } createdById + * @property { HsCodeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { HsCodeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const HsCodeResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier for the HS Code"), + name: z.string().describe("Name of the HS Code"), + description: z.string().describe("Description of the HS Code"), + customArea: z.string().describe("Custom area associated with the HS Code"), + archived: z.boolean().describe("Indicates if the HS Code is archived"), + createdById: z.string().nullish(), + createdBy: HsCodeEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: HsCodeEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type HsCodeResponseDTO = z.infer; + + /** + * HsCodePaginationFilterDtoSchema + * @type { object } + * @property { boolean } archived Archived status + * @property { string } search + */ + export const HsCodePaginationFilterDtoSchema = z + .object({ archived: z.boolean().describe("Archived status"), search: z.string() }) + .readonly(); + export type HsCodePaginationFilterDto = z.infer; + + /** + * HsCodeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const HsCodeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type HsCodeLabelFilterDto = z.infer; + + /** + * CreateHsCodeRequestDTOSchema + * @type { object } + * @property { string } name Unique name for the HS Code + * @property { string } description Description of the HS Code + * @property { string } customArea Custom area associated with the HS Code + */ + export const CreateHsCodeRequestDTOSchema = z + .object({ + name: z.string().describe("Unique name for the HS Code"), + description: z.string().describe("Description of the HS Code"), + customArea: z.string().describe("Custom area associated with the HS Code"), + }) + .readonly(); + export type CreateHsCodeRequestDTO = z.infer; + + /** + * UpdateHsCodeRequestDTOSchema + * @type { object } + * @property { string } name Updated name of the HS Code. + * @property { string } description Updated description of the HS Code. + * @property { string } customArea Updated custom area associated with the HS Code. + */ + export const UpdateHsCodeRequestDTOSchema = z + .object({ + name: z.string().describe("Updated name of the HS Code."), + description: z.string().describe("Updated description of the HS Code."), + customArea: z.string().describe("Updated custom area associated with the HS Code."), + }) + .readonly(); + export type UpdateHsCodeRequestDTO = z.infer; + + /** + * HsCodesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const HsCodesPaginateOrderParamEnumSchema = z.enum([ + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "name", + ]); + export type HsCodesPaginateOrderParamEnum = z.infer; + export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema.enum; + + /** + * HsCodesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { HsCodeResponseDTO[] } items + */ + export const HsCodesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(HsCodeResponseDTOSchema).readonly() }).readonly().shape, + }); + export type HsCodesPaginateResponse = z.infer; + + /** + * HsCodesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const HsCodesPaginateLabelsOrderParamEnumSchema = z.enum([ + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + "name", + ]); + export type HsCodesPaginateLabelsOrderParamEnum = z.infer; + export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * HsCodesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const HsCodesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type HsCodesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/hsCodes/hsCodes.queries.ts b/test/generated/dist/hsCodes/hsCodes.queries.ts new file mode 100644 index 0000000..fb9390b --- /dev/null +++ b/test/generated/dist/hsCodes/hsCodes.queries.ts @@ -0,0 +1,353 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { HsCodesAcl } from "./hsCodes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { HsCodesModels } from "./hsCodes.models"; +import { HsCodesApi } from "./hsCodes.api"; + +export namespace HsCodesQueries { + export const moduleName = QueryModule.HsCodes; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: HsCodesModels.HsCodePaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/hs-codes", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: HsCodesModels.HsCodePaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/hs-codes", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: HsCodesModels.HsCodeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/hs-codes/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: HsCodesModels.HsCodeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/hs-codes/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/hs-codes/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate HS Codes + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: HsCodesModels.HsCodePaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(HsCodesAcl.canUsePaginate()); + return HsCodesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate HS Codes + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: HsCodesModels.HsCodePaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(HsCodesAcl.canUsePaginate()); + return HsCodesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new HS Code + * @permission Requires `canUseCreate` ability + * @param { HsCodesModels.CreateHsCodeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(HsCodesAcl.canUseCreate()); + return HsCodesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate HS codes with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: HsCodesModels.HsCodeLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(HsCodesAcl.canUsePaginateLabels()); + return HsCodesApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate HS codes with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: HsCodesModels.HsCodeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(HsCodesAcl.canUsePaginateLabels()); + return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get HS Code Details by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(HsCodesAcl.canUseFindById()); + return HsCodesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update an existing HS Code + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { HsCodesModels.UpdateHsCodeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(HsCodesAcl.canUseUpdate()); + return HsCodesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive an HS Code + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(HsCodesAcl.canUseArchive()); + return HsCodesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive an HS Code + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(HsCodesAcl.canUseUnarchive()); + return HsCodesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/integrationChannels/integrationChannels.acl.ts b/test/generated/dist/integrationChannels/integrationChannels.acl.ts new file mode 100644 index 0000000..497b407 --- /dev/null +++ b/test/generated/dist/integrationChannels/integrationChannels.acl.ts @@ -0,0 +1,99 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace IntegrationChannelsAcl { + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List integration channels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Read", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Create", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Read integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Read", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Update", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Archive", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Archive", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useTestConnection` mutation ability. For global ability, omit the object parameter. + * @description Test integration channel connection + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTestConnection` mutation + */ + export const canUseTestConnection = (object?: { officeId: string }) => + ["Update", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< + "Update", + "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) + >; + + /** + * Use for `useListMessages` query ability. For global ability, omit the object parameter. + * @description List integration channel messages + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListMessages` query + */ + export const canUseListMessages = (object?: { officeId: string }) => + ["Read", object ? subject("IntegrationMessage", object) : "IntegrationMessage"] as AbilityTuple< + "Read", + "IntegrationMessage" | (ForcedSubject<"IntegrationMessage"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/integrationChannels/integrationChannels.api.ts b/test/generated/dist/integrationChannels/integrationChannels.api.ts new file mode 100644 index 0000000..b2bb5d5 --- /dev/null +++ b/test/generated/dist/integrationChannels/integrationChannels.api.ts @@ -0,0 +1,145 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; + +export namespace IntegrationChannelsApi { + export const list = ( + officeId: string, + limit: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, + `/offices/${officeId}/integration-channels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = ( + officeId: string, + data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels`, + ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), + config, + ); + }; + export const findById = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}`, + config, + ); + }; + export const update = ( + officeId: string, + id: string, + data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}`, + ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), + config, + ); + }; + export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/unarchive`, + undefined, + config, + ); + }; + export const testConnection = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/test-connection`, + undefined, + config, + ); + }; + export const listMessages = ( + officeId: string, + id: string, + limit: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, + `/offices/${officeId}/integration-channels/${id}/messages`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/dist/integrationChannels/integrationChannels.configs.ts b/test/generated/dist/integrationChannels/integrationChannels.configs.ts new file mode 100644 index 0000000..4105a84 --- /dev/null +++ b/test/generated/dist/integrationChannels/integrationChannels.configs.ts @@ -0,0 +1,154 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; +import { IntegrationChannelsQueries } from "./integrationChannels.queries"; +import { IntegrationChannelsAcl } from "./integrationChannels.acl"; + +export namespace IntegrationChannelsConfigs { + export const integrationChannelsConfig = { + meta: { + title: "Integration Channels", + }, + readAll: { + acl: IntegrationChannelsAcl.canUseList, + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + paginated: IntegrationChannelsQueries.useList, + infinite: IntegrationChannelsQueries.useListInfinite, + filters: { + schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + options: { + columns: { + id: true, + officeId: true, + businessPartnerId: true, + businessPartner: true, + employeeId: true, + name: true, + archived: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + lastPolledAt: true, + createdAt: true, + createdById: true, + createdBy: true, + updatedAt: true, + updatedById: true, + updatedBy: true, + }, + sortable: IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: IntegrationChannelsAcl.canUseFindById, + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + query: IntegrationChannelsQueries.useFindById, + }, + create: { + acl: IntegrationChannelsAcl.canUseCreate, + schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, + mutation: IntegrationChannelsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, + options: { + inputs: { + businessPartnerId: true, + employeeId: true, + name: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + sftpPassword: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + }, + }, + }), + }, + update: { + acl: IntegrationChannelsAcl.canUseUpdate, + schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, + mutation: IntegrationChannelsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, + options: { + inputs: { + businessPartnerId: true, + employeeId: true, + name: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + sftpPassword: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + }, + }, + }), + }, + }; + + export const messagesConfig = { + meta: { + title: "Messages", + }, + readAll: { + acl: IntegrationChannelsAcl.canUseListMessages, + schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, + paginated: IntegrationChannelsQueries.useListMessages, + infinite: IntegrationChannelsQueries.useListMessagesInfinite, + filters: { + schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, + options: { + inputs: { + direction: true, + format: true, + status: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, + options: { + columns: { + id: true, + integrationChannelId: true, + positionId: true, + positionNumber: true, + direction: true, + format: true, + status: true, + rawContent: true, + fileName: true, + errorMessage: true, + processedAt: true, + sentAt: true, + createdAt: true, + }, + sortable: IntegrationChannelsModels.ListMessagesOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/integrationChannels/integrationChannels.models.ts b/test/generated/dist/integrationChannels/integrationChannels.models.ts new file mode 100644 index 0000000..cbd4d90 --- /dev/null +++ b/test/generated/dist/integrationChannels/integrationChannels.models.ts @@ -0,0 +1,283 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace IntegrationChannelsModels { + /** + * IntegrationChannelBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const IntegrationChannelBusinessPartnerResponseDtoSchema = z + .object({ id: z.string(), name: z.string() }) + .readonly(); + export type IntegrationChannelBusinessPartnerResponseDto = z.infer< + typeof IntegrationChannelBusinessPartnerResponseDtoSchema + >; + + /** + * IntegrationChannelEmployeeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const IntegrationChannelEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type IntegrationChannelEmployeeResponseDto = z.infer; + + /** + * IntegrationChannelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } businessPartnerId + * @property { IntegrationChannelBusinessPartnerResponseDto } businessPartner + * @property { string } employeeId + * @property { string } name + * @property { boolean } archived + * @property { string } sftpHost + * @property { number } sftpPort + * @property { string } sftpUsername + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes + * @property { string } lastPolledAt + * @property { string } createdAt + * @property { string } createdById + * @property { IntegrationChannelEmployeeResponseDto } createdBy + * @property { string } updatedAt + * @property { string } updatedById + * @property { IntegrationChannelEmployeeResponseDto } updatedBy + */ + export const IntegrationChannelResponseDtoSchema = z + .object({ + id: z.string(), + officeId: z.string(), + businessPartnerId: z.string(), + businessPartner: IntegrationChannelBusinessPartnerResponseDtoSchema, + employeeId: z.string(), + name: z.string(), + archived: z.boolean(), + sftpHost: z.string(), + sftpPort: z.number(), + sftpUsername: z.string(), + inboundPath: z.string(), + outboundPath: z.string(), + pollingFrequencyMinutes: z.number(), + lastPolledAt: z.iso.datetime({ offset: true }).nullish(), + createdAt: z.iso.datetime({ offset: true }), + createdById: z.string(), + createdBy: IntegrationChannelEmployeeResponseDtoSchema, + updatedAt: z.iso.datetime({ offset: true }), + updatedById: z.string(), + updatedBy: IntegrationChannelEmployeeResponseDtoSchema, + }) + .readonly(); + export type IntegrationChannelResponseDto = z.infer; + + /** + * IntegrationMessageDirectionEnumSchema + * @type { enum } + */ + export const IntegrationMessageDirectionEnumSchema = z.enum(["Inbound", "Outbound"]); + export type IntegrationMessageDirectionEnum = z.infer; + export const IntegrationMessageDirectionEnum = IntegrationMessageDirectionEnumSchema.enum; + + /** + * IntegrationMessageFormatEnumSchema + * @type { enum } + */ + export const IntegrationMessageFormatEnumSchema = z.enum(["IFTMBF", "IFTMBC"]); + export type IntegrationMessageFormatEnum = z.infer; + export const IntegrationMessageFormatEnum = IntegrationMessageFormatEnumSchema.enum; + + /** + * IntegrationMessageStatusEnumSchema + * @type { enum } + */ + export const IntegrationMessageStatusEnumSchema = z.enum(["Received", "Processed", "Failed", "Sent"]); + export type IntegrationMessageStatusEnum = z.infer; + export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.enum; + + /** + * IntegrationMessageFilterDtoSchema + * @type { object } + * @property { IntegrationMessageDirectionEnum } direction + * @property { IntegrationMessageFormatEnum } format + * @property { IntegrationMessageStatusEnum } status + * @property { string } search + */ + export const IntegrationMessageFilterDtoSchema = z + .object({ + direction: IntegrationMessageDirectionEnumSchema, + format: IntegrationMessageFormatEnumSchema, + status: IntegrationMessageStatusEnumSchema, + search: z.string(), + }) + .readonly(); + export type IntegrationMessageFilterDto = z.infer; + + /** + * IntegrationChannelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const IntegrationChannelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type IntegrationChannelFilterDto = z.infer; + + /** + * CreateIntegrationChannelRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } employeeId + * @property { string } name + * @property { string } sftpHost + * @property { number } sftpPort Minimum: `1`. Maximum: `65535` + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes Minimum: `1` + */ + export const CreateIntegrationChannelRequestDtoSchema = z + .object({ + businessPartnerId: z.string(), + employeeId: z.string(), + name: z.string(), + sftpHost: z.string(), + sftpPort: z.number().gte(1).lte(65535), + sftpUsername: z.string(), + sftpPassword: z.string(), + inboundPath: z.string(), + outboundPath: z.string(), + pollingFrequencyMinutes: z.number().gte(1), + }) + .readonly(); + export type CreateIntegrationChannelRequestDto = z.infer; + + /** + * UpdateIntegrationChannelRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } employeeId + * @property { string } name + * @property { string } sftpHost + * @property { number } sftpPort Minimum: `1`. Maximum: `65535` + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes Minimum: `1` + */ + export const UpdateIntegrationChannelRequestDtoSchema = z + .object({ + businessPartnerId: z.string(), + employeeId: z.string(), + name: z.string(), + sftpHost: z.string(), + sftpPort: z.number().gte(1).lte(65535), + sftpUsername: z.string(), + sftpPassword: z.string(), + inboundPath: z.string(), + outboundPath: z.string(), + pollingFrequencyMinutes: z.number().gte(1), + }) + .readonly(); + export type UpdateIntegrationChannelRequestDto = z.infer; + + /** + * TestConnectionResponseDtoSchema + * @type { object } + * @property { boolean } success + */ + export const TestConnectionResponseDtoSchema = z.object({ success: z.boolean() }).readonly(); + export type TestConnectionResponseDto = z.infer; + + /** + * IntegrationMessageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } integrationChannelId + * @property { string } positionId + * @property { string } positionNumber + * @property { string } direction + * @property { string } format + * @property { string } status + * @property { string } rawContent + * @property { string } fileName + * @property { string } errorMessage + * @property { string } processedAt + * @property { string } sentAt + * @property { string } createdAt + */ + export const IntegrationMessageResponseDtoSchema = z + .object({ + id: z.string(), + integrationChannelId: z.string(), + positionId: z.string().nullish(), + positionNumber: z.string().nullish(), + direction: z.string(), + format: z.string(), + status: z.string(), + rawContent: z.string(), + fileName: z.string(), + errorMessage: z.string().nullish(), + processedAt: z.iso.datetime({ offset: true }).nullish(), + sentAt: z.iso.datetime({ offset: true }).nullish(), + createdAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type IntegrationMessageResponseDto = z.infer; + + /** + * IntegrationChannelsListOrderParamEnumSchema + * @type { enum } + */ + export const IntegrationChannelsListOrderParamEnumSchema = z.enum([ + "createdAt", + "name", + "businessPartner", + "lastPolledAt", + ]); + export type IntegrationChannelsListOrderParamEnum = z.infer; + export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrderParamEnumSchema.enum; + + /** + * IntegrationChannelsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { IntegrationChannelResponseDto[] } items + */ + export const IntegrationChannelsListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).readonly() }).readonly().shape, + }); + export type IntegrationChannelsListResponse = z.infer; + + /** + * ListMessagesOrderParamEnumSchema + * @type { enum } + */ + export const ListMessagesOrderParamEnumSchema = z.enum(["createdAt", "status", "direction", "format"]); + export type ListMessagesOrderParamEnum = z.infer; + export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; + + /** + * ListMessagesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { IntegrationMessageResponseDto[] } items + */ + export const ListMessagesResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).readonly() }).readonly().shape, + }); + export type ListMessagesResponse = z.infer; +} diff --git a/test/generated/dist/integrationChannels/integrationChannels.queries.ts b/test/generated/dist/integrationChannels/integrationChannels.queries.ts new file mode 100644 index 0000000..9ba5b53 --- /dev/null +++ b/test/generated/dist/integrationChannels/integrationChannels.queries.ts @@ -0,0 +1,471 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { IntegrationChannelsAcl } from "./integrationChannels.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; +import { IntegrationChannelsApi } from "./integrationChannels.api"; + +export namespace IntegrationChannelsQueries { + export const moduleName = QueryModule.IntegrationChannels; + + export const keys = { + all: [moduleName] as const, + list: ( + officeId: string, + limit?: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, + page?: number, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/integration-channels", officeId, limit, order, filter, page, cursor] as const, + listInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/integration-channels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (officeId: string, id: string) => + [...keys.all, "/offices/:officeId/integration-channels/:id", officeId, id] as const, + listMessages: ( + officeId: string, + id: string, + limit?: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/integration-channels/:id/messages", + officeId, + id, + limit, + order, + filter, + page, + cursor, + ] as const, + listMessagesInfinite: ( + officeId: string, + id: string, + limit?: number, + order?: string, + filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/integration-channels/:id/messages", + "infinite", + officeId, + id, + limit, + order, + filter, + cursor, + ] as const, + }; + + /** + * Query `useList` + * @summary List integration channels for an office + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: IntegrationChannelsModels.IntegrationChannelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseList({ officeId })); + return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List integration channels for an office + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: IntegrationChannelsModels.IntegrationChannelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(IntegrationChannelsAcl.canUseList({ officeId })); + return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create integration channel + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { IntegrationChannelsModels.CreateIntegrationChannelRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof IntegrationChannelsApi.create, + { officeId: string; data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId })); + return IntegrationChannelsApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get integration channel by id + * @permission Requires `canUseFindById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { officeId, id }: { officeId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(officeId, id), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId })); + return IntegrationChannelsApi.findById(officeId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update integration channel by id + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof IntegrationChannelsApi.update, + { officeId: string; id: string; data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId })); + return IntegrationChannelsApi.update(officeId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive integration channel by id + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId })); + return IntegrationChannelsApi.archive(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive integration channel by id + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId })); + return IntegrationChannelsApi.unarchive(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useTestConnection` + * @summary Test integration channel SFTP connection + * @permission Requires `canUseTestConnection` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useTestConnection = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId })); + return IntegrationChannelsApi.testConnection(officeId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListMessages` + * @summary Paginate integration channel messages + * @permission Requires `canUseListMessages` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListMessages = ( + { + officeId, + id, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + id: string; + limit: number; + order?: string; + filter?: IntegrationChannelsModels.IntegrationMessageFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId })); + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListMessagesInfinite + * @summary Paginate integration channel messages + * @permission Requires `canUseListMessages` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListMessagesInfinite = ( + { + officeId, + id, + limit, + order, + filter, + cursor, + }: { + officeId: string; + id: string; + limit: number; + order?: string; + filter?: IntegrationChannelsModels.IntegrationMessageFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId })); + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts new file mode 100644 index 0000000..f0a32a5 --- /dev/null +++ b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InttraOfficeIntegrationAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Read", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ + export const canUseGenerate = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.api.ts b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.api.ts new file mode 100644 index 0000000..a3ee1df --- /dev/null +++ b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.api.ts @@ -0,0 +1,34 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; + +export namespace InttraOfficeIntegrationApi { + export const get = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + config, + ); + }; + export const generate = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + undefined, + config, + ); + }; + export const update = ( + officeId: string, + data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.models.ts b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.models.ts new file mode 100644 index 0000000..607c312 --- /dev/null +++ b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.models.ts @@ -0,0 +1,76 @@ +import { z } from "zod"; + +export namespace InttraOfficeIntegrationModels { + /** + * OfficeInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } rotatedByUserId + * @property { string } officeId + * @property { string } sftpUsername + * @property { string } sftpPublicKey + * @property { string } partnerCode + * @property { string } ediId + * @property { string } notificationEmail + */ + export const OfficeInttraCredentialsResponseDtoSchema = z + .object({ + id: z.string(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + rotatedByUserId: z.string().nullish(), + officeId: z.string(), + sftpUsername: z.string().nullish(), + sftpPublicKey: z.string().nullish(), + partnerCode: z.string().nullish(), + ediId: z.string().nullish(), + notificationEmail: z.string().nullish(), + }) + .readonly(); + export type OfficeInttraCredentialsResponseDto = z.infer; + + /** + * GenerateInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } publicKey + * @property { string } rotatedAt + * @property { string } rotatedByUserId + */ + export const GenerateInttraCredentialsResponseDtoSchema = z + .object({ publicKey: z.string(), rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }) + .readonly(); + export type GenerateInttraCredentialsResponseDto = z.infer; + + /** + * UpdateInttraCredentialsRequestDtoSchema + * @type { object } + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } partnerCode + * @property { string } ediId + * @property { string } notificationEmail + */ + export const UpdateInttraCredentialsRequestDtoSchema = z + .object({ + sftpUsername: z.string(), + sftpPassword: z.string(), + partnerCode: z.string(), + ediId: z.string(), + notificationEmail: z.string(), + }) + .readonly(); + export type UpdateInttraCredentialsRequestDto = z.infer; + + /** + * UpdateInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } rotatedAt + * @property { string } rotatedByUserId + */ + export const UpdateInttraCredentialsResponseDtoSchema = z + .object({ rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }) + .readonly(); + export type UpdateInttraCredentialsResponseDto = z.infer; +} diff --git a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts new file mode 100644 index 0000000..39b82e3 --- /dev/null +++ b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts @@ -0,0 +1,108 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InttraOfficeIntegrationAcl } from "./inttraOfficeIntegration.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; +import { InttraOfficeIntegrationApi } from "./inttraOfficeIntegration.api"; + +export namespace InttraOfficeIntegrationQueries { + export const moduleName = QueryModule.InttraOfficeIntegration; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string) => [...keys.all, "/offices/:officeId/inttra/credentials", officeId] as const, + }; + + /** + * Query `useGet` + * @summary Get INTTRA credentials for an office + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId }: { officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId), + queryFn: () => { + checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId })); + return InttraOfficeIntegrationApi.get(officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useGenerate` + * @summary Generate and persist INTTRA SFTP RSA key pair for an office + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useGenerate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId }) => { + checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId })); + return InttraOfficeIntegrationApi.generate(officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Manually update INTTRA credentials (username/password/passphrase) + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof InttraOfficeIntegrationApi.update, + { officeId: string; data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId })); + return InttraOfficeIntegrationApi.update(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts new file mode 100644 index 0000000..85c97fc --- /dev/null +++ b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts @@ -0,0 +1,67 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InttraShippingInstructionMessagesAcl { + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List SI messages + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", + ] as AbilityTuple< + "Read", + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create SI message + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", + ] as AbilityTuple< + "Update", + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Get SI message details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ + export const canUseGetById = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", + ] as AbilityTuple< + "Read", + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update SI message + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", + ] as AbilityTuple< + "Update", + | "WorkingDocument-shipping-instructions" + | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts new file mode 100644 index 0000000..7af369d --- /dev/null +++ b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts @@ -0,0 +1,87 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; + +export namespace InttraShippingInstructionMessagesApi { + export const list = ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + limit: number, + page?: number, + cursor?: string, + filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + filter: ZodExtended.parse( + InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + }, + }, + ); + }; + export const create = ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, + ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), + config, + ); + }; + export const getById = ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + messageId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, + config, + ); + }; + export const update = ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + messageId: string, + data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, + ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts new file mode 100644 index 0000000..7942b4b --- /dev/null +++ b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts @@ -0,0 +1,87 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; +import { InttraShippingInstructionMessagesQueries } from "./inttraShippingInstructionMessages.queries"; +import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; + +export namespace InttraShippingInstructionMessagesConfigs { + export const messagesConfig = { + meta: { + title: "Messages", + }, + readAll: { + acl: InttraShippingInstructionMessagesAcl.canUseList, + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, + paginated: InttraShippingInstructionMessagesQueries.useList, + infinite: InttraShippingInstructionMessagesQueries.useListInfinite, + filters: { + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, + options: { + inputs: { + status: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, + options: { + columns: { + id: true, + createdAt: true, + updatedAt: true, + shippingInstructionsId: true, + positionId: true, + createdByUserId: true, + status: true, + fileName: true, + sftpPath: true, + sentAt: true, + uploadAttemptCount: true, + lastUploadError: true, + notes: true, + contrlStatus: true, + contrlReceivedAt: true, + contrlRaw: true, + aperakStatus: true, + aperakReceivedAt: true, + aperakRaw: true, + }, + }, + }), + }, + read: { + acl: InttraShippingInstructionMessagesAcl.canUseGetById, + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema, + query: InttraShippingInstructionMessagesQueries.useGetById, + }, + create: { + acl: InttraShippingInstructionMessagesAcl.canUseCreate, + schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, + mutation: InttraShippingInstructionMessagesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, + options: { + inputs: { + isAmendment: true, + }, + }, + }), + }, + update: { + acl: InttraShippingInstructionMessagesAcl.canUseUpdate, + schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, + mutation: InttraShippingInstructionMessagesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, + options: { + inputs: { + notes: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts new file mode 100644 index 0000000..cf33dde --- /dev/null +++ b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts @@ -0,0 +1,172 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InttraShippingInstructionMessagesModels { + /** + * InttraShippingInstructionStatusEnumSchema + * @type { enum } + */ + export const InttraShippingInstructionStatusEnumSchema = z.enum([ + "PendingUpload", + "Uploaded", + "ContrlAccepted", + "ContrlRejected", + "AperakAccepted", + "AperakRejected", + "FailedUpload", + ]); + export type InttraShippingInstructionStatusEnum = z.infer; + export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStatusEnumSchema.enum; + + /** + * ShippingInstructionMessageListItemResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } shippingInstructionsId + * @property { string } positionId + * @property { string } createdByUserId + * @property { InttraShippingInstructionStatusEnum } status + * @property { string } fileName + * @property { string } sftpPath + * @property { string } sentAt + * @property { number } uploadAttemptCount + * @property { string } lastUploadError + * @property { string } notes + * @property { string } contrlStatus + * @property { string } contrlReceivedAt + * @property { string } contrlRaw + * @property { string } aperakStatus + * @property { string } aperakReceivedAt + * @property { string } aperakRaw + */ + export const ShippingInstructionMessageListItemResponseDtoSchema = z + .object({ + id: z.string(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + shippingInstructionsId: z.string(), + positionId: z.string(), + createdByUserId: z.string(), + status: InttraShippingInstructionStatusEnumSchema, + fileName: z.string(), + sftpPath: z.string(), + sentAt: z.iso.datetime({ offset: true }), + uploadAttemptCount: z.number(), + lastUploadError: z.string().nullish(), + notes: z.string().nullish(), + contrlStatus: z.string().nullish(), + contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), + contrlRaw: z.string().nullish(), + aperakStatus: z.string().nullish(), + aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), + aperakRaw: z.string().nullish(), + }) + .readonly(); + export type ShippingInstructionMessageListItemResponseDto = z.infer< + typeof ShippingInstructionMessageListItemResponseDtoSchema + >; + + /** + * ShippingInstructionMessageFilterDtoSchema + * @type { object } + * @property { InttraShippingInstructionStatusEnum[] } status + */ + export const ShippingInstructionMessageFilterDtoSchema = z + .object({ status: z.array(InttraShippingInstructionStatusEnumSchema).readonly() }) + .readonly(); + export type ShippingInstructionMessageFilterDto = z.infer; + + /** + * ShippingInstructionMessageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } shippingInstructionsId + * @property { string } positionId + * @property { string } createdByUserId + * @property { InttraShippingInstructionStatusEnum } status + * @property { object } shippingInstructionSnapshot + * @property { string } renderedRequestPayload + * @property { string } fileName + * @property { string } sftpPath + * @property { string } sentAt + * @property { number } uploadAttemptCount + * @property { string } lastUploadError + * @property { string } notes + * @property { string } contrlStatus + * @property { string } contrlReceivedAt + * @property { string } contrlRaw + * @property { string } aperakStatus + * @property { string } aperakReceivedAt + * @property { string } aperakRaw + */ + export const ShippingInstructionMessageResponseDtoSchema = z + .object({ + id: z.string(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + shippingInstructionsId: z.string(), + positionId: z.string(), + createdByUserId: z.string(), + status: InttraShippingInstructionStatusEnumSchema, + shippingInstructionSnapshot: z.object({}).readonly(), + renderedRequestPayload: z.string(), + fileName: z.string(), + sftpPath: z.string(), + sentAt: z.iso.datetime({ offset: true }), + uploadAttemptCount: z.number(), + lastUploadError: z.string().nullish(), + notes: z.string().nullish(), + contrlStatus: z.string().nullish(), + contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), + contrlRaw: z.string().nullish(), + aperakStatus: z.string().nullish(), + aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), + aperakRaw: z.string().nullish(), + }) + .readonly(); + export type ShippingInstructionMessageResponseDto = z.infer; + + /** + * UpdateShippingInstructionMessageRequestDtoSchema + * @type { object } + * @property { string } notes + */ + export const UpdateShippingInstructionMessageRequestDtoSchema = z.object({ notes: z.string() }).readonly(); + export type UpdateShippingInstructionMessageRequestDto = z.infer< + typeof UpdateShippingInstructionMessageRequestDtoSchema + >; + + /** + * CreateShippingInstructionMessageRequestDtoSchema + * @type { object } + * @property { boolean } isAmendment Default: `false` + */ + export const CreateShippingInstructionMessageRequestDtoSchema = z + .object({ isAmendment: z.boolean().default(false) }) + .readonly(); + export type CreateShippingInstructionMessageRequestDto = z.infer< + typeof CreateShippingInstructionMessageRequestDtoSchema + >; + + /** + * InttraShippingInstructionMessagesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ShippingInstructionMessageListItemResponseDto[] } items + */ + export const InttraShippingInstructionMessagesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ShippingInstructionMessageListItemResponseDtoSchema).readonly() }).readonly().shape, + }); + export type InttraShippingInstructionMessagesListResponse = z.infer< + typeof InttraShippingInstructionMessagesListResponseSchema + >; +} diff --git a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts new file mode 100644 index 0000000..cd6ec39 --- /dev/null +++ b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts @@ -0,0 +1,315 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; +import { InttraShippingInstructionMessagesApi } from "./inttraShippingInstructionMessages.api"; + +export namespace InttraShippingInstructionMessagesQueries { + export const moduleName = QueryModule.InttraShippingInstructionMessages; + + export const keys = { + all: [moduleName] as const, + list: ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + limit?: number, + page?: number, + cursor?: string, + filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", + officeId, + positionId, + shippingInstructionsId, + limit, + page, + cursor, + filter, + ] as const, + listInfinite: ( + officeId: string, + positionId: string, + shippingInstructionsId: string, + limit?: number, + cursor?: string, + filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", + "infinite", + officeId, + positionId, + shippingInstructionsId, + limit, + cursor, + filter, + ] as const, + getById: (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages/:messageId", + officeId, + positionId, + shippingInstructionsId, + messageId, + ] as const, + }; + + /** + * Query `useList` + * @summary List Inttra shipping instruction messages for a position/BL instructions + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + positionId, + shippingInstructionsId, + limit, + page, + cursor, + filter, + }: { + officeId: string; + positionId: string; + shippingInstructionsId: string; + limit: number; + page?: number; + cursor?: string; + filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), + queryFn: () => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId })); + return InttraShippingInstructionMessagesApi.list( + officeId, + positionId, + shippingInstructionsId, + limit, + page, + cursor, + filter, + config, + ); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List Inttra shipping instruction messages for a position/BL instructions + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + officeId, + positionId, + shippingInstructionsId, + limit, + cursor, + filter, + }: { + officeId: string; + positionId: string; + shippingInstructionsId: string; + limit: number; + cursor?: string; + filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), + queryFn: ({ pageParam }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId })); + return InttraShippingInstructionMessagesApi.list( + officeId, + positionId, + shippingInstructionsId, + limit, + pageParam, + cursor, + filter, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create Inttra shipping instruction message + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.shippingInstructionsId Path parameter + * @param { InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof InttraShippingInstructionMessagesApi.create, + { + officeId: string; + positionId: string; + shippingInstructionsId: string; + data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId })); + return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetById` + * @summary Get Inttra shipping instruction message details + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { string } object.messageId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetById = ( + { + officeId, + positionId, + shippingInstructionsId, + messageId, + }: { officeId: string; positionId: string; shippingInstructionsId: string; messageId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), + queryFn: () => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId })); + return InttraShippingInstructionMessagesApi.getById( + officeId, + positionId, + shippingInstructionsId, + messageId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Inttra shipping instruction message + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.shippingInstructionsId Path parameter + * @param { string } mutation.messageId Path parameter + * @param { InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof InttraShippingInstructionMessagesApi.update, + { + officeId: string; + positionId: string; + shippingInstructionsId: string; + messageId: string; + data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId })); + return InttraShippingInstructionMessagesApi.update( + officeId, + positionId, + shippingInstructionsId, + messageId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, shippingInstructionsId, messageId } = variables; + const updateKeys = [keys.getById(officeId, positionId, shippingInstructionsId, messageId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/invoicePayments/invoicePayments.acl.ts b/test/generated/dist/invoicePayments/invoicePayments.acl.ts new file mode 100644 index 0000000..6abcc9b --- /dev/null +++ b/test/generated/dist/invoicePayments/invoicePayments.acl.ts @@ -0,0 +1,111 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InvoicePaymentsAcl { + /** + * Use for `useListOfficePayments` query ability. For global ability, omit the object parameter. + * @description List office payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListOfficePayments` query + */ + export const canUseListOfficePayments = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useBulkCreatePayments` mutation ability. For global ability, omit the object parameter. + * @description Bulk create invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useBulkCreatePayments` mutation + */ + export const canUseBulkCreatePayments = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useCalculatePayments` mutation ability. For global ability, omit the object parameter. + * @description Calculate invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCalculatePayments` mutation + */ + export const canUseCalculatePayments = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useExportOfficePayments` mutation ability. For global ability, omit the object parameter. + * @description Export office invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportOfficePayments` mutation + */ + export const canUseExportOfficePayments = (object?: { officeId: string }) => + ["Export", object ? subject("InvoicePayment", object) : "InvoicePayment"] as AbilityTuple< + "Export", + "InvoicePayment" | (ForcedSubject<"InvoicePayment"> & { officeId: string }) + >; + + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetPaymentById` query ability. For global ability, omit the object parameter. + * @description Create invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPaymentById` query + */ + export const canUseGetPaymentById = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useDeleteInvoicePayment` mutation ability. For global ability, omit the object parameter. + * @description Delete invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoicePayment` mutation + */ + export const canUseDeleteInvoicePayment = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/invoicePayments/invoicePayments.api.ts b/test/generated/dist/invoicePayments/invoicePayments.api.ts new file mode 100644 index 0000000..820c5fd --- /dev/null +++ b/test/generated/dist/invoicePayments/invoicePayments.api.ts @@ -0,0 +1,173 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; + +export namespace InvoicePaymentsApi { + export const listOfficePayments = ( + officeId: string, + limit: number, + order?: string, + filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, + `/offices/${officeId}/payments`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const bulkCreatePayments = ( + officeId: string, + data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, + `/offices/${officeId}/payments`, + ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), + config, + ); + }; + export const calculatePayments = ( + officeId: string, + data: InvoicePaymentsModels.CalculatePaymentsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, + `/offices/${officeId}/payments/calculate`, + ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), + config, + ); + }; + export const exportOfficePayments = ( + officeId: string, + data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payments/exports`, + ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const list = ( + officeId: string, + invoiceId: string, + limit: number, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = ( + officeId: string, + invoiceId: string, + data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments`, + ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), + config, + ); + }; + export const getPaymentById = ( + officeId: string, + invoiceId: string, + paymentId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + config, + ); + }; + export const update = ( + officeId: string, + invoiceId: string, + paymentId: string, + data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), + config, + ); + }; + export const deleteInvoicePayment = ( + officeId: string, + invoiceId: string, + paymentId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/invoicePayments/invoicePayments.configs.ts b/test/generated/dist/invoicePayments/invoicePayments.configs.ts new file mode 100644 index 0000000..a5d2a8d --- /dev/null +++ b/test/generated/dist/invoicePayments/invoicePayments.configs.ts @@ -0,0 +1,143 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; +import { InvoicePaymentsQueries } from "./invoicePayments.queries"; +import { InvoicePaymentsAcl } from "./invoicePayments.acl"; + +export namespace InvoicePaymentsConfigs { + export const paymentsConfig = { + meta: { + title: "Payments", + }, + readAll: { + acl: InvoicePaymentsAcl.canUseListOfficePayments, + schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, + paginated: InvoicePaymentsQueries.useListOfficePayments, + infinite: InvoicePaymentsQueries.useListOfficePaymentsInfinite, + filters: { + schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, + options: { + inputs: { + search: true, + paymentDate: true, + invoiceIssuingDate: true, + invoiceDirection: true, + createdBy: true, + businessPartner: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, + options: { + columns: { + id: true, + amount: true, + positionNumber: true, + currencyNotation: true, + paymentDate: true, + paymentMethod: true, + comment: true, + createdAt: true, + updatedAt: true, + createdBy: true, + invoice: true, + businessPartner: true, + }, + sortable: InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema, + }, + }), + }, + create: { + acl: InvoicePaymentsAcl.canUseBulkCreatePayments, + schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, + mutation: InvoicePaymentsQueries.useBulkCreatePayments, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, + options: { + inputs: { + paymentDate: true, + invoiceIds: true, + comment: true, + }, + }, + }), + }, + }; + + export const invoicesPaymentsConfig = { + meta: { + title: "Invoices Payments", + }, + readAll: { + acl: InvoicePaymentsAcl.canUseList, + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + paginated: InvoicePaymentsQueries.useList, + infinite: InvoicePaymentsQueries.useListInfinite, + columns: dynamicColumns({ + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + options: { + columns: { + id: true, + amount: true, + currencyNotation: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + bankAccount: true, + comment: true, + createdAt: true, + updatedAt: true, + createdBy: true, + }, + }, + }), + }, + read: { + acl: InvoicePaymentsAcl.canUseGetPaymentById, + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + query: InvoicePaymentsQueries.useGetPaymentById, + }, + create: { + acl: InvoicePaymentsAcl.canUseCreate, + schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, + mutation: InvoicePaymentsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, + options: { + inputs: { + amount: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + comment: true, + }, + }, + }), + }, + update: { + acl: InvoicePaymentsAcl.canUseUpdate, + schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, + mutation: InvoicePaymentsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, + options: { + inputs: { + amount: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + comment: true, + }, + }, + }), + }, + delete: { + acl: InvoicePaymentsAcl.canUseDeleteInvoicePayment, + mutation: InvoicePaymentsQueries.useDeleteInvoicePayment, + }, + }; +} diff --git a/test/generated/dist/invoicePayments/invoicePayments.models.ts b/test/generated/dist/invoicePayments/invoicePayments.models.ts new file mode 100644 index 0000000..02ad0be --- /dev/null +++ b/test/generated/dist/invoicePayments/invoicePayments.models.ts @@ -0,0 +1,470 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicePaymentsModels { + /** + * OfficePaymentTotalAmountsDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ + export const OfficePaymentTotalAmountsDtoSchema = z + .object({ amount: z.number(), currencyNotation: z.string() }) + .readonly(); + export type OfficePaymentTotalAmountsDto = z.infer; + + /** + * OfficePaymentListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { OfficePaymentTotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ + export const OfficePaymentListResponseDtoSchema = z + .object({ + items: z.array(z.string()).readonly().describe("Items"), + totalAmounts: z.array(OfficePaymentTotalAmountsDtoSchema).readonly(), + page: z.number().describe("1-indexed page number to begin from").nullish(), + cursor: z.string().describe("ID of item to start after").nullish(), + nextCursor: z.string().describe("Cursor for next set of items").nullish(), + limit: z.number().describe("Items per response"), + totalItems: z.number().describe("Total available items"), + }) + .readonly(); + export type OfficePaymentListResponseDto = z.infer; + + /** + * OfficePaymentPreviewInvoiceDtoSchema + * @type { object } + * @property { string } id + * @property { string } invoiceNumber + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection + * @property { number } grossAmount + * @property { CommonModels.InvoiceStatusEnum } status + * @property { string } paidOn + * @property { string } issuingDate + */ + export const OfficePaymentPreviewInvoiceDtoSchema = z + .object({ + id: z.string(), + invoiceNumber: z.string(), + invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, + grossAmount: z.number(), + status: CommonModels.InvoiceStatusEnumSchema, + paidOn: z.iso.datetime({ offset: true }).nullable(), + issuingDate: z.iso.datetime({ offset: true }).nullable(), + }) + .readonly(); + export type OfficePaymentPreviewInvoiceDto = z.infer; + + /** + * PaymentMethodEnumSchema + * @type { enum } + */ + export const PaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); + export type PaymentMethodEnum = z.infer; + export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; + + /** + * OfficePaymentPreviewCreatedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type OfficePaymentPreviewCreatedByDto = z.infer; + + /** + * OfficePaymentBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ + export const OfficePaymentBusinessPartnerDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), + }) + .readonly(); + export type OfficePaymentBusinessPartnerDto = z.infer; + + /** + * OfficePaymentPreviewDtoSchema + * @type { object } + * @property { string } id + * @property { number } amount + * @property { string } positionNumber + * @property { string } currencyNotation + * @property { string } paymentDate + * @property { PaymentMethodEnum } paymentMethod + * @property { string } comment + * @property { string } createdAt + * @property { string } updatedAt + * @property { OfficePaymentPreviewCreatedByDto } createdBy + * @property { OfficePaymentPreviewInvoiceDto } invoice + * @property { OfficePaymentBusinessPartnerDto } businessPartner + */ + export const OfficePaymentPreviewDtoSchema = z + .object({ + id: z.string(), + amount: z.number(), + positionNumber: z.string(), + currencyNotation: z.string(), + paymentDate: z.iso.datetime({ offset: true }), + paymentMethod: PaymentMethodEnumSchema, + comment: z.string().nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + createdBy: OfficePaymentPreviewCreatedByDtoSchema, + invoice: OfficePaymentPreviewInvoiceDtoSchema, + businessPartner: OfficePaymentBusinessPartnerDtoSchema.nullish(), + }) + .readonly(); + export type OfficePaymentPreviewDto = z.infer; + + /** + * OfficeInvoicePaymentFilterDtoSchema + * @type { object } + * @property { string } search Search by invoice number + * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range + * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction + * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) + * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) + */ + export const OfficeInvoicePaymentFilterDtoSchema = z + .object({ + search: z.string().describe("Search by invoice number"), + paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), + invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), + invoiceDirection: z + .array(CommonModels.InvoiceDirectionEnumSchema) + .readonly() + .describe("Filter by invoice direction"), + createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), + businessPartner: z + .array(z.string()) + .readonly() + .describe("Filter by invoice customer/business partner (array of UUIDs)"), + }) + .readonly(); + export type OfficeInvoicePaymentFilterDto = z.infer; + + /** + * BulkCreatePaymentBusinessPartnerDtoSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } name Business partner name + * @property { string } paymentDate Payment date applied to the partner invoices + */ + export const BulkCreatePaymentBusinessPartnerDtoSchema = z + .object({ + id: z.string().describe("Business partner ID"), + name: z.string().describe("Business partner name"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date applied to the partner invoices"), + }) + .readonly(); + export type BulkCreatePaymentBusinessPartnerDto = z.infer; + + /** + * BulkCreatePaymentsResponseDtoSchema + * @type { object } + * @property { BulkCreatePaymentBusinessPartnerDto[] } businessPartners List of business partners paid in this bulk operation + */ + export const BulkCreatePaymentsResponseDtoSchema = z + .object({ + businessPartners: z + .array(BulkCreatePaymentBusinessPartnerDtoSchema) + .readonly() + .describe("List of business partners paid in this bulk operation"), + }) + .readonly(); + export type BulkCreatePaymentsResponseDto = z.infer; + + /** + * CalculatePaymentItemDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } businessPartnerName + * @property { number } amount + * @property { string } currency + */ + export const CalculatePaymentItemDtoSchema = z + .object({ + businessPartnerId: z.string(), + businessPartnerName: z.string(), + amount: z.number(), + currency: z.string(), + }) + .readonly(); + export type CalculatePaymentItemDto = z.infer; + + /** + * CalculatePaymentTotalDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currency + */ + export const CalculatePaymentTotalDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); + export type CalculatePaymentTotalDto = z.infer; + + /** + * CalculatePaymentsResponseDtoSchema + * @type { object } + * @property { CalculatePaymentItemDto[] } payments + * @property { CalculatePaymentTotalDto[] } totals + */ + export const CalculatePaymentsResponseDtoSchema = z + .object({ + payments: z.array(CalculatePaymentItemDtoSchema).readonly(), + totals: z.array(CalculatePaymentTotalDtoSchema).readonly(), + }) + .readonly(); + export type CalculatePaymentsResponseDto = z.infer; + + /** + * OfficeInvoicePaymentExportFilterDtoSchema + * @type { object } + * @property { string } search Search by invoice number + * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range + * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction + * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) + * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) + */ + export const OfficeInvoicePaymentExportFilterDtoSchema = z + .object({ + search: z.string().describe("Search by invoice number"), + paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), + invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), + invoiceDirection: z + .array(CommonModels.InvoiceDirectionEnumSchema) + .readonly() + .describe("Filter by invoice direction"), + createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), + businessPartner: z + .array(z.string()) + .readonly() + .describe("Filter by invoice customer/business partner (array of UUIDs)"), + }) + .readonly(); + export type OfficeInvoicePaymentExportFilterDto = z.infer; + + /** + * OfficeInvoicePaymentExportColumnSchema + * @type { enum } + */ + export const OfficeInvoicePaymentExportColumnSchema = z.enum([ + "amount", + "currency", + "paymentDate", + "paymentMethod", + "comment", + "positionNumber", + "invoiceNumber", + "invoiceDirection", + "invoiceStatus", + "invoiceIssuingDate", + "invoiceGrossAmount", + "invoicePaidOn", + "businessPartnerName", + "createdByName", + ]); + export type OfficeInvoicePaymentExportColumn = z.infer; + export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumnSchema.enum; + + /** + * OfficeInvoicePaymentExportRequestDtoSchema + * @type { object } + * @property { OfficeInvoicePaymentExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { OfficeInvoicePaymentExportFilterDto } filter + */ + export const OfficeInvoicePaymentExportRequestDtoSchema = z + .object({ + columns: z.array(OfficeInvoicePaymentExportColumnSchema).readonly().min(1), + order: z.array(z.string()).readonly(), + filter: OfficeInvoicePaymentExportFilterDtoSchema, + }) + .readonly(); + export type OfficeInvoicePaymentExportRequestDto = z.infer; + + /** + * PaymentCreatedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PaymentCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type PaymentCreatedByDto = z.infer; + + /** + * PaymentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { number } amount + * @property { string } currencyNotation + * @property { string } paymentDate + * @property { PaymentMethodEnum } paymentMethod + * @property { string } bankAccountId + * @property { string } bankAccount + * @property { string } comment + * @property { string } createdAt + * @property { string } updatedAt + * @property { PaymentCreatedByDto } createdBy + */ + export const PaymentResponseDtoSchema = z + .object({ + id: z.string(), + amount: z.number(), + currencyNotation: z.string(), + paymentDate: z.iso.datetime({ offset: true }), + paymentMethod: PaymentMethodEnumSchema, + bankAccountId: z.string().nullish(), + bankAccount: z.string().nullish(), + comment: z.string().nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + createdBy: PaymentCreatedByDtoSchema.nullish(), + }) + .readonly(); + export type PaymentResponseDto = z.infer; + + /** + * PositionInvoicePaymentMethodEnumSchema + * @type { enum } + */ + export const PositionInvoicePaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); + export type PositionInvoicePaymentMethodEnum = z.infer; + export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnumSchema.enum; + + /** + * CreateInvoicePaymentRequestDtoSchema + * @type { object } + * @property { number } amount Payment amount + * @property { string } paymentDate Payment date + * @property { PositionInvoicePaymentMethodEnum } paymentMethod Payment method + * @property { string } bankAccountId Bank account ID + * @property { string } comment Optional comment + */ + export const CreateInvoicePaymentRequestDtoSchema = z + .object({ + amount: z.number().describe("Payment amount"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), + paymentMethod: PositionInvoicePaymentMethodEnumSchema.describe("Payment method"), + bankAccountId: z.string().describe("Bank account ID").nullish(), + comment: z.string().describe("Optional comment").nullish(), + }) + .readonly(); + export type CreateInvoicePaymentRequestDto = z.infer; + + /** + * UpdateInvoicePaymentRequestDtoSchema + * @type { object } + * @property { number } amount Payment amount. Minimum: `0.01` + * @property { string } paymentDate Payment date + * @property { string } paymentMethod Payment method + * @property { string } bankAccountId Bank account ID + * @property { string } comment Payment comment + */ + export const UpdateInvoicePaymentRequestDtoSchema = z + .object({ + amount: z.number().gte(0.01).describe("Payment amount"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), + paymentMethod: PaymentMethodEnumSchema.describe("Payment method"), + bankAccountId: z.string().describe("Bank account ID"), + comment: z.string().describe("Payment comment"), + }) + .readonly(); + export type UpdateInvoicePaymentRequestDto = z.infer; + + /** + * BulkCreatePaymentsRequestDtoSchema + * @type { object } + * @property { string } paymentDate Payment date for all payments + * @property { string[] } invoiceIds List of invoice IDs to create payments for. Min Items: `1` + * @property { string } comment + */ + export const BulkCreatePaymentsRequestDtoSchema = z + .object({ + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date for all payments"), + invoiceIds: z.array(z.string()).readonly().min(1).describe("List of invoice IDs to create payments for"), + comment: z.string().nullish(), + }) + .readonly(); + export type BulkCreatePaymentsRequestDto = z.infer; + + /** + * CalculatePaymentsRequestDtoSchema + * @type { object } + * @property { string[] } invoiceIds Invoice IDs (UUID v4). Min Items: `1`. Max Items: `30` + */ + export const CalculatePaymentsRequestDtoSchema = z + .object({ invoiceIds: z.array(z.string()).readonly().min(1).max(30).describe("Invoice IDs (UUID v4)") }) + .readonly(); + export type CalculatePaymentsRequestDto = z.infer; + + /** + * ListOfficePaymentsOrderParamEnumSchema + * @type { enum } + */ + export const ListOfficePaymentsOrderParamEnumSchema = z.enum([ + "paymentDate", + "amount", + "paymentMethod", + "comment", + "createdAt", + "updatedAt", + "currencyNotation", + "createdByName", + "invoiceNumber", + "invoiceDirection", + "invoiceGrossAmount", + "invoiceStatus", + "invoicePaidOn", + "invoiceIssuingDate", + ]); + export type ListOfficePaymentsOrderParamEnum = z.infer; + export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnumSchema.enum; + + /** + * ListOfficePaymentsResponseSchema + * @type { object } + * @property { OfficePaymentTotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficePaymentPreviewDto[] } items + */ + export const ListOfficePaymentsResponseSchema = z.object({ + ...OfficePaymentListResponseDtoSchema.shape, + ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).readonly() }).readonly().shape, + }); + export type ListOfficePaymentsResponse = z.infer; + + /** + * InvoicePaymentsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PaymentResponseDto[] } items + */ + export const InvoicePaymentsListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PaymentResponseDtoSchema).readonly() }).readonly().shape, + }); + export type InvoicePaymentsListResponse = z.infer; +} diff --git a/test/generated/dist/invoicePayments/invoicePayments.queries.ts b/test/generated/dist/invoicePayments/invoicePayments.queries.ts new file mode 100644 index 0000000..2616d8a --- /dev/null +++ b/test/generated/dist/invoicePayments/invoicePayments.queries.ts @@ -0,0 +1,467 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InvoicePaymentsAcl } from "./invoicePayments.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; +import { InvoicePaymentsApi } from "./invoicePayments.api"; + +export namespace InvoicePaymentsQueries { + export const moduleName = QueryModule.InvoicePayments; + + export const keys = { + all: [moduleName] as const, + listOfficePayments: ( + officeId: string, + limit?: number, + order?: string, + filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/payments", officeId, limit, order, filter, page, cursor] as const, + listOfficePaymentsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/payments", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, invoiceId: string, limit?: number, page?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/invoices/:invoiceId/payments", + officeId, + invoiceId, + limit, + page, + cursor, + ] as const, + listInfinite: (officeId: string, invoiceId: string, limit?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/invoices/:invoiceId/payments", + "infinite", + officeId, + invoiceId, + limit, + cursor, + ] as const, + getPaymentById: (officeId: string, invoiceId: string, paymentId: string) => + [ + ...keys.all, + "/offices/:officeId/invoices/:invoiceId/payments/:paymentId", + officeId, + invoiceId, + paymentId, + ] as const, + }; + + /** + * Query `useListOfficePayments` + * @summary List all payments for an office + * @permission Requires `canUseListOfficePayments` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` + * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListOfficePayments = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId })); + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListOfficePaymentsInfinite + * @summary List all payments for an office + * @permission Requires `canUseListOfficePayments` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` + * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListOfficePaymentsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId })); + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useBulkCreatePayments` + * @summary Bulk create payments for multiple invoices + * @permission Requires `canUseBulkCreatePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.BulkCreatePaymentsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useBulkCreatePayments = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.bulkCreatePayments, + { officeId: string; data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId })); + return InvoicePaymentsApi.bulkCreatePayments(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCalculatePayments` + * @summary Calculate grouped payments for provided invoices + * @permission Requires `canUseCalculatePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.CalculatePaymentsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useCalculatePayments = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.calculatePayments, + { officeId: string; data: InvoicePaymentsModels.CalculatePaymentsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId })); + return InvoicePaymentsApi.calculatePayments(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useExportOfficePayments` - recommended when file should not be cached + * @summary Export office invoice payments to Excel + * @permission Requires `canUseExportOfficePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportOfficePayments = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.exportOfficePayments, + { officeId: string; data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId })); + return InvoicePaymentsApi.exportOfficePayments(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useList` + * @summary List payments for an invoice + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + invoiceId, + limit, + page, + cursor, + }: { officeId: string; invoiceId: string; limit: number; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, invoiceId, limit, page, cursor), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseList({ officeId })); + return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List payments for an invoice + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { officeId, invoiceId, limit, cursor }: { officeId: string; invoiceId: string; limit: number; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicePaymentsAcl.canUseList({ officeId })); + return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a payment for an invoice + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicePaymentsModels.CreateInvoicePaymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.create, + { officeId: string; invoiceId: string; data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId })); + return InvoicePaymentsApi.create(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetPaymentById` + * @summary Get a payment by ID + * @permission Requires `canUseGetPaymentById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { string } object.paymentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetPaymentById = ( + { officeId, invoiceId, paymentId }: { officeId: string; invoiceId: string; paymentId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId })); + return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update a payment + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.paymentId Path parameter + * @param { InvoicePaymentsModels.UpdateInvoicePaymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.update, + { + officeId: string; + invoiceId: string; + paymentId: string; + data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, paymentId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId })); + return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId, paymentId } = variables; + const updateKeys = [keys.getPaymentById(officeId, invoiceId, paymentId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteInvoicePayment` + * @summary Delete a payment + * @permission Requires `canUseDeleteInvoicePayment` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.paymentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteInvoicePayment = ( + options?: AppMutationOptions< + typeof InvoicePaymentsApi.deleteInvoicePayment, + { officeId: string; invoiceId: string; paymentId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, paymentId }) => { + checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId })); + return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/invoices/invoices.acl.ts b/test/generated/dist/invoices/invoices.acl.ts new file mode 100644 index 0000000..c9eae2a --- /dev/null +++ b/test/generated/dist/invoices/invoices.acl.ts @@ -0,0 +1,375 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InvoicesAcl { + /** + * Use for `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download invoices as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation + */ + export const canUseGetInvoicesEml = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useFind` query ability. For global ability, omit the object parameter. + * @description List invoices for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query + */ + export const canUseFind = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useChangeIncomingCustomer` mutation ability. For global ability, omit the object parameter. + * @description PositionInvoice Fix + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useChangeIncomingCustomer` mutation + */ + export const canUseChangeIncomingCustomer = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useFindByOffice` query ability. For global ability, omit the object parameter. + * @description List invoices for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByOffice` query + */ + export const canUseFindByOffice = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useCreateDraft` mutation ability. For global ability, omit the object parameter. + * @description Create invoice for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDraft` mutation + */ + export const canUseCreateDraft = (object?: { officeId: string }) => + ["Create", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Create", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useExportInvoices` mutation ability. For global ability, omit the object parameter. + * @description Export invoices for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportInvoices` mutation + */ + export const canUseExportInvoices = (object?: { officeId: string }) => + ["Export", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Export", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useExportCharges` mutation ability. For global ability, omit the object parameter. + * @description Export invoice charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportCharges` mutation + */ + export const canUseExportCharges = (object?: { officeId: string }) => + ["Export", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Export", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetUnCharges` query ability. For global ability, omit the object parameter. + * @description List uninvoiced charges for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetUnCharges` query + */ + export const canUseGetUnCharges = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ + export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetOfficeUnCharges` query ability. For global ability, omit the object parameter. + * @description List uninvoiced charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetOfficeUnCharges` query + */ + export const canUseGetOfficeUnCharges = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useExportUnCharges` mutation ability. For global ability, omit the object parameter. + * @description Export uninvoiced charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportUnCharges` mutation + */ + export const canUseExportUnCharges = (object?: { officeId: string }) => + ["Export", object ? subject("UninvoicedCharge", object) : "UninvoicedCharge"] as AbilityTuple< + "Export", + "UninvoicedCharge" | (ForcedSubject<"UninvoicedCharge"> & { officeId: string }) + >; + + /** + * Use for `useCreateDirect` mutation ability. For global ability, omit the object parameter. + * @description Create direct invoice for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDirect` mutation + */ + export const canUseCreateDirect = (object?: { officeId: string }) => + ["CreateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "CreateDirectInvoice", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useAddChargeToDirect` mutation ability. For global ability, omit the object parameter. + * @description Add charge to direct invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddChargeToDirect` mutation + */ + export const canUseAddChargeToDirect = (object?: { officeId: string }) => + ["UpdateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "UpdateDirectInvoice", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCharges` mutation ability. For global ability, omit the object parameter. + * @description Update invoice charges + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCharges` mutation + */ + export const canUseUpdateCharges = (object?: { officeId: string }) => + ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Update", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useRemoveChargeFromDirect` mutation ability. For global ability, omit the object parameter. + * @description Remove charge from direct invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRemoveChargeFromDirect` mutation + */ + export const canUseRemoveChargeFromDirect = (object?: { officeId: string }) => + ["UpdateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "UpdateDirectInvoice", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetDetail` query ability. For global ability, omit the object parameter. + * @description Read invoice details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDetail` query + */ + export const canUseGetDetail = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useDeleteInvoice` mutation ability. For global ability, omit the object parameter. + * @description Delete invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoice` mutation + */ + export const canUseDeleteInvoice = (object?: { officeId: string }) => + ["Delete", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Delete", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useFix` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice accounting issues + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFix` mutation + */ + export const canUseFix = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ + export const canUseGenerate = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useUpdateIssuedVatRules` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice VAT rules + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedVatRules` mutation + */ + export const canUseUpdateIssuedVatRules = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useUpdateIssuedCharges` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice charges + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedCharges` mutation + */ + export const canUseUpdateIssuedCharges = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useIssue` mutation ability. For global ability, omit the object parameter. + * @description Issue invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssue` mutation + */ + export const canUseIssue = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useReportHungarian` mutation ability. For global ability, omit the object parameter. + * @description Report invoice to Hungarian tax authority + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReportHungarian` mutation + */ + export const canUseReportHungarian = (object?: { officeId: string }) => + ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Fix", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGenerateIncoming` mutation ability. For global ability, omit the object parameter. + * @description Generate incoming invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIncoming` mutation + */ + export const canUseGenerateIncoming = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useRegister` mutation ability. For global ability, omit the object parameter. + * @description Register invoice for bookkeeping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRegister` mutation + */ + export const canUseRegister = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetPreview` query or `useGetPreviewMutation` mutation ability. For global ability, omit the object parameter. + * @description View invoice preview + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` query or `useGetPreviewMutation` mutation + */ + export const canUseGetPreview = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download invoice as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation + */ + export const canUseGetInvoiceEml = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `usePrepareDocumentUpload` mutation ability. For global ability, omit the object parameter. + * @description Upload invoice document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareDocumentUpload` mutation + */ + export const canUsePrepareDocumentUpload = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ + export const canUseCancel = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useIssueCreditNote` mutation ability. For global ability, omit the object parameter. + * @description Issue credit note invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueCreditNote` mutation + */ + export const canUseIssueCreditNote = (object?: { officeId: string }) => + ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Update", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/invoices/invoices.api.ts b/test/generated/dist/invoices/invoices.api.ts new file mode 100644 index 0000000..e861953 --- /dev/null +++ b/test/generated/dist/invoices/invoices.api.ts @@ -0,0 +1,507 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicesApi { + export const getInvoicesEml = ( + officeId: string, + invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/eml`, { + ...config, + params: { + invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { + type: "query", + name: "invoiceIds", + }), + }, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }); + }; + export const find = ( + officeId: string, + positionId: string, + limit: number, + order?: string, + filter?: InvoicesModels.InvoiceFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoicesFindResponseSchema }, + `/offices/${officeId}/positions/${positionId}/invoices`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const changeIncomingCustomer = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.ChangeInvoiceCustomerRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/customer`, + ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), + config, + ); + }; + export const findByOffice = ( + officeId: string, + limit: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.FindByOfficeResponseSchema }, + `/offices/${officeId}/invoices`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const createDraft = ( + officeId: string, + data: InvoicesModels.CreateDraftInvoiceRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices`, + ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), + config, + ); + }; + export const exportInvoices = ( + officeId: string, + data: InvoicesModels.InvoiceExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/exports`, + ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const exportCharges = ( + officeId: string, + data: InvoicesModels.InvoiceExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/charges/exports`, + ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const getUnCharges = ( + officeId: string, + positionId: string, + limit: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargePaginationDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.GetUnChargesResponseSchema }, + `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const listAvailablePartnersFor = ( + officeId: string, + invoiceId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/invoices/${invoiceId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { + type: "query", + name: "useCase", + }), + }, + }, + ); + }; + export const getOfficeUnCharges = ( + officeId: string, + limit: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargesFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, + `/offices/${officeId}/uninvoiced-charges`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const exportUnCharges = ( + officeId: string, + data: InvoicesModels.UninvoicedChargesExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/uninvoiced-charges/exports`, + ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const createDirect = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/offices/${officeId}/direct-invoices`, undefined, config); + }; + export const addChargeToDirect = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges`, + ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), + config, + ); + }; + export const updateCharges = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.UpdateInvoiceChargesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges`, + ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), + config, + ); + }; + export const removeChargeFromDirect = ( + officeId: string, + invoiceId: string, + chargeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, + undefined, + config, + ); + }; + export const getDetail = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}`, + config, + ); + }; + export const update = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.UpdateInvoiceRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}`, + ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), + config, + ); + }; + export const deleteInvoice = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}`, + undefined, + config, + ); + }; + export const fix = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.FixInvoiceRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix`, + ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), + config, + ); + }; + export const generate = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/document`, + undefined, + config, + ); + }; + export const updateIssuedVatRules = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, + ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), + config, + ); + }; + export const updateIssuedCharges = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, + ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), + config, + ); + }; + export const issue = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/issue`, + undefined, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const reportHungarian = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, + undefined, + config, + ); + }; + export const generateIncoming = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, + undefined, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const register = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/register`, + undefined, + config, + ); + }; + export const getPreview = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/preview`, { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }); + }; + export const getInvoiceEml = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/eml`, { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }); + }; + export const prepareDocumentUpload = ( + officeId: string, + invoiceId: string, + data: InvoicesModels.PrepareUploadRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/upload-document`, + ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), + config, + ); + }; + export const cancel = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/cancel`, + undefined, + config, + ); + }; + export const issueCreditNote = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/invoices/invoices.configs.ts b/test/generated/dist/invoices/invoices.configs.ts new file mode 100644 index 0000000..ced8ba2 --- /dev/null +++ b/test/generated/dist/invoices/invoices.configs.ts @@ -0,0 +1,321 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { InvoicesQueries } from "./invoices.queries"; +import { InvoicesAcl } from "./invoices.acl"; + +export namespace InvoicesConfigs { + export const invoicesConfig = { + meta: { + title: "Invoices", + }, + readAll: { + acl: InvoicesAcl.canUseFindByOffice, + schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, + paginated: InvoicesQueries.useFindByOffice, + infinite: InvoicesQueries.useFindByOfficeInfinite, + filters: { + schema: CommonModels.OfficeInvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CommonModels.OfficeInvoiceFilterDtoSchema, + options: { + inputs: { + search: true, + issuingDate: true, + serviceDate: true, + invoiceDirection: true, + invoiceType: true, + collective: true, + amountMin: true, + amountMax: true, + currencyNotation: true, + vatRule: true, + dueDate: true, + status: true, + receiver: true, + receiverCountry: true, + salesRep: true, + positionNumbersString: true, + positionNumbers: true, + invoiceNumbersString: true, + invoiceNumbers: true, + bookkeepingExportStatus: true, + dunningBlock: true, + invoiceInReview: true, + isInvoiceOk: true, + isVatOk: true, + invoiceNumberMin: true, + invoiceNumberMax: true, + internalNumberMin: true, + internalNumberMax: true, + externalSystemId: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + creditorId: true, + debtorId: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, + options: { + columns: { + id: true, + createdAt: true, + invoiceNumber: true, + invoiceDirection: true, + issuingDate: true, + invoiceType: true, + collective: true, + serviceDate: true, + internalNumber: true, + reference: true, + amount: true, + netAmount: true, + tax: true, + currency: true, + dueDate: true, + status: true, + payDate: true, + paidAmount: true, + position: true, + receiver: true, + receiverCountry: true, + clerk: true, + cancelled: true, + ok: true, + isExportedToBookkeeping: true, + dunningBlock: true, + invoiceInReview: true, + vatOk: true, + comments: true, + paymentComment: true, + creditorId: true, + debtorId: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vatRules: true, + }, + sortable: InvoicesModels.FindByOfficeOrderParamEnumSchema, + }, + }), + }, + read: { + acl: InvoicesAcl.canUseGetDetail, + schema: InvoicesModels.InvoiceDetailDtoSchema, + query: InvoicesQueries.useGetDetail, + }, + create: { + acl: InvoicesAcl.canUseCreateDraft, + schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, + mutation: InvoicesQueries.useCreateDraft, + inputDefs: dynamicInputs({ + schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, + options: { + inputs: { + chargeItemIds: true, + invoiceType: true, + customerId: true, + direction: true, + }, + }, + }), + }, + update: { + acl: InvoicesAcl.canUseUpdate, + schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, + mutation: InvoicesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, + options: { + inputs: { + issuingDate: true, + receiptDate: true, + serviceDate: true, + serviceDateUntil: true, + dueDate: true, + invoiceNumber: true, + internalNumber: true, + paymentTermDays: true, + paymentTermType: true, + serviceRecipientId: true, + bankAccountId: true, + remarks: true, + language: true, + showPaymentInstructions: true, + customer: true, + salesRepId: true, + currencyNotation: true, + exchangeRate: true, + }, + }, + }), + }, + delete: { + acl: InvoicesAcl.canUseDeleteInvoice, + mutation: InvoicesQueries.useDeleteInvoice, + }, + }; + + export const uninvoicedChargesConfig = { + meta: { + title: "Uninvoiced Charges", + }, + readAll: { + acl: InvoicesAcl.canUseGetOfficeUnCharges, + schema: InvoicesModels.UninvoicedChargeDtoSchema, + paginated: InvoicesQueries.useGetOfficeUnCharges, + infinite: InvoicesQueries.useGetOfficeUnChargesInfinite, + filters: { + schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, + options: { + inputs: { + direction: true, + chargeItemId: true, + receiverIds: true, + positionIds: true, + chargeTypeIds: true, + serviceDate: true, + currencies: true, + vatRuleIds: true, + employeeIds: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InvoicesModels.UninvoicedChargeDtoSchema, + options: { + columns: { + chargeItemId: true, + invoiceDirection: true, + receiver: true, + position: true, + chargeType: true, + currencyNotation: true, + amount: true, + amountInOfficeCurrency: true, + officeCurrency: true, + exchangeRate: true, + vatRule: true, + serviceDate: true, + status: true, + missingInformation: true, + employee: true, + }, + sortable: InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema, + }, + }), + }, + }; + + export const positionsInvoicesConfig = { + meta: { + title: "Positions Invoices", + }, + readAll: { + acl: InvoicesAcl.canUseFind, + schema: InvoicesModels.InvoicePreviewDtoSchema, + paginated: InvoicesQueries.useFind, + infinite: InvoicesQueries.useFindInfinite, + filters: { + schema: InvoicesModels.InvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.InvoiceFilterDtoSchema, + options: { + inputs: { + status: true, + direction: true, + receiver: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InvoicesModels.InvoicePreviewDtoSchema, + options: { + columns: { + id: true, + invoiceDirection: true, + invoiceType: true, + invoiceNumber: true, + issuingDate: true, + amount: true, + currencyNotation: true, + status: true, + isExportedToBookkeeping: true, + internalNumber: true, + receiver: true, + representative: true, + collective: true, + creditNote: true, + cancelledInvoice: true, + }, + sortable: InvoicesModels.InvoicesFindOrderParamEnumSchema, + }, + }), + }, + }; + + export const positionsUninvoicedChargesConfig = { + meta: { + title: "Positions Uninvoiced Charges", + }, + readAll: { + acl: InvoicesAcl.canUseGetUnCharges, + schema: InvoicesModels.UninvoicedChargeDtoSchema, + paginated: InvoicesQueries.useGetUnCharges, + infinite: InvoicesQueries.useGetUnChargesInfinite, + filters: { + schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, + options: { + inputs: { + direction: true, + chargeItemId: true, + receiverId: true, + chargeTypeId: true, + serviceDate: true, + currency: true, + vatRuleId: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: InvoicesModels.UninvoicedChargeDtoSchema, + options: { + columns: { + chargeItemId: true, + invoiceDirection: true, + receiver: true, + position: true, + chargeType: true, + currencyNotation: true, + amount: true, + amountInOfficeCurrency: true, + officeCurrency: true, + exchangeRate: true, + vatRule: true, + serviceDate: true, + status: true, + missingInformation: true, + employee: true, + }, + sortable: InvoicesModels.GetUnChargesOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/invoices/invoices.models.ts b/test/generated/dist/invoices/invoices.models.ts new file mode 100644 index 0000000..6d1207e --- /dev/null +++ b/test/generated/dist/invoices/invoices.models.ts @@ -0,0 +1,1605 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicesModels { + /** + * InvoiceBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + */ + export const InvoiceBusinessPartnerResponseDtoSchema = z + .object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }) + .readonly(); + export type InvoiceBusinessPartnerResponseDto = z.infer; + + /** + * InvoiceEmployeeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const InvoiceEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type InvoiceEmployeeResponseDto = z.infer; + + /** + * InvoiceRelatedInvoiceResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } internalNumber + */ + export const InvoiceRelatedInvoiceResponseDtoSchema = z + .object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }) + .readonly(); + export type InvoiceRelatedInvoiceResponseDto = z.infer; + + /** + * InvoicePreviewDtoSchema + * @type { object } + * @property { string } id + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection + * @property { CommonModels.InvoiceTypeEnum } invoiceType + * @property { string } invoiceNumber + * @property { string } issuingDate + * @property { number } amount + * @property { string } currencyNotation + * @property { CommonModels.InvoiceStatusEnum } status + * @property { boolean } isExportedToBookkeeping + * @property { string } internalNumber + * @property { InvoiceBusinessPartnerResponseDto } receiver + * @property { InvoiceEmployeeResponseDto } representative + * @property { boolean } collective + * @property { InvoiceRelatedInvoiceResponseDto } creditNote + * @property { InvoiceRelatedInvoiceResponseDto } cancelledInvoice + */ + export const InvoicePreviewDtoSchema = z + .object({ + id: z.string(), + invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, + invoiceType: CommonModels.InvoiceTypeEnumSchema, + invoiceNumber: z.string().nullable(), + issuingDate: z.iso.datetime({ offset: true }).nullish(), + amount: z.number(), + currencyNotation: z.string(), + status: CommonModels.InvoiceStatusEnumSchema, + isExportedToBookkeeping: z.boolean(), + internalNumber: z.string().nullish(), + receiver: InvoiceBusinessPartnerResponseDtoSchema.nullish(), + representative: InvoiceEmployeeResponseDtoSchema.nullish(), + collective: z.boolean(), + creditNote: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), + cancelledInvoice: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), + }) + .readonly(); + export type InvoicePreviewDto = z.infer; + + /** + * InvoicePartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ + export const InvoicePartnerDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), + }) + .readonly(); + export type InvoicePartnerDto = z.infer; + + /** + * InvoicePositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } transportType + * @property { string } ourReference + * @property { string } finalDestination + * @property { InvoicePartnerDto } shipper + * @property { InvoicePartnerDto } consignee + * @property { string } vessel + * @property { string } emptyPickup + * @property { string } loadingAddress + * @property { string } portOfLoading + * @property { string } portOfDischarge + * @property { string } carrierBl + * @property { string } houseBillOfLadingNumber + * @property { string } masterAWB + * @property { string } hawbNumber + * @property { string } flightNo + * @property { string } pickupAddress + * @property { string } originAirport + * @property { string } destinationAirport + * @property { string } originLocation + * @property { string } destinationLocation + * @property { string } dateOfDeparture + * @property { string } dateOfArrival + */ + export const InvoicePositionDtoSchema = z + .object({ + id: z.string(), + number: z.string(), + transportType: z.string(), + ourReference: z.string().nullish(), + finalDestination: z.string().nullish(), + shipper: InvoicePartnerDtoSchema.nullish(), + consignee: InvoicePartnerDtoSchema.nullish(), + vessel: z.string().nullish(), + emptyPickup: z.string().nullish(), + loadingAddress: z.string().nullish(), + portOfLoading: z.string().nullish(), + portOfDischarge: z.string().nullish(), + carrierBl: z.string().nullish(), + houseBillOfLadingNumber: z.string().nullish(), + masterAWB: z.string().nullish(), + hawbNumber: z.string().nullish(), + flightNo: z.string().nullish(), + pickupAddress: z.string().nullish(), + originAirport: z.string().nullish(), + destinationAirport: z.string().nullish(), + originLocation: z.string().nullish(), + destinationLocation: z.string().nullish(), + dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), + dateOfArrival: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type InvoicePositionDto = z.infer; + + /** + * InvoiceChargeTypeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type InvoiceChargeTypeDto = z.infer; + + /** + * InvoiceVatRuleDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { number } rate + */ + export const InvoiceVatRuleDtoSchema = z + .object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }) + .readonly(); + export type InvoiceVatRuleDto = z.infer; + + /** + * InvoiceFinanceLineDtoSchema + * @type { object } + * @property { string } positionChargeItemId + * @property { InvoiceChargeTypeDto } chargeType + * @property { string } additionalText + * @property { number } quantity + * @property { number } netAmount + * @property { number } grossAmount + * @property { number } sumInInvoiceCurrency + * @property { number } sumInOfficeCurrency + * @property { string } currencyNotation + * @property { number } exchangeRate + * @property { InvoiceVatRuleDto } vatRule + * @property { number } exchangedNetAmount + * @property { string } positionNumber + * @property { string } positionId + * @property { string } outgoingInvoiceId + * @property { string } registeredInvoiceId + */ + export const InvoiceFinanceLineDtoSchema = z + .object({ + positionChargeItemId: z.string(), + chargeType: InvoiceChargeTypeDtoSchema, + additionalText: z.string(), + quantity: z.number(), + netAmount: z.number(), + grossAmount: z.number(), + sumInInvoiceCurrency: z.number().nullish(), + sumInOfficeCurrency: z.number().nullish(), + currencyNotation: z.string(), + exchangeRate: z.number().nullish(), + vatRule: InvoiceVatRuleDtoSchema, + exchangedNetAmount: z.number().nullish(), + positionNumber: z.string().nullish(), + positionId: z.string().nullish(), + outgoingInvoiceId: z.string().nullish(), + registeredInvoiceId: z.string().nullish(), + }) + .readonly(); + export type InvoiceFinanceLineDto = z.infer; + + /** + * InvoiceConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl + * @property { string } headerImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ + export const InvoiceConfigDtoSchema = z + .object({ + footerImageUrl: z.string().nullish(), + headerImageUrl: z.string().nullish(), + showWatermarkOnDocuments: z.boolean(), + locale: CommonModels.LocaleEnumSchema.nullish(), + }) + .readonly(); + export type InvoiceConfigDto = z.infer; + + /** + * InvoiceCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { string } address + * @property { string } vatNumber + * @property { string } reference + * @property { string } contact + * @property { string } partnerRegistrationNumber + */ + export const InvoiceCustomerDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string().nullish(), + label: z.string().nullish(), + address: z.string().nullish(), + vatNumber: z.string(), + reference: z.string().nullish(), + contact: z.string().nullish(), + partnerRegistrationNumber: z.string().nullish(), + }) + .readonly(); + export type InvoiceCustomerDto = z.infer; + + /** + * InvoiceOfficeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type InvoiceOfficeDto = z.infer; + + /** + * InvoiceSalesRepDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } phoneNumber + */ + export const InvoiceSalesRepDtoSchema = z + .object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }) + .readonly(); + export type InvoiceSalesRepDto = z.infer; + + /** + * InvoiceServiceRecipientDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } address + * @property { string } vatNumber + * @property { string } partnerRegistrationNumber + */ + export const InvoiceServiceRecipientDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + address: z.string().nullish(), + vatNumber: z.string(), + partnerRegistrationNumber: z.string().nullish(), + }) + .readonly(); + export type InvoiceServiceRecipientDto = z.infer; + + /** + * InvoiceBankAccountDtoSchema + * @type { object } + * @property { string } id + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + * @property { string } name + * @property { boolean } useFooterOnInvoice + * @property { object } footer + * @property { string } footer.mediaUrl + */ + export const InvoiceBankAccountDtoSchema = z + .object({ + id: z.string(), + displayValue: z.string(), + iban: z.string(), + bankName: z.string(), + swiftBic: z.string(), + name: z.string(), + useFooterOnInvoice: z.boolean(), + footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), + }) + .readonly(); + export type InvoiceBankAccountDto = z.infer; + + /** + * InvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ + export const InvoiceRemarksDtoSchema = z + .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) + .readonly(); + export type InvoiceRemarksDto = z.infer; + + /** + * InvoiceVatLineDtoSchema + * @type { object } + * @property { string } vatRuleId ID of the VAT rule + * @property { string } name Name of the VAT rule + * @property { string } printNumber Reference numerical string for vat rules + * @property { string } matchCode Match code of the VAT rule + * @property { number } vatPercentage The actual VAT rate (e.g., 19 for 19%) + * @property { number } netAmount Sum of net amounts from financeLines using this vatRuleId + * @property { number } vatAmount Calculated total VAT for this rate (netAmount * vatPercentage / 100) + * @property { number } grossAmount Sum of netAmount + vatAmount for this rate + * @property { number } vatAmountInOfficeCurrency + * @property { number } netAmountInOfficeCurrency + * @property { number } grossAmountInOfficeCurrency + */ + export const InvoiceVatLineDtoSchema = z + .object({ + vatRuleId: z.string().describe("ID of the VAT rule"), + name: z.string().describe("Name of the VAT rule"), + printNumber: z.string().describe("Reference numerical string for vat rules"), + matchCode: z.string().describe("Match code of the VAT rule"), + vatPercentage: z.number().describe("The actual VAT rate (e.g., 19 for 19%)"), + netAmount: z.number().describe("Sum of net amounts from financeLines using this vatRuleId"), + vatAmount: z.number().describe("Calculated total VAT for this rate (netAmount * vatPercentage / 100)"), + grossAmount: z.number().describe("Sum of netAmount + vatAmount for this rate"), + vatAmountInOfficeCurrency: z.number().nullish(), + netAmountInOfficeCurrency: z.number().nullish(), + grossAmountInOfficeCurrency: z.number().nullish(), + }) + .readonly(); + export type InvoiceVatLineDto = z.infer; + + /** + * RelatedInvoiceDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } internalNumber + */ + export const RelatedInvoiceDetailDtoSchema = z + .object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }) + .readonly(); + export type RelatedInvoiceDetailDto = z.infer; + + /** + * InvoiceLanguageEnumSchema + * @type { enum } + */ + export const InvoiceLanguageEnumSchema = z.enum(["en", "de", "sl", "hu", "cs"]); + export type InvoiceLanguageEnum = z.infer; + export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; + + /** + * InvoiceDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } rootFolderId + * @property { string } invoiceDirection + * @property { string } invoiceType + * @property { string } invoiceNumber + * @property { string } costCenter + * @property { string } status + * @property { string } language + * @property { boolean } isVatOk + * @property { boolean } isInvoiceOk + * @property { string } issuingDate + * @property { string } receiptDate + * @property { string } serviceDate + * @property { string } serviceDateUntil + * @property { string } dueDate + * @property { string } internalNumber + * @property { boolean } isExportedToBookkeeping + * @property { string } sentAt + * @property { string } creditNoteId + * @property { string } draftCreditNoteId + * @property { string } cancelledInvoiceId + * @property { string } uploadedDocumentUrl + * @property { InvoiceCustomerDto } customer + * @property { string } customerNumber + * @property { string } customerNameOverride + * @property { string } customerReferenceOverride + * @property { string } customerContactOverride + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { InvoicePositionDto } position + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { InvoiceOfficeDto } salesOffice + * @property { InvoiceSalesRepDto } salesRep + * @property { number } totalNet + * @property { number } totalVat + * @property { number } totalGross + * @property { string } currencyNotation + * @property { number } exchangeRate + * @property { number } paymentTermDays + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { InvoiceServiceRecipientDto } serviceRecipient + * @property { boolean } showPaymentInstructions + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { string } comments + * @property { InvoiceBankAccountDto } bankAccount + * @property { InvoiceFinanceLineDto[] } financeLines + * @property { InvoiceRemarksDto } remarks + * @property { InvoiceVatLineDto[] } vatLines + * @property { InvoiceConfigDto } config + * @property { RelatedInvoiceDetailDto } creditNote + * @property { RelatedInvoiceDetailDto } draftCreditNote + * @property { RelatedInvoiceDetailDto } cancelledInvoice + * @property { string } officeCurrencyNotation + * @property { string } inverseCurrencyNotation + * @property { number } inverseExchangeRate + * @property { boolean } requiresSpecialTablePresentation + * @property { number } paidAmount + * @property { number } outstandingAmount + * @property { string } paidOn + * @property { boolean } isIssued + * @property { number } grossAmountInOfficeCurrency + * @property { string } createdAt + */ + export const InvoiceDetailDtoSchema = z + .object({ + id: z.string(), + rootFolderId: z.string().nullish(), + invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, + invoiceType: CommonModels.InvoiceTypeEnumSchema, + invoiceNumber: z.string().nullish(), + costCenter: z.string().nullish(), + status: CommonModels.InvoiceStatusEnumSchema, + language: InvoiceLanguageEnumSchema, + isVatOk: z.boolean(), + isInvoiceOk: z.boolean(), + issuingDate: z.iso.datetime({ offset: true }).nullish(), + receiptDate: z.iso.datetime({ offset: true }).nullish(), + serviceDate: z.iso.datetime({ offset: true }).nullish(), + serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), + dueDate: z.iso.datetime({ offset: true }).nullish(), + internalNumber: z.string().nullish(), + isExportedToBookkeeping: z.boolean(), + sentAt: z.iso.datetime({ offset: true }).nullish(), + creditNoteId: z.string().nullish(), + draftCreditNoteId: z.string().nullish(), + cancelledInvoiceId: z.string().nullish(), + uploadedDocumentUrl: z.string().nullish(), + customer: InvoiceCustomerDtoSchema.nullish(), + customerNumber: z.string().nullish(), + customerNameOverride: z.string().nullish(), + customerReferenceOverride: z.string().nullish(), + customerContactOverride: z.string().nullish(), + showInvoiceVatLinesInOfficeCurrency: z.boolean(), + position: InvoicePositionDtoSchema.nullish(), + serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), + salesOffice: InvoiceOfficeDtoSchema, + salesRep: InvoiceSalesRepDtoSchema, + totalNet: z.number(), + totalVat: z.number().nullish(), + totalGross: z.number(), + currencyNotation: z.string(), + exchangeRate: z.number().nullish(), + paymentTermDays: z.number().nullish(), + paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), + serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), + showPaymentInstructions: z.boolean().nullish(), + dunningBlock: z.boolean().nullish(), + invoiceInReview: z.boolean().nullish(), + comments: z.string().nullish(), + bankAccount: InvoiceBankAccountDtoSchema.nullish(), + financeLines: z.array(InvoiceFinanceLineDtoSchema).readonly(), + remarks: InvoiceRemarksDtoSchema.nullish(), + vatLines: z.array(InvoiceVatLineDtoSchema).readonly(), + config: InvoiceConfigDtoSchema.nullish(), + creditNote: RelatedInvoiceDetailDtoSchema.nullish(), + draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), + cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), + officeCurrencyNotation: z.string().nullish(), + inverseCurrencyNotation: z.string().nullish(), + inverseExchangeRate: z.number().nullish(), + requiresSpecialTablePresentation: z.boolean().nullish(), + paidAmount: z.number(), + outstandingAmount: z.number(), + paidOn: z.iso.datetime({ offset: true }).nullish(), + isIssued: z.boolean(), + grossAmountInOfficeCurrency: z.number().nullish(), + createdAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type InvoiceDetailDto = z.infer; + + /** + * TotalAmountsDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ + export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); + export type TotalAmountsDto = z.infer; + + /** + * OfficeInvoiceListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalAmountInDefaultCurrency + * @property { string } defaultCurrencyNotation + * @property { TotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ + export const OfficeInvoiceListResponseDtoSchema = z + .object({ + items: z.array(z.string()).readonly().describe("Items"), + totalAmountInDefaultCurrency: z.number().nullish(), + defaultCurrencyNotation: z.string().nullish(), + totalAmounts: z.array(TotalAmountsDtoSchema).readonly(), + page: z.number().describe("1-indexed page number to begin from").nullish(), + cursor: z.string().describe("ID of item to start after").nullish(), + nextCursor: z.string().describe("Cursor for next set of items").nullish(), + limit: z.number().describe("Items per response"), + totalItems: z.number().describe("Total available items"), + }) + .readonly(); + export type OfficeInvoiceListResponseDto = z.infer; + + /** + * InvoicePreviewPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } externalSystemId + */ + export const InvoicePreviewPositionDtoSchema = z + .object({ id: z.string(), number: z.string(), externalSystemId: z.string().nullish() }) + .readonly(); + export type InvoicePreviewPositionDto = z.infer; + + /** + * InvoicePreviewReceiverDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + */ + export const InvoicePreviewReceiverDtoSchema = z + .object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }) + .readonly(); + export type InvoicePreviewReceiverDto = z.infer; + + /** + * InvoicePreviewReceiverCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const InvoicePreviewReceiverCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type InvoicePreviewReceiverCountryDto = z.infer; + + /** + * InvoicePreviewClerkDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const InvoicePreviewClerkDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type InvoicePreviewClerkDto = z.infer; + + /** + * VatRuleLabelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } matchCode + * @property { string } name + */ + export const VatRuleLabelResponseDtoSchema = z + .object({ id: z.string(), matchCode: z.string(), name: z.string() }) + .readonly(); + export type VatRuleLabelResponseDto = z.infer; + + /** + * OfficeInvoicePreviewDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } invoiceNumber + * @property { string } invoiceDirection + * @property { string } issuingDate + * @property { CommonModels.InvoiceTypeEnum } invoiceType + * @property { boolean } collective + * @property { string } serviceDate + * @property { string } internalNumber + * @property { string } reference + * @property { number } amount + * @property { number } netAmount + * @property { number } tax + * @property { string } currency + * @property { string } dueDate + * @property { CommonModels.InvoiceStatusEnum } status + * @property { string } payDate + * @property { number } paidAmount + * @property { InvoicePreviewPositionDto } position + * @property { InvoicePreviewReceiverDto } receiver + * @property { InvoicePreviewReceiverCountryDto } receiverCountry + * @property { InvoicePreviewClerkDto } clerk + * @property { boolean } cancelled + * @property { boolean } ok + * @property { boolean } isExportedToBookkeeping + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { boolean } vatOk + * @property { string } comments + * @property { string } paymentComment + * @property { string } creditorId + * @property { string } debtorId + * @property { string } hblNumber + * @property { string } mblNumber + * @property { string } bookingNumber + * @property { string } vessel + * @property { string } voyage + * @property { VatRuleLabelResponseDto[] } vatRules + */ + export const OfficeInvoicePreviewDtoSchema = z + .object({ + id: z.string(), + createdAt: z.iso.datetime({ offset: true }), + invoiceNumber: z.string().nullish(), + invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, + issuingDate: z.iso.datetime({ offset: true }).nullish(), + invoiceType: CommonModels.InvoiceTypeEnumSchema, + collective: z.boolean(), + serviceDate: z.iso.datetime({ offset: true }).nullish(), + internalNumber: z.string().nullish(), + reference: z.string().nullish(), + amount: z.number(), + netAmount: z.number(), + tax: z.number(), + currency: z.string(), + dueDate: z.iso.datetime({ offset: true }).nullish(), + status: CommonModels.InvoiceStatusEnumSchema, + payDate: z.iso.datetime({ offset: true }).nullish(), + paidAmount: z.number().nullish(), + position: InvoicePreviewPositionDtoSchema.nullish(), + receiver: InvoicePreviewReceiverDtoSchema.nullish(), + receiverCountry: InvoicePreviewReceiverCountryDtoSchema.nullish(), + clerk: InvoicePreviewClerkDtoSchema.nullish(), + cancelled: z.boolean(), + ok: z.boolean(), + isExportedToBookkeeping: z.boolean(), + dunningBlock: z.boolean(), + invoiceInReview: z.boolean(), + vatOk: z.boolean(), + comments: z.string().nullish(), + paymentComment: z.string().nullish(), + creditorId: z.string().nullish(), + debtorId: z.string().nullish(), + hblNumber: z.string().nullish(), + mblNumber: z.string().nullish(), + bookingNumber: z.string().nullish(), + vessel: z.string().nullish(), + voyage: z.string().nullish(), + vatRules: z.array(VatRuleLabelResponseDtoSchema).readonly().nullish(), + }) + .readonly(); + export type OfficeInvoicePreviewDto = z.infer; + + /** + * InvoiceExportFilterDtoSchema + * @type { object } + * @property { string } search + * @property { CommonModels.DateRangeDto } issuingDate + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection + * @property { CommonModels.InvoiceTypeEnum[] } invoiceType + * @property { CommonModels.BooleanFilterEnum[] } collective + * @property { number } amountMin + * @property { number } amountMax + * @property { string[] } currencyNotation + * @property { CommonModels.DateRangeDto } dueDate + * @property { CommonModels.InvoiceStatusEnum[] } status + * @property { string[] } receiver Filter by invoice receiver/customer ID (UUID) + * @property { string } positionNumbersString + * @property { string[] } positionNumbers + * @property { string } invoiceNumbersString + * @property { string[] } invoiceNumbers + * @property { CommonModels.BooleanFilterEnum[] } bookkeepingExportStatus + * @property { CommonModels.BooleanFilterEnum[] } dunningBlock + * @property { CommonModels.BooleanFilterEnum[] } invoiceInReview + * @property { CommonModels.BooleanFilterEnum[] } isInvoiceOk + * @property { CommonModels.BooleanFilterEnum[] } isVatOk + * @property { number } invoiceNumberMin + * @property { number } invoiceNumberMax + * @property { number } internalNumberMin + * @property { number } internalNumberMax + */ + export const InvoiceExportFilterDtoSchema = z + .object({ + search: z.string(), + issuingDate: CommonModels.DateRangeDtoSchema, + serviceDate: CommonModels.DateRangeDtoSchema, + invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), + invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), + collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + amountMin: z.number(), + amountMax: z.number(), + currencyNotation: z.array(z.string()).readonly(), + dueDate: CommonModels.DateRangeDtoSchema, + status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), + receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer ID (UUID)"), + positionNumbersString: z.string(), + positionNumbers: z.array(z.string()).readonly(), + invoiceNumbersString: z.string(), + invoiceNumbers: z.array(z.string()).readonly(), + bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + invoiceNumberMin: z.number(), + invoiceNumberMax: z.number(), + internalNumberMin: z.number(), + internalNumberMax: z.number(), + }) + .readonly(); + export type InvoiceExportFilterDto = z.infer; + + /** + * InvoiceExportColumnSchema + * @type { enum } + */ + export const InvoiceExportColumnSchema = z.enum([ + "invoiceNumber", + "invoiceDirection", + "issuingDate", + "invoiceType", + "collective", + "serviceDate", + "internalNumber", + "reference", + "totalGross", + "totalNet", + "totalVat", + "currency", + "dueDate", + "status", + "payDate", + "paidAmount", + "positionNumber", + "hblHawb", + "mblMawb", + "bookingNumber", + "vessel", + "voyage", + "receiverName", + "receiverCountry", + "clerkName", + "cancelled", + "ok", + "vatOk", + "dunningBlock", + "invoiceInReview", + "exportedToBookkeeping", + "comments", + "paymentComment", + "vatRuleIds", + "creditorId", + "debtorId", + "createdAt", + ]); + export type InvoiceExportColumn = z.infer; + export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; + + /** + * InvoiceExportRequestDtoSchema + * @type { object } + * @property { InvoiceExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { InvoiceExportFilterDto } filter + */ + export const InvoiceExportRequestDtoSchema = z + .object({ + columns: z.array(InvoiceExportColumnSchema).readonly().min(1), + order: z.array(z.string()).readonly(), + filter: InvoiceExportFilterDtoSchema, + }) + .readonly(); + export type InvoiceExportRequestDto = z.infer; + + /** + * UninvoicedChargeTotalAmountDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ + export const UninvoicedChargeTotalAmountDtoSchema = z + .object({ amount: z.number(), currencyNotation: z.string() }) + .readonly(); + export type UninvoicedChargeTotalAmountDto = z.infer; + + /** + * UninvoicedChargeListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ + export const UninvoicedChargeListResponseDtoSchema = z + .object({ + items: z.array(z.string()).readonly().describe("Items"), + totalAmounts: z.array(UninvoicedChargeTotalAmountDtoSchema).readonly(), + page: z.number().describe("1-indexed page number to begin from").nullish(), + cursor: z.string().describe("ID of item to start after").nullish(), + nextCursor: z.string().describe("Cursor for next set of items").nullish(), + limit: z.number().describe("Items per response"), + totalItems: z.number().describe("Total available items"), + }) + .readonly(); + export type UninvoicedChargeListResponseDto = z.infer; + + /** + * ReceiverDtoSchema + * @type { object } + * @property { string } id Business Partner ID (Customer or Vendor) + * @property { string } name Business Partner name + * @property { string } matchCode Business Partner match code + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ + export const ReceiverDtoSchema = z + .object({ + id: z.string().describe("Business Partner ID (Customer or Vendor)"), + name: z.string().describe("Business Partner name"), + matchCode: z.string().describe("Business Partner match code"), + label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), + }) + .readonly(); + export type ReceiverDto = z.infer; + + /** + * UninvoicedChargePositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ + export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); + export type UninvoicedChargePositionDto = z.infer; + + /** + * UninvoicedChargeChargeTypeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const UninvoicedChargeChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type UninvoicedChargeChargeTypeDto = z.infer; + + /** + * UninvoicedChargeVatRuleDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchcode + */ + export const UninvoicedChargeVatRuleDtoSchema = z + .object({ id: z.string(), name: z.string(), matchcode: z.string() }) + .readonly(); + export type UninvoicedChargeVatRuleDto = z.infer; + + /** + * UninvoicedChargeGroupStatusEnumSchema + * @type { enum } + */ + export const UninvoicedChargeGroupStatusEnumSchema = z.enum(["ReadyForInvoice", "MissingInformation"]); + export type UninvoicedChargeGroupStatusEnum = z.infer; + export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSchema.enum; + + /** + * UninvoicedChargeEmployeeDtoSchema + * @type { object } + * @property { string } id + * @property { string } firstName + * @property { string } lastName + * @property { string } fullName + */ + export const UninvoicedChargeEmployeeDtoSchema = z + .object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }) + .readonly(); + export type UninvoicedChargeEmployeeDto = z.infer; + + /** + * UninvoicedChargeDtoSchema + * @type { object } + * @property { string } chargeItemId + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection Invoice direction (Incoming or Outgoing) + * @property { ReceiverDto } receiver Business Partner receiving the invoice + * @property { UninvoicedChargePositionDto } position + * @property { UninvoicedChargeChargeTypeDto } chargeType + * @property { string } currencyNotation ISO 4217 currency code + * @property { number } amount Charge amount in charge currency + * @property { number } amountInOfficeCurrency Charge amount in office currency + * @property { string } officeCurrency Office currency code + * @property { number } exchangeRate + * @property { UninvoicedChargeVatRuleDto } vatRule + * @property { string } serviceDate + * @property { UninvoicedChargeGroupStatusEnum } status Status of charge group + * @property { string[] } missingInformation Missing fields required for invoicing this charge + * @property { UninvoicedChargeEmployeeDto } employee + */ + export const UninvoicedChargeDtoSchema = z + .object({ + chargeItemId: z.string(), + invoiceDirection: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction (Incoming or Outgoing)"), + receiver: ReceiverDtoSchema.describe("Business Partner receiving the invoice"), + position: UninvoicedChargePositionDtoSchema, + chargeType: UninvoicedChargeChargeTypeDtoSchema.nullish(), + currencyNotation: z.string().describe("ISO 4217 currency code"), + amount: z.number().describe("Charge amount in charge currency"), + amountInOfficeCurrency: z.number().describe("Charge amount in office currency"), + officeCurrency: z.string().describe("Office currency code"), + exchangeRate: z.number().nullish(), + vatRule: UninvoicedChargeVatRuleDtoSchema.nullish(), + serviceDate: z.iso.datetime({ offset: true }).nullish(), + status: UninvoicedChargeGroupStatusEnumSchema.describe("Status of charge group"), + missingInformation: z + .array(z.string()) + .readonly() + .describe("Missing fields required for invoicing this charge") + .nullish(), + employee: UninvoicedChargeEmployeeDtoSchema.nullish(), + }) + .readonly(); + export type UninvoicedChargeDto = z.infer; + + /** + * UninvoicedChargePaginationDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string } receiverId + * @property { string } chargeTypeId + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currency + * @property { string } vatRuleId + */ + export const UninvoicedChargePaginationDtoSchema = z + .object({ + direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), + chargeItemId: z.string(), + receiverId: z.string(), + chargeTypeId: z.string(), + serviceDate: CommonModels.DateRangeDtoSchema, + currency: z.array(z.string()).readonly(), + vatRuleId: z.string(), + }) + .readonly(); + export type UninvoicedChargePaginationDto = z.infer; + + /** + * UninvoicedChargesFilterDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string[] } receiverIds + * @property { string[] } positionIds + * @property { string[] } chargeTypeIds + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currencies + * @property { string[] } vatRuleIds + * @property { string[] } employeeIds + */ + export const UninvoicedChargesFilterDtoSchema = z + .object({ + direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), + chargeItemId: z.string(), + receiverIds: z.array(z.string()).readonly(), + positionIds: z.array(z.string()).readonly(), + chargeTypeIds: z.array(z.string()).readonly(), + serviceDate: CommonModels.DateRangeDtoSchema, + currencies: z.array(z.string()).readonly(), + vatRuleIds: z.array(z.string()).readonly(), + employeeIds: z.array(z.string()).readonly(), + }) + .readonly(); + export type UninvoicedChargesFilterDto = z.infer; + + /** + * UninvoicedChargesExportFilterDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string[] } receiverIds + * @property { string[] } positionIds + * @property { string[] } chargeTypeIds + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currencies + * @property { string[] } vatRuleIds + */ + export const UninvoicedChargesExportFilterDtoSchema = z + .object({ + direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), + chargeItemId: z.string(), + receiverIds: z.array(z.string()).readonly(), + positionIds: z.array(z.string()).readonly(), + chargeTypeIds: z.array(z.string()).readonly(), + serviceDate: CommonModels.DateRangeDtoSchema, + currencies: z.array(z.string()).readonly(), + vatRuleIds: z.array(z.string()).readonly(), + }) + .readonly(); + export type UninvoicedChargesExportFilterDto = z.infer; + + /** + * UninvoicedChargeExportColumnSchema + * @type { enum } + */ + export const UninvoicedChargeExportColumnSchema = z.enum([ + "chargeItemId", + "invoiceDirection", + "status", + "receiverName", + "positionNumber", + "serviceDate", + "employee", + "chargeTypeName", + "amount", + "currency", + "exchangeRate", + "amountInOfficeCurrency", + "officeCurrency", + "vatRule", + ]); + export type UninvoicedChargeExportColumn = z.infer; + export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.enum; + + /** + * UninvoicedChargesExportRequestDtoSchema + * @type { object } + * @property { UninvoicedChargeExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { UninvoicedChargesExportFilterDto } filter + */ + export const UninvoicedChargesExportRequestDtoSchema = z + .object({ + columns: z.array(UninvoicedChargeExportColumnSchema).readonly().min(1), + order: z.array(z.string()).readonly(), + filter: UninvoicedChargesExportFilterDtoSchema, + }) + .readonly(); + export type UninvoicedChargesExportRequestDto = z.infer; + + /** + * CreateDraftInvoiceRequestDtoSchema + * @type { object } + * @property { string[] } chargeItemIds Charge item IDs to include in the invoice. Min Items: `1` + * @property { CommonModels.InvoiceTypeEnum } invoiceType Type of invoice + * @property { string } customerId Customer ID (required for outgoing invoices) + * @property { CommonModels.InvoiceDirectionEnum } direction Invoice direction + */ + export const CreateDraftInvoiceRequestDtoSchema = z + .object({ + chargeItemIds: z + .array(z.string()) + .readonly() + .min(1) + .describe("Charge item IDs to include in the invoice") + .nullish(), + invoiceType: CommonModels.InvoiceTypeEnumSchema.describe("Type of invoice"), + customerId: z.string().describe("Customer ID (required for outgoing invoices)"), + direction: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction"), + }) + .readonly(); + export type CreateDraftInvoiceRequestDto = z.infer; + + /** + * UpdateInvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ + export const UpdateInvoiceRemarksDtoSchema = z + .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) + .readonly(); + export type UpdateInvoiceRemarksDto = z.infer; + + /** + * UpdateInvoiceCustomerDtoSchema + * @type { object } + * @property { string } name + * @property { string } reference + * @property { string } contact + */ + export const UpdateInvoiceCustomerDtoSchema = z + .object({ name: z.string(), reference: z.string(), contact: z.string() }) + .readonly(); + export type UpdateInvoiceCustomerDto = z.infer; + + /** + * UpdateInvoiceRequestDtoSchema + * @type { object } + * @property { string } issuingDate Invoice date in ISO format + * @property { string } receiptDate Receipt date in ISO format + * @property { string } serviceDate Service date in ISO format + * @property { string } serviceDateUntil Service end date in ISO format + * @property { string } dueDate Due date in ISO format + * @property { string } invoiceNumber Invoice number + * @property { string } internalNumber Internal reference number + * @property { number } paymentTermDays Payment term in days + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { string } serviceRecipientId Service recipient ID + * @property { string } bankAccountId Bank account ID + * @property { UpdateInvoiceRemarksDto } remarks Additional remarks + * @property { InvoiceLanguageEnum } language Invoice language + * @property { boolean } showPaymentInstructions + * @property { UpdateInvoiceCustomerDto } customer + * @property { string } salesRepId + * @property { string } currencyNotation + * @property { number } exchangeRate Invoice exchange rate + */ + export const UpdateInvoiceRequestDtoSchema = z + .object({ + issuingDate: z.iso.datetime({ offset: true }).describe("Invoice date in ISO format"), + receiptDate: z.iso.datetime({ offset: true }).describe("Receipt date in ISO format"), + serviceDate: z.iso.datetime({ offset: true }).describe("Service date in ISO format"), + serviceDateUntil: z.iso.datetime({ offset: true }).describe("Service end date in ISO format"), + dueDate: z.iso.datetime({ offset: true }).describe("Due date in ISO format").nullable(), + invoiceNumber: z.string().describe("Invoice number").nullable(), + internalNumber: z.string().describe("Internal reference number").nullable(), + paymentTermDays: z.number().describe("Payment term in days").nullable(), + paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, + serviceRecipientId: z.string().describe("Service recipient ID").nullable(), + bankAccountId: z.string().describe("Bank account ID").nullable(), + remarks: UpdateInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), + language: InvoiceLanguageEnumSchema.describe("Invoice language"), + showPaymentInstructions: z.boolean(), + customer: UpdateInvoiceCustomerDtoSchema, + salesRepId: z.string(), + currencyNotation: z.string(), + exchangeRate: z.number().describe("Invoice exchange rate").nullable(), + }) + .readonly(); + export type UpdateInvoiceRequestDto = z.infer; + + /** + * FixInvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ + export const FixInvoiceRemarksDtoSchema = z + .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) + .readonly(); + export type FixInvoiceRemarksDto = z.infer; + + /** + * FixInvoiceCustomerDtoSchema + * @type { object } + * @property { string } reference Customer reference number + */ + export const FixInvoiceCustomerDtoSchema = z + .object({ reference: z.string().describe("Customer reference number") }) + .readonly(); + export type FixInvoiceCustomerDto = z.infer; + + /** + * FixInvoiceRequestDtoSchema + * @type { object } + * @property { string } currencyNotation Invoice currency (incoming invoices only) + * @property { string } issuingDate Update invoice date in ISO format + * @property { string } dueDate Update invoice due date in ISO format + * @property { number } exchangeRate Invoice exchange rate + * @property { number } paymentTermDays Payment term in days + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { string } receiptDate Update receipt date in ISO format + * @property { string } serviceDate Update service date in ISO format + * @property { string } serviceDateUntil Update service end date in ISO format + * @property { boolean } isVatOk Mark VAT as checked/OK by accounting + * @property { boolean } isInvoiceOk Mark overall invoice as checked/OK by accounting + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { string } comments + * @property { FixInvoiceRemarksDto } remarks Additional remarks + * @property { string } invoiceNumber Invoice number (incoming invoices only) + * @property { string } bankAccountId Bank account ID + * @property { string } serviceRecipientId Service recipient ID + * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) + */ + export const FixInvoiceRequestDtoSchema = z + .object({ + currencyNotation: z.string().describe("Invoice currency (incoming invoices only)"), + issuingDate: z.iso.datetime({ offset: true }).describe("Update invoice date in ISO format"), + dueDate: z.iso.datetime({ offset: true }).describe("Update invoice due date in ISO format"), + exchangeRate: z.number().describe("Invoice exchange rate").nullable(), + paymentTermDays: z.number().describe("Payment term in days").nullable(), + paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, + receiptDate: z.iso.datetime({ offset: true }).describe("Update receipt date in ISO format"), + serviceDate: z.iso.datetime({ offset: true }).describe("Update service date in ISO format").nullable(), + serviceDateUntil: z.iso.datetime({ offset: true }).describe("Update service end date in ISO format"), + isVatOk: z.boolean().describe("Mark VAT as checked/OK by accounting"), + isInvoiceOk: z.boolean().describe("Mark overall invoice as checked/OK by accounting"), + dunningBlock: z.boolean(), + invoiceInReview: z.boolean(), + comments: z.string(), + remarks: FixInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), + invoiceNumber: z.string().describe("Invoice number (incoming invoices only)").nullable(), + bankAccountId: z.string().describe("Bank account ID").nullable(), + serviceRecipientId: z.string().describe("Service recipient ID").nullable(), + customer: FixInvoiceCustomerDtoSchema.describe("Customer reference (incoming invoices only)"), + }) + .readonly(); + export type FixInvoiceRequestDto = z.infer; + + /** + * UpdateIssuedInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity. Minimum: `0` + * @property { number } amount Amount (must be positive). Minimum: `0.01` + * @property { string } vatRuleId VAT rule ID + * @property { number } exchangeRate Charge exchange rate (incoming invoices only) + * @property { string } currencyNotation + */ + export const UpdateIssuedInvoiceChargeRequestDtoSchema = z + .object({ + positionChargeItemId: z.string().describe("Position charge item ID"), + chargeTypeId: z.string().describe("Charge type ID").nullish(), + additionalText: z.string().describe("Additional text for the charge").nullish(), + quantity: z.number().gte(0).describe("Quantity").nullish(), + amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), + vatRuleId: z.string().describe("VAT rule ID").nullish(), + exchangeRate: z.number().describe("Charge exchange rate (incoming invoices only)").nullish(), + currencyNotation: z.string().nullish(), + }) + .readonly(); + export type UpdateIssuedInvoiceChargeRequestDto = z.infer; + + /** + * UpdateIssuedInvoiceChargesRequestDtoSchema + * @type { object } + * @property { UpdateIssuedInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` + */ + export const UpdateIssuedInvoiceChargesRequestDtoSchema = z + .object({ + charges: z.array(UpdateIssuedInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates"), + }) + .readonly(); + export type UpdateIssuedInvoiceChargesRequestDto = z.infer; + + /** + * UpdateInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity. Minimum: `0` + * @property { number } amount Amount (must be positive). Minimum: `0.01` + * @property { string } vatRuleId VAT rule ID + * @property { number } exchangeRate + * @property { string } currencyNotation + */ + export const UpdateInvoiceChargeRequestDtoSchema = z + .object({ + positionChargeItemId: z.string().describe("Position charge item ID"), + chargeTypeId: z.string().describe("Charge type ID").nullish(), + additionalText: z.string().describe("Additional text for the charge").nullish(), + quantity: z.number().gte(0).describe("Quantity").nullish(), + amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), + vatRuleId: z.string().describe("VAT rule ID").nullish(), + exchangeRate: z.number().nullish(), + currencyNotation: z.string().nullish(), + }) + .readonly(); + export type UpdateInvoiceChargeRequestDto = z.infer; + + /** + * UpdateInvoiceChargesRequestDtoSchema + * @type { object } + * @property { UpdateInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` + */ + export const UpdateInvoiceChargesRequestDtoSchema = z + .object({ + charges: z.array(UpdateInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates"), + }) + .readonly(); + export type UpdateInvoiceChargesRequestDto = z.infer; + + /** + * InvoiceFilterDtoSchema + * @type { object } + * @property { string[] } status + * @property { string } direction + * @property { string } receiver Filter by invoice receiver/customer ID (UUID) + */ + export const InvoiceFilterDtoSchema = z + .object({ + status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), + direction: CommonModels.InvoiceDirectionEnumSchema, + receiver: z.string().describe("Filter by invoice receiver/customer ID (UUID)"), + }) + .readonly(); + export type InvoiceFilterDto = z.infer; + + /** + * ChangeInvoiceCustomerRequestDtoSchema + * @type { object } + * @property { string } newCustomerId + */ + export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }).readonly(); + export type ChangeInvoiceCustomerRequestDto = z.infer; + + /** + * CreateDirectInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ + export const CreateDirectInvoiceChargeRequestDtoSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID"), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().describe("Quantity of the charge"), + buyRate: z.number().describe("Buy rate amount"), + buyCurrencyCode: z.string().describe("Buy rate currency code"), + buyVatRuleId: z.string().describe("Buy VAT rule ID"), + vendorId: z.string().describe("Vendor ID"), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), + sellRate: z.number().describe("Sell rate amount"), + sellCurrencyCode: z.string().describe("Sell rate currency code"), + sellVatRuleId: z.string().describe("Sell VAT rule ID"), + customerId: z.string().describe("Customer ID"), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), + }) + .readonly(); + export type CreateDirectInvoiceChargeRequestDto = z.infer; + + /** + * UpdateIssuedInvoiceVatRulesRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } vatRuleId VAT rule ID + */ + export const UpdateIssuedInvoiceVatRulesRequestDtoSchema = z + .object({ + positionChargeItemId: z.string().describe("Position charge item ID"), + vatRuleId: z.string().describe("VAT rule ID"), + }) + .readonly(); + export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; + + /** + * PrepareUploadRequestDtoSchema + * @type { object } + * @property { string } filename + * @property { string } mimeType + * @property { number } fileSize + */ + export const PrepareUploadRequestDtoSchema = z + .object({ filename: z.string().nullish(), mimeType: z.string(), fileSize: z.number() }) + .readonly(); + export type PrepareUploadRequestDto = z.infer; + + /** + * InvoiceUploadInstructionsDtoSchema + * @type { object } + * @property { string } url Pre-signed URL for the PUT request to storage + * @property { string } method HTTP method to use for upload + */ + export const InvoiceUploadInstructionsDtoSchema = z + .object({ + url: z.string().describe("Pre-signed URL for the PUT request to storage"), + method: z.string().describe("HTTP method to use for upload"), + }) + .readonly(); + export type InvoiceUploadInstructionsDto = z.infer; + + /** + * GetInvoicesEmlInvoiceIdsParamSchema + * @type { array } + * @description Invoice IDs + */ + export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).readonly().describe("Invoice IDs").nullish(); + export type GetInvoicesEmlInvoiceIdsParam = z.infer; + + /** + * InvoicesFindOrderParamEnumSchema + * @type { enum } + */ + export const InvoicesFindOrderParamEnumSchema = z.enum(["status", "createdAt", "serviceDate"]); + export type InvoicesFindOrderParamEnum = z.infer; + export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; + + /** + * InvoicesFindResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { InvoicePreviewDto[] } items + */ + export const InvoicesFindResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(InvoicePreviewDtoSchema).readonly() }).readonly().shape, + }); + export type InvoicesFindResponse = z.infer; + + /** + * FindByOfficeOrderParamEnumSchema + * @type { enum } + */ + export const FindByOfficeOrderParamEnumSchema = z.enum([ + "invoiceNumber", + "issuingDate", + "invoiceType", + "amount", + "netAmount", + "currencyNotation", + "dueDate", + "status", + "paidOn", + "serviceDate", + "internalNumber", + "positionNumber", + "invoiceDirection", + "receiver", + "receiverCountry", + "paidAmount", + "totalVat", + "dunningBlock", + "invoiceInReview", + "isInvoiceOk", + "isVatOk", + "comments", + "salesRepName", + "isExportedToBookkeeping", + "createdAt", + "customerReferenceOverride", + "externalSystemId", + ]); + export type FindByOfficeOrderParamEnum = z.infer; + export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; + + /** + * FindByOfficeResponseSchema + * @type { object } + * @property { number } totalAmountInDefaultCurrency + * @property { string } defaultCurrencyNotation + * @property { TotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficeInvoicePreviewDto[] } items + */ + export const FindByOfficeResponseSchema = z.object({ + ...OfficeInvoiceListResponseDtoSchema.shape, + ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).readonly() }).readonly().shape, + }); + export type FindByOfficeResponse = z.infer; + + /** + * GetUnChargesOrderParamEnumSchema + * @type { enum } + */ + export const GetUnChargesOrderParamEnumSchema = z.enum([ + "chargeItemId", + "orderPosition", + "serviceDate", + "receiverId", + "positionNumber", + "chargeTypeId", + "currency", + "vatRuleId", + ]); + export type GetUnChargesOrderParamEnum = z.infer; + export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; + + /** + * GetUnChargesResponseSchema + * @type { object } + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { UninvoicedChargeDto[] } items + */ + export const GetUnChargesResponseSchema = z.object({ + ...UninvoicedChargeListResponseDtoSchema.shape, + ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape, + }); + export type GetUnChargesResponse = z.infer; + + /** + * InvoicesListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ + export const InvoicesListAvailablePartnersForResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type InvoicesListAvailablePartnersForResponse = z.infer; + + /** + * GetOfficeUnChargesOrderParamEnumSchema + * @type { enum } + */ + export const GetOfficeUnChargesOrderParamEnumSchema = z.enum([ + "chargeItemId", + "orderPosition", + "serviceDate", + "receiverId", + "positionNumber", + "chargeTypeId", + "currency", + "vatRuleId", + ]); + export type GetOfficeUnChargesOrderParamEnum = z.infer; + export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnumSchema.enum; + + /** + * GetOfficeUnChargesResponseSchema + * @type { object } + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { UninvoicedChargeDto[] } items + */ + export const GetOfficeUnChargesResponseSchema = z.object({ + ...UninvoicedChargeListResponseDtoSchema.shape, + ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape, + }); + export type GetOfficeUnChargesResponse = z.infer; +} diff --git a/test/generated/dist/invoices/invoices.queries.ts b/test/generated/dist/invoices/invoices.queries.ts new file mode 100644 index 0000000..5aa63ba --- /dev/null +++ b/test/generated/dist/invoices/invoices.queries.ts @@ -0,0 +1,1600 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InvoicesAcl } from "./invoices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { InvoicesApi } from "./invoices.api"; + +export namespace InvoicesQueries { + export const moduleName = QueryModule.Invoices; + + export const keys = { + all: [moduleName] as const, + getInvoicesEml: (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam) => + [...keys.all, "/offices/:officeId/invoices/eml", officeId, invoiceIds] as const, + find: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.InvoiceFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/invoices", + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + ] as const, + findInfinite: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.InvoiceFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/invoices", + "infinite", + officeId, + positionId, + limit, + order, + filter, + cursor, + ] as const, + findByOffice: ( + officeId: string, + limit?: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/invoices", officeId, limit, order, filter, page, cursor] as const, + findByOfficeInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: CommonModels.OfficeInvoiceFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/invoices", "infinite", officeId, limit, order, filter, cursor] as const, + getUnCharges: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargePaginationDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/uninvoiced-charges", + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + ] as const, + getUnChargesInfinite: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargePaginationDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/uninvoiced-charges", + "infinite", + officeId, + positionId, + limit, + order, + filter, + cursor, + ] as const, + listAvailablePartnersFor: ( + officeId: string, + invoiceId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + ) => + [ + ...keys.all, + "/offices/:officeId/invoices/:invoiceId/available-partners", + officeId, + invoiceId, + search, + useCase, + ] as const, + getOfficeUnCharges: ( + officeId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargesFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/uninvoiced-charges", officeId, limit, order, filter, page, cursor] as const, + getOfficeUnChargesInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: InvoicesModels.UninvoicedChargesFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/uninvoiced-charges", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + getDetail: (officeId: string, invoiceId: string) => + [...keys.all, "/offices/:officeId/invoices/:invoiceId", officeId, invoiceId] as const, + getPreview: (officeId: string, invoiceId: string) => + [...keys.all, "/offices/:officeId/invoices/:invoiceId/preview", officeId, invoiceId] as const, + getInvoiceEml: (officeId: string, invoiceId: string) => + [...keys.all, "/offices/:officeId/invoices/:invoiceId/eml", officeId, invoiceId] as const, + }; + + /** + * Query `useGetInvoicesEml` - recommended when file should be cached + * @summary Get invoices as EML file with PDF attachments + * @permission Requires `canUseGetInvoicesEml` ability + * @param { string } object.officeId Path parameter + * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } object.invoiceIds Query parameter. Invoice IDs + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const useGetInvoicesEml = ( + { officeId, invoiceIds }: { officeId: string; invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvoicesEml(officeId, invoiceIds), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId })); + return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config); + }, + ...options, + }); + }; + + /** + * Mutation `useGetInvoicesEmlMutation` - recommended when file should not be cached + * @summary Get invoices as EML file with PDF attachments + * @permission Requires `canUseGetInvoicesEml` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } mutation.invoiceIds Query parameter. Invoice IDs + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGetInvoicesEmlMutation = ( + options?: AppMutationOptions< + typeof InvoicesApi.getInvoicesEml, + { officeId: string; invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceIds }) => { + checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId })); + return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFind` + * @summary List invoices for a position + * @permission Requires `canUseFind` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` + * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFind = ( + { + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: InvoicesModels.InvoiceFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseFind({ officeId })); + return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindInfinite + * @summary List invoices for a position + * @permission Requires `canUseFind` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` + * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindInfinite = ( + { + officeId, + positionId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: InvoicesModels.InvoiceFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseFind({ officeId })); + return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useChangeIncomingCustomer` + * @summary Change incoming invoice customer and update vendors on registered charges + * @permission Requires `canUseChangeIncomingCustomer` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.ChangeInvoiceCustomerRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useChangeIncomingCustomer = ( + options?: AppMutationOptions< + typeof InvoicesApi.changeIncomingCustomer, + { officeId: string; invoiceId: string; data: InvoicesModels.ChangeInvoiceCustomerRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId })); + return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindByOffice` + * @summary List invoices for an office + * @permission Requires `canUseFindByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindByOffice = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CommonModels.OfficeInvoiceFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseFindByOffice({ officeId })); + return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindByOfficeInfinite + * @summary List invoices for an office + * @permission Requires `canUseFindByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindByOfficeInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: CommonModels.OfficeInvoiceFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseFindByOffice({ officeId })); + return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreateDraft` + * @summary Create a draft invoice from charge items + * @permission Requires `canUseCreateDraft` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.CreateDraftInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const useCreateDraft = ( + options?: AppMutationOptions< + typeof InvoicesApi.createDraft, + { officeId: string; data: InvoicesModels.CreateDraftInvoiceRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseCreateDraft({ officeId })); + return InvoicesApi.createDraft(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useExportInvoices` - recommended when file should not be cached + * @summary Export invoices to Excel + * @permission Requires `canUseExportInvoices` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportInvoices = ( + options?: AppMutationOptions< + typeof InvoicesApi.exportInvoices, + { officeId: string; data: InvoicesModels.InvoiceExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportInvoices({ officeId })); + return InvoicesApi.exportInvoices(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useExportCharges` - recommended when file should not be cached + * @summary Export invoice charges as Excel file + * @permission Requires `canUseExportCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportCharges = ( + options?: AppMutationOptions< + typeof InvoicesApi.exportCharges, + { officeId: string; data: InvoicesModels.InvoiceExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportCharges({ officeId })); + return InvoicesApi.exportCharges(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetUnCharges` + * @summary Get uninvoiced charges for a position + * @permission Requires `canUseGetUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetUnCharges = ( + { + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: InvoicesModels.UninvoicedChargePaginationDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId })); + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useGetUnChargesInfinite + * @summary Get uninvoiced charges for a position + * @permission Requires `canUseGetUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useGetUnChargesInfinite = ( + { + officeId, + positionId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: InvoicesModels.UninvoicedChargePaginationDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId })); + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for an invoice (union of position involved parties) + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListAvailablePartnersFor = ( + { + officeId, + invoiceId, + search, + useCase, + }: { + officeId: string; + invoiceId: string; + search?: string; + useCase?: CommonModels.PositionAvailablePartnersUseCase; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), + queryFn: () => { + checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId })); + return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase, config); + }, + ...options, + }); + }; + + /** + * Query `useGetOfficeUnCharges` + * @summary Get uninvoiced charges for all positions in an office + * @permission Requires `canUseGetOfficeUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetOfficeUnCharges = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: InvoicesModels.UninvoicedChargesFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId })); + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useGetOfficeUnChargesInfinite + * @summary Get uninvoiced charges for all positions in an office + * @permission Requires `canUseGetOfficeUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useGetOfficeUnChargesInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: InvoicesModels.UninvoicedChargesFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId })); + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useExportUnCharges` - recommended when file should not be cached + * @summary Export uninvoiced charges as Excel file + * @permission Requires `canUseExportUnCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.UninvoicedChargesExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportUnCharges = ( + options?: AppMutationOptions< + typeof InvoicesApi.exportUnCharges, + { officeId: string; data: InvoicesModels.UninvoicedChargesExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId })); + return InvoicesApi.exportUnCharges(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreateDirect` + * @summary Dummy endpoint to expose direct invoice permission to FE + * @permission Requires `canUseCreateDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const useCreateDirect = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId }) => { + checkAcl(InvoicesAcl.canUseCreateDirect({ officeId })); + return InvoicesApi.createDirect(officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useAddChargeToDirect` + * @summary Add a charge to a direct invoice + * @permission Requires `canUseAddChargeToDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.CreateDirectInvoiceChargeRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const useAddChargeToDirect = ( + options?: AppMutationOptions< + typeof InvoicesApi.addChargeToDirect, + { officeId: string; invoiceId: string; data: InvoicesModels.CreateDirectInvoiceChargeRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId })); + return InvoicesApi.addChargeToDirect(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateCharges` + * @summary Update charges on a draft invoice + * @permission Requires `canUseUpdateCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateInvoiceChargesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useUpdateCharges = ( + options?: AppMutationOptions< + typeof InvoicesApi.updateCharges, + { officeId: string; invoiceId: string; data: InvoicesModels.UpdateInvoiceChargesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId })); + return InvoicesApi.updateCharges(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useRemoveChargeFromDirect` + * @summary Remove a charge from a direct invoice + * @permission Requires `canUseRemoveChargeFromDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.chargeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useRemoveChargeFromDirect = ( + options?: AppMutationOptions< + typeof InvoicesApi.removeChargeFromDirect, + { officeId: string; invoiceId: string; chargeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, chargeId }) => { + checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId })); + return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetDetail` + * @summary Get invoice details + * @permission Requires `canUseGetDetail` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, default] + */ + export const useGetDetail = ( + { officeId, invoiceId }: { officeId: string; invoiceId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDetail(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetDetail({ officeId })); + return InvoicesApi.getDetail(officeId, invoiceId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update invoice details + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof InvoicesApi.update, + { officeId: string; invoiceId: string; data: InvoicesModels.UpdateInvoiceRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdate({ officeId })); + return InvoicesApi.update(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteInvoice` + * @summary Delete invoice + * @permission Requires `canUseDeleteInvoice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteInvoice = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId })); + return InvoicesApi.deleteInvoice(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useFix` + * @summary Fix invoice with accounting permission + * @permission Requires `canUseFix` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.FixInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useFix = ( + options?: AppMutationOptions< + typeof InvoicesApi.fix, + { officeId: string; invoiceId: string; data: InvoicesModels.FixInvoiceRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseFix({ officeId })); + return InvoicesApi.fix(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerate` - recommended when file should not be cached + * @summary Generate an invoice PDF + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [201, 401] + */ + export const useGenerate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGenerate({ officeId })); + return InvoicesApi.generate(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateIssuedVatRules` + * @summary Update VAT rules on issued invoice charges + * @permission Requires `canUseUpdateIssuedVatRules` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useUpdateIssuedVatRules = ( + options?: AppMutationOptions< + typeof InvoicesApi.updateIssuedVatRules, + { officeId: string; invoiceId: string; data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId })); + return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateIssuedCharges` + * @summary Update charges on issued invoice + * @permission Requires `canUseUpdateIssuedCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useUpdateIssuedCharges = ( + options?: AppMutationOptions< + typeof InvoicesApi.updateIssuedCharges, + { officeId: string; invoiceId: string; data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId })); + return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useIssue` - recommended when file should not be cached + * @summary Issue outgoing invoice + * @permission Requires `canUseIssue` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useIssue = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseIssue({ officeId })); + return InvoicesApi.issue(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [ + keys.getInvoicesEml(officeId), + keys.getPreview(officeId, invoiceId), + keys.getInvoiceEml(officeId, invoiceId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useReportHungarian` + * @summary Report invoice to Hungarian tax authority + * @permission Requires `canUseReportHungarian` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useReportHungarian = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseReportHungarian({ officeId })); + return InvoicesApi.reportHungarian(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateIncoming` - recommended when file should not be cached + * @summary Re-Generate an invoice PDF + * @permission Requires `canUseGenerateIncoming` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useGenerateIncoming = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId })); + return InvoicesApi.generateIncoming(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [ + keys.getInvoicesEml(officeId), + keys.getPreview(officeId, invoiceId), + keys.getInvoiceEml(officeId, invoiceId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useRegister` + * @summary Register incoming invoice + * @permission Requires `canUseRegister` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useRegister = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseRegister({ officeId })); + return InvoicesApi.register(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetPreview` - recommended when file should be cached + * @summary Get invoice PDF preview + * @permission Requires `canUseGetPreview` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const useGetPreview = ( + { officeId, invoiceId }: { officeId: string; invoiceId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getPreview(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetPreview({ officeId })); + return InvoicesApi.getPreview(officeId, invoiceId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useGetPreviewMutation` - recommended when file should not be cached + * @summary Get invoice PDF preview + * @permission Requires `canUseGetPreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGetPreviewMutation = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGetPreview({ officeId })); + return InvoicesApi.getPreview(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [ + keys.getInvoicesEml(officeId), + keys.getPreview(officeId, invoiceId), + keys.getInvoiceEml(officeId, invoiceId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetInvoiceEml` - recommended when file should be cached + * @summary Get invoice as EML file with PDF attachment + * @permission Requires `canUseGetInvoiceEml` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const useGetInvoiceEml = ( + { officeId, invoiceId }: { officeId: string; invoiceId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvoiceEml(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId })); + return InvoicesApi.getInvoiceEml(officeId, invoiceId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useGetInvoiceEmlMutation` - recommended when file should not be cached + * @summary Get invoice as EML file with PDF attachment + * @permission Requires `canUseGetInvoiceEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGetInvoiceEmlMutation = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId })); + return InvoicesApi.getInvoiceEml(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [ + keys.getInvoicesEml(officeId), + keys.getPreview(officeId, invoiceId), + keys.getInvoiceEml(officeId, invoiceId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `usePrepareDocumentUpload` + * @summary Prepare for invoice document upload + * @permission Requires `canUsePrepareDocumentUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.PrepareUploadRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const usePrepareDocumentUpload = ( + options?: AppMutationOptions< + typeof InvoicesApi.prepareDocumentUpload, + { + officeId: string; + invoiceId: string; + data: InvoicesModels.PrepareUploadRequestDto; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { + checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId })); + const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCancel` + * @summary Cancel invoice (create draft credit note) + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ + export const useCancel = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseCancel({ officeId })); + return InvoicesApi.cancel(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useIssueCreditNote` + * @summary Issue credit invoice + * @permission Requires `canUseIssueCreditNote` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ + export const useIssueCreditNote = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId })); + return InvoicesApi.issueCreditNote(officeId, invoiceId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/masterData/masterData.acl.ts b/test/generated/dist/masterData/masterData.acl.ts new file mode 100644 index 0000000..90517a8 --- /dev/null +++ b/test/generated/dist/masterData/masterData.acl.ts @@ -0,0 +1,15 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace MasterDataAcl { + /** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; +} diff --git a/test/generated/dist/masterData/masterData.api.ts b/test/generated/dist/masterData/masterData.api.ts new file mode 100644 index 0000000..d1bc569 --- /dev/null +++ b/test/generated/dist/masterData/masterData.api.ts @@ -0,0 +1,65 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { MasterDataModels } from "./masterData.models"; + +export namespace MasterDataApi { + export const findAll = ( + officeId: string, + types: MasterDataModels.MasterDataFindAllTypesParam, + search?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, + `/offices/${officeId}/master-data/autocomplete`, + { + ...config, + params: { + types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { + type: "query", + name: "types", + }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + }, + ); + }; + export const paginate = ( + officeId: string, + types: MasterDataModels.MasterDataPaginateTypesParam, + limit: number, + search?: string, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, + `/offices/${officeId}/master-data/labels/paginated`, + { + ...config, + params: { + types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { + type: "query", + name: "types", + }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/dist/masterData/masterData.configs.ts b/test/generated/dist/masterData/masterData.configs.ts new file mode 100644 index 0000000..3f2dbff --- /dev/null +++ b/test/generated/dist/masterData/masterData.configs.ts @@ -0,0 +1,28 @@ +import { dynamicColumns } from "@povio/ui"; +import { MasterDataModels } from "./masterData.models"; +import { MasterDataQueries } from "./masterData.queries"; +import { MasterDataAcl } from "./masterData.acl"; + +export namespace MasterDataConfigs { + export const paginatedConfig = { + meta: { + title: "Paginated", + }, + readAll: { + acl: MasterDataAcl.canUsePaginate, + schema: MasterDataModels.MasterDataLabelResponseDTOSchema, + paginated: MasterDataQueries.usePaginate, + infinite: MasterDataQueries.usePaginateInfinite, + columns: dynamicColumns({ + schema: MasterDataModels.MasterDataLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + type: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/dist/masterData/masterData.models.ts b/test/generated/dist/masterData/masterData.models.ts new file mode 100644 index 0000000..3a0dfae --- /dev/null +++ b/test/generated/dist/masterData/masterData.models.ts @@ -0,0 +1,94 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace MasterDataModels { + /** + * MasterDataTypeEnumSchema + * @type { enum } + */ + export const MasterDataTypeEnumSchema = z.enum([ + "BusinessPartner", + "Depot", + "City", + "Warehouse", + "ContainerYard", + "PortTerminal", + "AirportTerminal", + "Port", + "Airport", + ]); + export type MasterDataTypeEnum = z.infer; + export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; + + /** + * MasterDataItemResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the item + * @property { string } name Name of the item + * @property { MasterDataTypeEnum } type Type of the item + */ + export const MasterDataItemResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the item"), + name: z.string().describe("Name of the item"), + type: MasterDataTypeEnumSchema.describe("Type of the item"), + }) + .readonly(); + export type MasterDataItemResponseDTO = z.infer; + + /** + * MasterDataItemsResponseDTOSchema + * @type { object } + * @property { MasterDataItemResponseDTO[] } items List of master data items + */ + export const MasterDataItemsResponseDTOSchema = z + .object({ items: z.array(MasterDataItemResponseDTOSchema).readonly().describe("List of master data items") }) + .readonly(); + export type MasterDataItemsResponseDTO = z.infer; + + /** + * MasterDataLabelResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the item + * @property { string } label Label of the item + * @property { MasterDataTypeEnum } type Type of the item + */ + export const MasterDataLabelResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the item"), + label: z.string().describe("Label of the item"), + type: MasterDataTypeEnumSchema.describe("Type of the item"), + }) + .readonly(); + export type MasterDataLabelResponseDTO = z.infer; + + /** + * MasterDataFindAllTypesParamSchema + * @type { array } + */ + export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); + export type MasterDataFindAllTypesParam = z.infer; + + /** + * MasterDataPaginateTypesParamSchema + * @type { array } + */ + export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); + export type MasterDataPaginateTypesParam = z.infer; + + /** + * MasterDataPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { MasterDataLabelResponseDTO[] } items + */ + export const MasterDataPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(MasterDataLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type MasterDataPaginateResponse = z.infer; +} diff --git a/test/generated/dist/masterData/masterData.queries.ts b/test/generated/dist/masterData/masterData.queries.ts new file mode 100644 index 0000000..7ba7283 --- /dev/null +++ b/test/generated/dist/masterData/masterData.queries.ts @@ -0,0 +1,178 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { MasterDataAcl } from "./masterData.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { MasterDataModels } from "./masterData.models"; +import { MasterDataApi } from "./masterData.api"; + +export namespace MasterDataQueries { + export const moduleName = QueryModule.MasterData; + + export const keys = { + all: [moduleName] as const, + findAll: (officeId: string, types?: MasterDataModels.MasterDataFindAllTypesParam, search?: string) => + [...keys.all, "/offices/:officeId/master-data/autocomplete", officeId, types, search] as const, + paginate: ( + officeId: string, + types?: MasterDataModels.MasterDataPaginateTypesParam, + limit?: number, + search?: string, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/master-data/labels/paginated", + officeId, + types, + limit, + search, + page, + cursor, + ] as const, + paginateInfinite: ( + officeId: string, + types?: MasterDataModels.MasterDataPaginateTypesParam, + limit?: number, + search?: string, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/master-data/labels/paginated", + "infinite", + officeId, + types, + limit, + search, + cursor, + ] as const, + }; + + /** + * Query `useFindAll` + * @summary List master data based on provided type + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataFindAllTypesParam } object.types Query parameter + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + officeId, + types, + search, + }: { officeId: string; types: MasterDataModels.MasterDataFindAllTypesParam; search?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(officeId, types, search), + queryFn: () => { + checkAcl(MasterDataAcl.canUseFindAll()); + return MasterDataApi.findAll(officeId, types, search, config); + }, + ...options, + }); + }; + + /** + * Query `usePaginate` + * @summary Paginate master data based on provided type + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.search Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + types, + limit, + search, + page, + cursor, + }: { + officeId: string; + types: MasterDataModels.MasterDataPaginateTypesParam; + limit: number; + search?: string; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, types, limit, search, page, cursor), + queryFn: () => { + checkAcl(MasterDataAcl.canUsePaginate()); + return MasterDataApi.paginate(officeId, types, limit, search, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate master data based on provided type + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.search Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + types, + limit, + search, + cursor, + }: { + officeId: string; + types: MasterDataModels.MasterDataPaginateTypesParam; + limit: number; + search?: string; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), + queryFn: ({ pageParam }) => { + checkAcl(MasterDataAcl.canUsePaginate()); + return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/masterDataImport/masterDataImport.acl.ts b/test/generated/dist/masterDataImport/masterDataImport.acl.ts new file mode 100644 index 0000000..6146a3a --- /dev/null +++ b/test/generated/dist/masterDataImport/masterDataImport.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace MasterDataImportAcl { + /** + * Use for `useUpload` mutation ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpload` mutation + */ + export const canUseUpload = (object?: { officeId: string }) => + ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< + "Import", + "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) + >; + + /** + * Use for `usePostOfficesMasterDataImportByOfficeId` mutation ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePostOfficesMasterDataImportByOfficeId` mutation + */ + export const canUsePostOfficesMasterDataImportByOfficeId = (object?: { officeId: string }) => + ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< + "Import", + "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) + >; + + /** + * Use for `useGetImportStatus` query ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetImportStatus` query + */ + export const canUseGetImportStatus = (object?: { officeId: string }) => + ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< + "Import", + "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/masterDataImport/masterDataImport.api.ts b/test/generated/dist/masterDataImport/masterDataImport.api.ts new file mode 100644 index 0000000..e2040f1 --- /dev/null +++ b/test/generated/dist/masterDataImport/masterDataImport.api.ts @@ -0,0 +1,38 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { MasterDataImportModels } from "./masterDataImport.models"; + +export namespace MasterDataImportApi { + export const upload = ( + officeId: string, + data: MasterDataImportModels.MasterDataImportUploadRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, + `/offices/${officeId}/master-data/upload`, + ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), + config, + ); + }; + export const postOfficesMasterDataImportByOfficeId = ( + officeId: string, + data: MasterDataImportModels.MasterDataImportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, + `/offices/${officeId}/master-data/import`, + ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), + config, + ); + }; + export const getImportStatus = (jobId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, + `/offices/${officeId}/master-data/import/${jobId}/status`, + config, + ); + }; +} diff --git a/test/generated/dist/masterDataImport/masterDataImport.models.ts b/test/generated/dist/masterDataImport/masterDataImport.models.ts new file mode 100644 index 0000000..27c6a3e --- /dev/null +++ b/test/generated/dist/masterDataImport/masterDataImport.models.ts @@ -0,0 +1,110 @@ +import { z } from "zod"; + +export namespace MasterDataImportModels { + /** + * ImportStatusEnumSchema + * @type { enum } + * @description Import result status + */ + export const ImportStatusEnumSchema = z.enum(["Success", "Warning", "Error"]); + export type ImportStatusEnum = z.infer; + export const ImportStatusEnum = ImportStatusEnumSchema.enum; + + /** + * ImportTypeEnumSchema + * @type { enum } + */ + export const ImportTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Warehouse"]); + export type ImportTypeEnum = z.infer; + export const ImportTypeEnum = ImportTypeEnumSchema.enum; + + /** + * MasterDataImportRequestDtoSchema + * @type { object } + * @property { string } mediaId Media ID of the uploaded file + * @property { ImportTypeEnum } type Type of data to import + */ + export const MasterDataImportRequestDtoSchema = z + .object({ + mediaId: z.string().describe("Media ID of the uploaded file"), + type: ImportTypeEnumSchema.describe("Type of data to import"), + }) + .readonly(); + export type MasterDataImportRequestDto = z.infer; + + /** + * ImportResultDtoSchema + * @type { object } + * @property { string } importStatus Import result status + * @property { string } downloadUrl S3 presigned URL for result file download + * @property { string } expiresAt Download URL expiration time + * @property { string } errorCode + */ + export const ImportResultDtoSchema = z + .object({ + importStatus: ImportStatusEnumSchema.describe("Import result status").nullish(), + downloadUrl: z.string().describe("S3 presigned URL for result file download"), + expiresAt: z.iso.datetime({ offset: true }).describe("Download URL expiration time").nullish(), + errorCode: z.string().nullish(), + }) + .readonly(); + export type ImportResultDto = z.infer; + + /** + * ImportStatusResponseDtoSchema + * @type { object } + * @property { string } status Current job status + * @property { ImportResultDto } result Import result data when job is completed + */ + export const ImportStatusResponseDtoSchema = z + .object({ + status: z.string().describe("Current job status").nullable(), + result: ImportResultDtoSchema.describe("Import result data when job is completed").nullish(), + }) + .readonly(); + export type ImportStatusResponseDto = z.infer; + + /** + * MasterDataImportUploadRequestDtoSchema + * @type { object } + * @property { string } filename File name + * @property { string } contentType Content type of the file + * @property { number } fileSize File size in bytes. Minimum: `1` + */ + export const MasterDataImportUploadRequestDtoSchema = z + .object({ + filename: z.string().describe("File name"), + contentType: z.string().describe("Content type of the file"), + fileSize: z.number().gte(1).describe("File size in bytes"), + }) + .readonly(); + export type MasterDataImportUploadRequestDto = z.infer; + + /** + * MasterDataImportUploadResponseDtoSchema + * @type { object } + * @property { string } mediaId Media ID for the uploaded file + * @property { string } url S3 presigned upload URL + */ + export const MasterDataImportUploadResponseDtoSchema = z + .object({ + mediaId: z.string().describe("Media ID for the uploaded file"), + url: z.string().describe("S3 presigned upload URL"), + }) + .readonly(); + export type MasterDataImportUploadResponseDto = z.infer; + + /** + * MasterDataImportResponseDtoSchema + * @type { object } + * @property { string } jobId PG Boss job ID + * @property { string } status Initial job status + */ + export const MasterDataImportResponseDtoSchema = z + .object({ + jobId: z.string().describe("PG Boss job ID"), + status: z.string().describe("Initial job status").nullish(), + }) + .readonly(); + export type MasterDataImportResponseDto = z.infer; +} diff --git a/test/generated/dist/masterDataImport/masterDataImport.queries.ts b/test/generated/dist/masterDataImport/masterDataImport.queries.ts new file mode 100644 index 0000000..60d6af7 --- /dev/null +++ b/test/generated/dist/masterDataImport/masterDataImport.queries.ts @@ -0,0 +1,146 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { MasterDataImportAcl } from "./masterDataImport.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { MasterDataImportModels } from "./masterDataImport.models"; +import { MasterDataImportApi } from "./masterDataImport.api"; + +export namespace MasterDataImportQueries { + export const moduleName = QueryModule.MasterDataImport; + + export const keys = { + all: [moduleName] as const, + getImportStatus: (jobId: string, officeId: string) => + [...keys.all, "/offices/:officeId/master-data/import/:jobId/status", jobId, officeId] as const, + }; + + /** + * Mutation `useUpload` + * @summary Create upload instructions for master data import file + * @permission Requires `canUseUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { MasterDataImportModels.MasterDataImportUploadRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useUpload = ( + options?: AppMutationOptions< + typeof MasterDataImportApi.upload, + { + officeId: string; + data: MasterDataImportModels.MasterDataImportUploadRequestDto; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(MasterDataImportAcl.canUseUpload({ officeId })); + const uploadInstructions = await MasterDataImportApi.upload(officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `usePostOfficesMasterDataImportByOfficeId` + * @summary Start master data import process + * @permission Requires `canUsePostOfficesMasterDataImportByOfficeId` ability + * @param { string } mutation.officeId Path parameter + * @param { MasterDataImportModels.MasterDataImportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const usePostOfficesMasterDataImportByOfficeId = ( + options?: AppMutationOptions< + typeof MasterDataImportApi.postOfficesMasterDataImportByOfficeId, + { officeId: string; data: MasterDataImportModels.MasterDataImportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId })); + return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetImportStatus` + * @summary Get import job status + * @permission Requires `canUseGetImportStatus` ability + * @param { string } object.jobId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetImportStatus = ( + { jobId, officeId }: { jobId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getImportStatus(jobId, officeId), + queryFn: () => { + checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId })); + return MasterDataImportApi.getImportStatus(jobId, officeId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/offices/offices.acl.ts b/test/generated/dist/offices/offices.acl.ts new file mode 100644 index 0000000..aec8ce6 --- /dev/null +++ b/test/generated/dist/offices/offices.acl.ts @@ -0,0 +1,84 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace OfficesAcl { + /** + * Use for `useCreate` mutation ability. + * @description Create office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Office"] as AbilityTuple<"Create", "Office">; + + /** + * Use for `useGet` query ability. + * @description Read office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; + + /** + * Use for `useUpdate` mutation ability. + * @description Update office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Office"] as AbilityTuple<"Update", "Office">; + + /** + * Use for `useUploadDocumentImage` mutation ability. For global ability, omit the object parameter. + * @description Upload office document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadDocumentImage` mutation + */ + export const canUseUploadDocumentImage = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useCreateBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Create office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBankAccount` mutation + */ + export const canUseCreateBankAccount = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Update office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBankAccount` mutation + */ + export const canUseUpdateBankAccount = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useDeleteBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Delete office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBankAccount` mutation + */ + export const canUseDeleteBankAccount = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; + + /** + * Use for `useUploadBankAccountFooter` mutation ability. For global ability, omit the object parameter. + * @description Upload bank account footer + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadBankAccountFooter` mutation + */ + export const canUseUploadBankAccountFooter = (object?: { officeId: string }) => + ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< + "Update", + "Office" | (ForcedSubject<"Office"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/offices/offices.api.ts b/test/generated/dist/offices/offices.api.ts new file mode 100644 index 0000000..2368933 --- /dev/null +++ b/test/generated/dist/offices/offices.api.ts @@ -0,0 +1,167 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { OfficesModels } from "./offices.models"; + +export namespace OfficesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: OfficesModels.OfficeFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: OfficesModels.OfficesPaginateResponseSchema }, `/offices`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: OfficesModels.CreateOfficeRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: OfficesModels.OfficeResponseDtoSchema }, + `/offices`, + ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), + config, + ); + }; + export const findAllLabels = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: OfficesModels.FindAllLabelsResponseSchema }, `/offices/labels`, { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + }); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: OfficesModels.OfficeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, + `/offices/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const get = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, `/offices/${id}`, config); + }; + export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: OfficesModels.OfficeResponseDtoSchema }, + `/offices/${id}`, + ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), + config, + ); + }; + export const uploadDocumentImage = ( + officeId: string, + data: OfficesModels.UploadOfficeDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, + `/offices/${officeId}/document-image`, + ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), + config, + ); + }; + export const createBankAccount = ( + officeId: string, + data: OfficesModels.CreateOfficeBankAccountDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, + `/offices/${officeId}/bank-accounts`, + ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), + config, + ); + }; + export const updateBankAccount = ( + accountId: string, + officeId: string, + data: OfficesModels.UpdateOfficeBankAccountDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, + `/offices/${officeId}/bank-accounts/${accountId}`, + ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), + config, + ); + }; + export const deleteBankAccount = (accountId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/bank-accounts/${accountId}`, + undefined, + config, + ); + }; + export const uploadBankAccountFooter = ( + accountId: string, + officeId: string, + data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, + `/offices/${officeId}/bank-accounts/${accountId}/footer`, + ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/offices/offices.configs.ts b/test/generated/dist/offices/offices.configs.ts new file mode 100644 index 0000000..c595c05 --- /dev/null +++ b/test/generated/dist/offices/offices.configs.ts @@ -0,0 +1,134 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { OfficesModels } from "./offices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { OfficesQueries } from "./offices.queries"; +import { OfficesAcl } from "./offices.acl"; + +export namespace OfficesConfigs { + export const officesConfig = { + meta: { + title: "Offices", + }, + readAll: { + schema: OfficesModels.OfficeListItemResponseSchema, + paginated: OfficesQueries.usePaginate, + infinite: OfficesQueries.usePaginateInfinite, + filters: { + schema: OfficesModels.OfficeFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: OfficesModels.OfficeFilterDtoSchema, + options: { + inputs: { + name: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: OfficesModels.OfficeListItemResponseSchema, + options: { + columns: { + id: true, + name: true, + numberOfEmployees: true, + }, + sortable: OfficesModels.OfficesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: OfficesAcl.canUseGet, + schema: OfficesModels.OfficeDetailResponseDtoSchema, + query: OfficesQueries.useGet, + }, + create: { + acl: OfficesAcl.canUseCreate, + schema: OfficesModels.CreateOfficeRequestSchema, + mutation: OfficesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: OfficesModels.CreateOfficeRequestSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + update: { + acl: OfficesAcl.canUseUpdate, + schema: OfficesModels.UpdateOfficeRequestSchema, + mutation: OfficesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: OfficesModels.UpdateOfficeRequestSchema, + options: { + inputs: { + name: true, + symbol: true, + invoicePrefix: true, + autoClosePositionsAfterDays: true, + defaultLanguage: true, + locale: true, + vatId: true, + taxNumber: true, + termsExport: true, + termsImport: true, + showPaymentInstructions: true, + showCompanyRegistrationNumber: true, + reportInvoicesToHungarianTaxAuthority: true, + restrictPositionInvolvedParties: true, + showWatermarkOnDocuments: true, + showInvoiceVatLinesInOfficeCurrency: true, + usePartnerMatchCodes: true, + restrictFinancePartnersToRelationship: true, + costCenterId: true, + minimumOutgoingInvoiceDate: true, + minimumOutgoingInvoiceServiceDate: true, + minimumIncomingInvoiceDate: true, + minimumIncomingInvoiceServiceDate: true, + countryId: true, + defaultCurrencyId: true, + representingBusinessPartnerId: true, + availableCurrencyIds: true, + generalLedgerSystem: true, + factoringReportingEnabled: true, + bankAccountCurrencyMapping: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + schema: CommonModels.LabelResponseDTOSchema, + paginated: OfficesQueries.usePaginateLabels, + infinite: OfficesQueries.usePaginateLabelsInfinite, + filters: { + schema: OfficesModels.OfficeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: OfficesModels.OfficeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/offices/offices.models.ts b/test/generated/dist/offices/offices.models.ts new file mode 100644 index 0000000..ca066ec --- /dev/null +++ b/test/generated/dist/offices/offices.models.ts @@ -0,0 +1,603 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace OfficesModels { + /** + * OfficeCurrencyResponseDtoSchema + * @type { object } + * @property { string } isoCode + * @property { string } name + */ + export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }).readonly(); + export type OfficeCurrencyResponseDto = z.infer; + + /** + * OfficeBankAccountCurrencyMappingResponseDtoSchema + * @type { object } + * @property { string } currency + * @property { string } bankAccountId + * @property { string } bankAccountName + */ + export const OfficeBankAccountCurrencyMappingResponseDtoSchema = z + .object({ currency: z.string(), bankAccountId: z.string(), bankAccountName: z.string() }) + .readonly(); + export type OfficeBankAccountCurrencyMappingResponseDto = z.infer< + typeof OfficeBankAccountCurrencyMappingResponseDtoSchema + >; + + /** + * OfficeBookkeepingResponseDtoSchema + * @type { object } + * @property { string } generalLedgerSystem + * @property { OfficeCurrencyResponseDto } defaultCurrency + * @property { OfficeCurrencyResponseDto[] } availableCurrencies + * @property { boolean } showPaymentInstructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { OfficeBankAccountCurrencyMappingResponseDto[] } bankAccountCurrencyMapping + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { boolean } factoringReportingEnabled + */ + export const OfficeBookkeepingResponseDtoSchema = z + .object({ + generalLedgerSystem: z.string(), + defaultCurrency: OfficeCurrencyResponseDtoSchema.nullish(), + availableCurrencies: z.array(OfficeCurrencyResponseDtoSchema).readonly(), + showPaymentInstructions: z.boolean(), + showCompanyRegistrationNumber: z.boolean(), + showInvoiceVatLinesInOfficeCurrency: z.boolean(), + reportInvoicesToHungarianTaxAuthority: z.boolean(), + bankAccountCurrencyMapping: z.array(OfficeBankAccountCurrencyMappingResponseDtoSchema).readonly(), + costCenterId: z.string().nullish(), + minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), + factoringReportingEnabled: z.boolean(), + }) + .readonly(); + export type OfficeBookkeepingResponseDto = z.infer; + + /** + * OfficeDocumentPartEnumSchema + * @type { enum } + */ + export const OfficeDocumentPartEnumSchema = z.enum([ + "DocumentFooter", + "DocumentHeader", + "GeneralTermsAndConditions", + "BLTermsAndConditions", + "FinanceDocumentFooter", + ]); + export type OfficeDocumentPartEnum = z.infer; + export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; + + /** + * OfficeDocumentSettingsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } mediaUrl + * @property { CommonModels.LanguageEnum } language + * @property { OfficeDocumentPartEnum } documentPart + */ + export const OfficeDocumentSettingsResponseDtoSchema = z + .object({ + id: z.string(), + mediaUrl: z.string(), + language: CommonModels.LanguageEnumSchema, + documentPart: OfficeDocumentPartEnumSchema, + }) + .readonly(); + export type OfficeDocumentSettingsResponseDto = z.infer; + + /** + * AddressResponseDTOSchema + * @type { object } + * @property { string } id ID of the address + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } city City name + * @property { string } district District + * @property { string } isoCode2 2 letter country code + * @property { string } country Country name + * @property { string } isoCode3 3 letter country code + */ + export const AddressResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the address"), + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street address"), + zip: z.string().describe("ZIP/Postal code"), + city: z.string().describe("City name"), + district: z.string().describe("District"), + isoCode2: z.string().describe("2 letter country code"), + country: z.string().describe("Country name"), + isoCode3: z.string().describe("3 letter country code"), + }) + .readonly(); + export type AddressResponseDTO = z.infer; + + /** + * OfficeRepresentingBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string[] } types + * @property { string[] } email + * @property { string[] } phone + * @property { string } addressId + * @property { AddressResponseDTO } address + */ + export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + types: z.array(z.string()).readonly(), + email: z.array(z.string()).readonly().nullish(), + phone: z.array(z.string()).readonly().nullish(), + addressId: z.string().nullish(), + address: AddressResponseDTOSchema.nullish(), + }) + .readonly(); + export type OfficeRepresentingBusinessPartnerResponseDto = z.infer< + typeof OfficeRepresentingBusinessPartnerResponseDtoSchema + >; + + /** + * OfficePaymentTermsResponseDtoSchema + * @type { object } + * @property { number } days + * @property { string } relativeTo + */ + export const OfficePaymentTermsResponseDtoSchema = z + .object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }) + .readonly(); + export type OfficePaymentTermsResponseDto = z.infer; + + /** + * OfficeCountryResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const OfficeCountryResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type OfficeCountryResponseDto = z.infer; + + /** + * OfficeBankAccountResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } bankName + * @property { string } iban + * @property { string } swiftBic + * @property { boolean } useFooterOnInvoice + * @property { object } footer + * @property { string } footer.mediaUrl + * @property { boolean } isFactoringBank + */ + export const OfficeBankAccountResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + bankName: z.string(), + iban: z.string(), + swiftBic: z.string(), + useFooterOnInvoice: z.boolean(), + footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), + isFactoringBank: z.boolean(), + }) + .readonly(); + export type OfficeBankAccountResponseDto = z.infer; + + /** + * OfficeDetailResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } symbol + * @property { number } invoicePrefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage + * @property { CommonModels.LocaleEnum } locale + * @property { string } vatId + * @property { string } taxNumber + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { OfficePaymentTermsResponseDto } termsExport + * @property { OfficePaymentTermsResponseDto } termsImport + * @property { OfficeCountryResponseDto } country + * @property { OfficeBankAccountResponseDto[] } bankAccounts + * @property { OfficeBookkeepingResponseDto } bookkeeping + * @property { OfficeDocumentSettingsResponseDto[] } documentSettings + * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner + * @property { boolean } hasInttraCredentials + */ + export const OfficeDetailResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + symbol: z.string().nullable(), + invoicePrefix: z.number().nullable(), + autoClosePositionsAfterDays: z.number().nullish(), + defaultLanguage: z.string().nullable(), + locale: CommonModels.LocaleEnumSchema.nullish(), + vatId: z.string().nullable(), + taxNumber: z.string().nullable(), + restrictPositionInvolvedParties: z.boolean(), + showWatermarkOnDocuments: z.boolean(), + usePartnerMatchCodes: z.boolean(), + restrictFinancePartnersToRelationship: z.boolean(), + termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), + termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), + country: OfficeCountryResponseDtoSchema.nullable(), + bankAccounts: z.array(OfficeBankAccountResponseDtoSchema).readonly(), + bookkeeping: OfficeBookkeepingResponseDtoSchema, + documentSettings: z.array(OfficeDocumentSettingsResponseDtoSchema).readonly(), + representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), + hasInttraCredentials: z.boolean().nullish(), + }) + .readonly(); + export type OfficeDetailResponseDto = z.infer; + + /** + * OfficeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } symbol + * @property { number } invoicePrefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage + * @property { CommonModels.LocaleEnum } locale + * @property { string } vatId + * @property { string } taxNumber + * @property { OfficePaymentTermsResponseDto } termsExport + * @property { OfficePaymentTermsResponseDto } termsImport + * @property { boolean } showPaymentInstructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { string } countryId + * @property { string } defaultCurrencyId + * @property { string[] } availableCurrencyIds + * @property { string } generalLedgerSystem + * @property { string } representingBusinessPartnerId + * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner + * @property { boolean } factoringReportingEnabled + */ + export const OfficeResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + symbol: z.string().nullable(), + invoicePrefix: z.number().nullable(), + autoClosePositionsAfterDays: z.number().nullish(), + defaultLanguage: z.string().nullable(), + locale: CommonModels.LocaleEnumSchema.nullish(), + vatId: z.string().nullable(), + taxNumber: z.string().nullable(), + termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), + termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), + showPaymentInstructions: z.boolean(), + showCompanyRegistrationNumber: z.boolean(), + restrictPositionInvolvedParties: z.boolean(), + showWatermarkOnDocuments: z.boolean(), + showInvoiceVatLinesInOfficeCurrency: z.boolean(), + usePartnerMatchCodes: z.boolean(), + restrictFinancePartnersToRelationship: z.boolean(), + reportInvoicesToHungarianTaxAuthority: z.boolean(), + costCenterId: z.string().nullish(), + minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), + minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), + countryId: z.string().nullable(), + defaultCurrencyId: z.string().nullable(), + availableCurrencyIds: z.array(z.string()).readonly().nullable(), + generalLedgerSystem: z.string().nullable(), + representingBusinessPartnerId: z.string().nullable(), + representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), + factoringReportingEnabled: z.boolean(), + }) + .readonly(); + export type OfficeResponseDto = z.infer; + + /** + * UpdateOfficePaymentTermsRequestSchema + * @type { object } + * @property { number } days + * @property { string } relativeTo + */ + export const UpdateOfficePaymentTermsRequestSchema = z + .object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }) + .readonly(); + export type UpdateOfficePaymentTermsRequest = z.infer; + + /** + * UpdateOfficeBankAccountCurrencyMappingSchema + * @type { object } + * @property { string } currency + * @property { string } bankAccountId + */ + export const UpdateOfficeBankAccountCurrencyMappingSchema = z + .object({ currency: z.string(), bankAccountId: z.string() }) + .readonly(); + export type UpdateOfficeBankAccountCurrencyMapping = z.infer; + + /** + * UpdateOfficeRequestSchema + * @type { object } + * @property { string } name Office Name + * @property { string } symbol Office Symbol + * @property { number } invoicePrefix Office Invoice Prefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage Office Default Language + * @property { string } locale + * @property { string } vatId Office Vat Id + * @property { string } taxNumber Office Tax Number + * @property { UpdateOfficePaymentTermsRequest } termsExport Office Terms Export + * @property { UpdateOfficePaymentTermsRequest } termsImport Office Terms Import + * @property { boolean } showPaymentInstructions Office Show Payment Instructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { string } countryId Office country id + * @property { string } defaultCurrencyId Office default currency id + * @property { string } representingBusinessPartnerId Representing business partner id + * @property { string[] } availableCurrencyIds Office availableCurrencyIds + * @property { string } generalLedgerSystem Office general ledger system + * @property { boolean } factoringReportingEnabled + * @property { UpdateOfficeBankAccountCurrencyMapping[] } bankAccountCurrencyMapping Office bank account currency mapping + */ + export const UpdateOfficeRequestSchema = z + .object({ + name: z.string().describe("Office Name"), + symbol: z.string().describe("Office Symbol"), + invoicePrefix: z.number().describe("Office Invoice Prefix"), + autoClosePositionsAfterDays: z.number(), + defaultLanguage: z.string().describe("Office Default Language"), + locale: CommonModels.LocaleEnumSchema, + vatId: z.string().describe("Office Vat Id"), + taxNumber: z.string().describe("Office Tax Number"), + termsExport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Export"), + termsImport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Import"), + showPaymentInstructions: z.boolean().describe("Office Show Payment Instructions"), + showCompanyRegistrationNumber: z.boolean(), + reportInvoicesToHungarianTaxAuthority: z.boolean(), + restrictPositionInvolvedParties: z.boolean(), + showWatermarkOnDocuments: z.boolean(), + showInvoiceVatLinesInOfficeCurrency: z.boolean(), + usePartnerMatchCodes: z.boolean(), + restrictFinancePartnersToRelationship: z.boolean(), + costCenterId: z.string(), + minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }), + minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }), + minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }), + minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }), + countryId: z.string().describe("Office country id"), + defaultCurrencyId: z.string().describe("Office default currency id"), + representingBusinessPartnerId: z.string().describe("Representing business partner id"), + availableCurrencyIds: z.array(z.string()).readonly().describe("Office availableCurrencyIds"), + generalLedgerSystem: z.string().describe("Office general ledger system"), + factoringReportingEnabled: z.boolean(), + bankAccountCurrencyMapping: z + .array(UpdateOfficeBankAccountCurrencyMappingSchema) + .readonly() + .describe("Office bank account currency mapping"), + }) + .readonly(); + export type UpdateOfficeRequest = z.infer; + + /** + * UploadOfficeDocumentRequestDtoSchema + * @type { object } + * @property { string } fileName File name with extension + * @property { string } mimeType MIME type of the file + * @property { number } fileSize Size of the file + * @property { string } language Language of the document + * @property { string } documentPart Part of the document this image represents + */ + export const UploadOfficeDocumentRequestDtoSchema = z + .object({ + fileName: z.string().describe("File name with extension"), + mimeType: z.string().describe("MIME type of the file"), + fileSize: z.number().describe("Size of the file"), + language: CommonModels.LanguageEnumSchema.describe("Language of the document"), + documentPart: OfficeDocumentPartEnumSchema.describe("Part of the document this image represents"), + }) + .readonly(); + export type UploadOfficeDocumentRequestDto = z.infer; + + /** + * OfficeListItemResponseSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { number } numberOfEmployees + */ + export const OfficeListItemResponseSchema = z + .object({ id: z.string(), name: z.string(), numberOfEmployees: z.number() }) + .readonly(); + export type OfficeListItemResponse = z.infer; + + /** + * OfficeFilterDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } search + */ + export const OfficeFilterDtoSchema = z.object({ name: z.string().describe("Name"), search: z.string() }).readonly(); + export type OfficeFilterDto = z.infer; + + /** + * OfficeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const OfficeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type OfficeLabelFilterDto = z.infer; + + /** + * CreateOfficeRequestSchema + * @type { object } + * @property { string } name + */ + export const CreateOfficeRequestSchema = z.object({ name: z.string() }).readonly(); + export type CreateOfficeRequest = z.infer; + + /** + * DocumentImageUploadInstructionsDtoSchema + * @type { object } + * @property { string } method HTTP method to use for upload + * @property { string } url URL to upload the file to + * @property { string } documentId ID of the created/updated document setting + */ + export const DocumentImageUploadInstructionsDtoSchema = z + .object({ + method: z.string().describe("HTTP method to use for upload"), + url: z.string().describe("URL to upload the file to"), + documentId: z.string().describe("ID of the created/updated document setting"), + }) + .readonly(); + export type DocumentImageUploadInstructionsDto = z.infer; + + /** + * CreateOfficeBankAccountDtoSchema + * @type { object } + * @property { string } name Bank account name + * @property { string } bankName Bank name + * @property { string } iban IBAN + * @property { string } swiftBic SWIFT/BIC code + * @property { boolean } useFooterOnInvoice Use footer on invoice + */ + export const CreateOfficeBankAccountDtoSchema = z + .object({ + name: z.string().describe("Bank account name"), + bankName: z.string().describe("Bank name"), + iban: z.string().describe("IBAN"), + swiftBic: z.string().describe("SWIFT/BIC code"), + useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), + }) + .readonly(); + export type CreateOfficeBankAccountDto = z.infer; + + /** + * UpdateOfficeBankAccountDtoSchema + * @type { object } + * @property { string } name Bank account name + * @property { string } bankName Bank name + * @property { string } iban IBAN + * @property { string } swiftBic SWIFT/BIC code + * @property { boolean } useFooterOnInvoice Use footer on invoice + * @property { boolean } isFactoringBank Is factoring bank + */ + export const UpdateOfficeBankAccountDtoSchema = z + .object({ + name: z.string().describe("Bank account name"), + bankName: z.string().describe("Bank name"), + iban: z.string().describe("IBAN"), + swiftBic: z.string().describe("SWIFT/BIC code"), + useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), + isFactoringBank: z.boolean().describe("Is factoring bank"), + }) + .readonly(); + export type UpdateOfficeBankAccountDto = z.infer; + + /** + * UploadOfficeBankAccountFooterRequestDtoSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType File MIME type + * @property { number } fileSize Size of the file + */ + export const UploadOfficeBankAccountFooterRequestDtoSchema = z + .object({ + fileName: z.string().describe("File name"), + mimeType: z.string().describe("File MIME type"), + fileSize: z.number().describe("Size of the file"), + }) + .readonly(); + export type UploadOfficeBankAccountFooterRequestDto = z.infer; + + /** + * OfficesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const OfficesPaginateOrderParamEnumSchema = z.enum(["name"]); + export type OfficesPaginateOrderParamEnum = z.infer; + export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema.enum; + + /** + * OfficesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficeListItemResponse[] } items + */ + export const OfficesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(OfficeListItemResponseSchema).readonly() }).readonly().shape, + }); + export type OfficesPaginateResponse = z.infer; + + /** + * FindAllLabelsResponseSchema + * @type { array } + */ + export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type FindAllLabelsResponse = z.infer; + + /** + * OfficesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const OfficesPaginateLabelsOrderParamEnumSchema = z.enum(["name"]); + export type OfficesPaginateLabelsOrderParamEnum = z.infer; + export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * OfficesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const OfficesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type OfficesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/offices/offices.queries.ts b/test/generated/dist/offices/offices.queries.ts new file mode 100644 index 0000000..a752a7b --- /dev/null +++ b/test/generated/dist/offices/offices.queries.ts @@ -0,0 +1,510 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { OfficesAcl } from "./offices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { OfficesModels } from "./offices.models"; +import { OfficesApi } from "./offices.api"; + +export namespace OfficesQueries { + export const moduleName = QueryModule.Offices; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: OfficesModels.OfficeFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string) => + [...keys.all, "/offices", "infinite", limit, order, filter, cursor] as const, + findAllLabels: (search?: string) => [...keys.all, "/offices/labels", search] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: OfficesModels.OfficeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: OfficesModels.OfficeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/labels/paginate", "infinite", limit, order, filter, cursor] as const, + get: (id: string) => [...keys.all, "/offices/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate offices + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: OfficesModels.OfficeFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => OfficesApi.paginate(limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate offices + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: OfficesModels.OfficeFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => OfficesApi.paginate(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create new office + * @permission Requires `canUseCreate` ability + * @param { OfficesModels.CreateOfficeRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(OfficesAcl.canUseCreate()); + return OfficesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindAllLabels` + * @summary List all offices with only their labels + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllLabels = ( + { search }: { search?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.findAllLabels(search), + queryFn: () => OfficesApi.findAllLabels(search, config), + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate offices with only their labels + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: OfficesModels.OfficeLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => OfficesApi.paginateLabels(limit, order, filter, page, cursor, config), + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate offices with only their labels + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: OfficesModels.OfficeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGet` + * @summary Get office by id + * @permission Requires `canUseGet` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(id), + queryFn: () => { + checkAcl(OfficesAcl.canUseGet()); + return OfficesApi.get(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update office + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { OfficesModels.UpdateOfficeRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(OfficesAcl.canUseUpdate()); + return OfficesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUploadDocumentImage` + * @summary Upload document image for an office + * @permission Requires `canUseUploadDocumentImage` ability + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UploadOfficeDocumentRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useUploadDocumentImage = ( + options?: AppMutationOptions< + typeof OfficesApi.uploadDocumentImage, + { + officeId: string; + data: OfficesModels.UploadOfficeDocumentRequestDto; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId })); + const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreateBankAccount` + * @summary Create office bank account + * @permission Requires `canUseCreateBankAccount` ability + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.CreateOfficeBankAccountDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateBankAccount = ( + options?: AppMutationOptions< + typeof OfficesApi.createBankAccount, + { officeId: string; data: OfficesModels.CreateOfficeBankAccountDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId })); + return OfficesApi.createBankAccount(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateBankAccount` + * @summary Update office bank account + * @permission Requires `canUseUpdateBankAccount` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UpdateOfficeBankAccountDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBankAccount = ( + options?: AppMutationOptions< + typeof OfficesApi.updateBankAccount, + { accountId: string; officeId: string; data: OfficesModels.UpdateOfficeBankAccountDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ accountId, officeId, data }) => { + checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId })); + return OfficesApi.updateBankAccount(accountId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteBankAccount` + * @summary Delete office bank account + * @permission Requires `canUseDeleteBankAccount` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteBankAccount = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ accountId, officeId }) => { + checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId })); + return OfficesApi.deleteBankAccount(accountId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUploadBankAccountFooter` + * @summary Upload office bank account footer + * @permission Requires `canUseUploadBankAccountFooter` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UploadOfficeBankAccountFooterRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useUploadBankAccountFooter = ( + options?: AppMutationOptions< + typeof OfficesApi.uploadBankAccountFooter, + { + accountId: string; + officeId: string; + data: OfficesModels.UploadOfficeBankAccountFooterRequestDto; + file?: File; + abortController?: AbortController; + onUploadProgress?: (progress: { loaded: number; total: number }) => void; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId })); + const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/packageTypes/packageTypes.acl.ts b/test/generated/dist/packageTypes/packageTypes.acl.ts new file mode 100644 index 0000000..625e4db --- /dev/null +++ b/test/generated/dist/packageTypes/packageTypes.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PackageTypesAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "PackageType"] as AbilityTuple<"Create", "PackageType">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "PackageType"] as AbilityTuple<"Update", "PackageType">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "PackageType"] as AbilityTuple<"Archive", "PackageType">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "PackageType"] as AbilityTuple<"Archive", "PackageType">; +} diff --git a/test/generated/dist/packageTypes/packageTypes.api.ts b/test/generated/dist/packageTypes/packageTypes.api.ts new file mode 100644 index 0000000..802998e --- /dev/null +++ b/test/generated/dist/packageTypes/packageTypes.api.ts @@ -0,0 +1,125 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PackageTypesModels } from "./packageTypes.models"; + +export namespace PackageTypesApi { + export const paginate = ( + limit: number, + order?: string, + filter?: PackageTypesModels.PackageTypePaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, `/package-types`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types`, + ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), + config, + ); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: PackageTypesModels.PackageTypeLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, + `/package-types/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}`, + config, + ); + }; + export const update = ( + id: string, + data: PackageTypesModels.UpdatePackageTypeRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}`, + ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/packageTypes/packageTypes.configs.ts b/test/generated/dist/packageTypes/packageTypes.configs.ts new file mode 100644 index 0000000..786762d --- /dev/null +++ b/test/generated/dist/packageTypes/packageTypes.configs.ts @@ -0,0 +1,128 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PackageTypesModels } from "./packageTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PackageTypesQueries } from "./packageTypes.queries"; +import { PackageTypesAcl } from "./packageTypes.acl"; + +export namespace PackageTypesConfigs { + export const packageTypesConfig = { + meta: { + title: "Package Types", + }, + readAll: { + acl: PackageTypesAcl.canUsePaginate, + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + paginated: PackageTypesQueries.usePaginate, + infinite: PackageTypesQueries.usePaginateInfinite, + filters: { + schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + length: true, + width: true, + height: true, + unit: true, + archived: true, + code: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: PackageTypesAcl.canUseFindById, + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + query: PackageTypesQueries.useFindById, + }, + create: { + acl: PackageTypesAcl.canUseCreate, + schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, + mutation: PackageTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, + options: { + inputs: { + name: true, + length: true, + width: true, + height: true, + unit: true, + code: true, + }, + }, + }), + }, + update: { + acl: PackageTypesAcl.canUseUpdate, + schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, + mutation: PackageTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, + options: { + inputs: { + name: true, + length: true, + width: true, + height: true, + unit: true, + code: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: PackageTypesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PackageTypesQueries.usePaginateLabels, + infinite: PackageTypesQueries.usePaginateLabelsInfinite, + filters: { + schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/packageTypes/packageTypes.models.ts b/test/generated/dist/packageTypes/packageTypes.models.ts new file mode 100644 index 0000000..ab3d38c --- /dev/null +++ b/test/generated/dist/packageTypes/packageTypes.models.ts @@ -0,0 +1,572 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PackageTypesModels { + /** + * PackageTypeCodeEnumSchema + * @type { enum } + */ + export const PackageTypeCodeEnumSchema = z.enum([ + "1A", + "1B", + "1D", + "1F", + "1G", + "1W", + "2C", + "3A", + "3H", + "43", + "44", + "4A", + "4B", + "4C", + "4D", + "4F", + "4G", + "4H", + "5H", + "5L", + "5M", + "6H", + "6P", + "7A", + "7B", + "8A", + "8B", + "8C", + "AA", + "AB", + "AC", + "AD", + "AE", + "AF", + "AG", + "AH", + "AI", + "AJ", + "AL", + "AM", + "AP", + "AT", + "AV", + "B4", + "BA", + "BB", + "BC", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BK", + "BL", + "BM", + "BN", + "BO", + "BP", + "BQ", + "BR", + "BS", + "BT", + "BU", + "BV", + "BW", + "BX", + "BY", + "BZ", + "CA", + "CB", + "CC", + "CD", + "CE", + "CF", + "CG", + "CH", + "CI", + "CJ", + "CK", + "CL", + "CM", + "CN", + "CO", + "CP", + "CQ", + "CR", + "CS", + "CT", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DA", + "DB", + "DC", + "DG", + "DH", + "DI", + "DJ", + "DK", + "DL", + "DM", + "DN", + "DP", + "DR", + "DS", + "DT", + "DU", + "DV", + "DW", + "DX", + "DY", + "EC", + "ED", + "EE", + "EF", + "EG", + "EH", + "EI", + "EN", + "FB", + "FC", + "FD", + "FE", + "FI", + "FL", + "FO", + "FP", + "FR", + "FT", + "FW", + "FX", + "GB", + "GI", + "GL", + "GR", + "GU", + "GY", + "GZ", + "HA", + "HB", + "HC", + "HG", + "HN", + "HR", + "IA", + "IB", + "IC", + "ID", + "IE", + "IF", + "IG", + "IH", + "IK", + "IL", + "IN", + "IZ", + "JB", + "JC", + "JG", + "JR", + "JT", + "JY", + "KG", + "KI", + "LE", + "LG", + "LT", + "LU", + "LV", + "LZ", + "MA", + "MB", + "MC", + "ME", + "MR", + "MS", + "MT", + "MW", + "MX", + "NA", + "NE", + "NF", + "NG", + "NS", + "NT", + "NU", + "NV", + "OA", + "OB", + "OC", + "OD", + "OE", + "OF", + "OK", + "OT", + "OU", + "P2", + "PA", + "PB", + "PC", + "PD", + "PE", + "PF", + "PG", + "PH", + "PI", + "PJ", + "PK", + "PL", + "PN", + "PO", + "PP", + "PR", + "PT", + "PU", + "PV", + "PX", + "PY", + "PZ", + "QA", + "QB", + "QC", + "QD", + "QF", + "QG", + "QH", + "QJ", + "QK", + "QL", + "QM", + "QN", + "QP", + "QQ", + "QR", + "QS", + "RD", + "RG", + "RJ", + "RK", + "RL", + "RO", + "RT", + "RZ", + "SA", + "SB", + "SC", + "SD", + "SE", + "SH", + "SI", + "SK", + "SL", + "SM", + "SO", + "SP", + "SS", + "ST", + "SU", + "SV", + "SW", + "SY", + "SZ", + "T1", + "TB", + "TC", + "TD", + "TE", + "TG", + "TI", + "TK", + "TL", + "TN", + "TO", + "TR", + "TS", + "TT", + "TU", + "TV", + "TW", + "TY", + "TZ", + "UC", + "UN", + "VA", + "VG", + "VI", + "VK", + "VL", + "VO", + "VP", + "VQ", + "VN", + "VR", + "VS", + "VY", + "WA", + "WB", + "WC", + "WD", + "WF", + "WG", + "WH", + "WJ", + "WK", + "WL", + "WM", + "WN", + "WP", + "WQ", + "WR", + "WS", + "WT", + "WU", + "WV", + "WW", + "WX", + "WY", + "WZ", + "XA", + "XB", + "XC", + "XD", + "XF", + "XG", + "XH", + "XJ", + "XK", + "YA", + "YB", + "YC", + "YD", + "YF", + "YG", + "YH", + "YJ", + "YK", + "YL", + "YM", + "YN", + "YP", + "YQ", + "YR", + "YS", + "YT", + "YV", + "YW", + "YX", + "YY", + "YZ", + "ZA", + "ZB", + "ZC", + "ZD", + "ZF", + "ZG", + "ZH", + "ZJ", + "ZK", + "ZL", + "ZM", + "ZN", + "ZP", + "ZQ", + "ZR", + "ZS", + "ZT", + "ZU", + "ZV", + "ZW", + "ZX", + "ZY", + "ZZ", + ]); + export type PackageTypeCodeEnum = z.infer; + export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; + + /** + * PackageTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type PackageTypeEmployeeDTO = z.infer; + + /** + * PackageTypeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the package type + * @property { string } name Unique name for the package type + * @property { number } length Length of the package type + * @property { number } width Width of the package type + * @property { number } height Height of the package type + * @property { string } unit Measurement unit for dimensions + * @property { boolean } archived Indicates if the package type is archived + * @property { PackageTypeCodeEnum } code + * @property { string } createdById + * @property { PackageTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PackageTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const PackageTypeResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier for the package type"), + name: z.string().describe("Unique name for the package type"), + length: z.number().describe("Length of the package type").nullish(), + width: z.number().describe("Width of the package type").nullish(), + height: z.number().describe("Height of the package type").nullish(), + unit: z.string().describe("Measurement unit for dimensions"), + archived: z.boolean().describe("Indicates if the package type is archived"), + code: PackageTypeCodeEnumSchema.nullish(), + createdById: z.string().nullish(), + createdBy: PackageTypeEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: PackageTypeEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type PackageTypeResponseDTO = z.infer; + + /** + * CreatePackageTypeRequestDTOSchema + * @type { object } + * @property { string } name Unique name for the package type + * @property { number } length Length of the package type + * @property { number } width Width of the package type + * @property { number } height Height of the package type + * @property { string } unit Measurement unit for dimensions + * @property { PackageTypeCodeEnum } code + */ + export const CreatePackageTypeRequestDTOSchema = z + .object({ + name: z.string().describe("Unique name for the package type"), + length: z.number().describe("Length of the package type").nullish(), + width: z.number().describe("Width of the package type").nullish(), + height: z.number().describe("Height of the package type").nullish(), + unit: z.string().describe("Measurement unit for dimensions"), + code: PackageTypeCodeEnumSchema.nullish(), + }) + .readonly(); + export type CreatePackageTypeRequestDTO = z.infer; + + /** + * UpdatePackageTypeRequestDTOSchema + * @type { object } + * @property { string } name Updated name for package type + * @property { number } length Updated length of the package type + * @property { number } width Updated width of the package type + * @property { number } height Updated height of the package type + * @property { string } unit Updated measurement unit for dimensions + * @property { PackageTypeCodeEnum } code + */ + export const UpdatePackageTypeRequestDTOSchema = z + .object({ + name: z.string().describe("Updated name for package type"), + length: z.number().describe("Updated length of the package type").nullable(), + width: z.number().describe("Updated width of the package type").nullable(), + height: z.number().describe("Updated height of the package type").nullable(), + unit: z.string().describe("Updated measurement unit for dimensions"), + code: PackageTypeCodeEnumSchema, + }) + .readonly(); + export type UpdatePackageTypeRequestDTO = z.infer; + + /** + * PackageTypePaginationFilterDtoSchema + * @type { object } + * @property { boolean } archived Archived + * @property { string } search + */ + export const PackageTypePaginationFilterDtoSchema = z + .object({ archived: z.boolean().describe("Archived"), search: z.string() }) + .readonly(); + export type PackageTypePaginationFilterDto = z.infer; + + /** + * PackageTypeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const PackageTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type PackageTypeLabelFilterDto = z.infer; + + /** + * PackageTypesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const PackageTypesPaginateOrderParamEnumSchema = z.enum([ + "matchCode", + "description", + "length", + "width", + "height", + "unit", + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PackageTypesPaginateOrderParamEnum = z.infer; + export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParamEnumSchema.enum; + + /** + * PackageTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PackageTypeResponseDTO[] } items + */ + export const PackageTypesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PackageTypeResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PackageTypesPaginateResponse = z.infer; + + /** + * PackageTypesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PackageTypesPaginateLabelsOrderParamEnumSchema = z.enum([ + "matchCode", + "description", + "length", + "width", + "height", + "unit", + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PackageTypesPaginateLabelsOrderParamEnum = z.infer; + export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * PackageTypesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PackageTypesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PackageTypesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/packageTypes/packageTypes.queries.ts b/test/generated/dist/packageTypes/packageTypes.queries.ts new file mode 100644 index 0000000..2550517 --- /dev/null +++ b/test/generated/dist/packageTypes/packageTypes.queries.ts @@ -0,0 +1,365 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PackageTypesAcl } from "./packageTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PackageTypesModels } from "./packageTypes.models"; +import { PackageTypesApi } from "./packageTypes.api"; + +export namespace PackageTypesQueries { + export const moduleName = QueryModule.PackageTypes; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: PackageTypesModels.PackageTypePaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/package-types", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: PackageTypesModels.PackageTypePaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/package-types", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: PackageTypesModels.PackageTypeLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/package-types/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: PackageTypesModels.PackageTypeLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/package-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/package-types/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Package Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: PackageTypesModels.PackageTypePaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PackageTypesAcl.canUsePaginate()); + return PackageTypesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Package Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: PackageTypesModels.PackageTypePaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PackageTypesAcl.canUsePaginate()); + return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new Package Type + * @permission Requires `canUseCreate` ability + * @param { PackageTypesModels.CreatePackageTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof PackageTypesApi.create, + { data: PackageTypesModels.CreatePackageTypeRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PackageTypesAcl.canUseCreate()); + return PackageTypesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate package type labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: PackageTypesModels.PackageTypeLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PackageTypesAcl.canUsePaginateLabels()); + return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate package type labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: PackageTypesModels.PackageTypeLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PackageTypesAcl.canUsePaginateLabels()); + return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get Package Type by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PackageTypesAcl.canUseFindById()); + return PackageTypesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Package Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PackageTypesModels.UpdatePackageTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof PackageTypesApi.update, + { id: string; data: PackageTypesModels.UpdatePackageTypeRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PackageTypesAcl.canUseUpdate()); + return PackageTypesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive Package Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PackageTypesAcl.canUseArchive()); + return PackageTypesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive Package Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PackageTypesAcl.canUseUnarchive()); + return PackageTypesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/partnerNetworks/partnerNetworks.acl.ts b/test/generated/dist/partnerNetworks/partnerNetworks.acl.ts new file mode 100644 index 0000000..ff36863 --- /dev/null +++ b/test/generated/dist/partnerNetworks/partnerNetworks.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PartnerNetworksAcl { + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "PartnerNetwork"] as AbilityTuple<"Create", "PartnerNetwork">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "PartnerNetwork"] as AbilityTuple<"Update", "PartnerNetwork">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "PartnerNetwork"] as AbilityTuple<"Archive", "PartnerNetwork">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "PartnerNetwork"] as AbilityTuple<"Archive", "PartnerNetwork">; +} diff --git a/test/generated/dist/partnerNetworks/partnerNetworks.api.ts b/test/generated/dist/partnerNetworks/partnerNetworks.api.ts new file mode 100644 index 0000000..060f922 --- /dev/null +++ b/test/generated/dist/partnerNetworks/partnerNetworks.api.ts @@ -0,0 +1,129 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; + +export namespace PartnerNetworksApi { + export const paginateLabels = ( + limit: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, + `/partner-networks/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const paginate = ( + limit: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, + `/partner-networks`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks`, + ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), + config, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}`, + config, + ); + }; + export const update = ( + id: string, + data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}`, + ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/partnerNetworks/partnerNetworks.configs.ts b/test/generated/dist/partnerNetworks/partnerNetworks.configs.ts new file mode 100644 index 0000000..1f87ddf --- /dev/null +++ b/test/generated/dist/partnerNetworks/partnerNetworks.configs.ts @@ -0,0 +1,113 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PartnerNetworksQueries } from "./partnerNetworks.queries"; +import { PartnerNetworksAcl } from "./partnerNetworks.acl"; + +export namespace PartnerNetworksConfigs { + export const partnerNetworksConfig = { + meta: { + title: "Partner Networks", + }, + readAll: { + acl: PartnerNetworksAcl.canUsePaginate, + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + paginated: PartnerNetworksQueries.usePaginate, + infinite: PartnerNetworksQueries.usePaginateInfinite, + filters: { + schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: PartnerNetworksAcl.canUseFindById, + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + query: PartnerNetworksQueries.useFindById, + }, + create: { + acl: PartnerNetworksAcl.canUseCreate, + schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, + mutation: PartnerNetworksQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + update: { + acl: PartnerNetworksAcl.canUseUpdate, + schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, + mutation: PartnerNetworksQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: PartnerNetworksAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PartnerNetworksQueries.usePaginateLabels, + infinite: PartnerNetworksQueries.usePaginateLabelsInfinite, + filters: { + schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/partnerNetworks/partnerNetworks.models.ts b/test/generated/dist/partnerNetworks/partnerNetworks.models.ts new file mode 100644 index 0000000..694c1ed --- /dev/null +++ b/test/generated/dist/partnerNetworks/partnerNetworks.models.ts @@ -0,0 +1,142 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PartnerNetworksModels { + /** + * PartnerNetworkEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type PartnerNetworkEmployeeDTO = z.infer; + + /** + * PartnerNetworkResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the partner network + * @property { string } name Name of the partner network + * @property { boolean } archived Whether the partner network is archived + * @property { string } createdById + * @property { PartnerNetworkEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PartnerNetworkEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const PartnerNetworkResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the partner network"), + name: z.string().describe("Name of the partner network"), + archived: z.boolean().describe("Whether the partner network is archived"), + createdById: z.string().nullish(), + createdBy: PartnerNetworkEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: PartnerNetworkEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type PartnerNetworkResponseDTO = z.infer; + + /** + * PartnerNetworkLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const PartnerNetworkLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type PartnerNetworkLabelFilterDto = z.infer; + + /** + * PartnerNetworkPaginationFilterDtoSchema + * @type { object } + * @property { string } search Free search + * @property { boolean } archived + */ + export const PartnerNetworkPaginationFilterDtoSchema = z + .object({ search: z.string().describe("Free search"), archived: z.boolean() }) + .readonly(); + export type PartnerNetworkPaginationFilterDto = z.infer; + + /** + * CreatePartnerNetworkRequestDTOSchema + * @type { object } + * @property { string } name Name of the partner network + */ + export const CreatePartnerNetworkRequestDTOSchema = z + .object({ name: z.string().describe("Name of the partner network") }) + .readonly(); + export type CreatePartnerNetworkRequestDTO = z.infer; + + /** + * UpdatePartnerNetworkRequestDTOSchema + * @type { object } + * @property { string } name Name of the partner network + */ + export const UpdatePartnerNetworkRequestDTOSchema = z + .object({ name: z.string().describe("Name of the partner network") }) + .readonly(); + export type UpdatePartnerNetworkRequestDTO = z.infer; + + /** + * PartnerNetworksPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PartnerNetworksPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PartnerNetworksPaginateLabelsOrderParamEnum = z.infer< + typeof PartnerNetworksPaginateLabelsOrderParamEnumSchema + >; + export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPaginateLabelsOrderParamEnumSchema.enum; + + /** + * PartnerNetworksPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PartnerNetworksPaginateLabelsResponse = z.infer; + + /** + * PartnerNetworksPaginateOrderParamEnumSchema + * @type { enum } + */ + export const PartnerNetworksPaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PartnerNetworksPaginateOrderParamEnum = z.infer; + export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrderParamEnumSchema.enum; + + /** + * PartnerNetworksPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerNetworkResponseDTO[] } items + */ + export const PartnerNetworksPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PartnerNetworksPaginateResponse = z.infer; +} diff --git a/test/generated/dist/partnerNetworks/partnerNetworks.queries.ts b/test/generated/dist/partnerNetworks/partnerNetworks.queries.ts new file mode 100644 index 0000000..cd0e2ae --- /dev/null +++ b/test/generated/dist/partnerNetworks/partnerNetworks.queries.ts @@ -0,0 +1,370 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PartnerNetworksAcl } from "./partnerNetworks.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; +import { PartnerNetworksApi } from "./partnerNetworks.api"; + +export namespace PartnerNetworksQueries { + export const moduleName = QueryModule.PartnerNetworks; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/partner-networks/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/partner-networks/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginate: ( + limit?: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/partner-networks", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/partner-networks", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/partner-networks/:id", id] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate partner networks with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); + return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate partner networks with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); + return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginate` + * @summary Paginate Partner Networks + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUsePaginate()); + return PartnerNetworksApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Partner Networks + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { + limit: number; + order?: string; + filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PartnerNetworksAcl.canUsePaginate()); + return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new Partner Network + * @permission Requires `canUseCreate` ability + * @param { PartnerNetworksModels.CreatePartnerNetworkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof PartnerNetworksApi.create, + { data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PartnerNetworksAcl.canUseCreate()); + return PartnerNetworksApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get Partner Network by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUseFindById()); + return PartnerNetworksApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update Partner Network + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof PartnerNetworksApi.update, + { id: string; data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PartnerNetworksAcl.canUseUpdate()); + return PartnerNetworksApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive Partner Network + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PartnerNetworksAcl.canUseArchive()); + return PartnerNetworksApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive Partner Network + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PartnerNetworksAcl.canUseUnarchive()); + return PartnerNetworksApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/paymentConfirmations/paymentConfirmations.acl.ts b/test/generated/dist/paymentConfirmations/paymentConfirmations.acl.ts new file mode 100644 index 0000000..972a857 --- /dev/null +++ b/test/generated/dist/paymentConfirmations/paymentConfirmations.acl.ts @@ -0,0 +1,39 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PaymentConfirmationsAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read payment confirmation items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate payment confirmation document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ + export const canUseGenerate = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; + + /** + * Use for `useGetEml` mutation ability. For global ability, omit the object parameter. + * @description Download payment confirmation as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetEml` mutation + */ + export const canUseGetEml = (object?: { officeId: string }) => + ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< + "Read", + "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/paymentConfirmations/paymentConfirmations.api.ts b/test/generated/dist/paymentConfirmations/paymentConfirmations.api.ts new file mode 100644 index 0000000..2f69bde --- /dev/null +++ b/test/generated/dist/paymentConfirmations/paymentConfirmations.api.ts @@ -0,0 +1,86 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; + +export namespace PaymentConfirmationsApi { + export const get = ( + officeId: string, + filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, + limit: number, + order?: string, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, + `/offices/${officeId}/payment-confirmations`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const generate = ( + officeId: string, + data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payment-confirmations/generate`, + ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const getEml = ( + officeId: string, + data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payment-confirmations/eml`, + ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/dist/paymentConfirmations/paymentConfirmations.configs.ts b/test/generated/dist/paymentConfirmations/paymentConfirmations.configs.ts new file mode 100644 index 0000000..79c3145 --- /dev/null +++ b/test/generated/dist/paymentConfirmations/paymentConfirmations.configs.ts @@ -0,0 +1,48 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; +import { PaymentConfirmationsQueries } from "./paymentConfirmations.queries"; +import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; + +export namespace PaymentConfirmationsConfigs { + export const paymentConfirmationsConfig = { + meta: { + title: "Payment Confirmations", + }, + readAll: { + acl: PaymentConfirmationsAcl.canUseGet, + schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, + paginated: PaymentConfirmationsQueries.useGet, + infinite: PaymentConfirmationsQueries.useGetInfinite, + filters: { + schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, + options: { + inputs: { + businessPartnerId: true, + paymentDate: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, + options: { + columns: { + invoiceId: true, + invoiceNumber: true, + invoiceDate: true, + invoiceAmount: true, + amount: true, + currencyNotation: true, + reference: true, + position: true, + paymentDate: true, + }, + sortable: PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/paymentConfirmations/paymentConfirmations.models.ts b/test/generated/dist/paymentConfirmations/paymentConfirmations.models.ts new file mode 100644 index 0000000..f7c4296 --- /dev/null +++ b/test/generated/dist/paymentConfirmations/paymentConfirmations.models.ts @@ -0,0 +1,95 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PaymentConfirmationsModels { + /** + * PaymentConfirmationPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ + export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); + export type PaymentConfirmationPositionDto = z.infer; + + /** + * PaymentConfirmationItemDtoSchema + * @type { object } + * @property { string } invoiceId Invoice ID + * @property { string } invoiceNumber Invoice number + * @property { string } invoiceDate Invoice date + * @property { number } invoiceAmount Invoice amount + * @property { number } amount Payment amount + * @property { string } currencyNotation Currency notation + * @property { string } reference Reference + * @property { PaymentConfirmationPositionDto } position Position information + * @property { string } paymentDate Payment date + */ + export const PaymentConfirmationItemDtoSchema = z + .object({ + invoiceId: z.string().describe("Invoice ID"), + invoiceNumber: z.string().describe("Invoice number"), + invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date"), + invoiceAmount: z.number().describe("Invoice amount"), + amount: z.number().describe("Payment amount"), + currencyNotation: z.string().describe("Currency notation"), + reference: z.string().describe("Reference").nullish(), + position: PaymentConfirmationPositionDtoSchema.describe("Position information"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), + }) + .readonly(); + export type PaymentConfirmationItemDto = z.infer; + + /** + * PaymentConfirmationItemFilterDtoSchema + * @type { object } + * @property { string } businessPartnerId Business partner ID + * @property { string } paymentDate Payment date + */ + export const PaymentConfirmationItemFilterDtoSchema = z + .object({ + businessPartnerId: z.string().describe("Business partner ID"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), + }) + .readonly(); + export type PaymentConfirmationItemFilterDto = z.infer; + + /** + * GeneratePaymentConfirmationRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId Business partner ID + * @property { string } paymentDate Payment date + * @property { string } positionId Position ID (optional) + */ + export const GeneratePaymentConfirmationRequestDtoSchema = z + .object({ + businessPartnerId: z.string().describe("Business partner ID"), + paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), + positionId: z.string().describe("Position ID (optional)").nullish(), + }) + .readonly(); + export type GeneratePaymentConfirmationRequestDto = z.infer; + + /** + * PaymentConfirmationsGetOrderParamEnumSchema + * @type { enum } + */ + export const PaymentConfirmationsGetOrderParamEnumSchema = z.enum(["paymentDate", "invoiceNumber", "amount"]); + export type PaymentConfirmationsGetOrderParamEnum = z.infer; + export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrderParamEnumSchema.enum; + + /** + * PaymentConfirmationsGetResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PaymentConfirmationItemDto[] } items + */ + export const PaymentConfirmationsGetResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).readonly() }).readonly().shape, + }); + export type PaymentConfirmationsGetResponse = z.infer; +} diff --git a/test/generated/dist/paymentConfirmations/paymentConfirmations.queries.ts b/test/generated/dist/paymentConfirmations/paymentConfirmations.queries.ts new file mode 100644 index 0000000..265dcc4 --- /dev/null +++ b/test/generated/dist/paymentConfirmations/paymentConfirmations.queries.ts @@ -0,0 +1,204 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; +import { PaymentConfirmationsApi } from "./paymentConfirmations.api"; + +export namespace PaymentConfirmationsQueries { + export const moduleName = QueryModule.PaymentConfirmations; + + export const keys = { + all: [moduleName] as const, + get: ( + officeId: string, + filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, + limit?: number, + order?: string, + page?: number, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/payment-confirmations", officeId, filter, limit, order, page, cursor] as const, + getInfinite: ( + officeId: string, + filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, + limit?: number, + order?: string, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/payment-confirmations", + "infinite", + officeId, + filter, + limit, + order, + cursor, + ] as const, + }; + + /** + * Query `useGet` + * @summary Get payment confirmation items + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { + officeId, + filter, + limit, + order, + page, + cursor, + }: { + officeId: string; + filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto; + limit: number; + order?: string; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, filter, limit, order, page, cursor), + queryFn: () => { + checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId })); + return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useGetInfinite + * @summary Get payment confirmation items + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useGetInfinite = ( + { + officeId, + filter, + limit, + order, + cursor, + }: { + officeId: string; + filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto; + limit: number; + order?: string; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId })); + return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useGenerate` - recommended when file should not be cached + * @summary Generate payment confirmation PDF + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useGenerate = ( + options?: AppMutationOptions< + typeof PaymentConfirmationsApi.generate, + { officeId: string; data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId })); + return PaymentConfirmationsApi.generate(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGetEml` - recommended when file should not be cached + * @summary Get payment confirmation as EML file with PDF attachment + * @permission Requires `canUseGetEml` ability + * @param { string } mutation.officeId Path parameter + * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useGetEml = ( + options?: AppMutationOptions< + typeof PaymentConfirmationsApi.getEml, + { officeId: string; data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId })); + return PaymentConfirmationsApi.getEml(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/ports/ports.acl.ts b/test/generated/dist/ports/ports.acl.ts new file mode 100644 index 0000000..41bc6d7 --- /dev/null +++ b/test/generated/dist/ports/ports.acl.ts @@ -0,0 +1,33 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PortsAcl { + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Port"] as AbilityTuple<"Create", "Port">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Port"] as AbilityTuple<"Update", "Port">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; +} diff --git a/test/generated/dist/ports/ports.api.ts b/test/generated/dist/ports/ports.api.ts new file mode 100644 index 0000000..46b8eac --- /dev/null +++ b/test/generated/dist/ports/ports.api.ts @@ -0,0 +1,96 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PortsModels } from "./ports.models"; + +export namespace PortsApi { + export const paginate = ( + limit: number, + order?: string, + filter?: PortsModels.PortPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: PortsModels.PortsPaginateResponseSchema }, `/ports`, { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { + type: "query", + name: "order", + }), + filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: PortsModels.CreatePortRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports`, + ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), + config, + ); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: PortsModels.PortLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, `/ports/labels/paginate`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports/${id}`, + ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), + config, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: PortsModels.PortResponseDTOSchema }, `/ports/${id}`, config); + }; +} diff --git a/test/generated/dist/ports/ports.configs.ts b/test/generated/dist/ports/ports.configs.ts new file mode 100644 index 0000000..de7e09d --- /dev/null +++ b/test/generated/dist/ports/ports.configs.ts @@ -0,0 +1,127 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PortsModels } from "./ports.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PortsQueries } from "./ports.queries"; +import { PortsAcl } from "./ports.acl"; + +export namespace PortsConfigs { + export const portsConfig = { + meta: { + title: "Ports", + }, + readAll: { + acl: PortsAcl.canUsePaginate, + schema: PortsModels.PortResponseDTOSchema, + paginated: PortsQueries.usePaginate, + infinite: PortsQueries.usePaginateInfinite, + filters: { + schema: PortsModels.PortPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PortsModels.PortPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PortsModels.PortResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + address: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PortsModels.PortsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: PortsAcl.canUseFindById, + schema: PortsModels.PortResponseDTOSchema, + query: PortsQueries.useFindById, + }, + create: { + acl: PortsAcl.canUseCreate, + schema: PortsModels.CreatePortRequestDTOSchema, + mutation: PortsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PortsModels.CreatePortRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, + }), + }, + update: { + acl: PortsAcl.canUseUpdate, + schema: PortsModels.UpdatePortRequestDTOSchema, + mutation: PortsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PortsModels.UpdatePortRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: PortsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PortsQueries.usePaginateLabels, + infinite: PortsQueries.usePaginateLabelsInfinite, + filters: { + schema: PortsModels.PortLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PortsModels.PortLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PortsModels.PortsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/ports/ports.models.ts b/test/generated/dist/ports/ports.models.ts new file mode 100644 index 0000000..caec629 --- /dev/null +++ b/test/generated/dist/ports/ports.models.ts @@ -0,0 +1,217 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PortsModels { + /** + * PortCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type PortCityDto = z.infer; + + /** + * PortCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ + export const PortCountryDtoSchema = z + .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) + .readonly(); + export type PortCountryDto = z.infer; + + /** + * PortAddressDtoSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { PortCityDto } city + * @property { string } district District name + * @property { PortCountryDto } country + */ + export const PortAddressDtoSchema = z + .object({ + street: z.string().describe("Street address"), + zip: z.string().describe("ZIP/Postal code"), + city: PortCityDtoSchema.nullish(), + district: z.string().describe("District name").nullish(), + country: PortCountryDtoSchema.nullish(), + }) + .readonly(); + export type PortAddressDto = z.infer; + + /** + * PortEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type PortEmployeeDTO = z.infer; + + /** + * PortResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the port + * @property { string } name Name of the port + * @property { string } matchCode Match code for the port + * @property { PortAddressDto } address Address details of the port + * @property { string } createdById + * @property { PortEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PortEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const PortResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the port"), + name: z.string().describe("Name of the port"), + matchCode: z.string().describe("Match code for the port"), + address: PortAddressDtoSchema.describe("Address details of the port"), + createdById: z.string().nullish(), + createdBy: PortEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: PortEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type PortResponseDTO = z.infer; + + /** + * PortPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter ports by name or match code + */ + export const PortPaginationFilterDtoSchema = z + .object({ search: z.string().describe("Search term to filter ports by name or match code") }) + .readonly(); + export type PortPaginationFilterDto = z.infer; + + /** + * PortLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const PortLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type PortLabelFilterDto = z.infer; + + /** + * CreatePortRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } matchCode + * @property { string } street Street address + * @property { string } secondaryStreet + * @property { string } zip ZIP / Postal code + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } district + */ + export const CreatePortRequestDTOSchema = z + .object({ + name: z.string(), + matchCode: z.string(), + street: z.string().describe("Street address"), + secondaryStreet: z.string().nullish(), + zip: z.string().describe("ZIP / Postal code"), + cityId: z.string().describe("City id"), + countryId: z.string().describe("Country id"), + district: z.string().nullish(), + }) + .readonly(); + export type CreatePortRequestDTO = z.infer; + + /** + * UpdatePortRequestDTOSchema + * @type { object } + * @property { string } name Updated name + * @property { string } matchCode Updated match code + * @property { string } street Updated street address + * @property { string } secondaryStreet Updated secondary street + * @property { string } zip Updated ZIP/Postal code + * @property { string } cityId Updated city id + * @property { string } countryId Updated country id + * @property { string } district + */ + export const UpdatePortRequestDTOSchema = z + .object({ + name: z.string().describe("Updated name"), + matchCode: z.string().describe("Updated match code"), + street: z.string().describe("Updated street address"), + secondaryStreet: z.string().describe("Updated secondary street"), + zip: z.string().describe("Updated ZIP/Postal code"), + cityId: z.string().describe("Updated city id"), + countryId: z.string().describe("Updated country id"), + district: z.string(), + }) + .readonly(); + export type UpdatePortRequestDTO = z.infer; + + /** + * PortsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const PortsPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PortsPaginateOrderParamEnum = z.infer; + export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enum; + + /** + * PortsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PortResponseDTO[] } items + */ + export const PortsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PortResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PortsPaginateResponse = z.infer; + + /** + * PortsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PortsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PortsPaginateLabelsOrderParamEnum = z.infer; + export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * PortsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PortsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PortsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/ports/ports.queries.ts b/test/generated/dist/ports/ports.queries.ts new file mode 100644 index 0000000..41a7842 --- /dev/null +++ b/test/generated/dist/ports/ports.queries.ts @@ -0,0 +1,281 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PortsAcl } from "./ports.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PortsModels } from "./ports.models"; +import { PortsApi } from "./ports.api"; + +export namespace PortsQueries { + export const moduleName = QueryModule.Ports; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: PortsModels.PortPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/ports", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string) => + [...keys.all, "/ports", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: PortsModels.PortLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/ports/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: PortsModels.PortLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/ports/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/ports/:id", id] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Ports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: PortsModels.PortPaginationFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PortsAcl.canUsePaginate()); + return PortsApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Ports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: PortsModels.PortPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PortsAcl.canUsePaginate()); + return PortsApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create port + * @permission Requires `canUseCreate` ability + * @param { PortsModels.CreatePortRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PortsAcl.canUseCreate()); + return PortsApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate ports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: PortsModels.PortLabelFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PortsAcl.canUsePaginateLabels()); + return PortsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate ports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: PortsModels.PortLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PortsAcl.canUsePaginateLabels()); + return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update port + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PortsModels.UpdatePortRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PortsAcl.canUseUpdate()); + return PortsApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get port by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PortsAcl.canUseFindById()); + return PortsApi.findById(id, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/positionAccount/positionAccount.acl.ts b/test/generated/dist/positionAccount/positionAccount.acl.ts new file mode 100644 index 0000000..b5691fd --- /dev/null +++ b/test/generated/dist/positionAccount/positionAccount.acl.ts @@ -0,0 +1,15 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionAccountAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Read", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/positionAccount/positionAccount.api.ts b/test/generated/dist/positionAccount/positionAccount.api.ts new file mode 100644 index 0000000..817f5b6 --- /dev/null +++ b/test/generated/dist/positionAccount/positionAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { PositionAccountModels } from "./positionAccount.models"; + +export namespace PositionAccountApi { + export const get = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/account`, + config, + ); + }; +} diff --git a/test/generated/dist/positionAccount/positionAccount.models.ts b/test/generated/dist/positionAccount/positionAccount.models.ts new file mode 100644 index 0000000..c4b204a --- /dev/null +++ b/test/generated/dist/positionAccount/positionAccount.models.ts @@ -0,0 +1,78 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionAccountModels { + /** + * PositionAccountTotalsResponseDtoSchema + * @type { object } + * @property { number } totalBuyRates Total buy rates + * @property { number } totalSellRates Total sell rates + * @property { number } totalProfit Total profit + * @property { number } margin Margin percentage + * @property { number } displayAmount Display amount + * @property { string } displayCurrencyCode Display currency code + */ + export const PositionAccountTotalsResponseDtoSchema = z + .object({ + totalBuyRates: z.number().describe("Total buy rates"), + totalSellRates: z.number().describe("Total sell rates"), + totalProfit: z.number().describe("Total profit"), + margin: z.number().describe("Margin percentage").nullish(), + displayAmount: z.number().describe("Display amount"), + displayCurrencyCode: z.string().describe("Display currency code"), + }) + .readonly(); + export type PositionAccountTotalsResponseDto = z.infer; + + /** + * PositionAccountMasterTotalsDtoSchema + * @type { object } + * @property { PositionAccountTotalsResponseDto } totals + * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency + */ + export const PositionAccountMasterTotalsDtoSchema = z + .object({ + totals: PositionAccountTotalsResponseDtoSchema, + totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), + }) + .readonly(); + export type PositionAccountMasterTotalsDto = z.infer; + + /** + * ChildPositionAccountReferenceDtoSchema + * @type { object } + * @property { string } positionId + * @property { string } positionNumber + * @property { string } accountId + */ + export const ChildPositionAccountReferenceDtoSchema = z + .object({ positionId: z.string().nullish(), positionNumber: z.string(), accountId: z.string() }) + .readonly(); + export type ChildPositionAccountReferenceDto = z.infer; + + /** + * PositionAccountResponseDtoSchema + * @type { object } + * @property { string } id Account ID + * @property { string } positionId Position ID + * @property { string } invoiceId Invoice ID + * @property { CommonModels.PositionAccountItemDtoResponse[] } items Account items + * @property { PositionAccountTotalsResponseDto } totals + * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency + * @property { PositionAccountMasterTotalsDto } masterTotals + * @property { ChildPositionAccountReferenceDto[] } childPositionAccounts + */ + export const PositionAccountResponseDtoSchema = z + .object({ + id: z.string().describe("Account ID"), + positionId: z.string().describe("Position ID").nullish(), + invoiceId: z.string().describe("Invoice ID").nullish(), + items: z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly().describe("Account items"), + totals: PositionAccountTotalsResponseDtoSchema, + totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), + masterTotals: PositionAccountMasterTotalsDtoSchema.nullish(), + childPositionAccounts: z.array(ChildPositionAccountReferenceDtoSchema).readonly().nullish(), + }) + .readonly(); + export type PositionAccountResponseDto = z.infer; +} diff --git a/test/generated/dist/positionAccount/positionAccount.queries.ts b/test/generated/dist/positionAccount/positionAccount.queries.ts new file mode 100644 index 0000000..ed77533 --- /dev/null +++ b/test/generated/dist/positionAccount/positionAccount.queries.ts @@ -0,0 +1,44 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionAccountAcl } from "./positionAccount.acl"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { PositionAccountApi } from "./positionAccount.api"; + +export namespace PositionAccountQueries { + export const moduleName = QueryModule.PositionAccount; + + export const keys = { + all: [moduleName] as const, + get: (positionId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/account", positionId, officeId] as const, + }; + + /** + * Query `useGet` + * @summary Get position account details + * @permission Requires `canUseGet` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { positionId, officeId }: { positionId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(positionId, officeId), + queryFn: () => { + checkAcl(PositionAccountAcl.canUseGet({ officeId })); + return PositionAccountApi.get(positionId, officeId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/positionAccountItems/positionAccountItems.acl.ts b/test/generated/dist/positionAccountItems/positionAccountItems.acl.ts new file mode 100644 index 0000000..8602826 --- /dev/null +++ b/test/generated/dist/positionAccountItems/positionAccountItems.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionAccountItemsAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Update", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useDeletePositionAccountItems` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePositionAccountItems` mutation + */ + export const canUseDeletePositionAccountItems = (object?: { officeId: string }) => + ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Update", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Update", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ + export const canUseDuplicate = (object?: { officeId: string }) => + ["Duplicate", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Duplicate", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useReassign` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReassign` mutation + */ + export const canUseReassign = (object?: { officeId: string }) => + ["Reassign", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Reassign", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useReorder` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation + */ + export const canUseReorder = (object?: { officeId: string }) => + ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Update", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/positionAccountItems/positionAccountItems.api.ts b/test/generated/dist/positionAccountItems/positionAccountItems.api.ts new file mode 100644 index 0000000..c4f0ecf --- /dev/null +++ b/test/generated/dist/positionAccountItems/positionAccountItems.api.ts @@ -0,0 +1,87 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionAccountItemsModels } from "./positionAccountItems.models"; + +export namespace PositionAccountItemsApi { + export const create = ( + positionId: string, + officeId: string, + data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), + config, + ); + }; + export const deletePositionAccountItems = ( + positionId: string, + officeId: string, + data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), + config, + ); + }; + export const update = ( + positionId: string, + officeId: string, + data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), + config, + ); + }; + export const duplicate = ( + positionId: string, + officeId: string, + data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, + ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), + config, + ); + }; + export const reassign = ( + positionId: string, + officeId: string, + data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items/reassign`, + ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), + config, + ); + }; + export const reorder = ( + positionId: string, + itemId: string, + officeId: string, + data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, + ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/positionAccountItems/positionAccountItems.models.ts b/test/generated/dist/positionAccountItems/positionAccountItems.models.ts new file mode 100644 index 0000000..3d0aeb7 --- /dev/null +++ b/test/generated/dist/positionAccountItems/positionAccountItems.models.ts @@ -0,0 +1,251 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionAccountItemsModels { + /** + * CreatePositionChargeDataRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ + export const CreatePositionChargeDataRequestDtoSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID"), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().gte(1).describe("Quantity of the charge"), + buyRate: z.number().describe("Buy rate amount"), + buyCurrencyCode: z.string().describe("Buy rate currency code"), + buyVatRuleId: z.string().describe("Buy VAT rule ID"), + vendorId: z.string().describe("Vendor ID"), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), + sellRate: z.number().describe("Sell rate amount"), + sellCurrencyCode: z.string().describe("Sell rate currency code"), + sellVatRuleId: z.string().describe("Sell VAT rule ID"), + customerId: z.string().describe("Customer ID"), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), + }) + .readonly(); + export type CreatePositionChargeDataRequestDto = z.infer; + + /** + * CreatePositionTextDataRequestDtoSchema + * @type { object } + * @property { string } content Text content + */ + export const CreatePositionTextDataRequestDtoSchema = z + .object({ content: z.string().describe("Text content") }) + .readonly(); + export type CreatePositionTextDataRequestDto = z.infer; + + /** + * CreatePositionAccountItemRequestDtoSchema + * @type { object } + * @property { CommonModels.PositionAccountItemTypeEnum } type Item type + * @property { CreatePositionChargeDataRequestDto } charge Charge data if type is CHARGE + * @property { CreatePositionTextDataRequestDto } text Text data if type is TEXT + */ + export const CreatePositionAccountItemRequestDtoSchema = z + .object({ + type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), + charge: CreatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), + text: CreatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish(), + }) + .readonly(); + export type CreatePositionAccountItemRequestDto = z.infer; + + /** + * CreatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { CreatePositionAccountItemRequestDto[] } items Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER) + */ + export const CreatePositionAccountItemsRequestDtoSchema = z + .object({ + items: z + .array(CreatePositionAccountItemRequestDtoSchema) + .readonly() + .describe( + "Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER)", + ), + }) + .readonly(); + export type CreatePositionAccountItemsRequestDto = z.infer; + + /** + * UpdatePositionChargeDataRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ + export const UpdatePositionChargeDataRequestDtoSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID"), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().gte(1).describe("Quantity of the charge"), + buyRate: z.number().describe("Buy rate amount").nullable(), + buyCurrencyCode: z.string().describe("Buy rate currency code"), + buyVatRuleId: z.string().describe("Buy VAT rule ID"), + vendorId: z.string().describe("Vendor ID"), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), + sellRate: z.number().describe("Sell rate amount").nullable(), + sellCurrencyCode: z.string().describe("Sell rate currency code"), + sellVatRuleId: z.string().describe("Sell VAT rule ID"), + customerId: z.string().describe("Customer ID"), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), + }) + .readonly(); + export type UpdatePositionChargeDataRequestDto = z.infer; + + /** + * UpdatePositionTextDataRequestDtoSchema + * @type { object } + * @property { string } content Text content + */ + export const UpdatePositionTextDataRequestDtoSchema = z + .object({ content: z.string().describe("Text content") }) + .readonly(); + export type UpdatePositionTextDataRequestDto = z.infer; + + /** + * UpdatePositionAccountItemRequestDtoSchema + * @type { object } + * @property { CommonModels.PositionAccountItemTypeEnum } type Item type + * @property { UpdatePositionChargeDataRequestDto } charge Charge data if type is CHARGE + * @property { UpdatePositionTextDataRequestDto } text Text data if type is TEXT + */ + export const UpdatePositionAccountItemRequestDtoSchema = z + .object({ + type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), + charge: UpdatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), + text: UpdatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish(), + }) + .readonly(); + export type UpdatePositionAccountItemRequestDto = z.infer; + + /** + * UpdatePositionAccountItemWithIdRequestDtoSchema + * @type { object } + * @property { string } id ID of the item to update + * @property { UpdatePositionAccountItemRequestDto } data Data to update + */ + export const UpdatePositionAccountItemWithIdRequestDtoSchema = z + .object({ + id: z.string().describe("ID of the item to update"), + data: UpdatePositionAccountItemRequestDtoSchema.describe("Data to update"), + }) + .readonly(); + export type UpdatePositionAccountItemWithIdRequestDto = z.infer< + typeof UpdatePositionAccountItemWithIdRequestDtoSchema + >; + + /** + * UpdatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { UpdatePositionAccountItemWithIdRequestDto[] } items Array of items to update + */ + export const UpdatePositionAccountItemsRequestDtoSchema = z + .object({ + items: z.array(UpdatePositionAccountItemWithIdRequestDtoSchema).readonly().describe("Array of items to update"), + }) + .readonly(); + export type UpdatePositionAccountItemsRequestDto = z.infer; + + /** + * DeletePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to delete + */ + export const DeletePositionAccountItemsRequestDtoSchema = z + .object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to delete") }) + .readonly(); + export type DeletePositionAccountItemsRequestDto = z.infer; + + /** + * DuplicatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to duplicate + */ + export const DuplicatePositionAccountItemsRequestDtoSchema = z + .object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to duplicate") }) + .readonly(); + export type DuplicatePositionAccountItemsRequestDto = z.infer; + + /** + * ReassignPositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to reassign + * @property { string } targetPositionId Target position ID to reassign items to + */ + export const ReassignPositionAccountItemsRequestDtoSchema = z + .object({ + ids: z.array(z.string()).readonly().describe("Array of item IDs to reassign"), + targetPositionId: z.string().describe("Target position ID to reassign items to"), + }) + .readonly(); + export type ReassignPositionAccountItemsRequestDto = z.infer; + + /** + * ReorderPositionAccountItemRequestDtoSchema + * @type { object } + * @property { number } orderPosition New order position for the item + */ + export const ReorderPositionAccountItemRequestDtoSchema = z + .object({ orderPosition: z.number().describe("New order position for the item") }) + .readonly(); + export type ReorderPositionAccountItemRequestDto = z.infer; + + /** + * PositionAccountItemsCreateResponseSchema + * @type { array } + */ + export const PositionAccountItemsCreateResponseSchema = z + .array(CommonModels.PositionAccountItemDtoResponseSchema) + .readonly(); + export type PositionAccountItemsCreateResponse = z.infer; + + /** + * PositionAccountItemsUpdateResponseSchema + * @type { array } + */ + export const PositionAccountItemsUpdateResponseSchema = z + .array(CommonModels.PositionAccountItemDtoResponseSchema) + .readonly(); + export type PositionAccountItemsUpdateResponse = z.infer; + + /** + * PositionAccountItemsDuplicateResponseSchema + * @type { array } + */ + export const PositionAccountItemsDuplicateResponseSchema = z + .array(CommonModels.PositionAccountItemDtoResponseSchema) + .readonly(); + export type PositionAccountItemsDuplicateResponse = z.infer; + + /** + * ReassignResponseSchema + * @type { array } + */ + export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); + export type ReassignResponse = z.infer; +} diff --git a/test/generated/dist/positionAccountItems/positionAccountItems.queries.ts b/test/generated/dist/positionAccountItems/positionAccountItems.queries.ts new file mode 100644 index 0000000..909d03c --- /dev/null +++ b/test/generated/dist/positionAccountItems/positionAccountItems.queries.ts @@ -0,0 +1,229 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionAccountItemsAcl } from "./positionAccountItems.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionAccountItemsModels } from "./positionAccountItems.models"; +import { PositionAccountItemsApi } from "./positionAccountItems.api"; + +export namespace PositionAccountItemsQueries { + export const moduleName = QueryModule.PositionAccountItems; + + /** + * Mutation `useCreate` + * @summary Create position account items (bulk) + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.create, + { positionId: string; officeId: string; data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId })); + return PositionAccountItemsApi.create(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeletePositionAccountItems` + * @summary Delete position account items (bulk) + * @permission Requires `canUseDeletePositionAccountItems` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeletePositionAccountItems = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.deletePositionAccountItems, + { positionId: string; officeId: string; data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId })); + return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update position account items (bulk) + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.update, + { positionId: string; officeId: string; data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId })); + return PositionAccountItemsApi.update(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicate` + * @summary Duplicate position account items (bulk) + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicate = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.duplicate, + { positionId: string; officeId: string; data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId })); + return PositionAccountItemsApi.duplicate(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useReassign` + * @summary Reassign position account items to another position (bulk) + * @permission Requires `canUseReassign` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useReassign = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.reassign, + { positionId: string; officeId: string; data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId })); + return PositionAccountItemsApi.reassign(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useReorder` + * @summary Reorder position account item + * @permission Requires `canUseReorder` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.ReorderPositionAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useReorder = ( + options?: AppMutationOptions< + typeof PositionAccountItemsApi.reorder, + { + positionId: string; + itemId: string; + officeId: string; + data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, itemId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId })); + return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/positionCargo/positionCargo.acl.ts b/test/generated/dist/positionCargo/positionCargo.acl.ts new file mode 100644 index 0000000..3be8f2a --- /dev/null +++ b/test/generated/dist/positionCargo/positionCargo.acl.ts @@ -0,0 +1,111 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionCargoAcl { + /** + * Use for `useListCargosByPositionId` query ability. For global ability, omit the object parameter. + * @description List cargo items by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByPositionId` query + */ + export const canUseListCargosByPositionId = (object?: { officeId: string }) => + ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Read", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useCreateCargo` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCargo` mutation + */ + export const canUseCreateCargo = (object?: { officeId: string }) => + ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Create", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. + * @description List cargo labels by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query + */ + export const canUseListCargoLabels = (object?: { officeId: string }) => + ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Read", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. + * @description Get cargo summary by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query + */ + export const canUseGetCargoSummary = (object?: { officeId: string }) => + ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Read", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. + * @description Get cargo item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query + */ + export const canUseGetCargoById = (object?: { officeId: string }) => + ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Read", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. + * @description Update cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation + */ + export const canUseUpdateCargo = (object?: { officeId: string }) => + ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Update", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation + */ + export const canUseDeleteCargo = (object?: { officeId: string }) => + ["Delete", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Delete", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation + */ + export const canUseCreateBulkCargos = (object?: { officeId: string }) => + ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Create", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation + */ + export const canUseDuplicateCargo = (object?: { officeId: string }) => + ["Duplicate", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Duplicate", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/positionCargo/positionCargo.api.ts b/test/generated/dist/positionCargo/positionCargo.api.ts new file mode 100644 index 0000000..d692a24 --- /dev/null +++ b/test/generated/dist/positionCargo/positionCargo.api.ts @@ -0,0 +1,127 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionCargoModels } from "./positionCargo.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoApi { + export const listCargosByPositionId = ( + officeId: string, + positionId: string, + limit: number, + order?: PositionCargoModels.ListCargosByPositionIdOrderParam, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos`, + { + ...config, + params: { + order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { + type: "query", + name: "order", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const createCargo = ( + officeId: string, + positionId: string, + data: CommonModels.CreatePositionCargoDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config, + ); + }; + export const listCargoLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/labels`, + config, + ); + }; + export const getCargoSummary = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/summary`, + config, + ); + }; + export const getCargoById = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + config, + ); + }; + export const updateCargo = ( + officeId: string, + positionId: string, + cargoId: string, + data: CommonModels.UpdatePositionCargoDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), + config, + ); + }; + export const deleteCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + undefined, + config, + ); + }; + export const createBulkCargos = ( + numberOfCargos: number, + officeId: string, + positionId: string, + data: CommonModels.CreatePositionCargoDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config, + ); + }; + export const duplicateCargo = ( + officeId: string, + positionId: string, + cargoId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/positionCargo/positionCargo.configs.ts b/test/generated/dist/positionCargo/positionCargo.configs.ts new file mode 100644 index 0000000..318b8e9 --- /dev/null +++ b/test/generated/dist/positionCargo/positionCargo.configs.ts @@ -0,0 +1,132 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoQueries } from "./positionCargo.queries"; +import { PositionCargoAcl } from "./positionCargo.acl"; + +export namespace PositionCargoConfigs { + export const cargosConfig = { + meta: { + title: "Cargos", + }, + readAll: { + acl: PositionCargoAcl.canUseListCargosByPositionId, + schema: CommonModels.PositionCargoResponseDTOSchema, + paginated: PositionCargoQueries.useListCargosByPositionId, + infinite: PositionCargoQueries.useListCargosByPositionIdInfinite, + columns: dynamicColumns({ + schema: CommonModels.PositionCargoResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + quoteId: true, + rootFolderId: true, + cargoType: true, + autoCalculateTotals: true, + autoCalculateRates: true, + autoCalculateVgm: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + rateOptions: true, + rateClass: true, + textForCustoms: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + ratePerKg: true, + totalRate: true, + tare: true, + vgm: true, + hsCodeLabels: true, + note: true, + packages: true, + createdAt: true, + updatedAt: true, + completeWeight: true, + packageTotals: true, + }, + }, + }), + }, + read: { + acl: PositionCargoAcl.canUseGetCargoById, + schema: CommonModels.PositionCargoResponseDTOSchema, + query: PositionCargoQueries.useGetCargoById, + }, + create: { + acl: PositionCargoAcl.canUseCreateCargo, + schema: CommonModels.CreatePositionCargoDTOSchema, + mutation: PositionCargoQueries.useCreateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.CreatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, + }), + }, + update: { + acl: PositionCargoAcl.canUseUpdateCargo, + schema: CommonModels.UpdatePositionCargoDTOSchema, + mutation: PositionCargoQueries.useUpdateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.UpdatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, + }), + }, + delete: { + acl: PositionCargoAcl.canUseDeleteCargo, + mutation: PositionCargoQueries.useDeleteCargo, + }, + }; +} diff --git a/test/generated/dist/positionCargo/positionCargo.models.ts b/test/generated/dist/positionCargo/positionCargo.models.ts new file mode 100644 index 0000000..5649851 --- /dev/null +++ b/test/generated/dist/positionCargo/positionCargo.models.ts @@ -0,0 +1,57 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoModels { + /** + * ListCargosByPositionIdOrderParamSchema + * @type { array } + * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + */ + export const ListCargosByPositionIdOrderParamSchema = z + .array(CommonModels.PositionCargoPaginationOrderFieldSchema) + .readonly() + .describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt") + .nullish(); + export type ListCargosByPositionIdOrderParam = z.infer; + + /** + * ListCargosByPositionIdResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.PositionCargoResponseDTO[] } items + */ + export const ListCargosByPositionIdResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ListCargosByPositionIdResponse = z.infer; + + /** + * PositionCargoListCargoLabelsResponseSchema + * @type { array } + */ + export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type PositionCargoListCargoLabelsResponse = z.infer; + + /** + * PositionCargoGetCargoSummaryResponseSchema + * @type { array } + */ + export const PositionCargoGetCargoSummaryResponseSchema = z + .array(CommonModels.CargoSummaryResponseDTOSchema) + .readonly(); + export type PositionCargoGetCargoSummaryResponse = z.infer; + + /** + * PositionCargoCreateBulkCargosResponseSchema + * @type { array } + */ + export const PositionCargoCreateBulkCargosResponseSchema = z + .array(CommonModels.PositionCargoResponseDTOSchema) + .readonly(); + export type PositionCargoCreateBulkCargosResponse = z.infer; +} diff --git a/test/generated/dist/positionCargo/positionCargo.queries.ts b/test/generated/dist/positionCargo/positionCargo.queries.ts new file mode 100644 index 0000000..4c2f731 --- /dev/null +++ b/test/generated/dist/positionCargo/positionCargo.queries.ts @@ -0,0 +1,415 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionCargoAcl } from "./positionCargo.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionCargoModels } from "./positionCargo.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoApi } from "./positionCargo.api"; + +export namespace PositionCargoQueries { + export const moduleName = QueryModule.PositionCargo; + + export const keys = { + all: [moduleName] as const, + listCargosByPositionId: ( + officeId: string, + positionId: string, + limit?: number, + order?: PositionCargoModels.ListCargosByPositionIdOrderParam, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/cargos", + officeId, + positionId, + limit, + order, + page, + cursor, + ] as const, + listCargosByPositionIdInfinite: ( + officeId: string, + positionId: string, + limit?: number, + order?: PositionCargoModels.ListCargosByPositionIdOrderParam, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/cargos", + "infinite", + officeId, + positionId, + limit, + order, + cursor, + ] as const, + listCargoLabels: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/cargos/labels", officeId, positionId] as const, + getCargoSummary: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/cargos/summary", officeId, positionId] as const, + getCargoById: (officeId: string, positionId: string, cargoId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/cargos/:cargoId", officeId, positionId, cargoId] as const, + }; + + /** + * Query `useListCargosByPositionId` + * @summary List all cargo items for a position + * @permission Requires `canUseListCargosByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargosByPositionId = ( + { + officeId, + positionId, + limit, + order, + page, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: PositionCargoModels.ListCargosByPositionIdOrderParam; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId })); + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListCargosByPositionIdInfinite + * @summary List all cargo items for a position + * @permission Requires `canUseListCargosByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargosByPositionIdInfinite = ( + { + officeId, + positionId, + limit, + order, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: PositionCargoModels.ListCargosByPositionIdOrderParam; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId })); + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreateCargo` + * @summary Create a new cargo item + * @permission Requires `canUseCreateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateCargo = ( + options?: AppMutationOptions< + typeof PositionCargoApi.createCargo, + { officeId: string; positionId: string; data: CommonModels.CreatePositionCargoDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId })); + return PositionCargoApi.createCargo(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListCargoLabels` + * @summary List all cargo labels for a position + * @permission Requires `canUseListCargoLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargoLabels = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargoLabels(officeId, positionId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId })); + return PositionCargoApi.listCargoLabels(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Query `useGetCargoSummary` + * @summary Get cargo summary grouped by transport unit type + * @permission Requires `canUseGetCargoSummary` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCargoSummary = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoSummary(officeId, positionId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId })); + return PositionCargoApi.getCargoSummary(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Query `useGetCargoById` + * @summary Get a specific cargo item + * @permission Requires `canUseGetCargoById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.cargoId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCargoById = ( + { officeId, positionId, cargoId }: { officeId: string; positionId: string; cargoId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoById(officeId, positionId, cargoId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId })); + return PositionCargoApi.getCargoById(officeId, positionId, cargoId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCargo` + * @summary Update a cargo item + * @permission Requires `canUseUpdateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCargo = ( + options?: AppMutationOptions< + typeof PositionCargoApi.updateCargo, + { officeId: string; positionId: string; cargoId: string; data: CommonModels.UpdatePositionCargoDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, data }) => { + checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId })); + return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteCargo` + * @summary Delete a cargo item + * @permission Requires `canUseDeleteCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteCargo = ( + options?: AppMutationOptions< + typeof PositionCargoApi.deleteCargo, + { officeId: string; positionId: string; cargoId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId }) => { + checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId })); + return PositionCargoApi.deleteCargo(officeId, positionId, cargoId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreateBulkCargos` + * @summary Create a new cargo item + * @permission Requires `canUseCreateBulkCargos` ability + * @param { number } mutation.numberOfCargos Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateBulkCargos = ( + options?: AppMutationOptions< + typeof PositionCargoApi.createBulkCargos, + { numberOfCargos: number; officeId: string; positionId: string; data: CommonModels.CreatePositionCargoDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { + checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId })); + return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicateCargo` + * @summary Duplicate a cargo item + * @permission Requires `canUseDuplicateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicateCargo = ( + options?: AppMutationOptions< + typeof PositionCargoApi.duplicateCargo, + { officeId: string; positionId: string; cargoId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId }) => { + checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId })); + return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/positionCargoPackage/positionCargoPackage.acl.ts b/test/generated/dist/positionCargoPackage/positionCargoPackage.acl.ts new file mode 100644 index 0000000..1b45ca0 --- /dev/null +++ b/test/generated/dist/positionCargoPackage/positionCargoPackage.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionCargoPackageAcl { + /** + * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. + * @description Create cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation + */ + export const canUseCreatePackage = (object?: { officeId: string }) => + ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Create", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. + * @description Update cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation + */ + export const canUseUpdatePackage = (object?: { officeId: string }) => + ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Update", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation + */ + export const canUseDeletePackage = (object?: { officeId: string }) => + ["Delete", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Delete", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation + */ + export const canUseDuplicatePackage = (object?: { officeId: string }) => + ["Duplicate", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Duplicate", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; + + /** + * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. + * @description Move cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation + */ + export const canUseMovePackage = (object?: { officeId: string }) => + ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< + "Update", + "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/positionCargoPackage/positionCargoPackage.api.ts b/test/generated/dist/positionCargoPackage/positionCargoPackage.api.ts new file mode 100644 index 0000000..4357b95 --- /dev/null +++ b/test/generated/dist/positionCargoPackage/positionCargoPackage.api.ts @@ -0,0 +1,80 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoPackageApi { + export const createPackage = ( + officeId: string, + positionId: string, + cargoId: string, + data: CommonModels.CreatePositionCargoPackageDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, + ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), + config, + ); + }; + export const updatePackage = ( + officeId: string, + positionId: string, + cargoId: string, + packageId: string, + data: CommonModels.UpdatePositionCargoPackageDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), + config, + ); + }; + export const deletePackage = ( + officeId: string, + positionId: string, + cargoId: string, + packageId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, + undefined, + config, + ); + }; + export const duplicatePackage = ( + officeId: string, + positionId: string, + cargoId: string, + packageId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, + undefined, + config, + ); + }; + export const movePackage = ( + officeId: string, + positionId: string, + cargoId: string, + packageId: string, + data: CommonModels.MovePositionCargoPackageRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, + ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/positionCargoPackage/positionCargoPackage.queries.ts b/test/generated/dist/positionCargoPackage/positionCargoPackage.queries.ts new file mode 100644 index 0000000..3c69275 --- /dev/null +++ b/test/generated/dist/positionCargoPackage/positionCargoPackage.queries.ts @@ -0,0 +1,207 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionCargoPackageAcl } from "./positionCargoPackage.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoPackageApi } from "./positionCargoPackage.api"; + +export namespace PositionCargoPackageQueries { + export const moduleName = QueryModule.PositionCargoPackage; + + /** + * Mutation `useCreatePackage` + * @summary Create a new package for a cargo + * @permission Requires `canUseCreatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreatePackage = ( + options?: AppMutationOptions< + typeof PositionCargoPackageApi.createPackage, + { officeId: string; positionId: string; cargoId: string; data: CommonModels.CreatePositionCargoPackageDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId })); + return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdatePackage` + * @summary Update a package + * @permission Requires `canUseUpdatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdatePackage = ( + options?: AppMutationOptions< + typeof PositionCargoPackageApi.updatePackage, + { + officeId: string; + positionId: string; + cargoId: string; + packageId: string; + data: CommonModels.UpdatePositionCargoPackageDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId })); + return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeletePackage` + * @summary Delete a package + * @permission Requires `canUseDeletePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeletePackage = ( + options?: AppMutationOptions< + typeof PositionCargoPackageApi.deletePackage, + { officeId: string; positionId: string; cargoId: string; packageId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId }) => { + checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId })); + return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicatePackage` + * @summary Duplicate a package + * @permission Requires `canUseDuplicatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicatePackage = ( + options?: AppMutationOptions< + typeof PositionCargoPackageApi.duplicatePackage, + { officeId: string; positionId: string; cargoId: string; packageId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId }) => { + checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId })); + return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMovePackage` + * @summary Move a package to a different cargo + * @permission Requires `canUseMovePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useMovePackage = ( + options?: AppMutationOptions< + typeof PositionCargoPackageApi.movePackage, + { + officeId: string; + positionId: string; + cargoId: string; + packageId: string; + data: CommonModels.MovePositionCargoPackageRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId })); + return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/positionChecklist/positionChecklist.acl.ts b/test/generated/dist/positionChecklist/positionChecklist.acl.ts new file mode 100644 index 0000000..6047fe4 --- /dev/null +++ b/test/generated/dist/positionChecklist/positionChecklist.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionChecklistAcl { + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List checklist items for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useApplyTemplates` mutation ability. For global ability, omit the object parameter. + * @description Apply checklist templates to position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useApplyTemplates` mutation + */ + export const canUseApplyTemplates = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useComplete` mutation ability. For global ability, omit the object parameter. + * @description Complete position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useComplete` mutation + */ + export const canUseComplete = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUncomplete` mutation ability. For global ability, omit the object parameter. + * @description Uncomplete position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUncomplete` mutation + */ + export const canUseUncomplete = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdateNotes` mutation ability. For global ability, omit the object parameter. + * @description Update position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateNotes` mutation + */ + export const canUseUpdateNotes = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useReorder` mutation ability. For global ability, omit the object parameter. + * @description Reorder position checklist items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation + */ + export const canUseReorder = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/positionChecklist/positionChecklist.api.ts b/test/generated/dist/positionChecklist/positionChecklist.api.ts new file mode 100644 index 0000000..28929d0 --- /dev/null +++ b/test/generated/dist/positionChecklist/positionChecklist.api.ts @@ -0,0 +1,70 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionChecklistModels } from "./positionChecklist.models"; + +export namespace PositionChecklistApi { + export const list = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist`, + config, + ); + }; + export const applyTemplates = ( + officeId: string, + positionId: string, + data: PositionChecklistModels.ApplyTemplatesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, + ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), + config, + ); + }; + export const complete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, + undefined, + config, + ); + }; + export const uncomplete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, + undefined, + config, + ); + }; + export const updateNotes = ( + officeId: string, + positionId: string, + itemId: string, + data: PositionChecklistModels.UpdatePositionChecklistItemDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, + ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), + config, + ); + }; + export const reorder = ( + officeId: string, + positionId: string, + data: PositionChecklistModels.ReorderPositionChecklistDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.put( + { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/reorder`, + ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/positionChecklist/positionChecklist.models.ts b/test/generated/dist/positionChecklist/positionChecklist.models.ts new file mode 100644 index 0000000..58a0db3 --- /dev/null +++ b/test/generated/dist/positionChecklist/positionChecklist.models.ts @@ -0,0 +1,96 @@ +import { z } from "zod"; + +export namespace PositionChecklistModels { + /** + * PositionChecklistCompletedByResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const PositionChecklistCompletedByResponseDtoSchema = z + .object({ id: z.string(), name: z.string().nullable() }) + .readonly(); + export type PositionChecklistCompletedByResponseDto = z.infer; + + /** + * PositionChecklistItemResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } checklistItemId + * @property { string } templateId + * @property { number } order + * @property { boolean } completed + * @property { string } completedAt + * @property { PositionChecklistCompletedByResponseDto } completedBy + * @property { string } notes + * @property { string } name + */ + export const PositionChecklistItemResponseDtoSchema = z + .object({ + id: z.string(), + positionId: z.string(), + checklistItemId: z.string(), + templateId: z.string().nullable(), + order: z.number(), + completed: z.boolean(), + completedAt: z.iso.datetime({ offset: true }).nullable(), + completedBy: PositionChecklistCompletedByResponseDtoSchema.nullable(), + notes: z.string().nullable(), + name: z.string().nullable(), + }) + .readonly(); + export type PositionChecklistItemResponseDto = z.infer; + + /** + * PositionChecklistResponseDtoSchema + * @type { object } + * @property { PositionChecklistItemResponseDto[] } items + * @property { string[] } appliedTemplateIds + */ + export const PositionChecklistResponseDtoSchema = z + .object({ + items: z.array(PositionChecklistItemResponseDtoSchema).readonly(), + appliedTemplateIds: z.array(z.string()).readonly(), + }) + .readonly(); + export type PositionChecklistResponseDto = z.infer; + + /** + * ApplyTemplatesRequestDtoSchema + * @type { object } + * @property { string[] } templateIds + */ + export const ApplyTemplatesRequestDtoSchema = z.object({ templateIds: z.array(z.string()).readonly() }).readonly(); + export type ApplyTemplatesRequestDto = z.infer; + + /** + * UpdatePositionChecklistItemDtoSchema + * @type { object } + * @property { string } notes Max Length: `512` + */ + export const UpdatePositionChecklistItemDtoSchema = z.object({ notes: z.string().max(512) }).readonly(); + export type UpdatePositionChecklistItemDto = z.infer; + + /** + * ReorderPositionChecklistDtoSchema + * @type { object } + * @property { string[] } itemIds + */ + export const ReorderPositionChecklistDtoSchema = z.object({ itemIds: z.array(z.string()).readonly() }).readonly(); + export type ReorderPositionChecklistDto = z.infer; + + /** + * ApplyTemplatesResponseSchema + * @type { array } + */ + export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); + export type ApplyTemplatesResponse = z.infer; + + /** + * PositionChecklistReorderResponseSchema + * @type { array } + */ + export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); + export type PositionChecklistReorderResponse = z.infer; +} diff --git a/test/generated/dist/positionChecklist/positionChecklist.queries.ts b/test/generated/dist/positionChecklist/positionChecklist.queries.ts new file mode 100644 index 0000000..0309124 --- /dev/null +++ b/test/generated/dist/positionChecklist/positionChecklist.queries.ts @@ -0,0 +1,227 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionChecklistAcl } from "./positionChecklist.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionChecklistModels } from "./positionChecklist.models"; +import { PositionChecklistApi } from "./positionChecklist.api"; + +export namespace PositionChecklistQueries { + export const moduleName = QueryModule.PositionChecklist; + + export const keys = { + all: [moduleName] as const, + list: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/checklist", officeId, positionId] as const, + }; + + /** + * Query `useList` + * @summary Get position checklist items + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, positionId), + queryFn: () => { + checkAcl(PositionChecklistAcl.canUseList({ officeId })); + return PositionChecklistApi.list(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useApplyTemplates` + * @summary Apply checklist templates to position + * @permission Requires `canUseApplyTemplates` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionChecklistModels.ApplyTemplatesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useApplyTemplates = ( + options?: AppMutationOptions< + typeof PositionChecklistApi.applyTemplates, + { officeId: string; positionId: string; data: PositionChecklistModels.ApplyTemplatesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId })); + return PositionChecklistApi.applyTemplates(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useComplete` + * @summary Complete a checklist item + * @permission Requires `canUseComplete` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useComplete = ( + options?: AppMutationOptions< + typeof PositionChecklistApi.complete, + { officeId: string; positionId: string; itemId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId }) => { + checkAcl(PositionChecklistAcl.canUseComplete({ officeId })); + return PositionChecklistApi.complete(officeId, positionId, itemId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUncomplete` + * @summary Mark checklist item as not completed + * @permission Requires `canUseUncomplete` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useUncomplete = ( + options?: AppMutationOptions< + typeof PositionChecklistApi.uncomplete, + { officeId: string; positionId: string; itemId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId }) => { + checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId })); + return PositionChecklistApi.uncomplete(officeId, positionId, itemId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateNotes` + * @summary Update checklist item notes + * @permission Requires `canUseUpdateNotes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { PositionChecklistModels.UpdatePositionChecklistItemDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateNotes = ( + options?: AppMutationOptions< + typeof PositionChecklistApi.updateNotes, + { + officeId: string; + positionId: string; + itemId: string; + data: PositionChecklistModels.UpdatePositionChecklistItemDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId, data }) => { + checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId })); + return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useReorder` + * @summary Reorder checklist items + * @permission Requires `canUseReorder` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionChecklistModels.ReorderPositionChecklistDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useReorder = ( + options?: AppMutationOptions< + typeof PositionChecklistApi.reorder, + { officeId: string; positionId: string; data: PositionChecklistModels.ReorderPositionChecklistDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionChecklistAcl.canUseReorder({ officeId })); + return PositionChecklistApi.reorder(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.acl.ts b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.acl.ts new file mode 100644 index 0000000..7716790 --- /dev/null +++ b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.acl.ts @@ -0,0 +1,51 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionInvolvedPartiesAcl { + /** + * Use for `useFindByPositionId` query ability. For global ability, omit the object parameter. + * @description List position involved parties + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByPositionId` query + */ + export const canUseFindByPositionId = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation ability. For global ability, omit the object parameter. + * @description Delete position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation + */ + export const canUseDeleteOfficesPositionsInvolvedPartiesByPartyId = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.api.ts b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.api.ts new file mode 100644 index 0000000..63ec373 --- /dev/null +++ b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.api.ts @@ -0,0 +1,56 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionInvolvedPartiesModels } from "./positionInvolvedParties.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionInvolvedPartiesApi { + export const findByPositionId = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties`, + config, + ); + }; + export const create = ( + officeId: string, + positionId: string, + data: CommonModels.CreateInvolvedPartyRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties`, + ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), + config, + ); + }; + export const update = ( + officeId: string, + positionId: string, + partyId: string, + data: CommonModels.UpdateInvolvedPartyDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, + ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), + config, + ); + }; + export const deleteOfficesPositionsInvolvedPartiesByPartyId = ( + officeId: string, + positionId: string, + partyId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.models.ts b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.models.ts new file mode 100644 index 0000000..aeea1e4 --- /dev/null +++ b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.models.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionInvolvedPartiesModels { + /** + * FindByPositionIdResponseSchema + * @type { array } + */ + export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); + export type FindByPositionIdResponse = z.infer; +} diff --git a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.queries.ts b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.queries.ts new file mode 100644 index 0000000..ed6dde7 --- /dev/null +++ b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.queries.ts @@ -0,0 +1,157 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionInvolvedPartiesAcl } from "./positionInvolvedParties.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionInvolvedPartiesApi } from "./positionInvolvedParties.api"; + +export namespace PositionInvolvedPartiesQueries { + export const moduleName = QueryModule.PositionInvolvedParties; + + export const keys = { + all: [moduleName] as const, + findByPositionId: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/involved-parties", officeId, positionId] as const, + }; + + /** + * Query `useFindByPositionId` + * @summary List position involved parties + * @permission Requires `canUseFindByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindByPositionId = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findByPositionId(officeId, positionId), + queryFn: () => { + checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId })); + return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create position involved party + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof PositionInvolvedPartiesApi.create, + { officeId: string; positionId: string; data: CommonModels.CreateInvolvedPartyRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId })); + return PositionInvolvedPartiesApi.create(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update position involved party + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof PositionInvolvedPartiesApi.update, + { officeId: string; positionId: string; partyId: string; data: CommonModels.UpdateInvolvedPartyDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, partyId, data }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId })); + return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteOfficesPositionsInvolvedPartiesByPartyId` + * @summary Delete position involved party + * @permission Requires `canUseDeleteOfficesPositionsInvolvedPartiesByPartyId` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = ( + options?: AppMutationOptions< + typeof PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId, + { officeId: string; positionId: string; partyId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, partyId }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId })); + return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId( + officeId, + positionId, + partyId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts new file mode 100644 index 0000000..0060022 --- /dev/null +++ b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts @@ -0,0 +1,29 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionProfitChangeTrackingAcl { + /** + * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. + * @description List position profit change groups + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.positionId positionId from positionId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query + */ + export const canUseFindProfitChangeGroups = (object?: { officeId: string; positionId: string }) => + ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Read", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) + >; + + /** + * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. + * @description Get position profit change group details + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.positionId positionId from positionId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query + */ + export const canUseFindProfitChangeGroupDetail = (object?: { officeId: string; positionId: string }) => + ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "Read", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) + >; +} diff --git a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.api.ts b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.api.ts new file mode 100644 index 0000000..a8e0e88 --- /dev/null +++ b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.api.ts @@ -0,0 +1,66 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; + +export namespace PositionProfitChangeTrackingApi { + export const findProfitChangeGroups = ( + officeId: string, + positionId: string, + limit: number, + order?: string, + filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { + resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema, + }, + `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp( + PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, + ).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse( + PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), + filter, + { type: "query", name: "filter" }, + ), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findProfitChangeGroupDetail = ( + groupId: string, + officeId: string, + positionId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, + `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, + config, + ); + }; +} diff --git a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts new file mode 100644 index 0000000..260a0d2 --- /dev/null +++ b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts @@ -0,0 +1,51 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; +import { PositionProfitChangeTrackingQueries } from "./positionProfitChangeTracking.queries"; +import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; + +export namespace PositionProfitChangeTrackingConfigs { + export const profitChangeGroupsConfig = { + meta: { + title: "Profit Change Groups", + }, + readAll: { + acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups, + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, + paginated: PositionProfitChangeTrackingQueries.useFindProfitChangeGroups, + infinite: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, + filters: { + schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, + options: { + inputs: { + userId: true, + dateFrom: true, + dateTo: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, + options: { + columns: { + id: true, + timestamp: true, + users: true, + profit: true, + changeCount: true, + }, + sortable: + PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, + }, + }), + }, + read: { + acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema, + query: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, + }, + }; +} diff --git a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.models.ts b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.models.ts new file mode 100644 index 0000000..e06233f --- /dev/null +++ b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.models.ts @@ -0,0 +1,117 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionProfitChangeTrackingModels { + /** + * PositionAccountProfitChangeGroupDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto[] } users + * @property { object } profit + * @property { number } profit.amount + * @property { string } profit.currencyCode + * @property { number } changeCount + */ + export const PositionAccountProfitChangeGroupDtoSchema = z + .object({ + id: z.string(), + timestamp: z.iso.datetime({ offset: true }), + users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), + profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), + changeCount: z.number(), + }) + .readonly(); + export type PositionAccountProfitChangeGroupDto = z.infer; + + /** + * PositionAccountProfitChangeEntryDtoSchema + * @type { object } + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto } user + * @property { number } changeNumber + * @property { number } oldProfit + * @property { number } newProfit + * @property { string } currencyCode + */ + export const PositionAccountProfitChangeEntryDtoSchema = z + .object({ + timestamp: z.iso.datetime({ offset: true }), + user: CommonModels.UserPreviewDtoSchema, + changeNumber: z.number(), + oldProfit: z.number(), + newProfit: z.number(), + currencyCode: z.string(), + }) + .readonly(); + export type PositionAccountProfitChangeEntryDto = z.infer; + + /** + * PositionAccountProfitChangeGroupDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { string } currencyCode + * @property { PositionAccountProfitChangeEntryDto[] } entries + */ + export const PositionAccountProfitChangeGroupDetailDtoSchema = z + .object({ + id: z.string(), + timestamp: z.iso.datetime({ offset: true }), + currencyCode: z.string(), + entries: z.array(PositionAccountProfitChangeEntryDtoSchema).readonly(), + }) + .readonly(); + export type PositionAccountProfitChangeGroupDetailDto = z.infer< + typeof PositionAccountProfitChangeGroupDetailDtoSchema + >; + + /** + * PositionProfitChangeTrackingFilterDtoSchema + * @type { object } + * @property { string } userId User IDs who made the changes + * @property { string } dateFrom Date range start + * @property { string } dateTo Date range end + */ + export const PositionProfitChangeTrackingFilterDtoSchema = z + .object({ + userId: z.string().describe("User IDs who made the changes"), + dateFrom: z.string().describe("Date range start"), + dateTo: z.string().describe("Date range end"), + }) + .readonly(); + export type PositionProfitChangeTrackingFilterDto = z.infer; + + /** + * PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema + * @type { enum } + */ + export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema = z.enum([ + "timestamp", + "profitAmount", + "changeCount", + ]); + export type PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = z.infer< + typeof PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema + >; + export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = + PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema.enum; + + /** + * PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionAccountProfitChangeGroupDto[] } items + */ + export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape, + }); + export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer< + typeof PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema + >; +} diff --git a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts new file mode 100644 index 0000000..313343b --- /dev/null +++ b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts @@ -0,0 +1,208 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; +import { PositionProfitChangeTrackingApi } from "./positionProfitChangeTracking.api"; + +export namespace PositionProfitChangeTrackingQueries { + export const moduleName = QueryModule.PositionProfitChangeTracking; + + export const keys = { + all: [moduleName] as const, + findProfitChangeGroups: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/account/profit-change-groups", + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + ] as const, + findProfitChangeGroupsInfinite: ( + officeId: string, + positionId: string, + limit?: number, + order?: string, + filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/account/profit-change-groups", + "infinite", + officeId, + positionId, + limit, + order, + filter, + cursor, + ] as const, + findProfitChangeGroupDetail: (groupId: string, officeId: string, positionId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/account/profit-change-groups/:groupId", + groupId, + officeId, + positionId, + ] as const, + }; + + /** + * Query `useFindProfitChangeGroups` + * @summary List position profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` + * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroups = ( + { + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId })); + return PositionProfitChangeTrackingApi.findProfitChangeGroups( + officeId, + positionId, + limit, + order, + filter, + page, + cursor, + config, + ); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindProfitChangeGroupsInfinite + * @summary List position profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` + * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroupsInfinite = ( + { + officeId, + positionId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + positionId: string; + limit: number; + order?: string; + filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId })); + return PositionProfitChangeTrackingApi.findProfitChangeGroups( + officeId, + positionId, + limit, + order, + filter, + pageParam, + cursor, + config, + ); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindProfitChangeGroupDetail` + * @summary Get position profit change group details + * @permission Requires `canUseFindProfitChangeGroupDetail` ability + * @param { string } object.groupId Path parameter + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroupDetail = ( + { groupId, officeId, positionId }: { groupId: string; officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), + queryFn: () => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId })); + return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/positionRoutes/positionRoutes.acl.ts b/test/generated/dist/positionRoutes/positionRoutes.acl.ts new file mode 100644 index 0000000..1ef520c --- /dev/null +++ b/test/generated/dist/positionRoutes/positionRoutes.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionRoutesAcl { + /** + * Use for `useListRoutes` query ability. For global ability, omit the object parameter. + * @description List position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query + */ + export const canUseListRoutes = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Create position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation + */ + export const canUseCreateRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Update position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation + */ + export const canUseUpdateRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Delete position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation + */ + export const canUseDeleteRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. + * @description Split position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation + */ + export const canUseSplitRoutes = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. + * @description Merge position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation + */ + export const canUseMergeRoutes = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. + * @description Copy position route + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation + */ + export const canUseCopyRoute = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/positionRoutes/positionRoutes.api.ts b/test/generated/dist/positionRoutes/positionRoutes.api.ts new file mode 100644 index 0000000..6081023 --- /dev/null +++ b/test/generated/dist/positionRoutes/positionRoutes.api.ts @@ -0,0 +1,93 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionRoutesApi { + export const listRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.RouteListResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes`, + config, + ); + }; + export const createRoutePoint = ( + officeId: string, + positionId: string, + routeId: string, + data: CommonModels.CreateRoutePointRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, + ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), + config, + ); + }; + export const updateRoutePoint = ( + officeId: string, + positionId: string, + routeId: string, + pointId: string, + data: CommonModels.UpdateRoutePointRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, + ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), + config, + ); + }; + export const deleteRoutePoint = ( + officeId: string, + positionId: string, + routeId: string, + pointId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, + undefined, + config, + ); + }; + export const splitRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/split`, + undefined, + config, + ); + }; + export const mergeRoutes = ( + officeId: string, + positionId: string, + data: CommonModels.MergeRoutesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/merge`, + ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), + config, + ); + }; + export const copyRoute = ( + officeId: string, + positionId: string, + routeId: string, + data: CommonModels.CopyRouteRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, + ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/positionRoutes/positionRoutes.queries.ts b/test/generated/dist/positionRoutes/positionRoutes.queries.ts new file mode 100644 index 0000000..78de073 --- /dev/null +++ b/test/generated/dist/positionRoutes/positionRoutes.queries.ts @@ -0,0 +1,263 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionRoutesAcl } from "./positionRoutes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionRoutesApi } from "./positionRoutes.api"; + +export namespace PositionRoutesQueries { + export const moduleName = QueryModule.PositionRoutes; + + export const keys = { + all: [moduleName] as const, + listRoutes: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/routes", officeId, positionId] as const, + }; + + /** + * Query `useListRoutes` + * @summary List routes with points for a position (unified for sea/air/road) + * @permission Requires `canUseListRoutes` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListRoutes = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoutes(officeId, positionId), + queryFn: () => { + checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId })); + return PositionRoutesApi.listRoutes(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateRoutePoint` + * @summary Create a route point + * @permission Requires `canUseCreateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateRoutePoint = ( + options?: AppMutationOptions< + typeof PositionRoutesApi.createRoutePoint, + { officeId: string; positionId: string; routeId: string; data: CommonModels.CreateRoutePointRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, data }) => { + checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId })); + return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateRoutePoint` + * @summary Update a route point + * @permission Requires `canUseUpdateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateRoutePoint = ( + options?: AppMutationOptions< + typeof PositionRoutesApi.updateRoutePoint, + { + officeId: string; + positionId: string; + routeId: string; + pointId: string; + data: CommonModels.UpdateRoutePointRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { + checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId })); + return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteRoutePoint` + * @summary Delete a route point + * @permission Requires `canUseDeleteRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteRoutePoint = ( + options?: AppMutationOptions< + typeof PositionRoutesApi.deleteRoutePoint, + { officeId: string; positionId: string; routeId: string; pointId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, pointId }) => { + checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId })); + return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useSplitRoutes` + * @summary Split routes by cargo (sea positions only) + * @permission Requires `canUseSplitRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useSplitRoutes = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId })); + return PositionRoutesApi.splitRoutes(officeId, positionId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMergeRoutes` + * @summary Merge routes (sea positions only) + * @permission Requires `canUseMergeRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useMergeRoutes = ( + options?: AppMutationOptions< + typeof PositionRoutesApi.mergeRoutes, + { officeId: string; positionId: string; data: CommonModels.MergeRoutesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId })); + return PositionRoutesApi.mergeRoutes(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCopyRoute` + * @summary Copy route points to another route (sea positions only) + * @permission Requires `canUseCopyRoute` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useCopyRoute = ( + options?: AppMutationOptions< + typeof PositionRoutesApi.copyRoute, + { officeId: string; positionId: string; routeId: string; data: CommonModels.CopyRouteRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, data }) => { + checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId })); + return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/positions/positions.acl.ts b/test/generated/dist/positions/positions.acl.ts new file mode 100644 index 0000000..d2624a2 --- /dev/null +++ b/test/generated/dist/positions/positions.acl.ts @@ -0,0 +1,195 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionsAcl { + /** + * Use for `useFindAll` query ability. For global ability, omit the object parameter. + * @description List position labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ + export const canUseFindAll = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Create", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useTotalProfit` query ability. For global ability, omit the object parameter. + * @description Fake endpoint + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTotalProfit` query + */ + export const canUseTotalProfit = (object?: { officeId: string }) => + ["TotalProfitView", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< + "TotalProfitView", + "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) + >; + + /** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ + export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useExportPositions` mutation ability. For global ability, omit the object parameter. + * @description Export positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportPositions` mutation + */ + export const canUseExportPositions = (object?: { officeId: string }) => + ["Export", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Export", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useListRouteLabels` query ability. For global ability, omit the object parameter. + * @description List route labels for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRouteLabels` query + */ + export const canUseListRouteLabels = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useGetDuplicateDefaultParameters` query ability. For global ability, omit the object parameter. + * @description Read position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDuplicateDefaultParameters` query + */ + export const canUseGetDuplicateDefaultParameters = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ + export const canUseDuplicate = (object?: { officeId: string }) => + ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Create", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ + export const canUseCancel = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useRevertCancel` mutation ability. For global ability, omit the object parameter. + * @description Revert cancelled position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertCancel` mutation + */ + export const canUseRevertCancel = (object?: { officeId: string }) => + ["RevertCancel", object ? subject("Position", object) : "Position"] as AbilityTuple< + "RevertCancel", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useLinkChild` mutation ability. For global ability, omit the object parameter. + * @description Link positions to parent + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLinkChild` mutation + */ + export const canUseLinkChild = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUnlinkChild` mutation ability. For global ability, omit the object parameter. + * @description Link positions to parent + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlinkChild` mutation + */ + export const canUseUnlinkChild = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useListChild` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListChild` query + */ + export const canUseListChild = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/positions/positions.api.ts b/test/generated/dist/positions/positions.api.ts new file mode 100644 index 0000000..641e0fb --- /dev/null +++ b/test/generated/dist/positions/positions.api.ts @@ -0,0 +1,262 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionsApi { + export const findAll = ( + officeId: string, + limit: number, + filter?: PositionsModels.PositionLabelsFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsFindAllResponseSchema }, + `/offices/${officeId}/positions/labels`, + { + ...config, + params: { + filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: PositionsModels.PositionFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsPaginateResponseSchema }, + `/offices/${officeId}/positions`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = ( + officeId: string, + data: PositionsModels.CreatePositionRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions`, + ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), + config, + ); + }; + export const totalProfit = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.TotalProfitResponseSchema }, + `/offices/${officeId}/positions/fake-total-profit`, + config, + ); + }; + export const listAvailablePartnersFor = ( + officeId: string, + positionId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/positions/${positionId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { + type: "query", + name: "useCase", + }), + }, + }, + ); + }; + export const exportPositions = ( + officeId: string, + data: PositionsModels.PositionExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/exports`, + ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}`, + config, + ); + }; + export const update = ( + officeId: string, + positionId: string, + data: PositionsModels.UpdatePositionDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}`, + ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), + config, + ); + }; + export const listRouteLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/routes/labels`, + config, + ); + }; + export const getDuplicateDefaultParameters = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, + config, + ); + }; + export const duplicate = ( + officeId: string, + positionId: string, + data: PositionsModels.DuplicatePositionRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/duplicate`, + ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), + config, + ); + }; + export const cancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/cancel`, + undefined, + config, + ); + }; + export const revertCancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/uncancel`, + undefined, + config, + ); + }; + export const linkChild = ( + officeId: string, + positionId: string, + data: PositionsModels.LinkChildPositionsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/children`, + ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), + config, + ); + }; + export const unlinkChild = ( + officeId: string, + positionId: string, + data: PositionsModels.UnlinkChildPositionsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/children`, + ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), + config, + ); + }; + export const listChild = ( + officeId: string, + positionId: string, + limit: number, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: PositionsModels.ListChildResponseSchema }, + `/offices/${officeId}/positions/${positionId}/children`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; +} diff --git a/test/generated/dist/positions/positions.configs.ts b/test/generated/dist/positions/positions.configs.ts new file mode 100644 index 0000000..a75b161 --- /dev/null +++ b/test/generated/dist/positions/positions.configs.ts @@ -0,0 +1,258 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionsQueries } from "./positions.queries"; +import { PositionsAcl } from "./positions.acl"; + +export namespace PositionsConfigs { + export const positionsConfig = { + meta: { + title: "Positions", + }, + readAll: { + acl: PositionsAcl.canUsePaginate, + schema: PositionsModels.PositionPreviewResponseDtoSchema, + paginated: PositionsQueries.usePaginate, + infinite: PositionsQueries.usePaginateInfinite, + filters: { + schema: PositionsModels.PositionFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionsModels.PositionFilterDtoSchema, + options: { + inputs: { + transportMode: true, + customerId: true, + carrierId: true, + consigneeId: true, + isCancelled: true, + status: true, + number: true, + direction: true, + loadType: true, + serviceType: true, + employee: true, + searchQuery: true, + externalSystemId: true, + createdAt: true, + serviceDate: true, + departureDate: true, + arrivalDate: true, + blfromCostumerDate: true, + blfromCarrierDate: true, + customsDate: true, + vgmCustomerDate: true, + partnerNetworkId: true, + projectLiteId: true, + checklistItemsDone: true, + checklistItemsNotDone: true, + routing: true, + isExcludedFromStatistics: true, + isMasterPosition: true, + loadingPortId: true, + dischargePortId: true, + customerReference: true, + carrierReference: true, + consigneeReference: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: PositionsModels.PositionPreviewResponseDtoSchema, + options: { + columns: { + id: true, + externalSystemId: true, + transportMode: true, + direction: true, + loadType: true, + createdAt: true, + number: true, + isCancelled: true, + customer: true, + customerReference: true, + consignee: true, + consigneeReference: true, + carrier: true, + carrierReference: true, + positionNumber: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + origin: true, + loadDate: true, + loadingPort: true, + dischargePort: true, + destination: true, + deliveryDate: true, + equipment: true, + serviceType: true, + destinationOffice: true, + currency: true, + profit: true, + margin: true, + employee: true, + project: true, + serviceDate: true, + departureDate: true, + arrivalDate: true, + blfromCostumerDate: true, + blfromCarrierDate: true, + customsDate: true, + vgmCustomerDate: true, + routing: true, + notes: true, + isMasterPosition: true, + hasInvoices: true, + parentPosition: true, + }, + sortable: PositionsModels.PositionsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: PositionsAcl.canUseGet, + schema: CommonModels.PositionCoreResponseDtoSchema, + query: PositionsQueries.useGet, + }, + create: { + acl: PositionsAcl.canUseCreate, + schema: PositionsModels.CreatePositionRequestDtoSchema, + mutation: PositionsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PositionsModels.CreatePositionRequestDtoSchema, + options: { + inputs: { + section: true, + direction: true, + transportMode: true, + loadType: true, + serviceType: true, + estimatedServiceDate: true, + customerBusinessPartnerId: true, + }, + }, + }), + }, + update: { + acl: PositionsAcl.canUseUpdate, + schema: PositionsModels.UpdatePositionDtoSchema, + mutation: PositionsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PositionsModels.UpdatePositionDtoSchema, + options: { + inputs: { + externalSystemId: true, + statusDate: true, + status: true, + loadType: true, + incoterms: true, + secondIncoterms: true, + fillingCompany: true, + sellingContract: true, + fillingScacCode: true, + serviceValidity: true, + ratesValidity: true, + serviceType: true, + buyRateReference: true, + frequency: true, + isParentPosition: true, + isExcludedFromStatistics: true, + team: true, + salesRepId: true, + responsibleEmployeeId: true, + receivedByEmployeeId: true, + originOfficeId: true, + projectLiteId: true, + notes: true, + inttraTypeOfMove: true, + volumetricWeightModifier: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: PositionsAcl.canUseFindAll, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PositionsQueries.useFindAll, + infinite: PositionsQueries.useFindAllInfinite, + filters: { + schema: PositionsModels.PositionLabelsFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionsModels.PositionLabelsFilterDtoSchema, + options: { + inputs: { + search: true, + isParentPosition: true, + isLinkedPosition: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + }, + }), + }, + }; + + export const childrenConfig = { + meta: { + title: "Children", + }, + readAll: { + acl: PositionsAcl.canUseListChild, + schema: PositionsModels.ChildPositionResponseDtoSchema, + paginated: PositionsQueries.useListChild, + infinite: PositionsQueries.useListChildInfinite, + columns: dynamicColumns({ + schema: PositionsModels.ChildPositionResponseDtoSchema, + options: { + columns: { + id: true, + number: true, + packages: true, + weight: true, + volume: true, + customer: true, + profit: true, + }, + }, + }), + }, + create: { + acl: PositionsAcl.canUseLinkChild, + schema: PositionsModels.LinkChildPositionsRequestDtoSchema, + mutation: PositionsQueries.useLinkChild, + inputDefs: dynamicInputs({ + schema: PositionsModels.LinkChildPositionsRequestDtoSchema, + options: { + inputs: { + childPositionIds: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/dist/positions/positions.models.ts b/test/generated/dist/positions/positions.models.ts new file mode 100644 index 0000000..8949f00 --- /dev/null +++ b/test/generated/dist/positions/positions.models.ts @@ -0,0 +1,888 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionsModels { + /** + * PositionPreviewResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } externalSystemId + * @property { CommonModels.TransportModeEnum } transportMode + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { string } createdAt + * @property { string } number + * @property { boolean } isCancelled + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { string } customer.phone + * @property { string } customer.email + * @property { string } customerReference + * @property { object } consignee + * @property { string } consignee.id + * @property { string } consignee.name + * @property { string } consignee.matchCode + * @property { string } consignee.label + * @property { string } consigneeReference + * @property { object } carrier + * @property { string } carrier.id + * @property { string } carrier.name + * @property { string } carrier.matchCode + * @property { string } carrier.label + * @property { string } carrierReference + * @property { number } positionNumber + * @property { string } hblNumber + * @property { string } mblNumber + * @property { string } bookingNumber + * @property { string } vessel + * @property { string } voyage + * @property { string } vesselCarrier Carrier name from route point (sea positions only) + * @property { object } origin + * @property { string } origin.id + * @property { string } origin.name + * @property { string } loadDate + * @property { object } loadingPort + * @property { string } loadingPort.id + * @property { string } loadingPort.name + * @property { object } dischargePort + * @property { string } dischargePort.id + * @property { string } dischargePort.name + * @property { object } destination + * @property { string } destination.id + * @property { string } destination.name + * @property { string } deliveryDate + * @property { string } equipment + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { object } destinationOffice + * @property { string } destinationOffice.id + * @property { string } destinationOffice.name + * @property { string } currency + * @property { number } profit + * @property { number } margin + * @property { object } employee + * @property { string } employee.id + * @property { string } employee.name + * @property { object } project + * @property { string } project.id + * @property { string } project.name + * @property { string } serviceDate + * @property { string } departureDate + * @property { string } arrivalDate + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.EditorContentResponseDto } notes Notes + * @property { boolean } isMasterPosition + * @property { boolean } hasInvoices Whether this position has at least one invoice + * @property { object } parentPosition + * @property { string } parentPosition.id + * @property { string } parentPosition.number + */ + export const PositionPreviewResponseDtoSchema = z + .object({ + id: z.string(), + externalSystemId: z.string().nullish(), + transportMode: CommonModels.TransportModeEnumSchema, + direction: CommonModels.DirectionEnumSchema, + loadType: CommonModels.LoadTypeEnumSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }).nullish(), + number: z.string(), + isCancelled: z.boolean(), + customer: z + .object({ + id: z.string(), + name: z.string(), + matchCode: z.string(), + label: z.string(), + phone: z.string().nullish(), + email: z.string().nullish(), + }) + .readonly(), + customerReference: z.string().nullish(), + consignee: z + .object({ + id: z.string().nullable(), + name: z.string().nullable(), + matchCode: z.string().nullable(), + label: z.string().nullable(), + }) + .readonly() + .nullish(), + consigneeReference: z.string().nullish(), + carrier: z + .object({ + id: z.string().nullable(), + name: z.string().nullable(), + matchCode: z.string().nullable(), + label: z.string().nullable(), + }) + .readonly() + .nullish(), + carrierReference: z.string().nullish(), + positionNumber: z.number().nullish(), + hblNumber: z.string().nullish(), + mblNumber: z.string().nullish(), + bookingNumber: z.string().nullish(), + vessel: z.string().nullish(), + voyage: z.string().nullish(), + vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), + origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + loadDate: z.iso.datetime({ offset: true }).nullish(), + loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + deliveryDate: z.iso.datetime({ offset: true }).nullish(), + equipment: z.string().nullish(), + serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), + destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + currency: z.string().nullish(), + profit: z.number().nullish(), + margin: z.number().nullish(), + employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), + serviceDate: z.iso.datetime({ offset: true }).nullish(), + departureDate: z.iso.datetime({ offset: true }).nullish(), + arrivalDate: z.iso.datetime({ offset: true }).nullish(), + blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), + blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), + customsDate: z.iso.datetime({ offset: true }).nullish(), + vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), + routing: CommonModels.SeaRoutingEnumSchema.nullish(), + notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), + isMasterPosition: z.boolean(), + hasInvoices: z.boolean().describe("Whether this position has at least one invoice").nullish(), + parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).readonly().nullish(), + }) + .readonly(); + export type PositionPreviewResponseDto = z.infer; + + /** + * PositionFilterDtoSchema + * @type { object } + * @property { CommonModels.TransportModeEnum } transportMode + * @property { string[] } customerId + * @property { string[] } carrierId Filter positions by carrier IDs + * @property { string[] } consigneeId Filter positions by consignee IDs + * @property { boolean } isCancelled + * @property { CommonModels.PositionStatusEnum } status + * @property { string } number + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } employee Filter positions by employee IDs + * @property { string } searchQuery + * @property { string } externalSystemId Filter positions by external system ID (substring match) + * @property { CommonModels.DateRangeDto } createdAt + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.DateRangeDto } departureDate + * @property { CommonModels.DateRangeDto } arrivalDate + * @property { CommonModels.DateRangeDto } blfromCostumerDate + * @property { CommonModels.DateRangeDto } blfromCarrierDate + * @property { CommonModels.DateRangeDto } customsDate + * @property { CommonModels.DateRangeDto } vgmCustomerDate + * @property { string } partnerNetworkId Filter positions by partner network ID + * @property { string[] } projectLiteId Filter positions by project IDs + * @property { string[] } checklistItemsDone Checklist item ids that must be completed + * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics + * @property { boolean } isMasterPosition + * @property { string[] } loadingPortId Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure) + * @property { string[] } dischargePortId Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport) + * @property { string } customerReference Filter positions by customer reference + * @property { string } carrierReference Filter positions by carrier reference + * @property { string } consigneeReference Filter positions by consignee reference + * @property { string } hblNumber Filter positions by HBL/HAWB number + * @property { string } mblNumber Filter positions by MBL/MAWB number + * @property { string } bookingNumber Filter positions by booking number + * @property { string } vessel Filter positions by vessel name + * @property { string } voyage Filter positions by voyage number + * @property { string } vesselCarrier Filter positions by vessel or carrier name + */ + export const PositionFilterDtoSchema = z + .object({ + transportMode: CommonModels.TransportModeEnumSchema, + customerId: z.array(z.string()).readonly(), + carrierId: z.array(z.string()).readonly().describe("Filter positions by carrier IDs"), + consigneeId: z.array(z.string()).readonly().describe("Filter positions by consignee IDs"), + isCancelled: z.boolean(), + status: CommonModels.PositionStatusEnumSchema, + number: z.string(), + direction: CommonModels.DirectionEnumSchema, + loadType: CommonModels.LoadTypeEnumSchema, + serviceType: CommonModels.ServiceTypeEnumSchema, + employee: z.array(z.string()).readonly().describe("Filter positions by employee IDs"), + searchQuery: z.string(), + externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), + createdAt: CommonModels.DateRangeDtoSchema, + serviceDate: CommonModels.DateRangeDtoSchema, + departureDate: CommonModels.DateRangeDtoSchema, + arrivalDate: CommonModels.DateRangeDtoSchema, + blfromCostumerDate: CommonModels.DateRangeDtoSchema, + blfromCarrierDate: CommonModels.DateRangeDtoSchema, + customsDate: CommonModels.DateRangeDtoSchema, + vgmCustomerDate: CommonModels.DateRangeDtoSchema, + partnerNetworkId: z.string().describe("Filter positions by partner network ID"), + projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), + checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), + checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), + routing: CommonModels.SeaRoutingEnumSchema, + isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + isMasterPosition: z.boolean(), + loadingPortId: z + .array(z.string()) + .readonly() + .describe( + "Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure)", + ), + dischargePortId: z + .array(z.string()) + .readonly() + .describe( + "Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport)", + ), + customerReference: z.string().describe("Filter positions by customer reference"), + carrierReference: z.string().describe("Filter positions by carrier reference"), + consigneeReference: z.string().describe("Filter positions by consignee reference"), + hblNumber: z.string().describe("Filter positions by HBL/HAWB number"), + mblNumber: z.string().describe("Filter positions by MBL/MAWB number"), + bookingNumber: z.string().describe("Filter positions by booking number"), + vessel: z.string().describe("Filter positions by vessel name"), + voyage: z.string().describe("Filter positions by voyage number"), + vesselCarrier: z.string().describe("Filter positions by vessel or carrier name"), + }) + .readonly(); + export type PositionFilterDto = z.infer; + + /** + * PositionExportFilterDtoSchema + * @type { object } + * @property { CommonModels.TransportModeEnum } transportMode + * @property { string[] } customerId + * @property { boolean } isCancelled + * @property { CommonModels.PositionStatusEnum } status + * @property { string } number + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } responsibleEmployee Filter positions by responsible employee IDs + * @property { string } searchQuery + * @property { string } externalSystemId Filter positions by external system ID (substring match) + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.DateRangeDto } dateOfDeparture + * @property { CommonModels.DateRangeDto } dateOfArrival + * @property { CommonModels.DateRangeDto } blfromCostumerDate + * @property { CommonModels.DateRangeDto } blfromCarrierDate + * @property { CommonModels.DateRangeDto } customsDate + * @property { CommonModels.DateRangeDto } vgmCustomerDate + * @property { string } partnerNetworkId Filter positions by partner network ID + * @property { string[] } projectLiteId Filter positions by project IDs + * @property { string[] } checklistItemsDone Checklist item ids that must be completed + * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics + */ + export const PositionExportFilterDtoSchema = z + .object({ + transportMode: CommonModels.TransportModeEnumSchema, + customerId: z.array(z.string()).readonly(), + isCancelled: z.boolean(), + status: CommonModels.PositionStatusEnumSchema, + number: z.string(), + direction: CommonModels.DirectionEnumSchema, + loadType: CommonModels.LoadTypeEnumSchema, + serviceType: CommonModels.ServiceTypeEnumSchema, + responsibleEmployee: z.array(z.string()).readonly().describe("Filter positions by responsible employee IDs"), + searchQuery: z.string(), + externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), + statusDate: CommonModels.DateRangeDtoSchema, + serviceDate: CommonModels.DateRangeDtoSchema, + dateOfDeparture: CommonModels.DateRangeDtoSchema, + dateOfArrival: CommonModels.DateRangeDtoSchema, + blfromCostumerDate: CommonModels.DateRangeDtoSchema, + blfromCarrierDate: CommonModels.DateRangeDtoSchema, + customsDate: CommonModels.DateRangeDtoSchema, + vgmCustomerDate: CommonModels.DateRangeDtoSchema, + partnerNetworkId: z.string().describe("Filter positions by partner network ID"), + projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), + checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), + checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), + routing: CommonModels.SeaRoutingEnumSchema, + isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), + }) + .readonly(); + export type PositionExportFilterDto = z.infer; + + /** + * PositionExportColumnSchema + * @type { enum } + */ + export const PositionExportColumnSchema = z.enum([ + "id", + "externalSystemId", + "transportMode", + "direction", + "loadType", + "createdAt", + "number", + "isCancelled", + "customerName", + "customerPhone", + "customerEmail", + "customerReference", + "consigneeName", + "consigneeReference", + "carrierName", + "carrierReference", + "positionNumber", + "hblNumber", + "mblNumber", + "bookingNumber", + "vessel", + "voyage", + "originName", + "loadDate", + "loadingPortName", + "dischargePortName", + "destinationName", + "deliveryDate", + "equipment", + "serviceTypeName", + "departureDate", + "arrivalDate", + "destinationOfficeName", + "currency", + "profit", + "margin", + "employeeName", + "projectName", + "serviceDate", + "routing", + "notes", + "blFromCustomerDate", + "blFromCarrierDate", + "customsDate", + "vgmCustomerDate", + "isMasterPosition", + "parentPositionId", + "parentPositionNumber", + ]); + export type PositionExportColumn = z.infer; + export const PositionExportColumn = PositionExportColumnSchema.enum; + + /** + * PositionExportRequestDtoSchema + * @type { object } + * @property { string } order Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @property { PositionExportColumn[] } columns Min Items: `1` + * @property { PositionExportFilterDto } filter + */ + export const PositionExportRequestDtoSchema = z + .object({ + order: z + .string() + .describe( + "Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition", + ), + columns: z.array(PositionExportColumnSchema).readonly().min(1), + filter: PositionExportFilterDtoSchema, + }) + .readonly(); + export type PositionExportRequestDto = z.infer; + + /** + * CreatePositionRequestDtoSchema + * @type { object } + * @property { CommonModels.SectionEnum } section + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum } transportMode + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } estimatedServiceDate + * @property { string } customerBusinessPartnerId + */ + export const CreatePositionRequestDtoSchema = z + .object({ + section: CommonModels.SectionEnumSchema, + direction: CommonModels.DirectionEnumSchema, + transportMode: CommonModels.TransportModeEnumSchema, + loadType: CommonModels.LoadTypeEnumSchema, + serviceType: CommonModels.ServiceTypeEnumSchema, + estimatedServiceDate: z.iso.datetime({ offset: true }), + customerBusinessPartnerId: z.string(), + }) + .readonly(); + export type CreatePositionRequestDto = z.infer; + + /** + * DuplicatePositionPackageInformationParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } packageType + * @property { boolean } packageQuantity + * @property { boolean } packageDescription + * @property { boolean } packageHsCodes + * @property { boolean } packageNetWeight + * @property { boolean } packageGrossWeight + * @property { boolean } packageCaseMark + * @property { boolean } packageNote + * @property { boolean } packageCustomsMark + */ + export const DuplicatePositionPackageInformationParametersDtoSchema = z + .object({ + enabled: z.boolean(), + packageType: z.boolean(), + packageQuantity: z.boolean(), + packageDescription: z.boolean(), + packageHsCodes: z.boolean(), + packageNetWeight: z.boolean(), + packageGrossWeight: z.boolean(), + packageCaseMark: z.boolean(), + packageNote: z.boolean(), + packageCustomsMark: z.boolean(), + }) + .readonly(); + export type DuplicatePositionPackageInformationParametersDto = z.infer< + typeof DuplicatePositionPackageInformationParametersDtoSchema + >; + + /** + * DuplicatePositionCargoParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { DuplicatePositionPackageInformationParametersDto } packageInformation + */ + export const DuplicatePositionCargoParametersDtoSchema = z + .object({ enabled: z.boolean(), packageInformation: DuplicatePositionPackageInformationParametersDtoSchema }) + .readonly(); + export type DuplicatePositionCargoParametersDto = z.infer; + + /** + * DuplicatePositionOverviewParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } quoteReference + */ + export const DuplicatePositionOverviewParametersDtoSchema = z + .object({ enabled: z.boolean(), quoteReference: z.boolean() }) + .readonly(); + export type DuplicatePositionOverviewParametersDto = z.infer; + + /** + * DuplicatePositionInvolvedPartiesParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } involvedPartySection + */ + export const DuplicatePositionInvolvedPartiesParametersDtoSchema = z + .object({ enabled: z.boolean(), involvedPartySection: z.boolean() }) + .readonly(); + export type DuplicatePositionInvolvedPartiesParametersDto = z.infer< + typeof DuplicatePositionInvolvedPartiesParametersDtoSchema + >; + + /** + * DuplicatePositionRoutesParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } routeDates + * @property { boolean } routeLocation + */ + export const DuplicatePositionRoutesParametersDtoSchema = z + .object({ enabled: z.boolean(), routeDates: z.boolean(), routeLocation: z.boolean() }) + .readonly(); + export type DuplicatePositionRoutesParametersDto = z.infer; + + /** + * DuplicatePositionFinanceAccountParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } exchangeRate + */ + export const DuplicatePositionFinanceAccountParametersDtoSchema = z + .object({ enabled: z.boolean(), exchangeRate: z.boolean() }) + .readonly(); + export type DuplicatePositionFinanceAccountParametersDto = z.infer< + typeof DuplicatePositionFinanceAccountParametersDtoSchema + >; + + /** + * DuplicatePositionDocumentsParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } hblWorkingDocument + * @property { boolean } siWorkingDocument + */ + export const DuplicatePositionDocumentsParametersDtoSchema = z + .object({ enabled: z.boolean(), hblWorkingDocument: z.boolean(), siWorkingDocument: z.boolean() }) + .readonly(); + export type DuplicatePositionDocumentsParametersDto = z.infer; + + /** + * DuplicatePositionParametersDtoSchema + * @type { object } + * @property { DuplicatePositionOverviewParametersDto } overview + * @property { DuplicatePositionInvolvedPartiesParametersDto } involvedParties + * @property { DuplicatePositionCargoParametersDto } cargo + * @property { DuplicatePositionRoutesParametersDto } routes + * @property { DuplicatePositionFinanceAccountParametersDto } financeAccount + * @property { DuplicatePositionDocumentsParametersDto } documents + */ + export const DuplicatePositionParametersDtoSchema = z + .object({ + overview: DuplicatePositionOverviewParametersDtoSchema, + involvedParties: DuplicatePositionInvolvedPartiesParametersDtoSchema, + cargo: DuplicatePositionCargoParametersDtoSchema, + routes: DuplicatePositionRoutesParametersDtoSchema, + financeAccount: DuplicatePositionFinanceAccountParametersDtoSchema, + documents: DuplicatePositionDocumentsParametersDtoSchema, + }) + .readonly(); + export type DuplicatePositionParametersDto = z.infer; + + /** + * DuplicatePositionDefaultParametersResponseDtoSchema + * @type { object } + * @property { string } estimatedServiceDate Suggested estimated service date for the duplicated position (ISO 8601) + * @property { DuplicatePositionParametersDto } parameters Default duplication parameters with section and sub-parameter flags + */ + export const DuplicatePositionDefaultParametersResponseDtoSchema = z + .object({ + estimatedServiceDate: z + .string() + .describe("Suggested estimated service date for the duplicated position (ISO 8601)"), + parameters: DuplicatePositionParametersDtoSchema.describe( + "Default duplication parameters with section and sub-parameter flags", + ), + }) + .readonly(); + export type DuplicatePositionDefaultParametersResponseDto = z.infer< + typeof DuplicatePositionDefaultParametersResponseDtoSchema + >; + + /** + * PositionSectionEnumSchema + * @type { enum } + */ + export const PositionSectionEnumSchema = z.enum([ + "overview", + "involvedParties", + "cargo", + "financeAccount", + "routes", + "routeDates", + "documents", + ]); + export type PositionSectionEnum = z.infer; + export const PositionSectionEnum = PositionSectionEnumSchema.enum; + + /** + * DuplicatePositionRequestDtoSchema + * @type { object } + * @property { PositionSectionEnum[] } sections Legacy: sections to duplicate. Ignored when parameters is provided. + * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. + * @property { string } estimatedServiceDate + */ + export const DuplicatePositionRequestDtoSchema = z + .object({ + sections: z + .array(PositionSectionEnumSchema) + .readonly() + .describe("Legacy: sections to duplicate. Ignored when parameters is provided.") + .nullish(), + parameters: DuplicatePositionParametersDtoSchema.describe( + "Nested parameters for duplication control. Preferred over sections.", + ).nullish(), + estimatedServiceDate: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type DuplicatePositionRequestDto = z.infer; + + /** + * UpdatePositionDtoSchema + * @type { object } + * @property { string } externalSystemId + * @property { string } statusDate + * @property { CommonModels.PositionStatusEnum } status + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.IncotermsEnum } incoterms + * @property { CommonModels.IncotermsEnum } secondIncoterms + * @property { string } fillingCompany + * @property { string } sellingContract + * @property { string } fillingScacCode + * @property { string } serviceValidity + * @property { string } ratesValidity + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } buyRateReference + * @property { CommonModels.FrequencyEnum } frequency + * @property { boolean } isParentPosition + * @property { boolean } isExcludedFromStatistics + * @property { string } team + * @property { string } salesRepId + * @property { string } responsibleEmployeeId + * @property { string } receivedByEmployeeId + * @property { string } originOfficeId + * @property { string } projectLiteId + * @property { CommonModels.EditorContentUpdateDto } notes Notes + * @property { CommonModels.MovementTypeEnum } inttraTypeOfMove + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ + export const UpdatePositionDtoSchema = z + .object({ + externalSystemId: z.string(), + statusDate: z.iso.datetime({ offset: true }), + status: CommonModels.PositionStatusEnumSchema, + loadType: CommonModels.LoadTypeEnumSchema, + incoterms: CommonModels.IncotermsEnumSchema, + secondIncoterms: CommonModels.IncotermsEnumSchema, + fillingCompany: z.string(), + sellingContract: z.string(), + fillingScacCode: z.string(), + serviceValidity: z.iso.datetime({ offset: true }), + ratesValidity: z.iso.datetime({ offset: true }), + serviceType: CommonModels.ServiceTypeEnumSchema, + buyRateReference: z.string(), + frequency: CommonModels.FrequencyEnumSchema, + isParentPosition: z.boolean(), + isExcludedFromStatistics: z.boolean(), + team: z.string(), + salesRepId: z.string(), + responsibleEmployeeId: z.string(), + receivedByEmployeeId: z.string(), + originOfficeId: z.string(), + projectLiteId: z.string(), + notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), + inttraTypeOfMove: CommonModels.MovementTypeEnumSchema, + volumetricWeightModifier: z.number().describe("Volumetric weight modifier"), + }) + .readonly(); + export type UpdatePositionDto = z.infer; + + /** + * ChildPositionCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ChildPositionCustomerDto = z.infer; + + /** + * ChildPositionProfitDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currency + */ + export const ChildPositionProfitDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); + export type ChildPositionProfitDto = z.infer; + + /** + * ChildPositionResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { number } packages + * @property { number } weight + * @property { number } volume + * @property { ChildPositionCustomerDto } customer + * @property { ChildPositionProfitDto } profit + */ + export const ChildPositionResponseDtoSchema = z + .object({ + id: z.string(), + number: z.string(), + packages: z.number(), + weight: z.number(), + volume: z.number(), + customer: ChildPositionCustomerDtoSchema, + profit: ChildPositionProfitDtoSchema, + }) + .readonly(); + export type ChildPositionResponseDto = z.infer; + + /** + * PositionLabelsFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } isParentPosition + * @property { boolean } isLinkedPosition + */ + export const PositionLabelsFilterDtoSchema = z + .object({ search: z.string(), isParentPosition: z.boolean(), isLinkedPosition: z.boolean() }) + .readonly(); + export type PositionLabelsFilterDto = z.infer; + + /** + * PositionListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ + export const PositionListResponseDtoSchema = z + .object({ + items: z.array(z.string()).readonly().describe("Items"), + totalProfit: z.number(), + profitPerPosition: z.number(), + page: z.number().describe("1-indexed page number to begin from").nullish(), + cursor: z.string().describe("ID of item to start after").nullish(), + nextCursor: z.string().describe("Cursor for next set of items").nullish(), + limit: z.number().describe("Items per response"), + totalItems: z.number().describe("Total available items"), + }) + .readonly(); + export type PositionListResponseDto = z.infer; + + /** + * LinkChildPositionsRequestDtoSchema + * @type { object } + * @property { string[] } childPositionIds + */ + export const LinkChildPositionsRequestDtoSchema = z + .object({ childPositionIds: z.array(z.string()).readonly() }) + .readonly(); + export type LinkChildPositionsRequestDto = z.infer; + + /** + * UnlinkChildPositionsRequestDtoSchema + * @type { object } + * @property { string[] } childPositionIds + */ + export const UnlinkChildPositionsRequestDtoSchema = z + .object({ childPositionIds: z.array(z.string()).readonly() }) + .readonly(); + export type UnlinkChildPositionsRequestDto = z.infer; + + /** + * PositionsFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PositionsFindAllResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PositionsFindAllResponse = z.infer; + + /** + * PositionsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const PositionsPaginateOrderParamEnumSchema = z.enum([ + "number", + "transportMode", + "isCancelled", + "direction", + "loadType", + "serviceDate", + "createdAt", + "departureDate", + "arrivalDate", + "blfromCostumerDate", + "blfromCarrierDate", + "customsDate", + "vgmCustomerDate", + "serviceType", + "externalSystemId", + "employee", + "project", + "profit", + "margin", + "isMasterPosition", + ]); + export type PositionsPaginateOrderParamEnum = z.infer; + export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSchema.enum; + + /** + * PositionsPaginateResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionPreviewResponseDto[] } items + */ + export const PositionsPaginateResponseSchema = z.object({ + ...PositionListResponseDtoSchema.shape, + ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape, + }); + export type PositionsPaginateResponse = z.infer; + + /** + * TotalProfitResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionPreviewResponseDto[] } items + */ + export const TotalProfitResponseSchema = z.object({ + ...PositionListResponseDtoSchema.shape, + ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape, + }); + export type TotalProfitResponse = z.infer; + + /** + * PositionsListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ + export const PositionsListAvailablePartnersForResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PositionsListAvailablePartnersForResponse = z.infer< + typeof PositionsListAvailablePartnersForResponseSchema + >; + + /** + * ListRouteLabelsResponseSchema + * @type { array } + */ + export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type ListRouteLabelsResponse = z.infer; + + /** + * ListChildResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChildPositionResponseDto[] } items + */ + export const ListChildResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ChildPositionResponseDtoSchema).readonly() }).readonly().shape, + }); + export type ListChildResponse = z.infer; +} diff --git a/test/generated/dist/positions/positions.queries.ts b/test/generated/dist/positions/positions.queries.ts new file mode 100644 index 0000000..b3e5df0 --- /dev/null +++ b/test/generated/dist/positions/positions.queries.ts @@ -0,0 +1,757 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionsAcl } from "./positions.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionsApi } from "./positions.api"; + +export namespace PositionsQueries { + export const moduleName = QueryModule.Positions; + + export const keys = { + all: [moduleName] as const, + findAll: ( + officeId: string, + limit?: number, + filter?: PositionsModels.PositionLabelsFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/positions/labels", officeId, limit, filter, page, cursor] as const, + findAllInfinite: ( + officeId: string, + limit?: number, + filter?: PositionsModels.PositionLabelsFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/positions/labels", "infinite", officeId, limit, filter, cursor] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: PositionsModels.PositionFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/positions", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: PositionsModels.PositionFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/positions", "infinite", officeId, limit, order, filter, cursor] as const, + totalProfit: (officeId: string) => + [...keys.all, "/offices/:officeId/positions/fake-total-profit", officeId] as const, + listAvailablePartnersFor: ( + officeId: string, + positionId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/available-partners", + officeId, + positionId, + search, + useCase, + ] as const, + get: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId", officeId, positionId] as const, + listRouteLabels: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/routes/labels", officeId, positionId] as const, + getDuplicateDefaultParameters: (officeId: string, positionId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/duplicate/default-parameters", + officeId, + positionId, + ] as const, + listChild: (officeId: string, positionId: string, limit?: number, page?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/children", + officeId, + positionId, + limit, + page, + cursor, + ] as const, + listChildInfinite: (officeId: string, positionId: string, limit?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/children", + "infinite", + officeId, + positionId, + limit, + cursor, + ] as const, + }; + + /** + * Query `useFindAll` + * @summary List all positions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAll = ( + { + officeId, + limit, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + filter?: PositionsModels.PositionLabelsFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(officeId, limit, filter, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUseFindAll({ officeId })); + return PositionsApi.findAll(officeId, limit, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindAllInfinite + * @summary List all positions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindAllInfinite = ( + { + officeId, + limit, + filter, + cursor, + }: { officeId: string; limit: number; filter?: PositionsModels.PositionLabelsFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUseFindAll({ officeId })); + return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginate` + * @summary List positions + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @param { PositionsModels.PositionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: PositionsModels.PositionFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUsePaginate({ officeId })); + return PositionsApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary List positions + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @param { PositionsModels.PositionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { officeId: string; limit: number; order?: string; filter?: PositionsModels.PositionFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUsePaginate({ officeId })); + return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create position + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { PositionsModels.CreatePositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position created successfully + * @statusCodes [201, 400, 401, 404] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof PositionsApi.create, + { officeId: string; data: PositionsModels.CreatePositionRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PositionsAcl.canUseCreate({ officeId })); + return PositionsApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useTotalProfit` + * @summary List positions + * @permission Requires `canUseTotalProfit` ability + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useTotalProfit = ( + { officeId }: { officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.totalProfit(officeId), + queryFn: () => { + checkAcl(PositionsAcl.canUseTotalProfit({ officeId })); + return PositionsApi.totalProfit(officeId, config); + }, + ...options, + }); + }; + + /** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for a position + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListAvailablePartnersFor = ( + { + officeId, + positionId, + search, + useCase, + }: { + officeId: string; + positionId: string; + search?: string; + useCase?: CommonModels.PositionAvailablePartnersUseCase; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), + queryFn: () => { + checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId })); + return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase, config); + }, + ...options, + }); + }; + + /** + * Mutation `useExportPositions` - recommended when file should not be cached + * @summary Export positions to Excel + * @permission Requires `canUseExportPositions` ability + * @param { string } mutation.officeId Path parameter + * @param { PositionsModels.PositionExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportPositions = ( + options?: AppMutationOptions< + typeof PositionsApi.exportPositions, + { officeId: string; data: PositionsModels.PositionExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PositionsAcl.canUseExportPositions({ officeId })); + return PositionsApi.exportPositions(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGet` + * @summary Get position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Position retrieved successfully + * @statusCodes [200, 401, 403, 404] + */ + export const useGet = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseGet({ officeId })); + return PositionsApi.get(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.UpdatePositionDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position updated successfully + * @statusCodes [200, 400, 401, 404] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof PositionsApi.update, + { officeId: string; positionId: string; data: PositionsModels.UpdatePositionDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseUpdate({ officeId })); + return PositionsApi.update(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListRouteLabels` + * @summary List all route labels for a position + * @permission Requires `canUseListRouteLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListRouteLabels = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRouteLabels(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseListRouteLabels({ officeId })); + return PositionsApi.listRouteLabels(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Query `useGetDuplicateDefaultParameters` + * @summary Get default duplication parameters for a position + * @permission Requires `canUseGetDuplicateDefaultParameters` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Default parameters and suggested estimated service date + * @statusCodes [200, 401, 404] + */ + export const useGetDuplicateDefaultParameters = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId })); + return PositionsApi.getDuplicateDefaultParameters(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useDuplicate` + * @summary Duplicate position + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.DuplicatePositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position duplicated successfully + * @statusCodes [201, 400, 401, 404] + */ + export const useDuplicate = ( + options?: AppMutationOptions< + typeof PositionsApi.duplicate, + { officeId: string; positionId: string; data: PositionsModels.DuplicatePositionRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseDuplicate({ officeId })); + return PositionsApi.duplicate(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCancel` + * @summary Cancel position + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position cancelled successfully + * @statusCodes [200, 400, 401, 403, 404] + */ + export const useCancel = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionsAcl.canUseCancel({ officeId })); + return PositionsApi.cancel(officeId, positionId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useRevertCancel` + * @summary Revert cancelled position (accounting) + * @permission Requires `canUseRevertCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position reverted successfully + * @statusCodes [200, 400, 401, 403, 404] + */ + export const useRevertCancel = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionsAcl.canUseRevertCancel({ officeId })); + return PositionsApi.revertCancel(officeId, positionId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useLinkChild` + * @summary Link child positions to parent + * @permission Requires `canUseLinkChild` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.LinkChildPositionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useLinkChild = ( + options?: AppMutationOptions< + typeof PositionsApi.linkChild, + { officeId: string; positionId: string; data: PositionsModels.LinkChildPositionsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseLinkChild({ officeId })); + return PositionsApi.linkChild(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnlinkChild` + * @summary Unlink child positions from parent + * @permission Requires `canUseUnlinkChild` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.UnlinkChildPositionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnlinkChild = ( + options?: AppMutationOptions< + typeof PositionsApi.unlinkChild, + { officeId: string; positionId: string; data: PositionsModels.UnlinkChildPositionsRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseUnlinkChild({ officeId })); + return PositionsApi.unlinkChild(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListChild` + * @summary Get child positions for parent + * @permission Requires `canUseListChild` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListChild = ( + { + officeId, + positionId, + limit, + page, + cursor, + }: { officeId: string; positionId: string; limit: number; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listChild(officeId, positionId, limit, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUseListChild({ officeId })); + return PositionsApi.listChild(officeId, positionId, limit, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListChildInfinite + * @summary Get child positions for parent + * @permission Requires `canUseListChild` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListChildInfinite = ( + { officeId, positionId, limit, cursor }: { officeId: string; positionId: string; limit: number; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUseListChild({ officeId })); + return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/projectLite/projectLite.acl.ts b/test/generated/dist/projectLite/projectLite.acl.ts new file mode 100644 index 0000000..746ff45 --- /dev/null +++ b/test/generated/dist/projectLite/projectLite.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ProjectLiteAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create project in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Create", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List projects for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Read", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `usePaginateProjectLabels` query ability. For global ability, omit the object parameter. + * @description Paginate project labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateProjectLabels` query + */ + export const canUsePaginateProjectLabels = (object?: { officeId: string }) => + ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Read", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get project by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Read", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Update", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Archive", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Archive", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< + "Archive", + "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/projectLite/projectLite.api.ts b/test/generated/dist/projectLite/projectLite.api.ts new file mode 100644 index 0000000..d23da6b --- /dev/null +++ b/test/generated/dist/projectLite/projectLite.api.ts @@ -0,0 +1,136 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ProjectLiteModels } from "./projectLite.models"; + +export namespace ProjectLiteApi { + export const create = ( + officeId: string, + data: ProjectLiteModels.CreateProjectLiteRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite`, + ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), + config, + ); + }; + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, + `/offices/${officeId}/project-lite`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const paginateProjectLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, + `/offices/${officeId}/project-lite/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite/${id}`, + config, + ); + }; + export const update = ( + id: string, + officeId: string, + data: ProjectLiteModels.UpdateProjectLiteRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite/${id}`, + ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/project-lite/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/project-lite/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/projectLite/projectLite.configs.ts b/test/generated/dist/projectLite/projectLite.configs.ts new file mode 100644 index 0000000..c5f3f45 --- /dev/null +++ b/test/generated/dist/projectLite/projectLite.configs.ts @@ -0,0 +1,115 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ProjectLiteModels } from "./projectLite.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ProjectLiteQueries } from "./projectLite.queries"; +import { ProjectLiteAcl } from "./projectLite.acl"; + +export namespace ProjectLiteConfigs { + export const projectLiteConfig = { + meta: { + title: "Project Lite", + }, + readAll: { + acl: ProjectLiteAcl.canUsePaginate, + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + paginated: ProjectLiteQueries.usePaginate, + infinite: ProjectLiteQueries.usePaginateInfinite, + filters: { + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: ProjectLiteAcl.canUseFindById, + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + query: ProjectLiteQueries.useFindById, + }, + create: { + acl: ProjectLiteAcl.canUseCreate, + schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, + mutation: ProjectLiteQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + update: { + acl: ProjectLiteAcl.canUseUpdate, + schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, + mutation: ProjectLiteQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: ProjectLiteAcl.canUsePaginateProjectLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ProjectLiteQueries.usePaginateProjectLabels, + infinite: ProjectLiteQueries.usePaginateProjectLabelsInfinite, + filters: { + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/projectLite/projectLite.models.ts b/test/generated/dist/projectLite/projectLite.models.ts new file mode 100644 index 0000000..b70c907 --- /dev/null +++ b/test/generated/dist/projectLite/projectLite.models.ts @@ -0,0 +1,128 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ProjectLiteModels { + /** + * ProjectLiteEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type ProjectLiteEmployeeDTO = z.infer; + + /** + * ProjectLiteResponseDTOSchema + * @type { object } + * @property { string } id Project ID + * @property { string } name Project name + * @property { string } officeId Office ID + * @property { boolean } archived Is archived + * @property { string } createdById ID of the employee who created this project + * @property { ProjectLiteEmployeeDTO } createdBy Employee who created this project + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this project + * @property { ProjectLiteEmployeeDTO } updatedBy Employee who last updated this project + * @property { string } updatedAt Updated at + */ + export const ProjectLiteResponseDTOSchema = z + .object({ + id: z.string().describe("Project ID"), + name: z.string().describe("Project name"), + officeId: z.string().describe("Office ID"), + archived: z.boolean().describe("Is archived"), + createdById: z.string().describe("ID of the employee who created this project").nullish(), + createdBy: ProjectLiteEmployeeDTOSchema.describe("Employee who created this project").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedById: z.string().describe("ID of the employee who last updated this project").nullish(), + updatedBy: ProjectLiteEmployeeDTOSchema.describe("Employee who last updated this project").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + }) + .readonly(); + export type ProjectLiteResponseDTO = z.infer; + + /** + * CreateProjectLiteRequestDTOSchema + * @type { object } + * @property { string } name Project name + */ + export const CreateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); + export type CreateProjectLiteRequestDTO = z.infer; + + /** + * ProjectLiteFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ + export const ProjectLiteFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); + export type ProjectLiteFilterDto = z.infer; + + /** + * UpdateProjectLiteRequestDTOSchema + * @type { object } + * @property { string } name Project name + */ + export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); + export type UpdateProjectLiteRequestDTO = z.infer; + + /** + * ProjectLitePaginateOrderParamEnumSchema + * @type { enum } + */ + export const ProjectLitePaginateOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type ProjectLitePaginateOrderParamEnum = z.infer; + export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEnumSchema.enum; + + /** + * ProjectLitePaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ProjectLiteResponseDTO[] } items + */ + export const ProjectLitePaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ProjectLitePaginateResponse = z.infer; + + /** + * PaginateProjectLabelsOrderParamEnumSchema + * @type { enum } + */ + export const PaginateProjectLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type PaginateProjectLabelsOrderParamEnum = z.infer; + export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderParamEnumSchema.enum; + + /** + * PaginateProjectLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const PaginateProjectLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type PaginateProjectLabelsResponse = z.infer; +} diff --git a/test/generated/dist/projectLite/projectLite.queries.ts b/test/generated/dist/projectLite/projectLite.queries.ts new file mode 100644 index 0000000..aa91db8 --- /dev/null +++ b/test/generated/dist/projectLite/projectLite.queries.ts @@ -0,0 +1,415 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ProjectLiteAcl } from "./projectLite.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ProjectLiteModels } from "./projectLite.models"; +import { ProjectLiteApi } from "./projectLite.api"; + +export namespace ProjectLiteQueries { + export const moduleName = QueryModule.ProjectLite; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/project-lite", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/project-lite", "infinite", officeId, limit, order, filter, cursor] as const, + paginateProjectLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/project-lite/labels/paginate", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateProjectLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: ProjectLiteModels.ProjectLiteFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/project-lite/labels/paginate", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/project-lite/:id", id, officeId] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create project + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ProjectLiteModels.CreateProjectLiteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof ProjectLiteApi.create, + { officeId: string; data: ProjectLiteModels.CreateProjectLiteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ProjectLiteAcl.canUseCreate({ officeId })); + return ProjectLiteApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Get paginated projects + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ProjectLiteModels.ProjectLiteFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUsePaginate({ officeId })); + return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Get paginated projects + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ProjectLiteModels.ProjectLiteFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ProjectLiteAcl.canUsePaginate({ officeId })); + return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateProjectLabels` + * @summary Paginate project labels + * @permission Requires `canUsePaginateProjectLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateProjectLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ProjectLiteModels.ProjectLiteFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId })); + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateProjectLabelsInfinite + * @summary Paginate project labels + * @permission Requires `canUsePaginateProjectLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateProjectLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: ProjectLiteModels.ProjectLiteFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId })); + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get project by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUseFindById({ officeId })); + return ProjectLiteApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update project + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ProjectLiteModels.UpdateProjectLiteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ProjectLiteApi.update, + { id: string; officeId: string; data: ProjectLiteModels.UpdateProjectLiteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ProjectLiteAcl.canUseUpdate({ officeId })); + return ProjectLiteApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive project + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ProjectLiteAcl.canUseArchive({ officeId })); + return ProjectLiteApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive project + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId })); + return ProjectLiteApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/queryModules.ts b/test/generated/dist/queryModules.ts new file mode 100644 index 0000000..cb83878 --- /dev/null +++ b/test/generated/dist/queryModules.ts @@ -0,0 +1,96 @@ +export const enum QueryModule { + WorkingDocuments = "WorkingDocumentsQueries", + Offices = "OfficesQueries", + BankAccounts = "BankAccountsQueries", + Currencies = "CurrenciesQueries", + Countries = "CountriesQueries", + Folders = "FoldersQueries", + Files = "FilesQueries", + WorkingDocumentsTemplatedDocument = "WorkingDocumentsTemplatedDocumentQueries", + BusinessPartners = "BusinessPartnersQueries", + BusinessPartnerBookkeepingMappings = "BusinessPartnerBookkeepingMappingsQueries", + BusinessPartnerContacts = "BusinessPartnerContactsQueries", + Cities = "CitiesQueries", + Depots = "DepotsQueries", + PartnerNetworks = "PartnerNetworksQueries", + Warehouses = "WarehousesQueries", + UserActivity = "UserActivityQueries", + DocumentTemplates = "DocumentTemplatesQueries", + HsCodes = "HsCodesQueries", + CargoTypes = "CargoTypesQueries", + SeaPositions = "SeaPositionsQueries", + Terminals = "TerminalsQueries", + Airports = "AirportsQueries", + Ports = "PortsQueries", + ContainerYards = "ContainerYardsQueries", + PositionInvolvedParties = "PositionInvolvedPartiesQueries", + PositionRoutes = "PositionRoutesQueries", + AirPositions = "AirPositionsQueries", + PositionAccount = "PositionAccountQueries", + PositionAccountItems = "PositionAccountItemsQueries", + PositionProfitChangeTracking = "PositionProfitChangeTrackingQueries", + WorkingDocumentsExportDeclaration = "WorkingDocumentsExportDeclarationQueries", + PositionCargo = "PositionCargoQueries", + PositionCargoPackage = "PositionCargoPackageQueries", + PackageTypes = "PackageTypesQueries", + WorkingDocumentsHouseBl = "WorkingDocumentsHouseBlQueries", + WorkingDocumentsBlInstructions = "WorkingDocumentsBlInstructionsQueries", + WorkingDocumentsAmsInstructions = "WorkingDocumentsAmsInstructionsQueries", + WorkingDocumentsHouseAwb = "WorkingDocumentsHouseAwbQueries", + ChargeTypes = "ChargeTypesQueries", + WorkingDocumentsMasterAwb = "WorkingDocumentsMasterAwbQueries", + WorkingDocumentsCmrForm = "WorkingDocumentsCmrFormQueries", + WorkingDocumentsIsfForm = "WorkingDocumentsIsfFormQueries", + WorkingDocumentsFcrForm = "WorkingDocumentsFcrFormQueries", + ShippingInstructions = "ShippingInstructionsQueries", + EmployeeAccount = "EmployeeAccountQueries", + EmployeeSettings = "EmployeeSettingsQueries", + EmployeeRoles = "EmployeeRolesQueries", + EmployeePermissions = "EmployeePermissionsQueries", + EmployeeProfile = "EmployeeProfileQueries", + Employee = "EmployeeQueries", + Employment = "EmploymentQueries", + CustomerAccount = "CustomerAccountQueries", + Customers = "CustomersQueries", + Quotes = "QuotesQueries", + QuoteAccount = "QuoteAccountQueries", + QuoteProfitChangeTracking = "QuoteProfitChangeTrackingQueries", + SeaQuotes = "SeaQuotesQueries", + RoadQuotes = "RoadQuotesQueries", + QuoteDocument = "QuoteDocumentQueries", + QuoteCargo = "QuoteCargoQueries", + QuoteCargoPackage = "QuoteCargoPackageQueries", + QuoteRoutes = "QuoteRoutesQueries", + DunningManagement = "DunningManagementQueries", + DunningPartnerOutstandingInvoices = "DunningPartnerOutstandingInvoicesQueries", + DunningLevels = "DunningLevelsQueries", + DunningSystems = "DunningSystemsQueries", + DunningAccountStatement = "DunningAccountStatementQueries", + Positions = "PositionsQueries", + QuoteConversion = "QuoteConversionQueries", + Invoices = "InvoicesQueries", + VatRules = "VatRulesQueries", + InvoicePayments = "InvoicePaymentsQueries", + PaymentConfirmations = "PaymentConfirmationsQueries", + ProjectLite = "ProjectLiteQueries", + PositionChecklist = "PositionChecklistQueries", + ChecklistTemplates = "ChecklistTemplatesQueries", + BookkeepingExport = "BookkeepingExportQueries", + FactoringExport = "FactoringExportQueries", + FactoringMerge = "FactoringMergeQueries", + AWBStocks = "AWBStocksQueries", + MasterData = "MasterDataQueries", + ChecklistItems = "ChecklistItemsQueries", + MasterDataImport = "MasterDataImportQueries", + RemarkTemplates = "RemarkTemplatesQueries", + IntegrationChannels = "IntegrationChannelsQueries", + ControlTowerBookings = "ControlTowerBookingsQueries", + ControlTowerPackages = "ControlTowerPackagesQueries", + ControlTowerContainers = "ControlTowerContainersQueries", + ControlTowerAuth = "ControlTowerAuthQueries", + ControlTowerMe = "ControlTowerMeQueries", + ControlTowerSearch = "ControlTowerSearchQueries", + ControlTowerCalendar = "ControlTowerCalendarQueries", + InttraShippingInstructionMessages = "InttraShippingInstructionMessagesQueries", + InttraOfficeIntegration = "InttraOfficeIntegrationQueries", +} diff --git a/test/generated/dist/quoteAccount/quoteAccount.acl.ts b/test/generated/dist/quoteAccount/quoteAccount.acl.ts new file mode 100644 index 0000000..a86beb5 --- /dev/null +++ b/test/generated/dist/quoteAccount/quoteAccount.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteAccountAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description List quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCreateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateItem` mutation + */ + export const canUseCreateItem = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useDeleteItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteItem` mutation + */ + export const canUseDeleteItem = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateItem` mutation + */ + export const canUseUpdateItem = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useDuplicateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateItem` mutation + */ + export const canUseDuplicateItem = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/quoteAccount/quoteAccount.api.ts b/test/generated/dist/quoteAccount/quoteAccount.api.ts new file mode 100644 index 0000000..688dafc --- /dev/null +++ b/test/generated/dist/quoteAccount/quoteAccount.api.ts @@ -0,0 +1,58 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteAccountModels } from "./quoteAccount.models"; + +export namespace QuoteAccountApi { + export const get = (quoteId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/account`, + config, + ); + }; + export const createItem = ( + quoteId: string, + officeId: string, + data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items`, + ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), + config, + ); + }; + export const deleteItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, + undefined, + config, + ); + }; + export const updateItem = ( + quoteId: string, + itemId: string, + officeId: string, + data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, + ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), + config, + ); + }; + export const duplicateItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/quoteAccount/quoteAccount.models.ts b/test/generated/dist/quoteAccount/quoteAccount.models.ts new file mode 100644 index 0000000..cc26d54 --- /dev/null +++ b/test/generated/dist/quoteAccount/quoteAccount.models.ts @@ -0,0 +1,273 @@ +import { z } from "zod"; + +export namespace QuoteAccountModels { + /** + * QuoteAccountItemTypeEnumSchema + * @type { enum } + */ + export const QuoteAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); + export type QuoteAccountItemTypeEnum = z.infer; + export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; + + /** + * QuoteChargeDtoResponseSchema + * @type { object } + * @property { object } chargeType + * @property { string } chargeType.id + * @property { string } chargeType.name + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { object } buyVatRule + * @property { string } buyVatRule.id + * @property { string } buyVatRule.name + * @property { string } buyVatRule.matchcode + * @property { string } buyVatRule.printCode + * @property { object } vendor + * @property { string } vendor.id + * @property { string } vendor.name + * @property { string } vendor.matchCode + * @property { string } vendor.label + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { object } sellVatRule + * @property { string } sellVatRule.id + * @property { string } sellVatRule.name + * @property { string } sellVatRule.matchcode + * @property { string } sellVatRule.printCode + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + * @property { number } profit Profit amount + */ + export const QuoteChargeDtoResponseSchema = z + .object({ + chargeType: z.object({ id: z.string(), name: z.string() }).readonly(), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().describe("Quantity of the charge").nullish(), + buyRate: z.number().describe("Buy rate amount").nullish(), + buyCurrencyCode: z.string().describe("Buy rate currency code"), + buyVatRule: z + .object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }) + .readonly(), + vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), + sellRate: z.number().describe("Sell rate amount").nullish(), + sellCurrencyCode: z.string().describe("Sell rate currency code"), + sellVatRule: z + .object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }) + .readonly(), + customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), + profit: z.number().describe("Profit amount").nullish(), + }) + .readonly(); + export type QuoteChargeDtoResponse = z.infer; + + /** + * QuoteTextDtoResponseSchema + * @type { object } + * @property { string } content Text content + */ + export const QuoteTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); + export type QuoteTextDtoResponse = z.infer; + + /** + * QuoteAccountItemDtoResponseSchema + * @type { object } + * @property { string } id Item ID + * @property { QuoteAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE + * @property { QuoteTextDtoResponse } text Text data if type is TEXT + */ + export const QuoteAccountItemDtoResponseSchema = z + .object({ + id: z.string().describe("Item ID"), + type: QuoteAccountItemTypeEnumSchema.describe("Item type"), + orderPosition: z.number().describe("Order position of the item"), + charge: QuoteChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), + text: QuoteTextDtoResponseSchema.describe("Text data if type is TEXT").nullish(), + }) + .readonly(); + export type QuoteAccountItemDtoResponse = z.infer; + + /** + * QuoteAccountResponseDtoSchema + * @type { object } + * @property { string } id Account ID + * @property { string } quoteId Quote ID + * @property { QuoteAccountItemDtoResponse[] } items Account items + * @property { object } totals Account totals + * @property { number } totals.totalBuyRates + * @property { number } totals.totalSellRates + * @property { number } totals.totalProfit + * @property { number } totals.displayAmount + * @property { string } totals.displayCurrencyCode + * @property { object[] } totalsPerCurrency Account totals per currency + * @property { number } totalsPerCurrency.[0].totalBuyRates + * @property { number } totalsPerCurrency.[0].totalSellRates + * @property { number } totalsPerCurrency.[0].totalProfit + * @property { number } totalsPerCurrency.[0].displayAmount + * @property { string } totalsPerCurrency.[0].displayCurrencyCode + */ + export const QuoteAccountResponseDtoSchema = z + .object({ + id: z.string().describe("Account ID"), + quoteId: z.string().describe("Quote ID"), + items: z.array(QuoteAccountItemDtoResponseSchema).readonly().describe("Account items"), + totals: z + .object({ + totalBuyRates: z.number(), + totalSellRates: z.number(), + totalProfit: z.number(), + displayAmount: z.number(), + displayCurrencyCode: z.string(), + }) + .readonly() + .describe("Account totals"), + totalsPerCurrency: z + .array( + z + .object({ + totalBuyRates: z.number(), + totalSellRates: z.number(), + totalProfit: z.number(), + displayAmount: z.number(), + displayCurrencyCode: z.string(), + }) + .readonly(), + ) + .readonly() + .describe("Account totals per currency"), + }) + .readonly(); + export type QuoteAccountResponseDto = z.infer; + + /** + * CreateQuoteChargeDataDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1`. Default: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code. Default: `EUR` + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code. Default: `EUR` + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ + export const CreateQuoteChargeDataDtoSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID"), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().gte(1).describe("Quantity of the charge").default(1), + buyRate: z.number().describe("Buy rate amount"), + buyCurrencyCode: z.string().describe("Buy rate currency code").default("EUR"), + buyVatRuleId: z.string().describe("Buy VAT rule ID"), + vendorId: z.string().describe("Vendor ID"), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), + sellRate: z.number().describe("Sell rate amount"), + sellCurrencyCode: z.string().describe("Sell rate currency code").default("EUR"), + sellVatRuleId: z.string().describe("Sell VAT rule ID"), + customerId: z.string().describe("Customer ID"), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), + }) + .readonly(); + export type CreateQuoteChargeDataDto = z.infer; + + /** + * CreateQuoteTextDataDtoSchema + * @type { object } + * @property { string } content Text content + */ + export const CreateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); + export type CreateQuoteTextDataDto = z.infer; + + /** + * CreateQuoteAccountItemRequestDtoSchema + * @type { object } + * @property { QuoteAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { CreateQuoteChargeDataDto } charge Charge data if type is CHARGE + * @property { CreateQuoteTextDataDto } text Text data if type is TEXT + */ + export const CreateQuoteAccountItemRequestDtoSchema = z + .object({ + type: QuoteAccountItemTypeEnumSchema.describe("Item type"), + orderPosition: z.number().describe("Order position of the item").nullish(), + charge: CreateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE").nullish(), + text: CreateQuoteTextDataDtoSchema.describe("Text data if type is TEXT").nullish(), + }) + .readonly(); + export type CreateQuoteAccountItemRequestDto = z.infer; + + /** + * UpdateQuoteChargeDataDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ + export const UpdateQuoteChargeDataDtoSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID"), + additionalText: z.string().describe("Additional text for the charge"), + quantity: z.number().gte(1).describe("Quantity of the charge"), + buyRate: z.number().describe("Buy rate amount").nullable(), + buyCurrencyCode: z.string().describe("Buy rate currency code"), + buyVatRuleId: z.string().describe("Buy VAT rule ID").nullable(), + vendorId: z.string().describe("Vendor ID").nullable(), + buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), + sellRate: z.number().describe("Sell rate amount").nullable(), + sellCurrencyCode: z.string().describe("Sell rate currency code"), + sellVatRuleId: z.string().describe("Sell VAT rule ID").nullable(), + customerId: z.string().describe("Customer ID").nullable(), + sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), + }) + .readonly(); + export type UpdateQuoteChargeDataDto = z.infer; + + /** + * UpdateQuoteTextDataDtoSchema + * @type { object } + * @property { string } content Text content + */ + export const UpdateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); + export type UpdateQuoteTextDataDto = z.infer; + + /** + * UpdateQuoteAccountItemRequestDtoSchema + * @type { object } + * @property { number } orderPosition Order position of the item + * @property { UpdateQuoteChargeDataDto } charge Charge data if type is CHARGE + * @property { UpdateQuoteTextDataDto } text Text data if type is TEXT + */ + export const UpdateQuoteAccountItemRequestDtoSchema = z + .object({ + orderPosition: z.number().describe("Order position of the item"), + charge: UpdateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE"), + text: UpdateQuoteTextDataDtoSchema.describe("Text data if type is TEXT"), + }) + .readonly(); + export type UpdateQuoteAccountItemRequestDto = z.infer; +} diff --git a/test/generated/dist/quoteAccount/quoteAccount.queries.ts b/test/generated/dist/quoteAccount/quoteAccount.queries.ts new file mode 100644 index 0000000..abb1ca4 --- /dev/null +++ b/test/generated/dist/quoteAccount/quoteAccount.queries.ts @@ -0,0 +1,187 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteAccountAcl } from "./quoteAccount.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteAccountModels } from "./quoteAccount.models"; +import { QuoteAccountApi } from "./quoteAccount.api"; + +export namespace QuoteAccountQueries { + export const moduleName = QueryModule.QuoteAccount; + + export const keys = { + all: [moduleName] as const, + get: (quoteId: string, officeId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/account", quoteId, officeId] as const, + }; + + /** + * Query `useGet` + * @summary Get quote account details + * @permission Requires `canUseGet` ability + * @param { string } object.quoteId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { quoteId, officeId }: { quoteId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(quoteId, officeId), + queryFn: () => { + checkAcl(QuoteAccountAcl.canUseGet({ officeId })); + return QuoteAccountApi.get(quoteId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateItem` + * @summary Create quote account item + * @permission Requires `canUseCreateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { QuoteAccountModels.CreateQuoteAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateItem = ( + options?: AppMutationOptions< + typeof QuoteAccountApi.createItem, + { quoteId: string; officeId: string; data: QuoteAccountModels.CreateQuoteAccountItemRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, officeId, data }) => { + checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId })); + return QuoteAccountApi.createItem(quoteId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteItem` + * @summary Delete quote account item + * @permission Requires `canUseDeleteItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteItem = ( + options?: AppMutationOptions< + typeof QuoteAccountApi.deleteItem, + { quoteId: string; itemId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId }) => { + checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId })); + return QuoteAccountApi.deleteItem(quoteId, itemId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateItem` + * @summary Update quote account item + * @permission Requires `canUseUpdateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { QuoteAccountModels.UpdateQuoteAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateItem = ( + options?: AppMutationOptions< + typeof QuoteAccountApi.updateItem, + { quoteId: string; itemId: string; officeId: string; data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId, data }) => { + checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId })); + return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicateItem` + * @summary Duplicate quote account item + * @permission Requires `canUseDuplicateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicateItem = ( + options?: AppMutationOptions< + typeof QuoteAccountApi.duplicateItem, + { quoteId: string; itemId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId }) => { + checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId })); + return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/quoteCargo/quoteCargo.acl.ts b/test/generated/dist/quoteCargo/quoteCargo.acl.ts new file mode 100644 index 0000000..fcf6fb3 --- /dev/null +++ b/test/generated/dist/quoteCargo/quoteCargo.acl.ts @@ -0,0 +1,99 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteCargoAcl { + /** + * Use for `useListCargosByQuoteId` query ability. For global ability, omit the object parameter. + * @description List cargo items by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByQuoteId` query + */ + export const canUseListCargosByQuoteId = (object?: { officeId: string }) => + ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Read", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. + * @description List cargo labels by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query + */ + export const canUseListCargoLabels = (object?: { officeId: string }) => + ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Read", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. + * @description Get cargo summary by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query + */ + export const canUseGetCargoSummary = (object?: { officeId: string }) => + ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Read", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. + * @description Get cargo item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query + */ + export const canUseGetCargoById = (object?: { officeId: string }) => + ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Read", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. + * @description Update cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation + */ + export const canUseUpdateCargo = (object?: { officeId: string }) => + ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Update", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation + */ + export const canUseDeleteCargo = (object?: { officeId: string }) => + ["Delete", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Delete", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation + */ + export const canUseCreateBulkCargos = (object?: { officeId: string }) => + ["Create", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Create", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation + */ + export const canUseDuplicateCargo = (object?: { officeId: string }) => + ["Duplicate", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Duplicate", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/quoteCargo/quoteCargo.api.ts b/test/generated/dist/quoteCargo/quoteCargo.api.ts new file mode 100644 index 0000000..ccec850 --- /dev/null +++ b/test/generated/dist/quoteCargo/quoteCargo.api.ts @@ -0,0 +1,109 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteCargoModels } from "./quoteCargo.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoApi { + export const listCargosByQuoteId = ( + officeId: string, + quoteId: string, + limit: number, + order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos`, + { + ...config, + params: { + order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { + type: "query", + name: "order", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const listCargoLabels = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, + config, + ); + }; + export const getCargoSummary = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, + config, + ); + }; + export const getCargoById = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + config, + ); + }; + export const updateCargo = ( + officeId: string, + quoteId: string, + cargoId: string, + data: CommonModels.UpdatePositionCargoDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), + config, + ); + }; + export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + undefined, + config, + ); + }; + export const createBulkCargos = ( + numberOfCargos: number, + officeId: string, + quoteId: string, + data: CommonModels.CreatePositionCargoDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config, + ); + }; + export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/quoteCargo/quoteCargo.configs.ts b/test/generated/dist/quoteCargo/quoteCargo.configs.ts new file mode 100644 index 0000000..a00a304 --- /dev/null +++ b/test/generated/dist/quoteCargo/quoteCargo.configs.ts @@ -0,0 +1,99 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoQueries } from "./quoteCargo.queries"; +import { QuoteCargoAcl } from "./quoteCargo.acl"; + +export namespace QuoteCargoConfigs { + export const cargosConfig = { + meta: { + title: "Cargos", + }, + readAll: { + acl: QuoteCargoAcl.canUseListCargosByQuoteId, + schema: CommonModels.PositionCargoResponseDTOSchema, + paginated: QuoteCargoQueries.useListCargosByQuoteId, + infinite: QuoteCargoQueries.useListCargosByQuoteIdInfinite, + columns: dynamicColumns({ + schema: CommonModels.PositionCargoResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + quoteId: true, + rootFolderId: true, + cargoType: true, + autoCalculateTotals: true, + autoCalculateRates: true, + autoCalculateVgm: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + rateOptions: true, + rateClass: true, + textForCustoms: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + ratePerKg: true, + totalRate: true, + tare: true, + vgm: true, + hsCodeLabels: true, + note: true, + packages: true, + createdAt: true, + updatedAt: true, + completeWeight: true, + packageTotals: true, + }, + }, + }), + }, + read: { + acl: QuoteCargoAcl.canUseGetCargoById, + schema: CommonModels.PositionCargoResponseDTOSchema, + query: QuoteCargoQueries.useGetCargoById, + }, + update: { + acl: QuoteCargoAcl.canUseUpdateCargo, + schema: CommonModels.UpdatePositionCargoDTOSchema, + mutation: QuoteCargoQueries.useUpdateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.UpdatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, + }), + }, + delete: { + acl: QuoteCargoAcl.canUseDeleteCargo, + mutation: QuoteCargoQueries.useDeleteCargo, + }, + }; +} diff --git a/test/generated/dist/quoteCargo/quoteCargo.models.ts b/test/generated/dist/quoteCargo/quoteCargo.models.ts new file mode 100644 index 0000000..8549bbb --- /dev/null +++ b/test/generated/dist/quoteCargo/quoteCargo.models.ts @@ -0,0 +1,55 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoModels { + /** + * ListCargosByQuoteIdOrderParamSchema + * @type { array } + * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + */ + export const ListCargosByQuoteIdOrderParamSchema = z + .array(CommonModels.PositionCargoPaginationOrderFieldSchema) + .readonly() + .describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt") + .nullish(); + export type ListCargosByQuoteIdOrderParam = z.infer; + + /** + * ListCargosByQuoteIdResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.PositionCargoResponseDTO[] } items + */ + export const ListCargosByQuoteIdResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape, + }); + export type ListCargosByQuoteIdResponse = z.infer; + + /** + * QuoteCargoListCargoLabelsResponseSchema + * @type { array } + */ + export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); + export type QuoteCargoListCargoLabelsResponse = z.infer; + + /** + * QuoteCargoGetCargoSummaryResponseSchema + * @type { array } + */ + export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); + export type QuoteCargoGetCargoSummaryResponse = z.infer; + + /** + * QuoteCargoCreateBulkCargosResponseSchema + * @type { array } + */ + export const QuoteCargoCreateBulkCargosResponseSchema = z + .array(CommonModels.PositionCargoResponseDTOSchema) + .readonly(); + export type QuoteCargoCreateBulkCargosResponse = z.infer; +} diff --git a/test/generated/dist/quoteCargo/quoteCargo.queries.ts b/test/generated/dist/quoteCargo/quoteCargo.queries.ts new file mode 100644 index 0000000..4b8d52a --- /dev/null +++ b/test/generated/dist/quoteCargo/quoteCargo.queries.ts @@ -0,0 +1,380 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteCargoAcl } from "./quoteCargo.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteCargoModels } from "./quoteCargo.models"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoApi } from "./quoteCargo.api"; + +export namespace QuoteCargoQueries { + export const moduleName = QueryModule.QuoteCargo; + + export const keys = { + all: [moduleName] as const, + listCargosByQuoteId: ( + officeId: string, + quoteId: string, + limit?: number, + order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/cargos", + officeId, + quoteId, + limit, + order, + page, + cursor, + ] as const, + listCargosByQuoteIdInfinite: ( + officeId: string, + quoteId: string, + limit?: number, + order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/cargos", + "infinite", + officeId, + quoteId, + limit, + order, + cursor, + ] as const, + listCargoLabels: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/labels", officeId, quoteId] as const, + getCargoSummary: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/summary", officeId, quoteId] as const, + getCargoById: (officeId: string, quoteId: string, cargoId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/:cargoId", officeId, quoteId, cargoId] as const, + }; + + /** + * Query `useListCargosByQuoteId` + * @summary List all cargo items for a quote + * @permission Requires `canUseListCargosByQuoteId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargosByQuoteId = ( + { + officeId, + quoteId, + limit, + order, + page, + cursor, + }: { + officeId: string; + quoteId: string; + limit: number; + order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId })); + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListCargosByQuoteIdInfinite + * @summary List all cargo items for a quote + * @permission Requires `canUseListCargosByQuoteId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargosByQuoteIdInfinite = ( + { + officeId, + quoteId, + limit, + order, + cursor, + }: { + officeId: string; + quoteId: string; + limit: number; + order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId })); + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useListCargoLabels` + * @summary List all cargo labels for a quote + * @permission Requires `canUseListCargoLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListCargoLabels = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargoLabels(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId })); + return QuoteCargoApi.listCargoLabels(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Query `useGetCargoSummary` + * @summary Get cargo summary grouped by transport unit type + * @permission Requires `canUseGetCargoSummary` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCargoSummary = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoSummary(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId })); + return QuoteCargoApi.getCargoSummary(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Query `useGetCargoById` + * @summary Get a specific cargo item + * @permission Requires `canUseGetCargoById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { string } object.cargoId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCargoById = ( + { officeId, quoteId, cargoId }: { officeId: string; quoteId: string; cargoId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoById(officeId, quoteId, cargoId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId })); + return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCargo` + * @summary Update a cargo item + * @permission Requires `canUseUpdateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCargo = ( + options?: AppMutationOptions< + typeof QuoteCargoApi.updateCargo, + { officeId: string; quoteId: string; cargoId: string; data: CommonModels.UpdatePositionCargoDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, data }) => { + checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId })); + return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteCargo` + * @summary Delete a cargo item + * @permission Requires `canUseDeleteCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteCargo = ( + options?: AppMutationOptions< + typeof QuoteCargoApi.deleteCargo, + { officeId: string; quoteId: string; cargoId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId }) => { + checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId })); + return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCreateBulkCargos` + * @summary Create a new cargo item + * @permission Requires `canUseCreateBulkCargos` ability + * @param { number } mutation.numberOfCargos Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateBulkCargos = ( + options?: AppMutationOptions< + typeof QuoteCargoApi.createBulkCargos, + { numberOfCargos: number; officeId: string; quoteId: string; data: CommonModels.CreatePositionCargoDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { + checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId })); + return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicateCargo` + * @summary Duplicate a cargo item + * @permission Requires `canUseDuplicateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicateCargo = ( + options?: AppMutationOptions< + typeof QuoteCargoApi.duplicateCargo, + { officeId: string; quoteId: string; cargoId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId }) => { + checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId })); + return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/quoteCargoPackage/quoteCargoPackage.acl.ts b/test/generated/dist/quoteCargoPackage/quoteCargoPackage.acl.ts new file mode 100644 index 0000000..d129f69 --- /dev/null +++ b/test/generated/dist/quoteCargoPackage/quoteCargoPackage.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteCargoPackageAcl { + /** + * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. + * @description Create cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation + */ + export const canUseCreatePackage = (object?: { officeId: string }) => + ["Create", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Create", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. + * @description Update cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation + */ + export const canUseUpdatePackage = (object?: { officeId: string }) => + ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Update", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation + */ + export const canUseDeletePackage = (object?: { officeId: string }) => + ["Delete", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Delete", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation + */ + export const canUseDuplicatePackage = (object?: { officeId: string }) => + ["Duplicate", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Duplicate", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; + + /** + * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. + * @description Move cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation + */ + export const canUseMovePackage = (object?: { officeId: string }) => + ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< + "Update", + "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/quoteCargoPackage/quoteCargoPackage.api.ts b/test/generated/dist/quoteCargoPackage/quoteCargoPackage.api.ts new file mode 100644 index 0000000..27ef13d --- /dev/null +++ b/test/generated/dist/quoteCargoPackage/quoteCargoPackage.api.ts @@ -0,0 +1,80 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoPackageApi { + export const createPackage = ( + officeId: string, + quoteId: string, + cargoId: string, + data: CommonModels.CreatePositionCargoPackageDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, + ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), + config, + ); + }; + export const updatePackage = ( + officeId: string, + quoteId: string, + cargoId: string, + packageId: string, + data: CommonModels.UpdatePositionCargoPackageDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), + config, + ); + }; + export const deletePackage = ( + officeId: string, + quoteId: string, + cargoId: string, + packageId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, + undefined, + config, + ); + }; + export const duplicatePackage = ( + officeId: string, + quoteId: string, + cargoId: string, + packageId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, + undefined, + config, + ); + }; + export const movePackage = ( + officeId: string, + quoteId: string, + cargoId: string, + packageId: string, + data: CommonModels.MovePositionCargoPackageRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, + ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/quoteCargoPackage/quoteCargoPackage.queries.ts b/test/generated/dist/quoteCargoPackage/quoteCargoPackage.queries.ts new file mode 100644 index 0000000..38cf1ca --- /dev/null +++ b/test/generated/dist/quoteCargoPackage/quoteCargoPackage.queries.ts @@ -0,0 +1,207 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteCargoPackageAcl } from "./quoteCargoPackage.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoPackageApi } from "./quoteCargoPackage.api"; + +export namespace QuoteCargoPackageQueries { + export const moduleName = QueryModule.QuoteCargoPackage; + + /** + * Mutation `useCreatePackage` + * @summary Create a new package for a cargo + * @permission Requires `canUseCreatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreatePackage = ( + options?: AppMutationOptions< + typeof QuoteCargoPackageApi.createPackage, + { officeId: string; quoteId: string; cargoId: string; data: CommonModels.CreatePositionCargoPackageDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId })); + return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdatePackage` + * @summary Update a package + * @permission Requires `canUseUpdatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdatePackage = ( + options?: AppMutationOptions< + typeof QuoteCargoPackageApi.updatePackage, + { + officeId: string; + quoteId: string; + cargoId: string; + packageId: string; + data: CommonModels.UpdatePositionCargoPackageDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId })); + return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeletePackage` + * @summary Delete a package + * @permission Requires `canUseDeletePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeletePackage = ( + options?: AppMutationOptions< + typeof QuoteCargoPackageApi.deletePackage, + { officeId: string; quoteId: string; cargoId: string; packageId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { + checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId })); + return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicatePackage` + * @summary Duplicate a package + * @permission Requires `canUseDuplicatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicatePackage = ( + options?: AppMutationOptions< + typeof QuoteCargoPackageApi.duplicatePackage, + { officeId: string; quoteId: string; cargoId: string; packageId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { + checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId })); + return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMovePackage` + * @summary Move a package to a different cargo + * @permission Requires `canUseMovePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useMovePackage = ( + options?: AppMutationOptions< + typeof QuoteCargoPackageApi.movePackage, + { + officeId: string; + quoteId: string; + cargoId: string; + packageId: string; + data: CommonModels.MovePositionCargoPackageRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId })); + return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/quoteConversion/quoteConversion.acl.ts b/test/generated/dist/quoteConversion/quoteConversion.acl.ts new file mode 100644 index 0000000..3c9b7f1 --- /dev/null +++ b/test/generated/dist/quoteConversion/quoteConversion.acl.ts @@ -0,0 +1,15 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteConversionAcl { + /** + * Use for `useConvertQuoteToPosition` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useConvertQuoteToPosition` mutation + */ + export const canUseConvertQuoteToPosition = (object?: { officeId: string }) => + ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Create", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/quoteConversion/quoteConversion.api.ts b/test/generated/dist/quoteConversion/quoteConversion.api.ts new file mode 100644 index 0000000..7bc1111 --- /dev/null +++ b/test/generated/dist/quoteConversion/quoteConversion.api.ts @@ -0,0 +1,21 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteConversionModels } from "./quoteConversion.models"; + +export namespace QuoteConversionApi { + export const convertQuoteToPosition = ( + officeId: string, + quoteId: string, + data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/convert`, + ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/quoteConversion/quoteConversion.models.ts b/test/generated/dist/quoteConversion/quoteConversion.models.ts new file mode 100644 index 0000000..9eab729 --- /dev/null +++ b/test/generated/dist/quoteConversion/quoteConversion.models.ts @@ -0,0 +1,13 @@ +import { z } from "zod"; + +export namespace QuoteConversionModels { + /** + * ConvertQuoteToPositionRequestDtoSchema + * @type { object } + * @property { string } estimatedServiceDate + */ + export const ConvertQuoteToPositionRequestDtoSchema = z + .object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }) + .readonly(); + export type ConvertQuoteToPositionRequestDto = z.infer; +} diff --git a/test/generated/dist/quoteConversion/quoteConversion.queries.ts b/test/generated/dist/quoteConversion/quoteConversion.queries.ts new file mode 100644 index 0000000..3695789 --- /dev/null +++ b/test/generated/dist/quoteConversion/quoteConversion.queries.ts @@ -0,0 +1,48 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteConversionAcl } from "./quoteConversion.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteConversionModels } from "./quoteConversion.models"; +import { QuoteConversionApi } from "./quoteConversion.api"; + +export namespace QuoteConversionQueries { + export const moduleName = QueryModule.QuoteConversion; + + /** + * Mutation `useConvertQuoteToPosition` + * @summary Convert quote to position + * @permission Requires `canUseConvertQuoteToPosition` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteConversionModels.ConvertQuoteToPositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Quote converted to position successfully + * @statusCodes [201, 400, 401, 404] + */ + export const useConvertQuoteToPosition = ( + options?: AppMutationOptions< + typeof QuoteConversionApi.convertQuoteToPosition, + { officeId: string; quoteId: string; data: QuoteConversionModels.ConvertQuoteToPositionRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId })); + return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/quoteDocument/quoteDocument.acl.ts b/test/generated/dist/quoteDocument/quoteDocument.acl.ts new file mode 100644 index 0000000..bb144a6 --- /dev/null +++ b/test/generated/dist/quoteDocument/quoteDocument.acl.ts @@ -0,0 +1,63 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteDocumentAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useGetPreview` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` mutation + */ + export const canUseGetPreview = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ + export const canUseGenerate = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useGenerateEml` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateEml` mutation + */ + export const canUseGenerateEml = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/quoteDocument/quoteDocument.api.ts b/test/generated/dist/quoteDocument/quoteDocument.api.ts new file mode 100644 index 0000000..0171b35 --- /dev/null +++ b/test/generated/dist/quoteDocument/quoteDocument.api.ts @@ -0,0 +1,81 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteDocumentModels } from "./quoteDocument.models"; + +export namespace QuoteDocumentApi { + export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/document`, + config, + ); + }; + export const update = ( + officeId: string, + quoteId: string, + data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/document`, + ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), + config, + ); + }; + export const getPreview = ( + officeId: string, + quoteId: string, + data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/${quoteId}/document/preview`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generate = ( + officeId: string, + quoteId: string, + data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/document/generate`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), + config, + ); + }; + export const generateEml = ( + officeId: string, + quoteId: string, + data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/${quoteId}/document/eml`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/dist/quoteDocument/quoteDocument.models.ts b/test/generated/dist/quoteDocument/quoteDocument.models.ts new file mode 100644 index 0000000..ea237e2 --- /dev/null +++ b/test/generated/dist/quoteDocument/quoteDocument.models.ts @@ -0,0 +1,198 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteDocumentModels { + /** + * QuoteDocumentDataDtoSchema + * @type { object } + * @property { CommonModels.RouteTableBlockResponseDto } routeTable + * @property { CommonModels.CargoTableBlockDto } cargoTable + * @property { CommonModels.FinanceTableBlockDto } financeTable + */ + export const QuoteDocumentDataDtoSchema = z + .object({ + routeTable: CommonModels.RouteTableBlockResponseDtoSchema, + cargoTable: CommonModels.CargoTableBlockDtoSchema, + financeTable: CommonModels.FinanceTableBlockDtoSchema, + }) + .readonly(); + export type QuoteDocumentDataDto = z.infer; + + /** + * QuoteDocumentConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl + * @property { string } headerImageUrl + * @property { string } termsAndConditionsImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ + export const QuoteDocumentConfigDtoSchema = z + .object({ + footerImageUrl: z.string().nullish(), + headerImageUrl: z.string().nullish(), + termsAndConditionsImageUrl: z.string().nullish(), + showWatermarkOnDocuments: z.boolean(), + locale: CommonModels.LocaleEnumSchema.nullish(), + }) + .readonly(); + export type QuoteDocumentConfigDto = z.infer; + + /** + * CustomerDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + */ + export const CustomerDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); + export type CustomerDto = z.infer; + + /** + * ContactDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } phone + * @property { string } date + * @property { string } validFrom + * @property { string } validUntil + */ + export const ContactDtoSchema = z + .object({ + name: z.string(), + email: z.string(), + phone: z.string(), + date: z.iso.datetime({ offset: true }), + validFrom: z.iso.datetime({ offset: true }).nullish(), + validUntil: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type ContactDto = z.infer; + + /** + * QuoteDocumentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } quoteId + * @property { string } quoteNumber + * @property { CommonModels.TransportModeEnum } quoteTransportMode Mode of transport + * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote + * @property { string } transitDurationInDays Transit duration in days + * @property { CustomerDto } customer + * @property { ContactDto } contact + * @property { QuoteDocumentDataDto } data + * @property { boolean } suspendCargoTable + * @property { boolean } suspendFinanceTable + * @property { CommonModels.EditorContentResponseDto } bodyRemarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks + * @property { boolean } isIssued + * @property { number } version + * @property { QuoteDocumentConfigDto } config + * @property { string } issuedAt + */ + export const QuoteDocumentResponseDtoSchema = z + .object({ + id: z.string(), + quoteId: z.string(), + quoteNumber: z.string(), + quoteTransportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), + frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), + transitDurationInDays: z.string().describe("Transit duration in days").nullish(), + customer: CustomerDtoSchema, + contact: ContactDtoSchema, + data: QuoteDocumentDataDtoSchema.nullish(), + suspendCargoTable: z.boolean(), + suspendFinanceTable: z.boolean(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), + isIssued: z.boolean(), + version: z.number(), + config: QuoteDocumentConfigDtoSchema.nullish(), + issuedAt: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type QuoteDocumentResponseDto = z.infer; + + /** + * QuoteDocumentDataUpdateDtoSchema + * @type { object } + * @property { CommonModels.RouteTableUpdateBlockDto } routeTable + * @property { CommonModels.CargoTableBlockUpdateDto } cargoTable + * @property { CommonModels.FinanceTableBlockUpdateDto } financeTable + */ + export const QuoteDocumentDataUpdateDtoSchema = z + .object({ + routeTable: CommonModels.RouteTableUpdateBlockDtoSchema, + cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema, + financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema, + }) + .readonly(); + export type QuoteDocumentDataUpdateDto = z.infer; + + /** + * CustomerUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + */ + export const CustomerUpdateDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); + export type CustomerUpdateDto = z.infer; + + /** + * ContactUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } phone + * @property { string } date + */ + export const ContactUpdateDtoSchema = z + .object({ name: z.string(), email: z.email(), phone: z.string(), date: z.iso.datetime({ offset: true }) }) + .readonly(); + export type ContactUpdateDto = z.infer; + + /** + * UpdateQuoteDocumentRequestDtoSchema + * @type { object } + * @property { CustomerUpdateDto } customer + * @property { ContactUpdateDto } contact + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks + * @property { boolean } suspendCargoTable + * @property { boolean } suspendFinanceTable + * @property { QuoteDocumentDataUpdateDto } data + */ + export const UpdateQuoteDocumentRequestDtoSchema = z + .object({ + customer: CustomerUpdateDtoSchema, + contact: ContactUpdateDtoSchema, + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema, + footerRemarks: CommonModels.EditorContentUpdateDtoSchema, + suspendCargoTable: z.boolean(), + suspendFinanceTable: z.boolean(), + data: QuoteDocumentDataUpdateDtoSchema, + }) + .readonly(); + export type UpdateQuoteDocumentRequestDto = z.infer; + + /** + * GenerateQuoteDocumentPreviewRequestDtoSchema + * @type { object } + * @property { string } issuedAt + */ + export const GenerateQuoteDocumentPreviewRequestDtoSchema = z + .object({ issuedAt: z.iso.datetime({ offset: true }) }) + .readonly(); + export type GenerateQuoteDocumentPreviewRequestDto = z.infer; + + /** + * GenerateQuoteDocumentRequestDtoSchema + * @type { object } + * @property { string } issuedAt + * @property { string } fileName + */ + export const GenerateQuoteDocumentRequestDtoSchema = z + .object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }) + .readonly(); + export type GenerateQuoteDocumentRequestDto = z.infer; +} diff --git a/test/generated/dist/quoteDocument/quoteDocument.queries.ts b/test/generated/dist/quoteDocument/quoteDocument.queries.ts new file mode 100644 index 0000000..394be8c --- /dev/null +++ b/test/generated/dist/quoteDocument/quoteDocument.queries.ts @@ -0,0 +1,186 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteDocumentAcl } from "./quoteDocument.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteDocumentModels } from "./quoteDocument.models"; +import { QuoteDocumentApi } from "./quoteDocument.api"; + +export namespace QuoteDocumentQueries { + export const moduleName = QueryModule.QuoteDocument; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/document", officeId, quoteId] as const, + }; + + /** + * Query `useGet` + * @summary Get quote document + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteDocumentAcl.canUseGet({ officeId })); + return QuoteDocumentApi.get(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update quote document + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.UpdateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof QuoteDocumentApi.update, + { officeId: string; quoteId: string; data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId })); + return QuoteDocumentApi.update(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGetPreview` - recommended when file should not be cached + * @summary Get quote document pdf preview + * @permission Requires `canUseGetPreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useGetPreview = ( + options?: AppMutationOptions< + typeof QuoteDocumentApi.getPreview, + { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId })); + return QuoteDocumentApi.getPreview(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerate` + * @summary Get quote document pdf preview + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerate = ( + options?: AppMutationOptions< + typeof QuoteDocumentApi.generate, + { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId })); + return QuoteDocumentApi.generate(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateEml` - recommended when file should not be cached + * @summary Generate quote document and return EML file + * @permission Requires `canUseGenerateEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGenerateEml = ( + options?: AppMutationOptions< + typeof QuoteDocumentApi.generateEml, + { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId })); + return QuoteDocumentApi.generateEml(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts new file mode 100644 index 0000000..e68b397 --- /dev/null +++ b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts @@ -0,0 +1,29 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteProfitChangeTrackingAcl { + /** + * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. + * @description List quote profit change groups + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.quoteId quoteId from quoteId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query + */ + export const canUseFindProfitChangeGroups = (object?: { officeId: string; quoteId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) + >; + + /** + * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. + * @description Get quote profit change group details + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.quoteId quoteId from quoteId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query + */ + export const canUseFindProfitChangeGroupDetail = (object?: { officeId: string; quoteId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) + >; +} diff --git a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts new file mode 100644 index 0000000..9ab2130 --- /dev/null +++ b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts @@ -0,0 +1,50 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; + +export namespace QuoteProfitChangeTrackingApi { + export const findProfitChangeGroups = ( + officeId: string, + quoteId: string, + limit: number, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findProfitChangeGroupDetail = ( + groupId: string, + officeId: string, + quoteId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, + config, + ); + }; +} diff --git a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts new file mode 100644 index 0000000..269b961 --- /dev/null +++ b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts @@ -0,0 +1,35 @@ +import { dynamicColumns } from "@povio/ui"; +import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; +import { QuoteProfitChangeTrackingQueries } from "./quoteProfitChangeTracking.queries"; +import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; + +export namespace QuoteProfitChangeTrackingConfigs { + export const profitChangeGroupsConfig = { + meta: { + title: "Profit Change Groups", + }, + readAll: { + acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups, + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, + paginated: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroups, + infinite: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, + columns: dynamicColumns({ + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, + options: { + columns: { + id: true, + timestamp: true, + users: true, + profit: true, + changeCount: true, + }, + }, + }), + }, + read: { + acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema, + query: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, + }, + }; +} diff --git a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts new file mode 100644 index 0000000..4b453b4 --- /dev/null +++ b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts @@ -0,0 +1,84 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteProfitChangeTrackingModels { + /** + * QuoteAccountProfitChangeGroupDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto[] } users + * @property { object } profit + * @property { number } profit.amount + * @property { string } profit.currencyCode + * @property { number } changeCount + */ + export const QuoteAccountProfitChangeGroupDtoSchema = z + .object({ + id: z.string(), + timestamp: z.iso.datetime({ offset: true }), + users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), + profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), + changeCount: z.number(), + }) + .readonly(); + export type QuoteAccountProfitChangeGroupDto = z.infer; + + /** + * QuoteAccountProfitChangeEntryDtoSchema + * @type { object } + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto } user + * @property { number } changeNumber + * @property { number } oldProfit + * @property { number } newProfit + * @property { string } currencyCode + */ + export const QuoteAccountProfitChangeEntryDtoSchema = z + .object({ + timestamp: z.iso.datetime({ offset: true }), + user: CommonModels.UserPreviewDtoSchema, + changeNumber: z.number(), + oldProfit: z.number(), + newProfit: z.number(), + currencyCode: z.string(), + }) + .readonly(); + export type QuoteAccountProfitChangeEntryDto = z.infer; + + /** + * QuoteAccountProfitChangeGroupDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { string } currencyCode + * @property { QuoteAccountProfitChangeEntryDto[] } entries + */ + export const QuoteAccountProfitChangeGroupDetailDtoSchema = z + .object({ + id: z.string(), + timestamp: z.iso.datetime({ offset: true }), + currencyCode: z.string(), + entries: z.array(QuoteAccountProfitChangeEntryDtoSchema).readonly(), + }) + .readonly(); + export type QuoteAccountProfitChangeGroupDetailDto = z.infer; + + /** + * QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { QuoteAccountProfitChangeGroupDto[] } items + */ + export const QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(QuoteAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape, + }); + export type QuoteProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer< + typeof QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema + >; +} diff --git a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts new file mode 100644 index 0000000..d39ed96 --- /dev/null +++ b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts @@ -0,0 +1,142 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { QuoteProfitChangeTrackingApi } from "./quoteProfitChangeTracking.api"; + +export namespace QuoteProfitChangeTrackingQueries { + export const moduleName = QueryModule.QuoteProfitChangeTracking; + + export const keys = { + all: [moduleName] as const, + findProfitChangeGroups: (officeId: string, quoteId: string, limit?: number, page?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", + officeId, + quoteId, + limit, + page, + cursor, + ] as const, + findProfitChangeGroupsInfinite: (officeId: string, quoteId: string, limit?: number, cursor?: string) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", + "infinite", + officeId, + quoteId, + limit, + cursor, + ] as const, + findProfitChangeGroupDetail: (groupId: string, officeId: string, quoteId: string) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/account/profit-change-groups/:groupId", + groupId, + officeId, + quoteId, + ] as const, + }; + + /** + * Query `useFindProfitChangeGroups` + * @summary List quote profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroups = ( + { + officeId, + quoteId, + limit, + page, + cursor, + }: { officeId: string; quoteId: string; limit: number; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), + queryFn: () => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId })); + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useFindProfitChangeGroupsInfinite + * @summary List quote profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroupsInfinite = ( + { officeId, quoteId, limit, cursor }: { officeId: string; quoteId: string; limit: number; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId })); + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindProfitChangeGroupDetail` + * @summary Get quote profit change group details + * @permission Requires `canUseFindProfitChangeGroupDetail` ability + * @param { string } object.groupId Path parameter + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindProfitChangeGroupDetail = ( + { groupId, officeId, quoteId }: { groupId: string; officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), + queryFn: () => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId })); + return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/quoteRoutes/quoteRoutes.acl.ts b/test/generated/dist/quoteRoutes/quoteRoutes.acl.ts new file mode 100644 index 0000000..ee5334d --- /dev/null +++ b/test/generated/dist/quoteRoutes/quoteRoutes.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteRoutesAcl { + /** + * Use for `useListRoutes` query ability. For global ability, omit the object parameter. + * @description List quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query + */ + export const canUseListRoutes = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Create quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation + */ + export const canUseCreateRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Update quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation + */ + export const canUseUpdateRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Delete quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation + */ + export const canUseDeleteRoutePoint = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. + * @description Split quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation + */ + export const canUseSplitRoutes = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. + * @description Merge quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation + */ + export const canUseMergeRoutes = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. + * @description Copy quote route points + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation + */ + export const canUseCopyRoute = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/quoteRoutes/quoteRoutes.api.ts b/test/generated/dist/quoteRoutes/quoteRoutes.api.ts new file mode 100644 index 0000000..993cf4c --- /dev/null +++ b/test/generated/dist/quoteRoutes/quoteRoutes.api.ts @@ -0,0 +1,93 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteRoutesApi { + export const listRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.RouteListResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes`, + config, + ); + }; + export const createRoutePoint = ( + officeId: string, + quoteId: string, + routeId: string, + data: CommonModels.CreateRoutePointRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, + ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), + config, + ); + }; + export const updateRoutePoint = ( + officeId: string, + quoteId: string, + routeId: string, + pointId: string, + data: CommonModels.UpdateRoutePointRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, + ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), + config, + ); + }; + export const deleteRoutePoint = ( + officeId: string, + quoteId: string, + routeId: string, + pointId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, + undefined, + config, + ); + }; + export const splitRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/split`, + undefined, + config, + ); + }; + export const mergeRoutes = ( + officeId: string, + quoteId: string, + data: CommonModels.MergeRoutesRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/merge`, + ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), + config, + ); + }; + export const copyRoute = ( + officeId: string, + quoteId: string, + routeId: string, + data: CommonModels.CopyRouteRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, + ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/quoteRoutes/quoteRoutes.queries.ts b/test/generated/dist/quoteRoutes/quoteRoutes.queries.ts new file mode 100644 index 0000000..5269238 --- /dev/null +++ b/test/generated/dist/quoteRoutes/quoteRoutes.queries.ts @@ -0,0 +1,263 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteRoutesAcl } from "./quoteRoutes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteRoutesApi } from "./quoteRoutes.api"; + +export namespace QuoteRoutesQueries { + export const moduleName = QueryModule.QuoteRoutes; + + export const keys = { + all: [moduleName] as const, + listRoutes: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/routes", officeId, quoteId] as const, + }; + + /** + * Query `useListRoutes` + * @summary List routes with points for a quote + * @permission Requires `canUseListRoutes` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListRoutes = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoutes(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId })); + return QuoteRoutesApi.listRoutes(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateRoutePoint` + * @summary Create a route point for a quote route + * @permission Requires `canUseCreateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateRoutePoint = ( + options?: AppMutationOptions< + typeof QuoteRoutesApi.createRoutePoint, + { officeId: string; quoteId: string; routeId: string; data: CommonModels.CreateRoutePointRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, data }) => { + checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId })); + return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateRoutePoint` + * @summary Update a route point for a quote route + * @permission Requires `canUseUpdateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateRoutePoint = ( + options?: AppMutationOptions< + typeof QuoteRoutesApi.updateRoutePoint, + { + officeId: string; + quoteId: string; + routeId: string; + pointId: string; + data: CommonModels.UpdateRoutePointRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { + checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId })); + return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteRoutePoint` + * @summary Delete a route point from a quote route + * @permission Requires `canUseDeleteRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useDeleteRoutePoint = ( + options?: AppMutationOptions< + typeof QuoteRoutesApi.deleteRoutePoint, + { officeId: string; quoteId: string; routeId: string; pointId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, pointId }) => { + checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId })); + return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useSplitRoutes` + * @summary Split quote routes by cargo (sea only) + * @permission Requires `canUseSplitRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useSplitRoutes = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId }) => { + checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId })); + return QuoteRoutesApi.splitRoutes(officeId, quoteId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useMergeRoutes` + * @summary Merge quote cargo routes into single route (sea only) + * @permission Requires `canUseMergeRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useMergeRoutes = ( + options?: AppMutationOptions< + typeof QuoteRoutesApi.mergeRoutes, + { officeId: string; quoteId: string; data: CommonModels.MergeRoutesRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId })); + return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCopyRoute` + * @summary Copy route points from one route to another (sea only) + * @permission Requires `canUseCopyRoute` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ + export const useCopyRoute = ( + options?: AppMutationOptions< + typeof QuoteRoutesApi.copyRoute, + { officeId: string; quoteId: string; routeId: string; data: CommonModels.CopyRouteRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, data }) => { + checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId })); + return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/quotes/quotes.acl.ts b/test/generated/dist/quotes/quotes.acl.ts new file mode 100644 index 0000000..c9ec7f0 --- /dev/null +++ b/test/generated/dist/quotes/quotes.acl.ts @@ -0,0 +1,147 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuotesAcl { + /** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Create", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ + export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useExportQuotes` mutation ability. For global ability, omit the object parameter. + * @description Export quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportQuotes` mutation + */ + export const canUseExportQuotes = (object?: { officeId: string }) => + ["Export", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Export", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Get quote by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ + export const canUseGetById = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ + export const canUseCancel = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Duplicate quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ + export const canUseDuplicate = (object?: { officeId: string }) => + ["Create", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Create", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useGetInvolvedParties` query ability. For global ability, omit the object parameter. + * @description Get involved parties for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvolvedParties` query + */ + export const canUseGetInvolvedParties = (object?: { officeId: string }) => + ["ReadInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "ReadInvolvedParties", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useCreateInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Create involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateInvolvedParty` mutation + */ + export const canUseCreateInvolvedParty = (object?: { officeId: string }) => + ["CreateInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "CreateInvolvedParties", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdateInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Update involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateInvolvedParty` mutation + */ + export const canUseUpdateInvolvedParty = (object?: { officeId: string }) => + ["UpdateInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "UpdateInvolvedParties", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useDeleteInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Delete involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvolvedParty` mutation + */ + export const canUseDeleteInvolvedParty = (object?: { officeId: string }) => + ["DeleteInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "DeleteInvolvedParties", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/quotes/quotes.api.ts b/test/generated/dist/quotes/quotes.api.ts new file mode 100644 index 0000000..763edb2 --- /dev/null +++ b/test/generated/dist/quotes/quotes.api.ts @@ -0,0 +1,182 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuotesModels } from "./quotes.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuotesApi { + export const paginate = ( + officeId: string, + limit: number, + order?: string, + filter?: QuotesModels.QuoteFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: QuotesModels.QuotesPaginateResponseSchema }, `/offices/${officeId}/quotes`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes`, + ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), + config, + ); + }; + export const listAvailablePartnersFor = ( + officeId: string, + quoteId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { + type: "query", + name: "useCase", + }), + }, + }, + ); + }; + export const exportQuotes = ( + officeId: string, + data: QuotesModels.QuoteExportRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/exports`, + ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const getById = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}`, + config, + ); + }; + export const update = ( + officeId: string, + quoteId: string, + data: QuotesModels.UpdateQuoteRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}`, + ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), + config, + ); + }; + export const cancel = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cancel`, + undefined, + config, + ); + }; + export const duplicate = ( + officeId: string, + quoteId: string, + data: QuotesModels.DuplicateQuoteRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/duplicate`, + ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), + config, + ); + }; + export const getInvolvedParties = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties`, + config, + ); + }; + export const createInvolvedParty = ( + officeId: string, + quoteId: string, + data: CommonModels.CreateInvolvedPartyRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties`, + ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), + config, + ); + }; + export const updateInvolvedParty = ( + officeId: string, + quoteId: string, + partyId: string, + data: CommonModels.UpdateInvolvedPartyDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, + ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), + config, + ); + }; + export const deleteInvolvedParty = ( + officeId: string, + quoteId: string, + partyId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/quotes/quotes.configs.ts b/test/generated/dist/quotes/quotes.configs.ts new file mode 100644 index 0000000..fa74aae --- /dev/null +++ b/test/generated/dist/quotes/quotes.configs.ts @@ -0,0 +1,136 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { QuotesModels } from "./quotes.models"; +import { QuotesQueries } from "./quotes.queries"; +import { QuotesAcl } from "./quotes.acl"; + +export namespace QuotesConfigs { + export const quotesConfig = { + meta: { + title: "Quotes", + }, + readAll: { + acl: QuotesAcl.canUsePaginate, + schema: QuotesModels.QuotePreviewResponseDTOSchema, + paginated: QuotesQueries.usePaginate, + infinite: QuotesQueries.usePaginateInfinite, + filters: { + schema: QuotesModels.QuoteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: QuotesModels.QuoteFilterDtoSchema, + options: { + inputs: { + statusDate: true, + transportMode: true, + status: true, + direction: true, + loadType: true, + serviceType: true, + carrierId: true, + consigneeId: true, + employee: true, + routing: true, + number: true, + createdAt: true, + vesselCarrier: true, + searchQuery: true, + customer: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: QuotesModels.QuotePreviewResponseDTOSchema, + options: { + columns: { + id: true, + transportMode: true, + statusDate: true, + createdAt: true, + number: true, + status: true, + direction: true, + loadType: true, + customer: true, + customerReference: true, + consignee: true, + consigneeReference: true, + carrier: true, + carrierReference: true, + employee: true, + origin: true, + destination: true, + portOfLoading: true, + dischargePort: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + equipment: true, + serviceType: true, + currency: true, + profit: true, + margin: true, + numberOfConvertedPositions: true, + departureDate: true, + arrivalDate: true, + routing: true, + }, + sortable: QuotesModels.QuotesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: QuotesAcl.canUseGetById, + schema: QuotesModels.QuoteCoreResponseDTOSchema, + query: QuotesQueries.useGetById, + }, + create: { + acl: QuotesAcl.canUseCreate, + schema: QuotesModels.CreateQuoteRequestDTOSchema, + mutation: QuotesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: QuotesModels.CreateQuoteRequestDTOSchema, + options: { + inputs: { + section: true, + direction: true, + transportMode: true, + loadType: true, + serviceType: true, + customerBusinessPartnerId: true, + }, + }, + }), + }, + update: { + acl: QuotesAcl.canUseUpdate, + schema: QuotesModels.UpdateQuoteRequestDTOSchema, + mutation: QuotesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: QuotesModels.UpdateQuoteRequestDTOSchema, + options: { + inputs: { + number: true, + statusDate: true, + cargoType: true, + loadType: true, + incoterms: true, + secondIncoterms: true, + serviceType: true, + buyRateReference: true, + frequency: true, + transitDurationInDays: true, + quoteType: true, + defaultCurrencyId: true, + salesRepId: true, + responsibleEmployeeId: true, + receivedByEmployeeId: true, + team: true, + volumetricWeightModifier: true, + }, + }, + }), + }, + }; +} diff --git a/test/generated/dist/quotes/quotes.models.ts b/test/generated/dist/quotes/quotes.models.ts new file mode 100644 index 0000000..b02bfc0 --- /dev/null +++ b/test/generated/dist/quotes/quotes.models.ts @@ -0,0 +1,322 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuotesModels { +/** + * QuoteStatusEnumSchema + * @type { enum } + */ +export const QuoteStatusEnumSchema = z.enum(["Pending", "Cancelled", "Converted"]); +export type QuoteStatusEnum = z.infer; +export const QuoteStatusEnum = QuoteStatusEnumSchema.enum; + +/** + * QuoteCustomerResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { string } phone The phone number of the customer + * @property { string } email The email of the customer + */ +export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().describe("The phone number of the customer").nullish(), email: z.string().describe("The email of the customer").nullish() }).readonly(); +export type QuoteCustomerResponseDto = z.infer; + +/** + * QuoteNamedReferenceResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the entity + * @property { string } name Name of the entity + * @property { string } matchCode + * @property { string } label Display label (name or match code depending on office settings) + */ +export const QuoteNamedReferenceResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the entity").nullable(), name: z.string().describe("Name of the entity").nullable(), matchCode: z.string().nullable(), label: z.string().describe("Display label (name or match code depending on office settings)").nullable() }).readonly(); +export type QuoteNamedReferenceResponseDto = z.infer; + +/** + * QuotePreviewResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the quote + * @property { CommonModels.TransportModeEnum } transportMode Transport mode + * @property { string } statusDate The date of the quote status + * @property { string } createdAt The date when the quote was created + * @property { string } number The quote number + * @property { QuoteStatusEnum } status Status of the quote + * @property { CommonModels.DirectionEnum } direction Direction of the quote + * @property { CommonModels.LoadTypeEnum } loadType Load type + * @property { QuoteCustomerResponseDto } customer The customer information + * @property { string } customerReference Customer reference number + * @property { QuoteNamedReferenceResponseDto } consignee Consignee information + * @property { string } consigneeReference Consignee reference number + * @property { QuoteNamedReferenceResponseDto } carrier The carrier + * @property { string } carrierReference Carrier reference number + * @property { QuoteNamedReferenceResponseDto } employee Responsible employee + * @property { QuoteNamedReferenceResponseDto } origin Origin location + * @property { QuoteNamedReferenceResponseDto } destination Destination location + * @property { QuoteNamedReferenceResponseDto } portOfLoading Port of loading + * @property { QuoteNamedReferenceResponseDto } dischargePort Discharge port + * @property { string } bookingNumber Booking reference number + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } vesselCarrier Carrier name from route point (sea positions only) + * @property { string } equipment Equipment summary (e.g., "2x20DC, 1x40HC") + * @property { CommonModels.ServiceTypeEnum } serviceType Service type + * @property { string } currency Currency code + * @property { number } profit Total profit + * @property { number } margin Profit margin percentage + * @property { number } numberOfConvertedPositions Number of positions converted from this quote + * @property { string } departureDate Departure date + * @property { string } arrivalDate Arrival date + * @property { CommonModels.SeaRoutingEnum } routing Sea routing type + */ +export const QuotePreviewResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status").nullable(), createdAt: z.iso.datetime({ offset: true }).describe("The date when the quote was created"), number: z.string().describe("The quote number"), status: QuoteStatusEnumSchema.describe("Status of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type").nullish(), customer: QuoteCustomerResponseDtoSchema.describe("The customer information"), customerReference: z.string().describe("Customer reference number").nullish(), consignee: QuoteNamedReferenceResponseDtoSchema.describe("Consignee information").nullish(), consigneeReference: z.string().describe("Consignee reference number").nullish(), carrier: QuoteNamedReferenceResponseDtoSchema.describe("The carrier").nullish(), carrierReference: z.string().describe("Carrier reference number").nullish(), employee: QuoteNamedReferenceResponseDtoSchema.describe("Responsible employee").nullish(), origin: QuoteNamedReferenceResponseDtoSchema.describe("Origin location"), destination: QuoteNamedReferenceResponseDtoSchema.describe("Destination location"), portOfLoading: QuoteNamedReferenceResponseDtoSchema.describe("Port of loading").nullish(), dischargePort: QuoteNamedReferenceResponseDtoSchema.describe("Discharge port").nullish(), bookingNumber: z.string().describe("Booking reference number").nullish(), vessel: z.string().describe("Vessel name").nullish(), voyage: z.string().describe("Voyage number").nullish(), vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), equipment: z.string().describe("Equipment summary (e.g., "2x20DC, 1x40HC")").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.describe("Service type").nullish(), currency: z.string().describe("Currency code").nullish(), profit: z.number().describe("Total profit").nullish(), margin: z.number().describe("Profit margin percentage").nullish(), numberOfConvertedPositions: z.number().describe("Number of positions converted from this quote"), departureDate: z.iso.datetime({ offset: true }).describe("Departure date").nullish(), arrivalDate: z.iso.datetime({ offset: true }).describe("Arrival date").nullish(), routing: CommonModels.SeaRoutingEnumSchema.describe("Sea routing type").nullish() }).readonly(); +export type QuotePreviewResponseDTO = z.infer; + +/** + * QuoteFilterDtoSchema + * @type { object } + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.TransportModeEnum } transportMode + * @property { QuoteStatusEnum[] } status + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } carrierId Filter quotes by carrier IDs + * @property { string[] } consigneeId Filter quotes by consignee IDs + * @property { string[] } employee Filter quotes by employee IDs + * @property { CommonModels.SeaRoutingEnum } routing + * @property { string } number Filter quotes by quote number + * @property { CommonModels.DateRangeDto } createdAt + * @property { string } vesselCarrier Filter quotes by carrier name from route point + * @property { string } searchQuery + * @property { string[] } customer + */ +export const QuoteFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, carrierId: z.array(z.string()).readonly().describe("Filter quotes by carrier IDs"), consigneeId: z.array(z.string()).readonly().describe("Filter quotes by consignee IDs"), employee: z.array(z.string()).readonly().describe("Filter quotes by employee IDs"), routing: CommonModels.SeaRoutingEnumSchema, number: z.string().describe("Filter quotes by quote number"), createdAt: CommonModels.DateRangeDtoSchema, vesselCarrier: z.string().describe("Filter quotes by carrier name from route point"), searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); +export type QuoteFilterDto = z.infer; + +/** + * QuoteExportFilterDtoSchema + * @type { object } + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.TransportModeEnum } transportMode + * @property { QuoteStatusEnum[] } status + * @property { CommonModels.DirectionEnum } direction + * @property { string } searchQuery + * @property { string[] } customer + */ +export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); +export type QuoteExportFilterDto = z.infer; + +/** + * QuoteExportColumnSchema + * @type { enum } + */ +export const QuoteExportColumnSchema = z.enum(["id", "transportMode", "statusDate", "createdAt", "number", "status", "direction", "loadType", "serviceType", "customerId", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeId", "consigneeName", "consigneeReference", "carrierId", "carrierName", "carrierReference", "responsibleEmployeeName", "originLocationId", "originLocationName", "destinationLocationId", "destinationLocationName", "portOfLoadingId", "portOfLoadingName", "dischargePortId", "dischargePortName", "bookingNumber", "vessel", "voyage", "equipment", "departureDate", "arrivalDate", "routing", "currency", "profit", "margin"]); +export type QuoteExportColumn = z.infer; +export const QuoteExportColumn = QuoteExportColumnSchema.enum; + +/** + * QuoteExportRequestDtoSchema + * @type { object } + * @property { QuoteExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { QuoteExportFilterDto } filter + */ +export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: QuoteExportFilterDtoSchema }).readonly(); +export type QuoteExportRequestDto = z.infer; + +/** + * CreateQuoteRequestDTOSchema + * @type { object } + * @property { CommonModels.SectionEnum } section The section of the quote + * @property { CommonModels.DirectionEnum } direction The direction of the quote + * @property { CommonModels.TransportModeEnum } transportMode The mode of transport for the quote + * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote + * @property { CommonModels.ServiceTypeEnum } serviceType The service type for the quote + * @property { string } customerBusinessPartnerId The ID of the business partner that is the customer + */ +export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema.describe("The section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("The direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("The mode of transport for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The service type for the quote"), customerBusinessPartnerId: z.string().describe("The ID of the business partner that is the customer") }).readonly(); +export type CreateQuoteRequestDTO = z.infer; + +/** + * QuoteCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type QuoteCustomerDto = z.infer; + +/** + * QuoteEmployeeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the employee + * @property { string } name Name of the employee + */ +export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the employee"), name: z.string().describe("Name of the employee") }).readonly(); +export type QuoteEmployeeResponseDTO = z.infer; + +/** + * CargoTypeEnumSchema + * @type { enum } + */ +export const CargoTypeEnumSchema = z.enum(["Trailer", "Container", "BreakBulk", "Roro", "Project"]); +export type CargoTypeEnum = z.infer; +export const CargoTypeEnum = CargoTypeEnumSchema.enum; + +/** + * QuoteTypeEnumSchema + * @type { enum } + */ +export const QuoteTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); +export type QuoteTypeEnum = z.infer; +export const QuoteTypeEnum = QuoteTypeEnumSchema.enum; + +/** + * QuoteConvertedPositionDtoSchema + * @type { object } + * @property { string } positionId + * @property { string } positionNumber + */ +export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }).readonly(); +export type QuoteConvertedPositionDto = z.infer; + +/** + * QuoteCoreResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the quote + * @property { string } rootFolderId Root folder identifier bound to this quote + * @property { QuoteCustomerDto } customer + * @property { QuoteStatusEnum } status Current status of the quote + * @property { string } responsibleEmployeeId Unique identifier of the responsible employee + * @property { string } receivedByEmployeeId Unique identifier of the employee receiving the quote + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } salesRepId Unique identifier of the sales rep + * @property { QuoteEmployeeResponseDTO } responsibleEmployee The responsible employee + * @property { QuoteEmployeeResponseDTO } receivedByEmployee The employee who received the quote + * @property { string } owningOfficeId ID of the office owning the quote + * @property { string } name Name of the quote + * @property { string } number Quote number + * @property { CommonModels.SectionEnum } section Section of the quote + * @property { CommonModels.DirectionEnum } direction Direction of the quote + * @property { CommonModels.TransportModeEnum } transportMode Mode of transport + * @property { string } statusDate Date of the quote status + * @property { CargoTypeEnum } cargoType Type of cargo + * @property { CommonModels.IncotermsEnum } incoterms Incoterms for the quote + * @property { CommonModels.IncotermsEnum } secondIncoterms Second incoterms for the quote + * @property { string } buyRateReference Reference for buy rate + * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote + * @property { string } transitDurationInDays Transit duration in days + * @property { QuoteTypeEnum } quoteType Type of quote + * @property { string } defaultCurrencyId Default currency + * @property { QuoteEmployeeResponseDTO } salesRep The sales rep for the quote + * @property { string } team Team + * @property { string } createdAt + * @property { string } updatedAt + * @property { QuoteConvertedPositionDto[] } convertedPositions Positions converted from this quote. Default: `` + * @property { CommonModels.LoadTypeEnum } loadType Load type of quote + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const QuoteCoreResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), rootFolderId: z.string().describe("Root folder identifier bound to this quote").nullish(), customer: QuoteCustomerDtoSchema.nullish(), status: QuoteStatusEnumSchema.describe("Current status of the quote"), responsibleEmployeeId: z.string().describe("Unique identifier of the responsible employee").nullish(), receivedByEmployeeId: z.string().describe("Unique identifier of the employee receiving the quote").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesRepId: z.string().describe("Unique identifier of the sales rep").nullish(), responsibleEmployee: QuoteEmployeeResponseDTOSchema.describe("The responsible employee").nullish(), receivedByEmployee: QuoteEmployeeResponseDTOSchema.describe("The employee who received the quote").nullish(), owningOfficeId: z.string().describe("ID of the office owning the quote"), name: z.string().describe("Name of the quote"), number: z.string().describe("Quote number"), section: CommonModels.SectionEnumSchema.describe("Section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), statusDate: z.iso.datetime({ offset: true }).describe("Date of the quote status"), cargoType: CargoTypeEnumSchema.describe("Type of cargo").nullish(), incoterms: CommonModels.IncotermsEnumSchema.describe("Incoterms for the quote").nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("Second incoterms for the quote").nullish(), buyRateReference: z.string().describe("Reference for buy rate").nullish(), frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), transitDurationInDays: z.string().describe("Transit duration in days").nullish(), quoteType: QuoteTypeEnumSchema.describe("Type of quote").nullish(), defaultCurrencyId: z.string().describe("Default currency").nullish(), salesRep: QuoteEmployeeResponseDTOSchema.describe("The sales rep for the quote").nullish(), team: z.string().describe("Team").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), convertedPositions: z.array(QuoteConvertedPositionDtoSchema).readonly().describe("Positions converted from this quote").default([]), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type of quote").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); +export type QuoteCoreResponseDTO = z.infer; + +/** + * UpdateQuoteRequestDTOSchema + * @type { object } + * @property { string } number The quote number + * @property { string } statusDate The date of the quote status + * @property { CargoTypeEnum } cargoType The type of cargo for the quote + * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote + * @property { CommonModels.IncotermsEnum } incoterms The incoterms for the quote + * @property { CommonModels.IncotermsEnum } secondIncoterms The second incoterms for the quote + * @property { CommonModels.ServiceTypeEnum } serviceType The type of service for the quote + * @property { string } buyRateReference The reference for the buy rate + * @property { CommonModels.FrequencyEnum } frequency The frequency of the quote + * @property { string } transitDurationInDays The transit duration in days + * @property { QuoteTypeEnum } quoteType The type of quote + * @property { string } defaultCurrencyId The default currency for the quote + * @property { string } salesRepId The sales representative for the quote + * @property { string } responsibleEmployeeId The responsible employee for the quote + * @property { string } receivedByEmployeeId The employee who receieved the quote + * @property { string } team The team responsible for the quote + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().describe("The quote number"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status"), cargoType: CargoTypeEnumSchema.describe("The type of cargo for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), incoterms: CommonModels.IncotermsEnumSchema.describe("The incoterms for the quote"), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("The second incoterms for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The type of service for the quote"), buyRateReference: z.string().describe("The reference for the buy rate"), frequency: CommonModels.FrequencyEnumSchema.describe("The frequency of the quote"), transitDurationInDays: z.string().describe("The transit duration in days").nullable(), quoteType: QuoteTypeEnumSchema.describe("The type of quote"), defaultCurrencyId: z.string().describe("The default currency for the quote"), salesRepId: z.string().describe("The sales representative for the quote"), responsibleEmployeeId: z.string().describe("The responsible employee for the quote"), receivedByEmployeeId: z.string().describe("The employee who receieved the quote"), team: z.string().describe("The team responsible for the quote"), volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); +export type UpdateQuoteRequestDTO = z.infer; + +/** + * QuoteSectionEnumSchema + * @type { enum } + */ +export const QuoteSectionEnumSchema = z.enum(["Customer", "Overview", "Cargo", "Finances", "Documents"]); +export type QuoteSectionEnum = z.infer; +export const QuoteSectionEnum = QuoteSectionEnumSchema.enum; + +/** + * DuplicateQuoteRequestDtoSchema + * @type { object } + * @property { QuoteSectionEnum[] } sections The sections to duplicate. Min Items: `1` + */ +export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).readonly().min(1).describe("The sections to duplicate") }).readonly(); +export type DuplicateQuoteRequestDto = z.infer; + +/** + * QuoteListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalProfit + * @property { number } profitPerQuote + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const QuoteListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalProfit: z.number(), profitPerQuote: z.number(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type QuoteListResponseDto = z.infer; + +/** + * QuotesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const QuotesPaginateOrderParamEnumSchema = z.enum(["number", "statusDate", "transportMode", "status", "direction", "loadType", "serviceType", "createdAt", "employee", "profit"]); +export type QuotesPaginateOrderParamEnum = z.infer; +export const QuotesPaginateOrderParamEnum = QuotesPaginateOrderParamEnumSchema.enum; + +/** + * QuotesPaginateResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerQuote + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { QuotePreviewResponseDTO[] } items + */ +export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).readonly() }).readonly().shape }); +export type QuotesPaginateResponse = z.infer; + +/** + * QuotesListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ +export const QuotesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type QuotesListAvailablePartnersForResponse = z.infer; + +/** + * GetInvolvedPartiesResponseSchema + * @type { array } + */ +export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); +export type GetInvolvedPartiesResponse = z.infer; + +} diff --git a/test/generated/dist/quotes/quotes.queries.ts b/test/generated/dist/quotes/quotes.queries.ts new file mode 100644 index 0000000..42c7089 --- /dev/null +++ b/test/generated/dist/quotes/quotes.queries.ts @@ -0,0 +1,507 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuotesAcl } from "./quotes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuotesModels } from "./quotes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { QuotesApi } from "./quotes.api"; + +export namespace QuotesQueries { + export const moduleName = QueryModule.Quotes; + + export const keys = { + all: [moduleName] as const, + paginate: ( + officeId: string, + limit?: number, + order?: string, + filter?: QuotesModels.QuoteFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/quotes", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: QuotesModels.QuoteFilterDto, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/quotes", "infinite", officeId, limit, order, filter, cursor] as const, + listAvailablePartnersFor: ( + officeId: string, + quoteId: string, + search?: string, + useCase?: CommonModels.PositionAvailablePartnersUseCase, + ) => + [ + ...keys.all, + "/offices/:officeId/quotes/:quoteId/available-partners", + officeId, + quoteId, + search, + useCase, + ] as const, + getById: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId", officeId, quoteId] as const, + getInvolvedParties: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/involved-parties", officeId, quoteId] as const, + }; + + /** + * Query `usePaginate` + * @summary Paginate Quotes + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` + * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: QuotesModels.QuoteFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(QuotesAcl.canUsePaginate({ officeId })); + return QuotesApi.paginate(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Quotes + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` + * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { officeId: string; limit: number; order?: string; filter?: QuotesModels.QuoteFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuotesAcl.canUsePaginate({ officeId })); + return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create Quote + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { QuotesModels.CreateQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof QuotesApi.create, + { officeId: string; data: QuotesModels.CreateQuoteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(QuotesAcl.canUseCreate({ officeId })); + return QuotesApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for a quote + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useListAvailablePartnersFor = ( + { + officeId, + quoteId, + search, + useCase, + }: { officeId: string; quoteId: string; search?: string; useCase?: CommonModels.PositionAvailablePartnersUseCase }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), + queryFn: () => { + checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId })); + return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase, config); + }, + ...options, + }); + }; + + /** + * Mutation `useExportQuotes` - recommended when file should not be cached + * @summary Export quotes to Excel + * @permission Requires `canUseExportQuotes` ability + * @param { string } mutation.officeId Path parameter + * @param { QuotesModels.QuoteExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const useExportQuotes = ( + options?: AppMutationOptions< + typeof QuotesApi.exportQuotes, + { officeId: string; data: QuotesModels.QuoteExportRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(QuotesAcl.canUseExportQuotes({ officeId })); + return QuotesApi.exportQuotes(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetById` + * @summary Get quote by id + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetById = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, quoteId), + queryFn: () => { + checkAcl(QuotesAcl.canUseGetById({ officeId })); + return QuotesApi.getById(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuotesModels.UpdateQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof QuotesApi.update, + { officeId: string; quoteId: string; data: QuotesModels.UpdateQuoteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseUpdate({ officeId })); + return QuotesApi.update(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useCancel` + * @summary Cancel quote + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useCancel = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId }) => { + checkAcl(QuotesAcl.canUseCancel({ officeId })); + return QuotesApi.cancel(officeId, quoteId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDuplicate` + * @summary Duplicate quote + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuotesModels.DuplicateQuoteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useDuplicate = ( + options?: AppMutationOptions< + typeof QuotesApi.duplicate, + { officeId: string; quoteId: string; data: QuotesModels.DuplicateQuoteRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseDuplicate({ officeId })); + return QuotesApi.duplicate(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetInvolvedParties` + * @summary Get involved parties for quote + * @permission Requires `canUseGetInvolvedParties` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetInvolvedParties = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvolvedParties(officeId, quoteId), + queryFn: () => { + checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId })); + return QuotesApi.getInvolvedParties(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useCreateInvolvedParty` + * @summary Create involved party for quote + * @permission Requires `canUseCreateInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreateInvolvedParty = ( + options?: AppMutationOptions< + typeof QuotesApi.createInvolvedParty, + { officeId: string; quoteId: string; data: CommonModels.CreateInvolvedPartyRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId })); + return QuotesApi.createInvolvedParty(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUpdateInvolvedParty` + * @summary Update involved party for quote + * @permission Requires `canUseUpdateInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateInvolvedParty = ( + options?: AppMutationOptions< + typeof QuotesApi.updateInvolvedParty, + { officeId: string; quoteId: string; partyId: string; data: CommonModels.UpdateInvolvedPartyDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, partyId, data }) => { + checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId })); + return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteInvolvedParty` + * @summary Delete involved party for quote + * @permission Requires `canUseDeleteInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useDeleteInvolvedParty = ( + options?: AppMutationOptions< + typeof QuotesApi.deleteInvolvedParty, + { officeId: string; quoteId: string; partyId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, partyId }) => { + checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId })); + return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/remarkTemplates/remarkTemplates.acl.ts b/test/generated/dist/remarkTemplates/remarkTemplates.acl.ts new file mode 100644 index 0000000..d7492ee --- /dev/null +++ b/test/generated/dist/remarkTemplates/remarkTemplates.acl.ts @@ -0,0 +1,87 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace RemarkTemplatesAcl { + /** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List remark template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = (object?: { officeId: string }) => + ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Read", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List remark templates + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Read", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Create", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get remark template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Read", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update remark template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Update", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = (object?: { officeId: string }) => + ["Archive", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Archive", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; + + /** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = (object?: { officeId: string }) => + ["Unarchive", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< + "Unarchive", + "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/remarkTemplates/remarkTemplates.api.ts b/test/generated/dist/remarkTemplates/remarkTemplates.api.ts new file mode 100644 index 0000000..a8f13b0 --- /dev/null +++ b/test/generated/dist/remarkTemplates/remarkTemplates.api.ts @@ -0,0 +1,136 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; + +export namespace RemarkTemplatesApi { + export const paginateLabels = ( + officeId: string, + limit: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/remark-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const list = ( + officeId: string, + limit: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, + `/offices/${officeId}/remark-templates`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const create = ( + officeId: string, + data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates`, + ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), + config, + ); + }; + export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}`, + config, + ); + }; + export const update = ( + id: string, + officeId: string, + data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}`, + ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/remarkTemplates/remarkTemplates.configs.ts b/test/generated/dist/remarkTemplates/remarkTemplates.configs.ts new file mode 100644 index 0000000..d004179 --- /dev/null +++ b/test/generated/dist/remarkTemplates/remarkTemplates.configs.ts @@ -0,0 +1,122 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; +import { RemarkTemplatesQueries } from "./remarkTemplates.queries"; +import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; + +export namespace RemarkTemplatesConfigs { + export const remarkTemplatesConfig = { + meta: { + title: "Remark Templates", + }, + readAll: { + acl: RemarkTemplatesAcl.canUseList, + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + paginated: RemarkTemplatesQueries.useList, + infinite: RemarkTemplatesQueries.useListInfinite, + filters: { + schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + onlyUsedFor: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + content: true, + onlyUsedFor: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: RemarkTemplatesAcl.canUseFindById, + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + query: RemarkTemplatesQueries.useFindById, + }, + create: { + acl: RemarkTemplatesAcl.canUseCreate, + schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, + mutation: RemarkTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + content: true, + onlyUsedFor: true, + }, + }, + }), + }, + update: { + acl: RemarkTemplatesAcl.canUseUpdate, + schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, + mutation: RemarkTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + content: true, + onlyUsedFor: true, + archived: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: RemarkTemplatesAcl.canUsePaginateLabels, + schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, + paginated: RemarkTemplatesQueries.usePaginateLabels, + infinite: RemarkTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + content: true, + }, + sortable: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/remarkTemplates/remarkTemplates.models.ts b/test/generated/dist/remarkTemplates/remarkTemplates.models.ts new file mode 100644 index 0000000..21a682a --- /dev/null +++ b/test/generated/dist/remarkTemplates/remarkTemplates.models.ts @@ -0,0 +1,221 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace RemarkTemplatesModels { + /** + * RemarkTemplateLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { CommonModels.EditorContentResponseDto } content Remark template content + */ + export const RemarkTemplateLabelResponseDTOSchema = z + .object({ + id: z.string(), + label: z.string(), + content: CommonModels.EditorContentResponseDtoSchema.describe("Remark template content"), + }) + .readonly(); + export type RemarkTemplateLabelResponseDTO = z.infer; + + /** + * RemarkTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const RemarkTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type RemarkTemplateEmployeeDTO = z.infer; + + /** + * OnlyUsedForEnumSchema + * @type { enum } + */ + export const OnlyUsedForEnumSchema = z.enum([ + "transport-order", + "export-declaration", + "house-bl", + "master-bl", + "house-awb", + "master-awb", + "bl-instructions", + "ams-instructions", + "cmr-form", + "fcr-form", + "isf-form", + "templated-document", + "invoice", + "quote-document", + "shipping-instructions", + "position-office-notes", + "invoice-body-remarks", + "business-partner-office-notes", + ]); + export type OnlyUsedForEnum = z.infer; + export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; + + /** + * RemarkTemplateResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name Template name + * @property { CommonModels.EditorContentResponseDto } content Template content + * @property { string[] } onlyUsedFor Restrict template usage to specific document types + * @property { boolean } archived + * @property { string } createdById + * @property { RemarkTemplateEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { RemarkTemplateEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const RemarkTemplateResponseDTOSchema = z + .object({ + id: z.string(), + officeId: z.string(), + name: z.string().describe("Template name"), + content: CommonModels.EditorContentResponseDtoSchema.describe("Template content"), + onlyUsedFor: z + .array(OnlyUsedForEnumSchema) + .readonly() + .describe("Restrict template usage to specific document types") + .nullish(), + archived: z.boolean(), + createdById: z.string().nullish(), + createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type RemarkTemplateResponseDTO = z.infer; + + /** + * CreateRemarkTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { CommonModels.EditorContentUpdateDto } content Template content + * @property { OnlyUsedForEnum[] } onlyUsedFor Restrict template usage to specific document types + */ + export const CreateRemarkTemplateRequestDTOSchema = z + .object({ + name: z.string().describe("Template name"), + content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), + onlyUsedFor: z + .array(OnlyUsedForEnumSchema) + .readonly() + .describe("Restrict template usage to specific document types") + .nullish(), + }) + .readonly(); + export type CreateRemarkTemplateRequestDTO = z.infer; + + /** + * UpdateRemarkTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { CommonModels.EditorContentUpdateDto } content Template content + * @property { string[] } onlyUsedFor Restrict template usage to specific document types + * @property { boolean } archived Archive status + */ + export const UpdateRemarkTemplateRequestDTOSchema = z + .object({ + name: z.string().describe("Template name"), + content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), + onlyUsedFor: z + .array(OnlyUsedForEnumSchema) + .readonly() + .describe("Restrict template usage to specific document types"), + archived: z.boolean().describe("Archive status"), + }) + .readonly(); + export type UpdateRemarkTemplateRequestDTO = z.infer; + + /** + * RemarkTemplateFilterDtoSchema + * @type { object } + * @property { boolean } archived + * @property { string } search + * @property { string } onlyUsedFor Filter by document type + */ + export const RemarkTemplateFilterDtoSchema = z + .object({ + archived: z.boolean(), + search: z.string(), + onlyUsedFor: OnlyUsedForEnumSchema.describe("Filter by document type"), + }) + .readonly(); + export type RemarkTemplateFilterDto = z.infer; + + /** + * RemarkTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const RemarkTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type RemarkTemplateLabelFilterDto = z.infer; + + /** + * RemarkTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const RemarkTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type RemarkTemplatesPaginateLabelsOrderParamEnum = z.infer< + typeof RemarkTemplatesPaginateLabelsOrderParamEnumSchema + >; + export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * RemarkTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { RemarkTemplateLabelResponseDTO[] } items + */ + export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type RemarkTemplatesPaginateLabelsResponse = z.infer; + + /** + * RemarkTemplatesListOrderParamEnumSchema + * @type { enum } + */ + export const RemarkTemplatesListOrderParamEnumSchema = z.enum([ + "name", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type RemarkTemplatesListOrderParamEnum = z.infer; + export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEnumSchema.enum; + + /** + * RemarkTemplatesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { RemarkTemplateResponseDTO[] } items + */ + export const RemarkTemplatesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).readonly() }).readonly().shape, + }); + export type RemarkTemplatesListResponse = z.infer; +} diff --git a/test/generated/dist/remarkTemplates/remarkTemplates.queries.ts b/test/generated/dist/remarkTemplates/remarkTemplates.queries.ts new file mode 100644 index 0000000..e169038 --- /dev/null +++ b/test/generated/dist/remarkTemplates/remarkTemplates.queries.ts @@ -0,0 +1,420 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; +import { RemarkTemplatesApi } from "./remarkTemplates.api"; + +export namespace RemarkTemplatesQueries { + export const moduleName = QueryModule.RemarkTemplates; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + officeId: string, + limit?: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/remark-templates/paginate/labels", + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + paginateLabelsInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/remark-templates/paginate/labels", + "infinite", + officeId, + limit, + order, + filter, + cursor, + ] as const, + list: ( + officeId: string, + limit?: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/offices/:officeId/remark-templates", officeId, limit, order, filter, page, cursor] as const, + listInfinite: ( + officeId: string, + limit?: number, + order?: string, + filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, + cursor?: string, + ) => + [...keys.all, "/offices/:officeId/remark-templates", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => + [...keys.all, "/offices/:officeId/remark-templates/:id", id, officeId] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate remark template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId })); + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate remark template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId })); + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useList` + * @summary List remark templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + officeId, + limit, + order, + filter, + page, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: RemarkTemplatesModels.RemarkTemplateFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUseList({ officeId })); + return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List remark templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + officeId, + limit, + order, + filter, + cursor, + }: { + officeId: string; + limit: number; + order?: string; + filter?: RemarkTemplatesModels.RemarkTemplateFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(RemarkTemplatesAcl.canUseList({ officeId })); + return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new remark template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof RemarkTemplatesApi.create, + { officeId: string; data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId })); + return RemarkTemplatesApi.create(officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get remark template by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ + export const useFindById = ( + { id, officeId }: { id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId })); + return RemarkTemplatesApi.findById(id, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update remark template by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof RemarkTemplatesApi.update, + { id: string; officeId: string; data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId })); + return RemarkTemplatesApi.update(id, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive remark template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useArchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId })); + return RemarkTemplatesApi.archive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive remark template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUnarchive = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId })); + return RemarkTemplatesApi.unarchive(id, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/roadQuotes/roadQuotes.acl.ts b/test/generated/dist/roadQuotes/roadQuotes.acl.ts new file mode 100644 index 0000000..599c783 --- /dev/null +++ b/test/generated/dist/roadQuotes/roadQuotes.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace RoadQuotesAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get road quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update road quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/roadQuotes/roadQuotes.api.ts b/test/generated/dist/roadQuotes/roadQuotes.api.ts new file mode 100644 index 0000000..5355e5a --- /dev/null +++ b/test/generated/dist/roadQuotes/roadQuotes.api.ts @@ -0,0 +1,27 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { RoadQuotesModels } from "./roadQuotes.models"; + +export namespace RoadQuotesApi { + export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/road-quote`, + config, + ); + }; + export const update = ( + officeId: string, + quoteId: string, + data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/road-quote`, + ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/roadQuotes/roadQuotes.models.ts b/test/generated/dist/roadQuotes/roadQuotes.models.ts new file mode 100644 index 0000000..f50ac2e --- /dev/null +++ b/test/generated/dist/roadQuotes/roadQuotes.models.ts @@ -0,0 +1,45 @@ +import { z } from "zod"; + +export namespace RoadQuotesModels { + /** + * RoadQuoteResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the road quote + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + */ + export const RoadQuoteResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier for the road quote"), + bookingMatchingCode: z.string().describe("Code for matching bookings"), + validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), + validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), + buyServiceContract: z.string().describe("Service contract for buying"), + sellServiceContract: z.string().describe("Service contract for selling"), + }) + .readonly(); + export type RoadQuoteResponseDTO = z.infer; + + /** + * UpdateRoadQuoteRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + */ + export const UpdateRoadQuoteRequestDTOSchema = z + .object({ + bookingMatchingCode: z.string().describe("Code for matching bookings"), + validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), + validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), + buyServiceContract: z.string().describe("Service contract for buying"), + sellServiceContract: z.string().describe("Service contract for selling"), + }) + .readonly(); + export type UpdateRoadQuoteRequestDTO = z.infer; +} diff --git a/test/generated/dist/roadQuotes/roadQuotes.queries.ts b/test/generated/dist/roadQuotes/roadQuotes.queries.ts new file mode 100644 index 0000000..ddd3e83 --- /dev/null +++ b/test/generated/dist/roadQuotes/roadQuotes.queries.ts @@ -0,0 +1,83 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { RoadQuotesAcl } from "./roadQuotes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { RoadQuotesModels } from "./roadQuotes.models"; +import { RoadQuotesApi } from "./roadQuotes.api"; + +export namespace RoadQuotesQueries { + export const moduleName = QueryModule.RoadQuotes; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/road-quote", officeId, quoteId] as const, + }; + + /** + * Query `useGet` + * @summary Get road quote by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(RoadQuotesAcl.canUseGet({ officeId })); + return RoadQuotesApi.get(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update road quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { RoadQuotesModels.UpdateRoadQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof RoadQuotesApi.update, + { officeId: string; quoteId: string; data: RoadQuotesModels.UpdateRoadQuoteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(RoadQuotesAcl.canUseUpdate({ officeId })); + return RoadQuotesApi.update(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.get(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/seaPositions/seaPositions.acl.ts b/test/generated/dist/seaPositions/seaPositions.acl.ts new file mode 100644 index 0000000..7b8c6cb --- /dev/null +++ b/test/generated/dist/seaPositions/seaPositions.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace SeaPositionsAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get sea position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Read", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update sea position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< + "Update", + "Position" | (ForcedSubject<"Position"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/seaPositions/seaPositions.api.ts b/test/generated/dist/seaPositions/seaPositions.api.ts new file mode 100644 index 0000000..e318757 --- /dev/null +++ b/test/generated/dist/seaPositions/seaPositions.api.ts @@ -0,0 +1,27 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { SeaPositionsModels } from "./seaPositions.models"; + +export namespace SeaPositionsApi { + export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/sea-position`, + config, + ); + }; + export const update = ( + officeId: string, + positionId: string, + data: SeaPositionsModels.UpdateSeaPositionRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/sea-position`, + ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/seaPositions/seaPositions.models.ts b/test/generated/dist/seaPositions/seaPositions.models.ts new file mode 100644 index 0000000..738a8c5 --- /dev/null +++ b/test/generated/dist/seaPositions/seaPositions.models.ts @@ -0,0 +1,87 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace SeaPositionsModels { + /** + * SeaPositionResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } bookingMatchingCode + * @property { string } houseBillOfLadingNumber + * @property { string } masterBillOfLadingNumber + * @property { boolean } hblRequired + * @property { boolean } mblRequired + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { string } buyServiceContract + * @property { string } sellServiceContract + * @property { string } quoteReference + * @property { string } createdAt + * @property { string } updatedAt + * @property { CommonModels.SeaRoutingEnum } routing + * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route + */ + export const SeaPositionResponseDTOSchema = z + .object({ + id: z.string(), + bookingMatchingCode: z.string().nullish(), + houseBillOfLadingNumber: z.string().nullish(), + masterBillOfLadingNumber: z.string().nullish(), + hblRequired: z.boolean(), + mblRequired: z.boolean(), + blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), + blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), + customsDate: z.iso.datetime({ offset: true }).nullish(), + vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), + buyServiceContract: z.string().nullish(), + sellServiceContract: z.string().nullish(), + quoteReference: z.string().nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + routing: CommonModels.SeaRoutingEnumSchema.nullish(), + defaultBookingNumber: z + .string() + .describe("Default booking number from the port of loading point of the default route") + .nullish(), + }) + .readonly(); + export type SeaPositionResponseDTO = z.infer; + + /** + * UpdateSeaPositionRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode + * @property { string } houseBillOfLadingNumber + * @property { boolean } mblRequired + * @property { boolean } hblRequired + * @property { string } masterBillOfLadingNumber + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { string } buyServiceContract + * @property { string } quoteReference + * @property { string } sellServiceContract + * @property { CommonModels.SeaRoutingEnum } routing + */ + export const UpdateSeaPositionRequestDTOSchema = z + .object({ + bookingMatchingCode: z.string(), + houseBillOfLadingNumber: z.string(), + mblRequired: z.boolean(), + hblRequired: z.boolean(), + masterBillOfLadingNumber: z.string(), + blfromCostumerDate: z.iso.datetime({ offset: true }), + blfromCarrierDate: z.iso.datetime({ offset: true }), + customsDate: z.iso.datetime({ offset: true }), + vgmCustomerDate: z.iso.datetime({ offset: true }), + buyServiceContract: z.string(), + quoteReference: z.string(), + sellServiceContract: z.string(), + routing: CommonModels.SeaRoutingEnumSchema, + }) + .readonly(); + export type UpdateSeaPositionRequestDTO = z.infer; +} diff --git a/test/generated/dist/seaPositions/seaPositions.queries.ts b/test/generated/dist/seaPositions/seaPositions.queries.ts new file mode 100644 index 0000000..f562c59 --- /dev/null +++ b/test/generated/dist/seaPositions/seaPositions.queries.ts @@ -0,0 +1,83 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { SeaPositionsAcl } from "./seaPositions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { SeaPositionsModels } from "./seaPositions.models"; +import { SeaPositionsApi } from "./seaPositions.api"; + +export namespace SeaPositionsQueries { + export const moduleName = QueryModule.SeaPositions; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/sea-position", officeId, positionId] as const, + }; + + /** + * Query `useGet` + * @summary Get sea position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, positionId }: { officeId: string; positionId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(SeaPositionsAcl.canUseGet({ officeId })); + return SeaPositionsApi.get(officeId, positionId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update sea position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { SeaPositionsModels.UpdateSeaPositionRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof SeaPositionsApi.update, + { officeId: string; positionId: string; data: SeaPositionsModels.UpdateSeaPositionRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(SeaPositionsAcl.canUseUpdate({ officeId })); + return SeaPositionsApi.update(officeId, positionId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/seaQuotes/seaQuotes.acl.ts b/test/generated/dist/seaQuotes/seaQuotes.acl.ts new file mode 100644 index 0000000..4841eaf --- /dev/null +++ b/test/generated/dist/seaQuotes/seaQuotes.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace SeaQuotesAcl { + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get sea quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Read", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update sea quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< + "Update", + "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/seaQuotes/seaQuotes.api.ts b/test/generated/dist/seaQuotes/seaQuotes.api.ts new file mode 100644 index 0000000..f5efa61 --- /dev/null +++ b/test/generated/dist/seaQuotes/seaQuotes.api.ts @@ -0,0 +1,27 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { SeaQuotesModels } from "./seaQuotes.models"; + +export namespace SeaQuotesApi { + export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/sea-quote`, + config, + ); + }; + export const update = ( + officeId: string, + quoteId: string, + data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/sea-quote`, + ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/seaQuotes/seaQuotes.models.ts b/test/generated/dist/seaQuotes/seaQuotes.models.ts new file mode 100644 index 0000000..f5b1795 --- /dev/null +++ b/test/generated/dist/seaQuotes/seaQuotes.models.ts @@ -0,0 +1,52 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace SeaQuotesModels { + /** + * SeaQuoteResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the sea quote + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + * @property { CommonModels.SeaRoutingEnum } routing + * @property { boolean } splitRoute Indicates if the route is split + */ + export const SeaQuoteResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier for the sea quote"), + bookingMatchingCode: z.string().describe("Code for matching bookings"), + validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), + validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), + buyServiceContract: z.string().describe("Service contract for buying"), + sellServiceContract: z.string().describe("Service contract for selling"), + routing: CommonModels.SeaRoutingEnumSchema.nullish(), + splitRoute: z.boolean().describe("Indicates if the route is split").nullish(), + }) + .readonly(); + export type SeaQuoteResponseDTO = z.infer; + + /** + * UpdateSeaQuoteRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + * @property { CommonModels.SeaRoutingEnum } routing + */ + export const UpdateSeaQuoteRequestDTOSchema = z + .object({ + bookingMatchingCode: z.string().describe("Code for matching bookings"), + validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), + validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), + buyServiceContract: z.string().describe("Service contract for buying"), + sellServiceContract: z.string().describe("Service contract for selling"), + routing: CommonModels.SeaRoutingEnumSchema, + }) + .readonly(); + export type UpdateSeaQuoteRequestDTO = z.infer; +} diff --git a/test/generated/dist/seaQuotes/seaQuotes.queries.ts b/test/generated/dist/seaQuotes/seaQuotes.queries.ts new file mode 100644 index 0000000..f147e95 --- /dev/null +++ b/test/generated/dist/seaQuotes/seaQuotes.queries.ts @@ -0,0 +1,83 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { SeaQuotesAcl } from "./seaQuotes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { SeaQuotesModels } from "./seaQuotes.models"; +import { SeaQuotesApi } from "./seaQuotes.api"; + +export namespace SeaQuotesQueries { + export const moduleName = QueryModule.SeaQuotes; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => + [...keys.all, "/offices/:officeId/quotes/:quoteId/sea-quote", officeId, quoteId] as const, + }; + + /** + * Query `useGet` + * @summary Get sea quote by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, quoteId }: { officeId: string; quoteId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(SeaQuotesAcl.canUseGet({ officeId })); + return SeaQuotesApi.get(officeId, quoteId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update sea quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { SeaQuotesModels.UpdateSeaQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof SeaQuotesApi.update, + { officeId: string; quoteId: string; data: SeaQuotesModels.UpdateSeaQuoteRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(SeaQuotesAcl.canUseUpdate({ officeId })); + return SeaQuotesApi.update(officeId, quoteId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.get(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/shippingInstructions/shippingInstructions.acl.ts b/test/generated/dist/shippingInstructions/shippingInstructions.acl.ts new file mode 100644 index 0000000..b0dc4c8 --- /dev/null +++ b/test/generated/dist/shippingInstructions/shippingInstructions.acl.ts @@ -0,0 +1,93 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ShippingInstructionsAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Create", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Create", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ + export const canUseGet = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useDeleteOfficesPositionsShippingInstructionsById` mutation ability. For global ability, omit the object parameter. + * @description Delete shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsShippingInstructionsById` mutation + */ + export const canUseDeleteOfficesPositionsShippingInstructionsById = (object?: { officeId: string }) => + [ + "Delete", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Delete", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `usePreview` query or `usePreviewMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreview` query or `usePreviewMutation` mutation + */ + export const canUsePreview = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ + export const canUseGenerate = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/shippingInstructions/shippingInstructions.api.ts b/test/generated/dist/shippingInstructions/shippingInstructions.api.ts new file mode 100644 index 0000000..174b260 --- /dev/null +++ b/test/generated/dist/shippingInstructions/shippingInstructions.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ShippingInstructionsModels } from "./shippingInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ShippingInstructionsApi { + export const create = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions`, + undefined, + config, + ); + }; + export const get = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + config, + ); + }; + export const update = ( + officeId: string, + positionId: string, + id: string, + data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), + config, + ); + }; + export const deleteOfficesPositionsShippingInstructionsById = ( + officeId: string, + positionId: string, + id: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + undefined, + config, + ); + }; + export const preview = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generate = ( + officeId: string, + positionId: string, + id: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/shippingInstructions/shippingInstructions.models.ts b/test/generated/dist/shippingInstructions/shippingInstructions.models.ts new file mode 100644 index 0000000..50182eb --- /dev/null +++ b/test/generated/dist/shippingInstructions/shippingInstructions.models.ts @@ -0,0 +1,847 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ShippingInstructionsModels { + /** + * EnsDeclarationEnumSchema + * @type { enum } + * @description ENS declaration + */ + export const EnsDeclarationEnumSchema = z.enum(["Carrier", "Self"]); + export type EnsDeclarationEnum = z.infer; + export const EnsDeclarationEnum = EnsDeclarationEnumSchema.enum; + + /** + * IssuedHouseBillsEnumSchema + * @type { enum } + * @description Issued house bills + */ + export const IssuedHouseBillsEnumSchema = z.enum(["None", "One", "Multiple"]); + export type IssuedHouseBillsEnum = z.infer; + export const IssuedHouseBillsEnum = IssuedHouseBillsEnumSchema.enum; + + /** + * WoodDeclarationEnumSchema + * @type { enum } + * @description Wood declaration + */ + export const WoodDeclarationEnumSchema = z.enum([ + "NoWood", + "TreatedAndCertified", + "NotTreatedAndNotCertified", + "Processed", + ]); + export type WoodDeclarationEnum = z.infer; + export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; + + /** + * ShippingInstructionsPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } addressLine1 + * @property { string } addressLine2 + * @property { string } city + * @property { string } postalCode + * @property { string } state + * @property { string } countryCode + * @property { string } contactName + * @property { string } contactPhone + * @property { string } contactEmail + */ + export const ShippingInstructionsPartnerResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + addressLine1: z.string(), + addressLine2: z.string(), + city: z.string(), + postalCode: z.string(), + state: z.string(), + countryCode: z.string(), + contactName: z.string(), + contactPhone: z.string(), + contactEmail: z.string(), + }) + .readonly(); + export type ShippingInstructionsPartnerResponseDto = z.infer; + + /** + * ShippingInstructionsGeneralDetailsDtoSchema + * @type { object } + * @property { ShippingInstructionsPartnerResponseDto } shipper + * @property { ShippingInstructionsPartnerResponseDto } consignee + * @property { ShippingInstructionsPartnerResponseDto } freightForwarder + * @property { ShippingInstructionsPartnerResponseDto } notifyParty + * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty1 + * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty2 + * @property { ShippingInstructionsPartnerResponseDto } contractParty + * @property { ShippingInstructionsPartnerResponseDto } manufacturer + * @property { ShippingInstructionsPartnerResponseDto } consolidator + * @property { ShippingInstructionsPartnerResponseDto } importer + * @property { ShippingInstructionsPartnerResponseDto } warehouseKeeper + */ + export const ShippingInstructionsGeneralDetailsDtoSchema = z + .object({ + shipper: ShippingInstructionsPartnerResponseDtoSchema, + consignee: ShippingInstructionsPartnerResponseDtoSchema, + freightForwarder: ShippingInstructionsPartnerResponseDtoSchema, + notifyParty: ShippingInstructionsPartnerResponseDtoSchema, + additionalNotifyParty1: ShippingInstructionsPartnerResponseDtoSchema, + additionalNotifyParty2: ShippingInstructionsPartnerResponseDtoSchema, + contractParty: ShippingInstructionsPartnerResponseDtoSchema, + manufacturer: ShippingInstructionsPartnerResponseDtoSchema, + consolidator: ShippingInstructionsPartnerResponseDtoSchema, + importer: ShippingInstructionsPartnerResponseDtoSchema, + warehouseKeeper: ShippingInstructionsPartnerResponseDtoSchema, + }) + .readonly(); + export type ShippingInstructionsGeneralDetailsDto = z.infer; + + /** + * ShippingInstructionsLocationResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } code + * @property { string } countryCode + * @property { string } eta + * @property { string } vessel + * @property { string } voyage + */ + export const ShippingInstructionsLocationResponseDtoSchema = z + .object({ + id: z.string(), + name: z.string(), + code: z.string(), + countryCode: z.string(), + eta: z.iso.datetime({ offset: true }), + vessel: z.string(), + voyage: z.string(), + }) + .readonly(); + export type ShippingInstructionsLocationResponseDto = z.infer; + + /** + * SIMoveTypeEnumSchema + * @type { enum } + */ + export const SIMoveTypeEnumSchema = z.enum(["DoorToDoor", "DoorToPort", "PortToDoor", "PortToPort"]); + export type SIMoveTypeEnum = z.infer; + export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; + + /** + * ShippingInstructionsTransportDtoSchema + * @type { object } + * @property { string } vessel + * @property { string } voyage + * @property { string } imo + * @property { ShippingInstructionsLocationResponseDto } placeOfReceipt + * @property { ShippingInstructionsLocationResponseDto } portOfLoading + * @property { ShippingInstructionsLocationResponseDto } portOfDischarge + * @property { ShippingInstructionsLocationResponseDto } placeOfDelivery + * @property { SIMoveTypeEnum } moveType + * @property { string } shipmentType + */ + export const ShippingInstructionsTransportDtoSchema = z + .object({ + vessel: z.string(), + voyage: z.string(), + imo: z.string(), + placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema, + portOfLoading: ShippingInstructionsLocationResponseDtoSchema, + portOfDischarge: ShippingInstructionsLocationResponseDtoSchema, + placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema, + moveType: SIMoveTypeEnumSchema, + shipmentType: z.string(), + }) + .readonly(); + export type ShippingInstructionsTransportDto = z.infer; + + /** + * ShippingInstructionsHazardousDtoSchema + * @type { object } + * @property { string } IMOClass + * @property { string } UNDGNumber + * @property { string } contact + */ + export const ShippingInstructionsHazardousDtoSchema = z + .object({ IMOClass: z.string(), UNDGNumber: z.string(), contact: z.string() }) + .readonly(); + export type ShippingInstructionsHazardousDto = z.infer; + + /** + * ShippingInstructionsPackageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { number } quantity + * @property { string } packageType + * @property { string } packageTypeDescription + * @property { string } packageDescription + * @property { string } hsCode + * @property { number } volume + * @property { number } grossWeight + * @property { string } caseMarks + * @property { ShippingInstructionsHazardousDto } hazardous + * @property { string } ncmCodes + * @property { string } cusCode + */ + export const ShippingInstructionsPackageResponseDtoSchema = z + .object({ + id: z.string(), + quantity: z.number(), + packageType: z.string(), + packageTypeDescription: z.string(), + packageDescription: z.string(), + hsCode: z.string(), + volume: z.number(), + grossWeight: z.number(), + caseMarks: z.string(), + hazardous: ShippingInstructionsHazardousDtoSchema, + ncmCodes: z.string(), + cusCode: z.string(), + }) + .readonly(); + export type ShippingInstructionsPackageResponseDto = z.infer; + + /** + * ShippingInstructionsCargoResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } transportUnitNumber + * @property { string } transportUnitType + * @property { string } transportUnitDescription + * @property { string } containerSupplier + * @property { number } grossWeight + * @property { number } tare + * @property { number } volume + * @property { string } seal1 + * @property { string } seal2 + * @property { string } woodDeclaration + * @property { ShippingInstructionsPackageResponseDto[] } packages + */ + export const ShippingInstructionsCargoResponseDtoSchema = z + .object({ + id: z.string().nullish(), + transportUnitNumber: z.string().nullish(), + transportUnitType: z.string().nullish(), + transportUnitDescription: z.string().nullish(), + containerSupplier: z.string().nullish(), + grossWeight: z.number().nullish(), + tare: z.number().nullish(), + volume: z.number().nullish(), + seal1: z.string().nullish(), + seal2: z.string().nullish(), + woodDeclaration: WoodDeclarationEnumSchema.nullish(), + packages: z.array(ShippingInstructionsPackageResponseDtoSchema).readonly(), + }) + .readonly(); + export type ShippingInstructionsCargoResponseDto = z.infer; + + /** + * ShippingInstructionsHeaderDtoSchema + * @type { object } + * @property { string } name + * @property { string } nameSuffix + * @property { number } versionNumber + * @property { string } shippingInstructionNumber + * @property { string } carrierScac + * @property { string } carrierBookingNumber + */ + export const ShippingInstructionsHeaderDtoSchema = z + .object({ + name: z.string(), + nameSuffix: z.string().nullish(), + versionNumber: z.number(), + shippingInstructionNumber: z.string().nullish(), + carrierScac: z.string().nullish(), + carrierBookingNumber: z.string().nullish(), + }) + .readonly(); + export type ShippingInstructionsHeaderDto = z.infer; + + /** + * ShippingInstructionsReferencesDtoSchema + * @type { object } + * @property { string } shipperReference + * @property { string } forwarderReference + * @property { string } transactionReferenceNumber + * @property { string } blReferenceNumber + * @property { string } uniqueConsignmentReference + * @property { string } purchaseOrderNumber + * @property { string } contractReferenceNumber + * @property { string } rucNumber + * @property { string } consigneeOrderNumber + * @property { string } invoiceReferenceNumber + * @property { string } letterOfCreditReference + * @property { string } customsHouseBrokerReference + * @property { string } fmcNumber + * @property { string } exportLicenseNumber + */ + export const ShippingInstructionsReferencesDtoSchema = z + .object({ + shipperReference: z.string(), + forwarderReference: z.string(), + transactionReferenceNumber: z.string(), + blReferenceNumber: z.string(), + uniqueConsignmentReference: z.string(), + purchaseOrderNumber: z.string(), + contractReferenceNumber: z.string(), + rucNumber: z.string(), + consigneeOrderNumber: z.string(), + invoiceReferenceNumber: z.string(), + letterOfCreditReference: z.string(), + customsHouseBrokerReference: z.string(), + fmcNumber: z.string(), + exportLicenseNumber: z.string(), + }) + .readonly(); + export type ShippingInstructionsReferencesDto = z.infer; + + /** + * ShippingInstructionsCustomsComplianceDtoSchema + * @type { object } + * @property { string } shipperTaxId + * @property { string } shipperEORI + * @property { string } consigneeTaxId + * @property { string } consigneeEORI + * @property { string } notifyPartyTaxId + * @property { string } notifyPartyEORI + */ + export const ShippingInstructionsCustomsComplianceDtoSchema = z + .object({ + shipperTaxId: z.string(), + shipperEORI: z.string(), + consigneeTaxId: z.string(), + consigneeEORI: z.string(), + notifyPartyTaxId: z.string(), + notifyPartyEORI: z.string(), + }) + .readonly(); + export type ShippingInstructionsCustomsComplianceDto = z.infer; + + /** + * ShippingInstructionsIcs2DtoSchema + * @type { object } + * @property { boolean } goodsDeliveredInEu + * @property { string } ensDeclaration + * @property { string } issuedHouseBills + */ + export const ShippingInstructionsIcs2DtoSchema = z + .object({ + goodsDeliveredInEu: z.boolean(), + ensDeclaration: EnsDeclarationEnumSchema, + issuedHouseBills: IssuedHouseBillsEnumSchema, + }) + .readonly(); + export type ShippingInstructionsIcs2Dto = z.infer; + + /** + * ShippingInstructionsCargoIdentificationNumbersDtoSchema + * @type { object } + * @property { string } PCINNumber + * @property { string } CSNNumber + * @property { string } MCINNumber + */ + export const ShippingInstructionsCargoIdentificationNumbersDtoSchema = z + .object({ PCINNumber: z.string(), CSNNumber: z.string(), MCINNumber: z.string() }) + .readonly(); + export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer< + typeof ShippingInstructionsCargoIdentificationNumbersDtoSchema + >; + + /** + * ShippingInstructionsControlTotalsDtoSchema + * @type { object } + * @property { number } totalNumberOfContainers + * @property { number } totalNumberOfPackages + * @property { number } totalShipmentWeight + * @property { number } totalShipmentVolume + */ + export const ShippingInstructionsControlTotalsDtoSchema = z + .object({ + totalNumberOfContainers: z.number(), + totalNumberOfPackages: z.number(), + totalShipmentWeight: z.number(), + totalShipmentVolume: z.number(), + }) + .readonly(); + export type ShippingInstructionsControlTotalsDto = z.infer; + + /** + * FreightChargesDtoSchema + * @type { object } + * @property { string } freightPayer + * @property { string } freightTerm + */ + export const FreightChargesDtoSchema = z + .object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }) + .readonly(); + export type FreightChargesDto = z.infer; + + /** + * ShippingInstructionsShippersDeclaredValueDtoSchema + * @type { object } + * @property { string } currency + * @property { number } shipperDeclaredValue + */ + export const ShippingInstructionsShippersDeclaredValueDtoSchema = z + .object({ currency: z.string(), shipperDeclaredValue: z.number() }) + .readonly(); + export type ShippingInstructionsShippersDeclaredValueDto = z.infer< + typeof ShippingInstructionsShippersDeclaredValueDtoSchema + >; + + /** + * ShippingInstructionsNotificationEmailsDtoSchema + * @type { object } + * @property { string } siRequestorEmails + */ + export const ShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string() }).readonly(); + export type ShippingInstructionsNotificationEmailsDto = z.infer< + typeof ShippingInstructionsNotificationEmailsDtoSchema + >; + + /** + * ShippingInstructionsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } name + * @property { string } nameSuffix + * @property { string } date + * @property { string } createdAt + * @property { string } updatedAt + * @property { number } versionNumber + * @property { ShippingInstructionsHeaderDto } header + * @property { ShippingInstructionsGeneralDetailsDto } generalDetails + * @property { ShippingInstructionsReferencesDto } references + * @property { ShippingInstructionsTransportDto } transport + * @property { ShippingInstructionsCustomsComplianceDto } customsCompliance + * @property { ShippingInstructionsIcs2Dto } ics2 + * @property { ShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers + * @property { ShippingInstructionsCargoResponseDto[] } cargo + * @property { ShippingInstructionsControlTotalsDto } controlTotals + * @property { FreightChargesDto } freightCharges + * @property { ShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue + * @property { ShippingInstructionsNotificationEmailsDto } notificationEmails + * @property { string } defaultFileName + */ + export const ShippingInstructionsResponseDtoSchema = z + .object({ + id: z.string(), + positionId: z.string(), + name: z.string(), + nameSuffix: z.string().nullish(), + date: z.iso.datetime({ offset: true }).nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + versionNumber: z.number(), + header: ShippingInstructionsHeaderDtoSchema, + generalDetails: ShippingInstructionsGeneralDetailsDtoSchema, + references: ShippingInstructionsReferencesDtoSchema, + transport: ShippingInstructionsTransportDtoSchema, + customsCompliance: ShippingInstructionsCustomsComplianceDtoSchema, + ics2: ShippingInstructionsIcs2DtoSchema, + cargoIdentificationNumbers: ShippingInstructionsCargoIdentificationNumbersDtoSchema, + cargo: z.array(ShippingInstructionsCargoResponseDtoSchema).readonly().nullish(), + controlTotals: ShippingInstructionsControlTotalsDtoSchema, + freightCharges: FreightChargesDtoSchema, + shippersDeclaredValue: ShippingInstructionsShippersDeclaredValueDtoSchema, + notificationEmails: ShippingInstructionsNotificationEmailsDtoSchema, + defaultFileName: z.string(), + }) + .readonly(); + export type ShippingInstructionsResponseDto = z.infer; + + /** + * UpdateShippingInstructionsPartnerDtoSchema + * @type { object } + * @property { string } id Partner id + * @property { string } name Partner name + * @property { string } addressLine1 Address line 1 + * @property { string } addressLine2 Address line 2 + * @property { string } city City + * @property { string } postalCode Postal code + * @property { string } state State + * @property { string } countryCode Country code + * @property { string } taxId Tax ID + * @property { string } contactName Contact name + * @property { string } contactPhone Contact phone + * @property { string } contactEmail Contact email + */ + export const UpdateShippingInstructionsPartnerDtoSchema = z + .object({ + id: z.string().describe("Partner id"), + name: z.string().describe("Partner name"), + addressLine1: z.string().describe("Address line 1"), + addressLine2: z.string().describe("Address line 2"), + city: z.string().describe("City"), + postalCode: z.string().describe("Postal code"), + state: z.string().describe("State"), + countryCode: z.string().describe("Country code"), + taxId: z.string().describe("Tax ID"), + contactName: z.string().describe("Contact name"), + contactPhone: z.string().describe("Contact phone"), + contactEmail: z.string().describe("Contact email"), + }) + .readonly(); + export type UpdateShippingInstructionsPartnerDto = z.infer; + + /** + * UpdateShippingInstructionsGeneralDetailsDtoSchema + * @type { object } + * @property { UpdateShippingInstructionsPartnerDto } shipper Shipper + * @property { UpdateShippingInstructionsPartnerDto } consignee Consignee + * @property { UpdateShippingInstructionsPartnerDto } freightForwarder Freight forwarder + * @property { UpdateShippingInstructionsPartnerDto } notifyParty Notify party + * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty1 Additional notify party 1 + * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty2 Additional notify party 2 + * @property { UpdateShippingInstructionsPartnerDto } contractParty Contract party + * @property { UpdateShippingInstructionsPartnerDto } manufacturer Manufacturer + * @property { UpdateShippingInstructionsPartnerDto } consolidator Consolidator + * @property { UpdateShippingInstructionsPartnerDto } importer Importer + * @property { UpdateShippingInstructionsPartnerDto } warehouseKeeper Warehouse keeper + */ + export const UpdateShippingInstructionsGeneralDetailsDtoSchema = z + .object({ + shipper: UpdateShippingInstructionsPartnerDtoSchema.describe("Shipper"), + consignee: UpdateShippingInstructionsPartnerDtoSchema.describe("Consignee"), + freightForwarder: UpdateShippingInstructionsPartnerDtoSchema.describe("Freight forwarder"), + notifyParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Notify party"), + additionalNotifyParty1: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 1"), + additionalNotifyParty2: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 2"), + contractParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Contract party"), + manufacturer: UpdateShippingInstructionsPartnerDtoSchema.describe("Manufacturer"), + consolidator: UpdateShippingInstructionsPartnerDtoSchema.describe("Consolidator"), + importer: UpdateShippingInstructionsPartnerDtoSchema.describe("Importer"), + warehouseKeeper: UpdateShippingInstructionsPartnerDtoSchema.describe("Warehouse keeper"), + }) + .readonly(); + export type UpdateShippingInstructionsGeneralDetailsDto = z.infer< + typeof UpdateShippingInstructionsGeneralDetailsDtoSchema + >; + + /** + * UpdateShippingInstructionsLocationDtoSchema + * @type { object } + * @property { string } id Location id + * @property { string } name Location name + * @property { string } code Location code + * @property { string } countryCode Country code + */ + export const UpdateShippingInstructionsLocationDtoSchema = z + .object({ + id: z.string().describe("Location id"), + name: z.string().describe("Location name"), + code: z.string().describe("Location code"), + countryCode: z.string().describe("Country code"), + }) + .readonly(); + export type UpdateShippingInstructionsLocationDto = z.infer; + + /** + * UpdateShippingInstructionsTransportDtoSchema + * @type { object } + * @property { string } vessel Vessel + * @property { string } voyage Voyage + * @property { string } imo IMO + * @property { UpdateShippingInstructionsLocationDto } placeOfReceipt Place of receipt + * @property { UpdateShippingInstructionsLocationDto } portOfLoading Port of loading + * @property { UpdateShippingInstructionsLocationDto } portOfDischarge Port of discharge + * @property { UpdateShippingInstructionsLocationDto } placeOfDelivery Place of delivery + * @property { SIMoveTypeEnum } moveType Move type + * @property { string } shipmentType Shipment type + */ + export const UpdateShippingInstructionsTransportDtoSchema = z + .object({ + vessel: z.string().describe("Vessel"), + voyage: z.string().describe("Voyage"), + imo: z.string().describe("IMO"), + placeOfReceipt: UpdateShippingInstructionsLocationDtoSchema.describe("Place of receipt"), + portOfLoading: UpdateShippingInstructionsLocationDtoSchema.describe("Port of loading"), + portOfDischarge: UpdateShippingInstructionsLocationDtoSchema.describe("Port of discharge"), + placeOfDelivery: UpdateShippingInstructionsLocationDtoSchema.describe("Place of delivery"), + moveType: SIMoveTypeEnumSchema.describe("Move type"), + shipmentType: z.string().describe("Shipment type"), + }) + .readonly(); + export type UpdateShippingInstructionsTransportDto = z.infer; + + /** + * UpdateShippingInstructionsHazardousDtoSchema + * @type { object } + * @property { string } IMOClass IMO class + * @property { string } UNDGNumber UNDG number + * @property { string } contact Contact + */ + export const UpdateShippingInstructionsHazardousDtoSchema = z + .object({ + IMOClass: z.string().describe("IMO class"), + UNDGNumber: z.string().describe("UNDG number"), + contact: z.string().describe("Contact"), + }) + .readonly(); + export type UpdateShippingInstructionsHazardousDto = z.infer; + + /** + * UpdateShippingInstructionsPackageDtoSchema + * @type { object } + * @property { string } id Package id + * @property { number } quantity Quantity + * @property { string } packageType Package type + * @property { string } packageTypeDescription Package type description + * @property { string } packageDescription Package description + * @property { string } hsCode HS code + * @property { number } volume Volume + * @property { number } grossWeight Gross weight + * @property { string } caseMarks Case marks + * @property { UpdateShippingInstructionsHazardousDto } hazardous Hazardous + * @property { string } ncmCodes NCM codes + * @property { string } cusCode CUS code + */ + export const UpdateShippingInstructionsPackageDtoSchema = z + .object({ + id: z.string().describe("Package id"), + quantity: z.number().describe("Quantity"), + packageType: z.string().describe("Package type"), + packageTypeDescription: z.string().describe("Package type description"), + packageDescription: z.string().describe("Package description"), + hsCode: z.string().describe("HS code"), + volume: z.number().describe("Volume"), + grossWeight: z.number().describe("Gross weight"), + caseMarks: z.string().describe("Case marks"), + hazardous: UpdateShippingInstructionsHazardousDtoSchema.describe("Hazardous"), + ncmCodes: z.string().describe("NCM codes"), + cusCode: z.string().describe("CUS code"), + }) + .readonly(); + export type UpdateShippingInstructionsPackageDto = z.infer; + + /** + * UpdateShippingInstructionsCargoDtoSchema + * @type { object } + * @property { string } id Cargo id + * @property { string } transportUnitNumber Transport unit number + * @property { string } transportUnitType Transport unit type + * @property { string } transportUnitDescription Transport unit description + * @property { string } containerSupplier Container supplier + * @property { number } grossWeight Gross weight + * @property { number } tare Tare + * @property { number } volume Volume + * @property { string } seal1 Seal 1 + * @property { string } seal2 Seal 2 + * @property { string } woodDeclaration Wood declaration + * @property { UpdateShippingInstructionsPackageDto[] } packages Packages + */ + export const UpdateShippingInstructionsCargoDtoSchema = z + .object({ + id: z.string().describe("Cargo id"), + transportUnitNumber: z.string().describe("Transport unit number"), + transportUnitType: z.string().describe("Transport unit type"), + transportUnitDescription: z.string().describe("Transport unit description"), + containerSupplier: z.string().describe("Container supplier"), + grossWeight: z.number().describe("Gross weight"), + tare: z.number().describe("Tare"), + volume: z.number().describe("Volume"), + seal1: z.string().describe("Seal 1"), + seal2: z.string().describe("Seal 2"), + woodDeclaration: WoodDeclarationEnumSchema.describe("Wood declaration"), + packages: z.array(UpdateShippingInstructionsPackageDtoSchema).readonly().describe("Packages"), + }) + .readonly(); + export type UpdateShippingInstructionsCargoDto = z.infer; + + /** + * UpdateShippingInstructionsHeaderDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } nameSuffix Name suffix + * @property { number } versionNumber Version number + * @property { string } shippingInstructionNumber Shipping instruction number + * @property { string } carrierScac Carrier SCAC + * @property { string } carrierBookingNumber Carrier booking number + */ + export const UpdateShippingInstructionsHeaderDtoSchema = z + .object({ + name: z.string().describe("Name"), + nameSuffix: z.string().describe("Name suffix"), + versionNumber: z.number().describe("Version number"), + shippingInstructionNumber: z.string().describe("Shipping instruction number"), + carrierScac: z.string().describe("Carrier SCAC"), + carrierBookingNumber: z.string().describe("Carrier booking number"), + }) + .readonly(); + export type UpdateShippingInstructionsHeaderDto = z.infer; + + /** + * UpdateShippingInstructionsReferencesDtoSchema + * @type { object } + * @property { string } shipperReference Shipper reference + * @property { string } forwarderReference Forwarder reference + * @property { string } transactionReferenceNumber Transaction reference number + * @property { string } blReferenceNumber BL reference number + * @property { string } uniqueConsignmentReference Unique consignment reference + * @property { string } purchaseOrderNumber Purchase order number + * @property { string } contractReferenceNumber Contract reference number + * @property { string } rucNumber RUC number + * @property { string } consigneeOrderNumber Consignee order number + * @property { string } invoiceReferenceNumber Invoice reference number + * @property { string } letterOfCreditReference Letter of credit reference + * @property { string } customsHouseBrokerReference Customs house broker reference + * @property { string } fmcNumber FMC number + * @property { string } exportLicenseNumber Export license number + */ + export const UpdateShippingInstructionsReferencesDtoSchema = z + .object({ + shipperReference: z.string().describe("Shipper reference"), + forwarderReference: z.string().describe("Forwarder reference"), + transactionReferenceNumber: z.string().describe("Transaction reference number"), + blReferenceNumber: z.string().describe("BL reference number"), + uniqueConsignmentReference: z.string().describe("Unique consignment reference"), + purchaseOrderNumber: z.string().describe("Purchase order number"), + contractReferenceNumber: z.string().describe("Contract reference number"), + rucNumber: z.string().describe("RUC number"), + consigneeOrderNumber: z.string().describe("Consignee order number"), + invoiceReferenceNumber: z.string().describe("Invoice reference number"), + letterOfCreditReference: z.string().describe("Letter of credit reference"), + customsHouseBrokerReference: z.string().describe("Customs house broker reference"), + fmcNumber: z.string().describe("FMC number"), + exportLicenseNumber: z.string().describe("Export license number"), + }) + .readonly(); + export type UpdateShippingInstructionsReferencesDto = z.infer; + + /** + * UpdateShippingInstructionsCustomsComplianceDtoSchema + * @type { object } + * @property { string } shipperTaxId Shipper tax ID + * @property { string } shipperEORI Shipper EORI + * @property { string } consigneeTaxId Consignee tax ID + * @property { string } consigneeEORI Consignee EORI + * @property { string } notifyPartyTaxId Notify party tax ID + * @property { string } notifyPartyEORI Notify party EORI + */ + export const UpdateShippingInstructionsCustomsComplianceDtoSchema = z + .object({ + shipperTaxId: z.string().describe("Shipper tax ID"), + shipperEORI: z.string().describe("Shipper EORI"), + consigneeTaxId: z.string().describe("Consignee tax ID"), + consigneeEORI: z.string().describe("Consignee EORI"), + notifyPartyTaxId: z.string().describe("Notify party tax ID"), + notifyPartyEORI: z.string().describe("Notify party EORI"), + }) + .readonly(); + export type UpdateShippingInstructionsCustomsComplianceDto = z.infer< + typeof UpdateShippingInstructionsCustomsComplianceDtoSchema + >; + + /** + * UpdateShippingInstructionsIcs2DtoSchema + * @type { object } + * @property { boolean } goodsDeliveredInEu Goods delivered in EU + * @property { string } ensDeclaration ENS declaration + * @property { string } issuedHouseBills Issued house bills + */ + export const UpdateShippingInstructionsIcs2DtoSchema = z + .object({ + goodsDeliveredInEu: z.boolean().describe("Goods delivered in EU"), + ensDeclaration: EnsDeclarationEnumSchema.describe("ENS declaration"), + issuedHouseBills: IssuedHouseBillsEnumSchema.describe("Issued house bills"), + }) + .readonly(); + export type UpdateShippingInstructionsIcs2Dto = z.infer; + + /** + * UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema + * @type { object } + * @property { string } PCINNumber PCIN number + * @property { string } CSNNumber CSN number + * @property { string } MCINNumber MCIN number + */ + export const UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema = z + .object({ + PCINNumber: z.string().describe("PCIN number"), + CSNNumber: z.string().describe("CSN number"), + MCINNumber: z.string().describe("MCIN number"), + }) + .readonly(); + export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer< + typeof UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema + >; + + /** + * UpdateFreightChargesDtoSchema + * @type { object } + * @property { string } freightPayer + * @property { string } freightTerm + */ + export const UpdateFreightChargesDtoSchema = z + .object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }) + .readonly(); + export type UpdateFreightChargesDto = z.infer; + + /** + * UpdateShippingInstructionsShippersDeclaredValueDtoSchema + * @type { object } + * @property { string } currency Currency + * @property { number } shipperDeclaredValue Shipper declared value + */ + export const UpdateShippingInstructionsShippersDeclaredValueDtoSchema = z + .object({ + currency: z.string().describe("Currency"), + shipperDeclaredValue: z.number().describe("Shipper declared value"), + }) + .readonly(); + export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer< + typeof UpdateShippingInstructionsShippersDeclaredValueDtoSchema + >; + + /** + * UpdateShippingInstructionsNotificationEmailsDtoSchema + * @type { object } + * @property { string } siRequestorEmails SI requestor emails + */ + export const UpdateShippingInstructionsNotificationEmailsDtoSchema = z + .object({ siRequestorEmails: z.string().describe("SI requestor emails") }) + .readonly(); + export type UpdateShippingInstructionsNotificationEmailsDto = z.infer< + typeof UpdateShippingInstructionsNotificationEmailsDtoSchema + >; + + /** + * UpdateShippingInstructionsRequestDtoSchema + * @type { object } + * @property { string } date Date + * @property { UpdateShippingInstructionsHeaderDto } header Header + * @property { UpdateShippingInstructionsGeneralDetailsDto } generalDetails General details + * @property { UpdateShippingInstructionsReferencesDto } references References + * @property { UpdateShippingInstructionsTransportDto } transport Transport + * @property { UpdateShippingInstructionsCustomsComplianceDto } customsCompliance Customs compliance + * @property { UpdateShippingInstructionsIcs2Dto } ics2 ICS2 + * @property { UpdateShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers Cargo identification numbers + * @property { UpdateShippingInstructionsCargoDto[] } cargo Cargo + * @property { UpdateFreightChargesDto } freightCharges + * @property { UpdateShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue Shipper's declared value + * @property { UpdateShippingInstructionsNotificationEmailsDto } notificationEmails Notification emails + */ + export const UpdateShippingInstructionsRequestDtoSchema = z + .object({ + date: z.iso.datetime({ offset: true }).describe("Date"), + header: UpdateShippingInstructionsHeaderDtoSchema.describe("Header"), + generalDetails: UpdateShippingInstructionsGeneralDetailsDtoSchema.describe("General details"), + references: UpdateShippingInstructionsReferencesDtoSchema.describe("References"), + transport: UpdateShippingInstructionsTransportDtoSchema.describe("Transport"), + customsCompliance: UpdateShippingInstructionsCustomsComplianceDtoSchema.describe("Customs compliance"), + ics2: UpdateShippingInstructionsIcs2DtoSchema.describe("ICS2"), + cargoIdentificationNumbers: + UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema.describe("Cargo identification numbers"), + cargo: z.array(UpdateShippingInstructionsCargoDtoSchema).readonly().describe("Cargo"), + freightCharges: UpdateFreightChargesDtoSchema, + shippersDeclaredValue: + UpdateShippingInstructionsShippersDeclaredValueDtoSchema.describe("Shipper's declared value"), + notificationEmails: UpdateShippingInstructionsNotificationEmailsDtoSchema.describe("Notification emails"), + }) + .readonly(); + export type UpdateShippingInstructionsRequestDto = z.infer; +} diff --git a/test/generated/dist/shippingInstructions/shippingInstructions.queries.ts b/test/generated/dist/shippingInstructions/shippingInstructions.queries.ts new file mode 100644 index 0000000..f8e3607 --- /dev/null +++ b/test/generated/dist/shippingInstructions/shippingInstructions.queries.ts @@ -0,0 +1,272 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ShippingInstructionsAcl } from "./shippingInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ShippingInstructionsModels } from "./shippingInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ShippingInstructionsApi } from "./shippingInstructions.api"; + +export namespace ShippingInstructionsQueries { + export const moduleName = QueryModule.ShippingInstructions; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string, id: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/shipping-instructions/:id", + officeId, + positionId, + id, + ] as const, + preview: (officeId: string, positionId: string, id: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/shipping-instructions/:id/preview", + officeId, + positionId, + id, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create shipping instructions + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId })); + return ShippingInstructionsApi.create(officeId, positionId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGet` + * @summary Get shipping instructions data + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { officeId, positionId, id }: { officeId: string; positionId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId, id), + queryFn: () => { + checkAcl(ShippingInstructionsAcl.canUseGet({ officeId })); + return ShippingInstructionsApi.get(officeId, positionId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update shipping instructions + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { ShippingInstructionsModels.UpdateShippingInstructionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Shipping instructions updated successfully + * @statusCodes [200, 401, 404] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof ShippingInstructionsApi.update, + { + officeId: string; + positionId: string; + id: string; + data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id, data }) => { + checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId })); + return ShippingInstructionsApi.update(officeId, positionId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, id } = variables; + const updateKeys = [keys.get(officeId, positionId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteOfficesPositionsShippingInstructionsById` + * @summary Delete shipping instructions + * @permission Requires `canUseDeleteOfficesPositionsShippingInstructionsById` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Shipping instructions deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteOfficesPositionsShippingInstructionsById = ( + options?: AppMutationOptions< + typeof ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById, + { officeId: string; positionId: string; id: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id }) => { + checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId })); + return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreview` - recommended when file should be cached + * @summary Preview shipping instructions document + * @permission Requires `canUsePreview` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreview = ( + { officeId, positionId, id }: { officeId: string; positionId: string; id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.preview(officeId, positionId, id), + queryFn: () => { + checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId })); + return ShippingInstructionsApi.preview(officeId, positionId, id, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewMutation` - recommended when file should not be cached + * @summary Preview shipping instructions document + * @permission Requires `canUsePreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewMutation = ( + options?: AppMutationOptions< + typeof ShippingInstructionsApi.preview, + { officeId: string; positionId: string; id: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id }) => { + checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId })); + return ShippingInstructionsApi.preview(officeId, positionId, id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, id } = variables; + const updateKeys = [keys.preview(officeId, positionId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerate` + * @summary Generate shipping instructions document + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerate = ( + options?: AppMutationOptions< + typeof ShippingInstructionsApi.generate, + { officeId: string; positionId: string; id: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id, data }) => { + checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId })); + return ShippingInstructionsApi.generate(officeId, positionId, id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/terminals/terminals.acl.ts b/test/generated/dist/terminals/terminals.acl.ts new file mode 100644 index 0000000..b7aa7d6 --- /dev/null +++ b/test/generated/dist/terminals/terminals.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace TerminalsAcl { + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Terminal"] as AbilityTuple<"Create", "Terminal">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; + + /** + * Use for `useGetById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ + export const canUseGetById = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Terminal"] as AbilityTuple<"Update", "Terminal">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "Terminal"] as AbilityTuple<"Archive", "Terminal">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Unarchive", "Terminal"] as AbilityTuple<"Unarchive", "Terminal">; +} diff --git a/test/generated/dist/terminals/terminals.api.ts b/test/generated/dist/terminals/terminals.api.ts new file mode 100644 index 0000000..08b98f1 --- /dev/null +++ b/test/generated/dist/terminals/terminals.api.ts @@ -0,0 +1,107 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { TerminalsModels } from "./terminals.models"; + +export namespace TerminalsApi { + export const create = (data: TerminalsModels.CreateTerminalRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals`, + ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), + config, + ); + }; + export const paginate = ( + limit: number, + order?: string, + filter?: TerminalsModels.TerminalPaginationFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, `/terminals`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: TerminalsModels.TerminalLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, + `/terminals/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const getById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: TerminalsModels.TerminalResponseDTOSchema }, `/terminals/${id}`, config); + }; + export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals/${id}`, + ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/terminals/${id}/archive`, undefined, config); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/terminals/${id}/unarchive`, undefined, config); + }; +} diff --git a/test/generated/dist/terminals/terminals.configs.ts b/test/generated/dist/terminals/terminals.configs.ts new file mode 100644 index 0000000..ee3eb18 --- /dev/null +++ b/test/generated/dist/terminals/terminals.configs.ts @@ -0,0 +1,145 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { TerminalsModels } from "./terminals.models"; +import { CommonModels } from "@/data/common/common.models"; +import { TerminalsQueries } from "./terminals.queries"; +import { TerminalsAcl } from "./terminals.acl"; + +export namespace TerminalsConfigs { + export const terminalsConfig = { + meta: { + title: "Terminals", + }, + readAll: { + acl: TerminalsAcl.canUsePaginate, + schema: TerminalsModels.TerminalResponseDTOSchema, + paginated: TerminalsQueries.usePaginate, + infinite: TerminalsQueries.usePaginateInfinite, + filters: { + schema: TerminalsModels.TerminalPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: TerminalsModels.TerminalPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + type: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: TerminalsModels.TerminalResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + name: true, + type: true, + airport: true, + port: true, + archived: true, + shortName: true, + address: true, + additionalInformation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: TerminalsModels.TerminalsPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: TerminalsAcl.canUseGetById, + schema: TerminalsModels.TerminalResponseDTOSchema, + query: TerminalsQueries.useGetById, + }, + create: { + acl: TerminalsAcl.canUseCreate, + schema: TerminalsModels.CreateTerminalRequestDTOSchema, + mutation: TerminalsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: TerminalsModels.CreateTerminalRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + type: true, + portId: true, + airportId: true, + street: true, + secondaryStreet: true, + zip: true, + district: true, + cityId: true, + countryId: true, + additionalInformation: true, + }, + }, + }), + }, + update: { + acl: TerminalsAcl.canUseUpdate, + schema: TerminalsModels.UpdateTerminalRequestDTOSchema, + mutation: TerminalsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: TerminalsModels.UpdateTerminalRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + type: true, + portId: true, + airportId: true, + street: true, + secondaryStreet: true, + zip: true, + district: true, + cityId: true, + countryId: true, + additionalInformation: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: TerminalsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: TerminalsQueries.usePaginateLabels, + infinite: TerminalsQueries.usePaginateLabelsInfinite, + filters: { + schema: TerminalsModels.TerminalLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: TerminalsModels.TerminalLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/terminals/terminals.models.ts b/test/generated/dist/terminals/terminals.models.ts new file mode 100644 index 0000000..56c6644 --- /dev/null +++ b/test/generated/dist/terminals/terminals.models.ts @@ -0,0 +1,294 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace TerminalsModels { + /** + * TerminalTypeSchema + * @type { enum } + */ + export const TerminalTypeSchema = z.enum(["port", "airport"]); + export type TerminalType = z.infer; + export const TerminalType = TerminalTypeSchema.enum; + + /** + * CreateTerminalRequestDTOSchema + * @type { object } + * @property { string } matchCode Unique identifier code for the terminal + * @property { string } shortName Optional short name for the terminal + * @property { string } name Full name of the terminal + * @property { TerminalType } type Type of the terminal + * @property { string } portId ID of associated port, required if type is port + * @property { string } airportId ID of associated airport, required if type is airport + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP / Postal code + * @property { string } district District + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } additionalInformation Additional information + */ + export const CreateTerminalRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Unique identifier code for the terminal"), + shortName: z.string().describe("Optional short name for the terminal").nullish(), + name: z.string().describe("Full name of the terminal"), + type: TerminalTypeSchema.describe("Type of the terminal"), + portId: z.string().describe("ID of associated port, required if type is port").nullish(), + airportId: z.string().describe("ID of associated airport, required if type is airport").nullish(), + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street").nullish(), + zip: z.string().describe("ZIP / Postal code"), + district: z.string().describe("District").nullish(), + cityId: z.string().describe("City id"), + countryId: z.string().describe("Country id"), + additionalInformation: z.string().describe("Additional information").nullish(), + }) + .readonly(); + export type CreateTerminalRequestDTO = z.infer; + + /** + * TerminalCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const TerminalCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type TerminalCityDto = z.infer; + + /** + * TerminalCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ + export const TerminalCountryDtoSchema = z + .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) + .readonly(); + export type TerminalCountryDto = z.infer; + + /** + * TerminalAddressDTOSchema + * @type { object } + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP/Postal code + * @property { TerminalCityDto } city + * @property { string } district District name + * @property { TerminalCountryDto } country + */ + export const TerminalAddressDTOSchema = z + .object({ + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street").nullish(), + zip: z.string().describe("ZIP/Postal code"), + city: TerminalCityDtoSchema.nullish(), + district: z.string().describe("District name").nullish(), + country: TerminalCountryDtoSchema.nullish(), + }) + .readonly(); + export type TerminalAddressDTO = z.infer; + + /** + * AirportReferenceDTOSchema + * @type { object } + * @property { string } id Unique identifier of the airport + * @property { string } name Name of the airport + */ + export const AirportReferenceDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the airport"), + name: z.string().describe("Name of the airport"), + }) + .readonly(); + export type AirportReferenceDTO = z.infer; + + /** + * PortReferenceDTOSchema + * @type { object } + * @property { string } id Unique identifier of the port + * @property { string } name Name of the port + */ + export const PortReferenceDTOSchema = z + .object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port") }) + .readonly(); + export type PortReferenceDTO = z.infer; + + /** + * TerminalEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type TerminalEmployeeDTO = z.infer; + + /** + * TerminalResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the terminal + * @property { string } matchCode Match code for the terminal + * @property { string } name Name of the terminal + * @property { TerminalType } type Type of the terminal + * @property { AirportReferenceDTO } airport Associated airport information if terminal type is airport + * @property { PortReferenceDTO } port Associated port information if terminal type is port + * @property { boolean } archived Archived status of the terminal + * @property { string } shortName Short name of the terminal + * @property { TerminalAddressDTO } address Address of the terminal + * @property { string } additionalInformation Additional information + * @property { string } createdById + * @property { TerminalEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { TerminalEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const TerminalResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the terminal"), + matchCode: z.string().describe("Match code for the terminal"), + name: z.string().describe("Name of the terminal"), + type: TerminalTypeSchema.describe("Type of the terminal").nullish(), + airport: AirportReferenceDTOSchema.describe( + "Associated airport information if terminal type is airport", + ).nullish(), + port: PortReferenceDTOSchema.describe("Associated port information if terminal type is port").nullish(), + archived: z.boolean().describe("Archived status of the terminal"), + shortName: z.string().describe("Short name of the terminal").nullish(), + address: TerminalAddressDTOSchema.describe("Address of the terminal").nullish(), + additionalInformation: z.string().describe("Additional information").nullish(), + createdById: z.string().nullish(), + createdBy: TerminalEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: TerminalEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type TerminalResponseDTO = z.infer; + + /** + * UpdateTerminalRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code for the terminal + * @property { string } shortName Updated short name + * @property { string } name Updated name + * @property { TerminalType } type Type of the terminal + * @property { string } portId ID of associated port, required if type is port + * @property { string } airportId ID of associated airport, required if type is airport + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP / Postal code + * @property { string } district District + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } additionalInformation Additional information + */ + export const UpdateTerminalRequestDTOSchema = z + .object({ + matchCode: z.string().describe("Updated match code for the terminal"), + shortName: z.string().describe("Updated short name"), + name: z.string().describe("Updated name"), + type: TerminalTypeSchema.describe("Type of the terminal"), + portId: z.string().describe("ID of associated port, required if type is port"), + airportId: z.string().describe("ID of associated airport, required if type is airport"), + street: z.string().describe("Street address"), + secondaryStreet: z.string().describe("Secondary street"), + zip: z.string().describe("ZIP / Postal code"), + district: z.string().describe("District"), + cityId: z.string().describe("City id"), + countryId: z.string().describe("Country id"), + additionalInformation: z.string().describe("Additional information"), + }) + .readonly(); + export type UpdateTerminalRequestDTO = z.infer; + + /** + * TerminalPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter terminals by matchCode, shortName, or name + * @property { boolean } archived + * @property { string } type + */ + export const TerminalPaginationFilterDtoSchema = z + .object({ + search: z.string().describe("Search term to filter terminals by matchCode, shortName, or name"), + archived: z.boolean(), + type: TerminalTypeSchema, + }) + .readonly(); + export type TerminalPaginationFilterDto = z.infer; + + /** + * TerminalLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const TerminalLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type TerminalLabelFilterDto = z.infer; + + /** + * TerminalsPaginateOrderParamEnumSchema + * @type { enum } + */ + export const TerminalsPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type TerminalsPaginateOrderParamEnum = z.infer; + export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSchema.enum; + + /** + * TerminalsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { TerminalResponseDTO[] } items + */ + export const TerminalsPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(TerminalResponseDTOSchema).readonly() }).readonly().shape, + }); + export type TerminalsPaginateResponse = z.infer; + + /** + * TerminalsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const TerminalsPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type TerminalsPaginateLabelsOrderParamEnum = z.infer; + export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrderParamEnumSchema.enum; + + /** + * TerminalsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const TerminalsPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type TerminalsPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/terminals/terminals.queries.ts b/test/generated/dist/terminals/terminals.queries.ts new file mode 100644 index 0000000..4de8274 --- /dev/null +++ b/test/generated/dist/terminals/terminals.queries.ts @@ -0,0 +1,358 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { TerminalsAcl } from "./terminals.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { TerminalsModels } from "./terminals.models"; +import { TerminalsApi } from "./terminals.api"; + +export namespace TerminalsQueries { + export const moduleName = QueryModule.Terminals; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: TerminalsModels.TerminalPaginationFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/terminals", limit, order, filter, page, cursor] as const, + paginateInfinite: ( + limit?: number, + order?: string, + filter?: TerminalsModels.TerminalPaginationFilterDto, + cursor?: string, + ) => [...keys.all, "/terminals", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: TerminalsModels.TerminalLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/terminals/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: TerminalsModels.TerminalLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/terminals/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getById: (id: string) => [...keys.all, "/terminals/:id", id] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a new terminal + * @permission Requires `canUseCreate` ability + * @param { TerminalsModels.CreateTerminalRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(TerminalsAcl.canUseCreate()); + return TerminalsApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Paginate Terminals + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: TerminalsModels.TerminalPaginationFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(TerminalsAcl.canUsePaginate()); + return TerminalsApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Paginate Terminals + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: TerminalsModels.TerminalPaginationFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(TerminalsAcl.canUsePaginate()); + return TerminalsApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate terminals with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: TerminalsModels.TerminalLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(TerminalsAcl.canUsePaginateLabels()); + return TerminalsApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate terminals with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: TerminalsModels.TerminalLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(TerminalsAcl.canUsePaginateLabels()); + return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useGetById` + * @summary Get terminal details by ID + * @permission Requires `canUseGetById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(id), + queryFn: () => { + checkAcl(TerminalsAcl.canUseGetById()); + return TerminalsApi.getById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update terminal details + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { TerminalsModels.UpdateTerminalRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof TerminalsApi.update, + { id: string; data: TerminalsModels.UpdateTerminalRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(TerminalsAcl.canUseUpdate()); + return TerminalsApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.getById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive a terminal + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(TerminalsAcl.canUseArchive()); + return TerminalsApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive a terminal + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(TerminalsAcl.canUseUnarchive()); + return TerminalsApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/useCrossTabQueryInvalidation.ts b/test/generated/dist/useCrossTabQueryInvalidation.ts new file mode 100644 index 0000000..d74d707 --- /dev/null +++ b/test/generated/dist/useCrossTabQueryInvalidation.ts @@ -0,0 +1,40 @@ +import type { QueryClient, QueryKey } from "@tanstack/react-query"; + +const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; + +/** + * Broadcasts a query invalidation event to all other open tabs via localStorage. + * + * @param queryKeys - An array of query keys to invalidate (array of arrays). + * + * NOTE: The `storage` event only fires in *other* tabs — the calling tab + * must invalidate its own queryClient separately if needed. + */ +export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { + localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); +}; + +/** + * Registers a one-time global `storage` event listener that reacts to + * cross-tab invalidation broadcasts. Safe to call from multiple hooks — + * only the first call sets up the listener. + */ +let isListenerSetUp = false; + +export const setupCrossTabListener = (queryClient: QueryClient) => { + if (isListenerSetUp) return; + isListenerSetUp = true; + + window.addEventListener("storage", (e: StorageEvent) => { + if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; + + try { + const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; + for (const queryKey of keys) { + queryClient.invalidateQueries({ queryKey }); + } + } catch { + // Ignore malformed payloads + } + }); +}; diff --git a/test/generated/dist/useMutationEffects.ts b/test/generated/dist/useMutationEffects.ts new file mode 100644 index 0000000..ed61406 --- /dev/null +++ b/test/generated/dist/useMutationEffects.ts @@ -0,0 +1,95 @@ +import { useCallback, useEffect } from "react"; + +import { QueryKey, useQueryClient } from "@tanstack/react-query"; +import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; +import { QueryModule } from "./queryModules"; +import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; + +export interface MutationEffectsOptions { + invalidateCurrentModule?: boolean; + crossTabInvalidation?: boolean; + invalidationMap?: InvalidationMap; + invalidateModules?: QueryModule[]; + invalidateKeys?: QueryKey[]; + preferUpdate?: boolean; +} + +export interface UseMutationEffectsProps { + currentModule: QueryModule; +} + +export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { + const queryClient = useQueryClient(); + const config = OpenApiQueryConfig.useConfig(); + + useEffect(() => { + if (!config.crossTabInvalidation) return; + setupCrossTabListener(queryClient); + }, [queryClient, config.crossTabInvalidation]); + + const runMutationEffects = useCallback( + async ( + data: TData, + variables: TVariables, + options: MutationEffectsOptions = {}, + updateKeys?: QueryKey[], + ) => { + const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; + const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; + const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; + + const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => + keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); + const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => + prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); + const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); + + const shouldInvalidateQuery = (queryKey: QueryKey) => { + const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); + if (shouldUpdate && isUpdateKey) { + return false; + } + + const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; + const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); + const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + const isMappedKey = + !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + + return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; + }; + + const invalidatedQueryKeys: QueryKey[] = []; + + queryClient.invalidateQueries({ + predicate: ({ queryKey }) => { + const shouldInvalidate = shouldInvalidateQuery(queryKey); + + if (shouldInvalidate && config.crossTabInvalidation) { + invalidatedQueryKeys.push([...queryKey]); + } + + return shouldInvalidate; + }, + }); + + if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { + broadcastQueryInvalidation(invalidatedQueryKeys); + } + + if (shouldUpdate && updateKeys) { + updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); + } + }, + [ + queryClient, + currentModule, + config.preferUpdate, + config.invalidateCurrentModule, + config.invalidationMap, + config.crossTabInvalidation, + ], + ); + + return { runMutationEffects }; +} diff --git a/test/generated/dist/userActivity/userActivity.api.ts b/test/generated/dist/userActivity/userActivity.api.ts new file mode 100644 index 0000000..94229d9 --- /dev/null +++ b/test/generated/dist/userActivity/userActivity.api.ts @@ -0,0 +1,30 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { UserActivityModels } from "./userActivity.models"; + +export namespace UserActivityApi { + export const get = ( + officeId: string, + entityType: string, + entityId: string, + activeThresholdMinutes?: number, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, + `/offices/${officeId}/${entityType}/${entityId}/activity`, + { + ...config, + params: { + activeThresholdMinutes: ZodExtended.parse( + z.number().gte(1).describe("Active threshold in minutes").nullish(), + activeThresholdMinutes, + { type: "query", name: "activeThresholdMinutes" }, + ), + }, + }, + ); + }; +} diff --git a/test/generated/dist/userActivity/userActivity.models.ts b/test/generated/dist/userActivity/userActivity.models.ts new file mode 100644 index 0000000..149f572 --- /dev/null +++ b/test/generated/dist/userActivity/userActivity.models.ts @@ -0,0 +1,91 @@ +import { z } from "zod"; + +export namespace UserActivityModels { + /** + * ActivityTypeEnumSchema + * @type { enum } + */ + export const ActivityTypeEnumSchema = z.enum(["View", "Modify"]); + export type ActivityTypeEnum = z.infer; + export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; + + /** + * UserSectionActivityDtoSchema + * @type { object } + * @property { string } section Section name + * @property { ActivityTypeEnum } activityType Type of activity + * @property { string } lastSeen Last seen timestamp + */ + export const UserSectionActivityDtoSchema = z + .object({ + section: z.string().describe("Section name"), + activityType: ActivityTypeEnumSchema.describe("Type of activity"), + lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), + }) + .readonly(); + export type UserSectionActivityDto = z.infer; + + /** + * ActiveUserDtoSchema + * @type { object } + * @property { string } userId User ID + * @property { string } firstName User first name + * @property { string } lastName User last name + * @property { string } userAvatar User avatar URL + * @property { UserSectionActivityDto } section User section activity + * @property { string } lastSeen Last seen timestamp + * @property { boolean } isCurrentlyActive Is currently active + */ + export const ActiveUserDtoSchema = z + .object({ + userId: z.string().describe("User ID"), + firstName: z.string().describe("User first name"), + lastName: z.string().describe("User last name"), + userAvatar: z.string().describe("User avatar URL").nullish(), + section: UserSectionActivityDtoSchema.describe("User section activity"), + lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), + isCurrentlyActive: z.boolean().describe("Is currently active"), + }) + .readonly(); + export type ActiveUserDto = z.infer; + + /** + * ActivityEntityTypeEnumSchema + * @type { enum } + */ + export const ActivityEntityTypeEnumSchema = z.enum(["Position", "Invoice", "BusinessPartner", "Quote"]); + export type ActivityEntityTypeEnum = z.infer; + export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; + + /** + * ActivityMetadataDtoSchema + * @type { object } + * @property { number } totalActiveUsers Total number of active users + * @property { string } entityId Entity ID + * @property { ActivityEntityTypeEnum } entityType Entity type + * @property { number } activeThresholdMinutes Active threshold in minutes + */ + export const ActivityMetadataDtoSchema = z + .object({ + totalActiveUsers: z.number().describe("Total number of active users"), + entityId: z.string().describe("Entity ID"), + entityType: ActivityEntityTypeEnumSchema.describe("Entity type"), + activeThresholdMinutes: z.number().describe("Active threshold in minutes"), + }) + .readonly(); + export type ActivityMetadataDto = z.infer; + + /** + * UserActivityResponseDtoSchema + * @type { object } + * @property { ActiveUserDto[] } activeUsers List of active users + * @property { ActivityMetadataDto } metadata Activity metadata + */ + export const UserActivityResponseDtoSchema = z + .object({ + activeUsers: z.array(ActiveUserDtoSchema).readonly().describe("List of active users"), + metadata: ActivityMetadataDtoSchema.describe("Activity metadata"), + }) + .readonly(); + export type UserActivityResponseDto = z.infer; +} diff --git a/test/generated/dist/userActivity/userActivity.queries.ts b/test/generated/dist/userActivity/userActivity.queries.ts new file mode 100644 index 0000000..89790ac --- /dev/null +++ b/test/generated/dist/userActivity/userActivity.queries.ts @@ -0,0 +1,50 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { UserActivityApi } from "./userActivity.api"; + +export namespace UserActivityQueries { + export const moduleName = QueryModule.UserActivity; + + export const keys = { + all: [moduleName] as const, + get: (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number) => + [ + ...keys.all, + "/offices/:officeId/:entityType/:entityId/activity", + officeId, + entityType, + entityId, + activeThresholdMinutes, + ] as const, + }; + + /** + * Query `useGet` + * @summary Get user activity for an entity + * @param { string } object.officeId Path parameter + * @param { string } object.entityType Path parameter + * @param { string } object.entityId Path parameter + * @param { number } object.activeThresholdMinutes Query parameter. Active threshold in minutes. Minimum: `1` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGet = ( + { + officeId, + entityType, + entityId, + activeThresholdMinutes, + }: { officeId: string; entityType: string; entityId: string; activeThresholdMinutes?: number }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + return useQuery({ + queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), + queryFn: () => UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes, config), + ...options, + }); + }; +} diff --git a/test/generated/dist/vatRules/vatRules.acl.ts b/test/generated/dist/vatRules/vatRules.acl.ts new file mode 100644 index 0000000..25b5cb3 --- /dev/null +++ b/test/generated/dist/vatRules/vatRules.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace VatRulesAcl { + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; + + /** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; + + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "VatRule"] as AbilityTuple<"Create", "VatRule">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; +} diff --git a/test/generated/dist/vatRules/vatRules.api.ts b/test/generated/dist/vatRules/vatRules.api.ts new file mode 100644 index 0000000..8533205 --- /dev/null +++ b/test/generated/dist/vatRules/vatRules.api.ts @@ -0,0 +1,117 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { VatRulesModels } from "./vatRules.models"; + +export namespace VatRulesApi { + export const paginateLabels = ( + limit: number, + order?: string, + filter?: VatRulesModels.VatRuleFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, + `/vat-rules/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const list = ( + limit: number, + order?: string, + filter?: VatRulesModels.VatRuleFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: VatRulesModels.VatRulesListResponseSchema }, `/vat-rules`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules`, + ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), + config, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: VatRulesModels.VatRuleResponseDTOSchema }, `/vat-rules/${id}`, config); + }; + export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}`, + ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}/archive`, + undefined, + config, + ); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}/unarchive`, + undefined, + config, + ); + }; +} diff --git a/test/generated/dist/vatRules/vatRules.configs.ts b/test/generated/dist/vatRules/vatRules.configs.ts new file mode 100644 index 0000000..b822df6 --- /dev/null +++ b/test/generated/dist/vatRules/vatRules.configs.ts @@ -0,0 +1,150 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { VatRulesModels } from "./vatRules.models"; +import { CommonModels } from "@/data/common/common.models"; +import { VatRulesQueries } from "./vatRules.queries"; +import { VatRulesAcl } from "./vatRules.acl"; + +export namespace VatRulesConfigs { + export const vatRulesConfig = { + meta: { + title: "Vat Rules", + }, + readAll: { + acl: VatRulesAcl.canUseList, + schema: VatRulesModels.VatRuleResponseDTOSchema, + paginated: VatRulesQueries.useList, + infinite: VatRulesQueries.useListInfinite, + filters: { + schema: VatRulesModels.VatRuleFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: VatRulesModels.VatRuleFilterDtoSchema, + options: { + inputs: { + matchcode: true, + name: true, + type: true, + officeId: true, + archived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: VatRulesModels.VatRuleResponseDTOSchema, + options: { + columns: { + id: true, + matchcode: true, + name: true, + vatPercentage: true, + vatNumber: true, + noTax: true, + type: true, + archived: true, + isReverseCharge: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + officeId: true, + office: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + sortable: VatRulesModels.VatRulesListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: VatRulesAcl.canUseFindById, + schema: VatRulesModels.VatRuleResponseDTOSchema, + query: VatRulesQueries.useFindById, + }, + create: { + acl: VatRulesAcl.canUseCreate, + schema: VatRulesModels.CreateVatRuleRequestDTOSchema, + mutation: VatRulesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: VatRulesModels.CreateVatRuleRequestDTOSchema, + options: { + inputs: { + matchcode: true, + name: true, + noTax: true, + vatPercentage: true, + vatNumber: true, + type: true, + officeId: true, + isReverseCharge: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + }, + }), + }, + update: { + acl: VatRulesAcl.canUseUpdate, + schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, + mutation: VatRulesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, + options: { + inputs: { + matchcode: true, + name: true, + noTax: true, + vatPercentage: true, + vatNumber: true, + type: true, + officeId: true, + isReverseCharge: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + }, + }), + }, + }; + + export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: VatRulesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: VatRulesQueries.usePaginateLabels, + infinite: VatRulesQueries.usePaginateLabelsInfinite, + filters: { + schema: VatRulesModels.VatRuleFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: VatRulesModels.VatRuleFilterDtoSchema, + options: { + inputs: { + matchcode: true, + name: true, + type: true, + officeId: true, + archived: true, + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/vatRules/vatRules.models.ts b/test/generated/dist/vatRules/vatRules.models.ts new file mode 100644 index 0000000..5ff8a61 --- /dev/null +++ b/test/generated/dist/vatRules/vatRules.models.ts @@ -0,0 +1,224 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace VatRulesModels { + /** + * VatRuleTypeEnumSchema + * @type { enum } + */ + export const VatRuleTypeEnumSchema = z.enum(["Outgoing", "Incoming"]); + export type VatRuleTypeEnum = z.infer; + export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; + + /** + * VatRuleFilterDtoSchema + * @type { object } + * @property { string } matchcode Matchcode to filter by + * @property { string } name Name to filter by + * @property { VatRuleTypeEnum } type + * @property { string } officeId Office ID to filter by + * @property { boolean } archived Filter by archived status + * @property { string } search Search to filter by + */ + export const VatRuleFilterDtoSchema = z + .object({ + matchcode: z.string().describe("Matchcode to filter by"), + name: z.string().describe("Name to filter by"), + type: VatRuleTypeEnumSchema, + officeId: z.string().describe("Office ID to filter by"), + archived: z.boolean().describe("Filter by archived status"), + search: z.string().describe("Search to filter by"), + }) + .readonly(); + export type VatRuleFilterDto = z.infer; + + /** + * VatRuleEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type VatRuleEmployeeDTO = z.infer; + + /** + * VatRuleOfficeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type VatRuleOfficeDTO = z.infer; + + /** + * VatRuleResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchcode + * @property { string } name + * @property { number } vatPercentage + * @property { number } vatNumber VAT rule reference number + * @property { boolean } noTax + * @property { VatRuleTypeEnum } type + * @property { boolean } archived + * @property { boolean } isReverseCharge + * @property { string } createdById + * @property { VatRuleEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { VatRuleEmployeeDTO } updatedBy + * @property { string } updatedAt + * @property { string } officeId + * @property { VatRuleOfficeDTO } office + * @property { string } bookkeepingId + * @property { string } bookkeepingTargetAccountNumber + */ + export const VatRuleResponseDTOSchema = z + .object({ + id: z.string(), + matchcode: z.string(), + name: z.string(), + vatPercentage: z.number(), + vatNumber: z.number().describe("VAT rule reference number").nullish(), + noTax: z.boolean().nullish(), + type: VatRuleTypeEnumSchema, + archived: z.boolean(), + isReverseCharge: z.boolean(), + createdById: z.string().nullish(), + createdBy: VatRuleEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: VatRuleEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + officeId: z.string(), + office: VatRuleOfficeDTOSchema.nullish(), + bookkeepingId: z.string().nullish(), + bookkeepingTargetAccountNumber: z.string().nullish(), + }) + .readonly(); + export type VatRuleResponseDTO = z.infer; + + /** + * CreateVatRuleRequestDTOSchema + * @type { object } + * @property { string } matchcode Unique matchcode for the VAT rule + * @property { string } name Name of the VAT rule + * @property { boolean } noTax + * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` + * @property { number } vatNumber VAT rule reference number + * @property { VatRuleTypeEnum } type Type of VAT rule + * @property { string } officeId Office ID + * @property { boolean } isReverseCharge Is reverse charge VAT rule + * @property { string } bookkeepingId Bookkeeping ID + * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number + */ + export const CreateVatRuleRequestDTOSchema = z + .object({ + matchcode: z.string().describe("Unique matchcode for the VAT rule"), + name: z.string().describe("Name of the VAT rule"), + noTax: z.boolean().nullish(), + vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), + vatNumber: z.number().describe("VAT rule reference number").nullish(), + type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), + officeId: z.string().describe("Office ID"), + isReverseCharge: z.boolean().describe("Is reverse charge VAT rule").nullish(), + bookkeepingId: z.string().describe("Bookkeeping ID").nullish(), + bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullish(), + }) + .readonly(); + export type CreateVatRuleRequestDTO = z.infer; + + /** + * UpdateVatRuleRequestDTOSchema + * @type { object } + * @property { string } matchcode Unique matchcode for the VAT rule + * @property { string } name Name of the VAT rule + * @property { boolean } noTax + * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` + * @property { number } vatNumber VAT rule reference number. Minimum: `0` + * @property { VatRuleTypeEnum } type Type of VAT rule + * @property { string } officeId Office ID + * @property { boolean } isReverseCharge Is reverse charge VAT rule + * @property { string } bookkeepingId Bookkeeping ID + * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number + */ + export const UpdateVatRuleRequestDTOSchema = z + .object({ + matchcode: z.string().describe("Unique matchcode for the VAT rule"), + name: z.string().describe("Name of the VAT rule"), + noTax: z.boolean(), + vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), + vatNumber: z.number().gte(0).describe("VAT rule reference number").nullable(), + type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), + officeId: z.string().describe("Office ID"), + isReverseCharge: z.boolean().describe("Is reverse charge VAT rule"), + bookkeepingId: z.string().describe("Bookkeeping ID").nullable(), + bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullable(), + }) + .readonly(); + export type UpdateVatRuleRequestDTO = z.infer; + + /** + * VatRulesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const VatRulesPaginateLabelsOrderParamEnumSchema = z.enum([ + "matchcode", + "name", + "type", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type VatRulesPaginateLabelsOrderParamEnum = z.infer; + export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * VatRulesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const VatRulesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type VatRulesPaginateLabelsResponse = z.infer; + + /** + * VatRulesListOrderParamEnumSchema + * @type { enum } + */ + export const VatRulesListOrderParamEnumSchema = z.enum([ + "matchcode", + "name", + "type", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type VatRulesListOrderParamEnum = z.infer; + export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; + + /** + * VatRulesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { VatRuleResponseDTO[] } items + */ + export const VatRulesListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(VatRuleResponseDTOSchema).readonly() }).readonly().shape, + }); + export type VatRulesListResponse = z.infer; +} diff --git a/test/generated/dist/vatRules/vatRules.queries.ts b/test/generated/dist/vatRules/vatRules.queries.ts new file mode 100644 index 0000000..e0654f3 --- /dev/null +++ b/test/generated/dist/vatRules/vatRules.queries.ts @@ -0,0 +1,341 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { VatRulesAcl } from "./vatRules.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { VatRulesModels } from "./vatRules.models"; +import { VatRulesApi } from "./vatRules.api"; + +export namespace VatRulesQueries { + export const moduleName = QueryModule.VatRules; + + export const keys = { + all: [moduleName] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: VatRulesModels.VatRuleFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/vat-rules/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: VatRulesModels.VatRuleFilterDto, + cursor?: string, + ) => [...keys.all, "/vat-rules/labels/paginate", "infinite", limit, order, filter, cursor] as const, + list: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => + [...keys.all, "/vat-rules", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => + [...keys.all, "/vat-rules", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/vat-rules/:id", id] as const, + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate VAT rule labels (id and matchcode only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(VatRulesAcl.canUsePaginateLabels()); + return VatRulesApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate VAT rule labels (id and matchcode only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(VatRulesAcl.canUsePaginateLabels()); + return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useList` + * @summary List VAT rules + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(VatRulesAcl.canUseList()); + return VatRulesApi.list(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List VAT rules + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(VatRulesAcl.canUseList()); + return VatRulesApi.list(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Mutation `useCreate` + * @summary Create a new VAT rule + * @permission Requires `canUseCreate` ability + * @param { VatRulesModels.CreateVatRuleRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(VatRulesAcl.canUseCreate()); + return VatRulesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useFindById` + * @summary Get VAT rule by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(VatRulesAcl.canUseFindById()); + return VatRulesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update VAT rule by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { VatRulesModels.UpdateVatRuleRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof VatRulesApi.update, + { id: string; data: VatRulesModels.UpdateVatRuleRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(VatRulesAcl.canUseUpdate()); + return VatRulesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive VAT rule + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(VatRulesAcl.canUseArchive()); + return VatRulesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive VAT rule + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(VatRulesAcl.canUseUnarchive()); + return VatRulesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/warehouses/warehouses.acl.ts b/test/generated/dist/warehouses/warehouses.acl.ts new file mode 100644 index 0000000..7465f13 --- /dev/null +++ b/test/generated/dist/warehouses/warehouses.acl.ts @@ -0,0 +1,45 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace WarehousesAcl { + /** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = () => ["Create", "Warehouse"] as AbilityTuple<"Create", "Warehouse">; + + /** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ + export const canUsePaginate = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; + + /** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ + export const canUsePaginateLabels = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; + + /** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; + + /** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ + export const canUseUpdate = () => ["Update", "Warehouse"] as AbilityTuple<"Update", "Warehouse">; + + /** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ + export const canUseArchive = () => ["Archive", "Warehouse"] as AbilityTuple<"Archive", "Warehouse">; + + /** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ + export const canUseUnarchive = () => ["Archive", "Warehouse"] as AbilityTuple<"Archive", "Warehouse">; +} diff --git a/test/generated/dist/warehouses/warehouses.api.ts b/test/generated/dist/warehouses/warehouses.api.ts new file mode 100644 index 0000000..0681bcb --- /dev/null +++ b/test/generated/dist/warehouses/warehouses.api.ts @@ -0,0 +1,107 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WarehousesModels } from "./warehouses.models"; + +export namespace WarehousesApi { + export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses`, + ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), + config, + ); + }; + export const paginate = ( + limit: number, + order?: string, + filter?: WarehousesModels.WarehouseFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get({ resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, `/warehouses`, { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }); + }; + export const paginateLabels = ( + limit: number, + order?: string, + filter?: WarehousesModels.WarehouseLabelFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, + `/warehouses/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get({ resSchema: WarehousesModels.WarehouseResponseDTOSchema }, `/warehouses/${id}`, config); + }; + export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses/${id}`, + ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), + config, + ); + }; + export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/warehouses/${id}/archive`, undefined, config); + }; + export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post({ resSchema: z.void() }, `/warehouses/${id}/unarchive`, undefined, config); + }; +} diff --git a/test/generated/dist/warehouses/warehouses.configs.ts b/test/generated/dist/warehouses/warehouses.configs.ts new file mode 100644 index 0000000..dfcf9ed --- /dev/null +++ b/test/generated/dist/warehouses/warehouses.configs.ts @@ -0,0 +1,140 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { WarehousesModels } from "./warehouses.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WarehousesQueries } from "./warehouses.queries"; +import { WarehousesAcl } from "./warehouses.acl"; + +export namespace WarehousesConfigs { + export const warehousesConfig = { + meta: { + title: "Warehouses", + }, + readAll: { + acl: WarehousesAcl.canUsePaginate, + schema: WarehousesModels.WarehouseResponseDTOSchema, + paginated: WarehousesQueries.usePaginate, + infinite: WarehousesQueries.usePaginateInfinite, + filters: { + schema: WarehousesModels.WarehouseFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WarehousesModels.WarehouseFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: WarehousesModels.WarehouseResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + city: true, + country: true, + district: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: WarehousesModels.WarehousesPaginateOrderParamEnumSchema, + }, + }), + }, + read: { + acl: WarehousesAcl.canUseFindById, + schema: WarehousesModels.WarehouseResponseDTOSchema, + query: WarehousesQueries.useFindById, + }, + create: { + acl: WarehousesAcl.canUseCreate, + schema: WarehousesModels.CreateWarehouseRequestDTOSchema, + mutation: WarehousesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: WarehousesModels.CreateWarehouseRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, + }), + }, + update: { + acl: WarehousesAcl.canUseUpdate, + schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, + mutation: WarehousesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, + }), + }, + }; + + export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: WarehousesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: WarehousesQueries.usePaginateLabels, + infinite: WarehousesQueries.usePaginateLabelsInfinite, + filters: { + schema: WarehousesModels.WarehouseLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WarehousesModels.WarehouseLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema, + }, + }), + }, + }; +} diff --git a/test/generated/dist/warehouses/warehouses.models.ts b/test/generated/dist/warehouses/warehouses.models.ts new file mode 100644 index 0000000..dfa717d --- /dev/null +++ b/test/generated/dist/warehouses/warehouses.models.ts @@ -0,0 +1,224 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WarehousesModels { + /** + * WarehouseCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type WarehouseCityDto = z.infer; + + /** + * WarehouseCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ + export const WarehouseCountryDtoSchema = z + .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) + .readonly(); + export type WarehouseCountryDto = z.infer; + + /** + * WarehouseEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type WarehouseEmployeeDTO = z.infer; + + /** + * WarehouseResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { WarehouseCityDto } city + * @property { WarehouseCountryDto } country + * @property { string } district + * @property { boolean } archived + * @property { string } createdById + * @property { WarehouseEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { WarehouseEmployeeDTO } updatedBy + * @property { string } updatedAt + */ + export const WarehouseResponseDTOSchema = z + .object({ + id: z.string(), + name: z.string().nullish(), + shortName: z.string().nullish(), + additionalInformation: z.string().nullish(), + matchCode: z.string(), + street: z.string().nullish(), + secondaryStreet: z.string().nullish(), + zip: z.string().nullish(), + city: WarehouseCityDtoSchema.nullish(), + country: WarehouseCountryDtoSchema.nullish(), + district: z.string().nullish(), + archived: z.boolean(), + createdById: z.string().nullish(), + createdBy: WarehouseEmployeeDTOSchema.nullish(), + createdAt: z.iso.datetime({ offset: true }), + updatedById: z.string().nullish(), + updatedBy: WarehouseEmployeeDTOSchema.nullish(), + updatedAt: z.iso.datetime({ offset: true }), + }) + .readonly(); + export type WarehouseResponseDTO = z.infer; + + /** + * CreateWarehouseRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } countryId + * @property { string } district + */ + export const CreateWarehouseRequestDTOSchema = z + .object({ + name: z.string().nullish(), + shortName: z.string().nullish(), + additionalInformation: z.string().nullish(), + matchCode: z.string(), + street: z.string().nullish(), + secondaryStreet: z.string().nullish(), + zip: z.string().nullish(), + cityId: z.string().nullish(), + countryId: z.string().nullish(), + district: z.string().nullish(), + }) + .readonly(); + export type CreateWarehouseRequestDTO = z.infer; + + /** + * WarehouseLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ + export const WarehouseLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); + export type WarehouseLabelFilterDto = z.infer; + + /** + * WarehouseFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived Filter by archived status + */ + export const WarehouseFilterDtoSchema = z + .object({ search: z.string(), archived: z.boolean().describe("Filter by archived status") }) + .readonly(); + export type WarehouseFilterDto = z.infer; + + /** + * UpdateWarehouseRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } countryId + * @property { string } district + */ + export const UpdateWarehouseRequestDTOSchema = z + .object({ + name: z.string(), + shortName: z.string(), + additionalInformation: z.string(), + matchCode: z.string(), + street: z.string(), + secondaryStreet: z.string(), + zip: z.string(), + cityId: z.string(), + countryId: z.string(), + district: z.string(), + }) + .readonly(); + export type UpdateWarehouseRequestDTO = z.infer; + + /** + * WarehousesPaginateOrderParamEnumSchema + * @type { enum } + */ + export const WarehousesPaginateOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type WarehousesPaginateOrderParamEnum = z.infer; + export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnumSchema.enum; + + /** + * WarehousesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { WarehouseResponseDTO[] } items + */ + export const WarehousesPaginateResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(WarehouseResponseDTOSchema).readonly() }).readonly().shape, + }); + export type WarehousesPaginateResponse = z.infer; + + /** + * WarehousesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ + export const WarehousesPaginateLabelsOrderParamEnumSchema = z.enum([ + "name", + "matchCode", + "shortName", + "createdAt", + "updatedAt", + "createdBy", + "updatedBy", + ]); + export type WarehousesPaginateLabelsOrderParamEnum = z.infer; + export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOrderParamEnumSchema.enum; + + /** + * WarehousesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ + export const WarehousesPaginateLabelsResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, + }); + export type WarehousesPaginateLabelsResponse = z.infer; +} diff --git a/test/generated/dist/warehouses/warehouses.queries.ts b/test/generated/dist/warehouses/warehouses.queries.ts new file mode 100644 index 0000000..9fc4da2 --- /dev/null +++ b/test/generated/dist/warehouses/warehouses.queries.ts @@ -0,0 +1,348 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WarehousesAcl } from "./warehouses.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WarehousesModels } from "./warehouses.models"; +import { WarehousesApi } from "./warehouses.api"; + +export namespace WarehousesQueries { + export const moduleName = QueryModule.Warehouses; + + export const keys = { + all: [moduleName] as const, + paginate: ( + limit?: number, + order?: string, + filter?: WarehousesModels.WarehouseFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/warehouses", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string) => + [...keys.all, "/warehouses", "infinite", limit, order, filter, cursor] as const, + paginateLabels: ( + limit?: number, + order?: string, + filter?: WarehousesModels.WarehouseLabelFilterDto, + page?: number, + cursor?: string, + ) => [...keys.all, "/warehouses/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: ( + limit?: number, + order?: string, + filter?: WarehousesModels.WarehouseLabelFilterDto, + cursor?: string, + ) => [...keys.all, "/warehouses/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/warehouses/:id", id] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create warehouse + * @permission Requires `canUseCreate` ability + * @param { WarehousesModels.CreateWarehouseRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(WarehousesAcl.canUseCreate()); + return WarehousesApi.create(data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePaginate` + * @summary Get paginated warehouses + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginate = ( + { + limit, + order, + filter, + page, + cursor, + }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseFilterDto; page?: number; cursor?: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WarehousesAcl.canUsePaginate()); + return WarehousesApi.paginate(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateInfinite + * @summary Get paginated warehouses + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WarehousesAcl.canUsePaginate()); + return WarehousesApi.paginate(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `usePaginateLabels` + * @summary Paginate warehouse labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabels = ( + { + limit, + order, + filter, + page, + cursor, + }: { + limit: number; + order?: string; + filter?: WarehousesModels.WarehouseLabelFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WarehousesAcl.canUsePaginateLabels()); + return WarehousesApi.paginateLabels(limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate warehouse labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const usePaginateLabelsInfinite = ( + { + limit, + order, + filter, + cursor, + }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseLabelFilterDto; cursor?: string }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WarehousesAcl.canUsePaginateLabels()); + return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get warehouse by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useFindById = ( + { id }: { id: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(WarehousesAcl.canUseFindById()); + return WarehousesApi.findById(id, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdate` + * @summary Update warehouse + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { WarehousesModels.UpdateWarehouseRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdate = ( + options?: AppMutationOptions< + typeof WarehousesApi.update, + { id: string; data: WarehousesModels.UpdateWarehouseRequestDTO } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(WarehousesAcl.canUseUpdate()); + return WarehousesApi.update(id, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useArchive` + * @summary Archive warehouse + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useArchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(WarehousesAcl.canUseArchive()); + return WarehousesApi.archive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useUnarchive` + * @summary Unarchive warehouse + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUnarchive = ( + options?: AppMutationOptions & MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(WarehousesAcl.canUseUnarchive()); + return WarehousesApi.unarchive(id, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/workingDocuments/workingDocuments.acl.ts b/test/generated/dist/workingDocuments/workingDocuments.acl.ts new file mode 100644 index 0000000..5ef0f52 --- /dev/null +++ b/test/generated/dist/workingDocuments/workingDocuments.acl.ts @@ -0,0 +1,27 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsAcl { + /** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List working documents + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ + export const canUseList = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument", object) : "WorkingDocument"] as AbilityTuple< + "Read", + "WorkingDocument" | (ForcedSubject<"WorkingDocument"> & { officeId: string }) + >; + + /** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get working document by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ + export const canUseFindById = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument", object) : "WorkingDocument"] as AbilityTuple< + "Read", + "WorkingDocument" | (ForcedSubject<"WorkingDocument"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocuments/workingDocuments.api.ts b/test/generated/dist/workingDocuments/workingDocuments.api.ts new file mode 100644 index 0000000..d8d9903 --- /dev/null +++ b/test/generated/dist/workingDocuments/workingDocuments.api.ts @@ -0,0 +1,56 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; + +export namespace WorkingDocumentsApi { + export const list = ( + positionId: string, + officeId: string, + limit: number, + order?: string, + filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, + page?: number, + cursor?: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, + `/offices/${officeId}/positions/${positionId}/working-documents`, + { + ...config, + params: { + order: ZodExtended.parse( + ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), + order, + { type: "query", name: "order" }, + ), + filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { + type: "query", + name: "filter", + }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { + type: "query", + name: "limit", + }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { + type: "query", + name: "page", + }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { + type: "query", + name: "cursor", + }), + }, + }, + ); + }; + export const findById = (positionId: string, id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, + config, + ); + }; +} diff --git a/test/generated/dist/workingDocuments/workingDocuments.configs.ts b/test/generated/dist/workingDocuments/workingDocuments.configs.ts new file mode 100644 index 0000000..041fdcc --- /dev/null +++ b/test/generated/dist/workingDocuments/workingDocuments.configs.ts @@ -0,0 +1,54 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; +import { WorkingDocumentsQueries } from "./workingDocuments.queries"; +import { WorkingDocumentsAcl } from "./workingDocuments.acl"; + +export namespace WorkingDocumentsConfigs { + export const workingDocumentsConfig = { + meta: { + title: "Working Documents", + }, + readAll: { + acl: WorkingDocumentsAcl.canUseList, + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + paginated: WorkingDocumentsQueries.useList, + infinite: WorkingDocumentsQueries.useListInfinite, + filters: { + schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, + options: { + inputs: { + search: true, + type: true, + }, + }, + }), + }, + columns: dynamicColumns({ + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + name: true, + nameSuffix: true, + type: true, + referenceTable: true, + referenceId: true, + createdById: true, + createdAt: true, + createdBy: true, + }, + sortable: WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema, + }, + }), + }, + read: { + acl: WorkingDocumentsAcl.canUseFindById, + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + query: WorkingDocumentsQueries.useFindById, + }, + }; +} diff --git a/test/generated/dist/workingDocuments/workingDocuments.models.ts b/test/generated/dist/workingDocuments/workingDocuments.models.ts new file mode 100644 index 0000000..5fc10dd --- /dev/null +++ b/test/generated/dist/workingDocuments/workingDocuments.models.ts @@ -0,0 +1,100 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsModels { + /** + * TypeEnumSchema + * @type { enum } + * @description Working document type + */ + export const TypeEnumSchema = z.enum([ + "export-declaration", + "house-bl", + "master-bl", + "house-awb", + "master-awb", + "bl-instructions", + "ams-instructions", + "cmr-form", + "fcr-form", + "isf-form", + "templated-document", + "shipping-instructions", + ]); + export type TypeEnum = z.infer; + export const TypeEnum = TypeEnumSchema.enum; + + /** + * WorkingDocumentCreatedByResponseDTOSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } name Employee name + */ + export const WorkingDocumentCreatedByResponseDTOSchema = z + .object({ id: z.string().describe("Employee ID"), name: z.string().describe("Employee name").nullable() }) + .readonly(); + export type WorkingDocumentCreatedByResponseDTO = z.infer; + + /** + * WorkingDocumentResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } positionId Position ID + * @property { string } name Working document name + * @property { string } nameSuffix Working document name suffix + * @property { string } type Working document type + * @property { string } referenceTable Reference table + * @property { string } referenceId Reference ID + * @property { string } createdById Created by + * @property { string } createdAt Created at + * @property { WorkingDocumentCreatedByResponseDTO } createdBy Created by + */ + export const WorkingDocumentResponseDTOSchema = z + .object({ + id: z.string(), + positionId: z.string().describe("Position ID"), + name: z.string().describe("Working document name"), + nameSuffix: z.string().describe("Working document name suffix").nullish(), + type: TypeEnumSchema.describe("Working document type"), + referenceTable: z.string().describe("Reference table"), + referenceId: z.string().describe("Reference ID"), + createdById: z.string().describe("Created by"), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + createdBy: WorkingDocumentCreatedByResponseDTOSchema.describe("Created by"), + }) + .readonly(); + export type WorkingDocumentResponseDTO = z.infer; + + /** + * WorkingDocumentFilterDtoSchema + * @type { object } + * @property { string } search + * @property { string } type + */ + export const WorkingDocumentFilterDtoSchema = z.object({ search: z.string(), type: z.string() }).readonly(); + export type WorkingDocumentFilterDto = z.infer; + + /** + * WorkingDocumentsListOrderParamEnumSchema + * @type { enum } + */ + export const WorkingDocumentsListOrderParamEnumSchema = z.enum(["NAME", "TYPE", "CREATED_AT", "UPDATED_AT"]); + export type WorkingDocumentsListOrderParamEnum = z.infer; + export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParamEnumSchema.enum; + + /** + * WorkingDocumentsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { WorkingDocumentResponseDTO[] } items + */ + export const WorkingDocumentsListResponseSchema = z.object({ + ...CommonModels.PaginationDtoSchema.shape, + ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).readonly() }).readonly().shape, + }); + export type WorkingDocumentsListResponse = z.infer; +} diff --git a/test/generated/dist/workingDocuments/workingDocuments.queries.ts b/test/generated/dist/workingDocuments/workingDocuments.queries.ts new file mode 100644 index 0000000..09fb3dc --- /dev/null +++ b/test/generated/dist/workingDocuments/workingDocuments.queries.ts @@ -0,0 +1,190 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsAcl } from "./workingDocuments.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; +import { WorkingDocumentsApi } from "./workingDocuments.api"; + +export namespace WorkingDocumentsQueries { + export const moduleName = QueryModule.WorkingDocuments; + + export const keys = { + all: [moduleName] as const, + list: ( + positionId: string, + officeId: string, + limit?: number, + order?: string, + filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, + page?: number, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/working-documents", + positionId, + officeId, + limit, + order, + filter, + page, + cursor, + ] as const, + listInfinite: ( + positionId: string, + officeId: string, + limit?: number, + order?: string, + filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, + cursor?: string, + ) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/working-documents", + "infinite", + positionId, + officeId, + limit, + order, + filter, + cursor, + ] as const, + findById: (positionId: string, id: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/working-documents/:id", + positionId, + id, + officeId, + ] as const, + }; + + /** + * Query `useList` + * @summary List working documents + * @permission Requires `canUseList` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` + * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useList = ( + { + positionId, + officeId, + limit, + order, + filter, + page, + cursor, + }: { + positionId: string; + officeId: string; + limit: number; + order?: string; + filter?: WorkingDocumentsModels.WorkingDocumentFilterDto; + page?: number; + cursor?: string; + }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WorkingDocumentsAcl.canUseList({ officeId })); + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor, config); + }, + ...options, + }); + }; + + /** + * Infinite query `useListInfinite + * @summary List working documents + * @permission Requires `canUseList` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` + * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ + export const useListInfinite = ( + { + positionId, + officeId, + limit, + order, + filter, + cursor, + }: { + positionId: string; + officeId: string; + limit: number; + order?: string; + filter?: WorkingDocumentsModels.WorkingDocumentFilterDto; + cursor?: string; + }, + options?: AppInfiniteQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WorkingDocumentsAcl.canUseList({ officeId })); + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor, config); + }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); + }; + + /** + * Query `useFindById` + * @summary Get working document by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ + export const useFindById = ( + { positionId, id, officeId }: { positionId: string; id: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(positionId, id, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId })); + return WorkingDocumentsApi.findById(positionId, id, officeId, config); + }, + ...options, + }); + }; +} diff --git a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts new file mode 100644 index 0000000..231e7ac --- /dev/null +++ b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts @@ -0,0 +1,93 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsAmsInstructionsAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Create", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Create", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGetAMSInstructionsData` query ability. For global ability, omit the object parameter. + * @description Read AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAMSInstructionsData` query + */ + export const canUseGetAMSInstructionsData = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; + + /** + * Use for `useUpdateAMSInstructionsData` mutation ability. For global ability, omit the object parameter. + * @description Update AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateAMSInstructionsData` mutation + */ + export const canUseUpdateAMSInstructionsData = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; + + /** + * Use for `useDeleteAMSInstructions` mutation ability. For global ability, omit the object parameter. + * @description Delete AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteAMSInstructions` mutation + */ + export const canUseDeleteAMSInstructions = (object?: { officeId: string }) => + [ + "Delete", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Delete", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; + + /** + * Use for `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation + */ + export const canUsePreviewAMSInstructions = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGenerateAMSInstructions` mutation ability. For global ability, omit the object parameter. + * @description Generate AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAMSInstructions` mutation + */ + export const canUseGenerateAMSInstructions = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts new file mode 100644 index 0000000..0d14f09 --- /dev/null +++ b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts @@ -0,0 +1,89 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsAmsInstructionsApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions`, + undefined, + config, + ); + }; + export const getAMSInstructionsData = ( + positionId: string, + amsInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + config, + ); + }; + export const updateAMSInstructionsData = ( + positionId: string, + amsInstructionsId: string, + officeId: string, + data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), + config, + ); + }; + export const deleteAMSInstructions = ( + positionId: string, + amsInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + undefined, + config, + ); + }; + export const previewAMSInstructions = ( + positionId: string, + amsInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generateAMSInstructions = ( + positionId: string, + amsInstructionsId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts new file mode 100644 index 0000000..f48fd4d --- /dev/null +++ b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts @@ -0,0 +1,245 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsAmsInstructionsModels { + /** + * AMSInstructionsDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ + export const AMSInstructionsDocumentPortResponseDTOSchema = z + .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) + .readonly(); + export type AMSInstructionsDocumentPortResponseDTO = z.infer; + + /** + * AMSInstructionsDocumentCityResponseDTOSchema + * @type { object } + * @property { string } id ID of the city + * @property { string } name Name of the city + */ + export const AMSInstructionsDocumentCityResponseDTOSchema = z + .object({ id: z.string().describe("ID of the city"), name: z.string().describe("Name of the city") }) + .readonly(); + export type AMSInstructionsDocumentCityResponseDTO = z.infer; + + /** + * AMSInstructionsDocumentSignedByResponseDTOSchema + * @type { object } + * @property { string } id ID of the employee + * @property { string } name Name of the employee + */ + export const AMSInstructionsDocumentSignedByResponseDTOSchema = z + .object({ id: z.string().describe("ID of the employee"), name: z.string().describe("Name of the employee") }) + .readonly(); + export type AMSInstructionsDocumentSignedByResponseDTO = z.infer< + typeof AMSInstructionsDocumentSignedByResponseDTOSchema + >; + + /** + * AMSInstructionsDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const AMSInstructionsDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer< + typeof AMSInstructionsDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * AMSInstructionsDocumentCargoDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { string } containerNumber Container number of the cargo + * @property { number } nrOfPackages Number of packages in the cargo + * @property { string } description Description of the cargo + * @property { number } weight Weight of the cargo + * @property { number } volume Volume of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + */ + export const AMSInstructionsDocumentCargoDTOSchema = z + .object({ + caseMarks: z.string().describe("Case marks of the cargo"), + containerNumber: z.string().describe("Container number of the cargo"), + nrOfPackages: z.number().describe("Number of packages in the cargo"), + description: z.string().describe("Description of the cargo"), + weight: z.number().describe("Weight of the cargo"), + volume: z.number().describe("Volume of the cargo"), + seal1: z.string().describe("Seal number 1 of the cargo"), + seal2: z.string().describe("Seal number 2 of the cargo"), + }) + .readonly(); + export type AMSInstructionsDocumentCargoDTO = z.infer; + + /** + * AMSInstructionsDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the AMS Instructions document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the AMS Instructions document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } date Date of the AMS Instructions document + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { CommonModels.EditorContentResponseDto } additionalAMSText Additional AMS text + * @property { string } principalName Principal name + * @property { string } blNumber Bill of lading number + * @property { string } vessel Vessel + * @property { AMSInstructionsDocumentPortResponseDTO } portOfLoading Port of loading + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfDelivery Port of delivery + * @property { AMSInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfIssue Place of issue + * @property { string } dateOfIssue Date of issue + * @property { AMSInstructionsDocumentSignedByResponseDTO } signedBy Signed by + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } deliveryBusinessPartner Delivery business partner + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfAcceptance Port of acceptance + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Also notify party + * @property { string } applyTo Apply to + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string[] } availableContainerNumbers Available container numbers + * @property { string[] } selectedContainerNumbers Selected container numbers + * @property { string[] } selectedContainerLabels Selected container labels + * @property { AMSInstructionsDocumentCargoDTO[] } cargo Cargo information + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + */ + export const AMSInstructionsDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the AMS Instructions document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference").nullish(), + name: z.string().describe("Name of the AMS Instructions document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document").nullish(), + direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), + transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), + versionNumber: z.number().describe("Version number of the document"), + additionalAMSText: CommonModels.EditorContentResponseDtoSchema.describe("Additional AMS text").nullish(), + principalName: z.string().describe("Principal name").nullish(), + blNumber: z.string().describe("Bill of lading number").nullish(), + vessel: z.string().describe("Vessel").nullish(), + portOfLoading: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of loading").nullish(), + placeOfDelivery: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of delivery").nullish(), + portOfDischarge: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), + placeOfIssue: AMSInstructionsDocumentCityResponseDTOSchema.describe("Place of issue").nullish(), + dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue").nullish(), + signedBy: AMSInstructionsDocumentSignedByResponseDTOSchema.describe("Signed by").nullish(), + deliveryBusinessPartner: + AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Delivery business partner").nullish(), + placeOfAcceptance: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of acceptance").nullish(), + consignee: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), + shipper: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), + notify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Notify party").nullish(), + alsoNotify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Also notify party").nullish(), + applyTo: z.string().describe("Apply to").nullish(), + suppressWeight: z.boolean().describe("Whether to suppress weight information").nullish(), + suppressMeasurement: z.boolean().describe("Whether to suppress measurement information").nullish(), + availableContainerNumbers: z.array(z.string()).readonly().describe("Available container numbers").nullish(), + selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers").nullish(), + selectedContainerLabels: z.array(z.string()).readonly().describe("Selected container labels").nullish(), + cargo: z.array(AMSInstructionsDocumentCargoDTOSchema).readonly().describe("Cargo information").nullish(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at").nullish(), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at").nullish(), + }) + .readonly(); + export type AMSInstructionsDocumentResponseDTO = z.infer; + + /** + * UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateAMSInstructionsDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { CommonModels.EditorContentUpdateDto } additionalAMSText Additional AMS text + * @property { string } principalName Principal name + * @property { string } blNumber Bill of lading number + * @property { string } vessel Vessel + * @property { string } portOfLoadingId Port of loading id + * @property { string } placeOfDeliveryId Place of delivery id + * @property { string } portOfDischargeId Port of discharge id + * @property { string } placeOfIssueId Place of issue + * @property { string } dateOfIssue Date of issue + * @property { string } signedById Signed by employee ID + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } deliveryBusinessPartner Delivery business partner + * @property { string } placeOfAcceptanceId Port of acceptance + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party + * @property { string } applyTo Apply to + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string[] } selectedContainerNumbers Selected container numbers + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { string } date Date of the AMS Instructions document + */ + export const UpdateAMSInstructionsDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Document name suffix"), + additionalAMSText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional AMS text"), + principalName: z.string().describe("Principal name"), + blNumber: z.string().describe("Bill of lading number"), + vessel: z.string().describe("Vessel"), + portOfLoadingId: z.string().describe("Port of loading id"), + placeOfDeliveryId: z.string().describe("Place of delivery id"), + portOfDischargeId: z.string().describe("Port of discharge id"), + placeOfIssueId: z.string().describe("Place of issue"), + dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue"), + signedById: z.string().describe("Signed by employee ID"), + deliveryBusinessPartner: + UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Delivery business partner"), + placeOfAcceptanceId: z.string().describe("Port of acceptance"), + consignee: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), + shipper: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), + notify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party"), + alsoNotify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party"), + applyTo: z.string().describe("Apply to"), + suppressWeight: z.boolean().describe("Whether to suppress weight information"), + suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), + selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document"), + }) + .readonly(); + export type UpdateAMSInstructionsDocumentRequestDTO = z.infer; +} diff --git a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts new file mode 100644 index 0000000..5337c6a --- /dev/null +++ b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts @@ -0,0 +1,312 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsAmsInstructionsAcl } from "./workingDocumentsAmsInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsAmsInstructionsApi } from "./workingDocumentsAmsInstructions.api"; + +export namespace WorkingDocumentsAmsInstructionsQueries { + export const moduleName = QueryModule.WorkingDocumentsAmsInstructions; + + export const keys = { + all: [moduleName] as const, + getAMSInstructionsData: (positionId: string, amsInstructionsId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId", + positionId, + amsInstructionsId, + officeId, + ] as const, + previewAMSInstructions: (positionId: string, amsInstructionsId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId/preview", + positionId, + amsInstructionsId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create an AMS Instructions document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof WorkingDocumentsAmsInstructionsApi.create, + { positionId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId })); + return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetAMSInstructionsData` + * @summary Get AMS Instructions document data + * @permission Requires `canUseGetAMSInstructionsData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.amsInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetAMSInstructionsData = ( + { positionId, amsInstructionsId, officeId }: { positionId: string; amsInstructionsId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId })); + return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData( + positionId, + amsInstructionsId, + officeId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateAMSInstructionsData` + * @summary Update AMS Instructions document data + * @permission Requires `canUseUpdateAMSInstructionsData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateAMSInstructionsData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData, + { + positionId: string; + amsInstructionsId: string; + officeId: string; + data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId })); + return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData( + positionId, + amsInstructionsId, + officeId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, amsInstructionsId, officeId } = variables; + const updateKeys = [keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteAMSInstructions` + * @summary Delete AMS Instructions document + * @permission Requires `canUseDeleteAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } AMS Instructions document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteAMSInstructions = ( + options?: AppMutationOptions< + typeof WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions, + { positionId: string; amsInstructionsId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId })); + return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions( + positionId, + amsInstructionsId, + officeId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewAMSInstructions` - recommended when file should be cached + * @summary Preview AMS Instructions document + * @permission Requires `canUsePreviewAMSInstructions` ability + * @param { string } object.positionId Path parameter + * @param { string } object.amsInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewAMSInstructions = ( + { positionId, amsInstructionsId, officeId }: { positionId: string; amsInstructionsId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId })); + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions( + positionId, + amsInstructionsId, + officeId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewAMSInstructionsMutation` - recommended when file should not be cached + * @summary Preview AMS Instructions document + * @permission Requires `canUsePreviewAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewAMSInstructionsMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsAmsInstructionsApi.previewAMSInstructions, + { positionId: string; amsInstructionsId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId })); + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions( + positionId, + amsInstructionsId, + officeId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, amsInstructionsId, officeId } = variables; + const updateKeys = [keys.previewAMSInstructions(positionId, amsInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateAMSInstructions` + * @summary Generate AMS Instructions document + * @permission Requires `canUseGenerateAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateAMSInstructions = ( + options?: AppMutationOptions< + typeof WorkingDocumentsAmsInstructionsApi.generateAMSInstructions, + { + positionId: string; + amsInstructionsId: string; + officeId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId })); + return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions( + positionId, + amsInstructionsId, + officeId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts new file mode 100644 index 0000000..11d2d8f --- /dev/null +++ b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts @@ -0,0 +1,108 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsBlInstructionsAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Create", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Create", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGetBlInstructionsData` query ability. For global ability, omit the object parameter. + * @description Read BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBlInstructionsData` query + */ + export const canUseGetBlInstructionsData = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useUpdateBlInstructionsData` mutation ability. For global ability, omit the object parameter. + * @description Update BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBlInstructionsData` mutation + */ + export const canUseUpdateBlInstructionsData = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useDeleteBlInstructions` mutation ability. For global ability, omit the object parameter. + * @description Delete BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBlInstructions` mutation + */ + export const canUseDeleteBlInstructions = (object?: { officeId: string }) => + [ + "Delete", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Delete", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation + */ + export const canUsePreviewBlInstructions = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Read", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGenerateBlInstructions` mutation ability. For global ability, omit the object parameter. + * @description Generate BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateBlInstructions` mutation + */ + export const canUseGenerateBlInstructions = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; + + /** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate BL Instructions document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ + export const canUseGenerateDocumentEml = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", + ] as AbilityTuple< + "Update", + "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts new file mode 100644 index 0000000..b212601 --- /dev/null +++ b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts @@ -0,0 +1,110 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsBlInstructionsApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions`, + undefined, + config, + ); + }; + export const getBlInstructionsData = ( + positionId: string, + blInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + config, + ); + }; + export const updateBlInstructionsData = ( + positionId: string, + blInstructionsId: string, + officeId: string, + data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), + config, + ); + }; + export const deleteBlInstructions = ( + positionId: string, + blInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + undefined, + config, + ); + }; + export const previewBlInstructions = ( + positionId: string, + blInstructionsId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generateBlInstructions = ( + positionId: string, + blInstructionsId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; + export const generateDocumentEml = ( + positionId: string, + blInstructionsId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts new file mode 100644 index 0000000..f1fe31c --- /dev/null +++ b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts @@ -0,0 +1,472 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsBlInstructionsModels { + /** + * BlInstructionsDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { string } date Date + * @property { string } location Location + * @property { string } signer Siger + */ + export const BlInstructionsDocumentSettingsDtoDTOSchema = z + .object({ + quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), + date: z.iso.datetime({ offset: true }).describe("Date"), + location: z.string().describe("Location"), + signer: z.string().describe("Siger"), + }) + .readonly(); + export type BlInstructionsDocumentSettingsDtoDTO = z.infer; + + /** + * BlInstructionsDocumentCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ + export const BlInstructionsDocumentCountryResponseDTOSchema = z + .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) + .readonly(); + export type BlInstructionsDocumentCountryResponseDTO = z.infer; + + /** + * BlInstructionsDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + * @property { string } eori EORI number of the business partner + * @property { string } vatNumber VAT number of the business partner + */ + export const BlInstructionsDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + eori: z.string().describe("EORI number of the business partner"), + vatNumber: z.string().describe("VAT number of the business partner"), + }) + .readonly(); + export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer< + typeof BlInstructionsDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * BlInstructionsDocumentPlaceResponseDTOSchema + * @type { object } + * @property { string } id ID of the place + * @property { string } name Name of the place + */ + export const BlInstructionsDocumentPlaceResponseDTOSchema = z + .object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }) + .readonly(); + export type BlInstructionsDocumentPlaceResponseDTO = z.infer; + + /** + * AllChargesEnumSchema + * @type { enum } + */ + export const AllChargesEnumSchema = z.enum(["Prepaid", "Collect", "Automatic", "Detailed"]); + export type AllChargesEnum = z.infer; + export const AllChargesEnum = AllChargesEnumSchema.enum; + + /** + * BlInstructionsDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + * @property { string } countryCode Country ISO2 code of the port + */ + export const BlInstructionsDocumentPortResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the port"), + name: z.string().describe("Name of the port"), + countryCode: z.string().describe("Country ISO2 code of the port"), + }) + .readonly(); + export type BlInstructionsDocumentPortResponseDTO = z.infer; + + /** + * RequestedDocumentTypeEnumSchema + * @type { enum } + */ + export const RequestedDocumentTypeEnumSchema = z.enum(["SeawayBill", "Original"]); + export type RequestedDocumentTypeEnum = z.infer; + export const RequestedDocumentTypeEnum = RequestedDocumentTypeEnumSchema.enum; + + /** + * ManifestFilerStatusEnumSchema + * @type { enum } + */ + export const ManifestFilerStatusEnumSchema = z.enum(["Self", "Carrier"]); + export type ManifestFilerStatusEnum = z.infer; + export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; + + /** + * BlInstructionsDocumentCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ + export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); + export type BlInstructionsDocumentCountryDto = z.infer; + + /** + * BlInstructionsDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the BL Instructions document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the BL Instructions document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } date Date of the BL Instructions document + * @property { string } blNumber Bill of lading number + * @property { string } exportReference Export reference number + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { BlInstructionsDocumentCountryResponseDTO } originCountry Origin country + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } additionalText Additional text for the document + * @property { number } versionNumber Version number of the document + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } buyer Buyer information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } seller Seller information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } forwarder Forwarder party information + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information + * @property { BlInstructionsDocumentPlaceResponseDTO } stowedIntoContainerCity Stowed into container city information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfAcceptanceCity Place of acceptance city information + * @property { BlInstructionsDocumentPlaceResponseDTO } originalsToBeReleasedAt + * @property { string } originalsToBeReleasedAtText + * @property { BlInstructionsDocumentPlaceResponseDTO } loadingPierTerminal + * @property { string } loadingPierTerminalText + * @property { string } precarriageByText + * @property { string } placeOfReceiptText + * @property { string } portOfLoadingText + * @property { string } portOfDischargeText + * @property { string } placeOfDeliveryText + * @property { string } vessel Name of the vessel + * @property { string } voyage Name of the vessel + * @property { CommonModels.MovementTypeEnum } movementType + * @property { string } carrierBookingNumber + * @property { string } csnNumber + * @property { string } mcinNumber + * @property { string } pcinNumber + * @property { string } dueNumber + * @property { boolean } goodsDeliveredInEu + * @property { string } rucNumber + * @property { number } shipmentDeclaredValue + * @property { string } shipmentDeclaredValueCurrency + * @property { AllChargesEnum } allCharges Base freight payment term + * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term + * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term + * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term + * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term + * @property { string } shippingInstructionsComments Free-text shipping instructions comments + * @property { string } chargePayerId Charge payer business partner ID + * @property { string } chargePayLocationId Charge pay location ID + * @property { BlInstructionsDocumentPortResponseDTO } portOfLoading Port of loading information + * @property { BlInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information + * @property { BlInstructionsDocumentSettingsDtoDTO } settings Settings for the BL Instructions document + * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data + * @property { CommonModels.CargoTableBlockDto } cargo Cargo table block (identical to House BL cargo) + * @property { string } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document + * @property { RequestedDocumentTypeEnum } requestedDocumentType + * @property { boolean } requestedDocumentFreighted + * @property { number } requestedDocumentQuantity + * @property { ManifestFilerStatusEnum } manifestFilerStatus + * @property { string } manifestFilerIdentifier + * @property { BlInstructionsDocumentCountryDto } manifestFilingCountry + */ + export const BlInstructionsDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the BL Instructions document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference").nullish(), + name: z.string().describe("Name of the BL Instructions document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document").nullish(), + blNumber: z.string().describe("Bill of lading number").nullish(), + exportReference: z.string().describe("Export reference number").nullish(), + direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), + transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), + originCountry: BlInstructionsDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), + useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), + additionalText: z.string().describe("Additional text for the document").nullish(), + versionNumber: z.number().describe("Version number of the document"), + buyer: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( + "Buyer information for the shipment", + ).nullish(), + seller: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( + "Seller information for the shipment", + ).nullish(), + consignee: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( + "Consignee information for the shipment", + ), + shipper: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), + notify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( + "Notify party information for the shipment", + ), + alsoNotify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( + "Additional notify party information", + ), + forwarder: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Forwarder party information"), + precarriageBy: + BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), + placeOfReceipt: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), + stowedIntoContainerCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe( + "Stowed into container city information", + ).nullish(), + placeOfAcceptanceCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe( + "Place of acceptance city information", + ).nullish(), + originalsToBeReleasedAt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), + originalsToBeReleasedAtText: z.string().nullish(), + loadingPierTerminal: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), + loadingPierTerminalText: z.string().nullish(), + precarriageByText: z.string().nullish(), + placeOfReceiptText: z.string().nullish(), + portOfLoadingText: z.string().nullish(), + portOfDischargeText: z.string().nullish(), + placeOfDeliveryText: z.string().nullish(), + vessel: z.string().describe("Name of the vessel").nullish(), + voyage: z.string().describe("Name of the vessel").nullish(), + movementType: CommonModels.MovementTypeEnumSchema.nullish(), + carrierBookingNumber: z.string().nullish(), + csnNumber: z.string().nullish(), + mcinNumber: z.string().nullish(), + pcinNumber: z.string().nullish(), + dueNumber: z.string().nullish(), + goodsDeliveredInEu: z.boolean().nullish(), + rucNumber: z.string().nullish(), + shipmentDeclaredValue: z.number().nullish(), + shipmentDeclaredValueCurrency: z.string().nullish(), + allCharges: AllChargesEnumSchema.describe("Base freight payment term").nullish(), + baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term").nullish(), + additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term").nullish(), + originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( + "Origin haulage charges payment term", + ).nullish(), + originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term").nullish(), + destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe( + "Destination port charges payment term", + ).nullish(), + destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( + "Destination haulage charges payment term", + ).nullish(), + shippingInstructionsComments: z.string().describe("Free-text shipping instructions comments").nullish(), + chargePayerId: z.string().describe("Charge payer business partner ID").nullish(), + chargePayLocationId: z.string().describe("Charge pay location ID").nullish(), + portOfLoading: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), + portOfDischarge: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), + placeOfDelivery: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), + settings: BlInstructionsDocumentSettingsDtoDTOSchema.describe( + "Settings for the BL Instructions document", + ).nullish(), + data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), + cargo: CommonModels.CargoTableBlockDtoSchema.describe( + "Cargo table block (identical to House BL cargo)", + ).nullish(), + bodyRemarks: z.string().describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document"), + requestedDocumentType: RequestedDocumentTypeEnumSchema.nullish(), + requestedDocumentFreighted: z.boolean().nullish(), + requestedDocumentQuantity: z.number().nullish(), + manifestFilerStatus: ManifestFilerStatusEnumSchema.nullish(), + manifestFilerIdentifier: z.string().nullish(), + manifestFilingCountry: BlInstructionsDocumentCountryDtoSchema.nullish(), + }) + .readonly(); + export type BlInstructionsDocumentResponseDTO = z.infer; + + /** + * UpdateBlInstructionsDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { string } blNumber BL number + * @property { string } exportReference Export reference number + * @property { string } location Location + * @property { string } signer Signer + * @property { string } date Date + */ + export const UpdateBlInstructionsDocumentSettingsRequestDTOSchema = z + .object({ + quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), + blNumber: z.string().describe("BL number"), + exportReference: z.string().describe("Export reference number"), + location: z.string().describe("Location"), + signer: z.string().describe("Signer"), + date: z.iso.datetime({ offset: true }).describe("Date"), + }) + .readonly(); + export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer< + typeof UpdateBlInstructionsDocumentSettingsRequestDTOSchema + >; + + /** + * UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateBlInstructionsDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } blNumber Bill of lading number + * @property { string } exportReference Export reference number + * @property { string } csnNumber + * @property { string } mcinNumber + * @property { string } pcinNumber + * @property { string } dueNumber + * @property { boolean } goodsDeliveredInEu + * @property { string } rucNumber + * @property { string } shipmentDeclaredValueCurrency + * @property { number } shipmentDeclaredValue + * @property { AllChargesEnum } allCharges All charges payment term + * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term + * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term + * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term + * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term + * @property { string } originCountryId Origin country ID + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } additionalText Additional text + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } buyer Buyer information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } seller Seller information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } forwarder Forwarder information + * @property { string } originalsToBeReleasedAtId Originals to be released at ID + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information + * @property { string } shippingInstructionsComments Shipping instructions free-text comments + * @property { string } chargePayerId Charge payer business partner ID + * @property { string } chargePayLocationId Charge pay location ID + * @property { string } precarriageById Pre-carriage by ID + * @property { string } placeOfReceiptId Place of receipt ID + * @property { string } stowedIntoContainerCityId Stowed into container city ID + * @property { string } loadingPierTerminalId Loading pier/terminal ID + * @property { string } loadingPierTerminalText + * @property { string } placeOfAcceptanceCityId Place of acceptance city ID + * @property { string } vessel Vessel name + * @property { string } voyage Vessel name + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } portOfLoadingId Port of loading ID + * @property { string } portOfDischargeId Port of discharge ID + * @property { string } placeOfDeliveryId Place of delivery ID + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { string } date Date of the BL Instructions document + * @property { UpdateBlInstructionsDocumentSettingsRequestDTO } settings Settings + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data + * @property { RequestedDocumentTypeEnum } requestedDocumentType + * @property { boolean } requestedDocumentFreighted + * @property { number } requestedDocumentQuantity + * @property { string } precarriageByText + * @property { string } placeOfReceiptText + * @property { string } portOfLoadingText + * @property { string } portOfDischargeText + * @property { string } placeOfDeliveryText + * @property { ManifestFilerStatusEnum } manifestFilerStatus + * @property { string } manifestFilingCountryId + * @property { string } manifestFilerIdentifier + */ + export const UpdateBlInstructionsDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Document name suffix"), + blNumber: z.string().describe("Bill of lading number"), + exportReference: z.string().describe("Export reference number"), + csnNumber: z.string(), + mcinNumber: z.string(), + pcinNumber: z.string(), + dueNumber: z.string(), + goodsDeliveredInEu: z.boolean(), + rucNumber: z.string(), + shipmentDeclaredValueCurrency: z.string(), + shipmentDeclaredValue: z.number(), + allCharges: AllChargesEnumSchema.describe("All charges payment term"), + baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term"), + additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term"), + originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin haulage charges payment term"), + originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term"), + destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination port charges payment term"), + destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( + "Destination haulage charges payment term", + ), + originCountryId: z.string().describe("Origin country ID"), + useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), + additionalText: z.string().describe("Additional text"), + consignee: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), + shipper: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), + buyer: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), + seller: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), + forwarder: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), + originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), + originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), + notify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), + alsoNotify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), + shippingInstructionsComments: z.string().describe("Shipping instructions free-text comments"), + chargePayerId: z.string().describe("Charge payer business partner ID"), + chargePayLocationId: z.string().describe("Charge pay location ID"), + precarriageById: z.string().describe("Pre-carriage by ID"), + placeOfReceiptId: z.string().describe("Place of receipt ID"), + stowedIntoContainerCityId: z.string().describe("Stowed into container city ID"), + loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), + loadingPierTerminalText: z.string(), + placeOfAcceptanceCityId: z.string().describe("Place of acceptance city ID"), + vessel: z.string().describe("Vessel name"), + voyage: z.string().describe("Vessel name"), + carrierBookingNumber: z.string().describe("Carrier booking number"), + portOfLoadingId: z.string().describe("Port of loading ID"), + portOfDischargeId: z.string().describe("Port of discharge ID"), + placeOfDeliveryId: z.string().describe("Place of delivery ID"), + suppressWeight: z.boolean().describe("Whether to suppress weight information"), + suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), + bodyRemarks: z.string().describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document"), + settings: UpdateBlInstructionsDocumentSettingsRequestDTOSchema.describe("Settings"), + data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), + requestedDocumentType: RequestedDocumentTypeEnumSchema, + requestedDocumentFreighted: z.boolean(), + requestedDocumentQuantity: z.number(), + precarriageByText: z.string(), + placeOfReceiptText: z.string(), + portOfLoadingText: z.string(), + portOfDischargeText: z.string(), + placeOfDeliveryText: z.string(), + manifestFilerStatus: ManifestFilerStatusEnumSchema, + manifestFilingCountryId: z.string(), + manifestFilerIdentifier: z.string(), + }) + .readonly(); + export type UpdateBlInstructionsDocumentRequestDTO = z.infer; +} diff --git a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts new file mode 100644 index 0000000..9736675 --- /dev/null +++ b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts @@ -0,0 +1,341 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsBlInstructionsAcl } from "./workingDocumentsBlInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsBlInstructionsApi } from "./workingDocumentsBlInstructions.api"; + +export namespace WorkingDocumentsBlInstructionsQueries { + export const moduleName = QueryModule.WorkingDocumentsBlInstructions; + + export const keys = { + all: [moduleName] as const, + getBlInstructionsData: (positionId: string, blInstructionsId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId", + positionId, + blInstructionsId, + officeId, + ] as const, + previewBlInstructions: (positionId: string, blInstructionsId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId/preview", + positionId, + blInstructionsId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a BL Instructions document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.create, + { positionId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId })); + return WorkingDocumentsBlInstructionsApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetBlInstructionsData` + * @summary Get BL Instructions document data + * @permission Requires `canUseGetBlInstructionsData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.blInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetBlInstructionsData = ( + { positionId, blInstructionsId, officeId }: { positionId: string; blInstructionsId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId })); + return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateBlInstructionsData` + * @summary Update BL Instructions document data + * @permission Requires `canUseUpdateBlInstructionsData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateBlInstructionsData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.updateBlInstructionsData, + { + positionId: string; + blInstructionsId: string; + officeId: string; + data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId })); + return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData( + positionId, + blInstructionsId, + officeId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.getBlInstructionsData(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteBlInstructions` + * @summary Delete BL Instructions document + * @permission Requires `canUseDeleteBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } BL Instructions document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteBlInstructions = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.deleteBlInstructions, + { positionId: string; blInstructionsId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId })); + return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewBlInstructions` - recommended when file should be cached + * @summary Preview BL Instructions document + * @permission Requires `canUsePreviewBlInstructions` ability + * @param { string } object.positionId Path parameter + * @param { string } object.blInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewBlInstructions = ( + { positionId, blInstructionsId, officeId }: { positionId: string; blInstructionsId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId })); + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewBlInstructionsMutation` - recommended when file should not be cached + * @summary Preview BL Instructions document + * @permission Requires `canUsePreviewBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewBlInstructionsMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.previewBlInstructions, + { positionId: string; blInstructionsId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId })); + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateBlInstructions` + * @summary Generate BL Instructions document + * @permission Requires `canUseGenerateBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateBlInstructions = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.generateBlInstructions, + { + positionId: string; + blInstructionsId: string; + officeId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId })); + return WorkingDocumentsBlInstructionsApi.generateBlInstructions( + positionId, + blInstructionsId, + officeId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate BL Instructions document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGenerateDocumentEml = ( + options?: AppMutationOptions< + typeof WorkingDocumentsBlInstructionsApi.generateDocumentEml, + { + positionId: string; + blInstructionsId: string; + officeId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId })); + return WorkingDocumentsBlInstructionsApi.generateDocumentEml( + positionId, + blInstructionsId, + officeId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts new file mode 100644 index 0000000..2e1de75 --- /dev/null +++ b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsCmrFormAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Create", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; + + /** + * Use for `useGetCmrData` query ability. For global ability, omit the object parameter. + * @description Read CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCmrData` query + */ + export const canUseGetCmrData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Read", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; + + /** + * Use for `useUpdateCmrData` mutation ability. For global ability, omit the object parameter. + * @description Update CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCmrData` mutation + */ + export const canUseUpdateCmrData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Update", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; + + /** + * Use for `useDeleteCmr` mutation ability. For global ability, omit the object parameter. + * @description Delete CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCmr` mutation + */ + export const canUseDeleteCmr = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Delete", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; + + /** + * Use for `usePreviewCmr` query or `usePreviewCmrMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewCmr` query or `usePreviewCmrMutation` mutation + */ + export const canUsePreviewCmr = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Read", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; + + /** + * Use for `useGenerateCmr` mutation ability. For global ability, omit the object parameter. + * @description Generate CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateCmr` mutation + */ + export const canUseGenerateCmr = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< + "Update", + "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts new file mode 100644 index 0000000..9300c74 --- /dev/null +++ b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts @@ -0,0 +1,74 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsCmrFormApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs`, + undefined, + config, + ); + }; + export const getCmrData = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + config, + ); + }; + export const updateCmrData = ( + positionId: string, + cmrId: string, + officeId: string, + data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), + config, + ); + }; + export const deleteCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + undefined, + config, + ); + }; + export const previewCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generateCmr = ( + positionId: string, + cmrId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts new file mode 100644 index 0000000..4cc9266 --- /dev/null +++ b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts @@ -0,0 +1,320 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsCmrFormModels { + /** + * CmrDocumentLanguageSchema + * @type { enum } + */ + export const CmrDocumentLanguageSchema = z.enum(["en", "fr", "de"]); + export type CmrDocumentLanguage = z.infer; + export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; + + /** + * CmrDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CmrDocumentLanguage } primaryLanguage Primary language + * @property { CmrDocumentLanguage } secondaryLanguage Secondary language + */ + export const CmrDocumentSettingsDtoDTOSchema = z + .object({ + primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), + secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language"), + }) + .readonly(); + export type CmrDocumentSettingsDtoDTO = z.infer; + + /** + * CmrDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const CmrDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type CmrDocumentBusinessPartnerResponseDTO = z.infer; + + /** + * CmrDocumentCityResponseDTOSchema + * @type { object } + * @property { string } cityId ID of the city + * @property { string } cityName Name of the city + * @property { string } date Date of delivery/takeover + * @property { string } countryName Country name + */ + export const CmrDocumentCityResponseDTOSchema = z + .object({ + cityId: z.string().describe("ID of the city"), + cityName: z.string().describe("Name of the city"), + date: z.iso.datetime({ offset: true }).describe("Date of delivery/takeover").nullish(), + countryName: z.string().describe("Country name").nullish(), + }) + .readonly(); + export type CmrDocumentCityResponseDTO = z.infer; + + /** + * CmrDocumentCostsResponseDTOSchema + * @type { object } + * @property { number } carriageCharges Carriage charges + * @property { number } reductions Reductions + * @property { number } balance Balance + * @property { number } supplements Supplements + * @property { number } miscellaneous Miscellaneous charges + * @property { number } total Total amount + */ + export const CmrDocumentCostsResponseDTOSchema = z + .object({ + carriageCharges: z.number().describe("Carriage charges"), + reductions: z.number().describe("Reductions"), + balance: z.number().describe("Balance"), + supplements: z.number().describe("Supplements"), + miscellaneous: z.number().describe("Miscellaneous charges"), + total: z.number().describe("Total amount"), + }) + .readonly(); + export type CmrDocumentCostsResponseDTO = z.infer; + + /** + * CmrDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { number } quantity Quantity of packages + * @property { string } description Description of the cargo + * @property { string } packageType + * @property { string } statisticNumber + * @property { string } positionNumber Position number of the cargo + * @property { number } grossWeight Gross weight of the cargo + * @property { number } volume Volume of the cargo + * @property { string } containerNumber Container number of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + */ + export const CmrDocumentCargoResponseDTOSchema = z + .object({ + caseMarks: z.string().describe("Case marks of the cargo"), + quantity: z.number().describe("Quantity of packages"), + description: z.string().describe("Description of the cargo"), + packageType: z.string(), + statisticNumber: z.string(), + positionNumber: z.string().describe("Position number of the cargo"), + grossWeight: z.number().describe("Gross weight of the cargo"), + volume: z.number().describe("Volume of the cargo"), + containerNumber: z.string().describe("Container number of the cargo"), + seal1: z.string().describe("Seal number 1 of the cargo"), + seal2: z.string().describe("Seal number 2 of the cargo"), + }) + .readonly(); + export type CmrDocumentCargoResponseDTO = z.infer; + + /** + * CmrDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } positionNumber Position number + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { number } versionNumber Version number of the document + * @property { string } cmrNumber CMR number + * @property { CmrDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { CmrDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { CmrDocumentBusinessPartnerResponseDTO } carrier Carrier information + * @property { CmrDocumentBusinessPartnerResponseDTO } successiveCarrier Successive carrier information + * @property { CmrDocumentCityResponseDTO } delivery Delivery information + * @property { CmrDocumentCityResponseDTO } takeover Takeover information + * @property { string } annexedDocuments Annexed documents + * @property { string } carriersObservations Carriers observations + * @property { string } senderInstructions Sender instructions + * @property { string } reimbursement Reimbursement information + * @property { string } specialAgreements Special agreements + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { boolean } freightPaid Whether freight is paid + * @property { boolean } freightToBePaid Whether freight is to be paid + * @property { string } creationPlace Place of creation + * @property { string } creationDate Date of creation + * @property { CmrDocumentCostsResponseDTO } costsForShipper Costs for shipper + * @property { CmrDocumentCostsResponseDTO } costsForConsignee Costs for consignee + * @property { string[] } selectedCargoIds List of selected cargo IDs + * @property { CmrDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CmrDocumentSettingsDtoDTO } settings Settings for the BL Instructions document + */ + export const CmrDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the document"), + name: z.string().describe("Name of the document"), + positionNumber: z.string().describe("Position number"), + nameSuffix: z.string().describe("Name suffix of the document").nullish(), + defaultFileName: z.string(), + positionId: z.string().describe("Position ID"), + versionNumber: z.number().describe("Version number of the document"), + cmrNumber: z.string().describe("CMR number").nullish(), + consignee: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), + shipper: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), + carrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Carrier information").nullish(), + successiveCarrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe( + "Successive carrier information", + ).nullish(), + delivery: CmrDocumentCityResponseDTOSchema.describe("Delivery information").nullish(), + takeover: CmrDocumentCityResponseDTOSchema.describe("Takeover information").nullish(), + annexedDocuments: z.string().describe("Annexed documents").nullish(), + carriersObservations: z.string().describe("Carriers observations").nullish(), + senderInstructions: z.string().describe("Sender instructions").nullish(), + reimbursement: z.string().describe("Reimbursement information").nullish(), + specialAgreements: z.string().describe("Special agreements").nullish(), + suppressWeight: z.boolean().describe("Whether to suppress weight information"), + suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), + freightPaid: z.boolean().describe("Whether freight is paid"), + freightToBePaid: z.boolean().describe("Whether freight is to be paid"), + creationPlace: z.string().describe("Place of creation"), + creationDate: z.string().describe("Date of creation"), + costsForShipper: CmrDocumentCostsResponseDTOSchema.describe("Costs for shipper").nullish(), + costsForConsignee: CmrDocumentCostsResponseDTOSchema.describe("Costs for consignee").nullish(), + selectedCargoIds: z.array(z.string()).readonly().describe("List of selected cargo IDs"), + cargo: z.array(CmrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), + config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + settings: CmrDocumentSettingsDtoDTOSchema.describe("Settings for the BL Instructions document").nullish(), + }) + .readonly(); + export type CmrDocumentResponseDTO = z.infer; + + /** + * UpdateCmrDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CmrDocumentLanguage } primaryLanguage Primary language + * @property { CmrDocumentLanguage } secondaryLanguage Secondary language + */ + export const UpdateCmrDocumentSettingsRequestDTOSchema = z + .object({ + primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), + secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language"), + }) + .readonly(); + export type UpdateCmrDocumentSettingsRequestDTO = z.infer; + + /** + * UpdateCmrDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateCmrDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateCmrDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateCmrDocumentDeliveryRequestDTOSchema + * @type { object } + * @property { string } cityId City ID + * @property { string } cityName City name + * @property { string } date Date + */ + export const UpdateCmrDocumentDeliveryRequestDTOSchema = z + .object({ + cityId: z.string().describe("City ID"), + cityName: z.string().describe("City name"), + date: z.iso.datetime({ offset: true }).describe("Date"), + }) + .readonly(); + export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; + + /** + * UpdateCmrDocumentCostsRequestDTOSchema + * @type { object } + * @property { number } carriageCharges Carriage charges + * @property { number } reductions Reductions + * @property { number } balance Balance + * @property { number } supplements Supplements + * @property { number } miscellaneous Miscellaneous + * @property { number } total Total + */ + export const UpdateCmrDocumentCostsRequestDTOSchema = z + .object({ + carriageCharges: z.number().describe("Carriage charges"), + reductions: z.number().describe("Reductions"), + balance: z.number().describe("Balance"), + supplements: z.number().describe("Supplements"), + miscellaneous: z.number().describe("Miscellaneous"), + total: z.number().describe("Total"), + }) + .readonly(); + export type UpdateCmrDocumentCostsRequestDTO = z.infer; + + /** + * UpdateCmrDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } cmrNumber CMR number + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } carrier Carrier information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } successiveCarrier Successive carrier information + * @property { UpdateCmrDocumentDeliveryRequestDTO } delivery Delivery information + * @property { UpdateCmrDocumentDeliveryRequestDTO } takeover Takeover information + * @property { string } annexedDocuments Annexed documents + * @property { string } carriersObservations Carriers observations + * @property { string } senderInstructions Sender instructions + * @property { string } reimbursement Reimbursement + * @property { string } specialAgreements Special agreements + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { boolean } freightPaid Whether freight is paid + * @property { boolean } freightToBePaid Whether freight is to be paid + * @property { string } creationPlace Place of creation + * @property { string } creationDate Date of creation + * @property { UpdateCmrDocumentCostsRequestDTO } costsForShipper Costs for shipper + * @property { UpdateCmrDocumentCostsRequestDTO } costsForConsignee Costs for consignee + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { UpdateCmrDocumentSettingsRequestDTO } settings Settings + */ + export const UpdateCmrDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Name suffix"), + cmrNumber: z.string().describe("CMR number"), + consignee: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), + shipper: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), + carrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Carrier information"), + successiveCarrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Successive carrier information"), + delivery: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Delivery information"), + takeover: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Takeover information"), + annexedDocuments: z.string().describe("Annexed documents"), + carriersObservations: z.string().describe("Carriers observations"), + senderInstructions: z.string().describe("Sender instructions"), + reimbursement: z.string().describe("Reimbursement"), + specialAgreements: z.string().describe("Special agreements"), + suppressWeight: z.boolean().describe("Whether to suppress weight information"), + suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), + freightPaid: z.boolean().describe("Whether freight is paid"), + freightToBePaid: z.boolean().describe("Whether freight is to be paid"), + creationPlace: z.string().describe("Place of creation"), + creationDate: z.string().describe("Date of creation"), + costsForShipper: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for shipper"), + costsForConsignee: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for consignee"), + selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + settings: UpdateCmrDocumentSettingsRequestDTOSchema.describe("Settings"), + }) + .readonly(); + export type UpdateCmrDocumentRequestDTO = z.infer; +} diff --git a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts new file mode 100644 index 0000000..213063b --- /dev/null +++ b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsCmrFormAcl } from "./workingDocumentsCmrForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsCmrFormApi } from "./workingDocumentsCmrForm.api"; + +export namespace WorkingDocumentsCmrFormQueries { + export const moduleName = QueryModule.WorkingDocumentsCmrForm; + + export const keys = { + all: [moduleName] as const, + getCmrData: (positionId: string, cmrId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId", positionId, cmrId, officeId] as const, + previewCmr: (positionId: string, cmrId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/cmrs/:cmrId/preview", + positionId, + cmrId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a CMR document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId })); + return WorkingDocumentsCmrFormApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetCmrData` + * @summary Get CMR document data + * @permission Requires `canUseGetCmrData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.cmrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetCmrData = ( + { positionId, cmrId, officeId }: { positionId: string; cmrId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCmrData(positionId, cmrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId })); + return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateCmrData` + * @summary Update CMR document data + * @permission Requires `canUseUpdateCmrData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateCmrData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsCmrFormApi.updateCmrData, + { + positionId: string; + cmrId: string; + officeId: string; + data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId, data }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId })); + return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, cmrId, officeId } = variables; + const updateKeys = [keys.getCmrData(positionId, cmrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteCmr` + * @summary Delete CMR document + * @permission Requires `canUseDeleteCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } CMR document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteCmr = ( + options?: AppMutationOptions< + typeof WorkingDocumentsCmrFormApi.deleteCmr, + { positionId: string; cmrId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId })); + return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewCmr` - recommended when file should be cached + * @summary Preview CMR document + * @permission Requires `canUsePreviewCmr` ability + * @param { string } object.positionId Path parameter + * @param { string } object.cmrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewCmr = ( + { positionId, cmrId, officeId }: { positionId: string; cmrId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewCmr(positionId, cmrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId })); + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewCmrMutation` - recommended when file should not be cached + * @summary Preview CMR document + * @permission Requires `canUsePreviewCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewCmrMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsCmrFormApi.previewCmr, + { positionId: string; cmrId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId })); + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, cmrId, officeId } = variables; + const updateKeys = [keys.previewCmr(positionId, cmrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateCmr` + * @summary Generate CMR document + * @permission Requires `canUseGenerateCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateCmr = ( + options?: AppMutationOptions< + typeof WorkingDocumentsCmrFormApi.generateCmr, + { positionId: string; cmrId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId, data }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId })); + return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts new file mode 100644 index 0000000..96a5c3a --- /dev/null +++ b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts @@ -0,0 +1,99 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsExportDeclarationAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Create", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Create", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; + + /** + * Use for `useGetExportDeclarationData` query ability. For global ability, omit the object parameter. + * @description Read export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetExportDeclarationData` query + */ + export const canUseGetExportDeclarationData = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Read", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; + + /** + * Use for `useUpdateExportDeclarationData` mutation ability. For global ability, omit the object parameter. + * @description Update export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateExportDeclarationData` mutation + */ + export const canUseUpdateExportDeclarationData = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Update", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; + + /** + * Use for `useDeleteExportDeclaration` mutation ability. For global ability, omit the object parameter. + * @description Delete export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteExportDeclaration` mutation + */ + export const canUseDeleteExportDeclaration = (object?: { officeId: string }) => + [ + "Delete", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Delete", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; + + /** + * Use for `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation + */ + export const canUsePreviewExportDeclaration = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Read", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; + + /** + * Use for `useGenerateExportDeclaration` mutation ability. For global ability, omit the object parameter. + * @description Generate export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateExportDeclaration` mutation + */ + export const canUseGenerateExportDeclaration = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", + ] as AbilityTuple< + "Update", + | "WorkingDocument-export-declaration" + | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts new file mode 100644 index 0000000..910ef10 --- /dev/null +++ b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts @@ -0,0 +1,89 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsExportDeclarationApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations`, + undefined, + config, + ); + }; + export const getExportDeclarationData = ( + officeId: string, + positionId: string, + exportDeclarationId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + config, + ); + }; + export const updateExportDeclarationData = ( + officeId: string, + positionId: string, + exportDeclarationId: string, + data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), + config, + ); + }; + export const deleteExportDeclaration = ( + positionId: string, + exportDeclarationId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + undefined, + config, + ); + }; + export const previewExportDeclaration = ( + officeId: string, + positionId: string, + exportDeclarationId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generateExportDeclaration = ( + officeId: string, + positionId: string, + exportDeclarationId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts new file mode 100644 index 0000000..3aca835 --- /dev/null +++ b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts @@ -0,0 +1,179 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsExportDeclarationModels { + /** + * ExportDeclarationDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer< + typeof ExportDeclarationDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * ExportDeclarationDocumentCargoResponseDTOSchema + * @type { object } + * @property { number } quantity Quantity of packages + * @property { number } weight Weight of the cargo + * @property { number } length Length of the cargo + * @property { number } width Width of the cargo + * @property { number } height Height of the cargo + * @property { string } packageType Type of package + * @property { string } positionNumber Position number + */ + export const ExportDeclarationDocumentCargoResponseDTOSchema = z + .object({ + quantity: z.number().describe("Quantity of packages"), + weight: z.number().describe("Weight of the cargo"), + length: z.number().describe("Length of the cargo"), + width: z.number().describe("Width of the cargo"), + height: z.number().describe("Height of the cargo"), + packageType: z.string().describe("Type of package"), + positionNumber: z.string().describe("Position number"), + }) + .readonly(); + export type ExportDeclarationDocumentCargoResponseDTO = z.infer< + typeof ExportDeclarationDocumentCargoResponseDTOSchema + >; + + /** + * ExportDeclarationDocumentRouteResponseDTOSchema + * @type { object } + * @property { string } pickupDate Pickup date + * @property { string } deliveryDate Delivery date + * @property { string } pickupCity Pickup city + * @property { string } deliveryCity Delivery city + */ + export const ExportDeclarationDocumentRouteResponseDTOSchema = z + .object({ + pickupDate: z.string().describe("Pickup date"), + deliveryDate: z.string().describe("Delivery date"), + pickupCity: z.string().describe("Pickup city"), + deliveryCity: z.string().describe("Delivery city"), + }) + .readonly(); + export type ExportDeclarationDocumentRouteResponseDTO = z.infer< + typeof ExportDeclarationDocumentRouteResponseDTOSchema + >; + + /** + * ExportDeclarationDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the export declaration document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the export declaration document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } dateOfHandover Date when the goods are handed over for export + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { string } issuerName Name of the issuer + * @property { string } issuerAddress Address of the issuer + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } customer Customer information + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { string } selectedCargoId ID of the selected cargo + * @property { ExportDeclarationDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { ExportDeclarationDocumentRouteResponseDTO } route Route information + * @property { string } signingPlace Place where the document is signed + * @property { string } signingDate Date when the document is signed + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } signedBy Information about who signed the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ + export const ExportDeclarationDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the export declaration document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference").nullish(), + name: z.string().describe("Name of the export declaration document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + dateOfHandover: z.iso + .datetime({ offset: true }) + .describe("Date when the goods are handed over for export") + .nullish(), + direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), + transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), + versionNumber: z.number().describe("Version number of the document"), + issuerName: z.string().describe("Name of the issuer").nullish(), + issuerAddress: z.string().describe("Address of the issuer").nullish(), + customer: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Customer information").nullish(), + shipper: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), + consignee: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), + selectedCargoId: z.string().describe("ID of the selected cargo").nullish(), + cargo: z + .array(ExportDeclarationDocumentCargoResponseDTOSchema) + .readonly() + .describe("List of cargo information") + .nullish(), + route: ExportDeclarationDocumentRouteResponseDTOSchema.describe("Route information").nullish(), + signingPlace: z.string().describe("Place where the document is signed").nullish(), + signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed").nullish(), + signedBy: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe( + "Information about who signed the document", + ).nullish(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document").nullish(), + }) + .readonly(); + export type ExportDeclarationDocumentResponseDTO = z.infer; + + /** + * UpdateExportDeclarationDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } dateOfHandover Date when goods are handed over for export + * @property { string } issuerName Name of the issuer + * @property { string } issuerAddress Address of the issuer + * @property { string } customerId Customer ID + * @property { string } customerAddress Customer address + * @property { string } shipperId Shipper ID + * @property { string } shipperAddress Shipper address + * @property { string } consigneeId Consignee ID + * @property { string } consigneeAddress Consignee address + * @property { string } selectedCargoId Selected cargo ID + * @property { string } signingPlace Place where the document is signed + * @property { string } signingDate Date when the document is signed + * @property { string } signedByEmployeeId ID of the employee who signed the document + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateExportDeclarationDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Name suffix"), + dateOfHandover: z.iso.datetime({ offset: true }).describe("Date when goods are handed over for export"), + issuerName: z.string().describe("Name of the issuer"), + issuerAddress: z.string().describe("Address of the issuer"), + customerId: z.string().describe("Customer ID"), + customerAddress: z.string().describe("Customer address"), + shipperId: z.string().describe("Shipper ID"), + shipperAddress: z.string().describe("Shipper address"), + consigneeId: z.string().describe("Consignee ID"), + consigneeAddress: z.string().describe("Consignee address"), + selectedCargoId: z.string().describe("Selected cargo ID"), + signingPlace: z.string().describe("Place where the document is signed"), + signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed"), + signedByEmployeeId: z.string().describe("ID of the employee who signed the document"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateExportDeclarationDocumentRequestDTO = z.infer< + typeof UpdateExportDeclarationDocumentRequestDTOSchema + >; +} diff --git a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts new file mode 100644 index 0000000..cd2bfa6 --- /dev/null +++ b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts @@ -0,0 +1,320 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsExportDeclarationAcl } from "./workingDocumentsExportDeclaration.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsExportDeclarationApi } from "./workingDocumentsExportDeclaration.api"; + +export namespace WorkingDocumentsExportDeclarationQueries { + export const moduleName = QueryModule.WorkingDocumentsExportDeclaration; + + export const keys = { + all: [moduleName] as const, + getExportDeclarationData: (officeId: string, positionId: string, exportDeclarationId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId", + officeId, + positionId, + exportDeclarationId, + ] as const, + previewExportDeclaration: (officeId: string, positionId: string, exportDeclarationId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId/preview", + officeId, + positionId, + exportDeclarationId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create an export declaration document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof WorkingDocumentsExportDeclarationApi.create, + { positionId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId })); + return WorkingDocumentsExportDeclarationApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetExportDeclarationData` + * @summary Get export declaration document data + * @permission Requires `canUseGetExportDeclarationData` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.exportDeclarationId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetExportDeclarationData = ( + { + officeId, + positionId, + exportDeclarationId, + }: { officeId: string; positionId: string; exportDeclarationId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), + queryFn: () => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId })); + return WorkingDocumentsExportDeclarationApi.getExportDeclarationData( + officeId, + positionId, + exportDeclarationId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateExportDeclarationData` + * @summary Update export declaration document data + * @permission Requires `canUseUpdateExportDeclarationData` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateExportDeclarationData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsExportDeclarationApi.updateExportDeclarationData, + { + officeId: string; + positionId: string; + exportDeclarationId: string; + data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId })); + return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData( + officeId, + positionId, + exportDeclarationId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, exportDeclarationId } = variables; + const updateKeys = [keys.getExportDeclarationData(officeId, positionId, exportDeclarationId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteExportDeclaration` + * @summary Delete export declaration document + * @permission Requires `canUseDeleteExportDeclaration` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Export declaration document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteExportDeclaration = ( + options?: AppMutationOptions< + typeof WorkingDocumentsExportDeclarationApi.deleteExportDeclaration, + { positionId: string; exportDeclarationId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, exportDeclarationId, officeId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId })); + return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration( + positionId, + exportDeclarationId, + officeId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewExportDeclaration` - recommended when file should be cached + * @summary Preview export declaration document + * @permission Requires `canUsePreviewExportDeclaration` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.exportDeclarationId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewExportDeclaration = ( + { + officeId, + positionId, + exportDeclarationId, + }: { officeId: string; positionId: string; exportDeclarationId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), + queryFn: () => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId })); + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration( + officeId, + positionId, + exportDeclarationId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewExportDeclarationMutation` - recommended when file should not be cached + * @summary Preview export declaration document + * @permission Requires `canUsePreviewExportDeclaration` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewExportDeclarationMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsExportDeclarationApi.previewExportDeclaration, + { officeId: string; positionId: string; exportDeclarationId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId })); + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration( + officeId, + positionId, + exportDeclarationId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, exportDeclarationId } = variables; + const updateKeys = [keys.previewExportDeclaration(officeId, positionId, exportDeclarationId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateExportDeclaration` + * @summary Generate export declaration document + * @permission Requires `canUseGenerateExportDeclaration` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateExportDeclaration = ( + options?: AppMutationOptions< + typeof WorkingDocumentsExportDeclarationApi.generateExportDeclaration, + { + officeId: string; + positionId: string; + exportDeclarationId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId })); + return WorkingDocumentsExportDeclarationApi.generateExportDeclaration( + officeId, + positionId, + exportDeclarationId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts new file mode 100644 index 0000000..3860d00 --- /dev/null +++ b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsFcrFormAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Create", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; + + /** + * Use for `useGetFcrData` query ability. For global ability, omit the object parameter. + * @description Read FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetFcrData` query + */ + export const canUseGetFcrData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Read", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; + + /** + * Use for `useUpdateFcrData` mutation ability. For global ability, omit the object parameter. + * @description Update FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateFcrData` mutation + */ + export const canUseUpdateFcrData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Update", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; + + /** + * Use for `useDeleteFcr` mutation ability. For global ability, omit the object parameter. + * @description Delete FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteFcr` mutation + */ + export const canUseDeleteFcr = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Delete", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; + + /** + * Use for `usePreviewFcr` query or `usePreviewFcrMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewFcr` query or `usePreviewFcrMutation` mutation + */ + export const canUsePreviewFcr = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Read", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; + + /** + * Use for `useGenerateFcr` mutation ability. For global ability, omit the object parameter. + * @description Generate FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateFcr` mutation + */ + export const canUseGenerateFcr = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< + "Update", + "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts new file mode 100644 index 0000000..904fa2b --- /dev/null +++ b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts @@ -0,0 +1,74 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsFcrFormApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs`, + undefined, + config, + ); + }; + export const getFcrData = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + config, + ); + }; + export const updateFcrData = ( + positionId: string, + fcrId: string, + officeId: string, + data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), + config, + ); + }; + export const deleteFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + undefined, + config, + ); + }; + export const previewFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generateFcr = ( + positionId: string, + fcrId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts new file mode 100644 index 0000000..ea713a5 --- /dev/null +++ b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts @@ -0,0 +1,150 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsFcrFormModels { + /** + * FcrDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const FcrDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type FcrDocumentBusinessPartnerResponseDTO = z.infer; + + /** + * FcrDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { string } containerNumber Container number + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + * @property { number } quantity Quantity of the cargo + * @property { string } description Description of the cargo + * @property { number } weight Weight of the cargo + * @property { number } volume Volume of the cargo + */ + export const FcrDocumentCargoResponseDTOSchema = z + .object({ + caseMarks: z.string().describe("Case marks of the cargo"), + containerNumber: z.string().describe("Container number"), + seal1: z.string().describe("Seal number 1 of the cargo"), + seal2: z.string().describe("Seal number 2 of the cargo"), + quantity: z.number().describe("Quantity of the cargo"), + description: z.string().describe("Description of the cargo"), + weight: z.number().describe("Weight of the cargo"), + volume: z.number().describe("Volume of the cargo"), + }) + .readonly(); + export type FcrDocumentCargoResponseDTO = z.infer; + + /** + * FcrDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { number } versionNumber Version number of the document + * @property { string } fcrNumber FCR number + * @property { string } edvNumber EDV number + * @property { number } numberOfOriginals Number of originals + * @property { string } placeOfLoading Place of loading + * @property { string } dateOfLoading Date of loading + * @property { string } viaCity Via city + * @property { string } toDestination To destination + * @property { string } transportMode Transport mode + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } issuePlace Issue place + * @property { string } issueDate Issue date + * @property { string } deliveryTerms Delivery terms + * @property { FcrDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { FcrDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { FcrDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ + export const FcrDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the document"), + name: z.string().describe("Name of the document"), + nameSuffix: z.string().describe("Name suffix of the document").nullish(), + defaultFileName: z.string(), + positionId: z.string().describe("Position ID"), + positionNumber: z.string().describe("Position number"), + versionNumber: z.number().describe("Version number of the document"), + fcrNumber: z.string().describe("FCR number").nullish(), + edvNumber: z.string().describe("EDV number").nullish(), + numberOfOriginals: z.number().describe("Number of originals"), + placeOfLoading: z.string().describe("Place of loading").nullish(), + dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading").nullish(), + viaCity: z.string().describe("Via city").nullish(), + toDestination: z.string().describe("To destination").nullish(), + transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + issuePlace: z.string().describe("Issue place").nullish(), + issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), + deliveryTerms: z.string().describe("Delivery terms").nullish(), + shipper: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), + consignee: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), + cargo: z.array(FcrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), + config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), + }) + .readonly(); + export type FcrDocumentResponseDTO = z.infer; + + /** + * UpdateFcrDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } fcrNumber FCR number + * @property { string } edvNumber EDV number + * @property { number } numberOfOriginals Number of originals + * @property { string } placeOfLoading Place of loading + * @property { string } dateOfLoading Date of loading + * @property { string } viaCity Via city + * @property { string } toDestination To destination + * @property { string } transportMode Transport mode + * @property { string } issuePlace Issue place + * @property { string } issueDate Issue date + * @property { string } deliveryTerms Delivery terms + * @property { string } shipperId Shipper ID + * @property { string } shipperAddress Shipper address + * @property { string } consigneeId Consignee ID + * @property { string } consigneeAddress Consignee address + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateFcrDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Name suffix"), + fcrNumber: z.string().describe("FCR number"), + edvNumber: z.string().describe("EDV number"), + numberOfOriginals: z.number().describe("Number of originals"), + placeOfLoading: z.string().describe("Place of loading"), + dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading"), + viaCity: z.string().describe("Via city"), + toDestination: z.string().describe("To destination"), + transportMode: z.string().describe("Transport mode"), + issuePlace: z.string().describe("Issue place"), + issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), + deliveryTerms: z.string().describe("Delivery terms"), + shipperId: z.string().describe("Shipper ID"), + shipperAddress: z.string().describe("Shipper address"), + consigneeId: z.string().describe("Consignee ID"), + consigneeAddress: z.string().describe("Consignee address"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateFcrDocumentRequestDTO = z.infer; +} diff --git a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts new file mode 100644 index 0000000..7e9a7d2 --- /dev/null +++ b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsFcrFormAcl } from "./workingDocumentsFcrForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsFcrFormApi } from "./workingDocumentsFcrForm.api"; + +export namespace WorkingDocumentsFcrFormQueries { + export const moduleName = QueryModule.WorkingDocumentsFcrForm; + + export const keys = { + all: [moduleName] as const, + getFcrData: (positionId: string, fcrId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId", positionId, fcrId, officeId] as const, + previewFcr: (positionId: string, fcrId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/fcrs/:fcrId/preview", + positionId, + fcrId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create an FCR document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId })); + return WorkingDocumentsFcrFormApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetFcrData` + * @summary Get FCR document data + * @permission Requires `canUseGetFcrData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.fcrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetFcrData = ( + { positionId, fcrId, officeId }: { positionId: string; fcrId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getFcrData(positionId, fcrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId })); + return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateFcrData` + * @summary Update FCR document data + * @permission Requires `canUseUpdateFcrData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateFcrData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsFcrFormApi.updateFcrData, + { + positionId: string; + fcrId: string; + officeId: string; + data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId, data }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId })); + return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, fcrId, officeId } = variables; + const updateKeys = [keys.getFcrData(positionId, fcrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteFcr` + * @summary Delete FCR document + * @permission Requires `canUseDeleteFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } FCR document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteFcr = ( + options?: AppMutationOptions< + typeof WorkingDocumentsFcrFormApi.deleteFcr, + { positionId: string; fcrId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId })); + return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewFcr` - recommended when file should be cached + * @summary Preview FCR document + * @permission Requires `canUsePreviewFcr` ability + * @param { string } object.positionId Path parameter + * @param { string } object.fcrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewFcr = ( + { positionId, fcrId, officeId }: { positionId: string; fcrId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewFcr(positionId, fcrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId })); + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewFcrMutation` - recommended when file should not be cached + * @summary Preview FCR document + * @permission Requires `canUsePreviewFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewFcrMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsFcrFormApi.previewFcr, + { positionId: string; fcrId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId })); + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, fcrId, officeId } = variables; + const updateKeys = [keys.previewFcr(positionId, fcrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateFcr` + * @summary Generate FCR document + * @permission Requires `canUseGenerateFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateFcr = ( + options?: AppMutationOptions< + typeof WorkingDocumentsFcrFormApi.generateFcr, + { positionId: string; fcrId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId, data }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId })); + return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts new file mode 100644 index 0000000..9d5e584 --- /dev/null +++ b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsHouseAwbAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Create", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; + + /** + * Use for `useGetHouseAwbData` query ability. For global ability, omit the object parameter. + * @description Read House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseAwbData` query + */ + export const canUseGetHouseAwbData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Read", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; + + /** + * Use for `useUpdateHouseAwbData` mutation ability. For global ability, omit the object parameter. + * @description Update House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseAwbData` mutation + */ + export const canUseUpdateHouseAwbData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Update", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; + + /** + * Use for `useDeleteHouseAwb` mutation ability. For global ability, omit the object parameter. + * @description Delete House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseAwb` mutation + */ + export const canUseDeleteHouseAwb = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Delete", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; + + /** + * Use for `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation + */ + export const canUsePreviewHouseAwb = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Read", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; + + /** + * Use for `useGenerateHouseAwb` mutation ability. For global ability, omit the object parameter. + * @description Generate House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseAwb` mutation + */ + export const canUseGenerateHouseAwb = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< + "Update", + "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts new file mode 100644 index 0000000..e0ad386 --- /dev/null +++ b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts @@ -0,0 +1,84 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseAwbApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs`, + undefined, + config, + ); + }; + export const getHouseAwbData = ( + positionId: string, + hawbId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + config, + ); + }; + export const updateHouseAwbData = ( + positionId: string, + hawbId: string, + officeId: string, + data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), + config, + ); + }; + export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + undefined, + config, + ); + }; + export const previewHouseAwb = ( + positionId: string, + hawbId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generateHouseAwb = ( + positionId: string, + hawbId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts new file mode 100644 index 0000000..e45408f --- /dev/null +++ b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts @@ -0,0 +1,307 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseAwbModels { + /** + * HouseAwbDocumentOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + * @property { string } name Name + */ + export const HouseAwbDocumentOtherChargeDTOSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID").nullish(), + sellRate: z.number().describe("Sell rate"), + name: z.string().describe("Name").nullish(), + }) + .readonly(); + export type HouseAwbDocumentOtherChargeDTO = z.infer; + + /** + * HouseAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { number } totalOtherCharges Total other charges + * @property { number } total Total + * @property { HouseAwbDocumentOtherChargeDTO[] } otherCharges Other charges + */ + export const HouseAwbDocumentChargesDTOSchema = z + .object({ + weightCharge: z.number().describe("Weight charge"), + totalOtherCharges: z.number().describe("Total other charges"), + total: z.number().describe("Total"), + otherCharges: z.array(HouseAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges"), + }) + .readonly(); + export type HouseAwbDocumentChargesDTO = z.infer; + + /** + * HouseAwbDocumentCargoDTOSchema + * @type { object } + * @property { number } quantity Quantity + * @property { number } grossWeight Gross weight + * @property { string } rateClass Rate class + * @property { string } commodityItemNo Commodity item number + * @property { number } rateOrCharge Rate or charge + * @property { number } total Total + * @property { string } description Description + */ + export const HouseAwbDocumentCargoDTOSchema = z + .object({ + quantity: z.number().describe("Quantity"), + grossWeight: z.number().describe("Gross weight").nullish(), + rateClass: z.string().describe("Rate class").nullish(), + commodityItemNo: z.string().describe("Commodity item number").nullish(), + rateOrCharge: z.number().describe("Rate or charge").nullish(), + total: z.number().describe("Total").nullish(), + description: z.string().describe("Description").nullish(), + }) + .readonly(); + export type HouseAwbDocumentCargoDTO = z.infer; + + /** + * HouseAwbDocumentRouteDTOSchema + * @type { object } + * @property { string } airportOfDeparture Airport of departure + * @property { string } airportOfDestination Airport of destination + * @property { string } toAirport1 To airport 1 + * @property { string } byCarrier1 By carrier 1 + * @property { string } toAirport2 To airport 2 + * @property { string } byCarrier2 By carrier 2 + * @property { string } toAirport3 To airport 3 + * @property { string } byCarrier3 By carrier 3 + * @property { string } flightNumber1 Flight number 1 + * @property { string } flightDay1 Flight day 1 + * @property { string } flightNumber2 Flight number 2 + * @property { string } flightDay2 Flight day 2 + */ + export const HouseAwbDocumentRouteDTOSchema = z + .object({ + airportOfDeparture: z.string().describe("Airport of departure"), + airportOfDestination: z.string().describe("Airport of destination"), + toAirport1: z.string().describe("To airport 1").nullish(), + byCarrier1: z.string().describe("By carrier 1").nullish(), + toAirport2: z.string().describe("To airport 2").nullish(), + byCarrier2: z.string().describe("By carrier 2").nullish(), + toAirport3: z.string().describe("To airport 3").nullish(), + byCarrier3: z.string().describe("By carrier 3").nullish(), + flightNumber1: z.string().describe("Flight number 1").nullish(), + flightDay1: z.string().describe("Flight day 1").nullish(), + flightNumber2: z.string().describe("Flight number 2").nullish(), + flightDay2: z.string().describe("Flight day 2").nullish(), + }) + .readonly(); + export type HouseAwbDocumentRouteDTO = z.infer; + + /** + * HouseAwbDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const HouseAwbDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer< + typeof HouseAwbDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * HouseAwbDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the House AWB document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the House AWB document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } currency Currency + * @property { number } versionNumber Version number of the document + * @property { string } hawbNumber HAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { HouseAwbDocumentCargoDTO[] } cargo Cargo packages + * @property { HouseAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } signingLocation Signing location + * @property { string } issuerIataCode Issuer IATA code + * @property { HouseAwbDocumentRouteDTO } route Route + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } issuer Issuer + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { CommonModels.DocumentConfigDTO } config Config + */ + export const HouseAwbDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the House AWB document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference"), + name: z.string().describe("Name of the House AWB document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + currency: z.string().describe("Currency").nullish(), + versionNumber: z.number().describe("Version number of the document"), + hawbNumber: z.string().describe("HAWB number").nullish(), + sciReference: z.string().describe("SCI reference").nullish(), + reference1: z.string().describe("Reference 1").nullish(), + reference2: z.string().describe("Reference 2").nullish(), + reference3: z.string().describe("Reference 3").nullish(), + exchangeRate: z.number().describe("Exchange rate").nullish(), + additionalText: CommonModels.EditorContentResponseDtoSchema.describe( + "Additional text for the document", + ).nullish(), + handlingInstructions: z.string().describe("Handling instructions").nullish(), + accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), + additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), + isSecured: z.boolean().describe("Is secured"), + suppressContainerWeight: z.boolean().describe("Suppress container weight"), + suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), + cargo: z.array(HouseAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), + charges: HouseAwbDocumentChargesDTOSchema.describe("Charges").nullish(), + shipperSigner: z.string().describe("Shipper signer").nullish(), + shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), + signer: z.string().describe("Signer").nullish(), + signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), + signingLocation: z.string().describe("Signing location").nullish(), + issuerIataCode: z.string().describe("Issuer IATA code").nullish(), + route: HouseAwbDocumentRouteDTOSchema.describe("Route").nullish(), + issuer: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), + consignee: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), + shipper: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish(), + }) + .readonly(); + export type HouseAwbDocumentResponseDTO = z.infer; + + /** + * UpdateHouseAwbDocumentChargesOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + */ + export const UpdateHouseAwbDocumentChargesOtherChargeDTOSchema = z + .object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }) + .readonly(); + export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer< + typeof UpdateHouseAwbDocumentChargesOtherChargeDTOSchema + >; + + /** + * UpdateHouseAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { UpdateHouseAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges + */ + export const UpdateHouseAwbDocumentChargesDTOSchema = z + .object({ + weightCharge: z.number().describe("Weight charge"), + otherCharges: z.array(UpdateHouseAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges"), + }) + .readonly(); + export type UpdateHouseAwbDocumentChargesDTO = z.infer; + + /** + * UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateHouseAwbDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } hawbNumber HAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { UpdateHouseAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } issuerId Issuer ID + * @property { string } issuerName Issuer name + * @property { string } issuerAddress Issuer address + * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateHouseAwbDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Document name suffix"), + hawbNumber: z.string().describe("HAWB number"), + sciReference: z.string().describe("SCI reference"), + reference1: z.string().describe("Reference 1"), + reference2: z.string().describe("Reference 2"), + reference3: z.string().describe("Reference 3"), + exchangeRate: z.number().describe("Exchange rate"), + additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), + handlingInstructions: z.string().describe("Handling instructions"), + accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), + additionalAccountingNotes: z.string().describe("Additional accounting notes"), + isSecured: z.boolean().describe("Is secured"), + suppressContainerWeight: z.boolean().describe("Suppress container weight"), + suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), + charges: UpdateHouseAwbDocumentChargesDTOSchema.describe("Charges"), + shipperSigner: z.string().describe("Shipper signer"), + shipperSignerUserName: z.string().describe("Shipper signer user name"), + signer: z.string().describe("Signer"), + signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), + issuerId: z.string().describe("Issuer ID"), + issuerName: z.string().describe("Issuer name"), + issuerAddress: z.string().describe("Issuer address"), + consignee: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), + shipper: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateHouseAwbDocumentRequestDTO = z.infer; +} diff --git a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts new file mode 100644 index 0000000..6f91afa --- /dev/null +++ b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsHouseAwbAcl } from "./workingDocumentsHouseAwb.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsHouseAwbApi } from "./workingDocumentsHouseAwb.api"; + +export namespace WorkingDocumentsHouseAwbQueries { + export const moduleName = QueryModule.WorkingDocumentsHouseAwb; + + export const keys = { + all: [moduleName] as const, + getHouseAwbData: (positionId: string, hawbId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId", positionId, hawbId, officeId] as const, + previewHouseAwb: (positionId: string, hawbId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/hawbs/:hawbId/preview", + positionId, + hawbId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a House AWB document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId })); + return WorkingDocumentsHouseAwbApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetHouseAwbData` + * @summary Get House AWB document data + * @permission Requires `canUseGetHouseAwbData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.hawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetHouseAwbData = ( + { positionId, hawbId, officeId }: { positionId: string; hawbId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId })); + return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateHouseAwbData` + * @summary Update House AWB document data + * @permission Requires `canUseUpdateHouseAwbData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateHouseAwbData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseAwbApi.updateHouseAwbData, + { + positionId: string; + hawbId: string; + officeId: string; + data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId })); + return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, hawbId, officeId } = variables; + const updateKeys = [keys.getHouseAwbData(positionId, hawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteHouseAwb` + * @summary Delete House AWB document + * @permission Requires `canUseDeleteHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } House AWB document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteHouseAwb = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseAwbApi.deleteHouseAwb, + { positionId: string; hawbId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId })); + return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewHouseAwb` - recommended when file should be cached + * @summary Preview House AWB document + * @permission Requires `canUsePreviewHouseAwb` ability + * @param { string } object.positionId Path parameter + * @param { string } object.hawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseAwb = ( + { positionId, hawbId, officeId }: { positionId: string; hawbId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId })); + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewHouseAwbMutation` - recommended when file should not be cached + * @summary Preview House AWB document + * @permission Requires `canUsePreviewHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseAwbMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseAwbApi.previewHouseAwb, + { positionId: string; hawbId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId })); + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, hawbId, officeId } = variables; + const updateKeys = [keys.previewHouseAwb(positionId, hawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateHouseAwb` + * @summary Generate House AWB document + * @permission Requires `canUseGenerateHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateHouseAwb = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseAwbApi.generateHouseAwb, + { positionId: string; hawbId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId })); + return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts new file mode 100644 index 0000000..d23cec5 --- /dev/null +++ b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts @@ -0,0 +1,99 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsHouseBlAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Create", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `useGetHouseBlData` query ability. For global ability, omit the object parameter. + * @description Read house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseBlData` query + */ + export const canUseGetHouseBlData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Read", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `useUpdateHouseBlData` mutation ability. For global ability, omit the object parameter. + * @description Update house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseBlData` mutation + */ + export const canUseUpdateHouseBlData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Update", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `useDeleteHouseBl` mutation ability. For global ability, omit the object parameter. + * @description Delete house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseBl` mutation + */ + export const canUseDeleteHouseBl = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Delete", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation + */ + export const canUsePreviewHouseBl = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Read", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview house BL document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation + */ + export const canUsePreviewHouseBlEml = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Read", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `useGenerateHouseBl` mutation ability. For global ability, omit the object parameter. + * @description Generate house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseBl` mutation + */ + export const canUseGenerateHouseBl = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Update", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; + + /** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate house BL document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ + export const canUseGenerateDocumentEml = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< + "Update", + "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts new file mode 100644 index 0000000..6880ade --- /dev/null +++ b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts @@ -0,0 +1,129 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseBlApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls`, + undefined, + config, + ); + }; + export const getHouseBlData = ( + positionId: string, + houseBlId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + config, + ); + }; + export const updateHouseBlData = ( + positionId: string, + houseBlId: string, + officeId: string, + data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), + config, + ); + }; + export const deleteHouseBl = ( + positionId: string, + houseBlId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + undefined, + config, + ); + }; + export const previewHouseBl = ( + positionId: string, + houseBlId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const previewHouseBlEml = ( + positionId: string, + houseBlId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generateHouseBl = ( + positionId: string, + houseBlId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; + export const generateDocumentEml = ( + positionId: string, + houseBlId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts new file mode 100644 index 0000000..1feb430 --- /dev/null +++ b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts @@ -0,0 +1,350 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseBlModels { + /** + * HouseBlDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { number } quantityOfCopies Quantity of copies + * @property { string } date Date + * @property { string } location Location + * @property { string } signer Signer + * @property { boolean } hideSignature Hide signature + * @property { boolean } capsLock Render issuer/signer in caps lock + * @property { string } documentTitle Document title + */ + export const HouseBlDocumentSettingsDtoDTOSchema = z + .object({ + quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), + quantityOfCopies: z.number().describe("Quantity of copies"), + date: z.iso.datetime({ offset: true }).describe("Date"), + location: z.string().describe("Location"), + signer: z.string().describe("Signer"), + hideSignature: z.boolean().describe("Hide signature"), + capsLock: z.boolean().describe("Render issuer/signer in caps lock"), + documentTitle: z.string().describe("Document title"), + }) + .readonly(); + export type HouseBlDocumentSettingsDtoDTO = z.infer; + + /** + * HouseBlDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const HouseBlDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer< + typeof HouseBlDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * HouseBlDocumentCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ + export const HouseBlDocumentCountryResponseDTOSchema = z + .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) + .readonly(); + export type HouseBlDocumentCountryResponseDTO = z.infer; + + /** + * HouseBlDocumentPlaceResponseDTOSchema + * @type { object } + * @property { string } id ID of the place + * @property { string } name Name of the place + */ + export const HouseBlDocumentPlaceResponseDTOSchema = z + .object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }) + .readonly(); + export type HouseBlDocumentPlaceResponseDTO = z.infer; + + /** + * HouseBlDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ + export const HouseBlDocumentPortResponseDTOSchema = z + .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) + .readonly(); + export type HouseBlDocumentPortResponseDTO = z.infer; + + /** + * HouseBlDocumentTerminalResponseDTOSchema + * @type { object } + * @property { string } id ID of the terminal + * @property { string } name Name of the terminal + */ + export const HouseBlDocumentTerminalResponseDTOSchema = z + .object({ id: z.string().describe("ID of the terminal"), name: z.string().describe("Name of the terminal") }) + .readonly(); + export type HouseBlDocumentTerminalResponseDTO = z.infer; + + /** + * HouseBlDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the house BL document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the house BL document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } blNumber Bill of lading number + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } exportReference Export reference number + * @property { HouseBlDocumentBusinessPartnerResponseDTO } forwarder Forwarder information for the shipment + * @property { HouseBlDocumentCountryResponseDTO } originCountry Origin country + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { CommonModels.EditorContentResponseDto } additionalTextTop Additional text for the document + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { HouseBlDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } cargoReleaseBy Delivery agent information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information + * @property { HouseBlDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information + * @property { string } precarriageByText Pre-carriage by free-text override + * @property { HouseBlDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information + * @property { string } placeOfReceiptText Place of receipt free-text override + * @property { string } vessel Name of the vessel + * @property { string } voyage Voyage number of the vessel + * @property { string } declaredValue Declared value of the shipment + * @property { number } rateOfExchange Rate of exchange of the shipment + * @property { string } currency Currency of the shipment + * @property { string } freightPayable Freight payable of the shipment + * @property { string } issuer Issuer + * @property { HouseBlDocumentPortResponseDTO } portOfLoading Port of loading information + * @property { string } portOfLoadingText Port of loading free-text override + * @property { HouseBlDocumentTerminalResponseDTO } loadingPierTerminal Loading pier/terminal information + * @property { string } loadingPierTerminalText Loading pier/terminal free-text override + * @property { HouseBlDocumentPortResponseDTO } portOfDischarge Port of discharge information + * @property { string } portOfDischargeText Port of discharge free-text override + * @property { HouseBlDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information + * @property { string } placeOfDeliveryText Place of delivery free-text override + * @property { HouseBlDocumentPlaceResponseDTO } originalsToBeReleasedAt Originals to be released at information + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { string } typeOfMove Type of move + * @property { string } placeOfIssue + * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data + * @property { HouseBlDocumentSettingsDtoDTO } settings Settings for the House BL document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ + export const HouseBlDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the house BL document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference").nullish(), + name: z.string().describe("Name of the house BL document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + blNumber: z.string().describe("Bill of lading number").nullish(), + carrierBookingNumber: z.string().describe("Carrier booking number").nullish(), + exportReference: z.string().describe("Export reference number").nullish(), + forwarder: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe( + "Forwarder information for the shipment", + ).nullish(), + originCountry: HouseBlDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), + useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), + additionalText: CommonModels.EditorContentResponseDtoSchema.describe( + "Additional text for the document", + ).nullish(), + additionalTextTop: CommonModels.EditorContentResponseDtoSchema.describe( + "Additional text for the document", + ).nullish(), + direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), + transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), + versionNumber: z.number().describe("Version number of the document"), + consignee: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information for the shipment"), + shipper: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), + cargoReleaseBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe( + "Delivery agent information for the shipment", + ).nullish(), + notify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Notify party information for the shipment"), + alsoNotify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Additional notify party information"), + precarriageBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), + precarriageByText: z.string().describe("Pre-carriage by free-text override").nullish(), + placeOfReceipt: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), + placeOfReceiptText: z.string().describe("Place of receipt free-text override").nullish(), + vessel: z.string().describe("Name of the vessel").nullish(), + voyage: z.string().describe("Voyage number of the vessel").nullish(), + declaredValue: z.string().describe("Declared value of the shipment").nullish(), + rateOfExchange: z.number().describe("Rate of exchange of the shipment").nullish(), + currency: z.string().describe("Currency of the shipment").nullish(), + freightPayable: z.string().describe("Freight payable of the shipment").nullish(), + issuer: z.string().describe("Issuer").nullish(), + portOfLoading: HouseBlDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), + portOfLoadingText: z.string().describe("Port of loading free-text override").nullish(), + loadingPierTerminal: HouseBlDocumentTerminalResponseDTOSchema.describe( + "Loading pier/terminal information", + ).nullish(), + loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override").nullish(), + portOfDischarge: HouseBlDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), + portOfDischargeText: z.string().describe("Port of discharge free-text override").nullish(), + placeOfDelivery: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), + placeOfDeliveryText: z.string().describe("Place of delivery free-text override").nullish(), + originalsToBeReleasedAt: HouseBlDocumentPlaceResponseDTOSchema.describe( + "Originals to be released at information", + ).nullish(), + originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override").nullish(), + typeOfMove: z.string().describe("Type of move").nullish(), + placeOfIssue: z.string().nullish(), + data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), + settings: HouseBlDocumentSettingsDtoDTOSchema.describe("Settings for the House BL document").nullish(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), + }) + .readonly(); + export type HouseBlDocumentResponseDTO = z.infer; + + /** + * UpdateHouseBlDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { number } quantityOfCopies Quantity of copies + * @property { string } blNumber BL number + * @property { string } exportReference Export reference number + * @property { string } location Location + * @property { string } signer Signer + * @property { boolean } hideSignature Hide signature + * @property { boolean } capsLock Render issuer/signer in caps lock + * @property { string } date Date + * @property { string } documentTitle Document title + */ + export const UpdateHouseBlDocumentSettingsRequestDTOSchema = z + .object({ + quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), + quantityOfCopies: z.number().describe("Quantity of copies"), + blNumber: z.string().describe("BL number"), + exportReference: z.string().describe("Export reference number"), + location: z.string().describe("Location"), + signer: z.string().describe("Signer"), + hideSignature: z.boolean().describe("Hide signature"), + capsLock: z.boolean().describe("Render issuer/signer in caps lock"), + date: z.iso.datetime({ offset: true }).describe("Date"), + documentTitle: z.string().describe("Document title"), + }) + .readonly(); + export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; + + /** + * UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateHouseBlDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } blNumber Bill of lading number + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } exportReference Export reference number + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } forwarder Forwarder information + * @property { string } originCountryId Origin country ID + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } declaredValue Declared value + * @property { number } rateOfExchange Rate of exchange + * @property { string } freightPayable Freight payable + * @property { string } issuer Issuer + * @property { string } placeOfIssue Place of issue + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text + * @property { CommonModels.EditorContentUpdateDto } additionalTextTop Additional text top + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } notify Notify party information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } cargoReleaseBy Cargo release party information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information + * @property { string } precarriageById Pre-carriage by ID + * @property { string } precarriageByText Pre-carriage by free-text override + * @property { string } placeOfReceiptId Place of receipt ID + * @property { string } placeOfReceiptText Place of receipt free-text override + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } portOfLoadingId Port of loading ID + * @property { string } portOfLoadingText Port of loading free-text override + * @property { string } loadingPierTerminalId Loading pier/terminal ID + * @property { string } loadingPierTerminalText Loading pier/terminal free-text override + * @property { string } portOfDischargeId Port of discharge ID + * @property { string } portOfDischargeText Port of discharge free-text override + * @property { string } placeOfDeliveryId Place of delivery ID + * @property { string } placeOfDeliveryText Place of delivery free-text override + * @property { string } originalsToBeReleasedAtId Originals to be released at ID + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { string } typeOfMove Type of move + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { UpdateHouseBlDocumentSettingsRequestDTO } settings Settings + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data + */ + export const UpdateHouseBlDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Document name suffix"), + blNumber: z.string().describe("Bill of lading number"), + carrierBookingNumber: z.string().describe("Carrier booking number"), + exportReference: z.string().describe("Export reference number"), + forwarder: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), + originCountryId: z.string().describe("Origin country ID"), + useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), + declaredValue: z.string().describe("Declared value"), + rateOfExchange: z.number().describe("Rate of exchange"), + freightPayable: z.string().describe("Freight payable"), + issuer: z.string().describe("Issuer"), + placeOfIssue: z.string().describe("Place of issue"), + additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), + additionalTextTop: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text top"), + consignee: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), + shipper: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), + notify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), + cargoReleaseBy: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Cargo release party information"), + alsoNotify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), + precarriageById: z.string().describe("Pre-carriage by ID"), + precarriageByText: z.string().describe("Pre-carriage by free-text override"), + placeOfReceiptId: z.string().describe("Place of receipt ID"), + placeOfReceiptText: z.string().describe("Place of receipt free-text override"), + vessel: z.string().describe("Vessel name"), + voyage: z.string().describe("Voyage number"), + portOfLoadingId: z.string().describe("Port of loading ID"), + portOfLoadingText: z.string().describe("Port of loading free-text override"), + loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), + loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override"), + portOfDischargeId: z.string().describe("Port of discharge ID"), + portOfDischargeText: z.string().describe("Port of discharge free-text override"), + placeOfDeliveryId: z.string().describe("Place of delivery ID"), + placeOfDeliveryText: z.string().describe("Place of delivery free-text override"), + originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), + originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), + typeOfMove: z.string().describe("Type of move"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + settings: UpdateHouseBlDocumentSettingsRequestDTOSchema.describe("Settings"), + data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), + }) + .readonly(); + export type UpdateHouseBlDocumentRequestDTO = z.infer; +} diff --git a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts new file mode 100644 index 0000000..37c9f40 --- /dev/null +++ b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts @@ -0,0 +1,392 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsHouseBlAcl } from "./workingDocumentsHouseBl.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsHouseBlApi } from "./workingDocumentsHouseBl.api"; + +export namespace WorkingDocumentsHouseBlQueries { + export const moduleName = QueryModule.WorkingDocumentsHouseBl; + + export const keys = { + all: [moduleName] as const, + getHouseBlData: (positionId: string, houseBlId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/house-bls/:houseBlId", + positionId, + houseBlId, + officeId, + ] as const, + previewHouseBl: (positionId: string, houseBlId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview", + positionId, + houseBlId, + officeId, + ] as const, + previewHouseBlEml: (positionId: string, houseBlId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview/eml", + positionId, + houseBlId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a house BL document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId })); + return WorkingDocumentsHouseBlApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetHouseBlData` + * @summary Get house BL document data + * @permission Requires `canUseGetHouseBlData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetHouseBlData = ( + { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId })); + return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateHouseBlData` + * @summary Update house BL document data + * @permission Requires `canUseUpdateHouseBlData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateHouseBlData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.updateHouseBlData, + { + positionId: string; + houseBlId: string; + officeId: string; + data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId })); + return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.getHouseBlData(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteHouseBl` + * @summary Delete house BL document + * @permission Requires `canUseDeleteHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } House BL document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteHouseBl = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.deleteHouseBl, + { positionId: string; houseBlId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId })); + return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewHouseBl` - recommended when file should be cached + * @summary Preview house BL document + * @permission Requires `canUsePreviewHouseBl` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseBl = ( + { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId })); + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewHouseBlMutation` - recommended when file should not be cached + * @summary Preview house BL document + * @permission Requires `canUsePreviewHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseBlMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.previewHouseBl, + { positionId: string; houseBlId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId })); + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [ + keys.previewHouseBl(positionId, houseBlId, officeId), + keys.previewHouseBlEml(positionId, houseBlId, officeId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewHouseBlEml` - recommended when file should be cached + * @summary Preview house BL document and return EML file + * @permission Requires `canUsePreviewHouseBlEml` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseBlEml = ( + { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId })); + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewHouseBlEmlMutation` - recommended when file should not be cached + * @summary Preview house BL document and return EML file + * @permission Requires `canUsePreviewHouseBlEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewHouseBlEmlMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.previewHouseBlEml, + { positionId: string; houseBlId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId })); + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [ + keys.previewHouseBl(positionId, houseBlId, officeId), + keys.previewHouseBlEml(positionId, houseBlId, officeId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateHouseBl` + * @summary Generate house BL document + * @permission Requires `canUseGenerateHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateHouseBl = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.generateHouseBl, + { positionId: string; houseBlId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId })); + return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate house BL document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGenerateDocumentEml = ( + options?: AppMutationOptions< + typeof WorkingDocumentsHouseBlApi.generateDocumentEml, + { positionId: string; houseBlId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId })); + return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [ + keys.previewHouseBl(positionId, houseBlId, officeId), + keys.previewHouseBlEml(positionId, houseBlId, officeId), + ]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts new file mode 100644 index 0000000..7d64f70 --- /dev/null +++ b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsIsfFormAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Create", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; + + /** + * Use for `useGetIsfData` query ability. For global ability, omit the object parameter. + * @description Read ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetIsfData` query + */ + export const canUseGetIsfData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Read", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; + + /** + * Use for `useUpdateIsfData` mutation ability. For global ability, omit the object parameter. + * @description Update ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIsfData` mutation + */ + export const canUseUpdateIsfData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Update", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; + + /** + * Use for `useDeleteIsf` mutation ability. For global ability, omit the object parameter. + * @description Delete ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteIsf` mutation + */ + export const canUseDeleteIsf = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Delete", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; + + /** + * Use for `usePreviewIsf` query or `usePreviewIsfMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewIsf` query or `usePreviewIsfMutation` mutation + */ + export const canUsePreviewIsf = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Read", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; + + /** + * Use for `useGenerateIsf` mutation ability. For global ability, omit the object parameter. + * @description Generate ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIsf` mutation + */ + export const canUseGenerateIsf = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< + "Update", + "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts new file mode 100644 index 0000000..9c32533 --- /dev/null +++ b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts @@ -0,0 +1,74 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsIsfFormApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs`, + undefined, + config, + ); + }; + export const getIsfData = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + config, + ); + }; + export const updateIsfData = ( + positionId: string, + isfId: string, + officeId: string, + data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), + config, + ); + }; + export const deleteIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + undefined, + config, + ); + }; + export const previewIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generateIsf = ( + positionId: string, + isfId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts new file mode 100644 index 0000000..97121fe --- /dev/null +++ b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts @@ -0,0 +1,260 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsIsfFormModels { + /** + * IsfDocumentCargoCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ + export const IsfDocumentCargoCountryResponseDTOSchema = z + .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) + .readonly(); + export type IsfDocumentCargoCountryResponseDTO = z.infer; + + /** + * IsfDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } productCode Product code of the cargo + * @property { string } descriptionOfGoods Description of goods + * @property { string } htsCode HTS code of the cargo + * @property { string } manufacturerSupplier Manufacturer supplier of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + * @property { IsfDocumentCargoCountryResponseDTO } countryOfOrigin Country of origin of the cargo + */ + export const IsfDocumentCargoResponseDTOSchema = z + .object({ + productCode: z.string().describe("Product code of the cargo"), + descriptionOfGoods: z.string().describe("Description of goods"), + htsCode: z.string().describe("HTS code of the cargo"), + manufacturerSupplier: z.string().describe("Manufacturer supplier of the cargo"), + seal1: z.string().describe("Seal number 1 of the cargo"), + seal2: z.string().describe("Seal number 2 of the cargo"), + countryOfOrigin: IsfDocumentCargoCountryResponseDTOSchema.describe("Country of origin of the cargo"), + }) + .readonly(); + export type IsfDocumentCargoResponseDTO = z.infer; + + /** + * IsfDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ + export const IsfDocumentPortResponseDTOSchema = z + .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) + .readonly(); + export type IsfDocumentPortResponseDTO = z.infer; + + /** + * IsfDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + * @property { string } number Number of the business partner + */ + export const IsfDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + number: z.string().describe("Number of the business partner"), + }) + .readonly(); + export type IsfDocumentBusinessPartnerResponseDTO = z.infer; + + /** + * IsfDocumentContainerLocationResponseDTOSchema + * @type { object } + * @property { string } id ID of the container location + * @property { string } name Name of the container location + * @property { string } address Address of the container location + */ + export const IsfDocumentContainerLocationResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the container location"), + name: z.string().describe("Name of the container location"), + address: z.string().describe("Address of the container location"), + }) + .readonly(); + export type IsfDocumentContainerLocationResponseDTO = z.infer; + + /** + * IsfDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { number } versionNumber Version number of the document + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } hBLNumber HBL number + * @property { string } mBLNumber MBL number + * @property { string } scacCodeHBL SCAC code for HBL + * @property { string } scacCodeMBL SCAC code for MBL + * @property { IsfDocumentPortResponseDTO } portOfDischarge Port of discharge + * @property { string } issueLocation Issue location + * @property { string } issueDate Issue date + * @property { string } companyName Company name + * @property { object } completedBy + * @property { string } completedBy.name + * @property { string } completedBy.email + * @property { object } container + * @property { string } container.id + * @property { string } container.name + * @property { IsfDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { IsfDocumentBusinessPartnerResponseDTO } manufacturer Manufacturer information + * @property { IsfDocumentBusinessPartnerResponseDTO } seller Seller information + * @property { IsfDocumentBusinessPartnerResponseDTO } buyer Buyer information + * @property { IsfDocumentBusinessPartnerResponseDTO } consolidator Consolidator information + * @property { IsfDocumentContainerLocationResponseDTO } containerLocation Container location information + * @property { IsfDocumentBusinessPartnerResponseDTO } shipTo Ship to information + * @property { IsfDocumentBusinessPartnerResponseDTO } importer Importer information + * @property { IsfDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + */ + export const IsfDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the document"), + name: z.string().describe("Name of the document"), + nameSuffix: z.string().describe("Name suffix of the document").nullish(), + defaultFileName: z.string(), + positionId: z.string().describe("Position ID"), + positionNumber: z.string().describe("Position number"), + versionNumber: z.number().describe("Version number of the document"), + vessel: z.string().describe("Vessel name").nullish(), + voyage: z.string().describe("Voyage number").nullish(), + hBLNumber: z.string().describe("HBL number").nullish(), + mBLNumber: z.string().describe("MBL number").nullish(), + scacCodeHBL: z.string().describe("SCAC code for HBL").nullish(), + scacCodeMBL: z.string().describe("SCAC code for MBL").nullish(), + portOfDischarge: IsfDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), + issueLocation: z.string().describe("Issue location").nullish(), + issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), + companyName: z.string().describe("Company name").nullish(), + completedBy: z.object({ name: z.string(), email: z.string() }).readonly().nullish(), + container: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), + consignee: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), + manufacturer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Manufacturer information").nullish(), + seller: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Seller information").nullish(), + buyer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Buyer information").nullish(), + consolidator: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consolidator information").nullish(), + containerLocation: IsfDocumentContainerLocationResponseDTOSchema.describe( + "Container location information", + ).nullish(), + shipTo: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Ship to information").nullish(), + importer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Importer information").nullish(), + cargo: z.array(IsfDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), + config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + }) + .readonly(); + export type IsfDocumentResponseDTO = z.infer; + + /** + * UpdateIsfDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + * @property { string } number Business partner number + */ + export const UpdateIsfDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + number: z.string().describe("Business partner number"), + }) + .readonly(); + export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateIsfDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateIsfDocumentCargoRequestDTOSchema + * @type { object } + * @property { string } productCode Product code + * @property { string } descriptionOfGoods Description of goods + * @property { string } htsCode HTS code + * @property { string } manufacturerSupplier Manufacturer supplier + * @property { string } countryOfOriginId Country of origin ID + */ + export const UpdateIsfDocumentCargoRequestDTOSchema = z + .object({ + productCode: z.string().describe("Product code"), + descriptionOfGoods: z.string().describe("Description of goods"), + htsCode: z.string().describe("HTS code"), + manufacturerSupplier: z.string().describe("Manufacturer supplier"), + countryOfOriginId: z.string().describe("Country of origin ID"), + }) + .readonly(); + export type UpdateIsfDocumentCargoRequestDTO = z.infer; + + /** + * UpdateIsfDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } hBLNumber HBL number + * @property { string } mBLNumber MBL number + * @property { string } scacCodeHBL SCAC code for HBL + * @property { string } scacCodeMBL SCAC code for MBL + * @property { string } portOfDischargeId Port of discharge Id + * @property { string } issueLocation Issue location + * @property { string } issueDate Issue date + * @property { string } companyName Company name + * @property { string } completedByName Completed by name + * @property { string } completedByEmail Completed by email + * @property { string } containerId Container ID + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } manufacturer Manufacturer information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } seller Seller information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } buyer Buyer information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consolidator Consolidator information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } containerLocation Container location information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } shipTo Ship to information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } importer Importer information + * @property { UpdateIsfDocumentCargoRequestDTO[] } cargo Cargo information + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateIsfDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Name suffix"), + vessel: z.string().describe("Vessel name"), + voyage: z.string().describe("Voyage number"), + hBLNumber: z.string().describe("HBL number"), + mBLNumber: z.string().describe("MBL number"), + scacCodeHBL: z.string().describe("SCAC code for HBL"), + scacCodeMBL: z.string().describe("SCAC code for MBL"), + portOfDischargeId: z.string().describe("Port of discharge Id"), + issueLocation: z.string().describe("Issue location"), + issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), + companyName: z.string().describe("Company name"), + completedByName: z.string().describe("Completed by name"), + completedByEmail: z.string().describe("Completed by email"), + containerId: z.string().describe("Container ID"), + consignee: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), + manufacturer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Manufacturer information"), + seller: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), + buyer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), + consolidator: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consolidator information"), + containerLocation: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Container location information"), + shipTo: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Ship to information"), + importer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Importer information"), + cargo: z.array(UpdateIsfDocumentCargoRequestDTOSchema).readonly().describe("Cargo information"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateIsfDocumentRequestDTO = z.infer; +} diff --git a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts new file mode 100644 index 0000000..592b755 --- /dev/null +++ b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsIsfFormAcl } from "./workingDocumentsIsfForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsIsfFormApi } from "./workingDocumentsIsfForm.api"; + +export namespace WorkingDocumentsIsfFormQueries { + export const moduleName = QueryModule.WorkingDocumentsIsfForm; + + export const keys = { + all: [moduleName] as const, + getIsfData: (positionId: string, isfId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId", positionId, isfId, officeId] as const, + previewIsf: (positionId: string, isfId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/isfs/:isfId/preview", + positionId, + isfId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create an ISF document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId })); + return WorkingDocumentsIsfFormApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetIsfData` + * @summary Get ISF document data + * @permission Requires `canUseGetIsfData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.isfId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetIsfData = ( + { positionId, isfId, officeId }: { positionId: string; isfId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getIsfData(positionId, isfId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId })); + return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateIsfData` + * @summary Update ISF document data + * @permission Requires `canUseUpdateIsfData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateIsfData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsIsfFormApi.updateIsfData, + { + positionId: string; + isfId: string; + officeId: string; + data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId, data }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId })); + return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, isfId, officeId } = variables; + const updateKeys = [keys.getIsfData(positionId, isfId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteIsf` + * @summary Delete ISF document + * @permission Requires `canUseDeleteIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } ISF document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteIsf = ( + options?: AppMutationOptions< + typeof WorkingDocumentsIsfFormApi.deleteIsf, + { positionId: string; isfId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId })); + return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewIsf` - recommended when file should be cached + * @summary Preview ISF document + * @permission Requires `canUsePreviewIsf` ability + * @param { string } object.positionId Path parameter + * @param { string } object.isfId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewIsf = ( + { positionId, isfId, officeId }: { positionId: string; isfId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewIsf(positionId, isfId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId })); + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewIsfMutation` - recommended when file should not be cached + * @summary Preview ISF document + * @permission Requires `canUsePreviewIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewIsfMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsIsfFormApi.previewIsf, + { positionId: string; isfId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId })); + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, isfId, officeId } = variables; + const updateKeys = [keys.previewIsf(positionId, isfId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateIsf` + * @summary Generate ISF document + * @permission Requires `canUseGenerateIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateIsf = ( + options?: AppMutationOptions< + typeof WorkingDocumentsIsfFormApi.generateIsf, + { positionId: string; isfId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId, data }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId })); + return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts new file mode 100644 index 0000000..6d3d1a9 --- /dev/null +++ b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts @@ -0,0 +1,75 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsMasterAwbAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + ["Create", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Create", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; + + /** + * Use for `useGetMasterAwbData` query ability. For global ability, omit the object parameter. + * @description Read Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMasterAwbData` query + */ + export const canUseGetMasterAwbData = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Read", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; + + /** + * Use for `useUpdateMasterAwbData` mutation ability. For global ability, omit the object parameter. + * @description Update Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateMasterAwbData` mutation + */ + export const canUseUpdateMasterAwbData = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Update", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; + + /** + * Use for `useDeleteMasterAwb` mutation ability. For global ability, omit the object parameter. + * @description Delete Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteMasterAwb` mutation + */ + export const canUseDeleteMasterAwb = (object?: { officeId: string }) => + ["Delete", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Delete", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; + + /** + * Use for `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation + */ + export const canUsePreviewMasterAwb = (object?: { officeId: string }) => + ["Read", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Read", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; + + /** + * Use for `useGenerateMasterAwb` mutation ability. For global ability, omit the object parameter. + * @description Generate Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateMasterAwb` mutation + */ + export const canUseGenerateMasterAwb = (object?: { officeId: string }) => + ["Update", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< + "Update", + "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts new file mode 100644 index 0000000..59fe19b --- /dev/null +++ b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts @@ -0,0 +1,89 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsMasterAwbApi { + export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs`, + undefined, + config, + ); + }; + export const getMasterAwbData = ( + positionId: string, + mawbId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + config, + ); + }; + export const updateMasterAwbData = ( + positionId: string, + mawbId: string, + officeId: string, + data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), + config, + ); + }; + export const deleteMasterAwb = ( + positionId: string, + mawbId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + undefined, + config, + ); + }; + export const previewMasterAwb = ( + positionId: string, + mawbId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const generateMasterAwb = ( + positionId: string, + mawbId: string, + officeId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; +} diff --git a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts new file mode 100644 index 0000000..e4e0a26 --- /dev/null +++ b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts @@ -0,0 +1,311 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsMasterAwbModels { + /** + * MasterAwbDocumentOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + * @property { string } name Name + */ + export const MasterAwbDocumentOtherChargeDTOSchema = z + .object({ + chargeTypeId: z.string().describe("Charge type ID").nullish(), + sellRate: z.number().describe("Sell rate"), + name: z.string().describe("Name").nullish(), + }) + .readonly(); + export type MasterAwbDocumentOtherChargeDTO = z.infer; + + /** + * MasterAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { number } totalOtherCharges Total other charges + * @property { number } total Total + * @property { MasterAwbDocumentOtherChargeDTO[] } otherCharges Other charges + */ + export const MasterAwbDocumentChargesDTOSchema = z + .object({ + weightCharge: z.number().describe("Weight charge"), + totalOtherCharges: z.number().describe("Total other charges"), + total: z.number().describe("Total"), + otherCharges: z.array(MasterAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges"), + }) + .readonly(); + export type MasterAwbDocumentChargesDTO = z.infer; + + /** + * MasterAwbDocumentCargoDTOSchema + * @type { object } + * @property { number } quantity Quantity + * @property { number } grossWeight Gross weight + * @property { string } rateClass Rate class + * @property { string } commodityItemNo Commodity item number + * @property { number } rateOrCharge Rate or charge + * @property { number } total Total + * @property { string } description Description + */ + export const MasterAwbDocumentCargoDTOSchema = z + .object({ + quantity: z.number().describe("Quantity"), + grossWeight: z.number().describe("Gross weight").nullish(), + rateClass: z.string().describe("Rate class").nullish(), + commodityItemNo: z.string().describe("Commodity item number").nullish(), + rateOrCharge: z.number().describe("Rate or charge").nullish(), + total: z.number().describe("Total").nullish(), + description: z.string().describe("Description").nullish(), + }) + .readonly(); + export type MasterAwbDocumentCargoDTO = z.infer; + + /** + * MasterAwbDocumentRouteDTOSchema + * @type { object } + * @property { string } airportOfDeparture Airport of departure + * @property { string } airportOfDestination Airport of destination + * @property { string } toAirport1 To airport 1 + * @property { string } byCarrier1 By carrier 1 + * @property { string } toAirport2 To airport 2 + * @property { string } byCarrier2 By carrier 2 + * @property { string } toAirport3 To airport 3 + * @property { string } byCarrier3 By carrier 3 + * @property { string } flightNumber1 Flight number 1 + * @property { string } flightDay1 Flight day 1 + * @property { string } flightNumber2 Flight number 2 + * @property { string } flightDay2 Flight day 2 + */ + export const MasterAwbDocumentRouteDTOSchema = z + .object({ + airportOfDeparture: z.string().describe("Airport of departure"), + airportOfDestination: z.string().describe("Airport of destination"), + toAirport1: z.string().describe("To airport 1").nullish(), + byCarrier1: z.string().describe("By carrier 1").nullish(), + toAirport2: z.string().describe("To airport 2").nullish(), + byCarrier2: z.string().describe("By carrier 2").nullish(), + toAirport3: z.string().describe("To airport 3").nullish(), + byCarrier3: z.string().describe("By carrier 3").nullish(), + flightNumber1: z.string().describe("Flight number 1").nullish(), + flightDay1: z.string().describe("Flight day 1").nullish(), + flightNumber2: z.string().describe("Flight number 2").nullish(), + flightDay2: z.string().describe("Flight day 2").nullish(), + }) + .readonly(); + export type MasterAwbDocumentRouteDTO = z.infer; + + /** + * MasterAwbDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ + export const MasterAwbDocumentBusinessPartnerResponseDTOSchema = z + .object({ + id: z.string().describe("ID of the business partner"), + name: z.string().describe("Name of the business partner"), + address: z.string().describe("Address of the business partner"), + }) + .readonly(); + export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer< + typeof MasterAwbDocumentBusinessPartnerResponseDTOSchema + >; + + /** + * MasterAwbDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the Master AWB document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the Master AWB document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } currency Currency + * @property { number } versionNumber Version number of the document + * @property { string } mawbNumber MAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { MasterAwbDocumentCargoDTO[] } cargo Cargo packages + * @property { MasterAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } signingLocation Signing location + * @property { string } issuerIataCode Issuer IATA code + * @property { number } exchangeRate Exchange rate + * @property { MasterAwbDocumentRouteDTO } route Route + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } issuer Issuer + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { CommonModels.DocumentConfigDTO } config Config + */ + export const MasterAwbDocumentResponseDTOSchema = z + .object({ + id: z.string().describe("Unique identifier of the Master AWB document"), + positionId: z.string().describe("Unique identifier of the position this document belongs to"), + positionNumber: z.string().describe("Position number for reference"), + name: z.string().describe("Name of the Master AWB document"), + nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), + defaultFileName: z.string(), + currency: z.string().describe("Currency").nullish(), + versionNumber: z.number().describe("Version number of the document"), + mawbNumber: z.string().describe("MAWB number").nullish(), + sciReference: z.string().describe("SCI reference").nullish(), + reference1: z.string().describe("Reference 1").nullish(), + reference2: z.string().describe("Reference 2").nullish(), + reference3: z.string().describe("Reference 3").nullish(), + additionalText: CommonModels.EditorContentResponseDtoSchema.describe( + "Additional text for the document", + ).nullish(), + handlingInstructions: z.string().describe("Handling instructions").nullish(), + accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), + additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), + isSecured: z.boolean().describe("Is secured"), + suppressContainerWeight: z.boolean().describe("Suppress container weight"), + suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), + cargo: z.array(MasterAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), + charges: MasterAwbDocumentChargesDTOSchema.describe("Charges").nullish(), + shipperSigner: z.string().describe("Shipper signer").nullish(), + shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), + signer: z.string().describe("Signer").nullish(), + signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), + signingLocation: z.string().describe("Signing location").nullish(), + issuerIataCode: z.string().describe("Issuer IATA code").nullish(), + exchangeRate: z.number().describe("Exchange rate").nullish(), + route: MasterAwbDocumentRouteDTOSchema.describe("Route").nullish(), + consignee: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), + shipper: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), + issuer: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), + bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), + footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), + createdAt: z.iso.datetime({ offset: true }).describe("Created at"), + updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), + config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish(), + }) + .readonly(); + export type MasterAwbDocumentResponseDTO = z.infer; + + /** + * UpdateMasterAwbDocumentChargesOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + */ + export const UpdateMasterAwbDocumentChargesOtherChargeDTOSchema = z + .object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }) + .readonly(); + export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer< + typeof UpdateMasterAwbDocumentChargesOtherChargeDTOSchema + >; + + /** + * UpdateMasterAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { UpdateMasterAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges + */ + export const UpdateMasterAwbDocumentChargesDTOSchema = z + .object({ + weightCharge: z.number().describe("Weight charge"), + otherCharges: z.array(UpdateMasterAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges"), + }) + .readonly(); + export type UpdateMasterAwbDocumentChargesDTO = z.infer; + + /** + * UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ + export const UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema = z + .object({ + id: z.string().describe("Business partner ID"), + address: z.string().describe("Business partner address"), + }) + .readonly(); + export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer< + typeof UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema + >; + + /** + * UpdateMasterAwbDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } mawbNumber MAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { UpdateMasterAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } issuerId Issuer ID + * @property { string } issuerName Issuer name + * @property { string } issuerAddress Issuer address + * @property { string } issuerCity Issuer city + * @property { string } issuerIataCode Issuer IATA code + * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ + export const UpdateMasterAwbDocumentRequestDTOSchema = z + .object({ + nameSuffix: z.string().describe("Document name suffix"), + mawbNumber: z.string().describe("MAWB number"), + sciReference: z.string().describe("SCI reference"), + reference1: z.string().describe("Reference 1"), + reference2: z.string().describe("Reference 2"), + reference3: z.string().describe("Reference 3"), + additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text for the document"), + handlingInstructions: z.string().describe("Handling instructions"), + accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), + additionalAccountingNotes: z.string().describe("Additional accounting notes"), + isSecured: z.boolean().describe("Is secured"), + suppressContainerWeight: z.boolean().describe("Suppress container weight"), + suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), + charges: UpdateMasterAwbDocumentChargesDTOSchema.describe("Charges"), + shipperSigner: z.string().describe("Shipper signer"), + shipperSignerUserName: z.string().describe("Shipper signer user name"), + signer: z.string().describe("Signer"), + signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), + issuerId: z.string().describe("Issuer ID"), + issuerName: z.string().describe("Issuer name"), + issuerAddress: z.string().describe("Issuer address"), + issuerCity: z.string().describe("Issuer city"), + issuerIataCode: z.string().describe("Issuer IATA code"), + consignee: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), + shipper: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), + exchangeRate: z.number().describe("Exchange rate"), + bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), + footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), + }) + .readonly(); + export type UpdateMasterAwbDocumentRequestDTO = z.infer; +} diff --git a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts new file mode 100644 index 0000000..236a943 --- /dev/null +++ b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsMasterAwbAcl } from "./workingDocumentsMasterAwb.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsMasterAwbApi } from "./workingDocumentsMasterAwb.api"; + +export namespace WorkingDocumentsMasterAwbQueries { + export const moduleName = QueryModule.WorkingDocumentsMasterAwb; + + export const keys = { + all: [moduleName] as const, + getMasterAwbData: (positionId: string, mawbId: string, officeId: string) => + [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId", positionId, mawbId, officeId] as const, + previewMasterAwb: (positionId: string, mawbId: string, officeId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/mawbs/:mawbId/preview", + positionId, + mawbId, + officeId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a Master AWB document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId })); + return WorkingDocumentsMasterAwbApi.create(positionId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetMasterAwbData` + * @summary Get Master AWB document data + * @permission Requires `canUseGetMasterAwbData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.mawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetMasterAwbData = ( + { positionId, mawbId, officeId }: { positionId: string; mawbId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId })); + return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateMasterAwbData` + * @summary Update Master AWB document data + * @permission Requires `canUseUpdateMasterAwbData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateMasterAwbData = ( + options?: AppMutationOptions< + typeof WorkingDocumentsMasterAwbApi.updateMasterAwbData, + { + positionId: string; + mawbId: string; + officeId: string; + data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId, data }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId })); + return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, mawbId, officeId } = variables; + const updateKeys = [keys.getMasterAwbData(positionId, mawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteMasterAwb` + * @summary Delete Master AWB document + * @permission Requires `canUseDeleteMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Master AWB document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteMasterAwb = ( + options?: AppMutationOptions< + typeof WorkingDocumentsMasterAwbApi.deleteMasterAwb, + { positionId: string; mawbId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId })); + return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `usePreviewMasterAwb` - recommended when file should be cached + * @summary Preview Master AWB document + * @permission Requires `canUsePreviewMasterAwb` ability + * @param { string } object.positionId Path parameter + * @param { string } object.mawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ + export const usePreviewMasterAwb = ( + { positionId, mawbId, officeId }: { positionId: string; mawbId: string; officeId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId })); + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config); + }, + ...options, + }); + }; + + /** + * Mutation `usePreviewMasterAwbMutation` - recommended when file should not be cached + * @summary Preview Master AWB document + * @permission Requires `canUsePreviewMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const usePreviewMasterAwbMutation = ( + options?: AppMutationOptions< + typeof WorkingDocumentsMasterAwbApi.previewMasterAwb, + { positionId: string; mawbId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId })); + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, mawbId, officeId } = variables; + const updateKeys = [keys.previewMasterAwb(positionId, mawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateMasterAwb` + * @summary Generate Master AWB document + * @permission Requires `canUseGenerateMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useGenerateMasterAwb = ( + options?: AppMutationOptions< + typeof WorkingDocumentsMasterAwbApi.generateMasterAwb, + { positionId: string; mawbId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId, data }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId })); + return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts new file mode 100644 index 0000000..5e29a04 --- /dev/null +++ b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts @@ -0,0 +1,115 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsTemplatedDocumentAcl { + /** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ + export const canUseCreate = (object?: { officeId: string }) => + [ + "Create", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Create", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `useGetTemplatedDocument` query ability. For global ability, omit the object parameter. + * @description Read templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetTemplatedDocument` query + */ + export const canUseGetTemplatedDocument = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Read", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `useUpdateTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Update templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateTemplatedDocument` mutation + */ + export const canUseUpdateTemplatedDocument = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Update", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `useDeleteTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Delete templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteTemplatedDocument` mutation + */ + export const canUseDeleteTemplatedDocument = (object?: { officeId: string }) => + [ + "Delete", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Delete", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `usePreviewTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Preview templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewTemplatedDocument` mutation + */ + export const canUsePreviewTemplatedDocument = (object?: { officeId: string }) => + [ + "Read", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Read", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `useIssueTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Issue templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueTemplatedDocument` mutation + */ + export const canUseIssueTemplatedDocument = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Update", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; + + /** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate templated document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ + export const canUseGenerateDocumentEml = (object?: { officeId: string }) => + [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", + ] as AbilityTuple< + "Update", + | "WorkingDocument-templated-document" + | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) + >; +} diff --git a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts new file mode 100644 index 0000000..0997d7b --- /dev/null +++ b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts @@ -0,0 +1,117 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsTemplatedDocumentApi { + export const create = ( + positionId: string, + officeId: string, + data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), + config, + ); + }; + export const getTemplatedDocument = ( + officeId: string, + positionId: string, + templatedDocumentId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + config, + ); + }; + export const updateTemplatedDocument = ( + officeId: string, + positionId: string, + templatedDocumentId: string, + data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), + config, + ); + }; + export const deleteTemplatedDocument = ( + positionId: string, + templatedDocumentId: string, + officeId: string, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + undefined, + config, + ); + }; + export const previewTemplatedDocument = ( + officeId: string, + positionId: string, + templatedDocumentId: string, + data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/pdf", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; + export const issueTemplatedDocument = ( + officeId: string, + positionId: string, + templatedDocumentId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config, + ); + }; + export const generateDocumentEml = ( + officeId: string, + positionId: string, + templatedDocumentId: string, + data: CommonModels.GenerateWorkingDocumentRequestDto, + config?: AxiosRequestConfig, + ) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + Accept: "application/octet-stream", + }, + responseType: "blob", + rawResponse: true, + }, + ); + }; +} diff --git a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts new file mode 100644 index 0000000..a2d225e --- /dev/null +++ b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts @@ -0,0 +1,94 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsTemplatedDocumentModels { + /** + * TemplatedDocumentBlueprintDtoSchema + * @type { object } + * @property { string } templateId + * @property { string } templateName + * @property { string } capturedAt + * @property { CommonModels.TemplateBlocksResponseDTO } blocks + */ + export const TemplatedDocumentBlueprintDtoSchema = z + .object({ + templateId: z.string(), + templateName: z.string(), + capturedAt: z.string(), + blocks: CommonModels.TemplateBlocksResponseDTOSchema, + }) + .readonly(); + export type TemplatedDocumentBlueprintDto = z.infer; + + /** + * TemplatedDocumentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } officeId + * @property { string } name + * @property { string } nameSuffix + * @property { string } defaultFileName + * @property { number } versionNumber + * @property { TemplatedDocumentBlueprintDto } blueprint Captured template blueprint + * @property { CommonModels.TemplatedDocumentDataDto } data Document data + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } issuedAt + */ + export const TemplatedDocumentResponseDtoSchema = z + .object({ + id: z.string(), + positionId: z.string(), + officeId: z.string(), + name: z.string(), + nameSuffix: z.string().nullish(), + defaultFileName: z.string(), + versionNumber: z.number(), + blueprint: TemplatedDocumentBlueprintDtoSchema.describe("Captured template blueprint"), + data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Document data"), + createdAt: z.iso.datetime({ offset: true }), + updatedAt: z.iso.datetime({ offset: true }), + issuedAt: z.iso.datetime({ offset: true }).nullish(), + }) + .readonly(); + export type TemplatedDocumentResponseDto = z.infer; + + /** + * UpdateTemplatedDocumentRequestDtoSchema + * @type { object } + * @property { string } nameSuffix Optional suffix for the document name + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data Partial document data to update + */ + export const UpdateTemplatedDocumentRequestDtoSchema = z + .object({ + nameSuffix: z.string().describe("Optional suffix for the document name"), + data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("Partial document data to update"), + }) + .readonly(); + export type UpdateTemplatedDocumentRequestDto = z.infer; + + /** + * CreateTemplatedDocumentRequestDtoSchema + * @type { object } + * @property { string } templateId Template ID to use for creating the document + * @property { string } nameSuffix Optional suffix for the document name + */ + export const CreateTemplatedDocumentRequestDtoSchema = z + .object({ + templateId: z.string().describe("Template ID to use for creating the document"), + nameSuffix: z.string().describe("Optional suffix for the document name").nullish(), + }) + .readonly(); + export type CreateTemplatedDocumentRequestDto = z.infer; + + /** + * GenerateWorkingDocumentPreviewRequestDtoSchema + * @type { object } + * @property { string } issuedAt + */ + export const GenerateWorkingDocumentPreviewRequestDtoSchema = z + .object({ issuedAt: z.iso.datetime({ offset: true }) }) + .readonly(); + export type GenerateWorkingDocumentPreviewRequestDto = z.infer; +} diff --git a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts new file mode 100644 index 0000000..ac57ead --- /dev/null +++ b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts @@ -0,0 +1,332 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsTemplatedDocumentAcl } from "./workingDocumentsTemplatedDocument.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsTemplatedDocumentApi } from "./workingDocumentsTemplatedDocument.api"; + +export namespace WorkingDocumentsTemplatedDocumentQueries { + export const moduleName = QueryModule.WorkingDocumentsTemplatedDocument; + + export const keys = { + all: [moduleName] as const, + getTemplatedDocument: (officeId: string, positionId: string, templatedDocumentId: string) => + [ + ...keys.all, + "/offices/:officeId/positions/:positionId/templated-documents/:templatedDocumentId", + officeId, + positionId, + templatedDocumentId, + ] as const, + }; + + /** + * Mutation `useCreate` + * @summary Create a templated document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useCreate = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.create, + { + positionId: string; + officeId: string; + data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data, config); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Query `useGetTemplatedDocument` + * @summary Get templated document data + * @permission Requires `canUseGetTemplatedDocument` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.templatedDocumentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ + export const useGetTemplatedDocument = ( + { + officeId, + positionId, + templatedDocumentId, + }: { officeId: string; positionId: string; templatedDocumentId: string }, + options?: AppQueryOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), + queryFn: () => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument( + officeId, + positionId, + templatedDocumentId, + config, + ); + }, + ...options, + }); + }; + + /** + * Mutation `useUpdateTemplatedDocument` + * @summary Update templated document data + * @permission Requires `canUseUpdateTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ + export const useUpdateTemplatedDocument = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument, + { + officeId: string; + positionId: string; + templatedDocumentId: string; + data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument( + officeId, + positionId, + templatedDocumentId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, templatedDocumentId } = variables; + const updateKeys = [keys.getTemplatedDocument(officeId, positionId, templatedDocumentId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useDeleteTemplatedDocument` + * @summary Delete templated document + * @permission Requires `canUseDeleteTemplatedDocument` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Templated document deleted + * @statusCodes [204, 401, 404] + */ + export const useDeleteTemplatedDocument = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument, + { positionId: string; templatedDocumentId: string; officeId: string } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, templatedDocumentId, officeId }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument( + positionId, + templatedDocumentId, + officeId, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `usePreviewTemplatedDocument` - recommended when file should not be cached + * @summary Preview templated document + * @permission Requires `canUsePreviewTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ + export const usePreviewTemplatedDocument = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument, + { + officeId: string; + positionId: string; + templatedDocumentId: string; + data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument( + officeId, + positionId, + templatedDocumentId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useIssueTemplatedDocument` + * @summary Issue templated document (generate final PDF) + * @permission Requires `canUseIssueTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ + export const useIssueTemplatedDocument = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument, + { + officeId: string; + positionId: string; + templatedDocumentId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument( + officeId, + positionId, + templatedDocumentId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; + + /** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate templated document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ + export const useGenerateDocumentEml = ( + options?: AppMutationOptions< + typeof WorkingDocumentsTemplatedDocumentApi.generateDocumentEml, + { + officeId: string; + positionId: string; + templatedDocumentId: string; + data: CommonModels.GenerateWorkingDocumentRequestDto; + } + > & + MutationEffectsOptions, + config?: AxiosRequestConfig, + ) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId })); + return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml( + officeId, + positionId, + templatedDocumentId, + data, + config, + ); + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); + }; +} diff --git a/test/generated/dist/zod.extended.ts b/test/generated/dist/zod.extended.ts new file mode 100644 index 0000000..205405c --- /dev/null +++ b/test/generated/dist/zod.extended.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; + +export namespace ZodExtended { + interface ParseOptions { + type: "body" | "query"; + name?: string; + errorHandler?: ErrorHandler; + } + + export function parse( + schema: z.ZodType, + data: unknown, + { type, name, errorHandler }: ParseOptions = { type: "body" }, + ) { + try { + return schema.parse(data); + } catch (e) { + if (e instanceof z.ZodError) { + e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; + } + (errorHandler ?? SharedErrorHandler).rethrowError(e); + throw e; + } + } + + function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { + if (data === undefined || data === "" || enumSchema.options.length === 0) { + return true; + } + + const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; + const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; + return new RegExp(`^${commaSeparatedOptions}$`).test(data); + } + + export const sortExp = (enumSchema: z.ZodEnum) => + z.string().superRefine((arg, ctx) => { + if (!isSortExpValid(enumSchema, arg)) { + ctx.addIssue({ + code: "invalid_value", + message: "Invalid sorting string.", + values: [], + }); + } + }); +} diff --git a/test/generated/full/aWBStocks/aWBStocks.acl.ts b/test/generated/full/aWBStocks/aWBStocks.acl.ts new file mode 100644 index 0000000..ab8512e --- /dev/null +++ b/test/generated/full/aWBStocks/aWBStocks.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace AWBStocksAcl { +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List AWB stocks + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Create", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get AWB stock details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useGenerateNextNumber` mutation ability. For global ability, omit the object parameter. + * @description Generate next AWB number + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateNextNumber` mutation + */ +export const canUseGenerateNextNumber = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +} diff --git a/test/generated/full/aWBStocks/aWBStocks.api.ts b/test/generated/full/aWBStocks/aWBStocks.api.ts new file mode 100644 index 0000000..a71912d --- /dev/null +++ b/test/generated/full/aWBStocks/aWBStocks.api.ts @@ -0,0 +1,71 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { AWBStocksModels } from "./aWBStocks.models"; + +export namespace AWBStocksApi { +export const paginate = (officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, + `/offices/${officeId}/awb-stocks`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: AWBStocksModels.CreateAWBStockRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks`, + ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), + config + ) +}; +export const findById = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}`, + config + ) +}; +export const update = (stockId: string, officeId: string, data: AWBStocksModels.UpdateAWBStockRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}`, + ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), + config + ) +}; +export const archive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}/archive`, + undefined, + config + ) +}; +export const unarchive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, + undefined, + config + ) +}; +export const generateNextNumber = (officeId: string, data: AWBStocksModels.GenerateAWBNumberRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/generate-number`, + ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/aWBStocks/aWBStocks.configs.ts b/test/generated/full/aWBStocks/aWBStocks.configs.ts new file mode 100644 index 0000000..66cd58d --- /dev/null +++ b/test/generated/full/aWBStocks/aWBStocks.configs.ts @@ -0,0 +1,92 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { AWBStocksModels } from "./aWBStocks.models"; +import { AWBStocksQueries } from "./aWBStocks.queries"; +import { AWBStocksAcl } from "./aWBStocks.acl"; + +export namespace AWBStocksConfigs { +export const awbStocksConfig = { + meta: { + title: "Awb Stocks", + }, + readAll: { + acl: AWBStocksAcl.canUsePaginate, + schema: AWBStocksModels.AWBStockResponseDTOSchema, + paginated: AWBStocksQueries.usePaginate, + infinite: AWBStocksQueries.usePaginateInfinite, + filters: { + schema: AWBStocksModels.AWBStockFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AWBStocksModels.AWBStockFilterDtoSchema, + options: { + inputs: { + archived: true, + carrierId: true, + searchQuery: true, + used: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: AWBStocksModels.AWBStockResponseDTOSchema, + options: { + columns: { + id: true, + carrier: true, + startNumber: true, + lastUsedNumber: true, + stock: true, + usedCodes: true, + priority: true, + archived: true, + comments: true, + createdAt: true, + updatedAt: true, + createdBy: true, + updatedBy: true, + officeId: true, + }, + sortable: AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: AWBStocksAcl.canUseFindById, + schema: AWBStocksModels.AWBStockResponseDTOSchema, + query: AWBStocksQueries.useFindById, + }, + create: { + acl: AWBStocksAcl.canUseCreate, + schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, + mutation: AWBStocksQueries.useCreate, + inputDefs: dynamicInputs({ + schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, + options: { + inputs: { + carrierId: true, + startNumber: true, + stock: true, + priority: true, + comments: true, + officeId: true, + }, + }, +}) + }, + update: { + acl: AWBStocksAcl.canUseUpdate, + schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, + mutation: AWBStocksQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, + options: { + inputs: { + comments: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/full/aWBStocks/aWBStocks.models.ts b/test/generated/full/aWBStocks/aWBStocks.models.ts new file mode 100644 index 0000000..442057c --- /dev/null +++ b/test/generated/full/aWBStocks/aWBStocks.models.ts @@ -0,0 +1,114 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace AWBStocksModels { +/** + * AWBStockBusinessPartnerPreviewDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } name Business partner name + * @property { string } carrierPrefix Carrier prefix (3 digits) + */ +export const AWBStockBusinessPartnerPreviewDTOSchema = z.object({ id: z.string().describe("Business partner ID"), name: z.string().describe("Business partner name"), carrierPrefix: z.string().describe("Carrier prefix (3 digits)") }).readonly(); +export type AWBStockBusinessPartnerPreviewDTO = z.infer; + +/** + * AWBStockEmployeePreviewDTOSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Employee email + */ +export const AWBStockEmployeePreviewDTOSchema = z.object({ id: z.string().describe("Employee ID"), email: z.string().describe("Employee email") }).readonly(); +export type AWBStockEmployeePreviewDTO = z.infer; + +/** + * AWBStockResponseDTOSchema + * @type { object } + * @property { string } id AWB stock ID + * @property { AWBStockBusinessPartnerPreviewDTO } carrier Carrier business partner + * @property { number } startNumber Start number + * @property { number } lastUsedNumber Last used number + * @property { number } stock Stock size + * @property { number } usedCodes Used codes count + * @property { number } priority Priority + * @property { boolean } archived Is archived + * @property { string } comments Comments + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { AWBStockEmployeePreviewDTO } createdBy User who created the stock + * @property { AWBStockEmployeePreviewDTO } updatedBy User who updated the stock + * @property { string } officeId Office ID + */ +export const AWBStockResponseDTOSchema = z.object({ id: z.string().describe("AWB stock ID"), carrier: AWBStockBusinessPartnerPreviewDTOSchema.describe("Carrier business partner"), startNumber: z.number().describe("Start number"), lastUsedNumber: z.number().describe("Last used number").nullish(), stock: z.number().describe("Stock size"), usedCodes: z.number().describe("Used codes count"), priority: z.number().describe("Priority"), archived: z.boolean().describe("Is archived"), comments: z.string().describe("Comments").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), createdBy: AWBStockEmployeePreviewDTOSchema.describe("User who created the stock"), updatedBy: AWBStockEmployeePreviewDTOSchema.describe("User who updated the stock").nullish(), officeId: z.string().describe("Office ID") }).readonly(); +export type AWBStockResponseDTO = z.infer; + +/** + * AWBStockFilterDtoSchema + * @type { object } + * @property { boolean } archived + * @property { string } carrierId + * @property { string } searchQuery + * @property { boolean } used + */ +export const AWBStockFilterDtoSchema = z.object({ archived: z.boolean(), carrierId: z.string(), searchQuery: z.string(), used: z.boolean() }).readonly(); +export type AWBStockFilterDto = z.infer; + +/** + * CreateAWBStockRequestDTOSchema + * @type { object } + * @property { string } carrierId Carrier business partner ID + * @property { number } startNumber Start number. Minimum: `0` + * @property { number } stock Stock size + * @property { number } priority Priority + * @property { string } comments Comments + * @property { string } officeId Office ID + */ +export const CreateAWBStockRequestDTOSchema = z.object({ carrierId: z.string().describe("Carrier business partner ID"), startNumber: z.number().gte(0).describe("Start number"), stock: z.number().describe("Stock size"), priority: z.number().describe("Priority"), comments: z.string().describe("Comments").nullish(), officeId: z.string().describe("Office ID") }).readonly(); +export type CreateAWBStockRequestDTO = z.infer; + +/** + * GenerateAWBNumberRequestDTOSchema + * @type { object } + * @property { string } carrierId Carrier ID. Example: `e847c7dd-a364-4488-bed6-1e5878aff022` + */ +export const GenerateAWBNumberRequestDTOSchema = z.object({ carrierId: z.string().describe("Carrier ID") }).readonly(); +export type GenerateAWBNumberRequestDTO = z.infer; + +/** + * GenerateAWBNumberResponseDTOSchema + * @type { object } + * @property { string } formattedAwbNumber Generated AWB number. Example: `123-45678901` + */ +export const GenerateAWBNumberResponseDTOSchema = z.object({ formattedAwbNumber: z.string().describe("Generated AWB number") }).readonly(); +export type GenerateAWBNumberResponseDTO = z.infer; + +/** + * UpdateAWBStockRequestDTOSchema + * @type { object } + * @property { string } comments Comments + */ +export const UpdateAWBStockRequestDTOSchema = z.object({ comments: z.string().describe("Comments") }).readonly(); +export type UpdateAWBStockRequestDTO = z.infer; + +/** + * AWBStocksPaginateOrderParamEnumSchema + * @type { enum } + */ +export const AWBStocksPaginateOrderParamEnumSchema = z.enum(["createdAt", "updatedAt", "createdBy", "updatedBy", "carrierName", "startNumber", "priority"]); +export type AWBStocksPaginateOrderParamEnum = z.infer; +export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSchema.enum; + +/** + * AWBStocksPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { AWBStockResponseDTO[] } items + */ +export const AWBStocksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AWBStockResponseDTOSchema).readonly() }).readonly().shape }); +export type AWBStocksPaginateResponse = z.infer; + +} diff --git a/test/generated/full/aWBStocks/aWBStocks.queries.ts b/test/generated/full/aWBStocks/aWBStocks.queries.ts new file mode 100644 index 0000000..7c0a52a --- /dev/null +++ b/test/generated/full/aWBStocks/aWBStocks.queries.ts @@ -0,0 +1,242 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AWBStocksAcl } from "./aWBStocks.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AWBStocksModels } from "./aWBStocks.models"; +import { AWBStocksApi } from "./aWBStocks.api"; + +export namespace AWBStocksQueries { +export const moduleName = QueryModule.AWBStocks; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (stockId: string, officeId: string) => [...keys.all, "/offices/:officeId/awb-stocks/:stockId", stockId, officeId] as const, +}; + +/** + * Query `usePaginate` + * @summary List AWB stocks + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` + * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); + return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary List AWB stocks + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` + * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); + return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create AWB stock + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.CreateAWBStockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(AWBStocksAcl.canUseCreate({ officeId } )); + return AWBStocksApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get AWB stock details + * @permission Requires `canUseFindById` ability + * @param { string } object.stockId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ stockId, officeId }: { stockId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(stockId, officeId), + queryFn: () => { + checkAcl(AWBStocksAcl.canUseFindById({ officeId } )); + return AWBStocksApi.findById(stockId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update AWB stock comments + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.UpdateAWBStockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId, data }) => { + checkAcl(AWBStocksAcl.canUseUpdate({ officeId } )); + return AWBStocksApi.update(stockId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive AWB stock + * @permission Requires `canUseArchive` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId }) => { + checkAcl(AWBStocksAcl.canUseArchive({ officeId } )); + return AWBStocksApi.archive(stockId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive AWB stock + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId }) => { + checkAcl(AWBStocksAcl.canUseUnarchive({ officeId } )); + return AWBStocksApi.unarchive(stockId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateNextNumber` + * @summary Generate next AWB number for carrier + * @permission Requires `canUseGenerateNextNumber` ability + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.GenerateAWBNumberRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateNextNumber = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId } )); + return AWBStocksApi.generateNextNumber(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/acl/app.ability.ts b/test/generated/full/acl/app.ability.ts new file mode 100644 index 0000000..7b598a8 --- /dev/null +++ b/test/generated/full/acl/app.ability.ts @@ -0,0 +1,32 @@ +import { PureAbility, AbilityTuple, ForcedSubject } from "@casl/ability"; + +export type AppAbilities = +| AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, } | "Office" | "Currency" | "Country" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | ForcedSubject<"Role"> & { context?: string, } | "Permission" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId?: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, } | ForcedSubject<"Office"> & { officeId: string, }> +| AbilityTuple<"Create", "Office" | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "Airport" | "Port" | "ContainerYard" | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> +| AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, } | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }> +| AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "PackageType" | "ChargeType" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> +| AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "Terminal" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }> +| AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }> +| AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> +| AbilityTuple<"ListRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> +| AbilityTuple<"UpdateRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> +| AbilityTuple<"Deactivate", "Customer"> +| AbilityTuple<"Reactivate", "Customer"> +| AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, } | "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }> +| AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> +| AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }> +| AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }> + +export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/full/acl/useAclCheck.ts b/test/generated/full/acl/useAclCheck.ts new file mode 100644 index 0000000..95b4403 --- /dev/null +++ b/test/generated/full/acl/useAclCheck.ts @@ -0,0 +1,21 @@ +import { AbilityTuple } from "@casl/ability"; +import { type ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; +import { AbilityContext } from "@povio/openapi-codegen-cli/acl"; +import { useCallback } from "react"; +import { AppAbilities } from "@/data/acl/app.ability"; + +interface UseAclCheckProps { + errorHandler?: ErrorHandler; +} + +export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { + const ability = AbilityContext.useAbility(); + + const checkAcl = useCallback((appAbility: AppAbilities) => { + if (!ability.can(...(appAbility as AbilityTuple))) { + (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); + } + }, [ability, errorHandler]); + + return { checkAcl }; +} diff --git a/test/generated/full/airPositions/airPositions.acl.ts b/test/generated/full/airPositions/airPositions.acl.ts new file mode 100644 index 0000000..6c0afca --- /dev/null +++ b/test/generated/full/airPositions/airPositions.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace AirPositionsAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get air position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update air position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/full/airPositions/airPositions.api.ts b/test/generated/full/airPositions/airPositions.api.ts new file mode 100644 index 0000000..396d280 --- /dev/null +++ b/test/generated/full/airPositions/airPositions.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { AirPositionsModels } from "./airPositions.models"; + +export namespace AirPositionsApi { +export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/air-position`, + config + ) +}; +export const update = (officeId: string, positionId: string, data: AirPositionsModels.UpdateAirPositionRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/air-position`, + ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/airPositions/airPositions.models.ts b/test/generated/full/airPositions/airPositions.models.ts new file mode 100644 index 0000000..c2dc2e1 --- /dev/null +++ b/test/generated/full/airPositions/airPositions.models.ts @@ -0,0 +1,49 @@ +import { z } from "zod"; + +export namespace AirPositionsModels { +/** + * AirPositionCustomsStatusTypeEnumSchema + * @type { enum } + */ +export const AirPositionCustomsStatusTypeEnumSchema = z.enum(["Other", "X", "C", "TD", "T1"]); +export type AirPositionCustomsStatusTypeEnum = z.infer; +export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnumSchema.enum; + +/** + * AirPositionResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } hawbNumber + * @property { string } mawbNumber + * @property { string } airlineDeadline + * @property { string } customsStatus + * @property { AirPositionCustomsStatusTypeEnum } customsStatusType + * @property { boolean } hawbRequired + * @property { boolean } mawbRequired + * @property { string } mrnT1Number + * @property { boolean } isCourier + * @property { string } deliveryToConsignee + * @property { string } createdAt + * @property { string } updatedAt + */ +export const AirPositionResponseDTOSchema = z.object({ id: z.string(), hawbNumber: z.string().nullish(), mawbNumber: z.string().nullish(), airlineDeadline: z.iso.datetime({ offset: true }).nullish(), customsStatus: z.string().nullish(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), mrnT1Number: z.string().nullish(), isCourier: z.boolean().nullish(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type AirPositionResponseDTO = z.infer; + +/** + * UpdateAirPositionRequestDTOSchema + * @type { object } + * @property { string } hawbNumber + * @property { string } mawbNumber + * @property { string } airlineDeadline + * @property { string } customsStatus + * @property { AirPositionCustomsStatusTypeEnum } customsStatusType + * @property { string } mrnT1Number + * @property { boolean } hawbRequired + * @property { boolean } mawbRequired + * @property { boolean } isCourier + * @property { string } deliveryToConsignee + */ +export const UpdateAirPositionRequestDTOSchema = z.object({ hawbNumber: z.string(), mawbNumber: z.string(), airlineDeadline: z.iso.datetime({ offset: true }), customsStatus: z.string(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema, mrnT1Number: z.string(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), isCourier: z.boolean(), deliveryToConsignee: z.iso.datetime({ offset: true }) }).readonly(); +export type UpdateAirPositionRequestDTO = z.infer; + +} diff --git a/test/generated/full/airPositions/airPositions.queries.ts b/test/generated/full/airPositions/airPositions.queries.ts new file mode 100644 index 0000000..42c382c --- /dev/null +++ b/test/generated/full/airPositions/airPositions.queries.ts @@ -0,0 +1,71 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AirPositionsAcl } from "./airPositions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AirPositionsModels } from "./airPositions.models"; +import { AirPositionsApi } from "./airPositions.api"; + +export namespace AirPositionsQueries { +export const moduleName = QueryModule.AirPositions; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/air-position", officeId, positionId] as const, +}; + +/** + * Query `useGet` + * @summary Get air position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(AirPositionsAcl.canUseGet({ officeId } )); + return AirPositionsApi.get(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update air position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AirPositionsModels.UpdateAirPositionRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(AirPositionsAcl.canUseUpdate({ officeId } )); + return AirPositionsApi.update(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/airports/airports.acl.ts b/test/generated/full/airports/airports.acl.ts new file mode 100644 index 0000000..1af795c --- /dev/null +++ b/test/generated/full/airports/airports.acl.ts @@ -0,0 +1,54 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace AirportsAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Airport" +] as AbilityTuple<"Read", "Airport">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Airport" +] as AbilityTuple<"Create", "Airport">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Airport" +] as AbilityTuple<"Read", "Airport">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Airport" +] as AbilityTuple<"Update", "Airport">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Airport" +] as AbilityTuple<"Read", "Airport">; + +} diff --git a/test/generated/full/airports/airports.api.ts b/test/generated/full/airports/airports.api.ts new file mode 100644 index 0000000..13b15e1 --- /dev/null +++ b/test/generated/full/airports/airports.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { AirportsModels } from "./airports.models"; + +export namespace AirportsApi { +export const paginate = (limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AirportsModels.AirportsPaginateResponseSchema }, + `/airports`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: AirportsModels.CreateAirportRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports`, + ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, + `/airports/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports/${id}`, + ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports/${id}`, + config + ) +}; +} diff --git a/test/generated/full/airports/airports.configs.ts b/test/generated/full/airports/airports.configs.ts new file mode 100644 index 0000000..9b47119 --- /dev/null +++ b/test/generated/full/airports/airports.configs.ts @@ -0,0 +1,118 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { AirportsModels } from "./airports.models"; +import { CommonModels } from "@/data/common/common.models"; +import { AirportsQueries } from "./airports.queries"; +import { AirportsAcl } from "./airports.acl"; + +export namespace AirportsConfigs { +export const airportsConfig = { + meta: { + title: "Airports", + }, + readAll: { + acl: AirportsAcl.canUsePaginate, + schema: AirportsModels.AirportResponseDTOSchema, + paginated: AirportsQueries.usePaginate, + infinite: AirportsQueries.usePaginateInfinite, + filters: { + schema: AirportsModels.AirportPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AirportsModels.AirportPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: AirportsModels.AirportResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + iataCode: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: AirportsModels.AirportsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: AirportsAcl.canUseFindById, + schema: AirportsModels.AirportResponseDTOSchema, + query: AirportsQueries.useFindById, + }, + create: { + acl: AirportsAcl.canUseCreate, + schema: AirportsModels.CreateAirportRequestDTOSchema, + mutation: AirportsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: AirportsModels.CreateAirportRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + iataCode: true, + }, + }, +}) + }, + update: { + acl: AirportsAcl.canUseUpdate, + schema: AirportsModels.UpdateAirportRequestDTOSchema, + mutation: AirportsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: AirportsModels.UpdateAirportRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + iataCode: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: AirportsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: AirportsQueries.usePaginateLabels, + infinite: AirportsQueries.usePaginateLabelsInfinite, + filters: { + schema: AirportsModels.AirportLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AirportsModels.AirportLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/airports/airports.models.ts b/test/generated/full/airports/airports.models.ts new file mode 100644 index 0000000..d1d7c6c --- /dev/null +++ b/test/generated/full/airports/airports.models.ts @@ -0,0 +1,109 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace AirportsModels { +/** + * AirportEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type AirportEmployeeDTO = z.infer; + +/** + * AirportResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the airport + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + * @property { string } createdById + * @property { AirportEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { AirportEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const AirportResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the airport"), name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport"), createdById: z.string().nullish(), createdBy: AirportEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: AirportEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type AirportResponseDTO = z.infer; + +/** + * AirportPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter airports by name, match code or IATA code + */ +export const AirportPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter airports by name, match code or IATA code") }).readonly(); +export type AirportPaginationFilterDto = z.infer; + +/** + * AirportLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const AirportLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type AirportLabelFilterDto = z.infer; + +/** + * CreateAirportRequestDTOSchema + * @type { object } + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + */ +export const CreateAirportRequestDTOSchema = z.object({ name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport") }).readonly(); +export type CreateAirportRequestDTO = z.infer; + +/** + * UpdateAirportRequestDTOSchema + * @type { object } + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + */ +export const UpdateAirportRequestDTOSchema = z.object({ name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport") }).readonly(); +export type UpdateAirportRequestDTO = z.infer; + +/** + * AirportsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const AirportsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type AirportsPaginateOrderParamEnum = z.infer; +export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSchema.enum; + +/** + * AirportsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { AirportResponseDTO[] } items + */ +export const AirportsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AirportResponseDTOSchema).readonly() }).readonly().shape }); +export type AirportsPaginateResponse = z.infer; + +/** + * AirportsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const AirportsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type AirportsPaginateLabelsOrderParamEnum = z.infer; +export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * AirportsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const AirportsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type AirportsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/airports/airports.queries.ts b/test/generated/full/airports/airports.queries.ts new file mode 100644 index 0000000..027bf29 --- /dev/null +++ b/test/generated/full/airports/airports.queries.ts @@ -0,0 +1,209 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AirportsAcl } from "./airports.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AirportsModels } from "./airports.models"; +import { AirportsApi } from "./airports.api"; + +export namespace AirportsQueries { +export const moduleName = QueryModule.Airports; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string) => [...keys.all, "/airports", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string) => [...keys.all, "/airports/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/airports/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Airports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AirportsAcl.canUsePaginate()); + return AirportsApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Airports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AirportsAcl.canUsePaginate()); + return AirportsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create airport + * @permission Requires `canUseCreate` ability + * @param { AirportsModels.CreateAirportRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(AirportsAcl.canUseCreate()); + return AirportsApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate airports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AirportsAcl.canUsePaginateLabels()); + return AirportsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate airports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AirportsAcl.canUsePaginateLabels()); + return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update airport + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { AirportsModels.UpdateAirportRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(AirportsAcl.canUseUpdate()); + return AirportsApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get airport + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(AirportsAcl.canUseFindById()); + return AirportsApi.findById(id, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/app-rest-client.ts b/test/generated/full/app-rest-client.ts new file mode 100644 index 0000000..dc174bc --- /dev/null +++ b/test/generated/full/app-rest-client.ts @@ -0,0 +1,7 @@ +import { RestClient } from "@povio/openapi-codegen-cli"; + +export const AppRestClient = new RestClient({ + config: { + baseURL: "http://localhost:4000" + }, +}); diff --git a/test/generated/full/bankAccounts/bankAccounts.acl.ts b/test/generated/full/bankAccounts/bankAccounts.acl.ts new file mode 100644 index 0000000..18ce4b2 --- /dev/null +++ b/test/generated/full/bankAccounts/bankAccounts.acl.ts @@ -0,0 +1,24 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace BankAccountsAcl { +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Office" +] as AbilityTuple<"Read", "Office">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Office" +] as AbilityTuple<"Read", "Office">; + +} diff --git a/test/generated/full/bankAccounts/bankAccounts.api.ts b/test/generated/full/bankAccounts/bankAccounts.api.ts new file mode 100644 index 0000000..6a4092d --- /dev/null +++ b/test/generated/full/bankAccounts/bankAccounts.api.ts @@ -0,0 +1,37 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BankAccountsModels } from "./bankAccounts.models"; + +export namespace BankAccountsApi { +export const findAll = (search?: string, officeId?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, + `/bank-accounts/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, + `/bank-accounts/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/full/bankAccounts/bankAccounts.configs.ts b/test/generated/full/bankAccounts/bankAccounts.configs.ts new file mode 100644 index 0000000..23ecfc1 --- /dev/null +++ b/test/generated/full/bankAccounts/bankAccounts.configs.ts @@ -0,0 +1,43 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { BankAccountsModels } from "./bankAccounts.models"; +import { BankAccountsQueries } from "./bankAccounts.queries"; +import { BankAccountsAcl } from "./bankAccounts.acl"; + +export namespace BankAccountsConfigs { +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: BankAccountsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: BankAccountsQueries.usePaginateLabels, + infinite: BankAccountsQueries.usePaginateLabelsInfinite, + filters: { + schema: BankAccountsModels.BankAccountFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BankAccountsModels.BankAccountFilterDtoSchema, + options: { + inputs: { + search: true, + officeId: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/bankAccounts/bankAccounts.models.ts b/test/generated/full/bankAccounts/bankAccounts.models.ts new file mode 100644 index 0000000..2f5199f --- /dev/null +++ b/test/generated/full/bankAccounts/bankAccounts.models.ts @@ -0,0 +1,42 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BankAccountsModels { +/** + * BankAccountFilterDtoSchema + * @type { object } + * @property { string } search Search by name or bank name + * @property { string } officeId Office ID to filter by + */ +export const BankAccountFilterDtoSchema = z.object({ search: z.string().describe("Search by name or bank name"), officeId: z.string().describe("Office ID to filter by") }).readonly(); +export type BankAccountFilterDto = z.infer; + +/** + * BankAccountsFindAllResponseSchema + * @type { array } + */ +export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type BankAccountsFindAllResponse = z.infer; + +/** + * BankAccountsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const BankAccountsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "bankName", "createdAt", "updatedAt"]); +export type BankAccountsPaginateLabelsOrderParamEnum = z.infer; +export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * BankAccountsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const BankAccountsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type BankAccountsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/bankAccounts/bankAccounts.queries.ts b/test/generated/full/bankAccounts/bankAccounts.queries.ts new file mode 100644 index 0000000..0fa5c5d --- /dev/null +++ b/test/generated/full/bankAccounts/bankAccounts.queries.ts @@ -0,0 +1,97 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BankAccountsAcl } from "./bankAccounts.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { BankAccountsModels } from "./bankAccounts.models"; +import { BankAccountsApi } from "./bankAccounts.api"; + +export namespace BankAccountsQueries { +export const moduleName = QueryModule.BankAccounts; + +export const keys = { + all: [moduleName] as const, + findAll: (search?: string, officeId?: string) => [...keys.all, "/bank-accounts/labels", search, officeId] as const, + paginateLabels: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", "infinite", limit, order, filter, cursor] as const, +}; + +/** + * Query `useFindAll` + * @summary List all bank accounts with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { string } object.officeId Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ search, officeId }: { search?: string, officeId?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search, officeId), + queryFn: () => { + checkAcl(BankAccountsAcl.canUseFindAll()); + return BankAccountsApi.findAll(search, officeId, config) }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate bank account labels (id and name only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` + * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BankAccountsAcl.canUsePaginateLabels()); + return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate bank account labels (id and name only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` + * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BankAccountsAcl.canUsePaginateLabels()); + return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/full/bookkeepingExport/bookkeepingExport.acl.ts b/test/generated/full/bookkeepingExport/bookkeepingExport.acl.ts new file mode 100644 index 0000000..055a8b8 --- /dev/null +++ b/test/generated/full/bookkeepingExport/bookkeepingExport.acl.ts @@ -0,0 +1,134 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BookkeepingExportAcl { +/** + * Use for `useCreateBatch` mutation ability. For global ability, omit the object parameter. + * @description Create bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBatch` mutation + */ +export const canUseCreateBatch = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Create", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `usePaginateBatches` query ability. For global ability, omit the object parameter. + * @description List bookkeeping export batches + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatches` query + */ +export const canUsePaginateBatches = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useGetBatch` query ability. For global ability, omit the object parameter. + * @description Get bookkeeping export batch details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query + */ +export const canUseGetBatch = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useUpdateBatchFormat` mutation ability. For global ability, omit the object parameter. + * @description Update bookkeeping export batch format + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchFormat` mutation + */ +export const canUseUpdateBatchFormat = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useUpdateBatchItem` mutation ability. For global ability, omit the object parameter. + * @description Update bookkeeping export batch item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchItem` mutation + */ +export const canUseUpdateBatchItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `usePaginateBatchItems` query ability. For global ability, omit the object parameter. + * @description List batch items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatchItems` query + */ +export const canUsePaginateBatchItems = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useValidateBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Export bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useValidateBookkeepingBatch` mutation + */ +export const canUseValidateBookkeepingBatch = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useExportBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Export bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportBookkeepingBatch` mutation + */ +export const canUseExportBookkeepingBatch = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useRevertBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Revert bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertBookkeepingBatch` mutation + */ +export const canUseRevertBookkeepingBatch = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useGetVatLineItems` query ability. For global ability, omit the object parameter. + * @description Get VAT line items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetVatLineItems` query + */ +export const canUseGetVatLineItems = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +} diff --git a/test/generated/full/bookkeepingExport/bookkeepingExport.api.ts b/test/generated/full/bookkeepingExport/bookkeepingExport.api.ts new file mode 100644 index 0000000..db3d8bd --- /dev/null +++ b/test/generated/full/bookkeepingExport/bookkeepingExport.api.ts @@ -0,0 +1,107 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; + +export namespace BookkeepingExportApi { +export const createBatch = (officeId: string, data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, + `/offices/${officeId}/bookkeeping-exports`, + ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), + config + ) +}; +export const paginateBatches = (officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, + `/offices/${officeId}/bookkeeping-exports`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, + `/offices/${officeId}/bookkeeping-exports/${batchId}`, + config + ) +}; +export const updateBatchFormat = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, + `/offices/${officeId}/bookkeeping-exports/${batchId}`, + ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), + config + ) +}; +export const updateBatchItem = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, + ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), + config + ) +}; +export const paginateBatchItems = (officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, + `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const validateBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, + undefined, + config + ) +}; +export const exportBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, + undefined, + config + ) +}; +export const revertBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, + undefined, + config + ) +}; +export const getVatLineItems = (officeId: string, batchId: string, order?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, + `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + }, + } + ) +}; +} diff --git a/test/generated/full/bookkeepingExport/bookkeepingExport.configs.ts b/test/generated/full/bookkeepingExport/bookkeepingExport.configs.ts new file mode 100644 index 0000000..b28771d --- /dev/null +++ b/test/generated/full/bookkeepingExport/bookkeepingExport.configs.ts @@ -0,0 +1,123 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; +import { BookkeepingExportQueries } from "./bookkeepingExport.queries"; +import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; + +export namespace BookkeepingExportConfigs { +export const bookkeepingExportsConfig = { + meta: { + title: "Bookkeeping Exports", + }, + readAll: { + acl: BookkeepingExportAcl.canUsePaginateBatches, + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, + paginated: BookkeepingExportQueries.usePaginateBatches, + infinite: BookkeepingExportQueries.usePaginateBatchesInfinite, + filters: { + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, + options: { + inputs: { + createdDate: true, + status: true, + format: true, + createdBy: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, + options: { + columns: { + id: true, + format: true, + status: true, + totalInvoiceCount: true, + exportedInvoiceCount: true, + createdBy: true, + createdAt: true, + exportedAt: true, + revertedAt: true, + files: true, + }, + sortable: BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema, + }, +}), + }, + read: { + acl: BookkeepingExportAcl.canUseGetBatch, + schema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema, + query: BookkeepingExportQueries.useGetBatch, + }, + create: { + acl: BookkeepingExportAcl.canUseCreateBatch, + schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, + mutation: BookkeepingExportQueries.useCreateBatch, + inputDefs: dynamicInputs({ + schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, + options: { + inputs: { + format: true, + invoiceFilters: true, + }, + }, +}) + }, + update: { + acl: BookkeepingExportAcl.canUseUpdateBatchFormat, + schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, + mutation: BookkeepingExportQueries.useUpdateBatchFormat, + inputDefs: dynamicInputs({ + schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, + options: { + inputs: { + format: true, + }, + }, +}) + }, +}; + +export const itemsConfig = { + meta: { + title: "Items", + }, + readAll: { + acl: BookkeepingExportAcl.canUsePaginateBatchItems, + schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, + paginated: BookkeepingExportQueries.usePaginateBatchItems, + infinite: BookkeepingExportQueries.usePaginateBatchItemsInfinite, + filters: { + schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, + options: { + inputs: { + status: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, + options: { + columns: { + id: true, + invoiceId: true, + status: true, + includedInExport: true, + validationIssues: true, + invoice: true, + receiver: true, + comments: true, + }, + sortable: BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/bookkeepingExport/bookkeepingExport.models.ts b/test/generated/full/bookkeepingExport/bookkeepingExport.models.ts new file mode 100644 index 0000000..3d43eef --- /dev/null +++ b/test/generated/full/bookkeepingExport/bookkeepingExport.models.ts @@ -0,0 +1,293 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BookkeepingExportModels { +/** + * BookkeepingExportFormatEnumSchema + * @type { enum } + */ +export const BookkeepingExportFormatEnumSchema = z.enum(["Bmd", "BmdWithoutCost", "BmdHamburg", "Abra", "Pantheon"]); +export type BookkeepingExportFormatEnum = z.infer; +export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enum; + +/** + * CreateBookkeepingExportBatchRequestDtoSchema + * @type { object } + * @property { BookkeepingExportFormatEnum } format + * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters + */ +export const CreateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema.nullish(), invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema }).readonly(); +export type CreateBookkeepingExportBatchRequestDto = z.infer; + +/** + * BookkeepingExportFileTypeEnumSchema + * @type { enum } + */ +export const BookkeepingExportFileTypeEnumSchema = z.enum(["Invoices", "BusinessPartners", "Report", "AbraAddressBook", "AbraIssuedInvoices", "AbraIssuedInvoiceItems", "AbraReceivedInvoices", "AbraReceivedInvoiceItems", "PantheonInvoicesOutgoingEur", "PantheonInvoicesOutgoingUsd", "PantheonInvoicesIncomingEur", "PantheonInvoicesIncomingUsd", "PantheonCostCenters"]); +export type BookkeepingExportFileTypeEnum = z.infer; +export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema.enum; + +/** + * BookkeepingExportFileDtoSchema + * @type { object } + * @property { BookkeepingExportFileTypeEnum } variant + * @property { string } downloadUrl + * @property { string } fileName + */ +export const BookkeepingExportFileDtoSchema = z.object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }).readonly(); +export type BookkeepingExportFileDto = z.infer; + +/** + * BookkeepingExportBatchStatusEnumSchema + * @type { enum } + */ +export const BookkeepingExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Reverted", "Failed"]); +export type BookkeepingExportBatchStatusEnum = z.infer; +export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnumSchema.enum; + +/** + * BookkeepingExportBatchSummaryDtoSchema + * @type { object } + * @property { number } totalCount + * @property { number } needsReviewCount + * @property { number } readyForExportCount + * @property { number } excludedCount + * @property { object } invoiceNumberRange + * @property { string } invoiceNumberRange.from + * @property { string } invoiceNumberRange.to + * @property { object } dateRange + * @property { string } dateRange.from + * @property { string } dateRange.to + */ +export const BookkeepingExportBatchSummaryDtoSchema = z.object({ totalCount: z.number(), needsReviewCount: z.number(), readyForExportCount: z.number(), excludedCount: z.number(), invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).readonly().nullish(), dateRange: z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).readonly().nullish() }).readonly(); +export type BookkeepingExportBatchSummaryDto = z.infer; + +/** + * BookkeepingExportBatchDetailsDtoSchema + * @type { object } + * @property { string } id + * @property { BookkeepingExportFormatEnum } format + * @property { BookkeepingExportBatchStatusEnum } status + * @property { number } totalInvoiceCount + * @property { number } exportedInvoiceCount + * @property { object } createdBy + * @property { string } createdBy.id + * @property { string } createdBy.fullName + * @property { string } createdBy.email + * @property { string } createdAt + * @property { string } exportedAt + * @property { string } revertedAt + * @property { object } revertedBy + * @property { string } revertedBy.id + * @property { string } revertedBy.fullName + * @property { string } revertedBy.email + * @property { BookkeepingExportBatchSummaryDto } summary + * @property { BookkeepingExportFileDto[] } files + */ +export const BookkeepingExportBatchDetailsDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), revertedBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly().nullish(), summary: BookkeepingExportBatchSummaryDtoSchema, files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish() }).readonly(); +export type BookkeepingExportBatchDetailsDto = z.infer; + +/** + * UpdateBookkeepingExportBatchRequestDtoSchema + * @type { object } + * @property { BookkeepingExportFormatEnum } format + */ +export const UpdateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema }).readonly(); +export type UpdateBookkeepingExportBatchRequestDto = z.infer; + +/** + * BookkeepingExportBatchPreviewDtoSchema + * @type { object } + * @property { string } id + * @property { BookkeepingExportFormatEnum } format + * @property { BookkeepingExportBatchStatusEnum } status + * @property { number } totalInvoiceCount + * @property { number } exportedInvoiceCount + * @property { object } createdBy + * @property { string } createdBy.id + * @property { string } createdBy.fullName + * @property { string } createdBy.email + * @property { string } createdAt + * @property { string } exportedAt + * @property { string } revertedAt + * @property { BookkeepingExportFileDto[] } files + */ +export const BookkeepingExportBatchPreviewDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish() }).readonly(); +export type BookkeepingExportBatchPreviewDto = z.infer; + +/** + * DateRangeSchema + * @type { object } + * @property { string } from + * @property { string } to + */ +export const DateRangeSchema = z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).readonly(); +export type DateRange = z.infer; + +/** + * BookkeepingExportBatchPreviewFilterDtoSchema + * @type { object } + * @property { DateRange } createdDate + * @property { BookkeepingExportBatchStatusEnum[] } status + * @property { BookkeepingExportFormatEnum[] } format + * @property { string[] } createdBy + */ +export const BookkeepingExportBatchPreviewFilterDtoSchema = z.object({ createdDate: DateRangeSchema, status: z.array(BookkeepingExportBatchStatusEnumSchema).readonly(), format: z.array(BookkeepingExportFormatEnumSchema).readonly(), createdBy: z.array(z.string()).readonly() }).readonly(); +export type BookkeepingExportBatchPreviewFilterDto = z.infer; + +/** + * BookkeepingExportBatchItemStatusEnumSchema + * @type { enum } + */ +export const BookkeepingExportBatchItemStatusEnumSchema = z.enum(["Selected", "NeedsReview", "ReadyForExport", "Exported", "Excluded"]); +export type BookkeepingExportBatchItemStatusEnum = z.infer; +export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemStatusEnumSchema.enum; + +/** + * BookkeepingExportItemDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } invoiceId + * @property { BookkeepingExportBatchItemStatusEnum } status + * @property { boolean } includedInExport + * @property { string[] } validationIssues + * @property { object } invoice + * @property { string } invoice.invoiceNumber + * @property { string } invoice.issuingDate + * @property { string } invoice.currency + * @property { number } invoice.amount + * @property { number } invoice.tax + * @property { string[] } invoice.vatRules + * @property { object } receiver + * @property { string } receiver.id + * @property { string } receiver.name + * @property { string } receiver.matchCode + * @property { string } receiver.label + * @property { string } receiver.account + * @property { string } receiver.contraAccount + * @property { string } comments + */ +export const BookkeepingExportItemDetailDtoSchema = z.object({ id: z.string(), invoiceId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).readonly().nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), vatRules: z.array(z.string()).readonly() }).readonly(), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }).readonly(), comments: z.string().nullish() }).readonly(); +export type BookkeepingExportItemDetailDto = z.infer; + +/** + * BookkeepingExportItemDetailFilterDtoSchema + * @type { object } + * @property { BookkeepingExportBatchItemStatusEnum[] } status + */ +export const BookkeepingExportItemDetailFilterDtoSchema = z.object({ status: z.array(BookkeepingExportBatchItemStatusEnumSchema).readonly() }).readonly(); +export type BookkeepingExportItemDetailFilterDto = z.infer; + +/** + * BookkeepingExportVatLineItemDtoSchema + * @type { object } + * @property { string } invoiceId + * @property { string } batchId + * @property { string } batchItemId + * @property { BookkeepingExportBatchItemStatusEnum } status + * @property { boolean } includedInExport + * @property { string[] } validationIssues + * @property { object } invoice + * @property { string } invoice.invoiceNumber + * @property { string } invoice.issuingDate + * @property { string } invoice.currency + * @property { number } invoice.amount + * @property { number } invoice.tax + * @property { string } invoice.comments + * @property { object } receiver + * @property { string } receiver.id + * @property { string } receiver.name + * @property { string } receiver.matchCode + * @property { string } receiver.label + * @property { string } receiver.account + * @property { string } receiver.contraAccount + * @property { number } vatPercentage + * @property { string } vatRule + * @property { number } netAmount + * @property { number } vatAmount + * @property { number } grossAmount + * @property { number } vatAmountInOfficeCurrency + * @property { number } netAmountInOfficeCurrency + * @property { number } grossAmountInOfficeCurrency + * @property { string } officeCurrency + */ +export const BookkeepingExportVatLineItemDtoSchema = z.object({ invoiceId: z.string(), batchId: z.string(), batchItemId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).readonly().nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), comments: z.string().nullish() }).readonly(), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }).readonly(), vatPercentage: z.number(), vatRule: z.string(), netAmount: z.number(), vatAmount: z.number(), grossAmount: z.number(), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish(), officeCurrency: z.string() }).readonly(); +export type BookkeepingExportVatLineItemDto = z.infer; + +/** + * CreateBookkeepingExportBatchResponseDtoSchema + * @type { object } + * @property { string } batchId + */ +export const CreateBookkeepingExportBatchResponseDtoSchema = z.object({ batchId: z.string() }).readonly(); +export type CreateBookkeepingExportBatchResponseDto = z.infer; + +/** + * UpdateBookkeepingExportBatchItemRequestDtoSchema + * @type { object } + * @property { boolean } includedInExport Whether the item should be included in the export + * @property { string[] } itemIds Min Items: `0` + * @property { boolean } vatOk + * @property { boolean } invoiceOk + */ +export const UpdateBookkeepingExportBatchItemRequestDtoSchema = z.object({ includedInExport: z.boolean().describe("Whether the item should be included in the export").nullish(), itemIds: z.array(z.string()).readonly(), vatOk: z.boolean().nullish(), invoiceOk: z.boolean().nullish() }).readonly(); +export type UpdateBookkeepingExportBatchItemRequestDto = z.infer; + +/** + * PaginateBatchesOrderParamEnumSchema + * @type { enum } + */ +export const PaginateBatchesOrderParamEnumSchema = z.enum(["createdAt", "status", "format", "totalInvoiceCount"]); +export type PaginateBatchesOrderParamEnum = z.infer; +export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema.enum; + +/** + * PaginateBatchesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookkeepingExportBatchPreviewDto[] } items + */ +export const PaginateBatchesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).readonly() }).readonly().shape }); +export type PaginateBatchesResponse = z.infer; + +/** + * PaginateBatchItemsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateBatchItemsOrderParamEnumSchema = z.enum(["issuingDate"]); +export type PaginateBatchItemsOrderParamEnum = z.infer; +export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnumSchema.enum; + +/** + * PaginateBatchItemsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookkeepingExportItemDetailDto[] } items + */ +export const PaginateBatchItemsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).readonly() }).readonly().shape }); +export type PaginateBatchItemsResponse = z.infer; + +/** + * GetVatLineItemsOrderParamEnumSchema + * @type { enum } + */ +export const GetVatLineItemsOrderParamEnumSchema = z.enum(["account", "contraAccount", "issuingDate", "invoiceNumber", "receiver"]); +export type GetVatLineItemsOrderParamEnum = z.infer; +export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema.enum; + +/** + * GetVatLineItemsResponseSchema + * @type { array } + */ +export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema).readonly(); +export type GetVatLineItemsResponse = z.infer; + +} diff --git a/test/generated/full/bookkeepingExport/bookkeepingExport.queries.ts b/test/generated/full/bookkeepingExport/bookkeepingExport.queries.ts new file mode 100644 index 0000000..5281e85 --- /dev/null +++ b/test/generated/full/bookkeepingExport/bookkeepingExport.queries.ts @@ -0,0 +1,351 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; +import { BookkeepingExportApi } from "./bookkeepingExport.api"; + +export namespace BookkeepingExportQueries { +export const moduleName = QueryModule.BookkeepingExport; + +export const keys = { + all: [moduleName] as const, + paginateBatches: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", officeId, limit, order, filter, page, cursor] as const, + paginateBatchesInfinite: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", "infinite", officeId, limit, order, filter, cursor] as const, + getBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/:batchId", officeId, batchId] as const, + paginateBatchItems: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", officeId, batchId, limit, order, filter, page, cursor] as const, + paginateBatchItemsInfinite: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", "infinite", officeId, batchId, limit, order, filter, cursor] as const, + getVatLineItems: (officeId: string, batchId: string, order?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/vat-line-items", officeId, batchId, order] as const, +}; + +/** + * Mutation `useCreateBatch` + * @summary Create bookkeeping export batch + * @permission Requires `canUseCreateBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId } )); + return BookkeepingExportApi.createBatch(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateBatches` + * @summary List bookkeeping export batches + * @permission Requires `canUsePaginateBatches` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` + * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatches = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateBatchesInfinite + * @summary List bookkeeping export batches + * @permission Requires `canUsePaginateBatches` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` + * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatchesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetBatch` + * @summary Get bookkeeping export batch details + * @permission Requires `canUseGetBatch` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBatch(officeId, batchId), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId } )); + return BookkeepingExportApi.getBatch(officeId, batchId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateBatchFormat` + * @summary Update bookkeeping export batch format + * @permission Requires `canUseUpdateBatchFormat` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBatchFormat = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId, data }) => { + checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId } )); + return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, batchId } = variables; + const updateKeys = [keys.getBatch(officeId, batchId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateBatchItem` + * @summary Update bookkeeping export batch item inclusion + * @permission Requires `canUseUpdateBatchItem` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBatchItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId, data }) => { + checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId } )); + return BookkeepingExportApi.updateBatchItem(officeId, batchId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateBatchItems` + * @summary List batch items with filters and pagination + * @permission Requires `canUsePaginateBatchItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` + * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatchItems = ({ officeId, batchId, limit, order, filter, page, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); + return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateBatchItemsInfinite + * @summary List batch items with filters and pagination + * @permission Requires `canUsePaginateBatchItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` + * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatchItemsInfinite = ({ officeId, batchId, limit, order, filter, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); + return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useValidateBookkeepingBatch` + * @summary Validate bookkeeping batch + * @permission Requires `canUseValidateBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useValidateBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId } )); + return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useExportBookkeepingBatch` + * @summary Export bookkeeping batch + * @permission Requires `canUseExportBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useExportBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId } )); + return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRevertBookkeepingBatch` + * @summary Revert bookkeeping export batch + * @permission Requires `canUseRevertBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useRevertBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId } )); + return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetVatLineItems` + * @summary Get VAT line items for bookkeeping export batch + * @permission Requires `canUseGetVatLineItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): account, contraAccount, issuingDate, invoiceNumber, receiver. Example: `account` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetVatLineItems = ({ officeId, batchId, order }: { officeId: string, batchId: string, order?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getVatLineItems(officeId, batchId, order), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId } )); + return BookkeepingExportApi.getVatLineItems(officeId, batchId, order, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts new file mode 100644 index 0000000..1fc9403 --- /dev/null +++ b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnerBookkeepingMappingsAcl { +/** + * Use for `useGetBookkeepingMappings` query ability. For global ability, omit the object parameter. + * @description List business partner bookkeeping mappings + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBookkeepingMappings` query + */ +export const canUseGetBookkeepingMappings = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useCreateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Create business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBookkeepingMapping` mutation + */ +export const canUseCreateBookkeepingMapping = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; + +/** + * Use for `useUpdateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Update business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMapping` mutation + */ +export const canUseUpdateBookkeepingMapping = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; + +/** + * Use for `useUpdateBookkeepingMappingById` mutation ability. For global ability, omit the object parameter. + * @description Update business partner bookkeeping mapping by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMappingById` mutation + */ +export const canUseUpdateBookkeepingMappingById = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; + +/** + * Use for `useDeleteBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBookkeepingMapping` mutation + */ +export const canUseDeleteBookkeepingMapping = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Delete", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; + +} diff --git a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts new file mode 100644 index 0000000..b527abc --- /dev/null +++ b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts @@ -0,0 +1,47 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; + +export namespace BusinessPartnerBookkeepingMappingsApi { +export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + config + ) +}; +export const createBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), + config + ) +}; +export const updateBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), + config + ) +}; +export const updateBookkeepingMappingById = (officeId: string, businessPartnerId: string, id: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), + config + ) +}; +export const deleteBookkeepingMapping = (officeId: string, businessPartnerId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts new file mode 100644 index 0000000..90ad3ac --- /dev/null +++ b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts @@ -0,0 +1,62 @@ +import { z } from "zod"; + +export namespace BusinessPartnerBookkeepingMappingsModels { +/** + * BusinessPartnerBookkeepingMappingResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { string } businessPartnerId + * @property { boolean } paysTaxInEurForFactoring + */ +export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z.object({ id: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), currencyNotation: z.string().nullish(), businessPartnerId: z.string(), paysTaxInEurForFactoring: z.boolean().nullish() }).readonly(); +export type BusinessPartnerBookkeepingMappingResponseDto = z.infer; + +/** + * BusinessPartnerBookkeepingMappingsResponseDtoSchema + * @type { object } + * @property { BusinessPartnerBookkeepingMappingResponseDto[] } bookkeepingMappings + */ +export const BusinessPartnerBookkeepingMappingsResponseDtoSchema = z.object({ bookkeepingMappings: z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly() }).readonly(); +export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer; + +/** + * UpdateBookkeepingMappingDtoSchema + * @type { object } + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) + */ +export const UpdateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string(), creditorId: z.string(), currencyNotation: z.string(), paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)") }).readonly(); +export type UpdateBookkeepingMappingDto = z.infer; + +/** + * UpdateBookkeepingMappingRequestDtoSchema + * @type { object } + * @property { UpdateBookkeepingMappingDto[] } bookkeepingMappings + */ +export const UpdateBookkeepingMappingRequestDtoSchema = z.object({ bookkeepingMappings: z.array(UpdateBookkeepingMappingDtoSchema).readonly() }).readonly(); +export type UpdateBookkeepingMappingRequestDto = z.infer; + +/** + * CreateBookkeepingMappingDtoSchema + * @type { object } + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) + */ +export const CreateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string(), creditorId: z.string(), currencyNotation: z.string(), paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)") }).readonly(); +export type CreateBookkeepingMappingDto = z.infer; + +/** + * UpdateBookkeepingMappingResponseSchema + * @type { array } + */ +export const UpdateBookkeepingMappingResponseSchema = z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly(); +export type UpdateBookkeepingMappingResponse = z.infer; + +} diff --git a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts new file mode 100644 index 0000000..78fb4aa --- /dev/null +++ b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts @@ -0,0 +1,154 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnerBookkeepingMappingsAcl } from "./businessPartnerBookkeepingMappings.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; +import { BusinessPartnerBookkeepingMappingsApi } from "./businessPartnerBookkeepingMappings.api"; + +export namespace BusinessPartnerBookkeepingMappingsQueries { +export const moduleName = QueryModule.BusinessPartnerBookkeepingMappings; + +export const keys = { + all: [moduleName] as const, + getBookkeepingMappings: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/bookkeeping-mappings", officeId, businessPartnerId] as const, +}; + +/** + * Query `useGetBookkeepingMappings` + * @summary Fetch all bookkeeping mappings for a business partner + * @permission Requires `canUseGetBookkeepingMappings` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBookkeepingMappings = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), + queryFn: () => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateBookkeepingMapping` + * @summary Create a bookkeeping mapping for a business partner + * @permission Requires `canUseCreateBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping(officeId, businessPartnerId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateBookkeepingMapping` + * @summary Update an existing bookkeeping mapping for a business partner + * @permission Requires `canUseUpdateBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping(officeId, businessPartnerId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateBookkeepingMappingById` + * @summary Update a specific bookkeeping mapping by ID for a business partner + * @permission Requires `canUseUpdateBookkeepingMappingById` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBookkeepingMappingById = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, id, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById(officeId, businessPartnerId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteBookkeepingMapping` + * @summary Delete an existing bookkeeping mapping for a business partner + * @permission Requires `canUseDeleteBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, id }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/businessPartnerContacts/businessPartnerContacts.acl.ts b/test/generated/full/businessPartnerContacts/businessPartnerContacts.acl.ts new file mode 100644 index 0000000..ea3ab69 --- /dev/null +++ b/test/generated/full/businessPartnerContacts/businessPartnerContacts.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnerContactsAcl { +/** + * Use for `useGetContacts` query ability. For global ability, omit the object parameter. + * @description List business partner contacts + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetContacts` query + */ +export const canUseGetContacts = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useCreateContact` mutation ability. For global ability, omit the object parameter. + * @description Create business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateContact` mutation + */ +export const canUseCreateContact = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `usePaginateContactLabels` query ability. For global ability, omit the object parameter. + * @description Paginate business partner contact labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateContactLabels` query + */ +export const canUsePaginateContactLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateContact` mutation ability. For global ability, omit the object parameter. + * @description Update business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateContact` mutation + */ +export const canUseUpdateContact = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useDeleteContact` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteContact` mutation + */ +export const canUseDeleteContact = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +} diff --git a/test/generated/full/businessPartnerContacts/businessPartnerContacts.api.ts b/test/generated/full/businessPartnerContacts/businessPartnerContacts.api.ts new file mode 100644 index 0000000..45ab2f9 --- /dev/null +++ b/test/generated/full/businessPartnerContacts/businessPartnerContacts.api.ts @@ -0,0 +1,55 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; + +export namespace BusinessPartnerContactsApi { +export const getContacts = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, + config + ) +}; +export const createContact = (officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, + ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), + config + ) +}; +export const paginateContactLabels = (officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const updateContact = (contactId: string, officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, + ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), + config + ) +}; +export const deleteContact = (contactId: string, officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/businessPartnerContacts/businessPartnerContacts.configs.ts b/test/generated/full/businessPartnerContacts/businessPartnerContacts.configs.ts new file mode 100644 index 0000000..9c4ccc5 --- /dev/null +++ b/test/generated/full/businessPartnerContacts/businessPartnerContacts.configs.ts @@ -0,0 +1,42 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; +import { BusinessPartnerContactsQueries } from "./businessPartnerContacts.queries"; +import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; + +export namespace BusinessPartnerContactsConfigs { +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: BusinessPartnerContactsAcl.canUsePaginateContactLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: BusinessPartnerContactsQueries.usePaginateContactLabels, + infinite: BusinessPartnerContactsQueries.usePaginateContactLabelsInfinite, + filters: { + schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/businessPartnerContacts/businessPartnerContacts.models.ts b/test/generated/full/businessPartnerContacts/businessPartnerContacts.models.ts new file mode 100644 index 0000000..e2c3d48 --- /dev/null +++ b/test/generated/full/businessPartnerContacts/businessPartnerContacts.models.ts @@ -0,0 +1,84 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BusinessPartnerContactsModels { +/** + * BusinessPartnerContactRoleEnumSchema + * @type { enum } + */ +export const BusinessPartnerContactRoleEnumSchema = z.enum(["General", "CommercialManager", "SystemEngineer", "TechnicalEngineer", "Logistics", "Operations", "Sales", "Accounting", "Invoice", "Dunnings", "Reclamations", "Management"]); +export type BusinessPartnerContactRoleEnum = z.infer; +export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSchema.enum; + +/** + * BusinessPartnerContactResponseDTOSchema + * @type { object } + * @property { string } id Contact ID + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ +export const BusinessPartnerContactResponseDTOSchema = z.object({ id: z.string().describe("Contact ID"), role: BusinessPartnerContactRoleEnumSchema.nullish(), name: z.string().describe("Contact name").nullish(), email: z.string().describe("Contact email").nullish(), phone: z.string().describe("Contact phone").nullish() }).readonly(); +export type BusinessPartnerContactResponseDTO = z.infer; + +/** + * BusinessPartnerContactListResponseDTOSchema + * @type { object } + * @property { BusinessPartnerContactResponseDTO[] } contacts List of contacts + */ +export const BusinessPartnerContactListResponseDTOSchema = z.object({ contacts: z.array(BusinessPartnerContactResponseDTOSchema).readonly().describe("List of contacts") }).readonly(); +export type BusinessPartnerContactListResponseDTO = z.infer; + +/** + * CreateBusinessPartnerContactRequestDTOSchema + * @type { object } + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ +export const CreateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema, name: z.string().describe("Contact name"), email: z.string().describe("Contact email"), phone: z.string().describe("Contact phone") }).readonly(); +export type CreateBusinessPartnerContactRequestDTO = z.infer; + +/** + * UpdateBusinessPartnerContactRequestDTOSchema + * @type { object } + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ +export const UpdateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema, name: z.string().describe("Contact name"), email: z.string().describe("Contact email"), phone: z.string().describe("Contact phone") }).readonly(); +export type UpdateBusinessPartnerContactRequestDTO = z.infer; + +/** + * BusinessPartnerContactFilterDtoSchema + * @type { object } + * @property { string } search Search by name, email, or phone + */ +export const BusinessPartnerContactFilterDtoSchema = z.object({ search: z.string().describe("Search by name, email, or phone") }).readonly(); +export type BusinessPartnerContactFilterDto = z.infer; + +/** + * PaginateContactLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateContactLabelsOrderParamEnumSchema = z.enum(["name", "role", "email", "createdAt", "updatedAt"]); +export type PaginateContactLabelsOrderParamEnum = z.infer; +export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderParamEnumSchema.enum; + +/** + * PaginateContactLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateContactLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PaginateContactLabelsResponse = z.infer; + +} diff --git a/test/generated/full/businessPartnerContacts/businessPartnerContacts.queries.ts b/test/generated/full/businessPartnerContacts/businessPartnerContacts.queries.ts new file mode 100644 index 0000000..345a304 --- /dev/null +++ b/test/generated/full/businessPartnerContacts/businessPartnerContacts.queries.ts @@ -0,0 +1,186 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; +import { BusinessPartnerContactsApi } from "./businessPartnerContacts.api"; + +export namespace BusinessPartnerContactsQueries { +export const moduleName = QueryModule.BusinessPartnerContacts; + +export const keys = { + all: [moduleName] as const, + getContacts: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts", officeId, businessPartnerId] as const, + paginateContactLabels: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", officeId, businessPartnerId, limit, order, filter, page, cursor] as const, + paginateContactLabelsInfinite: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", "infinite", officeId, businessPartnerId, limit, order, filter, cursor] as const, +}; + +/** + * Query `useGetContacts` + * @summary Get all contacts for a business partner + * @permission Requires `canUseGetContacts` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetContacts = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getContacts(officeId, businessPartnerId), + queryFn: () => { + checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId } )); + return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateContact` + * @summary Create a new contact for a business partner + * @permission Requires `canUseCreateContact` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId } )); + return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateContactLabels` + * @summary Paginate business partner contact labels (id and name only) + * @permission Requires `canUsePaginateContactLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` + * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateContactLabels = ({ officeId, businessPartnerId, limit, order, filter, page, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); + return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateContactLabelsInfinite + * @summary Paginate business partner contact labels (id and name only) + * @permission Requires `canUsePaginateContactLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` + * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateContactLabelsInfinite = ({ officeId, businessPartnerId, limit, order, filter, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); + return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useUpdateContact` + * @summary Update a business partner contact + * @permission Requires `canUseUpdateContact` ability + * @param { string } mutation.contactId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId } )); + return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteContact` + * @permission Requires `canUseDeleteContact` ability + * @param { string } mutation.contactId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 204, 401] + */ +export const useDeleteContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ contactId, officeId, businessPartnerId }) => { + checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId } )); + return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/businessPartners/businessPartners.acl.ts b/test/generated/full/businessPartners/businessPartners.acl.ts new file mode 100644 index 0000000..a532e2e --- /dev/null +++ b/test/generated/full/businessPartners/businessPartners.acl.ts @@ -0,0 +1,264 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnersAcl { +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List business partners + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Create", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Paginate business partner labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Read business partner details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useLock` mutation ability. For global ability, omit the object parameter. + * @description Lock business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLock` mutation + */ +export const canUseLock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUnlock` mutation ability. For global ability, omit the object parameter. + * @description Unlock business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlock` mutation + */ +export const canUseUnlock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetRemarks` query ability. For global ability, omit the object parameter. + * @description List business partner remarks + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetRemarks` query + */ +export const canUseGetRemarks = ( + object?: { officeId: string, } +) => [ + "ReadRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useCreateRemark` mutation ability. For global ability, omit the object parameter. + * @description Create business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRemark` mutation + */ +export const canUseCreateRemark = ( + object?: { officeId: string, } +) => [ + "CreateRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateRemark` mutation ability. For global ability, omit the object parameter. + * @description Update business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRemark` mutation + */ +export const canUseUpdateRemark = ( + object?: { officeId: string, } +) => [ + "UpdateRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useDeleteRemark` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemark` mutation + */ +export const canUseDeleteRemark = ( + object?: { officeId: string, } +) => [ + "DeleteRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetBasicInfo` query ability. For global ability, omit the object parameter. + * @description Read business partner basic info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBasicInfo` query + */ +export const canUseGetBasicInfo = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateBasicInfo` mutation ability. For global ability, omit the object parameter. + * @description Update business partner basic info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBasicInfo` mutation + */ +export const canUseUpdateBasicInfo = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" +] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; + +/** + * Use for `useCreateSignatureUploadInstructions` mutation ability. For global ability, omit the object parameter. + * @description Create business partner signature upload instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateSignatureUploadInstructions` mutation + */ +export const canUseCreateSignatureUploadInstructions = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" +] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; + +/** + * Use for `useGetCargoAgentInfo` query ability. For global ability, omit the object parameter. + * @description Read business partner cargo agent info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoAgentInfo` query + */ +export const canUseGetCargoAgentInfo = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateCargoAgent` mutation ability. For global ability, omit the object parameter. + * @description Update business partner cargo agent info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargoAgent` mutation + */ +export const canUseUpdateCargoAgent = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetCarrierInformation` query ability. For global ability, omit the object parameter. + * @description Read business partner carrier info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCarrierInformation` query + */ +export const canUseGetCarrierInformation = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateCarrier` mutation ability. For global ability, omit the object parameter. + * @description Update business partner carrier info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCarrier` mutation + */ +export const canUseUpdateCarrier = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +} diff --git a/test/generated/full/businessPartners/businessPartners.api.ts b/test/generated/full/businessPartners/businessPartners.api.ts new file mode 100644 index 0000000..379cea4 --- /dev/null +++ b/test/generated/full/businessPartners/businessPartners.api.ts @@ -0,0 +1,179 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnersModels } from "./businessPartners.models"; + +export namespace BusinessPartnersApi { +export const paginate = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, + `/offices/${officeId}/business-partners`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, + `/offices/${officeId}/business-partners`, + ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, + `/offices/${officeId}/business-partners/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getById = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}`, + config + ) +}; +export const update = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), + config + ) +}; +export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/unarchive`, + undefined, + config + ) +}; +export const lock = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/lock`, + undefined, + config + ) +}; +export const unlock = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/unlock`, + undefined, + config + ) +}; +export const getRemarks = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, + `/offices/${officeId}/business-partners/${id}/remarks`, + config + ) +}; +export const createRemark = (officeId: string, id: string, data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/remarks`, + ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), + config + ) +}; +export const updateRemark = (officeId: string, id: string, remarkId: string, data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), + config + ) +}; +export const deleteRemark = (officeId: string, id: string, remarkId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, + undefined, + config + ) +}; +export const getBasicInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic`, + config + ) +}; +export const updateBasicInfo = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), + config + ) +}; +export const createSignatureUploadInstructions = (officeId: string, id: string, data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, + ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), + config + ) +}; +export const getCargoAgentInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/cargo-agent`, + config + ) +}; +export const updateCargoAgent = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCargoAgentDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/cargo-agent`, + ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), + config + ) +}; +export const getCarrierInformation = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/carrier`, + config + ) +}; +export const updateCarrier = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCarrierDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/carrier`, + ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/businessPartners/businessPartners.configs.ts b/test/generated/full/businessPartners/businessPartners.configs.ts new file mode 100644 index 0000000..971a761 --- /dev/null +++ b/test/generated/full/businessPartners/businessPartners.configs.ts @@ -0,0 +1,149 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { BusinessPartnersModels } from "./businessPartners.models"; +import { BusinessPartnersQueries } from "./businessPartners.queries"; +import { BusinessPartnersAcl } from "./businessPartners.acl"; + +export namespace BusinessPartnersConfigs { +export const businessPartnersConfig = { + meta: { + title: "Business Partners", + }, + readAll: { + acl: BusinessPartnersAcl.canUsePaginate, + schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, + paginated: BusinessPartnersQueries.usePaginate, + infinite: BusinessPartnersQueries.usePaginateInfinite, + filters: { + schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, + options: { + inputs: { + search: true, + types: true, + shortName: true, + name: true, + vat: true, + debtorId: true, + creditorId: true, + matchCode: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + address: true, + types: true, + archived: true, + shortName: true, + vat: true, + debtorId: true, + creditorId: true, + locked: true, + currency: true, + remarks: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: BusinessPartnersAcl.canUseGetById, + schema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema, + query: BusinessPartnersQueries.useGetById, + }, + create: { + acl: BusinessPartnersAcl.canUseCreate, + schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, + mutation: BusinessPartnersQueries.useCreate, + inputDefs: dynamicInputs({ + schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, + options: { + inputs: { + name: true, + secondaryName: true, + types: true, + matchCode: true, + shortName: true, + address: true, + }, + }, +}) + }, + update: { + acl: BusinessPartnersAcl.canUseUpdate, + schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, + mutation: BusinessPartnersQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + secondaryName: true, + types: true, + address: true, + blAddress: true, + belongsToId: true, + salesRepId: true, + operationsId: true, + addressIsDifferentForBl: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: BusinessPartnersAcl.canUsePaginateLabels, + schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, + paginated: BusinessPartnersQueries.usePaginateLabels, + infinite: BusinessPartnersQueries.usePaginateLabelsInfinite, + filters: { + schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, + options: { + inputs: { + search: true, + ids: true, + types: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + types: true, + }, + sortable: BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/businessPartners/businessPartners.models.ts b/test/generated/full/businessPartners/businessPartners.models.ts new file mode 100644 index 0000000..75c284e --- /dev/null +++ b/test/generated/full/businessPartners/businessPartners.models.ts @@ -0,0 +1,489 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BusinessPartnersModels { +/** + * RemarkVisibilitySchema + * @type { enum } + */ +export const RemarkVisibilitySchema = z.enum(["internal", "popup"]); +export type RemarkVisibility = z.infer; +export const RemarkVisibility = RemarkVisibilitySchema.enum; + +/** + * RemarkTypeSchema + * @type { enum } + */ +export const RemarkTypeSchema = z.enum(["INFORMATIONAL", "WARNING"]); +export type RemarkType = z.infer; +export const RemarkType = RemarkTypeSchema.enum; + +/** + * BusinessPartnerRemarkResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the remark + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of the remark + */ +export const BusinessPartnerRemarkResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the remark"), visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), content: z.string().describe("Content of the remark"), type: RemarkTypeSchema.describe("Type of the remark") }).readonly(); +export type BusinessPartnerRemarkResponseDTO = z.infer; + +/** + * BusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { string } city City name + * @property { string } isoCode Country code + */ +export const BusinessPartnerAddressDtoSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: z.string().describe("City name"), isoCode: z.string().describe("Country code") }).readonly(); +export type BusinessPartnerAddressDto = z.infer; + +/** + * BusinessPartnerEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BusinessPartnerEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type BusinessPartnerEmployeeDTO = z.infer; + +/** + * BusinessPartnerListResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + * @property { string } matchCode Match code of the business partner + * @property { BusinessPartnerAddressDto } address Address information + * @property { CommonModels.BusinessPartnerType[] } types List of business partner types + * @property { boolean } archived Archive status + * @property { string } shortName Short name of the business partner + * @property { string } vat VAT number of the business partner + * @property { string } debtorId Debtor ID for the local currency + * @property { string } creditorId Creditor ID for the local currency + * @property { boolean } locked Whether the business partner is locked + * @property { string } currency Currency (invoice currency) + * @property { BusinessPartnerRemarkResponseDTO[] } remarks Remarks for the business partner + * @property { string } createdById ID of the employee who created this business partner + * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this business partner + * @property { string } createdAt Date when the business partner was created + * @property { string } updatedById ID of the employee who last updated this business partner + * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this business partner + * @property { string } updatedAt Date when the business partner was last updated + */ +export const BusinessPartnerListResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), name: z.string().describe("Name of the business partner"), matchCode: z.string().describe("Match code of the business partner"), address: BusinessPartnerAddressDtoSchema.describe("Address information"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), archived: z.boolean().describe("Archive status"), shortName: z.string().describe("Short name of the business partner").nullish(), vat: z.string().describe("VAT number of the business partner").nullish(), debtorId: z.string().describe("Debtor ID for the local currency").nullish(), creditorId: z.string().describe("Creditor ID for the local currency").nullish(), locked: z.boolean().describe("Whether the business partner is locked"), currency: z.string().describe("Currency (invoice currency)").nullish(), remarks: z.array(BusinessPartnerRemarkResponseDTOSchema).readonly().describe("Remarks for the business partner"), createdById: z.string().describe("ID of the employee who created this business partner").nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this business partner").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was created"), updatedById: z.string().describe("ID of the employee who last updated this business partner").nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this business partner").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was last updated") }).readonly(); +export type BusinessPartnerListResponseDTO = z.infer; + +/** + * BusinessPartnerFilterDtoSchema + * @type { object } + * @property { string } search + * @property { CommonModels.BusinessPartnerType[] } types + * @property { string } shortName + * @property { string } name + * @property { string } vat + * @property { string } debtorId + * @property { string } creditorId + * @property { string } matchCode + * @property { boolean } archived Filter by archived status + */ +export const BusinessPartnerFilterDtoSchema = z.object({ search: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly(), shortName: z.string(), name: z.string(), vat: z.string(), debtorId: z.string(), creditorId: z.string(), matchCode: z.string(), archived: z.boolean().describe("Filter by archived status") }).readonly(); +export type BusinessPartnerFilterDto = z.infer; + +/** + * BusinessPartnerPaginatedLabelResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } label Label of the business partner + * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types + */ +export const BusinessPartnerPaginatedLabelResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), label: z.string().describe("Label of the business partner"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); +export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; + +/** + * BusinessPartnerLabelsFilterDtoSchema + * @type { object } + * @property { string } search + * @property { string[] } ids Business partner ids to filter by + * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types to filter by + * @property { boolean } archived Filter by archived status + */ +export const BusinessPartnerLabelsFilterDtoSchema = z.object({ search: z.string(), ids: z.array(z.string()).readonly().describe("Business partner ids to filter by"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types to filter by"), archived: z.boolean().describe("Filter by archived status") }).readonly(); +export type BusinessPartnerLabelsFilterDto = z.infer; + +/** + * CreateBusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } district + * @property { string } countryId + */ +export const CreateBusinessPartnerAddressDtoSchema = z.object({ street: z.string(), secondaryStreet: z.string(), zip: z.string(), cityId: z.string(), district: z.string(), countryId: z.string() }).readonly(); +export type CreateBusinessPartnerAddressDto = z.infer; + +/** + * CreateBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } name Full name of the business partner. Min Length: `3` + * @property { string } secondaryName Full name of the business partner. Min Length: `3` + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { string } matchCode Unique identifier code + * @property { string } shortName Short name for the business partner + * @property { CreateBusinessPartnerAddressDto } address Address information + */ +export const CreateBusinessPartnerRequestDTOSchema = z.object({ name: z.string().min(3).describe("Full name of the business partner"), secondaryName: z.string().min(3).describe("Full name of the business partner").nullish(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), matchCode: z.string().describe("Unique identifier code").nullish(), shortName: z.string().describe("Short name for the business partner").nullish(), address: CreateBusinessPartnerAddressDtoSchema.describe("Address information").nullish() }).readonly(); +export type CreateBusinessPartnerRequestDTO = z.infer; + +/** + * BusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { string } rootFolderId Root folder identifier associated with this business partner + */ +export const BusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), name: z.string().describe("Name of the business partner"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), rootFolderId: z.string().describe("Root folder identifier associated with this business partner").nullish() }).readonly(); +export type BusinessPartnerResponseDTO = z.infer; + +/** + * BusinessPartnerLabelResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + */ +export const BusinessPartnerLabelResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), name: z.string().describe("Name of the business partner") }).readonly(); +export type BusinessPartnerLabelResponseDto = z.infer; + +/** + * ContactResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the contact + * @property { string } name Name of the contact + */ +export const ContactResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the contact"), name: z.string().describe("Name of the contact") }).readonly(); +export type ContactResponseDTO = z.infer; + +/** + * BusinessPartnerDetailResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } createdById ID of the employee who created this record + * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this record + * @property { string } createdAt Creation timestamp + * @property { string } updatedById ID of the employee who last updated this record + * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this record + * @property { string } updatedAt Last update timestamp + * @property { string } matchCode Match code of the business partner + * @property { string } shortName Short name + * @property { string } name Full name + * @property { string } secondaryName Secondary name + * @property { CommonModels.BusinessPartnerType[] } types List of business partner types + * @property { boolean } archived Archived status + * @property { CommonModels.BusinessPartnerAddressResponseDTO } address Main address information + * @property { CommonModels.BusinessPartnerAddressResponseDTO } blAddress BL address information + * @property { BusinessPartnerLabelResponseDto[] } similar Similar named business partners + * @property { boolean } locked + * @property { boolean } addressIsDifferentForBl + * @property { string } lockedById Unique identifier of the employee who locked the business partner + * @property { string } lockedByName + * @property { string } lockedAt Unique identifier of the employee who locked the business partner + * @property { ContactResponseDTO } belongsTo Parent business partner + * @property { ContactResponseDTO } salesRep Sales representative + * @property { ContactResponseDTO } operations Operations contact + */ +export const BusinessPartnerDetailResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), createdById: z.string().describe("ID of the employee who created this record").nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this record").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Creation timestamp"), updatedById: z.string().describe("ID of the employee who last updated this record").nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this record").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Last update timestamp"), matchCode: z.string().describe("Match code of the business partner"), shortName: z.string().describe("Short name"), name: z.string().describe("Full name"), secondaryName: z.string().describe("Secondary name"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), archived: z.boolean().describe("Archived status"), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information"), blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("BL address information"), similar: z.array(BusinessPartnerLabelResponseDtoSchema).readonly().describe("Similar named business partners").nullish(), locked: z.boolean(), addressIsDifferentForBl: z.boolean(), lockedById: z.string().describe("Unique identifier of the employee who locked the business partner").nullish(), lockedByName: z.string().nullish(), lockedAt: z.iso.datetime({ offset: true }).describe("Unique identifier of the employee who locked the business partner").nullish(), belongsTo: ContactResponseDTOSchema.describe("Parent business partner"), salesRep: ContactResponseDTOSchema.describe("Sales representative"), operations: ContactResponseDTOSchema.describe("Operations contact") }).readonly(); +export type BusinessPartnerDetailResponseDTO = z.infer; + +/** + * UpdateBusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } district + * @property { string } countryId + */ +export const UpdateBusinessPartnerAddressDtoSchema = z.object({ street: z.string(), secondaryStreet: z.string(), zip: z.string(), cityId: z.string().nullable(), district: z.string(), countryId: z.string() }).readonly(); +export type UpdateBusinessPartnerAddressDto = z.infer; + +/** + * UpdateBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code + * @property { string } shortName Updated short name + * @property { string } name Updated full name + * @property { string } secondaryName Updated secondary name + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { UpdateBusinessPartnerAddressDto } address Address information + * @property { UpdateBusinessPartnerAddressDto } blAddress Bl address information + * @property { string } belongsToId Parent business partner + * @property { string } salesRepId Sales representative + * @property { string } operationsId Operations contact + * @property { boolean } addressIsDifferentForBl Different address for BL + */ +export const UpdateBusinessPartnerRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code"), shortName: z.string().describe("Updated short name"), name: z.string().describe("Updated full name"), secondaryName: z.string().describe("Updated secondary name"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), address: UpdateBusinessPartnerAddressDtoSchema.describe("Address information"), blAddress: UpdateBusinessPartnerAddressDtoSchema.describe("Bl address information"), belongsToId: z.string().describe("Parent business partner"), salesRepId: z.string().describe("Sales representative"), operationsId: z.string().describe("Operations contact"), addressIsDifferentForBl: z.boolean().describe("Different address for BL") }).readonly(); +export type UpdateBusinessPartnerRequestDTO = z.infer; + +/** + * CreateBusinessPartnerRemarkRequestDTOSchema + * @type { object } + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of remark + */ +export const CreateBusinessPartnerRemarkRequestDTOSchema = z.object({ visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), content: z.string().describe("Content of the remark"), type: RemarkTypeSchema.describe("Type of remark") }).readonly(); +export type CreateBusinessPartnerRemarkRequestDTO = z.infer; + +/** + * UpdateBusinessPartnerRemarkRequestDtoSchema + * @type { object } + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of remark + */ +export const UpdateBusinessPartnerRemarkRequestDtoSchema = z.object({ visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), content: z.string().describe("Content of the remark"), type: RemarkTypeSchema.describe("Type of remark") }).readonly(); +export type UpdateBusinessPartnerRemarkRequestDto = z.infer; + +/** + * AccountTypeEnumSchema + * @type { enum } + */ +export const AccountTypeEnumSchema = z.enum(["Direct Account", "Logistic Provider / Forwarder", "4PL/NVOCC", "LLP", "Carrier", "Service Provider (other)", "Strategic", "Key Account", "Transactional", "Agent", "Other"]); +export type AccountTypeEnum = z.infer; +export const AccountTypeEnum = AccountTypeEnumSchema.enum; + +/** + * BusinessPartnerAuthorizationSchema + * @type { enum } + */ +export const BusinessPartnerAuthorizationSchema = z.enum(["requiresApproval", "blocked", "regularBusinessPartner"]); +export type BusinessPartnerAuthorization = z.infer; +export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.enum; + +/** + * BusinessPartnerPaymentTermsResponseDtoSchema + * @type { object } + * @property { string } relativeTo + * @property { number } days Minimum: `0` + */ +export const BusinessPartnerPaymentTermsResponseDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }).readonly(); +export type BusinessPartnerPaymentTermsResponseDto = z.infer; + +/** + * BusinessPartnerBankAccountResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BusinessPartnerBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type BusinessPartnerBankAccountResponseDto = z.infer; + +/** + * PartnerNetworkInfoDtoSchema + * @type { object } + * @property { string } id Partner network ID + * @property { string } name Partner network name + */ +export const PartnerNetworkInfoDtoSchema = z.object({ id: z.string().describe("Partner network ID"), name: z.string().describe("Partner network name") }).readonly(); +export type PartnerNetworkInfoDto = z.infer; + +/** + * BusinessPartnerBasicResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Reference to the business partner + * @property { string[] } relationship List of relationships + * @property { AccountTypeEnum } accountType + * @property { string } vat VAT number + * @property { string } legacySystemId Legacy system (move) id + * @property { string } registrationNumber + * @property { string } eori EORI number + * @property { BusinessPartnerAuthorization } authorization Authorization status + * @property { number } creditLimit Credit limit + * @property { string } invoiceLanguage Invoice language + * @property { string } invoiceCurrency Invoice currency + * @property { string } iban IBAN + * @property { string } bankNumber Bank number + * @property { string } bankAccountNumber Bank account number + * @property { BusinessPartnerPaymentTermsResponseDto } termsExport + * @property { BusinessPartnerPaymentTermsResponseDto } termsImport + * @property { CommonModels.EditorContentResponseDto } notes Notes + * @property { string } bankAccountId + * @property { BusinessPartnerBankAccountResponseDto } bankAccount + * @property { PartnerNetworkInfoDto[] } partnerNetworks Partner networks + * @property { string } dunningSystemId + * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem + * @property { string } hblIssuerSigner HBL issuer/signer prefill + * @property { string } signatureFileAttachmentId Signature file attachment ID + * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment + */ +export const BusinessPartnerBasicResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Reference to the business partner"), relationship: z.array(z.string()).readonly().describe("List of relationships"), accountType: AccountTypeEnumSchema.nullish(), vat: z.string().describe("VAT number"), legacySystemId: z.string().describe("Legacy system (move) id").nullish(), registrationNumber: z.string().nullish(), eori: z.string().describe("EORI number"), authorization: BusinessPartnerAuthorizationSchema.describe("Authorization status").nullable(), creditLimit: z.number().describe("Credit limit"), invoiceLanguage: z.string().describe("Invoice language"), invoiceCurrency: z.string().describe("Invoice currency"), iban: z.string().describe("IBAN"), bankNumber: z.string().describe("Bank number"), bankAccountNumber: z.string().describe("Bank account number"), termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), bankAccountId: z.string().nullish(), bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), partnerNetworks: z.array(PartnerNetworkInfoDtoSchema).readonly().describe("Partner networks"), dunningSystemId: z.string().nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), hblIssuerSigner: z.string().describe("HBL issuer/signer prefill"), signatureFileAttachmentId: z.string().describe("Signature file attachment ID"), signatureFileAttachmentUrl: z.string().describe("Signed URL for signature file attachment").nullish() }).readonly(); +export type BusinessPartnerBasicResponseDTO = z.infer; + +/** + * UpdateBusinessPartnerPaymentTermsDtoSchema + * @type { object } + * @property { string } relativeTo + * @property { number } days Minimum: `0` + */ +export const UpdateBusinessPartnerPaymentTermsDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }).readonly(); +export type UpdateBusinessPartnerPaymentTermsDto = z.infer; + +/** + * UpdateBusinessPartnerBasicRequestDTOSchema + * @type { object } + * @property { string[] } relationship Updated relationships + * @property { string } vat Updated VAT number + * @property { string } eori Updated EORI number + * @property { AccountTypeEnum } accountType + * @property { BusinessPartnerAuthorization } authorization Updated authorization status + * @property { number } creditLimit Updated credit limit + * @property { string } invoiceLanguage Invoice language + * @property { string } invoiceCurrency Invoice currency + * @property { string } iban IBAN + * @property { string } bankNumber Bank number + * @property { string } bankAccountNumber Bank account number + * @property { string } legacySystemId Legacy system (move) id + * @property { string } registrationNumber + * @property { UpdateBusinessPartnerPaymentTermsDto } termsExport + * @property { UpdateBusinessPartnerPaymentTermsDto } termsImport + * @property { CommonModels.EditorContentUpdateDto } notes Notes + * @property { string } bankAccountId + * @property { string[] } partnerNetworkIds Partner network IDs + * @property { string } dunningSystemId Dunning system ID + * @property { string } hblIssuerSigner HBL issuer/signer prefill + * @property { string } signatureFileAttachmentId Signature file attachment ID + */ +export const UpdateBusinessPartnerBasicRequestDTOSchema = z.object({ relationship: z.array(z.string()).readonly().describe("Updated relationships"), vat: z.string().describe("Updated VAT number"), eori: z.string().describe("Updated EORI number"), accountType: AccountTypeEnumSchema, authorization: BusinessPartnerAuthorizationSchema.describe("Updated authorization status"), creditLimit: z.number().describe("Updated credit limit"), invoiceLanguage: z.string().describe("Invoice language"), invoiceCurrency: z.string().describe("Invoice currency"), iban: z.string().describe("IBAN"), bankNumber: z.string().describe("Bank number"), bankAccountNumber: z.string().describe("Bank account number"), legacySystemId: z.string().describe("Legacy system (move) id"), registrationNumber: z.string(), termsExport: UpdateBusinessPartnerPaymentTermsDtoSchema, termsImport: UpdateBusinessPartnerPaymentTermsDtoSchema, notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), bankAccountId: z.string().nullable(), partnerNetworkIds: z.array(z.string()).readonly().describe("Partner network IDs"), dunningSystemId: z.string().describe("Dunning system ID").nullable(), hblIssuerSigner: z.string().describe("HBL issuer/signer prefill").nullable(), signatureFileAttachmentId: z.string().describe("Signature file attachment ID").nullable() }).readonly(); +export type UpdateBusinessPartnerBasicRequestDTO = z.infer; + +/** + * BusinessPartnerSignatureUploadRequestDTOSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType Mime type + * @property { number } fileSize File size in bytes. Minimum: `1` + */ +export const BusinessPartnerSignatureUploadRequestDTOSchema = z.object({ fileName: z.string().describe("File name"), mimeType: z.string().describe("Mime type"), fileSize: z.number().gte(1).describe("File size in bytes") }).readonly(); +export type BusinessPartnerSignatureUploadRequestDTO = z.infer; + +/** + * BusinessPartnerSignatureUploadResponseDTOSchema + * @type { object } + * @property { string } mediaId Media ID for the uploaded signature + * @property { string } method HTTP method to use for upload + * @property { string } url URL to upload the file to + */ +export const BusinessPartnerSignatureUploadResponseDTOSchema = z.object({ mediaId: z.string().describe("Media ID for the uploaded signature"), method: z.string().describe("HTTP method to use for upload"), url: z.string().describe("URL to upload the file to") }).readonly(); +export type BusinessPartnerSignatureUploadResponseDTO = z.infer; + +/** + * CargoAgentResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Business partner identifier + * @property { string } portOfHamburgAccountNumber Port of Hamburg account number + * @property { string } iataAccountNumber IATA account number + * @property { string } regulatedAgentCode Regulated agent code + */ +export const CargoAgentResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Business partner identifier"), portOfHamburgAccountNumber: z.string().describe("Port of Hamburg account number"), iataAccountNumber: z.string().describe("IATA account number"), regulatedAgentCode: z.string().describe("Regulated agent code") }).readonly(); +export type CargoAgentResponseDTO = z.infer; + +/** + * UpdateCargoAgentDTOSchema + * @type { object } + * @property { string } portOfHamburgAccountNumber Hamburg port account number + * @property { string } iataAccountNumber IATA account number + * @property { string } regulatedAgentCode Regulated agent code + */ +export const UpdateCargoAgentDTOSchema = z.object({ portOfHamburgAccountNumber: z.string().describe("Hamburg port account number"), iataAccountNumber: z.string().describe("IATA account number"), regulatedAgentCode: z.string().describe("Regulated agent code") }).readonly(); +export type UpdateCargoAgentDTO = z.infer; + +/** + * CarrierResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Business partner identifier + * @property { string } scac SCAC code + * @property { string } iataAirlinePrefix IATA airline prefix + * @property { string } iataCode IATA code + * @property { string } registrationAddress Registration address + * @property { string } masterBlSuffix Master BL suffix + * @property { string } houseBlSuffix House BL suffix + * @property { string } airWaybillSuffix Air waybill suffix + * @property { string } cargoManifestSuffix Cargo manifest suffix + * @property { string } fundReportSuffix Fund report suffix + * @property { string } invoiceSuffix Invoice suffix + */ +export const CarrierResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Business partner identifier"), scac: z.string().describe("SCAC code"), iataAirlinePrefix: z.string().describe("IATA airline prefix"), iataCode: z.string().describe("IATA code"), registrationAddress: z.string().describe("Registration address"), masterBlSuffix: z.string().describe("Master BL suffix"), houseBlSuffix: z.string().describe("House BL suffix"), airWaybillSuffix: z.string().describe("Air waybill suffix"), cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), fundReportSuffix: z.string().describe("Fund report suffix"), invoiceSuffix: z.string().describe("Invoice suffix") }).readonly(); +export type CarrierResponseDTO = z.infer; + +/** + * UpdateCarrierDTOSchema + * @type { object } + * @property { string } scac SCAC code + * @property { string } iataAirlinePrefix IATA airline prefix + * @property { string } iataCode IATA code + * @property { string } registrationAddress Registration address + * @property { string } masterBlSuffix Master BL suffix + * @property { string } houseBlSuffix House BL suffix + * @property { string } airWaybillSuffix Air waybill suffix + * @property { string } cargoManifestSuffix Cargo manifest suffix + * @property { string } fundReportSuffix Fund report suffix + * @property { string } invoiceSuffix Invoice suffix + */ +export const UpdateCarrierDTOSchema = z.object({ scac: z.string().describe("SCAC code"), iataAirlinePrefix: z.string().describe("IATA airline prefix"), iataCode: z.string().describe("IATA code"), registrationAddress: z.string().describe("Registration address"), masterBlSuffix: z.string().describe("Master BL suffix"), houseBlSuffix: z.string().describe("House BL suffix"), airWaybillSuffix: z.string().describe("Air waybill suffix"), cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), fundReportSuffix: z.string().describe("Fund report suffix"), invoiceSuffix: z.string().describe("Invoice suffix") }).readonly(); +export type UpdateCarrierDTO = z.infer; + +/** + * BusinessPartnersPaginateOrderParamEnumSchema + * @type { enum } + */ +export const BusinessPartnersPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); +export type BusinessPartnersPaginateOrderParamEnum = z.infer; +export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOrderParamEnumSchema.enum; + +/** + * BusinessPartnersPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BusinessPartnerListResponseDTO[] } items + */ +export const BusinessPartnersPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).readonly() }).readonly().shape }); +export type BusinessPartnersPaginateResponse = z.infer; + +/** + * BusinessPartnersPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const BusinessPartnersPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); +export type BusinessPartnersPaginateLabelsOrderParamEnum = z.infer; +export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPaginateLabelsOrderParamEnumSchema.enum; + +/** + * BusinessPartnersPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items + */ +export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type BusinessPartnersPaginateLabelsResponse = z.infer; + +/** + * GetRemarksResponseSchema + * @type { array } + */ +export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema).readonly(); +export type GetRemarksResponse = z.infer; + +} diff --git a/test/generated/full/businessPartners/businessPartners.queries.ts b/test/generated/full/businessPartners/businessPartners.queries.ts new file mode 100644 index 0000000..5c7e107 --- /dev/null +++ b/test/generated/full/businessPartners/businessPartners.queries.ts @@ -0,0 +1,642 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnersAcl } from "./businessPartners.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnersModels } from "./businessPartners.models"; +import { BusinessPartnersApi } from "./businessPartners.api"; + +export namespace BusinessPartnersQueries { +export const moduleName = QueryModule.BusinessPartners; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + getById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id", officeId, id] as const, + getRemarks: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/remarks", officeId, id] as const, + getBasicInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/basic", officeId, id] as const, + getCargoAgentInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/cargo-agent", officeId, id] as const, + getCarrierInformation: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/carrier", officeId, id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate business partners + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); + return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate business partners + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); + return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create business partner + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { BusinessPartnersModels.CreateBusinessPartnerRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(BusinessPartnersAcl.canUseCreate({ officeId } )); + return BusinessPartnersApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetById` + * @summary Get business partner by ID + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetById({ officeId } )); + return BusinessPartnersApi.getById(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update business partner + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId } )); + return BusinessPartnersApi.update(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive business partner + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseArchive({ officeId } )); + return BusinessPartnersApi.archive(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive business partner + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId } )); + return BusinessPartnersApi.unarchive(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useLock` + * @summary Lock business partner + * @permission Requires `canUseLock` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useLock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseLock({ officeId } )); + return BusinessPartnersApi.lock(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnlock` + * @summary Unlock business partner + * @permission Requires `canUseUnlock` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId } )); + return BusinessPartnersApi.unlock(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetRemarks` + * @summary Get business partner remarks + * @permission Requires `canUseGetRemarks` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetRemarks = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getRemarks(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId } )); + return BusinessPartnersApi.getRemarks(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateRemark` + * @summary Create business partner remark + * @permission Requires `canUseCreateRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId } )); + return BusinessPartnersApi.createRemark(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateRemark` + * @permission Requires `canUseUpdateRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { string } mutation.remarkId Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, remarkId, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId } )); + return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRemark` + * @summary Delete business partner remark + * @permission Requires `canUseDeleteRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { string } mutation.remarkId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, remarkId }) => { + checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId } )); + return BusinessPartnersApi.deleteRemark(officeId, id, remarkId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetBasicInfo` + * @summary Get business partner basic info + * @permission Requires `canUseGetBasicInfo` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBasicInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBasicInfo(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId } )); + return BusinessPartnersApi.getBasicInfo(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateBasicInfo` + * @summary Update business partner basic info + * @permission Requires `canUseUpdateBasicInfo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBasicInfo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId } )); + return BusinessPartnersApi.updateBasicInfo(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getBasicInfo(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateSignatureUploadInstructions` + * @summary Create upload instructions for business partner signature + * @permission Requires `canUseCreateSignatureUploadInstructions` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateSignatureUploadInstructions = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { + checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId } )); + const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions(officeId, id, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetCargoAgentInfo` + * @summary Get cargo agent information for business partner + * @permission Requires `canUseGetCargoAgentInfo` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoAgentInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoAgentInfo(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId } )); + return BusinessPartnersApi.getCargoAgentInfo(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCargoAgent` + * @summary Update cargo agent information for business partner + * @permission Requires `canUseUpdateCargoAgent` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateCargoAgentDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCargoAgent = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId } )); + return BusinessPartnersApi.updateCargoAgent(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getCargoAgentInfo(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetCarrierInformation` + * @summary Get carrier information for business partner + * @permission Requires `canUseGetCarrierInformation` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCarrierInformation = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCarrierInformation(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId } )); + return BusinessPartnersApi.getCarrierInformation(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCarrier` + * @summary Update carrier information for business partner + * @permission Requires `canUseUpdateCarrier` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateCarrierDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCarrier = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId } )); + return BusinessPartnersApi.updateCarrier(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getCarrierInformation(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/cargoTypes/cargoTypes.acl.ts b/test/generated/full/cargoTypes/cargoTypes.acl.ts new file mode 100644 index 0000000..404b05b --- /dev/null +++ b/test/generated/full/cargoTypes/cargoTypes.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CargoTypesAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "CargoType" +] as AbilityTuple<"Read", "CargoType">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "CargoType" +] as AbilityTuple<"Create", "CargoType">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "CargoType" +] as AbilityTuple<"Read", "CargoType">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "CargoType" +] as AbilityTuple<"Read", "CargoType">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "CargoType" +] as AbilityTuple<"Update", "CargoType">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "CargoType" +] as AbilityTuple<"Archive", "CargoType">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "CargoType" +] as AbilityTuple<"Archive", "CargoType">; + +} diff --git a/test/generated/full/cargoTypes/cargoTypes.api.ts b/test/generated/full/cargoTypes/cargoTypes.api.ts new file mode 100644 index 0000000..5f6ca5c --- /dev/null +++ b/test/generated/full/cargoTypes/cargoTypes.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CargoTypesModels } from "./cargoTypes.models"; + +export namespace CargoTypesApi { +export const paginate = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, + `/cargo-types`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types`, + ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, + `/cargo-types/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}`, + config + ) +}; +export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}`, + ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/cargoTypes/cargoTypes.configs.ts b/test/generated/full/cargoTypes/cargoTypes.configs.ts new file mode 100644 index 0000000..5d2769f --- /dev/null +++ b/test/generated/full/cargoTypes/cargoTypes.configs.ts @@ -0,0 +1,142 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CargoTypesModels } from "./cargoTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CargoTypesQueries } from "./cargoTypes.queries"; +import { CargoTypesAcl } from "./cargoTypes.acl"; + +export namespace CargoTypesConfigs { +export const cargoTypesConfig = { + meta: { + title: "Cargo Types", + }, + readAll: { + acl: CargoTypesAcl.canUsePaginate, + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + paginated: CargoTypesQueries.usePaginate, + infinite: CargoTypesQueries.usePaginateInfinite, + filters: { + schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, + options: { + inputs: { + module: true, + archived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + shortName: true, + length: true, + width: true, + height: true, + unit: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + modules: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: CargoTypesAcl.canUseFindById, + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + query: CargoTypesQueries.useFindById, + }, + create: { + acl: CargoTypesAcl.canUseCreate, + schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, + mutation: CargoTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + length: true, + width: true, + height: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + unit: true, + modules: true, + }, + }, +}) + }, + update: { + acl: CargoTypesAcl.canUseUpdate, + schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, + mutation: CargoTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + length: true, + width: true, + height: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + unit: true, + modules: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CargoTypesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CargoTypesQueries.usePaginateLabels, + infinite: CargoTypesQueries.usePaginateLabelsInfinite, + filters: { + schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/cargoTypes/cargoTypes.models.ts b/test/generated/full/cargoTypes/cargoTypes.models.ts new file mode 100644 index 0000000..93eed88 --- /dev/null +++ b/test/generated/full/cargoTypes/cargoTypes.models.ts @@ -0,0 +1,141 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CargoTypesModels { +/** + * CargoTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CargoTypeEmployeeDTO = z.infer; + +/** + * CargoTypeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the cargo type + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { string } unit Measurement unit for dimensions + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type + * @property { boolean } archived Indicates if the cargo type is archived + * @property { string } createdById + * @property { CargoTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CargoTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const CargoTypeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the cargo type"), name: z.string().describe("Name of the cargo type"), shortName: z.string().describe("Short name of the cargo type").nullish(), length: z.number().describe("Length of the cargo type").nullish(), width: z.number().describe("Width of the cargo type").nullish(), height: z.number().describe("Height of the cargo type").nullish(), unit: z.string().describe("Measurement unit for dimensions"), emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), containerIsoCode: z.string().describe("Container ISO code").nullish(), isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly().describe("Transport modules applicable to the cargo type"), archived: z.boolean().describe("Indicates if the cargo type is archived"), createdById: z.string().nullish(), createdBy: CargoTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CargoTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type CargoTypeResponseDTO = z.infer; + +/** + * TransportModuleEnumSchema + * @type { enum } + */ +export const TransportModuleEnumSchema = z.enum(["Air", "Sea", "Road"]); +export type TransportModuleEnum = z.infer; +export const TransportModuleEnum = TransportModuleEnumSchema.enum; + +/** + * CargoTypePaginationFilterDtoSchema + * @type { object } + * @property { TransportModuleEnum } module + * @property { boolean } archived Archived status filter + * @property { string } search + */ +export const CargoTypePaginationFilterDtoSchema = z.object({ module: TransportModuleEnumSchema, archived: z.boolean().describe("Archived status filter"), search: z.string() }).readonly(); +export type CargoTypePaginationFilterDto = z.infer; + +/** + * CreateCargoTypeRequestDTOSchema + * @type { object } + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { string } unit Measurement unit for dimensions + * @property { CommonModels.TransportModeEnum[] } modules Transport modes applicable to the cargo type + */ +export const CreateCargoTypeRequestDTOSchema = z.object({ name: z.string().describe("Name of the cargo type"), shortName: z.string().describe("Short name of the cargo type").nullish(), length: z.number().describe("Length of the cargo type").nullish(), width: z.number().describe("Width of the cargo type").nullish(), height: z.number().describe("Height of the cargo type").nullish(), emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), containerIsoCode: z.string().describe("Container ISO code").nullish(), isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), unit: z.string().describe("Measurement unit for dimensions"), modules: z.array(CommonModels.TransportModeEnumSchema).readonly().describe("Transport modes applicable to the cargo type") }).readonly(); +export type CreateCargoTypeRequestDTO = z.infer; + +/** + * UpdateCargoTypeRequestDTOSchema + * @type { object } + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { string } unit Measurement unit for dimensions + * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type + */ +export const UpdateCargoTypeRequestDTOSchema = z.object({ name: z.string().describe("Name of the cargo type"), shortName: z.string().describe("Short name of the cargo type"), length: z.number().describe("Length of the cargo type").nullable(), width: z.number().describe("Width of the cargo type").nullable(), height: z.number().describe("Height of the cargo type").nullable(), emptyWeight: z.number().describe("Empty weight of the cargo container").nullable(), containerIsoCode: z.string().describe("Container ISO code").nullable(), isContainer: z.boolean().describe("Whether this cargo type is a container").nullable(), unit: z.string().describe("Measurement unit for dimensions"), modules: z.array(CommonModels.TransportModeEnumSchema).readonly().describe("Transport modules applicable to the cargo type") }).readonly(); +export type UpdateCargoTypeRequestDTO = z.infer; + +/** + * CargoTypeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const CargoTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type CargoTypeLabelFilterDto = z.infer; + +/** + * CargoTypesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const CargoTypesPaginateOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type CargoTypesPaginateOrderParamEnum = z.infer; +export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnumSchema.enum; + +/** + * CargoTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CargoTypeResponseDTO[] } items + */ +export const CargoTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CargoTypeResponseDTOSchema).readonly() }).readonly().shape }); +export type CargoTypesPaginateResponse = z.infer; + +/** + * CargoTypesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const CargoTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type CargoTypesPaginateLabelsOrderParamEnum = z.infer; +export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * CargoTypesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const CargoTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type CargoTypesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/cargoTypes/cargoTypes.queries.ts b/test/generated/full/cargoTypes/cargoTypes.queries.ts new file mode 100644 index 0000000..71cd268 --- /dev/null +++ b/test/generated/full/cargoTypes/cargoTypes.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CargoTypesAcl } from "./cargoTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CargoTypesModels } from "./cargoTypes.models"; +import { CargoTypesApi } from "./cargoTypes.api"; + +export namespace CargoTypesQueries { +export const moduleName = QueryModule.CargoTypes; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string) => [...keys.all, "/cargo-types", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/cargo-types/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Cargo Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CargoTypesAcl.canUsePaginate()); + return CargoTypesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Cargo Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CargoTypesAcl.canUsePaginate()); + return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Cargo Type + * @permission Requires `canUseCreate` ability + * @param { CargoTypesModels.CreateCargoTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CargoTypesAcl.canUseCreate()); + return CargoTypesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate cargo types with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CargoTypesAcl.canUsePaginateLabels()); + return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate cargo types with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CargoTypesAcl.canUsePaginateLabels()); + return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get Cargo Type by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(CargoTypesAcl.canUseFindById()); + return CargoTypesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Cargo Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { CargoTypesModels.UpdateCargoTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(CargoTypesAcl.canUseUpdate()); + return CargoTypesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Cargo Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CargoTypesAcl.canUseArchive()); + return CargoTypesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive Cargo Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CargoTypesAcl.canUseUnarchive()); + return CargoTypesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/chargeTypes/chargeTypes.acl.ts b/test/generated/full/chargeTypes/chargeTypes.acl.ts new file mode 100644 index 0000000..469c483 --- /dev/null +++ b/test/generated/full/chargeTypes/chargeTypes.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace ChargeTypesAcl { +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "ChargeType" +] as AbilityTuple<"Read", "ChargeType">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "ChargeType" +] as AbilityTuple<"Read", "ChargeType">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "ChargeType" +] as AbilityTuple<"Create", "ChargeType">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "ChargeType" +] as AbilityTuple<"Read", "ChargeType">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "ChargeType" +] as AbilityTuple<"Update", "ChargeType">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "ChargeType" +] as AbilityTuple<"Archive", "ChargeType">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "ChargeType" +] as AbilityTuple<"Archive", "ChargeType">; + +} diff --git a/test/generated/full/chargeTypes/chargeTypes.api.ts b/test/generated/full/chargeTypes/chargeTypes.api.ts new file mode 100644 index 0000000..b2876a9 --- /dev/null +++ b/test/generated/full/chargeTypes/chargeTypes.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChargeTypesModels } from "./chargeTypes.models"; + +export namespace ChargeTypesApi { +export const findAll = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, + `/charge-types/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, + `/charge-types`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types`, + ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}`, + config + ) +}; +export const update = (id: string, data: ChargeTypesModels.UpdateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}`, + ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/chargeTypes/chargeTypes.configs.ts b/test/generated/full/chargeTypes/chargeTypes.configs.ts new file mode 100644 index 0000000..30d69aa --- /dev/null +++ b/test/generated/full/chargeTypes/chargeTypes.configs.ts @@ -0,0 +1,136 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChargeTypesModels } from "./chargeTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChargeTypesQueries } from "./chargeTypes.queries"; +import { ChargeTypesAcl } from "./chargeTypes.acl"; + +export namespace ChargeTypesConfigs { +export const chargeTypesConfig = { + meta: { + title: "Charge Types", + }, + readAll: { + acl: ChargeTypesAcl.canUsePaginate, + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + paginated: ChargeTypesQueries.usePaginate, + infinite: ChargeTypesQueries.usePaginateInfinite, + filters: { + schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, + options: { + inputs: { + name: true, + search: true, + archived: true, + direction: true, + transportModes: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: ChargeTypesAcl.canUseFindById, + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + query: ChargeTypesQueries.useFindById, + }, + create: { + acl: ChargeTypesAcl.canUseCreate, + schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, + mutation: ChargeTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, + options: { + inputs: { + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + }, + }, +}) + }, + update: { + acl: ChargeTypesAcl.canUseUpdate, + schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, + mutation: ChargeTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, + options: { + inputs: { + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ChargeTypesAcl.canUseFindAll, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChargeTypesQueries.useFindAll, + infinite: ChargeTypesQueries.useFindAllInfinite, + filters: { + schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, + options: { + inputs: { + direction: true, + transportModes: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/chargeTypes/chargeTypes.models.ts b/test/generated/full/chargeTypes/chargeTypes.models.ts new file mode 100644 index 0000000..53f5489 --- /dev/null +++ b/test/generated/full/chargeTypes/chargeTypes.models.ts @@ -0,0 +1,154 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChargeTypesModels { +/** + * ChargeTypeLabelFilterDtoSchema + * @type { object } + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum[] } transportModes + * @property { string } search + */ +export const ChargeTypeLabelFilterDtoSchema = z.object({ direction: CommonModels.DirectionEnumSchema, transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), search: z.string() }).readonly(); +export type ChargeTypeLabelFilterDto = z.infer; + +/** + * ChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ +export const ChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }).readonly(); +export type ChargeTypeTranslationDto = z.infer; + +/** + * ChargeTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChargeTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ChargeTypeEmployeeDTO = z.infer; + +/** + * ChargeTypeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { ChargeTypeTranslationDto[] } translations + * @property { string } createdById + * @property { ChargeTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { ChargeTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const ChargeTypeResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), directions: z.array(CommonModels.DirectionEnumSchema).readonly(), translations: z.array(ChargeTypeTranslationDtoSchema).readonly(), createdById: z.string().nullish(), createdBy: ChargeTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type ChargeTypeResponseDTO = z.infer; + +/** + * ChargeTypePaginationFilterDtoSchema + * @type { object } + * @property { string } name + * @property { string } search + * @property { boolean } archived + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum[] } transportModes + */ +export const ChargeTypePaginationFilterDtoSchema = z.object({ name: z.string(), search: z.string(), archived: z.boolean(), direction: CommonModels.DirectionEnumSchema, transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly() }).readonly(); +export type ChargeTypePaginationFilterDto = z.infer; + +/** + * CreateChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ +export const CreateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }).readonly(); +export type CreateChargeTypeTranslationDto = z.infer; + +/** + * CreateChargeTypeRequestDTOSchema + * @type { object } + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { CreateChargeTypeTranslationDto[] } translations + */ +export const CreateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string(), englishName: z.string().nullish(), archived: z.boolean().nullish(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), directions: z.array(CommonModels.DirectionEnumSchema).readonly(), translations: z.array(CreateChargeTypeTranslationDtoSchema).readonly().nullish() }).readonly(); +export type CreateChargeTypeRequestDTO = z.infer; + +/** + * UpdateChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ +export const UpdateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }).readonly(); +export type UpdateChargeTypeTranslationDto = z.infer; + +/** + * UpdateChargeTypeRequestDTOSchema + * @type { object } + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { UpdateChargeTypeTranslationDto[] } translations + */ +export const UpdateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), directions: z.array(CommonModels.DirectionEnumSchema).readonly(), translations: z.array(UpdateChargeTypeTranslationDtoSchema).readonly() }).readonly(); +export type UpdateChargeTypeRequestDTO = z.infer; + +/** + * ChargeTypesFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ChargeTypesFindAllOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); +export type ChargeTypesFindAllOrderParamEnum = z.infer; +export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnumSchema.enum; + +/** + * ChargeTypesFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ChargeTypesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type ChargeTypesFindAllResponse = z.infer; + +/** + * ChargeTypesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ChargeTypesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); +export type ChargeTypesPaginateOrderParamEnum = z.infer; +export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEnumSchema.enum; + +/** + * ChargeTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChargeTypeResponseDTO[] } items + */ +export const ChargeTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).readonly() }).readonly().shape }); +export type ChargeTypesPaginateResponse = z.infer; + +} diff --git a/test/generated/full/chargeTypes/chargeTypes.queries.ts b/test/generated/full/chargeTypes/chargeTypes.queries.ts new file mode 100644 index 0000000..a91c683 --- /dev/null +++ b/test/generated/full/chargeTypes/chargeTypes.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChargeTypesAcl } from "./chargeTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChargeTypesModels } from "./chargeTypes.models"; +import { ChargeTypesApi } from "./chargeTypes.api"; + +export namespace ChargeTypesQueries { +export const moduleName = QueryModule.ChargeTypes; + +export const keys = { + all: [moduleName] as const, + findAll: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string) => [...keys.all, "/charge-types", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/charge-types/:id", id] as const, +}; + +/** + * Query `useFindAll` + * @summary Paginate charge types with only their labels + * @permission Requires `canUseFindAll` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUseFindAll()); + return ChargeTypesApi.findAll(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @summary Paginate charge types with only their labels + * @permission Requires `canUseFindAll` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChargeTypesAcl.canUseFindAll()); + return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary Paginate Charge Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUsePaginate()); + return ChargeTypesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Charge Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChargeTypesAcl.canUsePaginate()); + return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new Charge Type + * @permission Requires `canUseCreate` ability + * @param { ChargeTypesModels.CreateChargeTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(ChargeTypesAcl.canUseCreate()); + return ChargeTypesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get Charge Type Details by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUseFindById()); + return ChargeTypesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update an existing Charge Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { ChargeTypesModels.UpdateChargeTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(ChargeTypesAcl.canUseUpdate()); + return ChargeTypesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive a Charge Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ChargeTypesAcl.canUseArchive()); + return ChargeTypesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive a Charge Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ChargeTypesAcl.canUseUnarchive()); + return ChargeTypesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/checklistItems/checklistItems.acl.ts b/test/generated/full/checklistItems/checklistItems.acl.ts new file mode 100644 index 0000000..a58bf1f --- /dev/null +++ b/test/generated/full/checklistItems/checklistItems.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ChecklistItemsAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create checklist item in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Create", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List checklist items for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Paginate checklist item labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get checklist item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Update", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +} diff --git a/test/generated/full/checklistItems/checklistItems.api.ts b/test/generated/full/checklistItems/checklistItems.api.ts new file mode 100644 index 0000000..36508b8 --- /dev/null +++ b/test/generated/full/checklistItems/checklistItems.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChecklistItemsModels } from "./checklistItems.models"; + +export namespace ChecklistItemsApi { +export const create = (officeId: string, data: ChecklistItemsModels.CreateChecklistItemRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items`, + ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), + config + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, + `/offices/${officeId}/checklist-items`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, + `/offices/${officeId}/checklist-items/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items/${id}`, + ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-items/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-items/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/checklistItems/checklistItems.configs.ts b/test/generated/full/checklistItems/checklistItems.configs.ts new file mode 100644 index 0000000..f67024d --- /dev/null +++ b/test/generated/full/checklistItems/checklistItems.configs.ts @@ -0,0 +1,116 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChecklistItemsModels } from "./checklistItems.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChecklistItemsQueries } from "./checklistItems.queries"; +import { ChecklistItemsAcl } from "./checklistItems.acl"; + +export namespace ChecklistItemsConfigs { +export const checklistItemsConfig = { + meta: { + title: "Checklist Items", + }, + readAll: { + acl: ChecklistItemsAcl.canUsePaginate, + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + paginated: ChecklistItemsQueries.usePaginate, + infinite: ChecklistItemsQueries.usePaginateInfinite, + filters: { + schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: ChecklistItemsAcl.canUseFindById, + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + query: ChecklistItemsQueries.useFindById, + }, + create: { + acl: ChecklistItemsAcl.canUseCreate, + schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, + mutation: ChecklistItemsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, + update: { + acl: ChecklistItemsAcl.canUseUpdate, + schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, + mutation: ChecklistItemsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: ChecklistItemsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChecklistItemsQueries.usePaginateLabels, + infinite: ChecklistItemsQueries.usePaginateLabelsInfinite, + filters: { + schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/checklistItems/checklistItems.models.ts b/test/generated/full/checklistItems/checklistItems.models.ts new file mode 100644 index 0000000..5d31cea --- /dev/null +++ b/test/generated/full/checklistItems/checklistItems.models.ts @@ -0,0 +1,107 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChecklistItemsModels { +/** + * ChecklistItemEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ChecklistItemEmployeeDTO = z.infer; + +/** + * ChecklistItemResponseDTOSchema + * @type { object } + * @property { string } id Checklist item ID + * @property { string } name Checklist item name + * @property { string } officeId Office ID + * @property { boolean } archived Is archived + * @property { string } archivedAt Archived at + * @property { string } createdById ID of the employee who created this checklist item + * @property { ChecklistItemEmployeeDTO } createdBy Employee who created this checklist item + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this checklist item + * @property { ChecklistItemEmployeeDTO } updatedBy Employee who last updated this checklist item + * @property { string } updatedAt Updated at + */ +export const ChecklistItemResponseDTOSchema = z.object({ id: z.string().describe("Checklist item ID"), name: z.string().describe("Checklist item name"), officeId: z.string().describe("Office ID"), archived: z.boolean().describe("Is archived"), archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), createdById: z.string().describe("ID of the employee who created this checklist item").nullish(), createdBy: ChecklistItemEmployeeDTOSchema.describe("Employee who created this checklist item").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedById: z.string().describe("ID of the employee who last updated this checklist item").nullish(), updatedBy: ChecklistItemEmployeeDTOSchema.describe("Employee who last updated this checklist item").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); +export type ChecklistItemResponseDTO = z.infer; + +/** + * CreateChecklistItemRequestDTOSchema + * @type { object } + * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` + */ +export const CreateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256).describe("Checklist item name") }).readonly(); +export type CreateChecklistItemRequestDTO = z.infer; + +/** + * ChecklistItemLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const ChecklistItemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type ChecklistItemLabelFilterDto = z.infer; + +/** + * ChecklistItemFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ChecklistItemFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); +export type ChecklistItemFilterDto = z.infer; + +/** + * UpdateChecklistItemRequestDTOSchema + * @type { object } + * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` + */ +export const UpdateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256).describe("Checklist item name") }).readonly(); +export type UpdateChecklistItemRequestDTO = z.infer; + +/** + * ChecklistItemsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistItemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistItemsPaginateOrderParamEnum = z.infer; +export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderParamEnumSchema.enum; + +/** + * ChecklistItemsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChecklistItemResponseDTO[] } items + */ +export const ChecklistItemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).readonly() }).readonly().shape }); +export type ChecklistItemsPaginateResponse = z.infer; + +/** + * ChecklistItemsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistItemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistItemsPaginateLabelsOrderParamEnum = z.infer; +export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * ChecklistItemsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type ChecklistItemsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/checklistItems/checklistItems.queries.ts b/test/generated/full/checklistItems/checklistItems.queries.ts new file mode 100644 index 0000000..4ec35c8 --- /dev/null +++ b/test/generated/full/checklistItems/checklistItems.queries.ts @@ -0,0 +1,270 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChecklistItemsAcl } from "./checklistItems.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChecklistItemsModels } from "./checklistItems.models"; +import { ChecklistItemsApi } from "./checklistItems.api"; + +export namespace ChecklistItemsQueries { +export const moduleName = QueryModule.ChecklistItems; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-items/:id", id, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create checklist item + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ChecklistItemsModels.CreateChecklistItemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ChecklistItemsAcl.canUseCreate({ officeId } )); + return ChecklistItemsApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Get paginated checklist items + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); + return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated checklist items + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); + return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate checklist item labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate checklist item labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get checklist item by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUseFindById({ officeId } )); + return ChecklistItemsApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update checklist item + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ChecklistItemsModels.UpdateChecklistItemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId } )); + return ChecklistItemsApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive checklist item + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistItemsAcl.canUseArchive({ officeId } )); + return ChecklistItemsApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive checklist item + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId } )); + return ChecklistItemsApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/checklistTemplates/checklistTemplates.acl.ts b/test/generated/full/checklistTemplates/checklistTemplates.acl.ts new file mode 100644 index 0000000..d92f5fd --- /dev/null +++ b/test/generated/full/checklistTemplates/checklistTemplates.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ChecklistTemplatesAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create checklist template in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Create", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List checklist templates for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Get checklist template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get checklist template by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Update", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +} diff --git a/test/generated/full/checklistTemplates/checklistTemplates.api.ts b/test/generated/full/checklistTemplates/checklistTemplates.api.ts new file mode 100644 index 0000000..e0b177b --- /dev/null +++ b/test/generated/full/checklistTemplates/checklistTemplates.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; + +export namespace ChecklistTemplatesApi { +export const create = (officeId: string, data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates`, + ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), + config + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, + `/offices/${officeId}/checklist-templates`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/checklist-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates/${id}`, + ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-templates/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-templates/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/checklistTemplates/checklistTemplates.configs.ts b/test/generated/full/checklistTemplates/checklistTemplates.configs.ts new file mode 100644 index 0000000..474d9c0 --- /dev/null +++ b/test/generated/full/checklistTemplates/checklistTemplates.configs.ts @@ -0,0 +1,118 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChecklistTemplatesQueries } from "./checklistTemplates.queries"; +import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; + +export namespace ChecklistTemplatesConfigs { +export const checklistTemplatesConfig = { + meta: { + title: "Checklist Templates", + }, + readAll: { + acl: ChecklistTemplatesAcl.canUsePaginate, + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + paginated: ChecklistTemplatesQueries.usePaginate, + infinite: ChecklistTemplatesQueries.usePaginateInfinite, + filters: { + schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + items: true, + }, + sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: ChecklistTemplatesAcl.canUseFindById, + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + query: ChecklistTemplatesQueries.useFindById, + }, + create: { + acl: ChecklistTemplatesAcl.canUseCreate, + schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, + mutation: ChecklistTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, + update: { + acl: ChecklistTemplatesAcl.canUseUpdate, + schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, + mutation: ChecklistTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + items: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ChecklistTemplatesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChecklistTemplatesQueries.usePaginateLabels, + infinite: ChecklistTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/checklistTemplates/checklistTemplates.models.ts b/test/generated/full/checklistTemplates/checklistTemplates.models.ts new file mode 100644 index 0000000..3c0da4d --- /dev/null +++ b/test/generated/full/checklistTemplates/checklistTemplates.models.ts @@ -0,0 +1,119 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChecklistTemplatesModels { +/** + * ChecklistTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ChecklistTemplateEmployeeDTO = z.infer; + +/** + * ChecklistTemplateItemResponseDTOSchema + * @type { object } + * @property { string } checklistItemId Checklist item id + * @property { number } order Order index + * @property { string } name Checklist item name + */ +export const ChecklistTemplateItemResponseDTOSchema = z.object({ checklistItemId: z.string().describe("Checklist item id"), order: z.number().describe("Order index"), name: z.string().describe("Checklist item name").nullish() }).readonly(); +export type ChecklistTemplateItemResponseDTO = z.infer; + +/** + * ChecklistTemplateResponseDTOSchema + * @type { object } + * @property { string } id Template id + * @property { string } name Template name + * @property { string } officeId Office id + * @property { boolean } archived Is archived + * @property { string } archivedAt Archived at + * @property { string } createdById ID of the employee who created this template + * @property { ChecklistTemplateEmployeeDTO } createdBy Employee who created this template + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this template + * @property { ChecklistTemplateEmployeeDTO } updatedBy Employee who last updated this template + * @property { string } updatedAt Updated at + * @property { ChecklistTemplateItemResponseDTO[] } items Ordered items + */ +export const ChecklistTemplateResponseDTOSchema = z.object({ id: z.string().describe("Template id"), name: z.string().describe("Template name"), officeId: z.string().describe("Office id"), archived: z.boolean().describe("Is archived"), archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), createdById: z.string().describe("ID of the employee who created this template").nullish(), createdBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), updatedBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), items: z.array(ChecklistTemplateItemResponseDTOSchema).readonly().describe("Ordered items") }).readonly(); +export type ChecklistTemplateResponseDTO = z.infer; + +/** + * CreateChecklistTemplateRequestDTOSchema + * @type { object } + * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` + */ +export const CreateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120).describe("Checklist template name") }).readonly(); +export type CreateChecklistTemplateRequestDTO = z.infer; + +/** + * ChecklistTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const ChecklistTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type ChecklistTemplateLabelFilterDto = z.infer; + +/** + * ChecklistTemplateFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ChecklistTemplateFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); +export type ChecklistTemplateFilterDto = z.infer; + +/** + * UpdateChecklistTemplateRequestDTOSchema + * @type { object } + * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` + * @property { string[] } items Ordered checklist item ids + */ +export const UpdateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120).describe("Checklist template name"), items: z.array(z.uuid()).readonly().describe("Ordered checklist item ids") }).readonly(); +export type UpdateChecklistTemplateRequestDTO = z.infer; + +/** + * ChecklistTemplatesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistTemplatesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistTemplatesPaginateOrderParamEnum = z.infer; +export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPaginateOrderParamEnumSchema.enum; + +/** + * ChecklistTemplatesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChecklistTemplateResponseDTO[] } items + */ +export const ChecklistTemplatesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).readonly() }).readonly().shape }); +export type ChecklistTemplatesPaginateResponse = z.infer; + +/** + * ChecklistTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistTemplatesPaginateLabelsOrderParamEnum = z.infer; +export const ChecklistTemplatesPaginateLabelsOrderParamEnum = ChecklistTemplatesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * ChecklistTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type ChecklistTemplatesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/checklistTemplates/checklistTemplates.queries.ts b/test/generated/full/checklistTemplates/checklistTemplates.queries.ts new file mode 100644 index 0000000..bbbf515 --- /dev/null +++ b/test/generated/full/checklistTemplates/checklistTemplates.queries.ts @@ -0,0 +1,270 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; +import { ChecklistTemplatesApi } from "./checklistTemplates.api"; + +export namespace ChecklistTemplatesQueries { +export const moduleName = QueryModule.ChecklistTemplates; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-templates/:id", id, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create checklist template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId } )); + return ChecklistTemplatesApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Get paginated checklist templates + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated checklist templates + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate checklist template labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate checklist template labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get checklist template by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId } )); + return ChecklistTemplatesApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Replace checklist template + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId } )); + return ChecklistTemplatesApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive checklist template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId } )); + return ChecklistTemplatesApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive checklist template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId } )); + return ChecklistTemplatesApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/cities/cities.acl.ts b/test/generated/full/cities/cities.acl.ts new file mode 100644 index 0000000..877afd1 --- /dev/null +++ b/test/generated/full/cities/cities.acl.ts @@ -0,0 +1,84 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CitiesAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "City" +] as AbilityTuple<"Create", "City">; + +/** + * Use for `useListCityLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCityLabels` query + */ +export const canUseListCityLabels = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useGetCityLabelById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCityLabelById` query + */ +export const canUseGetCityLabelById = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "City" +] as AbilityTuple<"Update", "City">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "City" +] as AbilityTuple<"Archive", "City">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "City" +] as AbilityTuple<"Archive", "City">; + +} diff --git a/test/generated/full/cities/cities.api.ts b/test/generated/full/cities/cities.api.ts new file mode 100644 index 0000000..17b6f45 --- /dev/null +++ b/test/generated/full/cities/cities.api.ts @@ -0,0 +1,86 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CitiesModels } from "./cities.models"; + +export namespace CitiesApi { +export const paginate = (limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CitiesModels.CitiesPaginateResponseSchema }, + `/cities`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: CitiesModels.CreateCityRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities`, + ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), + config + ) +}; +export const listCityLabels = (limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CitiesModels.ListCityLabelsResponseSchema }, + `/cities/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getCityLabelById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CitiesModels.CityLabelResponseDTOSchema }, + `/cities/${id}/labels`, + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities/${id}`, + config + ) +}; +export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities/${id}`, + ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/cities/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/cities/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/cities/cities.configs.ts b/test/generated/full/cities/cities.configs.ts new file mode 100644 index 0000000..f31740c --- /dev/null +++ b/test/generated/full/cities/cities.configs.ts @@ -0,0 +1,124 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CitiesModels } from "./cities.models"; +import { CitiesQueries } from "./cities.queries"; +import { CitiesAcl } from "./cities.acl"; + +export namespace CitiesConfigs { +export const citiesConfig = { + meta: { + title: "Cities", + }, + readAll: { + acl: CitiesAcl.canUsePaginate, + schema: CitiesModels.CityResponseDTOSchema, + paginated: CitiesQueries.usePaginate, + infinite: CitiesQueries.usePaginateInfinite, + filters: { + schema: CitiesModels.CityPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CitiesModels.CityPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CitiesModels.CityResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + isoCode: true, + stateCode: true, + archived: true, + countryId: true, + country: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CitiesModels.CitiesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: CitiesAcl.canUseFindById, + schema: CitiesModels.CityResponseDTOSchema, + query: CitiesQueries.useFindById, + }, + create: { + acl: CitiesAcl.canUseCreate, + schema: CitiesModels.CreateCityRequestDTOSchema, + mutation: CitiesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CitiesModels.CreateCityRequestDTOSchema, + options: { + inputs: { + name: true, + isoCode: true, + stateCode: true, + countryId: true, + }, + }, +}) + }, + update: { + acl: CitiesAcl.canUseUpdate, + schema: CitiesModels.UpdateCityRequestDTOSchema, + mutation: CitiesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CitiesModels.UpdateCityRequestDTOSchema, + options: { + inputs: { + name: true, + isoCode: true, + stateCode: true, + countryId: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: CitiesAcl.canUseListCityLabels, + schema: CitiesModels.CityLabelResponseDTOSchema, + paginated: CitiesQueries.useListCityLabels, + infinite: CitiesQueries.useListCityLabelsInfinite, + filters: { + schema: CitiesModels.CityLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CitiesModels.CityLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CitiesModels.CityLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + country: true, + }, + sortable: CitiesModels.ListCityLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/cities/cities.models.ts b/test/generated/full/cities/cities.models.ts new file mode 100644 index 0000000..8b422a7 --- /dev/null +++ b/test/generated/full/cities/cities.models.ts @@ -0,0 +1,145 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CitiesModels { +/** + * CityCountryDtoSchema + * @type { object } + * @property { string } id Unique identifier of the country + * @property { string } name Name of the country + * @property { string } isoCode2 2 character iso code of the country + * @property { string } isoCode3 3 character iso code of the country + */ +export const CityCountryDtoSchema = z.object({ id: z.string().describe("Unique identifier of the country"), name: z.string().describe("Name of the country"), isoCode2: z.string().describe("2 character iso code of the country"), isoCode3: z.string().describe("3 character iso code of the country") }).readonly(); +export type CityCountryDto = z.infer; + +/** + * CityEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CityEmployeeDTO = z.infer; + +/** + * CityResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the city + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { boolean } archived Whether the city is archived + * @property { string } countryId Country ID + * @property { CityCountryDto } country + * @property { string } createdById + * @property { CityEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CityEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const CityResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the city"), name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city").nullish(), stateCode: z.string().describe("State code of the city").nullish(), archived: z.boolean().describe("Whether the city is archived").nullish(), countryId: z.string().describe("Country ID").nullish(), country: CityCountryDtoSchema.nullish(), createdById: z.string().nullish(), createdBy: CityEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CityEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type CityResponseDTO = z.infer; + +/** + * CityLabelCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CityLabelCountryDto = z.infer; + +/** + * CityLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { CityLabelCountryDto } country + */ +export const CityLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }).readonly(); +export type CityLabelResponseDTO = z.infer; + +/** + * CityPaginationFilterDtoSchema + * @type { object } + * @property { string } search Free search + * @property { boolean } archived + */ +export const CityPaginationFilterDtoSchema = z.object({ search: z.string().describe("Free search"), archived: z.boolean() }).readonly(); +export type CityPaginationFilterDto = z.infer; + +/** + * CityLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const CityLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type CityLabelFilterDto = z.infer; + +/** + * CreateCityRequestDTOSchema + * @type { object } + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { string } countryId Country ID + */ +export const CreateCityRequestDTOSchema = z.object({ name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city").nullish(), stateCode: z.string().describe("State code of the city").nullish(), countryId: z.string().describe("Country ID") }).readonly(); +export type CreateCityRequestDTO = z.infer; + +/** + * UpdateCityRequestDTOSchema + * @type { object } + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { string } countryId Country ID + */ +export const UpdateCityRequestDTOSchema = z.object({ name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city"), stateCode: z.string().describe("State code of the city"), countryId: z.string().describe("Country ID") }).readonly(); +export type UpdateCityRequestDTO = z.infer; + +/** + * CitiesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const CitiesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type CitiesPaginateOrderParamEnum = z.infer; +export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.enum; + +/** + * CitiesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CityResponseDTO[] } items + */ +export const CitiesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityResponseDTOSchema).readonly() }).readonly().shape }); +export type CitiesPaginateResponse = z.infer; + +/** + * ListCityLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ListCityLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ListCityLabelsOrderParamEnum = z.infer; +export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.enum; + +/** + * ListCityLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CityLabelResponseDTO[] } items + */ +export const ListCityLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type ListCityLabelsResponse = z.infer; + +} diff --git a/test/generated/full/cities/cities.queries.ts b/test/generated/full/cities/cities.queries.ts new file mode 100644 index 0000000..4ed9739 --- /dev/null +++ b/test/generated/full/cities/cities.queries.ts @@ -0,0 +1,283 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CitiesAcl } from "./cities.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CitiesModels } from "./cities.models"; +import { CitiesApi } from "./cities.api"; + +export namespace CitiesQueries { +export const moduleName = QueryModule.Cities; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string) => [...keys.all, "/cities", "infinite", limit, order, filter, cursor] as const, + listCityLabels: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities/paginate/labels", limit, order, filter, page, cursor] as const, + listCityLabelsInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string) => [...keys.all, "/cities/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getCityLabelById: (id: string) => [...keys.all, "/cities/:id/labels", id] as const, + findById: (id: string) => [...keys.all, "/cities/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Cities + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CitiesAcl.canUsePaginate()); + return CitiesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Cities + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CitiesAcl.canUsePaginate()); + return CitiesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create city + * @permission Requires `canUseCreate` ability + * @param { CitiesModels.CreateCityRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CitiesAcl.canUseCreate()); + return CitiesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListCityLabels` + * @summary Paginate cities with only their labels (id and name) and country information + * @permission Requires `canUseListCityLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCityLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCityLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CitiesAcl.canUseListCityLabels()); + return CitiesApi.listCityLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListCityLabelsInfinite + * @summary Paginate cities with only their labels (id and name) and country information + * @permission Requires `canUseListCityLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListCityLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CitiesAcl.canUseListCityLabels()); + return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetCityLabelById` + * @summary Get city by ID with label format (id and formatted name) and country information + * @permission Requires `canUseGetCityLabelById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCityLabelById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCityLabelById(id), + queryFn: () => { + checkAcl(CitiesAcl.canUseGetCityLabelById()); + return CitiesApi.getCityLabelById(id, config) }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get city by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(CitiesAcl.canUseFindById()); + return CitiesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update city + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { CitiesModels.UpdateCityRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(CitiesAcl.canUseUpdate()); + return CitiesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive city + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CitiesAcl.canUseArchive()); + return CitiesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive city + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CitiesAcl.canUseUnarchive()); + return CitiesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/common/common.models.ts b/test/generated/full/common/common.models.ts new file mode 100644 index 0000000..42415c1 --- /dev/null +++ b/test/generated/full/common/common.models.ts @@ -0,0 +1,1860 @@ +import { z } from "zod"; + +export namespace CommonModels { +/** + * PositionCargoPackageEnumSchema + * @type { enum } + */ +export const PositionCargoPackageEnumSchema = z.enum(["Hazardous", "NonStackable", "TemperatureControlled", "OversizedCargo", "DiplomaticCargo"]); +export type PositionCargoPackageEnum = z.infer; +export const PositionCargoPackageEnum = PositionCargoPackageEnumSchema.enum; + +/** + * HazardousSpecialtyEnumSchema + * @type { enum } + */ +export const HazardousSpecialtyEnumSchema = z.enum(["Explosives", "FlammableGas", "NonToxicAndFlammableGas", "PoisonGases", "FlammableLiquid", "FlammableSolid", "SpontaneouslyCombustible", "DangerousWhenWet", "Oxidizers", "OrganicPeroxides", "Poison", "InfectiousSubstances", "Radioactive", "Corrosive", "MiscellaneousDangerousSubstances"]); +export type HazardousSpecialtyEnum = z.infer; +export const HazardousSpecialtyEnum = HazardousSpecialtyEnumSchema.enum; + +/** + * RateOptionsEnumSchema + * @type { enum } + */ +export const RateOptionsEnumSchema = z.enum(["AsAgreed", "SpotRate"]); +export type RateOptionsEnum = z.infer; +export const RateOptionsEnum = RateOptionsEnumSchema.enum; + +/** + * RateClassEnumSchema + * @type { enum } + */ +export const RateClassEnumSchema = z.enum(["MinimumCharge", "NormalRate", "QuantityRate"]); +export type RateClassEnum = z.infer; +export const RateClassEnum = RateClassEnumSchema.enum; + +/** + * AccountInformationEnumSchema + * @type { enum } + * @description Account information + */ +export const AccountInformationEnumSchema = z.enum(["FreightCollect", "FreightPrepaid"]); +export type AccountInformationEnum = z.infer; +export const AccountInformationEnum = AccountInformationEnumSchema.enum; + +/** + * LanguageEnumSchema + * @type { enum } + */ +export const LanguageEnumSchema = z.enum(["English", "German", "Hungarian", "Czech", "Turkish", "Slovenian"]); +export type LanguageEnum = z.infer; +export const LanguageEnum = LanguageEnumSchema.enum; + +/** + * LocaleEnumSchema + * @type { enum } + */ +export const LocaleEnumSchema = z.enum(["en-US", "de-DE", "cs-CZ", "sl-SI", "tr-TR", "hu-HU"]); +export type LocaleEnum = z.infer; +export const LocaleEnum = LocaleEnumSchema.enum; + +/** + * OfficePaymentTermsDateTypeSchema + * @type { enum } + */ +export const OfficePaymentTermsDateTypeSchema = z.enum(["InvoiceDate", "ServiceDate"]); +export type OfficePaymentTermsDateType = z.infer; +export const OfficePaymentTermsDateType = OfficePaymentTermsDateTypeSchema.enum; + +/** + * FolderEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type FolderEmployeeDTO = z.infer; + +/** + * FileResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } archived + * @property { boolean } isSystem + * @property { string } createdAt + * @property { string } updatedAt + * @property { FolderEmployeeDTO } createdBy + * @property { FolderEmployeeDTO } updatedBy + * @property { string } downloadUrl + */ +export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }).readonly(); +export type FileResponseDTO = z.infer; + +/** + * EditorContentUpdateDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const EditorContentUpdateDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export type EditorContentUpdateDto = z.infer; + +/** + * RemarkBlockDTOSchema + * @type { object } + * @property { string } id + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { EditorContentUpdateDto } content + */ +export const RemarkBlockDTOSchema = z.object({ id: z.string(), enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), content: CommonModels.EditorContentUpdateDtoSchema }).readonly(); +export type RemarkBlockDTO = z.infer; + +/** + * TitleBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { string } defaultTitle + * @property { boolean } includePositionNumber + * @property { boolean } allowManualOverride + */ +export const TitleBlockDTOSchema = z.object({ enabled: z.boolean(), defaultTitle: z.string(), includePositionNumber: z.boolean(), allowManualOverride: z.boolean() }).readonly(); +export type TitleBlockDTO = z.infer; + +/** + * PositionInvolvedPartyTypeEnumSchema + * @type { enum } + */ +export const PositionInvolvedPartyTypeEnumSchema = z.enum(["Customer", "Notify", "AlsoNotify", "FOBForwarder", "RoutingAgent", "DeliveryAgent", "TransportProvider", "OceanCarrier", "OriginServiceProvider", "DestinationServiceProvider", "InsuranceProvider", "OriginCustomsAgent", "DestinationCustomsAgent", "StuffingProvider", "StrippingProvider", "Shipper", "Consignee", "CustomsBroker", "Courier", "Trucker", "Airline", "DestinationAgent", "OriginAgent"]); +export type PositionInvolvedPartyTypeEnum = z.infer; +export const PositionInvolvedPartyTypeEnum = PositionInvolvedPartyTypeEnumSchema.enum; + +/** + * ReceiverBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { string } defaultRole + */ +export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema }).readonly(); +export type ReceiverBlockDTO = z.infer; + +/** + * OurInformationBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } showName + * @property { boolean } showPhone + * @property { boolean } showDate + * @property { boolean } showBookingNumber + * @property { boolean } showCustomerReference + * @property { boolean } showMasterBillOfLadingNumber + * @property { boolean } showHouseBillOfLadingNumber + */ +export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean(), showName: z.boolean(), showPhone: z.boolean(), showDate: z.boolean(), showBookingNumber: z.boolean(), showCustomerReference: z.boolean(), showMasterBillOfLadingNumber: z.boolean(), showHouseBillOfLadingNumber: z.boolean() }).readonly(); +export type OurInformationBlockDTO = z.infer; + +/** + * RouteTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } showDate + * @property { boolean } showLocation + * @property { boolean } showType + * @property { boolean } showReference + * @property { boolean } showVesselVoyage + * @property { boolean } showAddress + * @property { boolean } showProvider + */ +export const RouteTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showDate: z.boolean(), showLocation: z.boolean(), showType: z.boolean(), showReference: z.boolean(), showVesselVoyage: z.boolean(), showAddress: z.boolean(), showProvider: z.boolean() }).readonly(); +export type RouteTableBlockDTO = z.infer; + +/** + * CargoTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + */ +export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export type CargoTableBlockDTO = z.infer; + +/** + * CargoSummaryBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + */ +export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export type CargoSummaryBlockDTO = z.infer; + +/** + * FinanceTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } showOnlyForReceiver + * @property { boolean } showVendor + * @property { boolean } showBuyRate + * @property { boolean } showCustomer + * @property { boolean } showSellRate + * @property { boolean } showGrid + * @property { boolean } showCharges + * @property { boolean } showAdditionalText + * @property { boolean } showQuantity + * @property { boolean } showProfit + * @property { boolean } showTotalsByCurrency + * @property { boolean } includeSubPositions + * @property { boolean } subPositionTotals + * @property { boolean } showBuyRateExchangeRates + * @property { boolean } showSellRateExchangeRates + * @property { boolean } showTotal + */ +export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showOnlyForReceiver: z.boolean(), showVendor: z.boolean(), showBuyRate: z.boolean(), showCustomer: z.boolean(), showSellRate: z.boolean(), showGrid: z.boolean(), showCharges: z.boolean(), showAdditionalText: z.boolean(), showQuantity: z.boolean(), showProfit: z.boolean(), showTotalsByCurrency: z.boolean(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean(), showSellRateExchangeRates: z.boolean(), showTotal: z.boolean() }).readonly(); +export type FinanceTableBlockDTO = z.infer; + +/** + * FooterBlockDTOSchema + * @type { object } + * @property { boolean } enabled + */ +export const FooterBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export type FooterBlockDTO = z.infer; + +/** + * TermsBlockDTOSchema + * @type { object } + * @property { boolean } enabled + */ +export const TermsBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export type TermsBlockDTO = z.infer; + +/** + * CutOffDatesBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } billOfLadingFromCustomer + * @property { boolean } billOfLadingToCarrier + * @property { boolean } customsAMS + * @property { boolean } vgmCustomer + */ +export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), billOfLadingFromCustomer: z.boolean(), billOfLadingToCarrier: z.boolean(), customsAMS: z.boolean(), vgmCustomer: z.boolean() }).readonly(); +export type CutOffDatesBlockDTO = z.infer; + +/** + * TemplateBlocksResponseDTOSchema + * @type { object } + * @property { TitleBlockDTO } titleBlock + * @property { ReceiverBlockDTO } receiverBlock + * @property { OurInformationBlockDTO } ourInformationBlock + * @property { RouteTableBlockDTO } routeTableBlock + * @property { CargoTableBlockDTO } cargoTableBlock + * @property { CargoSummaryBlockDTO } cargoSummaryBlock + * @property { FinanceTableBlockDTO } financeTableBlock + * @property { RemarkBlockDTO[] } remarkBlocks + * @property { FooterBlockDTO } footerBlock + * @property { TermsBlockDTO } termsBlock + * @property { CutOffDatesBlockDTO } cutOffDatesBlock + */ +export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); +export type TemplateBlocksResponseDTO = z.infer; + +/** + * RouteTableProviderDtoSchema + * @type { object } + * @property { string } id Provider ID + * @property { string } name Provider name + */ +export const RouteTableProviderDtoSchema = z.object({ id: z.string().describe("Provider ID"), name: z.string().describe("Provider name") }).readonly(); +export type RouteTableProviderDto = z.infer; + +/** + * RouteTablePointDtoSchema + * @type { object } + * @property { string } id Route point ID + * @property { string } type Route point type + * @property { string } datetime Route point datetime + * @property { string } secondaryDatetime Route point secondary datetime + * @property { string } address Route point address + * @property { string } name Route point address name + * @property { string } reference Route point reference + * @property { RouteTableProviderDto } provider Route point provider + * @property { string } vessel Vessel information + * @property { string } voyage Voyage information + * @property { string } carrier Carrier name + */ +export const RouteTablePointDtoSchema = z.object({ id: z.string().describe("Route point ID"), type: z.string().describe("Route point type"), datetime: z.string().describe("Route point datetime").nullish(), secondaryDatetime: z.string().describe("Route point secondary datetime").nullish(), address: z.string().describe("Route point address").nullish(), name: z.string().describe("Route point address name").nullish(), reference: z.string().describe("Route point reference").nullish(), provider: CommonModels.RouteTableProviderDtoSchema.describe("Route point provider").nullish(), vessel: z.string().describe("Vessel information").nullish(), voyage: z.string().describe("Voyage information").nullish(), carrier: z.string().describe("Carrier name").nullish() }).readonly(); +export type RouteTablePointDto = z.infer; + +/** + * RouteTableBlockResponseDtoSchema + * @type { object } + * @property { string } selectedRouteId Selected route ID + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { boolean } showReference Show reference column + * @property { boolean } showVesselVoyage Show vessel/voyage column + * @property { boolean } showProvider Show provider column + * @property { RouteTablePointDto[] } points Route points + * @property { boolean } showAddress Show address + * @property { boolean } showDates Show dates + * @property { boolean } showType Show type + * @property { boolean } showLocation Show location + * @property { boolean } showGrid Show grid + * @property { boolean } suppressRoute Suppress route + */ +export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID").nullish(), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish(), showAddress: z.boolean().describe("Show address").nullish(), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); +export type RouteTableBlockResponseDto = z.infer; + +/** + * CargoSpecialtyDtoSchema + * @type { object } + * @property { string } name + * @property { string } unNumber UN number for hazardous specialty + * @property { string } IMOClass IMO class for hazardous specialty + * @property { number } temperatureFrom Temperature from (°C) for temperature-controlled specialty + * @property { number } temperatureUntil Temperature until (°C) for temperature-controlled specialty + */ +export const CargoSpecialtyDtoSchema = z.object({ name: CommonModels.PositionCargoPackageEnumSchema, unNumber: z.string().describe("UN number for hazardous specialty").nullish(), IMOClass: z.string().describe("IMO class for hazardous specialty").nullish(), temperatureFrom: z.number().describe("Temperature from (°C) for temperature-controlled specialty").nullish(), temperatureUntil: z.number().describe("Temperature until (°C) for temperature-controlled specialty").nullish() }).readonly(); +export type CargoSpecialtyDto = z.infer; + +/** + * CargoPackageDtoSchema + * @type { object } + * @property { string } id Package ID + * @property { string } description Package description + * @property { string } weight Weight + * @property { string } hsCodes HS codes (numeric only) + * @property { number } quantity Quantity + * @property { number } width Width (cm) + * @property { number } length Length (cm) + * @property { number } height Height (cm) + * @property { number } volume Total volume in m3 for this package group + * @property { string } packageType Package type name + * @property { string } caseMarks Case marks + * @property { CargoSpecialtyDto[] } specialties Package specialties + * @property { number } chargeableWeight Chargeable weight in kg + * @property { number } volumetricWeight Volumetric weight in kg + */ +export const CargoPackageDtoSchema = z.object({ id: z.string().describe("Package ID"), description: z.string().describe("Package description").nullish(), weight: z.string().describe("Weight").nullish(), hsCodes: z.string().describe("HS codes (numeric only)").nullish(), quantity: z.number().describe("Quantity").nullish(), width: z.number().describe("Width (cm)").nullish(), length: z.number().describe("Length (cm)").nullish(), height: z.number().describe("Height (cm)").nullish(), volume: z.number().describe("Total volume in m3 for this package group").nullish(), packageType: z.string().describe("Package type name").nullish(), caseMarks: z.string().describe("Case marks").nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).readonly().describe("Package specialties").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg").nullish() }).readonly(); +export type CargoPackageDto = z.infer; + +/** + * CargoItemRouteDtoSchema + * @type { object } + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { RouteTablePointDto[] } points Route points + */ +export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish() }).readonly(); +export type CargoItemRouteDto = z.infer; + +/** + * CargoItemDtoSchema + * @type { object } + * @property { string } cargoId Cargo ID + * @property { string } cargoType Cargo type + * @property { string } containerNumber Container number + * @property { string } seal1 First seal (sea cargo only) + * @property { string } seal2 Second seal (sea cargo only) + * @property { string } vgm Verified gross mass (VGM) for container, sea cargo only + * @property { number } totalGrossWeight Total gross weight from cargo details + * @property { number } totalVolume Total volume (m3) calculated from cargo packages + * @property { number } chargeableWeight Chargeable weight in kg for transport unit + * @property { number } volumetricWeight Volumetric weight in kg for transport unit + * @property { CargoPackageDto[] } packages Cargo packages + * @property { string[] } selectedPackageIds Selected cargo package IDs + * @property { CargoItemRouteDto } route Cargo route (when routes are split) + */ +export const CargoItemDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID"), cargoType: z.string().describe("Cargo type"), containerNumber: z.string().describe("Container number").nullish(), seal1: z.string().describe("First seal (sea cargo only)").nullish(), seal2: z.string().describe("Second seal (sea cargo only)").nullish(), vgm: z.string().describe("Verified gross mass (VGM) for container, sea cargo only").nullish(), totalGrossWeight: z.number().describe("Total gross weight from cargo details").nullish(), totalVolume: z.number().describe("Total volume (m3) calculated from cargo packages").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg for transport unit").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg for transport unit").nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema).readonly().describe("Cargo packages"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteDtoSchema.describe("Cargo route (when routes are split)").nullish() }).readonly(); +export type CargoItemDto = z.infer; + +/** + * CargoTableBlockDtoSchema + * @type { object } + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { boolean } suppressWeight Suppress weight column display + * @property { boolean } showGrid Show grid borders in cargo table + * @property { boolean } suppressVolume Suppress volume column display + * @property { boolean } suppressSpecialities Suppress specialities column display + * @property { boolean } suppressDimensions Suppress dimensions column display + * @property { boolean } suppressPackageVolume Suppress package volume column display + * @property { boolean } suppressPackageWeight Suppress package weight column display + * @property { boolean } showGrandTotal Show grand total + * @property { boolean } showTransportUnitTotal Show transport unit total + * @property { boolean } showRoute Show route information (only applicable when routes are split) + * @property { boolean } suppressCargo Suppress cargo table display + * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units + * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units + * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages + * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages + * @property { boolean } showPackageHSCodes Show HS codes for packages + * @property { boolean } showPackageType Show package type for packages + * @property { boolean } showPackageQuantity Show quantity for packages + * @property { boolean } showPackageDescription Show description for packages + * @property { boolean } showPackageCaseMarks Show case marks for packages + * @property { boolean } showTransportUnitNumber Show transport unit number + * @property { boolean } showTransportUnitType Show transport unit type + * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 + * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 + * @property { CargoItemDto[] } items Cargo items + */ +export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs").nullish(), suppressWeight: z.boolean().describe("Suppress weight column display").nullish(), showGrid: z.boolean().describe("Show grid borders in cargo table").nullish(), suppressVolume: z.boolean().describe("Suppress volume column display").nullish(), suppressSpecialities: z.boolean().describe("Suppress specialities column display").nullish(), suppressDimensions: z.boolean().describe("Suppress dimensions column display").nullish(), suppressPackageVolume: z.boolean().describe("Suppress package volume column display").nullish(), suppressPackageWeight: z.boolean().describe("Suppress package weight column display").nullish(), showGrandTotal: z.boolean().describe("Show grand total").nullish(), showTransportUnitTotal: z.boolean().describe("Show transport unit total").nullish(), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullish(), suppressCargo: z.boolean().describe("Suppress cargo table display").nullish(), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units").nullish(), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units").nullish(), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages").nullish(), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages").nullish(), showPackageHSCodes: z.boolean().describe("Show HS codes for packages").nullish(), showPackageType: z.boolean().describe("Show package type for packages").nullish(), showPackageQuantity: z.boolean().describe("Show quantity for packages").nullish(), showPackageDescription: z.boolean().describe("Show description for packages").nullish(), showPackageCaseMarks: z.boolean().describe("Show case marks for packages").nullish(), showTransportUnitNumber: z.boolean().describe("Show transport unit number").nullish(), showTransportUnitType: z.boolean().describe("Show transport unit type").nullish(), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1").nullish(), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2").nullish(), items: z.array(CommonModels.CargoItemDtoSchema).readonly().describe("Cargo items") }).readonly(); +export type CargoTableBlockDto = z.infer; + +/** + * SummaryCargoItemDtoSchema + * @type { object } + * @property { string } transportUnitType Cargo type name (transport unit type) + * @property { number } quantity Count of cargos for this type + * @property { string } description Comma-joined transport unit numbers or custom description + */ +export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), quantity: z.number().describe("Count of cargos for this type"), description: z.string().describe("Comma-joined transport unit numbers or custom description") }).readonly(); +export type SummaryCargoItemDto = z.infer; + +/** + * SummaryCargoBlockResponseDtoSchema + * @type { object } + * @property { SummaryCargoItemDto[] } items + */ +export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema).readonly() }).readonly(); +export type SummaryCargoBlockResponseDto = z.infer; + +/** + * PositionAccountItemTypeEnumSchema + * @type { enum } + */ +export const PositionAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); +export type PositionAccountItemTypeEnum = z.infer; +export const PositionAccountItemTypeEnum = PositionAccountItemTypeEnumSchema.enum; + +/** + * FinanceRowDtoSchema + * @type { object } + * @property { string } id Finance row ID + * @property { PositionAccountItemTypeEnum } type Item type + * @property { string } chargeType Charge type + * @property { string } additionalText Additional text + * @property { string } text Text content + * @property { number } buyAmount Buy amount + * @property { string } buyCurrencyNotation Buy currency notation + * @property { number } sellAmount Sell amount + * @property { string } sellCurrencyNotation Sell currency notation + * @property { string } buyBPName Buy business partner name + * @property { string } sellBPName Sell business partner name + * @property { number } sellExchangeRate Sell exchange rate + * @property { number } buyExchangeRate Buy exchange rate + * @property { number } quantity Quantity + */ +export const FinanceRowDtoSchema = z.object({ id: z.string().describe("Finance row ID"), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), chargeType: z.string().describe("Charge type").nullish(), additionalText: z.string().describe("Additional text").nullish(), text: z.string().describe("Text content").nullish(), buyAmount: z.number().describe("Buy amount").nullish(), buyCurrencyNotation: z.string().describe("Buy currency notation").nullish(), sellAmount: z.number().describe("Sell amount").nullish(), sellCurrencyNotation: z.string().describe("Sell currency notation").nullish(), buyBPName: z.string().describe("Buy business partner name").nullish(), sellBPName: z.string().describe("Sell business partner name").nullish(), sellExchangeRate: z.number().describe("Sell exchange rate").nullish(), buyExchangeRate: z.number().describe("Buy exchange rate").nullish(), quantity: z.number().describe("Quantity").nullish() }).readonly(); +export type FinanceRowDto = z.infer; + +/** + * FinanceTotalsDtoSchema + * @type { object } + * @property { number } customerTotal Customer total + * @property { number } vendorTotal Vendor total + * @property { number } combinedTotal Combined total + * @property { string } currencyNotation Currency notation + */ +export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().describe("Customer total"), vendorTotal: z.number().describe("Vendor total"), combinedTotal: z.number().describe("Combined total"), currencyNotation: z.string().describe("Currency notation") }).readonly(); +export type FinanceTotalsDto = z.infer; + +/** + * FinanceTotalsByCurrencyDtoSchema + * @type { object } + * @property { string } currencyNotation Currency notation + * @property { number } vendorTotal Total for vendor side in this currency + * @property { number } customerTotal Total for customer side in this currency + */ +export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string().describe("Currency notation"), vendorTotal: z.number().describe("Total for vendor side in this currency").nullish(), customerTotal: z.number().describe("Total for customer side in this currency").nullish() }).readonly(); +export type FinanceTotalsByCurrencyDto = z.infer; + +/** + * FinanceTablePositionDtoSchema + * @type { object } + * @property { FinanceRowDto[] } rows Finance rows + * @property { FinanceTotalsDto } totals Finance totals + * @property { string[] } selectedFinanceRowIds Selected finance row IDs + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency + */ +export const FinanceTablePositionDtoSchema = z.object({ rows: z.array(CommonModels.FinanceRowDtoSchema).readonly().describe("Finance rows"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); +export type FinanceTablePositionDto = z.infer; + +/** + * FinanceTableBlockDtoSchema + * @type { object } + * @property { string } selectedBpId Selected business partner ID + * @property { boolean } showVendor Show vendor + * @property { boolean } showBuyRate Show buy rate + * @property { boolean } showCustomer Show customer + * @property { boolean } showSellRate Show sell rate + * @property { boolean } showGrid Show grid + * @property { boolean } showCharges Show charges + * @property { boolean } showAdditionalText Show additional text + * @property { boolean } showQuantity Show quantity + * @property { boolean } showTotalsByCurrency Show totals grouped by currency + * @property { boolean } suppressFinances Suppress finances from output + * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero + * @property { boolean } showTotal Show total from output + * @property { boolean } showProfit Show profit from output + * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output + * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output + * @property { boolean } includeSubPositions Include sub-positions + * @property { boolean } subPositionTotals Show sub-position totals + * @property { FinanceTablePositionDto[] } positions Finance positions + * @property { FinanceTotalsDto } totals Finance totals + * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency + */ +export const FinanceTableBlockDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionDtoSchema).readonly().describe("Finance positions"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); +export type FinanceTableBlockDto = z.infer; + +/** + * RemarkBlockDtoSchema + * @type { object } + * @property { string } id + * @property { number } position Minimum: `1` + * @property { EditorContentUpdateDto } content + * @property { boolean } enabled + */ +export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }).readonly(); +export type RemarkBlockDto = z.infer; + +/** + * ConfigBlockDtoSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + * @property { boolean } showWatermarkOnDocuments Show watermark on documents + * @property { LocaleEnum } locale + */ +export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), showWatermarkOnDocuments: z.boolean().describe("Show watermark on documents"), locale: CommonModels.LocaleEnumSchema }).readonly(); +export type ConfigBlockDto = z.infer; + +/** + * TitleBlockUpdateDtoSchema + * @type { object } + * @property { string } value Title value + */ +export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().describe("Title value") }).readonly(); +export type TitleBlockUpdateDto = z.infer; + +/** + * ReceiverBlockUpdateDtoSchema + * @type { object } + * @property { string } selectedBpId Receiver business partner ID + * @property { string } address Receiver address + */ +export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Receiver business partner ID"), address: z.string().describe("Receiver address") }).readonly(); +export type ReceiverBlockUpdateDto = z.infer; + +/** + * OurInformationBlockUpdateDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } phone Phone number + * @property { string } date Date + * @property { string } bookingNumber Booking number + * @property { string } customerReference Customer reference + * @property { string } masterBillOfLadingNumber Master bill of lading number + * @property { string } houseBillOfLadingNumber House bill of lading number + * @property { string } positionNumber Position number + */ +export const OurInformationBlockUpdateDtoSchema = z.object({ name: z.string().describe("Name"), phone: z.string().describe("Phone number"), date: z.string().describe("Date"), bookingNumber: z.string().describe("Booking number"), customerReference: z.string().describe("Customer reference"), masterBillOfLadingNumber: z.string().describe("Master bill of lading number"), houseBillOfLadingNumber: z.string().describe("House bill of lading number"), positionNumber: z.string().describe("Position number") }).readonly(); +export type OurInformationBlockUpdateDto = z.infer; + +/** + * TermsBlockDtoSchema + * @type { object } + * @property { string } termsImageUrl Terms image URL + */ +export const TermsBlockDtoSchema = z.object({ termsImageUrl: z.string().describe("Terms image URL") }).readonly(); +export type TermsBlockDto = z.infer; + +/** + * CutOffDatesBlockUpdateDtoSchema + * @type { object } + * @property { string } billOfLadingFromCustomer Bill of lading from customer date + * @property { string } billOfLadingToCarrier Bill of lading to carrier date + * @property { string } customsAMS Customs AMS date + * @property { string } vgmCustomer VGM customer date + */ +export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().describe("Bill of lading from customer date"), billOfLadingToCarrier: z.string().describe("Bill of lading to carrier date"), customsAMS: z.string().describe("Customs AMS date"), vgmCustomer: z.string().describe("VGM customer date") }).readonly(); +export type CutOffDatesBlockUpdateDto = z.infer; + +/** + * TemplatedDocumentDataDtoSchema + * @type { object } + * @property { TitleBlockUpdateDto } title Title block data + * @property { ReceiverBlockUpdateDto } receiver Receiver block data + * @property { OurInformationBlockUpdateDto } ourInformation Our information block data + * @property { RouteTableBlockResponseDto } routeTable Route table block data + * @property { CargoTableBlockDto } cargoTable Cargo table block data + * @property { SummaryCargoBlockResponseDto } summaryCargo Summary cargo block data + * @property { FinanceTableBlockDto } financeTable Finance table block data + * @property { RemarkBlockDto[] } remarks Remark blocks + * @property { TermsBlockDto } terms Terms block data + * @property { ConfigBlockDto } config Config block data + * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data + */ +export const TemplatedDocumentDataDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableBlockResponseDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockResponseDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockDtoSchema).readonly().describe("Remark blocks"), terms: CommonModels.TermsBlockDtoSchema.describe("Terms block data"), config: CommonModels.ConfigBlockDtoSchema.describe("Config block data"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); +export type TemplatedDocumentDataDto = z.infer; + +/** + * RouteTableUpdateBlockDtoSchema + * @type { object } + * @property { string } selectedRouteId Selected route ID + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { boolean } showReference Show reference column + * @property { boolean } showVesselVoyage Show vessel/voyage column + * @property { boolean } showProvider Show provider column + * @property { RouteTablePointDto[] } points Route points + * @property { boolean } showAddress Show address + * @property { boolean } showDates Show dates + * @property { boolean } showType Show type + * @property { boolean } showLocation Show location + * @property { boolean } showGrid Show grid + * @property { boolean } suppressRoute Suppress route + */ +export const RouteTableUpdateBlockDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID"), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points"), showAddress: z.boolean().describe("Show address"), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); +export type RouteTableUpdateBlockDto = z.infer; + +/** + * CargoItemRouteUpdateDtoSchema + * @type { object } + * @property { string[] } selectedRoutePointIds Selected route point IDs + */ +export const CargoItemRouteUpdateDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs") }).readonly(); +export type CargoItemRouteUpdateDto = z.infer; + +/** + * CargoItemUpdateDtoSchema + * @type { object } + * @property { string } cargoId Cargo ID to update packages for + * @property { string[] } selectedPackageIds Selected cargo package IDs + * @property { CargoItemRouteUpdateDto } route Cargo route (when routes are split) + */ +export const CargoItemUpdateDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID to update packages for"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteUpdateDtoSchema.describe("Cargo route (when routes are split)") }).readonly(); +export type CargoItemUpdateDto = z.infer; + +/** + * CargoTableBlockUpdateDtoSchema + * @type { object } + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { CargoItemUpdateDto[] } items Cargo items for package updates + * @property { boolean } suppressWeight Suppress weight column display + * @property { boolean } showGrid Show grid borders in cargo table + * @property { boolean } suppressVolume Suppress volume column display + * @property { boolean } suppressSpecialities Suppress specialities column display + * @property { boolean } suppressDimensions Suppress dimensions column display + * @property { boolean } suppressPackageVolume Suppress package volume column display + * @property { boolean } suppressPackageWeight Suppress package weight column display + * @property { boolean } showRoute Show route information (only applicable when routes are split) + * @property { boolean } showGrandTotal Show grand total + * @property { boolean } showTransportUnitTotal Show transport unit total + * @property { boolean } suppressCargo Suppress cargo table display + * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units + * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units + * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages + * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages + * @property { boolean } showPackageHSCodes Show HS codes for packages + * @property { boolean } showPackageType Show package type for packages + * @property { boolean } showPackageQuantity Show quantity for packages + * @property { boolean } showPackageDescription Show description for packages + * @property { boolean } showPackageCaseMarks Show case marks for packages + * @property { boolean } showTransportUnitNumber Show transport unit number + * @property { boolean } showTransportUnitType Show transport unit type + * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 + * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 + */ +export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), items: z.array(CommonModels.CargoItemUpdateDtoSchema).readonly().describe("Cargo items for package updates"), suppressWeight: z.boolean().describe("Suppress weight column display"), showGrid: z.boolean().describe("Show grid borders in cargo table"), suppressVolume: z.boolean().describe("Suppress volume column display"), suppressSpecialities: z.boolean().describe("Suppress specialities column display"), suppressDimensions: z.boolean().describe("Suppress dimensions column display"), suppressPackageVolume: z.boolean().describe("Suppress package volume column display"), suppressPackageWeight: z.boolean().describe("Suppress package weight column display"), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullable(), showGrandTotal: z.boolean().describe("Show grand total"), showTransportUnitTotal: z.boolean().describe("Show transport unit total"), suppressCargo: z.boolean().describe("Suppress cargo table display"), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units"), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units"), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages"), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages"), showPackageHSCodes: z.boolean().describe("Show HS codes for packages"), showPackageType: z.boolean().describe("Show package type for packages"), showPackageQuantity: z.boolean().describe("Show quantity for packages"), showPackageDescription: z.boolean().describe("Show description for packages"), showPackageCaseMarks: z.boolean().describe("Show case marks for packages"), showTransportUnitNumber: z.boolean().describe("Show transport unit number"), showTransportUnitType: z.boolean().describe("Show transport unit type"), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1"), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2") }).readonly(); +export type CargoTableBlockUpdateDto = z.infer; + +/** + * SummaryCargoItemUpdateDtoSchema + * @type { object } + * @property { string } transportUnitType Cargo type name (transport unit type) + * @property { string } description Updated description for this cargo type + */ +export const SummaryCargoItemUpdateDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), description: z.string().describe("Updated description for this cargo type") }).readonly(); +export type SummaryCargoItemUpdateDto = z.infer; + +/** + * SummaryCargoBlockUpdateDtoSchema + * @type { object } + * @property { SummaryCargoItemUpdateDto[] } items + */ +export const SummaryCargoBlockUpdateDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemUpdateDtoSchema).readonly() }).readonly(); +export type SummaryCargoBlockUpdateDto = z.infer; + +/** + * FinanceTablePositionUpdateDtoSchema + * @type { object } + * @property { string[] } selectedFinanceRowIds Selected finance row IDs + * @property { string } positionId Position ID + */ +export const FinanceTablePositionUpdateDtoSchema = z.object({ selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID") }).readonly(); +export type FinanceTablePositionUpdateDto = z.infer; + +/** + * FinanceTableBlockUpdateDtoSchema + * @type { object } + * @property { string } selectedBpId Selected business partner ID + * @property { boolean } showVendor Show vendor + * @property { boolean } showBuyRate Show buy rate + * @property { boolean } showCustomer Show customer + * @property { boolean } showSellRate Show sell rate + * @property { boolean } showGrid Show grid + * @property { boolean } showCharges Show charges + * @property { boolean } showAdditionalText Show additional text + * @property { boolean } showQuantity Show quantity + * @property { boolean } showTotalsByCurrency Show totals grouped by currency + * @property { boolean } suppressFinances Suppress finances from output + * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero + * @property { boolean } showTotal Show total from output + * @property { boolean } showProfit Show profit from output + * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output + * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output + * @property { boolean } includeSubPositions Include sub-positions + * @property { boolean } subPositionTotals Show sub-position totals + * @property { FinanceTablePositionUpdateDto[] } positions Finance positions + */ +export const FinanceTableBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionUpdateDtoSchema).readonly().describe("Finance positions") }).readonly(); +export type FinanceTableBlockUpdateDto = z.infer; + +/** + * RemarkBlockUpdateDtoSchema + * @type { object } + * @property { string } id + * @property { number } position Minimum: `1` + * @property { EditorContentUpdateDto } content + * @property { boolean } enabled + */ +export const RemarkBlockUpdateDtoSchema = z.object({ id: z.string(), position: z.number().gte(1).nullish(), content: CommonModels.EditorContentUpdateDtoSchema.nullish(), enabled: z.boolean().nullish() }).readonly(); +export type RemarkBlockUpdateDto = z.infer; + +/** + * TemplatedDocumentDataUpdateDtoSchema + * @type { object } + * @property { TitleBlockUpdateDto } title Title block data + * @property { ReceiverBlockUpdateDto } receiver Receiver block data + * @property { OurInformationBlockUpdateDto } ourInformation Our information block data + * @property { RouteTableUpdateBlockDto } routeTable Route table block data + * @property { CargoTableBlockUpdateDto } cargoTable Cargo table block data + * @property { SummaryCargoBlockUpdateDto } summaryCargo Summary cargo block data + * @property { FinanceTableBlockUpdateDto } financeTable Finance table block data + * @property { RemarkBlockUpdateDto[] } remarks Remark blocks + * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data + */ +export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).readonly().describe("Remark blocks"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); +export type TemplatedDocumentDataUpdateDto = z.infer; + +/** + * BusinessPartnerTypeSchema + * @type { enum } + */ +export const BusinessPartnerTypeSchema = z.enum(["businessPartner", "destinationAgent", "oceanCarrier", "office", "customsAgent", "stuffingStrippingProvider", "shipper", "fobForwarder", "routingAgent", "transportProvider", "originServiceProvider", "insuranceProvider", "consignee", "courier", "trucker", "airline", "originAgent"]); +export type BusinessPartnerType = z.infer; +export const BusinessPartnerType = BusinessPartnerTypeSchema.enum; + +/** + * BusinessPartnerAddressCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type BusinessPartnerAddressCityDto = z.infer; + +/** + * BusinessPartnerAddressCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const BusinessPartnerAddressCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type BusinessPartnerAddressCountryDto = z.infer; + +/** + * BusinessPartnerAddressResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the address + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street information + * @property { string } zip ZIP/Postal code + * @property { BusinessPartnerAddressCityDto } city Country data + * @property { string } district District information + * @property { BusinessPartnerAddressCountryDto } country Country data + */ +export const BusinessPartnerAddressResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the address"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street information"), zip: z.string().describe("ZIP/Postal code"), city: CommonModels.BusinessPartnerAddressCityDtoSchema.describe("Country data"), district: z.string().describe("District information"), country: CommonModels.BusinessPartnerAddressCountryDtoSchema.describe("Country data") }).readonly(); +export type BusinessPartnerAddressResponseDTO = z.infer; + +/** + * EditorContentResponseDtoSchema + * @type { object } + * @property { string } html HTML content + * @property { object } json JSON content + * @property { any } json.[key] + */ +export const EditorContentResponseDtoSchema = z.object({ html: z.string().describe("HTML content"), json: z.object({}).catchall(z.any()).readonly().describe("JSON content") }).readonly(); +export type EditorContentResponseDto = z.infer; + +/** + * DunningSystemReferenceDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } isDefault + */ +export const DunningSystemReferenceDTOSchema = z.object({ id: z.string(), name: z.string(), isDefault: z.boolean() }).readonly(); +export type DunningSystemReferenceDTO = z.infer; + +/** + * TransportModeEnumSchema + * @type { enum } + */ +export const TransportModeEnumSchema = z.enum(["Air", "Sea", "Road"]); +export type TransportModeEnum = z.infer; +export const TransportModeEnum = TransportModeEnumSchema.enum; + +/** + * SeaRoutingEnumSchema + * @type { enum } + */ +export const SeaRoutingEnumSchema = z.enum(["Direct", "Transhipment"]); +export type SeaRoutingEnum = z.infer; +export const SeaRoutingEnum = SeaRoutingEnumSchema.enum; + +/** + * InvolvedPartyBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { BusinessPartnerAddressResponseDTO } address Main address information + */ +export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information").nullish() }).readonly(); +export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; + +/** + * InvolvedPartyContactResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvolvedPartyContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvolvedPartyContactResponseDTO = z.infer; + +/** + * InvolvedPartyResponseDtoSchema + * @type { object } + * @property { string } id + * @property { PositionInvolvedPartyTypeEnum } type + * @property { string } reference + * @property { InvolvedPartyBusinessPartnerResponseDTO } businessPartner + * @property { InvolvedPartyContactResponseDTO } contact + */ +export const InvolvedPartyResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionInvolvedPartyTypeEnumSchema, reference: z.string().nullish(), businessPartner: CommonModels.InvolvedPartyBusinessPartnerResponseDTOSchema.nullish(), contact: CommonModels.InvolvedPartyContactResponseDTOSchema.nullish() }).readonly(); +export type InvolvedPartyResponseDto = z.infer; + +/** + * CreateInvolvedPartyRequestDtoSchema + * @type { object } + * @property { PositionInvolvedPartyTypeEnum } type Type of the involved party to create + */ +export const CreateInvolvedPartyRequestDtoSchema = z.object({ type: CommonModels.PositionInvolvedPartyTypeEnumSchema.describe("Type of the involved party to create") }).readonly(); +export type CreateInvolvedPartyRequestDto = z.infer; + +/** + * RouteLocationTypeEnumSchema + * @type { enum } + */ +export const RouteLocationTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Port", "Terminal", "City", "Warehouse", "ContainerYard", "Airport"]); +export type RouteLocationTypeEnum = z.infer; +export const RouteLocationTypeEnum = RouteLocationTypeEnumSchema.enum; + +/** + * RoutePointLocationResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { RouteLocationTypeEnum } type + */ +export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }).readonly(); +export type RoutePointLocationResponseDto = z.infer; + +/** + * RoutePointTypeEnumSchema + * @type { enum } + */ +export const RoutePointTypeEnumSchema = z.enum(["EmptyContainerDepot", "LoadingAddress", "Stop", "FumigationStop", "OriginCustomsStop", "StuffingLocation", "PortTerminal", "PortOfLoading", "TransshipmentPort", "PortOfDischarge", "StrippingLocation", "ContainerYard", "DestinationCustomsStop", "FinalDestination", "EmptyContainerReturn", "OriginAgent", "HandlingAgent", "XRay", "CustomsBroker", "AirportOfDeparture", "StopAirport", "DestinationAirport", "CustomsStop", "DestinationAgent", "DeliveryAddress", "Courier", "PickupAddress", "StopAddress"]); +export type RoutePointTypeEnum = z.infer; +export const RoutePointTypeEnum = RoutePointTypeEnumSchema.enum; + +/** + * IncotermsEnumSchema + * @type { enum } + */ +export const IncotermsEnumSchema = z.enum(["EXW", "FCA", "CPT", "CIP", "DAP", "DPU", "DDP", "FAS", "FOB", "CFR", "CIF"]); +export type IncotermsEnum = z.infer; +export const IncotermsEnum = IncotermsEnumSchema.enum; + +/** + * PositionRouteTransportModeEnumSchema + * @type { enum } + */ +export const PositionRouteTransportModeEnumSchema = z.enum(["Truck", "Rail/Truck", "Rail", "Barge"]); +export type PositionRouteTransportModeEnum = z.infer; +export const PositionRouteTransportModeEnum = PositionRouteTransportModeEnumSchema.enum; + +/** + * RoutePointProviderResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type RoutePointProviderResponseDto = z.infer; + +/** + * RoutePointResponseDtoSchema + * @type { object } + * @property { string } id + * @property { RoutePointTypeEnum } type + * @property { string } name + * @property { number } sequenceNumber + * @property { RoutePointLocationResponseDto } location + * @property { string } estimatedTime + * @property { string } secondaryEstimatedTime Secondary estimated time (sea positions only) + * @property { string } reference + * @property { string } secondaryReference + * @property { IncotermsEnum } incoterm + * @property { PositionRouteTransportModeEnum } transportMode + * @property { RoutePointProviderResponseDto } provider + * @property { string } vessel Vessel name (sea positions only) + * @property { string } voyage Voyage number (sea positions only) + * @property { string } carrier Carrier name (sea positions only) + */ +export const RoutePointResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.RoutePointTypeEnumSchema, name: z.string(), sequenceNumber: z.number(), location: CommonModels.RoutePointLocationResponseDtoSchema.nullish(), estimatedTime: z.iso.datetime({ offset: true }).nullish(), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time (sea positions only)").nullish(), reference: z.string().nullish(), secondaryReference: z.string().nullish(), incoterm: CommonModels.IncotermsEnumSchema.nullish(), transportMode: CommonModels.PositionRouteTransportModeEnumSchema.nullish(), provider: CommonModels.RoutePointProviderResponseDtoSchema.nullish(), vessel: z.string().describe("Vessel name (sea positions only)").nullish(), voyage: z.string().describe("Voyage number (sea positions only)").nullish(), carrier: z.string().describe("Carrier name (sea positions only)").nullish() }).readonly(); +export type RoutePointResponseDto = z.infer; + +/** + * RouteResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } cargoId Cargo ID (sea positions only) + * @property { string } cargoNumber Cargo number (sea positions only) + * @property { RoutePointResponseDto[] } points + */ +export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().describe("Cargo ID (sea positions only)").nullish(), cargoNumber: z.string().describe("Cargo number (sea positions only)").nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema).readonly() }).readonly(); +export type RouteResponseDto = z.infer; + +/** + * RouteListResponseDtoSchema + * @type { object } + * @property { RouteResponseDto[] } routes + * @property { boolean } splitRoute Whether the position routes are split by cargo (sea positions only) + */ +export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema).readonly(), splitRoute: z.boolean().describe("Whether the position routes are split by cargo (sea positions only)") }).readonly(); +export type RouteListResponseDto = z.infer; + +/** + * CreateRoutePointRequestDtoSchema + * @type { object } + * @property { RoutePointTypeEnum } type + */ +export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }).readonly(); +export type CreateRoutePointRequestDto = z.infer; + +/** + * UpdateRoutePointRequestDtoSchema + * @type { object } + * @property { string } locationId Location ID for the route point + * @property { RouteLocationTypeEnum } locationType Type of location + * @property { string } estimatedTime Updated estimated time for the route point + * @property { string } secondaryEstimatedTime Secondary estimated time for the route point (sea positions only) + * @property { string } reference Reference for the route point + * @property { string } secondaryReference Secondary reference for the route point + * @property { IncotermsEnum } incoterm + * @property { PositionRouteTransportModeEnum } transportMode + * @property { string } providerId + * @property { string } vessel Vessel name (sea positions only) + * @property { string } voyage Voyage number (sea positions only) + * @property { string } carrier Carrier name (sea positions only) + */ +export const UpdateRoutePointRequestDtoSchema = z.object({ locationId: z.string().describe("Location ID for the route point").nullable(), locationType: CommonModels.RouteLocationTypeEnumSchema.describe("Type of location").nullable(), estimatedTime: z.iso.datetime({ offset: true }).describe("Updated estimated time for the route point"), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time for the route point (sea positions only)"), reference: z.string().describe("Reference for the route point"), secondaryReference: z.string().describe("Secondary reference for the route point"), incoterm: CommonModels.IncotermsEnumSchema, transportMode: CommonModels.PositionRouteTransportModeEnumSchema, providerId: z.string(), vessel: z.string().describe("Vessel name (sea positions only)"), voyage: z.string().describe("Voyage number (sea positions only)"), carrier: z.string().describe("Carrier name (sea positions only)") }).readonly(); +export type UpdateRoutePointRequestDto = z.infer; + +/** + * PositionChargeDtoResponseSchema + * @type { object } + * @property { object } chargeType + * @property { string } chargeType.id + * @property { string } chargeType.name + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { object } buyVatRule + * @property { string } buyVatRule.id + * @property { string } buyVatRule.name + * @property { string } buyVatRule.matchcode + * @property { object } vendor + * @property { string } vendor.id + * @property { string } vendor.name + * @property { string } vendor.matchCode + * @property { string } vendor.label + * @property { string } vendor.debtorId + * @property { string } vendor.creditorId + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { object } sellVatRule + * @property { string } sellVatRule.id + * @property { string } sellVatRule.name + * @property { string } sellVatRule.matchcode + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { string } customer.debtorId + * @property { string } customer.creditorId + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + * @property { number } profit Profit amount + * @property { string } profitCurrencyCode Profit currency code + */ +export const PositionChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge").nullish(), buyRate: z.number().describe("Buy rate amount").nullish(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), sellRate: z.number().describe("Sell rate amount").nullish(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), profit: z.number().describe("Profit amount").nullish(), profitCurrencyCode: z.string().describe("Profit currency code").nullish() }).readonly(); +export type PositionChargeDtoResponse = z.infer; + +/** + * PositionTextDtoResponseSchema + * @type { object } + * @property { string } content Text content + */ +export const PositionTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type PositionTextDtoResponse = z.infer; + +/** + * PositionAccountItemDtoResponseSchema + * @type { object } + * @property { string } id Item ID + * @property { string } outgoingInvoiceId + * @property { string } registeredInvoiceId + * @property { PositionAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { PositionChargeDtoResponse } charge Charge data if type is CHARGE + * @property { PositionTextDtoResponse } text Text data if type is TEXT + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + */ +export const PositionAccountItemDtoResponseSchema = z.object({ id: z.string().describe("Item ID"), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish(), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item"), charge: CommonModels.PositionChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), text: CommonModels.PositionTextDtoResponseSchema.describe("Text data if type is TEXT").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); +export type PositionAccountItemDtoResponse = z.infer; + +/** + * UserPreviewDtoSchema + * @type { object } + * @property { string } userId + * @property { string } name + */ +export const UserPreviewDtoSchema = z.object({ userId: z.string(), name: z.string() }).readonly(); +export type UserPreviewDto = z.infer; + +/** + * HBLDocumentConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + * @property { string } blTermsAndConditionsImageUrl BL terms and conditions image URL + * @property { string } signatureImageUrl Signature image URL + * @property { boolean } hasSignatureImage Whether office has a signature image configured + */ +export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), blTermsAndConditionsImageUrl: z.string().describe("BL terms and conditions image URL"), signatureImageUrl: z.string().describe("Signature image URL"), hasSignatureImage: z.boolean().describe("Whether office has a signature image configured") }).readonly(); +export type HBLDocumentConfigDto = z.infer; + +/** + * DirectionEnumSchema + * @type { enum } + */ +export const DirectionEnumSchema = z.enum(["Import", "Export"]); +export type DirectionEnum = z.infer; +export const DirectionEnum = DirectionEnumSchema.enum; + +/** + * HazardousPackingGroupEnumSchema + * @type { enum } + */ +export const HazardousPackingGroupEnumSchema = z.enum(["PG I", "PG II", "PG III"]); +export type HazardousPackingGroupEnum = z.infer; +export const HazardousPackingGroupEnum = HazardousPackingGroupEnumSchema.enum; + +/** + * PositionCargoPackageHazardousSpecialtyResponseDTOSchema + * @type { object } + * @property { number } totalLength + * @property { number } totalWidth + * @property { number } temperature + * @property { string } unNumber + * @property { string } IMOClass + * @property { string } shippingName + * @property { string } technicalName + * @property { HazardousPackingGroupEnum } packagingGroup + * @property { number } netWeight + * @property { number } flashpoint + * @property { string[] } properties + * @property { string } acceptanceNumber + * @property { string } medGuide + * @property { string } emergencyPhone + * @property { string } emergencySchedule + */ +export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number(), totalWidth: z.number(), temperature: z.number(), unNumber: z.string(), IMOClass: z.string(), shippingName: z.string(), technicalName: z.string(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema, netWeight: z.number(), flashpoint: z.number(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly(), acceptanceNumber: z.string(), medGuide: z.string(), emergencyPhone: z.string(), emergencySchedule: z.string() }).readonly(); +export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; + +/** + * PositionCargoPackageTypeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionCargoPackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionCargoPackageTypeResponseDTO = z.infer; + +/** + * HsCodeLabelDtoSchema + * @type { object } + * @property { string } id + * @property { string } label + */ +export const HsCodeLabelDtoSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export type HsCodeLabelDto = z.infer; + +/** + * PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema + * @type { object } + * @property { number } temperatureFrom + * @property { number } temperatureUntil + */ +export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.infer; + +/** + * PositionCargoSourcePackageResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } positionNumber + */ +export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }).readonly(); +export type PositionCargoSourcePackageResponseDTO = z.infer; + +/** + * PositionCargoPackageResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } cargoId + * @property { string } rootFolderId + * @property { number } quantity + * @property { string } packageTypeId + * @property { PositionCargoPackageTypeResponseDTO } packageType + * @property { number } length + * @property { number } width + * @property { number } height + * @property { number } netWeight + * @property { number } grossWeight + * @property { number } chargeableWeight + * @property { string } note + * @property { string } name + * @property { number } orderNumber + * @property { number } volume + * @property { number } volumetricWeight + * @property { string } caseMarks + * @property { string } description + * @property { string[] } hsCodes + * @property { HsCodeLabelDto[] } hsCodeLabels HS code details + * @property { string } customsRemarks + * @property { number } loadMeter + * @property { string[] } specialties + * @property { PositionCargoPackageHazardousSpecialtyResponseDTO } hazardousSpecialty + * @property { PositionCargoPackageTemperatureControlledSpecialtyResponseDto } temperatureControlledSpecialty + * @property { PositionCargoSourcePackageResponseDTO } sourcePackage + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const PositionCargoPackageResponseDTOSchema = z.object({ id: z.string(), cargoId: z.string(), rootFolderId: z.string().nullish(), quantity: z.number().nullish(), packageTypeId: z.string().nullish(), packageType: CommonModels.PositionCargoPackageTypeResponseDTOSchema.nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), netWeight: z.number().nullish(), grossWeight: z.number().nullish(), chargeableWeight: z.number().nullish(), note: z.string().nullish(), name: z.string().nullish(), orderNumber: z.number().nullish(), volume: z.number().nullish(), volumetricWeight: z.number().nullish(), caseMarks: z.string().nullish(), description: z.string().nullish(), hsCodes: z.array(z.string()).readonly().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), customsRemarks: z.string().nullish(), loadMeter: z.number().nullish(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.PositionCargoPackageHazardousSpecialtyResponseDTOSchema.nullish(), temperatureControlledSpecialty: CommonModels.PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema.nullish(), sourcePackage: CommonModels.PositionCargoSourcePackageResponseDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), mrn: z.string().describe("MRN (Movement Reference Number)").nullish(), exportPortFilling: z.string().describe("Export port filling").nullish(), customsReleased: z.boolean().describe("Customs released status").nullish(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullish(), portCustomsNumber: z.string().describe("Port customs number").nullish() }).readonly(); +export type PositionCargoPackageResponseDTO = z.infer; + +/** + * PackageTotalsDtoSchema + * @type { object } + * @property { number } quantity + * @property { number } weightPerPiece + * @property { number } volume + * @property { number } chargeableWeight + * @property { number } loadMeter + */ +export const PackageTotalsDtoSchema = z.object({ quantity: z.number(), weightPerPiece: z.number(), volume: z.number(), chargeableWeight: z.number().nullish(), loadMeter: z.number().nullish() }).readonly(); +export type PackageTotalsDto = z.infer; + +/** + * PackageSpecialtyTotalsResponseDtoSchema + * @type { object } + * @property { PackageTotalsDto } noSpecialties + * @property { PackageTotalsDto } hazardous + * @property { PackageTotalsDto } nonStackable + * @property { PackageTotalsDto } temperatureControlled + * @property { PackageTotalsDto } diplomatic + * @property { PackageTotalsDto } oversized + * @property { PackageTotalsDto } total + */ +export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }).readonly(); +export type PackageSpecialtyTotalsResponseDto = z.infer; + +/** + * PositionCargoCargoTypeResponseDTOSchema + * @type { object } + * @property { string } id Cargo type ID. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } name Cargo type name. Example: `Electronics` + * @property { string } shortName Cargo type short name. Example: `ELEC` + */ +export const PositionCargoCargoTypeResponseDTOSchema = z.object({ id: z.string().describe("Cargo type ID"), name: z.string().describe("Cargo type name"), shortName: z.string().describe("Cargo type short name").nullish() }).readonly(); +export type PositionCargoCargoTypeResponseDTO = z.infer; + +/** + * PositionCargoResponseDTOSchema + * @type { object } + * @property { string } id Cargo ID. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } positionId Position ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } quoteId Quote ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } rootFolderId Folder id bound to this cargo. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { PositionCargoCargoTypeResponseDTO } cargoType Cargo type + * @property { boolean } autoCalculateTotals + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { string } rateOptions + * @property { string } rateClass + * @property { string } textForCustoms + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { number } ratePerKg + * @property { number } totalRate + * @property { number } tare + * @property { number } vgm + * @property { HsCodeLabelDto[] } hsCodeLabels HS code details + * @property { string } note + * @property { PositionCargoPackageResponseDTO[] } packages Packages for the cargo + * @property { string } createdAt Creation date. Example: `2023-04-09T12:00:00Z` + * @property { string } updatedAt Last update date. Example: `2023-04-09T12:00:00Z` + * @property { number } completeWeight + * @property { PackageSpecialtyTotalsResponseDto } packageTotals + */ +export const PositionCargoResponseDTOSchema = z.object({ id: z.string().describe("Cargo ID"), positionId: z.string().describe("Position ID this cargo belongs to").nullish(), quoteId: z.string().describe("Quote ID this cargo belongs to").nullish(), rootFolderId: z.string().describe("Folder id bound to this cargo").nullish(), cargoType: CommonModels.PositionCargoCargoTypeResponseDTOSchema.describe("Cargo type").nullish(), autoCalculateTotals: z.boolean(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean(), transportUnitNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), rateOptions: z.string().nullish(), rateClass: z.string().nullish(), textForCustoms: z.string().nullish(), totalVolume: z.number().nullish(), totalGrossWeight: z.number().nullish(), totalNetWeight: z.number().nullish(), totalVolumetricWeight: z.number().nullish(), totalChargeableWeight: z.number().nullish(), totalLoadMeter: z.number().nullish(), ratePerKg: z.number().nullish(), totalRate: z.number().nullish(), tare: z.number().nullish(), vgm: z.number().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), note: z.string().nullish(), packages: z.array(CommonModels.PositionCargoPackageResponseDTOSchema).readonly().describe("Packages for the cargo").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Creation date"), updatedAt: z.iso.datetime({ offset: true }).describe("Last update date"), completeWeight: z.number().nullish(), packageTotals: CommonModels.PackageSpecialtyTotalsResponseDtoSchema.nullish() }).readonly(); +export type PositionCargoResponseDTO = z.infer; + +/** + * HazardousSpecialtyDTOSchema + * @type { object } + * @property { number } totalLength Total length + * @property { number } totalWidth Total width + * @property { number } temperature Temperature + * @property { string } unNumber UN number + * @property { string } IMOClass IMOClass + * @property { string } shippingName Shipping name + * @property { string } technicalName Technical name + * @property { HazardousPackingGroupEnum } packagingGroup Packaging + * @property { number } netWeight Net weight + * @property { number } flashpoint Flashpoint + * @property { string[] } properties Properties + * @property { string } acceptanceNumber Acceptance number + * @property { string } medGuide Medical guide + * @property { string } emergencyPhone Emergency phone + * @property { string } emergencySchedule Emergency schedule + */ +export const HazardousSpecialtyDTOSchema = z.object({ totalLength: z.number().describe("Total length"), totalWidth: z.number().describe("Total width"), temperature: z.number().describe("Temperature"), unNumber: z.string().describe("UN number"), IMOClass: z.string().describe("IMOClass"), shippingName: z.string().describe("Shipping name"), technicalName: z.string().describe("Technical name"), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.describe("Packaging"), netWeight: z.number().describe("Net weight"), flashpoint: z.number().describe("Flashpoint"), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly().describe("Properties"), acceptanceNumber: z.string().describe("Acceptance number"), medGuide: z.string().describe("Medical guide"), emergencyPhone: z.string().describe("Emergency phone"), emergencySchedule: z.string().describe("Emergency schedule") }).readonly(); +export type HazardousSpecialtyDTO = z.infer; + +/** + * TemperatureControlledSpecialtyDtoSchema + * @type { object } + * @property { number } temperatureFrom + * @property { number } temperatureUntil + */ +export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export type TemperatureControlledSpecialtyDto = z.infer; + +/** + * CreatePositionCargoPackageDTOSchema + * @type { object } + * @property { number } quantity Package quantity + * @property { string } packageTypeId Package type ID + * @property { number } length Package length + * @property { number } width Package width + * @property { number } height Package height + * @property { number } netWeight Package net weight + * @property { number } grossWeight Package gross weight + * @property { number } loadMeter Package load meter + * @property { number } chargeableWeight Package chargeable weight + * @property { number } volume Package volume + * @property { number } volumetricWeight Package volumetric weight + * @property { string } caseMarks Package case marks + * @property { string } note Package note + * @property { string } description Package description + * @property { string[] } hsCodes Package HS codes + * @property { string } customsRemarks Text for customs + * @property { string[] } specialties + * @property { HazardousSpecialtyDTO } hazardousSpecialty + * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const CreatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity"), packageTypeId: z.string().describe("Package type ID"), length: z.number().describe("Package length"), width: z.number().describe("Package width"), height: z.number().describe("Package height"), netWeight: z.number().describe("Package net weight"), grossWeight: z.number().describe("Package gross weight"), loadMeter: z.number().describe("Package load meter"), chargeableWeight: z.number().describe("Package chargeable weight"), volume: z.number().describe("Package volume"), volumetricWeight: z.number().describe("Package volumetric weight"), caseMarks: z.string().describe("Package case marks"), note: z.string().describe("Package note"), description: z.string().describe("Package description"), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs"), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema, temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)"), exportPortFilling: z.string().describe("Export port filling"), customsReleased: z.boolean().describe("Customs released status"), importCustomsReleaseNumber: z.string().describe("Import customs release number"), portCustomsNumber: z.string().describe("Port customs number") }).readonly(); +export type CreatePositionCargoPackageDTO = z.infer; + +/** + * UpdatePositionCargoPackageDTOSchema + * @type { object } + * @property { number } quantity Package quantity + * @property { string } packageTypeId Package type ID + * @property { number } length Package length + * @property { number } width Package width + * @property { number } height Package height + * @property { number } netWeight Package net weight + * @property { number } grossWeight Package gross weight + * @property { number } chargeableWeight Package chargeable weight + * @property { string } note Package case marks + * @property { number } volume Package volume + * @property { number } volumetricWeight Package volumetric weight + * @property { number } orderNumber Package order number + * @property { string } caseMarks Package case marks + * @property { string } description Package description + * @property { string[] } hsCodes Package HS codes + * @property { string } customsRemarks Text for customs + * @property { number } loadMeter Load meter + * @property { string[] } specialties Package specialties + * @property { HazardousSpecialtyDTO } hazardousSpecialty Hazardous specialty details + * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const UpdatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity").nullable(), packageTypeId: z.string().describe("Package type ID").nullable(), length: z.number().describe("Package length").nullable(), width: z.number().describe("Package width").nullable(), height: z.number().describe("Package height").nullable(), netWeight: z.number().describe("Package net weight").nullable(), grossWeight: z.number().describe("Package gross weight").nullable(), chargeableWeight: z.number().describe("Package chargeable weight").nullable(), note: z.string().describe("Package case marks").nullable(), volume: z.number().describe("Package volume").nullable(), volumetricWeight: z.number().describe("Package volumetric weight").nullable(), orderNumber: z.number().describe("Package order number"), caseMarks: z.string().describe("Package case marks").nullable(), description: z.string().describe("Package description").nullable(), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs").nullable(), loadMeter: z.number().describe("Load meter").nullable(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly().describe("Package specialties"), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema.describe("Hazardous specialty details"), temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)").nullable(), exportPortFilling: z.string().describe("Export port filling").nullable(), customsReleased: z.boolean().describe("Customs released status").nullable(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullable(), portCustomsNumber: z.string().describe("Port customs number").nullable() }).readonly(); +export type UpdatePositionCargoPackageDTO = z.infer; + +/** + * QuantityOfOriginalBlDocumentsEnumSchema + * @type { enum } + */ +export const QuantityOfOriginalBlDocumentsEnumSchema = z.enum(["ZERO", "ONE", "TWO", "THREE"]); +export type QuantityOfOriginalBlDocumentsEnum = z.infer; +export const QuantityOfOriginalBlDocumentsEnum = QuantityOfOriginalBlDocumentsEnumSchema.enum; + +/** + * MovementTypeEnumSchema + * @type { enum } + */ +export const MovementTypeEnumSchema = z.enum(["DoorToDoor", "PortToPort", "PortToDoor", "DoorToPort"]); +export type MovementTypeEnum = z.infer; +export const MovementTypeEnum = MovementTypeEnumSchema.enum; + +/** + * ChargePaymentEnumSchema + * @type { enum } + */ +export const ChargePaymentEnumSchema = z.enum(["Prepaid", "Collect", "PayableElsewhere"]); +export type ChargePaymentEnum = z.infer; +export const ChargePaymentEnum = ChargePaymentEnumSchema.enum; + +/** + * DocumentConfigDTOSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + */ +export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL") }).readonly(); +export type DocumentConfigDTO = z.infer; + +/** + * EmployeeRoleContextSchema + * @type { enum } + */ +export const EmployeeRoleContextSchema = z.enum(["global", "office"]); +export type EmployeeRoleContext = z.infer; +export const EmployeeRoleContext = EmployeeRoleContextSchema.enum; + +/** + * EmployeeRoleResponseSchema + * @type { object } + * @property { string } id Unique identifier of the role + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string } context Role context + * @property { string[] } permissions Permissions associated with the role + */ +export const EmployeeRoleResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export type EmployeeRoleResponse = z.infer; + +/** + * EmploymentEmployeeResponseSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { boolean } archived Archived + * @property { EmployeeRoleResponse[] } roles Global Roles + */ +export const EmploymentEmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish() }).readonly(); +export type EmploymentEmployeeResponse = z.infer; + +/** + * EmployeeOfficeResponseSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const EmployeeOfficeResponseSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type EmployeeOfficeResponse = z.infer; + +/** + * EmploymentResponseSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { EmployeeOfficeResponse } office + * @property { string } employeeId + * @property { EmploymentEmployeeResponse } employee + * @property { boolean } archived + * @property { string } costCenter + * @property { EmployeeRoleResponse[] } roles Employment Roles + */ +export const EmploymentResponseSchema = z.object({ id: z.string(), officeId: z.string(), office: CommonModels.EmployeeOfficeResponseSchema.nullish(), employeeId: z.string(), employee: CommonModels.EmploymentEmployeeResponseSchema.nullish(), archived: z.boolean(), costCenter: z.string().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Employment Roles").nullish() }).readonly(); +export type EmploymentResponse = z.infer; + +/** + * LoadTypeEnumSchema + * @type { enum } + */ +export const LoadTypeEnumSchema = z.enum(["LCL", "FCL", "Trailer", "Container", "BreakBulk", "Roro", "MAFI", "LTL_ROAD", "FTL_ROAD", "Standard"]); +export type LoadTypeEnum = z.infer; +export const LoadTypeEnum = LoadTypeEnumSchema.enum; + +/** + * ServiceTypeEnumSchema + * @type { enum } + */ +export const ServiceTypeEnumSchema = z.enum(["InlandTransport", "DoorToPortOfDischarge", "PortOfLoadingToDoor", "DoorToDoor", "PortToPort", "DoorToAirport", "AirportToAirport", "AirportToDoor", "PortOfDischargeRampToDoor"]); +export type ServiceTypeEnum = z.infer; +export const ServiceTypeEnum = ServiceTypeEnumSchema.enum; + +/** + * DateRangeDtoSchema + * @type { object } + * @property { string } start + * @property { string } end + */ +export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }), end: z.iso.datetime({ offset: true }) }).readonly(); +export type DateRangeDto = z.infer; + +/** + * BusinessPartnerLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { BusinessPartnerType[] } types Array of business partner types + */ +export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); +export type BusinessPartnerLabelResponseDTO = z.infer; + +/** + * SectionEnumSchema + * @type { enum } + */ +export const SectionEnumSchema = z.enum(["Logistics"]); +export type SectionEnum = z.infer; +export const SectionEnum = SectionEnumSchema.enum; + +/** + * FrequencyEnumSchema + * @type { enum } + */ +export const FrequencyEnumSchema = z.enum(["Daily", "Weekly", "Monthly"]); +export type FrequencyEnum = z.infer; +export const FrequencyEnum = FrequencyEnumSchema.enum; + +/** + * InvoiceDirectionEnumSchema + * @type { enum } + */ +export const InvoiceDirectionEnumSchema = z.enum(["Incoming", "Outgoing"]); +export type InvoiceDirectionEnum = z.infer; +export const InvoiceDirectionEnum = InvoiceDirectionEnumSchema.enum; + +/** + * InvoiceTypeEnumSchema + * @type { enum } + */ +export const InvoiceTypeEnumSchema = z.enum(["CreditNote", "Invoice", "CollectiveInvoice", "ProForma", "PartialCreditNote", "DirectInvoice"]); +export type InvoiceTypeEnum = z.infer; +export const InvoiceTypeEnum = InvoiceTypeEnumSchema.enum; + +/** + * BooleanFilterEnumSchema + * @type { enum } + */ +export const BooleanFilterEnumSchema = z.enum(["Yes", "No"]); +export type BooleanFilterEnum = z.infer; +export const BooleanFilterEnum = BooleanFilterEnumSchema.enum; + +/** + * InvoiceStatusEnumSchema + * @type { enum } + */ +export const InvoiceStatusEnumSchema = z.enum(["Credited", "Draft", "Overpaid", "PartiallyPaid", "Outstanding", "Paid", "CreditNote", "ProForma"]); +export type InvoiceStatusEnum = z.infer; +export const InvoiceStatusEnum = InvoiceStatusEnumSchema.enum; + +/** + * OfficeInvoiceFilterDtoSchema + * @type { object } + * @property { string } search + * @property { DateRangeDto } issuingDate + * @property { DateRangeDto } serviceDate + * @property { InvoiceDirectionEnum[] } invoiceDirection + * @property { InvoiceTypeEnum[] } invoiceType + * @property { BooleanFilterEnum[] } collective + * @property { number } amountMin + * @property { number } amountMax + * @property { string[] } currencyNotation + * @property { string[] } vatRule + * @property { DateRangeDto } dueDate + * @property { InvoiceStatusEnum[] } status + * @property { string[] } receiver Filter by invoice receiver/customer IDs (UUID) + * @property { string[] } receiverCountry Filter by invoice receiver/customer country IDs + * @property { string[] } salesRep Filter by sales rep id + * @property { string } positionNumbersString + * @property { string[] } positionNumbers + * @property { string } invoiceNumbersString + * @property { string[] } invoiceNumbers + * @property { BooleanFilterEnum[] } bookkeepingExportStatus + * @property { BooleanFilterEnum[] } dunningBlock + * @property { BooleanFilterEnum[] } invoiceInReview + * @property { BooleanFilterEnum[] } isInvoiceOk + * @property { BooleanFilterEnum[] } isVatOk + * @property { number } invoiceNumberMin + * @property { number } invoiceNumberMax + * @property { number } internalNumberMin + * @property { number } internalNumberMax + * @property { string } externalSystemId Filter invoices by position external system ID (substring match) + * @property { string } hblNumber Filter invoices by HBL/HAWB (substring match) + * @property { string } mblNumber Filter invoices by MBL/MAWB (substring match) + * @property { string } bookingNumber Filter invoices by booking number (substring match) + * @property { string } vessel Filter invoices by vessel name (substring match) + * @property { string } voyage Filter invoices by voyage number (substring match) + * @property { string } creditorId Filter invoices by creditor ID (substring match) + * @property { string } debtorId Filter invoices by debtor ID (substring match) + */ +export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), vatRule: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer IDs (UUID)"), receiverCountry: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer country IDs"), salesRep: z.array(z.string()).readonly().describe("Filter by sales rep id"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number(), externalSystemId: z.string().describe("Filter invoices by position external system ID (substring match)"), hblNumber: z.string().describe("Filter invoices by HBL/HAWB (substring match)"), mblNumber: z.string().describe("Filter invoices by MBL/MAWB (substring match)"), bookingNumber: z.string().describe("Filter invoices by booking number (substring match)"), vessel: z.string().describe("Filter invoices by vessel name (substring match)"), voyage: z.string().describe("Filter invoices by voyage number (substring match)"), creditorId: z.string().describe("Filter invoices by creditor ID (substring match)"), debtorId: z.string().describe("Filter invoices by debtor ID (substring match)") }).readonly(); +export type OfficeInvoiceFilterDto = z.infer; + +/** + * PositionStatusEnumSchema + * @type { enum } + */ +export const PositionStatusEnumSchema = z.enum(["Preparing", "NeedsDocumentation", "Executing", "Done"]); +export type PositionStatusEnum = z.infer; +export const PositionStatusEnum = PositionStatusEnumSchema.enum; + +/** + * PositionCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionCustomerDto = z.infer; + +/** + * PositionQuoteDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type PositionQuoteDto = z.infer; + +/** + * ParentPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type ParentPositionDto = z.infer; + +/** + * PositionTypeEnumSchema + * @type { enum } + */ +export const PositionTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); +export type PositionTypeEnum = z.infer; +export const PositionTypeEnum = PositionTypeEnumSchema.enum; + +/** + * PositionProjectLiteDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionProjectLiteDto = z.infer; + +/** + * EmployeeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const EmployeeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type EmployeeDto = z.infer; + +/** + * PositionCoreResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } rootFolderId + * @property { string } externalSystemId + * @property { MovementTypeEnum } inttraTypeOfMove + * @property { PositionCustomerDto } customer + * @property { boolean } isCancelled + * @property { string } owningOfficeId + * @property { string } originOfficeId + * @property { PositionQuoteDto } quote + * @property { string } number + * @property { SectionEnum } section + * @property { DirectionEnum } direction + * @property { TransportModeEnum } transportMode + * @property { string } statusDate + * @property { string } serviceDate + * @property { string } dateOfDeparture + * @property { string } dateOfArrival + * @property { PositionStatusEnum } status + * @property { LoadTypeEnum } loadType + * @property { IncotermsEnum } incoterms + * @property { IncotermsEnum } secondIncoterms + * @property { ServiceTypeEnum } serviceType + * @property { ParentPositionDto } parentPosition + * @property { string } buyRateReference + * @property { FrequencyEnum } frequency + * @property { PositionTypeEnum } positionType + * @property { boolean } isParentPosition + * @property { boolean } hasParentPosition + * @property { boolean } hasChildPositions + * @property { PositionProjectLiteDto } projectLite + * @property { boolean } isExcludedFromStatistics + * @property { EmployeeDto } salesRep + * @property { string } fillingCompany + * @property { string } sellingContract + * @property { string } fillingScacCode + * @property { string } serviceValidity + * @property { string } ratesValidity + * @property { EmployeeDto } responsibleEmployee + * @property { EmployeeDto } receivedByEmployee + * @property { string } team + * @property { string } createdAt + * @property { string } updatedAt + * @property { EditorContentResponseDto } notes Notes + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); +export type PositionCoreResponseDto = z.infer; + +/** + * VesselDtoSchema + * @type { object } + * @property { string } name + * @property { number } imo + * @property { number } mmsi + */ +export const VesselDtoSchema = z.object({ name: z.string(), imo: z.number().nullish(), mmsi: z.number().nullish() }).readonly(); +export type VesselDto = z.infer; + +/** + * StatusResponseDtoSchema + * @type { object } + * @property { string } status Status + * @property { string } message Message + * @property { string } code Alphanumeric code of the message type + */ +export const StatusResponseDtoSchema = z.object({ status: z.string().describe("Status"), message: z.string().describe("Message"), code: z.string().describe("Alphanumeric code of the message type") }).readonly(); +export type StatusResponseDto = z.infer; + +/** + * PaginationDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const PaginationDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type PaginationDto = z.infer; + +/** + * LabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + */ +export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export type LabelResponseDTO = z.infer; + +/** + * GenerateWorkingDocumentRequestDtoSchema + * @type { object } + * @property { string } issuedAt + * @property { string } fileName + */ +export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); +export type GenerateWorkingDocumentRequestDto = z.infer; + +/** + * UpdateInvolvedPartyDtoSchema + * @type { object } + * @property { string } reference + * @property { string } businessPartnerId + * @property { string } contactId + */ +export const UpdateInvolvedPartyDtoSchema = z.object({ reference: z.string(), businessPartnerId: z.string(), contactId: z.string() }).readonly(); +export type UpdateInvolvedPartyDto = z.infer; + +/** + * MergeRoutesRequestDtoSchema + * @type { object } + * @property { string } sourceCargoId Source cargo ID to merge from (sea positions only) + */ +export const MergeRoutesRequestDtoSchema = z.object({ sourceCargoId: z.string().describe("Source cargo ID to merge from (sea positions only)").nullable() }).readonly(); +export type MergeRoutesRequestDto = z.infer; + +/** + * CopyRouteRequestDtoSchema + * @type { object } + * @property { string } targetCargoId Target cargo ID to copy to (sea positions only) + */ +export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to copy to (sea positions only)").nullable() }).readonly(); +export type CopyRouteRequestDto = z.infer; + +/** + * CargoSummaryResponseDTOSchema + * @type { object } + * @property { string } transportUnitTypeName Transport unit type name (e.g., "40' DRY", "20'") + * @property { number } quantity Total quantity of this transport unit type + */ +export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string().describe("Transport unit type name (e.g., "40' DRY", "20'")"), quantity: z.number().describe("Total quantity of this transport unit type") }).readonly(); +export type CargoSummaryResponseDTO = z.infer; + +/** + * CreatePositionCargoDTOSchema + * @type { object } + * @property { string } cargoTypeId Cargo type ID + * @property { string } note + * @property { boolean } autoCalculateTotals + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { string } rateOptions + * @property { string } rateClass + * @property { number } ratePerKg + * @property { number } totalRate + * @property { string } textForCustoms + * @property { number } tare + * @property { number } vgm + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + */ +export const CreatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); +export type CreatePositionCargoDTO = z.infer; + +/** + * UpdatePositionCargoDTOSchema + * @type { object } + * @property { string } cargoTypeId Cargo type ID + * @property { string } note + * @property { boolean } autoCalculateTotals + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { string } rateOptions + * @property { string } rateClass + * @property { number } ratePerKg + * @property { number } totalRate + * @property { string } textForCustoms + * @property { number } tare + * @property { number } vgm + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + */ +export const UpdatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); +export type UpdatePositionCargoDTO = z.infer; + +/** + * MovePositionCargoPackageRequestDTOSchema + * @type { object } + * @property { string } targetCargoId Target cargo ID to move the package to + */ +export const MovePositionCargoPackageRequestDTOSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to move the package to") }).readonly(); +export type MovePositionCargoPackageRequestDTO = z.infer; + +/** + * PositionCargoPaginationOrderFieldSchema + * @type { enum } + */ +export const PositionCargoPaginationOrderFieldSchema = z.enum(["createdAt", "updatedAt"]); +export type PositionCargoPaginationOrderField = z.infer; +export const PositionCargoPaginationOrderField = PositionCargoPaginationOrderFieldSchema.enum; + +/** + * PositionAvailablePartnersUseCaseSchema + * @type { enum } + */ +export const PositionAvailablePartnersUseCaseSchema = z.enum(["financeCustomer", "financeVendor"]); +export type PositionAvailablePartnersUseCase = z.infer; +export const PositionAvailablePartnersUseCase = PositionAvailablePartnersUseCaseSchema.enum; + +} diff --git a/test/generated/full/containerYards/containerYards.acl.ts b/test/generated/full/containerYards/containerYards.acl.ts new file mode 100644 index 0000000..f4e07a4 --- /dev/null +++ b/test/generated/full/containerYards/containerYards.acl.ts @@ -0,0 +1,84 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace ContainerYardsAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "ContainerYard" +] as AbilityTuple<"Create", "ContainerYard">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +/** + * Use for `useGetLabelById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetLabelById` query + */ +export const canUseGetLabelById = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Update", + "ContainerYard" +] as AbilityTuple<"Update", "ContainerYard">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Update", + "ContainerYard" +] as AbilityTuple<"Update", "ContainerYard">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "ContainerYard" +] as AbilityTuple<"Update", "ContainerYard">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +} diff --git a/test/generated/full/containerYards/containerYards.api.ts b/test/generated/full/containerYards/containerYards.api.ts new file mode 100644 index 0000000..57fbfcf --- /dev/null +++ b/test/generated/full/containerYards/containerYards.api.ts @@ -0,0 +1,87 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ContainerYardsModels } from "./containerYards.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ContainerYardsApi { +export const paginate = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, + `/container-yards`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards`, + ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, + `/container-yards/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getLabelById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.LabelResponseDTOSchema }, + `/container-yards/${id}/labels`, + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}/unarchive`, + undefined, + config + ) +}; +export const update = (id: string, data: ContainerYardsModels.UpdateContainerYardRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}`, + ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}`, + config + ) +}; +} diff --git a/test/generated/full/containerYards/containerYards.configs.ts b/test/generated/full/containerYards/containerYards.configs.ts new file mode 100644 index 0000000..4458f76 --- /dev/null +++ b/test/generated/full/containerYards/containerYards.configs.ts @@ -0,0 +1,142 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ContainerYardsModels } from "./containerYards.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ContainerYardsQueries } from "./containerYards.queries"; +import { ContainerYardsAcl } from "./containerYards.acl"; + +export namespace ContainerYardsConfigs { +export const containerYardsConfig = { + meta: { + title: "Container Yards", + }, + readAll: { + acl: ContainerYardsAcl.canUsePaginate, + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + paginated: ContainerYardsQueries.usePaginate, + infinite: ContainerYardsQueries.usePaginateInfinite, + filters: { + schema: ContainerYardsModels.ContainerYardFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ContainerYardsModels.ContainerYardFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + shortName: true, + name: true, + archived: true, + street: true, + secondaryStreet: true, + zip: true, + city: true, + country: true, + district: true, + additionalInformation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: ContainerYardsAcl.canUseFindById, + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + query: ContainerYardsQueries.useFindById, + }, + create: { + acl: ContainerYardsAcl.canUseCreate, + schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, + mutation: ContainerYardsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, + options: { + inputs: { + matchCode: true, + name: true, + shortName: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + additionalInformation: true, + }, + }, +}) + }, + update: { + acl: ContainerYardsAcl.canUseUpdate, + schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, + mutation: ContainerYardsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, + options: { + inputs: { + matchCode: true, + name: true, + shortName: true, + addressId: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + additionalInformation: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ContainerYardsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ContainerYardsQueries.usePaginateLabels, + infinite: ContainerYardsQueries.usePaginateLabelsInfinite, + filters: { + schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/containerYards/containerYards.models.ts b/test/generated/full/containerYards/containerYards.models.ts new file mode 100644 index 0000000..bed80b9 --- /dev/null +++ b/test/generated/full/containerYards/containerYards.models.ts @@ -0,0 +1,139 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ContainerYardsModels { +/** + * ContainerYardEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ContainerYardEmployeeDTO = z.infer; + +/** + * ContainerYardResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchCode Container yard match code + * @property { string } shortName Container yard short name + * @property { string } name Container yard name + * @property { boolean } archived Whether the container yard is archived + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { object } city + * @property { string } city.id + * @property { string } city.name + * @property { object } country + * @property { string } country.id + * @property { string } country.name + * @property { string } country.isoCode2 + * @property { string } country.isoCode3 + * @property { string } district District + * @property { string } additionalInformation Additional information + * @property { string } createdById + * @property { ContainerYardEmployeeDTO } createdBy + * @property { string } createdAt Date when the container yard was created + * @property { string } updatedById + * @property { ContainerYardEmployeeDTO } updatedBy + * @property { string } updatedAt Date when the container yard was last updated + */ +export const ContainerYardResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string().describe("Container yard match code"), shortName: z.string().describe("Container yard short name").nullish(), name: z.string().describe("Container yard name"), archived: z.boolean().describe("Whether the container yard is archived"), street: z.string().describe("Street address").nullish(), secondaryStreet: z.string().describe("Secondary street address").nullish(), zip: z.string().describe("ZIP/Postal code").nullish(), city: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), country: z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly().nullish(), district: z.string().describe("District").nullish(), additionalInformation: z.string().describe("Additional information").nullish(), createdById: z.string().nullish(), createdBy: ContainerYardEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was created"), updatedById: z.string().nullish(), updatedBy: ContainerYardEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was last updated") }).readonly(); +export type ContainerYardResponseDTO = z.infer; + +/** + * ContainerYardFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ContainerYardFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); +export type ContainerYardFilterDto = z.infer; + +/** + * ContainerYardLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const ContainerYardLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type ContainerYardLabelFilterDto = z.infer; + +/** + * CreateContainerYardRequestDTOSchema + * @type { object } + * @property { string } matchCode Match code + * @property { string } name Name + * @property { string } shortName Short name + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } cityId City ID + * @property { string } countryId Country ID + * @property { string } district District + * @property { string } additionalInformation Additional information + */ +export const CreateContainerYardRequestDTOSchema = z.object({ matchCode: z.string().describe("Match code"), name: z.string().describe("Name"), shortName: z.string().describe("Short name").nullish(), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street address").nullish(), zip: z.string().describe("ZIP/Postal code"), cityId: z.string().describe("City ID"), countryId: z.string().describe("Country ID"), district: z.string().describe("District").nullish(), additionalInformation: z.string().describe("Additional information").nullish() }).readonly(); +export type CreateContainerYardRequestDTO = z.infer; + +/** + * UpdateContainerYardRequestDTOSchema + * @type { object } + * @property { string } matchCode Match code + * @property { string } name Name + * @property { string } shortName Short name + * @property { string } addressId Address ID + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } cityId City ID + * @property { string } countryId Country ID + * @property { string } district District + * @property { string } additionalInformation Additional information + */ +export const UpdateContainerYardRequestDTOSchema = z.object({ matchCode: z.string().describe("Match code"), name: z.string().describe("Name"), shortName: z.string().describe("Short name"), addressId: z.string().describe("Address ID"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street address"), zip: z.string().describe("ZIP/Postal code"), cityId: z.string().describe("City ID"), countryId: z.string().describe("Country ID"), district: z.string().describe("District"), additionalInformation: z.string().describe("Additional information") }).readonly(); +export type UpdateContainerYardRequestDTO = z.infer; + +/** + * ContainerYardsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ContainerYardsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ContainerYardsPaginateOrderParamEnum = z.infer; +export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderParamEnumSchema.enum; + +/** + * ContainerYardsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ContainerYardResponseDTO[] } items + */ +export const ContainerYardsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerYardResponseDTOSchema).readonly() }).readonly().shape }); +export type ContainerYardsPaginateResponse = z.infer; + +/** + * ContainerYardsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ContainerYardsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ContainerYardsPaginateLabelsOrderParamEnum = z.infer; +export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * ContainerYardsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ContainerYardsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type ContainerYardsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/containerYards/containerYards.queries.ts b/test/generated/full/containerYards/containerYards.queries.ts new file mode 100644 index 0000000..c737b06 --- /dev/null +++ b/test/generated/full/containerYards/containerYards.queries.ts @@ -0,0 +1,287 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ContainerYardsAcl } from "./containerYards.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ContainerYardsModels } from "./containerYards.models"; +import { ContainerYardsApi } from "./containerYards.api"; + +export namespace ContainerYardsQueries { +export const moduleName = QueryModule.ContainerYards; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string) => [...keys.all, "/container-yards", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getLabelById: (id: string) => [...keys.all, "/container-yards/:id/labels", id] as const, + findById: (id: string) => [...keys.all, "/container-yards/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Container Yards + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUsePaginate()); + return ContainerYardsApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Container Yards + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ContainerYardsAcl.canUsePaginate()); + return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create container yard + * @permission Requires `canUseCreate` ability + * @param { ContainerYardsModels.CreateContainerYardRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(ContainerYardsAcl.canUseCreate()); + return ContainerYardsApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate container yard labels (id and name) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUsePaginateLabels()); + return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate container yard labels (id and name) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ContainerYardsAcl.canUsePaginateLabels()); + return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetLabelById` + * @summary Get container yard by ID with label format (id and formatted name) + * @permission Requires `canUseGetLabelById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetLabelById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getLabelById(id), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUseGetLabelById()); + return ContainerYardsApi.getLabelById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive container yard + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ContainerYardsAcl.canUseArchive()); + return ContainerYardsApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive container yard + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ContainerYardsAcl.canUseUnarchive()); + return ContainerYardsApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update container yard + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { ContainerYardsModels.UpdateContainerYardRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(ContainerYardsAcl.canUseUpdate()); + return ContainerYardsApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get container yard + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUseFindById()); + return ContainerYardsApi.findById(id, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/controlTowerAuth/controlTowerAuth.api.ts b/test/generated/full/controlTowerAuth/controlTowerAuth.api.ts new file mode 100644 index 0000000..b52d90f --- /dev/null +++ b/test/generated/full/controlTowerAuth/controlTowerAuth.api.ts @@ -0,0 +1,23 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerAuthModels } from "./controlTowerAuth.models"; + +export namespace ControlTowerAuthApi { +export const login = (data: ControlTowerAuthModels.LoginRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, + `/auth/move/login`, + ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), + config + ) +}; +export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, + `/auth/reset-password`, + ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/controlTowerAuth/controlTowerAuth.models.ts b/test/generated/full/controlTowerAuth/controlTowerAuth.models.ts new file mode 100644 index 0000000..287265f --- /dev/null +++ b/test/generated/full/controlTowerAuth/controlTowerAuth.models.ts @@ -0,0 +1,34 @@ +import { z } from "zod"; + +export namespace ControlTowerAuthModels { +/** + * LoginRequestDtoSchema + * @type { object } + * @property { string } username + * @property { string } password + */ +export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }).readonly(); +export type LoginRequestDto = z.infer; + +/** + * LoginResponseDtoSchema + * @type { object } + * @property { string } accessToken + * @property { boolean } resetPasswordRequired + * @property { string } passwordResetToken + * @property { string } username + */ +export const LoginResponseDtoSchema = z.object({ accessToken: z.string().nullable(), resetPasswordRequired: z.boolean().nullish(), passwordResetToken: z.string().nullish(), username: z.string().nullish() }).readonly(); +export type LoginResponseDto = z.infer; + +/** + * PasswordResetDtoSchema + * @type { object } + * @property { string } password + * @property { string } username + * @property { string } token + */ +export const PasswordResetDtoSchema = z.object({ password: z.string(), username: z.string(), token: z.string() }).readonly(); +export type PasswordResetDto = z.infer; + +} diff --git a/test/generated/full/controlTowerAuth/controlTowerAuth.queries.ts b/test/generated/full/controlTowerAuth/controlTowerAuth.queries.ts new file mode 100644 index 0000000..37e2167 --- /dev/null +++ b/test/generated/full/controlTowerAuth/controlTowerAuth.queries.ts @@ -0,0 +1,60 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerAuthModels } from "./controlTowerAuth.models"; +import { ControlTowerAuthApi } from "./controlTowerAuth.api"; + +export namespace ControlTowerAuthQueries { +export const moduleName = QueryModule.ControlTowerAuth; + + + +/** + * Mutation `useLogin` + * @description Returns an access token to authenticate for protected endpoints + * @param { ControlTowerAuthModels.LoginRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 400, 401] + */ +export const useLogin = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerAuthApi.login(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useResetPassword` + * @description Resets the password for the requesting user + * @param { ControlTowerAuthModels.PasswordResetDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 400, 401] + */ +export const useResetPassword = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerAuthApi.resetPassword(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/controlTowerBookings/controlTowerBookings.api.ts b/test/generated/full/controlTowerBookings/controlTowerBookings.api.ts new file mode 100644 index 0000000..2ba8093 --- /dev/null +++ b/test/generated/full/controlTowerBookings/controlTowerBookings.api.ts @@ -0,0 +1,38 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; + +export namespace ControlTowerBookingsApi { +export const findAll = (limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, + `/bookings`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, + `/bookings/${id}`, + config + ) +}; +export const findPackageById = (packageId: string, bookingId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, + `/bookings/${bookingId}/packages/${packageId}`, + config + ) +}; +} diff --git a/test/generated/full/controlTowerBookings/controlTowerBookings.configs.ts b/test/generated/full/controlTowerBookings/controlTowerBookings.configs.ts new file mode 100644 index 0000000..ce75a71 --- /dev/null +++ b/test/generated/full/controlTowerBookings/controlTowerBookings.configs.ts @@ -0,0 +1,56 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; +import { ControlTowerBookingsQueries } from "./controlTowerBookings.queries"; + +export namespace ControlTowerBookingsConfigs { +export const bookingsConfig = { + meta: { + title: "Bookings", + }, + readAll: { + schema: ControlTowerBookingsModels.BookingListItemDtoSchema, + paginated: ControlTowerBookingsQueries.useFindAll, + infinite: ControlTowerBookingsQueries.useFindAllInfinite, + filters: { + schema: ControlTowerBookingsModels.BookingFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerBookingsModels.BookingFilterDtoSchema, + options: { + inputs: { + projectId: true, + search: true, + companyIds: true, + purchaseOrderId: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ControlTowerBookingsModels.BookingListItemDtoSchema, + options: { + columns: { + id: true, + bookingNumber: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema, + }, +}), + }, + read: { + schema: ControlTowerBookingsModels.BookingResponseDtoSchema, + query: ControlTowerBookingsQueries.useFindById, + }, +}; + +} diff --git a/test/generated/full/controlTowerBookings/controlTowerBookings.models.ts b/test/generated/full/controlTowerBookings/controlTowerBookings.models.ts new file mode 100644 index 0000000..1671d53 --- /dev/null +++ b/test/generated/full/controlTowerBookings/controlTowerBookings.models.ts @@ -0,0 +1,147 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerBookingsModels { +/** + * BookingListItemDtoSchema + * @type { object } + * @property { string } id + * @property { string } bookingNumber + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const BookingListItemDtoSchema = z.object({ id: z.string(), bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export type BookingListItemDto = z.infer; + +/** + * BookingContainerDtoSchema + * @type { object } + * @property { string } id + * @property { string } containerNumber + * @property { string } type + * @property { string } loadType + * @property { string } stuffedInContainer + * @property { string[] } hsCode + * @property { number } noS + * @property { number } weight + * @property { string } lastEventLocation + * @property { string } lastEventName + * @property { string } lastEventDate + * @property { string } seals + */ +export const BookingContainerDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), loadType: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), hsCode: z.array(z.string()).readonly().nullable(), noS: z.number().nullable(), weight: z.number().nullable(), lastEventLocation: z.string().nullable(), lastEventName: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), seals: z.string().nullable() }).readonly(); +export type BookingContainerDto = z.infer; + +/** + * BookingPackageDtoSchema + * @type { object } + * @property { string } id + * @property { string } packageNumber + * @property { string } containerNumber + * @property { string } type + * @property { string } description + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + */ +export const BookingPackageDtoSchema = z.object({ id: z.string(), packageNumber: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), description: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable() }).readonly(); +export type BookingPackageDto = z.infer; + +/** + * BookingResponseDtoSchema + * @type { object } + * @property { string } bookingNumber + * @property { string } ets + * @property { string } etaPod + * @property { string } etaFinalDeliveryPlace + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } destination + * @property { string } lastEvent + * @property { string[] } files + * @property { string } poNumber + * @property { string } blNumber + * @property { BookingContainerDto[] } containers + * @property { BookingPackageDto[] } packages + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + * @property { string } id + */ +export const BookingResponseDtoSchema = z.object({ bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), etaPod: z.iso.datetime({ offset: true }).nullable(), etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), destination: z.string().nullable(), lastEvent: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), poNumber: z.string().nullable(), blNumber: z.string().nullable(), containers: z.array(BookingContainerDtoSchema).readonly().nullish(), packages: z.array(BookingPackageDtoSchema).readonly().nullish(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable(), id: z.string() }).readonly(); +export type BookingResponseDto = z.infer; + +/** + * PackageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } poNumber + * @property { string } bookingNumber + * @property { string } blNumber + * @property { string } containerNumber + * @property { string } packageNumber + * @property { string } description + * @property { number } netWeight + * @property { number } grossWeight + * @property { number } length + * @property { number } width + * @property { number } height + * @property { number } volume + * @property { string } storageInstruction + * @property { string } destination + * @property { string[] } files + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const PackageResponseDtoSchema = z.object({ id: z.string(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), containerNumber: z.string().nullable(), packageNumber: z.string().nullable(), description: z.string().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), volume: z.number().nullable(), storageInstruction: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export type PackageResponseDto = z.infer; + +/** + * BookingFilterDtoSchema + * @type { object } + * @property { string } projectId + * @property { string } search Min Length: `1` + * @property { string[] } companyIds + * @property { string } purchaseOrderId + */ +export const BookingFilterDtoSchema = z.object({ projectId: z.string(), search: z.string().min(1), companyIds: z.array(z.string()).readonly(), purchaseOrderId: z.string() }).readonly(); +export type BookingFilterDto = z.infer; + +/** + * ControlTowerBookingsFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ControlTowerBookingsFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); +export type ControlTowerBookingsFindAllOrderParamEnum = z.infer; +export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFindAllOrderParamEnumSchema.enum; + +/** + * ControlTowerBookingsFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookingListItemDto[] } items + */ +export const ControlTowerBookingsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookingListItemDtoSchema).readonly() }).readonly().shape }); +export type ControlTowerBookingsFindAllResponse = z.infer; + +} diff --git a/test/generated/full/controlTowerBookings/controlTowerBookings.queries.ts b/test/generated/full/controlTowerBookings/controlTowerBookings.queries.ts new file mode 100644 index 0000000..7ab4d73 --- /dev/null +++ b/test/generated/full/controlTowerBookings/controlTowerBookings.queries.ts @@ -0,0 +1,105 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; +import { ControlTowerBookingsApi } from "./controlTowerBookings.api"; + +export namespace ControlTowerBookingsQueries { +export const moduleName = QueryModule.ControlTowerBookings; + +export const keys = { + all: [moduleName] as const, + findAll: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string) => [...keys.all, "/bookings", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string) => [...keys.all, "/bookings", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/bookings/:id", id] as const, + findPackageById: (packageId: string, bookingId: string) => [...keys.all, "/bookings/:bookingId/packages/:packageId", packageId, bookingId] as const, +}; + +/** + * Query `useFindAll` + * @summary Get all accessible bookings for the customer + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => + ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @summary Get all accessible bookings for the customer + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @description Returns a booking with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => + ControlTowerBookingsApi.findById(id, config), + ...options, + }); +}; + +/** + * Query `useFindPackageById` + * @description Returns a package with the specified id + * @param { string } object.packageId Path parameter + * @param { string } object.bookingId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindPackageById = ({ packageId, bookingId }: { packageId: string, bookingId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findPackageById(packageId, bookingId), + queryFn: () => + ControlTowerBookingsApi.findPackageById(packageId, bookingId, config), + ...options, + }); +}; + +} diff --git a/test/generated/full/controlTowerCalendar/controlTowerCalendar.api.ts b/test/generated/full/controlTowerCalendar/controlTowerCalendar.api.ts new file mode 100644 index 0000000..198615d --- /dev/null +++ b/test/generated/full/controlTowerCalendar/controlTowerCalendar.api.ts @@ -0,0 +1,26 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; + +export namespace ControlTowerCalendarApi { +export const getCalendar = (from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, + `/calendar`, + { + ...config, + params: { + from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), + to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), + type: ZodExtended.parse(ControlTowerCalendarModels.CalendarTypeEnumSchema, type, { type: "query", name: "type" }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + poNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarPoNumbersParamSchema.optional(), poNumbers, { type: "query", name: "poNumbers" }), + containerNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarContainerNumbersParamSchema.optional(), containerNumbers, { type: "query", name: "containerNumbers" }), + bookingNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarBookingNumbersParamSchema.optional(), bookingNumbers, { type: "query", name: "bookingNumbers" }), + }, + } + ) +}; +} diff --git a/test/generated/full/controlTowerCalendar/controlTowerCalendar.models.ts b/test/generated/full/controlTowerCalendar/controlTowerCalendar.models.ts new file mode 100644 index 0000000..5c33c81 --- /dev/null +++ b/test/generated/full/controlTowerCalendar/controlTowerCalendar.models.ts @@ -0,0 +1,91 @@ +import { z } from "zod"; + +export namespace ControlTowerCalendarModels { +/** + * EventRelationTypeEnumSchema + * @type { enum } + */ +export const EventRelationTypeEnumSchema = z.enum(["Booking", "Container", "PurchaseOrder"]); +export type EventRelationTypeEnum = z.infer; +export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; + +/** + * CalendarEventRelationDtoSchema + * @type { object } + * @property { EventRelationTypeEnum } type + * @property { string } id + * @property { string } number + */ +export const CalendarEventRelationDtoSchema = z.object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }).readonly(); +export type CalendarEventRelationDto = z.infer; + +/** + * CalendarTypeEnumSchema + * @type { enum } + */ +export const CalendarTypeEnumSchema = z.enum(["PurchaseOrder", "Booking", "Container", "Package"]); +export type CalendarTypeEnum = z.infer; +export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; + +/** + * CalendarEventDtoSchema + * @type { object } + * @property { string } entityId + * @property { string } entityNumber + * @property { CalendarTypeEnum } entityType + * @property { string } date + * @property { string } title + * @property { CalendarEventRelationDto[] } relations + */ +export const CalendarEventDtoSchema = z.object({ entityId: z.string(), entityNumber: z.string(), entityType: CalendarTypeEnumSchema, date: z.iso.datetime({ offset: true }), title: z.string(), relations: z.array(CalendarEventRelationDtoSchema).readonly() }).readonly(); +export type CalendarEventDto = z.infer; + +/** + * FiltersDtoSchema + * @type { object } + * @property { string[] } poNumbers + * @property { string[] } bookingNumbers + * @property { string[] } containerNumbers + */ +export const FiltersDtoSchema = z.object({ poNumbers: z.array(z.string()).readonly(), bookingNumbers: z.array(z.string()).readonly(), containerNumbers: z.array(z.string()).readonly() }).readonly(); +export type FiltersDto = z.infer; + +/** + * CalendarDtoSchema + * @type { object } + * @property { CalendarEventDto[] } events + * @property { FiltersDto } filters + */ +export const CalendarDtoSchema = z.object({ events: z.array(CalendarEventDtoSchema).readonly(), filters: FiltersDtoSchema }).readonly(); +export type CalendarDto = z.infer; + +/** + * CalendarResponseDtoSchema + * @type { object } + * @property { CalendarDto } data + */ +export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }).readonly(); +export type CalendarResponseDto = z.infer; + +/** + * GetCalendarPoNumbersParamSchema + * @type { array } + */ +export const GetCalendarPoNumbersParamSchema = z.array(z.string()).readonly().nullish(); +export type GetCalendarPoNumbersParam = z.infer; + +/** + * GetCalendarContainerNumbersParamSchema + * @type { array } + */ +export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).readonly().nullish(); +export type GetCalendarContainerNumbersParam = z.infer; + +/** + * GetCalendarBookingNumbersParamSchema + * @type { array } + */ +export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).readonly().nullish(); +export type GetCalendarBookingNumbersParam = z.infer; + +} diff --git a/test/generated/full/controlTowerCalendar/controlTowerCalendar.queries.ts b/test/generated/full/controlTowerCalendar/controlTowerCalendar.queries.ts new file mode 100644 index 0000000..115102b --- /dev/null +++ b/test/generated/full/controlTowerCalendar/controlTowerCalendar.queries.ts @@ -0,0 +1,39 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; +import { ControlTowerCalendarApi } from "./controlTowerCalendar.api"; + +export namespace ControlTowerCalendarQueries { +export const moduleName = QueryModule.ControlTowerCalendar; + +export const keys = { + all: [moduleName] as const, + getCalendar: (from?: string, to?: string, type?: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam) => [...keys.all, "/calendar", from, to, type, search, poNumbers, containerNumbers, bookingNumbers] as const, +}; + +/** + * Query `useGetCalendar` + * @param { string } object.from Query parameter + * @param { string } object.to Query parameter + * @param { ControlTowerCalendarModels.CalendarTypeEnum } object.type Query parameter + * @param { string } object.search Query parameter + * @param { ControlTowerCalendarModels.GetCalendarPoNumbersParam } object.poNumbers Query parameter + * @param { ControlTowerCalendarModels.GetCalendarContainerNumbersParam } object.containerNumbers Query parameter + * @param { ControlTowerCalendarModels.GetCalendarBookingNumbersParam } object.bookingNumbers Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCalendar = ({ from, to, type, search, poNumbers, containerNumbers, bookingNumbers }: { from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), + queryFn: () => + ControlTowerCalendarApi.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers, config), + ...options, + }); +}; + +} diff --git a/test/generated/full/controlTowerContainers/controlTowerContainers.api.ts b/test/generated/full/controlTowerContainers/controlTowerContainers.api.ts new file mode 100644 index 0000000..4708306 --- /dev/null +++ b/test/generated/full/controlTowerContainers/controlTowerContainers.api.ts @@ -0,0 +1,38 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; + +export namespace ControlTowerContainersApi { +export const findAll = (limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, + `/containers`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, + `/containers/${id}`, + config + ) +}; +export const getJourney = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, + `/containers/${id}/journey`, + config + ) +}; +} diff --git a/test/generated/full/controlTowerContainers/controlTowerContainers.configs.ts b/test/generated/full/controlTowerContainers/controlTowerContainers.configs.ts new file mode 100644 index 0000000..98105eb --- /dev/null +++ b/test/generated/full/controlTowerContainers/controlTowerContainers.configs.ts @@ -0,0 +1,54 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; +import { ControlTowerContainersQueries } from "./controlTowerContainers.queries"; + +export namespace ControlTowerContainersConfigs { +export const containersConfig = { + meta: { + title: "Containers", + }, + readAll: { + schema: ControlTowerContainersModels.ContainerListItemDtoSchema, + paginated: ControlTowerContainersQueries.useFindAll, + infinite: ControlTowerContainersQueries.useFindAllInfinite, + filters: { + schema: ControlTowerContainersModels.ContainerFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerContainersModels.ContainerFilterDtoSchema, + options: { + inputs: { + companyIds: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ControlTowerContainersModels.ContainerListItemDtoSchema, + options: { + columns: { + containerNumber: true, + id: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, + }, +}), + }, + read: { + schema: ControlTowerContainersModels.ContainerResponseDtoSchema, + query: ControlTowerContainersQueries.useFindById, + }, +}; + +} diff --git a/test/generated/full/controlTowerContainers/controlTowerContainers.models.ts b/test/generated/full/controlTowerContainers/controlTowerContainers.models.ts new file mode 100644 index 0000000..410f1aa --- /dev/null +++ b/test/generated/full/controlTowerContainers/controlTowerContainers.models.ts @@ -0,0 +1,133 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerContainersModels { +/** + * ContainerListItemDtoSchema + * @type { object } + * @property { string } containerNumber + * @property { string } id + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const ContainerListItemDtoSchema = z.object({ containerNumber: z.string().nullable(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export type ContainerListItemDto = z.infer; + +/** + * ContainerEventDtoSchema + * @type { object } + * @property { CommonModels.VesselDto } vessel + * @property { string } name + * @property { string } date + * @property { boolean } checkedIn + */ +export const ContainerEventDtoSchema = z.object({ vessel: CommonModels.VesselDtoSchema.nullable(), name: z.string(), date: z.iso.datetime({ offset: true }).nullable(), checkedIn: z.boolean() }).readonly(); +export type ContainerEventDto = z.infer; + +/** + * ContainerJourneyDtoSchema + * @type { object } + * @property { string } id + * @property { string } country + * @property { string } terminal + * @property { boolean } checkedIn + * @property { ContainerEventDto[] } events + */ +export const ContainerJourneyDtoSchema = z.object({ id: z.string(), country: z.string().nullable(), terminal: z.string().nullable(), checkedIn: z.boolean(), events: z.array(ContainerEventDtoSchema).readonly() }).readonly(); +export type ContainerJourneyDto = z.infer; + +/** + * PackageNumberDtoSchema + * @type { object } + * @property { string } id + * @property { string } type + * @property { string } description + */ +export const PackageNumberDtoSchema = z.object({ id: z.string(), type: z.string().nullable(), description: z.string() }).readonly(); +export type PackageNumberDto = z.infer; + +/** + * ContainerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } containerNumber + * @property { string } poNumber + * @property { string } bookingNumber + * @property { string } blNumber + * @property { string } stuffedInContainer + * @property { string } containerType + * @property { string } loadType + * @property { string[] } hsCode + * @property { number } totalVolume + * @property { number } totalWeight + * @property { string } cargoDescription + * @property { number } noS + * @property { ContainerJourneyDto[] } journeys + * @property { PackageNumberDto[] } packages + * @property { string } bookingId + * @property { string } destination + * @property { string[] } files + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const ContainerResponseDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), containerType: z.string().nullable(), loadType: z.string().nullable(), hsCode: z.array(z.string()).readonly().nullable(), totalVolume: z.number().nullable(), totalWeight: z.number().nullable(), cargoDescription: z.string().nullable(), noS: z.number().nullable(), journeys: z.array(ContainerJourneyDtoSchema).readonly().nullish(), packages: z.array(PackageNumberDtoSchema).readonly().nullish(), bookingId: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export type ContainerResponseDto = z.infer; + +/** + * ContainerJourneyResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { ContainerJourneyDto[] } journeys + * @property { string[] } packageNumbers + */ +export const ContainerJourneyResponseDtoSchema = z.object({ id: z.string(), number: z.string(), journeys: z.array(ContainerJourneyDtoSchema).readonly(), packageNumbers: z.array(z.string()).readonly() }).readonly(); +export type ContainerJourneyResponseDto = z.infer; + +/** + * ContainerFilterDtoSchema + * @type { object } + * @property { number[] } companyIds + * @property { string } search + */ +export const ContainerFilterDtoSchema = z.object({ companyIds: z.array(z.number()).readonly(), search: z.string() }).readonly(); +export type ContainerFilterDto = z.infer; + +/** + * ControlTowerContainersFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ControlTowerContainersFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); +export type ControlTowerContainersFindAllOrderParamEnum = z.infer; +export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainersFindAllOrderParamEnumSchema.enum; + +/** + * ControlTowerContainersFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ContainerListItemDto[] } items + */ +export const ControlTowerContainersFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerListItemDtoSchema).readonly() }).readonly().shape }); +export type ControlTowerContainersFindAllResponse = z.infer; + +} diff --git a/test/generated/full/controlTowerContainers/controlTowerContainers.queries.ts b/test/generated/full/controlTowerContainers/controlTowerContainers.queries.ts new file mode 100644 index 0000000..eef15d1 --- /dev/null +++ b/test/generated/full/controlTowerContainers/controlTowerContainers.queries.ts @@ -0,0 +1,104 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; +import { ControlTowerContainersApi } from "./controlTowerContainers.api"; + +export namespace ControlTowerContainersQueries { +export const moduleName = QueryModule.ControlTowerContainers; + +export const keys = { + all: [moduleName] as const, + findAll: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string) => [...keys.all, "/containers", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string) => [...keys.all, "/containers", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/containers/:id", id] as const, + getJourney: (id: string) => [...keys.all, "/containers/:id/journey", id] as const, +}; + +/** + * Query `useFindAll` + * @description Lists containers + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => + ControlTowerContainersApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @description Lists containers + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @description Returns a container with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => + ControlTowerContainersApi.findById(id, config), + ...options, + }); +}; + +/** + * Query `useGetJourney` + * @description Returns the journey and package numbers of a container with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetJourney = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getJourney(id), + queryFn: () => + ControlTowerContainersApi.getJourney(id, config), + ...options, + }); +}; + +} diff --git a/test/generated/full/controlTowerMe/controlTowerMe.api.ts b/test/generated/full/controlTowerMe/controlTowerMe.api.ts new file mode 100644 index 0000000..6852384 --- /dev/null +++ b/test/generated/full/controlTowerMe/controlTowerMe.api.ts @@ -0,0 +1,55 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerMeModels } from "./controlTowerMe.models"; + +export namespace ControlTowerMeApi { +export const getUserProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, + `/me`, + config + ) +}; +export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, + `/me`, + ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), + config + ) +}; +export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, + `/me/basic`, + ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), + config + ) +}; +export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/password`, + ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), + config + ) +}; +export const updateEmailPreferences = (data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/email-preferences`, + ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), + config + ) +}; +export const updateProjectAccess = (config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/access`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/controlTowerMe/controlTowerMe.models.ts b/test/generated/full/controlTowerMe/controlTowerMe.models.ts new file mode 100644 index 0000000..df9a49b --- /dev/null +++ b/test/generated/full/controlTowerMe/controlTowerMe.models.ts @@ -0,0 +1,173 @@ +import { z } from "zod"; + +export namespace ControlTowerMeModels { +/** + * LinksDtoSchema + * @type { object } + * @property { string } self + * @property { string } related + */ +export const LinksDtoSchema = z.object({ self: z.string(), related: z.string() }).readonly(); +export type LinksDto = z.infer; + +/** + * ApiResponseDataDtoSchema + * @type { object } + * @property { string } type + * @property { string } id + * @property { object } attributes + * @property { object } relationships + * @property { LinksDto } links + */ +export const ApiResponseDataDtoSchema = z.object({ type: z.string(), id: z.string(), attributes: z.object({}).readonly().nullish(), relationships: z.object({}).readonly().nullish(), links: LinksDtoSchema.nullish() }).readonly(); +export type ApiResponseDataDto = z.infer; + +/** + * PaginationLinksDtoSchema + * @type { object } + * @property { string } next + * @property { string } self + * @property { string } last + */ +export const PaginationLinksDtoSchema = z.object({ next: z.string(), self: z.string(), last: z.string() }).readonly(); +export type PaginationLinksDto = z.infer; + +/** + * ApiResponseDtoSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + */ +export const ApiResponseDtoSchema = z.object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }).readonly(); +export type ApiResponseDto = z.infer; + +/** + * DelayNotificationEnumSchema + * @type { enum } + */ +export const DelayNotificationEnumSchema = z.enum(["EveryDelay", "LongerThan24Hours", "LongerThan3Days"]); +export type DelayNotificationEnum = z.infer; +export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; + +/** + * UserEmailPreferencesDtoSchema + * @type { object } + * @property { boolean } originDeparture + * @property { boolean } loadedOnVessel + * @property { boolean } destinationArrival + * @property { boolean } onsiteDelivery + * @property { DelayNotificationEnum } delay + */ +export const UserEmailPreferencesDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }).readonly(); +export type UserEmailPreferencesDto = z.infer; + +/** + * UserProjectAccessDtoSchema + * @type { object } + * @property { string[] } projectIds + */ +export const UserProjectAccessDtoSchema = z.object({ projectIds: z.array(z.string()).readonly() }).readonly(); +export type UserProjectAccessDto = z.infer; + +/** + * UserRoleEnumSchema + * @type { enum } + */ +export const UserRoleEnumSchema = z.enum(["User", "Admin"]); +export type UserRoleEnum = z.infer; +export const UserRoleEnum = UserRoleEnumSchema.enum; + +/** + * UserDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } name Min Length: `3` + * @property { string } email + * @property { UserEmailPreferencesDto } emailPreferences + * @property { UserProjectAccessDto } projectAccess + * @property { UserRoleEnum } role + * @property { boolean } isAdmin + */ +export const UserDetailDtoSchema = z.object({ id: z.string(), name: z.string().min(3), email: z.email(), emailPreferences: UserEmailPreferencesDtoSchema.nullable(), projectAccess: UserProjectAccessDtoSchema.nullable(), role: UserRoleEnumSchema.nullable(), isAdmin: z.boolean() }).readonly(); +export type UserDetailDto = z.infer; + +/** + * UserEmailPreferencesUpdateDtoSchema + * @type { object } + * @property { boolean } originDeparture + * @property { boolean } loadedOnVessel + * @property { boolean } destinationArrival + * @property { boolean } onsiteDelivery + * @property { DelayNotificationEnum } delay + */ +export const UserEmailPreferencesUpdateDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }).readonly(); +export type UserEmailPreferencesUpdateDto = z.infer; + +/** + * UserProjectAccessUpdateDtoSchema + * @type { object } + * @property { number[] } projectIds + */ +export const UserProjectAccessUpdateDtoSchema = z.object({ projectIds: z.array(z.number()).readonly() }).readonly(); +export type UserProjectAccessUpdateDto = z.infer; + +/** + * UserUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } password + * @property { UserEmailPreferencesUpdateDto } emailPreferences + * @property { UserProjectAccessUpdateDto } projectAccess + */ +export const UserUpdateDtoSchema = z.object({ name: z.string(), email: z.email(), password: z.string(), emailPreferences: UserEmailPreferencesUpdateDtoSchema, projectAccess: UserProjectAccessUpdateDtoSchema }).readonly(); +export type UserUpdateDto = z.infer; + +/** + * UserBasicUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + */ +export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }).readonly(); +export type UserBasicUpdateDto = z.infer; + +/** + * UserPasswordUpdateDtoSchema + * @type { object } + * @property { string } password + */ +export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }).readonly(); +export type UserPasswordUpdateDto = z.infer; + +/** + * GetUserProfileResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ +export const GetUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape }); +export type GetUserProfileResponse = z.infer; + +/** + * UpdateUserDataResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ +export const UpdateUserDataResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape }); +export type UpdateUserDataResponse = z.infer; + +/** + * UpdateUserProfileResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ +export const UpdateUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape }); +export type UpdateUserProfileResponse = z.infer; + +} diff --git a/test/generated/full/controlTowerMe/controlTowerMe.queries.ts b/test/generated/full/controlTowerMe/controlTowerMe.queries.ts new file mode 100644 index 0000000..fa4d7c0 --- /dev/null +++ b/test/generated/full/controlTowerMe/controlTowerMe.queries.ts @@ -0,0 +1,148 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerMeModels } from "./controlTowerMe.models"; +import { ControlTowerMeApi } from "./controlTowerMe.api"; + +export namespace ControlTowerMeQueries { +export const moduleName = QueryModule.ControlTowerMe; + +export const keys = { + all: [moduleName] as const, + getUserProfile: () => [...keys.all, "/me", ] as const, +}; + +/** + * Query `useGetUserProfile` + * @description Get basic user profile data + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200] + */ +export const useGetUserProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getUserProfile(), + queryFn: () => + ControlTowerMeApi.getUserProfile(config), + ...options, + }); +}; + +/** + * Mutation `useUpdateUserData` + * @description Update user data + * @param { ControlTowerMeModels.UserUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateUserData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updateUserData(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateUserProfile` + * @description Update basic user profile data + * @param { ControlTowerMeModels.UserBasicUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateUserProfile = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updateUserProfile(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdatePassword` + * @description Update user password + * @param { ControlTowerMeModels.UserPasswordUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdatePassword = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updatePassword(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateEmailPreferences` + * @description Update user email notification preferences + * @param { ControlTowerMeModels.UserEmailPreferencesUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateEmailPreferences = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updateEmailPreferences(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateProjectAccess` + * @description Update user project access + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateProjectAccess = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: () => + ControlTowerMeApi.updateProjectAccess(config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/controlTowerPackages/controlTowerPackages.api.ts b/test/generated/full/controlTowerPackages/controlTowerPackages.api.ts new file mode 100644 index 0000000..6cab316 --- /dev/null +++ b/test/generated/full/controlTowerPackages/controlTowerPackages.api.ts @@ -0,0 +1,24 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; + +export namespace ControlTowerPackagesApi { +export const findAll = (limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, + `/packages`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/full/controlTowerPackages/controlTowerPackages.configs.ts b/test/generated/full/controlTowerPackages/controlTowerPackages.configs.ts new file mode 100644 index 0000000..17e4ee5 --- /dev/null +++ b/test/generated/full/controlTowerPackages/controlTowerPackages.configs.ts @@ -0,0 +1,50 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; +import { ControlTowerPackagesQueries } from "./controlTowerPackages.queries"; + +export namespace ControlTowerPackagesConfigs { +export const packagesConfig = { + meta: { + title: "Packages", + }, + readAll: { + schema: ControlTowerPackagesModels.PackageListItemDtoSchema, + paginated: ControlTowerPackagesQueries.useFindAll, + infinite: ControlTowerPackagesQueries.useFindAllInfinite, + filters: { + schema: ControlTowerPackagesModels.PackageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerPackagesModels.PackageFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ControlTowerPackagesModels.PackageListItemDtoSchema, + options: { + columns: { + packageNumber: true, + bookingId: true, + id: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/controlTowerPackages/controlTowerPackages.models.ts b/test/generated/full/controlTowerPackages/controlTowerPackages.models.ts new file mode 100644 index 0000000..4d4fd3b --- /dev/null +++ b/test/generated/full/controlTowerPackages/controlTowerPackages.models.ts @@ -0,0 +1,54 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerPackagesModels { +/** + * PackageListItemDtoSchema + * @type { object } + * @property { string } packageNumber + * @property { string } bookingId + * @property { string } id + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const PackageListItemDtoSchema = z.object({ packageNumber: z.string(), bookingId: z.string(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export type PackageListItemDto = z.infer; + +/** + * PackageFilterDtoSchema + * @type { object } + * @property { string } search Min Length: `1` + */ +export const PackageFilterDtoSchema = z.object({ search: z.string().min(1) }).readonly(); +export type PackageFilterDto = z.infer; + +/** + * ControlTowerPackagesFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ControlTowerPackagesFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); +export type ControlTowerPackagesFindAllOrderParamEnum = z.infer; +export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFindAllOrderParamEnumSchema.enum; + +/** + * ControlTowerPackagesFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PackageListItemDto[] } items + */ +export const ControlTowerPackagesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageListItemDtoSchema).readonly() }).readonly().shape }); +export type ControlTowerPackagesFindAllResponse = z.infer; + +} diff --git a/test/generated/full/controlTowerPackages/controlTowerPackages.queries.ts b/test/generated/full/controlTowerPackages/controlTowerPackages.queries.ts new file mode 100644 index 0000000..d55ee3d --- /dev/null +++ b/test/generated/full/controlTowerPackages/controlTowerPackages.queries.ts @@ -0,0 +1,66 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; +import { ControlTowerPackagesApi } from "./controlTowerPackages.api"; + +export namespace ControlTowerPackagesQueries { +export const moduleName = QueryModule.ControlTowerPackages; + +export const keys = { + all: [moduleName] as const, + findAll: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string) => [...keys.all, "/packages", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string) => [...keys.all, "/packages", "infinite", limit, order, filter, cursor] as const, +}; + +/** + * Query `useFindAll` + * @description Lists packages + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => + ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @description Lists packages + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/full/controlTowerSearch/controlTowerSearch.api.ts b/test/generated/full/controlTowerSearch/controlTowerSearch.api.ts new file mode 100644 index 0000000..4ff685b --- /dev/null +++ b/test/generated/full/controlTowerSearch/controlTowerSearch.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerSearchModels } from "./controlTowerSearch.models"; + +export namespace ControlTowerSearchApi { +export const search = (data: ControlTowerSearchModels.SearchRequestDto, type?: ControlTowerSearchModels.SearchItemTypeEnum, limit?: number, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, + `/search`, + ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), + { + ...config, + params: { + type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { type: "query", name: "type" }), + limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), + }, + } + ) +}; +} diff --git a/test/generated/full/controlTowerSearch/controlTowerSearch.models.ts b/test/generated/full/controlTowerSearch/controlTowerSearch.models.ts new file mode 100644 index 0000000..77d7c82 --- /dev/null +++ b/test/generated/full/controlTowerSearch/controlTowerSearch.models.ts @@ -0,0 +1,42 @@ +import { z } from "zod"; + +export namespace ControlTowerSearchModels { +/** + * SearchItemTypeEnumSchema + * @type { enum } + */ +export const SearchItemTypeEnumSchema = z.enum(["Project", "Booking", "Container"]); +export type SearchItemTypeEnum = z.infer; +export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; + +/** + * SearchItemDtoSchema + * @type { object } + * @property { SearchItemTypeEnum } type + * @property { string } id + * @property { string } label + */ +export const SearchItemDtoSchema = z.object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }).readonly(); +export type SearchItemDto = z.infer; + +/** + * SearchResponseDtoSchema + * @type { object } + * @property { SearchItemDto[] } items + * @property { number } projectsCount + * @property { number } bookingsCount + * @property { number } containersCount + * @property { number } totalCount + */ +export const SearchResponseDtoSchema = z.object({ items: z.array(SearchItemDtoSchema).readonly(), projectsCount: z.number(), bookingsCount: z.number(), containersCount: z.number(), totalCount: z.number() }).readonly(); +export type SearchResponseDto = z.infer; + +/** + * SearchRequestDtoSchema + * @type { object } + * @property { string } search + */ +export const SearchRequestDtoSchema = z.object({ search: z.string() }).readonly(); +export type SearchRequestDto = z.infer; + +} diff --git a/test/generated/full/controlTowerSearch/controlTowerSearch.queries.ts b/test/generated/full/controlTowerSearch/controlTowerSearch.queries.ts new file mode 100644 index 0000000..11200f8 --- /dev/null +++ b/test/generated/full/controlTowerSearch/controlTowerSearch.queries.ts @@ -0,0 +1,38 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerSearchModels } from "./controlTowerSearch.models"; +import { ControlTowerSearchApi } from "./controlTowerSearch.api"; + +export namespace ControlTowerSearchQueries { +export const moduleName = QueryModule.ControlTowerSearch; + + + +/** + * Mutation `useSearch` + * @param { ControlTowerSearchModels.SearchRequestDto } mutation.data Body parameter + * @param { ControlTowerSearchModels.SearchItemTypeEnum } mutation.type Query parameter + * @param { number } mutation.limit Query parameter. Minimum: `1` + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useSearch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data, type, limit }) => + ControlTowerSearchApi.search(data, type, limit, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/countries/countries.acl.ts b/test/generated/full/countries/countries.acl.ts new file mode 100644 index 0000000..0d2de89 --- /dev/null +++ b/test/generated/full/countries/countries.acl.ts @@ -0,0 +1,34 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CountriesAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Country" +] as AbilityTuple<"Read", "Country">; + +/** + * Use for `usePaginateCountryLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCountryLabels` query + */ +export const canUsePaginateCountryLabels = ( +) => [ + "Read", + "Country" +] as AbilityTuple<"Read", "Country">; + +/** + * Use for `useGetCountryById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCountryById` query + */ +export const canUseGetCountryById = ( +) => [ + "Read", + "Country" +] as AbilityTuple<"Read", "Country">; + +} diff --git a/test/generated/full/countries/countries.api.ts b/test/generated/full/countries/countries.api.ts new file mode 100644 index 0000000..7363457 --- /dev/null +++ b/test/generated/full/countries/countries.api.ts @@ -0,0 +1,47 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CountriesModels } from "./countries.models"; + +export namespace CountriesApi { +export const paginate = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CountriesModels.CountriesPaginateResponseSchema }, + `/countries/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateCountryLabels = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, + `/countries/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getCountryById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CountriesModels.CountryResponseDTOSchema }, + `/countries/${id}`, + config + ) +}; +} diff --git a/test/generated/full/countries/countries.configs.ts b/test/generated/full/countries/countries.configs.ts new file mode 100644 index 0000000..52d1c12 --- /dev/null +++ b/test/generated/full/countries/countries.configs.ts @@ -0,0 +1,84 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CountriesModels } from "./countries.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CountriesQueries } from "./countries.queries"; +import { CountriesAcl } from "./countries.acl"; + +export namespace CountriesConfigs { +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CountriesAcl.canUsePaginate, + schema: CountriesModels.CountryResponseDTOSchema, + paginated: CountriesQueries.usePaginate, + infinite: CountriesQueries.usePaginateInfinite, + filters: { + schema: CountriesModels.CountryPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CountriesModels.CountryPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CountriesModels.CountryResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + isoCode2: true, + isoCode3: true, + currencyNotation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CountriesModels.CountriesPaginateOrderParamEnumSchema, + }, +}), + }, +}; + +export const labelsPaginateConfig = { + meta: { + title: "Labels Paginate", + }, + readAll: { + acl: CountriesAcl.canUsePaginateCountryLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CountriesQueries.usePaginateCountryLabels, + infinite: CountriesQueries.usePaginateCountryLabelsInfinite, + filters: { + schema: CountriesModels.CountryPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CountriesModels.CountryPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CountriesModels.PaginateCountryLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/countries/countries.models.ts b/test/generated/full/countries/countries.models.ts new file mode 100644 index 0000000..335259c --- /dev/null +++ b/test/generated/full/countries/countries.models.ts @@ -0,0 +1,82 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CountriesModels { +/** + * CountryEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CountryEmployeeDTO = z.infer; + +/** + * CountryResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the country + * @property { string } name Name of the country + * @property { string } isoCode2 ISO 2-letter code + * @property { string } isoCode3 ISO 3-letter code + * @property { string } currencyNotation Currency notation + * @property { string } createdById + * @property { CountryEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CountryEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const CountryResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the country"), name: z.string().describe("Name of the country"), isoCode2: z.string().describe("ISO 2-letter code"), isoCode3: z.string().describe("ISO 3-letter code"), currencyNotation: z.string().describe("Currency notation"), createdById: z.string().nullish(), createdBy: CountryEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CountryEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type CountryResponseDTO = z.infer; + +/** + * CountryPaginationFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const CountryPaginationFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type CountryPaginationFilterDto = z.infer; + +/** + * CountriesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const CountriesPaginateOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type CountriesPaginateOrderParamEnum = z.infer; +export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSchema.enum; + +/** + * CountriesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CountryResponseDTO[] } items + */ +export const CountriesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CountryResponseDTOSchema).readonly() }).readonly().shape }); +export type CountriesPaginateResponse = z.infer; + +/** + * PaginateCountryLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateCountryLabelsOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateCountryLabelsOrderParamEnum = z.infer; +export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderParamEnumSchema.enum; + +/** + * PaginateCountryLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateCountryLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PaginateCountryLabelsResponse = z.infer; + +} diff --git a/test/generated/full/countries/countries.queries.ts b/test/generated/full/countries/countries.queries.ts new file mode 100644 index 0000000..911e551 --- /dev/null +++ b/test/generated/full/countries/countries.queries.ts @@ -0,0 +1,153 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CountriesAcl } from "./countries.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { CountriesModels } from "./countries.models"; +import { CountriesApi } from "./countries.api"; + +export namespace CountriesQueries { +export const moduleName = QueryModule.Countries; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/paginate", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/paginate", "infinite", limit, order, filter, cursor] as const, + paginateCountryLabels: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/labels/paginate", limit, order, filter, page, cursor] as const, + paginateCountryLabelsInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/labels/paginate", "infinite", limit, order, filter, cursor] as const, + getCountryById: (id: string) => [...keys.all, "/countries/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Countries + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CountriesAcl.canUsePaginate()); + return CountriesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Countries + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CountriesAcl.canUsePaginate()); + return CountriesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateCountryLabels` + * @summary Paginate country labels (id and name only) + * @permission Requires `canUsePaginateCountryLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCountryLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CountriesAcl.canUsePaginateCountryLabels()); + return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateCountryLabelsInfinite + * @summary Paginate country labels (id and name only) + * @permission Requires `canUsePaginateCountryLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCountryLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CountriesAcl.canUsePaginateCountryLabels()); + return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetCountryById` + * @summary Get country by ID with complete details + * @permission Requires `canUseGetCountryById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCountryById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCountryById(id), + queryFn: () => { + checkAcl(CountriesAcl.canUseGetCountryById()); + return CountriesApi.getCountryById(id, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/currencies/currencies.acl.ts b/test/generated/full/currencies/currencies.acl.ts new file mode 100644 index 0000000..ff528da --- /dev/null +++ b/test/generated/full/currencies/currencies.acl.ts @@ -0,0 +1,64 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CurrenciesAcl { +/** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; + +/** + * Use for `useCreateCurrency` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCurrency` mutation + */ +export const canUseCreateCurrency = ( +) => [ + "Create", + "Currency" +] as AbilityTuple<"Create", "Currency">; + +/** + * Use for `usePaginateCurrencyLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabels` query + */ +export const canUsePaginateCurrencyLabels = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; + +/** + * Use for `useGetCurrencyById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCurrencyById` query + */ +export const canUseGetCurrencyById = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; + +/** + * Use for `useUpdateCurrency` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCurrency` mutation + */ +export const canUseUpdateCurrency = ( +) => [ + "Update", + "Currency" +] as AbilityTuple<"Update", "Currency">; + +/** + * Use for `usePaginateCurrencyLabelsByOffice` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabelsByOffice` query + */ +export const canUsePaginateCurrencyLabelsByOffice = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; + +} diff --git a/test/generated/full/currencies/currencies.api.ts b/test/generated/full/currencies/currencies.api.ts new file mode 100644 index 0000000..721f437 --- /dev/null +++ b/test/generated/full/currencies/currencies.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CurrenciesModels } from "./currencies.models"; + +export namespace CurrenciesApi { +export const list = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.CurrenciesListResponseSchema }, + `/currencies`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies`, + ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), + config + ) +}; +export const paginateCurrencyLabels = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, + `/currencies/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getCurrencyById = (isoCode: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies/${isoCode}`, + config + ) +}; +export const updateCurrency = (isoCode: string, data: CurrenciesModels.UpdateCurrencyRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies/${isoCode}`, + ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), + config + ) +}; +export const paginateCurrencyLabelsByOffice = (officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, + `/offices/${officeId}/currencies/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/full/currencies/currencies.configs.ts b/test/generated/full/currencies/currencies.configs.ts new file mode 100644 index 0000000..6d36fb1 --- /dev/null +++ b/test/generated/full/currencies/currencies.configs.ts @@ -0,0 +1,153 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CurrenciesModels } from "./currencies.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CurrenciesQueries } from "./currencies.queries"; +import { CurrenciesAcl } from "./currencies.acl"; + +export namespace CurrenciesConfigs { +export const currenciesConfig = { + meta: { + title: "Currencies", + }, + readAll: { + acl: CurrenciesAcl.canUseList, + schema: CurrenciesModels.CurrencyResponseDtoSchema, + paginated: CurrenciesQueries.useList, + infinite: CurrenciesQueries.useListInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CurrenciesModels.CurrencyResponseDtoSchema, + options: { + columns: { + isoCode: true, + name: true, + symbol: true, + alignment: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CurrenciesModels.CurrenciesListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: CurrenciesAcl.canUseGetCurrencyById, + schema: CurrenciesModels.CurrencyResponseDtoSchema, + query: CurrenciesQueries.useGetCurrencyById, + }, + create: { + acl: CurrenciesAcl.canUseCreateCurrency, + schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, + mutation: CurrenciesQueries.useCreateCurrency, + inputDefs: dynamicInputs({ + schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, + options: { + inputs: { + isoCode: true, + name: true, + symbol: true, + alignment: true, + }, + }, +}) + }, + update: { + acl: CurrenciesAcl.canUseUpdateCurrency, + schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, + mutation: CurrenciesQueries.useUpdateCurrency, + inputDefs: dynamicInputs({ + schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CurrenciesAcl.canUsePaginateCurrencyLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CurrenciesQueries.usePaginateCurrencyLabels, + infinite: CurrenciesQueries.usePaginateCurrencyLabelsInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +export const labelsPaginateConfig = { + meta: { + title: "Labels Paginate", + }, + readAll: { + acl: CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CurrenciesQueries.usePaginateCurrencyLabelsByOffice, + infinite: CurrenciesQueries.usePaginateCurrencyLabelsByOfficeInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/currencies/currencies.models.ts b/test/generated/full/currencies/currencies.models.ts new file mode 100644 index 0000000..560fc3c --- /dev/null +++ b/test/generated/full/currencies/currencies.models.ts @@ -0,0 +1,122 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CurrenciesModels { +/** + * CurrencyEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CurrencyEmployeeDTO = z.infer; + +/** + * CurrencyResponseDtoSchema + * @type { object } + * @property { string } isoCode isoCode of the currency + * @property { string } name Name of the currency + * @property { string } symbol Symbol of the currency + * @property { string } alignment Alignment of the currency + * @property { string } createdById ID of the employee who created this currency + * @property { CurrencyEmployeeDTO } createdBy Employee who created this currency + * @property { string } createdAt Date when the currency was created + * @property { string } updatedById ID of the employee who last updated this currency + * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency + * @property { string } updatedAt Date when the currency was last updated + */ +export const CurrencyResponseDtoSchema = z.object({ isoCode: z.string().describe("isoCode of the currency"), name: z.string().describe("Name of the currency"), symbol: z.string().describe("Symbol of the currency").nullish(), alignment: z.string().describe("Alignment of the currency").nullish(), createdById: z.string().describe("ID of the employee who created this currency").nullish(), createdBy: CurrencyEmployeeDTOSchema.describe("Employee who created this currency").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Date when the currency was created"), updatedById: z.string().describe("ID of the employee who last updated this currency").nullish(), updatedBy: CurrencyEmployeeDTOSchema.describe("Employee who last updated this currency").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Date when the currency was last updated") }).readonly(); +export type CurrencyResponseDto = z.infer; + +/** + * CurrencyPaginationFilterDtoSchema + * @type { object } + * @property { string } officeId + * @property { string } search + */ +export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string(), search: z.string() }).readonly(); +export type CurrencyPaginationFilterDto = z.infer; + +/** + * CreateCurrencyRequestDTOSchema + * @type { object } + * @property { string } isoCode Unique identifier for the currency + * @property { string } name Name of the currency + * @property { string } symbol Symbol of the currency + * @property { string } alignment Alignment of the currency + */ +export const CreateCurrencyRequestDTOSchema = z.object({ isoCode: z.string().describe("Unique identifier for the currency"), name: z.string().describe("Name of the currency"), symbol: z.string().describe("Symbol of the currency"), alignment: z.string().describe("Alignment of the currency") }).readonly(); +export type CreateCurrencyRequestDTO = z.infer; + +/** + * UpdateCurrencyRequestDTOSchema + * @type { object } + * @property { string } name Name of the currency + */ +export const UpdateCurrencyRequestDTOSchema = z.object({ name: z.string().describe("Name of the currency") }).readonly(); +export type UpdateCurrencyRequestDTO = z.infer; + +/** + * CurrenciesListOrderParamEnumSchema + * @type { enum } + */ +export const CurrenciesListOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type CurrenciesListOrderParamEnum = z.infer; +export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.enum; + +/** + * CurrenciesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CurrencyResponseDto[] } items + */ +export const CurrenciesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CurrencyResponseDtoSchema).readonly() }).readonly().shape }); +export type CurrenciesListResponse = z.infer; + +/** + * PaginateCurrencyLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateCurrencyLabelsOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateCurrencyLabelsOrderParamEnum = z.infer; +export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderParamEnumSchema.enum; + +/** + * PaginateCurrencyLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateCurrencyLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PaginateCurrencyLabelsResponse = z.infer; + +/** + * PaginateCurrencyLabelsByOfficeOrderParamEnumSchema + * @type { enum } + */ +export const PaginateCurrencyLabelsByOfficeOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateCurrencyLabelsByOfficeOrderParamEnum = z.infer; +export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabelsByOfficeOrderParamEnumSchema.enum; + +/** + * PaginateCurrencyLabelsByOfficeResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PaginateCurrencyLabelsByOfficeResponse = z.infer; + +} diff --git a/test/generated/full/currencies/currencies.queries.ts b/test/generated/full/currencies/currencies.queries.ts new file mode 100644 index 0000000..ba31720 --- /dev/null +++ b/test/generated/full/currencies/currencies.queries.ts @@ -0,0 +1,268 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CurrenciesAcl } from "./currencies.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CurrenciesModels } from "./currencies.models"; +import { CurrenciesApi } from "./currencies.api"; + +export namespace CurrenciesQueries { +export const moduleName = QueryModule.Currencies; + +export const keys = { + all: [moduleName] as const, + list: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies", "infinite", limit, order, filter, cursor] as const, + paginateCurrencyLabels: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies/labels/paginate", limit, order, filter, page, cursor] as const, + paginateCurrencyLabelsInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies/labels/paginate", "infinite", limit, order, filter, cursor] as const, + getCurrencyById: (isoCode: string) => [...keys.all, "/currencies/:isoCode", isoCode] as const, + paginateCurrencyLabelsByOffice: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", officeId, limit, order, filter, page, cursor] as const, + paginateCurrencyLabelsByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, +}; + +/** + * Query `useList` + * @summary List Currencies + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUseList()); + return CurrenciesApi.list(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List Currencies + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUseList()); + return CurrenciesApi.list(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreateCurrency` + * @summary Create Currency + * @permission Requires `canUseCreateCurrency` ability + * @param { CurrenciesModels.CreateCurrencyRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateCurrency = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CurrenciesAcl.canUseCreateCurrency()); + return CurrenciesApi.createCurrency(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateCurrencyLabels` + * @summary Paginate Currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateCurrencyLabelsInfinite + * @summary Paginate Currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetCurrencyById` + * @summary Get Currency by iso code + * @permission Requires `canUseGetCurrencyById` ability + * @param { string } object.isoCode Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCurrencyById = ({ isoCode }: { isoCode: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCurrencyById(isoCode), + queryFn: () => { + checkAcl(CurrenciesAcl.canUseGetCurrencyById()); + return CurrenciesApi.getCurrencyById(isoCode, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCurrency` + * @summary Update Currency + * @permission Requires `canUseUpdateCurrency` ability + * @param { string } mutation.isoCode Path parameter + * @param { CurrenciesModels.UpdateCurrencyRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCurrency = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ isoCode, data }) => { + checkAcl(CurrenciesAcl.canUseUpdateCurrency()); + return CurrenciesApi.updateCurrency(isoCode, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { isoCode } = variables; + const updateKeys = [keys.getCurrencyById(isoCode)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateCurrencyLabelsByOffice` + * @summary Paginate office currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabelsByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateCurrencyLabelsByOfficeInfinite + * @summary Paginate office currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabelsByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/full/customerAccount/customerAccount.api.ts b/test/generated/full/customerAccount/customerAccount.api.ts new file mode 100644 index 0000000..360b9b1 --- /dev/null +++ b/test/generated/full/customerAccount/customerAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { CustomerAccountModels } from "./customerAccount.models"; + +export namespace CustomerAccountApi { +export const get = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, + `/customers/account`, + config + ) +}; +} diff --git a/test/generated/full/customerAccount/customerAccount.models.ts b/test/generated/full/customerAccount/customerAccount.models.ts new file mode 100644 index 0000000..4e0da5a --- /dev/null +++ b/test/generated/full/customerAccount/customerAccount.models.ts @@ -0,0 +1,37 @@ +import { z } from "zod"; + +export namespace CustomerAccountModels { +/** + * CustomerCompanyDtoSchema + * @type { object } + * @property { string } id Company ID + * @property { string } name Company name + */ +export const CustomerCompanyDtoSchema = z.object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name").nullish() }).readonly(); +export type CustomerCompanyDto = z.infer; + +/** + * CustomerBusinessPartnerDtoSchema + * @type { object } + * @property { string } id Company ID + * @property { string } name Company name + */ +export const CustomerBusinessPartnerDtoSchema = z.object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name") }).readonly(); +export type CustomerBusinessPartnerDto = z.infer; + +/** + * CustomerAccountDtoSchema + * @type { object } + * @property { array[] } aclRules Can hold any type of value + * @property { string } id Customer ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { CustomerCompanyDto } company Company + * @property { CustomerBusinessPartnerDto } businessPartner + */ +export const CustomerAccountDtoSchema = z.object({ aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), id: z.string().describe("Customer ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), company: CustomerCompanyDtoSchema.describe("Company").nullish(), businessPartner: CustomerBusinessPartnerDtoSchema.nullish() }).readonly(); +export type CustomerAccountDto = z.infer; + +} diff --git a/test/generated/full/customerAccount/customerAccount.queries.ts b/test/generated/full/customerAccount/customerAccount.queries.ts new file mode 100644 index 0000000..38f8624 --- /dev/null +++ b/test/generated/full/customerAccount/customerAccount.queries.ts @@ -0,0 +1,32 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { CustomerAccountApi } from "./customerAccount.api"; + +export namespace CustomerAccountQueries { +export const moduleName = QueryModule.CustomerAccount; + +export const keys = { + all: [moduleName] as const, + get: () => [...keys.all, "/customers/account", ] as const, +}; + +/** + * Query `useGet` + * @summary Get profile of logged-in user + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.get(), + queryFn: () => + CustomerAccountApi.get(config), + ...options, + }); +}; + +} diff --git a/test/generated/full/customers/customers.acl.ts b/test/generated/full/customers/customers.acl.ts new file mode 100644 index 0000000..bb972e0 --- /dev/null +++ b/test/generated/full/customers/customers.acl.ts @@ -0,0 +1,66 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CustomersAcl { +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Customer" +] as AbilityTuple<"Create", "Customer">; + +/** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( +) => [ + "Read", + "Customer" +] as AbilityTuple<"Read", "Customer">; + +/** + * Use for `useFindById` query ability. + * @description Read a customer with id + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Customer" +] as AbilityTuple<"Read", "Customer">; + +/** + * Use for `useUpdate` mutation ability. + * @description Update Customer + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Customer" +] as AbilityTuple<"Update", "Customer">; + +/** + * Use for `useDeactivate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeactivate` mutation + */ +export const canUseDeactivate = ( +) => [ + "Deactivate", + "Customer" +] as AbilityTuple<"Deactivate", "Customer">; + +/** + * Use for `useReactivate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReactivate` mutation + */ +export const canUseReactivate = ( +) => [ + "Reactivate", + "Customer" +] as AbilityTuple<"Reactivate", "Customer">; + +} diff --git a/test/generated/full/customers/customers.api.ts b/test/generated/full/customers/customers.api.ts new file mode 100644 index 0000000..0f87f69 --- /dev/null +++ b/test/generated/full/customers/customers.api.ts @@ -0,0 +1,70 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CustomersModels } from "./customers.models"; + +export namespace CustomersApi { +export const findProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, + `/customers/me`, + config + ) +}; +export const create = (data: CustomersModels.CreateCustomerDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers`, + ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), + config + ) +}; +export const list = (limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomersModels.CustomersListResponseSchema }, + `/customers`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (customerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${customerId}`, + config + ) +}; +export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${customerId}`, + ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), + config + ) +}; +export const deactivate = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${id}/deactivate`, + undefined, + config + ) +}; +export const reactivate = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${id}/reactivate`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/customers/customers.configs.ts b/test/generated/full/customers/customers.configs.ts new file mode 100644 index 0000000..95eec1d --- /dev/null +++ b/test/generated/full/customers/customers.configs.ts @@ -0,0 +1,92 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CustomersModels } from "./customers.models"; +import { CustomersQueries } from "./customers.queries"; +import { CustomersAcl } from "./customers.acl"; + +export namespace CustomersConfigs { +export const customersConfig = { + meta: { + title: "Customers", + }, + readAll: { + acl: CustomersAcl.canUseList, + schema: CustomersModels.CustomerListItemDTOSchema, + paginated: CustomersQueries.useList, + infinite: CustomersQueries.useListInfinite, + filters: { + schema: CustomersModels.CustomerPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CustomersModels.CustomerPaginationFilterDtoSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + companyId: true, + businessPartnerId: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CustomersModels.CustomerListItemDTOSchema, + options: { + columns: { + id: true, + firstName: true, + lastName: true, + email: true, + phone: true, + companyId: true, + businessPartnerId: true, + businessPartner: true, + }, + sortable: CustomersModels.CustomersListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: CustomersAcl.canUseFindById, + schema: CustomersModels.CustomerResponseDTOSchema, + query: CustomersQueries.useFindById, + }, + create: { + acl: CustomersAcl.canUseCreate, + schema: CustomersModels.CreateCustomerDTOSchema, + mutation: CustomersQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CustomersModels.CreateCustomerDTOSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + phone: true, + companyId: true, + businessPartnerId: true, + }, + }, +}) + }, + update: { + acl: CustomersAcl.canUseUpdate, + schema: CustomersModels.UpdateCustomerDTOSchema, + mutation: CustomersQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CustomersModels.UpdateCustomerDTOSchema, + options: { + inputs: { + firstName: true, + lastName: true, + phone: true, + companyId: true, + businessPartnerId: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/full/customers/customers.models.ts b/test/generated/full/customers/customers.models.ts new file mode 100644 index 0000000..e12d751 --- /dev/null +++ b/test/generated/full/customers/customers.models.ts @@ -0,0 +1,137 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CustomersModels { +/** + * CustomerProfileBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CustomerProfileBusinessPartnerDto = z.infer; + +/** + * CustomerProfileResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + * @property { CustomerProfileBusinessPartnerDto } businessPartner + */ +export const CustomerProfileResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.email().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), businessPartner: CustomerProfileBusinessPartnerDtoSchema.nullish() }).readonly(); +export type CustomerProfileResponseDTO = z.infer; + +/** + * CustomerBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CustomerBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CustomerBusinessPartnerResponseDto = z.infer; + +/** + * CustomerResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company Id of the customer + * @property { string } businessPartnerId Business partner Id of the customer + * @property { boolean } archived Wether the customer is archived + * @property { CustomerBusinessPartnerResponseDto } businessPartner + */ +export const CustomerResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.email().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company Id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner Id of the customer").nullish(), archived: z.boolean().describe("Wether the customer is archived"), businessPartner: CustomerBusinessPartnerResponseDtoSchema.nullish() }).readonly(); +export type CustomerResponseDTO = z.infer; + +/** + * CustomerListItemBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CustomerListItemBusinessPartnerDto = z.infer; + +/** + * CustomerListItemDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + * @property { CustomerListItemBusinessPartnerDto } businessPartner + */ +export const CustomerListItemDTOSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.string().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), businessPartner: CustomerListItemBusinessPartnerDtoSchema.nullish() }).readonly(); +export type CustomerListItemDTO = z.infer; + +/** + * CreateCustomerDTOSchema + * @type { object } + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + */ +export const CreateCustomerDTOSchema = z.object({ firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.email().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer").nullish(), companyId: z.string().describe("Company id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner id of the customer").nullish() }).readonly(); +export type CreateCustomerDTO = z.infer; + +/** + * CustomerPaginationFilterDtoSchema + * @type { object } + * @property { string } firstName + * @property { string } lastName + * @property { string } email + * @property { string } companyId + * @property { string } businessPartnerId + * @property { string } search + */ +export const CustomerPaginationFilterDtoSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.string(), companyId: z.string(), businessPartnerId: z.string(), search: z.string() }).readonly(); +export type CustomerPaginationFilterDto = z.infer; + +/** + * UpdateCustomerDTOSchema + * @type { object } + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + */ +export const UpdateCustomerDTOSchema = z.object({ firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company id of the customer"), businessPartnerId: z.string().describe("Business partner id of the customer") }).readonly(); +export type UpdateCustomerDTO = z.infer; + +/** + * CustomersListOrderParamEnumSchema + * @type { enum } + */ +export const CustomersListOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "createdAt"]); +export type CustomersListOrderParamEnum = z.infer; +export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enum; + +/** + * CustomersListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CustomerListItemDTO[] } items + */ +export const CustomersListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CustomerListItemDTOSchema).readonly() }).readonly().shape }); +export type CustomersListResponse = z.infer; + +} diff --git a/test/generated/full/customers/customers.queries.ts b/test/generated/full/customers/customers.queries.ts new file mode 100644 index 0000000..44fef2d --- /dev/null +++ b/test/generated/full/customers/customers.queries.ts @@ -0,0 +1,222 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CustomersAcl } from "./customers.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CustomersModels } from "./customers.models"; +import { CustomersApi } from "./customers.api"; + +export namespace CustomersQueries { +export const moduleName = QueryModule.Customers; + +export const keys = { + all: [moduleName] as const, + findProfile: () => [...keys.all, "/customers/me", ] as const, + list: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/customers", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string) => [...keys.all, "/customers", "infinite", limit, order, filter, cursor] as const, + findById: (customerId: string) => [...keys.all, "/customers/:customerId", customerId] as const, +}; + +/** + * Query `useFindProfile` + * @summary Get customer by id + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findProfile(), + queryFn: () => + CustomersApi.findProfile(config), + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create new customer + * @permission Requires `canUseCreate` ability + * @param { CustomersModels.CreateCustomerDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CustomersAcl.canUseCreate()); + return CustomersApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useList` + * @summary List customers + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` + * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CustomersAcl.canUseList()); + return CustomersApi.list(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List customers + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` + * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CustomersAcl.canUseList()); + return CustomersApi.list(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get customer by id + * @permission Requires `canUseFindById` ability + * @param { string } object.customerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ customerId }: { customerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(customerId), + queryFn: () => { + checkAcl(CustomersAcl.canUseFindById()); + return CustomersApi.findById(customerId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update customer + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.customerId Path parameter + * @param { CustomersModels.UpdateCustomerDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ customerId, data }) => { + checkAcl(CustomersAcl.canUseUpdate()); + return CustomersApi.update(customerId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { customerId } = variables; + const updateKeys = [keys.findById(customerId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeactivate` + * @summary Deactivate customer + * @permission Requires `canUseDeactivate` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeactivate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CustomersAcl.canUseDeactivate()); + return CustomersApi.deactivate(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReactivate` + * @summary Reactivate customer + * @permission Requires `canUseReactivate` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReactivate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CustomersAcl.canUseReactivate()); + return CustomersApi.reactivate(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/depots/depots.acl.ts b/test/generated/full/depots/depots.acl.ts new file mode 100644 index 0000000..46e2374 --- /dev/null +++ b/test/generated/full/depots/depots.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace DepotsAcl { +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Depot" +] as AbilityTuple<"Create", "Depot">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Depot" +] as AbilityTuple<"Update", "Depot">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Depot" +] as AbilityTuple<"Archive", "Depot">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "Depot" +] as AbilityTuple<"Archive", "Depot">; + +} diff --git a/test/generated/full/depots/depots.api.ts b/test/generated/full/depots/depots.api.ts new file mode 100644 index 0000000..0bd409f --- /dev/null +++ b/test/generated/full/depots/depots.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DepotsModels } from "./depots.models"; + +export namespace DepotsApi { +export const create = (data: DepotsModels.CreateDepotRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots`, + ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), + config + ) +}; +export const paginate = (limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DepotsModels.DepotsPaginateResponseSchema }, + `/depots`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, + `/depots/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots/${id}`, + config + ) +}; +export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots/${id}`, + ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/depots/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/depots/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/depots/depots.configs.ts b/test/generated/full/depots/depots.configs.ts new file mode 100644 index 0000000..3e95aff --- /dev/null +++ b/test/generated/full/depots/depots.configs.ts @@ -0,0 +1,134 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DepotsModels } from "./depots.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DepotsQueries } from "./depots.queries"; +import { DepotsAcl } from "./depots.acl"; + +export namespace DepotsConfigs { +export const depotsConfig = { + meta: { + title: "Depots", + }, + readAll: { + acl: DepotsAcl.canUsePaginate, + schema: DepotsModels.DepotResponseDTOSchema, + paginated: DepotsQueries.usePaginate, + infinite: DepotsQueries.usePaginateInfinite, + filters: { + schema: DepotsModels.DepotPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DepotsModels.DepotPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DepotsModels.DepotResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + name: true, + shortName: true, + additionalInformation: true, + address: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: DepotsModels.DepotsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: DepotsAcl.canUseFindById, + schema: DepotsModels.DepotResponseDTOSchema, + query: DepotsQueries.useFindById, + }, + create: { + acl: DepotsAcl.canUseCreate, + schema: DepotsModels.CreateDepotRequestDTOSchema, + mutation: DepotsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DepotsModels.CreateDepotRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + additionalInformation: true, + name: true, + street: true, + zip: true, + district: true, + cityId: true, + countryId: true, + }, + }, +}) + }, + update: { + acl: DepotsAcl.canUseUpdate, + schema: DepotsModels.UpdateDepotRequestDTOSchema, + mutation: DepotsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DepotsModels.UpdateDepotRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + additionalInformation: true, + name: true, + street: true, + zip: true, + district: true, + cityId: true, + countryId: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DepotsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DepotsQueries.usePaginateLabels, + infinite: DepotsQueries.usePaginateLabelsInfinite, + filters: { + schema: DepotsModels.DepotLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DepotsModels.DepotLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/depots/depots.models.ts b/test/generated/full/depots/depots.models.ts new file mode 100644 index 0000000..9ee1c5d --- /dev/null +++ b/test/generated/full/depots/depots.models.ts @@ -0,0 +1,157 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DepotsModels { +/** + * DepotCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DepotCityDto = z.infer; + +/** + * DepotCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const DepotCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type DepotCountryDto = z.infer; + +/** + * AddressDTOSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { DepotCityDto } city + * @property { string } district District name + * @property { DepotCountryDto } country + */ +export const AddressDTOSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: DepotCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: DepotCountryDtoSchema.nullish() }).readonly(); +export type AddressDTO = z.infer; + +/** + * DepotEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DepotEmployeeDTO = z.infer; + +/** + * DepotResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the depot + * @property { string } matchCode Match code for the depot + * @property { string } name Name of the depot + * @property { string } shortName Short name of the depot + * @property { string } additionalInformation Additional info of the depot + * @property { AddressDTO } address Address details of the depot + * @property { boolean } archived + * @property { string } createdById + * @property { DepotEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DepotEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const DepotResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the depot"), matchCode: z.string().describe("Match code for the depot"), name: z.string().describe("Name of the depot"), shortName: z.string().describe("Short name of the depot").nullish(), additionalInformation: z.string().describe("Additional info of the depot").nullish(), address: AddressDTOSchema.describe("Address details of the depot"), archived: z.boolean(), createdById: z.string().nullish(), createdBy: DepotEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DepotEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type DepotResponseDTO = z.infer; + +/** + * CreateDepotRequestDTOSchema + * @type { object } + * @property { string } matchCode Unique identifier code for the depot + * @property { string } shortName Optional short name for the depot + * @property { string } additionalInformation + * @property { string } name Full name of the depot + * @property { string } street Street address of the depot + * @property { string } zip ZIP/Postal code + * @property { string } district District information + * @property { string } cityId City id + * @property { string } countryId Country code + */ +export const CreateDepotRequestDTOSchema = z.object({ matchCode: z.string().describe("Unique identifier code for the depot"), shortName: z.string().describe("Optional short name for the depot").nullish(), additionalInformation: z.string().nullish(), name: z.string().describe("Full name of the depot"), street: z.string().describe("Street address of the depot"), zip: z.string().describe("ZIP/Postal code"), district: z.string().describe("District information").nullish(), cityId: z.string().describe("City id"), countryId: z.string().describe("Country code") }).readonly(); +export type CreateDepotRequestDTO = z.infer; + +/** + * DepotPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter depots by name, matchCode, or shortName + * @property { boolean } archived + */ +export const DepotPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter depots by name, matchCode, or shortName"), archived: z.boolean() }).readonly(); +export type DepotPaginationFilterDto = z.infer; + +/** + * DepotLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DepotLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type DepotLabelFilterDto = z.infer; + +/** + * UpdateDepotRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code for the depot + * @property { string } shortName Updated short name + * @property { string } additionalInformation Updated short name + * @property { string } name Updated full name + * @property { string } street Updated street address + * @property { string } zip Updated ZIP/Postal code + * @property { string } district Updated district information + * @property { string } cityId Updated city id + * @property { string } countryId Updated country code + */ +export const UpdateDepotRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code for the depot"), shortName: z.string().describe("Updated short name"), additionalInformation: z.string().describe("Updated short name"), name: z.string().describe("Updated full name"), street: z.string().describe("Updated street address"), zip: z.string().describe("Updated ZIP/Postal code"), district: z.string().describe("Updated district information"), cityId: z.string().describe("Updated city id"), countryId: z.string().describe("Updated country code") }).readonly(); +export type UpdateDepotRequestDTO = z.infer; + +/** + * DepotsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const DepotsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DepotsPaginateOrderParamEnum = z.infer; +export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.enum; + +/** + * DepotsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DepotResponseDTO[] } items + */ +export const DepotsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DepotResponseDTOSchema).readonly() }).readonly().shape }); +export type DepotsPaginateResponse = z.infer; + +/** + * DepotsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DepotsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DepotsPaginateLabelsOrderParamEnum = z.infer; +export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * DepotsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DepotsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type DepotsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/depots/depots.queries.ts b/test/generated/full/depots/depots.queries.ts new file mode 100644 index 0000000..72505fa --- /dev/null +++ b/test/generated/full/depots/depots.queries.ts @@ -0,0 +1,261 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DepotsAcl } from "./depots.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DepotsModels } from "./depots.models"; +import { DepotsApi } from "./depots.api"; + +export namespace DepotsQueries { +export const moduleName = QueryModule.Depots; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string) => [...keys.all, "/depots", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string) => [...keys.all, "/depots/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/depots/:id", id] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a new depot + * @permission Requires `canUseCreate` ability + * @param { DepotsModels.CreateDepotRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(DepotsAcl.canUseCreate()); + return DepotsApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Paginate Depots + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DepotsAcl.canUsePaginate()); + return DepotsApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Depots + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DepotsAcl.canUsePaginate()); + return DepotsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate depots with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DepotsAcl.canUsePaginateLabels()); + return DepotsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate depots with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DepotsAcl.canUsePaginateLabels()); + return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Fetch depot by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(DepotsAcl.canUseFindById()); + return DepotsApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update a depot + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { DepotsModels.UpdateDepotRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(DepotsAcl.canUseUpdate()); + return DepotsApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive a depot + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(DepotsAcl.canUseArchive()); + return DepotsApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive a depot + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(DepotsAcl.canUseUnarchive()); + return DepotsApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/documentTemplates/documentTemplates.acl.ts b/test/generated/full/documentTemplates/documentTemplates.acl.ts new file mode 100644 index 0000000..8996246 --- /dev/null +++ b/test/generated/full/documentTemplates/documentTemplates.acl.ts @@ -0,0 +1,121 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DocumentTemplatesAcl { +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List document template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List document templates + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Create", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get document template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update document template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useAddRemarkBlock` mutation ability. For global ability, omit the object parameter. + * @description Add remark block to document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddRemarkBlock` mutation + */ +export const canUseAddRemarkBlock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useDeleteRemarkBlock` mutation ability. For global ability, omit the object parameter. + * @description Delete remark block from document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemarkBlock` mutation + */ +export const canUseDeleteRemarkBlock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Archive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +} diff --git a/test/generated/full/documentTemplates/documentTemplates.api.ts b/test/generated/full/documentTemplates/documentTemplates.api.ts new file mode 100644 index 0000000..496354d --- /dev/null +++ b/test/generated/full/documentTemplates/documentTemplates.api.ts @@ -0,0 +1,95 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; + +export namespace DocumentTemplatesApi { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/document-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, + `/offices/${officeId}/document-templates`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates`, + ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), + config + ) +}; +export const findById = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}`, + config + ) +}; +export const update = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}`, + ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), + config + ) +}; +export const addRemarkBlock = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, + ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), + config + ) +}; +export const deleteRemarkBlock = (documentTemplateId: string, remarkBlockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, + undefined, + config + ) +}; +export const archive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, + undefined, + config + ) +}; +export const unarchive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/documentTemplates/documentTemplates.configs.ts b/test/generated/full/documentTemplates/documentTemplates.configs.ts new file mode 100644 index 0000000..bb792f1 --- /dev/null +++ b/test/generated/full/documentTemplates/documentTemplates.configs.ts @@ -0,0 +1,119 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DocumentTemplatesQueries } from "./documentTemplates.queries"; +import { DocumentTemplatesAcl } from "./documentTemplates.acl"; + +export namespace DocumentTemplatesConfigs { +export const documentTemplatesConfig = { + meta: { + title: "Document Templates", + }, + readAll: { + acl: DocumentTemplatesAcl.canUseList, + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + paginated: DocumentTemplatesQueries.useList, + infinite: DocumentTemplatesQueries.useListInfinite, + filters: { + schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, + options: { + inputs: { + isArchived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + isArchived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + blocks: true, + }, + sortable: DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: DocumentTemplatesAcl.canUseFindById, + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + query: DocumentTemplatesQueries.useFindById, + }, + create: { + acl: DocumentTemplatesAcl.canUseCreate, + schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, + mutation: DocumentTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + blocks: true, + }, + }, +}) + }, + update: { + acl: DocumentTemplatesAcl.canUseUpdate, + schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, + mutation: DocumentTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + isArchived: true, + blocks: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DocumentTemplatesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DocumentTemplatesQueries.usePaginateLabels, + infinite: DocumentTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/documentTemplates/documentTemplates.models.ts b/test/generated/full/documentTemplates/documentTemplates.models.ts new file mode 100644 index 0000000..6916a75 --- /dev/null +++ b/test/generated/full/documentTemplates/documentTemplates.models.ts @@ -0,0 +1,138 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DocumentTemplatesModels { +/** + * DocumentTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DocumentTemplateEmployeeDTO = z.infer; + +/** + * DocumentTemplateResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name + * @property { boolean } isArchived + * @property { string } createdById ID of the employee who created this template + * @property { DocumentTemplateEmployeeDTO } createdBy Employee who created this template + * @property { string } createdAt + * @property { string } updatedById ID of the employee who last updated this template + * @property { DocumentTemplateEmployeeDTO } updatedBy Employee who last updated this template + * @property { string } updatedAt + * @property { CommonModels.TemplateBlocksResponseDTO } blocks + */ +export const DocumentTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isArchived: z.boolean(), createdById: z.string().describe("ID of the employee who created this template").nullish(), createdBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), updatedBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), updatedAt: z.iso.datetime({ offset: true }), blocks: CommonModels.TemplateBlocksResponseDTOSchema }).readonly(); +export type DocumentTemplateResponseDTO = z.infer; + +/** + * TemplateBlocksDTOSchema + * @type { object } + * @property { CommonModels.TitleBlockDTO } titleBlock + * @property { CommonModels.ReceiverBlockDTO } receiverBlock + * @property { CommonModels.OurInformationBlockDTO } ourInformationBlock + * @property { CommonModels.RouteTableBlockDTO } routeTableBlock + * @property { CommonModels.CargoTableBlockDTO } cargoTableBlock + * @property { CommonModels.CargoSummaryBlockDTO } cargoSummaryBlock + * @property { CommonModels.FinanceTableBlockDTO } financeTableBlock + * @property { CommonModels.RemarkBlockDTO[] } remarkBlocks + * @property { CommonModels.FooterBlockDTO } footerBlock + * @property { CommonModels.TermsBlockDTO } termsBlock + * @property { CommonModels.CutOffDatesBlockDTO } cutOffDatesBlock + */ +export const TemplateBlocksDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); +export type TemplateBlocksDTO = z.infer; + +/** + * CreateDocumentTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { TemplateBlocksDTO } blocks + */ +export const CreateDocumentTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), blocks: TemplateBlocksDTOSchema.nullish() }).readonly(); +export type CreateDocumentTemplateRequestDTO = z.infer; + +/** + * UpdateDocumentTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { boolean } isArchived + * @property { TemplateBlocksDTO } blocks + */ +export const UpdateDocumentTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), isArchived: z.boolean(), blocks: TemplateBlocksDTOSchema }).readonly(); +export type UpdateDocumentTemplateRequestDTO = z.infer; + +/** + * CreateRemarkBlockRequestDTOSchema + * @type { object } + * @property { CommonModels.EditorContentUpdateDto } content + * @property { number } position 1-based position of the remark block. Minimum: `1` + * @property { boolean } enabled + */ +export const CreateRemarkBlockRequestDTOSchema = z.object({ content: CommonModels.EditorContentUpdateDtoSchema, position: z.number().gte(1).describe("1-based position of the remark block").nullish(), enabled: z.boolean().nullish() }).readonly(); +export type CreateRemarkBlockRequestDTO = z.infer; + +/** + * DocumentTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DocumentTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type DocumentTemplateLabelFilterDto = z.infer; + +/** + * DocumentTemplateFilterDtoSchema + * @type { object } + * @property { boolean } isArchived + * @property { string } search + */ +export const DocumentTemplateFilterDtoSchema = z.object({ isArchived: z.boolean(), search: z.string() }).readonly(); +export type DocumentTemplateFilterDto = z.infer; + +/** + * DocumentTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DocumentTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DocumentTemplatesPaginateLabelsOrderParamEnum = z.infer; +export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * DocumentTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type DocumentTemplatesPaginateLabelsResponse = z.infer; + +/** + * DocumentTemplatesListOrderParamEnumSchema + * @type { enum } + */ +export const DocumentTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DocumentTemplatesListOrderParamEnum = z.infer; +export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderParamEnumSchema.enum; + +/** + * DocumentTemplatesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DocumentTemplateResponseDTO[] } items + */ +export const DocumentTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).readonly() }).readonly().shape }); +export type DocumentTemplatesListResponse = z.infer; + +} diff --git a/test/generated/full/documentTemplates/documentTemplates.queries.ts b/test/generated/full/documentTemplates/documentTemplates.queries.ts new file mode 100644 index 0000000..6d6f164 --- /dev/null +++ b/test/generated/full/documentTemplates/documentTemplates.queries.ts @@ -0,0 +1,334 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DocumentTemplatesAcl } from "./documentTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; +import { DocumentTemplatesApi } from "./documentTemplates.api"; + +export namespace DocumentTemplatesQueries { +export const moduleName = QueryModule.DocumentTemplates; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (documentTemplateId: string, officeId: string) => [...keys.all, "/offices/:officeId/document-templates/:documentTemplateId", documentTemplateId, officeId] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate document template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate document template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useList` + * @summary List document templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); + return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List document templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); + return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new document template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId } )); + return DocumentTemplatesApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get document template by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.documentTemplateId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ documentTemplateId, officeId }: { documentTemplateId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(documentTemplateId, officeId), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId } )); + return DocumentTemplatesApi.findById(documentTemplateId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update document template by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId } )); + return DocumentTemplatesApi.update(documentTemplateId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useAddRemarkBlock` + * @summary Add a remark block to a document template + * @permission Requires `canUseAddRemarkBlock` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.CreateRemarkBlockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useAddRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId } )); + return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRemarkBlock` + * @summary Delete a remark block from a document template + * @permission Requires `canUseDeleteRemarkBlock` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.remarkBlockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId } )); + return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive document template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId } )); + return DocumentTemplatesApi.archive(documentTemplateId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive document template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId } )); + return DocumentTemplatesApi.unarchive(documentTemplateId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/dunningAccountStatement/dunningAccountStatement.acl.ts b/test/generated/full/dunningAccountStatement/dunningAccountStatement.acl.ts new file mode 100644 index 0000000..dc538a3 --- /dev/null +++ b/test/generated/full/dunningAccountStatement/dunningAccountStatement.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningAccountStatementAcl { +/** + * Use for `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation ability. For global ability, omit the object parameter. + * @description Generate account statement + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation + */ +export const canUseGenerateAccountStatement = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetAccountStatementEml` mutation ability. For global ability, omit the object parameter. + * @description Download account statement as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAccountStatementEml` mutation + */ +export const canUseGetAccountStatementEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +} diff --git a/test/generated/full/dunningAccountStatement/dunningAccountStatement.api.ts b/test/generated/full/dunningAccountStatement/dunningAccountStatement.api.ts new file mode 100644 index 0000000..a351427 --- /dev/null +++ b/test/generated/full/dunningAccountStatement/dunningAccountStatement.api.ts @@ -0,0 +1,52 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningAccountStatementApi { +export const dataGenFake = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, + `/data-gen-fake/account-statement`, + config + ) +}; +export const generateAccountStatement = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/account-statement`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getAccountStatementEml = (officeId: string, data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/account-statement/eml`, + ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/full/dunningAccountStatement/dunningAccountStatement.models.ts b/test/generated/full/dunningAccountStatement/dunningAccountStatement.models.ts new file mode 100644 index 0000000..40e5f92 --- /dev/null +++ b/test/generated/full/dunningAccountStatement/dunningAccountStatement.models.ts @@ -0,0 +1,83 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningAccountStatementModels { +/** + * AccountStatementPdfPayloadInvoiceDtoSchema + * @type { object } + * @property { string } number + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } dueDays + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + */ +export const AccountStatementPdfPayloadInvoiceDtoSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }), dueDays: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string() }).readonly(); +export type AccountStatementPdfPayloadInvoiceDto = z.infer; + +/** + * AccountStatementInvoicesByCurrencyAndDirectionDtoSchema + * @type { object } + * @property { string } direction + * @property { string } currency + * @property { AccountStatementPdfPayloadInvoiceDto[] } invoices + * @property { number } totalOutstandingAmount + */ +export const AccountStatementInvoicesByCurrencyAndDirectionDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema, currency: z.string(), invoices: z.array(AccountStatementPdfPayloadInvoiceDtoSchema).readonly(), totalOutstandingAmount: z.number() }).readonly(); +export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer; + +/** + * AccountStatementPdfPayloadBusinessPartnerDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + * @property { string } referenceNumber + */ +export const AccountStatementPdfPayloadBusinessPartnerDtoSchema = z.object({ name: z.string(), address: z.string().nullish(), referenceNumber: z.string().nullish() }).readonly(); +export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer; + +/** + * AccountStatementPdfPayloadBankAccountDtoSchema + * @type { object } + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + */ +export const AccountStatementPdfPayloadBankAccountDtoSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }).readonly(); +export type AccountStatementPdfPayloadBankAccountDto = z.infer; + +/** + * AccountStatementPdfPayloadDTOSchema + * @type { object } + * @property { AccountStatementPdfPayloadBusinessPartnerDto } businessPartner + * @property { AccountStatementInvoicesByCurrencyAndDirectionDto[] } invoicesByCurrencyAndDirection + * @property { AccountStatementPdfPayloadBankAccountDto } bankAccount + * @property { string } employeeName + * @property { CommonModels.ConfigBlockDto } config + */ +export const AccountStatementPdfPayloadDTOSchema = z.object({ businessPartner: AccountStatementPdfPayloadBusinessPartnerDtoSchema, invoicesByCurrencyAndDirection: z.array(AccountStatementInvoicesByCurrencyAndDirectionDtoSchema).readonly(), bankAccount: AccountStatementPdfPayloadBankAccountDtoSchema, employeeName: z.string().nullable(), config: CommonModels.ConfigBlockDtoSchema }).readonly(); +export type AccountStatementPdfPayloadDTO = z.infer; + +/** + * OfficeInvoiceListQueryDtoSchema + * @type { object } + * @property { string } order Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @property { CommonModels.OfficeInvoiceFilterDto } filter + * @property { number } limit Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + */ +export const OfficeInvoiceListQueryDtoSchema = z.object({ order: z.string().describe("Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId").nullish(), filter: CommonModels.OfficeInvoiceFilterDtoSchema.nullish(), limit: z.number().gte(1).lte(100).describe("Items per response").default(20), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish() }).readonly(); +export type OfficeInvoiceListQueryDto = z.infer; + +/** + * GenerateAccountStatementOrderParamEnumSchema + * @type { enum } + */ +export const GenerateAccountStatementOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); +export type GenerateAccountStatementOrderParamEnum = z.infer; +export const GenerateAccountStatementOrderParamEnum = GenerateAccountStatementOrderParamEnumSchema.enum; + +} diff --git a/test/generated/full/dunningAccountStatement/dunningAccountStatement.queries.ts b/test/generated/full/dunningAccountStatement/dunningAccountStatement.queries.ts new file mode 100644 index 0000000..6c56860 --- /dev/null +++ b/test/generated/full/dunningAccountStatement/dunningAccountStatement.queries.ts @@ -0,0 +1,156 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningAccountStatementAcl } from "./dunningAccountStatement.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; +import { DunningAccountStatementApi } from "./dunningAccountStatement.api"; + +export namespace DunningAccountStatementQueries { +export const moduleName = QueryModule.DunningAccountStatement; + +export const keys = { + all: [moduleName] as const, + dataGenFake: () => [...keys.all, "/data-gen-fake/account-statement", ] as const, + generateAccountStatement: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", officeId, limit, order, filter, page, cursor] as const, + generateAccountStatementInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", "infinite", officeId, limit, order, filter, cursor] as const, +}; + +/** + * Query `useDataGenFake` + * @summary Expose account statement PDF payload DTO for model generation + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useDataGenFake = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.dataGenFake(), + queryFn: () => + DunningAccountStatementApi.dataGenFake(config), + ...options, + }); +}; + +/** + * Query `useGenerateAccountStatement` - recommended when file should be cached + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGenerateAccountStatement = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Mutation `useGenerateAccountStatementMutation` - recommended when file should not be cached + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } mutation.officeId Path parameter + * @param { number } mutation.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } mutation.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } mutation.filter Query parameter + * @param { number } mutation.page Query parameter. 1-indexed page number to begin from + * @param { string } mutation.cursor Query parameter. ID of item to start after + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateAccountStatementMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, limit } = variables; + const updateKeys = [keys.generateAccountStatement(officeId, limit)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Infinite query `useGenerateAccountStatementInfinite + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGenerateAccountStatementInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useGetAccountStatementEml` - recommended when file should not be cached + * @summary Get account statement as EML file with PDF attachment + * @permission Requires `canUseGetAccountStatementEml` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningAccountStatementModels.OfficeInvoiceListQueryDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGetAccountStatementEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId } )); + return DunningAccountStatementApi.getAccountStatementEml(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/dunningLevels/dunningLevels.acl.ts b/test/generated/full/dunningLevels/dunningLevels.acl.ts new file mode 100644 index 0000000..eb52ae7 --- /dev/null +++ b/test/generated/full/dunningLevels/dunningLevels.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningLevelsAcl { +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List dunning level labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List dunning levels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Create", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get dunning level by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Update", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive a dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Archive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive a dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Unarchive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +} diff --git a/test/generated/full/dunningLevels/dunningLevels.api.ts b/test/generated/full/dunningLevels/dunningLevels.api.ts new file mode 100644 index 0000000..6a93d2f --- /dev/null +++ b/test/generated/full/dunningLevels/dunningLevels.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningLevelsModels } from "./dunningLevels.models"; + +export namespace DunningLevelsApi { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, + `/offices/${officeId}/dunning-levels/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, + `/offices/${officeId}/dunning-levels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: DunningLevelsModels.CreateDunningLevelRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels`, + ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: DunningLevelsModels.UpdateDunningLevelRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}`, + ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/dunningLevels/dunningLevels.configs.ts b/test/generated/full/dunningLevels/dunningLevels.configs.ts new file mode 100644 index 0000000..ddfe0e9 --- /dev/null +++ b/test/generated/full/dunningLevels/dunningLevels.configs.ts @@ -0,0 +1,135 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningLevelsModels } from "./dunningLevels.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningLevelsQueries } from "./dunningLevels.queries"; +import { DunningLevelsAcl } from "./dunningLevels.acl"; + +export namespace DunningLevelsConfigs { +export const dunningLevelsConfig = { + meta: { + title: "Dunning Levels", + }, + readAll: { + acl: DunningLevelsAcl.canUseList, + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + paginated: DunningLevelsQueries.useList, + infinite: DunningLevelsQueries.useListInfinite, + filters: { + schema: DunningLevelsModels.DunningLevelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningLevelsModels.DunningLevelFilterDtoSchema, + options: { + inputs: { + dunningSystemId: true, + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + options: { + columns: { + id: true, + level: true, + daysOverdue: true, + dunningFee: true, + interestRate: true, + usedInOfficeId: true, + usedInOffice: true, + dunningSystem: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + archived: true, + bodyRemarks: true, + footerRemarks: true, + }, + sortable: DunningLevelsModels.DunningLevelsListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: DunningLevelsAcl.canUseFindById, + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + query: DunningLevelsQueries.useFindById, + }, + create: { + acl: DunningLevelsAcl.canUseCreate, + schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, + mutation: DunningLevelsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, + options: { + inputs: { + level: true, + daysOverdue: true, + dunningFee: true, + dunningSystemId: true, + interestRate: true, + bodyRemarks: true, + footerRemarks: true, + }, + }, +}) + }, + update: { + acl: DunningLevelsAcl.canUseUpdate, + schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, + mutation: DunningLevelsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, + options: { + inputs: { + level: true, + daysOverdue: true, + dunningFee: true, + interestRate: true, + dunningSystemId: true, + bodyRemarks: true, + footerRemarks: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DunningLevelsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DunningLevelsQueries.usePaginateLabels, + infinite: DunningLevelsQueries.usePaginateLabelsInfinite, + filters: { + schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/dunningLevels/dunningLevels.models.ts b/test/generated/full/dunningLevels/dunningLevels.models.ts new file mode 100644 index 0000000..ed66cf5 --- /dev/null +++ b/test/generated/full/dunningLevels/dunningLevels.models.ts @@ -0,0 +1,136 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningLevelsModels { +/** + * DunningLevelOfficeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } currencyNotation + */ +export const DunningLevelOfficeDTOSchema = z.object({ id: z.string(), name: z.string(), currencyNotation: z.string() }).readonly(); +export type DunningLevelOfficeDTO = z.infer; + +/** + * DunningLevelEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DunningLevelEmployeeDTO = z.infer; + +/** + * DunningLevelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { number } level + * @property { number } daysOverdue + * @property { number } dunningFee + * @property { number } interestRate + * @property { string } usedInOfficeId + * @property { DunningLevelOfficeDTO } usedInOffice + * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem + * @property { string } createdById + * @property { DunningLevelEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DunningLevelEmployeeDTO } updatedBy + * @property { string } updatedAt + * @property { boolean } archived + * @property { CommonModels.EditorContentResponseDto } bodyRemarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks + */ +export const DunningLevelResponseDTOSchema = z.object({ id: z.string(), level: z.number(), daysOverdue: z.number(), dunningFee: z.number(), interestRate: z.number().nullish(), usedInOfficeId: z.string(), usedInOffice: DunningLevelOfficeDTOSchema.nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), createdById: z.string().nullish(), createdBy: DunningLevelEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningLevelEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), archived: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish() }).readonly(); +export type DunningLevelResponseDTO = z.infer; + +/** + * CreateDunningLevelRequestDTOSchema + * @type { object } + * @property { number } level Dunning level number. Minimum: `1` + * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` + * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` + * @property { string } dunningSystemId Dunning system ID + * @property { number } interestRate Minimum: `0`. Maximum: `100` + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const CreateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1).describe("Dunning level number"), daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), dunningSystemId: z.string().describe("Dunning system ID").nullish(), interestRate: z.number().gte(0).lte(100).nullish(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks").nullish() }).readonly(); +export type CreateDunningLevelRequestDTO = z.infer; + +/** + * UpdateDunningLevelRequestDTOSchema + * @type { object } + * @property { number } level Dunning level number. Minimum: `1` + * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` + * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` + * @property { number } interestRate Minimum: `0`. Maximum: `100` + * @property { string } dunningSystemId Dunning system ID + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1).describe("Dunning level number"), daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), interestRate: z.number().gte(0).lte(100), dunningSystemId: z.string().describe("Dunning system ID"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateDunningLevelRequestDTO = z.infer; + +/** + * DunningLevelLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DunningLevelLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type DunningLevelLabelFilterDto = z.infer; + +/** + * DunningLevelFilterDtoSchema + * @type { object } + * @property { string } dunningSystemId Dunning system ID to filter by + * @property { string } search Search to filter by + * @property { boolean } archived Filter by archived status + */ +export const DunningLevelFilterDtoSchema = z.object({ dunningSystemId: z.string().describe("Dunning system ID to filter by"), search: z.string().describe("Search to filter by"), archived: z.boolean().describe("Filter by archived status") }).readonly(); +export type DunningLevelFilterDto = z.infer; + +/** + * DunningLevelsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DunningLevelsPaginateLabelsOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DunningLevelsPaginateLabelsOrderParamEnum = z.infer; +export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * DunningLevelsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DunningLevelsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type DunningLevelsPaginateLabelsResponse = z.infer; + +/** + * DunningLevelsListOrderParamEnumSchema + * @type { enum } + */ +export const DunningLevelsListOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DunningLevelsListOrderParamEnum = z.infer; +export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSchema.enum; + +/** + * DunningLevelsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningLevelResponseDTO[] } items + */ +export const DunningLevelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningLevelResponseDTOSchema).readonly() }).readonly().shape }); +export type DunningLevelsListResponse = z.infer; + +} diff --git a/test/generated/full/dunningLevels/dunningLevels.queries.ts b/test/generated/full/dunningLevels/dunningLevels.queries.ts new file mode 100644 index 0000000..98ba1a5 --- /dev/null +++ b/test/generated/full/dunningLevels/dunningLevels.queries.ts @@ -0,0 +1,274 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningLevelsAcl } from "./dunningLevels.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningLevelsModels } from "./dunningLevels.models"; +import { DunningLevelsApi } from "./dunningLevels.api"; + +export namespace DunningLevelsQueries { +export const moduleName = QueryModule.DunningLevels; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-levels/:id", id, officeId] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate dunning level labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate dunning level labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useList` + * @summary List dunning levels + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUseList({ officeId } )); + return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List dunning levels + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningLevelsAcl.canUseList({ officeId } )); + return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create dunning level + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningLevelsModels.CreateDunningLevelRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningLevelsAcl.canUseCreate({ officeId } )); + return DunningLevelsApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get dunning level by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUseFindById({ officeId } )); + return DunningLevelsApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update dunning level + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningLevelsModels.UpdateDunningLevelRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(DunningLevelsAcl.canUseUpdate({ officeId } )); + return DunningLevelsApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive a dunning level + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningLevelsAcl.canUseArchive({ officeId } )); + return DunningLevelsApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive a dunning level + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId } )); + return DunningLevelsApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/dunningManagement/dunningManagement.acl.ts b/test/generated/full/dunningManagement/dunningManagement.acl.ts new file mode 100644 index 0000000..251aea8 --- /dev/null +++ b/test/generated/full/dunningManagement/dunningManagement.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningManagementAcl { +/** + * Use for `useListDunnings` query ability. For global ability, omit the object parameter. + * @description List dunnings + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListDunnings` query + */ +export const canUseListDunnings = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Dunning", object) : "Dunning" +] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; + +/** + * Use for `useCreateDunningWithInvoices` mutation ability. For global ability, omit the object parameter. + * @description Create dunning + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDunningWithInvoices` mutation + */ +export const canUseCreateDunningWithInvoices = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Dunning", object) : "Dunning" +] as AbilityTuple<"Create", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; + +/** + * Use for `useGetDunningEml` query or `useGetDunningEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download dunning as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDunningEml` query or `useGetDunningEmlMutation` mutation + */ +export const canUseGetDunningEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Dunning", object) : "Dunning" +] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; + +} diff --git a/test/generated/full/dunningManagement/dunningManagement.api.ts b/test/generated/full/dunningManagement/dunningManagement.api.ts new file mode 100644 index 0000000..7445607 --- /dev/null +++ b/test/generated/full/dunningManagement/dunningManagement.api.ts @@ -0,0 +1,53 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningManagementModels } from "./dunningManagement.models"; + +export namespace DunningManagementApi { +export const listDunnings = (officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningManagementModels.ListDunningsResponseSchema }, + `/offices/${officeId}/dunnings`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createDunningWithInvoices = (partnerId: string, officeId: string, data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningManagementModels.DunningResponseDtoSchema }, + `/offices/${officeId}/partners/${partnerId}/dunnings`, + ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), + config + ) +}; +export const dataGenFake = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, + `/data-gen-fake`, + config + ) +}; +export const getDunningEml = (officeId: string, dunningId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/dunnings/${dunningId}/eml`, + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/full/dunningManagement/dunningManagement.configs.ts b/test/generated/full/dunningManagement/dunningManagement.configs.ts new file mode 100644 index 0000000..6c09ba7 --- /dev/null +++ b/test/generated/full/dunningManagement/dunningManagement.configs.ts @@ -0,0 +1,60 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningManagementModels } from "./dunningManagement.models"; +import { DunningManagementQueries } from "./dunningManagement.queries"; +import { DunningManagementAcl } from "./dunningManagement.acl"; + +export namespace DunningManagementConfigs { +export const dunningsConfig = { + meta: { + title: "Dunnings", + }, + readAll: { + acl: DunningManagementAcl.canUseListDunnings, + schema: DunningManagementModels.DunningResponseDtoSchema, + paginated: DunningManagementQueries.useListDunnings, + infinite: DunningManagementQueries.useListDunningsInfinite, + filters: { + schema: DunningManagementModels.DunningFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningManagementModels.DunningFilterDtoSchema, + options: { + inputs: { + status: true, + partnerId: true, + level: true, + outstandingAmountMin: true, + outstandingAmountMax: true, + createdFrom: true, + createdTo: true, + confirmedBy: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DunningManagementModels.DunningResponseDtoSchema, + options: { + columns: { + id: true, + partner: true, + level: true, + dunningLevelId: true, + status: true, + invoiceCount: true, + outstandingAmount: true, + currencyNotation: true, + daysOverdue: true, + dunningFee: true, + createdAt: true, + statusChangedOn: true, + confirmedBy: true, + documentUrl: true, + }, + sortable: DunningManagementModels.ListDunningsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/dunningManagement/dunningManagement.models.ts b/test/generated/full/dunningManagement/dunningManagement.models.ts new file mode 100644 index 0000000..9ab47ce --- /dev/null +++ b/test/generated/full/dunningManagement/dunningManagement.models.ts @@ -0,0 +1,195 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningManagementModels { +/** + * DunningPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const DunningPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); +export type DunningPartnerDto = z.infer; + +/** + * DunningConfirmedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DunningConfirmedByDto = z.infer; + +/** + * DunningStatusSchema + * @type { enum } + */ +export const DunningStatusSchema = z.enum(["PREPARED", "ISSUED"]); +export type DunningStatus = z.infer; +export const DunningStatus = DunningStatusSchema.enum; + +/** + * DunningResponseDtoSchema + * @type { object } + * @property { string } id + * @property { DunningPartnerDto } partner + * @property { number } level + * @property { string } dunningLevelId + * @property { string } status + * @property { number } invoiceCount + * @property { number } outstandingAmount + * @property { string } currencyNotation + * @property { number } daysOverdue + * @property { number } dunningFee + * @property { string } createdAt + * @property { string } statusChangedOn + * @property { DunningConfirmedByDto } confirmedBy + * @property { string } documentUrl + */ +export const DunningResponseDtoSchema = z.object({ id: z.string(), partner: DunningPartnerDtoSchema, level: z.number(), dunningLevelId: z.string().nullish(), status: DunningStatusSchema, invoiceCount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number(), dunningFee: z.number(), createdAt: z.iso.datetime({ offset: true }), statusChangedOn: z.iso.datetime({ offset: true }), confirmedBy: DunningConfirmedByDtoSchema.nullish(), documentUrl: z.string().nullish() }).readonly(); +export type DunningResponseDto = z.infer; + +/** + * DunningFilterDtoSchema + * @type { object } + * @property { DunningStatus[] } status + * @property { string } partnerId Partner ID to filter by + * @property { array[] } level Dunning level(s) to filter by + * @property { number } outstandingAmountMin Minimum outstanding amount + * @property { number } outstandingAmountMax Maximum outstanding amount + * @property { string } createdFrom Created from (ISO date string) + * @property { string } createdTo Created to (ISO date string) + * @property { string } confirmedBy Confirmed by employee ID + */ +export const DunningFilterDtoSchema = z.object({ status: z.array(DunningStatusSchema).readonly(), partnerId: z.string().describe("Partner ID to filter by"), level: z.array(z.array(z.any()).readonly()).readonly().describe("Dunning level(s) to filter by"), outstandingAmountMin: z.number().describe("Minimum outstanding amount"), outstandingAmountMax: z.number().describe("Maximum outstanding amount"), createdFrom: z.iso.datetime({ offset: true }).describe("Created from (ISO date string)"), createdTo: z.iso.datetime({ offset: true }).describe("Created to (ISO date string)"), confirmedBy: z.string().describe("Confirmed by employee ID") }).readonly(); +export type DunningFilterDto = z.infer; + +/** + * DunningPdfConfigDTOSchema + * @type { object } + * @property { string } headerImageUrl + * @property { string } footerImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ +export const DunningPdfConfigDTOSchema = z.object({ headerImageUrl: z.string(), footerImageUrl: z.string(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); +export type DunningPdfConfigDTO = z.infer; + +/** + * DunningPdfBusinessPartnerDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } address + * @property { string } referenceNumber + */ +export const DunningPdfBusinessPartnerDTOSchema = z.object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }).readonly(); +export type DunningPdfBusinessPartnerDTO = z.infer; + +/** + * DunningPdfInvoiceDTOSchema + * @type { object } + * @property { string } invoiceNumber + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } daysOverdue + * @property { number } dunningLevel + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + * @property { number } interest + */ +export const DunningPdfInvoiceDTOSchema = z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }).nullish(), daysOverdue: z.number(), dunningLevel: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), interest: z.number().nullish() }).readonly(); +export type DunningPdfInvoiceDTO = z.infer; + +/** + * DunningPdfTotalDTOSchema + * @type { object } + * @property { number } invoicesSum + * @property { number } dunningFee + * @property { number } interest + * @property { string } currencyNotation + */ +export const DunningPdfTotalDTOSchema = z.object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }).readonly(); +export type DunningPdfTotalDTO = z.infer; + +/** + * DunningPdfBankAccountDTOSchema + * @type { object } + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + */ +export const DunningPdfBankAccountDTOSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }).readonly(); +export type DunningPdfBankAccountDTO = z.infer; + +/** + * DunningPdfUpcomingInvoiceDTOSchema + * @type { object } + * @property { string } number + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } dueDays + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + */ +export const DunningPdfUpcomingInvoiceDTOSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), dueDays: z.number().nullish(), invoiceAmount: z.number().nullish(), outstandingAmount: z.number().nullish(), currencyNotation: z.string().nullish() }).readonly(); +export type DunningPdfUpcomingInvoiceDTO = z.infer; + +/** + * DunningPdfPayloadDTOSchema + * @type { object } + * @property { string } dunningId + * @property { number } dunningLevel + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { DunningPdfBusinessPartnerDTO } businessPartner + * @property { DunningPdfInvoiceDTO[] } invoices + * @property { DunningPdfTotalDTO } total + * @property { DunningPdfBankAccountDTO } bankAccount + * @property { string } employeeName + * @property { DunningPdfConfigDTO } config + * @property { CommonModels.LanguageEnum } language + * @property { DunningPdfUpcomingInvoiceDTO[] } upcomingInvoices + */ +export const DunningPdfPayloadDTOSchema = z.object({ dunningId: z.string(), dunningLevel: z.number(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), businessPartner: DunningPdfBusinessPartnerDTOSchema, invoices: z.array(DunningPdfInvoiceDTOSchema).readonly(), total: DunningPdfTotalDTOSchema, bankAccount: DunningPdfBankAccountDTOSchema, employeeName: z.string().nullable(), config: DunningPdfConfigDTOSchema, language: CommonModels.LanguageEnumSchema.nullish(), upcomingInvoices: z.array(DunningPdfUpcomingInvoiceDTOSchema).readonly().nullish() }).readonly(); +export type DunningPdfPayloadDTO = z.infer; + +/** + * CreateDunningWithInvoicesRequestDTOSchema + * @type { object } + * @property { string[] } invoiceIds Array of outstanding invoice IDs to include in the dunning. Example: `123e4567-e89b-12d3-a456-426614174000,123e4567-e89b-12d3-a456-426614174001` + * @property { string } dunningLevelId The ID of the dunning level to use for this dunning. Example: `123e4567-e89b-12d3-a456-426614174002` + * @property { number } dunningFee Optional dunning fee to use. If not provided, the fee from the dunning level will be used. Minimum: `0`. Example: `25.5` + * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` + * @property { boolean } includeUpcomingInvoices + */ +export const CreateDunningWithInvoicesRequestDTOSchema = z.object({ invoiceIds: z.array(z.string()).readonly().describe("Array of outstanding invoice IDs to include in the dunning"), dunningLevelId: z.string().describe("The ID of the dunning level to use for this dunning"), dunningFee: z.number().gte(0).describe("Optional dunning fee to use. If not provided, the fee from the dunning level will be used").nullish(), interestRate: z.number().gte(0).lte(100).nullish(), includeUpcomingInvoices: z.boolean().nullish() }).readonly(); +export type CreateDunningWithInvoicesRequestDTO = z.infer; + +/** + * ListDunningsOrderParamEnumSchema + * @type { enum } + */ +export const ListDunningsOrderParamEnumSchema = z.enum(["createdAt", "level", "outstandingAmount", "statusChangedOn"]); +export type ListDunningsOrderParamEnum = z.infer; +export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; + +/** + * ListDunningsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningResponseDto[] } items + */ +export const ListDunningsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningResponseDtoSchema).readonly() }).readonly().shape }); +export type ListDunningsResponse = z.infer; + +} diff --git a/test/generated/full/dunningManagement/dunningManagement.queries.ts b/test/generated/full/dunningManagement/dunningManagement.queries.ts new file mode 100644 index 0000000..db162c4 --- /dev/null +++ b/test/generated/full/dunningManagement/dunningManagement.queries.ts @@ -0,0 +1,175 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningManagementAcl } from "./dunningManagement.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningManagementModels } from "./dunningManagement.models"; +import { DunningManagementApi } from "./dunningManagement.api"; + +export namespace DunningManagementQueries { +export const moduleName = QueryModule.DunningManagement; + +export const keys = { + all: [moduleName] as const, + listDunnings: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", officeId, limit, order, filter, page, cursor] as const, + listDunningsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", "infinite", officeId, limit, order, filter, cursor] as const, + dataGenFake: () => [...keys.all, "/data-gen-fake", ] as const, + getDunningEml: (officeId: string, dunningId: string) => [...keys.all, "/offices/:officeId/dunnings/:dunningId/eml", officeId, dunningId] as const, +}; + +/** + * Query `useListDunnings` + * @summary List dunnings for an office + * @permission Requires `canUseListDunnings` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` + * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListDunnings = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); + return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListDunningsInfinite + * @summary List dunnings for an office + * @permission Requires `canUseListDunnings` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` + * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListDunningsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); + return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreateDunningWithInvoices` + * @summary Create a dunning with outstanding invoices + * @permission Requires `canUseCreateDunningWithInvoices` ability + * @param { string } mutation.partnerId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningManagementModels.CreateDunningWithInvoicesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateDunningWithInvoices = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ partnerId, officeId, data }) => { + checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId } )); + return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useDataGenFake` + * @summary Expose dunning PDF payload DTO for model generation + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useDataGenFake = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.dataGenFake(), + queryFn: () => + DunningManagementApi.dataGenFake(config), + ...options, + }); +}; + +/** + * Query `useGetDunningEml` - recommended when file should be cached + * @summary Get dunning as EML file with PDF attachment + * @permission Requires `canUseGetDunningEml` ability + * @param { string } object.officeId Path parameter + * @param { string } object.dunningId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetDunningEml = ({ officeId, dunningId }: { officeId: string, dunningId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDunningEml(officeId, dunningId), + queryFn: () => { + checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); + return DunningManagementApi.getDunningEml(officeId, dunningId, config) }, + ...options, + }); +}; + +/** + * Mutation `useGetDunningEmlMutation` - recommended when file should not be cached + * @summary Get dunning as EML file with PDF attachment + * @permission Requires `canUseGetDunningEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.dunningId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetDunningEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, dunningId }) => { + checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); + return DunningManagementApi.getDunningEml(officeId, dunningId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, dunningId } = variables; + const updateKeys = [keys.getDunningEml(officeId, dunningId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts new file mode 100644 index 0000000..4294b32 --- /dev/null +++ b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningPartnerOutstandingInvoicesAcl { +/** + * Use for `useListPartnerOutstandingInvoiceSummaries` query ability. For global ability, omit the object parameter. + * @description List office outstanding invoice summaries per partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoiceSummaries` query + */ +export const canUseListPartnerOutstandingInvoiceSummaries = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useListPartnerOutstandingInvoices` query ability. For global ability, omit the object parameter. + * @description List partner outstanding invoices + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoices` query + */ +export const canUseListPartnerOutstandingInvoices = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useListRecommendedDunningLevels` mutation ability. For global ability, omit the object parameter. + * @description List recommended dunning levels for a partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRecommendedDunningLevels` mutation + */ +export const canUseListRecommendedDunningLevels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +} diff --git a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts new file mode 100644 index 0000000..1b8014c --- /dev/null +++ b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts @@ -0,0 +1,48 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; + +export namespace DunningPartnerOutstandingInvoicesApi { +export const listPartnerOutstandingInvoiceSummaries = (officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, + `/offices/${officeId}/partner-outstanding-invoices`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listPartnerOutstandingInvoices = (partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, + `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listRecommendedDunningLevels = (partnerId: string, officeId: string, data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, + `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, + ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts new file mode 100644 index 0000000..3fc3451 --- /dev/null +++ b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts @@ -0,0 +1,97 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; +import { DunningPartnerOutstandingInvoicesQueries } from "./dunningPartnerOutstandingInvoices.queries"; +import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; + +export namespace DunningPartnerOutstandingInvoicesConfigs { +export const partnerOutstandingInvoicesConfig = { + meta: { + title: "Partner Outstanding Invoices", + }, + readAll: { + acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries, + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, + paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummaries, + infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummariesInfinite, + filters: { + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, + options: { + inputs: { + search: true, + daysOverdueMin: true, + partnerId: true, + outstandingAmountMin: true, + currency: true, + dunningSystemId: true, + lastDunningDate: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, + options: { + columns: { + partnerId: true, + partnerName: true, + partnerCountry: true, + dunningSystemId: true, + dunningSystemName: true, + invoiceCount: true, + daysOverdue: true, + outstandingAmount: true, + currencyNotation: true, + lastDunningDate: true, + }, + sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, + }, +}), + }, +}; + +export const outstandingInvoicesConfig = { + meta: { + title: "Outstanding Invoices", + }, + readAll: { + acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices, + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, + paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoices, + infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoicesInfinite, + filters: { + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, + options: { + inputs: { + partnerId: true, + currency: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, + options: { + columns: { + invoiceId: true, + invoiceNumber: true, + invoiceDate: true, + invoiceAmount: true, + owedAmount: true, + currencyNotation: true, + daysOverdue: true, + dueDate: true, + invoiceInReview: true, + dunningBlock: true, + }, + sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts new file mode 100644 index 0000000..7adfe1f --- /dev/null +++ b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts @@ -0,0 +1,129 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningPartnerOutstandingInvoicesModels { +/** + * PartnerOutstandingInvoiceSummaryFilterDtoSchema + * @type { object } + * @property { string } search Search string (partner name) + * @property { number } daysOverdueMin Minimum days overdue + * @property { string } partnerId Partner ID + * @property { number } outstandingAmountMin Minimum outstanding amount + * @property { string } currency Currency + * @property { string } dunningSystemId Dunning system ID + * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range + */ +export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z.object({ search: z.string().describe("Search string (partner name)"), daysOverdueMin: z.number().describe("Minimum days overdue"), partnerId: z.string().describe("Partner ID"), outstandingAmountMin: z.number().describe("Minimum outstanding amount"), currency: z.string().describe("Currency"), dunningSystemId: z.string().describe("Dunning system ID"), lastDunningDate: CommonModels.DateRangeDtoSchema.describe("Last dunning date range") }).readonly(); +export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer; + +/** + * PartnerOutstandingInvoiceSummaryResponseDtoSchema + * @type { object } + * @property { string } partnerId Business partner ID + * @property { string } partnerName Business partner name + * @property { string } partnerCountry Business partner country + * @property { string } dunningSystemId Dunning system ID + * @property { string } dunningSystemName Dunning system name + * @property { number } invoiceCount Number of outstanding invoices + * @property { number } daysOverdue Maximum days overdue across all partner invoices + * @property { number } outstandingAmount Total outstanding amount + * @property { string } currencyNotation Currency of partner invoices + * @property { string } lastDunningDate Date of the most recent issued dunning document + */ +export const PartnerOutstandingInvoiceSummaryResponseDtoSchema = z.object({ partnerId: z.string().describe("Business partner ID"), partnerName: z.string().describe("Business partner name"), partnerCountry: z.string().describe("Business partner country").nullish(), dunningSystemId: z.string().describe("Dunning system ID"), dunningSystemName: z.string().describe("Dunning system name"), invoiceCount: z.number().describe("Number of outstanding invoices"), daysOverdue: z.number().describe("Maximum days overdue across all partner invoices").nullish(), outstandingAmount: z.number().describe("Total outstanding amount"), currencyNotation: z.string().describe("Currency of partner invoices"), lastDunningDate: z.iso.datetime({ offset: true }).describe("Date of the most recent issued dunning document").nullish() }).readonly(); +export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer; + +/** + * PartnerOutstandingInvoiceResponseDtoSchema + * @type { object } + * @property { string } invoiceId Invoice ID + * @property { string } invoiceNumber Invoice number + * @property { string } invoiceDate Invoice date + * @property { number } invoiceAmount Invoice amount + * @property { number } owedAmount Owed amount + * @property { string } currencyNotation Currency notation + * @property { number } daysOverdue Days overdue + * @property { string } dueDate Due date + * @property { boolean } invoiceInReview + * @property { boolean } dunningBlock + */ +export const PartnerOutstandingInvoiceResponseDtoSchema = z.object({ invoiceId: z.string().describe("Invoice ID"), invoiceNumber: z.string().describe("Invoice number").nullish(), invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date").nullish(), invoiceAmount: z.number().describe("Invoice amount"), owedAmount: z.number().describe("Owed amount"), currencyNotation: z.string().describe("Currency notation"), daysOverdue: z.number().describe("Days overdue").nullish(), dueDate: z.iso.datetime({ offset: true }).describe("Due date").nullish(), invoiceInReview: z.boolean().nullish(), dunningBlock: z.boolean().nullish() }).readonly(); +export type PartnerOutstandingInvoiceResponseDto = z.infer; + +/** + * PartnerOutstandingInvoiceFilterDtoSchema + * @type { object } + * @property { string } partnerId Partner ID to filter by + * @property { string } currency Invoice currency notation to filter by + */ +export const PartnerOutstandingInvoiceFilterDtoSchema = z.object({ partnerId: z.string().describe("Partner ID to filter by"), currency: z.string().describe("Invoice currency notation to filter by") }).readonly(); +export type PartnerOutstandingInvoiceFilterDto = z.infer; + +/** + * RecommendedDunningLevelsRequestDtoSchema + * @type { object } + * @property { string[] } invoiceIds Invoice IDs used to calculate the recommended dunning level. Min Items: `1`. Example: `123e4567-e89b-12d3-a456-426614174000` + */ +export const RecommendedDunningLevelsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).readonly().min(1).describe("Invoice IDs used to calculate the recommended dunning level") }).readonly(); +export type RecommendedDunningLevelsRequestDto = z.infer; + +/** + * RecommendedLabelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { boolean } isRecommended + */ +export const RecommendedLabelResponseDtoSchema = z.object({ id: z.string(), label: z.string(), isRecommended: z.boolean() }).readonly(); +export type RecommendedLabelResponseDto = z.infer; + +/** + * ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema + * @type { enum } + */ +export const ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema = z.enum(["outstandingAmount", "daysOverdue", "lastDunningDate", "invoiceCount", "partnerCountry", "partnerName", "dunningSystemName"]); +export type ListPartnerOutstandingInvoiceSummariesOrderParamEnum = z.infer; +export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema.enum; + +/** + * ListPartnerOutstandingInvoiceSummariesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items + */ +export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).readonly() }).readonly().shape }); +export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer; + +/** + * ListPartnerOutstandingInvoicesOrderParamEnumSchema + * @type { enum } + */ +export const ListPartnerOutstandingInvoicesOrderParamEnumSchema = z.enum(["dueDate", "invoiceDate", "owedAmount"]); +export type ListPartnerOutstandingInvoicesOrderParamEnum = z.infer; +export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandingInvoicesOrderParamEnumSchema.enum; + +/** + * ListPartnerOutstandingInvoicesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerOutstandingInvoiceResponseDto[] } items + */ +export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).readonly() }).readonly().shape }); +export type ListPartnerOutstandingInvoicesResponse = z.infer; + +/** + * ListRecommendedDunningLevelsResponseSchema + * @type { array } + */ +export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema).readonly(); +export type ListRecommendedDunningLevelsResponse = z.infer; + +} diff --git a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts new file mode 100644 index 0000000..4a777fa --- /dev/null +++ b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts @@ -0,0 +1,166 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; +import { DunningPartnerOutstandingInvoicesApi } from "./dunningPartnerOutstandingInvoices.api"; + +export namespace DunningPartnerOutstandingInvoicesQueries { +export const moduleName = QueryModule.DunningPartnerOutstandingInvoices; + +export const keys = { + all: [moduleName] as const, + listPartnerOutstandingInvoiceSummaries: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", officeId, limit, order, filter, page, cursor] as const, + listPartnerOutstandingInvoiceSummariesInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", "infinite", officeId, limit, order, filter, cursor] as const, + listPartnerOutstandingInvoices: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", partnerId, officeId, limit, order, filter, page, cursor] as const, + listPartnerOutstandingInvoicesInfinite: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", "infinite", partnerId, officeId, limit, order, filter, cursor] as const, +}; + +/** + * Query `useListPartnerOutstandingInvoiceSummaries` + * @summary List office outstanding invoice summaries per partner + * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoiceSummaries = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListPartnerOutstandingInvoiceSummariesInfinite + * @summary List office outstanding invoice summaries per partner + * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoiceSummariesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useListPartnerOutstandingInvoices` + * @summary List outstanding invoices for a specific partner + * @permission Requires `canUseListPartnerOutstandingInvoices` ability + * @param { string } object.partnerId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoices = ({ partnerId, officeId, limit, order, filter, page, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListPartnerOutstandingInvoicesInfinite + * @summary List outstanding invoices for a specific partner + * @permission Requires `canUseListPartnerOutstandingInvoices` ability + * @param { string } object.partnerId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoicesInfinite = ({ partnerId, officeId, limit, order, filter, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useListRecommendedDunningLevels` + * @summary List recommended dunning levels for a partner + * @permission Requires `canUseListRecommendedDunningLevels` ability + * @param { string } mutation.partnerId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useListRecommendedDunningLevels = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ partnerId, officeId, data }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/dunningSystems/dunningSystems.acl.ts b/test/generated/full/dunningSystems/dunningSystems.acl.ts new file mode 100644 index 0000000..14c8307 --- /dev/null +++ b/test/generated/full/dunningSystems/dunningSystems.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningSystemsAcl { +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List dunning system labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List dunning systems + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Create", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get dunning system by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Update", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +} diff --git a/test/generated/full/dunningSystems/dunningSystems.api.ts b/test/generated/full/dunningSystems/dunningSystems.api.ts new file mode 100644 index 0000000..2b609b0 --- /dev/null +++ b/test/generated/full/dunningSystems/dunningSystems.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningSystemsModels } from "./dunningSystems.models"; + +export namespace DunningSystemsApi { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, + `/offices/${officeId}/dunning-systems/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, + `/offices/${officeId}/dunning-systems`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: DunningSystemsModels.CreateDunningSystemRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems`, + ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: DunningSystemsModels.UpdateDunningSystemRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}`, + ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/dunningSystems/dunningSystems.configs.ts b/test/generated/full/dunningSystems/dunningSystems.configs.ts new file mode 100644 index 0000000..9040265 --- /dev/null +++ b/test/generated/full/dunningSystems/dunningSystems.configs.ts @@ -0,0 +1,120 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningSystemsModels } from "./dunningSystems.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningSystemsQueries } from "./dunningSystems.queries"; +import { DunningSystemsAcl } from "./dunningSystems.acl"; + +export namespace DunningSystemsConfigs { +export const dunningSystemsConfig = { + meta: { + title: "Dunning Systems", + }, + readAll: { + acl: DunningSystemsAcl.canUsePaginate, + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + paginated: DunningSystemsQueries.usePaginate, + infinite: DunningSystemsQueries.usePaginateInfinite, + filters: { + schema: DunningSystemsModels.DunningSystemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningSystemsModels.DunningSystemFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + isDefault: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + isDefault: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: DunningSystemsAcl.canUseFindById, + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + query: DunningSystemsQueries.useFindById, + }, + create: { + acl: DunningSystemsAcl.canUseCreate, + schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, + mutation: DunningSystemsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, + options: { + inputs: { + name: true, + isDefault: true, + }, + }, +}) + }, + update: { + acl: DunningSystemsAcl.canUseUpdate, + schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, + mutation: DunningSystemsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, + options: { + inputs: { + name: true, + isDefault: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DunningSystemsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DunningSystemsQueries.usePaginateLabels, + infinite: DunningSystemsQueries.usePaginateLabelsInfinite, + filters: { + schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/dunningSystems/dunningSystems.models.ts b/test/generated/full/dunningSystems/dunningSystems.models.ts new file mode 100644 index 0000000..df46055 --- /dev/null +++ b/test/generated/full/dunningSystems/dunningSystems.models.ts @@ -0,0 +1,111 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningSystemsModels { +/** + * DunningSystemEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DunningSystemEmployeeDTO = z.infer; + +/** + * DunningSystemResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name + * @property { boolean } isDefault + * @property { boolean } archived + * @property { string } archivedAt + * @property { string } createdById + * @property { DunningSystemEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DunningSystemEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const DunningSystemResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isDefault: z.boolean(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: DunningSystemEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningSystemEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type DunningSystemResponseDTO = z.infer; + +/** + * DunningSystemLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DunningSystemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type DunningSystemLabelFilterDto = z.infer; + +/** + * DunningSystemFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + * @property { boolean } isDefault + */ +export const DunningSystemFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean(), isDefault: z.boolean() }).readonly(); +export type DunningSystemFilterDto = z.infer; + +/** + * CreateDunningSystemRequestDTOSchema + * @type { object } + * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` + * @property { boolean } isDefault Is default dunning system + */ +export const CreateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100).describe("Dunning system name"), isDefault: z.boolean().describe("Is default dunning system").nullish() }).readonly(); +export type CreateDunningSystemRequestDTO = z.infer; + +/** + * UpdateDunningSystemRequestDTOSchema + * @type { object } + * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` + * @property { boolean } isDefault Is default dunning system + */ +export const UpdateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100).describe("Dunning system name"), isDefault: z.boolean().describe("Is default dunning system") }).readonly(); +export type UpdateDunningSystemRequestDTO = z.infer; + +/** + * DunningSystemsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DunningSystemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); +export type DunningSystemsPaginateLabelsOrderParamEnum = z.infer; +export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * DunningSystemsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DunningSystemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type DunningSystemsPaginateLabelsResponse = z.infer; + +/** + * DunningSystemsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const DunningSystemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); +export type DunningSystemsPaginateOrderParamEnum = z.infer; +export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderParamEnumSchema.enum; + +/** + * DunningSystemsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningSystemResponseDTO[] } items + */ +export const DunningSystemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningSystemResponseDTOSchema).readonly() }).readonly().shape }); +export type DunningSystemsPaginateResponse = z.infer; + +} diff --git a/test/generated/full/dunningSystems/dunningSystems.queries.ts b/test/generated/full/dunningSystems/dunningSystems.queries.ts new file mode 100644 index 0000000..a25f0a7 --- /dev/null +++ b/test/generated/full/dunningSystems/dunningSystems.queries.ts @@ -0,0 +1,274 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningSystemsAcl } from "./dunningSystems.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningSystemsModels } from "./dunningSystems.models"; +import { DunningSystemsApi } from "./dunningSystems.api"; + +export namespace DunningSystemsQueries { +export const moduleName = QueryModule.DunningSystems; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-systems/:id", id, officeId] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate dunning system labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate dunning system labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary List dunning systems + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); + return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary List dunning systems + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); + return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create dunning system + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningSystemsModels.CreateDunningSystemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningSystemsAcl.canUseCreate({ officeId } )); + return DunningSystemsApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get dunning system by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUseFindById({ officeId } )); + return DunningSystemsApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update dunning system + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningSystemsModels.UpdateDunningSystemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(DunningSystemsAcl.canUseUpdate({ officeId } )); + return DunningSystemsApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive dunning system + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningSystemsAcl.canUseArchive({ officeId } )); + return DunningSystemsApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive dunning system + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId } )); + return DunningSystemsApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/employee/employee.acl.ts b/test/generated/full/employee/employee.acl.ts new file mode 100644 index 0000000..e796e7e --- /dev/null +++ b/test/generated/full/employee/employee.acl.ts @@ -0,0 +1,153 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmployeeAcl { +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List employees + * @param { string } object.officeId officeId from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId?: string, } +) => [ + "Read", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new employee + * @param { string } object.officeId officeId from mutation data + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId?: string, } +) => [ + "Create", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; + +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Employee" +] as AbilityTuple<"Read", "Employee">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Employee" +] as AbilityTuple<"Read", "Employee">; + +/** + * Use for `useResendOnboardingWithOffice` mutation ability. For global ability, omit the object parameter. + * @description Resend employee onboarding email + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useResendOnboardingWithOffice` mutation + */ +export const canUseResendOnboardingWithOffice = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; + +/** + * Use for `useGet` query ability. + * @description Read Office Employee + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( +) => [ + "Read", + "Employee" +] as AbilityTuple<"Read", "Employee">; + +/** + * Use for `useUpdate` mutation ability. + * @description Update Office Employee + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Employee" +] as AbilityTuple<"Update", "Employee">; + +/** + * Use for `useGetWithOffice` query ability. For global ability, omit the object parameter. + * @description Read Office Employee + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetWithOffice` query + */ +export const canUseGetWithOffice = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; + +/** + * Use for `useUpdateWithOffice` mutation ability. For global ability, omit the object parameter. + * @description Update Office Employee + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateWithOffice` mutation + */ +export const canUseUpdateWithOffice = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Update", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; + +/** + * Use for `useListRoles` query ability. + * @description List employee (global) roles + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query + */ +export const canUseListRoles = ( +) => [ + "ListRoles", + "Employee" +] as AbilityTuple<"ListRoles", "Employee">; + +/** + * Use for `useUpdateRoles` mutation ability. + * @description Update employee (global) roles + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation + */ +export const canUseUpdateRoles = ( +) => [ + "UpdateRoles", + "Employee" +] as AbilityTuple<"UpdateRoles", "Employee">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Employee" +] as AbilityTuple<"Archive", "Employee">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Unarchive", + "Employee" +] as AbilityTuple<"Unarchive", "Employee">; + +} diff --git a/test/generated/full/employee/employee.api.ts b/test/generated/full/employee/employee.api.ts new file mode 100644 index 0000000..e7cb049 --- /dev/null +++ b/test/generated/full/employee/employee.api.ts @@ -0,0 +1,157 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeModels } from "./employee.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeApi { +export const paginate = (limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeePaginateResponseSchema }, + `/employees`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: EmployeeModels.EmployeeCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees`, + ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), + config + ) +}; +export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/one-step`, + ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), + config + ) +}; +export const findAll = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, + `/employees/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, + `/employees/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const resendOnboarding = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/employees/${employeeId}/resend-onboarding`, + undefined, + config + ) +}; +export const resendOnboardingWithOffice = (officeId: string, employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, + undefined, + config + ) +}; +export const get = (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}`, + { + ...config, + params: { + populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + }, + } + ) +}; +export const update = (employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}`, + ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), + config + ) +}; +export const getWithOffice = (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/offices/${officeId}/employees/${employeeId}`, + { + ...config, + params: { + populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + }, + } + ) +}; +export const updateWithOffice = (officeId: string, employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/offices/${officeId}/employees/${employeeId}`, + ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), + config + ) +}; +export const listRoles = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, + `/employees/${employeeId}/roles`, + config + ) +}; +export const updateRoles = (employeeId: string, data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, + `/employees/${employeeId}/roles`, + ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), + config + ) +}; +export const archive = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}/archive`, + undefined, + config + ) +}; +export const unarchive = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/employee/employee.configs.ts b/test/generated/full/employee/employee.configs.ts new file mode 100644 index 0000000..1288db2 --- /dev/null +++ b/test/generated/full/employee/employee.configs.ts @@ -0,0 +1,135 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeeModels } from "./employee.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeQueries } from "./employee.queries"; +import { EmployeeAcl } from "./employee.acl"; + +export namespace EmployeeConfigs { +export const employeesConfig = { + meta: { + title: "Employees", + }, + readAll: { + acl: EmployeeAcl.canUsePaginate, + schema: EmployeeModels.EmployeeResponseSchema, + paginated: EmployeeQueries.usePaginate, + infinite: EmployeeQueries.usePaginateInfinite, + filters: { + schema: EmployeeModels.EmployeeFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeFilterDtoSchema, + options: { + inputs: { + office: true, + roles: true, + primaryOfficeId: true, + firstName: true, + lastName: true, + email: true, + ids: true, + archived: true, + search: true, + officeRole: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: EmployeeModels.EmployeeResponseSchema, + options: { + columns: { + id: true, + email: true, + firstName: true, + lastName: true, + locale: true, + phone: true, + archived: true, + primaryOfficeId: true, + primaryOffice: true, + employments: true, + roles: true, + createdAt: true, + updatedAt: true, + }, + sortable: EmployeeModels.EmployeePaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: EmployeeAcl.canUseGet, + schema: EmployeeModels.EmployeeResponseSchema, + query: EmployeeQueries.useGet, + }, + create: { + acl: EmployeeAcl.canUseCreate, + schema: EmployeeModels.EmployeeCreateRequestSchema, + mutation: EmployeeQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeCreateRequestSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + locale: true, + primaryOfficeId: true, + phone: true, + }, + }, +}) + }, + update: { + acl: EmployeeAcl.canUseUpdate, + schema: EmployeeModels.EmployeeUpdateRequestSchema, + mutation: EmployeeQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeUpdateRequestSchema, + options: { + inputs: { + firstName: true, + lastName: true, + phone: true, + locale: true, + primaryOfficeId: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: EmployeeAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: EmployeeQueries.usePaginateLabels, + infinite: EmployeeQueries.usePaginateLabelsInfinite, + filters: { + schema: EmployeeModels.EmployeeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/employee/employee.models.ts b/test/generated/full/employee/employee.models.ts new file mode 100644 index 0000000..5c1b23d --- /dev/null +++ b/test/generated/full/employee/employee.models.ts @@ -0,0 +1,227 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeModels { +/** + * EmployeeResponseSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { CommonModels.LocaleEnum } locale + * @property { string } phone Phone number + * @property { boolean } archived Archived + * @property { string } primaryOfficeId Primary office id + * @property { CommonModels.EmployeeOfficeResponse } primaryOffice Primary office + * @property { CommonModels.EmploymentResponse[] } employments Employments + * @property { CommonModels.EmployeeRoleResponse[] } roles Global Roles + * @property { string } createdAt + * @property { string } updatedAt + */ +export const EmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), locale: CommonModels.LocaleEnumSchema.nullish(), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), primaryOfficeId: z.string().describe("Primary office id").nullish(), primaryOffice: CommonModels.EmployeeOfficeResponseSchema.describe("Primary office").nullish(), employments: z.array(CommonModels.EmploymentResponseSchema).readonly().describe("Employments").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type EmployeeResponse = z.infer; + +/** + * EmployeeCreateRequestSchema + * @type { object } + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { CommonModels.LocaleEnum } locale + * @property { string } primaryOfficeId Primary office ID + * @property { string } phone Phone number + */ +export const EmployeeCreateRequestSchema = z.object({ firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.email().describe("Email"), locale: CommonModels.LocaleEnumSchema.nullish(), primaryOfficeId: z.string().describe("Primary office ID").nullish(), phone: z.string().describe("Phone number").nullish() }).readonly(); +export type EmployeeCreateRequest = z.infer; + +/** + * EmployeeOneStepCreateEmploymentRequestSchema + * @type { object } + * @property { string } officeId + * @property { string[] } roleIds Array of office role IDs + */ +export const EmployeeOneStepCreateEmploymentRequestSchema = z.object({ officeId: z.string(), roleIds: z.array(z.string()).readonly().describe("Array of office role IDs").nullish() }).readonly(); +export type EmployeeOneStepCreateEmploymentRequest = z.infer; + +/** + * EmployeeOneStepCreateRequestSchema + * @type { object } + * @property { CommonModels.LocaleEnum } locale + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { string } phone Phone number + * @property { string[] } roleIds Array of global role IDs + * @property { string } primaryOfficeId Primary office ID + * @property { EmployeeOneStepCreateEmploymentRequest[] } employments Employments. Min Items: `1` + */ +export const EmployeeOneStepCreateRequestSchema = z.object({ locale: CommonModels.LocaleEnumSchema.nullish(), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.email().describe("Email"), phone: z.string().describe("Phone number").nullish(), roleIds: z.array(z.string()).readonly().describe("Array of global role IDs").nullish(), primaryOfficeId: z.string().describe("Primary office ID").nullish(), employments: z.array(EmployeeOneStepCreateEmploymentRequestSchema).readonly().min(1).describe("Employments") }).readonly(); +export type EmployeeOneStepCreateRequest = z.infer; + +/** + * EmployeeUpdateRequestSchema + * @type { object } + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number of the employee + * @property { CommonModels.LocaleEnum } locale + * @property { string } primaryOfficeId + */ +export const EmployeeUpdateRequestSchema = z.object({ firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number of the employee"), locale: CommonModels.LocaleEnumSchema, primaryOfficeId: z.string() }).readonly(); +export type EmployeeUpdateRequest = z.infer; + +/** + * EmployeeFilterDtoSchema + * @type { object } + * @property { string } office Office ID (single select, offices the user has access to) + * @property { string[] } roles Role IDs (multiselect) + * @property { string } primaryOfficeId Primary office id + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { string[] } ids Ids + * @property { boolean } archived Archived + * set to true to only return archived employees + * does not return archived employees by default. Default: `false` + * @property { string } search Free text search multiple fields + * @property { string } officeRole Office role + */ +export const EmployeeFilterDtoSchema = z.object({ office: z.string().describe("Office ID (single select, offices the user has access to)"), roles: z.array(z.string()).readonly().describe("Role IDs (multiselect)"), primaryOfficeId: z.string().describe("Primary office id"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.string().describe("Email"), ids: z.array(z.string()).readonly().describe("Ids"), archived: z.boolean().describe(`Archived + set to true to only return archived employees + does not return archived employees by default`).default(false), search: z.string().describe("Free text search multiple fields"), officeRole: z.string().describe("Office role") }).readonly(); +export type EmployeeFilterDto = z.infer; + +/** + * EmployeeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type EmployeeLabelFilterDto = z.infer; + +/** + * EmployeeRoleMemberResponseSchema + * @type { object } + * @property { string } roleId + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string[] } permissions Permissions associated with the role + */ +export const EmployeeRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export type EmployeeRoleMemberResponse = z.infer; + +/** + * EmployeeRoleMembershipsUpdateRequestSchema + * @type { object } + * @property { string[] } roleIds Array of role IDs + */ +export const EmployeeRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }).readonly(); +export type EmployeeRoleMembershipsUpdateRequest = z.infer; + +/** + * EmployeePaginateOrderParamEnumSchema + * @type { enum } + */ +export const EmployeePaginateOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); +export type EmployeePaginateOrderParamEnum = z.infer; +export const EmployeePaginateOrderParamEnum = EmployeePaginateOrderParamEnumSchema.enum; + +/** + * EmployeePopulateFieldSchema + * @type { enum } + */ +export const EmployeePopulateFieldSchema = z.enum(["employments", "primaryOffice", "roles", "employments.roles", "employments.office"]); +export type EmployeePopulateField = z.infer; +export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; + +/** + * EmployeePaginatePopulateParamSchema + * @type { array } + */ +export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); +export type EmployeePaginatePopulateParam = z.infer; + +/** + * EmployeePaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeResponse[] } items + */ +export const EmployeePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeResponseSchema).readonly() }).readonly().shape }); +export type EmployeePaginateResponse = z.infer; + +/** + * EmployeeFindAllResponseSchema + * @type { array } + */ +export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type EmployeeFindAllResponse = z.infer; + +/** + * EmployeePaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const EmployeePaginateLabelsOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); +export type EmployeePaginateLabelsOrderParamEnum = z.infer; +export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderParamEnumSchema.enum; + +/** + * EmployeePaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const EmployeePaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type EmployeePaginateLabelsResponse = z.infer; + +/** + * EmployeeGetPopulateParamSchema + * @type { array } + */ +export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); +export type EmployeeGetPopulateParam = z.infer; + +/** + * GetWithOfficePopulateParamSchema + * @type { array } + */ +export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); +export type GetWithOfficePopulateParam = z.infer; + +/** + * EmployeeListRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleMemberResponse[] } items + */ +export const EmployeeListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape }); +export type EmployeeListRolesResponse = z.infer; + +/** + * EmployeeUpdateRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleMemberResponse[] } items + */ +export const EmployeeUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape }); +export type EmployeeUpdateRolesResponse = z.infer; + +} diff --git a/test/generated/full/employee/employee.queries.ts b/test/generated/full/employee/employee.queries.ts new file mode 100644 index 0000000..8881af1 --- /dev/null +++ b/test/generated/full/employee/employee.queries.ts @@ -0,0 +1,470 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeeAcl } from "./employee.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeModels } from "./employee.models"; +import { EmployeeApi } from "./employee.api"; + +export namespace EmployeeQueries { +export const moduleName = QueryModule.Employee; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees", limit, order, populate, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string) => [...keys.all, "/employees", "infinite", limit, order, populate, filter, cursor] as const, + findAll: (search?: string) => [...keys.all, "/employees/labels", search] as const, + paginateLabels: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string) => [...keys.all, "/employees/labels/paginate", "infinite", limit, order, filter, cursor] as const, + get: (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam) => [...keys.all, "/employees/:employeeId", employeeId, populate] as const, + getWithOffice: (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam) => [...keys.all, "/offices/:officeId/employees/:employeeId", officeId, employeeId, populate] as const, + listRoles: (employeeId: string) => [...keys.all, "/employees/:employeeId/roles", employeeId] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Employees + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter + * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, populate, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeAcl.canUsePaginate()); + return EmployeeApi.paginate(limit, order, populate, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Employees + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter + * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeAcl.canUsePaginate()); + return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Employee + * @permission Requires `canUseCreate` ability + * @param { EmployeeModels.EmployeeCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmployeeAcl.canUseCreate()); + return EmployeeApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useSingeStepCreate` + * @summary Create Employee in a single step + * - requires Employee:Create for creating a global employee + * - requires Employee:Create{officeId} for creating an office employee (first office is primary) + * - requires Employment:Create{officeId} for creating office employments + * - requires Employee:UpdateRoles for setting global roles + * - requires Employee:UpdateRoles{officeId} for setting office roles + * @param { EmployeeModels.EmployeeOneStepCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useSingeStepCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + EmployeeApi.singeStepCreate(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindAll` + * @summary List all employees with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search), + queryFn: () => { + checkAcl(EmployeeAcl.canUseFindAll()); + return EmployeeApi.findAll(search, config) }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate employees with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeAcl.canUsePaginateLabels()); + return EmployeeApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate employees with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeAcl.canUsePaginateLabels()); + return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useResendOnboarding` + * @summary Resend Employee Onboarding Email + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useResendOnboarding = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => + EmployeeApi.resendOnboarding(employeeId, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useResendOnboardingWithOffice` + * @permission Requires `canUseResendOnboardingWithOffice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useResendOnboardingWithOffice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employeeId }) => { + checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId } )); + return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGet` + * @summary Get Employee + * - allow global admins and office admins of primary office + * @permission Requires `canUseGet` ability + * @param { string } object.employeeId Path parameter + * @param { EmployeeModels.EmployeeGetPopulateParam } object.populate Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ employeeId, populate }: { employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(employeeId, populate), + queryFn: () => { + checkAcl(EmployeeAcl.canUseGet()); + return EmployeeApi.get(employeeId, populate, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Employee + * - allow global admins and office admins of primary office + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdate()); + return EmployeeApi.update(employeeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetWithOffice` + * @permission Requires `canUseGetWithOffice` ability + * @param { string } object.officeId Path parameter + * @param { string } object.employeeId Path parameter + * @param { EmployeeModels.GetWithOfficePopulateParam } object.populate Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetWithOffice = ({ officeId, employeeId, populate }: { officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getWithOffice(officeId, employeeId, populate), + queryFn: () => { + checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId } )); + return EmployeeApi.getWithOffice(officeId, employeeId, populate, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateWithOffice` + * @permission Requires `canUseUpdateWithOffice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateWithOffice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId } )); + return EmployeeApi.updateWithOffice(officeId, employeeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, employeeId } = variables; + const updateKeys = [keys.get(employeeId), keys.getWithOffice(officeId, employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListRoles` + * @summary List Employee (global) Roles + * @permission Requires `canUseListRoles` ability + * @param { string } object.employeeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoles = ({ employeeId }: { employeeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoles(employeeId), + queryFn: () => { + checkAcl(EmployeeAcl.canUseListRoles()); + return EmployeeApi.listRoles(employeeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateRoles` + * @summary Update Employee (global) Roles + * @permission Requires `canUseUpdateRoles` ability + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeRoleMembershipsUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdateRoles()); + return EmployeeApi.updateRoles(employeeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Employee + * @permission Requires `canUseArchive` ability + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => { + checkAcl(EmployeeAcl.canUseArchive()); + return EmployeeApi.archive(employeeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Un-archive Employee + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => { + checkAcl(EmployeeAcl.canUseUnarchive()); + return EmployeeApi.unarchive(employeeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/employeeAccount/employeeAccount.api.ts b/test/generated/full/employeeAccount/employeeAccount.api.ts new file mode 100644 index 0000000..7eac01c --- /dev/null +++ b/test/generated/full/employeeAccount/employeeAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { EmployeeAccountModels } from "./employeeAccount.models"; + +export namespace EmployeeAccountApi { +export const get = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, + `/employees/account`, + config + ) +}; +} diff --git a/test/generated/full/employeeAccount/employeeAccount.models.ts b/test/generated/full/employeeAccount/employeeAccount.models.ts new file mode 100644 index 0000000..4b3cb64 --- /dev/null +++ b/test/generated/full/employeeAccount/employeeAccount.models.ts @@ -0,0 +1,53 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeAccountModels { +/** + * EmployeeAccountEmploymentDtoSchema + * @type { object } + * @property { string } officeId Office ID + * @property { string } officeName Office name + */ +export const EmployeeAccountEmploymentDtoSchema = z.object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }).readonly(); +export type EmployeeAccountEmploymentDto = z.infer; + +/** + * EmployeeAccountPrimaryOfficeDtoSchema + * @type { object } + * @property { string } officeId Office ID + * @property { string } officeName Office name + */ +export const EmployeeAccountPrimaryOfficeDtoSchema = z.object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }).readonly(); +export type EmployeeAccountPrimaryOfficeDto = z.infer; + +/** + * EmployeeAccountRoleDtoSchema + * @type { object } + * @property { string } name Role name + * @property { string[] } permissions Role permissions + * @property { string } officeId Office ID + */ +export const EmployeeAccountRoleDtoSchema = z.object({ name: z.string().describe("Role name"), permissions: z.array(z.string()).readonly().describe("Role permissions"), officeId: z.string().describe("Office ID").nullish() }).readonly(); +export type EmployeeAccountRoleDto = z.infer; + +/** + * EmployeeAccountDtoSchema + * @type { object } + * @property { string } defaultUrl + * @property { string } costCenter + * @property { CommonModels.LocaleEnum } locale + * @property { array[] } aclRules Can hold any type of value + * @property { object } settings Employee settings keyed by setting name + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { EmployeeAccountEmploymentDto[] } employments Employments + * @property { EmployeeAccountPrimaryOfficeDto } primaryOffice Primary office + * @property { EmployeeAccountRoleDto[] } roles Roles + */ +export const EmployeeAccountDtoSchema = z.object({ defaultUrl: z.string().nullish(), costCenter: z.string().nullish(), locale: CommonModels.LocaleEnumSchema.nullish(), aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), settings: z.union([z.object({}).catchall(z.any()).readonly(), z.array(z.object({}).catchall(z.any()).readonly()).readonly(), z.string(), z.array(z.string()).readonly(), z.array(z.number()).readonly()]).describe("Employee settings keyed by setting name"), id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), employments: z.array(EmployeeAccountEmploymentDtoSchema).readonly().describe("Employments"), primaryOffice: EmployeeAccountPrimaryOfficeDtoSchema.describe("Primary office"), roles: z.array(EmployeeAccountRoleDtoSchema).readonly().describe("Roles") }).readonly(); +export type EmployeeAccountDto = z.infer; + +} diff --git a/test/generated/full/employeeAccount/employeeAccount.queries.ts b/test/generated/full/employeeAccount/employeeAccount.queries.ts new file mode 100644 index 0000000..3d5b964 --- /dev/null +++ b/test/generated/full/employeeAccount/employeeAccount.queries.ts @@ -0,0 +1,32 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeAccountApi } from "./employeeAccount.api"; + +export namespace EmployeeAccountQueries { +export const moduleName = QueryModule.EmployeeAccount; + +export const keys = { + all: [moduleName] as const, + get: () => [...keys.all, "/employees/account", ] as const, +}; + +/** + * Query `useGet` + * @summary Get profile of logged-in user + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.get(), + queryFn: () => + EmployeeAccountApi.get(config), + ...options, + }); +}; + +} diff --git a/test/generated/full/employeePermissions/employeePermissions.acl.ts b/test/generated/full/employeePermissions/employeePermissions.acl.ts new file mode 100644 index 0000000..25d65ad --- /dev/null +++ b/test/generated/full/employeePermissions/employeePermissions.acl.ts @@ -0,0 +1,24 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace EmployeePermissionsAcl { +/** + * Use for `usePaginatePermissions` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query + */ +export const canUsePaginatePermissions = ( +) => [ + "Read", + "Permission" +] as AbilityTuple<"Read", "Permission">; + +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Permission" +] as AbilityTuple<"Read", "Permission">; + +} diff --git a/test/generated/full/employeePermissions/employeePermissions.api.ts b/test/generated/full/employeePermissions/employeePermissions.api.ts new file mode 100644 index 0000000..090ea01 --- /dev/null +++ b/test/generated/full/employeePermissions/employeePermissions.api.ts @@ -0,0 +1,36 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; + +export namespace EmployeePermissionsApi { +export const paginatePermissions = (limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, + `/employees/permissions`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findAll = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, + `/employees/permissions/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +} diff --git a/test/generated/full/employeePermissions/employeePermissions.configs.ts b/test/generated/full/employeePermissions/employeePermissions.configs.ts new file mode 100644 index 0000000..50dd5bf --- /dev/null +++ b/test/generated/full/employeePermissions/employeePermissions.configs.ts @@ -0,0 +1,45 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; +import { EmployeePermissionsQueries } from "./employeePermissions.queries"; +import { EmployeePermissionsAcl } from "./employeePermissions.acl"; + +export namespace EmployeePermissionsConfigs { +export const permissionsConfig = { + meta: { + title: "Permissions", + }, + readAll: { + acl: EmployeePermissionsAcl.canUsePaginatePermissions, + schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, + paginated: EmployeePermissionsQueries.usePaginatePermissions, + infinite: EmployeePermissionsQueries.usePaginatePermissionsInfinite, + filters: { + schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, + options: { + inputs: { + context: true, + ids: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, + options: { + columns: { + id: true, + label: true, + group: true, + description: true, + context: true, + }, + sortable: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/employeePermissions/employeePermissions.models.ts b/test/generated/full/employeePermissions/employeePermissions.models.ts new file mode 100644 index 0000000..efe698e --- /dev/null +++ b/test/generated/full/employeePermissions/employeePermissions.models.ts @@ -0,0 +1,54 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeePermissionsModels { +/** + * EmployeePermissionResponseSchema + * @type { object } + * @property { string } id Employee Permission unique identifier + * @property { string } label + * @property { string } group + * @property { string } description + * @property { string } context Scope where this rule is applied + */ +export const EmployeePermissionResponseSchema = z.object({ id: z.string().describe("Employee Permission unique identifier"), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied") }).readonly(); +export type EmployeePermissionResponse = z.infer; + +/** + * EmployeePermissionFilterDtoSchema + * @type { object } + * @property { string } context Role context + * @property { string[] } ids Ids + */ +export const EmployeePermissionFilterDtoSchema = z.object({ context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), ids: z.array(z.string()).readonly().describe("Ids") }).readonly(); +export type EmployeePermissionFilterDto = z.infer; + +/** + * EmployeePermissionsPaginatePermissionsOrderParamEnumSchema + * @type { enum } + */ +export const EmployeePermissionsPaginatePermissionsOrderParamEnumSchema = z.enum(["id"]); +export type EmployeePermissionsPaginatePermissionsOrderParamEnum = z.infer; +export const EmployeePermissionsPaginatePermissionsOrderParamEnum = EmployeePermissionsPaginatePermissionsOrderParamEnumSchema.enum; + +/** + * EmployeePermissionsPaginatePermissionsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeePermissionResponse[] } items + */ +export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeePermissionResponseSchema).readonly() }).readonly().shape }); +export type EmployeePermissionsPaginatePermissionsResponse = z.infer; + +/** + * EmployeePermissionsFindAllResponseSchema + * @type { array } + */ +export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type EmployeePermissionsFindAllResponse = z.infer; + +} diff --git a/test/generated/full/employeePermissions/employeePermissions.queries.ts b/test/generated/full/employeePermissions/employeePermissions.queries.ts new file mode 100644 index 0000000..715d356 --- /dev/null +++ b/test/generated/full/employeePermissions/employeePermissions.queries.ts @@ -0,0 +1,94 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeePermissionsAcl } from "./employeePermissions.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; +import { EmployeePermissionsApi } from "./employeePermissions.api"; + +export namespace EmployeePermissionsQueries { +export const moduleName = QueryModule.EmployeePermissions; + +export const keys = { + all: [moduleName] as const, + paginatePermissions: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/permissions", limit, order, filter, page, cursor] as const, + paginatePermissionsInfinite: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string) => [...keys.all, "/employees/permissions", "infinite", limit, order, filter, cursor] as const, + findAll: (search?: string) => [...keys.all, "/employees/permissions/labels", search] as const, +}; + +/** + * Query `usePaginatePermissions` + * @permission Requires `canUsePaginatePermissions` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` + * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginatePermissions = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginatePermissionsInfinite + * @permission Requires `canUsePaginatePermissions` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` + * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginatePermissionsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindAll` + * @summary List all permissions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search), + queryFn: () => { + checkAcl(EmployeePermissionsAcl.canUseFindAll()); + return EmployeePermissionsApi.findAll(search, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/employeeProfile/employeeProfile.api.ts b/test/generated/full/employeeProfile/employeeProfile.api.ts new file mode 100644 index 0000000..8b3c712 --- /dev/null +++ b/test/generated/full/employeeProfile/employeeProfile.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeProfileModels } from "./employeeProfile.models"; + +export namespace EmployeeProfileApi { +export const getProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, + `/employee-profile`, + config + ) +}; +export const updateProfile = (data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, + `/employee-profile`, + ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/employeeProfile/employeeProfile.models.ts b/test/generated/full/employeeProfile/employeeProfile.models.ts new file mode 100644 index 0000000..f67e1c2 --- /dev/null +++ b/test/generated/full/employeeProfile/employeeProfile.models.ts @@ -0,0 +1,33 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeProfileModels { +/** + * EmployeeProfileResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } firstName Employee first name + * @property { string } lastName Employee last name + * @property { string } email Employee email + * @property { string } phone Employee phone number + * @property { string } defaultUrl Employee default URL + * @property { CommonModels.LocaleEnum } locale Employee locale + */ +export const EmployeeProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string().describe("Employee first name"), lastName: z.string().describe("Employee last name"), email: z.string().describe("Employee email"), phone: z.string().describe("Employee phone number").nullish(), defaultUrl: z.string().describe("Employee default URL").nullish(), locale: CommonModels.LocaleEnumSchema.describe("Employee locale").nullish() }).readonly(); +export type EmployeeProfileResponseDTO = z.infer; + +/** + * UpdateEmployeeProfileRequestDTOSchema + * @type { object } + * @property { string } firstName Employee first name. Example: `John` + * @property { string } lastName Employee last name. Example: `Doe` + * @property { string } email Employee email address. Example: `john.doe@example.com` + * @property { string } phone Employee phone number. Example: `+1234567890` + * @property { string } defaultUrl Default URL for the employee profile. Example: `https://example.com` + * @property { string } costCenter Employee cost center + * @property { CommonModels.LocaleEnum } locale Employee locale preference. Example: `en-US` + */ +export const UpdateEmployeeProfileRequestDTOSchema = z.object({ firstName: z.string().describe("Employee first name"), lastName: z.string().describe("Employee last name"), email: z.email().describe("Employee email address"), phone: z.string().describe("Employee phone number"), defaultUrl: z.url().describe("Default URL for the employee profile"), costCenter: z.string().describe("Employee cost center"), locale: CommonModels.LocaleEnumSchema.describe("Employee locale preference") }).readonly(); +export type UpdateEmployeeProfileRequestDTO = z.infer; + +} diff --git a/test/generated/full/employeeProfile/employeeProfile.queries.ts b/test/generated/full/employeeProfile/employeeProfile.queries.ts new file mode 100644 index 0000000..a0c77f2 --- /dev/null +++ b/test/generated/full/employeeProfile/employeeProfile.queries.ts @@ -0,0 +1,58 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeProfileModels } from "./employeeProfile.models"; +import { EmployeeProfileApi } from "./employeeProfile.api"; + +export namespace EmployeeProfileQueries { +export const moduleName = QueryModule.EmployeeProfile; + +export const keys = { + all: [moduleName] as const, + getProfile: () => [...keys.all, "/employee-profile", ] as const, +}; + +/** + * Query `useGetProfile` + * @summary Get employee profile + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getProfile(), + queryFn: () => + EmployeeProfileApi.getProfile(config), + ...options, + }); +}; + +/** + * Mutation `useUpdateProfile` + * @summary Update employee profile + * @param { EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateProfile = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + EmployeeProfileApi.updateProfile(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.getProfile()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/employeeRoles/employeeRoles.acl.ts b/test/generated/full/employeeRoles/employeeRoles.acl.ts new file mode 100644 index 0000000..a64e698 --- /dev/null +++ b/test/generated/full/employeeRoles/employeeRoles.acl.ts @@ -0,0 +1,97 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmployeeRolesAcl { +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List all possible roles + * @param { string } object.context context from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { context?: string, } +) => [ + "Read", + object ? subject("Role", object) : "Role" +] as AbilityTuple<"Read", "Role" | ForcedSubject<"Role"> & { context?: string, }>; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Role" +] as AbilityTuple<"Create", "Role">; + +/** + * Use for `useLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLabels` query + */ +export const canUseLabels = ( +) => [ + "Read", + "Role" +] as AbilityTuple<"Read", "Role">; + +/** + * Use for `useFind` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query + */ +export const canUseFind = ( +) => [ + "Read", + "Role" +] as AbilityTuple<"Read", "Role">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Role" +] as AbilityTuple<"Update", "Role">; + +/** + * Use for `useDeleteEmployeesRolesByRoleId` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteEmployeesRolesByRoleId` mutation + */ +export const canUseDeleteEmployeesRolesByRoleId = ( +) => [ + "Delete", + "Role" +] as AbilityTuple<"Delete", "Role">; + +/** + * Use for `usePaginatePermissions` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query + */ +export const canUsePaginatePermissions = ( +) => [ + "Read", + "Role" +] as AbilityTuple<"Read", "Role">; + +/** + * Use for `useTogglePermission` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTogglePermission` mutation + */ +export const canUseTogglePermission = ( +) => [ + "Update", + "Role" +] as AbilityTuple<"Update", "Role">; + +/** + * Use for `useCopy` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopy` mutation + */ +export const canUseCopy = ( +) => [ + "Create", + "Role" +] as AbilityTuple<"Create", "Role">; + +} diff --git a/test/generated/full/employeeRoles/employeeRoles.api.ts b/test/generated/full/employeeRoles/employeeRoles.api.ts new file mode 100644 index 0000000..eb87de3 --- /dev/null +++ b/test/generated/full/employeeRoles/employeeRoles.api.ts @@ -0,0 +1,92 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeRolesApi { +export const list = (limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, + `/employees/roles`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), + config + ) +}; +export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeRolesModels.LabelsResponseSchema }, + `/employees/roles/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { type: "query", name: "context" }), + }, + } + ) +}; +export const find = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}`, + config + ) +}; +export const update = (roleId: string, data: EmployeeRolesModels.EmployeeRoleUpdateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), + config + ) +}; +export const deleteEmployeesRolesByRoleId = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/employees/roles/${roleId}`, + undefined, + config + ) +}; +export const paginatePermissions = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, + `/employees/roles/${roleId}/permissions`, + config + ) +}; +export const togglePermission = (roleId: string, permission: string, data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/employees/roles/${roleId}/permissions/${permission}/toggle`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), + config + ) +}; +export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}/copy`, + ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/employeeRoles/employeeRoles.configs.ts b/test/generated/full/employeeRoles/employeeRoles.configs.ts new file mode 100644 index 0000000..4e0b998 --- /dev/null +++ b/test/generated/full/employeeRoles/employeeRoles.configs.ts @@ -0,0 +1,90 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeRolesQueries } from "./employeeRoles.queries"; +import { EmployeeRolesAcl } from "./employeeRoles.acl"; + +export namespace EmployeeRolesConfigs { +export const rolesConfig = { + meta: { + title: "Roles", + }, + readAll: { + acl: EmployeeRolesAcl.canUseList, + schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, + paginated: EmployeeRolesQueries.useList, + infinite: EmployeeRolesQueries.useListInfinite, + filters: { + schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, + options: { + inputs: { + name: true, + context: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, + options: { + columns: { + id: true, + name: true, + color: true, + description: true, + context: true, + permissions: true, + numberOfUsers: true, + }, + sortable: EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: EmployeeRolesAcl.canUseFind, + schema: CommonModels.EmployeeRoleResponseSchema, + query: EmployeeRolesQueries.useFind, + }, + create: { + acl: EmployeeRolesAcl.canUseCreate, + schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, + mutation: EmployeeRolesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, + options: { + inputs: { + name: true, + color: true, + description: true, + context: true, + permissions: true, + }, + }, +}) + }, + update: { + acl: EmployeeRolesAcl.canUseUpdate, + schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, + mutation: EmployeeRolesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, + options: { + inputs: { + name: true, + color: true, + description: true, + }, + }, +}) + }, + delete: { + acl: EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId, + mutation: EmployeeRolesQueries.useDeleteEmployeesRolesByRoleId, + }, +}; + +} diff --git a/test/generated/full/employeeRoles/employeeRoles.models.ts b/test/generated/full/employeeRoles/employeeRoles.models.ts new file mode 100644 index 0000000..b0c6187 --- /dev/null +++ b/test/generated/full/employeeRoles/employeeRoles.models.ts @@ -0,0 +1,125 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeRolesModels { +/** + * EmployeeRoleListItemResponseSchema + * @type { object } + * @property { string } id Unique identifier of the role + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string } context Role context + * @property { string[] } permissions Permissions associated with the role + * @property { number } numberOfUsers Number of users associated with the role + */ +export const EmployeeRoleListItemResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), numberOfUsers: z.number().describe("Number of users associated with the role") }).readonly(); +export type EmployeeRoleListItemResponse = z.infer; + +/** + * EmployeeRolePaginationFilterDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } context Role context + * @property { string } search + */ +export const EmployeeRolePaginationFilterDtoSchema = z.object({ name: z.string().describe("Name"), context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), search: z.string() }).readonly(); +export type EmployeeRolePaginationFilterDto = z.infer; + +/** + * EmployeeRoleCreateRequestSchema + * @type { object } + * @property { string } name Name of the role + * @property { string } color Color of the role + * @property { string } description Color of the role + * @property { string } context Role context + * - office or global + * @property { string[] } permissions Permission IDs associated with the role + * can only be either office or global. Default: `` + */ +export const EmployeeRoleCreateRequestSchema = z.object({ name: z.string().describe("Name of the role"), color: z.string().describe("Color of the role"), description: z.string().describe("Color of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe(`Role context + - office or global`), permissions: z.array(z.string()).readonly().describe(`Permission IDs associated with the role + can only be either office or global`).default([]) }).readonly(); +export type EmployeeRoleCreateRequest = z.infer; + +/** + * EmployeeRolePermissionDtoSchema + * @type { object } + * @property { string } id Employee Permission unique identifier + * @property { string } label + * @property { string } group + * @property { string } description + * @property { string } context Scope where this rule is applied + * @property { boolean } enabled + */ +export const EmployeeRolePermissionDtoSchema = z.object({ id: z.string().describe("Employee Permission unique identifier"), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), enabled: z.boolean() }).readonly(); +export type EmployeeRolePermissionDto = z.infer; + +/** + * EmployeeRoleUpdateRequestSchema + * @type { object } + * @property { string } name Role Id + * @property { string } color Role Color + * @property { string } description Role Description + */ +export const EmployeeRoleUpdateRequestSchema = z.object({ name: z.string().describe("Role Id"), color: z.string().describe("Role Color"), description: z.string().describe("Role Description") }).readonly(); +export type EmployeeRoleUpdateRequest = z.infer; + +/** + * EmployeeRoleTogglePermissionRequestSchema + * @type { object } + * @property { boolean } toggled Turn the permission on or off + */ +export const EmployeeRoleTogglePermissionRequestSchema = z.object({ toggled: z.boolean().describe("Turn the permission on or off") }).readonly(); +export type EmployeeRoleTogglePermissionRequest = z.infer; + +/** + * CopyEmployeeRoleDtoSchema + * @type { object } + * @property { string } newRoleName + */ +export const CopyEmployeeRoleDtoSchema = z.object({ newRoleName: z.string() }).readonly(); +export type CopyEmployeeRoleDto = z.infer; + +/** + * EmployeeRolesListOrderParamEnumSchema + * @type { enum } + */ +export const EmployeeRolesListOrderParamEnumSchema = z.enum(["name", "numberOfUsers"]); +export type EmployeeRolesListOrderParamEnum = z.infer; +export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSchema.enum; + +/** + * EmployeeRolesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleListItemResponse[] } items + */ +export const EmployeeRolesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).readonly() }).readonly().shape }); +export type EmployeeRolesListResponse = z.infer; + +/** + * LabelsResponseSchema + * @type { array } + */ +export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type LabelsResponse = z.infer; + +/** + * EmployeeRolesPaginatePermissionsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRolePermissionDto[] } items + */ +export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).readonly() }).readonly().shape }); +export type EmployeeRolesPaginatePermissionsResponse = z.infer; + +} diff --git a/test/generated/full/employeeRoles/employeeRoles.queries.ts b/test/generated/full/employeeRoles/employeeRoles.queries.ts new file mode 100644 index 0000000..b10fa5d --- /dev/null +++ b/test/generated/full/employeeRoles/employeeRoles.queries.ts @@ -0,0 +1,283 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeeRolesAcl } from "./employeeRoles.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeRolesApi } from "./employeeRoles.api"; + +export namespace EmployeeRolesQueries { +export const moduleName = QueryModule.EmployeeRoles; + +export const keys = { + all: [moduleName] as const, + list: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/roles", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string) => [...keys.all, "/employees/roles", "infinite", limit, order, filter, cursor] as const, + labels: (search?: string, context?: CommonModels.EmployeeRoleContext) => [...keys.all, "/employees/roles/labels", search, context] as const, + find: (roleId: string) => [...keys.all, "/employees/roles/:roleId", roleId] as const, + paginatePermissions: (roleId: string) => [...keys.all, "/employees/roles/:roleId/permissions", roleId] as const, +}; + +/** + * Query `useList` + * @summary Paginate Employee Role Definitions + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` + * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseList()); + return EmployeeRolesApi.list(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary Paginate Employee Role Definitions + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` + * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeRolesAcl.canUseList()); + return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Employee Role Definition + * @permission Requires `canUseCreate` ability + * @param { EmployeeRolesModels.EmployeeRoleCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmployeeRolesAcl.canUseCreate()); + return EmployeeRolesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useLabels` + * @summary List all employee roles with only their labels + * @permission Requires `canUseLabels` ability + * @param { string } object.search Query parameter + * @param { CommonModels.EmployeeRoleContext } object.context Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useLabels = ({ search, context }: { search?: string, context?: CommonModels.EmployeeRoleContext }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.labels(search, context), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseLabels()); + return EmployeeRolesApi.labels(search, context, config) }, + ...options, + }); +}; + +/** + * Query `useFind` + * @summary Get Employee Role Definition + * @permission Requires `canUseFind` ability + * @param { string } object.roleId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFind = ({ roleId }: { roleId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.find(roleId), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseFind()); + return EmployeeRolesApi.find(roleId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Employee Role Definition + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.roleId Path parameter + * @param { EmployeeRolesModels.EmployeeRoleUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, data }) => { + checkAcl(EmployeeRolesAcl.canUseUpdate()); + return EmployeeRolesApi.update(roleId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { roleId } = variables; + const updateKeys = [keys.find(roleId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteEmployeesRolesByRoleId` + * @summary Delete Employee Role Definition + * @permission Requires `canUseDeleteEmployeesRolesByRoleId` ability + * @param { string } mutation.roleId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteEmployeesRolesByRoleId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId }) => { + checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); + return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginatePermissions` + * @summary Get All Employee Role Definition Permissions + * - convenience endpoint to expand the permissions of a role + * - only returns the enabled permissions + * @permission Requires `canUsePaginatePermissions` ability + * @param { string } object.roleId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginatePermissions = ({ roleId }: { roleId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginatePermissions(roleId), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); + return EmployeeRolesApi.paginatePermissions(roleId, config) }, + ...options, + }); +}; + +/** + * Mutation `useTogglePermission` + * @summary Toggle Employee Role Definition Permission + * @permission Requires `canUseTogglePermission` ability + * @param { string } mutation.roleId Path parameter + * @param { string } mutation.permission Path parameter + * @param { EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useTogglePermission = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, permission, data }) => { + checkAcl(EmployeeRolesAcl.canUseTogglePermission()); + return EmployeeRolesApi.togglePermission(roleId, permission, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopy` + * @summary Copy Employee Role Definition + * @permission Requires `canUseCopy` ability + * @param { string } mutation.roleId Path parameter + * @param { EmployeeRolesModels.CopyEmployeeRoleDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, data }) => { + checkAcl(EmployeeRolesAcl.canUseCopy()); + return EmployeeRolesApi.copy(roleId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { roleId } = variables; + const updateKeys = [keys.find(roleId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/employeeSettings/employeeSettings.api.ts b/test/generated/full/employeeSettings/employeeSettings.api.ts new file mode 100644 index 0000000..21fa47a --- /dev/null +++ b/test/generated/full/employeeSettings/employeeSettings.api.ts @@ -0,0 +1,23 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeSettingsModels } from "./employeeSettings.models"; + +export namespace EmployeeSettingsApi { +export const getAll = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, + `/employees/settings`, + config + ) +}; +export const update = (key: string, data: EmployeeSettingsModels.UpdateEmployeeSettingDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/employees/settings/${key}`, + ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/employeeSettings/employeeSettings.models.ts b/test/generated/full/employeeSettings/employeeSettings.models.ts new file mode 100644 index 0000000..08b58ca --- /dev/null +++ b/test/generated/full/employeeSettings/employeeSettings.models.ts @@ -0,0 +1,20 @@ +import { z } from "zod"; + +export namespace EmployeeSettingsModels { +/** + * EmployeeSettingsResponseDtoSchema + * @type { object } + * @property { object } settings Map of all settings for the employee + */ +export const EmployeeSettingsResponseDtoSchema = z.object({ settings: z.union([z.object({}).catchall(z.any()).readonly(), z.array(z.object({}).catchall(z.any()).readonly()).readonly(), z.string(), z.array(z.string()).readonly(), z.array(z.number()).readonly()]).describe("Map of all settings for the employee") }).readonly(); +export type EmployeeSettingsResponseDto = z.infer; + +/** + * UpdateEmployeeSettingDtoSchema + * @type { object } + * @property { object } value The value to store for the setting. If null, the setting will be deleted. + */ +export const UpdateEmployeeSettingDtoSchema = z.object({ value: z.union([z.object({}).catchall(z.any()).readonly(), z.array(z.unknown()).readonly(), z.string(), z.number(), z.boolean()]).describe("The value to store for the setting. If null, the setting will be deleted.").nullable() }).readonly(); +export type UpdateEmployeeSettingDto = z.infer; + +} diff --git a/test/generated/full/employeeSettings/employeeSettings.queries.ts b/test/generated/full/employeeSettings/employeeSettings.queries.ts new file mode 100644 index 0000000..389d6e3 --- /dev/null +++ b/test/generated/full/employeeSettings/employeeSettings.queries.ts @@ -0,0 +1,58 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeSettingsModels } from "./employeeSettings.models"; +import { EmployeeSettingsApi } from "./employeeSettings.api"; + +export namespace EmployeeSettingsQueries { +export const moduleName = QueryModule.EmployeeSettings; + +export const keys = { + all: [moduleName] as const, + getAll: () => [...keys.all, "/employees/settings", ] as const, +}; + +/** + * Query `useGetAll` + * @summary Get all employee settings + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetAll = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getAll(), + queryFn: () => + EmployeeSettingsApi.getAll(config), + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update employee setting + * @param { string } mutation.key Path parameter + * @param { EmployeeSettingsModels.UpdateEmployeeSettingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ key, data }) => + EmployeeSettingsApi.update(key, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/employment/employment.acl.ts b/test/generated/full/employment/employment.acl.ts new file mode 100644 index 0000000..bbcaf77 --- /dev/null +++ b/test/generated/full/employment/employment.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmploymentAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create new employment + * @param { string } object.officeId officeId from mutation data + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List employments + * @param { string } object.officeId officeId from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId?: string, } +) => [ + "Read", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Read", "Employment" | ForcedSubject<"Employment"> & { officeId?: string, }>; + +/** + * Use for `useListRoles` query ability. For global ability, omit the object parameter. + * @description List employment roles + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query + */ +export const canUseListRoles = ( + object?: { officeId: string, } +) => [ + "ListRoles", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"ListRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useUpdateRoles` mutation ability. For global ability, omit the object parameter. + * @description Update employment roles + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation + */ +export const canUseUpdateRoles = ( + object?: { officeId: string, } +) => [ + "UpdateRoles", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"UpdateRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Archive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Unarchive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +} diff --git a/test/generated/full/employment/employment.api.ts b/test/generated/full/employment/employment.api.ts new file mode 100644 index 0000000..d5718ab --- /dev/null +++ b/test/generated/full/employment/employment.api.ts @@ -0,0 +1,73 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; +import { EmploymentModels } from "./employment.models"; + +export namespace EmploymentApi { +export const create = (data: EmploymentModels.EmploymentCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/employees/employments`, + ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), + config + ) +}; +export const list = (limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmploymentModels.EmploymentListResponseSchema }, + `/employees/employments`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listRoles = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/roles`, + config + ) +}; +export const updateRoles = (officeId: string, employmentId: string, data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/roles`, + ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), + config + ) +}; +export const update = (officeId: string, employmentId: string, data: EmploymentModels.UpdateEmploymentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}`, + ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), + config + ) +}; +export const archive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/archive`, + undefined, + config + ) +}; +export const unarchive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/employment/employment.configs.ts b/test/generated/full/employment/employment.configs.ts new file mode 100644 index 0000000..b8525a4 --- /dev/null +++ b/test/generated/full/employment/employment.configs.ts @@ -0,0 +1,63 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { EmploymentModels } from "./employment.models"; +import { EmploymentQueries } from "./employment.queries"; +import { EmploymentAcl } from "./employment.acl"; + +export namespace EmploymentConfigs { +export const employmentsConfig = { + meta: { + title: "Employments", + }, + readAll: { + acl: EmploymentAcl.canUseList, + schema: CommonModels.EmploymentResponseSchema, + paginated: EmploymentQueries.useList, + infinite: EmploymentQueries.useListInfinite, + filters: { + schema: EmploymentModels.EmploymentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmploymentModels.EmploymentFilterDtoSchema, + options: { + inputs: { + officeId: true, + employeeId: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.EmploymentResponseSchema, + options: { + columns: { + id: true, + officeId: true, + office: true, + employeeId: true, + employee: true, + archived: true, + costCenter: true, + roles: true, + }, + sortable: EmploymentModels.EmploymentListOrderParamEnumSchema, + }, +}), + }, + create: { + acl: EmploymentAcl.canUseCreate, + schema: EmploymentModels.EmploymentCreateRequestSchema, + mutation: EmploymentQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmploymentModels.EmploymentCreateRequestSchema, + options: { + inputs: { + officeId: true, + employeeId: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/full/employment/employment.models.ts b/test/generated/full/employment/employment.models.ts new file mode 100644 index 0000000..b81dd37 --- /dev/null +++ b/test/generated/full/employment/employment.models.ts @@ -0,0 +1,114 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmploymentModels { +/** + * EmploymentCreateRequestSchema + * @type { object } + * @property { string } officeId + * @property { string } employeeId + */ +export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }).readonly(); +export type EmploymentCreateRequest = z.infer; + +/** + * EmploymentFilterDtoSchema + * @type { object } + * @property { string } officeId Office IDs + * @property { string } employeeId Employee IDs + */ +export const EmploymentFilterDtoSchema = z.object({ officeId: z.string().describe("Office IDs"), employeeId: z.string().describe("Employee IDs") }).readonly(); +export type EmploymentFilterDto = z.infer; + +/** + * EmploymentRoleMemberResponseSchema + * @type { object } + * @property { string } roleId + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string[] } permissions Permissions associated with the role + */ +export const EmploymentRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export type EmploymentRoleMemberResponse = z.infer; + +/** + * EmploymentRoleMembershipsUpdateRequestSchema + * @type { object } + * @property { string[] } roleIds Array of role IDs + */ +export const EmploymentRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }).readonly(); +export type EmploymentRoleMembershipsUpdateRequest = z.infer; + +/** + * UpdateEmploymentRequestDtoSchema + * @type { object } + * @property { string } costCenter + * @property { string[] } roleIds + */ +export const UpdateEmploymentRequestDtoSchema = z.object({ costCenter: z.string(), roleIds: z.array(z.string()).readonly() }).readonly(); +export type UpdateEmploymentRequestDto = z.infer; + +/** + * EmploymentListOrderParamEnumSchema + * @type { enum } + */ +export const EmploymentListOrderParamEnumSchema = z.enum(["officeId", "createdAt"]); +export type EmploymentListOrderParamEnum = z.infer; +export const EmploymentListOrderParamEnum = EmploymentListOrderParamEnumSchema.enum; + +/** + * EmploymentPaginationPopulateFieldsSchema + * @type { enum } + */ +export const EmploymentPaginationPopulateFieldsSchema = z.enum(["office", "employee"]); +export type EmploymentPaginationPopulateFields = z.infer; +export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFieldsSchema.enum; + +/** + * EmploymentListPopulateParamSchema + * @type { array } + */ +export const EmploymentListPopulateParamSchema = z.array(EmploymentPaginationPopulateFieldsSchema).readonly().nullish(); +export type EmploymentListPopulateParam = z.infer; + +/** + * EmploymentListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.EmploymentResponse[] } items + */ +export const EmploymentListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.EmploymentResponseSchema).readonly() }).readonly().shape }); +export type EmploymentListResponse = z.infer; + +/** + * EmploymentListRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmploymentRoleMemberResponse[] } items + */ +export const EmploymentListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape }); +export type EmploymentListRolesResponse = z.infer; + +/** + * EmploymentUpdateRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmploymentRoleMemberResponse[] } items + */ +export const EmploymentUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape }); +export type EmploymentUpdateRolesResponse = z.infer; + +} diff --git a/test/generated/full/employment/employment.queries.ts b/test/generated/full/employment/employment.queries.ts new file mode 100644 index 0000000..f4556da --- /dev/null +++ b/test/generated/full/employment/employment.queries.ts @@ -0,0 +1,235 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmploymentAcl } from "./employment.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmploymentModels } from "./employment.models"; +import { EmploymentApi } from "./employment.api"; + +export namespace EmploymentQueries { +export const moduleName = QueryModule.Employment; + +export const keys = { + all: [moduleName] as const, + list: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/employments", limit, order, populate, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string) => [...keys.all, "/employees/employments", "infinite", limit, order, populate, filter, cursor] as const, + listRoles: (officeId: string, employmentId: string) => [...keys.all, "/offices/:officeId/employments/:employmentId/roles", officeId, employmentId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create new employment + * @permission Requires `canUseCreate` ability + * @param { EmploymentModels.EmploymentCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmploymentAcl.canUseCreate()); + return EmploymentApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useList` + * @summary List Employments + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` + * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter + * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, populate, filter, page, cursor), + queryFn: () => { + checkAcl(EmploymentAcl.canUseList()); + return EmploymentApi.list(limit, order, populate, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List Employments + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` + * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter + * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, populate, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmploymentAcl.canUseList()); + return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useListRoles` + * @summary List Employments Roles + * @permission Requires `canUseListRoles` ability + * @param { string } object.officeId Path parameter + * @param { string } object.employmentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoles = ({ officeId, employmentId }: { officeId: string, employmentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoles(officeId, employmentId), + queryFn: () => { + checkAcl(EmploymentAcl.canUseListRoles({ officeId } )); + return EmploymentApi.listRoles(officeId, employmentId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateRoles` + * @summary Update Employment Roles + * @permission Requires `canUseUpdateRoles` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { EmploymentModels.EmploymentRoleMembershipsUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId, data }) => { + checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId } )); + return EmploymentApi.updateRoles(officeId, employmentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { EmploymentModels.UpdateEmploymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId, data }) => { + checkAcl(EmploymentAcl.canUseUpdate({ officeId } )); + return EmploymentApi.update(officeId, employmentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Employment + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId }) => { + checkAcl(EmploymentAcl.canUseArchive({ officeId } )); + return EmploymentApi.archive(officeId, employmentId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Un-archive Employment + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId }) => { + checkAcl(EmploymentAcl.canUseUnarchive({ officeId } )); + return EmploymentApi.unarchive(officeId, employmentId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/factoringExport/factoringExport.acl.ts b/test/generated/full/factoringExport/factoringExport.acl.ts new file mode 100644 index 0000000..cc07635 --- /dev/null +++ b/test/generated/full/factoringExport/factoringExport.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace FactoringExportAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create factoring export + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Create", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +/** + * Use for `useGetBatch` query ability. For global ability, omit the object parameter. + * @description Read factoring export + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query + */ +export const canUseGetBatch = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +} diff --git a/test/generated/full/factoringExport/factoringExport.api.ts b/test/generated/full/factoringExport/factoringExport.api.ts new file mode 100644 index 0000000..471d0ec --- /dev/null +++ b/test/generated/full/factoringExport/factoringExport.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { FactoringExportModels } from "./factoringExport.models"; + +export namespace FactoringExportApi { +export const create = (officeId: string, data: FactoringExportModels.CreateFactoringExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-exports`, + ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), + config + ) +}; +export const getBatch = (batchId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-exports/${batchId}`, + config + ) +}; +} diff --git a/test/generated/full/factoringExport/factoringExport.models.ts b/test/generated/full/factoringExport/factoringExport.models.ts new file mode 100644 index 0000000..1135505 --- /dev/null +++ b/test/generated/full/factoringExport/factoringExport.models.ts @@ -0,0 +1,41 @@ +import { z } from "zod"; + +export namespace FactoringExportModels { +/** + * FactoringExportBatchStatusEnumSchema + * @type { enum } + */ +export const FactoringExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Failed"]); +export type FactoringExportBatchStatusEnum = z.infer; +export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSchema.enum; + +/** + * FactoringExportBatchResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { FactoringExportBatchStatusEnum } status + * @property { number } totalInvoices + * @property { number } totalAmount + * @property { string } currencyNotation + * @property { string } jobId + * @property { string } eurFileUrl + * @property { string } usdFileUrl + * @property { string } createdById + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } exportedAt + */ +export const FactoringExportBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringExportBatchStatusEnumSchema, totalInvoices: z.number(), totalAmount: z.number(), currencyNotation: z.string(), jobId: z.string().nullish(), eurFileUrl: z.string().nullish(), usdFileUrl: z.string().nullish(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type FactoringExportBatchResponseDto = z.infer; + +/** + * CreateFactoringExportRequestDtoSchema + * @type { object } + * @property { string } invoiceDateFrom Invoice date from + * @property { string } invoiceDateUntil Invoice date until + */ +export const CreateFactoringExportRequestDtoSchema = z.object({ invoiceDateFrom: z.iso.datetime({ offset: true }).describe("Invoice date from"), invoiceDateUntil: z.iso.datetime({ offset: true }).describe("Invoice date until") }).readonly(); +export type CreateFactoringExportRequestDto = z.infer; + +} diff --git a/test/generated/full/factoringExport/factoringExport.queries.ts b/test/generated/full/factoringExport/factoringExport.queries.ts new file mode 100644 index 0000000..5bee5fa --- /dev/null +++ b/test/generated/full/factoringExport/factoringExport.queries.ts @@ -0,0 +1,68 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { FactoringExportAcl } from "./factoringExport.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FactoringExportModels } from "./factoringExport.models"; +import { FactoringExportApi } from "./factoringExport.api"; + +export namespace FactoringExportQueries { +export const moduleName = QueryModule.FactoringExport; + +export const keys = { + all: [moduleName] as const, + getBatch: (batchId: string, officeId: string) => [...keys.all, "/offices/:officeId/factoring-exports/:batchId", batchId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Generate factoring export files for Raiffeisen Factor Bank + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { FactoringExportModels.CreateFactoringExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(FactoringExportAcl.canUseCreate({ officeId } )); + return FactoringExportApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetBatch` + * @summary Get factoring export batch status + * @permission Requires `canUseGetBatch` ability + * @param { string } object.batchId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBatch = ({ batchId, officeId }: { batchId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBatch(batchId, officeId), + queryFn: () => { + checkAcl(FactoringExportAcl.canUseGetBatch({ officeId } )); + return FactoringExportApi.getBatch(batchId, officeId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/factoringMerge/factoringMerge.acl.ts b/test/generated/full/factoringMerge/factoringMerge.acl.ts new file mode 100644 index 0000000..208ed2f --- /dev/null +++ b/test/generated/full/factoringMerge/factoringMerge.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace FactoringMergeAcl { +/** + * Use for `usePrepareUpload` mutation ability. For global ability, omit the object parameter. + * @description Prepare factoring merge upload + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareUpload` mutation + */ +export const canUsePrepareUpload = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +/** + * Use for `useProcessMerge` mutation ability. For global ability, omit the object parameter. + * @description Process factoring merge + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useProcessMerge` mutation + */ +export const canUseProcessMerge = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +/** + * Use for `useGetMergeBatch` query ability. For global ability, omit the object parameter. + * @description Read merge batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMergeBatch` query + */ +export const canUseGetMergeBatch = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +} diff --git a/test/generated/full/factoringMerge/factoringMerge.api.ts b/test/generated/full/factoringMerge/factoringMerge.api.ts new file mode 100644 index 0000000..f095cec --- /dev/null +++ b/test/generated/full/factoringMerge/factoringMerge.api.ts @@ -0,0 +1,30 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { FactoringMergeModels } from "./factoringMerge.models"; + +export namespace FactoringMergeApi { +export const prepareUpload = (officeId: string, data: FactoringMergeModels.PrepareFactoringMergeRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/prepare-upload`, + ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), + config + ) +}; +export const processMerge = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/${batchId}/process`, + undefined, + config + ) +}; +export const getMergeBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/${batchId}`, + config + ) +}; +} diff --git a/test/generated/full/factoringMerge/factoringMerge.models.ts b/test/generated/full/factoringMerge/factoringMerge.models.ts new file mode 100644 index 0000000..e285edd --- /dev/null +++ b/test/generated/full/factoringMerge/factoringMerge.models.ts @@ -0,0 +1,84 @@ +import { z } from "zod"; + +export namespace FactoringMergeModels { +/** + * FileMetadataDtoSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType File MIME type + * @property { number } fileSize File size in bytes. Minimum: `1` + */ +export const FileMetadataDtoSchema = z.object({ fileName: z.string().describe("File name"), mimeType: z.string().describe("File MIME type"), fileSize: z.number().gte(1).describe("File size in bytes") }).readonly(); +export type FileMetadataDto = z.infer; + +/** + * PrepareFactoringMergeRequestDtoSchema + * @type { object } + * @property { FileMetadataDto } eurDebtorFile EUR debtor file metadata + * @property { FileMetadataDto } eurOperationsFile EUR operations file metadata + * @property { FileMetadataDto } eurExistingFactoringFile EUR existing factoring file metadata (optional) + * @property { FileMetadataDto } usdDebtorFile USD debtor file metadata + * @property { FileMetadataDto } usdOperationsFile USD operations file metadata + * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) + */ +export const PrepareFactoringMergeRequestDtoSchema = z.object({ eurDebtorFile: FileMetadataDtoSchema.describe("EUR debtor file metadata"), eurOperationsFile: FileMetadataDtoSchema.describe("EUR operations file metadata"), eurExistingFactoringFile: FileMetadataDtoSchema.describe("EUR existing factoring file metadata (optional)").nullish(), usdDebtorFile: FileMetadataDtoSchema.describe("USD debtor file metadata"), usdOperationsFile: FileMetadataDtoSchema.describe("USD operations file metadata"), usdExistingFactoringFile: FileMetadataDtoSchema.describe("USD existing factoring file metadata (optional)").nullish() }).readonly(); +export type PrepareFactoringMergeRequestDto = z.infer; + +/** + * MediaUploadInstructionsDtoSchema + * @type { object } + * @property { string } id + * @property { string } method + * @property { string } url + */ +export const MediaUploadInstructionsDtoSchema = z.object({ id: z.string(), method: z.string(), url: z.string() }).readonly(); +export type MediaUploadInstructionsDto = z.infer; + +/** + * FactoringMergeUploadInstructionsResponseDtoSchema + * @type { object } + * @property { string } batchId + * @property { MediaUploadInstructionsDto } eurDebtorFile + * @property { MediaUploadInstructionsDto } eurOperationsFile + * @property { MediaUploadInstructionsDto } eurExistingFactoringFile + * @property { MediaUploadInstructionsDto } usdDebtorFile + * @property { MediaUploadInstructionsDto } usdOperationsFile + * @property { MediaUploadInstructionsDto } usdExistingFactoringFile + */ +export const FactoringMergeUploadInstructionsResponseDtoSchema = z.object({ batchId: z.string(), eurDebtorFile: MediaUploadInstructionsDtoSchema, eurOperationsFile: MediaUploadInstructionsDtoSchema, eurExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), usdDebtorFile: MediaUploadInstructionsDtoSchema, usdOperationsFile: MediaUploadInstructionsDtoSchema, usdExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish() }).readonly(); +export type FactoringMergeUploadInstructionsResponseDto = z.infer; + +/** + * FactoringMergeBatchStatusEnumSchema + * @type { enum } + */ +export const FactoringMergeBatchStatusEnumSchema = z.enum(["Initializing", "Processing", "Completed", "Failed"]); +export type FactoringMergeBatchStatusEnum = z.infer; +export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema.enum; + +/** + * FactoringMergeBatchResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { FactoringMergeBatchStatusEnum } status + * @property { string } eurDebtorFileMediaId + * @property { string } eurOperationsFileMediaId + * @property { string } eurExistingFactoringFileMediaId + * @property { string } usdDebtorFileMediaId + * @property { string } usdOperationsFileMediaId + * @property { string } usdExistingFactoringFileMediaId + * @property { string } eurResultFileMediaId + * @property { string } eurResultFileUrl + * @property { string } usdResultFileMediaId + * @property { string } usdResultFileUrl + * @property { string } jobId + * @property { string } errorMessage + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } completedAt + */ +export const FactoringMergeBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringMergeBatchStatusEnumSchema, eurDebtorFileMediaId: z.string(), eurOperationsFileMediaId: z.string(), eurExistingFactoringFileMediaId: z.string().nullish(), usdDebtorFileMediaId: z.string(), usdOperationsFileMediaId: z.string(), usdExistingFactoringFileMediaId: z.string().nullish(), eurResultFileMediaId: z.string().nullish(), eurResultFileUrl: z.string().nullish(), usdResultFileMediaId: z.string().nullish(), usdResultFileUrl: z.string().nullish(), jobId: z.string().nullish(), errorMessage: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), completedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type FactoringMergeBatchResponseDto = z.infer; + +} diff --git a/test/generated/full/factoringMerge/factoringMerge.queries.ts b/test/generated/full/factoringMerge/factoringMerge.queries.ts new file mode 100644 index 0000000..80ea921 --- /dev/null +++ b/test/generated/full/factoringMerge/factoringMerge.queries.ts @@ -0,0 +1,97 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { FactoringMergeAcl } from "./factoringMerge.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FactoringMergeModels } from "./factoringMerge.models"; +import { FactoringMergeApi } from "./factoringMerge.api"; + +export namespace FactoringMergeQueries { +export const moduleName = QueryModule.FactoringMerge; + +export const keys = { + all: [moduleName] as const, + getMergeBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/factoring-merge/:batchId", officeId, batchId] as const, +}; + +/** + * Mutation `usePrepareUpload` + * @summary Prepare upload instructions for MOVE files merge + * @permission Requires `canUsePrepareUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { FactoringMergeModels.PrepareFactoringMergeRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const usePrepareUpload = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId } )); + return FactoringMergeApi.prepareUpload(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useProcessMerge` + * @summary Start processing the merge batch + * @permission Requires `canUseProcessMerge` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useProcessMerge = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId } )); + return FactoringMergeApi.processMerge(officeId, batchId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, batchId } = variables; + const updateKeys = [keys.getMergeBatch(officeId, batchId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetMergeBatch` + * @summary Get merge batch status + * @permission Requires `canUseGetMergeBatch` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, default] + */ +export const useGetMergeBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getMergeBatch(officeId, batchId), + queryFn: () => { + checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId } )); + return FactoringMergeApi.getMergeBatch(officeId, batchId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/files/files.api.ts b/test/generated/full/files/files.api.ts new file mode 100644 index 0000000..286fe3a --- /dev/null +++ b/test/generated/full/files/files.api.ts @@ -0,0 +1,72 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { FilesModels } from "./files.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace FilesApi { +export const createUpload = (officeId: string, folderId: string, data: FilesModels.CreateFileRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FilesModels.FileUploadResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}/files`, + ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), + config + ) +}; +export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/files/eml`, + ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const rename = (officeId: string, fileId: string, data: FilesModels.RenameFileRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.FileResponseDTOSchema }, + `/offices/${officeId}/files/${fileId}`, + ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), + config + ) +}; +export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/move`, + ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), + config + ) +}; +export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/copy`, + ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), + config + ) +}; +export const archive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/archive`, + ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), + config + ) +}; +export const unarchive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/unarchive`, + ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/files/files.models.ts b/test/generated/full/files/files.models.ts new file mode 100644 index 0000000..c7e5145 --- /dev/null +++ b/test/generated/full/files/files.models.ts @@ -0,0 +1,57 @@ +import { z } from "zod"; + +export namespace FilesModels { +/** + * CreateFileRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } mimeType + * @property { number } fileSize Minimum: `0` + */ +export const CreateFileRequestDTOSchema = z.object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }).readonly(); +export type CreateFileRequestDTO = z.infer; + +/** + * FileUploadResponseDTOSchema + * @type { object } + * @property { string } fileId + * @property { string } method + * @property { string } url + */ +export const FileUploadResponseDTOSchema = z.object({ fileId: z.string(), method: z.string(), url: z.string() }).readonly(); +export type FileUploadResponseDTO = z.infer; + +/** + * GetFilesEmlRequestDTOSchema + * @type { object } + * @property { string[] } ids Min Items: `1` + */ +export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); +export type GetFilesEmlRequestDTO = z.infer; + +/** + * RenameFileRequestDTOSchema + * @type { object } + * @property { string } name + */ +export const RenameFileRequestDTOSchema = z.object({ name: z.string() }).readonly(); +export type RenameFileRequestDTO = z.infer; + +/** + * MoveFilesRequestDTOSchema + * @type { object } + * @property { string[] } fileIds Min Items: `1` + * @property { string } targetFolderId + */ +export const MoveFilesRequestDTOSchema = z.object({ fileIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }).readonly(); +export type MoveFilesRequestDTO = z.infer; + +/** + * SetFilesArchivedRequestDTOSchema + * @type { object } + * @property { string[] } ids Min Items: `1` + */ +export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); +export type SetFilesArchivedRequestDTO = z.infer; + +} diff --git a/test/generated/full/files/files.queries.ts b/test/generated/full/files/files.queries.ts new file mode 100644 index 0000000..ee44a92 --- /dev/null +++ b/test/generated/full/files/files.queries.ts @@ -0,0 +1,210 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FilesModels } from "./files.models"; +import { FilesApi } from "./files.api"; + +export namespace FilesQueries { +export const moduleName = QueryModule.Files; + + + +/** + * Mutation `useCreateUpload` + * @summary Create file upload instructions + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { FilesModels.CreateFileRequestDTO } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { + const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGetEml` - recommended when file should not be cached + * @summary Get files as EML file with attachments + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.GetFilesEmlRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.getEml(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRename` + * @summary Rename file + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.fileId Path parameter + * @param { FilesModels.RenameFileRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useRename = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, fileId, data }) => + FilesApi.rename(officeId, fileId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMove` + * @summary Move files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useMove = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.move(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopy` + * @summary Copy files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.copy(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.archive(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.unarchive(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/folders/folders.api.ts b/test/generated/full/folders/folders.api.ts new file mode 100644 index 0000000..2644437 --- /dev/null +++ b/test/generated/full/folders/folders.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { FoldersModels } from "./folders.models"; + +export namespace FoldersApi { +export const getTree = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}/tree`, + config + ) +}; +export const getContent = (officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}`, + { + ...config, + params: { + order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const rename = (officeId: string, folderId: string, data: FoldersModels.RenameFolderRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}`, + ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), + config + ) +}; +export const deleteFolder = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/folders/${folderId}`, + undefined, + config + ) +}; +export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders`, + ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), + config + ) +}; +export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/folders/move`, + ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/folders/folders.models.ts b/test/generated/full/folders/folders.models.ts new file mode 100644 index 0000000..977f922 --- /dev/null +++ b/test/generated/full/folders/folders.models.ts @@ -0,0 +1,96 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace FoldersModels { +/** + * TargetEntityNameEnumSchema + * @type { enum } + */ +export const TargetEntityNameEnumSchema = z.enum(["invoice", "quote"]); +export type TargetEntityNameEnum = z.infer; +export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; + +/** + * FolderSymlinkResponseDTOSchema + * @type { object } + * @property { string } targetEntityName + * @property { string } targetEntityId + */ +export const FolderSymlinkResponseDTOSchema = z.object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }).readonly(); +export type FolderSymlinkResponseDTO = z.infer; + +/** + * FolderTreeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } isSystem + * @property { boolean } isSymlink + * @property { FolderSymlinkResponseDTO } symlink + * @property { FolderTreeResponseDTO[] } folders + */ +export const FolderTreeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), get folders() { return z.array(FolderTreeResponseDTOSchema).readonly() } }).readonly(); +export type FolderTreeResponseDTO = z.infer; + +/** + * FolderResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } archived + * @property { boolean } isSystem + * @property { boolean } isSymlink + * @property { FolderSymlinkResponseDTO } symlink + * @property { string } createdAt + * @property { string } updatedAt + * @property { CommonModels.FolderEmployeeDTO } createdBy + * @property { CommonModels.FolderEmployeeDTO } updatedBy + * @property { CommonModels.FileResponseDTO[] } files + * @property { FolderResponseDTO[] } folders + */ +export const FolderResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, files: z.array(CommonModels.FileResponseDTOSchema).readonly(), get folders() { return z.array(FolderResponseDTOSchema).readonly() } }).readonly(); +export type FolderResponseDTO = z.infer; + +/** + * FolderContentFilterDtoSchema + * @type { object } + * @property { boolean } archived When omitted, both archived and unarchived files are returned. + */ +export const FolderContentFilterDtoSchema = z.object({ archived: z.boolean().describe("When omitted, both archived and unarchived files are returned.") }).readonly(); +export type FolderContentFilterDto = z.infer; + +/** + * CreateFolderRequestDTOSchema + * @type { object } + * @property { string } parentFolderId + * @property { string } name + */ +export const CreateFolderRequestDTOSchema = z.object({ parentFolderId: z.string(), name: z.string() }).readonly(); +export type CreateFolderRequestDTO = z.infer; + +/** + * RenameFolderRequestDTOSchema + * @type { object } + * @property { string } name + */ +export const RenameFolderRequestDTOSchema = z.object({ name: z.string() }).readonly(); +export type RenameFolderRequestDTO = z.infer; + +/** + * MoveFoldersRequestDTOSchema + * @type { object } + * @property { string[] } folderIds Min Items: `1` + * @property { string } targetFolderId + */ +export const MoveFoldersRequestDTOSchema = z.object({ folderIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }).readonly(); +export type MoveFoldersRequestDTO = z.infer; + +/** + * GetContentOrderParamSchema + * @type { array } + * @description Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + */ +export const GetContentOrderParamSchema = z.array(z.string()).readonly().describe("Order by fields (comma separated with +/- prefix): name, createdAt").nullish(); +export type GetContentOrderParam = z.infer; + +} diff --git a/test/generated/full/folders/folders.queries.ts b/test/generated/full/folders/folders.queries.ts new file mode 100644 index 0000000..ef642ed --- /dev/null +++ b/test/generated/full/folders/folders.queries.ts @@ -0,0 +1,188 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FoldersModels } from "./folders.models"; +import { FoldersApi } from "./folders.api"; + +export namespace FoldersQueries { +export const moduleName = QueryModule.Folders; + +export const keys = { + all: [moduleName] as const, + getTree: (officeId: string, folderId: string) => [...keys.all, "/offices/:officeId/folders/:folderId/tree", officeId, folderId] as const, + getContent: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", officeId, folderId, limit, order, filter, page, cursor] as const, + getContentInfinite: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", "infinite", officeId, folderId, limit, order, filter, cursor] as const, +}; + +/** + * Query `useGetTree` + * @summary Get folder tree + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetTree = ({ officeId, folderId }: { officeId: string, folderId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getTree(officeId, folderId), + queryFn: () => + FoldersApi.getTree(officeId, folderId, config), + ...options, + }); +}; + +/** + * Query `useGetContent` + * @summary Get folder content + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetContent = ({ officeId, folderId, limit, order, filter, page, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), + queryFn: () => + FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `useGetContentInfinite + * @summary Get folder content + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetContentInfinite = ({ officeId, folderId, limit, order, filter, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => + FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useRename` + * @summary Rename folder + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { FoldersModels.RenameFolderRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useRename = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, folderId, data }) => + FoldersApi.rename(officeId, folderId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteFolder` + * @summary Delete folder + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteFolder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, folderId }) => + FoldersApi.deleteFolder(officeId, folderId, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create folder + * @param { string } mutation.officeId Path parameter + * @param { FoldersModels.CreateFolderRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FoldersApi.create(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMove` + * @summary Move folders + * @param { string } mutation.officeId Path parameter + * @param { FoldersModels.MoveFoldersRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useMove = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FoldersApi.move(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/hsCodes/hsCodes.acl.ts b/test/generated/full/hsCodes/hsCodes.acl.ts new file mode 100644 index 0000000..3e48e9d --- /dev/null +++ b/test/generated/full/hsCodes/hsCodes.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace HsCodesAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "HsCode" +] as AbilityTuple<"Read", "HsCode">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "HsCode" +] as AbilityTuple<"Create", "HsCode">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "HsCode" +] as AbilityTuple<"Read", "HsCode">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "HsCode" +] as AbilityTuple<"Read", "HsCode">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "HsCode" +] as AbilityTuple<"Update", "HsCode">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "HsCode" +] as AbilityTuple<"Archive", "HsCode">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "HsCode" +] as AbilityTuple<"Archive", "HsCode">; + +} diff --git a/test/generated/full/hsCodes/hsCodes.api.ts b/test/generated/full/hsCodes/hsCodes.api.ts new file mode 100644 index 0000000..ec87c77 --- /dev/null +++ b/test/generated/full/hsCodes/hsCodes.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { HsCodesModels } from "./hsCodes.models"; + +export namespace HsCodesApi { +export const paginate = (limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, + `/hs-codes`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes`, + ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, + `/hs-codes/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}`, + config + ) +}; +export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}`, + ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/hsCodes/hsCodes.configs.ts b/test/generated/full/hsCodes/hsCodes.configs.ts new file mode 100644 index 0000000..5b005a1 --- /dev/null +++ b/test/generated/full/hsCodes/hsCodes.configs.ts @@ -0,0 +1,120 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { HsCodesModels } from "./hsCodes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { HsCodesQueries } from "./hsCodes.queries"; +import { HsCodesAcl } from "./hsCodes.acl"; + +export namespace HsCodesConfigs { +export const hsCodesConfig = { + meta: { + title: "Hs Codes", + }, + readAll: { + acl: HsCodesAcl.canUsePaginate, + schema: HsCodesModels.HsCodeResponseDTOSchema, + paginated: HsCodesQueries.usePaginate, + infinite: HsCodesQueries.usePaginateInfinite, + filters: { + schema: HsCodesModels.HsCodePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: HsCodesModels.HsCodePaginationFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: HsCodesModels.HsCodeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + description: true, + customArea: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: HsCodesModels.HsCodesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: HsCodesAcl.canUseFindById, + schema: HsCodesModels.HsCodeResponseDTOSchema, + query: HsCodesQueries.useFindById, + }, + create: { + acl: HsCodesAcl.canUseCreate, + schema: HsCodesModels.CreateHsCodeRequestDTOSchema, + mutation: HsCodesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: HsCodesModels.CreateHsCodeRequestDTOSchema, + options: { + inputs: { + name: true, + description: true, + customArea: true, + }, + }, +}) + }, + update: { + acl: HsCodesAcl.canUseUpdate, + schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, + mutation: HsCodesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, + options: { + inputs: { + name: true, + description: true, + customArea: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: HsCodesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: HsCodesQueries.usePaginateLabels, + infinite: HsCodesQueries.usePaginateLabelsInfinite, + filters: { + schema: HsCodesModels.HsCodeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: HsCodesModels.HsCodeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/hsCodes/hsCodes.models.ts b/test/generated/full/hsCodes/hsCodes.models.ts new file mode 100644 index 0000000..1861991 --- /dev/null +++ b/test/generated/full/hsCodes/hsCodes.models.ts @@ -0,0 +1,111 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace HsCodesModels { +/** + * HsCodeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type HsCodeEmployeeDTO = z.infer; + +/** + * HsCodeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the HS Code + * @property { string } name Name of the HS Code + * @property { string } description Description of the HS Code + * @property { string } customArea Custom area associated with the HS Code + * @property { boolean } archived Indicates if the HS Code is archived + * @property { string } createdById + * @property { HsCodeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { HsCodeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const HsCodeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the HS Code"), name: z.string().describe("Name of the HS Code"), description: z.string().describe("Description of the HS Code"), customArea: z.string().describe("Custom area associated with the HS Code"), archived: z.boolean().describe("Indicates if the HS Code is archived"), createdById: z.string().nullish(), createdBy: HsCodeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: HsCodeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type HsCodeResponseDTO = z.infer; + +/** + * HsCodePaginationFilterDtoSchema + * @type { object } + * @property { boolean } archived Archived status + * @property { string } search + */ +export const HsCodePaginationFilterDtoSchema = z.object({ archived: z.boolean().describe("Archived status"), search: z.string() }).readonly(); +export type HsCodePaginationFilterDto = z.infer; + +/** + * HsCodeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const HsCodeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type HsCodeLabelFilterDto = z.infer; + +/** + * CreateHsCodeRequestDTOSchema + * @type { object } + * @property { string } name Unique name for the HS Code + * @property { string } description Description of the HS Code + * @property { string } customArea Custom area associated with the HS Code + */ +export const CreateHsCodeRequestDTOSchema = z.object({ name: z.string().describe("Unique name for the HS Code"), description: z.string().describe("Description of the HS Code"), customArea: z.string().describe("Custom area associated with the HS Code") }).readonly(); +export type CreateHsCodeRequestDTO = z.infer; + +/** + * UpdateHsCodeRequestDTOSchema + * @type { object } + * @property { string } name Updated name of the HS Code. + * @property { string } description Updated description of the HS Code. + * @property { string } customArea Updated custom area associated with the HS Code. + */ +export const UpdateHsCodeRequestDTOSchema = z.object({ name: z.string().describe("Updated name of the HS Code."), description: z.string().describe("Updated description of the HS Code."), customArea: z.string().describe("Updated custom area associated with the HS Code.") }).readonly(); +export type UpdateHsCodeRequestDTO = z.infer; + +/** + * HsCodesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const HsCodesPaginateOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type HsCodesPaginateOrderParamEnum = z.infer; +export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema.enum; + +/** + * HsCodesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { HsCodeResponseDTO[] } items + */ +export const HsCodesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(HsCodeResponseDTOSchema).readonly() }).readonly().shape }); +export type HsCodesPaginateResponse = z.infer; + +/** + * HsCodesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const HsCodesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type HsCodesPaginateLabelsOrderParamEnum = z.infer; +export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * HsCodesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const HsCodesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type HsCodesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/hsCodes/hsCodes.queries.ts b/test/generated/full/hsCodes/hsCodes.queries.ts new file mode 100644 index 0000000..87e8809 --- /dev/null +++ b/test/generated/full/hsCodes/hsCodes.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { HsCodesAcl } from "./hsCodes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { HsCodesModels } from "./hsCodes.models"; +import { HsCodesApi } from "./hsCodes.api"; + +export namespace HsCodesQueries { +export const moduleName = QueryModule.HsCodes; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string) => [...keys.all, "/hs-codes", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/hs-codes/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate HS Codes + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(HsCodesAcl.canUsePaginate()); + return HsCodesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate HS Codes + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(HsCodesAcl.canUsePaginate()); + return HsCodesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new HS Code + * @permission Requires `canUseCreate` ability + * @param { HsCodesModels.CreateHsCodeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(HsCodesAcl.canUseCreate()); + return HsCodesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate HS codes with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(HsCodesAcl.canUsePaginateLabels()); + return HsCodesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate HS codes with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(HsCodesAcl.canUsePaginateLabels()); + return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get HS Code Details by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(HsCodesAcl.canUseFindById()); + return HsCodesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update an existing HS Code + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { HsCodesModels.UpdateHsCodeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(HsCodesAcl.canUseUpdate()); + return HsCodesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive an HS Code + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(HsCodesAcl.canUseArchive()); + return HsCodesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive an HS Code + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(HsCodesAcl.canUseUnarchive()); + return HsCodesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/integrationChannels/integrationChannels.acl.ts b/test/generated/full/integrationChannels/integrationChannels.acl.ts new file mode 100644 index 0000000..de4ba2a --- /dev/null +++ b/test/generated/full/integrationChannels/integrationChannels.acl.ts @@ -0,0 +1,108 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace IntegrationChannelsAcl { +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List integration channels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Create", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Read integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useTestConnection` mutation ability. For global ability, omit the object parameter. + * @description Test integration channel connection + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTestConnection` mutation + */ +export const canUseTestConnection = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useListMessages` query ability. For global ability, omit the object parameter. + * @description List integration channel messages + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListMessages` query + */ +export const canUseListMessages = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("IntegrationMessage", object) : "IntegrationMessage" +] as AbilityTuple<"Read", "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, }>; + +} diff --git a/test/generated/full/integrationChannels/integrationChannels.api.ts b/test/generated/full/integrationChannels/integrationChannels.api.ts new file mode 100644 index 0000000..d1996fc --- /dev/null +++ b/test/generated/full/integrationChannels/integrationChannels.api.ts @@ -0,0 +1,87 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; + +export namespace IntegrationChannelsApi { +export const list = (officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, + `/offices/${officeId}/integration-channels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels`, + ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), + config + ) +}; +export const findById = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}`, + config + ) +}; +export const update = (officeId: string, id: string, data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}`, + ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), + config + ) +}; +export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/unarchive`, + undefined, + config + ) +}; +export const testConnection = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/test-connection`, + undefined, + config + ) +}; +export const listMessages = (officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, + `/offices/${officeId}/integration-channels/${id}/messages`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/full/integrationChannels/integrationChannels.configs.ts b/test/generated/full/integrationChannels/integrationChannels.configs.ts new file mode 100644 index 0000000..1b6f063 --- /dev/null +++ b/test/generated/full/integrationChannels/integrationChannels.configs.ts @@ -0,0 +1,155 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; +import { IntegrationChannelsQueries } from "./integrationChannels.queries"; +import { IntegrationChannelsAcl } from "./integrationChannels.acl"; + +export namespace IntegrationChannelsConfigs { +export const integrationChannelsConfig = { + meta: { + title: "Integration Channels", + }, + readAll: { + acl: IntegrationChannelsAcl.canUseList, + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + paginated: IntegrationChannelsQueries.useList, + infinite: IntegrationChannelsQueries.useListInfinite, + filters: { + schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + options: { + columns: { + id: true, + officeId: true, + businessPartnerId: true, + businessPartner: true, + employeeId: true, + name: true, + archived: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + lastPolledAt: true, + createdAt: true, + createdById: true, + createdBy: true, + updatedAt: true, + updatedById: true, + updatedBy: true, + }, + sortable: IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: IntegrationChannelsAcl.canUseFindById, + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + query: IntegrationChannelsQueries.useFindById, + }, + create: { + acl: IntegrationChannelsAcl.canUseCreate, + schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, + mutation: IntegrationChannelsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, + options: { + inputs: { + businessPartnerId: true, + employeeId: true, + name: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + sftpPassword: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + }, + }, +}) + }, + update: { + acl: IntegrationChannelsAcl.canUseUpdate, + schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, + mutation: IntegrationChannelsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, + options: { + inputs: { + businessPartnerId: true, + employeeId: true, + name: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + sftpPassword: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + }, + }, +}) + }, +}; + +export const messagesConfig = { + meta: { + title: "Messages", + }, + readAll: { + acl: IntegrationChannelsAcl.canUseListMessages, + schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, + paginated: IntegrationChannelsQueries.useListMessages, + infinite: IntegrationChannelsQueries.useListMessagesInfinite, + filters: { + schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, + options: { + inputs: { + direction: true, + format: true, + status: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, + options: { + columns: { + id: true, + integrationChannelId: true, + positionId: true, + positionNumber: true, + direction: true, + format: true, + status: true, + rawContent: true, + fileName: true, + errorMessage: true, + processedAt: true, + sentAt: true, + createdAt: true, + }, + sortable: IntegrationChannelsModels.ListMessagesOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/integrationChannels/integrationChannels.models.ts b/test/generated/full/integrationChannels/integrationChannels.models.ts new file mode 100644 index 0000000..d3f8e74 --- /dev/null +++ b/test/generated/full/integrationChannels/integrationChannels.models.ts @@ -0,0 +1,197 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace IntegrationChannelsModels { +/** + * IntegrationChannelBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const IntegrationChannelBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type IntegrationChannelBusinessPartnerResponseDto = z.infer; + +/** + * IntegrationChannelEmployeeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const IntegrationChannelEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type IntegrationChannelEmployeeResponseDto = z.infer; + +/** + * IntegrationChannelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } businessPartnerId + * @property { IntegrationChannelBusinessPartnerResponseDto } businessPartner + * @property { string } employeeId + * @property { string } name + * @property { boolean } archived + * @property { string } sftpHost + * @property { number } sftpPort + * @property { string } sftpUsername + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes + * @property { string } lastPolledAt + * @property { string } createdAt + * @property { string } createdById + * @property { IntegrationChannelEmployeeResponseDto } createdBy + * @property { string } updatedAt + * @property { string } updatedById + * @property { IntegrationChannelEmployeeResponseDto } updatedBy + */ +export const IntegrationChannelResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), businessPartnerId: z.string(), businessPartner: IntegrationChannelBusinessPartnerResponseDtoSchema, employeeId: z.string(), name: z.string(), archived: z.boolean(), sftpHost: z.string(), sftpPort: z.number(), sftpUsername: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number(), lastPolledAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), createdById: z.string(), createdBy: IntegrationChannelEmployeeResponseDtoSchema, updatedAt: z.iso.datetime({ offset: true }), updatedById: z.string(), updatedBy: IntegrationChannelEmployeeResponseDtoSchema }).readonly(); +export type IntegrationChannelResponseDto = z.infer; + +/** + * IntegrationMessageDirectionEnumSchema + * @type { enum } + */ +export const IntegrationMessageDirectionEnumSchema = z.enum(["Inbound", "Outbound"]); +export type IntegrationMessageDirectionEnum = z.infer; +export const IntegrationMessageDirectionEnum = IntegrationMessageDirectionEnumSchema.enum; + +/** + * IntegrationMessageFormatEnumSchema + * @type { enum } + */ +export const IntegrationMessageFormatEnumSchema = z.enum(["IFTMBF", "IFTMBC"]); +export type IntegrationMessageFormatEnum = z.infer; +export const IntegrationMessageFormatEnum = IntegrationMessageFormatEnumSchema.enum; + +/** + * IntegrationMessageStatusEnumSchema + * @type { enum } + */ +export const IntegrationMessageStatusEnumSchema = z.enum(["Received", "Processed", "Failed", "Sent"]); +export type IntegrationMessageStatusEnum = z.infer; +export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.enum; + +/** + * IntegrationMessageFilterDtoSchema + * @type { object } + * @property { IntegrationMessageDirectionEnum } direction + * @property { IntegrationMessageFormatEnum } format + * @property { IntegrationMessageStatusEnum } status + * @property { string } search + */ +export const IntegrationMessageFilterDtoSchema = z.object({ direction: IntegrationMessageDirectionEnumSchema, format: IntegrationMessageFormatEnumSchema, status: IntegrationMessageStatusEnumSchema, search: z.string() }).readonly(); +export type IntegrationMessageFilterDto = z.infer; + +/** + * IntegrationChannelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const IntegrationChannelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type IntegrationChannelFilterDto = z.infer; + +/** + * CreateIntegrationChannelRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } employeeId + * @property { string } name + * @property { string } sftpHost + * @property { number } sftpPort Minimum: `1`. Maximum: `65535` + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes Minimum: `1` + */ +export const CreateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string(), employeeId: z.string(), name: z.string(), sftpHost: z.string(), sftpPort: z.number().gte(1).lte(65535), sftpUsername: z.string(), sftpPassword: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number().gte(1) }).readonly(); +export type CreateIntegrationChannelRequestDto = z.infer; + +/** + * UpdateIntegrationChannelRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } employeeId + * @property { string } name + * @property { string } sftpHost + * @property { number } sftpPort Minimum: `1`. Maximum: `65535` + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes Minimum: `1` + */ +export const UpdateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string(), employeeId: z.string(), name: z.string(), sftpHost: z.string(), sftpPort: z.number().gte(1).lte(65535), sftpUsername: z.string(), sftpPassword: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number().gte(1) }).readonly(); +export type UpdateIntegrationChannelRequestDto = z.infer; + +/** + * TestConnectionResponseDtoSchema + * @type { object } + * @property { boolean } success + */ +export const TestConnectionResponseDtoSchema = z.object({ success: z.boolean() }).readonly(); +export type TestConnectionResponseDto = z.infer; + +/** + * IntegrationMessageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } integrationChannelId + * @property { string } positionId + * @property { string } positionNumber + * @property { string } direction + * @property { string } format + * @property { string } status + * @property { string } rawContent + * @property { string } fileName + * @property { string } errorMessage + * @property { string } processedAt + * @property { string } sentAt + * @property { string } createdAt + */ +export const IntegrationMessageResponseDtoSchema = z.object({ id: z.string(), integrationChannelId: z.string(), positionId: z.string().nullish(), positionNumber: z.string().nullish(), direction: z.string(), format: z.string(), status: z.string(), rawContent: z.string(), fileName: z.string(), errorMessage: z.string().nullish(), processedAt: z.iso.datetime({ offset: true }).nullish(), sentAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }) }).readonly(); +export type IntegrationMessageResponseDto = z.infer; + +/** + * IntegrationChannelsListOrderParamEnumSchema + * @type { enum } + */ +export const IntegrationChannelsListOrderParamEnumSchema = z.enum(["createdAt", "name", "businessPartner", "lastPolledAt"]); +export type IntegrationChannelsListOrderParamEnum = z.infer; +export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrderParamEnumSchema.enum; + +/** + * IntegrationChannelsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { IntegrationChannelResponseDto[] } items + */ +export const IntegrationChannelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).readonly() }).readonly().shape }); +export type IntegrationChannelsListResponse = z.infer; + +/** + * ListMessagesOrderParamEnumSchema + * @type { enum } + */ +export const ListMessagesOrderParamEnumSchema = z.enum(["createdAt", "status", "direction", "format"]); +export type ListMessagesOrderParamEnum = z.infer; +export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; + +/** + * ListMessagesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { IntegrationMessageResponseDto[] } items + */ +export const ListMessagesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).readonly() }).readonly().shape }); +export type ListMessagesResponse = z.infer; + +} diff --git a/test/generated/full/integrationChannels/integrationChannels.queries.ts b/test/generated/full/integrationChannels/integrationChannels.queries.ts new file mode 100644 index 0000000..9b9b630 --- /dev/null +++ b/test/generated/full/integrationChannels/integrationChannels.queries.ts @@ -0,0 +1,303 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { IntegrationChannelsAcl } from "./integrationChannels.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; +import { IntegrationChannelsApi } from "./integrationChannels.api"; + +export namespace IntegrationChannelsQueries { +export const moduleName = QueryModule.IntegrationChannels; + +export const keys = { + all: [moduleName] as const, + list: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/integration-channels/:id", officeId, id] as const, + listMessages: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", officeId, id, limit, order, filter, page, cursor] as const, + listMessagesInfinite: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", "infinite", officeId, id, limit, order, filter, cursor] as const, +}; + +/** + * Query `useList` + * @summary List integration channels for an office + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); + return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List integration channels for an office + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); + return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create integration channel + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { IntegrationChannelsModels.CreateIntegrationChannelRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId } )); + return IntegrationChannelsApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get integration channel by id + * @permission Requires `canUseFindById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(officeId, id), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId } )); + return IntegrationChannelsApi.findById(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update integration channel by id + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId } )); + return IntegrationChannelsApi.update(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive integration channel by id + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId } )); + return IntegrationChannelsApi.archive(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive integration channel by id + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId } )); + return IntegrationChannelsApi.unarchive(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useTestConnection` + * @summary Test integration channel SFTP connection + * @permission Requires `canUseTestConnection` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useTestConnection = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId } )); + return IntegrationChannelsApi.testConnection(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListMessages` + * @summary Paginate integration channel messages + * @permission Requires `canUseListMessages` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListMessages = ({ officeId, id, limit, order, filter, page, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListMessagesInfinite + * @summary Paginate integration channel messages + * @permission Requires `canUseListMessages` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListMessagesInfinite = ({ officeId, id, limit, order, filter, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts new file mode 100644 index 0000000..81c9083 --- /dev/null +++ b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InttraOfficeIntegrationAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Read", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +} diff --git a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.api.ts b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.api.ts new file mode 100644 index 0000000..07235c7 --- /dev/null +++ b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.api.ts @@ -0,0 +1,30 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; + +export namespace InttraOfficeIntegrationApi { +export const get = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + config + ) +}; +export const generate = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + undefined, + config + ) +}; +export const update = (officeId: string, data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.models.ts b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.models.ts new file mode 100644 index 0000000..fee95ed --- /dev/null +++ b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.models.ts @@ -0,0 +1,52 @@ +import { z } from "zod"; + +export namespace InttraOfficeIntegrationModels { +/** + * OfficeInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } rotatedByUserId + * @property { string } officeId + * @property { string } sftpUsername + * @property { string } sftpPublicKey + * @property { string } partnerCode + * @property { string } ediId + * @property { string } notificationEmail + */ +export const OfficeInttraCredentialsResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string().nullish(), officeId: z.string(), sftpUsername: z.string().nullish(), sftpPublicKey: z.string().nullish(), partnerCode: z.string().nullish(), ediId: z.string().nullish(), notificationEmail: z.string().nullish() }).readonly(); +export type OfficeInttraCredentialsResponseDto = z.infer; + +/** + * GenerateInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } publicKey + * @property { string } rotatedAt + * @property { string } rotatedByUserId + */ +export const GenerateInttraCredentialsResponseDtoSchema = z.object({ publicKey: z.string(), rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }).readonly(); +export type GenerateInttraCredentialsResponseDto = z.infer; + +/** + * UpdateInttraCredentialsRequestDtoSchema + * @type { object } + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } partnerCode + * @property { string } ediId + * @property { string } notificationEmail + */ +export const UpdateInttraCredentialsRequestDtoSchema = z.object({ sftpUsername: z.string(), sftpPassword: z.string(), partnerCode: z.string(), ediId: z.string(), notificationEmail: z.string() }).readonly(); +export type UpdateInttraCredentialsRequestDto = z.infer; + +/** + * UpdateInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } rotatedAt + * @property { string } rotatedByUserId + */ +export const UpdateInttraCredentialsResponseDtoSchema = z.object({ rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }).readonly(); +export type UpdateInttraCredentialsResponseDto = z.infer; + +} diff --git a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts new file mode 100644 index 0000000..384b020 --- /dev/null +++ b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts @@ -0,0 +1,93 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InttraOfficeIntegrationAcl } from "./inttraOfficeIntegration.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; +import { InttraOfficeIntegrationApi } from "./inttraOfficeIntegration.api"; + +export namespace InttraOfficeIntegrationQueries { +export const moduleName = QueryModule.InttraOfficeIntegration; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string) => [...keys.all, "/offices/:officeId/inttra/credentials", officeId] as const, +}; + +/** + * Query `useGet` + * @summary Get INTTRA credentials for an office + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId }: { officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId), + queryFn: () => { + checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId } )); + return InttraOfficeIntegrationApi.get(officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useGenerate` + * @summary Generate and persist INTTRA SFTP RSA key pair for an office + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId }) => { + checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId } )); + return InttraOfficeIntegrationApi.generate(officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Manually update INTTRA credentials (username/password/passphrase) + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId } )); + return InttraOfficeIntegrationApi.update(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts new file mode 100644 index 0000000..268366c --- /dev/null +++ b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts @@ -0,0 +1,56 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InttraShippingInstructionMessagesAcl { +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List SI messages + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create SI message + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; + +/** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Get SI message details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update SI message + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; + +} diff --git a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts new file mode 100644 index 0000000..0159428 --- /dev/null +++ b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts @@ -0,0 +1,46 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; + +export namespace InttraShippingInstructionMessagesApi { +export const list = (officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + filter: ZodExtended.parse(InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + }, + } + ) +}; +export const create = (officeId: string, positionId: string, shippingInstructionsId: string, data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, + ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), + config + ) +}; +export const getById = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, + config + ) +}; +export const update = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, + ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts new file mode 100644 index 0000000..fbb3b0b --- /dev/null +++ b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts @@ -0,0 +1,88 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; +import { InttraShippingInstructionMessagesQueries } from "./inttraShippingInstructionMessages.queries"; +import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; + +export namespace InttraShippingInstructionMessagesConfigs { +export const messagesConfig = { + meta: { + title: "Messages", + }, + readAll: { + acl: InttraShippingInstructionMessagesAcl.canUseList, + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, + paginated: InttraShippingInstructionMessagesQueries.useList, + infinite: InttraShippingInstructionMessagesQueries.useListInfinite, + filters: { + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, + options: { + inputs: { + status: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, + options: { + columns: { + id: true, + createdAt: true, + updatedAt: true, + shippingInstructionsId: true, + positionId: true, + createdByUserId: true, + status: true, + fileName: true, + sftpPath: true, + sentAt: true, + uploadAttemptCount: true, + lastUploadError: true, + notes: true, + contrlStatus: true, + contrlReceivedAt: true, + contrlRaw: true, + aperakStatus: true, + aperakReceivedAt: true, + aperakRaw: true, + }, + }, +}), + }, + read: { + acl: InttraShippingInstructionMessagesAcl.canUseGetById, + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema, + query: InttraShippingInstructionMessagesQueries.useGetById, + }, + create: { + acl: InttraShippingInstructionMessagesAcl.canUseCreate, + schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, + mutation: InttraShippingInstructionMessagesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, + options: { + inputs: { + isAmendment: true, + }, + }, +}) + }, + update: { + acl: InttraShippingInstructionMessagesAcl.canUseUpdate, + schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, + mutation: InttraShippingInstructionMessagesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, + options: { + inputs: { + notes: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts new file mode 100644 index 0000000..0537827 --- /dev/null +++ b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts @@ -0,0 +1,104 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InttraShippingInstructionMessagesModels { +/** + * InttraShippingInstructionStatusEnumSchema + * @type { enum } + */ +export const InttraShippingInstructionStatusEnumSchema = z.enum(["PendingUpload", "Uploaded", "ContrlAccepted", "ContrlRejected", "AperakAccepted", "AperakRejected", "FailedUpload"]); +export type InttraShippingInstructionStatusEnum = z.infer; +export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStatusEnumSchema.enum; + +/** + * ShippingInstructionMessageListItemResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } shippingInstructionsId + * @property { string } positionId + * @property { string } createdByUserId + * @property { InttraShippingInstructionStatusEnum } status + * @property { string } fileName + * @property { string } sftpPath + * @property { string } sentAt + * @property { number } uploadAttemptCount + * @property { string } lastUploadError + * @property { string } notes + * @property { string } contrlStatus + * @property { string } contrlReceivedAt + * @property { string } contrlRaw + * @property { string } aperakStatus + * @property { string } aperakReceivedAt + * @property { string } aperakRaw + */ +export const ShippingInstructionMessageListItemResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }).readonly(); +export type ShippingInstructionMessageListItemResponseDto = z.infer; + +/** + * ShippingInstructionMessageFilterDtoSchema + * @type { object } + * @property { InttraShippingInstructionStatusEnum[] } status + */ +export const ShippingInstructionMessageFilterDtoSchema = z.object({ status: z.array(InttraShippingInstructionStatusEnumSchema).readonly() }).readonly(); +export type ShippingInstructionMessageFilterDto = z.infer; + +/** + * ShippingInstructionMessageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } shippingInstructionsId + * @property { string } positionId + * @property { string } createdByUserId + * @property { InttraShippingInstructionStatusEnum } status + * @property { object } shippingInstructionSnapshot + * @property { string } renderedRequestPayload + * @property { string } fileName + * @property { string } sftpPath + * @property { string } sentAt + * @property { number } uploadAttemptCount + * @property { string } lastUploadError + * @property { string } notes + * @property { string } contrlStatus + * @property { string } contrlReceivedAt + * @property { string } contrlRaw + * @property { string } aperakStatus + * @property { string } aperakReceivedAt + * @property { string } aperakRaw + */ +export const ShippingInstructionMessageResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, shippingInstructionSnapshot: z.object({}).readonly(), renderedRequestPayload: z.string(), fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }).readonly(); +export type ShippingInstructionMessageResponseDto = z.infer; + +/** + * UpdateShippingInstructionMessageRequestDtoSchema + * @type { object } + * @property { string } notes + */ +export const UpdateShippingInstructionMessageRequestDtoSchema = z.object({ notes: z.string() }).readonly(); +export type UpdateShippingInstructionMessageRequestDto = z.infer; + +/** + * CreateShippingInstructionMessageRequestDtoSchema + * @type { object } + * @property { boolean } isAmendment Default: `false` + */ +export const CreateShippingInstructionMessageRequestDtoSchema = z.object({ isAmendment: z.boolean().default(false) }).readonly(); +export type CreateShippingInstructionMessageRequestDto = z.infer; + +/** + * InttraShippingInstructionMessagesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ShippingInstructionMessageListItemResponseDto[] } items + */ +export const InttraShippingInstructionMessagesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ShippingInstructionMessageListItemResponseDtoSchema).readonly() }).readonly().shape }); +export type InttraShippingInstructionMessagesListResponse = z.infer; + +} diff --git a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts new file mode 100644 index 0000000..f1e57ad --- /dev/null +++ b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts @@ -0,0 +1,165 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; +import { InttraShippingInstructionMessagesApi } from "./inttraShippingInstructionMessages.api"; + +export namespace InttraShippingInstructionMessagesQueries { +export const moduleName = QueryModule.InttraShippingInstructionMessages; + +export const keys = { + all: [moduleName] as const, + list: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", officeId, positionId, shippingInstructionsId, limit, page, cursor, filter] as const, + listInfinite: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", "infinite", officeId, positionId, shippingInstructionsId, limit, cursor, filter] as const, + getById: (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages/:messageId", officeId, positionId, shippingInstructionsId, messageId] as const, +}; + +/** + * Query `useList` + * @summary List Inttra shipping instruction messages for a position/BL instructions + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, positionId, shippingInstructionsId, limit, page, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), + queryFn: () => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); + return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List Inttra shipping instruction messages for a position/BL instructions + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, positionId, shippingInstructionsId, limit, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), + queryFn: ({ pageParam }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); + return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, pageParam, cursor, filter, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Inttra shipping instruction message + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.shippingInstructionsId Path parameter + * @param { InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId } )); + return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetById` + * @summary Get Inttra shipping instruction message details + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { string } object.messageId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ officeId, positionId, shippingInstructionsId, messageId }: { officeId: string, positionId: string, shippingInstructionsId: string, messageId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), + queryFn: () => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId } )); + return InttraShippingInstructionMessagesApi.getById(officeId, positionId, shippingInstructionsId, messageId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Inttra shipping instruction message + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.shippingInstructionsId Path parameter + * @param { string } mutation.messageId Path parameter + * @param { InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId } )); + return InttraShippingInstructionMessagesApi.update(officeId, positionId, shippingInstructionsId, messageId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, shippingInstructionsId, messageId } = variables; + const updateKeys = [keys.getById(officeId, positionId, shippingInstructionsId, messageId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/invoicePayments/invoicePayments.acl.ts b/test/generated/full/invoicePayments/invoicePayments.acl.ts new file mode 100644 index 0000000..e3061ca --- /dev/null +++ b/test/generated/full/invoicePayments/invoicePayments.acl.ts @@ -0,0 +1,121 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InvoicePaymentsAcl { +/** + * Use for `useListOfficePayments` query ability. For global ability, omit the object parameter. + * @description List office payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListOfficePayments` query + */ +export const canUseListOfficePayments = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useBulkCreatePayments` mutation ability. For global ability, omit the object parameter. + * @description Bulk create invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useBulkCreatePayments` mutation + */ +export const canUseBulkCreatePayments = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useCalculatePayments` mutation ability. For global ability, omit the object parameter. + * @description Calculate invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCalculatePayments` mutation + */ +export const canUseCalculatePayments = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportOfficePayments` mutation ability. For global ability, omit the object parameter. + * @description Export office invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportOfficePayments` mutation + */ +export const canUseExportOfficePayments = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("InvoicePayment", object) : "InvoicePayment" +] as AbilityTuple<"Export", "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, }>; + +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetPaymentById` query ability. For global ability, omit the object parameter. + * @description Create invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPaymentById` query + */ +export const canUseGetPaymentById = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useDeleteInvoicePayment` mutation ability. For global ability, omit the object parameter. + * @description Delete invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoicePayment` mutation + */ +export const canUseDeleteInvoicePayment = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +} diff --git a/test/generated/full/invoicePayments/invoicePayments.api.ts b/test/generated/full/invoicePayments/invoicePayments.api.ts new file mode 100644 index 0000000..170e7d1 --- /dev/null +++ b/test/generated/full/invoicePayments/invoicePayments.api.ts @@ -0,0 +1,100 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; + +export namespace InvoicePaymentsApi { +export const listOfficePayments = (officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, + `/offices/${officeId}/payments`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const bulkCreatePayments = (officeId: string, data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, + `/offices/${officeId}/payments`, + ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), + config + ) +}; +export const calculatePayments = (officeId: string, data: InvoicePaymentsModels.CalculatePaymentsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, + `/offices/${officeId}/payments/calculate`, + ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), + config + ) +}; +export const exportOfficePayments = (officeId: string, data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payments/exports`, + ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const list = (officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, invoiceId: string, data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments`, + ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), + config + ) +}; +export const getPaymentById = (officeId: string, invoiceId: string, paymentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + config + ) +}; +export const update = (officeId: string, invoiceId: string, paymentId: string, data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), + config + ) +}; +export const deleteInvoicePayment = (officeId: string, invoiceId: string, paymentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/invoicePayments/invoicePayments.configs.ts b/test/generated/full/invoicePayments/invoicePayments.configs.ts new file mode 100644 index 0000000..9f2d9ca --- /dev/null +++ b/test/generated/full/invoicePayments/invoicePayments.configs.ts @@ -0,0 +1,144 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; +import { InvoicePaymentsQueries } from "./invoicePayments.queries"; +import { InvoicePaymentsAcl } from "./invoicePayments.acl"; + +export namespace InvoicePaymentsConfigs { +export const paymentsConfig = { + meta: { + title: "Payments", + }, + readAll: { + acl: InvoicePaymentsAcl.canUseListOfficePayments, + schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, + paginated: InvoicePaymentsQueries.useListOfficePayments, + infinite: InvoicePaymentsQueries.useListOfficePaymentsInfinite, + filters: { + schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, + options: { + inputs: { + search: true, + paymentDate: true, + invoiceIssuingDate: true, + invoiceDirection: true, + createdBy: true, + businessPartner: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, + options: { + columns: { + id: true, + amount: true, + positionNumber: true, + currencyNotation: true, + paymentDate: true, + paymentMethod: true, + comment: true, + createdAt: true, + updatedAt: true, + createdBy: true, + invoice: true, + businessPartner: true, + }, + sortable: InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema, + }, +}), + }, + create: { + acl: InvoicePaymentsAcl.canUseBulkCreatePayments, + schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, + mutation: InvoicePaymentsQueries.useBulkCreatePayments, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, + options: { + inputs: { + paymentDate: true, + invoiceIds: true, + comment: true, + }, + }, +}) + }, +}; + +export const invoicesPaymentsConfig = { + meta: { + title: "Invoices Payments", + }, + readAll: { + acl: InvoicePaymentsAcl.canUseList, + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + paginated: InvoicePaymentsQueries.useList, + infinite: InvoicePaymentsQueries.useListInfinite, + columns: dynamicColumns({ + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + options: { + columns: { + id: true, + amount: true, + currencyNotation: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + bankAccount: true, + comment: true, + createdAt: true, + updatedAt: true, + createdBy: true, + }, + }, +}), + }, + read: { + acl: InvoicePaymentsAcl.canUseGetPaymentById, + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + query: InvoicePaymentsQueries.useGetPaymentById, + }, + create: { + acl: InvoicePaymentsAcl.canUseCreate, + schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, + mutation: InvoicePaymentsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, + options: { + inputs: { + amount: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + comment: true, + }, + }, +}) + }, + update: { + acl: InvoicePaymentsAcl.canUseUpdate, + schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, + mutation: InvoicePaymentsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, + options: { + inputs: { + amount: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + comment: true, + }, + }, +}) + }, + delete: { + acl: InvoicePaymentsAcl.canUseDeleteInvoicePayment, + mutation: InvoicePaymentsQueries.useDeleteInvoicePayment, + }, +}; + +} diff --git a/test/generated/full/invoicePayments/invoicePayments.models.ts b/test/generated/full/invoicePayments/invoicePayments.models.ts new file mode 100644 index 0000000..3605942 --- /dev/null +++ b/test/generated/full/invoicePayments/invoicePayments.models.ts @@ -0,0 +1,292 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicePaymentsModels { +/** + * OfficePaymentTotalAmountsDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ +export const OfficePaymentTotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); +export type OfficePaymentTotalAmountsDto = z.infer; + +/** + * OfficePaymentListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { OfficePaymentTotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const OfficePaymentListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalAmounts: z.array(OfficePaymentTotalAmountsDtoSchema).readonly(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type OfficePaymentListResponseDto = z.infer; + +/** + * OfficePaymentPreviewInvoiceDtoSchema + * @type { object } + * @property { string } id + * @property { string } invoiceNumber + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection + * @property { number } grossAmount + * @property { CommonModels.InvoiceStatusEnum } status + * @property { string } paidOn + * @property { string } issuingDate + */ +export const OfficePaymentPreviewInvoiceDtoSchema = z.object({ id: z.string(), invoiceNumber: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, grossAmount: z.number(), status: CommonModels.InvoiceStatusEnumSchema, paidOn: z.iso.datetime({ offset: true }).nullable(), issuingDate: z.iso.datetime({ offset: true }).nullable() }).readonly(); +export type OfficePaymentPreviewInvoiceDto = z.infer; + +/** + * PaymentMethodEnumSchema + * @type { enum } + */ +export const PaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); +export type PaymentMethodEnum = z.infer; +export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; + +/** + * OfficePaymentPreviewCreatedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type OfficePaymentPreviewCreatedByDto = z.infer; + +/** + * OfficePaymentBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const OfficePaymentBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); +export type OfficePaymentBusinessPartnerDto = z.infer; + +/** + * OfficePaymentPreviewDtoSchema + * @type { object } + * @property { string } id + * @property { number } amount + * @property { string } positionNumber + * @property { string } currencyNotation + * @property { string } paymentDate + * @property { PaymentMethodEnum } paymentMethod + * @property { string } comment + * @property { string } createdAt + * @property { string } updatedAt + * @property { OfficePaymentPreviewCreatedByDto } createdBy + * @property { OfficePaymentPreviewInvoiceDto } invoice + * @property { OfficePaymentBusinessPartnerDto } businessPartner + */ +export const OfficePaymentPreviewDtoSchema = z.object({ id: z.string(), amount: z.number(), positionNumber: z.string(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: OfficePaymentPreviewCreatedByDtoSchema, invoice: OfficePaymentPreviewInvoiceDtoSchema, businessPartner: OfficePaymentBusinessPartnerDtoSchema.nullish() }).readonly(); +export type OfficePaymentPreviewDto = z.infer; + +/** + * OfficeInvoicePaymentFilterDtoSchema + * @type { object } + * @property { string } search Search by invoice number + * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range + * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction + * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) + * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) + */ +export const OfficeInvoicePaymentFilterDtoSchema = z.object({ search: z.string().describe("Search by invoice number"), paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly().describe("Filter by invoice direction"), createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), businessPartner: z.array(z.string()).readonly().describe("Filter by invoice customer/business partner (array of UUIDs)") }).readonly(); +export type OfficeInvoicePaymentFilterDto = z.infer; + +/** + * BulkCreatePaymentBusinessPartnerDtoSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } name Business partner name + * @property { string } paymentDate Payment date applied to the partner invoices + */ +export const BulkCreatePaymentBusinessPartnerDtoSchema = z.object({ id: z.string().describe("Business partner ID"), name: z.string().describe("Business partner name"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date applied to the partner invoices") }).readonly(); +export type BulkCreatePaymentBusinessPartnerDto = z.infer; + +/** + * BulkCreatePaymentsResponseDtoSchema + * @type { object } + * @property { BulkCreatePaymentBusinessPartnerDto[] } businessPartners List of business partners paid in this bulk operation + */ +export const BulkCreatePaymentsResponseDtoSchema = z.object({ businessPartners: z.array(BulkCreatePaymentBusinessPartnerDtoSchema).readonly().describe("List of business partners paid in this bulk operation") }).readonly(); +export type BulkCreatePaymentsResponseDto = z.infer; + +/** + * CalculatePaymentItemDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } businessPartnerName + * @property { number } amount + * @property { string } currency + */ +export const CalculatePaymentItemDtoSchema = z.object({ businessPartnerId: z.string(), businessPartnerName: z.string(), amount: z.number(), currency: z.string() }).readonly(); +export type CalculatePaymentItemDto = z.infer; + +/** + * CalculatePaymentTotalDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currency + */ +export const CalculatePaymentTotalDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); +export type CalculatePaymentTotalDto = z.infer; + +/** + * CalculatePaymentsResponseDtoSchema + * @type { object } + * @property { CalculatePaymentItemDto[] } payments + * @property { CalculatePaymentTotalDto[] } totals + */ +export const CalculatePaymentsResponseDtoSchema = z.object({ payments: z.array(CalculatePaymentItemDtoSchema).readonly(), totals: z.array(CalculatePaymentTotalDtoSchema).readonly() }).readonly(); +export type CalculatePaymentsResponseDto = z.infer; + +/** + * OfficeInvoicePaymentExportFilterDtoSchema + * @type { object } + * @property { string } search Search by invoice number + * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range + * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction + * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) + * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) + */ +export const OfficeInvoicePaymentExportFilterDtoSchema = z.object({ search: z.string().describe("Search by invoice number"), paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly().describe("Filter by invoice direction"), createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), businessPartner: z.array(z.string()).readonly().describe("Filter by invoice customer/business partner (array of UUIDs)") }).readonly(); +export type OfficeInvoicePaymentExportFilterDto = z.infer; + +/** + * OfficeInvoicePaymentExportColumnSchema + * @type { enum } + */ +export const OfficeInvoicePaymentExportColumnSchema = z.enum(["amount", "currency", "paymentDate", "paymentMethod", "comment", "positionNumber", "invoiceNumber", "invoiceDirection", "invoiceStatus", "invoiceIssuingDate", "invoiceGrossAmount", "invoicePaidOn", "businessPartnerName", "createdByName"]); +export type OfficeInvoicePaymentExportColumn = z.infer; +export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumnSchema.enum; + +/** + * OfficeInvoicePaymentExportRequestDtoSchema + * @type { object } + * @property { OfficeInvoicePaymentExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { OfficeInvoicePaymentExportFilterDto } filter + */ +export const OfficeInvoicePaymentExportRequestDtoSchema = z.object({ columns: z.array(OfficeInvoicePaymentExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: OfficeInvoicePaymentExportFilterDtoSchema }).readonly(); +export type OfficeInvoicePaymentExportRequestDto = z.infer; + +/** + * PaymentCreatedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PaymentCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PaymentCreatedByDto = z.infer; + +/** + * PaymentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { number } amount + * @property { string } currencyNotation + * @property { string } paymentDate + * @property { PaymentMethodEnum } paymentMethod + * @property { string } bankAccountId + * @property { string } bankAccount + * @property { string } comment + * @property { string } createdAt + * @property { string } updatedAt + * @property { PaymentCreatedByDto } createdBy + */ +export const PaymentResponseDtoSchema = z.object({ id: z.string(), amount: z.number(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, bankAccountId: z.string().nullish(), bankAccount: z.string().nullish(), comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: PaymentCreatedByDtoSchema.nullish() }).readonly(); +export type PaymentResponseDto = z.infer; + +/** + * PositionInvoicePaymentMethodEnumSchema + * @type { enum } + */ +export const PositionInvoicePaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); +export type PositionInvoicePaymentMethodEnum = z.infer; +export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnumSchema.enum; + +/** + * CreateInvoicePaymentRequestDtoSchema + * @type { object } + * @property { number } amount Payment amount + * @property { string } paymentDate Payment date + * @property { PositionInvoicePaymentMethodEnum } paymentMethod Payment method + * @property { string } bankAccountId Bank account ID + * @property { string } comment Optional comment + */ +export const CreateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number().describe("Payment amount"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), paymentMethod: PositionInvoicePaymentMethodEnumSchema.describe("Payment method"), bankAccountId: z.string().describe("Bank account ID").nullish(), comment: z.string().describe("Optional comment").nullish() }).readonly(); +export type CreateInvoicePaymentRequestDto = z.infer; + +/** + * UpdateInvoicePaymentRequestDtoSchema + * @type { object } + * @property { number } amount Payment amount. Minimum: `0.01` + * @property { string } paymentDate Payment date + * @property { string } paymentMethod Payment method + * @property { string } bankAccountId Bank account ID + * @property { string } comment Payment comment + */ +export const UpdateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number().gte(0.01).describe("Payment amount"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), paymentMethod: PaymentMethodEnumSchema.describe("Payment method"), bankAccountId: z.string().describe("Bank account ID"), comment: z.string().describe("Payment comment") }).readonly(); +export type UpdateInvoicePaymentRequestDto = z.infer; + +/** + * BulkCreatePaymentsRequestDtoSchema + * @type { object } + * @property { string } paymentDate Payment date for all payments + * @property { string[] } invoiceIds List of invoice IDs to create payments for. Min Items: `1` + * @property { string } comment + */ +export const BulkCreatePaymentsRequestDtoSchema = z.object({ paymentDate: z.iso.datetime({ offset: true }).describe("Payment date for all payments"), invoiceIds: z.array(z.string()).readonly().min(1).describe("List of invoice IDs to create payments for"), comment: z.string().nullish() }).readonly(); +export type BulkCreatePaymentsRequestDto = z.infer; + +/** + * CalculatePaymentsRequestDtoSchema + * @type { object } + * @property { string[] } invoiceIds Invoice IDs (UUID v4). Min Items: `1`. Max Items: `30` + */ +export const CalculatePaymentsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).readonly().min(1).max(30).describe("Invoice IDs (UUID v4)") }).readonly(); +export type CalculatePaymentsRequestDto = z.infer; + +/** + * ListOfficePaymentsOrderParamEnumSchema + * @type { enum } + */ +export const ListOfficePaymentsOrderParamEnumSchema = z.enum(["paymentDate", "amount", "paymentMethod", "comment", "createdAt", "updatedAt", "currencyNotation", "createdByName", "invoiceNumber", "invoiceDirection", "invoiceGrossAmount", "invoiceStatus", "invoicePaidOn", "invoiceIssuingDate"]); +export type ListOfficePaymentsOrderParamEnum = z.infer; +export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnumSchema.enum; + +/** + * ListOfficePaymentsResponseSchema + * @type { object } + * @property { OfficePaymentTotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficePaymentPreviewDto[] } items + */ +export const ListOfficePaymentsResponseSchema = z.object({ ...OfficePaymentListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).readonly() }).readonly().shape }); +export type ListOfficePaymentsResponse = z.infer; + +/** + * InvoicePaymentsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PaymentResponseDto[] } items + */ +export const InvoicePaymentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentResponseDtoSchema).readonly() }).readonly().shape }); +export type InvoicePaymentsListResponse = z.infer; + +} diff --git a/test/generated/full/invoicePayments/invoicePayments.queries.ts b/test/generated/full/invoicePayments/invoicePayments.queries.ts new file mode 100644 index 0000000..228c4ea --- /dev/null +++ b/test/generated/full/invoicePayments/invoicePayments.queries.ts @@ -0,0 +1,326 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InvoicePaymentsAcl } from "./invoicePayments.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; +import { InvoicePaymentsApi } from "./invoicePayments.api"; + +export namespace InvoicePaymentsQueries { +export const moduleName = QueryModule.InvoicePayments; + +export const keys = { + all: [moduleName] as const, + listOfficePayments: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payments", officeId, limit, order, filter, page, cursor] as const, + listOfficePaymentsInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/payments", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, invoiceId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", officeId, invoiceId, limit, page, cursor] as const, + listInfinite: (officeId: string, invoiceId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", "infinite", officeId, invoiceId, limit, cursor] as const, + getPaymentById: (officeId: string, invoiceId: string, paymentId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments/:paymentId", officeId, invoiceId, paymentId] as const, +}; + +/** + * Query `useListOfficePayments` + * @summary List all payments for an office + * @permission Requires `canUseListOfficePayments` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` + * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListOfficePayments = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListOfficePaymentsInfinite + * @summary List all payments for an office + * @permission Requires `canUseListOfficePayments` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` + * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListOfficePaymentsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useBulkCreatePayments` + * @summary Bulk create payments for multiple invoices + * @permission Requires `canUseBulkCreatePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.BulkCreatePaymentsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useBulkCreatePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId } )); + return InvoicePaymentsApi.bulkCreatePayments(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCalculatePayments` + * @summary Calculate grouped payments for provided invoices + * @permission Requires `canUseCalculatePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.CalculatePaymentsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useCalculatePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId } )); + return InvoicePaymentsApi.calculatePayments(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useExportOfficePayments` - recommended when file should not be cached + * @summary Export office invoice payments to Excel + * @permission Requires `canUseExportOfficePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportOfficePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId } )); + return InvoicePaymentsApi.exportOfficePayments(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useList` + * @summary List payments for an invoice + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, invoiceId, limit, page, cursor }: { officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, invoiceId, limit, page, cursor), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); + return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List payments for an invoice + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, invoiceId, limit, cursor }: { officeId: string, invoiceId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); + return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a payment for an invoice + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicePaymentsModels.CreateInvoicePaymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId } )); + return InvoicePaymentsApi.create(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetPaymentById` + * @summary Get a payment by ID + * @permission Requires `canUseGetPaymentById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { string } object.paymentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetPaymentById = ({ officeId, invoiceId, paymentId }: { officeId: string, invoiceId: string, paymentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId } )); + return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update a payment + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.paymentId Path parameter + * @param { InvoicePaymentsModels.UpdateInvoicePaymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, paymentId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId } )); + return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId, paymentId } = variables; + const updateKeys = [keys.getPaymentById(officeId, invoiceId, paymentId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteInvoicePayment` + * @summary Delete a payment + * @permission Requires `canUseDeleteInvoicePayment` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.paymentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteInvoicePayment = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, paymentId }) => { + checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId } )); + return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/invoices/invoices.acl.ts b/test/generated/full/invoices/invoices.acl.ts new file mode 100644 index 0000000..65b9c24 --- /dev/null +++ b/test/generated/full/invoices/invoices.acl.ts @@ -0,0 +1,407 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InvoicesAcl { +/** + * Use for `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download invoices as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation + */ +export const canUseGetInvoicesEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useFind` query ability. For global ability, omit the object parameter. + * @description List invoices for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query + */ +export const canUseFind = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useChangeIncomingCustomer` mutation ability. For global ability, omit the object parameter. + * @description PositionInvoice Fix + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useChangeIncomingCustomer` mutation + */ +export const canUseChangeIncomingCustomer = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useFindByOffice` query ability. For global ability, omit the object parameter. + * @description List invoices for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByOffice` query + */ +export const canUseFindByOffice = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useCreateDraft` mutation ability. For global ability, omit the object parameter. + * @description Create invoice for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDraft` mutation + */ +export const canUseCreateDraft = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Create", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportInvoices` mutation ability. For global ability, omit the object parameter. + * @description Export invoices for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportInvoices` mutation + */ +export const canUseExportInvoices = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportCharges` mutation ability. For global ability, omit the object parameter. + * @description Export invoice charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportCharges` mutation + */ +export const canUseExportCharges = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetUnCharges` query ability. For global ability, omit the object parameter. + * @description List uninvoiced charges for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetUnCharges` query + */ +export const canUseGetUnCharges = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ +export const canUseListAvailablePartnersFor = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetOfficeUnCharges` query ability. For global ability, omit the object parameter. + * @description List uninvoiced charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetOfficeUnCharges` query + */ +export const canUseGetOfficeUnCharges = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportUnCharges` mutation ability. For global ability, omit the object parameter. + * @description Export uninvoiced charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportUnCharges` mutation + */ +export const canUseExportUnCharges = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("UninvoicedCharge", object) : "UninvoicedCharge" +] as AbilityTuple<"Export", "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, }>; + +/** + * Use for `useCreateDirect` mutation ability. For global ability, omit the object parameter. + * @description Create direct invoice for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDirect` mutation + */ +export const canUseCreateDirect = ( + object?: { officeId: string, } +) => [ + "CreateDirectInvoice", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useAddChargeToDirect` mutation ability. For global ability, omit the object parameter. + * @description Add charge to direct invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddChargeToDirect` mutation + */ +export const canUseAddChargeToDirect = ( + object?: { officeId: string, } +) => [ + "UpdateDirectInvoice", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdateCharges` mutation ability. For global ability, omit the object parameter. + * @description Update invoice charges + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCharges` mutation + */ +export const canUseUpdateCharges = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useRemoveChargeFromDirect` mutation ability. For global ability, omit the object parameter. + * @description Remove charge from direct invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRemoveChargeFromDirect` mutation + */ +export const canUseRemoveChargeFromDirect = ( + object?: { officeId: string, } +) => [ + "UpdateDirectInvoice", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetDetail` query ability. For global ability, omit the object parameter. + * @description Read invoice details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDetail` query + */ +export const canUseGetDetail = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useDeleteInvoice` mutation ability. For global ability, omit the object parameter. + * @description Delete invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoice` mutation + */ +export const canUseDeleteInvoice = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Delete", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useFix` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice accounting issues + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFix` mutation + */ +export const canUseFix = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdateIssuedVatRules` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice VAT rules + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedVatRules` mutation + */ +export const canUseUpdateIssuedVatRules = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdateIssuedCharges` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice charges + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedCharges` mutation + */ +export const canUseUpdateIssuedCharges = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useIssue` mutation ability. For global ability, omit the object parameter. + * @description Issue invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssue` mutation + */ +export const canUseIssue = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useReportHungarian` mutation ability. For global ability, omit the object parameter. + * @description Report invoice to Hungarian tax authority + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReportHungarian` mutation + */ +export const canUseReportHungarian = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGenerateIncoming` mutation ability. For global ability, omit the object parameter. + * @description Generate incoming invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIncoming` mutation + */ +export const canUseGenerateIncoming = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useRegister` mutation ability. For global ability, omit the object parameter. + * @description Register invoice for bookkeeping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRegister` mutation + */ +export const canUseRegister = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetPreview` query or `useGetPreviewMutation` mutation ability. For global ability, omit the object parameter. + * @description View invoice preview + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` query or `useGetPreviewMutation` mutation + */ +export const canUseGetPreview = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download invoice as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation + */ +export const canUseGetInvoiceEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `usePrepareDocumentUpload` mutation ability. For global ability, omit the object parameter. + * @description Upload invoice document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareDocumentUpload` mutation + */ +export const canUsePrepareDocumentUpload = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ +export const canUseCancel = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useIssueCreditNote` mutation ability. For global ability, omit the object parameter. + * @description Issue credit note invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueCreditNote` mutation + */ +export const canUseIssueCreditNote = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +} diff --git a/test/generated/full/invoices/invoices.api.ts b/test/generated/full/invoices/invoices.api.ts new file mode 100644 index 0000000..336241b --- /dev/null +++ b/test/generated/full/invoices/invoices.api.ts @@ -0,0 +1,349 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicesApi { +export const getInvoicesEml = (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/eml`, + { + ...config, + params: { + invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { type: "query", name: "invoiceIds" }), + }, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const find = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoicesFindResponseSchema }, + `/offices/${officeId}/positions/${positionId}/invoices`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const changeIncomingCustomer = (officeId: string, invoiceId: string, data: InvoicesModels.ChangeInvoiceCustomerRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/customer`, + ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), + config + ) +}; +export const findByOffice = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.FindByOfficeResponseSchema }, + `/offices/${officeId}/invoices`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createDraft = (officeId: string, data: InvoicesModels.CreateDraftInvoiceRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices`, + ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), + config + ) +}; +export const exportInvoices = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/exports`, + ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const exportCharges = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/charges/exports`, + ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getUnCharges = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.GetUnChargesResponseSchema }, + `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listAvailablePartnersFor = (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/invoices/${invoiceId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), + }, + } + ) +}; +export const getOfficeUnCharges = (officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, + `/offices/${officeId}/uninvoiced-charges`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const exportUnCharges = (officeId: string, data: InvoicesModels.UninvoicedChargesExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/uninvoiced-charges/exports`, + ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const createDirect = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/direct-invoices`, + undefined, + config + ) +}; +export const addChargeToDirect = (officeId: string, invoiceId: string, data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges`, + ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), + config + ) +}; +export const updateCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceChargesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges`, + ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), + config + ) +}; +export const removeChargeFromDirect = (officeId: string, invoiceId: string, chargeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, + undefined, + config + ) +}; +export const getDetail = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}`, + config + ) +}; +export const update = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}`, + ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), + config + ) +}; +export const deleteInvoice = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}`, + undefined, + config + ) +}; +export const fix = (officeId: string, invoiceId: string, data: InvoicesModels.FixInvoiceRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix`, + ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), + config + ) +}; +export const generate = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/document`, + undefined, + config + ) +}; +export const updateIssuedVatRules = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, + ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), + config + ) +}; +export const updateIssuedCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, + ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), + config + ) +}; +export const issue = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/issue`, + undefined, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const reportHungarian = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, + undefined, + config + ) +}; +export const generateIncoming = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, + undefined, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const register = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/register`, + undefined, + config + ) +}; +export const getPreview = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getInvoiceEml = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/eml`, + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const prepareDocumentUpload = (officeId: string, invoiceId: string, data: InvoicesModels.PrepareUploadRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/upload-document`, + ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), + config + ) +}; +export const cancel = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/cancel`, + undefined, + config + ) +}; +export const issueCreditNote = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/invoices/invoices.configs.ts b/test/generated/full/invoices/invoices.configs.ts new file mode 100644 index 0000000..3443bf9 --- /dev/null +++ b/test/generated/full/invoices/invoices.configs.ts @@ -0,0 +1,322 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { InvoicesQueries } from "./invoices.queries"; +import { InvoicesAcl } from "./invoices.acl"; + +export namespace InvoicesConfigs { +export const invoicesConfig = { + meta: { + title: "Invoices", + }, + readAll: { + acl: InvoicesAcl.canUseFindByOffice, + schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, + paginated: InvoicesQueries.useFindByOffice, + infinite: InvoicesQueries.useFindByOfficeInfinite, + filters: { + schema: CommonModels.OfficeInvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CommonModels.OfficeInvoiceFilterDtoSchema, + options: { + inputs: { + search: true, + issuingDate: true, + serviceDate: true, + invoiceDirection: true, + invoiceType: true, + collective: true, + amountMin: true, + amountMax: true, + currencyNotation: true, + vatRule: true, + dueDate: true, + status: true, + receiver: true, + receiverCountry: true, + salesRep: true, + positionNumbersString: true, + positionNumbers: true, + invoiceNumbersString: true, + invoiceNumbers: true, + bookkeepingExportStatus: true, + dunningBlock: true, + invoiceInReview: true, + isInvoiceOk: true, + isVatOk: true, + invoiceNumberMin: true, + invoiceNumberMax: true, + internalNumberMin: true, + internalNumberMax: true, + externalSystemId: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + creditorId: true, + debtorId: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, + options: { + columns: { + id: true, + createdAt: true, + invoiceNumber: true, + invoiceDirection: true, + issuingDate: true, + invoiceType: true, + collective: true, + serviceDate: true, + internalNumber: true, + reference: true, + amount: true, + netAmount: true, + tax: true, + currency: true, + dueDate: true, + status: true, + payDate: true, + paidAmount: true, + position: true, + receiver: true, + receiverCountry: true, + clerk: true, + cancelled: true, + ok: true, + isExportedToBookkeeping: true, + dunningBlock: true, + invoiceInReview: true, + vatOk: true, + comments: true, + paymentComment: true, + creditorId: true, + debtorId: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vatRules: true, + }, + sortable: InvoicesModels.FindByOfficeOrderParamEnumSchema, + }, +}), + }, + read: { + acl: InvoicesAcl.canUseGetDetail, + schema: InvoicesModels.InvoiceDetailDtoSchema, + query: InvoicesQueries.useGetDetail, + }, + create: { + acl: InvoicesAcl.canUseCreateDraft, + schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, + mutation: InvoicesQueries.useCreateDraft, + inputDefs: dynamicInputs({ + schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, + options: { + inputs: { + chargeItemIds: true, + invoiceType: true, + customerId: true, + direction: true, + }, + }, +}) + }, + update: { + acl: InvoicesAcl.canUseUpdate, + schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, + mutation: InvoicesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, + options: { + inputs: { + issuingDate: true, + receiptDate: true, + serviceDate: true, + serviceDateUntil: true, + dueDate: true, + invoiceNumber: true, + internalNumber: true, + paymentTermDays: true, + paymentTermType: true, + serviceRecipientId: true, + bankAccountId: true, + remarks: true, + language: true, + showPaymentInstructions: true, + customer: true, + salesRepId: true, + currencyNotation: true, + exchangeRate: true, + }, + }, +}) + }, + delete: { + acl: InvoicesAcl.canUseDeleteInvoice, + mutation: InvoicesQueries.useDeleteInvoice, + }, +}; + +export const uninvoicedChargesConfig = { + meta: { + title: "Uninvoiced Charges", + }, + readAll: { + acl: InvoicesAcl.canUseGetOfficeUnCharges, + schema: InvoicesModels.UninvoicedChargeDtoSchema, + paginated: InvoicesQueries.useGetOfficeUnCharges, + infinite: InvoicesQueries.useGetOfficeUnChargesInfinite, + filters: { + schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, + options: { + inputs: { + direction: true, + chargeItemId: true, + receiverIds: true, + positionIds: true, + chargeTypeIds: true, + serviceDate: true, + currencies: true, + vatRuleIds: true, + employeeIds: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InvoicesModels.UninvoicedChargeDtoSchema, + options: { + columns: { + chargeItemId: true, + invoiceDirection: true, + receiver: true, + position: true, + chargeType: true, + currencyNotation: true, + amount: true, + amountInOfficeCurrency: true, + officeCurrency: true, + exchangeRate: true, + vatRule: true, + serviceDate: true, + status: true, + missingInformation: true, + employee: true, + }, + sortable: InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema, + }, +}), + }, +}; + +export const positionsInvoicesConfig = { + meta: { + title: "Positions Invoices", + }, + readAll: { + acl: InvoicesAcl.canUseFind, + schema: InvoicesModels.InvoicePreviewDtoSchema, + paginated: InvoicesQueries.useFind, + infinite: InvoicesQueries.useFindInfinite, + filters: { + schema: InvoicesModels.InvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.InvoiceFilterDtoSchema, + options: { + inputs: { + status: true, + direction: true, + receiver: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InvoicesModels.InvoicePreviewDtoSchema, + options: { + columns: { + id: true, + invoiceDirection: true, + invoiceType: true, + invoiceNumber: true, + issuingDate: true, + amount: true, + currencyNotation: true, + status: true, + isExportedToBookkeeping: true, + internalNumber: true, + receiver: true, + representative: true, + collective: true, + creditNote: true, + cancelledInvoice: true, + }, + sortable: InvoicesModels.InvoicesFindOrderParamEnumSchema, + }, +}), + }, +}; + +export const positionsUninvoicedChargesConfig = { + meta: { + title: "Positions Uninvoiced Charges", + }, + readAll: { + acl: InvoicesAcl.canUseGetUnCharges, + schema: InvoicesModels.UninvoicedChargeDtoSchema, + paginated: InvoicesQueries.useGetUnCharges, + infinite: InvoicesQueries.useGetUnChargesInfinite, + filters: { + schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, + options: { + inputs: { + direction: true, + chargeItemId: true, + receiverId: true, + chargeTypeId: true, + serviceDate: true, + currency: true, + vatRuleId: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InvoicesModels.UninvoicedChargeDtoSchema, + options: { + columns: { + chargeItemId: true, + invoiceDirection: true, + receiver: true, + position: true, + chargeType: true, + currencyNotation: true, + amount: true, + amountInOfficeCurrency: true, + officeCurrency: true, + exchangeRate: true, + vatRule: true, + serviceDate: true, + status: true, + missingInformation: true, + employee: true, + }, + sortable: InvoicesModels.GetUnChargesOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/invoices/invoices.models.ts b/test/generated/full/invoices/invoices.models.ts new file mode 100644 index 0000000..08cb405 --- /dev/null +++ b/test/generated/full/invoices/invoices.models.ts @@ -0,0 +1,988 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicesModels { +/** + * InvoiceBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + */ +export const InvoiceBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(); +export type InvoiceBusinessPartnerResponseDto = z.infer; + +/** + * InvoiceEmployeeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoiceEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvoiceEmployeeResponseDto = z.infer; + +/** + * InvoiceRelatedInvoiceResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } internalNumber + */ +export const InvoiceRelatedInvoiceResponseDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }).readonly(); +export type InvoiceRelatedInvoiceResponseDto = z.infer; + +/** + * InvoicePreviewDtoSchema + * @type { object } + * @property { string } id + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection + * @property { CommonModels.InvoiceTypeEnum } invoiceType + * @property { string } invoiceNumber + * @property { string } issuingDate + * @property { number } amount + * @property { string } currencyNotation + * @property { CommonModels.InvoiceStatusEnum } status + * @property { boolean } isExportedToBookkeeping + * @property { string } internalNumber + * @property { InvoiceBusinessPartnerResponseDto } receiver + * @property { InvoiceEmployeeResponseDto } representative + * @property { boolean } collective + * @property { InvoiceRelatedInvoiceResponseDto } creditNote + * @property { InvoiceRelatedInvoiceResponseDto } cancelledInvoice + */ +export const InvoicePreviewDtoSchema = z.object({ id: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullable(), issuingDate: z.iso.datetime({ offset: true }).nullish(), amount: z.number(), currencyNotation: z.string(), status: CommonModels.InvoiceStatusEnumSchema, isExportedToBookkeeping: z.boolean(), internalNumber: z.string().nullish(), receiver: InvoiceBusinessPartnerResponseDtoSchema.nullish(), representative: InvoiceEmployeeResponseDtoSchema.nullish(), collective: z.boolean(), creditNote: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), cancelledInvoice: InvoiceRelatedInvoiceResponseDtoSchema.nullish() }).readonly(); +export type InvoicePreviewDto = z.infer; + +/** + * InvoicePartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const InvoicePartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); +export type InvoicePartnerDto = z.infer; + +/** + * InvoicePositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } transportType + * @property { string } ourReference + * @property { string } finalDestination + * @property { InvoicePartnerDto } shipper + * @property { InvoicePartnerDto } consignee + * @property { string } vessel + * @property { string } emptyPickup + * @property { string } loadingAddress + * @property { string } portOfLoading + * @property { string } portOfDischarge + * @property { string } carrierBl + * @property { string } houseBillOfLadingNumber + * @property { string } masterAWB + * @property { string } hawbNumber + * @property { string } flightNo + * @property { string } pickupAddress + * @property { string } originAirport + * @property { string } destinationAirport + * @property { string } originLocation + * @property { string } destinationLocation + * @property { string } dateOfDeparture + * @property { string } dateOfArrival + */ +export const InvoicePositionDtoSchema = z.object({ id: z.string(), number: z.string(), transportType: z.string(), ourReference: z.string().nullish(), finalDestination: z.string().nullish(), shipper: InvoicePartnerDtoSchema.nullish(), consignee: InvoicePartnerDtoSchema.nullish(), vessel: z.string().nullish(), emptyPickup: z.string().nullish(), loadingAddress: z.string().nullish(), portOfLoading: z.string().nullish(), portOfDischarge: z.string().nullish(), carrierBl: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterAWB: z.string().nullish(), hawbNumber: z.string().nullish(), flightNo: z.string().nullish(), pickupAddress: z.string().nullish(), originAirport: z.string().nullish(), destinationAirport: z.string().nullish(), originLocation: z.string().nullish(), destinationLocation: z.string().nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type InvoicePositionDto = z.infer; + +/** + * InvoiceChargeTypeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvoiceChargeTypeDto = z.infer; + +/** + * InvoiceVatRuleDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { number } rate + */ +export const InvoiceVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }).readonly(); +export type InvoiceVatRuleDto = z.infer; + +/** + * InvoiceFinanceLineDtoSchema + * @type { object } + * @property { string } positionChargeItemId + * @property { InvoiceChargeTypeDto } chargeType + * @property { string } additionalText + * @property { number } quantity + * @property { number } netAmount + * @property { number } grossAmount + * @property { number } sumInInvoiceCurrency + * @property { number } sumInOfficeCurrency + * @property { string } currencyNotation + * @property { number } exchangeRate + * @property { InvoiceVatRuleDto } vatRule + * @property { number } exchangedNetAmount + * @property { string } positionNumber + * @property { string } positionId + * @property { string } outgoingInvoiceId + * @property { string } registeredInvoiceId + */ +export const InvoiceFinanceLineDtoSchema = z.object({ positionChargeItemId: z.string(), chargeType: InvoiceChargeTypeDtoSchema, additionalText: z.string(), quantity: z.number(), netAmount: z.number(), grossAmount: z.number(), sumInInvoiceCurrency: z.number().nullish(), sumInOfficeCurrency: z.number().nullish(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), vatRule: InvoiceVatRuleDtoSchema, exchangedNetAmount: z.number().nullish(), positionNumber: z.string().nullish(), positionId: z.string().nullish(), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish() }).readonly(); +export type InvoiceFinanceLineDto = z.infer; + +/** + * InvoiceConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl + * @property { string } headerImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ +export const InvoiceConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); +export type InvoiceConfigDto = z.infer; + +/** + * InvoiceCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { string } address + * @property { string } vatNumber + * @property { string } reference + * @property { string } contact + * @property { string } partnerRegistrationNumber + */ +export const InvoiceCustomerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string().nullish(), label: z.string().nullish(), address: z.string().nullish(), vatNumber: z.string(), reference: z.string().nullish(), contact: z.string().nullish(), partnerRegistrationNumber: z.string().nullish() }).readonly(); +export type InvoiceCustomerDto = z.infer; + +/** + * InvoiceOfficeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvoiceOfficeDto = z.infer; + +/** + * InvoiceSalesRepDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } phoneNumber + */ +export const InvoiceSalesRepDtoSchema = z.object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }).readonly(); +export type InvoiceSalesRepDto = z.infer; + +/** + * InvoiceServiceRecipientDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } address + * @property { string } vatNumber + * @property { string } partnerRegistrationNumber + */ +export const InvoiceServiceRecipientDtoSchema = z.object({ id: z.string(), name: z.string(), address: z.string().nullish(), vatNumber: z.string(), partnerRegistrationNumber: z.string().nullish() }).readonly(); +export type InvoiceServiceRecipientDto = z.infer; + +/** + * InvoiceBankAccountDtoSchema + * @type { object } + * @property { string } id + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + * @property { string } name + * @property { boolean } useFooterOnInvoice + * @property { object } footer + * @property { string } footer.mediaUrl + */ +export const InvoiceBankAccountDtoSchema = z.object({ id: z.string(), displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string(), name: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).readonly().nullish() }).readonly(); +export type InvoiceBankAccountDto = z.infer; + +/** + * InvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const InvoiceRemarksDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export type InvoiceRemarksDto = z.infer; + +/** + * InvoiceVatLineDtoSchema + * @type { object } + * @property { string } vatRuleId ID of the VAT rule + * @property { string } name Name of the VAT rule + * @property { string } printNumber Reference numerical string for vat rules + * @property { string } matchCode Match code of the VAT rule + * @property { number } vatPercentage The actual VAT rate (e.g., 19 for 19%) + * @property { number } netAmount Sum of net amounts from financeLines using this vatRuleId + * @property { number } vatAmount Calculated total VAT for this rate (netAmount * vatPercentage / 100) + * @property { number } grossAmount Sum of netAmount + vatAmount for this rate + * @property { number } vatAmountInOfficeCurrency + * @property { number } netAmountInOfficeCurrency + * @property { number } grossAmountInOfficeCurrency + */ +export const InvoiceVatLineDtoSchema = z.object({ vatRuleId: z.string().describe("ID of the VAT rule"), name: z.string().describe("Name of the VAT rule"), printNumber: z.string().describe("Reference numerical string for vat rules"), matchCode: z.string().describe("Match code of the VAT rule"), vatPercentage: z.number().describe("The actual VAT rate (e.g., 19 for 19%)"), netAmount: z.number().describe("Sum of net amounts from financeLines using this vatRuleId"), vatAmount: z.number().describe("Calculated total VAT for this rate (netAmount * vatPercentage / 100)"), grossAmount: z.number().describe("Sum of netAmount + vatAmount for this rate"), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish() }).readonly(); +export type InvoiceVatLineDto = z.infer; + +/** + * RelatedInvoiceDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } internalNumber + */ +export const RelatedInvoiceDetailDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }).readonly(); +export type RelatedInvoiceDetailDto = z.infer; + +/** + * InvoiceLanguageEnumSchema + * @type { enum } + */ +export const InvoiceLanguageEnumSchema = z.enum(["en", "de", "sl", "hu", "cs"]); +export type InvoiceLanguageEnum = z.infer; +export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; + +/** + * InvoiceDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } rootFolderId + * @property { string } invoiceDirection + * @property { string } invoiceType + * @property { string } invoiceNumber + * @property { string } costCenter + * @property { string } status + * @property { string } language + * @property { boolean } isVatOk + * @property { boolean } isInvoiceOk + * @property { string } issuingDate + * @property { string } receiptDate + * @property { string } serviceDate + * @property { string } serviceDateUntil + * @property { string } dueDate + * @property { string } internalNumber + * @property { boolean } isExportedToBookkeeping + * @property { string } sentAt + * @property { string } creditNoteId + * @property { string } draftCreditNoteId + * @property { string } cancelledInvoiceId + * @property { string } uploadedDocumentUrl + * @property { InvoiceCustomerDto } customer + * @property { string } customerNumber + * @property { string } customerNameOverride + * @property { string } customerReferenceOverride + * @property { string } customerContactOverride + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { InvoicePositionDto } position + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { InvoiceOfficeDto } salesOffice + * @property { InvoiceSalesRepDto } salesRep + * @property { number } totalNet + * @property { number } totalVat + * @property { number } totalGross + * @property { string } currencyNotation + * @property { number } exchangeRate + * @property { number } paymentTermDays + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { InvoiceServiceRecipientDto } serviceRecipient + * @property { boolean } showPaymentInstructions + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { string } comments + * @property { InvoiceBankAccountDto } bankAccount + * @property { InvoiceFinanceLineDto[] } financeLines + * @property { InvoiceRemarksDto } remarks + * @property { InvoiceVatLineDto[] } vatLines + * @property { InvoiceConfigDto } config + * @property { RelatedInvoiceDetailDto } creditNote + * @property { RelatedInvoiceDetailDto } draftCreditNote + * @property { RelatedInvoiceDetailDto } cancelledInvoice + * @property { string } officeCurrencyNotation + * @property { string } inverseCurrencyNotation + * @property { number } inverseExchangeRate + * @property { boolean } requiresSpecialTablePresentation + * @property { number } paidAmount + * @property { number } outstandingAmount + * @property { string } paidOn + * @property { boolean } isIssued + * @property { number } grossAmountInOfficeCurrency + * @property { string } createdAt + */ +export const InvoiceDetailDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullish(), costCenter: z.string().nullish(), status: CommonModels.InvoiceStatusEnumSchema, language: InvoiceLanguageEnumSchema, isVatOk: z.boolean(), isInvoiceOk: z.boolean(), issuingDate: z.iso.datetime({ offset: true }).nullish(), receiptDate: z.iso.datetime({ offset: true }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), isExportedToBookkeeping: z.boolean(), sentAt: z.iso.datetime({ offset: true }).nullish(), creditNoteId: z.string().nullish(), draftCreditNoteId: z.string().nullish(), cancelledInvoiceId: z.string().nullish(), uploadedDocumentUrl: z.string().nullish(), customer: InvoiceCustomerDtoSchema.nullish(), customerNumber: z.string().nullish(), customerNameOverride: z.string().nullish(), customerReferenceOverride: z.string().nullish(), customerContactOverride: z.string().nullish(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), position: InvoicePositionDtoSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesOffice: InvoiceOfficeDtoSchema, salesRep: InvoiceSalesRepDtoSchema, totalNet: z.number(), totalVat: z.number().nullish(), totalGross: z.number(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), paymentTermDays: z.number().nullish(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), showPaymentInstructions: z.boolean().nullish(), dunningBlock: z.boolean().nullish(), invoiceInReview: z.boolean().nullish(), comments: z.string().nullish(), bankAccount: InvoiceBankAccountDtoSchema.nullish(), financeLines: z.array(InvoiceFinanceLineDtoSchema).readonly(), remarks: InvoiceRemarksDtoSchema.nullish(), vatLines: z.array(InvoiceVatLineDtoSchema).readonly(), config: InvoiceConfigDtoSchema.nullish(), creditNote: RelatedInvoiceDetailDtoSchema.nullish(), draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), officeCurrencyNotation: z.string().nullish(), inverseCurrencyNotation: z.string().nullish(), inverseExchangeRate: z.number().nullish(), requiresSpecialTablePresentation: z.boolean().nullish(), paidAmount: z.number(), outstandingAmount: z.number(), paidOn: z.iso.datetime({ offset: true }).nullish(), isIssued: z.boolean(), grossAmountInOfficeCurrency: z.number().nullish(), createdAt: z.iso.datetime({ offset: true }) }).readonly(); +export type InvoiceDetailDto = z.infer; + +/** + * TotalAmountsDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ +export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); +export type TotalAmountsDto = z.infer; + +/** + * OfficeInvoiceListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalAmountInDefaultCurrency + * @property { string } defaultCurrencyNotation + * @property { TotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const OfficeInvoiceListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalAmountInDefaultCurrency: z.number().nullish(), defaultCurrencyNotation: z.string().nullish(), totalAmounts: z.array(TotalAmountsDtoSchema).readonly(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type OfficeInvoiceListResponseDto = z.infer; + +/** + * InvoicePreviewPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } externalSystemId + */ +export const InvoicePreviewPositionDtoSchema = z.object({ id: z.string(), number: z.string(), externalSystemId: z.string().nullish() }).readonly(); +export type InvoicePreviewPositionDto = z.infer; + +/** + * InvoicePreviewReceiverDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + */ +export const InvoicePreviewReceiverDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(); +export type InvoicePreviewReceiverDto = z.infer; + +/** + * InvoicePreviewReceiverCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoicePreviewReceiverCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvoicePreviewReceiverCountryDto = z.infer; + +/** + * InvoicePreviewClerkDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoicePreviewClerkDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvoicePreviewClerkDto = z.infer; + +/** + * VatRuleLabelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } matchCode + * @property { string } name + */ +export const VatRuleLabelResponseDtoSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string() }).readonly(); +export type VatRuleLabelResponseDto = z.infer; + +/** + * OfficeInvoicePreviewDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } invoiceNumber + * @property { string } invoiceDirection + * @property { string } issuingDate + * @property { CommonModels.InvoiceTypeEnum } invoiceType + * @property { boolean } collective + * @property { string } serviceDate + * @property { string } internalNumber + * @property { string } reference + * @property { number } amount + * @property { number } netAmount + * @property { number } tax + * @property { string } currency + * @property { string } dueDate + * @property { CommonModels.InvoiceStatusEnum } status + * @property { string } payDate + * @property { number } paidAmount + * @property { InvoicePreviewPositionDto } position + * @property { InvoicePreviewReceiverDto } receiver + * @property { InvoicePreviewReceiverCountryDto } receiverCountry + * @property { InvoicePreviewClerkDto } clerk + * @property { boolean } cancelled + * @property { boolean } ok + * @property { boolean } isExportedToBookkeeping + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { boolean } vatOk + * @property { string } comments + * @property { string } paymentComment + * @property { string } creditorId + * @property { string } debtorId + * @property { string } hblNumber + * @property { string } mblNumber + * @property { string } bookingNumber + * @property { string } vessel + * @property { string } voyage + * @property { VatRuleLabelResponseDto[] } vatRules + */ +export const OfficeInvoicePreviewDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), invoiceNumber: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, issuingDate: z.iso.datetime({ offset: true }).nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema, collective: z.boolean(), serviceDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), reference: z.string().nullish(), amount: z.number(), netAmount: z.number(), tax: z.number(), currency: z.string(), dueDate: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.InvoiceStatusEnumSchema, payDate: z.iso.datetime({ offset: true }).nullish(), paidAmount: z.number().nullish(), position: InvoicePreviewPositionDtoSchema.nullish(), receiver: InvoicePreviewReceiverDtoSchema.nullish(), receiverCountry: InvoicePreviewReceiverCountryDtoSchema.nullish(), clerk: InvoicePreviewClerkDtoSchema.nullish(), cancelled: z.boolean(), ok: z.boolean(), isExportedToBookkeeping: z.boolean(), dunningBlock: z.boolean(), invoiceInReview: z.boolean(), vatOk: z.boolean(), comments: z.string().nullish(), paymentComment: z.string().nullish(), creditorId: z.string().nullish(), debtorId: z.string().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vatRules: z.array(VatRuleLabelResponseDtoSchema).readonly().nullish() }).readonly(); +export type OfficeInvoicePreviewDto = z.infer; + +/** + * InvoiceExportFilterDtoSchema + * @type { object } + * @property { string } search + * @property { CommonModels.DateRangeDto } issuingDate + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection + * @property { CommonModels.InvoiceTypeEnum[] } invoiceType + * @property { CommonModels.BooleanFilterEnum[] } collective + * @property { number } amountMin + * @property { number } amountMax + * @property { string[] } currencyNotation + * @property { CommonModels.DateRangeDto } dueDate + * @property { CommonModels.InvoiceStatusEnum[] } status + * @property { string[] } receiver Filter by invoice receiver/customer ID (UUID) + * @property { string } positionNumbersString + * @property { string[] } positionNumbers + * @property { string } invoiceNumbersString + * @property { string[] } invoiceNumbers + * @property { CommonModels.BooleanFilterEnum[] } bookkeepingExportStatus + * @property { CommonModels.BooleanFilterEnum[] } dunningBlock + * @property { CommonModels.BooleanFilterEnum[] } invoiceInReview + * @property { CommonModels.BooleanFilterEnum[] } isInvoiceOk + * @property { CommonModels.BooleanFilterEnum[] } isVatOk + * @property { number } invoiceNumberMin + * @property { number } invoiceNumberMax + * @property { number } internalNumberMin + * @property { number } internalNumberMax + */ +export const InvoiceExportFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer ID (UUID)"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number() }).readonly(); +export type InvoiceExportFilterDto = z.infer; + +/** + * InvoiceExportColumnSchema + * @type { enum } + */ +export const InvoiceExportColumnSchema = z.enum(["invoiceNumber", "invoiceDirection", "issuingDate", "invoiceType", "collective", "serviceDate", "internalNumber", "reference", "totalGross", "totalNet", "totalVat", "currency", "dueDate", "status", "payDate", "paidAmount", "positionNumber", "hblHawb", "mblMawb", "bookingNumber", "vessel", "voyage", "receiverName", "receiverCountry", "clerkName", "cancelled", "ok", "vatOk", "dunningBlock", "invoiceInReview", "exportedToBookkeeping", "comments", "paymentComment", "vatRuleIds", "creditorId", "debtorId", "createdAt"]); +export type InvoiceExportColumn = z.infer; +export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; + +/** + * InvoiceExportRequestDtoSchema + * @type { object } + * @property { InvoiceExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { InvoiceExportFilterDto } filter + */ +export const InvoiceExportRequestDtoSchema = z.object({ columns: z.array(InvoiceExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: InvoiceExportFilterDtoSchema }).readonly(); +export type InvoiceExportRequestDto = z.infer; + +/** + * UninvoicedChargeTotalAmountDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ +export const UninvoicedChargeTotalAmountDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); +export type UninvoicedChargeTotalAmountDto = z.infer; + +/** + * UninvoicedChargeListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const UninvoicedChargeListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalAmounts: z.array(UninvoicedChargeTotalAmountDtoSchema).readonly(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type UninvoicedChargeListResponseDto = z.infer; + +/** + * ReceiverDtoSchema + * @type { object } + * @property { string } id Business Partner ID (Customer or Vendor) + * @property { string } name Business Partner name + * @property { string } matchCode Business Partner match code + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const ReceiverDtoSchema = z.object({ id: z.string().describe("Business Partner ID (Customer or Vendor)"), name: z.string().describe("Business Partner name"), matchCode: z.string().describe("Business Partner match code"), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); +export type ReceiverDto = z.infer; + +/** + * UninvoicedChargePositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type UninvoicedChargePositionDto = z.infer; + +/** + * UninvoicedChargeChargeTypeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const UninvoicedChargeChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type UninvoicedChargeChargeTypeDto = z.infer; + +/** + * UninvoicedChargeVatRuleDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchcode + */ +export const UninvoicedChargeVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly(); +export type UninvoicedChargeVatRuleDto = z.infer; + +/** + * UninvoicedChargeGroupStatusEnumSchema + * @type { enum } + */ +export const UninvoicedChargeGroupStatusEnumSchema = z.enum(["ReadyForInvoice", "MissingInformation"]); +export type UninvoicedChargeGroupStatusEnum = z.infer; +export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSchema.enum; + +/** + * UninvoicedChargeEmployeeDtoSchema + * @type { object } + * @property { string } id + * @property { string } firstName + * @property { string } lastName + * @property { string } fullName + */ +export const UninvoicedChargeEmployeeDtoSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }).readonly(); +export type UninvoicedChargeEmployeeDto = z.infer; + +/** + * UninvoicedChargeDtoSchema + * @type { object } + * @property { string } chargeItemId + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection Invoice direction (Incoming or Outgoing) + * @property { ReceiverDto } receiver Business Partner receiving the invoice + * @property { UninvoicedChargePositionDto } position + * @property { UninvoicedChargeChargeTypeDto } chargeType + * @property { string } currencyNotation ISO 4217 currency code + * @property { number } amount Charge amount in charge currency + * @property { number } amountInOfficeCurrency Charge amount in office currency + * @property { string } officeCurrency Office currency code + * @property { number } exchangeRate + * @property { UninvoicedChargeVatRuleDto } vatRule + * @property { string } serviceDate + * @property { UninvoicedChargeGroupStatusEnum } status Status of charge group + * @property { string[] } missingInformation Missing fields required for invoicing this charge + * @property { UninvoicedChargeEmployeeDto } employee + */ +export const UninvoicedChargeDtoSchema = z.object({ chargeItemId: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction (Incoming or Outgoing)"), receiver: ReceiverDtoSchema.describe("Business Partner receiving the invoice"), position: UninvoicedChargePositionDtoSchema, chargeType: UninvoicedChargeChargeTypeDtoSchema.nullish(), currencyNotation: z.string().describe("ISO 4217 currency code"), amount: z.number().describe("Charge amount in charge currency"), amountInOfficeCurrency: z.number().describe("Charge amount in office currency"), officeCurrency: z.string().describe("Office currency code"), exchangeRate: z.number().nullish(), vatRule: UninvoicedChargeVatRuleDtoSchema.nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), status: UninvoicedChargeGroupStatusEnumSchema.describe("Status of charge group"), missingInformation: z.array(z.string()).readonly().describe("Missing fields required for invoicing this charge").nullish(), employee: UninvoicedChargeEmployeeDtoSchema.nullish() }).readonly(); +export type UninvoicedChargeDto = z.infer; + +/** + * UninvoicedChargePaginationDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string } receiverId + * @property { string } chargeTypeId + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currency + * @property { string } vatRuleId + */ +export const UninvoicedChargePaginationDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), chargeItemId: z.string(), receiverId: z.string(), chargeTypeId: z.string(), serviceDate: CommonModels.DateRangeDtoSchema, currency: z.array(z.string()).readonly(), vatRuleId: z.string() }).readonly(); +export type UninvoicedChargePaginationDto = z.infer; + +/** + * UninvoicedChargesFilterDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string[] } receiverIds + * @property { string[] } positionIds + * @property { string[] } chargeTypeIds + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currencies + * @property { string[] } vatRuleIds + * @property { string[] } employeeIds + */ +export const UninvoicedChargesFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), chargeItemId: z.string(), receiverIds: z.array(z.string()).readonly(), positionIds: z.array(z.string()).readonly(), chargeTypeIds: z.array(z.string()).readonly(), serviceDate: CommonModels.DateRangeDtoSchema, currencies: z.array(z.string()).readonly(), vatRuleIds: z.array(z.string()).readonly(), employeeIds: z.array(z.string()).readonly() }).readonly(); +export type UninvoicedChargesFilterDto = z.infer; + +/** + * UninvoicedChargesExportFilterDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string[] } receiverIds + * @property { string[] } positionIds + * @property { string[] } chargeTypeIds + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currencies + * @property { string[] } vatRuleIds + */ +export const UninvoicedChargesExportFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), chargeItemId: z.string(), receiverIds: z.array(z.string()).readonly(), positionIds: z.array(z.string()).readonly(), chargeTypeIds: z.array(z.string()).readonly(), serviceDate: CommonModels.DateRangeDtoSchema, currencies: z.array(z.string()).readonly(), vatRuleIds: z.array(z.string()).readonly() }).readonly(); +export type UninvoicedChargesExportFilterDto = z.infer; + +/** + * UninvoicedChargeExportColumnSchema + * @type { enum } + */ +export const UninvoicedChargeExportColumnSchema = z.enum(["chargeItemId", "invoiceDirection", "status", "receiverName", "positionNumber", "serviceDate", "employee", "chargeTypeName", "amount", "currency", "exchangeRate", "amountInOfficeCurrency", "officeCurrency", "vatRule"]); +export type UninvoicedChargeExportColumn = z.infer; +export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.enum; + +/** + * UninvoicedChargesExportRequestDtoSchema + * @type { object } + * @property { UninvoicedChargeExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { UninvoicedChargesExportFilterDto } filter + */ +export const UninvoicedChargesExportRequestDtoSchema = z.object({ columns: z.array(UninvoicedChargeExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: UninvoicedChargesExportFilterDtoSchema }).readonly(); +export type UninvoicedChargesExportRequestDto = z.infer; + +/** + * CreateDraftInvoiceRequestDtoSchema + * @type { object } + * @property { string[] } chargeItemIds Charge item IDs to include in the invoice. Min Items: `1` + * @property { CommonModels.InvoiceTypeEnum } invoiceType Type of invoice + * @property { string } customerId Customer ID (required for outgoing invoices) + * @property { CommonModels.InvoiceDirectionEnum } direction Invoice direction + */ +export const CreateDraftInvoiceRequestDtoSchema = z.object({ chargeItemIds: z.array(z.string()).readonly().min(1).describe("Charge item IDs to include in the invoice").nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema.describe("Type of invoice"), customerId: z.string().describe("Customer ID (required for outgoing invoices)"), direction: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction") }).readonly(); +export type CreateDraftInvoiceRequestDto = z.infer; + +/** + * UpdateInvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const UpdateInvoiceRemarksDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export type UpdateInvoiceRemarksDto = z.infer; + +/** + * UpdateInvoiceCustomerDtoSchema + * @type { object } + * @property { string } name + * @property { string } reference + * @property { string } contact + */ +export const UpdateInvoiceCustomerDtoSchema = z.object({ name: z.string(), reference: z.string(), contact: z.string() }).readonly(); +export type UpdateInvoiceCustomerDto = z.infer; + +/** + * UpdateInvoiceRequestDtoSchema + * @type { object } + * @property { string } issuingDate Invoice date in ISO format + * @property { string } receiptDate Receipt date in ISO format + * @property { string } serviceDate Service date in ISO format + * @property { string } serviceDateUntil Service end date in ISO format + * @property { string } dueDate Due date in ISO format + * @property { string } invoiceNumber Invoice number + * @property { string } internalNumber Internal reference number + * @property { number } paymentTermDays Payment term in days + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { string } serviceRecipientId Service recipient ID + * @property { string } bankAccountId Bank account ID + * @property { UpdateInvoiceRemarksDto } remarks Additional remarks + * @property { InvoiceLanguageEnum } language Invoice language + * @property { boolean } showPaymentInstructions + * @property { UpdateInvoiceCustomerDto } customer + * @property { string } salesRepId + * @property { string } currencyNotation + * @property { number } exchangeRate Invoice exchange rate + */ +export const UpdateInvoiceRequestDtoSchema = z.object({ issuingDate: z.iso.datetime({ offset: true }).describe("Invoice date in ISO format"), receiptDate: z.iso.datetime({ offset: true }).describe("Receipt date in ISO format"), serviceDate: z.iso.datetime({ offset: true }).describe("Service date in ISO format"), serviceDateUntil: z.iso.datetime({ offset: true }).describe("Service end date in ISO format"), dueDate: z.iso.datetime({ offset: true }).describe("Due date in ISO format").nullable(), invoiceNumber: z.string().describe("Invoice number").nullable(), internalNumber: z.string().describe("Internal reference number").nullable(), paymentTermDays: z.number().describe("Payment term in days").nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, serviceRecipientId: z.string().describe("Service recipient ID").nullable(), bankAccountId: z.string().describe("Bank account ID").nullable(), remarks: UpdateInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), language: InvoiceLanguageEnumSchema.describe("Invoice language"), showPaymentInstructions: z.boolean(), customer: UpdateInvoiceCustomerDtoSchema, salesRepId: z.string(), currencyNotation: z.string(), exchangeRate: z.number().describe("Invoice exchange rate").nullable() }).readonly(); +export type UpdateInvoiceRequestDto = z.infer; + +/** + * FixInvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const FixInvoiceRemarksDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export type FixInvoiceRemarksDto = z.infer; + +/** + * FixInvoiceCustomerDtoSchema + * @type { object } + * @property { string } reference Customer reference number + */ +export const FixInvoiceCustomerDtoSchema = z.object({ reference: z.string().describe("Customer reference number") }).readonly(); +export type FixInvoiceCustomerDto = z.infer; + +/** + * FixInvoiceRequestDtoSchema + * @type { object } + * @property { string } currencyNotation Invoice currency (incoming invoices only) + * @property { string } issuingDate Update invoice date in ISO format + * @property { string } dueDate Update invoice due date in ISO format + * @property { number } exchangeRate Invoice exchange rate + * @property { number } paymentTermDays Payment term in days + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { string } receiptDate Update receipt date in ISO format + * @property { string } serviceDate Update service date in ISO format + * @property { string } serviceDateUntil Update service end date in ISO format + * @property { boolean } isVatOk Mark VAT as checked/OK by accounting + * @property { boolean } isInvoiceOk Mark overall invoice as checked/OK by accounting + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { string } comments + * @property { FixInvoiceRemarksDto } remarks Additional remarks + * @property { string } invoiceNumber Invoice number (incoming invoices only) + * @property { string } bankAccountId Bank account ID + * @property { string } serviceRecipientId Service recipient ID + * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) + */ +export const FixInvoiceRequestDtoSchema = z.object({ currencyNotation: z.string().describe("Invoice currency (incoming invoices only)"), issuingDate: z.iso.datetime({ offset: true }).describe("Update invoice date in ISO format"), dueDate: z.iso.datetime({ offset: true }).describe("Update invoice due date in ISO format"), exchangeRate: z.number().describe("Invoice exchange rate").nullable(), paymentTermDays: z.number().describe("Payment term in days").nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, receiptDate: z.iso.datetime({ offset: true }).describe("Update receipt date in ISO format"), serviceDate: z.iso.datetime({ offset: true }).describe("Update service date in ISO format").nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).describe("Update service end date in ISO format"), isVatOk: z.boolean().describe("Mark VAT as checked/OK by accounting"), isInvoiceOk: z.boolean().describe("Mark overall invoice as checked/OK by accounting"), dunningBlock: z.boolean(), invoiceInReview: z.boolean(), comments: z.string(), remarks: FixInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), invoiceNumber: z.string().describe("Invoice number (incoming invoices only)").nullable(), bankAccountId: z.string().describe("Bank account ID").nullable(), serviceRecipientId: z.string().describe("Service recipient ID").nullable(), customer: FixInvoiceCustomerDtoSchema.describe("Customer reference (incoming invoices only)") }).readonly(); +export type FixInvoiceRequestDto = z.infer; + +/** + * UpdateIssuedInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity. Minimum: `0` + * @property { number } amount Amount (must be positive). Minimum: `0.01` + * @property { string } vatRuleId VAT rule ID + * @property { number } exchangeRate Charge exchange rate (incoming invoices only) + * @property { string } currencyNotation + */ +export const UpdateIssuedInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string().describe("Position charge item ID"), chargeTypeId: z.string().describe("Charge type ID").nullish(), additionalText: z.string().describe("Additional text for the charge").nullish(), quantity: z.number().gte(0).describe("Quantity").nullish(), amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), vatRuleId: z.string().describe("VAT rule ID").nullish(), exchangeRate: z.number().describe("Charge exchange rate (incoming invoices only)").nullish(), currencyNotation: z.string().nullish() }).readonly(); +export type UpdateIssuedInvoiceChargeRequestDto = z.infer; + +/** + * UpdateIssuedInvoiceChargesRequestDtoSchema + * @type { object } + * @property { UpdateIssuedInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` + */ +export const UpdateIssuedInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateIssuedInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates") }).readonly(); +export type UpdateIssuedInvoiceChargesRequestDto = z.infer; + +/** + * UpdateInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity. Minimum: `0` + * @property { number } amount Amount (must be positive). Minimum: `0.01` + * @property { string } vatRuleId VAT rule ID + * @property { number } exchangeRate + * @property { string } currencyNotation + */ +export const UpdateInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string().describe("Position charge item ID"), chargeTypeId: z.string().describe("Charge type ID").nullish(), additionalText: z.string().describe("Additional text for the charge").nullish(), quantity: z.number().gte(0).describe("Quantity").nullish(), amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), vatRuleId: z.string().describe("VAT rule ID").nullish(), exchangeRate: z.number().nullish(), currencyNotation: z.string().nullish() }).readonly(); +export type UpdateInvoiceChargeRequestDto = z.infer; + +/** + * UpdateInvoiceChargesRequestDtoSchema + * @type { object } + * @property { UpdateInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` + */ +export const UpdateInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates") }).readonly(); +export type UpdateInvoiceChargesRequestDto = z.infer; + +/** + * InvoiceFilterDtoSchema + * @type { object } + * @property { string[] } status + * @property { string } direction + * @property { string } receiver Filter by invoice receiver/customer ID (UUID) + */ +export const InvoiceFilterDtoSchema = z.object({ status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), direction: CommonModels.InvoiceDirectionEnumSchema, receiver: z.string().describe("Filter by invoice receiver/customer ID (UUID)") }).readonly(); +export type InvoiceFilterDto = z.infer; + +/** + * ChangeInvoiceCustomerRequestDtoSchema + * @type { object } + * @property { string } newCustomerId + */ +export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }).readonly(); +export type ChangeInvoiceCustomerRequestDto = z.infer; + +/** + * CreateDirectInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const CreateDirectInvoiceChargeRequestDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount"), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount"), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export type CreateDirectInvoiceChargeRequestDto = z.infer; + +/** + * UpdateIssuedInvoiceVatRulesRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } vatRuleId VAT rule ID + */ +export const UpdateIssuedInvoiceVatRulesRequestDtoSchema = z.object({ positionChargeItemId: z.string().describe("Position charge item ID"), vatRuleId: z.string().describe("VAT rule ID") }).readonly(); +export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; + +/** + * PrepareUploadRequestDtoSchema + * @type { object } + * @property { string } filename + * @property { string } mimeType + * @property { number } fileSize + */ +export const PrepareUploadRequestDtoSchema = z.object({ filename: z.string().nullish(), mimeType: z.string(), fileSize: z.number() }).readonly(); +export type PrepareUploadRequestDto = z.infer; + +/** + * InvoiceUploadInstructionsDtoSchema + * @type { object } + * @property { string } url Pre-signed URL for the PUT request to storage + * @property { string } method HTTP method to use for upload + */ +export const InvoiceUploadInstructionsDtoSchema = z.object({ url: z.string().describe("Pre-signed URL for the PUT request to storage"), method: z.string().describe("HTTP method to use for upload") }).readonly(); +export type InvoiceUploadInstructionsDto = z.infer; + +/** + * GetInvoicesEmlInvoiceIdsParamSchema + * @type { array } + * @description Invoice IDs + */ +export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).readonly().describe("Invoice IDs").nullish(); +export type GetInvoicesEmlInvoiceIdsParam = z.infer; + +/** + * InvoicesFindOrderParamEnumSchema + * @type { enum } + */ +export const InvoicesFindOrderParamEnumSchema = z.enum(["status", "createdAt", "serviceDate"]); +export type InvoicesFindOrderParamEnum = z.infer; +export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; + +/** + * InvoicesFindResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { InvoicePreviewDto[] } items + */ +export const InvoicesFindResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(InvoicePreviewDtoSchema).readonly() }).readonly().shape }); +export type InvoicesFindResponse = z.infer; + +/** + * FindByOfficeOrderParamEnumSchema + * @type { enum } + */ +export const FindByOfficeOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); +export type FindByOfficeOrderParamEnum = z.infer; +export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; + +/** + * FindByOfficeResponseSchema + * @type { object } + * @property { number } totalAmountInDefaultCurrency + * @property { string } defaultCurrencyNotation + * @property { TotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficeInvoicePreviewDto[] } items + */ +export const FindByOfficeResponseSchema = z.object({ ...OfficeInvoiceListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).readonly() }).readonly().shape }); +export type FindByOfficeResponse = z.infer; + +/** + * GetUnChargesOrderParamEnumSchema + * @type { enum } + */ +export const GetUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); +export type GetUnChargesOrderParamEnum = z.infer; +export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; + +/** + * GetUnChargesResponseSchema + * @type { object } + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { UninvoicedChargeDto[] } items + */ +export const GetUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape }); +export type GetUnChargesResponse = z.infer; + +/** + * InvoicesListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ +export const InvoicesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type InvoicesListAvailablePartnersForResponse = z.infer; + +/** + * GetOfficeUnChargesOrderParamEnumSchema + * @type { enum } + */ +export const GetOfficeUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); +export type GetOfficeUnChargesOrderParamEnum = z.infer; +export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnumSchema.enum; + +/** + * GetOfficeUnChargesResponseSchema + * @type { object } + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { UninvoicedChargeDto[] } items + */ +export const GetOfficeUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape }); +export type GetOfficeUnChargesResponse = z.infer; + +} diff --git a/test/generated/full/invoices/invoices.queries.ts b/test/generated/full/invoices/invoices.queries.ts new file mode 100644 index 0000000..1046ddd --- /dev/null +++ b/test/generated/full/invoices/invoices.queries.ts @@ -0,0 +1,1123 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InvoicesAcl } from "./invoices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { InvoicesApi } from "./invoices.api"; + +export namespace InvoicesQueries { +export const moduleName = QueryModule.Invoices; + +export const keys = { + all: [moduleName] as const, + getInvoicesEml: (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam) => [...keys.all, "/offices/:officeId/invoices/eml", officeId, invoiceIds] as const, + find: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", officeId, positionId, limit, order, filter, page, cursor] as const, + findInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", "infinite", officeId, positionId, limit, order, filter, cursor] as const, + findByOffice: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", officeId, limit, order, filter, page, cursor] as const, + findByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", "infinite", officeId, limit, order, filter, cursor] as const, + getUnCharges: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", officeId, positionId, limit, order, filter, page, cursor] as const, + getUnChargesInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", "infinite", officeId, positionId, limit, order, filter, cursor] as const, + listAvailablePartnersFor: (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/available-partners", officeId, invoiceId, search, useCase] as const, + getOfficeUnCharges: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", officeId, limit, order, filter, page, cursor] as const, + getOfficeUnChargesInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", "infinite", officeId, limit, order, filter, cursor] as const, + getDetail: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId", officeId, invoiceId] as const, + getPreview: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/preview", officeId, invoiceId] as const, + getInvoiceEml: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/eml", officeId, invoiceId] as const, +}; + +/** + * Query `useGetInvoicesEml` - recommended when file should be cached + * @summary Get invoices as EML file with PDF attachments + * @permission Requires `canUseGetInvoicesEml` ability + * @param { string } object.officeId Path parameter + * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } object.invoiceIds Query parameter. Invoice IDs + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoicesEml = ({ officeId, invoiceIds }: { officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvoicesEml(officeId, invoiceIds), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); + return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config) }, + ...options, + }); +}; + +/** + * Mutation `useGetInvoicesEmlMutation` - recommended when file should not be cached + * @summary Get invoices as EML file with PDF attachments + * @permission Requires `canUseGetInvoicesEml` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } mutation.invoiceIds Query parameter. Invoice IDs + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoicesEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceIds }) => { + checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); + return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFind` + * @summary List invoices for a position + * @permission Requires `canUseFind` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` + * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFind = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseFind({ officeId } )); + return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindInfinite + * @summary List invoices for a position + * @permission Requires `canUseFind` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` + * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseFind({ officeId } )); + return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useChangeIncomingCustomer` + * @summary Change incoming invoice customer and update vendors on registered charges + * @permission Requires `canUseChangeIncomingCustomer` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.ChangeInvoiceCustomerRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useChangeIncomingCustomer = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId } )); + return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindByOffice` + * @summary List invoices for an office + * @permission Requires `canUseFindByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); + return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindByOfficeInfinite + * @summary List invoices for an office + * @permission Requires `canUseFindByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); + return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreateDraft` + * @summary Create a draft invoice from charge items + * @permission Requires `canUseCreateDraft` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.CreateDraftInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useCreateDraft = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseCreateDraft({ officeId } )); + return InvoicesApi.createDraft(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useExportInvoices` - recommended when file should not be cached + * @summary Export invoices to Excel + * @permission Requires `canUseExportInvoices` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportInvoices = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportInvoices({ officeId } )); + return InvoicesApi.exportInvoices(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useExportCharges` - recommended when file should not be cached + * @summary Export invoice charges as Excel file + * @permission Requires `canUseExportCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportCharges({ officeId } )); + return InvoicesApi.exportCharges(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetUnCharges` + * @summary Get uninvoiced charges for a position + * @permission Requires `canUseGetUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetUnCharges = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useGetUnChargesInfinite + * @summary Get uninvoiced charges for a position + * @permission Requires `canUseGetUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetUnChargesInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for an invoice (union of position involved parties) + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListAvailablePartnersFor = ({ officeId, invoiceId, search, useCase }: { officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), + queryFn: () => { + checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId } )); + return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase, config) }, + ...options, + }); +}; + +/** + * Query `useGetOfficeUnCharges` + * @summary Get uninvoiced charges for all positions in an office + * @permission Requires `canUseGetOfficeUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetOfficeUnCharges = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useGetOfficeUnChargesInfinite + * @summary Get uninvoiced charges for all positions in an office + * @permission Requires `canUseGetOfficeUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetOfficeUnChargesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useExportUnCharges` - recommended when file should not be cached + * @summary Export uninvoiced charges as Excel file + * @permission Requires `canUseExportUnCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.UninvoicedChargesExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportUnCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId } )); + return InvoicesApi.exportUnCharges(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateDirect` + * @summary Dummy endpoint to expose direct invoice permission to FE + * @permission Requires `canUseCreateDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useCreateDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId }) => { + checkAcl(InvoicesAcl.canUseCreateDirect({ officeId } )); + return InvoicesApi.createDirect(officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useAddChargeToDirect` + * @summary Add a charge to a direct invoice + * @permission Requires `canUseAddChargeToDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.CreateDirectInvoiceChargeRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useAddChargeToDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId } )); + return InvoicesApi.addChargeToDirect(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateCharges` + * @summary Update charges on a draft invoice + * @permission Requires `canUseUpdateCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateInvoiceChargesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdateCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId } )); + return InvoicesApi.updateCharges(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRemoveChargeFromDirect` + * @summary Remove a charge from a direct invoice + * @permission Requires `canUseRemoveChargeFromDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.chargeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useRemoveChargeFromDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, chargeId }) => { + checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId } )); + return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetDetail` + * @summary Get invoice details + * @permission Requires `canUseGetDetail` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, default] + */ +export const useGetDetail = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDetail(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetDetail({ officeId } )); + return InvoicesApi.getDetail(officeId, invoiceId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update invoice details + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdate({ officeId } )); + return InvoicesApi.update(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteInvoice` + * @summary Delete invoice + * @permission Requires `canUseDeleteInvoice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteInvoice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId } )); + return InvoicesApi.deleteInvoice(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useFix` + * @summary Fix invoice with accounting permission + * @permission Requires `canUseFix` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.FixInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useFix = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseFix({ officeId } )); + return InvoicesApi.fix(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerate` - recommended when file should not be cached + * @summary Generate an invoice PDF + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGenerate({ officeId } )); + return InvoicesApi.generate(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateIssuedVatRules` + * @summary Update VAT rules on issued invoice charges + * @permission Requires `canUseUpdateIssuedVatRules` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdateIssuedVatRules = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId } )); + return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateIssuedCharges` + * @summary Update charges on issued invoice + * @permission Requires `canUseUpdateIssuedCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdateIssuedCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId } )); + return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useIssue` - recommended when file should not be cached + * @summary Issue outgoing invoice + * @permission Requires `canUseIssue` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useIssue = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseIssue({ officeId } )); + return InvoicesApi.issue(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReportHungarian` + * @summary Report invoice to Hungarian tax authority + * @permission Requires `canUseReportHungarian` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReportHungarian = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseReportHungarian({ officeId } )); + return InvoicesApi.reportHungarian(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateIncoming` - recommended when file should not be cached + * @summary Re-Generate an invoice PDF + * @permission Requires `canUseGenerateIncoming` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGenerateIncoming = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId } )); + return InvoicesApi.generateIncoming(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRegister` + * @summary Register incoming invoice + * @permission Requires `canUseRegister` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useRegister = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseRegister({ officeId } )); + return InvoicesApi.register(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetPreview` - recommended when file should be cached + * @summary Get invoice PDF preview + * @permission Requires `canUseGetPreview` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetPreview = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getPreview(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); + return InvoicesApi.getPreview(officeId, invoiceId, config) }, + ...options, + }); +}; + +/** + * Mutation `useGetPreviewMutation` - recommended when file should not be cached + * @summary Get invoice PDF preview + * @permission Requires `canUseGetPreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetPreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); + return InvoicesApi.getPreview(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetInvoiceEml` - recommended when file should be cached + * @summary Get invoice as EML file with PDF attachment + * @permission Requires `canUseGetInvoiceEml` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoiceEml = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvoiceEml(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); + return InvoicesApi.getInvoiceEml(officeId, invoiceId, config) }, + ...options, + }); +}; + +/** + * Mutation `useGetInvoiceEmlMutation` - recommended when file should not be cached + * @summary Get invoice as EML file with PDF attachment + * @permission Requires `canUseGetInvoiceEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoiceEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); + return InvoicesApi.getInvoiceEml(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `usePrepareDocumentUpload` + * @summary Prepare for invoice document upload + * @permission Requires `canUsePrepareDocumentUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.PrepareUploadRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const usePrepareDocumentUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { + checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId } )); + const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCancel` + * @summary Cancel invoice (create draft credit note) + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseCancel({ officeId } )); + return InvoicesApi.cancel(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useIssueCreditNote` + * @summary Issue credit invoice + * @permission Requires `canUseIssueCreditNote` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useIssueCreditNote = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId } )); + return InvoicesApi.issueCreditNote(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/masterData/masterData.acl.ts b/test/generated/full/masterData/masterData.acl.ts new file mode 100644 index 0000000..2c0c2c9 --- /dev/null +++ b/test/generated/full/masterData/masterData.acl.ts @@ -0,0 +1,24 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace MasterDataAcl { +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +} diff --git a/test/generated/full/masterData/masterData.api.ts b/test/generated/full/masterData/masterData.api.ts new file mode 100644 index 0000000..831aadf --- /dev/null +++ b/test/generated/full/masterData/masterData.api.ts @@ -0,0 +1,37 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { MasterDataModels } from "./masterData.models"; + +export namespace MasterDataApi { +export const findAll = (officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, + `/offices/${officeId}/master-data/autocomplete`, + { + ...config, + params: { + types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { type: "query", name: "types" }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +export const paginate = (officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, + `/offices/${officeId}/master-data/labels/paginated`, + { + ...config, + params: { + types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { type: "query", name: "types" }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/full/masterData/masterData.configs.ts b/test/generated/full/masterData/masterData.configs.ts new file mode 100644 index 0000000..06f2f06 --- /dev/null +++ b/test/generated/full/masterData/masterData.configs.ts @@ -0,0 +1,29 @@ +import { dynamicColumns } from "@povio/ui"; +import { MasterDataModels } from "./masterData.models"; +import { MasterDataQueries } from "./masterData.queries"; +import { MasterDataAcl } from "./masterData.acl"; + +export namespace MasterDataConfigs { +export const paginatedConfig = { + meta: { + title: "Paginated", + }, + readAll: { + acl: MasterDataAcl.canUsePaginate, + schema: MasterDataModels.MasterDataLabelResponseDTOSchema, + paginated: MasterDataQueries.usePaginate, + infinite: MasterDataQueries.usePaginateInfinite, + columns: dynamicColumns({ + schema: MasterDataModels.MasterDataLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + type: true, + }, + }, +}), + }, +}; + +} diff --git a/test/generated/full/masterData/masterData.models.ts b/test/generated/full/masterData/masterData.models.ts new file mode 100644 index 0000000..018a2dc --- /dev/null +++ b/test/generated/full/masterData/masterData.models.ts @@ -0,0 +1,68 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace MasterDataModels { +/** + * MasterDataTypeEnumSchema + * @type { enum } + */ +export const MasterDataTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "City", "Warehouse", "ContainerYard", "PortTerminal", "AirportTerminal", "Port", "Airport"]); +export type MasterDataTypeEnum = z.infer; +export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; + +/** + * MasterDataItemResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the item + * @property { string } name Name of the item + * @property { MasterDataTypeEnum } type Type of the item + */ +export const MasterDataItemResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the item"), name: z.string().describe("Name of the item"), type: MasterDataTypeEnumSchema.describe("Type of the item") }).readonly(); +export type MasterDataItemResponseDTO = z.infer; + +/** + * MasterDataItemsResponseDTOSchema + * @type { object } + * @property { MasterDataItemResponseDTO[] } items List of master data items + */ +export const MasterDataItemsResponseDTOSchema = z.object({ items: z.array(MasterDataItemResponseDTOSchema).readonly().describe("List of master data items") }).readonly(); +export type MasterDataItemsResponseDTO = z.infer; + +/** + * MasterDataLabelResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the item + * @property { string } label Label of the item + * @property { MasterDataTypeEnum } type Type of the item + */ +export const MasterDataLabelResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the item"), label: z.string().describe("Label of the item"), type: MasterDataTypeEnumSchema.describe("Type of the item") }).readonly(); +export type MasterDataLabelResponseDTO = z.infer; + +/** + * MasterDataFindAllTypesParamSchema + * @type { array } + */ +export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); +export type MasterDataFindAllTypesParam = z.infer; + +/** + * MasterDataPaginateTypesParamSchema + * @type { array } + */ +export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); +export type MasterDataPaginateTypesParam = z.infer; + +/** + * MasterDataPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { MasterDataLabelResponseDTO[] } items + */ +export const MasterDataPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(MasterDataLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type MasterDataPaginateResponse = z.infer; + +} diff --git a/test/generated/full/masterData/masterData.queries.ts b/test/generated/full/masterData/masterData.queries.ts new file mode 100644 index 0000000..444ccd6 --- /dev/null +++ b/test/generated/full/masterData/masterData.queries.ts @@ -0,0 +1,100 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { MasterDataAcl } from "./masterData.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { MasterDataModels } from "./masterData.models"; +import { MasterDataApi } from "./masterData.api"; + +export namespace MasterDataQueries { +export const moduleName = QueryModule.MasterData; + +export const keys = { + all: [moduleName] as const, + findAll: (officeId: string, types?: MasterDataModels.MasterDataFindAllTypesParam, search?: string) => [...keys.all, "/offices/:officeId/master-data/autocomplete", officeId, types, search] as const, + paginate: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", officeId, types, limit, search, page, cursor] as const, + paginateInfinite: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", "infinite", officeId, types, limit, search, cursor] as const, +}; + +/** + * Query `useFindAll` + * @summary List master data based on provided type + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataFindAllTypesParam } object.types Query parameter + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ officeId, types, search }: { officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(officeId, types, search), + queryFn: () => { + checkAcl(MasterDataAcl.canUseFindAll()); + return MasterDataApi.findAll(officeId, types, search, config) }, + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary Paginate master data based on provided type + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.search Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, types, limit, search, page, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, types, limit, search, page, cursor), + queryFn: () => { + checkAcl(MasterDataAcl.canUsePaginate()); + return MasterDataApi.paginate(officeId, types, limit, search, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate master data based on provided type + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.search Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, types, limit, search, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), + queryFn: ({ pageParam }) => { + checkAcl(MasterDataAcl.canUsePaginate()); + return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/full/masterDataImport/masterDataImport.acl.ts b/test/generated/full/masterDataImport/masterDataImport.acl.ts new file mode 100644 index 0000000..7e98741 --- /dev/null +++ b/test/generated/full/masterDataImport/masterDataImport.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace MasterDataImportAcl { +/** + * Use for `useUpload` mutation ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpload` mutation + */ +export const canUseUpload = ( + object?: { officeId: string, } +) => [ + "Import", + object ? subject("MasterData", object) : "MasterData" +] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; + +/** + * Use for `usePostOfficesMasterDataImportByOfficeId` mutation ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePostOfficesMasterDataImportByOfficeId` mutation + */ +export const canUsePostOfficesMasterDataImportByOfficeId = ( + object?: { officeId: string, } +) => [ + "Import", + object ? subject("MasterData", object) : "MasterData" +] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; + +/** + * Use for `useGetImportStatus` query ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetImportStatus` query + */ +export const canUseGetImportStatus = ( + object?: { officeId: string, } +) => [ + "Import", + object ? subject("MasterData", object) : "MasterData" +] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; + +} diff --git a/test/generated/full/masterDataImport/masterDataImport.api.ts b/test/generated/full/masterDataImport/masterDataImport.api.ts new file mode 100644 index 0000000..8690f02 --- /dev/null +++ b/test/generated/full/masterDataImport/masterDataImport.api.ts @@ -0,0 +1,30 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { MasterDataImportModels } from "./masterDataImport.models"; + +export namespace MasterDataImportApi { +export const upload = (officeId: string, data: MasterDataImportModels.MasterDataImportUploadRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, + `/offices/${officeId}/master-data/upload`, + ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), + config + ) +}; +export const postOfficesMasterDataImportByOfficeId = (officeId: string, data: MasterDataImportModels.MasterDataImportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, + `/offices/${officeId}/master-data/import`, + ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), + config + ) +}; +export const getImportStatus = (jobId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, + `/offices/${officeId}/master-data/import/${jobId}/status`, + config + ) +}; +} diff --git a/test/generated/full/masterDataImport/masterDataImport.models.ts b/test/generated/full/masterDataImport/masterDataImport.models.ts new file mode 100644 index 0000000..6033091 --- /dev/null +++ b/test/generated/full/masterDataImport/masterDataImport.models.ts @@ -0,0 +1,78 @@ +import { z } from "zod"; + +export namespace MasterDataImportModels { +/** + * ImportStatusEnumSchema + * @type { enum } + * @description Import result status + */ +export const ImportStatusEnumSchema = z.enum(["Success", "Warning", "Error"]); +export type ImportStatusEnum = z.infer; +export const ImportStatusEnum = ImportStatusEnumSchema.enum; + +/** + * ImportTypeEnumSchema + * @type { enum } + */ +export const ImportTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Warehouse"]); +export type ImportTypeEnum = z.infer; +export const ImportTypeEnum = ImportTypeEnumSchema.enum; + +/** + * MasterDataImportRequestDtoSchema + * @type { object } + * @property { string } mediaId Media ID of the uploaded file + * @property { ImportTypeEnum } type Type of data to import + */ +export const MasterDataImportRequestDtoSchema = z.object({ mediaId: z.string().describe("Media ID of the uploaded file"), type: ImportTypeEnumSchema.describe("Type of data to import") }).readonly(); +export type MasterDataImportRequestDto = z.infer; + +/** + * ImportResultDtoSchema + * @type { object } + * @property { string } importStatus Import result status + * @property { string } downloadUrl S3 presigned URL for result file download + * @property { string } expiresAt Download URL expiration time + * @property { string } errorCode + */ +export const ImportResultDtoSchema = z.object({ importStatus: ImportStatusEnumSchema.describe("Import result status").nullish(), downloadUrl: z.string().describe("S3 presigned URL for result file download"), expiresAt: z.iso.datetime({ offset: true }).describe("Download URL expiration time").nullish(), errorCode: z.string().nullish() }).readonly(); +export type ImportResultDto = z.infer; + +/** + * ImportStatusResponseDtoSchema + * @type { object } + * @property { string } status Current job status + * @property { ImportResultDto } result Import result data when job is completed + */ +export const ImportStatusResponseDtoSchema = z.object({ status: z.string().describe("Current job status").nullable(), result: ImportResultDtoSchema.describe("Import result data when job is completed").nullish() }).readonly(); +export type ImportStatusResponseDto = z.infer; + +/** + * MasterDataImportUploadRequestDtoSchema + * @type { object } + * @property { string } filename File name + * @property { string } contentType Content type of the file + * @property { number } fileSize File size in bytes. Minimum: `1` + */ +export const MasterDataImportUploadRequestDtoSchema = z.object({ filename: z.string().describe("File name"), contentType: z.string().describe("Content type of the file"), fileSize: z.number().gte(1).describe("File size in bytes") }).readonly(); +export type MasterDataImportUploadRequestDto = z.infer; + +/** + * MasterDataImportUploadResponseDtoSchema + * @type { object } + * @property { string } mediaId Media ID for the uploaded file + * @property { string } url S3 presigned upload URL + */ +export const MasterDataImportUploadResponseDtoSchema = z.object({ mediaId: z.string().describe("Media ID for the uploaded file"), url: z.string().describe("S3 presigned upload URL") }).readonly(); +export type MasterDataImportUploadResponseDto = z.infer; + +/** + * MasterDataImportResponseDtoSchema + * @type { object } + * @property { string } jobId PG Boss job ID + * @property { string } status Initial job status + */ +export const MasterDataImportResponseDtoSchema = z.object({ jobId: z.string().describe("PG Boss job ID"), status: z.string().describe("Initial job status").nullish() }).readonly(); +export type MasterDataImportResponseDto = z.infer; + +} diff --git a/test/generated/full/masterDataImport/masterDataImport.queries.ts b/test/generated/full/masterDataImport/masterDataImport.queries.ts new file mode 100644 index 0000000..07d3f9b --- /dev/null +++ b/test/generated/full/masterDataImport/masterDataImport.queries.ts @@ -0,0 +1,121 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { MasterDataImportAcl } from "./masterDataImport.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { MasterDataImportModels } from "./masterDataImport.models"; +import { MasterDataImportApi } from "./masterDataImport.api"; + +export namespace MasterDataImportQueries { +export const moduleName = QueryModule.MasterDataImport; + +export const keys = { + all: [moduleName] as const, + getImportStatus: (jobId: string, officeId: string) => [...keys.all, "/offices/:officeId/master-data/import/:jobId/status", jobId, officeId] as const, +}; + +/** + * Mutation `useUpload` + * @summary Create upload instructions for master data import file + * @permission Requires `canUseUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { MasterDataImportModels.MasterDataImportUploadRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(MasterDataImportAcl.canUseUpload({ officeId } )); + const uploadInstructions = await MasterDataImportApi.upload(officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `usePostOfficesMasterDataImportByOfficeId` + * @summary Start master data import process + * @permission Requires `canUsePostOfficesMasterDataImportByOfficeId` ability + * @param { string } mutation.officeId Path parameter + * @param { MasterDataImportModels.MasterDataImportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const usePostOfficesMasterDataImportByOfficeId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId } )); + return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetImportStatus` + * @summary Get import job status + * @permission Requires `canUseGetImportStatus` ability + * @param { string } object.jobId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetImportStatus = ({ jobId, officeId }: { jobId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getImportStatus(jobId, officeId), + queryFn: () => { + checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId } )); + return MasterDataImportApi.getImportStatus(jobId, officeId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/offices/offices.acl.ts b/test/generated/full/offices/offices.acl.ts new file mode 100644 index 0000000..0f81019 --- /dev/null +++ b/test/generated/full/offices/offices.acl.ts @@ -0,0 +1,102 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace OfficesAcl { +/** + * Use for `useCreate` mutation ability. + * @description Create office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Office" +] as AbilityTuple<"Create", "Office">; + +/** + * Use for `useGet` query ability. + * @description Read office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( +) => [ + "Read", + "Office" +] as AbilityTuple<"Read", "Office">; + +/** + * Use for `useUpdate` mutation ability. + * @description Update office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Office" +] as AbilityTuple<"Update", "Office">; + +/** + * Use for `useUploadDocumentImage` mutation ability. For global ability, omit the object parameter. + * @description Upload office document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadDocumentImage` mutation + */ +export const canUseUploadDocumentImage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useCreateBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Create office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBankAccount` mutation + */ +export const canUseCreateBankAccount = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useUpdateBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Update office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBankAccount` mutation + */ +export const canUseUpdateBankAccount = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useDeleteBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Delete office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBankAccount` mutation + */ +export const canUseDeleteBankAccount = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useUploadBankAccountFooter` mutation ability. For global ability, omit the object parameter. + * @description Upload bank account footer + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadBankAccountFooter` mutation + */ +export const canUseUploadBankAccountFooter = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +} diff --git a/test/generated/full/offices/offices.api.ts b/test/generated/full/offices/offices.api.ts new file mode 100644 index 0000000..23f37d7 --- /dev/null +++ b/test/generated/full/offices/offices.api.ts @@ -0,0 +1,115 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { OfficesModels } from "./offices.models"; + +export namespace OfficesApi { +export const paginate = (limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficesPaginateResponseSchema }, + `/offices`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: OfficesModels.CreateOfficeRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: OfficesModels.OfficeResponseDtoSchema }, + `/offices`, + ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), + config + ) +}; +export const findAllLabels = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: OfficesModels.FindAllLabelsResponseSchema }, + `/offices/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, + `/offices/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const get = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, + `/offices/${id}`, + config + ) +}; +export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: OfficesModels.OfficeResponseDtoSchema }, + `/offices/${id}`, + ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), + config + ) +}; +export const uploadDocumentImage = (officeId: string, data: OfficesModels.UploadOfficeDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, + `/offices/${officeId}/document-image`, + ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), + config + ) +}; +export const createBankAccount = (officeId: string, data: OfficesModels.CreateOfficeBankAccountDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, + `/offices/${officeId}/bank-accounts`, + ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), + config + ) +}; +export const updateBankAccount = (accountId: string, officeId: string, data: OfficesModels.UpdateOfficeBankAccountDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, + `/offices/${officeId}/bank-accounts/${accountId}`, + ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), + config + ) +}; +export const deleteBankAccount = (accountId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/bank-accounts/${accountId}`, + undefined, + config + ) +}; +export const uploadBankAccountFooter = (accountId: string, officeId: string, data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, + `/offices/${officeId}/bank-accounts/${accountId}/footer`, + ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/offices/offices.configs.ts b/test/generated/full/offices/offices.configs.ts new file mode 100644 index 0000000..07f5587 --- /dev/null +++ b/test/generated/full/offices/offices.configs.ts @@ -0,0 +1,135 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { OfficesModels } from "./offices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { OfficesQueries } from "./offices.queries"; +import { OfficesAcl } from "./offices.acl"; + +export namespace OfficesConfigs { +export const officesConfig = { + meta: { + title: "Offices", + }, + readAll: { + schema: OfficesModels.OfficeListItemResponseSchema, + paginated: OfficesQueries.usePaginate, + infinite: OfficesQueries.usePaginateInfinite, + filters: { + schema: OfficesModels.OfficeFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: OfficesModels.OfficeFilterDtoSchema, + options: { + inputs: { + name: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: OfficesModels.OfficeListItemResponseSchema, + options: { + columns: { + id: true, + name: true, + numberOfEmployees: true, + }, + sortable: OfficesModels.OfficesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: OfficesAcl.canUseGet, + schema: OfficesModels.OfficeDetailResponseDtoSchema, + query: OfficesQueries.useGet, + }, + create: { + acl: OfficesAcl.canUseCreate, + schema: OfficesModels.CreateOfficeRequestSchema, + mutation: OfficesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: OfficesModels.CreateOfficeRequestSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, + update: { + acl: OfficesAcl.canUseUpdate, + schema: OfficesModels.UpdateOfficeRequestSchema, + mutation: OfficesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: OfficesModels.UpdateOfficeRequestSchema, + options: { + inputs: { + name: true, + symbol: true, + invoicePrefix: true, + autoClosePositionsAfterDays: true, + defaultLanguage: true, + locale: true, + vatId: true, + taxNumber: true, + termsExport: true, + termsImport: true, + showPaymentInstructions: true, + showCompanyRegistrationNumber: true, + reportInvoicesToHungarianTaxAuthority: true, + restrictPositionInvolvedParties: true, + showWatermarkOnDocuments: true, + showInvoiceVatLinesInOfficeCurrency: true, + usePartnerMatchCodes: true, + restrictFinancePartnersToRelationship: true, + costCenterId: true, + minimumOutgoingInvoiceDate: true, + minimumOutgoingInvoiceServiceDate: true, + minimumIncomingInvoiceDate: true, + minimumIncomingInvoiceServiceDate: true, + countryId: true, + defaultCurrencyId: true, + representingBusinessPartnerId: true, + availableCurrencyIds: true, + generalLedgerSystem: true, + factoringReportingEnabled: true, + bankAccountCurrencyMapping: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + schema: CommonModels.LabelResponseDTOSchema, + paginated: OfficesQueries.usePaginateLabels, + infinite: OfficesQueries.usePaginateLabelsInfinite, + filters: { + schema: OfficesModels.OfficeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: OfficesModels.OfficeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/offices/offices.models.ts b/test/generated/full/offices/offices.models.ts new file mode 100644 index 0000000..c36fc5b --- /dev/null +++ b/test/generated/full/offices/offices.models.ts @@ -0,0 +1,390 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace OfficesModels { +/** + * OfficeCurrencyResponseDtoSchema + * @type { object } + * @property { string } isoCode + * @property { string } name + */ +export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }).readonly(); +export type OfficeCurrencyResponseDto = z.infer; + +/** + * OfficeBankAccountCurrencyMappingResponseDtoSchema + * @type { object } + * @property { string } currency + * @property { string } bankAccountId + * @property { string } bankAccountName + */ +export const OfficeBankAccountCurrencyMappingResponseDtoSchema = z.object({ currency: z.string(), bankAccountId: z.string(), bankAccountName: z.string() }).readonly(); +export type OfficeBankAccountCurrencyMappingResponseDto = z.infer; + +/** + * OfficeBookkeepingResponseDtoSchema + * @type { object } + * @property { string } generalLedgerSystem + * @property { OfficeCurrencyResponseDto } defaultCurrency + * @property { OfficeCurrencyResponseDto[] } availableCurrencies + * @property { boolean } showPaymentInstructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { OfficeBankAccountCurrencyMappingResponseDto[] } bankAccountCurrencyMapping + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { boolean } factoringReportingEnabled + */ +export const OfficeBookkeepingResponseDtoSchema = z.object({ generalLedgerSystem: z.string(), defaultCurrency: OfficeCurrencyResponseDtoSchema.nullish(), availableCurrencies: z.array(OfficeCurrencyResponseDtoSchema).readonly(), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), bankAccountCurrencyMapping: z.array(OfficeBankAccountCurrencyMappingResponseDtoSchema).readonly(), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), factoringReportingEnabled: z.boolean() }).readonly(); +export type OfficeBookkeepingResponseDto = z.infer; + +/** + * OfficeDocumentPartEnumSchema + * @type { enum } + */ +export const OfficeDocumentPartEnumSchema = z.enum(["DocumentFooter", "DocumentHeader", "GeneralTermsAndConditions", "BLTermsAndConditions", "FinanceDocumentFooter"]); +export type OfficeDocumentPartEnum = z.infer; +export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; + +/** + * OfficeDocumentSettingsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } mediaUrl + * @property { CommonModels.LanguageEnum } language + * @property { OfficeDocumentPartEnum } documentPart + */ +export const OfficeDocumentSettingsResponseDtoSchema = z.object({ id: z.string(), mediaUrl: z.string(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }).readonly(); +export type OfficeDocumentSettingsResponseDto = z.infer; + +/** + * AddressResponseDTOSchema + * @type { object } + * @property { string } id ID of the address + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } city City name + * @property { string } district District + * @property { string } isoCode2 2 letter country code + * @property { string } country Country name + * @property { string } isoCode3 3 letter country code + */ +export const AddressResponseDTOSchema = z.object({ id: z.string().describe("ID of the address"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street address"), zip: z.string().describe("ZIP/Postal code"), city: z.string().describe("City name"), district: z.string().describe("District"), isoCode2: z.string().describe("2 letter country code"), country: z.string().describe("Country name"), isoCode3: z.string().describe("3 letter country code") }).readonly(); +export type AddressResponseDTO = z.infer; + +/** + * OfficeRepresentingBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string[] } types + * @property { string[] } email + * @property { string[] } phone + * @property { string } addressId + * @property { AddressResponseDTO } address + */ +export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), types: z.array(z.string()).readonly(), email: z.array(z.string()).readonly().nullish(), phone: z.array(z.string()).readonly().nullish(), addressId: z.string().nullish(), address: AddressResponseDTOSchema.nullish() }).readonly(); +export type OfficeRepresentingBusinessPartnerResponseDto = z.infer; + +/** + * OfficePaymentTermsResponseDtoSchema + * @type { object } + * @property { number } days + * @property { string } relativeTo + */ +export const OfficePaymentTermsResponseDtoSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }).readonly(); +export type OfficePaymentTermsResponseDto = z.infer; + +/** + * OfficeCountryResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const OfficeCountryResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type OfficeCountryResponseDto = z.infer; + +/** + * OfficeBankAccountResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } bankName + * @property { string } iban + * @property { string } swiftBic + * @property { boolean } useFooterOnInvoice + * @property { object } footer + * @property { string } footer.mediaUrl + * @property { boolean } isFactoringBank + */ +export const OfficeBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string(), bankName: z.string(), iban: z.string(), swiftBic: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), isFactoringBank: z.boolean() }).readonly(); +export type OfficeBankAccountResponseDto = z.infer; + +/** + * OfficeDetailResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } symbol + * @property { number } invoicePrefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage + * @property { CommonModels.LocaleEnum } locale + * @property { string } vatId + * @property { string } taxNumber + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { OfficePaymentTermsResponseDto } termsExport + * @property { OfficePaymentTermsResponseDto } termsImport + * @property { OfficeCountryResponseDto } country + * @property { OfficeBankAccountResponseDto[] } bankAccounts + * @property { OfficeBookkeepingResponseDto } bookkeeping + * @property { OfficeDocumentSettingsResponseDto[] } documentSettings + * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner + * @property { boolean } hasInttraCredentials + */ +export const OfficeDetailResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), country: OfficeCountryResponseDtoSchema.nullable(), bankAccounts: z.array(OfficeBankAccountResponseDtoSchema).readonly(), bookkeeping: OfficeBookkeepingResponseDtoSchema, documentSettings: z.array(OfficeDocumentSettingsResponseDtoSchema).readonly(), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), hasInttraCredentials: z.boolean().nullish() }).readonly(); +export type OfficeDetailResponseDto = z.infer; + +/** + * OfficeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } symbol + * @property { number } invoicePrefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage + * @property { CommonModels.LocaleEnum } locale + * @property { string } vatId + * @property { string } taxNumber + * @property { OfficePaymentTermsResponseDto } termsExport + * @property { OfficePaymentTermsResponseDto } termsImport + * @property { boolean } showPaymentInstructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { string } countryId + * @property { string } defaultCurrencyId + * @property { string[] } availableCurrencyIds + * @property { string } generalLedgerSystem + * @property { string } representingBusinessPartnerId + * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner + * @property { boolean } factoringReportingEnabled + */ +export const OfficeResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), countryId: z.string().nullable(), defaultCurrencyId: z.string().nullable(), availableCurrencyIds: z.array(z.string()).readonly().nullable(), generalLedgerSystem: z.string().nullable(), representingBusinessPartnerId: z.string().nullable(), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), factoringReportingEnabled: z.boolean() }).readonly(); +export type OfficeResponseDto = z.infer; + +/** + * UpdateOfficePaymentTermsRequestSchema + * @type { object } + * @property { number } days + * @property { string } relativeTo + */ +export const UpdateOfficePaymentTermsRequestSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }).readonly(); +export type UpdateOfficePaymentTermsRequest = z.infer; + +/** + * UpdateOfficeBankAccountCurrencyMappingSchema + * @type { object } + * @property { string } currency + * @property { string } bankAccountId + */ +export const UpdateOfficeBankAccountCurrencyMappingSchema = z.object({ currency: z.string(), bankAccountId: z.string() }).readonly(); +export type UpdateOfficeBankAccountCurrencyMapping = z.infer; + +/** + * UpdateOfficeRequestSchema + * @type { object } + * @property { string } name Office Name + * @property { string } symbol Office Symbol + * @property { number } invoicePrefix Office Invoice Prefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage Office Default Language + * @property { string } locale + * @property { string } vatId Office Vat Id + * @property { string } taxNumber Office Tax Number + * @property { UpdateOfficePaymentTermsRequest } termsExport Office Terms Export + * @property { UpdateOfficePaymentTermsRequest } termsImport Office Terms Import + * @property { boolean } showPaymentInstructions Office Show Payment Instructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { string } countryId Office country id + * @property { string } defaultCurrencyId Office default currency id + * @property { string } representingBusinessPartnerId Representing business partner id + * @property { string[] } availableCurrencyIds Office availableCurrencyIds + * @property { string } generalLedgerSystem Office general ledger system + * @property { boolean } factoringReportingEnabled + * @property { UpdateOfficeBankAccountCurrencyMapping[] } bankAccountCurrencyMapping Office bank account currency mapping + */ +export const UpdateOfficeRequestSchema = z.object({ name: z.string().describe("Office Name"), symbol: z.string().describe("Office Symbol"), invoicePrefix: z.number().describe("Office Invoice Prefix"), autoClosePositionsAfterDays: z.number(), defaultLanguage: z.string().describe("Office Default Language"), locale: CommonModels.LocaleEnumSchema, vatId: z.string().describe("Office Vat Id"), taxNumber: z.string().describe("Office Tax Number"), termsExport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Export"), termsImport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Import"), showPaymentInstructions: z.boolean().describe("Office Show Payment Instructions"), showCompanyRegistrationNumber: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), costCenterId: z.string(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }), countryId: z.string().describe("Office country id"), defaultCurrencyId: z.string().describe("Office default currency id"), representingBusinessPartnerId: z.string().describe("Representing business partner id"), availableCurrencyIds: z.array(z.string()).readonly().describe("Office availableCurrencyIds"), generalLedgerSystem: z.string().describe("Office general ledger system"), factoringReportingEnabled: z.boolean(), bankAccountCurrencyMapping: z.array(UpdateOfficeBankAccountCurrencyMappingSchema).readonly().describe("Office bank account currency mapping") }).readonly(); +export type UpdateOfficeRequest = z.infer; + +/** + * UploadOfficeDocumentRequestDtoSchema + * @type { object } + * @property { string } fileName File name with extension + * @property { string } mimeType MIME type of the file + * @property { number } fileSize Size of the file + * @property { string } language Language of the document + * @property { string } documentPart Part of the document this image represents + */ +export const UploadOfficeDocumentRequestDtoSchema = z.object({ fileName: z.string().describe("File name with extension"), mimeType: z.string().describe("MIME type of the file"), fileSize: z.number().describe("Size of the file"), language: CommonModels.LanguageEnumSchema.describe("Language of the document"), documentPart: OfficeDocumentPartEnumSchema.describe("Part of the document this image represents") }).readonly(); +export type UploadOfficeDocumentRequestDto = z.infer; + +/** + * OfficeListItemResponseSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { number } numberOfEmployees + */ +export const OfficeListItemResponseSchema = z.object({ id: z.string(), name: z.string(), numberOfEmployees: z.number() }).readonly(); +export type OfficeListItemResponse = z.infer; + +/** + * OfficeFilterDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } search + */ +export const OfficeFilterDtoSchema = z.object({ name: z.string().describe("Name"), search: z.string() }).readonly(); +export type OfficeFilterDto = z.infer; + +/** + * OfficeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const OfficeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type OfficeLabelFilterDto = z.infer; + +/** + * CreateOfficeRequestSchema + * @type { object } + * @property { string } name + */ +export const CreateOfficeRequestSchema = z.object({ name: z.string() }).readonly(); +export type CreateOfficeRequest = z.infer; + +/** + * DocumentImageUploadInstructionsDtoSchema + * @type { object } + * @property { string } method HTTP method to use for upload + * @property { string } url URL to upload the file to + * @property { string } documentId ID of the created/updated document setting + */ +export const DocumentImageUploadInstructionsDtoSchema = z.object({ method: z.string().describe("HTTP method to use for upload"), url: z.string().describe("URL to upload the file to"), documentId: z.string().describe("ID of the created/updated document setting") }).readonly(); +export type DocumentImageUploadInstructionsDto = z.infer; + +/** + * CreateOfficeBankAccountDtoSchema + * @type { object } + * @property { string } name Bank account name + * @property { string } bankName Bank name + * @property { string } iban IBAN + * @property { string } swiftBic SWIFT/BIC code + * @property { boolean } useFooterOnInvoice Use footer on invoice + */ +export const CreateOfficeBankAccountDtoSchema = z.object({ name: z.string().describe("Bank account name"), bankName: z.string().describe("Bank name"), iban: z.string().describe("IBAN"), swiftBic: z.string().describe("SWIFT/BIC code"), useFooterOnInvoice: z.boolean().describe("Use footer on invoice") }).readonly(); +export type CreateOfficeBankAccountDto = z.infer; + +/** + * UpdateOfficeBankAccountDtoSchema + * @type { object } + * @property { string } name Bank account name + * @property { string } bankName Bank name + * @property { string } iban IBAN + * @property { string } swiftBic SWIFT/BIC code + * @property { boolean } useFooterOnInvoice Use footer on invoice + * @property { boolean } isFactoringBank Is factoring bank + */ +export const UpdateOfficeBankAccountDtoSchema = z.object({ name: z.string().describe("Bank account name"), bankName: z.string().describe("Bank name"), iban: z.string().describe("IBAN"), swiftBic: z.string().describe("SWIFT/BIC code"), useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), isFactoringBank: z.boolean().describe("Is factoring bank") }).readonly(); +export type UpdateOfficeBankAccountDto = z.infer; + +/** + * UploadOfficeBankAccountFooterRequestDtoSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType File MIME type + * @property { number } fileSize Size of the file + */ +export const UploadOfficeBankAccountFooterRequestDtoSchema = z.object({ fileName: z.string().describe("File name"), mimeType: z.string().describe("File MIME type"), fileSize: z.number().describe("Size of the file") }).readonly(); +export type UploadOfficeBankAccountFooterRequestDto = z.infer; + +/** + * OfficesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const OfficesPaginateOrderParamEnumSchema = z.enum(["name"]); +export type OfficesPaginateOrderParamEnum = z.infer; +export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema.enum; + +/** + * OfficesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficeListItemResponse[] } items + */ +export const OfficesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(OfficeListItemResponseSchema).readonly() }).readonly().shape }); +export type OfficesPaginateResponse = z.infer; + +/** + * FindAllLabelsResponseSchema + * @type { array } + */ +export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type FindAllLabelsResponse = z.infer; + +/** + * OfficesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const OfficesPaginateLabelsOrderParamEnumSchema = z.enum(["name"]); +export type OfficesPaginateLabelsOrderParamEnum = z.infer; +export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * OfficesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const OfficesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type OfficesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/offices/offices.queries.ts b/test/generated/full/offices/offices.queries.ts new file mode 100644 index 0000000..beb29d6 --- /dev/null +++ b/test/generated/full/offices/offices.queries.ts @@ -0,0 +1,403 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { OfficesAcl } from "./offices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { OfficesModels } from "./offices.models"; +import { OfficesApi } from "./offices.api"; + +export namespace OfficesQueries { +export const moduleName = QueryModule.Offices; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string) => [...keys.all, "/offices", "infinite", limit, order, filter, cursor] as const, + findAllLabels: (search?: string) => [...keys.all, "/offices/labels", search] as const, + paginateLabels: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string) => [...keys.all, "/offices/labels/paginate", "infinite", limit, order, filter, cursor] as const, + get: (id: string) => [...keys.all, "/offices/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate offices + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => + OfficesApi.paginate(limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate offices + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + OfficesApi.paginate(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create new office + * @permission Requires `canUseCreate` ability + * @param { OfficesModels.CreateOfficeRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(OfficesAcl.canUseCreate()); + return OfficesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindAllLabels` + * @summary List all offices with only their labels + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllLabels = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findAllLabels(search), + queryFn: () => + OfficesApi.findAllLabels(search, config), + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate offices with only their labels + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => + OfficesApi.paginateLabels(limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate offices with only their labels + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGet` + * @summary Get office by id + * @permission Requires `canUseGet` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(id), + queryFn: () => { + checkAcl(OfficesAcl.canUseGet()); + return OfficesApi.get(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update office + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { OfficesModels.UpdateOfficeRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(OfficesAcl.canUseUpdate()); + return OfficesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUploadDocumentImage` + * @summary Upload document image for an office + * @permission Requires `canUseUploadDocumentImage` ability + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UploadOfficeDocumentRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUploadDocumentImage = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId } )); + const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateBankAccount` + * @summary Create office bank account + * @permission Requires `canUseCreateBankAccount` ability + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.CreateOfficeBankAccountDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId } )); + return OfficesApi.createBankAccount(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateBankAccount` + * @summary Update office bank account + * @permission Requires `canUseUpdateBankAccount` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UpdateOfficeBankAccountDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ accountId, officeId, data }) => { + checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId } )); + return OfficesApi.updateBankAccount(accountId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteBankAccount` + * @summary Delete office bank account + * @permission Requires `canUseDeleteBankAccount` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ accountId, officeId }) => { + checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId } )); + return OfficesApi.deleteBankAccount(accountId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUploadBankAccountFooter` + * @summary Upload office bank account footer + * @permission Requires `canUseUploadBankAccountFooter` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UploadOfficeBankAccountFooterRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUploadBankAccountFooter = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId } )); + const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/packageTypes/packageTypes.acl.ts b/test/generated/full/packageTypes/packageTypes.acl.ts new file mode 100644 index 0000000..f37bcb1 --- /dev/null +++ b/test/generated/full/packageTypes/packageTypes.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PackageTypesAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "PackageType" +] as AbilityTuple<"Read", "PackageType">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "PackageType" +] as AbilityTuple<"Create", "PackageType">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "PackageType" +] as AbilityTuple<"Read", "PackageType">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "PackageType" +] as AbilityTuple<"Read", "PackageType">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "PackageType" +] as AbilityTuple<"Update", "PackageType">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "PackageType" +] as AbilityTuple<"Archive", "PackageType">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "PackageType" +] as AbilityTuple<"Archive", "PackageType">; + +} diff --git a/test/generated/full/packageTypes/packageTypes.api.ts b/test/generated/full/packageTypes/packageTypes.api.ts new file mode 100644 index 0000000..afa5bc0 --- /dev/null +++ b/test/generated/full/packageTypes/packageTypes.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PackageTypesModels } from "./packageTypes.models"; + +export namespace PackageTypesApi { +export const paginate = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, + `/package-types`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types`, + ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, + `/package-types/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}`, + config + ) +}; +export const update = (id: string, data: PackageTypesModels.UpdatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}`, + ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/packageTypes/packageTypes.configs.ts b/test/generated/full/packageTypes/packageTypes.configs.ts new file mode 100644 index 0000000..ba6aafd --- /dev/null +++ b/test/generated/full/packageTypes/packageTypes.configs.ts @@ -0,0 +1,129 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PackageTypesModels } from "./packageTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PackageTypesQueries } from "./packageTypes.queries"; +import { PackageTypesAcl } from "./packageTypes.acl"; + +export namespace PackageTypesConfigs { +export const packageTypesConfig = { + meta: { + title: "Package Types", + }, + readAll: { + acl: PackageTypesAcl.canUsePaginate, + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + paginated: PackageTypesQueries.usePaginate, + infinite: PackageTypesQueries.usePaginateInfinite, + filters: { + schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + length: true, + width: true, + height: true, + unit: true, + archived: true, + code: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: PackageTypesAcl.canUseFindById, + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + query: PackageTypesQueries.useFindById, + }, + create: { + acl: PackageTypesAcl.canUseCreate, + schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, + mutation: PackageTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, + options: { + inputs: { + name: true, + length: true, + width: true, + height: true, + unit: true, + code: true, + }, + }, +}) + }, + update: { + acl: PackageTypesAcl.canUseUpdate, + schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, + mutation: PackageTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, + options: { + inputs: { + name: true, + length: true, + width: true, + height: true, + unit: true, + code: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: PackageTypesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PackageTypesQueries.usePaginateLabels, + infinite: PackageTypesQueries.usePaginateLabelsInfinite, + filters: { + schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/packageTypes/packageTypes.models.ts b/test/generated/full/packageTypes/packageTypes.models.ts new file mode 100644 index 0000000..f3d28da --- /dev/null +++ b/test/generated/full/packageTypes/packageTypes.models.ts @@ -0,0 +1,128 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PackageTypesModels { +/** + * PackageTypeCodeEnumSchema + * @type { enum } + */ +export const PackageTypeCodeEnumSchema = z.enum(["1A", "1B", "1D", "1F", "1G", "1W", "2C", "3A", "3H", "43", "44", "4A", "4B", "4C", "4D", "4F", "4G", "4H", "5H", "5L", "5M", "6H", "6P", "7A", "7B", "8A", "8B", "8C", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AL", "AM", "AP", "AT", "AV", "B4", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "DA", "DB", "DC", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DP", "DR", "DS", "DT", "DU", "DV", "DW", "DX", "DY", "EC", "ED", "EE", "EF", "EG", "EH", "EI", "EN", "FB", "FC", "FD", "FE", "FI", "FL", "FO", "FP", "FR", "FT", "FW", "FX", "GB", "GI", "GL", "GR", "GU", "GY", "GZ", "HA", "HB", "HC", "HG", "HN", "HR", "IA", "IB", "IC", "ID", "IE", "IF", "IG", "IH", "IK", "IL", "IN", "IZ", "JB", "JC", "JG", "JR", "JT", "JY", "KG", "KI", "LE", "LG", "LT", "LU", "LV", "LZ", "MA", "MB", "MC", "ME", "MR", "MS", "MT", "MW", "MX", "NA", "NE", "NF", "NG", "NS", "NT", "NU", "NV", "OA", "OB", "OC", "OD", "OE", "OF", "OK", "OT", "OU", "P2", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PI", "PJ", "PK", "PL", "PN", "PO", "PP", "PR", "PT", "PU", "PV", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "RD", "RG", "RJ", "RK", "RL", "RO", "RT", "RZ", "SA", "SB", "SC", "SD", "SE", "SH", "SI", "SK", "SL", "SM", "SO", "SP", "SS", "ST", "SU", "SV", "SW", "SY", "SZ", "T1", "TB", "TC", "TD", "TE", "TG", "TI", "TK", "TL", "TN", "TO", "TR", "TS", "TT", "TU", "TV", "TW", "TY", "TZ", "UC", "UN", "VA", "VG", "VI", "VK", "VL", "VO", "VP", "VQ", "VN", "VR", "VS", "VY", "WA", "WB", "WC", "WD", "WF", "WG", "WH", "WJ", "WK", "WL", "WM", "WN", "WP", "WQ", "WR", "WS", "WT", "WU", "WV", "WW", "WX", "WY", "WZ", "XA", "XB", "XC", "XD", "XF", "XG", "XH", "XJ", "XK", "YA", "YB", "YC", "YD", "YF", "YG", "YH", "YJ", "YK", "YL", "YM", "YN", "YP", "YQ", "YR", "YS", "YT", "YV", "YW", "YX", "YY", "YZ", "ZA", "ZB", "ZC", "ZD", "ZF", "ZG", "ZH", "ZJ", "ZK", "ZL", "ZM", "ZN", "ZP", "ZQ", "ZR", "ZS", "ZT", "ZU", "ZV", "ZW", "ZX", "ZY", "ZZ"]); +export type PackageTypeCodeEnum = z.infer; +export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; + +/** + * PackageTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PackageTypeEmployeeDTO = z.infer; + +/** + * PackageTypeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the package type + * @property { string } name Unique name for the package type + * @property { number } length Length of the package type + * @property { number } width Width of the package type + * @property { number } height Height of the package type + * @property { string } unit Measurement unit for dimensions + * @property { boolean } archived Indicates if the package type is archived + * @property { PackageTypeCodeEnum } code + * @property { string } createdById + * @property { PackageTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PackageTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const PackageTypeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the package type"), name: z.string().describe("Unique name for the package type"), length: z.number().describe("Length of the package type").nullish(), width: z.number().describe("Width of the package type").nullish(), height: z.number().describe("Height of the package type").nullish(), unit: z.string().describe("Measurement unit for dimensions"), archived: z.boolean().describe("Indicates if the package type is archived"), code: PackageTypeCodeEnumSchema.nullish(), createdById: z.string().nullish(), createdBy: PackageTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PackageTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type PackageTypeResponseDTO = z.infer; + +/** + * CreatePackageTypeRequestDTOSchema + * @type { object } + * @property { string } name Unique name for the package type + * @property { number } length Length of the package type + * @property { number } width Width of the package type + * @property { number } height Height of the package type + * @property { string } unit Measurement unit for dimensions + * @property { PackageTypeCodeEnum } code + */ +export const CreatePackageTypeRequestDTOSchema = z.object({ name: z.string().describe("Unique name for the package type"), length: z.number().describe("Length of the package type").nullish(), width: z.number().describe("Width of the package type").nullish(), height: z.number().describe("Height of the package type").nullish(), unit: z.string().describe("Measurement unit for dimensions"), code: PackageTypeCodeEnumSchema.nullish() }).readonly(); +export type CreatePackageTypeRequestDTO = z.infer; + +/** + * UpdatePackageTypeRequestDTOSchema + * @type { object } + * @property { string } name Updated name for package type + * @property { number } length Updated length of the package type + * @property { number } width Updated width of the package type + * @property { number } height Updated height of the package type + * @property { string } unit Updated measurement unit for dimensions + * @property { PackageTypeCodeEnum } code + */ +export const UpdatePackageTypeRequestDTOSchema = z.object({ name: z.string().describe("Updated name for package type"), length: z.number().describe("Updated length of the package type").nullable(), width: z.number().describe("Updated width of the package type").nullable(), height: z.number().describe("Updated height of the package type").nullable(), unit: z.string().describe("Updated measurement unit for dimensions"), code: PackageTypeCodeEnumSchema }).readonly(); +export type UpdatePackageTypeRequestDTO = z.infer; + +/** + * PackageTypePaginationFilterDtoSchema + * @type { object } + * @property { boolean } archived Archived + * @property { string } search + */ +export const PackageTypePaginationFilterDtoSchema = z.object({ archived: z.boolean().describe("Archived"), search: z.string() }).readonly(); +export type PackageTypePaginationFilterDto = z.infer; + +/** + * PackageTypeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const PackageTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type PackageTypeLabelFilterDto = z.infer; + +/** + * PackageTypesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PackageTypesPaginateOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PackageTypesPaginateOrderParamEnum = z.infer; +export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParamEnumSchema.enum; + +/** + * PackageTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PackageTypeResponseDTO[] } items + */ +export const PackageTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageTypeResponseDTOSchema).readonly() }).readonly().shape }); +export type PackageTypesPaginateResponse = z.infer; + +/** + * PackageTypesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PackageTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PackageTypesPaginateLabelsOrderParamEnum = z.infer; +export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * PackageTypesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PackageTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PackageTypesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/packageTypes/packageTypes.queries.ts b/test/generated/full/packageTypes/packageTypes.queries.ts new file mode 100644 index 0000000..b7a20a5 --- /dev/null +++ b/test/generated/full/packageTypes/packageTypes.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PackageTypesAcl } from "./packageTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PackageTypesModels } from "./packageTypes.models"; +import { PackageTypesApi } from "./packageTypes.api"; + +export namespace PackageTypesQueries { +export const moduleName = QueryModule.PackageTypes; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string) => [...keys.all, "/package-types", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string) => [...keys.all, "/package-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/package-types/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Package Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PackageTypesAcl.canUsePaginate()); + return PackageTypesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Package Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PackageTypesAcl.canUsePaginate()); + return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new Package Type + * @permission Requires `canUseCreate` ability + * @param { PackageTypesModels.CreatePackageTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PackageTypesAcl.canUseCreate()); + return PackageTypesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate package type labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PackageTypesAcl.canUsePaginateLabels()); + return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate package type labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PackageTypesAcl.canUsePaginateLabels()); + return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get Package Type by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PackageTypesAcl.canUseFindById()); + return PackageTypesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Package Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PackageTypesModels.UpdatePackageTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PackageTypesAcl.canUseUpdate()); + return PackageTypesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Package Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PackageTypesAcl.canUseArchive()); + return PackageTypesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive Package Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PackageTypesAcl.canUseUnarchive()); + return PackageTypesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/partnerNetworks/partnerNetworks.acl.ts b/test/generated/full/partnerNetworks/partnerNetworks.acl.ts new file mode 100644 index 0000000..b56d576 --- /dev/null +++ b/test/generated/full/partnerNetworks/partnerNetworks.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PartnerNetworksAcl { +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "PartnerNetwork" +] as AbilityTuple<"Read", "PartnerNetwork">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "PartnerNetwork" +] as AbilityTuple<"Read", "PartnerNetwork">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "PartnerNetwork" +] as AbilityTuple<"Create", "PartnerNetwork">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "PartnerNetwork" +] as AbilityTuple<"Read", "PartnerNetwork">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "PartnerNetwork" +] as AbilityTuple<"Update", "PartnerNetwork">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "PartnerNetwork" +] as AbilityTuple<"Archive", "PartnerNetwork">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "PartnerNetwork" +] as AbilityTuple<"Archive", "PartnerNetwork">; + +} diff --git a/test/generated/full/partnerNetworks/partnerNetworks.api.ts b/test/generated/full/partnerNetworks/partnerNetworks.api.ts new file mode 100644 index 0000000..d24231a --- /dev/null +++ b/test/generated/full/partnerNetworks/partnerNetworks.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; + +export namespace PartnerNetworksApi { +export const paginateLabels = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, + `/partner-networks/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, + `/partner-networks`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks`, + ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}`, + config + ) +}; +export const update = (id: string, data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}`, + ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/partnerNetworks/partnerNetworks.configs.ts b/test/generated/full/partnerNetworks/partnerNetworks.configs.ts new file mode 100644 index 0000000..b9d6545 --- /dev/null +++ b/test/generated/full/partnerNetworks/partnerNetworks.configs.ts @@ -0,0 +1,114 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PartnerNetworksQueries } from "./partnerNetworks.queries"; +import { PartnerNetworksAcl } from "./partnerNetworks.acl"; + +export namespace PartnerNetworksConfigs { +export const partnerNetworksConfig = { + meta: { + title: "Partner Networks", + }, + readAll: { + acl: PartnerNetworksAcl.canUsePaginate, + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + paginated: PartnerNetworksQueries.usePaginate, + infinite: PartnerNetworksQueries.usePaginateInfinite, + filters: { + schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: PartnerNetworksAcl.canUseFindById, + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + query: PartnerNetworksQueries.useFindById, + }, + create: { + acl: PartnerNetworksAcl.canUseCreate, + schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, + mutation: PartnerNetworksQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, + update: { + acl: PartnerNetworksAcl.canUseUpdate, + schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, + mutation: PartnerNetworksQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: PartnerNetworksAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PartnerNetworksQueries.usePaginateLabels, + infinite: PartnerNetworksQueries.usePaginateLabelsInfinite, + filters: { + schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/partnerNetworks/partnerNetworks.models.ts b/test/generated/full/partnerNetworks/partnerNetworks.models.ts new file mode 100644 index 0000000..e87d278 --- /dev/null +++ b/test/generated/full/partnerNetworks/partnerNetworks.models.ts @@ -0,0 +1,105 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PartnerNetworksModels { +/** + * PartnerNetworkEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PartnerNetworkEmployeeDTO = z.infer; + +/** + * PartnerNetworkResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the partner network + * @property { string } name Name of the partner network + * @property { boolean } archived Whether the partner network is archived + * @property { string } createdById + * @property { PartnerNetworkEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PartnerNetworkEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const PartnerNetworkResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the partner network"), name: z.string().describe("Name of the partner network"), archived: z.boolean().describe("Whether the partner network is archived"), createdById: z.string().nullish(), createdBy: PartnerNetworkEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PartnerNetworkEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type PartnerNetworkResponseDTO = z.infer; + +/** + * PartnerNetworkLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const PartnerNetworkLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type PartnerNetworkLabelFilterDto = z.infer; + +/** + * PartnerNetworkPaginationFilterDtoSchema + * @type { object } + * @property { string } search Free search + * @property { boolean } archived + */ +export const PartnerNetworkPaginationFilterDtoSchema = z.object({ search: z.string().describe("Free search"), archived: z.boolean() }).readonly(); +export type PartnerNetworkPaginationFilterDto = z.infer; + +/** + * CreatePartnerNetworkRequestDTOSchema + * @type { object } + * @property { string } name Name of the partner network + */ +export const CreatePartnerNetworkRequestDTOSchema = z.object({ name: z.string().describe("Name of the partner network") }).readonly(); +export type CreatePartnerNetworkRequestDTO = z.infer; + +/** + * UpdatePartnerNetworkRequestDTOSchema + * @type { object } + * @property { string } name Name of the partner network + */ +export const UpdatePartnerNetworkRequestDTOSchema = z.object({ name: z.string().describe("Name of the partner network") }).readonly(); +export type UpdatePartnerNetworkRequestDTO = z.infer; + +/** + * PartnerNetworksPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PartnerNetworksPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PartnerNetworksPaginateLabelsOrderParamEnum = z.infer; +export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPaginateLabelsOrderParamEnumSchema.enum; + +/** + * PartnerNetworksPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PartnerNetworksPaginateLabelsResponse = z.infer; + +/** + * PartnerNetworksPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PartnerNetworksPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PartnerNetworksPaginateOrderParamEnum = z.infer; +export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrderParamEnumSchema.enum; + +/** + * PartnerNetworksPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerNetworkResponseDTO[] } items + */ +export const PartnerNetworksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).readonly() }).readonly().shape }); +export type PartnerNetworksPaginateResponse = z.infer; + +} diff --git a/test/generated/full/partnerNetworks/partnerNetworks.queries.ts b/test/generated/full/partnerNetworks/partnerNetworks.queries.ts new file mode 100644 index 0000000..a0514a6 --- /dev/null +++ b/test/generated/full/partnerNetworks/partnerNetworks.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PartnerNetworksAcl } from "./partnerNetworks.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; +import { PartnerNetworksApi } from "./partnerNetworks.api"; + +export namespace PartnerNetworksQueries { +export const moduleName = QueryModule.PartnerNetworks; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string) => [...keys.all, "/partner-networks", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/partner-networks/:id", id] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate partner networks with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); + return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate partner networks with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); + return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary Paginate Partner Networks + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUsePaginate()); + return PartnerNetworksApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Partner Networks + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PartnerNetworksAcl.canUsePaginate()); + return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new Partner Network + * @permission Requires `canUseCreate` ability + * @param { PartnerNetworksModels.CreatePartnerNetworkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PartnerNetworksAcl.canUseCreate()); + return PartnerNetworksApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get Partner Network by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUseFindById()); + return PartnerNetworksApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Partner Network + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PartnerNetworksAcl.canUseUpdate()); + return PartnerNetworksApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Partner Network + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PartnerNetworksAcl.canUseArchive()); + return PartnerNetworksApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive Partner Network + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PartnerNetworksAcl.canUseUnarchive()); + return PartnerNetworksApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/paymentConfirmations/paymentConfirmations.acl.ts b/test/generated/full/paymentConfirmations/paymentConfirmations.acl.ts new file mode 100644 index 0000000..2ede29d --- /dev/null +++ b/test/generated/full/paymentConfirmations/paymentConfirmations.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PaymentConfirmationsAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read payment confirmation items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate payment confirmation document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetEml` mutation ability. For global ability, omit the object parameter. + * @description Download payment confirmation as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetEml` mutation + */ +export const canUseGetEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +} diff --git a/test/generated/full/paymentConfirmations/paymentConfirmations.api.ts b/test/generated/full/paymentConfirmations/paymentConfirmations.api.ts new file mode 100644 index 0000000..25755a1 --- /dev/null +++ b/test/generated/full/paymentConfirmations/paymentConfirmations.api.ts @@ -0,0 +1,54 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; + +export namespace PaymentConfirmationsApi { +export const get = (officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, + `/offices/${officeId}/payment-confirmations`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const generate = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payment-confirmations/generate`, + ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getEml = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payment-confirmations/eml`, + ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/full/paymentConfirmations/paymentConfirmations.configs.ts b/test/generated/full/paymentConfirmations/paymentConfirmations.configs.ts new file mode 100644 index 0000000..af0fe49 --- /dev/null +++ b/test/generated/full/paymentConfirmations/paymentConfirmations.configs.ts @@ -0,0 +1,49 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; +import { PaymentConfirmationsQueries } from "./paymentConfirmations.queries"; +import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; + +export namespace PaymentConfirmationsConfigs { +export const paymentConfirmationsConfig = { + meta: { + title: "Payment Confirmations", + }, + readAll: { + acl: PaymentConfirmationsAcl.canUseGet, + schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, + paginated: PaymentConfirmationsQueries.useGet, + infinite: PaymentConfirmationsQueries.useGetInfinite, + filters: { + schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, + options: { + inputs: { + businessPartnerId: true, + paymentDate: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, + options: { + columns: { + invoiceId: true, + invoiceNumber: true, + invoiceDate: true, + invoiceAmount: true, + amount: true, + currencyNotation: true, + reference: true, + position: true, + paymentDate: true, + }, + sortable: PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/paymentConfirmations/paymentConfirmations.models.ts b/test/generated/full/paymentConfirmations/paymentConfirmations.models.ts new file mode 100644 index 0000000..acbe59b --- /dev/null +++ b/test/generated/full/paymentConfirmations/paymentConfirmations.models.ts @@ -0,0 +1,70 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PaymentConfirmationsModels { +/** + * PaymentConfirmationPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type PaymentConfirmationPositionDto = z.infer; + +/** + * PaymentConfirmationItemDtoSchema + * @type { object } + * @property { string } invoiceId Invoice ID + * @property { string } invoiceNumber Invoice number + * @property { string } invoiceDate Invoice date + * @property { number } invoiceAmount Invoice amount + * @property { number } amount Payment amount + * @property { string } currencyNotation Currency notation + * @property { string } reference Reference + * @property { PaymentConfirmationPositionDto } position Position information + * @property { string } paymentDate Payment date + */ +export const PaymentConfirmationItemDtoSchema = z.object({ invoiceId: z.string().describe("Invoice ID"), invoiceNumber: z.string().describe("Invoice number"), invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date"), invoiceAmount: z.number().describe("Invoice amount"), amount: z.number().describe("Payment amount"), currencyNotation: z.string().describe("Currency notation"), reference: z.string().describe("Reference").nullish(), position: PaymentConfirmationPositionDtoSchema.describe("Position information"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date") }).readonly(); +export type PaymentConfirmationItemDto = z.infer; + +/** + * PaymentConfirmationItemFilterDtoSchema + * @type { object } + * @property { string } businessPartnerId Business partner ID + * @property { string } paymentDate Payment date + */ +export const PaymentConfirmationItemFilterDtoSchema = z.object({ businessPartnerId: z.string().describe("Business partner ID"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date") }).readonly(); +export type PaymentConfirmationItemFilterDto = z.infer; + +/** + * GeneratePaymentConfirmationRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId Business partner ID + * @property { string } paymentDate Payment date + * @property { string } positionId Position ID (optional) + */ +export const GeneratePaymentConfirmationRequestDtoSchema = z.object({ businessPartnerId: z.string().describe("Business partner ID"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), positionId: z.string().describe("Position ID (optional)").nullish() }).readonly(); +export type GeneratePaymentConfirmationRequestDto = z.infer; + +/** + * PaymentConfirmationsGetOrderParamEnumSchema + * @type { enum } + */ +export const PaymentConfirmationsGetOrderParamEnumSchema = z.enum(["paymentDate", "invoiceNumber", "amount"]); +export type PaymentConfirmationsGetOrderParamEnum = z.infer; +export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrderParamEnumSchema.enum; + +/** + * PaymentConfirmationsGetResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PaymentConfirmationItemDto[] } items + */ +export const PaymentConfirmationsGetResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).readonly() }).readonly().shape }); +export type PaymentConfirmationsGetResponse = z.infer; + +} diff --git a/test/generated/full/paymentConfirmations/paymentConfirmations.queries.ts b/test/generated/full/paymentConfirmations/paymentConfirmations.queries.ts new file mode 100644 index 0000000..129aa28 --- /dev/null +++ b/test/generated/full/paymentConfirmations/paymentConfirmations.queries.ts @@ -0,0 +1,131 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; +import { PaymentConfirmationsApi } from "./paymentConfirmations.api"; + +export namespace PaymentConfirmationsQueries { +export const moduleName = QueryModule.PaymentConfirmations; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", officeId, filter, limit, order, page, cursor] as const, + getInfinite: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", "infinite", officeId, filter, limit, order, cursor] as const, +}; + +/** + * Query `useGet` + * @summary Get payment confirmation items + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, filter, limit, order, page, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, filter, limit, order, page, cursor), + queryFn: () => { + checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); + return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useGetInfinite + * @summary Get payment confirmation items + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetInfinite = ({ officeId, filter, limit, order, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); + return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useGenerate` - recommended when file should not be cached + * @summary Generate payment confirmation PDF + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId } )); + return PaymentConfirmationsApi.generate(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGetEml` - recommended when file should not be cached + * @summary Get payment confirmation as EML file with PDF attachment + * @permission Requires `canUseGetEml` ability + * @param { string } mutation.officeId Path parameter + * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId } )); + return PaymentConfirmationsApi.getEml(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/ports/ports.acl.ts b/test/generated/full/ports/ports.acl.ts new file mode 100644 index 0000000..9332110 --- /dev/null +++ b/test/generated/full/ports/ports.acl.ts @@ -0,0 +1,54 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PortsAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Port" +] as AbilityTuple<"Read", "Port">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Port" +] as AbilityTuple<"Create", "Port">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Port" +] as AbilityTuple<"Read", "Port">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Port" +] as AbilityTuple<"Update", "Port">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Port" +] as AbilityTuple<"Read", "Port">; + +} diff --git a/test/generated/full/ports/ports.api.ts b/test/generated/full/ports/ports.api.ts new file mode 100644 index 0000000..413f9ec --- /dev/null +++ b/test/generated/full/ports/ports.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PortsModels } from "./ports.models"; + +export namespace PortsApi { +export const paginate = (limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PortsModels.PortsPaginateResponseSchema }, + `/ports`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: PortsModels.CreatePortRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports`, + ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, + `/ports/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports/${id}`, + ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports/${id}`, + config + ) +}; +} diff --git a/test/generated/full/ports/ports.configs.ts b/test/generated/full/ports/ports.configs.ts new file mode 100644 index 0000000..33adfc6 --- /dev/null +++ b/test/generated/full/ports/ports.configs.ts @@ -0,0 +1,128 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PortsModels } from "./ports.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PortsQueries } from "./ports.queries"; +import { PortsAcl } from "./ports.acl"; + +export namespace PortsConfigs { +export const portsConfig = { + meta: { + title: "Ports", + }, + readAll: { + acl: PortsAcl.canUsePaginate, + schema: PortsModels.PortResponseDTOSchema, + paginated: PortsQueries.usePaginate, + infinite: PortsQueries.usePaginateInfinite, + filters: { + schema: PortsModels.PortPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PortsModels.PortPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PortsModels.PortResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + address: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PortsModels.PortsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: PortsAcl.canUseFindById, + schema: PortsModels.PortResponseDTOSchema, + query: PortsQueries.useFindById, + }, + create: { + acl: PortsAcl.canUseCreate, + schema: PortsModels.CreatePortRequestDTOSchema, + mutation: PortsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PortsModels.CreatePortRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) + }, + update: { + acl: PortsAcl.canUseUpdate, + schema: PortsModels.UpdatePortRequestDTOSchema, + mutation: PortsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PortsModels.UpdatePortRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: PortsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PortsQueries.usePaginateLabels, + infinite: PortsQueries.usePaginateLabelsInfinite, + filters: { + schema: PortsModels.PortLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PortsModels.PortLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PortsModels.PortsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/ports/ports.models.ts b/test/generated/full/ports/ports.models.ts new file mode 100644 index 0000000..7bb660d --- /dev/null +++ b/test/generated/full/ports/ports.models.ts @@ -0,0 +1,151 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PortsModels { +/** + * PortCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PortCityDto = z.infer; + +/** + * PortCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const PortCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type PortCountryDto = z.infer; + +/** + * PortAddressDtoSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { PortCityDto } city + * @property { string } district District name + * @property { PortCountryDto } country + */ +export const PortAddressDtoSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: PortCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: PortCountryDtoSchema.nullish() }).readonly(); +export type PortAddressDto = z.infer; + +/** + * PortEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PortEmployeeDTO = z.infer; + +/** + * PortResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the port + * @property { string } name Name of the port + * @property { string } matchCode Match code for the port + * @property { PortAddressDto } address Address details of the port + * @property { string } createdById + * @property { PortEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PortEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const PortResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port"), matchCode: z.string().describe("Match code for the port"), address: PortAddressDtoSchema.describe("Address details of the port"), createdById: z.string().nullish(), createdBy: PortEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PortEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type PortResponseDTO = z.infer; + +/** + * PortPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter ports by name or match code + */ +export const PortPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter ports by name or match code") }).readonly(); +export type PortPaginationFilterDto = z.infer; + +/** + * PortLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const PortLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type PortLabelFilterDto = z.infer; + +/** + * CreatePortRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } matchCode + * @property { string } street Street address + * @property { string } secondaryStreet + * @property { string } zip ZIP / Postal code + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } district + */ +export const CreatePortRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), street: z.string().describe("Street address"), secondaryStreet: z.string().nullish(), zip: z.string().describe("ZIP / Postal code"), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), district: z.string().nullish() }).readonly(); +export type CreatePortRequestDTO = z.infer; + +/** + * UpdatePortRequestDTOSchema + * @type { object } + * @property { string } name Updated name + * @property { string } matchCode Updated match code + * @property { string } street Updated street address + * @property { string } secondaryStreet Updated secondary street + * @property { string } zip Updated ZIP/Postal code + * @property { string } cityId Updated city id + * @property { string } countryId Updated country id + * @property { string } district + */ +export const UpdatePortRequestDTOSchema = z.object({ name: z.string().describe("Updated name"), matchCode: z.string().describe("Updated match code"), street: z.string().describe("Updated street address"), secondaryStreet: z.string().describe("Updated secondary street"), zip: z.string().describe("Updated ZIP/Postal code"), cityId: z.string().describe("Updated city id"), countryId: z.string().describe("Updated country id"), district: z.string() }).readonly(); +export type UpdatePortRequestDTO = z.infer; + +/** + * PortsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PortsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PortsPaginateOrderParamEnum = z.infer; +export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enum; + +/** + * PortsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PortResponseDTO[] } items + */ +export const PortsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PortResponseDTOSchema).readonly() }).readonly().shape }); +export type PortsPaginateResponse = z.infer; + +/** + * PortsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PortsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PortsPaginateLabelsOrderParamEnum = z.infer; +export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * PortsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PortsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PortsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/ports/ports.queries.ts b/test/generated/full/ports/ports.queries.ts new file mode 100644 index 0000000..60aaca2 --- /dev/null +++ b/test/generated/full/ports/ports.queries.ts @@ -0,0 +1,209 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PortsAcl } from "./ports.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PortsModels } from "./ports.models"; +import { PortsApi } from "./ports.api"; + +export namespace PortsQueries { +export const moduleName = QueryModule.Ports; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string) => [...keys.all, "/ports", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string) => [...keys.all, "/ports/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/ports/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Ports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PortsAcl.canUsePaginate()); + return PortsApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Ports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PortsAcl.canUsePaginate()); + return PortsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create port + * @permission Requires `canUseCreate` ability + * @param { PortsModels.CreatePortRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PortsAcl.canUseCreate()); + return PortsApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate ports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PortsAcl.canUsePaginateLabels()); + return PortsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate ports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PortsAcl.canUsePaginateLabels()); + return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update port + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PortsModels.UpdatePortRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PortsAcl.canUseUpdate()); + return PortsApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get port by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PortsAcl.canUseFindById()); + return PortsApi.findById(id, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/positionAccount/positionAccount.acl.ts b/test/generated/full/positionAccount/positionAccount.acl.ts new file mode 100644 index 0000000..f887d12 --- /dev/null +++ b/test/generated/full/positionAccount/positionAccount.acl.ts @@ -0,0 +1,17 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionAccountAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +} diff --git a/test/generated/full/positionAccount/positionAccount.api.ts b/test/generated/full/positionAccount/positionAccount.api.ts new file mode 100644 index 0000000..50e84d6 --- /dev/null +++ b/test/generated/full/positionAccount/positionAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { PositionAccountModels } from "./positionAccount.models"; + +export namespace PositionAccountApi { +export const get = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/account`, + config + ) +}; +} diff --git a/test/generated/full/positionAccount/positionAccount.models.ts b/test/generated/full/positionAccount/positionAccount.models.ts new file mode 100644 index 0000000..192acb9 --- /dev/null +++ b/test/generated/full/positionAccount/positionAccount.models.ts @@ -0,0 +1,52 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionAccountModels { +/** + * PositionAccountTotalsResponseDtoSchema + * @type { object } + * @property { number } totalBuyRates Total buy rates + * @property { number } totalSellRates Total sell rates + * @property { number } totalProfit Total profit + * @property { number } margin Margin percentage + * @property { number } displayAmount Display amount + * @property { string } displayCurrencyCode Display currency code + */ +export const PositionAccountTotalsResponseDtoSchema = z.object({ totalBuyRates: z.number().describe("Total buy rates"), totalSellRates: z.number().describe("Total sell rates"), totalProfit: z.number().describe("Total profit"), margin: z.number().describe("Margin percentage").nullish(), displayAmount: z.number().describe("Display amount"), displayCurrencyCode: z.string().describe("Display currency code") }).readonly(); +export type PositionAccountTotalsResponseDto = z.infer; + +/** + * PositionAccountMasterTotalsDtoSchema + * @type { object } + * @property { PositionAccountTotalsResponseDto } totals + * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency + */ +export const PositionAccountMasterTotalsDtoSchema = z.object({ totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly() }).readonly(); +export type PositionAccountMasterTotalsDto = z.infer; + +/** + * ChildPositionAccountReferenceDtoSchema + * @type { object } + * @property { string } positionId + * @property { string } positionNumber + * @property { string } accountId + */ +export const ChildPositionAccountReferenceDtoSchema = z.object({ positionId: z.string().nullish(), positionNumber: z.string(), accountId: z.string() }).readonly(); +export type ChildPositionAccountReferenceDto = z.infer; + +/** + * PositionAccountResponseDtoSchema + * @type { object } + * @property { string } id Account ID + * @property { string } positionId Position ID + * @property { string } invoiceId Invoice ID + * @property { CommonModels.PositionAccountItemDtoResponse[] } items Account items + * @property { PositionAccountTotalsResponseDto } totals + * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency + * @property { PositionAccountMasterTotalsDto } masterTotals + * @property { ChildPositionAccountReferenceDto[] } childPositionAccounts + */ +export const PositionAccountResponseDtoSchema = z.object({ id: z.string().describe("Account ID"), positionId: z.string().describe("Position ID").nullish(), invoiceId: z.string().describe("Invoice ID").nullish(), items: z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly().describe("Account items"), totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), masterTotals: PositionAccountMasterTotalsDtoSchema.nullish(), childPositionAccounts: z.array(ChildPositionAccountReferenceDtoSchema).readonly().nullish() }).readonly(); +export type PositionAccountResponseDto = z.infer; + +} diff --git a/test/generated/full/positionAccount/positionAccount.queries.ts b/test/generated/full/positionAccount/positionAccount.queries.ts new file mode 100644 index 0000000..cb137f9 --- /dev/null +++ b/test/generated/full/positionAccount/positionAccount.queries.ts @@ -0,0 +1,39 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionAccountAcl } from "./positionAccount.acl"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { PositionAccountApi } from "./positionAccount.api"; + +export namespace PositionAccountQueries { +export const moduleName = QueryModule.PositionAccount; + +export const keys = { + all: [moduleName] as const, + get: (positionId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account", positionId, officeId] as const, +}; + +/** + * Query `useGet` + * @summary Get position account details + * @permission Requires `canUseGet` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ positionId, officeId }: { positionId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(positionId, officeId), + queryFn: () => { + checkAcl(PositionAccountAcl.canUseGet({ officeId } )); + return PositionAccountApi.get(positionId, officeId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/positionAccountItems/positionAccountItems.acl.ts b/test/generated/full/positionAccountItems/positionAccountItems.acl.ts new file mode 100644 index 0000000..8f2be12 --- /dev/null +++ b/test/generated/full/positionAccountItems/positionAccountItems.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionAccountItemsAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useDeletePositionAccountItems` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePositionAccountItems` mutation + */ +export const canUseDeletePositionAccountItems = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ +export const canUseDuplicate = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useReassign` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReassign` mutation + */ +export const canUseReassign = ( + object?: { officeId: string, } +) => [ + "Reassign", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useReorder` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation + */ +export const canUseReorder = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +} diff --git a/test/generated/full/positionAccountItems/positionAccountItems.api.ts b/test/generated/full/positionAccountItems/positionAccountItems.api.ts new file mode 100644 index 0000000..3813a9b --- /dev/null +++ b/test/generated/full/positionAccountItems/positionAccountItems.api.ts @@ -0,0 +1,56 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionAccountItemsModels } from "./positionAccountItems.models"; + +export namespace PositionAccountItemsApi { +export const create = (positionId: string, officeId: string, data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), + config + ) +}; +export const deletePositionAccountItems = (positionId: string, officeId: string, data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), + config + ) +}; +export const update = (positionId: string, officeId: string, data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), + config + ) +}; +export const duplicate = (positionId: string, officeId: string, data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, + ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), + config + ) +}; +export const reassign = (positionId: string, officeId: string, data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items/reassign`, + ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), + config + ) +}; +export const reorder = (positionId: string, itemId: string, officeId: string, data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, + ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/positionAccountItems/positionAccountItems.models.ts b/test/generated/full/positionAccountItems/positionAccountItems.models.ts new file mode 100644 index 0000000..3ed5734 --- /dev/null +++ b/test/generated/full/positionAccountItems/positionAccountItems.models.ts @@ -0,0 +1,167 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionAccountItemsModels { +/** + * CreatePositionChargeDataRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const CreatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount"), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount"), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export type CreatePositionChargeDataRequestDto = z.infer; + +/** + * CreatePositionTextDataRequestDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const CreatePositionTextDataRequestDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type CreatePositionTextDataRequestDto = z.infer; + +/** + * CreatePositionAccountItemRequestDtoSchema + * @type { object } + * @property { CommonModels.PositionAccountItemTypeEnum } type Item type + * @property { CreatePositionChargeDataRequestDto } charge Charge data if type is CHARGE + * @property { CreatePositionTextDataRequestDto } text Text data if type is TEXT + */ +export const CreatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), charge: CreatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), text: CreatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish() }).readonly(); +export type CreatePositionAccountItemRequestDto = z.infer; + +/** + * CreatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { CreatePositionAccountItemRequestDto[] } items Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER) + */ +export const CreatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(CreatePositionAccountItemRequestDtoSchema).readonly().describe("Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER)") }).readonly(); +export type CreatePositionAccountItemsRequestDto = z.infer; + +/** + * UpdatePositionChargeDataRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const UpdatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount").nullable(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount").nullable(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export type UpdatePositionChargeDataRequestDto = z.infer; + +/** + * UpdatePositionTextDataRequestDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const UpdatePositionTextDataRequestDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type UpdatePositionTextDataRequestDto = z.infer; + +/** + * UpdatePositionAccountItemRequestDtoSchema + * @type { object } + * @property { CommonModels.PositionAccountItemTypeEnum } type Item type + * @property { UpdatePositionChargeDataRequestDto } charge Charge data if type is CHARGE + * @property { UpdatePositionTextDataRequestDto } text Text data if type is TEXT + */ +export const UpdatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), charge: UpdatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), text: UpdatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish() }).readonly(); +export type UpdatePositionAccountItemRequestDto = z.infer; + +/** + * UpdatePositionAccountItemWithIdRequestDtoSchema + * @type { object } + * @property { string } id ID of the item to update + * @property { UpdatePositionAccountItemRequestDto } data Data to update + */ +export const UpdatePositionAccountItemWithIdRequestDtoSchema = z.object({ id: z.string().describe("ID of the item to update"), data: UpdatePositionAccountItemRequestDtoSchema.describe("Data to update") }).readonly(); +export type UpdatePositionAccountItemWithIdRequestDto = z.infer; + +/** + * UpdatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { UpdatePositionAccountItemWithIdRequestDto[] } items Array of items to update + */ +export const UpdatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(UpdatePositionAccountItemWithIdRequestDtoSchema).readonly().describe("Array of items to update") }).readonly(); +export type UpdatePositionAccountItemsRequestDto = z.infer; + +/** + * DeletePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to delete + */ +export const DeletePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to delete") }).readonly(); +export type DeletePositionAccountItemsRequestDto = z.infer; + +/** + * DuplicatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to duplicate + */ +export const DuplicatePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to duplicate") }).readonly(); +export type DuplicatePositionAccountItemsRequestDto = z.infer; + +/** + * ReassignPositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to reassign + * @property { string } targetPositionId Target position ID to reassign items to + */ +export const ReassignPositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to reassign"), targetPositionId: z.string().describe("Target position ID to reassign items to") }).readonly(); +export type ReassignPositionAccountItemsRequestDto = z.infer; + +/** + * ReorderPositionAccountItemRequestDtoSchema + * @type { object } + * @property { number } orderPosition New order position for the item + */ +export const ReorderPositionAccountItemRequestDtoSchema = z.object({ orderPosition: z.number().describe("New order position for the item") }).readonly(); +export type ReorderPositionAccountItemRequestDto = z.infer; + +/** + * PositionAccountItemsCreateResponseSchema + * @type { array } + */ +export const PositionAccountItemsCreateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export type PositionAccountItemsCreateResponse = z.infer; + +/** + * PositionAccountItemsUpdateResponseSchema + * @type { array } + */ +export const PositionAccountItemsUpdateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export type PositionAccountItemsUpdateResponse = z.infer; + +/** + * PositionAccountItemsDuplicateResponseSchema + * @type { array } + */ +export const PositionAccountItemsDuplicateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export type PositionAccountItemsDuplicateResponse = z.infer; + +/** + * ReassignResponseSchema + * @type { array } + */ +export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export type ReassignResponse = z.infer; + +} diff --git a/test/generated/full/positionAccountItems/positionAccountItems.queries.ts b/test/generated/full/positionAccountItems/positionAccountItems.queries.ts new file mode 100644 index 0000000..25c26e1 --- /dev/null +++ b/test/generated/full/positionAccountItems/positionAccountItems.queries.ts @@ -0,0 +1,185 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionAccountItemsAcl } from "./positionAccountItems.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionAccountItemsModels } from "./positionAccountItems.models"; +import { PositionAccountItemsApi } from "./positionAccountItems.api"; + +export namespace PositionAccountItemsQueries { +export const moduleName = QueryModule.PositionAccountItems; + + + +/** + * Mutation `useCreate` + * @summary Create position account items (bulk) + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId } )); + return PositionAccountItemsApi.create(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeletePositionAccountItems` + * @summary Delete position account items (bulk) + * @permission Requires `canUseDeletePositionAccountItems` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeletePositionAccountItems = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId } )); + return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update position account items (bulk) + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId } )); + return PositionAccountItemsApi.update(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicate` + * @summary Duplicate position account items (bulk) + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId } )); + return PositionAccountItemsApi.duplicate(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReassign` + * @summary Reassign position account items to another position (bulk) + * @permission Requires `canUseReassign` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReassign = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId } )); + return PositionAccountItemsApi.reassign(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReorder` + * @summary Reorder position account item + * @permission Requires `canUseReorder` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.ReorderPositionAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, itemId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId } )); + return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/positionCargo/positionCargo.acl.ts b/test/generated/full/positionCargo/positionCargo.acl.ts new file mode 100644 index 0000000..f62ee50 --- /dev/null +++ b/test/generated/full/positionCargo/positionCargo.acl.ts @@ -0,0 +1,121 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionCargoAcl { +/** + * Use for `useListCargosByPositionId` query ability. For global ability, omit the object parameter. + * @description List cargo items by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByPositionId` query + */ +export const canUseListCargosByPositionId = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useCreateCargo` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCargo` mutation + */ +export const canUseCreateCargo = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. + * @description List cargo labels by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query + */ +export const canUseListCargoLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. + * @description Get cargo summary by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query + */ +export const canUseGetCargoSummary = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. + * @description Get cargo item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query + */ +export const canUseGetCargoById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. + * @description Update cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation + */ +export const canUseUpdateCargo = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation + */ +export const canUseDeleteCargo = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation + */ +export const canUseCreateBulkCargos = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation + */ +export const canUseDuplicateCargo = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +} diff --git a/test/generated/full/positionCargo/positionCargo.api.ts b/test/generated/full/positionCargo/positionCargo.api.ts new file mode 100644 index 0000000..e65a328 --- /dev/null +++ b/test/generated/full/positionCargo/positionCargo.api.ts @@ -0,0 +1,85 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionCargoModels } from "./positionCargo.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoApi { +export const listCargosByPositionId = (officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos`, + { + ...config, + params: { + order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createCargo = (officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config + ) +}; +export const listCargoLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/labels`, + config + ) +}; +export const getCargoSummary = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/summary`, + config + ) +}; +export const getCargoById = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + config + ) +}; +export const updateCargo = (officeId: string, positionId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), + config + ) +}; +export const deleteCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + undefined, + config + ) +}; +export const createBulkCargos = (numberOfCargos: number, officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config + ) +}; +export const duplicateCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/positionCargo/positionCargo.configs.ts b/test/generated/full/positionCargo/positionCargo.configs.ts new file mode 100644 index 0000000..a62c692 --- /dev/null +++ b/test/generated/full/positionCargo/positionCargo.configs.ts @@ -0,0 +1,133 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoQueries } from "./positionCargo.queries"; +import { PositionCargoAcl } from "./positionCargo.acl"; + +export namespace PositionCargoConfigs { +export const cargosConfig = { + meta: { + title: "Cargos", + }, + readAll: { + acl: PositionCargoAcl.canUseListCargosByPositionId, + schema: CommonModels.PositionCargoResponseDTOSchema, + paginated: PositionCargoQueries.useListCargosByPositionId, + infinite: PositionCargoQueries.useListCargosByPositionIdInfinite, + columns: dynamicColumns({ + schema: CommonModels.PositionCargoResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + quoteId: true, + rootFolderId: true, + cargoType: true, + autoCalculateTotals: true, + autoCalculateRates: true, + autoCalculateVgm: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + rateOptions: true, + rateClass: true, + textForCustoms: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + ratePerKg: true, + totalRate: true, + tare: true, + vgm: true, + hsCodeLabels: true, + note: true, + packages: true, + createdAt: true, + updatedAt: true, + completeWeight: true, + packageTotals: true, + }, + }, +}), + }, + read: { + acl: PositionCargoAcl.canUseGetCargoById, + schema: CommonModels.PositionCargoResponseDTOSchema, + query: PositionCargoQueries.useGetCargoById, + }, + create: { + acl: PositionCargoAcl.canUseCreateCargo, + schema: CommonModels.CreatePositionCargoDTOSchema, + mutation: PositionCargoQueries.useCreateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.CreatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, +}) + }, + update: { + acl: PositionCargoAcl.canUseUpdateCargo, + schema: CommonModels.UpdatePositionCargoDTOSchema, + mutation: PositionCargoQueries.useUpdateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.UpdatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, +}) + }, + delete: { + acl: PositionCargoAcl.canUseDeleteCargo, + mutation: PositionCargoQueries.useDeleteCargo, + }, +}; + +} diff --git a/test/generated/full/positionCargo/positionCargo.models.ts b/test/generated/full/positionCargo/positionCargo.models.ts new file mode 100644 index 0000000..1e3b8cc --- /dev/null +++ b/test/generated/full/positionCargo/positionCargo.models.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoModels { +/** + * ListCargosByPositionIdOrderParamSchema + * @type { array } + * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + */ +export const ListCargosByPositionIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).readonly().describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt").nullish(); +export type ListCargosByPositionIdOrderParam = z.infer; + +/** + * ListCargosByPositionIdResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.PositionCargoResponseDTO[] } items + */ +export const ListCargosByPositionIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape }); +export type ListCargosByPositionIdResponse = z.infer; + +/** + * PositionCargoListCargoLabelsResponseSchema + * @type { array } + */ +export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type PositionCargoListCargoLabelsResponse = z.infer; + +/** + * PositionCargoGetCargoSummaryResponseSchema + * @type { array } + */ +export const PositionCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); +export type PositionCargoGetCargoSummaryResponse = z.infer; + +/** + * PositionCargoCreateBulkCargosResponseSchema + * @type { array } + */ +export const PositionCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema).readonly(); +export type PositionCargoCreateBulkCargosResponse = z.infer; + +} diff --git a/test/generated/full/positionCargo/positionCargo.queries.ts b/test/generated/full/positionCargo/positionCargo.queries.ts new file mode 100644 index 0000000..bc814ea --- /dev/null +++ b/test/generated/full/positionCargo/positionCargo.queries.ts @@ -0,0 +1,294 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionCargoAcl } from "./positionCargo.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionCargoModels } from "./positionCargo.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoApi } from "./positionCargo.api"; + +export namespace PositionCargoQueries { +export const moduleName = QueryModule.PositionCargo; + +export const keys = { + all: [moduleName] as const, + listCargosByPositionId: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", officeId, positionId, limit, order, page, cursor] as const, + listCargosByPositionIdInfinite: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", "infinite", officeId, positionId, limit, order, cursor] as const, + listCargoLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/labels", officeId, positionId] as const, + getCargoSummary: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/summary", officeId, positionId] as const, + getCargoById: (officeId: string, positionId: string, cargoId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/:cargoId", officeId, positionId, cargoId] as const, +}; + +/** + * Query `useListCargosByPositionId` + * @summary List all cargo items for a position + * @permission Requires `canUseListCargosByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByPositionId = ({ officeId, positionId, limit, order, page, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListCargosByPositionIdInfinite + * @summary List all cargo items for a position + * @permission Requires `canUseListCargosByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByPositionIdInfinite = ({ officeId, positionId, limit, order, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreateCargo` + * @summary Create a new cargo item + * @permission Requires `canUseCreateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId } )); + return PositionCargoApi.createCargo(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListCargoLabels` + * @summary List all cargo labels for a position + * @permission Requires `canUseListCargoLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargoLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargoLabels(officeId, positionId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId } )); + return PositionCargoApi.listCargoLabels(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Query `useGetCargoSummary` + * @summary Get cargo summary grouped by transport unit type + * @permission Requires `canUseGetCargoSummary` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoSummary = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoSummary(officeId, positionId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId } )); + return PositionCargoApi.getCargoSummary(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Query `useGetCargoById` + * @summary Get a specific cargo item + * @permission Requires `canUseGetCargoById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.cargoId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoById = ({ officeId, positionId, cargoId }: { officeId: string, positionId: string, cargoId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoById(officeId, positionId, cargoId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId } )); + return PositionCargoApi.getCargoById(officeId, positionId, cargoId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCargo` + * @summary Update a cargo item + * @permission Requires `canUseUpdateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, data }) => { + checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId } )); + return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteCargo` + * @summary Delete a cargo item + * @permission Requires `canUseDeleteCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId }) => { + checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId } )); + return PositionCargoApi.deleteCargo(officeId, positionId, cargoId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateBulkCargos` + * @summary Create a new cargo item + * @permission Requires `canUseCreateBulkCargos` ability + * @param { number } mutation.numberOfCargos Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { + checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId } )); + return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicateCargo` + * @summary Duplicate a cargo item + * @permission Requires `canUseDuplicateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId }) => { + checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId } )); + return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/positionCargoPackage/positionCargoPackage.acl.ts b/test/generated/full/positionCargoPackage/positionCargoPackage.acl.ts new file mode 100644 index 0000000..552d48c --- /dev/null +++ b/test/generated/full/positionCargoPackage/positionCargoPackage.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionCargoPackageAcl { +/** + * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. + * @description Create cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation + */ +export const canUseCreatePackage = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. + * @description Update cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation + */ +export const canUseUpdatePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation + */ +export const canUseDeletePackage = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation + */ +export const canUseDuplicatePackage = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. + * @description Move cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation + */ +export const canUseMovePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +} diff --git a/test/generated/full/positionCargoPackage/positionCargoPackage.api.ts b/test/generated/full/positionCargoPackage/positionCargoPackage.api.ts new file mode 100644 index 0000000..bc571c0 --- /dev/null +++ b/test/generated/full/positionCargoPackage/positionCargoPackage.api.ts @@ -0,0 +1,48 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoPackageApi { +export const createPackage = (officeId: string, positionId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, + ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), + config + ) +}; +export const updatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), + config + ) +}; +export const deletePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, + undefined, + config + ) +}; +export const duplicatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, + undefined, + config + ) +}; +export const movePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, + ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/positionCargoPackage/positionCargoPackage.queries.ts b/test/generated/full/positionCargoPackage/positionCargoPackage.queries.ts new file mode 100644 index 0000000..fc8a8bd --- /dev/null +++ b/test/generated/full/positionCargoPackage/positionCargoPackage.queries.ts @@ -0,0 +1,163 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionCargoPackageAcl } from "./positionCargoPackage.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoPackageApi } from "./positionCargoPackage.api"; + +export namespace PositionCargoPackageQueries { +export const moduleName = QueryModule.PositionCargoPackage; + + + +/** + * Mutation `useCreatePackage` + * @summary Create a new package for a cargo + * @permission Requires `canUseCreatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId } )); + return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdatePackage` + * @summary Update a package + * @permission Requires `canUseUpdatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId } )); + return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeletePackage` + * @summary Delete a package + * @permission Requires `canUseDeletePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId }) => { + checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId } )); + return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicatePackage` + * @summary Duplicate a package + * @permission Requires `canUseDuplicatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId }) => { + checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId } )); + return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMovePackage` + * @summary Move a package to a different cargo + * @permission Requires `canUseMovePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId } )); + return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/positionChecklist/positionChecklist.acl.ts b/test/generated/full/positionChecklist/positionChecklist.acl.ts new file mode 100644 index 0000000..1f8dfca --- /dev/null +++ b/test/generated/full/positionChecklist/positionChecklist.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionChecklistAcl { +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List checklist items for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useApplyTemplates` mutation ability. For global ability, omit the object parameter. + * @description Apply checklist templates to position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useApplyTemplates` mutation + */ +export const canUseApplyTemplates = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useComplete` mutation ability. For global ability, omit the object parameter. + * @description Complete position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useComplete` mutation + */ +export const canUseComplete = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUncomplete` mutation ability. For global ability, omit the object parameter. + * @description Uncomplete position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUncomplete` mutation + */ +export const canUseUncomplete = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdateNotes` mutation ability. For global ability, omit the object parameter. + * @description Update position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateNotes` mutation + */ +export const canUseUpdateNotes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useReorder` mutation ability. For global ability, omit the object parameter. + * @description Reorder position checklist items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation + */ +export const canUseReorder = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/full/positionChecklist/positionChecklist.api.ts b/test/generated/full/positionChecklist/positionChecklist.api.ts new file mode 100644 index 0000000..ff7bf54 --- /dev/null +++ b/test/generated/full/positionChecklist/positionChecklist.api.ts @@ -0,0 +1,54 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionChecklistModels } from "./positionChecklist.models"; + +export namespace PositionChecklistApi { +export const list = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist`, + config + ) +}; +export const applyTemplates = (officeId: string, positionId: string, data: PositionChecklistModels.ApplyTemplatesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, + ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), + config + ) +}; +export const complete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, + undefined, + config + ) +}; +export const uncomplete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, + undefined, + config + ) +}; +export const updateNotes = (officeId: string, positionId: string, itemId: string, data: PositionChecklistModels.UpdatePositionChecklistItemDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, + ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), + config + ) +}; +export const reorder = (officeId: string, positionId: string, data: PositionChecklistModels.ReorderPositionChecklistDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/reorder`, + ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/positionChecklist/positionChecklist.models.ts b/test/generated/full/positionChecklist/positionChecklist.models.ts new file mode 100644 index 0000000..55eb2b7 --- /dev/null +++ b/test/generated/full/positionChecklist/positionChecklist.models.ts @@ -0,0 +1,77 @@ +import { z } from "zod"; + +export namespace PositionChecklistModels { +/** + * PositionChecklistCompletedByResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionChecklistCompletedByResponseDtoSchema = z.object({ id: z.string(), name: z.string().nullable() }).readonly(); +export type PositionChecklistCompletedByResponseDto = z.infer; + +/** + * PositionChecklistItemResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } checklistItemId + * @property { string } templateId + * @property { number } order + * @property { boolean } completed + * @property { string } completedAt + * @property { PositionChecklistCompletedByResponseDto } completedBy + * @property { string } notes + * @property { string } name + */ +export const PositionChecklistItemResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), checklistItemId: z.string(), templateId: z.string().nullable(), order: z.number(), completed: z.boolean(), completedAt: z.iso.datetime({ offset: true }).nullable(), completedBy: PositionChecklistCompletedByResponseDtoSchema.nullable(), notes: z.string().nullable(), name: z.string().nullable() }).readonly(); +export type PositionChecklistItemResponseDto = z.infer; + +/** + * PositionChecklistResponseDtoSchema + * @type { object } + * @property { PositionChecklistItemResponseDto[] } items + * @property { string[] } appliedTemplateIds + */ +export const PositionChecklistResponseDtoSchema = z.object({ items: z.array(PositionChecklistItemResponseDtoSchema).readonly(), appliedTemplateIds: z.array(z.string()).readonly() }).readonly(); +export type PositionChecklistResponseDto = z.infer; + +/** + * ApplyTemplatesRequestDtoSchema + * @type { object } + * @property { string[] } templateIds + */ +export const ApplyTemplatesRequestDtoSchema = z.object({ templateIds: z.array(z.string()).readonly() }).readonly(); +export type ApplyTemplatesRequestDto = z.infer; + +/** + * UpdatePositionChecklistItemDtoSchema + * @type { object } + * @property { string } notes Max Length: `512` + */ +export const UpdatePositionChecklistItemDtoSchema = z.object({ notes: z.string().max(512) }).readonly(); +export type UpdatePositionChecklistItemDto = z.infer; + +/** + * ReorderPositionChecklistDtoSchema + * @type { object } + * @property { string[] } itemIds + */ +export const ReorderPositionChecklistDtoSchema = z.object({ itemIds: z.array(z.string()).readonly() }).readonly(); +export type ReorderPositionChecklistDto = z.infer; + +/** + * ApplyTemplatesResponseSchema + * @type { array } + */ +export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); +export type ApplyTemplatesResponse = z.infer; + +/** + * PositionChecklistReorderResponseSchema + * @type { array } + */ +export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); +export type PositionChecklistReorderResponse = z.infer; + +} diff --git a/test/generated/full/positionChecklist/positionChecklist.queries.ts b/test/generated/full/positionChecklist/positionChecklist.queries.ts new file mode 100644 index 0000000..77020bb --- /dev/null +++ b/test/generated/full/positionChecklist/positionChecklist.queries.ts @@ -0,0 +1,182 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionChecklistAcl } from "./positionChecklist.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionChecklistModels } from "./positionChecklist.models"; +import { PositionChecklistApi } from "./positionChecklist.api"; + +export namespace PositionChecklistQueries { +export const moduleName = QueryModule.PositionChecklist; + +export const keys = { + all: [moduleName] as const, + list: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/checklist", officeId, positionId] as const, +}; + +/** + * Query `useList` + * @summary Get position checklist items + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, positionId), + queryFn: () => { + checkAcl(PositionChecklistAcl.canUseList({ officeId } )); + return PositionChecklistApi.list(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useApplyTemplates` + * @summary Apply checklist templates to position + * @permission Requires `canUseApplyTemplates` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionChecklistModels.ApplyTemplatesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useApplyTemplates = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId } )); + return PositionChecklistApi.applyTemplates(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useComplete` + * @summary Complete a checklist item + * @permission Requires `canUseComplete` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useComplete = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId }) => { + checkAcl(PositionChecklistAcl.canUseComplete({ officeId } )); + return PositionChecklistApi.complete(officeId, positionId, itemId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUncomplete` + * @summary Mark checklist item as not completed + * @permission Requires `canUseUncomplete` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUncomplete = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId }) => { + checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId } )); + return PositionChecklistApi.uncomplete(officeId, positionId, itemId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateNotes` + * @summary Update checklist item notes + * @permission Requires `canUseUpdateNotes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { PositionChecklistModels.UpdatePositionChecklistItemDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateNotes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId, data }) => { + checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId } )); + return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReorder` + * @summary Reorder checklist items + * @permission Requires `canUseReorder` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionChecklistModels.ReorderPositionChecklistDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionChecklistAcl.canUseReorder({ officeId } )); + return PositionChecklistApi.reorder(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/positionInvolvedParties/positionInvolvedParties.acl.ts b/test/generated/full/positionInvolvedParties/positionInvolvedParties.acl.ts new file mode 100644 index 0000000..8215460 --- /dev/null +++ b/test/generated/full/positionInvolvedParties/positionInvolvedParties.acl.ts @@ -0,0 +1,56 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionInvolvedPartiesAcl { +/** + * Use for `useFindByPositionId` query ability. For global ability, omit the object parameter. + * @description List position involved parties + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByPositionId` query + */ +export const canUseFindByPositionId = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation ability. For global ability, omit the object parameter. + * @description Delete position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation + */ +export const canUseDeleteOfficesPositionsInvolvedPartiesByPartyId = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/full/positionInvolvedParties/positionInvolvedParties.api.ts b/test/generated/full/positionInvolvedParties/positionInvolvedParties.api.ts new file mode 100644 index 0000000..a99a8f4 --- /dev/null +++ b/test/generated/full/positionInvolvedParties/positionInvolvedParties.api.ts @@ -0,0 +1,40 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionInvolvedPartiesModels } from "./positionInvolvedParties.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionInvolvedPartiesApi { +export const findByPositionId = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties`, + config + ) +}; +export const create = (officeId: string, positionId: string, data: CommonModels.CreateInvolvedPartyRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties`, + ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), + config + ) +}; +export const update = (officeId: string, positionId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, + ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), + config + ) +}; +export const deleteOfficesPositionsInvolvedPartiesByPartyId = (officeId: string, positionId: string, partyId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/positionInvolvedParties/positionInvolvedParties.models.ts b/test/generated/full/positionInvolvedParties/positionInvolvedParties.models.ts new file mode 100644 index 0000000..eaa5fc6 --- /dev/null +++ b/test/generated/full/positionInvolvedParties/positionInvolvedParties.models.ts @@ -0,0 +1,12 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionInvolvedPartiesModels { +/** + * FindByPositionIdResponseSchema + * @type { array } + */ +export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); +export type FindByPositionIdResponse = z.infer; + +} diff --git a/test/generated/full/positionInvolvedParties/positionInvolvedParties.queries.ts b/test/generated/full/positionInvolvedParties/positionInvolvedParties.queries.ts new file mode 100644 index 0000000..0190d0e --- /dev/null +++ b/test/generated/full/positionInvolvedParties/positionInvolvedParties.queries.ts @@ -0,0 +1,126 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionInvolvedPartiesAcl } from "./positionInvolvedParties.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionInvolvedPartiesApi } from "./positionInvolvedParties.api"; + +export namespace PositionInvolvedPartiesQueries { +export const moduleName = QueryModule.PositionInvolvedParties; + +export const keys = { + all: [moduleName] as const, + findByPositionId: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/involved-parties", officeId, positionId] as const, +}; + +/** + * Query `useFindByPositionId` + * @summary List position involved parties + * @permission Requires `canUseFindByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindByPositionId = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findByPositionId(officeId, positionId), + queryFn: () => { + checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId } )); + return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create position involved party + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId } )); + return PositionInvolvedPartiesApi.create(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update position involved party + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, partyId, data }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId } )); + return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteOfficesPositionsInvolvedPartiesByPartyId` + * @summary Delete position involved party + * @permission Requires `canUseDeleteOfficesPositionsInvolvedPartiesByPartyId` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, partyId }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId } )); + return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId(officeId, positionId, partyId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts new file mode 100644 index 0000000..41a91df --- /dev/null +++ b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts @@ -0,0 +1,32 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionProfitChangeTrackingAcl { +/** + * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. + * @description List position profit change groups + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.positionId positionId from positionId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query + */ +export const canUseFindProfitChangeGroups = ( + object?: { officeId: string, positionId: string, } +) => [ + "Read", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; + +/** + * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. + * @description Get position profit change group details + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.positionId positionId from positionId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query + */ +export const canUseFindProfitChangeGroupDetail = ( + object?: { officeId: string, positionId: string, } +) => [ + "Read", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; + +} diff --git a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.api.ts b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.api.ts new file mode 100644 index 0000000..a516599 --- /dev/null +++ b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.api.ts @@ -0,0 +1,31 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; + +export namespace PositionProfitChangeTrackingApi { +export const findProfitChangeGroups = (officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findProfitChangeGroupDetail = (groupId: string, officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, + `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, + config + ) +}; +} diff --git a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts new file mode 100644 index 0000000..a7c8680 --- /dev/null +++ b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts @@ -0,0 +1,51 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; +import { PositionProfitChangeTrackingQueries } from "./positionProfitChangeTracking.queries"; +import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; + +export namespace PositionProfitChangeTrackingConfigs { +export const profitChangeGroupsConfig = { + meta: { + title: "Profit Change Groups", + }, + readAll: { + acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups, + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, + paginated: PositionProfitChangeTrackingQueries.useFindProfitChangeGroups, + infinite: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, + filters: { + schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, + options: { + inputs: { + userId: true, + dateFrom: true, + dateTo: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, + options: { + columns: { + id: true, + timestamp: true, + users: true, + profit: true, + changeCount: true, + }, + sortable: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, + }, +}), + }, + read: { + acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema, + query: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, + }, +}; + +} diff --git a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.models.ts b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.models.ts new file mode 100644 index 0000000..f4040ce --- /dev/null +++ b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.models.ts @@ -0,0 +1,74 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionProfitChangeTrackingModels { +/** + * PositionAccountProfitChangeGroupDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto[] } users + * @property { object } profit + * @property { number } profit.amount + * @property { string } profit.currencyCode + * @property { number } changeCount + */ +export const PositionAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), changeCount: z.number() }).readonly(); +export type PositionAccountProfitChangeGroupDto = z.infer; + +/** + * PositionAccountProfitChangeEntryDtoSchema + * @type { object } + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto } user + * @property { number } changeNumber + * @property { number } oldProfit + * @property { number } newProfit + * @property { string } currencyCode + */ +export const PositionAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }).readonly(); +export type PositionAccountProfitChangeEntryDto = z.infer; + +/** + * PositionAccountProfitChangeGroupDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { string } currencyCode + * @property { PositionAccountProfitChangeEntryDto[] } entries + */ +export const PositionAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(PositionAccountProfitChangeEntryDtoSchema).readonly() }).readonly(); +export type PositionAccountProfitChangeGroupDetailDto = z.infer; + +/** + * PositionProfitChangeTrackingFilterDtoSchema + * @type { object } + * @property { string } userId User IDs who made the changes + * @property { string } dateFrom Date range start + * @property { string } dateTo Date range end + */ +export const PositionProfitChangeTrackingFilterDtoSchema = z.object({ userId: z.string().describe("User IDs who made the changes"), dateFrom: z.string().describe("Date range start"), dateTo: z.string().describe("Date range end") }).readonly(); +export type PositionProfitChangeTrackingFilterDto = z.infer; + +/** + * PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema + * @type { enum } + */ +export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema = z.enum(["timestamp", "profitAmount", "changeCount"]); +export type PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = z.infer; +export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema.enum; + +/** + * PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionAccountProfitChangeGroupDto[] } items + */ +export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape }); +export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; + +} diff --git a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts new file mode 100644 index 0000000..71d116b --- /dev/null +++ b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts @@ -0,0 +1,102 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; +import { PositionProfitChangeTrackingApi } from "./positionProfitChangeTracking.api"; + +export namespace PositionProfitChangeTrackingQueries { +export const moduleName = QueryModule.PositionProfitChangeTracking; + +export const keys = { + all: [moduleName] as const, + findProfitChangeGroups: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", officeId, positionId, limit, order, filter, page, cursor] as const, + findProfitChangeGroupsInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", "infinite", officeId, positionId, limit, order, filter, cursor] as const, + findProfitChangeGroupDetail: (groupId: string, officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups/:groupId", groupId, officeId, positionId] as const, +}; + +/** + * Query `useFindProfitChangeGroups` + * @summary List position profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` + * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroups = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); + return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindProfitChangeGroupsInfinite + * @summary List position profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` + * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupsInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); + return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindProfitChangeGroupDetail` + * @summary Get position profit change group details + * @permission Requires `canUseFindProfitChangeGroupDetail` ability + * @param { string } object.groupId Path parameter + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupDetail = ({ groupId, officeId, positionId }: { groupId: string, officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), + queryFn: () => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId } )); + return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/positionRoutes/positionRoutes.acl.ts b/test/generated/full/positionRoutes/positionRoutes.acl.ts new file mode 100644 index 0000000..7cd4cb8 --- /dev/null +++ b/test/generated/full/positionRoutes/positionRoutes.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionRoutesAcl { +/** + * Use for `useListRoutes` query ability. For global ability, omit the object parameter. + * @description List position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query + */ +export const canUseListRoutes = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Create position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation + */ +export const canUseCreateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Update position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation + */ +export const canUseUpdateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Delete position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation + */ +export const canUseDeleteRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. + * @description Split position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation + */ +export const canUseSplitRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. + * @description Merge position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation + */ +export const canUseMergeRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. + * @description Copy position route + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation + */ +export const canUseCopyRoute = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/full/positionRoutes/positionRoutes.api.ts b/test/generated/full/positionRoutes/positionRoutes.api.ts new file mode 100644 index 0000000..1e0faf5 --- /dev/null +++ b/test/generated/full/positionRoutes/positionRoutes.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionRoutesApi { +export const listRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.RouteListResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes`, + config + ) +}; +export const createRoutePoint = (officeId: string, positionId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, + ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), + config + ) +}; +export const updateRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, + ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), + config + ) +}; +export const deleteRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, + undefined, + config + ) +}; +export const splitRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/split`, + undefined, + config + ) +}; +export const mergeRoutes = (officeId: string, positionId: string, data: CommonModels.MergeRoutesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/merge`, + ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), + config + ) +}; +export const copyRoute = (officeId: string, positionId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, + ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/positionRoutes/positionRoutes.queries.ts b/test/generated/full/positionRoutes/positionRoutes.queries.ts new file mode 100644 index 0000000..8d22b16 --- /dev/null +++ b/test/generated/full/positionRoutes/positionRoutes.queries.ts @@ -0,0 +1,213 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionRoutesAcl } from "./positionRoutes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionRoutesApi } from "./positionRoutes.api"; + +export namespace PositionRoutesQueries { +export const moduleName = QueryModule.PositionRoutes; + +export const keys = { + all: [moduleName] as const, + listRoutes: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes", officeId, positionId] as const, +}; + +/** + * Query `useListRoutes` + * @summary List routes with points for a position (unified for sea/air/road) + * @permission Requires `canUseListRoutes` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoutes = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoutes(officeId, positionId), + queryFn: () => { + checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId } )); + return PositionRoutesApi.listRoutes(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateRoutePoint` + * @summary Create a route point + * @permission Requires `canUseCreateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, data }) => { + checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId } )); + return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateRoutePoint` + * @summary Update a route point + * @permission Requires `canUseUpdateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { + checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId } )); + return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRoutePoint` + * @summary Delete a route point + * @permission Requires `canUseDeleteRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, pointId }) => { + checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId } )); + return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useSplitRoutes` + * @summary Split routes by cargo (sea positions only) + * @permission Requires `canUseSplitRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId } )); + return PositionRoutesApi.splitRoutes(officeId, positionId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMergeRoutes` + * @summary Merge routes (sea positions only) + * @permission Requires `canUseMergeRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId } )); + return PositionRoutesApi.mergeRoutes(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopyRoute` + * @summary Copy route points to another route (sea positions only) + * @permission Requires `canUseCopyRoute` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, data }) => { + checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId } )); + return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/positions/positions.acl.ts b/test/generated/full/positions/positions.acl.ts new file mode 100644 index 0000000..002471f --- /dev/null +++ b/test/generated/full/positions/positions.acl.ts @@ -0,0 +1,212 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionsAcl { +/** + * Use for `useFindAll` query ability. For global ability, omit the object parameter. + * @description List position labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useTotalProfit` query ability. For global ability, omit the object parameter. + * @description Fake endpoint + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTotalProfit` query + */ +export const canUseTotalProfit = ( + object?: { officeId: string, } +) => [ + "TotalProfitView", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ +export const canUseListAvailablePartnersFor = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useExportPositions` mutation ability. For global ability, omit the object parameter. + * @description Export positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportPositions` mutation + */ +export const canUseExportPositions = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Export", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useListRouteLabels` query ability. For global ability, omit the object parameter. + * @description List route labels for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRouteLabels` query + */ +export const canUseListRouteLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useGetDuplicateDefaultParameters` query ability. For global ability, omit the object parameter. + * @description Read position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDuplicateDefaultParameters` query + */ +export const canUseGetDuplicateDefaultParameters = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ +export const canUseDuplicate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ +export const canUseCancel = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useRevertCancel` mutation ability. For global ability, omit the object parameter. + * @description Revert cancelled position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertCancel` mutation + */ +export const canUseRevertCancel = ( + object?: { officeId: string, } +) => [ + "RevertCancel", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useLinkChild` mutation ability. For global ability, omit the object parameter. + * @description Link positions to parent + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLinkChild` mutation + */ +export const canUseLinkChild = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUnlinkChild` mutation ability. For global ability, omit the object parameter. + * @description Link positions to parent + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlinkChild` mutation + */ +export const canUseUnlinkChild = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useListChild` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListChild` query + */ +export const canUseListChild = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/full/positions/positions.api.ts b/test/generated/full/positions/positions.api.ts new file mode 100644 index 0000000..b990f57 --- /dev/null +++ b/test/generated/full/positions/positions.api.ts @@ -0,0 +1,166 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionsApi { +export const findAll = (officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsFindAllResponseSchema }, + `/offices/${officeId}/positions/labels`, + { + ...config, + params: { + filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsPaginateResponseSchema }, + `/offices/${officeId}/positions`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: PositionsModels.CreatePositionRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions`, + ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), + config + ) +}; +export const totalProfit = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.TotalProfitResponseSchema }, + `/offices/${officeId}/positions/fake-total-profit`, + config + ) +}; +export const listAvailablePartnersFor = (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/positions/${positionId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), + }, + } + ) +}; +export const exportPositions = (officeId: string, data: PositionsModels.PositionExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/exports`, + ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}`, + config + ) +}; +export const update = (officeId: string, positionId: string, data: PositionsModels.UpdatePositionDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}`, + ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), + config + ) +}; +export const listRouteLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/routes/labels`, + config + ) +}; +export const getDuplicateDefaultParameters = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, + config + ) +}; +export const duplicate = (officeId: string, positionId: string, data: PositionsModels.DuplicatePositionRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/duplicate`, + ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), + config + ) +}; +export const cancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/cancel`, + undefined, + config + ) +}; +export const revertCancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/uncancel`, + undefined, + config + ) +}; +export const linkChild = (officeId: string, positionId: string, data: PositionsModels.LinkChildPositionsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/children`, + ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), + config + ) +}; +export const unlinkChild = (officeId: string, positionId: string, data: PositionsModels.UnlinkChildPositionsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/children`, + ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), + config + ) +}; +export const listChild = (officeId: string, positionId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.ListChildResponseSchema }, + `/offices/${officeId}/positions/${positionId}/children`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/full/positions/positions.configs.ts b/test/generated/full/positions/positions.configs.ts new file mode 100644 index 0000000..0e9cfce --- /dev/null +++ b/test/generated/full/positions/positions.configs.ts @@ -0,0 +1,259 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionsQueries } from "./positions.queries"; +import { PositionsAcl } from "./positions.acl"; + +export namespace PositionsConfigs { +export const positionsConfig = { + meta: { + title: "Positions", + }, + readAll: { + acl: PositionsAcl.canUsePaginate, + schema: PositionsModels.PositionPreviewResponseDtoSchema, + paginated: PositionsQueries.usePaginate, + infinite: PositionsQueries.usePaginateInfinite, + filters: { + schema: PositionsModels.PositionFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionsModels.PositionFilterDtoSchema, + options: { + inputs: { + transportMode: true, + customerId: true, + carrierId: true, + consigneeId: true, + isCancelled: true, + status: true, + number: true, + direction: true, + loadType: true, + serviceType: true, + employee: true, + searchQuery: true, + externalSystemId: true, + createdAt: true, + serviceDate: true, + departureDate: true, + arrivalDate: true, + blfromCostumerDate: true, + blfromCarrierDate: true, + customsDate: true, + vgmCustomerDate: true, + partnerNetworkId: true, + projectLiteId: true, + checklistItemsDone: true, + checklistItemsNotDone: true, + routing: true, + isExcludedFromStatistics: true, + isMasterPosition: true, + loadingPortId: true, + dischargePortId: true, + customerReference: true, + carrierReference: true, + consigneeReference: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PositionsModels.PositionPreviewResponseDtoSchema, + options: { + columns: { + id: true, + externalSystemId: true, + transportMode: true, + direction: true, + loadType: true, + createdAt: true, + number: true, + isCancelled: true, + customer: true, + customerReference: true, + consignee: true, + consigneeReference: true, + carrier: true, + carrierReference: true, + positionNumber: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + origin: true, + loadDate: true, + loadingPort: true, + dischargePort: true, + destination: true, + deliveryDate: true, + equipment: true, + serviceType: true, + destinationOffice: true, + currency: true, + profit: true, + margin: true, + employee: true, + project: true, + serviceDate: true, + departureDate: true, + arrivalDate: true, + blfromCostumerDate: true, + blfromCarrierDate: true, + customsDate: true, + vgmCustomerDate: true, + routing: true, + notes: true, + isMasterPosition: true, + hasInvoices: true, + parentPosition: true, + }, + sortable: PositionsModels.PositionsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: PositionsAcl.canUseGet, + schema: CommonModels.PositionCoreResponseDtoSchema, + query: PositionsQueries.useGet, + }, + create: { + acl: PositionsAcl.canUseCreate, + schema: PositionsModels.CreatePositionRequestDtoSchema, + mutation: PositionsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PositionsModels.CreatePositionRequestDtoSchema, + options: { + inputs: { + section: true, + direction: true, + transportMode: true, + loadType: true, + serviceType: true, + estimatedServiceDate: true, + customerBusinessPartnerId: true, + }, + }, +}) + }, + update: { + acl: PositionsAcl.canUseUpdate, + schema: PositionsModels.UpdatePositionDtoSchema, + mutation: PositionsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PositionsModels.UpdatePositionDtoSchema, + options: { + inputs: { + externalSystemId: true, + statusDate: true, + status: true, + loadType: true, + incoterms: true, + secondIncoterms: true, + fillingCompany: true, + sellingContract: true, + fillingScacCode: true, + serviceValidity: true, + ratesValidity: true, + serviceType: true, + buyRateReference: true, + frequency: true, + isParentPosition: true, + isExcludedFromStatistics: true, + team: true, + salesRepId: true, + responsibleEmployeeId: true, + receivedByEmployeeId: true, + originOfficeId: true, + projectLiteId: true, + notes: true, + inttraTypeOfMove: true, + volumetricWeightModifier: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: PositionsAcl.canUseFindAll, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PositionsQueries.useFindAll, + infinite: PositionsQueries.useFindAllInfinite, + filters: { + schema: PositionsModels.PositionLabelsFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionsModels.PositionLabelsFilterDtoSchema, + options: { + inputs: { + search: true, + isParentPosition: true, + isLinkedPosition: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + }, +}), + }, +}; + +export const childrenConfig = { + meta: { + title: "Children", + }, + readAll: { + acl: PositionsAcl.canUseListChild, + schema: PositionsModels.ChildPositionResponseDtoSchema, + paginated: PositionsQueries.useListChild, + infinite: PositionsQueries.useListChildInfinite, + columns: dynamicColumns({ + schema: PositionsModels.ChildPositionResponseDtoSchema, + options: { + columns: { + id: true, + number: true, + packages: true, + weight: true, + volume: true, + customer: true, + profit: true, + }, + }, +}), + }, + create: { + acl: PositionsAcl.canUseLinkChild, + schema: PositionsModels.LinkChildPositionsRequestDtoSchema, + mutation: PositionsQueries.useLinkChild, + inputDefs: dynamicInputs({ + schema: PositionsModels.LinkChildPositionsRequestDtoSchema, + options: { + inputs: { + childPositionIds: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/full/positions/positions.models.ts b/test/generated/full/positions/positions.models.ts new file mode 100644 index 0000000..6f71cac --- /dev/null +++ b/test/generated/full/positions/positions.models.ts @@ -0,0 +1,501 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionsModels { +/** + * PositionPreviewResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } externalSystemId + * @property { CommonModels.TransportModeEnum } transportMode + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { string } createdAt + * @property { string } number + * @property { boolean } isCancelled + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { string } customer.phone + * @property { string } customer.email + * @property { string } customerReference + * @property { object } consignee + * @property { string } consignee.id + * @property { string } consignee.name + * @property { string } consignee.matchCode + * @property { string } consignee.label + * @property { string } consigneeReference + * @property { object } carrier + * @property { string } carrier.id + * @property { string } carrier.name + * @property { string } carrier.matchCode + * @property { string } carrier.label + * @property { string } carrierReference + * @property { number } positionNumber + * @property { string } hblNumber + * @property { string } mblNumber + * @property { string } bookingNumber + * @property { string } vessel + * @property { string } voyage + * @property { string } vesselCarrier Carrier name from route point (sea positions only) + * @property { object } origin + * @property { string } origin.id + * @property { string } origin.name + * @property { string } loadDate + * @property { object } loadingPort + * @property { string } loadingPort.id + * @property { string } loadingPort.name + * @property { object } dischargePort + * @property { string } dischargePort.id + * @property { string } dischargePort.name + * @property { object } destination + * @property { string } destination.id + * @property { string } destination.name + * @property { string } deliveryDate + * @property { string } equipment + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { object } destinationOffice + * @property { string } destinationOffice.id + * @property { string } destinationOffice.name + * @property { string } currency + * @property { number } profit + * @property { number } margin + * @property { object } employee + * @property { string } employee.id + * @property { string } employee.name + * @property { object } project + * @property { string } project.id + * @property { string } project.name + * @property { string } serviceDate + * @property { string } departureDate + * @property { string } arrivalDate + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.EditorContentResponseDto } notes Notes + * @property { boolean } isMasterPosition + * @property { boolean } hasInvoices Whether this position has at least one invoice + * @property { object } parentPosition + * @property { string } parentPosition.id + * @property { string } parentPosition.number + */ +export const PositionPreviewResponseDtoSchema = z.object({ id: z.string(), externalSystemId: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), number: z.string(), isCancelled: z.boolean(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }).readonly(), customerReference: z.string().nullish(), consignee: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).readonly().nullish(), consigneeReference: z.string().nullish(), carrier: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).readonly().nullish(), carrierReference: z.string().nullish(), positionNumber: z.number().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), loadDate: z.iso.datetime({ offset: true }).nullish(), loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), deliveryDate: z.iso.datetime({ offset: true }).nullish(), equipment: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), currency: z.string().nullish(), profit: z.number().nullish(), margin: z.number().nullish(), employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), departureDate: z.iso.datetime({ offset: true }).nullish(), arrivalDate: z.iso.datetime({ offset: true }).nullish(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), isMasterPosition: z.boolean(), hasInvoices: z.boolean().describe("Whether this position has at least one invoice").nullish(), parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).readonly().nullish() }).readonly(); +export type PositionPreviewResponseDto = z.infer; + +/** + * PositionFilterDtoSchema + * @type { object } + * @property { CommonModels.TransportModeEnum } transportMode + * @property { string[] } customerId + * @property { string[] } carrierId Filter positions by carrier IDs + * @property { string[] } consigneeId Filter positions by consignee IDs + * @property { boolean } isCancelled + * @property { CommonModels.PositionStatusEnum } status + * @property { string } number + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } employee Filter positions by employee IDs + * @property { string } searchQuery + * @property { string } externalSystemId Filter positions by external system ID (substring match) + * @property { CommonModels.DateRangeDto } createdAt + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.DateRangeDto } departureDate + * @property { CommonModels.DateRangeDto } arrivalDate + * @property { CommonModels.DateRangeDto } blfromCostumerDate + * @property { CommonModels.DateRangeDto } blfromCarrierDate + * @property { CommonModels.DateRangeDto } customsDate + * @property { CommonModels.DateRangeDto } vgmCustomerDate + * @property { string } partnerNetworkId Filter positions by partner network ID + * @property { string[] } projectLiteId Filter positions by project IDs + * @property { string[] } checklistItemsDone Checklist item ids that must be completed + * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics + * @property { boolean } isMasterPosition + * @property { string[] } loadingPortId Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure) + * @property { string[] } dischargePortId Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport) + * @property { string } customerReference Filter positions by customer reference + * @property { string } carrierReference Filter positions by carrier reference + * @property { string } consigneeReference Filter positions by consignee reference + * @property { string } hblNumber Filter positions by HBL/HAWB number + * @property { string } mblNumber Filter positions by MBL/MAWB number + * @property { string } bookingNumber Filter positions by booking number + * @property { string } vessel Filter positions by vessel name + * @property { string } voyage Filter positions by voyage number + * @property { string } vesselCarrier Filter positions by vessel or carrier name + */ +export const PositionFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema, customerId: z.array(z.string()).readonly(), carrierId: z.array(z.string()).readonly().describe("Filter positions by carrier IDs"), consigneeId: z.array(z.string()).readonly().describe("Filter positions by consignee IDs"), isCancelled: z.boolean(), status: CommonModels.PositionStatusEnumSchema, number: z.string(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, employee: z.array(z.string()).readonly().describe("Filter positions by employee IDs"), searchQuery: z.string(), externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), createdAt: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, departureDate: CommonModels.DateRangeDtoSchema, arrivalDate: CommonModels.DateRangeDtoSchema, blfromCostumerDate: CommonModels.DateRangeDtoSchema, blfromCarrierDate: CommonModels.DateRangeDtoSchema, customsDate: CommonModels.DateRangeDtoSchema, vgmCustomerDate: CommonModels.DateRangeDtoSchema, partnerNetworkId: z.string().describe("Filter positions by partner network ID"), projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), routing: CommonModels.SeaRoutingEnumSchema, isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isMasterPosition: z.boolean(), loadingPortId: z.array(z.string()).readonly().describe("Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure)"), dischargePortId: z.array(z.string()).readonly().describe("Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport)"), customerReference: z.string().describe("Filter positions by customer reference"), carrierReference: z.string().describe("Filter positions by carrier reference"), consigneeReference: z.string().describe("Filter positions by consignee reference"), hblNumber: z.string().describe("Filter positions by HBL/HAWB number"), mblNumber: z.string().describe("Filter positions by MBL/MAWB number"), bookingNumber: z.string().describe("Filter positions by booking number"), vessel: z.string().describe("Filter positions by vessel name"), voyage: z.string().describe("Filter positions by voyage number"), vesselCarrier: z.string().describe("Filter positions by vessel or carrier name") }).readonly(); +export type PositionFilterDto = z.infer; + +/** + * PositionExportFilterDtoSchema + * @type { object } + * @property { CommonModels.TransportModeEnum } transportMode + * @property { string[] } customerId + * @property { boolean } isCancelled + * @property { CommonModels.PositionStatusEnum } status + * @property { string } number + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } responsibleEmployee Filter positions by responsible employee IDs + * @property { string } searchQuery + * @property { string } externalSystemId Filter positions by external system ID (substring match) + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.DateRangeDto } dateOfDeparture + * @property { CommonModels.DateRangeDto } dateOfArrival + * @property { CommonModels.DateRangeDto } blfromCostumerDate + * @property { CommonModels.DateRangeDto } blfromCarrierDate + * @property { CommonModels.DateRangeDto } customsDate + * @property { CommonModels.DateRangeDto } vgmCustomerDate + * @property { string } partnerNetworkId Filter positions by partner network ID + * @property { string[] } projectLiteId Filter positions by project IDs + * @property { string[] } checklistItemsDone Checklist item ids that must be completed + * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics + */ +export const PositionExportFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema, customerId: z.array(z.string()).readonly(), isCancelled: z.boolean(), status: CommonModels.PositionStatusEnumSchema, number: z.string(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, responsibleEmployee: z.array(z.string()).readonly().describe("Filter positions by responsible employee IDs"), searchQuery: z.string(), externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), statusDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, dateOfDeparture: CommonModels.DateRangeDtoSchema, dateOfArrival: CommonModels.DateRangeDtoSchema, blfromCostumerDate: CommonModels.DateRangeDtoSchema, blfromCarrierDate: CommonModels.DateRangeDtoSchema, customsDate: CommonModels.DateRangeDtoSchema, vgmCustomerDate: CommonModels.DateRangeDtoSchema, partnerNetworkId: z.string().describe("Filter positions by partner network ID"), projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), routing: CommonModels.SeaRoutingEnumSchema, isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly() }).readonly(); +export type PositionExportFilterDto = z.infer; + +/** + * PositionExportColumnSchema + * @type { enum } + */ +export const PositionExportColumnSchema = z.enum(["id", "externalSystemId", "transportMode", "direction", "loadType", "createdAt", "number", "isCancelled", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeName", "consigneeReference", "carrierName", "carrierReference", "positionNumber", "hblNumber", "mblNumber", "bookingNumber", "vessel", "voyage", "originName", "loadDate", "loadingPortName", "dischargePortName", "destinationName", "deliveryDate", "equipment", "serviceTypeName", "departureDate", "arrivalDate", "destinationOfficeName", "currency", "profit", "margin", "employeeName", "projectName", "serviceDate", "routing", "notes", "blFromCustomerDate", "blFromCarrierDate", "customsDate", "vgmCustomerDate", "isMasterPosition", "parentPositionId", "parentPositionNumber"]); +export type PositionExportColumn = z.infer; +export const PositionExportColumn = PositionExportColumnSchema.enum; + +/** + * PositionExportRequestDtoSchema + * @type { object } + * @property { string } order Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @property { PositionExportColumn[] } columns Min Items: `1` + * @property { PositionExportFilterDto } filter + */ +export const PositionExportRequestDtoSchema = z.object({ order: z.string().describe("Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition"), columns: z.array(PositionExportColumnSchema).readonly().min(1), filter: PositionExportFilterDtoSchema }).readonly(); +export type PositionExportRequestDto = z.infer; + +/** + * CreatePositionRequestDtoSchema + * @type { object } + * @property { CommonModels.SectionEnum } section + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum } transportMode + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } estimatedServiceDate + * @property { string } customerBusinessPartnerId + */ +export const CreatePositionRequestDtoSchema = z.object({ section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, estimatedServiceDate: z.iso.datetime({ offset: true }), customerBusinessPartnerId: z.string() }).readonly(); +export type CreatePositionRequestDto = z.infer; + +/** + * DuplicatePositionPackageInformationParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } packageType + * @property { boolean } packageQuantity + * @property { boolean } packageDescription + * @property { boolean } packageHsCodes + * @property { boolean } packageNetWeight + * @property { boolean } packageGrossWeight + * @property { boolean } packageCaseMark + * @property { boolean } packageNote + * @property { boolean } packageCustomsMark + */ +export const DuplicatePositionPackageInformationParametersDtoSchema = z.object({ enabled: z.boolean(), packageType: z.boolean(), packageQuantity: z.boolean(), packageDescription: z.boolean(), packageHsCodes: z.boolean(), packageNetWeight: z.boolean(), packageGrossWeight: z.boolean(), packageCaseMark: z.boolean(), packageNote: z.boolean(), packageCustomsMark: z.boolean() }).readonly(); +export type DuplicatePositionPackageInformationParametersDto = z.infer; + +/** + * DuplicatePositionCargoParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { DuplicatePositionPackageInformationParametersDto } packageInformation + */ +export const DuplicatePositionCargoParametersDtoSchema = z.object({ enabled: z.boolean(), packageInformation: DuplicatePositionPackageInformationParametersDtoSchema }).readonly(); +export type DuplicatePositionCargoParametersDto = z.infer; + +/** + * DuplicatePositionOverviewParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } quoteReference + */ +export const DuplicatePositionOverviewParametersDtoSchema = z.object({ enabled: z.boolean(), quoteReference: z.boolean() }).readonly(); +export type DuplicatePositionOverviewParametersDto = z.infer; + +/** + * DuplicatePositionInvolvedPartiesParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } involvedPartySection + */ +export const DuplicatePositionInvolvedPartiesParametersDtoSchema = z.object({ enabled: z.boolean(), involvedPartySection: z.boolean() }).readonly(); +export type DuplicatePositionInvolvedPartiesParametersDto = z.infer; + +/** + * DuplicatePositionRoutesParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } routeDates + * @property { boolean } routeLocation + */ +export const DuplicatePositionRoutesParametersDtoSchema = z.object({ enabled: z.boolean(), routeDates: z.boolean(), routeLocation: z.boolean() }).readonly(); +export type DuplicatePositionRoutesParametersDto = z.infer; + +/** + * DuplicatePositionFinanceAccountParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } exchangeRate + */ +export const DuplicatePositionFinanceAccountParametersDtoSchema = z.object({ enabled: z.boolean(), exchangeRate: z.boolean() }).readonly(); +export type DuplicatePositionFinanceAccountParametersDto = z.infer; + +/** + * DuplicatePositionDocumentsParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } hblWorkingDocument + * @property { boolean } siWorkingDocument + */ +export const DuplicatePositionDocumentsParametersDtoSchema = z.object({ enabled: z.boolean(), hblWorkingDocument: z.boolean(), siWorkingDocument: z.boolean() }).readonly(); +export type DuplicatePositionDocumentsParametersDto = z.infer; + +/** + * DuplicatePositionParametersDtoSchema + * @type { object } + * @property { DuplicatePositionOverviewParametersDto } overview + * @property { DuplicatePositionInvolvedPartiesParametersDto } involvedParties + * @property { DuplicatePositionCargoParametersDto } cargo + * @property { DuplicatePositionRoutesParametersDto } routes + * @property { DuplicatePositionFinanceAccountParametersDto } financeAccount + * @property { DuplicatePositionDocumentsParametersDto } documents + */ +export const DuplicatePositionParametersDtoSchema = z.object({ overview: DuplicatePositionOverviewParametersDtoSchema, involvedParties: DuplicatePositionInvolvedPartiesParametersDtoSchema, cargo: DuplicatePositionCargoParametersDtoSchema, routes: DuplicatePositionRoutesParametersDtoSchema, financeAccount: DuplicatePositionFinanceAccountParametersDtoSchema, documents: DuplicatePositionDocumentsParametersDtoSchema }).readonly(); +export type DuplicatePositionParametersDto = z.infer; + +/** + * DuplicatePositionDefaultParametersResponseDtoSchema + * @type { object } + * @property { string } estimatedServiceDate Suggested estimated service date for the duplicated position (ISO 8601) + * @property { DuplicatePositionParametersDto } parameters Default duplication parameters with section and sub-parameter flags + */ +export const DuplicatePositionDefaultParametersResponseDtoSchema = z.object({ estimatedServiceDate: z.string().describe("Suggested estimated service date for the duplicated position (ISO 8601)"), parameters: DuplicatePositionParametersDtoSchema.describe("Default duplication parameters with section and sub-parameter flags") }).readonly(); +export type DuplicatePositionDefaultParametersResponseDto = z.infer; + +/** + * PositionSectionEnumSchema + * @type { enum } + */ +export const PositionSectionEnumSchema = z.enum(["overview", "involvedParties", "cargo", "financeAccount", "routes", "routeDates", "documents"]); +export type PositionSectionEnum = z.infer; +export const PositionSectionEnum = PositionSectionEnumSchema.enum; + +/** + * DuplicatePositionRequestDtoSchema + * @type { object } + * @property { PositionSectionEnum[] } sections Legacy: sections to duplicate. Ignored when parameters is provided. + * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. + * @property { string } estimatedServiceDate + */ +export const DuplicatePositionRequestDtoSchema = z.object({ sections: z.array(PositionSectionEnumSchema).readonly().describe("Legacy: sections to duplicate. Ignored when parameters is provided.").nullish(), parameters: DuplicatePositionParametersDtoSchema.describe("Nested parameters for duplication control. Preferred over sections.").nullish(), estimatedServiceDate: z.iso.datetime({ offset: true }) }).readonly(); +export type DuplicatePositionRequestDto = z.infer; + +/** + * UpdatePositionDtoSchema + * @type { object } + * @property { string } externalSystemId + * @property { string } statusDate + * @property { CommonModels.PositionStatusEnum } status + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.IncotermsEnum } incoterms + * @property { CommonModels.IncotermsEnum } secondIncoterms + * @property { string } fillingCompany + * @property { string } sellingContract + * @property { string } fillingScacCode + * @property { string } serviceValidity + * @property { string } ratesValidity + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } buyRateReference + * @property { CommonModels.FrequencyEnum } frequency + * @property { boolean } isParentPosition + * @property { boolean } isExcludedFromStatistics + * @property { string } team + * @property { string } salesRepId + * @property { string } responsibleEmployeeId + * @property { string } receivedByEmployeeId + * @property { string } originOfficeId + * @property { string } projectLiteId + * @property { CommonModels.EditorContentUpdateDto } notes Notes + * @property { CommonModels.MovementTypeEnum } inttraTypeOfMove + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const UpdatePositionDtoSchema = z.object({ externalSystemId: z.string(), statusDate: z.iso.datetime({ offset: true }), status: CommonModels.PositionStatusEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, incoterms: CommonModels.IncotermsEnumSchema, secondIncoterms: CommonModels.IncotermsEnumSchema, fillingCompany: z.string(), sellingContract: z.string(), fillingScacCode: z.string(), serviceValidity: z.iso.datetime({ offset: true }), ratesValidity: z.iso.datetime({ offset: true }), serviceType: CommonModels.ServiceTypeEnumSchema, buyRateReference: z.string(), frequency: CommonModels.FrequencyEnumSchema, isParentPosition: z.boolean(), isExcludedFromStatistics: z.boolean(), team: z.string(), salesRepId: z.string(), responsibleEmployeeId: z.string(), receivedByEmployeeId: z.string(), originOfficeId: z.string(), projectLiteId: z.string(), notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema, volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); +export type UpdatePositionDto = z.infer; + +/** + * ChildPositionCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ChildPositionCustomerDto = z.infer; + +/** + * ChildPositionProfitDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currency + */ +export const ChildPositionProfitDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); +export type ChildPositionProfitDto = z.infer; + +/** + * ChildPositionResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { number } packages + * @property { number } weight + * @property { number } volume + * @property { ChildPositionCustomerDto } customer + * @property { ChildPositionProfitDto } profit + */ +export const ChildPositionResponseDtoSchema = z.object({ id: z.string(), number: z.string(), packages: z.number(), weight: z.number(), volume: z.number(), customer: ChildPositionCustomerDtoSchema, profit: ChildPositionProfitDtoSchema }).readonly(); +export type ChildPositionResponseDto = z.infer; + +/** + * PositionLabelsFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } isParentPosition + * @property { boolean } isLinkedPosition + */ +export const PositionLabelsFilterDtoSchema = z.object({ search: z.string(), isParentPosition: z.boolean(), isLinkedPosition: z.boolean() }).readonly(); +export type PositionLabelsFilterDto = z.infer; + +/** + * PositionListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const PositionListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalProfit: z.number(), profitPerPosition: z.number(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type PositionListResponseDto = z.infer; + +/** + * LinkChildPositionsRequestDtoSchema + * @type { object } + * @property { string[] } childPositionIds + */ +export const LinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()).readonly() }).readonly(); +export type LinkChildPositionsRequestDto = z.infer; + +/** + * UnlinkChildPositionsRequestDtoSchema + * @type { object } + * @property { string[] } childPositionIds + */ +export const UnlinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()).readonly() }).readonly(); +export type UnlinkChildPositionsRequestDto = z.infer; + +/** + * PositionsFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PositionsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PositionsFindAllResponse = z.infer; + +/** + * PositionsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PositionsPaginateOrderParamEnumSchema = z.enum(["number", "transportMode", "isCancelled", "direction", "loadType", "serviceDate", "createdAt", "departureDate", "arrivalDate", "blfromCostumerDate", "blfromCarrierDate", "customsDate", "vgmCustomerDate", "serviceType", "externalSystemId", "employee", "project", "profit", "margin", "isMasterPosition"]); +export type PositionsPaginateOrderParamEnum = z.infer; +export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSchema.enum; + +/** + * PositionsPaginateResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionPreviewResponseDto[] } items + */ +export const PositionsPaginateResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape }); +export type PositionsPaginateResponse = z.infer; + +/** + * TotalProfitResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionPreviewResponseDto[] } items + */ +export const TotalProfitResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape }); +export type TotalProfitResponse = z.infer; + +/** + * PositionsListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ +export const PositionsListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PositionsListAvailablePartnersForResponse = z.infer; + +/** + * ListRouteLabelsResponseSchema + * @type { array } + */ +export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type ListRouteLabelsResponse = z.infer; + +/** + * ListChildResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChildPositionResponseDto[] } items + */ +export const ListChildResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChildPositionResponseDtoSchema).readonly() }).readonly().shape }); +export type ListChildResponse = z.infer; + +} diff --git a/test/generated/full/positions/positions.queries.ts b/test/generated/full/positions/positions.queries.ts new file mode 100644 index 0000000..869e77f --- /dev/null +++ b/test/generated/full/positions/positions.queries.ts @@ -0,0 +1,536 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionsAcl } from "./positions.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionsApi } from "./positions.api"; + +export namespace PositionsQueries { +export const moduleName = QueryModule.Positions; + +export const keys = { + all: [moduleName] as const, + findAll: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", officeId, limit, filter, page, cursor] as const, + findAllInfinite: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", "infinite", officeId, limit, filter, cursor] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions", "infinite", officeId, limit, order, filter, cursor] as const, + totalProfit: (officeId: string) => [...keys.all, "/offices/:officeId/positions/fake-total-profit", officeId] as const, + listAvailablePartnersFor: (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/positions/:positionId/available-partners", officeId, positionId, search, useCase] as const, + get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId", officeId, positionId] as const, + listRouteLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes/labels", officeId, positionId] as const, + getDuplicateDefaultParameters: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/duplicate/default-parameters", officeId, positionId] as const, + listChild: (officeId: string, positionId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", officeId, positionId, limit, page, cursor] as const, + listChildInfinite: (officeId: string, positionId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", "infinite", officeId, positionId, limit, cursor] as const, +}; + +/** + * Query `useFindAll` + * @summary List all positions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ officeId, limit, filter, page, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(officeId, limit, filter, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUseFindAll({ officeId } )); + return PositionsApi.findAll(officeId, limit, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @summary List all positions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ officeId, limit, filter, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUseFindAll({ officeId } )); + return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary List positions + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @param { PositionsModels.PositionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUsePaginate({ officeId } )); + return PositionsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary List positions + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @param { PositionsModels.PositionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUsePaginate({ officeId } )); + return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create position + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { PositionsModels.CreatePositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position created successfully + * @statusCodes [201, 400, 401, 404] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PositionsAcl.canUseCreate({ officeId } )); + return PositionsApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useTotalProfit` + * @summary List positions + * @permission Requires `canUseTotalProfit` ability + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useTotalProfit = ({ officeId }: { officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.totalProfit(officeId), + queryFn: () => { + checkAcl(PositionsAcl.canUseTotalProfit({ officeId } )); + return PositionsApi.totalProfit(officeId, config) }, + ...options, + }); +}; + +/** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for a position + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListAvailablePartnersFor = ({ officeId, positionId, search, useCase }: { officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), + queryFn: () => { + checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId } )); + return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase, config) }, + ...options, + }); +}; + +/** + * Mutation `useExportPositions` - recommended when file should not be cached + * @summary Export positions to Excel + * @permission Requires `canUseExportPositions` ability + * @param { string } mutation.officeId Path parameter + * @param { PositionsModels.PositionExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportPositions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PositionsAcl.canUseExportPositions({ officeId } )); + return PositionsApi.exportPositions(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGet` + * @summary Get position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Position retrieved successfully + * @statusCodes [200, 401, 403, 404] + */ +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseGet({ officeId } )); + return PositionsApi.get(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.UpdatePositionDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position updated successfully + * @statusCodes [200, 400, 401, 404] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseUpdate({ officeId } )); + return PositionsApi.update(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListRouteLabels` + * @summary List all route labels for a position + * @permission Requires `canUseListRouteLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRouteLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRouteLabels(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseListRouteLabels({ officeId } )); + return PositionsApi.listRouteLabels(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Query `useGetDuplicateDefaultParameters` + * @summary Get default duplication parameters for a position + * @permission Requires `canUseGetDuplicateDefaultParameters` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Default parameters and suggested estimated service date + * @statusCodes [200, 401, 404] + */ +export const useGetDuplicateDefaultParameters = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId } )); + return PositionsApi.getDuplicateDefaultParameters(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useDuplicate` + * @summary Duplicate position + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.DuplicatePositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position duplicated successfully + * @statusCodes [201, 400, 401, 404] + */ +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseDuplicate({ officeId } )); + return PositionsApi.duplicate(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCancel` + * @summary Cancel position + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position cancelled successfully + * @statusCodes [200, 400, 401, 403, 404] + */ +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionsAcl.canUseCancel({ officeId } )); + return PositionsApi.cancel(officeId, positionId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRevertCancel` + * @summary Revert cancelled position (accounting) + * @permission Requires `canUseRevertCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position reverted successfully + * @statusCodes [200, 400, 401, 403, 404] + */ +export const useRevertCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionsAcl.canUseRevertCancel({ officeId } )); + return PositionsApi.revertCancel(officeId, positionId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useLinkChild` + * @summary Link child positions to parent + * @permission Requires `canUseLinkChild` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.LinkChildPositionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useLinkChild = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseLinkChild({ officeId } )); + return PositionsApi.linkChild(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnlinkChild` + * @summary Unlink child positions from parent + * @permission Requires `canUseUnlinkChild` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.UnlinkChildPositionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnlinkChild = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseUnlinkChild({ officeId } )); + return PositionsApi.unlinkChild(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListChild` + * @summary Get child positions for parent + * @permission Requires `canUseListChild` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListChild = ({ officeId, positionId, limit, page, cursor }: { officeId: string, positionId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listChild(officeId, positionId, limit, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUseListChild({ officeId } )); + return PositionsApi.listChild(officeId, positionId, limit, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListChildInfinite + * @summary Get child positions for parent + * @permission Requires `canUseListChild` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListChildInfinite = ({ officeId, positionId, limit, cursor }: { officeId: string, positionId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUseListChild({ officeId } )); + return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/full/projectLite/projectLite.acl.ts b/test/generated/full/projectLite/projectLite.acl.ts new file mode 100644 index 0000000..00ccf56 --- /dev/null +++ b/test/generated/full/projectLite/projectLite.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ProjectLiteAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create project in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Create", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List projects for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `usePaginateProjectLabels` query ability. For global ability, omit the object parameter. + * @description Paginate project labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateProjectLabels` query + */ +export const canUsePaginateProjectLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get project by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Update", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +} diff --git a/test/generated/full/projectLite/projectLite.api.ts b/test/generated/full/projectLite/projectLite.api.ts new file mode 100644 index 0000000..caa5b16 --- /dev/null +++ b/test/generated/full/projectLite/projectLite.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ProjectLiteModels } from "./projectLite.models"; + +export namespace ProjectLiteApi { +export const create = (officeId: string, data: ProjectLiteModels.CreateProjectLiteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite`, + ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), + config + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, + `/offices/${officeId}/project-lite`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateProjectLabels = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, + `/offices/${officeId}/project-lite/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: ProjectLiteModels.UpdateProjectLiteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite/${id}`, + ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/project-lite/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/project-lite/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/projectLite/projectLite.configs.ts b/test/generated/full/projectLite/projectLite.configs.ts new file mode 100644 index 0000000..5981c30 --- /dev/null +++ b/test/generated/full/projectLite/projectLite.configs.ts @@ -0,0 +1,116 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ProjectLiteModels } from "./projectLite.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ProjectLiteQueries } from "./projectLite.queries"; +import { ProjectLiteAcl } from "./projectLite.acl"; + +export namespace ProjectLiteConfigs { +export const projectLiteConfig = { + meta: { + title: "Project Lite", + }, + readAll: { + acl: ProjectLiteAcl.canUsePaginate, + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + paginated: ProjectLiteQueries.usePaginate, + infinite: ProjectLiteQueries.usePaginateInfinite, + filters: { + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: ProjectLiteAcl.canUseFindById, + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + query: ProjectLiteQueries.useFindById, + }, + create: { + acl: ProjectLiteAcl.canUseCreate, + schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, + mutation: ProjectLiteQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, + update: { + acl: ProjectLiteAcl.canUseUpdate, + schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, + mutation: ProjectLiteQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: ProjectLiteAcl.canUsePaginateProjectLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ProjectLiteQueries.usePaginateProjectLabels, + infinite: ProjectLiteQueries.usePaginateProjectLabelsInfinite, + filters: { + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/projectLite/projectLite.models.ts b/test/generated/full/projectLite/projectLite.models.ts new file mode 100644 index 0000000..fabb95a --- /dev/null +++ b/test/generated/full/projectLite/projectLite.models.ts @@ -0,0 +1,98 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ProjectLiteModels { +/** + * ProjectLiteEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ProjectLiteEmployeeDTO = z.infer; + +/** + * ProjectLiteResponseDTOSchema + * @type { object } + * @property { string } id Project ID + * @property { string } name Project name + * @property { string } officeId Office ID + * @property { boolean } archived Is archived + * @property { string } createdById ID of the employee who created this project + * @property { ProjectLiteEmployeeDTO } createdBy Employee who created this project + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this project + * @property { ProjectLiteEmployeeDTO } updatedBy Employee who last updated this project + * @property { string } updatedAt Updated at + */ +export const ProjectLiteResponseDTOSchema = z.object({ id: z.string().describe("Project ID"), name: z.string().describe("Project name"), officeId: z.string().describe("Office ID"), archived: z.boolean().describe("Is archived"), createdById: z.string().describe("ID of the employee who created this project").nullish(), createdBy: ProjectLiteEmployeeDTOSchema.describe("Employee who created this project").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedById: z.string().describe("ID of the employee who last updated this project").nullish(), updatedBy: ProjectLiteEmployeeDTOSchema.describe("Employee who last updated this project").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); +export type ProjectLiteResponseDTO = z.infer; + +/** + * CreateProjectLiteRequestDTOSchema + * @type { object } + * @property { string } name Project name + */ +export const CreateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); +export type CreateProjectLiteRequestDTO = z.infer; + +/** + * ProjectLiteFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ProjectLiteFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); +export type ProjectLiteFilterDto = z.infer; + +/** + * UpdateProjectLiteRequestDTOSchema + * @type { object } + * @property { string } name Project name + */ +export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); +export type UpdateProjectLiteRequestDTO = z.infer; + +/** + * ProjectLitePaginateOrderParamEnumSchema + * @type { enum } + */ +export const ProjectLitePaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ProjectLitePaginateOrderParamEnum = z.infer; +export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEnumSchema.enum; + +/** + * ProjectLitePaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ProjectLiteResponseDTO[] } items + */ +export const ProjectLitePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).readonly() }).readonly().shape }); +export type ProjectLitePaginateResponse = z.infer; + +/** + * PaginateProjectLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateProjectLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateProjectLabelsOrderParamEnum = z.infer; +export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderParamEnumSchema.enum; + +/** + * PaginateProjectLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateProjectLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PaginateProjectLabelsResponse = z.infer; + +} diff --git a/test/generated/full/projectLite/projectLite.queries.ts b/test/generated/full/projectLite/projectLite.queries.ts new file mode 100644 index 0000000..43432ae --- /dev/null +++ b/test/generated/full/projectLite/projectLite.queries.ts @@ -0,0 +1,270 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ProjectLiteAcl } from "./projectLite.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ProjectLiteModels } from "./projectLite.models"; +import { ProjectLiteApi } from "./projectLite.api"; + +export namespace ProjectLiteQueries { +export const moduleName = QueryModule.ProjectLite; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", "infinite", officeId, limit, order, filter, cursor] as const, + paginateProjectLabels: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", officeId, limit, order, filter, page, cursor] as const, + paginateProjectLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/project-lite/:id", id, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create project + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ProjectLiteModels.CreateProjectLiteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ProjectLiteAcl.canUseCreate({ officeId } )); + return ProjectLiteApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Get paginated projects + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); + return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated projects + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); + return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateProjectLabels` + * @summary Paginate project labels + * @permission Requires `canUsePaginateProjectLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateProjectLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateProjectLabelsInfinite + * @summary Paginate project labels + * @permission Requires `canUsePaginateProjectLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateProjectLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get project by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUseFindById({ officeId } )); + return ProjectLiteApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update project + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ProjectLiteModels.UpdateProjectLiteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ProjectLiteAcl.canUseUpdate({ officeId } )); + return ProjectLiteApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive project + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ProjectLiteAcl.canUseArchive({ officeId } )); + return ProjectLiteApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive project + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId } )); + return ProjectLiteApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/queryModules.ts b/test/generated/full/queryModules.ts new file mode 100644 index 0000000..2daa74a --- /dev/null +++ b/test/generated/full/queryModules.ts @@ -0,0 +1,96 @@ +export const enum QueryModule { + WorkingDocuments = "WorkingDocumentsQueries", + Offices = "OfficesQueries", + BankAccounts = "BankAccountsQueries", + Currencies = "CurrenciesQueries", + Countries = "CountriesQueries", + Folders = "FoldersQueries", + Files = "FilesQueries", + WorkingDocumentsTemplatedDocument = "WorkingDocumentsTemplatedDocumentQueries", + BusinessPartners = "BusinessPartnersQueries", + BusinessPartnerBookkeepingMappings = "BusinessPartnerBookkeepingMappingsQueries", + BusinessPartnerContacts = "BusinessPartnerContactsQueries", + Cities = "CitiesQueries", + Depots = "DepotsQueries", + PartnerNetworks = "PartnerNetworksQueries", + Warehouses = "WarehousesQueries", + UserActivity = "UserActivityQueries", + DocumentTemplates = "DocumentTemplatesQueries", + HsCodes = "HsCodesQueries", + CargoTypes = "CargoTypesQueries", + SeaPositions = "SeaPositionsQueries", + Terminals = "TerminalsQueries", + Airports = "AirportsQueries", + Ports = "PortsQueries", + ContainerYards = "ContainerYardsQueries", + PositionInvolvedParties = "PositionInvolvedPartiesQueries", + PositionRoutes = "PositionRoutesQueries", + AirPositions = "AirPositionsQueries", + PositionAccount = "PositionAccountQueries", + PositionAccountItems = "PositionAccountItemsQueries", + PositionProfitChangeTracking = "PositionProfitChangeTrackingQueries", + WorkingDocumentsExportDeclaration = "WorkingDocumentsExportDeclarationQueries", + PositionCargo = "PositionCargoQueries", + PositionCargoPackage = "PositionCargoPackageQueries", + PackageTypes = "PackageTypesQueries", + WorkingDocumentsHouseBl = "WorkingDocumentsHouseBlQueries", + WorkingDocumentsBlInstructions = "WorkingDocumentsBlInstructionsQueries", + WorkingDocumentsAmsInstructions = "WorkingDocumentsAmsInstructionsQueries", + WorkingDocumentsHouseAwb = "WorkingDocumentsHouseAwbQueries", + ChargeTypes = "ChargeTypesQueries", + WorkingDocumentsMasterAwb = "WorkingDocumentsMasterAwbQueries", + WorkingDocumentsCmrForm = "WorkingDocumentsCmrFormQueries", + WorkingDocumentsIsfForm = "WorkingDocumentsIsfFormQueries", + WorkingDocumentsFcrForm = "WorkingDocumentsFcrFormQueries", + ShippingInstructions = "ShippingInstructionsQueries", + EmployeeAccount = "EmployeeAccountQueries", + EmployeeSettings = "EmployeeSettingsQueries", + EmployeeRoles = "EmployeeRolesQueries", + EmployeePermissions = "EmployeePermissionsQueries", + EmployeeProfile = "EmployeeProfileQueries", + Employee = "EmployeeQueries", + Employment = "EmploymentQueries", + CustomerAccount = "CustomerAccountQueries", + Customers = "CustomersQueries", + Quotes = "QuotesQueries", + QuoteAccount = "QuoteAccountQueries", + QuoteProfitChangeTracking = "QuoteProfitChangeTrackingQueries", + SeaQuotes = "SeaQuotesQueries", + RoadQuotes = "RoadQuotesQueries", + QuoteDocument = "QuoteDocumentQueries", + QuoteCargo = "QuoteCargoQueries", + QuoteCargoPackage = "QuoteCargoPackageQueries", + QuoteRoutes = "QuoteRoutesQueries", + DunningManagement = "DunningManagementQueries", + DunningPartnerOutstandingInvoices = "DunningPartnerOutstandingInvoicesQueries", + DunningLevels = "DunningLevelsQueries", + DunningSystems = "DunningSystemsQueries", + DunningAccountStatement = "DunningAccountStatementQueries", + Positions = "PositionsQueries", + QuoteConversion = "QuoteConversionQueries", + Invoices = "InvoicesQueries", + VatRules = "VatRulesQueries", + InvoicePayments = "InvoicePaymentsQueries", + PaymentConfirmations = "PaymentConfirmationsQueries", + ProjectLite = "ProjectLiteQueries", + PositionChecklist = "PositionChecklistQueries", + ChecklistTemplates = "ChecklistTemplatesQueries", + BookkeepingExport = "BookkeepingExportQueries", + FactoringExport = "FactoringExportQueries", + FactoringMerge = "FactoringMergeQueries", + AWBStocks = "AWBStocksQueries", + MasterData = "MasterDataQueries", + ChecklistItems = "ChecklistItemsQueries", + MasterDataImport = "MasterDataImportQueries", + RemarkTemplates = "RemarkTemplatesQueries", + IntegrationChannels = "IntegrationChannelsQueries", + ControlTowerBookings = "ControlTowerBookingsQueries", + ControlTowerPackages = "ControlTowerPackagesQueries", + ControlTowerContainers = "ControlTowerContainersQueries", + ControlTowerAuth = "ControlTowerAuthQueries", + ControlTowerMe = "ControlTowerMeQueries", + ControlTowerSearch = "ControlTowerSearchQueries", + ControlTowerCalendar = "ControlTowerCalendarQueries", + InttraShippingInstructionMessages = "InttraShippingInstructionMessagesQueries", + InttraOfficeIntegration = "InttraOfficeIntegrationQueries", +} \ No newline at end of file diff --git a/test/generated/full/quoteAccount/quoteAccount.acl.ts b/test/generated/full/quoteAccount/quoteAccount.acl.ts new file mode 100644 index 0000000..5a12701 --- /dev/null +++ b/test/generated/full/quoteAccount/quoteAccount.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteAccountAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description List quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCreateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateItem` mutation + */ +export const canUseCreateItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDeleteItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteItem` mutation + */ +export const canUseDeleteItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateItem` mutation + */ +export const canUseUpdateItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDuplicateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateItem` mutation + */ +export const canUseDuplicateItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/full/quoteAccount/quoteAccount.api.ts b/test/generated/full/quoteAccount/quoteAccount.api.ts new file mode 100644 index 0000000..0ef7323 --- /dev/null +++ b/test/generated/full/quoteAccount/quoteAccount.api.ts @@ -0,0 +1,47 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteAccountModels } from "./quoteAccount.models"; + +export namespace QuoteAccountApi { +export const get = (quoteId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/account`, + config + ) +}; +export const createItem = (quoteId: string, officeId: string, data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items`, + ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), + config + ) +}; +export const deleteItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, + undefined, + config + ) +}; +export const updateItem = (quoteId: string, itemId: string, officeId: string, data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, + ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), + config + ) +}; +export const duplicateItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/quoteAccount/quoteAccount.models.ts b/test/generated/full/quoteAccount/quoteAccount.models.ts new file mode 100644 index 0000000..71ef66e --- /dev/null +++ b/test/generated/full/quoteAccount/quoteAccount.models.ts @@ -0,0 +1,170 @@ +import { z } from "zod"; + +export namespace QuoteAccountModels { +/** + * QuoteAccountItemTypeEnumSchema + * @type { enum } + */ +export const QuoteAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); +export type QuoteAccountItemTypeEnum = z.infer; +export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; + +/** + * QuoteChargeDtoResponseSchema + * @type { object } + * @property { object } chargeType + * @property { string } chargeType.id + * @property { string } chargeType.name + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { object } buyVatRule + * @property { string } buyVatRule.id + * @property { string } buyVatRule.name + * @property { string } buyVatRule.matchcode + * @property { string } buyVatRule.printCode + * @property { object } vendor + * @property { string } vendor.id + * @property { string } vendor.name + * @property { string } vendor.matchCode + * @property { string } vendor.label + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { object } sellVatRule + * @property { string } sellVatRule.id + * @property { string } sellVatRule.name + * @property { string } sellVatRule.matchcode + * @property { string } sellVatRule.printCode + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + * @property { number } profit Profit amount + */ +export const QuoteChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).readonly(), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge").nullish(), buyRate: z.number().describe("Buy rate amount").nullish(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }).readonly(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), sellRate: z.number().describe("Sell rate amount").nullish(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }).readonly(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), profit: z.number().describe("Profit amount").nullish() }).readonly(); +export type QuoteChargeDtoResponse = z.infer; + +/** + * QuoteTextDtoResponseSchema + * @type { object } + * @property { string } content Text content + */ +export const QuoteTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type QuoteTextDtoResponse = z.infer; + +/** + * QuoteAccountItemDtoResponseSchema + * @type { object } + * @property { string } id Item ID + * @property { QuoteAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE + * @property { QuoteTextDtoResponse } text Text data if type is TEXT + */ +export const QuoteAccountItemDtoResponseSchema = z.object({ id: z.string().describe("Item ID"), type: QuoteAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item"), charge: QuoteChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), text: QuoteTextDtoResponseSchema.describe("Text data if type is TEXT").nullish() }).readonly(); +export type QuoteAccountItemDtoResponse = z.infer; + +/** + * QuoteAccountResponseDtoSchema + * @type { object } + * @property { string } id Account ID + * @property { string } quoteId Quote ID + * @property { QuoteAccountItemDtoResponse[] } items Account items + * @property { object } totals Account totals + * @property { number } totals.totalBuyRates + * @property { number } totals.totalSellRates + * @property { number } totals.totalProfit + * @property { number } totals.displayAmount + * @property { string } totals.displayCurrencyCode + * @property { object[] } totalsPerCurrency Account totals per currency + * @property { number } totalsPerCurrency.[0].totalBuyRates + * @property { number } totalsPerCurrency.[0].totalSellRates + * @property { number } totalsPerCurrency.[0].totalProfit + * @property { number } totalsPerCurrency.[0].displayAmount + * @property { string } totalsPerCurrency.[0].displayCurrencyCode + */ +export const QuoteAccountResponseDtoSchema = z.object({ id: z.string().describe("Account ID"), quoteId: z.string().describe("Quote ID"), items: z.array(QuoteAccountItemDtoResponseSchema).readonly().describe("Account items"), totals: z.object({ totalBuyRates: z.number(), totalSellRates: z.number(), totalProfit: z.number(), displayAmount: z.number(), displayCurrencyCode: z.string() }).readonly().describe("Account totals"), totalsPerCurrency: z.array(z.object({ totalBuyRates: z.number(), totalSellRates: z.number(), totalProfit: z.number(), displayAmount: z.number(), displayCurrencyCode: z.string() }).readonly()).readonly().describe("Account totals per currency") }).readonly(); +export type QuoteAccountResponseDto = z.infer; + +/** + * CreateQuoteChargeDataDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1`. Default: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code. Default: `EUR` + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code. Default: `EUR` + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const CreateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge").default(1), buyRate: z.number().describe("Buy rate amount"), buyCurrencyCode: z.string().describe("Buy rate currency code").default("EUR"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount"), sellCurrencyCode: z.string().describe("Sell rate currency code").default("EUR"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export type CreateQuoteChargeDataDto = z.infer; + +/** + * CreateQuoteTextDataDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const CreateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type CreateQuoteTextDataDto = z.infer; + +/** + * CreateQuoteAccountItemRequestDtoSchema + * @type { object } + * @property { QuoteAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { CreateQuoteChargeDataDto } charge Charge data if type is CHARGE + * @property { CreateQuoteTextDataDto } text Text data if type is TEXT + */ +export const CreateQuoteAccountItemRequestDtoSchema = z.object({ type: QuoteAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item").nullish(), charge: CreateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE").nullish(), text: CreateQuoteTextDataDtoSchema.describe("Text data if type is TEXT").nullish() }).readonly(); +export type CreateQuoteAccountItemRequestDto = z.infer; + +/** + * UpdateQuoteChargeDataDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const UpdateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount").nullable(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID").nullable(), vendorId: z.string().describe("Vendor ID").nullable(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount").nullable(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID").nullable(), customerId: z.string().describe("Customer ID").nullable(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export type UpdateQuoteChargeDataDto = z.infer; + +/** + * UpdateQuoteTextDataDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const UpdateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type UpdateQuoteTextDataDto = z.infer; + +/** + * UpdateQuoteAccountItemRequestDtoSchema + * @type { object } + * @property { number } orderPosition Order position of the item + * @property { UpdateQuoteChargeDataDto } charge Charge data if type is CHARGE + * @property { UpdateQuoteTextDataDto } text Text data if type is TEXT + */ +export const UpdateQuoteAccountItemRequestDtoSchema = z.object({ orderPosition: z.number().describe("Order position of the item"), charge: UpdateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE"), text: UpdateQuoteTextDataDtoSchema.describe("Text data if type is TEXT") }).readonly(); +export type UpdateQuoteAccountItemRequestDto = z.infer; + +} diff --git a/test/generated/full/quoteAccount/quoteAccount.queries.ts b/test/generated/full/quoteAccount/quoteAccount.queries.ts new file mode 100644 index 0000000..69c6456 --- /dev/null +++ b/test/generated/full/quoteAccount/quoteAccount.queries.ts @@ -0,0 +1,154 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteAccountAcl } from "./quoteAccount.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteAccountModels } from "./quoteAccount.models"; +import { QuoteAccountApi } from "./quoteAccount.api"; + +export namespace QuoteAccountQueries { +export const moduleName = QueryModule.QuoteAccount; + +export const keys = { + all: [moduleName] as const, + get: (quoteId: string, officeId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account", quoteId, officeId] as const, +}; + +/** + * Query `useGet` + * @summary Get quote account details + * @permission Requires `canUseGet` ability + * @param { string } object.quoteId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ quoteId, officeId }: { quoteId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(quoteId, officeId), + queryFn: () => { + checkAcl(QuoteAccountAcl.canUseGet({ officeId } )); + return QuoteAccountApi.get(quoteId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateItem` + * @summary Create quote account item + * @permission Requires `canUseCreateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { QuoteAccountModels.CreateQuoteAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, officeId, data }) => { + checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId } )); + return QuoteAccountApi.createItem(quoteId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteItem` + * @summary Delete quote account item + * @permission Requires `canUseDeleteItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId }) => { + checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId } )); + return QuoteAccountApi.deleteItem(quoteId, itemId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateItem` + * @summary Update quote account item + * @permission Requires `canUseUpdateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { QuoteAccountModels.UpdateQuoteAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId, data }) => { + checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId } )); + return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicateItem` + * @summary Duplicate quote account item + * @permission Requires `canUseDuplicateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId }) => { + checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId } )); + return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/quoteCargo/quoteCargo.acl.ts b/test/generated/full/quoteCargo/quoteCargo.acl.ts new file mode 100644 index 0000000..38031c0 --- /dev/null +++ b/test/generated/full/quoteCargo/quoteCargo.acl.ts @@ -0,0 +1,108 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteCargoAcl { +/** + * Use for `useListCargosByQuoteId` query ability. For global ability, omit the object parameter. + * @description List cargo items by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByQuoteId` query + */ +export const canUseListCargosByQuoteId = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. + * @description List cargo labels by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query + */ +export const canUseListCargoLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. + * @description Get cargo summary by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query + */ +export const canUseGetCargoSummary = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. + * @description Get cargo item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query + */ +export const canUseGetCargoById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. + * @description Update cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation + */ +export const canUseUpdateCargo = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation + */ +export const canUseDeleteCargo = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation + */ +export const canUseCreateBulkCargos = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation + */ +export const canUseDuplicateCargo = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +} diff --git a/test/generated/full/quoteCargo/quoteCargo.api.ts b/test/generated/full/quoteCargo/quoteCargo.api.ts new file mode 100644 index 0000000..dc2e9a4 --- /dev/null +++ b/test/generated/full/quoteCargo/quoteCargo.api.ts @@ -0,0 +1,77 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteCargoModels } from "./quoteCargo.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoApi { +export const listCargosByQuoteId = (officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos`, + { + ...config, + params: { + order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listCargoLabels = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, + config + ) +}; +export const getCargoSummary = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, + config + ) +}; +export const getCargoById = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + config + ) +}; +export const updateCargo = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), + config + ) +}; +export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + undefined, + config + ) +}; +export const createBulkCargos = (numberOfCargos: number, officeId: string, quoteId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config + ) +}; +export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/quoteCargo/quoteCargo.configs.ts b/test/generated/full/quoteCargo/quoteCargo.configs.ts new file mode 100644 index 0000000..bbd862c --- /dev/null +++ b/test/generated/full/quoteCargo/quoteCargo.configs.ts @@ -0,0 +1,100 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoQueries } from "./quoteCargo.queries"; +import { QuoteCargoAcl } from "./quoteCargo.acl"; + +export namespace QuoteCargoConfigs { +export const cargosConfig = { + meta: { + title: "Cargos", + }, + readAll: { + acl: QuoteCargoAcl.canUseListCargosByQuoteId, + schema: CommonModels.PositionCargoResponseDTOSchema, + paginated: QuoteCargoQueries.useListCargosByQuoteId, + infinite: QuoteCargoQueries.useListCargosByQuoteIdInfinite, + columns: dynamicColumns({ + schema: CommonModels.PositionCargoResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + quoteId: true, + rootFolderId: true, + cargoType: true, + autoCalculateTotals: true, + autoCalculateRates: true, + autoCalculateVgm: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + rateOptions: true, + rateClass: true, + textForCustoms: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + ratePerKg: true, + totalRate: true, + tare: true, + vgm: true, + hsCodeLabels: true, + note: true, + packages: true, + createdAt: true, + updatedAt: true, + completeWeight: true, + packageTotals: true, + }, + }, +}), + }, + read: { + acl: QuoteCargoAcl.canUseGetCargoById, + schema: CommonModels.PositionCargoResponseDTOSchema, + query: QuoteCargoQueries.useGetCargoById, + }, + update: { + acl: QuoteCargoAcl.canUseUpdateCargo, + schema: CommonModels.UpdatePositionCargoDTOSchema, + mutation: QuoteCargoQueries.useUpdateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.UpdatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, +}) + }, + delete: { + acl: QuoteCargoAcl.canUseDeleteCargo, + mutation: QuoteCargoQueries.useDeleteCargo, + }, +}; + +} diff --git a/test/generated/full/quoteCargo/quoteCargo.models.ts b/test/generated/full/quoteCargo/quoteCargo.models.ts new file mode 100644 index 0000000..6520815 --- /dev/null +++ b/test/generated/full/quoteCargo/quoteCargo.models.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoModels { +/** + * ListCargosByQuoteIdOrderParamSchema + * @type { array } + * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + */ +export const ListCargosByQuoteIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).readonly().describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt").nullish(); +export type ListCargosByQuoteIdOrderParam = z.infer; + +/** + * ListCargosByQuoteIdResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.PositionCargoResponseDTO[] } items + */ +export const ListCargosByQuoteIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape }); +export type ListCargosByQuoteIdResponse = z.infer; + +/** + * QuoteCargoListCargoLabelsResponseSchema + * @type { array } + */ +export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type QuoteCargoListCargoLabelsResponse = z.infer; + +/** + * QuoteCargoGetCargoSummaryResponseSchema + * @type { array } + */ +export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); +export type QuoteCargoGetCargoSummaryResponse = z.infer; + +/** + * QuoteCargoCreateBulkCargosResponseSchema + * @type { array } + */ +export const QuoteCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema).readonly(); +export type QuoteCargoCreateBulkCargosResponse = z.infer; + +} diff --git a/test/generated/full/quoteCargo/quoteCargo.queries.ts b/test/generated/full/quoteCargo/quoteCargo.queries.ts new file mode 100644 index 0000000..792ae63 --- /dev/null +++ b/test/generated/full/quoteCargo/quoteCargo.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteCargoAcl } from "./quoteCargo.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteCargoModels } from "./quoteCargo.models"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoApi } from "./quoteCargo.api"; + +export namespace QuoteCargoQueries { +export const moduleName = QueryModule.QuoteCargo; + +export const keys = { + all: [moduleName] as const, + listCargosByQuoteId: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", officeId, quoteId, limit, order, page, cursor] as const, + listCargosByQuoteIdInfinite: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", "infinite", officeId, quoteId, limit, order, cursor] as const, + listCargoLabels: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/labels", officeId, quoteId] as const, + getCargoSummary: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/summary", officeId, quoteId] as const, + getCargoById: (officeId: string, quoteId: string, cargoId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/:cargoId", officeId, quoteId, cargoId] as const, +}; + +/** + * Query `useListCargosByQuoteId` + * @summary List all cargo items for a quote + * @permission Requires `canUseListCargosByQuoteId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByQuoteId = ({ officeId, quoteId, limit, order, page, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListCargosByQuoteIdInfinite + * @summary List all cargo items for a quote + * @permission Requires `canUseListCargosByQuoteId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByQuoteIdInfinite = ({ officeId, quoteId, limit, order, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useListCargoLabels` + * @summary List all cargo labels for a quote + * @permission Requires `canUseListCargoLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargoLabels = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargoLabels(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId } )); + return QuoteCargoApi.listCargoLabels(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Query `useGetCargoSummary` + * @summary Get cargo summary grouped by transport unit type + * @permission Requires `canUseGetCargoSummary` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoSummary = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoSummary(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId } )); + return QuoteCargoApi.getCargoSummary(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Query `useGetCargoById` + * @summary Get a specific cargo item + * @permission Requires `canUseGetCargoById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { string } object.cargoId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoById = ({ officeId, quoteId, cargoId }: { officeId: string, quoteId: string, cargoId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoById(officeId, quoteId, cargoId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId } )); + return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCargo` + * @summary Update a cargo item + * @permission Requires `canUseUpdateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, data }) => { + checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId } )); + return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteCargo` + * @summary Delete a cargo item + * @permission Requires `canUseDeleteCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId }) => { + checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId } )); + return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateBulkCargos` + * @summary Create a new cargo item + * @permission Requires `canUseCreateBulkCargos` ability + * @param { number } mutation.numberOfCargos Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { + checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId } )); + return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicateCargo` + * @summary Duplicate a cargo item + * @permission Requires `canUseDuplicateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId }) => { + checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId } )); + return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/quoteCargoPackage/quoteCargoPackage.acl.ts b/test/generated/full/quoteCargoPackage/quoteCargoPackage.acl.ts new file mode 100644 index 0000000..da1d43f --- /dev/null +++ b/test/generated/full/quoteCargoPackage/quoteCargoPackage.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteCargoPackageAcl { +/** + * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. + * @description Create cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation + */ +export const canUseCreatePackage = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. + * @description Update cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation + */ +export const canUseUpdatePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation + */ +export const canUseDeletePackage = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation + */ +export const canUseDuplicatePackage = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. + * @description Move cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation + */ +export const canUseMovePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +} diff --git a/test/generated/full/quoteCargoPackage/quoteCargoPackage.api.ts b/test/generated/full/quoteCargoPackage/quoteCargoPackage.api.ts new file mode 100644 index 0000000..17b3e8f --- /dev/null +++ b/test/generated/full/quoteCargoPackage/quoteCargoPackage.api.ts @@ -0,0 +1,48 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoPackageApi { +export const createPackage = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, + ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), + config + ) +}; +export const updatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), + config + ) +}; +export const deletePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, + undefined, + config + ) +}; +export const duplicatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, + undefined, + config + ) +}; +export const movePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, + ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/quoteCargoPackage/quoteCargoPackage.queries.ts b/test/generated/full/quoteCargoPackage/quoteCargoPackage.queries.ts new file mode 100644 index 0000000..722792e --- /dev/null +++ b/test/generated/full/quoteCargoPackage/quoteCargoPackage.queries.ts @@ -0,0 +1,163 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteCargoPackageAcl } from "./quoteCargoPackage.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoPackageApi } from "./quoteCargoPackage.api"; + +export namespace QuoteCargoPackageQueries { +export const moduleName = QueryModule.QuoteCargoPackage; + + + +/** + * Mutation `useCreatePackage` + * @summary Create a new package for a cargo + * @permission Requires `canUseCreatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId } )); + return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdatePackage` + * @summary Update a package + * @permission Requires `canUseUpdatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId } )); + return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeletePackage` + * @summary Delete a package + * @permission Requires `canUseDeletePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { + checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId } )); + return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicatePackage` + * @summary Duplicate a package + * @permission Requires `canUseDuplicatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { + checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId } )); + return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMovePackage` + * @summary Move a package to a different cargo + * @permission Requires `canUseMovePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId } )); + return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/quoteConversion/quoteConversion.acl.ts b/test/generated/full/quoteConversion/quoteConversion.acl.ts new file mode 100644 index 0000000..8c0f3c4 --- /dev/null +++ b/test/generated/full/quoteConversion/quoteConversion.acl.ts @@ -0,0 +1,17 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteConversionAcl { +/** + * Use for `useConvertQuoteToPosition` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useConvertQuoteToPosition` mutation + */ +export const canUseConvertQuoteToPosition = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/full/quoteConversion/quoteConversion.api.ts b/test/generated/full/quoteConversion/quoteConversion.api.ts new file mode 100644 index 0000000..30eb85a --- /dev/null +++ b/test/generated/full/quoteConversion/quoteConversion.api.ts @@ -0,0 +1,16 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteConversionModels } from "./quoteConversion.models"; + +export namespace QuoteConversionApi { +export const convertQuoteToPosition = (officeId: string, quoteId: string, data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/convert`, + ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/quoteConversion/quoteConversion.models.ts b/test/generated/full/quoteConversion/quoteConversion.models.ts new file mode 100644 index 0000000..08987fb --- /dev/null +++ b/test/generated/full/quoteConversion/quoteConversion.models.ts @@ -0,0 +1,12 @@ +import { z } from "zod"; + +export namespace QuoteConversionModels { +/** + * ConvertQuoteToPositionRequestDtoSchema + * @type { object } + * @property { string } estimatedServiceDate + */ +export const ConvertQuoteToPositionRequestDtoSchema = z.object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }).readonly(); +export type ConvertQuoteToPositionRequestDto = z.infer; + +} diff --git a/test/generated/full/quoteConversion/quoteConversion.queries.ts b/test/generated/full/quoteConversion/quoteConversion.queries.ts new file mode 100644 index 0000000..9fbcf1d --- /dev/null +++ b/test/generated/full/quoteConversion/quoteConversion.queries.ts @@ -0,0 +1,44 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteConversionAcl } from "./quoteConversion.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteConversionModels } from "./quoteConversion.models"; +import { QuoteConversionApi } from "./quoteConversion.api"; + +export namespace QuoteConversionQueries { +export const moduleName = QueryModule.QuoteConversion; + + + +/** + * Mutation `useConvertQuoteToPosition` + * @summary Convert quote to position + * @permission Requires `canUseConvertQuoteToPosition` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteConversionModels.ConvertQuoteToPositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Quote converted to position successfully + * @statusCodes [201, 400, 401, 404] + */ +export const useConvertQuoteToPosition = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId } )); + return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/quoteDocument/quoteDocument.acl.ts b/test/generated/full/quoteDocument/quoteDocument.acl.ts new file mode 100644 index 0000000..43dec1f --- /dev/null +++ b/test/generated/full/quoteDocument/quoteDocument.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteDocumentAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGetPreview` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` mutation + */ +export const canUseGetPreview = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGenerateEml` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateEml` mutation + */ +export const canUseGenerateEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/full/quoteDocument/quoteDocument.api.ts b/test/generated/full/quoteDocument/quoteDocument.api.ts new file mode 100644 index 0000000..b5f9bfb --- /dev/null +++ b/test/generated/full/quoteDocument/quoteDocument.api.ts @@ -0,0 +1,61 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteDocumentModels } from "./quoteDocument.models"; + +export namespace QuoteDocumentApi { +export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/document`, + config + ) +}; +export const update = (officeId: string, quoteId: string, data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/document`, + ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), + config + ) +}; +export const getPreview = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/${quoteId}/document/preview`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generate = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/document/generate`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), + config + ) +}; +export const generateEml = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/${quoteId}/document/eml`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/full/quoteDocument/quoteDocument.models.ts b/test/generated/full/quoteDocument/quoteDocument.models.ts new file mode 100644 index 0000000..8362f3f --- /dev/null +++ b/test/generated/full/quoteDocument/quoteDocument.models.ts @@ -0,0 +1,134 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteDocumentModels { +/** + * QuoteDocumentDataDtoSchema + * @type { object } + * @property { CommonModels.RouteTableBlockResponseDto } routeTable + * @property { CommonModels.CargoTableBlockDto } cargoTable + * @property { CommonModels.FinanceTableBlockDto } financeTable + */ +export const QuoteDocumentDataDtoSchema = z.object({ routeTable: CommonModels.RouteTableBlockResponseDtoSchema, cargoTable: CommonModels.CargoTableBlockDtoSchema, financeTable: CommonModels.FinanceTableBlockDtoSchema }).readonly(); +export type QuoteDocumentDataDto = z.infer; + +/** + * QuoteDocumentConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl + * @property { string } headerImageUrl + * @property { string } termsAndConditionsImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ +export const QuoteDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), termsAndConditionsImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); +export type QuoteDocumentConfigDto = z.infer; + +/** + * CustomerDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + */ +export const CustomerDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); +export type CustomerDto = z.infer; + +/** + * ContactDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } phone + * @property { string } date + * @property { string } validFrom + * @property { string } validUntil + */ +export const ContactDtoSchema = z.object({ name: z.string(), email: z.string(), phone: z.string(), date: z.iso.datetime({ offset: true }), validFrom: z.iso.datetime({ offset: true }).nullish(), validUntil: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type ContactDto = z.infer; + +/** + * QuoteDocumentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } quoteId + * @property { string } quoteNumber + * @property { CommonModels.TransportModeEnum } quoteTransportMode Mode of transport + * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote + * @property { string } transitDurationInDays Transit duration in days + * @property { CustomerDto } customer + * @property { ContactDto } contact + * @property { QuoteDocumentDataDto } data + * @property { boolean } suspendCargoTable + * @property { boolean } suspendFinanceTable + * @property { CommonModels.EditorContentResponseDto } bodyRemarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks + * @property { boolean } isIssued + * @property { number } version + * @property { QuoteDocumentConfigDto } config + * @property { string } issuedAt + */ +export const QuoteDocumentResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), quoteNumber: z.string(), quoteTransportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), transitDurationInDays: z.string().describe("Transit duration in days").nullish(), customer: CustomerDtoSchema, contact: ContactDtoSchema, data: QuoteDocumentDataDtoSchema.nullish(), suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), isIssued: z.boolean(), version: z.number(), config: QuoteDocumentConfigDtoSchema.nullish(), issuedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type QuoteDocumentResponseDto = z.infer; + +/** + * QuoteDocumentDataUpdateDtoSchema + * @type { object } + * @property { CommonModels.RouteTableUpdateBlockDto } routeTable + * @property { CommonModels.CargoTableBlockUpdateDto } cargoTable + * @property { CommonModels.FinanceTableBlockUpdateDto } financeTable + */ +export const QuoteDocumentDataUpdateDtoSchema = z.object({ routeTable: CommonModels.RouteTableUpdateBlockDtoSchema, cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema, financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema }).readonly(); +export type QuoteDocumentDataUpdateDto = z.infer; + +/** + * CustomerUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + */ +export const CustomerUpdateDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); +export type CustomerUpdateDto = z.infer; + +/** + * ContactUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } phone + * @property { string } date + */ +export const ContactUpdateDtoSchema = z.object({ name: z.string(), email: z.email(), phone: z.string(), date: z.iso.datetime({ offset: true }) }).readonly(); +export type ContactUpdateDto = z.infer; + +/** + * UpdateQuoteDocumentRequestDtoSchema + * @type { object } + * @property { CustomerUpdateDto } customer + * @property { ContactUpdateDto } contact + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks + * @property { boolean } suspendCargoTable + * @property { boolean } suspendFinanceTable + * @property { QuoteDocumentDataUpdateDto } data + */ +export const UpdateQuoteDocumentRequestDtoSchema = z.object({ customer: CustomerUpdateDtoSchema, contact: ContactUpdateDtoSchema, bodyRemarks: CommonModels.EditorContentUpdateDtoSchema, footerRemarks: CommonModels.EditorContentUpdateDtoSchema, suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), data: QuoteDocumentDataUpdateDtoSchema }).readonly(); +export type UpdateQuoteDocumentRequestDto = z.infer; + +/** + * GenerateQuoteDocumentPreviewRequestDtoSchema + * @type { object } + * @property { string } issuedAt + */ +export const GenerateQuoteDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type GenerateQuoteDocumentPreviewRequestDto = z.infer; + +/** + * GenerateQuoteDocumentRequestDtoSchema + * @type { object } + * @property { string } issuedAt + * @property { string } fileName + */ +export const GenerateQuoteDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); +export type GenerateQuoteDocumentRequestDto = z.infer; + +} diff --git a/test/generated/full/quoteDocument/quoteDocument.queries.ts b/test/generated/full/quoteDocument/quoteDocument.queries.ts new file mode 100644 index 0000000..fd43c96 --- /dev/null +++ b/test/generated/full/quoteDocument/quoteDocument.queries.ts @@ -0,0 +1,153 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteDocumentAcl } from "./quoteDocument.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteDocumentModels } from "./quoteDocument.models"; +import { QuoteDocumentApi } from "./quoteDocument.api"; + +export namespace QuoteDocumentQueries { +export const moduleName = QueryModule.QuoteDocument; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/document", officeId, quoteId] as const, +}; + +/** + * Query `useGet` + * @summary Get quote document + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteDocumentAcl.canUseGet({ officeId } )); + return QuoteDocumentApi.get(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update quote document + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.UpdateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId } )); + return QuoteDocumentApi.update(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGetPreview` - recommended when file should not be cached + * @summary Get quote document pdf preview + * @permission Requires `canUseGetPreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGetPreview = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId } )); + return QuoteDocumentApi.getPreview(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerate` + * @summary Get quote document pdf preview + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId } )); + return QuoteDocumentApi.generate(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateEml` - recommended when file should not be cached + * @summary Generate quote document and return EML file + * @permission Requires `canUseGenerateEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId } )); + return QuoteDocumentApi.generateEml(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts new file mode 100644 index 0000000..24ebb81 --- /dev/null +++ b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts @@ -0,0 +1,32 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteProfitChangeTrackingAcl { +/** + * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. + * @description List quote profit change groups + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.quoteId quoteId from quoteId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query + */ +export const canUseFindProfitChangeGroups = ( + object?: { officeId: string, quoteId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; + +/** + * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. + * @description Get quote profit change group details + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.quoteId quoteId from quoteId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query + */ +export const canUseFindProfitChangeGroupDetail = ( + object?: { officeId: string, quoteId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; + +} diff --git a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts new file mode 100644 index 0000000..aa8e7c0 --- /dev/null +++ b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts @@ -0,0 +1,29 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; + +export namespace QuoteProfitChangeTrackingApi { +export const findProfitChangeGroups = (officeId: string, quoteId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findProfitChangeGroupDetail = (groupId: string, officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, + config + ) +}; +} diff --git a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts new file mode 100644 index 0000000..169ba81 --- /dev/null +++ b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts @@ -0,0 +1,36 @@ +import { dynamicColumns } from "@povio/ui"; +import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; +import { QuoteProfitChangeTrackingQueries } from "./quoteProfitChangeTracking.queries"; +import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; + +export namespace QuoteProfitChangeTrackingConfigs { +export const profitChangeGroupsConfig = { + meta: { + title: "Profit Change Groups", + }, + readAll: { + acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups, + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, + paginated: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroups, + infinite: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, + columns: dynamicColumns({ + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, + options: { + columns: { + id: true, + timestamp: true, + users: true, + profit: true, + changeCount: true, + }, + }, +}), + }, + read: { + acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema, + query: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, + }, +}; + +} diff --git a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts new file mode 100644 index 0000000..a87cf72 --- /dev/null +++ b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts @@ -0,0 +1,56 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteProfitChangeTrackingModels { +/** + * QuoteAccountProfitChangeGroupDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto[] } users + * @property { object } profit + * @property { number } profit.amount + * @property { string } profit.currencyCode + * @property { number } changeCount + */ +export const QuoteAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), changeCount: z.number() }).readonly(); +export type QuoteAccountProfitChangeGroupDto = z.infer; + +/** + * QuoteAccountProfitChangeEntryDtoSchema + * @type { object } + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto } user + * @property { number } changeNumber + * @property { number } oldProfit + * @property { number } newProfit + * @property { string } currencyCode + */ +export const QuoteAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }).readonly(); +export type QuoteAccountProfitChangeEntryDto = z.infer; + +/** + * QuoteAccountProfitChangeGroupDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { string } currencyCode + * @property { QuoteAccountProfitChangeEntryDto[] } entries + */ +export const QuoteAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(QuoteAccountProfitChangeEntryDtoSchema).readonly() }).readonly(); +export type QuoteAccountProfitChangeGroupDetailDto = z.infer; + +/** + * QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { QuoteAccountProfitChangeGroupDto[] } items + */ +export const QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(QuoteAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape }); +export type QuoteProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; + +} diff --git a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts new file mode 100644 index 0000000..380a658 --- /dev/null +++ b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts @@ -0,0 +1,97 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { QuoteProfitChangeTrackingApi } from "./quoteProfitChangeTracking.api"; + +export namespace QuoteProfitChangeTrackingQueries { +export const moduleName = QueryModule.QuoteProfitChangeTracking; + +export const keys = { + all: [moduleName] as const, + findProfitChangeGroups: (officeId: string, quoteId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", officeId, quoteId, limit, page, cursor] as const, + findProfitChangeGroupsInfinite: (officeId: string, quoteId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", "infinite", officeId, quoteId, limit, cursor] as const, + findProfitChangeGroupDetail: (groupId: string, officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups/:groupId", groupId, officeId, quoteId] as const, +}; + +/** + * Query `useFindProfitChangeGroups` + * @summary List quote profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroups = ({ officeId, quoteId, limit, page, cursor }: { officeId: string, quoteId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), + queryFn: () => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindProfitChangeGroupsInfinite + * @summary List quote profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupsInfinite = ({ officeId, quoteId, limit, cursor }: { officeId: string, quoteId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindProfitChangeGroupDetail` + * @summary Get quote profit change group details + * @permission Requires `canUseFindProfitChangeGroupDetail` ability + * @param { string } object.groupId Path parameter + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupDetail = ({ groupId, officeId, quoteId }: { groupId: string, officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), + queryFn: () => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId } )); + return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/quoteRoutes/quoteRoutes.acl.ts b/test/generated/full/quoteRoutes/quoteRoutes.acl.ts new file mode 100644 index 0000000..23e12ea --- /dev/null +++ b/test/generated/full/quoteRoutes/quoteRoutes.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteRoutesAcl { +/** + * Use for `useListRoutes` query ability. For global ability, omit the object parameter. + * @description List quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query + */ +export const canUseListRoutes = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Create quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation + */ +export const canUseCreateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Update quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation + */ +export const canUseUpdateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Delete quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation + */ +export const canUseDeleteRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. + * @description Split quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation + */ +export const canUseSplitRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. + * @description Merge quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation + */ +export const canUseMergeRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. + * @description Copy quote route points + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation + */ +export const canUseCopyRoute = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/full/quoteRoutes/quoteRoutes.api.ts b/test/generated/full/quoteRoutes/quoteRoutes.api.ts new file mode 100644 index 0000000..ac83816 --- /dev/null +++ b/test/generated/full/quoteRoutes/quoteRoutes.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteRoutesApi { +export const listRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.RouteListResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes`, + config + ) +}; +export const createRoutePoint = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, + ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), + config + ) +}; +export const updateRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, + ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), + config + ) +}; +export const deleteRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, + undefined, + config + ) +}; +export const splitRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/split`, + undefined, + config + ) +}; +export const mergeRoutes = (officeId: string, quoteId: string, data: CommonModels.MergeRoutesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/merge`, + ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), + config + ) +}; +export const copyRoute = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, + ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/quoteRoutes/quoteRoutes.queries.ts b/test/generated/full/quoteRoutes/quoteRoutes.queries.ts new file mode 100644 index 0000000..e7634ea --- /dev/null +++ b/test/generated/full/quoteRoutes/quoteRoutes.queries.ts @@ -0,0 +1,213 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteRoutesAcl } from "./quoteRoutes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteRoutesApi } from "./quoteRoutes.api"; + +export namespace QuoteRoutesQueries { +export const moduleName = QueryModule.QuoteRoutes; + +export const keys = { + all: [moduleName] as const, + listRoutes: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/routes", officeId, quoteId] as const, +}; + +/** + * Query `useListRoutes` + * @summary List routes with points for a quote + * @permission Requires `canUseListRoutes` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoutes = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoutes(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId } )); + return QuoteRoutesApi.listRoutes(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateRoutePoint` + * @summary Create a route point for a quote route + * @permission Requires `canUseCreateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, data }) => { + checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId } )); + return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateRoutePoint` + * @summary Update a route point for a quote route + * @permission Requires `canUseUpdateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { + checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId } )); + return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRoutePoint` + * @summary Delete a route point from a quote route + * @permission Requires `canUseDeleteRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, pointId }) => { + checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId } )); + return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useSplitRoutes` + * @summary Split quote routes by cargo (sea only) + * @permission Requires `canUseSplitRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId }) => { + checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId } )); + return QuoteRoutesApi.splitRoutes(officeId, quoteId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMergeRoutes` + * @summary Merge quote cargo routes into single route (sea only) + * @permission Requires `canUseMergeRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId } )); + return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopyRoute` + * @summary Copy route points from one route to another (sea only) + * @permission Requires `canUseCopyRoute` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, data }) => { + checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId } )); + return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/quotes/quotes.acl.ts b/test/generated/full/quotes/quotes.acl.ts new file mode 100644 index 0000000..d7f98e9 --- /dev/null +++ b/test/generated/full/quotes/quotes.acl.ts @@ -0,0 +1,160 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuotesAcl { +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ +export const canUseListAvailablePartnersFor = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useExportQuotes` mutation ability. For global ability, omit the object parameter. + * @description Export quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportQuotes` mutation + */ +export const canUseExportQuotes = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Get quote by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ +export const canUseCancel = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Duplicate quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ +export const canUseDuplicate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGetInvolvedParties` query ability. For global ability, omit the object parameter. + * @description Get involved parties for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvolvedParties` query + */ +export const canUseGetInvolvedParties = ( + object?: { officeId: string, } +) => [ + "ReadInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCreateInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Create involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateInvolvedParty` mutation + */ +export const canUseCreateInvolvedParty = ( + object?: { officeId: string, } +) => [ + "CreateInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdateInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Update involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateInvolvedParty` mutation + */ +export const canUseUpdateInvolvedParty = ( + object?: { officeId: string, } +) => [ + "UpdateInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDeleteInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Delete involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvolvedParty` mutation + */ +export const canUseDeleteInvolvedParty = ( + object?: { officeId: string, } +) => [ + "DeleteInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/full/quotes/quotes.api.ts b/test/generated/full/quotes/quotes.api.ts new file mode 100644 index 0000000..0e682d4 --- /dev/null +++ b/test/generated/full/quotes/quotes.api.ts @@ -0,0 +1,123 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuotesModels } from "./quotes.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuotesApi { +export const paginate = (officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuotesPaginateResponseSchema }, + `/offices/${officeId}/quotes`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes`, + ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), + config + ) +}; +export const listAvailablePartnersFor = (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), + }, + } + ) +}; +export const exportQuotes = (officeId: string, data: QuotesModels.QuoteExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/exports`, + ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getById = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}`, + config + ) +}; +export const update = (officeId: string, quoteId: string, data: QuotesModels.UpdateQuoteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}`, + ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), + config + ) +}; +export const cancel = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cancel`, + undefined, + config + ) +}; +export const duplicate = (officeId: string, quoteId: string, data: QuotesModels.DuplicateQuoteRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/duplicate`, + ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), + config + ) +}; +export const getInvolvedParties = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties`, + config + ) +}; +export const createInvolvedParty = (officeId: string, quoteId: string, data: CommonModels.CreateInvolvedPartyRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties`, + ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), + config + ) +}; +export const updateInvolvedParty = (officeId: string, quoteId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, + ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), + config + ) +}; +export const deleteInvolvedParty = (officeId: string, quoteId: string, partyId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/quotes/quotes.configs.ts b/test/generated/full/quotes/quotes.configs.ts new file mode 100644 index 0000000..e288ac4 --- /dev/null +++ b/test/generated/full/quotes/quotes.configs.ts @@ -0,0 +1,137 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { QuotesModels } from "./quotes.models"; +import { QuotesQueries } from "./quotes.queries"; +import { QuotesAcl } from "./quotes.acl"; + +export namespace QuotesConfigs { +export const quotesConfig = { + meta: { + title: "Quotes", + }, + readAll: { + acl: QuotesAcl.canUsePaginate, + schema: QuotesModels.QuotePreviewResponseDTOSchema, + paginated: QuotesQueries.usePaginate, + infinite: QuotesQueries.usePaginateInfinite, + filters: { + schema: QuotesModels.QuoteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: QuotesModels.QuoteFilterDtoSchema, + options: { + inputs: { + statusDate: true, + transportMode: true, + status: true, + direction: true, + loadType: true, + serviceType: true, + carrierId: true, + consigneeId: true, + employee: true, + routing: true, + number: true, + createdAt: true, + vesselCarrier: true, + searchQuery: true, + customer: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: QuotesModels.QuotePreviewResponseDTOSchema, + options: { + columns: { + id: true, + transportMode: true, + statusDate: true, + createdAt: true, + number: true, + status: true, + direction: true, + loadType: true, + customer: true, + customerReference: true, + consignee: true, + consigneeReference: true, + carrier: true, + carrierReference: true, + employee: true, + origin: true, + destination: true, + portOfLoading: true, + dischargePort: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + equipment: true, + serviceType: true, + currency: true, + profit: true, + margin: true, + numberOfConvertedPositions: true, + departureDate: true, + arrivalDate: true, + routing: true, + }, + sortable: QuotesModels.QuotesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: QuotesAcl.canUseGetById, + schema: QuotesModels.QuoteCoreResponseDTOSchema, + query: QuotesQueries.useGetById, + }, + create: { + acl: QuotesAcl.canUseCreate, + schema: QuotesModels.CreateQuoteRequestDTOSchema, + mutation: QuotesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: QuotesModels.CreateQuoteRequestDTOSchema, + options: { + inputs: { + section: true, + direction: true, + transportMode: true, + loadType: true, + serviceType: true, + customerBusinessPartnerId: true, + }, + }, +}) + }, + update: { + acl: QuotesAcl.canUseUpdate, + schema: QuotesModels.UpdateQuoteRequestDTOSchema, + mutation: QuotesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: QuotesModels.UpdateQuoteRequestDTOSchema, + options: { + inputs: { + number: true, + statusDate: true, + cargoType: true, + loadType: true, + incoterms: true, + secondIncoterms: true, + serviceType: true, + buyRateReference: true, + frequency: true, + transitDurationInDays: true, + quoteType: true, + defaultCurrencyId: true, + salesRepId: true, + responsibleEmployeeId: true, + receivedByEmployeeId: true, + team: true, + volumetricWeightModifier: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/full/quotes/quotes.models.ts b/test/generated/full/quotes/quotes.models.ts new file mode 100644 index 0000000..b02bfc0 --- /dev/null +++ b/test/generated/full/quotes/quotes.models.ts @@ -0,0 +1,322 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuotesModels { +/** + * QuoteStatusEnumSchema + * @type { enum } + */ +export const QuoteStatusEnumSchema = z.enum(["Pending", "Cancelled", "Converted"]); +export type QuoteStatusEnum = z.infer; +export const QuoteStatusEnum = QuoteStatusEnumSchema.enum; + +/** + * QuoteCustomerResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { string } phone The phone number of the customer + * @property { string } email The email of the customer + */ +export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().describe("The phone number of the customer").nullish(), email: z.string().describe("The email of the customer").nullish() }).readonly(); +export type QuoteCustomerResponseDto = z.infer; + +/** + * QuoteNamedReferenceResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the entity + * @property { string } name Name of the entity + * @property { string } matchCode + * @property { string } label Display label (name or match code depending on office settings) + */ +export const QuoteNamedReferenceResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the entity").nullable(), name: z.string().describe("Name of the entity").nullable(), matchCode: z.string().nullable(), label: z.string().describe("Display label (name or match code depending on office settings)").nullable() }).readonly(); +export type QuoteNamedReferenceResponseDto = z.infer; + +/** + * QuotePreviewResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the quote + * @property { CommonModels.TransportModeEnum } transportMode Transport mode + * @property { string } statusDate The date of the quote status + * @property { string } createdAt The date when the quote was created + * @property { string } number The quote number + * @property { QuoteStatusEnum } status Status of the quote + * @property { CommonModels.DirectionEnum } direction Direction of the quote + * @property { CommonModels.LoadTypeEnum } loadType Load type + * @property { QuoteCustomerResponseDto } customer The customer information + * @property { string } customerReference Customer reference number + * @property { QuoteNamedReferenceResponseDto } consignee Consignee information + * @property { string } consigneeReference Consignee reference number + * @property { QuoteNamedReferenceResponseDto } carrier The carrier + * @property { string } carrierReference Carrier reference number + * @property { QuoteNamedReferenceResponseDto } employee Responsible employee + * @property { QuoteNamedReferenceResponseDto } origin Origin location + * @property { QuoteNamedReferenceResponseDto } destination Destination location + * @property { QuoteNamedReferenceResponseDto } portOfLoading Port of loading + * @property { QuoteNamedReferenceResponseDto } dischargePort Discharge port + * @property { string } bookingNumber Booking reference number + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } vesselCarrier Carrier name from route point (sea positions only) + * @property { string } equipment Equipment summary (e.g., "2x20DC, 1x40HC") + * @property { CommonModels.ServiceTypeEnum } serviceType Service type + * @property { string } currency Currency code + * @property { number } profit Total profit + * @property { number } margin Profit margin percentage + * @property { number } numberOfConvertedPositions Number of positions converted from this quote + * @property { string } departureDate Departure date + * @property { string } arrivalDate Arrival date + * @property { CommonModels.SeaRoutingEnum } routing Sea routing type + */ +export const QuotePreviewResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status").nullable(), createdAt: z.iso.datetime({ offset: true }).describe("The date when the quote was created"), number: z.string().describe("The quote number"), status: QuoteStatusEnumSchema.describe("Status of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type").nullish(), customer: QuoteCustomerResponseDtoSchema.describe("The customer information"), customerReference: z.string().describe("Customer reference number").nullish(), consignee: QuoteNamedReferenceResponseDtoSchema.describe("Consignee information").nullish(), consigneeReference: z.string().describe("Consignee reference number").nullish(), carrier: QuoteNamedReferenceResponseDtoSchema.describe("The carrier").nullish(), carrierReference: z.string().describe("Carrier reference number").nullish(), employee: QuoteNamedReferenceResponseDtoSchema.describe("Responsible employee").nullish(), origin: QuoteNamedReferenceResponseDtoSchema.describe("Origin location"), destination: QuoteNamedReferenceResponseDtoSchema.describe("Destination location"), portOfLoading: QuoteNamedReferenceResponseDtoSchema.describe("Port of loading").nullish(), dischargePort: QuoteNamedReferenceResponseDtoSchema.describe("Discharge port").nullish(), bookingNumber: z.string().describe("Booking reference number").nullish(), vessel: z.string().describe("Vessel name").nullish(), voyage: z.string().describe("Voyage number").nullish(), vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), equipment: z.string().describe("Equipment summary (e.g., "2x20DC, 1x40HC")").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.describe("Service type").nullish(), currency: z.string().describe("Currency code").nullish(), profit: z.number().describe("Total profit").nullish(), margin: z.number().describe("Profit margin percentage").nullish(), numberOfConvertedPositions: z.number().describe("Number of positions converted from this quote"), departureDate: z.iso.datetime({ offset: true }).describe("Departure date").nullish(), arrivalDate: z.iso.datetime({ offset: true }).describe("Arrival date").nullish(), routing: CommonModels.SeaRoutingEnumSchema.describe("Sea routing type").nullish() }).readonly(); +export type QuotePreviewResponseDTO = z.infer; + +/** + * QuoteFilterDtoSchema + * @type { object } + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.TransportModeEnum } transportMode + * @property { QuoteStatusEnum[] } status + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } carrierId Filter quotes by carrier IDs + * @property { string[] } consigneeId Filter quotes by consignee IDs + * @property { string[] } employee Filter quotes by employee IDs + * @property { CommonModels.SeaRoutingEnum } routing + * @property { string } number Filter quotes by quote number + * @property { CommonModels.DateRangeDto } createdAt + * @property { string } vesselCarrier Filter quotes by carrier name from route point + * @property { string } searchQuery + * @property { string[] } customer + */ +export const QuoteFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, carrierId: z.array(z.string()).readonly().describe("Filter quotes by carrier IDs"), consigneeId: z.array(z.string()).readonly().describe("Filter quotes by consignee IDs"), employee: z.array(z.string()).readonly().describe("Filter quotes by employee IDs"), routing: CommonModels.SeaRoutingEnumSchema, number: z.string().describe("Filter quotes by quote number"), createdAt: CommonModels.DateRangeDtoSchema, vesselCarrier: z.string().describe("Filter quotes by carrier name from route point"), searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); +export type QuoteFilterDto = z.infer; + +/** + * QuoteExportFilterDtoSchema + * @type { object } + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.TransportModeEnum } transportMode + * @property { QuoteStatusEnum[] } status + * @property { CommonModels.DirectionEnum } direction + * @property { string } searchQuery + * @property { string[] } customer + */ +export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); +export type QuoteExportFilterDto = z.infer; + +/** + * QuoteExportColumnSchema + * @type { enum } + */ +export const QuoteExportColumnSchema = z.enum(["id", "transportMode", "statusDate", "createdAt", "number", "status", "direction", "loadType", "serviceType", "customerId", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeId", "consigneeName", "consigneeReference", "carrierId", "carrierName", "carrierReference", "responsibleEmployeeName", "originLocationId", "originLocationName", "destinationLocationId", "destinationLocationName", "portOfLoadingId", "portOfLoadingName", "dischargePortId", "dischargePortName", "bookingNumber", "vessel", "voyage", "equipment", "departureDate", "arrivalDate", "routing", "currency", "profit", "margin"]); +export type QuoteExportColumn = z.infer; +export const QuoteExportColumn = QuoteExportColumnSchema.enum; + +/** + * QuoteExportRequestDtoSchema + * @type { object } + * @property { QuoteExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { QuoteExportFilterDto } filter + */ +export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: QuoteExportFilterDtoSchema }).readonly(); +export type QuoteExportRequestDto = z.infer; + +/** + * CreateQuoteRequestDTOSchema + * @type { object } + * @property { CommonModels.SectionEnum } section The section of the quote + * @property { CommonModels.DirectionEnum } direction The direction of the quote + * @property { CommonModels.TransportModeEnum } transportMode The mode of transport for the quote + * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote + * @property { CommonModels.ServiceTypeEnum } serviceType The service type for the quote + * @property { string } customerBusinessPartnerId The ID of the business partner that is the customer + */ +export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema.describe("The section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("The direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("The mode of transport for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The service type for the quote"), customerBusinessPartnerId: z.string().describe("The ID of the business partner that is the customer") }).readonly(); +export type CreateQuoteRequestDTO = z.infer; + +/** + * QuoteCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type QuoteCustomerDto = z.infer; + +/** + * QuoteEmployeeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the employee + * @property { string } name Name of the employee + */ +export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the employee"), name: z.string().describe("Name of the employee") }).readonly(); +export type QuoteEmployeeResponseDTO = z.infer; + +/** + * CargoTypeEnumSchema + * @type { enum } + */ +export const CargoTypeEnumSchema = z.enum(["Trailer", "Container", "BreakBulk", "Roro", "Project"]); +export type CargoTypeEnum = z.infer; +export const CargoTypeEnum = CargoTypeEnumSchema.enum; + +/** + * QuoteTypeEnumSchema + * @type { enum } + */ +export const QuoteTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); +export type QuoteTypeEnum = z.infer; +export const QuoteTypeEnum = QuoteTypeEnumSchema.enum; + +/** + * QuoteConvertedPositionDtoSchema + * @type { object } + * @property { string } positionId + * @property { string } positionNumber + */ +export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }).readonly(); +export type QuoteConvertedPositionDto = z.infer; + +/** + * QuoteCoreResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the quote + * @property { string } rootFolderId Root folder identifier bound to this quote + * @property { QuoteCustomerDto } customer + * @property { QuoteStatusEnum } status Current status of the quote + * @property { string } responsibleEmployeeId Unique identifier of the responsible employee + * @property { string } receivedByEmployeeId Unique identifier of the employee receiving the quote + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } salesRepId Unique identifier of the sales rep + * @property { QuoteEmployeeResponseDTO } responsibleEmployee The responsible employee + * @property { QuoteEmployeeResponseDTO } receivedByEmployee The employee who received the quote + * @property { string } owningOfficeId ID of the office owning the quote + * @property { string } name Name of the quote + * @property { string } number Quote number + * @property { CommonModels.SectionEnum } section Section of the quote + * @property { CommonModels.DirectionEnum } direction Direction of the quote + * @property { CommonModels.TransportModeEnum } transportMode Mode of transport + * @property { string } statusDate Date of the quote status + * @property { CargoTypeEnum } cargoType Type of cargo + * @property { CommonModels.IncotermsEnum } incoterms Incoterms for the quote + * @property { CommonModels.IncotermsEnum } secondIncoterms Second incoterms for the quote + * @property { string } buyRateReference Reference for buy rate + * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote + * @property { string } transitDurationInDays Transit duration in days + * @property { QuoteTypeEnum } quoteType Type of quote + * @property { string } defaultCurrencyId Default currency + * @property { QuoteEmployeeResponseDTO } salesRep The sales rep for the quote + * @property { string } team Team + * @property { string } createdAt + * @property { string } updatedAt + * @property { QuoteConvertedPositionDto[] } convertedPositions Positions converted from this quote. Default: `` + * @property { CommonModels.LoadTypeEnum } loadType Load type of quote + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const QuoteCoreResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), rootFolderId: z.string().describe("Root folder identifier bound to this quote").nullish(), customer: QuoteCustomerDtoSchema.nullish(), status: QuoteStatusEnumSchema.describe("Current status of the quote"), responsibleEmployeeId: z.string().describe("Unique identifier of the responsible employee").nullish(), receivedByEmployeeId: z.string().describe("Unique identifier of the employee receiving the quote").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesRepId: z.string().describe("Unique identifier of the sales rep").nullish(), responsibleEmployee: QuoteEmployeeResponseDTOSchema.describe("The responsible employee").nullish(), receivedByEmployee: QuoteEmployeeResponseDTOSchema.describe("The employee who received the quote").nullish(), owningOfficeId: z.string().describe("ID of the office owning the quote"), name: z.string().describe("Name of the quote"), number: z.string().describe("Quote number"), section: CommonModels.SectionEnumSchema.describe("Section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), statusDate: z.iso.datetime({ offset: true }).describe("Date of the quote status"), cargoType: CargoTypeEnumSchema.describe("Type of cargo").nullish(), incoterms: CommonModels.IncotermsEnumSchema.describe("Incoterms for the quote").nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("Second incoterms for the quote").nullish(), buyRateReference: z.string().describe("Reference for buy rate").nullish(), frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), transitDurationInDays: z.string().describe("Transit duration in days").nullish(), quoteType: QuoteTypeEnumSchema.describe("Type of quote").nullish(), defaultCurrencyId: z.string().describe("Default currency").nullish(), salesRep: QuoteEmployeeResponseDTOSchema.describe("The sales rep for the quote").nullish(), team: z.string().describe("Team").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), convertedPositions: z.array(QuoteConvertedPositionDtoSchema).readonly().describe("Positions converted from this quote").default([]), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type of quote").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); +export type QuoteCoreResponseDTO = z.infer; + +/** + * UpdateQuoteRequestDTOSchema + * @type { object } + * @property { string } number The quote number + * @property { string } statusDate The date of the quote status + * @property { CargoTypeEnum } cargoType The type of cargo for the quote + * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote + * @property { CommonModels.IncotermsEnum } incoterms The incoterms for the quote + * @property { CommonModels.IncotermsEnum } secondIncoterms The second incoterms for the quote + * @property { CommonModels.ServiceTypeEnum } serviceType The type of service for the quote + * @property { string } buyRateReference The reference for the buy rate + * @property { CommonModels.FrequencyEnum } frequency The frequency of the quote + * @property { string } transitDurationInDays The transit duration in days + * @property { QuoteTypeEnum } quoteType The type of quote + * @property { string } defaultCurrencyId The default currency for the quote + * @property { string } salesRepId The sales representative for the quote + * @property { string } responsibleEmployeeId The responsible employee for the quote + * @property { string } receivedByEmployeeId The employee who receieved the quote + * @property { string } team The team responsible for the quote + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().describe("The quote number"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status"), cargoType: CargoTypeEnumSchema.describe("The type of cargo for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), incoterms: CommonModels.IncotermsEnumSchema.describe("The incoterms for the quote"), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("The second incoterms for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The type of service for the quote"), buyRateReference: z.string().describe("The reference for the buy rate"), frequency: CommonModels.FrequencyEnumSchema.describe("The frequency of the quote"), transitDurationInDays: z.string().describe("The transit duration in days").nullable(), quoteType: QuoteTypeEnumSchema.describe("The type of quote"), defaultCurrencyId: z.string().describe("The default currency for the quote"), salesRepId: z.string().describe("The sales representative for the quote"), responsibleEmployeeId: z.string().describe("The responsible employee for the quote"), receivedByEmployeeId: z.string().describe("The employee who receieved the quote"), team: z.string().describe("The team responsible for the quote"), volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); +export type UpdateQuoteRequestDTO = z.infer; + +/** + * QuoteSectionEnumSchema + * @type { enum } + */ +export const QuoteSectionEnumSchema = z.enum(["Customer", "Overview", "Cargo", "Finances", "Documents"]); +export type QuoteSectionEnum = z.infer; +export const QuoteSectionEnum = QuoteSectionEnumSchema.enum; + +/** + * DuplicateQuoteRequestDtoSchema + * @type { object } + * @property { QuoteSectionEnum[] } sections The sections to duplicate. Min Items: `1` + */ +export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).readonly().min(1).describe("The sections to duplicate") }).readonly(); +export type DuplicateQuoteRequestDto = z.infer; + +/** + * QuoteListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalProfit + * @property { number } profitPerQuote + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const QuoteListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalProfit: z.number(), profitPerQuote: z.number(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type QuoteListResponseDto = z.infer; + +/** + * QuotesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const QuotesPaginateOrderParamEnumSchema = z.enum(["number", "statusDate", "transportMode", "status", "direction", "loadType", "serviceType", "createdAt", "employee", "profit"]); +export type QuotesPaginateOrderParamEnum = z.infer; +export const QuotesPaginateOrderParamEnum = QuotesPaginateOrderParamEnumSchema.enum; + +/** + * QuotesPaginateResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerQuote + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { QuotePreviewResponseDTO[] } items + */ +export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).readonly() }).readonly().shape }); +export type QuotesPaginateResponse = z.infer; + +/** + * QuotesListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ +export const QuotesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type QuotesListAvailablePartnersForResponse = z.infer; + +/** + * GetInvolvedPartiesResponseSchema + * @type { array } + */ +export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); +export type GetInvolvedPartiesResponse = z.infer; + +} diff --git a/test/generated/full/quotes/quotes.queries.ts b/test/generated/full/quotes/quotes.queries.ts new file mode 100644 index 0000000..8d2f75e --- /dev/null +++ b/test/generated/full/quotes/quotes.queries.ts @@ -0,0 +1,377 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuotesAcl } from "./quotes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuotesModels } from "./quotes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { QuotesApi } from "./quotes.api"; + +export namespace QuotesQueries { +export const moduleName = QueryModule.Quotes; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", "infinite", officeId, limit, order, filter, cursor] as const, + listAvailablePartnersFor: (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/quotes/:quoteId/available-partners", officeId, quoteId, search, useCase] as const, + getById: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId", officeId, quoteId] as const, + getInvolvedParties: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/involved-parties", officeId, quoteId] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Quotes + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` + * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(QuotesAcl.canUsePaginate({ officeId } )); + return QuotesApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Quotes + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` + * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuotesAcl.canUsePaginate({ officeId } )); + return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Quote + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { QuotesModels.CreateQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(QuotesAcl.canUseCreate({ officeId } )); + return QuotesApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for a quote + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListAvailablePartnersFor = ({ officeId, quoteId, search, useCase }: { officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), + queryFn: () => { + checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId } )); + return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase, config) }, + ...options, + }); +}; + +/** + * Mutation `useExportQuotes` - recommended when file should not be cached + * @summary Export quotes to Excel + * @permission Requires `canUseExportQuotes` ability + * @param { string } mutation.officeId Path parameter + * @param { QuotesModels.QuoteExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportQuotes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(QuotesAcl.canUseExportQuotes({ officeId } )); + return QuotesApi.exportQuotes(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetById` + * @summary Get quote by id + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, quoteId), + queryFn: () => { + checkAcl(QuotesAcl.canUseGetById({ officeId } )); + return QuotesApi.getById(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuotesModels.UpdateQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseUpdate({ officeId } )); + return QuotesApi.update(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCancel` + * @summary Cancel quote + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId }) => { + checkAcl(QuotesAcl.canUseCancel({ officeId } )); + return QuotesApi.cancel(officeId, quoteId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicate` + * @summary Duplicate quote + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuotesModels.DuplicateQuoteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseDuplicate({ officeId } )); + return QuotesApi.duplicate(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetInvolvedParties` + * @summary Get involved parties for quote + * @permission Requires `canUseGetInvolvedParties` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetInvolvedParties = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvolvedParties(officeId, quoteId), + queryFn: () => { + checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId } )); + return QuotesApi.getInvolvedParties(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateInvolvedParty` + * @summary Create involved party for quote + * @permission Requires `canUseCreateInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId } )); + return QuotesApi.createInvolvedParty(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateInvolvedParty` + * @summary Update involved party for quote + * @permission Requires `canUseUpdateInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, partyId, data }) => { + checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId } )); + return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteInvolvedParty` + * @summary Delete involved party for quote + * @permission Requires `canUseDeleteInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, partyId }) => { + checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId } )); + return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/remarkTemplates/remarkTemplates.acl.ts b/test/generated/full/remarkTemplates/remarkTemplates.acl.ts new file mode 100644 index 0000000..b194325 --- /dev/null +++ b/test/generated/full/remarkTemplates/remarkTemplates.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace RemarkTemplatesAcl { +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List remark template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List remark templates + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Create", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get remark template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update remark template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Update", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Archive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Unarchive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +} diff --git a/test/generated/full/remarkTemplates/remarkTemplates.api.ts b/test/generated/full/remarkTemplates/remarkTemplates.api.ts new file mode 100644 index 0000000..c4f8e86 --- /dev/null +++ b/test/generated/full/remarkTemplates/remarkTemplates.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; + +export namespace RemarkTemplatesApi { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/remark-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, + `/offices/${officeId}/remark-templates`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates`, + ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}`, + ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/remarkTemplates/remarkTemplates.configs.ts b/test/generated/full/remarkTemplates/remarkTemplates.configs.ts new file mode 100644 index 0000000..616b1f4 --- /dev/null +++ b/test/generated/full/remarkTemplates/remarkTemplates.configs.ts @@ -0,0 +1,123 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; +import { RemarkTemplatesQueries } from "./remarkTemplates.queries"; +import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; + +export namespace RemarkTemplatesConfigs { +export const remarkTemplatesConfig = { + meta: { + title: "Remark Templates", + }, + readAll: { + acl: RemarkTemplatesAcl.canUseList, + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + paginated: RemarkTemplatesQueries.useList, + infinite: RemarkTemplatesQueries.useListInfinite, + filters: { + schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + onlyUsedFor: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + content: true, + onlyUsedFor: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: RemarkTemplatesAcl.canUseFindById, + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + query: RemarkTemplatesQueries.useFindById, + }, + create: { + acl: RemarkTemplatesAcl.canUseCreate, + schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, + mutation: RemarkTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + content: true, + onlyUsedFor: true, + }, + }, +}) + }, + update: { + acl: RemarkTemplatesAcl.canUseUpdate, + schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, + mutation: RemarkTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + content: true, + onlyUsedFor: true, + archived: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: RemarkTemplatesAcl.canUsePaginateLabels, + schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, + paginated: RemarkTemplatesQueries.usePaginateLabels, + infinite: RemarkTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + content: true, + }, + sortable: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/remarkTemplates/remarkTemplates.models.ts b/test/generated/full/remarkTemplates/remarkTemplates.models.ts new file mode 100644 index 0000000..10f5d41 --- /dev/null +++ b/test/generated/full/remarkTemplates/remarkTemplates.models.ts @@ -0,0 +1,132 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace RemarkTemplatesModels { +/** + * RemarkTemplateLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { CommonModels.EditorContentResponseDto } content Remark template content + */ +export const RemarkTemplateLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), content: CommonModels.EditorContentResponseDtoSchema.describe("Remark template content") }).readonly(); +export type RemarkTemplateLabelResponseDTO = z.infer; + +/** + * RemarkTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const RemarkTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type RemarkTemplateEmployeeDTO = z.infer; + +/** + * OnlyUsedForEnumSchema + * @type { enum } + */ +export const OnlyUsedForEnumSchema = z.enum(["transport-order", "export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "invoice", "quote-document", "shipping-instructions", "position-office-notes", "invoice-body-remarks", "business-partner-office-notes"]); +export type OnlyUsedForEnum = z.infer; +export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; + +/** + * RemarkTemplateResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name Template name + * @property { CommonModels.EditorContentResponseDto } content Template content + * @property { string[] } onlyUsedFor Restrict template usage to specific document types + * @property { boolean } archived + * @property { string } createdById + * @property { RemarkTemplateEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { RemarkTemplateEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const RemarkTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string().describe("Template name"), content: CommonModels.EditorContentResponseDtoSchema.describe("Template content"), onlyUsedFor: z.array(OnlyUsedForEnumSchema).readonly().describe("Restrict template usage to specific document types").nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type RemarkTemplateResponseDTO = z.infer; + +/** + * CreateRemarkTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { CommonModels.EditorContentUpdateDto } content Template content + * @property { OnlyUsedForEnum[] } onlyUsedFor Restrict template usage to specific document types + */ +export const CreateRemarkTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), onlyUsedFor: z.array(OnlyUsedForEnumSchema).readonly().describe("Restrict template usage to specific document types").nullish() }).readonly(); +export type CreateRemarkTemplateRequestDTO = z.infer; + +/** + * UpdateRemarkTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { CommonModels.EditorContentUpdateDto } content Template content + * @property { string[] } onlyUsedFor Restrict template usage to specific document types + * @property { boolean } archived Archive status + */ +export const UpdateRemarkTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), onlyUsedFor: z.array(OnlyUsedForEnumSchema).readonly().describe("Restrict template usage to specific document types"), archived: z.boolean().describe("Archive status") }).readonly(); +export type UpdateRemarkTemplateRequestDTO = z.infer; + +/** + * RemarkTemplateFilterDtoSchema + * @type { object } + * @property { boolean } archived + * @property { string } search + * @property { string } onlyUsedFor Filter by document type + */ +export const RemarkTemplateFilterDtoSchema = z.object({ archived: z.boolean(), search: z.string(), onlyUsedFor: OnlyUsedForEnumSchema.describe("Filter by document type") }).readonly(); +export type RemarkTemplateFilterDto = z.infer; + +/** + * RemarkTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const RemarkTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type RemarkTemplateLabelFilterDto = z.infer; + +/** + * RemarkTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const RemarkTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type RemarkTemplatesPaginateLabelsOrderParamEnum = z.infer; +export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * RemarkTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { RemarkTemplateLabelResponseDTO[] } items + */ +export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type RemarkTemplatesPaginateLabelsResponse = z.infer; + +/** + * RemarkTemplatesListOrderParamEnumSchema + * @type { enum } + */ +export const RemarkTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type RemarkTemplatesListOrderParamEnum = z.infer; +export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEnumSchema.enum; + +/** + * RemarkTemplatesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { RemarkTemplateResponseDTO[] } items + */ +export const RemarkTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).readonly() }).readonly().shape }); +export type RemarkTemplatesListResponse = z.infer; + +} diff --git a/test/generated/full/remarkTemplates/remarkTemplates.queries.ts b/test/generated/full/remarkTemplates/remarkTemplates.queries.ts new file mode 100644 index 0000000..52f9b4a --- /dev/null +++ b/test/generated/full/remarkTemplates/remarkTemplates.queries.ts @@ -0,0 +1,274 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; +import { RemarkTemplatesApi } from "./remarkTemplates.api"; + +export namespace RemarkTemplatesQueries { +export const moduleName = QueryModule.RemarkTemplates; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/remark-templates/:id", id, officeId] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate remark template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate remark template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useList` + * @summary List remark templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); + return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List remark templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); + return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new remark template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId } )); + return RemarkTemplatesApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get remark template by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId } )); + return RemarkTemplatesApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update remark template by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId } )); + return RemarkTemplatesApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive remark template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId } )); + return RemarkTemplatesApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive remark template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId } )); + return RemarkTemplatesApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/roadQuotes/roadQuotes.acl.ts b/test/generated/full/roadQuotes/roadQuotes.acl.ts new file mode 100644 index 0000000..edf7693 --- /dev/null +++ b/test/generated/full/roadQuotes/roadQuotes.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace RoadQuotesAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get road quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update road quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/full/roadQuotes/roadQuotes.api.ts b/test/generated/full/roadQuotes/roadQuotes.api.ts new file mode 100644 index 0000000..eb644c0 --- /dev/null +++ b/test/generated/full/roadQuotes/roadQuotes.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { RoadQuotesModels } from "./roadQuotes.models"; + +export namespace RoadQuotesApi { +export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/road-quote`, + config + ) +}; +export const update = (officeId: string, quoteId: string, data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/road-quote`, + ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/roadQuotes/roadQuotes.models.ts b/test/generated/full/roadQuotes/roadQuotes.models.ts new file mode 100644 index 0000000..e5ae99e --- /dev/null +++ b/test/generated/full/roadQuotes/roadQuotes.models.ts @@ -0,0 +1,29 @@ +import { z } from "zod"; + +export namespace RoadQuotesModels { +/** + * RoadQuoteResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the road quote + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + */ +export const RoadQuoteResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the road quote"), bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling") }).readonly(); +export type RoadQuoteResponseDTO = z.infer; + +/** + * UpdateRoadQuoteRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + */ +export const UpdateRoadQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling") }).readonly(); +export type UpdateRoadQuoteRequestDTO = z.infer; + +} diff --git a/test/generated/full/roadQuotes/roadQuotes.queries.ts b/test/generated/full/roadQuotes/roadQuotes.queries.ts new file mode 100644 index 0000000..2740233 --- /dev/null +++ b/test/generated/full/roadQuotes/roadQuotes.queries.ts @@ -0,0 +1,71 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { RoadQuotesAcl } from "./roadQuotes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { RoadQuotesModels } from "./roadQuotes.models"; +import { RoadQuotesApi } from "./roadQuotes.api"; + +export namespace RoadQuotesQueries { +export const moduleName = QueryModule.RoadQuotes; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/road-quote", officeId, quoteId] as const, +}; + +/** + * Query `useGet` + * @summary Get road quote by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(RoadQuotesAcl.canUseGet({ officeId } )); + return RoadQuotesApi.get(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update road quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { RoadQuotesModels.UpdateRoadQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(RoadQuotesAcl.canUseUpdate({ officeId } )); + return RoadQuotesApi.update(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.get(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/seaPositions/seaPositions.acl.ts b/test/generated/full/seaPositions/seaPositions.acl.ts new file mode 100644 index 0000000..1040161 --- /dev/null +++ b/test/generated/full/seaPositions/seaPositions.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace SeaPositionsAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get sea position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update sea position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/full/seaPositions/seaPositions.api.ts b/test/generated/full/seaPositions/seaPositions.api.ts new file mode 100644 index 0000000..c617cd0 --- /dev/null +++ b/test/generated/full/seaPositions/seaPositions.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { SeaPositionsModels } from "./seaPositions.models"; + +export namespace SeaPositionsApi { +export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/sea-position`, + config + ) +}; +export const update = (officeId: string, positionId: string, data: SeaPositionsModels.UpdateSeaPositionRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/sea-position`, + ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/seaPositions/seaPositions.models.ts b/test/generated/full/seaPositions/seaPositions.models.ts new file mode 100644 index 0000000..80dd1d9 --- /dev/null +++ b/test/generated/full/seaPositions/seaPositions.models.ts @@ -0,0 +1,49 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace SeaPositionsModels { +/** + * SeaPositionResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } bookingMatchingCode + * @property { string } houseBillOfLadingNumber + * @property { string } masterBillOfLadingNumber + * @property { boolean } hblRequired + * @property { boolean } mblRequired + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { string } buyServiceContract + * @property { string } sellServiceContract + * @property { string } quoteReference + * @property { string } createdAt + * @property { string } updatedAt + * @property { CommonModels.SeaRoutingEnum } routing + * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route + */ +export const SeaPositionResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterBillOfLadingNumber: z.string().nullish(), hblRequired: z.boolean(), mblRequired: z.boolean(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), buyServiceContract: z.string().nullish(), sellServiceContract: z.string().nullish(), quoteReference: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), routing: CommonModels.SeaRoutingEnumSchema.nullish(), defaultBookingNumber: z.string().describe("Default booking number from the port of loading point of the default route").nullish() }).readonly(); +export type SeaPositionResponseDTO = z.infer; + +/** + * UpdateSeaPositionRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode + * @property { string } houseBillOfLadingNumber + * @property { boolean } mblRequired + * @property { boolean } hblRequired + * @property { string } masterBillOfLadingNumber + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { string } buyServiceContract + * @property { string } quoteReference + * @property { string } sellServiceContract + * @property { CommonModels.SeaRoutingEnum } routing + */ +export const UpdateSeaPositionRequestDTOSchema = z.object({ bookingMatchingCode: z.string(), houseBillOfLadingNumber: z.string(), mblRequired: z.boolean(), hblRequired: z.boolean(), masterBillOfLadingNumber: z.string(), blfromCostumerDate: z.iso.datetime({ offset: true }), blfromCarrierDate: z.iso.datetime({ offset: true }), customsDate: z.iso.datetime({ offset: true }), vgmCustomerDate: z.iso.datetime({ offset: true }), buyServiceContract: z.string(), quoteReference: z.string(), sellServiceContract: z.string(), routing: CommonModels.SeaRoutingEnumSchema }).readonly(); +export type UpdateSeaPositionRequestDTO = z.infer; + +} diff --git a/test/generated/full/seaPositions/seaPositions.queries.ts b/test/generated/full/seaPositions/seaPositions.queries.ts new file mode 100644 index 0000000..97e123e --- /dev/null +++ b/test/generated/full/seaPositions/seaPositions.queries.ts @@ -0,0 +1,71 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { SeaPositionsAcl } from "./seaPositions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { SeaPositionsModels } from "./seaPositions.models"; +import { SeaPositionsApi } from "./seaPositions.api"; + +export namespace SeaPositionsQueries { +export const moduleName = QueryModule.SeaPositions; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/sea-position", officeId, positionId] as const, +}; + +/** + * Query `useGet` + * @summary Get sea position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(SeaPositionsAcl.canUseGet({ officeId } )); + return SeaPositionsApi.get(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update sea position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { SeaPositionsModels.UpdateSeaPositionRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(SeaPositionsAcl.canUseUpdate({ officeId } )); + return SeaPositionsApi.update(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/seaQuotes/seaQuotes.acl.ts b/test/generated/full/seaQuotes/seaQuotes.acl.ts new file mode 100644 index 0000000..ca36ff7 --- /dev/null +++ b/test/generated/full/seaQuotes/seaQuotes.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace SeaQuotesAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get sea quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update sea quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/full/seaQuotes/seaQuotes.api.ts b/test/generated/full/seaQuotes/seaQuotes.api.ts new file mode 100644 index 0000000..f3ee817 --- /dev/null +++ b/test/generated/full/seaQuotes/seaQuotes.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { SeaQuotesModels } from "./seaQuotes.models"; + +export namespace SeaQuotesApi { +export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/sea-quote`, + config + ) +}; +export const update = (officeId: string, quoteId: string, data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/sea-quote`, + ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/full/seaQuotes/seaQuotes.models.ts b/test/generated/full/seaQuotes/seaQuotes.models.ts new file mode 100644 index 0000000..f03b400 --- /dev/null +++ b/test/generated/full/seaQuotes/seaQuotes.models.ts @@ -0,0 +1,33 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace SeaQuotesModels { +/** + * SeaQuoteResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the sea quote + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + * @property { CommonModels.SeaRoutingEnum } routing + * @property { boolean } splitRoute Indicates if the route is split + */ +export const SeaQuoteResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the sea quote"), bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling"), routing: CommonModels.SeaRoutingEnumSchema.nullish(), splitRoute: z.boolean().describe("Indicates if the route is split").nullish() }).readonly(); +export type SeaQuoteResponseDTO = z.infer; + +/** + * UpdateSeaQuoteRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + * @property { CommonModels.SeaRoutingEnum } routing + */ +export const UpdateSeaQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling"), routing: CommonModels.SeaRoutingEnumSchema }).readonly(); +export type UpdateSeaQuoteRequestDTO = z.infer; + +} diff --git a/test/generated/full/seaQuotes/seaQuotes.queries.ts b/test/generated/full/seaQuotes/seaQuotes.queries.ts new file mode 100644 index 0000000..5949292 --- /dev/null +++ b/test/generated/full/seaQuotes/seaQuotes.queries.ts @@ -0,0 +1,71 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { SeaQuotesAcl } from "./seaQuotes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { SeaQuotesModels } from "./seaQuotes.models"; +import { SeaQuotesApi } from "./seaQuotes.api"; + +export namespace SeaQuotesQueries { +export const moduleName = QueryModule.SeaQuotes; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/sea-quote", officeId, quoteId] as const, +}; + +/** + * Query `useGet` + * @summary Get sea quote by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(SeaQuotesAcl.canUseGet({ officeId } )); + return SeaQuotesApi.get(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update sea quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { SeaQuotesModels.UpdateSeaQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(SeaQuotesAcl.canUseUpdate({ officeId } )); + return SeaQuotesApi.update(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.get(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/shippingInstructions/shippingInstructions.acl.ts b/test/generated/full/shippingInstructions/shippingInstructions.acl.ts new file mode 100644 index 0000000..2eae90a --- /dev/null +++ b/test/generated/full/shippingInstructions/shippingInstructions.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ShippingInstructionsAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useDeleteOfficesPositionsShippingInstructionsById` mutation ability. For global ability, omit the object parameter. + * @description Delete shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsShippingInstructionsById` mutation + */ +export const canUseDeleteOfficesPositionsShippingInstructionsById = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `usePreview` query or `usePreviewMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreview` query or `usePreviewMutation` mutation + */ +export const canUsePreview = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +} diff --git a/test/generated/full/shippingInstructions/shippingInstructions.api.ts b/test/generated/full/shippingInstructions/shippingInstructions.api.ts new file mode 100644 index 0000000..e535ba2 --- /dev/null +++ b/test/generated/full/shippingInstructions/shippingInstructions.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ShippingInstructionsModels } from "./shippingInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ShippingInstructionsApi { +export const create = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions`, + undefined, + config + ) +}; +export const get = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + config + ) +}; +export const update = (officeId: string, positionId: string, id: string, data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), + config + ) +}; +export const deleteOfficesPositionsShippingInstructionsById = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + undefined, + config + ) +}; +export const preview = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generate = (officeId: string, positionId: string, id: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/shippingInstructions/shippingInstructions.models.ts b/test/generated/full/shippingInstructions/shippingInstructions.models.ts new file mode 100644 index 0000000..7f8248c --- /dev/null +++ b/test/generated/full/shippingInstructions/shippingInstructions.models.ts @@ -0,0 +1,510 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ShippingInstructionsModels { +/** + * EnsDeclarationEnumSchema + * @type { enum } + * @description ENS declaration + */ +export const EnsDeclarationEnumSchema = z.enum(["Carrier", "Self"]); +export type EnsDeclarationEnum = z.infer; +export const EnsDeclarationEnum = EnsDeclarationEnumSchema.enum; + +/** + * IssuedHouseBillsEnumSchema + * @type { enum } + * @description Issued house bills + */ +export const IssuedHouseBillsEnumSchema = z.enum(["None", "One", "Multiple"]); +export type IssuedHouseBillsEnum = z.infer; +export const IssuedHouseBillsEnum = IssuedHouseBillsEnumSchema.enum; + +/** + * WoodDeclarationEnumSchema + * @type { enum } + * @description Wood declaration + */ +export const WoodDeclarationEnumSchema = z.enum(["NoWood", "TreatedAndCertified", "NotTreatedAndNotCertified", "Processed"]); +export type WoodDeclarationEnum = z.infer; +export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; + +/** + * ShippingInstructionsPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } addressLine1 + * @property { string } addressLine2 + * @property { string } city + * @property { string } postalCode + * @property { string } state + * @property { string } countryCode + * @property { string } contactName + * @property { string } contactPhone + * @property { string } contactEmail + */ +export const ShippingInstructionsPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), addressLine1: z.string(), addressLine2: z.string(), city: z.string(), postalCode: z.string(), state: z.string(), countryCode: z.string(), contactName: z.string(), contactPhone: z.string(), contactEmail: z.string() }).readonly(); +export type ShippingInstructionsPartnerResponseDto = z.infer; + +/** + * ShippingInstructionsGeneralDetailsDtoSchema + * @type { object } + * @property { ShippingInstructionsPartnerResponseDto } shipper + * @property { ShippingInstructionsPartnerResponseDto } consignee + * @property { ShippingInstructionsPartnerResponseDto } freightForwarder + * @property { ShippingInstructionsPartnerResponseDto } notifyParty + * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty1 + * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty2 + * @property { ShippingInstructionsPartnerResponseDto } contractParty + * @property { ShippingInstructionsPartnerResponseDto } manufacturer + * @property { ShippingInstructionsPartnerResponseDto } consolidator + * @property { ShippingInstructionsPartnerResponseDto } importer + * @property { ShippingInstructionsPartnerResponseDto } warehouseKeeper + */ +export const ShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: ShippingInstructionsPartnerResponseDtoSchema, consignee: ShippingInstructionsPartnerResponseDtoSchema, freightForwarder: ShippingInstructionsPartnerResponseDtoSchema, notifyParty: ShippingInstructionsPartnerResponseDtoSchema, additionalNotifyParty1: ShippingInstructionsPartnerResponseDtoSchema, additionalNotifyParty2: ShippingInstructionsPartnerResponseDtoSchema, contractParty: ShippingInstructionsPartnerResponseDtoSchema, manufacturer: ShippingInstructionsPartnerResponseDtoSchema, consolidator: ShippingInstructionsPartnerResponseDtoSchema, importer: ShippingInstructionsPartnerResponseDtoSchema, warehouseKeeper: ShippingInstructionsPartnerResponseDtoSchema }).readonly(); +export type ShippingInstructionsGeneralDetailsDto = z.infer; + +/** + * ShippingInstructionsLocationResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } code + * @property { string } countryCode + * @property { string } eta + * @property { string } vessel + * @property { string } voyage + */ +export const ShippingInstructionsLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), code: z.string(), countryCode: z.string(), eta: z.iso.datetime({ offset: true }), vessel: z.string(), voyage: z.string() }).readonly(); +export type ShippingInstructionsLocationResponseDto = z.infer; + +/** + * SIMoveTypeEnumSchema + * @type { enum } + */ +export const SIMoveTypeEnumSchema = z.enum(["DoorToDoor", "DoorToPort", "PortToDoor", "PortToPort"]); +export type SIMoveTypeEnum = z.infer; +export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; + +/** + * ShippingInstructionsTransportDtoSchema + * @type { object } + * @property { string } vessel + * @property { string } voyage + * @property { string } imo + * @property { ShippingInstructionsLocationResponseDto } placeOfReceipt + * @property { ShippingInstructionsLocationResponseDto } portOfLoading + * @property { ShippingInstructionsLocationResponseDto } portOfDischarge + * @property { ShippingInstructionsLocationResponseDto } placeOfDelivery + * @property { SIMoveTypeEnum } moveType + * @property { string } shipmentType + */ +export const ShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string(), voyage: z.string(), imo: z.string(), placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema, portOfLoading: ShippingInstructionsLocationResponseDtoSchema, portOfDischarge: ShippingInstructionsLocationResponseDtoSchema, placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema, moveType: SIMoveTypeEnumSchema, shipmentType: z.string() }).readonly(); +export type ShippingInstructionsTransportDto = z.infer; + +/** + * ShippingInstructionsHazardousDtoSchema + * @type { object } + * @property { string } IMOClass + * @property { string } UNDGNumber + * @property { string } contact + */ +export const ShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string(), UNDGNumber: z.string(), contact: z.string() }).readonly(); +export type ShippingInstructionsHazardousDto = z.infer; + +/** + * ShippingInstructionsPackageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { number } quantity + * @property { string } packageType + * @property { string } packageTypeDescription + * @property { string } packageDescription + * @property { string } hsCode + * @property { number } volume + * @property { number } grossWeight + * @property { string } caseMarks + * @property { ShippingInstructionsHazardousDto } hazardous + * @property { string } ncmCodes + * @property { string } cusCode + */ +export const ShippingInstructionsPackageResponseDtoSchema = z.object({ id: z.string(), quantity: z.number(), packageType: z.string(), packageTypeDescription: z.string(), packageDescription: z.string(), hsCode: z.string(), volume: z.number(), grossWeight: z.number(), caseMarks: z.string(), hazardous: ShippingInstructionsHazardousDtoSchema, ncmCodes: z.string(), cusCode: z.string() }).readonly(); +export type ShippingInstructionsPackageResponseDto = z.infer; + +/** + * ShippingInstructionsCargoResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } transportUnitNumber + * @property { string } transportUnitType + * @property { string } transportUnitDescription + * @property { string } containerSupplier + * @property { number } grossWeight + * @property { number } tare + * @property { number } volume + * @property { string } seal1 + * @property { string } seal2 + * @property { string } woodDeclaration + * @property { ShippingInstructionsPackageResponseDto[] } packages + */ +export const ShippingInstructionsCargoResponseDtoSchema = z.object({ id: z.string().nullish(), transportUnitNumber: z.string().nullish(), transportUnitType: z.string().nullish(), transportUnitDescription: z.string().nullish(), containerSupplier: z.string().nullish(), grossWeight: z.number().nullish(), tare: z.number().nullish(), volume: z.number().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), woodDeclaration: WoodDeclarationEnumSchema.nullish(), packages: z.array(ShippingInstructionsPackageResponseDtoSchema).readonly() }).readonly(); +export type ShippingInstructionsCargoResponseDto = z.infer; + +/** + * ShippingInstructionsHeaderDtoSchema + * @type { object } + * @property { string } name + * @property { string } nameSuffix + * @property { number } versionNumber + * @property { string } shippingInstructionNumber + * @property { string } carrierScac + * @property { string } carrierBookingNumber + */ +export const ShippingInstructionsHeaderDtoSchema = z.object({ name: z.string(), nameSuffix: z.string().nullish(), versionNumber: z.number(), shippingInstructionNumber: z.string().nullish(), carrierScac: z.string().nullish(), carrierBookingNumber: z.string().nullish() }).readonly(); +export type ShippingInstructionsHeaderDto = z.infer; + +/** + * ShippingInstructionsReferencesDtoSchema + * @type { object } + * @property { string } shipperReference + * @property { string } forwarderReference + * @property { string } transactionReferenceNumber + * @property { string } blReferenceNumber + * @property { string } uniqueConsignmentReference + * @property { string } purchaseOrderNumber + * @property { string } contractReferenceNumber + * @property { string } rucNumber + * @property { string } consigneeOrderNumber + * @property { string } invoiceReferenceNumber + * @property { string } letterOfCreditReference + * @property { string } customsHouseBrokerReference + * @property { string } fmcNumber + * @property { string } exportLicenseNumber + */ +export const ShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string(), forwarderReference: z.string(), transactionReferenceNumber: z.string(), blReferenceNumber: z.string(), uniqueConsignmentReference: z.string(), purchaseOrderNumber: z.string(), contractReferenceNumber: z.string(), rucNumber: z.string(), consigneeOrderNumber: z.string(), invoiceReferenceNumber: z.string(), letterOfCreditReference: z.string(), customsHouseBrokerReference: z.string(), fmcNumber: z.string(), exportLicenseNumber: z.string() }).readonly(); +export type ShippingInstructionsReferencesDto = z.infer; + +/** + * ShippingInstructionsCustomsComplianceDtoSchema + * @type { object } + * @property { string } shipperTaxId + * @property { string } shipperEORI + * @property { string } consigneeTaxId + * @property { string } consigneeEORI + * @property { string } notifyPartyTaxId + * @property { string } notifyPartyEORI + */ +export const ShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string(), shipperEORI: z.string(), consigneeTaxId: z.string(), consigneeEORI: z.string(), notifyPartyTaxId: z.string(), notifyPartyEORI: z.string() }).readonly(); +export type ShippingInstructionsCustomsComplianceDto = z.infer; + +/** + * ShippingInstructionsIcs2DtoSchema + * @type { object } + * @property { boolean } goodsDeliveredInEu + * @property { string } ensDeclaration + * @property { string } issuedHouseBills + */ +export const ShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean(), ensDeclaration: EnsDeclarationEnumSchema, issuedHouseBills: IssuedHouseBillsEnumSchema }).readonly(); +export type ShippingInstructionsIcs2Dto = z.infer; + +/** + * ShippingInstructionsCargoIdentificationNumbersDtoSchema + * @type { object } + * @property { string } PCINNumber + * @property { string } CSNNumber + * @property { string } MCINNumber + */ +export const ShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string(), CSNNumber: z.string(), MCINNumber: z.string() }).readonly(); +export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer; + +/** + * ShippingInstructionsControlTotalsDtoSchema + * @type { object } + * @property { number } totalNumberOfContainers + * @property { number } totalNumberOfPackages + * @property { number } totalShipmentWeight + * @property { number } totalShipmentVolume + */ +export const ShippingInstructionsControlTotalsDtoSchema = z.object({ totalNumberOfContainers: z.number(), totalNumberOfPackages: z.number(), totalShipmentWeight: z.number(), totalShipmentVolume: z.number() }).readonly(); +export type ShippingInstructionsControlTotalsDto = z.infer; + +/** + * FreightChargesDtoSchema + * @type { object } + * @property { string } freightPayer + * @property { string } freightTerm + */ +export const FreightChargesDtoSchema = z.object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }).readonly(); +export type FreightChargesDto = z.infer; + +/** + * ShippingInstructionsShippersDeclaredValueDtoSchema + * @type { object } + * @property { string } currency + * @property { number } shipperDeclaredValue + */ +export const ShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string(), shipperDeclaredValue: z.number() }).readonly(); +export type ShippingInstructionsShippersDeclaredValueDto = z.infer; + +/** + * ShippingInstructionsNotificationEmailsDtoSchema + * @type { object } + * @property { string } siRequestorEmails + */ +export const ShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string() }).readonly(); +export type ShippingInstructionsNotificationEmailsDto = z.infer; + +/** + * ShippingInstructionsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } name + * @property { string } nameSuffix + * @property { string } date + * @property { string } createdAt + * @property { string } updatedAt + * @property { number } versionNumber + * @property { ShippingInstructionsHeaderDto } header + * @property { ShippingInstructionsGeneralDetailsDto } generalDetails + * @property { ShippingInstructionsReferencesDto } references + * @property { ShippingInstructionsTransportDto } transport + * @property { ShippingInstructionsCustomsComplianceDto } customsCompliance + * @property { ShippingInstructionsIcs2Dto } ics2 + * @property { ShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers + * @property { ShippingInstructionsCargoResponseDto[] } cargo + * @property { ShippingInstructionsControlTotalsDto } controlTotals + * @property { FreightChargesDto } freightCharges + * @property { ShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue + * @property { ShippingInstructionsNotificationEmailsDto } notificationEmails + * @property { string } defaultFileName + */ +export const ShippingInstructionsResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), date: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), versionNumber: z.number(), header: ShippingInstructionsHeaderDtoSchema, generalDetails: ShippingInstructionsGeneralDetailsDtoSchema, references: ShippingInstructionsReferencesDtoSchema, transport: ShippingInstructionsTransportDtoSchema, customsCompliance: ShippingInstructionsCustomsComplianceDtoSchema, ics2: ShippingInstructionsIcs2DtoSchema, cargoIdentificationNumbers: ShippingInstructionsCargoIdentificationNumbersDtoSchema, cargo: z.array(ShippingInstructionsCargoResponseDtoSchema).readonly().nullish(), controlTotals: ShippingInstructionsControlTotalsDtoSchema, freightCharges: FreightChargesDtoSchema, shippersDeclaredValue: ShippingInstructionsShippersDeclaredValueDtoSchema, notificationEmails: ShippingInstructionsNotificationEmailsDtoSchema, defaultFileName: z.string() }).readonly(); +export type ShippingInstructionsResponseDto = z.infer; + +/** + * UpdateShippingInstructionsPartnerDtoSchema + * @type { object } + * @property { string } id Partner id + * @property { string } name Partner name + * @property { string } addressLine1 Address line 1 + * @property { string } addressLine2 Address line 2 + * @property { string } city City + * @property { string } postalCode Postal code + * @property { string } state State + * @property { string } countryCode Country code + * @property { string } taxId Tax ID + * @property { string } contactName Contact name + * @property { string } contactPhone Contact phone + * @property { string } contactEmail Contact email + */ +export const UpdateShippingInstructionsPartnerDtoSchema = z.object({ id: z.string().describe("Partner id"), name: z.string().describe("Partner name"), addressLine1: z.string().describe("Address line 1"), addressLine2: z.string().describe("Address line 2"), city: z.string().describe("City"), postalCode: z.string().describe("Postal code"), state: z.string().describe("State"), countryCode: z.string().describe("Country code"), taxId: z.string().describe("Tax ID"), contactName: z.string().describe("Contact name"), contactPhone: z.string().describe("Contact phone"), contactEmail: z.string().describe("Contact email") }).readonly(); +export type UpdateShippingInstructionsPartnerDto = z.infer; + +/** + * UpdateShippingInstructionsGeneralDetailsDtoSchema + * @type { object } + * @property { UpdateShippingInstructionsPartnerDto } shipper Shipper + * @property { UpdateShippingInstructionsPartnerDto } consignee Consignee + * @property { UpdateShippingInstructionsPartnerDto } freightForwarder Freight forwarder + * @property { UpdateShippingInstructionsPartnerDto } notifyParty Notify party + * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty1 Additional notify party 1 + * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty2 Additional notify party 2 + * @property { UpdateShippingInstructionsPartnerDto } contractParty Contract party + * @property { UpdateShippingInstructionsPartnerDto } manufacturer Manufacturer + * @property { UpdateShippingInstructionsPartnerDto } consolidator Consolidator + * @property { UpdateShippingInstructionsPartnerDto } importer Importer + * @property { UpdateShippingInstructionsPartnerDto } warehouseKeeper Warehouse keeper + */ +export const UpdateShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: UpdateShippingInstructionsPartnerDtoSchema.describe("Shipper"), consignee: UpdateShippingInstructionsPartnerDtoSchema.describe("Consignee"), freightForwarder: UpdateShippingInstructionsPartnerDtoSchema.describe("Freight forwarder"), notifyParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Notify party"), additionalNotifyParty1: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 1"), additionalNotifyParty2: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 2"), contractParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Contract party"), manufacturer: UpdateShippingInstructionsPartnerDtoSchema.describe("Manufacturer"), consolidator: UpdateShippingInstructionsPartnerDtoSchema.describe("Consolidator"), importer: UpdateShippingInstructionsPartnerDtoSchema.describe("Importer"), warehouseKeeper: UpdateShippingInstructionsPartnerDtoSchema.describe("Warehouse keeper") }).readonly(); +export type UpdateShippingInstructionsGeneralDetailsDto = z.infer; + +/** + * UpdateShippingInstructionsLocationDtoSchema + * @type { object } + * @property { string } id Location id + * @property { string } name Location name + * @property { string } code Location code + * @property { string } countryCode Country code + */ +export const UpdateShippingInstructionsLocationDtoSchema = z.object({ id: z.string().describe("Location id"), name: z.string().describe("Location name"), code: z.string().describe("Location code"), countryCode: z.string().describe("Country code") }).readonly(); +export type UpdateShippingInstructionsLocationDto = z.infer; + +/** + * UpdateShippingInstructionsTransportDtoSchema + * @type { object } + * @property { string } vessel Vessel + * @property { string } voyage Voyage + * @property { string } imo IMO + * @property { UpdateShippingInstructionsLocationDto } placeOfReceipt Place of receipt + * @property { UpdateShippingInstructionsLocationDto } portOfLoading Port of loading + * @property { UpdateShippingInstructionsLocationDto } portOfDischarge Port of discharge + * @property { UpdateShippingInstructionsLocationDto } placeOfDelivery Place of delivery + * @property { SIMoveTypeEnum } moveType Move type + * @property { string } shipmentType Shipment type + */ +export const UpdateShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string().describe("Vessel"), voyage: z.string().describe("Voyage"), imo: z.string().describe("IMO"), placeOfReceipt: UpdateShippingInstructionsLocationDtoSchema.describe("Place of receipt"), portOfLoading: UpdateShippingInstructionsLocationDtoSchema.describe("Port of loading"), portOfDischarge: UpdateShippingInstructionsLocationDtoSchema.describe("Port of discharge"), placeOfDelivery: UpdateShippingInstructionsLocationDtoSchema.describe("Place of delivery"), moveType: SIMoveTypeEnumSchema.describe("Move type"), shipmentType: z.string().describe("Shipment type") }).readonly(); +export type UpdateShippingInstructionsTransportDto = z.infer; + +/** + * UpdateShippingInstructionsHazardousDtoSchema + * @type { object } + * @property { string } IMOClass IMO class + * @property { string } UNDGNumber UNDG number + * @property { string } contact Contact + */ +export const UpdateShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string().describe("IMO class"), UNDGNumber: z.string().describe("UNDG number"), contact: z.string().describe("Contact") }).readonly(); +export type UpdateShippingInstructionsHazardousDto = z.infer; + +/** + * UpdateShippingInstructionsPackageDtoSchema + * @type { object } + * @property { string } id Package id + * @property { number } quantity Quantity + * @property { string } packageType Package type + * @property { string } packageTypeDescription Package type description + * @property { string } packageDescription Package description + * @property { string } hsCode HS code + * @property { number } volume Volume + * @property { number } grossWeight Gross weight + * @property { string } caseMarks Case marks + * @property { UpdateShippingInstructionsHazardousDto } hazardous Hazardous + * @property { string } ncmCodes NCM codes + * @property { string } cusCode CUS code + */ +export const UpdateShippingInstructionsPackageDtoSchema = z.object({ id: z.string().describe("Package id"), quantity: z.number().describe("Quantity"), packageType: z.string().describe("Package type"), packageTypeDescription: z.string().describe("Package type description"), packageDescription: z.string().describe("Package description"), hsCode: z.string().describe("HS code"), volume: z.number().describe("Volume"), grossWeight: z.number().describe("Gross weight"), caseMarks: z.string().describe("Case marks"), hazardous: UpdateShippingInstructionsHazardousDtoSchema.describe("Hazardous"), ncmCodes: z.string().describe("NCM codes"), cusCode: z.string().describe("CUS code") }).readonly(); +export type UpdateShippingInstructionsPackageDto = z.infer; + +/** + * UpdateShippingInstructionsCargoDtoSchema + * @type { object } + * @property { string } id Cargo id + * @property { string } transportUnitNumber Transport unit number + * @property { string } transportUnitType Transport unit type + * @property { string } transportUnitDescription Transport unit description + * @property { string } containerSupplier Container supplier + * @property { number } grossWeight Gross weight + * @property { number } tare Tare + * @property { number } volume Volume + * @property { string } seal1 Seal 1 + * @property { string } seal2 Seal 2 + * @property { string } woodDeclaration Wood declaration + * @property { UpdateShippingInstructionsPackageDto[] } packages Packages + */ +export const UpdateShippingInstructionsCargoDtoSchema = z.object({ id: z.string().describe("Cargo id"), transportUnitNumber: z.string().describe("Transport unit number"), transportUnitType: z.string().describe("Transport unit type"), transportUnitDescription: z.string().describe("Transport unit description"), containerSupplier: z.string().describe("Container supplier"), grossWeight: z.number().describe("Gross weight"), tare: z.number().describe("Tare"), volume: z.number().describe("Volume"), seal1: z.string().describe("Seal 1"), seal2: z.string().describe("Seal 2"), woodDeclaration: WoodDeclarationEnumSchema.describe("Wood declaration"), packages: z.array(UpdateShippingInstructionsPackageDtoSchema).readonly().describe("Packages") }).readonly(); +export type UpdateShippingInstructionsCargoDto = z.infer; + +/** + * UpdateShippingInstructionsHeaderDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } nameSuffix Name suffix + * @property { number } versionNumber Version number + * @property { string } shippingInstructionNumber Shipping instruction number + * @property { string } carrierScac Carrier SCAC + * @property { string } carrierBookingNumber Carrier booking number + */ +export const UpdateShippingInstructionsHeaderDtoSchema = z.object({ name: z.string().describe("Name"), nameSuffix: z.string().describe("Name suffix"), versionNumber: z.number().describe("Version number"), shippingInstructionNumber: z.string().describe("Shipping instruction number"), carrierScac: z.string().describe("Carrier SCAC"), carrierBookingNumber: z.string().describe("Carrier booking number") }).readonly(); +export type UpdateShippingInstructionsHeaderDto = z.infer; + +/** + * UpdateShippingInstructionsReferencesDtoSchema + * @type { object } + * @property { string } shipperReference Shipper reference + * @property { string } forwarderReference Forwarder reference + * @property { string } transactionReferenceNumber Transaction reference number + * @property { string } blReferenceNumber BL reference number + * @property { string } uniqueConsignmentReference Unique consignment reference + * @property { string } purchaseOrderNumber Purchase order number + * @property { string } contractReferenceNumber Contract reference number + * @property { string } rucNumber RUC number + * @property { string } consigneeOrderNumber Consignee order number + * @property { string } invoiceReferenceNumber Invoice reference number + * @property { string } letterOfCreditReference Letter of credit reference + * @property { string } customsHouseBrokerReference Customs house broker reference + * @property { string } fmcNumber FMC number + * @property { string } exportLicenseNumber Export license number + */ +export const UpdateShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string().describe("Shipper reference"), forwarderReference: z.string().describe("Forwarder reference"), transactionReferenceNumber: z.string().describe("Transaction reference number"), blReferenceNumber: z.string().describe("BL reference number"), uniqueConsignmentReference: z.string().describe("Unique consignment reference"), purchaseOrderNumber: z.string().describe("Purchase order number"), contractReferenceNumber: z.string().describe("Contract reference number"), rucNumber: z.string().describe("RUC number"), consigneeOrderNumber: z.string().describe("Consignee order number"), invoiceReferenceNumber: z.string().describe("Invoice reference number"), letterOfCreditReference: z.string().describe("Letter of credit reference"), customsHouseBrokerReference: z.string().describe("Customs house broker reference"), fmcNumber: z.string().describe("FMC number"), exportLicenseNumber: z.string().describe("Export license number") }).readonly(); +export type UpdateShippingInstructionsReferencesDto = z.infer; + +/** + * UpdateShippingInstructionsCustomsComplianceDtoSchema + * @type { object } + * @property { string } shipperTaxId Shipper tax ID + * @property { string } shipperEORI Shipper EORI + * @property { string } consigneeTaxId Consignee tax ID + * @property { string } consigneeEORI Consignee EORI + * @property { string } notifyPartyTaxId Notify party tax ID + * @property { string } notifyPartyEORI Notify party EORI + */ +export const UpdateShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string().describe("Shipper tax ID"), shipperEORI: z.string().describe("Shipper EORI"), consigneeTaxId: z.string().describe("Consignee tax ID"), consigneeEORI: z.string().describe("Consignee EORI"), notifyPartyTaxId: z.string().describe("Notify party tax ID"), notifyPartyEORI: z.string().describe("Notify party EORI") }).readonly(); +export type UpdateShippingInstructionsCustomsComplianceDto = z.infer; + +/** + * UpdateShippingInstructionsIcs2DtoSchema + * @type { object } + * @property { boolean } goodsDeliveredInEu Goods delivered in EU + * @property { string } ensDeclaration ENS declaration + * @property { string } issuedHouseBills Issued house bills + */ +export const UpdateShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean().describe("Goods delivered in EU"), ensDeclaration: EnsDeclarationEnumSchema.describe("ENS declaration"), issuedHouseBills: IssuedHouseBillsEnumSchema.describe("Issued house bills") }).readonly(); +export type UpdateShippingInstructionsIcs2Dto = z.infer; + +/** + * UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema + * @type { object } + * @property { string } PCINNumber PCIN number + * @property { string } CSNNumber CSN number + * @property { string } MCINNumber MCIN number + */ +export const UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string().describe("PCIN number"), CSNNumber: z.string().describe("CSN number"), MCINNumber: z.string().describe("MCIN number") }).readonly(); +export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer; + +/** + * UpdateFreightChargesDtoSchema + * @type { object } + * @property { string } freightPayer + * @property { string } freightTerm + */ +export const UpdateFreightChargesDtoSchema = z.object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }).readonly(); +export type UpdateFreightChargesDto = z.infer; + +/** + * UpdateShippingInstructionsShippersDeclaredValueDtoSchema + * @type { object } + * @property { string } currency Currency + * @property { number } shipperDeclaredValue Shipper declared value + */ +export const UpdateShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string().describe("Currency"), shipperDeclaredValue: z.number().describe("Shipper declared value") }).readonly(); +export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer; + +/** + * UpdateShippingInstructionsNotificationEmailsDtoSchema + * @type { object } + * @property { string } siRequestorEmails SI requestor emails + */ +export const UpdateShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string().describe("SI requestor emails") }).readonly(); +export type UpdateShippingInstructionsNotificationEmailsDto = z.infer; + +/** + * UpdateShippingInstructionsRequestDtoSchema + * @type { object } + * @property { string } date Date + * @property { UpdateShippingInstructionsHeaderDto } header Header + * @property { UpdateShippingInstructionsGeneralDetailsDto } generalDetails General details + * @property { UpdateShippingInstructionsReferencesDto } references References + * @property { UpdateShippingInstructionsTransportDto } transport Transport + * @property { UpdateShippingInstructionsCustomsComplianceDto } customsCompliance Customs compliance + * @property { UpdateShippingInstructionsIcs2Dto } ics2 ICS2 + * @property { UpdateShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers Cargo identification numbers + * @property { UpdateShippingInstructionsCargoDto[] } cargo Cargo + * @property { UpdateFreightChargesDto } freightCharges + * @property { UpdateShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue Shipper's declared value + * @property { UpdateShippingInstructionsNotificationEmailsDto } notificationEmails Notification emails + */ +export const UpdateShippingInstructionsRequestDtoSchema = z.object({ date: z.iso.datetime({ offset: true }).describe("Date"), header: UpdateShippingInstructionsHeaderDtoSchema.describe("Header"), generalDetails: UpdateShippingInstructionsGeneralDetailsDtoSchema.describe("General details"), references: UpdateShippingInstructionsReferencesDtoSchema.describe("References"), transport: UpdateShippingInstructionsTransportDtoSchema.describe("Transport"), customsCompliance: UpdateShippingInstructionsCustomsComplianceDtoSchema.describe("Customs compliance"), ics2: UpdateShippingInstructionsIcs2DtoSchema.describe("ICS2"), cargoIdentificationNumbers: UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema.describe("Cargo identification numbers"), cargo: z.array(UpdateShippingInstructionsCargoDtoSchema).readonly().describe("Cargo"), freightCharges: UpdateFreightChargesDtoSchema, shippersDeclaredValue: UpdateShippingInstructionsShippersDeclaredValueDtoSchema.describe("Shipper's declared value"), notificationEmails: UpdateShippingInstructionsNotificationEmailsDtoSchema.describe("Notification emails") }).readonly(); +export type UpdateShippingInstructionsRequestDto = z.infer; + +} diff --git a/test/generated/full/shippingInstructions/shippingInstructions.queries.ts b/test/generated/full/shippingInstructions/shippingInstructions.queries.ts new file mode 100644 index 0000000..a3a9034 --- /dev/null +++ b/test/generated/full/shippingInstructions/shippingInstructions.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ShippingInstructionsAcl } from "./shippingInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ShippingInstructionsModels } from "./shippingInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ShippingInstructionsApi } from "./shippingInstructions.api"; + +export namespace ShippingInstructionsQueries { +export const moduleName = QueryModule.ShippingInstructions; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id", officeId, positionId, id] as const, + preview: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id/preview", officeId, positionId, id] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create shipping instructions + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId } )); + return ShippingInstructionsApi.create(officeId, positionId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGet` + * @summary Get shipping instructions data + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId, id), + queryFn: () => { + checkAcl(ShippingInstructionsAcl.canUseGet({ officeId } )); + return ShippingInstructionsApi.get(officeId, positionId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update shipping instructions + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { ShippingInstructionsModels.UpdateShippingInstructionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Shipping instructions updated successfully + * @statusCodes [200, 401, 404] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id, data }) => { + checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId } )); + return ShippingInstructionsApi.update(officeId, positionId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, id } = variables; + const updateKeys = [keys.get(officeId, positionId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteOfficesPositionsShippingInstructionsById` + * @summary Delete shipping instructions + * @permission Requires `canUseDeleteOfficesPositionsShippingInstructionsById` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Shipping instructions deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteOfficesPositionsShippingInstructionsById = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id }) => { + checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId } )); + return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreview` - recommended when file should be cached + * @summary Preview shipping instructions document + * @permission Requires `canUsePreview` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreview = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.preview(officeId, positionId, id), + queryFn: () => { + checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); + return ShippingInstructionsApi.preview(officeId, positionId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewMutation` - recommended when file should not be cached + * @summary Preview shipping instructions document + * @permission Requires `canUsePreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id }) => { + checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); + return ShippingInstructionsApi.preview(officeId, positionId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, id } = variables; + const updateKeys = [keys.preview(officeId, positionId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerate` + * @summary Generate shipping instructions document + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id, data }) => { + checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId } )); + return ShippingInstructionsApi.generate(officeId, positionId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/terminals/terminals.acl.ts b/test/generated/full/terminals/terminals.acl.ts new file mode 100644 index 0000000..d29c8a0 --- /dev/null +++ b/test/generated/full/terminals/terminals.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace TerminalsAcl { +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Terminal" +] as AbilityTuple<"Create", "Terminal">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Terminal" +] as AbilityTuple<"Read", "Terminal">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Terminal" +] as AbilityTuple<"Read", "Terminal">; + +/** + * Use for `useGetById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( +) => [ + "Read", + "Terminal" +] as AbilityTuple<"Read", "Terminal">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Terminal" +] as AbilityTuple<"Update", "Terminal">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Terminal" +] as AbilityTuple<"Archive", "Terminal">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Unarchive", + "Terminal" +] as AbilityTuple<"Unarchive", "Terminal">; + +} diff --git a/test/generated/full/terminals/terminals.api.ts b/test/generated/full/terminals/terminals.api.ts new file mode 100644 index 0000000..31b5d76 --- /dev/null +++ b/test/generated/full/terminals/terminals.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { TerminalsModels } from "./terminals.models"; + +export namespace TerminalsApi { +export const create = (data: TerminalsModels.CreateTerminalRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals`, + ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), + config + ) +}; +export const paginate = (limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, + `/terminals`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, + `/terminals/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals/${id}`, + config + ) +}; +export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals/${id}`, + ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/terminals/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/terminals/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/terminals/terminals.configs.ts b/test/generated/full/terminals/terminals.configs.ts new file mode 100644 index 0000000..36d2f2c --- /dev/null +++ b/test/generated/full/terminals/terminals.configs.ts @@ -0,0 +1,146 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { TerminalsModels } from "./terminals.models"; +import { CommonModels } from "@/data/common/common.models"; +import { TerminalsQueries } from "./terminals.queries"; +import { TerminalsAcl } from "./terminals.acl"; + +export namespace TerminalsConfigs { +export const terminalsConfig = { + meta: { + title: "Terminals", + }, + readAll: { + acl: TerminalsAcl.canUsePaginate, + schema: TerminalsModels.TerminalResponseDTOSchema, + paginated: TerminalsQueries.usePaginate, + infinite: TerminalsQueries.usePaginateInfinite, + filters: { + schema: TerminalsModels.TerminalPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: TerminalsModels.TerminalPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + type: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: TerminalsModels.TerminalResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + name: true, + type: true, + airport: true, + port: true, + archived: true, + shortName: true, + address: true, + additionalInformation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: TerminalsModels.TerminalsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: TerminalsAcl.canUseGetById, + schema: TerminalsModels.TerminalResponseDTOSchema, + query: TerminalsQueries.useGetById, + }, + create: { + acl: TerminalsAcl.canUseCreate, + schema: TerminalsModels.CreateTerminalRequestDTOSchema, + mutation: TerminalsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: TerminalsModels.CreateTerminalRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + type: true, + portId: true, + airportId: true, + street: true, + secondaryStreet: true, + zip: true, + district: true, + cityId: true, + countryId: true, + additionalInformation: true, + }, + }, +}) + }, + update: { + acl: TerminalsAcl.canUseUpdate, + schema: TerminalsModels.UpdateTerminalRequestDTOSchema, + mutation: TerminalsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: TerminalsModels.UpdateTerminalRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + type: true, + portId: true, + airportId: true, + street: true, + secondaryStreet: true, + zip: true, + district: true, + cityId: true, + countryId: true, + additionalInformation: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: TerminalsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: TerminalsQueries.usePaginateLabels, + infinite: TerminalsQueries.usePaginateLabelsInfinite, + filters: { + schema: TerminalsModels.TerminalLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: TerminalsModels.TerminalLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/terminals/terminals.models.ts b/test/generated/full/terminals/terminals.models.ts new file mode 100644 index 0000000..a543664 --- /dev/null +++ b/test/generated/full/terminals/terminals.models.ts @@ -0,0 +1,196 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace TerminalsModels { +/** + * TerminalTypeSchema + * @type { enum } + */ +export const TerminalTypeSchema = z.enum(["port", "airport"]); +export type TerminalType = z.infer; +export const TerminalType = TerminalTypeSchema.enum; + +/** + * CreateTerminalRequestDTOSchema + * @type { object } + * @property { string } matchCode Unique identifier code for the terminal + * @property { string } shortName Optional short name for the terminal + * @property { string } name Full name of the terminal + * @property { TerminalType } type Type of the terminal + * @property { string } portId ID of associated port, required if type is port + * @property { string } airportId ID of associated airport, required if type is airport + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP / Postal code + * @property { string } district District + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } additionalInformation Additional information + */ +export const CreateTerminalRequestDTOSchema = z.object({ matchCode: z.string().describe("Unique identifier code for the terminal"), shortName: z.string().describe("Optional short name for the terminal").nullish(), name: z.string().describe("Full name of the terminal"), type: TerminalTypeSchema.describe("Type of the terminal"), portId: z.string().describe("ID of associated port, required if type is port").nullish(), airportId: z.string().describe("ID of associated airport, required if type is airport").nullish(), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street").nullish(), zip: z.string().describe("ZIP / Postal code"), district: z.string().describe("District").nullish(), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), additionalInformation: z.string().describe("Additional information").nullish() }).readonly(); +export type CreateTerminalRequestDTO = z.infer; + +/** + * TerminalCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const TerminalCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type TerminalCityDto = z.infer; + +/** + * TerminalCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const TerminalCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type TerminalCountryDto = z.infer; + +/** + * TerminalAddressDTOSchema + * @type { object } + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP/Postal code + * @property { TerminalCityDto } city + * @property { string } district District name + * @property { TerminalCountryDto } country + */ +export const TerminalAddressDTOSchema = z.object({ street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street").nullish(), zip: z.string().describe("ZIP/Postal code"), city: TerminalCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: TerminalCountryDtoSchema.nullish() }).readonly(); +export type TerminalAddressDTO = z.infer; + +/** + * AirportReferenceDTOSchema + * @type { object } + * @property { string } id Unique identifier of the airport + * @property { string } name Name of the airport + */ +export const AirportReferenceDTOSchema = z.object({ id: z.string().describe("Unique identifier of the airport"), name: z.string().describe("Name of the airport") }).readonly(); +export type AirportReferenceDTO = z.infer; + +/** + * PortReferenceDTOSchema + * @type { object } + * @property { string } id Unique identifier of the port + * @property { string } name Name of the port + */ +export const PortReferenceDTOSchema = z.object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port") }).readonly(); +export type PortReferenceDTO = z.infer; + +/** + * TerminalEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type TerminalEmployeeDTO = z.infer; + +/** + * TerminalResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the terminal + * @property { string } matchCode Match code for the terminal + * @property { string } name Name of the terminal + * @property { TerminalType } type Type of the terminal + * @property { AirportReferenceDTO } airport Associated airport information if terminal type is airport + * @property { PortReferenceDTO } port Associated port information if terminal type is port + * @property { boolean } archived Archived status of the terminal + * @property { string } shortName Short name of the terminal + * @property { TerminalAddressDTO } address Address of the terminal + * @property { string } additionalInformation Additional information + * @property { string } createdById + * @property { TerminalEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { TerminalEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const TerminalResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the terminal"), matchCode: z.string().describe("Match code for the terminal"), name: z.string().describe("Name of the terminal"), type: TerminalTypeSchema.describe("Type of the terminal").nullish(), airport: AirportReferenceDTOSchema.describe("Associated airport information if terminal type is airport").nullish(), port: PortReferenceDTOSchema.describe("Associated port information if terminal type is port").nullish(), archived: z.boolean().describe("Archived status of the terminal"), shortName: z.string().describe("Short name of the terminal").nullish(), address: TerminalAddressDTOSchema.describe("Address of the terminal").nullish(), additionalInformation: z.string().describe("Additional information").nullish(), createdById: z.string().nullish(), createdBy: TerminalEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: TerminalEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type TerminalResponseDTO = z.infer; + +/** + * UpdateTerminalRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code for the terminal + * @property { string } shortName Updated short name + * @property { string } name Updated name + * @property { TerminalType } type Type of the terminal + * @property { string } portId ID of associated port, required if type is port + * @property { string } airportId ID of associated airport, required if type is airport + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP / Postal code + * @property { string } district District + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } additionalInformation Additional information + */ +export const UpdateTerminalRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code for the terminal"), shortName: z.string().describe("Updated short name"), name: z.string().describe("Updated name"), type: TerminalTypeSchema.describe("Type of the terminal"), portId: z.string().describe("ID of associated port, required if type is port"), airportId: z.string().describe("ID of associated airport, required if type is airport"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street"), zip: z.string().describe("ZIP / Postal code"), district: z.string().describe("District"), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), additionalInformation: z.string().describe("Additional information") }).readonly(); +export type UpdateTerminalRequestDTO = z.infer; + +/** + * TerminalPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter terminals by matchCode, shortName, or name + * @property { boolean } archived + * @property { string } type + */ +export const TerminalPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter terminals by matchCode, shortName, or name"), archived: z.boolean(), type: TerminalTypeSchema }).readonly(); +export type TerminalPaginationFilterDto = z.infer; + +/** + * TerminalLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const TerminalLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type TerminalLabelFilterDto = z.infer; + +/** + * TerminalsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const TerminalsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type TerminalsPaginateOrderParamEnum = z.infer; +export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSchema.enum; + +/** + * TerminalsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { TerminalResponseDTO[] } items + */ +export const TerminalsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(TerminalResponseDTOSchema).readonly() }).readonly().shape }); +export type TerminalsPaginateResponse = z.infer; + +/** + * TerminalsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const TerminalsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type TerminalsPaginateLabelsOrderParamEnum = z.infer; +export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * TerminalsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const TerminalsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type TerminalsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/terminals/terminals.queries.ts b/test/generated/full/terminals/terminals.queries.ts new file mode 100644 index 0000000..bec7227 --- /dev/null +++ b/test/generated/full/terminals/terminals.queries.ts @@ -0,0 +1,261 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { TerminalsAcl } from "./terminals.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { TerminalsModels } from "./terminals.models"; +import { TerminalsApi } from "./terminals.api"; + +export namespace TerminalsQueries { +export const moduleName = QueryModule.Terminals; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string) => [...keys.all, "/terminals", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string) => [...keys.all, "/terminals/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getById: (id: string) => [...keys.all, "/terminals/:id", id] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a new terminal + * @permission Requires `canUseCreate` ability + * @param { TerminalsModels.CreateTerminalRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(TerminalsAcl.canUseCreate()); + return TerminalsApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Paginate Terminals + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(TerminalsAcl.canUsePaginate()); + return TerminalsApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Terminals + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(TerminalsAcl.canUsePaginate()); + return TerminalsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate terminals with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(TerminalsAcl.canUsePaginateLabels()); + return TerminalsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate terminals with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(TerminalsAcl.canUsePaginateLabels()); + return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetById` + * @summary Get terminal details by ID + * @permission Requires `canUseGetById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(id), + queryFn: () => { + checkAcl(TerminalsAcl.canUseGetById()); + return TerminalsApi.getById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update terminal details + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { TerminalsModels.UpdateTerminalRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(TerminalsAcl.canUseUpdate()); + return TerminalsApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.getById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive a terminal + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(TerminalsAcl.canUseArchive()); + return TerminalsApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive a terminal + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(TerminalsAcl.canUseUnarchive()); + return TerminalsApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/useCrossTabQueryInvalidation.ts b/test/generated/full/useCrossTabQueryInvalidation.ts new file mode 100644 index 0000000..d74d707 --- /dev/null +++ b/test/generated/full/useCrossTabQueryInvalidation.ts @@ -0,0 +1,40 @@ +import type { QueryClient, QueryKey } from "@tanstack/react-query"; + +const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; + +/** + * Broadcasts a query invalidation event to all other open tabs via localStorage. + * + * @param queryKeys - An array of query keys to invalidate (array of arrays). + * + * NOTE: The `storage` event only fires in *other* tabs — the calling tab + * must invalidate its own queryClient separately if needed. + */ +export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { + localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); +}; + +/** + * Registers a one-time global `storage` event listener that reacts to + * cross-tab invalidation broadcasts. Safe to call from multiple hooks — + * only the first call sets up the listener. + */ +let isListenerSetUp = false; + +export const setupCrossTabListener = (queryClient: QueryClient) => { + if (isListenerSetUp) return; + isListenerSetUp = true; + + window.addEventListener("storage", (e: StorageEvent) => { + if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; + + try { + const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; + for (const queryKey of keys) { + queryClient.invalidateQueries({ queryKey }); + } + } catch { + // Ignore malformed payloads + } + }); +}; diff --git a/test/generated/full/useMutationEffects.ts b/test/generated/full/useMutationEffects.ts new file mode 100644 index 0000000..ed61406 --- /dev/null +++ b/test/generated/full/useMutationEffects.ts @@ -0,0 +1,95 @@ +import { useCallback, useEffect } from "react"; + +import { QueryKey, useQueryClient } from "@tanstack/react-query"; +import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; +import { QueryModule } from "./queryModules"; +import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; + +export interface MutationEffectsOptions { + invalidateCurrentModule?: boolean; + crossTabInvalidation?: boolean; + invalidationMap?: InvalidationMap; + invalidateModules?: QueryModule[]; + invalidateKeys?: QueryKey[]; + preferUpdate?: boolean; +} + +export interface UseMutationEffectsProps { + currentModule: QueryModule; +} + +export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { + const queryClient = useQueryClient(); + const config = OpenApiQueryConfig.useConfig(); + + useEffect(() => { + if (!config.crossTabInvalidation) return; + setupCrossTabListener(queryClient); + }, [queryClient, config.crossTabInvalidation]); + + const runMutationEffects = useCallback( + async ( + data: TData, + variables: TVariables, + options: MutationEffectsOptions = {}, + updateKeys?: QueryKey[], + ) => { + const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; + const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; + const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; + + const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => + keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); + const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => + prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); + const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); + + const shouldInvalidateQuery = (queryKey: QueryKey) => { + const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); + if (shouldUpdate && isUpdateKey) { + return false; + } + + const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; + const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); + const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + const isMappedKey = + !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + + return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; + }; + + const invalidatedQueryKeys: QueryKey[] = []; + + queryClient.invalidateQueries({ + predicate: ({ queryKey }) => { + const shouldInvalidate = shouldInvalidateQuery(queryKey); + + if (shouldInvalidate && config.crossTabInvalidation) { + invalidatedQueryKeys.push([...queryKey]); + } + + return shouldInvalidate; + }, + }); + + if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { + broadcastQueryInvalidation(invalidatedQueryKeys); + } + + if (shouldUpdate && updateKeys) { + updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); + } + }, + [ + queryClient, + currentModule, + config.preferUpdate, + config.invalidateCurrentModule, + config.invalidationMap, + config.crossTabInvalidation, + ], + ); + + return { runMutationEffects }; +} diff --git a/test/generated/full/userActivity/userActivity.api.ts b/test/generated/full/userActivity/userActivity.api.ts new file mode 100644 index 0000000..affc18b --- /dev/null +++ b/test/generated/full/userActivity/userActivity.api.ts @@ -0,0 +1,20 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { UserActivityModels } from "./userActivity.models"; + +export namespace UserActivityApi { +export const get = (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, + `/offices/${officeId}/${entityType}/${entityId}/activity`, + { + ...config, + params: { + activeThresholdMinutes: ZodExtended.parse(z.number().gte(1).describe("Active threshold in minutes").nullish(), activeThresholdMinutes, { type: "query", name: "activeThresholdMinutes" }), + }, + } + ) +}; +} diff --git a/test/generated/full/userActivity/userActivity.models.ts b/test/generated/full/userActivity/userActivity.models.ts new file mode 100644 index 0000000..5a79039 --- /dev/null +++ b/test/generated/full/userActivity/userActivity.models.ts @@ -0,0 +1,64 @@ +import { z } from "zod"; + +export namespace UserActivityModels { +/** + * ActivityTypeEnumSchema + * @type { enum } + */ +export const ActivityTypeEnumSchema = z.enum(["View", "Modify"]); +export type ActivityTypeEnum = z.infer; +export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; + +/** + * UserSectionActivityDtoSchema + * @type { object } + * @property { string } section Section name + * @property { ActivityTypeEnum } activityType Type of activity + * @property { string } lastSeen Last seen timestamp + */ +export const UserSectionActivityDtoSchema = z.object({ section: z.string().describe("Section name"), activityType: ActivityTypeEnumSchema.describe("Type of activity"), lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp") }).readonly(); +export type UserSectionActivityDto = z.infer; + +/** + * ActiveUserDtoSchema + * @type { object } + * @property { string } userId User ID + * @property { string } firstName User first name + * @property { string } lastName User last name + * @property { string } userAvatar User avatar URL + * @property { UserSectionActivityDto } section User section activity + * @property { string } lastSeen Last seen timestamp + * @property { boolean } isCurrentlyActive Is currently active + */ +export const ActiveUserDtoSchema = z.object({ userId: z.string().describe("User ID"), firstName: z.string().describe("User first name"), lastName: z.string().describe("User last name"), userAvatar: z.string().describe("User avatar URL").nullish(), section: UserSectionActivityDtoSchema.describe("User section activity"), lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), isCurrentlyActive: z.boolean().describe("Is currently active") }).readonly(); +export type ActiveUserDto = z.infer; + +/** + * ActivityEntityTypeEnumSchema + * @type { enum } + */ +export const ActivityEntityTypeEnumSchema = z.enum(["Position", "Invoice", "BusinessPartner", "Quote"]); +export type ActivityEntityTypeEnum = z.infer; +export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; + +/** + * ActivityMetadataDtoSchema + * @type { object } + * @property { number } totalActiveUsers Total number of active users + * @property { string } entityId Entity ID + * @property { ActivityEntityTypeEnum } entityType Entity type + * @property { number } activeThresholdMinutes Active threshold in minutes + */ +export const ActivityMetadataDtoSchema = z.object({ totalActiveUsers: z.number().describe("Total number of active users"), entityId: z.string().describe("Entity ID"), entityType: ActivityEntityTypeEnumSchema.describe("Entity type"), activeThresholdMinutes: z.number().describe("Active threshold in minutes") }).readonly(); +export type ActivityMetadataDto = z.infer; + +/** + * UserActivityResponseDtoSchema + * @type { object } + * @property { ActiveUserDto[] } activeUsers List of active users + * @property { ActivityMetadataDto } metadata Activity metadata + */ +export const UserActivityResponseDtoSchema = z.object({ activeUsers: z.array(ActiveUserDtoSchema).readonly().describe("List of active users"), metadata: ActivityMetadataDtoSchema.describe("Activity metadata") }).readonly(); +export type UserActivityResponseDto = z.infer; + +} diff --git a/test/generated/full/userActivity/userActivity.queries.ts b/test/generated/full/userActivity/userActivity.queries.ts new file mode 100644 index 0000000..4e54389 --- /dev/null +++ b/test/generated/full/userActivity/userActivity.queries.ts @@ -0,0 +1,36 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { UserActivityApi } from "./userActivity.api"; + +export namespace UserActivityQueries { +export const moduleName = QueryModule.UserActivity; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number) => [...keys.all, "/offices/:officeId/:entityType/:entityId/activity", officeId, entityType, entityId, activeThresholdMinutes] as const, +}; + +/** + * Query `useGet` + * @summary Get user activity for an entity + * @param { string } object.officeId Path parameter + * @param { string } object.entityType Path parameter + * @param { string } object.entityId Path parameter + * @param { number } object.activeThresholdMinutes Query parameter. Active threshold in minutes. Minimum: `1` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, entityType, entityId, activeThresholdMinutes }: { officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), + queryFn: () => + UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes, config), + ...options, + }); +}; + +} diff --git a/test/generated/full/vatRules/vatRules.acl.ts b/test/generated/full/vatRules/vatRules.acl.ts new file mode 100644 index 0000000..827096c --- /dev/null +++ b/test/generated/full/vatRules/vatRules.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace VatRulesAcl { +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "VatRule" +] as AbilityTuple<"Read", "VatRule">; + +/** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( +) => [ + "Read", + "VatRule" +] as AbilityTuple<"Read", "VatRule">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "VatRule" +] as AbilityTuple<"Create", "VatRule">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "VatRule" +] as AbilityTuple<"Read", "VatRule">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "VatRule" +] as AbilityTuple<"Update", "VatRule">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Update", + "VatRule" +] as AbilityTuple<"Update", "VatRule">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Update", + "VatRule" +] as AbilityTuple<"Update", "VatRule">; + +} diff --git a/test/generated/full/vatRules/vatRules.api.ts b/test/generated/full/vatRules/vatRules.api.ts new file mode 100644 index 0000000..4280101 --- /dev/null +++ b/test/generated/full/vatRules/vatRules.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { VatRulesModels } from "./vatRules.models"; + +export namespace VatRulesApi { +export const paginateLabels = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, + `/vat-rules/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: VatRulesModels.VatRulesListResponseSchema }, + `/vat-rules`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules`, + ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}`, + config + ) +}; +export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}`, + ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/vatRules/vatRules.configs.ts b/test/generated/full/vatRules/vatRules.configs.ts new file mode 100644 index 0000000..092a685 --- /dev/null +++ b/test/generated/full/vatRules/vatRules.configs.ts @@ -0,0 +1,151 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { VatRulesModels } from "./vatRules.models"; +import { CommonModels } from "@/data/common/common.models"; +import { VatRulesQueries } from "./vatRules.queries"; +import { VatRulesAcl } from "./vatRules.acl"; + +export namespace VatRulesConfigs { +export const vatRulesConfig = { + meta: { + title: "Vat Rules", + }, + readAll: { + acl: VatRulesAcl.canUseList, + schema: VatRulesModels.VatRuleResponseDTOSchema, + paginated: VatRulesQueries.useList, + infinite: VatRulesQueries.useListInfinite, + filters: { + schema: VatRulesModels.VatRuleFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: VatRulesModels.VatRuleFilterDtoSchema, + options: { + inputs: { + matchcode: true, + name: true, + type: true, + officeId: true, + archived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: VatRulesModels.VatRuleResponseDTOSchema, + options: { + columns: { + id: true, + matchcode: true, + name: true, + vatPercentage: true, + vatNumber: true, + noTax: true, + type: true, + archived: true, + isReverseCharge: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + officeId: true, + office: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + sortable: VatRulesModels.VatRulesListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: VatRulesAcl.canUseFindById, + schema: VatRulesModels.VatRuleResponseDTOSchema, + query: VatRulesQueries.useFindById, + }, + create: { + acl: VatRulesAcl.canUseCreate, + schema: VatRulesModels.CreateVatRuleRequestDTOSchema, + mutation: VatRulesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: VatRulesModels.CreateVatRuleRequestDTOSchema, + options: { + inputs: { + matchcode: true, + name: true, + noTax: true, + vatPercentage: true, + vatNumber: true, + type: true, + officeId: true, + isReverseCharge: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + }, +}) + }, + update: { + acl: VatRulesAcl.canUseUpdate, + schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, + mutation: VatRulesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, + options: { + inputs: { + matchcode: true, + name: true, + noTax: true, + vatPercentage: true, + vatNumber: true, + type: true, + officeId: true, + isReverseCharge: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: VatRulesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: VatRulesQueries.usePaginateLabels, + infinite: VatRulesQueries.usePaginateLabelsInfinite, + filters: { + schema: VatRulesModels.VatRuleFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: VatRulesModels.VatRuleFilterDtoSchema, + options: { + inputs: { + matchcode: true, + name: true, + type: true, + officeId: true, + archived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/vatRules/vatRules.models.ts b/test/generated/full/vatRules/vatRules.models.ts new file mode 100644 index 0000000..6b65ef4 --- /dev/null +++ b/test/generated/full/vatRules/vatRules.models.ts @@ -0,0 +1,146 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace VatRulesModels { +/** + * VatRuleTypeEnumSchema + * @type { enum } + */ +export const VatRuleTypeEnumSchema = z.enum(["Outgoing", "Incoming"]); +export type VatRuleTypeEnum = z.infer; +export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; + +/** + * VatRuleFilterDtoSchema + * @type { object } + * @property { string } matchcode Matchcode to filter by + * @property { string } name Name to filter by + * @property { VatRuleTypeEnum } type + * @property { string } officeId Office ID to filter by + * @property { boolean } archived Filter by archived status + * @property { string } search Search to filter by + */ +export const VatRuleFilterDtoSchema = z.object({ matchcode: z.string().describe("Matchcode to filter by"), name: z.string().describe("Name to filter by"), type: VatRuleTypeEnumSchema, officeId: z.string().describe("Office ID to filter by"), archived: z.boolean().describe("Filter by archived status"), search: z.string().describe("Search to filter by") }).readonly(); +export type VatRuleFilterDto = z.infer; + +/** + * VatRuleEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type VatRuleEmployeeDTO = z.infer; + +/** + * VatRuleOfficeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type VatRuleOfficeDTO = z.infer; + +/** + * VatRuleResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchcode + * @property { string } name + * @property { number } vatPercentage + * @property { number } vatNumber VAT rule reference number + * @property { boolean } noTax + * @property { VatRuleTypeEnum } type + * @property { boolean } archived + * @property { boolean } isReverseCharge + * @property { string } createdById + * @property { VatRuleEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { VatRuleEmployeeDTO } updatedBy + * @property { string } updatedAt + * @property { string } officeId + * @property { VatRuleOfficeDTO } office + * @property { string } bookkeepingId + * @property { string } bookkeepingTargetAccountNumber + */ +export const VatRuleResponseDTOSchema = z.object({ id: z.string(), matchcode: z.string(), name: z.string(), vatPercentage: z.number(), vatNumber: z.number().describe("VAT rule reference number").nullish(), noTax: z.boolean().nullish(), type: VatRuleTypeEnumSchema, archived: z.boolean(), isReverseCharge: z.boolean(), createdById: z.string().nullish(), createdBy: VatRuleEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: VatRuleEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), officeId: z.string(), office: VatRuleOfficeDTOSchema.nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }).readonly(); +export type VatRuleResponseDTO = z.infer; + +/** + * CreateVatRuleRequestDTOSchema + * @type { object } + * @property { string } matchcode Unique matchcode for the VAT rule + * @property { string } name Name of the VAT rule + * @property { boolean } noTax + * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` + * @property { number } vatNumber VAT rule reference number + * @property { VatRuleTypeEnum } type Type of VAT rule + * @property { string } officeId Office ID + * @property { boolean } isReverseCharge Is reverse charge VAT rule + * @property { string } bookkeepingId Bookkeeping ID + * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number + */ +export const CreateVatRuleRequestDTOSchema = z.object({ matchcode: z.string().describe("Unique matchcode for the VAT rule"), name: z.string().describe("Name of the VAT rule"), noTax: z.boolean().nullish(), vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), vatNumber: z.number().describe("VAT rule reference number").nullish(), type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), officeId: z.string().describe("Office ID"), isReverseCharge: z.boolean().describe("Is reverse charge VAT rule").nullish(), bookkeepingId: z.string().describe("Bookkeeping ID").nullish(), bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullish() }).readonly(); +export type CreateVatRuleRequestDTO = z.infer; + +/** + * UpdateVatRuleRequestDTOSchema + * @type { object } + * @property { string } matchcode Unique matchcode for the VAT rule + * @property { string } name Name of the VAT rule + * @property { boolean } noTax + * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` + * @property { number } vatNumber VAT rule reference number. Minimum: `0` + * @property { VatRuleTypeEnum } type Type of VAT rule + * @property { string } officeId Office ID + * @property { boolean } isReverseCharge Is reverse charge VAT rule + * @property { string } bookkeepingId Bookkeeping ID + * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number + */ +export const UpdateVatRuleRequestDTOSchema = z.object({ matchcode: z.string().describe("Unique matchcode for the VAT rule"), name: z.string().describe("Name of the VAT rule"), noTax: z.boolean(), vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), vatNumber: z.number().gte(0).describe("VAT rule reference number").nullable(), type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), officeId: z.string().describe("Office ID"), isReverseCharge: z.boolean().describe("Is reverse charge VAT rule"), bookkeepingId: z.string().describe("Bookkeeping ID").nullable(), bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullable() }).readonly(); +export type UpdateVatRuleRequestDTO = z.infer; + +/** + * VatRulesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const VatRulesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type VatRulesPaginateLabelsOrderParamEnum = z.infer; +export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * VatRulesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const VatRulesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type VatRulesPaginateLabelsResponse = z.infer; + +/** + * VatRulesListOrderParamEnumSchema + * @type { enum } + */ +export const VatRulesListOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type VatRulesListOrderParamEnum = z.infer; +export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; + +/** + * VatRulesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { VatRuleResponseDTO[] } items + */ +export const VatRulesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(VatRuleResponseDTOSchema).readonly() }).readonly().shape }); +export type VatRulesListResponse = z.infer; + +} diff --git a/test/generated/full/vatRules/vatRules.queries.ts b/test/generated/full/vatRules/vatRules.queries.ts new file mode 100644 index 0000000..e0cd0f9 --- /dev/null +++ b/test/generated/full/vatRules/vatRules.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { VatRulesAcl } from "./vatRules.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { VatRulesModels } from "./vatRules.models"; +import { VatRulesApi } from "./vatRules.api"; + +export namespace VatRulesQueries { +export const moduleName = QueryModule.VatRules; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", "infinite", limit, order, filter, cursor] as const, + list: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/vat-rules/:id", id] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate VAT rule labels (id and matchcode only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(VatRulesAcl.canUsePaginateLabels()); + return VatRulesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate VAT rule labels (id and matchcode only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(VatRulesAcl.canUsePaginateLabels()); + return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useList` + * @summary List VAT rules + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(VatRulesAcl.canUseList()); + return VatRulesApi.list(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List VAT rules + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(VatRulesAcl.canUseList()); + return VatRulesApi.list(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new VAT rule + * @permission Requires `canUseCreate` ability + * @param { VatRulesModels.CreateVatRuleRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(VatRulesAcl.canUseCreate()); + return VatRulesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get VAT rule by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(VatRulesAcl.canUseFindById()); + return VatRulesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update VAT rule by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { VatRulesModels.UpdateVatRuleRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(VatRulesAcl.canUseUpdate()); + return VatRulesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive VAT rule + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(VatRulesAcl.canUseArchive()); + return VatRulesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive VAT rule + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(VatRulesAcl.canUseUnarchive()); + return VatRulesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/warehouses/warehouses.acl.ts b/test/generated/full/warehouses/warehouses.acl.ts new file mode 100644 index 0000000..65a76ba --- /dev/null +++ b/test/generated/full/warehouses/warehouses.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace WarehousesAcl { +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Warehouse" +] as AbilityTuple<"Create", "Warehouse">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Warehouse" +] as AbilityTuple<"Read", "Warehouse">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Warehouse" +] as AbilityTuple<"Read", "Warehouse">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Warehouse" +] as AbilityTuple<"Read", "Warehouse">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Warehouse" +] as AbilityTuple<"Update", "Warehouse">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Warehouse" +] as AbilityTuple<"Archive", "Warehouse">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "Warehouse" +] as AbilityTuple<"Archive", "Warehouse">; + +} diff --git a/test/generated/full/warehouses/warehouses.api.ts b/test/generated/full/warehouses/warehouses.api.ts new file mode 100644 index 0000000..b2e2dc5 --- /dev/null +++ b/test/generated/full/warehouses/warehouses.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WarehousesModels } from "./warehouses.models"; + +export namespace WarehousesApi { +export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses`, + ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), + config + ) +}; +export const paginate = (limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, + `/warehouses`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, + `/warehouses/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses/${id}`, + config + ) +}; +export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses/${id}`, + ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/warehouses/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/warehouses/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/full/warehouses/warehouses.configs.ts b/test/generated/full/warehouses/warehouses.configs.ts new file mode 100644 index 0000000..d53c994 --- /dev/null +++ b/test/generated/full/warehouses/warehouses.configs.ts @@ -0,0 +1,141 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { WarehousesModels } from "./warehouses.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WarehousesQueries } from "./warehouses.queries"; +import { WarehousesAcl } from "./warehouses.acl"; + +export namespace WarehousesConfigs { +export const warehousesConfig = { + meta: { + title: "Warehouses", + }, + readAll: { + acl: WarehousesAcl.canUsePaginate, + schema: WarehousesModels.WarehouseResponseDTOSchema, + paginated: WarehousesQueries.usePaginate, + infinite: WarehousesQueries.usePaginateInfinite, + filters: { + schema: WarehousesModels.WarehouseFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WarehousesModels.WarehouseFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: WarehousesModels.WarehouseResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + city: true, + country: true, + district: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: WarehousesModels.WarehousesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: WarehousesAcl.canUseFindById, + schema: WarehousesModels.WarehouseResponseDTOSchema, + query: WarehousesQueries.useFindById, + }, + create: { + acl: WarehousesAcl.canUseCreate, + schema: WarehousesModels.CreateWarehouseRequestDTOSchema, + mutation: WarehousesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: WarehousesModels.CreateWarehouseRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) + }, + update: { + acl: WarehousesAcl.canUseUpdate, + schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, + mutation: WarehousesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: WarehousesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: WarehousesQueries.usePaginateLabels, + infinite: WarehousesQueries.usePaginateLabelsInfinite, + filters: { + schema: WarehousesModels.WarehouseLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WarehousesModels.WarehouseLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/full/warehouses/warehouses.models.ts b/test/generated/full/warehouses/warehouses.models.ts new file mode 100644 index 0000000..0c5b059 --- /dev/null +++ b/test/generated/full/warehouses/warehouses.models.ts @@ -0,0 +1,152 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WarehousesModels { +/** + * WarehouseCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type WarehouseCityDto = z.infer; + +/** + * WarehouseCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const WarehouseCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type WarehouseCountryDto = z.infer; + +/** + * WarehouseEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type WarehouseEmployeeDTO = z.infer; + +/** + * WarehouseResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { WarehouseCityDto } city + * @property { WarehouseCountryDto } country + * @property { string } district + * @property { boolean } archived + * @property { string } createdById + * @property { WarehouseEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { WarehouseEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const WarehouseResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: WarehouseCityDtoSchema.nullish(), country: WarehouseCountryDtoSchema.nullish(), district: z.string().nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: WarehouseEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: WarehouseEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type WarehouseResponseDTO = z.infer; + +/** + * CreateWarehouseRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } countryId + * @property { string } district + */ +export const CreateWarehouseRequestDTOSchema = z.object({ name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), cityId: z.string().nullish(), countryId: z.string().nullish(), district: z.string().nullish() }).readonly(); +export type CreateWarehouseRequestDTO = z.infer; + +/** + * WarehouseLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const WarehouseLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type WarehouseLabelFilterDto = z.infer; + +/** + * WarehouseFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived Filter by archived status + */ +export const WarehouseFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean().describe("Filter by archived status") }).readonly(); +export type WarehouseFilterDto = z.infer; + +/** + * UpdateWarehouseRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } countryId + * @property { string } district + */ +export const UpdateWarehouseRequestDTOSchema = z.object({ name: z.string(), shortName: z.string(), additionalInformation: z.string(), matchCode: z.string(), street: z.string(), secondaryStreet: z.string(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string() }).readonly(); +export type UpdateWarehouseRequestDTO = z.infer; + +/** + * WarehousesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const WarehousesPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type WarehousesPaginateOrderParamEnum = z.infer; +export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnumSchema.enum; + +/** + * WarehousesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { WarehouseResponseDTO[] } items + */ +export const WarehousesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WarehouseResponseDTOSchema).readonly() }).readonly().shape }); +export type WarehousesPaginateResponse = z.infer; + +/** + * WarehousesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const WarehousesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type WarehousesPaginateLabelsOrderParamEnum = z.infer; +export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * WarehousesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const WarehousesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type WarehousesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/full/warehouses/warehouses.queries.ts b/test/generated/full/warehouses/warehouses.queries.ts new file mode 100644 index 0000000..667e346 --- /dev/null +++ b/test/generated/full/warehouses/warehouses.queries.ts @@ -0,0 +1,261 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WarehousesAcl } from "./warehouses.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WarehousesModels } from "./warehouses.models"; +import { WarehousesApi } from "./warehouses.api"; + +export namespace WarehousesQueries { +export const moduleName = QueryModule.Warehouses; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string) => [...keys.all, "/warehouses", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/warehouses/:id", id] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create warehouse + * @permission Requires `canUseCreate` ability + * @param { WarehousesModels.CreateWarehouseRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(WarehousesAcl.canUseCreate()); + return WarehousesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Get paginated warehouses + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WarehousesAcl.canUsePaginate()); + return WarehousesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated warehouses + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WarehousesAcl.canUsePaginate()); + return WarehousesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate warehouse labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WarehousesAcl.canUsePaginateLabels()); + return WarehousesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate warehouse labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WarehousesAcl.canUsePaginateLabels()); + return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get warehouse by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(WarehousesAcl.canUseFindById()); + return WarehousesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update warehouse + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { WarehousesModels.UpdateWarehouseRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(WarehousesAcl.canUseUpdate()); + return WarehousesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive warehouse + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(WarehousesAcl.canUseArchive()); + return WarehousesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive warehouse + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(WarehousesAcl.canUseUnarchive()); + return WarehousesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/workingDocuments/workingDocuments.acl.ts b/test/generated/full/workingDocuments/workingDocuments.acl.ts new file mode 100644 index 0000000..344f8c6 --- /dev/null +++ b/test/generated/full/workingDocuments/workingDocuments.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsAcl { +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List working documents + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument", object) : "WorkingDocument" +] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get working document by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument", object) : "WorkingDocument" +] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocuments/workingDocuments.api.ts b/test/generated/full/workingDocuments/workingDocuments.api.ts new file mode 100644 index 0000000..bef7393 --- /dev/null +++ b/test/generated/full/workingDocuments/workingDocuments.api.ts @@ -0,0 +1,31 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; + +export namespace WorkingDocumentsApi { +export const list = (positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, + `/offices/${officeId}/positions/${positionId}/working-documents`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (positionId: string, id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, + config + ) +}; +} diff --git a/test/generated/full/workingDocuments/workingDocuments.configs.ts b/test/generated/full/workingDocuments/workingDocuments.configs.ts new file mode 100644 index 0000000..5e7d622 --- /dev/null +++ b/test/generated/full/workingDocuments/workingDocuments.configs.ts @@ -0,0 +1,55 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; +import { WorkingDocumentsQueries } from "./workingDocuments.queries"; +import { WorkingDocumentsAcl } from "./workingDocuments.acl"; + +export namespace WorkingDocumentsConfigs { +export const workingDocumentsConfig = { + meta: { + title: "Working Documents", + }, + readAll: { + acl: WorkingDocumentsAcl.canUseList, + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + paginated: WorkingDocumentsQueries.useList, + infinite: WorkingDocumentsQueries.useListInfinite, + filters: { + schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, + options: { + inputs: { + search: true, + type: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + name: true, + nameSuffix: true, + type: true, + referenceTable: true, + referenceId: true, + createdById: true, + createdAt: true, + createdBy: true, + }, + sortable: WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: WorkingDocumentsAcl.canUseFindById, + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + query: WorkingDocumentsQueries.useFindById, + }, +}; + +} diff --git a/test/generated/full/workingDocuments/workingDocuments.models.ts b/test/generated/full/workingDocuments/workingDocuments.models.ts new file mode 100644 index 0000000..1e946b4 --- /dev/null +++ b/test/generated/full/workingDocuments/workingDocuments.models.ts @@ -0,0 +1,70 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsModels { +/** + * TypeEnumSchema + * @type { enum } + * @description Working document type + */ +export const TypeEnumSchema = z.enum(["export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "shipping-instructions"]); +export type TypeEnum = z.infer; +export const TypeEnum = TypeEnumSchema.enum; + +/** + * WorkingDocumentCreatedByResponseDTOSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } name Employee name + */ +export const WorkingDocumentCreatedByResponseDTOSchema = z.object({ id: z.string().describe("Employee ID"), name: z.string().describe("Employee name").nullable() }).readonly(); +export type WorkingDocumentCreatedByResponseDTO = z.infer; + +/** + * WorkingDocumentResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } positionId Position ID + * @property { string } name Working document name + * @property { string } nameSuffix Working document name suffix + * @property { string } type Working document type + * @property { string } referenceTable Reference table + * @property { string } referenceId Reference ID + * @property { string } createdById Created by + * @property { string } createdAt Created at + * @property { WorkingDocumentCreatedByResponseDTO } createdBy Created by + */ +export const WorkingDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string().describe("Position ID"), name: z.string().describe("Working document name"), nameSuffix: z.string().describe("Working document name suffix").nullish(), type: TypeEnumSchema.describe("Working document type"), referenceTable: z.string().describe("Reference table"), referenceId: z.string().describe("Reference ID"), createdById: z.string().describe("Created by"), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), createdBy: WorkingDocumentCreatedByResponseDTOSchema.describe("Created by") }).readonly(); +export type WorkingDocumentResponseDTO = z.infer; + +/** + * WorkingDocumentFilterDtoSchema + * @type { object } + * @property { string } search + * @property { string } type + */ +export const WorkingDocumentFilterDtoSchema = z.object({ search: z.string(), type: z.string() }).readonly(); +export type WorkingDocumentFilterDto = z.infer; + +/** + * WorkingDocumentsListOrderParamEnumSchema + * @type { enum } + */ +export const WorkingDocumentsListOrderParamEnumSchema = z.enum(["NAME", "TYPE", "CREATED_AT", "UPDATED_AT"]); +export type WorkingDocumentsListOrderParamEnum = z.infer; +export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParamEnumSchema.enum; + +/** + * WorkingDocumentsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { WorkingDocumentResponseDTO[] } items + */ +export const WorkingDocumentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).readonly() }).readonly().shape }); +export type WorkingDocumentsListResponse = z.infer; + +} diff --git a/test/generated/full/workingDocuments/workingDocuments.queries.ts b/test/generated/full/workingDocuments/workingDocuments.queries.ts new file mode 100644 index 0000000..a6dbf68 --- /dev/null +++ b/test/generated/full/workingDocuments/workingDocuments.queries.ts @@ -0,0 +1,102 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsAcl } from "./workingDocuments.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; +import { WorkingDocumentsApi } from "./workingDocuments.api"; + +export namespace WorkingDocumentsQueries { +export const moduleName = QueryModule.WorkingDocuments; + +export const keys = { + all: [moduleName] as const, + list: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", positionId, officeId, limit, order, filter, page, cursor] as const, + listInfinite: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", "infinite", positionId, officeId, limit, order, filter, cursor] as const, + findById: (positionId: string, id: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents/:id", positionId, id, officeId] as const, +}; + +/** + * Query `useList` + * @summary List working documents + * @permission Requires `canUseList` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` + * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ positionId, officeId, limit, order, filter, page, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List working documents + * @permission Requires `canUseList` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` + * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ positionId, officeId, limit, order, filter, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get working document by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ positionId, id, officeId }: { positionId: string, id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(positionId, id, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId } )); + return WorkingDocumentsApi.findById(positionId, id, officeId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts new file mode 100644 index 0000000..80d3476 --- /dev/null +++ b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsAmsInstructionsAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Create", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `useGetAMSInstructionsData` query ability. For global ability, omit the object parameter. + * @description Read AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAMSInstructionsData` query + */ +export const canUseGetAMSInstructionsData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `useUpdateAMSInstructionsData` mutation ability. For global ability, omit the object parameter. + * @description Update AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateAMSInstructionsData` mutation + */ +export const canUseUpdateAMSInstructionsData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `useDeleteAMSInstructions` mutation ability. For global ability, omit the object parameter. + * @description Delete AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteAMSInstructions` mutation + */ +export const canUseDeleteAMSInstructions = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Delete", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation + */ +export const canUsePreviewAMSInstructions = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerateAMSInstructions` mutation ability. For global ability, omit the object parameter. + * @description Generate AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAMSInstructions` mutation + */ +export const canUseGenerateAMSInstructions = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts new file mode 100644 index 0000000..aa27c95 --- /dev/null +++ b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsAmsInstructionsApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions`, + undefined, + config + ) +}; +export const getAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + config + ) +}; +export const updateAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + undefined, + config + ) +}; +export const previewAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts new file mode 100644 index 0000000..75d8fd8 --- /dev/null +++ b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts @@ -0,0 +1,142 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsAmsInstructionsModels { +/** + * AMSInstructionsDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ +export const AMSInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }).readonly(); +export type AMSInstructionsDocumentPortResponseDTO = z.infer; + +/** + * AMSInstructionsDocumentCityResponseDTOSchema + * @type { object } + * @property { string } id ID of the city + * @property { string } name Name of the city + */ +export const AMSInstructionsDocumentCityResponseDTOSchema = z.object({ id: z.string().describe("ID of the city"), name: z.string().describe("Name of the city") }).readonly(); +export type AMSInstructionsDocumentCityResponseDTO = z.infer; + +/** + * AMSInstructionsDocumentSignedByResponseDTOSchema + * @type { object } + * @property { string } id ID of the employee + * @property { string } name Name of the employee + */ +export const AMSInstructionsDocumentSignedByResponseDTOSchema = z.object({ id: z.string().describe("ID of the employee"), name: z.string().describe("Name of the employee") }).readonly(); +export type AMSInstructionsDocumentSignedByResponseDTO = z.infer; + +/** + * AMSInstructionsDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const AMSInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * AMSInstructionsDocumentCargoDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { string } containerNumber Container number of the cargo + * @property { number } nrOfPackages Number of packages in the cargo + * @property { string } description Description of the cargo + * @property { number } weight Weight of the cargo + * @property { number } volume Volume of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + */ +export const AMSInstructionsDocumentCargoDTOSchema = z.object({ caseMarks: z.string().describe("Case marks of the cargo"), containerNumber: z.string().describe("Container number of the cargo"), nrOfPackages: z.number().describe("Number of packages in the cargo"), description: z.string().describe("Description of the cargo"), weight: z.number().describe("Weight of the cargo"), volume: z.number().describe("Volume of the cargo"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo") }).readonly(); +export type AMSInstructionsDocumentCargoDTO = z.infer; + +/** + * AMSInstructionsDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the AMS Instructions document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the AMS Instructions document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } date Date of the AMS Instructions document + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { CommonModels.EditorContentResponseDto } additionalAMSText Additional AMS text + * @property { string } principalName Principal name + * @property { string } blNumber Bill of lading number + * @property { string } vessel Vessel + * @property { AMSInstructionsDocumentPortResponseDTO } portOfLoading Port of loading + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfDelivery Port of delivery + * @property { AMSInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfIssue Place of issue + * @property { string } dateOfIssue Date of issue + * @property { AMSInstructionsDocumentSignedByResponseDTO } signedBy Signed by + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } deliveryBusinessPartner Delivery business partner + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfAcceptance Port of acceptance + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Also notify party + * @property { string } applyTo Apply to + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string[] } availableContainerNumbers Available container numbers + * @property { string[] } selectedContainerNumbers Selected container numbers + * @property { string[] } selectedContainerLabels Selected container labels + * @property { AMSInstructionsDocumentCargoDTO[] } cargo Cargo information + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + */ +export const AMSInstructionsDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the AMS Instructions document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the AMS Instructions document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), versionNumber: z.number().describe("Version number of the document"), additionalAMSText: CommonModels.EditorContentResponseDtoSchema.describe("Additional AMS text").nullish(), principalName: z.string().describe("Principal name").nullish(), blNumber: z.string().describe("Bill of lading number").nullish(), vessel: z.string().describe("Vessel").nullish(), portOfLoading: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of loading").nullish(), placeOfDelivery: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of delivery").nullish(), portOfDischarge: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), placeOfIssue: AMSInstructionsDocumentCityResponseDTOSchema.describe("Place of issue").nullish(), dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue").nullish(), signedBy: AMSInstructionsDocumentSignedByResponseDTOSchema.describe("Signed by").nullish(), deliveryBusinessPartner: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Delivery business partner").nullish(), placeOfAcceptance: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of acceptance").nullish(), consignee: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), shipper: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), notify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Notify party").nullish(), alsoNotify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Also notify party").nullish(), applyTo: z.string().describe("Apply to").nullish(), suppressWeight: z.boolean().describe("Whether to suppress weight information").nullish(), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information").nullish(), availableContainerNumbers: z.array(z.string()).readonly().describe("Available container numbers").nullish(), selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers").nullish(), selectedContainerLabels: z.array(z.string()).readonly().describe("Selected container labels").nullish(), cargo: z.array(AMSInstructionsDocumentCargoDTOSchema).readonly().describe("Cargo information").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at").nullish() }).readonly(); +export type AMSInstructionsDocumentResponseDTO = z.infer; + +/** + * UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateAMSInstructionsDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { CommonModels.EditorContentUpdateDto } additionalAMSText Additional AMS text + * @property { string } principalName Principal name + * @property { string } blNumber Bill of lading number + * @property { string } vessel Vessel + * @property { string } portOfLoadingId Port of loading id + * @property { string } placeOfDeliveryId Place of delivery id + * @property { string } portOfDischargeId Port of discharge id + * @property { string } placeOfIssueId Place of issue + * @property { string } dateOfIssue Date of issue + * @property { string } signedById Signed by employee ID + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } deliveryBusinessPartner Delivery business partner + * @property { string } placeOfAcceptanceId Port of acceptance + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party + * @property { string } applyTo Apply to + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string[] } selectedContainerNumbers Selected container numbers + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { string } date Date of the AMS Instructions document + */ +export const UpdateAMSInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), additionalAMSText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional AMS text"), principalName: z.string().describe("Principal name"), blNumber: z.string().describe("Bill of lading number"), vessel: z.string().describe("Vessel"), portOfLoadingId: z.string().describe("Port of loading id"), placeOfDeliveryId: z.string().describe("Place of delivery id"), portOfDischargeId: z.string().describe("Port of discharge id"), placeOfIssueId: z.string().describe("Place of issue"), dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue"), signedById: z.string().describe("Signed by employee ID"), deliveryBusinessPartner: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Delivery business partner"), placeOfAcceptanceId: z.string().describe("Port of acceptance"), consignee: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), shipper: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), notify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party"), alsoNotify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party"), applyTo: z.string().describe("Apply to"), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document") }).readonly(); +export type UpdateAMSInstructionsDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts new file mode 100644 index 0000000..aa81d88 --- /dev/null +++ b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsAmsInstructionsAcl } from "./workingDocumentsAmsInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsAmsInstructionsApi } from "./workingDocumentsAmsInstructions.api"; + +export namespace WorkingDocumentsAmsInstructionsQueries { +export const moduleName = QueryModule.WorkingDocumentsAmsInstructions; + +export const keys = { + all: [moduleName] as const, + getAMSInstructionsData: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId", positionId, amsInstructionsId, officeId] as const, + previewAMSInstructions: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId/preview", positionId, amsInstructionsId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an AMS Instructions document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetAMSInstructionsData` + * @summary Get AMS Instructions document data + * @permission Requires `canUseGetAMSInstructionsData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.amsInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetAMSInstructionsData = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData(positionId, amsInstructionsId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateAMSInstructionsData` + * @summary Update AMS Instructions document data + * @permission Requires `canUseUpdateAMSInstructionsData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateAMSInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData(positionId, amsInstructionsId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, amsInstructionsId, officeId } = variables; + const updateKeys = [keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteAMSInstructions` + * @summary Delete AMS Instructions document + * @permission Requires `canUseDeleteAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } AMS Instructions document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions(positionId, amsInstructionsId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewAMSInstructions` - recommended when file should be cached + * @summary Preview AMS Instructions document + * @permission Requires `canUsePreviewAMSInstructions` ability + * @param { string } object.positionId Path parameter + * @param { string } object.amsInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewAMSInstructions = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewAMSInstructionsMutation` - recommended when file should not be cached + * @summary Preview AMS Instructions document + * @permission Requires `canUsePreviewAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewAMSInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, amsInstructionsId, officeId } = variables; + const updateKeys = [keys.previewAMSInstructions(positionId, amsInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateAMSInstructions` + * @summary Generate AMS Instructions document + * @permission Requires `canUseGenerateAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions(positionId, amsInstructionsId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts new file mode 100644 index 0000000..a026b68 --- /dev/null +++ b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsBlInstructionsAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGetBlInstructionsData` query ability. For global ability, omit the object parameter. + * @description Read BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBlInstructionsData` query + */ +export const canUseGetBlInstructionsData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useUpdateBlInstructionsData` mutation ability. For global ability, omit the object parameter. + * @description Update BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBlInstructionsData` mutation + */ +export const canUseUpdateBlInstructionsData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useDeleteBlInstructions` mutation ability. For global ability, omit the object parameter. + * @description Delete BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBlInstructions` mutation + */ +export const canUseDeleteBlInstructions = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation + */ +export const canUsePreviewBlInstructions = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerateBlInstructions` mutation ability. For global ability, omit the object parameter. + * @description Generate BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateBlInstructions` mutation + */ +export const canUseGenerateBlInstructions = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate BL Instructions document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ +export const canUseGenerateDocumentEml = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts new file mode 100644 index 0000000..a9d7914 --- /dev/null +++ b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts @@ -0,0 +1,77 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsBlInstructionsApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions`, + undefined, + config + ) +}; +export const getBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + config + ) +}; +export const updateBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + undefined, + config + ) +}; +export const previewBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +export const generateDocumentEml = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts new file mode 100644 index 0000000..cbf7cdd --- /dev/null +++ b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts @@ -0,0 +1,260 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsBlInstructionsModels { +/** + * BlInstructionsDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { string } date Date + * @property { string } location Location + * @property { string } signer Siger + */ +export const BlInstructionsDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), date: z.iso.datetime({ offset: true }).describe("Date"), location: z.string().describe("Location"), signer: z.string().describe("Siger") }).readonly(); +export type BlInstructionsDocumentSettingsDtoDTO = z.infer; + +/** + * BlInstructionsDocumentCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ +export const BlInstructionsDocumentCountryResponseDTOSchema = z.object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }).readonly(); +export type BlInstructionsDocumentCountryResponseDTO = z.infer; + +/** + * BlInstructionsDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + * @property { string } eori EORI number of the business partner + * @property { string } vatNumber VAT number of the business partner + */ +export const BlInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner"), eori: z.string().describe("EORI number of the business partner"), vatNumber: z.string().describe("VAT number of the business partner") }).readonly(); +export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * BlInstructionsDocumentPlaceResponseDTOSchema + * @type { object } + * @property { string } id ID of the place + * @property { string } name Name of the place + */ +export const BlInstructionsDocumentPlaceResponseDTOSchema = z.object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }).readonly(); +export type BlInstructionsDocumentPlaceResponseDTO = z.infer; + +/** + * AllChargesEnumSchema + * @type { enum } + */ +export const AllChargesEnumSchema = z.enum(["Prepaid", "Collect", "Automatic", "Detailed"]); +export type AllChargesEnum = z.infer; +export const AllChargesEnum = AllChargesEnumSchema.enum; + +/** + * BlInstructionsDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + * @property { string } countryCode Country ISO2 code of the port + */ +export const BlInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port"), countryCode: z.string().describe("Country ISO2 code of the port") }).readonly(); +export type BlInstructionsDocumentPortResponseDTO = z.infer; + +/** + * RequestedDocumentTypeEnumSchema + * @type { enum } + */ +export const RequestedDocumentTypeEnumSchema = z.enum(["SeawayBill", "Original"]); +export type RequestedDocumentTypeEnum = z.infer; +export const RequestedDocumentTypeEnum = RequestedDocumentTypeEnumSchema.enum; + +/** + * ManifestFilerStatusEnumSchema + * @type { enum } + */ +export const ManifestFilerStatusEnumSchema = z.enum(["Self", "Carrier"]); +export type ManifestFilerStatusEnum = z.infer; +export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; + +/** + * BlInstructionsDocumentCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type BlInstructionsDocumentCountryDto = z.infer; + +/** + * BlInstructionsDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the BL Instructions document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the BL Instructions document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } date Date of the BL Instructions document + * @property { string } blNumber Bill of lading number + * @property { string } exportReference Export reference number + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { BlInstructionsDocumentCountryResponseDTO } originCountry Origin country + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } additionalText Additional text for the document + * @property { number } versionNumber Version number of the document + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } buyer Buyer information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } seller Seller information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } forwarder Forwarder party information + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information + * @property { BlInstructionsDocumentPlaceResponseDTO } stowedIntoContainerCity Stowed into container city information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfAcceptanceCity Place of acceptance city information + * @property { BlInstructionsDocumentPlaceResponseDTO } originalsToBeReleasedAt + * @property { string } originalsToBeReleasedAtText + * @property { BlInstructionsDocumentPlaceResponseDTO } loadingPierTerminal + * @property { string } loadingPierTerminalText + * @property { string } precarriageByText + * @property { string } placeOfReceiptText + * @property { string } portOfLoadingText + * @property { string } portOfDischargeText + * @property { string } placeOfDeliveryText + * @property { string } vessel Name of the vessel + * @property { string } voyage Name of the vessel + * @property { CommonModels.MovementTypeEnum } movementType + * @property { string } carrierBookingNumber + * @property { string } csnNumber + * @property { string } mcinNumber + * @property { string } pcinNumber + * @property { string } dueNumber + * @property { boolean } goodsDeliveredInEu + * @property { string } rucNumber + * @property { number } shipmentDeclaredValue + * @property { string } shipmentDeclaredValueCurrency + * @property { AllChargesEnum } allCharges Base freight payment term + * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term + * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term + * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term + * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term + * @property { string } shippingInstructionsComments Free-text shipping instructions comments + * @property { string } chargePayerId Charge payer business partner ID + * @property { string } chargePayLocationId Charge pay location ID + * @property { BlInstructionsDocumentPortResponseDTO } portOfLoading Port of loading information + * @property { BlInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information + * @property { BlInstructionsDocumentSettingsDtoDTO } settings Settings for the BL Instructions document + * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data + * @property { CommonModels.CargoTableBlockDto } cargo Cargo table block (identical to House BL cargo) + * @property { string } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document + * @property { RequestedDocumentTypeEnum } requestedDocumentType + * @property { boolean } requestedDocumentFreighted + * @property { number } requestedDocumentQuantity + * @property { ManifestFilerStatusEnum } manifestFilerStatus + * @property { string } manifestFilerIdentifier + * @property { BlInstructionsDocumentCountryDto } manifestFilingCountry + */ +export const BlInstructionsDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the BL Instructions document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the BL Instructions document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document").nullish(), blNumber: z.string().describe("Bill of lading number").nullish(), exportReference: z.string().describe("Export reference number").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), originCountry: BlInstructionsDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), additionalText: z.string().describe("Additional text for the document").nullish(), versionNumber: z.number().describe("Version number of the document"), buyer: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Buyer information for the shipment").nullish(), seller: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Seller information for the shipment").nullish(), consignee: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information for the shipment"), shipper: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), notify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Notify party information for the shipment"), alsoNotify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Additional notify party information"), forwarder: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Forwarder party information"), precarriageBy: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), placeOfReceipt: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), stowedIntoContainerCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Stowed into container city information").nullish(), placeOfAcceptanceCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of acceptance city information").nullish(), originalsToBeReleasedAt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAtText: z.string().nullish(), loadingPierTerminal: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), loadingPierTerminalText: z.string().nullish(), precarriageByText: z.string().nullish(), placeOfReceiptText: z.string().nullish(), portOfLoadingText: z.string().nullish(), portOfDischargeText: z.string().nullish(), placeOfDeliveryText: z.string().nullish(), vessel: z.string().describe("Name of the vessel").nullish(), voyage: z.string().describe("Name of the vessel").nullish(), movementType: CommonModels.MovementTypeEnumSchema.nullish(), carrierBookingNumber: z.string().nullish(), csnNumber: z.string().nullish(), mcinNumber: z.string().nullish(), pcinNumber: z.string().nullish(), dueNumber: z.string().nullish(), goodsDeliveredInEu: z.boolean().nullish(), rucNumber: z.string().nullish(), shipmentDeclaredValue: z.number().nullish(), shipmentDeclaredValueCurrency: z.string().nullish(), allCharges: AllChargesEnumSchema.describe("Base freight payment term").nullish(), baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term").nullish(), additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term").nullish(), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin haulage charges payment term").nullish(), originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term").nullish(), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination port charges payment term").nullish(), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination haulage charges payment term").nullish(), shippingInstructionsComments: z.string().describe("Free-text shipping instructions comments").nullish(), chargePayerId: z.string().describe("Charge payer business partner ID").nullish(), chargePayLocationId: z.string().describe("Charge pay location ID").nullish(), portOfLoading: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), portOfDischarge: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), placeOfDelivery: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), settings: BlInstructionsDocumentSettingsDtoDTOSchema.describe("Settings for the BL Instructions document").nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), cargo: CommonModels.CargoTableBlockDtoSchema.describe("Cargo table block (identical to House BL cargo)").nullish(), bodyRemarks: z.string().describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document"), requestedDocumentType: RequestedDocumentTypeEnumSchema.nullish(), requestedDocumentFreighted: z.boolean().nullish(), requestedDocumentQuantity: z.number().nullish(), manifestFilerStatus: ManifestFilerStatusEnumSchema.nullish(), manifestFilerIdentifier: z.string().nullish(), manifestFilingCountry: BlInstructionsDocumentCountryDtoSchema.nullish() }).readonly(); +export type BlInstructionsDocumentResponseDTO = z.infer; + +/** + * UpdateBlInstructionsDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { string } blNumber BL number + * @property { string } exportReference Export reference number + * @property { string } location Location + * @property { string } signer Signer + * @property { string } date Date + */ +export const UpdateBlInstructionsDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), blNumber: z.string().describe("BL number"), exportReference: z.string().describe("Export reference number"), location: z.string().describe("Location"), signer: z.string().describe("Signer"), date: z.iso.datetime({ offset: true }).describe("Date") }).readonly(); +export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer; + +/** + * UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateBlInstructionsDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } blNumber Bill of lading number + * @property { string } exportReference Export reference number + * @property { string } csnNumber + * @property { string } mcinNumber + * @property { string } pcinNumber + * @property { string } dueNumber + * @property { boolean } goodsDeliveredInEu + * @property { string } rucNumber + * @property { string } shipmentDeclaredValueCurrency + * @property { number } shipmentDeclaredValue + * @property { AllChargesEnum } allCharges All charges payment term + * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term + * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term + * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term + * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term + * @property { string } originCountryId Origin country ID + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } additionalText Additional text + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } buyer Buyer information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } seller Seller information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } forwarder Forwarder information + * @property { string } originalsToBeReleasedAtId Originals to be released at ID + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information + * @property { string } shippingInstructionsComments Shipping instructions free-text comments + * @property { string } chargePayerId Charge payer business partner ID + * @property { string } chargePayLocationId Charge pay location ID + * @property { string } precarriageById Pre-carriage by ID + * @property { string } placeOfReceiptId Place of receipt ID + * @property { string } stowedIntoContainerCityId Stowed into container city ID + * @property { string } loadingPierTerminalId Loading pier/terminal ID + * @property { string } loadingPierTerminalText + * @property { string } placeOfAcceptanceCityId Place of acceptance city ID + * @property { string } vessel Vessel name + * @property { string } voyage Vessel name + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } portOfLoadingId Port of loading ID + * @property { string } portOfDischargeId Port of discharge ID + * @property { string } placeOfDeliveryId Place of delivery ID + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { string } date Date of the BL Instructions document + * @property { UpdateBlInstructionsDocumentSettingsRequestDTO } settings Settings + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data + * @property { RequestedDocumentTypeEnum } requestedDocumentType + * @property { boolean } requestedDocumentFreighted + * @property { number } requestedDocumentQuantity + * @property { string } precarriageByText + * @property { string } placeOfReceiptText + * @property { string } portOfLoadingText + * @property { string } portOfDischargeText + * @property { string } placeOfDeliveryText + * @property { ManifestFilerStatusEnum } manifestFilerStatus + * @property { string } manifestFilingCountryId + * @property { string } manifestFilerIdentifier + */ +export const UpdateBlInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), blNumber: z.string().describe("Bill of lading number"), exportReference: z.string().describe("Export reference number"), csnNumber: z.string(), mcinNumber: z.string(), pcinNumber: z.string(), dueNumber: z.string(), goodsDeliveredInEu: z.boolean(), rucNumber: z.string(), shipmentDeclaredValueCurrency: z.string(), shipmentDeclaredValue: z.number(), allCharges: AllChargesEnumSchema.describe("All charges payment term"), baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term"), additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term"), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin haulage charges payment term"), originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term"), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination port charges payment term"), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination haulage charges payment term"), originCountryId: z.string().describe("Origin country ID"), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), additionalText: z.string().describe("Additional text"), consignee: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), shipper: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), buyer: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), seller: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), forwarder: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), notify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), alsoNotify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), shippingInstructionsComments: z.string().describe("Shipping instructions free-text comments"), chargePayerId: z.string().describe("Charge payer business partner ID"), chargePayLocationId: z.string().describe("Charge pay location ID"), precarriageById: z.string().describe("Pre-carriage by ID"), placeOfReceiptId: z.string().describe("Place of receipt ID"), stowedIntoContainerCityId: z.string().describe("Stowed into container city ID"), loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), loadingPierTerminalText: z.string(), placeOfAcceptanceCityId: z.string().describe("Place of acceptance city ID"), vessel: z.string().describe("Vessel name"), voyage: z.string().describe("Vessel name"), carrierBookingNumber: z.string().describe("Carrier booking number"), portOfLoadingId: z.string().describe("Port of loading ID"), portOfDischargeId: z.string().describe("Port of discharge ID"), placeOfDeliveryId: z.string().describe("Place of delivery ID"), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), bodyRemarks: z.string().describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document"), settings: UpdateBlInstructionsDocumentSettingsRequestDTOSchema.describe("Settings"), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), requestedDocumentType: RequestedDocumentTypeEnumSchema, requestedDocumentFreighted: z.boolean(), requestedDocumentQuantity: z.number(), precarriageByText: z.string(), placeOfReceiptText: z.string(), portOfLoadingText: z.string(), portOfDischargeText: z.string(), placeOfDeliveryText: z.string(), manifestFilerStatus: ManifestFilerStatusEnumSchema, manifestFilingCountryId: z.string(), manifestFilerIdentifier: z.string() }).readonly(); +export type UpdateBlInstructionsDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts new file mode 100644 index 0000000..6131b35 --- /dev/null +++ b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts @@ -0,0 +1,243 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsBlInstructionsAcl } from "./workingDocumentsBlInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsBlInstructionsApi } from "./workingDocumentsBlInstructions.api"; + +export namespace WorkingDocumentsBlInstructionsQueries { +export const moduleName = QueryModule.WorkingDocumentsBlInstructions; + +export const keys = { + all: [moduleName] as const, + getBlInstructionsData: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId", positionId, blInstructionsId, officeId] as const, + previewBlInstructions: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId/preview", positionId, blInstructionsId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a BL Instructions document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId } )); + return WorkingDocumentsBlInstructionsApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetBlInstructionsData` + * @summary Get BL Instructions document data + * @permission Requires `canUseGetBlInstructionsData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.blInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBlInstructionsData = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId } )); + return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateBlInstructionsData` + * @summary Update BL Instructions document data + * @permission Requires `canUseUpdateBlInstructionsData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBlInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId } )); + return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData(positionId, blInstructionsId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.getBlInstructionsData(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteBlInstructions` + * @summary Delete BL Instructions document + * @permission Requires `canUseDeleteBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } BL Instructions document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewBlInstructions` - recommended when file should be cached + * @summary Preview BL Instructions document + * @permission Requires `canUsePreviewBlInstructions` ability + * @param { string } object.positionId Path parameter + * @param { string } object.blInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewBlInstructions = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewBlInstructionsMutation` - recommended when file should not be cached + * @summary Preview BL Instructions document + * @permission Requires `canUsePreviewBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewBlInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateBlInstructions` + * @summary Generate BL Instructions document + * @permission Requires `canUseGenerateBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.generateBlInstructions(positionId, blInstructionsId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate BL Instructions document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId } )); + return WorkingDocumentsBlInstructionsApi.generateDocumentEml(positionId, blInstructionsId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts new file mode 100644 index 0000000..0454eb2 --- /dev/null +++ b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsCmrFormAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Create", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `useGetCmrData` query ability. For global ability, omit the object parameter. + * @description Read CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCmrData` query + */ +export const canUseGetCmrData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `useUpdateCmrData` mutation ability. For global ability, omit the object parameter. + * @description Update CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCmrData` mutation + */ +export const canUseUpdateCmrData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `useDeleteCmr` mutation ability. For global ability, omit the object parameter. + * @description Delete CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCmr` mutation + */ +export const canUseDeleteCmr = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Delete", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `usePreviewCmr` query or `usePreviewCmrMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewCmr` query or `usePreviewCmrMutation` mutation + */ +export const canUsePreviewCmr = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `useGenerateCmr` mutation ability. For global ability, omit the object parameter. + * @description Generate CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateCmr` mutation + */ +export const canUseGenerateCmr = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts new file mode 100644 index 0000000..f070e6b --- /dev/null +++ b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsCmrFormApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs`, + undefined, + config + ) +}; +export const getCmrData = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + config + ) +}; +export const updateCmrData = (positionId: string, cmrId: string, officeId: string, data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + undefined, + config + ) +}; +export const previewCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateCmr = (positionId: string, cmrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts new file mode 100644 index 0000000..a94b23e --- /dev/null +++ b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts @@ -0,0 +1,187 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsCmrFormModels { +/** + * CmrDocumentLanguageSchema + * @type { enum } + */ +export const CmrDocumentLanguageSchema = z.enum(["en", "fr", "de"]); +export type CmrDocumentLanguage = z.infer; +export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; + +/** + * CmrDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CmrDocumentLanguage } primaryLanguage Primary language + * @property { CmrDocumentLanguage } secondaryLanguage Secondary language + */ +export const CmrDocumentSettingsDtoDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language") }).readonly(); +export type CmrDocumentSettingsDtoDTO = z.infer; + +/** + * CmrDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const CmrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type CmrDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * CmrDocumentCityResponseDTOSchema + * @type { object } + * @property { string } cityId ID of the city + * @property { string } cityName Name of the city + * @property { string } date Date of delivery/takeover + * @property { string } countryName Country name + */ +export const CmrDocumentCityResponseDTOSchema = z.object({ cityId: z.string().describe("ID of the city"), cityName: z.string().describe("Name of the city"), date: z.iso.datetime({ offset: true }).describe("Date of delivery/takeover").nullish(), countryName: z.string().describe("Country name").nullish() }).readonly(); +export type CmrDocumentCityResponseDTO = z.infer; + +/** + * CmrDocumentCostsResponseDTOSchema + * @type { object } + * @property { number } carriageCharges Carriage charges + * @property { number } reductions Reductions + * @property { number } balance Balance + * @property { number } supplements Supplements + * @property { number } miscellaneous Miscellaneous charges + * @property { number } total Total amount + */ +export const CmrDocumentCostsResponseDTOSchema = z.object({ carriageCharges: z.number().describe("Carriage charges"), reductions: z.number().describe("Reductions"), balance: z.number().describe("Balance"), supplements: z.number().describe("Supplements"), miscellaneous: z.number().describe("Miscellaneous charges"), total: z.number().describe("Total amount") }).readonly(); +export type CmrDocumentCostsResponseDTO = z.infer; + +/** + * CmrDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { number } quantity Quantity of packages + * @property { string } description Description of the cargo + * @property { string } packageType + * @property { string } statisticNumber + * @property { string } positionNumber Position number of the cargo + * @property { number } grossWeight Gross weight of the cargo + * @property { number } volume Volume of the cargo + * @property { string } containerNumber Container number of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + */ +export const CmrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().describe("Case marks of the cargo"), quantity: z.number().describe("Quantity of packages"), description: z.string().describe("Description of the cargo"), packageType: z.string(), statisticNumber: z.string(), positionNumber: z.string().describe("Position number of the cargo"), grossWeight: z.number().describe("Gross weight of the cargo"), volume: z.number().describe("Volume of the cargo"), containerNumber: z.string().describe("Container number of the cargo"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo") }).readonly(); +export type CmrDocumentCargoResponseDTO = z.infer; + +/** + * CmrDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } positionNumber Position number + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { number } versionNumber Version number of the document + * @property { string } cmrNumber CMR number + * @property { CmrDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { CmrDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { CmrDocumentBusinessPartnerResponseDTO } carrier Carrier information + * @property { CmrDocumentBusinessPartnerResponseDTO } successiveCarrier Successive carrier information + * @property { CmrDocumentCityResponseDTO } delivery Delivery information + * @property { CmrDocumentCityResponseDTO } takeover Takeover information + * @property { string } annexedDocuments Annexed documents + * @property { string } carriersObservations Carriers observations + * @property { string } senderInstructions Sender instructions + * @property { string } reimbursement Reimbursement information + * @property { string } specialAgreements Special agreements + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { boolean } freightPaid Whether freight is paid + * @property { boolean } freightToBePaid Whether freight is to be paid + * @property { string } creationPlace Place of creation + * @property { string } creationDate Date of creation + * @property { CmrDocumentCostsResponseDTO } costsForShipper Costs for shipper + * @property { CmrDocumentCostsResponseDTO } costsForConsignee Costs for consignee + * @property { string[] } selectedCargoIds List of selected cargo IDs + * @property { CmrDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CmrDocumentSettingsDtoDTO } settings Settings for the BL Instructions document + */ +export const CmrDocumentResponseDTOSchema = z.object({ id: z.string().describe("ID of the document"), name: z.string().describe("Name of the document"), positionNumber: z.string().describe("Position number"), nameSuffix: z.string().describe("Name suffix of the document").nullish(), defaultFileName: z.string(), positionId: z.string().describe("Position ID"), versionNumber: z.number().describe("Version number of the document"), cmrNumber: z.string().describe("CMR number").nullish(), consignee: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), shipper: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), carrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Carrier information").nullish(), successiveCarrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Successive carrier information").nullish(), delivery: CmrDocumentCityResponseDTOSchema.describe("Delivery information").nullish(), takeover: CmrDocumentCityResponseDTOSchema.describe("Takeover information").nullish(), annexedDocuments: z.string().describe("Annexed documents").nullish(), carriersObservations: z.string().describe("Carriers observations").nullish(), senderInstructions: z.string().describe("Sender instructions").nullish(), reimbursement: z.string().describe("Reimbursement information").nullish(), specialAgreements: z.string().describe("Special agreements").nullish(), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), freightPaid: z.boolean().describe("Whether freight is paid"), freightToBePaid: z.boolean().describe("Whether freight is to be paid"), creationPlace: z.string().describe("Place of creation"), creationDate: z.string().describe("Date of creation"), costsForShipper: CmrDocumentCostsResponseDTOSchema.describe("Costs for shipper").nullish(), costsForConsignee: CmrDocumentCostsResponseDTOSchema.describe("Costs for consignee").nullish(), selectedCargoIds: z.array(z.string()).readonly().describe("List of selected cargo IDs"), cargo: z.array(CmrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), settings: CmrDocumentSettingsDtoDTOSchema.describe("Settings for the BL Instructions document").nullish() }).readonly(); +export type CmrDocumentResponseDTO = z.infer; + +/** + * UpdateCmrDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CmrDocumentLanguage } primaryLanguage Primary language + * @property { CmrDocumentLanguage } secondaryLanguage Secondary language + */ +export const UpdateCmrDocumentSettingsRequestDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language") }).readonly(); +export type UpdateCmrDocumentSettingsRequestDTO = z.infer; + +/** + * UpdateCmrDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateCmrDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateCmrDocumentDeliveryRequestDTOSchema + * @type { object } + * @property { string } cityId City ID + * @property { string } cityName City name + * @property { string } date Date + */ +export const UpdateCmrDocumentDeliveryRequestDTOSchema = z.object({ cityId: z.string().describe("City ID"), cityName: z.string().describe("City name"), date: z.iso.datetime({ offset: true }).describe("Date") }).readonly(); +export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; + +/** + * UpdateCmrDocumentCostsRequestDTOSchema + * @type { object } + * @property { number } carriageCharges Carriage charges + * @property { number } reductions Reductions + * @property { number } balance Balance + * @property { number } supplements Supplements + * @property { number } miscellaneous Miscellaneous + * @property { number } total Total + */ +export const UpdateCmrDocumentCostsRequestDTOSchema = z.object({ carriageCharges: z.number().describe("Carriage charges"), reductions: z.number().describe("Reductions"), balance: z.number().describe("Balance"), supplements: z.number().describe("Supplements"), miscellaneous: z.number().describe("Miscellaneous"), total: z.number().describe("Total") }).readonly(); +export type UpdateCmrDocumentCostsRequestDTO = z.infer; + +/** + * UpdateCmrDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } cmrNumber CMR number + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } carrier Carrier information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } successiveCarrier Successive carrier information + * @property { UpdateCmrDocumentDeliveryRequestDTO } delivery Delivery information + * @property { UpdateCmrDocumentDeliveryRequestDTO } takeover Takeover information + * @property { string } annexedDocuments Annexed documents + * @property { string } carriersObservations Carriers observations + * @property { string } senderInstructions Sender instructions + * @property { string } reimbursement Reimbursement + * @property { string } specialAgreements Special agreements + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { boolean } freightPaid Whether freight is paid + * @property { boolean } freightToBePaid Whether freight is to be paid + * @property { string } creationPlace Place of creation + * @property { string } creationDate Date of creation + * @property { UpdateCmrDocumentCostsRequestDTO } costsForShipper Costs for shipper + * @property { UpdateCmrDocumentCostsRequestDTO } costsForConsignee Costs for consignee + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { UpdateCmrDocumentSettingsRequestDTO } settings Settings + */ +export const UpdateCmrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), cmrNumber: z.string().describe("CMR number"), consignee: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), shipper: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), carrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Carrier information"), successiveCarrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Successive carrier information"), delivery: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Delivery information"), takeover: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Takeover information"), annexedDocuments: z.string().describe("Annexed documents"), carriersObservations: z.string().describe("Carriers observations"), senderInstructions: z.string().describe("Sender instructions"), reimbursement: z.string().describe("Reimbursement"), specialAgreements: z.string().describe("Special agreements"), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), freightPaid: z.boolean().describe("Whether freight is paid"), freightToBePaid: z.boolean().describe("Whether freight is to be paid"), creationPlace: z.string().describe("Place of creation"), creationDate: z.string().describe("Date of creation"), costsForShipper: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for shipper"), costsForConsignee: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for consignee"), selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), settings: UpdateCmrDocumentSettingsRequestDTOSchema.describe("Settings") }).readonly(); +export type UpdateCmrDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts new file mode 100644 index 0000000..769f861 --- /dev/null +++ b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsCmrFormAcl } from "./workingDocumentsCmrForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsCmrFormApi } from "./workingDocumentsCmrForm.api"; + +export namespace WorkingDocumentsCmrFormQueries { +export const moduleName = QueryModule.WorkingDocumentsCmrForm; + +export const keys = { + all: [moduleName] as const, + getCmrData: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId", positionId, cmrId, officeId] as const, + previewCmr: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId/preview", positionId, cmrId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a CMR document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId } )); + return WorkingDocumentsCmrFormApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetCmrData` + * @summary Get CMR document data + * @permission Requires `canUseGetCmrData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.cmrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCmrData = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCmrData(positionId, cmrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId } )); + return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCmrData` + * @summary Update CMR document data + * @permission Requires `canUseUpdateCmrData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCmrData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId, data }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId } )); + return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, cmrId, officeId } = variables; + const updateKeys = [keys.getCmrData(positionId, cmrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteCmr` + * @summary Delete CMR document + * @permission Requires `canUseDeleteCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } CMR document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteCmr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewCmr` - recommended when file should be cached + * @summary Preview CMR document + * @permission Requires `canUsePreviewCmr` ability + * @param { string } object.positionId Path parameter + * @param { string } object.cmrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewCmr = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewCmr(positionId, cmrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewCmrMutation` - recommended when file should not be cached + * @summary Preview CMR document + * @permission Requires `canUsePreviewCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewCmrMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, cmrId, officeId } = variables; + const updateKeys = [keys.previewCmr(positionId, cmrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateCmr` + * @summary Generate CMR document + * @permission Requires `canUseGenerateCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateCmr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId, data }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts new file mode 100644 index 0000000..bd69b52 --- /dev/null +++ b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsExportDeclarationAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Create", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `useGetExportDeclarationData` query ability. For global ability, omit the object parameter. + * @description Read export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetExportDeclarationData` query + */ +export const canUseGetExportDeclarationData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `useUpdateExportDeclarationData` mutation ability. For global ability, omit the object parameter. + * @description Update export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateExportDeclarationData` mutation + */ +export const canUseUpdateExportDeclarationData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `useDeleteExportDeclaration` mutation ability. For global ability, omit the object parameter. + * @description Delete export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteExportDeclaration` mutation + */ +export const canUseDeleteExportDeclaration = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Delete", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation + */ +export const canUsePreviewExportDeclaration = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `useGenerateExportDeclaration` mutation ability. For global ability, omit the object parameter. + * @description Generate export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateExportDeclaration` mutation + */ +export const canUseGenerateExportDeclaration = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts new file mode 100644 index 0000000..9eb1a57 --- /dev/null +++ b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsExportDeclarationApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations`, + undefined, + config + ) +}; +export const getExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + config + ) +}; +export const updateExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteExportDeclaration = (positionId: string, exportDeclarationId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + undefined, + config + ) +}; +export const previewExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts new file mode 100644 index 0000000..1dc6ab5 --- /dev/null +++ b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts @@ -0,0 +1,94 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsExportDeclarationModels { +/** + * ExportDeclarationDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * ExportDeclarationDocumentCargoResponseDTOSchema + * @type { object } + * @property { number } quantity Quantity of packages + * @property { number } weight Weight of the cargo + * @property { number } length Length of the cargo + * @property { number } width Width of the cargo + * @property { number } height Height of the cargo + * @property { string } packageType Type of package + * @property { string } positionNumber Position number + */ +export const ExportDeclarationDocumentCargoResponseDTOSchema = z.object({ quantity: z.number().describe("Quantity of packages"), weight: z.number().describe("Weight of the cargo"), length: z.number().describe("Length of the cargo"), width: z.number().describe("Width of the cargo"), height: z.number().describe("Height of the cargo"), packageType: z.string().describe("Type of package"), positionNumber: z.string().describe("Position number") }).readonly(); +export type ExportDeclarationDocumentCargoResponseDTO = z.infer; + +/** + * ExportDeclarationDocumentRouteResponseDTOSchema + * @type { object } + * @property { string } pickupDate Pickup date + * @property { string } deliveryDate Delivery date + * @property { string } pickupCity Pickup city + * @property { string } deliveryCity Delivery city + */ +export const ExportDeclarationDocumentRouteResponseDTOSchema = z.object({ pickupDate: z.string().describe("Pickup date"), deliveryDate: z.string().describe("Delivery date"), pickupCity: z.string().describe("Pickup city"), deliveryCity: z.string().describe("Delivery city") }).readonly(); +export type ExportDeclarationDocumentRouteResponseDTO = z.infer; + +/** + * ExportDeclarationDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the export declaration document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the export declaration document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } dateOfHandover Date when the goods are handed over for export + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { string } issuerName Name of the issuer + * @property { string } issuerAddress Address of the issuer + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } customer Customer information + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { string } selectedCargoId ID of the selected cargo + * @property { ExportDeclarationDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { ExportDeclarationDocumentRouteResponseDTO } route Route information + * @property { string } signingPlace Place where the document is signed + * @property { string } signingDate Date when the document is signed + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } signedBy Information about who signed the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ +export const ExportDeclarationDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the export declaration document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the export declaration document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), dateOfHandover: z.iso.datetime({ offset: true }).describe("Date when the goods are handed over for export").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), versionNumber: z.number().describe("Version number of the document"), issuerName: z.string().describe("Name of the issuer").nullish(), issuerAddress: z.string().describe("Address of the issuer").nullish(), customer: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Customer information").nullish(), shipper: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), consignee: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), selectedCargoId: z.string().describe("ID of the selected cargo").nullish(), cargo: z.array(ExportDeclarationDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), route: ExportDeclarationDocumentRouteResponseDTOSchema.describe("Route information").nullish(), signingPlace: z.string().describe("Place where the document is signed").nullish(), signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed").nullish(), signedBy: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Information about who signed the document").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document").nullish() }).readonly(); +export type ExportDeclarationDocumentResponseDTO = z.infer; + +/** + * UpdateExportDeclarationDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } dateOfHandover Date when goods are handed over for export + * @property { string } issuerName Name of the issuer + * @property { string } issuerAddress Address of the issuer + * @property { string } customerId Customer ID + * @property { string } customerAddress Customer address + * @property { string } shipperId Shipper ID + * @property { string } shipperAddress Shipper address + * @property { string } consigneeId Consignee ID + * @property { string } consigneeAddress Consignee address + * @property { string } selectedCargoId Selected cargo ID + * @property { string } signingPlace Place where the document is signed + * @property { string } signingDate Date when the document is signed + * @property { string } signedByEmployeeId ID of the employee who signed the document + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateExportDeclarationDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), dateOfHandover: z.iso.datetime({ offset: true }).describe("Date when goods are handed over for export"), issuerName: z.string().describe("Name of the issuer"), issuerAddress: z.string().describe("Address of the issuer"), customerId: z.string().describe("Customer ID"), customerAddress: z.string().describe("Customer address"), shipperId: z.string().describe("Shipper ID"), shipperAddress: z.string().describe("Shipper address"), consigneeId: z.string().describe("Consignee ID"), consigneeAddress: z.string().describe("Consignee address"), selectedCargoId: z.string().describe("Selected cargo ID"), signingPlace: z.string().describe("Place where the document is signed"), signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed"), signedByEmployeeId: z.string().describe("ID of the employee who signed the document"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateExportDeclarationDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts new file mode 100644 index 0000000..e58dbad --- /dev/null +++ b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsExportDeclarationAcl } from "./workingDocumentsExportDeclaration.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsExportDeclarationApi } from "./workingDocumentsExportDeclaration.api"; + +export namespace WorkingDocumentsExportDeclarationQueries { +export const moduleName = QueryModule.WorkingDocumentsExportDeclaration; + +export const keys = { + all: [moduleName] as const, + getExportDeclarationData: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId", officeId, positionId, exportDeclarationId] as const, + previewExportDeclaration: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId/preview", officeId, positionId, exportDeclarationId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an export declaration document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId } )); + return WorkingDocumentsExportDeclarationApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetExportDeclarationData` + * @summary Get export declaration document data + * @permission Requires `canUseGetExportDeclarationData` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.exportDeclarationId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetExportDeclarationData = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), + queryFn: () => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId } )); + return WorkingDocumentsExportDeclarationApi.getExportDeclarationData(officeId, positionId, exportDeclarationId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateExportDeclarationData` + * @summary Update export declaration document data + * @permission Requires `canUseUpdateExportDeclarationData` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateExportDeclarationData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId } )); + return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData(officeId, positionId, exportDeclarationId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, exportDeclarationId } = variables; + const updateKeys = [keys.getExportDeclarationData(officeId, positionId, exportDeclarationId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteExportDeclaration` + * @summary Delete export declaration document + * @permission Requires `canUseDeleteExportDeclaration` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Export declaration document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, exportDeclarationId, officeId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration(positionId, exportDeclarationId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewExportDeclaration` - recommended when file should be cached + * @summary Preview export declaration document + * @permission Requires `canUsePreviewExportDeclaration` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.exportDeclarationId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewExportDeclaration = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), + queryFn: () => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewExportDeclarationMutation` - recommended when file should not be cached + * @summary Preview export declaration document + * @permission Requires `canUsePreviewExportDeclaration` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewExportDeclarationMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, exportDeclarationId } = variables; + const updateKeys = [keys.previewExportDeclaration(officeId, positionId, exportDeclarationId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateExportDeclaration` + * @summary Generate export declaration document + * @permission Requires `canUseGenerateExportDeclaration` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.generateExportDeclaration(officeId, positionId, exportDeclarationId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts new file mode 100644 index 0000000..9c5da4d --- /dev/null +++ b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsFcrFormAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Create", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `useGetFcrData` query ability. For global ability, omit the object parameter. + * @description Read FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetFcrData` query + */ +export const canUseGetFcrData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `useUpdateFcrData` mutation ability. For global ability, omit the object parameter. + * @description Update FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateFcrData` mutation + */ +export const canUseUpdateFcrData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `useDeleteFcr` mutation ability. For global ability, omit the object parameter. + * @description Delete FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteFcr` mutation + */ +export const canUseDeleteFcr = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Delete", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `usePreviewFcr` query or `usePreviewFcrMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewFcr` query or `usePreviewFcrMutation` mutation + */ +export const canUsePreviewFcr = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `useGenerateFcr` mutation ability. For global ability, omit the object parameter. + * @description Generate FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateFcr` mutation + */ +export const canUseGenerateFcr = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts new file mode 100644 index 0000000..0c25cd4 --- /dev/null +++ b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsFcrFormApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs`, + undefined, + config + ) +}; +export const getFcrData = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + config + ) +}; +export const updateFcrData = (positionId: string, fcrId: string, officeId: string, data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + undefined, + config + ) +}; +export const previewFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateFcr = (positionId: string, fcrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts new file mode 100644 index 0000000..3d3752b --- /dev/null +++ b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts @@ -0,0 +1,86 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsFcrFormModels { +/** + * FcrDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const FcrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type FcrDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * FcrDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { string } containerNumber Container number + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + * @property { number } quantity Quantity of the cargo + * @property { string } description Description of the cargo + * @property { number } weight Weight of the cargo + * @property { number } volume Volume of the cargo + */ +export const FcrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().describe("Case marks of the cargo"), containerNumber: z.string().describe("Container number"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo"), quantity: z.number().describe("Quantity of the cargo"), description: z.string().describe("Description of the cargo"), weight: z.number().describe("Weight of the cargo"), volume: z.number().describe("Volume of the cargo") }).readonly(); +export type FcrDocumentCargoResponseDTO = z.infer; + +/** + * FcrDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { number } versionNumber Version number of the document + * @property { string } fcrNumber FCR number + * @property { string } edvNumber EDV number + * @property { number } numberOfOriginals Number of originals + * @property { string } placeOfLoading Place of loading + * @property { string } dateOfLoading Date of loading + * @property { string } viaCity Via city + * @property { string } toDestination To destination + * @property { string } transportMode Transport mode + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } issuePlace Issue place + * @property { string } issueDate Issue date + * @property { string } deliveryTerms Delivery terms + * @property { FcrDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { FcrDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { FcrDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ +export const FcrDocumentResponseDTOSchema = z.object({ id: z.string().describe("ID of the document"), name: z.string().describe("Name of the document"), nameSuffix: z.string().describe("Name suffix of the document").nullish(), defaultFileName: z.string(), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), versionNumber: z.number().describe("Version number of the document"), fcrNumber: z.string().describe("FCR number").nullish(), edvNumber: z.string().describe("EDV number").nullish(), numberOfOriginals: z.number().describe("Number of originals"), placeOfLoading: z.string().describe("Place of loading").nullish(), dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading").nullish(), viaCity: z.string().describe("Via city").nullish(), toDestination: z.string().describe("To destination").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), issuePlace: z.string().describe("Issue place").nullish(), issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), deliveryTerms: z.string().describe("Delivery terms").nullish(), shipper: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), consignee: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), cargo: z.array(FcrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document") }).readonly(); +export type FcrDocumentResponseDTO = z.infer; + +/** + * UpdateFcrDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } fcrNumber FCR number + * @property { string } edvNumber EDV number + * @property { number } numberOfOriginals Number of originals + * @property { string } placeOfLoading Place of loading + * @property { string } dateOfLoading Date of loading + * @property { string } viaCity Via city + * @property { string } toDestination To destination + * @property { string } transportMode Transport mode + * @property { string } issuePlace Issue place + * @property { string } issueDate Issue date + * @property { string } deliveryTerms Delivery terms + * @property { string } shipperId Shipper ID + * @property { string } shipperAddress Shipper address + * @property { string } consigneeId Consignee ID + * @property { string } consigneeAddress Consignee address + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateFcrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), fcrNumber: z.string().describe("FCR number"), edvNumber: z.string().describe("EDV number"), numberOfOriginals: z.number().describe("Number of originals"), placeOfLoading: z.string().describe("Place of loading"), dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading"), viaCity: z.string().describe("Via city"), toDestination: z.string().describe("To destination"), transportMode: z.string().describe("Transport mode"), issuePlace: z.string().describe("Issue place"), issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), deliveryTerms: z.string().describe("Delivery terms"), shipperId: z.string().describe("Shipper ID"), shipperAddress: z.string().describe("Shipper address"), consigneeId: z.string().describe("Consignee ID"), consigneeAddress: z.string().describe("Consignee address"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateFcrDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts new file mode 100644 index 0000000..1479d71 --- /dev/null +++ b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsFcrFormAcl } from "./workingDocumentsFcrForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsFcrFormApi } from "./workingDocumentsFcrForm.api"; + +export namespace WorkingDocumentsFcrFormQueries { +export const moduleName = QueryModule.WorkingDocumentsFcrForm; + +export const keys = { + all: [moduleName] as const, + getFcrData: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId", positionId, fcrId, officeId] as const, + previewFcr: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId/preview", positionId, fcrId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an FCR document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId } )); + return WorkingDocumentsFcrFormApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetFcrData` + * @summary Get FCR document data + * @permission Requires `canUseGetFcrData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.fcrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetFcrData = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getFcrData(positionId, fcrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId } )); + return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateFcrData` + * @summary Update FCR document data + * @permission Requires `canUseUpdateFcrData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateFcrData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId, data }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId } )); + return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, fcrId, officeId } = variables; + const updateKeys = [keys.getFcrData(positionId, fcrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteFcr` + * @summary Delete FCR document + * @permission Requires `canUseDeleteFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } FCR document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteFcr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewFcr` - recommended when file should be cached + * @summary Preview FCR document + * @permission Requires `canUsePreviewFcr` ability + * @param { string } object.positionId Path parameter + * @param { string } object.fcrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewFcr = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewFcr(positionId, fcrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewFcrMutation` - recommended when file should not be cached + * @summary Preview FCR document + * @permission Requires `canUsePreviewFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewFcrMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, fcrId, officeId } = variables; + const updateKeys = [keys.previewFcr(positionId, fcrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateFcr` + * @summary Generate FCR document + * @permission Requires `canUseGenerateFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateFcr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId, data }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts new file mode 100644 index 0000000..a7c5b44 --- /dev/null +++ b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsHouseAwbAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Create", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `useGetHouseAwbData` query ability. For global ability, omit the object parameter. + * @description Read House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseAwbData` query + */ +export const canUseGetHouseAwbData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `useUpdateHouseAwbData` mutation ability. For global ability, omit the object parameter. + * @description Update House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseAwbData` mutation + */ +export const canUseUpdateHouseAwbData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `useDeleteHouseAwb` mutation ability. For global ability, omit the object parameter. + * @description Delete House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseAwb` mutation + */ +export const canUseDeleteHouseAwb = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Delete", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation + */ +export const canUsePreviewHouseAwb = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `useGenerateHouseAwb` mutation ability. For global ability, omit the object parameter. + * @description Generate House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseAwb` mutation + */ +export const canUseGenerateHouseAwb = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts new file mode 100644 index 0000000..319c3d3 --- /dev/null +++ b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseAwbApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs`, + undefined, + config + ) +}; +export const getHouseAwbData = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + config + ) +}; +export const updateHouseAwbData = (positionId: string, hawbId: string, officeId: string, data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + undefined, + config + ) +}; +export const previewHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateHouseAwb = (positionId: string, hawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts new file mode 100644 index 0000000..6428bad --- /dev/null +++ b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts @@ -0,0 +1,174 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseAwbModels { +/** + * HouseAwbDocumentOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + * @property { string } name Name + */ +export const HouseAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID").nullish(), sellRate: z.number().describe("Sell rate"), name: z.string().describe("Name").nullish() }).readonly(); +export type HouseAwbDocumentOtherChargeDTO = z.infer; + +/** + * HouseAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { number } totalOtherCharges Total other charges + * @property { number } total Total + * @property { HouseAwbDocumentOtherChargeDTO[] } otherCharges Other charges + */ +export const HouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), totalOtherCharges: z.number().describe("Total other charges"), total: z.number().describe("Total"), otherCharges: z.array(HouseAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); +export type HouseAwbDocumentChargesDTO = z.infer; + +/** + * HouseAwbDocumentCargoDTOSchema + * @type { object } + * @property { number } quantity Quantity + * @property { number } grossWeight Gross weight + * @property { string } rateClass Rate class + * @property { string } commodityItemNo Commodity item number + * @property { number } rateOrCharge Rate or charge + * @property { number } total Total + * @property { string } description Description + */ +export const HouseAwbDocumentCargoDTOSchema = z.object({ quantity: z.number().describe("Quantity"), grossWeight: z.number().describe("Gross weight").nullish(), rateClass: z.string().describe("Rate class").nullish(), commodityItemNo: z.string().describe("Commodity item number").nullish(), rateOrCharge: z.number().describe("Rate or charge").nullish(), total: z.number().describe("Total").nullish(), description: z.string().describe("Description").nullish() }).readonly(); +export type HouseAwbDocumentCargoDTO = z.infer; + +/** + * HouseAwbDocumentRouteDTOSchema + * @type { object } + * @property { string } airportOfDeparture Airport of departure + * @property { string } airportOfDestination Airport of destination + * @property { string } toAirport1 To airport 1 + * @property { string } byCarrier1 By carrier 1 + * @property { string } toAirport2 To airport 2 + * @property { string } byCarrier2 By carrier 2 + * @property { string } toAirport3 To airport 3 + * @property { string } byCarrier3 By carrier 3 + * @property { string } flightNumber1 Flight number 1 + * @property { string } flightDay1 Flight day 1 + * @property { string } flightNumber2 Flight number 2 + * @property { string } flightDay2 Flight day 2 + */ +export const HouseAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string().describe("Airport of departure"), airportOfDestination: z.string().describe("Airport of destination"), toAirport1: z.string().describe("To airport 1").nullish(), byCarrier1: z.string().describe("By carrier 1").nullish(), toAirport2: z.string().describe("To airport 2").nullish(), byCarrier2: z.string().describe("By carrier 2").nullish(), toAirport3: z.string().describe("To airport 3").nullish(), byCarrier3: z.string().describe("By carrier 3").nullish(), flightNumber1: z.string().describe("Flight number 1").nullish(), flightDay1: z.string().describe("Flight day 1").nullish(), flightNumber2: z.string().describe("Flight number 2").nullish(), flightDay2: z.string().describe("Flight day 2").nullish() }).readonly(); +export type HouseAwbDocumentRouteDTO = z.infer; + +/** + * HouseAwbDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const HouseAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * HouseAwbDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the House AWB document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the House AWB document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } currency Currency + * @property { number } versionNumber Version number of the document + * @property { string } hawbNumber HAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { HouseAwbDocumentCargoDTO[] } cargo Cargo packages + * @property { HouseAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } signingLocation Signing location + * @property { string } issuerIataCode Issuer IATA code + * @property { HouseAwbDocumentRouteDTO } route Route + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } issuer Issuer + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { CommonModels.DocumentConfigDTO } config Config + */ +export const HouseAwbDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the House AWB document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference"), name: z.string().describe("Name of the House AWB document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), currency: z.string().describe("Currency").nullish(), versionNumber: z.number().describe("Version number of the document"), hawbNumber: z.string().describe("HAWB number").nullish(), sciReference: z.string().describe("SCI reference").nullish(), reference1: z.string().describe("Reference 1").nullish(), reference2: z.string().describe("Reference 2").nullish(), reference3: z.string().describe("Reference 3").nullish(), exchangeRate: z.number().describe("Exchange rate").nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), handlingInstructions: z.string().describe("Handling instructions").nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), cargo: z.array(HouseAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), charges: HouseAwbDocumentChargesDTOSchema.describe("Charges").nullish(), shipperSigner: z.string().describe("Shipper signer").nullish(), shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), signer: z.string().describe("Signer").nullish(), signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), signingLocation: z.string().describe("Signing location").nullish(), issuerIataCode: z.string().describe("Issuer IATA code").nullish(), route: HouseAwbDocumentRouteDTOSchema.describe("Route").nullish(), issuer: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), consignee: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), shipper: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish() }).readonly(); +export type HouseAwbDocumentResponseDTO = z.infer; + +/** + * UpdateHouseAwbDocumentChargesOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + */ +export const UpdateHouseAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }).readonly(); +export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer; + +/** + * UpdateHouseAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { UpdateHouseAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges + */ +export const UpdateHouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), otherCharges: z.array(UpdateHouseAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); +export type UpdateHouseAwbDocumentChargesDTO = z.infer; + +/** + * UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateHouseAwbDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } hawbNumber HAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { UpdateHouseAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } issuerId Issuer ID + * @property { string } issuerName Issuer name + * @property { string } issuerAddress Issuer address + * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateHouseAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), hawbNumber: z.string().describe("HAWB number"), sciReference: z.string().describe("SCI reference"), reference1: z.string().describe("Reference 1"), reference2: z.string().describe("Reference 2"), reference3: z.string().describe("Reference 3"), exchangeRate: z.number().describe("Exchange rate"), additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), handlingInstructions: z.string().describe("Handling instructions"), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), additionalAccountingNotes: z.string().describe("Additional accounting notes"), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), charges: UpdateHouseAwbDocumentChargesDTOSchema.describe("Charges"), shipperSigner: z.string().describe("Shipper signer"), shipperSignerUserName: z.string().describe("Shipper signer user name"), signer: z.string().describe("Signer"), signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), issuerId: z.string().describe("Issuer ID"), issuerName: z.string().describe("Issuer name"), issuerAddress: z.string().describe("Issuer address"), consignee: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), shipper: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateHouseAwbDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts new file mode 100644 index 0000000..8062a30 --- /dev/null +++ b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsHouseAwbAcl } from "./workingDocumentsHouseAwb.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsHouseAwbApi } from "./workingDocumentsHouseAwb.api"; + +export namespace WorkingDocumentsHouseAwbQueries { +export const moduleName = QueryModule.WorkingDocumentsHouseAwb; + +export const keys = { + all: [moduleName] as const, + getHouseAwbData: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId", positionId, hawbId, officeId] as const, + previewHouseAwb: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId/preview", positionId, hawbId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a House AWB document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId } )); + return WorkingDocumentsHouseAwbApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetHouseAwbData` + * @summary Get House AWB document data + * @permission Requires `canUseGetHouseAwbData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.hawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetHouseAwbData = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId } )); + return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateHouseAwbData` + * @summary Update House AWB document data + * @permission Requires `canUseUpdateHouseAwbData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateHouseAwbData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId } )); + return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, hawbId, officeId } = variables; + const updateKeys = [keys.getHouseAwbData(positionId, hawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteHouseAwb` + * @summary Delete House AWB document + * @permission Requires `canUseDeleteHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } House AWB document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewHouseAwb` - recommended when file should be cached + * @summary Preview House AWB document + * @permission Requires `canUsePreviewHouseAwb` ability + * @param { string } object.positionId Path parameter + * @param { string } object.hawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseAwb = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewHouseAwbMutation` - recommended when file should not be cached + * @summary Preview House AWB document + * @permission Requires `canUsePreviewHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, hawbId, officeId } = variables; + const updateKeys = [keys.previewHouseAwb(positionId, hawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateHouseAwb` + * @summary Generate House AWB document + * @permission Requires `canUseGenerateHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts new file mode 100644 index 0000000..7e3bdd2 --- /dev/null +++ b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts @@ -0,0 +1,108 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsHouseBlAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Create", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useGetHouseBlData` query ability. For global ability, omit the object parameter. + * @description Read house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseBlData` query + */ +export const canUseGetHouseBlData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useUpdateHouseBlData` mutation ability. For global ability, omit the object parameter. + * @description Update house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseBlData` mutation + */ +export const canUseUpdateHouseBlData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useDeleteHouseBl` mutation ability. For global ability, omit the object parameter. + * @description Delete house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseBl` mutation + */ +export const canUseDeleteHouseBl = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Delete", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation + */ +export const canUsePreviewHouseBl = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview house BL document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation + */ +export const canUsePreviewHouseBlEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useGenerateHouseBl` mutation ability. For global ability, omit the object parameter. + * @description Generate house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseBl` mutation + */ +export const canUseGenerateHouseBl = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate house BL document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ +export const canUseGenerateDocumentEml = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts new file mode 100644 index 0000000..c137af4 --- /dev/null +++ b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts @@ -0,0 +1,91 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseBlApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls`, + undefined, + config + ) +}; +export const getHouseBlData = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + config + ) +}; +export const updateHouseBlData = (positionId: string, houseBlId: string, officeId: string, data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteHouseBl = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + undefined, + config + ) +}; +export const previewHouseBl = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const previewHouseBlEml = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateHouseBl = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +export const generateDocumentEml = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts new file mode 100644 index 0000000..ad68756 --- /dev/null +++ b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts @@ -0,0 +1,196 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseBlModels { +/** + * HouseBlDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { number } quantityOfCopies Quantity of copies + * @property { string } date Date + * @property { string } location Location + * @property { string } signer Signer + * @property { boolean } hideSignature Hide signature + * @property { boolean } capsLock Render issuer/signer in caps lock + * @property { string } documentTitle Document title + */ +export const HouseBlDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), quantityOfCopies: z.number().describe("Quantity of copies"), date: z.iso.datetime({ offset: true }).describe("Date"), location: z.string().describe("Location"), signer: z.string().describe("Signer"), hideSignature: z.boolean().describe("Hide signature"), capsLock: z.boolean().describe("Render issuer/signer in caps lock"), documentTitle: z.string().describe("Document title") }).readonly(); +export type HouseBlDocumentSettingsDtoDTO = z.infer; + +/** + * HouseBlDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const HouseBlDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * HouseBlDocumentCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ +export const HouseBlDocumentCountryResponseDTOSchema = z.object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }).readonly(); +export type HouseBlDocumentCountryResponseDTO = z.infer; + +/** + * HouseBlDocumentPlaceResponseDTOSchema + * @type { object } + * @property { string } id ID of the place + * @property { string } name Name of the place + */ +export const HouseBlDocumentPlaceResponseDTOSchema = z.object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }).readonly(); +export type HouseBlDocumentPlaceResponseDTO = z.infer; + +/** + * HouseBlDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ +export const HouseBlDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }).readonly(); +export type HouseBlDocumentPortResponseDTO = z.infer; + +/** + * HouseBlDocumentTerminalResponseDTOSchema + * @type { object } + * @property { string } id ID of the terminal + * @property { string } name Name of the terminal + */ +export const HouseBlDocumentTerminalResponseDTOSchema = z.object({ id: z.string().describe("ID of the terminal"), name: z.string().describe("Name of the terminal") }).readonly(); +export type HouseBlDocumentTerminalResponseDTO = z.infer; + +/** + * HouseBlDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the house BL document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the house BL document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } blNumber Bill of lading number + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } exportReference Export reference number + * @property { HouseBlDocumentBusinessPartnerResponseDTO } forwarder Forwarder information for the shipment + * @property { HouseBlDocumentCountryResponseDTO } originCountry Origin country + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { CommonModels.EditorContentResponseDto } additionalTextTop Additional text for the document + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { HouseBlDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } cargoReleaseBy Delivery agent information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information + * @property { HouseBlDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information + * @property { string } precarriageByText Pre-carriage by free-text override + * @property { HouseBlDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information + * @property { string } placeOfReceiptText Place of receipt free-text override + * @property { string } vessel Name of the vessel + * @property { string } voyage Voyage number of the vessel + * @property { string } declaredValue Declared value of the shipment + * @property { number } rateOfExchange Rate of exchange of the shipment + * @property { string } currency Currency of the shipment + * @property { string } freightPayable Freight payable of the shipment + * @property { string } issuer Issuer + * @property { HouseBlDocumentPortResponseDTO } portOfLoading Port of loading information + * @property { string } portOfLoadingText Port of loading free-text override + * @property { HouseBlDocumentTerminalResponseDTO } loadingPierTerminal Loading pier/terminal information + * @property { string } loadingPierTerminalText Loading pier/terminal free-text override + * @property { HouseBlDocumentPortResponseDTO } portOfDischarge Port of discharge information + * @property { string } portOfDischargeText Port of discharge free-text override + * @property { HouseBlDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information + * @property { string } placeOfDeliveryText Place of delivery free-text override + * @property { HouseBlDocumentPlaceResponseDTO } originalsToBeReleasedAt Originals to be released at information + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { string } typeOfMove Type of move + * @property { string } placeOfIssue + * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data + * @property { HouseBlDocumentSettingsDtoDTO } settings Settings for the House BL document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ +export const HouseBlDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the house BL document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the house BL document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), blNumber: z.string().describe("Bill of lading number").nullish(), carrierBookingNumber: z.string().describe("Carrier booking number").nullish(), exportReference: z.string().describe("Export reference number").nullish(), forwarder: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Forwarder information for the shipment").nullish(), originCountry: HouseBlDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), additionalTextTop: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), versionNumber: z.number().describe("Version number of the document"), consignee: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information for the shipment"), shipper: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), cargoReleaseBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Delivery agent information for the shipment").nullish(), notify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Notify party information for the shipment"), alsoNotify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Additional notify party information"), precarriageBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), precarriageByText: z.string().describe("Pre-carriage by free-text override").nullish(), placeOfReceipt: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), placeOfReceiptText: z.string().describe("Place of receipt free-text override").nullish(), vessel: z.string().describe("Name of the vessel").nullish(), voyage: z.string().describe("Voyage number of the vessel").nullish(), declaredValue: z.string().describe("Declared value of the shipment").nullish(), rateOfExchange: z.number().describe("Rate of exchange of the shipment").nullish(), currency: z.string().describe("Currency of the shipment").nullish(), freightPayable: z.string().describe("Freight payable of the shipment").nullish(), issuer: z.string().describe("Issuer").nullish(), portOfLoading: HouseBlDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), portOfLoadingText: z.string().describe("Port of loading free-text override").nullish(), loadingPierTerminal: HouseBlDocumentTerminalResponseDTOSchema.describe("Loading pier/terminal information").nullish(), loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override").nullish(), portOfDischarge: HouseBlDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), portOfDischargeText: z.string().describe("Port of discharge free-text override").nullish(), placeOfDelivery: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), placeOfDeliveryText: z.string().describe("Place of delivery free-text override").nullish(), originalsToBeReleasedAt: HouseBlDocumentPlaceResponseDTOSchema.describe("Originals to be released at information").nullish(), originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override").nullish(), typeOfMove: z.string().describe("Type of move").nullish(), placeOfIssue: z.string().nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), settings: HouseBlDocumentSettingsDtoDTOSchema.describe("Settings for the House BL document").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document") }).readonly(); +export type HouseBlDocumentResponseDTO = z.infer; + +/** + * UpdateHouseBlDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { number } quantityOfCopies Quantity of copies + * @property { string } blNumber BL number + * @property { string } exportReference Export reference number + * @property { string } location Location + * @property { string } signer Signer + * @property { boolean } hideSignature Hide signature + * @property { boolean } capsLock Render issuer/signer in caps lock + * @property { string } date Date + * @property { string } documentTitle Document title + */ +export const UpdateHouseBlDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), quantityOfCopies: z.number().describe("Quantity of copies"), blNumber: z.string().describe("BL number"), exportReference: z.string().describe("Export reference number"), location: z.string().describe("Location"), signer: z.string().describe("Signer"), hideSignature: z.boolean().describe("Hide signature"), capsLock: z.boolean().describe("Render issuer/signer in caps lock"), date: z.iso.datetime({ offset: true }).describe("Date"), documentTitle: z.string().describe("Document title") }).readonly(); +export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; + +/** + * UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateHouseBlDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } blNumber Bill of lading number + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } exportReference Export reference number + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } forwarder Forwarder information + * @property { string } originCountryId Origin country ID + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } declaredValue Declared value + * @property { number } rateOfExchange Rate of exchange + * @property { string } freightPayable Freight payable + * @property { string } issuer Issuer + * @property { string } placeOfIssue Place of issue + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text + * @property { CommonModels.EditorContentUpdateDto } additionalTextTop Additional text top + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } notify Notify party information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } cargoReleaseBy Cargo release party information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information + * @property { string } precarriageById Pre-carriage by ID + * @property { string } precarriageByText Pre-carriage by free-text override + * @property { string } placeOfReceiptId Place of receipt ID + * @property { string } placeOfReceiptText Place of receipt free-text override + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } portOfLoadingId Port of loading ID + * @property { string } portOfLoadingText Port of loading free-text override + * @property { string } loadingPierTerminalId Loading pier/terminal ID + * @property { string } loadingPierTerminalText Loading pier/terminal free-text override + * @property { string } portOfDischargeId Port of discharge ID + * @property { string } portOfDischargeText Port of discharge free-text override + * @property { string } placeOfDeliveryId Place of delivery ID + * @property { string } placeOfDeliveryText Place of delivery free-text override + * @property { string } originalsToBeReleasedAtId Originals to be released at ID + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { string } typeOfMove Type of move + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { UpdateHouseBlDocumentSettingsRequestDTO } settings Settings + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data + */ +export const UpdateHouseBlDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), blNumber: z.string().describe("Bill of lading number"), carrierBookingNumber: z.string().describe("Carrier booking number"), exportReference: z.string().describe("Export reference number"), forwarder: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), originCountryId: z.string().describe("Origin country ID"), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), declaredValue: z.string().describe("Declared value"), rateOfExchange: z.number().describe("Rate of exchange"), freightPayable: z.string().describe("Freight payable"), issuer: z.string().describe("Issuer"), placeOfIssue: z.string().describe("Place of issue"), additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), additionalTextTop: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text top"), consignee: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), shipper: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), notify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), cargoReleaseBy: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Cargo release party information"), alsoNotify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), precarriageById: z.string().describe("Pre-carriage by ID"), precarriageByText: z.string().describe("Pre-carriage by free-text override"), placeOfReceiptId: z.string().describe("Place of receipt ID"), placeOfReceiptText: z.string().describe("Place of receipt free-text override"), vessel: z.string().describe("Vessel name"), voyage: z.string().describe("Voyage number"), portOfLoadingId: z.string().describe("Port of loading ID"), portOfLoadingText: z.string().describe("Port of loading free-text override"), loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override"), portOfDischargeId: z.string().describe("Port of discharge ID"), portOfDischargeText: z.string().describe("Port of discharge free-text override"), placeOfDeliveryId: z.string().describe("Place of delivery ID"), placeOfDeliveryText: z.string().describe("Place of delivery free-text override"), originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), typeOfMove: z.string().describe("Type of move"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), settings: UpdateHouseBlDocumentSettingsRequestDTOSchema.describe("Settings"), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data") }).readonly(); +export type UpdateHouseBlDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts new file mode 100644 index 0000000..ea0ca6a --- /dev/null +++ b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts @@ -0,0 +1,297 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsHouseBlAcl } from "./workingDocumentsHouseBl.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsHouseBlApi } from "./workingDocumentsHouseBl.api"; + +export namespace WorkingDocumentsHouseBlQueries { +export const moduleName = QueryModule.WorkingDocumentsHouseBl; + +export const keys = { + all: [moduleName] as const, + getHouseBlData: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId", positionId, houseBlId, officeId] as const, + previewHouseBl: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview", positionId, houseBlId, officeId] as const, + previewHouseBlEml: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview/eml", positionId, houseBlId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a house BL document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId } )); + return WorkingDocumentsHouseBlApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetHouseBlData` + * @summary Get house BL document data + * @permission Requires `canUseGetHouseBlData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetHouseBlData = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId } )); + return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateHouseBlData` + * @summary Update house BL document data + * @permission Requires `canUseUpdateHouseBlData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateHouseBlData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId } )); + return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.getHouseBlData(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteHouseBl` + * @summary Delete house BL document + * @permission Requires `canUseDeleteHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } House BL document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteHouseBl = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewHouseBl` - recommended when file should be cached + * @summary Preview house BL document + * @permission Requires `canUsePreviewHouseBl` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBl = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewHouseBlMutation` - recommended when file should not be cached + * @summary Preview house BL document + * @permission Requires `canUsePreviewHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewHouseBlEml` - recommended when file should be cached + * @summary Preview house BL document and return EML file + * @permission Requires `canUsePreviewHouseBlEml` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBlEml = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewHouseBlEmlMutation` - recommended when file should not be cached + * @summary Preview house BL document and return EML file + * @permission Requires `canUsePreviewHouseBlEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBlEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateHouseBl` + * @summary Generate house BL document + * @permission Requires `canUseGenerateHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateHouseBl = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate house BL document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId } )); + return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts new file mode 100644 index 0000000..99aadd5 --- /dev/null +++ b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsIsfFormAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Create", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `useGetIsfData` query ability. For global ability, omit the object parameter. + * @description Read ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetIsfData` query + */ +export const canUseGetIsfData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `useUpdateIsfData` mutation ability. For global ability, omit the object parameter. + * @description Update ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIsfData` mutation + */ +export const canUseUpdateIsfData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `useDeleteIsf` mutation ability. For global ability, omit the object parameter. + * @description Delete ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteIsf` mutation + */ +export const canUseDeleteIsf = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Delete", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `usePreviewIsf` query or `usePreviewIsfMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewIsf` query or `usePreviewIsfMutation` mutation + */ +export const canUsePreviewIsf = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `useGenerateIsf` mutation ability. For global ability, omit the object parameter. + * @description Generate ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIsf` mutation + */ +export const canUseGenerateIsf = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts new file mode 100644 index 0000000..a618bc0 --- /dev/null +++ b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsIsfFormApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs`, + undefined, + config + ) +}; +export const getIsfData = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + config + ) +}; +export const updateIsfData = (positionId: string, isfId: string, officeId: string, data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + undefined, + config + ) +}; +export const previewIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateIsf = (positionId: string, isfId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts new file mode 100644 index 0000000..7e851f1 --- /dev/null +++ b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts @@ -0,0 +1,154 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsIsfFormModels { +/** + * IsfDocumentCargoCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ +export const IsfDocumentCargoCountryResponseDTOSchema = z.object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }).readonly(); +export type IsfDocumentCargoCountryResponseDTO = z.infer; + +/** + * IsfDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } productCode Product code of the cargo + * @property { string } descriptionOfGoods Description of goods + * @property { string } htsCode HTS code of the cargo + * @property { string } manufacturerSupplier Manufacturer supplier of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + * @property { IsfDocumentCargoCountryResponseDTO } countryOfOrigin Country of origin of the cargo + */ +export const IsfDocumentCargoResponseDTOSchema = z.object({ productCode: z.string().describe("Product code of the cargo"), descriptionOfGoods: z.string().describe("Description of goods"), htsCode: z.string().describe("HTS code of the cargo"), manufacturerSupplier: z.string().describe("Manufacturer supplier of the cargo"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo"), countryOfOrigin: IsfDocumentCargoCountryResponseDTOSchema.describe("Country of origin of the cargo") }).readonly(); +export type IsfDocumentCargoResponseDTO = z.infer; + +/** + * IsfDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ +export const IsfDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }).readonly(); +export type IsfDocumentPortResponseDTO = z.infer; + +/** + * IsfDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + * @property { string } number Number of the business partner + */ +export const IsfDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner"), number: z.string().describe("Number of the business partner") }).readonly(); +export type IsfDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * IsfDocumentContainerLocationResponseDTOSchema + * @type { object } + * @property { string } id ID of the container location + * @property { string } name Name of the container location + * @property { string } address Address of the container location + */ +export const IsfDocumentContainerLocationResponseDTOSchema = z.object({ id: z.string().describe("ID of the container location"), name: z.string().describe("Name of the container location"), address: z.string().describe("Address of the container location") }).readonly(); +export type IsfDocumentContainerLocationResponseDTO = z.infer; + +/** + * IsfDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { number } versionNumber Version number of the document + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } hBLNumber HBL number + * @property { string } mBLNumber MBL number + * @property { string } scacCodeHBL SCAC code for HBL + * @property { string } scacCodeMBL SCAC code for MBL + * @property { IsfDocumentPortResponseDTO } portOfDischarge Port of discharge + * @property { string } issueLocation Issue location + * @property { string } issueDate Issue date + * @property { string } companyName Company name + * @property { object } completedBy + * @property { string } completedBy.name + * @property { string } completedBy.email + * @property { object } container + * @property { string } container.id + * @property { string } container.name + * @property { IsfDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { IsfDocumentBusinessPartnerResponseDTO } manufacturer Manufacturer information + * @property { IsfDocumentBusinessPartnerResponseDTO } seller Seller information + * @property { IsfDocumentBusinessPartnerResponseDTO } buyer Buyer information + * @property { IsfDocumentBusinessPartnerResponseDTO } consolidator Consolidator information + * @property { IsfDocumentContainerLocationResponseDTO } containerLocation Container location information + * @property { IsfDocumentBusinessPartnerResponseDTO } shipTo Ship to information + * @property { IsfDocumentBusinessPartnerResponseDTO } importer Importer information + * @property { IsfDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + */ +export const IsfDocumentResponseDTOSchema = z.object({ id: z.string().describe("ID of the document"), name: z.string().describe("Name of the document"), nameSuffix: z.string().describe("Name suffix of the document").nullish(), defaultFileName: z.string(), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), versionNumber: z.number().describe("Version number of the document"), vessel: z.string().describe("Vessel name").nullish(), voyage: z.string().describe("Voyage number").nullish(), hBLNumber: z.string().describe("HBL number").nullish(), mBLNumber: z.string().describe("MBL number").nullish(), scacCodeHBL: z.string().describe("SCAC code for HBL").nullish(), scacCodeMBL: z.string().describe("SCAC code for MBL").nullish(), portOfDischarge: IsfDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), issueLocation: z.string().describe("Issue location").nullish(), issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), companyName: z.string().describe("Company name").nullish(), completedBy: z.object({ name: z.string(), email: z.string() }).readonly().nullish(), container: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), consignee: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), manufacturer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Manufacturer information").nullish(), seller: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Seller information").nullish(), buyer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Buyer information").nullish(), consolidator: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consolidator information").nullish(), containerLocation: IsfDocumentContainerLocationResponseDTOSchema.describe("Container location information").nullish(), shipTo: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Ship to information").nullish(), importer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Importer information").nullish(), cargo: z.array(IsfDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish() }).readonly(); +export type IsfDocumentResponseDTO = z.infer; + +/** + * UpdateIsfDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + * @property { string } number Business partner number + */ +export const UpdateIsfDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address"), number: z.string().describe("Business partner number") }).readonly(); +export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateIsfDocumentCargoRequestDTOSchema + * @type { object } + * @property { string } productCode Product code + * @property { string } descriptionOfGoods Description of goods + * @property { string } htsCode HTS code + * @property { string } manufacturerSupplier Manufacturer supplier + * @property { string } countryOfOriginId Country of origin ID + */ +export const UpdateIsfDocumentCargoRequestDTOSchema = z.object({ productCode: z.string().describe("Product code"), descriptionOfGoods: z.string().describe("Description of goods"), htsCode: z.string().describe("HTS code"), manufacturerSupplier: z.string().describe("Manufacturer supplier"), countryOfOriginId: z.string().describe("Country of origin ID") }).readonly(); +export type UpdateIsfDocumentCargoRequestDTO = z.infer; + +/** + * UpdateIsfDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } hBLNumber HBL number + * @property { string } mBLNumber MBL number + * @property { string } scacCodeHBL SCAC code for HBL + * @property { string } scacCodeMBL SCAC code for MBL + * @property { string } portOfDischargeId Port of discharge Id + * @property { string } issueLocation Issue location + * @property { string } issueDate Issue date + * @property { string } companyName Company name + * @property { string } completedByName Completed by name + * @property { string } completedByEmail Completed by email + * @property { string } containerId Container ID + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } manufacturer Manufacturer information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } seller Seller information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } buyer Buyer information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consolidator Consolidator information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } containerLocation Container location information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } shipTo Ship to information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } importer Importer information + * @property { UpdateIsfDocumentCargoRequestDTO[] } cargo Cargo information + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateIsfDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), vessel: z.string().describe("Vessel name"), voyage: z.string().describe("Voyage number"), hBLNumber: z.string().describe("HBL number"), mBLNumber: z.string().describe("MBL number"), scacCodeHBL: z.string().describe("SCAC code for HBL"), scacCodeMBL: z.string().describe("SCAC code for MBL"), portOfDischargeId: z.string().describe("Port of discharge Id"), issueLocation: z.string().describe("Issue location"), issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), companyName: z.string().describe("Company name"), completedByName: z.string().describe("Completed by name"), completedByEmail: z.string().describe("Completed by email"), containerId: z.string().describe("Container ID"), consignee: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), manufacturer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Manufacturer information"), seller: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), buyer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), consolidator: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consolidator information"), containerLocation: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Container location information"), shipTo: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Ship to information"), importer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Importer information"), cargo: z.array(UpdateIsfDocumentCargoRequestDTOSchema).readonly().describe("Cargo information"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateIsfDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts new file mode 100644 index 0000000..7974d64 --- /dev/null +++ b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsIsfFormAcl } from "./workingDocumentsIsfForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsIsfFormApi } from "./workingDocumentsIsfForm.api"; + +export namespace WorkingDocumentsIsfFormQueries { +export const moduleName = QueryModule.WorkingDocumentsIsfForm; + +export const keys = { + all: [moduleName] as const, + getIsfData: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId", positionId, isfId, officeId] as const, + previewIsf: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId/preview", positionId, isfId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an ISF document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId } )); + return WorkingDocumentsIsfFormApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetIsfData` + * @summary Get ISF document data + * @permission Requires `canUseGetIsfData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.isfId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetIsfData = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getIsfData(positionId, isfId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId } )); + return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateIsfData` + * @summary Update ISF document data + * @permission Requires `canUseUpdateIsfData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateIsfData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId, data }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId } )); + return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, isfId, officeId } = variables; + const updateKeys = [keys.getIsfData(positionId, isfId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteIsf` + * @summary Delete ISF document + * @permission Requires `canUseDeleteIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } ISF document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteIsf = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewIsf` - recommended when file should be cached + * @summary Preview ISF document + * @permission Requires `canUsePreviewIsf` ability + * @param { string } object.positionId Path parameter + * @param { string } object.isfId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewIsf = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewIsf(positionId, isfId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewIsfMutation` - recommended when file should not be cached + * @summary Preview ISF document + * @permission Requires `canUsePreviewIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewIsfMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, isfId, officeId } = variables; + const updateKeys = [keys.previewIsf(positionId, isfId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateIsf` + * @summary Generate ISF document + * @permission Requires `canUseGenerateIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateIsf = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId, data }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts new file mode 100644 index 0000000..10d4871 --- /dev/null +++ b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsMasterAwbAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Create", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `useGetMasterAwbData` query ability. For global ability, omit the object parameter. + * @description Read Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMasterAwbData` query + */ +export const canUseGetMasterAwbData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `useUpdateMasterAwbData` mutation ability. For global ability, omit the object parameter. + * @description Update Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateMasterAwbData` mutation + */ +export const canUseUpdateMasterAwbData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `useDeleteMasterAwb` mutation ability. For global ability, omit the object parameter. + * @description Delete Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteMasterAwb` mutation + */ +export const canUseDeleteMasterAwb = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Delete", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation + */ +export const canUsePreviewMasterAwb = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `useGenerateMasterAwb` mutation ability. For global ability, omit the object parameter. + * @description Generate Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateMasterAwb` mutation + */ +export const canUseGenerateMasterAwb = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts new file mode 100644 index 0000000..905a525 --- /dev/null +++ b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsMasterAwbApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs`, + undefined, + config + ) +}; +export const getMasterAwbData = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + config + ) +}; +export const updateMasterAwbData = (positionId: string, mawbId: string, officeId: string, data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteMasterAwb = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + undefined, + config + ) +}; +export const previewMasterAwb = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateMasterAwb = (positionId: string, mawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts new file mode 100644 index 0000000..4483704 --- /dev/null +++ b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts @@ -0,0 +1,176 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsMasterAwbModels { +/** + * MasterAwbDocumentOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + * @property { string } name Name + */ +export const MasterAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID").nullish(), sellRate: z.number().describe("Sell rate"), name: z.string().describe("Name").nullish() }).readonly(); +export type MasterAwbDocumentOtherChargeDTO = z.infer; + +/** + * MasterAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { number } totalOtherCharges Total other charges + * @property { number } total Total + * @property { MasterAwbDocumentOtherChargeDTO[] } otherCharges Other charges + */ +export const MasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), totalOtherCharges: z.number().describe("Total other charges"), total: z.number().describe("Total"), otherCharges: z.array(MasterAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); +export type MasterAwbDocumentChargesDTO = z.infer; + +/** + * MasterAwbDocumentCargoDTOSchema + * @type { object } + * @property { number } quantity Quantity + * @property { number } grossWeight Gross weight + * @property { string } rateClass Rate class + * @property { string } commodityItemNo Commodity item number + * @property { number } rateOrCharge Rate or charge + * @property { number } total Total + * @property { string } description Description + */ +export const MasterAwbDocumentCargoDTOSchema = z.object({ quantity: z.number().describe("Quantity"), grossWeight: z.number().describe("Gross weight").nullish(), rateClass: z.string().describe("Rate class").nullish(), commodityItemNo: z.string().describe("Commodity item number").nullish(), rateOrCharge: z.number().describe("Rate or charge").nullish(), total: z.number().describe("Total").nullish(), description: z.string().describe("Description").nullish() }).readonly(); +export type MasterAwbDocumentCargoDTO = z.infer; + +/** + * MasterAwbDocumentRouteDTOSchema + * @type { object } + * @property { string } airportOfDeparture Airport of departure + * @property { string } airportOfDestination Airport of destination + * @property { string } toAirport1 To airport 1 + * @property { string } byCarrier1 By carrier 1 + * @property { string } toAirport2 To airport 2 + * @property { string } byCarrier2 By carrier 2 + * @property { string } toAirport3 To airport 3 + * @property { string } byCarrier3 By carrier 3 + * @property { string } flightNumber1 Flight number 1 + * @property { string } flightDay1 Flight day 1 + * @property { string } flightNumber2 Flight number 2 + * @property { string } flightDay2 Flight day 2 + */ +export const MasterAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string().describe("Airport of departure"), airportOfDestination: z.string().describe("Airport of destination"), toAirport1: z.string().describe("To airport 1").nullish(), byCarrier1: z.string().describe("By carrier 1").nullish(), toAirport2: z.string().describe("To airport 2").nullish(), byCarrier2: z.string().describe("By carrier 2").nullish(), toAirport3: z.string().describe("To airport 3").nullish(), byCarrier3: z.string().describe("By carrier 3").nullish(), flightNumber1: z.string().describe("Flight number 1").nullish(), flightDay1: z.string().describe("Flight day 1").nullish(), flightNumber2: z.string().describe("Flight number 2").nullish(), flightDay2: z.string().describe("Flight day 2").nullish() }).readonly(); +export type MasterAwbDocumentRouteDTO = z.infer; + +/** + * MasterAwbDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const MasterAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * MasterAwbDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the Master AWB document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the Master AWB document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } currency Currency + * @property { number } versionNumber Version number of the document + * @property { string } mawbNumber MAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { MasterAwbDocumentCargoDTO[] } cargo Cargo packages + * @property { MasterAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } signingLocation Signing location + * @property { string } issuerIataCode Issuer IATA code + * @property { number } exchangeRate Exchange rate + * @property { MasterAwbDocumentRouteDTO } route Route + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } issuer Issuer + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { CommonModels.DocumentConfigDTO } config Config + */ +export const MasterAwbDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the Master AWB document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference"), name: z.string().describe("Name of the Master AWB document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), currency: z.string().describe("Currency").nullish(), versionNumber: z.number().describe("Version number of the document"), mawbNumber: z.string().describe("MAWB number").nullish(), sciReference: z.string().describe("SCI reference").nullish(), reference1: z.string().describe("Reference 1").nullish(), reference2: z.string().describe("Reference 2").nullish(), reference3: z.string().describe("Reference 3").nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), handlingInstructions: z.string().describe("Handling instructions").nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), cargo: z.array(MasterAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), charges: MasterAwbDocumentChargesDTOSchema.describe("Charges").nullish(), shipperSigner: z.string().describe("Shipper signer").nullish(), shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), signer: z.string().describe("Signer").nullish(), signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), signingLocation: z.string().describe("Signing location").nullish(), issuerIataCode: z.string().describe("Issuer IATA code").nullish(), exchangeRate: z.number().describe("Exchange rate").nullish(), route: MasterAwbDocumentRouteDTOSchema.describe("Route").nullish(), consignee: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), shipper: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), issuer: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish() }).readonly(); +export type MasterAwbDocumentResponseDTO = z.infer; + +/** + * UpdateMasterAwbDocumentChargesOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + */ +export const UpdateMasterAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }).readonly(); +export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer; + +/** + * UpdateMasterAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { UpdateMasterAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges + */ +export const UpdateMasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), otherCharges: z.array(UpdateMasterAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); +export type UpdateMasterAwbDocumentChargesDTO = z.infer; + +/** + * UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateMasterAwbDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } mawbNumber MAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { UpdateMasterAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } issuerId Issuer ID + * @property { string } issuerName Issuer name + * @property { string } issuerAddress Issuer address + * @property { string } issuerCity Issuer city + * @property { string } issuerIataCode Issuer IATA code + * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateMasterAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), mawbNumber: z.string().describe("MAWB number"), sciReference: z.string().describe("SCI reference"), reference1: z.string().describe("Reference 1"), reference2: z.string().describe("Reference 2"), reference3: z.string().describe("Reference 3"), additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text for the document"), handlingInstructions: z.string().describe("Handling instructions"), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), additionalAccountingNotes: z.string().describe("Additional accounting notes"), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), charges: UpdateMasterAwbDocumentChargesDTOSchema.describe("Charges"), shipperSigner: z.string().describe("Shipper signer"), shipperSignerUserName: z.string().describe("Shipper signer user name"), signer: z.string().describe("Signer"), signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), issuerId: z.string().describe("Issuer ID"), issuerName: z.string().describe("Issuer name"), issuerAddress: z.string().describe("Issuer address"), issuerCity: z.string().describe("Issuer city"), issuerIataCode: z.string().describe("Issuer IATA code"), consignee: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), shipper: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), exchangeRate: z.number().describe("Exchange rate"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateMasterAwbDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts new file mode 100644 index 0000000..89bd2fa --- /dev/null +++ b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsMasterAwbAcl } from "./workingDocumentsMasterAwb.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsMasterAwbApi } from "./workingDocumentsMasterAwb.api"; + +export namespace WorkingDocumentsMasterAwbQueries { +export const moduleName = QueryModule.WorkingDocumentsMasterAwb; + +export const keys = { + all: [moduleName] as const, + getMasterAwbData: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId", positionId, mawbId, officeId] as const, + previewMasterAwb: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId/preview", positionId, mawbId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a Master AWB document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId } )); + return WorkingDocumentsMasterAwbApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetMasterAwbData` + * @summary Get Master AWB document data + * @permission Requires `canUseGetMasterAwbData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.mawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetMasterAwbData = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId } )); + return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateMasterAwbData` + * @summary Update Master AWB document data + * @permission Requires `canUseUpdateMasterAwbData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateMasterAwbData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId, data }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId } )); + return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, mawbId, officeId } = variables; + const updateKeys = [keys.getMasterAwbData(positionId, mawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteMasterAwb` + * @summary Delete Master AWB document + * @permission Requires `canUseDeleteMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Master AWB document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewMasterAwb` - recommended when file should be cached + * @summary Preview Master AWB document + * @permission Requires `canUsePreviewMasterAwb` ability + * @param { string } object.positionId Path parameter + * @param { string } object.mawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewMasterAwb = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewMasterAwbMutation` - recommended when file should not be cached + * @summary Preview Master AWB document + * @permission Requires `canUsePreviewMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewMasterAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, mawbId, officeId } = variables; + const updateKeys = [keys.previewMasterAwb(positionId, mawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateMasterAwb` + * @summary Generate Master AWB document + * @permission Requires `canUseGenerateMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId, data }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts new file mode 100644 index 0000000..ccebdd8 --- /dev/null +++ b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsTemplatedDocumentAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Create", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useGetTemplatedDocument` query ability. For global ability, omit the object parameter. + * @description Read templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetTemplatedDocument` query + */ +export const canUseGetTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useUpdateTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Update templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateTemplatedDocument` mutation + */ +export const canUseUpdateTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useDeleteTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Delete templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteTemplatedDocument` mutation + */ +export const canUseDeleteTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `usePreviewTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Preview templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewTemplatedDocument` mutation + */ +export const canUsePreviewTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useIssueTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Issue templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueTemplatedDocument` mutation + */ +export const canUseIssueTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate templated document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ +export const canUseGenerateDocumentEml = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +} diff --git a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts new file mode 100644 index 0000000..4d0042d --- /dev/null +++ b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts @@ -0,0 +1,78 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsTemplatedDocumentApi { +export const create = (positionId: string, officeId: string, data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), + config + ) +}; +export const getTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + config + ) +}; +export const updateTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), + config + ) +}; +export const deleteTemplatedDocument = (positionId: string, templatedDocumentId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + undefined, + config + ) +}; +export const previewTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const issueTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +export const generateDocumentEml = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts new file mode 100644 index 0000000..bba201a --- /dev/null +++ b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts @@ -0,0 +1,61 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsTemplatedDocumentModels { +/** + * TemplatedDocumentBlueprintDtoSchema + * @type { object } + * @property { string } templateId + * @property { string } templateName + * @property { string } capturedAt + * @property { CommonModels.TemplateBlocksResponseDTO } blocks + */ +export const TemplatedDocumentBlueprintDtoSchema = z.object({ templateId: z.string(), templateName: z.string(), capturedAt: z.string(), blocks: CommonModels.TemplateBlocksResponseDTOSchema }).readonly(); +export type TemplatedDocumentBlueprintDto = z.infer; + +/** + * TemplatedDocumentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } officeId + * @property { string } name + * @property { string } nameSuffix + * @property { string } defaultFileName + * @property { number } versionNumber + * @property { TemplatedDocumentBlueprintDto } blueprint Captured template blueprint + * @property { CommonModels.TemplatedDocumentDataDto } data Document data + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } issuedAt + */ +export const TemplatedDocumentResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), officeId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), versionNumber: z.number(), blueprint: TemplatedDocumentBlueprintDtoSchema.describe("Captured template blueprint"), data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Document data"), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), issuedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type TemplatedDocumentResponseDto = z.infer; + +/** + * UpdateTemplatedDocumentRequestDtoSchema + * @type { object } + * @property { string } nameSuffix Optional suffix for the document name + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data Partial document data to update + */ +export const UpdateTemplatedDocumentRequestDtoSchema = z.object({ nameSuffix: z.string().describe("Optional suffix for the document name"), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("Partial document data to update") }).readonly(); +export type UpdateTemplatedDocumentRequestDto = z.infer; + +/** + * CreateTemplatedDocumentRequestDtoSchema + * @type { object } + * @property { string } templateId Template ID to use for creating the document + * @property { string } nameSuffix Optional suffix for the document name + */ +export const CreateTemplatedDocumentRequestDtoSchema = z.object({ templateId: z.string().describe("Template ID to use for creating the document"), nameSuffix: z.string().describe("Optional suffix for the document name").nullish() }).readonly(); +export type CreateTemplatedDocumentRequestDto = z.infer; + +/** + * GenerateWorkingDocumentPreviewRequestDtoSchema + * @type { object } + * @property { string } issuedAt + */ +export const GenerateWorkingDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type GenerateWorkingDocumentPreviewRequestDto = z.infer; + +} diff --git a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts new file mode 100644 index 0000000..8385890 --- /dev/null +++ b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts @@ -0,0 +1,217 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsTemplatedDocumentAcl } from "./workingDocumentsTemplatedDocument.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsTemplatedDocumentApi } from "./workingDocumentsTemplatedDocument.api"; + +export namespace WorkingDocumentsTemplatedDocumentQueries { +export const moduleName = QueryModule.WorkingDocumentsTemplatedDocument; + +export const keys = { + all: [moduleName] as const, + getTemplatedDocument: (officeId: string, positionId: string, templatedDocumentId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/templated-documents/:templatedDocumentId", officeId, positionId, templatedDocumentId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a templated document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetTemplatedDocument` + * @summary Get templated document data + * @permission Requires `canUseGetTemplatedDocument` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.templatedDocumentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetTemplatedDocument = ({ officeId, positionId, templatedDocumentId }: { officeId: string, positionId: string, templatedDocumentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), + queryFn: () => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument(officeId, positionId, templatedDocumentId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateTemplatedDocument` + * @summary Update templated document data + * @permission Requires `canUseUpdateTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, templatedDocumentId } = variables; + const updateKeys = [keys.getTemplatedDocument(officeId, positionId, templatedDocumentId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteTemplatedDocument` + * @summary Delete templated document + * @permission Requires `canUseDeleteTemplatedDocument` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Templated document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, templatedDocumentId, officeId }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument(positionId, templatedDocumentId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `usePreviewTemplatedDocument` - recommended when file should not be cached + * @summary Preview templated document + * @permission Requires `canUsePreviewTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const usePreviewTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useIssueTemplatedDocument` + * @summary Issue templated document (generate final PDF) + * @permission Requires `canUseIssueTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useIssueTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate templated document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml(officeId, positionId, templatedDocumentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/full/zod.extended.ts b/test/generated/full/zod.extended.ts new file mode 100644 index 0000000..205405c --- /dev/null +++ b/test/generated/full/zod.extended.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; + +export namespace ZodExtended { + interface ParseOptions { + type: "body" | "query"; + name?: string; + errorHandler?: ErrorHandler; + } + + export function parse( + schema: z.ZodType, + data: unknown, + { type, name, errorHandler }: ParseOptions = { type: "body" }, + ) { + try { + return schema.parse(data); + } catch (e) { + if (e instanceof z.ZodError) { + e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; + } + (errorHandler ?? SharedErrorHandler).rethrowError(e); + throw e; + } + } + + function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { + if (data === undefined || data === "" || enumSchema.options.length === 0) { + return true; + } + + const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; + const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; + return new RegExp(`^${commaSeparatedOptions}$`).test(data); + } + + export const sortExp = (enumSchema: z.ZodEnum) => + z.string().superRefine((arg, ctx) => { + if (!isSortExpValid(enumSchema, arg)) { + ctx.addIssue({ + code: "invalid_value", + message: "Invalid sorting string.", + values: [], + }); + } + }); +} diff --git a/test/generated/next/aWBStocks/aWBStocks.acl.ts b/test/generated/next/aWBStocks/aWBStocks.acl.ts new file mode 100644 index 0000000..ab8512e --- /dev/null +++ b/test/generated/next/aWBStocks/aWBStocks.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace AWBStocksAcl { +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List AWB stocks + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Create", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get AWB stock details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useGenerateNextNumber` mutation ability. For global ability, omit the object parameter. + * @description Generate next AWB number + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateNextNumber` mutation + */ +export const canUseGenerateNextNumber = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +} diff --git a/test/generated/next/aWBStocks/aWBStocks.api.ts b/test/generated/next/aWBStocks/aWBStocks.api.ts new file mode 100644 index 0000000..a71912d --- /dev/null +++ b/test/generated/next/aWBStocks/aWBStocks.api.ts @@ -0,0 +1,71 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { AWBStocksModels } from "./aWBStocks.models"; + +export namespace AWBStocksApi { +export const paginate = (officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, + `/offices/${officeId}/awb-stocks`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: AWBStocksModels.CreateAWBStockRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks`, + ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), + config + ) +}; +export const findById = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}`, + config + ) +}; +export const update = (stockId: string, officeId: string, data: AWBStocksModels.UpdateAWBStockRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}`, + ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), + config + ) +}; +export const archive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}/archive`, + undefined, + config + ) +}; +export const unarchive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, + undefined, + config + ) +}; +export const generateNextNumber = (officeId: string, data: AWBStocksModels.GenerateAWBNumberRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/generate-number`, + ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/aWBStocks/aWBStocks.configs.ts b/test/generated/next/aWBStocks/aWBStocks.configs.ts new file mode 100644 index 0000000..66cd58d --- /dev/null +++ b/test/generated/next/aWBStocks/aWBStocks.configs.ts @@ -0,0 +1,92 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { AWBStocksModels } from "./aWBStocks.models"; +import { AWBStocksQueries } from "./aWBStocks.queries"; +import { AWBStocksAcl } from "./aWBStocks.acl"; + +export namespace AWBStocksConfigs { +export const awbStocksConfig = { + meta: { + title: "Awb Stocks", + }, + readAll: { + acl: AWBStocksAcl.canUsePaginate, + schema: AWBStocksModels.AWBStockResponseDTOSchema, + paginated: AWBStocksQueries.usePaginate, + infinite: AWBStocksQueries.usePaginateInfinite, + filters: { + schema: AWBStocksModels.AWBStockFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AWBStocksModels.AWBStockFilterDtoSchema, + options: { + inputs: { + archived: true, + carrierId: true, + searchQuery: true, + used: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: AWBStocksModels.AWBStockResponseDTOSchema, + options: { + columns: { + id: true, + carrier: true, + startNumber: true, + lastUsedNumber: true, + stock: true, + usedCodes: true, + priority: true, + archived: true, + comments: true, + createdAt: true, + updatedAt: true, + createdBy: true, + updatedBy: true, + officeId: true, + }, + sortable: AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: AWBStocksAcl.canUseFindById, + schema: AWBStocksModels.AWBStockResponseDTOSchema, + query: AWBStocksQueries.useFindById, + }, + create: { + acl: AWBStocksAcl.canUseCreate, + schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, + mutation: AWBStocksQueries.useCreate, + inputDefs: dynamicInputs({ + schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, + options: { + inputs: { + carrierId: true, + startNumber: true, + stock: true, + priority: true, + comments: true, + officeId: true, + }, + }, +}) + }, + update: { + acl: AWBStocksAcl.canUseUpdate, + schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, + mutation: AWBStocksQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, + options: { + inputs: { + comments: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/next/aWBStocks/aWBStocks.models.ts b/test/generated/next/aWBStocks/aWBStocks.models.ts new file mode 100644 index 0000000..442057c --- /dev/null +++ b/test/generated/next/aWBStocks/aWBStocks.models.ts @@ -0,0 +1,114 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace AWBStocksModels { +/** + * AWBStockBusinessPartnerPreviewDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } name Business partner name + * @property { string } carrierPrefix Carrier prefix (3 digits) + */ +export const AWBStockBusinessPartnerPreviewDTOSchema = z.object({ id: z.string().describe("Business partner ID"), name: z.string().describe("Business partner name"), carrierPrefix: z.string().describe("Carrier prefix (3 digits)") }).readonly(); +export type AWBStockBusinessPartnerPreviewDTO = z.infer; + +/** + * AWBStockEmployeePreviewDTOSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Employee email + */ +export const AWBStockEmployeePreviewDTOSchema = z.object({ id: z.string().describe("Employee ID"), email: z.string().describe("Employee email") }).readonly(); +export type AWBStockEmployeePreviewDTO = z.infer; + +/** + * AWBStockResponseDTOSchema + * @type { object } + * @property { string } id AWB stock ID + * @property { AWBStockBusinessPartnerPreviewDTO } carrier Carrier business partner + * @property { number } startNumber Start number + * @property { number } lastUsedNumber Last used number + * @property { number } stock Stock size + * @property { number } usedCodes Used codes count + * @property { number } priority Priority + * @property { boolean } archived Is archived + * @property { string } comments Comments + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { AWBStockEmployeePreviewDTO } createdBy User who created the stock + * @property { AWBStockEmployeePreviewDTO } updatedBy User who updated the stock + * @property { string } officeId Office ID + */ +export const AWBStockResponseDTOSchema = z.object({ id: z.string().describe("AWB stock ID"), carrier: AWBStockBusinessPartnerPreviewDTOSchema.describe("Carrier business partner"), startNumber: z.number().describe("Start number"), lastUsedNumber: z.number().describe("Last used number").nullish(), stock: z.number().describe("Stock size"), usedCodes: z.number().describe("Used codes count"), priority: z.number().describe("Priority"), archived: z.boolean().describe("Is archived"), comments: z.string().describe("Comments").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), createdBy: AWBStockEmployeePreviewDTOSchema.describe("User who created the stock"), updatedBy: AWBStockEmployeePreviewDTOSchema.describe("User who updated the stock").nullish(), officeId: z.string().describe("Office ID") }).readonly(); +export type AWBStockResponseDTO = z.infer; + +/** + * AWBStockFilterDtoSchema + * @type { object } + * @property { boolean } archived + * @property { string } carrierId + * @property { string } searchQuery + * @property { boolean } used + */ +export const AWBStockFilterDtoSchema = z.object({ archived: z.boolean(), carrierId: z.string(), searchQuery: z.string(), used: z.boolean() }).readonly(); +export type AWBStockFilterDto = z.infer; + +/** + * CreateAWBStockRequestDTOSchema + * @type { object } + * @property { string } carrierId Carrier business partner ID + * @property { number } startNumber Start number. Minimum: `0` + * @property { number } stock Stock size + * @property { number } priority Priority + * @property { string } comments Comments + * @property { string } officeId Office ID + */ +export const CreateAWBStockRequestDTOSchema = z.object({ carrierId: z.string().describe("Carrier business partner ID"), startNumber: z.number().gte(0).describe("Start number"), stock: z.number().describe("Stock size"), priority: z.number().describe("Priority"), comments: z.string().describe("Comments").nullish(), officeId: z.string().describe("Office ID") }).readonly(); +export type CreateAWBStockRequestDTO = z.infer; + +/** + * GenerateAWBNumberRequestDTOSchema + * @type { object } + * @property { string } carrierId Carrier ID. Example: `e847c7dd-a364-4488-bed6-1e5878aff022` + */ +export const GenerateAWBNumberRequestDTOSchema = z.object({ carrierId: z.string().describe("Carrier ID") }).readonly(); +export type GenerateAWBNumberRequestDTO = z.infer; + +/** + * GenerateAWBNumberResponseDTOSchema + * @type { object } + * @property { string } formattedAwbNumber Generated AWB number. Example: `123-45678901` + */ +export const GenerateAWBNumberResponseDTOSchema = z.object({ formattedAwbNumber: z.string().describe("Generated AWB number") }).readonly(); +export type GenerateAWBNumberResponseDTO = z.infer; + +/** + * UpdateAWBStockRequestDTOSchema + * @type { object } + * @property { string } comments Comments + */ +export const UpdateAWBStockRequestDTOSchema = z.object({ comments: z.string().describe("Comments") }).readonly(); +export type UpdateAWBStockRequestDTO = z.infer; + +/** + * AWBStocksPaginateOrderParamEnumSchema + * @type { enum } + */ +export const AWBStocksPaginateOrderParamEnumSchema = z.enum(["createdAt", "updatedAt", "createdBy", "updatedBy", "carrierName", "startNumber", "priority"]); +export type AWBStocksPaginateOrderParamEnum = z.infer; +export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSchema.enum; + +/** + * AWBStocksPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { AWBStockResponseDTO[] } items + */ +export const AWBStocksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AWBStockResponseDTOSchema).readonly() }).readonly().shape }); +export type AWBStocksPaginateResponse = z.infer; + +} diff --git a/test/generated/next/aWBStocks/aWBStocks.queries.ts b/test/generated/next/aWBStocks/aWBStocks.queries.ts new file mode 100644 index 0000000..7c0a52a --- /dev/null +++ b/test/generated/next/aWBStocks/aWBStocks.queries.ts @@ -0,0 +1,242 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AWBStocksAcl } from "./aWBStocks.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AWBStocksModels } from "./aWBStocks.models"; +import { AWBStocksApi } from "./aWBStocks.api"; + +export namespace AWBStocksQueries { +export const moduleName = QueryModule.AWBStocks; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (stockId: string, officeId: string) => [...keys.all, "/offices/:officeId/awb-stocks/:stockId", stockId, officeId] as const, +}; + +/** + * Query `usePaginate` + * @summary List AWB stocks + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` + * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); + return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary List AWB stocks + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` + * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); + return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create AWB stock + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.CreateAWBStockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(AWBStocksAcl.canUseCreate({ officeId } )); + return AWBStocksApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get AWB stock details + * @permission Requires `canUseFindById` ability + * @param { string } object.stockId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ stockId, officeId }: { stockId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(stockId, officeId), + queryFn: () => { + checkAcl(AWBStocksAcl.canUseFindById({ officeId } )); + return AWBStocksApi.findById(stockId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update AWB stock comments + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.UpdateAWBStockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId, data }) => { + checkAcl(AWBStocksAcl.canUseUpdate({ officeId } )); + return AWBStocksApi.update(stockId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive AWB stock + * @permission Requires `canUseArchive` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId }) => { + checkAcl(AWBStocksAcl.canUseArchive({ officeId } )); + return AWBStocksApi.archive(stockId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive AWB stock + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId }) => { + checkAcl(AWBStocksAcl.canUseUnarchive({ officeId } )); + return AWBStocksApi.unarchive(stockId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateNextNumber` + * @summary Generate next AWB number for carrier + * @permission Requires `canUseGenerateNextNumber` ability + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.GenerateAWBNumberRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateNextNumber = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId } )); + return AWBStocksApi.generateNextNumber(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/acl/app.ability.ts b/test/generated/next/acl/app.ability.ts new file mode 100644 index 0000000..7b598a8 --- /dev/null +++ b/test/generated/next/acl/app.ability.ts @@ -0,0 +1,32 @@ +import { PureAbility, AbilityTuple, ForcedSubject } from "@casl/ability"; + +export type AppAbilities = +| AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, } | "Office" | "Currency" | "Country" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | ForcedSubject<"Role"> & { context?: string, } | "Permission" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId?: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, } | ForcedSubject<"Office"> & { officeId: string, }> +| AbilityTuple<"Create", "Office" | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "Airport" | "Port" | "ContainerYard" | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> +| AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, } | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }> +| AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "PackageType" | "ChargeType" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> +| AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "Terminal" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }> +| AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }> +| AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> +| AbilityTuple<"ListRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> +| AbilityTuple<"UpdateRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> +| AbilityTuple<"Deactivate", "Customer"> +| AbilityTuple<"Reactivate", "Customer"> +| AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, } | "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }> +| AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> +| AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }> +| AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }> + +export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/next/acl/useAclCheck.ts b/test/generated/next/acl/useAclCheck.ts new file mode 100644 index 0000000..95b4403 --- /dev/null +++ b/test/generated/next/acl/useAclCheck.ts @@ -0,0 +1,21 @@ +import { AbilityTuple } from "@casl/ability"; +import { type ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; +import { AbilityContext } from "@povio/openapi-codegen-cli/acl"; +import { useCallback } from "react"; +import { AppAbilities } from "@/data/acl/app.ability"; + +interface UseAclCheckProps { + errorHandler?: ErrorHandler; +} + +export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { + const ability = AbilityContext.useAbility(); + + const checkAcl = useCallback((appAbility: AppAbilities) => { + if (!ability.can(...(appAbility as AbilityTuple))) { + (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); + } + }, [ability, errorHandler]); + + return { checkAcl }; +} diff --git a/test/generated/next/airPositions/airPositions.acl.ts b/test/generated/next/airPositions/airPositions.acl.ts new file mode 100644 index 0000000..6c0afca --- /dev/null +++ b/test/generated/next/airPositions/airPositions.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace AirPositionsAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get air position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update air position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/next/airPositions/airPositions.api.ts b/test/generated/next/airPositions/airPositions.api.ts new file mode 100644 index 0000000..396d280 --- /dev/null +++ b/test/generated/next/airPositions/airPositions.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { AirPositionsModels } from "./airPositions.models"; + +export namespace AirPositionsApi { +export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/air-position`, + config + ) +}; +export const update = (officeId: string, positionId: string, data: AirPositionsModels.UpdateAirPositionRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/air-position`, + ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/airPositions/airPositions.models.ts b/test/generated/next/airPositions/airPositions.models.ts new file mode 100644 index 0000000..c2dc2e1 --- /dev/null +++ b/test/generated/next/airPositions/airPositions.models.ts @@ -0,0 +1,49 @@ +import { z } from "zod"; + +export namespace AirPositionsModels { +/** + * AirPositionCustomsStatusTypeEnumSchema + * @type { enum } + */ +export const AirPositionCustomsStatusTypeEnumSchema = z.enum(["Other", "X", "C", "TD", "T1"]); +export type AirPositionCustomsStatusTypeEnum = z.infer; +export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnumSchema.enum; + +/** + * AirPositionResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } hawbNumber + * @property { string } mawbNumber + * @property { string } airlineDeadline + * @property { string } customsStatus + * @property { AirPositionCustomsStatusTypeEnum } customsStatusType + * @property { boolean } hawbRequired + * @property { boolean } mawbRequired + * @property { string } mrnT1Number + * @property { boolean } isCourier + * @property { string } deliveryToConsignee + * @property { string } createdAt + * @property { string } updatedAt + */ +export const AirPositionResponseDTOSchema = z.object({ id: z.string(), hawbNumber: z.string().nullish(), mawbNumber: z.string().nullish(), airlineDeadline: z.iso.datetime({ offset: true }).nullish(), customsStatus: z.string().nullish(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), mrnT1Number: z.string().nullish(), isCourier: z.boolean().nullish(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type AirPositionResponseDTO = z.infer; + +/** + * UpdateAirPositionRequestDTOSchema + * @type { object } + * @property { string } hawbNumber + * @property { string } mawbNumber + * @property { string } airlineDeadline + * @property { string } customsStatus + * @property { AirPositionCustomsStatusTypeEnum } customsStatusType + * @property { string } mrnT1Number + * @property { boolean } hawbRequired + * @property { boolean } mawbRequired + * @property { boolean } isCourier + * @property { string } deliveryToConsignee + */ +export const UpdateAirPositionRequestDTOSchema = z.object({ hawbNumber: z.string(), mawbNumber: z.string(), airlineDeadline: z.iso.datetime({ offset: true }), customsStatus: z.string(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema, mrnT1Number: z.string(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), isCourier: z.boolean(), deliveryToConsignee: z.iso.datetime({ offset: true }) }).readonly(); +export type UpdateAirPositionRequestDTO = z.infer; + +} diff --git a/test/generated/next/airPositions/airPositions.queries.ts b/test/generated/next/airPositions/airPositions.queries.ts new file mode 100644 index 0000000..42c382c --- /dev/null +++ b/test/generated/next/airPositions/airPositions.queries.ts @@ -0,0 +1,71 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AirPositionsAcl } from "./airPositions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AirPositionsModels } from "./airPositions.models"; +import { AirPositionsApi } from "./airPositions.api"; + +export namespace AirPositionsQueries { +export const moduleName = QueryModule.AirPositions; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/air-position", officeId, positionId] as const, +}; + +/** + * Query `useGet` + * @summary Get air position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(AirPositionsAcl.canUseGet({ officeId } )); + return AirPositionsApi.get(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update air position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AirPositionsModels.UpdateAirPositionRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(AirPositionsAcl.canUseUpdate({ officeId } )); + return AirPositionsApi.update(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/airports/airports.acl.ts b/test/generated/next/airports/airports.acl.ts new file mode 100644 index 0000000..1af795c --- /dev/null +++ b/test/generated/next/airports/airports.acl.ts @@ -0,0 +1,54 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace AirportsAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Airport" +] as AbilityTuple<"Read", "Airport">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Airport" +] as AbilityTuple<"Create", "Airport">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Airport" +] as AbilityTuple<"Read", "Airport">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Airport" +] as AbilityTuple<"Update", "Airport">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Airport" +] as AbilityTuple<"Read", "Airport">; + +} diff --git a/test/generated/next/airports/airports.api.ts b/test/generated/next/airports/airports.api.ts new file mode 100644 index 0000000..13b15e1 --- /dev/null +++ b/test/generated/next/airports/airports.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { AirportsModels } from "./airports.models"; + +export namespace AirportsApi { +export const paginate = (limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AirportsModels.AirportsPaginateResponseSchema }, + `/airports`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: AirportsModels.CreateAirportRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports`, + ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, + `/airports/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports/${id}`, + ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports/${id}`, + config + ) +}; +} diff --git a/test/generated/next/airports/airports.configs.ts b/test/generated/next/airports/airports.configs.ts new file mode 100644 index 0000000..9b47119 --- /dev/null +++ b/test/generated/next/airports/airports.configs.ts @@ -0,0 +1,118 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { AirportsModels } from "./airports.models"; +import { CommonModels } from "@/data/common/common.models"; +import { AirportsQueries } from "./airports.queries"; +import { AirportsAcl } from "./airports.acl"; + +export namespace AirportsConfigs { +export const airportsConfig = { + meta: { + title: "Airports", + }, + readAll: { + acl: AirportsAcl.canUsePaginate, + schema: AirportsModels.AirportResponseDTOSchema, + paginated: AirportsQueries.usePaginate, + infinite: AirportsQueries.usePaginateInfinite, + filters: { + schema: AirportsModels.AirportPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AirportsModels.AirportPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: AirportsModels.AirportResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + iataCode: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: AirportsModels.AirportsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: AirportsAcl.canUseFindById, + schema: AirportsModels.AirportResponseDTOSchema, + query: AirportsQueries.useFindById, + }, + create: { + acl: AirportsAcl.canUseCreate, + schema: AirportsModels.CreateAirportRequestDTOSchema, + mutation: AirportsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: AirportsModels.CreateAirportRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + iataCode: true, + }, + }, +}) + }, + update: { + acl: AirportsAcl.canUseUpdate, + schema: AirportsModels.UpdateAirportRequestDTOSchema, + mutation: AirportsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: AirportsModels.UpdateAirportRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + iataCode: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: AirportsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: AirportsQueries.usePaginateLabels, + infinite: AirportsQueries.usePaginateLabelsInfinite, + filters: { + schema: AirportsModels.AirportLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AirportsModels.AirportLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/airports/airports.models.ts b/test/generated/next/airports/airports.models.ts new file mode 100644 index 0000000..d1d7c6c --- /dev/null +++ b/test/generated/next/airports/airports.models.ts @@ -0,0 +1,109 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace AirportsModels { +/** + * AirportEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type AirportEmployeeDTO = z.infer; + +/** + * AirportResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the airport + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + * @property { string } createdById + * @property { AirportEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { AirportEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const AirportResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the airport"), name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport"), createdById: z.string().nullish(), createdBy: AirportEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: AirportEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type AirportResponseDTO = z.infer; + +/** + * AirportPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter airports by name, match code or IATA code + */ +export const AirportPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter airports by name, match code or IATA code") }).readonly(); +export type AirportPaginationFilterDto = z.infer; + +/** + * AirportLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const AirportLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type AirportLabelFilterDto = z.infer; + +/** + * CreateAirportRequestDTOSchema + * @type { object } + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + */ +export const CreateAirportRequestDTOSchema = z.object({ name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport") }).readonly(); +export type CreateAirportRequestDTO = z.infer; + +/** + * UpdateAirportRequestDTOSchema + * @type { object } + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + */ +export const UpdateAirportRequestDTOSchema = z.object({ name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport") }).readonly(); +export type UpdateAirportRequestDTO = z.infer; + +/** + * AirportsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const AirportsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type AirportsPaginateOrderParamEnum = z.infer; +export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSchema.enum; + +/** + * AirportsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { AirportResponseDTO[] } items + */ +export const AirportsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AirportResponseDTOSchema).readonly() }).readonly().shape }); +export type AirportsPaginateResponse = z.infer; + +/** + * AirportsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const AirportsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type AirportsPaginateLabelsOrderParamEnum = z.infer; +export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * AirportsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const AirportsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type AirportsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/airports/airports.queries.ts b/test/generated/next/airports/airports.queries.ts new file mode 100644 index 0000000..027bf29 --- /dev/null +++ b/test/generated/next/airports/airports.queries.ts @@ -0,0 +1,209 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { AirportsAcl } from "./airports.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { AirportsModels } from "./airports.models"; +import { AirportsApi } from "./airports.api"; + +export namespace AirportsQueries { +export const moduleName = QueryModule.Airports; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string) => [...keys.all, "/airports", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string) => [...keys.all, "/airports/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/airports/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Airports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AirportsAcl.canUsePaginate()); + return AirportsApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Airports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AirportsAcl.canUsePaginate()); + return AirportsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create airport + * @permission Requires `canUseCreate` ability + * @param { AirportsModels.CreateAirportRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(AirportsAcl.canUseCreate()); + return AirportsApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate airports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AirportsAcl.canUsePaginateLabels()); + return AirportsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate airports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AirportsAcl.canUsePaginateLabels()); + return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update airport + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { AirportsModels.UpdateAirportRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(AirportsAcl.canUseUpdate()); + return AirportsApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get airport + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(AirportsAcl.canUseFindById()); + return AirportsApi.findById(id, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/app-rest-client.ts b/test/generated/next/app-rest-client.ts new file mode 100644 index 0000000..dc174bc --- /dev/null +++ b/test/generated/next/app-rest-client.ts @@ -0,0 +1,7 @@ +import { RestClient } from "@povio/openapi-codegen-cli"; + +export const AppRestClient = new RestClient({ + config: { + baseURL: "http://localhost:4000" + }, +}); diff --git a/test/generated/next/bankAccounts/bankAccounts.acl.ts b/test/generated/next/bankAccounts/bankAccounts.acl.ts new file mode 100644 index 0000000..18ce4b2 --- /dev/null +++ b/test/generated/next/bankAccounts/bankAccounts.acl.ts @@ -0,0 +1,24 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace BankAccountsAcl { +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Office" +] as AbilityTuple<"Read", "Office">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Office" +] as AbilityTuple<"Read", "Office">; + +} diff --git a/test/generated/next/bankAccounts/bankAccounts.api.ts b/test/generated/next/bankAccounts/bankAccounts.api.ts new file mode 100644 index 0000000..6a4092d --- /dev/null +++ b/test/generated/next/bankAccounts/bankAccounts.api.ts @@ -0,0 +1,37 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BankAccountsModels } from "./bankAccounts.models"; + +export namespace BankAccountsApi { +export const findAll = (search?: string, officeId?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, + `/bank-accounts/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, + `/bank-accounts/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/next/bankAccounts/bankAccounts.configs.ts b/test/generated/next/bankAccounts/bankAccounts.configs.ts new file mode 100644 index 0000000..23ecfc1 --- /dev/null +++ b/test/generated/next/bankAccounts/bankAccounts.configs.ts @@ -0,0 +1,43 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { BankAccountsModels } from "./bankAccounts.models"; +import { BankAccountsQueries } from "./bankAccounts.queries"; +import { BankAccountsAcl } from "./bankAccounts.acl"; + +export namespace BankAccountsConfigs { +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: BankAccountsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: BankAccountsQueries.usePaginateLabels, + infinite: BankAccountsQueries.usePaginateLabelsInfinite, + filters: { + schema: BankAccountsModels.BankAccountFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BankAccountsModels.BankAccountFilterDtoSchema, + options: { + inputs: { + search: true, + officeId: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/bankAccounts/bankAccounts.models.ts b/test/generated/next/bankAccounts/bankAccounts.models.ts new file mode 100644 index 0000000..2f5199f --- /dev/null +++ b/test/generated/next/bankAccounts/bankAccounts.models.ts @@ -0,0 +1,42 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BankAccountsModels { +/** + * BankAccountFilterDtoSchema + * @type { object } + * @property { string } search Search by name or bank name + * @property { string } officeId Office ID to filter by + */ +export const BankAccountFilterDtoSchema = z.object({ search: z.string().describe("Search by name or bank name"), officeId: z.string().describe("Office ID to filter by") }).readonly(); +export type BankAccountFilterDto = z.infer; + +/** + * BankAccountsFindAllResponseSchema + * @type { array } + */ +export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type BankAccountsFindAllResponse = z.infer; + +/** + * BankAccountsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const BankAccountsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "bankName", "createdAt", "updatedAt"]); +export type BankAccountsPaginateLabelsOrderParamEnum = z.infer; +export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * BankAccountsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const BankAccountsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type BankAccountsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/bankAccounts/bankAccounts.queries.ts b/test/generated/next/bankAccounts/bankAccounts.queries.ts new file mode 100644 index 0000000..0fa5c5d --- /dev/null +++ b/test/generated/next/bankAccounts/bankAccounts.queries.ts @@ -0,0 +1,97 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BankAccountsAcl } from "./bankAccounts.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { BankAccountsModels } from "./bankAccounts.models"; +import { BankAccountsApi } from "./bankAccounts.api"; + +export namespace BankAccountsQueries { +export const moduleName = QueryModule.BankAccounts; + +export const keys = { + all: [moduleName] as const, + findAll: (search?: string, officeId?: string) => [...keys.all, "/bank-accounts/labels", search, officeId] as const, + paginateLabels: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", "infinite", limit, order, filter, cursor] as const, +}; + +/** + * Query `useFindAll` + * @summary List all bank accounts with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { string } object.officeId Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ search, officeId }: { search?: string, officeId?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search, officeId), + queryFn: () => { + checkAcl(BankAccountsAcl.canUseFindAll()); + return BankAccountsApi.findAll(search, officeId, config) }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate bank account labels (id and name only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` + * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BankAccountsAcl.canUsePaginateLabels()); + return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate bank account labels (id and name only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` + * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BankAccountsAcl.canUsePaginateLabels()); + return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.acl.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.acl.ts new file mode 100644 index 0000000..055a8b8 --- /dev/null +++ b/test/generated/next/bookkeepingExport/bookkeepingExport.acl.ts @@ -0,0 +1,134 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BookkeepingExportAcl { +/** + * Use for `useCreateBatch` mutation ability. For global ability, omit the object parameter. + * @description Create bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBatch` mutation + */ +export const canUseCreateBatch = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Create", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `usePaginateBatches` query ability. For global ability, omit the object parameter. + * @description List bookkeeping export batches + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatches` query + */ +export const canUsePaginateBatches = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useGetBatch` query ability. For global ability, omit the object parameter. + * @description Get bookkeeping export batch details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query + */ +export const canUseGetBatch = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useUpdateBatchFormat` mutation ability. For global ability, omit the object parameter. + * @description Update bookkeeping export batch format + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchFormat` mutation + */ +export const canUseUpdateBatchFormat = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useUpdateBatchItem` mutation ability. For global ability, omit the object parameter. + * @description Update bookkeeping export batch item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchItem` mutation + */ +export const canUseUpdateBatchItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `usePaginateBatchItems` query ability. For global ability, omit the object parameter. + * @description List batch items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatchItems` query + */ +export const canUsePaginateBatchItems = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useValidateBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Export bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useValidateBookkeepingBatch` mutation + */ +export const canUseValidateBookkeepingBatch = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useExportBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Export bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportBookkeepingBatch` mutation + */ +export const canUseExportBookkeepingBatch = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useRevertBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Revert bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertBookkeepingBatch` mutation + */ +export const canUseRevertBookkeepingBatch = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useGetVatLineItems` query ability. For global ability, omit the object parameter. + * @description Get VAT line items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetVatLineItems` query + */ +export const canUseGetVatLineItems = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +} diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.api.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.api.ts new file mode 100644 index 0000000..db3d8bd --- /dev/null +++ b/test/generated/next/bookkeepingExport/bookkeepingExport.api.ts @@ -0,0 +1,107 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; + +export namespace BookkeepingExportApi { +export const createBatch = (officeId: string, data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, + `/offices/${officeId}/bookkeeping-exports`, + ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), + config + ) +}; +export const paginateBatches = (officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, + `/offices/${officeId}/bookkeeping-exports`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, + `/offices/${officeId}/bookkeeping-exports/${batchId}`, + config + ) +}; +export const updateBatchFormat = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, + `/offices/${officeId}/bookkeeping-exports/${batchId}`, + ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), + config + ) +}; +export const updateBatchItem = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, + ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), + config + ) +}; +export const paginateBatchItems = (officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, + `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const validateBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, + undefined, + config + ) +}; +export const exportBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, + undefined, + config + ) +}; +export const revertBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, + undefined, + config + ) +}; +export const getVatLineItems = (officeId: string, batchId: string, order?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, + `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + }, + } + ) +}; +} diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.configs.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.configs.ts new file mode 100644 index 0000000..b28771d --- /dev/null +++ b/test/generated/next/bookkeepingExport/bookkeepingExport.configs.ts @@ -0,0 +1,123 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; +import { BookkeepingExportQueries } from "./bookkeepingExport.queries"; +import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; + +export namespace BookkeepingExportConfigs { +export const bookkeepingExportsConfig = { + meta: { + title: "Bookkeeping Exports", + }, + readAll: { + acl: BookkeepingExportAcl.canUsePaginateBatches, + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, + paginated: BookkeepingExportQueries.usePaginateBatches, + infinite: BookkeepingExportQueries.usePaginateBatchesInfinite, + filters: { + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, + options: { + inputs: { + createdDate: true, + status: true, + format: true, + createdBy: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, + options: { + columns: { + id: true, + format: true, + status: true, + totalInvoiceCount: true, + exportedInvoiceCount: true, + createdBy: true, + createdAt: true, + exportedAt: true, + revertedAt: true, + files: true, + }, + sortable: BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema, + }, +}), + }, + read: { + acl: BookkeepingExportAcl.canUseGetBatch, + schema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema, + query: BookkeepingExportQueries.useGetBatch, + }, + create: { + acl: BookkeepingExportAcl.canUseCreateBatch, + schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, + mutation: BookkeepingExportQueries.useCreateBatch, + inputDefs: dynamicInputs({ + schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, + options: { + inputs: { + format: true, + invoiceFilters: true, + }, + }, +}) + }, + update: { + acl: BookkeepingExportAcl.canUseUpdateBatchFormat, + schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, + mutation: BookkeepingExportQueries.useUpdateBatchFormat, + inputDefs: dynamicInputs({ + schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, + options: { + inputs: { + format: true, + }, + }, +}) + }, +}; + +export const itemsConfig = { + meta: { + title: "Items", + }, + readAll: { + acl: BookkeepingExportAcl.canUsePaginateBatchItems, + schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, + paginated: BookkeepingExportQueries.usePaginateBatchItems, + infinite: BookkeepingExportQueries.usePaginateBatchItemsInfinite, + filters: { + schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, + options: { + inputs: { + status: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, + options: { + columns: { + id: true, + invoiceId: true, + status: true, + includedInExport: true, + validationIssues: true, + invoice: true, + receiver: true, + comments: true, + }, + sortable: BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.models.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.models.ts new file mode 100644 index 0000000..3d43eef --- /dev/null +++ b/test/generated/next/bookkeepingExport/bookkeepingExport.models.ts @@ -0,0 +1,293 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BookkeepingExportModels { +/** + * BookkeepingExportFormatEnumSchema + * @type { enum } + */ +export const BookkeepingExportFormatEnumSchema = z.enum(["Bmd", "BmdWithoutCost", "BmdHamburg", "Abra", "Pantheon"]); +export type BookkeepingExportFormatEnum = z.infer; +export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enum; + +/** + * CreateBookkeepingExportBatchRequestDtoSchema + * @type { object } + * @property { BookkeepingExportFormatEnum } format + * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters + */ +export const CreateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema.nullish(), invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema }).readonly(); +export type CreateBookkeepingExportBatchRequestDto = z.infer; + +/** + * BookkeepingExportFileTypeEnumSchema + * @type { enum } + */ +export const BookkeepingExportFileTypeEnumSchema = z.enum(["Invoices", "BusinessPartners", "Report", "AbraAddressBook", "AbraIssuedInvoices", "AbraIssuedInvoiceItems", "AbraReceivedInvoices", "AbraReceivedInvoiceItems", "PantheonInvoicesOutgoingEur", "PantheonInvoicesOutgoingUsd", "PantheonInvoicesIncomingEur", "PantheonInvoicesIncomingUsd", "PantheonCostCenters"]); +export type BookkeepingExportFileTypeEnum = z.infer; +export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema.enum; + +/** + * BookkeepingExportFileDtoSchema + * @type { object } + * @property { BookkeepingExportFileTypeEnum } variant + * @property { string } downloadUrl + * @property { string } fileName + */ +export const BookkeepingExportFileDtoSchema = z.object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }).readonly(); +export type BookkeepingExportFileDto = z.infer; + +/** + * BookkeepingExportBatchStatusEnumSchema + * @type { enum } + */ +export const BookkeepingExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Reverted", "Failed"]); +export type BookkeepingExportBatchStatusEnum = z.infer; +export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnumSchema.enum; + +/** + * BookkeepingExportBatchSummaryDtoSchema + * @type { object } + * @property { number } totalCount + * @property { number } needsReviewCount + * @property { number } readyForExportCount + * @property { number } excludedCount + * @property { object } invoiceNumberRange + * @property { string } invoiceNumberRange.from + * @property { string } invoiceNumberRange.to + * @property { object } dateRange + * @property { string } dateRange.from + * @property { string } dateRange.to + */ +export const BookkeepingExportBatchSummaryDtoSchema = z.object({ totalCount: z.number(), needsReviewCount: z.number(), readyForExportCount: z.number(), excludedCount: z.number(), invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).readonly().nullish(), dateRange: z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).readonly().nullish() }).readonly(); +export type BookkeepingExportBatchSummaryDto = z.infer; + +/** + * BookkeepingExportBatchDetailsDtoSchema + * @type { object } + * @property { string } id + * @property { BookkeepingExportFormatEnum } format + * @property { BookkeepingExportBatchStatusEnum } status + * @property { number } totalInvoiceCount + * @property { number } exportedInvoiceCount + * @property { object } createdBy + * @property { string } createdBy.id + * @property { string } createdBy.fullName + * @property { string } createdBy.email + * @property { string } createdAt + * @property { string } exportedAt + * @property { string } revertedAt + * @property { object } revertedBy + * @property { string } revertedBy.id + * @property { string } revertedBy.fullName + * @property { string } revertedBy.email + * @property { BookkeepingExportBatchSummaryDto } summary + * @property { BookkeepingExportFileDto[] } files + */ +export const BookkeepingExportBatchDetailsDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), revertedBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly().nullish(), summary: BookkeepingExportBatchSummaryDtoSchema, files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish() }).readonly(); +export type BookkeepingExportBatchDetailsDto = z.infer; + +/** + * UpdateBookkeepingExportBatchRequestDtoSchema + * @type { object } + * @property { BookkeepingExportFormatEnum } format + */ +export const UpdateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema }).readonly(); +export type UpdateBookkeepingExportBatchRequestDto = z.infer; + +/** + * BookkeepingExportBatchPreviewDtoSchema + * @type { object } + * @property { string } id + * @property { BookkeepingExportFormatEnum } format + * @property { BookkeepingExportBatchStatusEnum } status + * @property { number } totalInvoiceCount + * @property { number } exportedInvoiceCount + * @property { object } createdBy + * @property { string } createdBy.id + * @property { string } createdBy.fullName + * @property { string } createdBy.email + * @property { string } createdAt + * @property { string } exportedAt + * @property { string } revertedAt + * @property { BookkeepingExportFileDto[] } files + */ +export const BookkeepingExportBatchPreviewDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish() }).readonly(); +export type BookkeepingExportBatchPreviewDto = z.infer; + +/** + * DateRangeSchema + * @type { object } + * @property { string } from + * @property { string } to + */ +export const DateRangeSchema = z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).readonly(); +export type DateRange = z.infer; + +/** + * BookkeepingExportBatchPreviewFilterDtoSchema + * @type { object } + * @property { DateRange } createdDate + * @property { BookkeepingExportBatchStatusEnum[] } status + * @property { BookkeepingExportFormatEnum[] } format + * @property { string[] } createdBy + */ +export const BookkeepingExportBatchPreviewFilterDtoSchema = z.object({ createdDate: DateRangeSchema, status: z.array(BookkeepingExportBatchStatusEnumSchema).readonly(), format: z.array(BookkeepingExportFormatEnumSchema).readonly(), createdBy: z.array(z.string()).readonly() }).readonly(); +export type BookkeepingExportBatchPreviewFilterDto = z.infer; + +/** + * BookkeepingExportBatchItemStatusEnumSchema + * @type { enum } + */ +export const BookkeepingExportBatchItemStatusEnumSchema = z.enum(["Selected", "NeedsReview", "ReadyForExport", "Exported", "Excluded"]); +export type BookkeepingExportBatchItemStatusEnum = z.infer; +export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemStatusEnumSchema.enum; + +/** + * BookkeepingExportItemDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } invoiceId + * @property { BookkeepingExportBatchItemStatusEnum } status + * @property { boolean } includedInExport + * @property { string[] } validationIssues + * @property { object } invoice + * @property { string } invoice.invoiceNumber + * @property { string } invoice.issuingDate + * @property { string } invoice.currency + * @property { number } invoice.amount + * @property { number } invoice.tax + * @property { string[] } invoice.vatRules + * @property { object } receiver + * @property { string } receiver.id + * @property { string } receiver.name + * @property { string } receiver.matchCode + * @property { string } receiver.label + * @property { string } receiver.account + * @property { string } receiver.contraAccount + * @property { string } comments + */ +export const BookkeepingExportItemDetailDtoSchema = z.object({ id: z.string(), invoiceId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).readonly().nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), vatRules: z.array(z.string()).readonly() }).readonly(), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }).readonly(), comments: z.string().nullish() }).readonly(); +export type BookkeepingExportItemDetailDto = z.infer; + +/** + * BookkeepingExportItemDetailFilterDtoSchema + * @type { object } + * @property { BookkeepingExportBatchItemStatusEnum[] } status + */ +export const BookkeepingExportItemDetailFilterDtoSchema = z.object({ status: z.array(BookkeepingExportBatchItemStatusEnumSchema).readonly() }).readonly(); +export type BookkeepingExportItemDetailFilterDto = z.infer; + +/** + * BookkeepingExportVatLineItemDtoSchema + * @type { object } + * @property { string } invoiceId + * @property { string } batchId + * @property { string } batchItemId + * @property { BookkeepingExportBatchItemStatusEnum } status + * @property { boolean } includedInExport + * @property { string[] } validationIssues + * @property { object } invoice + * @property { string } invoice.invoiceNumber + * @property { string } invoice.issuingDate + * @property { string } invoice.currency + * @property { number } invoice.amount + * @property { number } invoice.tax + * @property { string } invoice.comments + * @property { object } receiver + * @property { string } receiver.id + * @property { string } receiver.name + * @property { string } receiver.matchCode + * @property { string } receiver.label + * @property { string } receiver.account + * @property { string } receiver.contraAccount + * @property { number } vatPercentage + * @property { string } vatRule + * @property { number } netAmount + * @property { number } vatAmount + * @property { number } grossAmount + * @property { number } vatAmountInOfficeCurrency + * @property { number } netAmountInOfficeCurrency + * @property { number } grossAmountInOfficeCurrency + * @property { string } officeCurrency + */ +export const BookkeepingExportVatLineItemDtoSchema = z.object({ invoiceId: z.string(), batchId: z.string(), batchItemId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).readonly().nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), comments: z.string().nullish() }).readonly(), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }).readonly(), vatPercentage: z.number(), vatRule: z.string(), netAmount: z.number(), vatAmount: z.number(), grossAmount: z.number(), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish(), officeCurrency: z.string() }).readonly(); +export type BookkeepingExportVatLineItemDto = z.infer; + +/** + * CreateBookkeepingExportBatchResponseDtoSchema + * @type { object } + * @property { string } batchId + */ +export const CreateBookkeepingExportBatchResponseDtoSchema = z.object({ batchId: z.string() }).readonly(); +export type CreateBookkeepingExportBatchResponseDto = z.infer; + +/** + * UpdateBookkeepingExportBatchItemRequestDtoSchema + * @type { object } + * @property { boolean } includedInExport Whether the item should be included in the export + * @property { string[] } itemIds Min Items: `0` + * @property { boolean } vatOk + * @property { boolean } invoiceOk + */ +export const UpdateBookkeepingExportBatchItemRequestDtoSchema = z.object({ includedInExport: z.boolean().describe("Whether the item should be included in the export").nullish(), itemIds: z.array(z.string()).readonly(), vatOk: z.boolean().nullish(), invoiceOk: z.boolean().nullish() }).readonly(); +export type UpdateBookkeepingExportBatchItemRequestDto = z.infer; + +/** + * PaginateBatchesOrderParamEnumSchema + * @type { enum } + */ +export const PaginateBatchesOrderParamEnumSchema = z.enum(["createdAt", "status", "format", "totalInvoiceCount"]); +export type PaginateBatchesOrderParamEnum = z.infer; +export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema.enum; + +/** + * PaginateBatchesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookkeepingExportBatchPreviewDto[] } items + */ +export const PaginateBatchesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).readonly() }).readonly().shape }); +export type PaginateBatchesResponse = z.infer; + +/** + * PaginateBatchItemsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateBatchItemsOrderParamEnumSchema = z.enum(["issuingDate"]); +export type PaginateBatchItemsOrderParamEnum = z.infer; +export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnumSchema.enum; + +/** + * PaginateBatchItemsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookkeepingExportItemDetailDto[] } items + */ +export const PaginateBatchItemsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).readonly() }).readonly().shape }); +export type PaginateBatchItemsResponse = z.infer; + +/** + * GetVatLineItemsOrderParamEnumSchema + * @type { enum } + */ +export const GetVatLineItemsOrderParamEnumSchema = z.enum(["account", "contraAccount", "issuingDate", "invoiceNumber", "receiver"]); +export type GetVatLineItemsOrderParamEnum = z.infer; +export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema.enum; + +/** + * GetVatLineItemsResponseSchema + * @type { array } + */ +export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema).readonly(); +export type GetVatLineItemsResponse = z.infer; + +} diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts new file mode 100644 index 0000000..5281e85 --- /dev/null +++ b/test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts @@ -0,0 +1,351 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BookkeepingExportModels } from "./bookkeepingExport.models"; +import { BookkeepingExportApi } from "./bookkeepingExport.api"; + +export namespace BookkeepingExportQueries { +export const moduleName = QueryModule.BookkeepingExport; + +export const keys = { + all: [moduleName] as const, + paginateBatches: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", officeId, limit, order, filter, page, cursor] as const, + paginateBatchesInfinite: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", "infinite", officeId, limit, order, filter, cursor] as const, + getBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/:batchId", officeId, batchId] as const, + paginateBatchItems: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", officeId, batchId, limit, order, filter, page, cursor] as const, + paginateBatchItemsInfinite: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", "infinite", officeId, batchId, limit, order, filter, cursor] as const, + getVatLineItems: (officeId: string, batchId: string, order?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/vat-line-items", officeId, batchId, order] as const, +}; + +/** + * Mutation `useCreateBatch` + * @summary Create bookkeeping export batch + * @permission Requires `canUseCreateBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId } )); + return BookkeepingExportApi.createBatch(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateBatches` + * @summary List bookkeeping export batches + * @permission Requires `canUsePaginateBatches` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` + * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatches = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateBatchesInfinite + * @summary List bookkeeping export batches + * @permission Requires `canUsePaginateBatches` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` + * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatchesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetBatch` + * @summary Get bookkeeping export batch details + * @permission Requires `canUseGetBatch` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBatch(officeId, batchId), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId } )); + return BookkeepingExportApi.getBatch(officeId, batchId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateBatchFormat` + * @summary Update bookkeeping export batch format + * @permission Requires `canUseUpdateBatchFormat` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBatchFormat = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId, data }) => { + checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId } )); + return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, batchId } = variables; + const updateKeys = [keys.getBatch(officeId, batchId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateBatchItem` + * @summary Update bookkeeping export batch item inclusion + * @permission Requires `canUseUpdateBatchItem` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBatchItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId, data }) => { + checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId } )); + return BookkeepingExportApi.updateBatchItem(officeId, batchId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateBatchItems` + * @summary List batch items with filters and pagination + * @permission Requires `canUsePaginateBatchItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` + * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatchItems = ({ officeId, batchId, limit, order, filter, page, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); + return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateBatchItemsInfinite + * @summary List batch items with filters and pagination + * @permission Requires `canUsePaginateBatchItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` + * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatchItemsInfinite = ({ officeId, batchId, limit, order, filter, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); + return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useValidateBookkeepingBatch` + * @summary Validate bookkeeping batch + * @permission Requires `canUseValidateBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useValidateBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId } )); + return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useExportBookkeepingBatch` + * @summary Export bookkeeping batch + * @permission Requires `canUseExportBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useExportBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId } )); + return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRevertBookkeepingBatch` + * @summary Revert bookkeeping export batch + * @permission Requires `canUseRevertBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useRevertBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId } )); + return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetVatLineItems` + * @summary Get VAT line items for bookkeeping export batch + * @permission Requires `canUseGetVatLineItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): account, contraAccount, issuingDate, invoiceNumber, receiver. Example: `account` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetVatLineItems = ({ officeId, batchId, order }: { officeId: string, batchId: string, order?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getVatLineItems(officeId, batchId, order), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId } )); + return BookkeepingExportApi.getVatLineItems(officeId, batchId, order, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts new file mode 100644 index 0000000..1fc9403 --- /dev/null +++ b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnerBookkeepingMappingsAcl { +/** + * Use for `useGetBookkeepingMappings` query ability. For global ability, omit the object parameter. + * @description List business partner bookkeeping mappings + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBookkeepingMappings` query + */ +export const canUseGetBookkeepingMappings = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useCreateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Create business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBookkeepingMapping` mutation + */ +export const canUseCreateBookkeepingMapping = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; + +/** + * Use for `useUpdateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Update business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMapping` mutation + */ +export const canUseUpdateBookkeepingMapping = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; + +/** + * Use for `useUpdateBookkeepingMappingById` mutation ability. For global ability, omit the object parameter. + * @description Update business partner bookkeeping mapping by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMappingById` mutation + */ +export const canUseUpdateBookkeepingMappingById = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; + +/** + * Use for `useDeleteBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBookkeepingMapping` mutation + */ +export const canUseDeleteBookkeepingMapping = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Delete", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; + +} diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts new file mode 100644 index 0000000..b527abc --- /dev/null +++ b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts @@ -0,0 +1,47 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; + +export namespace BusinessPartnerBookkeepingMappingsApi { +export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + config + ) +}; +export const createBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), + config + ) +}; +export const updateBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), + config + ) +}; +export const updateBookkeepingMappingById = (officeId: string, businessPartnerId: string, id: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), + config + ) +}; +export const deleteBookkeepingMapping = (officeId: string, businessPartnerId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts new file mode 100644 index 0000000..90ad3ac --- /dev/null +++ b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts @@ -0,0 +1,62 @@ +import { z } from "zod"; + +export namespace BusinessPartnerBookkeepingMappingsModels { +/** + * BusinessPartnerBookkeepingMappingResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { string } businessPartnerId + * @property { boolean } paysTaxInEurForFactoring + */ +export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z.object({ id: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), currencyNotation: z.string().nullish(), businessPartnerId: z.string(), paysTaxInEurForFactoring: z.boolean().nullish() }).readonly(); +export type BusinessPartnerBookkeepingMappingResponseDto = z.infer; + +/** + * BusinessPartnerBookkeepingMappingsResponseDtoSchema + * @type { object } + * @property { BusinessPartnerBookkeepingMappingResponseDto[] } bookkeepingMappings + */ +export const BusinessPartnerBookkeepingMappingsResponseDtoSchema = z.object({ bookkeepingMappings: z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly() }).readonly(); +export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer; + +/** + * UpdateBookkeepingMappingDtoSchema + * @type { object } + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) + */ +export const UpdateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string(), creditorId: z.string(), currencyNotation: z.string(), paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)") }).readonly(); +export type UpdateBookkeepingMappingDto = z.infer; + +/** + * UpdateBookkeepingMappingRequestDtoSchema + * @type { object } + * @property { UpdateBookkeepingMappingDto[] } bookkeepingMappings + */ +export const UpdateBookkeepingMappingRequestDtoSchema = z.object({ bookkeepingMappings: z.array(UpdateBookkeepingMappingDtoSchema).readonly() }).readonly(); +export type UpdateBookkeepingMappingRequestDto = z.infer; + +/** + * CreateBookkeepingMappingDtoSchema + * @type { object } + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) + */ +export const CreateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string(), creditorId: z.string(), currencyNotation: z.string(), paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)") }).readonly(); +export type CreateBookkeepingMappingDto = z.infer; + +/** + * UpdateBookkeepingMappingResponseSchema + * @type { array } + */ +export const UpdateBookkeepingMappingResponseSchema = z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly(); +export type UpdateBookkeepingMappingResponse = z.infer; + +} diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts new file mode 100644 index 0000000..78fb4aa --- /dev/null +++ b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts @@ -0,0 +1,154 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnerBookkeepingMappingsAcl } from "./businessPartnerBookkeepingMappings.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; +import { BusinessPartnerBookkeepingMappingsApi } from "./businessPartnerBookkeepingMappings.api"; + +export namespace BusinessPartnerBookkeepingMappingsQueries { +export const moduleName = QueryModule.BusinessPartnerBookkeepingMappings; + +export const keys = { + all: [moduleName] as const, + getBookkeepingMappings: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/bookkeeping-mappings", officeId, businessPartnerId] as const, +}; + +/** + * Query `useGetBookkeepingMappings` + * @summary Fetch all bookkeeping mappings for a business partner + * @permission Requires `canUseGetBookkeepingMappings` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBookkeepingMappings = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), + queryFn: () => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateBookkeepingMapping` + * @summary Create a bookkeeping mapping for a business partner + * @permission Requires `canUseCreateBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping(officeId, businessPartnerId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateBookkeepingMapping` + * @summary Update an existing bookkeeping mapping for a business partner + * @permission Requires `canUseUpdateBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping(officeId, businessPartnerId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateBookkeepingMappingById` + * @summary Update a specific bookkeeping mapping by ID for a business partner + * @permission Requires `canUseUpdateBookkeepingMappingById` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBookkeepingMappingById = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, id, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById(officeId, businessPartnerId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteBookkeepingMapping` + * @summary Delete an existing bookkeeping mapping for a business partner + * @permission Requires `canUseDeleteBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, id }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.acl.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.acl.ts new file mode 100644 index 0000000..ea3ab69 --- /dev/null +++ b/test/generated/next/businessPartnerContacts/businessPartnerContacts.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnerContactsAcl { +/** + * Use for `useGetContacts` query ability. For global ability, omit the object parameter. + * @description List business partner contacts + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetContacts` query + */ +export const canUseGetContacts = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useCreateContact` mutation ability. For global ability, omit the object parameter. + * @description Create business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateContact` mutation + */ +export const canUseCreateContact = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `usePaginateContactLabels` query ability. For global ability, omit the object parameter. + * @description Paginate business partner contact labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateContactLabels` query + */ +export const canUsePaginateContactLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateContact` mutation ability. For global ability, omit the object parameter. + * @description Update business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateContact` mutation + */ +export const canUseUpdateContact = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useDeleteContact` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteContact` mutation + */ +export const canUseDeleteContact = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +} diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts new file mode 100644 index 0000000..45ab2f9 --- /dev/null +++ b/test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts @@ -0,0 +1,55 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; + +export namespace BusinessPartnerContactsApi { +export const getContacts = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, + config + ) +}; +export const createContact = (officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, + ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), + config + ) +}; +export const paginateContactLabels = (officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const updateContact = (contactId: string, officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, + ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), + config + ) +}; +export const deleteContact = (contactId: string, officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.configs.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.configs.ts new file mode 100644 index 0000000..9c4ccc5 --- /dev/null +++ b/test/generated/next/businessPartnerContacts/businessPartnerContacts.configs.ts @@ -0,0 +1,42 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; +import { BusinessPartnerContactsQueries } from "./businessPartnerContacts.queries"; +import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; + +export namespace BusinessPartnerContactsConfigs { +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: BusinessPartnerContactsAcl.canUsePaginateContactLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: BusinessPartnerContactsQueries.usePaginateContactLabels, + infinite: BusinessPartnerContactsQueries.usePaginateContactLabelsInfinite, + filters: { + schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts new file mode 100644 index 0000000..e2c3d48 --- /dev/null +++ b/test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts @@ -0,0 +1,84 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BusinessPartnerContactsModels { +/** + * BusinessPartnerContactRoleEnumSchema + * @type { enum } + */ +export const BusinessPartnerContactRoleEnumSchema = z.enum(["General", "CommercialManager", "SystemEngineer", "TechnicalEngineer", "Logistics", "Operations", "Sales", "Accounting", "Invoice", "Dunnings", "Reclamations", "Management"]); +export type BusinessPartnerContactRoleEnum = z.infer; +export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSchema.enum; + +/** + * BusinessPartnerContactResponseDTOSchema + * @type { object } + * @property { string } id Contact ID + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ +export const BusinessPartnerContactResponseDTOSchema = z.object({ id: z.string().describe("Contact ID"), role: BusinessPartnerContactRoleEnumSchema.nullish(), name: z.string().describe("Contact name").nullish(), email: z.string().describe("Contact email").nullish(), phone: z.string().describe("Contact phone").nullish() }).readonly(); +export type BusinessPartnerContactResponseDTO = z.infer; + +/** + * BusinessPartnerContactListResponseDTOSchema + * @type { object } + * @property { BusinessPartnerContactResponseDTO[] } contacts List of contacts + */ +export const BusinessPartnerContactListResponseDTOSchema = z.object({ contacts: z.array(BusinessPartnerContactResponseDTOSchema).readonly().describe("List of contacts") }).readonly(); +export type BusinessPartnerContactListResponseDTO = z.infer; + +/** + * CreateBusinessPartnerContactRequestDTOSchema + * @type { object } + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ +export const CreateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema, name: z.string().describe("Contact name"), email: z.string().describe("Contact email"), phone: z.string().describe("Contact phone") }).readonly(); +export type CreateBusinessPartnerContactRequestDTO = z.infer; + +/** + * UpdateBusinessPartnerContactRequestDTOSchema + * @type { object } + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ +export const UpdateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema, name: z.string().describe("Contact name"), email: z.string().describe("Contact email"), phone: z.string().describe("Contact phone") }).readonly(); +export type UpdateBusinessPartnerContactRequestDTO = z.infer; + +/** + * BusinessPartnerContactFilterDtoSchema + * @type { object } + * @property { string } search Search by name, email, or phone + */ +export const BusinessPartnerContactFilterDtoSchema = z.object({ search: z.string().describe("Search by name, email, or phone") }).readonly(); +export type BusinessPartnerContactFilterDto = z.infer; + +/** + * PaginateContactLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateContactLabelsOrderParamEnumSchema = z.enum(["name", "role", "email", "createdAt", "updatedAt"]); +export type PaginateContactLabelsOrderParamEnum = z.infer; +export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderParamEnumSchema.enum; + +/** + * PaginateContactLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateContactLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PaginateContactLabelsResponse = z.infer; + +} diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts new file mode 100644 index 0000000..345a304 --- /dev/null +++ b/test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts @@ -0,0 +1,186 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; +import { BusinessPartnerContactsApi } from "./businessPartnerContacts.api"; + +export namespace BusinessPartnerContactsQueries { +export const moduleName = QueryModule.BusinessPartnerContacts; + +export const keys = { + all: [moduleName] as const, + getContacts: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts", officeId, businessPartnerId] as const, + paginateContactLabels: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", officeId, businessPartnerId, limit, order, filter, page, cursor] as const, + paginateContactLabelsInfinite: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", "infinite", officeId, businessPartnerId, limit, order, filter, cursor] as const, +}; + +/** + * Query `useGetContacts` + * @summary Get all contacts for a business partner + * @permission Requires `canUseGetContacts` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetContacts = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getContacts(officeId, businessPartnerId), + queryFn: () => { + checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId } )); + return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateContact` + * @summary Create a new contact for a business partner + * @permission Requires `canUseCreateContact` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId } )); + return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateContactLabels` + * @summary Paginate business partner contact labels (id and name only) + * @permission Requires `canUsePaginateContactLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` + * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateContactLabels = ({ officeId, businessPartnerId, limit, order, filter, page, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); + return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateContactLabelsInfinite + * @summary Paginate business partner contact labels (id and name only) + * @permission Requires `canUsePaginateContactLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` + * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateContactLabelsInfinite = ({ officeId, businessPartnerId, limit, order, filter, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); + return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useUpdateContact` + * @summary Update a business partner contact + * @permission Requires `canUseUpdateContact` ability + * @param { string } mutation.contactId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId } )); + return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteContact` + * @permission Requires `canUseDeleteContact` ability + * @param { string } mutation.contactId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 204, 401] + */ +export const useDeleteContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ contactId, officeId, businessPartnerId }) => { + checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId } )); + return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/businessPartners/businessPartners.acl.ts b/test/generated/next/businessPartners/businessPartners.acl.ts new file mode 100644 index 0000000..a532e2e --- /dev/null +++ b/test/generated/next/businessPartners/businessPartners.acl.ts @@ -0,0 +1,264 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace BusinessPartnersAcl { +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List business partners + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Create", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Paginate business partner labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Read business partner details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useLock` mutation ability. For global ability, omit the object parameter. + * @description Lock business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLock` mutation + */ +export const canUseLock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUnlock` mutation ability. For global ability, omit the object parameter. + * @description Unlock business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlock` mutation + */ +export const canUseUnlock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetRemarks` query ability. For global ability, omit the object parameter. + * @description List business partner remarks + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetRemarks` query + */ +export const canUseGetRemarks = ( + object?: { officeId: string, } +) => [ + "ReadRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useCreateRemark` mutation ability. For global ability, omit the object parameter. + * @description Create business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRemark` mutation + */ +export const canUseCreateRemark = ( + object?: { officeId: string, } +) => [ + "CreateRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateRemark` mutation ability. For global ability, omit the object parameter. + * @description Update business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRemark` mutation + */ +export const canUseUpdateRemark = ( + object?: { officeId: string, } +) => [ + "UpdateRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useDeleteRemark` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemark` mutation + */ +export const canUseDeleteRemark = ( + object?: { officeId: string, } +) => [ + "DeleteRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetBasicInfo` query ability. For global ability, omit the object parameter. + * @description Read business partner basic info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBasicInfo` query + */ +export const canUseGetBasicInfo = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateBasicInfo` mutation ability. For global ability, omit the object parameter. + * @description Update business partner basic info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBasicInfo` mutation + */ +export const canUseUpdateBasicInfo = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" +] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; + +/** + * Use for `useCreateSignatureUploadInstructions` mutation ability. For global ability, omit the object parameter. + * @description Create business partner signature upload instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateSignatureUploadInstructions` mutation + */ +export const canUseCreateSignatureUploadInstructions = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" +] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; + +/** + * Use for `useGetCargoAgentInfo` query ability. For global ability, omit the object parameter. + * @description Read business partner cargo agent info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoAgentInfo` query + */ +export const canUseGetCargoAgentInfo = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateCargoAgent` mutation ability. For global ability, omit the object parameter. + * @description Update business partner cargo agent info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargoAgent` mutation + */ +export const canUseUpdateCargoAgent = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetCarrierInformation` query ability. For global ability, omit the object parameter. + * @description Read business partner carrier info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCarrierInformation` query + */ +export const canUseGetCarrierInformation = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateCarrier` mutation ability. For global ability, omit the object parameter. + * @description Update business partner carrier info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCarrier` mutation + */ +export const canUseUpdateCarrier = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +} diff --git a/test/generated/next/businessPartners/businessPartners.api.ts b/test/generated/next/businessPartners/businessPartners.api.ts new file mode 100644 index 0000000..379cea4 --- /dev/null +++ b/test/generated/next/businessPartners/businessPartners.api.ts @@ -0,0 +1,179 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { BusinessPartnersModels } from "./businessPartners.models"; + +export namespace BusinessPartnersApi { +export const paginate = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, + `/offices/${officeId}/business-partners`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, + `/offices/${officeId}/business-partners`, + ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, + `/offices/${officeId}/business-partners/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getById = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}`, + config + ) +}; +export const update = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), + config + ) +}; +export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/unarchive`, + undefined, + config + ) +}; +export const lock = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/lock`, + undefined, + config + ) +}; +export const unlock = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/unlock`, + undefined, + config + ) +}; +export const getRemarks = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, + `/offices/${officeId}/business-partners/${id}/remarks`, + config + ) +}; +export const createRemark = (officeId: string, id: string, data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/remarks`, + ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), + config + ) +}; +export const updateRemark = (officeId: string, id: string, remarkId: string, data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), + config + ) +}; +export const deleteRemark = (officeId: string, id: string, remarkId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, + undefined, + config + ) +}; +export const getBasicInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic`, + config + ) +}; +export const updateBasicInfo = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), + config + ) +}; +export const createSignatureUploadInstructions = (officeId: string, id: string, data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, + ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), + config + ) +}; +export const getCargoAgentInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/cargo-agent`, + config + ) +}; +export const updateCargoAgent = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCargoAgentDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/cargo-agent`, + ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), + config + ) +}; +export const getCarrierInformation = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/carrier`, + config + ) +}; +export const updateCarrier = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCarrierDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/carrier`, + ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/businessPartners/businessPartners.configs.ts b/test/generated/next/businessPartners/businessPartners.configs.ts new file mode 100644 index 0000000..971a761 --- /dev/null +++ b/test/generated/next/businessPartners/businessPartners.configs.ts @@ -0,0 +1,149 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { BusinessPartnersModels } from "./businessPartners.models"; +import { BusinessPartnersQueries } from "./businessPartners.queries"; +import { BusinessPartnersAcl } from "./businessPartners.acl"; + +export namespace BusinessPartnersConfigs { +export const businessPartnersConfig = { + meta: { + title: "Business Partners", + }, + readAll: { + acl: BusinessPartnersAcl.canUsePaginate, + schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, + paginated: BusinessPartnersQueries.usePaginate, + infinite: BusinessPartnersQueries.usePaginateInfinite, + filters: { + schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, + options: { + inputs: { + search: true, + types: true, + shortName: true, + name: true, + vat: true, + debtorId: true, + creditorId: true, + matchCode: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + address: true, + types: true, + archived: true, + shortName: true, + vat: true, + debtorId: true, + creditorId: true, + locked: true, + currency: true, + remarks: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: BusinessPartnersAcl.canUseGetById, + schema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema, + query: BusinessPartnersQueries.useGetById, + }, + create: { + acl: BusinessPartnersAcl.canUseCreate, + schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, + mutation: BusinessPartnersQueries.useCreate, + inputDefs: dynamicInputs({ + schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, + options: { + inputs: { + name: true, + secondaryName: true, + types: true, + matchCode: true, + shortName: true, + address: true, + }, + }, +}) + }, + update: { + acl: BusinessPartnersAcl.canUseUpdate, + schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, + mutation: BusinessPartnersQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + secondaryName: true, + types: true, + address: true, + blAddress: true, + belongsToId: true, + salesRepId: true, + operationsId: true, + addressIsDifferentForBl: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: BusinessPartnersAcl.canUsePaginateLabels, + schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, + paginated: BusinessPartnersQueries.usePaginateLabels, + infinite: BusinessPartnersQueries.usePaginateLabelsInfinite, + filters: { + schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, + options: { + inputs: { + search: true, + ids: true, + types: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + types: true, + }, + sortable: BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/businessPartners/businessPartners.models.ts b/test/generated/next/businessPartners/businessPartners.models.ts new file mode 100644 index 0000000..75c284e --- /dev/null +++ b/test/generated/next/businessPartners/businessPartners.models.ts @@ -0,0 +1,489 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace BusinessPartnersModels { +/** + * RemarkVisibilitySchema + * @type { enum } + */ +export const RemarkVisibilitySchema = z.enum(["internal", "popup"]); +export type RemarkVisibility = z.infer; +export const RemarkVisibility = RemarkVisibilitySchema.enum; + +/** + * RemarkTypeSchema + * @type { enum } + */ +export const RemarkTypeSchema = z.enum(["INFORMATIONAL", "WARNING"]); +export type RemarkType = z.infer; +export const RemarkType = RemarkTypeSchema.enum; + +/** + * BusinessPartnerRemarkResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the remark + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of the remark + */ +export const BusinessPartnerRemarkResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the remark"), visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), content: z.string().describe("Content of the remark"), type: RemarkTypeSchema.describe("Type of the remark") }).readonly(); +export type BusinessPartnerRemarkResponseDTO = z.infer; + +/** + * BusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { string } city City name + * @property { string } isoCode Country code + */ +export const BusinessPartnerAddressDtoSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: z.string().describe("City name"), isoCode: z.string().describe("Country code") }).readonly(); +export type BusinessPartnerAddressDto = z.infer; + +/** + * BusinessPartnerEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BusinessPartnerEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type BusinessPartnerEmployeeDTO = z.infer; + +/** + * BusinessPartnerListResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + * @property { string } matchCode Match code of the business partner + * @property { BusinessPartnerAddressDto } address Address information + * @property { CommonModels.BusinessPartnerType[] } types List of business partner types + * @property { boolean } archived Archive status + * @property { string } shortName Short name of the business partner + * @property { string } vat VAT number of the business partner + * @property { string } debtorId Debtor ID for the local currency + * @property { string } creditorId Creditor ID for the local currency + * @property { boolean } locked Whether the business partner is locked + * @property { string } currency Currency (invoice currency) + * @property { BusinessPartnerRemarkResponseDTO[] } remarks Remarks for the business partner + * @property { string } createdById ID of the employee who created this business partner + * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this business partner + * @property { string } createdAt Date when the business partner was created + * @property { string } updatedById ID of the employee who last updated this business partner + * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this business partner + * @property { string } updatedAt Date when the business partner was last updated + */ +export const BusinessPartnerListResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), name: z.string().describe("Name of the business partner"), matchCode: z.string().describe("Match code of the business partner"), address: BusinessPartnerAddressDtoSchema.describe("Address information"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), archived: z.boolean().describe("Archive status"), shortName: z.string().describe("Short name of the business partner").nullish(), vat: z.string().describe("VAT number of the business partner").nullish(), debtorId: z.string().describe("Debtor ID for the local currency").nullish(), creditorId: z.string().describe("Creditor ID for the local currency").nullish(), locked: z.boolean().describe("Whether the business partner is locked"), currency: z.string().describe("Currency (invoice currency)").nullish(), remarks: z.array(BusinessPartnerRemarkResponseDTOSchema).readonly().describe("Remarks for the business partner"), createdById: z.string().describe("ID of the employee who created this business partner").nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this business partner").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was created"), updatedById: z.string().describe("ID of the employee who last updated this business partner").nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this business partner").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was last updated") }).readonly(); +export type BusinessPartnerListResponseDTO = z.infer; + +/** + * BusinessPartnerFilterDtoSchema + * @type { object } + * @property { string } search + * @property { CommonModels.BusinessPartnerType[] } types + * @property { string } shortName + * @property { string } name + * @property { string } vat + * @property { string } debtorId + * @property { string } creditorId + * @property { string } matchCode + * @property { boolean } archived Filter by archived status + */ +export const BusinessPartnerFilterDtoSchema = z.object({ search: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly(), shortName: z.string(), name: z.string(), vat: z.string(), debtorId: z.string(), creditorId: z.string(), matchCode: z.string(), archived: z.boolean().describe("Filter by archived status") }).readonly(); +export type BusinessPartnerFilterDto = z.infer; + +/** + * BusinessPartnerPaginatedLabelResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } label Label of the business partner + * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types + */ +export const BusinessPartnerPaginatedLabelResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), label: z.string().describe("Label of the business partner"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); +export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; + +/** + * BusinessPartnerLabelsFilterDtoSchema + * @type { object } + * @property { string } search + * @property { string[] } ids Business partner ids to filter by + * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types to filter by + * @property { boolean } archived Filter by archived status + */ +export const BusinessPartnerLabelsFilterDtoSchema = z.object({ search: z.string(), ids: z.array(z.string()).readonly().describe("Business partner ids to filter by"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types to filter by"), archived: z.boolean().describe("Filter by archived status") }).readonly(); +export type BusinessPartnerLabelsFilterDto = z.infer; + +/** + * CreateBusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } district + * @property { string } countryId + */ +export const CreateBusinessPartnerAddressDtoSchema = z.object({ street: z.string(), secondaryStreet: z.string(), zip: z.string(), cityId: z.string(), district: z.string(), countryId: z.string() }).readonly(); +export type CreateBusinessPartnerAddressDto = z.infer; + +/** + * CreateBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } name Full name of the business partner. Min Length: `3` + * @property { string } secondaryName Full name of the business partner. Min Length: `3` + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { string } matchCode Unique identifier code + * @property { string } shortName Short name for the business partner + * @property { CreateBusinessPartnerAddressDto } address Address information + */ +export const CreateBusinessPartnerRequestDTOSchema = z.object({ name: z.string().min(3).describe("Full name of the business partner"), secondaryName: z.string().min(3).describe("Full name of the business partner").nullish(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), matchCode: z.string().describe("Unique identifier code").nullish(), shortName: z.string().describe("Short name for the business partner").nullish(), address: CreateBusinessPartnerAddressDtoSchema.describe("Address information").nullish() }).readonly(); +export type CreateBusinessPartnerRequestDTO = z.infer; + +/** + * BusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { string } rootFolderId Root folder identifier associated with this business partner + */ +export const BusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), name: z.string().describe("Name of the business partner"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), rootFolderId: z.string().describe("Root folder identifier associated with this business partner").nullish() }).readonly(); +export type BusinessPartnerResponseDTO = z.infer; + +/** + * BusinessPartnerLabelResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + */ +export const BusinessPartnerLabelResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), name: z.string().describe("Name of the business partner") }).readonly(); +export type BusinessPartnerLabelResponseDto = z.infer; + +/** + * ContactResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the contact + * @property { string } name Name of the contact + */ +export const ContactResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the contact"), name: z.string().describe("Name of the contact") }).readonly(); +export type ContactResponseDTO = z.infer; + +/** + * BusinessPartnerDetailResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } createdById ID of the employee who created this record + * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this record + * @property { string } createdAt Creation timestamp + * @property { string } updatedById ID of the employee who last updated this record + * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this record + * @property { string } updatedAt Last update timestamp + * @property { string } matchCode Match code of the business partner + * @property { string } shortName Short name + * @property { string } name Full name + * @property { string } secondaryName Secondary name + * @property { CommonModels.BusinessPartnerType[] } types List of business partner types + * @property { boolean } archived Archived status + * @property { CommonModels.BusinessPartnerAddressResponseDTO } address Main address information + * @property { CommonModels.BusinessPartnerAddressResponseDTO } blAddress BL address information + * @property { BusinessPartnerLabelResponseDto[] } similar Similar named business partners + * @property { boolean } locked + * @property { boolean } addressIsDifferentForBl + * @property { string } lockedById Unique identifier of the employee who locked the business partner + * @property { string } lockedByName + * @property { string } lockedAt Unique identifier of the employee who locked the business partner + * @property { ContactResponseDTO } belongsTo Parent business partner + * @property { ContactResponseDTO } salesRep Sales representative + * @property { ContactResponseDTO } operations Operations contact + */ +export const BusinessPartnerDetailResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), createdById: z.string().describe("ID of the employee who created this record").nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this record").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Creation timestamp"), updatedById: z.string().describe("ID of the employee who last updated this record").nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this record").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Last update timestamp"), matchCode: z.string().describe("Match code of the business partner"), shortName: z.string().describe("Short name"), name: z.string().describe("Full name"), secondaryName: z.string().describe("Secondary name"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), archived: z.boolean().describe("Archived status"), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information"), blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("BL address information"), similar: z.array(BusinessPartnerLabelResponseDtoSchema).readonly().describe("Similar named business partners").nullish(), locked: z.boolean(), addressIsDifferentForBl: z.boolean(), lockedById: z.string().describe("Unique identifier of the employee who locked the business partner").nullish(), lockedByName: z.string().nullish(), lockedAt: z.iso.datetime({ offset: true }).describe("Unique identifier of the employee who locked the business partner").nullish(), belongsTo: ContactResponseDTOSchema.describe("Parent business partner"), salesRep: ContactResponseDTOSchema.describe("Sales representative"), operations: ContactResponseDTOSchema.describe("Operations contact") }).readonly(); +export type BusinessPartnerDetailResponseDTO = z.infer; + +/** + * UpdateBusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } district + * @property { string } countryId + */ +export const UpdateBusinessPartnerAddressDtoSchema = z.object({ street: z.string(), secondaryStreet: z.string(), zip: z.string(), cityId: z.string().nullable(), district: z.string(), countryId: z.string() }).readonly(); +export type UpdateBusinessPartnerAddressDto = z.infer; + +/** + * UpdateBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code + * @property { string } shortName Updated short name + * @property { string } name Updated full name + * @property { string } secondaryName Updated secondary name + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { UpdateBusinessPartnerAddressDto } address Address information + * @property { UpdateBusinessPartnerAddressDto } blAddress Bl address information + * @property { string } belongsToId Parent business partner + * @property { string } salesRepId Sales representative + * @property { string } operationsId Operations contact + * @property { boolean } addressIsDifferentForBl Different address for BL + */ +export const UpdateBusinessPartnerRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code"), shortName: z.string().describe("Updated short name"), name: z.string().describe("Updated full name"), secondaryName: z.string().describe("Updated secondary name"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), address: UpdateBusinessPartnerAddressDtoSchema.describe("Address information"), blAddress: UpdateBusinessPartnerAddressDtoSchema.describe("Bl address information"), belongsToId: z.string().describe("Parent business partner"), salesRepId: z.string().describe("Sales representative"), operationsId: z.string().describe("Operations contact"), addressIsDifferentForBl: z.boolean().describe("Different address for BL") }).readonly(); +export type UpdateBusinessPartnerRequestDTO = z.infer; + +/** + * CreateBusinessPartnerRemarkRequestDTOSchema + * @type { object } + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of remark + */ +export const CreateBusinessPartnerRemarkRequestDTOSchema = z.object({ visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), content: z.string().describe("Content of the remark"), type: RemarkTypeSchema.describe("Type of remark") }).readonly(); +export type CreateBusinessPartnerRemarkRequestDTO = z.infer; + +/** + * UpdateBusinessPartnerRemarkRequestDtoSchema + * @type { object } + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of remark + */ +export const UpdateBusinessPartnerRemarkRequestDtoSchema = z.object({ visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), content: z.string().describe("Content of the remark"), type: RemarkTypeSchema.describe("Type of remark") }).readonly(); +export type UpdateBusinessPartnerRemarkRequestDto = z.infer; + +/** + * AccountTypeEnumSchema + * @type { enum } + */ +export const AccountTypeEnumSchema = z.enum(["Direct Account", "Logistic Provider / Forwarder", "4PL/NVOCC", "LLP", "Carrier", "Service Provider (other)", "Strategic", "Key Account", "Transactional", "Agent", "Other"]); +export type AccountTypeEnum = z.infer; +export const AccountTypeEnum = AccountTypeEnumSchema.enum; + +/** + * BusinessPartnerAuthorizationSchema + * @type { enum } + */ +export const BusinessPartnerAuthorizationSchema = z.enum(["requiresApproval", "blocked", "regularBusinessPartner"]); +export type BusinessPartnerAuthorization = z.infer; +export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.enum; + +/** + * BusinessPartnerPaymentTermsResponseDtoSchema + * @type { object } + * @property { string } relativeTo + * @property { number } days Minimum: `0` + */ +export const BusinessPartnerPaymentTermsResponseDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }).readonly(); +export type BusinessPartnerPaymentTermsResponseDto = z.infer; + +/** + * BusinessPartnerBankAccountResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BusinessPartnerBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type BusinessPartnerBankAccountResponseDto = z.infer; + +/** + * PartnerNetworkInfoDtoSchema + * @type { object } + * @property { string } id Partner network ID + * @property { string } name Partner network name + */ +export const PartnerNetworkInfoDtoSchema = z.object({ id: z.string().describe("Partner network ID"), name: z.string().describe("Partner network name") }).readonly(); +export type PartnerNetworkInfoDto = z.infer; + +/** + * BusinessPartnerBasicResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Reference to the business partner + * @property { string[] } relationship List of relationships + * @property { AccountTypeEnum } accountType + * @property { string } vat VAT number + * @property { string } legacySystemId Legacy system (move) id + * @property { string } registrationNumber + * @property { string } eori EORI number + * @property { BusinessPartnerAuthorization } authorization Authorization status + * @property { number } creditLimit Credit limit + * @property { string } invoiceLanguage Invoice language + * @property { string } invoiceCurrency Invoice currency + * @property { string } iban IBAN + * @property { string } bankNumber Bank number + * @property { string } bankAccountNumber Bank account number + * @property { BusinessPartnerPaymentTermsResponseDto } termsExport + * @property { BusinessPartnerPaymentTermsResponseDto } termsImport + * @property { CommonModels.EditorContentResponseDto } notes Notes + * @property { string } bankAccountId + * @property { BusinessPartnerBankAccountResponseDto } bankAccount + * @property { PartnerNetworkInfoDto[] } partnerNetworks Partner networks + * @property { string } dunningSystemId + * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem + * @property { string } hblIssuerSigner HBL issuer/signer prefill + * @property { string } signatureFileAttachmentId Signature file attachment ID + * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment + */ +export const BusinessPartnerBasicResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Reference to the business partner"), relationship: z.array(z.string()).readonly().describe("List of relationships"), accountType: AccountTypeEnumSchema.nullish(), vat: z.string().describe("VAT number"), legacySystemId: z.string().describe("Legacy system (move) id").nullish(), registrationNumber: z.string().nullish(), eori: z.string().describe("EORI number"), authorization: BusinessPartnerAuthorizationSchema.describe("Authorization status").nullable(), creditLimit: z.number().describe("Credit limit"), invoiceLanguage: z.string().describe("Invoice language"), invoiceCurrency: z.string().describe("Invoice currency"), iban: z.string().describe("IBAN"), bankNumber: z.string().describe("Bank number"), bankAccountNumber: z.string().describe("Bank account number"), termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), bankAccountId: z.string().nullish(), bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), partnerNetworks: z.array(PartnerNetworkInfoDtoSchema).readonly().describe("Partner networks"), dunningSystemId: z.string().nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), hblIssuerSigner: z.string().describe("HBL issuer/signer prefill"), signatureFileAttachmentId: z.string().describe("Signature file attachment ID"), signatureFileAttachmentUrl: z.string().describe("Signed URL for signature file attachment").nullish() }).readonly(); +export type BusinessPartnerBasicResponseDTO = z.infer; + +/** + * UpdateBusinessPartnerPaymentTermsDtoSchema + * @type { object } + * @property { string } relativeTo + * @property { number } days Minimum: `0` + */ +export const UpdateBusinessPartnerPaymentTermsDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }).readonly(); +export type UpdateBusinessPartnerPaymentTermsDto = z.infer; + +/** + * UpdateBusinessPartnerBasicRequestDTOSchema + * @type { object } + * @property { string[] } relationship Updated relationships + * @property { string } vat Updated VAT number + * @property { string } eori Updated EORI number + * @property { AccountTypeEnum } accountType + * @property { BusinessPartnerAuthorization } authorization Updated authorization status + * @property { number } creditLimit Updated credit limit + * @property { string } invoiceLanguage Invoice language + * @property { string } invoiceCurrency Invoice currency + * @property { string } iban IBAN + * @property { string } bankNumber Bank number + * @property { string } bankAccountNumber Bank account number + * @property { string } legacySystemId Legacy system (move) id + * @property { string } registrationNumber + * @property { UpdateBusinessPartnerPaymentTermsDto } termsExport + * @property { UpdateBusinessPartnerPaymentTermsDto } termsImport + * @property { CommonModels.EditorContentUpdateDto } notes Notes + * @property { string } bankAccountId + * @property { string[] } partnerNetworkIds Partner network IDs + * @property { string } dunningSystemId Dunning system ID + * @property { string } hblIssuerSigner HBL issuer/signer prefill + * @property { string } signatureFileAttachmentId Signature file attachment ID + */ +export const UpdateBusinessPartnerBasicRequestDTOSchema = z.object({ relationship: z.array(z.string()).readonly().describe("Updated relationships"), vat: z.string().describe("Updated VAT number"), eori: z.string().describe("Updated EORI number"), accountType: AccountTypeEnumSchema, authorization: BusinessPartnerAuthorizationSchema.describe("Updated authorization status"), creditLimit: z.number().describe("Updated credit limit"), invoiceLanguage: z.string().describe("Invoice language"), invoiceCurrency: z.string().describe("Invoice currency"), iban: z.string().describe("IBAN"), bankNumber: z.string().describe("Bank number"), bankAccountNumber: z.string().describe("Bank account number"), legacySystemId: z.string().describe("Legacy system (move) id"), registrationNumber: z.string(), termsExport: UpdateBusinessPartnerPaymentTermsDtoSchema, termsImport: UpdateBusinessPartnerPaymentTermsDtoSchema, notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), bankAccountId: z.string().nullable(), partnerNetworkIds: z.array(z.string()).readonly().describe("Partner network IDs"), dunningSystemId: z.string().describe("Dunning system ID").nullable(), hblIssuerSigner: z.string().describe("HBL issuer/signer prefill").nullable(), signatureFileAttachmentId: z.string().describe("Signature file attachment ID").nullable() }).readonly(); +export type UpdateBusinessPartnerBasicRequestDTO = z.infer; + +/** + * BusinessPartnerSignatureUploadRequestDTOSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType Mime type + * @property { number } fileSize File size in bytes. Minimum: `1` + */ +export const BusinessPartnerSignatureUploadRequestDTOSchema = z.object({ fileName: z.string().describe("File name"), mimeType: z.string().describe("Mime type"), fileSize: z.number().gte(1).describe("File size in bytes") }).readonly(); +export type BusinessPartnerSignatureUploadRequestDTO = z.infer; + +/** + * BusinessPartnerSignatureUploadResponseDTOSchema + * @type { object } + * @property { string } mediaId Media ID for the uploaded signature + * @property { string } method HTTP method to use for upload + * @property { string } url URL to upload the file to + */ +export const BusinessPartnerSignatureUploadResponseDTOSchema = z.object({ mediaId: z.string().describe("Media ID for the uploaded signature"), method: z.string().describe("HTTP method to use for upload"), url: z.string().describe("URL to upload the file to") }).readonly(); +export type BusinessPartnerSignatureUploadResponseDTO = z.infer; + +/** + * CargoAgentResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Business partner identifier + * @property { string } portOfHamburgAccountNumber Port of Hamburg account number + * @property { string } iataAccountNumber IATA account number + * @property { string } regulatedAgentCode Regulated agent code + */ +export const CargoAgentResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Business partner identifier"), portOfHamburgAccountNumber: z.string().describe("Port of Hamburg account number"), iataAccountNumber: z.string().describe("IATA account number"), regulatedAgentCode: z.string().describe("Regulated agent code") }).readonly(); +export type CargoAgentResponseDTO = z.infer; + +/** + * UpdateCargoAgentDTOSchema + * @type { object } + * @property { string } portOfHamburgAccountNumber Hamburg port account number + * @property { string } iataAccountNumber IATA account number + * @property { string } regulatedAgentCode Regulated agent code + */ +export const UpdateCargoAgentDTOSchema = z.object({ portOfHamburgAccountNumber: z.string().describe("Hamburg port account number"), iataAccountNumber: z.string().describe("IATA account number"), regulatedAgentCode: z.string().describe("Regulated agent code") }).readonly(); +export type UpdateCargoAgentDTO = z.infer; + +/** + * CarrierResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Business partner identifier + * @property { string } scac SCAC code + * @property { string } iataAirlinePrefix IATA airline prefix + * @property { string } iataCode IATA code + * @property { string } registrationAddress Registration address + * @property { string } masterBlSuffix Master BL suffix + * @property { string } houseBlSuffix House BL suffix + * @property { string } airWaybillSuffix Air waybill suffix + * @property { string } cargoManifestSuffix Cargo manifest suffix + * @property { string } fundReportSuffix Fund report suffix + * @property { string } invoiceSuffix Invoice suffix + */ +export const CarrierResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Business partner identifier"), scac: z.string().describe("SCAC code"), iataAirlinePrefix: z.string().describe("IATA airline prefix"), iataCode: z.string().describe("IATA code"), registrationAddress: z.string().describe("Registration address"), masterBlSuffix: z.string().describe("Master BL suffix"), houseBlSuffix: z.string().describe("House BL suffix"), airWaybillSuffix: z.string().describe("Air waybill suffix"), cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), fundReportSuffix: z.string().describe("Fund report suffix"), invoiceSuffix: z.string().describe("Invoice suffix") }).readonly(); +export type CarrierResponseDTO = z.infer; + +/** + * UpdateCarrierDTOSchema + * @type { object } + * @property { string } scac SCAC code + * @property { string } iataAirlinePrefix IATA airline prefix + * @property { string } iataCode IATA code + * @property { string } registrationAddress Registration address + * @property { string } masterBlSuffix Master BL suffix + * @property { string } houseBlSuffix House BL suffix + * @property { string } airWaybillSuffix Air waybill suffix + * @property { string } cargoManifestSuffix Cargo manifest suffix + * @property { string } fundReportSuffix Fund report suffix + * @property { string } invoiceSuffix Invoice suffix + */ +export const UpdateCarrierDTOSchema = z.object({ scac: z.string().describe("SCAC code"), iataAirlinePrefix: z.string().describe("IATA airline prefix"), iataCode: z.string().describe("IATA code"), registrationAddress: z.string().describe("Registration address"), masterBlSuffix: z.string().describe("Master BL suffix"), houseBlSuffix: z.string().describe("House BL suffix"), airWaybillSuffix: z.string().describe("Air waybill suffix"), cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), fundReportSuffix: z.string().describe("Fund report suffix"), invoiceSuffix: z.string().describe("Invoice suffix") }).readonly(); +export type UpdateCarrierDTO = z.infer; + +/** + * BusinessPartnersPaginateOrderParamEnumSchema + * @type { enum } + */ +export const BusinessPartnersPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); +export type BusinessPartnersPaginateOrderParamEnum = z.infer; +export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOrderParamEnumSchema.enum; + +/** + * BusinessPartnersPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BusinessPartnerListResponseDTO[] } items + */ +export const BusinessPartnersPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).readonly() }).readonly().shape }); +export type BusinessPartnersPaginateResponse = z.infer; + +/** + * BusinessPartnersPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const BusinessPartnersPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); +export type BusinessPartnersPaginateLabelsOrderParamEnum = z.infer; +export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPaginateLabelsOrderParamEnumSchema.enum; + +/** + * BusinessPartnersPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items + */ +export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type BusinessPartnersPaginateLabelsResponse = z.infer; + +/** + * GetRemarksResponseSchema + * @type { array } + */ +export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema).readonly(); +export type GetRemarksResponse = z.infer; + +} diff --git a/test/generated/next/businessPartners/businessPartners.queries.ts b/test/generated/next/businessPartners/businessPartners.queries.ts new file mode 100644 index 0000000..5c7e107 --- /dev/null +++ b/test/generated/next/businessPartners/businessPartners.queries.ts @@ -0,0 +1,642 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { BusinessPartnersAcl } from "./businessPartners.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { BusinessPartnersModels } from "./businessPartners.models"; +import { BusinessPartnersApi } from "./businessPartners.api"; + +export namespace BusinessPartnersQueries { +export const moduleName = QueryModule.BusinessPartners; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + getById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id", officeId, id] as const, + getRemarks: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/remarks", officeId, id] as const, + getBasicInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/basic", officeId, id] as const, + getCargoAgentInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/cargo-agent", officeId, id] as const, + getCarrierInformation: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/carrier", officeId, id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate business partners + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); + return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate business partners + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); + return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create business partner + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { BusinessPartnersModels.CreateBusinessPartnerRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(BusinessPartnersAcl.canUseCreate({ officeId } )); + return BusinessPartnersApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetById` + * @summary Get business partner by ID + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetById({ officeId } )); + return BusinessPartnersApi.getById(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update business partner + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId } )); + return BusinessPartnersApi.update(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive business partner + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseArchive({ officeId } )); + return BusinessPartnersApi.archive(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive business partner + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId } )); + return BusinessPartnersApi.unarchive(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useLock` + * @summary Lock business partner + * @permission Requires `canUseLock` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useLock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseLock({ officeId } )); + return BusinessPartnersApi.lock(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnlock` + * @summary Unlock business partner + * @permission Requires `canUseUnlock` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId } )); + return BusinessPartnersApi.unlock(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetRemarks` + * @summary Get business partner remarks + * @permission Requires `canUseGetRemarks` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetRemarks = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getRemarks(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId } )); + return BusinessPartnersApi.getRemarks(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateRemark` + * @summary Create business partner remark + * @permission Requires `canUseCreateRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId } )); + return BusinessPartnersApi.createRemark(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateRemark` + * @permission Requires `canUseUpdateRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { string } mutation.remarkId Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, remarkId, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId } )); + return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRemark` + * @summary Delete business partner remark + * @permission Requires `canUseDeleteRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { string } mutation.remarkId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, remarkId }) => { + checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId } )); + return BusinessPartnersApi.deleteRemark(officeId, id, remarkId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetBasicInfo` + * @summary Get business partner basic info + * @permission Requires `canUseGetBasicInfo` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBasicInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBasicInfo(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId } )); + return BusinessPartnersApi.getBasicInfo(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateBasicInfo` + * @summary Update business partner basic info + * @permission Requires `canUseUpdateBasicInfo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBasicInfo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId } )); + return BusinessPartnersApi.updateBasicInfo(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getBasicInfo(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateSignatureUploadInstructions` + * @summary Create upload instructions for business partner signature + * @permission Requires `canUseCreateSignatureUploadInstructions` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateSignatureUploadInstructions = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { + checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId } )); + const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions(officeId, id, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetCargoAgentInfo` + * @summary Get cargo agent information for business partner + * @permission Requires `canUseGetCargoAgentInfo` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoAgentInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoAgentInfo(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId } )); + return BusinessPartnersApi.getCargoAgentInfo(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCargoAgent` + * @summary Update cargo agent information for business partner + * @permission Requires `canUseUpdateCargoAgent` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateCargoAgentDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCargoAgent = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId } )); + return BusinessPartnersApi.updateCargoAgent(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getCargoAgentInfo(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetCarrierInformation` + * @summary Get carrier information for business partner + * @permission Requires `canUseGetCarrierInformation` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCarrierInformation = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCarrierInformation(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId } )); + return BusinessPartnersApi.getCarrierInformation(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCarrier` + * @summary Update carrier information for business partner + * @permission Requires `canUseUpdateCarrier` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateCarrierDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCarrier = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId } )); + return BusinessPartnersApi.updateCarrier(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getCarrierInformation(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/cargoTypes/cargoTypes.acl.ts b/test/generated/next/cargoTypes/cargoTypes.acl.ts new file mode 100644 index 0000000..404b05b --- /dev/null +++ b/test/generated/next/cargoTypes/cargoTypes.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CargoTypesAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "CargoType" +] as AbilityTuple<"Read", "CargoType">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "CargoType" +] as AbilityTuple<"Create", "CargoType">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "CargoType" +] as AbilityTuple<"Read", "CargoType">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "CargoType" +] as AbilityTuple<"Read", "CargoType">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "CargoType" +] as AbilityTuple<"Update", "CargoType">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "CargoType" +] as AbilityTuple<"Archive", "CargoType">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "CargoType" +] as AbilityTuple<"Archive", "CargoType">; + +} diff --git a/test/generated/next/cargoTypes/cargoTypes.api.ts b/test/generated/next/cargoTypes/cargoTypes.api.ts new file mode 100644 index 0000000..5f6ca5c --- /dev/null +++ b/test/generated/next/cargoTypes/cargoTypes.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CargoTypesModels } from "./cargoTypes.models"; + +export namespace CargoTypesApi { +export const paginate = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, + `/cargo-types`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types`, + ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, + `/cargo-types/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}`, + config + ) +}; +export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}`, + ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/cargoTypes/cargoTypes.configs.ts b/test/generated/next/cargoTypes/cargoTypes.configs.ts new file mode 100644 index 0000000..5d2769f --- /dev/null +++ b/test/generated/next/cargoTypes/cargoTypes.configs.ts @@ -0,0 +1,142 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CargoTypesModels } from "./cargoTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CargoTypesQueries } from "./cargoTypes.queries"; +import { CargoTypesAcl } from "./cargoTypes.acl"; + +export namespace CargoTypesConfigs { +export const cargoTypesConfig = { + meta: { + title: "Cargo Types", + }, + readAll: { + acl: CargoTypesAcl.canUsePaginate, + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + paginated: CargoTypesQueries.usePaginate, + infinite: CargoTypesQueries.usePaginateInfinite, + filters: { + schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, + options: { + inputs: { + module: true, + archived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + shortName: true, + length: true, + width: true, + height: true, + unit: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + modules: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: CargoTypesAcl.canUseFindById, + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + query: CargoTypesQueries.useFindById, + }, + create: { + acl: CargoTypesAcl.canUseCreate, + schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, + mutation: CargoTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + length: true, + width: true, + height: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + unit: true, + modules: true, + }, + }, +}) + }, + update: { + acl: CargoTypesAcl.canUseUpdate, + schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, + mutation: CargoTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + length: true, + width: true, + height: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + unit: true, + modules: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CargoTypesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CargoTypesQueries.usePaginateLabels, + infinite: CargoTypesQueries.usePaginateLabelsInfinite, + filters: { + schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/cargoTypes/cargoTypes.models.ts b/test/generated/next/cargoTypes/cargoTypes.models.ts new file mode 100644 index 0000000..93eed88 --- /dev/null +++ b/test/generated/next/cargoTypes/cargoTypes.models.ts @@ -0,0 +1,141 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CargoTypesModels { +/** + * CargoTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CargoTypeEmployeeDTO = z.infer; + +/** + * CargoTypeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the cargo type + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { string } unit Measurement unit for dimensions + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type + * @property { boolean } archived Indicates if the cargo type is archived + * @property { string } createdById + * @property { CargoTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CargoTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const CargoTypeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the cargo type"), name: z.string().describe("Name of the cargo type"), shortName: z.string().describe("Short name of the cargo type").nullish(), length: z.number().describe("Length of the cargo type").nullish(), width: z.number().describe("Width of the cargo type").nullish(), height: z.number().describe("Height of the cargo type").nullish(), unit: z.string().describe("Measurement unit for dimensions"), emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), containerIsoCode: z.string().describe("Container ISO code").nullish(), isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly().describe("Transport modules applicable to the cargo type"), archived: z.boolean().describe("Indicates if the cargo type is archived"), createdById: z.string().nullish(), createdBy: CargoTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CargoTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type CargoTypeResponseDTO = z.infer; + +/** + * TransportModuleEnumSchema + * @type { enum } + */ +export const TransportModuleEnumSchema = z.enum(["Air", "Sea", "Road"]); +export type TransportModuleEnum = z.infer; +export const TransportModuleEnum = TransportModuleEnumSchema.enum; + +/** + * CargoTypePaginationFilterDtoSchema + * @type { object } + * @property { TransportModuleEnum } module + * @property { boolean } archived Archived status filter + * @property { string } search + */ +export const CargoTypePaginationFilterDtoSchema = z.object({ module: TransportModuleEnumSchema, archived: z.boolean().describe("Archived status filter"), search: z.string() }).readonly(); +export type CargoTypePaginationFilterDto = z.infer; + +/** + * CreateCargoTypeRequestDTOSchema + * @type { object } + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { string } unit Measurement unit for dimensions + * @property { CommonModels.TransportModeEnum[] } modules Transport modes applicable to the cargo type + */ +export const CreateCargoTypeRequestDTOSchema = z.object({ name: z.string().describe("Name of the cargo type"), shortName: z.string().describe("Short name of the cargo type").nullish(), length: z.number().describe("Length of the cargo type").nullish(), width: z.number().describe("Width of the cargo type").nullish(), height: z.number().describe("Height of the cargo type").nullish(), emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), containerIsoCode: z.string().describe("Container ISO code").nullish(), isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), unit: z.string().describe("Measurement unit for dimensions"), modules: z.array(CommonModels.TransportModeEnumSchema).readonly().describe("Transport modes applicable to the cargo type") }).readonly(); +export type CreateCargoTypeRequestDTO = z.infer; + +/** + * UpdateCargoTypeRequestDTOSchema + * @type { object } + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { string } unit Measurement unit for dimensions + * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type + */ +export const UpdateCargoTypeRequestDTOSchema = z.object({ name: z.string().describe("Name of the cargo type"), shortName: z.string().describe("Short name of the cargo type"), length: z.number().describe("Length of the cargo type").nullable(), width: z.number().describe("Width of the cargo type").nullable(), height: z.number().describe("Height of the cargo type").nullable(), emptyWeight: z.number().describe("Empty weight of the cargo container").nullable(), containerIsoCode: z.string().describe("Container ISO code").nullable(), isContainer: z.boolean().describe("Whether this cargo type is a container").nullable(), unit: z.string().describe("Measurement unit for dimensions"), modules: z.array(CommonModels.TransportModeEnumSchema).readonly().describe("Transport modules applicable to the cargo type") }).readonly(); +export type UpdateCargoTypeRequestDTO = z.infer; + +/** + * CargoTypeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const CargoTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type CargoTypeLabelFilterDto = z.infer; + +/** + * CargoTypesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const CargoTypesPaginateOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type CargoTypesPaginateOrderParamEnum = z.infer; +export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnumSchema.enum; + +/** + * CargoTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CargoTypeResponseDTO[] } items + */ +export const CargoTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CargoTypeResponseDTOSchema).readonly() }).readonly().shape }); +export type CargoTypesPaginateResponse = z.infer; + +/** + * CargoTypesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const CargoTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type CargoTypesPaginateLabelsOrderParamEnum = z.infer; +export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * CargoTypesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const CargoTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type CargoTypesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/cargoTypes/cargoTypes.queries.ts b/test/generated/next/cargoTypes/cargoTypes.queries.ts new file mode 100644 index 0000000..71cd268 --- /dev/null +++ b/test/generated/next/cargoTypes/cargoTypes.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CargoTypesAcl } from "./cargoTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CargoTypesModels } from "./cargoTypes.models"; +import { CargoTypesApi } from "./cargoTypes.api"; + +export namespace CargoTypesQueries { +export const moduleName = QueryModule.CargoTypes; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string) => [...keys.all, "/cargo-types", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/cargo-types/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Cargo Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CargoTypesAcl.canUsePaginate()); + return CargoTypesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Cargo Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CargoTypesAcl.canUsePaginate()); + return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Cargo Type + * @permission Requires `canUseCreate` ability + * @param { CargoTypesModels.CreateCargoTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CargoTypesAcl.canUseCreate()); + return CargoTypesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate cargo types with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CargoTypesAcl.canUsePaginateLabels()); + return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate cargo types with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CargoTypesAcl.canUsePaginateLabels()); + return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get Cargo Type by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(CargoTypesAcl.canUseFindById()); + return CargoTypesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Cargo Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { CargoTypesModels.UpdateCargoTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(CargoTypesAcl.canUseUpdate()); + return CargoTypesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Cargo Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CargoTypesAcl.canUseArchive()); + return CargoTypesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive Cargo Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CargoTypesAcl.canUseUnarchive()); + return CargoTypesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/chargeTypes/chargeTypes.acl.ts b/test/generated/next/chargeTypes/chargeTypes.acl.ts new file mode 100644 index 0000000..469c483 --- /dev/null +++ b/test/generated/next/chargeTypes/chargeTypes.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace ChargeTypesAcl { +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "ChargeType" +] as AbilityTuple<"Read", "ChargeType">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "ChargeType" +] as AbilityTuple<"Read", "ChargeType">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "ChargeType" +] as AbilityTuple<"Create", "ChargeType">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "ChargeType" +] as AbilityTuple<"Read", "ChargeType">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "ChargeType" +] as AbilityTuple<"Update", "ChargeType">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "ChargeType" +] as AbilityTuple<"Archive", "ChargeType">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "ChargeType" +] as AbilityTuple<"Archive", "ChargeType">; + +} diff --git a/test/generated/next/chargeTypes/chargeTypes.api.ts b/test/generated/next/chargeTypes/chargeTypes.api.ts new file mode 100644 index 0000000..b2876a9 --- /dev/null +++ b/test/generated/next/chargeTypes/chargeTypes.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChargeTypesModels } from "./chargeTypes.models"; + +export namespace ChargeTypesApi { +export const findAll = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, + `/charge-types/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, + `/charge-types`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types`, + ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}`, + config + ) +}; +export const update = (id: string, data: ChargeTypesModels.UpdateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}`, + ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/chargeTypes/chargeTypes.configs.ts b/test/generated/next/chargeTypes/chargeTypes.configs.ts new file mode 100644 index 0000000..30d69aa --- /dev/null +++ b/test/generated/next/chargeTypes/chargeTypes.configs.ts @@ -0,0 +1,136 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChargeTypesModels } from "./chargeTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChargeTypesQueries } from "./chargeTypes.queries"; +import { ChargeTypesAcl } from "./chargeTypes.acl"; + +export namespace ChargeTypesConfigs { +export const chargeTypesConfig = { + meta: { + title: "Charge Types", + }, + readAll: { + acl: ChargeTypesAcl.canUsePaginate, + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + paginated: ChargeTypesQueries.usePaginate, + infinite: ChargeTypesQueries.usePaginateInfinite, + filters: { + schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, + options: { + inputs: { + name: true, + search: true, + archived: true, + direction: true, + transportModes: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: ChargeTypesAcl.canUseFindById, + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + query: ChargeTypesQueries.useFindById, + }, + create: { + acl: ChargeTypesAcl.canUseCreate, + schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, + mutation: ChargeTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, + options: { + inputs: { + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + }, + }, +}) + }, + update: { + acl: ChargeTypesAcl.canUseUpdate, + schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, + mutation: ChargeTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, + options: { + inputs: { + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ChargeTypesAcl.canUseFindAll, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChargeTypesQueries.useFindAll, + infinite: ChargeTypesQueries.useFindAllInfinite, + filters: { + schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, + options: { + inputs: { + direction: true, + transportModes: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/chargeTypes/chargeTypes.models.ts b/test/generated/next/chargeTypes/chargeTypes.models.ts new file mode 100644 index 0000000..53f5489 --- /dev/null +++ b/test/generated/next/chargeTypes/chargeTypes.models.ts @@ -0,0 +1,154 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChargeTypesModels { +/** + * ChargeTypeLabelFilterDtoSchema + * @type { object } + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum[] } transportModes + * @property { string } search + */ +export const ChargeTypeLabelFilterDtoSchema = z.object({ direction: CommonModels.DirectionEnumSchema, transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), search: z.string() }).readonly(); +export type ChargeTypeLabelFilterDto = z.infer; + +/** + * ChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ +export const ChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }).readonly(); +export type ChargeTypeTranslationDto = z.infer; + +/** + * ChargeTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChargeTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ChargeTypeEmployeeDTO = z.infer; + +/** + * ChargeTypeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { ChargeTypeTranslationDto[] } translations + * @property { string } createdById + * @property { ChargeTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { ChargeTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const ChargeTypeResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), directions: z.array(CommonModels.DirectionEnumSchema).readonly(), translations: z.array(ChargeTypeTranslationDtoSchema).readonly(), createdById: z.string().nullish(), createdBy: ChargeTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type ChargeTypeResponseDTO = z.infer; + +/** + * ChargeTypePaginationFilterDtoSchema + * @type { object } + * @property { string } name + * @property { string } search + * @property { boolean } archived + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum[] } transportModes + */ +export const ChargeTypePaginationFilterDtoSchema = z.object({ name: z.string(), search: z.string(), archived: z.boolean(), direction: CommonModels.DirectionEnumSchema, transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly() }).readonly(); +export type ChargeTypePaginationFilterDto = z.infer; + +/** + * CreateChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ +export const CreateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }).readonly(); +export type CreateChargeTypeTranslationDto = z.infer; + +/** + * CreateChargeTypeRequestDTOSchema + * @type { object } + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { CreateChargeTypeTranslationDto[] } translations + */ +export const CreateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string(), englishName: z.string().nullish(), archived: z.boolean().nullish(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), directions: z.array(CommonModels.DirectionEnumSchema).readonly(), translations: z.array(CreateChargeTypeTranslationDtoSchema).readonly().nullish() }).readonly(); +export type CreateChargeTypeRequestDTO = z.infer; + +/** + * UpdateChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ +export const UpdateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }).readonly(); +export type UpdateChargeTypeTranslationDto = z.infer; + +/** + * UpdateChargeTypeRequestDTOSchema + * @type { object } + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { UpdateChargeTypeTranslationDto[] } translations + */ +export const UpdateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), directions: z.array(CommonModels.DirectionEnumSchema).readonly(), translations: z.array(UpdateChargeTypeTranslationDtoSchema).readonly() }).readonly(); +export type UpdateChargeTypeRequestDTO = z.infer; + +/** + * ChargeTypesFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ChargeTypesFindAllOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); +export type ChargeTypesFindAllOrderParamEnum = z.infer; +export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnumSchema.enum; + +/** + * ChargeTypesFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ChargeTypesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type ChargeTypesFindAllResponse = z.infer; + +/** + * ChargeTypesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ChargeTypesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); +export type ChargeTypesPaginateOrderParamEnum = z.infer; +export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEnumSchema.enum; + +/** + * ChargeTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChargeTypeResponseDTO[] } items + */ +export const ChargeTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).readonly() }).readonly().shape }); +export type ChargeTypesPaginateResponse = z.infer; + +} diff --git a/test/generated/next/chargeTypes/chargeTypes.queries.ts b/test/generated/next/chargeTypes/chargeTypes.queries.ts new file mode 100644 index 0000000..a91c683 --- /dev/null +++ b/test/generated/next/chargeTypes/chargeTypes.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChargeTypesAcl } from "./chargeTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChargeTypesModels } from "./chargeTypes.models"; +import { ChargeTypesApi } from "./chargeTypes.api"; + +export namespace ChargeTypesQueries { +export const moduleName = QueryModule.ChargeTypes; + +export const keys = { + all: [moduleName] as const, + findAll: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string) => [...keys.all, "/charge-types", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/charge-types/:id", id] as const, +}; + +/** + * Query `useFindAll` + * @summary Paginate charge types with only their labels + * @permission Requires `canUseFindAll` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUseFindAll()); + return ChargeTypesApi.findAll(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @summary Paginate charge types with only their labels + * @permission Requires `canUseFindAll` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChargeTypesAcl.canUseFindAll()); + return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary Paginate Charge Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUsePaginate()); + return ChargeTypesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Charge Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChargeTypesAcl.canUsePaginate()); + return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new Charge Type + * @permission Requires `canUseCreate` ability + * @param { ChargeTypesModels.CreateChargeTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(ChargeTypesAcl.canUseCreate()); + return ChargeTypesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get Charge Type Details by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUseFindById()); + return ChargeTypesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update an existing Charge Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { ChargeTypesModels.UpdateChargeTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(ChargeTypesAcl.canUseUpdate()); + return ChargeTypesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive a Charge Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ChargeTypesAcl.canUseArchive()); + return ChargeTypesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive a Charge Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ChargeTypesAcl.canUseUnarchive()); + return ChargeTypesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/checklistItems/checklistItems.acl.ts b/test/generated/next/checklistItems/checklistItems.acl.ts new file mode 100644 index 0000000..a58bf1f --- /dev/null +++ b/test/generated/next/checklistItems/checklistItems.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ChecklistItemsAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create checklist item in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Create", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List checklist items for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Paginate checklist item labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get checklist item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Update", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +} diff --git a/test/generated/next/checklistItems/checklistItems.api.ts b/test/generated/next/checklistItems/checklistItems.api.ts new file mode 100644 index 0000000..36508b8 --- /dev/null +++ b/test/generated/next/checklistItems/checklistItems.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChecklistItemsModels } from "./checklistItems.models"; + +export namespace ChecklistItemsApi { +export const create = (officeId: string, data: ChecklistItemsModels.CreateChecklistItemRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items`, + ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), + config + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, + `/offices/${officeId}/checklist-items`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, + `/offices/${officeId}/checklist-items/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items/${id}`, + ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-items/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-items/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/checklistItems/checklistItems.configs.ts b/test/generated/next/checklistItems/checklistItems.configs.ts new file mode 100644 index 0000000..f67024d --- /dev/null +++ b/test/generated/next/checklistItems/checklistItems.configs.ts @@ -0,0 +1,116 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChecklistItemsModels } from "./checklistItems.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChecklistItemsQueries } from "./checklistItems.queries"; +import { ChecklistItemsAcl } from "./checklistItems.acl"; + +export namespace ChecklistItemsConfigs { +export const checklistItemsConfig = { + meta: { + title: "Checklist Items", + }, + readAll: { + acl: ChecklistItemsAcl.canUsePaginate, + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + paginated: ChecklistItemsQueries.usePaginate, + infinite: ChecklistItemsQueries.usePaginateInfinite, + filters: { + schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: ChecklistItemsAcl.canUseFindById, + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + query: ChecklistItemsQueries.useFindById, + }, + create: { + acl: ChecklistItemsAcl.canUseCreate, + schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, + mutation: ChecklistItemsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, + update: { + acl: ChecklistItemsAcl.canUseUpdate, + schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, + mutation: ChecklistItemsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: ChecklistItemsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChecklistItemsQueries.usePaginateLabels, + infinite: ChecklistItemsQueries.usePaginateLabelsInfinite, + filters: { + schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/checklistItems/checklistItems.models.ts b/test/generated/next/checklistItems/checklistItems.models.ts new file mode 100644 index 0000000..5d31cea --- /dev/null +++ b/test/generated/next/checklistItems/checklistItems.models.ts @@ -0,0 +1,107 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChecklistItemsModels { +/** + * ChecklistItemEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ChecklistItemEmployeeDTO = z.infer; + +/** + * ChecklistItemResponseDTOSchema + * @type { object } + * @property { string } id Checklist item ID + * @property { string } name Checklist item name + * @property { string } officeId Office ID + * @property { boolean } archived Is archived + * @property { string } archivedAt Archived at + * @property { string } createdById ID of the employee who created this checklist item + * @property { ChecklistItemEmployeeDTO } createdBy Employee who created this checklist item + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this checklist item + * @property { ChecklistItemEmployeeDTO } updatedBy Employee who last updated this checklist item + * @property { string } updatedAt Updated at + */ +export const ChecklistItemResponseDTOSchema = z.object({ id: z.string().describe("Checklist item ID"), name: z.string().describe("Checklist item name"), officeId: z.string().describe("Office ID"), archived: z.boolean().describe("Is archived"), archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), createdById: z.string().describe("ID of the employee who created this checklist item").nullish(), createdBy: ChecklistItemEmployeeDTOSchema.describe("Employee who created this checklist item").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedById: z.string().describe("ID of the employee who last updated this checklist item").nullish(), updatedBy: ChecklistItemEmployeeDTOSchema.describe("Employee who last updated this checklist item").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); +export type ChecklistItemResponseDTO = z.infer; + +/** + * CreateChecklistItemRequestDTOSchema + * @type { object } + * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` + */ +export const CreateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256).describe("Checklist item name") }).readonly(); +export type CreateChecklistItemRequestDTO = z.infer; + +/** + * ChecklistItemLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const ChecklistItemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type ChecklistItemLabelFilterDto = z.infer; + +/** + * ChecklistItemFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ChecklistItemFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); +export type ChecklistItemFilterDto = z.infer; + +/** + * UpdateChecklistItemRequestDTOSchema + * @type { object } + * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` + */ +export const UpdateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256).describe("Checklist item name") }).readonly(); +export type UpdateChecklistItemRequestDTO = z.infer; + +/** + * ChecklistItemsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistItemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistItemsPaginateOrderParamEnum = z.infer; +export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderParamEnumSchema.enum; + +/** + * ChecklistItemsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChecklistItemResponseDTO[] } items + */ +export const ChecklistItemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).readonly() }).readonly().shape }); +export type ChecklistItemsPaginateResponse = z.infer; + +/** + * ChecklistItemsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistItemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistItemsPaginateLabelsOrderParamEnum = z.infer; +export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * ChecklistItemsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type ChecklistItemsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/checklistItems/checklistItems.queries.ts b/test/generated/next/checklistItems/checklistItems.queries.ts new file mode 100644 index 0000000..4ec35c8 --- /dev/null +++ b/test/generated/next/checklistItems/checklistItems.queries.ts @@ -0,0 +1,270 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChecklistItemsAcl } from "./checklistItems.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChecklistItemsModels } from "./checklistItems.models"; +import { ChecklistItemsApi } from "./checklistItems.api"; + +export namespace ChecklistItemsQueries { +export const moduleName = QueryModule.ChecklistItems; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-items/:id", id, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create checklist item + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ChecklistItemsModels.CreateChecklistItemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ChecklistItemsAcl.canUseCreate({ officeId } )); + return ChecklistItemsApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Get paginated checklist items + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); + return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated checklist items + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); + return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate checklist item labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate checklist item labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get checklist item by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUseFindById({ officeId } )); + return ChecklistItemsApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update checklist item + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ChecklistItemsModels.UpdateChecklistItemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId } )); + return ChecklistItemsApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive checklist item + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistItemsAcl.canUseArchive({ officeId } )); + return ChecklistItemsApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive checklist item + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId } )); + return ChecklistItemsApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/checklistTemplates/checklistTemplates.acl.ts b/test/generated/next/checklistTemplates/checklistTemplates.acl.ts new file mode 100644 index 0000000..d92f5fd --- /dev/null +++ b/test/generated/next/checklistTemplates/checklistTemplates.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ChecklistTemplatesAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create checklist template in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Create", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List checklist templates for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Get checklist template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get checklist template by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Update", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +} diff --git a/test/generated/next/checklistTemplates/checklistTemplates.api.ts b/test/generated/next/checklistTemplates/checklistTemplates.api.ts new file mode 100644 index 0000000..e0b177b --- /dev/null +++ b/test/generated/next/checklistTemplates/checklistTemplates.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; + +export namespace ChecklistTemplatesApi { +export const create = (officeId: string, data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates`, + ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), + config + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, + `/offices/${officeId}/checklist-templates`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/checklist-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates/${id}`, + ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-templates/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/checklist-templates/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/checklistTemplates/checklistTemplates.configs.ts b/test/generated/next/checklistTemplates/checklistTemplates.configs.ts new file mode 100644 index 0000000..474d9c0 --- /dev/null +++ b/test/generated/next/checklistTemplates/checklistTemplates.configs.ts @@ -0,0 +1,118 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ChecklistTemplatesQueries } from "./checklistTemplates.queries"; +import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; + +export namespace ChecklistTemplatesConfigs { +export const checklistTemplatesConfig = { + meta: { + title: "Checklist Templates", + }, + readAll: { + acl: ChecklistTemplatesAcl.canUsePaginate, + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + paginated: ChecklistTemplatesQueries.usePaginate, + infinite: ChecklistTemplatesQueries.usePaginateInfinite, + filters: { + schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + items: true, + }, + sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: ChecklistTemplatesAcl.canUseFindById, + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + query: ChecklistTemplatesQueries.useFindById, + }, + create: { + acl: ChecklistTemplatesAcl.canUseCreate, + schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, + mutation: ChecklistTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, + update: { + acl: ChecklistTemplatesAcl.canUseUpdate, + schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, + mutation: ChecklistTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + items: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ChecklistTemplatesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ChecklistTemplatesQueries.usePaginateLabels, + infinite: ChecklistTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/checklistTemplates/checklistTemplates.models.ts b/test/generated/next/checklistTemplates/checklistTemplates.models.ts new file mode 100644 index 0000000..3c0da4d --- /dev/null +++ b/test/generated/next/checklistTemplates/checklistTemplates.models.ts @@ -0,0 +1,119 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ChecklistTemplatesModels { +/** + * ChecklistTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ChecklistTemplateEmployeeDTO = z.infer; + +/** + * ChecklistTemplateItemResponseDTOSchema + * @type { object } + * @property { string } checklistItemId Checklist item id + * @property { number } order Order index + * @property { string } name Checklist item name + */ +export const ChecklistTemplateItemResponseDTOSchema = z.object({ checklistItemId: z.string().describe("Checklist item id"), order: z.number().describe("Order index"), name: z.string().describe("Checklist item name").nullish() }).readonly(); +export type ChecklistTemplateItemResponseDTO = z.infer; + +/** + * ChecklistTemplateResponseDTOSchema + * @type { object } + * @property { string } id Template id + * @property { string } name Template name + * @property { string } officeId Office id + * @property { boolean } archived Is archived + * @property { string } archivedAt Archived at + * @property { string } createdById ID of the employee who created this template + * @property { ChecklistTemplateEmployeeDTO } createdBy Employee who created this template + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this template + * @property { ChecklistTemplateEmployeeDTO } updatedBy Employee who last updated this template + * @property { string } updatedAt Updated at + * @property { ChecklistTemplateItemResponseDTO[] } items Ordered items + */ +export const ChecklistTemplateResponseDTOSchema = z.object({ id: z.string().describe("Template id"), name: z.string().describe("Template name"), officeId: z.string().describe("Office id"), archived: z.boolean().describe("Is archived"), archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), createdById: z.string().describe("ID of the employee who created this template").nullish(), createdBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), updatedBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), items: z.array(ChecklistTemplateItemResponseDTOSchema).readonly().describe("Ordered items") }).readonly(); +export type ChecklistTemplateResponseDTO = z.infer; + +/** + * CreateChecklistTemplateRequestDTOSchema + * @type { object } + * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` + */ +export const CreateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120).describe("Checklist template name") }).readonly(); +export type CreateChecklistTemplateRequestDTO = z.infer; + +/** + * ChecklistTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const ChecklistTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type ChecklistTemplateLabelFilterDto = z.infer; + +/** + * ChecklistTemplateFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ChecklistTemplateFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); +export type ChecklistTemplateFilterDto = z.infer; + +/** + * UpdateChecklistTemplateRequestDTOSchema + * @type { object } + * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` + * @property { string[] } items Ordered checklist item ids + */ +export const UpdateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120).describe("Checklist template name"), items: z.array(z.uuid()).readonly().describe("Ordered checklist item ids") }).readonly(); +export type UpdateChecklistTemplateRequestDTO = z.infer; + +/** + * ChecklistTemplatesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistTemplatesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistTemplatesPaginateOrderParamEnum = z.infer; +export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPaginateOrderParamEnumSchema.enum; + +/** + * ChecklistTemplatesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChecklistTemplateResponseDTO[] } items + */ +export const ChecklistTemplatesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).readonly() }).readonly().shape }); +export type ChecklistTemplatesPaginateResponse = z.infer; + +/** + * ChecklistTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistTemplatesPaginateLabelsOrderParamEnum = z.infer; +export const ChecklistTemplatesPaginateLabelsOrderParamEnum = ChecklistTemplatesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * ChecklistTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type ChecklistTemplatesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/checklistTemplates/checklistTemplates.queries.ts b/test/generated/next/checklistTemplates/checklistTemplates.queries.ts new file mode 100644 index 0000000..bbbf515 --- /dev/null +++ b/test/generated/next/checklistTemplates/checklistTemplates.queries.ts @@ -0,0 +1,270 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ChecklistTemplatesModels } from "./checklistTemplates.models"; +import { ChecklistTemplatesApi } from "./checklistTemplates.api"; + +export namespace ChecklistTemplatesQueries { +export const moduleName = QueryModule.ChecklistTemplates; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-templates/:id", id, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create checklist template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId } )); + return ChecklistTemplatesApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Get paginated checklist templates + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated checklist templates + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate checklist template labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate checklist template labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get checklist template by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId } )); + return ChecklistTemplatesApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Replace checklist template + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId } )); + return ChecklistTemplatesApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive checklist template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId } )); + return ChecklistTemplatesApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive checklist template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId } )); + return ChecklistTemplatesApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/cities/cities.acl.ts b/test/generated/next/cities/cities.acl.ts new file mode 100644 index 0000000..877afd1 --- /dev/null +++ b/test/generated/next/cities/cities.acl.ts @@ -0,0 +1,84 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CitiesAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "City" +] as AbilityTuple<"Create", "City">; + +/** + * Use for `useListCityLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCityLabels` query + */ +export const canUseListCityLabels = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useGetCityLabelById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCityLabelById` query + */ +export const canUseGetCityLabelById = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "City" +] as AbilityTuple<"Update", "City">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "City" +] as AbilityTuple<"Archive", "City">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "City" +] as AbilityTuple<"Archive", "City">; + +} diff --git a/test/generated/next/cities/cities.api.ts b/test/generated/next/cities/cities.api.ts new file mode 100644 index 0000000..17b6f45 --- /dev/null +++ b/test/generated/next/cities/cities.api.ts @@ -0,0 +1,86 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CitiesModels } from "./cities.models"; + +export namespace CitiesApi { +export const paginate = (limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CitiesModels.CitiesPaginateResponseSchema }, + `/cities`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: CitiesModels.CreateCityRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities`, + ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), + config + ) +}; +export const listCityLabels = (limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CitiesModels.ListCityLabelsResponseSchema }, + `/cities/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getCityLabelById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CitiesModels.CityLabelResponseDTOSchema }, + `/cities/${id}/labels`, + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities/${id}`, + config + ) +}; +export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities/${id}`, + ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/cities/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/cities/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/cities/cities.configs.ts b/test/generated/next/cities/cities.configs.ts new file mode 100644 index 0000000..f31740c --- /dev/null +++ b/test/generated/next/cities/cities.configs.ts @@ -0,0 +1,124 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CitiesModels } from "./cities.models"; +import { CitiesQueries } from "./cities.queries"; +import { CitiesAcl } from "./cities.acl"; + +export namespace CitiesConfigs { +export const citiesConfig = { + meta: { + title: "Cities", + }, + readAll: { + acl: CitiesAcl.canUsePaginate, + schema: CitiesModels.CityResponseDTOSchema, + paginated: CitiesQueries.usePaginate, + infinite: CitiesQueries.usePaginateInfinite, + filters: { + schema: CitiesModels.CityPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CitiesModels.CityPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CitiesModels.CityResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + isoCode: true, + stateCode: true, + archived: true, + countryId: true, + country: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CitiesModels.CitiesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: CitiesAcl.canUseFindById, + schema: CitiesModels.CityResponseDTOSchema, + query: CitiesQueries.useFindById, + }, + create: { + acl: CitiesAcl.canUseCreate, + schema: CitiesModels.CreateCityRequestDTOSchema, + mutation: CitiesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CitiesModels.CreateCityRequestDTOSchema, + options: { + inputs: { + name: true, + isoCode: true, + stateCode: true, + countryId: true, + }, + }, +}) + }, + update: { + acl: CitiesAcl.canUseUpdate, + schema: CitiesModels.UpdateCityRequestDTOSchema, + mutation: CitiesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CitiesModels.UpdateCityRequestDTOSchema, + options: { + inputs: { + name: true, + isoCode: true, + stateCode: true, + countryId: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: CitiesAcl.canUseListCityLabels, + schema: CitiesModels.CityLabelResponseDTOSchema, + paginated: CitiesQueries.useListCityLabels, + infinite: CitiesQueries.useListCityLabelsInfinite, + filters: { + schema: CitiesModels.CityLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CitiesModels.CityLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CitiesModels.CityLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + country: true, + }, + sortable: CitiesModels.ListCityLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/cities/cities.models.ts b/test/generated/next/cities/cities.models.ts new file mode 100644 index 0000000..8b422a7 --- /dev/null +++ b/test/generated/next/cities/cities.models.ts @@ -0,0 +1,145 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CitiesModels { +/** + * CityCountryDtoSchema + * @type { object } + * @property { string } id Unique identifier of the country + * @property { string } name Name of the country + * @property { string } isoCode2 2 character iso code of the country + * @property { string } isoCode3 3 character iso code of the country + */ +export const CityCountryDtoSchema = z.object({ id: z.string().describe("Unique identifier of the country"), name: z.string().describe("Name of the country"), isoCode2: z.string().describe("2 character iso code of the country"), isoCode3: z.string().describe("3 character iso code of the country") }).readonly(); +export type CityCountryDto = z.infer; + +/** + * CityEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CityEmployeeDTO = z.infer; + +/** + * CityResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the city + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { boolean } archived Whether the city is archived + * @property { string } countryId Country ID + * @property { CityCountryDto } country + * @property { string } createdById + * @property { CityEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CityEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const CityResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the city"), name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city").nullish(), stateCode: z.string().describe("State code of the city").nullish(), archived: z.boolean().describe("Whether the city is archived").nullish(), countryId: z.string().describe("Country ID").nullish(), country: CityCountryDtoSchema.nullish(), createdById: z.string().nullish(), createdBy: CityEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CityEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type CityResponseDTO = z.infer; + +/** + * CityLabelCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CityLabelCountryDto = z.infer; + +/** + * CityLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { CityLabelCountryDto } country + */ +export const CityLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }).readonly(); +export type CityLabelResponseDTO = z.infer; + +/** + * CityPaginationFilterDtoSchema + * @type { object } + * @property { string } search Free search + * @property { boolean } archived + */ +export const CityPaginationFilterDtoSchema = z.object({ search: z.string().describe("Free search"), archived: z.boolean() }).readonly(); +export type CityPaginationFilterDto = z.infer; + +/** + * CityLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const CityLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type CityLabelFilterDto = z.infer; + +/** + * CreateCityRequestDTOSchema + * @type { object } + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { string } countryId Country ID + */ +export const CreateCityRequestDTOSchema = z.object({ name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city").nullish(), stateCode: z.string().describe("State code of the city").nullish(), countryId: z.string().describe("Country ID") }).readonly(); +export type CreateCityRequestDTO = z.infer; + +/** + * UpdateCityRequestDTOSchema + * @type { object } + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { string } countryId Country ID + */ +export const UpdateCityRequestDTOSchema = z.object({ name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city"), stateCode: z.string().describe("State code of the city"), countryId: z.string().describe("Country ID") }).readonly(); +export type UpdateCityRequestDTO = z.infer; + +/** + * CitiesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const CitiesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type CitiesPaginateOrderParamEnum = z.infer; +export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.enum; + +/** + * CitiesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CityResponseDTO[] } items + */ +export const CitiesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityResponseDTOSchema).readonly() }).readonly().shape }); +export type CitiesPaginateResponse = z.infer; + +/** + * ListCityLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ListCityLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ListCityLabelsOrderParamEnum = z.infer; +export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.enum; + +/** + * ListCityLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CityLabelResponseDTO[] } items + */ +export const ListCityLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type ListCityLabelsResponse = z.infer; + +} diff --git a/test/generated/next/cities/cities.queries.ts b/test/generated/next/cities/cities.queries.ts new file mode 100644 index 0000000..4ed9739 --- /dev/null +++ b/test/generated/next/cities/cities.queries.ts @@ -0,0 +1,283 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CitiesAcl } from "./cities.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CitiesModels } from "./cities.models"; +import { CitiesApi } from "./cities.api"; + +export namespace CitiesQueries { +export const moduleName = QueryModule.Cities; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string) => [...keys.all, "/cities", "infinite", limit, order, filter, cursor] as const, + listCityLabels: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities/paginate/labels", limit, order, filter, page, cursor] as const, + listCityLabelsInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string) => [...keys.all, "/cities/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getCityLabelById: (id: string) => [...keys.all, "/cities/:id/labels", id] as const, + findById: (id: string) => [...keys.all, "/cities/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Cities + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CitiesAcl.canUsePaginate()); + return CitiesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Cities + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CitiesAcl.canUsePaginate()); + return CitiesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create city + * @permission Requires `canUseCreate` ability + * @param { CitiesModels.CreateCityRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CitiesAcl.canUseCreate()); + return CitiesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListCityLabels` + * @summary Paginate cities with only their labels (id and name) and country information + * @permission Requires `canUseListCityLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCityLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCityLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CitiesAcl.canUseListCityLabels()); + return CitiesApi.listCityLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListCityLabelsInfinite + * @summary Paginate cities with only their labels (id and name) and country information + * @permission Requires `canUseListCityLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListCityLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CitiesAcl.canUseListCityLabels()); + return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetCityLabelById` + * @summary Get city by ID with label format (id and formatted name) and country information + * @permission Requires `canUseGetCityLabelById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCityLabelById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCityLabelById(id), + queryFn: () => { + checkAcl(CitiesAcl.canUseGetCityLabelById()); + return CitiesApi.getCityLabelById(id, config) }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get city by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(CitiesAcl.canUseFindById()); + return CitiesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update city + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { CitiesModels.UpdateCityRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(CitiesAcl.canUseUpdate()); + return CitiesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive city + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CitiesAcl.canUseArchive()); + return CitiesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive city + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CitiesAcl.canUseUnarchive()); + return CitiesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/common/common.models.ts b/test/generated/next/common/common.models.ts new file mode 100644 index 0000000..93928b8 --- /dev/null +++ b/test/generated/next/common/common.models.ts @@ -0,0 +1,1860 @@ +import { z } from "zod"; + +export namespace CommonModels { +/** + * PositionCargoPackageEnumSchema + * @type { enum } + */ +export const PositionCargoPackageEnumSchema = z.enum(["Hazardous", "NonStackable", "TemperatureControlled", "OversizedCargo", "DiplomaticCargo"]); +export type PositionCargoPackageEnum = z.infer; +export const PositionCargoPackageEnum = PositionCargoPackageEnumSchema.enum; + +/** + * HazardousSpecialtyEnumSchema + * @type { enum } + */ +export const HazardousSpecialtyEnumSchema = z.enum(["Explosives", "FlammableGas", "NonToxicAndFlammableGas", "PoisonGases", "FlammableLiquid", "FlammableSolid", "SpontaneouslyCombustible", "DangerousWhenWet", "Oxidizers", "OrganicPeroxides", "Poison", "InfectiousSubstances", "Radioactive", "Corrosive", "MiscellaneousDangerousSubstances"]); +export type HazardousSpecialtyEnum = z.infer; +export const HazardousSpecialtyEnum = HazardousSpecialtyEnumSchema.enum; + +/** + * RateOptionsEnumSchema + * @type { enum } + */ +export const RateOptionsEnumSchema = z.enum(["AsAgreed", "SpotRate"]); +export type RateOptionsEnum = z.infer; +export const RateOptionsEnum = RateOptionsEnumSchema.enum; + +/** + * RateClassEnumSchema + * @type { enum } + */ +export const RateClassEnumSchema = z.enum(["MinimumCharge", "NormalRate", "QuantityRate"]); +export type RateClassEnum = z.infer; +export const RateClassEnum = RateClassEnumSchema.enum; + +/** + * AccountInformationEnumSchema + * @type { enum } + * @description Account information + */ +export const AccountInformationEnumSchema = z.enum(["FreightCollect", "FreightPrepaid"]); +export type AccountInformationEnum = z.infer; +export const AccountInformationEnum = AccountInformationEnumSchema.enum; + +/** + * LanguageEnumSchema + * @type { enum } + */ +export const LanguageEnumSchema = z.enum(["English", "German", "Hungarian", "Czech", "Turkish", "Slovenian"]); +export type LanguageEnum = z.infer; +export const LanguageEnum = LanguageEnumSchema.enum; + +/** + * LocaleEnumSchema + * @type { enum } + */ +export const LocaleEnumSchema = z.enum(["en-US", "de-DE", "cs-CZ", "sl-SI", "tr-TR", "hu-HU"]); +export type LocaleEnum = z.infer; +export const LocaleEnum = LocaleEnumSchema.enum; + +/** + * OfficePaymentTermsDateTypeSchema + * @type { enum } + */ +export const OfficePaymentTermsDateTypeSchema = z.enum(["InvoiceDate", "ServiceDate"]); +export type OfficePaymentTermsDateType = z.infer; +export const OfficePaymentTermsDateType = OfficePaymentTermsDateTypeSchema.enum; + +/** + * FolderEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type FolderEmployeeDTO = z.infer; + +/** + * FileResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } archived + * @property { boolean } isSystem + * @property { string } createdAt + * @property { string } updatedAt + * @property { FolderEmployeeDTO } createdBy + * @property { FolderEmployeeDTO } updatedBy + * @property { string } downloadUrl + */ +export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }).readonly(); +export type FileResponseDTO = z.infer; + +/** + * EditorContentUpdateDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const EditorContentUpdateDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export type EditorContentUpdateDto = z.infer; + +/** + * RemarkBlockDTOSchema + * @type { object } + * @property { string } id + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { EditorContentUpdateDto } content + */ +export const RemarkBlockDTOSchema = z.object({ id: z.string(), enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), content: CommonModels.EditorContentUpdateDtoSchema }).readonly(); +export type RemarkBlockDTO = z.infer; + +/** + * TitleBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { string } defaultTitle + * @property { boolean } includePositionNumber + * @property { boolean } allowManualOverride + */ +export const TitleBlockDTOSchema = z.object({ enabled: z.boolean(), defaultTitle: z.string(), includePositionNumber: z.boolean(), allowManualOverride: z.boolean() }).readonly(); +export type TitleBlockDTO = z.infer; + +/** + * PositionInvolvedPartyTypeEnumSchema + * @type { enum } + */ +export const PositionInvolvedPartyTypeEnumSchema = z.enum(["Customer", "Notify", "AlsoNotify", "FOBForwarder", "RoutingAgent", "DeliveryAgent", "TransportProvider", "OceanCarrier", "OriginServiceProvider", "DestinationServiceProvider", "InsuranceProvider", "OriginCustomsAgent", "DestinationCustomsAgent", "StuffingProvider", "StrippingProvider", "Shipper", "Consignee", "CustomsBroker", "Courier", "Trucker", "Airline", "DestinationAgent", "OriginAgent"]); +export type PositionInvolvedPartyTypeEnum = z.infer; +export const PositionInvolvedPartyTypeEnum = PositionInvolvedPartyTypeEnumSchema.enum; + +/** + * ReceiverBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { string } defaultRole + */ +export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema }).readonly(); +export type ReceiverBlockDTO = z.infer; + +/** + * OurInformationBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } showName + * @property { boolean } showPhone + * @property { boolean } showDate + * @property { boolean } showBookingNumber + * @property { boolean } showCustomerReference + * @property { boolean } showMasterBillOfLadingNumber + * @property { boolean } showHouseBillOfLadingNumber + */ +export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean(), showName: z.boolean(), showPhone: z.boolean(), showDate: z.boolean(), showBookingNumber: z.boolean(), showCustomerReference: z.boolean(), showMasterBillOfLadingNumber: z.boolean(), showHouseBillOfLadingNumber: z.boolean() }).readonly(); +export type OurInformationBlockDTO = z.infer; + +/** + * RouteTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } showDate + * @property { boolean } showLocation + * @property { boolean } showType + * @property { boolean } showReference + * @property { boolean } showVesselVoyage + * @property { boolean } showAddress + * @property { boolean } showProvider + */ +export const RouteTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showDate: z.boolean(), showLocation: z.boolean(), showType: z.boolean(), showReference: z.boolean(), showVesselVoyage: z.boolean(), showAddress: z.boolean(), showProvider: z.boolean() }).readonly(); +export type RouteTableBlockDTO = z.infer; + +/** + * CargoTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + */ +export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export type CargoTableBlockDTO = z.infer; + +/** + * CargoSummaryBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + */ +export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export type CargoSummaryBlockDTO = z.infer; + +/** + * FinanceTableBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } showOnlyForReceiver + * @property { boolean } showVendor + * @property { boolean } showBuyRate + * @property { boolean } showCustomer + * @property { boolean } showSellRate + * @property { boolean } showGrid + * @property { boolean } showCharges + * @property { boolean } showAdditionalText + * @property { boolean } showQuantity + * @property { boolean } showProfit + * @property { boolean } showTotalsByCurrency + * @property { boolean } includeSubPositions + * @property { boolean } subPositionTotals + * @property { boolean } showBuyRateExchangeRates + * @property { boolean } showSellRateExchangeRates + * @property { boolean } showTotal + */ +export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showOnlyForReceiver: z.boolean(), showVendor: z.boolean(), showBuyRate: z.boolean(), showCustomer: z.boolean(), showSellRate: z.boolean(), showGrid: z.boolean(), showCharges: z.boolean(), showAdditionalText: z.boolean(), showQuantity: z.boolean(), showProfit: z.boolean(), showTotalsByCurrency: z.boolean(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean(), showSellRateExchangeRates: z.boolean(), showTotal: z.boolean() }).readonly(); +export type FinanceTableBlockDTO = z.infer; + +/** + * FooterBlockDTOSchema + * @type { object } + * @property { boolean } enabled + */ +export const FooterBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export type FooterBlockDTO = z.infer; + +/** + * TermsBlockDTOSchema + * @type { object } + * @property { boolean } enabled + */ +export const TermsBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export type TermsBlockDTO = z.infer; + +/** + * CutOffDatesBlockDTOSchema + * @type { object } + * @property { boolean } enabled + * @property { number } position 1-based order in the rendered document. Minimum: `1` + * @property { boolean } billOfLadingFromCustomer + * @property { boolean } billOfLadingToCarrier + * @property { boolean } customsAMS + * @property { boolean } vgmCustomer + */ +export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), billOfLadingFromCustomer: z.boolean(), billOfLadingToCarrier: z.boolean(), customsAMS: z.boolean(), vgmCustomer: z.boolean() }).readonly(); +export type CutOffDatesBlockDTO = z.infer; + +/** + * TemplateBlocksResponseDTOSchema + * @type { object } + * @property { TitleBlockDTO } titleBlock + * @property { ReceiverBlockDTO } receiverBlock + * @property { OurInformationBlockDTO } ourInformationBlock + * @property { RouteTableBlockDTO } routeTableBlock + * @property { CargoTableBlockDTO } cargoTableBlock + * @property { CargoSummaryBlockDTO } cargoSummaryBlock + * @property { FinanceTableBlockDTO } financeTableBlock + * @property { RemarkBlockDTO[] } remarkBlocks + * @property { FooterBlockDTO } footerBlock + * @property { TermsBlockDTO } termsBlock + * @property { CutOffDatesBlockDTO } cutOffDatesBlock + */ +export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); +export type TemplateBlocksResponseDTO = z.infer; + +/** + * RouteTableProviderDtoSchema + * @type { object } + * @property { string } id Provider ID + * @property { string } name Provider name + */ +export const RouteTableProviderDtoSchema = z.object({ id: z.string().describe("Provider ID"), name: z.string().describe("Provider name") }).readonly(); +export type RouteTableProviderDto = z.infer; + +/** + * RouteTablePointDtoSchema + * @type { object } + * @property { string } id Route point ID + * @property { string } type Route point type + * @property { string } datetime Route point datetime + * @property { string } secondaryDatetime Route point secondary datetime + * @property { string } address Route point address + * @property { string } name Route point address name + * @property { string } reference Route point reference + * @property { RouteTableProviderDto } provider Route point provider + * @property { string } vessel Vessel information + * @property { string } voyage Voyage information + * @property { string } carrier Carrier name + */ +export const RouteTablePointDtoSchema = z.object({ id: z.string().describe("Route point ID"), type: z.string().describe("Route point type"), datetime: z.string().describe("Route point datetime").nullish(), secondaryDatetime: z.string().describe("Route point secondary datetime").nullish(), address: z.string().describe("Route point address").nullish(), name: z.string().describe("Route point address name").nullish(), reference: z.string().describe("Route point reference").nullish(), provider: CommonModels.RouteTableProviderDtoSchema.describe("Route point provider").nullish(), vessel: z.string().describe("Vessel information").nullish(), voyage: z.string().describe("Voyage information").nullish(), carrier: z.string().describe("Carrier name").nullish() }).readonly(); +export type RouteTablePointDto = z.infer; + +/** + * RouteTableBlockResponseDtoSchema + * @type { object } + * @property { string } selectedRouteId Selected route ID + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { boolean } showReference Show reference column + * @property { boolean } showVesselVoyage Show vessel/voyage column + * @property { boolean } showProvider Show provider column + * @property { RouteTablePointDto[] } points Route points + * @property { boolean } showAddress Show address + * @property { boolean } showDates Show dates + * @property { boolean } showType Show type + * @property { boolean } showLocation Show location + * @property { boolean } showGrid Show grid + * @property { boolean } suppressRoute Suppress route + */ +export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID").nullish(), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish(), showAddress: z.boolean().describe("Show address").nullish(), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); +export type RouteTableBlockResponseDto = z.infer; + +/** + * CargoSpecialtyDtoSchema + * @type { object } + * @property { string } name + * @property { string } unNumber UN number for hazardous specialty + * @property { string } IMOClass IMO class for hazardous specialty + * @property { number } temperatureFrom Temperature from (°C) for temperature-controlled specialty + * @property { number } temperatureUntil Temperature until (°C) for temperature-controlled specialty + */ +export const CargoSpecialtyDtoSchema = z.object({ name: CommonModels.PositionCargoPackageEnumSchema, unNumber: z.string().describe("UN number for hazardous specialty").nullish(), IMOClass: z.string().describe("IMO class for hazardous specialty").nullish(), temperatureFrom: z.number().describe("Temperature from (°C) for temperature-controlled specialty").nullish(), temperatureUntil: z.number().describe("Temperature until (°C) for temperature-controlled specialty").nullish() }).readonly(); +export type CargoSpecialtyDto = z.infer; + +/** + * CargoPackageDtoSchema + * @type { object } + * @property { string } id Package ID + * @property { string } description Package description + * @property { string } weight Weight + * @property { string } hsCodes HS codes (numeric only) + * @property { number } quantity Quantity + * @property { number } width Width (cm) + * @property { number } length Length (cm) + * @property { number } height Height (cm) + * @property { number } volume Total volume in m3 for this package group + * @property { string } packageType Package type name + * @property { string } caseMarks Case marks + * @property { CargoSpecialtyDto[] } specialties Package specialties + * @property { number } chargeableWeight Chargeable weight in kg + * @property { number } volumetricWeight Volumetric weight in kg + */ +export const CargoPackageDtoSchema = z.object({ id: z.string().describe("Package ID"), description: z.string().describe("Package description").nullish(), weight: z.string().describe("Weight").nullish(), hsCodes: z.string().describe("HS codes (numeric only)").nullish(), quantity: z.number().describe("Quantity").nullish(), width: z.number().describe("Width (cm)").nullish(), length: z.number().describe("Length (cm)").nullish(), height: z.number().describe("Height (cm)").nullish(), volume: z.number().describe("Total volume in m3 for this package group").nullish(), packageType: z.string().describe("Package type name").nullish(), caseMarks: z.string().describe("Case marks").nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).readonly().describe("Package specialties").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg").nullish() }).readonly(); +export type CargoPackageDto = z.infer; + +/** + * CargoItemRouteDtoSchema + * @type { object } + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { RouteTablePointDto[] } points Route points + */ +export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish() }).readonly(); +export type CargoItemRouteDto = z.infer; + +/** + * CargoItemDtoSchema + * @type { object } + * @property { string } cargoId Cargo ID + * @property { string } cargoType Cargo type + * @property { string } containerNumber Container number + * @property { string } seal1 First seal (sea cargo only) + * @property { string } seal2 Second seal (sea cargo only) + * @property { string } vgm Verified gross mass (VGM) for container, sea cargo only + * @property { number } totalGrossWeight Total gross weight from cargo details + * @property { number } totalVolume Total volume (m3) calculated from cargo packages + * @property { number } chargeableWeight Chargeable weight in kg for transport unit + * @property { number } volumetricWeight Volumetric weight in kg for transport unit + * @property { CargoPackageDto[] } packages Cargo packages + * @property { string[] } selectedPackageIds Selected cargo package IDs + * @property { CargoItemRouteDto } route Cargo route (when routes are split) + */ +export const CargoItemDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID"), cargoType: z.string().describe("Cargo type"), containerNumber: z.string().describe("Container number").nullish(), seal1: z.string().describe("First seal (sea cargo only)").nullish(), seal2: z.string().describe("Second seal (sea cargo only)").nullish(), vgm: z.string().describe("Verified gross mass (VGM) for container, sea cargo only").nullish(), totalGrossWeight: z.number().describe("Total gross weight from cargo details").nullish(), totalVolume: z.number().describe("Total volume (m3) calculated from cargo packages").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg for transport unit").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg for transport unit").nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema).readonly().describe("Cargo packages"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteDtoSchema.describe("Cargo route (when routes are split)").nullish() }).readonly(); +export type CargoItemDto = z.infer; + +/** + * CargoTableBlockDtoSchema + * @type { object } + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { boolean } suppressWeight Suppress weight column display + * @property { boolean } showGrid Show grid borders in cargo table + * @property { boolean } suppressVolume Suppress volume column display + * @property { boolean } suppressSpecialities Suppress specialities column display + * @property { boolean } suppressDimensions Suppress dimensions column display + * @property { boolean } suppressPackageVolume Suppress package volume column display + * @property { boolean } suppressPackageWeight Suppress package weight column display + * @property { boolean } showGrandTotal Show grand total + * @property { boolean } showTransportUnitTotal Show transport unit total + * @property { boolean } showRoute Show route information (only applicable when routes are split) + * @property { boolean } suppressCargo Suppress cargo table display + * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units + * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units + * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages + * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages + * @property { boolean } showPackageHSCodes Show HS codes for packages + * @property { boolean } showPackageType Show package type for packages + * @property { boolean } showPackageQuantity Show quantity for packages + * @property { boolean } showPackageDescription Show description for packages + * @property { boolean } showPackageCaseMarks Show case marks for packages + * @property { boolean } showTransportUnitNumber Show transport unit number + * @property { boolean } showTransportUnitType Show transport unit type + * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 + * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 + * @property { CargoItemDto[] } items Cargo items + */ +export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs").nullish(), suppressWeight: z.boolean().describe("Suppress weight column display").nullish(), showGrid: z.boolean().describe("Show grid borders in cargo table").nullish(), suppressVolume: z.boolean().describe("Suppress volume column display").nullish(), suppressSpecialities: z.boolean().describe("Suppress specialities column display").nullish(), suppressDimensions: z.boolean().describe("Suppress dimensions column display").nullish(), suppressPackageVolume: z.boolean().describe("Suppress package volume column display").nullish(), suppressPackageWeight: z.boolean().describe("Suppress package weight column display").nullish(), showGrandTotal: z.boolean().describe("Show grand total").nullish(), showTransportUnitTotal: z.boolean().describe("Show transport unit total").nullish(), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullish(), suppressCargo: z.boolean().describe("Suppress cargo table display").nullish(), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units").nullish(), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units").nullish(), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages").nullish(), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages").nullish(), showPackageHSCodes: z.boolean().describe("Show HS codes for packages").nullish(), showPackageType: z.boolean().describe("Show package type for packages").nullish(), showPackageQuantity: z.boolean().describe("Show quantity for packages").nullish(), showPackageDescription: z.boolean().describe("Show description for packages").nullish(), showPackageCaseMarks: z.boolean().describe("Show case marks for packages").nullish(), showTransportUnitNumber: z.boolean().describe("Show transport unit number").nullish(), showTransportUnitType: z.boolean().describe("Show transport unit type").nullish(), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1").nullish(), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2").nullish(), items: z.array(CommonModels.CargoItemDtoSchema).readonly().describe("Cargo items") }).readonly(); +export type CargoTableBlockDto = z.infer; + +/** + * SummaryCargoItemDtoSchema + * @type { object } + * @property { string } transportUnitType Cargo type name (transport unit type) + * @property { number } quantity Count of cargos for this type + * @property { string } description Comma-joined transport unit numbers or custom description + */ +export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), quantity: z.number().describe("Count of cargos for this type"), description: z.string().describe("Comma-joined transport unit numbers or custom description") }).readonly(); +export type SummaryCargoItemDto = z.infer; + +/** + * SummaryCargoBlockResponseDtoSchema + * @type { object } + * @property { SummaryCargoItemDto[] } items + */ +export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema).readonly() }).readonly(); +export type SummaryCargoBlockResponseDto = z.infer; + +/** + * PositionAccountItemTypeEnumSchema + * @type { enum } + */ +export const PositionAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); +export type PositionAccountItemTypeEnum = z.infer; +export const PositionAccountItemTypeEnum = PositionAccountItemTypeEnumSchema.enum; + +/** + * FinanceRowDtoSchema + * @type { object } + * @property { string } id Finance row ID + * @property { PositionAccountItemTypeEnum } type Item type + * @property { string } chargeType Charge type + * @property { string } additionalText Additional text + * @property { string } text Text content + * @property { number } buyAmount Buy amount + * @property { string } buyCurrencyNotation Buy currency notation + * @property { number } sellAmount Sell amount + * @property { string } sellCurrencyNotation Sell currency notation + * @property { string } buyBPName Buy business partner name + * @property { string } sellBPName Sell business partner name + * @property { number } sellExchangeRate Sell exchange rate + * @property { number } buyExchangeRate Buy exchange rate + * @property { number } quantity Quantity + */ +export const FinanceRowDtoSchema = z.object({ id: z.string().describe("Finance row ID"), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), chargeType: z.string().describe("Charge type").nullish(), additionalText: z.string().describe("Additional text").nullish(), text: z.string().describe("Text content").nullish(), buyAmount: z.number().describe("Buy amount").nullish(), buyCurrencyNotation: z.string().describe("Buy currency notation").nullish(), sellAmount: z.number().describe("Sell amount").nullish(), sellCurrencyNotation: z.string().describe("Sell currency notation").nullish(), buyBPName: z.string().describe("Buy business partner name").nullish(), sellBPName: z.string().describe("Sell business partner name").nullish(), sellExchangeRate: z.number().describe("Sell exchange rate").nullish(), buyExchangeRate: z.number().describe("Buy exchange rate").nullish(), quantity: z.number().describe("Quantity").nullish() }).readonly(); +export type FinanceRowDto = z.infer; + +/** + * FinanceTotalsDtoSchema + * @type { object } + * @property { number } customerTotal Customer total + * @property { number } vendorTotal Vendor total + * @property { number } combinedTotal Combined total + * @property { string } currencyNotation Currency notation + */ +export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().describe("Customer total"), vendorTotal: z.number().describe("Vendor total"), combinedTotal: z.number().describe("Combined total"), currencyNotation: z.string().describe("Currency notation") }).readonly(); +export type FinanceTotalsDto = z.infer; + +/** + * FinanceTotalsByCurrencyDtoSchema + * @type { object } + * @property { string } currencyNotation Currency notation + * @property { number } vendorTotal Total for vendor side in this currency + * @property { number } customerTotal Total for customer side in this currency + */ +export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string().describe("Currency notation"), vendorTotal: z.number().describe("Total for vendor side in this currency").nullish(), customerTotal: z.number().describe("Total for customer side in this currency").nullish() }).readonly(); +export type FinanceTotalsByCurrencyDto = z.infer; + +/** + * FinanceTablePositionDtoSchema + * @type { object } + * @property { FinanceRowDto[] } rows Finance rows + * @property { FinanceTotalsDto } totals Finance totals + * @property { string[] } selectedFinanceRowIds Selected finance row IDs + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency + */ +export const FinanceTablePositionDtoSchema = z.object({ rows: z.array(CommonModels.FinanceRowDtoSchema).readonly().describe("Finance rows"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); +export type FinanceTablePositionDto = z.infer; + +/** + * FinanceTableBlockDtoSchema + * @type { object } + * @property { string } selectedBpId Selected business partner ID + * @property { boolean } showVendor Show vendor + * @property { boolean } showBuyRate Show buy rate + * @property { boolean } showCustomer Show customer + * @property { boolean } showSellRate Show sell rate + * @property { boolean } showGrid Show grid + * @property { boolean } showCharges Show charges + * @property { boolean } showAdditionalText Show additional text + * @property { boolean } showQuantity Show quantity + * @property { boolean } showTotalsByCurrency Show totals grouped by currency + * @property { boolean } suppressFinances Suppress finances from output + * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero + * @property { boolean } showTotal Show total from output + * @property { boolean } showProfit Show profit from output + * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output + * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output + * @property { boolean } includeSubPositions Include sub-positions + * @property { boolean } subPositionTotals Show sub-position totals + * @property { FinanceTablePositionDto[] } positions Finance positions + * @property { FinanceTotalsDto } totals Finance totals + * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency + */ +export const FinanceTableBlockDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionDtoSchema).readonly().describe("Finance positions"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); +export type FinanceTableBlockDto = z.infer; + +/** + * RemarkBlockDtoSchema + * @type { object } + * @property { string } id + * @property { number } position Minimum: `1` + * @property { EditorContentUpdateDto } content + * @property { boolean } enabled + */ +export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }).readonly(); +export type RemarkBlockDto = z.infer; + +/** + * ConfigBlockDtoSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + * @property { boolean } showWatermarkOnDocuments Show watermark on documents + * @property { LocaleEnum } locale + */ +export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), showWatermarkOnDocuments: z.boolean().describe("Show watermark on documents"), locale: CommonModels.LocaleEnumSchema }).readonly(); +export type ConfigBlockDto = z.infer; + +/** + * TitleBlockUpdateDtoSchema + * @type { object } + * @property { string } value Title value + */ +export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().describe("Title value") }).readonly(); +export type TitleBlockUpdateDto = z.infer; + +/** + * ReceiverBlockUpdateDtoSchema + * @type { object } + * @property { string } selectedBpId Receiver business partner ID + * @property { string } address Receiver address + */ +export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Receiver business partner ID"), address: z.string().describe("Receiver address") }).readonly(); +export type ReceiverBlockUpdateDto = z.infer; + +/** + * OurInformationBlockUpdateDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } phone Phone number + * @property { string } date Date + * @property { string } bookingNumber Booking number + * @property { string } customerReference Customer reference + * @property { string } masterBillOfLadingNumber Master bill of lading number + * @property { string } houseBillOfLadingNumber House bill of lading number + * @property { string } positionNumber Position number + */ +export const OurInformationBlockUpdateDtoSchema = z.object({ name: z.string().describe("Name"), phone: z.string().describe("Phone number"), date: z.string().describe("Date"), bookingNumber: z.string().describe("Booking number"), customerReference: z.string().describe("Customer reference"), masterBillOfLadingNumber: z.string().describe("Master bill of lading number"), houseBillOfLadingNumber: z.string().describe("House bill of lading number"), positionNumber: z.string().describe("Position number") }).readonly(); +export type OurInformationBlockUpdateDto = z.infer; + +/** + * TermsBlockDtoSchema + * @type { object } + * @property { string } termsImageUrl Terms image URL + */ +export const TermsBlockDtoSchema = z.object({ termsImageUrl: z.string().describe("Terms image URL") }).readonly(); +export type TermsBlockDto = z.infer; + +/** + * CutOffDatesBlockUpdateDtoSchema + * @type { object } + * @property { string } billOfLadingFromCustomer Bill of lading from customer date + * @property { string } billOfLadingToCarrier Bill of lading to carrier date + * @property { string } customsAMS Customs AMS date + * @property { string } vgmCustomer VGM customer date + */ +export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().describe("Bill of lading from customer date"), billOfLadingToCarrier: z.string().describe("Bill of lading to carrier date"), customsAMS: z.string().describe("Customs AMS date"), vgmCustomer: z.string().describe("VGM customer date") }).readonly(); +export type CutOffDatesBlockUpdateDto = z.infer; + +/** + * TemplatedDocumentDataDtoSchema + * @type { object } + * @property { TitleBlockUpdateDto } title Title block data + * @property { ReceiverBlockUpdateDto } receiver Receiver block data + * @property { OurInformationBlockUpdateDto } ourInformation Our information block data + * @property { RouteTableBlockResponseDto } routeTable Route table block data + * @property { CargoTableBlockDto } cargoTable Cargo table block data + * @property { SummaryCargoBlockResponseDto } summaryCargo Summary cargo block data + * @property { FinanceTableBlockDto } financeTable Finance table block data + * @property { RemarkBlockDto[] } remarks Remark blocks + * @property { TermsBlockDto } terms Terms block data + * @property { ConfigBlockDto } config Config block data + * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data + */ +export const TemplatedDocumentDataDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableBlockResponseDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockResponseDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockDtoSchema).readonly().describe("Remark blocks"), terms: CommonModels.TermsBlockDtoSchema.describe("Terms block data"), config: CommonModels.ConfigBlockDtoSchema.describe("Config block data"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); +export type TemplatedDocumentDataDto = z.infer; + +/** + * RouteTableUpdateBlockDtoSchema + * @type { object } + * @property { string } selectedRouteId Selected route ID + * @property { string[] } selectedRoutePointIds Selected route point IDs + * @property { boolean } showReference Show reference column + * @property { boolean } showVesselVoyage Show vessel/voyage column + * @property { boolean } showProvider Show provider column + * @property { RouteTablePointDto[] } points Route points + * @property { boolean } showAddress Show address + * @property { boolean } showDates Show dates + * @property { boolean } showType Show type + * @property { boolean } showLocation Show location + * @property { boolean } showGrid Show grid + * @property { boolean } suppressRoute Suppress route + */ +export const RouteTableUpdateBlockDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID"), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points"), showAddress: z.boolean().describe("Show address"), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); +export type RouteTableUpdateBlockDto = z.infer; + +/** + * CargoItemRouteUpdateDtoSchema + * @type { object } + * @property { string[] } selectedRoutePointIds Selected route point IDs + */ +export const CargoItemRouteUpdateDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs") }).readonly(); +export type CargoItemRouteUpdateDto = z.infer; + +/** + * CargoItemUpdateDtoSchema + * @type { object } + * @property { string } cargoId Cargo ID to update packages for + * @property { string[] } selectedPackageIds Selected cargo package IDs + * @property { CargoItemRouteUpdateDto } route Cargo route (when routes are split) + */ +export const CargoItemUpdateDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID to update packages for"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteUpdateDtoSchema.describe("Cargo route (when routes are split)") }).readonly(); +export type CargoItemUpdateDto = z.infer; + +/** + * CargoTableBlockUpdateDtoSchema + * @type { object } + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { CargoItemUpdateDto[] } items Cargo items for package updates + * @property { boolean } suppressWeight Suppress weight column display + * @property { boolean } showGrid Show grid borders in cargo table + * @property { boolean } suppressVolume Suppress volume column display + * @property { boolean } suppressSpecialities Suppress specialities column display + * @property { boolean } suppressDimensions Suppress dimensions column display + * @property { boolean } suppressPackageVolume Suppress package volume column display + * @property { boolean } suppressPackageWeight Suppress package weight column display + * @property { boolean } showRoute Show route information (only applicable when routes are split) + * @property { boolean } showGrandTotal Show grand total + * @property { boolean } showTransportUnitTotal Show transport unit total + * @property { boolean } suppressCargo Suppress cargo table display + * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units + * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units + * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages + * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages + * @property { boolean } showPackageHSCodes Show HS codes for packages + * @property { boolean } showPackageType Show package type for packages + * @property { boolean } showPackageQuantity Show quantity for packages + * @property { boolean } showPackageDescription Show description for packages + * @property { boolean } showPackageCaseMarks Show case marks for packages + * @property { boolean } showTransportUnitNumber Show transport unit number + * @property { boolean } showTransportUnitType Show transport unit type + * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 + * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 + */ +export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), items: z.array(CommonModels.CargoItemUpdateDtoSchema).readonly().describe("Cargo items for package updates"), suppressWeight: z.boolean().describe("Suppress weight column display"), showGrid: z.boolean().describe("Show grid borders in cargo table"), suppressVolume: z.boolean().describe("Suppress volume column display"), suppressSpecialities: z.boolean().describe("Suppress specialities column display"), suppressDimensions: z.boolean().describe("Suppress dimensions column display"), suppressPackageVolume: z.boolean().describe("Suppress package volume column display"), suppressPackageWeight: z.boolean().describe("Suppress package weight column display"), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullable(), showGrandTotal: z.boolean().describe("Show grand total"), showTransportUnitTotal: z.boolean().describe("Show transport unit total"), suppressCargo: z.boolean().describe("Suppress cargo table display"), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units"), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units"), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages"), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages"), showPackageHSCodes: z.boolean().describe("Show HS codes for packages"), showPackageType: z.boolean().describe("Show package type for packages"), showPackageQuantity: z.boolean().describe("Show quantity for packages"), showPackageDescription: z.boolean().describe("Show description for packages"), showPackageCaseMarks: z.boolean().describe("Show case marks for packages"), showTransportUnitNumber: z.boolean().describe("Show transport unit number"), showTransportUnitType: z.boolean().describe("Show transport unit type"), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1"), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2") }).readonly(); +export type CargoTableBlockUpdateDto = z.infer; + +/** + * SummaryCargoItemUpdateDtoSchema + * @type { object } + * @property { string } transportUnitType Cargo type name (transport unit type) + * @property { string } description Updated description for this cargo type + */ +export const SummaryCargoItemUpdateDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), description: z.string().describe("Updated description for this cargo type") }).readonly(); +export type SummaryCargoItemUpdateDto = z.infer; + +/** + * SummaryCargoBlockUpdateDtoSchema + * @type { object } + * @property { SummaryCargoItemUpdateDto[] } items + */ +export const SummaryCargoBlockUpdateDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemUpdateDtoSchema).readonly() }).readonly(); +export type SummaryCargoBlockUpdateDto = z.infer; + +/** + * FinanceTablePositionUpdateDtoSchema + * @type { object } + * @property { string[] } selectedFinanceRowIds Selected finance row IDs + * @property { string } positionId Position ID + */ +export const FinanceTablePositionUpdateDtoSchema = z.object({ selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID") }).readonly(); +export type FinanceTablePositionUpdateDto = z.infer; + +/** + * FinanceTableBlockUpdateDtoSchema + * @type { object } + * @property { string } selectedBpId Selected business partner ID + * @property { boolean } showVendor Show vendor + * @property { boolean } showBuyRate Show buy rate + * @property { boolean } showCustomer Show customer + * @property { boolean } showSellRate Show sell rate + * @property { boolean } showGrid Show grid + * @property { boolean } showCharges Show charges + * @property { boolean } showAdditionalText Show additional text + * @property { boolean } showQuantity Show quantity + * @property { boolean } showTotalsByCurrency Show totals grouped by currency + * @property { boolean } suppressFinances Suppress finances from output + * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero + * @property { boolean } showTotal Show total from output + * @property { boolean } showProfit Show profit from output + * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output + * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output + * @property { boolean } includeSubPositions Include sub-positions + * @property { boolean } subPositionTotals Show sub-position totals + * @property { FinanceTablePositionUpdateDto[] } positions Finance positions + */ +export const FinanceTableBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionUpdateDtoSchema).readonly().describe("Finance positions") }).readonly(); +export type FinanceTableBlockUpdateDto = z.infer; + +/** + * RemarkBlockUpdateDtoSchema + * @type { object } + * @property { string } id + * @property { number } position Minimum: `1` + * @property { EditorContentUpdateDto } content + * @property { boolean } enabled + */ +export const RemarkBlockUpdateDtoSchema = z.object({ id: z.string(), position: z.number().gte(1).nullish(), content: CommonModels.EditorContentUpdateDtoSchema.nullish(), enabled: z.boolean().nullish() }).readonly(); +export type RemarkBlockUpdateDto = z.infer; + +/** + * TemplatedDocumentDataUpdateDtoSchema + * @type { object } + * @property { TitleBlockUpdateDto } title Title block data + * @property { ReceiverBlockUpdateDto } receiver Receiver block data + * @property { OurInformationBlockUpdateDto } ourInformation Our information block data + * @property { RouteTableUpdateBlockDto } routeTable Route table block data + * @property { CargoTableBlockUpdateDto } cargoTable Cargo table block data + * @property { SummaryCargoBlockUpdateDto } summaryCargo Summary cargo block data + * @property { FinanceTableBlockUpdateDto } financeTable Finance table block data + * @property { RemarkBlockUpdateDto[] } remarks Remark blocks + * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data + */ +export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).readonly().describe("Remark blocks"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); +export type TemplatedDocumentDataUpdateDto = z.infer; + +/** + * BusinessPartnerTypeSchema + * @type { enum } + */ +export const BusinessPartnerTypeSchema = z.enum(["businessPartner", "destinationAgent", "oceanCarrier", "office", "customsAgent", "stuffingStrippingProvider", "shipper", "fobForwarder", "routingAgent", "transportProvider", "originServiceProvider", "insuranceProvider", "consignee", "courier", "trucker", "airline", "originAgent"]); +export type BusinessPartnerType = z.infer; +export const BusinessPartnerType = BusinessPartnerTypeSchema.enum; + +/** + * BusinessPartnerAddressCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type BusinessPartnerAddressCityDto = z.infer; + +/** + * BusinessPartnerAddressCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const BusinessPartnerAddressCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type BusinessPartnerAddressCountryDto = z.infer; + +/** + * BusinessPartnerAddressResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the address + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street information + * @property { string } zip ZIP/Postal code + * @property { BusinessPartnerAddressCityDto } city Country data + * @property { string } district District information + * @property { BusinessPartnerAddressCountryDto } country Country data + */ +export const BusinessPartnerAddressResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the address"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street information"), zip: z.string().describe("ZIP/Postal code"), city: CommonModels.BusinessPartnerAddressCityDtoSchema.describe("Country data"), district: z.string().describe("District information"), country: CommonModels.BusinessPartnerAddressCountryDtoSchema.describe("Country data") }).readonly(); +export type BusinessPartnerAddressResponseDTO = z.infer; + +/** + * EditorContentResponseDtoSchema + * @type { object } + * @property { string } html HTML content + * @property { object } json JSON content + * @property { any } json.[key] + */ +export const EditorContentResponseDtoSchema = z.object({ html: z.string().describe("HTML content"), json: z.object({}).catchall(z.any()).readonly().describe("JSON content") }).readonly(); +export type EditorContentResponseDto = z.infer; + +/** + * DunningSystemReferenceDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } isDefault + */ +export const DunningSystemReferenceDTOSchema = z.object({ id: z.string(), name: z.string(), isDefault: z.boolean() }).readonly(); +export type DunningSystemReferenceDTO = z.infer; + +/** + * TransportModeEnumSchema + * @type { enum } + */ +export const TransportModeEnumSchema = z.enum(["Air", "Sea", "Road"]); +export type TransportModeEnum = z.infer; +export const TransportModeEnum = TransportModeEnumSchema.enum; + +/** + * SeaRoutingEnumSchema + * @type { enum } + */ +export const SeaRoutingEnumSchema = z.enum(["Direct", "Transhipment"]); +export type SeaRoutingEnum = z.infer; +export const SeaRoutingEnum = SeaRoutingEnumSchema.enum; + +/** + * InvolvedPartyBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { BusinessPartnerAddressResponseDTO } address Main address information + */ +export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information").nullish() }).readonly(); +export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; + +/** + * InvolvedPartyContactResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvolvedPartyContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvolvedPartyContactResponseDTO = z.infer; + +/** + * InvolvedPartyResponseDtoSchema + * @type { object } + * @property { string } id + * @property { PositionInvolvedPartyTypeEnum } type + * @property { string } reference + * @property { InvolvedPartyBusinessPartnerResponseDTO } businessPartner + * @property { InvolvedPartyContactResponseDTO } contact + */ +export const InvolvedPartyResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionInvolvedPartyTypeEnumSchema, reference: z.string().nullish(), businessPartner: CommonModels.InvolvedPartyBusinessPartnerResponseDTOSchema.nullish(), contact: CommonModels.InvolvedPartyContactResponseDTOSchema.nullish() }).readonly(); +export type InvolvedPartyResponseDto = z.infer; + +/** + * CreateInvolvedPartyRequestDtoSchema + * @type { object } + * @property { PositionInvolvedPartyTypeEnum } type Type of the involved party to create + */ +export const CreateInvolvedPartyRequestDtoSchema = z.object({ type: CommonModels.PositionInvolvedPartyTypeEnumSchema.describe("Type of the involved party to create") }).readonly(); +export type CreateInvolvedPartyRequestDto = z.infer; + +/** + * RouteLocationTypeEnumSchema + * @type { enum } + */ +export const RouteLocationTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Port", "Terminal", "City", "Warehouse", "ContainerYard", "Airport"]); +export type RouteLocationTypeEnum = z.infer; +export const RouteLocationTypeEnum = RouteLocationTypeEnumSchema.enum; + +/** + * RoutePointLocationResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { RouteLocationTypeEnum } type + */ +export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }).readonly(); +export type RoutePointLocationResponseDto = z.infer; + +/** + * RoutePointTypeEnumSchema + * @type { enum } + */ +export const RoutePointTypeEnumSchema = z.enum(["EmptyContainerDepot", "LoadingAddress", "Stop", "FumigationStop", "OriginCustomsStop", "StuffingLocation", "PortTerminal", "PortOfLoading", "TransshipmentPort", "PortOfDischarge", "StrippingLocation", "ContainerYard", "DestinationCustomsStop", "FinalDestination", "EmptyContainerReturn", "OriginAgent", "HandlingAgent", "XRay", "CustomsBroker", "AirportOfDeparture", "StopAirport", "DestinationAirport", "CustomsStop", "DestinationAgent", "DeliveryAddress", "Courier", "PickupAddress", "StopAddress"]); +export type RoutePointTypeEnum = z.infer; +export const RoutePointTypeEnum = RoutePointTypeEnumSchema.enum; + +/** + * IncotermsEnumSchema + * @type { enum } + */ +export const IncotermsEnumSchema = z.enum(["EXW", "FCA", "CPT", "CIP", "DAP", "DPU", "DDP", "FAS", "FOB", "CFR", "CIF"]); +export type IncotermsEnum = z.infer; +export const IncotermsEnum = IncotermsEnumSchema.enum; + +/** + * PositionRouteTransportModeEnumSchema + * @type { enum } + */ +export const PositionRouteTransportModeEnumSchema = z.enum(["Truck", "Rail/Truck", "Rail", "Barge"]); +export type PositionRouteTransportModeEnum = z.infer; +export const PositionRouteTransportModeEnum = PositionRouteTransportModeEnumSchema.enum; + +/** + * RoutePointProviderResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type RoutePointProviderResponseDto = z.infer; + +/** + * RoutePointResponseDtoSchema + * @type { object } + * @property { string } id + * @property { RoutePointTypeEnum } type + * @property { string } name + * @property { number } sequenceNumber + * @property { RoutePointLocationResponseDto } location + * @property { string } estimatedTime + * @property { string } secondaryEstimatedTime Secondary estimated time (sea positions only) + * @property { string } reference + * @property { string } secondaryReference + * @property { IncotermsEnum } incoterm + * @property { PositionRouteTransportModeEnum } transportMode + * @property { RoutePointProviderResponseDto } provider + * @property { string } vessel Vessel name (sea positions only) + * @property { string } voyage Voyage number (sea positions only) + * @property { string } carrier Carrier name (sea positions only) + */ +export const RoutePointResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.RoutePointTypeEnumSchema, name: z.string(), sequenceNumber: z.number(), location: CommonModels.RoutePointLocationResponseDtoSchema.nullish(), estimatedTime: z.iso.datetime({ offset: true }).nullish(), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time (sea positions only)").nullish(), reference: z.string().nullish(), secondaryReference: z.string().nullish(), incoterm: CommonModels.IncotermsEnumSchema.nullish(), transportMode: CommonModels.PositionRouteTransportModeEnumSchema.nullish(), provider: CommonModels.RoutePointProviderResponseDtoSchema.nullish(), vessel: z.string().describe("Vessel name (sea positions only)").nullish(), voyage: z.string().describe("Voyage number (sea positions only)").nullish(), carrier: z.string().describe("Carrier name (sea positions only)").nullish() }).readonly(); +export type RoutePointResponseDto = z.infer; + +/** + * RouteResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } cargoId Cargo ID (sea positions only) + * @property { string } cargoNumber Cargo number (sea positions only) + * @property { RoutePointResponseDto[] } points + */ +export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().describe("Cargo ID (sea positions only)").nullish(), cargoNumber: z.string().describe("Cargo number (sea positions only)").nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema).readonly() }).readonly(); +export type RouteResponseDto = z.infer; + +/** + * RouteListResponseDtoSchema + * @type { object } + * @property { RouteResponseDto[] } routes + * @property { boolean } splitRoute Whether the position routes are split by cargo (sea positions only) + */ +export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema).readonly(), splitRoute: z.boolean().describe("Whether the position routes are split by cargo (sea positions only)") }).readonly(); +export type RouteListResponseDto = z.infer; + +/** + * CreateRoutePointRequestDtoSchema + * @type { object } + * @property { RoutePointTypeEnum } type + */ +export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }).readonly(); +export type CreateRoutePointRequestDto = z.infer; + +/** + * UpdateRoutePointRequestDtoSchema + * @type { object } + * @property { string } locationId Location ID for the route point + * @property { RouteLocationTypeEnum } locationType Type of location + * @property { string } estimatedTime Updated estimated time for the route point + * @property { string } secondaryEstimatedTime Secondary estimated time for the route point (sea positions only) + * @property { string } reference Reference for the route point + * @property { string } secondaryReference Secondary reference for the route point + * @property { IncotermsEnum } incoterm + * @property { PositionRouteTransportModeEnum } transportMode + * @property { string } providerId + * @property { string } vessel Vessel name (sea positions only) + * @property { string } voyage Voyage number (sea positions only) + * @property { string } carrier Carrier name (sea positions only) + */ +export const UpdateRoutePointRequestDtoSchema = z.object({ locationId: z.string().describe("Location ID for the route point").nullable(), locationType: CommonModels.RouteLocationTypeEnumSchema.describe("Type of location").nullable(), estimatedTime: z.iso.datetime({ offset: true }).describe("Updated estimated time for the route point"), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time for the route point (sea positions only)"), reference: z.string().describe("Reference for the route point"), secondaryReference: z.string().describe("Secondary reference for the route point"), incoterm: CommonModels.IncotermsEnumSchema, transportMode: CommonModels.PositionRouteTransportModeEnumSchema, providerId: z.string(), vessel: z.string().describe("Vessel name (sea positions only)"), voyage: z.string().describe("Voyage number (sea positions only)"), carrier: z.string().describe("Carrier name (sea positions only)") }).readonly(); +export type UpdateRoutePointRequestDto = z.infer; + +/** + * PositionChargeDtoResponseSchema + * @type { object } + * @property { object } chargeType + * @property { string } chargeType.id + * @property { string } chargeType.name + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { object } buyVatRule + * @property { string } buyVatRule.id + * @property { string } buyVatRule.name + * @property { string } buyVatRule.matchcode + * @property { object } vendor + * @property { string } vendor.id + * @property { string } vendor.name + * @property { string } vendor.matchCode + * @property { string } vendor.label + * @property { string } vendor.debtorId + * @property { string } vendor.creditorId + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { object } sellVatRule + * @property { string } sellVatRule.id + * @property { string } sellVatRule.name + * @property { string } sellVatRule.matchcode + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { string } customer.debtorId + * @property { string } customer.creditorId + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + * @property { number } profit Profit amount + * @property { string } profitCurrencyCode Profit currency code + */ +export const PositionChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge").nullish(), buyRate: z.number().describe("Buy rate amount").nullish(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), sellRate: z.number().describe("Sell rate amount").nullish(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), profit: z.number().describe("Profit amount").nullish(), profitCurrencyCode: z.string().describe("Profit currency code").nullish() }).readonly(); +export type PositionChargeDtoResponse = z.infer; + +/** + * PositionTextDtoResponseSchema + * @type { object } + * @property { string } content Text content + */ +export const PositionTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type PositionTextDtoResponse = z.infer; + +/** + * PositionAccountItemDtoResponseSchema + * @type { object } + * @property { string } id Item ID + * @property { string } outgoingInvoiceId + * @property { string } registeredInvoiceId + * @property { PositionAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { PositionChargeDtoResponse } charge Charge data if type is CHARGE + * @property { PositionTextDtoResponse } text Text data if type is TEXT + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + */ +export const PositionAccountItemDtoResponseSchema = z.object({ id: z.string().describe("Item ID"), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish(), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item"), charge: CommonModels.PositionChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), text: CommonModels.PositionTextDtoResponseSchema.describe("Text data if type is TEXT").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); +export type PositionAccountItemDtoResponse = z.infer; + +/** + * UserPreviewDtoSchema + * @type { object } + * @property { string } userId + * @property { string } name + */ +export const UserPreviewDtoSchema = z.object({ userId: z.string(), name: z.string() }).readonly(); +export type UserPreviewDto = z.infer; + +/** + * HBLDocumentConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + * @property { string } blTermsAndConditionsImageUrl BL terms and conditions image URL + * @property { string } signatureImageUrl Signature image URL + * @property { boolean } hasSignatureImage Whether office has a signature image configured + */ +export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), blTermsAndConditionsImageUrl: z.string().describe("BL terms and conditions image URL"), signatureImageUrl: z.string().describe("Signature image URL"), hasSignatureImage: z.boolean().describe("Whether office has a signature image configured") }).readonly(); +export type HBLDocumentConfigDto = z.infer; + +/** + * DirectionEnumSchema + * @type { enum } + */ +export const DirectionEnumSchema = z.enum(["Import", "Export"]); +export type DirectionEnum = z.infer; +export const DirectionEnum = DirectionEnumSchema.enum; + +/** + * HazardousPackingGroupEnumSchema + * @type { enum } + */ +export const HazardousPackingGroupEnumSchema = z.enum(["PG I", "PG II", "PG III"]); +export type HazardousPackingGroupEnum = z.infer; +export const HazardousPackingGroupEnum = HazardousPackingGroupEnumSchema.enum; + +/** + * PositionCargoPackageHazardousSpecialtyResponseDTOSchema + * @type { object } + * @property { number } totalLength + * @property { number } totalWidth + * @property { number } temperature + * @property { string } unNumber + * @property { string } IMOClass + * @property { string } shippingName + * @property { string } technicalName + * @property { HazardousPackingGroupEnum } packagingGroup + * @property { number } netWeight + * @property { number } flashpoint + * @property { string[] } properties + * @property { string } acceptanceNumber + * @property { string } medGuide + * @property { string } emergencyPhone + * @property { string } emergencySchedule + */ +export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number(), totalWidth: z.number(), temperature: z.number(), unNumber: z.string(), IMOClass: z.string(), shippingName: z.string(), technicalName: z.string(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema, netWeight: z.number(), flashpoint: z.number(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly(), acceptanceNumber: z.string(), medGuide: z.string(), emergencyPhone: z.string(), emergencySchedule: z.string() }).readonly(); +export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; + +/** + * PositionCargoPackageTypeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionCargoPackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionCargoPackageTypeResponseDTO = z.infer; + +/** + * HsCodeLabelDtoSchema + * @type { object } + * @property { string } id + * @property { string } label + */ +export const HsCodeLabelDtoSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export type HsCodeLabelDto = z.infer; + +/** + * PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema + * @type { object } + * @property { number } temperatureFrom + * @property { number } temperatureUntil + */ +export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.infer; + +/** + * PositionCargoSourcePackageResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } positionNumber + */ +export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }).readonly(); +export type PositionCargoSourcePackageResponseDTO = z.infer; + +/** + * PositionCargoPackageResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } cargoId + * @property { string } rootFolderId + * @property { number } quantity + * @property { string } packageTypeId + * @property { PositionCargoPackageTypeResponseDTO } packageType + * @property { number } length + * @property { number } width + * @property { number } height + * @property { number } netWeight + * @property { number } grossWeight + * @property { number } chargeableWeight + * @property { string } note + * @property { string } name + * @property { number } orderNumber + * @property { number } volume + * @property { number } volumetricWeight + * @property { string } caseMarks + * @property { string } description + * @property { string[] } hsCodes + * @property { HsCodeLabelDto[] } hsCodeLabels HS code details + * @property { string } customsRemarks + * @property { number } loadMeter + * @property { string[] } specialties + * @property { PositionCargoPackageHazardousSpecialtyResponseDTO } hazardousSpecialty + * @property { PositionCargoPackageTemperatureControlledSpecialtyResponseDto } temperatureControlledSpecialty + * @property { PositionCargoSourcePackageResponseDTO } sourcePackage + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const PositionCargoPackageResponseDTOSchema = z.object({ id: z.string(), cargoId: z.string(), rootFolderId: z.string().nullish(), quantity: z.number().nullish(), packageTypeId: z.string().nullish(), packageType: CommonModels.PositionCargoPackageTypeResponseDTOSchema.nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), netWeight: z.number().nullish(), grossWeight: z.number().nullish(), chargeableWeight: z.number().nullish(), note: z.string().nullish(), name: z.string().nullish(), orderNumber: z.number().nullish(), volume: z.number().nullish(), volumetricWeight: z.number().nullish(), caseMarks: z.string().nullish(), description: z.string().nullish(), hsCodes: z.array(z.string()).readonly().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), customsRemarks: z.string().nullish(), loadMeter: z.number().nullish(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.PositionCargoPackageHazardousSpecialtyResponseDTOSchema.nullish(), temperatureControlledSpecialty: CommonModels.PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema.nullish(), sourcePackage: CommonModels.PositionCargoSourcePackageResponseDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), mrn: z.string().describe("MRN (Movement Reference Number)").nullish(), exportPortFilling: z.string().describe("Export port filling").nullish(), customsReleased: z.boolean().describe("Customs released status").nullish(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullish(), portCustomsNumber: z.string().describe("Port customs number").nullish() }).readonly(); +export type PositionCargoPackageResponseDTO = z.infer; + +/** + * PackageTotalsDtoSchema + * @type { object } + * @property { number } quantity + * @property { number } weightPerPiece + * @property { number } volume + * @property { number } chargeableWeight + * @property { number } loadMeter + */ +export const PackageTotalsDtoSchema = z.object({ quantity: z.number(), weightPerPiece: z.number(), volume: z.number(), chargeableWeight: z.number().nullish(), loadMeter: z.number().nullish() }).readonly(); +export type PackageTotalsDto = z.infer; + +/** + * PackageSpecialtyTotalsResponseDtoSchema + * @type { object } + * @property { PackageTotalsDto } noSpecialties + * @property { PackageTotalsDto } hazardous + * @property { PackageTotalsDto } nonStackable + * @property { PackageTotalsDto } temperatureControlled + * @property { PackageTotalsDto } diplomatic + * @property { PackageTotalsDto } oversized + * @property { PackageTotalsDto } total + */ +export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }).readonly(); +export type PackageSpecialtyTotalsResponseDto = z.infer; + +/** + * PositionCargoCargoTypeResponseDTOSchema + * @type { object } + * @property { string } id Cargo type ID. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } name Cargo type name. Example: `Electronics` + * @property { string } shortName Cargo type short name. Example: `ELEC` + */ +export const PositionCargoCargoTypeResponseDTOSchema = z.object({ id: z.string().describe("Cargo type ID"), name: z.string().describe("Cargo type name"), shortName: z.string().describe("Cargo type short name").nullish() }).readonly(); +export type PositionCargoCargoTypeResponseDTO = z.infer; + +/** + * PositionCargoResponseDTOSchema + * @type { object } + * @property { string } id Cargo ID. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } positionId Position ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } quoteId Quote ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { string } rootFolderId Folder id bound to this cargo. Example: `123e4567-e89b-12d3-a456-426614174000` + * @property { PositionCargoCargoTypeResponseDTO } cargoType Cargo type + * @property { boolean } autoCalculateTotals + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { string } rateOptions + * @property { string } rateClass + * @property { string } textForCustoms + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { number } ratePerKg + * @property { number } totalRate + * @property { number } tare + * @property { number } vgm + * @property { HsCodeLabelDto[] } hsCodeLabels HS code details + * @property { string } note + * @property { PositionCargoPackageResponseDTO[] } packages Packages for the cargo + * @property { string } createdAt Creation date. Example: `2023-04-09T12:00:00Z` + * @property { string } updatedAt Last update date. Example: `2023-04-09T12:00:00Z` + * @property { number } completeWeight + * @property { PackageSpecialtyTotalsResponseDto } packageTotals + */ +export const PositionCargoResponseDTOSchema = z.object({ id: z.string().describe("Cargo ID"), positionId: z.string().describe("Position ID this cargo belongs to").nullish(), quoteId: z.string().describe("Quote ID this cargo belongs to").nullish(), rootFolderId: z.string().describe("Folder id bound to this cargo").nullish(), cargoType: CommonModels.PositionCargoCargoTypeResponseDTOSchema.describe("Cargo type").nullish(), autoCalculateTotals: z.boolean(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean(), transportUnitNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), rateOptions: z.string().nullish(), rateClass: z.string().nullish(), textForCustoms: z.string().nullish(), totalVolume: z.number().nullish(), totalGrossWeight: z.number().nullish(), totalNetWeight: z.number().nullish(), totalVolumetricWeight: z.number().nullish(), totalChargeableWeight: z.number().nullish(), totalLoadMeter: z.number().nullish(), ratePerKg: z.number().nullish(), totalRate: z.number().nullish(), tare: z.number().nullish(), vgm: z.number().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), note: z.string().nullish(), packages: z.array(CommonModels.PositionCargoPackageResponseDTOSchema).readonly().describe("Packages for the cargo").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Creation date"), updatedAt: z.iso.datetime({ offset: true }).describe("Last update date"), completeWeight: z.number().nullish(), packageTotals: CommonModels.PackageSpecialtyTotalsResponseDtoSchema.nullish() }).readonly(); +export type PositionCargoResponseDTO = z.infer; + +/** + * HazardousSpecialtyDTOSchema + * @type { object } + * @property { number } totalLength Total length + * @property { number } totalWidth Total width + * @property { number } temperature Temperature + * @property { string } unNumber UN number + * @property { string } IMOClass IMOClass + * @property { string } shippingName Shipping name + * @property { string } technicalName Technical name + * @property { HazardousPackingGroupEnum } packagingGroup Packaging + * @property { number } netWeight Net weight + * @property { number } flashpoint Flashpoint + * @property { string[] } properties Properties + * @property { string } acceptanceNumber Acceptance number + * @property { string } medGuide Medical guide + * @property { string } emergencyPhone Emergency phone + * @property { string } emergencySchedule Emergency schedule + */ +export const HazardousSpecialtyDTOSchema = z.object({ totalLength: z.number().describe("Total length"), totalWidth: z.number().describe("Total width"), temperature: z.number().describe("Temperature"), unNumber: z.string().describe("UN number"), IMOClass: z.string().describe("IMOClass"), shippingName: z.string().describe("Shipping name"), technicalName: z.string().describe("Technical name"), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.describe("Packaging"), netWeight: z.number().describe("Net weight"), flashpoint: z.number().describe("Flashpoint"), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly().describe("Properties"), acceptanceNumber: z.string().describe("Acceptance number"), medGuide: z.string().describe("Medical guide"), emergencyPhone: z.string().describe("Emergency phone"), emergencySchedule: z.string().describe("Emergency schedule") }).readonly(); +export type HazardousSpecialtyDTO = z.infer; + +/** + * TemperatureControlledSpecialtyDtoSchema + * @type { object } + * @property { number } temperatureFrom + * @property { number } temperatureUntil + */ +export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export type TemperatureControlledSpecialtyDto = z.infer; + +/** + * CreatePositionCargoPackageDTOSchema + * @type { object } + * @property { number } quantity Package quantity + * @property { string } packageTypeId Package type ID + * @property { number } length Package length + * @property { number } width Package width + * @property { number } height Package height + * @property { number } netWeight Package net weight + * @property { number } grossWeight Package gross weight + * @property { number } loadMeter Package load meter + * @property { number } chargeableWeight Package chargeable weight + * @property { number } volume Package volume + * @property { number } volumetricWeight Package volumetric weight + * @property { string } caseMarks Package case marks + * @property { string } note Package note + * @property { string } description Package description + * @property { string[] } hsCodes Package HS codes + * @property { string } customsRemarks Text for customs + * @property { string[] } specialties + * @property { HazardousSpecialtyDTO } hazardousSpecialty + * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const CreatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity"), packageTypeId: z.string().describe("Package type ID"), length: z.number().describe("Package length"), width: z.number().describe("Package width"), height: z.number().describe("Package height"), netWeight: z.number().describe("Package net weight"), grossWeight: z.number().describe("Package gross weight"), loadMeter: z.number().describe("Package load meter"), chargeableWeight: z.number().describe("Package chargeable weight"), volume: z.number().describe("Package volume"), volumetricWeight: z.number().describe("Package volumetric weight"), caseMarks: z.string().describe("Package case marks"), note: z.string().describe("Package note"), description: z.string().describe("Package description"), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs"), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema, temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)"), exportPortFilling: z.string().describe("Export port filling"), customsReleased: z.boolean().describe("Customs released status"), importCustomsReleaseNumber: z.string().describe("Import customs release number"), portCustomsNumber: z.string().describe("Port customs number") }).readonly(); +export type CreatePositionCargoPackageDTO = z.infer; + +/** + * UpdatePositionCargoPackageDTOSchema + * @type { object } + * @property { number } quantity Package quantity + * @property { string } packageTypeId Package type ID + * @property { number } length Package length + * @property { number } width Package width + * @property { number } height Package height + * @property { number } netWeight Package net weight + * @property { number } grossWeight Package gross weight + * @property { number } chargeableWeight Package chargeable weight + * @property { string } note Package case marks + * @property { number } volume Package volume + * @property { number } volumetricWeight Package volumetric weight + * @property { number } orderNumber Package order number + * @property { string } caseMarks Package case marks + * @property { string } description Package description + * @property { string[] } hsCodes Package HS codes + * @property { string } customsRemarks Text for customs + * @property { number } loadMeter Load meter + * @property { string[] } specialties Package specialties + * @property { HazardousSpecialtyDTO } hazardousSpecialty Hazardous specialty details + * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty + * @property { string } mrn MRN (Movement Reference Number) + * @property { string } exportPortFilling Export port filling + * @property { boolean } customsReleased Customs released status + * @property { string } importCustomsReleaseNumber Import customs release number + * @property { string } portCustomsNumber Port customs number + */ +export const UpdatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity").nullable(), packageTypeId: z.string().describe("Package type ID").nullable(), length: z.number().describe("Package length").nullable(), width: z.number().describe("Package width").nullable(), height: z.number().describe("Package height").nullable(), netWeight: z.number().describe("Package net weight").nullable(), grossWeight: z.number().describe("Package gross weight").nullable(), chargeableWeight: z.number().describe("Package chargeable weight").nullable(), note: z.string().describe("Package case marks").nullable(), volume: z.number().describe("Package volume").nullable(), volumetricWeight: z.number().describe("Package volumetric weight").nullable(), orderNumber: z.number().describe("Package order number"), caseMarks: z.string().describe("Package case marks").nullable(), description: z.string().describe("Package description").nullable(), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs").nullable(), loadMeter: z.number().describe("Load meter").nullable(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly().describe("Package specialties"), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema.describe("Hazardous specialty details"), temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)").nullable(), exportPortFilling: z.string().describe("Export port filling").nullable(), customsReleased: z.boolean().describe("Customs released status").nullable(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullable(), portCustomsNumber: z.string().describe("Port customs number").nullable() }).readonly(); +export type UpdatePositionCargoPackageDTO = z.infer; + +/** + * QuantityOfOriginalBlDocumentsEnumSchema + * @type { enum } + */ +export const QuantityOfOriginalBlDocumentsEnumSchema = z.enum(["ZERO", "ONE", "TWO", "THREE"]); +export type QuantityOfOriginalBlDocumentsEnum = z.infer; +export const QuantityOfOriginalBlDocumentsEnum = QuantityOfOriginalBlDocumentsEnumSchema.enum; + +/** + * MovementTypeEnumSchema + * @type { enum } + */ +export const MovementTypeEnumSchema = z.enum(["DoorToDoor", "PortToPort", "PortToDoor", "DoorToPort"]); +export type MovementTypeEnum = z.infer; +export const MovementTypeEnum = MovementTypeEnumSchema.enum; + +/** + * ChargePaymentEnumSchema + * @type { enum } + */ +export const ChargePaymentEnumSchema = z.enum(["Prepaid", "Collect", "PayableElsewhere"]); +export type ChargePaymentEnum = z.infer; +export const ChargePaymentEnum = ChargePaymentEnumSchema.enum; + +/** + * DocumentConfigDTOSchema + * @type { object } + * @property { string } footerImageUrl Footer image URL + * @property { string } headerImageUrl Header image URL + */ +export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL") }).readonly(); +export type DocumentConfigDTO = z.infer; + +/** + * EmployeeRoleContextSchema + * @type { enum } + */ +export const EmployeeRoleContextSchema = z.enum(["global", "office"]); +export type EmployeeRoleContext = z.infer; +export const EmployeeRoleContext = EmployeeRoleContextSchema.enum; + +/** + * EmployeeRoleResponseSchema + * @type { object } + * @property { string } id Unique identifier of the role + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string } context Role context + * @property { string[] } permissions Permissions associated with the role + */ +export const EmployeeRoleResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export type EmployeeRoleResponse = z.infer; + +/** + * EmploymentEmployeeResponseSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { boolean } archived Archived + * @property { EmployeeRoleResponse[] } roles Global Roles + */ +export const EmploymentEmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish() }).readonly(); +export type EmploymentEmployeeResponse = z.infer; + +/** + * EmployeeOfficeResponseSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const EmployeeOfficeResponseSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type EmployeeOfficeResponse = z.infer; + +/** + * EmploymentResponseSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { EmployeeOfficeResponse } office + * @property { string } employeeId + * @property { EmploymentEmployeeResponse } employee + * @property { boolean } archived + * @property { string } costCenter + * @property { EmployeeRoleResponse[] } roles Employment Roles + */ +export const EmploymentResponseSchema = z.object({ id: z.string(), officeId: z.string(), office: CommonModels.EmployeeOfficeResponseSchema.nullish(), employeeId: z.string(), employee: CommonModels.EmploymentEmployeeResponseSchema.nullish(), archived: z.boolean(), costCenter: z.string().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Employment Roles").nullish() }).readonly(); +export type EmploymentResponse = z.infer; + +/** + * LoadTypeEnumSchema + * @type { enum } + */ +export const LoadTypeEnumSchema = z.enum(["LCL", "FCL", "Trailer", "Container", "BreakBulk", "Roro", "MAFI", "LTL_ROAD", "FTL_ROAD", "Standard"]); +export type LoadTypeEnum = z.infer; +export const LoadTypeEnum = LoadTypeEnumSchema.enum; + +/** + * ServiceTypeEnumSchema + * @type { enum } + */ +export const ServiceTypeEnumSchema = z.enum(["InlandTransport", "DoorToPortOfDischarge", "PortOfLoadingToDoor", "DoorToDoor", "PortToPort", "DoorToAirport", "AirportToAirport", "AirportToDoor", "PortOfDischargeRampToDoor"]); +export type ServiceTypeEnum = z.infer; +export const ServiceTypeEnum = ServiceTypeEnumSchema.enum; + +/** + * DateRangeDtoSchema + * @type { object } + * @property { string } start + * @property { string } end + */ +export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }), end: z.iso.datetime({ offset: true }) }).readonly(); +export type DateRangeDto = z.infer; + +/** + * BusinessPartnerLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { BusinessPartnerType[] } types Array of business partner types + */ +export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); +export type BusinessPartnerLabelResponseDTO = z.infer; + +/** + * SectionEnumSchema + * @type { enum } + */ +export const SectionEnumSchema = z.enum(["Logistics"]); +export type SectionEnum = z.infer; +export const SectionEnum = SectionEnumSchema.enum; + +/** + * FrequencyEnumSchema + * @type { enum } + */ +export const FrequencyEnumSchema = z.enum(["Daily", "Weekly", "Monthly"]); +export type FrequencyEnum = z.infer; +export const FrequencyEnum = FrequencyEnumSchema.enum; + +/** + * InvoiceDirectionEnumSchema + * @type { enum } + */ +export const InvoiceDirectionEnumSchema = z.enum(["Incoming", "Outgoing"]); +export type InvoiceDirectionEnum = z.infer; +export const InvoiceDirectionEnum = InvoiceDirectionEnumSchema.enum; + +/** + * InvoiceTypeEnumSchema + * @type { enum } + */ +export const InvoiceTypeEnumSchema = z.enum(["CreditNote", "Invoice", "CollectiveInvoice", "ProForma", "PartialCreditNote", "DirectInvoice"]); +export type InvoiceTypeEnum = z.infer; +export const InvoiceTypeEnum = InvoiceTypeEnumSchema.enum; + +/** + * BooleanFilterEnumSchema + * @type { enum } + */ +export const BooleanFilterEnumSchema = z.enum(["Yes", "No"]); +export type BooleanFilterEnum = z.infer; +export const BooleanFilterEnum = BooleanFilterEnumSchema.enum; + +/** + * InvoiceStatusEnumSchema + * @type { enum } + */ +export const InvoiceStatusEnumSchema = z.enum(["Credited", "Draft", "Overpaid", "PartiallyPaid", "Outstanding", "Paid", "CreditNote", "ProForma"]); +export type InvoiceStatusEnum = z.infer; +export const InvoiceStatusEnum = InvoiceStatusEnumSchema.enum; + +/** + * OfficeInvoiceFilterDtoSchema + * @type { object } + * @property { string } search + * @property { DateRangeDto } issuingDate + * @property { DateRangeDto } serviceDate + * @property { InvoiceDirectionEnum[] } invoiceDirection + * @property { InvoiceTypeEnum[] } invoiceType + * @property { BooleanFilterEnum[] } collective + * @property { number } amountMin + * @property { number } amountMax + * @property { string[] } currencyNotation + * @property { string[] } vatRule + * @property { DateRangeDto } dueDate + * @property { InvoiceStatusEnum[] } status + * @property { string[] } receiver Filter by invoice receiver/customer IDs (UUID) + * @property { string[] } receiverCountry Filter by invoice receiver/customer country IDs + * @property { string[] } salesRep Filter by sales rep id + * @property { string } positionNumbersString + * @property { string[] } positionNumbers + * @property { string } invoiceNumbersString + * @property { string[] } invoiceNumbers + * @property { BooleanFilterEnum[] } bookkeepingExportStatus + * @property { BooleanFilterEnum[] } dunningBlock + * @property { BooleanFilterEnum[] } invoiceInReview + * @property { BooleanFilterEnum[] } isInvoiceOk + * @property { BooleanFilterEnum[] } isVatOk + * @property { number } invoiceNumberMin + * @property { number } invoiceNumberMax + * @property { number } internalNumberMin + * @property { number } internalNumberMax + * @property { string } externalSystemId Filter invoices by position external system ID (substring match) + * @property { string } hblNumber Filter invoices by HBL/HAWB (substring match) + * @property { string } mblNumber Filter invoices by MBL/MAWB (substring match) + * @property { string } bookingNumber Filter invoices by booking number (substring match) + * @property { string } vessel Filter invoices by vessel name (substring match) + * @property { string } voyage Filter invoices by voyage number (substring match) + * @property { string } creditorId Filter invoices by creditor ID (substring match) + * @property { string } debtorId Filter invoices by debtor ID (substring match) + */ +export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), vatRule: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer IDs (UUID)"), receiverCountry: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer country IDs"), salesRep: z.array(z.string()).readonly().describe("Filter by sales rep id"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number(), externalSystemId: z.string().describe("Filter invoices by position external system ID (substring match)"), hblNumber: z.string().describe("Filter invoices by HBL/HAWB (substring match)"), mblNumber: z.string().describe("Filter invoices by MBL/MAWB (substring match)"), bookingNumber: z.string().describe("Filter invoices by booking number (substring match)"), vessel: z.string().describe("Filter invoices by vessel name (substring match)"), voyage: z.string().describe("Filter invoices by voyage number (substring match)"), creditorId: z.string().describe("Filter invoices by creditor ID (substring match)"), debtorId: z.string().describe("Filter invoices by debtor ID (substring match)") }).readonly(); +export type OfficeInvoiceFilterDto = z.infer; + +/** + * PositionStatusEnumSchema + * @type { enum } + */ +export const PositionStatusEnumSchema = z.enum(["Preparing", "NeedsDocumentation", "Executing", "Done"]); +export type PositionStatusEnum = z.infer; +export const PositionStatusEnum = PositionStatusEnumSchema.enum; + +/** + * PositionCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionCustomerDto = z.infer; + +/** + * PositionQuoteDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type PositionQuoteDto = z.infer; + +/** + * ParentPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type ParentPositionDto = z.infer; + +/** + * PositionTypeEnumSchema + * @type { enum } + */ +export const PositionTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); +export type PositionTypeEnum = z.infer; +export const PositionTypeEnum = PositionTypeEnumSchema.enum; + +/** + * PositionProjectLiteDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PositionProjectLiteDto = z.infer; + +/** + * EmployeeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const EmployeeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type EmployeeDto = z.infer; + +/** + * PositionCoreResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } rootFolderId + * @property { string } externalSystemId + * @property { MovementTypeEnum } inttraTypeOfMove + * @property { PositionCustomerDto } customer + * @property { boolean } isCancelled + * @property { string } owningOfficeId + * @property { string } originOfficeId + * @property { PositionQuoteDto } quote + * @property { string } number + * @property { SectionEnum } section + * @property { DirectionEnum } direction + * @property { TransportModeEnum } transportMode + * @property { string } statusDate + * @property { string } serviceDate + * @property { string } dateOfDeparture + * @property { string } dateOfArrival + * @property { PositionStatusEnum } status + * @property { LoadTypeEnum } loadType + * @property { IncotermsEnum } incoterms + * @property { IncotermsEnum } secondIncoterms + * @property { ServiceTypeEnum } serviceType + * @property { ParentPositionDto } parentPosition + * @property { string } buyRateReference + * @property { FrequencyEnum } frequency + * @property { PositionTypeEnum } positionType + * @property { boolean } isParentPosition + * @property { boolean } hasParentPosition + * @property { boolean } hasChildPositions + * @property { PositionProjectLiteDto } projectLite + * @property { boolean } isExcludedFromStatistics + * @property { EmployeeDto } salesRep + * @property { string } fillingCompany + * @property { string } sellingContract + * @property { string } fillingScacCode + * @property { string } serviceValidity + * @property { string } ratesValidity + * @property { EmployeeDto } responsibleEmployee + * @property { EmployeeDto } receivedByEmployee + * @property { string } team + * @property { string } createdAt + * @property { string } updatedAt + * @property { EditorContentResponseDto } notes Notes + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); +export type PositionCoreResponseDto = z.infer; + +/** + * VesselDtoSchema + * @type { object } + * @property { string } name + * @property { number } imo + * @property { number } mmsi + */ +export const VesselDtoSchema = z.object({ name: z.string(), imo: z.number().nullish(), mmsi: z.number().nullish() }).readonly(); +export type VesselDto = z.infer; + +/** + * StatusResponseDtoSchema + * @type { object } + * @property { string } status Status + * @property { string } message Message + * @property { string } code Alphanumeric code of the message type + */ +export const StatusResponseDtoSchema = z.object({ status: z.string().describe("Status"), message: z.string().describe("Message"), code: z.string().describe("Alphanumeric code of the message type") }).readonly(); +export type StatusResponseDto = z.infer; + +/** + * PaginationDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const PaginationDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type PaginationDto = z.infer; + +/** + * LabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + */ +export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export type LabelResponseDTO = z.infer; + +/** + * GenerateWorkingDocumentRequestDtoSchema + * @type { object } + * @property { string } issuedAt + * @property { string } fileName + */ +export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); +export type GenerateWorkingDocumentRequestDto = z.infer; + +/** + * UpdateInvolvedPartyDtoSchema + * @type { object } + * @property { string } reference + * @property { string } businessPartnerId + * @property { string } contactId + */ +export const UpdateInvolvedPartyDtoSchema = z.object({ reference: z.string(), businessPartnerId: z.string(), contactId: z.string() }).readonly(); +export type UpdateInvolvedPartyDto = z.infer; + +/** + * MergeRoutesRequestDtoSchema + * @type { object } + * @property { string } sourceCargoId Source cargo ID to merge from (sea positions only) + */ +export const MergeRoutesRequestDtoSchema = z.object({ sourceCargoId: z.string().describe("Source cargo ID to merge from (sea positions only)").nullable() }).readonly(); +export type MergeRoutesRequestDto = z.infer; + +/** + * CopyRouteRequestDtoSchema + * @type { object } + * @property { string } targetCargoId Target cargo ID to copy to (sea positions only) + */ +export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to copy to (sea positions only)").nullable() }).readonly(); +export type CopyRouteRequestDto = z.infer; + +/** + * CargoSummaryResponseDTOSchema + * @type { object } + * @property { string } transportUnitTypeName Transport unit type name (e.g., "40' DRY", "20'") + * @property { number } quantity Total quantity of this transport unit type + */ +export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string().describe("Transport unit type name (e.g., \"40' DRY\", \"20'\")"), quantity: z.number().describe("Total quantity of this transport unit type") }).readonly(); +export type CargoSummaryResponseDTO = z.infer; + +/** + * CreatePositionCargoDTOSchema + * @type { object } + * @property { string } cargoTypeId Cargo type ID + * @property { string } note + * @property { boolean } autoCalculateTotals + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { string } rateOptions + * @property { string } rateClass + * @property { number } ratePerKg + * @property { number } totalRate + * @property { string } textForCustoms + * @property { number } tare + * @property { number } vgm + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + */ +export const CreatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); +export type CreatePositionCargoDTO = z.infer; + +/** + * UpdatePositionCargoDTOSchema + * @type { object } + * @property { string } cargoTypeId Cargo type ID + * @property { string } note + * @property { boolean } autoCalculateTotals + * @property { string } transportUnitNumber + * @property { string } seal1 + * @property { string } seal2 + * @property { number } totalVolume + * @property { number } totalGrossWeight + * @property { number } totalNetWeight + * @property { number } totalVolumetricWeight + * @property { number } totalChargeableWeight + * @property { number } totalLoadMeter + * @property { string } rateOptions + * @property { string } rateClass + * @property { number } ratePerKg + * @property { number } totalRate + * @property { string } textForCustoms + * @property { number } tare + * @property { number } vgm + * @property { boolean } autoCalculateRates + * @property { boolean } autoCalculateVgm + */ +export const UpdatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); +export type UpdatePositionCargoDTO = z.infer; + +/** + * MovePositionCargoPackageRequestDTOSchema + * @type { object } + * @property { string } targetCargoId Target cargo ID to move the package to + */ +export const MovePositionCargoPackageRequestDTOSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to move the package to") }).readonly(); +export type MovePositionCargoPackageRequestDTO = z.infer; + +/** + * PositionCargoPaginationOrderFieldSchema + * @type { enum } + */ +export const PositionCargoPaginationOrderFieldSchema = z.enum(["createdAt", "updatedAt"]); +export type PositionCargoPaginationOrderField = z.infer; +export const PositionCargoPaginationOrderField = PositionCargoPaginationOrderFieldSchema.enum; + +/** + * PositionAvailablePartnersUseCaseSchema + * @type { enum } + */ +export const PositionAvailablePartnersUseCaseSchema = z.enum(["financeCustomer", "financeVendor"]); +export type PositionAvailablePartnersUseCase = z.infer; +export const PositionAvailablePartnersUseCase = PositionAvailablePartnersUseCaseSchema.enum; + +} diff --git a/test/generated/next/containerYards/containerYards.acl.ts b/test/generated/next/containerYards/containerYards.acl.ts new file mode 100644 index 0000000..f4e07a4 --- /dev/null +++ b/test/generated/next/containerYards/containerYards.acl.ts @@ -0,0 +1,84 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace ContainerYardsAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "ContainerYard" +] as AbilityTuple<"Create", "ContainerYard">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +/** + * Use for `useGetLabelById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetLabelById` query + */ +export const canUseGetLabelById = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Update", + "ContainerYard" +] as AbilityTuple<"Update", "ContainerYard">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Update", + "ContainerYard" +] as AbilityTuple<"Update", "ContainerYard">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "ContainerYard" +] as AbilityTuple<"Update", "ContainerYard">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +} diff --git a/test/generated/next/containerYards/containerYards.api.ts b/test/generated/next/containerYards/containerYards.api.ts new file mode 100644 index 0000000..57fbfcf --- /dev/null +++ b/test/generated/next/containerYards/containerYards.api.ts @@ -0,0 +1,87 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ContainerYardsModels } from "./containerYards.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ContainerYardsApi { +export const paginate = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, + `/container-yards`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards`, + ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, + `/container-yards/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getLabelById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.LabelResponseDTOSchema }, + `/container-yards/${id}/labels`, + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}/unarchive`, + undefined, + config + ) +}; +export const update = (id: string, data: ContainerYardsModels.UpdateContainerYardRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}`, + ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}`, + config + ) +}; +} diff --git a/test/generated/next/containerYards/containerYards.configs.ts b/test/generated/next/containerYards/containerYards.configs.ts new file mode 100644 index 0000000..4458f76 --- /dev/null +++ b/test/generated/next/containerYards/containerYards.configs.ts @@ -0,0 +1,142 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ContainerYardsModels } from "./containerYards.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ContainerYardsQueries } from "./containerYards.queries"; +import { ContainerYardsAcl } from "./containerYards.acl"; + +export namespace ContainerYardsConfigs { +export const containerYardsConfig = { + meta: { + title: "Container Yards", + }, + readAll: { + acl: ContainerYardsAcl.canUsePaginate, + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + paginated: ContainerYardsQueries.usePaginate, + infinite: ContainerYardsQueries.usePaginateInfinite, + filters: { + schema: ContainerYardsModels.ContainerYardFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ContainerYardsModels.ContainerYardFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + shortName: true, + name: true, + archived: true, + street: true, + secondaryStreet: true, + zip: true, + city: true, + country: true, + district: true, + additionalInformation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: ContainerYardsAcl.canUseFindById, + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + query: ContainerYardsQueries.useFindById, + }, + create: { + acl: ContainerYardsAcl.canUseCreate, + schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, + mutation: ContainerYardsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, + options: { + inputs: { + matchCode: true, + name: true, + shortName: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + additionalInformation: true, + }, + }, +}) + }, + update: { + acl: ContainerYardsAcl.canUseUpdate, + schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, + mutation: ContainerYardsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, + options: { + inputs: { + matchCode: true, + name: true, + shortName: true, + addressId: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + additionalInformation: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: ContainerYardsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ContainerYardsQueries.usePaginateLabels, + infinite: ContainerYardsQueries.usePaginateLabelsInfinite, + filters: { + schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/containerYards/containerYards.models.ts b/test/generated/next/containerYards/containerYards.models.ts new file mode 100644 index 0000000..bed80b9 --- /dev/null +++ b/test/generated/next/containerYards/containerYards.models.ts @@ -0,0 +1,139 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ContainerYardsModels { +/** + * ContainerYardEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ContainerYardEmployeeDTO = z.infer; + +/** + * ContainerYardResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchCode Container yard match code + * @property { string } shortName Container yard short name + * @property { string } name Container yard name + * @property { boolean } archived Whether the container yard is archived + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { object } city + * @property { string } city.id + * @property { string } city.name + * @property { object } country + * @property { string } country.id + * @property { string } country.name + * @property { string } country.isoCode2 + * @property { string } country.isoCode3 + * @property { string } district District + * @property { string } additionalInformation Additional information + * @property { string } createdById + * @property { ContainerYardEmployeeDTO } createdBy + * @property { string } createdAt Date when the container yard was created + * @property { string } updatedById + * @property { ContainerYardEmployeeDTO } updatedBy + * @property { string } updatedAt Date when the container yard was last updated + */ +export const ContainerYardResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string().describe("Container yard match code"), shortName: z.string().describe("Container yard short name").nullish(), name: z.string().describe("Container yard name"), archived: z.boolean().describe("Whether the container yard is archived"), street: z.string().describe("Street address").nullish(), secondaryStreet: z.string().describe("Secondary street address").nullish(), zip: z.string().describe("ZIP/Postal code").nullish(), city: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), country: z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly().nullish(), district: z.string().describe("District").nullish(), additionalInformation: z.string().describe("Additional information").nullish(), createdById: z.string().nullish(), createdBy: ContainerYardEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was created"), updatedById: z.string().nullish(), updatedBy: ContainerYardEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was last updated") }).readonly(); +export type ContainerYardResponseDTO = z.infer; + +/** + * ContainerYardFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ContainerYardFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); +export type ContainerYardFilterDto = z.infer; + +/** + * ContainerYardLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const ContainerYardLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type ContainerYardLabelFilterDto = z.infer; + +/** + * CreateContainerYardRequestDTOSchema + * @type { object } + * @property { string } matchCode Match code + * @property { string } name Name + * @property { string } shortName Short name + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } cityId City ID + * @property { string } countryId Country ID + * @property { string } district District + * @property { string } additionalInformation Additional information + */ +export const CreateContainerYardRequestDTOSchema = z.object({ matchCode: z.string().describe("Match code"), name: z.string().describe("Name"), shortName: z.string().describe("Short name").nullish(), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street address").nullish(), zip: z.string().describe("ZIP/Postal code"), cityId: z.string().describe("City ID"), countryId: z.string().describe("Country ID"), district: z.string().describe("District").nullish(), additionalInformation: z.string().describe("Additional information").nullish() }).readonly(); +export type CreateContainerYardRequestDTO = z.infer; + +/** + * UpdateContainerYardRequestDTOSchema + * @type { object } + * @property { string } matchCode Match code + * @property { string } name Name + * @property { string } shortName Short name + * @property { string } addressId Address ID + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } cityId City ID + * @property { string } countryId Country ID + * @property { string } district District + * @property { string } additionalInformation Additional information + */ +export const UpdateContainerYardRequestDTOSchema = z.object({ matchCode: z.string().describe("Match code"), name: z.string().describe("Name"), shortName: z.string().describe("Short name"), addressId: z.string().describe("Address ID"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street address"), zip: z.string().describe("ZIP/Postal code"), cityId: z.string().describe("City ID"), countryId: z.string().describe("Country ID"), district: z.string().describe("District"), additionalInformation: z.string().describe("Additional information") }).readonly(); +export type UpdateContainerYardRequestDTO = z.infer; + +/** + * ContainerYardsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ContainerYardsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ContainerYardsPaginateOrderParamEnum = z.infer; +export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderParamEnumSchema.enum; + +/** + * ContainerYardsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ContainerYardResponseDTO[] } items + */ +export const ContainerYardsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerYardResponseDTOSchema).readonly() }).readonly().shape }); +export type ContainerYardsPaginateResponse = z.infer; + +/** + * ContainerYardsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ContainerYardsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ContainerYardsPaginateLabelsOrderParamEnum = z.infer; +export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * ContainerYardsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ContainerYardsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type ContainerYardsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/containerYards/containerYards.queries.ts b/test/generated/next/containerYards/containerYards.queries.ts new file mode 100644 index 0000000..c737b06 --- /dev/null +++ b/test/generated/next/containerYards/containerYards.queries.ts @@ -0,0 +1,287 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ContainerYardsAcl } from "./containerYards.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ContainerYardsModels } from "./containerYards.models"; +import { ContainerYardsApi } from "./containerYards.api"; + +export namespace ContainerYardsQueries { +export const moduleName = QueryModule.ContainerYards; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string) => [...keys.all, "/container-yards", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getLabelById: (id: string) => [...keys.all, "/container-yards/:id/labels", id] as const, + findById: (id: string) => [...keys.all, "/container-yards/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Container Yards + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUsePaginate()); + return ContainerYardsApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Container Yards + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ContainerYardsAcl.canUsePaginate()); + return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create container yard + * @permission Requires `canUseCreate` ability + * @param { ContainerYardsModels.CreateContainerYardRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(ContainerYardsAcl.canUseCreate()); + return ContainerYardsApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate container yard labels (id and name) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUsePaginateLabels()); + return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate container yard labels (id and name) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ContainerYardsAcl.canUsePaginateLabels()); + return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetLabelById` + * @summary Get container yard by ID with label format (id and formatted name) + * @permission Requires `canUseGetLabelById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetLabelById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getLabelById(id), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUseGetLabelById()); + return ContainerYardsApi.getLabelById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive container yard + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ContainerYardsAcl.canUseArchive()); + return ContainerYardsApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive container yard + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ContainerYardsAcl.canUseUnarchive()); + return ContainerYardsApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update container yard + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { ContainerYardsModels.UpdateContainerYardRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(ContainerYardsAcl.canUseUpdate()); + return ContainerYardsApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get container yard + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUseFindById()); + return ContainerYardsApi.findById(id, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/controlTowerAuth/controlTowerAuth.api.ts b/test/generated/next/controlTowerAuth/controlTowerAuth.api.ts new file mode 100644 index 0000000..b52d90f --- /dev/null +++ b/test/generated/next/controlTowerAuth/controlTowerAuth.api.ts @@ -0,0 +1,23 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerAuthModels } from "./controlTowerAuth.models"; + +export namespace ControlTowerAuthApi { +export const login = (data: ControlTowerAuthModels.LoginRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, + `/auth/move/login`, + ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), + config + ) +}; +export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, + `/auth/reset-password`, + ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/controlTowerAuth/controlTowerAuth.models.ts b/test/generated/next/controlTowerAuth/controlTowerAuth.models.ts new file mode 100644 index 0000000..287265f --- /dev/null +++ b/test/generated/next/controlTowerAuth/controlTowerAuth.models.ts @@ -0,0 +1,34 @@ +import { z } from "zod"; + +export namespace ControlTowerAuthModels { +/** + * LoginRequestDtoSchema + * @type { object } + * @property { string } username + * @property { string } password + */ +export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }).readonly(); +export type LoginRequestDto = z.infer; + +/** + * LoginResponseDtoSchema + * @type { object } + * @property { string } accessToken + * @property { boolean } resetPasswordRequired + * @property { string } passwordResetToken + * @property { string } username + */ +export const LoginResponseDtoSchema = z.object({ accessToken: z.string().nullable(), resetPasswordRequired: z.boolean().nullish(), passwordResetToken: z.string().nullish(), username: z.string().nullish() }).readonly(); +export type LoginResponseDto = z.infer; + +/** + * PasswordResetDtoSchema + * @type { object } + * @property { string } password + * @property { string } username + * @property { string } token + */ +export const PasswordResetDtoSchema = z.object({ password: z.string(), username: z.string(), token: z.string() }).readonly(); +export type PasswordResetDto = z.infer; + +} diff --git a/test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts b/test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts new file mode 100644 index 0000000..37e2167 --- /dev/null +++ b/test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts @@ -0,0 +1,60 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerAuthModels } from "./controlTowerAuth.models"; +import { ControlTowerAuthApi } from "./controlTowerAuth.api"; + +export namespace ControlTowerAuthQueries { +export const moduleName = QueryModule.ControlTowerAuth; + + + +/** + * Mutation `useLogin` + * @description Returns an access token to authenticate for protected endpoints + * @param { ControlTowerAuthModels.LoginRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 400, 401] + */ +export const useLogin = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerAuthApi.login(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useResetPassword` + * @description Resets the password for the requesting user + * @param { ControlTowerAuthModels.PasswordResetDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 400, 401] + */ +export const useResetPassword = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerAuthApi.resetPassword(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.api.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.api.ts new file mode 100644 index 0000000..2ba8093 --- /dev/null +++ b/test/generated/next/controlTowerBookings/controlTowerBookings.api.ts @@ -0,0 +1,38 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; + +export namespace ControlTowerBookingsApi { +export const findAll = (limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, + `/bookings`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, + `/bookings/${id}`, + config + ) +}; +export const findPackageById = (packageId: string, bookingId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, + `/bookings/${bookingId}/packages/${packageId}`, + config + ) +}; +} diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.configs.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.configs.ts new file mode 100644 index 0000000..ce75a71 --- /dev/null +++ b/test/generated/next/controlTowerBookings/controlTowerBookings.configs.ts @@ -0,0 +1,56 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; +import { ControlTowerBookingsQueries } from "./controlTowerBookings.queries"; + +export namespace ControlTowerBookingsConfigs { +export const bookingsConfig = { + meta: { + title: "Bookings", + }, + readAll: { + schema: ControlTowerBookingsModels.BookingListItemDtoSchema, + paginated: ControlTowerBookingsQueries.useFindAll, + infinite: ControlTowerBookingsQueries.useFindAllInfinite, + filters: { + schema: ControlTowerBookingsModels.BookingFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerBookingsModels.BookingFilterDtoSchema, + options: { + inputs: { + projectId: true, + search: true, + companyIds: true, + purchaseOrderId: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ControlTowerBookingsModels.BookingListItemDtoSchema, + options: { + columns: { + id: true, + bookingNumber: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema, + }, +}), + }, + read: { + schema: ControlTowerBookingsModels.BookingResponseDtoSchema, + query: ControlTowerBookingsQueries.useFindById, + }, +}; + +} diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.models.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.models.ts new file mode 100644 index 0000000..1671d53 --- /dev/null +++ b/test/generated/next/controlTowerBookings/controlTowerBookings.models.ts @@ -0,0 +1,147 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerBookingsModels { +/** + * BookingListItemDtoSchema + * @type { object } + * @property { string } id + * @property { string } bookingNumber + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const BookingListItemDtoSchema = z.object({ id: z.string(), bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export type BookingListItemDto = z.infer; + +/** + * BookingContainerDtoSchema + * @type { object } + * @property { string } id + * @property { string } containerNumber + * @property { string } type + * @property { string } loadType + * @property { string } stuffedInContainer + * @property { string[] } hsCode + * @property { number } noS + * @property { number } weight + * @property { string } lastEventLocation + * @property { string } lastEventName + * @property { string } lastEventDate + * @property { string } seals + */ +export const BookingContainerDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), loadType: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), hsCode: z.array(z.string()).readonly().nullable(), noS: z.number().nullable(), weight: z.number().nullable(), lastEventLocation: z.string().nullable(), lastEventName: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), seals: z.string().nullable() }).readonly(); +export type BookingContainerDto = z.infer; + +/** + * BookingPackageDtoSchema + * @type { object } + * @property { string } id + * @property { string } packageNumber + * @property { string } containerNumber + * @property { string } type + * @property { string } description + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + */ +export const BookingPackageDtoSchema = z.object({ id: z.string(), packageNumber: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), description: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable() }).readonly(); +export type BookingPackageDto = z.infer; + +/** + * BookingResponseDtoSchema + * @type { object } + * @property { string } bookingNumber + * @property { string } ets + * @property { string } etaPod + * @property { string } etaFinalDeliveryPlace + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } destination + * @property { string } lastEvent + * @property { string[] } files + * @property { string } poNumber + * @property { string } blNumber + * @property { BookingContainerDto[] } containers + * @property { BookingPackageDto[] } packages + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + * @property { string } id + */ +export const BookingResponseDtoSchema = z.object({ bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), etaPod: z.iso.datetime({ offset: true }).nullable(), etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), destination: z.string().nullable(), lastEvent: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), poNumber: z.string().nullable(), blNumber: z.string().nullable(), containers: z.array(BookingContainerDtoSchema).readonly().nullish(), packages: z.array(BookingPackageDtoSchema).readonly().nullish(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable(), id: z.string() }).readonly(); +export type BookingResponseDto = z.infer; + +/** + * PackageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } poNumber + * @property { string } bookingNumber + * @property { string } blNumber + * @property { string } containerNumber + * @property { string } packageNumber + * @property { string } description + * @property { number } netWeight + * @property { number } grossWeight + * @property { number } length + * @property { number } width + * @property { number } height + * @property { number } volume + * @property { string } storageInstruction + * @property { string } destination + * @property { string[] } files + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const PackageResponseDtoSchema = z.object({ id: z.string(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), containerNumber: z.string().nullable(), packageNumber: z.string().nullable(), description: z.string().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), volume: z.number().nullable(), storageInstruction: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export type PackageResponseDto = z.infer; + +/** + * BookingFilterDtoSchema + * @type { object } + * @property { string } projectId + * @property { string } search Min Length: `1` + * @property { string[] } companyIds + * @property { string } purchaseOrderId + */ +export const BookingFilterDtoSchema = z.object({ projectId: z.string(), search: z.string().min(1), companyIds: z.array(z.string()).readonly(), purchaseOrderId: z.string() }).readonly(); +export type BookingFilterDto = z.infer; + +/** + * ControlTowerBookingsFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ControlTowerBookingsFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); +export type ControlTowerBookingsFindAllOrderParamEnum = z.infer; +export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFindAllOrderParamEnumSchema.enum; + +/** + * ControlTowerBookingsFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookingListItemDto[] } items + */ +export const ControlTowerBookingsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookingListItemDtoSchema).readonly() }).readonly().shape }); +export type ControlTowerBookingsFindAllResponse = z.infer; + +} diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts new file mode 100644 index 0000000..7ab4d73 --- /dev/null +++ b/test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts @@ -0,0 +1,105 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; +import { ControlTowerBookingsApi } from "./controlTowerBookings.api"; + +export namespace ControlTowerBookingsQueries { +export const moduleName = QueryModule.ControlTowerBookings; + +export const keys = { + all: [moduleName] as const, + findAll: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string) => [...keys.all, "/bookings", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string) => [...keys.all, "/bookings", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/bookings/:id", id] as const, + findPackageById: (packageId: string, bookingId: string) => [...keys.all, "/bookings/:bookingId/packages/:packageId", packageId, bookingId] as const, +}; + +/** + * Query `useFindAll` + * @summary Get all accessible bookings for the customer + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => + ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @summary Get all accessible bookings for the customer + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @description Returns a booking with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => + ControlTowerBookingsApi.findById(id, config), + ...options, + }); +}; + +/** + * Query `useFindPackageById` + * @description Returns a package with the specified id + * @param { string } object.packageId Path parameter + * @param { string } object.bookingId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindPackageById = ({ packageId, bookingId }: { packageId: string, bookingId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findPackageById(packageId, bookingId), + queryFn: () => + ControlTowerBookingsApi.findPackageById(packageId, bookingId, config), + ...options, + }); +}; + +} diff --git a/test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts b/test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts new file mode 100644 index 0000000..198615d --- /dev/null +++ b/test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts @@ -0,0 +1,26 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; + +export namespace ControlTowerCalendarApi { +export const getCalendar = (from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, + `/calendar`, + { + ...config, + params: { + from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), + to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), + type: ZodExtended.parse(ControlTowerCalendarModels.CalendarTypeEnumSchema, type, { type: "query", name: "type" }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + poNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarPoNumbersParamSchema.optional(), poNumbers, { type: "query", name: "poNumbers" }), + containerNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarContainerNumbersParamSchema.optional(), containerNumbers, { type: "query", name: "containerNumbers" }), + bookingNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarBookingNumbersParamSchema.optional(), bookingNumbers, { type: "query", name: "bookingNumbers" }), + }, + } + ) +}; +} diff --git a/test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts b/test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts new file mode 100644 index 0000000..5c33c81 --- /dev/null +++ b/test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts @@ -0,0 +1,91 @@ +import { z } from "zod"; + +export namespace ControlTowerCalendarModels { +/** + * EventRelationTypeEnumSchema + * @type { enum } + */ +export const EventRelationTypeEnumSchema = z.enum(["Booking", "Container", "PurchaseOrder"]); +export type EventRelationTypeEnum = z.infer; +export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; + +/** + * CalendarEventRelationDtoSchema + * @type { object } + * @property { EventRelationTypeEnum } type + * @property { string } id + * @property { string } number + */ +export const CalendarEventRelationDtoSchema = z.object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }).readonly(); +export type CalendarEventRelationDto = z.infer; + +/** + * CalendarTypeEnumSchema + * @type { enum } + */ +export const CalendarTypeEnumSchema = z.enum(["PurchaseOrder", "Booking", "Container", "Package"]); +export type CalendarTypeEnum = z.infer; +export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; + +/** + * CalendarEventDtoSchema + * @type { object } + * @property { string } entityId + * @property { string } entityNumber + * @property { CalendarTypeEnum } entityType + * @property { string } date + * @property { string } title + * @property { CalendarEventRelationDto[] } relations + */ +export const CalendarEventDtoSchema = z.object({ entityId: z.string(), entityNumber: z.string(), entityType: CalendarTypeEnumSchema, date: z.iso.datetime({ offset: true }), title: z.string(), relations: z.array(CalendarEventRelationDtoSchema).readonly() }).readonly(); +export type CalendarEventDto = z.infer; + +/** + * FiltersDtoSchema + * @type { object } + * @property { string[] } poNumbers + * @property { string[] } bookingNumbers + * @property { string[] } containerNumbers + */ +export const FiltersDtoSchema = z.object({ poNumbers: z.array(z.string()).readonly(), bookingNumbers: z.array(z.string()).readonly(), containerNumbers: z.array(z.string()).readonly() }).readonly(); +export type FiltersDto = z.infer; + +/** + * CalendarDtoSchema + * @type { object } + * @property { CalendarEventDto[] } events + * @property { FiltersDto } filters + */ +export const CalendarDtoSchema = z.object({ events: z.array(CalendarEventDtoSchema).readonly(), filters: FiltersDtoSchema }).readonly(); +export type CalendarDto = z.infer; + +/** + * CalendarResponseDtoSchema + * @type { object } + * @property { CalendarDto } data + */ +export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }).readonly(); +export type CalendarResponseDto = z.infer; + +/** + * GetCalendarPoNumbersParamSchema + * @type { array } + */ +export const GetCalendarPoNumbersParamSchema = z.array(z.string()).readonly().nullish(); +export type GetCalendarPoNumbersParam = z.infer; + +/** + * GetCalendarContainerNumbersParamSchema + * @type { array } + */ +export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).readonly().nullish(); +export type GetCalendarContainerNumbersParam = z.infer; + +/** + * GetCalendarBookingNumbersParamSchema + * @type { array } + */ +export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).readonly().nullish(); +export type GetCalendarBookingNumbersParam = z.infer; + +} diff --git a/test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts b/test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts new file mode 100644 index 0000000..115102b --- /dev/null +++ b/test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts @@ -0,0 +1,39 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; +import { ControlTowerCalendarApi } from "./controlTowerCalendar.api"; + +export namespace ControlTowerCalendarQueries { +export const moduleName = QueryModule.ControlTowerCalendar; + +export const keys = { + all: [moduleName] as const, + getCalendar: (from?: string, to?: string, type?: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam) => [...keys.all, "/calendar", from, to, type, search, poNumbers, containerNumbers, bookingNumbers] as const, +}; + +/** + * Query `useGetCalendar` + * @param { string } object.from Query parameter + * @param { string } object.to Query parameter + * @param { ControlTowerCalendarModels.CalendarTypeEnum } object.type Query parameter + * @param { string } object.search Query parameter + * @param { ControlTowerCalendarModels.GetCalendarPoNumbersParam } object.poNumbers Query parameter + * @param { ControlTowerCalendarModels.GetCalendarContainerNumbersParam } object.containerNumbers Query parameter + * @param { ControlTowerCalendarModels.GetCalendarBookingNumbersParam } object.bookingNumbers Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCalendar = ({ from, to, type, search, poNumbers, containerNumbers, bookingNumbers }: { from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), + queryFn: () => + ControlTowerCalendarApi.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers, config), + ...options, + }); +}; + +} diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.api.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.api.ts new file mode 100644 index 0000000..4708306 --- /dev/null +++ b/test/generated/next/controlTowerContainers/controlTowerContainers.api.ts @@ -0,0 +1,38 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; + +export namespace ControlTowerContainersApi { +export const findAll = (limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, + `/containers`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, + `/containers/${id}`, + config + ) +}; +export const getJourney = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, + `/containers/${id}/journey`, + config + ) +}; +} diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.configs.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.configs.ts new file mode 100644 index 0000000..98105eb --- /dev/null +++ b/test/generated/next/controlTowerContainers/controlTowerContainers.configs.ts @@ -0,0 +1,54 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; +import { ControlTowerContainersQueries } from "./controlTowerContainers.queries"; + +export namespace ControlTowerContainersConfigs { +export const containersConfig = { + meta: { + title: "Containers", + }, + readAll: { + schema: ControlTowerContainersModels.ContainerListItemDtoSchema, + paginated: ControlTowerContainersQueries.useFindAll, + infinite: ControlTowerContainersQueries.useFindAllInfinite, + filters: { + schema: ControlTowerContainersModels.ContainerFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerContainersModels.ContainerFilterDtoSchema, + options: { + inputs: { + companyIds: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ControlTowerContainersModels.ContainerListItemDtoSchema, + options: { + columns: { + containerNumber: true, + id: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, + }, +}), + }, + read: { + schema: ControlTowerContainersModels.ContainerResponseDtoSchema, + query: ControlTowerContainersQueries.useFindById, + }, +}; + +} diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.models.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.models.ts new file mode 100644 index 0000000..410f1aa --- /dev/null +++ b/test/generated/next/controlTowerContainers/controlTowerContainers.models.ts @@ -0,0 +1,133 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerContainersModels { +/** + * ContainerListItemDtoSchema + * @type { object } + * @property { string } containerNumber + * @property { string } id + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const ContainerListItemDtoSchema = z.object({ containerNumber: z.string().nullable(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export type ContainerListItemDto = z.infer; + +/** + * ContainerEventDtoSchema + * @type { object } + * @property { CommonModels.VesselDto } vessel + * @property { string } name + * @property { string } date + * @property { boolean } checkedIn + */ +export const ContainerEventDtoSchema = z.object({ vessel: CommonModels.VesselDtoSchema.nullable(), name: z.string(), date: z.iso.datetime({ offset: true }).nullable(), checkedIn: z.boolean() }).readonly(); +export type ContainerEventDto = z.infer; + +/** + * ContainerJourneyDtoSchema + * @type { object } + * @property { string } id + * @property { string } country + * @property { string } terminal + * @property { boolean } checkedIn + * @property { ContainerEventDto[] } events + */ +export const ContainerJourneyDtoSchema = z.object({ id: z.string(), country: z.string().nullable(), terminal: z.string().nullable(), checkedIn: z.boolean(), events: z.array(ContainerEventDtoSchema).readonly() }).readonly(); +export type ContainerJourneyDto = z.infer; + +/** + * PackageNumberDtoSchema + * @type { object } + * @property { string } id + * @property { string } type + * @property { string } description + */ +export const PackageNumberDtoSchema = z.object({ id: z.string(), type: z.string().nullable(), description: z.string() }).readonly(); +export type PackageNumberDto = z.infer; + +/** + * ContainerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } containerNumber + * @property { string } poNumber + * @property { string } bookingNumber + * @property { string } blNumber + * @property { string } stuffedInContainer + * @property { string } containerType + * @property { string } loadType + * @property { string[] } hsCode + * @property { number } totalVolume + * @property { number } totalWeight + * @property { string } cargoDescription + * @property { number } noS + * @property { ContainerJourneyDto[] } journeys + * @property { PackageNumberDto[] } packages + * @property { string } bookingId + * @property { string } destination + * @property { string[] } files + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const ContainerResponseDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), containerType: z.string().nullable(), loadType: z.string().nullable(), hsCode: z.array(z.string()).readonly().nullable(), totalVolume: z.number().nullable(), totalWeight: z.number().nullable(), cargoDescription: z.string().nullable(), noS: z.number().nullable(), journeys: z.array(ContainerJourneyDtoSchema).readonly().nullish(), packages: z.array(PackageNumberDtoSchema).readonly().nullish(), bookingId: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export type ContainerResponseDto = z.infer; + +/** + * ContainerJourneyResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { ContainerJourneyDto[] } journeys + * @property { string[] } packageNumbers + */ +export const ContainerJourneyResponseDtoSchema = z.object({ id: z.string(), number: z.string(), journeys: z.array(ContainerJourneyDtoSchema).readonly(), packageNumbers: z.array(z.string()).readonly() }).readonly(); +export type ContainerJourneyResponseDto = z.infer; + +/** + * ContainerFilterDtoSchema + * @type { object } + * @property { number[] } companyIds + * @property { string } search + */ +export const ContainerFilterDtoSchema = z.object({ companyIds: z.array(z.number()).readonly(), search: z.string() }).readonly(); +export type ContainerFilterDto = z.infer; + +/** + * ControlTowerContainersFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ControlTowerContainersFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); +export type ControlTowerContainersFindAllOrderParamEnum = z.infer; +export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainersFindAllOrderParamEnumSchema.enum; + +/** + * ControlTowerContainersFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ContainerListItemDto[] } items + */ +export const ControlTowerContainersFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerListItemDtoSchema).readonly() }).readonly().shape }); +export type ControlTowerContainersFindAllResponse = z.infer; + +} diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts new file mode 100644 index 0000000..eef15d1 --- /dev/null +++ b/test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts @@ -0,0 +1,104 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerContainersModels } from "./controlTowerContainers.models"; +import { ControlTowerContainersApi } from "./controlTowerContainers.api"; + +export namespace ControlTowerContainersQueries { +export const moduleName = QueryModule.ControlTowerContainers; + +export const keys = { + all: [moduleName] as const, + findAll: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string) => [...keys.all, "/containers", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string) => [...keys.all, "/containers", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/containers/:id", id] as const, + getJourney: (id: string) => [...keys.all, "/containers/:id/journey", id] as const, +}; + +/** + * Query `useFindAll` + * @description Lists containers + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => + ControlTowerContainersApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @description Lists containers + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @description Returns a container with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => + ControlTowerContainersApi.findById(id, config), + ...options, + }); +}; + +/** + * Query `useGetJourney` + * @description Returns the journey and package numbers of a container with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetJourney = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getJourney(id), + queryFn: () => + ControlTowerContainersApi.getJourney(id, config), + ...options, + }); +}; + +} diff --git a/test/generated/next/controlTowerMe/controlTowerMe.api.ts b/test/generated/next/controlTowerMe/controlTowerMe.api.ts new file mode 100644 index 0000000..6852384 --- /dev/null +++ b/test/generated/next/controlTowerMe/controlTowerMe.api.ts @@ -0,0 +1,55 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerMeModels } from "./controlTowerMe.models"; + +export namespace ControlTowerMeApi { +export const getUserProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, + `/me`, + config + ) +}; +export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, + `/me`, + ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), + config + ) +}; +export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, + `/me/basic`, + ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), + config + ) +}; +export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/password`, + ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), + config + ) +}; +export const updateEmailPreferences = (data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/email-preferences`, + ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), + config + ) +}; +export const updateProjectAccess = (config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/access`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/controlTowerMe/controlTowerMe.models.ts b/test/generated/next/controlTowerMe/controlTowerMe.models.ts new file mode 100644 index 0000000..df9a49b --- /dev/null +++ b/test/generated/next/controlTowerMe/controlTowerMe.models.ts @@ -0,0 +1,173 @@ +import { z } from "zod"; + +export namespace ControlTowerMeModels { +/** + * LinksDtoSchema + * @type { object } + * @property { string } self + * @property { string } related + */ +export const LinksDtoSchema = z.object({ self: z.string(), related: z.string() }).readonly(); +export type LinksDto = z.infer; + +/** + * ApiResponseDataDtoSchema + * @type { object } + * @property { string } type + * @property { string } id + * @property { object } attributes + * @property { object } relationships + * @property { LinksDto } links + */ +export const ApiResponseDataDtoSchema = z.object({ type: z.string(), id: z.string(), attributes: z.object({}).readonly().nullish(), relationships: z.object({}).readonly().nullish(), links: LinksDtoSchema.nullish() }).readonly(); +export type ApiResponseDataDto = z.infer; + +/** + * PaginationLinksDtoSchema + * @type { object } + * @property { string } next + * @property { string } self + * @property { string } last + */ +export const PaginationLinksDtoSchema = z.object({ next: z.string(), self: z.string(), last: z.string() }).readonly(); +export type PaginationLinksDto = z.infer; + +/** + * ApiResponseDtoSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + */ +export const ApiResponseDtoSchema = z.object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }).readonly(); +export type ApiResponseDto = z.infer; + +/** + * DelayNotificationEnumSchema + * @type { enum } + */ +export const DelayNotificationEnumSchema = z.enum(["EveryDelay", "LongerThan24Hours", "LongerThan3Days"]); +export type DelayNotificationEnum = z.infer; +export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; + +/** + * UserEmailPreferencesDtoSchema + * @type { object } + * @property { boolean } originDeparture + * @property { boolean } loadedOnVessel + * @property { boolean } destinationArrival + * @property { boolean } onsiteDelivery + * @property { DelayNotificationEnum } delay + */ +export const UserEmailPreferencesDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }).readonly(); +export type UserEmailPreferencesDto = z.infer; + +/** + * UserProjectAccessDtoSchema + * @type { object } + * @property { string[] } projectIds + */ +export const UserProjectAccessDtoSchema = z.object({ projectIds: z.array(z.string()).readonly() }).readonly(); +export type UserProjectAccessDto = z.infer; + +/** + * UserRoleEnumSchema + * @type { enum } + */ +export const UserRoleEnumSchema = z.enum(["User", "Admin"]); +export type UserRoleEnum = z.infer; +export const UserRoleEnum = UserRoleEnumSchema.enum; + +/** + * UserDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } name Min Length: `3` + * @property { string } email + * @property { UserEmailPreferencesDto } emailPreferences + * @property { UserProjectAccessDto } projectAccess + * @property { UserRoleEnum } role + * @property { boolean } isAdmin + */ +export const UserDetailDtoSchema = z.object({ id: z.string(), name: z.string().min(3), email: z.email(), emailPreferences: UserEmailPreferencesDtoSchema.nullable(), projectAccess: UserProjectAccessDtoSchema.nullable(), role: UserRoleEnumSchema.nullable(), isAdmin: z.boolean() }).readonly(); +export type UserDetailDto = z.infer; + +/** + * UserEmailPreferencesUpdateDtoSchema + * @type { object } + * @property { boolean } originDeparture + * @property { boolean } loadedOnVessel + * @property { boolean } destinationArrival + * @property { boolean } onsiteDelivery + * @property { DelayNotificationEnum } delay + */ +export const UserEmailPreferencesUpdateDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }).readonly(); +export type UserEmailPreferencesUpdateDto = z.infer; + +/** + * UserProjectAccessUpdateDtoSchema + * @type { object } + * @property { number[] } projectIds + */ +export const UserProjectAccessUpdateDtoSchema = z.object({ projectIds: z.array(z.number()).readonly() }).readonly(); +export type UserProjectAccessUpdateDto = z.infer; + +/** + * UserUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } password + * @property { UserEmailPreferencesUpdateDto } emailPreferences + * @property { UserProjectAccessUpdateDto } projectAccess + */ +export const UserUpdateDtoSchema = z.object({ name: z.string(), email: z.email(), password: z.string(), emailPreferences: UserEmailPreferencesUpdateDtoSchema, projectAccess: UserProjectAccessUpdateDtoSchema }).readonly(); +export type UserUpdateDto = z.infer; + +/** + * UserBasicUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + */ +export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }).readonly(); +export type UserBasicUpdateDto = z.infer; + +/** + * UserPasswordUpdateDtoSchema + * @type { object } + * @property { string } password + */ +export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }).readonly(); +export type UserPasswordUpdateDto = z.infer; + +/** + * GetUserProfileResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ +export const GetUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape }); +export type GetUserProfileResponse = z.infer; + +/** + * UpdateUserDataResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ +export const UpdateUserDataResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape }); +export type UpdateUserDataResponse = z.infer; + +/** + * UpdateUserProfileResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ +export const UpdateUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape }); +export type UpdateUserProfileResponse = z.infer; + +} diff --git a/test/generated/next/controlTowerMe/controlTowerMe.queries.ts b/test/generated/next/controlTowerMe/controlTowerMe.queries.ts new file mode 100644 index 0000000..fa4d7c0 --- /dev/null +++ b/test/generated/next/controlTowerMe/controlTowerMe.queries.ts @@ -0,0 +1,148 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerMeModels } from "./controlTowerMe.models"; +import { ControlTowerMeApi } from "./controlTowerMe.api"; + +export namespace ControlTowerMeQueries { +export const moduleName = QueryModule.ControlTowerMe; + +export const keys = { + all: [moduleName] as const, + getUserProfile: () => [...keys.all, "/me", ] as const, +}; + +/** + * Query `useGetUserProfile` + * @description Get basic user profile data + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200] + */ +export const useGetUserProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getUserProfile(), + queryFn: () => + ControlTowerMeApi.getUserProfile(config), + ...options, + }); +}; + +/** + * Mutation `useUpdateUserData` + * @description Update user data + * @param { ControlTowerMeModels.UserUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateUserData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updateUserData(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateUserProfile` + * @description Update basic user profile data + * @param { ControlTowerMeModels.UserBasicUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateUserProfile = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updateUserProfile(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdatePassword` + * @description Update user password + * @param { ControlTowerMeModels.UserPasswordUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdatePassword = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updatePassword(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateEmailPreferences` + * @description Update user email notification preferences + * @param { ControlTowerMeModels.UserEmailPreferencesUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateEmailPreferences = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updateEmailPreferences(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateProjectAccess` + * @description Update user project access + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateProjectAccess = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: () => + ControlTowerMeApi.updateProjectAccess(config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.api.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.api.ts new file mode 100644 index 0000000..6cab316 --- /dev/null +++ b/test/generated/next/controlTowerPackages/controlTowerPackages.api.ts @@ -0,0 +1,24 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; + +export namespace ControlTowerPackagesApi { +export const findAll = (limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, + `/packages`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.configs.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.configs.ts new file mode 100644 index 0000000..17e4ee5 --- /dev/null +++ b/test/generated/next/controlTowerPackages/controlTowerPackages.configs.ts @@ -0,0 +1,50 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; +import { ControlTowerPackagesQueries } from "./controlTowerPackages.queries"; + +export namespace ControlTowerPackagesConfigs { +export const packagesConfig = { + meta: { + title: "Packages", + }, + readAll: { + schema: ControlTowerPackagesModels.PackageListItemDtoSchema, + paginated: ControlTowerPackagesQueries.useFindAll, + infinite: ControlTowerPackagesQueries.useFindAllInfinite, + filters: { + schema: ControlTowerPackagesModels.PackageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerPackagesModels.PackageFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ControlTowerPackagesModels.PackageListItemDtoSchema, + options: { + columns: { + packageNumber: true, + bookingId: true, + id: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.models.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.models.ts new file mode 100644 index 0000000..4d4fd3b --- /dev/null +++ b/test/generated/next/controlTowerPackages/controlTowerPackages.models.ts @@ -0,0 +1,54 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ControlTowerPackagesModels { +/** + * PackageListItemDtoSchema + * @type { object } + * @property { string } packageNumber + * @property { string } bookingId + * @property { string } id + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const PackageListItemDtoSchema = z.object({ packageNumber: z.string(), bookingId: z.string(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export type PackageListItemDto = z.infer; + +/** + * PackageFilterDtoSchema + * @type { object } + * @property { string } search Min Length: `1` + */ +export const PackageFilterDtoSchema = z.object({ search: z.string().min(1) }).readonly(); +export type PackageFilterDto = z.infer; + +/** + * ControlTowerPackagesFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ControlTowerPackagesFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); +export type ControlTowerPackagesFindAllOrderParamEnum = z.infer; +export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFindAllOrderParamEnumSchema.enum; + +/** + * ControlTowerPackagesFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PackageListItemDto[] } items + */ +export const ControlTowerPackagesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageListItemDtoSchema).readonly() }).readonly().shape }); +export type ControlTowerPackagesFindAllResponse = z.infer; + +} diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts new file mode 100644 index 0000000..d55ee3d --- /dev/null +++ b/test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts @@ -0,0 +1,66 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; +import { ControlTowerPackagesApi } from "./controlTowerPackages.api"; + +export namespace ControlTowerPackagesQueries { +export const moduleName = QueryModule.ControlTowerPackages; + +export const keys = { + all: [moduleName] as const, + findAll: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string) => [...keys.all, "/packages", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string) => [...keys.all, "/packages", "infinite", limit, order, filter, cursor] as const, +}; + +/** + * Query `useFindAll` + * @description Lists packages + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => + ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @description Lists packages + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/next/controlTowerSearch/controlTowerSearch.api.ts b/test/generated/next/controlTowerSearch/controlTowerSearch.api.ts new file mode 100644 index 0000000..4ff685b --- /dev/null +++ b/test/generated/next/controlTowerSearch/controlTowerSearch.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ControlTowerSearchModels } from "./controlTowerSearch.models"; + +export namespace ControlTowerSearchApi { +export const search = (data: ControlTowerSearchModels.SearchRequestDto, type?: ControlTowerSearchModels.SearchItemTypeEnum, limit?: number, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, + `/search`, + ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), + { + ...config, + params: { + type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { type: "query", name: "type" }), + limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), + }, + } + ) +}; +} diff --git a/test/generated/next/controlTowerSearch/controlTowerSearch.models.ts b/test/generated/next/controlTowerSearch/controlTowerSearch.models.ts new file mode 100644 index 0000000..77d7c82 --- /dev/null +++ b/test/generated/next/controlTowerSearch/controlTowerSearch.models.ts @@ -0,0 +1,42 @@ +import { z } from "zod"; + +export namespace ControlTowerSearchModels { +/** + * SearchItemTypeEnumSchema + * @type { enum } + */ +export const SearchItemTypeEnumSchema = z.enum(["Project", "Booking", "Container"]); +export type SearchItemTypeEnum = z.infer; +export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; + +/** + * SearchItemDtoSchema + * @type { object } + * @property { SearchItemTypeEnum } type + * @property { string } id + * @property { string } label + */ +export const SearchItemDtoSchema = z.object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }).readonly(); +export type SearchItemDto = z.infer; + +/** + * SearchResponseDtoSchema + * @type { object } + * @property { SearchItemDto[] } items + * @property { number } projectsCount + * @property { number } bookingsCount + * @property { number } containersCount + * @property { number } totalCount + */ +export const SearchResponseDtoSchema = z.object({ items: z.array(SearchItemDtoSchema).readonly(), projectsCount: z.number(), bookingsCount: z.number(), containersCount: z.number(), totalCount: z.number() }).readonly(); +export type SearchResponseDto = z.infer; + +/** + * SearchRequestDtoSchema + * @type { object } + * @property { string } search + */ +export const SearchRequestDtoSchema = z.object({ search: z.string() }).readonly(); +export type SearchRequestDto = z.infer; + +} diff --git a/test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts b/test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts new file mode 100644 index 0000000..11200f8 --- /dev/null +++ b/test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts @@ -0,0 +1,38 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ControlTowerSearchModels } from "./controlTowerSearch.models"; +import { ControlTowerSearchApi } from "./controlTowerSearch.api"; + +export namespace ControlTowerSearchQueries { +export const moduleName = QueryModule.ControlTowerSearch; + + + +/** + * Mutation `useSearch` + * @param { ControlTowerSearchModels.SearchRequestDto } mutation.data Body parameter + * @param { ControlTowerSearchModels.SearchItemTypeEnum } mutation.type Query parameter + * @param { number } mutation.limit Query parameter. Minimum: `1` + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useSearch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data, type, limit }) => + ControlTowerSearchApi.search(data, type, limit, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/countries/countries.acl.ts b/test/generated/next/countries/countries.acl.ts new file mode 100644 index 0000000..0d2de89 --- /dev/null +++ b/test/generated/next/countries/countries.acl.ts @@ -0,0 +1,34 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CountriesAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Country" +] as AbilityTuple<"Read", "Country">; + +/** + * Use for `usePaginateCountryLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCountryLabels` query + */ +export const canUsePaginateCountryLabels = ( +) => [ + "Read", + "Country" +] as AbilityTuple<"Read", "Country">; + +/** + * Use for `useGetCountryById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCountryById` query + */ +export const canUseGetCountryById = ( +) => [ + "Read", + "Country" +] as AbilityTuple<"Read", "Country">; + +} diff --git a/test/generated/next/countries/countries.api.ts b/test/generated/next/countries/countries.api.ts new file mode 100644 index 0000000..7363457 --- /dev/null +++ b/test/generated/next/countries/countries.api.ts @@ -0,0 +1,47 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CountriesModels } from "./countries.models"; + +export namespace CountriesApi { +export const paginate = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CountriesModels.CountriesPaginateResponseSchema }, + `/countries/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateCountryLabels = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, + `/countries/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getCountryById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CountriesModels.CountryResponseDTOSchema }, + `/countries/${id}`, + config + ) +}; +} diff --git a/test/generated/next/countries/countries.configs.ts b/test/generated/next/countries/countries.configs.ts new file mode 100644 index 0000000..52d1c12 --- /dev/null +++ b/test/generated/next/countries/countries.configs.ts @@ -0,0 +1,84 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CountriesModels } from "./countries.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CountriesQueries } from "./countries.queries"; +import { CountriesAcl } from "./countries.acl"; + +export namespace CountriesConfigs { +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CountriesAcl.canUsePaginate, + schema: CountriesModels.CountryResponseDTOSchema, + paginated: CountriesQueries.usePaginate, + infinite: CountriesQueries.usePaginateInfinite, + filters: { + schema: CountriesModels.CountryPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CountriesModels.CountryPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CountriesModels.CountryResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + isoCode2: true, + isoCode3: true, + currencyNotation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CountriesModels.CountriesPaginateOrderParamEnumSchema, + }, +}), + }, +}; + +export const labelsPaginateConfig = { + meta: { + title: "Labels Paginate", + }, + readAll: { + acl: CountriesAcl.canUsePaginateCountryLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CountriesQueries.usePaginateCountryLabels, + infinite: CountriesQueries.usePaginateCountryLabelsInfinite, + filters: { + schema: CountriesModels.CountryPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CountriesModels.CountryPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CountriesModels.PaginateCountryLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/countries/countries.models.ts b/test/generated/next/countries/countries.models.ts new file mode 100644 index 0000000..335259c --- /dev/null +++ b/test/generated/next/countries/countries.models.ts @@ -0,0 +1,82 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CountriesModels { +/** + * CountryEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CountryEmployeeDTO = z.infer; + +/** + * CountryResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the country + * @property { string } name Name of the country + * @property { string } isoCode2 ISO 2-letter code + * @property { string } isoCode3 ISO 3-letter code + * @property { string } currencyNotation Currency notation + * @property { string } createdById + * @property { CountryEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CountryEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const CountryResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the country"), name: z.string().describe("Name of the country"), isoCode2: z.string().describe("ISO 2-letter code"), isoCode3: z.string().describe("ISO 3-letter code"), currencyNotation: z.string().describe("Currency notation"), createdById: z.string().nullish(), createdBy: CountryEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CountryEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type CountryResponseDTO = z.infer; + +/** + * CountryPaginationFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const CountryPaginationFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type CountryPaginationFilterDto = z.infer; + +/** + * CountriesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const CountriesPaginateOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type CountriesPaginateOrderParamEnum = z.infer; +export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSchema.enum; + +/** + * CountriesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CountryResponseDTO[] } items + */ +export const CountriesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CountryResponseDTOSchema).readonly() }).readonly().shape }); +export type CountriesPaginateResponse = z.infer; + +/** + * PaginateCountryLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateCountryLabelsOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateCountryLabelsOrderParamEnum = z.infer; +export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderParamEnumSchema.enum; + +/** + * PaginateCountryLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateCountryLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PaginateCountryLabelsResponse = z.infer; + +} diff --git a/test/generated/next/countries/countries.queries.ts b/test/generated/next/countries/countries.queries.ts new file mode 100644 index 0000000..911e551 --- /dev/null +++ b/test/generated/next/countries/countries.queries.ts @@ -0,0 +1,153 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CountriesAcl } from "./countries.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { CountriesModels } from "./countries.models"; +import { CountriesApi } from "./countries.api"; + +export namespace CountriesQueries { +export const moduleName = QueryModule.Countries; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/paginate", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/paginate", "infinite", limit, order, filter, cursor] as const, + paginateCountryLabels: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/labels/paginate", limit, order, filter, page, cursor] as const, + paginateCountryLabelsInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/labels/paginate", "infinite", limit, order, filter, cursor] as const, + getCountryById: (id: string) => [...keys.all, "/countries/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Countries + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CountriesAcl.canUsePaginate()); + return CountriesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Countries + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CountriesAcl.canUsePaginate()); + return CountriesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateCountryLabels` + * @summary Paginate country labels (id and name only) + * @permission Requires `canUsePaginateCountryLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCountryLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CountriesAcl.canUsePaginateCountryLabels()); + return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateCountryLabelsInfinite + * @summary Paginate country labels (id and name only) + * @permission Requires `canUsePaginateCountryLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCountryLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CountriesAcl.canUsePaginateCountryLabels()); + return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetCountryById` + * @summary Get country by ID with complete details + * @permission Requires `canUseGetCountryById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCountryById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCountryById(id), + queryFn: () => { + checkAcl(CountriesAcl.canUseGetCountryById()); + return CountriesApi.getCountryById(id, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/currencies/currencies.acl.ts b/test/generated/next/currencies/currencies.acl.ts new file mode 100644 index 0000000..ff528da --- /dev/null +++ b/test/generated/next/currencies/currencies.acl.ts @@ -0,0 +1,64 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CurrenciesAcl { +/** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; + +/** + * Use for `useCreateCurrency` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCurrency` mutation + */ +export const canUseCreateCurrency = ( +) => [ + "Create", + "Currency" +] as AbilityTuple<"Create", "Currency">; + +/** + * Use for `usePaginateCurrencyLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabels` query + */ +export const canUsePaginateCurrencyLabels = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; + +/** + * Use for `useGetCurrencyById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCurrencyById` query + */ +export const canUseGetCurrencyById = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; + +/** + * Use for `useUpdateCurrency` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCurrency` mutation + */ +export const canUseUpdateCurrency = ( +) => [ + "Update", + "Currency" +] as AbilityTuple<"Update", "Currency">; + +/** + * Use for `usePaginateCurrencyLabelsByOffice` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabelsByOffice` query + */ +export const canUsePaginateCurrencyLabelsByOffice = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; + +} diff --git a/test/generated/next/currencies/currencies.api.ts b/test/generated/next/currencies/currencies.api.ts new file mode 100644 index 0000000..721f437 --- /dev/null +++ b/test/generated/next/currencies/currencies.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CurrenciesModels } from "./currencies.models"; + +export namespace CurrenciesApi { +export const list = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.CurrenciesListResponseSchema }, + `/currencies`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies`, + ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), + config + ) +}; +export const paginateCurrencyLabels = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, + `/currencies/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getCurrencyById = (isoCode: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies/${isoCode}`, + config + ) +}; +export const updateCurrency = (isoCode: string, data: CurrenciesModels.UpdateCurrencyRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies/${isoCode}`, + ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), + config + ) +}; +export const paginateCurrencyLabelsByOffice = (officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, + `/offices/${officeId}/currencies/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/next/currencies/currencies.configs.ts b/test/generated/next/currencies/currencies.configs.ts new file mode 100644 index 0000000..6d36fb1 --- /dev/null +++ b/test/generated/next/currencies/currencies.configs.ts @@ -0,0 +1,153 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CurrenciesModels } from "./currencies.models"; +import { CommonModels } from "@/data/common/common.models"; +import { CurrenciesQueries } from "./currencies.queries"; +import { CurrenciesAcl } from "./currencies.acl"; + +export namespace CurrenciesConfigs { +export const currenciesConfig = { + meta: { + title: "Currencies", + }, + readAll: { + acl: CurrenciesAcl.canUseList, + schema: CurrenciesModels.CurrencyResponseDtoSchema, + paginated: CurrenciesQueries.useList, + infinite: CurrenciesQueries.useListInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CurrenciesModels.CurrencyResponseDtoSchema, + options: { + columns: { + isoCode: true, + name: true, + symbol: true, + alignment: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CurrenciesModels.CurrenciesListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: CurrenciesAcl.canUseGetCurrencyById, + schema: CurrenciesModels.CurrencyResponseDtoSchema, + query: CurrenciesQueries.useGetCurrencyById, + }, + create: { + acl: CurrenciesAcl.canUseCreateCurrency, + schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, + mutation: CurrenciesQueries.useCreateCurrency, + inputDefs: dynamicInputs({ + schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, + options: { + inputs: { + isoCode: true, + name: true, + symbol: true, + alignment: true, + }, + }, +}) + }, + update: { + acl: CurrenciesAcl.canUseUpdateCurrency, + schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, + mutation: CurrenciesQueries.useUpdateCurrency, + inputDefs: dynamicInputs({ + schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: CurrenciesAcl.canUsePaginateCurrencyLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CurrenciesQueries.usePaginateCurrencyLabels, + infinite: CurrenciesQueries.usePaginateCurrencyLabelsInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +export const labelsPaginateConfig = { + meta: { + title: "Labels Paginate", + }, + readAll: { + acl: CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice, + schema: CommonModels.LabelResponseDTOSchema, + paginated: CurrenciesQueries.usePaginateCurrencyLabelsByOffice, + infinite: CurrenciesQueries.usePaginateCurrencyLabelsByOfficeInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/currencies/currencies.models.ts b/test/generated/next/currencies/currencies.models.ts new file mode 100644 index 0000000..560fc3c --- /dev/null +++ b/test/generated/next/currencies/currencies.models.ts @@ -0,0 +1,122 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CurrenciesModels { +/** + * CurrencyEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CurrencyEmployeeDTO = z.infer; + +/** + * CurrencyResponseDtoSchema + * @type { object } + * @property { string } isoCode isoCode of the currency + * @property { string } name Name of the currency + * @property { string } symbol Symbol of the currency + * @property { string } alignment Alignment of the currency + * @property { string } createdById ID of the employee who created this currency + * @property { CurrencyEmployeeDTO } createdBy Employee who created this currency + * @property { string } createdAt Date when the currency was created + * @property { string } updatedById ID of the employee who last updated this currency + * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency + * @property { string } updatedAt Date when the currency was last updated + */ +export const CurrencyResponseDtoSchema = z.object({ isoCode: z.string().describe("isoCode of the currency"), name: z.string().describe("Name of the currency"), symbol: z.string().describe("Symbol of the currency").nullish(), alignment: z.string().describe("Alignment of the currency").nullish(), createdById: z.string().describe("ID of the employee who created this currency").nullish(), createdBy: CurrencyEmployeeDTOSchema.describe("Employee who created this currency").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Date when the currency was created"), updatedById: z.string().describe("ID of the employee who last updated this currency").nullish(), updatedBy: CurrencyEmployeeDTOSchema.describe("Employee who last updated this currency").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Date when the currency was last updated") }).readonly(); +export type CurrencyResponseDto = z.infer; + +/** + * CurrencyPaginationFilterDtoSchema + * @type { object } + * @property { string } officeId + * @property { string } search + */ +export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string(), search: z.string() }).readonly(); +export type CurrencyPaginationFilterDto = z.infer; + +/** + * CreateCurrencyRequestDTOSchema + * @type { object } + * @property { string } isoCode Unique identifier for the currency + * @property { string } name Name of the currency + * @property { string } symbol Symbol of the currency + * @property { string } alignment Alignment of the currency + */ +export const CreateCurrencyRequestDTOSchema = z.object({ isoCode: z.string().describe("Unique identifier for the currency"), name: z.string().describe("Name of the currency"), symbol: z.string().describe("Symbol of the currency"), alignment: z.string().describe("Alignment of the currency") }).readonly(); +export type CreateCurrencyRequestDTO = z.infer; + +/** + * UpdateCurrencyRequestDTOSchema + * @type { object } + * @property { string } name Name of the currency + */ +export const UpdateCurrencyRequestDTOSchema = z.object({ name: z.string().describe("Name of the currency") }).readonly(); +export type UpdateCurrencyRequestDTO = z.infer; + +/** + * CurrenciesListOrderParamEnumSchema + * @type { enum } + */ +export const CurrenciesListOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type CurrenciesListOrderParamEnum = z.infer; +export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.enum; + +/** + * CurrenciesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CurrencyResponseDto[] } items + */ +export const CurrenciesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CurrencyResponseDtoSchema).readonly() }).readonly().shape }); +export type CurrenciesListResponse = z.infer; + +/** + * PaginateCurrencyLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateCurrencyLabelsOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateCurrencyLabelsOrderParamEnum = z.infer; +export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderParamEnumSchema.enum; + +/** + * PaginateCurrencyLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateCurrencyLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PaginateCurrencyLabelsResponse = z.infer; + +/** + * PaginateCurrencyLabelsByOfficeOrderParamEnumSchema + * @type { enum } + */ +export const PaginateCurrencyLabelsByOfficeOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateCurrencyLabelsByOfficeOrderParamEnum = z.infer; +export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabelsByOfficeOrderParamEnumSchema.enum; + +/** + * PaginateCurrencyLabelsByOfficeResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PaginateCurrencyLabelsByOfficeResponse = z.infer; + +} diff --git a/test/generated/next/currencies/currencies.queries.ts b/test/generated/next/currencies/currencies.queries.ts new file mode 100644 index 0000000..ba31720 --- /dev/null +++ b/test/generated/next/currencies/currencies.queries.ts @@ -0,0 +1,268 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CurrenciesAcl } from "./currencies.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CurrenciesModels } from "./currencies.models"; +import { CurrenciesApi } from "./currencies.api"; + +export namespace CurrenciesQueries { +export const moduleName = QueryModule.Currencies; + +export const keys = { + all: [moduleName] as const, + list: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies", "infinite", limit, order, filter, cursor] as const, + paginateCurrencyLabels: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies/labels/paginate", limit, order, filter, page, cursor] as const, + paginateCurrencyLabelsInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies/labels/paginate", "infinite", limit, order, filter, cursor] as const, + getCurrencyById: (isoCode: string) => [...keys.all, "/currencies/:isoCode", isoCode] as const, + paginateCurrencyLabelsByOffice: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", officeId, limit, order, filter, page, cursor] as const, + paginateCurrencyLabelsByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, +}; + +/** + * Query `useList` + * @summary List Currencies + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUseList()); + return CurrenciesApi.list(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List Currencies + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUseList()); + return CurrenciesApi.list(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreateCurrency` + * @summary Create Currency + * @permission Requires `canUseCreateCurrency` ability + * @param { CurrenciesModels.CreateCurrencyRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateCurrency = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CurrenciesAcl.canUseCreateCurrency()); + return CurrenciesApi.createCurrency(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateCurrencyLabels` + * @summary Paginate Currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateCurrencyLabelsInfinite + * @summary Paginate Currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetCurrencyById` + * @summary Get Currency by iso code + * @permission Requires `canUseGetCurrencyById` ability + * @param { string } object.isoCode Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCurrencyById = ({ isoCode }: { isoCode: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCurrencyById(isoCode), + queryFn: () => { + checkAcl(CurrenciesAcl.canUseGetCurrencyById()); + return CurrenciesApi.getCurrencyById(isoCode, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCurrency` + * @summary Update Currency + * @permission Requires `canUseUpdateCurrency` ability + * @param { string } mutation.isoCode Path parameter + * @param { CurrenciesModels.UpdateCurrencyRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCurrency = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ isoCode, data }) => { + checkAcl(CurrenciesAcl.canUseUpdateCurrency()); + return CurrenciesApi.updateCurrency(isoCode, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { isoCode } = variables; + const updateKeys = [keys.getCurrencyById(isoCode)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateCurrencyLabelsByOffice` + * @summary Paginate office currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabelsByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateCurrencyLabelsByOfficeInfinite + * @summary Paginate office currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabelsByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/next/customerAccount/customerAccount.api.ts b/test/generated/next/customerAccount/customerAccount.api.ts new file mode 100644 index 0000000..360b9b1 --- /dev/null +++ b/test/generated/next/customerAccount/customerAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { CustomerAccountModels } from "./customerAccount.models"; + +export namespace CustomerAccountApi { +export const get = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, + `/customers/account`, + config + ) +}; +} diff --git a/test/generated/next/customerAccount/customerAccount.models.ts b/test/generated/next/customerAccount/customerAccount.models.ts new file mode 100644 index 0000000..4e0da5a --- /dev/null +++ b/test/generated/next/customerAccount/customerAccount.models.ts @@ -0,0 +1,37 @@ +import { z } from "zod"; + +export namespace CustomerAccountModels { +/** + * CustomerCompanyDtoSchema + * @type { object } + * @property { string } id Company ID + * @property { string } name Company name + */ +export const CustomerCompanyDtoSchema = z.object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name").nullish() }).readonly(); +export type CustomerCompanyDto = z.infer; + +/** + * CustomerBusinessPartnerDtoSchema + * @type { object } + * @property { string } id Company ID + * @property { string } name Company name + */ +export const CustomerBusinessPartnerDtoSchema = z.object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name") }).readonly(); +export type CustomerBusinessPartnerDto = z.infer; + +/** + * CustomerAccountDtoSchema + * @type { object } + * @property { array[] } aclRules Can hold any type of value + * @property { string } id Customer ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { CustomerCompanyDto } company Company + * @property { CustomerBusinessPartnerDto } businessPartner + */ +export const CustomerAccountDtoSchema = z.object({ aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), id: z.string().describe("Customer ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), company: CustomerCompanyDtoSchema.describe("Company").nullish(), businessPartner: CustomerBusinessPartnerDtoSchema.nullish() }).readonly(); +export type CustomerAccountDto = z.infer; + +} diff --git a/test/generated/next/customerAccount/customerAccount.queries.ts b/test/generated/next/customerAccount/customerAccount.queries.ts new file mode 100644 index 0000000..38f8624 --- /dev/null +++ b/test/generated/next/customerAccount/customerAccount.queries.ts @@ -0,0 +1,32 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { CustomerAccountApi } from "./customerAccount.api"; + +export namespace CustomerAccountQueries { +export const moduleName = QueryModule.CustomerAccount; + +export const keys = { + all: [moduleName] as const, + get: () => [...keys.all, "/customers/account", ] as const, +}; + +/** + * Query `useGet` + * @summary Get profile of logged-in user + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.get(), + queryFn: () => + CustomerAccountApi.get(config), + ...options, + }); +}; + +} diff --git a/test/generated/next/customers/customers.acl.ts b/test/generated/next/customers/customers.acl.ts new file mode 100644 index 0000000..bb972e0 --- /dev/null +++ b/test/generated/next/customers/customers.acl.ts @@ -0,0 +1,66 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace CustomersAcl { +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Customer" +] as AbilityTuple<"Create", "Customer">; + +/** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( +) => [ + "Read", + "Customer" +] as AbilityTuple<"Read", "Customer">; + +/** + * Use for `useFindById` query ability. + * @description Read a customer with id + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Customer" +] as AbilityTuple<"Read", "Customer">; + +/** + * Use for `useUpdate` mutation ability. + * @description Update Customer + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Customer" +] as AbilityTuple<"Update", "Customer">; + +/** + * Use for `useDeactivate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeactivate` mutation + */ +export const canUseDeactivate = ( +) => [ + "Deactivate", + "Customer" +] as AbilityTuple<"Deactivate", "Customer">; + +/** + * Use for `useReactivate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReactivate` mutation + */ +export const canUseReactivate = ( +) => [ + "Reactivate", + "Customer" +] as AbilityTuple<"Reactivate", "Customer">; + +} diff --git a/test/generated/next/customers/customers.api.ts b/test/generated/next/customers/customers.api.ts new file mode 100644 index 0000000..0f87f69 --- /dev/null +++ b/test/generated/next/customers/customers.api.ts @@ -0,0 +1,70 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CustomersModels } from "./customers.models"; + +export namespace CustomersApi { +export const findProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, + `/customers/me`, + config + ) +}; +export const create = (data: CustomersModels.CreateCustomerDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers`, + ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), + config + ) +}; +export const list = (limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomersModels.CustomersListResponseSchema }, + `/customers`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (customerId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${customerId}`, + config + ) +}; +export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${customerId}`, + ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), + config + ) +}; +export const deactivate = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${id}/deactivate`, + undefined, + config + ) +}; +export const reactivate = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${id}/reactivate`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/customers/customers.configs.ts b/test/generated/next/customers/customers.configs.ts new file mode 100644 index 0000000..95eec1d --- /dev/null +++ b/test/generated/next/customers/customers.configs.ts @@ -0,0 +1,92 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CustomersModels } from "./customers.models"; +import { CustomersQueries } from "./customers.queries"; +import { CustomersAcl } from "./customers.acl"; + +export namespace CustomersConfigs { +export const customersConfig = { + meta: { + title: "Customers", + }, + readAll: { + acl: CustomersAcl.canUseList, + schema: CustomersModels.CustomerListItemDTOSchema, + paginated: CustomersQueries.useList, + infinite: CustomersQueries.useListInfinite, + filters: { + schema: CustomersModels.CustomerPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CustomersModels.CustomerPaginationFilterDtoSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + companyId: true, + businessPartnerId: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CustomersModels.CustomerListItemDTOSchema, + options: { + columns: { + id: true, + firstName: true, + lastName: true, + email: true, + phone: true, + companyId: true, + businessPartnerId: true, + businessPartner: true, + }, + sortable: CustomersModels.CustomersListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: CustomersAcl.canUseFindById, + schema: CustomersModels.CustomerResponseDTOSchema, + query: CustomersQueries.useFindById, + }, + create: { + acl: CustomersAcl.canUseCreate, + schema: CustomersModels.CreateCustomerDTOSchema, + mutation: CustomersQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CustomersModels.CreateCustomerDTOSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + phone: true, + companyId: true, + businessPartnerId: true, + }, + }, +}) + }, + update: { + acl: CustomersAcl.canUseUpdate, + schema: CustomersModels.UpdateCustomerDTOSchema, + mutation: CustomersQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CustomersModels.UpdateCustomerDTOSchema, + options: { + inputs: { + firstName: true, + lastName: true, + phone: true, + companyId: true, + businessPartnerId: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/next/customers/customers.models.ts b/test/generated/next/customers/customers.models.ts new file mode 100644 index 0000000..e12d751 --- /dev/null +++ b/test/generated/next/customers/customers.models.ts @@ -0,0 +1,137 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace CustomersModels { +/** + * CustomerProfileBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CustomerProfileBusinessPartnerDto = z.infer; + +/** + * CustomerProfileResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + * @property { CustomerProfileBusinessPartnerDto } businessPartner + */ +export const CustomerProfileResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.email().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), businessPartner: CustomerProfileBusinessPartnerDtoSchema.nullish() }).readonly(); +export type CustomerProfileResponseDTO = z.infer; + +/** + * CustomerBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CustomerBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CustomerBusinessPartnerResponseDto = z.infer; + +/** + * CustomerResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company Id of the customer + * @property { string } businessPartnerId Business partner Id of the customer + * @property { boolean } archived Wether the customer is archived + * @property { CustomerBusinessPartnerResponseDto } businessPartner + */ +export const CustomerResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.email().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company Id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner Id of the customer").nullish(), archived: z.boolean().describe("Wether the customer is archived"), businessPartner: CustomerBusinessPartnerResponseDtoSchema.nullish() }).readonly(); +export type CustomerResponseDTO = z.infer; + +/** + * CustomerListItemBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type CustomerListItemBusinessPartnerDto = z.infer; + +/** + * CustomerListItemDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + * @property { CustomerListItemBusinessPartnerDto } businessPartner + */ +export const CustomerListItemDTOSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.string().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), businessPartner: CustomerListItemBusinessPartnerDtoSchema.nullish() }).readonly(); +export type CustomerListItemDTO = z.infer; + +/** + * CreateCustomerDTOSchema + * @type { object } + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + */ +export const CreateCustomerDTOSchema = z.object({ firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.email().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer").nullish(), companyId: z.string().describe("Company id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner id of the customer").nullish() }).readonly(); +export type CreateCustomerDTO = z.infer; + +/** + * CustomerPaginationFilterDtoSchema + * @type { object } + * @property { string } firstName + * @property { string } lastName + * @property { string } email + * @property { string } companyId + * @property { string } businessPartnerId + * @property { string } search + */ +export const CustomerPaginationFilterDtoSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.string(), companyId: z.string(), businessPartnerId: z.string(), search: z.string() }).readonly(); +export type CustomerPaginationFilterDto = z.infer; + +/** + * UpdateCustomerDTOSchema + * @type { object } + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + */ +export const UpdateCustomerDTOSchema = z.object({ firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company id of the customer"), businessPartnerId: z.string().describe("Business partner id of the customer") }).readonly(); +export type UpdateCustomerDTO = z.infer; + +/** + * CustomersListOrderParamEnumSchema + * @type { enum } + */ +export const CustomersListOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "createdAt"]); +export type CustomersListOrderParamEnum = z.infer; +export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enum; + +/** + * CustomersListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CustomerListItemDTO[] } items + */ +export const CustomersListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CustomerListItemDTOSchema).readonly() }).readonly().shape }); +export type CustomersListResponse = z.infer; + +} diff --git a/test/generated/next/customers/customers.queries.ts b/test/generated/next/customers/customers.queries.ts new file mode 100644 index 0000000..44fef2d --- /dev/null +++ b/test/generated/next/customers/customers.queries.ts @@ -0,0 +1,222 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { CustomersAcl } from "./customers.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CustomersModels } from "./customers.models"; +import { CustomersApi } from "./customers.api"; + +export namespace CustomersQueries { +export const moduleName = QueryModule.Customers; + +export const keys = { + all: [moduleName] as const, + findProfile: () => [...keys.all, "/customers/me", ] as const, + list: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/customers", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string) => [...keys.all, "/customers", "infinite", limit, order, filter, cursor] as const, + findById: (customerId: string) => [...keys.all, "/customers/:customerId", customerId] as const, +}; + +/** + * Query `useFindProfile` + * @summary Get customer by id + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findProfile(), + queryFn: () => + CustomersApi.findProfile(config), + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create new customer + * @permission Requires `canUseCreate` ability + * @param { CustomersModels.CreateCustomerDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CustomersAcl.canUseCreate()); + return CustomersApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useList` + * @summary List customers + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` + * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CustomersAcl.canUseList()); + return CustomersApi.list(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List customers + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` + * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CustomersAcl.canUseList()); + return CustomersApi.list(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get customer by id + * @permission Requires `canUseFindById` ability + * @param { string } object.customerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ customerId }: { customerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(customerId), + queryFn: () => { + checkAcl(CustomersAcl.canUseFindById()); + return CustomersApi.findById(customerId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update customer + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.customerId Path parameter + * @param { CustomersModels.UpdateCustomerDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ customerId, data }) => { + checkAcl(CustomersAcl.canUseUpdate()); + return CustomersApi.update(customerId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { customerId } = variables; + const updateKeys = [keys.findById(customerId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeactivate` + * @summary Deactivate customer + * @permission Requires `canUseDeactivate` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeactivate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CustomersAcl.canUseDeactivate()); + return CustomersApi.deactivate(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReactivate` + * @summary Reactivate customer + * @permission Requires `canUseReactivate` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReactivate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CustomersAcl.canUseReactivate()); + return CustomersApi.reactivate(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/depots/depots.acl.ts b/test/generated/next/depots/depots.acl.ts new file mode 100644 index 0000000..46e2374 --- /dev/null +++ b/test/generated/next/depots/depots.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace DepotsAcl { +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Depot" +] as AbilityTuple<"Create", "Depot">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Depot" +] as AbilityTuple<"Update", "Depot">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Depot" +] as AbilityTuple<"Archive", "Depot">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "Depot" +] as AbilityTuple<"Archive", "Depot">; + +} diff --git a/test/generated/next/depots/depots.api.ts b/test/generated/next/depots/depots.api.ts new file mode 100644 index 0000000..0bd409f --- /dev/null +++ b/test/generated/next/depots/depots.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DepotsModels } from "./depots.models"; + +export namespace DepotsApi { +export const create = (data: DepotsModels.CreateDepotRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots`, + ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), + config + ) +}; +export const paginate = (limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DepotsModels.DepotsPaginateResponseSchema }, + `/depots`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, + `/depots/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots/${id}`, + config + ) +}; +export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots/${id}`, + ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/depots/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/depots/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/depots/depots.configs.ts b/test/generated/next/depots/depots.configs.ts new file mode 100644 index 0000000..3e95aff --- /dev/null +++ b/test/generated/next/depots/depots.configs.ts @@ -0,0 +1,134 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DepotsModels } from "./depots.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DepotsQueries } from "./depots.queries"; +import { DepotsAcl } from "./depots.acl"; + +export namespace DepotsConfigs { +export const depotsConfig = { + meta: { + title: "Depots", + }, + readAll: { + acl: DepotsAcl.canUsePaginate, + schema: DepotsModels.DepotResponseDTOSchema, + paginated: DepotsQueries.usePaginate, + infinite: DepotsQueries.usePaginateInfinite, + filters: { + schema: DepotsModels.DepotPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DepotsModels.DepotPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DepotsModels.DepotResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + name: true, + shortName: true, + additionalInformation: true, + address: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: DepotsModels.DepotsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: DepotsAcl.canUseFindById, + schema: DepotsModels.DepotResponseDTOSchema, + query: DepotsQueries.useFindById, + }, + create: { + acl: DepotsAcl.canUseCreate, + schema: DepotsModels.CreateDepotRequestDTOSchema, + mutation: DepotsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DepotsModels.CreateDepotRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + additionalInformation: true, + name: true, + street: true, + zip: true, + district: true, + cityId: true, + countryId: true, + }, + }, +}) + }, + update: { + acl: DepotsAcl.canUseUpdate, + schema: DepotsModels.UpdateDepotRequestDTOSchema, + mutation: DepotsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DepotsModels.UpdateDepotRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + additionalInformation: true, + name: true, + street: true, + zip: true, + district: true, + cityId: true, + countryId: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DepotsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DepotsQueries.usePaginateLabels, + infinite: DepotsQueries.usePaginateLabelsInfinite, + filters: { + schema: DepotsModels.DepotLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DepotsModels.DepotLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/depots/depots.models.ts b/test/generated/next/depots/depots.models.ts new file mode 100644 index 0000000..9ee1c5d --- /dev/null +++ b/test/generated/next/depots/depots.models.ts @@ -0,0 +1,157 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DepotsModels { +/** + * DepotCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DepotCityDto = z.infer; + +/** + * DepotCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const DepotCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type DepotCountryDto = z.infer; + +/** + * AddressDTOSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { DepotCityDto } city + * @property { string } district District name + * @property { DepotCountryDto } country + */ +export const AddressDTOSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: DepotCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: DepotCountryDtoSchema.nullish() }).readonly(); +export type AddressDTO = z.infer; + +/** + * DepotEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DepotEmployeeDTO = z.infer; + +/** + * DepotResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the depot + * @property { string } matchCode Match code for the depot + * @property { string } name Name of the depot + * @property { string } shortName Short name of the depot + * @property { string } additionalInformation Additional info of the depot + * @property { AddressDTO } address Address details of the depot + * @property { boolean } archived + * @property { string } createdById + * @property { DepotEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DepotEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const DepotResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the depot"), matchCode: z.string().describe("Match code for the depot"), name: z.string().describe("Name of the depot"), shortName: z.string().describe("Short name of the depot").nullish(), additionalInformation: z.string().describe("Additional info of the depot").nullish(), address: AddressDTOSchema.describe("Address details of the depot"), archived: z.boolean(), createdById: z.string().nullish(), createdBy: DepotEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DepotEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type DepotResponseDTO = z.infer; + +/** + * CreateDepotRequestDTOSchema + * @type { object } + * @property { string } matchCode Unique identifier code for the depot + * @property { string } shortName Optional short name for the depot + * @property { string } additionalInformation + * @property { string } name Full name of the depot + * @property { string } street Street address of the depot + * @property { string } zip ZIP/Postal code + * @property { string } district District information + * @property { string } cityId City id + * @property { string } countryId Country code + */ +export const CreateDepotRequestDTOSchema = z.object({ matchCode: z.string().describe("Unique identifier code for the depot"), shortName: z.string().describe("Optional short name for the depot").nullish(), additionalInformation: z.string().nullish(), name: z.string().describe("Full name of the depot"), street: z.string().describe("Street address of the depot"), zip: z.string().describe("ZIP/Postal code"), district: z.string().describe("District information").nullish(), cityId: z.string().describe("City id"), countryId: z.string().describe("Country code") }).readonly(); +export type CreateDepotRequestDTO = z.infer; + +/** + * DepotPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter depots by name, matchCode, or shortName + * @property { boolean } archived + */ +export const DepotPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter depots by name, matchCode, or shortName"), archived: z.boolean() }).readonly(); +export type DepotPaginationFilterDto = z.infer; + +/** + * DepotLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DepotLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type DepotLabelFilterDto = z.infer; + +/** + * UpdateDepotRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code for the depot + * @property { string } shortName Updated short name + * @property { string } additionalInformation Updated short name + * @property { string } name Updated full name + * @property { string } street Updated street address + * @property { string } zip Updated ZIP/Postal code + * @property { string } district Updated district information + * @property { string } cityId Updated city id + * @property { string } countryId Updated country code + */ +export const UpdateDepotRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code for the depot"), shortName: z.string().describe("Updated short name"), additionalInformation: z.string().describe("Updated short name"), name: z.string().describe("Updated full name"), street: z.string().describe("Updated street address"), zip: z.string().describe("Updated ZIP/Postal code"), district: z.string().describe("Updated district information"), cityId: z.string().describe("Updated city id"), countryId: z.string().describe("Updated country code") }).readonly(); +export type UpdateDepotRequestDTO = z.infer; + +/** + * DepotsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const DepotsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DepotsPaginateOrderParamEnum = z.infer; +export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.enum; + +/** + * DepotsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DepotResponseDTO[] } items + */ +export const DepotsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DepotResponseDTOSchema).readonly() }).readonly().shape }); +export type DepotsPaginateResponse = z.infer; + +/** + * DepotsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DepotsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DepotsPaginateLabelsOrderParamEnum = z.infer; +export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * DepotsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DepotsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type DepotsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/depots/depots.queries.ts b/test/generated/next/depots/depots.queries.ts new file mode 100644 index 0000000..72505fa --- /dev/null +++ b/test/generated/next/depots/depots.queries.ts @@ -0,0 +1,261 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DepotsAcl } from "./depots.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DepotsModels } from "./depots.models"; +import { DepotsApi } from "./depots.api"; + +export namespace DepotsQueries { +export const moduleName = QueryModule.Depots; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string) => [...keys.all, "/depots", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string) => [...keys.all, "/depots/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/depots/:id", id] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a new depot + * @permission Requires `canUseCreate` ability + * @param { DepotsModels.CreateDepotRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(DepotsAcl.canUseCreate()); + return DepotsApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Paginate Depots + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DepotsAcl.canUsePaginate()); + return DepotsApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Depots + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DepotsAcl.canUsePaginate()); + return DepotsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate depots with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DepotsAcl.canUsePaginateLabels()); + return DepotsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate depots with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DepotsAcl.canUsePaginateLabels()); + return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Fetch depot by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(DepotsAcl.canUseFindById()); + return DepotsApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update a depot + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { DepotsModels.UpdateDepotRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(DepotsAcl.canUseUpdate()); + return DepotsApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive a depot + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(DepotsAcl.canUseArchive()); + return DepotsApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive a depot + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(DepotsAcl.canUseUnarchive()); + return DepotsApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/documentTemplates/documentTemplates.acl.ts b/test/generated/next/documentTemplates/documentTemplates.acl.ts new file mode 100644 index 0000000..8996246 --- /dev/null +++ b/test/generated/next/documentTemplates/documentTemplates.acl.ts @@ -0,0 +1,121 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DocumentTemplatesAcl { +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List document template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List document templates + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Create", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get document template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update document template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useAddRemarkBlock` mutation ability. For global ability, omit the object parameter. + * @description Add remark block to document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddRemarkBlock` mutation + */ +export const canUseAddRemarkBlock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useDeleteRemarkBlock` mutation ability. For global ability, omit the object parameter. + * @description Delete remark block from document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemarkBlock` mutation + */ +export const canUseDeleteRemarkBlock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Archive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +} diff --git a/test/generated/next/documentTemplates/documentTemplates.api.ts b/test/generated/next/documentTemplates/documentTemplates.api.ts new file mode 100644 index 0000000..496354d --- /dev/null +++ b/test/generated/next/documentTemplates/documentTemplates.api.ts @@ -0,0 +1,95 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; + +export namespace DocumentTemplatesApi { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/document-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, + `/offices/${officeId}/document-templates`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates`, + ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), + config + ) +}; +export const findById = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}`, + config + ) +}; +export const update = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}`, + ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), + config + ) +}; +export const addRemarkBlock = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, + ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), + config + ) +}; +export const deleteRemarkBlock = (documentTemplateId: string, remarkBlockId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, + undefined, + config + ) +}; +export const archive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, + undefined, + config + ) +}; +export const unarchive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/documentTemplates/documentTemplates.configs.ts b/test/generated/next/documentTemplates/documentTemplates.configs.ts new file mode 100644 index 0000000..bb792f1 --- /dev/null +++ b/test/generated/next/documentTemplates/documentTemplates.configs.ts @@ -0,0 +1,119 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DocumentTemplatesQueries } from "./documentTemplates.queries"; +import { DocumentTemplatesAcl } from "./documentTemplates.acl"; + +export namespace DocumentTemplatesConfigs { +export const documentTemplatesConfig = { + meta: { + title: "Document Templates", + }, + readAll: { + acl: DocumentTemplatesAcl.canUseList, + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + paginated: DocumentTemplatesQueries.useList, + infinite: DocumentTemplatesQueries.useListInfinite, + filters: { + schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, + options: { + inputs: { + isArchived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + isArchived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + blocks: true, + }, + sortable: DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: DocumentTemplatesAcl.canUseFindById, + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + query: DocumentTemplatesQueries.useFindById, + }, + create: { + acl: DocumentTemplatesAcl.canUseCreate, + schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, + mutation: DocumentTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + blocks: true, + }, + }, +}) + }, + update: { + acl: DocumentTemplatesAcl.canUseUpdate, + schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, + mutation: DocumentTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + isArchived: true, + blocks: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DocumentTemplatesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DocumentTemplatesQueries.usePaginateLabels, + infinite: DocumentTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/documentTemplates/documentTemplates.models.ts b/test/generated/next/documentTemplates/documentTemplates.models.ts new file mode 100644 index 0000000..6916a75 --- /dev/null +++ b/test/generated/next/documentTemplates/documentTemplates.models.ts @@ -0,0 +1,138 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DocumentTemplatesModels { +/** + * DocumentTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DocumentTemplateEmployeeDTO = z.infer; + +/** + * DocumentTemplateResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name + * @property { boolean } isArchived + * @property { string } createdById ID of the employee who created this template + * @property { DocumentTemplateEmployeeDTO } createdBy Employee who created this template + * @property { string } createdAt + * @property { string } updatedById ID of the employee who last updated this template + * @property { DocumentTemplateEmployeeDTO } updatedBy Employee who last updated this template + * @property { string } updatedAt + * @property { CommonModels.TemplateBlocksResponseDTO } blocks + */ +export const DocumentTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isArchived: z.boolean(), createdById: z.string().describe("ID of the employee who created this template").nullish(), createdBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), updatedBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), updatedAt: z.iso.datetime({ offset: true }), blocks: CommonModels.TemplateBlocksResponseDTOSchema }).readonly(); +export type DocumentTemplateResponseDTO = z.infer; + +/** + * TemplateBlocksDTOSchema + * @type { object } + * @property { CommonModels.TitleBlockDTO } titleBlock + * @property { CommonModels.ReceiverBlockDTO } receiverBlock + * @property { CommonModels.OurInformationBlockDTO } ourInformationBlock + * @property { CommonModels.RouteTableBlockDTO } routeTableBlock + * @property { CommonModels.CargoTableBlockDTO } cargoTableBlock + * @property { CommonModels.CargoSummaryBlockDTO } cargoSummaryBlock + * @property { CommonModels.FinanceTableBlockDTO } financeTableBlock + * @property { CommonModels.RemarkBlockDTO[] } remarkBlocks + * @property { CommonModels.FooterBlockDTO } footerBlock + * @property { CommonModels.TermsBlockDTO } termsBlock + * @property { CommonModels.CutOffDatesBlockDTO } cutOffDatesBlock + */ +export const TemplateBlocksDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); +export type TemplateBlocksDTO = z.infer; + +/** + * CreateDocumentTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { TemplateBlocksDTO } blocks + */ +export const CreateDocumentTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), blocks: TemplateBlocksDTOSchema.nullish() }).readonly(); +export type CreateDocumentTemplateRequestDTO = z.infer; + +/** + * UpdateDocumentTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { boolean } isArchived + * @property { TemplateBlocksDTO } blocks + */ +export const UpdateDocumentTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), isArchived: z.boolean(), blocks: TemplateBlocksDTOSchema }).readonly(); +export type UpdateDocumentTemplateRequestDTO = z.infer; + +/** + * CreateRemarkBlockRequestDTOSchema + * @type { object } + * @property { CommonModels.EditorContentUpdateDto } content + * @property { number } position 1-based position of the remark block. Minimum: `1` + * @property { boolean } enabled + */ +export const CreateRemarkBlockRequestDTOSchema = z.object({ content: CommonModels.EditorContentUpdateDtoSchema, position: z.number().gte(1).describe("1-based position of the remark block").nullish(), enabled: z.boolean().nullish() }).readonly(); +export type CreateRemarkBlockRequestDTO = z.infer; + +/** + * DocumentTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DocumentTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type DocumentTemplateLabelFilterDto = z.infer; + +/** + * DocumentTemplateFilterDtoSchema + * @type { object } + * @property { boolean } isArchived + * @property { string } search + */ +export const DocumentTemplateFilterDtoSchema = z.object({ isArchived: z.boolean(), search: z.string() }).readonly(); +export type DocumentTemplateFilterDto = z.infer; + +/** + * DocumentTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DocumentTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DocumentTemplatesPaginateLabelsOrderParamEnum = z.infer; +export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * DocumentTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type DocumentTemplatesPaginateLabelsResponse = z.infer; + +/** + * DocumentTemplatesListOrderParamEnumSchema + * @type { enum } + */ +export const DocumentTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DocumentTemplatesListOrderParamEnum = z.infer; +export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderParamEnumSchema.enum; + +/** + * DocumentTemplatesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DocumentTemplateResponseDTO[] } items + */ +export const DocumentTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).readonly() }).readonly().shape }); +export type DocumentTemplatesListResponse = z.infer; + +} diff --git a/test/generated/next/documentTemplates/documentTemplates.queries.ts b/test/generated/next/documentTemplates/documentTemplates.queries.ts new file mode 100644 index 0000000..6d6f164 --- /dev/null +++ b/test/generated/next/documentTemplates/documentTemplates.queries.ts @@ -0,0 +1,334 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DocumentTemplatesAcl } from "./documentTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DocumentTemplatesModels } from "./documentTemplates.models"; +import { DocumentTemplatesApi } from "./documentTemplates.api"; + +export namespace DocumentTemplatesQueries { +export const moduleName = QueryModule.DocumentTemplates; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (documentTemplateId: string, officeId: string) => [...keys.all, "/offices/:officeId/document-templates/:documentTemplateId", documentTemplateId, officeId] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate document template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate document template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useList` + * @summary List document templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); + return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List document templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); + return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new document template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId } )); + return DocumentTemplatesApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get document template by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.documentTemplateId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ documentTemplateId, officeId }: { documentTemplateId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(documentTemplateId, officeId), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId } )); + return DocumentTemplatesApi.findById(documentTemplateId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update document template by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId } )); + return DocumentTemplatesApi.update(documentTemplateId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useAddRemarkBlock` + * @summary Add a remark block to a document template + * @permission Requires `canUseAddRemarkBlock` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.CreateRemarkBlockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useAddRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId } )); + return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRemarkBlock` + * @summary Delete a remark block from a document template + * @permission Requires `canUseDeleteRemarkBlock` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.remarkBlockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId } )); + return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive document template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId } )); + return DocumentTemplatesApi.archive(documentTemplateId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive document template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ documentTemplateId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId } )); + return DocumentTemplatesApi.unarchive(documentTemplateId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.acl.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.acl.ts new file mode 100644 index 0000000..dc538a3 --- /dev/null +++ b/test/generated/next/dunningAccountStatement/dunningAccountStatement.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningAccountStatementAcl { +/** + * Use for `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation ability. For global ability, omit the object parameter. + * @description Generate account statement + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation + */ +export const canUseGenerateAccountStatement = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetAccountStatementEml` mutation ability. For global ability, omit the object parameter. + * @description Download account statement as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAccountStatementEml` mutation + */ +export const canUseGetAccountStatementEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +} diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts new file mode 100644 index 0000000..a351427 --- /dev/null +++ b/test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts @@ -0,0 +1,52 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningAccountStatementApi { +export const dataGenFake = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, + `/data-gen-fake/account-statement`, + config + ) +}; +export const generateAccountStatement = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/account-statement`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getAccountStatementEml = (officeId: string, data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/account-statement/eml`, + ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts new file mode 100644 index 0000000..40e5f92 --- /dev/null +++ b/test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts @@ -0,0 +1,83 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningAccountStatementModels { +/** + * AccountStatementPdfPayloadInvoiceDtoSchema + * @type { object } + * @property { string } number + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } dueDays + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + */ +export const AccountStatementPdfPayloadInvoiceDtoSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }), dueDays: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string() }).readonly(); +export type AccountStatementPdfPayloadInvoiceDto = z.infer; + +/** + * AccountStatementInvoicesByCurrencyAndDirectionDtoSchema + * @type { object } + * @property { string } direction + * @property { string } currency + * @property { AccountStatementPdfPayloadInvoiceDto[] } invoices + * @property { number } totalOutstandingAmount + */ +export const AccountStatementInvoicesByCurrencyAndDirectionDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema, currency: z.string(), invoices: z.array(AccountStatementPdfPayloadInvoiceDtoSchema).readonly(), totalOutstandingAmount: z.number() }).readonly(); +export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer; + +/** + * AccountStatementPdfPayloadBusinessPartnerDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + * @property { string } referenceNumber + */ +export const AccountStatementPdfPayloadBusinessPartnerDtoSchema = z.object({ name: z.string(), address: z.string().nullish(), referenceNumber: z.string().nullish() }).readonly(); +export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer; + +/** + * AccountStatementPdfPayloadBankAccountDtoSchema + * @type { object } + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + */ +export const AccountStatementPdfPayloadBankAccountDtoSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }).readonly(); +export type AccountStatementPdfPayloadBankAccountDto = z.infer; + +/** + * AccountStatementPdfPayloadDTOSchema + * @type { object } + * @property { AccountStatementPdfPayloadBusinessPartnerDto } businessPartner + * @property { AccountStatementInvoicesByCurrencyAndDirectionDto[] } invoicesByCurrencyAndDirection + * @property { AccountStatementPdfPayloadBankAccountDto } bankAccount + * @property { string } employeeName + * @property { CommonModels.ConfigBlockDto } config + */ +export const AccountStatementPdfPayloadDTOSchema = z.object({ businessPartner: AccountStatementPdfPayloadBusinessPartnerDtoSchema, invoicesByCurrencyAndDirection: z.array(AccountStatementInvoicesByCurrencyAndDirectionDtoSchema).readonly(), bankAccount: AccountStatementPdfPayloadBankAccountDtoSchema, employeeName: z.string().nullable(), config: CommonModels.ConfigBlockDtoSchema }).readonly(); +export type AccountStatementPdfPayloadDTO = z.infer; + +/** + * OfficeInvoiceListQueryDtoSchema + * @type { object } + * @property { string } order Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @property { CommonModels.OfficeInvoiceFilterDto } filter + * @property { number } limit Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + */ +export const OfficeInvoiceListQueryDtoSchema = z.object({ order: z.string().describe("Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId").nullish(), filter: CommonModels.OfficeInvoiceFilterDtoSchema.nullish(), limit: z.number().gte(1).lte(100).describe("Items per response").default(20), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish() }).readonly(); +export type OfficeInvoiceListQueryDto = z.infer; + +/** + * GenerateAccountStatementOrderParamEnumSchema + * @type { enum } + */ +export const GenerateAccountStatementOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); +export type GenerateAccountStatementOrderParamEnum = z.infer; +export const GenerateAccountStatementOrderParamEnum = GenerateAccountStatementOrderParamEnumSchema.enum; + +} diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts new file mode 100644 index 0000000..6c56860 --- /dev/null +++ b/test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts @@ -0,0 +1,156 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningAccountStatementAcl } from "./dunningAccountStatement.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; +import { DunningAccountStatementApi } from "./dunningAccountStatement.api"; + +export namespace DunningAccountStatementQueries { +export const moduleName = QueryModule.DunningAccountStatement; + +export const keys = { + all: [moduleName] as const, + dataGenFake: () => [...keys.all, "/data-gen-fake/account-statement", ] as const, + generateAccountStatement: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", officeId, limit, order, filter, page, cursor] as const, + generateAccountStatementInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", "infinite", officeId, limit, order, filter, cursor] as const, +}; + +/** + * Query `useDataGenFake` + * @summary Expose account statement PDF payload DTO for model generation + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useDataGenFake = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.dataGenFake(), + queryFn: () => + DunningAccountStatementApi.dataGenFake(config), + ...options, + }); +}; + +/** + * Query `useGenerateAccountStatement` - recommended when file should be cached + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGenerateAccountStatement = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Mutation `useGenerateAccountStatementMutation` - recommended when file should not be cached + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } mutation.officeId Path parameter + * @param { number } mutation.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } mutation.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } mutation.filter Query parameter + * @param { number } mutation.page Query parameter. 1-indexed page number to begin from + * @param { string } mutation.cursor Query parameter. ID of item to start after + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateAccountStatementMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, limit } = variables; + const updateKeys = [keys.generateAccountStatement(officeId, limit)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Infinite query `useGenerateAccountStatementInfinite + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGenerateAccountStatementInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useGetAccountStatementEml` - recommended when file should not be cached + * @summary Get account statement as EML file with PDF attachment + * @permission Requires `canUseGetAccountStatementEml` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningAccountStatementModels.OfficeInvoiceListQueryDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGetAccountStatementEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId } )); + return DunningAccountStatementApi.getAccountStatementEml(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/dunningLevels/dunningLevels.acl.ts b/test/generated/next/dunningLevels/dunningLevels.acl.ts new file mode 100644 index 0000000..eb52ae7 --- /dev/null +++ b/test/generated/next/dunningLevels/dunningLevels.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningLevelsAcl { +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List dunning level labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List dunning levels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Create", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get dunning level by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Update", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive a dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Archive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive a dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Unarchive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +} diff --git a/test/generated/next/dunningLevels/dunningLevels.api.ts b/test/generated/next/dunningLevels/dunningLevels.api.ts new file mode 100644 index 0000000..6a93d2f --- /dev/null +++ b/test/generated/next/dunningLevels/dunningLevels.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningLevelsModels } from "./dunningLevels.models"; + +export namespace DunningLevelsApi { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, + `/offices/${officeId}/dunning-levels/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, + `/offices/${officeId}/dunning-levels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: DunningLevelsModels.CreateDunningLevelRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels`, + ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: DunningLevelsModels.UpdateDunningLevelRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}`, + ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/dunningLevels/dunningLevels.configs.ts b/test/generated/next/dunningLevels/dunningLevels.configs.ts new file mode 100644 index 0000000..ddfe0e9 --- /dev/null +++ b/test/generated/next/dunningLevels/dunningLevels.configs.ts @@ -0,0 +1,135 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningLevelsModels } from "./dunningLevels.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningLevelsQueries } from "./dunningLevels.queries"; +import { DunningLevelsAcl } from "./dunningLevels.acl"; + +export namespace DunningLevelsConfigs { +export const dunningLevelsConfig = { + meta: { + title: "Dunning Levels", + }, + readAll: { + acl: DunningLevelsAcl.canUseList, + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + paginated: DunningLevelsQueries.useList, + infinite: DunningLevelsQueries.useListInfinite, + filters: { + schema: DunningLevelsModels.DunningLevelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningLevelsModels.DunningLevelFilterDtoSchema, + options: { + inputs: { + dunningSystemId: true, + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + options: { + columns: { + id: true, + level: true, + daysOverdue: true, + dunningFee: true, + interestRate: true, + usedInOfficeId: true, + usedInOffice: true, + dunningSystem: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + archived: true, + bodyRemarks: true, + footerRemarks: true, + }, + sortable: DunningLevelsModels.DunningLevelsListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: DunningLevelsAcl.canUseFindById, + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + query: DunningLevelsQueries.useFindById, + }, + create: { + acl: DunningLevelsAcl.canUseCreate, + schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, + mutation: DunningLevelsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, + options: { + inputs: { + level: true, + daysOverdue: true, + dunningFee: true, + dunningSystemId: true, + interestRate: true, + bodyRemarks: true, + footerRemarks: true, + }, + }, +}) + }, + update: { + acl: DunningLevelsAcl.canUseUpdate, + schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, + mutation: DunningLevelsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, + options: { + inputs: { + level: true, + daysOverdue: true, + dunningFee: true, + interestRate: true, + dunningSystemId: true, + bodyRemarks: true, + footerRemarks: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DunningLevelsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DunningLevelsQueries.usePaginateLabels, + infinite: DunningLevelsQueries.usePaginateLabelsInfinite, + filters: { + schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/dunningLevels/dunningLevels.models.ts b/test/generated/next/dunningLevels/dunningLevels.models.ts new file mode 100644 index 0000000..ed66cf5 --- /dev/null +++ b/test/generated/next/dunningLevels/dunningLevels.models.ts @@ -0,0 +1,136 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningLevelsModels { +/** + * DunningLevelOfficeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } currencyNotation + */ +export const DunningLevelOfficeDTOSchema = z.object({ id: z.string(), name: z.string(), currencyNotation: z.string() }).readonly(); +export type DunningLevelOfficeDTO = z.infer; + +/** + * DunningLevelEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DunningLevelEmployeeDTO = z.infer; + +/** + * DunningLevelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { number } level + * @property { number } daysOverdue + * @property { number } dunningFee + * @property { number } interestRate + * @property { string } usedInOfficeId + * @property { DunningLevelOfficeDTO } usedInOffice + * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem + * @property { string } createdById + * @property { DunningLevelEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DunningLevelEmployeeDTO } updatedBy + * @property { string } updatedAt + * @property { boolean } archived + * @property { CommonModels.EditorContentResponseDto } bodyRemarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks + */ +export const DunningLevelResponseDTOSchema = z.object({ id: z.string(), level: z.number(), daysOverdue: z.number(), dunningFee: z.number(), interestRate: z.number().nullish(), usedInOfficeId: z.string(), usedInOffice: DunningLevelOfficeDTOSchema.nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), createdById: z.string().nullish(), createdBy: DunningLevelEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningLevelEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), archived: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish() }).readonly(); +export type DunningLevelResponseDTO = z.infer; + +/** + * CreateDunningLevelRequestDTOSchema + * @type { object } + * @property { number } level Dunning level number. Minimum: `1` + * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` + * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` + * @property { string } dunningSystemId Dunning system ID + * @property { number } interestRate Minimum: `0`. Maximum: `100` + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const CreateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1).describe("Dunning level number"), daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), dunningSystemId: z.string().describe("Dunning system ID").nullish(), interestRate: z.number().gte(0).lte(100).nullish(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks").nullish() }).readonly(); +export type CreateDunningLevelRequestDTO = z.infer; + +/** + * UpdateDunningLevelRequestDTOSchema + * @type { object } + * @property { number } level Dunning level number. Minimum: `1` + * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` + * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` + * @property { number } interestRate Minimum: `0`. Maximum: `100` + * @property { string } dunningSystemId Dunning system ID + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1).describe("Dunning level number"), daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), interestRate: z.number().gte(0).lte(100), dunningSystemId: z.string().describe("Dunning system ID"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateDunningLevelRequestDTO = z.infer; + +/** + * DunningLevelLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DunningLevelLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type DunningLevelLabelFilterDto = z.infer; + +/** + * DunningLevelFilterDtoSchema + * @type { object } + * @property { string } dunningSystemId Dunning system ID to filter by + * @property { string } search Search to filter by + * @property { boolean } archived Filter by archived status + */ +export const DunningLevelFilterDtoSchema = z.object({ dunningSystemId: z.string().describe("Dunning system ID to filter by"), search: z.string().describe("Search to filter by"), archived: z.boolean().describe("Filter by archived status") }).readonly(); +export type DunningLevelFilterDto = z.infer; + +/** + * DunningLevelsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DunningLevelsPaginateLabelsOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DunningLevelsPaginateLabelsOrderParamEnum = z.infer; +export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * DunningLevelsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DunningLevelsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type DunningLevelsPaginateLabelsResponse = z.infer; + +/** + * DunningLevelsListOrderParamEnumSchema + * @type { enum } + */ +export const DunningLevelsListOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DunningLevelsListOrderParamEnum = z.infer; +export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSchema.enum; + +/** + * DunningLevelsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningLevelResponseDTO[] } items + */ +export const DunningLevelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningLevelResponseDTOSchema).readonly() }).readonly().shape }); +export type DunningLevelsListResponse = z.infer; + +} diff --git a/test/generated/next/dunningLevels/dunningLevels.queries.ts b/test/generated/next/dunningLevels/dunningLevels.queries.ts new file mode 100644 index 0000000..98ba1a5 --- /dev/null +++ b/test/generated/next/dunningLevels/dunningLevels.queries.ts @@ -0,0 +1,274 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningLevelsAcl } from "./dunningLevels.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningLevelsModels } from "./dunningLevels.models"; +import { DunningLevelsApi } from "./dunningLevels.api"; + +export namespace DunningLevelsQueries { +export const moduleName = QueryModule.DunningLevels; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-levels/:id", id, officeId] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate dunning level labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate dunning level labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useList` + * @summary List dunning levels + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUseList({ officeId } )); + return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List dunning levels + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningLevelsAcl.canUseList({ officeId } )); + return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create dunning level + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningLevelsModels.CreateDunningLevelRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningLevelsAcl.canUseCreate({ officeId } )); + return DunningLevelsApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get dunning level by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUseFindById({ officeId } )); + return DunningLevelsApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update dunning level + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningLevelsModels.UpdateDunningLevelRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(DunningLevelsAcl.canUseUpdate({ officeId } )); + return DunningLevelsApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive a dunning level + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningLevelsAcl.canUseArchive({ officeId } )); + return DunningLevelsApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive a dunning level + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId } )); + return DunningLevelsApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/dunningManagement/dunningManagement.acl.ts b/test/generated/next/dunningManagement/dunningManagement.acl.ts new file mode 100644 index 0000000..251aea8 --- /dev/null +++ b/test/generated/next/dunningManagement/dunningManagement.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningManagementAcl { +/** + * Use for `useListDunnings` query ability. For global ability, omit the object parameter. + * @description List dunnings + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListDunnings` query + */ +export const canUseListDunnings = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Dunning", object) : "Dunning" +] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; + +/** + * Use for `useCreateDunningWithInvoices` mutation ability. For global ability, omit the object parameter. + * @description Create dunning + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDunningWithInvoices` mutation + */ +export const canUseCreateDunningWithInvoices = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Dunning", object) : "Dunning" +] as AbilityTuple<"Create", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; + +/** + * Use for `useGetDunningEml` query or `useGetDunningEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download dunning as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDunningEml` query or `useGetDunningEmlMutation` mutation + */ +export const canUseGetDunningEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Dunning", object) : "Dunning" +] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; + +} diff --git a/test/generated/next/dunningManagement/dunningManagement.api.ts b/test/generated/next/dunningManagement/dunningManagement.api.ts new file mode 100644 index 0000000..7445607 --- /dev/null +++ b/test/generated/next/dunningManagement/dunningManagement.api.ts @@ -0,0 +1,53 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningManagementModels } from "./dunningManagement.models"; + +export namespace DunningManagementApi { +export const listDunnings = (officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningManagementModels.ListDunningsResponseSchema }, + `/offices/${officeId}/dunnings`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createDunningWithInvoices = (partnerId: string, officeId: string, data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningManagementModels.DunningResponseDtoSchema }, + `/offices/${officeId}/partners/${partnerId}/dunnings`, + ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), + config + ) +}; +export const dataGenFake = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, + `/data-gen-fake`, + config + ) +}; +export const getDunningEml = (officeId: string, dunningId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/dunnings/${dunningId}/eml`, + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/next/dunningManagement/dunningManagement.configs.ts b/test/generated/next/dunningManagement/dunningManagement.configs.ts new file mode 100644 index 0000000..6c09ba7 --- /dev/null +++ b/test/generated/next/dunningManagement/dunningManagement.configs.ts @@ -0,0 +1,60 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningManagementModels } from "./dunningManagement.models"; +import { DunningManagementQueries } from "./dunningManagement.queries"; +import { DunningManagementAcl } from "./dunningManagement.acl"; + +export namespace DunningManagementConfigs { +export const dunningsConfig = { + meta: { + title: "Dunnings", + }, + readAll: { + acl: DunningManagementAcl.canUseListDunnings, + schema: DunningManagementModels.DunningResponseDtoSchema, + paginated: DunningManagementQueries.useListDunnings, + infinite: DunningManagementQueries.useListDunningsInfinite, + filters: { + schema: DunningManagementModels.DunningFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningManagementModels.DunningFilterDtoSchema, + options: { + inputs: { + status: true, + partnerId: true, + level: true, + outstandingAmountMin: true, + outstandingAmountMax: true, + createdFrom: true, + createdTo: true, + confirmedBy: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DunningManagementModels.DunningResponseDtoSchema, + options: { + columns: { + id: true, + partner: true, + level: true, + dunningLevelId: true, + status: true, + invoiceCount: true, + outstandingAmount: true, + currencyNotation: true, + daysOverdue: true, + dunningFee: true, + createdAt: true, + statusChangedOn: true, + confirmedBy: true, + documentUrl: true, + }, + sortable: DunningManagementModels.ListDunningsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/dunningManagement/dunningManagement.models.ts b/test/generated/next/dunningManagement/dunningManagement.models.ts new file mode 100644 index 0000000..9ab47ce --- /dev/null +++ b/test/generated/next/dunningManagement/dunningManagement.models.ts @@ -0,0 +1,195 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningManagementModels { +/** + * DunningPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const DunningPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); +export type DunningPartnerDto = z.infer; + +/** + * DunningConfirmedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DunningConfirmedByDto = z.infer; + +/** + * DunningStatusSchema + * @type { enum } + */ +export const DunningStatusSchema = z.enum(["PREPARED", "ISSUED"]); +export type DunningStatus = z.infer; +export const DunningStatus = DunningStatusSchema.enum; + +/** + * DunningResponseDtoSchema + * @type { object } + * @property { string } id + * @property { DunningPartnerDto } partner + * @property { number } level + * @property { string } dunningLevelId + * @property { string } status + * @property { number } invoiceCount + * @property { number } outstandingAmount + * @property { string } currencyNotation + * @property { number } daysOverdue + * @property { number } dunningFee + * @property { string } createdAt + * @property { string } statusChangedOn + * @property { DunningConfirmedByDto } confirmedBy + * @property { string } documentUrl + */ +export const DunningResponseDtoSchema = z.object({ id: z.string(), partner: DunningPartnerDtoSchema, level: z.number(), dunningLevelId: z.string().nullish(), status: DunningStatusSchema, invoiceCount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number(), dunningFee: z.number(), createdAt: z.iso.datetime({ offset: true }), statusChangedOn: z.iso.datetime({ offset: true }), confirmedBy: DunningConfirmedByDtoSchema.nullish(), documentUrl: z.string().nullish() }).readonly(); +export type DunningResponseDto = z.infer; + +/** + * DunningFilterDtoSchema + * @type { object } + * @property { DunningStatus[] } status + * @property { string } partnerId Partner ID to filter by + * @property { array[] } level Dunning level(s) to filter by + * @property { number } outstandingAmountMin Minimum outstanding amount + * @property { number } outstandingAmountMax Maximum outstanding amount + * @property { string } createdFrom Created from (ISO date string) + * @property { string } createdTo Created to (ISO date string) + * @property { string } confirmedBy Confirmed by employee ID + */ +export const DunningFilterDtoSchema = z.object({ status: z.array(DunningStatusSchema).readonly(), partnerId: z.string().describe("Partner ID to filter by"), level: z.array(z.array(z.any()).readonly()).readonly().describe("Dunning level(s) to filter by"), outstandingAmountMin: z.number().describe("Minimum outstanding amount"), outstandingAmountMax: z.number().describe("Maximum outstanding amount"), createdFrom: z.iso.datetime({ offset: true }).describe("Created from (ISO date string)"), createdTo: z.iso.datetime({ offset: true }).describe("Created to (ISO date string)"), confirmedBy: z.string().describe("Confirmed by employee ID") }).readonly(); +export type DunningFilterDto = z.infer; + +/** + * DunningPdfConfigDTOSchema + * @type { object } + * @property { string } headerImageUrl + * @property { string } footerImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ +export const DunningPdfConfigDTOSchema = z.object({ headerImageUrl: z.string(), footerImageUrl: z.string(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); +export type DunningPdfConfigDTO = z.infer; + +/** + * DunningPdfBusinessPartnerDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } address + * @property { string } referenceNumber + */ +export const DunningPdfBusinessPartnerDTOSchema = z.object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }).readonly(); +export type DunningPdfBusinessPartnerDTO = z.infer; + +/** + * DunningPdfInvoiceDTOSchema + * @type { object } + * @property { string } invoiceNumber + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } daysOverdue + * @property { number } dunningLevel + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + * @property { number } interest + */ +export const DunningPdfInvoiceDTOSchema = z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }).nullish(), daysOverdue: z.number(), dunningLevel: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), interest: z.number().nullish() }).readonly(); +export type DunningPdfInvoiceDTO = z.infer; + +/** + * DunningPdfTotalDTOSchema + * @type { object } + * @property { number } invoicesSum + * @property { number } dunningFee + * @property { number } interest + * @property { string } currencyNotation + */ +export const DunningPdfTotalDTOSchema = z.object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }).readonly(); +export type DunningPdfTotalDTO = z.infer; + +/** + * DunningPdfBankAccountDTOSchema + * @type { object } + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + */ +export const DunningPdfBankAccountDTOSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }).readonly(); +export type DunningPdfBankAccountDTO = z.infer; + +/** + * DunningPdfUpcomingInvoiceDTOSchema + * @type { object } + * @property { string } number + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } dueDays + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + */ +export const DunningPdfUpcomingInvoiceDTOSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), dueDays: z.number().nullish(), invoiceAmount: z.number().nullish(), outstandingAmount: z.number().nullish(), currencyNotation: z.string().nullish() }).readonly(); +export type DunningPdfUpcomingInvoiceDTO = z.infer; + +/** + * DunningPdfPayloadDTOSchema + * @type { object } + * @property { string } dunningId + * @property { number } dunningLevel + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { DunningPdfBusinessPartnerDTO } businessPartner + * @property { DunningPdfInvoiceDTO[] } invoices + * @property { DunningPdfTotalDTO } total + * @property { DunningPdfBankAccountDTO } bankAccount + * @property { string } employeeName + * @property { DunningPdfConfigDTO } config + * @property { CommonModels.LanguageEnum } language + * @property { DunningPdfUpcomingInvoiceDTO[] } upcomingInvoices + */ +export const DunningPdfPayloadDTOSchema = z.object({ dunningId: z.string(), dunningLevel: z.number(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), businessPartner: DunningPdfBusinessPartnerDTOSchema, invoices: z.array(DunningPdfInvoiceDTOSchema).readonly(), total: DunningPdfTotalDTOSchema, bankAccount: DunningPdfBankAccountDTOSchema, employeeName: z.string().nullable(), config: DunningPdfConfigDTOSchema, language: CommonModels.LanguageEnumSchema.nullish(), upcomingInvoices: z.array(DunningPdfUpcomingInvoiceDTOSchema).readonly().nullish() }).readonly(); +export type DunningPdfPayloadDTO = z.infer; + +/** + * CreateDunningWithInvoicesRequestDTOSchema + * @type { object } + * @property { string[] } invoiceIds Array of outstanding invoice IDs to include in the dunning. Example: `123e4567-e89b-12d3-a456-426614174000,123e4567-e89b-12d3-a456-426614174001` + * @property { string } dunningLevelId The ID of the dunning level to use for this dunning. Example: `123e4567-e89b-12d3-a456-426614174002` + * @property { number } dunningFee Optional dunning fee to use. If not provided, the fee from the dunning level will be used. Minimum: `0`. Example: `25.5` + * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` + * @property { boolean } includeUpcomingInvoices + */ +export const CreateDunningWithInvoicesRequestDTOSchema = z.object({ invoiceIds: z.array(z.string()).readonly().describe("Array of outstanding invoice IDs to include in the dunning"), dunningLevelId: z.string().describe("The ID of the dunning level to use for this dunning"), dunningFee: z.number().gte(0).describe("Optional dunning fee to use. If not provided, the fee from the dunning level will be used").nullish(), interestRate: z.number().gte(0).lte(100).nullish(), includeUpcomingInvoices: z.boolean().nullish() }).readonly(); +export type CreateDunningWithInvoicesRequestDTO = z.infer; + +/** + * ListDunningsOrderParamEnumSchema + * @type { enum } + */ +export const ListDunningsOrderParamEnumSchema = z.enum(["createdAt", "level", "outstandingAmount", "statusChangedOn"]); +export type ListDunningsOrderParamEnum = z.infer; +export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; + +/** + * ListDunningsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningResponseDto[] } items + */ +export const ListDunningsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningResponseDtoSchema).readonly() }).readonly().shape }); +export type ListDunningsResponse = z.infer; + +} diff --git a/test/generated/next/dunningManagement/dunningManagement.queries.ts b/test/generated/next/dunningManagement/dunningManagement.queries.ts new file mode 100644 index 0000000..db162c4 --- /dev/null +++ b/test/generated/next/dunningManagement/dunningManagement.queries.ts @@ -0,0 +1,175 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningManagementAcl } from "./dunningManagement.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningManagementModels } from "./dunningManagement.models"; +import { DunningManagementApi } from "./dunningManagement.api"; + +export namespace DunningManagementQueries { +export const moduleName = QueryModule.DunningManagement; + +export const keys = { + all: [moduleName] as const, + listDunnings: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", officeId, limit, order, filter, page, cursor] as const, + listDunningsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", "infinite", officeId, limit, order, filter, cursor] as const, + dataGenFake: () => [...keys.all, "/data-gen-fake", ] as const, + getDunningEml: (officeId: string, dunningId: string) => [...keys.all, "/offices/:officeId/dunnings/:dunningId/eml", officeId, dunningId] as const, +}; + +/** + * Query `useListDunnings` + * @summary List dunnings for an office + * @permission Requires `canUseListDunnings` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` + * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListDunnings = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); + return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListDunningsInfinite + * @summary List dunnings for an office + * @permission Requires `canUseListDunnings` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` + * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListDunningsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); + return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreateDunningWithInvoices` + * @summary Create a dunning with outstanding invoices + * @permission Requires `canUseCreateDunningWithInvoices` ability + * @param { string } mutation.partnerId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningManagementModels.CreateDunningWithInvoicesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateDunningWithInvoices = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ partnerId, officeId, data }) => { + checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId } )); + return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useDataGenFake` + * @summary Expose dunning PDF payload DTO for model generation + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useDataGenFake = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.dataGenFake(), + queryFn: () => + DunningManagementApi.dataGenFake(config), + ...options, + }); +}; + +/** + * Query `useGetDunningEml` - recommended when file should be cached + * @summary Get dunning as EML file with PDF attachment + * @permission Requires `canUseGetDunningEml` ability + * @param { string } object.officeId Path parameter + * @param { string } object.dunningId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetDunningEml = ({ officeId, dunningId }: { officeId: string, dunningId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDunningEml(officeId, dunningId), + queryFn: () => { + checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); + return DunningManagementApi.getDunningEml(officeId, dunningId, config) }, + ...options, + }); +}; + +/** + * Mutation `useGetDunningEmlMutation` - recommended when file should not be cached + * @summary Get dunning as EML file with PDF attachment + * @permission Requires `canUseGetDunningEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.dunningId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetDunningEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, dunningId }) => { + checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); + return DunningManagementApi.getDunningEml(officeId, dunningId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, dunningId } = variables; + const updateKeys = [keys.getDunningEml(officeId, dunningId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts new file mode 100644 index 0000000..4294b32 --- /dev/null +++ b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningPartnerOutstandingInvoicesAcl { +/** + * Use for `useListPartnerOutstandingInvoiceSummaries` query ability. For global ability, omit the object parameter. + * @description List office outstanding invoice summaries per partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoiceSummaries` query + */ +export const canUseListPartnerOutstandingInvoiceSummaries = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useListPartnerOutstandingInvoices` query ability. For global ability, omit the object parameter. + * @description List partner outstanding invoices + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoices` query + */ +export const canUseListPartnerOutstandingInvoices = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useListRecommendedDunningLevels` mutation ability. For global ability, omit the object parameter. + * @description List recommended dunning levels for a partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRecommendedDunningLevels` mutation + */ +export const canUseListRecommendedDunningLevels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +} diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts new file mode 100644 index 0000000..1b8014c --- /dev/null +++ b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts @@ -0,0 +1,48 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; + +export namespace DunningPartnerOutstandingInvoicesApi { +export const listPartnerOutstandingInvoiceSummaries = (officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, + `/offices/${officeId}/partner-outstanding-invoices`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listPartnerOutstandingInvoices = (partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, + `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listRecommendedDunningLevels = (partnerId: string, officeId: string, data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, + `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, + ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts new file mode 100644 index 0000000..3fc3451 --- /dev/null +++ b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts @@ -0,0 +1,97 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; +import { DunningPartnerOutstandingInvoicesQueries } from "./dunningPartnerOutstandingInvoices.queries"; +import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; + +export namespace DunningPartnerOutstandingInvoicesConfigs { +export const partnerOutstandingInvoicesConfig = { + meta: { + title: "Partner Outstanding Invoices", + }, + readAll: { + acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries, + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, + paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummaries, + infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummariesInfinite, + filters: { + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, + options: { + inputs: { + search: true, + daysOverdueMin: true, + partnerId: true, + outstandingAmountMin: true, + currency: true, + dunningSystemId: true, + lastDunningDate: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, + options: { + columns: { + partnerId: true, + partnerName: true, + partnerCountry: true, + dunningSystemId: true, + dunningSystemName: true, + invoiceCount: true, + daysOverdue: true, + outstandingAmount: true, + currencyNotation: true, + lastDunningDate: true, + }, + sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, + }, +}), + }, +}; + +export const outstandingInvoicesConfig = { + meta: { + title: "Outstanding Invoices", + }, + readAll: { + acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices, + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, + paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoices, + infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoicesInfinite, + filters: { + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, + options: { + inputs: { + partnerId: true, + currency: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, + options: { + columns: { + invoiceId: true, + invoiceNumber: true, + invoiceDate: true, + invoiceAmount: true, + owedAmount: true, + currencyNotation: true, + daysOverdue: true, + dueDate: true, + invoiceInReview: true, + dunningBlock: true, + }, + sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts new file mode 100644 index 0000000..7adfe1f --- /dev/null +++ b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts @@ -0,0 +1,129 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningPartnerOutstandingInvoicesModels { +/** + * PartnerOutstandingInvoiceSummaryFilterDtoSchema + * @type { object } + * @property { string } search Search string (partner name) + * @property { number } daysOverdueMin Minimum days overdue + * @property { string } partnerId Partner ID + * @property { number } outstandingAmountMin Minimum outstanding amount + * @property { string } currency Currency + * @property { string } dunningSystemId Dunning system ID + * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range + */ +export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z.object({ search: z.string().describe("Search string (partner name)"), daysOverdueMin: z.number().describe("Minimum days overdue"), partnerId: z.string().describe("Partner ID"), outstandingAmountMin: z.number().describe("Minimum outstanding amount"), currency: z.string().describe("Currency"), dunningSystemId: z.string().describe("Dunning system ID"), lastDunningDate: CommonModels.DateRangeDtoSchema.describe("Last dunning date range") }).readonly(); +export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer; + +/** + * PartnerOutstandingInvoiceSummaryResponseDtoSchema + * @type { object } + * @property { string } partnerId Business partner ID + * @property { string } partnerName Business partner name + * @property { string } partnerCountry Business partner country + * @property { string } dunningSystemId Dunning system ID + * @property { string } dunningSystemName Dunning system name + * @property { number } invoiceCount Number of outstanding invoices + * @property { number } daysOverdue Maximum days overdue across all partner invoices + * @property { number } outstandingAmount Total outstanding amount + * @property { string } currencyNotation Currency of partner invoices + * @property { string } lastDunningDate Date of the most recent issued dunning document + */ +export const PartnerOutstandingInvoiceSummaryResponseDtoSchema = z.object({ partnerId: z.string().describe("Business partner ID"), partnerName: z.string().describe("Business partner name"), partnerCountry: z.string().describe("Business partner country").nullish(), dunningSystemId: z.string().describe("Dunning system ID"), dunningSystemName: z.string().describe("Dunning system name"), invoiceCount: z.number().describe("Number of outstanding invoices"), daysOverdue: z.number().describe("Maximum days overdue across all partner invoices").nullish(), outstandingAmount: z.number().describe("Total outstanding amount"), currencyNotation: z.string().describe("Currency of partner invoices"), lastDunningDate: z.iso.datetime({ offset: true }).describe("Date of the most recent issued dunning document").nullish() }).readonly(); +export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer; + +/** + * PartnerOutstandingInvoiceResponseDtoSchema + * @type { object } + * @property { string } invoiceId Invoice ID + * @property { string } invoiceNumber Invoice number + * @property { string } invoiceDate Invoice date + * @property { number } invoiceAmount Invoice amount + * @property { number } owedAmount Owed amount + * @property { string } currencyNotation Currency notation + * @property { number } daysOverdue Days overdue + * @property { string } dueDate Due date + * @property { boolean } invoiceInReview + * @property { boolean } dunningBlock + */ +export const PartnerOutstandingInvoiceResponseDtoSchema = z.object({ invoiceId: z.string().describe("Invoice ID"), invoiceNumber: z.string().describe("Invoice number").nullish(), invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date").nullish(), invoiceAmount: z.number().describe("Invoice amount"), owedAmount: z.number().describe("Owed amount"), currencyNotation: z.string().describe("Currency notation"), daysOverdue: z.number().describe("Days overdue").nullish(), dueDate: z.iso.datetime({ offset: true }).describe("Due date").nullish(), invoiceInReview: z.boolean().nullish(), dunningBlock: z.boolean().nullish() }).readonly(); +export type PartnerOutstandingInvoiceResponseDto = z.infer; + +/** + * PartnerOutstandingInvoiceFilterDtoSchema + * @type { object } + * @property { string } partnerId Partner ID to filter by + * @property { string } currency Invoice currency notation to filter by + */ +export const PartnerOutstandingInvoiceFilterDtoSchema = z.object({ partnerId: z.string().describe("Partner ID to filter by"), currency: z.string().describe("Invoice currency notation to filter by") }).readonly(); +export type PartnerOutstandingInvoiceFilterDto = z.infer; + +/** + * RecommendedDunningLevelsRequestDtoSchema + * @type { object } + * @property { string[] } invoiceIds Invoice IDs used to calculate the recommended dunning level. Min Items: `1`. Example: `123e4567-e89b-12d3-a456-426614174000` + */ +export const RecommendedDunningLevelsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).readonly().min(1).describe("Invoice IDs used to calculate the recommended dunning level") }).readonly(); +export type RecommendedDunningLevelsRequestDto = z.infer; + +/** + * RecommendedLabelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { boolean } isRecommended + */ +export const RecommendedLabelResponseDtoSchema = z.object({ id: z.string(), label: z.string(), isRecommended: z.boolean() }).readonly(); +export type RecommendedLabelResponseDto = z.infer; + +/** + * ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema + * @type { enum } + */ +export const ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema = z.enum(["outstandingAmount", "daysOverdue", "lastDunningDate", "invoiceCount", "partnerCountry", "partnerName", "dunningSystemName"]); +export type ListPartnerOutstandingInvoiceSummariesOrderParamEnum = z.infer; +export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema.enum; + +/** + * ListPartnerOutstandingInvoiceSummariesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items + */ +export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).readonly() }).readonly().shape }); +export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer; + +/** + * ListPartnerOutstandingInvoicesOrderParamEnumSchema + * @type { enum } + */ +export const ListPartnerOutstandingInvoicesOrderParamEnumSchema = z.enum(["dueDate", "invoiceDate", "owedAmount"]); +export type ListPartnerOutstandingInvoicesOrderParamEnum = z.infer; +export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandingInvoicesOrderParamEnumSchema.enum; + +/** + * ListPartnerOutstandingInvoicesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerOutstandingInvoiceResponseDto[] } items + */ +export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).readonly() }).readonly().shape }); +export type ListPartnerOutstandingInvoicesResponse = z.infer; + +/** + * ListRecommendedDunningLevelsResponseSchema + * @type { array } + */ +export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema).readonly(); +export type ListRecommendedDunningLevelsResponse = z.infer; + +} diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts new file mode 100644 index 0000000..4a777fa --- /dev/null +++ b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts @@ -0,0 +1,166 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; +import { DunningPartnerOutstandingInvoicesApi } from "./dunningPartnerOutstandingInvoices.api"; + +export namespace DunningPartnerOutstandingInvoicesQueries { +export const moduleName = QueryModule.DunningPartnerOutstandingInvoices; + +export const keys = { + all: [moduleName] as const, + listPartnerOutstandingInvoiceSummaries: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", officeId, limit, order, filter, page, cursor] as const, + listPartnerOutstandingInvoiceSummariesInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", "infinite", officeId, limit, order, filter, cursor] as const, + listPartnerOutstandingInvoices: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", partnerId, officeId, limit, order, filter, page, cursor] as const, + listPartnerOutstandingInvoicesInfinite: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", "infinite", partnerId, officeId, limit, order, filter, cursor] as const, +}; + +/** + * Query `useListPartnerOutstandingInvoiceSummaries` + * @summary List office outstanding invoice summaries per partner + * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoiceSummaries = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListPartnerOutstandingInvoiceSummariesInfinite + * @summary List office outstanding invoice summaries per partner + * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoiceSummariesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useListPartnerOutstandingInvoices` + * @summary List outstanding invoices for a specific partner + * @permission Requires `canUseListPartnerOutstandingInvoices` ability + * @param { string } object.partnerId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoices = ({ partnerId, officeId, limit, order, filter, page, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListPartnerOutstandingInvoicesInfinite + * @summary List outstanding invoices for a specific partner + * @permission Requires `canUseListPartnerOutstandingInvoices` ability + * @param { string } object.partnerId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoicesInfinite = ({ partnerId, officeId, limit, order, filter, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useListRecommendedDunningLevels` + * @summary List recommended dunning levels for a partner + * @permission Requires `canUseListRecommendedDunningLevels` ability + * @param { string } mutation.partnerId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useListRecommendedDunningLevels = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ partnerId, officeId, data }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/dunningSystems/dunningSystems.acl.ts b/test/generated/next/dunningSystems/dunningSystems.acl.ts new file mode 100644 index 0000000..14c8307 --- /dev/null +++ b/test/generated/next/dunningSystems/dunningSystems.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace DunningSystemsAcl { +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List dunning system labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List dunning systems + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Create", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get dunning system by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Update", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +} diff --git a/test/generated/next/dunningSystems/dunningSystems.api.ts b/test/generated/next/dunningSystems/dunningSystems.api.ts new file mode 100644 index 0000000..2b609b0 --- /dev/null +++ b/test/generated/next/dunningSystems/dunningSystems.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { DunningSystemsModels } from "./dunningSystems.models"; + +export namespace DunningSystemsApi { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, + `/offices/${officeId}/dunning-systems/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, + `/offices/${officeId}/dunning-systems`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: DunningSystemsModels.CreateDunningSystemRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems`, + ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: DunningSystemsModels.UpdateDunningSystemRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}`, + ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/dunningSystems/dunningSystems.configs.ts b/test/generated/next/dunningSystems/dunningSystems.configs.ts new file mode 100644 index 0000000..9040265 --- /dev/null +++ b/test/generated/next/dunningSystems/dunningSystems.configs.ts @@ -0,0 +1,120 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { DunningSystemsModels } from "./dunningSystems.models"; +import { CommonModels } from "@/data/common/common.models"; +import { DunningSystemsQueries } from "./dunningSystems.queries"; +import { DunningSystemsAcl } from "./dunningSystems.acl"; + +export namespace DunningSystemsConfigs { +export const dunningSystemsConfig = { + meta: { + title: "Dunning Systems", + }, + readAll: { + acl: DunningSystemsAcl.canUsePaginate, + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + paginated: DunningSystemsQueries.usePaginate, + infinite: DunningSystemsQueries.usePaginateInfinite, + filters: { + schema: DunningSystemsModels.DunningSystemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningSystemsModels.DunningSystemFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + isDefault: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + isDefault: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: DunningSystemsAcl.canUseFindById, + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + query: DunningSystemsQueries.useFindById, + }, + create: { + acl: DunningSystemsAcl.canUseCreate, + schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, + mutation: DunningSystemsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, + options: { + inputs: { + name: true, + isDefault: true, + }, + }, +}) + }, + update: { + acl: DunningSystemsAcl.canUseUpdate, + schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, + mutation: DunningSystemsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, + options: { + inputs: { + name: true, + isDefault: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: DunningSystemsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: DunningSystemsQueries.usePaginateLabels, + infinite: DunningSystemsQueries.usePaginateLabelsInfinite, + filters: { + schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/dunningSystems/dunningSystems.models.ts b/test/generated/next/dunningSystems/dunningSystems.models.ts new file mode 100644 index 0000000..df46055 --- /dev/null +++ b/test/generated/next/dunningSystems/dunningSystems.models.ts @@ -0,0 +1,111 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace DunningSystemsModels { +/** + * DunningSystemEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type DunningSystemEmployeeDTO = z.infer; + +/** + * DunningSystemResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name + * @property { boolean } isDefault + * @property { boolean } archived + * @property { string } archivedAt + * @property { string } createdById + * @property { DunningSystemEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DunningSystemEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const DunningSystemResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isDefault: z.boolean(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: DunningSystemEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningSystemEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type DunningSystemResponseDTO = z.infer; + +/** + * DunningSystemLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DunningSystemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type DunningSystemLabelFilterDto = z.infer; + +/** + * DunningSystemFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + * @property { boolean } isDefault + */ +export const DunningSystemFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean(), isDefault: z.boolean() }).readonly(); +export type DunningSystemFilterDto = z.infer; + +/** + * CreateDunningSystemRequestDTOSchema + * @type { object } + * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` + * @property { boolean } isDefault Is default dunning system + */ +export const CreateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100).describe("Dunning system name"), isDefault: z.boolean().describe("Is default dunning system").nullish() }).readonly(); +export type CreateDunningSystemRequestDTO = z.infer; + +/** + * UpdateDunningSystemRequestDTOSchema + * @type { object } + * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` + * @property { boolean } isDefault Is default dunning system + */ +export const UpdateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100).describe("Dunning system name"), isDefault: z.boolean().describe("Is default dunning system") }).readonly(); +export type UpdateDunningSystemRequestDTO = z.infer; + +/** + * DunningSystemsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DunningSystemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); +export type DunningSystemsPaginateLabelsOrderParamEnum = z.infer; +export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * DunningSystemsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DunningSystemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type DunningSystemsPaginateLabelsResponse = z.infer; + +/** + * DunningSystemsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const DunningSystemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); +export type DunningSystemsPaginateOrderParamEnum = z.infer; +export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderParamEnumSchema.enum; + +/** + * DunningSystemsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningSystemResponseDTO[] } items + */ +export const DunningSystemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningSystemResponseDTOSchema).readonly() }).readonly().shape }); +export type DunningSystemsPaginateResponse = z.infer; + +} diff --git a/test/generated/next/dunningSystems/dunningSystems.queries.ts b/test/generated/next/dunningSystems/dunningSystems.queries.ts new file mode 100644 index 0000000..a25f0a7 --- /dev/null +++ b/test/generated/next/dunningSystems/dunningSystems.queries.ts @@ -0,0 +1,274 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { DunningSystemsAcl } from "./dunningSystems.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { DunningSystemsModels } from "./dunningSystems.models"; +import { DunningSystemsApi } from "./dunningSystems.api"; + +export namespace DunningSystemsQueries { +export const moduleName = QueryModule.DunningSystems; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-systems/:id", id, officeId] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate dunning system labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate dunning system labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary List dunning systems + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); + return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary List dunning systems + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); + return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create dunning system + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningSystemsModels.CreateDunningSystemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningSystemsAcl.canUseCreate({ officeId } )); + return DunningSystemsApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get dunning system by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUseFindById({ officeId } )); + return DunningSystemsApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update dunning system + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningSystemsModels.UpdateDunningSystemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(DunningSystemsAcl.canUseUpdate({ officeId } )); + return DunningSystemsApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive dunning system + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningSystemsAcl.canUseArchive({ officeId } )); + return DunningSystemsApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive dunning system + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId } )); + return DunningSystemsApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/employee/employee.acl.ts b/test/generated/next/employee/employee.acl.ts new file mode 100644 index 0000000..e796e7e --- /dev/null +++ b/test/generated/next/employee/employee.acl.ts @@ -0,0 +1,153 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmployeeAcl { +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List employees + * @param { string } object.officeId officeId from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId?: string, } +) => [ + "Read", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new employee + * @param { string } object.officeId officeId from mutation data + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId?: string, } +) => [ + "Create", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; + +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Employee" +] as AbilityTuple<"Read", "Employee">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Employee" +] as AbilityTuple<"Read", "Employee">; + +/** + * Use for `useResendOnboardingWithOffice` mutation ability. For global ability, omit the object parameter. + * @description Resend employee onboarding email + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useResendOnboardingWithOffice` mutation + */ +export const canUseResendOnboardingWithOffice = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; + +/** + * Use for `useGet` query ability. + * @description Read Office Employee + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( +) => [ + "Read", + "Employee" +] as AbilityTuple<"Read", "Employee">; + +/** + * Use for `useUpdate` mutation ability. + * @description Update Office Employee + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Employee" +] as AbilityTuple<"Update", "Employee">; + +/** + * Use for `useGetWithOffice` query ability. For global ability, omit the object parameter. + * @description Read Office Employee + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetWithOffice` query + */ +export const canUseGetWithOffice = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; + +/** + * Use for `useUpdateWithOffice` mutation ability. For global ability, omit the object parameter. + * @description Update Office Employee + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateWithOffice` mutation + */ +export const canUseUpdateWithOffice = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Update", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; + +/** + * Use for `useListRoles` query ability. + * @description List employee (global) roles + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query + */ +export const canUseListRoles = ( +) => [ + "ListRoles", + "Employee" +] as AbilityTuple<"ListRoles", "Employee">; + +/** + * Use for `useUpdateRoles` mutation ability. + * @description Update employee (global) roles + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation + */ +export const canUseUpdateRoles = ( +) => [ + "UpdateRoles", + "Employee" +] as AbilityTuple<"UpdateRoles", "Employee">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Employee" +] as AbilityTuple<"Archive", "Employee">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Unarchive", + "Employee" +] as AbilityTuple<"Unarchive", "Employee">; + +} diff --git a/test/generated/next/employee/employee.api.ts b/test/generated/next/employee/employee.api.ts new file mode 100644 index 0000000..e7cb049 --- /dev/null +++ b/test/generated/next/employee/employee.api.ts @@ -0,0 +1,157 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeModels } from "./employee.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeApi { +export const paginate = (limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeePaginateResponseSchema }, + `/employees`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: EmployeeModels.EmployeeCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees`, + ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), + config + ) +}; +export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/one-step`, + ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), + config + ) +}; +export const findAll = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, + `/employees/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, + `/employees/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const resendOnboarding = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/employees/${employeeId}/resend-onboarding`, + undefined, + config + ) +}; +export const resendOnboardingWithOffice = (officeId: string, employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, + undefined, + config + ) +}; +export const get = (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}`, + { + ...config, + params: { + populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + }, + } + ) +}; +export const update = (employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}`, + ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), + config + ) +}; +export const getWithOffice = (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/offices/${officeId}/employees/${employeeId}`, + { + ...config, + params: { + populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + }, + } + ) +}; +export const updateWithOffice = (officeId: string, employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/offices/${officeId}/employees/${employeeId}`, + ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), + config + ) +}; +export const listRoles = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, + `/employees/${employeeId}/roles`, + config + ) +}; +export const updateRoles = (employeeId: string, data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, + `/employees/${employeeId}/roles`, + ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), + config + ) +}; +export const archive = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}/archive`, + undefined, + config + ) +}; +export const unarchive = (employeeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/employee/employee.configs.ts b/test/generated/next/employee/employee.configs.ts new file mode 100644 index 0000000..1288db2 --- /dev/null +++ b/test/generated/next/employee/employee.configs.ts @@ -0,0 +1,135 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeeModels } from "./employee.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeQueries } from "./employee.queries"; +import { EmployeeAcl } from "./employee.acl"; + +export namespace EmployeeConfigs { +export const employeesConfig = { + meta: { + title: "Employees", + }, + readAll: { + acl: EmployeeAcl.canUsePaginate, + schema: EmployeeModels.EmployeeResponseSchema, + paginated: EmployeeQueries.usePaginate, + infinite: EmployeeQueries.usePaginateInfinite, + filters: { + schema: EmployeeModels.EmployeeFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeFilterDtoSchema, + options: { + inputs: { + office: true, + roles: true, + primaryOfficeId: true, + firstName: true, + lastName: true, + email: true, + ids: true, + archived: true, + search: true, + officeRole: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: EmployeeModels.EmployeeResponseSchema, + options: { + columns: { + id: true, + email: true, + firstName: true, + lastName: true, + locale: true, + phone: true, + archived: true, + primaryOfficeId: true, + primaryOffice: true, + employments: true, + roles: true, + createdAt: true, + updatedAt: true, + }, + sortable: EmployeeModels.EmployeePaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: EmployeeAcl.canUseGet, + schema: EmployeeModels.EmployeeResponseSchema, + query: EmployeeQueries.useGet, + }, + create: { + acl: EmployeeAcl.canUseCreate, + schema: EmployeeModels.EmployeeCreateRequestSchema, + mutation: EmployeeQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeCreateRequestSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + locale: true, + primaryOfficeId: true, + phone: true, + }, + }, +}) + }, + update: { + acl: EmployeeAcl.canUseUpdate, + schema: EmployeeModels.EmployeeUpdateRequestSchema, + mutation: EmployeeQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeUpdateRequestSchema, + options: { + inputs: { + firstName: true, + lastName: true, + phone: true, + locale: true, + primaryOfficeId: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: EmployeeAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: EmployeeQueries.usePaginateLabels, + infinite: EmployeeQueries.usePaginateLabelsInfinite, + filters: { + schema: EmployeeModels.EmployeeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/employee/employee.models.ts b/test/generated/next/employee/employee.models.ts new file mode 100644 index 0000000..f63c9a4 --- /dev/null +++ b/test/generated/next/employee/employee.models.ts @@ -0,0 +1,225 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeModels { +/** + * EmployeeResponseSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { CommonModels.LocaleEnum } locale + * @property { string } phone Phone number + * @property { boolean } archived Archived + * @property { string } primaryOfficeId Primary office id + * @property { CommonModels.EmployeeOfficeResponse } primaryOffice Primary office + * @property { CommonModels.EmploymentResponse[] } employments Employments + * @property { CommonModels.EmployeeRoleResponse[] } roles Global Roles + * @property { string } createdAt + * @property { string } updatedAt + */ +export const EmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), locale: CommonModels.LocaleEnumSchema.nullish(), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), primaryOfficeId: z.string().describe("Primary office id").nullish(), primaryOffice: CommonModels.EmployeeOfficeResponseSchema.describe("Primary office").nullish(), employments: z.array(CommonModels.EmploymentResponseSchema).readonly().describe("Employments").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type EmployeeResponse = z.infer; + +/** + * EmployeeCreateRequestSchema + * @type { object } + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { CommonModels.LocaleEnum } locale + * @property { string } primaryOfficeId Primary office ID + * @property { string } phone Phone number + */ +export const EmployeeCreateRequestSchema = z.object({ firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.email().describe("Email"), locale: CommonModels.LocaleEnumSchema.nullish(), primaryOfficeId: z.string().describe("Primary office ID").nullish(), phone: z.string().describe("Phone number").nullish() }).readonly(); +export type EmployeeCreateRequest = z.infer; + +/** + * EmployeeOneStepCreateEmploymentRequestSchema + * @type { object } + * @property { string } officeId + * @property { string[] } roleIds Array of office role IDs + */ +export const EmployeeOneStepCreateEmploymentRequestSchema = z.object({ officeId: z.string(), roleIds: z.array(z.string()).readonly().describe("Array of office role IDs").nullish() }).readonly(); +export type EmployeeOneStepCreateEmploymentRequest = z.infer; + +/** + * EmployeeOneStepCreateRequestSchema + * @type { object } + * @property { CommonModels.LocaleEnum } locale + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { string } phone Phone number + * @property { string[] } roleIds Array of global role IDs + * @property { string } primaryOfficeId Primary office ID + * @property { EmployeeOneStepCreateEmploymentRequest[] } employments Employments. Min Items: `1` + */ +export const EmployeeOneStepCreateRequestSchema = z.object({ locale: CommonModels.LocaleEnumSchema.nullish(), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.email().describe("Email"), phone: z.string().describe("Phone number").nullish(), roleIds: z.array(z.string()).readonly().describe("Array of global role IDs").nullish(), primaryOfficeId: z.string().describe("Primary office ID").nullish(), employments: z.array(EmployeeOneStepCreateEmploymentRequestSchema).readonly().min(1).describe("Employments") }).readonly(); +export type EmployeeOneStepCreateRequest = z.infer; + +/** + * EmployeeUpdateRequestSchema + * @type { object } + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number of the employee + * @property { CommonModels.LocaleEnum } locale + * @property { string } primaryOfficeId + */ +export const EmployeeUpdateRequestSchema = z.object({ firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number of the employee"), locale: CommonModels.LocaleEnumSchema, primaryOfficeId: z.string() }).readonly(); +export type EmployeeUpdateRequest = z.infer; + +/** + * EmployeeFilterDtoSchema + * @type { object } + * @property { string } office Office ID (single select, offices the user has access to) + * @property { string[] } roles Role IDs (multiselect) + * @property { string } primaryOfficeId Primary office id + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { string[] } ids Ids + * @property { boolean } archived Archived + * set to true to only return archived employees + * does not return archived employees by default. Default: `false` + * @property { string } search Free text search multiple fields + * @property { string } officeRole Office role + */ +export const EmployeeFilterDtoSchema = z.object({ office: z.string().describe("Office ID (single select, offices the user has access to)"), roles: z.array(z.string()).readonly().describe("Role IDs (multiselect)"), primaryOfficeId: z.string().describe("Primary office id"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.string().describe("Email"), ids: z.array(z.string()).readonly().describe("Ids"), archived: z.boolean().describe("Archived\n set to true to only return archived employees\n does not return archived employees by default").default(false), search: z.string().describe("Free text search multiple fields"), officeRole: z.string().describe("Office role") }).readonly(); +export type EmployeeFilterDto = z.infer; + +/** + * EmployeeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type EmployeeLabelFilterDto = z.infer; + +/** + * EmployeeRoleMemberResponseSchema + * @type { object } + * @property { string } roleId + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string[] } permissions Permissions associated with the role + */ +export const EmployeeRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export type EmployeeRoleMemberResponse = z.infer; + +/** + * EmployeeRoleMembershipsUpdateRequestSchema + * @type { object } + * @property { string[] } roleIds Array of role IDs + */ +export const EmployeeRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }).readonly(); +export type EmployeeRoleMembershipsUpdateRequest = z.infer; + +/** + * EmployeePaginateOrderParamEnumSchema + * @type { enum } + */ +export const EmployeePaginateOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); +export type EmployeePaginateOrderParamEnum = z.infer; +export const EmployeePaginateOrderParamEnum = EmployeePaginateOrderParamEnumSchema.enum; + +/** + * EmployeePopulateFieldSchema + * @type { enum } + */ +export const EmployeePopulateFieldSchema = z.enum(["employments", "primaryOffice", "roles", "employments.roles", "employments.office"]); +export type EmployeePopulateField = z.infer; +export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; + +/** + * EmployeePaginatePopulateParamSchema + * @type { array } + */ +export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); +export type EmployeePaginatePopulateParam = z.infer; + +/** + * EmployeePaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeResponse[] } items + */ +export const EmployeePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeResponseSchema).readonly() }).readonly().shape }); +export type EmployeePaginateResponse = z.infer; + +/** + * EmployeeFindAllResponseSchema + * @type { array } + */ +export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type EmployeeFindAllResponse = z.infer; + +/** + * EmployeePaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const EmployeePaginateLabelsOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); +export type EmployeePaginateLabelsOrderParamEnum = z.infer; +export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderParamEnumSchema.enum; + +/** + * EmployeePaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const EmployeePaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type EmployeePaginateLabelsResponse = z.infer; + +/** + * EmployeeGetPopulateParamSchema + * @type { array } + */ +export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); +export type EmployeeGetPopulateParam = z.infer; + +/** + * GetWithOfficePopulateParamSchema + * @type { array } + */ +export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); +export type GetWithOfficePopulateParam = z.infer; + +/** + * EmployeeListRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleMemberResponse[] } items + */ +export const EmployeeListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape }); +export type EmployeeListRolesResponse = z.infer; + +/** + * EmployeeUpdateRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleMemberResponse[] } items + */ +export const EmployeeUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape }); +export type EmployeeUpdateRolesResponse = z.infer; + +} diff --git a/test/generated/next/employee/employee.queries.ts b/test/generated/next/employee/employee.queries.ts new file mode 100644 index 0000000..8881af1 --- /dev/null +++ b/test/generated/next/employee/employee.queries.ts @@ -0,0 +1,470 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeeAcl } from "./employee.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeModels } from "./employee.models"; +import { EmployeeApi } from "./employee.api"; + +export namespace EmployeeQueries { +export const moduleName = QueryModule.Employee; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees", limit, order, populate, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string) => [...keys.all, "/employees", "infinite", limit, order, populate, filter, cursor] as const, + findAll: (search?: string) => [...keys.all, "/employees/labels", search] as const, + paginateLabels: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string) => [...keys.all, "/employees/labels/paginate", "infinite", limit, order, filter, cursor] as const, + get: (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam) => [...keys.all, "/employees/:employeeId", employeeId, populate] as const, + getWithOffice: (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam) => [...keys.all, "/offices/:officeId/employees/:employeeId", officeId, employeeId, populate] as const, + listRoles: (employeeId: string) => [...keys.all, "/employees/:employeeId/roles", employeeId] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Employees + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter + * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, populate, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeAcl.canUsePaginate()); + return EmployeeApi.paginate(limit, order, populate, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Employees + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter + * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeAcl.canUsePaginate()); + return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Employee + * @permission Requires `canUseCreate` ability + * @param { EmployeeModels.EmployeeCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmployeeAcl.canUseCreate()); + return EmployeeApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useSingeStepCreate` + * @summary Create Employee in a single step + * - requires Employee:Create for creating a global employee + * - requires Employee:Create{officeId} for creating an office employee (first office is primary) + * - requires Employment:Create{officeId} for creating office employments + * - requires Employee:UpdateRoles for setting global roles + * - requires Employee:UpdateRoles{officeId} for setting office roles + * @param { EmployeeModels.EmployeeOneStepCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useSingeStepCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + EmployeeApi.singeStepCreate(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindAll` + * @summary List all employees with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search), + queryFn: () => { + checkAcl(EmployeeAcl.canUseFindAll()); + return EmployeeApi.findAll(search, config) }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate employees with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeAcl.canUsePaginateLabels()); + return EmployeeApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate employees with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeAcl.canUsePaginateLabels()); + return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useResendOnboarding` + * @summary Resend Employee Onboarding Email + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useResendOnboarding = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => + EmployeeApi.resendOnboarding(employeeId, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useResendOnboardingWithOffice` + * @permission Requires `canUseResendOnboardingWithOffice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useResendOnboardingWithOffice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employeeId }) => { + checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId } )); + return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGet` + * @summary Get Employee + * - allow global admins and office admins of primary office + * @permission Requires `canUseGet` ability + * @param { string } object.employeeId Path parameter + * @param { EmployeeModels.EmployeeGetPopulateParam } object.populate Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ employeeId, populate }: { employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(employeeId, populate), + queryFn: () => { + checkAcl(EmployeeAcl.canUseGet()); + return EmployeeApi.get(employeeId, populate, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Employee + * - allow global admins and office admins of primary office + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdate()); + return EmployeeApi.update(employeeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetWithOffice` + * @permission Requires `canUseGetWithOffice` ability + * @param { string } object.officeId Path parameter + * @param { string } object.employeeId Path parameter + * @param { EmployeeModels.GetWithOfficePopulateParam } object.populate Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetWithOffice = ({ officeId, employeeId, populate }: { officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getWithOffice(officeId, employeeId, populate), + queryFn: () => { + checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId } )); + return EmployeeApi.getWithOffice(officeId, employeeId, populate, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateWithOffice` + * @permission Requires `canUseUpdateWithOffice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateWithOffice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId } )); + return EmployeeApi.updateWithOffice(officeId, employeeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, employeeId } = variables; + const updateKeys = [keys.get(employeeId), keys.getWithOffice(officeId, employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListRoles` + * @summary List Employee (global) Roles + * @permission Requires `canUseListRoles` ability + * @param { string } object.employeeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoles = ({ employeeId }: { employeeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoles(employeeId), + queryFn: () => { + checkAcl(EmployeeAcl.canUseListRoles()); + return EmployeeApi.listRoles(employeeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateRoles` + * @summary Update Employee (global) Roles + * @permission Requires `canUseUpdateRoles` ability + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeRoleMembershipsUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdateRoles()); + return EmployeeApi.updateRoles(employeeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Employee + * @permission Requires `canUseArchive` ability + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => { + checkAcl(EmployeeAcl.canUseArchive()); + return EmployeeApi.archive(employeeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Un-archive Employee + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => { + checkAcl(EmployeeAcl.canUseUnarchive()); + return EmployeeApi.unarchive(employeeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/employeeAccount/employeeAccount.api.ts b/test/generated/next/employeeAccount/employeeAccount.api.ts new file mode 100644 index 0000000..7eac01c --- /dev/null +++ b/test/generated/next/employeeAccount/employeeAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { EmployeeAccountModels } from "./employeeAccount.models"; + +export namespace EmployeeAccountApi { +export const get = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, + `/employees/account`, + config + ) +}; +} diff --git a/test/generated/next/employeeAccount/employeeAccount.models.ts b/test/generated/next/employeeAccount/employeeAccount.models.ts new file mode 100644 index 0000000..4b3cb64 --- /dev/null +++ b/test/generated/next/employeeAccount/employeeAccount.models.ts @@ -0,0 +1,53 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeAccountModels { +/** + * EmployeeAccountEmploymentDtoSchema + * @type { object } + * @property { string } officeId Office ID + * @property { string } officeName Office name + */ +export const EmployeeAccountEmploymentDtoSchema = z.object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }).readonly(); +export type EmployeeAccountEmploymentDto = z.infer; + +/** + * EmployeeAccountPrimaryOfficeDtoSchema + * @type { object } + * @property { string } officeId Office ID + * @property { string } officeName Office name + */ +export const EmployeeAccountPrimaryOfficeDtoSchema = z.object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }).readonly(); +export type EmployeeAccountPrimaryOfficeDto = z.infer; + +/** + * EmployeeAccountRoleDtoSchema + * @type { object } + * @property { string } name Role name + * @property { string[] } permissions Role permissions + * @property { string } officeId Office ID + */ +export const EmployeeAccountRoleDtoSchema = z.object({ name: z.string().describe("Role name"), permissions: z.array(z.string()).readonly().describe("Role permissions"), officeId: z.string().describe("Office ID").nullish() }).readonly(); +export type EmployeeAccountRoleDto = z.infer; + +/** + * EmployeeAccountDtoSchema + * @type { object } + * @property { string } defaultUrl + * @property { string } costCenter + * @property { CommonModels.LocaleEnum } locale + * @property { array[] } aclRules Can hold any type of value + * @property { object } settings Employee settings keyed by setting name + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { EmployeeAccountEmploymentDto[] } employments Employments + * @property { EmployeeAccountPrimaryOfficeDto } primaryOffice Primary office + * @property { EmployeeAccountRoleDto[] } roles Roles + */ +export const EmployeeAccountDtoSchema = z.object({ defaultUrl: z.string().nullish(), costCenter: z.string().nullish(), locale: CommonModels.LocaleEnumSchema.nullish(), aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), settings: z.union([z.object({}).catchall(z.any()).readonly(), z.array(z.object({}).catchall(z.any()).readonly()).readonly(), z.string(), z.array(z.string()).readonly(), z.array(z.number()).readonly()]).describe("Employee settings keyed by setting name"), id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), employments: z.array(EmployeeAccountEmploymentDtoSchema).readonly().describe("Employments"), primaryOffice: EmployeeAccountPrimaryOfficeDtoSchema.describe("Primary office"), roles: z.array(EmployeeAccountRoleDtoSchema).readonly().describe("Roles") }).readonly(); +export type EmployeeAccountDto = z.infer; + +} diff --git a/test/generated/next/employeeAccount/employeeAccount.queries.ts b/test/generated/next/employeeAccount/employeeAccount.queries.ts new file mode 100644 index 0000000..3d5b964 --- /dev/null +++ b/test/generated/next/employeeAccount/employeeAccount.queries.ts @@ -0,0 +1,32 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeAccountApi } from "./employeeAccount.api"; + +export namespace EmployeeAccountQueries { +export const moduleName = QueryModule.EmployeeAccount; + +export const keys = { + all: [moduleName] as const, + get: () => [...keys.all, "/employees/account", ] as const, +}; + +/** + * Query `useGet` + * @summary Get profile of logged-in user + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.get(), + queryFn: () => + EmployeeAccountApi.get(config), + ...options, + }); +}; + +} diff --git a/test/generated/next/employeePermissions/employeePermissions.acl.ts b/test/generated/next/employeePermissions/employeePermissions.acl.ts new file mode 100644 index 0000000..25d65ad --- /dev/null +++ b/test/generated/next/employeePermissions/employeePermissions.acl.ts @@ -0,0 +1,24 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace EmployeePermissionsAcl { +/** + * Use for `usePaginatePermissions` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query + */ +export const canUsePaginatePermissions = ( +) => [ + "Read", + "Permission" +] as AbilityTuple<"Read", "Permission">; + +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Permission" +] as AbilityTuple<"Read", "Permission">; + +} diff --git a/test/generated/next/employeePermissions/employeePermissions.api.ts b/test/generated/next/employeePermissions/employeePermissions.api.ts new file mode 100644 index 0000000..090ea01 --- /dev/null +++ b/test/generated/next/employeePermissions/employeePermissions.api.ts @@ -0,0 +1,36 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; + +export namespace EmployeePermissionsApi { +export const paginatePermissions = (limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, + `/employees/permissions`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findAll = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, + `/employees/permissions/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +} diff --git a/test/generated/next/employeePermissions/employeePermissions.configs.ts b/test/generated/next/employeePermissions/employeePermissions.configs.ts new file mode 100644 index 0000000..50dd5bf --- /dev/null +++ b/test/generated/next/employeePermissions/employeePermissions.configs.ts @@ -0,0 +1,45 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; +import { EmployeePermissionsQueries } from "./employeePermissions.queries"; +import { EmployeePermissionsAcl } from "./employeePermissions.acl"; + +export namespace EmployeePermissionsConfigs { +export const permissionsConfig = { + meta: { + title: "Permissions", + }, + readAll: { + acl: EmployeePermissionsAcl.canUsePaginatePermissions, + schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, + paginated: EmployeePermissionsQueries.usePaginatePermissions, + infinite: EmployeePermissionsQueries.usePaginatePermissionsInfinite, + filters: { + schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, + options: { + inputs: { + context: true, + ids: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, + options: { + columns: { + id: true, + label: true, + group: true, + description: true, + context: true, + }, + sortable: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/employeePermissions/employeePermissions.models.ts b/test/generated/next/employeePermissions/employeePermissions.models.ts new file mode 100644 index 0000000..efe698e --- /dev/null +++ b/test/generated/next/employeePermissions/employeePermissions.models.ts @@ -0,0 +1,54 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeePermissionsModels { +/** + * EmployeePermissionResponseSchema + * @type { object } + * @property { string } id Employee Permission unique identifier + * @property { string } label + * @property { string } group + * @property { string } description + * @property { string } context Scope where this rule is applied + */ +export const EmployeePermissionResponseSchema = z.object({ id: z.string().describe("Employee Permission unique identifier"), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied") }).readonly(); +export type EmployeePermissionResponse = z.infer; + +/** + * EmployeePermissionFilterDtoSchema + * @type { object } + * @property { string } context Role context + * @property { string[] } ids Ids + */ +export const EmployeePermissionFilterDtoSchema = z.object({ context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), ids: z.array(z.string()).readonly().describe("Ids") }).readonly(); +export type EmployeePermissionFilterDto = z.infer; + +/** + * EmployeePermissionsPaginatePermissionsOrderParamEnumSchema + * @type { enum } + */ +export const EmployeePermissionsPaginatePermissionsOrderParamEnumSchema = z.enum(["id"]); +export type EmployeePermissionsPaginatePermissionsOrderParamEnum = z.infer; +export const EmployeePermissionsPaginatePermissionsOrderParamEnum = EmployeePermissionsPaginatePermissionsOrderParamEnumSchema.enum; + +/** + * EmployeePermissionsPaginatePermissionsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeePermissionResponse[] } items + */ +export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeePermissionResponseSchema).readonly() }).readonly().shape }); +export type EmployeePermissionsPaginatePermissionsResponse = z.infer; + +/** + * EmployeePermissionsFindAllResponseSchema + * @type { array } + */ +export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type EmployeePermissionsFindAllResponse = z.infer; + +} diff --git a/test/generated/next/employeePermissions/employeePermissions.queries.ts b/test/generated/next/employeePermissions/employeePermissions.queries.ts new file mode 100644 index 0000000..715d356 --- /dev/null +++ b/test/generated/next/employeePermissions/employeePermissions.queries.ts @@ -0,0 +1,94 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeePermissionsAcl } from "./employeePermissions.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { EmployeePermissionsModels } from "./employeePermissions.models"; +import { EmployeePermissionsApi } from "./employeePermissions.api"; + +export namespace EmployeePermissionsQueries { +export const moduleName = QueryModule.EmployeePermissions; + +export const keys = { + all: [moduleName] as const, + paginatePermissions: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/permissions", limit, order, filter, page, cursor] as const, + paginatePermissionsInfinite: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string) => [...keys.all, "/employees/permissions", "infinite", limit, order, filter, cursor] as const, + findAll: (search?: string) => [...keys.all, "/employees/permissions/labels", search] as const, +}; + +/** + * Query `usePaginatePermissions` + * @permission Requires `canUsePaginatePermissions` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` + * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginatePermissions = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginatePermissionsInfinite + * @permission Requires `canUsePaginatePermissions` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` + * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginatePermissionsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindAll` + * @summary List all permissions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search), + queryFn: () => { + checkAcl(EmployeePermissionsAcl.canUseFindAll()); + return EmployeePermissionsApi.findAll(search, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/employeeProfile/employeeProfile.api.ts b/test/generated/next/employeeProfile/employeeProfile.api.ts new file mode 100644 index 0000000..8b3c712 --- /dev/null +++ b/test/generated/next/employeeProfile/employeeProfile.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeProfileModels } from "./employeeProfile.models"; + +export namespace EmployeeProfileApi { +export const getProfile = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, + `/employee-profile`, + config + ) +}; +export const updateProfile = (data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, + `/employee-profile`, + ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/employeeProfile/employeeProfile.models.ts b/test/generated/next/employeeProfile/employeeProfile.models.ts new file mode 100644 index 0000000..f67e1c2 --- /dev/null +++ b/test/generated/next/employeeProfile/employeeProfile.models.ts @@ -0,0 +1,33 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeProfileModels { +/** + * EmployeeProfileResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } firstName Employee first name + * @property { string } lastName Employee last name + * @property { string } email Employee email + * @property { string } phone Employee phone number + * @property { string } defaultUrl Employee default URL + * @property { CommonModels.LocaleEnum } locale Employee locale + */ +export const EmployeeProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string().describe("Employee first name"), lastName: z.string().describe("Employee last name"), email: z.string().describe("Employee email"), phone: z.string().describe("Employee phone number").nullish(), defaultUrl: z.string().describe("Employee default URL").nullish(), locale: CommonModels.LocaleEnumSchema.describe("Employee locale").nullish() }).readonly(); +export type EmployeeProfileResponseDTO = z.infer; + +/** + * UpdateEmployeeProfileRequestDTOSchema + * @type { object } + * @property { string } firstName Employee first name. Example: `John` + * @property { string } lastName Employee last name. Example: `Doe` + * @property { string } email Employee email address. Example: `john.doe@example.com` + * @property { string } phone Employee phone number. Example: `+1234567890` + * @property { string } defaultUrl Default URL for the employee profile. Example: `https://example.com` + * @property { string } costCenter Employee cost center + * @property { CommonModels.LocaleEnum } locale Employee locale preference. Example: `en-US` + */ +export const UpdateEmployeeProfileRequestDTOSchema = z.object({ firstName: z.string().describe("Employee first name"), lastName: z.string().describe("Employee last name"), email: z.email().describe("Employee email address"), phone: z.string().describe("Employee phone number"), defaultUrl: z.url().describe("Default URL for the employee profile"), costCenter: z.string().describe("Employee cost center"), locale: CommonModels.LocaleEnumSchema.describe("Employee locale preference") }).readonly(); +export type UpdateEmployeeProfileRequestDTO = z.infer; + +} diff --git a/test/generated/next/employeeProfile/employeeProfile.queries.ts b/test/generated/next/employeeProfile/employeeProfile.queries.ts new file mode 100644 index 0000000..a0c77f2 --- /dev/null +++ b/test/generated/next/employeeProfile/employeeProfile.queries.ts @@ -0,0 +1,58 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeProfileModels } from "./employeeProfile.models"; +import { EmployeeProfileApi } from "./employeeProfile.api"; + +export namespace EmployeeProfileQueries { +export const moduleName = QueryModule.EmployeeProfile; + +export const keys = { + all: [moduleName] as const, + getProfile: () => [...keys.all, "/employee-profile", ] as const, +}; + +/** + * Query `useGetProfile` + * @summary Get employee profile + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getProfile(), + queryFn: () => + EmployeeProfileApi.getProfile(config), + ...options, + }); +}; + +/** + * Mutation `useUpdateProfile` + * @summary Update employee profile + * @param { EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateProfile = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + EmployeeProfileApi.updateProfile(data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.getProfile()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/employeeRoles/employeeRoles.acl.ts b/test/generated/next/employeeRoles/employeeRoles.acl.ts new file mode 100644 index 0000000..a64e698 --- /dev/null +++ b/test/generated/next/employeeRoles/employeeRoles.acl.ts @@ -0,0 +1,97 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmployeeRolesAcl { +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List all possible roles + * @param { string } object.context context from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { context?: string, } +) => [ + "Read", + object ? subject("Role", object) : "Role" +] as AbilityTuple<"Read", "Role" | ForcedSubject<"Role"> & { context?: string, }>; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Role" +] as AbilityTuple<"Create", "Role">; + +/** + * Use for `useLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLabels` query + */ +export const canUseLabels = ( +) => [ + "Read", + "Role" +] as AbilityTuple<"Read", "Role">; + +/** + * Use for `useFind` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query + */ +export const canUseFind = ( +) => [ + "Read", + "Role" +] as AbilityTuple<"Read", "Role">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Role" +] as AbilityTuple<"Update", "Role">; + +/** + * Use for `useDeleteEmployeesRolesByRoleId` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteEmployeesRolesByRoleId` mutation + */ +export const canUseDeleteEmployeesRolesByRoleId = ( +) => [ + "Delete", + "Role" +] as AbilityTuple<"Delete", "Role">; + +/** + * Use for `usePaginatePermissions` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query + */ +export const canUsePaginatePermissions = ( +) => [ + "Read", + "Role" +] as AbilityTuple<"Read", "Role">; + +/** + * Use for `useTogglePermission` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTogglePermission` mutation + */ +export const canUseTogglePermission = ( +) => [ + "Update", + "Role" +] as AbilityTuple<"Update", "Role">; + +/** + * Use for `useCopy` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopy` mutation + */ +export const canUseCopy = ( +) => [ + "Create", + "Role" +] as AbilityTuple<"Create", "Role">; + +} diff --git a/test/generated/next/employeeRoles/employeeRoles.api.ts b/test/generated/next/employeeRoles/employeeRoles.api.ts new file mode 100644 index 0000000..eb87de3 --- /dev/null +++ b/test/generated/next/employeeRoles/employeeRoles.api.ts @@ -0,0 +1,92 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeRolesApi { +export const list = (limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, + `/employees/roles`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), + config + ) +}; +export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeRolesModels.LabelsResponseSchema }, + `/employees/roles/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { type: "query", name: "context" }), + }, + } + ) +}; +export const find = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}`, + config + ) +}; +export const update = (roleId: string, data: EmployeeRolesModels.EmployeeRoleUpdateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), + config + ) +}; +export const deleteEmployeesRolesByRoleId = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/employees/roles/${roleId}`, + undefined, + config + ) +}; +export const paginatePermissions = (roleId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, + `/employees/roles/${roleId}/permissions`, + config + ) +}; +export const togglePermission = (roleId: string, permission: string, data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/employees/roles/${roleId}/permissions/${permission}/toggle`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), + config + ) +}; +export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}/copy`, + ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/employeeRoles/employeeRoles.configs.ts b/test/generated/next/employeeRoles/employeeRoles.configs.ts new file mode 100644 index 0000000..4e0b998 --- /dev/null +++ b/test/generated/next/employeeRoles/employeeRoles.configs.ts @@ -0,0 +1,90 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeRolesQueries } from "./employeeRoles.queries"; +import { EmployeeRolesAcl } from "./employeeRoles.acl"; + +export namespace EmployeeRolesConfigs { +export const rolesConfig = { + meta: { + title: "Roles", + }, + readAll: { + acl: EmployeeRolesAcl.canUseList, + schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, + paginated: EmployeeRolesQueries.useList, + infinite: EmployeeRolesQueries.useListInfinite, + filters: { + schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, + options: { + inputs: { + name: true, + context: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, + options: { + columns: { + id: true, + name: true, + color: true, + description: true, + context: true, + permissions: true, + numberOfUsers: true, + }, + sortable: EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: EmployeeRolesAcl.canUseFind, + schema: CommonModels.EmployeeRoleResponseSchema, + query: EmployeeRolesQueries.useFind, + }, + create: { + acl: EmployeeRolesAcl.canUseCreate, + schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, + mutation: EmployeeRolesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, + options: { + inputs: { + name: true, + color: true, + description: true, + context: true, + permissions: true, + }, + }, +}) + }, + update: { + acl: EmployeeRolesAcl.canUseUpdate, + schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, + mutation: EmployeeRolesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, + options: { + inputs: { + name: true, + color: true, + description: true, + }, + }, +}) + }, + delete: { + acl: EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId, + mutation: EmployeeRolesQueries.useDeleteEmployeesRolesByRoleId, + }, +}; + +} diff --git a/test/generated/next/employeeRoles/employeeRoles.models.ts b/test/generated/next/employeeRoles/employeeRoles.models.ts new file mode 100644 index 0000000..e3eab5d --- /dev/null +++ b/test/generated/next/employeeRoles/employeeRoles.models.ts @@ -0,0 +1,123 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmployeeRolesModels { +/** + * EmployeeRoleListItemResponseSchema + * @type { object } + * @property { string } id Unique identifier of the role + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string } context Role context + * @property { string[] } permissions Permissions associated with the role + * @property { number } numberOfUsers Number of users associated with the role + */ +export const EmployeeRoleListItemResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), numberOfUsers: z.number().describe("Number of users associated with the role") }).readonly(); +export type EmployeeRoleListItemResponse = z.infer; + +/** + * EmployeeRolePaginationFilterDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } context Role context + * @property { string } search + */ +export const EmployeeRolePaginationFilterDtoSchema = z.object({ name: z.string().describe("Name"), context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), search: z.string() }).readonly(); +export type EmployeeRolePaginationFilterDto = z.infer; + +/** + * EmployeeRoleCreateRequestSchema + * @type { object } + * @property { string } name Name of the role + * @property { string } color Color of the role + * @property { string } description Color of the role + * @property { string } context Role context + * - office or global + * @property { string[] } permissions Permission IDs associated with the role + * can only be either office or global. Default: `` + */ +export const EmployeeRoleCreateRequestSchema = z.object({ name: z.string().describe("Name of the role"), color: z.string().describe("Color of the role"), description: z.string().describe("Color of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context\n - office or global"), permissions: z.array(z.string()).readonly().describe("Permission IDs associated with the role\n can only be either office or global").default([]) }).readonly(); +export type EmployeeRoleCreateRequest = z.infer; + +/** + * EmployeeRolePermissionDtoSchema + * @type { object } + * @property { string } id Employee Permission unique identifier + * @property { string } label + * @property { string } group + * @property { string } description + * @property { string } context Scope where this rule is applied + * @property { boolean } enabled + */ +export const EmployeeRolePermissionDtoSchema = z.object({ id: z.string().describe("Employee Permission unique identifier"), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), enabled: z.boolean() }).readonly(); +export type EmployeeRolePermissionDto = z.infer; + +/** + * EmployeeRoleUpdateRequestSchema + * @type { object } + * @property { string } name Role Id + * @property { string } color Role Color + * @property { string } description Role Description + */ +export const EmployeeRoleUpdateRequestSchema = z.object({ name: z.string().describe("Role Id"), color: z.string().describe("Role Color"), description: z.string().describe("Role Description") }).readonly(); +export type EmployeeRoleUpdateRequest = z.infer; + +/** + * EmployeeRoleTogglePermissionRequestSchema + * @type { object } + * @property { boolean } toggled Turn the permission on or off + */ +export const EmployeeRoleTogglePermissionRequestSchema = z.object({ toggled: z.boolean().describe("Turn the permission on or off") }).readonly(); +export type EmployeeRoleTogglePermissionRequest = z.infer; + +/** + * CopyEmployeeRoleDtoSchema + * @type { object } + * @property { string } newRoleName + */ +export const CopyEmployeeRoleDtoSchema = z.object({ newRoleName: z.string() }).readonly(); +export type CopyEmployeeRoleDto = z.infer; + +/** + * EmployeeRolesListOrderParamEnumSchema + * @type { enum } + */ +export const EmployeeRolesListOrderParamEnumSchema = z.enum(["name", "numberOfUsers"]); +export type EmployeeRolesListOrderParamEnum = z.infer; +export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSchema.enum; + +/** + * EmployeeRolesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleListItemResponse[] } items + */ +export const EmployeeRolesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).readonly() }).readonly().shape }); +export type EmployeeRolesListResponse = z.infer; + +/** + * LabelsResponseSchema + * @type { array } + */ +export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type LabelsResponse = z.infer; + +/** + * EmployeeRolesPaginatePermissionsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRolePermissionDto[] } items + */ +export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).readonly() }).readonly().shape }); +export type EmployeeRolesPaginatePermissionsResponse = z.infer; + +} diff --git a/test/generated/next/employeeRoles/employeeRoles.queries.ts b/test/generated/next/employeeRoles/employeeRoles.queries.ts new file mode 100644 index 0000000..b10fa5d --- /dev/null +++ b/test/generated/next/employeeRoles/employeeRoles.queries.ts @@ -0,0 +1,283 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmployeeRolesAcl } from "./employeeRoles.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeRolesModels } from "./employeeRoles.models"; +import { CommonModels } from "@/data/common/common.models"; +import { EmployeeRolesApi } from "./employeeRoles.api"; + +export namespace EmployeeRolesQueries { +export const moduleName = QueryModule.EmployeeRoles; + +export const keys = { + all: [moduleName] as const, + list: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/roles", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string) => [...keys.all, "/employees/roles", "infinite", limit, order, filter, cursor] as const, + labels: (search?: string, context?: CommonModels.EmployeeRoleContext) => [...keys.all, "/employees/roles/labels", search, context] as const, + find: (roleId: string) => [...keys.all, "/employees/roles/:roleId", roleId] as const, + paginatePermissions: (roleId: string) => [...keys.all, "/employees/roles/:roleId/permissions", roleId] as const, +}; + +/** + * Query `useList` + * @summary Paginate Employee Role Definitions + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` + * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseList()); + return EmployeeRolesApi.list(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary Paginate Employee Role Definitions + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` + * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeRolesAcl.canUseList()); + return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Employee Role Definition + * @permission Requires `canUseCreate` ability + * @param { EmployeeRolesModels.EmployeeRoleCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmployeeRolesAcl.canUseCreate()); + return EmployeeRolesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useLabels` + * @summary List all employee roles with only their labels + * @permission Requires `canUseLabels` ability + * @param { string } object.search Query parameter + * @param { CommonModels.EmployeeRoleContext } object.context Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useLabels = ({ search, context }: { search?: string, context?: CommonModels.EmployeeRoleContext }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.labels(search, context), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseLabels()); + return EmployeeRolesApi.labels(search, context, config) }, + ...options, + }); +}; + +/** + * Query `useFind` + * @summary Get Employee Role Definition + * @permission Requires `canUseFind` ability + * @param { string } object.roleId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFind = ({ roleId }: { roleId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.find(roleId), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseFind()); + return EmployeeRolesApi.find(roleId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Employee Role Definition + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.roleId Path parameter + * @param { EmployeeRolesModels.EmployeeRoleUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, data }) => { + checkAcl(EmployeeRolesAcl.canUseUpdate()); + return EmployeeRolesApi.update(roleId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { roleId } = variables; + const updateKeys = [keys.find(roleId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteEmployeesRolesByRoleId` + * @summary Delete Employee Role Definition + * @permission Requires `canUseDeleteEmployeesRolesByRoleId` ability + * @param { string } mutation.roleId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteEmployeesRolesByRoleId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId }) => { + checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); + return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginatePermissions` + * @summary Get All Employee Role Definition Permissions + * - convenience endpoint to expand the permissions of a role + * - only returns the enabled permissions + * @permission Requires `canUsePaginatePermissions` ability + * @param { string } object.roleId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginatePermissions = ({ roleId }: { roleId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginatePermissions(roleId), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); + return EmployeeRolesApi.paginatePermissions(roleId, config) }, + ...options, + }); +}; + +/** + * Mutation `useTogglePermission` + * @summary Toggle Employee Role Definition Permission + * @permission Requires `canUseTogglePermission` ability + * @param { string } mutation.roleId Path parameter + * @param { string } mutation.permission Path parameter + * @param { EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useTogglePermission = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, permission, data }) => { + checkAcl(EmployeeRolesAcl.canUseTogglePermission()); + return EmployeeRolesApi.togglePermission(roleId, permission, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopy` + * @summary Copy Employee Role Definition + * @permission Requires `canUseCopy` ability + * @param { string } mutation.roleId Path parameter + * @param { EmployeeRolesModels.CopyEmployeeRoleDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ roleId, data }) => { + checkAcl(EmployeeRolesAcl.canUseCopy()); + return EmployeeRolesApi.copy(roleId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { roleId } = variables; + const updateKeys = [keys.find(roleId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/employeeSettings/employeeSettings.api.ts b/test/generated/next/employeeSettings/employeeSettings.api.ts new file mode 100644 index 0000000..21fa47a --- /dev/null +++ b/test/generated/next/employeeSettings/employeeSettings.api.ts @@ -0,0 +1,23 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { EmployeeSettingsModels } from "./employeeSettings.models"; + +export namespace EmployeeSettingsApi { +export const getAll = (config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, + `/employees/settings`, + config + ) +}; +export const update = (key: string, data: EmployeeSettingsModels.UpdateEmployeeSettingDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/employees/settings/${key}`, + ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/employeeSettings/employeeSettings.models.ts b/test/generated/next/employeeSettings/employeeSettings.models.ts new file mode 100644 index 0000000..08b58ca --- /dev/null +++ b/test/generated/next/employeeSettings/employeeSettings.models.ts @@ -0,0 +1,20 @@ +import { z } from "zod"; + +export namespace EmployeeSettingsModels { +/** + * EmployeeSettingsResponseDtoSchema + * @type { object } + * @property { object } settings Map of all settings for the employee + */ +export const EmployeeSettingsResponseDtoSchema = z.object({ settings: z.union([z.object({}).catchall(z.any()).readonly(), z.array(z.object({}).catchall(z.any()).readonly()).readonly(), z.string(), z.array(z.string()).readonly(), z.array(z.number()).readonly()]).describe("Map of all settings for the employee") }).readonly(); +export type EmployeeSettingsResponseDto = z.infer; + +/** + * UpdateEmployeeSettingDtoSchema + * @type { object } + * @property { object } value The value to store for the setting. If null, the setting will be deleted. + */ +export const UpdateEmployeeSettingDtoSchema = z.object({ value: z.union([z.object({}).catchall(z.any()).readonly(), z.array(z.unknown()).readonly(), z.string(), z.number(), z.boolean()]).describe("The value to store for the setting. If null, the setting will be deleted.").nullable() }).readonly(); +export type UpdateEmployeeSettingDto = z.infer; + +} diff --git a/test/generated/next/employeeSettings/employeeSettings.queries.ts b/test/generated/next/employeeSettings/employeeSettings.queries.ts new file mode 100644 index 0000000..389d6e3 --- /dev/null +++ b/test/generated/next/employeeSettings/employeeSettings.queries.ts @@ -0,0 +1,58 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmployeeSettingsModels } from "./employeeSettings.models"; +import { EmployeeSettingsApi } from "./employeeSettings.api"; + +export namespace EmployeeSettingsQueries { +export const moduleName = QueryModule.EmployeeSettings; + +export const keys = { + all: [moduleName] as const, + getAll: () => [...keys.all, "/employees/settings", ] as const, +}; + +/** + * Query `useGetAll` + * @summary Get all employee settings + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetAll = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getAll(), + queryFn: () => + EmployeeSettingsApi.getAll(config), + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update employee setting + * @param { string } mutation.key Path parameter + * @param { EmployeeSettingsModels.UpdateEmployeeSettingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ key, data }) => + EmployeeSettingsApi.update(key, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/employment/employment.acl.ts b/test/generated/next/employment/employment.acl.ts new file mode 100644 index 0000000..bbcaf77 --- /dev/null +++ b/test/generated/next/employment/employment.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace EmploymentAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create new employment + * @param { string } object.officeId officeId from mutation data + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List employments + * @param { string } object.officeId officeId from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId?: string, } +) => [ + "Read", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Read", "Employment" | ForcedSubject<"Employment"> & { officeId?: string, }>; + +/** + * Use for `useListRoles` query ability. For global ability, omit the object parameter. + * @description List employment roles + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query + */ +export const canUseListRoles = ( + object?: { officeId: string, } +) => [ + "ListRoles", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"ListRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useUpdateRoles` mutation ability. For global ability, omit the object parameter. + * @description Update employment roles + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation + */ +export const canUseUpdateRoles = ( + object?: { officeId: string, } +) => [ + "UpdateRoles", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"UpdateRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Archive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Unarchive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +} diff --git a/test/generated/next/employment/employment.api.ts b/test/generated/next/employment/employment.api.ts new file mode 100644 index 0000000..d5718ab --- /dev/null +++ b/test/generated/next/employment/employment.api.ts @@ -0,0 +1,73 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; +import { EmploymentModels } from "./employment.models"; + +export namespace EmploymentApi { +export const create = (data: EmploymentModels.EmploymentCreateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/employees/employments`, + ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), + config + ) +}; +export const list = (limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmploymentModels.EmploymentListResponseSchema }, + `/employees/employments`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listRoles = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/roles`, + config + ) +}; +export const updateRoles = (officeId: string, employmentId: string, data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/roles`, + ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), + config + ) +}; +export const update = (officeId: string, employmentId: string, data: EmploymentModels.UpdateEmploymentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}`, + ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), + config + ) +}; +export const archive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/archive`, + undefined, + config + ) +}; +export const unarchive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/employment/employment.configs.ts b/test/generated/next/employment/employment.configs.ts new file mode 100644 index 0000000..b8525a4 --- /dev/null +++ b/test/generated/next/employment/employment.configs.ts @@ -0,0 +1,63 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { EmploymentModels } from "./employment.models"; +import { EmploymentQueries } from "./employment.queries"; +import { EmploymentAcl } from "./employment.acl"; + +export namespace EmploymentConfigs { +export const employmentsConfig = { + meta: { + title: "Employments", + }, + readAll: { + acl: EmploymentAcl.canUseList, + schema: CommonModels.EmploymentResponseSchema, + paginated: EmploymentQueries.useList, + infinite: EmploymentQueries.useListInfinite, + filters: { + schema: EmploymentModels.EmploymentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmploymentModels.EmploymentFilterDtoSchema, + options: { + inputs: { + officeId: true, + employeeId: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.EmploymentResponseSchema, + options: { + columns: { + id: true, + officeId: true, + office: true, + employeeId: true, + employee: true, + archived: true, + costCenter: true, + roles: true, + }, + sortable: EmploymentModels.EmploymentListOrderParamEnumSchema, + }, +}), + }, + create: { + acl: EmploymentAcl.canUseCreate, + schema: EmploymentModels.EmploymentCreateRequestSchema, + mutation: EmploymentQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmploymentModels.EmploymentCreateRequestSchema, + options: { + inputs: { + officeId: true, + employeeId: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/next/employment/employment.models.ts b/test/generated/next/employment/employment.models.ts new file mode 100644 index 0000000..b81dd37 --- /dev/null +++ b/test/generated/next/employment/employment.models.ts @@ -0,0 +1,114 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace EmploymentModels { +/** + * EmploymentCreateRequestSchema + * @type { object } + * @property { string } officeId + * @property { string } employeeId + */ +export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }).readonly(); +export type EmploymentCreateRequest = z.infer; + +/** + * EmploymentFilterDtoSchema + * @type { object } + * @property { string } officeId Office IDs + * @property { string } employeeId Employee IDs + */ +export const EmploymentFilterDtoSchema = z.object({ officeId: z.string().describe("Office IDs"), employeeId: z.string().describe("Employee IDs") }).readonly(); +export type EmploymentFilterDto = z.infer; + +/** + * EmploymentRoleMemberResponseSchema + * @type { object } + * @property { string } roleId + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string[] } permissions Permissions associated with the role + */ +export const EmploymentRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export type EmploymentRoleMemberResponse = z.infer; + +/** + * EmploymentRoleMembershipsUpdateRequestSchema + * @type { object } + * @property { string[] } roleIds Array of role IDs + */ +export const EmploymentRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }).readonly(); +export type EmploymentRoleMembershipsUpdateRequest = z.infer; + +/** + * UpdateEmploymentRequestDtoSchema + * @type { object } + * @property { string } costCenter + * @property { string[] } roleIds + */ +export const UpdateEmploymentRequestDtoSchema = z.object({ costCenter: z.string(), roleIds: z.array(z.string()).readonly() }).readonly(); +export type UpdateEmploymentRequestDto = z.infer; + +/** + * EmploymentListOrderParamEnumSchema + * @type { enum } + */ +export const EmploymentListOrderParamEnumSchema = z.enum(["officeId", "createdAt"]); +export type EmploymentListOrderParamEnum = z.infer; +export const EmploymentListOrderParamEnum = EmploymentListOrderParamEnumSchema.enum; + +/** + * EmploymentPaginationPopulateFieldsSchema + * @type { enum } + */ +export const EmploymentPaginationPopulateFieldsSchema = z.enum(["office", "employee"]); +export type EmploymentPaginationPopulateFields = z.infer; +export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFieldsSchema.enum; + +/** + * EmploymentListPopulateParamSchema + * @type { array } + */ +export const EmploymentListPopulateParamSchema = z.array(EmploymentPaginationPopulateFieldsSchema).readonly().nullish(); +export type EmploymentListPopulateParam = z.infer; + +/** + * EmploymentListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.EmploymentResponse[] } items + */ +export const EmploymentListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.EmploymentResponseSchema).readonly() }).readonly().shape }); +export type EmploymentListResponse = z.infer; + +/** + * EmploymentListRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmploymentRoleMemberResponse[] } items + */ +export const EmploymentListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape }); +export type EmploymentListRolesResponse = z.infer; + +/** + * EmploymentUpdateRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmploymentRoleMemberResponse[] } items + */ +export const EmploymentUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape }); +export type EmploymentUpdateRolesResponse = z.infer; + +} diff --git a/test/generated/next/employment/employment.queries.ts b/test/generated/next/employment/employment.queries.ts new file mode 100644 index 0000000..f4556da --- /dev/null +++ b/test/generated/next/employment/employment.queries.ts @@ -0,0 +1,235 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { EmploymentAcl } from "./employment.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { EmploymentModels } from "./employment.models"; +import { EmploymentApi } from "./employment.api"; + +export namespace EmploymentQueries { +export const moduleName = QueryModule.Employment; + +export const keys = { + all: [moduleName] as const, + list: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/employments", limit, order, populate, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string) => [...keys.all, "/employees/employments", "infinite", limit, order, populate, filter, cursor] as const, + listRoles: (officeId: string, employmentId: string) => [...keys.all, "/offices/:officeId/employments/:employmentId/roles", officeId, employmentId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create new employment + * @permission Requires `canUseCreate` ability + * @param { EmploymentModels.EmploymentCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmploymentAcl.canUseCreate()); + return EmploymentApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useList` + * @summary List Employments + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` + * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter + * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, populate, filter, page, cursor), + queryFn: () => { + checkAcl(EmploymentAcl.canUseList()); + return EmploymentApi.list(limit, order, populate, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List Employments + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` + * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter + * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, populate, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmploymentAcl.canUseList()); + return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useListRoles` + * @summary List Employments Roles + * @permission Requires `canUseListRoles` ability + * @param { string } object.officeId Path parameter + * @param { string } object.employmentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoles = ({ officeId, employmentId }: { officeId: string, employmentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoles(officeId, employmentId), + queryFn: () => { + checkAcl(EmploymentAcl.canUseListRoles({ officeId } )); + return EmploymentApi.listRoles(officeId, employmentId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateRoles` + * @summary Update Employment Roles + * @permission Requires `canUseUpdateRoles` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { EmploymentModels.EmploymentRoleMembershipsUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId, data }) => { + checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId } )); + return EmploymentApi.updateRoles(officeId, employmentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { EmploymentModels.UpdateEmploymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId, data }) => { + checkAcl(EmploymentAcl.canUseUpdate({ officeId } )); + return EmploymentApi.update(officeId, employmentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Employment + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId }) => { + checkAcl(EmploymentAcl.canUseArchive({ officeId } )); + return EmploymentApi.archive(officeId, employmentId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Un-archive Employment + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId }) => { + checkAcl(EmploymentAcl.canUseUnarchive({ officeId } )); + return EmploymentApi.unarchive(officeId, employmentId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/factoringExport/factoringExport.acl.ts b/test/generated/next/factoringExport/factoringExport.acl.ts new file mode 100644 index 0000000..cc07635 --- /dev/null +++ b/test/generated/next/factoringExport/factoringExport.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace FactoringExportAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create factoring export + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Create", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +/** + * Use for `useGetBatch` query ability. For global ability, omit the object parameter. + * @description Read factoring export + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query + */ +export const canUseGetBatch = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +} diff --git a/test/generated/next/factoringExport/factoringExport.api.ts b/test/generated/next/factoringExport/factoringExport.api.ts new file mode 100644 index 0000000..471d0ec --- /dev/null +++ b/test/generated/next/factoringExport/factoringExport.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { FactoringExportModels } from "./factoringExport.models"; + +export namespace FactoringExportApi { +export const create = (officeId: string, data: FactoringExportModels.CreateFactoringExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-exports`, + ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), + config + ) +}; +export const getBatch = (batchId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-exports/${batchId}`, + config + ) +}; +} diff --git a/test/generated/next/factoringExport/factoringExport.models.ts b/test/generated/next/factoringExport/factoringExport.models.ts new file mode 100644 index 0000000..1135505 --- /dev/null +++ b/test/generated/next/factoringExport/factoringExport.models.ts @@ -0,0 +1,41 @@ +import { z } from "zod"; + +export namespace FactoringExportModels { +/** + * FactoringExportBatchStatusEnumSchema + * @type { enum } + */ +export const FactoringExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Failed"]); +export type FactoringExportBatchStatusEnum = z.infer; +export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSchema.enum; + +/** + * FactoringExportBatchResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { FactoringExportBatchStatusEnum } status + * @property { number } totalInvoices + * @property { number } totalAmount + * @property { string } currencyNotation + * @property { string } jobId + * @property { string } eurFileUrl + * @property { string } usdFileUrl + * @property { string } createdById + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } exportedAt + */ +export const FactoringExportBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringExportBatchStatusEnumSchema, totalInvoices: z.number(), totalAmount: z.number(), currencyNotation: z.string(), jobId: z.string().nullish(), eurFileUrl: z.string().nullish(), usdFileUrl: z.string().nullish(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type FactoringExportBatchResponseDto = z.infer; + +/** + * CreateFactoringExportRequestDtoSchema + * @type { object } + * @property { string } invoiceDateFrom Invoice date from + * @property { string } invoiceDateUntil Invoice date until + */ +export const CreateFactoringExportRequestDtoSchema = z.object({ invoiceDateFrom: z.iso.datetime({ offset: true }).describe("Invoice date from"), invoiceDateUntil: z.iso.datetime({ offset: true }).describe("Invoice date until") }).readonly(); +export type CreateFactoringExportRequestDto = z.infer; + +} diff --git a/test/generated/next/factoringExport/factoringExport.queries.ts b/test/generated/next/factoringExport/factoringExport.queries.ts new file mode 100644 index 0000000..5bee5fa --- /dev/null +++ b/test/generated/next/factoringExport/factoringExport.queries.ts @@ -0,0 +1,68 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { FactoringExportAcl } from "./factoringExport.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FactoringExportModels } from "./factoringExport.models"; +import { FactoringExportApi } from "./factoringExport.api"; + +export namespace FactoringExportQueries { +export const moduleName = QueryModule.FactoringExport; + +export const keys = { + all: [moduleName] as const, + getBatch: (batchId: string, officeId: string) => [...keys.all, "/offices/:officeId/factoring-exports/:batchId", batchId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Generate factoring export files for Raiffeisen Factor Bank + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { FactoringExportModels.CreateFactoringExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(FactoringExportAcl.canUseCreate({ officeId } )); + return FactoringExportApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetBatch` + * @summary Get factoring export batch status + * @permission Requires `canUseGetBatch` ability + * @param { string } object.batchId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBatch = ({ batchId, officeId }: { batchId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBatch(batchId, officeId), + queryFn: () => { + checkAcl(FactoringExportAcl.canUseGetBatch({ officeId } )); + return FactoringExportApi.getBatch(batchId, officeId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/factoringMerge/factoringMerge.acl.ts b/test/generated/next/factoringMerge/factoringMerge.acl.ts new file mode 100644 index 0000000..208ed2f --- /dev/null +++ b/test/generated/next/factoringMerge/factoringMerge.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace FactoringMergeAcl { +/** + * Use for `usePrepareUpload` mutation ability. For global ability, omit the object parameter. + * @description Prepare factoring merge upload + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareUpload` mutation + */ +export const canUsePrepareUpload = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +/** + * Use for `useProcessMerge` mutation ability. For global ability, omit the object parameter. + * @description Process factoring merge + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useProcessMerge` mutation + */ +export const canUseProcessMerge = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +/** + * Use for `useGetMergeBatch` query ability. For global ability, omit the object parameter. + * @description Read merge batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMergeBatch` query + */ +export const canUseGetMergeBatch = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +} diff --git a/test/generated/next/factoringMerge/factoringMerge.api.ts b/test/generated/next/factoringMerge/factoringMerge.api.ts new file mode 100644 index 0000000..f095cec --- /dev/null +++ b/test/generated/next/factoringMerge/factoringMerge.api.ts @@ -0,0 +1,30 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { FactoringMergeModels } from "./factoringMerge.models"; + +export namespace FactoringMergeApi { +export const prepareUpload = (officeId: string, data: FactoringMergeModels.PrepareFactoringMergeRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/prepare-upload`, + ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), + config + ) +}; +export const processMerge = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/${batchId}/process`, + undefined, + config + ) +}; +export const getMergeBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/${batchId}`, + config + ) +}; +} diff --git a/test/generated/next/factoringMerge/factoringMerge.models.ts b/test/generated/next/factoringMerge/factoringMerge.models.ts new file mode 100644 index 0000000..e285edd --- /dev/null +++ b/test/generated/next/factoringMerge/factoringMerge.models.ts @@ -0,0 +1,84 @@ +import { z } from "zod"; + +export namespace FactoringMergeModels { +/** + * FileMetadataDtoSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType File MIME type + * @property { number } fileSize File size in bytes. Minimum: `1` + */ +export const FileMetadataDtoSchema = z.object({ fileName: z.string().describe("File name"), mimeType: z.string().describe("File MIME type"), fileSize: z.number().gte(1).describe("File size in bytes") }).readonly(); +export type FileMetadataDto = z.infer; + +/** + * PrepareFactoringMergeRequestDtoSchema + * @type { object } + * @property { FileMetadataDto } eurDebtorFile EUR debtor file metadata + * @property { FileMetadataDto } eurOperationsFile EUR operations file metadata + * @property { FileMetadataDto } eurExistingFactoringFile EUR existing factoring file metadata (optional) + * @property { FileMetadataDto } usdDebtorFile USD debtor file metadata + * @property { FileMetadataDto } usdOperationsFile USD operations file metadata + * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) + */ +export const PrepareFactoringMergeRequestDtoSchema = z.object({ eurDebtorFile: FileMetadataDtoSchema.describe("EUR debtor file metadata"), eurOperationsFile: FileMetadataDtoSchema.describe("EUR operations file metadata"), eurExistingFactoringFile: FileMetadataDtoSchema.describe("EUR existing factoring file metadata (optional)").nullish(), usdDebtorFile: FileMetadataDtoSchema.describe("USD debtor file metadata"), usdOperationsFile: FileMetadataDtoSchema.describe("USD operations file metadata"), usdExistingFactoringFile: FileMetadataDtoSchema.describe("USD existing factoring file metadata (optional)").nullish() }).readonly(); +export type PrepareFactoringMergeRequestDto = z.infer; + +/** + * MediaUploadInstructionsDtoSchema + * @type { object } + * @property { string } id + * @property { string } method + * @property { string } url + */ +export const MediaUploadInstructionsDtoSchema = z.object({ id: z.string(), method: z.string(), url: z.string() }).readonly(); +export type MediaUploadInstructionsDto = z.infer; + +/** + * FactoringMergeUploadInstructionsResponseDtoSchema + * @type { object } + * @property { string } batchId + * @property { MediaUploadInstructionsDto } eurDebtorFile + * @property { MediaUploadInstructionsDto } eurOperationsFile + * @property { MediaUploadInstructionsDto } eurExistingFactoringFile + * @property { MediaUploadInstructionsDto } usdDebtorFile + * @property { MediaUploadInstructionsDto } usdOperationsFile + * @property { MediaUploadInstructionsDto } usdExistingFactoringFile + */ +export const FactoringMergeUploadInstructionsResponseDtoSchema = z.object({ batchId: z.string(), eurDebtorFile: MediaUploadInstructionsDtoSchema, eurOperationsFile: MediaUploadInstructionsDtoSchema, eurExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), usdDebtorFile: MediaUploadInstructionsDtoSchema, usdOperationsFile: MediaUploadInstructionsDtoSchema, usdExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish() }).readonly(); +export type FactoringMergeUploadInstructionsResponseDto = z.infer; + +/** + * FactoringMergeBatchStatusEnumSchema + * @type { enum } + */ +export const FactoringMergeBatchStatusEnumSchema = z.enum(["Initializing", "Processing", "Completed", "Failed"]); +export type FactoringMergeBatchStatusEnum = z.infer; +export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema.enum; + +/** + * FactoringMergeBatchResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { FactoringMergeBatchStatusEnum } status + * @property { string } eurDebtorFileMediaId + * @property { string } eurOperationsFileMediaId + * @property { string } eurExistingFactoringFileMediaId + * @property { string } usdDebtorFileMediaId + * @property { string } usdOperationsFileMediaId + * @property { string } usdExistingFactoringFileMediaId + * @property { string } eurResultFileMediaId + * @property { string } eurResultFileUrl + * @property { string } usdResultFileMediaId + * @property { string } usdResultFileUrl + * @property { string } jobId + * @property { string } errorMessage + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } completedAt + */ +export const FactoringMergeBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringMergeBatchStatusEnumSchema, eurDebtorFileMediaId: z.string(), eurOperationsFileMediaId: z.string(), eurExistingFactoringFileMediaId: z.string().nullish(), usdDebtorFileMediaId: z.string(), usdOperationsFileMediaId: z.string(), usdExistingFactoringFileMediaId: z.string().nullish(), eurResultFileMediaId: z.string().nullish(), eurResultFileUrl: z.string().nullish(), usdResultFileMediaId: z.string().nullish(), usdResultFileUrl: z.string().nullish(), jobId: z.string().nullish(), errorMessage: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), completedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type FactoringMergeBatchResponseDto = z.infer; + +} diff --git a/test/generated/next/factoringMerge/factoringMerge.queries.ts b/test/generated/next/factoringMerge/factoringMerge.queries.ts new file mode 100644 index 0000000..80ea921 --- /dev/null +++ b/test/generated/next/factoringMerge/factoringMerge.queries.ts @@ -0,0 +1,97 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { FactoringMergeAcl } from "./factoringMerge.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FactoringMergeModels } from "./factoringMerge.models"; +import { FactoringMergeApi } from "./factoringMerge.api"; + +export namespace FactoringMergeQueries { +export const moduleName = QueryModule.FactoringMerge; + +export const keys = { + all: [moduleName] as const, + getMergeBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/factoring-merge/:batchId", officeId, batchId] as const, +}; + +/** + * Mutation `usePrepareUpload` + * @summary Prepare upload instructions for MOVE files merge + * @permission Requires `canUsePrepareUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { FactoringMergeModels.PrepareFactoringMergeRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const usePrepareUpload = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId } )); + return FactoringMergeApi.prepareUpload(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useProcessMerge` + * @summary Start processing the merge batch + * @permission Requires `canUseProcessMerge` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useProcessMerge = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId } )); + return FactoringMergeApi.processMerge(officeId, batchId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, batchId } = variables; + const updateKeys = [keys.getMergeBatch(officeId, batchId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetMergeBatch` + * @summary Get merge batch status + * @permission Requires `canUseGetMergeBatch` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, default] + */ +export const useGetMergeBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getMergeBatch(officeId, batchId), + queryFn: () => { + checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId } )); + return FactoringMergeApi.getMergeBatch(officeId, batchId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/files/files.api.ts b/test/generated/next/files/files.api.ts new file mode 100644 index 0000000..286fe3a --- /dev/null +++ b/test/generated/next/files/files.api.ts @@ -0,0 +1,72 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { FilesModels } from "./files.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace FilesApi { +export const createUpload = (officeId: string, folderId: string, data: FilesModels.CreateFileRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FilesModels.FileUploadResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}/files`, + ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), + config + ) +}; +export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/files/eml`, + ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const rename = (officeId: string, fileId: string, data: FilesModels.RenameFileRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.FileResponseDTOSchema }, + `/offices/${officeId}/files/${fileId}`, + ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), + config + ) +}; +export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/move`, + ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), + config + ) +}; +export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/copy`, + ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), + config + ) +}; +export const archive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/archive`, + ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), + config + ) +}; +export const unarchive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/files/unarchive`, + ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/files/files.models.ts b/test/generated/next/files/files.models.ts new file mode 100644 index 0000000..c7e5145 --- /dev/null +++ b/test/generated/next/files/files.models.ts @@ -0,0 +1,57 @@ +import { z } from "zod"; + +export namespace FilesModels { +/** + * CreateFileRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } mimeType + * @property { number } fileSize Minimum: `0` + */ +export const CreateFileRequestDTOSchema = z.object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }).readonly(); +export type CreateFileRequestDTO = z.infer; + +/** + * FileUploadResponseDTOSchema + * @type { object } + * @property { string } fileId + * @property { string } method + * @property { string } url + */ +export const FileUploadResponseDTOSchema = z.object({ fileId: z.string(), method: z.string(), url: z.string() }).readonly(); +export type FileUploadResponseDTO = z.infer; + +/** + * GetFilesEmlRequestDTOSchema + * @type { object } + * @property { string[] } ids Min Items: `1` + */ +export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); +export type GetFilesEmlRequestDTO = z.infer; + +/** + * RenameFileRequestDTOSchema + * @type { object } + * @property { string } name + */ +export const RenameFileRequestDTOSchema = z.object({ name: z.string() }).readonly(); +export type RenameFileRequestDTO = z.infer; + +/** + * MoveFilesRequestDTOSchema + * @type { object } + * @property { string[] } fileIds Min Items: `1` + * @property { string } targetFolderId + */ +export const MoveFilesRequestDTOSchema = z.object({ fileIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }).readonly(); +export type MoveFilesRequestDTO = z.infer; + +/** + * SetFilesArchivedRequestDTOSchema + * @type { object } + * @property { string[] } ids Min Items: `1` + */ +export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); +export type SetFilesArchivedRequestDTO = z.infer; + +} diff --git a/test/generated/next/files/files.queries.ts b/test/generated/next/files/files.queries.ts new file mode 100644 index 0000000..ee44a92 --- /dev/null +++ b/test/generated/next/files/files.queries.ts @@ -0,0 +1,210 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FilesModels } from "./files.models"; +import { FilesApi } from "./files.api"; + +export namespace FilesQueries { +export const moduleName = QueryModule.Files; + + + +/** + * Mutation `useCreateUpload` + * @summary Create file upload instructions + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { FilesModels.CreateFileRequestDTO } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { + const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGetEml` - recommended when file should not be cached + * @summary Get files as EML file with attachments + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.GetFilesEmlRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.getEml(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRename` + * @summary Rename file + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.fileId Path parameter + * @param { FilesModels.RenameFileRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useRename = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, fileId, data }) => + FilesApi.rename(officeId, fileId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMove` + * @summary Move files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useMove = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.move(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopy` + * @summary Copy files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.copy(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.archive(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.unarchive(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/folders/folders.api.ts b/test/generated/next/folders/folders.api.ts new file mode 100644 index 0000000..2644437 --- /dev/null +++ b/test/generated/next/folders/folders.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { FoldersModels } from "./folders.models"; + +export namespace FoldersApi { +export const getTree = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}/tree`, + config + ) +}; +export const getContent = (officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}`, + { + ...config, + params: { + order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const rename = (officeId: string, folderId: string, data: FoldersModels.RenameFolderRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}`, + ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), + config + ) +}; +export const deleteFolder = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/folders/${folderId}`, + undefined, + config + ) +}; +export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders`, + ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), + config + ) +}; +export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/folders/move`, + ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/folders/folders.models.ts b/test/generated/next/folders/folders.models.ts new file mode 100644 index 0000000..977f922 --- /dev/null +++ b/test/generated/next/folders/folders.models.ts @@ -0,0 +1,96 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace FoldersModels { +/** + * TargetEntityNameEnumSchema + * @type { enum } + */ +export const TargetEntityNameEnumSchema = z.enum(["invoice", "quote"]); +export type TargetEntityNameEnum = z.infer; +export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; + +/** + * FolderSymlinkResponseDTOSchema + * @type { object } + * @property { string } targetEntityName + * @property { string } targetEntityId + */ +export const FolderSymlinkResponseDTOSchema = z.object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }).readonly(); +export type FolderSymlinkResponseDTO = z.infer; + +/** + * FolderTreeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } isSystem + * @property { boolean } isSymlink + * @property { FolderSymlinkResponseDTO } symlink + * @property { FolderTreeResponseDTO[] } folders + */ +export const FolderTreeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), get folders() { return z.array(FolderTreeResponseDTOSchema).readonly() } }).readonly(); +export type FolderTreeResponseDTO = z.infer; + +/** + * FolderResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } archived + * @property { boolean } isSystem + * @property { boolean } isSymlink + * @property { FolderSymlinkResponseDTO } symlink + * @property { string } createdAt + * @property { string } updatedAt + * @property { CommonModels.FolderEmployeeDTO } createdBy + * @property { CommonModels.FolderEmployeeDTO } updatedBy + * @property { CommonModels.FileResponseDTO[] } files + * @property { FolderResponseDTO[] } folders + */ +export const FolderResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, files: z.array(CommonModels.FileResponseDTOSchema).readonly(), get folders() { return z.array(FolderResponseDTOSchema).readonly() } }).readonly(); +export type FolderResponseDTO = z.infer; + +/** + * FolderContentFilterDtoSchema + * @type { object } + * @property { boolean } archived When omitted, both archived and unarchived files are returned. + */ +export const FolderContentFilterDtoSchema = z.object({ archived: z.boolean().describe("When omitted, both archived and unarchived files are returned.") }).readonly(); +export type FolderContentFilterDto = z.infer; + +/** + * CreateFolderRequestDTOSchema + * @type { object } + * @property { string } parentFolderId + * @property { string } name + */ +export const CreateFolderRequestDTOSchema = z.object({ parentFolderId: z.string(), name: z.string() }).readonly(); +export type CreateFolderRequestDTO = z.infer; + +/** + * RenameFolderRequestDTOSchema + * @type { object } + * @property { string } name + */ +export const RenameFolderRequestDTOSchema = z.object({ name: z.string() }).readonly(); +export type RenameFolderRequestDTO = z.infer; + +/** + * MoveFoldersRequestDTOSchema + * @type { object } + * @property { string[] } folderIds Min Items: `1` + * @property { string } targetFolderId + */ +export const MoveFoldersRequestDTOSchema = z.object({ folderIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }).readonly(); +export type MoveFoldersRequestDTO = z.infer; + +/** + * GetContentOrderParamSchema + * @type { array } + * @description Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + */ +export const GetContentOrderParamSchema = z.array(z.string()).readonly().describe("Order by fields (comma separated with +/- prefix): name, createdAt").nullish(); +export type GetContentOrderParam = z.infer; + +} diff --git a/test/generated/next/folders/folders.queries.ts b/test/generated/next/folders/folders.queries.ts new file mode 100644 index 0000000..ef642ed --- /dev/null +++ b/test/generated/next/folders/folders.queries.ts @@ -0,0 +1,188 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { FoldersModels } from "./folders.models"; +import { FoldersApi } from "./folders.api"; + +export namespace FoldersQueries { +export const moduleName = QueryModule.Folders; + +export const keys = { + all: [moduleName] as const, + getTree: (officeId: string, folderId: string) => [...keys.all, "/offices/:officeId/folders/:folderId/tree", officeId, folderId] as const, + getContent: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", officeId, folderId, limit, order, filter, page, cursor] as const, + getContentInfinite: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", "infinite", officeId, folderId, limit, order, filter, cursor] as const, +}; + +/** + * Query `useGetTree` + * @summary Get folder tree + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetTree = ({ officeId, folderId }: { officeId: string, folderId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getTree(officeId, folderId), + queryFn: () => + FoldersApi.getTree(officeId, folderId, config), + ...options, + }); +}; + +/** + * Query `useGetContent` + * @summary Get folder content + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetContent = ({ officeId, folderId, limit, order, filter, page, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), + queryFn: () => + FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `useGetContentInfinite + * @summary Get folder content + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetContentInfinite = ({ officeId, folderId, limit, order, filter, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => + FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useRename` + * @summary Rename folder + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { FoldersModels.RenameFolderRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useRename = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, folderId, data }) => + FoldersApi.rename(officeId, folderId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteFolder` + * @summary Delete folder + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteFolder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, folderId }) => + FoldersApi.deleteFolder(officeId, folderId, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create folder + * @param { string } mutation.officeId Path parameter + * @param { FoldersModels.CreateFolderRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FoldersApi.create(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMove` + * @summary Move folders + * @param { string } mutation.officeId Path parameter + * @param { FoldersModels.MoveFoldersRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useMove = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FoldersApi.move(officeId, data, config) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/hsCodes/hsCodes.acl.ts b/test/generated/next/hsCodes/hsCodes.acl.ts new file mode 100644 index 0000000..3e48e9d --- /dev/null +++ b/test/generated/next/hsCodes/hsCodes.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace HsCodesAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "HsCode" +] as AbilityTuple<"Read", "HsCode">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "HsCode" +] as AbilityTuple<"Create", "HsCode">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "HsCode" +] as AbilityTuple<"Read", "HsCode">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "HsCode" +] as AbilityTuple<"Read", "HsCode">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "HsCode" +] as AbilityTuple<"Update", "HsCode">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "HsCode" +] as AbilityTuple<"Archive", "HsCode">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "HsCode" +] as AbilityTuple<"Archive", "HsCode">; + +} diff --git a/test/generated/next/hsCodes/hsCodes.api.ts b/test/generated/next/hsCodes/hsCodes.api.ts new file mode 100644 index 0000000..ec87c77 --- /dev/null +++ b/test/generated/next/hsCodes/hsCodes.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { HsCodesModels } from "./hsCodes.models"; + +export namespace HsCodesApi { +export const paginate = (limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, + `/hs-codes`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes`, + ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, + `/hs-codes/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}`, + config + ) +}; +export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}`, + ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/hsCodes/hsCodes.configs.ts b/test/generated/next/hsCodes/hsCodes.configs.ts new file mode 100644 index 0000000..5b005a1 --- /dev/null +++ b/test/generated/next/hsCodes/hsCodes.configs.ts @@ -0,0 +1,120 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { HsCodesModels } from "./hsCodes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { HsCodesQueries } from "./hsCodes.queries"; +import { HsCodesAcl } from "./hsCodes.acl"; + +export namespace HsCodesConfigs { +export const hsCodesConfig = { + meta: { + title: "Hs Codes", + }, + readAll: { + acl: HsCodesAcl.canUsePaginate, + schema: HsCodesModels.HsCodeResponseDTOSchema, + paginated: HsCodesQueries.usePaginate, + infinite: HsCodesQueries.usePaginateInfinite, + filters: { + schema: HsCodesModels.HsCodePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: HsCodesModels.HsCodePaginationFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: HsCodesModels.HsCodeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + description: true, + customArea: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: HsCodesModels.HsCodesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: HsCodesAcl.canUseFindById, + schema: HsCodesModels.HsCodeResponseDTOSchema, + query: HsCodesQueries.useFindById, + }, + create: { + acl: HsCodesAcl.canUseCreate, + schema: HsCodesModels.CreateHsCodeRequestDTOSchema, + mutation: HsCodesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: HsCodesModels.CreateHsCodeRequestDTOSchema, + options: { + inputs: { + name: true, + description: true, + customArea: true, + }, + }, +}) + }, + update: { + acl: HsCodesAcl.canUseUpdate, + schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, + mutation: HsCodesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, + options: { + inputs: { + name: true, + description: true, + customArea: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: HsCodesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: HsCodesQueries.usePaginateLabels, + infinite: HsCodesQueries.usePaginateLabelsInfinite, + filters: { + schema: HsCodesModels.HsCodeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: HsCodesModels.HsCodeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/hsCodes/hsCodes.models.ts b/test/generated/next/hsCodes/hsCodes.models.ts new file mode 100644 index 0000000..1861991 --- /dev/null +++ b/test/generated/next/hsCodes/hsCodes.models.ts @@ -0,0 +1,111 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace HsCodesModels { +/** + * HsCodeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type HsCodeEmployeeDTO = z.infer; + +/** + * HsCodeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the HS Code + * @property { string } name Name of the HS Code + * @property { string } description Description of the HS Code + * @property { string } customArea Custom area associated with the HS Code + * @property { boolean } archived Indicates if the HS Code is archived + * @property { string } createdById + * @property { HsCodeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { HsCodeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const HsCodeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the HS Code"), name: z.string().describe("Name of the HS Code"), description: z.string().describe("Description of the HS Code"), customArea: z.string().describe("Custom area associated with the HS Code"), archived: z.boolean().describe("Indicates if the HS Code is archived"), createdById: z.string().nullish(), createdBy: HsCodeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: HsCodeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type HsCodeResponseDTO = z.infer; + +/** + * HsCodePaginationFilterDtoSchema + * @type { object } + * @property { boolean } archived Archived status + * @property { string } search + */ +export const HsCodePaginationFilterDtoSchema = z.object({ archived: z.boolean().describe("Archived status"), search: z.string() }).readonly(); +export type HsCodePaginationFilterDto = z.infer; + +/** + * HsCodeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const HsCodeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type HsCodeLabelFilterDto = z.infer; + +/** + * CreateHsCodeRequestDTOSchema + * @type { object } + * @property { string } name Unique name for the HS Code + * @property { string } description Description of the HS Code + * @property { string } customArea Custom area associated with the HS Code + */ +export const CreateHsCodeRequestDTOSchema = z.object({ name: z.string().describe("Unique name for the HS Code"), description: z.string().describe("Description of the HS Code"), customArea: z.string().describe("Custom area associated with the HS Code") }).readonly(); +export type CreateHsCodeRequestDTO = z.infer; + +/** + * UpdateHsCodeRequestDTOSchema + * @type { object } + * @property { string } name Updated name of the HS Code. + * @property { string } description Updated description of the HS Code. + * @property { string } customArea Updated custom area associated with the HS Code. + */ +export const UpdateHsCodeRequestDTOSchema = z.object({ name: z.string().describe("Updated name of the HS Code."), description: z.string().describe("Updated description of the HS Code."), customArea: z.string().describe("Updated custom area associated with the HS Code.") }).readonly(); +export type UpdateHsCodeRequestDTO = z.infer; + +/** + * HsCodesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const HsCodesPaginateOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type HsCodesPaginateOrderParamEnum = z.infer; +export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema.enum; + +/** + * HsCodesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { HsCodeResponseDTO[] } items + */ +export const HsCodesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(HsCodeResponseDTOSchema).readonly() }).readonly().shape }); +export type HsCodesPaginateResponse = z.infer; + +/** + * HsCodesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const HsCodesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type HsCodesPaginateLabelsOrderParamEnum = z.infer; +export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * HsCodesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const HsCodesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type HsCodesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/hsCodes/hsCodes.queries.ts b/test/generated/next/hsCodes/hsCodes.queries.ts new file mode 100644 index 0000000..87e8809 --- /dev/null +++ b/test/generated/next/hsCodes/hsCodes.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { HsCodesAcl } from "./hsCodes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { HsCodesModels } from "./hsCodes.models"; +import { HsCodesApi } from "./hsCodes.api"; + +export namespace HsCodesQueries { +export const moduleName = QueryModule.HsCodes; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string) => [...keys.all, "/hs-codes", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/hs-codes/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate HS Codes + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(HsCodesAcl.canUsePaginate()); + return HsCodesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate HS Codes + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(HsCodesAcl.canUsePaginate()); + return HsCodesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new HS Code + * @permission Requires `canUseCreate` ability + * @param { HsCodesModels.CreateHsCodeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(HsCodesAcl.canUseCreate()); + return HsCodesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate HS codes with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(HsCodesAcl.canUsePaginateLabels()); + return HsCodesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate HS codes with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(HsCodesAcl.canUsePaginateLabels()); + return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get HS Code Details by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(HsCodesAcl.canUseFindById()); + return HsCodesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update an existing HS Code + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { HsCodesModels.UpdateHsCodeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(HsCodesAcl.canUseUpdate()); + return HsCodesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive an HS Code + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(HsCodesAcl.canUseArchive()); + return HsCodesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive an HS Code + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(HsCodesAcl.canUseUnarchive()); + return HsCodesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/integrationChannels/integrationChannels.acl.ts b/test/generated/next/integrationChannels/integrationChannels.acl.ts new file mode 100644 index 0000000..de4ba2a --- /dev/null +++ b/test/generated/next/integrationChannels/integrationChannels.acl.ts @@ -0,0 +1,108 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace IntegrationChannelsAcl { +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List integration channels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Create", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Read integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useTestConnection` mutation ability. For global ability, omit the object parameter. + * @description Test integration channel connection + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTestConnection` mutation + */ +export const canUseTestConnection = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useListMessages` query ability. For global ability, omit the object parameter. + * @description List integration channel messages + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListMessages` query + */ +export const canUseListMessages = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("IntegrationMessage", object) : "IntegrationMessage" +] as AbilityTuple<"Read", "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, }>; + +} diff --git a/test/generated/next/integrationChannels/integrationChannels.api.ts b/test/generated/next/integrationChannels/integrationChannels.api.ts new file mode 100644 index 0000000..d1996fc --- /dev/null +++ b/test/generated/next/integrationChannels/integrationChannels.api.ts @@ -0,0 +1,87 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; + +export namespace IntegrationChannelsApi { +export const list = (officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, + `/offices/${officeId}/integration-channels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels`, + ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), + config + ) +}; +export const findById = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}`, + config + ) +}; +export const update = (officeId: string, id: string, data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}`, + ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), + config + ) +}; +export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/unarchive`, + undefined, + config + ) +}; +export const testConnection = (officeId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/test-connection`, + undefined, + config + ) +}; +export const listMessages = (officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, + `/offices/${officeId}/integration-channels/${id}/messages`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/next/integrationChannels/integrationChannels.configs.ts b/test/generated/next/integrationChannels/integrationChannels.configs.ts new file mode 100644 index 0000000..1b6f063 --- /dev/null +++ b/test/generated/next/integrationChannels/integrationChannels.configs.ts @@ -0,0 +1,155 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; +import { IntegrationChannelsQueries } from "./integrationChannels.queries"; +import { IntegrationChannelsAcl } from "./integrationChannels.acl"; + +export namespace IntegrationChannelsConfigs { +export const integrationChannelsConfig = { + meta: { + title: "Integration Channels", + }, + readAll: { + acl: IntegrationChannelsAcl.canUseList, + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + paginated: IntegrationChannelsQueries.useList, + infinite: IntegrationChannelsQueries.useListInfinite, + filters: { + schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + options: { + columns: { + id: true, + officeId: true, + businessPartnerId: true, + businessPartner: true, + employeeId: true, + name: true, + archived: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + lastPolledAt: true, + createdAt: true, + createdById: true, + createdBy: true, + updatedAt: true, + updatedById: true, + updatedBy: true, + }, + sortable: IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: IntegrationChannelsAcl.canUseFindById, + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + query: IntegrationChannelsQueries.useFindById, + }, + create: { + acl: IntegrationChannelsAcl.canUseCreate, + schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, + mutation: IntegrationChannelsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, + options: { + inputs: { + businessPartnerId: true, + employeeId: true, + name: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + sftpPassword: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + }, + }, +}) + }, + update: { + acl: IntegrationChannelsAcl.canUseUpdate, + schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, + mutation: IntegrationChannelsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, + options: { + inputs: { + businessPartnerId: true, + employeeId: true, + name: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + sftpPassword: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + }, + }, +}) + }, +}; + +export const messagesConfig = { + meta: { + title: "Messages", + }, + readAll: { + acl: IntegrationChannelsAcl.canUseListMessages, + schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, + paginated: IntegrationChannelsQueries.useListMessages, + infinite: IntegrationChannelsQueries.useListMessagesInfinite, + filters: { + schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, + options: { + inputs: { + direction: true, + format: true, + status: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, + options: { + columns: { + id: true, + integrationChannelId: true, + positionId: true, + positionNumber: true, + direction: true, + format: true, + status: true, + rawContent: true, + fileName: true, + errorMessage: true, + processedAt: true, + sentAt: true, + createdAt: true, + }, + sortable: IntegrationChannelsModels.ListMessagesOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/integrationChannels/integrationChannels.models.ts b/test/generated/next/integrationChannels/integrationChannels.models.ts new file mode 100644 index 0000000..d3f8e74 --- /dev/null +++ b/test/generated/next/integrationChannels/integrationChannels.models.ts @@ -0,0 +1,197 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace IntegrationChannelsModels { +/** + * IntegrationChannelBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const IntegrationChannelBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type IntegrationChannelBusinessPartnerResponseDto = z.infer; + +/** + * IntegrationChannelEmployeeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const IntegrationChannelEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type IntegrationChannelEmployeeResponseDto = z.infer; + +/** + * IntegrationChannelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } businessPartnerId + * @property { IntegrationChannelBusinessPartnerResponseDto } businessPartner + * @property { string } employeeId + * @property { string } name + * @property { boolean } archived + * @property { string } sftpHost + * @property { number } sftpPort + * @property { string } sftpUsername + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes + * @property { string } lastPolledAt + * @property { string } createdAt + * @property { string } createdById + * @property { IntegrationChannelEmployeeResponseDto } createdBy + * @property { string } updatedAt + * @property { string } updatedById + * @property { IntegrationChannelEmployeeResponseDto } updatedBy + */ +export const IntegrationChannelResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), businessPartnerId: z.string(), businessPartner: IntegrationChannelBusinessPartnerResponseDtoSchema, employeeId: z.string(), name: z.string(), archived: z.boolean(), sftpHost: z.string(), sftpPort: z.number(), sftpUsername: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number(), lastPolledAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), createdById: z.string(), createdBy: IntegrationChannelEmployeeResponseDtoSchema, updatedAt: z.iso.datetime({ offset: true }), updatedById: z.string(), updatedBy: IntegrationChannelEmployeeResponseDtoSchema }).readonly(); +export type IntegrationChannelResponseDto = z.infer; + +/** + * IntegrationMessageDirectionEnumSchema + * @type { enum } + */ +export const IntegrationMessageDirectionEnumSchema = z.enum(["Inbound", "Outbound"]); +export type IntegrationMessageDirectionEnum = z.infer; +export const IntegrationMessageDirectionEnum = IntegrationMessageDirectionEnumSchema.enum; + +/** + * IntegrationMessageFormatEnumSchema + * @type { enum } + */ +export const IntegrationMessageFormatEnumSchema = z.enum(["IFTMBF", "IFTMBC"]); +export type IntegrationMessageFormatEnum = z.infer; +export const IntegrationMessageFormatEnum = IntegrationMessageFormatEnumSchema.enum; + +/** + * IntegrationMessageStatusEnumSchema + * @type { enum } + */ +export const IntegrationMessageStatusEnumSchema = z.enum(["Received", "Processed", "Failed", "Sent"]); +export type IntegrationMessageStatusEnum = z.infer; +export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.enum; + +/** + * IntegrationMessageFilterDtoSchema + * @type { object } + * @property { IntegrationMessageDirectionEnum } direction + * @property { IntegrationMessageFormatEnum } format + * @property { IntegrationMessageStatusEnum } status + * @property { string } search + */ +export const IntegrationMessageFilterDtoSchema = z.object({ direction: IntegrationMessageDirectionEnumSchema, format: IntegrationMessageFormatEnumSchema, status: IntegrationMessageStatusEnumSchema, search: z.string() }).readonly(); +export type IntegrationMessageFilterDto = z.infer; + +/** + * IntegrationChannelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const IntegrationChannelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type IntegrationChannelFilterDto = z.infer; + +/** + * CreateIntegrationChannelRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } employeeId + * @property { string } name + * @property { string } sftpHost + * @property { number } sftpPort Minimum: `1`. Maximum: `65535` + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes Minimum: `1` + */ +export const CreateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string(), employeeId: z.string(), name: z.string(), sftpHost: z.string(), sftpPort: z.number().gte(1).lte(65535), sftpUsername: z.string(), sftpPassword: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number().gte(1) }).readonly(); +export type CreateIntegrationChannelRequestDto = z.infer; + +/** + * UpdateIntegrationChannelRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } employeeId + * @property { string } name + * @property { string } sftpHost + * @property { number } sftpPort Minimum: `1`. Maximum: `65535` + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes Minimum: `1` + */ +export const UpdateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string(), employeeId: z.string(), name: z.string(), sftpHost: z.string(), sftpPort: z.number().gte(1).lte(65535), sftpUsername: z.string(), sftpPassword: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number().gte(1) }).readonly(); +export type UpdateIntegrationChannelRequestDto = z.infer; + +/** + * TestConnectionResponseDtoSchema + * @type { object } + * @property { boolean } success + */ +export const TestConnectionResponseDtoSchema = z.object({ success: z.boolean() }).readonly(); +export type TestConnectionResponseDto = z.infer; + +/** + * IntegrationMessageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } integrationChannelId + * @property { string } positionId + * @property { string } positionNumber + * @property { string } direction + * @property { string } format + * @property { string } status + * @property { string } rawContent + * @property { string } fileName + * @property { string } errorMessage + * @property { string } processedAt + * @property { string } sentAt + * @property { string } createdAt + */ +export const IntegrationMessageResponseDtoSchema = z.object({ id: z.string(), integrationChannelId: z.string(), positionId: z.string().nullish(), positionNumber: z.string().nullish(), direction: z.string(), format: z.string(), status: z.string(), rawContent: z.string(), fileName: z.string(), errorMessage: z.string().nullish(), processedAt: z.iso.datetime({ offset: true }).nullish(), sentAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }) }).readonly(); +export type IntegrationMessageResponseDto = z.infer; + +/** + * IntegrationChannelsListOrderParamEnumSchema + * @type { enum } + */ +export const IntegrationChannelsListOrderParamEnumSchema = z.enum(["createdAt", "name", "businessPartner", "lastPolledAt"]); +export type IntegrationChannelsListOrderParamEnum = z.infer; +export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrderParamEnumSchema.enum; + +/** + * IntegrationChannelsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { IntegrationChannelResponseDto[] } items + */ +export const IntegrationChannelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).readonly() }).readonly().shape }); +export type IntegrationChannelsListResponse = z.infer; + +/** + * ListMessagesOrderParamEnumSchema + * @type { enum } + */ +export const ListMessagesOrderParamEnumSchema = z.enum(["createdAt", "status", "direction", "format"]); +export type ListMessagesOrderParamEnum = z.infer; +export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; + +/** + * ListMessagesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { IntegrationMessageResponseDto[] } items + */ +export const ListMessagesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).readonly() }).readonly().shape }); +export type ListMessagesResponse = z.infer; + +} diff --git a/test/generated/next/integrationChannels/integrationChannels.queries.ts b/test/generated/next/integrationChannels/integrationChannels.queries.ts new file mode 100644 index 0000000..9b9b630 --- /dev/null +++ b/test/generated/next/integrationChannels/integrationChannels.queries.ts @@ -0,0 +1,303 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { IntegrationChannelsAcl } from "./integrationChannels.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { IntegrationChannelsModels } from "./integrationChannels.models"; +import { IntegrationChannelsApi } from "./integrationChannels.api"; + +export namespace IntegrationChannelsQueries { +export const moduleName = QueryModule.IntegrationChannels; + +export const keys = { + all: [moduleName] as const, + list: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/integration-channels/:id", officeId, id] as const, + listMessages: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", officeId, id, limit, order, filter, page, cursor] as const, + listMessagesInfinite: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", "infinite", officeId, id, limit, order, filter, cursor] as const, +}; + +/** + * Query `useList` + * @summary List integration channels for an office + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); + return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List integration channels for an office + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); + return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create integration channel + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { IntegrationChannelsModels.CreateIntegrationChannelRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId } )); + return IntegrationChannelsApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get integration channel by id + * @permission Requires `canUseFindById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(officeId, id), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId } )); + return IntegrationChannelsApi.findById(officeId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update integration channel by id + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId } )); + return IntegrationChannelsApi.update(officeId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive integration channel by id + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId } )); + return IntegrationChannelsApi.archive(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive integration channel by id + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId } )); + return IntegrationChannelsApi.unarchive(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useTestConnection` + * @summary Test integration channel SFTP connection + * @permission Requires `canUseTestConnection` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useTestConnection = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId } )); + return IntegrationChannelsApi.testConnection(officeId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListMessages` + * @summary Paginate integration channel messages + * @permission Requires `canUseListMessages` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListMessages = ({ officeId, id, limit, order, filter, page, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListMessagesInfinite + * @summary Paginate integration channel messages + * @permission Requires `canUseListMessages` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListMessagesInfinite = ({ officeId, id, limit, order, filter, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts new file mode 100644 index 0000000..81c9083 --- /dev/null +++ b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InttraOfficeIntegrationAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Read", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +} diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts new file mode 100644 index 0000000..07235c7 --- /dev/null +++ b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts @@ -0,0 +1,30 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; + +export namespace InttraOfficeIntegrationApi { +export const get = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + config + ) +}; +export const generate = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + undefined, + config + ) +}; +export const update = (officeId: string, data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts new file mode 100644 index 0000000..fee95ed --- /dev/null +++ b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts @@ -0,0 +1,52 @@ +import { z } from "zod"; + +export namespace InttraOfficeIntegrationModels { +/** + * OfficeInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } rotatedByUserId + * @property { string } officeId + * @property { string } sftpUsername + * @property { string } sftpPublicKey + * @property { string } partnerCode + * @property { string } ediId + * @property { string } notificationEmail + */ +export const OfficeInttraCredentialsResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string().nullish(), officeId: z.string(), sftpUsername: z.string().nullish(), sftpPublicKey: z.string().nullish(), partnerCode: z.string().nullish(), ediId: z.string().nullish(), notificationEmail: z.string().nullish() }).readonly(); +export type OfficeInttraCredentialsResponseDto = z.infer; + +/** + * GenerateInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } publicKey + * @property { string } rotatedAt + * @property { string } rotatedByUserId + */ +export const GenerateInttraCredentialsResponseDtoSchema = z.object({ publicKey: z.string(), rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }).readonly(); +export type GenerateInttraCredentialsResponseDto = z.infer; + +/** + * UpdateInttraCredentialsRequestDtoSchema + * @type { object } + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } partnerCode + * @property { string } ediId + * @property { string } notificationEmail + */ +export const UpdateInttraCredentialsRequestDtoSchema = z.object({ sftpUsername: z.string(), sftpPassword: z.string(), partnerCode: z.string(), ediId: z.string(), notificationEmail: z.string() }).readonly(); +export type UpdateInttraCredentialsRequestDto = z.infer; + +/** + * UpdateInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } rotatedAt + * @property { string } rotatedByUserId + */ +export const UpdateInttraCredentialsResponseDtoSchema = z.object({ rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }).readonly(); +export type UpdateInttraCredentialsResponseDto = z.infer; + +} diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts new file mode 100644 index 0000000..384b020 --- /dev/null +++ b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts @@ -0,0 +1,93 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InttraOfficeIntegrationAcl } from "./inttraOfficeIntegration.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; +import { InttraOfficeIntegrationApi } from "./inttraOfficeIntegration.api"; + +export namespace InttraOfficeIntegrationQueries { +export const moduleName = QueryModule.InttraOfficeIntegration; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string) => [...keys.all, "/offices/:officeId/inttra/credentials", officeId] as const, +}; + +/** + * Query `useGet` + * @summary Get INTTRA credentials for an office + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId }: { officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId), + queryFn: () => { + checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId } )); + return InttraOfficeIntegrationApi.get(officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useGenerate` + * @summary Generate and persist INTTRA SFTP RSA key pair for an office + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId }) => { + checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId } )); + return InttraOfficeIntegrationApi.generate(officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Manually update INTTRA credentials (username/password/passphrase) + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId } )); + return InttraOfficeIntegrationApi.update(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts new file mode 100644 index 0000000..268366c --- /dev/null +++ b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts @@ -0,0 +1,56 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InttraShippingInstructionMessagesAcl { +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List SI messages + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create SI message + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; + +/** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Get SI message details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update SI message + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; + +} diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts new file mode 100644 index 0000000..0159428 --- /dev/null +++ b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts @@ -0,0 +1,46 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; + +export namespace InttraShippingInstructionMessagesApi { +export const list = (officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + filter: ZodExtended.parse(InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + }, + } + ) +}; +export const create = (officeId: string, positionId: string, shippingInstructionsId: string, data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, + ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), + config + ) +}; +export const getById = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, + config + ) +}; +export const update = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, + ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts new file mode 100644 index 0000000..fbb3b0b --- /dev/null +++ b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts @@ -0,0 +1,88 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; +import { InttraShippingInstructionMessagesQueries } from "./inttraShippingInstructionMessages.queries"; +import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; + +export namespace InttraShippingInstructionMessagesConfigs { +export const messagesConfig = { + meta: { + title: "Messages", + }, + readAll: { + acl: InttraShippingInstructionMessagesAcl.canUseList, + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, + paginated: InttraShippingInstructionMessagesQueries.useList, + infinite: InttraShippingInstructionMessagesQueries.useListInfinite, + filters: { + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, + options: { + inputs: { + status: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, + options: { + columns: { + id: true, + createdAt: true, + updatedAt: true, + shippingInstructionsId: true, + positionId: true, + createdByUserId: true, + status: true, + fileName: true, + sftpPath: true, + sentAt: true, + uploadAttemptCount: true, + lastUploadError: true, + notes: true, + contrlStatus: true, + contrlReceivedAt: true, + contrlRaw: true, + aperakStatus: true, + aperakReceivedAt: true, + aperakRaw: true, + }, + }, +}), + }, + read: { + acl: InttraShippingInstructionMessagesAcl.canUseGetById, + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema, + query: InttraShippingInstructionMessagesQueries.useGetById, + }, + create: { + acl: InttraShippingInstructionMessagesAcl.canUseCreate, + schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, + mutation: InttraShippingInstructionMessagesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, + options: { + inputs: { + isAmendment: true, + }, + }, +}) + }, + update: { + acl: InttraShippingInstructionMessagesAcl.canUseUpdate, + schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, + mutation: InttraShippingInstructionMessagesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, + options: { + inputs: { + notes: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts new file mode 100644 index 0000000..0537827 --- /dev/null +++ b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts @@ -0,0 +1,104 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InttraShippingInstructionMessagesModels { +/** + * InttraShippingInstructionStatusEnumSchema + * @type { enum } + */ +export const InttraShippingInstructionStatusEnumSchema = z.enum(["PendingUpload", "Uploaded", "ContrlAccepted", "ContrlRejected", "AperakAccepted", "AperakRejected", "FailedUpload"]); +export type InttraShippingInstructionStatusEnum = z.infer; +export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStatusEnumSchema.enum; + +/** + * ShippingInstructionMessageListItemResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } shippingInstructionsId + * @property { string } positionId + * @property { string } createdByUserId + * @property { InttraShippingInstructionStatusEnum } status + * @property { string } fileName + * @property { string } sftpPath + * @property { string } sentAt + * @property { number } uploadAttemptCount + * @property { string } lastUploadError + * @property { string } notes + * @property { string } contrlStatus + * @property { string } contrlReceivedAt + * @property { string } contrlRaw + * @property { string } aperakStatus + * @property { string } aperakReceivedAt + * @property { string } aperakRaw + */ +export const ShippingInstructionMessageListItemResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }).readonly(); +export type ShippingInstructionMessageListItemResponseDto = z.infer; + +/** + * ShippingInstructionMessageFilterDtoSchema + * @type { object } + * @property { InttraShippingInstructionStatusEnum[] } status + */ +export const ShippingInstructionMessageFilterDtoSchema = z.object({ status: z.array(InttraShippingInstructionStatusEnumSchema).readonly() }).readonly(); +export type ShippingInstructionMessageFilterDto = z.infer; + +/** + * ShippingInstructionMessageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } shippingInstructionsId + * @property { string } positionId + * @property { string } createdByUserId + * @property { InttraShippingInstructionStatusEnum } status + * @property { object } shippingInstructionSnapshot + * @property { string } renderedRequestPayload + * @property { string } fileName + * @property { string } sftpPath + * @property { string } sentAt + * @property { number } uploadAttemptCount + * @property { string } lastUploadError + * @property { string } notes + * @property { string } contrlStatus + * @property { string } contrlReceivedAt + * @property { string } contrlRaw + * @property { string } aperakStatus + * @property { string } aperakReceivedAt + * @property { string } aperakRaw + */ +export const ShippingInstructionMessageResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, shippingInstructionSnapshot: z.object({}).readonly(), renderedRequestPayload: z.string(), fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }).readonly(); +export type ShippingInstructionMessageResponseDto = z.infer; + +/** + * UpdateShippingInstructionMessageRequestDtoSchema + * @type { object } + * @property { string } notes + */ +export const UpdateShippingInstructionMessageRequestDtoSchema = z.object({ notes: z.string() }).readonly(); +export type UpdateShippingInstructionMessageRequestDto = z.infer; + +/** + * CreateShippingInstructionMessageRequestDtoSchema + * @type { object } + * @property { boolean } isAmendment Default: `false` + */ +export const CreateShippingInstructionMessageRequestDtoSchema = z.object({ isAmendment: z.boolean().default(false) }).readonly(); +export type CreateShippingInstructionMessageRequestDto = z.infer; + +/** + * InttraShippingInstructionMessagesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ShippingInstructionMessageListItemResponseDto[] } items + */ +export const InttraShippingInstructionMessagesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ShippingInstructionMessageListItemResponseDtoSchema).readonly() }).readonly().shape }); +export type InttraShippingInstructionMessagesListResponse = z.infer; + +} diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts new file mode 100644 index 0000000..f1e57ad --- /dev/null +++ b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts @@ -0,0 +1,165 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; +import { InttraShippingInstructionMessagesApi } from "./inttraShippingInstructionMessages.api"; + +export namespace InttraShippingInstructionMessagesQueries { +export const moduleName = QueryModule.InttraShippingInstructionMessages; + +export const keys = { + all: [moduleName] as const, + list: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", officeId, positionId, shippingInstructionsId, limit, page, cursor, filter] as const, + listInfinite: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", "infinite", officeId, positionId, shippingInstructionsId, limit, cursor, filter] as const, + getById: (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages/:messageId", officeId, positionId, shippingInstructionsId, messageId] as const, +}; + +/** + * Query `useList` + * @summary List Inttra shipping instruction messages for a position/BL instructions + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, positionId, shippingInstructionsId, limit, page, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), + queryFn: () => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); + return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List Inttra shipping instruction messages for a position/BL instructions + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, positionId, shippingInstructionsId, limit, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), + queryFn: ({ pageParam }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); + return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, pageParam, cursor, filter, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Inttra shipping instruction message + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.shippingInstructionsId Path parameter + * @param { InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId } )); + return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetById` + * @summary Get Inttra shipping instruction message details + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { string } object.messageId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ officeId, positionId, shippingInstructionsId, messageId }: { officeId: string, positionId: string, shippingInstructionsId: string, messageId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), + queryFn: () => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId } )); + return InttraShippingInstructionMessagesApi.getById(officeId, positionId, shippingInstructionsId, messageId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Inttra shipping instruction message + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.shippingInstructionsId Path parameter + * @param { string } mutation.messageId Path parameter + * @param { InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId } )); + return InttraShippingInstructionMessagesApi.update(officeId, positionId, shippingInstructionsId, messageId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, shippingInstructionsId, messageId } = variables; + const updateKeys = [keys.getById(officeId, positionId, shippingInstructionsId, messageId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/invoicePayments/invoicePayments.acl.ts b/test/generated/next/invoicePayments/invoicePayments.acl.ts new file mode 100644 index 0000000..e3061ca --- /dev/null +++ b/test/generated/next/invoicePayments/invoicePayments.acl.ts @@ -0,0 +1,121 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InvoicePaymentsAcl { +/** + * Use for `useListOfficePayments` query ability. For global ability, omit the object parameter. + * @description List office payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListOfficePayments` query + */ +export const canUseListOfficePayments = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useBulkCreatePayments` mutation ability. For global ability, omit the object parameter. + * @description Bulk create invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useBulkCreatePayments` mutation + */ +export const canUseBulkCreatePayments = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useCalculatePayments` mutation ability. For global ability, omit the object parameter. + * @description Calculate invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCalculatePayments` mutation + */ +export const canUseCalculatePayments = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportOfficePayments` mutation ability. For global ability, omit the object parameter. + * @description Export office invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportOfficePayments` mutation + */ +export const canUseExportOfficePayments = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("InvoicePayment", object) : "InvoicePayment" +] as AbilityTuple<"Export", "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, }>; + +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetPaymentById` query ability. For global ability, omit the object parameter. + * @description Create invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPaymentById` query + */ +export const canUseGetPaymentById = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useDeleteInvoicePayment` mutation ability. For global ability, omit the object parameter. + * @description Delete invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoicePayment` mutation + */ +export const canUseDeleteInvoicePayment = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +} diff --git a/test/generated/next/invoicePayments/invoicePayments.api.ts b/test/generated/next/invoicePayments/invoicePayments.api.ts new file mode 100644 index 0000000..170e7d1 --- /dev/null +++ b/test/generated/next/invoicePayments/invoicePayments.api.ts @@ -0,0 +1,100 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; + +export namespace InvoicePaymentsApi { +export const listOfficePayments = (officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, + `/offices/${officeId}/payments`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const bulkCreatePayments = (officeId: string, data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, + `/offices/${officeId}/payments`, + ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), + config + ) +}; +export const calculatePayments = (officeId: string, data: InvoicePaymentsModels.CalculatePaymentsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, + `/offices/${officeId}/payments/calculate`, + ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), + config + ) +}; +export const exportOfficePayments = (officeId: string, data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payments/exports`, + ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const list = (officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, invoiceId: string, data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments`, + ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), + config + ) +}; +export const getPaymentById = (officeId: string, invoiceId: string, paymentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + config + ) +}; +export const update = (officeId: string, invoiceId: string, paymentId: string, data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), + config + ) +}; +export const deleteInvoicePayment = (officeId: string, invoiceId: string, paymentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/invoicePayments/invoicePayments.configs.ts b/test/generated/next/invoicePayments/invoicePayments.configs.ts new file mode 100644 index 0000000..9f2d9ca --- /dev/null +++ b/test/generated/next/invoicePayments/invoicePayments.configs.ts @@ -0,0 +1,144 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; +import { InvoicePaymentsQueries } from "./invoicePayments.queries"; +import { InvoicePaymentsAcl } from "./invoicePayments.acl"; + +export namespace InvoicePaymentsConfigs { +export const paymentsConfig = { + meta: { + title: "Payments", + }, + readAll: { + acl: InvoicePaymentsAcl.canUseListOfficePayments, + schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, + paginated: InvoicePaymentsQueries.useListOfficePayments, + infinite: InvoicePaymentsQueries.useListOfficePaymentsInfinite, + filters: { + schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, + options: { + inputs: { + search: true, + paymentDate: true, + invoiceIssuingDate: true, + invoiceDirection: true, + createdBy: true, + businessPartner: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, + options: { + columns: { + id: true, + amount: true, + positionNumber: true, + currencyNotation: true, + paymentDate: true, + paymentMethod: true, + comment: true, + createdAt: true, + updatedAt: true, + createdBy: true, + invoice: true, + businessPartner: true, + }, + sortable: InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema, + }, +}), + }, + create: { + acl: InvoicePaymentsAcl.canUseBulkCreatePayments, + schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, + mutation: InvoicePaymentsQueries.useBulkCreatePayments, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, + options: { + inputs: { + paymentDate: true, + invoiceIds: true, + comment: true, + }, + }, +}) + }, +}; + +export const invoicesPaymentsConfig = { + meta: { + title: "Invoices Payments", + }, + readAll: { + acl: InvoicePaymentsAcl.canUseList, + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + paginated: InvoicePaymentsQueries.useList, + infinite: InvoicePaymentsQueries.useListInfinite, + columns: dynamicColumns({ + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + options: { + columns: { + id: true, + amount: true, + currencyNotation: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + bankAccount: true, + comment: true, + createdAt: true, + updatedAt: true, + createdBy: true, + }, + }, +}), + }, + read: { + acl: InvoicePaymentsAcl.canUseGetPaymentById, + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + query: InvoicePaymentsQueries.useGetPaymentById, + }, + create: { + acl: InvoicePaymentsAcl.canUseCreate, + schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, + mutation: InvoicePaymentsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, + options: { + inputs: { + amount: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + comment: true, + }, + }, +}) + }, + update: { + acl: InvoicePaymentsAcl.canUseUpdate, + schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, + mutation: InvoicePaymentsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, + options: { + inputs: { + amount: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + comment: true, + }, + }, +}) + }, + delete: { + acl: InvoicePaymentsAcl.canUseDeleteInvoicePayment, + mutation: InvoicePaymentsQueries.useDeleteInvoicePayment, + }, +}; + +} diff --git a/test/generated/next/invoicePayments/invoicePayments.models.ts b/test/generated/next/invoicePayments/invoicePayments.models.ts new file mode 100644 index 0000000..3605942 --- /dev/null +++ b/test/generated/next/invoicePayments/invoicePayments.models.ts @@ -0,0 +1,292 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicePaymentsModels { +/** + * OfficePaymentTotalAmountsDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ +export const OfficePaymentTotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); +export type OfficePaymentTotalAmountsDto = z.infer; + +/** + * OfficePaymentListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { OfficePaymentTotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const OfficePaymentListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalAmounts: z.array(OfficePaymentTotalAmountsDtoSchema).readonly(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type OfficePaymentListResponseDto = z.infer; + +/** + * OfficePaymentPreviewInvoiceDtoSchema + * @type { object } + * @property { string } id + * @property { string } invoiceNumber + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection + * @property { number } grossAmount + * @property { CommonModels.InvoiceStatusEnum } status + * @property { string } paidOn + * @property { string } issuingDate + */ +export const OfficePaymentPreviewInvoiceDtoSchema = z.object({ id: z.string(), invoiceNumber: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, grossAmount: z.number(), status: CommonModels.InvoiceStatusEnumSchema, paidOn: z.iso.datetime({ offset: true }).nullable(), issuingDate: z.iso.datetime({ offset: true }).nullable() }).readonly(); +export type OfficePaymentPreviewInvoiceDto = z.infer; + +/** + * PaymentMethodEnumSchema + * @type { enum } + */ +export const PaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); +export type PaymentMethodEnum = z.infer; +export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; + +/** + * OfficePaymentPreviewCreatedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type OfficePaymentPreviewCreatedByDto = z.infer; + +/** + * OfficePaymentBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const OfficePaymentBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); +export type OfficePaymentBusinessPartnerDto = z.infer; + +/** + * OfficePaymentPreviewDtoSchema + * @type { object } + * @property { string } id + * @property { number } amount + * @property { string } positionNumber + * @property { string } currencyNotation + * @property { string } paymentDate + * @property { PaymentMethodEnum } paymentMethod + * @property { string } comment + * @property { string } createdAt + * @property { string } updatedAt + * @property { OfficePaymentPreviewCreatedByDto } createdBy + * @property { OfficePaymentPreviewInvoiceDto } invoice + * @property { OfficePaymentBusinessPartnerDto } businessPartner + */ +export const OfficePaymentPreviewDtoSchema = z.object({ id: z.string(), amount: z.number(), positionNumber: z.string(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: OfficePaymentPreviewCreatedByDtoSchema, invoice: OfficePaymentPreviewInvoiceDtoSchema, businessPartner: OfficePaymentBusinessPartnerDtoSchema.nullish() }).readonly(); +export type OfficePaymentPreviewDto = z.infer; + +/** + * OfficeInvoicePaymentFilterDtoSchema + * @type { object } + * @property { string } search Search by invoice number + * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range + * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction + * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) + * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) + */ +export const OfficeInvoicePaymentFilterDtoSchema = z.object({ search: z.string().describe("Search by invoice number"), paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly().describe("Filter by invoice direction"), createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), businessPartner: z.array(z.string()).readonly().describe("Filter by invoice customer/business partner (array of UUIDs)") }).readonly(); +export type OfficeInvoicePaymentFilterDto = z.infer; + +/** + * BulkCreatePaymentBusinessPartnerDtoSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } name Business partner name + * @property { string } paymentDate Payment date applied to the partner invoices + */ +export const BulkCreatePaymentBusinessPartnerDtoSchema = z.object({ id: z.string().describe("Business partner ID"), name: z.string().describe("Business partner name"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date applied to the partner invoices") }).readonly(); +export type BulkCreatePaymentBusinessPartnerDto = z.infer; + +/** + * BulkCreatePaymentsResponseDtoSchema + * @type { object } + * @property { BulkCreatePaymentBusinessPartnerDto[] } businessPartners List of business partners paid in this bulk operation + */ +export const BulkCreatePaymentsResponseDtoSchema = z.object({ businessPartners: z.array(BulkCreatePaymentBusinessPartnerDtoSchema).readonly().describe("List of business partners paid in this bulk operation") }).readonly(); +export type BulkCreatePaymentsResponseDto = z.infer; + +/** + * CalculatePaymentItemDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } businessPartnerName + * @property { number } amount + * @property { string } currency + */ +export const CalculatePaymentItemDtoSchema = z.object({ businessPartnerId: z.string(), businessPartnerName: z.string(), amount: z.number(), currency: z.string() }).readonly(); +export type CalculatePaymentItemDto = z.infer; + +/** + * CalculatePaymentTotalDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currency + */ +export const CalculatePaymentTotalDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); +export type CalculatePaymentTotalDto = z.infer; + +/** + * CalculatePaymentsResponseDtoSchema + * @type { object } + * @property { CalculatePaymentItemDto[] } payments + * @property { CalculatePaymentTotalDto[] } totals + */ +export const CalculatePaymentsResponseDtoSchema = z.object({ payments: z.array(CalculatePaymentItemDtoSchema).readonly(), totals: z.array(CalculatePaymentTotalDtoSchema).readonly() }).readonly(); +export type CalculatePaymentsResponseDto = z.infer; + +/** + * OfficeInvoicePaymentExportFilterDtoSchema + * @type { object } + * @property { string } search Search by invoice number + * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range + * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction + * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) + * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) + */ +export const OfficeInvoicePaymentExportFilterDtoSchema = z.object({ search: z.string().describe("Search by invoice number"), paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly().describe("Filter by invoice direction"), createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), businessPartner: z.array(z.string()).readonly().describe("Filter by invoice customer/business partner (array of UUIDs)") }).readonly(); +export type OfficeInvoicePaymentExportFilterDto = z.infer; + +/** + * OfficeInvoicePaymentExportColumnSchema + * @type { enum } + */ +export const OfficeInvoicePaymentExportColumnSchema = z.enum(["amount", "currency", "paymentDate", "paymentMethod", "comment", "positionNumber", "invoiceNumber", "invoiceDirection", "invoiceStatus", "invoiceIssuingDate", "invoiceGrossAmount", "invoicePaidOn", "businessPartnerName", "createdByName"]); +export type OfficeInvoicePaymentExportColumn = z.infer; +export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumnSchema.enum; + +/** + * OfficeInvoicePaymentExportRequestDtoSchema + * @type { object } + * @property { OfficeInvoicePaymentExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { OfficeInvoicePaymentExportFilterDto } filter + */ +export const OfficeInvoicePaymentExportRequestDtoSchema = z.object({ columns: z.array(OfficeInvoicePaymentExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: OfficeInvoicePaymentExportFilterDtoSchema }).readonly(); +export type OfficeInvoicePaymentExportRequestDto = z.infer; + +/** + * PaymentCreatedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PaymentCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PaymentCreatedByDto = z.infer; + +/** + * PaymentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { number } amount + * @property { string } currencyNotation + * @property { string } paymentDate + * @property { PaymentMethodEnum } paymentMethod + * @property { string } bankAccountId + * @property { string } bankAccount + * @property { string } comment + * @property { string } createdAt + * @property { string } updatedAt + * @property { PaymentCreatedByDto } createdBy + */ +export const PaymentResponseDtoSchema = z.object({ id: z.string(), amount: z.number(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, bankAccountId: z.string().nullish(), bankAccount: z.string().nullish(), comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: PaymentCreatedByDtoSchema.nullish() }).readonly(); +export type PaymentResponseDto = z.infer; + +/** + * PositionInvoicePaymentMethodEnumSchema + * @type { enum } + */ +export const PositionInvoicePaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); +export type PositionInvoicePaymentMethodEnum = z.infer; +export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnumSchema.enum; + +/** + * CreateInvoicePaymentRequestDtoSchema + * @type { object } + * @property { number } amount Payment amount + * @property { string } paymentDate Payment date + * @property { PositionInvoicePaymentMethodEnum } paymentMethod Payment method + * @property { string } bankAccountId Bank account ID + * @property { string } comment Optional comment + */ +export const CreateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number().describe("Payment amount"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), paymentMethod: PositionInvoicePaymentMethodEnumSchema.describe("Payment method"), bankAccountId: z.string().describe("Bank account ID").nullish(), comment: z.string().describe("Optional comment").nullish() }).readonly(); +export type CreateInvoicePaymentRequestDto = z.infer; + +/** + * UpdateInvoicePaymentRequestDtoSchema + * @type { object } + * @property { number } amount Payment amount. Minimum: `0.01` + * @property { string } paymentDate Payment date + * @property { string } paymentMethod Payment method + * @property { string } bankAccountId Bank account ID + * @property { string } comment Payment comment + */ +export const UpdateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number().gte(0.01).describe("Payment amount"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), paymentMethod: PaymentMethodEnumSchema.describe("Payment method"), bankAccountId: z.string().describe("Bank account ID"), comment: z.string().describe("Payment comment") }).readonly(); +export type UpdateInvoicePaymentRequestDto = z.infer; + +/** + * BulkCreatePaymentsRequestDtoSchema + * @type { object } + * @property { string } paymentDate Payment date for all payments + * @property { string[] } invoiceIds List of invoice IDs to create payments for. Min Items: `1` + * @property { string } comment + */ +export const BulkCreatePaymentsRequestDtoSchema = z.object({ paymentDate: z.iso.datetime({ offset: true }).describe("Payment date for all payments"), invoiceIds: z.array(z.string()).readonly().min(1).describe("List of invoice IDs to create payments for"), comment: z.string().nullish() }).readonly(); +export type BulkCreatePaymentsRequestDto = z.infer; + +/** + * CalculatePaymentsRequestDtoSchema + * @type { object } + * @property { string[] } invoiceIds Invoice IDs (UUID v4). Min Items: `1`. Max Items: `30` + */ +export const CalculatePaymentsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).readonly().min(1).max(30).describe("Invoice IDs (UUID v4)") }).readonly(); +export type CalculatePaymentsRequestDto = z.infer; + +/** + * ListOfficePaymentsOrderParamEnumSchema + * @type { enum } + */ +export const ListOfficePaymentsOrderParamEnumSchema = z.enum(["paymentDate", "amount", "paymentMethod", "comment", "createdAt", "updatedAt", "currencyNotation", "createdByName", "invoiceNumber", "invoiceDirection", "invoiceGrossAmount", "invoiceStatus", "invoicePaidOn", "invoiceIssuingDate"]); +export type ListOfficePaymentsOrderParamEnum = z.infer; +export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnumSchema.enum; + +/** + * ListOfficePaymentsResponseSchema + * @type { object } + * @property { OfficePaymentTotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficePaymentPreviewDto[] } items + */ +export const ListOfficePaymentsResponseSchema = z.object({ ...OfficePaymentListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).readonly() }).readonly().shape }); +export type ListOfficePaymentsResponse = z.infer; + +/** + * InvoicePaymentsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PaymentResponseDto[] } items + */ +export const InvoicePaymentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentResponseDtoSchema).readonly() }).readonly().shape }); +export type InvoicePaymentsListResponse = z.infer; + +} diff --git a/test/generated/next/invoicePayments/invoicePayments.queries.ts b/test/generated/next/invoicePayments/invoicePayments.queries.ts new file mode 100644 index 0000000..228c4ea --- /dev/null +++ b/test/generated/next/invoicePayments/invoicePayments.queries.ts @@ -0,0 +1,326 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InvoicePaymentsAcl } from "./invoicePayments.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InvoicePaymentsModels } from "./invoicePayments.models"; +import { InvoicePaymentsApi } from "./invoicePayments.api"; + +export namespace InvoicePaymentsQueries { +export const moduleName = QueryModule.InvoicePayments; + +export const keys = { + all: [moduleName] as const, + listOfficePayments: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payments", officeId, limit, order, filter, page, cursor] as const, + listOfficePaymentsInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/payments", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, invoiceId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", officeId, invoiceId, limit, page, cursor] as const, + listInfinite: (officeId: string, invoiceId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", "infinite", officeId, invoiceId, limit, cursor] as const, + getPaymentById: (officeId: string, invoiceId: string, paymentId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments/:paymentId", officeId, invoiceId, paymentId] as const, +}; + +/** + * Query `useListOfficePayments` + * @summary List all payments for an office + * @permission Requires `canUseListOfficePayments` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` + * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListOfficePayments = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListOfficePaymentsInfinite + * @summary List all payments for an office + * @permission Requires `canUseListOfficePayments` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` + * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListOfficePaymentsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useBulkCreatePayments` + * @summary Bulk create payments for multiple invoices + * @permission Requires `canUseBulkCreatePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.BulkCreatePaymentsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useBulkCreatePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId } )); + return InvoicePaymentsApi.bulkCreatePayments(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCalculatePayments` + * @summary Calculate grouped payments for provided invoices + * @permission Requires `canUseCalculatePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.CalculatePaymentsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useCalculatePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId } )); + return InvoicePaymentsApi.calculatePayments(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useExportOfficePayments` - recommended when file should not be cached + * @summary Export office invoice payments to Excel + * @permission Requires `canUseExportOfficePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportOfficePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId } )); + return InvoicePaymentsApi.exportOfficePayments(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useList` + * @summary List payments for an invoice + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, invoiceId, limit, page, cursor }: { officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, invoiceId, limit, page, cursor), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); + return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List payments for an invoice + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, invoiceId, limit, cursor }: { officeId: string, invoiceId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); + return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a payment for an invoice + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicePaymentsModels.CreateInvoicePaymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId } )); + return InvoicePaymentsApi.create(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetPaymentById` + * @summary Get a payment by ID + * @permission Requires `canUseGetPaymentById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { string } object.paymentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetPaymentById = ({ officeId, invoiceId, paymentId }: { officeId: string, invoiceId: string, paymentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId } )); + return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update a payment + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.paymentId Path parameter + * @param { InvoicePaymentsModels.UpdateInvoicePaymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, paymentId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId } )); + return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId, paymentId } = variables; + const updateKeys = [keys.getPaymentById(officeId, invoiceId, paymentId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteInvoicePayment` + * @summary Delete a payment + * @permission Requires `canUseDeleteInvoicePayment` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.paymentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteInvoicePayment = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, paymentId }) => { + checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId } )); + return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/invoices/invoices.acl.ts b/test/generated/next/invoices/invoices.acl.ts new file mode 100644 index 0000000..65b9c24 --- /dev/null +++ b/test/generated/next/invoices/invoices.acl.ts @@ -0,0 +1,407 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace InvoicesAcl { +/** + * Use for `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download invoices as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation + */ +export const canUseGetInvoicesEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useFind` query ability. For global ability, omit the object parameter. + * @description List invoices for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query + */ +export const canUseFind = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useChangeIncomingCustomer` mutation ability. For global ability, omit the object parameter. + * @description PositionInvoice Fix + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useChangeIncomingCustomer` mutation + */ +export const canUseChangeIncomingCustomer = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useFindByOffice` query ability. For global ability, omit the object parameter. + * @description List invoices for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByOffice` query + */ +export const canUseFindByOffice = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useCreateDraft` mutation ability. For global ability, omit the object parameter. + * @description Create invoice for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDraft` mutation + */ +export const canUseCreateDraft = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Create", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportInvoices` mutation ability. For global ability, omit the object parameter. + * @description Export invoices for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportInvoices` mutation + */ +export const canUseExportInvoices = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportCharges` mutation ability. For global ability, omit the object parameter. + * @description Export invoice charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportCharges` mutation + */ +export const canUseExportCharges = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetUnCharges` query ability. For global ability, omit the object parameter. + * @description List uninvoiced charges for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetUnCharges` query + */ +export const canUseGetUnCharges = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ +export const canUseListAvailablePartnersFor = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetOfficeUnCharges` query ability. For global ability, omit the object parameter. + * @description List uninvoiced charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetOfficeUnCharges` query + */ +export const canUseGetOfficeUnCharges = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportUnCharges` mutation ability. For global ability, omit the object parameter. + * @description Export uninvoiced charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportUnCharges` mutation + */ +export const canUseExportUnCharges = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("UninvoicedCharge", object) : "UninvoicedCharge" +] as AbilityTuple<"Export", "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, }>; + +/** + * Use for `useCreateDirect` mutation ability. For global ability, omit the object parameter. + * @description Create direct invoice for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDirect` mutation + */ +export const canUseCreateDirect = ( + object?: { officeId: string, } +) => [ + "CreateDirectInvoice", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useAddChargeToDirect` mutation ability. For global ability, omit the object parameter. + * @description Add charge to direct invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddChargeToDirect` mutation + */ +export const canUseAddChargeToDirect = ( + object?: { officeId: string, } +) => [ + "UpdateDirectInvoice", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdateCharges` mutation ability. For global ability, omit the object parameter. + * @description Update invoice charges + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCharges` mutation + */ +export const canUseUpdateCharges = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useRemoveChargeFromDirect` mutation ability. For global ability, omit the object parameter. + * @description Remove charge from direct invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRemoveChargeFromDirect` mutation + */ +export const canUseRemoveChargeFromDirect = ( + object?: { officeId: string, } +) => [ + "UpdateDirectInvoice", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetDetail` query ability. For global ability, omit the object parameter. + * @description Read invoice details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDetail` query + */ +export const canUseGetDetail = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useDeleteInvoice` mutation ability. For global ability, omit the object parameter. + * @description Delete invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoice` mutation + */ +export const canUseDeleteInvoice = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Delete", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useFix` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice accounting issues + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFix` mutation + */ +export const canUseFix = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdateIssuedVatRules` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice VAT rules + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedVatRules` mutation + */ +export const canUseUpdateIssuedVatRules = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdateIssuedCharges` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice charges + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedCharges` mutation + */ +export const canUseUpdateIssuedCharges = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useIssue` mutation ability. For global ability, omit the object parameter. + * @description Issue invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssue` mutation + */ +export const canUseIssue = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useReportHungarian` mutation ability. For global ability, omit the object parameter. + * @description Report invoice to Hungarian tax authority + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReportHungarian` mutation + */ +export const canUseReportHungarian = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGenerateIncoming` mutation ability. For global ability, omit the object parameter. + * @description Generate incoming invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIncoming` mutation + */ +export const canUseGenerateIncoming = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useRegister` mutation ability. For global ability, omit the object parameter. + * @description Register invoice for bookkeeping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRegister` mutation + */ +export const canUseRegister = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetPreview` query or `useGetPreviewMutation` mutation ability. For global ability, omit the object parameter. + * @description View invoice preview + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` query or `useGetPreviewMutation` mutation + */ +export const canUseGetPreview = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download invoice as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation + */ +export const canUseGetInvoiceEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `usePrepareDocumentUpload` mutation ability. For global ability, omit the object parameter. + * @description Upload invoice document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareDocumentUpload` mutation + */ +export const canUsePrepareDocumentUpload = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ +export const canUseCancel = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useIssueCreditNote` mutation ability. For global ability, omit the object parameter. + * @description Issue credit note invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueCreditNote` mutation + */ +export const canUseIssueCreditNote = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +} diff --git a/test/generated/next/invoices/invoices.api.ts b/test/generated/next/invoices/invoices.api.ts new file mode 100644 index 0000000..336241b --- /dev/null +++ b/test/generated/next/invoices/invoices.api.ts @@ -0,0 +1,349 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicesApi { +export const getInvoicesEml = (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/eml`, + { + ...config, + params: { + invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { type: "query", name: "invoiceIds" }), + }, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const find = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoicesFindResponseSchema }, + `/offices/${officeId}/positions/${positionId}/invoices`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const changeIncomingCustomer = (officeId: string, invoiceId: string, data: InvoicesModels.ChangeInvoiceCustomerRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/customer`, + ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), + config + ) +}; +export const findByOffice = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.FindByOfficeResponseSchema }, + `/offices/${officeId}/invoices`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createDraft = (officeId: string, data: InvoicesModels.CreateDraftInvoiceRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices`, + ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), + config + ) +}; +export const exportInvoices = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/exports`, + ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const exportCharges = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/charges/exports`, + ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getUnCharges = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.GetUnChargesResponseSchema }, + `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listAvailablePartnersFor = (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/invoices/${invoiceId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), + }, + } + ) +}; +export const getOfficeUnCharges = (officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, + `/offices/${officeId}/uninvoiced-charges`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const exportUnCharges = (officeId: string, data: InvoicesModels.UninvoicedChargesExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/uninvoiced-charges/exports`, + ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const createDirect = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/direct-invoices`, + undefined, + config + ) +}; +export const addChargeToDirect = (officeId: string, invoiceId: string, data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges`, + ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), + config + ) +}; +export const updateCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceChargesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges`, + ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), + config + ) +}; +export const removeChargeFromDirect = (officeId: string, invoiceId: string, chargeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, + undefined, + config + ) +}; +export const getDetail = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}`, + config + ) +}; +export const update = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}`, + ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), + config + ) +}; +export const deleteInvoice = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}`, + undefined, + config + ) +}; +export const fix = (officeId: string, invoiceId: string, data: InvoicesModels.FixInvoiceRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix`, + ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), + config + ) +}; +export const generate = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/document`, + undefined, + config + ) +}; +export const updateIssuedVatRules = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, + ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), + config + ) +}; +export const updateIssuedCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, + ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), + config + ) +}; +export const issue = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/issue`, + undefined, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const reportHungarian = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, + undefined, + config + ) +}; +export const generateIncoming = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, + undefined, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const register = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/register`, + undefined, + config + ) +}; +export const getPreview = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getInvoiceEml = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/eml`, + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const prepareDocumentUpload = (officeId: string, invoiceId: string, data: InvoicesModels.PrepareUploadRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/upload-document`, + ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), + config + ) +}; +export const cancel = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/cancel`, + undefined, + config + ) +}; +export const issueCreditNote = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/invoices/invoices.configs.ts b/test/generated/next/invoices/invoices.configs.ts new file mode 100644 index 0000000..3443bf9 --- /dev/null +++ b/test/generated/next/invoices/invoices.configs.ts @@ -0,0 +1,322 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { InvoicesQueries } from "./invoices.queries"; +import { InvoicesAcl } from "./invoices.acl"; + +export namespace InvoicesConfigs { +export const invoicesConfig = { + meta: { + title: "Invoices", + }, + readAll: { + acl: InvoicesAcl.canUseFindByOffice, + schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, + paginated: InvoicesQueries.useFindByOffice, + infinite: InvoicesQueries.useFindByOfficeInfinite, + filters: { + schema: CommonModels.OfficeInvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CommonModels.OfficeInvoiceFilterDtoSchema, + options: { + inputs: { + search: true, + issuingDate: true, + serviceDate: true, + invoiceDirection: true, + invoiceType: true, + collective: true, + amountMin: true, + amountMax: true, + currencyNotation: true, + vatRule: true, + dueDate: true, + status: true, + receiver: true, + receiverCountry: true, + salesRep: true, + positionNumbersString: true, + positionNumbers: true, + invoiceNumbersString: true, + invoiceNumbers: true, + bookkeepingExportStatus: true, + dunningBlock: true, + invoiceInReview: true, + isInvoiceOk: true, + isVatOk: true, + invoiceNumberMin: true, + invoiceNumberMax: true, + internalNumberMin: true, + internalNumberMax: true, + externalSystemId: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + creditorId: true, + debtorId: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, + options: { + columns: { + id: true, + createdAt: true, + invoiceNumber: true, + invoiceDirection: true, + issuingDate: true, + invoiceType: true, + collective: true, + serviceDate: true, + internalNumber: true, + reference: true, + amount: true, + netAmount: true, + tax: true, + currency: true, + dueDate: true, + status: true, + payDate: true, + paidAmount: true, + position: true, + receiver: true, + receiverCountry: true, + clerk: true, + cancelled: true, + ok: true, + isExportedToBookkeeping: true, + dunningBlock: true, + invoiceInReview: true, + vatOk: true, + comments: true, + paymentComment: true, + creditorId: true, + debtorId: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vatRules: true, + }, + sortable: InvoicesModels.FindByOfficeOrderParamEnumSchema, + }, +}), + }, + read: { + acl: InvoicesAcl.canUseGetDetail, + schema: InvoicesModels.InvoiceDetailDtoSchema, + query: InvoicesQueries.useGetDetail, + }, + create: { + acl: InvoicesAcl.canUseCreateDraft, + schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, + mutation: InvoicesQueries.useCreateDraft, + inputDefs: dynamicInputs({ + schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, + options: { + inputs: { + chargeItemIds: true, + invoiceType: true, + customerId: true, + direction: true, + }, + }, +}) + }, + update: { + acl: InvoicesAcl.canUseUpdate, + schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, + mutation: InvoicesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, + options: { + inputs: { + issuingDate: true, + receiptDate: true, + serviceDate: true, + serviceDateUntil: true, + dueDate: true, + invoiceNumber: true, + internalNumber: true, + paymentTermDays: true, + paymentTermType: true, + serviceRecipientId: true, + bankAccountId: true, + remarks: true, + language: true, + showPaymentInstructions: true, + customer: true, + salesRepId: true, + currencyNotation: true, + exchangeRate: true, + }, + }, +}) + }, + delete: { + acl: InvoicesAcl.canUseDeleteInvoice, + mutation: InvoicesQueries.useDeleteInvoice, + }, +}; + +export const uninvoicedChargesConfig = { + meta: { + title: "Uninvoiced Charges", + }, + readAll: { + acl: InvoicesAcl.canUseGetOfficeUnCharges, + schema: InvoicesModels.UninvoicedChargeDtoSchema, + paginated: InvoicesQueries.useGetOfficeUnCharges, + infinite: InvoicesQueries.useGetOfficeUnChargesInfinite, + filters: { + schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, + options: { + inputs: { + direction: true, + chargeItemId: true, + receiverIds: true, + positionIds: true, + chargeTypeIds: true, + serviceDate: true, + currencies: true, + vatRuleIds: true, + employeeIds: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InvoicesModels.UninvoicedChargeDtoSchema, + options: { + columns: { + chargeItemId: true, + invoiceDirection: true, + receiver: true, + position: true, + chargeType: true, + currencyNotation: true, + amount: true, + amountInOfficeCurrency: true, + officeCurrency: true, + exchangeRate: true, + vatRule: true, + serviceDate: true, + status: true, + missingInformation: true, + employee: true, + }, + sortable: InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema, + }, +}), + }, +}; + +export const positionsInvoicesConfig = { + meta: { + title: "Positions Invoices", + }, + readAll: { + acl: InvoicesAcl.canUseFind, + schema: InvoicesModels.InvoicePreviewDtoSchema, + paginated: InvoicesQueries.useFind, + infinite: InvoicesQueries.useFindInfinite, + filters: { + schema: InvoicesModels.InvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.InvoiceFilterDtoSchema, + options: { + inputs: { + status: true, + direction: true, + receiver: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InvoicesModels.InvoicePreviewDtoSchema, + options: { + columns: { + id: true, + invoiceDirection: true, + invoiceType: true, + invoiceNumber: true, + issuingDate: true, + amount: true, + currencyNotation: true, + status: true, + isExportedToBookkeeping: true, + internalNumber: true, + receiver: true, + representative: true, + collective: true, + creditNote: true, + cancelledInvoice: true, + }, + sortable: InvoicesModels.InvoicesFindOrderParamEnumSchema, + }, +}), + }, +}; + +export const positionsUninvoicedChargesConfig = { + meta: { + title: "Positions Uninvoiced Charges", + }, + readAll: { + acl: InvoicesAcl.canUseGetUnCharges, + schema: InvoicesModels.UninvoicedChargeDtoSchema, + paginated: InvoicesQueries.useGetUnCharges, + infinite: InvoicesQueries.useGetUnChargesInfinite, + filters: { + schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, + options: { + inputs: { + direction: true, + chargeItemId: true, + receiverId: true, + chargeTypeId: true, + serviceDate: true, + currency: true, + vatRuleId: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: InvoicesModels.UninvoicedChargeDtoSchema, + options: { + columns: { + chargeItemId: true, + invoiceDirection: true, + receiver: true, + position: true, + chargeType: true, + currencyNotation: true, + amount: true, + amountInOfficeCurrency: true, + officeCurrency: true, + exchangeRate: true, + vatRule: true, + serviceDate: true, + status: true, + missingInformation: true, + employee: true, + }, + sortable: InvoicesModels.GetUnChargesOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/invoices/invoices.models.ts b/test/generated/next/invoices/invoices.models.ts new file mode 100644 index 0000000..08cb405 --- /dev/null +++ b/test/generated/next/invoices/invoices.models.ts @@ -0,0 +1,988 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace InvoicesModels { +/** + * InvoiceBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + */ +export const InvoiceBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(); +export type InvoiceBusinessPartnerResponseDto = z.infer; + +/** + * InvoiceEmployeeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoiceEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvoiceEmployeeResponseDto = z.infer; + +/** + * InvoiceRelatedInvoiceResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } internalNumber + */ +export const InvoiceRelatedInvoiceResponseDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }).readonly(); +export type InvoiceRelatedInvoiceResponseDto = z.infer; + +/** + * InvoicePreviewDtoSchema + * @type { object } + * @property { string } id + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection + * @property { CommonModels.InvoiceTypeEnum } invoiceType + * @property { string } invoiceNumber + * @property { string } issuingDate + * @property { number } amount + * @property { string } currencyNotation + * @property { CommonModels.InvoiceStatusEnum } status + * @property { boolean } isExportedToBookkeeping + * @property { string } internalNumber + * @property { InvoiceBusinessPartnerResponseDto } receiver + * @property { InvoiceEmployeeResponseDto } representative + * @property { boolean } collective + * @property { InvoiceRelatedInvoiceResponseDto } creditNote + * @property { InvoiceRelatedInvoiceResponseDto } cancelledInvoice + */ +export const InvoicePreviewDtoSchema = z.object({ id: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullable(), issuingDate: z.iso.datetime({ offset: true }).nullish(), amount: z.number(), currencyNotation: z.string(), status: CommonModels.InvoiceStatusEnumSchema, isExportedToBookkeeping: z.boolean(), internalNumber: z.string().nullish(), receiver: InvoiceBusinessPartnerResponseDtoSchema.nullish(), representative: InvoiceEmployeeResponseDtoSchema.nullish(), collective: z.boolean(), creditNote: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), cancelledInvoice: InvoiceRelatedInvoiceResponseDtoSchema.nullish() }).readonly(); +export type InvoicePreviewDto = z.infer; + +/** + * InvoicePartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const InvoicePartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); +export type InvoicePartnerDto = z.infer; + +/** + * InvoicePositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } transportType + * @property { string } ourReference + * @property { string } finalDestination + * @property { InvoicePartnerDto } shipper + * @property { InvoicePartnerDto } consignee + * @property { string } vessel + * @property { string } emptyPickup + * @property { string } loadingAddress + * @property { string } portOfLoading + * @property { string } portOfDischarge + * @property { string } carrierBl + * @property { string } houseBillOfLadingNumber + * @property { string } masterAWB + * @property { string } hawbNumber + * @property { string } flightNo + * @property { string } pickupAddress + * @property { string } originAirport + * @property { string } destinationAirport + * @property { string } originLocation + * @property { string } destinationLocation + * @property { string } dateOfDeparture + * @property { string } dateOfArrival + */ +export const InvoicePositionDtoSchema = z.object({ id: z.string(), number: z.string(), transportType: z.string(), ourReference: z.string().nullish(), finalDestination: z.string().nullish(), shipper: InvoicePartnerDtoSchema.nullish(), consignee: InvoicePartnerDtoSchema.nullish(), vessel: z.string().nullish(), emptyPickup: z.string().nullish(), loadingAddress: z.string().nullish(), portOfLoading: z.string().nullish(), portOfDischarge: z.string().nullish(), carrierBl: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterAWB: z.string().nullish(), hawbNumber: z.string().nullish(), flightNo: z.string().nullish(), pickupAddress: z.string().nullish(), originAirport: z.string().nullish(), destinationAirport: z.string().nullish(), originLocation: z.string().nullish(), destinationLocation: z.string().nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type InvoicePositionDto = z.infer; + +/** + * InvoiceChargeTypeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvoiceChargeTypeDto = z.infer; + +/** + * InvoiceVatRuleDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { number } rate + */ +export const InvoiceVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }).readonly(); +export type InvoiceVatRuleDto = z.infer; + +/** + * InvoiceFinanceLineDtoSchema + * @type { object } + * @property { string } positionChargeItemId + * @property { InvoiceChargeTypeDto } chargeType + * @property { string } additionalText + * @property { number } quantity + * @property { number } netAmount + * @property { number } grossAmount + * @property { number } sumInInvoiceCurrency + * @property { number } sumInOfficeCurrency + * @property { string } currencyNotation + * @property { number } exchangeRate + * @property { InvoiceVatRuleDto } vatRule + * @property { number } exchangedNetAmount + * @property { string } positionNumber + * @property { string } positionId + * @property { string } outgoingInvoiceId + * @property { string } registeredInvoiceId + */ +export const InvoiceFinanceLineDtoSchema = z.object({ positionChargeItemId: z.string(), chargeType: InvoiceChargeTypeDtoSchema, additionalText: z.string(), quantity: z.number(), netAmount: z.number(), grossAmount: z.number(), sumInInvoiceCurrency: z.number().nullish(), sumInOfficeCurrency: z.number().nullish(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), vatRule: InvoiceVatRuleDtoSchema, exchangedNetAmount: z.number().nullish(), positionNumber: z.string().nullish(), positionId: z.string().nullish(), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish() }).readonly(); +export type InvoiceFinanceLineDto = z.infer; + +/** + * InvoiceConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl + * @property { string } headerImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ +export const InvoiceConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); +export type InvoiceConfigDto = z.infer; + +/** + * InvoiceCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { string } address + * @property { string } vatNumber + * @property { string } reference + * @property { string } contact + * @property { string } partnerRegistrationNumber + */ +export const InvoiceCustomerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string().nullish(), label: z.string().nullish(), address: z.string().nullish(), vatNumber: z.string(), reference: z.string().nullish(), contact: z.string().nullish(), partnerRegistrationNumber: z.string().nullish() }).readonly(); +export type InvoiceCustomerDto = z.infer; + +/** + * InvoiceOfficeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvoiceOfficeDto = z.infer; + +/** + * InvoiceSalesRepDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } phoneNumber + */ +export const InvoiceSalesRepDtoSchema = z.object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }).readonly(); +export type InvoiceSalesRepDto = z.infer; + +/** + * InvoiceServiceRecipientDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } address + * @property { string } vatNumber + * @property { string } partnerRegistrationNumber + */ +export const InvoiceServiceRecipientDtoSchema = z.object({ id: z.string(), name: z.string(), address: z.string().nullish(), vatNumber: z.string(), partnerRegistrationNumber: z.string().nullish() }).readonly(); +export type InvoiceServiceRecipientDto = z.infer; + +/** + * InvoiceBankAccountDtoSchema + * @type { object } + * @property { string } id + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + * @property { string } name + * @property { boolean } useFooterOnInvoice + * @property { object } footer + * @property { string } footer.mediaUrl + */ +export const InvoiceBankAccountDtoSchema = z.object({ id: z.string(), displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string(), name: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).readonly().nullish() }).readonly(); +export type InvoiceBankAccountDto = z.infer; + +/** + * InvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const InvoiceRemarksDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export type InvoiceRemarksDto = z.infer; + +/** + * InvoiceVatLineDtoSchema + * @type { object } + * @property { string } vatRuleId ID of the VAT rule + * @property { string } name Name of the VAT rule + * @property { string } printNumber Reference numerical string for vat rules + * @property { string } matchCode Match code of the VAT rule + * @property { number } vatPercentage The actual VAT rate (e.g., 19 for 19%) + * @property { number } netAmount Sum of net amounts from financeLines using this vatRuleId + * @property { number } vatAmount Calculated total VAT for this rate (netAmount * vatPercentage / 100) + * @property { number } grossAmount Sum of netAmount + vatAmount for this rate + * @property { number } vatAmountInOfficeCurrency + * @property { number } netAmountInOfficeCurrency + * @property { number } grossAmountInOfficeCurrency + */ +export const InvoiceVatLineDtoSchema = z.object({ vatRuleId: z.string().describe("ID of the VAT rule"), name: z.string().describe("Name of the VAT rule"), printNumber: z.string().describe("Reference numerical string for vat rules"), matchCode: z.string().describe("Match code of the VAT rule"), vatPercentage: z.number().describe("The actual VAT rate (e.g., 19 for 19%)"), netAmount: z.number().describe("Sum of net amounts from financeLines using this vatRuleId"), vatAmount: z.number().describe("Calculated total VAT for this rate (netAmount * vatPercentage / 100)"), grossAmount: z.number().describe("Sum of netAmount + vatAmount for this rate"), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish() }).readonly(); +export type InvoiceVatLineDto = z.infer; + +/** + * RelatedInvoiceDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } internalNumber + */ +export const RelatedInvoiceDetailDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }).readonly(); +export type RelatedInvoiceDetailDto = z.infer; + +/** + * InvoiceLanguageEnumSchema + * @type { enum } + */ +export const InvoiceLanguageEnumSchema = z.enum(["en", "de", "sl", "hu", "cs"]); +export type InvoiceLanguageEnum = z.infer; +export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; + +/** + * InvoiceDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } rootFolderId + * @property { string } invoiceDirection + * @property { string } invoiceType + * @property { string } invoiceNumber + * @property { string } costCenter + * @property { string } status + * @property { string } language + * @property { boolean } isVatOk + * @property { boolean } isInvoiceOk + * @property { string } issuingDate + * @property { string } receiptDate + * @property { string } serviceDate + * @property { string } serviceDateUntil + * @property { string } dueDate + * @property { string } internalNumber + * @property { boolean } isExportedToBookkeeping + * @property { string } sentAt + * @property { string } creditNoteId + * @property { string } draftCreditNoteId + * @property { string } cancelledInvoiceId + * @property { string } uploadedDocumentUrl + * @property { InvoiceCustomerDto } customer + * @property { string } customerNumber + * @property { string } customerNameOverride + * @property { string } customerReferenceOverride + * @property { string } customerContactOverride + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { InvoicePositionDto } position + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { InvoiceOfficeDto } salesOffice + * @property { InvoiceSalesRepDto } salesRep + * @property { number } totalNet + * @property { number } totalVat + * @property { number } totalGross + * @property { string } currencyNotation + * @property { number } exchangeRate + * @property { number } paymentTermDays + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { InvoiceServiceRecipientDto } serviceRecipient + * @property { boolean } showPaymentInstructions + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { string } comments + * @property { InvoiceBankAccountDto } bankAccount + * @property { InvoiceFinanceLineDto[] } financeLines + * @property { InvoiceRemarksDto } remarks + * @property { InvoiceVatLineDto[] } vatLines + * @property { InvoiceConfigDto } config + * @property { RelatedInvoiceDetailDto } creditNote + * @property { RelatedInvoiceDetailDto } draftCreditNote + * @property { RelatedInvoiceDetailDto } cancelledInvoice + * @property { string } officeCurrencyNotation + * @property { string } inverseCurrencyNotation + * @property { number } inverseExchangeRate + * @property { boolean } requiresSpecialTablePresentation + * @property { number } paidAmount + * @property { number } outstandingAmount + * @property { string } paidOn + * @property { boolean } isIssued + * @property { number } grossAmountInOfficeCurrency + * @property { string } createdAt + */ +export const InvoiceDetailDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullish(), costCenter: z.string().nullish(), status: CommonModels.InvoiceStatusEnumSchema, language: InvoiceLanguageEnumSchema, isVatOk: z.boolean(), isInvoiceOk: z.boolean(), issuingDate: z.iso.datetime({ offset: true }).nullish(), receiptDate: z.iso.datetime({ offset: true }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), isExportedToBookkeeping: z.boolean(), sentAt: z.iso.datetime({ offset: true }).nullish(), creditNoteId: z.string().nullish(), draftCreditNoteId: z.string().nullish(), cancelledInvoiceId: z.string().nullish(), uploadedDocumentUrl: z.string().nullish(), customer: InvoiceCustomerDtoSchema.nullish(), customerNumber: z.string().nullish(), customerNameOverride: z.string().nullish(), customerReferenceOverride: z.string().nullish(), customerContactOverride: z.string().nullish(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), position: InvoicePositionDtoSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesOffice: InvoiceOfficeDtoSchema, salesRep: InvoiceSalesRepDtoSchema, totalNet: z.number(), totalVat: z.number().nullish(), totalGross: z.number(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), paymentTermDays: z.number().nullish(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), showPaymentInstructions: z.boolean().nullish(), dunningBlock: z.boolean().nullish(), invoiceInReview: z.boolean().nullish(), comments: z.string().nullish(), bankAccount: InvoiceBankAccountDtoSchema.nullish(), financeLines: z.array(InvoiceFinanceLineDtoSchema).readonly(), remarks: InvoiceRemarksDtoSchema.nullish(), vatLines: z.array(InvoiceVatLineDtoSchema).readonly(), config: InvoiceConfigDtoSchema.nullish(), creditNote: RelatedInvoiceDetailDtoSchema.nullish(), draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), officeCurrencyNotation: z.string().nullish(), inverseCurrencyNotation: z.string().nullish(), inverseExchangeRate: z.number().nullish(), requiresSpecialTablePresentation: z.boolean().nullish(), paidAmount: z.number(), outstandingAmount: z.number(), paidOn: z.iso.datetime({ offset: true }).nullish(), isIssued: z.boolean(), grossAmountInOfficeCurrency: z.number().nullish(), createdAt: z.iso.datetime({ offset: true }) }).readonly(); +export type InvoiceDetailDto = z.infer; + +/** + * TotalAmountsDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ +export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); +export type TotalAmountsDto = z.infer; + +/** + * OfficeInvoiceListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalAmountInDefaultCurrency + * @property { string } defaultCurrencyNotation + * @property { TotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const OfficeInvoiceListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalAmountInDefaultCurrency: z.number().nullish(), defaultCurrencyNotation: z.string().nullish(), totalAmounts: z.array(TotalAmountsDtoSchema).readonly(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type OfficeInvoiceListResponseDto = z.infer; + +/** + * InvoicePreviewPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } externalSystemId + */ +export const InvoicePreviewPositionDtoSchema = z.object({ id: z.string(), number: z.string(), externalSystemId: z.string().nullish() }).readonly(); +export type InvoicePreviewPositionDto = z.infer; + +/** + * InvoicePreviewReceiverDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + */ +export const InvoicePreviewReceiverDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(); +export type InvoicePreviewReceiverDto = z.infer; + +/** + * InvoicePreviewReceiverCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoicePreviewReceiverCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvoicePreviewReceiverCountryDto = z.infer; + +/** + * InvoicePreviewClerkDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoicePreviewClerkDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type InvoicePreviewClerkDto = z.infer; + +/** + * VatRuleLabelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } matchCode + * @property { string } name + */ +export const VatRuleLabelResponseDtoSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string() }).readonly(); +export type VatRuleLabelResponseDto = z.infer; + +/** + * OfficeInvoicePreviewDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } invoiceNumber + * @property { string } invoiceDirection + * @property { string } issuingDate + * @property { CommonModels.InvoiceTypeEnum } invoiceType + * @property { boolean } collective + * @property { string } serviceDate + * @property { string } internalNumber + * @property { string } reference + * @property { number } amount + * @property { number } netAmount + * @property { number } tax + * @property { string } currency + * @property { string } dueDate + * @property { CommonModels.InvoiceStatusEnum } status + * @property { string } payDate + * @property { number } paidAmount + * @property { InvoicePreviewPositionDto } position + * @property { InvoicePreviewReceiverDto } receiver + * @property { InvoicePreviewReceiverCountryDto } receiverCountry + * @property { InvoicePreviewClerkDto } clerk + * @property { boolean } cancelled + * @property { boolean } ok + * @property { boolean } isExportedToBookkeeping + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { boolean } vatOk + * @property { string } comments + * @property { string } paymentComment + * @property { string } creditorId + * @property { string } debtorId + * @property { string } hblNumber + * @property { string } mblNumber + * @property { string } bookingNumber + * @property { string } vessel + * @property { string } voyage + * @property { VatRuleLabelResponseDto[] } vatRules + */ +export const OfficeInvoicePreviewDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), invoiceNumber: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, issuingDate: z.iso.datetime({ offset: true }).nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema, collective: z.boolean(), serviceDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), reference: z.string().nullish(), amount: z.number(), netAmount: z.number(), tax: z.number(), currency: z.string(), dueDate: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.InvoiceStatusEnumSchema, payDate: z.iso.datetime({ offset: true }).nullish(), paidAmount: z.number().nullish(), position: InvoicePreviewPositionDtoSchema.nullish(), receiver: InvoicePreviewReceiverDtoSchema.nullish(), receiverCountry: InvoicePreviewReceiverCountryDtoSchema.nullish(), clerk: InvoicePreviewClerkDtoSchema.nullish(), cancelled: z.boolean(), ok: z.boolean(), isExportedToBookkeeping: z.boolean(), dunningBlock: z.boolean(), invoiceInReview: z.boolean(), vatOk: z.boolean(), comments: z.string().nullish(), paymentComment: z.string().nullish(), creditorId: z.string().nullish(), debtorId: z.string().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vatRules: z.array(VatRuleLabelResponseDtoSchema).readonly().nullish() }).readonly(); +export type OfficeInvoicePreviewDto = z.infer; + +/** + * InvoiceExportFilterDtoSchema + * @type { object } + * @property { string } search + * @property { CommonModels.DateRangeDto } issuingDate + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection + * @property { CommonModels.InvoiceTypeEnum[] } invoiceType + * @property { CommonModels.BooleanFilterEnum[] } collective + * @property { number } amountMin + * @property { number } amountMax + * @property { string[] } currencyNotation + * @property { CommonModels.DateRangeDto } dueDate + * @property { CommonModels.InvoiceStatusEnum[] } status + * @property { string[] } receiver Filter by invoice receiver/customer ID (UUID) + * @property { string } positionNumbersString + * @property { string[] } positionNumbers + * @property { string } invoiceNumbersString + * @property { string[] } invoiceNumbers + * @property { CommonModels.BooleanFilterEnum[] } bookkeepingExportStatus + * @property { CommonModels.BooleanFilterEnum[] } dunningBlock + * @property { CommonModels.BooleanFilterEnum[] } invoiceInReview + * @property { CommonModels.BooleanFilterEnum[] } isInvoiceOk + * @property { CommonModels.BooleanFilterEnum[] } isVatOk + * @property { number } invoiceNumberMin + * @property { number } invoiceNumberMax + * @property { number } internalNumberMin + * @property { number } internalNumberMax + */ +export const InvoiceExportFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer ID (UUID)"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number() }).readonly(); +export type InvoiceExportFilterDto = z.infer; + +/** + * InvoiceExportColumnSchema + * @type { enum } + */ +export const InvoiceExportColumnSchema = z.enum(["invoiceNumber", "invoiceDirection", "issuingDate", "invoiceType", "collective", "serviceDate", "internalNumber", "reference", "totalGross", "totalNet", "totalVat", "currency", "dueDate", "status", "payDate", "paidAmount", "positionNumber", "hblHawb", "mblMawb", "bookingNumber", "vessel", "voyage", "receiverName", "receiverCountry", "clerkName", "cancelled", "ok", "vatOk", "dunningBlock", "invoiceInReview", "exportedToBookkeeping", "comments", "paymentComment", "vatRuleIds", "creditorId", "debtorId", "createdAt"]); +export type InvoiceExportColumn = z.infer; +export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; + +/** + * InvoiceExportRequestDtoSchema + * @type { object } + * @property { InvoiceExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { InvoiceExportFilterDto } filter + */ +export const InvoiceExportRequestDtoSchema = z.object({ columns: z.array(InvoiceExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: InvoiceExportFilterDtoSchema }).readonly(); +export type InvoiceExportRequestDto = z.infer; + +/** + * UninvoicedChargeTotalAmountDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ +export const UninvoicedChargeTotalAmountDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); +export type UninvoicedChargeTotalAmountDto = z.infer; + +/** + * UninvoicedChargeListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const UninvoicedChargeListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalAmounts: z.array(UninvoicedChargeTotalAmountDtoSchema).readonly(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type UninvoicedChargeListResponseDto = z.infer; + +/** + * ReceiverDtoSchema + * @type { object } + * @property { string } id Business Partner ID (Customer or Vendor) + * @property { string } name Business Partner name + * @property { string } matchCode Business Partner match code + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const ReceiverDtoSchema = z.object({ id: z.string().describe("Business Partner ID (Customer or Vendor)"), name: z.string().describe("Business Partner name"), matchCode: z.string().describe("Business Partner match code"), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); +export type ReceiverDto = z.infer; + +/** + * UninvoicedChargePositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type UninvoicedChargePositionDto = z.infer; + +/** + * UninvoicedChargeChargeTypeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const UninvoicedChargeChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type UninvoicedChargeChargeTypeDto = z.infer; + +/** + * UninvoicedChargeVatRuleDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchcode + */ +export const UninvoicedChargeVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly(); +export type UninvoicedChargeVatRuleDto = z.infer; + +/** + * UninvoicedChargeGroupStatusEnumSchema + * @type { enum } + */ +export const UninvoicedChargeGroupStatusEnumSchema = z.enum(["ReadyForInvoice", "MissingInformation"]); +export type UninvoicedChargeGroupStatusEnum = z.infer; +export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSchema.enum; + +/** + * UninvoicedChargeEmployeeDtoSchema + * @type { object } + * @property { string } id + * @property { string } firstName + * @property { string } lastName + * @property { string } fullName + */ +export const UninvoicedChargeEmployeeDtoSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }).readonly(); +export type UninvoicedChargeEmployeeDto = z.infer; + +/** + * UninvoicedChargeDtoSchema + * @type { object } + * @property { string } chargeItemId + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection Invoice direction (Incoming or Outgoing) + * @property { ReceiverDto } receiver Business Partner receiving the invoice + * @property { UninvoicedChargePositionDto } position + * @property { UninvoicedChargeChargeTypeDto } chargeType + * @property { string } currencyNotation ISO 4217 currency code + * @property { number } amount Charge amount in charge currency + * @property { number } amountInOfficeCurrency Charge amount in office currency + * @property { string } officeCurrency Office currency code + * @property { number } exchangeRate + * @property { UninvoicedChargeVatRuleDto } vatRule + * @property { string } serviceDate + * @property { UninvoicedChargeGroupStatusEnum } status Status of charge group + * @property { string[] } missingInformation Missing fields required for invoicing this charge + * @property { UninvoicedChargeEmployeeDto } employee + */ +export const UninvoicedChargeDtoSchema = z.object({ chargeItemId: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction (Incoming or Outgoing)"), receiver: ReceiverDtoSchema.describe("Business Partner receiving the invoice"), position: UninvoicedChargePositionDtoSchema, chargeType: UninvoicedChargeChargeTypeDtoSchema.nullish(), currencyNotation: z.string().describe("ISO 4217 currency code"), amount: z.number().describe("Charge amount in charge currency"), amountInOfficeCurrency: z.number().describe("Charge amount in office currency"), officeCurrency: z.string().describe("Office currency code"), exchangeRate: z.number().nullish(), vatRule: UninvoicedChargeVatRuleDtoSchema.nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), status: UninvoicedChargeGroupStatusEnumSchema.describe("Status of charge group"), missingInformation: z.array(z.string()).readonly().describe("Missing fields required for invoicing this charge").nullish(), employee: UninvoicedChargeEmployeeDtoSchema.nullish() }).readonly(); +export type UninvoicedChargeDto = z.infer; + +/** + * UninvoicedChargePaginationDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string } receiverId + * @property { string } chargeTypeId + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currency + * @property { string } vatRuleId + */ +export const UninvoicedChargePaginationDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), chargeItemId: z.string(), receiverId: z.string(), chargeTypeId: z.string(), serviceDate: CommonModels.DateRangeDtoSchema, currency: z.array(z.string()).readonly(), vatRuleId: z.string() }).readonly(); +export type UninvoicedChargePaginationDto = z.infer; + +/** + * UninvoicedChargesFilterDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string[] } receiverIds + * @property { string[] } positionIds + * @property { string[] } chargeTypeIds + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currencies + * @property { string[] } vatRuleIds + * @property { string[] } employeeIds + */ +export const UninvoicedChargesFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), chargeItemId: z.string(), receiverIds: z.array(z.string()).readonly(), positionIds: z.array(z.string()).readonly(), chargeTypeIds: z.array(z.string()).readonly(), serviceDate: CommonModels.DateRangeDtoSchema, currencies: z.array(z.string()).readonly(), vatRuleIds: z.array(z.string()).readonly(), employeeIds: z.array(z.string()).readonly() }).readonly(); +export type UninvoicedChargesFilterDto = z.infer; + +/** + * UninvoicedChargesExportFilterDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string[] } receiverIds + * @property { string[] } positionIds + * @property { string[] } chargeTypeIds + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currencies + * @property { string[] } vatRuleIds + */ +export const UninvoicedChargesExportFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), chargeItemId: z.string(), receiverIds: z.array(z.string()).readonly(), positionIds: z.array(z.string()).readonly(), chargeTypeIds: z.array(z.string()).readonly(), serviceDate: CommonModels.DateRangeDtoSchema, currencies: z.array(z.string()).readonly(), vatRuleIds: z.array(z.string()).readonly() }).readonly(); +export type UninvoicedChargesExportFilterDto = z.infer; + +/** + * UninvoicedChargeExportColumnSchema + * @type { enum } + */ +export const UninvoicedChargeExportColumnSchema = z.enum(["chargeItemId", "invoiceDirection", "status", "receiverName", "positionNumber", "serviceDate", "employee", "chargeTypeName", "amount", "currency", "exchangeRate", "amountInOfficeCurrency", "officeCurrency", "vatRule"]); +export type UninvoicedChargeExportColumn = z.infer; +export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.enum; + +/** + * UninvoicedChargesExportRequestDtoSchema + * @type { object } + * @property { UninvoicedChargeExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { UninvoicedChargesExportFilterDto } filter + */ +export const UninvoicedChargesExportRequestDtoSchema = z.object({ columns: z.array(UninvoicedChargeExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: UninvoicedChargesExportFilterDtoSchema }).readonly(); +export type UninvoicedChargesExportRequestDto = z.infer; + +/** + * CreateDraftInvoiceRequestDtoSchema + * @type { object } + * @property { string[] } chargeItemIds Charge item IDs to include in the invoice. Min Items: `1` + * @property { CommonModels.InvoiceTypeEnum } invoiceType Type of invoice + * @property { string } customerId Customer ID (required for outgoing invoices) + * @property { CommonModels.InvoiceDirectionEnum } direction Invoice direction + */ +export const CreateDraftInvoiceRequestDtoSchema = z.object({ chargeItemIds: z.array(z.string()).readonly().min(1).describe("Charge item IDs to include in the invoice").nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema.describe("Type of invoice"), customerId: z.string().describe("Customer ID (required for outgoing invoices)"), direction: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction") }).readonly(); +export type CreateDraftInvoiceRequestDto = z.infer; + +/** + * UpdateInvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const UpdateInvoiceRemarksDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export type UpdateInvoiceRemarksDto = z.infer; + +/** + * UpdateInvoiceCustomerDtoSchema + * @type { object } + * @property { string } name + * @property { string } reference + * @property { string } contact + */ +export const UpdateInvoiceCustomerDtoSchema = z.object({ name: z.string(), reference: z.string(), contact: z.string() }).readonly(); +export type UpdateInvoiceCustomerDto = z.infer; + +/** + * UpdateInvoiceRequestDtoSchema + * @type { object } + * @property { string } issuingDate Invoice date in ISO format + * @property { string } receiptDate Receipt date in ISO format + * @property { string } serviceDate Service date in ISO format + * @property { string } serviceDateUntil Service end date in ISO format + * @property { string } dueDate Due date in ISO format + * @property { string } invoiceNumber Invoice number + * @property { string } internalNumber Internal reference number + * @property { number } paymentTermDays Payment term in days + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { string } serviceRecipientId Service recipient ID + * @property { string } bankAccountId Bank account ID + * @property { UpdateInvoiceRemarksDto } remarks Additional remarks + * @property { InvoiceLanguageEnum } language Invoice language + * @property { boolean } showPaymentInstructions + * @property { UpdateInvoiceCustomerDto } customer + * @property { string } salesRepId + * @property { string } currencyNotation + * @property { number } exchangeRate Invoice exchange rate + */ +export const UpdateInvoiceRequestDtoSchema = z.object({ issuingDate: z.iso.datetime({ offset: true }).describe("Invoice date in ISO format"), receiptDate: z.iso.datetime({ offset: true }).describe("Receipt date in ISO format"), serviceDate: z.iso.datetime({ offset: true }).describe("Service date in ISO format"), serviceDateUntil: z.iso.datetime({ offset: true }).describe("Service end date in ISO format"), dueDate: z.iso.datetime({ offset: true }).describe("Due date in ISO format").nullable(), invoiceNumber: z.string().describe("Invoice number").nullable(), internalNumber: z.string().describe("Internal reference number").nullable(), paymentTermDays: z.number().describe("Payment term in days").nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, serviceRecipientId: z.string().describe("Service recipient ID").nullable(), bankAccountId: z.string().describe("Bank account ID").nullable(), remarks: UpdateInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), language: InvoiceLanguageEnumSchema.describe("Invoice language"), showPaymentInstructions: z.boolean(), customer: UpdateInvoiceCustomerDtoSchema, salesRepId: z.string(), currencyNotation: z.string(), exchangeRate: z.number().describe("Invoice exchange rate").nullable() }).readonly(); +export type UpdateInvoiceRequestDto = z.infer; + +/** + * FixInvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const FixInvoiceRemarksDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export type FixInvoiceRemarksDto = z.infer; + +/** + * FixInvoiceCustomerDtoSchema + * @type { object } + * @property { string } reference Customer reference number + */ +export const FixInvoiceCustomerDtoSchema = z.object({ reference: z.string().describe("Customer reference number") }).readonly(); +export type FixInvoiceCustomerDto = z.infer; + +/** + * FixInvoiceRequestDtoSchema + * @type { object } + * @property { string } currencyNotation Invoice currency (incoming invoices only) + * @property { string } issuingDate Update invoice date in ISO format + * @property { string } dueDate Update invoice due date in ISO format + * @property { number } exchangeRate Invoice exchange rate + * @property { number } paymentTermDays Payment term in days + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { string } receiptDate Update receipt date in ISO format + * @property { string } serviceDate Update service date in ISO format + * @property { string } serviceDateUntil Update service end date in ISO format + * @property { boolean } isVatOk Mark VAT as checked/OK by accounting + * @property { boolean } isInvoiceOk Mark overall invoice as checked/OK by accounting + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { string } comments + * @property { FixInvoiceRemarksDto } remarks Additional remarks + * @property { string } invoiceNumber Invoice number (incoming invoices only) + * @property { string } bankAccountId Bank account ID + * @property { string } serviceRecipientId Service recipient ID + * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) + */ +export const FixInvoiceRequestDtoSchema = z.object({ currencyNotation: z.string().describe("Invoice currency (incoming invoices only)"), issuingDate: z.iso.datetime({ offset: true }).describe("Update invoice date in ISO format"), dueDate: z.iso.datetime({ offset: true }).describe("Update invoice due date in ISO format"), exchangeRate: z.number().describe("Invoice exchange rate").nullable(), paymentTermDays: z.number().describe("Payment term in days").nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, receiptDate: z.iso.datetime({ offset: true }).describe("Update receipt date in ISO format"), serviceDate: z.iso.datetime({ offset: true }).describe("Update service date in ISO format").nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).describe("Update service end date in ISO format"), isVatOk: z.boolean().describe("Mark VAT as checked/OK by accounting"), isInvoiceOk: z.boolean().describe("Mark overall invoice as checked/OK by accounting"), dunningBlock: z.boolean(), invoiceInReview: z.boolean(), comments: z.string(), remarks: FixInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), invoiceNumber: z.string().describe("Invoice number (incoming invoices only)").nullable(), bankAccountId: z.string().describe("Bank account ID").nullable(), serviceRecipientId: z.string().describe("Service recipient ID").nullable(), customer: FixInvoiceCustomerDtoSchema.describe("Customer reference (incoming invoices only)") }).readonly(); +export type FixInvoiceRequestDto = z.infer; + +/** + * UpdateIssuedInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity. Minimum: `0` + * @property { number } amount Amount (must be positive). Minimum: `0.01` + * @property { string } vatRuleId VAT rule ID + * @property { number } exchangeRate Charge exchange rate (incoming invoices only) + * @property { string } currencyNotation + */ +export const UpdateIssuedInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string().describe("Position charge item ID"), chargeTypeId: z.string().describe("Charge type ID").nullish(), additionalText: z.string().describe("Additional text for the charge").nullish(), quantity: z.number().gte(0).describe("Quantity").nullish(), amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), vatRuleId: z.string().describe("VAT rule ID").nullish(), exchangeRate: z.number().describe("Charge exchange rate (incoming invoices only)").nullish(), currencyNotation: z.string().nullish() }).readonly(); +export type UpdateIssuedInvoiceChargeRequestDto = z.infer; + +/** + * UpdateIssuedInvoiceChargesRequestDtoSchema + * @type { object } + * @property { UpdateIssuedInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` + */ +export const UpdateIssuedInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateIssuedInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates") }).readonly(); +export type UpdateIssuedInvoiceChargesRequestDto = z.infer; + +/** + * UpdateInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity. Minimum: `0` + * @property { number } amount Amount (must be positive). Minimum: `0.01` + * @property { string } vatRuleId VAT rule ID + * @property { number } exchangeRate + * @property { string } currencyNotation + */ +export const UpdateInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string().describe("Position charge item ID"), chargeTypeId: z.string().describe("Charge type ID").nullish(), additionalText: z.string().describe("Additional text for the charge").nullish(), quantity: z.number().gte(0).describe("Quantity").nullish(), amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), vatRuleId: z.string().describe("VAT rule ID").nullish(), exchangeRate: z.number().nullish(), currencyNotation: z.string().nullish() }).readonly(); +export type UpdateInvoiceChargeRequestDto = z.infer; + +/** + * UpdateInvoiceChargesRequestDtoSchema + * @type { object } + * @property { UpdateInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` + */ +export const UpdateInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates") }).readonly(); +export type UpdateInvoiceChargesRequestDto = z.infer; + +/** + * InvoiceFilterDtoSchema + * @type { object } + * @property { string[] } status + * @property { string } direction + * @property { string } receiver Filter by invoice receiver/customer ID (UUID) + */ +export const InvoiceFilterDtoSchema = z.object({ status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), direction: CommonModels.InvoiceDirectionEnumSchema, receiver: z.string().describe("Filter by invoice receiver/customer ID (UUID)") }).readonly(); +export type InvoiceFilterDto = z.infer; + +/** + * ChangeInvoiceCustomerRequestDtoSchema + * @type { object } + * @property { string } newCustomerId + */ +export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }).readonly(); +export type ChangeInvoiceCustomerRequestDto = z.infer; + +/** + * CreateDirectInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const CreateDirectInvoiceChargeRequestDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount"), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount"), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export type CreateDirectInvoiceChargeRequestDto = z.infer; + +/** + * UpdateIssuedInvoiceVatRulesRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } vatRuleId VAT rule ID + */ +export const UpdateIssuedInvoiceVatRulesRequestDtoSchema = z.object({ positionChargeItemId: z.string().describe("Position charge item ID"), vatRuleId: z.string().describe("VAT rule ID") }).readonly(); +export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; + +/** + * PrepareUploadRequestDtoSchema + * @type { object } + * @property { string } filename + * @property { string } mimeType + * @property { number } fileSize + */ +export const PrepareUploadRequestDtoSchema = z.object({ filename: z.string().nullish(), mimeType: z.string(), fileSize: z.number() }).readonly(); +export type PrepareUploadRequestDto = z.infer; + +/** + * InvoiceUploadInstructionsDtoSchema + * @type { object } + * @property { string } url Pre-signed URL for the PUT request to storage + * @property { string } method HTTP method to use for upload + */ +export const InvoiceUploadInstructionsDtoSchema = z.object({ url: z.string().describe("Pre-signed URL for the PUT request to storage"), method: z.string().describe("HTTP method to use for upload") }).readonly(); +export type InvoiceUploadInstructionsDto = z.infer; + +/** + * GetInvoicesEmlInvoiceIdsParamSchema + * @type { array } + * @description Invoice IDs + */ +export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).readonly().describe("Invoice IDs").nullish(); +export type GetInvoicesEmlInvoiceIdsParam = z.infer; + +/** + * InvoicesFindOrderParamEnumSchema + * @type { enum } + */ +export const InvoicesFindOrderParamEnumSchema = z.enum(["status", "createdAt", "serviceDate"]); +export type InvoicesFindOrderParamEnum = z.infer; +export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; + +/** + * InvoicesFindResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { InvoicePreviewDto[] } items + */ +export const InvoicesFindResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(InvoicePreviewDtoSchema).readonly() }).readonly().shape }); +export type InvoicesFindResponse = z.infer; + +/** + * FindByOfficeOrderParamEnumSchema + * @type { enum } + */ +export const FindByOfficeOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); +export type FindByOfficeOrderParamEnum = z.infer; +export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; + +/** + * FindByOfficeResponseSchema + * @type { object } + * @property { number } totalAmountInDefaultCurrency + * @property { string } defaultCurrencyNotation + * @property { TotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficeInvoicePreviewDto[] } items + */ +export const FindByOfficeResponseSchema = z.object({ ...OfficeInvoiceListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).readonly() }).readonly().shape }); +export type FindByOfficeResponse = z.infer; + +/** + * GetUnChargesOrderParamEnumSchema + * @type { enum } + */ +export const GetUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); +export type GetUnChargesOrderParamEnum = z.infer; +export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; + +/** + * GetUnChargesResponseSchema + * @type { object } + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { UninvoicedChargeDto[] } items + */ +export const GetUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape }); +export type GetUnChargesResponse = z.infer; + +/** + * InvoicesListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ +export const InvoicesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type InvoicesListAvailablePartnersForResponse = z.infer; + +/** + * GetOfficeUnChargesOrderParamEnumSchema + * @type { enum } + */ +export const GetOfficeUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); +export type GetOfficeUnChargesOrderParamEnum = z.infer; +export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnumSchema.enum; + +/** + * GetOfficeUnChargesResponseSchema + * @type { object } + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { UninvoicedChargeDto[] } items + */ +export const GetOfficeUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape }); +export type GetOfficeUnChargesResponse = z.infer; + +} diff --git a/test/generated/next/invoices/invoices.queries.ts b/test/generated/next/invoices/invoices.queries.ts new file mode 100644 index 0000000..1046ddd --- /dev/null +++ b/test/generated/next/invoices/invoices.queries.ts @@ -0,0 +1,1123 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { InvoicesAcl } from "./invoices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { InvoicesModels } from "./invoices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { InvoicesApi } from "./invoices.api"; + +export namespace InvoicesQueries { +export const moduleName = QueryModule.Invoices; + +export const keys = { + all: [moduleName] as const, + getInvoicesEml: (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam) => [...keys.all, "/offices/:officeId/invoices/eml", officeId, invoiceIds] as const, + find: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", officeId, positionId, limit, order, filter, page, cursor] as const, + findInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", "infinite", officeId, positionId, limit, order, filter, cursor] as const, + findByOffice: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", officeId, limit, order, filter, page, cursor] as const, + findByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", "infinite", officeId, limit, order, filter, cursor] as const, + getUnCharges: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", officeId, positionId, limit, order, filter, page, cursor] as const, + getUnChargesInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", "infinite", officeId, positionId, limit, order, filter, cursor] as const, + listAvailablePartnersFor: (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/available-partners", officeId, invoiceId, search, useCase] as const, + getOfficeUnCharges: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", officeId, limit, order, filter, page, cursor] as const, + getOfficeUnChargesInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", "infinite", officeId, limit, order, filter, cursor] as const, + getDetail: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId", officeId, invoiceId] as const, + getPreview: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/preview", officeId, invoiceId] as const, + getInvoiceEml: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/eml", officeId, invoiceId] as const, +}; + +/** + * Query `useGetInvoicesEml` - recommended when file should be cached + * @summary Get invoices as EML file with PDF attachments + * @permission Requires `canUseGetInvoicesEml` ability + * @param { string } object.officeId Path parameter + * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } object.invoiceIds Query parameter. Invoice IDs + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoicesEml = ({ officeId, invoiceIds }: { officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvoicesEml(officeId, invoiceIds), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); + return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config) }, + ...options, + }); +}; + +/** + * Mutation `useGetInvoicesEmlMutation` - recommended when file should not be cached + * @summary Get invoices as EML file with PDF attachments + * @permission Requires `canUseGetInvoicesEml` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } mutation.invoiceIds Query parameter. Invoice IDs + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoicesEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceIds }) => { + checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); + return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFind` + * @summary List invoices for a position + * @permission Requires `canUseFind` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` + * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFind = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseFind({ officeId } )); + return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindInfinite + * @summary List invoices for a position + * @permission Requires `canUseFind` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` + * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseFind({ officeId } )); + return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useChangeIncomingCustomer` + * @summary Change incoming invoice customer and update vendors on registered charges + * @permission Requires `canUseChangeIncomingCustomer` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.ChangeInvoiceCustomerRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useChangeIncomingCustomer = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId } )); + return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindByOffice` + * @summary List invoices for an office + * @permission Requires `canUseFindByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); + return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindByOfficeInfinite + * @summary List invoices for an office + * @permission Requires `canUseFindByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); + return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreateDraft` + * @summary Create a draft invoice from charge items + * @permission Requires `canUseCreateDraft` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.CreateDraftInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useCreateDraft = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseCreateDraft({ officeId } )); + return InvoicesApi.createDraft(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useExportInvoices` - recommended when file should not be cached + * @summary Export invoices to Excel + * @permission Requires `canUseExportInvoices` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportInvoices = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportInvoices({ officeId } )); + return InvoicesApi.exportInvoices(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useExportCharges` - recommended when file should not be cached + * @summary Export invoice charges as Excel file + * @permission Requires `canUseExportCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportCharges({ officeId } )); + return InvoicesApi.exportCharges(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetUnCharges` + * @summary Get uninvoiced charges for a position + * @permission Requires `canUseGetUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetUnCharges = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useGetUnChargesInfinite + * @summary Get uninvoiced charges for a position + * @permission Requires `canUseGetUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetUnChargesInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for an invoice (union of position involved parties) + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListAvailablePartnersFor = ({ officeId, invoiceId, search, useCase }: { officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), + queryFn: () => { + checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId } )); + return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase, config) }, + ...options, + }); +}; + +/** + * Query `useGetOfficeUnCharges` + * @summary Get uninvoiced charges for all positions in an office + * @permission Requires `canUseGetOfficeUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetOfficeUnCharges = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useGetOfficeUnChargesInfinite + * @summary Get uninvoiced charges for all positions in an office + * @permission Requires `canUseGetOfficeUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetOfficeUnChargesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useExportUnCharges` - recommended when file should not be cached + * @summary Export uninvoiced charges as Excel file + * @permission Requires `canUseExportUnCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.UninvoicedChargesExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportUnCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId } )); + return InvoicesApi.exportUnCharges(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateDirect` + * @summary Dummy endpoint to expose direct invoice permission to FE + * @permission Requires `canUseCreateDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useCreateDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId }) => { + checkAcl(InvoicesAcl.canUseCreateDirect({ officeId } )); + return InvoicesApi.createDirect(officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useAddChargeToDirect` + * @summary Add a charge to a direct invoice + * @permission Requires `canUseAddChargeToDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.CreateDirectInvoiceChargeRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useAddChargeToDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId } )); + return InvoicesApi.addChargeToDirect(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateCharges` + * @summary Update charges on a draft invoice + * @permission Requires `canUseUpdateCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateInvoiceChargesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdateCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId } )); + return InvoicesApi.updateCharges(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRemoveChargeFromDirect` + * @summary Remove a charge from a direct invoice + * @permission Requires `canUseRemoveChargeFromDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.chargeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useRemoveChargeFromDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, chargeId }) => { + checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId } )); + return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetDetail` + * @summary Get invoice details + * @permission Requires `canUseGetDetail` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, default] + */ +export const useGetDetail = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDetail(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetDetail({ officeId } )); + return InvoicesApi.getDetail(officeId, invoiceId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update invoice details + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdate({ officeId } )); + return InvoicesApi.update(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteInvoice` + * @summary Delete invoice + * @permission Requires `canUseDeleteInvoice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteInvoice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId } )); + return InvoicesApi.deleteInvoice(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useFix` + * @summary Fix invoice with accounting permission + * @permission Requires `canUseFix` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.FixInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useFix = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseFix({ officeId } )); + return InvoicesApi.fix(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerate` - recommended when file should not be cached + * @summary Generate an invoice PDF + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGenerate({ officeId } )); + return InvoicesApi.generate(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateIssuedVatRules` + * @summary Update VAT rules on issued invoice charges + * @permission Requires `canUseUpdateIssuedVatRules` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdateIssuedVatRules = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId } )); + return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateIssuedCharges` + * @summary Update charges on issued invoice + * @permission Requires `canUseUpdateIssuedCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdateIssuedCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId } )); + return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useIssue` - recommended when file should not be cached + * @summary Issue outgoing invoice + * @permission Requires `canUseIssue` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useIssue = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseIssue({ officeId } )); + return InvoicesApi.issue(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReportHungarian` + * @summary Report invoice to Hungarian tax authority + * @permission Requires `canUseReportHungarian` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReportHungarian = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseReportHungarian({ officeId } )); + return InvoicesApi.reportHungarian(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateIncoming` - recommended when file should not be cached + * @summary Re-Generate an invoice PDF + * @permission Requires `canUseGenerateIncoming` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGenerateIncoming = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId } )); + return InvoicesApi.generateIncoming(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRegister` + * @summary Register incoming invoice + * @permission Requires `canUseRegister` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useRegister = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseRegister({ officeId } )); + return InvoicesApi.register(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetPreview` - recommended when file should be cached + * @summary Get invoice PDF preview + * @permission Requires `canUseGetPreview` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetPreview = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getPreview(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); + return InvoicesApi.getPreview(officeId, invoiceId, config) }, + ...options, + }); +}; + +/** + * Mutation `useGetPreviewMutation` - recommended when file should not be cached + * @summary Get invoice PDF preview + * @permission Requires `canUseGetPreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetPreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); + return InvoicesApi.getPreview(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetInvoiceEml` - recommended when file should be cached + * @summary Get invoice as EML file with PDF attachment + * @permission Requires `canUseGetInvoiceEml` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoiceEml = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvoiceEml(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); + return InvoicesApi.getInvoiceEml(officeId, invoiceId, config) }, + ...options, + }); +}; + +/** + * Mutation `useGetInvoiceEmlMutation` - recommended when file should not be cached + * @summary Get invoice as EML file with PDF attachment + * @permission Requires `canUseGetInvoiceEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoiceEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); + return InvoicesApi.getInvoiceEml(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `usePrepareDocumentUpload` + * @summary Prepare for invoice document upload + * @permission Requires `canUsePrepareDocumentUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.PrepareUploadRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const usePrepareDocumentUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { + checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId } )); + const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCancel` + * @summary Cancel invoice (create draft credit note) + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseCancel({ officeId } )); + return InvoicesApi.cancel(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useIssueCreditNote` + * @summary Issue credit invoice + * @permission Requires `canUseIssueCreditNote` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useIssueCreditNote = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId } )); + return InvoicesApi.issueCreditNote(officeId, invoiceId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/masterData/masterData.acl.ts b/test/generated/next/masterData/masterData.acl.ts new file mode 100644 index 0000000..2c0c2c9 --- /dev/null +++ b/test/generated/next/masterData/masterData.acl.ts @@ -0,0 +1,24 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace MasterDataAcl { +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +} diff --git a/test/generated/next/masterData/masterData.api.ts b/test/generated/next/masterData/masterData.api.ts new file mode 100644 index 0000000..831aadf --- /dev/null +++ b/test/generated/next/masterData/masterData.api.ts @@ -0,0 +1,37 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { MasterDataModels } from "./masterData.models"; + +export namespace MasterDataApi { +export const findAll = (officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, + `/offices/${officeId}/master-data/autocomplete`, + { + ...config, + params: { + types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { type: "query", name: "types" }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +export const paginate = (officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, + `/offices/${officeId}/master-data/labels/paginated`, + { + ...config, + params: { + types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { type: "query", name: "types" }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/next/masterData/masterData.configs.ts b/test/generated/next/masterData/masterData.configs.ts new file mode 100644 index 0000000..06f2f06 --- /dev/null +++ b/test/generated/next/masterData/masterData.configs.ts @@ -0,0 +1,29 @@ +import { dynamicColumns } from "@povio/ui"; +import { MasterDataModels } from "./masterData.models"; +import { MasterDataQueries } from "./masterData.queries"; +import { MasterDataAcl } from "./masterData.acl"; + +export namespace MasterDataConfigs { +export const paginatedConfig = { + meta: { + title: "Paginated", + }, + readAll: { + acl: MasterDataAcl.canUsePaginate, + schema: MasterDataModels.MasterDataLabelResponseDTOSchema, + paginated: MasterDataQueries.usePaginate, + infinite: MasterDataQueries.usePaginateInfinite, + columns: dynamicColumns({ + schema: MasterDataModels.MasterDataLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + type: true, + }, + }, +}), + }, +}; + +} diff --git a/test/generated/next/masterData/masterData.models.ts b/test/generated/next/masterData/masterData.models.ts new file mode 100644 index 0000000..018a2dc --- /dev/null +++ b/test/generated/next/masterData/masterData.models.ts @@ -0,0 +1,68 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace MasterDataModels { +/** + * MasterDataTypeEnumSchema + * @type { enum } + */ +export const MasterDataTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "City", "Warehouse", "ContainerYard", "PortTerminal", "AirportTerminal", "Port", "Airport"]); +export type MasterDataTypeEnum = z.infer; +export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; + +/** + * MasterDataItemResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the item + * @property { string } name Name of the item + * @property { MasterDataTypeEnum } type Type of the item + */ +export const MasterDataItemResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the item"), name: z.string().describe("Name of the item"), type: MasterDataTypeEnumSchema.describe("Type of the item") }).readonly(); +export type MasterDataItemResponseDTO = z.infer; + +/** + * MasterDataItemsResponseDTOSchema + * @type { object } + * @property { MasterDataItemResponseDTO[] } items List of master data items + */ +export const MasterDataItemsResponseDTOSchema = z.object({ items: z.array(MasterDataItemResponseDTOSchema).readonly().describe("List of master data items") }).readonly(); +export type MasterDataItemsResponseDTO = z.infer; + +/** + * MasterDataLabelResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the item + * @property { string } label Label of the item + * @property { MasterDataTypeEnum } type Type of the item + */ +export const MasterDataLabelResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the item"), label: z.string().describe("Label of the item"), type: MasterDataTypeEnumSchema.describe("Type of the item") }).readonly(); +export type MasterDataLabelResponseDTO = z.infer; + +/** + * MasterDataFindAllTypesParamSchema + * @type { array } + */ +export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); +export type MasterDataFindAllTypesParam = z.infer; + +/** + * MasterDataPaginateTypesParamSchema + * @type { array } + */ +export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); +export type MasterDataPaginateTypesParam = z.infer; + +/** + * MasterDataPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { MasterDataLabelResponseDTO[] } items + */ +export const MasterDataPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(MasterDataLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type MasterDataPaginateResponse = z.infer; + +} diff --git a/test/generated/next/masterData/masterData.queries.ts b/test/generated/next/masterData/masterData.queries.ts new file mode 100644 index 0000000..444ccd6 --- /dev/null +++ b/test/generated/next/masterData/masterData.queries.ts @@ -0,0 +1,100 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { MasterDataAcl } from "./masterData.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { MasterDataModels } from "./masterData.models"; +import { MasterDataApi } from "./masterData.api"; + +export namespace MasterDataQueries { +export const moduleName = QueryModule.MasterData; + +export const keys = { + all: [moduleName] as const, + findAll: (officeId: string, types?: MasterDataModels.MasterDataFindAllTypesParam, search?: string) => [...keys.all, "/offices/:officeId/master-data/autocomplete", officeId, types, search] as const, + paginate: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", officeId, types, limit, search, page, cursor] as const, + paginateInfinite: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", "infinite", officeId, types, limit, search, cursor] as const, +}; + +/** + * Query `useFindAll` + * @summary List master data based on provided type + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataFindAllTypesParam } object.types Query parameter + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ officeId, types, search }: { officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(officeId, types, search), + queryFn: () => { + checkAcl(MasterDataAcl.canUseFindAll()); + return MasterDataApi.findAll(officeId, types, search, config) }, + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary Paginate master data based on provided type + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.search Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, types, limit, search, page, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, types, limit, search, page, cursor), + queryFn: () => { + checkAcl(MasterDataAcl.canUsePaginate()); + return MasterDataApi.paginate(officeId, types, limit, search, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate master data based on provided type + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.search Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, types, limit, search, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), + queryFn: ({ pageParam }) => { + checkAcl(MasterDataAcl.canUsePaginate()); + return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/next/masterDataImport/masterDataImport.acl.ts b/test/generated/next/masterDataImport/masterDataImport.acl.ts new file mode 100644 index 0000000..7e98741 --- /dev/null +++ b/test/generated/next/masterDataImport/masterDataImport.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace MasterDataImportAcl { +/** + * Use for `useUpload` mutation ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpload` mutation + */ +export const canUseUpload = ( + object?: { officeId: string, } +) => [ + "Import", + object ? subject("MasterData", object) : "MasterData" +] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; + +/** + * Use for `usePostOfficesMasterDataImportByOfficeId` mutation ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePostOfficesMasterDataImportByOfficeId` mutation + */ +export const canUsePostOfficesMasterDataImportByOfficeId = ( + object?: { officeId: string, } +) => [ + "Import", + object ? subject("MasterData", object) : "MasterData" +] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; + +/** + * Use for `useGetImportStatus` query ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetImportStatus` query + */ +export const canUseGetImportStatus = ( + object?: { officeId: string, } +) => [ + "Import", + object ? subject("MasterData", object) : "MasterData" +] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; + +} diff --git a/test/generated/next/masterDataImport/masterDataImport.api.ts b/test/generated/next/masterDataImport/masterDataImport.api.ts new file mode 100644 index 0000000..8690f02 --- /dev/null +++ b/test/generated/next/masterDataImport/masterDataImport.api.ts @@ -0,0 +1,30 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { MasterDataImportModels } from "./masterDataImport.models"; + +export namespace MasterDataImportApi { +export const upload = (officeId: string, data: MasterDataImportModels.MasterDataImportUploadRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, + `/offices/${officeId}/master-data/upload`, + ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), + config + ) +}; +export const postOfficesMasterDataImportByOfficeId = (officeId: string, data: MasterDataImportModels.MasterDataImportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, + `/offices/${officeId}/master-data/import`, + ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), + config + ) +}; +export const getImportStatus = (jobId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, + `/offices/${officeId}/master-data/import/${jobId}/status`, + config + ) +}; +} diff --git a/test/generated/next/masterDataImport/masterDataImport.models.ts b/test/generated/next/masterDataImport/masterDataImport.models.ts new file mode 100644 index 0000000..6033091 --- /dev/null +++ b/test/generated/next/masterDataImport/masterDataImport.models.ts @@ -0,0 +1,78 @@ +import { z } from "zod"; + +export namespace MasterDataImportModels { +/** + * ImportStatusEnumSchema + * @type { enum } + * @description Import result status + */ +export const ImportStatusEnumSchema = z.enum(["Success", "Warning", "Error"]); +export type ImportStatusEnum = z.infer; +export const ImportStatusEnum = ImportStatusEnumSchema.enum; + +/** + * ImportTypeEnumSchema + * @type { enum } + */ +export const ImportTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Warehouse"]); +export type ImportTypeEnum = z.infer; +export const ImportTypeEnum = ImportTypeEnumSchema.enum; + +/** + * MasterDataImportRequestDtoSchema + * @type { object } + * @property { string } mediaId Media ID of the uploaded file + * @property { ImportTypeEnum } type Type of data to import + */ +export const MasterDataImportRequestDtoSchema = z.object({ mediaId: z.string().describe("Media ID of the uploaded file"), type: ImportTypeEnumSchema.describe("Type of data to import") }).readonly(); +export type MasterDataImportRequestDto = z.infer; + +/** + * ImportResultDtoSchema + * @type { object } + * @property { string } importStatus Import result status + * @property { string } downloadUrl S3 presigned URL for result file download + * @property { string } expiresAt Download URL expiration time + * @property { string } errorCode + */ +export const ImportResultDtoSchema = z.object({ importStatus: ImportStatusEnumSchema.describe("Import result status").nullish(), downloadUrl: z.string().describe("S3 presigned URL for result file download"), expiresAt: z.iso.datetime({ offset: true }).describe("Download URL expiration time").nullish(), errorCode: z.string().nullish() }).readonly(); +export type ImportResultDto = z.infer; + +/** + * ImportStatusResponseDtoSchema + * @type { object } + * @property { string } status Current job status + * @property { ImportResultDto } result Import result data when job is completed + */ +export const ImportStatusResponseDtoSchema = z.object({ status: z.string().describe("Current job status").nullable(), result: ImportResultDtoSchema.describe("Import result data when job is completed").nullish() }).readonly(); +export type ImportStatusResponseDto = z.infer; + +/** + * MasterDataImportUploadRequestDtoSchema + * @type { object } + * @property { string } filename File name + * @property { string } contentType Content type of the file + * @property { number } fileSize File size in bytes. Minimum: `1` + */ +export const MasterDataImportUploadRequestDtoSchema = z.object({ filename: z.string().describe("File name"), contentType: z.string().describe("Content type of the file"), fileSize: z.number().gte(1).describe("File size in bytes") }).readonly(); +export type MasterDataImportUploadRequestDto = z.infer; + +/** + * MasterDataImportUploadResponseDtoSchema + * @type { object } + * @property { string } mediaId Media ID for the uploaded file + * @property { string } url S3 presigned upload URL + */ +export const MasterDataImportUploadResponseDtoSchema = z.object({ mediaId: z.string().describe("Media ID for the uploaded file"), url: z.string().describe("S3 presigned upload URL") }).readonly(); +export type MasterDataImportUploadResponseDto = z.infer; + +/** + * MasterDataImportResponseDtoSchema + * @type { object } + * @property { string } jobId PG Boss job ID + * @property { string } status Initial job status + */ +export const MasterDataImportResponseDtoSchema = z.object({ jobId: z.string().describe("PG Boss job ID"), status: z.string().describe("Initial job status").nullish() }).readonly(); +export type MasterDataImportResponseDto = z.infer; + +} diff --git a/test/generated/next/masterDataImport/masterDataImport.queries.ts b/test/generated/next/masterDataImport/masterDataImport.queries.ts new file mode 100644 index 0000000..07d3f9b --- /dev/null +++ b/test/generated/next/masterDataImport/masterDataImport.queries.ts @@ -0,0 +1,121 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { MasterDataImportAcl } from "./masterDataImport.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { MasterDataImportModels } from "./masterDataImport.models"; +import { MasterDataImportApi } from "./masterDataImport.api"; + +export namespace MasterDataImportQueries { +export const moduleName = QueryModule.MasterDataImport; + +export const keys = { + all: [moduleName] as const, + getImportStatus: (jobId: string, officeId: string) => [...keys.all, "/offices/:officeId/master-data/import/:jobId/status", jobId, officeId] as const, +}; + +/** + * Mutation `useUpload` + * @summary Create upload instructions for master data import file + * @permission Requires `canUseUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { MasterDataImportModels.MasterDataImportUploadRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(MasterDataImportAcl.canUseUpload({ officeId } )); + const uploadInstructions = await MasterDataImportApi.upload(officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `usePostOfficesMasterDataImportByOfficeId` + * @summary Start master data import process + * @permission Requires `canUsePostOfficesMasterDataImportByOfficeId` ability + * @param { string } mutation.officeId Path parameter + * @param { MasterDataImportModels.MasterDataImportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const usePostOfficesMasterDataImportByOfficeId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId } )); + return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetImportStatus` + * @summary Get import job status + * @permission Requires `canUseGetImportStatus` ability + * @param { string } object.jobId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetImportStatus = ({ jobId, officeId }: { jobId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getImportStatus(jobId, officeId), + queryFn: () => { + checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId } )); + return MasterDataImportApi.getImportStatus(jobId, officeId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/offices/offices.acl.ts b/test/generated/next/offices/offices.acl.ts new file mode 100644 index 0000000..0f81019 --- /dev/null +++ b/test/generated/next/offices/offices.acl.ts @@ -0,0 +1,102 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace OfficesAcl { +/** + * Use for `useCreate` mutation ability. + * @description Create office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Office" +] as AbilityTuple<"Create", "Office">; + +/** + * Use for `useGet` query ability. + * @description Read office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( +) => [ + "Read", + "Office" +] as AbilityTuple<"Read", "Office">; + +/** + * Use for `useUpdate` mutation ability. + * @description Update office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Office" +] as AbilityTuple<"Update", "Office">; + +/** + * Use for `useUploadDocumentImage` mutation ability. For global ability, omit the object parameter. + * @description Upload office document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadDocumentImage` mutation + */ +export const canUseUploadDocumentImage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useCreateBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Create office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBankAccount` mutation + */ +export const canUseCreateBankAccount = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useUpdateBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Update office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBankAccount` mutation + */ +export const canUseUpdateBankAccount = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useDeleteBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Delete office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBankAccount` mutation + */ +export const canUseDeleteBankAccount = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useUploadBankAccountFooter` mutation ability. For global ability, omit the object parameter. + * @description Upload bank account footer + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadBankAccountFooter` mutation + */ +export const canUseUploadBankAccountFooter = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +} diff --git a/test/generated/next/offices/offices.api.ts b/test/generated/next/offices/offices.api.ts new file mode 100644 index 0000000..23f37d7 --- /dev/null +++ b/test/generated/next/offices/offices.api.ts @@ -0,0 +1,115 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { OfficesModels } from "./offices.models"; + +export namespace OfficesApi { +export const paginate = (limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficesPaginateResponseSchema }, + `/offices`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: OfficesModels.CreateOfficeRequest, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: OfficesModels.OfficeResponseDtoSchema }, + `/offices`, + ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), + config + ) +}; +export const findAllLabels = (search?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: OfficesModels.FindAllLabelsResponseSchema }, + `/offices/labels`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, + `/offices/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const get = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, + `/offices/${id}`, + config + ) +}; +export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: OfficesModels.OfficeResponseDtoSchema }, + `/offices/${id}`, + ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), + config + ) +}; +export const uploadDocumentImage = (officeId: string, data: OfficesModels.UploadOfficeDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, + `/offices/${officeId}/document-image`, + ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), + config + ) +}; +export const createBankAccount = (officeId: string, data: OfficesModels.CreateOfficeBankAccountDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, + `/offices/${officeId}/bank-accounts`, + ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), + config + ) +}; +export const updateBankAccount = (accountId: string, officeId: string, data: OfficesModels.UpdateOfficeBankAccountDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, + `/offices/${officeId}/bank-accounts/${accountId}`, + ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), + config + ) +}; +export const deleteBankAccount = (accountId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/bank-accounts/${accountId}`, + undefined, + config + ) +}; +export const uploadBankAccountFooter = (accountId: string, officeId: string, data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, + `/offices/${officeId}/bank-accounts/${accountId}/footer`, + ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/offices/offices.configs.ts b/test/generated/next/offices/offices.configs.ts new file mode 100644 index 0000000..07f5587 --- /dev/null +++ b/test/generated/next/offices/offices.configs.ts @@ -0,0 +1,135 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { OfficesModels } from "./offices.models"; +import { CommonModels } from "@/data/common/common.models"; +import { OfficesQueries } from "./offices.queries"; +import { OfficesAcl } from "./offices.acl"; + +export namespace OfficesConfigs { +export const officesConfig = { + meta: { + title: "Offices", + }, + readAll: { + schema: OfficesModels.OfficeListItemResponseSchema, + paginated: OfficesQueries.usePaginate, + infinite: OfficesQueries.usePaginateInfinite, + filters: { + schema: OfficesModels.OfficeFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: OfficesModels.OfficeFilterDtoSchema, + options: { + inputs: { + name: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: OfficesModels.OfficeListItemResponseSchema, + options: { + columns: { + id: true, + name: true, + numberOfEmployees: true, + }, + sortable: OfficesModels.OfficesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: OfficesAcl.canUseGet, + schema: OfficesModels.OfficeDetailResponseDtoSchema, + query: OfficesQueries.useGet, + }, + create: { + acl: OfficesAcl.canUseCreate, + schema: OfficesModels.CreateOfficeRequestSchema, + mutation: OfficesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: OfficesModels.CreateOfficeRequestSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, + update: { + acl: OfficesAcl.canUseUpdate, + schema: OfficesModels.UpdateOfficeRequestSchema, + mutation: OfficesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: OfficesModels.UpdateOfficeRequestSchema, + options: { + inputs: { + name: true, + symbol: true, + invoicePrefix: true, + autoClosePositionsAfterDays: true, + defaultLanguage: true, + locale: true, + vatId: true, + taxNumber: true, + termsExport: true, + termsImport: true, + showPaymentInstructions: true, + showCompanyRegistrationNumber: true, + reportInvoicesToHungarianTaxAuthority: true, + restrictPositionInvolvedParties: true, + showWatermarkOnDocuments: true, + showInvoiceVatLinesInOfficeCurrency: true, + usePartnerMatchCodes: true, + restrictFinancePartnersToRelationship: true, + costCenterId: true, + minimumOutgoingInvoiceDate: true, + minimumOutgoingInvoiceServiceDate: true, + minimumIncomingInvoiceDate: true, + minimumIncomingInvoiceServiceDate: true, + countryId: true, + defaultCurrencyId: true, + representingBusinessPartnerId: true, + availableCurrencyIds: true, + generalLedgerSystem: true, + factoringReportingEnabled: true, + bankAccountCurrencyMapping: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + schema: CommonModels.LabelResponseDTOSchema, + paginated: OfficesQueries.usePaginateLabels, + infinite: OfficesQueries.usePaginateLabelsInfinite, + filters: { + schema: OfficesModels.OfficeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: OfficesModels.OfficeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/offices/offices.models.ts b/test/generated/next/offices/offices.models.ts new file mode 100644 index 0000000..c36fc5b --- /dev/null +++ b/test/generated/next/offices/offices.models.ts @@ -0,0 +1,390 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace OfficesModels { +/** + * OfficeCurrencyResponseDtoSchema + * @type { object } + * @property { string } isoCode + * @property { string } name + */ +export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }).readonly(); +export type OfficeCurrencyResponseDto = z.infer; + +/** + * OfficeBankAccountCurrencyMappingResponseDtoSchema + * @type { object } + * @property { string } currency + * @property { string } bankAccountId + * @property { string } bankAccountName + */ +export const OfficeBankAccountCurrencyMappingResponseDtoSchema = z.object({ currency: z.string(), bankAccountId: z.string(), bankAccountName: z.string() }).readonly(); +export type OfficeBankAccountCurrencyMappingResponseDto = z.infer; + +/** + * OfficeBookkeepingResponseDtoSchema + * @type { object } + * @property { string } generalLedgerSystem + * @property { OfficeCurrencyResponseDto } defaultCurrency + * @property { OfficeCurrencyResponseDto[] } availableCurrencies + * @property { boolean } showPaymentInstructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { OfficeBankAccountCurrencyMappingResponseDto[] } bankAccountCurrencyMapping + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { boolean } factoringReportingEnabled + */ +export const OfficeBookkeepingResponseDtoSchema = z.object({ generalLedgerSystem: z.string(), defaultCurrency: OfficeCurrencyResponseDtoSchema.nullish(), availableCurrencies: z.array(OfficeCurrencyResponseDtoSchema).readonly(), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), bankAccountCurrencyMapping: z.array(OfficeBankAccountCurrencyMappingResponseDtoSchema).readonly(), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), factoringReportingEnabled: z.boolean() }).readonly(); +export type OfficeBookkeepingResponseDto = z.infer; + +/** + * OfficeDocumentPartEnumSchema + * @type { enum } + */ +export const OfficeDocumentPartEnumSchema = z.enum(["DocumentFooter", "DocumentHeader", "GeneralTermsAndConditions", "BLTermsAndConditions", "FinanceDocumentFooter"]); +export type OfficeDocumentPartEnum = z.infer; +export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; + +/** + * OfficeDocumentSettingsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } mediaUrl + * @property { CommonModels.LanguageEnum } language + * @property { OfficeDocumentPartEnum } documentPart + */ +export const OfficeDocumentSettingsResponseDtoSchema = z.object({ id: z.string(), mediaUrl: z.string(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }).readonly(); +export type OfficeDocumentSettingsResponseDto = z.infer; + +/** + * AddressResponseDTOSchema + * @type { object } + * @property { string } id ID of the address + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } city City name + * @property { string } district District + * @property { string } isoCode2 2 letter country code + * @property { string } country Country name + * @property { string } isoCode3 3 letter country code + */ +export const AddressResponseDTOSchema = z.object({ id: z.string().describe("ID of the address"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street address"), zip: z.string().describe("ZIP/Postal code"), city: z.string().describe("City name"), district: z.string().describe("District"), isoCode2: z.string().describe("2 letter country code"), country: z.string().describe("Country name"), isoCode3: z.string().describe("3 letter country code") }).readonly(); +export type AddressResponseDTO = z.infer; + +/** + * OfficeRepresentingBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string[] } types + * @property { string[] } email + * @property { string[] } phone + * @property { string } addressId + * @property { AddressResponseDTO } address + */ +export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), types: z.array(z.string()).readonly(), email: z.array(z.string()).readonly().nullish(), phone: z.array(z.string()).readonly().nullish(), addressId: z.string().nullish(), address: AddressResponseDTOSchema.nullish() }).readonly(); +export type OfficeRepresentingBusinessPartnerResponseDto = z.infer; + +/** + * OfficePaymentTermsResponseDtoSchema + * @type { object } + * @property { number } days + * @property { string } relativeTo + */ +export const OfficePaymentTermsResponseDtoSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }).readonly(); +export type OfficePaymentTermsResponseDto = z.infer; + +/** + * OfficeCountryResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const OfficeCountryResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type OfficeCountryResponseDto = z.infer; + +/** + * OfficeBankAccountResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } bankName + * @property { string } iban + * @property { string } swiftBic + * @property { boolean } useFooterOnInvoice + * @property { object } footer + * @property { string } footer.mediaUrl + * @property { boolean } isFactoringBank + */ +export const OfficeBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string(), bankName: z.string(), iban: z.string(), swiftBic: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), isFactoringBank: z.boolean() }).readonly(); +export type OfficeBankAccountResponseDto = z.infer; + +/** + * OfficeDetailResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } symbol + * @property { number } invoicePrefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage + * @property { CommonModels.LocaleEnum } locale + * @property { string } vatId + * @property { string } taxNumber + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { OfficePaymentTermsResponseDto } termsExport + * @property { OfficePaymentTermsResponseDto } termsImport + * @property { OfficeCountryResponseDto } country + * @property { OfficeBankAccountResponseDto[] } bankAccounts + * @property { OfficeBookkeepingResponseDto } bookkeeping + * @property { OfficeDocumentSettingsResponseDto[] } documentSettings + * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner + * @property { boolean } hasInttraCredentials + */ +export const OfficeDetailResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), country: OfficeCountryResponseDtoSchema.nullable(), bankAccounts: z.array(OfficeBankAccountResponseDtoSchema).readonly(), bookkeeping: OfficeBookkeepingResponseDtoSchema, documentSettings: z.array(OfficeDocumentSettingsResponseDtoSchema).readonly(), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), hasInttraCredentials: z.boolean().nullish() }).readonly(); +export type OfficeDetailResponseDto = z.infer; + +/** + * OfficeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } symbol + * @property { number } invoicePrefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage + * @property { CommonModels.LocaleEnum } locale + * @property { string } vatId + * @property { string } taxNumber + * @property { OfficePaymentTermsResponseDto } termsExport + * @property { OfficePaymentTermsResponseDto } termsImport + * @property { boolean } showPaymentInstructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { string } countryId + * @property { string } defaultCurrencyId + * @property { string[] } availableCurrencyIds + * @property { string } generalLedgerSystem + * @property { string } representingBusinessPartnerId + * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner + * @property { boolean } factoringReportingEnabled + */ +export const OfficeResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), countryId: z.string().nullable(), defaultCurrencyId: z.string().nullable(), availableCurrencyIds: z.array(z.string()).readonly().nullable(), generalLedgerSystem: z.string().nullable(), representingBusinessPartnerId: z.string().nullable(), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), factoringReportingEnabled: z.boolean() }).readonly(); +export type OfficeResponseDto = z.infer; + +/** + * UpdateOfficePaymentTermsRequestSchema + * @type { object } + * @property { number } days + * @property { string } relativeTo + */ +export const UpdateOfficePaymentTermsRequestSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }).readonly(); +export type UpdateOfficePaymentTermsRequest = z.infer; + +/** + * UpdateOfficeBankAccountCurrencyMappingSchema + * @type { object } + * @property { string } currency + * @property { string } bankAccountId + */ +export const UpdateOfficeBankAccountCurrencyMappingSchema = z.object({ currency: z.string(), bankAccountId: z.string() }).readonly(); +export type UpdateOfficeBankAccountCurrencyMapping = z.infer; + +/** + * UpdateOfficeRequestSchema + * @type { object } + * @property { string } name Office Name + * @property { string } symbol Office Symbol + * @property { number } invoicePrefix Office Invoice Prefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage Office Default Language + * @property { string } locale + * @property { string } vatId Office Vat Id + * @property { string } taxNumber Office Tax Number + * @property { UpdateOfficePaymentTermsRequest } termsExport Office Terms Export + * @property { UpdateOfficePaymentTermsRequest } termsImport Office Terms Import + * @property { boolean } showPaymentInstructions Office Show Payment Instructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { string } countryId Office country id + * @property { string } defaultCurrencyId Office default currency id + * @property { string } representingBusinessPartnerId Representing business partner id + * @property { string[] } availableCurrencyIds Office availableCurrencyIds + * @property { string } generalLedgerSystem Office general ledger system + * @property { boolean } factoringReportingEnabled + * @property { UpdateOfficeBankAccountCurrencyMapping[] } bankAccountCurrencyMapping Office bank account currency mapping + */ +export const UpdateOfficeRequestSchema = z.object({ name: z.string().describe("Office Name"), symbol: z.string().describe("Office Symbol"), invoicePrefix: z.number().describe("Office Invoice Prefix"), autoClosePositionsAfterDays: z.number(), defaultLanguage: z.string().describe("Office Default Language"), locale: CommonModels.LocaleEnumSchema, vatId: z.string().describe("Office Vat Id"), taxNumber: z.string().describe("Office Tax Number"), termsExport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Export"), termsImport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Import"), showPaymentInstructions: z.boolean().describe("Office Show Payment Instructions"), showCompanyRegistrationNumber: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), costCenterId: z.string(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }), countryId: z.string().describe("Office country id"), defaultCurrencyId: z.string().describe("Office default currency id"), representingBusinessPartnerId: z.string().describe("Representing business partner id"), availableCurrencyIds: z.array(z.string()).readonly().describe("Office availableCurrencyIds"), generalLedgerSystem: z.string().describe("Office general ledger system"), factoringReportingEnabled: z.boolean(), bankAccountCurrencyMapping: z.array(UpdateOfficeBankAccountCurrencyMappingSchema).readonly().describe("Office bank account currency mapping") }).readonly(); +export type UpdateOfficeRequest = z.infer; + +/** + * UploadOfficeDocumentRequestDtoSchema + * @type { object } + * @property { string } fileName File name with extension + * @property { string } mimeType MIME type of the file + * @property { number } fileSize Size of the file + * @property { string } language Language of the document + * @property { string } documentPart Part of the document this image represents + */ +export const UploadOfficeDocumentRequestDtoSchema = z.object({ fileName: z.string().describe("File name with extension"), mimeType: z.string().describe("MIME type of the file"), fileSize: z.number().describe("Size of the file"), language: CommonModels.LanguageEnumSchema.describe("Language of the document"), documentPart: OfficeDocumentPartEnumSchema.describe("Part of the document this image represents") }).readonly(); +export type UploadOfficeDocumentRequestDto = z.infer; + +/** + * OfficeListItemResponseSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { number } numberOfEmployees + */ +export const OfficeListItemResponseSchema = z.object({ id: z.string(), name: z.string(), numberOfEmployees: z.number() }).readonly(); +export type OfficeListItemResponse = z.infer; + +/** + * OfficeFilterDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } search + */ +export const OfficeFilterDtoSchema = z.object({ name: z.string().describe("Name"), search: z.string() }).readonly(); +export type OfficeFilterDto = z.infer; + +/** + * OfficeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const OfficeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type OfficeLabelFilterDto = z.infer; + +/** + * CreateOfficeRequestSchema + * @type { object } + * @property { string } name + */ +export const CreateOfficeRequestSchema = z.object({ name: z.string() }).readonly(); +export type CreateOfficeRequest = z.infer; + +/** + * DocumentImageUploadInstructionsDtoSchema + * @type { object } + * @property { string } method HTTP method to use for upload + * @property { string } url URL to upload the file to + * @property { string } documentId ID of the created/updated document setting + */ +export const DocumentImageUploadInstructionsDtoSchema = z.object({ method: z.string().describe("HTTP method to use for upload"), url: z.string().describe("URL to upload the file to"), documentId: z.string().describe("ID of the created/updated document setting") }).readonly(); +export type DocumentImageUploadInstructionsDto = z.infer; + +/** + * CreateOfficeBankAccountDtoSchema + * @type { object } + * @property { string } name Bank account name + * @property { string } bankName Bank name + * @property { string } iban IBAN + * @property { string } swiftBic SWIFT/BIC code + * @property { boolean } useFooterOnInvoice Use footer on invoice + */ +export const CreateOfficeBankAccountDtoSchema = z.object({ name: z.string().describe("Bank account name"), bankName: z.string().describe("Bank name"), iban: z.string().describe("IBAN"), swiftBic: z.string().describe("SWIFT/BIC code"), useFooterOnInvoice: z.boolean().describe("Use footer on invoice") }).readonly(); +export type CreateOfficeBankAccountDto = z.infer; + +/** + * UpdateOfficeBankAccountDtoSchema + * @type { object } + * @property { string } name Bank account name + * @property { string } bankName Bank name + * @property { string } iban IBAN + * @property { string } swiftBic SWIFT/BIC code + * @property { boolean } useFooterOnInvoice Use footer on invoice + * @property { boolean } isFactoringBank Is factoring bank + */ +export const UpdateOfficeBankAccountDtoSchema = z.object({ name: z.string().describe("Bank account name"), bankName: z.string().describe("Bank name"), iban: z.string().describe("IBAN"), swiftBic: z.string().describe("SWIFT/BIC code"), useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), isFactoringBank: z.boolean().describe("Is factoring bank") }).readonly(); +export type UpdateOfficeBankAccountDto = z.infer; + +/** + * UploadOfficeBankAccountFooterRequestDtoSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType File MIME type + * @property { number } fileSize Size of the file + */ +export const UploadOfficeBankAccountFooterRequestDtoSchema = z.object({ fileName: z.string().describe("File name"), mimeType: z.string().describe("File MIME type"), fileSize: z.number().describe("Size of the file") }).readonly(); +export type UploadOfficeBankAccountFooterRequestDto = z.infer; + +/** + * OfficesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const OfficesPaginateOrderParamEnumSchema = z.enum(["name"]); +export type OfficesPaginateOrderParamEnum = z.infer; +export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema.enum; + +/** + * OfficesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficeListItemResponse[] } items + */ +export const OfficesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(OfficeListItemResponseSchema).readonly() }).readonly().shape }); +export type OfficesPaginateResponse = z.infer; + +/** + * FindAllLabelsResponseSchema + * @type { array } + */ +export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type FindAllLabelsResponse = z.infer; + +/** + * OfficesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const OfficesPaginateLabelsOrderParamEnumSchema = z.enum(["name"]); +export type OfficesPaginateLabelsOrderParamEnum = z.infer; +export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * OfficesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const OfficesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type OfficesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/offices/offices.queries.ts b/test/generated/next/offices/offices.queries.ts new file mode 100644 index 0000000..beb29d6 --- /dev/null +++ b/test/generated/next/offices/offices.queries.ts @@ -0,0 +1,403 @@ +import axios, { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { OfficesAcl } from "./offices.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { OfficesModels } from "./offices.models"; +import { OfficesApi } from "./offices.api"; + +export namespace OfficesQueries { +export const moduleName = QueryModule.Offices; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string) => [...keys.all, "/offices", "infinite", limit, order, filter, cursor] as const, + findAllLabels: (search?: string) => [...keys.all, "/offices/labels", search] as const, + paginateLabels: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string) => [...keys.all, "/offices/labels/paginate", "infinite", limit, order, filter, cursor] as const, + get: (id: string) => [...keys.all, "/offices/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate offices + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => + OfficesApi.paginate(limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate offices + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + OfficesApi.paginate(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create new office + * @permission Requires `canUseCreate` ability + * @param { OfficesModels.CreateOfficeRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(OfficesAcl.canUseCreate()); + return OfficesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindAllLabels` + * @summary List all offices with only their labels + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllLabels = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.findAllLabels(search), + queryFn: () => + OfficesApi.findAllLabels(search, config), + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate offices with only their labels + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => + OfficesApi.paginateLabels(limit, order, filter, page, cursor, config), + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate offices with only their labels + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor, config), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGet` + * @summary Get office by id + * @permission Requires `canUseGet` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(id), + queryFn: () => { + checkAcl(OfficesAcl.canUseGet()); + return OfficesApi.get(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update office + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { OfficesModels.UpdateOfficeRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(OfficesAcl.canUseUpdate()); + return OfficesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUploadDocumentImage` + * @summary Upload document image for an office + * @permission Requires `canUseUploadDocumentImage` ability + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UploadOfficeDocumentRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUploadDocumentImage = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId } )); + const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateBankAccount` + * @summary Create office bank account + * @permission Requires `canUseCreateBankAccount` ability + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.CreateOfficeBankAccountDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId } )); + return OfficesApi.createBankAccount(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateBankAccount` + * @summary Update office bank account + * @permission Requires `canUseUpdateBankAccount` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UpdateOfficeBankAccountDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ accountId, officeId, data }) => { + checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId } )); + return OfficesApi.updateBankAccount(accountId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteBankAccount` + * @summary Delete office bank account + * @permission Requires `canUseDeleteBankAccount` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ accountId, officeId }) => { + checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId } )); + return OfficesApi.deleteBankAccount(accountId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUploadBankAccountFooter` + * @summary Upload office bank account footer + * @permission Requires `canUseUploadBankAccountFooter` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UploadOfficeBankAccountFooterRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUploadBankAccountFooter = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId } )); + const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data, config); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); + } + } + dataToSend.append("file", file); + } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/packageTypes/packageTypes.acl.ts b/test/generated/next/packageTypes/packageTypes.acl.ts new file mode 100644 index 0000000..f37bcb1 --- /dev/null +++ b/test/generated/next/packageTypes/packageTypes.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PackageTypesAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "PackageType" +] as AbilityTuple<"Read", "PackageType">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "PackageType" +] as AbilityTuple<"Create", "PackageType">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "PackageType" +] as AbilityTuple<"Read", "PackageType">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "PackageType" +] as AbilityTuple<"Read", "PackageType">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "PackageType" +] as AbilityTuple<"Update", "PackageType">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "PackageType" +] as AbilityTuple<"Archive", "PackageType">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "PackageType" +] as AbilityTuple<"Archive", "PackageType">; + +} diff --git a/test/generated/next/packageTypes/packageTypes.api.ts b/test/generated/next/packageTypes/packageTypes.api.ts new file mode 100644 index 0000000..afa5bc0 --- /dev/null +++ b/test/generated/next/packageTypes/packageTypes.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PackageTypesModels } from "./packageTypes.models"; + +export namespace PackageTypesApi { +export const paginate = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, + `/package-types`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types`, + ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, + `/package-types/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}`, + config + ) +}; +export const update = (id: string, data: PackageTypesModels.UpdatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}`, + ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/packageTypes/packageTypes.configs.ts b/test/generated/next/packageTypes/packageTypes.configs.ts new file mode 100644 index 0000000..ba6aafd --- /dev/null +++ b/test/generated/next/packageTypes/packageTypes.configs.ts @@ -0,0 +1,129 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PackageTypesModels } from "./packageTypes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PackageTypesQueries } from "./packageTypes.queries"; +import { PackageTypesAcl } from "./packageTypes.acl"; + +export namespace PackageTypesConfigs { +export const packageTypesConfig = { + meta: { + title: "Package Types", + }, + readAll: { + acl: PackageTypesAcl.canUsePaginate, + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + paginated: PackageTypesQueries.usePaginate, + infinite: PackageTypesQueries.usePaginateInfinite, + filters: { + schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + length: true, + width: true, + height: true, + unit: true, + archived: true, + code: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: PackageTypesAcl.canUseFindById, + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + query: PackageTypesQueries.useFindById, + }, + create: { + acl: PackageTypesAcl.canUseCreate, + schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, + mutation: PackageTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, + options: { + inputs: { + name: true, + length: true, + width: true, + height: true, + unit: true, + code: true, + }, + }, +}) + }, + update: { + acl: PackageTypesAcl.canUseUpdate, + schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, + mutation: PackageTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, + options: { + inputs: { + name: true, + length: true, + width: true, + height: true, + unit: true, + code: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: PackageTypesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PackageTypesQueries.usePaginateLabels, + infinite: PackageTypesQueries.usePaginateLabelsInfinite, + filters: { + schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/packageTypes/packageTypes.models.ts b/test/generated/next/packageTypes/packageTypes.models.ts new file mode 100644 index 0000000..f3d28da --- /dev/null +++ b/test/generated/next/packageTypes/packageTypes.models.ts @@ -0,0 +1,128 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PackageTypesModels { +/** + * PackageTypeCodeEnumSchema + * @type { enum } + */ +export const PackageTypeCodeEnumSchema = z.enum(["1A", "1B", "1D", "1F", "1G", "1W", "2C", "3A", "3H", "43", "44", "4A", "4B", "4C", "4D", "4F", "4G", "4H", "5H", "5L", "5M", "6H", "6P", "7A", "7B", "8A", "8B", "8C", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AL", "AM", "AP", "AT", "AV", "B4", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "DA", "DB", "DC", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DP", "DR", "DS", "DT", "DU", "DV", "DW", "DX", "DY", "EC", "ED", "EE", "EF", "EG", "EH", "EI", "EN", "FB", "FC", "FD", "FE", "FI", "FL", "FO", "FP", "FR", "FT", "FW", "FX", "GB", "GI", "GL", "GR", "GU", "GY", "GZ", "HA", "HB", "HC", "HG", "HN", "HR", "IA", "IB", "IC", "ID", "IE", "IF", "IG", "IH", "IK", "IL", "IN", "IZ", "JB", "JC", "JG", "JR", "JT", "JY", "KG", "KI", "LE", "LG", "LT", "LU", "LV", "LZ", "MA", "MB", "MC", "ME", "MR", "MS", "MT", "MW", "MX", "NA", "NE", "NF", "NG", "NS", "NT", "NU", "NV", "OA", "OB", "OC", "OD", "OE", "OF", "OK", "OT", "OU", "P2", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PI", "PJ", "PK", "PL", "PN", "PO", "PP", "PR", "PT", "PU", "PV", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "RD", "RG", "RJ", "RK", "RL", "RO", "RT", "RZ", "SA", "SB", "SC", "SD", "SE", "SH", "SI", "SK", "SL", "SM", "SO", "SP", "SS", "ST", "SU", "SV", "SW", "SY", "SZ", "T1", "TB", "TC", "TD", "TE", "TG", "TI", "TK", "TL", "TN", "TO", "TR", "TS", "TT", "TU", "TV", "TW", "TY", "TZ", "UC", "UN", "VA", "VG", "VI", "VK", "VL", "VO", "VP", "VQ", "VN", "VR", "VS", "VY", "WA", "WB", "WC", "WD", "WF", "WG", "WH", "WJ", "WK", "WL", "WM", "WN", "WP", "WQ", "WR", "WS", "WT", "WU", "WV", "WW", "WX", "WY", "WZ", "XA", "XB", "XC", "XD", "XF", "XG", "XH", "XJ", "XK", "YA", "YB", "YC", "YD", "YF", "YG", "YH", "YJ", "YK", "YL", "YM", "YN", "YP", "YQ", "YR", "YS", "YT", "YV", "YW", "YX", "YY", "YZ", "ZA", "ZB", "ZC", "ZD", "ZF", "ZG", "ZH", "ZJ", "ZK", "ZL", "ZM", "ZN", "ZP", "ZQ", "ZR", "ZS", "ZT", "ZU", "ZV", "ZW", "ZX", "ZY", "ZZ"]); +export type PackageTypeCodeEnum = z.infer; +export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; + +/** + * PackageTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PackageTypeEmployeeDTO = z.infer; + +/** + * PackageTypeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the package type + * @property { string } name Unique name for the package type + * @property { number } length Length of the package type + * @property { number } width Width of the package type + * @property { number } height Height of the package type + * @property { string } unit Measurement unit for dimensions + * @property { boolean } archived Indicates if the package type is archived + * @property { PackageTypeCodeEnum } code + * @property { string } createdById + * @property { PackageTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PackageTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const PackageTypeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the package type"), name: z.string().describe("Unique name for the package type"), length: z.number().describe("Length of the package type").nullish(), width: z.number().describe("Width of the package type").nullish(), height: z.number().describe("Height of the package type").nullish(), unit: z.string().describe("Measurement unit for dimensions"), archived: z.boolean().describe("Indicates if the package type is archived"), code: PackageTypeCodeEnumSchema.nullish(), createdById: z.string().nullish(), createdBy: PackageTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PackageTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type PackageTypeResponseDTO = z.infer; + +/** + * CreatePackageTypeRequestDTOSchema + * @type { object } + * @property { string } name Unique name for the package type + * @property { number } length Length of the package type + * @property { number } width Width of the package type + * @property { number } height Height of the package type + * @property { string } unit Measurement unit for dimensions + * @property { PackageTypeCodeEnum } code + */ +export const CreatePackageTypeRequestDTOSchema = z.object({ name: z.string().describe("Unique name for the package type"), length: z.number().describe("Length of the package type").nullish(), width: z.number().describe("Width of the package type").nullish(), height: z.number().describe("Height of the package type").nullish(), unit: z.string().describe("Measurement unit for dimensions"), code: PackageTypeCodeEnumSchema.nullish() }).readonly(); +export type CreatePackageTypeRequestDTO = z.infer; + +/** + * UpdatePackageTypeRequestDTOSchema + * @type { object } + * @property { string } name Updated name for package type + * @property { number } length Updated length of the package type + * @property { number } width Updated width of the package type + * @property { number } height Updated height of the package type + * @property { string } unit Updated measurement unit for dimensions + * @property { PackageTypeCodeEnum } code + */ +export const UpdatePackageTypeRequestDTOSchema = z.object({ name: z.string().describe("Updated name for package type"), length: z.number().describe("Updated length of the package type").nullable(), width: z.number().describe("Updated width of the package type").nullable(), height: z.number().describe("Updated height of the package type").nullable(), unit: z.string().describe("Updated measurement unit for dimensions"), code: PackageTypeCodeEnumSchema }).readonly(); +export type UpdatePackageTypeRequestDTO = z.infer; + +/** + * PackageTypePaginationFilterDtoSchema + * @type { object } + * @property { boolean } archived Archived + * @property { string } search + */ +export const PackageTypePaginationFilterDtoSchema = z.object({ archived: z.boolean().describe("Archived"), search: z.string() }).readonly(); +export type PackageTypePaginationFilterDto = z.infer; + +/** + * PackageTypeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const PackageTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type PackageTypeLabelFilterDto = z.infer; + +/** + * PackageTypesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PackageTypesPaginateOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PackageTypesPaginateOrderParamEnum = z.infer; +export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParamEnumSchema.enum; + +/** + * PackageTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PackageTypeResponseDTO[] } items + */ +export const PackageTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageTypeResponseDTOSchema).readonly() }).readonly().shape }); +export type PackageTypesPaginateResponse = z.infer; + +/** + * PackageTypesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PackageTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PackageTypesPaginateLabelsOrderParamEnum = z.infer; +export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * PackageTypesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PackageTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PackageTypesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/packageTypes/packageTypes.queries.ts b/test/generated/next/packageTypes/packageTypes.queries.ts new file mode 100644 index 0000000..b7a20a5 --- /dev/null +++ b/test/generated/next/packageTypes/packageTypes.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PackageTypesAcl } from "./packageTypes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PackageTypesModels } from "./packageTypes.models"; +import { PackageTypesApi } from "./packageTypes.api"; + +export namespace PackageTypesQueries { +export const moduleName = QueryModule.PackageTypes; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string) => [...keys.all, "/package-types", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string) => [...keys.all, "/package-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/package-types/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Package Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PackageTypesAcl.canUsePaginate()); + return PackageTypesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Package Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PackageTypesAcl.canUsePaginate()); + return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new Package Type + * @permission Requires `canUseCreate` ability + * @param { PackageTypesModels.CreatePackageTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PackageTypesAcl.canUseCreate()); + return PackageTypesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate package type labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PackageTypesAcl.canUsePaginateLabels()); + return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate package type labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PackageTypesAcl.canUsePaginateLabels()); + return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get Package Type by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PackageTypesAcl.canUseFindById()); + return PackageTypesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Package Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PackageTypesModels.UpdatePackageTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PackageTypesAcl.canUseUpdate()); + return PackageTypesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Package Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PackageTypesAcl.canUseArchive()); + return PackageTypesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive Package Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PackageTypesAcl.canUseUnarchive()); + return PackageTypesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/partnerNetworks/partnerNetworks.acl.ts b/test/generated/next/partnerNetworks/partnerNetworks.acl.ts new file mode 100644 index 0000000..b56d576 --- /dev/null +++ b/test/generated/next/partnerNetworks/partnerNetworks.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PartnerNetworksAcl { +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "PartnerNetwork" +] as AbilityTuple<"Read", "PartnerNetwork">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "PartnerNetwork" +] as AbilityTuple<"Read", "PartnerNetwork">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "PartnerNetwork" +] as AbilityTuple<"Create", "PartnerNetwork">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "PartnerNetwork" +] as AbilityTuple<"Read", "PartnerNetwork">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "PartnerNetwork" +] as AbilityTuple<"Update", "PartnerNetwork">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "PartnerNetwork" +] as AbilityTuple<"Archive", "PartnerNetwork">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "PartnerNetwork" +] as AbilityTuple<"Archive", "PartnerNetwork">; + +} diff --git a/test/generated/next/partnerNetworks/partnerNetworks.api.ts b/test/generated/next/partnerNetworks/partnerNetworks.api.ts new file mode 100644 index 0000000..d24231a --- /dev/null +++ b/test/generated/next/partnerNetworks/partnerNetworks.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; + +export namespace PartnerNetworksApi { +export const paginateLabels = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, + `/partner-networks/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, + `/partner-networks`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks`, + ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}`, + config + ) +}; +export const update = (id: string, data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}`, + ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/partnerNetworks/partnerNetworks.configs.ts b/test/generated/next/partnerNetworks/partnerNetworks.configs.ts new file mode 100644 index 0000000..b9d6545 --- /dev/null +++ b/test/generated/next/partnerNetworks/partnerNetworks.configs.ts @@ -0,0 +1,114 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PartnerNetworksQueries } from "./partnerNetworks.queries"; +import { PartnerNetworksAcl } from "./partnerNetworks.acl"; + +export namespace PartnerNetworksConfigs { +export const partnerNetworksConfig = { + meta: { + title: "Partner Networks", + }, + readAll: { + acl: PartnerNetworksAcl.canUsePaginate, + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + paginated: PartnerNetworksQueries.usePaginate, + infinite: PartnerNetworksQueries.usePaginateInfinite, + filters: { + schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: PartnerNetworksAcl.canUseFindById, + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + query: PartnerNetworksQueries.useFindById, + }, + create: { + acl: PartnerNetworksAcl.canUseCreate, + schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, + mutation: PartnerNetworksQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, + update: { + acl: PartnerNetworksAcl.canUseUpdate, + schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, + mutation: PartnerNetworksQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: PartnerNetworksAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PartnerNetworksQueries.usePaginateLabels, + infinite: PartnerNetworksQueries.usePaginateLabelsInfinite, + filters: { + schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/partnerNetworks/partnerNetworks.models.ts b/test/generated/next/partnerNetworks/partnerNetworks.models.ts new file mode 100644 index 0000000..e87d278 --- /dev/null +++ b/test/generated/next/partnerNetworks/partnerNetworks.models.ts @@ -0,0 +1,105 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PartnerNetworksModels { +/** + * PartnerNetworkEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PartnerNetworkEmployeeDTO = z.infer; + +/** + * PartnerNetworkResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the partner network + * @property { string } name Name of the partner network + * @property { boolean } archived Whether the partner network is archived + * @property { string } createdById + * @property { PartnerNetworkEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PartnerNetworkEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const PartnerNetworkResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the partner network"), name: z.string().describe("Name of the partner network"), archived: z.boolean().describe("Whether the partner network is archived"), createdById: z.string().nullish(), createdBy: PartnerNetworkEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PartnerNetworkEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type PartnerNetworkResponseDTO = z.infer; + +/** + * PartnerNetworkLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const PartnerNetworkLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type PartnerNetworkLabelFilterDto = z.infer; + +/** + * PartnerNetworkPaginationFilterDtoSchema + * @type { object } + * @property { string } search Free search + * @property { boolean } archived + */ +export const PartnerNetworkPaginationFilterDtoSchema = z.object({ search: z.string().describe("Free search"), archived: z.boolean() }).readonly(); +export type PartnerNetworkPaginationFilterDto = z.infer; + +/** + * CreatePartnerNetworkRequestDTOSchema + * @type { object } + * @property { string } name Name of the partner network + */ +export const CreatePartnerNetworkRequestDTOSchema = z.object({ name: z.string().describe("Name of the partner network") }).readonly(); +export type CreatePartnerNetworkRequestDTO = z.infer; + +/** + * UpdatePartnerNetworkRequestDTOSchema + * @type { object } + * @property { string } name Name of the partner network + */ +export const UpdatePartnerNetworkRequestDTOSchema = z.object({ name: z.string().describe("Name of the partner network") }).readonly(); +export type UpdatePartnerNetworkRequestDTO = z.infer; + +/** + * PartnerNetworksPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PartnerNetworksPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PartnerNetworksPaginateLabelsOrderParamEnum = z.infer; +export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPaginateLabelsOrderParamEnumSchema.enum; + +/** + * PartnerNetworksPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PartnerNetworksPaginateLabelsResponse = z.infer; + +/** + * PartnerNetworksPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PartnerNetworksPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PartnerNetworksPaginateOrderParamEnum = z.infer; +export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrderParamEnumSchema.enum; + +/** + * PartnerNetworksPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerNetworkResponseDTO[] } items + */ +export const PartnerNetworksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).readonly() }).readonly().shape }); +export type PartnerNetworksPaginateResponse = z.infer; + +} diff --git a/test/generated/next/partnerNetworks/partnerNetworks.queries.ts b/test/generated/next/partnerNetworks/partnerNetworks.queries.ts new file mode 100644 index 0000000..a0514a6 --- /dev/null +++ b/test/generated/next/partnerNetworks/partnerNetworks.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PartnerNetworksAcl } from "./partnerNetworks.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PartnerNetworksModels } from "./partnerNetworks.models"; +import { PartnerNetworksApi } from "./partnerNetworks.api"; + +export namespace PartnerNetworksQueries { +export const moduleName = QueryModule.PartnerNetworks; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string) => [...keys.all, "/partner-networks", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/partner-networks/:id", id] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate partner networks with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); + return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate partner networks with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); + return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary Paginate Partner Networks + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUsePaginate()); + return PartnerNetworksApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Partner Networks + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PartnerNetworksAcl.canUsePaginate()); + return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new Partner Network + * @permission Requires `canUseCreate` ability + * @param { PartnerNetworksModels.CreatePartnerNetworkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PartnerNetworksAcl.canUseCreate()); + return PartnerNetworksApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get Partner Network by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUseFindById()); + return PartnerNetworksApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Partner Network + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PartnerNetworksAcl.canUseUpdate()); + return PartnerNetworksApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Partner Network + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PartnerNetworksAcl.canUseArchive()); + return PartnerNetworksApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive Partner Network + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PartnerNetworksAcl.canUseUnarchive()); + return PartnerNetworksApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.acl.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.acl.ts new file mode 100644 index 0000000..2ede29d --- /dev/null +++ b/test/generated/next/paymentConfirmations/paymentConfirmations.acl.ts @@ -0,0 +1,43 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PaymentConfirmationsAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read payment confirmation items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate payment confirmation document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetEml` mutation ability. For global ability, omit the object parameter. + * @description Download payment confirmation as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetEml` mutation + */ +export const canUseGetEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +} diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.api.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.api.ts new file mode 100644 index 0000000..25755a1 --- /dev/null +++ b/test/generated/next/paymentConfirmations/paymentConfirmations.api.ts @@ -0,0 +1,54 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; + +export namespace PaymentConfirmationsApi { +export const get = (officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, + `/offices/${officeId}/payment-confirmations`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const generate = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payment-confirmations/generate`, + ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getEml = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payment-confirmations/eml`, + ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.configs.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.configs.ts new file mode 100644 index 0000000..af0fe49 --- /dev/null +++ b/test/generated/next/paymentConfirmations/paymentConfirmations.configs.ts @@ -0,0 +1,49 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; +import { PaymentConfirmationsQueries } from "./paymentConfirmations.queries"; +import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; + +export namespace PaymentConfirmationsConfigs { +export const paymentConfirmationsConfig = { + meta: { + title: "Payment Confirmations", + }, + readAll: { + acl: PaymentConfirmationsAcl.canUseGet, + schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, + paginated: PaymentConfirmationsQueries.useGet, + infinite: PaymentConfirmationsQueries.useGetInfinite, + filters: { + schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, + options: { + inputs: { + businessPartnerId: true, + paymentDate: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, + options: { + columns: { + invoiceId: true, + invoiceNumber: true, + invoiceDate: true, + invoiceAmount: true, + amount: true, + currencyNotation: true, + reference: true, + position: true, + paymentDate: true, + }, + sortable: PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.models.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.models.ts new file mode 100644 index 0000000..acbe59b --- /dev/null +++ b/test/generated/next/paymentConfirmations/paymentConfirmations.models.ts @@ -0,0 +1,70 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PaymentConfirmationsModels { +/** + * PaymentConfirmationPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export type PaymentConfirmationPositionDto = z.infer; + +/** + * PaymentConfirmationItemDtoSchema + * @type { object } + * @property { string } invoiceId Invoice ID + * @property { string } invoiceNumber Invoice number + * @property { string } invoiceDate Invoice date + * @property { number } invoiceAmount Invoice amount + * @property { number } amount Payment amount + * @property { string } currencyNotation Currency notation + * @property { string } reference Reference + * @property { PaymentConfirmationPositionDto } position Position information + * @property { string } paymentDate Payment date + */ +export const PaymentConfirmationItemDtoSchema = z.object({ invoiceId: z.string().describe("Invoice ID"), invoiceNumber: z.string().describe("Invoice number"), invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date"), invoiceAmount: z.number().describe("Invoice amount"), amount: z.number().describe("Payment amount"), currencyNotation: z.string().describe("Currency notation"), reference: z.string().describe("Reference").nullish(), position: PaymentConfirmationPositionDtoSchema.describe("Position information"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date") }).readonly(); +export type PaymentConfirmationItemDto = z.infer; + +/** + * PaymentConfirmationItemFilterDtoSchema + * @type { object } + * @property { string } businessPartnerId Business partner ID + * @property { string } paymentDate Payment date + */ +export const PaymentConfirmationItemFilterDtoSchema = z.object({ businessPartnerId: z.string().describe("Business partner ID"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date") }).readonly(); +export type PaymentConfirmationItemFilterDto = z.infer; + +/** + * GeneratePaymentConfirmationRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId Business partner ID + * @property { string } paymentDate Payment date + * @property { string } positionId Position ID (optional) + */ +export const GeneratePaymentConfirmationRequestDtoSchema = z.object({ businessPartnerId: z.string().describe("Business partner ID"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), positionId: z.string().describe("Position ID (optional)").nullish() }).readonly(); +export type GeneratePaymentConfirmationRequestDto = z.infer; + +/** + * PaymentConfirmationsGetOrderParamEnumSchema + * @type { enum } + */ +export const PaymentConfirmationsGetOrderParamEnumSchema = z.enum(["paymentDate", "invoiceNumber", "amount"]); +export type PaymentConfirmationsGetOrderParamEnum = z.infer; +export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrderParamEnumSchema.enum; + +/** + * PaymentConfirmationsGetResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PaymentConfirmationItemDto[] } items + */ +export const PaymentConfirmationsGetResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).readonly() }).readonly().shape }); +export type PaymentConfirmationsGetResponse = z.infer; + +} diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts new file mode 100644 index 0000000..129aa28 --- /dev/null +++ b/test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts @@ -0,0 +1,131 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; +import { PaymentConfirmationsApi } from "./paymentConfirmations.api"; + +export namespace PaymentConfirmationsQueries { +export const moduleName = QueryModule.PaymentConfirmations; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", officeId, filter, limit, order, page, cursor] as const, + getInfinite: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", "infinite", officeId, filter, limit, order, cursor] as const, +}; + +/** + * Query `useGet` + * @summary Get payment confirmation items + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, filter, limit, order, page, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, filter, limit, order, page, cursor), + queryFn: () => { + checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); + return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useGetInfinite + * @summary Get payment confirmation items + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetInfinite = ({ officeId, filter, limit, order, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); + return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useGenerate` - recommended when file should not be cached + * @summary Generate payment confirmation PDF + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId } )); + return PaymentConfirmationsApi.generate(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGetEml` - recommended when file should not be cached + * @summary Get payment confirmation as EML file with PDF attachment + * @permission Requires `canUseGetEml` ability + * @param { string } mutation.officeId Path parameter + * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId } )); + return PaymentConfirmationsApi.getEml(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/ports/ports.acl.ts b/test/generated/next/ports/ports.acl.ts new file mode 100644 index 0000000..9332110 --- /dev/null +++ b/test/generated/next/ports/ports.acl.ts @@ -0,0 +1,54 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace PortsAcl { +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Port" +] as AbilityTuple<"Read", "Port">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Port" +] as AbilityTuple<"Create", "Port">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Port" +] as AbilityTuple<"Read", "Port">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Port" +] as AbilityTuple<"Update", "Port">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Port" +] as AbilityTuple<"Read", "Port">; + +} diff --git a/test/generated/next/ports/ports.api.ts b/test/generated/next/ports/ports.api.ts new file mode 100644 index 0000000..413f9ec --- /dev/null +++ b/test/generated/next/ports/ports.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PortsModels } from "./ports.models"; + +export namespace PortsApi { +export const paginate = (limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PortsModels.PortsPaginateResponseSchema }, + `/ports`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: PortsModels.CreatePortRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports`, + ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), + config + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, + `/ports/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports/${id}`, + ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports/${id}`, + config + ) +}; +} diff --git a/test/generated/next/ports/ports.configs.ts b/test/generated/next/ports/ports.configs.ts new file mode 100644 index 0000000..33adfc6 --- /dev/null +++ b/test/generated/next/ports/ports.configs.ts @@ -0,0 +1,128 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PortsModels } from "./ports.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PortsQueries } from "./ports.queries"; +import { PortsAcl } from "./ports.acl"; + +export namespace PortsConfigs { +export const portsConfig = { + meta: { + title: "Ports", + }, + readAll: { + acl: PortsAcl.canUsePaginate, + schema: PortsModels.PortResponseDTOSchema, + paginated: PortsQueries.usePaginate, + infinite: PortsQueries.usePaginateInfinite, + filters: { + schema: PortsModels.PortPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PortsModels.PortPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PortsModels.PortResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + address: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PortsModels.PortsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: PortsAcl.canUseFindById, + schema: PortsModels.PortResponseDTOSchema, + query: PortsQueries.useFindById, + }, + create: { + acl: PortsAcl.canUseCreate, + schema: PortsModels.CreatePortRequestDTOSchema, + mutation: PortsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PortsModels.CreatePortRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) + }, + update: { + acl: PortsAcl.canUseUpdate, + schema: PortsModels.UpdatePortRequestDTOSchema, + mutation: PortsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PortsModels.UpdatePortRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: PortsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PortsQueries.usePaginateLabels, + infinite: PortsQueries.usePaginateLabelsInfinite, + filters: { + schema: PortsModels.PortLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PortsModels.PortLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: PortsModels.PortsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/ports/ports.models.ts b/test/generated/next/ports/ports.models.ts new file mode 100644 index 0000000..7bb660d --- /dev/null +++ b/test/generated/next/ports/ports.models.ts @@ -0,0 +1,151 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PortsModels { +/** + * PortCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PortCityDto = z.infer; + +/** + * PortCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const PortCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type PortCountryDto = z.infer; + +/** + * PortAddressDtoSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { PortCityDto } city + * @property { string } district District name + * @property { PortCountryDto } country + */ +export const PortAddressDtoSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: PortCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: PortCountryDtoSchema.nullish() }).readonly(); +export type PortAddressDto = z.infer; + +/** + * PortEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type PortEmployeeDTO = z.infer; + +/** + * PortResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the port + * @property { string } name Name of the port + * @property { string } matchCode Match code for the port + * @property { PortAddressDto } address Address details of the port + * @property { string } createdById + * @property { PortEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PortEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const PortResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port"), matchCode: z.string().describe("Match code for the port"), address: PortAddressDtoSchema.describe("Address details of the port"), createdById: z.string().nullish(), createdBy: PortEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PortEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type PortResponseDTO = z.infer; + +/** + * PortPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter ports by name or match code + */ +export const PortPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter ports by name or match code") }).readonly(); +export type PortPaginationFilterDto = z.infer; + +/** + * PortLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const PortLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type PortLabelFilterDto = z.infer; + +/** + * CreatePortRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } matchCode + * @property { string } street Street address + * @property { string } secondaryStreet + * @property { string } zip ZIP / Postal code + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } district + */ +export const CreatePortRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), street: z.string().describe("Street address"), secondaryStreet: z.string().nullish(), zip: z.string().describe("ZIP / Postal code"), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), district: z.string().nullish() }).readonly(); +export type CreatePortRequestDTO = z.infer; + +/** + * UpdatePortRequestDTOSchema + * @type { object } + * @property { string } name Updated name + * @property { string } matchCode Updated match code + * @property { string } street Updated street address + * @property { string } secondaryStreet Updated secondary street + * @property { string } zip Updated ZIP/Postal code + * @property { string } cityId Updated city id + * @property { string } countryId Updated country id + * @property { string } district + */ +export const UpdatePortRequestDTOSchema = z.object({ name: z.string().describe("Updated name"), matchCode: z.string().describe("Updated match code"), street: z.string().describe("Updated street address"), secondaryStreet: z.string().describe("Updated secondary street"), zip: z.string().describe("Updated ZIP/Postal code"), cityId: z.string().describe("Updated city id"), countryId: z.string().describe("Updated country id"), district: z.string() }).readonly(); +export type UpdatePortRequestDTO = z.infer; + +/** + * PortsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PortsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PortsPaginateOrderParamEnum = z.infer; +export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enum; + +/** + * PortsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PortResponseDTO[] } items + */ +export const PortsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PortResponseDTOSchema).readonly() }).readonly().shape }); +export type PortsPaginateResponse = z.infer; + +/** + * PortsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PortsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PortsPaginateLabelsOrderParamEnum = z.infer; +export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * PortsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PortsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PortsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/ports/ports.queries.ts b/test/generated/next/ports/ports.queries.ts new file mode 100644 index 0000000..60aaca2 --- /dev/null +++ b/test/generated/next/ports/ports.queries.ts @@ -0,0 +1,209 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PortsAcl } from "./ports.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PortsModels } from "./ports.models"; +import { PortsApi } from "./ports.api"; + +export namespace PortsQueries { +export const moduleName = QueryModule.Ports; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string) => [...keys.all, "/ports", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string) => [...keys.all, "/ports/labels/paginate", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/ports/:id", id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Ports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PortsAcl.canUsePaginate()); + return PortsApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Ports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PortsAcl.canUsePaginate()); + return PortsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create port + * @permission Requires `canUseCreate` ability + * @param { PortsModels.CreatePortRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PortsAcl.canUseCreate()); + return PortsApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate ports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PortsAcl.canUsePaginateLabels()); + return PortsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate ports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PortsAcl.canUsePaginateLabels()); + return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update port + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PortsModels.UpdatePortRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PortsAcl.canUseUpdate()); + return PortsApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get port by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PortsAcl.canUseFindById()); + return PortsApi.findById(id, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/positionAccount/positionAccount.acl.ts b/test/generated/next/positionAccount/positionAccount.acl.ts new file mode 100644 index 0000000..f887d12 --- /dev/null +++ b/test/generated/next/positionAccount/positionAccount.acl.ts @@ -0,0 +1,17 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionAccountAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +} diff --git a/test/generated/next/positionAccount/positionAccount.api.ts b/test/generated/next/positionAccount/positionAccount.api.ts new file mode 100644 index 0000000..50e84d6 --- /dev/null +++ b/test/generated/next/positionAccount/positionAccount.api.ts @@ -0,0 +1,13 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { PositionAccountModels } from "./positionAccount.models"; + +export namespace PositionAccountApi { +export const get = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/account`, + config + ) +}; +} diff --git a/test/generated/next/positionAccount/positionAccount.models.ts b/test/generated/next/positionAccount/positionAccount.models.ts new file mode 100644 index 0000000..192acb9 --- /dev/null +++ b/test/generated/next/positionAccount/positionAccount.models.ts @@ -0,0 +1,52 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionAccountModels { +/** + * PositionAccountTotalsResponseDtoSchema + * @type { object } + * @property { number } totalBuyRates Total buy rates + * @property { number } totalSellRates Total sell rates + * @property { number } totalProfit Total profit + * @property { number } margin Margin percentage + * @property { number } displayAmount Display amount + * @property { string } displayCurrencyCode Display currency code + */ +export const PositionAccountTotalsResponseDtoSchema = z.object({ totalBuyRates: z.number().describe("Total buy rates"), totalSellRates: z.number().describe("Total sell rates"), totalProfit: z.number().describe("Total profit"), margin: z.number().describe("Margin percentage").nullish(), displayAmount: z.number().describe("Display amount"), displayCurrencyCode: z.string().describe("Display currency code") }).readonly(); +export type PositionAccountTotalsResponseDto = z.infer; + +/** + * PositionAccountMasterTotalsDtoSchema + * @type { object } + * @property { PositionAccountTotalsResponseDto } totals + * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency + */ +export const PositionAccountMasterTotalsDtoSchema = z.object({ totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly() }).readonly(); +export type PositionAccountMasterTotalsDto = z.infer; + +/** + * ChildPositionAccountReferenceDtoSchema + * @type { object } + * @property { string } positionId + * @property { string } positionNumber + * @property { string } accountId + */ +export const ChildPositionAccountReferenceDtoSchema = z.object({ positionId: z.string().nullish(), positionNumber: z.string(), accountId: z.string() }).readonly(); +export type ChildPositionAccountReferenceDto = z.infer; + +/** + * PositionAccountResponseDtoSchema + * @type { object } + * @property { string } id Account ID + * @property { string } positionId Position ID + * @property { string } invoiceId Invoice ID + * @property { CommonModels.PositionAccountItemDtoResponse[] } items Account items + * @property { PositionAccountTotalsResponseDto } totals + * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency + * @property { PositionAccountMasterTotalsDto } masterTotals + * @property { ChildPositionAccountReferenceDto[] } childPositionAccounts + */ +export const PositionAccountResponseDtoSchema = z.object({ id: z.string().describe("Account ID"), positionId: z.string().describe("Position ID").nullish(), invoiceId: z.string().describe("Invoice ID").nullish(), items: z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly().describe("Account items"), totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), masterTotals: PositionAccountMasterTotalsDtoSchema.nullish(), childPositionAccounts: z.array(ChildPositionAccountReferenceDtoSchema).readonly().nullish() }).readonly(); +export type PositionAccountResponseDto = z.infer; + +} diff --git a/test/generated/next/positionAccount/positionAccount.queries.ts b/test/generated/next/positionAccount/positionAccount.queries.ts new file mode 100644 index 0000000..cb137f9 --- /dev/null +++ b/test/generated/next/positionAccount/positionAccount.queries.ts @@ -0,0 +1,39 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionAccountAcl } from "./positionAccount.acl"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { PositionAccountApi } from "./positionAccount.api"; + +export namespace PositionAccountQueries { +export const moduleName = QueryModule.PositionAccount; + +export const keys = { + all: [moduleName] as const, + get: (positionId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account", positionId, officeId] as const, +}; + +/** + * Query `useGet` + * @summary Get position account details + * @permission Requires `canUseGet` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ positionId, officeId }: { positionId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(positionId, officeId), + queryFn: () => { + checkAcl(PositionAccountAcl.canUseGet({ officeId } )); + return PositionAccountApi.get(positionId, officeId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/positionAccountItems/positionAccountItems.acl.ts b/test/generated/next/positionAccountItems/positionAccountItems.acl.ts new file mode 100644 index 0000000..8f2be12 --- /dev/null +++ b/test/generated/next/positionAccountItems/positionAccountItems.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionAccountItemsAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useDeletePositionAccountItems` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePositionAccountItems` mutation + */ +export const canUseDeletePositionAccountItems = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ +export const canUseDuplicate = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useReassign` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReassign` mutation + */ +export const canUseReassign = ( + object?: { officeId: string, } +) => [ + "Reassign", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useReorder` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation + */ +export const canUseReorder = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +} diff --git a/test/generated/next/positionAccountItems/positionAccountItems.api.ts b/test/generated/next/positionAccountItems/positionAccountItems.api.ts new file mode 100644 index 0000000..3813a9b --- /dev/null +++ b/test/generated/next/positionAccountItems/positionAccountItems.api.ts @@ -0,0 +1,56 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionAccountItemsModels } from "./positionAccountItems.models"; + +export namespace PositionAccountItemsApi { +export const create = (positionId: string, officeId: string, data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), + config + ) +}; +export const deletePositionAccountItems = (positionId: string, officeId: string, data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), + config + ) +}; +export const update = (positionId: string, officeId: string, data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), + config + ) +}; +export const duplicate = (positionId: string, officeId: string, data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, + ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), + config + ) +}; +export const reassign = (positionId: string, officeId: string, data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items/reassign`, + ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), + config + ) +}; +export const reorder = (positionId: string, itemId: string, officeId: string, data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, + ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/positionAccountItems/positionAccountItems.models.ts b/test/generated/next/positionAccountItems/positionAccountItems.models.ts new file mode 100644 index 0000000..3ed5734 --- /dev/null +++ b/test/generated/next/positionAccountItems/positionAccountItems.models.ts @@ -0,0 +1,167 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionAccountItemsModels { +/** + * CreatePositionChargeDataRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const CreatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount"), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount"), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export type CreatePositionChargeDataRequestDto = z.infer; + +/** + * CreatePositionTextDataRequestDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const CreatePositionTextDataRequestDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type CreatePositionTextDataRequestDto = z.infer; + +/** + * CreatePositionAccountItemRequestDtoSchema + * @type { object } + * @property { CommonModels.PositionAccountItemTypeEnum } type Item type + * @property { CreatePositionChargeDataRequestDto } charge Charge data if type is CHARGE + * @property { CreatePositionTextDataRequestDto } text Text data if type is TEXT + */ +export const CreatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), charge: CreatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), text: CreatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish() }).readonly(); +export type CreatePositionAccountItemRequestDto = z.infer; + +/** + * CreatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { CreatePositionAccountItemRequestDto[] } items Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER) + */ +export const CreatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(CreatePositionAccountItemRequestDtoSchema).readonly().describe("Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER)") }).readonly(); +export type CreatePositionAccountItemsRequestDto = z.infer; + +/** + * UpdatePositionChargeDataRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const UpdatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount").nullable(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount").nullable(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export type UpdatePositionChargeDataRequestDto = z.infer; + +/** + * UpdatePositionTextDataRequestDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const UpdatePositionTextDataRequestDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type UpdatePositionTextDataRequestDto = z.infer; + +/** + * UpdatePositionAccountItemRequestDtoSchema + * @type { object } + * @property { CommonModels.PositionAccountItemTypeEnum } type Item type + * @property { UpdatePositionChargeDataRequestDto } charge Charge data if type is CHARGE + * @property { UpdatePositionTextDataRequestDto } text Text data if type is TEXT + */ +export const UpdatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), charge: UpdatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), text: UpdatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish() }).readonly(); +export type UpdatePositionAccountItemRequestDto = z.infer; + +/** + * UpdatePositionAccountItemWithIdRequestDtoSchema + * @type { object } + * @property { string } id ID of the item to update + * @property { UpdatePositionAccountItemRequestDto } data Data to update + */ +export const UpdatePositionAccountItemWithIdRequestDtoSchema = z.object({ id: z.string().describe("ID of the item to update"), data: UpdatePositionAccountItemRequestDtoSchema.describe("Data to update") }).readonly(); +export type UpdatePositionAccountItemWithIdRequestDto = z.infer; + +/** + * UpdatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { UpdatePositionAccountItemWithIdRequestDto[] } items Array of items to update + */ +export const UpdatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(UpdatePositionAccountItemWithIdRequestDtoSchema).readonly().describe("Array of items to update") }).readonly(); +export type UpdatePositionAccountItemsRequestDto = z.infer; + +/** + * DeletePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to delete + */ +export const DeletePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to delete") }).readonly(); +export type DeletePositionAccountItemsRequestDto = z.infer; + +/** + * DuplicatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to duplicate + */ +export const DuplicatePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to duplicate") }).readonly(); +export type DuplicatePositionAccountItemsRequestDto = z.infer; + +/** + * ReassignPositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to reassign + * @property { string } targetPositionId Target position ID to reassign items to + */ +export const ReassignPositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to reassign"), targetPositionId: z.string().describe("Target position ID to reassign items to") }).readonly(); +export type ReassignPositionAccountItemsRequestDto = z.infer; + +/** + * ReorderPositionAccountItemRequestDtoSchema + * @type { object } + * @property { number } orderPosition New order position for the item + */ +export const ReorderPositionAccountItemRequestDtoSchema = z.object({ orderPosition: z.number().describe("New order position for the item") }).readonly(); +export type ReorderPositionAccountItemRequestDto = z.infer; + +/** + * PositionAccountItemsCreateResponseSchema + * @type { array } + */ +export const PositionAccountItemsCreateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export type PositionAccountItemsCreateResponse = z.infer; + +/** + * PositionAccountItemsUpdateResponseSchema + * @type { array } + */ +export const PositionAccountItemsUpdateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export type PositionAccountItemsUpdateResponse = z.infer; + +/** + * PositionAccountItemsDuplicateResponseSchema + * @type { array } + */ +export const PositionAccountItemsDuplicateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export type PositionAccountItemsDuplicateResponse = z.infer; + +/** + * ReassignResponseSchema + * @type { array } + */ +export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export type ReassignResponse = z.infer; + +} diff --git a/test/generated/next/positionAccountItems/positionAccountItems.queries.ts b/test/generated/next/positionAccountItems/positionAccountItems.queries.ts new file mode 100644 index 0000000..25c26e1 --- /dev/null +++ b/test/generated/next/positionAccountItems/positionAccountItems.queries.ts @@ -0,0 +1,185 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionAccountItemsAcl } from "./positionAccountItems.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionAccountItemsModels } from "./positionAccountItems.models"; +import { PositionAccountItemsApi } from "./positionAccountItems.api"; + +export namespace PositionAccountItemsQueries { +export const moduleName = QueryModule.PositionAccountItems; + + + +/** + * Mutation `useCreate` + * @summary Create position account items (bulk) + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId } )); + return PositionAccountItemsApi.create(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeletePositionAccountItems` + * @summary Delete position account items (bulk) + * @permission Requires `canUseDeletePositionAccountItems` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeletePositionAccountItems = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId } )); + return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update position account items (bulk) + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId } )); + return PositionAccountItemsApi.update(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicate` + * @summary Duplicate position account items (bulk) + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId } )); + return PositionAccountItemsApi.duplicate(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReassign` + * @summary Reassign position account items to another position (bulk) + * @permission Requires `canUseReassign` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReassign = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId } )); + return PositionAccountItemsApi.reassign(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReorder` + * @summary Reorder position account item + * @permission Requires `canUseReorder` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.ReorderPositionAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, itemId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId } )); + return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/positionCargo/positionCargo.acl.ts b/test/generated/next/positionCargo/positionCargo.acl.ts new file mode 100644 index 0000000..f62ee50 --- /dev/null +++ b/test/generated/next/positionCargo/positionCargo.acl.ts @@ -0,0 +1,121 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionCargoAcl { +/** + * Use for `useListCargosByPositionId` query ability. For global ability, omit the object parameter. + * @description List cargo items by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByPositionId` query + */ +export const canUseListCargosByPositionId = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useCreateCargo` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCargo` mutation + */ +export const canUseCreateCargo = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. + * @description List cargo labels by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query + */ +export const canUseListCargoLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. + * @description Get cargo summary by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query + */ +export const canUseGetCargoSummary = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. + * @description Get cargo item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query + */ +export const canUseGetCargoById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. + * @description Update cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation + */ +export const canUseUpdateCargo = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation + */ +export const canUseDeleteCargo = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation + */ +export const canUseCreateBulkCargos = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation + */ +export const canUseDuplicateCargo = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +} diff --git a/test/generated/next/positionCargo/positionCargo.api.ts b/test/generated/next/positionCargo/positionCargo.api.ts new file mode 100644 index 0000000..e65a328 --- /dev/null +++ b/test/generated/next/positionCargo/positionCargo.api.ts @@ -0,0 +1,85 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionCargoModels } from "./positionCargo.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoApi { +export const listCargosByPositionId = (officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos`, + { + ...config, + params: { + order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createCargo = (officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config + ) +}; +export const listCargoLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/labels`, + config + ) +}; +export const getCargoSummary = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/summary`, + config + ) +}; +export const getCargoById = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + config + ) +}; +export const updateCargo = (officeId: string, positionId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), + config + ) +}; +export const deleteCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + undefined, + config + ) +}; +export const createBulkCargos = (numberOfCargos: number, officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config + ) +}; +export const duplicateCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/positionCargo/positionCargo.configs.ts b/test/generated/next/positionCargo/positionCargo.configs.ts new file mode 100644 index 0000000..a62c692 --- /dev/null +++ b/test/generated/next/positionCargo/positionCargo.configs.ts @@ -0,0 +1,133 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoQueries } from "./positionCargo.queries"; +import { PositionCargoAcl } from "./positionCargo.acl"; + +export namespace PositionCargoConfigs { +export const cargosConfig = { + meta: { + title: "Cargos", + }, + readAll: { + acl: PositionCargoAcl.canUseListCargosByPositionId, + schema: CommonModels.PositionCargoResponseDTOSchema, + paginated: PositionCargoQueries.useListCargosByPositionId, + infinite: PositionCargoQueries.useListCargosByPositionIdInfinite, + columns: dynamicColumns({ + schema: CommonModels.PositionCargoResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + quoteId: true, + rootFolderId: true, + cargoType: true, + autoCalculateTotals: true, + autoCalculateRates: true, + autoCalculateVgm: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + rateOptions: true, + rateClass: true, + textForCustoms: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + ratePerKg: true, + totalRate: true, + tare: true, + vgm: true, + hsCodeLabels: true, + note: true, + packages: true, + createdAt: true, + updatedAt: true, + completeWeight: true, + packageTotals: true, + }, + }, +}), + }, + read: { + acl: PositionCargoAcl.canUseGetCargoById, + schema: CommonModels.PositionCargoResponseDTOSchema, + query: PositionCargoQueries.useGetCargoById, + }, + create: { + acl: PositionCargoAcl.canUseCreateCargo, + schema: CommonModels.CreatePositionCargoDTOSchema, + mutation: PositionCargoQueries.useCreateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.CreatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, +}) + }, + update: { + acl: PositionCargoAcl.canUseUpdateCargo, + schema: CommonModels.UpdatePositionCargoDTOSchema, + mutation: PositionCargoQueries.useUpdateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.UpdatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, +}) + }, + delete: { + acl: PositionCargoAcl.canUseDeleteCargo, + mutation: PositionCargoQueries.useDeleteCargo, + }, +}; + +} diff --git a/test/generated/next/positionCargo/positionCargo.models.ts b/test/generated/next/positionCargo/positionCargo.models.ts new file mode 100644 index 0000000..1e3b8cc --- /dev/null +++ b/test/generated/next/positionCargo/positionCargo.models.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoModels { +/** + * ListCargosByPositionIdOrderParamSchema + * @type { array } + * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + */ +export const ListCargosByPositionIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).readonly().describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt").nullish(); +export type ListCargosByPositionIdOrderParam = z.infer; + +/** + * ListCargosByPositionIdResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.PositionCargoResponseDTO[] } items + */ +export const ListCargosByPositionIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape }); +export type ListCargosByPositionIdResponse = z.infer; + +/** + * PositionCargoListCargoLabelsResponseSchema + * @type { array } + */ +export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type PositionCargoListCargoLabelsResponse = z.infer; + +/** + * PositionCargoGetCargoSummaryResponseSchema + * @type { array } + */ +export const PositionCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); +export type PositionCargoGetCargoSummaryResponse = z.infer; + +/** + * PositionCargoCreateBulkCargosResponseSchema + * @type { array } + */ +export const PositionCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema).readonly(); +export type PositionCargoCreateBulkCargosResponse = z.infer; + +} diff --git a/test/generated/next/positionCargo/positionCargo.queries.ts b/test/generated/next/positionCargo/positionCargo.queries.ts new file mode 100644 index 0000000..bc814ea --- /dev/null +++ b/test/generated/next/positionCargo/positionCargo.queries.ts @@ -0,0 +1,294 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionCargoAcl } from "./positionCargo.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionCargoModels } from "./positionCargo.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoApi } from "./positionCargo.api"; + +export namespace PositionCargoQueries { +export const moduleName = QueryModule.PositionCargo; + +export const keys = { + all: [moduleName] as const, + listCargosByPositionId: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", officeId, positionId, limit, order, page, cursor] as const, + listCargosByPositionIdInfinite: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", "infinite", officeId, positionId, limit, order, cursor] as const, + listCargoLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/labels", officeId, positionId] as const, + getCargoSummary: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/summary", officeId, positionId] as const, + getCargoById: (officeId: string, positionId: string, cargoId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/:cargoId", officeId, positionId, cargoId] as const, +}; + +/** + * Query `useListCargosByPositionId` + * @summary List all cargo items for a position + * @permission Requires `canUseListCargosByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByPositionId = ({ officeId, positionId, limit, order, page, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListCargosByPositionIdInfinite + * @summary List all cargo items for a position + * @permission Requires `canUseListCargosByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByPositionIdInfinite = ({ officeId, positionId, limit, order, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreateCargo` + * @summary Create a new cargo item + * @permission Requires `canUseCreateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId } )); + return PositionCargoApi.createCargo(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListCargoLabels` + * @summary List all cargo labels for a position + * @permission Requires `canUseListCargoLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargoLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargoLabels(officeId, positionId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId } )); + return PositionCargoApi.listCargoLabels(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Query `useGetCargoSummary` + * @summary Get cargo summary grouped by transport unit type + * @permission Requires `canUseGetCargoSummary` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoSummary = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoSummary(officeId, positionId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId } )); + return PositionCargoApi.getCargoSummary(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Query `useGetCargoById` + * @summary Get a specific cargo item + * @permission Requires `canUseGetCargoById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.cargoId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoById = ({ officeId, positionId, cargoId }: { officeId: string, positionId: string, cargoId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoById(officeId, positionId, cargoId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId } )); + return PositionCargoApi.getCargoById(officeId, positionId, cargoId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCargo` + * @summary Update a cargo item + * @permission Requires `canUseUpdateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, data }) => { + checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId } )); + return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteCargo` + * @summary Delete a cargo item + * @permission Requires `canUseDeleteCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId }) => { + checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId } )); + return PositionCargoApi.deleteCargo(officeId, positionId, cargoId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateBulkCargos` + * @summary Create a new cargo item + * @permission Requires `canUseCreateBulkCargos` ability + * @param { number } mutation.numberOfCargos Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { + checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId } )); + return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicateCargo` + * @summary Duplicate a cargo item + * @permission Requires `canUseDuplicateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId }) => { + checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId } )); + return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/positionCargoPackage/positionCargoPackage.acl.ts b/test/generated/next/positionCargoPackage/positionCargoPackage.acl.ts new file mode 100644 index 0000000..552d48c --- /dev/null +++ b/test/generated/next/positionCargoPackage/positionCargoPackage.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionCargoPackageAcl { +/** + * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. + * @description Create cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation + */ +export const canUseCreatePackage = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. + * @description Update cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation + */ +export const canUseUpdatePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation + */ +export const canUseDeletePackage = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation + */ +export const canUseDuplicatePackage = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. + * @description Move cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation + */ +export const canUseMovePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +} diff --git a/test/generated/next/positionCargoPackage/positionCargoPackage.api.ts b/test/generated/next/positionCargoPackage/positionCargoPackage.api.ts new file mode 100644 index 0000000..bc571c0 --- /dev/null +++ b/test/generated/next/positionCargoPackage/positionCargoPackage.api.ts @@ -0,0 +1,48 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionCargoPackageApi { +export const createPackage = (officeId: string, positionId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, + ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), + config + ) +}; +export const updatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), + config + ) +}; +export const deletePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, + undefined, + config + ) +}; +export const duplicatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, + undefined, + config + ) +}; +export const movePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, + ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts b/test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts new file mode 100644 index 0000000..fc8a8bd --- /dev/null +++ b/test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts @@ -0,0 +1,163 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionCargoPackageAcl } from "./positionCargoPackage.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionCargoPackageApi } from "./positionCargoPackage.api"; + +export namespace PositionCargoPackageQueries { +export const moduleName = QueryModule.PositionCargoPackage; + + + +/** + * Mutation `useCreatePackage` + * @summary Create a new package for a cargo + * @permission Requires `canUseCreatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId } )); + return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdatePackage` + * @summary Update a package + * @permission Requires `canUseUpdatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId } )); + return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeletePackage` + * @summary Delete a package + * @permission Requires `canUseDeletePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId }) => { + checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId } )); + return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicatePackage` + * @summary Duplicate a package + * @permission Requires `canUseDuplicatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId }) => { + checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId } )); + return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMovePackage` + * @summary Move a package to a different cargo + * @permission Requires `canUseMovePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId } )); + return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/positionChecklist/positionChecklist.acl.ts b/test/generated/next/positionChecklist/positionChecklist.acl.ts new file mode 100644 index 0000000..1f8dfca --- /dev/null +++ b/test/generated/next/positionChecklist/positionChecklist.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionChecklistAcl { +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List checklist items for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useApplyTemplates` mutation ability. For global ability, omit the object parameter. + * @description Apply checklist templates to position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useApplyTemplates` mutation + */ +export const canUseApplyTemplates = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useComplete` mutation ability. For global ability, omit the object parameter. + * @description Complete position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useComplete` mutation + */ +export const canUseComplete = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUncomplete` mutation ability. For global ability, omit the object parameter. + * @description Uncomplete position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUncomplete` mutation + */ +export const canUseUncomplete = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdateNotes` mutation ability. For global ability, omit the object parameter. + * @description Update position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateNotes` mutation + */ +export const canUseUpdateNotes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useReorder` mutation ability. For global ability, omit the object parameter. + * @description Reorder position checklist items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation + */ +export const canUseReorder = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/next/positionChecklist/positionChecklist.api.ts b/test/generated/next/positionChecklist/positionChecklist.api.ts new file mode 100644 index 0000000..ff7bf54 --- /dev/null +++ b/test/generated/next/positionChecklist/positionChecklist.api.ts @@ -0,0 +1,54 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionChecklistModels } from "./positionChecklist.models"; + +export namespace PositionChecklistApi { +export const list = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist`, + config + ) +}; +export const applyTemplates = (officeId: string, positionId: string, data: PositionChecklistModels.ApplyTemplatesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, + ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), + config + ) +}; +export const complete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, + undefined, + config + ) +}; +export const uncomplete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, + undefined, + config + ) +}; +export const updateNotes = (officeId: string, positionId: string, itemId: string, data: PositionChecklistModels.UpdatePositionChecklistItemDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, + ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), + config + ) +}; +export const reorder = (officeId: string, positionId: string, data: PositionChecklistModels.ReorderPositionChecklistDto, config?: AxiosRequestConfig) => { + return AppRestClient.put( + { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/reorder`, + ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/positionChecklist/positionChecklist.models.ts b/test/generated/next/positionChecklist/positionChecklist.models.ts new file mode 100644 index 0000000..55eb2b7 --- /dev/null +++ b/test/generated/next/positionChecklist/positionChecklist.models.ts @@ -0,0 +1,77 @@ +import { z } from "zod"; + +export namespace PositionChecklistModels { +/** + * PositionChecklistCompletedByResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionChecklistCompletedByResponseDtoSchema = z.object({ id: z.string(), name: z.string().nullable() }).readonly(); +export type PositionChecklistCompletedByResponseDto = z.infer; + +/** + * PositionChecklistItemResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } checklistItemId + * @property { string } templateId + * @property { number } order + * @property { boolean } completed + * @property { string } completedAt + * @property { PositionChecklistCompletedByResponseDto } completedBy + * @property { string } notes + * @property { string } name + */ +export const PositionChecklistItemResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), checklistItemId: z.string(), templateId: z.string().nullable(), order: z.number(), completed: z.boolean(), completedAt: z.iso.datetime({ offset: true }).nullable(), completedBy: PositionChecklistCompletedByResponseDtoSchema.nullable(), notes: z.string().nullable(), name: z.string().nullable() }).readonly(); +export type PositionChecklistItemResponseDto = z.infer; + +/** + * PositionChecklistResponseDtoSchema + * @type { object } + * @property { PositionChecklistItemResponseDto[] } items + * @property { string[] } appliedTemplateIds + */ +export const PositionChecklistResponseDtoSchema = z.object({ items: z.array(PositionChecklistItemResponseDtoSchema).readonly(), appliedTemplateIds: z.array(z.string()).readonly() }).readonly(); +export type PositionChecklistResponseDto = z.infer; + +/** + * ApplyTemplatesRequestDtoSchema + * @type { object } + * @property { string[] } templateIds + */ +export const ApplyTemplatesRequestDtoSchema = z.object({ templateIds: z.array(z.string()).readonly() }).readonly(); +export type ApplyTemplatesRequestDto = z.infer; + +/** + * UpdatePositionChecklistItemDtoSchema + * @type { object } + * @property { string } notes Max Length: `512` + */ +export const UpdatePositionChecklistItemDtoSchema = z.object({ notes: z.string().max(512) }).readonly(); +export type UpdatePositionChecklistItemDto = z.infer; + +/** + * ReorderPositionChecklistDtoSchema + * @type { object } + * @property { string[] } itemIds + */ +export const ReorderPositionChecklistDtoSchema = z.object({ itemIds: z.array(z.string()).readonly() }).readonly(); +export type ReorderPositionChecklistDto = z.infer; + +/** + * ApplyTemplatesResponseSchema + * @type { array } + */ +export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); +export type ApplyTemplatesResponse = z.infer; + +/** + * PositionChecklistReorderResponseSchema + * @type { array } + */ +export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); +export type PositionChecklistReorderResponse = z.infer; + +} diff --git a/test/generated/next/positionChecklist/positionChecklist.queries.ts b/test/generated/next/positionChecklist/positionChecklist.queries.ts new file mode 100644 index 0000000..77020bb --- /dev/null +++ b/test/generated/next/positionChecklist/positionChecklist.queries.ts @@ -0,0 +1,182 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionChecklistAcl } from "./positionChecklist.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionChecklistModels } from "./positionChecklist.models"; +import { PositionChecklistApi } from "./positionChecklist.api"; + +export namespace PositionChecklistQueries { +export const moduleName = QueryModule.PositionChecklist; + +export const keys = { + all: [moduleName] as const, + list: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/checklist", officeId, positionId] as const, +}; + +/** + * Query `useList` + * @summary Get position checklist items + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, positionId), + queryFn: () => { + checkAcl(PositionChecklistAcl.canUseList({ officeId } )); + return PositionChecklistApi.list(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useApplyTemplates` + * @summary Apply checklist templates to position + * @permission Requires `canUseApplyTemplates` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionChecklistModels.ApplyTemplatesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useApplyTemplates = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId } )); + return PositionChecklistApi.applyTemplates(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useComplete` + * @summary Complete a checklist item + * @permission Requires `canUseComplete` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useComplete = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId }) => { + checkAcl(PositionChecklistAcl.canUseComplete({ officeId } )); + return PositionChecklistApi.complete(officeId, positionId, itemId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUncomplete` + * @summary Mark checklist item as not completed + * @permission Requires `canUseUncomplete` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUncomplete = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId }) => { + checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId } )); + return PositionChecklistApi.uncomplete(officeId, positionId, itemId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateNotes` + * @summary Update checklist item notes + * @permission Requires `canUseUpdateNotes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { PositionChecklistModels.UpdatePositionChecklistItemDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateNotes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, itemId, data }) => { + checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId } )); + return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReorder` + * @summary Reorder checklist items + * @permission Requires `canUseReorder` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionChecklistModels.ReorderPositionChecklistDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionChecklistAcl.canUseReorder({ officeId } )); + return PositionChecklistApi.reorder(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.acl.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.acl.ts new file mode 100644 index 0000000..8215460 --- /dev/null +++ b/test/generated/next/positionInvolvedParties/positionInvolvedParties.acl.ts @@ -0,0 +1,56 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionInvolvedPartiesAcl { +/** + * Use for `useFindByPositionId` query ability. For global ability, omit the object parameter. + * @description List position involved parties + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByPositionId` query + */ +export const canUseFindByPositionId = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation ability. For global ability, omit the object parameter. + * @description Delete position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation + */ +export const canUseDeleteOfficesPositionsInvolvedPartiesByPartyId = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts new file mode 100644 index 0000000..a99a8f4 --- /dev/null +++ b/test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts @@ -0,0 +1,40 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionInvolvedPartiesModels } from "./positionInvolvedParties.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionInvolvedPartiesApi { +export const findByPositionId = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties`, + config + ) +}; +export const create = (officeId: string, positionId: string, data: CommonModels.CreateInvolvedPartyRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties`, + ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), + config + ) +}; +export const update = (officeId: string, positionId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, + ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), + config + ) +}; +export const deleteOfficesPositionsInvolvedPartiesByPartyId = (officeId: string, positionId: string, partyId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts new file mode 100644 index 0000000..eaa5fc6 --- /dev/null +++ b/test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts @@ -0,0 +1,12 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionInvolvedPartiesModels { +/** + * FindByPositionIdResponseSchema + * @type { array } + */ +export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); +export type FindByPositionIdResponse = z.infer; + +} diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts new file mode 100644 index 0000000..0190d0e --- /dev/null +++ b/test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts @@ -0,0 +1,126 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionInvolvedPartiesAcl } from "./positionInvolvedParties.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionInvolvedPartiesApi } from "./positionInvolvedParties.api"; + +export namespace PositionInvolvedPartiesQueries { +export const moduleName = QueryModule.PositionInvolvedParties; + +export const keys = { + all: [moduleName] as const, + findByPositionId: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/involved-parties", officeId, positionId] as const, +}; + +/** + * Query `useFindByPositionId` + * @summary List position involved parties + * @permission Requires `canUseFindByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindByPositionId = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findByPositionId(officeId, positionId), + queryFn: () => { + checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId } )); + return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create position involved party + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId } )); + return PositionInvolvedPartiesApi.create(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update position involved party + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, partyId, data }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId } )); + return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteOfficesPositionsInvolvedPartiesByPartyId` + * @summary Delete position involved party + * @permission Requires `canUseDeleteOfficesPositionsInvolvedPartiesByPartyId` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, partyId }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId } )); + return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId(officeId, positionId, partyId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts new file mode 100644 index 0000000..41a91df --- /dev/null +++ b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts @@ -0,0 +1,32 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionProfitChangeTrackingAcl { +/** + * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. + * @description List position profit change groups + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.positionId positionId from positionId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query + */ +export const canUseFindProfitChangeGroups = ( + object?: { officeId: string, positionId: string, } +) => [ + "Read", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; + +/** + * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. + * @description Get position profit change group details + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.positionId positionId from positionId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query + */ +export const canUseFindProfitChangeGroupDetail = ( + object?: { officeId: string, positionId: string, } +) => [ + "Read", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; + +} diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts new file mode 100644 index 0000000..a516599 --- /dev/null +++ b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts @@ -0,0 +1,31 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; + +export namespace PositionProfitChangeTrackingApi { +export const findProfitChangeGroups = (officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findProfitChangeGroupDetail = (groupId: string, officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, + `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, + config + ) +}; +} diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts new file mode 100644 index 0000000..a7c8680 --- /dev/null +++ b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts @@ -0,0 +1,51 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; +import { PositionProfitChangeTrackingQueries } from "./positionProfitChangeTracking.queries"; +import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; + +export namespace PositionProfitChangeTrackingConfigs { +export const profitChangeGroupsConfig = { + meta: { + title: "Profit Change Groups", + }, + readAll: { + acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups, + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, + paginated: PositionProfitChangeTrackingQueries.useFindProfitChangeGroups, + infinite: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, + filters: { + schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, + options: { + inputs: { + userId: true, + dateFrom: true, + dateTo: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, + options: { + columns: { + id: true, + timestamp: true, + users: true, + profit: true, + changeCount: true, + }, + sortable: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, + }, +}), + }, + read: { + acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema, + query: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, + }, +}; + +} diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts new file mode 100644 index 0000000..f4040ce --- /dev/null +++ b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts @@ -0,0 +1,74 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionProfitChangeTrackingModels { +/** + * PositionAccountProfitChangeGroupDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto[] } users + * @property { object } profit + * @property { number } profit.amount + * @property { string } profit.currencyCode + * @property { number } changeCount + */ +export const PositionAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), changeCount: z.number() }).readonly(); +export type PositionAccountProfitChangeGroupDto = z.infer; + +/** + * PositionAccountProfitChangeEntryDtoSchema + * @type { object } + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto } user + * @property { number } changeNumber + * @property { number } oldProfit + * @property { number } newProfit + * @property { string } currencyCode + */ +export const PositionAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }).readonly(); +export type PositionAccountProfitChangeEntryDto = z.infer; + +/** + * PositionAccountProfitChangeGroupDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { string } currencyCode + * @property { PositionAccountProfitChangeEntryDto[] } entries + */ +export const PositionAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(PositionAccountProfitChangeEntryDtoSchema).readonly() }).readonly(); +export type PositionAccountProfitChangeGroupDetailDto = z.infer; + +/** + * PositionProfitChangeTrackingFilterDtoSchema + * @type { object } + * @property { string } userId User IDs who made the changes + * @property { string } dateFrom Date range start + * @property { string } dateTo Date range end + */ +export const PositionProfitChangeTrackingFilterDtoSchema = z.object({ userId: z.string().describe("User IDs who made the changes"), dateFrom: z.string().describe("Date range start"), dateTo: z.string().describe("Date range end") }).readonly(); +export type PositionProfitChangeTrackingFilterDto = z.infer; + +/** + * PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema + * @type { enum } + */ +export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema = z.enum(["timestamp", "profitAmount", "changeCount"]); +export type PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = z.infer; +export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema.enum; + +/** + * PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionAccountProfitChangeGroupDto[] } items + */ +export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape }); +export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; + +} diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts new file mode 100644 index 0000000..71d116b --- /dev/null +++ b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts @@ -0,0 +1,102 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; +import { PositionProfitChangeTrackingApi } from "./positionProfitChangeTracking.api"; + +export namespace PositionProfitChangeTrackingQueries { +export const moduleName = QueryModule.PositionProfitChangeTracking; + +export const keys = { + all: [moduleName] as const, + findProfitChangeGroups: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", officeId, positionId, limit, order, filter, page, cursor] as const, + findProfitChangeGroupsInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", "infinite", officeId, positionId, limit, order, filter, cursor] as const, + findProfitChangeGroupDetail: (groupId: string, officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups/:groupId", groupId, officeId, positionId] as const, +}; + +/** + * Query `useFindProfitChangeGroups` + * @summary List position profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` + * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroups = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); + return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindProfitChangeGroupsInfinite + * @summary List position profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` + * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupsInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); + return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindProfitChangeGroupDetail` + * @summary Get position profit change group details + * @permission Requires `canUseFindProfitChangeGroupDetail` ability + * @param { string } object.groupId Path parameter + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupDetail = ({ groupId, officeId, positionId }: { groupId: string, officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), + queryFn: () => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId } )); + return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/positionRoutes/positionRoutes.acl.ts b/test/generated/next/positionRoutes/positionRoutes.acl.ts new file mode 100644 index 0000000..7cd4cb8 --- /dev/null +++ b/test/generated/next/positionRoutes/positionRoutes.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionRoutesAcl { +/** + * Use for `useListRoutes` query ability. For global ability, omit the object parameter. + * @description List position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query + */ +export const canUseListRoutes = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Create position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation + */ +export const canUseCreateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Update position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation + */ +export const canUseUpdateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Delete position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation + */ +export const canUseDeleteRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. + * @description Split position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation + */ +export const canUseSplitRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. + * @description Merge position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation + */ +export const canUseMergeRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. + * @description Copy position route + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation + */ +export const canUseCopyRoute = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/next/positionRoutes/positionRoutes.api.ts b/test/generated/next/positionRoutes/positionRoutes.api.ts new file mode 100644 index 0000000..1e0faf5 --- /dev/null +++ b/test/generated/next/positionRoutes/positionRoutes.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionRoutesApi { +export const listRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.RouteListResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes`, + config + ) +}; +export const createRoutePoint = (officeId: string, positionId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, + ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), + config + ) +}; +export const updateRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, + ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), + config + ) +}; +export const deleteRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, + undefined, + config + ) +}; +export const splitRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/split`, + undefined, + config + ) +}; +export const mergeRoutes = (officeId: string, positionId: string, data: CommonModels.MergeRoutesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/merge`, + ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), + config + ) +}; +export const copyRoute = (officeId: string, positionId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, + ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/positionRoutes/positionRoutes.queries.ts b/test/generated/next/positionRoutes/positionRoutes.queries.ts new file mode 100644 index 0000000..8d22b16 --- /dev/null +++ b/test/generated/next/positionRoutes/positionRoutes.queries.ts @@ -0,0 +1,213 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionRoutesAcl } from "./positionRoutes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionRoutesApi } from "./positionRoutes.api"; + +export namespace PositionRoutesQueries { +export const moduleName = QueryModule.PositionRoutes; + +export const keys = { + all: [moduleName] as const, + listRoutes: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes", officeId, positionId] as const, +}; + +/** + * Query `useListRoutes` + * @summary List routes with points for a position (unified for sea/air/road) + * @permission Requires `canUseListRoutes` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoutes = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoutes(officeId, positionId), + queryFn: () => { + checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId } )); + return PositionRoutesApi.listRoutes(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateRoutePoint` + * @summary Create a route point + * @permission Requires `canUseCreateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, data }) => { + checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId } )); + return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateRoutePoint` + * @summary Update a route point + * @permission Requires `canUseUpdateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { + checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId } )); + return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRoutePoint` + * @summary Delete a route point + * @permission Requires `canUseDeleteRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, pointId }) => { + checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId } )); + return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useSplitRoutes` + * @summary Split routes by cargo (sea positions only) + * @permission Requires `canUseSplitRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId } )); + return PositionRoutesApi.splitRoutes(officeId, positionId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMergeRoutes` + * @summary Merge routes (sea positions only) + * @permission Requires `canUseMergeRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId } )); + return PositionRoutesApi.mergeRoutes(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopyRoute` + * @summary Copy route points to another route (sea positions only) + * @permission Requires `canUseCopyRoute` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, data }) => { + checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId } )); + return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/positions/positions.acl.ts b/test/generated/next/positions/positions.acl.ts new file mode 100644 index 0000000..002471f --- /dev/null +++ b/test/generated/next/positions/positions.acl.ts @@ -0,0 +1,212 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace PositionsAcl { +/** + * Use for `useFindAll` query ability. For global ability, omit the object parameter. + * @description List position labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useTotalProfit` query ability. For global ability, omit the object parameter. + * @description Fake endpoint + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTotalProfit` query + */ +export const canUseTotalProfit = ( + object?: { officeId: string, } +) => [ + "TotalProfitView", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ +export const canUseListAvailablePartnersFor = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useExportPositions` mutation ability. For global ability, omit the object parameter. + * @description Export positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportPositions` mutation + */ +export const canUseExportPositions = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Export", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useListRouteLabels` query ability. For global ability, omit the object parameter. + * @description List route labels for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRouteLabels` query + */ +export const canUseListRouteLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useGetDuplicateDefaultParameters` query ability. For global ability, omit the object parameter. + * @description Read position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDuplicateDefaultParameters` query + */ +export const canUseGetDuplicateDefaultParameters = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ +export const canUseDuplicate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ +export const canUseCancel = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useRevertCancel` mutation ability. For global ability, omit the object parameter. + * @description Revert cancelled position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertCancel` mutation + */ +export const canUseRevertCancel = ( + object?: { officeId: string, } +) => [ + "RevertCancel", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useLinkChild` mutation ability. For global ability, omit the object parameter. + * @description Link positions to parent + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLinkChild` mutation + */ +export const canUseLinkChild = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUnlinkChild` mutation ability. For global ability, omit the object parameter. + * @description Link positions to parent + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlinkChild` mutation + */ +export const canUseUnlinkChild = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useListChild` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListChild` query + */ +export const canUseListChild = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/next/positions/positions.api.ts b/test/generated/next/positions/positions.api.ts new file mode 100644 index 0000000..b990f57 --- /dev/null +++ b/test/generated/next/positions/positions.api.ts @@ -0,0 +1,166 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionsApi { +export const findAll = (officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsFindAllResponseSchema }, + `/offices/${officeId}/positions/labels`, + { + ...config, + params: { + filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsPaginateResponseSchema }, + `/offices/${officeId}/positions`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: PositionsModels.CreatePositionRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions`, + ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), + config + ) +}; +export const totalProfit = (officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.TotalProfitResponseSchema }, + `/offices/${officeId}/positions/fake-total-profit`, + config + ) +}; +export const listAvailablePartnersFor = (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/positions/${positionId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), + }, + } + ) +}; +export const exportPositions = (officeId: string, data: PositionsModels.PositionExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/exports`, + ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}`, + config + ) +}; +export const update = (officeId: string, positionId: string, data: PositionsModels.UpdatePositionDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}`, + ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), + config + ) +}; +export const listRouteLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/routes/labels`, + config + ) +}; +export const getDuplicateDefaultParameters = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, + config + ) +}; +export const duplicate = (officeId: string, positionId: string, data: PositionsModels.DuplicatePositionRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/duplicate`, + ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), + config + ) +}; +export const cancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/cancel`, + undefined, + config + ) +}; +export const revertCancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/uncancel`, + undefined, + config + ) +}; +export const linkChild = (officeId: string, positionId: string, data: PositionsModels.LinkChildPositionsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/children`, + ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), + config + ) +}; +export const unlinkChild = (officeId: string, positionId: string, data: PositionsModels.UnlinkChildPositionsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/children`, + ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), + config + ) +}; +export const listChild = (officeId: string, positionId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: PositionsModels.ListChildResponseSchema }, + `/offices/${officeId}/positions/${positionId}/children`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +} diff --git a/test/generated/next/positions/positions.configs.ts b/test/generated/next/positions/positions.configs.ts new file mode 100644 index 0000000..0e9cfce --- /dev/null +++ b/test/generated/next/positions/positions.configs.ts @@ -0,0 +1,259 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionsQueries } from "./positions.queries"; +import { PositionsAcl } from "./positions.acl"; + +export namespace PositionsConfigs { +export const positionsConfig = { + meta: { + title: "Positions", + }, + readAll: { + acl: PositionsAcl.canUsePaginate, + schema: PositionsModels.PositionPreviewResponseDtoSchema, + paginated: PositionsQueries.usePaginate, + infinite: PositionsQueries.usePaginateInfinite, + filters: { + schema: PositionsModels.PositionFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionsModels.PositionFilterDtoSchema, + options: { + inputs: { + transportMode: true, + customerId: true, + carrierId: true, + consigneeId: true, + isCancelled: true, + status: true, + number: true, + direction: true, + loadType: true, + serviceType: true, + employee: true, + searchQuery: true, + externalSystemId: true, + createdAt: true, + serviceDate: true, + departureDate: true, + arrivalDate: true, + blfromCostumerDate: true, + blfromCarrierDate: true, + customsDate: true, + vgmCustomerDate: true, + partnerNetworkId: true, + projectLiteId: true, + checklistItemsDone: true, + checklistItemsNotDone: true, + routing: true, + isExcludedFromStatistics: true, + isMasterPosition: true, + loadingPortId: true, + dischargePortId: true, + customerReference: true, + carrierReference: true, + consigneeReference: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: PositionsModels.PositionPreviewResponseDtoSchema, + options: { + columns: { + id: true, + externalSystemId: true, + transportMode: true, + direction: true, + loadType: true, + createdAt: true, + number: true, + isCancelled: true, + customer: true, + customerReference: true, + consignee: true, + consigneeReference: true, + carrier: true, + carrierReference: true, + positionNumber: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + origin: true, + loadDate: true, + loadingPort: true, + dischargePort: true, + destination: true, + deliveryDate: true, + equipment: true, + serviceType: true, + destinationOffice: true, + currency: true, + profit: true, + margin: true, + employee: true, + project: true, + serviceDate: true, + departureDate: true, + arrivalDate: true, + blfromCostumerDate: true, + blfromCarrierDate: true, + customsDate: true, + vgmCustomerDate: true, + routing: true, + notes: true, + isMasterPosition: true, + hasInvoices: true, + parentPosition: true, + }, + sortable: PositionsModels.PositionsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: PositionsAcl.canUseGet, + schema: CommonModels.PositionCoreResponseDtoSchema, + query: PositionsQueries.useGet, + }, + create: { + acl: PositionsAcl.canUseCreate, + schema: PositionsModels.CreatePositionRequestDtoSchema, + mutation: PositionsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PositionsModels.CreatePositionRequestDtoSchema, + options: { + inputs: { + section: true, + direction: true, + transportMode: true, + loadType: true, + serviceType: true, + estimatedServiceDate: true, + customerBusinessPartnerId: true, + }, + }, +}) + }, + update: { + acl: PositionsAcl.canUseUpdate, + schema: PositionsModels.UpdatePositionDtoSchema, + mutation: PositionsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PositionsModels.UpdatePositionDtoSchema, + options: { + inputs: { + externalSystemId: true, + statusDate: true, + status: true, + loadType: true, + incoterms: true, + secondIncoterms: true, + fillingCompany: true, + sellingContract: true, + fillingScacCode: true, + serviceValidity: true, + ratesValidity: true, + serviceType: true, + buyRateReference: true, + frequency: true, + isParentPosition: true, + isExcludedFromStatistics: true, + team: true, + salesRepId: true, + responsibleEmployeeId: true, + receivedByEmployeeId: true, + originOfficeId: true, + projectLiteId: true, + notes: true, + inttraTypeOfMove: true, + volumetricWeightModifier: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: PositionsAcl.canUseFindAll, + schema: CommonModels.LabelResponseDTOSchema, + paginated: PositionsQueries.useFindAll, + infinite: PositionsQueries.useFindAllInfinite, + filters: { + schema: PositionsModels.PositionLabelsFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionsModels.PositionLabelsFilterDtoSchema, + options: { + inputs: { + search: true, + isParentPosition: true, + isLinkedPosition: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + }, +}), + }, +}; + +export const childrenConfig = { + meta: { + title: "Children", + }, + readAll: { + acl: PositionsAcl.canUseListChild, + schema: PositionsModels.ChildPositionResponseDtoSchema, + paginated: PositionsQueries.useListChild, + infinite: PositionsQueries.useListChildInfinite, + columns: dynamicColumns({ + schema: PositionsModels.ChildPositionResponseDtoSchema, + options: { + columns: { + id: true, + number: true, + packages: true, + weight: true, + volume: true, + customer: true, + profit: true, + }, + }, +}), + }, + create: { + acl: PositionsAcl.canUseLinkChild, + schema: PositionsModels.LinkChildPositionsRequestDtoSchema, + mutation: PositionsQueries.useLinkChild, + inputDefs: dynamicInputs({ + schema: PositionsModels.LinkChildPositionsRequestDtoSchema, + options: { + inputs: { + childPositionIds: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/next/positions/positions.models.ts b/test/generated/next/positions/positions.models.ts new file mode 100644 index 0000000..6f71cac --- /dev/null +++ b/test/generated/next/positions/positions.models.ts @@ -0,0 +1,501 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace PositionsModels { +/** + * PositionPreviewResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } externalSystemId + * @property { CommonModels.TransportModeEnum } transportMode + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { string } createdAt + * @property { string } number + * @property { boolean } isCancelled + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { string } customer.phone + * @property { string } customer.email + * @property { string } customerReference + * @property { object } consignee + * @property { string } consignee.id + * @property { string } consignee.name + * @property { string } consignee.matchCode + * @property { string } consignee.label + * @property { string } consigneeReference + * @property { object } carrier + * @property { string } carrier.id + * @property { string } carrier.name + * @property { string } carrier.matchCode + * @property { string } carrier.label + * @property { string } carrierReference + * @property { number } positionNumber + * @property { string } hblNumber + * @property { string } mblNumber + * @property { string } bookingNumber + * @property { string } vessel + * @property { string } voyage + * @property { string } vesselCarrier Carrier name from route point (sea positions only) + * @property { object } origin + * @property { string } origin.id + * @property { string } origin.name + * @property { string } loadDate + * @property { object } loadingPort + * @property { string } loadingPort.id + * @property { string } loadingPort.name + * @property { object } dischargePort + * @property { string } dischargePort.id + * @property { string } dischargePort.name + * @property { object } destination + * @property { string } destination.id + * @property { string } destination.name + * @property { string } deliveryDate + * @property { string } equipment + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { object } destinationOffice + * @property { string } destinationOffice.id + * @property { string } destinationOffice.name + * @property { string } currency + * @property { number } profit + * @property { number } margin + * @property { object } employee + * @property { string } employee.id + * @property { string } employee.name + * @property { object } project + * @property { string } project.id + * @property { string } project.name + * @property { string } serviceDate + * @property { string } departureDate + * @property { string } arrivalDate + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.EditorContentResponseDto } notes Notes + * @property { boolean } isMasterPosition + * @property { boolean } hasInvoices Whether this position has at least one invoice + * @property { object } parentPosition + * @property { string } parentPosition.id + * @property { string } parentPosition.number + */ +export const PositionPreviewResponseDtoSchema = z.object({ id: z.string(), externalSystemId: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), number: z.string(), isCancelled: z.boolean(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }).readonly(), customerReference: z.string().nullish(), consignee: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).readonly().nullish(), consigneeReference: z.string().nullish(), carrier: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).readonly().nullish(), carrierReference: z.string().nullish(), positionNumber: z.number().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), loadDate: z.iso.datetime({ offset: true }).nullish(), loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), deliveryDate: z.iso.datetime({ offset: true }).nullish(), equipment: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), currency: z.string().nullish(), profit: z.number().nullish(), margin: z.number().nullish(), employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), departureDate: z.iso.datetime({ offset: true }).nullish(), arrivalDate: z.iso.datetime({ offset: true }).nullish(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), isMasterPosition: z.boolean(), hasInvoices: z.boolean().describe("Whether this position has at least one invoice").nullish(), parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).readonly().nullish() }).readonly(); +export type PositionPreviewResponseDto = z.infer; + +/** + * PositionFilterDtoSchema + * @type { object } + * @property { CommonModels.TransportModeEnum } transportMode + * @property { string[] } customerId + * @property { string[] } carrierId Filter positions by carrier IDs + * @property { string[] } consigneeId Filter positions by consignee IDs + * @property { boolean } isCancelled + * @property { CommonModels.PositionStatusEnum } status + * @property { string } number + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } employee Filter positions by employee IDs + * @property { string } searchQuery + * @property { string } externalSystemId Filter positions by external system ID (substring match) + * @property { CommonModels.DateRangeDto } createdAt + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.DateRangeDto } departureDate + * @property { CommonModels.DateRangeDto } arrivalDate + * @property { CommonModels.DateRangeDto } blfromCostumerDate + * @property { CommonModels.DateRangeDto } blfromCarrierDate + * @property { CommonModels.DateRangeDto } customsDate + * @property { CommonModels.DateRangeDto } vgmCustomerDate + * @property { string } partnerNetworkId Filter positions by partner network ID + * @property { string[] } projectLiteId Filter positions by project IDs + * @property { string[] } checklistItemsDone Checklist item ids that must be completed + * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics + * @property { boolean } isMasterPosition + * @property { string[] } loadingPortId Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure) + * @property { string[] } dischargePortId Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport) + * @property { string } customerReference Filter positions by customer reference + * @property { string } carrierReference Filter positions by carrier reference + * @property { string } consigneeReference Filter positions by consignee reference + * @property { string } hblNumber Filter positions by HBL/HAWB number + * @property { string } mblNumber Filter positions by MBL/MAWB number + * @property { string } bookingNumber Filter positions by booking number + * @property { string } vessel Filter positions by vessel name + * @property { string } voyage Filter positions by voyage number + * @property { string } vesselCarrier Filter positions by vessel or carrier name + */ +export const PositionFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema, customerId: z.array(z.string()).readonly(), carrierId: z.array(z.string()).readonly().describe("Filter positions by carrier IDs"), consigneeId: z.array(z.string()).readonly().describe("Filter positions by consignee IDs"), isCancelled: z.boolean(), status: CommonModels.PositionStatusEnumSchema, number: z.string(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, employee: z.array(z.string()).readonly().describe("Filter positions by employee IDs"), searchQuery: z.string(), externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), createdAt: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, departureDate: CommonModels.DateRangeDtoSchema, arrivalDate: CommonModels.DateRangeDtoSchema, blfromCostumerDate: CommonModels.DateRangeDtoSchema, blfromCarrierDate: CommonModels.DateRangeDtoSchema, customsDate: CommonModels.DateRangeDtoSchema, vgmCustomerDate: CommonModels.DateRangeDtoSchema, partnerNetworkId: z.string().describe("Filter positions by partner network ID"), projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), routing: CommonModels.SeaRoutingEnumSchema, isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isMasterPosition: z.boolean(), loadingPortId: z.array(z.string()).readonly().describe("Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure)"), dischargePortId: z.array(z.string()).readonly().describe("Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport)"), customerReference: z.string().describe("Filter positions by customer reference"), carrierReference: z.string().describe("Filter positions by carrier reference"), consigneeReference: z.string().describe("Filter positions by consignee reference"), hblNumber: z.string().describe("Filter positions by HBL/HAWB number"), mblNumber: z.string().describe("Filter positions by MBL/MAWB number"), bookingNumber: z.string().describe("Filter positions by booking number"), vessel: z.string().describe("Filter positions by vessel name"), voyage: z.string().describe("Filter positions by voyage number"), vesselCarrier: z.string().describe("Filter positions by vessel or carrier name") }).readonly(); +export type PositionFilterDto = z.infer; + +/** + * PositionExportFilterDtoSchema + * @type { object } + * @property { CommonModels.TransportModeEnum } transportMode + * @property { string[] } customerId + * @property { boolean } isCancelled + * @property { CommonModels.PositionStatusEnum } status + * @property { string } number + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } responsibleEmployee Filter positions by responsible employee IDs + * @property { string } searchQuery + * @property { string } externalSystemId Filter positions by external system ID (substring match) + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.DateRangeDto } dateOfDeparture + * @property { CommonModels.DateRangeDto } dateOfArrival + * @property { CommonModels.DateRangeDto } blfromCostumerDate + * @property { CommonModels.DateRangeDto } blfromCarrierDate + * @property { CommonModels.DateRangeDto } customsDate + * @property { CommonModels.DateRangeDto } vgmCustomerDate + * @property { string } partnerNetworkId Filter positions by partner network ID + * @property { string[] } projectLiteId Filter positions by project IDs + * @property { string[] } checklistItemsDone Checklist item ids that must be completed + * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics + */ +export const PositionExportFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema, customerId: z.array(z.string()).readonly(), isCancelled: z.boolean(), status: CommonModels.PositionStatusEnumSchema, number: z.string(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, responsibleEmployee: z.array(z.string()).readonly().describe("Filter positions by responsible employee IDs"), searchQuery: z.string(), externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), statusDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, dateOfDeparture: CommonModels.DateRangeDtoSchema, dateOfArrival: CommonModels.DateRangeDtoSchema, blfromCostumerDate: CommonModels.DateRangeDtoSchema, blfromCarrierDate: CommonModels.DateRangeDtoSchema, customsDate: CommonModels.DateRangeDtoSchema, vgmCustomerDate: CommonModels.DateRangeDtoSchema, partnerNetworkId: z.string().describe("Filter positions by partner network ID"), projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), routing: CommonModels.SeaRoutingEnumSchema, isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly() }).readonly(); +export type PositionExportFilterDto = z.infer; + +/** + * PositionExportColumnSchema + * @type { enum } + */ +export const PositionExportColumnSchema = z.enum(["id", "externalSystemId", "transportMode", "direction", "loadType", "createdAt", "number", "isCancelled", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeName", "consigneeReference", "carrierName", "carrierReference", "positionNumber", "hblNumber", "mblNumber", "bookingNumber", "vessel", "voyage", "originName", "loadDate", "loadingPortName", "dischargePortName", "destinationName", "deliveryDate", "equipment", "serviceTypeName", "departureDate", "arrivalDate", "destinationOfficeName", "currency", "profit", "margin", "employeeName", "projectName", "serviceDate", "routing", "notes", "blFromCustomerDate", "blFromCarrierDate", "customsDate", "vgmCustomerDate", "isMasterPosition", "parentPositionId", "parentPositionNumber"]); +export type PositionExportColumn = z.infer; +export const PositionExportColumn = PositionExportColumnSchema.enum; + +/** + * PositionExportRequestDtoSchema + * @type { object } + * @property { string } order Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @property { PositionExportColumn[] } columns Min Items: `1` + * @property { PositionExportFilterDto } filter + */ +export const PositionExportRequestDtoSchema = z.object({ order: z.string().describe("Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition"), columns: z.array(PositionExportColumnSchema).readonly().min(1), filter: PositionExportFilterDtoSchema }).readonly(); +export type PositionExportRequestDto = z.infer; + +/** + * CreatePositionRequestDtoSchema + * @type { object } + * @property { CommonModels.SectionEnum } section + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum } transportMode + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } estimatedServiceDate + * @property { string } customerBusinessPartnerId + */ +export const CreatePositionRequestDtoSchema = z.object({ section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, estimatedServiceDate: z.iso.datetime({ offset: true }), customerBusinessPartnerId: z.string() }).readonly(); +export type CreatePositionRequestDto = z.infer; + +/** + * DuplicatePositionPackageInformationParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } packageType + * @property { boolean } packageQuantity + * @property { boolean } packageDescription + * @property { boolean } packageHsCodes + * @property { boolean } packageNetWeight + * @property { boolean } packageGrossWeight + * @property { boolean } packageCaseMark + * @property { boolean } packageNote + * @property { boolean } packageCustomsMark + */ +export const DuplicatePositionPackageInformationParametersDtoSchema = z.object({ enabled: z.boolean(), packageType: z.boolean(), packageQuantity: z.boolean(), packageDescription: z.boolean(), packageHsCodes: z.boolean(), packageNetWeight: z.boolean(), packageGrossWeight: z.boolean(), packageCaseMark: z.boolean(), packageNote: z.boolean(), packageCustomsMark: z.boolean() }).readonly(); +export type DuplicatePositionPackageInformationParametersDto = z.infer; + +/** + * DuplicatePositionCargoParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { DuplicatePositionPackageInformationParametersDto } packageInformation + */ +export const DuplicatePositionCargoParametersDtoSchema = z.object({ enabled: z.boolean(), packageInformation: DuplicatePositionPackageInformationParametersDtoSchema }).readonly(); +export type DuplicatePositionCargoParametersDto = z.infer; + +/** + * DuplicatePositionOverviewParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } quoteReference + */ +export const DuplicatePositionOverviewParametersDtoSchema = z.object({ enabled: z.boolean(), quoteReference: z.boolean() }).readonly(); +export type DuplicatePositionOverviewParametersDto = z.infer; + +/** + * DuplicatePositionInvolvedPartiesParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } involvedPartySection + */ +export const DuplicatePositionInvolvedPartiesParametersDtoSchema = z.object({ enabled: z.boolean(), involvedPartySection: z.boolean() }).readonly(); +export type DuplicatePositionInvolvedPartiesParametersDto = z.infer; + +/** + * DuplicatePositionRoutesParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } routeDates + * @property { boolean } routeLocation + */ +export const DuplicatePositionRoutesParametersDtoSchema = z.object({ enabled: z.boolean(), routeDates: z.boolean(), routeLocation: z.boolean() }).readonly(); +export type DuplicatePositionRoutesParametersDto = z.infer; + +/** + * DuplicatePositionFinanceAccountParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } exchangeRate + */ +export const DuplicatePositionFinanceAccountParametersDtoSchema = z.object({ enabled: z.boolean(), exchangeRate: z.boolean() }).readonly(); +export type DuplicatePositionFinanceAccountParametersDto = z.infer; + +/** + * DuplicatePositionDocumentsParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } hblWorkingDocument + * @property { boolean } siWorkingDocument + */ +export const DuplicatePositionDocumentsParametersDtoSchema = z.object({ enabled: z.boolean(), hblWorkingDocument: z.boolean(), siWorkingDocument: z.boolean() }).readonly(); +export type DuplicatePositionDocumentsParametersDto = z.infer; + +/** + * DuplicatePositionParametersDtoSchema + * @type { object } + * @property { DuplicatePositionOverviewParametersDto } overview + * @property { DuplicatePositionInvolvedPartiesParametersDto } involvedParties + * @property { DuplicatePositionCargoParametersDto } cargo + * @property { DuplicatePositionRoutesParametersDto } routes + * @property { DuplicatePositionFinanceAccountParametersDto } financeAccount + * @property { DuplicatePositionDocumentsParametersDto } documents + */ +export const DuplicatePositionParametersDtoSchema = z.object({ overview: DuplicatePositionOverviewParametersDtoSchema, involvedParties: DuplicatePositionInvolvedPartiesParametersDtoSchema, cargo: DuplicatePositionCargoParametersDtoSchema, routes: DuplicatePositionRoutesParametersDtoSchema, financeAccount: DuplicatePositionFinanceAccountParametersDtoSchema, documents: DuplicatePositionDocumentsParametersDtoSchema }).readonly(); +export type DuplicatePositionParametersDto = z.infer; + +/** + * DuplicatePositionDefaultParametersResponseDtoSchema + * @type { object } + * @property { string } estimatedServiceDate Suggested estimated service date for the duplicated position (ISO 8601) + * @property { DuplicatePositionParametersDto } parameters Default duplication parameters with section and sub-parameter flags + */ +export const DuplicatePositionDefaultParametersResponseDtoSchema = z.object({ estimatedServiceDate: z.string().describe("Suggested estimated service date for the duplicated position (ISO 8601)"), parameters: DuplicatePositionParametersDtoSchema.describe("Default duplication parameters with section and sub-parameter flags") }).readonly(); +export type DuplicatePositionDefaultParametersResponseDto = z.infer; + +/** + * PositionSectionEnumSchema + * @type { enum } + */ +export const PositionSectionEnumSchema = z.enum(["overview", "involvedParties", "cargo", "financeAccount", "routes", "routeDates", "documents"]); +export type PositionSectionEnum = z.infer; +export const PositionSectionEnum = PositionSectionEnumSchema.enum; + +/** + * DuplicatePositionRequestDtoSchema + * @type { object } + * @property { PositionSectionEnum[] } sections Legacy: sections to duplicate. Ignored when parameters is provided. + * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. + * @property { string } estimatedServiceDate + */ +export const DuplicatePositionRequestDtoSchema = z.object({ sections: z.array(PositionSectionEnumSchema).readonly().describe("Legacy: sections to duplicate. Ignored when parameters is provided.").nullish(), parameters: DuplicatePositionParametersDtoSchema.describe("Nested parameters for duplication control. Preferred over sections.").nullish(), estimatedServiceDate: z.iso.datetime({ offset: true }) }).readonly(); +export type DuplicatePositionRequestDto = z.infer; + +/** + * UpdatePositionDtoSchema + * @type { object } + * @property { string } externalSystemId + * @property { string } statusDate + * @property { CommonModels.PositionStatusEnum } status + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.IncotermsEnum } incoterms + * @property { CommonModels.IncotermsEnum } secondIncoterms + * @property { string } fillingCompany + * @property { string } sellingContract + * @property { string } fillingScacCode + * @property { string } serviceValidity + * @property { string } ratesValidity + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } buyRateReference + * @property { CommonModels.FrequencyEnum } frequency + * @property { boolean } isParentPosition + * @property { boolean } isExcludedFromStatistics + * @property { string } team + * @property { string } salesRepId + * @property { string } responsibleEmployeeId + * @property { string } receivedByEmployeeId + * @property { string } originOfficeId + * @property { string } projectLiteId + * @property { CommonModels.EditorContentUpdateDto } notes Notes + * @property { CommonModels.MovementTypeEnum } inttraTypeOfMove + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const UpdatePositionDtoSchema = z.object({ externalSystemId: z.string(), statusDate: z.iso.datetime({ offset: true }), status: CommonModels.PositionStatusEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, incoterms: CommonModels.IncotermsEnumSchema, secondIncoterms: CommonModels.IncotermsEnumSchema, fillingCompany: z.string(), sellingContract: z.string(), fillingScacCode: z.string(), serviceValidity: z.iso.datetime({ offset: true }), ratesValidity: z.iso.datetime({ offset: true }), serviceType: CommonModels.ServiceTypeEnumSchema, buyRateReference: z.string(), frequency: CommonModels.FrequencyEnumSchema, isParentPosition: z.boolean(), isExcludedFromStatistics: z.boolean(), team: z.string(), salesRepId: z.string(), responsibleEmployeeId: z.string(), receivedByEmployeeId: z.string(), originOfficeId: z.string(), projectLiteId: z.string(), notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema, volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); +export type UpdatePositionDto = z.infer; + +/** + * ChildPositionCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ChildPositionCustomerDto = z.infer; + +/** + * ChildPositionProfitDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currency + */ +export const ChildPositionProfitDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); +export type ChildPositionProfitDto = z.infer; + +/** + * ChildPositionResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { number } packages + * @property { number } weight + * @property { number } volume + * @property { ChildPositionCustomerDto } customer + * @property { ChildPositionProfitDto } profit + */ +export const ChildPositionResponseDtoSchema = z.object({ id: z.string(), number: z.string(), packages: z.number(), weight: z.number(), volume: z.number(), customer: ChildPositionCustomerDtoSchema, profit: ChildPositionProfitDtoSchema }).readonly(); +export type ChildPositionResponseDto = z.infer; + +/** + * PositionLabelsFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } isParentPosition + * @property { boolean } isLinkedPosition + */ +export const PositionLabelsFilterDtoSchema = z.object({ search: z.string(), isParentPosition: z.boolean(), isLinkedPosition: z.boolean() }).readonly(); +export type PositionLabelsFilterDto = z.infer; + +/** + * PositionListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const PositionListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalProfit: z.number(), profitPerPosition: z.number(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type PositionListResponseDto = z.infer; + +/** + * LinkChildPositionsRequestDtoSchema + * @type { object } + * @property { string[] } childPositionIds + */ +export const LinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()).readonly() }).readonly(); +export type LinkChildPositionsRequestDto = z.infer; + +/** + * UnlinkChildPositionsRequestDtoSchema + * @type { object } + * @property { string[] } childPositionIds + */ +export const UnlinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()).readonly() }).readonly(); +export type UnlinkChildPositionsRequestDto = z.infer; + +/** + * PositionsFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PositionsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PositionsFindAllResponse = z.infer; + +/** + * PositionsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PositionsPaginateOrderParamEnumSchema = z.enum(["number", "transportMode", "isCancelled", "direction", "loadType", "serviceDate", "createdAt", "departureDate", "arrivalDate", "blfromCostumerDate", "blfromCarrierDate", "customsDate", "vgmCustomerDate", "serviceType", "externalSystemId", "employee", "project", "profit", "margin", "isMasterPosition"]); +export type PositionsPaginateOrderParamEnum = z.infer; +export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSchema.enum; + +/** + * PositionsPaginateResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionPreviewResponseDto[] } items + */ +export const PositionsPaginateResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape }); +export type PositionsPaginateResponse = z.infer; + +/** + * TotalProfitResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionPreviewResponseDto[] } items + */ +export const TotalProfitResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape }); +export type TotalProfitResponse = z.infer; + +/** + * PositionsListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ +export const PositionsListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PositionsListAvailablePartnersForResponse = z.infer; + +/** + * ListRouteLabelsResponseSchema + * @type { array } + */ +export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type ListRouteLabelsResponse = z.infer; + +/** + * ListChildResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChildPositionResponseDto[] } items + */ +export const ListChildResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChildPositionResponseDtoSchema).readonly() }).readonly().shape }); +export type ListChildResponse = z.infer; + +} diff --git a/test/generated/next/positions/positions.queries.ts b/test/generated/next/positions/positions.queries.ts new file mode 100644 index 0000000..869e77f --- /dev/null +++ b/test/generated/next/positions/positions.queries.ts @@ -0,0 +1,536 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { PositionsAcl } from "./positions.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PositionsModels } from "./positions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { PositionsApi } from "./positions.api"; + +export namespace PositionsQueries { +export const moduleName = QueryModule.Positions; + +export const keys = { + all: [moduleName] as const, + findAll: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", officeId, limit, filter, page, cursor] as const, + findAllInfinite: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", "infinite", officeId, limit, filter, cursor] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions", "infinite", officeId, limit, order, filter, cursor] as const, + totalProfit: (officeId: string) => [...keys.all, "/offices/:officeId/positions/fake-total-profit", officeId] as const, + listAvailablePartnersFor: (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/positions/:positionId/available-partners", officeId, positionId, search, useCase] as const, + get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId", officeId, positionId] as const, + listRouteLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes/labels", officeId, positionId] as const, + getDuplicateDefaultParameters: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/duplicate/default-parameters", officeId, positionId] as const, + listChild: (officeId: string, positionId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", officeId, positionId, limit, page, cursor] as const, + listChildInfinite: (officeId: string, positionId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", "infinite", officeId, positionId, limit, cursor] as const, +}; + +/** + * Query `useFindAll` + * @summary List all positions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ officeId, limit, filter, page, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(officeId, limit, filter, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUseFindAll({ officeId } )); + return PositionsApi.findAll(officeId, limit, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @summary List all positions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ officeId, limit, filter, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUseFindAll({ officeId } )); + return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary List positions + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @param { PositionsModels.PositionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUsePaginate({ officeId } )); + return PositionsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary List positions + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @param { PositionsModels.PositionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUsePaginate({ officeId } )); + return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create position + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { PositionsModels.CreatePositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position created successfully + * @statusCodes [201, 400, 401, 404] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PositionsAcl.canUseCreate({ officeId } )); + return PositionsApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useTotalProfit` + * @summary List positions + * @permission Requires `canUseTotalProfit` ability + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useTotalProfit = ({ officeId }: { officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.totalProfit(officeId), + queryFn: () => { + checkAcl(PositionsAcl.canUseTotalProfit({ officeId } )); + return PositionsApi.totalProfit(officeId, config) }, + ...options, + }); +}; + +/** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for a position + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListAvailablePartnersFor = ({ officeId, positionId, search, useCase }: { officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), + queryFn: () => { + checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId } )); + return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase, config) }, + ...options, + }); +}; + +/** + * Mutation `useExportPositions` - recommended when file should not be cached + * @summary Export positions to Excel + * @permission Requires `canUseExportPositions` ability + * @param { string } mutation.officeId Path parameter + * @param { PositionsModels.PositionExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportPositions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PositionsAcl.canUseExportPositions({ officeId } )); + return PositionsApi.exportPositions(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGet` + * @summary Get position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Position retrieved successfully + * @statusCodes [200, 401, 403, 404] + */ +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseGet({ officeId } )); + return PositionsApi.get(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.UpdatePositionDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position updated successfully + * @statusCodes [200, 400, 401, 404] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseUpdate({ officeId } )); + return PositionsApi.update(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListRouteLabels` + * @summary List all route labels for a position + * @permission Requires `canUseListRouteLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRouteLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRouteLabels(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseListRouteLabels({ officeId } )); + return PositionsApi.listRouteLabels(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Query `useGetDuplicateDefaultParameters` + * @summary Get default duplication parameters for a position + * @permission Requires `canUseGetDuplicateDefaultParameters` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Default parameters and suggested estimated service date + * @statusCodes [200, 401, 404] + */ +export const useGetDuplicateDefaultParameters = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId } )); + return PositionsApi.getDuplicateDefaultParameters(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useDuplicate` + * @summary Duplicate position + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.DuplicatePositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position duplicated successfully + * @statusCodes [201, 400, 401, 404] + */ +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseDuplicate({ officeId } )); + return PositionsApi.duplicate(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCancel` + * @summary Cancel position + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position cancelled successfully + * @statusCodes [200, 400, 401, 403, 404] + */ +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionsAcl.canUseCancel({ officeId } )); + return PositionsApi.cancel(officeId, positionId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRevertCancel` + * @summary Revert cancelled position (accounting) + * @permission Requires `canUseRevertCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position reverted successfully + * @statusCodes [200, 400, 401, 403, 404] + */ +export const useRevertCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionsAcl.canUseRevertCancel({ officeId } )); + return PositionsApi.revertCancel(officeId, positionId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useLinkChild` + * @summary Link child positions to parent + * @permission Requires `canUseLinkChild` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.LinkChildPositionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useLinkChild = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseLinkChild({ officeId } )); + return PositionsApi.linkChild(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnlinkChild` + * @summary Unlink child positions from parent + * @permission Requires `canUseUnlinkChild` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.UnlinkChildPositionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnlinkChild = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseUnlinkChild({ officeId } )); + return PositionsApi.unlinkChild(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListChild` + * @summary Get child positions for parent + * @permission Requires `canUseListChild` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListChild = ({ officeId, positionId, limit, page, cursor }: { officeId: string, positionId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listChild(officeId, positionId, limit, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUseListChild({ officeId } )); + return PositionsApi.listChild(officeId, positionId, limit, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListChildInfinite + * @summary Get child positions for parent + * @permission Requires `canUseListChild` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListChildInfinite = ({ officeId, positionId, limit, cursor }: { officeId: string, positionId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUseListChild({ officeId } )); + return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +} diff --git a/test/generated/next/projectLite/projectLite.acl.ts b/test/generated/next/projectLite/projectLite.acl.ts new file mode 100644 index 0000000..00ccf56 --- /dev/null +++ b/test/generated/next/projectLite/projectLite.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ProjectLiteAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create project in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Create", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List projects for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `usePaginateProjectLabels` query ability. For global ability, omit the object parameter. + * @description Paginate project labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateProjectLabels` query + */ +export const canUsePaginateProjectLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get project by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Update", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +} diff --git a/test/generated/next/projectLite/projectLite.api.ts b/test/generated/next/projectLite/projectLite.api.ts new file mode 100644 index 0000000..caa5b16 --- /dev/null +++ b/test/generated/next/projectLite/projectLite.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ProjectLiteModels } from "./projectLite.models"; + +export namespace ProjectLiteApi { +export const create = (officeId: string, data: ProjectLiteModels.CreateProjectLiteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite`, + ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), + config + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, + `/offices/${officeId}/project-lite`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateProjectLabels = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, + `/offices/${officeId}/project-lite/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: ProjectLiteModels.UpdateProjectLiteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite/${id}`, + ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/project-lite/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/project-lite/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/projectLite/projectLite.configs.ts b/test/generated/next/projectLite/projectLite.configs.ts new file mode 100644 index 0000000..5981c30 --- /dev/null +++ b/test/generated/next/projectLite/projectLite.configs.ts @@ -0,0 +1,116 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { ProjectLiteModels } from "./projectLite.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ProjectLiteQueries } from "./projectLite.queries"; +import { ProjectLiteAcl } from "./projectLite.acl"; + +export namespace ProjectLiteConfigs { +export const projectLiteConfig = { + meta: { + title: "Project Lite", + }, + readAll: { + acl: ProjectLiteAcl.canUsePaginate, + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + paginated: ProjectLiteQueries.usePaginate, + infinite: ProjectLiteQueries.usePaginateInfinite, + filters: { + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: ProjectLiteAcl.canUseFindById, + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + query: ProjectLiteQueries.useFindById, + }, + create: { + acl: ProjectLiteAcl.canUseCreate, + schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, + mutation: ProjectLiteQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, + update: { + acl: ProjectLiteAcl.canUseUpdate, + schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, + mutation: ProjectLiteQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: ProjectLiteAcl.canUsePaginateProjectLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: ProjectLiteQueries.usePaginateProjectLabels, + infinite: ProjectLiteQueries.usePaginateProjectLabelsInfinite, + filters: { + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/projectLite/projectLite.models.ts b/test/generated/next/projectLite/projectLite.models.ts new file mode 100644 index 0000000..fabb95a --- /dev/null +++ b/test/generated/next/projectLite/projectLite.models.ts @@ -0,0 +1,98 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ProjectLiteModels { +/** + * ProjectLiteEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type ProjectLiteEmployeeDTO = z.infer; + +/** + * ProjectLiteResponseDTOSchema + * @type { object } + * @property { string } id Project ID + * @property { string } name Project name + * @property { string } officeId Office ID + * @property { boolean } archived Is archived + * @property { string } createdById ID of the employee who created this project + * @property { ProjectLiteEmployeeDTO } createdBy Employee who created this project + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this project + * @property { ProjectLiteEmployeeDTO } updatedBy Employee who last updated this project + * @property { string } updatedAt Updated at + */ +export const ProjectLiteResponseDTOSchema = z.object({ id: z.string().describe("Project ID"), name: z.string().describe("Project name"), officeId: z.string().describe("Office ID"), archived: z.boolean().describe("Is archived"), createdById: z.string().describe("ID of the employee who created this project").nullish(), createdBy: ProjectLiteEmployeeDTOSchema.describe("Employee who created this project").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedById: z.string().describe("ID of the employee who last updated this project").nullish(), updatedBy: ProjectLiteEmployeeDTOSchema.describe("Employee who last updated this project").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); +export type ProjectLiteResponseDTO = z.infer; + +/** + * CreateProjectLiteRequestDTOSchema + * @type { object } + * @property { string } name Project name + */ +export const CreateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); +export type CreateProjectLiteRequestDTO = z.infer; + +/** + * ProjectLiteFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ProjectLiteFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); +export type ProjectLiteFilterDto = z.infer; + +/** + * UpdateProjectLiteRequestDTOSchema + * @type { object } + * @property { string } name Project name + */ +export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); +export type UpdateProjectLiteRequestDTO = z.infer; + +/** + * ProjectLitePaginateOrderParamEnumSchema + * @type { enum } + */ +export const ProjectLitePaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ProjectLitePaginateOrderParamEnum = z.infer; +export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEnumSchema.enum; + +/** + * ProjectLitePaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ProjectLiteResponseDTO[] } items + */ +export const ProjectLitePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).readonly() }).readonly().shape }); +export type ProjectLitePaginateResponse = z.infer; + +/** + * PaginateProjectLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateProjectLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateProjectLabelsOrderParamEnum = z.infer; +export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderParamEnumSchema.enum; + +/** + * PaginateProjectLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateProjectLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type PaginateProjectLabelsResponse = z.infer; + +} diff --git a/test/generated/next/projectLite/projectLite.queries.ts b/test/generated/next/projectLite/projectLite.queries.ts new file mode 100644 index 0000000..43432ae --- /dev/null +++ b/test/generated/next/projectLite/projectLite.queries.ts @@ -0,0 +1,270 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ProjectLiteAcl } from "./projectLite.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ProjectLiteModels } from "./projectLite.models"; +import { ProjectLiteApi } from "./projectLite.api"; + +export namespace ProjectLiteQueries { +export const moduleName = QueryModule.ProjectLite; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", "infinite", officeId, limit, order, filter, cursor] as const, + paginateProjectLabels: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", officeId, limit, order, filter, page, cursor] as const, + paginateProjectLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/project-lite/:id", id, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create project + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ProjectLiteModels.CreateProjectLiteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ProjectLiteAcl.canUseCreate({ officeId } )); + return ProjectLiteApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Get paginated projects + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); + return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated projects + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); + return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateProjectLabels` + * @summary Paginate project labels + * @permission Requires `canUsePaginateProjectLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateProjectLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateProjectLabelsInfinite + * @summary Paginate project labels + * @permission Requires `canUsePaginateProjectLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateProjectLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get project by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUseFindById({ officeId } )); + return ProjectLiteApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update project + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ProjectLiteModels.UpdateProjectLiteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ProjectLiteAcl.canUseUpdate({ officeId } )); + return ProjectLiteApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive project + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ProjectLiteAcl.canUseArchive({ officeId } )); + return ProjectLiteApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive project + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId } )); + return ProjectLiteApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/queryModules.ts b/test/generated/next/queryModules.ts new file mode 100644 index 0000000..2daa74a --- /dev/null +++ b/test/generated/next/queryModules.ts @@ -0,0 +1,96 @@ +export const enum QueryModule { + WorkingDocuments = "WorkingDocumentsQueries", + Offices = "OfficesQueries", + BankAccounts = "BankAccountsQueries", + Currencies = "CurrenciesQueries", + Countries = "CountriesQueries", + Folders = "FoldersQueries", + Files = "FilesQueries", + WorkingDocumentsTemplatedDocument = "WorkingDocumentsTemplatedDocumentQueries", + BusinessPartners = "BusinessPartnersQueries", + BusinessPartnerBookkeepingMappings = "BusinessPartnerBookkeepingMappingsQueries", + BusinessPartnerContacts = "BusinessPartnerContactsQueries", + Cities = "CitiesQueries", + Depots = "DepotsQueries", + PartnerNetworks = "PartnerNetworksQueries", + Warehouses = "WarehousesQueries", + UserActivity = "UserActivityQueries", + DocumentTemplates = "DocumentTemplatesQueries", + HsCodes = "HsCodesQueries", + CargoTypes = "CargoTypesQueries", + SeaPositions = "SeaPositionsQueries", + Terminals = "TerminalsQueries", + Airports = "AirportsQueries", + Ports = "PortsQueries", + ContainerYards = "ContainerYardsQueries", + PositionInvolvedParties = "PositionInvolvedPartiesQueries", + PositionRoutes = "PositionRoutesQueries", + AirPositions = "AirPositionsQueries", + PositionAccount = "PositionAccountQueries", + PositionAccountItems = "PositionAccountItemsQueries", + PositionProfitChangeTracking = "PositionProfitChangeTrackingQueries", + WorkingDocumentsExportDeclaration = "WorkingDocumentsExportDeclarationQueries", + PositionCargo = "PositionCargoQueries", + PositionCargoPackage = "PositionCargoPackageQueries", + PackageTypes = "PackageTypesQueries", + WorkingDocumentsHouseBl = "WorkingDocumentsHouseBlQueries", + WorkingDocumentsBlInstructions = "WorkingDocumentsBlInstructionsQueries", + WorkingDocumentsAmsInstructions = "WorkingDocumentsAmsInstructionsQueries", + WorkingDocumentsHouseAwb = "WorkingDocumentsHouseAwbQueries", + ChargeTypes = "ChargeTypesQueries", + WorkingDocumentsMasterAwb = "WorkingDocumentsMasterAwbQueries", + WorkingDocumentsCmrForm = "WorkingDocumentsCmrFormQueries", + WorkingDocumentsIsfForm = "WorkingDocumentsIsfFormQueries", + WorkingDocumentsFcrForm = "WorkingDocumentsFcrFormQueries", + ShippingInstructions = "ShippingInstructionsQueries", + EmployeeAccount = "EmployeeAccountQueries", + EmployeeSettings = "EmployeeSettingsQueries", + EmployeeRoles = "EmployeeRolesQueries", + EmployeePermissions = "EmployeePermissionsQueries", + EmployeeProfile = "EmployeeProfileQueries", + Employee = "EmployeeQueries", + Employment = "EmploymentQueries", + CustomerAccount = "CustomerAccountQueries", + Customers = "CustomersQueries", + Quotes = "QuotesQueries", + QuoteAccount = "QuoteAccountQueries", + QuoteProfitChangeTracking = "QuoteProfitChangeTrackingQueries", + SeaQuotes = "SeaQuotesQueries", + RoadQuotes = "RoadQuotesQueries", + QuoteDocument = "QuoteDocumentQueries", + QuoteCargo = "QuoteCargoQueries", + QuoteCargoPackage = "QuoteCargoPackageQueries", + QuoteRoutes = "QuoteRoutesQueries", + DunningManagement = "DunningManagementQueries", + DunningPartnerOutstandingInvoices = "DunningPartnerOutstandingInvoicesQueries", + DunningLevels = "DunningLevelsQueries", + DunningSystems = "DunningSystemsQueries", + DunningAccountStatement = "DunningAccountStatementQueries", + Positions = "PositionsQueries", + QuoteConversion = "QuoteConversionQueries", + Invoices = "InvoicesQueries", + VatRules = "VatRulesQueries", + InvoicePayments = "InvoicePaymentsQueries", + PaymentConfirmations = "PaymentConfirmationsQueries", + ProjectLite = "ProjectLiteQueries", + PositionChecklist = "PositionChecklistQueries", + ChecklistTemplates = "ChecklistTemplatesQueries", + BookkeepingExport = "BookkeepingExportQueries", + FactoringExport = "FactoringExportQueries", + FactoringMerge = "FactoringMergeQueries", + AWBStocks = "AWBStocksQueries", + MasterData = "MasterDataQueries", + ChecklistItems = "ChecklistItemsQueries", + MasterDataImport = "MasterDataImportQueries", + RemarkTemplates = "RemarkTemplatesQueries", + IntegrationChannels = "IntegrationChannelsQueries", + ControlTowerBookings = "ControlTowerBookingsQueries", + ControlTowerPackages = "ControlTowerPackagesQueries", + ControlTowerContainers = "ControlTowerContainersQueries", + ControlTowerAuth = "ControlTowerAuthQueries", + ControlTowerMe = "ControlTowerMeQueries", + ControlTowerSearch = "ControlTowerSearchQueries", + ControlTowerCalendar = "ControlTowerCalendarQueries", + InttraShippingInstructionMessages = "InttraShippingInstructionMessagesQueries", + InttraOfficeIntegration = "InttraOfficeIntegrationQueries", +} \ No newline at end of file diff --git a/test/generated/next/quoteAccount/quoteAccount.acl.ts b/test/generated/next/quoteAccount/quoteAccount.acl.ts new file mode 100644 index 0000000..5a12701 --- /dev/null +++ b/test/generated/next/quoteAccount/quoteAccount.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteAccountAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description List quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCreateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateItem` mutation + */ +export const canUseCreateItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDeleteItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteItem` mutation + */ +export const canUseDeleteItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateItem` mutation + */ +export const canUseUpdateItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDuplicateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateItem` mutation + */ +export const canUseDuplicateItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/next/quoteAccount/quoteAccount.api.ts b/test/generated/next/quoteAccount/quoteAccount.api.ts new file mode 100644 index 0000000..0ef7323 --- /dev/null +++ b/test/generated/next/quoteAccount/quoteAccount.api.ts @@ -0,0 +1,47 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteAccountModels } from "./quoteAccount.models"; + +export namespace QuoteAccountApi { +export const get = (quoteId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/account`, + config + ) +}; +export const createItem = (quoteId: string, officeId: string, data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items`, + ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), + config + ) +}; +export const deleteItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, + undefined, + config + ) +}; +export const updateItem = (quoteId: string, itemId: string, officeId: string, data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, + ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), + config + ) +}; +export const duplicateItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/quoteAccount/quoteAccount.models.ts b/test/generated/next/quoteAccount/quoteAccount.models.ts new file mode 100644 index 0000000..71ef66e --- /dev/null +++ b/test/generated/next/quoteAccount/quoteAccount.models.ts @@ -0,0 +1,170 @@ +import { z } from "zod"; + +export namespace QuoteAccountModels { +/** + * QuoteAccountItemTypeEnumSchema + * @type { enum } + */ +export const QuoteAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); +export type QuoteAccountItemTypeEnum = z.infer; +export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; + +/** + * QuoteChargeDtoResponseSchema + * @type { object } + * @property { object } chargeType + * @property { string } chargeType.id + * @property { string } chargeType.name + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { object } buyVatRule + * @property { string } buyVatRule.id + * @property { string } buyVatRule.name + * @property { string } buyVatRule.matchcode + * @property { string } buyVatRule.printCode + * @property { object } vendor + * @property { string } vendor.id + * @property { string } vendor.name + * @property { string } vendor.matchCode + * @property { string } vendor.label + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { object } sellVatRule + * @property { string } sellVatRule.id + * @property { string } sellVatRule.name + * @property { string } sellVatRule.matchcode + * @property { string } sellVatRule.printCode + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + * @property { number } profit Profit amount + */ +export const QuoteChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).readonly(), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge").nullish(), buyRate: z.number().describe("Buy rate amount").nullish(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }).readonly(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), sellRate: z.number().describe("Sell rate amount").nullish(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }).readonly(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), profit: z.number().describe("Profit amount").nullish() }).readonly(); +export type QuoteChargeDtoResponse = z.infer; + +/** + * QuoteTextDtoResponseSchema + * @type { object } + * @property { string } content Text content + */ +export const QuoteTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type QuoteTextDtoResponse = z.infer; + +/** + * QuoteAccountItemDtoResponseSchema + * @type { object } + * @property { string } id Item ID + * @property { QuoteAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE + * @property { QuoteTextDtoResponse } text Text data if type is TEXT + */ +export const QuoteAccountItemDtoResponseSchema = z.object({ id: z.string().describe("Item ID"), type: QuoteAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item"), charge: QuoteChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), text: QuoteTextDtoResponseSchema.describe("Text data if type is TEXT").nullish() }).readonly(); +export type QuoteAccountItemDtoResponse = z.infer; + +/** + * QuoteAccountResponseDtoSchema + * @type { object } + * @property { string } id Account ID + * @property { string } quoteId Quote ID + * @property { QuoteAccountItemDtoResponse[] } items Account items + * @property { object } totals Account totals + * @property { number } totals.totalBuyRates + * @property { number } totals.totalSellRates + * @property { number } totals.totalProfit + * @property { number } totals.displayAmount + * @property { string } totals.displayCurrencyCode + * @property { object[] } totalsPerCurrency Account totals per currency + * @property { number } totalsPerCurrency.[0].totalBuyRates + * @property { number } totalsPerCurrency.[0].totalSellRates + * @property { number } totalsPerCurrency.[0].totalProfit + * @property { number } totalsPerCurrency.[0].displayAmount + * @property { string } totalsPerCurrency.[0].displayCurrencyCode + */ +export const QuoteAccountResponseDtoSchema = z.object({ id: z.string().describe("Account ID"), quoteId: z.string().describe("Quote ID"), items: z.array(QuoteAccountItemDtoResponseSchema).readonly().describe("Account items"), totals: z.object({ totalBuyRates: z.number(), totalSellRates: z.number(), totalProfit: z.number(), displayAmount: z.number(), displayCurrencyCode: z.string() }).readonly().describe("Account totals"), totalsPerCurrency: z.array(z.object({ totalBuyRates: z.number(), totalSellRates: z.number(), totalProfit: z.number(), displayAmount: z.number(), displayCurrencyCode: z.string() }).readonly()).readonly().describe("Account totals per currency") }).readonly(); +export type QuoteAccountResponseDto = z.infer; + +/** + * CreateQuoteChargeDataDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1`. Default: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code. Default: `EUR` + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code. Default: `EUR` + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const CreateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge").default(1), buyRate: z.number().describe("Buy rate amount"), buyCurrencyCode: z.string().describe("Buy rate currency code").default("EUR"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount"), sellCurrencyCode: z.string().describe("Sell rate currency code").default("EUR"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export type CreateQuoteChargeDataDto = z.infer; + +/** + * CreateQuoteTextDataDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const CreateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type CreateQuoteTextDataDto = z.infer; + +/** + * CreateQuoteAccountItemRequestDtoSchema + * @type { object } + * @property { QuoteAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { CreateQuoteChargeDataDto } charge Charge data if type is CHARGE + * @property { CreateQuoteTextDataDto } text Text data if type is TEXT + */ +export const CreateQuoteAccountItemRequestDtoSchema = z.object({ type: QuoteAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item").nullish(), charge: CreateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE").nullish(), text: CreateQuoteTextDataDtoSchema.describe("Text data if type is TEXT").nullish() }).readonly(); +export type CreateQuoteAccountItemRequestDto = z.infer; + +/** + * UpdateQuoteChargeDataDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const UpdateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount").nullable(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID").nullable(), vendorId: z.string().describe("Vendor ID").nullable(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount").nullable(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID").nullable(), customerId: z.string().describe("Customer ID").nullable(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export type UpdateQuoteChargeDataDto = z.infer; + +/** + * UpdateQuoteTextDataDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const UpdateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export type UpdateQuoteTextDataDto = z.infer; + +/** + * UpdateQuoteAccountItemRequestDtoSchema + * @type { object } + * @property { number } orderPosition Order position of the item + * @property { UpdateQuoteChargeDataDto } charge Charge data if type is CHARGE + * @property { UpdateQuoteTextDataDto } text Text data if type is TEXT + */ +export const UpdateQuoteAccountItemRequestDtoSchema = z.object({ orderPosition: z.number().describe("Order position of the item"), charge: UpdateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE"), text: UpdateQuoteTextDataDtoSchema.describe("Text data if type is TEXT") }).readonly(); +export type UpdateQuoteAccountItemRequestDto = z.infer; + +} diff --git a/test/generated/next/quoteAccount/quoteAccount.queries.ts b/test/generated/next/quoteAccount/quoteAccount.queries.ts new file mode 100644 index 0000000..69c6456 --- /dev/null +++ b/test/generated/next/quoteAccount/quoteAccount.queries.ts @@ -0,0 +1,154 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteAccountAcl } from "./quoteAccount.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteAccountModels } from "./quoteAccount.models"; +import { QuoteAccountApi } from "./quoteAccount.api"; + +export namespace QuoteAccountQueries { +export const moduleName = QueryModule.QuoteAccount; + +export const keys = { + all: [moduleName] as const, + get: (quoteId: string, officeId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account", quoteId, officeId] as const, +}; + +/** + * Query `useGet` + * @summary Get quote account details + * @permission Requires `canUseGet` ability + * @param { string } object.quoteId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ quoteId, officeId }: { quoteId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(quoteId, officeId), + queryFn: () => { + checkAcl(QuoteAccountAcl.canUseGet({ officeId } )); + return QuoteAccountApi.get(quoteId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateItem` + * @summary Create quote account item + * @permission Requires `canUseCreateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { QuoteAccountModels.CreateQuoteAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, officeId, data }) => { + checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId } )); + return QuoteAccountApi.createItem(quoteId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteItem` + * @summary Delete quote account item + * @permission Requires `canUseDeleteItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId }) => { + checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId } )); + return QuoteAccountApi.deleteItem(quoteId, itemId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateItem` + * @summary Update quote account item + * @permission Requires `canUseUpdateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { QuoteAccountModels.UpdateQuoteAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId, data }) => { + checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId } )); + return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicateItem` + * @summary Duplicate quote account item + * @permission Requires `canUseDuplicateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId }) => { + checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId } )); + return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/quoteCargo/quoteCargo.acl.ts b/test/generated/next/quoteCargo/quoteCargo.acl.ts new file mode 100644 index 0000000..38031c0 --- /dev/null +++ b/test/generated/next/quoteCargo/quoteCargo.acl.ts @@ -0,0 +1,108 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteCargoAcl { +/** + * Use for `useListCargosByQuoteId` query ability. For global ability, omit the object parameter. + * @description List cargo items by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByQuoteId` query + */ +export const canUseListCargosByQuoteId = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. + * @description List cargo labels by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query + */ +export const canUseListCargoLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. + * @description Get cargo summary by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query + */ +export const canUseGetCargoSummary = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. + * @description Get cargo item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query + */ +export const canUseGetCargoById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. + * @description Update cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation + */ +export const canUseUpdateCargo = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation + */ +export const canUseDeleteCargo = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation + */ +export const canUseCreateBulkCargos = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation + */ +export const canUseDuplicateCargo = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +} diff --git a/test/generated/next/quoteCargo/quoteCargo.api.ts b/test/generated/next/quoteCargo/quoteCargo.api.ts new file mode 100644 index 0000000..dc2e9a4 --- /dev/null +++ b/test/generated/next/quoteCargo/quoteCargo.api.ts @@ -0,0 +1,77 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteCargoModels } from "./quoteCargo.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoApi { +export const listCargosByQuoteId = (officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos`, + { + ...config, + params: { + order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listCargoLabels = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, + config + ) +}; +export const getCargoSummary = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, + config + ) +}; +export const getCargoById = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + config + ) +}; +export const updateCargo = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), + config + ) +}; +export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + undefined, + config + ) +}; +export const createBulkCargos = (numberOfCargos: number, officeId: string, quoteId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + config + ) +}; +export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/quoteCargo/quoteCargo.configs.ts b/test/generated/next/quoteCargo/quoteCargo.configs.ts new file mode 100644 index 0000000..bbd862c --- /dev/null +++ b/test/generated/next/quoteCargo/quoteCargo.configs.ts @@ -0,0 +1,100 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoQueries } from "./quoteCargo.queries"; +import { QuoteCargoAcl } from "./quoteCargo.acl"; + +export namespace QuoteCargoConfigs { +export const cargosConfig = { + meta: { + title: "Cargos", + }, + readAll: { + acl: QuoteCargoAcl.canUseListCargosByQuoteId, + schema: CommonModels.PositionCargoResponseDTOSchema, + paginated: QuoteCargoQueries.useListCargosByQuoteId, + infinite: QuoteCargoQueries.useListCargosByQuoteIdInfinite, + columns: dynamicColumns({ + schema: CommonModels.PositionCargoResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + quoteId: true, + rootFolderId: true, + cargoType: true, + autoCalculateTotals: true, + autoCalculateRates: true, + autoCalculateVgm: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + rateOptions: true, + rateClass: true, + textForCustoms: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + ratePerKg: true, + totalRate: true, + tare: true, + vgm: true, + hsCodeLabels: true, + note: true, + packages: true, + createdAt: true, + updatedAt: true, + completeWeight: true, + packageTotals: true, + }, + }, +}), + }, + read: { + acl: QuoteCargoAcl.canUseGetCargoById, + schema: CommonModels.PositionCargoResponseDTOSchema, + query: QuoteCargoQueries.useGetCargoById, + }, + update: { + acl: QuoteCargoAcl.canUseUpdateCargo, + schema: CommonModels.UpdatePositionCargoDTOSchema, + mutation: QuoteCargoQueries.useUpdateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.UpdatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, +}) + }, + delete: { + acl: QuoteCargoAcl.canUseDeleteCargo, + mutation: QuoteCargoQueries.useDeleteCargo, + }, +}; + +} diff --git a/test/generated/next/quoteCargo/quoteCargo.models.ts b/test/generated/next/quoteCargo/quoteCargo.models.ts new file mode 100644 index 0000000..6520815 --- /dev/null +++ b/test/generated/next/quoteCargo/quoteCargo.models.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoModels { +/** + * ListCargosByQuoteIdOrderParamSchema + * @type { array } + * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + */ +export const ListCargosByQuoteIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).readonly().describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt").nullish(); +export type ListCargosByQuoteIdOrderParam = z.infer; + +/** + * ListCargosByQuoteIdResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.PositionCargoResponseDTO[] } items + */ +export const ListCargosByQuoteIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape }); +export type ListCargosByQuoteIdResponse = z.infer; + +/** + * QuoteCargoListCargoLabelsResponseSchema + * @type { array } + */ +export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export type QuoteCargoListCargoLabelsResponse = z.infer; + +/** + * QuoteCargoGetCargoSummaryResponseSchema + * @type { array } + */ +export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); +export type QuoteCargoGetCargoSummaryResponse = z.infer; + +/** + * QuoteCargoCreateBulkCargosResponseSchema + * @type { array } + */ +export const QuoteCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema).readonly(); +export type QuoteCargoCreateBulkCargosResponse = z.infer; + +} diff --git a/test/generated/next/quoteCargo/quoteCargo.queries.ts b/test/generated/next/quoteCargo/quoteCargo.queries.ts new file mode 100644 index 0000000..792ae63 --- /dev/null +++ b/test/generated/next/quoteCargo/quoteCargo.queries.ts @@ -0,0 +1,266 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteCargoAcl } from "./quoteCargo.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteCargoModels } from "./quoteCargo.models"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoApi } from "./quoteCargo.api"; + +export namespace QuoteCargoQueries { +export const moduleName = QueryModule.QuoteCargo; + +export const keys = { + all: [moduleName] as const, + listCargosByQuoteId: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", officeId, quoteId, limit, order, page, cursor] as const, + listCargosByQuoteIdInfinite: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", "infinite", officeId, quoteId, limit, order, cursor] as const, + listCargoLabels: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/labels", officeId, quoteId] as const, + getCargoSummary: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/summary", officeId, quoteId] as const, + getCargoById: (officeId: string, quoteId: string, cargoId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/:cargoId", officeId, quoteId, cargoId] as const, +}; + +/** + * Query `useListCargosByQuoteId` + * @summary List all cargo items for a quote + * @permission Requires `canUseListCargosByQuoteId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByQuoteId = ({ officeId, quoteId, limit, order, page, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListCargosByQuoteIdInfinite + * @summary List all cargo items for a quote + * @permission Requires `canUseListCargosByQuoteId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByQuoteIdInfinite = ({ officeId, quoteId, limit, order, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useListCargoLabels` + * @summary List all cargo labels for a quote + * @permission Requires `canUseListCargoLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargoLabels = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargoLabels(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId } )); + return QuoteCargoApi.listCargoLabels(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Query `useGetCargoSummary` + * @summary Get cargo summary grouped by transport unit type + * @permission Requires `canUseGetCargoSummary` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoSummary = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoSummary(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId } )); + return QuoteCargoApi.getCargoSummary(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Query `useGetCargoById` + * @summary Get a specific cargo item + * @permission Requires `canUseGetCargoById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { string } object.cargoId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoById = ({ officeId, quoteId, cargoId }: { officeId: string, quoteId: string, cargoId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoById(officeId, quoteId, cargoId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId } )); + return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCargo` + * @summary Update a cargo item + * @permission Requires `canUseUpdateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, data }) => { + checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId } )); + return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteCargo` + * @summary Delete a cargo item + * @permission Requires `canUseDeleteCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId }) => { + checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId } )); + return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateBulkCargos` + * @summary Create a new cargo item + * @permission Requires `canUseCreateBulkCargos` ability + * @param { number } mutation.numberOfCargos Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { + checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId } )); + return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicateCargo` + * @summary Duplicate a cargo item + * @permission Requires `canUseDuplicateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId }) => { + checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId } )); + return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/quoteCargoPackage/quoteCargoPackage.acl.ts b/test/generated/next/quoteCargoPackage/quoteCargoPackage.acl.ts new file mode 100644 index 0000000..da1d43f --- /dev/null +++ b/test/generated/next/quoteCargoPackage/quoteCargoPackage.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteCargoPackageAcl { +/** + * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. + * @description Create cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation + */ +export const canUseCreatePackage = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. + * @description Update cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation + */ +export const canUseUpdatePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation + */ +export const canUseDeletePackage = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation + */ +export const canUseDuplicatePackage = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. + * @description Move cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation + */ +export const canUseMovePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +} diff --git a/test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts b/test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts new file mode 100644 index 0000000..17b3e8f --- /dev/null +++ b/test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts @@ -0,0 +1,48 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteCargoPackageApi { +export const createPackage = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, + ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), + config + ) +}; +export const updatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), + config + ) +}; +export const deletePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, + undefined, + config + ) +}; +export const duplicatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, + undefined, + config + ) +}; +export const movePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, + ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts b/test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts new file mode 100644 index 0000000..722792e --- /dev/null +++ b/test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts @@ -0,0 +1,163 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteCargoPackageAcl } from "./quoteCargoPackage.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteCargoPackageApi } from "./quoteCargoPackage.api"; + +export namespace QuoteCargoPackageQueries { +export const moduleName = QueryModule.QuoteCargoPackage; + + + +/** + * Mutation `useCreatePackage` + * @summary Create a new package for a cargo + * @permission Requires `canUseCreatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId } )); + return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdatePackage` + * @summary Update a package + * @permission Requires `canUseUpdatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId } )); + return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeletePackage` + * @summary Delete a package + * @permission Requires `canUseDeletePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { + checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId } )); + return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicatePackage` + * @summary Duplicate a package + * @permission Requires `canUseDuplicatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { + checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId } )); + return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMovePackage` + * @summary Move a package to a different cargo + * @permission Requires `canUseMovePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId } )); + return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/quoteConversion/quoteConversion.acl.ts b/test/generated/next/quoteConversion/quoteConversion.acl.ts new file mode 100644 index 0000000..8c0f3c4 --- /dev/null +++ b/test/generated/next/quoteConversion/quoteConversion.acl.ts @@ -0,0 +1,17 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteConversionAcl { +/** + * Use for `useConvertQuoteToPosition` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useConvertQuoteToPosition` mutation + */ +export const canUseConvertQuoteToPosition = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/next/quoteConversion/quoteConversion.api.ts b/test/generated/next/quoteConversion/quoteConversion.api.ts new file mode 100644 index 0000000..30eb85a --- /dev/null +++ b/test/generated/next/quoteConversion/quoteConversion.api.ts @@ -0,0 +1,16 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteConversionModels } from "./quoteConversion.models"; + +export namespace QuoteConversionApi { +export const convertQuoteToPosition = (officeId: string, quoteId: string, data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/convert`, + ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/quoteConversion/quoteConversion.models.ts b/test/generated/next/quoteConversion/quoteConversion.models.ts new file mode 100644 index 0000000..08987fb --- /dev/null +++ b/test/generated/next/quoteConversion/quoteConversion.models.ts @@ -0,0 +1,12 @@ +import { z } from "zod"; + +export namespace QuoteConversionModels { +/** + * ConvertQuoteToPositionRequestDtoSchema + * @type { object } + * @property { string } estimatedServiceDate + */ +export const ConvertQuoteToPositionRequestDtoSchema = z.object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }).readonly(); +export type ConvertQuoteToPositionRequestDto = z.infer; + +} diff --git a/test/generated/next/quoteConversion/quoteConversion.queries.ts b/test/generated/next/quoteConversion/quoteConversion.queries.ts new file mode 100644 index 0000000..9fbcf1d --- /dev/null +++ b/test/generated/next/quoteConversion/quoteConversion.queries.ts @@ -0,0 +1,44 @@ +import { AxiosRequestConfig } from "axios"; +import { useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteConversionAcl } from "./quoteConversion.acl"; +import { AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteConversionModels } from "./quoteConversion.models"; +import { QuoteConversionApi } from "./quoteConversion.api"; + +export namespace QuoteConversionQueries { +export const moduleName = QueryModule.QuoteConversion; + + + +/** + * Mutation `useConvertQuoteToPosition` + * @summary Convert quote to position + * @permission Requires `canUseConvertQuoteToPosition` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteConversionModels.ConvertQuoteToPositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Quote converted to position successfully + * @statusCodes [201, 400, 401, 404] + */ +export const useConvertQuoteToPosition = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId } )); + return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/quoteDocument/quoteDocument.acl.ts b/test/generated/next/quoteDocument/quoteDocument.acl.ts new file mode 100644 index 0000000..43dec1f --- /dev/null +++ b/test/generated/next/quoteDocument/quoteDocument.acl.ts @@ -0,0 +1,69 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteDocumentAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGetPreview` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` mutation + */ +export const canUseGetPreview = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGenerateEml` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateEml` mutation + */ +export const canUseGenerateEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/next/quoteDocument/quoteDocument.api.ts b/test/generated/next/quoteDocument/quoteDocument.api.ts new file mode 100644 index 0000000..b5f9bfb --- /dev/null +++ b/test/generated/next/quoteDocument/quoteDocument.api.ts @@ -0,0 +1,61 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteDocumentModels } from "./quoteDocument.models"; + +export namespace QuoteDocumentApi { +export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/document`, + config + ) +}; +export const update = (officeId: string, quoteId: string, data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/document`, + ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), + config + ) +}; +export const getPreview = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/${quoteId}/document/preview`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generate = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/document/generate`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), + config + ) +}; +export const generateEml = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/${quoteId}/document/eml`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/next/quoteDocument/quoteDocument.models.ts b/test/generated/next/quoteDocument/quoteDocument.models.ts new file mode 100644 index 0000000..8362f3f --- /dev/null +++ b/test/generated/next/quoteDocument/quoteDocument.models.ts @@ -0,0 +1,134 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteDocumentModels { +/** + * QuoteDocumentDataDtoSchema + * @type { object } + * @property { CommonModels.RouteTableBlockResponseDto } routeTable + * @property { CommonModels.CargoTableBlockDto } cargoTable + * @property { CommonModels.FinanceTableBlockDto } financeTable + */ +export const QuoteDocumentDataDtoSchema = z.object({ routeTable: CommonModels.RouteTableBlockResponseDtoSchema, cargoTable: CommonModels.CargoTableBlockDtoSchema, financeTable: CommonModels.FinanceTableBlockDtoSchema }).readonly(); +export type QuoteDocumentDataDto = z.infer; + +/** + * QuoteDocumentConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl + * @property { string } headerImageUrl + * @property { string } termsAndConditionsImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ +export const QuoteDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), termsAndConditionsImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); +export type QuoteDocumentConfigDto = z.infer; + +/** + * CustomerDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + */ +export const CustomerDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); +export type CustomerDto = z.infer; + +/** + * ContactDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } phone + * @property { string } date + * @property { string } validFrom + * @property { string } validUntil + */ +export const ContactDtoSchema = z.object({ name: z.string(), email: z.string(), phone: z.string(), date: z.iso.datetime({ offset: true }), validFrom: z.iso.datetime({ offset: true }).nullish(), validUntil: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type ContactDto = z.infer; + +/** + * QuoteDocumentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } quoteId + * @property { string } quoteNumber + * @property { CommonModels.TransportModeEnum } quoteTransportMode Mode of transport + * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote + * @property { string } transitDurationInDays Transit duration in days + * @property { CustomerDto } customer + * @property { ContactDto } contact + * @property { QuoteDocumentDataDto } data + * @property { boolean } suspendCargoTable + * @property { boolean } suspendFinanceTable + * @property { CommonModels.EditorContentResponseDto } bodyRemarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks + * @property { boolean } isIssued + * @property { number } version + * @property { QuoteDocumentConfigDto } config + * @property { string } issuedAt + */ +export const QuoteDocumentResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), quoteNumber: z.string(), quoteTransportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), transitDurationInDays: z.string().describe("Transit duration in days").nullish(), customer: CustomerDtoSchema, contact: ContactDtoSchema, data: QuoteDocumentDataDtoSchema.nullish(), suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), isIssued: z.boolean(), version: z.number(), config: QuoteDocumentConfigDtoSchema.nullish(), issuedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type QuoteDocumentResponseDto = z.infer; + +/** + * QuoteDocumentDataUpdateDtoSchema + * @type { object } + * @property { CommonModels.RouteTableUpdateBlockDto } routeTable + * @property { CommonModels.CargoTableBlockUpdateDto } cargoTable + * @property { CommonModels.FinanceTableBlockUpdateDto } financeTable + */ +export const QuoteDocumentDataUpdateDtoSchema = z.object({ routeTable: CommonModels.RouteTableUpdateBlockDtoSchema, cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema, financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema }).readonly(); +export type QuoteDocumentDataUpdateDto = z.infer; + +/** + * CustomerUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + */ +export const CustomerUpdateDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); +export type CustomerUpdateDto = z.infer; + +/** + * ContactUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } phone + * @property { string } date + */ +export const ContactUpdateDtoSchema = z.object({ name: z.string(), email: z.email(), phone: z.string(), date: z.iso.datetime({ offset: true }) }).readonly(); +export type ContactUpdateDto = z.infer; + +/** + * UpdateQuoteDocumentRequestDtoSchema + * @type { object } + * @property { CustomerUpdateDto } customer + * @property { ContactUpdateDto } contact + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks + * @property { boolean } suspendCargoTable + * @property { boolean } suspendFinanceTable + * @property { QuoteDocumentDataUpdateDto } data + */ +export const UpdateQuoteDocumentRequestDtoSchema = z.object({ customer: CustomerUpdateDtoSchema, contact: ContactUpdateDtoSchema, bodyRemarks: CommonModels.EditorContentUpdateDtoSchema, footerRemarks: CommonModels.EditorContentUpdateDtoSchema, suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), data: QuoteDocumentDataUpdateDtoSchema }).readonly(); +export type UpdateQuoteDocumentRequestDto = z.infer; + +/** + * GenerateQuoteDocumentPreviewRequestDtoSchema + * @type { object } + * @property { string } issuedAt + */ +export const GenerateQuoteDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type GenerateQuoteDocumentPreviewRequestDto = z.infer; + +/** + * GenerateQuoteDocumentRequestDtoSchema + * @type { object } + * @property { string } issuedAt + * @property { string } fileName + */ +export const GenerateQuoteDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); +export type GenerateQuoteDocumentRequestDto = z.infer; + +} diff --git a/test/generated/next/quoteDocument/quoteDocument.queries.ts b/test/generated/next/quoteDocument/quoteDocument.queries.ts new file mode 100644 index 0000000..fd43c96 --- /dev/null +++ b/test/generated/next/quoteDocument/quoteDocument.queries.ts @@ -0,0 +1,153 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteDocumentAcl } from "./quoteDocument.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuoteDocumentModels } from "./quoteDocument.models"; +import { QuoteDocumentApi } from "./quoteDocument.api"; + +export namespace QuoteDocumentQueries { +export const moduleName = QueryModule.QuoteDocument; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/document", officeId, quoteId] as const, +}; + +/** + * Query `useGet` + * @summary Get quote document + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteDocumentAcl.canUseGet({ officeId } )); + return QuoteDocumentApi.get(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update quote document + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.UpdateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId } )); + return QuoteDocumentApi.update(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGetPreview` - recommended when file should not be cached + * @summary Get quote document pdf preview + * @permission Requires `canUseGetPreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGetPreview = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId } )); + return QuoteDocumentApi.getPreview(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerate` + * @summary Get quote document pdf preview + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId } )); + return QuoteDocumentApi.generate(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateEml` - recommended when file should not be cached + * @summary Generate quote document and return EML file + * @permission Requires `canUseGenerateEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId } )); + return QuoteDocumentApi.generateEml(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts new file mode 100644 index 0000000..24ebb81 --- /dev/null +++ b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts @@ -0,0 +1,32 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteProfitChangeTrackingAcl { +/** + * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. + * @description List quote profit change groups + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.quoteId quoteId from quoteId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query + */ +export const canUseFindProfitChangeGroups = ( + object?: { officeId: string, quoteId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; + +/** + * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. + * @description Get quote profit change group details + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.quoteId quoteId from quoteId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query + */ +export const canUseFindProfitChangeGroupDetail = ( + object?: { officeId: string, quoteId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; + +} diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts new file mode 100644 index 0000000..aa8e7c0 --- /dev/null +++ b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts @@ -0,0 +1,29 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; + +export namespace QuoteProfitChangeTrackingApi { +export const findProfitChangeGroups = (officeId: string, quoteId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, + { + ...config, + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findProfitChangeGroupDetail = (groupId: string, officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, + config + ) +}; +} diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts new file mode 100644 index 0000000..169ba81 --- /dev/null +++ b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts @@ -0,0 +1,36 @@ +import { dynamicColumns } from "@povio/ui"; +import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; +import { QuoteProfitChangeTrackingQueries } from "./quoteProfitChangeTracking.queries"; +import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; + +export namespace QuoteProfitChangeTrackingConfigs { +export const profitChangeGroupsConfig = { + meta: { + title: "Profit Change Groups", + }, + readAll: { + acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups, + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, + paginated: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroups, + infinite: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, + columns: dynamicColumns({ + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, + options: { + columns: { + id: true, + timestamp: true, + users: true, + profit: true, + changeCount: true, + }, + }, +}), + }, + read: { + acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema, + query: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, + }, +}; + +} diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts new file mode 100644 index 0000000..a87cf72 --- /dev/null +++ b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts @@ -0,0 +1,56 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteProfitChangeTrackingModels { +/** + * QuoteAccountProfitChangeGroupDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto[] } users + * @property { object } profit + * @property { number } profit.amount + * @property { string } profit.currencyCode + * @property { number } changeCount + */ +export const QuoteAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), changeCount: z.number() }).readonly(); +export type QuoteAccountProfitChangeGroupDto = z.infer; + +/** + * QuoteAccountProfitChangeEntryDtoSchema + * @type { object } + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto } user + * @property { number } changeNumber + * @property { number } oldProfit + * @property { number } newProfit + * @property { string } currencyCode + */ +export const QuoteAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }).readonly(); +export type QuoteAccountProfitChangeEntryDto = z.infer; + +/** + * QuoteAccountProfitChangeGroupDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { string } currencyCode + * @property { QuoteAccountProfitChangeEntryDto[] } entries + */ +export const QuoteAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(QuoteAccountProfitChangeEntryDtoSchema).readonly() }).readonly(); +export type QuoteAccountProfitChangeGroupDetailDto = z.infer; + +/** + * QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { QuoteAccountProfitChangeGroupDto[] } items + */ +export const QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(QuoteAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape }); +export type QuoteProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; + +} diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts new file mode 100644 index 0000000..380a658 --- /dev/null +++ b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts @@ -0,0 +1,97 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { QuoteProfitChangeTrackingApi } from "./quoteProfitChangeTracking.api"; + +export namespace QuoteProfitChangeTrackingQueries { +export const moduleName = QueryModule.QuoteProfitChangeTracking; + +export const keys = { + all: [moduleName] as const, + findProfitChangeGroups: (officeId: string, quoteId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", officeId, quoteId, limit, page, cursor] as const, + findProfitChangeGroupsInfinite: (officeId: string, quoteId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", "infinite", officeId, quoteId, limit, cursor] as const, + findProfitChangeGroupDetail: (groupId: string, officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups/:groupId", groupId, officeId, quoteId] as const, +}; + +/** + * Query `useFindProfitChangeGroups` + * @summary List quote profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroups = ({ officeId, quoteId, limit, page, cursor }: { officeId: string, quoteId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), + queryFn: () => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useFindProfitChangeGroupsInfinite + * @summary List quote profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupsInfinite = ({ officeId, quoteId, limit, cursor }: { officeId: string, quoteId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindProfitChangeGroupDetail` + * @summary Get quote profit change group details + * @permission Requires `canUseFindProfitChangeGroupDetail` ability + * @param { string } object.groupId Path parameter + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupDetail = ({ groupId, officeId, quoteId }: { groupId: string, officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), + queryFn: () => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId } )); + return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/quoteRoutes/quoteRoutes.acl.ts b/test/generated/next/quoteRoutes/quoteRoutes.acl.ts new file mode 100644 index 0000000..23e12ea --- /dev/null +++ b/test/generated/next/quoteRoutes/quoteRoutes.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuoteRoutesAcl { +/** + * Use for `useListRoutes` query ability. For global ability, omit the object parameter. + * @description List quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query + */ +export const canUseListRoutes = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Create quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation + */ +export const canUseCreateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Update quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation + */ +export const canUseUpdateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Delete quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation + */ +export const canUseDeleteRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. + * @description Split quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation + */ +export const canUseSplitRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. + * @description Merge quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation + */ +export const canUseMergeRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. + * @description Copy quote route points + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation + */ +export const canUseCopyRoute = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/next/quoteRoutes/quoteRoutes.api.ts b/test/generated/next/quoteRoutes/quoteRoutes.api.ts new file mode 100644 index 0000000..ac83816 --- /dev/null +++ b/test/generated/next/quoteRoutes/quoteRoutes.api.ts @@ -0,0 +1,63 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuoteRoutesApi { +export const listRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: CommonModels.RouteListResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes`, + config + ) +}; +export const createRoutePoint = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, + ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), + config + ) +}; +export const updateRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, + ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), + config + ) +}; +export const deleteRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, + undefined, + config + ) +}; +export const splitRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/split`, + undefined, + config + ) +}; +export const mergeRoutes = (officeId: string, quoteId: string, data: CommonModels.MergeRoutesRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/merge`, + ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), + config + ) +}; +export const copyRoute = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, + ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/quoteRoutes/quoteRoutes.queries.ts b/test/generated/next/quoteRoutes/quoteRoutes.queries.ts new file mode 100644 index 0000000..e7634ea --- /dev/null +++ b/test/generated/next/quoteRoutes/quoteRoutes.queries.ts @@ -0,0 +1,213 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuoteRoutesAcl } from "./quoteRoutes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { CommonModels } from "@/data/common/common.models"; +import { QuoteRoutesApi } from "./quoteRoutes.api"; + +export namespace QuoteRoutesQueries { +export const moduleName = QueryModule.QuoteRoutes; + +export const keys = { + all: [moduleName] as const, + listRoutes: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/routes", officeId, quoteId] as const, +}; + +/** + * Query `useListRoutes` + * @summary List routes with points for a quote + * @permission Requires `canUseListRoutes` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoutes = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoutes(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId } )); + return QuoteRoutesApi.listRoutes(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateRoutePoint` + * @summary Create a route point for a quote route + * @permission Requires `canUseCreateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, data }) => { + checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId } )); + return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateRoutePoint` + * @summary Update a route point for a quote route + * @permission Requires `canUseUpdateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { + checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId } )); + return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRoutePoint` + * @summary Delete a route point from a quote route + * @permission Requires `canUseDeleteRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, pointId }) => { + checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId } )); + return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useSplitRoutes` + * @summary Split quote routes by cargo (sea only) + * @permission Requires `canUseSplitRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId }) => { + checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId } )); + return QuoteRoutesApi.splitRoutes(officeId, quoteId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMergeRoutes` + * @summary Merge quote cargo routes into single route (sea only) + * @permission Requires `canUseMergeRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId } )); + return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopyRoute` + * @summary Copy route points from one route to another (sea only) + * @permission Requires `canUseCopyRoute` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, data }) => { + checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId } )); + return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/quotes/quotes.acl.ts b/test/generated/next/quotes/quotes.acl.ts new file mode 100644 index 0000000..d7f98e9 --- /dev/null +++ b/test/generated/next/quotes/quotes.acl.ts @@ -0,0 +1,160 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace QuotesAcl { +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ +export const canUseListAvailablePartnersFor = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useExportQuotes` mutation ability. For global ability, omit the object parameter. + * @description Export quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportQuotes` mutation + */ +export const canUseExportQuotes = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Get quote by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ +export const canUseCancel = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Duplicate quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ +export const canUseDuplicate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGetInvolvedParties` query ability. For global ability, omit the object parameter. + * @description Get involved parties for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvolvedParties` query + */ +export const canUseGetInvolvedParties = ( + object?: { officeId: string, } +) => [ + "ReadInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCreateInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Create involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateInvolvedParty` mutation + */ +export const canUseCreateInvolvedParty = ( + object?: { officeId: string, } +) => [ + "CreateInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdateInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Update involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateInvolvedParty` mutation + */ +export const canUseUpdateInvolvedParty = ( + object?: { officeId: string, } +) => [ + "UpdateInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDeleteInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Delete involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvolvedParty` mutation + */ +export const canUseDeleteInvolvedParty = ( + object?: { officeId: string, } +) => [ + "DeleteInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/next/quotes/quotes.api.ts b/test/generated/next/quotes/quotes.api.ts new file mode 100644 index 0000000..0e682d4 --- /dev/null +++ b/test/generated/next/quotes/quotes.api.ts @@ -0,0 +1,123 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { QuotesModels } from "./quotes.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuotesApi { +export const paginate = (officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuotesPaginateResponseSchema }, + `/offices/${officeId}/quotes`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes`, + ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), + config + ) +}; +export const listAvailablePartnersFor = (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/available-partners`, + { + ...config, + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), + }, + } + ) +}; +export const exportQuotes = (officeId: string, data: QuotesModels.QuoteExportRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/exports`, + ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getById = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}`, + config + ) +}; +export const update = (officeId: string, quoteId: string, data: QuotesModels.UpdateQuoteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}`, + ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), + config + ) +}; +export const cancel = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cancel`, + undefined, + config + ) +}; +export const duplicate = (officeId: string, quoteId: string, data: QuotesModels.DuplicateQuoteRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/duplicate`, + ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), + config + ) +}; +export const getInvolvedParties = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties`, + config + ) +}; +export const createInvolvedParty = (officeId: string, quoteId: string, data: CommonModels.CreateInvolvedPartyRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties`, + ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), + config + ) +}; +export const updateInvolvedParty = (officeId: string, quoteId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, + ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), + config + ) +}; +export const deleteInvolvedParty = (officeId: string, quoteId: string, partyId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/quotes/quotes.configs.ts b/test/generated/next/quotes/quotes.configs.ts new file mode 100644 index 0000000..e288ac4 --- /dev/null +++ b/test/generated/next/quotes/quotes.configs.ts @@ -0,0 +1,137 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { QuotesModels } from "./quotes.models"; +import { QuotesQueries } from "./quotes.queries"; +import { QuotesAcl } from "./quotes.acl"; + +export namespace QuotesConfigs { +export const quotesConfig = { + meta: { + title: "Quotes", + }, + readAll: { + acl: QuotesAcl.canUsePaginate, + schema: QuotesModels.QuotePreviewResponseDTOSchema, + paginated: QuotesQueries.usePaginate, + infinite: QuotesQueries.usePaginateInfinite, + filters: { + schema: QuotesModels.QuoteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: QuotesModels.QuoteFilterDtoSchema, + options: { + inputs: { + statusDate: true, + transportMode: true, + status: true, + direction: true, + loadType: true, + serviceType: true, + carrierId: true, + consigneeId: true, + employee: true, + routing: true, + number: true, + createdAt: true, + vesselCarrier: true, + searchQuery: true, + customer: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: QuotesModels.QuotePreviewResponseDTOSchema, + options: { + columns: { + id: true, + transportMode: true, + statusDate: true, + createdAt: true, + number: true, + status: true, + direction: true, + loadType: true, + customer: true, + customerReference: true, + consignee: true, + consigneeReference: true, + carrier: true, + carrierReference: true, + employee: true, + origin: true, + destination: true, + portOfLoading: true, + dischargePort: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + equipment: true, + serviceType: true, + currency: true, + profit: true, + margin: true, + numberOfConvertedPositions: true, + departureDate: true, + arrivalDate: true, + routing: true, + }, + sortable: QuotesModels.QuotesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: QuotesAcl.canUseGetById, + schema: QuotesModels.QuoteCoreResponseDTOSchema, + query: QuotesQueries.useGetById, + }, + create: { + acl: QuotesAcl.canUseCreate, + schema: QuotesModels.CreateQuoteRequestDTOSchema, + mutation: QuotesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: QuotesModels.CreateQuoteRequestDTOSchema, + options: { + inputs: { + section: true, + direction: true, + transportMode: true, + loadType: true, + serviceType: true, + customerBusinessPartnerId: true, + }, + }, +}) + }, + update: { + acl: QuotesAcl.canUseUpdate, + schema: QuotesModels.UpdateQuoteRequestDTOSchema, + mutation: QuotesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: QuotesModels.UpdateQuoteRequestDTOSchema, + options: { + inputs: { + number: true, + statusDate: true, + cargoType: true, + loadType: true, + incoterms: true, + secondIncoterms: true, + serviceType: true, + buyRateReference: true, + frequency: true, + transitDurationInDays: true, + quoteType: true, + defaultCurrencyId: true, + salesRepId: true, + responsibleEmployeeId: true, + receivedByEmployeeId: true, + team: true, + volumetricWeightModifier: true, + }, + }, +}) + }, +}; + +} diff --git a/test/generated/next/quotes/quotes.models.ts b/test/generated/next/quotes/quotes.models.ts new file mode 100644 index 0000000..77132f4 --- /dev/null +++ b/test/generated/next/quotes/quotes.models.ts @@ -0,0 +1,322 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace QuotesModels { +/** + * QuoteStatusEnumSchema + * @type { enum } + */ +export const QuoteStatusEnumSchema = z.enum(["Pending", "Cancelled", "Converted"]); +export type QuoteStatusEnum = z.infer; +export const QuoteStatusEnum = QuoteStatusEnumSchema.enum; + +/** + * QuoteCustomerResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { string } phone The phone number of the customer + * @property { string } email The email of the customer + */ +export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().describe("The phone number of the customer").nullish(), email: z.string().describe("The email of the customer").nullish() }).readonly(); +export type QuoteCustomerResponseDto = z.infer; + +/** + * QuoteNamedReferenceResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the entity + * @property { string } name Name of the entity + * @property { string } matchCode + * @property { string } label Display label (name or match code depending on office settings) + */ +export const QuoteNamedReferenceResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the entity").nullable(), name: z.string().describe("Name of the entity").nullable(), matchCode: z.string().nullable(), label: z.string().describe("Display label (name or match code depending on office settings)").nullable() }).readonly(); +export type QuoteNamedReferenceResponseDto = z.infer; + +/** + * QuotePreviewResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the quote + * @property { CommonModels.TransportModeEnum } transportMode Transport mode + * @property { string } statusDate The date of the quote status + * @property { string } createdAt The date when the quote was created + * @property { string } number The quote number + * @property { QuoteStatusEnum } status Status of the quote + * @property { CommonModels.DirectionEnum } direction Direction of the quote + * @property { CommonModels.LoadTypeEnum } loadType Load type + * @property { QuoteCustomerResponseDto } customer The customer information + * @property { string } customerReference Customer reference number + * @property { QuoteNamedReferenceResponseDto } consignee Consignee information + * @property { string } consigneeReference Consignee reference number + * @property { QuoteNamedReferenceResponseDto } carrier The carrier + * @property { string } carrierReference Carrier reference number + * @property { QuoteNamedReferenceResponseDto } employee Responsible employee + * @property { QuoteNamedReferenceResponseDto } origin Origin location + * @property { QuoteNamedReferenceResponseDto } destination Destination location + * @property { QuoteNamedReferenceResponseDto } portOfLoading Port of loading + * @property { QuoteNamedReferenceResponseDto } dischargePort Discharge port + * @property { string } bookingNumber Booking reference number + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } vesselCarrier Carrier name from route point (sea positions only) + * @property { string } equipment Equipment summary (e.g., "2x20DC, 1x40HC") + * @property { CommonModels.ServiceTypeEnum } serviceType Service type + * @property { string } currency Currency code + * @property { number } profit Total profit + * @property { number } margin Profit margin percentage + * @property { number } numberOfConvertedPositions Number of positions converted from this quote + * @property { string } departureDate Departure date + * @property { string } arrivalDate Arrival date + * @property { CommonModels.SeaRoutingEnum } routing Sea routing type + */ +export const QuotePreviewResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status").nullable(), createdAt: z.iso.datetime({ offset: true }).describe("The date when the quote was created"), number: z.string().describe("The quote number"), status: QuoteStatusEnumSchema.describe("Status of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type").nullish(), customer: QuoteCustomerResponseDtoSchema.describe("The customer information"), customerReference: z.string().describe("Customer reference number").nullish(), consignee: QuoteNamedReferenceResponseDtoSchema.describe("Consignee information").nullish(), consigneeReference: z.string().describe("Consignee reference number").nullish(), carrier: QuoteNamedReferenceResponseDtoSchema.describe("The carrier").nullish(), carrierReference: z.string().describe("Carrier reference number").nullish(), employee: QuoteNamedReferenceResponseDtoSchema.describe("Responsible employee").nullish(), origin: QuoteNamedReferenceResponseDtoSchema.describe("Origin location"), destination: QuoteNamedReferenceResponseDtoSchema.describe("Destination location"), portOfLoading: QuoteNamedReferenceResponseDtoSchema.describe("Port of loading").nullish(), dischargePort: QuoteNamedReferenceResponseDtoSchema.describe("Discharge port").nullish(), bookingNumber: z.string().describe("Booking reference number").nullish(), vessel: z.string().describe("Vessel name").nullish(), voyage: z.string().describe("Voyage number").nullish(), vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), equipment: z.string().describe("Equipment summary (e.g., \"2x20DC, 1x40HC\")").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.describe("Service type").nullish(), currency: z.string().describe("Currency code").nullish(), profit: z.number().describe("Total profit").nullish(), margin: z.number().describe("Profit margin percentage").nullish(), numberOfConvertedPositions: z.number().describe("Number of positions converted from this quote"), departureDate: z.iso.datetime({ offset: true }).describe("Departure date").nullish(), arrivalDate: z.iso.datetime({ offset: true }).describe("Arrival date").nullish(), routing: CommonModels.SeaRoutingEnumSchema.describe("Sea routing type").nullish() }).readonly(); +export type QuotePreviewResponseDTO = z.infer; + +/** + * QuoteFilterDtoSchema + * @type { object } + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.TransportModeEnum } transportMode + * @property { QuoteStatusEnum[] } status + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } carrierId Filter quotes by carrier IDs + * @property { string[] } consigneeId Filter quotes by consignee IDs + * @property { string[] } employee Filter quotes by employee IDs + * @property { CommonModels.SeaRoutingEnum } routing + * @property { string } number Filter quotes by quote number + * @property { CommonModels.DateRangeDto } createdAt + * @property { string } vesselCarrier Filter quotes by carrier name from route point + * @property { string } searchQuery + * @property { string[] } customer + */ +export const QuoteFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, carrierId: z.array(z.string()).readonly().describe("Filter quotes by carrier IDs"), consigneeId: z.array(z.string()).readonly().describe("Filter quotes by consignee IDs"), employee: z.array(z.string()).readonly().describe("Filter quotes by employee IDs"), routing: CommonModels.SeaRoutingEnumSchema, number: z.string().describe("Filter quotes by quote number"), createdAt: CommonModels.DateRangeDtoSchema, vesselCarrier: z.string().describe("Filter quotes by carrier name from route point"), searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); +export type QuoteFilterDto = z.infer; + +/** + * QuoteExportFilterDtoSchema + * @type { object } + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.TransportModeEnum } transportMode + * @property { QuoteStatusEnum[] } status + * @property { CommonModels.DirectionEnum } direction + * @property { string } searchQuery + * @property { string[] } customer + */ +export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); +export type QuoteExportFilterDto = z.infer; + +/** + * QuoteExportColumnSchema + * @type { enum } + */ +export const QuoteExportColumnSchema = z.enum(["id", "transportMode", "statusDate", "createdAt", "number", "status", "direction", "loadType", "serviceType", "customerId", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeId", "consigneeName", "consigneeReference", "carrierId", "carrierName", "carrierReference", "responsibleEmployeeName", "originLocationId", "originLocationName", "destinationLocationId", "destinationLocationName", "portOfLoadingId", "portOfLoadingName", "dischargePortId", "dischargePortName", "bookingNumber", "vessel", "voyage", "equipment", "departureDate", "arrivalDate", "routing", "currency", "profit", "margin"]); +export type QuoteExportColumn = z.infer; +export const QuoteExportColumn = QuoteExportColumnSchema.enum; + +/** + * QuoteExportRequestDtoSchema + * @type { object } + * @property { QuoteExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { QuoteExportFilterDto } filter + */ +export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: QuoteExportFilterDtoSchema }).readonly(); +export type QuoteExportRequestDto = z.infer; + +/** + * CreateQuoteRequestDTOSchema + * @type { object } + * @property { CommonModels.SectionEnum } section The section of the quote + * @property { CommonModels.DirectionEnum } direction The direction of the quote + * @property { CommonModels.TransportModeEnum } transportMode The mode of transport for the quote + * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote + * @property { CommonModels.ServiceTypeEnum } serviceType The service type for the quote + * @property { string } customerBusinessPartnerId The ID of the business partner that is the customer + */ +export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema.describe("The section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("The direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("The mode of transport for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The service type for the quote"), customerBusinessPartnerId: z.string().describe("The ID of the business partner that is the customer") }).readonly(); +export type CreateQuoteRequestDTO = z.infer; + +/** + * QuoteCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type QuoteCustomerDto = z.infer; + +/** + * QuoteEmployeeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the employee + * @property { string } name Name of the employee + */ +export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the employee"), name: z.string().describe("Name of the employee") }).readonly(); +export type QuoteEmployeeResponseDTO = z.infer; + +/** + * CargoTypeEnumSchema + * @type { enum } + */ +export const CargoTypeEnumSchema = z.enum(["Trailer", "Container", "BreakBulk", "Roro", "Project"]); +export type CargoTypeEnum = z.infer; +export const CargoTypeEnum = CargoTypeEnumSchema.enum; + +/** + * QuoteTypeEnumSchema + * @type { enum } + */ +export const QuoteTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); +export type QuoteTypeEnum = z.infer; +export const QuoteTypeEnum = QuoteTypeEnumSchema.enum; + +/** + * QuoteConvertedPositionDtoSchema + * @type { object } + * @property { string } positionId + * @property { string } positionNumber + */ +export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }).readonly(); +export type QuoteConvertedPositionDto = z.infer; + +/** + * QuoteCoreResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the quote + * @property { string } rootFolderId Root folder identifier bound to this quote + * @property { QuoteCustomerDto } customer + * @property { QuoteStatusEnum } status Current status of the quote + * @property { string } responsibleEmployeeId Unique identifier of the responsible employee + * @property { string } receivedByEmployeeId Unique identifier of the employee receiving the quote + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } salesRepId Unique identifier of the sales rep + * @property { QuoteEmployeeResponseDTO } responsibleEmployee The responsible employee + * @property { QuoteEmployeeResponseDTO } receivedByEmployee The employee who received the quote + * @property { string } owningOfficeId ID of the office owning the quote + * @property { string } name Name of the quote + * @property { string } number Quote number + * @property { CommonModels.SectionEnum } section Section of the quote + * @property { CommonModels.DirectionEnum } direction Direction of the quote + * @property { CommonModels.TransportModeEnum } transportMode Mode of transport + * @property { string } statusDate Date of the quote status + * @property { CargoTypeEnum } cargoType Type of cargo + * @property { CommonModels.IncotermsEnum } incoterms Incoterms for the quote + * @property { CommonModels.IncotermsEnum } secondIncoterms Second incoterms for the quote + * @property { string } buyRateReference Reference for buy rate + * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote + * @property { string } transitDurationInDays Transit duration in days + * @property { QuoteTypeEnum } quoteType Type of quote + * @property { string } defaultCurrencyId Default currency + * @property { QuoteEmployeeResponseDTO } salesRep The sales rep for the quote + * @property { string } team Team + * @property { string } createdAt + * @property { string } updatedAt + * @property { QuoteConvertedPositionDto[] } convertedPositions Positions converted from this quote. Default: `` + * @property { CommonModels.LoadTypeEnum } loadType Load type of quote + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const QuoteCoreResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), rootFolderId: z.string().describe("Root folder identifier bound to this quote").nullish(), customer: QuoteCustomerDtoSchema.nullish(), status: QuoteStatusEnumSchema.describe("Current status of the quote"), responsibleEmployeeId: z.string().describe("Unique identifier of the responsible employee").nullish(), receivedByEmployeeId: z.string().describe("Unique identifier of the employee receiving the quote").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesRepId: z.string().describe("Unique identifier of the sales rep").nullish(), responsibleEmployee: QuoteEmployeeResponseDTOSchema.describe("The responsible employee").nullish(), receivedByEmployee: QuoteEmployeeResponseDTOSchema.describe("The employee who received the quote").nullish(), owningOfficeId: z.string().describe("ID of the office owning the quote"), name: z.string().describe("Name of the quote"), number: z.string().describe("Quote number"), section: CommonModels.SectionEnumSchema.describe("Section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), statusDate: z.iso.datetime({ offset: true }).describe("Date of the quote status"), cargoType: CargoTypeEnumSchema.describe("Type of cargo").nullish(), incoterms: CommonModels.IncotermsEnumSchema.describe("Incoterms for the quote").nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("Second incoterms for the quote").nullish(), buyRateReference: z.string().describe("Reference for buy rate").nullish(), frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), transitDurationInDays: z.string().describe("Transit duration in days").nullish(), quoteType: QuoteTypeEnumSchema.describe("Type of quote").nullish(), defaultCurrencyId: z.string().describe("Default currency").nullish(), salesRep: QuoteEmployeeResponseDTOSchema.describe("The sales rep for the quote").nullish(), team: z.string().describe("Team").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), convertedPositions: z.array(QuoteConvertedPositionDtoSchema).readonly().describe("Positions converted from this quote").default([]), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type of quote").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); +export type QuoteCoreResponseDTO = z.infer; + +/** + * UpdateQuoteRequestDTOSchema + * @type { object } + * @property { string } number The quote number + * @property { string } statusDate The date of the quote status + * @property { CargoTypeEnum } cargoType The type of cargo for the quote + * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote + * @property { CommonModels.IncotermsEnum } incoterms The incoterms for the quote + * @property { CommonModels.IncotermsEnum } secondIncoterms The second incoterms for the quote + * @property { CommonModels.ServiceTypeEnum } serviceType The type of service for the quote + * @property { string } buyRateReference The reference for the buy rate + * @property { CommonModels.FrequencyEnum } frequency The frequency of the quote + * @property { string } transitDurationInDays The transit duration in days + * @property { QuoteTypeEnum } quoteType The type of quote + * @property { string } defaultCurrencyId The default currency for the quote + * @property { string } salesRepId The sales representative for the quote + * @property { string } responsibleEmployeeId The responsible employee for the quote + * @property { string } receivedByEmployeeId The employee who receieved the quote + * @property { string } team The team responsible for the quote + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().describe("The quote number"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status"), cargoType: CargoTypeEnumSchema.describe("The type of cargo for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), incoterms: CommonModels.IncotermsEnumSchema.describe("The incoterms for the quote"), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("The second incoterms for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The type of service for the quote"), buyRateReference: z.string().describe("The reference for the buy rate"), frequency: CommonModels.FrequencyEnumSchema.describe("The frequency of the quote"), transitDurationInDays: z.string().describe("The transit duration in days").nullable(), quoteType: QuoteTypeEnumSchema.describe("The type of quote"), defaultCurrencyId: z.string().describe("The default currency for the quote"), salesRepId: z.string().describe("The sales representative for the quote"), responsibleEmployeeId: z.string().describe("The responsible employee for the quote"), receivedByEmployeeId: z.string().describe("The employee who receieved the quote"), team: z.string().describe("The team responsible for the quote"), volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); +export type UpdateQuoteRequestDTO = z.infer; + +/** + * QuoteSectionEnumSchema + * @type { enum } + */ +export const QuoteSectionEnumSchema = z.enum(["Customer", "Overview", "Cargo", "Finances", "Documents"]); +export type QuoteSectionEnum = z.infer; +export const QuoteSectionEnum = QuoteSectionEnumSchema.enum; + +/** + * DuplicateQuoteRequestDtoSchema + * @type { object } + * @property { QuoteSectionEnum[] } sections The sections to duplicate. Min Items: `1` + */ +export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).readonly().min(1).describe("The sections to duplicate") }).readonly(); +export type DuplicateQuoteRequestDto = z.infer; + +/** + * QuoteListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalProfit + * @property { number } profitPerQuote + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const QuoteListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalProfit: z.number(), profitPerQuote: z.number(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export type QuoteListResponseDto = z.infer; + +/** + * QuotesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const QuotesPaginateOrderParamEnumSchema = z.enum(["number", "statusDate", "transportMode", "status", "direction", "loadType", "serviceType", "createdAt", "employee", "profit"]); +export type QuotesPaginateOrderParamEnum = z.infer; +export const QuotesPaginateOrderParamEnum = QuotesPaginateOrderParamEnumSchema.enum; + +/** + * QuotesPaginateResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerQuote + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { QuotePreviewResponseDTO[] } items + */ +export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).readonly() }).readonly().shape }); +export type QuotesPaginateResponse = z.infer; + +/** + * QuotesListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ +export const QuotesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type QuotesListAvailablePartnersForResponse = z.infer; + +/** + * GetInvolvedPartiesResponseSchema + * @type { array } + */ +export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); +export type GetInvolvedPartiesResponse = z.infer; + +} diff --git a/test/generated/next/quotes/quotes.queries.ts b/test/generated/next/quotes/quotes.queries.ts new file mode 100644 index 0000000..8d2f75e --- /dev/null +++ b/test/generated/next/quotes/quotes.queries.ts @@ -0,0 +1,377 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { QuotesAcl } from "./quotes.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { QuotesModels } from "./quotes.models"; +import { CommonModels } from "@/data/common/common.models"; +import { QuotesApi } from "./quotes.api"; + +export namespace QuotesQueries { +export const moduleName = QueryModule.Quotes; + +export const keys = { + all: [moduleName] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", "infinite", officeId, limit, order, filter, cursor] as const, + listAvailablePartnersFor: (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/quotes/:quoteId/available-partners", officeId, quoteId, search, useCase] as const, + getById: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId", officeId, quoteId] as const, + getInvolvedParties: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/involved-parties", officeId, quoteId] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate Quotes + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` + * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(QuotesAcl.canUsePaginate({ officeId } )); + return QuotesApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Quotes + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` + * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuotesAcl.canUsePaginate({ officeId } )); + return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Quote + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { QuotesModels.CreateQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(QuotesAcl.canUseCreate({ officeId } )); + return QuotesApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for a quote + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListAvailablePartnersFor = ({ officeId, quoteId, search, useCase }: { officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), + queryFn: () => { + checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId } )); + return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase, config) }, + ...options, + }); +}; + +/** + * Mutation `useExportQuotes` - recommended when file should not be cached + * @summary Export quotes to Excel + * @permission Requires `canUseExportQuotes` ability + * @param { string } mutation.officeId Path parameter + * @param { QuotesModels.QuoteExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportQuotes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(QuotesAcl.canUseExportQuotes({ officeId } )); + return QuotesApi.exportQuotes(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetById` + * @summary Get quote by id + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, quoteId), + queryFn: () => { + checkAcl(QuotesAcl.canUseGetById({ officeId } )); + return QuotesApi.getById(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuotesModels.UpdateQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseUpdate({ officeId } )); + return QuotesApi.update(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCancel` + * @summary Cancel quote + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId }) => { + checkAcl(QuotesAcl.canUseCancel({ officeId } )); + return QuotesApi.cancel(officeId, quoteId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicate` + * @summary Duplicate quote + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuotesModels.DuplicateQuoteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseDuplicate({ officeId } )); + return QuotesApi.duplicate(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetInvolvedParties` + * @summary Get involved parties for quote + * @permission Requires `canUseGetInvolvedParties` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetInvolvedParties = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvolvedParties(officeId, quoteId), + queryFn: () => { + checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId } )); + return QuotesApi.getInvolvedParties(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useCreateInvolvedParty` + * @summary Create involved party for quote + * @permission Requires `canUseCreateInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId } )); + return QuotesApi.createInvolvedParty(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateInvolvedParty` + * @summary Update involved party for quote + * @permission Requires `canUseUpdateInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, partyId, data }) => { + checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId } )); + return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteInvolvedParty` + * @summary Delete involved party for quote + * @permission Requires `canUseDeleteInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, partyId }) => { + checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId } )); + return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/remarkTemplates/remarkTemplates.acl.ts b/test/generated/next/remarkTemplates/remarkTemplates.acl.ts new file mode 100644 index 0000000..b194325 --- /dev/null +++ b/test/generated/next/remarkTemplates/remarkTemplates.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace RemarkTemplatesAcl { +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List remark template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List remark templates + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Create", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get remark template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update remark template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Update", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Archive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Unarchive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +} diff --git a/test/generated/next/remarkTemplates/remarkTemplates.api.ts b/test/generated/next/remarkTemplates/remarkTemplates.api.ts new file mode 100644 index 0000000..c4f8e86 --- /dev/null +++ b/test/generated/next/remarkTemplates/remarkTemplates.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; + +export namespace RemarkTemplatesApi { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/remark-templates/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, + `/offices/${officeId}/remark-templates`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates`, + ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}`, + config + ) +}; +export const update = (id: string, officeId: string, data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}`, + ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/remarkTemplates/remarkTemplates.configs.ts b/test/generated/next/remarkTemplates/remarkTemplates.configs.ts new file mode 100644 index 0000000..616b1f4 --- /dev/null +++ b/test/generated/next/remarkTemplates/remarkTemplates.configs.ts @@ -0,0 +1,123 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; +import { RemarkTemplatesQueries } from "./remarkTemplates.queries"; +import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; + +export namespace RemarkTemplatesConfigs { +export const remarkTemplatesConfig = { + meta: { + title: "Remark Templates", + }, + readAll: { + acl: RemarkTemplatesAcl.canUseList, + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + paginated: RemarkTemplatesQueries.useList, + infinite: RemarkTemplatesQueries.useListInfinite, + filters: { + schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + onlyUsedFor: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + content: true, + onlyUsedFor: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: RemarkTemplatesAcl.canUseFindById, + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + query: RemarkTemplatesQueries.useFindById, + }, + create: { + acl: RemarkTemplatesAcl.canUseCreate, + schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, + mutation: RemarkTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + content: true, + onlyUsedFor: true, + }, + }, +}) + }, + update: { + acl: RemarkTemplatesAcl.canUseUpdate, + schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, + mutation: RemarkTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + content: true, + onlyUsedFor: true, + archived: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: RemarkTemplatesAcl.canUsePaginateLabels, + schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, + paginated: RemarkTemplatesQueries.usePaginateLabels, + infinite: RemarkTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + content: true, + }, + sortable: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/remarkTemplates/remarkTemplates.models.ts b/test/generated/next/remarkTemplates/remarkTemplates.models.ts new file mode 100644 index 0000000..10f5d41 --- /dev/null +++ b/test/generated/next/remarkTemplates/remarkTemplates.models.ts @@ -0,0 +1,132 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace RemarkTemplatesModels { +/** + * RemarkTemplateLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { CommonModels.EditorContentResponseDto } content Remark template content + */ +export const RemarkTemplateLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), content: CommonModels.EditorContentResponseDtoSchema.describe("Remark template content") }).readonly(); +export type RemarkTemplateLabelResponseDTO = z.infer; + +/** + * RemarkTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const RemarkTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type RemarkTemplateEmployeeDTO = z.infer; + +/** + * OnlyUsedForEnumSchema + * @type { enum } + */ +export const OnlyUsedForEnumSchema = z.enum(["transport-order", "export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "invoice", "quote-document", "shipping-instructions", "position-office-notes", "invoice-body-remarks", "business-partner-office-notes"]); +export type OnlyUsedForEnum = z.infer; +export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; + +/** + * RemarkTemplateResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name Template name + * @property { CommonModels.EditorContentResponseDto } content Template content + * @property { string[] } onlyUsedFor Restrict template usage to specific document types + * @property { boolean } archived + * @property { string } createdById + * @property { RemarkTemplateEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { RemarkTemplateEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const RemarkTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string().describe("Template name"), content: CommonModels.EditorContentResponseDtoSchema.describe("Template content"), onlyUsedFor: z.array(OnlyUsedForEnumSchema).readonly().describe("Restrict template usage to specific document types").nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type RemarkTemplateResponseDTO = z.infer; + +/** + * CreateRemarkTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { CommonModels.EditorContentUpdateDto } content Template content + * @property { OnlyUsedForEnum[] } onlyUsedFor Restrict template usage to specific document types + */ +export const CreateRemarkTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), onlyUsedFor: z.array(OnlyUsedForEnumSchema).readonly().describe("Restrict template usage to specific document types").nullish() }).readonly(); +export type CreateRemarkTemplateRequestDTO = z.infer; + +/** + * UpdateRemarkTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { CommonModels.EditorContentUpdateDto } content Template content + * @property { string[] } onlyUsedFor Restrict template usage to specific document types + * @property { boolean } archived Archive status + */ +export const UpdateRemarkTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), onlyUsedFor: z.array(OnlyUsedForEnumSchema).readonly().describe("Restrict template usage to specific document types"), archived: z.boolean().describe("Archive status") }).readonly(); +export type UpdateRemarkTemplateRequestDTO = z.infer; + +/** + * RemarkTemplateFilterDtoSchema + * @type { object } + * @property { boolean } archived + * @property { string } search + * @property { string } onlyUsedFor Filter by document type + */ +export const RemarkTemplateFilterDtoSchema = z.object({ archived: z.boolean(), search: z.string(), onlyUsedFor: OnlyUsedForEnumSchema.describe("Filter by document type") }).readonly(); +export type RemarkTemplateFilterDto = z.infer; + +/** + * RemarkTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const RemarkTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type RemarkTemplateLabelFilterDto = z.infer; + +/** + * RemarkTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const RemarkTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type RemarkTemplatesPaginateLabelsOrderParamEnum = z.infer; +export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * RemarkTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { RemarkTemplateLabelResponseDTO[] } items + */ +export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).readonly() }).readonly().shape }); +export type RemarkTemplatesPaginateLabelsResponse = z.infer; + +/** + * RemarkTemplatesListOrderParamEnumSchema + * @type { enum } + */ +export const RemarkTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type RemarkTemplatesListOrderParamEnum = z.infer; +export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEnumSchema.enum; + +/** + * RemarkTemplatesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { RemarkTemplateResponseDTO[] } items + */ +export const RemarkTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).readonly() }).readonly().shape }); +export type RemarkTemplatesListResponse = z.infer; + +} diff --git a/test/generated/next/remarkTemplates/remarkTemplates.queries.ts b/test/generated/next/remarkTemplates/remarkTemplates.queries.ts new file mode 100644 index 0000000..52f9b4a --- /dev/null +++ b/test/generated/next/remarkTemplates/remarkTemplates.queries.ts @@ -0,0 +1,274 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { RemarkTemplatesModels } from "./remarkTemplates.models"; +import { RemarkTemplatesApi } from "./remarkTemplates.api"; + +export namespace RemarkTemplatesQueries { +export const moduleName = QueryModule.RemarkTemplates; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/remark-templates/:id", id, officeId] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate remark template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate remark template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useList` + * @summary List remark templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); + return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List remark templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); + return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new remark template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId } )); + return RemarkTemplatesApi.create(officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get remark template by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId } )); + return RemarkTemplatesApi.findById(id, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update remark template by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId } )); + return RemarkTemplatesApi.update(id, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive remark template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId } )); + return RemarkTemplatesApi.archive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive remark template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId } )); + return RemarkTemplatesApi.unarchive(id, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/roadQuotes/roadQuotes.acl.ts b/test/generated/next/roadQuotes/roadQuotes.acl.ts new file mode 100644 index 0000000..edf7693 --- /dev/null +++ b/test/generated/next/roadQuotes/roadQuotes.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace RoadQuotesAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get road quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update road quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/next/roadQuotes/roadQuotes.api.ts b/test/generated/next/roadQuotes/roadQuotes.api.ts new file mode 100644 index 0000000..eb644c0 --- /dev/null +++ b/test/generated/next/roadQuotes/roadQuotes.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { RoadQuotesModels } from "./roadQuotes.models"; + +export namespace RoadQuotesApi { +export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/road-quote`, + config + ) +}; +export const update = (officeId: string, quoteId: string, data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/road-quote`, + ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/roadQuotes/roadQuotes.models.ts b/test/generated/next/roadQuotes/roadQuotes.models.ts new file mode 100644 index 0000000..e5ae99e --- /dev/null +++ b/test/generated/next/roadQuotes/roadQuotes.models.ts @@ -0,0 +1,29 @@ +import { z } from "zod"; + +export namespace RoadQuotesModels { +/** + * RoadQuoteResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the road quote + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + */ +export const RoadQuoteResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the road quote"), bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling") }).readonly(); +export type RoadQuoteResponseDTO = z.infer; + +/** + * UpdateRoadQuoteRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + */ +export const UpdateRoadQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling") }).readonly(); +export type UpdateRoadQuoteRequestDTO = z.infer; + +} diff --git a/test/generated/next/roadQuotes/roadQuotes.queries.ts b/test/generated/next/roadQuotes/roadQuotes.queries.ts new file mode 100644 index 0000000..2740233 --- /dev/null +++ b/test/generated/next/roadQuotes/roadQuotes.queries.ts @@ -0,0 +1,71 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { RoadQuotesAcl } from "./roadQuotes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { RoadQuotesModels } from "./roadQuotes.models"; +import { RoadQuotesApi } from "./roadQuotes.api"; + +export namespace RoadQuotesQueries { +export const moduleName = QueryModule.RoadQuotes; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/road-quote", officeId, quoteId] as const, +}; + +/** + * Query `useGet` + * @summary Get road quote by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(RoadQuotesAcl.canUseGet({ officeId } )); + return RoadQuotesApi.get(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update road quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { RoadQuotesModels.UpdateRoadQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(RoadQuotesAcl.canUseUpdate({ officeId } )); + return RoadQuotesApi.update(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.get(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/seaPositions/seaPositions.acl.ts b/test/generated/next/seaPositions/seaPositions.acl.ts new file mode 100644 index 0000000..1040161 --- /dev/null +++ b/test/generated/next/seaPositions/seaPositions.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace SeaPositionsAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get sea position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update sea position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +} diff --git a/test/generated/next/seaPositions/seaPositions.api.ts b/test/generated/next/seaPositions/seaPositions.api.ts new file mode 100644 index 0000000..c617cd0 --- /dev/null +++ b/test/generated/next/seaPositions/seaPositions.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { SeaPositionsModels } from "./seaPositions.models"; + +export namespace SeaPositionsApi { +export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/sea-position`, + config + ) +}; +export const update = (officeId: string, positionId: string, data: SeaPositionsModels.UpdateSeaPositionRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/sea-position`, + ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/seaPositions/seaPositions.models.ts b/test/generated/next/seaPositions/seaPositions.models.ts new file mode 100644 index 0000000..80dd1d9 --- /dev/null +++ b/test/generated/next/seaPositions/seaPositions.models.ts @@ -0,0 +1,49 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace SeaPositionsModels { +/** + * SeaPositionResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } bookingMatchingCode + * @property { string } houseBillOfLadingNumber + * @property { string } masterBillOfLadingNumber + * @property { boolean } hblRequired + * @property { boolean } mblRequired + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { string } buyServiceContract + * @property { string } sellServiceContract + * @property { string } quoteReference + * @property { string } createdAt + * @property { string } updatedAt + * @property { CommonModels.SeaRoutingEnum } routing + * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route + */ +export const SeaPositionResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterBillOfLadingNumber: z.string().nullish(), hblRequired: z.boolean(), mblRequired: z.boolean(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), buyServiceContract: z.string().nullish(), sellServiceContract: z.string().nullish(), quoteReference: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), routing: CommonModels.SeaRoutingEnumSchema.nullish(), defaultBookingNumber: z.string().describe("Default booking number from the port of loading point of the default route").nullish() }).readonly(); +export type SeaPositionResponseDTO = z.infer; + +/** + * UpdateSeaPositionRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode + * @property { string } houseBillOfLadingNumber + * @property { boolean } mblRequired + * @property { boolean } hblRequired + * @property { string } masterBillOfLadingNumber + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { string } buyServiceContract + * @property { string } quoteReference + * @property { string } sellServiceContract + * @property { CommonModels.SeaRoutingEnum } routing + */ +export const UpdateSeaPositionRequestDTOSchema = z.object({ bookingMatchingCode: z.string(), houseBillOfLadingNumber: z.string(), mblRequired: z.boolean(), hblRequired: z.boolean(), masterBillOfLadingNumber: z.string(), blfromCostumerDate: z.iso.datetime({ offset: true }), blfromCarrierDate: z.iso.datetime({ offset: true }), customsDate: z.iso.datetime({ offset: true }), vgmCustomerDate: z.iso.datetime({ offset: true }), buyServiceContract: z.string(), quoteReference: z.string(), sellServiceContract: z.string(), routing: CommonModels.SeaRoutingEnumSchema }).readonly(); +export type UpdateSeaPositionRequestDTO = z.infer; + +} diff --git a/test/generated/next/seaPositions/seaPositions.queries.ts b/test/generated/next/seaPositions/seaPositions.queries.ts new file mode 100644 index 0000000..97e123e --- /dev/null +++ b/test/generated/next/seaPositions/seaPositions.queries.ts @@ -0,0 +1,71 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { SeaPositionsAcl } from "./seaPositions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { SeaPositionsModels } from "./seaPositions.models"; +import { SeaPositionsApi } from "./seaPositions.api"; + +export namespace SeaPositionsQueries { +export const moduleName = QueryModule.SeaPositions; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/sea-position", officeId, positionId] as const, +}; + +/** + * Query `useGet` + * @summary Get sea position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(SeaPositionsAcl.canUseGet({ officeId } )); + return SeaPositionsApi.get(officeId, positionId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update sea position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { SeaPositionsModels.UpdateSeaPositionRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(SeaPositionsAcl.canUseUpdate({ officeId } )); + return SeaPositionsApi.update(officeId, positionId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/seaQuotes/seaQuotes.acl.ts b/test/generated/next/seaQuotes/seaQuotes.acl.ts new file mode 100644 index 0000000..ca36ff7 --- /dev/null +++ b/test/generated/next/seaQuotes/seaQuotes.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace SeaQuotesAcl { +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get sea quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update sea quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +} diff --git a/test/generated/next/seaQuotes/seaQuotes.api.ts b/test/generated/next/seaQuotes/seaQuotes.api.ts new file mode 100644 index 0000000..f3ee817 --- /dev/null +++ b/test/generated/next/seaQuotes/seaQuotes.api.ts @@ -0,0 +1,22 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { ZodExtended } from "@/data/zod.extended"; +import { SeaQuotesModels } from "./seaQuotes.models"; + +export namespace SeaQuotesApi { +export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/sea-quote`, + config + ) +}; +export const update = (officeId: string, quoteId: string, data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/sea-quote`, + ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), + config + ) +}; +} diff --git a/test/generated/next/seaQuotes/seaQuotes.models.ts b/test/generated/next/seaQuotes/seaQuotes.models.ts new file mode 100644 index 0000000..f03b400 --- /dev/null +++ b/test/generated/next/seaQuotes/seaQuotes.models.ts @@ -0,0 +1,33 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace SeaQuotesModels { +/** + * SeaQuoteResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the sea quote + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + * @property { CommonModels.SeaRoutingEnum } routing + * @property { boolean } splitRoute Indicates if the route is split + */ +export const SeaQuoteResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the sea quote"), bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling"), routing: CommonModels.SeaRoutingEnumSchema.nullish(), splitRoute: z.boolean().describe("Indicates if the route is split").nullish() }).readonly(); +export type SeaQuoteResponseDTO = z.infer; + +/** + * UpdateSeaQuoteRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + * @property { CommonModels.SeaRoutingEnum } routing + */ +export const UpdateSeaQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling"), routing: CommonModels.SeaRoutingEnumSchema }).readonly(); +export type UpdateSeaQuoteRequestDTO = z.infer; + +} diff --git a/test/generated/next/seaQuotes/seaQuotes.queries.ts b/test/generated/next/seaQuotes/seaQuotes.queries.ts new file mode 100644 index 0000000..5949292 --- /dev/null +++ b/test/generated/next/seaQuotes/seaQuotes.queries.ts @@ -0,0 +1,71 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { SeaQuotesAcl } from "./seaQuotes.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { SeaQuotesModels } from "./seaQuotes.models"; +import { SeaQuotesApi } from "./seaQuotes.api"; + +export namespace SeaQuotesQueries { +export const moduleName = QueryModule.SeaQuotes; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/sea-quote", officeId, quoteId] as const, +}; + +/** + * Query `useGet` + * @summary Get sea quote by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(SeaQuotesAcl.canUseGet({ officeId } )); + return SeaQuotesApi.get(officeId, quoteId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update sea quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { SeaQuotesModels.UpdateSeaQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(SeaQuotesAcl.canUseUpdate({ officeId } )); + return SeaQuotesApi.update(officeId, quoteId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.get(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/shippingInstructions/shippingInstructions.acl.ts b/test/generated/next/shippingInstructions/shippingInstructions.acl.ts new file mode 100644 index 0000000..2eae90a --- /dev/null +++ b/test/generated/next/shippingInstructions/shippingInstructions.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace ShippingInstructionsAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useDeleteOfficesPositionsShippingInstructionsById` mutation ability. For global ability, omit the object parameter. + * @description Delete shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsShippingInstructionsById` mutation + */ +export const canUseDeleteOfficesPositionsShippingInstructionsById = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `usePreview` query or `usePreviewMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreview` query or `usePreviewMutation` mutation + */ +export const canUsePreview = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +} diff --git a/test/generated/next/shippingInstructions/shippingInstructions.api.ts b/test/generated/next/shippingInstructions/shippingInstructions.api.ts new file mode 100644 index 0000000..e535ba2 --- /dev/null +++ b/test/generated/next/shippingInstructions/shippingInstructions.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { ShippingInstructionsModels } from "./shippingInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ShippingInstructionsApi { +export const create = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions`, + undefined, + config + ) +}; +export const get = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + config + ) +}; +export const update = (officeId: string, positionId: string, id: string, data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), + config + ) +}; +export const deleteOfficesPositionsShippingInstructionsById = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + undefined, + config + ) +}; +export const preview = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generate = (officeId: string, positionId: string, id: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/shippingInstructions/shippingInstructions.models.ts b/test/generated/next/shippingInstructions/shippingInstructions.models.ts new file mode 100644 index 0000000..7f8248c --- /dev/null +++ b/test/generated/next/shippingInstructions/shippingInstructions.models.ts @@ -0,0 +1,510 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace ShippingInstructionsModels { +/** + * EnsDeclarationEnumSchema + * @type { enum } + * @description ENS declaration + */ +export const EnsDeclarationEnumSchema = z.enum(["Carrier", "Self"]); +export type EnsDeclarationEnum = z.infer; +export const EnsDeclarationEnum = EnsDeclarationEnumSchema.enum; + +/** + * IssuedHouseBillsEnumSchema + * @type { enum } + * @description Issued house bills + */ +export const IssuedHouseBillsEnumSchema = z.enum(["None", "One", "Multiple"]); +export type IssuedHouseBillsEnum = z.infer; +export const IssuedHouseBillsEnum = IssuedHouseBillsEnumSchema.enum; + +/** + * WoodDeclarationEnumSchema + * @type { enum } + * @description Wood declaration + */ +export const WoodDeclarationEnumSchema = z.enum(["NoWood", "TreatedAndCertified", "NotTreatedAndNotCertified", "Processed"]); +export type WoodDeclarationEnum = z.infer; +export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; + +/** + * ShippingInstructionsPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } addressLine1 + * @property { string } addressLine2 + * @property { string } city + * @property { string } postalCode + * @property { string } state + * @property { string } countryCode + * @property { string } contactName + * @property { string } contactPhone + * @property { string } contactEmail + */ +export const ShippingInstructionsPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), addressLine1: z.string(), addressLine2: z.string(), city: z.string(), postalCode: z.string(), state: z.string(), countryCode: z.string(), contactName: z.string(), contactPhone: z.string(), contactEmail: z.string() }).readonly(); +export type ShippingInstructionsPartnerResponseDto = z.infer; + +/** + * ShippingInstructionsGeneralDetailsDtoSchema + * @type { object } + * @property { ShippingInstructionsPartnerResponseDto } shipper + * @property { ShippingInstructionsPartnerResponseDto } consignee + * @property { ShippingInstructionsPartnerResponseDto } freightForwarder + * @property { ShippingInstructionsPartnerResponseDto } notifyParty + * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty1 + * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty2 + * @property { ShippingInstructionsPartnerResponseDto } contractParty + * @property { ShippingInstructionsPartnerResponseDto } manufacturer + * @property { ShippingInstructionsPartnerResponseDto } consolidator + * @property { ShippingInstructionsPartnerResponseDto } importer + * @property { ShippingInstructionsPartnerResponseDto } warehouseKeeper + */ +export const ShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: ShippingInstructionsPartnerResponseDtoSchema, consignee: ShippingInstructionsPartnerResponseDtoSchema, freightForwarder: ShippingInstructionsPartnerResponseDtoSchema, notifyParty: ShippingInstructionsPartnerResponseDtoSchema, additionalNotifyParty1: ShippingInstructionsPartnerResponseDtoSchema, additionalNotifyParty2: ShippingInstructionsPartnerResponseDtoSchema, contractParty: ShippingInstructionsPartnerResponseDtoSchema, manufacturer: ShippingInstructionsPartnerResponseDtoSchema, consolidator: ShippingInstructionsPartnerResponseDtoSchema, importer: ShippingInstructionsPartnerResponseDtoSchema, warehouseKeeper: ShippingInstructionsPartnerResponseDtoSchema }).readonly(); +export type ShippingInstructionsGeneralDetailsDto = z.infer; + +/** + * ShippingInstructionsLocationResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } code + * @property { string } countryCode + * @property { string } eta + * @property { string } vessel + * @property { string } voyage + */ +export const ShippingInstructionsLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), code: z.string(), countryCode: z.string(), eta: z.iso.datetime({ offset: true }), vessel: z.string(), voyage: z.string() }).readonly(); +export type ShippingInstructionsLocationResponseDto = z.infer; + +/** + * SIMoveTypeEnumSchema + * @type { enum } + */ +export const SIMoveTypeEnumSchema = z.enum(["DoorToDoor", "DoorToPort", "PortToDoor", "PortToPort"]); +export type SIMoveTypeEnum = z.infer; +export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; + +/** + * ShippingInstructionsTransportDtoSchema + * @type { object } + * @property { string } vessel + * @property { string } voyage + * @property { string } imo + * @property { ShippingInstructionsLocationResponseDto } placeOfReceipt + * @property { ShippingInstructionsLocationResponseDto } portOfLoading + * @property { ShippingInstructionsLocationResponseDto } portOfDischarge + * @property { ShippingInstructionsLocationResponseDto } placeOfDelivery + * @property { SIMoveTypeEnum } moveType + * @property { string } shipmentType + */ +export const ShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string(), voyage: z.string(), imo: z.string(), placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema, portOfLoading: ShippingInstructionsLocationResponseDtoSchema, portOfDischarge: ShippingInstructionsLocationResponseDtoSchema, placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema, moveType: SIMoveTypeEnumSchema, shipmentType: z.string() }).readonly(); +export type ShippingInstructionsTransportDto = z.infer; + +/** + * ShippingInstructionsHazardousDtoSchema + * @type { object } + * @property { string } IMOClass + * @property { string } UNDGNumber + * @property { string } contact + */ +export const ShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string(), UNDGNumber: z.string(), contact: z.string() }).readonly(); +export type ShippingInstructionsHazardousDto = z.infer; + +/** + * ShippingInstructionsPackageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { number } quantity + * @property { string } packageType + * @property { string } packageTypeDescription + * @property { string } packageDescription + * @property { string } hsCode + * @property { number } volume + * @property { number } grossWeight + * @property { string } caseMarks + * @property { ShippingInstructionsHazardousDto } hazardous + * @property { string } ncmCodes + * @property { string } cusCode + */ +export const ShippingInstructionsPackageResponseDtoSchema = z.object({ id: z.string(), quantity: z.number(), packageType: z.string(), packageTypeDescription: z.string(), packageDescription: z.string(), hsCode: z.string(), volume: z.number(), grossWeight: z.number(), caseMarks: z.string(), hazardous: ShippingInstructionsHazardousDtoSchema, ncmCodes: z.string(), cusCode: z.string() }).readonly(); +export type ShippingInstructionsPackageResponseDto = z.infer; + +/** + * ShippingInstructionsCargoResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } transportUnitNumber + * @property { string } transportUnitType + * @property { string } transportUnitDescription + * @property { string } containerSupplier + * @property { number } grossWeight + * @property { number } tare + * @property { number } volume + * @property { string } seal1 + * @property { string } seal2 + * @property { string } woodDeclaration + * @property { ShippingInstructionsPackageResponseDto[] } packages + */ +export const ShippingInstructionsCargoResponseDtoSchema = z.object({ id: z.string().nullish(), transportUnitNumber: z.string().nullish(), transportUnitType: z.string().nullish(), transportUnitDescription: z.string().nullish(), containerSupplier: z.string().nullish(), grossWeight: z.number().nullish(), tare: z.number().nullish(), volume: z.number().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), woodDeclaration: WoodDeclarationEnumSchema.nullish(), packages: z.array(ShippingInstructionsPackageResponseDtoSchema).readonly() }).readonly(); +export type ShippingInstructionsCargoResponseDto = z.infer; + +/** + * ShippingInstructionsHeaderDtoSchema + * @type { object } + * @property { string } name + * @property { string } nameSuffix + * @property { number } versionNumber + * @property { string } shippingInstructionNumber + * @property { string } carrierScac + * @property { string } carrierBookingNumber + */ +export const ShippingInstructionsHeaderDtoSchema = z.object({ name: z.string(), nameSuffix: z.string().nullish(), versionNumber: z.number(), shippingInstructionNumber: z.string().nullish(), carrierScac: z.string().nullish(), carrierBookingNumber: z.string().nullish() }).readonly(); +export type ShippingInstructionsHeaderDto = z.infer; + +/** + * ShippingInstructionsReferencesDtoSchema + * @type { object } + * @property { string } shipperReference + * @property { string } forwarderReference + * @property { string } transactionReferenceNumber + * @property { string } blReferenceNumber + * @property { string } uniqueConsignmentReference + * @property { string } purchaseOrderNumber + * @property { string } contractReferenceNumber + * @property { string } rucNumber + * @property { string } consigneeOrderNumber + * @property { string } invoiceReferenceNumber + * @property { string } letterOfCreditReference + * @property { string } customsHouseBrokerReference + * @property { string } fmcNumber + * @property { string } exportLicenseNumber + */ +export const ShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string(), forwarderReference: z.string(), transactionReferenceNumber: z.string(), blReferenceNumber: z.string(), uniqueConsignmentReference: z.string(), purchaseOrderNumber: z.string(), contractReferenceNumber: z.string(), rucNumber: z.string(), consigneeOrderNumber: z.string(), invoiceReferenceNumber: z.string(), letterOfCreditReference: z.string(), customsHouseBrokerReference: z.string(), fmcNumber: z.string(), exportLicenseNumber: z.string() }).readonly(); +export type ShippingInstructionsReferencesDto = z.infer; + +/** + * ShippingInstructionsCustomsComplianceDtoSchema + * @type { object } + * @property { string } shipperTaxId + * @property { string } shipperEORI + * @property { string } consigneeTaxId + * @property { string } consigneeEORI + * @property { string } notifyPartyTaxId + * @property { string } notifyPartyEORI + */ +export const ShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string(), shipperEORI: z.string(), consigneeTaxId: z.string(), consigneeEORI: z.string(), notifyPartyTaxId: z.string(), notifyPartyEORI: z.string() }).readonly(); +export type ShippingInstructionsCustomsComplianceDto = z.infer; + +/** + * ShippingInstructionsIcs2DtoSchema + * @type { object } + * @property { boolean } goodsDeliveredInEu + * @property { string } ensDeclaration + * @property { string } issuedHouseBills + */ +export const ShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean(), ensDeclaration: EnsDeclarationEnumSchema, issuedHouseBills: IssuedHouseBillsEnumSchema }).readonly(); +export type ShippingInstructionsIcs2Dto = z.infer; + +/** + * ShippingInstructionsCargoIdentificationNumbersDtoSchema + * @type { object } + * @property { string } PCINNumber + * @property { string } CSNNumber + * @property { string } MCINNumber + */ +export const ShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string(), CSNNumber: z.string(), MCINNumber: z.string() }).readonly(); +export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer; + +/** + * ShippingInstructionsControlTotalsDtoSchema + * @type { object } + * @property { number } totalNumberOfContainers + * @property { number } totalNumberOfPackages + * @property { number } totalShipmentWeight + * @property { number } totalShipmentVolume + */ +export const ShippingInstructionsControlTotalsDtoSchema = z.object({ totalNumberOfContainers: z.number(), totalNumberOfPackages: z.number(), totalShipmentWeight: z.number(), totalShipmentVolume: z.number() }).readonly(); +export type ShippingInstructionsControlTotalsDto = z.infer; + +/** + * FreightChargesDtoSchema + * @type { object } + * @property { string } freightPayer + * @property { string } freightTerm + */ +export const FreightChargesDtoSchema = z.object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }).readonly(); +export type FreightChargesDto = z.infer; + +/** + * ShippingInstructionsShippersDeclaredValueDtoSchema + * @type { object } + * @property { string } currency + * @property { number } shipperDeclaredValue + */ +export const ShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string(), shipperDeclaredValue: z.number() }).readonly(); +export type ShippingInstructionsShippersDeclaredValueDto = z.infer; + +/** + * ShippingInstructionsNotificationEmailsDtoSchema + * @type { object } + * @property { string } siRequestorEmails + */ +export const ShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string() }).readonly(); +export type ShippingInstructionsNotificationEmailsDto = z.infer; + +/** + * ShippingInstructionsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } name + * @property { string } nameSuffix + * @property { string } date + * @property { string } createdAt + * @property { string } updatedAt + * @property { number } versionNumber + * @property { ShippingInstructionsHeaderDto } header + * @property { ShippingInstructionsGeneralDetailsDto } generalDetails + * @property { ShippingInstructionsReferencesDto } references + * @property { ShippingInstructionsTransportDto } transport + * @property { ShippingInstructionsCustomsComplianceDto } customsCompliance + * @property { ShippingInstructionsIcs2Dto } ics2 + * @property { ShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers + * @property { ShippingInstructionsCargoResponseDto[] } cargo + * @property { ShippingInstructionsControlTotalsDto } controlTotals + * @property { FreightChargesDto } freightCharges + * @property { ShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue + * @property { ShippingInstructionsNotificationEmailsDto } notificationEmails + * @property { string } defaultFileName + */ +export const ShippingInstructionsResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), date: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), versionNumber: z.number(), header: ShippingInstructionsHeaderDtoSchema, generalDetails: ShippingInstructionsGeneralDetailsDtoSchema, references: ShippingInstructionsReferencesDtoSchema, transport: ShippingInstructionsTransportDtoSchema, customsCompliance: ShippingInstructionsCustomsComplianceDtoSchema, ics2: ShippingInstructionsIcs2DtoSchema, cargoIdentificationNumbers: ShippingInstructionsCargoIdentificationNumbersDtoSchema, cargo: z.array(ShippingInstructionsCargoResponseDtoSchema).readonly().nullish(), controlTotals: ShippingInstructionsControlTotalsDtoSchema, freightCharges: FreightChargesDtoSchema, shippersDeclaredValue: ShippingInstructionsShippersDeclaredValueDtoSchema, notificationEmails: ShippingInstructionsNotificationEmailsDtoSchema, defaultFileName: z.string() }).readonly(); +export type ShippingInstructionsResponseDto = z.infer; + +/** + * UpdateShippingInstructionsPartnerDtoSchema + * @type { object } + * @property { string } id Partner id + * @property { string } name Partner name + * @property { string } addressLine1 Address line 1 + * @property { string } addressLine2 Address line 2 + * @property { string } city City + * @property { string } postalCode Postal code + * @property { string } state State + * @property { string } countryCode Country code + * @property { string } taxId Tax ID + * @property { string } contactName Contact name + * @property { string } contactPhone Contact phone + * @property { string } contactEmail Contact email + */ +export const UpdateShippingInstructionsPartnerDtoSchema = z.object({ id: z.string().describe("Partner id"), name: z.string().describe("Partner name"), addressLine1: z.string().describe("Address line 1"), addressLine2: z.string().describe("Address line 2"), city: z.string().describe("City"), postalCode: z.string().describe("Postal code"), state: z.string().describe("State"), countryCode: z.string().describe("Country code"), taxId: z.string().describe("Tax ID"), contactName: z.string().describe("Contact name"), contactPhone: z.string().describe("Contact phone"), contactEmail: z.string().describe("Contact email") }).readonly(); +export type UpdateShippingInstructionsPartnerDto = z.infer; + +/** + * UpdateShippingInstructionsGeneralDetailsDtoSchema + * @type { object } + * @property { UpdateShippingInstructionsPartnerDto } shipper Shipper + * @property { UpdateShippingInstructionsPartnerDto } consignee Consignee + * @property { UpdateShippingInstructionsPartnerDto } freightForwarder Freight forwarder + * @property { UpdateShippingInstructionsPartnerDto } notifyParty Notify party + * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty1 Additional notify party 1 + * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty2 Additional notify party 2 + * @property { UpdateShippingInstructionsPartnerDto } contractParty Contract party + * @property { UpdateShippingInstructionsPartnerDto } manufacturer Manufacturer + * @property { UpdateShippingInstructionsPartnerDto } consolidator Consolidator + * @property { UpdateShippingInstructionsPartnerDto } importer Importer + * @property { UpdateShippingInstructionsPartnerDto } warehouseKeeper Warehouse keeper + */ +export const UpdateShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: UpdateShippingInstructionsPartnerDtoSchema.describe("Shipper"), consignee: UpdateShippingInstructionsPartnerDtoSchema.describe("Consignee"), freightForwarder: UpdateShippingInstructionsPartnerDtoSchema.describe("Freight forwarder"), notifyParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Notify party"), additionalNotifyParty1: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 1"), additionalNotifyParty2: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 2"), contractParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Contract party"), manufacturer: UpdateShippingInstructionsPartnerDtoSchema.describe("Manufacturer"), consolidator: UpdateShippingInstructionsPartnerDtoSchema.describe("Consolidator"), importer: UpdateShippingInstructionsPartnerDtoSchema.describe("Importer"), warehouseKeeper: UpdateShippingInstructionsPartnerDtoSchema.describe("Warehouse keeper") }).readonly(); +export type UpdateShippingInstructionsGeneralDetailsDto = z.infer; + +/** + * UpdateShippingInstructionsLocationDtoSchema + * @type { object } + * @property { string } id Location id + * @property { string } name Location name + * @property { string } code Location code + * @property { string } countryCode Country code + */ +export const UpdateShippingInstructionsLocationDtoSchema = z.object({ id: z.string().describe("Location id"), name: z.string().describe("Location name"), code: z.string().describe("Location code"), countryCode: z.string().describe("Country code") }).readonly(); +export type UpdateShippingInstructionsLocationDto = z.infer; + +/** + * UpdateShippingInstructionsTransportDtoSchema + * @type { object } + * @property { string } vessel Vessel + * @property { string } voyage Voyage + * @property { string } imo IMO + * @property { UpdateShippingInstructionsLocationDto } placeOfReceipt Place of receipt + * @property { UpdateShippingInstructionsLocationDto } portOfLoading Port of loading + * @property { UpdateShippingInstructionsLocationDto } portOfDischarge Port of discharge + * @property { UpdateShippingInstructionsLocationDto } placeOfDelivery Place of delivery + * @property { SIMoveTypeEnum } moveType Move type + * @property { string } shipmentType Shipment type + */ +export const UpdateShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string().describe("Vessel"), voyage: z.string().describe("Voyage"), imo: z.string().describe("IMO"), placeOfReceipt: UpdateShippingInstructionsLocationDtoSchema.describe("Place of receipt"), portOfLoading: UpdateShippingInstructionsLocationDtoSchema.describe("Port of loading"), portOfDischarge: UpdateShippingInstructionsLocationDtoSchema.describe("Port of discharge"), placeOfDelivery: UpdateShippingInstructionsLocationDtoSchema.describe("Place of delivery"), moveType: SIMoveTypeEnumSchema.describe("Move type"), shipmentType: z.string().describe("Shipment type") }).readonly(); +export type UpdateShippingInstructionsTransportDto = z.infer; + +/** + * UpdateShippingInstructionsHazardousDtoSchema + * @type { object } + * @property { string } IMOClass IMO class + * @property { string } UNDGNumber UNDG number + * @property { string } contact Contact + */ +export const UpdateShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string().describe("IMO class"), UNDGNumber: z.string().describe("UNDG number"), contact: z.string().describe("Contact") }).readonly(); +export type UpdateShippingInstructionsHazardousDto = z.infer; + +/** + * UpdateShippingInstructionsPackageDtoSchema + * @type { object } + * @property { string } id Package id + * @property { number } quantity Quantity + * @property { string } packageType Package type + * @property { string } packageTypeDescription Package type description + * @property { string } packageDescription Package description + * @property { string } hsCode HS code + * @property { number } volume Volume + * @property { number } grossWeight Gross weight + * @property { string } caseMarks Case marks + * @property { UpdateShippingInstructionsHazardousDto } hazardous Hazardous + * @property { string } ncmCodes NCM codes + * @property { string } cusCode CUS code + */ +export const UpdateShippingInstructionsPackageDtoSchema = z.object({ id: z.string().describe("Package id"), quantity: z.number().describe("Quantity"), packageType: z.string().describe("Package type"), packageTypeDescription: z.string().describe("Package type description"), packageDescription: z.string().describe("Package description"), hsCode: z.string().describe("HS code"), volume: z.number().describe("Volume"), grossWeight: z.number().describe("Gross weight"), caseMarks: z.string().describe("Case marks"), hazardous: UpdateShippingInstructionsHazardousDtoSchema.describe("Hazardous"), ncmCodes: z.string().describe("NCM codes"), cusCode: z.string().describe("CUS code") }).readonly(); +export type UpdateShippingInstructionsPackageDto = z.infer; + +/** + * UpdateShippingInstructionsCargoDtoSchema + * @type { object } + * @property { string } id Cargo id + * @property { string } transportUnitNumber Transport unit number + * @property { string } transportUnitType Transport unit type + * @property { string } transportUnitDescription Transport unit description + * @property { string } containerSupplier Container supplier + * @property { number } grossWeight Gross weight + * @property { number } tare Tare + * @property { number } volume Volume + * @property { string } seal1 Seal 1 + * @property { string } seal2 Seal 2 + * @property { string } woodDeclaration Wood declaration + * @property { UpdateShippingInstructionsPackageDto[] } packages Packages + */ +export const UpdateShippingInstructionsCargoDtoSchema = z.object({ id: z.string().describe("Cargo id"), transportUnitNumber: z.string().describe("Transport unit number"), transportUnitType: z.string().describe("Transport unit type"), transportUnitDescription: z.string().describe("Transport unit description"), containerSupplier: z.string().describe("Container supplier"), grossWeight: z.number().describe("Gross weight"), tare: z.number().describe("Tare"), volume: z.number().describe("Volume"), seal1: z.string().describe("Seal 1"), seal2: z.string().describe("Seal 2"), woodDeclaration: WoodDeclarationEnumSchema.describe("Wood declaration"), packages: z.array(UpdateShippingInstructionsPackageDtoSchema).readonly().describe("Packages") }).readonly(); +export type UpdateShippingInstructionsCargoDto = z.infer; + +/** + * UpdateShippingInstructionsHeaderDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } nameSuffix Name suffix + * @property { number } versionNumber Version number + * @property { string } shippingInstructionNumber Shipping instruction number + * @property { string } carrierScac Carrier SCAC + * @property { string } carrierBookingNumber Carrier booking number + */ +export const UpdateShippingInstructionsHeaderDtoSchema = z.object({ name: z.string().describe("Name"), nameSuffix: z.string().describe("Name suffix"), versionNumber: z.number().describe("Version number"), shippingInstructionNumber: z.string().describe("Shipping instruction number"), carrierScac: z.string().describe("Carrier SCAC"), carrierBookingNumber: z.string().describe("Carrier booking number") }).readonly(); +export type UpdateShippingInstructionsHeaderDto = z.infer; + +/** + * UpdateShippingInstructionsReferencesDtoSchema + * @type { object } + * @property { string } shipperReference Shipper reference + * @property { string } forwarderReference Forwarder reference + * @property { string } transactionReferenceNumber Transaction reference number + * @property { string } blReferenceNumber BL reference number + * @property { string } uniqueConsignmentReference Unique consignment reference + * @property { string } purchaseOrderNumber Purchase order number + * @property { string } contractReferenceNumber Contract reference number + * @property { string } rucNumber RUC number + * @property { string } consigneeOrderNumber Consignee order number + * @property { string } invoiceReferenceNumber Invoice reference number + * @property { string } letterOfCreditReference Letter of credit reference + * @property { string } customsHouseBrokerReference Customs house broker reference + * @property { string } fmcNumber FMC number + * @property { string } exportLicenseNumber Export license number + */ +export const UpdateShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string().describe("Shipper reference"), forwarderReference: z.string().describe("Forwarder reference"), transactionReferenceNumber: z.string().describe("Transaction reference number"), blReferenceNumber: z.string().describe("BL reference number"), uniqueConsignmentReference: z.string().describe("Unique consignment reference"), purchaseOrderNumber: z.string().describe("Purchase order number"), contractReferenceNumber: z.string().describe("Contract reference number"), rucNumber: z.string().describe("RUC number"), consigneeOrderNumber: z.string().describe("Consignee order number"), invoiceReferenceNumber: z.string().describe("Invoice reference number"), letterOfCreditReference: z.string().describe("Letter of credit reference"), customsHouseBrokerReference: z.string().describe("Customs house broker reference"), fmcNumber: z.string().describe("FMC number"), exportLicenseNumber: z.string().describe("Export license number") }).readonly(); +export type UpdateShippingInstructionsReferencesDto = z.infer; + +/** + * UpdateShippingInstructionsCustomsComplianceDtoSchema + * @type { object } + * @property { string } shipperTaxId Shipper tax ID + * @property { string } shipperEORI Shipper EORI + * @property { string } consigneeTaxId Consignee tax ID + * @property { string } consigneeEORI Consignee EORI + * @property { string } notifyPartyTaxId Notify party tax ID + * @property { string } notifyPartyEORI Notify party EORI + */ +export const UpdateShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string().describe("Shipper tax ID"), shipperEORI: z.string().describe("Shipper EORI"), consigneeTaxId: z.string().describe("Consignee tax ID"), consigneeEORI: z.string().describe("Consignee EORI"), notifyPartyTaxId: z.string().describe("Notify party tax ID"), notifyPartyEORI: z.string().describe("Notify party EORI") }).readonly(); +export type UpdateShippingInstructionsCustomsComplianceDto = z.infer; + +/** + * UpdateShippingInstructionsIcs2DtoSchema + * @type { object } + * @property { boolean } goodsDeliveredInEu Goods delivered in EU + * @property { string } ensDeclaration ENS declaration + * @property { string } issuedHouseBills Issued house bills + */ +export const UpdateShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean().describe("Goods delivered in EU"), ensDeclaration: EnsDeclarationEnumSchema.describe("ENS declaration"), issuedHouseBills: IssuedHouseBillsEnumSchema.describe("Issued house bills") }).readonly(); +export type UpdateShippingInstructionsIcs2Dto = z.infer; + +/** + * UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema + * @type { object } + * @property { string } PCINNumber PCIN number + * @property { string } CSNNumber CSN number + * @property { string } MCINNumber MCIN number + */ +export const UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string().describe("PCIN number"), CSNNumber: z.string().describe("CSN number"), MCINNumber: z.string().describe("MCIN number") }).readonly(); +export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer; + +/** + * UpdateFreightChargesDtoSchema + * @type { object } + * @property { string } freightPayer + * @property { string } freightTerm + */ +export const UpdateFreightChargesDtoSchema = z.object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }).readonly(); +export type UpdateFreightChargesDto = z.infer; + +/** + * UpdateShippingInstructionsShippersDeclaredValueDtoSchema + * @type { object } + * @property { string } currency Currency + * @property { number } shipperDeclaredValue Shipper declared value + */ +export const UpdateShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string().describe("Currency"), shipperDeclaredValue: z.number().describe("Shipper declared value") }).readonly(); +export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer; + +/** + * UpdateShippingInstructionsNotificationEmailsDtoSchema + * @type { object } + * @property { string } siRequestorEmails SI requestor emails + */ +export const UpdateShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string().describe("SI requestor emails") }).readonly(); +export type UpdateShippingInstructionsNotificationEmailsDto = z.infer; + +/** + * UpdateShippingInstructionsRequestDtoSchema + * @type { object } + * @property { string } date Date + * @property { UpdateShippingInstructionsHeaderDto } header Header + * @property { UpdateShippingInstructionsGeneralDetailsDto } generalDetails General details + * @property { UpdateShippingInstructionsReferencesDto } references References + * @property { UpdateShippingInstructionsTransportDto } transport Transport + * @property { UpdateShippingInstructionsCustomsComplianceDto } customsCompliance Customs compliance + * @property { UpdateShippingInstructionsIcs2Dto } ics2 ICS2 + * @property { UpdateShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers Cargo identification numbers + * @property { UpdateShippingInstructionsCargoDto[] } cargo Cargo + * @property { UpdateFreightChargesDto } freightCharges + * @property { UpdateShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue Shipper's declared value + * @property { UpdateShippingInstructionsNotificationEmailsDto } notificationEmails Notification emails + */ +export const UpdateShippingInstructionsRequestDtoSchema = z.object({ date: z.iso.datetime({ offset: true }).describe("Date"), header: UpdateShippingInstructionsHeaderDtoSchema.describe("Header"), generalDetails: UpdateShippingInstructionsGeneralDetailsDtoSchema.describe("General details"), references: UpdateShippingInstructionsReferencesDtoSchema.describe("References"), transport: UpdateShippingInstructionsTransportDtoSchema.describe("Transport"), customsCompliance: UpdateShippingInstructionsCustomsComplianceDtoSchema.describe("Customs compliance"), ics2: UpdateShippingInstructionsIcs2DtoSchema.describe("ICS2"), cargoIdentificationNumbers: UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema.describe("Cargo identification numbers"), cargo: z.array(UpdateShippingInstructionsCargoDtoSchema).readonly().describe("Cargo"), freightCharges: UpdateFreightChargesDtoSchema, shippersDeclaredValue: UpdateShippingInstructionsShippersDeclaredValueDtoSchema.describe("Shipper's declared value"), notificationEmails: UpdateShippingInstructionsNotificationEmailsDtoSchema.describe("Notification emails") }).readonly(); +export type UpdateShippingInstructionsRequestDto = z.infer; + +} diff --git a/test/generated/next/shippingInstructions/shippingInstructions.queries.ts b/test/generated/next/shippingInstructions/shippingInstructions.queries.ts new file mode 100644 index 0000000..a3a9034 --- /dev/null +++ b/test/generated/next/shippingInstructions/shippingInstructions.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { ShippingInstructionsAcl } from "./shippingInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { ShippingInstructionsModels } from "./shippingInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { ShippingInstructionsApi } from "./shippingInstructions.api"; + +export namespace ShippingInstructionsQueries { +export const moduleName = QueryModule.ShippingInstructions; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id", officeId, positionId, id] as const, + preview: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id/preview", officeId, positionId, id] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create shipping instructions + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId } )); + return ShippingInstructionsApi.create(officeId, positionId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGet` + * @summary Get shipping instructions data + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId, id), + queryFn: () => { + checkAcl(ShippingInstructionsAcl.canUseGet({ officeId } )); + return ShippingInstructionsApi.get(officeId, positionId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update shipping instructions + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { ShippingInstructionsModels.UpdateShippingInstructionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Shipping instructions updated successfully + * @statusCodes [200, 401, 404] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id, data }) => { + checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId } )); + return ShippingInstructionsApi.update(officeId, positionId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, id } = variables; + const updateKeys = [keys.get(officeId, positionId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteOfficesPositionsShippingInstructionsById` + * @summary Delete shipping instructions + * @permission Requires `canUseDeleteOfficesPositionsShippingInstructionsById` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Shipping instructions deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteOfficesPositionsShippingInstructionsById = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id }) => { + checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId } )); + return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreview` - recommended when file should be cached + * @summary Preview shipping instructions document + * @permission Requires `canUsePreview` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreview = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.preview(officeId, positionId, id), + queryFn: () => { + checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); + return ShippingInstructionsApi.preview(officeId, positionId, id, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewMutation` - recommended when file should not be cached + * @summary Preview shipping instructions document + * @permission Requires `canUsePreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id }) => { + checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); + return ShippingInstructionsApi.preview(officeId, positionId, id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, id } = variables; + const updateKeys = [keys.preview(officeId, positionId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerate` + * @summary Generate shipping instructions document + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id, data }) => { + checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId } )); + return ShippingInstructionsApi.generate(officeId, positionId, id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/terminals/terminals.acl.ts b/test/generated/next/terminals/terminals.acl.ts new file mode 100644 index 0000000..d29c8a0 --- /dev/null +++ b/test/generated/next/terminals/terminals.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace TerminalsAcl { +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Terminal" +] as AbilityTuple<"Create", "Terminal">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Terminal" +] as AbilityTuple<"Read", "Terminal">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Terminal" +] as AbilityTuple<"Read", "Terminal">; + +/** + * Use for `useGetById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( +) => [ + "Read", + "Terminal" +] as AbilityTuple<"Read", "Terminal">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Terminal" +] as AbilityTuple<"Update", "Terminal">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Terminal" +] as AbilityTuple<"Archive", "Terminal">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Unarchive", + "Terminal" +] as AbilityTuple<"Unarchive", "Terminal">; + +} diff --git a/test/generated/next/terminals/terminals.api.ts b/test/generated/next/terminals/terminals.api.ts new file mode 100644 index 0000000..31b5d76 --- /dev/null +++ b/test/generated/next/terminals/terminals.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { TerminalsModels } from "./terminals.models"; + +export namespace TerminalsApi { +export const create = (data: TerminalsModels.CreateTerminalRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals`, + ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), + config + ) +}; +export const paginate = (limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, + `/terminals`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, + `/terminals/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals/${id}`, + config + ) +}; +export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals/${id}`, + ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/terminals/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/terminals/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/terminals/terminals.configs.ts b/test/generated/next/terminals/terminals.configs.ts new file mode 100644 index 0000000..36d2f2c --- /dev/null +++ b/test/generated/next/terminals/terminals.configs.ts @@ -0,0 +1,146 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { TerminalsModels } from "./terminals.models"; +import { CommonModels } from "@/data/common/common.models"; +import { TerminalsQueries } from "./terminals.queries"; +import { TerminalsAcl } from "./terminals.acl"; + +export namespace TerminalsConfigs { +export const terminalsConfig = { + meta: { + title: "Terminals", + }, + readAll: { + acl: TerminalsAcl.canUsePaginate, + schema: TerminalsModels.TerminalResponseDTOSchema, + paginated: TerminalsQueries.usePaginate, + infinite: TerminalsQueries.usePaginateInfinite, + filters: { + schema: TerminalsModels.TerminalPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: TerminalsModels.TerminalPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + type: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: TerminalsModels.TerminalResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + name: true, + type: true, + airport: true, + port: true, + archived: true, + shortName: true, + address: true, + additionalInformation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: TerminalsModels.TerminalsPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: TerminalsAcl.canUseGetById, + schema: TerminalsModels.TerminalResponseDTOSchema, + query: TerminalsQueries.useGetById, + }, + create: { + acl: TerminalsAcl.canUseCreate, + schema: TerminalsModels.CreateTerminalRequestDTOSchema, + mutation: TerminalsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: TerminalsModels.CreateTerminalRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + type: true, + portId: true, + airportId: true, + street: true, + secondaryStreet: true, + zip: true, + district: true, + cityId: true, + countryId: true, + additionalInformation: true, + }, + }, +}) + }, + update: { + acl: TerminalsAcl.canUseUpdate, + schema: TerminalsModels.UpdateTerminalRequestDTOSchema, + mutation: TerminalsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: TerminalsModels.UpdateTerminalRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + type: true, + portId: true, + airportId: true, + street: true, + secondaryStreet: true, + zip: true, + district: true, + cityId: true, + countryId: true, + additionalInformation: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: TerminalsAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: TerminalsQueries.usePaginateLabels, + infinite: TerminalsQueries.usePaginateLabelsInfinite, + filters: { + schema: TerminalsModels.TerminalLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: TerminalsModels.TerminalLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/terminals/terminals.models.ts b/test/generated/next/terminals/terminals.models.ts new file mode 100644 index 0000000..a543664 --- /dev/null +++ b/test/generated/next/terminals/terminals.models.ts @@ -0,0 +1,196 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace TerminalsModels { +/** + * TerminalTypeSchema + * @type { enum } + */ +export const TerminalTypeSchema = z.enum(["port", "airport"]); +export type TerminalType = z.infer; +export const TerminalType = TerminalTypeSchema.enum; + +/** + * CreateTerminalRequestDTOSchema + * @type { object } + * @property { string } matchCode Unique identifier code for the terminal + * @property { string } shortName Optional short name for the terminal + * @property { string } name Full name of the terminal + * @property { TerminalType } type Type of the terminal + * @property { string } portId ID of associated port, required if type is port + * @property { string } airportId ID of associated airport, required if type is airport + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP / Postal code + * @property { string } district District + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } additionalInformation Additional information + */ +export const CreateTerminalRequestDTOSchema = z.object({ matchCode: z.string().describe("Unique identifier code for the terminal"), shortName: z.string().describe("Optional short name for the terminal").nullish(), name: z.string().describe("Full name of the terminal"), type: TerminalTypeSchema.describe("Type of the terminal"), portId: z.string().describe("ID of associated port, required if type is port").nullish(), airportId: z.string().describe("ID of associated airport, required if type is airport").nullish(), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street").nullish(), zip: z.string().describe("ZIP / Postal code"), district: z.string().describe("District").nullish(), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), additionalInformation: z.string().describe("Additional information").nullish() }).readonly(); +export type CreateTerminalRequestDTO = z.infer; + +/** + * TerminalCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const TerminalCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type TerminalCityDto = z.infer; + +/** + * TerminalCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const TerminalCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type TerminalCountryDto = z.infer; + +/** + * TerminalAddressDTOSchema + * @type { object } + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP/Postal code + * @property { TerminalCityDto } city + * @property { string } district District name + * @property { TerminalCountryDto } country + */ +export const TerminalAddressDTOSchema = z.object({ street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street").nullish(), zip: z.string().describe("ZIP/Postal code"), city: TerminalCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: TerminalCountryDtoSchema.nullish() }).readonly(); +export type TerminalAddressDTO = z.infer; + +/** + * AirportReferenceDTOSchema + * @type { object } + * @property { string } id Unique identifier of the airport + * @property { string } name Name of the airport + */ +export const AirportReferenceDTOSchema = z.object({ id: z.string().describe("Unique identifier of the airport"), name: z.string().describe("Name of the airport") }).readonly(); +export type AirportReferenceDTO = z.infer; + +/** + * PortReferenceDTOSchema + * @type { object } + * @property { string } id Unique identifier of the port + * @property { string } name Name of the port + */ +export const PortReferenceDTOSchema = z.object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port") }).readonly(); +export type PortReferenceDTO = z.infer; + +/** + * TerminalEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type TerminalEmployeeDTO = z.infer; + +/** + * TerminalResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the terminal + * @property { string } matchCode Match code for the terminal + * @property { string } name Name of the terminal + * @property { TerminalType } type Type of the terminal + * @property { AirportReferenceDTO } airport Associated airport information if terminal type is airport + * @property { PortReferenceDTO } port Associated port information if terminal type is port + * @property { boolean } archived Archived status of the terminal + * @property { string } shortName Short name of the terminal + * @property { TerminalAddressDTO } address Address of the terminal + * @property { string } additionalInformation Additional information + * @property { string } createdById + * @property { TerminalEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { TerminalEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const TerminalResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the terminal"), matchCode: z.string().describe("Match code for the terminal"), name: z.string().describe("Name of the terminal"), type: TerminalTypeSchema.describe("Type of the terminal").nullish(), airport: AirportReferenceDTOSchema.describe("Associated airport information if terminal type is airport").nullish(), port: PortReferenceDTOSchema.describe("Associated port information if terminal type is port").nullish(), archived: z.boolean().describe("Archived status of the terminal"), shortName: z.string().describe("Short name of the terminal").nullish(), address: TerminalAddressDTOSchema.describe("Address of the terminal").nullish(), additionalInformation: z.string().describe("Additional information").nullish(), createdById: z.string().nullish(), createdBy: TerminalEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: TerminalEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type TerminalResponseDTO = z.infer; + +/** + * UpdateTerminalRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code for the terminal + * @property { string } shortName Updated short name + * @property { string } name Updated name + * @property { TerminalType } type Type of the terminal + * @property { string } portId ID of associated port, required if type is port + * @property { string } airportId ID of associated airport, required if type is airport + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP / Postal code + * @property { string } district District + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } additionalInformation Additional information + */ +export const UpdateTerminalRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code for the terminal"), shortName: z.string().describe("Updated short name"), name: z.string().describe("Updated name"), type: TerminalTypeSchema.describe("Type of the terminal"), portId: z.string().describe("ID of associated port, required if type is port"), airportId: z.string().describe("ID of associated airport, required if type is airport"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street"), zip: z.string().describe("ZIP / Postal code"), district: z.string().describe("District"), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), additionalInformation: z.string().describe("Additional information") }).readonly(); +export type UpdateTerminalRequestDTO = z.infer; + +/** + * TerminalPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter terminals by matchCode, shortName, or name + * @property { boolean } archived + * @property { string } type + */ +export const TerminalPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter terminals by matchCode, shortName, or name"), archived: z.boolean(), type: TerminalTypeSchema }).readonly(); +export type TerminalPaginationFilterDto = z.infer; + +/** + * TerminalLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const TerminalLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type TerminalLabelFilterDto = z.infer; + +/** + * TerminalsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const TerminalsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type TerminalsPaginateOrderParamEnum = z.infer; +export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSchema.enum; + +/** + * TerminalsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { TerminalResponseDTO[] } items + */ +export const TerminalsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(TerminalResponseDTOSchema).readonly() }).readonly().shape }); +export type TerminalsPaginateResponse = z.infer; + +/** + * TerminalsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const TerminalsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type TerminalsPaginateLabelsOrderParamEnum = z.infer; +export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * TerminalsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const TerminalsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type TerminalsPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/terminals/terminals.queries.ts b/test/generated/next/terminals/terminals.queries.ts new file mode 100644 index 0000000..bec7227 --- /dev/null +++ b/test/generated/next/terminals/terminals.queries.ts @@ -0,0 +1,261 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { TerminalsAcl } from "./terminals.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { TerminalsModels } from "./terminals.models"; +import { TerminalsApi } from "./terminals.api"; + +export namespace TerminalsQueries { +export const moduleName = QueryModule.Terminals; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string) => [...keys.all, "/terminals", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string) => [...keys.all, "/terminals/paginate/labels", "infinite", limit, order, filter, cursor] as const, + getById: (id: string) => [...keys.all, "/terminals/:id", id] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a new terminal + * @permission Requires `canUseCreate` ability + * @param { TerminalsModels.CreateTerminalRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(TerminalsAcl.canUseCreate()); + return TerminalsApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Paginate Terminals + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(TerminalsAcl.canUsePaginate()); + return TerminalsApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Terminals + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(TerminalsAcl.canUsePaginate()); + return TerminalsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate terminals with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(TerminalsAcl.canUsePaginateLabels()); + return TerminalsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate terminals with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(TerminalsAcl.canUsePaginateLabels()); + return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useGetById` + * @summary Get terminal details by ID + * @permission Requires `canUseGetById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(id), + queryFn: () => { + checkAcl(TerminalsAcl.canUseGetById()); + return TerminalsApi.getById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update terminal details + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { TerminalsModels.UpdateTerminalRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(TerminalsAcl.canUseUpdate()); + return TerminalsApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.getById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive a terminal + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(TerminalsAcl.canUseArchive()); + return TerminalsApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive a terminal + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(TerminalsAcl.canUseUnarchive()); + return TerminalsApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/useCrossTabQueryInvalidation.ts b/test/generated/next/useCrossTabQueryInvalidation.ts new file mode 100644 index 0000000..d74d707 --- /dev/null +++ b/test/generated/next/useCrossTabQueryInvalidation.ts @@ -0,0 +1,40 @@ +import type { QueryClient, QueryKey } from "@tanstack/react-query"; + +const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; + +/** + * Broadcasts a query invalidation event to all other open tabs via localStorage. + * + * @param queryKeys - An array of query keys to invalidate (array of arrays). + * + * NOTE: The `storage` event only fires in *other* tabs — the calling tab + * must invalidate its own queryClient separately if needed. + */ +export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { + localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); +}; + +/** + * Registers a one-time global `storage` event listener that reacts to + * cross-tab invalidation broadcasts. Safe to call from multiple hooks — + * only the first call sets up the listener. + */ +let isListenerSetUp = false; + +export const setupCrossTabListener = (queryClient: QueryClient) => { + if (isListenerSetUp) return; + isListenerSetUp = true; + + window.addEventListener("storage", (e: StorageEvent) => { + if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; + + try { + const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; + for (const queryKey of keys) { + queryClient.invalidateQueries({ queryKey }); + } + } catch { + // Ignore malformed payloads + } + }); +}; diff --git a/test/generated/next/useMutationEffects.ts b/test/generated/next/useMutationEffects.ts new file mode 100644 index 0000000..ed61406 --- /dev/null +++ b/test/generated/next/useMutationEffects.ts @@ -0,0 +1,95 @@ +import { useCallback, useEffect } from "react"; + +import { QueryKey, useQueryClient } from "@tanstack/react-query"; +import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; +import { QueryModule } from "./queryModules"; +import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; + +export interface MutationEffectsOptions { + invalidateCurrentModule?: boolean; + crossTabInvalidation?: boolean; + invalidationMap?: InvalidationMap; + invalidateModules?: QueryModule[]; + invalidateKeys?: QueryKey[]; + preferUpdate?: boolean; +} + +export interface UseMutationEffectsProps { + currentModule: QueryModule; +} + +export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { + const queryClient = useQueryClient(); + const config = OpenApiQueryConfig.useConfig(); + + useEffect(() => { + if (!config.crossTabInvalidation) return; + setupCrossTabListener(queryClient); + }, [queryClient, config.crossTabInvalidation]); + + const runMutationEffects = useCallback( + async ( + data: TData, + variables: TVariables, + options: MutationEffectsOptions = {}, + updateKeys?: QueryKey[], + ) => { + const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; + const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; + const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; + + const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => + keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); + const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => + prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); + const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); + + const shouldInvalidateQuery = (queryKey: QueryKey) => { + const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); + if (shouldUpdate && isUpdateKey) { + return false; + } + + const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; + const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); + const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + const isMappedKey = + !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + + return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; + }; + + const invalidatedQueryKeys: QueryKey[] = []; + + queryClient.invalidateQueries({ + predicate: ({ queryKey }) => { + const shouldInvalidate = shouldInvalidateQuery(queryKey); + + if (shouldInvalidate && config.crossTabInvalidation) { + invalidatedQueryKeys.push([...queryKey]); + } + + return shouldInvalidate; + }, + }); + + if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { + broadcastQueryInvalidation(invalidatedQueryKeys); + } + + if (shouldUpdate && updateKeys) { + updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); + } + }, + [ + queryClient, + currentModule, + config.preferUpdate, + config.invalidateCurrentModule, + config.invalidationMap, + config.crossTabInvalidation, + ], + ); + + return { runMutationEffects }; +} diff --git a/test/generated/next/userActivity/userActivity.api.ts b/test/generated/next/userActivity/userActivity.api.ts new file mode 100644 index 0000000..affc18b --- /dev/null +++ b/test/generated/next/userActivity/userActivity.api.ts @@ -0,0 +1,20 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { UserActivityModels } from "./userActivity.models"; + +export namespace UserActivityApi { +export const get = (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, + `/offices/${officeId}/${entityType}/${entityId}/activity`, + { + ...config, + params: { + activeThresholdMinutes: ZodExtended.parse(z.number().gte(1).describe("Active threshold in minutes").nullish(), activeThresholdMinutes, { type: "query", name: "activeThresholdMinutes" }), + }, + } + ) +}; +} diff --git a/test/generated/next/userActivity/userActivity.models.ts b/test/generated/next/userActivity/userActivity.models.ts new file mode 100644 index 0000000..5a79039 --- /dev/null +++ b/test/generated/next/userActivity/userActivity.models.ts @@ -0,0 +1,64 @@ +import { z } from "zod"; + +export namespace UserActivityModels { +/** + * ActivityTypeEnumSchema + * @type { enum } + */ +export const ActivityTypeEnumSchema = z.enum(["View", "Modify"]); +export type ActivityTypeEnum = z.infer; +export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; + +/** + * UserSectionActivityDtoSchema + * @type { object } + * @property { string } section Section name + * @property { ActivityTypeEnum } activityType Type of activity + * @property { string } lastSeen Last seen timestamp + */ +export const UserSectionActivityDtoSchema = z.object({ section: z.string().describe("Section name"), activityType: ActivityTypeEnumSchema.describe("Type of activity"), lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp") }).readonly(); +export type UserSectionActivityDto = z.infer; + +/** + * ActiveUserDtoSchema + * @type { object } + * @property { string } userId User ID + * @property { string } firstName User first name + * @property { string } lastName User last name + * @property { string } userAvatar User avatar URL + * @property { UserSectionActivityDto } section User section activity + * @property { string } lastSeen Last seen timestamp + * @property { boolean } isCurrentlyActive Is currently active + */ +export const ActiveUserDtoSchema = z.object({ userId: z.string().describe("User ID"), firstName: z.string().describe("User first name"), lastName: z.string().describe("User last name"), userAvatar: z.string().describe("User avatar URL").nullish(), section: UserSectionActivityDtoSchema.describe("User section activity"), lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), isCurrentlyActive: z.boolean().describe("Is currently active") }).readonly(); +export type ActiveUserDto = z.infer; + +/** + * ActivityEntityTypeEnumSchema + * @type { enum } + */ +export const ActivityEntityTypeEnumSchema = z.enum(["Position", "Invoice", "BusinessPartner", "Quote"]); +export type ActivityEntityTypeEnum = z.infer; +export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; + +/** + * ActivityMetadataDtoSchema + * @type { object } + * @property { number } totalActiveUsers Total number of active users + * @property { string } entityId Entity ID + * @property { ActivityEntityTypeEnum } entityType Entity type + * @property { number } activeThresholdMinutes Active threshold in minutes + */ +export const ActivityMetadataDtoSchema = z.object({ totalActiveUsers: z.number().describe("Total number of active users"), entityId: z.string().describe("Entity ID"), entityType: ActivityEntityTypeEnumSchema.describe("Entity type"), activeThresholdMinutes: z.number().describe("Active threshold in minutes") }).readonly(); +export type ActivityMetadataDto = z.infer; + +/** + * UserActivityResponseDtoSchema + * @type { object } + * @property { ActiveUserDto[] } activeUsers List of active users + * @property { ActivityMetadataDto } metadata Activity metadata + */ +export const UserActivityResponseDtoSchema = z.object({ activeUsers: z.array(ActiveUserDtoSchema).readonly().describe("List of active users"), metadata: ActivityMetadataDtoSchema.describe("Activity metadata") }).readonly(); +export type UserActivityResponseDto = z.infer; + +} diff --git a/test/generated/next/userActivity/userActivity.queries.ts b/test/generated/next/userActivity/userActivity.queries.ts new file mode 100644 index 0000000..4e54389 --- /dev/null +++ b/test/generated/next/userActivity/userActivity.queries.ts @@ -0,0 +1,36 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { AppQueryOptions } from "@povio/openapi-codegen-cli"; +import { UserActivityApi } from "./userActivity.api"; + +export namespace UserActivityQueries { +export const moduleName = QueryModule.UserActivity; + +export const keys = { + all: [moduleName] as const, + get: (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number) => [...keys.all, "/offices/:officeId/:entityType/:entityId/activity", officeId, entityType, entityId, activeThresholdMinutes] as const, +}; + +/** + * Query `useGet` + * @summary Get user activity for an entity + * @param { string } object.officeId Path parameter + * @param { string } object.entityType Path parameter + * @param { string } object.entityId Path parameter + * @param { number } object.activeThresholdMinutes Query parameter. Active threshold in minutes. Minimum: `1` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, entityType, entityId, activeThresholdMinutes }: { officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + + return useQuery({ + queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), + queryFn: () => + UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes, config), + ...options, + }); +}; + +} diff --git a/test/generated/next/vatRules/vatRules.acl.ts b/test/generated/next/vatRules/vatRules.acl.ts new file mode 100644 index 0000000..827096c --- /dev/null +++ b/test/generated/next/vatRules/vatRules.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace VatRulesAcl { +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "VatRule" +] as AbilityTuple<"Read", "VatRule">; + +/** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( +) => [ + "Read", + "VatRule" +] as AbilityTuple<"Read", "VatRule">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "VatRule" +] as AbilityTuple<"Create", "VatRule">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "VatRule" +] as AbilityTuple<"Read", "VatRule">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "VatRule" +] as AbilityTuple<"Update", "VatRule">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Update", + "VatRule" +] as AbilityTuple<"Update", "VatRule">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Update", + "VatRule" +] as AbilityTuple<"Update", "VatRule">; + +} diff --git a/test/generated/next/vatRules/vatRules.api.ts b/test/generated/next/vatRules/vatRules.api.ts new file mode 100644 index 0000000..4280101 --- /dev/null +++ b/test/generated/next/vatRules/vatRules.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { VatRulesModels } from "./vatRules.models"; + +export namespace VatRulesApi { +export const paginateLabels = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, + `/vat-rules/labels/paginate`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: VatRulesModels.VatRulesListResponseSchema }, + `/vat-rules`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules`, + ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), + config + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}`, + config + ) +}; +export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}`, + ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/vatRules/vatRules.configs.ts b/test/generated/next/vatRules/vatRules.configs.ts new file mode 100644 index 0000000..092a685 --- /dev/null +++ b/test/generated/next/vatRules/vatRules.configs.ts @@ -0,0 +1,151 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { VatRulesModels } from "./vatRules.models"; +import { CommonModels } from "@/data/common/common.models"; +import { VatRulesQueries } from "./vatRules.queries"; +import { VatRulesAcl } from "./vatRules.acl"; + +export namespace VatRulesConfigs { +export const vatRulesConfig = { + meta: { + title: "Vat Rules", + }, + readAll: { + acl: VatRulesAcl.canUseList, + schema: VatRulesModels.VatRuleResponseDTOSchema, + paginated: VatRulesQueries.useList, + infinite: VatRulesQueries.useListInfinite, + filters: { + schema: VatRulesModels.VatRuleFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: VatRulesModels.VatRuleFilterDtoSchema, + options: { + inputs: { + matchcode: true, + name: true, + type: true, + officeId: true, + archived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: VatRulesModels.VatRuleResponseDTOSchema, + options: { + columns: { + id: true, + matchcode: true, + name: true, + vatPercentage: true, + vatNumber: true, + noTax: true, + type: true, + archived: true, + isReverseCharge: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + officeId: true, + office: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + sortable: VatRulesModels.VatRulesListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: VatRulesAcl.canUseFindById, + schema: VatRulesModels.VatRuleResponseDTOSchema, + query: VatRulesQueries.useFindById, + }, + create: { + acl: VatRulesAcl.canUseCreate, + schema: VatRulesModels.CreateVatRuleRequestDTOSchema, + mutation: VatRulesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: VatRulesModels.CreateVatRuleRequestDTOSchema, + options: { + inputs: { + matchcode: true, + name: true, + noTax: true, + vatPercentage: true, + vatNumber: true, + type: true, + officeId: true, + isReverseCharge: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + }, +}) + }, + update: { + acl: VatRulesAcl.canUseUpdate, + schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, + mutation: VatRulesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, + options: { + inputs: { + matchcode: true, + name: true, + noTax: true, + vatPercentage: true, + vatNumber: true, + type: true, + officeId: true, + isReverseCharge: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + }, +}) + }, +}; + +export const paginateConfig = { + meta: { + title: "Paginate", + }, + readAll: { + acl: VatRulesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: VatRulesQueries.usePaginateLabels, + infinite: VatRulesQueries.usePaginateLabelsInfinite, + filters: { + schema: VatRulesModels.VatRuleFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: VatRulesModels.VatRuleFilterDtoSchema, + options: { + inputs: { + matchcode: true, + name: true, + type: true, + officeId: true, + archived: true, + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/vatRules/vatRules.models.ts b/test/generated/next/vatRules/vatRules.models.ts new file mode 100644 index 0000000..6b65ef4 --- /dev/null +++ b/test/generated/next/vatRules/vatRules.models.ts @@ -0,0 +1,146 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace VatRulesModels { +/** + * VatRuleTypeEnumSchema + * @type { enum } + */ +export const VatRuleTypeEnumSchema = z.enum(["Outgoing", "Incoming"]); +export type VatRuleTypeEnum = z.infer; +export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; + +/** + * VatRuleFilterDtoSchema + * @type { object } + * @property { string } matchcode Matchcode to filter by + * @property { string } name Name to filter by + * @property { VatRuleTypeEnum } type + * @property { string } officeId Office ID to filter by + * @property { boolean } archived Filter by archived status + * @property { string } search Search to filter by + */ +export const VatRuleFilterDtoSchema = z.object({ matchcode: z.string().describe("Matchcode to filter by"), name: z.string().describe("Name to filter by"), type: VatRuleTypeEnumSchema, officeId: z.string().describe("Office ID to filter by"), archived: z.boolean().describe("Filter by archived status"), search: z.string().describe("Search to filter by") }).readonly(); +export type VatRuleFilterDto = z.infer; + +/** + * VatRuleEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type VatRuleEmployeeDTO = z.infer; + +/** + * VatRuleOfficeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type VatRuleOfficeDTO = z.infer; + +/** + * VatRuleResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchcode + * @property { string } name + * @property { number } vatPercentage + * @property { number } vatNumber VAT rule reference number + * @property { boolean } noTax + * @property { VatRuleTypeEnum } type + * @property { boolean } archived + * @property { boolean } isReverseCharge + * @property { string } createdById + * @property { VatRuleEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { VatRuleEmployeeDTO } updatedBy + * @property { string } updatedAt + * @property { string } officeId + * @property { VatRuleOfficeDTO } office + * @property { string } bookkeepingId + * @property { string } bookkeepingTargetAccountNumber + */ +export const VatRuleResponseDTOSchema = z.object({ id: z.string(), matchcode: z.string(), name: z.string(), vatPercentage: z.number(), vatNumber: z.number().describe("VAT rule reference number").nullish(), noTax: z.boolean().nullish(), type: VatRuleTypeEnumSchema, archived: z.boolean(), isReverseCharge: z.boolean(), createdById: z.string().nullish(), createdBy: VatRuleEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: VatRuleEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), officeId: z.string(), office: VatRuleOfficeDTOSchema.nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }).readonly(); +export type VatRuleResponseDTO = z.infer; + +/** + * CreateVatRuleRequestDTOSchema + * @type { object } + * @property { string } matchcode Unique matchcode for the VAT rule + * @property { string } name Name of the VAT rule + * @property { boolean } noTax + * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` + * @property { number } vatNumber VAT rule reference number + * @property { VatRuleTypeEnum } type Type of VAT rule + * @property { string } officeId Office ID + * @property { boolean } isReverseCharge Is reverse charge VAT rule + * @property { string } bookkeepingId Bookkeeping ID + * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number + */ +export const CreateVatRuleRequestDTOSchema = z.object({ matchcode: z.string().describe("Unique matchcode for the VAT rule"), name: z.string().describe("Name of the VAT rule"), noTax: z.boolean().nullish(), vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), vatNumber: z.number().describe("VAT rule reference number").nullish(), type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), officeId: z.string().describe("Office ID"), isReverseCharge: z.boolean().describe("Is reverse charge VAT rule").nullish(), bookkeepingId: z.string().describe("Bookkeeping ID").nullish(), bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullish() }).readonly(); +export type CreateVatRuleRequestDTO = z.infer; + +/** + * UpdateVatRuleRequestDTOSchema + * @type { object } + * @property { string } matchcode Unique matchcode for the VAT rule + * @property { string } name Name of the VAT rule + * @property { boolean } noTax + * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` + * @property { number } vatNumber VAT rule reference number. Minimum: `0` + * @property { VatRuleTypeEnum } type Type of VAT rule + * @property { string } officeId Office ID + * @property { boolean } isReverseCharge Is reverse charge VAT rule + * @property { string } bookkeepingId Bookkeeping ID + * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number + */ +export const UpdateVatRuleRequestDTOSchema = z.object({ matchcode: z.string().describe("Unique matchcode for the VAT rule"), name: z.string().describe("Name of the VAT rule"), noTax: z.boolean(), vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), vatNumber: z.number().gte(0).describe("VAT rule reference number").nullable(), type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), officeId: z.string().describe("Office ID"), isReverseCharge: z.boolean().describe("Is reverse charge VAT rule"), bookkeepingId: z.string().describe("Bookkeeping ID").nullable(), bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullable() }).readonly(); +export type UpdateVatRuleRequestDTO = z.infer; + +/** + * VatRulesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const VatRulesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type VatRulesPaginateLabelsOrderParamEnum = z.infer; +export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * VatRulesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const VatRulesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type VatRulesPaginateLabelsResponse = z.infer; + +/** + * VatRulesListOrderParamEnumSchema + * @type { enum } + */ +export const VatRulesListOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type VatRulesListOrderParamEnum = z.infer; +export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; + +/** + * VatRulesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { VatRuleResponseDTO[] } items + */ +export const VatRulesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(VatRuleResponseDTOSchema).readonly() }).readonly().shape }); +export type VatRulesListResponse = z.infer; + +} diff --git a/test/generated/next/vatRules/vatRules.queries.ts b/test/generated/next/vatRules/vatRules.queries.ts new file mode 100644 index 0000000..e0cd0f9 --- /dev/null +++ b/test/generated/next/vatRules/vatRules.queries.ts @@ -0,0 +1,265 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { VatRulesAcl } from "./vatRules.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { VatRulesModels } from "./vatRules.models"; +import { VatRulesApi } from "./vatRules.api"; + +export namespace VatRulesQueries { +export const moduleName = QueryModule.VatRules; + +export const keys = { + all: [moduleName] as const, + paginateLabels: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", "infinite", limit, order, filter, cursor] as const, + list: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/vat-rules/:id", id] as const, +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate VAT rule labels (id and matchcode only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(VatRulesAcl.canUsePaginateLabels()); + return VatRulesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate VAT rule labels (id and matchcode only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(VatRulesAcl.canUsePaginateLabels()); + return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useList` + * @summary List VAT rules + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(VatRulesAcl.canUseList()); + return VatRulesApi.list(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List VAT rules + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(VatRulesAcl.canUseList()); + return VatRulesApi.list(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create a new VAT rule + * @permission Requires `canUseCreate` ability + * @param { VatRulesModels.CreateVatRuleRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(VatRulesAcl.canUseCreate()); + return VatRulesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get VAT rule by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(VatRulesAcl.canUseFindById()); + return VatRulesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update VAT rule by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { VatRulesModels.UpdateVatRuleRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(VatRulesAcl.canUseUpdate()); + return VatRulesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive VAT rule + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(VatRulesAcl.canUseArchive()); + return VatRulesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive VAT rule + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(VatRulesAcl.canUseUnarchive()); + return VatRulesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/warehouses/warehouses.acl.ts b/test/generated/next/warehouses/warehouses.acl.ts new file mode 100644 index 0000000..65a76ba --- /dev/null +++ b/test/generated/next/warehouses/warehouses.acl.ts @@ -0,0 +1,74 @@ +import { AbilityTuple } from "@casl/ability"; + +export namespace WarehousesAcl { +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Warehouse" +] as AbilityTuple<"Create", "Warehouse">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Warehouse" +] as AbilityTuple<"Read", "Warehouse">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Warehouse" +] as AbilityTuple<"Read", "Warehouse">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Warehouse" +] as AbilityTuple<"Read", "Warehouse">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Warehouse" +] as AbilityTuple<"Update", "Warehouse">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Warehouse" +] as AbilityTuple<"Archive", "Warehouse">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "Warehouse" +] as AbilityTuple<"Archive", "Warehouse">; + +} diff --git a/test/generated/next/warehouses/warehouses.api.ts b/test/generated/next/warehouses/warehouses.api.ts new file mode 100644 index 0000000..b2e2dc5 --- /dev/null +++ b/test/generated/next/warehouses/warehouses.api.ts @@ -0,0 +1,79 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WarehousesModels } from "./warehouses.models"; + +export namespace WarehousesApi { +export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses`, + ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), + config + ) +}; +export const paginate = (limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, + `/warehouses`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, + `/warehouses/paginate/labels`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses/${id}`, + config + ) +}; +export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses/${id}`, + ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), + config + ) +}; +export const archive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/warehouses/${id}/archive`, + undefined, + config + ) +}; +export const unarchive = (id: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/warehouses/${id}/unarchive`, + undefined, + config + ) +}; +} diff --git a/test/generated/next/warehouses/warehouses.configs.ts b/test/generated/next/warehouses/warehouses.configs.ts new file mode 100644 index 0000000..d53c994 --- /dev/null +++ b/test/generated/next/warehouses/warehouses.configs.ts @@ -0,0 +1,141 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { WarehousesModels } from "./warehouses.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WarehousesQueries } from "./warehouses.queries"; +import { WarehousesAcl } from "./warehouses.acl"; + +export namespace WarehousesConfigs { +export const warehousesConfig = { + meta: { + title: "Warehouses", + }, + readAll: { + acl: WarehousesAcl.canUsePaginate, + schema: WarehousesModels.WarehouseResponseDTOSchema, + paginated: WarehousesQueries.usePaginate, + infinite: WarehousesQueries.usePaginateInfinite, + filters: { + schema: WarehousesModels.WarehouseFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WarehousesModels.WarehouseFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: WarehousesModels.WarehouseResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + city: true, + country: true, + district: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: WarehousesModels.WarehousesPaginateOrderParamEnumSchema, + }, +}), + }, + read: { + acl: WarehousesAcl.canUseFindById, + schema: WarehousesModels.WarehouseResponseDTOSchema, + query: WarehousesQueries.useFindById, + }, + create: { + acl: WarehousesAcl.canUseCreate, + schema: WarehousesModels.CreateWarehouseRequestDTOSchema, + mutation: WarehousesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: WarehousesModels.CreateWarehouseRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) + }, + update: { + acl: WarehousesAcl.canUseUpdate, + schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, + mutation: WarehousesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) + }, +}; + +export const labelsConfig = { + meta: { + title: "Labels", + }, + readAll: { + acl: WarehousesAcl.canUsePaginateLabels, + schema: CommonModels.LabelResponseDTOSchema, + paginated: WarehousesQueries.usePaginateLabels, + infinite: WarehousesQueries.usePaginateLabelsInfinite, + filters: { + schema: WarehousesModels.WarehouseLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WarehousesModels.WarehouseLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + +} diff --git a/test/generated/next/warehouses/warehouses.models.ts b/test/generated/next/warehouses/warehouses.models.ts new file mode 100644 index 0000000..0c5b059 --- /dev/null +++ b/test/generated/next/warehouses/warehouses.models.ts @@ -0,0 +1,152 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WarehousesModels { +/** + * WarehouseCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type WarehouseCityDto = z.infer; + +/** + * WarehouseCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const WarehouseCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export type WarehouseCountryDto = z.infer; + +/** + * WarehouseEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type WarehouseEmployeeDTO = z.infer; + +/** + * WarehouseResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { WarehouseCityDto } city + * @property { WarehouseCountryDto } country + * @property { string } district + * @property { boolean } archived + * @property { string } createdById + * @property { WarehouseEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { WarehouseEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const WarehouseResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: WarehouseCityDtoSchema.nullish(), country: WarehouseCountryDtoSchema.nullish(), district: z.string().nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: WarehouseEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: WarehouseEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type WarehouseResponseDTO = z.infer; + +/** + * CreateWarehouseRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } countryId + * @property { string } district + */ +export const CreateWarehouseRequestDTOSchema = z.object({ name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), cityId: z.string().nullish(), countryId: z.string().nullish(), district: z.string().nullish() }).readonly(); +export type CreateWarehouseRequestDTO = z.infer; + +/** + * WarehouseLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const WarehouseLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export type WarehouseLabelFilterDto = z.infer; + +/** + * WarehouseFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived Filter by archived status + */ +export const WarehouseFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean().describe("Filter by archived status") }).readonly(); +export type WarehouseFilterDto = z.infer; + +/** + * UpdateWarehouseRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } countryId + * @property { string } district + */ +export const UpdateWarehouseRequestDTOSchema = z.object({ name: z.string(), shortName: z.string(), additionalInformation: z.string(), matchCode: z.string(), street: z.string(), secondaryStreet: z.string(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string() }).readonly(); +export type UpdateWarehouseRequestDTO = z.infer; + +/** + * WarehousesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const WarehousesPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type WarehousesPaginateOrderParamEnum = z.infer; +export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnumSchema.enum; + +/** + * WarehousesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { WarehouseResponseDTO[] } items + */ +export const WarehousesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WarehouseResponseDTOSchema).readonly() }).readonly().shape }); +export type WarehousesPaginateResponse = z.infer; + +/** + * WarehousesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const WarehousesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type WarehousesPaginateLabelsOrderParamEnum = z.infer; +export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * WarehousesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const WarehousesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export type WarehousesPaginateLabelsResponse = z.infer; + +} diff --git a/test/generated/next/warehouses/warehouses.queries.ts b/test/generated/next/warehouses/warehouses.queries.ts new file mode 100644 index 0000000..667e346 --- /dev/null +++ b/test/generated/next/warehouses/warehouses.queries.ts @@ -0,0 +1,261 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WarehousesAcl } from "./warehouses.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WarehousesModels } from "./warehouses.models"; +import { WarehousesApi } from "./warehouses.api"; + +export namespace WarehousesQueries { +export const moduleName = QueryModule.Warehouses; + +export const keys = { + all: [moduleName] as const, + paginate: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string) => [...keys.all, "/warehouses", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", "infinite", limit, order, filter, cursor] as const, + findById: (id: string) => [...keys.all, "/warehouses/:id", id] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create warehouse + * @permission Requires `canUseCreate` ability + * @param { WarehousesModels.CreateWarehouseRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(WarehousesAcl.canUseCreate()); + return WarehousesApi.create(data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginate` + * @summary Get paginated warehouses + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WarehousesAcl.canUsePaginate()); + return WarehousesApi.paginate(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated warehouses + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WarehousesAcl.canUsePaginate()); + return WarehousesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate warehouse labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WarehousesAcl.canUsePaginateLabels()); + return WarehousesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate warehouse labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WarehousesAcl.canUsePaginateLabels()); + return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get warehouse by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(WarehousesAcl.canUseFindById()); + return WarehousesApi.findById(id, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update warehouse + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { WarehousesModels.UpdateWarehouseRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(WarehousesAcl.canUseUpdate()); + return WarehousesApi.update(id, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive warehouse + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(WarehousesAcl.canUseArchive()); + return WarehousesApi.archive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive warehouse + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(WarehousesAcl.canUseUnarchive()); + return WarehousesApi.unarchive(id, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/workingDocuments/workingDocuments.acl.ts b/test/generated/next/workingDocuments/workingDocuments.acl.ts new file mode 100644 index 0000000..344f8c6 --- /dev/null +++ b/test/generated/next/workingDocuments/workingDocuments.acl.ts @@ -0,0 +1,30 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsAcl { +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List working documents + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument", object) : "WorkingDocument" +] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get working document by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument", object) : "WorkingDocument" +] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocuments/workingDocuments.api.ts b/test/generated/next/workingDocuments/workingDocuments.api.ts new file mode 100644 index 0000000..bef7393 --- /dev/null +++ b/test/generated/next/workingDocuments/workingDocuments.api.ts @@ -0,0 +1,31 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; + +export namespace WorkingDocumentsApi { +export const list = (positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, + `/offices/${officeId}/positions/${positionId}/working-documents`, + { + ...config, + params: { + order: ZodExtended.parse(ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (positionId: string, id: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, + config + ) +}; +} diff --git a/test/generated/next/workingDocuments/workingDocuments.configs.ts b/test/generated/next/workingDocuments/workingDocuments.configs.ts new file mode 100644 index 0000000..5e7d622 --- /dev/null +++ b/test/generated/next/workingDocuments/workingDocuments.configs.ts @@ -0,0 +1,55 @@ +import { dynamicInputs } from "@povio/ui"; +import { dynamicColumns } from "@povio/ui"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; +import { WorkingDocumentsQueries } from "./workingDocuments.queries"; +import { WorkingDocumentsAcl } from "./workingDocuments.acl"; + +export namespace WorkingDocumentsConfigs { +export const workingDocumentsConfig = { + meta: { + title: "Working Documents", + }, + readAll: { + acl: WorkingDocumentsAcl.canUseList, + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + paginated: WorkingDocumentsQueries.useList, + infinite: WorkingDocumentsQueries.useListInfinite, + filters: { + schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, + options: { + inputs: { + search: true, + type: true, + }, + }, +}) + }, + columns: dynamicColumns({ + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + name: true, + nameSuffix: true, + type: true, + referenceTable: true, + referenceId: true, + createdById: true, + createdAt: true, + createdBy: true, + }, + sortable: WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema, + }, +}), + }, + read: { + acl: WorkingDocumentsAcl.canUseFindById, + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + query: WorkingDocumentsQueries.useFindById, + }, +}; + +} diff --git a/test/generated/next/workingDocuments/workingDocuments.models.ts b/test/generated/next/workingDocuments/workingDocuments.models.ts new file mode 100644 index 0000000..1e946b4 --- /dev/null +++ b/test/generated/next/workingDocuments/workingDocuments.models.ts @@ -0,0 +1,70 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsModels { +/** + * TypeEnumSchema + * @type { enum } + * @description Working document type + */ +export const TypeEnumSchema = z.enum(["export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "shipping-instructions"]); +export type TypeEnum = z.infer; +export const TypeEnum = TypeEnumSchema.enum; + +/** + * WorkingDocumentCreatedByResponseDTOSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } name Employee name + */ +export const WorkingDocumentCreatedByResponseDTOSchema = z.object({ id: z.string().describe("Employee ID"), name: z.string().describe("Employee name").nullable() }).readonly(); +export type WorkingDocumentCreatedByResponseDTO = z.infer; + +/** + * WorkingDocumentResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } positionId Position ID + * @property { string } name Working document name + * @property { string } nameSuffix Working document name suffix + * @property { string } type Working document type + * @property { string } referenceTable Reference table + * @property { string } referenceId Reference ID + * @property { string } createdById Created by + * @property { string } createdAt Created at + * @property { WorkingDocumentCreatedByResponseDTO } createdBy Created by + */ +export const WorkingDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string().describe("Position ID"), name: z.string().describe("Working document name"), nameSuffix: z.string().describe("Working document name suffix").nullish(), type: TypeEnumSchema.describe("Working document type"), referenceTable: z.string().describe("Reference table"), referenceId: z.string().describe("Reference ID"), createdById: z.string().describe("Created by"), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), createdBy: WorkingDocumentCreatedByResponseDTOSchema.describe("Created by") }).readonly(); +export type WorkingDocumentResponseDTO = z.infer; + +/** + * WorkingDocumentFilterDtoSchema + * @type { object } + * @property { string } search + * @property { string } type + */ +export const WorkingDocumentFilterDtoSchema = z.object({ search: z.string(), type: z.string() }).readonly(); +export type WorkingDocumentFilterDto = z.infer; + +/** + * WorkingDocumentsListOrderParamEnumSchema + * @type { enum } + */ +export const WorkingDocumentsListOrderParamEnumSchema = z.enum(["NAME", "TYPE", "CREATED_AT", "UPDATED_AT"]); +export type WorkingDocumentsListOrderParamEnum = z.infer; +export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParamEnumSchema.enum; + +/** + * WorkingDocumentsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { WorkingDocumentResponseDTO[] } items + */ +export const WorkingDocumentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).readonly() }).readonly().shape }); +export type WorkingDocumentsListResponse = z.infer; + +} diff --git a/test/generated/next/workingDocuments/workingDocuments.queries.ts b/test/generated/next/workingDocuments/workingDocuments.queries.ts new file mode 100644 index 0000000..a6dbf68 --- /dev/null +++ b/test/generated/next/workingDocuments/workingDocuments.queries.ts @@ -0,0 +1,102 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsAcl } from "./workingDocuments.acl"; +import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsModels } from "./workingDocuments.models"; +import { WorkingDocumentsApi } from "./workingDocuments.api"; + +export namespace WorkingDocumentsQueries { +export const moduleName = QueryModule.WorkingDocuments; + +export const keys = { + all: [moduleName] as const, + list: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", positionId, officeId, limit, order, filter, page, cursor] as const, + listInfinite: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", "infinite", positionId, officeId, limit, order, filter, cursor] as const, + findById: (positionId: string, id: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents/:id", positionId, id, officeId] as const, +}; + +/** + * Query `useList` + * @summary List working documents + * @permission Requires `canUseList` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` + * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ positionId, officeId, limit, order, filter, page, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor, config) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List working documents + * @permission Requires `canUseList` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` + * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ positionId, officeId, limit, order, filter, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor, config) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get working document by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ positionId, id, officeId }: { positionId: string, id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(positionId, id, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId } )); + return WorkingDocumentsApi.findById(positionId, id, officeId, config) }, + ...options, + }); +}; + +} diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts new file mode 100644 index 0000000..80d3476 --- /dev/null +++ b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsAmsInstructionsAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Create", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `useGetAMSInstructionsData` query ability. For global ability, omit the object parameter. + * @description Read AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAMSInstructionsData` query + */ +export const canUseGetAMSInstructionsData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `useUpdateAMSInstructionsData` mutation ability. For global ability, omit the object parameter. + * @description Update AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateAMSInstructionsData` mutation + */ +export const canUseUpdateAMSInstructionsData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `useDeleteAMSInstructions` mutation ability. For global ability, omit the object parameter. + * @description Delete AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteAMSInstructions` mutation + */ +export const canUseDeleteAMSInstructions = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Delete", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation + */ +export const canUsePreviewAMSInstructions = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerateAMSInstructions` mutation ability. For global ability, omit the object parameter. + * @description Generate AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAMSInstructions` mutation + */ +export const canUseGenerateAMSInstructions = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts new file mode 100644 index 0000000..aa27c95 --- /dev/null +++ b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsAmsInstructionsApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions`, + undefined, + config + ) +}; +export const getAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + config + ) +}; +export const updateAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + undefined, + config + ) +}; +export const previewAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts new file mode 100644 index 0000000..75d8fd8 --- /dev/null +++ b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts @@ -0,0 +1,142 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsAmsInstructionsModels { +/** + * AMSInstructionsDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ +export const AMSInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }).readonly(); +export type AMSInstructionsDocumentPortResponseDTO = z.infer; + +/** + * AMSInstructionsDocumentCityResponseDTOSchema + * @type { object } + * @property { string } id ID of the city + * @property { string } name Name of the city + */ +export const AMSInstructionsDocumentCityResponseDTOSchema = z.object({ id: z.string().describe("ID of the city"), name: z.string().describe("Name of the city") }).readonly(); +export type AMSInstructionsDocumentCityResponseDTO = z.infer; + +/** + * AMSInstructionsDocumentSignedByResponseDTOSchema + * @type { object } + * @property { string } id ID of the employee + * @property { string } name Name of the employee + */ +export const AMSInstructionsDocumentSignedByResponseDTOSchema = z.object({ id: z.string().describe("ID of the employee"), name: z.string().describe("Name of the employee") }).readonly(); +export type AMSInstructionsDocumentSignedByResponseDTO = z.infer; + +/** + * AMSInstructionsDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const AMSInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * AMSInstructionsDocumentCargoDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { string } containerNumber Container number of the cargo + * @property { number } nrOfPackages Number of packages in the cargo + * @property { string } description Description of the cargo + * @property { number } weight Weight of the cargo + * @property { number } volume Volume of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + */ +export const AMSInstructionsDocumentCargoDTOSchema = z.object({ caseMarks: z.string().describe("Case marks of the cargo"), containerNumber: z.string().describe("Container number of the cargo"), nrOfPackages: z.number().describe("Number of packages in the cargo"), description: z.string().describe("Description of the cargo"), weight: z.number().describe("Weight of the cargo"), volume: z.number().describe("Volume of the cargo"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo") }).readonly(); +export type AMSInstructionsDocumentCargoDTO = z.infer; + +/** + * AMSInstructionsDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the AMS Instructions document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the AMS Instructions document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } date Date of the AMS Instructions document + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { CommonModels.EditorContentResponseDto } additionalAMSText Additional AMS text + * @property { string } principalName Principal name + * @property { string } blNumber Bill of lading number + * @property { string } vessel Vessel + * @property { AMSInstructionsDocumentPortResponseDTO } portOfLoading Port of loading + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfDelivery Port of delivery + * @property { AMSInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfIssue Place of issue + * @property { string } dateOfIssue Date of issue + * @property { AMSInstructionsDocumentSignedByResponseDTO } signedBy Signed by + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } deliveryBusinessPartner Delivery business partner + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfAcceptance Port of acceptance + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Also notify party + * @property { string } applyTo Apply to + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string[] } availableContainerNumbers Available container numbers + * @property { string[] } selectedContainerNumbers Selected container numbers + * @property { string[] } selectedContainerLabels Selected container labels + * @property { AMSInstructionsDocumentCargoDTO[] } cargo Cargo information + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + */ +export const AMSInstructionsDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the AMS Instructions document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the AMS Instructions document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), versionNumber: z.number().describe("Version number of the document"), additionalAMSText: CommonModels.EditorContentResponseDtoSchema.describe("Additional AMS text").nullish(), principalName: z.string().describe("Principal name").nullish(), blNumber: z.string().describe("Bill of lading number").nullish(), vessel: z.string().describe("Vessel").nullish(), portOfLoading: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of loading").nullish(), placeOfDelivery: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of delivery").nullish(), portOfDischarge: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), placeOfIssue: AMSInstructionsDocumentCityResponseDTOSchema.describe("Place of issue").nullish(), dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue").nullish(), signedBy: AMSInstructionsDocumentSignedByResponseDTOSchema.describe("Signed by").nullish(), deliveryBusinessPartner: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Delivery business partner").nullish(), placeOfAcceptance: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of acceptance").nullish(), consignee: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), shipper: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), notify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Notify party").nullish(), alsoNotify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Also notify party").nullish(), applyTo: z.string().describe("Apply to").nullish(), suppressWeight: z.boolean().describe("Whether to suppress weight information").nullish(), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information").nullish(), availableContainerNumbers: z.array(z.string()).readonly().describe("Available container numbers").nullish(), selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers").nullish(), selectedContainerLabels: z.array(z.string()).readonly().describe("Selected container labels").nullish(), cargo: z.array(AMSInstructionsDocumentCargoDTOSchema).readonly().describe("Cargo information").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at").nullish() }).readonly(); +export type AMSInstructionsDocumentResponseDTO = z.infer; + +/** + * UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateAMSInstructionsDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { CommonModels.EditorContentUpdateDto } additionalAMSText Additional AMS text + * @property { string } principalName Principal name + * @property { string } blNumber Bill of lading number + * @property { string } vessel Vessel + * @property { string } portOfLoadingId Port of loading id + * @property { string } placeOfDeliveryId Place of delivery id + * @property { string } portOfDischargeId Port of discharge id + * @property { string } placeOfIssueId Place of issue + * @property { string } dateOfIssue Date of issue + * @property { string } signedById Signed by employee ID + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } deliveryBusinessPartner Delivery business partner + * @property { string } placeOfAcceptanceId Port of acceptance + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party + * @property { string } applyTo Apply to + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string[] } selectedContainerNumbers Selected container numbers + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { string } date Date of the AMS Instructions document + */ +export const UpdateAMSInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), additionalAMSText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional AMS text"), principalName: z.string().describe("Principal name"), blNumber: z.string().describe("Bill of lading number"), vessel: z.string().describe("Vessel"), portOfLoadingId: z.string().describe("Port of loading id"), placeOfDeliveryId: z.string().describe("Place of delivery id"), portOfDischargeId: z.string().describe("Port of discharge id"), placeOfIssueId: z.string().describe("Place of issue"), dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue"), signedById: z.string().describe("Signed by employee ID"), deliveryBusinessPartner: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Delivery business partner"), placeOfAcceptanceId: z.string().describe("Port of acceptance"), consignee: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), shipper: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), notify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party"), alsoNotify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party"), applyTo: z.string().describe("Apply to"), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document") }).readonly(); +export type UpdateAMSInstructionsDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts new file mode 100644 index 0000000..aa81d88 --- /dev/null +++ b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsAmsInstructionsAcl } from "./workingDocumentsAmsInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsAmsInstructionsApi } from "./workingDocumentsAmsInstructions.api"; + +export namespace WorkingDocumentsAmsInstructionsQueries { +export const moduleName = QueryModule.WorkingDocumentsAmsInstructions; + +export const keys = { + all: [moduleName] as const, + getAMSInstructionsData: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId", positionId, amsInstructionsId, officeId] as const, + previewAMSInstructions: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId/preview", positionId, amsInstructionsId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an AMS Instructions document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetAMSInstructionsData` + * @summary Get AMS Instructions document data + * @permission Requires `canUseGetAMSInstructionsData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.amsInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetAMSInstructionsData = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData(positionId, amsInstructionsId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateAMSInstructionsData` + * @summary Update AMS Instructions document data + * @permission Requires `canUseUpdateAMSInstructionsData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateAMSInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData(positionId, amsInstructionsId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, amsInstructionsId, officeId } = variables; + const updateKeys = [keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteAMSInstructions` + * @summary Delete AMS Instructions document + * @permission Requires `canUseDeleteAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } AMS Instructions document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions(positionId, amsInstructionsId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewAMSInstructions` - recommended when file should be cached + * @summary Preview AMS Instructions document + * @permission Requires `canUsePreviewAMSInstructions` ability + * @param { string } object.positionId Path parameter + * @param { string } object.amsInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewAMSInstructions = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewAMSInstructionsMutation` - recommended when file should not be cached + * @summary Preview AMS Instructions document + * @permission Requires `canUsePreviewAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewAMSInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, amsInstructionsId, officeId } = variables; + const updateKeys = [keys.previewAMSInstructions(positionId, amsInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateAMSInstructions` + * @summary Generate AMS Instructions document + * @permission Requires `canUseGenerateAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions(positionId, amsInstructionsId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts new file mode 100644 index 0000000..a026b68 --- /dev/null +++ b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsBlInstructionsAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGetBlInstructionsData` query ability. For global ability, omit the object parameter. + * @description Read BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBlInstructionsData` query + */ +export const canUseGetBlInstructionsData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useUpdateBlInstructionsData` mutation ability. For global ability, omit the object parameter. + * @description Update BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBlInstructionsData` mutation + */ +export const canUseUpdateBlInstructionsData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useDeleteBlInstructions` mutation ability. For global ability, omit the object parameter. + * @description Delete BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBlInstructions` mutation + */ +export const canUseDeleteBlInstructions = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation + */ +export const canUsePreviewBlInstructions = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerateBlInstructions` mutation ability. For global ability, omit the object parameter. + * @description Generate BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateBlInstructions` mutation + */ +export const canUseGenerateBlInstructions = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate BL Instructions document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ +export const canUseGenerateDocumentEml = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts new file mode 100644 index 0000000..a9d7914 --- /dev/null +++ b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts @@ -0,0 +1,77 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsBlInstructionsApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions`, + undefined, + config + ) +}; +export const getBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + config + ) +}; +export const updateBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + undefined, + config + ) +}; +export const previewBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +export const generateDocumentEml = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts new file mode 100644 index 0000000..cbf7cdd --- /dev/null +++ b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts @@ -0,0 +1,260 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsBlInstructionsModels { +/** + * BlInstructionsDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { string } date Date + * @property { string } location Location + * @property { string } signer Siger + */ +export const BlInstructionsDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), date: z.iso.datetime({ offset: true }).describe("Date"), location: z.string().describe("Location"), signer: z.string().describe("Siger") }).readonly(); +export type BlInstructionsDocumentSettingsDtoDTO = z.infer; + +/** + * BlInstructionsDocumentCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ +export const BlInstructionsDocumentCountryResponseDTOSchema = z.object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }).readonly(); +export type BlInstructionsDocumentCountryResponseDTO = z.infer; + +/** + * BlInstructionsDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + * @property { string } eori EORI number of the business partner + * @property { string } vatNumber VAT number of the business partner + */ +export const BlInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner"), eori: z.string().describe("EORI number of the business partner"), vatNumber: z.string().describe("VAT number of the business partner") }).readonly(); +export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * BlInstructionsDocumentPlaceResponseDTOSchema + * @type { object } + * @property { string } id ID of the place + * @property { string } name Name of the place + */ +export const BlInstructionsDocumentPlaceResponseDTOSchema = z.object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }).readonly(); +export type BlInstructionsDocumentPlaceResponseDTO = z.infer; + +/** + * AllChargesEnumSchema + * @type { enum } + */ +export const AllChargesEnumSchema = z.enum(["Prepaid", "Collect", "Automatic", "Detailed"]); +export type AllChargesEnum = z.infer; +export const AllChargesEnum = AllChargesEnumSchema.enum; + +/** + * BlInstructionsDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + * @property { string } countryCode Country ISO2 code of the port + */ +export const BlInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port"), countryCode: z.string().describe("Country ISO2 code of the port") }).readonly(); +export type BlInstructionsDocumentPortResponseDTO = z.infer; + +/** + * RequestedDocumentTypeEnumSchema + * @type { enum } + */ +export const RequestedDocumentTypeEnumSchema = z.enum(["SeawayBill", "Original"]); +export type RequestedDocumentTypeEnum = z.infer; +export const RequestedDocumentTypeEnum = RequestedDocumentTypeEnumSchema.enum; + +/** + * ManifestFilerStatusEnumSchema + * @type { enum } + */ +export const ManifestFilerStatusEnumSchema = z.enum(["Self", "Carrier"]); +export type ManifestFilerStatusEnum = z.infer; +export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; + +/** + * BlInstructionsDocumentCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export type BlInstructionsDocumentCountryDto = z.infer; + +/** + * BlInstructionsDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the BL Instructions document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the BL Instructions document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } date Date of the BL Instructions document + * @property { string } blNumber Bill of lading number + * @property { string } exportReference Export reference number + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { BlInstructionsDocumentCountryResponseDTO } originCountry Origin country + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } additionalText Additional text for the document + * @property { number } versionNumber Version number of the document + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } buyer Buyer information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } seller Seller information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } forwarder Forwarder party information + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information + * @property { BlInstructionsDocumentPlaceResponseDTO } stowedIntoContainerCity Stowed into container city information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfAcceptanceCity Place of acceptance city information + * @property { BlInstructionsDocumentPlaceResponseDTO } originalsToBeReleasedAt + * @property { string } originalsToBeReleasedAtText + * @property { BlInstructionsDocumentPlaceResponseDTO } loadingPierTerminal + * @property { string } loadingPierTerminalText + * @property { string } precarriageByText + * @property { string } placeOfReceiptText + * @property { string } portOfLoadingText + * @property { string } portOfDischargeText + * @property { string } placeOfDeliveryText + * @property { string } vessel Name of the vessel + * @property { string } voyage Name of the vessel + * @property { CommonModels.MovementTypeEnum } movementType + * @property { string } carrierBookingNumber + * @property { string } csnNumber + * @property { string } mcinNumber + * @property { string } pcinNumber + * @property { string } dueNumber + * @property { boolean } goodsDeliveredInEu + * @property { string } rucNumber + * @property { number } shipmentDeclaredValue + * @property { string } shipmentDeclaredValueCurrency + * @property { AllChargesEnum } allCharges Base freight payment term + * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term + * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term + * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term + * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term + * @property { string } shippingInstructionsComments Free-text shipping instructions comments + * @property { string } chargePayerId Charge payer business partner ID + * @property { string } chargePayLocationId Charge pay location ID + * @property { BlInstructionsDocumentPortResponseDTO } portOfLoading Port of loading information + * @property { BlInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information + * @property { BlInstructionsDocumentSettingsDtoDTO } settings Settings for the BL Instructions document + * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data + * @property { CommonModels.CargoTableBlockDto } cargo Cargo table block (identical to House BL cargo) + * @property { string } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document + * @property { RequestedDocumentTypeEnum } requestedDocumentType + * @property { boolean } requestedDocumentFreighted + * @property { number } requestedDocumentQuantity + * @property { ManifestFilerStatusEnum } manifestFilerStatus + * @property { string } manifestFilerIdentifier + * @property { BlInstructionsDocumentCountryDto } manifestFilingCountry + */ +export const BlInstructionsDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the BL Instructions document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the BL Instructions document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document").nullish(), blNumber: z.string().describe("Bill of lading number").nullish(), exportReference: z.string().describe("Export reference number").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), originCountry: BlInstructionsDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), additionalText: z.string().describe("Additional text for the document").nullish(), versionNumber: z.number().describe("Version number of the document"), buyer: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Buyer information for the shipment").nullish(), seller: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Seller information for the shipment").nullish(), consignee: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information for the shipment"), shipper: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), notify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Notify party information for the shipment"), alsoNotify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Additional notify party information"), forwarder: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Forwarder party information"), precarriageBy: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), placeOfReceipt: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), stowedIntoContainerCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Stowed into container city information").nullish(), placeOfAcceptanceCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of acceptance city information").nullish(), originalsToBeReleasedAt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAtText: z.string().nullish(), loadingPierTerminal: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), loadingPierTerminalText: z.string().nullish(), precarriageByText: z.string().nullish(), placeOfReceiptText: z.string().nullish(), portOfLoadingText: z.string().nullish(), portOfDischargeText: z.string().nullish(), placeOfDeliveryText: z.string().nullish(), vessel: z.string().describe("Name of the vessel").nullish(), voyage: z.string().describe("Name of the vessel").nullish(), movementType: CommonModels.MovementTypeEnumSchema.nullish(), carrierBookingNumber: z.string().nullish(), csnNumber: z.string().nullish(), mcinNumber: z.string().nullish(), pcinNumber: z.string().nullish(), dueNumber: z.string().nullish(), goodsDeliveredInEu: z.boolean().nullish(), rucNumber: z.string().nullish(), shipmentDeclaredValue: z.number().nullish(), shipmentDeclaredValueCurrency: z.string().nullish(), allCharges: AllChargesEnumSchema.describe("Base freight payment term").nullish(), baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term").nullish(), additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term").nullish(), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin haulage charges payment term").nullish(), originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term").nullish(), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination port charges payment term").nullish(), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination haulage charges payment term").nullish(), shippingInstructionsComments: z.string().describe("Free-text shipping instructions comments").nullish(), chargePayerId: z.string().describe("Charge payer business partner ID").nullish(), chargePayLocationId: z.string().describe("Charge pay location ID").nullish(), portOfLoading: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), portOfDischarge: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), placeOfDelivery: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), settings: BlInstructionsDocumentSettingsDtoDTOSchema.describe("Settings for the BL Instructions document").nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), cargo: CommonModels.CargoTableBlockDtoSchema.describe("Cargo table block (identical to House BL cargo)").nullish(), bodyRemarks: z.string().describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document"), requestedDocumentType: RequestedDocumentTypeEnumSchema.nullish(), requestedDocumentFreighted: z.boolean().nullish(), requestedDocumentQuantity: z.number().nullish(), manifestFilerStatus: ManifestFilerStatusEnumSchema.nullish(), manifestFilerIdentifier: z.string().nullish(), manifestFilingCountry: BlInstructionsDocumentCountryDtoSchema.nullish() }).readonly(); +export type BlInstructionsDocumentResponseDTO = z.infer; + +/** + * UpdateBlInstructionsDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { string } blNumber BL number + * @property { string } exportReference Export reference number + * @property { string } location Location + * @property { string } signer Signer + * @property { string } date Date + */ +export const UpdateBlInstructionsDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), blNumber: z.string().describe("BL number"), exportReference: z.string().describe("Export reference number"), location: z.string().describe("Location"), signer: z.string().describe("Signer"), date: z.iso.datetime({ offset: true }).describe("Date") }).readonly(); +export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer; + +/** + * UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateBlInstructionsDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } blNumber Bill of lading number + * @property { string } exportReference Export reference number + * @property { string } csnNumber + * @property { string } mcinNumber + * @property { string } pcinNumber + * @property { string } dueNumber + * @property { boolean } goodsDeliveredInEu + * @property { string } rucNumber + * @property { string } shipmentDeclaredValueCurrency + * @property { number } shipmentDeclaredValue + * @property { AllChargesEnum } allCharges All charges payment term + * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term + * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term + * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term + * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term + * @property { string } originCountryId Origin country ID + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } additionalText Additional text + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } buyer Buyer information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } seller Seller information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } forwarder Forwarder information + * @property { string } originalsToBeReleasedAtId Originals to be released at ID + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information + * @property { string } shippingInstructionsComments Shipping instructions free-text comments + * @property { string } chargePayerId Charge payer business partner ID + * @property { string } chargePayLocationId Charge pay location ID + * @property { string } precarriageById Pre-carriage by ID + * @property { string } placeOfReceiptId Place of receipt ID + * @property { string } stowedIntoContainerCityId Stowed into container city ID + * @property { string } loadingPierTerminalId Loading pier/terminal ID + * @property { string } loadingPierTerminalText + * @property { string } placeOfAcceptanceCityId Place of acceptance city ID + * @property { string } vessel Vessel name + * @property { string } voyage Vessel name + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } portOfLoadingId Port of loading ID + * @property { string } portOfDischargeId Port of discharge ID + * @property { string } placeOfDeliveryId Place of delivery ID + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { string } date Date of the BL Instructions document + * @property { UpdateBlInstructionsDocumentSettingsRequestDTO } settings Settings + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data + * @property { RequestedDocumentTypeEnum } requestedDocumentType + * @property { boolean } requestedDocumentFreighted + * @property { number } requestedDocumentQuantity + * @property { string } precarriageByText + * @property { string } placeOfReceiptText + * @property { string } portOfLoadingText + * @property { string } portOfDischargeText + * @property { string } placeOfDeliveryText + * @property { ManifestFilerStatusEnum } manifestFilerStatus + * @property { string } manifestFilingCountryId + * @property { string } manifestFilerIdentifier + */ +export const UpdateBlInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), blNumber: z.string().describe("Bill of lading number"), exportReference: z.string().describe("Export reference number"), csnNumber: z.string(), mcinNumber: z.string(), pcinNumber: z.string(), dueNumber: z.string(), goodsDeliveredInEu: z.boolean(), rucNumber: z.string(), shipmentDeclaredValueCurrency: z.string(), shipmentDeclaredValue: z.number(), allCharges: AllChargesEnumSchema.describe("All charges payment term"), baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term"), additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term"), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin haulage charges payment term"), originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term"), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination port charges payment term"), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination haulage charges payment term"), originCountryId: z.string().describe("Origin country ID"), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), additionalText: z.string().describe("Additional text"), consignee: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), shipper: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), buyer: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), seller: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), forwarder: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), notify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), alsoNotify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), shippingInstructionsComments: z.string().describe("Shipping instructions free-text comments"), chargePayerId: z.string().describe("Charge payer business partner ID"), chargePayLocationId: z.string().describe("Charge pay location ID"), precarriageById: z.string().describe("Pre-carriage by ID"), placeOfReceiptId: z.string().describe("Place of receipt ID"), stowedIntoContainerCityId: z.string().describe("Stowed into container city ID"), loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), loadingPierTerminalText: z.string(), placeOfAcceptanceCityId: z.string().describe("Place of acceptance city ID"), vessel: z.string().describe("Vessel name"), voyage: z.string().describe("Vessel name"), carrierBookingNumber: z.string().describe("Carrier booking number"), portOfLoadingId: z.string().describe("Port of loading ID"), portOfDischargeId: z.string().describe("Port of discharge ID"), placeOfDeliveryId: z.string().describe("Place of delivery ID"), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), bodyRemarks: z.string().describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document"), settings: UpdateBlInstructionsDocumentSettingsRequestDTOSchema.describe("Settings"), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), requestedDocumentType: RequestedDocumentTypeEnumSchema, requestedDocumentFreighted: z.boolean(), requestedDocumentQuantity: z.number(), precarriageByText: z.string(), placeOfReceiptText: z.string(), portOfLoadingText: z.string(), portOfDischargeText: z.string(), placeOfDeliveryText: z.string(), manifestFilerStatus: ManifestFilerStatusEnumSchema, manifestFilingCountryId: z.string(), manifestFilerIdentifier: z.string() }).readonly(); +export type UpdateBlInstructionsDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts new file mode 100644 index 0000000..6131b35 --- /dev/null +++ b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts @@ -0,0 +1,243 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsBlInstructionsAcl } from "./workingDocumentsBlInstructions.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsBlInstructionsApi } from "./workingDocumentsBlInstructions.api"; + +export namespace WorkingDocumentsBlInstructionsQueries { +export const moduleName = QueryModule.WorkingDocumentsBlInstructions; + +export const keys = { + all: [moduleName] as const, + getBlInstructionsData: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId", positionId, blInstructionsId, officeId] as const, + previewBlInstructions: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId/preview", positionId, blInstructionsId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a BL Instructions document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId } )); + return WorkingDocumentsBlInstructionsApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetBlInstructionsData` + * @summary Get BL Instructions document data + * @permission Requires `canUseGetBlInstructionsData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.blInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBlInstructionsData = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId } )); + return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateBlInstructionsData` + * @summary Update BL Instructions document data + * @permission Requires `canUseUpdateBlInstructionsData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBlInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId } )); + return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData(positionId, blInstructionsId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.getBlInstructionsData(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteBlInstructions` + * @summary Delete BL Instructions document + * @permission Requires `canUseDeleteBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } BL Instructions document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewBlInstructions` - recommended when file should be cached + * @summary Preview BL Instructions document + * @permission Requires `canUsePreviewBlInstructions` ability + * @param { string } object.positionId Path parameter + * @param { string } object.blInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewBlInstructions = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewBlInstructionsMutation` - recommended when file should not be cached + * @summary Preview BL Instructions document + * @permission Requires `canUsePreviewBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewBlInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateBlInstructions` + * @summary Generate BL Instructions document + * @permission Requires `canUseGenerateBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.generateBlInstructions(positionId, blInstructionsId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate BL Instructions document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId } )); + return WorkingDocumentsBlInstructionsApi.generateDocumentEml(positionId, blInstructionsId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts new file mode 100644 index 0000000..0454eb2 --- /dev/null +++ b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsCmrFormAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Create", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `useGetCmrData` query ability. For global ability, omit the object parameter. + * @description Read CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCmrData` query + */ +export const canUseGetCmrData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `useUpdateCmrData` mutation ability. For global ability, omit the object parameter. + * @description Update CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCmrData` mutation + */ +export const canUseUpdateCmrData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `useDeleteCmr` mutation ability. For global ability, omit the object parameter. + * @description Delete CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCmr` mutation + */ +export const canUseDeleteCmr = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Delete", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `usePreviewCmr` query or `usePreviewCmrMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewCmr` query or `usePreviewCmrMutation` mutation + */ +export const canUsePreviewCmr = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `useGenerateCmr` mutation ability. For global ability, omit the object parameter. + * @description Generate CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateCmr` mutation + */ +export const canUseGenerateCmr = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts new file mode 100644 index 0000000..f070e6b --- /dev/null +++ b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsCmrFormApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs`, + undefined, + config + ) +}; +export const getCmrData = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + config + ) +}; +export const updateCmrData = (positionId: string, cmrId: string, officeId: string, data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + undefined, + config + ) +}; +export const previewCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateCmr = (positionId: string, cmrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts new file mode 100644 index 0000000..a94b23e --- /dev/null +++ b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts @@ -0,0 +1,187 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsCmrFormModels { +/** + * CmrDocumentLanguageSchema + * @type { enum } + */ +export const CmrDocumentLanguageSchema = z.enum(["en", "fr", "de"]); +export type CmrDocumentLanguage = z.infer; +export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; + +/** + * CmrDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CmrDocumentLanguage } primaryLanguage Primary language + * @property { CmrDocumentLanguage } secondaryLanguage Secondary language + */ +export const CmrDocumentSettingsDtoDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language") }).readonly(); +export type CmrDocumentSettingsDtoDTO = z.infer; + +/** + * CmrDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const CmrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type CmrDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * CmrDocumentCityResponseDTOSchema + * @type { object } + * @property { string } cityId ID of the city + * @property { string } cityName Name of the city + * @property { string } date Date of delivery/takeover + * @property { string } countryName Country name + */ +export const CmrDocumentCityResponseDTOSchema = z.object({ cityId: z.string().describe("ID of the city"), cityName: z.string().describe("Name of the city"), date: z.iso.datetime({ offset: true }).describe("Date of delivery/takeover").nullish(), countryName: z.string().describe("Country name").nullish() }).readonly(); +export type CmrDocumentCityResponseDTO = z.infer; + +/** + * CmrDocumentCostsResponseDTOSchema + * @type { object } + * @property { number } carriageCharges Carriage charges + * @property { number } reductions Reductions + * @property { number } balance Balance + * @property { number } supplements Supplements + * @property { number } miscellaneous Miscellaneous charges + * @property { number } total Total amount + */ +export const CmrDocumentCostsResponseDTOSchema = z.object({ carriageCharges: z.number().describe("Carriage charges"), reductions: z.number().describe("Reductions"), balance: z.number().describe("Balance"), supplements: z.number().describe("Supplements"), miscellaneous: z.number().describe("Miscellaneous charges"), total: z.number().describe("Total amount") }).readonly(); +export type CmrDocumentCostsResponseDTO = z.infer; + +/** + * CmrDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { number } quantity Quantity of packages + * @property { string } description Description of the cargo + * @property { string } packageType + * @property { string } statisticNumber + * @property { string } positionNumber Position number of the cargo + * @property { number } grossWeight Gross weight of the cargo + * @property { number } volume Volume of the cargo + * @property { string } containerNumber Container number of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + */ +export const CmrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().describe("Case marks of the cargo"), quantity: z.number().describe("Quantity of packages"), description: z.string().describe("Description of the cargo"), packageType: z.string(), statisticNumber: z.string(), positionNumber: z.string().describe("Position number of the cargo"), grossWeight: z.number().describe("Gross weight of the cargo"), volume: z.number().describe("Volume of the cargo"), containerNumber: z.string().describe("Container number of the cargo"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo") }).readonly(); +export type CmrDocumentCargoResponseDTO = z.infer; + +/** + * CmrDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } positionNumber Position number + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { number } versionNumber Version number of the document + * @property { string } cmrNumber CMR number + * @property { CmrDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { CmrDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { CmrDocumentBusinessPartnerResponseDTO } carrier Carrier information + * @property { CmrDocumentBusinessPartnerResponseDTO } successiveCarrier Successive carrier information + * @property { CmrDocumentCityResponseDTO } delivery Delivery information + * @property { CmrDocumentCityResponseDTO } takeover Takeover information + * @property { string } annexedDocuments Annexed documents + * @property { string } carriersObservations Carriers observations + * @property { string } senderInstructions Sender instructions + * @property { string } reimbursement Reimbursement information + * @property { string } specialAgreements Special agreements + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { boolean } freightPaid Whether freight is paid + * @property { boolean } freightToBePaid Whether freight is to be paid + * @property { string } creationPlace Place of creation + * @property { string } creationDate Date of creation + * @property { CmrDocumentCostsResponseDTO } costsForShipper Costs for shipper + * @property { CmrDocumentCostsResponseDTO } costsForConsignee Costs for consignee + * @property { string[] } selectedCargoIds List of selected cargo IDs + * @property { CmrDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CmrDocumentSettingsDtoDTO } settings Settings for the BL Instructions document + */ +export const CmrDocumentResponseDTOSchema = z.object({ id: z.string().describe("ID of the document"), name: z.string().describe("Name of the document"), positionNumber: z.string().describe("Position number"), nameSuffix: z.string().describe("Name suffix of the document").nullish(), defaultFileName: z.string(), positionId: z.string().describe("Position ID"), versionNumber: z.number().describe("Version number of the document"), cmrNumber: z.string().describe("CMR number").nullish(), consignee: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), shipper: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), carrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Carrier information").nullish(), successiveCarrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Successive carrier information").nullish(), delivery: CmrDocumentCityResponseDTOSchema.describe("Delivery information").nullish(), takeover: CmrDocumentCityResponseDTOSchema.describe("Takeover information").nullish(), annexedDocuments: z.string().describe("Annexed documents").nullish(), carriersObservations: z.string().describe("Carriers observations").nullish(), senderInstructions: z.string().describe("Sender instructions").nullish(), reimbursement: z.string().describe("Reimbursement information").nullish(), specialAgreements: z.string().describe("Special agreements").nullish(), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), freightPaid: z.boolean().describe("Whether freight is paid"), freightToBePaid: z.boolean().describe("Whether freight is to be paid"), creationPlace: z.string().describe("Place of creation"), creationDate: z.string().describe("Date of creation"), costsForShipper: CmrDocumentCostsResponseDTOSchema.describe("Costs for shipper").nullish(), costsForConsignee: CmrDocumentCostsResponseDTOSchema.describe("Costs for consignee").nullish(), selectedCargoIds: z.array(z.string()).readonly().describe("List of selected cargo IDs"), cargo: z.array(CmrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), settings: CmrDocumentSettingsDtoDTOSchema.describe("Settings for the BL Instructions document").nullish() }).readonly(); +export type CmrDocumentResponseDTO = z.infer; + +/** + * UpdateCmrDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CmrDocumentLanguage } primaryLanguage Primary language + * @property { CmrDocumentLanguage } secondaryLanguage Secondary language + */ +export const UpdateCmrDocumentSettingsRequestDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language") }).readonly(); +export type UpdateCmrDocumentSettingsRequestDTO = z.infer; + +/** + * UpdateCmrDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateCmrDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateCmrDocumentDeliveryRequestDTOSchema + * @type { object } + * @property { string } cityId City ID + * @property { string } cityName City name + * @property { string } date Date + */ +export const UpdateCmrDocumentDeliveryRequestDTOSchema = z.object({ cityId: z.string().describe("City ID"), cityName: z.string().describe("City name"), date: z.iso.datetime({ offset: true }).describe("Date") }).readonly(); +export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; + +/** + * UpdateCmrDocumentCostsRequestDTOSchema + * @type { object } + * @property { number } carriageCharges Carriage charges + * @property { number } reductions Reductions + * @property { number } balance Balance + * @property { number } supplements Supplements + * @property { number } miscellaneous Miscellaneous + * @property { number } total Total + */ +export const UpdateCmrDocumentCostsRequestDTOSchema = z.object({ carriageCharges: z.number().describe("Carriage charges"), reductions: z.number().describe("Reductions"), balance: z.number().describe("Balance"), supplements: z.number().describe("Supplements"), miscellaneous: z.number().describe("Miscellaneous"), total: z.number().describe("Total") }).readonly(); +export type UpdateCmrDocumentCostsRequestDTO = z.infer; + +/** + * UpdateCmrDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } cmrNumber CMR number + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } carrier Carrier information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } successiveCarrier Successive carrier information + * @property { UpdateCmrDocumentDeliveryRequestDTO } delivery Delivery information + * @property { UpdateCmrDocumentDeliveryRequestDTO } takeover Takeover information + * @property { string } annexedDocuments Annexed documents + * @property { string } carriersObservations Carriers observations + * @property { string } senderInstructions Sender instructions + * @property { string } reimbursement Reimbursement + * @property { string } specialAgreements Special agreements + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { boolean } freightPaid Whether freight is paid + * @property { boolean } freightToBePaid Whether freight is to be paid + * @property { string } creationPlace Place of creation + * @property { string } creationDate Date of creation + * @property { UpdateCmrDocumentCostsRequestDTO } costsForShipper Costs for shipper + * @property { UpdateCmrDocumentCostsRequestDTO } costsForConsignee Costs for consignee + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { UpdateCmrDocumentSettingsRequestDTO } settings Settings + */ +export const UpdateCmrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), cmrNumber: z.string().describe("CMR number"), consignee: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), shipper: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), carrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Carrier information"), successiveCarrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Successive carrier information"), delivery: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Delivery information"), takeover: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Takeover information"), annexedDocuments: z.string().describe("Annexed documents"), carriersObservations: z.string().describe("Carriers observations"), senderInstructions: z.string().describe("Sender instructions"), reimbursement: z.string().describe("Reimbursement"), specialAgreements: z.string().describe("Special agreements"), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), freightPaid: z.boolean().describe("Whether freight is paid"), freightToBePaid: z.boolean().describe("Whether freight is to be paid"), creationPlace: z.string().describe("Place of creation"), creationDate: z.string().describe("Date of creation"), costsForShipper: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for shipper"), costsForConsignee: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for consignee"), selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), settings: UpdateCmrDocumentSettingsRequestDTOSchema.describe("Settings") }).readonly(); +export type UpdateCmrDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts new file mode 100644 index 0000000..769f861 --- /dev/null +++ b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsCmrFormAcl } from "./workingDocumentsCmrForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsCmrFormApi } from "./workingDocumentsCmrForm.api"; + +export namespace WorkingDocumentsCmrFormQueries { +export const moduleName = QueryModule.WorkingDocumentsCmrForm; + +export const keys = { + all: [moduleName] as const, + getCmrData: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId", positionId, cmrId, officeId] as const, + previewCmr: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId/preview", positionId, cmrId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a CMR document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId } )); + return WorkingDocumentsCmrFormApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetCmrData` + * @summary Get CMR document data + * @permission Requires `canUseGetCmrData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.cmrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCmrData = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCmrData(positionId, cmrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId } )); + return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCmrData` + * @summary Update CMR document data + * @permission Requires `canUseUpdateCmrData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCmrData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId, data }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId } )); + return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, cmrId, officeId } = variables; + const updateKeys = [keys.getCmrData(positionId, cmrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteCmr` + * @summary Delete CMR document + * @permission Requires `canUseDeleteCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } CMR document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteCmr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewCmr` - recommended when file should be cached + * @summary Preview CMR document + * @permission Requires `canUsePreviewCmr` ability + * @param { string } object.positionId Path parameter + * @param { string } object.cmrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewCmr = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewCmr(positionId, cmrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewCmrMutation` - recommended when file should not be cached + * @summary Preview CMR document + * @permission Requires `canUsePreviewCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewCmrMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, cmrId, officeId } = variables; + const updateKeys = [keys.previewCmr(positionId, cmrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateCmr` + * @summary Generate CMR document + * @permission Requires `canUseGenerateCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateCmr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId, data }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts new file mode 100644 index 0000000..bd69b52 --- /dev/null +++ b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsExportDeclarationAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Create", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `useGetExportDeclarationData` query ability. For global ability, omit the object parameter. + * @description Read export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetExportDeclarationData` query + */ +export const canUseGetExportDeclarationData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `useUpdateExportDeclarationData` mutation ability. For global ability, omit the object parameter. + * @description Update export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateExportDeclarationData` mutation + */ +export const canUseUpdateExportDeclarationData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `useDeleteExportDeclaration` mutation ability. For global ability, omit the object parameter. + * @description Delete export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteExportDeclaration` mutation + */ +export const canUseDeleteExportDeclaration = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Delete", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation + */ +export const canUsePreviewExportDeclaration = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `useGenerateExportDeclaration` mutation ability. For global ability, omit the object parameter. + * @description Generate export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateExportDeclaration` mutation + */ +export const canUseGenerateExportDeclaration = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts new file mode 100644 index 0000000..9eb1a57 --- /dev/null +++ b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsExportDeclarationApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations`, + undefined, + config + ) +}; +export const getExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + config + ) +}; +export const updateExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteExportDeclaration = (positionId: string, exportDeclarationId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + undefined, + config + ) +}; +export const previewExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts new file mode 100644 index 0000000..1dc6ab5 --- /dev/null +++ b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts @@ -0,0 +1,94 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsExportDeclarationModels { +/** + * ExportDeclarationDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * ExportDeclarationDocumentCargoResponseDTOSchema + * @type { object } + * @property { number } quantity Quantity of packages + * @property { number } weight Weight of the cargo + * @property { number } length Length of the cargo + * @property { number } width Width of the cargo + * @property { number } height Height of the cargo + * @property { string } packageType Type of package + * @property { string } positionNumber Position number + */ +export const ExportDeclarationDocumentCargoResponseDTOSchema = z.object({ quantity: z.number().describe("Quantity of packages"), weight: z.number().describe("Weight of the cargo"), length: z.number().describe("Length of the cargo"), width: z.number().describe("Width of the cargo"), height: z.number().describe("Height of the cargo"), packageType: z.string().describe("Type of package"), positionNumber: z.string().describe("Position number") }).readonly(); +export type ExportDeclarationDocumentCargoResponseDTO = z.infer; + +/** + * ExportDeclarationDocumentRouteResponseDTOSchema + * @type { object } + * @property { string } pickupDate Pickup date + * @property { string } deliveryDate Delivery date + * @property { string } pickupCity Pickup city + * @property { string } deliveryCity Delivery city + */ +export const ExportDeclarationDocumentRouteResponseDTOSchema = z.object({ pickupDate: z.string().describe("Pickup date"), deliveryDate: z.string().describe("Delivery date"), pickupCity: z.string().describe("Pickup city"), deliveryCity: z.string().describe("Delivery city") }).readonly(); +export type ExportDeclarationDocumentRouteResponseDTO = z.infer; + +/** + * ExportDeclarationDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the export declaration document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the export declaration document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } dateOfHandover Date when the goods are handed over for export + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { string } issuerName Name of the issuer + * @property { string } issuerAddress Address of the issuer + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } customer Customer information + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { string } selectedCargoId ID of the selected cargo + * @property { ExportDeclarationDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { ExportDeclarationDocumentRouteResponseDTO } route Route information + * @property { string } signingPlace Place where the document is signed + * @property { string } signingDate Date when the document is signed + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } signedBy Information about who signed the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ +export const ExportDeclarationDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the export declaration document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the export declaration document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), dateOfHandover: z.iso.datetime({ offset: true }).describe("Date when the goods are handed over for export").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), versionNumber: z.number().describe("Version number of the document"), issuerName: z.string().describe("Name of the issuer").nullish(), issuerAddress: z.string().describe("Address of the issuer").nullish(), customer: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Customer information").nullish(), shipper: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), consignee: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), selectedCargoId: z.string().describe("ID of the selected cargo").nullish(), cargo: z.array(ExportDeclarationDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), route: ExportDeclarationDocumentRouteResponseDTOSchema.describe("Route information").nullish(), signingPlace: z.string().describe("Place where the document is signed").nullish(), signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed").nullish(), signedBy: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Information about who signed the document").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document").nullish() }).readonly(); +export type ExportDeclarationDocumentResponseDTO = z.infer; + +/** + * UpdateExportDeclarationDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } dateOfHandover Date when goods are handed over for export + * @property { string } issuerName Name of the issuer + * @property { string } issuerAddress Address of the issuer + * @property { string } customerId Customer ID + * @property { string } customerAddress Customer address + * @property { string } shipperId Shipper ID + * @property { string } shipperAddress Shipper address + * @property { string } consigneeId Consignee ID + * @property { string } consigneeAddress Consignee address + * @property { string } selectedCargoId Selected cargo ID + * @property { string } signingPlace Place where the document is signed + * @property { string } signingDate Date when the document is signed + * @property { string } signedByEmployeeId ID of the employee who signed the document + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateExportDeclarationDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), dateOfHandover: z.iso.datetime({ offset: true }).describe("Date when goods are handed over for export"), issuerName: z.string().describe("Name of the issuer"), issuerAddress: z.string().describe("Address of the issuer"), customerId: z.string().describe("Customer ID"), customerAddress: z.string().describe("Customer address"), shipperId: z.string().describe("Shipper ID"), shipperAddress: z.string().describe("Shipper address"), consigneeId: z.string().describe("Consignee ID"), consigneeAddress: z.string().describe("Consignee address"), selectedCargoId: z.string().describe("Selected cargo ID"), signingPlace: z.string().describe("Place where the document is signed"), signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed"), signedByEmployeeId: z.string().describe("ID of the employee who signed the document"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateExportDeclarationDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts new file mode 100644 index 0000000..e58dbad --- /dev/null +++ b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsExportDeclarationAcl } from "./workingDocumentsExportDeclaration.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsExportDeclarationApi } from "./workingDocumentsExportDeclaration.api"; + +export namespace WorkingDocumentsExportDeclarationQueries { +export const moduleName = QueryModule.WorkingDocumentsExportDeclaration; + +export const keys = { + all: [moduleName] as const, + getExportDeclarationData: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId", officeId, positionId, exportDeclarationId] as const, + previewExportDeclaration: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId/preview", officeId, positionId, exportDeclarationId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an export declaration document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId } )); + return WorkingDocumentsExportDeclarationApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetExportDeclarationData` + * @summary Get export declaration document data + * @permission Requires `canUseGetExportDeclarationData` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.exportDeclarationId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetExportDeclarationData = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), + queryFn: () => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId } )); + return WorkingDocumentsExportDeclarationApi.getExportDeclarationData(officeId, positionId, exportDeclarationId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateExportDeclarationData` + * @summary Update export declaration document data + * @permission Requires `canUseUpdateExportDeclarationData` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateExportDeclarationData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId } )); + return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData(officeId, positionId, exportDeclarationId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, exportDeclarationId } = variables; + const updateKeys = [keys.getExportDeclarationData(officeId, positionId, exportDeclarationId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteExportDeclaration` + * @summary Delete export declaration document + * @permission Requires `canUseDeleteExportDeclaration` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Export declaration document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, exportDeclarationId, officeId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration(positionId, exportDeclarationId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewExportDeclaration` - recommended when file should be cached + * @summary Preview export declaration document + * @permission Requires `canUsePreviewExportDeclaration` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.exportDeclarationId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewExportDeclaration = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), + queryFn: () => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewExportDeclarationMutation` - recommended when file should not be cached + * @summary Preview export declaration document + * @permission Requires `canUsePreviewExportDeclaration` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewExportDeclarationMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, exportDeclarationId } = variables; + const updateKeys = [keys.previewExportDeclaration(officeId, positionId, exportDeclarationId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateExportDeclaration` + * @summary Generate export declaration document + * @permission Requires `canUseGenerateExportDeclaration` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.generateExportDeclaration(officeId, positionId, exportDeclarationId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts new file mode 100644 index 0000000..9c5da4d --- /dev/null +++ b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsFcrFormAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Create", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `useGetFcrData` query ability. For global ability, omit the object parameter. + * @description Read FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetFcrData` query + */ +export const canUseGetFcrData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `useUpdateFcrData` mutation ability. For global ability, omit the object parameter. + * @description Update FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateFcrData` mutation + */ +export const canUseUpdateFcrData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `useDeleteFcr` mutation ability. For global ability, omit the object parameter. + * @description Delete FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteFcr` mutation + */ +export const canUseDeleteFcr = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Delete", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `usePreviewFcr` query or `usePreviewFcrMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewFcr` query or `usePreviewFcrMutation` mutation + */ +export const canUsePreviewFcr = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `useGenerateFcr` mutation ability. For global ability, omit the object parameter. + * @description Generate FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateFcr` mutation + */ +export const canUseGenerateFcr = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts new file mode 100644 index 0000000..0c25cd4 --- /dev/null +++ b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsFcrFormApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs`, + undefined, + config + ) +}; +export const getFcrData = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + config + ) +}; +export const updateFcrData = (positionId: string, fcrId: string, officeId: string, data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + undefined, + config + ) +}; +export const previewFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateFcr = (positionId: string, fcrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts new file mode 100644 index 0000000..3d3752b --- /dev/null +++ b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts @@ -0,0 +1,86 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsFcrFormModels { +/** + * FcrDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const FcrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type FcrDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * FcrDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { string } containerNumber Container number + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + * @property { number } quantity Quantity of the cargo + * @property { string } description Description of the cargo + * @property { number } weight Weight of the cargo + * @property { number } volume Volume of the cargo + */ +export const FcrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().describe("Case marks of the cargo"), containerNumber: z.string().describe("Container number"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo"), quantity: z.number().describe("Quantity of the cargo"), description: z.string().describe("Description of the cargo"), weight: z.number().describe("Weight of the cargo"), volume: z.number().describe("Volume of the cargo") }).readonly(); +export type FcrDocumentCargoResponseDTO = z.infer; + +/** + * FcrDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { number } versionNumber Version number of the document + * @property { string } fcrNumber FCR number + * @property { string } edvNumber EDV number + * @property { number } numberOfOriginals Number of originals + * @property { string } placeOfLoading Place of loading + * @property { string } dateOfLoading Date of loading + * @property { string } viaCity Via city + * @property { string } toDestination To destination + * @property { string } transportMode Transport mode + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } issuePlace Issue place + * @property { string } issueDate Issue date + * @property { string } deliveryTerms Delivery terms + * @property { FcrDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { FcrDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { FcrDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ +export const FcrDocumentResponseDTOSchema = z.object({ id: z.string().describe("ID of the document"), name: z.string().describe("Name of the document"), nameSuffix: z.string().describe("Name suffix of the document").nullish(), defaultFileName: z.string(), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), versionNumber: z.number().describe("Version number of the document"), fcrNumber: z.string().describe("FCR number").nullish(), edvNumber: z.string().describe("EDV number").nullish(), numberOfOriginals: z.number().describe("Number of originals"), placeOfLoading: z.string().describe("Place of loading").nullish(), dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading").nullish(), viaCity: z.string().describe("Via city").nullish(), toDestination: z.string().describe("To destination").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), issuePlace: z.string().describe("Issue place").nullish(), issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), deliveryTerms: z.string().describe("Delivery terms").nullish(), shipper: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), consignee: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), cargo: z.array(FcrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document") }).readonly(); +export type FcrDocumentResponseDTO = z.infer; + +/** + * UpdateFcrDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } fcrNumber FCR number + * @property { string } edvNumber EDV number + * @property { number } numberOfOriginals Number of originals + * @property { string } placeOfLoading Place of loading + * @property { string } dateOfLoading Date of loading + * @property { string } viaCity Via city + * @property { string } toDestination To destination + * @property { string } transportMode Transport mode + * @property { string } issuePlace Issue place + * @property { string } issueDate Issue date + * @property { string } deliveryTerms Delivery terms + * @property { string } shipperId Shipper ID + * @property { string } shipperAddress Shipper address + * @property { string } consigneeId Consignee ID + * @property { string } consigneeAddress Consignee address + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateFcrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), fcrNumber: z.string().describe("FCR number"), edvNumber: z.string().describe("EDV number"), numberOfOriginals: z.number().describe("Number of originals"), placeOfLoading: z.string().describe("Place of loading"), dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading"), viaCity: z.string().describe("Via city"), toDestination: z.string().describe("To destination"), transportMode: z.string().describe("Transport mode"), issuePlace: z.string().describe("Issue place"), issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), deliveryTerms: z.string().describe("Delivery terms"), shipperId: z.string().describe("Shipper ID"), shipperAddress: z.string().describe("Shipper address"), consigneeId: z.string().describe("Consignee ID"), consigneeAddress: z.string().describe("Consignee address"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateFcrDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts new file mode 100644 index 0000000..1479d71 --- /dev/null +++ b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsFcrFormAcl } from "./workingDocumentsFcrForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsFcrFormApi } from "./workingDocumentsFcrForm.api"; + +export namespace WorkingDocumentsFcrFormQueries { +export const moduleName = QueryModule.WorkingDocumentsFcrForm; + +export const keys = { + all: [moduleName] as const, + getFcrData: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId", positionId, fcrId, officeId] as const, + previewFcr: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId/preview", positionId, fcrId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an FCR document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId } )); + return WorkingDocumentsFcrFormApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetFcrData` + * @summary Get FCR document data + * @permission Requires `canUseGetFcrData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.fcrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetFcrData = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getFcrData(positionId, fcrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId } )); + return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateFcrData` + * @summary Update FCR document data + * @permission Requires `canUseUpdateFcrData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateFcrData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId, data }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId } )); + return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, fcrId, officeId } = variables; + const updateKeys = [keys.getFcrData(positionId, fcrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteFcr` + * @summary Delete FCR document + * @permission Requires `canUseDeleteFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } FCR document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteFcr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewFcr` - recommended when file should be cached + * @summary Preview FCR document + * @permission Requires `canUsePreviewFcr` ability + * @param { string } object.positionId Path parameter + * @param { string } object.fcrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewFcr = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewFcr(positionId, fcrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewFcrMutation` - recommended when file should not be cached + * @summary Preview FCR document + * @permission Requires `canUsePreviewFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewFcrMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, fcrId, officeId } = variables; + const updateKeys = [keys.previewFcr(positionId, fcrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateFcr` + * @summary Generate FCR document + * @permission Requires `canUseGenerateFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateFcr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId, data }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts new file mode 100644 index 0000000..a7c5b44 --- /dev/null +++ b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsHouseAwbAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Create", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `useGetHouseAwbData` query ability. For global ability, omit the object parameter. + * @description Read House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseAwbData` query + */ +export const canUseGetHouseAwbData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `useUpdateHouseAwbData` mutation ability. For global ability, omit the object parameter. + * @description Update House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseAwbData` mutation + */ +export const canUseUpdateHouseAwbData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `useDeleteHouseAwb` mutation ability. For global ability, omit the object parameter. + * @description Delete House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseAwb` mutation + */ +export const canUseDeleteHouseAwb = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Delete", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation + */ +export const canUsePreviewHouseAwb = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `useGenerateHouseAwb` mutation ability. For global ability, omit the object parameter. + * @description Generate House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseAwb` mutation + */ +export const canUseGenerateHouseAwb = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts new file mode 100644 index 0000000..319c3d3 --- /dev/null +++ b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseAwbApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs`, + undefined, + config + ) +}; +export const getHouseAwbData = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + config + ) +}; +export const updateHouseAwbData = (positionId: string, hawbId: string, officeId: string, data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + undefined, + config + ) +}; +export const previewHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateHouseAwb = (positionId: string, hawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts new file mode 100644 index 0000000..6428bad --- /dev/null +++ b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts @@ -0,0 +1,174 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseAwbModels { +/** + * HouseAwbDocumentOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + * @property { string } name Name + */ +export const HouseAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID").nullish(), sellRate: z.number().describe("Sell rate"), name: z.string().describe("Name").nullish() }).readonly(); +export type HouseAwbDocumentOtherChargeDTO = z.infer; + +/** + * HouseAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { number } totalOtherCharges Total other charges + * @property { number } total Total + * @property { HouseAwbDocumentOtherChargeDTO[] } otherCharges Other charges + */ +export const HouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), totalOtherCharges: z.number().describe("Total other charges"), total: z.number().describe("Total"), otherCharges: z.array(HouseAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); +export type HouseAwbDocumentChargesDTO = z.infer; + +/** + * HouseAwbDocumentCargoDTOSchema + * @type { object } + * @property { number } quantity Quantity + * @property { number } grossWeight Gross weight + * @property { string } rateClass Rate class + * @property { string } commodityItemNo Commodity item number + * @property { number } rateOrCharge Rate or charge + * @property { number } total Total + * @property { string } description Description + */ +export const HouseAwbDocumentCargoDTOSchema = z.object({ quantity: z.number().describe("Quantity"), grossWeight: z.number().describe("Gross weight").nullish(), rateClass: z.string().describe("Rate class").nullish(), commodityItemNo: z.string().describe("Commodity item number").nullish(), rateOrCharge: z.number().describe("Rate or charge").nullish(), total: z.number().describe("Total").nullish(), description: z.string().describe("Description").nullish() }).readonly(); +export type HouseAwbDocumentCargoDTO = z.infer; + +/** + * HouseAwbDocumentRouteDTOSchema + * @type { object } + * @property { string } airportOfDeparture Airport of departure + * @property { string } airportOfDestination Airport of destination + * @property { string } toAirport1 To airport 1 + * @property { string } byCarrier1 By carrier 1 + * @property { string } toAirport2 To airport 2 + * @property { string } byCarrier2 By carrier 2 + * @property { string } toAirport3 To airport 3 + * @property { string } byCarrier3 By carrier 3 + * @property { string } flightNumber1 Flight number 1 + * @property { string } flightDay1 Flight day 1 + * @property { string } flightNumber2 Flight number 2 + * @property { string } flightDay2 Flight day 2 + */ +export const HouseAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string().describe("Airport of departure"), airportOfDestination: z.string().describe("Airport of destination"), toAirport1: z.string().describe("To airport 1").nullish(), byCarrier1: z.string().describe("By carrier 1").nullish(), toAirport2: z.string().describe("To airport 2").nullish(), byCarrier2: z.string().describe("By carrier 2").nullish(), toAirport3: z.string().describe("To airport 3").nullish(), byCarrier3: z.string().describe("By carrier 3").nullish(), flightNumber1: z.string().describe("Flight number 1").nullish(), flightDay1: z.string().describe("Flight day 1").nullish(), flightNumber2: z.string().describe("Flight number 2").nullish(), flightDay2: z.string().describe("Flight day 2").nullish() }).readonly(); +export type HouseAwbDocumentRouteDTO = z.infer; + +/** + * HouseAwbDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const HouseAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * HouseAwbDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the House AWB document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the House AWB document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } currency Currency + * @property { number } versionNumber Version number of the document + * @property { string } hawbNumber HAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { HouseAwbDocumentCargoDTO[] } cargo Cargo packages + * @property { HouseAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } signingLocation Signing location + * @property { string } issuerIataCode Issuer IATA code + * @property { HouseAwbDocumentRouteDTO } route Route + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } issuer Issuer + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { CommonModels.DocumentConfigDTO } config Config + */ +export const HouseAwbDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the House AWB document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference"), name: z.string().describe("Name of the House AWB document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), currency: z.string().describe("Currency").nullish(), versionNumber: z.number().describe("Version number of the document"), hawbNumber: z.string().describe("HAWB number").nullish(), sciReference: z.string().describe("SCI reference").nullish(), reference1: z.string().describe("Reference 1").nullish(), reference2: z.string().describe("Reference 2").nullish(), reference3: z.string().describe("Reference 3").nullish(), exchangeRate: z.number().describe("Exchange rate").nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), handlingInstructions: z.string().describe("Handling instructions").nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), cargo: z.array(HouseAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), charges: HouseAwbDocumentChargesDTOSchema.describe("Charges").nullish(), shipperSigner: z.string().describe("Shipper signer").nullish(), shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), signer: z.string().describe("Signer").nullish(), signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), signingLocation: z.string().describe("Signing location").nullish(), issuerIataCode: z.string().describe("Issuer IATA code").nullish(), route: HouseAwbDocumentRouteDTOSchema.describe("Route").nullish(), issuer: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), consignee: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), shipper: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish() }).readonly(); +export type HouseAwbDocumentResponseDTO = z.infer; + +/** + * UpdateHouseAwbDocumentChargesOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + */ +export const UpdateHouseAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }).readonly(); +export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer; + +/** + * UpdateHouseAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { UpdateHouseAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges + */ +export const UpdateHouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), otherCharges: z.array(UpdateHouseAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); +export type UpdateHouseAwbDocumentChargesDTO = z.infer; + +/** + * UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateHouseAwbDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } hawbNumber HAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { UpdateHouseAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } issuerId Issuer ID + * @property { string } issuerName Issuer name + * @property { string } issuerAddress Issuer address + * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateHouseAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), hawbNumber: z.string().describe("HAWB number"), sciReference: z.string().describe("SCI reference"), reference1: z.string().describe("Reference 1"), reference2: z.string().describe("Reference 2"), reference3: z.string().describe("Reference 3"), exchangeRate: z.number().describe("Exchange rate"), additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), handlingInstructions: z.string().describe("Handling instructions"), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), additionalAccountingNotes: z.string().describe("Additional accounting notes"), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), charges: UpdateHouseAwbDocumentChargesDTOSchema.describe("Charges"), shipperSigner: z.string().describe("Shipper signer"), shipperSignerUserName: z.string().describe("Shipper signer user name"), signer: z.string().describe("Signer"), signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), issuerId: z.string().describe("Issuer ID"), issuerName: z.string().describe("Issuer name"), issuerAddress: z.string().describe("Issuer address"), consignee: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), shipper: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateHouseAwbDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts new file mode 100644 index 0000000..8062a30 --- /dev/null +++ b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsHouseAwbAcl } from "./workingDocumentsHouseAwb.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsHouseAwbApi } from "./workingDocumentsHouseAwb.api"; + +export namespace WorkingDocumentsHouseAwbQueries { +export const moduleName = QueryModule.WorkingDocumentsHouseAwb; + +export const keys = { + all: [moduleName] as const, + getHouseAwbData: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId", positionId, hawbId, officeId] as const, + previewHouseAwb: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId/preview", positionId, hawbId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a House AWB document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId } )); + return WorkingDocumentsHouseAwbApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetHouseAwbData` + * @summary Get House AWB document data + * @permission Requires `canUseGetHouseAwbData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.hawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetHouseAwbData = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId } )); + return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateHouseAwbData` + * @summary Update House AWB document data + * @permission Requires `canUseUpdateHouseAwbData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateHouseAwbData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId } )); + return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, hawbId, officeId } = variables; + const updateKeys = [keys.getHouseAwbData(positionId, hawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteHouseAwb` + * @summary Delete House AWB document + * @permission Requires `canUseDeleteHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } House AWB document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewHouseAwb` - recommended when file should be cached + * @summary Preview House AWB document + * @permission Requires `canUsePreviewHouseAwb` ability + * @param { string } object.positionId Path parameter + * @param { string } object.hawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseAwb = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewHouseAwbMutation` - recommended when file should not be cached + * @summary Preview House AWB document + * @permission Requires `canUsePreviewHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, hawbId, officeId } = variables; + const updateKeys = [keys.previewHouseAwb(positionId, hawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateHouseAwb` + * @summary Generate House AWB document + * @permission Requires `canUseGenerateHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts new file mode 100644 index 0000000..7e3bdd2 --- /dev/null +++ b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts @@ -0,0 +1,108 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsHouseBlAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Create", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useGetHouseBlData` query ability. For global ability, omit the object parameter. + * @description Read house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseBlData` query + */ +export const canUseGetHouseBlData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useUpdateHouseBlData` mutation ability. For global ability, omit the object parameter. + * @description Update house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseBlData` mutation + */ +export const canUseUpdateHouseBlData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useDeleteHouseBl` mutation ability. For global ability, omit the object parameter. + * @description Delete house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseBl` mutation + */ +export const canUseDeleteHouseBl = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Delete", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation + */ +export const canUsePreviewHouseBl = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview house BL document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation + */ +export const canUsePreviewHouseBlEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useGenerateHouseBl` mutation ability. For global ability, omit the object parameter. + * @description Generate house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseBl` mutation + */ +export const canUseGenerateHouseBl = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate house BL document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ +export const canUseGenerateDocumentEml = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts new file mode 100644 index 0000000..c137af4 --- /dev/null +++ b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts @@ -0,0 +1,91 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseBlApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls`, + undefined, + config + ) +}; +export const getHouseBlData = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + config + ) +}; +export const updateHouseBlData = (positionId: string, houseBlId: string, officeId: string, data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteHouseBl = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + undefined, + config + ) +}; +export const previewHouseBl = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const previewHouseBlEml = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateHouseBl = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +export const generateDocumentEml = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts new file mode 100644 index 0000000..ad68756 --- /dev/null +++ b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts @@ -0,0 +1,196 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsHouseBlModels { +/** + * HouseBlDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { number } quantityOfCopies Quantity of copies + * @property { string } date Date + * @property { string } location Location + * @property { string } signer Signer + * @property { boolean } hideSignature Hide signature + * @property { boolean } capsLock Render issuer/signer in caps lock + * @property { string } documentTitle Document title + */ +export const HouseBlDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), quantityOfCopies: z.number().describe("Quantity of copies"), date: z.iso.datetime({ offset: true }).describe("Date"), location: z.string().describe("Location"), signer: z.string().describe("Signer"), hideSignature: z.boolean().describe("Hide signature"), capsLock: z.boolean().describe("Render issuer/signer in caps lock"), documentTitle: z.string().describe("Document title") }).readonly(); +export type HouseBlDocumentSettingsDtoDTO = z.infer; + +/** + * HouseBlDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const HouseBlDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * HouseBlDocumentCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ +export const HouseBlDocumentCountryResponseDTOSchema = z.object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }).readonly(); +export type HouseBlDocumentCountryResponseDTO = z.infer; + +/** + * HouseBlDocumentPlaceResponseDTOSchema + * @type { object } + * @property { string } id ID of the place + * @property { string } name Name of the place + */ +export const HouseBlDocumentPlaceResponseDTOSchema = z.object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }).readonly(); +export type HouseBlDocumentPlaceResponseDTO = z.infer; + +/** + * HouseBlDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ +export const HouseBlDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }).readonly(); +export type HouseBlDocumentPortResponseDTO = z.infer; + +/** + * HouseBlDocumentTerminalResponseDTOSchema + * @type { object } + * @property { string } id ID of the terminal + * @property { string } name Name of the terminal + */ +export const HouseBlDocumentTerminalResponseDTOSchema = z.object({ id: z.string().describe("ID of the terminal"), name: z.string().describe("Name of the terminal") }).readonly(); +export type HouseBlDocumentTerminalResponseDTO = z.infer; + +/** + * HouseBlDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the house BL document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the house BL document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } blNumber Bill of lading number + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } exportReference Export reference number + * @property { HouseBlDocumentBusinessPartnerResponseDTO } forwarder Forwarder information for the shipment + * @property { HouseBlDocumentCountryResponseDTO } originCountry Origin country + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { CommonModels.EditorContentResponseDto } additionalTextTop Additional text for the document + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { HouseBlDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } cargoReleaseBy Delivery agent information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information + * @property { HouseBlDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information + * @property { string } precarriageByText Pre-carriage by free-text override + * @property { HouseBlDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information + * @property { string } placeOfReceiptText Place of receipt free-text override + * @property { string } vessel Name of the vessel + * @property { string } voyage Voyage number of the vessel + * @property { string } declaredValue Declared value of the shipment + * @property { number } rateOfExchange Rate of exchange of the shipment + * @property { string } currency Currency of the shipment + * @property { string } freightPayable Freight payable of the shipment + * @property { string } issuer Issuer + * @property { HouseBlDocumentPortResponseDTO } portOfLoading Port of loading information + * @property { string } portOfLoadingText Port of loading free-text override + * @property { HouseBlDocumentTerminalResponseDTO } loadingPierTerminal Loading pier/terminal information + * @property { string } loadingPierTerminalText Loading pier/terminal free-text override + * @property { HouseBlDocumentPortResponseDTO } portOfDischarge Port of discharge information + * @property { string } portOfDischargeText Port of discharge free-text override + * @property { HouseBlDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information + * @property { string } placeOfDeliveryText Place of delivery free-text override + * @property { HouseBlDocumentPlaceResponseDTO } originalsToBeReleasedAt Originals to be released at information + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { string } typeOfMove Type of move + * @property { string } placeOfIssue + * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data + * @property { HouseBlDocumentSettingsDtoDTO } settings Settings for the House BL document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ +export const HouseBlDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the house BL document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the house BL document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), blNumber: z.string().describe("Bill of lading number").nullish(), carrierBookingNumber: z.string().describe("Carrier booking number").nullish(), exportReference: z.string().describe("Export reference number").nullish(), forwarder: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Forwarder information for the shipment").nullish(), originCountry: HouseBlDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), additionalTextTop: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), versionNumber: z.number().describe("Version number of the document"), consignee: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information for the shipment"), shipper: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), cargoReleaseBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Delivery agent information for the shipment").nullish(), notify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Notify party information for the shipment"), alsoNotify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Additional notify party information"), precarriageBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), precarriageByText: z.string().describe("Pre-carriage by free-text override").nullish(), placeOfReceipt: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), placeOfReceiptText: z.string().describe("Place of receipt free-text override").nullish(), vessel: z.string().describe("Name of the vessel").nullish(), voyage: z.string().describe("Voyage number of the vessel").nullish(), declaredValue: z.string().describe("Declared value of the shipment").nullish(), rateOfExchange: z.number().describe("Rate of exchange of the shipment").nullish(), currency: z.string().describe("Currency of the shipment").nullish(), freightPayable: z.string().describe("Freight payable of the shipment").nullish(), issuer: z.string().describe("Issuer").nullish(), portOfLoading: HouseBlDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), portOfLoadingText: z.string().describe("Port of loading free-text override").nullish(), loadingPierTerminal: HouseBlDocumentTerminalResponseDTOSchema.describe("Loading pier/terminal information").nullish(), loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override").nullish(), portOfDischarge: HouseBlDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), portOfDischargeText: z.string().describe("Port of discharge free-text override").nullish(), placeOfDelivery: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), placeOfDeliveryText: z.string().describe("Place of delivery free-text override").nullish(), originalsToBeReleasedAt: HouseBlDocumentPlaceResponseDTOSchema.describe("Originals to be released at information").nullish(), originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override").nullish(), typeOfMove: z.string().describe("Type of move").nullish(), placeOfIssue: z.string().nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), settings: HouseBlDocumentSettingsDtoDTOSchema.describe("Settings for the House BL document").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document") }).readonly(); +export type HouseBlDocumentResponseDTO = z.infer; + +/** + * UpdateHouseBlDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { number } quantityOfCopies Quantity of copies + * @property { string } blNumber BL number + * @property { string } exportReference Export reference number + * @property { string } location Location + * @property { string } signer Signer + * @property { boolean } hideSignature Hide signature + * @property { boolean } capsLock Render issuer/signer in caps lock + * @property { string } date Date + * @property { string } documentTitle Document title + */ +export const UpdateHouseBlDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), quantityOfCopies: z.number().describe("Quantity of copies"), blNumber: z.string().describe("BL number"), exportReference: z.string().describe("Export reference number"), location: z.string().describe("Location"), signer: z.string().describe("Signer"), hideSignature: z.boolean().describe("Hide signature"), capsLock: z.boolean().describe("Render issuer/signer in caps lock"), date: z.iso.datetime({ offset: true }).describe("Date"), documentTitle: z.string().describe("Document title") }).readonly(); +export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; + +/** + * UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateHouseBlDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } blNumber Bill of lading number + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } exportReference Export reference number + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } forwarder Forwarder information + * @property { string } originCountryId Origin country ID + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } declaredValue Declared value + * @property { number } rateOfExchange Rate of exchange + * @property { string } freightPayable Freight payable + * @property { string } issuer Issuer + * @property { string } placeOfIssue Place of issue + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text + * @property { CommonModels.EditorContentUpdateDto } additionalTextTop Additional text top + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } notify Notify party information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } cargoReleaseBy Cargo release party information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information + * @property { string } precarriageById Pre-carriage by ID + * @property { string } precarriageByText Pre-carriage by free-text override + * @property { string } placeOfReceiptId Place of receipt ID + * @property { string } placeOfReceiptText Place of receipt free-text override + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } portOfLoadingId Port of loading ID + * @property { string } portOfLoadingText Port of loading free-text override + * @property { string } loadingPierTerminalId Loading pier/terminal ID + * @property { string } loadingPierTerminalText Loading pier/terminal free-text override + * @property { string } portOfDischargeId Port of discharge ID + * @property { string } portOfDischargeText Port of discharge free-text override + * @property { string } placeOfDeliveryId Place of delivery ID + * @property { string } placeOfDeliveryText Place of delivery free-text override + * @property { string } originalsToBeReleasedAtId Originals to be released at ID + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { string } typeOfMove Type of move + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { UpdateHouseBlDocumentSettingsRequestDTO } settings Settings + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data + */ +export const UpdateHouseBlDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), blNumber: z.string().describe("Bill of lading number"), carrierBookingNumber: z.string().describe("Carrier booking number"), exportReference: z.string().describe("Export reference number"), forwarder: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), originCountryId: z.string().describe("Origin country ID"), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), declaredValue: z.string().describe("Declared value"), rateOfExchange: z.number().describe("Rate of exchange"), freightPayable: z.string().describe("Freight payable"), issuer: z.string().describe("Issuer"), placeOfIssue: z.string().describe("Place of issue"), additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), additionalTextTop: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text top"), consignee: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), shipper: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), notify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), cargoReleaseBy: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Cargo release party information"), alsoNotify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), precarriageById: z.string().describe("Pre-carriage by ID"), precarriageByText: z.string().describe("Pre-carriage by free-text override"), placeOfReceiptId: z.string().describe("Place of receipt ID"), placeOfReceiptText: z.string().describe("Place of receipt free-text override"), vessel: z.string().describe("Vessel name"), voyage: z.string().describe("Voyage number"), portOfLoadingId: z.string().describe("Port of loading ID"), portOfLoadingText: z.string().describe("Port of loading free-text override"), loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override"), portOfDischargeId: z.string().describe("Port of discharge ID"), portOfDischargeText: z.string().describe("Port of discharge free-text override"), placeOfDeliveryId: z.string().describe("Place of delivery ID"), placeOfDeliveryText: z.string().describe("Place of delivery free-text override"), originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), typeOfMove: z.string().describe("Type of move"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), settings: UpdateHouseBlDocumentSettingsRequestDTOSchema.describe("Settings"), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data") }).readonly(); +export type UpdateHouseBlDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts new file mode 100644 index 0000000..ea0ca6a --- /dev/null +++ b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts @@ -0,0 +1,297 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsHouseBlAcl } from "./workingDocumentsHouseBl.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsHouseBlApi } from "./workingDocumentsHouseBl.api"; + +export namespace WorkingDocumentsHouseBlQueries { +export const moduleName = QueryModule.WorkingDocumentsHouseBl; + +export const keys = { + all: [moduleName] as const, + getHouseBlData: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId", positionId, houseBlId, officeId] as const, + previewHouseBl: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview", positionId, houseBlId, officeId] as const, + previewHouseBlEml: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview/eml", positionId, houseBlId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a house BL document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId } )); + return WorkingDocumentsHouseBlApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetHouseBlData` + * @summary Get house BL document data + * @permission Requires `canUseGetHouseBlData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetHouseBlData = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId } )); + return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateHouseBlData` + * @summary Update house BL document data + * @permission Requires `canUseUpdateHouseBlData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateHouseBlData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId } )); + return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.getHouseBlData(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteHouseBl` + * @summary Delete house BL document + * @permission Requires `canUseDeleteHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } House BL document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteHouseBl = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewHouseBl` - recommended when file should be cached + * @summary Preview house BL document + * @permission Requires `canUsePreviewHouseBl` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBl = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewHouseBlMutation` - recommended when file should not be cached + * @summary Preview house BL document + * @permission Requires `canUsePreviewHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewHouseBlEml` - recommended when file should be cached + * @summary Preview house BL document and return EML file + * @permission Requires `canUsePreviewHouseBlEml` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBlEml = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewHouseBlEmlMutation` - recommended when file should not be cached + * @summary Preview house BL document and return EML file + * @permission Requires `canUsePreviewHouseBlEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBlEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateHouseBl` + * @summary Generate house BL document + * @permission Requires `canUseGenerateHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateHouseBl = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate house BL document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId } )); + return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts new file mode 100644 index 0000000..99aadd5 --- /dev/null +++ b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsIsfFormAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Create", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `useGetIsfData` query ability. For global ability, omit the object parameter. + * @description Read ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetIsfData` query + */ +export const canUseGetIsfData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `useUpdateIsfData` mutation ability. For global ability, omit the object parameter. + * @description Update ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIsfData` mutation + */ +export const canUseUpdateIsfData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `useDeleteIsf` mutation ability. For global ability, omit the object parameter. + * @description Delete ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteIsf` mutation + */ +export const canUseDeleteIsf = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Delete", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `usePreviewIsf` query or `usePreviewIsfMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewIsf` query or `usePreviewIsfMutation` mutation + */ +export const canUsePreviewIsf = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `useGenerateIsf` mutation ability. For global ability, omit the object parameter. + * @description Generate ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIsf` mutation + */ +export const canUseGenerateIsf = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts new file mode 100644 index 0000000..a618bc0 --- /dev/null +++ b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsIsfFormApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs`, + undefined, + config + ) +}; +export const getIsfData = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + config + ) +}; +export const updateIsfData = (positionId: string, isfId: string, officeId: string, data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + undefined, + config + ) +}; +export const previewIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateIsf = (positionId: string, isfId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts new file mode 100644 index 0000000..7e851f1 --- /dev/null +++ b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts @@ -0,0 +1,154 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsIsfFormModels { +/** + * IsfDocumentCargoCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ +export const IsfDocumentCargoCountryResponseDTOSchema = z.object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }).readonly(); +export type IsfDocumentCargoCountryResponseDTO = z.infer; + +/** + * IsfDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } productCode Product code of the cargo + * @property { string } descriptionOfGoods Description of goods + * @property { string } htsCode HTS code of the cargo + * @property { string } manufacturerSupplier Manufacturer supplier of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + * @property { IsfDocumentCargoCountryResponseDTO } countryOfOrigin Country of origin of the cargo + */ +export const IsfDocumentCargoResponseDTOSchema = z.object({ productCode: z.string().describe("Product code of the cargo"), descriptionOfGoods: z.string().describe("Description of goods"), htsCode: z.string().describe("HTS code of the cargo"), manufacturerSupplier: z.string().describe("Manufacturer supplier of the cargo"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo"), countryOfOrigin: IsfDocumentCargoCountryResponseDTOSchema.describe("Country of origin of the cargo") }).readonly(); +export type IsfDocumentCargoResponseDTO = z.infer; + +/** + * IsfDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ +export const IsfDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }).readonly(); +export type IsfDocumentPortResponseDTO = z.infer; + +/** + * IsfDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + * @property { string } number Number of the business partner + */ +export const IsfDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner"), number: z.string().describe("Number of the business partner") }).readonly(); +export type IsfDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * IsfDocumentContainerLocationResponseDTOSchema + * @type { object } + * @property { string } id ID of the container location + * @property { string } name Name of the container location + * @property { string } address Address of the container location + */ +export const IsfDocumentContainerLocationResponseDTOSchema = z.object({ id: z.string().describe("ID of the container location"), name: z.string().describe("Name of the container location"), address: z.string().describe("Address of the container location") }).readonly(); +export type IsfDocumentContainerLocationResponseDTO = z.infer; + +/** + * IsfDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { number } versionNumber Version number of the document + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } hBLNumber HBL number + * @property { string } mBLNumber MBL number + * @property { string } scacCodeHBL SCAC code for HBL + * @property { string } scacCodeMBL SCAC code for MBL + * @property { IsfDocumentPortResponseDTO } portOfDischarge Port of discharge + * @property { string } issueLocation Issue location + * @property { string } issueDate Issue date + * @property { string } companyName Company name + * @property { object } completedBy + * @property { string } completedBy.name + * @property { string } completedBy.email + * @property { object } container + * @property { string } container.id + * @property { string } container.name + * @property { IsfDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { IsfDocumentBusinessPartnerResponseDTO } manufacturer Manufacturer information + * @property { IsfDocumentBusinessPartnerResponseDTO } seller Seller information + * @property { IsfDocumentBusinessPartnerResponseDTO } buyer Buyer information + * @property { IsfDocumentBusinessPartnerResponseDTO } consolidator Consolidator information + * @property { IsfDocumentContainerLocationResponseDTO } containerLocation Container location information + * @property { IsfDocumentBusinessPartnerResponseDTO } shipTo Ship to information + * @property { IsfDocumentBusinessPartnerResponseDTO } importer Importer information + * @property { IsfDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + */ +export const IsfDocumentResponseDTOSchema = z.object({ id: z.string().describe("ID of the document"), name: z.string().describe("Name of the document"), nameSuffix: z.string().describe("Name suffix of the document").nullish(), defaultFileName: z.string(), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), versionNumber: z.number().describe("Version number of the document"), vessel: z.string().describe("Vessel name").nullish(), voyage: z.string().describe("Voyage number").nullish(), hBLNumber: z.string().describe("HBL number").nullish(), mBLNumber: z.string().describe("MBL number").nullish(), scacCodeHBL: z.string().describe("SCAC code for HBL").nullish(), scacCodeMBL: z.string().describe("SCAC code for MBL").nullish(), portOfDischarge: IsfDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), issueLocation: z.string().describe("Issue location").nullish(), issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), companyName: z.string().describe("Company name").nullish(), completedBy: z.object({ name: z.string(), email: z.string() }).readonly().nullish(), container: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), consignee: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), manufacturer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Manufacturer information").nullish(), seller: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Seller information").nullish(), buyer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Buyer information").nullish(), consolidator: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consolidator information").nullish(), containerLocation: IsfDocumentContainerLocationResponseDTOSchema.describe("Container location information").nullish(), shipTo: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Ship to information").nullish(), importer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Importer information").nullish(), cargo: z.array(IsfDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish() }).readonly(); +export type IsfDocumentResponseDTO = z.infer; + +/** + * UpdateIsfDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + * @property { string } number Business partner number + */ +export const UpdateIsfDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address"), number: z.string().describe("Business partner number") }).readonly(); +export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateIsfDocumentCargoRequestDTOSchema + * @type { object } + * @property { string } productCode Product code + * @property { string } descriptionOfGoods Description of goods + * @property { string } htsCode HTS code + * @property { string } manufacturerSupplier Manufacturer supplier + * @property { string } countryOfOriginId Country of origin ID + */ +export const UpdateIsfDocumentCargoRequestDTOSchema = z.object({ productCode: z.string().describe("Product code"), descriptionOfGoods: z.string().describe("Description of goods"), htsCode: z.string().describe("HTS code"), manufacturerSupplier: z.string().describe("Manufacturer supplier"), countryOfOriginId: z.string().describe("Country of origin ID") }).readonly(); +export type UpdateIsfDocumentCargoRequestDTO = z.infer; + +/** + * UpdateIsfDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } hBLNumber HBL number + * @property { string } mBLNumber MBL number + * @property { string } scacCodeHBL SCAC code for HBL + * @property { string } scacCodeMBL SCAC code for MBL + * @property { string } portOfDischargeId Port of discharge Id + * @property { string } issueLocation Issue location + * @property { string } issueDate Issue date + * @property { string } companyName Company name + * @property { string } completedByName Completed by name + * @property { string } completedByEmail Completed by email + * @property { string } containerId Container ID + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } manufacturer Manufacturer information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } seller Seller information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } buyer Buyer information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consolidator Consolidator information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } containerLocation Container location information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } shipTo Ship to information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } importer Importer information + * @property { UpdateIsfDocumentCargoRequestDTO[] } cargo Cargo information + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateIsfDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), vessel: z.string().describe("Vessel name"), voyage: z.string().describe("Voyage number"), hBLNumber: z.string().describe("HBL number"), mBLNumber: z.string().describe("MBL number"), scacCodeHBL: z.string().describe("SCAC code for HBL"), scacCodeMBL: z.string().describe("SCAC code for MBL"), portOfDischargeId: z.string().describe("Port of discharge Id"), issueLocation: z.string().describe("Issue location"), issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), companyName: z.string().describe("Company name"), completedByName: z.string().describe("Completed by name"), completedByEmail: z.string().describe("Completed by email"), containerId: z.string().describe("Container ID"), consignee: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), manufacturer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Manufacturer information"), seller: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), buyer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), consolidator: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consolidator information"), containerLocation: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Container location information"), shipTo: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Ship to information"), importer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Importer information"), cargo: z.array(UpdateIsfDocumentCargoRequestDTOSchema).readonly().describe("Cargo information"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateIsfDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts new file mode 100644 index 0000000..7974d64 --- /dev/null +++ b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsIsfFormAcl } from "./workingDocumentsIsfForm.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsIsfFormApi } from "./workingDocumentsIsfForm.api"; + +export namespace WorkingDocumentsIsfFormQueries { +export const moduleName = QueryModule.WorkingDocumentsIsfForm; + +export const keys = { + all: [moduleName] as const, + getIsfData: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId", positionId, isfId, officeId] as const, + previewIsf: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId/preview", positionId, isfId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an ISF document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId } )); + return WorkingDocumentsIsfFormApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetIsfData` + * @summary Get ISF document data + * @permission Requires `canUseGetIsfData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.isfId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetIsfData = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getIsfData(positionId, isfId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId } )); + return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateIsfData` + * @summary Update ISF document data + * @permission Requires `canUseUpdateIsfData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateIsfData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId, data }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId } )); + return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, isfId, officeId } = variables; + const updateKeys = [keys.getIsfData(positionId, isfId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteIsf` + * @summary Delete ISF document + * @permission Requires `canUseDeleteIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } ISF document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteIsf = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewIsf` - recommended when file should be cached + * @summary Preview ISF document + * @permission Requires `canUsePreviewIsf` ability + * @param { string } object.positionId Path parameter + * @param { string } object.isfId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewIsf = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewIsf(positionId, isfId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewIsfMutation` - recommended when file should not be cached + * @summary Preview ISF document + * @permission Requires `canUsePreviewIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewIsfMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, isfId, officeId } = variables; + const updateKeys = [keys.previewIsf(positionId, isfId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateIsf` + * @summary Generate ISF document + * @permission Requires `canUseGenerateIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateIsf = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId, data }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts new file mode 100644 index 0000000..10d4871 --- /dev/null +++ b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts @@ -0,0 +1,82 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsMasterAwbAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Create", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `useGetMasterAwbData` query ability. For global ability, omit the object parameter. + * @description Read Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMasterAwbData` query + */ +export const canUseGetMasterAwbData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `useUpdateMasterAwbData` mutation ability. For global ability, omit the object parameter. + * @description Update Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateMasterAwbData` mutation + */ +export const canUseUpdateMasterAwbData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `useDeleteMasterAwb` mutation ability. For global ability, omit the object parameter. + * @description Delete Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteMasterAwb` mutation + */ +export const canUseDeleteMasterAwb = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Delete", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation + */ +export const canUsePreviewMasterAwb = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `useGenerateMasterAwb` mutation ability. For global ability, omit the object parameter. + * @description Generate Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateMasterAwb` mutation + */ +export const canUseGenerateMasterAwb = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts new file mode 100644 index 0000000..905a525 --- /dev/null +++ b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts @@ -0,0 +1,62 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsMasterAwbApi { +export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs`, + undefined, + config + ) +}; +export const getMasterAwbData = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + config + ) +}; +export const updateMasterAwbData = (positionId: string, mawbId: string, officeId: string, data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), + config + ) +}; +export const deleteMasterAwb = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + undefined, + config + ) +}; +export const previewMasterAwb = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateMasterAwb = (positionId: string, mawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +} diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts new file mode 100644 index 0000000..4483704 --- /dev/null +++ b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts @@ -0,0 +1,176 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsMasterAwbModels { +/** + * MasterAwbDocumentOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + * @property { string } name Name + */ +export const MasterAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID").nullish(), sellRate: z.number().describe("Sell rate"), name: z.string().describe("Name").nullish() }).readonly(); +export type MasterAwbDocumentOtherChargeDTO = z.infer; + +/** + * MasterAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { number } totalOtherCharges Total other charges + * @property { number } total Total + * @property { MasterAwbDocumentOtherChargeDTO[] } otherCharges Other charges + */ +export const MasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), totalOtherCharges: z.number().describe("Total other charges"), total: z.number().describe("Total"), otherCharges: z.array(MasterAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); +export type MasterAwbDocumentChargesDTO = z.infer; + +/** + * MasterAwbDocumentCargoDTOSchema + * @type { object } + * @property { number } quantity Quantity + * @property { number } grossWeight Gross weight + * @property { string } rateClass Rate class + * @property { string } commodityItemNo Commodity item number + * @property { number } rateOrCharge Rate or charge + * @property { number } total Total + * @property { string } description Description + */ +export const MasterAwbDocumentCargoDTOSchema = z.object({ quantity: z.number().describe("Quantity"), grossWeight: z.number().describe("Gross weight").nullish(), rateClass: z.string().describe("Rate class").nullish(), commodityItemNo: z.string().describe("Commodity item number").nullish(), rateOrCharge: z.number().describe("Rate or charge").nullish(), total: z.number().describe("Total").nullish(), description: z.string().describe("Description").nullish() }).readonly(); +export type MasterAwbDocumentCargoDTO = z.infer; + +/** + * MasterAwbDocumentRouteDTOSchema + * @type { object } + * @property { string } airportOfDeparture Airport of departure + * @property { string } airportOfDestination Airport of destination + * @property { string } toAirport1 To airport 1 + * @property { string } byCarrier1 By carrier 1 + * @property { string } toAirport2 To airport 2 + * @property { string } byCarrier2 By carrier 2 + * @property { string } toAirport3 To airport 3 + * @property { string } byCarrier3 By carrier 3 + * @property { string } flightNumber1 Flight number 1 + * @property { string } flightDay1 Flight day 1 + * @property { string } flightNumber2 Flight number 2 + * @property { string } flightDay2 Flight day 2 + */ +export const MasterAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string().describe("Airport of departure"), airportOfDestination: z.string().describe("Airport of destination"), toAirport1: z.string().describe("To airport 1").nullish(), byCarrier1: z.string().describe("By carrier 1").nullish(), toAirport2: z.string().describe("To airport 2").nullish(), byCarrier2: z.string().describe("By carrier 2").nullish(), toAirport3: z.string().describe("To airport 3").nullish(), byCarrier3: z.string().describe("By carrier 3").nullish(), flightNumber1: z.string().describe("Flight number 1").nullish(), flightDay1: z.string().describe("Flight day 1").nullish(), flightNumber2: z.string().describe("Flight number 2").nullish(), flightDay2: z.string().describe("Flight day 2").nullish() }).readonly(); +export type MasterAwbDocumentRouteDTO = z.infer; + +/** + * MasterAwbDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const MasterAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer; + +/** + * MasterAwbDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the Master AWB document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the Master AWB document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } currency Currency + * @property { number } versionNumber Version number of the document + * @property { string } mawbNumber MAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { MasterAwbDocumentCargoDTO[] } cargo Cargo packages + * @property { MasterAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } signingLocation Signing location + * @property { string } issuerIataCode Issuer IATA code + * @property { number } exchangeRate Exchange rate + * @property { MasterAwbDocumentRouteDTO } route Route + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } issuer Issuer + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { CommonModels.DocumentConfigDTO } config Config + */ +export const MasterAwbDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the Master AWB document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference"), name: z.string().describe("Name of the Master AWB document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), currency: z.string().describe("Currency").nullish(), versionNumber: z.number().describe("Version number of the document"), mawbNumber: z.string().describe("MAWB number").nullish(), sciReference: z.string().describe("SCI reference").nullish(), reference1: z.string().describe("Reference 1").nullish(), reference2: z.string().describe("Reference 2").nullish(), reference3: z.string().describe("Reference 3").nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), handlingInstructions: z.string().describe("Handling instructions").nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), cargo: z.array(MasterAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), charges: MasterAwbDocumentChargesDTOSchema.describe("Charges").nullish(), shipperSigner: z.string().describe("Shipper signer").nullish(), shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), signer: z.string().describe("Signer").nullish(), signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), signingLocation: z.string().describe("Signing location").nullish(), issuerIataCode: z.string().describe("Issuer IATA code").nullish(), exchangeRate: z.number().describe("Exchange rate").nullish(), route: MasterAwbDocumentRouteDTOSchema.describe("Route").nullish(), consignee: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), shipper: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), issuer: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish() }).readonly(); +export type MasterAwbDocumentResponseDTO = z.infer; + +/** + * UpdateMasterAwbDocumentChargesOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + */ +export const UpdateMasterAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }).readonly(); +export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer; + +/** + * UpdateMasterAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { UpdateMasterAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges + */ +export const UpdateMasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), otherCharges: z.array(UpdateMasterAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); +export type UpdateMasterAwbDocumentChargesDTO = z.infer; + +/** + * UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); +export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateMasterAwbDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } mawbNumber MAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { UpdateMasterAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } issuerId Issuer ID + * @property { string } issuerName Issuer name + * @property { string } issuerAddress Issuer address + * @property { string } issuerCity Issuer city + * @property { string } issuerIataCode Issuer IATA code + * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateMasterAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), mawbNumber: z.string().describe("MAWB number"), sciReference: z.string().describe("SCI reference"), reference1: z.string().describe("Reference 1"), reference2: z.string().describe("Reference 2"), reference3: z.string().describe("Reference 3"), additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text for the document"), handlingInstructions: z.string().describe("Handling instructions"), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), additionalAccountingNotes: z.string().describe("Additional accounting notes"), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), charges: UpdateMasterAwbDocumentChargesDTOSchema.describe("Charges"), shipperSigner: z.string().describe("Shipper signer"), shipperSignerUserName: z.string().describe("Shipper signer user name"), signer: z.string().describe("Signer"), signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), issuerId: z.string().describe("Issuer ID"), issuerName: z.string().describe("Issuer name"), issuerAddress: z.string().describe("Issuer address"), issuerCity: z.string().describe("Issuer city"), issuerIataCode: z.string().describe("Issuer IATA code"), consignee: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), shipper: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), exchangeRate: z.number().describe("Exchange rate"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); +export type UpdateMasterAwbDocumentRequestDTO = z.infer; + +} diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts new file mode 100644 index 0000000..89bd2fa --- /dev/null +++ b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts @@ -0,0 +1,212 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsMasterAwbAcl } from "./workingDocumentsMasterAwb.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsMasterAwbApi } from "./workingDocumentsMasterAwb.api"; + +export namespace WorkingDocumentsMasterAwbQueries { +export const moduleName = QueryModule.WorkingDocumentsMasterAwb; + +export const keys = { + all: [moduleName] as const, + getMasterAwbData: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId", positionId, mawbId, officeId] as const, + previewMasterAwb: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId/preview", positionId, mawbId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a Master AWB document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId } )); + return WorkingDocumentsMasterAwbApi.create(positionId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetMasterAwbData` + * @summary Get Master AWB document data + * @permission Requires `canUseGetMasterAwbData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.mawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetMasterAwbData = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId } )); + return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateMasterAwbData` + * @summary Update Master AWB document data + * @permission Requires `canUseUpdateMasterAwbData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateMasterAwbData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId, data }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId } )); + return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, mawbId, officeId } = variables; + const updateKeys = [keys.getMasterAwbData(positionId, mawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteMasterAwb` + * @summary Delete Master AWB document + * @permission Requires `canUseDeleteMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Master AWB document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewMasterAwb` - recommended when file should be cached + * @summary Preview Master AWB document + * @permission Requires `canUsePreviewMasterAwb` ability + * @param { string } object.positionId Path parameter + * @param { string } object.mawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewMasterAwb = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewMasterAwbMutation` - recommended when file should not be cached + * @summary Preview Master AWB document + * @permission Requires `canUsePreviewMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewMasterAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, mawbId, officeId } = variables; + const updateKeys = [keys.previewMasterAwb(positionId, mawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateMasterAwb` + * @summary Generate Master AWB document + * @permission Requires `canUseGenerateMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId, data }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts new file mode 100644 index 0000000..ccebdd8 --- /dev/null +++ b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts @@ -0,0 +1,95 @@ +import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; + +export namespace WorkingDocumentsTemplatedDocumentAcl { +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Create", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useGetTemplatedDocument` query ability. For global ability, omit the object parameter. + * @description Read templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetTemplatedDocument` query + */ +export const canUseGetTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useUpdateTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Update templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateTemplatedDocument` mutation + */ +export const canUseUpdateTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useDeleteTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Delete templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteTemplatedDocument` mutation + */ +export const canUseDeleteTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `usePreviewTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Preview templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewTemplatedDocument` mutation + */ +export const canUsePreviewTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useIssueTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Issue templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueTemplatedDocument` mutation + */ +export const canUseIssueTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate templated document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ +export const canUseGenerateDocumentEml = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +} diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts new file mode 100644 index 0000000..4d0042d --- /dev/null +++ b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts @@ -0,0 +1,78 @@ +import { AppRestClient } from "@/data/app-rest-client"; +import { AxiosRequestConfig } from "axios"; +import { z } from "zod"; +import { ZodExtended } from "@/data/zod.extended"; +import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsTemplatedDocumentApi { +export const create = (positionId: string, officeId: string, data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), + config + ) +}; +export const getTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, config?: AxiosRequestConfig) => { + return AppRestClient.get( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + config + ) +}; +export const updateTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.patch( + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), + config + ) +}; +export const deleteTemplatedDocument = (positionId: string, templatedDocumentId: string, officeId: string, config?: AxiosRequestConfig) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + undefined, + config + ) +}; +export const previewTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const issueTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + config + ) +}; +export const generateDocumentEml = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { + return AppRestClient.post( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + ...config, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +} diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts new file mode 100644 index 0000000..bba201a --- /dev/null +++ b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts @@ -0,0 +1,61 @@ +import { z } from "zod"; +import { CommonModels } from "@/data/common/common.models"; + +export namespace WorkingDocumentsTemplatedDocumentModels { +/** + * TemplatedDocumentBlueprintDtoSchema + * @type { object } + * @property { string } templateId + * @property { string } templateName + * @property { string } capturedAt + * @property { CommonModels.TemplateBlocksResponseDTO } blocks + */ +export const TemplatedDocumentBlueprintDtoSchema = z.object({ templateId: z.string(), templateName: z.string(), capturedAt: z.string(), blocks: CommonModels.TemplateBlocksResponseDTOSchema }).readonly(); +export type TemplatedDocumentBlueprintDto = z.infer; + +/** + * TemplatedDocumentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } officeId + * @property { string } name + * @property { string } nameSuffix + * @property { string } defaultFileName + * @property { number } versionNumber + * @property { TemplatedDocumentBlueprintDto } blueprint Captured template blueprint + * @property { CommonModels.TemplatedDocumentDataDto } data Document data + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } issuedAt + */ +export const TemplatedDocumentResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), officeId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), versionNumber: z.number(), blueprint: TemplatedDocumentBlueprintDtoSchema.describe("Captured template blueprint"), data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Document data"), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), issuedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export type TemplatedDocumentResponseDto = z.infer; + +/** + * UpdateTemplatedDocumentRequestDtoSchema + * @type { object } + * @property { string } nameSuffix Optional suffix for the document name + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data Partial document data to update + */ +export const UpdateTemplatedDocumentRequestDtoSchema = z.object({ nameSuffix: z.string().describe("Optional suffix for the document name"), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("Partial document data to update") }).readonly(); +export type UpdateTemplatedDocumentRequestDto = z.infer; + +/** + * CreateTemplatedDocumentRequestDtoSchema + * @type { object } + * @property { string } templateId Template ID to use for creating the document + * @property { string } nameSuffix Optional suffix for the document name + */ +export const CreateTemplatedDocumentRequestDtoSchema = z.object({ templateId: z.string().describe("Template ID to use for creating the document"), nameSuffix: z.string().describe("Optional suffix for the document name").nullish() }).readonly(); +export type CreateTemplatedDocumentRequestDto = z.infer; + +/** + * GenerateWorkingDocumentPreviewRequestDtoSchema + * @type { object } + * @property { string } issuedAt + */ +export const GenerateWorkingDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }) }).readonly(); +export type GenerateWorkingDocumentPreviewRequestDto = z.infer; + +} diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts new file mode 100644 index 0000000..8385890 --- /dev/null +++ b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts @@ -0,0 +1,217 @@ +import { AxiosRequestConfig } from "axios"; +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "@/data/queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; +import { useAclCheck } from "@/data/acl/useAclCheck"; +import { WorkingDocumentsTemplatedDocumentAcl } from "./workingDocumentsTemplatedDocument.acl"; +import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; +import { CommonModels } from "@/data/common/common.models"; +import { WorkingDocumentsTemplatedDocumentApi } from "./workingDocumentsTemplatedDocument.api"; + +export namespace WorkingDocumentsTemplatedDocumentQueries { +export const moduleName = QueryModule.WorkingDocumentsTemplatedDocument; + +export const keys = { + all: [moduleName] as const, + getTemplatedDocument: (officeId: string, positionId: string, templatedDocumentId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/templated-documents/:templatedDocumentId", officeId, positionId, templatedDocumentId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a templated document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetTemplatedDocument` + * @summary Get templated document data + * @permission Requires `canUseGetTemplatedDocument` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.templatedDocumentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetTemplatedDocument = ({ officeId, positionId, templatedDocumentId }: { officeId: string, positionId: string, templatedDocumentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), + queryFn: () => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument(officeId, positionId, templatedDocumentId, config) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateTemplatedDocument` + * @summary Update templated document data + * @permission Requires `canUseUpdateTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, templatedDocumentId } = variables; + const updateKeys = [keys.getTemplatedDocument(officeId, positionId, templatedDocumentId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteTemplatedDocument` + * @summary Delete templated document + * @permission Requires `canUseDeleteTemplatedDocument` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Templated document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, templatedDocumentId, officeId }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument(positionId, templatedDocumentId, officeId, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `usePreviewTemplatedDocument` - recommended when file should not be cached + * @summary Preview templated document + * @permission Requires `canUsePreviewTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const usePreviewTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useIssueTemplatedDocument` + * @summary Issue templated document (generate final PDF) + * @permission Requires `canUseIssueTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useIssueTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate templated document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml(officeId, positionId, templatedDocumentId, data, config) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/next/zod.extended.ts b/test/generated/next/zod.extended.ts new file mode 100644 index 0000000..205405c --- /dev/null +++ b/test/generated/next/zod.extended.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; + +export namespace ZodExtended { + interface ParseOptions { + type: "body" | "query"; + name?: string; + errorHandler?: ErrorHandler; + } + + export function parse( + schema: z.ZodType, + data: unknown, + { type, name, errorHandler }: ParseOptions = { type: "body" }, + ) { + try { + return schema.parse(data); + } catch (e) { + if (e instanceof z.ZodError) { + e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; + } + (errorHandler ?? SharedErrorHandler).rethrowError(e); + throw e; + } + } + + function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { + if (data === undefined || data === "" || enumSchema.options.length === 0) { + return true; + } + + const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; + const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; + return new RegExp(`^${commaSeparatedOptions}$`).test(data); + } + + export const sortExp = (enumSchema: z.ZodEnum) => + z.string().superRefine((arg, ctx) => { + if (!isSortExpValid(enumSchema, arg)) { + ctx.addIssue({ + code: "invalid_value", + message: "Invalid sorting string.", + values: [], + }); + } + }); +} From 0dd70edd7915511221eef225fbe91010598261b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Urban=20Lavbi=C4=8D?= Date: Wed, 25 Feb 2026 20:51:09 +0100 Subject: [PATCH 02/12] Few more improvements --modesOnly mode --inlineEndpoints so no api.ts folder are generated since we don't need them most of the time WorkspaceContext so we can supply officeId or positionId for all components from this level down. --- README.md | 37 + src/commands/generate.command.ts | 12 + src/commands/generate.ts | 4 + src/generators/const/options.const.ts | 7 + src/generators/core/resolveConfig.ts | 10 +- src/generators/generate/generateEndpoints.ts | 5 + src/generators/generate/generateQueries.ts | 368 ++- src/generators/generateCodeFromOpenAPIDoc.ts | 34 +- src/generators/types/options.ts | 7 + src/generators/utils/file.utils.ts | 5 + .../utils/generate/generate.configs.utils.ts | 8 +- .../generate/generate.endpoints.utils.ts | 6 +- src/generators/utils/tag.utils.ts | 11 + src/index.ts | 1 + src/lib/config/workspace.context.tsx | 33 + .../generated/base/aWBStocks/aWBStocks.acl.ts | 162 +- .../generated/base/aWBStocks/aWBStocks.api.ts | 153 +- .../base/aWBStocks/aWBStocks.configs.ts | 139 +- .../base/aWBStocks/aWBStocks.models.ts | 250 +- .../base/aWBStocks/aWBStocks.queries.ts | 530 ++-- test/generated/base/acl/app.ability.ts | 413 +-- test/generated/base/acl/useAclCheck.ts | 20 +- .../base/airPositions/airPositions.acl.ts | 47 +- .../base/airPositions/airPositions.api.ts | 33 +- .../base/airPositions/airPositions.models.ts | 114 +- .../base/airPositions/airPositions.queries.ts | 119 +- test/generated/base/airports/airports.acl.ts | 71 +- test/generated/base/airports/airports.api.ts | 145 +- .../base/airports/airports.configs.ts | 175 +- .../base/airports/airports.models.ts | 238 +- .../base/airports/airports.queries.ts | 470 ++- test/generated/base/app-rest-client.ts | 2 +- .../base/bankAccounts/bankAccounts.acl.ts | 29 +- .../base/bankAccounts/bankAccounts.api.ts | 77 +- .../base/bankAccounts/bankAccounts.configs.ts | 55 +- .../base/bankAccounts/bankAccounts.models.ts | 75 +- .../base/bankAccounts/bankAccounts.queries.ts | 199 +- .../bookkeepingExport.acl.ts | 231 +- .../bookkeepingExport.api.ts | 251 +- .../bookkeepingExport.configs.ts | 187 +- .../bookkeepingExport.models.ts | 705 ++--- .../bookkeepingExport.queries.ts | 831 ++--- .../businessPartnerBookkeepingMappings.acl.ts | 116 +- .../businessPartnerBookkeepingMappings.api.ts | 93 +- ...sinessPartnerBookkeepingMappings.models.ts | 138 +- ...inessPartnerBookkeepingMappings.queries.ts | 328 +- .../businessPartnerContacts.acl.ts | 116 +- .../businessPartnerContacts.api.ts | 129 +- .../businessPartnerContacts.configs.ts | 53 +- .../businessPartnerContacts.models.ts | 185 +- .../businessPartnerContacts.queries.ts | 456 +-- .../businessPartners/businessPartners.acl.ts | 499 +-- .../businessPartners/businessPartners.api.ts | 403 +-- .../businessPartners.configs.ts | 239 +- .../businessPartners.models.ts | 1293 +++----- .../businessPartners.queries.ts | 1495 ++++----- .../base/cargoTypes/cargoTypes.acl.ts | 111 +- .../base/cargoTypes/cargoTypes.api.ts | 173 +- .../base/cargoTypes/cargoTypes.configs.ts | 223 +- .../base/cargoTypes/cargoTypes.models.ts | 335 +-- .../base/cargoTypes/cargoTypes.queries.ts | 564 ++-- .../base/chargeTypes/chargeTypes.acl.ts | 111 +- .../base/chargeTypes/chargeTypes.api.ts | 179 +- .../base/chargeTypes/chargeTypes.configs.ts | 211 +- .../base/chargeTypes/chargeTypes.models.ts | 350 +-- .../base/chargeTypes/chargeTypes.queries.ts | 564 ++-- .../base/checklistItems/checklistItems.acl.ts | 162 +- .../base/checklistItems/checklistItems.api.ts | 188 +- .../checklistItems/checklistItems.configs.ts | 171 +- .../checklistItems/checklistItems.models.ts | 223 +- .../checklistItems/checklistItems.queries.ts | 623 ++-- .../checklistTemplates.acl.ts | 162 +- .../checklistTemplates.api.ts | 190 +- .../checklistTemplates.configs.ts | 175 +- .../checklistTemplates.models.ts | 256 +- .../checklistTemplates.queries.ts | 632 ++-- test/generated/base/cities/cities.acl.ts | 127 +- test/generated/base/cities/cities.api.ts | 176 +- test/generated/base/cities/cities.configs.ts | 189 +- test/generated/base/cities/cities.models.ts | 314 +- test/generated/base/cities/cities.queries.ts | 588 ++-- test/generated/base/common/common.models.ts | 327 +- .../base/containerYards/containerYards.acl.ts | 127 +- .../base/containerYards/containerYards.api.ts | 194 +- .../containerYards/containerYards.configs.ts | 223 +- .../containerYards/containerYards.models.ts | 322 +- .../containerYards/containerYards.queries.ts | 612 ++-- .../controlTowerAuth/controlTowerAuth.api.ts | 30 +- .../controlTowerAuth.models.ts | 64 +- .../controlTowerAuth.queries.ts | 97 +- .../controlTowerBookings.api.ts | 79 +- .../controlTowerBookings.configs.ts | 81 +- .../controlTowerBookings.models.ts | 371 +-- .../controlTowerBookings.queries.ts | 213 +- .../controlTowerCalendar.api.ts | 55 +- .../controlTowerCalendar.models.ts | 174 +- .../controlTowerCalendar.queries.ts | 90 +- .../controlTowerContainers.api.ts | 81 +- .../controlTowerContainers.configs.ts | 77 +- .../controlTowerContainers.models.ts | 316 +- .../controlTowerContainers.queries.ts | 208 +- .../base/controlTowerMe/controlTowerMe.api.ts | 85 +- .../controlTowerMe/controlTowerMe.models.ts | 390 ++- .../controlTowerMe/controlTowerMe.queries.ts | 271 +- .../controlTowerPackages.api.ts | 53 +- .../controlTowerPackages.configs.ts | 73 +- .../controlTowerPackages.models.ts | 112 +- .../controlTowerPackages.queries.ts | 136 +- .../controlTowerSearch.api.ts | 34 +- .../controlTowerSearch.models.ts | 79 +- .../controlTowerSearch.queries.ts | 59 +- .../generated/base/countries/countries.acl.ts | 43 +- .../generated/base/countries/countries.api.ts | 115 +- .../base/countries/countries.configs.ts | 123 +- .../base/countries/countries.models.ts | 177 +- .../base/countries/countries.queries.ts | 341 +-- .../base/currencies/currencies.acl.ts | 85 +- .../base/currencies/currencies.api.ts | 205 +- .../base/currencies/currencies.configs.ts | 231 +- .../base/currencies/currencies.models.ts | 267 +- .../base/currencies/currencies.queries.ts | 636 ++-- .../customerAccount/customerAccount.api.ts | 13 +- .../customerAccount/customerAccount.models.ts | 76 +- .../customerAccount.queries.ts | 42 +- .../generated/base/customers/customers.acl.ts | 89 +- .../generated/base/customers/customers.api.ts | 133 +- .../base/customers/customers.configs.ts | 139 +- .../base/customers/customers.models.ts | 306 +- .../base/customers/customers.queries.ts | 470 ++- test/generated/base/depots/depots.acl.ts | 111 +- test/generated/base/depots/depots.api.ts | 167 +- test/generated/base/depots/depots.configs.ts | 207 +- test/generated/base/depots/depots.models.ts | 356 +-- test/generated/base/depots/depots.queries.ts | 547 ++-- .../documentTemplates.acl.ts | 208 +- .../documentTemplates.api.ts | 227 +- .../documentTemplates.configs.ts | 177 +- .../documentTemplates.models.ts | 301 +- .../documentTemplates.queries.ts | 772 ++--- .../dunningAccountStatement.acl.ts | 47 +- .../dunningAccountStatement.api.ts | 107 +- .../dunningAccountStatement.models.ts | 217 +- .../dunningAccountStatement.queries.ts | 376 +-- .../base/dunningLevels/dunningLevels.acl.ts | 162 +- .../base/dunningLevels/dunningLevels.api.ts | 188 +- .../dunningLevels/dunningLevels.configs.ts | 209 +- .../dunningLevels/dunningLevels.models.ts | 313 +- .../dunningLevels/dunningLevels.queries.ts | 631 ++-- .../dunningManagement.acl.ts | 70 +- .../dunningManagement.api.ts | 111 +- .../dunningManagement.configs.ts | 91 +- .../dunningManagement.models.ts | 456 ++- .../dunningManagement.queries.ts | 366 +-- .../dunningPartnerOutstandingInvoices.acl.ts | 70 +- .../dunningPartnerOutstandingInvoices.api.ts | 135 +- ...nningPartnerOutstandingInvoices.configs.ts | 151 +- ...unningPartnerOutstandingInvoices.models.ts | 306 +- ...nningPartnerOutstandingInvoices.queries.ts | 482 +-- .../base/dunningSystems/dunningSystems.acl.ts | 162 +- .../base/dunningSystems/dunningSystems.api.ts | 188 +- .../dunningSystems/dunningSystems.configs.ts | 179 +- .../dunningSystems/dunningSystems.models.ts | 228 +- .../dunningSystems/dunningSystems.queries.ts | 631 ++-- test/generated/base/employee/employee.acl.ts | 236 +- test/generated/base/employee/employee.api.ts | 344 +-- .../base/employee/employee.configs.ts | 209 +- .../base/employee/employee.models.ts | 538 ++-- .../base/employee/employee.queries.ts | 1057 +++---- .../employeeAccount/employeeAccount.api.ts | 13 +- .../employeeAccount/employeeAccount.models.ts | 123 +- .../employeeAccount.queries.ts | 42 +- .../employeePermissions.acl.ts | 29 +- .../employeePermissions.api.ts | 77 +- .../employeePermissions.configs.ts | 61 +- .../employeePermissions.models.ts | 110 +- .../employeePermissions.queries.ts | 196 +- .../employeeProfile/employeeProfile.api.ts | 31 +- .../employeeProfile/employeeProfile.models.ts | 73 +- .../employeeProfile.queries.ts | 91 +- .../base/employeeRoles/employeeRoles.acl.ts | 152 +- .../base/employeeRoles/employeeRoles.api.ts | 185 +- .../employeeRoles/employeeRoles.configs.ts | 129 +- .../employeeRoles/employeeRoles.models.ts | 268 +- .../employeeRoles/employeeRoles.queries.ts | 584 ++-- .../employeeSettings/employeeSettings.api.ts | 32 +- .../employeeSettings.models.ts | 54 +- .../employeeSettings.queries.ts | 91 +- .../base/employment/employment.acl.ts | 162 +- .../base/employment/employment.api.ts | 153 +- .../base/employment/employment.configs.ts | 89 +- .../base/employment/employment.models.ts | 223 +- .../base/employment/employment.queries.ts | 517 ++-- .../factoringExport/factoringExport.acl.ts | 47 +- .../factoringExport/factoringExport.api.ts | 32 +- .../factoringExport/factoringExport.models.ts | 90 +- .../factoringExport.queries.ts | 113 +- .../base/factoringMerge/factoringMerge.acl.ts | 70 +- .../base/factoringMerge/factoringMerge.api.ts | 46 +- .../factoringMerge/factoringMerge.models.ts | 203 +- .../factoringMerge/factoringMerge.queries.ts | 171 +- test/generated/base/files/files.api.ts | 136 +- test/generated/base/files/files.models.ts | 101 +- test/generated/base/files/files.queries.ts | 429 ++- test/generated/base/folders/folders.api.ts | 128 +- test/generated/base/folders/folders.models.ts | 203 +- .../generated/base/folders/folders.queries.ts | 420 +-- test/generated/base/hsCodes/hsCodes.acl.ts | 111 +- test/generated/base/hsCodes/hsCodes.api.ts | 173 +- .../generated/base/hsCodes/hsCodes.configs.ts | 179 +- test/generated/base/hsCodes/hsCodes.models.ts | 241 +- .../generated/base/hsCodes/hsCodes.queries.ts | 557 ++-- .../integrationChannels.acl.ts | 185 +- .../integrationChannels.api.ts | 203 +- .../integrationChannels.configs.ts | 251 +- .../integrationChannels.models.ts | 468 ++- .../integrationChannels.queries.ts | 707 ++--- .../inttraOfficeIntegration.acl.ts | 70 +- .../inttraOfficeIntegration.api.ts | 46 +- .../inttraOfficeIntegration.models.ts | 114 +- .../inttraOfficeIntegration.queries.ts | 160 +- .../inttraShippingInstructionMessages.acl.ts | 109 +- .../inttraShippingInstructionMessages.api.ts | 112 +- ...ttraShippingInstructionMessages.configs.ts | 131 +- ...nttraShippingInstructionMessages.models.ts | 254 +- ...ttraShippingInstructionMessages.queries.ts | 433 +-- .../invoicePayments/invoicePayments.acl.ts | 208 +- .../invoicePayments/invoicePayments.api.ts | 244 +- .../invoicePayments.configs.ts | 221 +- .../invoicePayments/invoicePayments.models.ts | 702 ++--- .../invoicePayments.queries.ts | 724 ++--- test/generated/base/invoices/invoices.acl.ts | 774 ++--- test/generated/base/invoices/invoices.api.ts | 794 ++--- .../base/invoices/invoices.configs.ts | 551 ++-- .../base/invoices/invoices.models.ts | 2582 ++++++---------- .../base/invoices/invoices.queries.ts | 2669 +++++++---------- .../base/masterData/masterData.acl.ts | 29 +- .../base/masterData/masterData.api.ts | 82 +- .../base/masterData/masterData.configs.ts | 33 +- .../base/masterData/masterData.models.ts | 140 +- .../base/masterData/masterData.queries.ts | 241 +- .../masterDataImport/masterDataImport.acl.ts | 70 +- .../masterDataImport/masterDataImport.api.ts | 51 +- .../masterDataImport.models.ts | 166 +- .../masterDataImport.queries.ts | 223 +- test/generated/base/offices/offices.acl.ts | 164 +- test/generated/base/offices/offices.api.ts | 257 +- .../generated/base/offices/offices.configs.ts | 209 +- test/generated/base/offices/offices.models.ts | 927 +++--- .../generated/base/offices/offices.queries.ts | 825 +++-- .../base/packageTypes/packageTypes.acl.ts | 111 +- .../base/packageTypes/packageTypes.api.ts | 179 +- .../base/packageTypes/packageTypes.configs.ts | 197 +- .../base/packageTypes/packageTypes.models.ts | 670 +---- .../base/packageTypes/packageTypes.queries.ts | 567 ++-- .../partnerNetworks/partnerNetworks.acl.ts | 111 +- .../partnerNetworks/partnerNetworks.api.ts | 181 +- .../partnerNetworks.configs.ts | 167 +- .../partnerNetworks/partnerNetworks.models.ts | 219 +- .../partnerNetworks.queries.ts | 572 ++-- .../paymentConfirmations.acl.ts | 70 +- .../paymentConfirmations.api.ts | 118 +- .../paymentConfirmations.configs.ts | 69 +- .../paymentConfirmations.models.ts | 145 +- .../paymentConfirmations.queries.ts | 290 +- test/generated/base/ports/ports.acl.ts | 71 +- test/generated/base/ports/ports.api.ts | 142 +- test/generated/base/ports/ports.configs.ts | 195 +- test/generated/base/ports/ports.models.ts | 334 +-- test/generated/base/ports/ports.queries.ts | 459 ++- .../positionAccount/positionAccount.acl.ts | 24 +- .../positionAccount/positionAccount.api.ts | 13 +- .../positionAccount/positionAccount.models.ts | 114 +- .../positionAccount.queries.ts | 56 +- .../positionAccountItems.acl.ts | 139 +- .../positionAccountItems.api.ts | 121 +- .../positionAccountItems.models.ts | 408 +-- .../positionAccountItems.queries.ts | 391 ++- .../base/positionCargo/positionCargo.acl.ts | 208 +- .../base/positionCargo/positionCargo.api.ts | 182 +- .../positionCargo/positionCargo.configs.ts | 219 +- .../positionCargo/positionCargo.models.ts | 85 +- .../positionCargo/positionCargo.queries.ts | 644 ++-- .../positionCargoPackage.acl.ts | 116 +- .../positionCargoPackage.api.ts | 105 +- .../positionCargoPackage.queries.ts | 327 +- .../positionChecklist.acl.ts | 139 +- .../positionChecklist.api.ts | 102 +- .../positionChecklist.models.ts | 151 +- .../positionChecklist.queries.ts | 358 +-- .../positionInvolvedParties.acl.ts | 93 +- .../positionInvolvedParties.api.ts | 73 +- .../positionInvolvedParties.models.ts | 13 +- .../positionInvolvedParties.queries.ts | 240 +- .../positionProfitChangeTracking.acl.ts | 51 +- .../positionProfitChangeTracking.api.ts | 78 +- .../positionProfitChangeTracking.configs.ts | 70 +- .../positionProfitChangeTracking.models.ts | 171 +- .../positionProfitChangeTracking.queries.ts | 273 +- .../base/positionRoutes/positionRoutes.acl.ts | 162 +- .../base/positionRoutes/positionRoutes.api.ts | 131 +- .../positionRoutes/positionRoutes.queries.ts | 447 ++- .../generated/base/positions/positions.acl.ts | 399 +-- .../generated/base/positions/positions.api.ts | 387 +-- .../base/positions/positions.configs.ts | 439 +-- .../base/positions/positions.models.ts | 1379 +++------ .../base/positions/positions.queries.ts | 1258 ++++---- .../base/projectLite/projectLite.acl.ts | 162 +- .../base/projectLite/projectLite.api.ts | 188 +- .../base/projectLite/projectLite.configs.ts | 171 +- .../base/projectLite/projectLite.models.ts | 200 +- .../base/projectLite/projectLite.queries.ts | 622 ++-- test/generated/base/queryModules.ts | 190 +- .../base/quoteAccount/quoteAccount.acl.ts | 116 +- .../base/quoteAccount/quoteAccount.api.ts | 82 +- .../base/quoteAccount/quoteAccount.models.ts | 415 +-- .../base/quoteAccount/quoteAccount.queries.ts | 294 +- .../base/quoteCargo/quoteCargo.acl.ts | 185 +- .../base/quoteCargo/quoteCargo.api.ts | 157 +- .../base/quoteCargo/quoteCargo.configs.ts | 159 +- .../base/quoteCargo/quoteCargo.models.ts | 83 +- .../base/quoteCargo/quoteCargo.queries.ts | 585 ++-- .../quoteCargoPackage.acl.ts | 116 +- .../quoteCargoPackage.api.ts | 105 +- .../quoteCargoPackage.queries.ts | 327 +- .../quoteConversion/quoteConversion.acl.ts | 24 +- .../quoteConversion/quoteConversion.api.ts | 20 +- .../quoteConversion/quoteConversion.models.ts | 17 +- .../quoteConversion.queries.ts | 65 +- .../base/quoteDocument/quoteDocument.acl.ts | 116 +- .../base/quoteDocument/quoteDocument.api.ts | 119 +- .../quoteDocument/quoteDocument.models.ts | 302 +- .../quoteDocument/quoteDocument.queries.ts | 292 +- .../quoteProfitChangeTracking.acl.ts | 51 +- .../quoteProfitChangeTracking.api.ts | 60 +- .../quoteProfitChangeTracking.configs.ts | 43 +- .../quoteProfitChangeTracking.models.ts | 124 +- .../quoteProfitChangeTracking.queries.ts | 206 +- .../base/quoteRoutes/quoteRoutes.acl.ts | 162 +- .../base/quoteRoutes/quoteRoutes.api.ts | 131 +- .../base/quoteRoutes/quoteRoutes.queries.ts | 447 ++- test/generated/base/quotes/quotes.acl.ts | 277 +- test/generated/base/quotes/quotes.api.ts | 272 +- test/generated/base/quotes/quotes.configs.ts | 229 +- test/generated/base/quotes/quotes.models.ts | 51 +- test/generated/base/quotes/quotes.queries.ts | 809 +++-- .../remarkTemplates/remarkTemplates.acl.ts | 162 +- .../remarkTemplates/remarkTemplates.api.ts | 188 +- .../remarkTemplates.configs.ts | 187 +- .../remarkTemplates/remarkTemplates.models.ts | 321 +- .../remarkTemplates.queries.ts | 631 ++-- .../base/roadQuotes/roadQuotes.acl.ts | 47 +- .../base/roadQuotes/roadQuotes.api.ts | 33 +- .../base/roadQuotes/roadQuotes.models.ts | 64 +- .../base/roadQuotes/roadQuotes.queries.ts | 119 +- .../base/seaPositions/seaPositions.acl.ts | 47 +- .../base/seaPositions/seaPositions.api.ts | 33 +- .../base/seaPositions/seaPositions.models.ts | 124 +- .../base/seaPositions/seaPositions.queries.ts | 119 +- .../generated/base/seaQuotes/seaQuotes.acl.ts | 47 +- .../generated/base/seaQuotes/seaQuotes.api.ts | 33 +- .../base/seaQuotes/seaQuotes.models.ts | 73 +- .../base/seaQuotes/seaQuotes.queries.ts | 119 +- .../shippingInstructions.acl.ts | 157 +- .../shippingInstructions.api.ts | 114 +- .../shippingInstructions.models.ts | 1347 ++++----- .../shippingInstructions.queries.ts | 453 ++- .../generated/base/terminals/terminals.acl.ts | 111 +- .../generated/base/terminals/terminals.api.ts | 167 +- .../base/terminals/terminals.configs.ts | 231 +- .../base/terminals/terminals.models.ts | 478 ++- .../base/terminals/terminals.queries.ts | 554 ++-- .../base/userActivity/userActivity.api.ts | 32 +- .../base/userActivity/userActivity.models.ts | 137 +- .../base/userActivity/userActivity.queries.ts | 65 +- test/generated/base/vatRules/vatRules.acl.ts | 111 +- test/generated/base/vatRules/vatRules.api.ts | 173 +- .../base/vatRules/vatRules.configs.ts | 241 +- .../base/vatRules/vatRules.models.ts | 340 +-- .../base/vatRules/vatRules.queries.ts | 545 ++-- .../base/warehouses/warehouses.acl.ts | 111 +- .../base/warehouses/warehouses.api.ts | 167 +- .../base/warehouses/warehouses.configs.ts | 221 +- .../base/warehouses/warehouses.models.ts | 344 +-- .../base/warehouses/warehouses.queries.ts | 546 ++-- .../workingDocuments/workingDocuments.acl.ts | 47 +- .../workingDocuments/workingDocuments.api.ts | 68 +- .../workingDocuments.configs.ts | 77 +- .../workingDocuments.models.ts | 150 +- .../workingDocuments.queries.ts | 255 +- .../workingDocumentsAmsInstructions.acl.ts | 157 +- .../workingDocumentsAmsInstructions.api.ts | 124 +- .../workingDocumentsAmsInstructions.models.ts | 363 +-- ...workingDocumentsAmsInstructions.queries.ts | 493 ++- .../workingDocumentsBlInstructions.acl.ts | 183 +- .../workingDocumentsBlInstructions.api.ts | 158 +- .../workingDocumentsBlInstructions.models.ts | 698 ++--- .../workingDocumentsBlInstructions.queries.ts | 553 ++-- .../workingDocumentsCmrForm.acl.ts | 139 +- .../workingDocumentsCmrForm.api.ts | 109 +- .../workingDocumentsCmrForm.models.ts | 475 ++- .../workingDocumentsCmrForm.queries.ts | 447 ++- .../workingDocumentsExportDeclaration.acl.ts | 163 +- .../workingDocumentsExportDeclaration.api.ts | 124 +- ...orkingDocumentsExportDeclaration.models.ts | 255 +- ...rkingDocumentsExportDeclaration.queries.ts | 501 ++-- .../workingDocumentsFcrForm.acl.ts | 139 +- .../workingDocumentsFcrForm.api.ts | 109 +- .../workingDocumentsFcrForm.models.ts | 220 +- .../workingDocumentsFcrForm.queries.ts | 447 ++- .../workingDocumentsHouseAwb.acl.ts | 139 +- .../workingDocumentsHouseAwb.api.ts | 119 +- .../workingDocumentsHouseAwb.models.ts | 453 +-- .../workingDocumentsHouseAwb.queries.ts | 447 ++- .../workingDocumentsHouseBl.acl.ts | 185 +- .../workingDocumentsHouseBl.api.ts | 189 +- .../workingDocumentsHouseBl.models.ts | 518 ++-- .../workingDocumentsHouseBl.queries.ts | 624 ++-- .../workingDocumentsIsfForm.acl.ts | 139 +- .../workingDocumentsIsfForm.api.ts | 109 +- .../workingDocumentsIsfForm.models.ts | 388 +-- .../workingDocumentsIsfForm.queries.ts | 447 ++- .../workingDocumentsMasterAwb.acl.ts | 139 +- .../workingDocumentsMasterAwb.api.ts | 124 +- .../workingDocumentsMasterAwb.models.ts | 459 +-- .../workingDocumentsMasterAwb.queries.ts | 447 ++- .../workingDocumentsTemplatedDocument.acl.ts | 190 +- .../workingDocumentsTemplatedDocument.api.ts | 167 +- ...orkingDocumentsTemplatedDocument.models.ts | 137 +- ...rkingDocumentsTemplatedDocument.queries.ts | 518 ++-- test/generated/base/zod.extended.ts | 2 +- .../generated/next/aWBStocks/aWBStocks.api.ts | 36 +- .../next/aWBStocks/aWBStocks.models.ts | 18 +- .../next/aWBStocks/aWBStocks.queries.ts | 33 +- test/generated/next/acl/useAclCheck.ts | 6 +- .../next/airPositions/airPositions.api.ts | 9 +- .../next/airPositions/airPositions.models.ts | 4 +- .../next/airPositions/airPositions.queries.ts | 9 +- test/generated/next/airports/airports.api.ts | 31 +- .../next/airports/airports.models.ts | 16 +- .../next/airports/airports.queries.ts | 29 +- .../next/bankAccounts/bankAccounts.api.ts | 13 +- .../next/bankAccounts/bankAccounts.models.ts | 6 +- .../next/bankAccounts/bankAccounts.queries.ts | 13 +- .../bookkeepingExport.api.ts | 53 +- .../bookkeepingExport.models.ts | 32 +- .../bookkeepingExport.queries.ts | 49 +- .../businessPartnerBookkeepingMappings.api.ts | 22 +- ...sinessPartnerBookkeepingMappings.models.ts | 12 +- ...inessPartnerBookkeepingMappings.queries.ts | 21 +- .../businessPartnerContacts.api.ts | 27 +- .../businessPartnerContacts.models.ts | 12 +- .../businessPartnerContacts.queries.ts | 25 +- .../businessPartners/businessPartners.api.ts | 96 +- .../businessPartners.models.ts | 64 +- .../businessPartners.queries.ts | 90 +- .../next/cargoTypes/cargoTypes.api.ts | 41 +- .../next/cargoTypes/cargoTypes.models.ts | 16 +- .../next/cargoTypes/cargoTypes.queries.ts | 37 +- .../next/chargeTypes/chargeTypes.api.ts | 41 +- .../next/chargeTypes/chargeTypes.models.ts | 22 +- .../next/chargeTypes/chargeTypes.queries.ts | 37 +- .../next/checklistItems/checklistItems.api.ts | 41 +- .../checklistItems/checklistItems.models.ts | 16 +- .../checklistItems/checklistItems.queries.ts | 37 +- .../checklistTemplates.api.ts | 41 +- .../checklistTemplates.models.ts | 18 +- .../checklistTemplates.queries.ts | 37 +- test/generated/next/cities/cities.api.ts | 45 +- test/generated/next/cities/cities.models.ts | 22 +- test/generated/next/cities/cities.queries.ts | 41 +- test/generated/next/common/common.models.ts | 218 +- .../next/containerYards/containerYards.api.ts | 45 +- .../containerYards/containerYards.models.ts | 16 +- .../containerYards/containerYards.queries.ts | 41 +- .../controlTowerAuth/controlTowerAuth.api.ts | 9 +- .../controlTowerAuth.models.ts | 6 +- .../controlTowerAuth.queries.ts | 9 +- .../controlTowerBookings.api.ts | 18 +- .../controlTowerBookings.models.ts | 14 +- .../controlTowerBookings.queries.ts | 17 +- .../controlTowerCalendar.api.ts | 4 +- .../controlTowerCalendar.models.ts | 16 +- .../controlTowerCalendar.queries.ts | 5 +- .../controlTowerContainers.api.ts | 18 +- .../controlTowerContainers.models.ts | 16 +- .../controlTowerContainers.queries.ts | 17 +- .../next/controlTowerMe/controlTowerMe.api.ts | 26 +- .../controlTowerMe/controlTowerMe.models.ts | 30 +- .../controlTowerMe/controlTowerMe.queries.ts | 26 +- .../controlTowerPackages.api.ts | 10 +- .../controlTowerPackages.models.ts | 6 +- .../controlTowerPackages.queries.ts | 9 +- .../controlTowerSearch.api.ts | 4 +- .../controlTowerSearch.models.ts | 6 +- .../controlTowerSearch.queries.ts | 5 +- .../generated/next/countries/countries.api.ts | 23 +- .../next/countries/countries.models.ts | 10 +- .../next/countries/countries.queries.ts | 21 +- .../next/currencies/currencies.api.ts | 40 +- .../next/currencies/currencies.models.ts | 16 +- .../next/currencies/currencies.queries.ts | 37 +- .../customerAccount/customerAccount.api.ts | 5 +- .../customerAccount/customerAccount.models.ts | 6 +- .../customerAccount.queries.ts | 6 +- .../generated/next/customers/customers.api.ts | 36 +- .../next/customers/customers.models.ts | 20 +- .../next/customers/customers.queries.ts | 34 +- test/generated/next/depots/depots.api.ts | 41 +- test/generated/next/depots/depots.models.ts | 22 +- test/generated/next/depots/depots.queries.ts | 37 +- .../documentTemplates.api.ts | 50 +- .../documentTemplates.models.ts | 20 +- .../documentTemplates.queries.ts | 45 +- .../dunningAccountStatement.api.ts | 17 +- .../dunningAccountStatement.models.ts | 12 +- .../dunningAccountStatement.queries.ts | 22 +- .../next/dunningLevels/dunningLevels.api.ts | 41 +- .../dunningLevels/dunningLevels.models.ts | 18 +- .../dunningLevels/dunningLevels.queries.ts | 37 +- .../dunningManagement.api.ts | 21 +- .../dunningManagement.models.ts | 26 +- .../dunningManagement.queries.ts | 26 +- .../dunningPartnerOutstandingInvoices.api.ts | 23 +- ...unningPartnerOutstandingInvoices.models.ts | 18 +- ...nningPartnerOutstandingInvoices.queries.ts | 21 +- .../next/dunningSystems/dunningSystems.api.ts | 41 +- .../dunningSystems/dunningSystems.models.ts | 16 +- .../dunningSystems/dunningSystems.queries.ts | 37 +- test/generated/next/employee/employee.api.ts | 72 +- .../next/employee/employee.models.ts | 34 +- .../next/employee/employee.queries.ts | 69 +- .../employeeAccount/employeeAccount.api.ts | 5 +- .../employeeAccount/employeeAccount.models.ts | 8 +- .../employeeAccount.queries.ts | 6 +- .../employeePermissions.api.ts | 13 +- .../employeePermissions.models.ts | 8 +- .../employeePermissions.queries.ts | 13 +- .../employeeProfile/employeeProfile.api.ts | 9 +- .../employeeProfile/employeeProfile.models.ts | 4 +- .../employeeProfile.queries.ts | 10 +- .../next/employeeRoles/employeeRoles.api.ts | 42 +- .../employeeRoles/employeeRoles.models.ts | 20 +- .../employeeRoles/employeeRoles.queries.ts | 41 +- .../employeeSettings/employeeSettings.api.ts | 9 +- .../employeeSettings.models.ts | 4 +- .../employeeSettings.queries.ts | 10 +- .../next/employment/employment.api.ts | 36 +- .../next/employment/employment.models.ts | 18 +- .../next/employment/employment.queries.ts | 33 +- .../factoringExport/factoringExport.api.ts | 9 +- .../factoringExport/factoringExport.models.ts | 4 +- .../factoringExport.queries.ts | 9 +- .../next/factoringMerge/factoringMerge.api.ts | 14 +- .../factoringMerge/factoringMerge.models.ts | 10 +- .../factoringMerge/factoringMerge.queries.ts | 13 +- test/generated/next/files/files.api.ts | 28 +- test/generated/next/files/files.models.ts | 12 +- test/generated/next/files/files.queries.ts | 30 +- test/generated/next/folders/folders.api.ts | 31 +- test/generated/next/folders/folders.models.ts | 18 +- .../generated/next/folders/folders.queries.ts | 29 +- test/generated/next/hsCodes/hsCodes.api.ts | 41 +- test/generated/next/hsCodes/hsCodes.models.ts | 16 +- .../generated/next/hsCodes/hsCodes.queries.ts | 37 +- .../integrationChannels.api.ts | 46 +- .../integrationChannels.models.ts | 22 +- .../integrationChannels.queries.ts | 41 +- .../inttraOfficeIntegration.api.ts | 14 +- .../inttraOfficeIntegration.models.ts | 8 +- .../inttraOfficeIntegration.queries.ts | 13 +- .../inttraShippingInstructionMessages.api.ts | 22 +- ...nttraShippingInstructionMessages.models.ts | 12 +- ...ttraShippingInstructionMessages.queries.ts | 21 +- .../invoicePayments/invoicePayments.api.ts | 47 +- .../invoicePayments/invoicePayments.models.ts | 44 +- .../invoicePayments.queries.ts | 45 +- test/generated/next/invoices/invoices.api.ts | 144 +- .../next/invoices/invoices.models.ts | 129 +- .../next/invoices/invoices.queries.ts | 154 +- .../next/masterData/masterData.api.ts | 13 +- .../next/masterData/masterData.models.ts | 12 +- .../next/masterData/masterData.queries.ts | 13 +- .../masterDataImport/masterDataImport.api.ts | 13 +- .../masterDataImport.models.ts | 12 +- .../masterDataImport.queries.ts | 14 +- test/generated/next/offices/offices.api.ts | 55 +- test/generated/next/offices/offices.models.ts | 52 +- .../generated/next/offices/offices.queries.ts | 54 +- .../next/packageTypes/packageTypes.api.ts | 41 +- .../next/packageTypes/packageTypes.models.ts | 16 +- .../next/packageTypes/packageTypes.queries.ts | 37 +- .../partnerNetworks/partnerNetworks.api.ts | 41 +- .../partnerNetworks/partnerNetworks.models.ts | 16 +- .../partnerNetworks.queries.ts | 37 +- .../paymentConfirmations.api.ts | 16 +- .../paymentConfirmations.models.ts | 10 +- .../paymentConfirmations.queries.ts | 17 +- test/generated/next/ports/ports.api.ts | 31 +- test/generated/next/ports/ports.models.ts | 22 +- test/generated/next/ports/ports.queries.ts | 29 +- .../positionAccount/positionAccount.api.ts | 5 +- .../positionAccount/positionAccount.models.ts | 8 +- .../positionAccount.queries.ts | 5 +- .../positionAccountItems.api.ts | 25 +- .../positionAccountItems.models.ts | 34 +- .../positionAccountItems.queries.ts | 25 +- .../next/positionCargo/positionCargo.api.ts | 44 +- .../positionCargo/positionCargo.models.ts | 11 +- .../positionCargo/positionCargo.queries.ts | 41 +- .../positionCargoPackage.api.ts | 23 +- .../positionCargoPackage.queries.ts | 21 +- .../positionChecklist.api.ts | 27 +- .../positionChecklist.models.ts | 16 +- .../positionChecklist.queries.ts | 25 +- .../positionInvolvedParties.api.ts | 18 +- .../positionInvolvedParties.models.ts | 2 +- .../positionInvolvedParties.queries.ts | 17 +- .../positionProfitChangeTracking.api.ts | 14 +- .../positionProfitChangeTracking.models.ts | 10 +- .../positionProfitChangeTracking.queries.ts | 13 +- .../next/positionRoutes/positionRoutes.api.ts | 31 +- .../positionRoutes/positionRoutes.queries.ts | 29 +- .../generated/next/positions/positions.api.ts | 80 +- .../next/positions/positions.models.ts | 58 +- .../next/positions/positions.queries.ts | 77 +- .../next/projectLite/projectLite.api.ts | 41 +- .../next/projectLite/projectLite.models.ts | 14 +- .../next/projectLite/projectLite.queries.ts | 37 +- .../next/quoteAccount/quoteAccount.api.ts | 23 +- .../next/quoteAccount/quoteAccount.models.ts | 20 +- .../next/quoteAccount/quoteAccount.queries.ts | 21 +- .../next/quoteCargo/quoteCargo.api.ts | 40 +- .../next/quoteCargo/quoteCargo.models.ts | 11 +- .../next/quoteCargo/quoteCargo.queries.ts | 37 +- .../quoteCargoPackage.api.ts | 23 +- .../quoteCargoPackage.queries.ts | 21 +- .../quoteConversion/quoteConversion.api.ts | 5 +- .../quoteConversion/quoteConversion.models.ts | 2 +- .../quoteConversion.queries.ts | 5 +- .../next/quoteDocument/quoteDocument.api.ts | 19 +- .../quoteDocument/quoteDocument.models.ts | 22 +- .../quoteDocument/quoteDocument.queries.ts | 21 +- .../quoteProfitChangeTracking.api.ts | 14 +- .../quoteProfitChangeTracking.models.ts | 8 +- .../quoteProfitChangeTracking.queries.ts | 13 +- .../next/quoteRoutes/quoteRoutes.api.ts | 31 +- .../next/quoteRoutes/quoteRoutes.queries.ts | 29 +- test/generated/next/quotes/quotes.api.ts | 54 +- test/generated/next/quotes/quotes.models.ts | 34 +- test/generated/next/quotes/quotes.queries.ts | 53 +- .../remarkTemplates/remarkTemplates.api.ts | 41 +- .../remarkTemplates/remarkTemplates.models.ts | 18 +- .../remarkTemplates.queries.ts | 37 +- .../next/roadQuotes/roadQuotes.api.ts | 9 +- .../next/roadQuotes/roadQuotes.models.ts | 4 +- .../next/roadQuotes/roadQuotes.queries.ts | 9 +- .../next/seaPositions/seaPositions.api.ts | 9 +- .../next/seaPositions/seaPositions.models.ts | 4 +- .../next/seaPositions/seaPositions.queries.ts | 9 +- .../generated/next/seaQuotes/seaQuotes.api.ts | 9 +- .../next/seaQuotes/seaQuotes.models.ts | 4 +- .../next/seaQuotes/seaQuotes.queries.ts | 9 +- .../shippingInstructions.api.ts | 26 +- .../shippingInstructions.models.ts | 66 +- .../shippingInstructions.queries.ts | 29 +- .../generated/next/terminals/terminals.api.ts | 41 +- .../next/terminals/terminals.models.ts | 26 +- .../next/terminals/terminals.queries.ts | 37 +- .../next/userActivity/userActivity.api.ts | 6 +- .../next/userActivity/userActivity.models.ts | 8 +- .../next/userActivity/userActivity.queries.ts | 5 +- test/generated/next/vatRules/vatRules.api.ts | 41 +- .../next/vatRules/vatRules.models.ts | 16 +- .../next/vatRules/vatRules.queries.ts | 37 +- .../next/warehouses/warehouses.api.ts | 41 +- .../next/warehouses/warehouses.models.ts | 20 +- .../next/warehouses/warehouses.queries.ts | 37 +- .../workingDocuments/workingDocuments.api.ts | 14 +- .../workingDocuments.models.ts | 8 +- .../workingDocuments.queries.ts | 13 +- .../workingDocumentsAmsInstructions.api.ts | 26 +- .../workingDocumentsAmsInstructions.models.ts | 16 +- ...workingDocumentsAmsInstructions.queries.ts | 29 +- .../workingDocumentsBlInstructions.api.ts | 29 +- .../workingDocumentsBlInstructions.models.ts | 20 +- .../workingDocumentsBlInstructions.queries.ts | 33 +- .../workingDocumentsCmrForm.api.ts | 26 +- .../workingDocumentsCmrForm.models.ts | 22 +- .../workingDocumentsCmrForm.queries.ts | 29 +- .../workingDocumentsExportDeclaration.api.ts | 26 +- ...orkingDocumentsExportDeclaration.models.ts | 10 +- ...rkingDocumentsExportDeclaration.queries.ts | 29 +- .../workingDocumentsFcrForm.api.ts | 26 +- .../workingDocumentsFcrForm.models.ts | 8 +- .../workingDocumentsFcrForm.queries.ts | 29 +- .../workingDocumentsHouseAwb.api.ts | 26 +- .../workingDocumentsHouseAwb.models.ts | 20 +- .../workingDocumentsHouseAwb.queries.ts | 29 +- .../workingDocumentsHouseBl.api.ts | 32 +- .../workingDocumentsHouseBl.models.ts | 20 +- .../workingDocumentsHouseBl.queries.ts | 41 +- .../workingDocumentsIsfForm.api.ts | 26 +- .../workingDocumentsIsfForm.models.ts | 18 +- .../workingDocumentsIsfForm.queries.ts | 29 +- .../workingDocumentsMasterAwb.api.ts | 26 +- .../workingDocumentsMasterAwb.models.ts | 20 +- .../workingDocumentsMasterAwb.queries.ts | 29 +- .../workingDocumentsTemplatedDocument.api.ts | 28 +- ...orkingDocumentsTemplatedDocument.models.ts | 10 +- ...rkingDocumentsTemplatedDocument.queries.ts | 29 +- test/generated/next/zod.extended.ts | 2 +- 711 files changed, 47304 insertions(+), 65584 deletions(-) create mode 100644 src/lib/config/workspace.context.tsx diff --git a/README.md b/README.md index 2c2cc05..ef50e47 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,10 @@ yarn openapi-codegen generate --config my-config.ts --axiosRequestConfig Include Axios request config parameters in query hooks (default: false) --infiniteQueries Generate infinite queries for paginated API endpoints (default: false) --mutationEffects Add mutation effects options to mutation hooks (default: true) + --workspaceContext Allow generated hooks to resolve path/ACL params from OpenApiWorkspaceContext (default: false) + --inlineEndpoints Inline endpoint implementations into generated query files (default: false) + --inlineEndpointsExcludeModules Comma-separated modules/tags to keep as separate API files while inlineEndpoints=true + --modelsOnly Generate only model files (default: false) --parseRequestParams Add Zod parsing to API endpoints (default: true) --acl Generate ACL related files (default: true) @@ -186,6 +190,39 @@ const config: OpenAPICodegenConfig = { export default config; ``` +### OpenApiWorkspaceContext (Path + ACL defaults) + +Enable `workspaceContext: true` in codegen config (or pass `--workspaceContext`) and wrap your app subtree with `OpenApiWorkspaceContext.Provider` if generated hooks frequently repeat workspace-scoped params (for example `officeId`). + +```tsx +import { OpenApiWorkspaceContext } from "@povio/openapi-codegen-cli"; +// openapi-codegen.config.ts -> { workspaceContext: true } + + + +; +``` + +Generated query/mutation hooks can then omit matching path/ACL params and resolve them from `OpenApiWorkspaceContext`. + +### Generation Modes + +You can control whether API endpoint files are emitted, inlined into query files, or skipped entirely. + +```ts +import type { OpenAPICodegenConfig } from "@povio/openapi-codegen-cli"; + +const config: OpenAPICodegenConfig = { + // 1) Default mode: separate *.api.ts files are generated + // 2) Inline mode: endpoint logic is generated inside *.queries.ts + // and can be used without separate api files: + // inlineEndpoints: true, + // inlineEndpointsExcludeModules: ["Users", "Billing"], + // 3) Models-only mode: generate only *.models.ts files + // modelsOnly: true, +}; +``` + ### Enums If you're using Enums in your backend DTOs with `@Expose()` and `@IsEnum`, they may still not appear correctly in the OpenAPI schema unless you also provide both `enum` **and** `enumName` to `@ApiProperty`. diff --git a/src/commands/generate.command.ts b/src/commands/generate.command.ts index 51af9c1..58ec380 100644 --- a/src/commands/generate.command.ts +++ b/src/commands/generate.command.ts @@ -64,9 +64,21 @@ class GenerateOptions implements GenerateParams { @YargOption({ envAlias: "mutationEffects", type: "boolean" }) mutationEffects?: boolean; + @YargOption({ envAlias: "workspaceContext", type: "boolean" }) + workspaceContext?: boolean; + @YargOption({ envAlias: "parseRequestParams", type: "boolean" }) parseRequestParams?: boolean; + @YargOption({ envAlias: "inlineEndpoints", type: "boolean" }) + inlineEndpoints?: boolean; + + @YargOption({ envAlias: "inlineEndpointsExcludeModules" }) + inlineEndpointsExcludeModules?: string; + + @YargOption({ envAlias: "modelsOnly", type: "boolean" }) + modelsOnly?: boolean; + @YargOption({ envAlias: "axiosRequestConfig", type: "boolean" }) axiosRequestConfig?: boolean; diff --git a/src/commands/generate.ts b/src/commands/generate.ts index 6d19189..3ad9995 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -12,6 +12,7 @@ import { Profiler } from "@/helpers/profile.helper"; export type GenerateParams = { config?: string; excludeTags?: string; + inlineEndpointsExcludeModules?: string; prettier?: boolean; verbose?: boolean; } & Partial< @@ -34,8 +35,11 @@ export type GenerateParams = { | "infiniteQueries" | "axiosRequestConfig" | "mutationEffects" + | "workspaceContext" | "parseRequestParams" + | "inlineEndpoints" | "builderConfigs" + | "modelsOnly" > >; diff --git a/src/generators/const/options.const.ts b/src/generators/const/options.const.ts index 58f1aa1..101e089 100644 --- a/src/generators/const/options.const.ts +++ b/src/generators/const/options.const.ts @@ -39,6 +39,8 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = { }, }, baseUrl: "", + modelsOnly: false, + standalone: false, // Zod options schemaSuffix: SCHEMA_SUFFIX, enumSuffix: ENUM_SUFFIX, @@ -47,12 +49,16 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = { replaceOptionalWithNullish: false, // Endpoints options restClientImportPath: "", + errorHandlingImportPath: "", removeOperationPrefixEndingWith: "Controller_", parseRequestParams: true, + inlineEndpoints: false, + inlineEndpointsExcludeModules: [], // Queries options queryTypesImportPath: PACKAGE_IMPORT_PATH, axiosRequestConfig: false, mutationEffects: true, + workspaceContext: false, // Infinite queries options infiniteQueries: false, infiniteQueryParamNames: { @@ -67,6 +73,7 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = { acl: true, checkAcl: true, abilityContextGenericAppAbilities: false, + abilityContextImportPath: "", // Builder Configs options builderConfigs: false, filterParamName: "filter", diff --git a/src/generators/core/resolveConfig.ts b/src/generators/core/resolveConfig.ts index bc01962..1392784 100644 --- a/src/generators/core/resolveConfig.ts +++ b/src/generators/core/resolveConfig.ts @@ -4,14 +4,20 @@ import { deepMerge } from "@/generators/utils/object.utils"; export function resolveConfig({ fileConfig = {}, - params: { excludeTags, ...options }, + params: { excludeTags, inlineEndpointsExcludeModules, ...options }, }: { fileConfig?: Partial | null; - params: Partial & { excludeTags: string }>; + params: Partial< + Omit & { + excludeTags: string; + inlineEndpointsExcludeModules: string; + } + >; }) { const resolvedConfig = deepMerge(DEFAULT_GENERATE_OPTIONS, fileConfig ?? {}, { ...options, excludeTags: excludeTags?.split(","), + inlineEndpointsExcludeModules: inlineEndpointsExcludeModules?.split(","), }); resolvedConfig.checkAcl = resolvedConfig.acl && resolvedConfig.checkAcl; return resolvedConfig; diff --git a/src/generators/generate/generateEndpoints.ts b/src/generators/generate/generateEndpoints.ts index 1b3d320..c54ffd3 100644 --- a/src/generators/generate/generateEndpoints.ts +++ b/src/generators/generate/generateEndpoints.ts @@ -15,11 +15,16 @@ import { requiresBody, } from "@/generators/utils/generate/generate.endpoints.utils"; import { getAppRestClientImportPath, getZodExtendedImportPath } from "@/generators/utils/generate/generate.utils"; +import { shouldInlineEndpointsForTag } from "@/generators/utils/tag.utils"; import { getImportedZodSchemaName } from "@/generators/utils/generate/generate.zod.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; import { isNamedZodSchema } from "@/generators/utils/zod-schema.utils"; export function generateEndpoints({ resolver, data, tag }: GenerateTypeParams) { + if (shouldInlineEndpointsForTag(tag, resolver.options)) { + return; + } + const endpoints = data.get(tag)?.endpoints; if (!endpoints || endpoints.length === 0) { return; diff --git a/src/generators/generate/generateQueries.ts b/src/generators/generate/generateQueries.ts index 360eaf4..228c1f0 100644 --- a/src/generators/generate/generateQueries.ts +++ b/src/generators/generate/generateQueries.ts @@ -1,11 +1,18 @@ import { ACL_CHECK_HOOK } from "@/generators/const/acl.const"; -import { MUTATION_EFFECTS, QUERY_MODULE_ENUM, QUERY_OPTIONS_TYPES } from "@/generators/const/deps.const"; +import { + APP_REST_CLIENT_NAME, + MUTATION_EFFECTS, + QUERY_MODULE_ENUM, + QUERY_OPTIONS_TYPES, + ZOD_EXTENDED, +} from "@/generators/const/deps.const"; import { AXIOS_DEFAULT_IMPORT_NAME, AXIOS_IMPORT, AXIOS_REQUEST_CONFIG_NAME, AXIOS_REQUEST_CONFIG_TYPE, } from "@/generators/const/endpoints.const"; +import { PACKAGE_IMPORT_PATH } from "@/generators/const/package.const"; import { QUERIES_MODULE_NAME, QUERY_HOOKS, QUERY_IMPORT } from "@/generators/const/queries.const"; import { SchemaResolver } from "@/generators/core/SchemaResolver.class"; import { Endpoint, EndpointParameter } from "@/generators/types/endpoint"; @@ -18,9 +25,14 @@ import { hasAbilityConditions, } from "@/generators/utils/generate/generate.acl.utils"; import { + getEndpointBody, + getEndpointConfig, getEndpointName, + getEndpointPath, + hasEndpointConfig, getImportedEndpointName, mapEndpointParamsToFunctionParams, + requiresBody, } from "@/generators/utils/generate/generate.endpoints.utils"; import { getSchemaDescriptions } from "@/generators/utils/generate/generate.openapi.utils"; import { @@ -30,17 +42,25 @@ import { } from "@/generators/utils/generate/generate.imports.utils"; import { getInfiniteQueryName, getQueryName } from "@/generators/utils/generate/generate.query.utils"; import { + getAppRestClientImportPath, getAclCheckImportPath, getMutationEffectsImportPath, getQueryModulesImportPath, getQueryTypesImportPath, + getZodExtendedImportPath, } from "@/generators/utils/generate/generate.utils"; -import { getImportedZodSchemaInferedTypeName } from "@/generators/utils/generate/generate.zod.utils"; +import { + getImportedZodSchemaInferedTypeName, + getImportedZodSchemaName, +} from "@/generators/utils/generate/generate.zod.utils"; +import { ZOD_IMPORT } from "@/generators/const/zod.const"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; import { isSchemaObject } from "@/generators/utils/openapi-schema.utils"; import { isParamMediaTypeAllowed } from "@/generators/utils/openapi.utils"; import { getDestructuredVariables, isInfiniteQuery, isMutation, isQuery } from "@/generators/utils/query.utils"; +import { shouldInlineEndpointsForTag } from "@/generators/utils/tag.utils"; import { isNamedZodSchema } from "@/generators/utils/zod-schema.utils"; +import { invalidVariableNameCharactersToCamel } from "@/generators/utils/js.utils"; const endpointParamMappingCache = new WeakMap< SchemaResolver, @@ -49,6 +69,7 @@ const endpointParamMappingCache = new WeakMap< export function generateQueries(params: GenerateTypeParams) { const { resolver, data, tag } = params; + const inlineEndpoints = shouldInlineEndpointsForTag(tag, resolver.options); const endpoints = data.get(tag)?.endpoints; if (!endpoints || endpoints.length === 0) { return; @@ -104,18 +125,49 @@ export function generateQueries(params: GenerateTypeParams) { from: getQueryTypesImportPath(resolver.options), }; + const hasWorkspaceContext = + resolver.options.workspaceContext && + endpoints.some((endpoint) => getWorkspaceParamNames(resolver, endpoint).length > 0); + const workspaceContextImport: Import = { + bindings: ["OpenApiWorkspaceContext"], + from: PACKAGE_IMPORT_PATH, + }; + const endpointParams = endpoints.flatMap((endpoint) => endpoint.parameters) as EndpointParameter[]; + const endpointParamsParseSchemas = endpointParams + .filter((param) => !["Path", "Header"].includes(param.type)) + .map((param) => param.parameterSortingEnumSchemaName ?? param.zodSchema); + const endpointResponseSchemas = endpoints.map((endpoint) => endpoint.response); + const endpointRuntimeSchemas = getUniqueArray([ + ...endpointResponseSchemas, + ...(resolver.options.parseRequestParams ? endpointParamsParseSchemas : []), + ]); + const hasZodImport = inlineEndpoints && endpointRuntimeSchemas.some((schema) => !isNamedZodSchema(schema)); + const hasZodExtendedImport = + inlineEndpoints && resolver.options.parseRequestParams && endpointParamsParseSchemas.length > 0; + const appRestClientImport: Import = { + bindings: [APP_REST_CLIENT_NAME], + from: getAppRestClientImportPath(resolver.options), + }; + const zodExtendedImport: Import = { + bindings: [ZOD_EXTENDED.namespace], + from: getZodExtendedImportPath(resolver.options), + }; + const modelsImports = getModelsImports({ resolver, tag, + zodSchemas: inlineEndpoints ? endpointRuntimeSchemas.filter(isNamedZodSchema) : [], zodSchemasAsTypes: getUniqueArray(endpointParams.map((param) => param.zodSchema).filter(isNamedZodSchema)), }); - const endpointsImports = getEndpointsImports({ - tag, - endpoints, - options: resolver.options, - }); + const endpointsImports = inlineEndpoints + ? [] + : getEndpointsImports({ + tag, + endpoints, + options: resolver.options, + }); const aclImports = getAclImports({ tag, @@ -129,6 +181,15 @@ export function generateQueries(params: GenerateTypeParams) { if (hasAxiosImport) { lines.push(renderImport(axiosImport)); } + if (inlineEndpoints) { + lines.push(renderImport(appRestClientImport)); + if (hasZodImport) { + lines.push(renderImport(ZOD_IMPORT)); + } + if (hasZodExtendedImport) { + lines.push(renderImport(zodExtendedImport)); + } + } lines.push(renderImport(queryImport)); if (hasMutationEffects) { lines.push(renderImport(queryModulesImport)); @@ -143,6 +204,9 @@ export function generateQueries(params: GenerateTypeParams) { } } lines.push(renderImport(queryTypesImport)); + if (hasWorkspaceContext) { + lines.push(renderImport(workspaceContextImport)); + } for (const modelsImport of modelsImports) { lines.push(renderImport(modelsImport)); } @@ -155,6 +219,11 @@ export function generateQueries(params: GenerateTypeParams) { lines.push(`export namespace ${namespace} {`); } + if (inlineEndpoints) { + lines.push(...renderInlineEndpoints({ resolver, endpoints })); + lines.push(""); + } + lines.push( `export const ${QUERIES_MODULE_NAME} = ${hasMutationEffects ? `${QUERY_MODULE_ENUM}.${tag}` : `"${namespace}"`};`, ); @@ -166,7 +235,7 @@ export function generateQueries(params: GenerateTypeParams) { for (const endpoint of endpoints) { const endpointInfo = endpointGroups.infoByEndpoint.get(endpoint); if (endpointInfo?.query) { - lines.push(renderQuery({ resolver, endpoint })); + lines.push(renderQuery({ resolver, endpoint, inlineEndpoints })); lines.push(""); } if (endpointInfo?.mutation) { @@ -174,13 +243,14 @@ export function generateQueries(params: GenerateTypeParams) { renderMutation({ resolver, endpoint, + inlineEndpoints, precomputed: endpointGroups.mutationDataByEndpoint.get(endpoint), }), ); lines.push(""); } if (endpointInfo?.infiniteQuery) { - lines.push(renderInfiniteQuery({ resolver, endpoint })); + lines.push(renderInfiniteQuery({ resolver, endpoint, inlineEndpoints })); lines.push(""); } } @@ -246,9 +316,10 @@ function renderEndpointArgs( resolver: SchemaResolver, endpoint: Endpoint, options: Parameters[2], + replacements?: Record, ) { return getEndpointParamMapping(resolver, endpoint, options) - .map((param) => param.name) + .map((param) => replacements?.[param.name] ?? param.name) .join(", "); } @@ -284,12 +355,66 @@ function renderEndpointParamDescription(endpointParam: ReturnType condition.name); - const paramNames = new Set(endpoint.parameters.map((param) => param.name)); +function getWorkspaceParamNames(resolver: SchemaResolver, endpoint: Endpoint) { + const endpointParams = getEndpointParamMapping(resolver, endpoint, {}); + const endpointParamNames = new Set(endpointParams.map((param) => param.name)); + const workspaceParamNames = endpointParams.filter((param) => param.paramType === "Path").map((param) => param.name); + + const aclParamNames = (getAbilityConditionsTypes(endpoint) ?? []) + .map((condition) => invalidVariableNameCharactersToCamel(condition.name)) + .filter((name) => endpointParamNames.has(name)); + + return getUniqueArray([...workspaceParamNames, ...aclParamNames]); +} + +function getWorkspaceParamReplacements(resolver: SchemaResolver, endpoint: Endpoint) { + return Object.fromEntries( + getWorkspaceParamNames(resolver, endpoint).map((name) => [name, `${name}FromWorkspace`]), + ) as Record; +} + +function renderWorkspaceParamResolutions({ + replacements, + indent, +}: { + replacements: Record; + indent: string; +}) { + const workspaceParamNames = Object.keys(replacements); + if (workspaceParamNames.length === 0) { + return []; + } + + const lines = [`${indent}const workspaceContext = OpenApiWorkspaceContext.useContext();`]; + for (const paramName of workspaceParamNames) { + lines.push( + `${indent}const ${replacements[paramName]} = OpenApiWorkspaceContext.resolveParam(workspaceContext, "${paramName}", ${paramName});`, + ); + } + return lines; +} + +function renderAclCheckCall( + resolver: SchemaResolver, + endpoint: Endpoint, + replacements?: Record, + indent = "", +) { + const checkParams = getAbilityConditionsTypes(endpoint)?.map((condition) => + invalidVariableNameCharactersToCamel(condition.name), + ); + const paramNames = new Set(endpoint.parameters.map((param) => invalidVariableNameCharactersToCamel(param.name))); const hasAllCheckParams = checkParams?.every((param) => paramNames.has(param)); - const args = hasAbilityConditions(endpoint) && hasAllCheckParams ? `{ ${(checkParams ?? []).join(", ")} } ` : ""; - return `checkAcl(${getImportedAbilityFunctionName(endpoint, resolver.options)}(${args}));`; + const args = + hasAbilityConditions(endpoint) && hasAllCheckParams + ? `{ ${(checkParams ?? []) + .map((param) => { + const resolvedParam = replacements?.[param] ?? param; + return resolvedParam === param ? param : `${param}: ${resolvedParam}`; + }) + .join(", ")} } ` + : ""; + return `${indent}checkAcl(${getImportedAbilityFunctionName(endpoint, resolver.options)}(${args}));`; } function addAsteriskAfterNewLine(str: string) { @@ -401,14 +526,114 @@ function renderQueryKeys({ resolver, queryEndpoints }: { resolver: SchemaResolve return lines.join("\n"); } -function renderQuery({ resolver, endpoint }: { resolver: SchemaResolver; endpoint: Endpoint }) { +function renderInlineEndpoints({ resolver, endpoints }: { resolver: SchemaResolver; endpoints: Endpoint[] }) { + const lines: string[] = []; + for (const endpoint of endpoints) { + const endpointParams = renderEndpointParams(resolver, endpoint, {}); + const endpointBody = getEndpointBody(endpoint); + const hasUndefinedEndpointBody = requiresBody(endpoint) && !endpointBody && hasEndpointConfig(endpoint, resolver); + const endpointConfig = renderInlineEndpointConfig(resolver, endpoint); + + lines.push( + `const ${getEndpointName(endpoint)} = (${endpointParams}${resolver.options.axiosRequestConfig ? `${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + ); + lines.push(` return ${APP_REST_CLIENT_NAME}.${endpoint.method}(`); + lines.push(` { resSchema: ${getImportedZodSchemaName(resolver, endpoint.response)} },`); + lines.push(` \`${getEndpointPath(endpoint)}\`,`); + + if (endpointBody) { + lines.push( + ` ${resolver.options.parseRequestParams ? renderInlineEndpointParamParse(resolver, endpointBody, endpointBody.name) : endpointBody.name},`, + ); + } else if (hasUndefinedEndpointBody) { + lines.push(" undefined,"); + } + + lines.push(` ${endpointConfig}`); + lines.push(" );"); + lines.push("};"); + lines.push(""); + } + return lines; +} + +function renderInlineEndpointParamParse(resolver: SchemaResolver, param: EndpointParameter, paramName: string) { + const addOptional = + !(param.parameterObject ?? param.bodyObject)?.required && + (Boolean(param.parameterSortingEnumSchemaName) || isNamedZodSchema(param.zodSchema)); + const schemaValue = param.parameterSortingEnumSchemaName + ? `${ZOD_EXTENDED.namespace}.${ZOD_EXTENDED.exports.sortExp}(${getImportedZodSchemaName( + resolver, + param.parameterSortingEnumSchemaName, + )})${addOptional ? ".optional()" : ""}` + : `${getImportedZodSchemaName(resolver, param.zodSchema)}${addOptional ? ".optional()" : ""}`; + const queryArgs = param.type === "Query" ? `, { type: "query", name: "${paramName}" }` : ""; + return `${ZOD_EXTENDED.namespace}.${ZOD_EXTENDED.exports.parse}(${schemaValue}, ${paramName}${queryArgs})`; +} + +function renderInlineEndpointConfig(resolver: SchemaResolver, endpoint: Endpoint) { + const endpointConfig = getEndpointConfig(endpoint); + const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; + if (Object.keys(endpointConfig).length === 0) { + return hasAxiosRequestConfig ? AXIOS_REQUEST_CONFIG_NAME : ""; + } + + const lines: string[] = []; + lines.push("{"); + if (hasAxiosRequestConfig) { + lines.push(` ...${AXIOS_REQUEST_CONFIG_NAME},`); + } + if (endpointConfig.params) { + lines.push(" params: {"); + for (const param of endpointConfig.params) { + const value = resolver.options.parseRequestParams + ? renderInlineEndpointParamParse(resolver, param, param.value) + : param.value; + lines.push(` ${param.name}: ${value},`); + } + lines.push(" },"); + } + if (endpointConfig.headers) { + lines.push(" headers: {"); + for (const [key, value] of Object.entries(endpointConfig.headers)) { + lines.push(` '${key}': ${value},`); + } + lines.push(" },"); + } + if (endpoint.response === "z.instanceof(Blob)") { + lines.push(' responseType: "blob",'); + } + if (endpoint.mediaDownload) { + lines.push(" rawResponse: true,"); + } + lines.push(" }"); + return lines.join("\n"); +} + +function renderQuery({ + resolver, + endpoint, + inlineEndpoints, +}: { + resolver: SchemaResolver; + endpoint: Endpoint; + inlineEndpoints: boolean; +}) { const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; const hasAclCheck = resolver.options.checkAcl && endpoint.acl; + const workspaceParamReplacements = resolver.options.workspaceContext + ? getWorkspaceParamReplacements(resolver, endpoint) + : {}; const endpointArgs = renderEndpointArgs(resolver, endpoint, {}); - const endpointParams = renderEndpointParams(resolver, endpoint, {}); + const resolvedEndpointArgs = renderEndpointArgs(resolver, endpoint, {}, workspaceParamReplacements); + const endpointParams = renderEndpointParams(resolver, endpoint, { + optionalPathParams: resolver.options.workspaceContext, + }); const hasQueryFn = endpointArgs.length > 0 || hasAxiosRequestConfig || hasAclCheck; - const hasQueryFnBody = Boolean(hasAclCheck); - const importedEndpoint = getImportedEndpointName(endpoint, resolver.options); + const hasQueryFnBody = Boolean(hasAclCheck) || Object.keys(workspaceParamReplacements).length > 0; + const importedEndpoint = inlineEndpoints + ? getEndpointName(endpoint) + : getImportedEndpointName(endpoint, resolver.options); const lines: string[] = []; lines.push(renderQueryJsDocs({ resolver, endpoint, mode: "query" })); @@ -418,16 +643,17 @@ function renderQuery({ resolver, endpoint }: { resolver: SchemaResolver; endpoin if (hasAclCheck) { lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); } + lines.push(...renderWorkspaceParamResolutions({ replacements: workspaceParamReplacements, indent: " " })); lines.push(" "); lines.push(` return ${QUERY_HOOKS.query}({`); - lines.push(` queryKey: keys.${getEndpointName(endpoint)}(${endpointArgs}),`); + lines.push(` queryKey: keys.${getEndpointName(endpoint)}(${resolvedEndpointArgs}),`); if (hasQueryFn) { lines.push(` queryFn: () => ${hasQueryFnBody ? "{ " : ""}`); if (hasAclCheck) { - lines.push(` ${renderAclCheckCall(resolver, endpoint)}`); + lines.push(renderAclCheckCall(resolver, endpoint, workspaceParamReplacements, " ")); } lines.push( - ` ${hasQueryFnBody ? "return " : ""}${importedEndpoint}(${endpointArgs}${hasAxiosRequestConfig ? `${endpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""})${hasQueryFnBody ? " }" : ""},`, + ` ${hasQueryFnBody ? "return " : ""}${importedEndpoint}(${resolvedEndpointArgs}${hasAxiosRequestConfig ? `${resolvedEndpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""})${hasQueryFnBody ? " }" : ""},`, ); } else { lines.push(` queryFn: ${importedEndpoint},`); @@ -441,24 +667,35 @@ function renderQuery({ resolver, endpoint }: { resolver: SchemaResolver; endpoin function renderMutation({ resolver, endpoint, + inlineEndpoints, precomputed, }: { resolver: SchemaResolver; endpoint: Endpoint; + inlineEndpoints: boolean; precomputed?: { updateQueryEndpoints: Endpoint[]; destructuredVariables: string[] }; }) { const hasAclCheck = resolver.options.checkAcl && endpoint.acl; const hasMutationEffects = resolver.options.mutationEffects; const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; - const endpointParams = renderEndpointParams(resolver, endpoint, { includeFileParam: true }); + const workspaceParamReplacements = resolver.options.workspaceContext + ? getWorkspaceParamReplacements(resolver, endpoint) + : {}; + const endpointParams = renderEndpointParams(resolver, endpoint, { + includeFileParam: true, + optionalPathParams: resolver.options.workspaceContext, + }); const endpointArgs = renderEndpointArgs(resolver, endpoint, {}); + const resolvedEndpointArgs = renderEndpointArgs(resolver, endpoint, {}, workspaceParamReplacements); const destructuredMutationArgs = renderEndpointArgs(resolver, endpoint, { includeFileParam: true }); - const importedEndpoint = getImportedEndpointName(endpoint, resolver.options); + const endpointFunction = inlineEndpoints + ? getEndpointName(endpoint) + : getImportedEndpointName(endpoint, resolver.options); const updateQueryEndpoints = precomputed?.updateQueryEndpoints ?? []; const destructuredVariables = precomputed?.destructuredVariables ?? getDestructuredVariables(resolver, endpoint, updateQueryEndpoints); - const hasMutationFnBody = endpoint.mediaUpload || hasAclCheck; + const hasMutationFnBody = endpoint.mediaUpload || hasAclCheck || Object.keys(workspaceParamReplacements).length > 0; const mutationVariablesType = endpoint.mediaUpload ? `${endpointParams}${endpointParams ? "; " : ""}abortController?: AbortController; onUploadProgress?: (progress: { loaded: number; total: number }) => void` @@ -467,11 +704,14 @@ function renderMutation({ const lines: string[] = []; lines.push(renderQueryJsDocs({ resolver, endpoint, mode: "mutation" })); lines.push( - `export const ${getQueryName(endpoint, true)} = (options?: AppMutationOptions${hasMutationEffects ? ` & ${MUTATION_EFFECTS.optionsType}` : ""}${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + `export const ${getQueryName(endpoint, true)} = (options?: AppMutationOptions${hasMutationEffects ? ` & ${MUTATION_EFFECTS.optionsType}` : ""}${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, ); if (hasAclCheck) { lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); } + if (Object.keys(workspaceParamReplacements).length > 0) { + lines.push(" const workspaceContext = OpenApiWorkspaceContext.useContext();"); + } if (hasMutationEffects) { lines.push(` const { runMutationEffects } = useMutationEffects({ currentModule: ${QUERIES_MODULE_NAME} });`); } @@ -484,12 +724,17 @@ function renderMutation({ lines.push( ` mutationFn: ${endpoint.mediaUpload ? "async " : ""}(${mutationFnArg}) => ${hasMutationFnBody ? "{ " : ""}`, ); + for (const [paramName, resolvedParamName] of Object.entries(workspaceParamReplacements)) { + lines.push( + ` const ${resolvedParamName} = OpenApiWorkspaceContext.resolveParam(workspaceContext, "${paramName}", ${paramName});`, + ); + } if (hasAclCheck) { - lines.push(` ${renderAclCheckCall(resolver, endpoint)}`); + lines.push(renderAclCheckCall(resolver, endpoint, workspaceParamReplacements, " ")); } if (endpoint.mediaUpload) { lines.push( - ` const uploadInstructions = await ${importedEndpoint}(${endpointArgs}${hasAxiosRequestConfig ? `${endpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""});`, + ` const uploadInstructions = await ${endpointFunction}(${resolvedEndpointArgs}${hasAxiosRequestConfig ? `${resolvedEndpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""});`, ); lines.push(" "); lines.push(" if (file && uploadInstructions.url) {"); @@ -520,7 +765,7 @@ function renderMutation({ lines.push(" return uploadInstructions;"); } else { lines.push( - ` ${hasMutationFnBody ? "return " : ""}${importedEndpoint}(${endpointArgs}${hasAxiosRequestConfig ? `${endpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""})`, + ` ${hasMutationFnBody ? "return " : ""}${endpointFunction}(${resolvedEndpointArgs}${hasAxiosRequestConfig ? `${resolvedEndpointArgs ? ", " : ""}${AXIOS_REQUEST_CONFIG_NAME}` : ""})`, ); } if (hasMutationFnBody) { @@ -536,13 +781,23 @@ function renderMutation({ if (destructuredVariables.length > 0) { lines.push(` const { ${destructuredVariables.join(", ")} } = variables;`); } + for (const [paramName, resolvedParamName] of Object.entries(workspaceParamReplacements)) { + lines.push( + ` const ${resolvedParamName} = OpenApiWorkspaceContext.resolveParam(workspaceContext, "${paramName}", ${paramName});`, + ); + } lines.push( ` const updateKeys = [${updateQueryEndpoints .map( (e) => - `keys.${getEndpointName(e)}(${renderEndpointArgs(resolver, e, { - includeOnlyRequiredParams: true, - })})`, + `keys.${getEndpointName(e)}(${renderEndpointArgs( + resolver, + e, + { + includeOnlyRequiredParams: true, + }, + workspaceParamReplacements, + )})`, ) .join(", ")}];`, ); @@ -573,7 +828,9 @@ function groupEndpoints(endpoints: Endpoint[], resolver: SchemaResolver) { for (const endpoint of endpoints) { const query = isQuery(endpoint); const mutation = isMutation(endpoint); - const infiniteQuery = resolver.options.infiniteQueries && query && isInfiniteQuery(endpoint, resolver.options); + const infiniteQuery = Boolean( + resolver.options.infiniteQueries && query && isInfiniteQuery(endpoint, resolver.options), + ); if (query) { queryEndpoints.push(endpoint); @@ -616,32 +873,61 @@ function groupEndpoints(endpoints: Endpoint[], resolver: SchemaResolver) { }; } -function renderInfiniteQuery({ resolver, endpoint }: { resolver: SchemaResolver; endpoint: Endpoint }) { +function renderInfiniteQuery({ + resolver, + endpoint, + inlineEndpoints, +}: { + resolver: SchemaResolver; + endpoint: Endpoint; + inlineEndpoints: boolean; +}) { const hasAclCheck = resolver.options.checkAcl && endpoint.acl; const hasAxiosRequestConfig = resolver.options.axiosRequestConfig; - const endpointParams = renderEndpointParams(resolver, endpoint, { excludePageParam: true }); + const workspaceParamReplacements = resolver.options.workspaceContext + ? getWorkspaceParamReplacements(resolver, endpoint) + : {}; + const endpointParams = renderEndpointParams(resolver, endpoint, { + excludePageParam: true, + optionalPathParams: resolver.options.workspaceContext, + }); const endpointArgsWithoutPage = renderEndpointArgs(resolver, endpoint, { excludePageParam: true }); + const resolvedEndpointArgsWithoutPage = renderEndpointArgs( + resolver, + endpoint, + { excludePageParam: true }, + workspaceParamReplacements, + ); const endpointArgsWithPage = renderEndpointArgs(resolver, endpoint, { replacePageParam: true }); - const importedEndpoint = getImportedEndpointName(endpoint, resolver.options); - const hasQueryFnBody = Boolean(hasAclCheck); + const resolvedEndpointArgsWithPage = renderEndpointArgs( + resolver, + endpoint, + { replacePageParam: true }, + workspaceParamReplacements, + ); + const endpointFunction = inlineEndpoints + ? getEndpointName(endpoint) + : getImportedEndpointName(endpoint, resolver.options); + const hasQueryFnBody = Boolean(hasAclCheck) || Object.keys(workspaceParamReplacements).length > 0; const lines: string[] = []; lines.push(renderQueryJsDocs({ resolver, endpoint, mode: "infiniteQuery" })); lines.push( - `export const ${getInfiniteQueryName(endpoint)} = (${endpointParams ? `{ ${endpointArgsWithoutPage} }: { ${endpointParams} }, ` : ""}options?: AppInfiniteQueryOptions${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, + `export const ${getInfiniteQueryName(endpoint)} = (${endpointParams ? `{ ${endpointArgsWithoutPage} }: { ${endpointParams} }, ` : ""}options?: AppInfiniteQueryOptions${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, ); if (hasAclCheck) { lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); } + lines.push(...renderWorkspaceParamResolutions({ replacements: workspaceParamReplacements, indent: " " })); lines.push(""); lines.push(` return ${QUERY_HOOKS.infiniteQuery}({`); - lines.push(` queryKey: keys.${getEndpointName(endpoint)}Infinite(${endpointArgsWithoutPage}),`); + lines.push(` queryKey: keys.${getEndpointName(endpoint)}Infinite(${resolvedEndpointArgsWithoutPage}),`); lines.push(` queryFn: ({ pageParam }) => ${hasQueryFnBody ? "{ " : ""}`); if (hasAclCheck) { - lines.push(` ${renderAclCheckCall(resolver, endpoint)}`); + lines.push(renderAclCheckCall(resolver, endpoint, workspaceParamReplacements, " ")); } lines.push( - ` ${hasQueryFnBody ? "return " : ""}${importedEndpoint}(${endpointArgsWithPage}${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}` : ""})${hasQueryFnBody ? " }" : ""},`, + ` ${hasQueryFnBody ? "return " : ""}${endpointFunction}(${resolvedEndpointArgsWithPage}${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}` : ""})${hasQueryFnBody ? " }" : ""},`, ); lines.push(" initialPageParam: 1,"); lines.push( diff --git a/src/generators/generateCodeFromOpenAPIDoc.ts b/src/generators/generateCodeFromOpenAPIDoc.ts index 5f7d56a..d248d71 100644 --- a/src/generators/generateCodeFromOpenAPIDoc.ts +++ b/src/generators/generateCodeFromOpenAPIDoc.ts @@ -15,6 +15,7 @@ import { getZodExtendedFiles, } from "./utils/generate-files.utils"; import { getTagFileName } from "./utils/generate/generate.utils"; +import { shouldInlineEndpointsForTag } from "./utils/tag.utils"; import { Profiler } from "../helpers/profile.helper"; export function generateCodeFromOpenAPIDoc( @@ -30,13 +31,18 @@ export function generateCodeFromOpenAPIDoc( const generateFilesData: GenerateFileData[] = []; const appAclTags: string[] = []; - const generateTypes = [ - GenerateType.Models, - GenerateType.Endpoints, - GenerateType.Queries, - ...(resolver.options.acl ? [GenerateType.Acl] : []), - ...(resolver.options.builderConfigs ? [GenerateType.Configs] : []), - ]; + const modelsOnly = Boolean(resolver.options.modelsOnly); + const shouldGenerateEndpoints = + !modelsOnly && Array.from(data.keys()).some((tag) => !shouldInlineEndpointsForTag(tag, resolver.options)); + const generateTypes = modelsOnly + ? [GenerateType.Models] + : [ + GenerateType.Models, + ...(shouldGenerateEndpoints ? [GenerateType.Endpoints] : []), + GenerateType.Queries, + ...(resolver.options.acl ? [GenerateType.Acl] : []), + ...(resolver.options.builderConfigs ? [GenerateType.Configs] : []), + ]; const generateFunctions: Record string | undefined> = { [GenerateType.Models]: generateModels, [GenerateType.Endpoints]: generateEndpoints, @@ -61,12 +67,14 @@ export function generateCodeFromOpenAPIDoc( }); }); - generateFilesData.push( - ...p.runSync("render.AclShared", () => getAclFiles(data, resolver)), - ...p.runSync("render.MutationEffects", () => getMutationEffectsFiles(data, resolver)), - ...p.runSync("render.ZodExtended", () => getZodExtendedFiles(data, resolver)), - ...p.runSync("render.Standalone", () => getAppRestClientFiles(resolver)), - ); + if (!modelsOnly) { + generateFilesData.push( + ...p.runSync("render.AclShared", () => getAclFiles(data, resolver)), + ...p.runSync("render.MutationEffects", () => getMutationEffectsFiles(data, resolver)), + ...p.runSync("render.ZodExtended", () => getZodExtendedFiles(data, resolver)), + ...p.runSync("render.Standalone", () => getAppRestClientFiles(resolver)), + ); + } return generateFilesData; } diff --git a/src/generators/types/options.ts b/src/generators/types/options.ts index e9d68d3..0ca2d94 100644 --- a/src/generators/types/options.ts +++ b/src/generators/types/options.ts @@ -13,15 +13,19 @@ interface ZodGenerateOptions { interface EndpointsGenerateOptions { restClientImportPath: string; + errorHandlingImportPath?: string; withDeprecatedEndpoints?: boolean; removeOperationPrefixEndingWith?: string; parseRequestParams?: boolean; + inlineEndpoints?: boolean; + inlineEndpointsExcludeModules?: string[]; } interface QueriesGenerateOptions { queryTypesImportPath: string; axiosRequestConfig?: boolean; mutationEffects?: boolean; + workspaceContext?: boolean; } interface InfiniteQueriesGenerateOptions { @@ -40,6 +44,7 @@ interface ACLGenerateOptions { acl: boolean; checkAcl?: boolean; abilityContextGenericAppAbilities: boolean; + abilityContextImportPath?: string; } interface BuilderConfigsGenerateOptions { @@ -68,6 +73,8 @@ interface BaseGenerateOptions { importPath: "ts" | "relative" | "absolute"; configs: Record; baseUrl: string; + modelsOnly?: boolean; + standalone?: boolean; } export interface GenerateOptions diff --git a/src/generators/utils/file.utils.ts b/src/generators/utils/file.utils.ts index e45fb39..8e7fcc9 100644 --- a/src/generators/utils/file.utils.ts +++ b/src/generators/utils/file.utils.ts @@ -16,6 +16,11 @@ export function readAssetSync(fileName: string) { return readFileSync(assetPath); } +export function readHbsTemplateSync(templateName: string) { + const templatePath = `src/generators/templates/${templateName}.hbs`; + return readFileSync(templatePath); +} + export function getOutputFileName({ output, fileName }: { output: string; fileName: string }) { return `${output}/${fileName}`; } diff --git a/src/generators/utils/generate/generate.configs.utils.ts b/src/generators/utils/generate/generate.configs.utils.ts index 3cd3a30..e1ecab1 100644 --- a/src/generators/utils/generate/generate.configs.utils.ts +++ b/src/generators/utils/generate/generate.configs.utils.ts @@ -38,7 +38,13 @@ import { getImportedZodSchemaName } from "./generate.zod.utils"; export function getBuilderConfigs({ data, tag, resolver }: GenerateTypeParams) { const endpoints = data.get(tag)?.endpoints; if (!endpoints || endpoints.length === 0) { - return { configs: [] }; + return { + configs: [], + hasZodImport: false, + modelsImports: [], + queriesImports: [], + aclImports: [], + }; } const extendedEndpoints: ExtendedEndpoint[] = endpoints.map((endpoint) => ({ diff --git a/src/generators/utils/generate/generate.endpoints.utils.ts b/src/generators/utils/generate/generate.endpoints.utils.ts index 7cd205b..dadd3b7 100644 --- a/src/generators/utils/generate/generate.endpoints.utils.ts +++ b/src/generators/utils/generate/generate.endpoints.utils.ts @@ -48,6 +48,7 @@ export function mapEndpointParamsToFunctionParams( includeFileParam?: boolean; includeOnlyRequiredParams?: boolean; pathParamsRequiredOnly?: boolean; + optionalPathParams?: boolean; }, ) { const params = endpoint.parameters.map((param) => { @@ -102,7 +103,10 @@ export function mapEndpointParamsToFunctionParams( options?.replacePageParam && param.name === resolver.options.infiniteQueryParamNames.page ? "pageParam" : param.name, - required: param.required && (param.paramType === "Path" || !options?.pathParamsRequiredOnly), + required: + options?.optionalPathParams && param.paramType === "Path" + ? false + : param.required && (param.paramType === "Path" || !options?.pathParamsRequiredOnly), })); } diff --git a/src/generators/utils/tag.utils.ts b/src/generators/utils/tag.utils.ts index 77d46b6..d46cdcb 100644 --- a/src/generators/utils/tag.utils.ts +++ b/src/generators/utils/tag.utils.ts @@ -21,3 +21,14 @@ export function getEndpointTag(endpoint: Endpoint, options: GenerateOptions) { export function isTagExcluded(tag: string, options: GenerateOptions) { return options.excludeTags.some((excludeTag) => excludeTag.toLowerCase() === tag.toLowerCase()); } + +export function shouldInlineEndpointsForTag(tag: string, options: GenerateOptions) { + if (!options.inlineEndpoints) { + return false; + } + + const isExcludedModule = (options.inlineEndpointsExcludeModules ?? []).some( + (moduleName) => formatTag(moduleName).toLowerCase() === tag.toLowerCase(), + ); + return !isExcludedModule; +} diff --git a/src/index.ts b/src/index.ts index c4f617a..ce071d3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,6 +18,7 @@ export type { AppQueryOptions, AppMutationOptions, AppInfiniteQueryOptions } fro export { OpenApiRouter } from "./lib/config/router.context"; export { OpenApiQueryConfig } from "./lib/config/queryConfig.context"; export type { InvalidationMap } from "./lib/config/queryConfig.context"; +export { OpenApiWorkspaceContext } from "./lib/config/workspace.context"; // i18n resources (for consumer apps to merge into their i18n config) export { ns, resources } from "./lib/config/i18n"; diff --git a/src/lib/config/workspace.context.tsx b/src/lib/config/workspace.context.tsx new file mode 100644 index 0000000..7a61695 --- /dev/null +++ b/src/lib/config/workspace.context.tsx @@ -0,0 +1,33 @@ +import { type PropsWithChildren, createContext, use, useMemo } from "react"; + +type WorkspaceValues = Record; + +interface WorkspaceProviderProps { + values?: WorkspaceValues; +} + +export namespace OpenApiWorkspaceContext { + const Context = createContext({}); + + export const Provider = ({ values, children }: PropsWithChildren) => { + const contextValues = useMemo(() => values ?? {}, [values]); + return {children}; + }; + + export const useContext = () => { + return use(Context); + }; + + export const resolveParam = (context: WorkspaceValues, name: string, value: T | null | undefined): T => { + if (value != null) { + return value; + } + + const workspaceValue = context[name]; + if (workspaceValue == null) { + throw new Error(`Missing workspace context param "${name}"`); + } + + return workspaceValue as T; + }; +} diff --git a/test/generated/base/aWBStocks/aWBStocks.acl.ts b/test/generated/base/aWBStocks/aWBStocks.acl.ts index aae7050..ab8512e 100644 --- a/test/generated/base/aWBStocks/aWBStocks.acl.ts +++ b/test/generated/base/aWBStocks/aWBStocks.acl.ts @@ -1,87 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace AWBStocksAcl { - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List AWB stocks - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Read", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List AWB stocks + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Create", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Create", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get AWB stock details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Read", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get AWB stock details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Update", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Update", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Update", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive AWB stock + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; + +/** + * Use for `useGenerateNextNumber` mutation ability. For global ability, omit the object parameter. + * @description Generate next AWB number + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateNextNumber` mutation + */ +export const canUseGenerateNextNumber = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("AWBStock", object) : "AWBStock" +] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - /** - * Use for `useGenerateNextNumber` mutation ability. For global ability, omit the object parameter. - * @description Generate next AWB number - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateNextNumber` mutation - */ - export const canUseGenerateNextNumber = (object?: { officeId: string }) => - ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Update", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; } diff --git a/test/generated/base/aWBStocks/aWBStocks.api.ts b/test/generated/base/aWBStocks/aWBStocks.api.ts index 7e8f3ac..47097eb 100644 --- a/test/generated/base/aWBStocks/aWBStocks.api.ts +++ b/test/generated/base/aWBStocks/aWBStocks.api.ts @@ -1,114 +1,67 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { AWBStocksModels } from "./aWBStocks.models"; export namespace AWBStocksApi { - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: AWBStocksModels.AWBStockFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, - `/offices/${officeId}/awb-stocks`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = ( - officeId: string, - data: AWBStocksModels.CreateAWBStockRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, + `/offices/${officeId}/awb-stocks`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: AWBStocksModels.CreateAWBStockRequestDTO, ) => { return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks`, - ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), - config, - ); - }; - - export const findById = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks`, + ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), + + ) +}; +export const findById = (stockId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}`, - config, - ); - }; - - export const update = ( - stockId: string, - officeId: string, - data: AWBStocksModels.UpdateAWBStockRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}`, + + ) +}; +export const update = (stockId: string, officeId: string, data: AWBStocksModels.UpdateAWBStockRequestDTO, ) => { return AppRestClient.patch( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}`, - ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), - config, - ); - }; - - export const archive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}`, + ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), + + ) +}; +export const archive = (stockId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}/archive`, + + ) +}; +export const unarchive = (stockId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, - undefined, - config, - ); - }; - - export const generateNextNumber = ( - officeId: string, - data: AWBStocksModels.GenerateAWBNumberRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, + + ) +}; +export const generateNextNumber = (officeId: string, data: AWBStocksModels.GenerateAWBNumberRequestDTO, ) => { return AppRestClient.post( - { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/generate-number`, - ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), - config, - ); - }; + { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, + `/offices/${officeId}/awb-stocks/generate-number`, + ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/aWBStocks/aWBStocks.configs.ts b/test/generated/base/aWBStocks/aWBStocks.configs.ts index 4317f98..66cd58d 100644 --- a/test/generated/base/aWBStocks/aWBStocks.configs.ts +++ b/test/generated/base/aWBStocks/aWBStocks.configs.ts @@ -5,87 +5,88 @@ import { AWBStocksQueries } from "./aWBStocks.queries"; import { AWBStocksAcl } from "./aWBStocks.acl"; export namespace AWBStocksConfigs { - export const awbStocksConfig = { +export const awbStocksConfig = { meta: { - title: "Awb Stocks", + title: "Awb Stocks", }, readAll: { - acl: AWBStocksAcl.canUsePaginate, - schema: AWBStocksModels.AWBStockResponseDTOSchema, - paginated: AWBStocksQueries.usePaginate, - infinite: AWBStocksQueries.usePaginateInfinite, - filters: { - schema: AWBStocksModels.AWBStockFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AWBStocksModels.AWBStockFilterDtoSchema, - options: { - inputs: { - archived: true, - carrierId: true, - searchQuery: true, - used: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: AWBStocksAcl.canUsePaginate, schema: AWBStocksModels.AWBStockResponseDTOSchema, - options: { - columns: { - id: true, - carrier: true, - startNumber: true, - lastUsedNumber: true, - stock: true, - usedCodes: true, - priority: true, - archived: true, - comments: true, - createdAt: true, - updatedAt: true, - createdBy: true, - updatedBy: true, - officeId: true, - }, - sortable: AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema, + paginated: AWBStocksQueries.usePaginate, + infinite: AWBStocksQueries.usePaginateInfinite, + filters: { + schema: AWBStocksModels.AWBStockFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AWBStocksModels.AWBStockFilterDtoSchema, + options: { + inputs: { + archived: true, + carrierId: true, + searchQuery: true, + used: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: AWBStocksModels.AWBStockResponseDTOSchema, + options: { + columns: { + id: true, + carrier: true, + startNumber: true, + lastUsedNumber: true, + stock: true, + usedCodes: true, + priority: true, + archived: true, + comments: true, + createdAt: true, + updatedAt: true, + createdBy: true, + updatedBy: true, + officeId: true, + }, + sortable: AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: AWBStocksAcl.canUseFindById, - schema: AWBStocksModels.AWBStockResponseDTOSchema, - query: AWBStocksQueries.useFindById, + acl: AWBStocksAcl.canUseFindById, + schema: AWBStocksModels.AWBStockResponseDTOSchema, + query: AWBStocksQueries.useFindById, }, create: { - acl: AWBStocksAcl.canUseCreate, - schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, - mutation: AWBStocksQueries.useCreate, - inputDefs: dynamicInputs({ + acl: AWBStocksAcl.canUseCreate, schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, - options: { - inputs: { - carrierId: true, - startNumber: true, - stock: true, - priority: true, - comments: true, - officeId: true, - }, - }, - }), + mutation: AWBStocksQueries.useCreate, + inputDefs: dynamicInputs({ + schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, + options: { + inputs: { + carrierId: true, + startNumber: true, + stock: true, + priority: true, + comments: true, + officeId: true, + }, + }, +}) }, update: { - acl: AWBStocksAcl.canUseUpdate, - schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, - mutation: AWBStocksQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: AWBStocksAcl.canUseUpdate, schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, - options: { - inputs: { - comments: true, - }, - }, - }), + mutation: AWBStocksQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, + options: { + inputs: { + comments: true, }, - }; + }, +}) + }, +}; + } diff --git a/test/generated/base/aWBStocks/aWBStocks.models.ts b/test/generated/base/aWBStocks/aWBStocks.models.ts index e8fe89f..2d817fa 100644 --- a/test/generated/base/aWBStocks/aWBStocks.models.ts +++ b/test/generated/base/aWBStocks/aWBStocks.models.ts @@ -2,163 +2,113 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace AWBStocksModels { - /** - * AWBStockBusinessPartnerPreviewDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } name Business partner name - * @property { string } carrierPrefix Carrier prefix (3 digits) - */ - export const AWBStockBusinessPartnerPreviewDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - name: z.string().describe("Business partner name"), - carrierPrefix: z.string().describe("Carrier prefix (3 digits)"), - }) - .readonly(); - export type AWBStockBusinessPartnerPreviewDTO = z.infer; +/** + * AWBStockBusinessPartnerPreviewDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } name Business partner name + * @property { string } carrierPrefix Carrier prefix (3 digits) + */ +export const AWBStockBusinessPartnerPreviewDTOSchema = z.object({ id: z.string(), name: z.string(), carrierPrefix: z.string() }); +export type AWBStockBusinessPartnerPreviewDTO = z.infer; - /** - * AWBStockEmployeePreviewDTOSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Employee email - */ - export const AWBStockEmployeePreviewDTOSchema = z - .object({ id: z.string().describe("Employee ID"), email: z.string().describe("Employee email") }) - .readonly(); - export type AWBStockEmployeePreviewDTO = z.infer; +/** + * AWBStockEmployeePreviewDTOSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Employee email + */ +export const AWBStockEmployeePreviewDTOSchema = z.object({ id: z.string(), email: z.string() }); +export type AWBStockEmployeePreviewDTO = z.infer; - /** - * AWBStockResponseDTOSchema - * @type { object } - * @property { string } id AWB stock ID - * @property { AWBStockBusinessPartnerPreviewDTO } carrier Carrier business partner - * @property { number } startNumber Start number - * @property { number } lastUsedNumber Last used number - * @property { number } stock Stock size - * @property { number } usedCodes Used codes count - * @property { number } priority Priority - * @property { boolean } archived Is archived - * @property { string } comments Comments - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { AWBStockEmployeePreviewDTO } createdBy User who created the stock - * @property { AWBStockEmployeePreviewDTO } updatedBy User who updated the stock - * @property { string } officeId Office ID - */ - export const AWBStockResponseDTOSchema = z - .object({ - id: z.string().describe("AWB stock ID"), - carrier: AWBStockBusinessPartnerPreviewDTOSchema.describe("Carrier business partner"), - startNumber: z.number().describe("Start number"), - lastUsedNumber: z.number().describe("Last used number").nullish(), - stock: z.number().describe("Stock size"), - usedCodes: z.number().describe("Used codes count"), - priority: z.number().describe("Priority"), - archived: z.boolean().describe("Is archived"), - comments: z.string().describe("Comments").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - createdBy: AWBStockEmployeePreviewDTOSchema.describe("User who created the stock"), - updatedBy: AWBStockEmployeePreviewDTOSchema.describe("User who updated the stock").nullish(), - officeId: z.string().describe("Office ID"), - }) - .readonly(); - export type AWBStockResponseDTO = z.infer; +/** + * AWBStockResponseDTOSchema + * @type { object } + * @property { string } id AWB stock ID + * @property { AWBStockBusinessPartnerPreviewDTO } carrier Carrier business partner + * @property { number } startNumber Start number + * @property { number } lastUsedNumber Last used number + * @property { number } stock Stock size + * @property { number } usedCodes Used codes count + * @property { number } priority Priority + * @property { boolean } archived Is archived + * @property { string } comments Comments + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { AWBStockEmployeePreviewDTO } createdBy User who created the stock + * @property { AWBStockEmployeePreviewDTO } updatedBy User who updated the stock + * @property { string } officeId Office ID + */ +export const AWBStockResponseDTOSchema = z.object({ id: z.string(), carrier: AWBStockBusinessPartnerPreviewDTOSchema, startNumber: z.number(), lastUsedNumber: z.number().nullish(), stock: z.number(), usedCodes: z.number(), priority: z.number(), archived: z.boolean(), comments: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: AWBStockEmployeePreviewDTOSchema, updatedBy: AWBStockEmployeePreviewDTOSchema.nullish(), officeId: z.string() }); +export type AWBStockResponseDTO = z.infer; - /** - * AWBStockFilterDtoSchema - * @type { object } - * @property { boolean } archived - * @property { string } carrierId - * @property { string } searchQuery - * @property { boolean } used - */ - export const AWBStockFilterDtoSchema = z - .object({ archived: z.boolean(), carrierId: z.string(), searchQuery: z.string(), used: z.boolean() }) - .readonly(); - export type AWBStockFilterDto = z.infer; +/** + * AWBStockFilterDtoSchema + * @type { object } + * @property { boolean } archived + * @property { string } carrierId + * @property { string } searchQuery + * @property { boolean } used + */ +export const AWBStockFilterDtoSchema = z.object({ archived: z.boolean().nullable(), carrierId: z.string().nullable(), searchQuery: z.string().nullable(), used: z.boolean().nullable() }).partial(); +export type AWBStockFilterDto = z.infer; - /** - * CreateAWBStockRequestDTOSchema - * @type { object } - * @property { string } carrierId Carrier business partner ID - * @property { number } startNumber Start number. Minimum: `0` - * @property { number } stock Stock size - * @property { number } priority Priority - * @property { string } comments Comments - * @property { string } officeId Office ID - */ - export const CreateAWBStockRequestDTOSchema = z - .object({ - carrierId: z.string().describe("Carrier business partner ID"), - startNumber: z.number().gte(0).describe("Start number"), - stock: z.number().describe("Stock size"), - priority: z.number().describe("Priority"), - comments: z.string().describe("Comments").nullish(), - officeId: z.string().describe("Office ID"), - }) - .readonly(); - export type CreateAWBStockRequestDTO = z.infer; +/** + * CreateAWBStockRequestDTOSchema + * @type { object } + * @property { string } carrierId Carrier business partner ID + * @property { number } startNumber Start number. Minimum: `0` + * @property { number } stock Stock size + * @property { number } priority Priority + * @property { string } comments Comments + * @property { string } officeId Office ID + */ +export const CreateAWBStockRequestDTOSchema = z.object({ carrierId: z.string(), startNumber: z.number().gte(0), stock: z.number(), priority: z.number(), comments: z.string().nullish(), officeId: z.string() }); +export type CreateAWBStockRequestDTO = z.infer; - /** - * GenerateAWBNumberRequestDTOSchema - * @type { object } - * @property { string } carrierId Carrier ID. Example: `e847c7dd-a364-4488-bed6-1e5878aff022` - */ - export const GenerateAWBNumberRequestDTOSchema = z - .object({ carrierId: z.string().describe("Carrier ID") }) - .readonly(); - export type GenerateAWBNumberRequestDTO = z.infer; +/** + * GenerateAWBNumberRequestDTOSchema + * @type { object } + * @property { string } carrierId Carrier ID. Example: `e847c7dd-a364-4488-bed6-1e5878aff022` + */ +export const GenerateAWBNumberRequestDTOSchema = z.object({ carrierId: z.string() }); +export type GenerateAWBNumberRequestDTO = z.infer; - /** - * GenerateAWBNumberResponseDTOSchema - * @type { object } - * @property { string } formattedAwbNumber Generated AWB number. Example: `123-45678901` - */ - export const GenerateAWBNumberResponseDTOSchema = z - .object({ formattedAwbNumber: z.string().describe("Generated AWB number") }) - .readonly(); - export type GenerateAWBNumberResponseDTO = z.infer; +/** + * GenerateAWBNumberResponseDTOSchema + * @type { object } + * @property { string } formattedAwbNumber Generated AWB number. Example: `123-45678901` + */ +export const GenerateAWBNumberResponseDTOSchema = z.object({ formattedAwbNumber: z.string() }); +export type GenerateAWBNumberResponseDTO = z.infer; - /** - * UpdateAWBStockRequestDTOSchema - * @type { object } - * @property { string } comments Comments - */ - export const UpdateAWBStockRequestDTOSchema = z.object({ comments: z.string().describe("Comments") }).readonly(); - export type UpdateAWBStockRequestDTO = z.infer; +/** + * UpdateAWBStockRequestDTOSchema + * @type { object } + * @property { string } comments Comments + */ +export const UpdateAWBStockRequestDTOSchema = z.object({ comments: z.string().nullable() }).partial(); +export type UpdateAWBStockRequestDTO = z.infer; - /** - * AWBStocksPaginateOrderParamEnumSchema - * @type { enum } - */ - export const AWBStocksPaginateOrderParamEnumSchema = z.enum([ - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "carrierName", - "startNumber", - "priority", - ]); - export type AWBStocksPaginateOrderParamEnum = z.infer; - export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSchema.enum; +/** + * AWBStocksPaginateOrderParamEnumSchema + * @type { enum } + */ +export const AWBStocksPaginateOrderParamEnumSchema = z.enum(["createdAt", "updatedAt", "createdBy", "updatedBy", "carrierName", "startNumber", "priority"]); +export type AWBStocksPaginateOrderParamEnum = z.infer; +export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSchema.enum; + +/** + * AWBStocksPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { AWBStockResponseDTO[] } items + */ +export const AWBStocksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AWBStockResponseDTOSchema).nullable() }).partial().shape }); +export type AWBStocksPaginateResponse = z.infer; - /** - * AWBStocksPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { AWBStockResponseDTO[] } items - */ - export const AWBStocksPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(AWBStockResponseDTOSchema).readonly() }).readonly().shape, - }); - export type AWBStocksPaginateResponse = z.infer; } diff --git a/test/generated/base/aWBStocks/aWBStocks.queries.ts b/test/generated/base/aWBStocks/aWBStocks.queries.ts index 1731fbc..7efe73d 100644 --- a/test/generated/base/aWBStocks/aWBStocks.queries.ts +++ b/test/generated/base/aWBStocks/aWBStocks.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,311 +8,234 @@ import { AWBStocksModels } from "./aWBStocks.models"; import { AWBStocksApi } from "./aWBStocks.api"; export namespace AWBStocksQueries { - export const moduleName = QueryModule.AWBStocks; +export const moduleName = QueryModule.AWBStocks; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: AWBStocksModels.AWBStockFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/awb-stocks", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: AWBStocksModels.AWBStockFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/awb-stocks", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (stockId: string, officeId: string) => - [...keys.all, "/offices/:officeId/awb-stocks/:stockId", stockId, officeId] as const, - }; - - /** - * Query `usePaginate` - * @summary List AWB stocks - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` - * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: AWBStocksModels.AWBStockFilterDto; - page?: number; - cursor?: string; + paginate: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (stockId: string, officeId: string) => [...keys.all, "/offices/:officeId/awb-stocks/:stockId", stockId, officeId] as const, +}; + +/** + * Query `usePaginate` + * @summary List AWB stocks + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` + * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); + return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary List AWB stocks + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` + * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); + return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AWBStocksAcl.canUsePaginate({ officeId })); - return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary List AWB stocks - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` - * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { officeId: string; limit: number; order?: string; filter?: AWBStocksModels.AWBStockFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AWBStocksAcl.canUsePaginate({ officeId })); - return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create AWB stock - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.CreateAWBStockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof AWBStocksApi.create, - { officeId: string; data: AWBStocksModels.CreateAWBStockRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(AWBStocksAcl.canUseCreate({ officeId })); - return AWBStocksApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get AWB stock details - * @permission Requires `canUseFindById` ability - * @param { string } object.stockId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { stockId, officeId }: { stockId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(stockId, officeId), - queryFn: () => { - checkAcl(AWBStocksAcl.canUseFindById({ officeId })); - return AWBStocksApi.findById(stockId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update AWB stock comments - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.UpdateAWBStockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof AWBStocksApi.update, - { stockId: string; officeId: string; data: AWBStocksModels.UpdateAWBStockRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId, data }) => { - checkAcl(AWBStocksAcl.canUseUpdate({ officeId })); - return AWBStocksApi.update(stockId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive AWB stock - * @permission Requires `canUseArchive` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId }) => { - checkAcl(AWBStocksAcl.canUseArchive({ officeId })); - return AWBStocksApi.archive(stockId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive AWB stock - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId }) => { - checkAcl(AWBStocksAcl.canUseUnarchive({ officeId })); - return AWBStocksApi.unarchive(stockId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateNextNumber` - * @summary Generate next AWB number for carrier - * @permission Requires `canUseGenerateNextNumber` ability - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.GenerateAWBNumberRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateNextNumber = ( - options?: AppMutationOptions< - typeof AWBStocksApi.generateNextNumber, - { officeId: string; data: AWBStocksModels.GenerateAWBNumberRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create AWB stock + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.CreateAWBStockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(AWBStocksAcl.canUseCreate({ officeId } )); + return AWBStocksApi.create(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get AWB stock details + * @permission Requires `canUseFindById` ability + * @param { string } object.stockId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ stockId, officeId }: { stockId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(stockId, officeId), + queryFn: () => { + checkAcl(AWBStocksAcl.canUseFindById({ officeId } )); + return AWBStocksApi.findById(stockId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update AWB stock comments + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.UpdateAWBStockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId, data }) => { + checkAcl(AWBStocksAcl.canUseUpdate({ officeId } )); + return AWBStocksApi.update(stockId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive AWB stock + * @permission Requires `canUseArchive` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId }) => { + checkAcl(AWBStocksAcl.canUseArchive({ officeId } )); + return AWBStocksApi.archive(stockId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive AWB stock + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.stockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ stockId, officeId }) => { + checkAcl(AWBStocksAcl.canUseUnarchive({ officeId } )); + return AWBStocksApi.unarchive(stockId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { stockId, officeId } = variables; + const updateKeys = [keys.findById(stockId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateNextNumber` + * @summary Generate next AWB number for carrier + * @permission Requires `canUseGenerateNextNumber` ability + * @param { string } mutation.officeId Path parameter + * @param { AWBStocksModels.GenerateAWBNumberRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateNextNumber = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId } )); + return AWBStocksApi.generateNextNumber(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId })); - return AWBStocksApi.generateNextNumber(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/acl/app.ability.ts b/test/generated/base/acl/app.ability.ts index 3aad6f4..7b598a8 100644 --- a/test/generated/base/acl/app.ability.ts +++ b/test/generated/base/acl/app.ability.ts @@ -1,387 +1,32 @@ import { PureAbility, AbilityTuple, ForcedSubject } from "@casl/ability"; -export type AppAbilities = - | AbilityTuple< - "Read", - | "WorkingDocument" - | (ForcedSubject<"WorkingDocument"> & { officeId: string }) - | "Office" - | "Currency" - | "Country" - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - | "BusinessPartner" - | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - | "City" - | "Depot" - | "PartnerNetwork" - | "Warehouse" - | "DocumentTemplate" - | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - | "HsCode" - | "CargoType" - | "Position" - | (ForcedSubject<"Position"> & { officeId: string }) - | "Terminal" - | "Airport" - | "Port" - | "ContainerYard" - | "PositionAccount" - | (ForcedSubject<"PositionAccount"> & { officeId: string }) - | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - | "PositionCargo" - | (ForcedSubject<"PositionCargo"> & { officeId: string }) - | "PackageType" - | "WorkingDocument-house-bl" - | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - | "WorkingDocument-bl-instructions" - | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - | "WorkingDocument-ams-instructions" - | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - | "WorkingDocument-house-awb" - | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - | "ChargeType" - | "WorkingDocument-master-awb" - | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - | "WorkingDocument-cmr-form" - | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - | "WorkingDocument-isf-form" - | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - | "WorkingDocument-fcr-form" - | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - | "Role" - | (ForcedSubject<"Role"> & { context?: string }) - | "Permission" - | "Employee" - | (ForcedSubject<"Employee"> & { officeId?: string }) - | (ForcedSubject<"Employee"> & { officeId: string }) - | "Employment" - | (ForcedSubject<"Employment"> & { officeId?: string }) - | "Customer" - | "Quote" - | (ForcedSubject<"Quote"> & { officeId: string }) - | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) - | "QuoteCargo" - | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - | "Dunning" - | (ForcedSubject<"Dunning"> & { officeId: string }) - | "PositionInvoice" - | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - | "DunningLevel" - | (ForcedSubject<"DunningLevel"> & { officeId: string }) - | "DunningSystem" - | (ForcedSubject<"DunningSystem"> & { officeId: string }) - | "VatRule" - | "ProjectLite" - | (ForcedSubject<"ProjectLite"> & { officeId: string }) - | "ChecklistTemplate" - | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - | "BookkeepingExportBatch" - | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - | "FactoringExport" - | (ForcedSubject<"FactoringExport"> & { officeId: string }) - | "AWBStock" - | (ForcedSubject<"AWBStock"> & { officeId: string }) - | "ChecklistItem" - | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - | "RemarkTemplate" - | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - | "IntegrationChannel" - | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - | "IntegrationMessage" - | (ForcedSubject<"IntegrationMessage"> & { officeId: string }) - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - | (ForcedSubject<"Office"> & { officeId: string }) - > - | AbilityTuple< - "Create", - | "Office" - | "Currency" - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - | "BusinessPartner" - | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - | "City" - | "Depot" - | "PartnerNetwork" - | "Warehouse" - | "DocumentTemplate" - | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - | "HsCode" - | "CargoType" - | "Terminal" - | "Airport" - | "Port" - | "ContainerYard" - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - | "PositionCargo" - | (ForcedSubject<"PositionCargo"> & { officeId: string }) - | "PackageType" - | "WorkingDocument-house-bl" - | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - | "WorkingDocument-bl-instructions" - | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - | "WorkingDocument-ams-instructions" - | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - | "WorkingDocument-house-awb" - | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - | "ChargeType" - | "WorkingDocument-master-awb" - | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - | "WorkingDocument-cmr-form" - | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - | "WorkingDocument-isf-form" - | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - | "WorkingDocument-fcr-form" - | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - | "Role" - | "Employee" - | (ForcedSubject<"Employee"> & { officeId?: string }) - | (ForcedSubject<"Employee"> & { officeId: string }) - | "Employment" - | (ForcedSubject<"Employment"> & { officeId: string }) - | "Customer" - | "Quote" - | (ForcedSubject<"Quote"> & { officeId: string }) - | "QuoteCargo" - | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - | "Dunning" - | (ForcedSubject<"Dunning"> & { officeId: string }) - | "DunningLevel" - | (ForcedSubject<"DunningLevel"> & { officeId: string }) - | "DunningSystem" - | (ForcedSubject<"DunningSystem"> & { officeId: string }) - | "Position" - | (ForcedSubject<"Position"> & { officeId: string }) - | "PositionInvoice" - | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - | "VatRule" - | "ProjectLite" - | (ForcedSubject<"ProjectLite"> & { officeId: string }) - | "ChecklistTemplate" - | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - | "BookkeepingExportBatch" - | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - | "FactoringExport" - | (ForcedSubject<"FactoringExport"> & { officeId: string }) - | "AWBStock" - | (ForcedSubject<"AWBStock"> & { officeId: string }) - | "ChecklistItem" - | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - | "RemarkTemplate" - | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - | "IntegrationChannel" - | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - > - | AbilityTuple< - "Update", - | "Office" - | (ForcedSubject<"Office"> & { officeId: string }) - | "Currency" - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - | "BusinessPartner" - | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - | "BusinessPartnerBasicTab" - | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) - | "BusinessPartnerBookkeeping" - | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - | "City" - | "Depot" - | "PartnerNetwork" - | "Warehouse" - | "DocumentTemplate" - | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - | "HsCode" - | "CargoType" - | "Position" - | (ForcedSubject<"Position"> & { officeId: string }) - | "Terminal" - | "Airport" - | "Port" - | "ContainerYard" - | "PositionAccount" - | (ForcedSubject<"PositionAccount"> & { officeId: string }) - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - | "PositionCargo" - | (ForcedSubject<"PositionCargo"> & { officeId: string }) - | "PackageType" - | "WorkingDocument-house-bl" - | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - | "WorkingDocument-bl-instructions" - | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - | "WorkingDocument-ams-instructions" - | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - | "WorkingDocument-house-awb" - | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - | "ChargeType" - | "WorkingDocument-master-awb" - | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - | "WorkingDocument-cmr-form" - | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - | "WorkingDocument-isf-form" - | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - | "WorkingDocument-fcr-form" - | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - | "Role" - | "Employee" - | (ForcedSubject<"Employee"> & { officeId: string }) - | "Customer" - | "Quote" - | (ForcedSubject<"Quote"> & { officeId: string }) - | "QuoteCargo" - | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - | "DunningLevel" - | (ForcedSubject<"DunningLevel"> & { officeId: string }) - | "DunningSystem" - | (ForcedSubject<"DunningSystem"> & { officeId: string }) - | "PositionInvoice" - | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - | "VatRule" - | "ProjectLite" - | (ForcedSubject<"ProjectLite"> & { officeId: string }) - | "ChecklistTemplate" - | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - | "BookkeepingExportBatch" - | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - | "FactoringExport" - | (ForcedSubject<"FactoringExport"> & { officeId: string }) - | "AWBStock" - | (ForcedSubject<"AWBStock"> & { officeId: string }) - | "ChecklistItem" - | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - | "RemarkTemplate" - | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - | "IntegrationChannel" - | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - > - | AbilityTuple< - "Delete", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - | "BusinessPartnerBookkeeping" - | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - | "PositionCargo" - | (ForcedSubject<"PositionCargo"> & { officeId: string }) - | "WorkingDocument-house-bl" - | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - | "WorkingDocument-bl-instructions" - | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - | "WorkingDocument-ams-instructions" - | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - | "WorkingDocument-house-awb" - | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - | "WorkingDocument-master-awb" - | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - | "WorkingDocument-cmr-form" - | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - | "WorkingDocument-isf-form" - | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - | "WorkingDocument-fcr-form" - | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - | "Role" - | "QuoteCargo" - | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - | "PositionInvoice" - | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - > - | AbilityTuple< - "Archive", - | "BusinessPartner" - | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - | "City" - | "Depot" - | "PartnerNetwork" - | "Warehouse" - | "DocumentTemplate" - | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - | "HsCode" - | "CargoType" - | "Terminal" - | "PackageType" - | "ChargeType" - | "Employee" - | "Employment" - | (ForcedSubject<"Employment"> & { officeId: string }) - | "DunningLevel" - | (ForcedSubject<"DunningLevel"> & { officeId: string }) - | "DunningSystem" - | (ForcedSubject<"DunningSystem"> & { officeId: string }) - | "ProjectLite" - | (ForcedSubject<"ProjectLite"> & { officeId: string }) - | "ChecklistTemplate" - | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - | "ChecklistItem" - | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - | "RemarkTemplate" - | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - | "IntegrationChannel" - | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - > - | AbilityTuple<"ReadRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> - | AbilityTuple<"CreateRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> - | AbilityTuple<"UpdateRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> - | AbilityTuple<"DeleteRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> - | AbilityTuple< - "Unarchive", - | "DocumentTemplate" - | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - | "Terminal" - | "Employee" - | "Employment" - | (ForcedSubject<"Employment"> & { officeId: string }) - | "DunningLevel" - | (ForcedSubject<"DunningLevel"> & { officeId: string }) - | "RemarkTemplate" - | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - > - | AbilityTuple< - "Duplicate", - | "PositionAccount" - | (ForcedSubject<"PositionAccount"> & { officeId: string }) - | "PositionCargo" - | (ForcedSubject<"PositionCargo"> & { officeId: string }) - | "QuoteCargo" - | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - > - | AbilityTuple<"Reassign", "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string })> - | AbilityTuple<"ListRoles", "Employee" | "Employment" | (ForcedSubject<"Employment"> & { officeId: string })> - | AbilityTuple<"UpdateRoles", "Employee" | "Employment" | (ForcedSubject<"Employment"> & { officeId: string })> - | AbilityTuple<"Deactivate", "Customer"> - | AbilityTuple<"Reactivate", "Customer"> - | AbilityTuple< - "Export", - | "Quote" - | (ForcedSubject<"Quote"> & { officeId: string }) - | "Position" - | (ForcedSubject<"Position"> & { officeId: string }) - | "PositionInvoice" - | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - | "UninvoicedCharge" - | (ForcedSubject<"UninvoicedCharge"> & { officeId: string }) - | "InvoicePayment" - | (ForcedSubject<"InvoicePayment"> & { officeId: string }) - | "BookkeepingExportBatch" - | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - > - | AbilityTuple<"ReadInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> - | AbilityTuple<"CreateInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> - | AbilityTuple<"UpdateInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> - | AbilityTuple<"DeleteInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> - | AbilityTuple<"TotalProfitView", "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string })> - | AbilityTuple<"RevertCancel", "Position" | (ForcedSubject<"Position"> & { officeId: string })> - | AbilityTuple<"Fix", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> - | AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> - | AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> - | AbilityTuple<"Import", "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string })>; +export type AppAbilities = +| AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, } | "Office" | "Currency" | "Country" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | ForcedSubject<"Role"> & { context?: string, } | "Permission" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId?: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, } | ForcedSubject<"Office"> & { officeId: string, }> +| AbilityTuple<"Create", "Office" | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "Airport" | "Port" | "ContainerYard" | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> +| AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, } | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }> +| AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "PackageType" | "ChargeType" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> +| AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> +| AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "Terminal" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }> +| AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }> +| AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> +| AbilityTuple<"ListRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> +| AbilityTuple<"UpdateRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> +| AbilityTuple<"Deactivate", "Customer"> +| AbilityTuple<"Reactivate", "Customer"> +| AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, } | "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }> +| AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> +| AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> +| AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }> +| AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> +| AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }> -export type AppAbility = PureAbility; +export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/base/acl/useAclCheck.ts b/test/generated/base/acl/useAclCheck.ts index adf3779..723069f 100644 --- a/test/generated/base/acl/useAclCheck.ts +++ b/test/generated/base/acl/useAclCheck.ts @@ -1,8 +1,7 @@ import { AbilityTuple } from "@casl/ability"; -import { type ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; -import { AbilityContext } from "@povio/openapi-codegen-cli/acl"; +import { type ErrorHandler, SharedErrorHandler } from ""; +import { AbilityContext } from ""; import { useCallback } from "react"; - import { AppAbilities } from "@/data/acl/app.ability"; interface UseAclCheckProps { @@ -10,16 +9,13 @@ interface UseAclCheckProps { } export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { - const ability = AbilityContext.useAbility(); + const ability = AbilityContext.useAbility(); - const checkAcl = useCallback( - (appAbility: AppAbilities) => { - if (!ability.can(...(appAbility as AbilityTuple))) { - (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); - } - }, - [ability, errorHandler], - ); + const checkAcl = useCallback((appAbility: AppAbilities) => { + if (!ability.can(...(appAbility as AbilityTuple))) { + (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); + } + }, [ability, errorHandler]); return { checkAcl }; } diff --git a/test/generated/base/airPositions/airPositions.acl.ts b/test/generated/base/airPositions/airPositions.acl.ts index 10a4dc7..6c0afca 100644 --- a/test/generated/base/airPositions/airPositions.acl.ts +++ b/test/generated/base/airPositions/airPositions.acl.ts @@ -1,27 +1,30 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace AirPositionsAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get air position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get air position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update air position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update air position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; } diff --git a/test/generated/base/airPositions/airPositions.api.ts b/test/generated/base/airPositions/airPositions.api.ts index 1d17388..5b8e89a 100644 --- a/test/generated/base/airPositions/airPositions.api.ts +++ b/test/generated/base/airPositions/airPositions.api.ts @@ -1,28 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { AirPositionsModels } from "./airPositions.models"; export namespace AirPositionsApi { - export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/air-position`, - config, - ); - }; - - export const update = ( - officeId: string, - positionId: string, - data: AirPositionsModels.UpdateAirPositionRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/air-position`, + + ) +}; +export const update = (officeId: string, positionId: string, data: AirPositionsModels.UpdateAirPositionRequestDTO, ) => { return AppRestClient.patch( - { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/air-position`, - ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), - config, - ); - }; + { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/air-position`, + ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/airPositions/airPositions.models.ts b/test/generated/base/airPositions/airPositions.models.ts index a3dd669..bd514c5 100644 --- a/test/generated/base/airPositions/airPositions.models.ts +++ b/test/generated/base/airPositions/airPositions.models.ts @@ -1,77 +1,49 @@ import { z } from "zod"; export namespace AirPositionsModels { - /** - * AirPositionCustomsStatusTypeEnumSchema - * @type { enum } - */ - export const AirPositionCustomsStatusTypeEnumSchema = z.enum(["Other", "X", "C", "TD", "T1"]); - export type AirPositionCustomsStatusTypeEnum = z.infer; - export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnumSchema.enum; +/** + * AirPositionCustomsStatusTypeEnumSchema + * @type { enum } + */ +export const AirPositionCustomsStatusTypeEnumSchema = z.enum(["Other", "X", "C", "TD", "T1"]); +export type AirPositionCustomsStatusTypeEnum = z.infer; +export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnumSchema.enum; - /** - * AirPositionResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } hawbNumber - * @property { string } mawbNumber - * @property { string } airlineDeadline - * @property { string } customsStatus - * @property { AirPositionCustomsStatusTypeEnum } customsStatusType - * @property { boolean } hawbRequired - * @property { boolean } mawbRequired - * @property { string } mrnT1Number - * @property { boolean } isCourier - * @property { string } deliveryToConsignee - * @property { string } createdAt - * @property { string } updatedAt - */ - export const AirPositionResponseDTOSchema = z - .object({ - id: z.string(), - hawbNumber: z.string().nullish(), - mawbNumber: z.string().nullish(), - airlineDeadline: z.iso.datetime({ offset: true }).nullish(), - customsStatus: z.string().nullish(), - customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), - hawbRequired: z.boolean(), - mawbRequired: z.boolean(), - mrnT1Number: z.string().nullish(), - isCourier: z.boolean().nullish(), - deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type AirPositionResponseDTO = z.infer; +/** + * AirPositionResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } hawbNumber + * @property { string } mawbNumber + * @property { string } airlineDeadline + * @property { string } customsStatus + * @property { AirPositionCustomsStatusTypeEnum } customsStatusType + * @property { boolean } hawbRequired + * @property { boolean } mawbRequired + * @property { string } mrnT1Number + * @property { boolean } isCourier + * @property { string } deliveryToConsignee + * @property { string } createdAt + * @property { string } updatedAt + */ +export const AirPositionResponseDTOSchema = z.object({ id: z.string(), hawbNumber: z.string().nullish(), mawbNumber: z.string().nullish(), airlineDeadline: z.iso.datetime({ offset: true }).nullish(), customsStatus: z.string().nullish(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), mrnT1Number: z.string().nullish(), isCourier: z.boolean().nullish(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }); +export type AirPositionResponseDTO = z.infer; + +/** + * UpdateAirPositionRequestDTOSchema + * @type { object } + * @property { string } hawbNumber + * @property { string } mawbNumber + * @property { string } airlineDeadline + * @property { string } customsStatus + * @property { AirPositionCustomsStatusTypeEnum } customsStatusType + * @property { string } mrnT1Number + * @property { boolean } hawbRequired + * @property { boolean } mawbRequired + * @property { boolean } isCourier + * @property { string } deliveryToConsignee + */ +export const UpdateAirPositionRequestDTOSchema = z.object({ hawbNumber: z.string().nullable(), mawbNumber: z.string().nullable(), airlineDeadline: z.iso.datetime({ offset: true }).nullable(), customsStatus: z.string().nullable(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullable(), mrnT1Number: z.string().nullable(), hawbRequired: z.boolean().nullable(), mawbRequired: z.boolean().nullable(), isCourier: z.boolean().nullable(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullable() }).partial(); +export type UpdateAirPositionRequestDTO = z.infer; - /** - * UpdateAirPositionRequestDTOSchema - * @type { object } - * @property { string } hawbNumber - * @property { string } mawbNumber - * @property { string } airlineDeadline - * @property { string } customsStatus - * @property { AirPositionCustomsStatusTypeEnum } customsStatusType - * @property { string } mrnT1Number - * @property { boolean } hawbRequired - * @property { boolean } mawbRequired - * @property { boolean } isCourier - * @property { string } deliveryToConsignee - */ - export const UpdateAirPositionRequestDTOSchema = z - .object({ - hawbNumber: z.string(), - mawbNumber: z.string(), - airlineDeadline: z.iso.datetime({ offset: true }), - customsStatus: z.string(), - customsStatusType: AirPositionCustomsStatusTypeEnumSchema, - mrnT1Number: z.string(), - hawbRequired: z.boolean(), - mawbRequired: z.boolean(), - isCourier: z.boolean(), - deliveryToConsignee: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type UpdateAirPositionRequestDTO = z.infer; } diff --git a/test/generated/base/airPositions/airPositions.queries.ts b/test/generated/base/airPositions/airPositions.queries.ts index 3cddf4f..3671950 100644 --- a/test/generated/base/airPositions/airPositions.queries.ts +++ b/test/generated/base/airPositions/airPositions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,75 +8,63 @@ import { AirPositionsModels } from "./airPositions.models"; import { AirPositionsApi } from "./airPositions.api"; export namespace AirPositionsQueries { - export const moduleName = QueryModule.AirPositions; +export const moduleName = QueryModule.AirPositions; - export const keys = { +export const keys = { all: [moduleName] as const, - get: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/air-position", officeId, positionId] as const, - }; + get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/air-position", officeId, positionId] as const, +}; - /** - * Query `useGet` - * @summary Get air position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGet` + * @summary Get air position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(AirPositionsAcl.canUseGet({ officeId } )); + return AirPositionsApi.get(officeId, positionId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(AirPositionsAcl.canUseGet({ officeId })); - return AirPositionsApi.get(officeId, positionId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update air position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AirPositionsModels.UpdateAirPositionRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update air position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AirPositionsModels.UpdateAirPositionRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof AirPositionsApi.update, - { officeId: string; positionId: string; data: AirPositionsModels.UpdateAirPositionRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(AirPositionsAcl.canUseUpdate({ officeId } )); + return AirPositionsApi.update(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(AirPositionsAcl.canUseUpdate({ officeId })); - return AirPositionsApi.update(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/airports/airports.acl.ts b/test/generated/base/airports/airports.acl.ts index 5ec8aa1..1af795c 100644 --- a/test/generated/base/airports/airports.acl.ts +++ b/test/generated/base/airports/airports.acl.ts @@ -1,33 +1,54 @@ import { AbilityTuple } from "@casl/ability"; export namespace AirportsAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Airport" +] as AbilityTuple<"Read", "Airport">; - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Airport"] as AbilityTuple<"Create", "Airport">; +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Airport" +] as AbilityTuple<"Create", "Airport">; - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Airport" +] as AbilityTuple<"Read", "Airport">; - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Airport"] as AbilityTuple<"Update", "Airport">; +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Airport" +] as AbilityTuple<"Update", "Airport">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Airport" +] as AbilityTuple<"Read", "Airport">; - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; } diff --git a/test/generated/base/airports/airports.api.ts b/test/generated/base/airports/airports.api.ts index c50c8ca..efd1d01 100644 --- a/test/generated/base/airports/airports.api.ts +++ b/test/generated/base/airports/airports.api.ts @@ -1,105 +1,60 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { AirportsModels } from "./airports.models"; export namespace AirportsApi { - export const paginate = ( - limit: number, - order?: string, - filter?: AirportsModels.AirportPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: AirportsModels.AirportsPaginateResponseSchema }, `/airports`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: AirportsModels.CreateAirportRequestDTO, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: AirportsModels.AirportsPaginateResponseSchema }, + `/airports`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: AirportsModels.CreateAirportRequestDTO, ) => { return AppRestClient.post( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports`, - ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), - config, - ); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: AirportsModels.AirportLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports`, + ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), + + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, - `/airports/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, + `/airports/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, ) => { return AppRestClient.patch( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports/${id}`, - ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), - config, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: AirportsModels.AirportResponseDTOSchema }, `/airports/${id}`, config); - }; + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports/${id}`, + ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), + + ) +}; +export const findById = (id: string, ) => { + return AppRestClient.get( + { resSchema: AirportsModels.AirportResponseDTOSchema }, + `/airports/${id}`, + + ) +}; } diff --git a/test/generated/base/airports/airports.configs.ts b/test/generated/base/airports/airports.configs.ts index 477cb42..9b47119 100644 --- a/test/generated/base/airports/airports.configs.ts +++ b/test/generated/base/airports/airports.configs.ts @@ -6,112 +6,113 @@ import { AirportsQueries } from "./airports.queries"; import { AirportsAcl } from "./airports.acl"; export namespace AirportsConfigs { - export const airportsConfig = { +export const airportsConfig = { meta: { - title: "Airports", + title: "Airports", }, readAll: { - acl: AirportsAcl.canUsePaginate, - schema: AirportsModels.AirportResponseDTOSchema, - paginated: AirportsQueries.usePaginate, - infinite: AirportsQueries.usePaginateInfinite, - filters: { - schema: AirportsModels.AirportPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AirportsModels.AirportPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: AirportsAcl.canUsePaginate, schema: AirportsModels.AirportResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - iataCode: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: AirportsModels.AirportsPaginateOrderParamEnumSchema, + paginated: AirportsQueries.usePaginate, + infinite: AirportsQueries.usePaginateInfinite, + filters: { + schema: AirportsModels.AirportPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AirportsModels.AirportPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: AirportsModels.AirportResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + iataCode: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: AirportsModels.AirportsPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: AirportsAcl.canUseFindById, - schema: AirportsModels.AirportResponseDTOSchema, - query: AirportsQueries.useFindById, + acl: AirportsAcl.canUseFindById, + schema: AirportsModels.AirportResponseDTOSchema, + query: AirportsQueries.useFindById, }, create: { - acl: AirportsAcl.canUseCreate, - schema: AirportsModels.CreateAirportRequestDTOSchema, - mutation: AirportsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: AirportsAcl.canUseCreate, schema: AirportsModels.CreateAirportRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - iataCode: true, - }, - }, - }), + mutation: AirportsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: AirportsModels.CreateAirportRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + iataCode: true, + }, + }, +}) }, update: { - acl: AirportsAcl.canUseUpdate, - schema: AirportsModels.UpdateAirportRequestDTOSchema, - mutation: AirportsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: AirportsAcl.canUseUpdate, schema: AirportsModels.UpdateAirportRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - iataCode: true, - }, - }, - }), + mutation: AirportsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: AirportsModels.UpdateAirportRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + iataCode: true, + }, + }, +}) }, - }; +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: AirportsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: AirportsQueries.usePaginateLabels, - infinite: AirportsQueries.usePaginateLabelsInfinite, - filters: { - schema: AirportsModels.AirportLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AirportsModels.AirportLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: AirportsAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema, + paginated: AirportsQueries.usePaginateLabels, + infinite: AirportsQueries.usePaginateLabelsInfinite, + filters: { + schema: AirportsModels.AirportLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: AirportsModels.AirportLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/airports/airports.models.ts b/test/generated/base/airports/airports.models.ts index 790cc10..6d862c1 100644 --- a/test/generated/base/airports/airports.models.ts +++ b/test/generated/base/airports/airports.models.ts @@ -2,156 +2,108 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace AirportsModels { - /** - * AirportEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type AirportEmployeeDTO = z.infer; +/** + * AirportEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type AirportEmployeeDTO = z.infer; - /** - * AirportResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the airport - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - * @property { string } createdById - * @property { AirportEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { AirportEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const AirportResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the airport"), - name: z.string().describe("Name of the airport"), - matchCode: z.string().describe("Match code for the airport"), - iataCode: z.string().describe("IATA code of the airport"), - createdById: z.string().nullish(), - createdBy: AirportEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: AirportEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type AirportResponseDTO = z.infer; +/** + * AirportResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the airport + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + * @property { string } createdById + * @property { AirportEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { AirportEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const AirportResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), iataCode: z.string(), createdById: z.string().nullish(), createdBy: AirportEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: AirportEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type AirportResponseDTO = z.infer; - /** - * AirportPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter airports by name, match code or IATA code - */ - export const AirportPaginationFilterDtoSchema = z - .object({ search: z.string().describe("Search term to filter airports by name, match code or IATA code") }) - .readonly(); - export type AirportPaginationFilterDto = z.infer; +/** + * AirportPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter airports by name, match code or IATA code + */ +export const AirportPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type AirportPaginationFilterDto = z.infer; - /** - * AirportLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const AirportLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type AirportLabelFilterDto = z.infer; +/** + * AirportLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const AirportLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type AirportLabelFilterDto = z.infer; - /** - * CreateAirportRequestDTOSchema - * @type { object } - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - */ - export const CreateAirportRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the airport"), - matchCode: z.string().describe("Match code for the airport"), - iataCode: z.string().describe("IATA code of the airport"), - }) - .readonly(); - export type CreateAirportRequestDTO = z.infer; +/** + * CreateAirportRequestDTOSchema + * @type { object } + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + */ +export const CreateAirportRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), iataCode: z.string() }); +export type CreateAirportRequestDTO = z.infer; - /** - * UpdateAirportRequestDTOSchema - * @type { object } - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - */ - export const UpdateAirportRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the airport"), - matchCode: z.string().describe("Match code for the airport"), - iataCode: z.string().describe("IATA code of the airport"), - }) - .readonly(); - export type UpdateAirportRequestDTO = z.infer; +/** + * UpdateAirportRequestDTOSchema + * @type { object } + * @property { string } name Name of the airport + * @property { string } matchCode Match code for the airport + * @property { string } iataCode IATA code of the airport + */ +export const UpdateAirportRequestDTOSchema = z.object({ name: z.string().nullable(), matchCode: z.string().nullable(), iataCode: z.string().nullable() }).partial(); +export type UpdateAirportRequestDTO = z.infer; - /** - * AirportsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const AirportsPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "iataCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type AirportsPaginateOrderParamEnum = z.infer; - export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSchema.enum; +/** + * AirportsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const AirportsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type AirportsPaginateOrderParamEnum = z.infer; +export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSchema.enum; - /** - * AirportsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { AirportResponseDTO[] } items - */ - export const AirportsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(AirportResponseDTOSchema).readonly() }).readonly().shape, - }); - export type AirportsPaginateResponse = z.infer; +/** + * AirportsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { AirportResponseDTO[] } items + */ +export const AirportsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AirportResponseDTOSchema).nullable() }).partial().shape }); +export type AirportsPaginateResponse = z.infer; - /** - * AirportsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const AirportsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "iataCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type AirportsPaginateLabelsOrderParamEnum = z.infer; - export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderParamEnumSchema.enum; +/** + * AirportsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const AirportsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type AirportsPaginateLabelsOrderParamEnum = z.infer; +export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * AirportsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const AirportsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type AirportsPaginateLabelsResponse = z.infer; - /** - * AirportsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const AirportsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type AirportsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/airports/airports.queries.ts b/test/generated/base/airports/airports.queries.ts index 3f6c5b9..47b06ab 100644 --- a/test/generated/base/airports/airports.queries.ts +++ b/test/generated/base/airports/airports.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,286 +8,201 @@ import { AirportsModels } from "./airports.models"; import { AirportsApi } from "./airports.api"; export namespace AirportsQueries { - export const moduleName = QueryModule.Airports; +export const moduleName = QueryModule.Airports; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: AirportsModels.AirportPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/airports", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: AirportsModels.AirportPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/airports", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: AirportsModels.AirportLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/airports/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: AirportsModels.AirportLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/airports/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string) => [...keys.all, "/airports", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string) => [...keys.all, "/airports/labels/paginate", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/airports/:id", id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Airports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: AirportsModels.AirportPaginationFilterDto; - page?: number; - cursor?: string; +}; + +/** + * Query `usePaginate` + * @summary Paginate Airports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AirportsAcl.canUsePaginate()); + return AirportsApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Airports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AirportsAcl.canUsePaginate()); + return AirportsApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Airports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: AirportsModels.AirportPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create airport - * @permission Requires `canUseCreate` ability - * @param { AirportsModels.CreateAirportRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(AirportsAcl.canUseCreate()); - return AirportsApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate airports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: AirportsModels.AirportLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate airports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: AirportsModels.AirportLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update airport - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { AirportsModels.UpdateAirportRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof AirportsApi.update, - { id: string; data: AirportsModels.UpdateAirportRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(AirportsAcl.canUseUpdate()); - return AirportsApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get airport - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create airport + * @permission Requires `canUseCreate` ability + * @param { AirportsModels.CreateAirportRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(AirportsAcl.canUseCreate()); + return AirportsApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate airports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(AirportsAcl.canUsePaginateLabels()); + return AirportsApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate airports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(AirportsAcl.canUsePaginateLabels()); + return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update airport + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { AirportsModels.UpdateAirportRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(AirportsAcl.canUseUpdate()); + return AirportsApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get airport + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(AirportsAcl.canUseFindById()); + return AirportsApi.findById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(AirportsAcl.canUseFindById()); - return AirportsApi.findById(id, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/app-rest-client.ts b/test/generated/base/app-rest-client.ts index 389b1f4..dc174bc 100644 --- a/test/generated/base/app-rest-client.ts +++ b/test/generated/base/app-rest-client.ts @@ -2,6 +2,6 @@ import { RestClient } from "@povio/openapi-codegen-cli"; export const AppRestClient = new RestClient({ config: { - baseURL: "http://localhost:4000", + baseURL: "http://localhost:4000" }, }); diff --git a/test/generated/base/bankAccounts/bankAccounts.acl.ts b/test/generated/base/bankAccounts/bankAccounts.acl.ts index d8024f8..18ce4b2 100644 --- a/test/generated/base/bankAccounts/bankAccounts.acl.ts +++ b/test/generated/base/bankAccounts/bankAccounts.acl.ts @@ -1,15 +1,24 @@ import { AbilityTuple } from "@casl/ability"; export namespace BankAccountsAcl { - /** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Office" +] as AbilityTuple<"Read", "Office">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Office" +] as AbilityTuple<"Read", "Office">; - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; } diff --git a/test/generated/base/bankAccounts/bankAccounts.api.ts b/test/generated/base/bankAccounts/bankAccounts.api.ts index 2d61663..1274ba6 100644 --- a/test/generated/base/bankAccounts/bankAccounts.api.ts +++ b/test/generated/base/bankAccounts/bankAccounts.api.ts @@ -1,61 +1,34 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { BankAccountsModels } from "./bankAccounts.models"; export namespace BankAccountsApi { - export const findAll = (search?: string, officeId?: string, config?: AxiosRequestConfig) => { +export const findAll = (search?: string, officeId?: string, ) => { return AppRestClient.get( - { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, - `/bank-accounts/labels`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), - }, - }, - ); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: BankAccountsModels.BankAccountFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, + `/bank-accounts/labels`, + { + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, - `/bank-accounts/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; + { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, + `/bank-accounts/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; } diff --git a/test/generated/base/bankAccounts/bankAccounts.configs.ts b/test/generated/base/bankAccounts/bankAccounts.configs.ts index 2659ac4..23ecfc1 100644 --- a/test/generated/base/bankAccounts/bankAccounts.configs.ts +++ b/test/generated/base/bankAccounts/bankAccounts.configs.ts @@ -6,37 +6,38 @@ import { BankAccountsQueries } from "./bankAccounts.queries"; import { BankAccountsAcl } from "./bankAccounts.acl"; export namespace BankAccountsConfigs { - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: BankAccountsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: BankAccountsQueries.usePaginateLabels, - infinite: BankAccountsQueries.usePaginateLabelsInfinite, - filters: { - schema: BankAccountsModels.BankAccountFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BankAccountsModels.BankAccountFilterDtoSchema, - options: { - inputs: { - search: true, - officeId: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: BankAccountsAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema, + paginated: BankAccountsQueries.usePaginateLabels, + infinite: BankAccountsQueries.usePaginateLabelsInfinite, + filters: { + schema: BankAccountsModels.BankAccountFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BankAccountsModels.BankAccountFilterDtoSchema, + options: { + inputs: { + search: true, + officeId: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema, + }, +}), }, - }; +}; + } diff --git a/test/generated/base/bankAccounts/bankAccounts.models.ts b/test/generated/base/bankAccounts/bankAccounts.models.ts index 8c8b664..108934f 100644 --- a/test/generated/base/bankAccounts/bankAccounts.models.ts +++ b/test/generated/base/bankAccounts/bankAccounts.models.ts @@ -2,48 +2,41 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace BankAccountsModels { - /** - * BankAccountFilterDtoSchema - * @type { object } - * @property { string } search Search by name or bank name - * @property { string } officeId Office ID to filter by - */ - export const BankAccountFilterDtoSchema = z - .object({ - search: z.string().describe("Search by name or bank name"), - officeId: z.string().describe("Office ID to filter by"), - }) - .readonly(); - export type BankAccountFilterDto = z.infer; +/** + * BankAccountFilterDtoSchema + * @type { object } + * @property { string } search Search by name or bank name + * @property { string } officeId Office ID to filter by + */ +export const BankAccountFilterDtoSchema = z.object({ search: z.string().nullable(), officeId: z.string().nullable() }).partial(); +export type BankAccountFilterDto = z.infer; - /** - * BankAccountsFindAllResponseSchema - * @type { array } - */ - export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type BankAccountsFindAllResponse = z.infer; +/** + * BankAccountsFindAllResponseSchema + * @type { array } + */ +export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); +export type BankAccountsFindAllResponse = z.infer; - /** - * BankAccountsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const BankAccountsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "bankName", "createdAt", "updatedAt"]); - export type BankAccountsPaginateLabelsOrderParamEnum = z.infer; - export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabelsOrderParamEnumSchema.enum; +/** + * BankAccountsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const BankAccountsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "bankName", "createdAt", "updatedAt"]); +export type BankAccountsPaginateLabelsOrderParamEnum = z.infer; +export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * BankAccountsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const BankAccountsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type BankAccountsPaginateLabelsResponse = z.infer; - /** - * BankAccountsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const BankAccountsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type BankAccountsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/bankAccounts/bankAccounts.queries.ts b/test/generated/base/bankAccounts/bankAccounts.queries.ts index 5ac3804..0a86f09 100644 --- a/test/generated/base/bankAccounts/bankAccounts.queries.ts +++ b/test/generated/base/bankAccounts/bankAccounts.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -8,132 +7,90 @@ import { BankAccountsModels } from "./bankAccounts.models"; import { BankAccountsApi } from "./bankAccounts.api"; export namespace BankAccountsQueries { - export const moduleName = QueryModule.BankAccounts; +export const moduleName = QueryModule.BankAccounts; - export const keys = { +export const keys = { all: [moduleName] as const, findAll: (search?: string, officeId?: string) => [...keys.all, "/bank-accounts/labels", search, officeId] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: BankAccountsModels.BankAccountFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/bank-accounts/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: BankAccountsModels.BankAccountFilterDto, - cursor?: string, - ) => [...keys.all, "/bank-accounts/labels/paginate", "infinite", limit, order, filter, cursor] as const, - }; + paginateLabels: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", "infinite", limit, order, filter, cursor] as const, +}; - /** - * Query `useFindAll` - * @summary List all bank accounts with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { string } object.officeId Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { search, officeId }: { search?: string; officeId?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindAll` + * @summary List all bank accounts with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { string } object.officeId Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ search, officeId }: { search?: string, officeId?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search, officeId), + queryFn: () => { + checkAcl(BankAccountsAcl.canUseFindAll()); + return BankAccountsApi.findAll(search, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findAll(search, officeId), - queryFn: () => { - checkAcl(BankAccountsAcl.canUseFindAll()); - return BankAccountsApi.findAll(search, officeId, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate bank account labels (id and name only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` + * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BankAccountsAcl.canUsePaginateLabels()); + return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Query `usePaginateLabels` - * @summary Paginate bank account labels (id and name only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` - * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: BankAccountsModels.BankAccountFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate bank account labels (id and name only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` + * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate bank account labels (id and name only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` - * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: BankAccountsModels.BankAccountFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BankAccountsAcl.canUsePaginateLabels()); + return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; } diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts index 7fa63b1..055a8b8 100644 --- a/test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts +++ b/test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts @@ -1,123 +1,134 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace BookkeepingExportAcl { - /** - * Use for `useCreateBatch` mutation ability. For global ability, omit the object parameter. - * @description Create bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBatch` mutation - */ - export const canUseCreateBatch = (object?: { officeId: string }) => - ["Create", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Create", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; +/** + * Use for `useCreateBatch` mutation ability. For global ability, omit the object parameter. + * @description Create bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBatch` mutation + */ +export const canUseCreateBatch = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Create", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - /** - * Use for `usePaginateBatches` query ability. For global ability, omit the object parameter. - * @description List bookkeeping export batches - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatches` query - */ - export const canUsePaginateBatches = (object?: { officeId: string }) => - ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Read", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; +/** + * Use for `usePaginateBatches` query ability. For global ability, omit the object parameter. + * @description List bookkeeping export batches + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatches` query + */ +export const canUsePaginateBatches = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - /** - * Use for `useGetBatch` query ability. For global ability, omit the object parameter. - * @description Get bookkeeping export batch details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query - */ - export const canUseGetBatch = (object?: { officeId: string }) => - ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Read", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; +/** + * Use for `useGetBatch` query ability. For global ability, omit the object parameter. + * @description Get bookkeeping export batch details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query + */ +export const canUseGetBatch = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - /** - * Use for `useUpdateBatchFormat` mutation ability. For global ability, omit the object parameter. - * @description Update bookkeeping export batch format - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchFormat` mutation - */ - export const canUseUpdateBatchFormat = (object?: { officeId: string }) => - ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Update", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; +/** + * Use for `useUpdateBatchFormat` mutation ability. For global ability, omit the object parameter. + * @description Update bookkeeping export batch format + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchFormat` mutation + */ +export const canUseUpdateBatchFormat = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - /** - * Use for `useUpdateBatchItem` mutation ability. For global ability, omit the object parameter. - * @description Update bookkeeping export batch item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchItem` mutation - */ - export const canUseUpdateBatchItem = (object?: { officeId: string }) => - ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Update", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; +/** + * Use for `useUpdateBatchItem` mutation ability. For global ability, omit the object parameter. + * @description Update bookkeeping export batch item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchItem` mutation + */ +export const canUseUpdateBatchItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - /** - * Use for `usePaginateBatchItems` query ability. For global ability, omit the object parameter. - * @description List batch items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatchItems` query - */ - export const canUsePaginateBatchItems = (object?: { officeId: string }) => - ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Read", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; +/** + * Use for `usePaginateBatchItems` query ability. For global ability, omit the object parameter. + * @description List batch items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatchItems` query + */ +export const canUsePaginateBatchItems = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - /** - * Use for `useValidateBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Export bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useValidateBookkeepingBatch` mutation - */ - export const canUseValidateBookkeepingBatch = (object?: { officeId: string }) => - ["Export", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Export", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; +/** + * Use for `useValidateBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Export bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useValidateBookkeepingBatch` mutation + */ +export const canUseValidateBookkeepingBatch = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - /** - * Use for `useExportBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Export bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportBookkeepingBatch` mutation - */ - export const canUseExportBookkeepingBatch = (object?: { officeId: string }) => - ["Export", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Export", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; +/** + * Use for `useExportBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Export bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportBookkeepingBatch` mutation + */ +export const canUseExportBookkeepingBatch = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - /** - * Use for `useRevertBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Revert bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertBookkeepingBatch` mutation - */ - export const canUseRevertBookkeepingBatch = (object?: { officeId: string }) => - ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Update", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; +/** + * Use for `useRevertBookkeepingBatch` mutation ability. For global ability, omit the object parameter. + * @description Revert bookkeeping export batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertBookkeepingBatch` mutation + */ +export const canUseRevertBookkeepingBatch = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; + +/** + * Use for `useGetVatLineItems` query ability. For global ability, omit the object parameter. + * @description Get VAT line items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetVatLineItems` query + */ +export const canUseGetVatLineItems = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" +] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - /** - * Use for `useGetVatLineItems` query ability. For global ability, omit the object parameter. - * @description Get VAT line items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetVatLineItems` query - */ - export const canUseGetVatLineItems = (object?: { officeId: string }) => - ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Read", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; } diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.api.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.api.ts index 07b2114..75d9468 100644 --- a/test/generated/base/bookkeepingExport/bookkeepingExport.api.ts +++ b/test/generated/base/bookkeepingExport/bookkeepingExport.api.ts @@ -1,185 +1,100 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { BookkeepingExportModels } from "./bookkeepingExport.models"; export namespace BookkeepingExportApi { - export const createBatch = ( - officeId: string, - data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, - config?: AxiosRequestConfig, - ) => { +export const createBatch = (officeId: string, data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, ) => { return AppRestClient.post( - { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, - `/offices/${officeId}/bookkeeping-exports`, - ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), - config, - ); - }; - - export const paginateBatches = ( - officeId: string, - limit: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, + `/offices/${officeId}/bookkeeping-exports`, + ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), + + ) +}; +export const paginateBatches = (officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, - `/offices/${officeId}/bookkeeping-exports`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const getBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, + `/offices/${officeId}/bookkeeping-exports`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getBatch = (officeId: string, batchId: string, ) => { return AppRestClient.get( - { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, - `/offices/${officeId}/bookkeeping-exports/${batchId}`, - config, - ); - }; - - export const updateBatchFormat = ( - officeId: string, - batchId: string, - data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, + `/offices/${officeId}/bookkeeping-exports/${batchId}`, + + ) +}; +export const updateBatchFormat = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, ) => { return AppRestClient.patch( - { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, - `/offices/${officeId}/bookkeeping-exports/${batchId}`, - ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), - config, - ); - }; - - export const updateBatchItem = ( - officeId: string, - batchId: string, - data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, + `/offices/${officeId}/bookkeeping-exports/${batchId}`, + ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), + + ) +}; +export const updateBatchItem = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, ) => { return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, - ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), - config, - ); - }; - - export const paginateBatchItems = ( - officeId: string, - batchId: string, - limit: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, + ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), + + ) +}; +export const paginateBatchItems = (officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, - `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const validateBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, + `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const validateBookkeepingBatch = (officeId: string, batchId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, - undefined, - config, - ); - }; - - export const exportBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, + + ) +}; +export const exportBookkeepingBatch = (officeId: string, batchId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, - undefined, - config, - ); - }; - - export const revertBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, + + ) +}; +export const revertBookkeepingBatch = (officeId: string, batchId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, - undefined, - config, - ); - }; - - export const getVatLineItems = (officeId: string, batchId: string, order?: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, + + ) +}; +export const getVatLineItems = (officeId: string, batchId: string, order?: string, ) => { return AppRestClient.get( - { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, - `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - }, - }, - ); - }; + { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, + `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + }, + } + ) +}; } diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts index da4a913..b28771d 100644 --- a/test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts +++ b/test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts @@ -5,118 +5,119 @@ import { BookkeepingExportQueries } from "./bookkeepingExport.queries"; import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; export namespace BookkeepingExportConfigs { - export const bookkeepingExportsConfig = { +export const bookkeepingExportsConfig = { meta: { - title: "Bookkeeping Exports", + title: "Bookkeeping Exports", }, readAll: { - acl: BookkeepingExportAcl.canUsePaginateBatches, - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, - paginated: BookkeepingExportQueries.usePaginateBatches, - infinite: BookkeepingExportQueries.usePaginateBatchesInfinite, - filters: { - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, - options: { - inputs: { - createdDate: true, - status: true, - format: true, - createdBy: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: BookkeepingExportAcl.canUsePaginateBatches, schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, - options: { - columns: { - id: true, - format: true, - status: true, - totalInvoiceCount: true, - exportedInvoiceCount: true, - createdBy: true, - createdAt: true, - exportedAt: true, - revertedAt: true, - files: true, - }, - sortable: BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema, + paginated: BookkeepingExportQueries.usePaginateBatches, + infinite: BookkeepingExportQueries.usePaginateBatchesInfinite, + filters: { + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, + options: { + inputs: { + createdDate: true, + status: true, + format: true, + createdBy: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, + options: { + columns: { + id: true, + format: true, + status: true, + totalInvoiceCount: true, + exportedInvoiceCount: true, + createdBy: true, + createdAt: true, + exportedAt: true, + revertedAt: true, + files: true, + }, + sortable: BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema, + }, +}), }, read: { - acl: BookkeepingExportAcl.canUseGetBatch, - schema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema, - query: BookkeepingExportQueries.useGetBatch, + acl: BookkeepingExportAcl.canUseGetBatch, + schema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema, + query: BookkeepingExportQueries.useGetBatch, }, create: { - acl: BookkeepingExportAcl.canUseCreateBatch, - schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, - mutation: BookkeepingExportQueries.useCreateBatch, - inputDefs: dynamicInputs({ + acl: BookkeepingExportAcl.canUseCreateBatch, schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, - options: { - inputs: { - format: true, - invoiceFilters: true, - }, - }, - }), + mutation: BookkeepingExportQueries.useCreateBatch, + inputDefs: dynamicInputs({ + schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, + options: { + inputs: { + format: true, + invoiceFilters: true, + }, + }, +}) }, update: { - acl: BookkeepingExportAcl.canUseUpdateBatchFormat, - schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, - mutation: BookkeepingExportQueries.useUpdateBatchFormat, - inputDefs: dynamicInputs({ + acl: BookkeepingExportAcl.canUseUpdateBatchFormat, schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, - options: { - inputs: { - format: true, - }, - }, - }), + mutation: BookkeepingExportQueries.useUpdateBatchFormat, + inputDefs: dynamicInputs({ + schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, + options: { + inputs: { + format: true, }, - }; + }, +}) + }, +}; - export const itemsConfig = { +export const itemsConfig = { meta: { - title: "Items", + title: "Items", }, readAll: { - acl: BookkeepingExportAcl.canUsePaginateBatchItems, - schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, - paginated: BookkeepingExportQueries.usePaginateBatchItems, - infinite: BookkeepingExportQueries.usePaginateBatchItemsInfinite, - filters: { - schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, - options: { - inputs: { - status: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: BookkeepingExportAcl.canUsePaginateBatchItems, schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, - options: { - columns: { - id: true, - invoiceId: true, - status: true, - includedInExport: true, - validationIssues: true, - invoice: true, - receiver: true, - comments: true, - }, - sortable: BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema, + paginated: BookkeepingExportQueries.usePaginateBatchItems, + infinite: BookkeepingExportQueries.usePaginateBatchItemsInfinite, + filters: { + schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, + options: { + inputs: { + status: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, + options: { + columns: { + id: true, + invoiceId: true, + status: true, + includedInExport: true, + validationIssues: true, + invoice: true, + receiver: true, + comments: true, }, - }; + sortable: BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.models.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.models.ts index 98765c8..4cdb0f1 100644 --- a/test/generated/base/bookkeepingExport/bookkeepingExport.models.ts +++ b/test/generated/base/bookkeepingExport/bookkeepingExport.models.ts @@ -2,465 +2,292 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace BookkeepingExportModels { - /** - * BookkeepingExportFormatEnumSchema - * @type { enum } - */ - export const BookkeepingExportFormatEnumSchema = z.enum(["Bmd", "BmdWithoutCost", "BmdHamburg", "Abra", "Pantheon"]); - export type BookkeepingExportFormatEnum = z.infer; - export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enum; +/** + * BookkeepingExportFormatEnumSchema + * @type { enum } + */ +export const BookkeepingExportFormatEnumSchema = z.enum(["Bmd", "BmdWithoutCost", "BmdHamburg", "Abra", "Pantheon"]); +export type BookkeepingExportFormatEnum = z.infer; +export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enum; - /** - * CreateBookkeepingExportBatchRequestDtoSchema - * @type { object } - * @property { BookkeepingExportFormatEnum } format - * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters - */ - export const CreateBookkeepingExportBatchRequestDtoSchema = z - .object({ - format: BookkeepingExportFormatEnumSchema.nullish(), - invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema, - }) - .readonly(); - export type CreateBookkeepingExportBatchRequestDto = z.infer; +/** + * CreateBookkeepingExportBatchRequestDtoSchema + * @type { object } + * @property { BookkeepingExportFormatEnum } format + * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters + */ +export const CreateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema.nullish(), invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema }); +export type CreateBookkeepingExportBatchRequestDto = z.infer; - /** - * BookkeepingExportFileTypeEnumSchema - * @type { enum } - */ - export const BookkeepingExportFileTypeEnumSchema = z.enum([ - "Invoices", - "BusinessPartners", - "Report", - "AbraAddressBook", - "AbraIssuedInvoices", - "AbraIssuedInvoiceItems", - "AbraReceivedInvoices", - "AbraReceivedInvoiceItems", - "PantheonInvoicesOutgoingEur", - "PantheonInvoicesOutgoingUsd", - "PantheonInvoicesIncomingEur", - "PantheonInvoicesIncomingUsd", - "PantheonCostCenters", - ]); - export type BookkeepingExportFileTypeEnum = z.infer; - export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema.enum; +/** + * BookkeepingExportFileTypeEnumSchema + * @type { enum } + */ +export const BookkeepingExportFileTypeEnumSchema = z.enum(["Invoices", "BusinessPartners", "Report", "AbraAddressBook", "AbraIssuedInvoices", "AbraIssuedInvoiceItems", "AbraReceivedInvoices", "AbraReceivedInvoiceItems", "PantheonInvoicesOutgoingEur", "PantheonInvoicesOutgoingUsd", "PantheonInvoicesIncomingEur", "PantheonInvoicesIncomingUsd", "PantheonCostCenters"]); +export type BookkeepingExportFileTypeEnum = z.infer; +export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema.enum; - /** - * BookkeepingExportFileDtoSchema - * @type { object } - * @property { BookkeepingExportFileTypeEnum } variant - * @property { string } downloadUrl - * @property { string } fileName - */ - export const BookkeepingExportFileDtoSchema = z - .object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }) - .readonly(); - export type BookkeepingExportFileDto = z.infer; +/** + * BookkeepingExportFileDtoSchema + * @type { object } + * @property { BookkeepingExportFileTypeEnum } variant + * @property { string } downloadUrl + * @property { string } fileName + */ +export const BookkeepingExportFileDtoSchema = z.object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }); +export type BookkeepingExportFileDto = z.infer; - /** - * BookkeepingExportBatchStatusEnumSchema - * @type { enum } - */ - export const BookkeepingExportBatchStatusEnumSchema = z.enum([ - "Initializing", - "Preparing", - "Exported", - "Reverted", - "Failed", - ]); - export type BookkeepingExportBatchStatusEnum = z.infer; - export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnumSchema.enum; +/** + * BookkeepingExportBatchStatusEnumSchema + * @type { enum } + */ +export const BookkeepingExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Reverted", "Failed"]); +export type BookkeepingExportBatchStatusEnum = z.infer; +export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnumSchema.enum; - /** - * BookkeepingExportBatchSummaryDtoSchema - * @type { object } - * @property { number } totalCount - * @property { number } needsReviewCount - * @property { number } readyForExportCount - * @property { number } excludedCount - * @property { object } invoiceNumberRange - * @property { string } invoiceNumberRange.from - * @property { string } invoiceNumberRange.to - * @property { object } dateRange - * @property { string } dateRange.from - * @property { string } dateRange.to - */ - export const BookkeepingExportBatchSummaryDtoSchema = z - .object({ - totalCount: z.number(), - needsReviewCount: z.number(), - readyForExportCount: z.number(), - excludedCount: z.number(), - invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).readonly().nullish(), - dateRange: z - .object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }) - .readonly() - .nullish(), - }) - .readonly(); - export type BookkeepingExportBatchSummaryDto = z.infer; +/** + * BookkeepingExportBatchSummaryDtoSchema + * @type { object } + * @property { number } totalCount + * @property { number } needsReviewCount + * @property { number } readyForExportCount + * @property { number } excludedCount + * @property { object } invoiceNumberRange + * @property { string } invoiceNumberRange.from + * @property { string } invoiceNumberRange.to + * @property { object } dateRange + * @property { string } dateRange.from + * @property { string } dateRange.to + */ +export const BookkeepingExportBatchSummaryDtoSchema = z.object({ totalCount: z.number(), needsReviewCount: z.number(), readyForExportCount: z.number(), excludedCount: z.number(), invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).nullish(), dateRange: z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).nullish() }); +export type BookkeepingExportBatchSummaryDto = z.infer; - /** - * BookkeepingExportBatchDetailsDtoSchema - * @type { object } - * @property { string } id - * @property { BookkeepingExportFormatEnum } format - * @property { BookkeepingExportBatchStatusEnum } status - * @property { number } totalInvoiceCount - * @property { number } exportedInvoiceCount - * @property { object } createdBy - * @property { string } createdBy.id - * @property { string } createdBy.fullName - * @property { string } createdBy.email - * @property { string } createdAt - * @property { string } exportedAt - * @property { string } revertedAt - * @property { object } revertedBy - * @property { string } revertedBy.id - * @property { string } revertedBy.fullName - * @property { string } revertedBy.email - * @property { BookkeepingExportBatchSummaryDto } summary - * @property { BookkeepingExportFileDto[] } files - */ - export const BookkeepingExportBatchDetailsDtoSchema = z - .object({ - id: z.string(), - format: BookkeepingExportFormatEnumSchema, - status: BookkeepingExportBatchStatusEnumSchema, - totalInvoiceCount: z.number(), - exportedInvoiceCount: z.number(), - createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), - createdAt: z.iso.datetime({ offset: true }), - exportedAt: z.iso.datetime({ offset: true }).nullish(), - revertedAt: z.iso.datetime({ offset: true }).nullish(), - revertedBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly().nullish(), - summary: BookkeepingExportBatchSummaryDtoSchema, - files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish(), - }) - .readonly(); - export type BookkeepingExportBatchDetailsDto = z.infer; +/** + * BookkeepingExportBatchDetailsDtoSchema + * @type { object } + * @property { string } id + * @property { BookkeepingExportFormatEnum } format + * @property { BookkeepingExportBatchStatusEnum } status + * @property { number } totalInvoiceCount + * @property { number } exportedInvoiceCount + * @property { object } createdBy + * @property { string } createdBy.id + * @property { string } createdBy.fullName + * @property { string } createdBy.email + * @property { string } createdAt + * @property { string } exportedAt + * @property { string } revertedAt + * @property { object } revertedBy + * @property { string } revertedBy.id + * @property { string } revertedBy.fullName + * @property { string } revertedBy.email + * @property { BookkeepingExportBatchSummaryDto } summary + * @property { BookkeepingExportFileDto[] } files + */ +export const BookkeepingExportBatchDetailsDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), revertedBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).nullish(), summary: BookkeepingExportBatchSummaryDtoSchema, files: z.array(BookkeepingExportFileDtoSchema).nullish() }); +export type BookkeepingExportBatchDetailsDto = z.infer; - /** - * UpdateBookkeepingExportBatchRequestDtoSchema - * @type { object } - * @property { BookkeepingExportFormatEnum } format - */ - export const UpdateBookkeepingExportBatchRequestDtoSchema = z - .object({ format: BookkeepingExportFormatEnumSchema }) - .readonly(); - export type UpdateBookkeepingExportBatchRequestDto = z.infer; +/** + * UpdateBookkeepingExportBatchRequestDtoSchema + * @type { object } + * @property { BookkeepingExportFormatEnum } format + */ +export const UpdateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema }); +export type UpdateBookkeepingExportBatchRequestDto = z.infer; - /** - * BookkeepingExportBatchPreviewDtoSchema - * @type { object } - * @property { string } id - * @property { BookkeepingExportFormatEnum } format - * @property { BookkeepingExportBatchStatusEnum } status - * @property { number } totalInvoiceCount - * @property { number } exportedInvoiceCount - * @property { object } createdBy - * @property { string } createdBy.id - * @property { string } createdBy.fullName - * @property { string } createdBy.email - * @property { string } createdAt - * @property { string } exportedAt - * @property { string } revertedAt - * @property { BookkeepingExportFileDto[] } files - */ - export const BookkeepingExportBatchPreviewDtoSchema = z - .object({ - id: z.string(), - format: BookkeepingExportFormatEnumSchema, - status: BookkeepingExportBatchStatusEnumSchema, - totalInvoiceCount: z.number(), - exportedInvoiceCount: z.number(), - createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), - createdAt: z.iso.datetime({ offset: true }), - exportedAt: z.iso.datetime({ offset: true }).nullish(), - revertedAt: z.iso.datetime({ offset: true }).nullish(), - files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish(), - }) - .readonly(); - export type BookkeepingExportBatchPreviewDto = z.infer; +/** + * BookkeepingExportBatchPreviewDtoSchema + * @type { object } + * @property { string } id + * @property { BookkeepingExportFormatEnum } format + * @property { BookkeepingExportBatchStatusEnum } status + * @property { number } totalInvoiceCount + * @property { number } exportedInvoiceCount + * @property { object } createdBy + * @property { string } createdBy.id + * @property { string } createdBy.fullName + * @property { string } createdBy.email + * @property { string } createdAt + * @property { string } exportedAt + * @property { string } revertedAt + * @property { BookkeepingExportFileDto[] } files + */ +export const BookkeepingExportBatchPreviewDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), files: z.array(BookkeepingExportFileDtoSchema).nullish() }); +export type BookkeepingExportBatchPreviewDto = z.infer; - /** - * DateRangeSchema - * @type { object } - * @property { string } from - * @property { string } to - */ - export const DateRangeSchema = z - .object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }) - .readonly(); - export type DateRange = z.infer; +/** + * DateRangeSchema + * @type { object } + * @property { string } from + * @property { string } to + */ +export const DateRangeSchema = z.object({ from: z.iso.datetime({ offset: true }).nullable(), to: z.iso.datetime({ offset: true }).nullable() }).partial(); +export type DateRange = z.infer; - /** - * BookkeepingExportBatchPreviewFilterDtoSchema - * @type { object } - * @property { DateRange } createdDate - * @property { BookkeepingExportBatchStatusEnum[] } status - * @property { BookkeepingExportFormatEnum[] } format - * @property { string[] } createdBy - */ - export const BookkeepingExportBatchPreviewFilterDtoSchema = z - .object({ - createdDate: DateRangeSchema, - status: z.array(BookkeepingExportBatchStatusEnumSchema).readonly(), - format: z.array(BookkeepingExportFormatEnumSchema).readonly(), - createdBy: z.array(z.string()).readonly(), - }) - .readonly(); - export type BookkeepingExportBatchPreviewFilterDto = z.infer; +/** + * BookkeepingExportBatchPreviewFilterDtoSchema + * @type { object } + * @property { DateRange } createdDate + * @property { BookkeepingExportBatchStatusEnum[] } status + * @property { BookkeepingExportFormatEnum[] } format + * @property { string[] } createdBy + */ +export const BookkeepingExportBatchPreviewFilterDtoSchema = z.object({ createdDate: DateRangeSchema.nullable(), status: z.array(BookkeepingExportBatchStatusEnumSchema).nullable(), format: z.array(BookkeepingExportFormatEnumSchema).nullable(), createdBy: z.array(z.string()).nullable() }).partial(); +export type BookkeepingExportBatchPreviewFilterDto = z.infer; - /** - * BookkeepingExportBatchItemStatusEnumSchema - * @type { enum } - */ - export const BookkeepingExportBatchItemStatusEnumSchema = z.enum([ - "Selected", - "NeedsReview", - "ReadyForExport", - "Exported", - "Excluded", - ]); - export type BookkeepingExportBatchItemStatusEnum = z.infer; - export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemStatusEnumSchema.enum; +/** + * BookkeepingExportBatchItemStatusEnumSchema + * @type { enum } + */ +export const BookkeepingExportBatchItemStatusEnumSchema = z.enum(["Selected", "NeedsReview", "ReadyForExport", "Exported", "Excluded"]); +export type BookkeepingExportBatchItemStatusEnum = z.infer; +export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemStatusEnumSchema.enum; - /** - * BookkeepingExportItemDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } invoiceId - * @property { BookkeepingExportBatchItemStatusEnum } status - * @property { boolean } includedInExport - * @property { string[] } validationIssues - * @property { object } invoice - * @property { string } invoice.invoiceNumber - * @property { string } invoice.issuingDate - * @property { string } invoice.currency - * @property { number } invoice.amount - * @property { number } invoice.tax - * @property { string[] } invoice.vatRules - * @property { object } receiver - * @property { string } receiver.id - * @property { string } receiver.name - * @property { string } receiver.matchCode - * @property { string } receiver.label - * @property { string } receiver.account - * @property { string } receiver.contraAccount - * @property { string } comments - */ - export const BookkeepingExportItemDetailDtoSchema = z - .object({ - id: z.string(), - invoiceId: z.string(), - status: BookkeepingExportBatchItemStatusEnumSchema, - includedInExport: z.boolean(), - validationIssues: z.array(z.string()).readonly().nullish(), - invoice: z - .object({ - invoiceNumber: z.string(), - issuingDate: z.iso.datetime({ offset: true }), - currency: z.string(), - amount: z.number(), - tax: z.number(), - vatRules: z.array(z.string()).readonly(), - }) - .readonly(), - receiver: z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string(), - account: z.string(), - contraAccount: z.string(), - }) - .readonly(), - comments: z.string().nullish(), - }) - .readonly(); - export type BookkeepingExportItemDetailDto = z.infer; +/** + * BookkeepingExportItemDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } invoiceId + * @property { BookkeepingExportBatchItemStatusEnum } status + * @property { boolean } includedInExport + * @property { string[] } validationIssues + * @property { object } invoice + * @property { string } invoice.invoiceNumber + * @property { string } invoice.issuingDate + * @property { string } invoice.currency + * @property { number } invoice.amount + * @property { number } invoice.tax + * @property { string[] } invoice.vatRules + * @property { object } receiver + * @property { string } receiver.id + * @property { string } receiver.name + * @property { string } receiver.matchCode + * @property { string } receiver.label + * @property { string } receiver.account + * @property { string } receiver.contraAccount + * @property { string } comments + */ +export const BookkeepingExportItemDetailDtoSchema = z.object({ id: z.string(), invoiceId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), vatRules: z.array(z.string()) }), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }), comments: z.string().nullish() }); +export type BookkeepingExportItemDetailDto = z.infer; - /** - * BookkeepingExportItemDetailFilterDtoSchema - * @type { object } - * @property { BookkeepingExportBatchItemStatusEnum[] } status - */ - export const BookkeepingExportItemDetailFilterDtoSchema = z - .object({ status: z.array(BookkeepingExportBatchItemStatusEnumSchema).readonly() }) - .readonly(); - export type BookkeepingExportItemDetailFilterDto = z.infer; +/** + * BookkeepingExportItemDetailFilterDtoSchema + * @type { object } + * @property { BookkeepingExportBatchItemStatusEnum[] } status + */ +export const BookkeepingExportItemDetailFilterDtoSchema = z.object({ status: z.array(BookkeepingExportBatchItemStatusEnumSchema).nullable() }).partial(); +export type BookkeepingExportItemDetailFilterDto = z.infer; - /** - * BookkeepingExportVatLineItemDtoSchema - * @type { object } - * @property { string } invoiceId - * @property { string } batchId - * @property { string } batchItemId - * @property { BookkeepingExportBatchItemStatusEnum } status - * @property { boolean } includedInExport - * @property { string[] } validationIssues - * @property { object } invoice - * @property { string } invoice.invoiceNumber - * @property { string } invoice.issuingDate - * @property { string } invoice.currency - * @property { number } invoice.amount - * @property { number } invoice.tax - * @property { string } invoice.comments - * @property { object } receiver - * @property { string } receiver.id - * @property { string } receiver.name - * @property { string } receiver.matchCode - * @property { string } receiver.label - * @property { string } receiver.account - * @property { string } receiver.contraAccount - * @property { number } vatPercentage - * @property { string } vatRule - * @property { number } netAmount - * @property { number } vatAmount - * @property { number } grossAmount - * @property { number } vatAmountInOfficeCurrency - * @property { number } netAmountInOfficeCurrency - * @property { number } grossAmountInOfficeCurrency - * @property { string } officeCurrency - */ - export const BookkeepingExportVatLineItemDtoSchema = z - .object({ - invoiceId: z.string(), - batchId: z.string(), - batchItemId: z.string(), - status: BookkeepingExportBatchItemStatusEnumSchema, - includedInExport: z.boolean(), - validationIssues: z.array(z.string()).readonly().nullish(), - invoice: z - .object({ - invoiceNumber: z.string(), - issuingDate: z.iso.datetime({ offset: true }), - currency: z.string(), - amount: z.number(), - tax: z.number(), - comments: z.string().nullish(), - }) - .readonly(), - receiver: z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string(), - account: z.string(), - contraAccount: z.string(), - }) - .readonly(), - vatPercentage: z.number(), - vatRule: z.string(), - netAmount: z.number(), - vatAmount: z.number(), - grossAmount: z.number(), - vatAmountInOfficeCurrency: z.number().nullish(), - netAmountInOfficeCurrency: z.number().nullish(), - grossAmountInOfficeCurrency: z.number().nullish(), - officeCurrency: z.string(), - }) - .readonly(); - export type BookkeepingExportVatLineItemDto = z.infer; +/** + * BookkeepingExportVatLineItemDtoSchema + * @type { object } + * @property { string } invoiceId + * @property { string } batchId + * @property { string } batchItemId + * @property { BookkeepingExportBatchItemStatusEnum } status + * @property { boolean } includedInExport + * @property { string[] } validationIssues + * @property { object } invoice + * @property { string } invoice.invoiceNumber + * @property { string } invoice.issuingDate + * @property { string } invoice.currency + * @property { number } invoice.amount + * @property { number } invoice.tax + * @property { string } invoice.comments + * @property { object } receiver + * @property { string } receiver.id + * @property { string } receiver.name + * @property { string } receiver.matchCode + * @property { string } receiver.label + * @property { string } receiver.account + * @property { string } receiver.contraAccount + * @property { number } vatPercentage + * @property { string } vatRule + * @property { number } netAmount + * @property { number } vatAmount + * @property { number } grossAmount + * @property { number } vatAmountInOfficeCurrency + * @property { number } netAmountInOfficeCurrency + * @property { number } grossAmountInOfficeCurrency + * @property { string } officeCurrency + */ +export const BookkeepingExportVatLineItemDtoSchema = z.object({ invoiceId: z.string(), batchId: z.string(), batchItemId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), comments: z.string().nullish() }), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }), vatPercentage: z.number(), vatRule: z.string(), netAmount: z.number(), vatAmount: z.number(), grossAmount: z.number(), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish(), officeCurrency: z.string() }); +export type BookkeepingExportVatLineItemDto = z.infer; - /** - * CreateBookkeepingExportBatchResponseDtoSchema - * @type { object } - * @property { string } batchId - */ - export const CreateBookkeepingExportBatchResponseDtoSchema = z.object({ batchId: z.string() }).readonly(); - export type CreateBookkeepingExportBatchResponseDto = z.infer; +/** + * CreateBookkeepingExportBatchResponseDtoSchema + * @type { object } + * @property { string } batchId + */ +export const CreateBookkeepingExportBatchResponseDtoSchema = z.object({ batchId: z.string() }); +export type CreateBookkeepingExportBatchResponseDto = z.infer; - /** - * UpdateBookkeepingExportBatchItemRequestDtoSchema - * @type { object } - * @property { boolean } includedInExport Whether the item should be included in the export - * @property { string[] } itemIds Min Items: `0` - * @property { boolean } vatOk - * @property { boolean } invoiceOk - */ - export const UpdateBookkeepingExportBatchItemRequestDtoSchema = z - .object({ - includedInExport: z.boolean().describe("Whether the item should be included in the export").nullish(), - itemIds: z.array(z.string()).readonly(), - vatOk: z.boolean().nullish(), - invoiceOk: z.boolean().nullish(), - }) - .readonly(); - export type UpdateBookkeepingExportBatchItemRequestDto = z.infer< - typeof UpdateBookkeepingExportBatchItemRequestDtoSchema - >; +/** + * UpdateBookkeepingExportBatchItemRequestDtoSchema + * @type { object } + * @property { boolean } includedInExport Whether the item should be included in the export + * @property { string[] } itemIds Min Items: `0` + * @property { boolean } vatOk + * @property { boolean } invoiceOk + */ +export const UpdateBookkeepingExportBatchItemRequestDtoSchema = z.object({ includedInExport: z.boolean().nullish(), itemIds: z.array(z.string()), vatOk: z.boolean().nullish(), invoiceOk: z.boolean().nullish() }); +export type UpdateBookkeepingExportBatchItemRequestDto = z.infer; - /** - * PaginateBatchesOrderParamEnumSchema - * @type { enum } - */ - export const PaginateBatchesOrderParamEnumSchema = z.enum(["createdAt", "status", "format", "totalInvoiceCount"]); - export type PaginateBatchesOrderParamEnum = z.infer; - export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema.enum; +/** + * PaginateBatchesOrderParamEnumSchema + * @type { enum } + */ +export const PaginateBatchesOrderParamEnumSchema = z.enum(["createdAt", "status", "format", "totalInvoiceCount"]); +export type PaginateBatchesOrderParamEnum = z.infer; +export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema.enum; - /** - * PaginateBatchesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookkeepingExportBatchPreviewDto[] } items - */ - export const PaginateBatchesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).readonly() }).readonly().shape, - }); - export type PaginateBatchesResponse = z.infer; +/** + * PaginateBatchesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookkeepingExportBatchPreviewDto[] } items + */ +export const PaginateBatchesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).nullable() }).partial().shape }); +export type PaginateBatchesResponse = z.infer; - /** - * PaginateBatchItemsOrderParamEnumSchema - * @type { enum } - */ - export const PaginateBatchItemsOrderParamEnumSchema = z.enum(["issuingDate"]); - export type PaginateBatchItemsOrderParamEnum = z.infer; - export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnumSchema.enum; +/** + * PaginateBatchItemsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateBatchItemsOrderParamEnumSchema = z.enum(["issuingDate"]); +export type PaginateBatchItemsOrderParamEnum = z.infer; +export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnumSchema.enum; - /** - * PaginateBatchItemsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookkeepingExportItemDetailDto[] } items - */ - export const PaginateBatchItemsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).readonly() }).readonly().shape, - }); - export type PaginateBatchItemsResponse = z.infer; +/** + * PaginateBatchItemsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookkeepingExportItemDetailDto[] } items + */ +export const PaginateBatchItemsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).nullable() }).partial().shape }); +export type PaginateBatchItemsResponse = z.infer; - /** - * GetVatLineItemsOrderParamEnumSchema - * @type { enum } - */ - export const GetVatLineItemsOrderParamEnumSchema = z.enum([ - "account", - "contraAccount", - "issuingDate", - "invoiceNumber", - "receiver", - ]); - export type GetVatLineItemsOrderParamEnum = z.infer; - export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema.enum; +/** + * GetVatLineItemsOrderParamEnumSchema + * @type { enum } + */ +export const GetVatLineItemsOrderParamEnumSchema = z.enum(["account", "contraAccount", "issuingDate", "invoiceNumber", "receiver"]); +export type GetVatLineItemsOrderParamEnum = z.infer; +export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema.enum; + +/** + * GetVatLineItemsResponseSchema + * @type { array } + */ +export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema); +export type GetVatLineItemsResponse = z.infer; - /** - * GetVatLineItemsResponseSchema - * @type { array } - */ - export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema).readonly(); - export type GetVatLineItemsResponse = z.infer; } diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts index c7faed1..db9e500 100644 --- a/test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts +++ b/test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,547 +8,343 @@ import { BookkeepingExportModels } from "./bookkeepingExport.models"; import { BookkeepingExportApi } from "./bookkeepingExport.api"; export namespace BookkeepingExportQueries { - export const moduleName = QueryModule.BookkeepingExport; +export const moduleName = QueryModule.BookkeepingExport; - export const keys = { +export const keys = { all: [moduleName] as const, - paginateBatches: ( - officeId: string, - limit?: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/bookkeeping-exports", officeId, limit, order, filter, page, cursor] as const, - paginateBatchesInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/bookkeeping-exports", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - getBatch: (officeId: string, batchId: string) => - [...keys.all, "/offices/:officeId/bookkeeping-exports/:batchId", officeId, batchId] as const, - paginateBatchItems: ( - officeId: string, - batchId: string, - limit?: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", - officeId, - batchId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateBatchItemsInfinite: ( - officeId: string, - batchId: string, - limit?: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", - "infinite", - officeId, - batchId, - limit, - order, - filter, - cursor, - ] as const, - getVatLineItems: (officeId: string, batchId: string, order?: string) => - [ - ...keys.all, - "/offices/:officeId/bookkeeping-exports/batches/:batchId/vat-line-items", - officeId, - batchId, - order, - ] as const, - }; + paginateBatches: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", officeId, limit, order, filter, page, cursor] as const, + paginateBatchesInfinite: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", "infinite", officeId, limit, order, filter, cursor] as const, + getBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/:batchId", officeId, batchId] as const, + paginateBatchItems: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", officeId, batchId, limit, order, filter, page, cursor] as const, + paginateBatchItemsInfinite: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", "infinite", officeId, batchId, limit, order, filter, cursor] as const, + getVatLineItems: (officeId: string, batchId: string, order?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/vat-line-items", officeId, batchId, order] as const, +}; - /** - * Mutation `useCreateBatch` - * @summary Create bookkeeping export batch - * @permission Requires `canUseCreateBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateBatch = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.createBatch, - { officeId: string; data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreateBatch` + * @summary Create bookkeeping export batch + * @permission Requires `canUseCreateBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId })); - return BookkeepingExportApi.createBatch(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateBatches` - * @summary List bookkeeping export batches - * @permission Requires `canUsePaginateBatches` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` - * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateBatches = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId } )); + return BookkeepingExportApi.createBatch(officeId, data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId })); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateBatchesInfinite - * @summary List bookkeeping export batches - * @permission Requires `canUsePaginateBatches` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` - * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateBatchesInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto; - cursor?: string; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId })); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `usePaginateBatches` + * @summary List bookkeeping export batches + * @permission Requires `canUsePaginateBatches` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` + * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatches = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Query `useGetBatch` - * @summary Get bookkeeping export batch details - * @permission Requires `canUseGetBatch` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetBatch = ( - { officeId, batchId }: { officeId: string; batchId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateBatchesInfinite + * @summary List bookkeeping export batches + * @permission Requires `canUsePaginateBatches` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` + * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatchesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useQuery({ - queryKey: keys.getBatch(officeId, batchId), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId })); - return BookkeepingExportApi.getBatch(officeId, batchId, config); - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Mutation `useUpdateBatchFormat` - * @summary Update bookkeeping export batch format - * @permission Requires `canUseUpdateBatchFormat` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBatchFormat = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.updateBatchFormat, - { officeId: string; batchId: string; data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Query `useGetBatch` + * @summary Get bookkeeping export batch details + * @permission Requires `canUseGetBatch` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBatch(officeId, batchId), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId } )); + return BookkeepingExportApi.getBatch(officeId, batchId) }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ officeId, batchId, data }) => { - checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId })); - return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, batchId } = variables; - const updateKeys = [keys.getBatch(officeId, batchId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdateBatchFormat` + * @summary Update bookkeeping export batch format + * @permission Requires `canUseUpdateBatchFormat` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBatchFormat = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdateBatchItem` - * @summary Update bookkeeping export batch item inclusion - * @permission Requires `canUseUpdateBatchItem` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBatchItem = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.updateBatchItem, - { officeId: string; batchId: string; data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, batchId, data }) => { + checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId } )); + return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, batchId } = variables; + const updateKeys = [keys.getBatch(officeId, batchId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, batchId, data }) => { - checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId })); - return BookkeepingExportApi.updateBatchItem(officeId, batchId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdateBatchItem` + * @summary Update bookkeeping export batch item inclusion + * @permission Requires `canUseUpdateBatchItem` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBatchItem = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `usePaginateBatchItems` - * @summary List batch items with filters and pagination - * @permission Requires `canUsePaginateBatchItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` - * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateBatchItems = ( - { - officeId, - batchId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - batchId: string; - limit: number; - order?: string; - filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ officeId, batchId, data }) => { + checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId } )); + return BookkeepingExportApi.updateBatchItem(officeId, batchId, data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useQuery({ - queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId })); - return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateBatchItems` + * @summary List batch items with filters and pagination + * @permission Requires `canUsePaginateBatchItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` + * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatchItems = ({ officeId, batchId, limit, order, filter, page, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); + return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateBatchItemsInfinite - * @summary List batch items with filters and pagination - * @permission Requires `canUsePaginateBatchItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` - * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateBatchItemsInfinite = ( - { - officeId, - batchId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - batchId: string; - limit: number; - order?: string; - filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateBatchItemsInfinite + * @summary List batch items with filters and pagination + * @permission Requires `canUsePaginateBatchItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` + * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateBatchItemsInfinite = ({ officeId, batchId, limit, order, filter, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId })); - return BookkeepingExportApi.paginateBatchItems( - officeId, - batchId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); + return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Mutation `useValidateBookkeepingBatch` - * @summary Validate bookkeeping batch - * @permission Requires `canUseValidateBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useValidateBookkeepingBatch = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.validateBookkeepingBatch, - { officeId: string; batchId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useValidateBookkeepingBatch` + * @summary Validate bookkeeping batch + * @permission Requires `canUseValidateBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useValidateBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId })); - return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId } )); + return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useExportBookkeepingBatch` - * @summary Export bookkeeping batch - * @permission Requires `canUseExportBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useExportBookkeepingBatch = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.exportBookkeepingBatch, - { officeId: string; batchId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useExportBookkeepingBatch` + * @summary Export bookkeeping batch + * @permission Requires `canUseExportBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useExportBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId })); - return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId } )); + return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useRevertBookkeepingBatch` - * @summary Revert bookkeeping export batch - * @permission Requires `canUseRevertBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useRevertBookkeepingBatch = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.revertBookkeepingBatch, - { officeId: string; batchId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useRevertBookkeepingBatch` + * @summary Revert bookkeeping export batch + * @permission Requires `canUseRevertBookkeepingBatch` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useRevertBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId })); - return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId } )); + return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useGetVatLineItems` - * @summary Get VAT line items for bookkeeping export batch - * @permission Requires `canUseGetVatLineItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): account, contraAccount, issuingDate, invoiceNumber, receiver. Example: `account` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetVatLineItems = ( - { officeId, batchId, order }: { officeId: string; batchId: string; order?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetVatLineItems` + * @summary Get VAT line items for bookkeeping export batch + * @permission Requires `canUseGetVatLineItems` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): account, contraAccount, issuingDate, invoiceNumber, receiver. Example: `account` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetVatLineItems = ({ officeId, batchId, order }: { officeId: string, batchId: string, order?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getVatLineItems(officeId, batchId, order), + queryFn: () => { + checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId } )); + return BookkeepingExportApi.getVatLineItems(officeId, batchId, order) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getVatLineItems(officeId, batchId, order), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId })); - return BookkeepingExportApi.getVatLineItems(officeId, batchId, order, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts index 016a650..1fc9403 100644 --- a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts +++ b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts @@ -1,63 +1,69 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace BusinessPartnerBookkeepingMappingsAcl { - /** - * Use for `useGetBookkeepingMappings` query ability. For global ability, omit the object parameter. - * @description List business partner bookkeeping mappings - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBookkeepingMappings` query - */ - export const canUseGetBookkeepingMappings = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; +/** + * Use for `useGetBookkeepingMappings` query ability. For global ability, omit the object parameter. + * @description List business partner bookkeeping mappings + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBookkeepingMappings` query + */ +export const canUseGetBookkeepingMappings = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - /** - * Use for `useCreateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Create business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBookkeepingMapping` mutation - */ - export const canUseCreateBookkeepingMapping = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< - "Update", - "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - >; +/** + * Use for `useCreateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Create business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBookkeepingMapping` mutation + */ +export const canUseCreateBookkeepingMapping = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - /** - * Use for `useUpdateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Update business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMapping` mutation - */ - export const canUseUpdateBookkeepingMapping = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< - "Update", - "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - >; +/** + * Use for `useUpdateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Update business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMapping` mutation + */ +export const canUseUpdateBookkeepingMapping = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - /** - * Use for `useUpdateBookkeepingMappingById` mutation ability. For global ability, omit the object parameter. - * @description Update business partner bookkeeping mapping by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMappingById` mutation - */ - export const canUseUpdateBookkeepingMappingById = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< - "Update", - "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - >; +/** + * Use for `useUpdateBookkeepingMappingById` mutation ability. For global ability, omit the object parameter. + * @description Update business partner bookkeeping mapping by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMappingById` mutation + */ +export const canUseUpdateBookkeepingMappingById = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; + +/** + * Use for `useDeleteBookkeepingMapping` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner bookkeeping mapping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBookkeepingMapping` mutation + */ +export const canUseDeleteBookkeepingMapping = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" +] as AbilityTuple<"Delete", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - /** - * Use for `useDeleteBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBookkeepingMapping` mutation - */ - export const canUseDeleteBookkeepingMapping = (object?: { officeId: string }) => - ["Delete", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< - "Delete", - "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - >; } diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts index ac6b120..88b624e 100644 --- a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts +++ b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts @@ -1,72 +1,45 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; export namespace BusinessPartnerBookkeepingMappingsApi { - export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { +export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, ) => { return AppRestClient.get( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - config, - ); - }; - - export const createBookkeepingMapping = ( - officeId: string, - businessPartnerId: string, - data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + + ) +}; +export const createBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, ) => { return AppRestClient.post( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), - config, - ); - }; - - export const updateBookkeepingMapping = ( - officeId: string, - businessPartnerId: string, - data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), + + ) +}; +export const updateBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, ) => { return AppRestClient.patch( - { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), - config, - ); - }; - - export const updateBookkeepingMappingById = ( - officeId: string, - businessPartnerId: string, - id: string, - data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), + + ) +}; +export const updateBookkeepingMappingById = (officeId: string, businessPartnerId: string, id: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, ) => { return AppRestClient.patch( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), - config, - ); - }; - - export const deleteBookkeepingMapping = ( - officeId: string, - businessPartnerId: string, - id: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, + ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), + + ) +}; +export const deleteBookkeepingMapping = (officeId: string, businessPartnerId: string, id: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - undefined, - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, + + ) +}; } diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts index 93818c1..2bb5fda 100644 --- a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts +++ b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts @@ -1,94 +1,62 @@ import { z } from "zod"; export namespace BusinessPartnerBookkeepingMappingsModels { - /** - * BusinessPartnerBookkeepingMappingResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { string } businessPartnerId - * @property { boolean } paysTaxInEurForFactoring - */ - export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z - .object({ - id: z.string(), - debtorId: z.string().nullish(), - creditorId: z.string().nullish(), - currencyNotation: z.string().nullish(), - businessPartnerId: z.string(), - paysTaxInEurForFactoring: z.boolean().nullish(), - }) - .readonly(); - export type BusinessPartnerBookkeepingMappingResponseDto = z.infer< - typeof BusinessPartnerBookkeepingMappingResponseDtoSchema - >; +/** + * BusinessPartnerBookkeepingMappingResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { string } businessPartnerId + * @property { boolean } paysTaxInEurForFactoring + */ +export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z.object({ id: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), currencyNotation: z.string().nullish(), businessPartnerId: z.string(), paysTaxInEurForFactoring: z.boolean().nullish() }); +export type BusinessPartnerBookkeepingMappingResponseDto = z.infer; - /** - * BusinessPartnerBookkeepingMappingsResponseDtoSchema - * @type { object } - * @property { BusinessPartnerBookkeepingMappingResponseDto[] } bookkeepingMappings - */ - export const BusinessPartnerBookkeepingMappingsResponseDtoSchema = z - .object({ bookkeepingMappings: z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly() }) - .readonly(); - export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer< - typeof BusinessPartnerBookkeepingMappingsResponseDtoSchema - >; +/** + * BusinessPartnerBookkeepingMappingsResponseDtoSchema + * @type { object } + * @property { BusinessPartnerBookkeepingMappingResponseDto[] } bookkeepingMappings + */ +export const BusinessPartnerBookkeepingMappingsResponseDtoSchema = z.object({ bookkeepingMappings: z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema) }); +export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer; - /** - * UpdateBookkeepingMappingDtoSchema - * @type { object } - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) - */ - export const UpdateBookkeepingMappingDtoSchema = z - .object({ - debtorId: z.string(), - creditorId: z.string(), - currencyNotation: z.string(), - paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)"), - }) - .readonly(); - export type UpdateBookkeepingMappingDto = z.infer; +/** + * UpdateBookkeepingMappingDtoSchema + * @type { object } + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) + */ +export const UpdateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string().nullable(), creditorId: z.string().nullable(), currencyNotation: z.string().nullable(), paysTaxInEurForFactoring: z.boolean().nullable() }).partial(); +export type UpdateBookkeepingMappingDto = z.infer; - /** - * UpdateBookkeepingMappingRequestDtoSchema - * @type { object } - * @property { UpdateBookkeepingMappingDto[] } bookkeepingMappings - */ - export const UpdateBookkeepingMappingRequestDtoSchema = z - .object({ bookkeepingMappings: z.array(UpdateBookkeepingMappingDtoSchema).readonly() }) - .readonly(); - export type UpdateBookkeepingMappingRequestDto = z.infer; +/** + * UpdateBookkeepingMappingRequestDtoSchema + * @type { object } + * @property { UpdateBookkeepingMappingDto[] } bookkeepingMappings + */ +export const UpdateBookkeepingMappingRequestDtoSchema = z.object({ bookkeepingMappings: z.array(UpdateBookkeepingMappingDtoSchema).nullable() }).partial(); +export type UpdateBookkeepingMappingRequestDto = z.infer; - /** - * CreateBookkeepingMappingDtoSchema - * @type { object } - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) - */ - export const CreateBookkeepingMappingDtoSchema = z - .object({ - debtorId: z.string(), - creditorId: z.string(), - currencyNotation: z.string(), - paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)"), - }) - .readonly(); - export type CreateBookkeepingMappingDto = z.infer; +/** + * CreateBookkeepingMappingDtoSchema + * @type { object } + * @property { string } debtorId + * @property { string } creditorId + * @property { string } currencyNotation + * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) + */ +export const CreateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string().nullable(), creditorId: z.string().nullable(), currencyNotation: z.string().nullable(), paysTaxInEurForFactoring: z.boolean().nullable() }).partial(); +export type CreateBookkeepingMappingDto = z.infer; + +/** + * UpdateBookkeepingMappingResponseSchema + * @type { array } + */ +export const UpdateBookkeepingMappingResponseSchema = z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema); +export type UpdateBookkeepingMappingResponse = z.infer; - /** - * UpdateBookkeepingMappingResponseSchema - * @type { array } - */ - export const UpdateBookkeepingMappingResponseSchema = z - .array(BusinessPartnerBookkeepingMappingResponseDtoSchema) - .readonly(); - export type UpdateBookkeepingMappingResponse = z.infer; } diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts index 8b15dfc..e176f36 100644 --- a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts +++ b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,213 +8,146 @@ import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookk import { BusinessPartnerBookkeepingMappingsApi } from "./businessPartnerBookkeepingMappings.api"; export namespace BusinessPartnerBookkeepingMappingsQueries { - export const moduleName = QueryModule.BusinessPartnerBookkeepingMappings; +export const moduleName = QueryModule.BusinessPartnerBookkeepingMappings; - export const keys = { +export const keys = { all: [moduleName] as const, - getBookkeepingMappings: (officeId: string, businessPartnerId: string) => - [ - ...keys.all, - "/offices/:officeId/business-partners/:businessPartnerId/bookkeeping-mappings", - officeId, - businessPartnerId, - ] as const, - }; + getBookkeepingMappings: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/bookkeeping-mappings", officeId, businessPartnerId] as const, +}; - /** - * Query `useGetBookkeepingMappings` - * @summary Fetch all bookkeeping mappings for a business partner - * @permission Requires `canUseGetBookkeepingMappings` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetBookkeepingMappings = ( - { officeId, businessPartnerId }: { officeId: string; businessPartnerId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetBookkeepingMappings` + * @summary Fetch all bookkeeping mappings for a business partner + * @permission Requires `canUseGetBookkeepingMappings` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBookkeepingMappings = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), + queryFn: () => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), - queryFn: () => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId })); - return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId, config); - }, - ...options, - }); - }; +/** + * Mutation `useCreateBookkeepingMapping` + * @summary Create a bookkeeping mapping for a business partner + * @permission Requires `canUseCreateBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreateBookkeepingMapping` - * @summary Create a bookkeeping mapping for a business partner - * @permission Requires `canUseCreateBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateBookkeepingMapping = ( - options?: AppMutationOptions< - typeof BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping, - { - officeId: string; - businessPartnerId: string; - data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping(officeId, businessPartnerId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId })); - return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping( - officeId, - businessPartnerId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdateBookkeepingMapping` + * @summary Update an existing bookkeeping mapping for a business partner + * @permission Requires `canUseUpdateBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdateBookkeepingMapping` - * @summary Update an existing bookkeeping mapping for a business partner - * @permission Requires `canUseUpdateBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBookkeepingMapping = ( - options?: AppMutationOptions< - typeof BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping, - { - officeId: string; - businessPartnerId: string; - data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping(officeId, businessPartnerId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId })); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping( - officeId, - businessPartnerId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdateBookkeepingMappingById` + * @summary Update a specific bookkeeping mapping by ID for a business partner + * @permission Requires `canUseUpdateBookkeepingMappingById` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBookkeepingMappingById = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdateBookkeepingMappingById` - * @summary Update a specific bookkeeping mapping by ID for a business partner - * @permission Requires `canUseUpdateBookkeepingMappingById` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBookkeepingMappingById = ( - options?: AppMutationOptions< - typeof BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById, - { - officeId: string; - businessPartnerId: string; - id: string; - data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, id, data }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById(officeId, businessPartnerId, id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, id, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId })); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById( - officeId, - businessPartnerId, - id, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteBookkeepingMapping` + * @summary Delete an existing bookkeeping mapping for a business partner + * @permission Requires `canUseDeleteBookkeepingMapping` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteBookkeepingMapping` - * @summary Delete an existing bookkeeping mapping for a business partner - * @permission Requires `canUseDeleteBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteBookkeepingMapping = ( - options?: AppMutationOptions< - typeof BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping, - { officeId: string; businessPartnerId: string; id: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, id }) => { + checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId } )); + return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, id }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId })); - return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts index 908af98..ea3ab69 100644 --- a/test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts +++ b/test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts @@ -1,63 +1,69 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace BusinessPartnerContactsAcl { - /** - * Use for `useGetContacts` query ability. For global ability, omit the object parameter. - * @description List business partner contacts - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetContacts` query - */ - export const canUseGetContacts = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; +/** + * Use for `useGetContacts` query ability. For global ability, omit the object parameter. + * @description List business partner contacts + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetContacts` query + */ +export const canUseGetContacts = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - /** - * Use for `useCreateContact` mutation ability. For global ability, omit the object parameter. - * @description Create business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateContact` mutation - */ - export const canUseCreateContact = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; +/** + * Use for `useCreateContact` mutation ability. For global ability, omit the object parameter. + * @description Create business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateContact` mutation + */ +export const canUseCreateContact = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - /** - * Use for `usePaginateContactLabels` query ability. For global ability, omit the object parameter. - * @description Paginate business partner contact labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateContactLabels` query - */ - export const canUsePaginateContactLabels = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; +/** + * Use for `usePaginateContactLabels` query ability. For global ability, omit the object parameter. + * @description Paginate business partner contact labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateContactLabels` query + */ +export const canUsePaginateContactLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - /** - * Use for `useUpdateContact` mutation ability. For global ability, omit the object parameter. - * @description Update business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateContact` mutation - */ - export const canUseUpdateContact = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; +/** + * Use for `useUpdateContact` mutation ability. For global ability, omit the object parameter. + * @description Update business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateContact` mutation + */ +export const canUseUpdateContact = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useDeleteContact` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner contact + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteContact` mutation + */ +export const canUseDeleteContact = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - /** - * Use for `useDeleteContact` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteContact` mutation - */ - export const canUseDeleteContact = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; } diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts index 7a930b4..60c1869 100644 --- a/test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts +++ b/test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts @@ -1,101 +1,52 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; export namespace BusinessPartnerContactsApi { - export const getContacts = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { +export const getContacts = (officeId: string, businessPartnerId: string, ) => { return AppRestClient.get( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - config, - ); - }; - - export const createContact = ( - officeId: string, - businessPartnerId: string, - data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, + + ) +}; +export const createContact = (officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, ) => { return AppRestClient.post( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), - config, - ); - }; - - export const paginateContactLabels = ( - officeId: string, - businessPartnerId: string, - limit: number, - order?: string, - filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, + ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), + + ) +}; +export const paginateContactLabels = (officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const updateContact = ( - contactId: string, - officeId: string, - businessPartnerId: string, - data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const updateContact = (contactId: string, officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, ) => { return AppRestClient.patch( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), - config, - ); - }; - - export const deleteContact = ( - contactId: string, - officeId: string, - businessPartnerId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, + ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), + + ) +}; +export const deleteContact = (contactId: string, officeId: string, businessPartnerId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - undefined, - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, + + ) +}; } diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts index cf71eb6..9c4ccc5 100644 --- a/test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts +++ b/test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts @@ -6,36 +6,37 @@ import { BusinessPartnerContactsQueries } from "./businessPartnerContacts.querie import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; export namespace BusinessPartnerContactsConfigs { - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: BusinessPartnerContactsAcl.canUsePaginateContactLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: BusinessPartnerContactsQueries.usePaginateContactLabels, - infinite: BusinessPartnerContactsQueries.usePaginateContactLabelsInfinite, - filters: { - schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: BusinessPartnerContactsAcl.canUsePaginateContactLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema, + paginated: BusinessPartnerContactsQueries.usePaginateContactLabels, + infinite: BusinessPartnerContactsQueries.usePaginateContactLabelsInfinite, + filters: { + schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema, + }, +}), }, - }; +}; + } diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts index 875a0ca..c9b784b 100644 --- a/test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts +++ b/test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts @@ -2,124 +2,83 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace BusinessPartnerContactsModels { - /** - * BusinessPartnerContactRoleEnumSchema - * @type { enum } - */ - export const BusinessPartnerContactRoleEnumSchema = z.enum([ - "General", - "CommercialManager", - "SystemEngineer", - "TechnicalEngineer", - "Logistics", - "Operations", - "Sales", - "Accounting", - "Invoice", - "Dunnings", - "Reclamations", - "Management", - ]); - export type BusinessPartnerContactRoleEnum = z.infer; - export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSchema.enum; +/** + * BusinessPartnerContactRoleEnumSchema + * @type { enum } + */ +export const BusinessPartnerContactRoleEnumSchema = z.enum(["General", "CommercialManager", "SystemEngineer", "TechnicalEngineer", "Logistics", "Operations", "Sales", "Accounting", "Invoice", "Dunnings", "Reclamations", "Management"]); +export type BusinessPartnerContactRoleEnum = z.infer; +export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSchema.enum; - /** - * BusinessPartnerContactResponseDTOSchema - * @type { object } - * @property { string } id Contact ID - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ - export const BusinessPartnerContactResponseDTOSchema = z - .object({ - id: z.string().describe("Contact ID"), - role: BusinessPartnerContactRoleEnumSchema.nullish(), - name: z.string().describe("Contact name").nullish(), - email: z.string().describe("Contact email").nullish(), - phone: z.string().describe("Contact phone").nullish(), - }) - .readonly(); - export type BusinessPartnerContactResponseDTO = z.infer; +/** + * BusinessPartnerContactResponseDTOSchema + * @type { object } + * @property { string } id Contact ID + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ +export const BusinessPartnerContactResponseDTOSchema = z.object({ id: z.string(), role: BusinessPartnerContactRoleEnumSchema.nullish(), name: z.string().nullish(), email: z.string().nullish(), phone: z.string().nullish() }); +export type BusinessPartnerContactResponseDTO = z.infer; - /** - * BusinessPartnerContactListResponseDTOSchema - * @type { object } - * @property { BusinessPartnerContactResponseDTO[] } contacts List of contacts - */ - export const BusinessPartnerContactListResponseDTOSchema = z - .object({ contacts: z.array(BusinessPartnerContactResponseDTOSchema).readonly().describe("List of contacts") }) - .readonly(); - export type BusinessPartnerContactListResponseDTO = z.infer; +/** + * BusinessPartnerContactListResponseDTOSchema + * @type { object } + * @property { BusinessPartnerContactResponseDTO[] } contacts List of contacts + */ +export const BusinessPartnerContactListResponseDTOSchema = z.object({ contacts: z.array(BusinessPartnerContactResponseDTOSchema) }); +export type BusinessPartnerContactListResponseDTO = z.infer; - /** - * CreateBusinessPartnerContactRequestDTOSchema - * @type { object } - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ - export const CreateBusinessPartnerContactRequestDTOSchema = z - .object({ - role: BusinessPartnerContactRoleEnumSchema, - name: z.string().describe("Contact name"), - email: z.string().describe("Contact email"), - phone: z.string().describe("Contact phone"), - }) - .readonly(); - export type CreateBusinessPartnerContactRequestDTO = z.infer; +/** + * CreateBusinessPartnerContactRequestDTOSchema + * @type { object } + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ +export const CreateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema.nullable(), name: z.string().nullable(), email: z.string().nullable(), phone: z.string().nullable() }).partial(); +export type CreateBusinessPartnerContactRequestDTO = z.infer; - /** - * UpdateBusinessPartnerContactRequestDTOSchema - * @type { object } - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ - export const UpdateBusinessPartnerContactRequestDTOSchema = z - .object({ - role: BusinessPartnerContactRoleEnumSchema, - name: z.string().describe("Contact name"), - email: z.string().describe("Contact email"), - phone: z.string().describe("Contact phone"), - }) - .readonly(); - export type UpdateBusinessPartnerContactRequestDTO = z.infer; +/** + * UpdateBusinessPartnerContactRequestDTOSchema + * @type { object } + * @property { BusinessPartnerContactRoleEnum } role + * @property { string } name Contact name + * @property { string } email Contact email + * @property { string } phone Contact phone + */ +export const UpdateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema.nullable(), name: z.string().nullable(), email: z.string().nullable(), phone: z.string().nullable() }).partial(); +export type UpdateBusinessPartnerContactRequestDTO = z.infer; - /** - * BusinessPartnerContactFilterDtoSchema - * @type { object } - * @property { string } search Search by name, email, or phone - */ - export const BusinessPartnerContactFilterDtoSchema = z - .object({ search: z.string().describe("Search by name, email, or phone") }) - .readonly(); - export type BusinessPartnerContactFilterDto = z.infer; +/** + * BusinessPartnerContactFilterDtoSchema + * @type { object } + * @property { string } search Search by name, email, or phone + */ +export const BusinessPartnerContactFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type BusinessPartnerContactFilterDto = z.infer; - /** - * PaginateContactLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PaginateContactLabelsOrderParamEnumSchema = z.enum(["name", "role", "email", "createdAt", "updatedAt"]); - export type PaginateContactLabelsOrderParamEnum = z.infer; - export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderParamEnumSchema.enum; +/** + * PaginateContactLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateContactLabelsOrderParamEnumSchema = z.enum(["name", "role", "email", "createdAt", "updatedAt"]); +export type PaginateContactLabelsOrderParamEnum = z.infer; +export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderParamEnumSchema.enum; + +/** + * PaginateContactLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateContactLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type PaginateContactLabelsResponse = z.infer; - /** - * PaginateContactLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PaginateContactLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PaginateContactLabelsResponse = z.infer; } diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts index a29ac21..8941f35 100644 --- a/test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts +++ b/test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,313 +8,178 @@ import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models" import { BusinessPartnerContactsApi } from "./businessPartnerContacts.api"; export namespace BusinessPartnerContactsQueries { - export const moduleName = QueryModule.BusinessPartnerContacts; +export const moduleName = QueryModule.BusinessPartnerContacts; - export const keys = { +export const keys = { all: [moduleName] as const, - getContacts: (officeId: string, businessPartnerId: string) => - [ - ...keys.all, - "/offices/:officeId/business-partners/:businessPartnerId/contacts", - officeId, - businessPartnerId, - ] as const, - paginateContactLabels: ( - officeId: string, - businessPartnerId: string, - limit?: number, - order?: string, - filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", - officeId, - businessPartnerId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateContactLabelsInfinite: ( - officeId: string, - businessPartnerId: string, - limit?: number, - order?: string, - filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", - "infinite", - officeId, - businessPartnerId, - limit, - order, - filter, - cursor, - ] as const, - }; + getContacts: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts", officeId, businessPartnerId] as const, + paginateContactLabels: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", officeId, businessPartnerId, limit, order, filter, page, cursor] as const, + paginateContactLabelsInfinite: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", "infinite", officeId, businessPartnerId, limit, order, filter, cursor] as const, +}; - /** - * Query `useGetContacts` - * @summary Get all contacts for a business partner - * @permission Requires `canUseGetContacts` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetContacts = ( - { officeId, businessPartnerId }: { officeId: string; businessPartnerId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetContacts` + * @summary Get all contacts for a business partner + * @permission Requires `canUseGetContacts` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetContacts = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getContacts(officeId, businessPartnerId), + queryFn: () => { + checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId } )); + return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getContacts(officeId, businessPartnerId), - queryFn: () => { - checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId })); - return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId, config); - }, - ...options, - }); - }; +/** + * Mutation `useCreateContact` + * @summary Create a new contact for a business partner + * @permission Requires `canUseCreateContact` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateContact = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreateContact` - * @summary Create a new contact for a business partner - * @permission Requires `canUseCreateContact` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateContact = ( - options?: AppMutationOptions< - typeof BusinessPartnerContactsApi.createContact, - { - officeId: string; - businessPartnerId: string; - data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId })); - return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateContactLabels` - * @summary Paginate business partner contact labels (id and name only) - * @permission Requires `canUsePaginateContactLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` - * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateContactLabels = ( - { - officeId, - businessPartnerId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - businessPartnerId: string; - limit: number; - order?: string; - filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId } )); + return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateContactLabels` + * @summary Paginate business partner contact labels (id and name only) + * @permission Requires `canUsePaginateContactLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` + * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateContactLabels = ({ officeId, businessPartnerId, limit, order, filter, page, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); + return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId })); - return BusinessPartnerContactsApi.paginateContactLabels( - officeId, - businessPartnerId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateContactLabelsInfinite + * @summary Paginate business partner contact labels (id and name only) + * @permission Requires `canUsePaginateContactLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.businessPartnerId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` + * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateContactLabelsInfinite = ({ officeId, businessPartnerId, limit, order, filter, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateContactLabelsInfinite - * @summary Paginate business partner contact labels (id and name only) - * @permission Requires `canUsePaginateContactLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` - * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateContactLabelsInfinite = ( - { - officeId, - businessPartnerId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - businessPartnerId: string; - limit: number; - order?: string; - filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); + return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId })); - return BusinessPartnerContactsApi.paginateContactLabels( - officeId, - businessPartnerId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Mutation `useUpdateContact` + * @summary Update a business partner contact + * @permission Requires `canUseUpdateContact` ability + * @param { string } mutation.contactId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateContact = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdateContact` - * @summary Update a business partner contact - * @permission Requires `canUseUpdateContact` ability - * @param { string } mutation.contactId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateContact = ( - options?: AppMutationOptions< - typeof BusinessPartnerContactsApi.updateContact, - { - contactId: string; - officeId: string; - businessPartnerId: string; - data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { + checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId } )); + return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId })); - return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteContact` + * @permission Requires `canUseDeleteContact` ability + * @param { string } mutation.contactId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.businessPartnerId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 204, 401] + */ +export const useDeleteContact = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteContact` - * @permission Requires `canUseDeleteContact` ability - * @param { string } mutation.contactId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 204, 401] - */ - export const useDeleteContact = ( - options?: AppMutationOptions< - typeof BusinessPartnerContactsApi.deleteContact, - { contactId: string; officeId: string; businessPartnerId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ contactId, officeId, businessPartnerId }) => { + checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId } )); + return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ contactId, officeId, businessPartnerId }) => { - checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId })); - return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/businessPartners/businessPartners.acl.ts b/test/generated/base/businessPartners/businessPartners.acl.ts index 3139313..a532e2e 100644 --- a/test/generated/base/businessPartners/businessPartners.acl.ts +++ b/test/generated/base/businessPartners/businessPartners.acl.ts @@ -1,243 +1,264 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace BusinessPartnersAcl { - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List business partners - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Create", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Paginate business partner labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Read business partner details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ - export const canUseGetById = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Archive", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Archive", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useLock` mutation ability. For global ability, omit the object parameter. - * @description Lock business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLock` mutation - */ - export const canUseLock = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUnlock` mutation ability. For global ability, omit the object parameter. - * @description Unlock business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlock` mutation - */ - export const canUseUnlock = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useGetRemarks` query ability. For global ability, omit the object parameter. - * @description List business partner remarks - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetRemarks` query - */ - export const canUseGetRemarks = (object?: { officeId: string }) => - ["ReadRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "ReadRemark", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useCreateRemark` mutation ability. For global ability, omit the object parameter. - * @description Create business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRemark` mutation - */ - export const canUseCreateRemark = (object?: { officeId: string }) => - ["CreateRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "CreateRemark", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdateRemark` mutation ability. For global ability, omit the object parameter. - * @description Update business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRemark` mutation - */ - export const canUseUpdateRemark = (object?: { officeId: string }) => - ["UpdateRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "UpdateRemark", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useDeleteRemark` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemark` mutation - */ - export const canUseDeleteRemark = (object?: { officeId: string }) => - ["DeleteRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "DeleteRemark", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useGetBasicInfo` query ability. For global ability, omit the object parameter. - * @description Read business partner basic info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBasicInfo` query - */ - export const canUseGetBasicInfo = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdateBasicInfo` mutation ability. For global ability, omit the object parameter. - * @description Update business partner basic info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBasicInfo` mutation - */ - export const canUseUpdateBasicInfo = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab"] as AbilityTuple< - "Update", - "BusinessPartnerBasicTab" | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) - >; - - /** - * Use for `useCreateSignatureUploadInstructions` mutation ability. For global ability, omit the object parameter. - * @description Create business partner signature upload instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateSignatureUploadInstructions` mutation - */ - export const canUseCreateSignatureUploadInstructions = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab"] as AbilityTuple< - "Update", - "BusinessPartnerBasicTab" | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) - >; - - /** - * Use for `useGetCargoAgentInfo` query ability. For global ability, omit the object parameter. - * @description Read business partner cargo agent info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoAgentInfo` query - */ - export const canUseGetCargoAgentInfo = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdateCargoAgent` mutation ability. For global ability, omit the object parameter. - * @description Update business partner cargo agent info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargoAgent` mutation - */ - export const canUseUpdateCargoAgent = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useGetCarrierInformation` query ability. For global ability, omit the object parameter. - * @description Read business partner carrier info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCarrierInformation` query - */ - export const canUseGetCarrierInformation = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdateCarrier` mutation ability. For global ability, omit the object parameter. - * @description Update business partner carrier info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCarrier` mutation - */ - export const canUseUpdateCarrier = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List business partners + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Create", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Paginate business partner labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Read business partner details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useLock` mutation ability. For global ability, omit the object parameter. + * @description Lock business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLock` mutation + */ +export const canUseLock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUnlock` mutation ability. For global ability, omit the object parameter. + * @description Unlock business partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlock` mutation + */ +export const canUseUnlock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetRemarks` query ability. For global ability, omit the object parameter. + * @description List business partner remarks + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetRemarks` query + */ +export const canUseGetRemarks = ( + object?: { officeId: string, } +) => [ + "ReadRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useCreateRemark` mutation ability. For global ability, omit the object parameter. + * @description Create business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRemark` mutation + */ +export const canUseCreateRemark = ( + object?: { officeId: string, } +) => [ + "CreateRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateRemark` mutation ability. For global ability, omit the object parameter. + * @description Update business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRemark` mutation + */ +export const canUseUpdateRemark = ( + object?: { officeId: string, } +) => [ + "UpdateRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useDeleteRemark` mutation ability. For global ability, omit the object parameter. + * @description Delete business partner remark + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemark` mutation + */ +export const canUseDeleteRemark = ( + object?: { officeId: string, } +) => [ + "DeleteRemark", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetBasicInfo` query ability. For global ability, omit the object parameter. + * @description Read business partner basic info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBasicInfo` query + */ +export const canUseGetBasicInfo = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateBasicInfo` mutation ability. For global ability, omit the object parameter. + * @description Update business partner basic info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBasicInfo` mutation + */ +export const canUseUpdateBasicInfo = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" +] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; + +/** + * Use for `useCreateSignatureUploadInstructions` mutation ability. For global ability, omit the object parameter. + * @description Create business partner signature upload instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateSignatureUploadInstructions` mutation + */ +export const canUseCreateSignatureUploadInstructions = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" +] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; + +/** + * Use for `useGetCargoAgentInfo` query ability. For global ability, omit the object parameter. + * @description Read business partner cargo agent info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoAgentInfo` query + */ +export const canUseGetCargoAgentInfo = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateCargoAgent` mutation ability. For global ability, omit the object parameter. + * @description Update business partner cargo agent info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargoAgent` mutation + */ +export const canUseUpdateCargoAgent = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useGetCarrierInformation` query ability. For global ability, omit the object parameter. + * @description Read business partner carrier info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCarrierInformation` query + */ +export const canUseGetCarrierInformation = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + +/** + * Use for `useUpdateCarrier` mutation ability. For global ability, omit the object parameter. + * @description Update business partner carrier info + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCarrier` mutation + */ +export const canUseUpdateCarrier = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("BusinessPartner", object) : "BusinessPartner" +] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; + } diff --git a/test/generated/base/businessPartners/businessPartners.api.ts b/test/generated/base/businessPartners/businessPartners.api.ts index e374b3c..df8cc83 100644 --- a/test/generated/base/businessPartners/businessPartners.api.ts +++ b/test/generated/base/businessPartners/businessPartners.api.ts @@ -1,286 +1,171 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { BusinessPartnersModels } from "./businessPartners.models"; export namespace BusinessPartnersApi { - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, - `/offices/${officeId}/business-partners`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = ( - officeId: string, - data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, + `/offices/${officeId}/business-partners`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, ) => { return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, - `/offices/${officeId}/business-partners`, - ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), - config, - ); - }; - - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, + `/offices/${officeId}/business-partners`, + ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), + + ) +}; +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, - `/offices/${officeId}/business-partners/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const getById = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, + `/offices/${officeId}/business-partners/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getById = (officeId: string, id: string, ) => { return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}`, - config, - ); - }; - - export const update = ( - officeId: string, - id: string, - data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}`, + + ) +}; +export const update = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, ) => { return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), - config, - ); - }; - - export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), + + ) +}; +export const archive = (officeId: string, id: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/archive`, + + ) +}; +export const unarchive = (officeId: string, id: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/unarchive`, - undefined, - config, - ); - }; - - export const lock = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/unarchive`, + + ) +}; +export const lock = (officeId: string, id: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/lock`, - undefined, - config, - ); - }; - - export const unlock = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/lock`, + + ) +}; +export const unlock = (officeId: string, id: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/unlock`, - undefined, - config, - ); - }; - - export const getRemarks = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/unlock`, + + ) +}; +export const getRemarks = (officeId: string, id: string, ) => { return AppRestClient.get( - { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, - `/offices/${officeId}/business-partners/${id}/remarks`, - config, - ); - }; - - export const createRemark = ( - officeId: string, - id: string, - data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, + `/offices/${officeId}/business-partners/${id}/remarks`, + + ) +}; +export const createRemark = (officeId: string, id: string, data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, ) => { return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/remarks`, - ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), - config, - ); - }; - - export const updateRemark = ( - officeId: string, - id: string, - remarkId: string, - data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/remarks`, + ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), + + ) +}; +export const updateRemark = (officeId: string, id: string, remarkId: string, data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, ) => { return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), - config, - ); - }; - - export const deleteRemark = (officeId: string, id: string, remarkId: string, config?: AxiosRequestConfig) => { + { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), + + ) +}; +export const deleteRemark = (officeId: string, id: string, remarkId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - undefined, - config, - ); - }; - - export const getBasicInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, + + ) +}; +export const getBasicInfo = (officeId: string, id: string, ) => { return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic`, - config, - ); - }; - - export const updateBasicInfo = ( - officeId: string, - id: string, - data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic`, + + ) +}; +export const updateBasicInfo = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, ) => { return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), - config, - ); - }; - - export const createSignatureUploadInstructions = ( - officeId: string, - id: string, - data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic`, + ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), + + ) +}; +export const createSignatureUploadInstructions = (officeId: string, id: string, data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, ) => { return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, - ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), - config, - ); - }; - - export const getCargoAgentInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, + ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), + + ) +}; +export const getCargoAgentInfo = (officeId: string, id: string, ) => { return AppRestClient.get( - { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/cargo-agent`, - config, - ); - }; - - export const updateCargoAgent = ( - officeId: string, - id: string, - data: BusinessPartnersModels.UpdateCargoAgentDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/cargo-agent`, + + ) +}; +export const updateCargoAgent = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCargoAgentDTO, ) => { return AppRestClient.patch( - { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/cargo-agent`, - ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), - config, - ); - }; - - export const getCarrierInformation = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/cargo-agent`, + ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), + + ) +}; +export const getCarrierInformation = (officeId: string, id: string, ) => { return AppRestClient.get( - { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/carrier`, - config, - ); - }; - - export const updateCarrier = ( - officeId: string, - id: string, - data: BusinessPartnersModels.UpdateCarrierDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/carrier`, + + ) +}; +export const updateCarrier = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCarrierDTO, ) => { return AppRestClient.patch( - { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/carrier`, - ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), - config, - ); - }; + { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, + `/offices/${officeId}/business-partners/${id}/carrier`, + ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/businessPartners/businessPartners.configs.ts b/test/generated/base/businessPartners/businessPartners.configs.ts index 3ba3ac7..971a761 100644 --- a/test/generated/base/businessPartners/businessPartners.configs.ts +++ b/test/generated/base/businessPartners/businessPartners.configs.ts @@ -5,144 +5,145 @@ import { BusinessPartnersQueries } from "./businessPartners.queries"; import { BusinessPartnersAcl } from "./businessPartners.acl"; export namespace BusinessPartnersConfigs { - export const businessPartnersConfig = { +export const businessPartnersConfig = { meta: { - title: "Business Partners", + title: "Business Partners", }, readAll: { - acl: BusinessPartnersAcl.canUsePaginate, - schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, - paginated: BusinessPartnersQueries.usePaginate, - infinite: BusinessPartnersQueries.usePaginateInfinite, - filters: { - schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, - options: { - inputs: { - search: true, - types: true, - shortName: true, - name: true, - vat: true, - debtorId: true, - creditorId: true, - matchCode: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: BusinessPartnersAcl.canUsePaginate, schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - address: true, - types: true, - archived: true, - shortName: true, - vat: true, - debtorId: true, - creditorId: true, - locked: true, - currency: true, - remarks: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema, + paginated: BusinessPartnersQueries.usePaginate, + infinite: BusinessPartnersQueries.usePaginateInfinite, + filters: { + schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, + options: { + inputs: { + search: true, + types: true, + shortName: true, + name: true, + vat: true, + debtorId: true, + creditorId: true, + matchCode: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + address: true, + types: true, + archived: true, + shortName: true, + vat: true, + debtorId: true, + creditorId: true, + locked: true, + currency: true, + remarks: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: BusinessPartnersAcl.canUseGetById, - schema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema, - query: BusinessPartnersQueries.useGetById, + acl: BusinessPartnersAcl.canUseGetById, + schema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema, + query: BusinessPartnersQueries.useGetById, }, create: { - acl: BusinessPartnersAcl.canUseCreate, - schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, - mutation: BusinessPartnersQueries.useCreate, - inputDefs: dynamicInputs({ + acl: BusinessPartnersAcl.canUseCreate, schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, - options: { - inputs: { - name: true, - secondaryName: true, - types: true, - matchCode: true, - shortName: true, - address: true, - }, - }, - }), + mutation: BusinessPartnersQueries.useCreate, + inputDefs: dynamicInputs({ + schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, + options: { + inputs: { + name: true, + secondaryName: true, + types: true, + matchCode: true, + shortName: true, + address: true, + }, + }, +}) }, update: { - acl: BusinessPartnersAcl.canUseUpdate, - schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, - mutation: BusinessPartnersQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: BusinessPartnersAcl.canUseUpdate, schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - secondaryName: true, - types: true, - address: true, - blAddress: true, - belongsToId: true, - salesRepId: true, - operationsId: true, - addressIsDifferentForBl: true, - }, - }, - }), + mutation: BusinessPartnersQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + secondaryName: true, + types: true, + address: true, + blAddress: true, + belongsToId: true, + salesRepId: true, + operationsId: true, + addressIsDifferentForBl: true, }, - }; + }, +}) + }, +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: BusinessPartnersAcl.canUsePaginateLabels, - schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, - paginated: BusinessPartnersQueries.usePaginateLabels, - infinite: BusinessPartnersQueries.usePaginateLabelsInfinite, - filters: { - schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, - options: { - inputs: { - search: true, - ids: true, - types: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: BusinessPartnersAcl.canUsePaginateLabels, schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - types: true, - }, - sortable: BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema, + paginated: BusinessPartnersQueries.usePaginateLabels, + infinite: BusinessPartnersQueries.usePaginateLabelsInfinite, + filters: { + schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, + options: { + inputs: { + search: true, + ids: true, + types: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + types: true, }, - }; + sortable: BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/businessPartners/businessPartners.models.ts b/test/generated/base/businessPartners/businessPartners.models.ts index c247589..b825ac4 100644 --- a/test/generated/base/businessPartners/businessPartners.models.ts +++ b/test/generated/base/businessPartners/businessPartners.models.ts @@ -2,813 +2,488 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace BusinessPartnersModels { - /** - * RemarkVisibilitySchema - * @type { enum } - */ - export const RemarkVisibilitySchema = z.enum(["internal", "popup"]); - export type RemarkVisibility = z.infer; - export const RemarkVisibility = RemarkVisibilitySchema.enum; - - /** - * RemarkTypeSchema - * @type { enum } - */ - export const RemarkTypeSchema = z.enum(["INFORMATIONAL", "WARNING"]); - export type RemarkType = z.infer; - export const RemarkType = RemarkTypeSchema.enum; - - /** - * BusinessPartnerRemarkResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the remark - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of the remark - */ - export const BusinessPartnerRemarkResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the remark"), - visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), - content: z.string().describe("Content of the remark"), - type: RemarkTypeSchema.describe("Type of the remark"), - }) - .readonly(); - export type BusinessPartnerRemarkResponseDTO = z.infer; - - /** - * BusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { string } city City name - * @property { string } isoCode Country code - */ - export const BusinessPartnerAddressDtoSchema = z - .object({ - street: z.string().describe("Street address"), - zip: z.string().describe("ZIP/Postal code"), - city: z.string().describe("City name"), - isoCode: z.string().describe("Country code"), - }) - .readonly(); - export type BusinessPartnerAddressDto = z.infer; - - /** - * BusinessPartnerEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const BusinessPartnerEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type BusinessPartnerEmployeeDTO = z.infer; - - /** - * BusinessPartnerListResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - * @property { string } matchCode Match code of the business partner - * @property { BusinessPartnerAddressDto } address Address information - * @property { CommonModels.BusinessPartnerType[] } types List of business partner types - * @property { boolean } archived Archive status - * @property { string } shortName Short name of the business partner - * @property { string } vat VAT number of the business partner - * @property { string } debtorId Debtor ID for the local currency - * @property { string } creditorId Creditor ID for the local currency - * @property { boolean } locked Whether the business partner is locked - * @property { string } currency Currency (invoice currency) - * @property { BusinessPartnerRemarkResponseDTO[] } remarks Remarks for the business partner - * @property { string } createdById ID of the employee who created this business partner - * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this business partner - * @property { string } createdAt Date when the business partner was created - * @property { string } updatedById ID of the employee who last updated this business partner - * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this business partner - * @property { string } updatedAt Date when the business partner was last updated - */ - export const BusinessPartnerListResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the business partner"), - name: z.string().describe("Name of the business partner"), - matchCode: z.string().describe("Match code of the business partner"), - address: BusinessPartnerAddressDtoSchema.describe("Address information"), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), - archived: z.boolean().describe("Archive status"), - shortName: z.string().describe("Short name of the business partner").nullish(), - vat: z.string().describe("VAT number of the business partner").nullish(), - debtorId: z.string().describe("Debtor ID for the local currency").nullish(), - creditorId: z.string().describe("Creditor ID for the local currency").nullish(), - locked: z.boolean().describe("Whether the business partner is locked"), - currency: z.string().describe("Currency (invoice currency)").nullish(), - remarks: z.array(BusinessPartnerRemarkResponseDTOSchema).readonly().describe("Remarks for the business partner"), - createdById: z.string().describe("ID of the employee who created this business partner").nullish(), - createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this business partner").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was created"), - updatedById: z.string().describe("ID of the employee who last updated this business partner").nullish(), - updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this business partner").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was last updated"), - }) - .readonly(); - export type BusinessPartnerListResponseDTO = z.infer; - - /** - * BusinessPartnerFilterDtoSchema - * @type { object } - * @property { string } search - * @property { CommonModels.BusinessPartnerType[] } types - * @property { string } shortName - * @property { string } name - * @property { string } vat - * @property { string } debtorId - * @property { string } creditorId - * @property { string } matchCode - * @property { boolean } archived Filter by archived status - */ - export const BusinessPartnerFilterDtoSchema = z - .object({ - search: z.string(), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly(), - shortName: z.string(), - name: z.string(), - vat: z.string(), - debtorId: z.string(), - creditorId: z.string(), - matchCode: z.string(), - archived: z.boolean().describe("Filter by archived status"), - }) - .readonly(); - export type BusinessPartnerFilterDto = z.infer; - - /** - * BusinessPartnerPaginatedLabelResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } label Label of the business partner - * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types - */ - export const BusinessPartnerPaginatedLabelResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the business partner"), - label: z.string().describe("Label of the business partner"), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types"), - }) - .readonly(); - export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; - - /** - * BusinessPartnerLabelsFilterDtoSchema - * @type { object } - * @property { string } search - * @property { string[] } ids Business partner ids to filter by - * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types to filter by - * @property { boolean } archived Filter by archived status - */ - export const BusinessPartnerLabelsFilterDtoSchema = z - .object({ - search: z.string(), - ids: z.array(z.string()).readonly().describe("Business partner ids to filter by"), - types: z - .array(CommonModels.BusinessPartnerTypeSchema) - .readonly() - .describe("Array of business partner types to filter by"), - archived: z.boolean().describe("Filter by archived status"), - }) - .readonly(); - export type BusinessPartnerLabelsFilterDto = z.infer; - - /** - * CreateBusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } district - * @property { string } countryId - */ - export const CreateBusinessPartnerAddressDtoSchema = z - .object({ - street: z.string(), - secondaryStreet: z.string(), - zip: z.string(), - cityId: z.string(), - district: z.string(), - countryId: z.string(), - }) - .readonly(); - export type CreateBusinessPartnerAddressDto = z.infer; - - /** - * CreateBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } name Full name of the business partner. Min Length: `3` - * @property { string } secondaryName Full name of the business partner. Min Length: `3` - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { string } matchCode Unique identifier code - * @property { string } shortName Short name for the business partner - * @property { CreateBusinessPartnerAddressDto } address Address information - */ - export const CreateBusinessPartnerRequestDTOSchema = z - .object({ - name: z.string().min(3).describe("Full name of the business partner"), - secondaryName: z.string().min(3).describe("Full name of the business partner").nullish(), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), - matchCode: z.string().describe("Unique identifier code").nullish(), - shortName: z.string().describe("Short name for the business partner").nullish(), - address: CreateBusinessPartnerAddressDtoSchema.describe("Address information").nullish(), - }) - .readonly(); - export type CreateBusinessPartnerRequestDTO = z.infer; - - /** - * BusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { string } rootFolderId Root folder identifier associated with this business partner - */ - export const BusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the business partner"), - name: z.string().describe("Name of the business partner"), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), - rootFolderId: z.string().describe("Root folder identifier associated with this business partner").nullish(), - }) - .readonly(); - export type BusinessPartnerResponseDTO = z.infer; - - /** - * BusinessPartnerLabelResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - */ - export const BusinessPartnerLabelResponseDtoSchema = z - .object({ - id: z.string().describe("Unique identifier of the business partner"), - name: z.string().describe("Name of the business partner"), - }) - .readonly(); - export type BusinessPartnerLabelResponseDto = z.infer; - - /** - * ContactResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the contact - * @property { string } name Name of the contact - */ - export const ContactResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the contact"), - name: z.string().describe("Name of the contact"), - }) - .readonly(); - export type ContactResponseDTO = z.infer; - - /** - * BusinessPartnerDetailResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } createdById ID of the employee who created this record - * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this record - * @property { string } createdAt Creation timestamp - * @property { string } updatedById ID of the employee who last updated this record - * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this record - * @property { string } updatedAt Last update timestamp - * @property { string } matchCode Match code of the business partner - * @property { string } shortName Short name - * @property { string } name Full name - * @property { string } secondaryName Secondary name - * @property { CommonModels.BusinessPartnerType[] } types List of business partner types - * @property { boolean } archived Archived status - * @property { CommonModels.BusinessPartnerAddressResponseDTO } address Main address information - * @property { CommonModels.BusinessPartnerAddressResponseDTO } blAddress BL address information - * @property { BusinessPartnerLabelResponseDto[] } similar Similar named business partners - * @property { boolean } locked - * @property { boolean } addressIsDifferentForBl - * @property { string } lockedById Unique identifier of the employee who locked the business partner - * @property { string } lockedByName - * @property { string } lockedAt Unique identifier of the employee who locked the business partner - * @property { ContactResponseDTO } belongsTo Parent business partner - * @property { ContactResponseDTO } salesRep Sales representative - * @property { ContactResponseDTO } operations Operations contact - */ - export const BusinessPartnerDetailResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the business partner"), - createdById: z.string().describe("ID of the employee who created this record").nullish(), - createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this record").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Creation timestamp"), - updatedById: z.string().describe("ID of the employee who last updated this record").nullish(), - updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this record").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Last update timestamp"), - matchCode: z.string().describe("Match code of the business partner"), - shortName: z.string().describe("Short name"), - name: z.string().describe("Full name"), - secondaryName: z.string().describe("Secondary name"), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), - archived: z.boolean().describe("Archived status"), - address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information"), - blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("BL address information"), - similar: z - .array(BusinessPartnerLabelResponseDtoSchema) - .readonly() - .describe("Similar named business partners") - .nullish(), - locked: z.boolean(), - addressIsDifferentForBl: z.boolean(), - lockedById: z.string().describe("Unique identifier of the employee who locked the business partner").nullish(), - lockedByName: z.string().nullish(), - lockedAt: z.iso - .datetime({ offset: true }) - .describe("Unique identifier of the employee who locked the business partner") - .nullish(), - belongsTo: ContactResponseDTOSchema.describe("Parent business partner"), - salesRep: ContactResponseDTOSchema.describe("Sales representative"), - operations: ContactResponseDTOSchema.describe("Operations contact"), - }) - .readonly(); - export type BusinessPartnerDetailResponseDTO = z.infer; - - /** - * UpdateBusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } district - * @property { string } countryId - */ - export const UpdateBusinessPartnerAddressDtoSchema = z - .object({ - street: z.string(), - secondaryStreet: z.string(), - zip: z.string(), - cityId: z.string().nullable(), - district: z.string(), - countryId: z.string(), - }) - .readonly(); - export type UpdateBusinessPartnerAddressDto = z.infer; - - /** - * UpdateBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code - * @property { string } shortName Updated short name - * @property { string } name Updated full name - * @property { string } secondaryName Updated secondary name - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { UpdateBusinessPartnerAddressDto } address Address information - * @property { UpdateBusinessPartnerAddressDto } blAddress Bl address information - * @property { string } belongsToId Parent business partner - * @property { string } salesRepId Sales representative - * @property { string } operationsId Operations contact - * @property { boolean } addressIsDifferentForBl Different address for BL - */ - export const UpdateBusinessPartnerRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Updated match code"), - shortName: z.string().describe("Updated short name"), - name: z.string().describe("Updated full name"), - secondaryName: z.string().describe("Updated secondary name"), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), - address: UpdateBusinessPartnerAddressDtoSchema.describe("Address information"), - blAddress: UpdateBusinessPartnerAddressDtoSchema.describe("Bl address information"), - belongsToId: z.string().describe("Parent business partner"), - salesRepId: z.string().describe("Sales representative"), - operationsId: z.string().describe("Operations contact"), - addressIsDifferentForBl: z.boolean().describe("Different address for BL"), - }) - .readonly(); - export type UpdateBusinessPartnerRequestDTO = z.infer; - - /** - * CreateBusinessPartnerRemarkRequestDTOSchema - * @type { object } - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of remark - */ - export const CreateBusinessPartnerRemarkRequestDTOSchema = z - .object({ - visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), - content: z.string().describe("Content of the remark"), - type: RemarkTypeSchema.describe("Type of remark"), - }) - .readonly(); - export type CreateBusinessPartnerRemarkRequestDTO = z.infer; - - /** - * UpdateBusinessPartnerRemarkRequestDtoSchema - * @type { object } - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of remark - */ - export const UpdateBusinessPartnerRemarkRequestDtoSchema = z - .object({ - visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), - content: z.string().describe("Content of the remark"), - type: RemarkTypeSchema.describe("Type of remark"), - }) - .readonly(); - export type UpdateBusinessPartnerRemarkRequestDto = z.infer; - - /** - * AccountTypeEnumSchema - * @type { enum } - */ - export const AccountTypeEnumSchema = z.enum([ - "Direct Account", - "Logistic Provider / Forwarder", - "4PL/NVOCC", - "LLP", - "Carrier", - "Service Provider (other)", - "Strategic", - "Key Account", - "Transactional", - "Agent", - "Other", - ]); - export type AccountTypeEnum = z.infer; - export const AccountTypeEnum = AccountTypeEnumSchema.enum; - - /** - * BusinessPartnerAuthorizationSchema - * @type { enum } - */ - export const BusinessPartnerAuthorizationSchema = z.enum(["requiresApproval", "blocked", "regularBusinessPartner"]); - export type BusinessPartnerAuthorization = z.infer; - export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.enum; - - /** - * BusinessPartnerPaymentTermsResponseDtoSchema - * @type { object } - * @property { string } relativeTo - * @property { number } days Minimum: `0` - */ - export const BusinessPartnerPaymentTermsResponseDtoSchema = z - .object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }) - .readonly(); - export type BusinessPartnerPaymentTermsResponseDto = z.infer; - - /** - * BusinessPartnerBankAccountResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const BusinessPartnerBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type BusinessPartnerBankAccountResponseDto = z.infer; - - /** - * PartnerNetworkInfoDtoSchema - * @type { object } - * @property { string } id Partner network ID - * @property { string } name Partner network name - */ - export const PartnerNetworkInfoDtoSchema = z - .object({ id: z.string().describe("Partner network ID"), name: z.string().describe("Partner network name") }) - .readonly(); - export type PartnerNetworkInfoDto = z.infer; - - /** - * BusinessPartnerBasicResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Reference to the business partner - * @property { string[] } relationship List of relationships - * @property { AccountTypeEnum } accountType - * @property { string } vat VAT number - * @property { string } legacySystemId Legacy system (move) id - * @property { string } registrationNumber - * @property { string } eori EORI number - * @property { BusinessPartnerAuthorization } authorization Authorization status - * @property { number } creditLimit Credit limit - * @property { string } invoiceLanguage Invoice language - * @property { string } invoiceCurrency Invoice currency - * @property { string } iban IBAN - * @property { string } bankNumber Bank number - * @property { string } bankAccountNumber Bank account number - * @property { BusinessPartnerPaymentTermsResponseDto } termsExport - * @property { BusinessPartnerPaymentTermsResponseDto } termsImport - * @property { CommonModels.EditorContentResponseDto } notes Notes - * @property { string } bankAccountId - * @property { BusinessPartnerBankAccountResponseDto } bankAccount - * @property { PartnerNetworkInfoDto[] } partnerNetworks Partner networks - * @property { string } dunningSystemId - * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem - * @property { string } hblIssuerSigner HBL issuer/signer prefill - * @property { string } signatureFileAttachmentId Signature file attachment ID - * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment - */ - export const BusinessPartnerBasicResponseDTOSchema = z - .object({ - businessPartnerId: z.string().describe("Reference to the business partner"), - relationship: z.array(z.string()).readonly().describe("List of relationships"), - accountType: AccountTypeEnumSchema.nullish(), - vat: z.string().describe("VAT number"), - legacySystemId: z.string().describe("Legacy system (move) id").nullish(), - registrationNumber: z.string().nullish(), - eori: z.string().describe("EORI number"), - authorization: BusinessPartnerAuthorizationSchema.describe("Authorization status").nullable(), - creditLimit: z.number().describe("Credit limit"), - invoiceLanguage: z.string().describe("Invoice language"), - invoiceCurrency: z.string().describe("Invoice currency"), - iban: z.string().describe("IBAN"), - bankNumber: z.string().describe("Bank number"), - bankAccountNumber: z.string().describe("Bank account number"), - termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, - termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, - notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), - bankAccountId: z.string().nullish(), - bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), - partnerNetworks: z.array(PartnerNetworkInfoDtoSchema).readonly().describe("Partner networks"), - dunningSystemId: z.string().nullish(), - dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), - hblIssuerSigner: z.string().describe("HBL issuer/signer prefill"), - signatureFileAttachmentId: z.string().describe("Signature file attachment ID"), - signatureFileAttachmentUrl: z.string().describe("Signed URL for signature file attachment").nullish(), - }) - .readonly(); - export type BusinessPartnerBasicResponseDTO = z.infer; - - /** - * UpdateBusinessPartnerPaymentTermsDtoSchema - * @type { object } - * @property { string } relativeTo - * @property { number } days Minimum: `0` - */ - export const UpdateBusinessPartnerPaymentTermsDtoSchema = z - .object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }) - .readonly(); - export type UpdateBusinessPartnerPaymentTermsDto = z.infer; - - /** - * UpdateBusinessPartnerBasicRequestDTOSchema - * @type { object } - * @property { string[] } relationship Updated relationships - * @property { string } vat Updated VAT number - * @property { string } eori Updated EORI number - * @property { AccountTypeEnum } accountType - * @property { BusinessPartnerAuthorization } authorization Updated authorization status - * @property { number } creditLimit Updated credit limit - * @property { string } invoiceLanguage Invoice language - * @property { string } invoiceCurrency Invoice currency - * @property { string } iban IBAN - * @property { string } bankNumber Bank number - * @property { string } bankAccountNumber Bank account number - * @property { string } legacySystemId Legacy system (move) id - * @property { string } registrationNumber - * @property { UpdateBusinessPartnerPaymentTermsDto } termsExport - * @property { UpdateBusinessPartnerPaymentTermsDto } termsImport - * @property { CommonModels.EditorContentUpdateDto } notes Notes - * @property { string } bankAccountId - * @property { string[] } partnerNetworkIds Partner network IDs - * @property { string } dunningSystemId Dunning system ID - * @property { string } hblIssuerSigner HBL issuer/signer prefill - * @property { string } signatureFileAttachmentId Signature file attachment ID - */ - export const UpdateBusinessPartnerBasicRequestDTOSchema = z - .object({ - relationship: z.array(z.string()).readonly().describe("Updated relationships"), - vat: z.string().describe("Updated VAT number"), - eori: z.string().describe("Updated EORI number"), - accountType: AccountTypeEnumSchema, - authorization: BusinessPartnerAuthorizationSchema.describe("Updated authorization status"), - creditLimit: z.number().describe("Updated credit limit"), - invoiceLanguage: z.string().describe("Invoice language"), - invoiceCurrency: z.string().describe("Invoice currency"), - iban: z.string().describe("IBAN"), - bankNumber: z.string().describe("Bank number"), - bankAccountNumber: z.string().describe("Bank account number"), - legacySystemId: z.string().describe("Legacy system (move) id"), - registrationNumber: z.string(), - termsExport: UpdateBusinessPartnerPaymentTermsDtoSchema, - termsImport: UpdateBusinessPartnerPaymentTermsDtoSchema, - notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), - bankAccountId: z.string().nullable(), - partnerNetworkIds: z.array(z.string()).readonly().describe("Partner network IDs"), - dunningSystemId: z.string().describe("Dunning system ID").nullable(), - hblIssuerSigner: z.string().describe("HBL issuer/signer prefill").nullable(), - signatureFileAttachmentId: z.string().describe("Signature file attachment ID").nullable(), - }) - .readonly(); - export type UpdateBusinessPartnerBasicRequestDTO = z.infer; - - /** - * BusinessPartnerSignatureUploadRequestDTOSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType Mime type - * @property { number } fileSize File size in bytes. Minimum: `1` - */ - export const BusinessPartnerSignatureUploadRequestDTOSchema = z - .object({ - fileName: z.string().describe("File name"), - mimeType: z.string().describe("Mime type"), - fileSize: z.number().gte(1).describe("File size in bytes"), - }) - .readonly(); - export type BusinessPartnerSignatureUploadRequestDTO = z.infer; - - /** - * BusinessPartnerSignatureUploadResponseDTOSchema - * @type { object } - * @property { string } mediaId Media ID for the uploaded signature - * @property { string } method HTTP method to use for upload - * @property { string } url URL to upload the file to - */ - export const BusinessPartnerSignatureUploadResponseDTOSchema = z - .object({ - mediaId: z.string().describe("Media ID for the uploaded signature"), - method: z.string().describe("HTTP method to use for upload"), - url: z.string().describe("URL to upload the file to"), - }) - .readonly(); - export type BusinessPartnerSignatureUploadResponseDTO = z.infer< - typeof BusinessPartnerSignatureUploadResponseDTOSchema - >; - - /** - * CargoAgentResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Business partner identifier - * @property { string } portOfHamburgAccountNumber Port of Hamburg account number - * @property { string } iataAccountNumber IATA account number - * @property { string } regulatedAgentCode Regulated agent code - */ - export const CargoAgentResponseDTOSchema = z - .object({ - businessPartnerId: z.string().describe("Business partner identifier"), - portOfHamburgAccountNumber: z.string().describe("Port of Hamburg account number"), - iataAccountNumber: z.string().describe("IATA account number"), - regulatedAgentCode: z.string().describe("Regulated agent code"), - }) - .readonly(); - export type CargoAgentResponseDTO = z.infer; - - /** - * UpdateCargoAgentDTOSchema - * @type { object } - * @property { string } portOfHamburgAccountNumber Hamburg port account number - * @property { string } iataAccountNumber IATA account number - * @property { string } regulatedAgentCode Regulated agent code - */ - export const UpdateCargoAgentDTOSchema = z - .object({ - portOfHamburgAccountNumber: z.string().describe("Hamburg port account number"), - iataAccountNumber: z.string().describe("IATA account number"), - regulatedAgentCode: z.string().describe("Regulated agent code"), - }) - .readonly(); - export type UpdateCargoAgentDTO = z.infer; - - /** - * CarrierResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Business partner identifier - * @property { string } scac SCAC code - * @property { string } iataAirlinePrefix IATA airline prefix - * @property { string } iataCode IATA code - * @property { string } registrationAddress Registration address - * @property { string } masterBlSuffix Master BL suffix - * @property { string } houseBlSuffix House BL suffix - * @property { string } airWaybillSuffix Air waybill suffix - * @property { string } cargoManifestSuffix Cargo manifest suffix - * @property { string } fundReportSuffix Fund report suffix - * @property { string } invoiceSuffix Invoice suffix - */ - export const CarrierResponseDTOSchema = z - .object({ - businessPartnerId: z.string().describe("Business partner identifier"), - scac: z.string().describe("SCAC code"), - iataAirlinePrefix: z.string().describe("IATA airline prefix"), - iataCode: z.string().describe("IATA code"), - registrationAddress: z.string().describe("Registration address"), - masterBlSuffix: z.string().describe("Master BL suffix"), - houseBlSuffix: z.string().describe("House BL suffix"), - airWaybillSuffix: z.string().describe("Air waybill suffix"), - cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), - fundReportSuffix: z.string().describe("Fund report suffix"), - invoiceSuffix: z.string().describe("Invoice suffix"), - }) - .readonly(); - export type CarrierResponseDTO = z.infer; - - /** - * UpdateCarrierDTOSchema - * @type { object } - * @property { string } scac SCAC code - * @property { string } iataAirlinePrefix IATA airline prefix - * @property { string } iataCode IATA code - * @property { string } registrationAddress Registration address - * @property { string } masterBlSuffix Master BL suffix - * @property { string } houseBlSuffix House BL suffix - * @property { string } airWaybillSuffix Air waybill suffix - * @property { string } cargoManifestSuffix Cargo manifest suffix - * @property { string } fundReportSuffix Fund report suffix - * @property { string } invoiceSuffix Invoice suffix - */ - export const UpdateCarrierDTOSchema = z - .object({ - scac: z.string().describe("SCAC code"), - iataAirlinePrefix: z.string().describe("IATA airline prefix"), - iataCode: z.string().describe("IATA code"), - registrationAddress: z.string().describe("Registration address"), - masterBlSuffix: z.string().describe("Master BL suffix"), - houseBlSuffix: z.string().describe("House BL suffix"), - airWaybillSuffix: z.string().describe("Air waybill suffix"), - cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), - fundReportSuffix: z.string().describe("Fund report suffix"), - invoiceSuffix: z.string().describe("Invoice suffix"), - }) - .readonly(); - export type UpdateCarrierDTO = z.infer; - - /** - * BusinessPartnersPaginateOrderParamEnumSchema - * @type { enum } - */ - export const BusinessPartnersPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "vat", - "shortName", - "address", - "locked", - "currency", - "archived", - ]); - export type BusinessPartnersPaginateOrderParamEnum = z.infer; - export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOrderParamEnumSchema.enum; - - /** - * BusinessPartnersPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BusinessPartnerListResponseDTO[] } items - */ - export const BusinessPartnersPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).readonly() }).readonly().shape, - }); - export type BusinessPartnersPaginateResponse = z.infer; - - /** - * BusinessPartnersPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const BusinessPartnersPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "vat", - "shortName", - "address", - "locked", - "currency", - "archived", - ]); - export type BusinessPartnersPaginateLabelsOrderParamEnum = z.infer< - typeof BusinessPartnersPaginateLabelsOrderParamEnumSchema - >; - export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPaginateLabelsOrderParamEnumSchema.enum; - - /** - * BusinessPartnersPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items - */ - export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type BusinessPartnersPaginateLabelsResponse = z.infer; - - /** - * GetRemarksResponseSchema - * @type { array } - */ - export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema).readonly(); - export type GetRemarksResponse = z.infer; +/** + * RemarkVisibilitySchema + * @type { enum } + */ +export const RemarkVisibilitySchema = z.enum(["internal", "popup"]); +export type RemarkVisibility = z.infer; +export const RemarkVisibility = RemarkVisibilitySchema.enum; + +/** + * RemarkTypeSchema + * @type { enum } + */ +export const RemarkTypeSchema = z.enum(["INFORMATIONAL", "WARNING"]); +export type RemarkType = z.infer; +export const RemarkType = RemarkTypeSchema.enum; + +/** + * BusinessPartnerRemarkResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the remark + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of the remark + */ +export const BusinessPartnerRemarkResponseDTOSchema = z.object({ id: z.string(), visibility: RemarkVisibilitySchema, content: z.string(), type: RemarkTypeSchema }); +export type BusinessPartnerRemarkResponseDTO = z.infer; + +/** + * BusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { string } city City name + * @property { string } isoCode Country code + */ +export const BusinessPartnerAddressDtoSchema = z.object({ street: z.string().nullable(), zip: z.string().nullable(), city: z.string().nullable(), isoCode: z.string().nullable() }).partial(); +export type BusinessPartnerAddressDto = z.infer; + +/** + * BusinessPartnerEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BusinessPartnerEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type BusinessPartnerEmployeeDTO = z.infer; + +/** + * BusinessPartnerListResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + * @property { string } matchCode Match code of the business partner + * @property { BusinessPartnerAddressDto } address Address information + * @property { CommonModels.BusinessPartnerType[] } types List of business partner types + * @property { boolean } archived Archive status + * @property { string } shortName Short name of the business partner + * @property { string } vat VAT number of the business partner + * @property { string } debtorId Debtor ID for the local currency + * @property { string } creditorId Creditor ID for the local currency + * @property { boolean } locked Whether the business partner is locked + * @property { string } currency Currency (invoice currency) + * @property { BusinessPartnerRemarkResponseDTO[] } remarks Remarks for the business partner + * @property { string } createdById ID of the employee who created this business partner + * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this business partner + * @property { string } createdAt Date when the business partner was created + * @property { string } updatedById ID of the employee who last updated this business partner + * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this business partner + * @property { string } updatedAt Date when the business partner was last updated + */ +export const BusinessPartnerListResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), address: BusinessPartnerAddressDtoSchema, types: z.array(CommonModels.BusinessPartnerTypeSchema), archived: z.boolean(), shortName: z.string().nullish(), vat: z.string().nullish(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), locked: z.boolean(), currency: z.string().nullish(), remarks: z.array(BusinessPartnerRemarkResponseDTOSchema), createdById: z.string().nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type BusinessPartnerListResponseDTO = z.infer; + +/** + * BusinessPartnerFilterDtoSchema + * @type { object } + * @property { string } search + * @property { CommonModels.BusinessPartnerType[] } types + * @property { string } shortName + * @property { string } name + * @property { string } vat + * @property { string } debtorId + * @property { string } creditorId + * @property { string } matchCode + * @property { boolean } archived Filter by archived status + */ +export const BusinessPartnerFilterDtoSchema = z.object({ search: z.string().nullable(), types: z.array(CommonModels.BusinessPartnerTypeSchema).nullable(), shortName: z.string().nullable(), name: z.string().nullable(), vat: z.string().nullable(), debtorId: z.string().nullable(), creditorId: z.string().nullable(), matchCode: z.string().nullable(), archived: z.boolean().nullable() }).partial(); +export type BusinessPartnerFilterDto = z.infer; + +/** + * BusinessPartnerPaginatedLabelResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } label Label of the business partner + * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types + */ +export const BusinessPartnerPaginatedLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema) }); +export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; + +/** + * BusinessPartnerLabelsFilterDtoSchema + * @type { object } + * @property { string } search + * @property { string[] } ids Business partner ids to filter by + * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types to filter by + * @property { boolean } archived Filter by archived status + */ +export const BusinessPartnerLabelsFilterDtoSchema = z.object({ search: z.string().nullable(), ids: z.array(z.string()).nullable(), types: z.array(CommonModels.BusinessPartnerTypeSchema).nullable(), archived: z.boolean().nullable() }).partial(); +export type BusinessPartnerLabelsFilterDto = z.infer; + +/** + * CreateBusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } district + * @property { string } countryId + */ +export const CreateBusinessPartnerAddressDtoSchema = z.object({ street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), district: z.string().nullable(), countryId: z.string().nullable() }).partial(); +export type CreateBusinessPartnerAddressDto = z.infer; + +/** + * CreateBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } name Full name of the business partner. Min Length: `3` + * @property { string } secondaryName Full name of the business partner. Min Length: `3` + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { string } matchCode Unique identifier code + * @property { string } shortName Short name for the business partner + * @property { CreateBusinessPartnerAddressDto } address Address information + */ +export const CreateBusinessPartnerRequestDTOSchema = z.object({ name: z.string().min(3), secondaryName: z.string().min(3).nullish(), types: z.array(CommonModels.BusinessPartnerTypeSchema), matchCode: z.string().nullish(), shortName: z.string().nullish(), address: CreateBusinessPartnerAddressDtoSchema.nullish() }); +export type CreateBusinessPartnerRequestDTO = z.infer; + +/** + * BusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { string } rootFolderId Root folder identifier associated with this business partner + */ +export const BusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema), rootFolderId: z.string().nullish() }); +export type BusinessPartnerResponseDTO = z.infer; + +/** + * BusinessPartnerLabelResponseDtoSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } name Name of the business partner + */ +export const BusinessPartnerLabelResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type BusinessPartnerLabelResponseDto = z.infer; + +/** + * ContactResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the contact + * @property { string } name Name of the contact + */ +export const ContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type ContactResponseDTO = z.infer; + +/** + * BusinessPartnerDetailResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the business partner + * @property { string } createdById ID of the employee who created this record + * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this record + * @property { string } createdAt Creation timestamp + * @property { string } updatedById ID of the employee who last updated this record + * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this record + * @property { string } updatedAt Last update timestamp + * @property { string } matchCode Match code of the business partner + * @property { string } shortName Short name + * @property { string } name Full name + * @property { string } secondaryName Secondary name + * @property { CommonModels.BusinessPartnerType[] } types List of business partner types + * @property { boolean } archived Archived status + * @property { CommonModels.BusinessPartnerAddressResponseDTO } address Main address information + * @property { CommonModels.BusinessPartnerAddressResponseDTO } blAddress BL address information + * @property { BusinessPartnerLabelResponseDto[] } similar Similar named business partners + * @property { boolean } locked + * @property { boolean } addressIsDifferentForBl + * @property { string } lockedById Unique identifier of the employee who locked the business partner + * @property { string } lockedByName + * @property { string } lockedAt Unique identifier of the employee who locked the business partner + * @property { ContactResponseDTO } belongsTo Parent business partner + * @property { ContactResponseDTO } salesRep Sales representative + * @property { ContactResponseDTO } operations Operations contact + */ +export const BusinessPartnerDetailResponseDTOSchema = z.object({ id: z.string(), createdById: z.string().nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), matchCode: z.string(), shortName: z.string(), name: z.string(), secondaryName: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema), archived: z.boolean(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema, blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema, similar: z.array(BusinessPartnerLabelResponseDtoSchema).nullish(), locked: z.boolean(), addressIsDifferentForBl: z.boolean(), lockedById: z.string().nullish(), lockedByName: z.string().nullish(), lockedAt: z.iso.datetime({ offset: true }).nullish(), belongsTo: ContactResponseDTOSchema, salesRep: ContactResponseDTOSchema, operations: ContactResponseDTOSchema }); +export type BusinessPartnerDetailResponseDTO = z.infer; + +/** + * UpdateBusinessPartnerAddressDtoSchema + * @type { object } + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } district + * @property { string } countryId + */ +export const UpdateBusinessPartnerAddressDtoSchema = z.object({ street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), district: z.string().nullable(), countryId: z.string().nullable() }).partial(); +export type UpdateBusinessPartnerAddressDto = z.infer; + +/** + * UpdateBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code + * @property { string } shortName Updated short name + * @property { string } name Updated full name + * @property { string } secondaryName Updated secondary name + * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner + * @property { UpdateBusinessPartnerAddressDto } address Address information + * @property { UpdateBusinessPartnerAddressDto } blAddress Bl address information + * @property { string } belongsToId Parent business partner + * @property { string } salesRepId Sales representative + * @property { string } operationsId Operations contact + * @property { boolean } addressIsDifferentForBl Different address for BL + */ +export const UpdateBusinessPartnerRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), name: z.string().nullable(), secondaryName: z.string().nullable(), types: z.array(CommonModels.BusinessPartnerTypeSchema).nullable(), address: UpdateBusinessPartnerAddressDtoSchema.nullable(), blAddress: UpdateBusinessPartnerAddressDtoSchema.nullable(), belongsToId: z.string().nullable(), salesRepId: z.string().nullable(), operationsId: z.string().nullable(), addressIsDifferentForBl: z.boolean().nullable() }).partial(); +export type UpdateBusinessPartnerRequestDTO = z.infer; + +/** + * CreateBusinessPartnerRemarkRequestDTOSchema + * @type { object } + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of remark + */ +export const CreateBusinessPartnerRemarkRequestDTOSchema = z.object({ visibility: RemarkVisibilitySchema, content: z.string(), type: RemarkTypeSchema }); +export type CreateBusinessPartnerRemarkRequestDTO = z.infer; + +/** + * UpdateBusinessPartnerRemarkRequestDtoSchema + * @type { object } + * @property { RemarkVisibility } visibility Visibility level of the remark + * @property { string } content Content of the remark + * @property { RemarkType } type Type of remark + */ +export const UpdateBusinessPartnerRemarkRequestDtoSchema = z.object({ visibility: RemarkVisibilitySchema.nullable(), content: z.string().nullable(), type: RemarkTypeSchema.nullable() }).partial(); +export type UpdateBusinessPartnerRemarkRequestDto = z.infer; + +/** + * AccountTypeEnumSchema + * @type { enum } + */ +export const AccountTypeEnumSchema = z.enum(["Direct Account", "Logistic Provider / Forwarder", "4PL/NVOCC", "LLP", "Carrier", "Service Provider (other)", "Strategic", "Key Account", "Transactional", "Agent", "Other"]); +export type AccountTypeEnum = z.infer; +export const AccountTypeEnum = AccountTypeEnumSchema.enum; + +/** + * BusinessPartnerAuthorizationSchema + * @type { enum } + */ +export const BusinessPartnerAuthorizationSchema = z.enum(["requiresApproval", "blocked", "regularBusinessPartner"]); +export type BusinessPartnerAuthorization = z.infer; +export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.enum; + +/** + * BusinessPartnerPaymentTermsResponseDtoSchema + * @type { object } + * @property { string } relativeTo + * @property { number } days Minimum: `0` + */ +export const BusinessPartnerPaymentTermsResponseDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }); +export type BusinessPartnerPaymentTermsResponseDto = z.infer; + +/** + * BusinessPartnerBankAccountResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BusinessPartnerBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type BusinessPartnerBankAccountResponseDto = z.infer; + +/** + * PartnerNetworkInfoDtoSchema + * @type { object } + * @property { string } id Partner network ID + * @property { string } name Partner network name + */ +export const PartnerNetworkInfoDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type PartnerNetworkInfoDto = z.infer; + +/** + * BusinessPartnerBasicResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Reference to the business partner + * @property { string[] } relationship List of relationships + * @property { AccountTypeEnum } accountType + * @property { string } vat VAT number + * @property { string } legacySystemId Legacy system (move) id + * @property { string } registrationNumber + * @property { string } eori EORI number + * @property { BusinessPartnerAuthorization } authorization Authorization status + * @property { number } creditLimit Credit limit + * @property { string } invoiceLanguage Invoice language + * @property { string } invoiceCurrency Invoice currency + * @property { string } iban IBAN + * @property { string } bankNumber Bank number + * @property { string } bankAccountNumber Bank account number + * @property { BusinessPartnerPaymentTermsResponseDto } termsExport + * @property { BusinessPartnerPaymentTermsResponseDto } termsImport + * @property { CommonModels.EditorContentResponseDto } notes Notes + * @property { string } bankAccountId + * @property { BusinessPartnerBankAccountResponseDto } bankAccount + * @property { PartnerNetworkInfoDto[] } partnerNetworks Partner networks + * @property { string } dunningSystemId + * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem + * @property { string } hblIssuerSigner HBL issuer/signer prefill + * @property { string } signatureFileAttachmentId Signature file attachment ID + * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment + */ +export const BusinessPartnerBasicResponseDTOSchema = z.object({ businessPartnerId: z.string(), relationship: z.array(z.string()), accountType: AccountTypeEnumSchema.nullish(), vat: z.string(), legacySystemId: z.string().nullish(), registrationNumber: z.string().nullish(), eori: z.string(), authorization: BusinessPartnerAuthorizationSchema.nullable(), creditLimit: z.number(), invoiceLanguage: z.string(), invoiceCurrency: z.string(), iban: z.string(), bankNumber: z.string(), bankAccountNumber: z.string(), termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, notes: CommonModels.EditorContentResponseDtoSchema.nullish(), bankAccountId: z.string().nullish(), bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), partnerNetworks: z.array(PartnerNetworkInfoDtoSchema), dunningSystemId: z.string().nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), hblIssuerSigner: z.string(), signatureFileAttachmentId: z.string(), signatureFileAttachmentUrl: z.string().nullish() }); +export type BusinessPartnerBasicResponseDTO = z.infer; + +/** + * UpdateBusinessPartnerPaymentTermsDtoSchema + * @type { object } + * @property { string } relativeTo + * @property { number } days Minimum: `0` + */ +export const UpdateBusinessPartnerPaymentTermsDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema.nullable(), days: z.number().gte(0).nullable() }).partial(); +export type UpdateBusinessPartnerPaymentTermsDto = z.infer; + +/** + * UpdateBusinessPartnerBasicRequestDTOSchema + * @type { object } + * @property { string[] } relationship Updated relationships + * @property { string } vat Updated VAT number + * @property { string } eori Updated EORI number + * @property { AccountTypeEnum } accountType + * @property { BusinessPartnerAuthorization } authorization Updated authorization status + * @property { number } creditLimit Updated credit limit + * @property { string } invoiceLanguage Invoice language + * @property { string } invoiceCurrency Invoice currency + * @property { string } iban IBAN + * @property { string } bankNumber Bank number + * @property { string } bankAccountNumber Bank account number + * @property { string } legacySystemId Legacy system (move) id + * @property { string } registrationNumber + * @property { UpdateBusinessPartnerPaymentTermsDto } termsExport + * @property { UpdateBusinessPartnerPaymentTermsDto } termsImport + * @property { CommonModels.EditorContentUpdateDto } notes Notes + * @property { string } bankAccountId + * @property { string[] } partnerNetworkIds Partner network IDs + * @property { string } dunningSystemId Dunning system ID + * @property { string } hblIssuerSigner HBL issuer/signer prefill + * @property { string } signatureFileAttachmentId Signature file attachment ID + */ +export const UpdateBusinessPartnerBasicRequestDTOSchema = z.object({ relationship: z.array(z.string()).nullable(), vat: z.string().nullable(), eori: z.string().nullable(), accountType: AccountTypeEnumSchema.nullable(), authorization: BusinessPartnerAuthorizationSchema.nullable(), creditLimit: z.number().nullable(), invoiceLanguage: z.string().nullable(), invoiceCurrency: z.string().nullable(), iban: z.string().nullable(), bankNumber: z.string().nullable(), bankAccountNumber: z.string().nullable(), legacySystemId: z.string().nullable(), registrationNumber: z.string().nullable(), termsExport: UpdateBusinessPartnerPaymentTermsDtoSchema.nullable(), termsImport: UpdateBusinessPartnerPaymentTermsDtoSchema.nullable(), notes: CommonModels.EditorContentUpdateDtoSchema.nullable(), bankAccountId: z.string().nullable(), partnerNetworkIds: z.array(z.string()).nullable(), dunningSystemId: z.string().nullable(), hblIssuerSigner: z.string().nullable(), signatureFileAttachmentId: z.string().nullable() }).partial(); +export type UpdateBusinessPartnerBasicRequestDTO = z.infer; + +/** + * BusinessPartnerSignatureUploadRequestDTOSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType Mime type + * @property { number } fileSize File size in bytes. Minimum: `1` + */ +export const BusinessPartnerSignatureUploadRequestDTOSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number().gte(1) }); +export type BusinessPartnerSignatureUploadRequestDTO = z.infer; + +/** + * BusinessPartnerSignatureUploadResponseDTOSchema + * @type { object } + * @property { string } mediaId Media ID for the uploaded signature + * @property { string } method HTTP method to use for upload + * @property { string } url URL to upload the file to + */ +export const BusinessPartnerSignatureUploadResponseDTOSchema = z.object({ mediaId: z.string(), method: z.string(), url: z.string() }); +export type BusinessPartnerSignatureUploadResponseDTO = z.infer; + +/** + * CargoAgentResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Business partner identifier + * @property { string } portOfHamburgAccountNumber Port of Hamburg account number + * @property { string } iataAccountNumber IATA account number + * @property { string } regulatedAgentCode Regulated agent code + */ +export const CargoAgentResponseDTOSchema = z.object({ businessPartnerId: z.string(), portOfHamburgAccountNumber: z.string(), iataAccountNumber: z.string(), regulatedAgentCode: z.string() }); +export type CargoAgentResponseDTO = z.infer; + +/** + * UpdateCargoAgentDTOSchema + * @type { object } + * @property { string } portOfHamburgAccountNumber Hamburg port account number + * @property { string } iataAccountNumber IATA account number + * @property { string } regulatedAgentCode Regulated agent code + */ +export const UpdateCargoAgentDTOSchema = z.object({ portOfHamburgAccountNumber: z.string().nullable(), iataAccountNumber: z.string().nullable(), regulatedAgentCode: z.string().nullable() }).partial(); +export type UpdateCargoAgentDTO = z.infer; + +/** + * CarrierResponseDTOSchema + * @type { object } + * @property { string } businessPartnerId Business partner identifier + * @property { string } scac SCAC code + * @property { string } iataAirlinePrefix IATA airline prefix + * @property { string } iataCode IATA code + * @property { string } registrationAddress Registration address + * @property { string } masterBlSuffix Master BL suffix + * @property { string } houseBlSuffix House BL suffix + * @property { string } airWaybillSuffix Air waybill suffix + * @property { string } cargoManifestSuffix Cargo manifest suffix + * @property { string } fundReportSuffix Fund report suffix + * @property { string } invoiceSuffix Invoice suffix + */ +export const CarrierResponseDTOSchema = z.object({ businessPartnerId: z.string(), scac: z.string(), iataAirlinePrefix: z.string(), iataCode: z.string(), registrationAddress: z.string(), masterBlSuffix: z.string(), houseBlSuffix: z.string(), airWaybillSuffix: z.string(), cargoManifestSuffix: z.string(), fundReportSuffix: z.string(), invoiceSuffix: z.string() }); +export type CarrierResponseDTO = z.infer; + +/** + * UpdateCarrierDTOSchema + * @type { object } + * @property { string } scac SCAC code + * @property { string } iataAirlinePrefix IATA airline prefix + * @property { string } iataCode IATA code + * @property { string } registrationAddress Registration address + * @property { string } masterBlSuffix Master BL suffix + * @property { string } houseBlSuffix House BL suffix + * @property { string } airWaybillSuffix Air waybill suffix + * @property { string } cargoManifestSuffix Cargo manifest suffix + * @property { string } fundReportSuffix Fund report suffix + * @property { string } invoiceSuffix Invoice suffix + */ +export const UpdateCarrierDTOSchema = z.object({ scac: z.string().nullable(), iataAirlinePrefix: z.string().nullable(), iataCode: z.string().nullable(), registrationAddress: z.string().nullable(), masterBlSuffix: z.string().nullable(), houseBlSuffix: z.string().nullable(), airWaybillSuffix: z.string().nullable(), cargoManifestSuffix: z.string().nullable(), fundReportSuffix: z.string().nullable(), invoiceSuffix: z.string().nullable() }).partial(); +export type UpdateCarrierDTO = z.infer; + +/** + * BusinessPartnersPaginateOrderParamEnumSchema + * @type { enum } + */ +export const BusinessPartnersPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); +export type BusinessPartnersPaginateOrderParamEnum = z.infer; +export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOrderParamEnumSchema.enum; + +/** + * BusinessPartnersPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BusinessPartnerListResponseDTO[] } items + */ +export const BusinessPartnersPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).nullable() }).partial().shape }); +export type BusinessPartnersPaginateResponse = z.infer; + +/** + * BusinessPartnersPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const BusinessPartnersPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); +export type BusinessPartnersPaginateLabelsOrderParamEnum = z.infer; +export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPaginateLabelsOrderParamEnumSchema.enum; + +/** + * BusinessPartnersPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items + */ +export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).nullable() }).partial().shape }); +export type BusinessPartnersPaginateLabelsResponse = z.infer; + +/** + * GetRemarksResponseSchema + * @type { array } + */ +export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema); +export type GetRemarksResponse = z.infer; + } diff --git a/test/generated/base/businessPartners/businessPartners.queries.ts b/test/generated/base/businessPartners/businessPartners.queries.ts index 330f8f0..3050547 100644 --- a/test/generated/base/businessPartners/businessPartners.queries.ts +++ b/test/generated/base/businessPartners/businessPartners.queries.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,887 +9,634 @@ import { BusinessPartnersModels } from "./businessPartners.models"; import { BusinessPartnersApi } from "./businessPartners.api"; export namespace BusinessPartnersQueries { - export const moduleName = QueryModule.BusinessPartners; +export const moduleName = QueryModule.BusinessPartners; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/business-partners", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/business-partners", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/business-partners/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/business-partners/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - getById: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/business-partners/:id", officeId, id] as const, - getRemarks: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/business-partners/:id/remarks", officeId, id] as const, - getBasicInfo: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/business-partners/:id/basic", officeId, id] as const, - getCargoAgentInfo: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/business-partners/:id/cargo-agent", officeId, id] as const, - getCarrierInformation: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/business-partners/:id/carrier", officeId, id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate business partners - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BusinessPartnersModels.BusinessPartnerFilterDto; - page?: number; - cursor?: string; + paginate: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + getById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id", officeId, id] as const, + getRemarks: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/remarks", officeId, id] as const, + getBasicInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/basic", officeId, id] as const, + getCargoAgentInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/cargo-agent", officeId, id] as const, + getCarrierInformation: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/carrier", officeId, id] as const, +}; + +/** + * Query `usePaginate` + * @summary Paginate business partners + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); + return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate business partners + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); + return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId })); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate business partners - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BusinessPartnersModels.BusinessPartnerFilterDto; - cursor?: string; + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create business partner + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { BusinessPartnersModels.CreateBusinessPartnerRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(BusinessPartnersAcl.canUseCreate({ officeId } )); + return BusinessPartnersApi.create(officeId, data) }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId })); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create business partner - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { BusinessPartnersModels.CreateBusinessPartnerRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.create, - { officeId: string; data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(BusinessPartnersAcl.canUseCreate({ officeId })); - return BusinessPartnersApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateLabels` - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto; - page?: number; - cursor?: string; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId })); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto; - cursor?: string; + }); +}; + +/** + * Query `usePaginateLabels` + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` + * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId })); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useGetById` - * @summary Get business partner by ID - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetById = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetById({ officeId })); - return BusinessPartnersApi.getById(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update business partner - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.update, - { officeId: string; id: string; data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId })); - return BusinessPartnersApi.update(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive business partner - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseArchive({ officeId })); - return BusinessPartnersApi.archive(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive business partner - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId })); - return BusinessPartnersApi.unarchive(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useLock` - * @summary Lock business partner - * @permission Requires `canUseLock` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useLock = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseLock({ officeId })); - return BusinessPartnersApi.lock(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnlock` - * @summary Unlock business partner - * @permission Requires `canUseUnlock` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnlock = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId })); - return BusinessPartnersApi.unlock(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetRemarks` - * @summary Get business partner remarks - * @permission Requires `canUseGetRemarks` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetRemarks = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getRemarks(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId })); - return BusinessPartnersApi.getRemarks(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreateRemark` - * @summary Create business partner remark - * @permission Requires `canUseCreateRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateRemark = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.createRemark, - { officeId: string; id: string; data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId })); - return BusinessPartnersApi.createRemark(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateRemark` - * @permission Requires `canUseUpdateRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { string } mutation.remarkId Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateRemark = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.updateRemark, - { - officeId: string; - id: string; - remarkId: string; - data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, remarkId, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId })); - return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteRemark` - * @summary Delete business partner remark - * @permission Requires `canUseDeleteRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { string } mutation.remarkId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteRemark = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.deleteRemark, - { officeId: string; id: string; remarkId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, remarkId }) => { - checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId })); - return BusinessPartnersApi.deleteRemark(officeId, id, remarkId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetBasicInfo` - * @summary Get business partner basic info - * @permission Requires `canUseGetBasicInfo` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetBasicInfo = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBasicInfo(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId })); - return BusinessPartnersApi.getBasicInfo(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateBasicInfo` - * @summary Update business partner basic info - * @permission Requires `canUseUpdateBasicInfo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBasicInfo = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.updateBasicInfo, - { officeId: string; id: string; data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId })); - return BusinessPartnersApi.updateBasicInfo(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getBasicInfo(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCreateSignatureUploadInstructions` - * @summary Create upload instructions for business partner signature - * @permission Requires `canUseCreateSignatureUploadInstructions` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateSignatureUploadInstructions = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.createSignatureUploadInstructions, - { - officeId: string; - id: string; - data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { - checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId })); - const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions( - officeId, - id, - data, - config, - ); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } + ...options, + }); +}; + +/** + * Query `useGetById` + * @summary Get business partner by ID + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetById({ officeId } )); + return BusinessPartnersApi.getById(officeId, id) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update business partner + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId } )); + return BusinessPartnersApi.update(officeId, id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive business partner + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseArchive({ officeId } )); + return BusinessPartnersApi.archive(officeId, id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive business partner + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId } )); + return BusinessPartnersApi.unarchive(officeId, id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useLock` + * @summary Lock business partner + * @permission Requires `canUseLock` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useLock = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseLock({ officeId } )); + return BusinessPartnersApi.lock(officeId, id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnlock` + * @summary Unlock business partner + * @permission Requires `canUseUnlock` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnlock = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId } )); + return BusinessPartnersApi.unlock(officeId, id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetRemarks` + * @summary Get business partner remarks + * @permission Requires `canUseGetRemarks` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetRemarks = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getRemarks(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId } )); + return BusinessPartnersApi.getRemarks(officeId, id) }, + ...options, + }); +}; + +/** + * Mutation `useCreateRemark` + * @summary Create business partner remark + * @permission Requires `canUseCreateRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId } )); + return BusinessPartnersApi.createRemark(officeId, id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateRemark` + * @permission Requires `canUseUpdateRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { string } mutation.remarkId Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, remarkId, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId } )); + return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRemark` + * @summary Delete business partner remark + * @permission Requires `canUseDeleteRemark` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { string } mutation.remarkId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, remarkId }) => { + checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId } )); + return BusinessPartnersApi.deleteRemark(officeId, id, remarkId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetBasicInfo` + * @summary Get business partner basic info + * @permission Requires `canUseGetBasicInfo` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBasicInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBasicInfo(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId } )); + return BusinessPartnersApi.getBasicInfo(officeId, id) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateBasicInfo` + * @summary Update business partner basic info + * @permission Requires `canUseUpdateBasicInfo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBasicInfo = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId } )); + return BusinessPartnersApi.updateBasicInfo(officeId, id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getBasicInfo(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateSignatureUploadInstructions` + * @summary Create upload instructions for business partner signature + * @permission Requires `canUseCreateSignatureUploadInstructions` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateSignatureUploadInstructions = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { + checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId } )); + const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions(officeId, id, data); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); } - dataToSend.append("file", file); } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); + dataToSend.append("file", file); } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetCargoAgentInfo` + * @summary Get cargo agent information for business partner + * @permission Requires `canUseGetCargoAgentInfo` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoAgentInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoAgentInfo(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId } )); + return BusinessPartnersApi.getCargoAgentInfo(officeId, id) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCargoAgent` + * @summary Update cargo agent information for business partner + * @permission Requires `canUseUpdateCargoAgent` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateCargoAgentDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCargoAgent = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId } )); + return BusinessPartnersApi.updateCargoAgent(officeId, id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getCargoAgentInfo(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetCarrierInformation` + * @summary Get carrier information for business partner + * @permission Requires `canUseGetCarrierInformation` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCarrierInformation = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCarrierInformation(officeId, id), + queryFn: () => { + checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId } )); + return BusinessPartnersApi.getCarrierInformation(officeId, id) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCarrier` + * @summary Update carrier information for business partner + * @permission Requires `canUseUpdateCarrier` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { BusinessPartnersModels.UpdateCarrierDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCarrier = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId } )); + return BusinessPartnersApi.updateCarrier(officeId, id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.getCarrierInformation(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetCargoAgentInfo` - * @summary Get cargo agent information for business partner - * @permission Requires `canUseGetCargoAgentInfo` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCargoAgentInfo = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoAgentInfo(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId })); - return BusinessPartnersApi.getCargoAgentInfo(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateCargoAgent` - * @summary Update cargo agent information for business partner - * @permission Requires `canUseUpdateCargoAgent` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateCargoAgentDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCargoAgent = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.updateCargoAgent, - { officeId: string; id: string; data: BusinessPartnersModels.UpdateCargoAgentDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId })); - return BusinessPartnersApi.updateCargoAgent(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getCargoAgentInfo(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetCarrierInformation` - * @summary Get carrier information for business partner - * @permission Requires `canUseGetCarrierInformation` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCarrierInformation = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCarrierInformation(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId })); - return BusinessPartnersApi.getCarrierInformation(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateCarrier` - * @summary Update carrier information for business partner - * @permission Requires `canUseUpdateCarrier` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateCarrierDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCarrier = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.updateCarrier, - { officeId: string; id: string; data: BusinessPartnersModels.UpdateCarrierDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId })); - return BusinessPartnersApi.updateCarrier(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getCarrierInformation(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/cargoTypes/cargoTypes.acl.ts b/test/generated/base/cargoTypes/cargoTypes.acl.ts index 342fe0d..404b05b 100644 --- a/test/generated/base/cargoTypes/cargoTypes.acl.ts +++ b/test/generated/base/cargoTypes/cargoTypes.acl.ts @@ -1,45 +1,74 @@ import { AbilityTuple } from "@casl/ability"; export namespace CargoTypesAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "CargoType"] as AbilityTuple<"Create", "CargoType">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "CargoType"] as AbilityTuple<"Update", "CargoType">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "CargoType"] as AbilityTuple<"Archive", "CargoType">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "CargoType"] as AbilityTuple<"Archive", "CargoType">; +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "CargoType" +] as AbilityTuple<"Read", "CargoType">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "CargoType" +] as AbilityTuple<"Create", "CargoType">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "CargoType" +] as AbilityTuple<"Read", "CargoType">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "CargoType" +] as AbilityTuple<"Read", "CargoType">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "CargoType" +] as AbilityTuple<"Update", "CargoType">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "CargoType" +] as AbilityTuple<"Archive", "CargoType">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "CargoType" +] as AbilityTuple<"Archive", "CargoType">; + } diff --git a/test/generated/base/cargoTypes/cargoTypes.api.ts b/test/generated/base/cargoTypes/cargoTypes.api.ts index 1cb0076..48493ea 100644 --- a/test/generated/base/cargoTypes/cargoTypes.api.ts +++ b/test/generated/base/cargoTypes/cargoTypes.api.ts @@ -1,123 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CargoTypesModels } from "./cargoTypes.models"; export namespace CargoTypesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: CargoTypesModels.CargoTypePaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, `/cargo-types`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, + `/cargo-types`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, ) => { return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types`, - ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), - config, - ); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: CargoTypesModels.CargoTypeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types`, + ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), + + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, - `/cargo-types/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, `/cargo-types/${id}`, config); - }; - - export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, + `/cargo-types/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, ) => { + return AppRestClient.get( + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}`, + + ) +}; +export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, ) => { return AppRestClient.patch( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}`, - ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}`, + ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, ) => { return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, + `/cargo-types/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/cargoTypes/cargoTypes.configs.ts b/test/generated/base/cargoTypes/cargoTypes.configs.ts index c2d613d..5d2769f 100644 --- a/test/generated/base/cargoTypes/cargoTypes.configs.ts +++ b/test/generated/base/cargoTypes/cargoTypes.configs.ts @@ -6,136 +6,137 @@ import { CargoTypesQueries } from "./cargoTypes.queries"; import { CargoTypesAcl } from "./cargoTypes.acl"; export namespace CargoTypesConfigs { - export const cargoTypesConfig = { +export const cargoTypesConfig = { meta: { - title: "Cargo Types", + title: "Cargo Types", }, readAll: { - acl: CargoTypesAcl.canUsePaginate, - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - paginated: CargoTypesQueries.usePaginate, - infinite: CargoTypesQueries.usePaginateInfinite, - filters: { - schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, - options: { - inputs: { - module: true, - archived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: CargoTypesAcl.canUsePaginate, schema: CargoTypesModels.CargoTypeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - shortName: true, - length: true, - width: true, - height: true, - unit: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - modules: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema, + paginated: CargoTypesQueries.usePaginate, + infinite: CargoTypesQueries.usePaginateInfinite, + filters: { + schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, + options: { + inputs: { + module: true, + archived: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + shortName: true, + length: true, + width: true, + height: true, + unit: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + modules: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: CargoTypesAcl.canUseFindById, - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - query: CargoTypesQueries.useFindById, + acl: CargoTypesAcl.canUseFindById, + schema: CargoTypesModels.CargoTypeResponseDTOSchema, + query: CargoTypesQueries.useFindById, }, create: { - acl: CargoTypesAcl.canUseCreate, - schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, - mutation: CargoTypesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: CargoTypesAcl.canUseCreate, schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - length: true, - width: true, - height: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - unit: true, - modules: true, - }, - }, - }), + mutation: CargoTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + length: true, + width: true, + height: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + unit: true, + modules: true, + }, + }, +}) }, update: { - acl: CargoTypesAcl.canUseUpdate, - schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, - mutation: CargoTypesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: CargoTypesAcl.canUseUpdate, schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - length: true, - width: true, - height: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - unit: true, - modules: true, - }, - }, - }), + mutation: CargoTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + length: true, + width: true, + height: true, + emptyWeight: true, + containerIsoCode: true, + isContainer: true, + unit: true, + modules: true, + }, + }, +}) }, - }; +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: CargoTypesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CargoTypesQueries.usePaginateLabels, - infinite: CargoTypesQueries.usePaginateLabelsInfinite, - filters: { - schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: CargoTypesAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema, + paginated: CargoTypesQueries.usePaginateLabels, + infinite: CargoTypesQueries.usePaginateLabelsInfinite, + filters: { + schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/cargoTypes/cargoTypes.models.ts b/test/generated/base/cargoTypes/cargoTypes.models.ts index bf04326..660798b 100644 --- a/test/generated/base/cargoTypes/cargoTypes.models.ts +++ b/test/generated/base/cargoTypes/cargoTypes.models.ts @@ -2,223 +2,140 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace CargoTypesModels { - /** - * CargoTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CargoTypeEmployeeDTO = z.infer; +/** + * CargoTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type CargoTypeEmployeeDTO = z.infer; - /** - * CargoTypeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the cargo type - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { string } unit Measurement unit for dimensions - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type - * @property { boolean } archived Indicates if the cargo type is archived - * @property { string } createdById - * @property { CargoTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CargoTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const CargoTypeResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier for the cargo type"), - name: z.string().describe("Name of the cargo type"), - shortName: z.string().describe("Short name of the cargo type").nullish(), - length: z.number().describe("Length of the cargo type").nullish(), - width: z.number().describe("Width of the cargo type").nullish(), - height: z.number().describe("Height of the cargo type").nullish(), - unit: z.string().describe("Measurement unit for dimensions"), - emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), - containerIsoCode: z.string().describe("Container ISO code").nullish(), - isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), - modules: z - .array(CommonModels.TransportModeEnumSchema) - .readonly() - .describe("Transport modules applicable to the cargo type"), - archived: z.boolean().describe("Indicates if the cargo type is archived"), - createdById: z.string().nullish(), - createdBy: CargoTypeEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: CargoTypeEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type CargoTypeResponseDTO = z.infer; +/** + * CargoTypeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the cargo type + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { string } unit Measurement unit for dimensions + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type + * @property { boolean } archived Indicates if the cargo type is archived + * @property { string } createdById + * @property { CargoTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CargoTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const CargoTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), shortName: z.string().nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), unit: z.string(), emptyWeight: z.number().nullish(), containerIsoCode: z.string().nullish(), isContainer: z.boolean().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), archived: z.boolean(), createdById: z.string().nullish(), createdBy: CargoTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CargoTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type CargoTypeResponseDTO = z.infer; - /** - * TransportModuleEnumSchema - * @type { enum } - */ - export const TransportModuleEnumSchema = z.enum(["Air", "Sea", "Road"]); - export type TransportModuleEnum = z.infer; - export const TransportModuleEnum = TransportModuleEnumSchema.enum; +/** + * TransportModuleEnumSchema + * @type { enum } + */ +export const TransportModuleEnumSchema = z.enum(["Air", "Sea", "Road"]); +export type TransportModuleEnum = z.infer; +export const TransportModuleEnum = TransportModuleEnumSchema.enum; - /** - * CargoTypePaginationFilterDtoSchema - * @type { object } - * @property { TransportModuleEnum } module - * @property { boolean } archived Archived status filter - * @property { string } search - */ - export const CargoTypePaginationFilterDtoSchema = z - .object({ - module: TransportModuleEnumSchema, - archived: z.boolean().describe("Archived status filter"), - search: z.string(), - }) - .readonly(); - export type CargoTypePaginationFilterDto = z.infer; +/** + * CargoTypePaginationFilterDtoSchema + * @type { object } + * @property { TransportModuleEnum } module + * @property { boolean } archived Archived status filter + * @property { string } search + */ +export const CargoTypePaginationFilterDtoSchema = z.object({ module: TransportModuleEnumSchema.nullable(), archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); +export type CargoTypePaginationFilterDto = z.infer; - /** - * CreateCargoTypeRequestDTOSchema - * @type { object } - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { string } unit Measurement unit for dimensions - * @property { CommonModels.TransportModeEnum[] } modules Transport modes applicable to the cargo type - */ - export const CreateCargoTypeRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the cargo type"), - shortName: z.string().describe("Short name of the cargo type").nullish(), - length: z.number().describe("Length of the cargo type").nullish(), - width: z.number().describe("Width of the cargo type").nullish(), - height: z.number().describe("Height of the cargo type").nullish(), - emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), - containerIsoCode: z.string().describe("Container ISO code").nullish(), - isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), - unit: z.string().describe("Measurement unit for dimensions"), - modules: z - .array(CommonModels.TransportModeEnumSchema) - .readonly() - .describe("Transport modes applicable to the cargo type"), - }) - .readonly(); - export type CreateCargoTypeRequestDTO = z.infer; +/** + * CreateCargoTypeRequestDTOSchema + * @type { object } + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { string } unit Measurement unit for dimensions + * @property { CommonModels.TransportModeEnum[] } modules Transport modes applicable to the cargo type + */ +export const CreateCargoTypeRequestDTOSchema = z.object({ name: z.string(), shortName: z.string().nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), emptyWeight: z.number().nullish(), containerIsoCode: z.string().nullish(), isContainer: z.boolean().nullish(), unit: z.string(), modules: z.array(CommonModels.TransportModeEnumSchema) }); +export type CreateCargoTypeRequestDTO = z.infer; - /** - * UpdateCargoTypeRequestDTOSchema - * @type { object } - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { string } unit Measurement unit for dimensions - * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type - */ - export const UpdateCargoTypeRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the cargo type"), - shortName: z.string().describe("Short name of the cargo type"), - length: z.number().describe("Length of the cargo type").nullable(), - width: z.number().describe("Width of the cargo type").nullable(), - height: z.number().describe("Height of the cargo type").nullable(), - emptyWeight: z.number().describe("Empty weight of the cargo container").nullable(), - containerIsoCode: z.string().describe("Container ISO code").nullable(), - isContainer: z.boolean().describe("Whether this cargo type is a container").nullable(), - unit: z.string().describe("Measurement unit for dimensions"), - modules: z - .array(CommonModels.TransportModeEnumSchema) - .readonly() - .describe("Transport modules applicable to the cargo type"), - }) - .readonly(); - export type UpdateCargoTypeRequestDTO = z.infer; +/** + * UpdateCargoTypeRequestDTOSchema + * @type { object } + * @property { string } name Name of the cargo type + * @property { string } shortName Short name of the cargo type + * @property { number } length Length of the cargo type + * @property { number } width Width of the cargo type + * @property { number } height Height of the cargo type + * @property { number } emptyWeight Empty weight of the cargo container + * @property { string } containerIsoCode Container ISO code + * @property { boolean } isContainer Whether this cargo type is a container + * @property { string } unit Measurement unit for dimensions + * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type + */ +export const UpdateCargoTypeRequestDTOSchema = z.object({ name: z.string().nullable(), shortName: z.string().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), emptyWeight: z.number().nullable(), containerIsoCode: z.string().nullable(), isContainer: z.boolean().nullable(), unit: z.string().nullable(), modules: z.array(CommonModels.TransportModeEnumSchema).nullable() }).partial(); +export type UpdateCargoTypeRequestDTO = z.infer; - /** - * CargoTypeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const CargoTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type CargoTypeLabelFilterDto = z.infer; +/** + * CargoTypeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const CargoTypeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type CargoTypeLabelFilterDto = z.infer; - /** - * CargoTypesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const CargoTypesPaginateOrderParamEnumSchema = z.enum([ - "matchcode", - "description", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "name", - ]); - export type CargoTypesPaginateOrderParamEnum = z.infer; - export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnumSchema.enum; +/** + * CargoTypesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const CargoTypesPaginateOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type CargoTypesPaginateOrderParamEnum = z.infer; +export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnumSchema.enum; - /** - * CargoTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CargoTypeResponseDTO[] } items - */ - export const CargoTypesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CargoTypeResponseDTOSchema).readonly() }).readonly().shape, - }); - export type CargoTypesPaginateResponse = z.infer; +/** + * CargoTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CargoTypeResponseDTO[] } items + */ +export const CargoTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CargoTypeResponseDTOSchema).nullable() }).partial().shape }); +export type CargoTypesPaginateResponse = z.infer; - /** - * CargoTypesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const CargoTypesPaginateLabelsOrderParamEnumSchema = z.enum([ - "matchcode", - "description", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "name", - ]); - export type CargoTypesPaginateLabelsOrderParamEnum = z.infer; - export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOrderParamEnumSchema.enum; +/** + * CargoTypesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const CargoTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type CargoTypesPaginateLabelsOrderParamEnum = z.infer; +export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * CargoTypesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const CargoTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type CargoTypesPaginateLabelsResponse = z.infer; - /** - * CargoTypesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const CargoTypesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type CargoTypesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/cargoTypes/cargoTypes.queries.ts b/test/generated/base/cargoTypes/cargoTypes.queries.ts index 483b369..f0d98ae 100644 --- a/test/generated/base/cargoTypes/cargoTypes.queries.ts +++ b/test/generated/base/cargoTypes/cargoTypes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,354 +8,257 @@ import { CargoTypesModels } from "./cargoTypes.models"; import { CargoTypesApi } from "./cargoTypes.api"; export namespace CargoTypesQueries { - export const moduleName = QueryModule.CargoTypes; +export const moduleName = QueryModule.CargoTypes; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: CargoTypesModels.CargoTypePaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/cargo-types", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: CargoTypesModels.CargoTypePaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/cargo-types", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: CargoTypesModels.CargoTypeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/cargo-types/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: CargoTypesModels.CargoTypeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/cargo-types/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string) => [...keys.all, "/cargo-types", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/cargo-types/:id", id] as const, - }; +}; - /** - * Query `usePaginate` - * @summary Paginate Cargo Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CargoTypesModels.CargoTypePaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Cargo Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CargoTypesModels.CargoTypePaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginate` + * @summary Paginate Cargo Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CargoTypesAcl.canUsePaginate()); + return CargoTypesApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Cargo Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Mutation `useCreate` - * @summary Create Cargo Type - * @permission Requires `canUseCreate` ability - * @param { CargoTypesModels.CreateCargoTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CargoTypesAcl.canUsePaginate()); + return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CargoTypesAcl.canUseCreate()); - return CargoTypesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useCreate` + * @summary Create Cargo Type + * @permission Requires `canUseCreate` ability + * @param { CargoTypesModels.CreateCargoTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `usePaginateLabels` - * @summary Paginate cargo types with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CargoTypesModels.CargoTypeLabelFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CargoTypesAcl.canUseCreate()); + return CargoTypesApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate cargo types with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CargoTypesAcl.canUsePaginateLabels()); + return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate cargo types with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CargoTypesModels.CargoTypeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate cargo types with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` + * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CargoTypesAcl.canUsePaginateLabels()); + return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useFindById` - * @summary Get Cargo Type by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get Cargo Type by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(CargoTypesAcl.canUseFindById()); + return CargoTypesApi.findById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(CargoTypesAcl.canUseFindById()); - return CargoTypesApi.findById(id, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update Cargo Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { CargoTypesModels.UpdateCargoTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update Cargo Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { CargoTypesModels.UpdateCargoTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof CargoTypesApi.update, - { id: string; data: CargoTypesModels.UpdateCargoTypeRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(CargoTypesAcl.canUseUpdate()); + return CargoTypesApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(CargoTypesAcl.canUseUpdate()); - return CargoTypesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive Cargo Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive Cargo Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CargoTypesAcl.canUseArchive()); + return CargoTypesApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CargoTypesAcl.canUseArchive()); - return CargoTypesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive Cargo Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive Cargo Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CargoTypesAcl.canUseUnarchive()); + return CargoTypesApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CargoTypesAcl.canUseUnarchive()); - return CargoTypesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/chargeTypes/chargeTypes.acl.ts b/test/generated/base/chargeTypes/chargeTypes.acl.ts index a76453f..469c483 100644 --- a/test/generated/base/chargeTypes/chargeTypes.acl.ts +++ b/test/generated/base/chargeTypes/chargeTypes.acl.ts @@ -1,45 +1,74 @@ import { AbilityTuple } from "@casl/ability"; export namespace ChargeTypesAcl { - /** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "ChargeType"] as AbilityTuple<"Create", "ChargeType">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "ChargeType"] as AbilityTuple<"Update", "ChargeType">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "ChargeType"] as AbilityTuple<"Archive", "ChargeType">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "ChargeType"] as AbilityTuple<"Archive", "ChargeType">; +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "ChargeType" +] as AbilityTuple<"Read", "ChargeType">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "ChargeType" +] as AbilityTuple<"Read", "ChargeType">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "ChargeType" +] as AbilityTuple<"Create", "ChargeType">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "ChargeType" +] as AbilityTuple<"Read", "ChargeType">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "ChargeType" +] as AbilityTuple<"Update", "ChargeType">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "ChargeType" +] as AbilityTuple<"Archive", "ChargeType">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "ChargeType" +] as AbilityTuple<"Archive", "ChargeType">; + } diff --git a/test/generated/base/chargeTypes/chargeTypes.api.ts b/test/generated/base/chargeTypes/chargeTypes.api.ts index da50e3c..acbab42 100644 --- a/test/generated/base/chargeTypes/chargeTypes.api.ts +++ b/test/generated/base/chargeTypes/chargeTypes.api.ts @@ -1,131 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ChargeTypesModels } from "./chargeTypes.models"; export namespace ChargeTypesApi { - export const findAll = ( - limit: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const findAll = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, - `/charge-types/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const paginate = ( - limit: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, `/charge-types`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, + `/charge-types/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, + `/charge-types`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, ) => { return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types`, - ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), - config, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types`, + ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), + + ) +}; +export const findById = (id: string, ) => { return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}`, - config, - ); - }; - - export const update = ( - id: string, - data: ChargeTypesModels.UpdateChargeTypeRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}`, + + ) +}; +export const update = (id: string, data: ChargeTypesModels.UpdateChargeTypeRequestDTO, ) => { return AppRestClient.patch( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}`, - ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}`, + ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, ) => { return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, + `/charge-types/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/chargeTypes/chargeTypes.configs.ts b/test/generated/base/chargeTypes/chargeTypes.configs.ts index 2aab959..30d69aa 100644 --- a/test/generated/base/chargeTypes/chargeTypes.configs.ts +++ b/test/generated/base/chargeTypes/chargeTypes.configs.ts @@ -6,130 +6,131 @@ import { ChargeTypesQueries } from "./chargeTypes.queries"; import { ChargeTypesAcl } from "./chargeTypes.acl"; export namespace ChargeTypesConfigs { - export const chargeTypesConfig = { +export const chargeTypesConfig = { meta: { - title: "Charge Types", + title: "Charge Types", }, readAll: { - acl: ChargeTypesAcl.canUsePaginate, - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - paginated: ChargeTypesQueries.usePaginate, - infinite: ChargeTypesQueries.usePaginateInfinite, - filters: { - schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, - options: { - inputs: { - name: true, - search: true, - archived: true, - direction: true, - transportModes: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: ChargeTypesAcl.canUsePaginate, schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema, + paginated: ChargeTypesQueries.usePaginate, + infinite: ChargeTypesQueries.usePaginateInfinite, + filters: { + schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, + options: { + inputs: { + name: true, + search: true, + archived: true, + direction: true, + transportModes: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: ChargeTypesAcl.canUseFindById, - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - query: ChargeTypesQueries.useFindById, + acl: ChargeTypesAcl.canUseFindById, + schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, + query: ChargeTypesQueries.useFindById, }, create: { - acl: ChargeTypesAcl.canUseCreate, - schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, - mutation: ChargeTypesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: ChargeTypesAcl.canUseCreate, schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, - options: { - inputs: { - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - }, - }, - }), + mutation: ChargeTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, + options: { + inputs: { + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + }, + }, +}) }, update: { - acl: ChargeTypesAcl.canUseUpdate, - schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, - mutation: ChargeTypesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: ChargeTypesAcl.canUseUpdate, schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, - options: { - inputs: { - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - }, - }, - }), + mutation: ChargeTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, + options: { + inputs: { + matchCode: true, + englishName: true, + archived: true, + description: true, + modules: true, + directions: true, + translations: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: ChargeTypesAcl.canUseFindAll, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChargeTypesQueries.useFindAll, - infinite: ChargeTypesQueries.useFindAllInfinite, - filters: { - schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, - options: { - inputs: { - direction: true, - transportModes: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: ChargeTypesAcl.canUseFindAll, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema, + paginated: ChargeTypesQueries.useFindAll, + infinite: ChargeTypesQueries.useFindAllInfinite, + filters: { + schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, + options: { + inputs: { + direction: true, + transportModes: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/chargeTypes/chargeTypes.models.ts b/test/generated/base/chargeTypes/chargeTypes.models.ts index 688b640..2175f9b 100644 --- a/test/generated/base/chargeTypes/chargeTypes.models.ts +++ b/test/generated/base/chargeTypes/chargeTypes.models.ts @@ -2,229 +2,153 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace ChargeTypesModels { - /** - * ChargeTypeLabelFilterDtoSchema - * @type { object } - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum[] } transportModes - * @property { string } search - */ - export const ChargeTypeLabelFilterDtoSchema = z - .object({ - direction: CommonModels.DirectionEnumSchema, - transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), - search: z.string(), - }) - .readonly(); - export type ChargeTypeLabelFilterDto = z.infer; +/** + * ChargeTypeLabelFilterDtoSchema + * @type { object } + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum[] } transportModes + * @property { string } search + */ +export const ChargeTypeLabelFilterDtoSchema = z.object({ direction: CommonModels.DirectionEnumSchema.nullable(), transportModes: z.array(CommonModels.TransportModeEnumSchema).nullable(), search: z.string().nullable() }).partial(); +export type ChargeTypeLabelFilterDto = z.infer; - /** - * ChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ - export const ChargeTypeTranslationDtoSchema = z - .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) - .readonly(); - export type ChargeTypeTranslationDto = z.infer; +/** + * ChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ +export const ChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }); +export type ChargeTypeTranslationDto = z.infer; - /** - * ChargeTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ChargeTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ChargeTypeEmployeeDTO = z.infer; +/** + * ChargeTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChargeTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type ChargeTypeEmployeeDTO = z.infer; - /** - * ChargeTypeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { ChargeTypeTranslationDto[] } translations - * @property { string } createdById - * @property { ChargeTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { ChargeTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const ChargeTypeResponseDTOSchema = z - .object({ - id: z.string(), - matchCode: z.string(), - englishName: z.string(), - archived: z.boolean(), - description: z.string().nullish(), - modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), - directions: z.array(CommonModels.DirectionEnumSchema).readonly(), - translations: z.array(ChargeTypeTranslationDtoSchema).readonly(), - createdById: z.string().nullish(), - createdBy: ChargeTypeEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type ChargeTypeResponseDTO = z.infer; +/** + * ChargeTypeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { ChargeTypeTranslationDto[] } translations + * @property { string } createdById + * @property { ChargeTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { ChargeTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const ChargeTypeResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), directions: z.array(CommonModels.DirectionEnumSchema), translations: z.array(ChargeTypeTranslationDtoSchema), createdById: z.string().nullish(), createdBy: ChargeTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type ChargeTypeResponseDTO = z.infer; - /** - * ChargeTypePaginationFilterDtoSchema - * @type { object } - * @property { string } name - * @property { string } search - * @property { boolean } archived - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum[] } transportModes - */ - export const ChargeTypePaginationFilterDtoSchema = z - .object({ - name: z.string(), - search: z.string(), - archived: z.boolean(), - direction: CommonModels.DirectionEnumSchema, - transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), - }) - .readonly(); - export type ChargeTypePaginationFilterDto = z.infer; +/** + * ChargeTypePaginationFilterDtoSchema + * @type { object } + * @property { string } name + * @property { string } search + * @property { boolean } archived + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum[] } transportModes + */ +export const ChargeTypePaginationFilterDtoSchema = z.object({ name: z.string().nullable(), search: z.string().nullable(), archived: z.boolean().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), transportModes: z.array(CommonModels.TransportModeEnumSchema).nullable() }).partial(); +export type ChargeTypePaginationFilterDto = z.infer; - /** - * CreateChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ - export const CreateChargeTypeTranslationDtoSchema = z - .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) - .readonly(); - export type CreateChargeTypeTranslationDto = z.infer; +/** + * CreateChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ +export const CreateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }); +export type CreateChargeTypeTranslationDto = z.infer; - /** - * CreateChargeTypeRequestDTOSchema - * @type { object } - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { CreateChargeTypeTranslationDto[] } translations - */ - export const CreateChargeTypeRequestDTOSchema = z - .object({ - matchCode: z.string(), - englishName: z.string().nullish(), - archived: z.boolean().nullish(), - description: z.string().nullish(), - modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), - directions: z.array(CommonModels.DirectionEnumSchema).readonly(), - translations: z.array(CreateChargeTypeTranslationDtoSchema).readonly().nullish(), - }) - .readonly(); - export type CreateChargeTypeRequestDTO = z.infer; +/** + * CreateChargeTypeRequestDTOSchema + * @type { object } + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { CreateChargeTypeTranslationDto[] } translations + */ +export const CreateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string(), englishName: z.string().nullish(), archived: z.boolean().nullish(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), directions: z.array(CommonModels.DirectionEnumSchema), translations: z.array(CreateChargeTypeTranslationDtoSchema).nullish() }); +export type CreateChargeTypeRequestDTO = z.infer; - /** - * UpdateChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ - export const UpdateChargeTypeTranslationDtoSchema = z - .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) - .readonly(); - export type UpdateChargeTypeTranslationDto = z.infer; +/** + * UpdateChargeTypeTranslationDtoSchema + * @type { object } + * @property { CommonModels.LanguageEnum } language + * @property { string } value + */ +export const UpdateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }); +export type UpdateChargeTypeTranslationDto = z.infer; - /** - * UpdateChargeTypeRequestDTOSchema - * @type { object } - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { UpdateChargeTypeTranslationDto[] } translations - */ - export const UpdateChargeTypeRequestDTOSchema = z - .object({ - matchCode: z.string(), - englishName: z.string(), - archived: z.boolean(), - description: z.string(), - modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), - directions: z.array(CommonModels.DirectionEnumSchema).readonly(), - translations: z.array(UpdateChargeTypeTranslationDtoSchema).readonly(), - }) - .readonly(); - export type UpdateChargeTypeRequestDTO = z.infer; +/** + * UpdateChargeTypeRequestDTOSchema + * @type { object } + * @property { string } matchCode + * @property { string } englishName + * @property { boolean } archived + * @property { string } description + * @property { CommonModels.TransportModeEnum[] } modules + * @property { CommonModels.DirectionEnum[] } directions + * @property { UpdateChargeTypeTranslationDto[] } translations + */ +export const UpdateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string().nullable(), englishName: z.string().nullable(), archived: z.boolean().nullable(), description: z.string().nullable(), modules: z.array(CommonModels.TransportModeEnumSchema).nullable(), directions: z.array(CommonModels.DirectionEnumSchema).nullable(), translations: z.array(UpdateChargeTypeTranslationDtoSchema).nullable() }).partial(); +export type UpdateChargeTypeRequestDTO = z.infer; - /** - * ChargeTypesFindAllOrderParamEnumSchema - * @type { enum } - */ - export const ChargeTypesFindAllOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "englishName", - ]); - export type ChargeTypesFindAllOrderParamEnum = z.infer; - export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnumSchema.enum; +/** + * ChargeTypesFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ChargeTypesFindAllOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); +export type ChargeTypesFindAllOrderParamEnum = z.infer; +export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnumSchema.enum; - /** - * ChargeTypesFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const ChargeTypesFindAllResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChargeTypesFindAllResponse = z.infer; +/** + * ChargeTypesFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ChargeTypesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type ChargeTypesFindAllResponse = z.infer; - /** - * ChargeTypesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const ChargeTypesPaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "englishName", - ]); - export type ChargeTypesPaginateOrderParamEnum = z.infer; - export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEnumSchema.enum; +/** + * ChargeTypesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ChargeTypesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); +export type ChargeTypesPaginateOrderParamEnum = z.infer; +export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEnumSchema.enum; + +/** + * ChargeTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChargeTypeResponseDTO[] } items + */ +export const ChargeTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).nullable() }).partial().shape }); +export type ChargeTypesPaginateResponse = z.infer; - /** - * ChargeTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChargeTypeResponseDTO[] } items - */ - export const ChargeTypesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChargeTypesPaginateResponse = z.infer; } diff --git a/test/generated/base/chargeTypes/chargeTypes.queries.ts b/test/generated/base/chargeTypes/chargeTypes.queries.ts index 1613130..93f7fcb 100644 --- a/test/generated/base/chargeTypes/chargeTypes.queries.ts +++ b/test/generated/base/chargeTypes/chargeTypes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,354 +8,257 @@ import { ChargeTypesModels } from "./chargeTypes.models"; import { ChargeTypesApi } from "./chargeTypes.api"; export namespace ChargeTypesQueries { - export const moduleName = QueryModule.ChargeTypes; +export const moduleName = QueryModule.ChargeTypes; - export const keys = { +export const keys = { all: [moduleName] as const, - findAll: ( - limit?: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/charge-types/paginate/labels", limit, order, filter, page, cursor] as const, - findAllInfinite: ( - limit?: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/charge-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, - paginate: ( - limit?: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/charge-types", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/charge-types", "infinite", limit, order, filter, cursor] as const, + findAll: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string) => [...keys.all, "/charge-types", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/charge-types/:id", id] as const, - }; +}; - /** - * Query `useFindAll` - * @summary Paginate charge types with only their labels - * @permission Requires `canUseFindAll` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ChargeTypesModels.ChargeTypeLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useFindAllInfinite - * @summary Paginate charge types with only their labels - * @permission Requires `canUseFindAll` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ChargeTypesModels.ChargeTypeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindAll` + * @summary Paginate charge types with only their labels + * @permission Requires `canUseFindAll` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUseFindAll()); + return ChargeTypesApi.findAll(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Infinite query `useFindAllInfinite + * @summary Paginate charge types with only their labels + * @permission Requires `canUseFindAll` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Query `usePaginate` - * @summary Paginate Charge Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ChargeTypesModels.ChargeTypePaginationFilterDto; - page?: number; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChargeTypesAcl.canUseFindAll()); + return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginate` + * @summary Paginate Charge Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUsePaginate()); + return ChargeTypesApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Charge Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ChargeTypesModels.ChargeTypePaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Charge Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` + * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChargeTypesAcl.canUsePaginate()); + return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Mutation `useCreate` - * @summary Create a new Charge Type - * @permission Requires `canUseCreate` ability - * @param { ChargeTypesModels.CreateChargeTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create a new Charge Type + * @permission Requires `canUseCreate` ability + * @param { ChargeTypesModels.CreateChargeTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(ChargeTypesAcl.canUseCreate()); - return ChargeTypesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(ChargeTypesAcl.canUseCreate()); + return ChargeTypesApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useFindById` - * @summary Get Charge Type Details by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get Charge Type Details by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(ChargeTypesAcl.canUseFindById()); + return ChargeTypesApi.findById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUseFindById()); - return ChargeTypesApi.findById(id, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update an existing Charge Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { ChargeTypesModels.UpdateChargeTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update an existing Charge Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { ChargeTypesModels.UpdateChargeTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ChargeTypesApi.update, - { id: string; data: ChargeTypesModels.UpdateChargeTypeRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(ChargeTypesAcl.canUseUpdate()); + return ChargeTypesApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(ChargeTypesAcl.canUseUpdate()); - return ChargeTypesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive a Charge Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive a Charge Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ChargeTypesAcl.canUseArchive()); + return ChargeTypesApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ChargeTypesAcl.canUseArchive()); - return ChargeTypesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive a Charge Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive a Charge Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ChargeTypesAcl.canUseUnarchive()); + return ChargeTypesApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ChargeTypesAcl.canUseUnarchive()); - return ChargeTypesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/checklistItems/checklistItems.acl.ts b/test/generated/base/checklistItems/checklistItems.acl.ts index 01dc0d4..a58bf1f 100644 --- a/test/generated/base/checklistItems/checklistItems.acl.ts +++ b/test/generated/base/checklistItems/checklistItems.acl.ts @@ -1,87 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace ChecklistItemsAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create checklist item in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Create", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create checklist item in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Create", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List checklist items for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Read", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List checklist items for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Paginate checklist item labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Read", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Paginate checklist item labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get checklist item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Read", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get checklist item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Update", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Update", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Archive", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistItem", object) : "ChecklistItem" +] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Archive", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; } diff --git a/test/generated/base/checklistItems/checklistItems.api.ts b/test/generated/base/checklistItems/checklistItems.api.ts index 314a00f..83ffdbe 100644 --- a/test/generated/base/checklistItems/checklistItems.api.ts +++ b/test/generated/base/checklistItems/checklistItems.api.ts @@ -1,142 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ChecklistItemsModels } from "./checklistItems.models"; export namespace ChecklistItemsApi { - export const create = ( - officeId: string, - data: ChecklistItemsModels.CreateChecklistItemRequestDTO, - config?: AxiosRequestConfig, - ) => { +export const create = (officeId: string, data: ChecklistItemsModels.CreateChecklistItemRequestDTO, ) => { return AppRestClient.post( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items`, - ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), - config, - ); - }; - - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items`, + ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), + + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, - `/offices/${officeId}/checklist-items`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, + `/offices/${officeId}/checklist-items`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, - `/offices/${officeId}/checklist-items/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, + `/offices/${officeId}/checklist-items/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items/${id}`, - config, - ); - }; - - export const update = ( - id: string, - officeId: string, - data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items/${id}`, + + ) +}; +export const update = (id: string, officeId: string, data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, ) => { return AppRestClient.patch( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items/${id}`, - ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, + `/offices/${officeId}/checklist-items/${id}`, + ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-items/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/checklist-items/${id}/archive`, + + ) +}; +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-items/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/checklist-items/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/checklistItems/checklistItems.configs.ts b/test/generated/base/checklistItems/checklistItems.configs.ts index 014d56c..f67024d 100644 --- a/test/generated/base/checklistItems/checklistItems.configs.ts +++ b/test/generated/base/checklistItems/checklistItems.configs.ts @@ -6,110 +6,111 @@ import { ChecklistItemsQueries } from "./checklistItems.queries"; import { ChecklistItemsAcl } from "./checklistItems.acl"; export namespace ChecklistItemsConfigs { - export const checklistItemsConfig = { +export const checklistItemsConfig = { meta: { - title: "Checklist Items", + title: "Checklist Items", }, readAll: { - acl: ChecklistItemsAcl.canUsePaginate, - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - paginated: ChecklistItemsQueries.usePaginate, - infinite: ChecklistItemsQueries.usePaginateInfinite, - filters: { - schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: ChecklistItemsAcl.canUsePaginate, schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema, + paginated: ChecklistItemsQueries.usePaginate, + infinite: ChecklistItemsQueries.usePaginateInfinite, + filters: { + schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: ChecklistItemsAcl.canUseFindById, - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - query: ChecklistItemsQueries.useFindById, + acl: ChecklistItemsAcl.canUseFindById, + schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, + query: ChecklistItemsQueries.useFindById, }, create: { - acl: ChecklistItemsAcl.canUseCreate, - schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, - mutation: ChecklistItemsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: ChecklistItemsAcl.canUseCreate, schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), + mutation: ChecklistItemsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) }, update: { - acl: ChecklistItemsAcl.canUseUpdate, - schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, - mutation: ChecklistItemsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: ChecklistItemsAcl.canUseUpdate, schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), + mutation: ChecklistItemsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) }, - }; +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: ChecklistItemsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChecklistItemsQueries.usePaginateLabels, - infinite: ChecklistItemsQueries.usePaginateLabelsInfinite, - filters: { - schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: ChecklistItemsAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema, + paginated: ChecklistItemsQueries.usePaginateLabels, + infinite: ChecklistItemsQueries.usePaginateLabelsInfinite, + filters: { + schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/checklistItems/checklistItems.models.ts b/test/generated/base/checklistItems/checklistItems.models.ts index 0951314..a5191f9 100644 --- a/test/generated/base/checklistItems/checklistItems.models.ts +++ b/test/generated/base/checklistItems/checklistItems.models.ts @@ -2,143 +2,106 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace ChecklistItemsModels { - /** - * ChecklistItemEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ChecklistItemEmployeeDTO = z.infer; +/** + * ChecklistItemEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type ChecklistItemEmployeeDTO = z.infer; - /** - * ChecklistItemResponseDTOSchema - * @type { object } - * @property { string } id Checklist item ID - * @property { string } name Checklist item name - * @property { string } officeId Office ID - * @property { boolean } archived Is archived - * @property { string } archivedAt Archived at - * @property { string } createdById ID of the employee who created this checklist item - * @property { ChecklistItemEmployeeDTO } createdBy Employee who created this checklist item - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this checklist item - * @property { ChecklistItemEmployeeDTO } updatedBy Employee who last updated this checklist item - * @property { string } updatedAt Updated at - */ - export const ChecklistItemResponseDTOSchema = z - .object({ - id: z.string().describe("Checklist item ID"), - name: z.string().describe("Checklist item name"), - officeId: z.string().describe("Office ID"), - archived: z.boolean().describe("Is archived"), - archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), - createdById: z.string().describe("ID of the employee who created this checklist item").nullish(), - createdBy: ChecklistItemEmployeeDTOSchema.describe("Employee who created this checklist item").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedById: z.string().describe("ID of the employee who last updated this checklist item").nullish(), - updatedBy: ChecklistItemEmployeeDTOSchema.describe("Employee who last updated this checklist item").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - }) - .readonly(); - export type ChecklistItemResponseDTO = z.infer; +/** + * ChecklistItemResponseDTOSchema + * @type { object } + * @property { string } id Checklist item ID + * @property { string } name Checklist item name + * @property { string } officeId Office ID + * @property { boolean } archived Is archived + * @property { string } archivedAt Archived at + * @property { string } createdById ID of the employee who created this checklist item + * @property { ChecklistItemEmployeeDTO } createdBy Employee who created this checklist item + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this checklist item + * @property { ChecklistItemEmployeeDTO } updatedBy Employee who last updated this checklist item + * @property { string } updatedAt Updated at + */ +export const ChecklistItemResponseDTOSchema = z.object({ id: z.string(), name: z.string(), officeId: z.string(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: ChecklistItemEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChecklistItemEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type ChecklistItemResponseDTO = z.infer; - /** - * CreateChecklistItemRequestDTOSchema - * @type { object } - * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` - */ - export const CreateChecklistItemRequestDTOSchema = z - .object({ name: z.string().min(3).max(256).describe("Checklist item name") }) - .readonly(); - export type CreateChecklistItemRequestDTO = z.infer; +/** + * CreateChecklistItemRequestDTOSchema + * @type { object } + * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` + */ +export const CreateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256) }); +export type CreateChecklistItemRequestDTO = z.infer; - /** - * ChecklistItemLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const ChecklistItemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type ChecklistItemLabelFilterDto = z.infer; +/** + * ChecklistItemLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const ChecklistItemLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type ChecklistItemLabelFilterDto = z.infer; - /** - * ChecklistItemFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ - export const ChecklistItemFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); - export type ChecklistItemFilterDto = z.infer; +/** + * ChecklistItemFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ChecklistItemFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); +export type ChecklistItemFilterDto = z.infer; - /** - * UpdateChecklistItemRequestDTOSchema - * @type { object } - * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` - */ - export const UpdateChecklistItemRequestDTOSchema = z - .object({ name: z.string().min(3).max(256).describe("Checklist item name") }) - .readonly(); - export type UpdateChecklistItemRequestDTO = z.infer; +/** + * UpdateChecklistItemRequestDTOSchema + * @type { object } + * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` + */ +export const UpdateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256).nullable() }).partial(); +export type UpdateChecklistItemRequestDTO = z.infer; - /** - * ChecklistItemsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const ChecklistItemsPaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ChecklistItemsPaginateOrderParamEnum = z.infer; - export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderParamEnumSchema.enum; +/** + * ChecklistItemsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistItemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistItemsPaginateOrderParamEnum = z.infer; +export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderParamEnumSchema.enum; - /** - * ChecklistItemsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChecklistItemResponseDTO[] } items - */ - export const ChecklistItemsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChecklistItemsPaginateResponse = z.infer; +/** + * ChecklistItemsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChecklistItemResponseDTO[] } items + */ +export const ChecklistItemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).nullable() }).partial().shape }); +export type ChecklistItemsPaginateResponse = z.infer; - /** - * ChecklistItemsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const ChecklistItemsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ChecklistItemsPaginateLabelsOrderParamEnum = z.infer< - typeof ChecklistItemsPaginateLabelsOrderParamEnumSchema - >; - export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginateLabelsOrderParamEnumSchema.enum; +/** + * ChecklistItemsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistItemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistItemsPaginateLabelsOrderParamEnum = z.infer; +export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * ChecklistItemsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type ChecklistItemsPaginateLabelsResponse = z.infer; - /** - * ChecklistItemsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChecklistItemsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/checklistItems/checklistItems.queries.ts b/test/generated/base/checklistItems/checklistItems.queries.ts index 2b1dfcc..17b4403 100644 --- a/test/generated/base/checklistItems/checklistItems.queries.ts +++ b/test/generated/base/checklistItems/checklistItems.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,408 +8,262 @@ import { ChecklistItemsModels } from "./checklistItems.models"; import { ChecklistItemsApi } from "./checklistItems.api"; export namespace ChecklistItemsQueries { - export const moduleName = QueryModule.ChecklistItems; +export const moduleName = QueryModule.ChecklistItems; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/checklist-items", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemFilterDto, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/checklist-items", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/checklist-items/labels/paginate", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/checklist-items/labels/paginate", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/checklist-items/:id", id, officeId] as const, - }; + paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-items/:id", id, officeId] as const, +}; - /** - * Mutation `useCreate` - * @summary Create checklist item - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ChecklistItemsModels.CreateChecklistItemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof ChecklistItemsApi.create, - { officeId: string; data: ChecklistItemsModels.CreateChecklistItemRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create checklist item + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ChecklistItemsModels.CreateChecklistItemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ChecklistItemsAcl.canUseCreate({ officeId })); - return ChecklistItemsApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Get paginated checklist items - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistItemsModels.ChecklistItemFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ChecklistItemsAcl.canUseCreate({ officeId } )); + return ChecklistItemsApi.create(officeId, data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId })); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Get paginated checklist items - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistItemsModels.ChecklistItemFilterDto; - cursor?: string; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId })); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `usePaginate` + * @summary Get paginated checklist items + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); + return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Query `usePaginateLabels` - * @summary Paginate checklist item labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto; - page?: number; - cursor?: string; +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated checklist items + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); + return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId })); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate checklist item labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate checklist item labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate checklist item labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId })); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useFindById` - * @summary Get checklist item by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get checklist item by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ChecklistItemsAcl.canUseFindById({ officeId } )); + return ChecklistItemsApi.findById(id, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUseFindById({ officeId })); - return ChecklistItemsApi.findById(id, officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update checklist item + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ChecklistItemsModels.UpdateChecklistItemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update checklist item - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ChecklistItemsModels.UpdateChecklistItemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ChecklistItemsApi.update, - { id: string; officeId: string; data: ChecklistItemsModels.UpdateChecklistItemRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId } )); + return ChecklistItemsApi.update(id, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId })); - return ChecklistItemsApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive checklist item + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive checklist item - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistItemsAcl.canUseArchive({ officeId } )); + return ChecklistItemsApi.archive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistItemsAcl.canUseArchive({ officeId })); - return ChecklistItemsApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive checklist item + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive checklist item - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId } )); + return ChecklistItemsApi.unarchive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId })); - return ChecklistItemsApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/checklistTemplates/checklistTemplates.acl.ts b/test/generated/base/checklistTemplates/checklistTemplates.acl.ts index 7f4682b..d92f5fd 100644 --- a/test/generated/base/checklistTemplates/checklistTemplates.acl.ts +++ b/test/generated/base/checklistTemplates/checklistTemplates.acl.ts @@ -1,87 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace ChecklistTemplatesAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create checklist template in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Create", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create checklist template in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Create", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List checklist templates for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Read", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List checklist templates for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Get checklist template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Read", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description Get checklist template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get checklist template by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Read", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get checklist template by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Update", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Update", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Archive", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive checklist template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" +] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Archive", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; } diff --git a/test/generated/base/checklistTemplates/checklistTemplates.api.ts b/test/generated/base/checklistTemplates/checklistTemplates.api.ts index bd631a0..45c958a 100644 --- a/test/generated/base/checklistTemplates/checklistTemplates.api.ts +++ b/test/generated/base/checklistTemplates/checklistTemplates.api.ts @@ -1,144 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ChecklistTemplatesModels } from "./checklistTemplates.models"; export namespace ChecklistTemplatesApi { - export const create = ( - officeId: string, - data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { +export const create = (officeId: string, data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, ) => { return AppRestClient.post( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates`, - ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), - config, - ); - }; - - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates`, + ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), + + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, - `/offices/${officeId}/checklist-templates`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, + `/offices/${officeId}/checklist-templates`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/checklist-templates/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/checklist-templates/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates/${id}`, - config, - ); - }; - - export const update = ( - id: string, - officeId: string, - data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates/${id}`, + + ) +}; +export const update = (id: string, officeId: string, data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, ) => { return AppRestClient.put( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates/${id}`, - ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, + `/offices/${officeId}/checklist-templates/${id}`, + ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-templates/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/checklist-templates/${id}/archive`, + + ) +}; +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-templates/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/checklist-templates/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/checklistTemplates/checklistTemplates.configs.ts b/test/generated/base/checklistTemplates/checklistTemplates.configs.ts index 0c9d106..474d9c0 100644 --- a/test/generated/base/checklistTemplates/checklistTemplates.configs.ts +++ b/test/generated/base/checklistTemplates/checklistTemplates.configs.ts @@ -6,112 +6,113 @@ import { ChecklistTemplatesQueries } from "./checklistTemplates.queries"; import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; export namespace ChecklistTemplatesConfigs { - export const checklistTemplatesConfig = { +export const checklistTemplatesConfig = { meta: { - title: "Checklist Templates", + title: "Checklist Templates", }, readAll: { - acl: ChecklistTemplatesAcl.canUsePaginate, - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - paginated: ChecklistTemplatesQueries.usePaginate, - infinite: ChecklistTemplatesQueries.usePaginateInfinite, - filters: { - schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: ChecklistTemplatesAcl.canUsePaginate, schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - items: true, - }, - sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema, + paginated: ChecklistTemplatesQueries.usePaginate, + infinite: ChecklistTemplatesQueries.usePaginateInfinite, + filters: { + schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + items: true, + }, + sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: ChecklistTemplatesAcl.canUseFindById, - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - query: ChecklistTemplatesQueries.useFindById, + acl: ChecklistTemplatesAcl.canUseFindById, + schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, + query: ChecklistTemplatesQueries.useFindById, }, create: { - acl: ChecklistTemplatesAcl.canUseCreate, - schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, - mutation: ChecklistTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: ChecklistTemplatesAcl.canUseCreate, schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), + mutation: ChecklistTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) }, update: { - acl: ChecklistTemplatesAcl.canUseUpdate, - schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, - mutation: ChecklistTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: ChecklistTemplatesAcl.canUseUpdate, schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - items: true, - }, - }, - }), + mutation: ChecklistTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + items: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: ChecklistTemplatesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChecklistTemplatesQueries.usePaginateLabels, - infinite: ChecklistTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: ChecklistTemplatesAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, + paginated: ChecklistTemplatesQueries.usePaginateLabels, + infinite: ChecklistTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/checklistTemplates/checklistTemplates.models.ts b/test/generated/base/checklistTemplates/checklistTemplates.models.ts index e8309ff..a26204c 100644 --- a/test/generated/base/checklistTemplates/checklistTemplates.models.ts +++ b/test/generated/base/checklistTemplates/checklistTemplates.models.ts @@ -2,166 +2,118 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace ChecklistTemplatesModels { - /** - * ChecklistTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ChecklistTemplateEmployeeDTO = z.infer; +/** + * ChecklistTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type ChecklistTemplateEmployeeDTO = z.infer; - /** - * ChecklistTemplateItemResponseDTOSchema - * @type { object } - * @property { string } checklistItemId Checklist item id - * @property { number } order Order index - * @property { string } name Checklist item name - */ - export const ChecklistTemplateItemResponseDTOSchema = z - .object({ - checklistItemId: z.string().describe("Checklist item id"), - order: z.number().describe("Order index"), - name: z.string().describe("Checklist item name").nullish(), - }) - .readonly(); - export type ChecklistTemplateItemResponseDTO = z.infer; +/** + * ChecklistTemplateItemResponseDTOSchema + * @type { object } + * @property { string } checklistItemId Checklist item id + * @property { number } order Order index + * @property { string } name Checklist item name + */ +export const ChecklistTemplateItemResponseDTOSchema = z.object({ checklistItemId: z.string(), order: z.number(), name: z.string().nullish() }); +export type ChecklistTemplateItemResponseDTO = z.infer; - /** - * ChecklistTemplateResponseDTOSchema - * @type { object } - * @property { string } id Template id - * @property { string } name Template name - * @property { string } officeId Office id - * @property { boolean } archived Is archived - * @property { string } archivedAt Archived at - * @property { string } createdById ID of the employee who created this template - * @property { ChecklistTemplateEmployeeDTO } createdBy Employee who created this template - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this template - * @property { ChecklistTemplateEmployeeDTO } updatedBy Employee who last updated this template - * @property { string } updatedAt Updated at - * @property { ChecklistTemplateItemResponseDTO[] } items Ordered items - */ - export const ChecklistTemplateResponseDTOSchema = z - .object({ - id: z.string().describe("Template id"), - name: z.string().describe("Template name"), - officeId: z.string().describe("Office id"), - archived: z.boolean().describe("Is archived"), - archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), - createdById: z.string().describe("ID of the employee who created this template").nullish(), - createdBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), - updatedBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - items: z.array(ChecklistTemplateItemResponseDTOSchema).readonly().describe("Ordered items"), - }) - .readonly(); - export type ChecklistTemplateResponseDTO = z.infer; +/** + * ChecklistTemplateResponseDTOSchema + * @type { object } + * @property { string } id Template id + * @property { string } name Template name + * @property { string } officeId Office id + * @property { boolean } archived Is archived + * @property { string } archivedAt Archived at + * @property { string } createdById ID of the employee who created this template + * @property { ChecklistTemplateEmployeeDTO } createdBy Employee who created this template + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this template + * @property { ChecklistTemplateEmployeeDTO } updatedBy Employee who last updated this template + * @property { string } updatedAt Updated at + * @property { ChecklistTemplateItemResponseDTO[] } items Ordered items + */ +export const ChecklistTemplateResponseDTOSchema = z.object({ id: z.string(), name: z.string(), officeId: z.string(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: ChecklistTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChecklistTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), items: z.array(ChecklistTemplateItemResponseDTOSchema) }); +export type ChecklistTemplateResponseDTO = z.infer; - /** - * CreateChecklistTemplateRequestDTOSchema - * @type { object } - * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` - */ - export const CreateChecklistTemplateRequestDTOSchema = z - .object({ name: z.string().min(3).max(120).describe("Checklist template name") }) - .readonly(); - export type CreateChecklistTemplateRequestDTO = z.infer; +/** + * CreateChecklistTemplateRequestDTOSchema + * @type { object } + * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` + */ +export const CreateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120) }); +export type CreateChecklistTemplateRequestDTO = z.infer; - /** - * ChecklistTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const ChecklistTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type ChecklistTemplateLabelFilterDto = z.infer; +/** + * ChecklistTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const ChecklistTemplateLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type ChecklistTemplateLabelFilterDto = z.infer; - /** - * ChecklistTemplateFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ - export const ChecklistTemplateFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); - export type ChecklistTemplateFilterDto = z.infer; +/** + * ChecklistTemplateFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ChecklistTemplateFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); +export type ChecklistTemplateFilterDto = z.infer; - /** - * UpdateChecklistTemplateRequestDTOSchema - * @type { object } - * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` - * @property { string[] } items Ordered checklist item ids - */ - export const UpdateChecklistTemplateRequestDTOSchema = z - .object({ - name: z.string().min(3).max(120).describe("Checklist template name"), - items: z.array(z.uuid()).readonly().describe("Ordered checklist item ids"), - }) - .readonly(); - export type UpdateChecklistTemplateRequestDTO = z.infer; +/** + * UpdateChecklistTemplateRequestDTOSchema + * @type { object } + * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` + * @property { string[] } items Ordered checklist item ids + */ +export const UpdateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120), items: z.array(z.uuid()) }); +export type UpdateChecklistTemplateRequestDTO = z.infer; - /** - * ChecklistTemplatesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const ChecklistTemplatesPaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ChecklistTemplatesPaginateOrderParamEnum = z.infer; - export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPaginateOrderParamEnumSchema.enum; +/** + * ChecklistTemplatesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistTemplatesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistTemplatesPaginateOrderParamEnum = z.infer; +export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPaginateOrderParamEnumSchema.enum; - /** - * ChecklistTemplatesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChecklistTemplateResponseDTO[] } items - */ - export const ChecklistTemplatesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChecklistTemplatesPaginateResponse = z.infer; +/** + * ChecklistTemplatesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChecklistTemplateResponseDTO[] } items + */ +export const ChecklistTemplatesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).nullable() }).partial().shape }); +export type ChecklistTemplatesPaginateResponse = z.infer; - /** - * ChecklistTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const ChecklistTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ChecklistTemplatesPaginateLabelsOrderParamEnum = z.infer< - typeof ChecklistTemplatesPaginateLabelsOrderParamEnumSchema - >; - export const ChecklistTemplatesPaginateLabelsOrderParamEnum = - ChecklistTemplatesPaginateLabelsOrderParamEnumSchema.enum; +/** + * ChecklistTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ChecklistTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ChecklistTemplatesPaginateLabelsOrderParamEnum = z.infer; +export const ChecklistTemplatesPaginateLabelsOrderParamEnum = ChecklistTemplatesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * ChecklistTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type ChecklistTemplatesPaginateLabelsResponse = z.infer; - /** - * ChecklistTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChecklistTemplatesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/checklistTemplates/checklistTemplates.queries.ts b/test/generated/base/checklistTemplates/checklistTemplates.queries.ts index 9baea8c..00d431f 100644 --- a/test/generated/base/checklistTemplates/checklistTemplates.queries.ts +++ b/test/generated/base/checklistTemplates/checklistTemplates.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,417 +8,262 @@ import { ChecklistTemplatesModels } from "./checklistTemplates.models"; import { ChecklistTemplatesApi } from "./checklistTemplates.api"; export namespace ChecklistTemplatesQueries { - export const moduleName = QueryModule.ChecklistTemplates; +export const moduleName = QueryModule.ChecklistTemplates; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/checklist-templates", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/checklist-templates", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/checklist-templates/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/checklist-templates/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/checklist-templates/:id", id, officeId] as const, - }; + paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", "infinite", officeId, limit, order, filter, cursor] as const, + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-templates/:id", id, officeId] as const, +}; - /** - * Mutation `useCreate` - * @summary Create checklist template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof ChecklistTemplatesApi.create, - { officeId: string; data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create checklist template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId })); - return ChecklistTemplatesApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Get paginated checklist templates - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId } )); + return ChecklistTemplatesApi.create(officeId, data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId })); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Get paginated checklist templates - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto; - cursor?: string; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId })); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `usePaginate` + * @summary Get paginated checklist templates + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Query `usePaginateLabels` - * @summary Paginate checklist template labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto; - page?: number; - cursor?: string; +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated checklist templates + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId })); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate checklist template labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate checklist template labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate checklist template labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId })); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useFindById` - * @summary Get checklist template by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get checklist template by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId } )); + return ChecklistTemplatesApi.findById(id, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId })); - return ChecklistTemplatesApi.findById(id, officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Replace checklist template + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Replace checklist template - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ChecklistTemplatesApi.update, - { id: string; officeId: string; data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId } )); + return ChecklistTemplatesApi.update(id, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId })); - return ChecklistTemplatesApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive checklist template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive checklist template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId } )); + return ChecklistTemplatesApi.archive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId })); - return ChecklistTemplatesApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive checklist template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive checklist template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId } )); + return ChecklistTemplatesApi.unarchive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId })); - return ChecklistTemplatesApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/cities/cities.acl.ts b/test/generated/base/cities/cities.acl.ts index 1511597..877afd1 100644 --- a/test/generated/base/cities/cities.acl.ts +++ b/test/generated/base/cities/cities.acl.ts @@ -1,51 +1,84 @@ import { AbilityTuple } from "@casl/ability"; export namespace CitiesAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "City"] as AbilityTuple<"Read", "City">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "City"] as AbilityTuple<"Create", "City">; - - /** - * Use for `useListCityLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCityLabels` query - */ - export const canUseListCityLabels = () => ["Read", "City"] as AbilityTuple<"Read", "City">; - - /** - * Use for `useGetCityLabelById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCityLabelById` query - */ - export const canUseGetCityLabelById = () => ["Read", "City"] as AbilityTuple<"Read", "City">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "City"] as AbilityTuple<"Read", "City">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "City"] as AbilityTuple<"Update", "City">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "City"] as AbilityTuple<"Archive", "City">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "City"] as AbilityTuple<"Archive", "City">; +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "City" +] as AbilityTuple<"Create", "City">; + +/** + * Use for `useListCityLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCityLabels` query + */ +export const canUseListCityLabels = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useGetCityLabelById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCityLabelById` query + */ +export const canUseGetCityLabelById = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "City" +] as AbilityTuple<"Read", "City">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "City" +] as AbilityTuple<"Update", "City">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "City" +] as AbilityTuple<"Archive", "City">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "City" +] as AbilityTuple<"Archive", "City">; + } diff --git a/test/generated/base/cities/cities.api.ts b/test/generated/base/cities/cities.api.ts index a9730f5..af80ea7 100644 --- a/test/generated/base/cities/cities.api.ts +++ b/test/generated/base/cities/cities.api.ts @@ -1,113 +1,81 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CitiesModels } from "./cities.models"; export namespace CitiesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: CitiesModels.CityPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CitiesModels.CitiesPaginateResponseSchema }, `/cities`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: CitiesModels.CreateCityRequestDTO, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: CitiesModels.CitiesPaginateResponseSchema }, + `/cities`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: CitiesModels.CreateCityRequestDTO, ) => { return AppRestClient.post( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities`, - ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), - config, - ); - }; - - export const listCityLabels = ( - limit: number, - order?: string, - filter?: CitiesModels.CityLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CitiesModels.ListCityLabelsResponseSchema }, `/cities/paginate/labels`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const getCityLabelById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: CitiesModels.CityLabelResponseDTOSchema }, `/cities/${id}/labels`, config); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: CitiesModels.CityResponseDTOSchema }, `/cities/${id}`, config); - }; - - export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities`, + ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), + + ) +}; +export const listCityLabels = (limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: CitiesModels.ListCityLabelsResponseSchema }, + `/cities/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getCityLabelById = (id: string, ) => { + return AppRestClient.get( + { resSchema: CitiesModels.CityLabelResponseDTOSchema }, + `/cities/${id}/labels`, + + ) +}; +export const findById = (id: string, ) => { + return AppRestClient.get( + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities/${id}`, + + ) +}; +export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, ) => { return AppRestClient.patch( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities/${id}`, - ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/cities/${id}/archive`, undefined, config); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/cities/${id}/unarchive`, undefined, config); - }; + { resSchema: CitiesModels.CityResponseDTOSchema }, + `/cities/${id}`, + ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/cities/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/cities/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/cities/cities.configs.ts b/test/generated/base/cities/cities.configs.ts index 5498521..f31740c 100644 --- a/test/generated/base/cities/cities.configs.ts +++ b/test/generated/base/cities/cities.configs.ts @@ -5,119 +5,120 @@ import { CitiesQueries } from "./cities.queries"; import { CitiesAcl } from "./cities.acl"; export namespace CitiesConfigs { - export const citiesConfig = { +export const citiesConfig = { meta: { - title: "Cities", + title: "Cities", }, readAll: { - acl: CitiesAcl.canUsePaginate, - schema: CitiesModels.CityResponseDTOSchema, - paginated: CitiesQueries.usePaginate, - infinite: CitiesQueries.usePaginateInfinite, - filters: { - schema: CitiesModels.CityPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CitiesModels.CityPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: CitiesAcl.canUsePaginate, schema: CitiesModels.CityResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - isoCode: true, - stateCode: true, - archived: true, - countryId: true, - country: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CitiesModels.CitiesPaginateOrderParamEnumSchema, + paginated: CitiesQueries.usePaginate, + infinite: CitiesQueries.usePaginateInfinite, + filters: { + schema: CitiesModels.CityPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CitiesModels.CityPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CitiesModels.CityResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + isoCode: true, + stateCode: true, + archived: true, + countryId: true, + country: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CitiesModels.CitiesPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: CitiesAcl.canUseFindById, - schema: CitiesModels.CityResponseDTOSchema, - query: CitiesQueries.useFindById, + acl: CitiesAcl.canUseFindById, + schema: CitiesModels.CityResponseDTOSchema, + query: CitiesQueries.useFindById, }, create: { - acl: CitiesAcl.canUseCreate, - schema: CitiesModels.CreateCityRequestDTOSchema, - mutation: CitiesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: CitiesAcl.canUseCreate, schema: CitiesModels.CreateCityRequestDTOSchema, - options: { - inputs: { - name: true, - isoCode: true, - stateCode: true, - countryId: true, - }, - }, - }), + mutation: CitiesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CitiesModels.CreateCityRequestDTOSchema, + options: { + inputs: { + name: true, + isoCode: true, + stateCode: true, + countryId: true, + }, + }, +}) }, update: { - acl: CitiesAcl.canUseUpdate, - schema: CitiesModels.UpdateCityRequestDTOSchema, - mutation: CitiesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: CitiesAcl.canUseUpdate, schema: CitiesModels.UpdateCityRequestDTOSchema, - options: { - inputs: { - name: true, - isoCode: true, - stateCode: true, - countryId: true, - }, - }, - }), + mutation: CitiesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CitiesModels.UpdateCityRequestDTOSchema, + options: { + inputs: { + name: true, + isoCode: true, + stateCode: true, + countryId: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: CitiesAcl.canUseListCityLabels, - schema: CitiesModels.CityLabelResponseDTOSchema, - paginated: CitiesQueries.useListCityLabels, - infinite: CitiesQueries.useListCityLabelsInfinite, - filters: { - schema: CitiesModels.CityLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CitiesModels.CityLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: CitiesAcl.canUseListCityLabels, schema: CitiesModels.CityLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - country: true, - }, - sortable: CitiesModels.ListCityLabelsOrderParamEnumSchema, + paginated: CitiesQueries.useListCityLabels, + infinite: CitiesQueries.useListCityLabelsInfinite, + filters: { + schema: CitiesModels.CityLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CitiesModels.CityLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CitiesModels.CityLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + country: true, }, - }; + sortable: CitiesModels.ListCityLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/cities/cities.models.ts b/test/generated/base/cities/cities.models.ts index 6fc2ac8..4fbb83e 100644 --- a/test/generated/base/cities/cities.models.ts +++ b/test/generated/base/cities/cities.models.ts @@ -2,202 +2,144 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace CitiesModels { - /** - * CityCountryDtoSchema - * @type { object } - * @property { string } id Unique identifier of the country - * @property { string } name Name of the country - * @property { string } isoCode2 2 character iso code of the country - * @property { string } isoCode3 3 character iso code of the country - */ - export const CityCountryDtoSchema = z - .object({ - id: z.string().describe("Unique identifier of the country"), - name: z.string().describe("Name of the country"), - isoCode2: z.string().describe("2 character iso code of the country"), - isoCode3: z.string().describe("3 character iso code of the country"), - }) - .readonly(); - export type CityCountryDto = z.infer; +/** + * CityCountryDtoSchema + * @type { object } + * @property { string } id Unique identifier of the country + * @property { string } name Name of the country + * @property { string } isoCode2 2 character iso code of the country + * @property { string } isoCode3 3 character iso code of the country + */ +export const CityCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); +export type CityCountryDto = z.infer; - /** - * CityEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CityEmployeeDTO = z.infer; +/** + * CityEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type CityEmployeeDTO = z.infer; - /** - * CityResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the city - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { boolean } archived Whether the city is archived - * @property { string } countryId Country ID - * @property { CityCountryDto } country - * @property { string } createdById - * @property { CityEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CityEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const CityResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the city"), - name: z.string().describe("Name of the city"), - isoCode: z.string().describe("ISO code of the city").nullish(), - stateCode: z.string().describe("State code of the city").nullish(), - archived: z.boolean().describe("Whether the city is archived").nullish(), - countryId: z.string().describe("Country ID").nullish(), - country: CityCountryDtoSchema.nullish(), - createdById: z.string().nullish(), - createdBy: CityEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: CityEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type CityResponseDTO = z.infer; +/** + * CityResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the city + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { boolean } archived Whether the city is archived + * @property { string } countryId Country ID + * @property { CityCountryDto } country + * @property { string } createdById + * @property { CityEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CityEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const CityResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isoCode: z.string().nullish(), stateCode: z.string().nullish(), archived: z.boolean().nullish(), countryId: z.string().nullish(), country: CityCountryDtoSchema.nullish(), createdById: z.string().nullish(), createdBy: CityEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CityEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type CityResponseDTO = z.infer; - /** - * CityLabelCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CityLabelCountryDto = z.infer; +/** + * CityLabelCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type CityLabelCountryDto = z.infer; - /** - * CityLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { CityLabelCountryDto } country - */ - export const CityLabelResponseDTOSchema = z - .object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }) - .readonly(); - export type CityLabelResponseDTO = z.infer; +/** + * CityLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { CityLabelCountryDto } country + */ +export const CityLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }); +export type CityLabelResponseDTO = z.infer; - /** - * CityPaginationFilterDtoSchema - * @type { object } - * @property { string } search Free search - * @property { boolean } archived - */ - export const CityPaginationFilterDtoSchema = z - .object({ search: z.string().describe("Free search"), archived: z.boolean() }) - .readonly(); - export type CityPaginationFilterDto = z.infer; +/** + * CityPaginationFilterDtoSchema + * @type { object } + * @property { string } search Free search + * @property { boolean } archived + */ +export const CityPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); +export type CityPaginationFilterDto = z.infer; - /** - * CityLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const CityLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type CityLabelFilterDto = z.infer; +/** + * CityLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const CityLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type CityLabelFilterDto = z.infer; - /** - * CreateCityRequestDTOSchema - * @type { object } - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { string } countryId Country ID - */ - export const CreateCityRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the city"), - isoCode: z.string().describe("ISO code of the city").nullish(), - stateCode: z.string().describe("State code of the city").nullish(), - countryId: z.string().describe("Country ID"), - }) - .readonly(); - export type CreateCityRequestDTO = z.infer; +/** + * CreateCityRequestDTOSchema + * @type { object } + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { string } countryId Country ID + */ +export const CreateCityRequestDTOSchema = z.object({ name: z.string(), isoCode: z.string().nullish(), stateCode: z.string().nullish(), countryId: z.string() }); +export type CreateCityRequestDTO = z.infer; - /** - * UpdateCityRequestDTOSchema - * @type { object } - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { string } countryId Country ID - */ - export const UpdateCityRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the city"), - isoCode: z.string().describe("ISO code of the city"), - stateCode: z.string().describe("State code of the city"), - countryId: z.string().describe("Country ID"), - }) - .readonly(); - export type UpdateCityRequestDTO = z.infer; +/** + * UpdateCityRequestDTOSchema + * @type { object } + * @property { string } name Name of the city + * @property { string } isoCode ISO code of the city + * @property { string } stateCode State code of the city + * @property { string } countryId Country ID + */ +export const UpdateCityRequestDTOSchema = z.object({ name: z.string().nullable(), isoCode: z.string().nullable(), stateCode: z.string().nullable(), countryId: z.string().nullable() }).partial(); +export type UpdateCityRequestDTO = z.infer; - /** - * CitiesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const CitiesPaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type CitiesPaginateOrderParamEnum = z.infer; - export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.enum; +/** + * CitiesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const CitiesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type CitiesPaginateOrderParamEnum = z.infer; +export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.enum; - /** - * CitiesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CityResponseDTO[] } items - */ - export const CitiesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CityResponseDTOSchema).readonly() }).readonly().shape, - }); - export type CitiesPaginateResponse = z.infer; +/** + * CitiesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CityResponseDTO[] } items + */ +export const CitiesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityResponseDTOSchema).nullable() }).partial().shape }); +export type CitiesPaginateResponse = z.infer; - /** - * ListCityLabelsOrderParamEnumSchema - * @type { enum } - */ - export const ListCityLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ListCityLabelsOrderParamEnum = z.infer; - export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.enum; +/** + * ListCityLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ListCityLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ListCityLabelsOrderParamEnum = z.infer; +export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.enum; + +/** + * ListCityLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CityLabelResponseDTO[] } items + */ +export const ListCityLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityLabelResponseDTOSchema).nullable() }).partial().shape }); +export type ListCityLabelsResponse = z.infer; - /** - * ListCityLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CityLabelResponseDTO[] } items - */ - export const ListCityLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CityLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ListCityLabelsResponse = z.infer; } diff --git a/test/generated/base/cities/cities.queries.ts b/test/generated/base/cities/cities.queries.ts index 1ea1e83..a8b951b 100644 --- a/test/generated/base/cities/cities.queries.ts +++ b/test/generated/base/cities/cities.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,362 +8,275 @@ import { CitiesModels } from "./cities.models"; import { CitiesApi } from "./cities.api"; export namespace CitiesQueries { - export const moduleName = QueryModule.Cities; +export const moduleName = QueryModule.Cities; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: CitiesModels.CityPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/cities", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: CitiesModels.CityPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/cities", "infinite", limit, order, filter, cursor] as const, - listCityLabels: ( - limit?: number, - order?: string, - filter?: CitiesModels.CityLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/cities/paginate/labels", limit, order, filter, page, cursor] as const, - listCityLabelsInfinite: ( - limit?: number, - order?: string, - filter?: CitiesModels.CityLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/cities/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string) => [...keys.all, "/cities", "infinite", limit, order, filter, cursor] as const, + listCityLabels: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities/paginate/labels", limit, order, filter, page, cursor] as const, + listCityLabelsInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string) => [...keys.all, "/cities/paginate/labels", "infinite", limit, order, filter, cursor] as const, getCityLabelById: (id: string) => [...keys.all, "/cities/:id/labels", id] as const, findById: (id: string) => [...keys.all, "/cities/:id", id] as const, - }; +}; - /** - * Query `usePaginate` - * @summary Paginate Cities - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: CitiesModels.CityPaginationFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginate` + * @summary Paginate Cities + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CitiesAcl.canUsePaginate()); + return CitiesApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Cities + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Cities - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CitiesModels.CityPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CitiesAcl.canUsePaginate()); + return CitiesApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Mutation `useCreate` + * @summary Create city + * @permission Requires `canUseCreate` ability + * @param { CitiesModels.CreateCityRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreate` - * @summary Create city - * @permission Requires `canUseCreate` ability - * @param { CitiesModels.CreateCityRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CitiesAcl.canUseCreate()); + return CitiesApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CitiesAcl.canUseCreate()); - return CitiesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Query `useListCityLabels` + * @summary Paginate cities with only their labels (id and name) and country information + * @permission Requires `canUseListCityLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCityLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCityLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CitiesAcl.canUseListCityLabels()); + return CitiesApi.listCityLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Query `useListCityLabels` - * @summary Paginate cities with only their labels (id and name) and country information - * @permission Requires `canUseListCityLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListCityLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: CitiesModels.CityLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `useListCityLabelsInfinite + * @summary Paginate cities with only their labels (id and name) and country information + * @permission Requires `canUseListCityLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListCityLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useQuery({ - queryKey: keys.listCityLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CitiesAcl.canUseListCityLabels()); + return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Infinite query `useListCityLabelsInfinite - * @summary Paginate cities with only their labels (id and name) and country information - * @permission Requires `canUseListCityLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListCityLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CitiesModels.CityLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetCityLabelById` + * @summary Get city by ID with label format (id and formatted name) and country information + * @permission Requires `canUseGetCityLabelById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCityLabelById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCityLabelById(id), + queryFn: () => { + checkAcl(CitiesAcl.canUseGetCityLabelById()); + return CitiesApi.getCityLabelById(id) }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `useFindById` + * @summary Get city by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(CitiesAcl.canUseFindById()); + return CitiesApi.findById(id) }, + ...options, + }); +}; - /** - * Query `useGetCityLabelById` - * @summary Get city by ID with label format (id and formatted name) and country information - * @permission Requires `canUseGetCityLabelById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCityLabelById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Mutation `useUpdate` + * @summary Update city + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { CitiesModels.UpdateCityRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useQuery({ - queryKey: keys.getCityLabelById(id), - queryFn: () => { - checkAcl(CitiesAcl.canUseGetCityLabelById()); - return CitiesApi.getCityLabelById(id, config); - }, - ...options, - }); - }; + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(CitiesAcl.canUseUpdate()); + return CitiesApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useFindById` - * @summary Get city by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Mutation `useArchive` + * @summary Archive city + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(CitiesAcl.canUseFindById()); - return CitiesApi.findById(id, config); - }, - ...options, - }); - }; + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CitiesAcl.canUseArchive()); + return CitiesApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useUpdate` - * @summary Update city - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { CitiesModels.UpdateCityRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUnarchive` + * @summary Unarchive city + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(CitiesAcl.canUseUpdate()); - return CitiesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CitiesAcl.canUseUnarchive()); + return CitiesApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useArchive` - * @summary Archive city - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CitiesAcl.canUseArchive()); - return CitiesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive city - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CitiesAcl.canUseUnarchive()); - return CitiesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/common/common.models.ts b/test/generated/base/common/common.models.ts index 1f7c6e6..285ef85 100644 --- a/test/generated/base/common/common.models.ts +++ b/test/generated/base/common/common.models.ts @@ -72,10 +72,9 @@ export const OfficePaymentTermsDateType = OfficePaymentTermsDateTypeSchema.enum; * @property { string } id * @property { string } name */ -export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type FolderEmployeeDTO = z.infer; - /** * FileResponseDTOSchema * @type { object } @@ -89,10 +88,9 @@ export type FolderEmployeeDTO = z.infer; * @property { FolderEmployeeDTO } updatedBy * @property { string } downloadUrl */ -export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }).readonly(); +export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }); export type FileResponseDTO = z.infer; - /** * EditorContentUpdateDtoSchema * @type { object } @@ -100,10 +98,9 @@ export type FileResponseDTO = z.infer; * @property { object } json * @property { any } json.[key] */ -export const EditorContentUpdateDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export const EditorContentUpdateDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); export type EditorContentUpdateDto = z.infer; - /** * RemarkBlockDTOSchema * @type { object } @@ -112,10 +109,9 @@ export type EditorContentUpdateDto = z.infer; - /** * TitleBlockDTOSchema * @type { object } @@ -124,10 +120,9 @@ export type RemarkBlockDTO = z.infer; * @property { boolean } includePositionNumber * @property { boolean } allowManualOverride */ -export const TitleBlockDTOSchema = z.object({ enabled: z.boolean(), defaultTitle: z.string(), includePositionNumber: z.boolean(), allowManualOverride: z.boolean() }).readonly(); +export const TitleBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), defaultTitle: z.string().nullable(), includePositionNumber: z.boolean().nullable(), allowManualOverride: z.boolean().nullable() }).partial(); export type TitleBlockDTO = z.infer; - /** * PositionInvolvedPartyTypeEnumSchema * @type { enum } @@ -142,10 +137,9 @@ export const PositionInvolvedPartyTypeEnum = PositionInvolvedPartyTypeEnumSchema * @property { boolean } enabled * @property { string } defaultRole */ -export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema }).readonly(); +export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema.nullable() }).partial(); export type ReceiverBlockDTO = z.infer; - /** * OurInformationBlockDTOSchema * @type { object } @@ -158,10 +152,9 @@ export type ReceiverBlockDTO = z.infer; * @property { boolean } showMasterBillOfLadingNumber * @property { boolean } showHouseBillOfLadingNumber */ -export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean(), showName: z.boolean(), showPhone: z.boolean(), showDate: z.boolean(), showBookingNumber: z.boolean(), showCustomerReference: z.boolean(), showMasterBillOfLadingNumber: z.boolean(), showHouseBillOfLadingNumber: z.boolean() }).readonly(); +export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), showName: z.boolean().nullable(), showPhone: z.boolean().nullable(), showDate: z.boolean().nullable(), showBookingNumber: z.boolean().nullable(), showCustomerReference: z.boolean().nullable(), showMasterBillOfLadingNumber: z.boolean().nullable(), showHouseBillOfLadingNumber: z.boolean().nullable() }).partial(); export type OurInformationBlockDTO = z.infer; - /** * RouteTableBlockDTOSchema * @type { object } @@ -175,30 +168,27 @@ export type OurInformationBlockDTO = z.infer; - /** * CargoTableBlockDTOSchema * @type { object } * @property { boolean } enabled * @property { number } position 1-based order in the rendered document. Minimum: `1` */ -export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable() }).partial(); export type CargoTableBlockDTO = z.infer; - /** * CargoSummaryBlockDTOSchema * @type { object } * @property { boolean } enabled * @property { number } position 1-based order in the rendered document. Minimum: `1` */ -export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable() }).partial(); export type CargoSummaryBlockDTO = z.infer; - /** * FinanceTableBlockDTOSchema * @type { object } @@ -221,28 +211,25 @@ export type CargoSummaryBlockDTO = z.infer; * @property { boolean } showSellRateExchangeRates * @property { boolean } showTotal */ -export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showOnlyForReceiver: z.boolean(), showVendor: z.boolean(), showBuyRate: z.boolean(), showCustomer: z.boolean(), showSellRate: z.boolean(), showGrid: z.boolean(), showCharges: z.boolean(), showAdditionalText: z.boolean(), showQuantity: z.boolean(), showProfit: z.boolean(), showTotalsByCurrency: z.boolean(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean(), showSellRateExchangeRates: z.boolean(), showTotal: z.boolean() }).readonly(); +export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), showOnlyForReceiver: z.boolean().nullable(), showVendor: z.boolean().nullable(), showBuyRate: z.boolean().nullable(), showCustomer: z.boolean().nullable(), showSellRate: z.boolean().nullable(), showGrid: z.boolean().nullable(), showCharges: z.boolean().nullable(), showAdditionalText: z.boolean().nullable(), showQuantity: z.boolean().nullable(), showProfit: z.boolean().nullable(), showTotalsByCurrency: z.boolean().nullable(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean().nullable(), showSellRateExchangeRates: z.boolean().nullable(), showTotal: z.boolean().nullable() }).partial(); export type FinanceTableBlockDTO = z.infer; - /** * FooterBlockDTOSchema * @type { object } * @property { boolean } enabled */ -export const FooterBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export const FooterBlockDTOSchema = z.object({ enabled: z.boolean().nullable() }).partial(); export type FooterBlockDTO = z.infer; - /** * TermsBlockDTOSchema * @type { object } * @property { boolean } enabled */ -export const TermsBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export const TermsBlockDTOSchema = z.object({ enabled: z.boolean().nullable() }).partial(); export type TermsBlockDTO = z.infer; - /** * CutOffDatesBlockDTOSchema * @type { object } @@ -253,10 +240,9 @@ export type TermsBlockDTO = z.infer; * @property { boolean } customsAMS * @property { boolean } vgmCustomer */ -export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), billOfLadingFromCustomer: z.boolean(), billOfLadingToCarrier: z.boolean(), customsAMS: z.boolean(), vgmCustomer: z.boolean() }).readonly(); +export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), billOfLadingFromCustomer: z.boolean().nullable(), billOfLadingToCarrier: z.boolean().nullable(), customsAMS: z.boolean().nullable(), vgmCustomer: z.boolean().nullable() }).partial(); export type CutOffDatesBlockDTO = z.infer; - /** * TemplateBlocksResponseDTOSchema * @type { object } @@ -272,20 +258,18 @@ export type CutOffDatesBlockDTO = z.infer; * @property { TermsBlockDTO } termsBlock * @property { CutOffDatesBlockDTO } cutOffDatesBlock */ -export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); +export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema.nullable(), receiverBlock: CommonModels.ReceiverBlockDTOSchema.nullable(), ourInformationBlock: CommonModels.OurInformationBlockDTOSchema.nullable(), routeTableBlock: CommonModels.RouteTableBlockDTOSchema.nullable(), cargoTableBlock: CommonModels.CargoTableBlockDTOSchema.nullable(), cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema.nullable(), financeTableBlock: CommonModels.FinanceTableBlockDTOSchema.nullable(), remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).nullable(), footerBlock: CommonModels.FooterBlockDTOSchema.nullable(), termsBlock: CommonModels.TermsBlockDTOSchema.nullable(), cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema.nullable() }).partial(); export type TemplateBlocksResponseDTO = z.infer; - /** * RouteTableProviderDtoSchema * @type { object } * @property { string } id Provider ID * @property { string } name Provider name */ -export const RouteTableProviderDtoSchema = z.object({ id: z.string().describe("Provider ID"), name: z.string().describe("Provider name") }).readonly(); +export const RouteTableProviderDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); export type RouteTableProviderDto = z.infer; - /** * RouteTablePointDtoSchema * @type { object } @@ -301,10 +285,9 @@ export type RouteTableProviderDto = z.infer; * @property { string } voyage Voyage information * @property { string } carrier Carrier name */ -export const RouteTablePointDtoSchema = z.object({ id: z.string().describe("Route point ID"), type: z.string().describe("Route point type"), datetime: z.string().describe("Route point datetime").nullish(), secondaryDatetime: z.string().describe("Route point secondary datetime").nullish(), address: z.string().describe("Route point address").nullish(), name: z.string().describe("Route point address name").nullish(), reference: z.string().describe("Route point reference").nullish(), provider: CommonModels.RouteTableProviderDtoSchema.describe("Route point provider").nullish(), vessel: z.string().describe("Vessel information").nullish(), voyage: z.string().describe("Voyage information").nullish(), carrier: z.string().describe("Carrier name").nullish() }).readonly(); +export const RouteTablePointDtoSchema = z.object({ id: z.string(), type: z.string(), datetime: z.string().nullish(), secondaryDatetime: z.string().nullish(), address: z.string().nullish(), name: z.string().nullish(), reference: z.string().nullish(), provider: CommonModels.RouteTableProviderDtoSchema.nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), carrier: z.string().nullish() }); export type RouteTablePointDto = z.infer; - /** * RouteTableBlockResponseDtoSchema * @type { object } @@ -321,10 +304,9 @@ export type RouteTablePointDto = z.infer; * @property { boolean } showGrid Show grid * @property { boolean } suppressRoute Suppress route */ -export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID").nullish(), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish(), showAddress: z.boolean().describe("Show address").nullish(), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); +export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().nullish(), selectedRoutePointIds: z.array(z.string()), showReference: z.boolean(), showVesselVoyage: z.boolean(), showProvider: z.boolean(), points: z.array(CommonModels.RouteTablePointDtoSchema).nullish(), showAddress: z.boolean().nullish(), showDates: z.boolean(), showType: z.boolean(), showLocation: z.boolean(), showGrid: z.boolean(), suppressRoute: z.boolean() }); export type RouteTableBlockResponseDto = z.infer; - /** * CargoSpecialtyDtoSchema * @type { object } @@ -334,10 +316,9 @@ export type RouteTableBlockResponseDto = z.infer; - /** * CargoPackageDtoSchema * @type { object } @@ -356,20 +337,18 @@ export type CargoSpecialtyDto = z.infer; * @property { number } chargeableWeight Chargeable weight in kg * @property { number } volumetricWeight Volumetric weight in kg */ -export const CargoPackageDtoSchema = z.object({ id: z.string().describe("Package ID"), description: z.string().describe("Package description").nullish(), weight: z.string().describe("Weight").nullish(), hsCodes: z.string().describe("HS codes (numeric only)").nullish(), quantity: z.number().describe("Quantity").nullish(), width: z.number().describe("Width (cm)").nullish(), length: z.number().describe("Length (cm)").nullish(), height: z.number().describe("Height (cm)").nullish(), volume: z.number().describe("Total volume in m3 for this package group").nullish(), packageType: z.string().describe("Package type name").nullish(), caseMarks: z.string().describe("Case marks").nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).readonly().describe("Package specialties").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg").nullish() }).readonly(); +export const CargoPackageDtoSchema = z.object({ id: z.string(), description: z.string().nullish(), weight: z.string().nullish(), hsCodes: z.string().nullish(), quantity: z.number().nullish(), width: z.number().nullish(), length: z.number().nullish(), height: z.number().nullish(), volume: z.number().nullish(), packageType: z.string().nullish(), caseMarks: z.string().nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).nullish(), chargeableWeight: z.number().nullish(), volumetricWeight: z.number().nullish() }); export type CargoPackageDto = z.infer; - /** * CargoItemRouteDtoSchema * @type { object } * @property { string[] } selectedRoutePointIds Selected route point IDs * @property { RouteTablePointDto[] } points Route points */ -export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish() }).readonly(); +export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()), points: z.array(CommonModels.RouteTablePointDtoSchema).nullish() }); export type CargoItemRouteDto = z.infer; - /** * CargoItemDtoSchema * @type { object } @@ -387,10 +366,9 @@ export type CargoItemRouteDto = z.infer; * @property { string[] } selectedPackageIds Selected cargo package IDs * @property { CargoItemRouteDto } route Cargo route (when routes are split) */ -export const CargoItemDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID"), cargoType: z.string().describe("Cargo type"), containerNumber: z.string().describe("Container number").nullish(), seal1: z.string().describe("First seal (sea cargo only)").nullish(), seal2: z.string().describe("Second seal (sea cargo only)").nullish(), vgm: z.string().describe("Verified gross mass (VGM) for container, sea cargo only").nullish(), totalGrossWeight: z.number().describe("Total gross weight from cargo details").nullish(), totalVolume: z.number().describe("Total volume (m3) calculated from cargo packages").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg for transport unit").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg for transport unit").nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema).readonly().describe("Cargo packages"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteDtoSchema.describe("Cargo route (when routes are split)").nullish() }).readonly(); +export const CargoItemDtoSchema = z.object({ cargoId: z.string(), cargoType: z.string(), containerNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), vgm: z.string().nullish(), totalGrossWeight: z.number().nullish(), totalVolume: z.number().nullish(), chargeableWeight: z.number().nullish(), volumetricWeight: z.number().nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema), selectedPackageIds: z.array(z.string()), route: CommonModels.CargoItemRouteDtoSchema.nullish() }); export type CargoItemDto = z.infer; - /** * CargoTableBlockDtoSchema * @type { object } @@ -421,10 +399,9 @@ export type CargoItemDto = z.infer; * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 * @property { CargoItemDto[] } items Cargo items */ -export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs").nullish(), suppressWeight: z.boolean().describe("Suppress weight column display").nullish(), showGrid: z.boolean().describe("Show grid borders in cargo table").nullish(), suppressVolume: z.boolean().describe("Suppress volume column display").nullish(), suppressSpecialities: z.boolean().describe("Suppress specialities column display").nullish(), suppressDimensions: z.boolean().describe("Suppress dimensions column display").nullish(), suppressPackageVolume: z.boolean().describe("Suppress package volume column display").nullish(), suppressPackageWeight: z.boolean().describe("Suppress package weight column display").nullish(), showGrandTotal: z.boolean().describe("Show grand total").nullish(), showTransportUnitTotal: z.boolean().describe("Show transport unit total").nullish(), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullish(), suppressCargo: z.boolean().describe("Suppress cargo table display").nullish(), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units").nullish(), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units").nullish(), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages").nullish(), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages").nullish(), showPackageHSCodes: z.boolean().describe("Show HS codes for packages").nullish(), showPackageType: z.boolean().describe("Show package type for packages").nullish(), showPackageQuantity: z.boolean().describe("Show quantity for packages").nullish(), showPackageDescription: z.boolean().describe("Show description for packages").nullish(), showPackageCaseMarks: z.boolean().describe("Show case marks for packages").nullish(), showTransportUnitNumber: z.boolean().describe("Show transport unit number").nullish(), showTransportUnitType: z.boolean().describe("Show transport unit type").nullish(), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1").nullish(), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2").nullish(), items: z.array(CommonModels.CargoItemDtoSchema).readonly().describe("Cargo items") }).readonly(); +export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).nullish(), suppressWeight: z.boolean().nullish(), showGrid: z.boolean().nullish(), suppressVolume: z.boolean().nullish(), suppressSpecialities: z.boolean().nullish(), suppressDimensions: z.boolean().nullish(), suppressPackageVolume: z.boolean().nullish(), suppressPackageWeight: z.boolean().nullish(), showGrandTotal: z.boolean().nullish(), showTransportUnitTotal: z.boolean().nullish(), showRoute: z.boolean().nullish(), suppressCargo: z.boolean().nullish(), showTransportUnitChargeableWeight: z.boolean().nullish(), showTransportUnitVolumetricWeight: z.boolean().nullish(), showPackageChargeableWeight: z.boolean().nullish(), showPackageVolumetricWeight: z.boolean().nullish(), showPackageHSCodes: z.boolean().nullish(), showPackageType: z.boolean().nullish(), showPackageQuantity: z.boolean().nullish(), showPackageDescription: z.boolean().nullish(), showPackageCaseMarks: z.boolean().nullish(), showTransportUnitNumber: z.boolean().nullish(), showTransportUnitType: z.boolean().nullish(), showTransportUnitSeal1: z.boolean().nullish(), showTransportUnitSeal2: z.boolean().nullish(), items: z.array(CommonModels.CargoItemDtoSchema) }); export type CargoTableBlockDto = z.infer; - /** * SummaryCargoItemDtoSchema * @type { object } @@ -432,19 +409,17 @@ export type CargoTableBlockDto = z.infer; * @property { number } quantity Count of cargos for this type * @property { string } description Comma-joined transport unit numbers or custom description */ -export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), quantity: z.number().describe("Count of cargos for this type"), description: z.string().describe("Comma-joined transport unit numbers or custom description") }).readonly(); +export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string(), quantity: z.number(), description: z.string() }); export type SummaryCargoItemDto = z.infer; - /** * SummaryCargoBlockResponseDtoSchema * @type { object } * @property { SummaryCargoItemDto[] } items */ -export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema).readonly() }).readonly(); +export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema) }); export type SummaryCargoBlockResponseDto = z.infer; - /** * PositionAccountItemTypeEnumSchema * @type { enum } @@ -471,10 +446,9 @@ export const PositionAccountItemTypeEnum = PositionAccountItemTypeEnumSchema.enu * @property { number } buyExchangeRate Buy exchange rate * @property { number } quantity Quantity */ -export const FinanceRowDtoSchema = z.object({ id: z.string().describe("Finance row ID"), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), chargeType: z.string().describe("Charge type").nullish(), additionalText: z.string().describe("Additional text").nullish(), text: z.string().describe("Text content").nullish(), buyAmount: z.number().describe("Buy amount").nullish(), buyCurrencyNotation: z.string().describe("Buy currency notation").nullish(), sellAmount: z.number().describe("Sell amount").nullish(), sellCurrencyNotation: z.string().describe("Sell currency notation").nullish(), buyBPName: z.string().describe("Buy business partner name").nullish(), sellBPName: z.string().describe("Sell business partner name").nullish(), sellExchangeRate: z.number().describe("Sell exchange rate").nullish(), buyExchangeRate: z.number().describe("Buy exchange rate").nullish(), quantity: z.number().describe("Quantity").nullish() }).readonly(); +export const FinanceRowDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionAccountItemTypeEnumSchema, chargeType: z.string().nullish(), additionalText: z.string().nullish(), text: z.string().nullish(), buyAmount: z.number().nullish(), buyCurrencyNotation: z.string().nullish(), sellAmount: z.number().nullish(), sellCurrencyNotation: z.string().nullish(), buyBPName: z.string().nullish(), sellBPName: z.string().nullish(), sellExchangeRate: z.number().nullish(), buyExchangeRate: z.number().nullish(), quantity: z.number().nullish() }); export type FinanceRowDto = z.infer; - /** * FinanceTotalsDtoSchema * @type { object } @@ -483,10 +457,9 @@ export type FinanceRowDto = z.infer; * @property { number } combinedTotal Combined total * @property { string } currencyNotation Currency notation */ -export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().describe("Customer total"), vendorTotal: z.number().describe("Vendor total"), combinedTotal: z.number().describe("Combined total"), currencyNotation: z.string().describe("Currency notation") }).readonly(); +export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().nullable(), vendorTotal: z.number().nullable(), combinedTotal: z.number().nullable(), currencyNotation: z.string().nullable() }).partial(); export type FinanceTotalsDto = z.infer; - /** * FinanceTotalsByCurrencyDtoSchema * @type { object } @@ -494,10 +467,9 @@ export type FinanceTotalsDto = z.infer; * @property { number } vendorTotal Total for vendor side in this currency * @property { number } customerTotal Total for customer side in this currency */ -export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string().describe("Currency notation"), vendorTotal: z.number().describe("Total for vendor side in this currency").nullish(), customerTotal: z.number().describe("Total for customer side in this currency").nullish() }).readonly(); +export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string(), vendorTotal: z.number().nullish(), customerTotal: z.number().nullish() }); export type FinanceTotalsByCurrencyDto = z.infer; - /** * FinanceTablePositionDtoSchema * @type { object } @@ -508,10 +480,9 @@ export type FinanceTotalsByCurrencyDto = z.infer; - /** * FinanceTableBlockDtoSchema * @type { object } @@ -537,10 +508,9 @@ export type FinanceTablePositionDto = z.infer; - /** * RemarkBlockDtoSchema * @type { object } @@ -549,10 +519,9 @@ export type FinanceTableBlockDto = z.infer; * @property { EditorContentUpdateDto } content * @property { boolean } enabled */ -export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }).readonly(); +export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }); export type RemarkBlockDto = z.infer; - /** * ConfigBlockDtoSchema * @type { object } @@ -561,29 +530,26 @@ export type RemarkBlockDto = z.infer; * @property { boolean } showWatermarkOnDocuments Show watermark on documents * @property { LocaleEnum } locale */ -export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), showWatermarkOnDocuments: z.boolean().describe("Show watermark on documents"), locale: CommonModels.LocaleEnumSchema }).readonly(); +export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable(), showWatermarkOnDocuments: z.boolean().nullable(), locale: CommonModels.LocaleEnumSchema.nullable() }).partial(); export type ConfigBlockDto = z.infer; - /** * TitleBlockUpdateDtoSchema * @type { object } * @property { string } value Title value */ -export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().describe("Title value") }).readonly(); +export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().nullable() }).partial(); export type TitleBlockUpdateDto = z.infer; - /** * ReceiverBlockUpdateDtoSchema * @type { object } * @property { string } selectedBpId Receiver business partner ID * @property { string } address Receiver address */ -export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Receiver business partner ID"), address: z.string().describe("Receiver address") }).readonly(); +export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().nullable(), address: z.string().nullable() }).partial(); export type ReceiverBlockUpdateDto = z.infer; - /** * OurInformationBlockUpdateDtoSchema * @type { object } @@ -596,19 +562,17 @@ export type ReceiverBlockUpdateDto = z.infer; - /** * TermsBlockDtoSchema * @type { object } * @property { string } termsImageUrl Terms image URL */ -export const TermsBlockDtoSchema = z.object({ termsImageUrl: z.string().describe("Terms image URL") }).readonly(); +export const TermsBlockDtoSchema = z.object({ termsImageUrl: z.string().nullable() }).partial(); export type TermsBlockDto = z.infer; - /** * CutOffDatesBlockUpdateDtoSchema * @type { object } @@ -617,10 +581,9 @@ export type TermsBlockDto = z.infer; * @property { string } customsAMS Customs AMS date * @property { string } vgmCustomer VGM customer date */ -export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().describe("Bill of lading from customer date"), billOfLadingToCarrier: z.string().describe("Bill of lading to carrier date"), customsAMS: z.string().describe("Customs AMS date"), vgmCustomer: z.string().describe("VGM customer date") }).readonly(); +export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().nullable(), billOfLadingToCarrier: z.string().nullable(), customsAMS: z.string().nullable(), vgmCustomer: z.string().nullable() }).partial(); export type CutOffDatesBlockUpdateDto = z.infer; - /** * TemplatedDocumentDataDtoSchema * @type { object } @@ -636,10 +599,9 @@ export type CutOffDatesBlockUpdateDto = z.infer; - /** * RouteTableUpdateBlockDtoSchema * @type { object } @@ -656,19 +618,17 @@ export type TemplatedDocumentDataDto = z.infer; - /** * CargoItemRouteUpdateDtoSchema * @type { object } * @property { string[] } selectedRoutePointIds Selected route point IDs */ -export const CargoItemRouteUpdateDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs") }).readonly(); +export const CargoItemRouteUpdateDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()) }); export type CargoItemRouteUpdateDto = z.infer; - /** * CargoItemUpdateDtoSchema * @type { object } @@ -676,10 +636,9 @@ export type CargoItemRouteUpdateDto = z.infer; - /** * CargoTableBlockUpdateDtoSchema * @type { object } @@ -710,39 +669,35 @@ export type CargoItemUpdateDto = z.infer; * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 */ -export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), items: z.array(CommonModels.CargoItemUpdateDtoSchema).readonly().describe("Cargo items for package updates"), suppressWeight: z.boolean().describe("Suppress weight column display"), showGrid: z.boolean().describe("Show grid borders in cargo table"), suppressVolume: z.boolean().describe("Suppress volume column display"), suppressSpecialities: z.boolean().describe("Suppress specialities column display"), suppressDimensions: z.boolean().describe("Suppress dimensions column display"), suppressPackageVolume: z.boolean().describe("Suppress package volume column display"), suppressPackageWeight: z.boolean().describe("Suppress package weight column display"), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullable(), showGrandTotal: z.boolean().describe("Show grand total"), showTransportUnitTotal: z.boolean().describe("Show transport unit total"), suppressCargo: z.boolean().describe("Suppress cargo table display"), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units"), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units"), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages"), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages"), showPackageHSCodes: z.boolean().describe("Show HS codes for packages"), showPackageType: z.boolean().describe("Show package type for packages"), showPackageQuantity: z.boolean().describe("Show quantity for packages"), showPackageDescription: z.boolean().describe("Show description for packages"), showPackageCaseMarks: z.boolean().describe("Show case marks for packages"), showTransportUnitNumber: z.boolean().describe("Show transport unit number"), showTransportUnitType: z.boolean().describe("Show transport unit type"), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1"), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2") }).readonly(); +export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).nullable(), items: z.array(CommonModels.CargoItemUpdateDtoSchema).nullable(), suppressWeight: z.boolean().nullable(), showGrid: z.boolean().nullable(), suppressVolume: z.boolean().nullable(), suppressSpecialities: z.boolean().nullable(), suppressDimensions: z.boolean().nullable(), suppressPackageVolume: z.boolean().nullable(), suppressPackageWeight: z.boolean().nullable(), showRoute: z.boolean().nullable(), showGrandTotal: z.boolean().nullable(), showTransportUnitTotal: z.boolean().nullable(), suppressCargo: z.boolean().nullable(), showTransportUnitChargeableWeight: z.boolean().nullable(), showTransportUnitVolumetricWeight: z.boolean().nullable(), showPackageChargeableWeight: z.boolean().nullable(), showPackageVolumetricWeight: z.boolean().nullable(), showPackageHSCodes: z.boolean().nullable(), showPackageType: z.boolean().nullable(), showPackageQuantity: z.boolean().nullable(), showPackageDescription: z.boolean().nullable(), showPackageCaseMarks: z.boolean().nullable(), showTransportUnitNumber: z.boolean().nullable(), showTransportUnitType: z.boolean().nullable(), showTransportUnitSeal1: z.boolean().nullable(), showTransportUnitSeal2: z.boolean().nullable() }).partial(); export type CargoTableBlockUpdateDto = z.infer; - /** * SummaryCargoItemUpdateDtoSchema * @type { object } * @property { string } transportUnitType Cargo type name (transport unit type) * @property { string } description Updated description for this cargo type */ -export const SummaryCargoItemUpdateDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), description: z.string().describe("Updated description for this cargo type") }).readonly(); +export const SummaryCargoItemUpdateDtoSchema = z.object({ transportUnitType: z.string(), description: z.string() }); export type SummaryCargoItemUpdateDto = z.infer; - /** * SummaryCargoBlockUpdateDtoSchema * @type { object } * @property { SummaryCargoItemUpdateDto[] } items */ -export const SummaryCargoBlockUpdateDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemUpdateDtoSchema).readonly() }).readonly(); +export const SummaryCargoBlockUpdateDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemUpdateDtoSchema) }); export type SummaryCargoBlockUpdateDto = z.infer; - /** * FinanceTablePositionUpdateDtoSchema * @type { object } * @property { string[] } selectedFinanceRowIds Selected finance row IDs * @property { string } positionId Position ID */ -export const FinanceTablePositionUpdateDtoSchema = z.object({ selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID") }).readonly(); +export const FinanceTablePositionUpdateDtoSchema = z.object({ selectedFinanceRowIds: z.array(z.string()).nullable(), positionId: z.string().nullable() }).partial(); export type FinanceTablePositionUpdateDto = z.infer; - /** * FinanceTableBlockUpdateDtoSchema * @type { object } @@ -766,10 +721,9 @@ export type FinanceTablePositionUpdateDto = z.infer; - /** * RemarkBlockUpdateDtoSchema * @type { object } @@ -778,10 +732,9 @@ export type FinanceTableBlockUpdateDto = z.infer; - /** * TemplatedDocumentDataUpdateDtoSchema * @type { object } @@ -795,10 +748,9 @@ export type RemarkBlockUpdateDto = z.infer; * @property { RemarkBlockUpdateDto[] } remarks Remark blocks * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data */ -export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).readonly().describe("Remark blocks"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); +export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.nullable(), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.nullable(), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.nullable(), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.nullable(), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.nullable(), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).nullable(), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.nullable() }).partial(); export type TemplatedDocumentDataUpdateDto = z.infer; - /** * BusinessPartnerTypeSchema * @type { enum } @@ -813,10 +765,9 @@ export const BusinessPartnerType = BusinessPartnerTypeSchema.enum; * @property { string } id * @property { string } name */ -export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }); export type BusinessPartnerAddressCityDto = z.infer; - /** * BusinessPartnerAddressCountryDtoSchema * @type { object } @@ -825,10 +776,9 @@ export type BusinessPartnerAddressCityDto = z.infer; - /** * BusinessPartnerAddressResponseDTOSchema * @type { object } @@ -840,10 +790,9 @@ export type BusinessPartnerAddressCountryDto = z.infer; - /** * EditorContentResponseDtoSchema * @type { object } @@ -851,10 +800,9 @@ export type BusinessPartnerAddressResponseDTO = z.infer; - /** * DunningSystemReferenceDTOSchema * @type { object } @@ -862,10 +810,9 @@ export type EditorContentResponseDto = z.infer; - /** * TransportModeEnumSchema * @type { enum } @@ -891,20 +838,18 @@ export const SeaRoutingEnum = SeaRoutingEnumSchema.enum; * @property { string } label * @property { BusinessPartnerAddressResponseDTO } address Main address information */ -export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information").nullish() }).readonly(); +export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.nullish() }); export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; - /** * InvolvedPartyContactResponseDTOSchema * @type { object } * @property { string } id * @property { string } name */ -export const InvolvedPartyContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const InvolvedPartyContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); export type InvolvedPartyContactResponseDTO = z.infer; - /** * InvolvedPartyResponseDtoSchema * @type { object } @@ -914,19 +859,17 @@ export type InvolvedPartyContactResponseDTO = z.infer; - /** * CreateInvolvedPartyRequestDtoSchema * @type { object } * @property { PositionInvolvedPartyTypeEnum } type Type of the involved party to create */ -export const CreateInvolvedPartyRequestDtoSchema = z.object({ type: CommonModels.PositionInvolvedPartyTypeEnumSchema.describe("Type of the involved party to create") }).readonly(); +export const CreateInvolvedPartyRequestDtoSchema = z.object({ type: CommonModels.PositionInvolvedPartyTypeEnumSchema }); export type CreateInvolvedPartyRequestDto = z.infer; - /** * RouteLocationTypeEnumSchema * @type { enum } @@ -942,10 +885,9 @@ export const RouteLocationTypeEnum = RouteLocationTypeEnumSchema.enum; * @property { string } name * @property { RouteLocationTypeEnum } type */ -export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }).readonly(); +export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }); export type RoutePointLocationResponseDto = z.infer; - /** * RoutePointTypeEnumSchema * @type { enum } @@ -976,10 +918,9 @@ export const PositionRouteTransportModeEnum = PositionRouteTransportModeEnumSche * @property { string } id * @property { string } name */ -export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); export type RoutePointProviderResponseDto = z.infer; - /** * RoutePointResponseDtoSchema * @type { object } @@ -999,10 +940,9 @@ export type RoutePointProviderResponseDto = z.infer; - /** * RouteResponseDtoSchema * @type { object } @@ -1011,29 +951,26 @@ export type RoutePointResponseDto = z.infer; * @property { string } cargoNumber Cargo number (sea positions only) * @property { RoutePointResponseDto[] } points */ -export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().describe("Cargo ID (sea positions only)").nullish(), cargoNumber: z.string().describe("Cargo number (sea positions only)").nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema).readonly() }).readonly(); +export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().nullish(), cargoNumber: z.string().nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema) }); export type RouteResponseDto = z.infer; - /** * RouteListResponseDtoSchema * @type { object } * @property { RouteResponseDto[] } routes * @property { boolean } splitRoute Whether the position routes are split by cargo (sea positions only) */ -export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema).readonly(), splitRoute: z.boolean().describe("Whether the position routes are split by cargo (sea positions only)") }).readonly(); +export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema), splitRoute: z.boolean() }); export type RouteListResponseDto = z.infer; - /** * CreateRoutePointRequestDtoSchema * @type { object } * @property { RoutePointTypeEnum } type */ -export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }).readonly(); +export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }); export type CreateRoutePointRequestDto = z.infer; - /** * UpdateRoutePointRequestDtoSchema * @type { object } @@ -1050,10 +987,9 @@ export type CreateRoutePointRequestDto = z.infer; - /** * PositionChargeDtoResponseSchema * @type { object } @@ -1093,19 +1029,17 @@ export type UpdateRoutePointRequestDto = z.infer; - /** * PositionTextDtoResponseSchema * @type { object } * @property { string } content Text content */ -export const PositionTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); +export const PositionTextDtoResponseSchema = z.object({ content: z.string() }); export type PositionTextDtoResponse = z.infer; - /** * PositionAccountItemDtoResponseSchema * @type { object } @@ -1119,20 +1053,18 @@ export type PositionTextDtoResponse = z.infer; - /** * UserPreviewDtoSchema * @type { object } * @property { string } userId * @property { string } name */ -export const UserPreviewDtoSchema = z.object({ userId: z.string(), name: z.string() }).readonly(); +export const UserPreviewDtoSchema = z.object({ userId: z.string(), name: z.string() }); export type UserPreviewDto = z.infer; - /** * HBLDocumentConfigDtoSchema * @type { object } @@ -1142,10 +1074,9 @@ export type UserPreviewDto = z.infer; * @property { string } signatureImageUrl Signature image URL * @property { boolean } hasSignatureImage Whether office has a signature image configured */ -export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), blTermsAndConditionsImageUrl: z.string().describe("BL terms and conditions image URL"), signatureImageUrl: z.string().describe("Signature image URL"), hasSignatureImage: z.boolean().describe("Whether office has a signature image configured") }).readonly(); +export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable(), blTermsAndConditionsImageUrl: z.string().nullable(), signatureImageUrl: z.string().nullable(), hasSignatureImage: z.boolean().nullable() }).partial(); export type HBLDocumentConfigDto = z.infer; - /** * DirectionEnumSchema * @type { enum } @@ -1181,40 +1112,36 @@ export const HazardousPackingGroupEnum = HazardousPackingGroupEnumSchema.enum; * @property { string } emergencyPhone * @property { string } emergencySchedule */ -export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number(), totalWidth: z.number(), temperature: z.number(), unNumber: z.string(), IMOClass: z.string(), shippingName: z.string(), technicalName: z.string(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema, netWeight: z.number(), flashpoint: z.number(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly(), acceptanceNumber: z.string(), medGuide: z.string(), emergencyPhone: z.string(), emergencySchedule: z.string() }).readonly(); +export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number().nullable(), totalWidth: z.number().nullable(), temperature: z.number().nullable(), unNumber: z.string().nullable(), IMOClass: z.string().nullable(), shippingName: z.string().nullable(), technicalName: z.string().nullable(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.nullable(), netWeight: z.number().nullable(), flashpoint: z.number().nullable(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).nullable(), acceptanceNumber: z.string().nullable(), medGuide: z.string().nullable(), emergencyPhone: z.string().nullable(), emergencySchedule: z.string().nullable() }).partial(); export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; - /** * PositionCargoPackageTypeResponseDTOSchema * @type { object } * @property { string } id * @property { string } name */ -export const PositionCargoPackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const PositionCargoPackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); export type PositionCargoPackageTypeResponseDTO = z.infer; - /** * HsCodeLabelDtoSchema * @type { object } * @property { string } id * @property { string } label */ -export const HsCodeLabelDtoSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export const HsCodeLabelDtoSchema = z.object({ id: z.string(), label: z.string() }); export type HsCodeLabelDto = z.infer; - /** * PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema * @type { object } * @property { number } temperatureFrom * @property { number } temperatureUntil */ -export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number().nullable(), temperatureUntil: z.number().nullable() }).partial(); export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.infer; - /** * PositionCargoSourcePackageResponseDTOSchema * @type { object } @@ -1222,10 +1149,9 @@ export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.in * @property { string } positionId * @property { string } positionNumber */ -export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }).readonly(); +export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }); export type PositionCargoSourcePackageResponseDTO = z.infer; - /** * PositionCargoPackageResponseDTOSchema * @type { object } @@ -1264,10 +1190,9 @@ export type PositionCargoSourcePackageResponseDTO = z.infer; - /** * PackageTotalsDtoSchema * @type { object } @@ -1277,10 +1202,9 @@ export type PositionCargoPackageResponseDTO = z.infer; - /** * PackageSpecialtyTotalsResponseDtoSchema * @type { object } @@ -1292,10 +1216,9 @@ export type PackageTotalsDto = z.infer; * @property { PackageTotalsDto } oversized * @property { PackageTotalsDto } total */ -export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }).readonly(); +export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }); export type PackageSpecialtyTotalsResponseDto = z.infer; - /** * PositionCargoCargoTypeResponseDTOSchema * @type { object } @@ -1303,10 +1226,9 @@ export type PackageSpecialtyTotalsResponseDto = z.infer; - /** * PositionCargoResponseDTOSchema * @type { object } @@ -1342,10 +1264,9 @@ export type PositionCargoCargoTypeResponseDTO = z.infer; - /** * HazardousSpecialtyDTOSchema * @type { object } @@ -1365,20 +1286,18 @@ export type PositionCargoResponseDTO = z.infer; - /** * TemperatureControlledSpecialtyDtoSchema * @type { object } * @property { number } temperatureFrom * @property { number } temperatureUntil */ -export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number().nullable(), temperatureUntil: z.number().nullable() }).partial(); export type TemperatureControlledSpecialtyDto = z.infer; - /** * CreatePositionCargoPackageDTOSchema * @type { object } @@ -1407,10 +1326,9 @@ export type TemperatureControlledSpecialtyDto = z.infer; - /** * UpdatePositionCargoPackageDTOSchema * @type { object } @@ -1440,10 +1358,9 @@ export type CreatePositionCargoPackageDTO = z.infer; - /** * QuantityOfOriginalBlDocumentsEnumSchema * @type { enum } @@ -1474,10 +1391,9 @@ export const ChargePaymentEnum = ChargePaymentEnumSchema.enum; * @property { string } footerImageUrl Footer image URL * @property { string } headerImageUrl Header image URL */ -export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL") }).readonly(); +export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable() }).partial(); export type DocumentConfigDTO = z.infer; - /** * EmployeeRoleContextSchema * @type { enum } @@ -1496,10 +1412,9 @@ export const EmployeeRoleContext = EmployeeRoleContextSchema.enum; * @property { string } context Role context * @property { string[] } permissions Permissions associated with the role */ -export const EmployeeRoleResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export const EmployeeRoleResponseSchema = z.object({ id: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.nullish(), permissions: z.array(z.string()) }); export type EmployeeRoleResponse = z.infer; - /** * EmploymentEmployeeResponseSchema * @type { object } @@ -1511,20 +1426,18 @@ export type EmployeeRoleResponse = z.infer; * @property { boolean } archived Archived * @property { EmployeeRoleResponse[] } roles Global Roles */ -export const EmploymentEmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish() }).readonly(); +export const EmploymentEmployeeResponseSchema = z.object({ id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), phone: z.string().nullish(), archived: z.boolean().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).nullish() }); export type EmploymentEmployeeResponse = z.infer; - /** * EmployeeOfficeResponseSchema * @type { object } * @property { string } id * @property { string } name */ -export const EmployeeOfficeResponseSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const EmployeeOfficeResponseSchema = z.object({ id: z.string(), name: z.string() }); export type EmployeeOfficeResponse = z.infer; - /** * EmploymentResponseSchema * @type { object } @@ -1537,10 +1450,9 @@ export type EmployeeOfficeResponse = z.infer; - /** * LoadTypeEnumSchema * @type { enum } @@ -1563,10 +1475,9 @@ export const ServiceTypeEnum = ServiceTypeEnumSchema.enum; * @property { string } start * @property { string } end */ -export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }), end: z.iso.datetime({ offset: true }) }).readonly(); +export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }).nullable(), end: z.iso.datetime({ offset: true }).nullable() }).partial(); export type DateRangeDto = z.infer; - /** * BusinessPartnerLabelResponseDTOSchema * @type { object } @@ -1574,10 +1485,9 @@ export type DateRangeDto = z.infer; * @property { string } label * @property { BusinessPartnerType[] } types Array of business partner types */ -export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); +export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema) }); export type BusinessPartnerLabelResponseDTO = z.infer; - /** * SectionEnumSchema * @type { enum } @@ -1666,10 +1576,9 @@ export const InvoiceStatusEnum = InvoiceStatusEnumSchema.enum; * @property { string } creditorId Filter invoices by creditor ID (substring match) * @property { string } debtorId Filter invoices by debtor ID (substring match) */ -export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), vatRule: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer IDs (UUID)"), receiverCountry: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer country IDs"), salesRep: z.array(z.string()).readonly().describe("Filter by sales rep id"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number(), externalSystemId: z.string().describe("Filter invoices by position external system ID (substring match)"), hblNumber: z.string().describe("Filter invoices by HBL/HAWB (substring match)"), mblNumber: z.string().describe("Filter invoices by MBL/MAWB (substring match)"), bookingNumber: z.string().describe("Filter invoices by booking number (substring match)"), vessel: z.string().describe("Filter invoices by vessel name (substring match)"), voyage: z.string().describe("Filter invoices by voyage number (substring match)"), creditorId: z.string().describe("Filter invoices by creditor ID (substring match)"), debtorId: z.string().describe("Filter invoices by debtor ID (substring match)") }).readonly(); +export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string().nullable(), issuingDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).nullable(), collective: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), amountMin: z.number().nullable(), amountMax: z.number().nullable(), currencyNotation: z.array(z.string()).nullable(), vatRule: z.array(z.string()).nullable(), dueDate: CommonModels.DateRangeDtoSchema.nullable(), status: z.array(CommonModels.InvoiceStatusEnumSchema).nullable(), receiver: z.array(z.string()).nullable(), receiverCountry: z.array(z.string()).nullable(), salesRep: z.array(z.string()).nullable(), positionNumbersString: z.string().nullable(), positionNumbers: z.array(z.string()).nullable(), invoiceNumbersString: z.string().nullable(), invoiceNumbers: z.array(z.string()).nullable(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceNumberMin: z.number().nullable(), invoiceNumberMax: z.number().nullable(), internalNumberMin: z.number().nullable(), internalNumberMax: z.number().nullable(), externalSystemId: z.string().nullable(), hblNumber: z.string().nullable(), mblNumber: z.string().nullable(), bookingNumber: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), creditorId: z.string().nullable(), debtorId: z.string().nullable() }).partial(); export type OfficeInvoiceFilterDto = z.infer; - /** * PositionStatusEnumSchema * @type { enum } @@ -1684,30 +1593,27 @@ export const PositionStatusEnum = PositionStatusEnumSchema.enum; * @property { string } id * @property { string } name */ -export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); export type PositionCustomerDto = z.infer; - /** * PositionQuoteDtoSchema * @type { object } * @property { string } id * @property { string } number */ -export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }); export type PositionQuoteDto = z.infer; - /** * ParentPositionDtoSchema * @type { object } * @property { string } id * @property { string } number */ -export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }); export type ParentPositionDto = z.infer; - /** * PositionTypeEnumSchema * @type { enum } @@ -1722,20 +1628,18 @@ export const PositionTypeEnum = PositionTypeEnumSchema.enum; * @property { string } id * @property { string } name */ -export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }); export type PositionProjectLiteDto = z.infer; - /** * EmployeeDtoSchema * @type { object } * @property { string } id * @property { string } name */ -export const EmployeeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const EmployeeDtoSchema = z.object({ id: z.string(), name: z.string() }); export type EmployeeDto = z.infer; - /** * PositionCoreResponseDtoSchema * @type { object } @@ -1784,10 +1688,9 @@ export type EmployeeDto = z.infer; * @property { EditorContentResponseDto } notes Notes * @property { number } volumetricWeightModifier Volumetric weight modifier */ -export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); +export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.nullish(), volumetricWeightModifier: z.number().nullish() }); export type PositionCoreResponseDto = z.infer; - /** * VesselDtoSchema * @type { object } @@ -1795,10 +1698,9 @@ export type PositionCoreResponseDto = z.infer; - /** * StatusResponseDtoSchema * @type { object } @@ -1806,10 +1708,9 @@ export type VesselDto = z.infer; * @property { string } message Message * @property { string } code Alphanumeric code of the message type */ -export const StatusResponseDtoSchema = z.object({ status: z.string().describe("Status"), message: z.string().describe("Message"), code: z.string().describe("Alphanumeric code of the message type") }).readonly(); +export const StatusResponseDtoSchema = z.object({ status: z.string(), message: z.string(), code: z.string() }); export type StatusResponseDto = z.infer; - /** * PaginationDtoSchema * @type { object } @@ -1820,30 +1721,27 @@ export type StatusResponseDto = z.infer; * @property { number } limit Items per response * @property { number } totalItems Total available items */ -export const PaginationDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export const PaginationDtoSchema = z.object({ items: z.array(z.string()), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); export type PaginationDto = z.infer; - /** * LabelResponseDTOSchema * @type { object } * @property { string } id * @property { string } label */ -export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }); export type LabelResponseDTO = z.infer; - /** * GenerateWorkingDocumentRequestDtoSchema * @type { object } * @property { string } issuedAt * @property { string } fileName */ -export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); +export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }); export type GenerateWorkingDocumentRequestDto = z.infer; - /** * UpdateInvolvedPartyDtoSchema * @type { object } @@ -1851,38 +1749,34 @@ export type GenerateWorkingDocumentRequestDto = z.infer; - /** * MergeRoutesRequestDtoSchema * @type { object } * @property { string } sourceCargoId Source cargo ID to merge from (sea positions only) */ -export const MergeRoutesRequestDtoSchema = z.object({ sourceCargoId: z.string().describe("Source cargo ID to merge from (sea positions only)").nullable() }).readonly(); +export const MergeRoutesRequestDtoSchema = z.object({ sourceCargoId: z.string().nullable() }); export type MergeRoutesRequestDto = z.infer; - /** * CopyRouteRequestDtoSchema * @type { object } * @property { string } targetCargoId Target cargo ID to copy to (sea positions only) */ -export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to copy to (sea positions only)").nullable() }).readonly(); +export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().nullable() }); export type CopyRouteRequestDto = z.infer; - /** * CargoSummaryResponseDTOSchema * @type { object } * @property { string } transportUnitTypeName Transport unit type name (e.g., "40' DRY", "20'") * @property { number } quantity Total quantity of this transport unit type */ -export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string().describe("Transport unit type name (e.g., "40' DRY", "20'")"), quantity: z.number().describe("Total quantity of this transport unit type") }).readonly(); +export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string(), quantity: z.number() }); export type CargoSummaryResponseDTO = z.infer; - /** * CreatePositionCargoDTOSchema * @type { object } @@ -1908,10 +1802,9 @@ export type CargoSummaryResponseDTO = z.infer; - /** * UpdatePositionCargoDTOSchema * @type { object } @@ -1937,19 +1830,17 @@ export type CreatePositionCargoDTO = z.infer; - /** * MovePositionCargoPackageRequestDTOSchema * @type { object } * @property { string } targetCargoId Target cargo ID to move the package to */ -export const MovePositionCargoPackageRequestDTOSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to move the package to") }).readonly(); +export const MovePositionCargoPackageRequestDTOSchema = z.object({ targetCargoId: z.string() }); export type MovePositionCargoPackageRequestDTO = z.infer; - /** * PositionCargoPaginationOrderFieldSchema * @type { enum } diff --git a/test/generated/base/containerYards/containerYards.acl.ts b/test/generated/base/containerYards/containerYards.acl.ts index daa83f7..f4e07a4 100644 --- a/test/generated/base/containerYards/containerYards.acl.ts +++ b/test/generated/base/containerYards/containerYards.acl.ts @@ -1,51 +1,84 @@ import { AbilityTuple } from "@casl/ability"; export namespace ContainerYardsAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "ContainerYard"] as AbilityTuple<"Create", "ContainerYard">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; - - /** - * Use for `useGetLabelById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetLabelById` query - */ - export const canUseGetLabelById = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "ContainerYard" +] as AbilityTuple<"Create", "ContainerYard">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +/** + * Use for `useGetLabelById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetLabelById` query + */ +export const canUseGetLabelById = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Update", + "ContainerYard" +] as AbilityTuple<"Update", "ContainerYard">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Update", + "ContainerYard" +] as AbilityTuple<"Update", "ContainerYard">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "ContainerYard" +] as AbilityTuple<"Update", "ContainerYard">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "ContainerYard" +] as AbilityTuple<"Read", "ContainerYard">; + } diff --git a/test/generated/base/containerYards/containerYards.api.ts b/test/generated/base/containerYards/containerYards.api.ts index 8cde8f4..60ae21e 100644 --- a/test/generated/base/containerYards/containerYards.api.ts +++ b/test/generated/base/containerYards/containerYards.api.ts @@ -1,144 +1,82 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ContainerYardsModels } from "./containerYards.models"; import { CommonModels } from "@/data/common/common.models"; export namespace ContainerYardsApi { - export const paginate = ( - limit: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginate = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, - `/container-yards`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, + `/container-yards`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, ) => { return AppRestClient.post( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards`, - ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), - config, - ); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards`, + ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), + + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, - `/container-yards/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const getLabelById = (id: string, config?: AxiosRequestConfig) => { + { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, + `/container-yards/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getLabelById = (id: string, ) => { return AppRestClient.get( - { resSchema: CommonModels.LabelResponseDTOSchema }, - `/container-yards/${id}/labels`, - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.LabelResponseDTOSchema }, + `/container-yards/${id}/labels`, + + ) +}; +export const archive = (id: string, ) => { return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}/unarchive`, - undefined, - config, - ); - }; - - export const update = ( - id: string, - data: ContainerYardsModels.UpdateContainerYardRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}/unarchive`, + + ) +}; +export const update = (id: string, data: ContainerYardsModels.UpdateContainerYardRequestDTO, ) => { return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}`, - ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), - config, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}`, + ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), + + ) +}; +export const findById = (id: string, ) => { return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}`, - config, - ); - }; + { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, + `/container-yards/${id}`, + + ) +}; } diff --git a/test/generated/base/containerYards/containerYards.configs.ts b/test/generated/base/containerYards/containerYards.configs.ts index 62b81ca..4458f76 100644 --- a/test/generated/base/containerYards/containerYards.configs.ts +++ b/test/generated/base/containerYards/containerYards.configs.ts @@ -6,136 +6,137 @@ import { ContainerYardsQueries } from "./containerYards.queries"; import { ContainerYardsAcl } from "./containerYards.acl"; export namespace ContainerYardsConfigs { - export const containerYardsConfig = { +export const containerYardsConfig = { meta: { - title: "Container Yards", + title: "Container Yards", }, readAll: { - acl: ContainerYardsAcl.canUsePaginate, - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - paginated: ContainerYardsQueries.usePaginate, - infinite: ContainerYardsQueries.usePaginateInfinite, - filters: { - schema: ContainerYardsModels.ContainerYardFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ContainerYardsModels.ContainerYardFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: ContainerYardsAcl.canUsePaginate, schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - shortName: true, - name: true, - archived: true, - street: true, - secondaryStreet: true, - zip: true, - city: true, - country: true, - district: true, - additionalInformation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema, + paginated: ContainerYardsQueries.usePaginate, + infinite: ContainerYardsQueries.usePaginateInfinite, + filters: { + schema: ContainerYardsModels.ContainerYardFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ContainerYardsModels.ContainerYardFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + shortName: true, + name: true, + archived: true, + street: true, + secondaryStreet: true, + zip: true, + city: true, + country: true, + district: true, + additionalInformation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: ContainerYardsAcl.canUseFindById, - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - query: ContainerYardsQueries.useFindById, + acl: ContainerYardsAcl.canUseFindById, + schema: ContainerYardsModels.ContainerYardResponseDTOSchema, + query: ContainerYardsQueries.useFindById, }, create: { - acl: ContainerYardsAcl.canUseCreate, - schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, - mutation: ContainerYardsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: ContainerYardsAcl.canUseCreate, schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, - options: { - inputs: { - matchCode: true, - name: true, - shortName: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - additionalInformation: true, - }, - }, - }), + mutation: ContainerYardsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, + options: { + inputs: { + matchCode: true, + name: true, + shortName: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + additionalInformation: true, + }, + }, +}) }, update: { - acl: ContainerYardsAcl.canUseUpdate, - schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, - mutation: ContainerYardsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: ContainerYardsAcl.canUseUpdate, schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, - options: { - inputs: { - matchCode: true, - name: true, - shortName: true, - addressId: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - additionalInformation: true, - }, - }, - }), + mutation: ContainerYardsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, + options: { + inputs: { + matchCode: true, + name: true, + shortName: true, + addressId: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + additionalInformation: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: ContainerYardsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ContainerYardsQueries.usePaginateLabels, - infinite: ContainerYardsQueries.usePaginateLabelsInfinite, - filters: { - schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: ContainerYardsAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema, + paginated: ContainerYardsQueries.usePaginateLabels, + infinite: ContainerYardsQueries.usePaginateLabelsInfinite, + filters: { + schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/containerYards/containerYards.models.ts b/test/generated/base/containerYards/containerYards.models.ts index 7deddd9..d85e878 100644 --- a/test/generated/base/containerYards/containerYards.models.ts +++ b/test/generated/base/containerYards/containerYards.models.ts @@ -2,210 +2,138 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace ContainerYardsModels { - /** - * ContainerYardEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ContainerYardEmployeeDTO = z.infer; +/** + * ContainerYardEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type ContainerYardEmployeeDTO = z.infer; - /** - * ContainerYardResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchCode Container yard match code - * @property { string } shortName Container yard short name - * @property { string } name Container yard name - * @property { boolean } archived Whether the container yard is archived - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { object } city - * @property { string } city.id - * @property { string } city.name - * @property { object } country - * @property { string } country.id - * @property { string } country.name - * @property { string } country.isoCode2 - * @property { string } country.isoCode3 - * @property { string } district District - * @property { string } additionalInformation Additional information - * @property { string } createdById - * @property { ContainerYardEmployeeDTO } createdBy - * @property { string } createdAt Date when the container yard was created - * @property { string } updatedById - * @property { ContainerYardEmployeeDTO } updatedBy - * @property { string } updatedAt Date when the container yard was last updated - */ - export const ContainerYardResponseDTOSchema = z - .object({ - id: z.string(), - matchCode: z.string().describe("Container yard match code"), - shortName: z.string().describe("Container yard short name").nullish(), - name: z.string().describe("Container yard name"), - archived: z.boolean().describe("Whether the container yard is archived"), - street: z.string().describe("Street address").nullish(), - secondaryStreet: z.string().describe("Secondary street address").nullish(), - zip: z.string().describe("ZIP/Postal code").nullish(), - city: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), - country: z - .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) - .readonly() - .nullish(), - district: z.string().describe("District").nullish(), - additionalInformation: z.string().describe("Additional information").nullish(), - createdById: z.string().nullish(), - createdBy: ContainerYardEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was created"), - updatedById: z.string().nullish(), - updatedBy: ContainerYardEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was last updated"), - }) - .readonly(); - export type ContainerYardResponseDTO = z.infer; +/** + * ContainerYardResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchCode Container yard match code + * @property { string } shortName Container yard short name + * @property { string } name Container yard name + * @property { boolean } archived Whether the container yard is archived + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { object } city + * @property { string } city.id + * @property { string } city.name + * @property { object } country + * @property { string } country.id + * @property { string } country.name + * @property { string } country.isoCode2 + * @property { string } country.isoCode3 + * @property { string } district District + * @property { string } additionalInformation Additional information + * @property { string } createdById + * @property { ContainerYardEmployeeDTO } createdBy + * @property { string } createdAt Date when the container yard was created + * @property { string } updatedById + * @property { ContainerYardEmployeeDTO } updatedBy + * @property { string } updatedAt Date when the container yard was last updated + */ +export const ContainerYardResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), shortName: z.string().nullish(), name: z.string(), archived: z.boolean(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: z.object({ id: z.string(), name: z.string() }).nullish(), country: z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).nullish(), district: z.string().nullish(), additionalInformation: z.string().nullish(), createdById: z.string().nullish(), createdBy: ContainerYardEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ContainerYardEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type ContainerYardResponseDTO = z.infer; - /** - * ContainerYardFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ - export const ContainerYardFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); - export type ContainerYardFilterDto = z.infer; +/** + * ContainerYardFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ContainerYardFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); +export type ContainerYardFilterDto = z.infer; - /** - * ContainerYardLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const ContainerYardLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type ContainerYardLabelFilterDto = z.infer; +/** + * ContainerYardLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const ContainerYardLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type ContainerYardLabelFilterDto = z.infer; - /** - * CreateContainerYardRequestDTOSchema - * @type { object } - * @property { string } matchCode Match code - * @property { string } name Name - * @property { string } shortName Short name - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } cityId City ID - * @property { string } countryId Country ID - * @property { string } district District - * @property { string } additionalInformation Additional information - */ - export const CreateContainerYardRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Match code"), - name: z.string().describe("Name"), - shortName: z.string().describe("Short name").nullish(), - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street address").nullish(), - zip: z.string().describe("ZIP/Postal code"), - cityId: z.string().describe("City ID"), - countryId: z.string().describe("Country ID"), - district: z.string().describe("District").nullish(), - additionalInformation: z.string().describe("Additional information").nullish(), - }) - .readonly(); - export type CreateContainerYardRequestDTO = z.infer; +/** + * CreateContainerYardRequestDTOSchema + * @type { object } + * @property { string } matchCode Match code + * @property { string } name Name + * @property { string } shortName Short name + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } cityId City ID + * @property { string } countryId Country ID + * @property { string } district District + * @property { string } additionalInformation Additional information + */ +export const CreateContainerYardRequestDTOSchema = z.object({ matchCode: z.string(), name: z.string(), shortName: z.string().nullish(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string().nullish(), additionalInformation: z.string().nullish() }); +export type CreateContainerYardRequestDTO = z.infer; - /** - * UpdateContainerYardRequestDTOSchema - * @type { object } - * @property { string } matchCode Match code - * @property { string } name Name - * @property { string } shortName Short name - * @property { string } addressId Address ID - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } cityId City ID - * @property { string } countryId Country ID - * @property { string } district District - * @property { string } additionalInformation Additional information - */ - export const UpdateContainerYardRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Match code"), - name: z.string().describe("Name"), - shortName: z.string().describe("Short name"), - addressId: z.string().describe("Address ID"), - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street address"), - zip: z.string().describe("ZIP/Postal code"), - cityId: z.string().describe("City ID"), - countryId: z.string().describe("Country ID"), - district: z.string().describe("District"), - additionalInformation: z.string().describe("Additional information"), - }) - .readonly(); - export type UpdateContainerYardRequestDTO = z.infer; +/** + * UpdateContainerYardRequestDTOSchema + * @type { object } + * @property { string } matchCode Match code + * @property { string } name Name + * @property { string } shortName Short name + * @property { string } addressId Address ID + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } cityId City ID + * @property { string } countryId Country ID + * @property { string } district District + * @property { string } additionalInformation Additional information + */ +export const UpdateContainerYardRequestDTOSchema = z.object({ matchCode: z.string().nullable(), name: z.string().nullable(), shortName: z.string().nullable(), addressId: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable(), additionalInformation: z.string().nullable() }).partial(); +export type UpdateContainerYardRequestDTO = z.infer; - /** - * ContainerYardsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const ContainerYardsPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ContainerYardsPaginateOrderParamEnum = z.infer; - export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderParamEnumSchema.enum; +/** + * ContainerYardsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const ContainerYardsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ContainerYardsPaginateOrderParamEnum = z.infer; +export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderParamEnumSchema.enum; - /** - * ContainerYardsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ContainerYardResponseDTO[] } items - */ - export const ContainerYardsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ContainerYardResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ContainerYardsPaginateResponse = z.infer; +/** + * ContainerYardsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ContainerYardResponseDTO[] } items + */ +export const ContainerYardsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerYardResponseDTOSchema).nullable() }).partial().shape }); +export type ContainerYardsPaginateResponse = z.infer; - /** - * ContainerYardsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const ContainerYardsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ContainerYardsPaginateLabelsOrderParamEnum = z.infer< - typeof ContainerYardsPaginateLabelsOrderParamEnumSchema - >; - export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginateLabelsOrderParamEnumSchema.enum; +/** + * ContainerYardsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const ContainerYardsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ContainerYardsPaginateLabelsOrderParamEnum = z.infer; +export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * ContainerYardsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const ContainerYardsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type ContainerYardsPaginateLabelsResponse = z.infer; - /** - * ContainerYardsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const ContainerYardsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ContainerYardsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/containerYards/containerYards.queries.ts b/test/generated/base/containerYards/containerYards.queries.ts index 1f81835..97b958b 100644 --- a/test/generated/base/containerYards/containerYards.queries.ts +++ b/test/generated/base/containerYards/containerYards.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,384 +8,279 @@ import { ContainerYardsModels } from "./containerYards.models"; import { ContainerYardsApi } from "./containerYards.api"; export namespace ContainerYardsQueries { - export const moduleName = QueryModule.ContainerYards; +export const moduleName = QueryModule.ContainerYards; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/container-yards", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardFilterDto, - cursor?: string, - ) => [...keys.all, "/container-yards", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/container-yards/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/container-yards/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string) => [...keys.all, "/container-yards", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", "infinite", limit, order, filter, cursor] as const, getLabelById: (id: string) => [...keys.all, "/container-yards/:id/labels", id] as const, findById: (id: string) => [...keys.all, "/container-yards/:id", id] as const, - }; +}; - /** - * Query `usePaginate` - * @summary Paginate Container Yards - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ContainerYardsModels.ContainerYardFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginate` + * @summary Paginate Container Yards + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUsePaginate()); + return ContainerYardsApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Container Yards - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ContainerYardsModels.ContainerYardFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Container Yards + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create container yard - * @permission Requires `canUseCreate` ability - * @param { ContainerYardsModels.CreateContainerYardRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof ContainerYardsApi.create, - { data: ContainerYardsModels.CreateContainerYardRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ContainerYardsAcl.canUsePaginate()); + return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(ContainerYardsAcl.canUseCreate()); - return ContainerYardsApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useCreate` + * @summary Create container yard + * @permission Requires `canUseCreate` ability + * @param { ContainerYardsModels.CreateContainerYardRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `usePaginateLabels` - * @summary Paginate container yard labels (id and name) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ContainerYardsModels.ContainerYardLabelFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(ContainerYardsAcl.canUseCreate()); + return ContainerYardsApi.create(data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate container yard labels (id and name) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ContainerYardsModels.ContainerYardLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginateLabels` + * @summary Paginate container yard labels (id and name) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUsePaginateLabels()); + return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate container yard labels (id and name) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Query `useGetLabelById` - * @summary Get container yard by ID with label format (id and formatted name) - * @permission Requires `canUseGetLabelById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetLabelById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ContainerYardsAcl.canUsePaginateLabels()); + return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getLabelById(id), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUseGetLabelById()); - return ContainerYardsApi.getLabelById(id, config); - }, - ...options, - }); - }; +/** + * Query `useGetLabelById` + * @summary Get container yard by ID with label format (id and formatted name) + * @permission Requires `canUseGetLabelById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetLabelById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getLabelById(id), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUseGetLabelById()); + return ContainerYardsApi.getLabelById(id) }, + ...options, + }); +}; - /** - * Mutation `useArchive` - * @summary Archive container yard - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useArchive` + * @summary Archive container yard + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ContainerYardsAcl.canUseArchive()); - return ContainerYardsApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ContainerYardsAcl.canUseArchive()); + return ContainerYardsApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useUnarchive` - * @summary Unarchive container yard - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUnarchive` + * @summary Unarchive container yard + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ContainerYardsAcl.canUseUnarchive()); - return ContainerYardsApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(ContainerYardsAcl.canUseUnarchive()); + return ContainerYardsApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useUpdate` - * @summary Update container yard - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { ContainerYardsModels.UpdateContainerYardRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ContainerYardsApi.update, - { id: string; data: ContainerYardsModels.UpdateContainerYardRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdate` + * @summary Update container yard + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { ContainerYardsModels.UpdateContainerYardRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(ContainerYardsAcl.canUseUpdate()); - return ContainerYardsApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(ContainerYardsAcl.canUseUpdate()); + return ContainerYardsApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useFindById` - * @summary Get container yard - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get container yard + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(ContainerYardsAcl.canUseFindById()); + return ContainerYardsApi.findById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUseFindById()); - return ContainerYardsApi.findById(id, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/controlTowerAuth/controlTowerAuth.api.ts b/test/generated/base/controlTowerAuth/controlTowerAuth.api.ts index abdd1bf..13804d1 100644 --- a/test/generated/base/controlTowerAuth/controlTowerAuth.api.ts +++ b/test/generated/base/controlTowerAuth/controlTowerAuth.api.ts @@ -1,24 +1,22 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerAuthModels } from "./controlTowerAuth.models"; export namespace ControlTowerAuthApi { - export const login = (data: ControlTowerAuthModels.LoginRequestDto, config?: AxiosRequestConfig) => { +export const login = (data: ControlTowerAuthModels.LoginRequestDto, ) => { return AppRestClient.post( - { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, - `/auth/move/login`, - ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), - config, - ); - }; - - export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, config?: AxiosRequestConfig) => { + { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, + `/auth/move/login`, + ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), + + ) +}; +export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, ) => { return AppRestClient.post( - { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, - `/auth/reset-password`, - ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), - config, - ); - }; + { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, + `/auth/reset-password`, + ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/controlTowerAuth/controlTowerAuth.models.ts b/test/generated/base/controlTowerAuth/controlTowerAuth.models.ts index 797b408..8cc05bd 100644 --- a/test/generated/base/controlTowerAuth/controlTowerAuth.models.ts +++ b/test/generated/base/controlTowerAuth/controlTowerAuth.models.ts @@ -1,42 +1,34 @@ import { z } from "zod"; export namespace ControlTowerAuthModels { - /** - * LoginRequestDtoSchema - * @type { object } - * @property { string } username - * @property { string } password - */ - export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }).readonly(); - export type LoginRequestDto = z.infer; +/** + * LoginRequestDtoSchema + * @type { object } + * @property { string } username + * @property { string } password + */ +export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }); +export type LoginRequestDto = z.infer; - /** - * LoginResponseDtoSchema - * @type { object } - * @property { string } accessToken - * @property { boolean } resetPasswordRequired - * @property { string } passwordResetToken - * @property { string } username - */ - export const LoginResponseDtoSchema = z - .object({ - accessToken: z.string().nullable(), - resetPasswordRequired: z.boolean().nullish(), - passwordResetToken: z.string().nullish(), - username: z.string().nullish(), - }) - .readonly(); - export type LoginResponseDto = z.infer; +/** + * LoginResponseDtoSchema + * @type { object } + * @property { string } accessToken + * @property { boolean } resetPasswordRequired + * @property { string } passwordResetToken + * @property { string } username + */ +export const LoginResponseDtoSchema = z.object({ accessToken: z.string().nullable(), resetPasswordRequired: z.boolean().nullish(), passwordResetToken: z.string().nullish(), username: z.string().nullish() }); +export type LoginResponseDto = z.infer; + +/** + * PasswordResetDtoSchema + * @type { object } + * @property { string } password + * @property { string } username + * @property { string } token + */ +export const PasswordResetDtoSchema = z.object({ password: z.string(), username: z.string(), token: z.string() }); +export type PasswordResetDto = z.infer; - /** - * PasswordResetDtoSchema - * @type { object } - * @property { string } password - * @property { string } username - * @property { string } token - */ - export const PasswordResetDtoSchema = z - .object({ password: z.string(), username: z.string(), token: z.string() }) - .readonly(); - export type PasswordResetDto = z.infer; } diff --git a/test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts b/test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts index db1fe88..9fdc009 100644 --- a/test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts +++ b/test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -7,58 +6,54 @@ import { ControlTowerAuthModels } from "./controlTowerAuth.models"; import { ControlTowerAuthApi } from "./controlTowerAuth.api"; export namespace ControlTowerAuthQueries { - export const moduleName = QueryModule.ControlTowerAuth; +export const moduleName = QueryModule.ControlTowerAuth; - /** - * Mutation `useLogin` - * @description Returns an access token to authenticate for protected endpoints - * @param { ControlTowerAuthModels.LoginRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 400, 401] - */ - export const useLogin = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data }) => ControlTowerAuthApi.login(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - /** - * Mutation `useResetPassword` - * @description Resets the password for the requesting user - * @param { ControlTowerAuthModels.PasswordResetDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 400, 401] - */ - export const useResetPassword = ( - options?: AppMutationOptions< - typeof ControlTowerAuthApi.resetPassword, - { data: ControlTowerAuthModels.PasswordResetDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useLogin` + * @description Returns an access token to authenticate for protected endpoints + * @param { ControlTowerAuthModels.LoginRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 400, 401] + */ +export const useLogin = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerAuthApi.login(data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useResetPassword` + * @description Resets the password for the requesting user + * @param { ControlTowerAuthModels.PasswordResetDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 400, 401] + */ +export const useResetPassword = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + ControlTowerAuthApi.resetPassword(data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ data }) => ControlTowerAuthApi.resetPassword(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.api.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.api.ts index 857ed87..ac13db5 100644 --- a/test/generated/base/controlTowerBookings/controlTowerBookings.api.ts +++ b/test/generated/base/controlTowerBookings/controlTowerBookings.api.ts @@ -1,63 +1,36 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; export namespace ControlTowerBookingsApi { - export const findAll = ( - limit: number, - order?: string, - filter?: ControlTowerBookingsModels.BookingFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const findAll = (limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, - `/bookings`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { + { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, + `/bookings`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, ) => { return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, - `/bookings/${id}`, - config, - ); - }; - - export const findPackageById = (packageId: string, bookingId: string, config?: AxiosRequestConfig) => { + { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, + `/bookings/${id}`, + + ) +}; +export const findPackageById = (packageId: string, bookingId: string, ) => { return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, - `/bookings/${bookingId}/packages/${packageId}`, - config, - ); - }; + { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, + `/bookings/${bookingId}/packages/${packageId}`, + + ) +}; } diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts index 93c0533..ce75a71 100644 --- a/test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts +++ b/test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts @@ -4,52 +4,53 @@ import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; import { ControlTowerBookingsQueries } from "./controlTowerBookings.queries"; export namespace ControlTowerBookingsConfigs { - export const bookingsConfig = { +export const bookingsConfig = { meta: { - title: "Bookings", + title: "Bookings", }, readAll: { - schema: ControlTowerBookingsModels.BookingListItemDtoSchema, - paginated: ControlTowerBookingsQueries.useFindAll, - infinite: ControlTowerBookingsQueries.useFindAllInfinite, - filters: { - schema: ControlTowerBookingsModels.BookingFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerBookingsModels.BookingFilterDtoSchema, - options: { - inputs: { - projectId: true, - search: true, - companyIds: true, - purchaseOrderId: true, - }, - }, - }), - }, - columns: dynamicColumns({ schema: ControlTowerBookingsModels.BookingListItemDtoSchema, - options: { - columns: { - id: true, - bookingNumber: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema, + paginated: ControlTowerBookingsQueries.useFindAll, + infinite: ControlTowerBookingsQueries.useFindAllInfinite, + filters: { + schema: ControlTowerBookingsModels.BookingFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerBookingsModels.BookingFilterDtoSchema, + options: { + inputs: { + projectId: true, + search: true, + companyIds: true, + purchaseOrderId: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: ControlTowerBookingsModels.BookingListItemDtoSchema, + options: { + columns: { + id: true, + bookingNumber: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema, + }, +}), }, read: { - schema: ControlTowerBookingsModels.BookingResponseDtoSchema, - query: ControlTowerBookingsQueries.useFindById, + schema: ControlTowerBookingsModels.BookingResponseDtoSchema, + query: ControlTowerBookingsQueries.useFindById, }, - }; +}; + } diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.models.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.models.ts index 011e334..8170c63 100644 --- a/test/generated/base/controlTowerBookings/controlTowerBookings.models.ts +++ b/test/generated/base/controlTowerBookings/controlTowerBookings.models.ts @@ -2,247 +2,146 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace ControlTowerBookingsModels { - /** - * BookingListItemDtoSchema - * @type { object } - * @property { string } id - * @property { string } bookingNumber - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ - export const BookingListItemDtoSchema = z - .object({ - id: z.string(), - bookingNumber: z.string().nullable(), - ets: z.iso.datetime({ offset: true }).nullable(), - eta: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - }) - .readonly(); - export type BookingListItemDto = z.infer; +/** + * BookingListItemDtoSchema + * @type { object } + * @property { string } id + * @property { string } bookingNumber + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const BookingListItemDtoSchema = z.object({ id: z.string(), bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); +export type BookingListItemDto = z.infer; - /** - * BookingContainerDtoSchema - * @type { object } - * @property { string } id - * @property { string } containerNumber - * @property { string } type - * @property { string } loadType - * @property { string } stuffedInContainer - * @property { string[] } hsCode - * @property { number } noS - * @property { number } weight - * @property { string } lastEventLocation - * @property { string } lastEventName - * @property { string } lastEventDate - * @property { string } seals - */ - export const BookingContainerDtoSchema = z - .object({ - id: z.string(), - containerNumber: z.string().nullable(), - type: z.string().nullable(), - loadType: z.string().nullable(), - stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), - hsCode: z.array(z.string()).readonly().nullable(), - noS: z.number().nullable(), - weight: z.number().nullable(), - lastEventLocation: z.string().nullable(), - lastEventName: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - seals: z.string().nullable(), - }) - .readonly(); - export type BookingContainerDto = z.infer; +/** + * BookingContainerDtoSchema + * @type { object } + * @property { string } id + * @property { string } containerNumber + * @property { string } type + * @property { string } loadType + * @property { string } stuffedInContainer + * @property { string[] } hsCode + * @property { number } noS + * @property { number } weight + * @property { string } lastEventLocation + * @property { string } lastEventName + * @property { string } lastEventDate + * @property { string } seals + */ +export const BookingContainerDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), loadType: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), hsCode: z.array(z.string()).nullable(), noS: z.number().nullable(), weight: z.number().nullable(), lastEventLocation: z.string().nullable(), lastEventName: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), seals: z.string().nullable() }); +export type BookingContainerDto = z.infer; - /** - * BookingPackageDtoSchema - * @type { object } - * @property { string } id - * @property { string } packageNumber - * @property { string } containerNumber - * @property { string } type - * @property { string } description - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - */ - export const BookingPackageDtoSchema = z - .object({ - id: z.string(), - packageNumber: z.string(), - containerNumber: z.string().nullable(), - type: z.string().nullable(), - description: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - }) - .readonly(); - export type BookingPackageDto = z.infer; +/** + * BookingPackageDtoSchema + * @type { object } + * @property { string } id + * @property { string } packageNumber + * @property { string } containerNumber + * @property { string } type + * @property { string } description + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + */ +export const BookingPackageDtoSchema = z.object({ id: z.string(), packageNumber: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), description: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable() }); +export type BookingPackageDto = z.infer; - /** - * BookingResponseDtoSchema - * @type { object } - * @property { string } bookingNumber - * @property { string } ets - * @property { string } etaPod - * @property { string } etaFinalDeliveryPlace - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } destination - * @property { string } lastEvent - * @property { string[] } files - * @property { string } poNumber - * @property { string } blNumber - * @property { BookingContainerDto[] } containers - * @property { BookingPackageDto[] } packages - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - * @property { string } id - */ - export const BookingResponseDtoSchema = z - .object({ - bookingNumber: z.string().nullable(), - ets: z.iso.datetime({ offset: true }).nullable(), - etaPod: z.iso.datetime({ offset: true }).nullable(), - etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - destination: z.string().nullable(), - lastEvent: z.string().nullable(), - files: z.array(z.string()).readonly().nullable(), - poNumber: z.string().nullable(), - blNumber: z.string().nullable(), - containers: z.array(BookingContainerDtoSchema).readonly().nullish(), - packages: z.array(BookingPackageDtoSchema).readonly().nullish(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - id: z.string(), - }) - .readonly(); - export type BookingResponseDto = z.infer; +/** + * BookingResponseDtoSchema + * @type { object } + * @property { string } bookingNumber + * @property { string } ets + * @property { string } etaPod + * @property { string } etaFinalDeliveryPlace + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } destination + * @property { string } lastEvent + * @property { string[] } files + * @property { string } poNumber + * @property { string } blNumber + * @property { BookingContainerDto[] } containers + * @property { BookingPackageDto[] } packages + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + * @property { string } id + */ +export const BookingResponseDtoSchema = z.object({ bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), etaPod: z.iso.datetime({ offset: true }).nullable(), etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), destination: z.string().nullable(), lastEvent: z.string().nullable(), files: z.array(z.string()).nullable(), poNumber: z.string().nullable(), blNumber: z.string().nullable(), containers: z.array(BookingContainerDtoSchema).nullish(), packages: z.array(BookingPackageDtoSchema).nullish(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable(), id: z.string() }); +export type BookingResponseDto = z.infer; - /** - * PackageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } poNumber - * @property { string } bookingNumber - * @property { string } blNumber - * @property { string } containerNumber - * @property { string } packageNumber - * @property { string } description - * @property { number } netWeight - * @property { number } grossWeight - * @property { number } length - * @property { number } width - * @property { number } height - * @property { number } volume - * @property { string } storageInstruction - * @property { string } destination - * @property { string[] } files - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ - export const PackageResponseDtoSchema = z - .object({ - id: z.string(), - poNumber: z.string().nullable(), - bookingNumber: z.string().nullable(), - blNumber: z.string().nullable(), - containerNumber: z.string().nullable(), - packageNumber: z.string().nullable(), - description: z.string().nullable(), - netWeight: z.number().nullable(), - grossWeight: z.number().nullable(), - length: z.number().nullable(), - width: z.number().nullable(), - height: z.number().nullable(), - volume: z.number().nullable(), - storageInstruction: z.string().nullable(), - destination: z.string().nullable(), - files: z.array(z.string()).readonly().nullable(), - ets: z.iso.datetime({ offset: true }).nullable(), - eta: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - }) - .readonly(); - export type PackageResponseDto = z.infer; +/** + * PackageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } poNumber + * @property { string } bookingNumber + * @property { string } blNumber + * @property { string } containerNumber + * @property { string } packageNumber + * @property { string } description + * @property { number } netWeight + * @property { number } grossWeight + * @property { number } length + * @property { number } width + * @property { number } height + * @property { number } volume + * @property { string } storageInstruction + * @property { string } destination + * @property { string[] } files + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const PackageResponseDtoSchema = z.object({ id: z.string(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), containerNumber: z.string().nullable(), packageNumber: z.string().nullable(), description: z.string().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), volume: z.number().nullable(), storageInstruction: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); +export type PackageResponseDto = z.infer; - /** - * BookingFilterDtoSchema - * @type { object } - * @property { string } projectId - * @property { string } search Min Length: `1` - * @property { string[] } companyIds - * @property { string } purchaseOrderId - */ - export const BookingFilterDtoSchema = z - .object({ - projectId: z.string(), - search: z.string().min(1), - companyIds: z.array(z.string()).readonly(), - purchaseOrderId: z.string(), - }) - .readonly(); - export type BookingFilterDto = z.infer; +/** + * BookingFilterDtoSchema + * @type { object } + * @property { string } projectId + * @property { string } search Min Length: `1` + * @property { string[] } companyIds + * @property { string } purchaseOrderId + */ +export const BookingFilterDtoSchema = z.object({ projectId: z.string().nullable(), search: z.string().min(1).nullable(), companyIds: z.array(z.string()).nullable(), purchaseOrderId: z.string().nullable() }).partial(); +export type BookingFilterDto = z.infer; - /** - * ControlTowerBookingsFindAllOrderParamEnumSchema - * @type { enum } - */ - export const ControlTowerBookingsFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); - export type ControlTowerBookingsFindAllOrderParamEnum = z.infer< - typeof ControlTowerBookingsFindAllOrderParamEnumSchema - >; - export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFindAllOrderParamEnumSchema.enum; +/** + * ControlTowerBookingsFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ControlTowerBookingsFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); +export type ControlTowerBookingsFindAllOrderParamEnum = z.infer; +export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFindAllOrderParamEnumSchema.enum; + +/** + * ControlTowerBookingsFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { BookingListItemDto[] } items + */ +export const ControlTowerBookingsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookingListItemDtoSchema).nullable() }).partial().shape }); +export type ControlTowerBookingsFindAllResponse = z.infer; - /** - * ControlTowerBookingsFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookingListItemDto[] } items - */ - export const ControlTowerBookingsFindAllResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(BookingListItemDtoSchema).readonly() }).readonly().shape, - }); - export type ControlTowerBookingsFindAllResponse = z.infer; } diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts index 491a3af..0fd4b0d 100644 --- a/test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts +++ b/test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; @@ -6,136 +5,100 @@ import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; import { ControlTowerBookingsApi } from "./controlTowerBookings.api"; export namespace ControlTowerBookingsQueries { - export const moduleName = QueryModule.ControlTowerBookings; +export const moduleName = QueryModule.ControlTowerBookings; - export const keys = { +export const keys = { all: [moduleName] as const, - findAll: ( - limit?: number, - order?: string, - filter?: ControlTowerBookingsModels.BookingFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/bookings", limit, order, filter, page, cursor] as const, - findAllInfinite: ( - limit?: number, - order?: string, - filter?: ControlTowerBookingsModels.BookingFilterDto, - cursor?: string, - ) => [...keys.all, "/bookings", "infinite", limit, order, filter, cursor] as const, + findAll: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string) => [...keys.all, "/bookings", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string) => [...keys.all, "/bookings", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/bookings/:id", id] as const, - findPackageById: (packageId: string, bookingId: string) => - [...keys.all, "/bookings/:bookingId/packages/:packageId", packageId, bookingId] as const, - }; + findPackageById: (packageId: string, bookingId: string) => [...keys.all, "/bookings/:bookingId/packages/:packageId", packageId, bookingId] as const, +}; - /** - * Query `useFindAll` - * @summary Get all accessible bookings for the customer - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ControlTowerBookingsModels.BookingFilterDto; - page?: number; - cursor?: string; +/** + * Query `useFindAll` + * @summary Get all accessible bookings for the customer + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => + ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor), + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @summary Get all accessible bookings for the customer + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor, config), - ...options, - }); - }; + ...options, + }); +}; - /** - * Infinite query `useFindAllInfinite - * @summary Get all accessible bookings for the customer - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ControlTowerBookingsModels.BookingFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `useFindById` + * @description Returns a booking with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => + ControlTowerBookingsApi.findById(id), + ...options, + }); +}; - /** - * Query `useFindById` - * @description Returns a booking with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => ControlTowerBookingsApi.findById(id, config), - ...options, - }); - }; +/** + * Query `useFindPackageById` + * @description Returns a package with the specified id + * @param { string } object.packageId Path parameter + * @param { string } object.bookingId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindPackageById = ({ packageId, bookingId }: { packageId: string, bookingId: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.findPackageById(packageId, bookingId), + queryFn: () => + ControlTowerBookingsApi.findPackageById(packageId, bookingId), + ...options, + }); +}; - /** - * Query `useFindPackageById` - * @description Returns a package with the specified id - * @param { string } object.packageId Path parameter - * @param { string } object.bookingId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindPackageById = ( - { packageId, bookingId }: { packageId: string; bookingId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findPackageById(packageId, bookingId), - queryFn: () => ControlTowerBookingsApi.findPackageById(packageId, bookingId, config), - ...options, - }); - }; } diff --git a/test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts b/test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts index 5889980..a35354b 100644 --- a/test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts +++ b/test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts @@ -1,45 +1,24 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; export namespace ControlTowerCalendarApi { - export const getCalendar = ( - from: string, - to: string, - type: ControlTowerCalendarModels.CalendarTypeEnum, - search?: string, - poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, - containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, - bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, `/calendar`, { - ...config, - params: { - from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), - to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), - type: ZodExtended.parse(ControlTowerCalendarModels.CalendarTypeEnumSchema, type, { - type: "query", - name: "type", - }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - poNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarPoNumbersParamSchema.optional(), poNumbers, { - type: "query", - name: "poNumbers", - }), - containerNumbers: ZodExtended.parse( - ControlTowerCalendarModels.GetCalendarContainerNumbersParamSchema.optional(), - containerNumbers, - { type: "query", name: "containerNumbers" }, - ), - bookingNumbers: ZodExtended.parse( - ControlTowerCalendarModels.GetCalendarBookingNumbersParamSchema.optional(), - bookingNumbers, - { type: "query", name: "bookingNumbers" }, - ), - }, - }); - }; +export const getCalendar = (from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, ) => { + return AppRestClient.get( + { resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, + `/calendar`, + { + params: { + from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), + to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), + type: ZodExtended.parse(ControlTowerCalendarModels.CalendarTypeEnumSchema, type, { type: "query", name: "type" }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + poNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarPoNumbersParamSchema.optional(), poNumbers, { type: "query", name: "poNumbers" }), + containerNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarContainerNumbersParamSchema.optional(), containerNumbers, { type: "query", name: "containerNumbers" }), + bookingNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarBookingNumbersParamSchema.optional(), bookingNumbers, { type: "query", name: "bookingNumbers" }), + }, + } + ) +}; } diff --git a/test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts b/test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts index 9659a01..43dbf63 100644 --- a/test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts +++ b/test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts @@ -1,109 +1,91 @@ import { z } from "zod"; export namespace ControlTowerCalendarModels { - /** - * EventRelationTypeEnumSchema - * @type { enum } - */ - export const EventRelationTypeEnumSchema = z.enum(["Booking", "Container", "PurchaseOrder"]); - export type EventRelationTypeEnum = z.infer; - export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; +/** + * EventRelationTypeEnumSchema + * @type { enum } + */ +export const EventRelationTypeEnumSchema = z.enum(["Booking", "Container", "PurchaseOrder"]); +export type EventRelationTypeEnum = z.infer; +export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; - /** - * CalendarEventRelationDtoSchema - * @type { object } - * @property { EventRelationTypeEnum } type - * @property { string } id - * @property { string } number - */ - export const CalendarEventRelationDtoSchema = z - .object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }) - .readonly(); - export type CalendarEventRelationDto = z.infer; +/** + * CalendarEventRelationDtoSchema + * @type { object } + * @property { EventRelationTypeEnum } type + * @property { string } id + * @property { string } number + */ +export const CalendarEventRelationDtoSchema = z.object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }); +export type CalendarEventRelationDto = z.infer; - /** - * CalendarTypeEnumSchema - * @type { enum } - */ - export const CalendarTypeEnumSchema = z.enum(["PurchaseOrder", "Booking", "Container", "Package"]); - export type CalendarTypeEnum = z.infer; - export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; +/** + * CalendarTypeEnumSchema + * @type { enum } + */ +export const CalendarTypeEnumSchema = z.enum(["PurchaseOrder", "Booking", "Container", "Package"]); +export type CalendarTypeEnum = z.infer; +export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; - /** - * CalendarEventDtoSchema - * @type { object } - * @property { string } entityId - * @property { string } entityNumber - * @property { CalendarTypeEnum } entityType - * @property { string } date - * @property { string } title - * @property { CalendarEventRelationDto[] } relations - */ - export const CalendarEventDtoSchema = z - .object({ - entityId: z.string(), - entityNumber: z.string(), - entityType: CalendarTypeEnumSchema, - date: z.iso.datetime({ offset: true }), - title: z.string(), - relations: z.array(CalendarEventRelationDtoSchema).readonly(), - }) - .readonly(); - export type CalendarEventDto = z.infer; +/** + * CalendarEventDtoSchema + * @type { object } + * @property { string } entityId + * @property { string } entityNumber + * @property { CalendarTypeEnum } entityType + * @property { string } date + * @property { string } title + * @property { CalendarEventRelationDto[] } relations + */ +export const CalendarEventDtoSchema = z.object({ entityId: z.string(), entityNumber: z.string(), entityType: CalendarTypeEnumSchema, date: z.iso.datetime({ offset: true }), title: z.string(), relations: z.array(CalendarEventRelationDtoSchema) }); +export type CalendarEventDto = z.infer; - /** - * FiltersDtoSchema - * @type { object } - * @property { string[] } poNumbers - * @property { string[] } bookingNumbers - * @property { string[] } containerNumbers - */ - export const FiltersDtoSchema = z - .object({ - poNumbers: z.array(z.string()).readonly(), - bookingNumbers: z.array(z.string()).readonly(), - containerNumbers: z.array(z.string()).readonly(), - }) - .readonly(); - export type FiltersDto = z.infer; +/** + * FiltersDtoSchema + * @type { object } + * @property { string[] } poNumbers + * @property { string[] } bookingNumbers + * @property { string[] } containerNumbers + */ +export const FiltersDtoSchema = z.object({ poNumbers: z.array(z.string()), bookingNumbers: z.array(z.string()), containerNumbers: z.array(z.string()) }); +export type FiltersDto = z.infer; - /** - * CalendarDtoSchema - * @type { object } - * @property { CalendarEventDto[] } events - * @property { FiltersDto } filters - */ - export const CalendarDtoSchema = z - .object({ events: z.array(CalendarEventDtoSchema).readonly(), filters: FiltersDtoSchema }) - .readonly(); - export type CalendarDto = z.infer; +/** + * CalendarDtoSchema + * @type { object } + * @property { CalendarEventDto[] } events + * @property { FiltersDto } filters + */ +export const CalendarDtoSchema = z.object({ events: z.array(CalendarEventDtoSchema), filters: FiltersDtoSchema }); +export type CalendarDto = z.infer; - /** - * CalendarResponseDtoSchema - * @type { object } - * @property { CalendarDto } data - */ - export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }).readonly(); - export type CalendarResponseDto = z.infer; +/** + * CalendarResponseDtoSchema + * @type { object } + * @property { CalendarDto } data + */ +export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }); +export type CalendarResponseDto = z.infer; - /** - * GetCalendarPoNumbersParamSchema - * @type { array } - */ - export const GetCalendarPoNumbersParamSchema = z.array(z.string()).readonly().nullish(); - export type GetCalendarPoNumbersParam = z.infer; +/** + * GetCalendarPoNumbersParamSchema + * @type { array } + */ +export const GetCalendarPoNumbersParamSchema = z.array(z.string()).nullish(); +export type GetCalendarPoNumbersParam = z.infer; - /** - * GetCalendarContainerNumbersParamSchema - * @type { array } - */ - export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).readonly().nullish(); - export type GetCalendarContainerNumbersParam = z.infer; +/** + * GetCalendarContainerNumbersParamSchema + * @type { array } + */ +export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).nullish(); +export type GetCalendarContainerNumbersParam = z.infer; + +/** + * GetCalendarBookingNumbersParamSchema + * @type { array } + */ +export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).nullish(); +export type GetCalendarBookingNumbersParam = z.infer; - /** - * GetCalendarBookingNumbersParamSchema - * @type { array } - */ - export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).readonly().nullish(); - export type GetCalendarBookingNumbersParam = z.infer; } diff --git a/test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts b/test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts index e49a9d2..5e81f36 100644 --- a/test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts +++ b/test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions } from "@povio/openapi-codegen-cli"; @@ -6,69 +5,34 @@ import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; import { ControlTowerCalendarApi } from "./controlTowerCalendar.api"; export namespace ControlTowerCalendarQueries { - export const moduleName = QueryModule.ControlTowerCalendar; +export const moduleName = QueryModule.ControlTowerCalendar; - export const keys = { +export const keys = { all: [moduleName] as const, - getCalendar: ( - from?: string, - to?: string, - type?: ControlTowerCalendarModels.CalendarTypeEnum, - search?: string, - poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, - containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, - bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, - ) => [...keys.all, "/calendar", from, to, type, search, poNumbers, containerNumbers, bookingNumbers] as const, - }; + getCalendar: (from?: string, to?: string, type?: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam) => [...keys.all, "/calendar", from, to, type, search, poNumbers, containerNumbers, bookingNumbers] as const, +}; + +/** + * Query `useGetCalendar` + * @param { string } object.from Query parameter + * @param { string } object.to Query parameter + * @param { ControlTowerCalendarModels.CalendarTypeEnum } object.type Query parameter + * @param { string } object.search Query parameter + * @param { ControlTowerCalendarModels.GetCalendarPoNumbersParam } object.poNumbers Query parameter + * @param { ControlTowerCalendarModels.GetCalendarContainerNumbersParam } object.containerNumbers Query parameter + * @param { ControlTowerCalendarModels.GetCalendarBookingNumbersParam } object.bookingNumbers Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCalendar = ({ from, to, type, search, poNumbers, containerNumbers, bookingNumbers }: { from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), + queryFn: () => + ControlTowerCalendarApi.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), + ...options, + }); +}; - /** - * Query `useGetCalendar` - * @param { string } object.from Query parameter - * @param { string } object.to Query parameter - * @param { ControlTowerCalendarModels.CalendarTypeEnum } object.type Query parameter - * @param { string } object.search Query parameter - * @param { ControlTowerCalendarModels.GetCalendarPoNumbersParam } object.poNumbers Query parameter - * @param { ControlTowerCalendarModels.GetCalendarContainerNumbersParam } object.containerNumbers Query parameter - * @param { ControlTowerCalendarModels.GetCalendarBookingNumbersParam } object.bookingNumbers Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCalendar = ( - { - from, - to, - type, - search, - poNumbers, - containerNumbers, - bookingNumbers, - }: { - from: string; - to: string; - type: ControlTowerCalendarModels.CalendarTypeEnum; - search?: string; - poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam; - containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam; - bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), - queryFn: () => - ControlTowerCalendarApi.getCalendar( - from, - to, - type, - search, - poNumbers, - containerNumbers, - bookingNumbers, - config, - ), - ...options, - }); - }; } diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.api.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.api.ts index fc7f3d4..3196fe3 100644 --- a/test/generated/base/controlTowerContainers/controlTowerContainers.api.ts +++ b/test/generated/base/controlTowerContainers/controlTowerContainers.api.ts @@ -1,65 +1,36 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerContainersModels } from "./controlTowerContainers.models"; export namespace ControlTowerContainersApi { - export const findAll = ( - limit: number, - order?: string, - filter?: ControlTowerContainersModels.ContainerFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const findAll = (limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, - `/containers`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { + { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, + `/containers`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, ) => { return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, - `/containers/${id}`, - config, - ); - }; - - export const getJourney = (id: string, config?: AxiosRequestConfig) => { + { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, + `/containers/${id}`, + + ) +}; +export const getJourney = (id: string, ) => { return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, - `/containers/${id}/journey`, - config, - ); - }; + { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, + `/containers/${id}/journey`, + + ) +}; } diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts index 79e4a85..98105eb 100644 --- a/test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts +++ b/test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts @@ -4,50 +4,51 @@ import { ControlTowerContainersModels } from "./controlTowerContainers.models"; import { ControlTowerContainersQueries } from "./controlTowerContainers.queries"; export namespace ControlTowerContainersConfigs { - export const containersConfig = { +export const containersConfig = { meta: { - title: "Containers", + title: "Containers", }, readAll: { - schema: ControlTowerContainersModels.ContainerListItemDtoSchema, - paginated: ControlTowerContainersQueries.useFindAll, - infinite: ControlTowerContainersQueries.useFindAllInfinite, - filters: { - schema: ControlTowerContainersModels.ContainerFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerContainersModels.ContainerFilterDtoSchema, - options: { - inputs: { - companyIds: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ schema: ControlTowerContainersModels.ContainerListItemDtoSchema, - options: { - columns: { - containerNumber: true, - id: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, + paginated: ControlTowerContainersQueries.useFindAll, + infinite: ControlTowerContainersQueries.useFindAllInfinite, + filters: { + schema: ControlTowerContainersModels.ContainerFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerContainersModels.ContainerFilterDtoSchema, + options: { + inputs: { + companyIds: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: ControlTowerContainersModels.ContainerListItemDtoSchema, + options: { + columns: { + containerNumber: true, + id: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, + }, +}), }, read: { - schema: ControlTowerContainersModels.ContainerResponseDtoSchema, - query: ControlTowerContainersQueries.useFindById, + schema: ControlTowerContainersModels.ContainerResponseDtoSchema, + query: ControlTowerContainersQueries.useFindById, }, - }; +}; + } diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.models.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.models.ts index 8b5f4ff..e0df923 100644 --- a/test/generated/base/controlTowerContainers/controlTowerContainers.models.ts +++ b/test/generated/base/controlTowerContainers/controlTowerContainers.models.ts @@ -2,208 +2,132 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace ControlTowerContainersModels { - /** - * ContainerListItemDtoSchema - * @type { object } - * @property { string } containerNumber - * @property { string } id - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ - export const ContainerListItemDtoSchema = z - .object({ - containerNumber: z.string().nullable(), - id: z.string(), - ets: z.iso.datetime({ offset: true }).nullable(), - eta: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - }) - .readonly(); - export type ContainerListItemDto = z.infer; +/** + * ContainerListItemDtoSchema + * @type { object } + * @property { string } containerNumber + * @property { string } id + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const ContainerListItemDtoSchema = z.object({ containerNumber: z.string().nullable(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); +export type ContainerListItemDto = z.infer; - /** - * ContainerEventDtoSchema - * @type { object } - * @property { CommonModels.VesselDto } vessel - * @property { string } name - * @property { string } date - * @property { boolean } checkedIn - */ - export const ContainerEventDtoSchema = z - .object({ - vessel: CommonModels.VesselDtoSchema.nullable(), - name: z.string(), - date: z.iso.datetime({ offset: true }).nullable(), - checkedIn: z.boolean(), - }) - .readonly(); - export type ContainerEventDto = z.infer; +/** + * ContainerEventDtoSchema + * @type { object } + * @property { CommonModels.VesselDto } vessel + * @property { string } name + * @property { string } date + * @property { boolean } checkedIn + */ +export const ContainerEventDtoSchema = z.object({ vessel: CommonModels.VesselDtoSchema.nullable(), name: z.string(), date: z.iso.datetime({ offset: true }).nullable(), checkedIn: z.boolean() }); +export type ContainerEventDto = z.infer; - /** - * ContainerJourneyDtoSchema - * @type { object } - * @property { string } id - * @property { string } country - * @property { string } terminal - * @property { boolean } checkedIn - * @property { ContainerEventDto[] } events - */ - export const ContainerJourneyDtoSchema = z - .object({ - id: z.string(), - country: z.string().nullable(), - terminal: z.string().nullable(), - checkedIn: z.boolean(), - events: z.array(ContainerEventDtoSchema).readonly(), - }) - .readonly(); - export type ContainerJourneyDto = z.infer; +/** + * ContainerJourneyDtoSchema + * @type { object } + * @property { string } id + * @property { string } country + * @property { string } terminal + * @property { boolean } checkedIn + * @property { ContainerEventDto[] } events + */ +export const ContainerJourneyDtoSchema = z.object({ id: z.string(), country: z.string().nullable(), terminal: z.string().nullable(), checkedIn: z.boolean(), events: z.array(ContainerEventDtoSchema) }); +export type ContainerJourneyDto = z.infer; - /** - * PackageNumberDtoSchema - * @type { object } - * @property { string } id - * @property { string } type - * @property { string } description - */ - export const PackageNumberDtoSchema = z - .object({ id: z.string(), type: z.string().nullable(), description: z.string() }) - .readonly(); - export type PackageNumberDto = z.infer; +/** + * PackageNumberDtoSchema + * @type { object } + * @property { string } id + * @property { string } type + * @property { string } description + */ +export const PackageNumberDtoSchema = z.object({ id: z.string(), type: z.string().nullable(), description: z.string() }); +export type PackageNumberDto = z.infer; - /** - * ContainerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } containerNumber - * @property { string } poNumber - * @property { string } bookingNumber - * @property { string } blNumber - * @property { string } stuffedInContainer - * @property { string } containerType - * @property { string } loadType - * @property { string[] } hsCode - * @property { number } totalVolume - * @property { number } totalWeight - * @property { string } cargoDescription - * @property { number } noS - * @property { ContainerJourneyDto[] } journeys - * @property { PackageNumberDto[] } packages - * @property { string } bookingId - * @property { string } destination - * @property { string[] } files - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ - export const ContainerResponseDtoSchema = z - .object({ - id: z.string(), - containerNumber: z.string().nullable(), - poNumber: z.string().nullable(), - bookingNumber: z.string().nullable(), - blNumber: z.string().nullable(), - stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), - containerType: z.string().nullable(), - loadType: z.string().nullable(), - hsCode: z.array(z.string()).readonly().nullable(), - totalVolume: z.number().nullable(), - totalWeight: z.number().nullable(), - cargoDescription: z.string().nullable(), - noS: z.number().nullable(), - journeys: z.array(ContainerJourneyDtoSchema).readonly().nullish(), - packages: z.array(PackageNumberDtoSchema).readonly().nullish(), - bookingId: z.string().nullable(), - destination: z.string().nullable(), - files: z.array(z.string()).readonly().nullable(), - ets: z.iso.datetime({ offset: true }).nullable(), - eta: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - }) - .readonly(); - export type ContainerResponseDto = z.infer; +/** + * ContainerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } containerNumber + * @property { string } poNumber + * @property { string } bookingNumber + * @property { string } blNumber + * @property { string } stuffedInContainer + * @property { string } containerType + * @property { string } loadType + * @property { string[] } hsCode + * @property { number } totalVolume + * @property { number } totalWeight + * @property { string } cargoDescription + * @property { number } noS + * @property { ContainerJourneyDto[] } journeys + * @property { PackageNumberDto[] } packages + * @property { string } bookingId + * @property { string } destination + * @property { string[] } files + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const ContainerResponseDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), containerType: z.string().nullable(), loadType: z.string().nullable(), hsCode: z.array(z.string()).nullable(), totalVolume: z.number().nullable(), totalWeight: z.number().nullable(), cargoDescription: z.string().nullable(), noS: z.number().nullable(), journeys: z.array(ContainerJourneyDtoSchema).nullish(), packages: z.array(PackageNumberDtoSchema).nullish(), bookingId: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); +export type ContainerResponseDto = z.infer; - /** - * ContainerJourneyResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { ContainerJourneyDto[] } journeys - * @property { string[] } packageNumbers - */ - export const ContainerJourneyResponseDtoSchema = z - .object({ - id: z.string(), - number: z.string(), - journeys: z.array(ContainerJourneyDtoSchema).readonly(), - packageNumbers: z.array(z.string()).readonly(), - }) - .readonly(); - export type ContainerJourneyResponseDto = z.infer; +/** + * ContainerJourneyResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { ContainerJourneyDto[] } journeys + * @property { string[] } packageNumbers + */ +export const ContainerJourneyResponseDtoSchema = z.object({ id: z.string(), number: z.string(), journeys: z.array(ContainerJourneyDtoSchema), packageNumbers: z.array(z.string()) }); +export type ContainerJourneyResponseDto = z.infer; - /** - * ContainerFilterDtoSchema - * @type { object } - * @property { number[] } companyIds - * @property { string } search - */ - export const ContainerFilterDtoSchema = z - .object({ companyIds: z.array(z.number()).readonly(), search: z.string() }) - .readonly(); - export type ContainerFilterDto = z.infer; +/** + * ContainerFilterDtoSchema + * @type { object } + * @property { number[] } companyIds + * @property { string } search + */ +export const ContainerFilterDtoSchema = z.object({ companyIds: z.array(z.number()).nullable(), search: z.string().nullable() }).partial(); +export type ContainerFilterDto = z.infer; - /** - * ControlTowerContainersFindAllOrderParamEnumSchema - * @type { enum } - */ - export const ControlTowerContainersFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); - export type ControlTowerContainersFindAllOrderParamEnum = z.infer< - typeof ControlTowerContainersFindAllOrderParamEnumSchema - >; - export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainersFindAllOrderParamEnumSchema.enum; +/** + * ControlTowerContainersFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ControlTowerContainersFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); +export type ControlTowerContainersFindAllOrderParamEnum = z.infer; +export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainersFindAllOrderParamEnumSchema.enum; + +/** + * ControlTowerContainersFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ContainerListItemDto[] } items + */ +export const ControlTowerContainersFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerListItemDtoSchema).nullable() }).partial().shape }); +export type ControlTowerContainersFindAllResponse = z.infer; - /** - * ControlTowerContainersFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ContainerListItemDto[] } items - */ - export const ControlTowerContainersFindAllResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ContainerListItemDtoSchema).readonly() }).readonly().shape, - }); - export type ControlTowerContainersFindAllResponse = z.infer; } diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts index 138e21d..ccb35ea 100644 --- a/test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts +++ b/test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; @@ -6,134 +5,99 @@ import { ControlTowerContainersModels } from "./controlTowerContainers.models"; import { ControlTowerContainersApi } from "./controlTowerContainers.api"; export namespace ControlTowerContainersQueries { - export const moduleName = QueryModule.ControlTowerContainers; +export const moduleName = QueryModule.ControlTowerContainers; - export const keys = { +export const keys = { all: [moduleName] as const, - findAll: ( - limit?: number, - order?: string, - filter?: ControlTowerContainersModels.ContainerFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/containers", limit, order, filter, page, cursor] as const, - findAllInfinite: ( - limit?: number, - order?: string, - filter?: ControlTowerContainersModels.ContainerFilterDto, - cursor?: string, - ) => [...keys.all, "/containers", "infinite", limit, order, filter, cursor] as const, + findAll: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string) => [...keys.all, "/containers", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string) => [...keys.all, "/containers", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/containers/:id", id] as const, getJourney: (id: string) => [...keys.all, "/containers/:id/journey", id] as const, - }; +}; - /** - * Query `useFindAll` - * @description Lists containers - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ControlTowerContainersModels.ContainerFilterDto; - page?: number; - cursor?: string; +/** + * Query `useFindAll` + * @description Lists containers + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => + ControlTowerContainersApi.findAll(limit, order, filter, page, cursor), + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @description Lists containers + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => ControlTowerContainersApi.findAll(limit, order, filter, page, cursor, config), - ...options, - }); - }; + ...options, + }); +}; - /** - * Infinite query `useFindAllInfinite - * @description Lists containers - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ControlTowerContainersModels.ContainerFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `useFindById` + * @description Returns a container with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => + ControlTowerContainersApi.findById(id), + ...options, + }); +}; - /** - * Query `useFindById` - * @description Returns a container with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => ControlTowerContainersApi.findById(id, config), - ...options, - }); - }; +/** + * Query `useGetJourney` + * @description Returns the journey and package numbers of a container with the specified id + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetJourney = ({ id }: { id: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.getJourney(id), + queryFn: () => + ControlTowerContainersApi.getJourney(id), + ...options, + }); +}; - /** - * Query `useGetJourney` - * @description Returns the journey and package numbers of a container with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetJourney = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getJourney(id), - queryFn: () => ControlTowerContainersApi.getJourney(id, config), - ...options, - }); - }; } diff --git a/test/generated/base/controlTowerMe/controlTowerMe.api.ts b/test/generated/base/controlTowerMe/controlTowerMe.api.ts index e3ce360..91b82bc 100644 --- a/test/generated/base/controlTowerMe/controlTowerMe.api.ts +++ b/test/generated/base/controlTowerMe/controlTowerMe.api.ts @@ -1,54 +1,53 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerMeModels } from "./controlTowerMe.models"; export namespace ControlTowerMeApi { - export const getUserProfile = (config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, `/me`, config); - }; - - export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, config?: AxiosRequestConfig) => { +export const getUserProfile = () => { + return AppRestClient.get( + { resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, + `/me`, + + ) +}; +export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, ) => { return AppRestClient.put( - { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, - `/me`, - ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), - config, - ); - }; - - export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, config?: AxiosRequestConfig) => { + { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, + `/me`, + ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), + + ) +}; +export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, ) => { return AppRestClient.put( - { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, - `/me/basic`, - ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), - config, - ); - }; - - export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, config?: AxiosRequestConfig) => { + { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, + `/me/basic`, + ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), + + ) +}; +export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, ) => { return AppRestClient.put( - { resSchema: z.void() }, - `/me/password`, - ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), - config, - ); - }; - - export const updateEmailPreferences = ( - data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/me/password`, + ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), + + ) +}; +export const updateEmailPreferences = (data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, ) => { return AppRestClient.put( - { resSchema: z.void() }, - `/me/email-preferences`, - ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), - config, - ); - }; - - export const updateProjectAccess = (config?: AxiosRequestConfig) => { - return AppRestClient.put({ resSchema: z.void() }, `/me/access`, undefined, config); - }; + { resSchema: z.void() }, + `/me/email-preferences`, + ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), + + ) +}; +export const updateProjectAccess = () => { + return AppRestClient.put( + { resSchema: z.void() }, + `/me/access`, + + ) +}; } diff --git a/test/generated/base/controlTowerMe/controlTowerMe.models.ts b/test/generated/base/controlTowerMe/controlTowerMe.models.ts index 9b37d77..e453fe6 100644 --- a/test/generated/base/controlTowerMe/controlTowerMe.models.ts +++ b/test/generated/base/controlTowerMe/controlTowerMe.models.ts @@ -1,225 +1,173 @@ import { z } from "zod"; export namespace ControlTowerMeModels { - /** - * LinksDtoSchema - * @type { object } - * @property { string } self - * @property { string } related - */ - export const LinksDtoSchema = z.object({ self: z.string(), related: z.string() }).readonly(); - export type LinksDto = z.infer; - - /** - * ApiResponseDataDtoSchema - * @type { object } - * @property { string } type - * @property { string } id - * @property { object } attributes - * @property { object } relationships - * @property { LinksDto } links - */ - export const ApiResponseDataDtoSchema = z - .object({ - type: z.string(), - id: z.string(), - attributes: z.object({}).readonly().nullish(), - relationships: z.object({}).readonly().nullish(), - links: LinksDtoSchema.nullish(), - }) - .readonly(); - export type ApiResponseDataDto = z.infer; - - /** - * PaginationLinksDtoSchema - * @type { object } - * @property { string } next - * @property { string } self - * @property { string } last - */ - export const PaginationLinksDtoSchema = z.object({ next: z.string(), self: z.string(), last: z.string() }).readonly(); - export type PaginationLinksDto = z.infer; - - /** - * ApiResponseDtoSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - */ - export const ApiResponseDtoSchema = z - .object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }) - .readonly(); - export type ApiResponseDto = z.infer; - - /** - * DelayNotificationEnumSchema - * @type { enum } - */ - export const DelayNotificationEnumSchema = z.enum(["EveryDelay", "LongerThan24Hours", "LongerThan3Days"]); - export type DelayNotificationEnum = z.infer; - export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; - - /** - * UserEmailPreferencesDtoSchema - * @type { object } - * @property { boolean } originDeparture - * @property { boolean } loadedOnVessel - * @property { boolean } destinationArrival - * @property { boolean } onsiteDelivery - * @property { DelayNotificationEnum } delay - */ - export const UserEmailPreferencesDtoSchema = z - .object({ - originDeparture: z.boolean(), - loadedOnVessel: z.boolean(), - destinationArrival: z.boolean(), - onsiteDelivery: z.boolean(), - delay: DelayNotificationEnumSchema, - }) - .readonly(); - export type UserEmailPreferencesDto = z.infer; - - /** - * UserProjectAccessDtoSchema - * @type { object } - * @property { string[] } projectIds - */ - export const UserProjectAccessDtoSchema = z.object({ projectIds: z.array(z.string()).readonly() }).readonly(); - export type UserProjectAccessDto = z.infer; - - /** - * UserRoleEnumSchema - * @type { enum } - */ - export const UserRoleEnumSchema = z.enum(["User", "Admin"]); - export type UserRoleEnum = z.infer; - export const UserRoleEnum = UserRoleEnumSchema.enum; - - /** - * UserDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } name Min Length: `3` - * @property { string } email - * @property { UserEmailPreferencesDto } emailPreferences - * @property { UserProjectAccessDto } projectAccess - * @property { UserRoleEnum } role - * @property { boolean } isAdmin - */ - export const UserDetailDtoSchema = z - .object({ - id: z.string(), - name: z.string().min(3), - email: z.email(), - emailPreferences: UserEmailPreferencesDtoSchema.nullable(), - projectAccess: UserProjectAccessDtoSchema.nullable(), - role: UserRoleEnumSchema.nullable(), - isAdmin: z.boolean(), - }) - .readonly(); - export type UserDetailDto = z.infer; - - /** - * UserEmailPreferencesUpdateDtoSchema - * @type { object } - * @property { boolean } originDeparture - * @property { boolean } loadedOnVessel - * @property { boolean } destinationArrival - * @property { boolean } onsiteDelivery - * @property { DelayNotificationEnum } delay - */ - export const UserEmailPreferencesUpdateDtoSchema = z - .object({ - originDeparture: z.boolean(), - loadedOnVessel: z.boolean(), - destinationArrival: z.boolean(), - onsiteDelivery: z.boolean(), - delay: DelayNotificationEnumSchema, - }) - .readonly(); - export type UserEmailPreferencesUpdateDto = z.infer; - - /** - * UserProjectAccessUpdateDtoSchema - * @type { object } - * @property { number[] } projectIds - */ - export const UserProjectAccessUpdateDtoSchema = z.object({ projectIds: z.array(z.number()).readonly() }).readonly(); - export type UserProjectAccessUpdateDto = z.infer; - - /** - * UserUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } password - * @property { UserEmailPreferencesUpdateDto } emailPreferences - * @property { UserProjectAccessUpdateDto } projectAccess - */ - export const UserUpdateDtoSchema = z - .object({ - name: z.string(), - email: z.email(), - password: z.string(), - emailPreferences: UserEmailPreferencesUpdateDtoSchema, - projectAccess: UserProjectAccessUpdateDtoSchema, - }) - .readonly(); - export type UserUpdateDto = z.infer; - - /** - * UserBasicUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - */ - export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }).readonly(); - export type UserBasicUpdateDto = z.infer; - - /** - * UserPasswordUpdateDtoSchema - * @type { object } - * @property { string } password - */ - export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }).readonly(); - export type UserPasswordUpdateDto = z.infer; - - /** - * GetUserProfileResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ - export const GetUserProfileResponseSchema = z.object({ - ...ApiResponseDtoSchema.shape, - ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, - }); - export type GetUserProfileResponse = z.infer; - - /** - * UpdateUserDataResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ - export const UpdateUserDataResponseSchema = z.object({ - ...ApiResponseDtoSchema.shape, - ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, - }); - export type UpdateUserDataResponse = z.infer; - - /** - * UpdateUserProfileResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ - export const UpdateUserProfileResponseSchema = z.object({ - ...ApiResponseDtoSchema.shape, - ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, - }); - export type UpdateUserProfileResponse = z.infer; +/** + * LinksDtoSchema + * @type { object } + * @property { string } self + * @property { string } related + */ +export const LinksDtoSchema = z.object({ self: z.string().nullable(), related: z.string().nullable() }).partial(); +export type LinksDto = z.infer; + +/** + * ApiResponseDataDtoSchema + * @type { object } + * @property { string } type + * @property { string } id + * @property { object } attributes + * @property { object } relationships + * @property { LinksDto } links + */ +export const ApiResponseDataDtoSchema = z.object({ type: z.string(), id: z.string(), attributes: z.object({}).nullish(), relationships: z.object({}).nullish(), links: LinksDtoSchema.nullish() }); +export type ApiResponseDataDto = z.infer; + +/** + * PaginationLinksDtoSchema + * @type { object } + * @property { string } next + * @property { string } self + * @property { string } last + */ +export const PaginationLinksDtoSchema = z.object({ next: z.string().nullable(), self: z.string().nullable(), last: z.string().nullable() }).partial(); +export type PaginationLinksDto = z.infer; + +/** + * ApiResponseDtoSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + */ +export const ApiResponseDtoSchema = z.object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }); +export type ApiResponseDto = z.infer; + +/** + * DelayNotificationEnumSchema + * @type { enum } + */ +export const DelayNotificationEnumSchema = z.enum(["EveryDelay", "LongerThan24Hours", "LongerThan3Days"]); +export type DelayNotificationEnum = z.infer; +export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; + +/** + * UserEmailPreferencesDtoSchema + * @type { object } + * @property { boolean } originDeparture + * @property { boolean } loadedOnVessel + * @property { boolean } destinationArrival + * @property { boolean } onsiteDelivery + * @property { DelayNotificationEnum } delay + */ +export const UserEmailPreferencesDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }); +export type UserEmailPreferencesDto = z.infer; + +/** + * UserProjectAccessDtoSchema + * @type { object } + * @property { string[] } projectIds + */ +export const UserProjectAccessDtoSchema = z.object({ projectIds: z.array(z.string()) }); +export type UserProjectAccessDto = z.infer; + +/** + * UserRoleEnumSchema + * @type { enum } + */ +export const UserRoleEnumSchema = z.enum(["User", "Admin"]); +export type UserRoleEnum = z.infer; +export const UserRoleEnum = UserRoleEnumSchema.enum; + +/** + * UserDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } name Min Length: `3` + * @property { string } email + * @property { UserEmailPreferencesDto } emailPreferences + * @property { UserProjectAccessDto } projectAccess + * @property { UserRoleEnum } role + * @property { boolean } isAdmin + */ +export const UserDetailDtoSchema = z.object({ id: z.string(), name: z.string().min(3), email: z.email(), emailPreferences: UserEmailPreferencesDtoSchema.nullable(), projectAccess: UserProjectAccessDtoSchema.nullable(), role: UserRoleEnumSchema.nullable(), isAdmin: z.boolean() }); +export type UserDetailDto = z.infer; + +/** + * UserEmailPreferencesUpdateDtoSchema + * @type { object } + * @property { boolean } originDeparture + * @property { boolean } loadedOnVessel + * @property { boolean } destinationArrival + * @property { boolean } onsiteDelivery + * @property { DelayNotificationEnum } delay + */ +export const UserEmailPreferencesUpdateDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }); +export type UserEmailPreferencesUpdateDto = z.infer; + +/** + * UserProjectAccessUpdateDtoSchema + * @type { object } + * @property { number[] } projectIds + */ +export const UserProjectAccessUpdateDtoSchema = z.object({ projectIds: z.array(z.number()) }); +export type UserProjectAccessUpdateDto = z.infer; + +/** + * UserUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } password + * @property { UserEmailPreferencesUpdateDto } emailPreferences + * @property { UserProjectAccessUpdateDto } projectAccess + */ +export const UserUpdateDtoSchema = z.object({ name: z.string(), email: z.email(), password: z.string(), emailPreferences: UserEmailPreferencesUpdateDtoSchema, projectAccess: UserProjectAccessUpdateDtoSchema }); +export type UserUpdateDto = z.infer; + +/** + * UserBasicUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + */ +export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }); +export type UserBasicUpdateDto = z.infer; + +/** + * UserPasswordUpdateDtoSchema + * @type { object } + * @property { string } password + */ +export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }); +export type UserPasswordUpdateDto = z.infer; + +/** + * GetUserProfileResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ +export const GetUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema.nullable() }).partial().nullable() }).partial().shape }); +export type GetUserProfileResponse = z.infer; + +/** + * UpdateUserDataResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ +export const UpdateUserDataResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema.nullable() }).partial().nullable() }).partial().shape }); +export type UpdateUserDataResponse = z.infer; + +/** + * UpdateUserProfileResponseSchema + * @type { object } + * @property { ApiResponseDataDto } data + * @property { PaginationLinksDto } links + * @property { UserDetailDto } data.attributes + */ +export const UpdateUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema.nullable() }).partial().nullable() }).partial().shape }); +export type UpdateUserProfileResponse = z.infer; + } diff --git a/test/generated/base/controlTowerMe/controlTowerMe.queries.ts b/test/generated/base/controlTowerMe/controlTowerMe.queries.ts index 9b5825c..ae8316f 100644 --- a/test/generated/base/controlTowerMe/controlTowerMe.queries.ts +++ b/test/generated/base/controlTowerMe/controlTowerMe.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -7,163 +6,141 @@ import { ControlTowerMeModels } from "./controlTowerMe.models"; import { ControlTowerMeApi } from "./controlTowerMe.api"; export namespace ControlTowerMeQueries { - export const moduleName = QueryModule.ControlTowerMe; +export const moduleName = QueryModule.ControlTowerMe; - export const keys = { +export const keys = { all: [moduleName] as const, - getUserProfile: () => [...keys.all, "/me"] as const, - }; + getUserProfile: () => [...keys.all, "/me", ] as const, +}; - /** - * Query `useGetUserProfile` - * @description Get basic user profile data - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200] - */ - export const useGetUserProfile = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getUserProfile(), - queryFn: () => ControlTowerMeApi.getUserProfile(config), - ...options, - }); - }; +/** + * Query `useGetUserProfile` + * @description Get basic user profile data + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200] + */ +export const useGetUserProfile = (options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.getUserProfile(), + queryFn: ControlTowerMeApi.getUserProfile, + ...options, + }); +}; - /** - * Mutation `useUpdateUserData` - * @description Update user data - * @param { ControlTowerMeModels.UserUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ - export const useUpdateUserData = ( - options?: AppMutationOptions< - typeof ControlTowerMeApi.updateUserData, - { data: ControlTowerMeModels.UserUpdateDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdateUserData` + * @description Update user data + * @param { ControlTowerMeModels.UserUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateUserData = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data }) => ControlTowerMeApi.updateUserData(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updateUserData(data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useUpdateUserProfile` - * @description Update basic user profile data - * @param { ControlTowerMeModels.UserBasicUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ - export const useUpdateUserProfile = ( - options?: AppMutationOptions< - typeof ControlTowerMeApi.updateUserProfile, - { data: ControlTowerMeModels.UserBasicUpdateDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdateUserProfile` + * @description Update basic user profile data + * @param { ControlTowerMeModels.UserBasicUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateUserProfile = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data }) => ControlTowerMeApi.updateUserProfile(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updateUserProfile(data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useUpdatePassword` - * @description Update user password - * @param { ControlTowerMeModels.UserPasswordUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ - export const useUpdatePassword = ( - options?: AppMutationOptions< - typeof ControlTowerMeApi.updatePassword, - { data: ControlTowerMeModels.UserPasswordUpdateDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdatePassword` + * @description Update user password + * @param { ControlTowerMeModels.UserPasswordUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdatePassword = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data }) => ControlTowerMeApi.updatePassword(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updatePassword(data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useUpdateEmailPreferences` - * @description Update user email notification preferences - * @param { ControlTowerMeModels.UserEmailPreferencesUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ - export const useUpdateEmailPreferences = ( - options?: AppMutationOptions< - typeof ControlTowerMeApi.updateEmailPreferences, - { data: ControlTowerMeModels.UserEmailPreferencesUpdateDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdateEmailPreferences` + * @description Update user email notification preferences + * @param { ControlTowerMeModels.UserEmailPreferencesUpdateDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateEmailPreferences = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data }) => ControlTowerMeApi.updateEmailPreferences(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ data }) => + ControlTowerMeApi.updateEmailPreferences(data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useUpdateProjectAccess` - * @description Update user project access - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ - export const useUpdateProjectAccess = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdateProjectAccess` + * @description Update user project access + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200] + */ +export const useUpdateProjectAccess = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: () => + ControlTowerMeApi.updateProjectAccess() +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: () => ControlTowerMeApi.updateProjectAccess(config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.api.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.api.ts index c98ec95..1a72562 100644 --- a/test/generated/base/controlTowerPackages/controlTowerPackages.api.ts +++ b/test/generated/base/controlTowerPackages/controlTowerPackages.api.ts @@ -1,47 +1,22 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; export namespace ControlTowerPackagesApi { - export const findAll = ( - limit: number, - order?: string, - filter?: ControlTowerPackagesModels.PackageFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const findAll = (limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, - `/packages`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; + { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, + `/packages`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; } diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts index ae15a46..17e4ee5 100644 --- a/test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts +++ b/test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts @@ -4,46 +4,47 @@ import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; import { ControlTowerPackagesQueries } from "./controlTowerPackages.queries"; export namespace ControlTowerPackagesConfigs { - export const packagesConfig = { +export const packagesConfig = { meta: { - title: "Packages", + title: "Packages", }, readAll: { - schema: ControlTowerPackagesModels.PackageListItemDtoSchema, - paginated: ControlTowerPackagesQueries.useFindAll, - infinite: ControlTowerPackagesQueries.useFindAllInfinite, - filters: { - schema: ControlTowerPackagesModels.PackageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerPackagesModels.PackageFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ schema: ControlTowerPackagesModels.PackageListItemDtoSchema, - options: { - columns: { - packageNumber: true, - bookingId: true, - id: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema, + paginated: ControlTowerPackagesQueries.useFindAll, + infinite: ControlTowerPackagesQueries.useFindAllInfinite, + filters: { + schema: ControlTowerPackagesModels.PackageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ControlTowerPackagesModels.PackageFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: ControlTowerPackagesModels.PackageListItemDtoSchema, + options: { + columns: { + packageNumber: true, + bookingId: true, + id: true, + ets: true, + eta: true, + supplierName: true, + supplierAddress: true, + lastEvent: true, + lastEventLocation: true, + lastEventDate: true, + journeyFrom: true, + journeyTo: true, + vessel: true, + }, + sortable: ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema, + }, +}), }, - }; +}; + } diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.models.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.models.ts index d5f8c5a..af298ca 100644 --- a/test/generated/base/controlTowerPackages/controlTowerPackages.models.ts +++ b/test/generated/base/controlTowerPackages/controlTowerPackages.models.ts @@ -2,73 +2,53 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace ControlTowerPackagesModels { - /** - * PackageListItemDtoSchema - * @type { object } - * @property { string } packageNumber - * @property { string } bookingId - * @property { string } id - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ - export const PackageListItemDtoSchema = z - .object({ - packageNumber: z.string(), - bookingId: z.string(), - id: z.string(), - ets: z.iso.datetime({ offset: true }).nullable(), - eta: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - }) - .readonly(); - export type PackageListItemDto = z.infer; +/** + * PackageListItemDtoSchema + * @type { object } + * @property { string } packageNumber + * @property { string } bookingId + * @property { string } id + * @property { string } ets + * @property { string } eta + * @property { string } supplierName + * @property { string } supplierAddress + * @property { string } lastEvent + * @property { string } lastEventLocation + * @property { string } lastEventDate + * @property { string } journeyFrom + * @property { string } journeyTo + * @property { CommonModels.VesselDto } vessel + */ +export const PackageListItemDtoSchema = z.object({ packageNumber: z.string(), bookingId: z.string(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); +export type PackageListItemDto = z.infer; - /** - * PackageFilterDtoSchema - * @type { object } - * @property { string } search Min Length: `1` - */ - export const PackageFilterDtoSchema = z.object({ search: z.string().min(1) }).readonly(); - export type PackageFilterDto = z.infer; +/** + * PackageFilterDtoSchema + * @type { object } + * @property { string } search Min Length: `1` + */ +export const PackageFilterDtoSchema = z.object({ search: z.string().min(1).nullable() }).partial(); +export type PackageFilterDto = z.infer; - /** - * ControlTowerPackagesFindAllOrderParamEnumSchema - * @type { enum } - */ - export const ControlTowerPackagesFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); - export type ControlTowerPackagesFindAllOrderParamEnum = z.infer< - typeof ControlTowerPackagesFindAllOrderParamEnumSchema - >; - export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFindAllOrderParamEnumSchema.enum; +/** + * ControlTowerPackagesFindAllOrderParamEnumSchema + * @type { enum } + */ +export const ControlTowerPackagesFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); +export type ControlTowerPackagesFindAllOrderParamEnum = z.infer; +export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFindAllOrderParamEnumSchema.enum; + +/** + * ControlTowerPackagesFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PackageListItemDto[] } items + */ +export const ControlTowerPackagesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageListItemDtoSchema).nullable() }).partial().shape }); +export type ControlTowerPackagesFindAllResponse = z.infer; - /** - * ControlTowerPackagesFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PackageListItemDto[] } items - */ - export const ControlTowerPackagesFindAllResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PackageListItemDtoSchema).readonly() }).readonly().shape, - }); - export type ControlTowerPackagesFindAllResponse = z.infer; } diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts index 9db4707..006ba2a 100644 --- a/test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts +++ b/test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; @@ -6,92 +5,61 @@ import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; import { ControlTowerPackagesApi } from "./controlTowerPackages.api"; export namespace ControlTowerPackagesQueries { - export const moduleName = QueryModule.ControlTowerPackages; +export const moduleName = QueryModule.ControlTowerPackages; - export const keys = { +export const keys = { all: [moduleName] as const, - findAll: ( - limit?: number, - order?: string, - filter?: ControlTowerPackagesModels.PackageFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/packages", limit, order, filter, page, cursor] as const, - findAllInfinite: ( - limit?: number, - order?: string, - filter?: ControlTowerPackagesModels.PackageFilterDto, - cursor?: string, - ) => [...keys.all, "/packages", "infinite", limit, order, filter, cursor] as const, - }; + findAll: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string) => [...keys.all, "/packages", limit, order, filter, page, cursor] as const, + findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string) => [...keys.all, "/packages", "infinite", limit, order, filter, cursor] as const, +}; - /** - * Query `useFindAll` - * @description Lists packages - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ControlTowerPackagesModels.PackageFilterDto; - page?: number; - cursor?: string; +/** + * Query `useFindAll` + * @description Lists packages + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.findAll(limit, order, filter, page, cursor), + queryFn: () => + ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor), + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @description Lists packages + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` + * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor, config), - ...options, - }); - }; + ...options, + }); +}; - /** - * Infinite query `useFindAllInfinite - * @description Lists packages - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ControlTowerPackagesModels.PackageFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; } diff --git a/test/generated/base/controlTowerSearch/controlTowerSearch.api.ts b/test/generated/base/controlTowerSearch/controlTowerSearch.api.ts index 862a8ac..089524b 100644 --- a/test/generated/base/controlTowerSearch/controlTowerSearch.api.ts +++ b/test/generated/base/controlTowerSearch/controlTowerSearch.api.ts @@ -1,30 +1,20 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerSearchModels } from "./controlTowerSearch.models"; export namespace ControlTowerSearchApi { - export const search = ( - data: ControlTowerSearchModels.SearchRequestDto, - type?: ControlTowerSearchModels.SearchItemTypeEnum, - limit?: number, - config?: AxiosRequestConfig, - ) => { +export const search = (data: ControlTowerSearchModels.SearchRequestDto, type?: ControlTowerSearchModels.SearchItemTypeEnum, limit?: number, ) => { return AppRestClient.post( - { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, - `/search`, - ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), - { - ...config, - params: { - type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { - type: "query", - name: "type", - }), - limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), - }, - }, - ); - }; + { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, + `/search`, + ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), + { + params: { + type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { type: "query", name: "type" }), + limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), + }, + } + ) +}; } diff --git a/test/generated/base/controlTowerSearch/controlTowerSearch.models.ts b/test/generated/base/controlTowerSearch/controlTowerSearch.models.ts index c66a4c7..c08141b 100644 --- a/test/generated/base/controlTowerSearch/controlTowerSearch.models.ts +++ b/test/generated/base/controlTowerSearch/controlTowerSearch.models.ts @@ -1,51 +1,42 @@ import { z } from "zod"; export namespace ControlTowerSearchModels { - /** - * SearchItemTypeEnumSchema - * @type { enum } - */ - export const SearchItemTypeEnumSchema = z.enum(["Project", "Booking", "Container"]); - export type SearchItemTypeEnum = z.infer; - export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; +/** + * SearchItemTypeEnumSchema + * @type { enum } + */ +export const SearchItemTypeEnumSchema = z.enum(["Project", "Booking", "Container"]); +export type SearchItemTypeEnum = z.infer; +export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; - /** - * SearchItemDtoSchema - * @type { object } - * @property { SearchItemTypeEnum } type - * @property { string } id - * @property { string } label - */ - export const SearchItemDtoSchema = z - .object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }) - .readonly(); - export type SearchItemDto = z.infer; +/** + * SearchItemDtoSchema + * @type { object } + * @property { SearchItemTypeEnum } type + * @property { string } id + * @property { string } label + */ +export const SearchItemDtoSchema = z.object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }); +export type SearchItemDto = z.infer; - /** - * SearchResponseDtoSchema - * @type { object } - * @property { SearchItemDto[] } items - * @property { number } projectsCount - * @property { number } bookingsCount - * @property { number } containersCount - * @property { number } totalCount - */ - export const SearchResponseDtoSchema = z - .object({ - items: z.array(SearchItemDtoSchema).readonly(), - projectsCount: z.number(), - bookingsCount: z.number(), - containersCount: z.number(), - totalCount: z.number(), - }) - .readonly(); - export type SearchResponseDto = z.infer; +/** + * SearchResponseDtoSchema + * @type { object } + * @property { SearchItemDto[] } items + * @property { number } projectsCount + * @property { number } bookingsCount + * @property { number } containersCount + * @property { number } totalCount + */ +export const SearchResponseDtoSchema = z.object({ items: z.array(SearchItemDtoSchema), projectsCount: z.number(), bookingsCount: z.number(), containersCount: z.number(), totalCount: z.number() }); +export type SearchResponseDto = z.infer; + +/** + * SearchRequestDtoSchema + * @type { object } + * @property { string } search + */ +export const SearchRequestDtoSchema = z.object({ search: z.string() }); +export type SearchRequestDto = z.infer; - /** - * SearchRequestDtoSchema - * @type { object } - * @property { string } search - */ - export const SearchRequestDtoSchema = z.object({ search: z.string() }).readonly(); - export type SearchRequestDto = z.infer; } diff --git a/test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts b/test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts index 2ee15d8..4f95297 100644 --- a/test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts +++ b/test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -7,38 +6,32 @@ import { ControlTowerSearchModels } from "./controlTowerSearch.models"; import { ControlTowerSearchApi } from "./controlTowerSearch.api"; export namespace ControlTowerSearchQueries { - export const moduleName = QueryModule.ControlTowerSearch; +export const moduleName = QueryModule.ControlTowerSearch; - /** - * Mutation `useSearch` - * @param { ControlTowerSearchModels.SearchRequestDto } mutation.data Body parameter - * @param { ControlTowerSearchModels.SearchItemTypeEnum } mutation.type Query parameter - * @param { number } mutation.limit Query parameter. Minimum: `1` - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useSearch = ( - options?: AppMutationOptions< - typeof ControlTowerSearchApi.search, - { - data: ControlTowerSearchModels.SearchRequestDto; - type?: ControlTowerSearchModels.SearchItemTypeEnum; - limit?: number; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data, type, limit }) => ControlTowerSearchApi.search(data, type, limit, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + +/** + * Mutation `useSearch` + * @param { ControlTowerSearchModels.SearchRequestDto } mutation.data Body parameter + * @param { ControlTowerSearchModels.SearchItemTypeEnum } mutation.type Query parameter + * @param { number } mutation.limit Query parameter. Minimum: `1` + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useSearch = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data, type, limit }) => + ControlTowerSearchApi.search(data, type, limit) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + } diff --git a/test/generated/base/countries/countries.acl.ts b/test/generated/base/countries/countries.acl.ts index f8322d8..0d2de89 100644 --- a/test/generated/base/countries/countries.acl.ts +++ b/test/generated/base/countries/countries.acl.ts @@ -1,21 +1,34 @@ import { AbilityTuple } from "@casl/ability"; export namespace CountriesAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Country" +] as AbilityTuple<"Read", "Country">; - /** - * Use for `usePaginateCountryLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCountryLabels` query - */ - export const canUsePaginateCountryLabels = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; +/** + * Use for `usePaginateCountryLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCountryLabels` query + */ +export const canUsePaginateCountryLabels = ( +) => [ + "Read", + "Country" +] as AbilityTuple<"Read", "Country">; + +/** + * Use for `useGetCountryById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCountryById` query + */ +export const canUseGetCountryById = ( +) => [ + "Read", + "Country" +] as AbilityTuple<"Read", "Country">; - /** - * Use for `useGetCountryById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCountryById` query - */ - export const canUseGetCountryById = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; } diff --git a/test/generated/base/countries/countries.api.ts b/test/generated/base/countries/countries.api.ts index 2fa38fc..a40357c 100644 --- a/test/generated/base/countries/countries.api.ts +++ b/test/generated/base/countries/countries.api.ts @@ -1,87 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CountriesModels } from "./countries.models"; export namespace CountriesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CountriesModels.CountriesPaginateResponseSchema }, `/countries/paginate`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const paginateCountryLabels = ( - limit: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginate = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, - `/countries/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const getCountryById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: CountriesModels.CountryResponseDTOSchema }, `/countries/${id}`, config); - }; + { resSchema: CountriesModels.CountriesPaginateResponseSchema }, + `/countries/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateCountryLabels = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, + `/countries/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getCountryById = (id: string, ) => { + return AppRestClient.get( + { resSchema: CountriesModels.CountryResponseDTOSchema }, + `/countries/${id}`, + + ) +}; } diff --git a/test/generated/base/countries/countries.configs.ts b/test/generated/base/countries/countries.configs.ts index 44ddf5b..52d1c12 100644 --- a/test/generated/base/countries/countries.configs.ts +++ b/test/generated/base/countries/countries.configs.ts @@ -6,78 +6,79 @@ import { CountriesQueries } from "./countries.queries"; import { CountriesAcl } from "./countries.acl"; export namespace CountriesConfigs { - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: CountriesAcl.canUsePaginate, - schema: CountriesModels.CountryResponseDTOSchema, - paginated: CountriesQueries.usePaginate, - infinite: CountriesQueries.usePaginateInfinite, - filters: { - schema: CountriesModels.CountryPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CountriesModels.CountryPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: CountriesAcl.canUsePaginate, schema: CountriesModels.CountryResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - isoCode2: true, - isoCode3: true, - currencyNotation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CountriesModels.CountriesPaginateOrderParamEnumSchema, + paginated: CountriesQueries.usePaginate, + infinite: CountriesQueries.usePaginateInfinite, + filters: { + schema: CountriesModels.CountryPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CountriesModels.CountryPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CountriesModels.CountryResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + isoCode2: true, + isoCode3: true, + currencyNotation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CountriesModels.CountriesPaginateOrderParamEnumSchema, + }, +}), }, - }; +}; - export const labelsPaginateConfig = { +export const labelsPaginateConfig = { meta: { - title: "Labels Paginate", + title: "Labels Paginate", }, readAll: { - acl: CountriesAcl.canUsePaginateCountryLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CountriesQueries.usePaginateCountryLabels, - infinite: CountriesQueries.usePaginateCountryLabelsInfinite, - filters: { - schema: CountriesModels.CountryPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CountriesModels.CountryPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: CountriesAcl.canUsePaginateCountryLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CountriesModels.PaginateCountryLabelsOrderParamEnumSchema, + paginated: CountriesQueries.usePaginateCountryLabels, + infinite: CountriesQueries.usePaginateCountryLabelsInfinite, + filters: { + schema: CountriesModels.CountryPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CountriesModels.CountryPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: CountriesModels.PaginateCountryLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/countries/countries.models.ts b/test/generated/base/countries/countries.models.ts index 50d14ae..70ffc2c 100644 --- a/test/generated/base/countries/countries.models.ts +++ b/test/generated/base/countries/countries.models.ts @@ -2,116 +2,81 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace CountriesModels { - /** - * CountryEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CountryEmployeeDTO = z.infer; +/** + * CountryEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type CountryEmployeeDTO = z.infer; - /** - * CountryResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the country - * @property { string } name Name of the country - * @property { string } isoCode2 ISO 2-letter code - * @property { string } isoCode3 ISO 3-letter code - * @property { string } currencyNotation Currency notation - * @property { string } createdById - * @property { CountryEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CountryEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const CountryResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the country"), - name: z.string().describe("Name of the country"), - isoCode2: z.string().describe("ISO 2-letter code"), - isoCode3: z.string().describe("ISO 3-letter code"), - currencyNotation: z.string().describe("Currency notation"), - createdById: z.string().nullish(), - createdBy: CountryEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: CountryEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type CountryResponseDTO = z.infer; +/** + * CountryResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the country + * @property { string } name Name of the country + * @property { string } isoCode2 ISO 2-letter code + * @property { string } isoCode3 ISO 3-letter code + * @property { string } currencyNotation Currency notation + * @property { string } createdById + * @property { CountryEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { CountryEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const CountryResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string(), currencyNotation: z.string(), createdById: z.string().nullish(), createdBy: CountryEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CountryEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type CountryResponseDTO = z.infer; - /** - * CountryPaginationFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const CountryPaginationFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type CountryPaginationFilterDto = z.infer; +/** + * CountryPaginationFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const CountryPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type CountryPaginationFilterDto = z.infer; - /** - * CountriesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const CountriesPaginateOrderParamEnumSchema = z.enum([ - "name", - "isoCode2", - "isoCode3", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type CountriesPaginateOrderParamEnum = z.infer; - export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSchema.enum; +/** + * CountriesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const CountriesPaginateOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type CountriesPaginateOrderParamEnum = z.infer; +export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSchema.enum; - /** - * CountriesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CountryResponseDTO[] } items - */ - export const CountriesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CountryResponseDTOSchema).readonly() }).readonly().shape, - }); - export type CountriesPaginateResponse = z.infer; +/** + * CountriesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CountryResponseDTO[] } items + */ +export const CountriesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CountryResponseDTOSchema).nullable() }).partial().shape }); +export type CountriesPaginateResponse = z.infer; - /** - * PaginateCountryLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PaginateCountryLabelsOrderParamEnumSchema = z.enum([ - "name", - "isoCode2", - "isoCode3", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PaginateCountryLabelsOrderParamEnum = z.infer; - export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderParamEnumSchema.enum; +/** + * PaginateCountryLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateCountryLabelsOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateCountryLabelsOrderParamEnum = z.infer; +export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderParamEnumSchema.enum; + +/** + * PaginateCountryLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateCountryLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type PaginateCountryLabelsResponse = z.infer; - /** - * PaginateCountryLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PaginateCountryLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PaginateCountryLabelsResponse = z.infer; } diff --git a/test/generated/base/countries/countries.queries.ts b/test/generated/base/countries/countries.queries.ts index 437d0c0..e6a56f4 100644 --- a/test/generated/base/countries/countries.queries.ts +++ b/test/generated/base/countries/countries.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -8,226 +7,146 @@ import { CountriesModels } from "./countries.models"; import { CountriesApi } from "./countries.api"; export namespace CountriesQueries { - export const moduleName = QueryModule.Countries; +export const moduleName = QueryModule.Countries; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/countries/paginate", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/countries/paginate", "infinite", limit, order, filter, cursor] as const, - paginateCountryLabels: ( - limit?: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/countries/labels/paginate", limit, order, filter, page, cursor] as const, - paginateCountryLabelsInfinite: ( - limit?: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/countries/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/paginate", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/paginate", "infinite", limit, order, filter, cursor] as const, + paginateCountryLabels: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/labels/paginate", limit, order, filter, page, cursor] as const, + paginateCountryLabelsInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/labels/paginate", "infinite", limit, order, filter, cursor] as const, getCountryById: (id: string) => [...keys.all, "/countries/:id", id] as const, - }; +}; - /** - * Query `usePaginate` - * @summary Paginate Countries - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CountriesModels.CountryPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginate` + * @summary Paginate Countries + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CountriesAcl.canUsePaginate()); + return CountriesApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Countries - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CountriesModels.CountryPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Countries + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginateCountryLabels` - * @summary Paginate country labels (id and name only) - * @permission Requires `canUsePaginateCountryLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCountryLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CountriesModels.CountryPaginationFilterDto; - page?: number; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CountriesAcl.canUsePaginate()); + return CountriesApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateCountryLabels` + * @summary Paginate country labels (id and name only) + * @permission Requires `canUsePaginateCountryLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCountryLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CountriesAcl.canUsePaginateCountryLabels()); + return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateCountryLabelsInfinite - * @summary Paginate country labels (id and name only) - * @permission Requires `canUsePaginateCountryLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCountryLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CountriesModels.CountryPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateCountryLabelsInfinite + * @summary Paginate country labels (id and name only) + * @permission Requires `canUsePaginateCountryLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCountryLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CountriesAcl.canUsePaginateCountryLabels()); + return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useGetCountryById` - * @summary Get country by ID with complete details - * @permission Requires `canUseGetCountryById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCountryById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetCountryById` + * @summary Get country by ID with complete details + * @permission Requires `canUseGetCountryById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCountryById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCountryById(id), + queryFn: () => { + checkAcl(CountriesAcl.canUseGetCountryById()); + return CountriesApi.getCountryById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getCountryById(id), - queryFn: () => { - checkAcl(CountriesAcl.canUseGetCountryById()); - return CountriesApi.getCountryById(id, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/currencies/currencies.acl.ts b/test/generated/base/currencies/currencies.acl.ts index 6756e17..ff528da 100644 --- a/test/generated/base/currencies/currencies.acl.ts +++ b/test/generated/base/currencies/currencies.acl.ts @@ -1,39 +1,64 @@ import { AbilityTuple } from "@casl/ability"; export namespace CurrenciesAcl { - /** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; +/** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; - /** - * Use for `useCreateCurrency` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCurrency` mutation - */ - export const canUseCreateCurrency = () => ["Create", "Currency"] as AbilityTuple<"Create", "Currency">; +/** + * Use for `useCreateCurrency` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCurrency` mutation + */ +export const canUseCreateCurrency = ( +) => [ + "Create", + "Currency" +] as AbilityTuple<"Create", "Currency">; - /** - * Use for `usePaginateCurrencyLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabels` query - */ - export const canUsePaginateCurrencyLabels = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; +/** + * Use for `usePaginateCurrencyLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabels` query + */ +export const canUsePaginateCurrencyLabels = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; - /** - * Use for `useGetCurrencyById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCurrencyById` query - */ - export const canUseGetCurrencyById = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; +/** + * Use for `useGetCurrencyById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCurrencyById` query + */ +export const canUseGetCurrencyById = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; - /** - * Use for `useUpdateCurrency` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCurrency` mutation - */ - export const canUseUpdateCurrency = () => ["Update", "Currency"] as AbilityTuple<"Update", "Currency">; +/** + * Use for `useUpdateCurrency` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCurrency` mutation + */ +export const canUseUpdateCurrency = ( +) => [ + "Update", + "Currency" +] as AbilityTuple<"Update", "Currency">; + +/** + * Use for `usePaginateCurrencyLabelsByOffice` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabelsByOffice` query + */ +export const canUsePaginateCurrencyLabelsByOffice = ( +) => [ + "Read", + "Currency" +] as AbilityTuple<"Read", "Currency">; - /** - * Use for `usePaginateCurrencyLabelsByOffice` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabelsByOffice` query - */ - export const canUsePaginateCurrencyLabelsByOffice = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; } diff --git a/test/generated/base/currencies/currencies.api.ts b/test/generated/base/currencies/currencies.api.ts index 1197a78..f989e32 100644 --- a/test/generated/base/currencies/currencies.api.ts +++ b/test/generated/base/currencies/currencies.api.ts @@ -1,154 +1,75 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CurrenciesModels } from "./currencies.models"; export namespace CurrenciesApi { - export const list = ( - limit: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CurrenciesModels.CurrenciesListResponseSchema }, `/currencies`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, config?: AxiosRequestConfig) => { +export const list = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: CurrenciesModels.CurrenciesListResponseSchema }, + `/currencies`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, ) => { return AppRestClient.post( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies`, - ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), - config, - ); - }; - - export const paginateCurrencyLabels = ( - limit: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies`, + ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), + + ) +}; +export const paginateCurrencyLabels = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, - `/currencies/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const getCurrencyById = (isoCode: string, config?: AxiosRequestConfig) => { + { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, + `/currencies/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getCurrencyById = (isoCode: string, ) => { return AppRestClient.get( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies/${isoCode}`, - config, - ); - }; - - export const updateCurrency = ( - isoCode: string, - data: CurrenciesModels.UpdateCurrencyRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies/${isoCode}`, + + ) +}; +export const updateCurrency = (isoCode: string, data: CurrenciesModels.UpdateCurrencyRequestDTO, ) => { return AppRestClient.patch( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies/${isoCode}`, - ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), - config, - ); - }; - - export const paginateCurrencyLabelsByOffice = ( - officeId: string, - limit: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, + `/currencies/${isoCode}`, + ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), + + ) +}; +export const paginateCurrencyLabelsByOffice = (officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, - `/offices/${officeId}/currencies/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; + { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, + `/offices/${officeId}/currencies/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; } diff --git a/test/generated/base/currencies/currencies.configs.ts b/test/generated/base/currencies/currencies.configs.ts index 0496bec..6d36fb1 100644 --- a/test/generated/base/currencies/currencies.configs.ts +++ b/test/generated/base/currencies/currencies.configs.ts @@ -6,147 +6,148 @@ import { CurrenciesQueries } from "./currencies.queries"; import { CurrenciesAcl } from "./currencies.acl"; export namespace CurrenciesConfigs { - export const currenciesConfig = { +export const currenciesConfig = { meta: { - title: "Currencies", + title: "Currencies", }, readAll: { - acl: CurrenciesAcl.canUseList, - schema: CurrenciesModels.CurrencyResponseDtoSchema, - paginated: CurrenciesQueries.useList, - infinite: CurrenciesQueries.useListInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: CurrenciesAcl.canUseList, schema: CurrenciesModels.CurrencyResponseDtoSchema, - options: { - columns: { - isoCode: true, - name: true, - symbol: true, - alignment: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CurrenciesModels.CurrenciesListOrderParamEnumSchema, + paginated: CurrenciesQueries.useList, + infinite: CurrenciesQueries.useListInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CurrenciesModels.CurrencyResponseDtoSchema, + options: { + columns: { + isoCode: true, + name: true, + symbol: true, + alignment: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: CurrenciesModels.CurrenciesListOrderParamEnumSchema, + }, +}), }, read: { - acl: CurrenciesAcl.canUseGetCurrencyById, - schema: CurrenciesModels.CurrencyResponseDtoSchema, - query: CurrenciesQueries.useGetCurrencyById, + acl: CurrenciesAcl.canUseGetCurrencyById, + schema: CurrenciesModels.CurrencyResponseDtoSchema, + query: CurrenciesQueries.useGetCurrencyById, }, create: { - acl: CurrenciesAcl.canUseCreateCurrency, - schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, - mutation: CurrenciesQueries.useCreateCurrency, - inputDefs: dynamicInputs({ + acl: CurrenciesAcl.canUseCreateCurrency, schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, - options: { - inputs: { - isoCode: true, - name: true, - symbol: true, - alignment: true, - }, - }, - }), + mutation: CurrenciesQueries.useCreateCurrency, + inputDefs: dynamicInputs({ + schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, + options: { + inputs: { + isoCode: true, + name: true, + symbol: true, + alignment: true, + }, + }, +}) }, update: { - acl: CurrenciesAcl.canUseUpdateCurrency, - schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, - mutation: CurrenciesQueries.useUpdateCurrency, - inputDefs: dynamicInputs({ + acl: CurrenciesAcl.canUseUpdateCurrency, schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), + mutation: CurrenciesQueries.useUpdateCurrency, + inputDefs: dynamicInputs({ + schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, + options: { + inputs: { + name: true, }, - }; + }, +}) + }, +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: CurrenciesAcl.canUsePaginateCurrencyLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CurrenciesQueries.usePaginateCurrencyLabels, - infinite: CurrenciesQueries.usePaginateCurrencyLabelsInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: CurrenciesAcl.canUsePaginateCurrencyLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema, + paginated: CurrenciesQueries.usePaginateCurrencyLabels, + infinite: CurrenciesQueries.usePaginateCurrencyLabelsInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema, + }, +}), }, - }; +}; - export const labelsPaginateConfig = { +export const labelsPaginateConfig = { meta: { - title: "Labels Paginate", + title: "Labels Paginate", }, readAll: { - acl: CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CurrenciesQueries.usePaginateCurrencyLabelsByOffice, - infinite: CurrenciesQueries.usePaginateCurrencyLabelsByOfficeInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema, + paginated: CurrenciesQueries.usePaginateCurrencyLabelsByOffice, + infinite: CurrenciesQueries.usePaginateCurrencyLabelsByOfficeInfinite, + filters: { + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, + options: { + inputs: { + officeId: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + }, + sortable: CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema, + }, +}), }, - }; +}; + } diff --git a/test/generated/base/currencies/currencies.models.ts b/test/generated/base/currencies/currencies.models.ts index 7330e3c..1124eaf 100644 --- a/test/generated/base/currencies/currencies.models.ts +++ b/test/generated/base/currencies/currencies.models.ts @@ -2,174 +2,121 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace CurrenciesModels { - /** - * CurrencyEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CurrencyEmployeeDTO = z.infer; +/** + * CurrencyEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type CurrencyEmployeeDTO = z.infer; - /** - * CurrencyResponseDtoSchema - * @type { object } - * @property { string } isoCode isoCode of the currency - * @property { string } name Name of the currency - * @property { string } symbol Symbol of the currency - * @property { string } alignment Alignment of the currency - * @property { string } createdById ID of the employee who created this currency - * @property { CurrencyEmployeeDTO } createdBy Employee who created this currency - * @property { string } createdAt Date when the currency was created - * @property { string } updatedById ID of the employee who last updated this currency - * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency - * @property { string } updatedAt Date when the currency was last updated - */ - export const CurrencyResponseDtoSchema = z - .object({ - isoCode: z.string().describe("isoCode of the currency"), - name: z.string().describe("Name of the currency"), - symbol: z.string().describe("Symbol of the currency").nullish(), - alignment: z.string().describe("Alignment of the currency").nullish(), - createdById: z.string().describe("ID of the employee who created this currency").nullish(), - createdBy: CurrencyEmployeeDTOSchema.describe("Employee who created this currency").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Date when the currency was created"), - updatedById: z.string().describe("ID of the employee who last updated this currency").nullish(), - updatedBy: CurrencyEmployeeDTOSchema.describe("Employee who last updated this currency").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Date when the currency was last updated"), - }) - .readonly(); - export type CurrencyResponseDto = z.infer; +/** + * CurrencyResponseDtoSchema + * @type { object } + * @property { string } isoCode isoCode of the currency + * @property { string } name Name of the currency + * @property { string } symbol Symbol of the currency + * @property { string } alignment Alignment of the currency + * @property { string } createdById ID of the employee who created this currency + * @property { CurrencyEmployeeDTO } createdBy Employee who created this currency + * @property { string } createdAt Date when the currency was created + * @property { string } updatedById ID of the employee who last updated this currency + * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency + * @property { string } updatedAt Date when the currency was last updated + */ +export const CurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string(), symbol: z.string().nullish(), alignment: z.string().nullish(), createdById: z.string().nullish(), createdBy: CurrencyEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CurrencyEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type CurrencyResponseDto = z.infer; - /** - * CurrencyPaginationFilterDtoSchema - * @type { object } - * @property { string } officeId - * @property { string } search - */ - export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string(), search: z.string() }).readonly(); - export type CurrencyPaginationFilterDto = z.infer; +/** + * CurrencyPaginationFilterDtoSchema + * @type { object } + * @property { string } officeId + * @property { string } search + */ +export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string().nullable(), search: z.string().nullable() }).partial(); +export type CurrencyPaginationFilterDto = z.infer; - /** - * CreateCurrencyRequestDTOSchema - * @type { object } - * @property { string } isoCode Unique identifier for the currency - * @property { string } name Name of the currency - * @property { string } symbol Symbol of the currency - * @property { string } alignment Alignment of the currency - */ - export const CreateCurrencyRequestDTOSchema = z - .object({ - isoCode: z.string().describe("Unique identifier for the currency"), - name: z.string().describe("Name of the currency"), - symbol: z.string().describe("Symbol of the currency"), - alignment: z.string().describe("Alignment of the currency"), - }) - .readonly(); - export type CreateCurrencyRequestDTO = z.infer; +/** + * CreateCurrencyRequestDTOSchema + * @type { object } + * @property { string } isoCode Unique identifier for the currency + * @property { string } name Name of the currency + * @property { string } symbol Symbol of the currency + * @property { string } alignment Alignment of the currency + */ +export const CreateCurrencyRequestDTOSchema = z.object({ isoCode: z.string(), name: z.string(), symbol: z.string(), alignment: z.string() }); +export type CreateCurrencyRequestDTO = z.infer; - /** - * UpdateCurrencyRequestDTOSchema - * @type { object } - * @property { string } name Name of the currency - */ - export const UpdateCurrencyRequestDTOSchema = z - .object({ name: z.string().describe("Name of the currency") }) - .readonly(); - export type UpdateCurrencyRequestDTO = z.infer; +/** + * UpdateCurrencyRequestDTOSchema + * @type { object } + * @property { string } name Name of the currency + */ +export const UpdateCurrencyRequestDTOSchema = z.object({ name: z.string().nullable() }).partial(); +export type UpdateCurrencyRequestDTO = z.infer; - /** - * CurrenciesListOrderParamEnumSchema - * @type { enum } - */ - export const CurrenciesListOrderParamEnumSchema = z.enum([ - "isoCode", - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type CurrenciesListOrderParamEnum = z.infer; - export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.enum; +/** + * CurrenciesListOrderParamEnumSchema + * @type { enum } + */ +export const CurrenciesListOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type CurrenciesListOrderParamEnum = z.infer; +export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.enum; - /** - * CurrenciesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CurrencyResponseDto[] } items - */ - export const CurrenciesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CurrencyResponseDtoSchema).readonly() }).readonly().shape, - }); - export type CurrenciesListResponse = z.infer; +/** + * CurrenciesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CurrencyResponseDto[] } items + */ +export const CurrenciesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CurrencyResponseDtoSchema).nullable() }).partial().shape }); +export type CurrenciesListResponse = z.infer; - /** - * PaginateCurrencyLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PaginateCurrencyLabelsOrderParamEnumSchema = z.enum([ - "isoCode", - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PaginateCurrencyLabelsOrderParamEnum = z.infer; - export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderParamEnumSchema.enum; +/** + * PaginateCurrencyLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateCurrencyLabelsOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateCurrencyLabelsOrderParamEnum = z.infer; +export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderParamEnumSchema.enum; - /** - * PaginateCurrencyLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PaginateCurrencyLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PaginateCurrencyLabelsResponse = z.infer; +/** + * PaginateCurrencyLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateCurrencyLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type PaginateCurrencyLabelsResponse = z.infer; - /** - * PaginateCurrencyLabelsByOfficeOrderParamEnumSchema - * @type { enum } - */ - export const PaginateCurrencyLabelsByOfficeOrderParamEnumSchema = z.enum([ - "isoCode", - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PaginateCurrencyLabelsByOfficeOrderParamEnum = z.infer< - typeof PaginateCurrencyLabelsByOfficeOrderParamEnumSchema - >; - export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabelsByOfficeOrderParamEnumSchema.enum; +/** + * PaginateCurrencyLabelsByOfficeOrderParamEnumSchema + * @type { enum } + */ +export const PaginateCurrencyLabelsByOfficeOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateCurrencyLabelsByOfficeOrderParamEnum = z.infer; +export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabelsByOfficeOrderParamEnumSchema.enum; + +/** + * PaginateCurrencyLabelsByOfficeResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type PaginateCurrencyLabelsByOfficeResponse = z.infer; - /** - * PaginateCurrencyLabelsByOfficeResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PaginateCurrencyLabelsByOfficeResponse = z.infer; } diff --git a/test/generated/base/currencies/currencies.queries.ts b/test/generated/base/currencies/currencies.queries.ts index 6845288..0758b4a 100644 --- a/test/generated/base/currencies/currencies.queries.ts +++ b/test/generated/base/currencies/currencies.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,423 +8,260 @@ import { CurrenciesModels } from "./currencies.models"; import { CurrenciesApi } from "./currencies.api"; export namespace CurrenciesQueries { - export const moduleName = QueryModule.Currencies; +export const moduleName = QueryModule.Currencies; - export const keys = { +export const keys = { all: [moduleName] as const, - list: ( - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/currencies", limit, order, filter, page, cursor] as const, - listInfinite: ( - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/currencies", "infinite", limit, order, filter, cursor] as const, - paginateCurrencyLabels: ( - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/currencies/labels/paginate", limit, order, filter, page, cursor] as const, - paginateCurrencyLabelsInfinite: ( - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/currencies/labels/paginate", "infinite", limit, order, filter, cursor] as const, + list: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies", "infinite", limit, order, filter, cursor] as const, + paginateCurrencyLabels: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies/labels/paginate", limit, order, filter, page, cursor] as const, + paginateCurrencyLabelsInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies/labels/paginate", "infinite", limit, order, filter, cursor] as const, getCurrencyById: (isoCode: string) => [...keys.all, "/currencies/:isoCode", isoCode] as const, - paginateCurrencyLabelsByOffice: ( - officeId: string, - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/currencies/labels/paginate", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateCurrencyLabelsByOfficeInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/currencies/labels/paginate", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - }; + paginateCurrencyLabelsByOffice: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", officeId, limit, order, filter, page, cursor] as const, + paginateCurrencyLabelsByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, +}; - /** - * Query `useList` - * @summary List Currencies - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CurrenciesModels.CurrencyPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List Currencies - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CurrenciesModels.CurrencyPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreateCurrency` - * @summary Create Currency - * @permission Requires `canUseCreateCurrency` ability - * @param { CurrenciesModels.CreateCurrencyRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateCurrency = ( - options?: AppMutationOptions< - typeof CurrenciesApi.createCurrency, - { data: CurrenciesModels.CreateCurrencyRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Query `useList` + * @summary List Currencies + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUseList()); + return CurrenciesApi.list(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CurrenciesAcl.canUseCreateCurrency()); - return CurrenciesApi.createCurrency(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Infinite query `useListInfinite + * @summary List Currencies + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Query `usePaginateCurrencyLabels` - * @summary Paginate Currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCurrencyLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CurrenciesModels.CurrencyPaginationFilterDto; - page?: number; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUseList()); + return CurrenciesApi.list(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Mutation `useCreateCurrency` + * @summary Create Currency + * @permission Requires `canUseCreateCurrency` ability + * @param { CurrenciesModels.CreateCurrencyRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateCurrency = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Infinite query `usePaginateCurrencyLabelsInfinite - * @summary Paginate Currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCurrencyLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CurrenciesModels.CurrencyPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CurrenciesAcl.canUseCreateCurrency()); + return CurrenciesApi.createCurrency(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `usePaginateCurrencyLabels` + * @summary Paginate Currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Query `useGetCurrencyById` - * @summary Get Currency by iso code - * @permission Requires `canUseGetCurrencyById` ability - * @param { string } object.isoCode Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCurrencyById = ( - { isoCode }: { isoCode: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateCurrencyLabelsInfinite + * @summary Paginate Currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useQuery({ - queryKey: keys.getCurrencyById(isoCode), - queryFn: () => { - checkAcl(CurrenciesAcl.canUseGetCurrencyById()); - return CurrenciesApi.getCurrencyById(isoCode, config); - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Mutation `useUpdateCurrency` - * @summary Update Currency - * @permission Requires `canUseUpdateCurrency` ability - * @param { string } mutation.isoCode Path parameter - * @param { CurrenciesModels.UpdateCurrencyRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCurrency = ( - options?: AppMutationOptions< - typeof CurrenciesApi.updateCurrency, - { isoCode: string; data: CurrenciesModels.UpdateCurrencyRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Query `useGetCurrencyById` + * @summary Get Currency by iso code + * @permission Requires `canUseGetCurrencyById` ability + * @param { string } object.isoCode Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCurrencyById = ({ isoCode }: { isoCode: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCurrencyById(isoCode), + queryFn: () => { + checkAcl(CurrenciesAcl.canUseGetCurrencyById()); + return CurrenciesApi.getCurrencyById(isoCode) }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ isoCode, data }) => { - checkAcl(CurrenciesAcl.canUseUpdateCurrency()); - return CurrenciesApi.updateCurrency(isoCode, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { isoCode } = variables; - const updateKeys = [keys.getCurrencyById(isoCode)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdateCurrency` + * @summary Update Currency + * @permission Requires `canUseUpdateCurrency` ability + * @param { string } mutation.isoCode Path parameter + * @param { CurrenciesModels.UpdateCurrencyRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCurrency = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `usePaginateCurrencyLabelsByOffice` - * @summary Paginate office currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCurrencyLabelsByOffice = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CurrenciesModels.CurrencyPaginationFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ isoCode, data }) => { + checkAcl(CurrenciesAcl.canUseUpdateCurrency()); + return CurrenciesApi.updateCurrency(isoCode, data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { isoCode } = variables; + const updateKeys = [keys.getCurrencyById(isoCode)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateCurrencyLabelsByOffice` + * @summary Paginate office currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabelsByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateCurrencyLabelsByOfficeInfinite + * @summary Paginate office currency labels (id and name only) + * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` + * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateCurrencyLabelsByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateCurrencyLabelsByOfficeInfinite - * @summary Paginate office currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCurrencyLabelsByOfficeInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CurrenciesModels.CurrencyPaginationFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; } diff --git a/test/generated/base/customerAccount/customerAccount.api.ts b/test/generated/base/customerAccount/customerAccount.api.ts index f109278..6f77176 100644 --- a/test/generated/base/customerAccount/customerAccount.api.ts +++ b/test/generated/base/customerAccount/customerAccount.api.ts @@ -1,13 +1,12 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { CustomerAccountModels } from "./customerAccount.models"; export namespace CustomerAccountApi { - export const get = (config?: AxiosRequestConfig) => { +export const get = () => { return AppRestClient.get( - { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, - `/customers/account`, - config, - ); - }; + { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, + `/customers/account`, + + ) +}; } diff --git a/test/generated/base/customerAccount/customerAccount.models.ts b/test/generated/base/customerAccount/customerAccount.models.ts index c89279e..2656a0e 100644 --- a/test/generated/base/customerAccount/customerAccount.models.ts +++ b/test/generated/base/customerAccount/customerAccount.models.ts @@ -1,51 +1,37 @@ import { z } from "zod"; export namespace CustomerAccountModels { - /** - * CustomerCompanyDtoSchema - * @type { object } - * @property { string } id Company ID - * @property { string } name Company name - */ - export const CustomerCompanyDtoSchema = z - .object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name").nullish() }) - .readonly(); - export type CustomerCompanyDto = z.infer; +/** + * CustomerCompanyDtoSchema + * @type { object } + * @property { string } id Company ID + * @property { string } name Company name + */ +export const CustomerCompanyDtoSchema = z.object({ id: z.string(), name: z.string().nullish() }); +export type CustomerCompanyDto = z.infer; - /** - * CustomerBusinessPartnerDtoSchema - * @type { object } - * @property { string } id Company ID - * @property { string } name Company name - */ - export const CustomerBusinessPartnerDtoSchema = z - .object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name") }) - .readonly(); - export type CustomerBusinessPartnerDto = z.infer; +/** + * CustomerBusinessPartnerDtoSchema + * @type { object } + * @property { string } id Company ID + * @property { string } name Company name + */ +export const CustomerBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type CustomerBusinessPartnerDto = z.infer; + +/** + * CustomerAccountDtoSchema + * @type { object } + * @property { array[] } aclRules Can hold any type of value + * @property { string } id Customer ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { CustomerCompanyDto } company Company + * @property { CustomerBusinessPartnerDto } businessPartner + */ +export const CustomerAccountDtoSchema = z.object({ aclRules: z.array(z.array(z.any())), id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), phone: z.string().nullish(), company: CustomerCompanyDtoSchema.nullish(), businessPartner: CustomerBusinessPartnerDtoSchema.nullish() }); +export type CustomerAccountDto = z.infer; - /** - * CustomerAccountDtoSchema - * @type { object } - * @property { array[] } aclRules Can hold any type of value - * @property { string } id Customer ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { CustomerCompanyDto } company Company - * @property { CustomerBusinessPartnerDto } businessPartner - */ - export const CustomerAccountDtoSchema = z - .object({ - aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), - id: z.string().describe("Customer ID"), - email: z.email().describe("Email"), - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - phone: z.string().describe("Phone number").nullish(), - company: CustomerCompanyDtoSchema.describe("Company").nullish(), - businessPartner: CustomerBusinessPartnerDtoSchema.nullish(), - }) - .readonly(); - export type CustomerAccountDto = z.infer; } diff --git a/test/generated/base/customerAccount/customerAccount.queries.ts b/test/generated/base/customerAccount/customerAccount.queries.ts index fbe2767..daf37c4 100644 --- a/test/generated/base/customerAccount/customerAccount.queries.ts +++ b/test/generated/base/customerAccount/customerAccount.queries.ts @@ -1,32 +1,30 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions } from "@povio/openapi-codegen-cli"; import { CustomerAccountApi } from "./customerAccount.api"; export namespace CustomerAccountQueries { - export const moduleName = QueryModule.CustomerAccount; +export const moduleName = QueryModule.CustomerAccount; - export const keys = { +export const keys = { all: [moduleName] as const, - get: () => [...keys.all, "/customers/account"] as const, - }; + get: () => [...keys.all, "/customers/account", ] as const, +}; + +/** + * Query `useGet` + * @summary Get profile of logged-in user + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = (options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.get(), + queryFn: CustomerAccountApi.get, + ...options, + }); +}; - /** - * Query `useGet` - * @summary Get profile of logged-in user - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.get(), - queryFn: () => CustomerAccountApi.get(config), - ...options, - }); - }; } diff --git a/test/generated/base/customers/customers.acl.ts b/test/generated/base/customers/customers.acl.ts index 2e7c40d..bb972e0 100644 --- a/test/generated/base/customers/customers.acl.ts +++ b/test/generated/base/customers/customers.acl.ts @@ -1,41 +1,66 @@ import { AbilityTuple } from "@casl/ability"; export namespace CustomersAcl { - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Customer"] as AbilityTuple<"Create", "Customer">; +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Customer" +] as AbilityTuple<"Create", "Customer">; - /** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = () => ["Read", "Customer"] as AbilityTuple<"Read", "Customer">; +/** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( +) => [ + "Read", + "Customer" +] as AbilityTuple<"Read", "Customer">; - /** - * Use for `useFindById` query ability. - * @description Read a customer with id - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "Customer"] as AbilityTuple<"Read", "Customer">; +/** + * Use for `useFindById` query ability. + * @description Read a customer with id + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Customer" +] as AbilityTuple<"Read", "Customer">; - /** - * Use for `useUpdate` mutation ability. - * @description Update Customer - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Customer"] as AbilityTuple<"Update", "Customer">; +/** + * Use for `useUpdate` mutation ability. + * @description Update Customer + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Customer" +] as AbilityTuple<"Update", "Customer">; - /** - * Use for `useDeactivate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeactivate` mutation - */ - export const canUseDeactivate = () => ["Deactivate", "Customer"] as AbilityTuple<"Deactivate", "Customer">; +/** + * Use for `useDeactivate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeactivate` mutation + */ +export const canUseDeactivate = ( +) => [ + "Deactivate", + "Customer" +] as AbilityTuple<"Deactivate", "Customer">; + +/** + * Use for `useReactivate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReactivate` mutation + */ +export const canUseReactivate = ( +) => [ + "Reactivate", + "Customer" +] as AbilityTuple<"Reactivate", "Customer">; - /** - * Use for `useReactivate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReactivate` mutation - */ - export const canUseReactivate = () => ["Reactivate", "Customer"] as AbilityTuple<"Reactivate", "Customer">; } diff --git a/test/generated/base/customers/customers.api.ts b/test/generated/base/customers/customers.api.ts index b3d25b2..e418796 100644 --- a/test/generated/base/customers/customers.api.ts +++ b/test/generated/base/customers/customers.api.ts @@ -1,91 +1,66 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CustomersModels } from "./customers.models"; export namespace CustomersApi { - export const findProfile = (config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, `/customers/me`, config); - }; - - export const create = (data: CustomersModels.CreateCustomerDTO, config?: AxiosRequestConfig) => { +export const findProfile = () => { + return AppRestClient.get( + { resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, + `/customers/me`, + + ) +}; +export const create = (data: CustomersModels.CreateCustomerDTO, ) => { return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers`, - ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), - config, - ); - }; - - export const list = ( - limit: number, - order?: string, - filter?: CustomersModels.CustomerPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CustomersModels.CustomersListResponseSchema }, `/customers`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const findById = (customerId: string, config?: AxiosRequestConfig) => { + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers`, + ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), + + ) +}; +export const list = (limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${customerId}`, - config, - ); - }; - - export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, config?: AxiosRequestConfig) => { + { resSchema: CustomersModels.CustomersListResponseSchema }, + `/customers`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (customerId: string, ) => { + return AppRestClient.get( + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${customerId}`, + + ) +}; +export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, ) => { return AppRestClient.put( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${customerId}`, - ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), - config, - ); - }; - - export const deactivate = (id: string, config?: AxiosRequestConfig) => { + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${customerId}`, + ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), + + ) +}; +export const deactivate = (id: string, ) => { return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${id}/deactivate`, - undefined, - config, - ); - }; - - export const reactivate = (id: string, config?: AxiosRequestConfig) => { + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${id}/deactivate`, + + ) +}; +export const reactivate = (id: string, ) => { return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${id}/reactivate`, - undefined, - config, - ); - }; + { resSchema: CustomersModels.CustomerResponseDTOSchema }, + `/customers/${id}/reactivate`, + + ) +}; } diff --git a/test/generated/base/customers/customers.configs.ts b/test/generated/base/customers/customers.configs.ts index d9a2643..95eec1d 100644 --- a/test/generated/base/customers/customers.configs.ts +++ b/test/generated/base/customers/customers.configs.ts @@ -5,87 +5,88 @@ import { CustomersQueries } from "./customers.queries"; import { CustomersAcl } from "./customers.acl"; export namespace CustomersConfigs { - export const customersConfig = { +export const customersConfig = { meta: { - title: "Customers", + title: "Customers", }, readAll: { - acl: CustomersAcl.canUseList, - schema: CustomersModels.CustomerListItemDTOSchema, - paginated: CustomersQueries.useList, - infinite: CustomersQueries.useListInfinite, - filters: { - schema: CustomersModels.CustomerPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CustomersModels.CustomerPaginationFilterDtoSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - companyId: true, - businessPartnerId: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: CustomersAcl.canUseList, schema: CustomersModels.CustomerListItemDTOSchema, - options: { - columns: { - id: true, - firstName: true, - lastName: true, - email: true, - phone: true, - companyId: true, - businessPartnerId: true, - businessPartner: true, - }, - sortable: CustomersModels.CustomersListOrderParamEnumSchema, + paginated: CustomersQueries.useList, + infinite: CustomersQueries.useListInfinite, + filters: { + schema: CustomersModels.CustomerPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CustomersModels.CustomerPaginationFilterDtoSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + companyId: true, + businessPartnerId: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CustomersModels.CustomerListItemDTOSchema, + options: { + columns: { + id: true, + firstName: true, + lastName: true, + email: true, + phone: true, + companyId: true, + businessPartnerId: true, + businessPartner: true, + }, + sortable: CustomersModels.CustomersListOrderParamEnumSchema, + }, +}), }, read: { - acl: CustomersAcl.canUseFindById, - schema: CustomersModels.CustomerResponseDTOSchema, - query: CustomersQueries.useFindById, + acl: CustomersAcl.canUseFindById, + schema: CustomersModels.CustomerResponseDTOSchema, + query: CustomersQueries.useFindById, }, create: { - acl: CustomersAcl.canUseCreate, - schema: CustomersModels.CreateCustomerDTOSchema, - mutation: CustomersQueries.useCreate, - inputDefs: dynamicInputs({ + acl: CustomersAcl.canUseCreate, schema: CustomersModels.CreateCustomerDTOSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - phone: true, - companyId: true, - businessPartnerId: true, - }, - }, - }), + mutation: CustomersQueries.useCreate, + inputDefs: dynamicInputs({ + schema: CustomersModels.CreateCustomerDTOSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + phone: true, + companyId: true, + businessPartnerId: true, + }, + }, +}) }, update: { - acl: CustomersAcl.canUseUpdate, - schema: CustomersModels.UpdateCustomerDTOSchema, - mutation: CustomersQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: CustomersAcl.canUseUpdate, schema: CustomersModels.UpdateCustomerDTOSchema, - options: { - inputs: { - firstName: true, - lastName: true, - phone: true, - companyId: true, - businessPartnerId: true, - }, - }, - }), + mutation: CustomersQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: CustomersModels.UpdateCustomerDTOSchema, + options: { + inputs: { + firstName: true, + lastName: true, + phone: true, + companyId: true, + businessPartnerId: true, + }, + }, +}) }, - }; +}; + } diff --git a/test/generated/base/customers/customers.models.ts b/test/generated/base/customers/customers.models.ts index cc1328f..bf5e842 100644 --- a/test/generated/base/customers/customers.models.ts +++ b/test/generated/base/customers/customers.models.ts @@ -2,198 +2,136 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace CustomersModels { - /** - * CustomerProfileBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CustomerProfileBusinessPartnerDto = z.infer; +/** + * CustomerProfileBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type CustomerProfileBusinessPartnerDto = z.infer; - /** - * CustomerProfileResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - * @property { CustomerProfileBusinessPartnerDto } businessPartner - */ - export const CustomerProfileResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the customer"), - firstName: z.string().describe("First name of the customer"), - lastName: z.string().describe("Last name of the customer"), - email: z.email().describe("Email of the customer"), - phone: z.string().describe("Phone number of the customer"), - companyId: z.string().describe("Company id of the customer").nullish(), - businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), - businessPartner: CustomerProfileBusinessPartnerDtoSchema.nullish(), - }) - .readonly(); - export type CustomerProfileResponseDTO = z.infer; +/** + * CustomerProfileResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + * @property { CustomerProfileBusinessPartnerDto } businessPartner + */ +export const CustomerProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish(), businessPartner: CustomerProfileBusinessPartnerDtoSchema.nullish() }); +export type CustomerProfileResponseDTO = z.infer; - /** - * CustomerBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CustomerBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CustomerBusinessPartnerResponseDto = z.infer; +/** + * CustomerBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CustomerBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type CustomerBusinessPartnerResponseDto = z.infer; - /** - * CustomerResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company Id of the customer - * @property { string } businessPartnerId Business partner Id of the customer - * @property { boolean } archived Wether the customer is archived - * @property { CustomerBusinessPartnerResponseDto } businessPartner - */ - export const CustomerResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the customer"), - firstName: z.string().describe("First name of the customer"), - lastName: z.string().describe("Last name of the customer"), - email: z.email().describe("Email of the customer"), - phone: z.string().describe("Phone number of the customer"), - companyId: z.string().describe("Company Id of the customer").nullish(), - businessPartnerId: z.string().describe("Business partner Id of the customer").nullish(), - archived: z.boolean().describe("Wether the customer is archived"), - businessPartner: CustomerBusinessPartnerResponseDtoSchema.nullish(), - }) - .readonly(); - export type CustomerResponseDTO = z.infer; +/** + * CustomerResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company Id of the customer + * @property { string } businessPartnerId Business partner Id of the customer + * @property { boolean } archived Wether the customer is archived + * @property { CustomerBusinessPartnerResponseDto } businessPartner + */ +export const CustomerResponseDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish(), archived: z.boolean(), businessPartner: CustomerBusinessPartnerResponseDtoSchema.nullish() }); +export type CustomerResponseDTO = z.infer; - /** - * CustomerListItemBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CustomerListItemBusinessPartnerDto = z.infer; +/** + * CustomerListItemBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type CustomerListItemBusinessPartnerDto = z.infer; - /** - * CustomerListItemDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - * @property { CustomerListItemBusinessPartnerDto } businessPartner - */ - export const CustomerListItemDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the customer"), - firstName: z.string().describe("First name of the customer"), - lastName: z.string().describe("Last name of the customer"), - email: z.string().describe("Email of the customer"), - phone: z.string().describe("Phone number of the customer"), - companyId: z.string().describe("Company id of the customer").nullish(), - businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), - businessPartner: CustomerListItemBusinessPartnerDtoSchema.nullish(), - }) - .readonly(); - export type CustomerListItemDTO = z.infer; +/** + * CustomerListItemDTOSchema + * @type { object } + * @property { string } id Unique identifier of the customer + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + * @property { CustomerListItemBusinessPartnerDto } businessPartner + */ +export const CustomerListItemDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.string(), phone: z.string(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish(), businessPartner: CustomerListItemBusinessPartnerDtoSchema.nullish() }); +export type CustomerListItemDTO = z.infer; - /** - * CreateCustomerDTOSchema - * @type { object } - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - */ - export const CreateCustomerDTOSchema = z - .object({ - firstName: z.string().describe("First name of the customer"), - lastName: z.string().describe("Last name of the customer"), - email: z.email().describe("Email of the customer"), - phone: z.string().describe("Phone number of the customer").nullish(), - companyId: z.string().describe("Company id of the customer").nullish(), - businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), - }) - .readonly(); - export type CreateCustomerDTO = z.infer; +/** + * CreateCustomerDTOSchema + * @type { object } + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } email Email of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + */ +export const CreateCustomerDTOSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string().nullish(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish() }); +export type CreateCustomerDTO = z.infer; - /** - * CustomerPaginationFilterDtoSchema - * @type { object } - * @property { string } firstName - * @property { string } lastName - * @property { string } email - * @property { string } companyId - * @property { string } businessPartnerId - * @property { string } search - */ - export const CustomerPaginationFilterDtoSchema = z - .object({ - firstName: z.string(), - lastName: z.string(), - email: z.string(), - companyId: z.string(), - businessPartnerId: z.string(), - search: z.string(), - }) - .readonly(); - export type CustomerPaginationFilterDto = z.infer; +/** + * CustomerPaginationFilterDtoSchema + * @type { object } + * @property { string } firstName + * @property { string } lastName + * @property { string } email + * @property { string } companyId + * @property { string } businessPartnerId + * @property { string } search + */ +export const CustomerPaginationFilterDtoSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), companyId: z.string().nullable(), businessPartnerId: z.string().nullable(), search: z.string().nullable() }).partial(); +export type CustomerPaginationFilterDto = z.infer; - /** - * UpdateCustomerDTOSchema - * @type { object } - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - */ - export const UpdateCustomerDTOSchema = z - .object({ - firstName: z.string().describe("First name of the customer"), - lastName: z.string().describe("Last name of the customer"), - phone: z.string().describe("Phone number of the customer"), - companyId: z.string().describe("Company id of the customer"), - businessPartnerId: z.string().describe("Business partner id of the customer"), - }) - .readonly(); - export type UpdateCustomerDTO = z.infer; +/** + * UpdateCustomerDTOSchema + * @type { object } + * @property { string } firstName First name of the customer + * @property { string } lastName Last name of the customer + * @property { string } phone Phone number of the customer + * @property { string } companyId Company id of the customer + * @property { string } businessPartnerId Business partner id of the customer + */ +export const UpdateCustomerDTOSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), phone: z.string().nullable(), companyId: z.string().nullable(), businessPartnerId: z.string().nullable() }).partial(); +export type UpdateCustomerDTO = z.infer; - /** - * CustomersListOrderParamEnumSchema - * @type { enum } - */ - export const CustomersListOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "createdAt"]); - export type CustomersListOrderParamEnum = z.infer; - export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enum; +/** + * CustomersListOrderParamEnumSchema + * @type { enum } + */ +export const CustomersListOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "createdAt"]); +export type CustomersListOrderParamEnum = z.infer; +export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enum; + +/** + * CustomersListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CustomerListItemDTO[] } items + */ +export const CustomersListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CustomerListItemDTOSchema).nullable() }).partial().shape }); +export type CustomersListResponse = z.infer; - /** - * CustomersListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CustomerListItemDTO[] } items - */ - export const CustomersListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CustomerListItemDTOSchema).readonly() }).readonly().shape, - }); - export type CustomersListResponse = z.infer; } diff --git a/test/generated/base/customers/customers.queries.ts b/test/generated/base/customers/customers.queries.ts index c617a48..e187d61 100644 --- a/test/generated/base/customers/customers.queries.ts +++ b/test/generated/base/customers/customers.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,274 +8,213 @@ import { CustomersModels } from "./customers.models"; import { CustomersApi } from "./customers.api"; export namespace CustomersQueries { - export const moduleName = QueryModule.Customers; +export const moduleName = QueryModule.Customers; - export const keys = { +export const keys = { all: [moduleName] as const, - findProfile: () => [...keys.all, "/customers/me"] as const, - list: ( - limit?: number, - order?: string, - filter?: CustomersModels.CustomerPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/customers", limit, order, filter, page, cursor] as const, - listInfinite: ( - limit?: number, - order?: string, - filter?: CustomersModels.CustomerPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/customers", "infinite", limit, order, filter, cursor] as const, + findProfile: () => [...keys.all, "/customers/me", ] as const, + list: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/customers", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string) => [...keys.all, "/customers", "infinite", limit, order, filter, cursor] as const, findById: (customerId: string) => [...keys.all, "/customers/:customerId", customerId] as const, - }; - - /** - * Query `useFindProfile` - * @summary Get customer by id - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfile = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findProfile(), - queryFn: () => CustomersApi.findProfile(config), - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create new customer - * @permission Requires `canUseCreate` ability - * @param { CustomersModels.CreateCustomerDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CustomersAcl.canUseCreate()); - return CustomersApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useList` - * @summary List customers - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` - * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CustomersModels.CustomerPaginationFilterDto; - page?: number; - cursor?: string; +}; + +/** + * Query `useFindProfile` + * @summary Get customer by id + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfile = (options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.findProfile(), + queryFn: CustomersApi.findProfile, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create new customer + * @permission Requires `canUseCreate` ability + * @param { CustomersModels.CreateCustomerDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(CustomersAcl.canUseCreate()); + return CustomersApi.create(data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List customers - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` - * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CustomersModels.CustomerPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get customer by id - * @permission Requires `canUseFindById` ability - * @param { string } object.customerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { customerId }: { customerId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(customerId), - queryFn: () => { - checkAcl(CustomersAcl.canUseFindById()); - return CustomersApi.findById(customerId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update customer - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.customerId Path parameter - * @param { CustomersModels.UpdateCustomerDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof CustomersApi.update, - { customerId: string; data: CustomersModels.UpdateCustomerDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ customerId, data }) => { - checkAcl(CustomersAcl.canUseUpdate()); - return CustomersApi.update(customerId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { customerId } = variables; - const updateKeys = [keys.findById(customerId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeactivate` - * @summary Deactivate customer - * @permission Requires `canUseDeactivate` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeactivate = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CustomersAcl.canUseDeactivate()); - return CustomersApi.deactivate(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useReactivate` - * @summary Reactivate customer - * @permission Requires `canUseReactivate` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useReactivate = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useList` + * @summary List customers + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` + * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(CustomersAcl.canUseList()); + return CustomersApi.list(limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List customers + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` + * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(CustomersAcl.canUseList()); + return CustomersApi.list(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useFindById` + * @summary Get customer by id + * @permission Requires `canUseFindById` ability + * @param { string } object.customerId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ customerId }: { customerId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(customerId), + queryFn: () => { + checkAcl(CustomersAcl.canUseFindById()); + return CustomersApi.findById(customerId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update customer + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.customerId Path parameter + * @param { CustomersModels.UpdateCustomerDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ customerId, data }) => { + checkAcl(CustomersAcl.canUseUpdate()); + return CustomersApi.update(customerId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { customerId } = variables; + const updateKeys = [keys.findById(customerId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeactivate` + * @summary Deactivate customer + * @permission Requires `canUseDeactivate` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeactivate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CustomersAcl.canUseDeactivate()); + return CustomersApi.deactivate(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReactivate` + * @summary Reactivate customer + * @permission Requires `canUseReactivate` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReactivate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(CustomersAcl.canUseReactivate()); + return CustomersApi.reactivate(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CustomersAcl.canUseReactivate()); - return CustomersApi.reactivate(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/depots/depots.acl.ts b/test/generated/base/depots/depots.acl.ts index 58d424a..46e2374 100644 --- a/test/generated/base/depots/depots.acl.ts +++ b/test/generated/base/depots/depots.acl.ts @@ -1,45 +1,74 @@ import { AbilityTuple } from "@casl/ability"; export namespace DepotsAcl { - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Depot"] as AbilityTuple<"Create", "Depot">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Depot"] as AbilityTuple<"Update", "Depot">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "Depot"] as AbilityTuple<"Archive", "Depot">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "Depot"] as AbilityTuple<"Archive", "Depot">; +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Depot" +] as AbilityTuple<"Create", "Depot">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Depot" +] as AbilityTuple<"Update", "Depot">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Depot" +] as AbilityTuple<"Archive", "Depot">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "Depot" +] as AbilityTuple<"Archive", "Depot">; + } diff --git a/test/generated/base/depots/depots.api.ts b/test/generated/base/depots/depots.api.ts index 5885f5b..5b6a5b3 100644 --- a/test/generated/base/depots/depots.api.ts +++ b/test/generated/base/depots/depots.api.ts @@ -1,113 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DepotsModels } from "./depots.models"; export namespace DepotsApi { - export const create = (data: DepotsModels.CreateDepotRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: DepotsModels.CreateDepotRequestDTO, ) => { return AppRestClient.post( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots`, - ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), - config, - ); - }; - - export const paginate = ( - limit: number, - order?: string, - filter?: DepotsModels.DepotPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: DepotsModels.DepotsPaginateResponseSchema }, `/depots`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: DepotsModels.DepotLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots`, + ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), + + ) +}; +export const paginate = (limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, - `/depots/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: DepotsModels.DepotResponseDTOSchema }, `/depots/${id}`, config); - }; - - export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: DepotsModels.DepotsPaginateResponseSchema }, + `/depots`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, + `/depots/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, ) => { + return AppRestClient.get( + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots/${id}`, + + ) +}; +export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, ) => { return AppRestClient.put( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots/${id}`, - ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/depots/${id}/archive`, undefined, config); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/depots/${id}/unarchive`, undefined, config); - }; + { resSchema: DepotsModels.DepotResponseDTOSchema }, + `/depots/${id}`, + ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/depots/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/depots/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/depots/depots.configs.ts b/test/generated/base/depots/depots.configs.ts index 0eb5ea1..3e95aff 100644 --- a/test/generated/base/depots/depots.configs.ts +++ b/test/generated/base/depots/depots.configs.ts @@ -6,128 +6,129 @@ import { DepotsQueries } from "./depots.queries"; import { DepotsAcl } from "./depots.acl"; export namespace DepotsConfigs { - export const depotsConfig = { +export const depotsConfig = { meta: { - title: "Depots", + title: "Depots", }, readAll: { - acl: DepotsAcl.canUsePaginate, - schema: DepotsModels.DepotResponseDTOSchema, - paginated: DepotsQueries.usePaginate, - infinite: DepotsQueries.usePaginateInfinite, - filters: { - schema: DepotsModels.DepotPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DepotsModels.DepotPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DepotsAcl.canUsePaginate, schema: DepotsModels.DepotResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - name: true, - shortName: true, - additionalInformation: true, - address: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: DepotsModels.DepotsPaginateOrderParamEnumSchema, + paginated: DepotsQueries.usePaginate, + infinite: DepotsQueries.usePaginateInfinite, + filters: { + schema: DepotsModels.DepotPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DepotsModels.DepotPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: DepotsModels.DepotResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + name: true, + shortName: true, + additionalInformation: true, + address: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: DepotsModels.DepotsPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: DepotsAcl.canUseFindById, - schema: DepotsModels.DepotResponseDTOSchema, - query: DepotsQueries.useFindById, + acl: DepotsAcl.canUseFindById, + schema: DepotsModels.DepotResponseDTOSchema, + query: DepotsQueries.useFindById, }, create: { - acl: DepotsAcl.canUseCreate, - schema: DepotsModels.CreateDepotRequestDTOSchema, - mutation: DepotsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: DepotsAcl.canUseCreate, schema: DepotsModels.CreateDepotRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - additionalInformation: true, - name: true, - street: true, - zip: true, - district: true, - cityId: true, - countryId: true, - }, - }, - }), + mutation: DepotsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DepotsModels.CreateDepotRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + additionalInformation: true, + name: true, + street: true, + zip: true, + district: true, + cityId: true, + countryId: true, + }, + }, +}) }, update: { - acl: DepotsAcl.canUseUpdate, - schema: DepotsModels.UpdateDepotRequestDTOSchema, - mutation: DepotsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: DepotsAcl.canUseUpdate, schema: DepotsModels.UpdateDepotRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - additionalInformation: true, - name: true, - street: true, - zip: true, - district: true, - cityId: true, - countryId: true, - }, - }, - }), + mutation: DepotsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DepotsModels.UpdateDepotRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + additionalInformation: true, + name: true, + street: true, + zip: true, + district: true, + cityId: true, + countryId: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: DepotsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DepotsQueries.usePaginateLabels, - infinite: DepotsQueries.usePaginateLabelsInfinite, - filters: { - schema: DepotsModels.DepotLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DepotsModels.DepotLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DepotsAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema, + paginated: DepotsQueries.usePaginateLabels, + infinite: DepotsQueries.usePaginateLabelsInfinite, + filters: { + schema: DepotsModels.DepotLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DepotsModels.DepotLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/depots/depots.models.ts b/test/generated/base/depots/depots.models.ts index f10cf95..a7395cb 100644 --- a/test/generated/base/depots/depots.models.ts +++ b/test/generated/base/depots/depots.models.ts @@ -2,232 +2,156 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace DepotsModels { - /** - * DepotCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DepotCityDto = z.infer; +/** + * DepotCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type DepotCityDto = z.infer; - /** - * DepotCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ - export const DepotCountryDtoSchema = z - .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) - .readonly(); - export type DepotCountryDto = z.infer; +/** + * DepotCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const DepotCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); +export type DepotCountryDto = z.infer; - /** - * AddressDTOSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { DepotCityDto } city - * @property { string } district District name - * @property { DepotCountryDto } country - */ - export const AddressDTOSchema = z - .object({ - street: z.string().describe("Street address"), - zip: z.string().describe("ZIP/Postal code"), - city: DepotCityDtoSchema.nullish(), - district: z.string().describe("District name").nullish(), - country: DepotCountryDtoSchema.nullish(), - }) - .readonly(); - export type AddressDTO = z.infer; +/** + * AddressDTOSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { DepotCityDto } city + * @property { string } district District name + * @property { DepotCountryDto } country + */ +export const AddressDTOSchema = z.object({ street: z.string(), zip: z.string(), city: DepotCityDtoSchema.nullish(), district: z.string().nullish(), country: DepotCountryDtoSchema.nullish() }); +export type AddressDTO = z.infer; - /** - * DepotEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DepotEmployeeDTO = z.infer; +/** + * DepotEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type DepotEmployeeDTO = z.infer; - /** - * DepotResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the depot - * @property { string } matchCode Match code for the depot - * @property { string } name Name of the depot - * @property { string } shortName Short name of the depot - * @property { string } additionalInformation Additional info of the depot - * @property { AddressDTO } address Address details of the depot - * @property { boolean } archived - * @property { string } createdById - * @property { DepotEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DepotEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const DepotResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the depot"), - matchCode: z.string().describe("Match code for the depot"), - name: z.string().describe("Name of the depot"), - shortName: z.string().describe("Short name of the depot").nullish(), - additionalInformation: z.string().describe("Additional info of the depot").nullish(), - address: AddressDTOSchema.describe("Address details of the depot"), - archived: z.boolean(), - createdById: z.string().nullish(), - createdBy: DepotEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: DepotEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type DepotResponseDTO = z.infer; +/** + * DepotResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the depot + * @property { string } matchCode Match code for the depot + * @property { string } name Name of the depot + * @property { string } shortName Short name of the depot + * @property { string } additionalInformation Additional info of the depot + * @property { AddressDTO } address Address details of the depot + * @property { boolean } archived + * @property { string } createdById + * @property { DepotEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DepotEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const DepotResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), address: AddressDTOSchema, archived: z.boolean(), createdById: z.string().nullish(), createdBy: DepotEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DepotEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type DepotResponseDTO = z.infer; - /** - * CreateDepotRequestDTOSchema - * @type { object } - * @property { string } matchCode Unique identifier code for the depot - * @property { string } shortName Optional short name for the depot - * @property { string } additionalInformation - * @property { string } name Full name of the depot - * @property { string } street Street address of the depot - * @property { string } zip ZIP/Postal code - * @property { string } district District information - * @property { string } cityId City id - * @property { string } countryId Country code - */ - export const CreateDepotRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Unique identifier code for the depot"), - shortName: z.string().describe("Optional short name for the depot").nullish(), - additionalInformation: z.string().nullish(), - name: z.string().describe("Full name of the depot"), - street: z.string().describe("Street address of the depot"), - zip: z.string().describe("ZIP/Postal code"), - district: z.string().describe("District information").nullish(), - cityId: z.string().describe("City id"), - countryId: z.string().describe("Country code"), - }) - .readonly(); - export type CreateDepotRequestDTO = z.infer; +/** + * CreateDepotRequestDTOSchema + * @type { object } + * @property { string } matchCode Unique identifier code for the depot + * @property { string } shortName Optional short name for the depot + * @property { string } additionalInformation + * @property { string } name Full name of the depot + * @property { string } street Street address of the depot + * @property { string } zip ZIP/Postal code + * @property { string } district District information + * @property { string } cityId City id + * @property { string } countryId Country code + */ +export const CreateDepotRequestDTOSchema = z.object({ matchCode: z.string(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), name: z.string(), street: z.string(), zip: z.string(), district: z.string().nullish(), cityId: z.string(), countryId: z.string() }); +export type CreateDepotRequestDTO = z.infer; - /** - * DepotPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter depots by name, matchCode, or shortName - * @property { boolean } archived - */ - export const DepotPaginationFilterDtoSchema = z - .object({ - search: z.string().describe("Search term to filter depots by name, matchCode, or shortName"), - archived: z.boolean(), - }) - .readonly(); - export type DepotPaginationFilterDto = z.infer; +/** + * DepotPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter depots by name, matchCode, or shortName + * @property { boolean } archived + */ +export const DepotPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); +export type DepotPaginationFilterDto = z.infer; - /** - * DepotLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const DepotLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type DepotLabelFilterDto = z.infer; +/** + * DepotLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DepotLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type DepotLabelFilterDto = z.infer; - /** - * UpdateDepotRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code for the depot - * @property { string } shortName Updated short name - * @property { string } additionalInformation Updated short name - * @property { string } name Updated full name - * @property { string } street Updated street address - * @property { string } zip Updated ZIP/Postal code - * @property { string } district Updated district information - * @property { string } cityId Updated city id - * @property { string } countryId Updated country code - */ - export const UpdateDepotRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Updated match code for the depot"), - shortName: z.string().describe("Updated short name"), - additionalInformation: z.string().describe("Updated short name"), - name: z.string().describe("Updated full name"), - street: z.string().describe("Updated street address"), - zip: z.string().describe("Updated ZIP/Postal code"), - district: z.string().describe("Updated district information"), - cityId: z.string().describe("Updated city id"), - countryId: z.string().describe("Updated country code"), - }) - .readonly(); - export type UpdateDepotRequestDTO = z.infer; +/** + * UpdateDepotRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code for the depot + * @property { string } shortName Updated short name + * @property { string } additionalInformation Updated short name + * @property { string } name Updated full name + * @property { string } street Updated street address + * @property { string } zip Updated ZIP/Postal code + * @property { string } district Updated district information + * @property { string } cityId Updated city id + * @property { string } countryId Updated country code + */ +export const UpdateDepotRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), additionalInformation: z.string().nullable(), name: z.string().nullable(), street: z.string().nullable(), zip: z.string().nullable(), district: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable() }).partial(); +export type UpdateDepotRequestDTO = z.infer; - /** - * DepotsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const DepotsPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DepotsPaginateOrderParamEnum = z.infer; - export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.enum; +/** + * DepotsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const DepotsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DepotsPaginateOrderParamEnum = z.infer; +export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.enum; - /** - * DepotsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DepotResponseDTO[] } items - */ - export const DepotsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(DepotResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DepotsPaginateResponse = z.infer; +/** + * DepotsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DepotResponseDTO[] } items + */ +export const DepotsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DepotResponseDTOSchema).nullable() }).partial().shape }); +export type DepotsPaginateResponse = z.infer; - /** - * DepotsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const DepotsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DepotsPaginateLabelsOrderParamEnum = z.infer; - export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParamEnumSchema.enum; +/** + * DepotsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DepotsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DepotsPaginateLabelsOrderParamEnum = z.infer; +export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * DepotsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DepotsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type DepotsPaginateLabelsResponse = z.infer; - /** - * DepotsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const DepotsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DepotsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/depots/depots.queries.ts b/test/generated/base/depots/depots.queries.ts index dc58f63..49c639f 100644 --- a/test/generated/base/depots/depots.queries.ts +++ b/test/generated/base/depots/depots.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,341 +8,253 @@ import { DepotsModels } from "./depots.models"; import { DepotsApi } from "./depots.api"; export namespace DepotsQueries { - export const moduleName = QueryModule.Depots; +export const moduleName = QueryModule.Depots; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: DepotsModels.DepotPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/depots", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: DepotsModels.DepotPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/depots", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: DepotsModels.DepotLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/depots/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: DepotsModels.DepotLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/depots/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string) => [...keys.all, "/depots", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string) => [...keys.all, "/depots/paginate/labels", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/depots/:id", id] as const, - }; +}; - /** - * Mutation `useCreate` - * @summary Create a new depot - * @permission Requires `canUseCreate` ability - * @param { DepotsModels.CreateDepotRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create a new depot + * @permission Requires `canUseCreate` ability + * @param { DepotsModels.CreateDepotRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(DepotsAcl.canUseCreate()); - return DepotsApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Paginate Depots - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: DepotsModels.DepotPaginationFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(DepotsAcl.canUseCreate()); + return DepotsApi.create(data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Depots - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: DepotsModels.DepotPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginate` + * @summary Paginate Depots + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DepotsAcl.canUsePaginate()); + return DepotsApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Depots + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Query `usePaginateLabels` - * @summary Paginate depots with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: DepotsModels.DepotLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DepotsAcl.canUsePaginate()); + return DepotsApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate depots with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DepotsAcl.canUsePaginateLabels()); + return DepotsApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate depots with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: DepotsModels.DepotLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate depots with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DepotsAcl.canUsePaginateLabels()); + return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useFindById` - * @summary Fetch depot by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Fetch depot by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(DepotsAcl.canUseFindById()); + return DepotsApi.findById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(DepotsAcl.canUseFindById()); - return DepotsApi.findById(id, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update a depot + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { DepotsModels.UpdateDepotRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update a depot - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { DepotsModels.UpdateDepotRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(DepotsAcl.canUseUpdate()); + return DepotsApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(DepotsAcl.canUseUpdate()); - return DepotsApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive a depot + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive a depot - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(DepotsAcl.canUseArchive()); + return DepotsApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(DepotsAcl.canUseArchive()); - return DepotsApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive a depot + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive a depot - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(DepotsAcl.canUseUnarchive()); + return DepotsApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(DepotsAcl.canUseUnarchive()); - return DepotsApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/documentTemplates/documentTemplates.acl.ts b/test/generated/base/documentTemplates/documentTemplates.acl.ts index 299eec8..8996246 100644 --- a/test/generated/base/documentTemplates/documentTemplates.acl.ts +++ b/test/generated/base/documentTemplates/documentTemplates.acl.ts @@ -1,111 +1,121 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace DocumentTemplatesAcl { - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List document template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Read", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List document template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List document templates - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Read", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List document templates + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Create", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Create", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get document template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Read", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get document template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update document template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Update", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update document template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - /** - * Use for `useAddRemarkBlock` mutation ability. For global ability, omit the object parameter. - * @description Add remark block to document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddRemarkBlock` mutation - */ - export const canUseAddRemarkBlock = (object?: { officeId: string }) => - ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Update", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; +/** + * Use for `useAddRemarkBlock` mutation ability. For global ability, omit the object parameter. + * @description Add remark block to document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddRemarkBlock` mutation + */ +export const canUseAddRemarkBlock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - /** - * Use for `useDeleteRemarkBlock` mutation ability. For global ability, omit the object parameter. - * @description Delete remark block from document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemarkBlock` mutation - */ - export const canUseDeleteRemarkBlock = (object?: { officeId: string }) => - ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Update", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; +/** + * Use for `useDeleteRemarkBlock` mutation ability. For global ability, omit the object parameter. + * @description Delete remark block from document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemarkBlock` mutation + */ +export const canUseDeleteRemarkBlock = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Archive", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Archive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive document template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("DocumentTemplate", object) : "DocumentTemplate" +] as AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Unarchive", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Unarchive", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; } diff --git a/test/generated/base/documentTemplates/documentTemplates.api.ts b/test/generated/base/documentTemplates/documentTemplates.api.ts index e263512..6b9a31a 100644 --- a/test/generated/base/documentTemplates/documentTemplates.api.ts +++ b/test/generated/base/documentTemplates/documentTemplates.api.ts @@ -1,170 +1,89 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DocumentTemplatesModels } from "./documentTemplates.models"; export namespace DocumentTemplatesApi { - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/document-templates/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const list = ( - officeId: string, - limit: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/document-templates/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, - `/offices/${officeId}/document-templates`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = ( - officeId: string, - data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, + `/offices/${officeId}/document-templates`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, ) => { return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates`, - ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), - config, - ); - }; - - export const findById = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates`, + ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), + + ) +}; +export const findById = (documentTemplateId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}`, - config, - ); - }; - - export const update = ( - documentTemplateId: string, - officeId: string, - data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}`, + + ) +}; +export const update = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, ) => { return AppRestClient.patch( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}`, - ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), - config, - ); - }; - - export const addRemarkBlock = ( - documentTemplateId: string, - officeId: string, - data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}`, + ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), + + ) +}; +export const addRemarkBlock = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, ) => { return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, - ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), - config, - ); - }; - - export const deleteRemarkBlock = ( - documentTemplateId: string, - remarkBlockId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, + ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), + + ) +}; +export const deleteRemarkBlock = (documentTemplateId: string, remarkBlockId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, - undefined, - config, - ); - }; - - export const archive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, + + ) +}; +export const archive = (documentTemplateId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, + + ) +}; +export const unarchive = (documentTemplateId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, - undefined, - config, - ); - }; + { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, + `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, + + ) +}; } diff --git a/test/generated/base/documentTemplates/documentTemplates.configs.ts b/test/generated/base/documentTemplates/documentTemplates.configs.ts index 291245b..bb792f1 100644 --- a/test/generated/base/documentTemplates/documentTemplates.configs.ts +++ b/test/generated/base/documentTemplates/documentTemplates.configs.ts @@ -6,113 +6,114 @@ import { DocumentTemplatesQueries } from "./documentTemplates.queries"; import { DocumentTemplatesAcl } from "./documentTemplates.acl"; export namespace DocumentTemplatesConfigs { - export const documentTemplatesConfig = { +export const documentTemplatesConfig = { meta: { - title: "Document Templates", + title: "Document Templates", }, readAll: { - acl: DocumentTemplatesAcl.canUseList, - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - paginated: DocumentTemplatesQueries.useList, - infinite: DocumentTemplatesQueries.useListInfinite, - filters: { - schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, - options: { - inputs: { - isArchived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DocumentTemplatesAcl.canUseList, schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - isArchived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - blocks: true, - }, - sortable: DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema, + paginated: DocumentTemplatesQueries.useList, + infinite: DocumentTemplatesQueries.useListInfinite, + filters: { + schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, + options: { + inputs: { + isArchived: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + isArchived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + blocks: true, + }, + sortable: DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema, + }, +}), }, read: { - acl: DocumentTemplatesAcl.canUseFindById, - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - query: DocumentTemplatesQueries.useFindById, + acl: DocumentTemplatesAcl.canUseFindById, + schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, + query: DocumentTemplatesQueries.useFindById, }, create: { - acl: DocumentTemplatesAcl.canUseCreate, - schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, - mutation: DocumentTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: DocumentTemplatesAcl.canUseCreate, schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - blocks: true, - }, - }, - }), + mutation: DocumentTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + blocks: true, + }, + }, +}) }, update: { - acl: DocumentTemplatesAcl.canUseUpdate, - schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, - mutation: DocumentTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: DocumentTemplatesAcl.canUseUpdate, schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - isArchived: true, - blocks: true, - }, - }, - }), + mutation: DocumentTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + isArchived: true, + blocks: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: DocumentTemplatesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DocumentTemplatesQueries.usePaginateLabels, - infinite: DocumentTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DocumentTemplatesAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema, + paginated: DocumentTemplatesQueries.usePaginateLabels, + infinite: DocumentTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/documentTemplates/documentTemplates.models.ts b/test/generated/base/documentTemplates/documentTemplates.models.ts index 1841a56..5747c5c 100644 --- a/test/generated/base/documentTemplates/documentTemplates.models.ts +++ b/test/generated/base/documentTemplates/documentTemplates.models.ts @@ -2,194 +2,137 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace DocumentTemplatesModels { - /** - * DocumentTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DocumentTemplateEmployeeDTO = z.infer; +/** + * DocumentTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type DocumentTemplateEmployeeDTO = z.infer; - /** - * DocumentTemplateResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name - * @property { boolean } isArchived - * @property { string } createdById ID of the employee who created this template - * @property { DocumentTemplateEmployeeDTO } createdBy Employee who created this template - * @property { string } createdAt - * @property { string } updatedById ID of the employee who last updated this template - * @property { DocumentTemplateEmployeeDTO } updatedBy Employee who last updated this template - * @property { string } updatedAt - * @property { CommonModels.TemplateBlocksResponseDTO } blocks - */ - export const DocumentTemplateResponseDTOSchema = z - .object({ - id: z.string(), - officeId: z.string(), - name: z.string(), - isArchived: z.boolean(), - createdById: z.string().describe("ID of the employee who created this template").nullish(), - createdBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), - updatedBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), - updatedAt: z.iso.datetime({ offset: true }), - blocks: CommonModels.TemplateBlocksResponseDTOSchema, - }) - .readonly(); - export type DocumentTemplateResponseDTO = z.infer; +/** + * DocumentTemplateResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name + * @property { boolean } isArchived + * @property { string } createdById ID of the employee who created this template + * @property { DocumentTemplateEmployeeDTO } createdBy Employee who created this template + * @property { string } createdAt + * @property { string } updatedById ID of the employee who last updated this template + * @property { DocumentTemplateEmployeeDTO } updatedBy Employee who last updated this template + * @property { string } updatedAt + * @property { CommonModels.TemplateBlocksResponseDTO } blocks + */ +export const DocumentTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isArchived: z.boolean(), createdById: z.string().nullish(), createdBy: DocumentTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DocumentTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), blocks: CommonModels.TemplateBlocksResponseDTOSchema }); +export type DocumentTemplateResponseDTO = z.infer; - /** - * TemplateBlocksDTOSchema - * @type { object } - * @property { CommonModels.TitleBlockDTO } titleBlock - * @property { CommonModels.ReceiverBlockDTO } receiverBlock - * @property { CommonModels.OurInformationBlockDTO } ourInformationBlock - * @property { CommonModels.RouteTableBlockDTO } routeTableBlock - * @property { CommonModels.CargoTableBlockDTO } cargoTableBlock - * @property { CommonModels.CargoSummaryBlockDTO } cargoSummaryBlock - * @property { CommonModels.FinanceTableBlockDTO } financeTableBlock - * @property { CommonModels.RemarkBlockDTO[] } remarkBlocks - * @property { CommonModels.FooterBlockDTO } footerBlock - * @property { CommonModels.TermsBlockDTO } termsBlock - * @property { CommonModels.CutOffDatesBlockDTO } cutOffDatesBlock - */ - export const TemplateBlocksDTOSchema = z - .object({ - titleBlock: CommonModels.TitleBlockDTOSchema, - receiverBlock: CommonModels.ReceiverBlockDTOSchema, - ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, - routeTableBlock: CommonModels.RouteTableBlockDTOSchema, - cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, - cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, - financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, - remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), - footerBlock: CommonModels.FooterBlockDTOSchema, - termsBlock: CommonModels.TermsBlockDTOSchema, - cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema, - }) - .readonly(); - export type TemplateBlocksDTO = z.infer; +/** + * TemplateBlocksDTOSchema + * @type { object } + * @property { CommonModels.TitleBlockDTO } titleBlock + * @property { CommonModels.ReceiverBlockDTO } receiverBlock + * @property { CommonModels.OurInformationBlockDTO } ourInformationBlock + * @property { CommonModels.RouteTableBlockDTO } routeTableBlock + * @property { CommonModels.CargoTableBlockDTO } cargoTableBlock + * @property { CommonModels.CargoSummaryBlockDTO } cargoSummaryBlock + * @property { CommonModels.FinanceTableBlockDTO } financeTableBlock + * @property { CommonModels.RemarkBlockDTO[] } remarkBlocks + * @property { CommonModels.FooterBlockDTO } footerBlock + * @property { CommonModels.TermsBlockDTO } termsBlock + * @property { CommonModels.CutOffDatesBlockDTO } cutOffDatesBlock + */ +export const TemplateBlocksDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema.nullable(), receiverBlock: CommonModels.ReceiverBlockDTOSchema.nullable(), ourInformationBlock: CommonModels.OurInformationBlockDTOSchema.nullable(), routeTableBlock: CommonModels.RouteTableBlockDTOSchema.nullable(), cargoTableBlock: CommonModels.CargoTableBlockDTOSchema.nullable(), cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema.nullable(), financeTableBlock: CommonModels.FinanceTableBlockDTOSchema.nullable(), remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).nullable(), footerBlock: CommonModels.FooterBlockDTOSchema.nullable(), termsBlock: CommonModels.TermsBlockDTOSchema.nullable(), cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema.nullable() }).partial(); +export type TemplateBlocksDTO = z.infer; - /** - * CreateDocumentTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { TemplateBlocksDTO } blocks - */ - export const CreateDocumentTemplateRequestDTOSchema = z - .object({ name: z.string().describe("Template name"), blocks: TemplateBlocksDTOSchema.nullish() }) - .readonly(); - export type CreateDocumentTemplateRequestDTO = z.infer; +/** + * CreateDocumentTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { TemplateBlocksDTO } blocks + */ +export const CreateDocumentTemplateRequestDTOSchema = z.object({ name: z.string(), blocks: TemplateBlocksDTOSchema.nullish() }); +export type CreateDocumentTemplateRequestDTO = z.infer; - /** - * UpdateDocumentTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { boolean } isArchived - * @property { TemplateBlocksDTO } blocks - */ - export const UpdateDocumentTemplateRequestDTOSchema = z - .object({ name: z.string().describe("Template name"), isArchived: z.boolean(), blocks: TemplateBlocksDTOSchema }) - .readonly(); - export type UpdateDocumentTemplateRequestDTO = z.infer; +/** + * UpdateDocumentTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { boolean } isArchived + * @property { TemplateBlocksDTO } blocks + */ +export const UpdateDocumentTemplateRequestDTOSchema = z.object({ name: z.string().nullable(), isArchived: z.boolean().nullable(), blocks: TemplateBlocksDTOSchema.nullable() }).partial(); +export type UpdateDocumentTemplateRequestDTO = z.infer; - /** - * CreateRemarkBlockRequestDTOSchema - * @type { object } - * @property { CommonModels.EditorContentUpdateDto } content - * @property { number } position 1-based position of the remark block. Minimum: `1` - * @property { boolean } enabled - */ - export const CreateRemarkBlockRequestDTOSchema = z - .object({ - content: CommonModels.EditorContentUpdateDtoSchema, - position: z.number().gte(1).describe("1-based position of the remark block").nullish(), - enabled: z.boolean().nullish(), - }) - .readonly(); - export type CreateRemarkBlockRequestDTO = z.infer; +/** + * CreateRemarkBlockRequestDTOSchema + * @type { object } + * @property { CommonModels.EditorContentUpdateDto } content + * @property { number } position 1-based position of the remark block. Minimum: `1` + * @property { boolean } enabled + */ +export const CreateRemarkBlockRequestDTOSchema = z.object({ content: CommonModels.EditorContentUpdateDtoSchema, position: z.number().gte(1).nullish(), enabled: z.boolean().nullish() }); +export type CreateRemarkBlockRequestDTO = z.infer; - /** - * DocumentTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const DocumentTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type DocumentTemplateLabelFilterDto = z.infer; +/** + * DocumentTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DocumentTemplateLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type DocumentTemplateLabelFilterDto = z.infer; - /** - * DocumentTemplateFilterDtoSchema - * @type { object } - * @property { boolean } isArchived - * @property { string } search - */ - export const DocumentTemplateFilterDtoSchema = z.object({ isArchived: z.boolean(), search: z.string() }).readonly(); - export type DocumentTemplateFilterDto = z.infer; +/** + * DocumentTemplateFilterDtoSchema + * @type { object } + * @property { boolean } isArchived + * @property { string } search + */ +export const DocumentTemplateFilterDtoSchema = z.object({ isArchived: z.boolean().nullable(), search: z.string().nullable() }).partial(); +export type DocumentTemplateFilterDto = z.infer; - /** - * DocumentTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const DocumentTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DocumentTemplatesPaginateLabelsOrderParamEnum = z.infer< - typeof DocumentTemplatesPaginateLabelsOrderParamEnumSchema - >; - export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPaginateLabelsOrderParamEnumSchema.enum; +/** + * DocumentTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DocumentTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DocumentTemplatesPaginateLabelsOrderParamEnum = z.infer; +export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPaginateLabelsOrderParamEnumSchema.enum; - /** - * DocumentTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DocumentTemplatesPaginateLabelsResponse = z.infer; +/** + * DocumentTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type DocumentTemplatesPaginateLabelsResponse = z.infer; - /** - * DocumentTemplatesListOrderParamEnumSchema - * @type { enum } - */ - export const DocumentTemplatesListOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DocumentTemplatesListOrderParamEnum = z.infer; - export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderParamEnumSchema.enum; +/** + * DocumentTemplatesListOrderParamEnumSchema + * @type { enum } + */ +export const DocumentTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DocumentTemplatesListOrderParamEnum = z.infer; +export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderParamEnumSchema.enum; + +/** + * DocumentTemplatesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DocumentTemplateResponseDTO[] } items + */ +export const DocumentTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).nullable() }).partial().shape }); +export type DocumentTemplatesListResponse = z.infer; - /** - * DocumentTemplatesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DocumentTemplateResponseDTO[] } items - */ - export const DocumentTemplatesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DocumentTemplatesListResponse = z.infer; } diff --git a/test/generated/base/documentTemplates/documentTemplates.queries.ts b/test/generated/base/documentTemplates/documentTemplates.queries.ts index 6b47315..1a3f849 100644 --- a/test/generated/base/documentTemplates/documentTemplates.queries.ts +++ b/test/generated/base/documentTemplates/documentTemplates.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,501 +8,326 @@ import { DocumentTemplatesModels } from "./documentTemplates.models"; import { DocumentTemplatesApi } from "./documentTemplates.api"; export namespace DocumentTemplatesQueries { - export const moduleName = QueryModule.DocumentTemplates; +export const moduleName = QueryModule.DocumentTemplates; - export const keys = { +export const keys = { all: [moduleName] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/document-templates/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/document-templates/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - list: ( - officeId: string, - limit?: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/document-templates", officeId, limit, order, filter, page, cursor] as const, - listInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/document-templates", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (documentTemplateId: string, officeId: string) => - [...keys.all, "/offices/:officeId/document-templates/:documentTemplateId", documentTemplateId, officeId] as const, - }; + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (documentTemplateId: string, officeId: string) => [...keys.all, "/offices/:officeId/document-templates/:documentTemplateId", documentTemplateId, officeId] as const, +}; - /** - * Query `usePaginateLabels` - * @summary Paginate document template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginateLabels` + * @summary Paginate document template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId })); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate document template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate document template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId })); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Query `useList` - * @summary List document templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DocumentTemplatesModels.DocumentTemplateFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useList` + * @summary List document templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); + return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUseList({ officeId })); - return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useListInfinite + * @summary List document templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListInfinite - * @summary List document templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DocumentTemplatesModels.DocumentTemplateFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); + return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DocumentTemplatesAcl.canUseList({ officeId })); - return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Mutation `useCreate` - * @summary Create a new document template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.create, - { officeId: string; data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create a new document template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId })); - return DocumentTemplatesApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId } )); + return DocumentTemplatesApi.create(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useFindById` - * @summary Get document template by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.documentTemplateId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ - export const useFindById = ( - { documentTemplateId, officeId }: { documentTemplateId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get document template by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.documentTemplateId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ documentTemplateId, officeId }: { documentTemplateId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(documentTemplateId, officeId), + queryFn: () => { + checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId } )); + return DocumentTemplatesApi.findById(documentTemplateId, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(documentTemplateId, officeId), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId })); - return DocumentTemplatesApi.findById(documentTemplateId, officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update document template by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update document template by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.update, - { documentTemplateId: string; officeId: string; data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ documentTemplateId, officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId } )); + return DocumentTemplatesApi.update(documentTemplateId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ documentTemplateId, officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId })); - return DocumentTemplatesApi.update(documentTemplateId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useAddRemarkBlock` + * @summary Add a remark block to a document template + * @permission Requires `canUseAddRemarkBlock` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DocumentTemplatesModels.CreateRemarkBlockRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useAddRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useAddRemarkBlock` - * @summary Add a remark block to a document template - * @permission Requires `canUseAddRemarkBlock` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.CreateRemarkBlockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useAddRemarkBlock = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.addRemarkBlock, - { documentTemplateId: string; officeId: string; data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ documentTemplateId, officeId, data }) => { + checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId } )); + return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ documentTemplateId, officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId })); - return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteRemarkBlock` + * @summary Delete a remark block from a document template + * @permission Requires `canUseDeleteRemarkBlock` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.remarkBlockId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteRemarkBlock` - * @summary Delete a remark block from a document template - * @permission Requires `canUseDeleteRemarkBlock` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.remarkBlockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteRemarkBlock = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.deleteRemarkBlock, - { documentTemplateId: string; remarkBlockId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId } )); + return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId })); - return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive document template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive document template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useArchive = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.archive, - { documentTemplateId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ documentTemplateId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId } )); + return DocumentTemplatesApi.archive(documentTemplateId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ documentTemplateId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId })); - return DocumentTemplatesApi.archive(documentTemplateId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive document template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.documentTemplateId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive document template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUnarchive = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.unarchive, - { documentTemplateId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ documentTemplateId, officeId }) => { + checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId } )); + return DocumentTemplatesApi.unarchive(documentTemplateId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { documentTemplateId, officeId } = variables; + const updateKeys = [keys.findById(documentTemplateId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ documentTemplateId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId })); - return DocumentTemplatesApi.unarchive(documentTemplateId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts index cd053fc..dc538a3 100644 --- a/test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts +++ b/test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts @@ -1,27 +1,30 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace DunningAccountStatementAcl { - /** - * Use for `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation ability. For global ability, omit the object parameter. - * @description Generate account statement - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation - */ - export const canUseGenerateAccountStatement = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation ability. For global ability, omit the object parameter. + * @description Generate account statement + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation + */ +export const canUseGenerateAccountStatement = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetAccountStatementEml` mutation ability. For global ability, omit the object parameter. + * @description Download account statement as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAccountStatementEml` mutation + */ +export const canUseGetAccountStatementEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useGetAccountStatementEml` mutation ability. For global ability, omit the object parameter. - * @description Download account statement as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAccountStatementEml` mutation - */ - export const canUseGetAccountStatementEml = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; } diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts index ef2ea94..094141a 100644 --- a/test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts +++ b/test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts @@ -1,78 +1,49 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; import { CommonModels } from "@/data/common/common.models"; export namespace DunningAccountStatementApi { - export const dataGenFake = (config?: AxiosRequestConfig) => { +export const dataGenFake = () => { return AppRestClient.get( - { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, - `/data-gen-fake/account-statement`, - config, - ); - }; - - export const generateAccountStatement = ( - officeId: string, - limit: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/account-statement`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }); - }; - - export const getAccountStatementEml = ( - officeId: string, - data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, + `/data-gen-fake/account-statement`, + + ) +}; +export const generateAccountStatement = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/account-statement`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getAccountStatementEml = (officeId: string, data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/account-statement/eml`, - ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/account-statement/eml`, + ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), + { + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; } diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts index 1a07b4f..83d04d1 100644 --- a/test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts +++ b/test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts @@ -2,155 +2,82 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace DunningAccountStatementModels { - /** - * AccountStatementPdfPayloadInvoiceDtoSchema - * @type { object } - * @property { string } number - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } dueDays - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - */ - export const AccountStatementPdfPayloadInvoiceDtoSchema = z - .object({ - number: z.string(), - issuingDate: z.iso.datetime({ offset: true }), - dueDate: z.iso.datetime({ offset: true }), - dueDays: z.number(), - invoiceAmount: z.number(), - outstandingAmount: z.number(), - currencyNotation: z.string(), - }) - .readonly(); - export type AccountStatementPdfPayloadInvoiceDto = z.infer; +/** + * AccountStatementPdfPayloadInvoiceDtoSchema + * @type { object } + * @property { string } number + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } dueDays + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + */ +export const AccountStatementPdfPayloadInvoiceDtoSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }), dueDays: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string() }); +export type AccountStatementPdfPayloadInvoiceDto = z.infer; - /** - * AccountStatementInvoicesByCurrencyAndDirectionDtoSchema - * @type { object } - * @property { string } direction - * @property { string } currency - * @property { AccountStatementPdfPayloadInvoiceDto[] } invoices - * @property { number } totalOutstandingAmount - */ - export const AccountStatementInvoicesByCurrencyAndDirectionDtoSchema = z - .object({ - direction: CommonModels.InvoiceDirectionEnumSchema, - currency: z.string(), - invoices: z.array(AccountStatementPdfPayloadInvoiceDtoSchema).readonly(), - totalOutstandingAmount: z.number(), - }) - .readonly(); - export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer< - typeof AccountStatementInvoicesByCurrencyAndDirectionDtoSchema - >; +/** + * AccountStatementInvoicesByCurrencyAndDirectionDtoSchema + * @type { object } + * @property { string } direction + * @property { string } currency + * @property { AccountStatementPdfPayloadInvoiceDto[] } invoices + * @property { number } totalOutstandingAmount + */ +export const AccountStatementInvoicesByCurrencyAndDirectionDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema, currency: z.string(), invoices: z.array(AccountStatementPdfPayloadInvoiceDtoSchema), totalOutstandingAmount: z.number() }); +export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer; - /** - * AccountStatementPdfPayloadBusinessPartnerDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - * @property { string } referenceNumber - */ - export const AccountStatementPdfPayloadBusinessPartnerDtoSchema = z - .object({ name: z.string(), address: z.string().nullish(), referenceNumber: z.string().nullish() }) - .readonly(); - export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer< - typeof AccountStatementPdfPayloadBusinessPartnerDtoSchema - >; +/** + * AccountStatementPdfPayloadBusinessPartnerDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + * @property { string } referenceNumber + */ +export const AccountStatementPdfPayloadBusinessPartnerDtoSchema = z.object({ name: z.string(), address: z.string().nullish(), referenceNumber: z.string().nullish() }); +export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer; - /** - * AccountStatementPdfPayloadBankAccountDtoSchema - * @type { object } - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - */ - export const AccountStatementPdfPayloadBankAccountDtoSchema = z - .object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }) - .readonly(); - export type AccountStatementPdfPayloadBankAccountDto = z.infer; +/** + * AccountStatementPdfPayloadBankAccountDtoSchema + * @type { object } + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + */ +export const AccountStatementPdfPayloadBankAccountDtoSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }); +export type AccountStatementPdfPayloadBankAccountDto = z.infer; - /** - * AccountStatementPdfPayloadDTOSchema - * @type { object } - * @property { AccountStatementPdfPayloadBusinessPartnerDto } businessPartner - * @property { AccountStatementInvoicesByCurrencyAndDirectionDto[] } invoicesByCurrencyAndDirection - * @property { AccountStatementPdfPayloadBankAccountDto } bankAccount - * @property { string } employeeName - * @property { CommonModels.ConfigBlockDto } config - */ - export const AccountStatementPdfPayloadDTOSchema = z - .object({ - businessPartner: AccountStatementPdfPayloadBusinessPartnerDtoSchema, - invoicesByCurrencyAndDirection: z.array(AccountStatementInvoicesByCurrencyAndDirectionDtoSchema).readonly(), - bankAccount: AccountStatementPdfPayloadBankAccountDtoSchema, - employeeName: z.string().nullable(), - config: CommonModels.ConfigBlockDtoSchema, - }) - .readonly(); - export type AccountStatementPdfPayloadDTO = z.infer; +/** + * AccountStatementPdfPayloadDTOSchema + * @type { object } + * @property { AccountStatementPdfPayloadBusinessPartnerDto } businessPartner + * @property { AccountStatementInvoicesByCurrencyAndDirectionDto[] } invoicesByCurrencyAndDirection + * @property { AccountStatementPdfPayloadBankAccountDto } bankAccount + * @property { string } employeeName + * @property { CommonModels.ConfigBlockDto } config + */ +export const AccountStatementPdfPayloadDTOSchema = z.object({ businessPartner: AccountStatementPdfPayloadBusinessPartnerDtoSchema, invoicesByCurrencyAndDirection: z.array(AccountStatementInvoicesByCurrencyAndDirectionDtoSchema), bankAccount: AccountStatementPdfPayloadBankAccountDtoSchema, employeeName: z.string().nullable(), config: CommonModels.ConfigBlockDtoSchema }); +export type AccountStatementPdfPayloadDTO = z.infer; - /** - * OfficeInvoiceListQueryDtoSchema - * @type { object } - * @property { string } order Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @property { CommonModels.OfficeInvoiceFilterDto } filter - * @property { number } limit Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - */ - export const OfficeInvoiceListQueryDtoSchema = z - .object({ - order: z - .string() - .describe( - "Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId", - ) - .nullish(), - filter: CommonModels.OfficeInvoiceFilterDtoSchema.nullish(), - limit: z.number().gte(1).lte(100).describe("Items per response").default(20), - page: z.number().describe("1-indexed page number to begin from").nullish(), - cursor: z.string().describe("ID of item to start after").nullish(), - }) - .readonly(); - export type OfficeInvoiceListQueryDto = z.infer; +/** + * OfficeInvoiceListQueryDtoSchema + * @type { object } + * @property { string } order Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @property { CommonModels.OfficeInvoiceFilterDto } filter + * @property { number } limit Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + */ +export const OfficeInvoiceListQueryDtoSchema = z.object({ order: z.string().nullish(), filter: CommonModels.OfficeInvoiceFilterDtoSchema.nullish(), limit: z.number().gte(1).lte(100).default(20), page: z.number().nullish(), cursor: z.string().nullish() }); +export type OfficeInvoiceListQueryDto = z.infer; + +/** + * GenerateAccountStatementOrderParamEnumSchema + * @type { enum } + */ +export const GenerateAccountStatementOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); +export type GenerateAccountStatementOrderParamEnum = z.infer; +export const GenerateAccountStatementOrderParamEnum = GenerateAccountStatementOrderParamEnumSchema.enum; - /** - * GenerateAccountStatementOrderParamEnumSchema - * @type { enum } - */ - export const GenerateAccountStatementOrderParamEnumSchema = z.enum([ - "invoiceNumber", - "issuingDate", - "invoiceType", - "amount", - "netAmount", - "currencyNotation", - "dueDate", - "status", - "paidOn", - "serviceDate", - "internalNumber", - "positionNumber", - "invoiceDirection", - "receiver", - "receiverCountry", - "paidAmount", - "totalVat", - "dunningBlock", - "invoiceInReview", - "isInvoiceOk", - "isVatOk", - "comments", - "salesRepName", - "isExportedToBookkeeping", - "createdAt", - "customerReferenceOverride", - "externalSystemId", - ]); - export type GenerateAccountStatementOrderParamEnum = z.infer; - export const GenerateAccountStatementOrderParamEnum = GenerateAccountStatementOrderParamEnumSchema.enum; } diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts index 9697954..4ac5c03 100644 --- a/test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts +++ b/test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,261 +9,146 @@ import { DunningAccountStatementModels } from "./dunningAccountStatement.models" import { DunningAccountStatementApi } from "./dunningAccountStatement.api"; export namespace DunningAccountStatementQueries { - export const moduleName = QueryModule.DunningAccountStatement; +export const moduleName = QueryModule.DunningAccountStatement; - export const keys = { +export const keys = { all: [moduleName] as const, - dataGenFake: () => [...keys.all, "/data-gen-fake/account-statement"] as const, - generateAccountStatement: ( - officeId: string, - limit?: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/invoices/account-statement", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - generateAccountStatementInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/invoices/account-statement", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - }; + dataGenFake: () => [...keys.all, "/data-gen-fake/account-statement", ] as const, + generateAccountStatement: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", officeId, limit, order, filter, page, cursor] as const, + generateAccountStatementInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", "infinite", officeId, limit, order, filter, cursor] as const, +}; - /** - * Query `useDataGenFake` - * @summary Expose account statement PDF payload DTO for model generation - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useDataGenFake = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.dataGenFake(), - queryFn: () => DunningAccountStatementApi.dataGenFake(config), - ...options, - }); - }; +/** + * Query `useDataGenFake` + * @summary Expose account statement PDF payload DTO for model generation + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useDataGenFake = (options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.dataGenFake(), + queryFn: DunningAccountStatementApi.dataGenFake, + ...options, + }); +}; - /** - * Query `useGenerateAccountStatement` - recommended when file should be cached - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const useGenerateAccountStatement = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CommonModels.OfficeInvoiceFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGenerateAccountStatement` - recommended when file should be cached + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGenerateAccountStatement = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); - return DunningAccountStatementApi.generateAccountStatement( - officeId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - }); - }; +/** + * Mutation `useGenerateAccountStatementMutation` - recommended when file should not be cached + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } mutation.officeId Path parameter + * @param { number } mutation.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } mutation.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } mutation.filter Query parameter + * @param { number } mutation.page Query parameter. 1-indexed page number to begin from + * @param { string } mutation.cursor Query parameter. ID of item to start after + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateAccountStatementMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useGenerateAccountStatementMutation` - recommended when file should not be cached - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } mutation.officeId Path parameter - * @param { number } mutation.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } mutation.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } mutation.filter Query parameter - * @param { number } mutation.page Query parameter. 1-indexed page number to begin from - * @param { string } mutation.cursor Query parameter. ID of item to start after - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGenerateAccountStatementMutation = ( - options?: AppMutationOptions< - typeof DunningAccountStatementApi.generateAccountStatement, - { - officeId: string; - limit: number; - order?: string; - filter?: CommonModels.OfficeInvoiceFilterDto; - page?: number; - cursor?: string; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, limit } = variables; + const updateKeys = [keys.generateAccountStatement(officeId, limit)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); - return DunningAccountStatementApi.generateAccountStatement( - officeId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, limit } = variables; - const updateKeys = [keys.generateAccountStatement(officeId, limit)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Infinite query `useGenerateAccountStatementInfinite + * @summary Generate account statement PDF from filtered office invoices + * @permission Requires `canUseGenerateAccountStatement` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGenerateAccountStatementInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useGenerateAccountStatementInfinite - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useGenerateAccountStatementInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CommonModels.OfficeInvoiceFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); - return DunningAccountStatementApi.generateAccountStatement( - officeId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Mutation `useGetAccountStatementEml` - recommended when file should not be cached + * @summary Get account statement as EML file with PDF attachment + * @permission Requires `canUseGetAccountStatementEml` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningAccountStatementModels.OfficeInvoiceListQueryDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGetAccountStatementEml = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useGetAccountStatementEml` - recommended when file should not be cached - * @summary Get account statement as EML file with PDF attachment - * @permission Requires `canUseGetAccountStatementEml` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningAccountStatementModels.OfficeInvoiceListQueryDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useGetAccountStatementEml = ( - options?: AppMutationOptions< - typeof DunningAccountStatementApi.getAccountStatementEml, - { officeId: string; data: DunningAccountStatementModels.OfficeInvoiceListQueryDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId } )); + return DunningAccountStatementApi.getAccountStatementEml(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId })); - return DunningAccountStatementApi.getAccountStatementEml(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/dunningLevels/dunningLevels.acl.ts b/test/generated/base/dunningLevels/dunningLevels.acl.ts index 55850c2..eb52ae7 100644 --- a/test/generated/base/dunningLevels/dunningLevels.acl.ts +++ b/test/generated/base/dunningLevels/dunningLevels.acl.ts @@ -1,87 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace DunningLevelsAcl { - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List dunning level labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Read", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List dunning level labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List dunning levels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Read", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List dunning levels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Create", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Create", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get dunning level by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Read", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get dunning level by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Update", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Update", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive a dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Archive", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive a dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Archive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive a dunning level + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("DunningLevel", object) : "DunningLevel" +] as AbilityTuple<"Unarchive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive a dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Unarchive", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Unarchive", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; } diff --git a/test/generated/base/dunningLevels/dunningLevels.api.ts b/test/generated/base/dunningLevels/dunningLevels.api.ts index 790f933..9829ae1 100644 --- a/test/generated/base/dunningLevels/dunningLevels.api.ts +++ b/test/generated/base/dunningLevels/dunningLevels.api.ts @@ -1,142 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DunningLevelsModels } from "./dunningLevels.models"; export namespace DunningLevelsApi { - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, - `/offices/${officeId}/dunning-levels/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const list = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, + `/offices/${officeId}/dunning-levels/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, - `/offices/${officeId}/dunning-levels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = ( - officeId: string, - data: DunningLevelsModels.CreateDunningLevelRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, + `/offices/${officeId}/dunning-levels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: DunningLevelsModels.CreateDunningLevelRequestDTO, ) => { return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels`, - ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), - config, - ); - }; - - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels`, + ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), + + ) +}; +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}`, - config, - ); - }; - - export const update = ( - id: string, - officeId: string, - data: DunningLevelsModels.UpdateDunningLevelRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}`, + + ) +}; +export const update = (id: string, officeId: string, data: DunningLevelsModels.UpdateDunningLevelRequestDTO, ) => { return AppRestClient.patch( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}`, - ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}`, + ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}/archive`, + + ) +}; +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, + `/offices/${officeId}/dunning-levels/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/dunningLevels/dunningLevels.configs.ts b/test/generated/base/dunningLevels/dunningLevels.configs.ts index 73a46f7..ddfe0e9 100644 --- a/test/generated/base/dunningLevels/dunningLevels.configs.ts +++ b/test/generated/base/dunningLevels/dunningLevels.configs.ts @@ -6,129 +6,130 @@ import { DunningLevelsQueries } from "./dunningLevels.queries"; import { DunningLevelsAcl } from "./dunningLevels.acl"; export namespace DunningLevelsConfigs { - export const dunningLevelsConfig = { +export const dunningLevelsConfig = { meta: { - title: "Dunning Levels", + title: "Dunning Levels", }, readAll: { - acl: DunningLevelsAcl.canUseList, - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - paginated: DunningLevelsQueries.useList, - infinite: DunningLevelsQueries.useListInfinite, - filters: { - schema: DunningLevelsModels.DunningLevelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningLevelsModels.DunningLevelFilterDtoSchema, - options: { - inputs: { - dunningSystemId: true, - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DunningLevelsAcl.canUseList, schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - options: { - columns: { - id: true, - level: true, - daysOverdue: true, - dunningFee: true, - interestRate: true, - usedInOfficeId: true, - usedInOffice: true, - dunningSystem: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - archived: true, - bodyRemarks: true, - footerRemarks: true, - }, - sortable: DunningLevelsModels.DunningLevelsListOrderParamEnumSchema, + paginated: DunningLevelsQueries.useList, + infinite: DunningLevelsQueries.useListInfinite, + filters: { + schema: DunningLevelsModels.DunningLevelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningLevelsModels.DunningLevelFilterDtoSchema, + options: { + inputs: { + dunningSystemId: true, + search: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + options: { + columns: { + id: true, + level: true, + daysOverdue: true, + dunningFee: true, + interestRate: true, + usedInOfficeId: true, + usedInOffice: true, + dunningSystem: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + archived: true, + bodyRemarks: true, + footerRemarks: true, + }, + sortable: DunningLevelsModels.DunningLevelsListOrderParamEnumSchema, + }, +}), }, read: { - acl: DunningLevelsAcl.canUseFindById, - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - query: DunningLevelsQueries.useFindById, + acl: DunningLevelsAcl.canUseFindById, + schema: DunningLevelsModels.DunningLevelResponseDTOSchema, + query: DunningLevelsQueries.useFindById, }, create: { - acl: DunningLevelsAcl.canUseCreate, - schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, - mutation: DunningLevelsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: DunningLevelsAcl.canUseCreate, schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, - options: { - inputs: { - level: true, - daysOverdue: true, - dunningFee: true, - dunningSystemId: true, - interestRate: true, - bodyRemarks: true, - footerRemarks: true, - }, - }, - }), + mutation: DunningLevelsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, + options: { + inputs: { + level: true, + daysOverdue: true, + dunningFee: true, + dunningSystemId: true, + interestRate: true, + bodyRemarks: true, + footerRemarks: true, + }, + }, +}) }, update: { - acl: DunningLevelsAcl.canUseUpdate, - schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, - mutation: DunningLevelsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: DunningLevelsAcl.canUseUpdate, schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, - options: { - inputs: { - level: true, - daysOverdue: true, - dunningFee: true, - interestRate: true, - dunningSystemId: true, - bodyRemarks: true, - footerRemarks: true, - }, - }, - }), + mutation: DunningLevelsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, + options: { + inputs: { + level: true, + daysOverdue: true, + dunningFee: true, + interestRate: true, + dunningSystemId: true, + bodyRemarks: true, + footerRemarks: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: DunningLevelsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DunningLevelsQueries.usePaginateLabels, - infinite: DunningLevelsQueries.usePaginateLabelsInfinite, - filters: { - schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DunningLevelsAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema, + paginated: DunningLevelsQueries.usePaginateLabels, + infinite: DunningLevelsQueries.usePaginateLabelsInfinite, + filters: { + schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/dunningLevels/dunningLevels.models.ts b/test/generated/base/dunningLevels/dunningLevels.models.ts index 2046ede..a19a7cf 100644 --- a/test/generated/base/dunningLevels/dunningLevels.models.ts +++ b/test/generated/base/dunningLevels/dunningLevels.models.ts @@ -2,206 +2,135 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace DunningLevelsModels { - /** - * DunningLevelOfficeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } currencyNotation - */ - export const DunningLevelOfficeDTOSchema = z - .object({ id: z.string(), name: z.string(), currencyNotation: z.string() }) - .readonly(); - export type DunningLevelOfficeDTO = z.infer; +/** + * DunningLevelOfficeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } currencyNotation + */ +export const DunningLevelOfficeDTOSchema = z.object({ id: z.string(), name: z.string(), currencyNotation: z.string() }); +export type DunningLevelOfficeDTO = z.infer; - /** - * DunningLevelEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DunningLevelEmployeeDTO = z.infer; +/** + * DunningLevelEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type DunningLevelEmployeeDTO = z.infer; - /** - * DunningLevelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { number } level - * @property { number } daysOverdue - * @property { number } dunningFee - * @property { number } interestRate - * @property { string } usedInOfficeId - * @property { DunningLevelOfficeDTO } usedInOffice - * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem - * @property { string } createdById - * @property { DunningLevelEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DunningLevelEmployeeDTO } updatedBy - * @property { string } updatedAt - * @property { boolean } archived - * @property { CommonModels.EditorContentResponseDto } bodyRemarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks - */ - export const DunningLevelResponseDTOSchema = z - .object({ - id: z.string(), - level: z.number(), - daysOverdue: z.number(), - dunningFee: z.number(), - interestRate: z.number().nullish(), - usedInOfficeId: z.string(), - usedInOffice: DunningLevelOfficeDTOSchema.nullish(), - dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), - createdById: z.string().nullish(), - createdBy: DunningLevelEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: DunningLevelEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - archived: z.boolean(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), - }) - .readonly(); - export type DunningLevelResponseDTO = z.infer; +/** + * DunningLevelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { number } level + * @property { number } daysOverdue + * @property { number } dunningFee + * @property { number } interestRate + * @property { string } usedInOfficeId + * @property { DunningLevelOfficeDTO } usedInOffice + * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem + * @property { string } createdById + * @property { DunningLevelEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DunningLevelEmployeeDTO } updatedBy + * @property { string } updatedAt + * @property { boolean } archived + * @property { CommonModels.EditorContentResponseDto } bodyRemarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks + */ +export const DunningLevelResponseDTOSchema = z.object({ id: z.string(), level: z.number(), daysOverdue: z.number(), dunningFee: z.number(), interestRate: z.number().nullish(), usedInOfficeId: z.string(), usedInOffice: DunningLevelOfficeDTOSchema.nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), createdById: z.string().nullish(), createdBy: DunningLevelEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningLevelEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), archived: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish() }); +export type DunningLevelResponseDTO = z.infer; - /** - * CreateDunningLevelRequestDTOSchema - * @type { object } - * @property { number } level Dunning level number. Minimum: `1` - * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` - * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` - * @property { string } dunningSystemId Dunning system ID - * @property { number } interestRate Minimum: `0`. Maximum: `100` - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const CreateDunningLevelRequestDTOSchema = z - .object({ - level: z.number().gte(1).describe("Dunning level number"), - daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), - dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), - dunningSystemId: z.string().describe("Dunning system ID").nullish(), - interestRate: z.number().gte(0).lte(100).nullish(), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks").nullish(), - }) - .readonly(); - export type CreateDunningLevelRequestDTO = z.infer; +/** + * CreateDunningLevelRequestDTOSchema + * @type { object } + * @property { number } level Dunning level number. Minimum: `1` + * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` + * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` + * @property { string } dunningSystemId Dunning system ID + * @property { number } interestRate Minimum: `0`. Maximum: `100` + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const CreateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1), daysOverdue: z.number().gte(1), dunningFee: z.number().gte(0), dunningSystemId: z.string().nullish(), interestRate: z.number().gte(0).lte(100).nullish(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullish() }); +export type CreateDunningLevelRequestDTO = z.infer; - /** - * UpdateDunningLevelRequestDTOSchema - * @type { object } - * @property { number } level Dunning level number. Minimum: `1` - * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` - * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` - * @property { number } interestRate Minimum: `0`. Maximum: `100` - * @property { string } dunningSystemId Dunning system ID - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateDunningLevelRequestDTOSchema = z - .object({ - level: z.number().gte(1).describe("Dunning level number"), - daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), - dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), - interestRate: z.number().gte(0).lte(100), - dunningSystemId: z.string().describe("Dunning system ID"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateDunningLevelRequestDTO = z.infer; +/** + * UpdateDunningLevelRequestDTOSchema + * @type { object } + * @property { number } level Dunning level number. Minimum: `1` + * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` + * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` + * @property { number } interestRate Minimum: `0`. Maximum: `100` + * @property { string } dunningSystemId Dunning system ID + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1).nullable(), daysOverdue: z.number().gte(1).nullable(), dunningFee: z.number().gte(0).nullable(), interestRate: z.number().gte(0).lte(100).nullable(), dunningSystemId: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); +export type UpdateDunningLevelRequestDTO = z.infer; - /** - * DunningLevelLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const DunningLevelLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type DunningLevelLabelFilterDto = z.infer; +/** + * DunningLevelLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DunningLevelLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type DunningLevelLabelFilterDto = z.infer; - /** - * DunningLevelFilterDtoSchema - * @type { object } - * @property { string } dunningSystemId Dunning system ID to filter by - * @property { string } search Search to filter by - * @property { boolean } archived Filter by archived status - */ - export const DunningLevelFilterDtoSchema = z - .object({ - dunningSystemId: z.string().describe("Dunning system ID to filter by"), - search: z.string().describe("Search to filter by"), - archived: z.boolean().describe("Filter by archived status"), - }) - .readonly(); - export type DunningLevelFilterDto = z.infer; +/** + * DunningLevelFilterDtoSchema + * @type { object } + * @property { string } dunningSystemId Dunning system ID to filter by + * @property { string } search Search to filter by + * @property { boolean } archived Filter by archived status + */ +export const DunningLevelFilterDtoSchema = z.object({ dunningSystemId: z.string().nullable(), search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); +export type DunningLevelFilterDto = z.infer; - /** - * DunningLevelsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const DunningLevelsPaginateLabelsOrderParamEnumSchema = z.enum([ - "level", - "daysOverdue", - "dunningFee", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DunningLevelsPaginateLabelsOrderParamEnum = z.infer< - typeof DunningLevelsPaginateLabelsOrderParamEnumSchema - >; - export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLabelsOrderParamEnumSchema.enum; +/** + * DunningLevelsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DunningLevelsPaginateLabelsOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DunningLevelsPaginateLabelsOrderParamEnum = z.infer; +export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLabelsOrderParamEnumSchema.enum; - /** - * DunningLevelsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const DunningLevelsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DunningLevelsPaginateLabelsResponse = z.infer; +/** + * DunningLevelsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DunningLevelsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type DunningLevelsPaginateLabelsResponse = z.infer; - /** - * DunningLevelsListOrderParamEnumSchema - * @type { enum } - */ - export const DunningLevelsListOrderParamEnumSchema = z.enum([ - "level", - "daysOverdue", - "dunningFee", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DunningLevelsListOrderParamEnum = z.infer; - export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSchema.enum; +/** + * DunningLevelsListOrderParamEnumSchema + * @type { enum } + */ +export const DunningLevelsListOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type DunningLevelsListOrderParamEnum = z.infer; +export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSchema.enum; + +/** + * DunningLevelsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningLevelResponseDTO[] } items + */ +export const DunningLevelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningLevelResponseDTOSchema).nullable() }).partial().shape }); +export type DunningLevelsListResponse = z.infer; - /** - * DunningLevelsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningLevelResponseDTO[] } items - */ - export const DunningLevelsListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(DunningLevelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DunningLevelsListResponse = z.infer; } diff --git a/test/generated/base/dunningLevels/dunningLevels.queries.ts b/test/generated/base/dunningLevels/dunningLevels.queries.ts index 9792c9b..b75b7a0 100644 --- a/test/generated/base/dunningLevels/dunningLevels.queries.ts +++ b/test/generated/base/dunningLevels/dunningLevels.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,412 +8,266 @@ import { DunningLevelsModels } from "./dunningLevels.models"; import { DunningLevelsApi } from "./dunningLevels.api"; export namespace DunningLevelsQueries { - export const moduleName = QueryModule.DunningLevels; +export const moduleName = QueryModule.DunningLevels; - export const keys = { +export const keys = { all: [moduleName] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/dunning-levels/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/dunning-levels/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - list: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/dunning-levels", officeId, limit, order, filter, page, cursor] as const, - listInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelFilterDto, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/dunning-levels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/dunning-levels/:id", id, officeId] as const, - }; + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-levels/:id", id, officeId] as const, +}; - /** - * Query `usePaginateLabels` - * @summary Paginate dunning level labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningLevelsModels.DunningLevelLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginateLabels` + * @summary Paginate dunning level labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId })); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate dunning level labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate dunning level labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningLevelsModels.DunningLevelLabelFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId })); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Query `useList` - * @summary List dunning levels - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningLevelsModels.DunningLevelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useList` + * @summary List dunning levels + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUseList({ officeId } )); + return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUseList({ officeId })); - return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useListInfinite + * @summary List dunning levels + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` + * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListInfinite - * @summary List dunning levels - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningLevelsModels.DunningLevelFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningLevelsAcl.canUseList({ officeId } )); + return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningLevelsAcl.canUseList({ officeId })); - return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Mutation `useCreate` + * @summary Create dunning level + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningLevelsModels.CreateDunningLevelRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreate` - * @summary Create dunning level - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningLevelsModels.CreateDunningLevelRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof DunningLevelsApi.create, - { officeId: string; data: DunningLevelsModels.CreateDunningLevelRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningLevelsAcl.canUseCreate({ officeId })); - return DunningLevelsApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningLevelsAcl.canUseCreate({ officeId } )); + return DunningLevelsApi.create(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useFindById` - * @summary Get dunning level by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get dunning level by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(DunningLevelsAcl.canUseFindById({ officeId } )); + return DunningLevelsApi.findById(id, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUseFindById({ officeId })); - return DunningLevelsApi.findById(id, officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update dunning level + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningLevelsModels.UpdateDunningLevelRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update dunning level - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningLevelsModels.UpdateDunningLevelRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof DunningLevelsApi.update, - { id: string; officeId: string; data: DunningLevelsModels.UpdateDunningLevelRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(DunningLevelsAcl.canUseUpdate({ officeId } )); + return DunningLevelsApi.update(id, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(DunningLevelsAcl.canUseUpdate({ officeId })); - return DunningLevelsApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive a dunning level + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive a dunning level - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningLevelsAcl.canUseArchive({ officeId } )); + return DunningLevelsApi.archive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningLevelsAcl.canUseArchive({ officeId })); - return DunningLevelsApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive a dunning level + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive a dunning level - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId } )); + return DunningLevelsApi.unarchive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId })); - return DunningLevelsApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/dunningManagement/dunningManagement.acl.ts b/test/generated/base/dunningManagement/dunningManagement.acl.ts index 6e5c932..251aea8 100644 --- a/test/generated/base/dunningManagement/dunningManagement.acl.ts +++ b/test/generated/base/dunningManagement/dunningManagement.acl.ts @@ -1,39 +1,43 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace DunningManagementAcl { - /** - * Use for `useListDunnings` query ability. For global ability, omit the object parameter. - * @description List dunnings - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListDunnings` query - */ - export const canUseListDunnings = (object?: { officeId: string }) => - ["Read", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< - "Read", - "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) - >; +/** + * Use for `useListDunnings` query ability. For global ability, omit the object parameter. + * @description List dunnings + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListDunnings` query + */ +export const canUseListDunnings = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Dunning", object) : "Dunning" +] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - /** - * Use for `useCreateDunningWithInvoices` mutation ability. For global ability, omit the object parameter. - * @description Create dunning - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDunningWithInvoices` mutation - */ - export const canUseCreateDunningWithInvoices = (object?: { officeId: string }) => - ["Create", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< - "Create", - "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) - >; +/** + * Use for `useCreateDunningWithInvoices` mutation ability. For global ability, omit the object parameter. + * @description Create dunning + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDunningWithInvoices` mutation + */ +export const canUseCreateDunningWithInvoices = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Dunning", object) : "Dunning" +] as AbilityTuple<"Create", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; + +/** + * Use for `useGetDunningEml` query or `useGetDunningEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download dunning as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDunningEml` query or `useGetDunningEmlMutation` mutation + */ +export const canUseGetDunningEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Dunning", object) : "Dunning" +] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - /** - * Use for `useGetDunningEml` query or `useGetDunningEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download dunning as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDunningEml` query or `useGetDunningEmlMutation` mutation - */ - export const canUseGetDunningEml = (object?: { officeId: string }) => - ["Read", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< - "Read", - "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) - >; } diff --git a/test/generated/base/dunningManagement/dunningManagement.api.ts b/test/generated/base/dunningManagement/dunningManagement.api.ts index bd41108..5b706b4 100644 --- a/test/generated/base/dunningManagement/dunningManagement.api.ts +++ b/test/generated/base/dunningManagement/dunningManagement.api.ts @@ -1,81 +1,50 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DunningManagementModels } from "./dunningManagement.models"; export namespace DunningManagementApi { - export const listDunnings = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningManagementModels.DunningFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const listDunnings = (officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: DunningManagementModels.ListDunningsResponseSchema }, - `/offices/${officeId}/dunnings`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const createDunningWithInvoices = ( - partnerId: string, - officeId: string, - data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: DunningManagementModels.ListDunningsResponseSchema }, + `/offices/${officeId}/dunnings`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createDunningWithInvoices = (partnerId: string, officeId: string, data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, ) => { return AppRestClient.post( - { resSchema: DunningManagementModels.DunningResponseDtoSchema }, - `/offices/${officeId}/partners/${partnerId}/dunnings`, - ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), - config, - ); - }; - - export const dataGenFake = (config?: AxiosRequestConfig) => { + { resSchema: DunningManagementModels.DunningResponseDtoSchema }, + `/offices/${officeId}/partners/${partnerId}/dunnings`, + ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), + + ) +}; +export const dataGenFake = () => { return AppRestClient.get( - { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, - `/data-gen-fake`, - config, - ); - }; - - export const getDunningEml = (officeId: string, dunningId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/dunnings/${dunningId}/eml`, { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }); - }; + { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, + `/data-gen-fake`, + + ) +}; +export const getDunningEml = (officeId: string, dunningId: string, ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/dunnings/${dunningId}/eml`, + { + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; } diff --git a/test/generated/base/dunningManagement/dunningManagement.configs.ts b/test/generated/base/dunningManagement/dunningManagement.configs.ts index 6c13fc7..6c09ba7 100644 --- a/test/generated/base/dunningManagement/dunningManagement.configs.ts +++ b/test/generated/base/dunningManagement/dunningManagement.configs.ts @@ -5,55 +5,56 @@ import { DunningManagementQueries } from "./dunningManagement.queries"; import { DunningManagementAcl } from "./dunningManagement.acl"; export namespace DunningManagementConfigs { - export const dunningsConfig = { +export const dunningsConfig = { meta: { - title: "Dunnings", + title: "Dunnings", }, readAll: { - acl: DunningManagementAcl.canUseListDunnings, - schema: DunningManagementModels.DunningResponseDtoSchema, - paginated: DunningManagementQueries.useListDunnings, - infinite: DunningManagementQueries.useListDunningsInfinite, - filters: { - schema: DunningManagementModels.DunningFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningManagementModels.DunningFilterDtoSchema, - options: { - inputs: { - status: true, - partnerId: true, - level: true, - outstandingAmountMin: true, - outstandingAmountMax: true, - createdFrom: true, - createdTo: true, - confirmedBy: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DunningManagementAcl.canUseListDunnings, schema: DunningManagementModels.DunningResponseDtoSchema, - options: { - columns: { - id: true, - partner: true, - level: true, - dunningLevelId: true, - status: true, - invoiceCount: true, - outstandingAmount: true, - currencyNotation: true, - daysOverdue: true, - dunningFee: true, - createdAt: true, - statusChangedOn: true, - confirmedBy: true, - documentUrl: true, - }, - sortable: DunningManagementModels.ListDunningsOrderParamEnumSchema, + paginated: DunningManagementQueries.useListDunnings, + infinite: DunningManagementQueries.useListDunningsInfinite, + filters: { + schema: DunningManagementModels.DunningFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningManagementModels.DunningFilterDtoSchema, + options: { + inputs: { + status: true, + partnerId: true, + level: true, + outstandingAmountMin: true, + outstandingAmountMax: true, + createdFrom: true, + createdTo: true, + confirmedBy: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: DunningManagementModels.DunningResponseDtoSchema, + options: { + columns: { + id: true, + partner: true, + level: true, + dunningLevelId: true, + status: true, + invoiceCount: true, + outstandingAmount: true, + currencyNotation: true, + daysOverdue: true, + dunningFee: true, + createdAt: true, + statusChangedOn: true, + confirmedBy: true, + documentUrl: true, + }, + sortable: DunningManagementModels.ListDunningsOrderParamEnumSchema, + }, +}), }, - }; +}; + } diff --git a/test/generated/base/dunningManagement/dunningManagement.models.ts b/test/generated/base/dunningManagement/dunningManagement.models.ts index 1e56fe9..572426f 100644 --- a/test/generated/base/dunningManagement/dunningManagement.models.ts +++ b/test/generated/base/dunningManagement/dunningManagement.models.ts @@ -2,298 +2,194 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace DunningManagementModels { - /** - * DunningPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ - export const DunningPartnerDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), - }) - .readonly(); - export type DunningPartnerDto = z.infer; +/** + * DunningPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const DunningPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); +export type DunningPartnerDto = z.infer; - /** - * DunningConfirmedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DunningConfirmedByDto = z.infer; +/** + * DunningConfirmedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type DunningConfirmedByDto = z.infer; - /** - * DunningStatusSchema - * @type { enum } - */ - export const DunningStatusSchema = z.enum(["PREPARED", "ISSUED"]); - export type DunningStatus = z.infer; - export const DunningStatus = DunningStatusSchema.enum; +/** + * DunningStatusSchema + * @type { enum } + */ +export const DunningStatusSchema = z.enum(["PREPARED", "ISSUED"]); +export type DunningStatus = z.infer; +export const DunningStatus = DunningStatusSchema.enum; - /** - * DunningResponseDtoSchema - * @type { object } - * @property { string } id - * @property { DunningPartnerDto } partner - * @property { number } level - * @property { string } dunningLevelId - * @property { string } status - * @property { number } invoiceCount - * @property { number } outstandingAmount - * @property { string } currencyNotation - * @property { number } daysOverdue - * @property { number } dunningFee - * @property { string } createdAt - * @property { string } statusChangedOn - * @property { DunningConfirmedByDto } confirmedBy - * @property { string } documentUrl - */ - export const DunningResponseDtoSchema = z - .object({ - id: z.string(), - partner: DunningPartnerDtoSchema, - level: z.number(), - dunningLevelId: z.string().nullish(), - status: DunningStatusSchema, - invoiceCount: z.number(), - outstandingAmount: z.number(), - currencyNotation: z.string(), - daysOverdue: z.number(), - dunningFee: z.number(), - createdAt: z.iso.datetime({ offset: true }), - statusChangedOn: z.iso.datetime({ offset: true }), - confirmedBy: DunningConfirmedByDtoSchema.nullish(), - documentUrl: z.string().nullish(), - }) - .readonly(); - export type DunningResponseDto = z.infer; +/** + * DunningResponseDtoSchema + * @type { object } + * @property { string } id + * @property { DunningPartnerDto } partner + * @property { number } level + * @property { string } dunningLevelId + * @property { string } status + * @property { number } invoiceCount + * @property { number } outstandingAmount + * @property { string } currencyNotation + * @property { number } daysOverdue + * @property { number } dunningFee + * @property { string } createdAt + * @property { string } statusChangedOn + * @property { DunningConfirmedByDto } confirmedBy + * @property { string } documentUrl + */ +export const DunningResponseDtoSchema = z.object({ id: z.string(), partner: DunningPartnerDtoSchema, level: z.number(), dunningLevelId: z.string().nullish(), status: DunningStatusSchema, invoiceCount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number(), dunningFee: z.number(), createdAt: z.iso.datetime({ offset: true }), statusChangedOn: z.iso.datetime({ offset: true }), confirmedBy: DunningConfirmedByDtoSchema.nullish(), documentUrl: z.string().nullish() }); +export type DunningResponseDto = z.infer; - /** - * DunningFilterDtoSchema - * @type { object } - * @property { DunningStatus[] } status - * @property { string } partnerId Partner ID to filter by - * @property { array[] } level Dunning level(s) to filter by - * @property { number } outstandingAmountMin Minimum outstanding amount - * @property { number } outstandingAmountMax Maximum outstanding amount - * @property { string } createdFrom Created from (ISO date string) - * @property { string } createdTo Created to (ISO date string) - * @property { string } confirmedBy Confirmed by employee ID - */ - export const DunningFilterDtoSchema = z - .object({ - status: z.array(DunningStatusSchema).readonly(), - partnerId: z.string().describe("Partner ID to filter by"), - level: z.array(z.array(z.any()).readonly()).readonly().describe("Dunning level(s) to filter by"), - outstandingAmountMin: z.number().describe("Minimum outstanding amount"), - outstandingAmountMax: z.number().describe("Maximum outstanding amount"), - createdFrom: z.iso.datetime({ offset: true }).describe("Created from (ISO date string)"), - createdTo: z.iso.datetime({ offset: true }).describe("Created to (ISO date string)"), - confirmedBy: z.string().describe("Confirmed by employee ID"), - }) - .readonly(); - export type DunningFilterDto = z.infer; +/** + * DunningFilterDtoSchema + * @type { object } + * @property { DunningStatus[] } status + * @property { string } partnerId Partner ID to filter by + * @property { array[] } level Dunning level(s) to filter by + * @property { number } outstandingAmountMin Minimum outstanding amount + * @property { number } outstandingAmountMax Maximum outstanding amount + * @property { string } createdFrom Created from (ISO date string) + * @property { string } createdTo Created to (ISO date string) + * @property { string } confirmedBy Confirmed by employee ID + */ +export const DunningFilterDtoSchema = z.object({ status: z.array(DunningStatusSchema).nullable(), partnerId: z.string().nullable(), level: z.array(z.array(z.any())).nullable(), outstandingAmountMin: z.number().nullable(), outstandingAmountMax: z.number().nullable(), createdFrom: z.iso.datetime({ offset: true }).nullable(), createdTo: z.iso.datetime({ offset: true }).nullable(), confirmedBy: z.string().nullable() }).partial(); +export type DunningFilterDto = z.infer; - /** - * DunningPdfConfigDTOSchema - * @type { object } - * @property { string } headerImageUrl - * @property { string } footerImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ - export const DunningPdfConfigDTOSchema = z - .object({ - headerImageUrl: z.string(), - footerImageUrl: z.string(), - showWatermarkOnDocuments: z.boolean(), - locale: CommonModels.LocaleEnumSchema.nullish(), - }) - .readonly(); - export type DunningPdfConfigDTO = z.infer; +/** + * DunningPdfConfigDTOSchema + * @type { object } + * @property { string } headerImageUrl + * @property { string } footerImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ +export const DunningPdfConfigDTOSchema = z.object({ headerImageUrl: z.string(), footerImageUrl: z.string(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); +export type DunningPdfConfigDTO = z.infer; - /** - * DunningPdfBusinessPartnerDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } address - * @property { string } referenceNumber - */ - export const DunningPdfBusinessPartnerDTOSchema = z - .object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }) - .readonly(); - export type DunningPdfBusinessPartnerDTO = z.infer; +/** + * DunningPdfBusinessPartnerDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } address + * @property { string } referenceNumber + */ +export const DunningPdfBusinessPartnerDTOSchema = z.object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }); +export type DunningPdfBusinessPartnerDTO = z.infer; - /** - * DunningPdfInvoiceDTOSchema - * @type { object } - * @property { string } invoiceNumber - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } daysOverdue - * @property { number } dunningLevel - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - * @property { number } interest - */ - export const DunningPdfInvoiceDTOSchema = z - .object({ - invoiceNumber: z.string(), - issuingDate: z.iso.datetime({ offset: true }), - dueDate: z.iso.datetime({ offset: true }).nullish(), - daysOverdue: z.number(), - dunningLevel: z.number(), - invoiceAmount: z.number(), - outstandingAmount: z.number(), - currencyNotation: z.string(), - interest: z.number().nullish(), - }) - .readonly(); - export type DunningPdfInvoiceDTO = z.infer; +/** + * DunningPdfInvoiceDTOSchema + * @type { object } + * @property { string } invoiceNumber + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } daysOverdue + * @property { number } dunningLevel + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + * @property { number } interest + */ +export const DunningPdfInvoiceDTOSchema = z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }).nullish(), daysOverdue: z.number(), dunningLevel: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), interest: z.number().nullish() }); +export type DunningPdfInvoiceDTO = z.infer; - /** - * DunningPdfTotalDTOSchema - * @type { object } - * @property { number } invoicesSum - * @property { number } dunningFee - * @property { number } interest - * @property { string } currencyNotation - */ - export const DunningPdfTotalDTOSchema = z - .object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }) - .readonly(); - export type DunningPdfTotalDTO = z.infer; +/** + * DunningPdfTotalDTOSchema + * @type { object } + * @property { number } invoicesSum + * @property { number } dunningFee + * @property { number } interest + * @property { string } currencyNotation + */ +export const DunningPdfTotalDTOSchema = z.object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }); +export type DunningPdfTotalDTO = z.infer; - /** - * DunningPdfBankAccountDTOSchema - * @type { object } - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - */ - export const DunningPdfBankAccountDTOSchema = z - .object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }) - .readonly(); - export type DunningPdfBankAccountDTO = z.infer; +/** + * DunningPdfBankAccountDTOSchema + * @type { object } + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + */ +export const DunningPdfBankAccountDTOSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }); +export type DunningPdfBankAccountDTO = z.infer; - /** - * DunningPdfUpcomingInvoiceDTOSchema - * @type { object } - * @property { string } number - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } dueDays - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - */ - export const DunningPdfUpcomingInvoiceDTOSchema = z - .object({ - number: z.string(), - issuingDate: z.iso.datetime({ offset: true }).nullish(), - dueDate: z.iso.datetime({ offset: true }).nullish(), - dueDays: z.number().nullish(), - invoiceAmount: z.number().nullish(), - outstandingAmount: z.number().nullish(), - currencyNotation: z.string().nullish(), - }) - .readonly(); - export type DunningPdfUpcomingInvoiceDTO = z.infer; +/** + * DunningPdfUpcomingInvoiceDTOSchema + * @type { object } + * @property { string } number + * @property { string } issuingDate + * @property { string } dueDate + * @property { number } dueDays + * @property { number } invoiceAmount + * @property { number } outstandingAmount + * @property { string } currencyNotation + */ +export const DunningPdfUpcomingInvoiceDTOSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), dueDays: z.number().nullish(), invoiceAmount: z.number().nullish(), outstandingAmount: z.number().nullish(), currencyNotation: z.string().nullish() }); +export type DunningPdfUpcomingInvoiceDTO = z.infer; - /** - * DunningPdfPayloadDTOSchema - * @type { object } - * @property { string } dunningId - * @property { number } dunningLevel - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { DunningPdfBusinessPartnerDTO } businessPartner - * @property { DunningPdfInvoiceDTO[] } invoices - * @property { DunningPdfTotalDTO } total - * @property { DunningPdfBankAccountDTO } bankAccount - * @property { string } employeeName - * @property { DunningPdfConfigDTO } config - * @property { CommonModels.LanguageEnum } language - * @property { DunningPdfUpcomingInvoiceDTO[] } upcomingInvoices - */ - export const DunningPdfPayloadDTOSchema = z - .object({ - dunningId: z.string(), - dunningLevel: z.number(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - businessPartner: DunningPdfBusinessPartnerDTOSchema, - invoices: z.array(DunningPdfInvoiceDTOSchema).readonly(), - total: DunningPdfTotalDTOSchema, - bankAccount: DunningPdfBankAccountDTOSchema, - employeeName: z.string().nullable(), - config: DunningPdfConfigDTOSchema, - language: CommonModels.LanguageEnumSchema.nullish(), - upcomingInvoices: z.array(DunningPdfUpcomingInvoiceDTOSchema).readonly().nullish(), - }) - .readonly(); - export type DunningPdfPayloadDTO = z.infer; +/** + * DunningPdfPayloadDTOSchema + * @type { object } + * @property { string } dunningId + * @property { number } dunningLevel + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { DunningPdfBusinessPartnerDTO } businessPartner + * @property { DunningPdfInvoiceDTO[] } invoices + * @property { DunningPdfTotalDTO } total + * @property { DunningPdfBankAccountDTO } bankAccount + * @property { string } employeeName + * @property { DunningPdfConfigDTO } config + * @property { CommonModels.LanguageEnum } language + * @property { DunningPdfUpcomingInvoiceDTO[] } upcomingInvoices + */ +export const DunningPdfPayloadDTOSchema = z.object({ dunningId: z.string(), dunningLevel: z.number(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), businessPartner: DunningPdfBusinessPartnerDTOSchema, invoices: z.array(DunningPdfInvoiceDTOSchema), total: DunningPdfTotalDTOSchema, bankAccount: DunningPdfBankAccountDTOSchema, employeeName: z.string().nullable(), config: DunningPdfConfigDTOSchema, language: CommonModels.LanguageEnumSchema.nullish(), upcomingInvoices: z.array(DunningPdfUpcomingInvoiceDTOSchema).nullish() }); +export type DunningPdfPayloadDTO = z.infer; - /** - * CreateDunningWithInvoicesRequestDTOSchema - * @type { object } - * @property { string[] } invoiceIds Array of outstanding invoice IDs to include in the dunning. Example: `123e4567-e89b-12d3-a456-426614174000,123e4567-e89b-12d3-a456-426614174001` - * @property { string } dunningLevelId The ID of the dunning level to use for this dunning. Example: `123e4567-e89b-12d3-a456-426614174002` - * @property { number } dunningFee Optional dunning fee to use. If not provided, the fee from the dunning level will be used. Minimum: `0`. Example: `25.5` - * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` - * @property { boolean } includeUpcomingInvoices - */ - export const CreateDunningWithInvoicesRequestDTOSchema = z - .object({ - invoiceIds: z.array(z.string()).readonly().describe("Array of outstanding invoice IDs to include in the dunning"), - dunningLevelId: z.string().describe("The ID of the dunning level to use for this dunning"), - dunningFee: z - .number() - .gte(0) - .describe("Optional dunning fee to use. If not provided, the fee from the dunning level will be used") - .nullish(), - interestRate: z.number().gte(0).lte(100).nullish(), - includeUpcomingInvoices: z.boolean().nullish(), - }) - .readonly(); - export type CreateDunningWithInvoicesRequestDTO = z.infer; +/** + * CreateDunningWithInvoicesRequestDTOSchema + * @type { object } + * @property { string[] } invoiceIds Array of outstanding invoice IDs to include in the dunning. Example: `123e4567-e89b-12d3-a456-426614174000,123e4567-e89b-12d3-a456-426614174001` + * @property { string } dunningLevelId The ID of the dunning level to use for this dunning. Example: `123e4567-e89b-12d3-a456-426614174002` + * @property { number } dunningFee Optional dunning fee to use. If not provided, the fee from the dunning level will be used. Minimum: `0`. Example: `25.5` + * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` + * @property { boolean } includeUpcomingInvoices + */ +export const CreateDunningWithInvoicesRequestDTOSchema = z.object({ invoiceIds: z.array(z.string()), dunningLevelId: z.string(), dunningFee: z.number().gte(0).nullish(), interestRate: z.number().gte(0).lte(100).nullish(), includeUpcomingInvoices: z.boolean().nullish() }); +export type CreateDunningWithInvoicesRequestDTO = z.infer; - /** - * ListDunningsOrderParamEnumSchema - * @type { enum } - */ - export const ListDunningsOrderParamEnumSchema = z.enum([ - "createdAt", - "level", - "outstandingAmount", - "statusChangedOn", - ]); - export type ListDunningsOrderParamEnum = z.infer; - export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; +/** + * ListDunningsOrderParamEnumSchema + * @type { enum } + */ +export const ListDunningsOrderParamEnumSchema = z.enum(["createdAt", "level", "outstandingAmount", "statusChangedOn"]); +export type ListDunningsOrderParamEnum = z.infer; +export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; + +/** + * ListDunningsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningResponseDto[] } items + */ +export const ListDunningsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningResponseDtoSchema).nullable() }).partial().shape }); +export type ListDunningsResponse = z.infer; - /** - * ListDunningsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningResponseDto[] } items - */ - export const ListDunningsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(DunningResponseDtoSchema).readonly() }).readonly().shape, - }); - export type ListDunningsResponse = z.infer; } diff --git a/test/generated/base/dunningManagement/dunningManagement.queries.ts b/test/generated/base/dunningManagement/dunningManagement.queries.ts index 270d1d2..53428c9 100644 --- a/test/generated/base/dunningManagement/dunningManagement.queries.ts +++ b/test/generated/base/dunningManagement/dunningManagement.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,233 +8,166 @@ import { DunningManagementModels } from "./dunningManagement.models"; import { DunningManagementApi } from "./dunningManagement.api"; export namespace DunningManagementQueries { - export const moduleName = QueryModule.DunningManagement; +export const moduleName = QueryModule.DunningManagement; - export const keys = { +export const keys = { all: [moduleName] as const, - listDunnings: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningManagementModels.DunningFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/dunnings", officeId, limit, order, filter, page, cursor] as const, - listDunningsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningManagementModels.DunningFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/dunnings", "infinite", officeId, limit, order, filter, cursor] as const, - dataGenFake: () => [...keys.all, "/data-gen-fake"] as const, - getDunningEml: (officeId: string, dunningId: string) => - [...keys.all, "/offices/:officeId/dunnings/:dunningId/eml", officeId, dunningId] as const, - }; + listDunnings: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", officeId, limit, order, filter, page, cursor] as const, + listDunningsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", "infinite", officeId, limit, order, filter, cursor] as const, + dataGenFake: () => [...keys.all, "/data-gen-fake", ] as const, + getDunningEml: (officeId: string, dunningId: string) => [...keys.all, "/offices/:officeId/dunnings/:dunningId/eml", officeId, dunningId] as const, +}; - /** - * Query `useListDunnings` - * @summary List dunnings for an office - * @permission Requires `canUseListDunnings` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` - * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListDunnings = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningManagementModels.DunningFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useListDunnings` + * @summary List dunnings for an office + * @permission Requires `canUseListDunnings` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` + * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListDunnings = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); + return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningManagementAcl.canUseListDunnings({ officeId })); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useListDunningsInfinite + * @summary List dunnings for an office + * @permission Requires `canUseListDunnings` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` + * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListDunningsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListDunningsInfinite - * @summary List dunnings for an office - * @permission Requires `canUseListDunnings` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` - * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListDunningsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningManagementModels.DunningFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); + return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningManagementAcl.canUseListDunnings({ officeId })); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Mutation `useCreateDunningWithInvoices` - * @summary Create a dunning with outstanding invoices - * @permission Requires `canUseCreateDunningWithInvoices` ability - * @param { string } mutation.partnerId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningManagementModels.CreateDunningWithInvoicesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateDunningWithInvoices = ( - options?: AppMutationOptions< - typeof DunningManagementApi.createDunningWithInvoices, - { partnerId: string; officeId: string; data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreateDunningWithInvoices` + * @summary Create a dunning with outstanding invoices + * @permission Requires `canUseCreateDunningWithInvoices` ability + * @param { string } mutation.partnerId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningManagementModels.CreateDunningWithInvoicesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateDunningWithInvoices = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ partnerId, officeId, data }) => { - checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId })); - return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ partnerId, officeId, data }) => { + checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId } )); + return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useDataGenFake` - * @summary Expose dunning PDF payload DTO for model generation - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useDataGenFake = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.dataGenFake(), - queryFn: () => DunningManagementApi.dataGenFake(config), - ...options, - }); - }; +/** + * Query `useDataGenFake` + * @summary Expose dunning PDF payload DTO for model generation + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useDataGenFake = (options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.dataGenFake(), + queryFn: DunningManagementApi.dataGenFake, + ...options, + }); +}; - /** - * Query `useGetDunningEml` - recommended when file should be cached - * @summary Get dunning as EML file with PDF attachment - * @permission Requires `canUseGetDunningEml` ability - * @param { string } object.officeId Path parameter - * @param { string } object.dunningId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const useGetDunningEml = ( - { officeId, dunningId }: { officeId: string; dunningId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetDunningEml` - recommended when file should be cached + * @summary Get dunning as EML file with PDF attachment + * @permission Requires `canUseGetDunningEml` ability + * @param { string } object.officeId Path parameter + * @param { string } object.dunningId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetDunningEml = ({ officeId, dunningId }: { officeId: string, dunningId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDunningEml(officeId, dunningId), + queryFn: () => { + checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); + return DunningManagementApi.getDunningEml(officeId, dunningId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getDunningEml(officeId, dunningId), - queryFn: () => { - checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId })); - return DunningManagementApi.getDunningEml(officeId, dunningId, config); - }, - ...options, - }); - }; +/** + * Mutation `useGetDunningEmlMutation` - recommended when file should not be cached + * @summary Get dunning as EML file with PDF attachment + * @permission Requires `canUseGetDunningEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.dunningId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetDunningEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useGetDunningEmlMutation` - recommended when file should not be cached - * @summary Get dunning as EML file with PDF attachment - * @permission Requires `canUseGetDunningEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.dunningId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGetDunningEmlMutation = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, dunningId }) => { + checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); + return DunningManagementApi.getDunningEml(officeId, dunningId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, dunningId } = variables; + const updateKeys = [keys.getDunningEml(officeId, dunningId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, dunningId }) => { - checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId })); - return DunningManagementApi.getDunningEml(officeId, dunningId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, dunningId } = variables; - const updateKeys = [keys.getDunningEml(officeId, dunningId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts index 48fca0f..4294b32 100644 --- a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts +++ b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts @@ -1,39 +1,43 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace DunningPartnerOutstandingInvoicesAcl { - /** - * Use for `useListPartnerOutstandingInvoiceSummaries` query ability. For global ability, omit the object parameter. - * @description List office outstanding invoice summaries per partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoiceSummaries` query - */ - export const canUseListPartnerOutstandingInvoiceSummaries = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useListPartnerOutstandingInvoiceSummaries` query ability. For global ability, omit the object parameter. + * @description List office outstanding invoice summaries per partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoiceSummaries` query + */ +export const canUseListPartnerOutstandingInvoiceSummaries = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useListPartnerOutstandingInvoices` query ability. For global ability, omit the object parameter. - * @description List partner outstanding invoices - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoices` query - */ - export const canUseListPartnerOutstandingInvoices = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useListPartnerOutstandingInvoices` query ability. For global ability, omit the object parameter. + * @description List partner outstanding invoices + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoices` query + */ +export const canUseListPartnerOutstandingInvoices = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useListRecommendedDunningLevels` mutation ability. For global ability, omit the object parameter. + * @description List recommended dunning levels for a partner + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRecommendedDunningLevels` mutation + */ +export const canUseListRecommendedDunningLevels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useListRecommendedDunningLevels` mutation ability. For global ability, omit the object parameter. - * @description List recommended dunning levels for a partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRecommendedDunningLevels` mutation - */ - export const canUseListRecommendedDunningLevels = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; } diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts index 73bbbaf..d7cdd8a 100644 --- a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts +++ b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts @@ -1,110 +1,45 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; export namespace DunningPartnerOutstandingInvoicesApi { - export const listPartnerOutstandingInvoiceSummaries = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const listPartnerOutstandingInvoiceSummaries = (officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, - `/offices/${officeId}/partner-outstanding-invoices`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const listPartnerOutstandingInvoices = ( - partnerId: string, - officeId: string, - limit: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, + `/offices/${officeId}/partner-outstanding-invoices`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listPartnerOutstandingInvoices = (partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, - `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const listRecommendedDunningLevels = ( - partnerId: string, - officeId: string, - data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, + `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listRecommendedDunningLevels = (partnerId: string, officeId: string, data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, ) => { return AppRestClient.post( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, - `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, - ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), - config, - ); - }; + { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, + `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, + ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts index 66cb46a..3fc3451 100644 --- a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts +++ b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts @@ -5,92 +5,93 @@ import { DunningPartnerOutstandingInvoicesQueries } from "./dunningPartnerOutsta import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; export namespace DunningPartnerOutstandingInvoicesConfigs { - export const partnerOutstandingInvoicesConfig = { +export const partnerOutstandingInvoicesConfig = { meta: { - title: "Partner Outstanding Invoices", + title: "Partner Outstanding Invoices", }, readAll: { - acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries, - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, - paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummaries, - infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummariesInfinite, - filters: { - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, - options: { - inputs: { - search: true, - daysOverdueMin: true, - partnerId: true, - outstandingAmountMin: true, - currency: true, - dunningSystemId: true, - lastDunningDate: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries, schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, - options: { - columns: { - partnerId: true, - partnerName: true, - partnerCountry: true, - dunningSystemId: true, - dunningSystemName: true, - invoiceCount: true, - daysOverdue: true, - outstandingAmount: true, - currencyNotation: true, - lastDunningDate: true, - }, - sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, + paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummaries, + infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummariesInfinite, + filters: { + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, + options: { + inputs: { + search: true, + daysOverdueMin: true, + partnerId: true, + outstandingAmountMin: true, + currency: true, + dunningSystemId: true, + lastDunningDate: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, + options: { + columns: { + partnerId: true, + partnerName: true, + partnerCountry: true, + dunningSystemId: true, + dunningSystemName: true, + invoiceCount: true, + daysOverdue: true, + outstandingAmount: true, + currencyNotation: true, + lastDunningDate: true, + }, + sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, + }, +}), }, - }; +}; - export const outstandingInvoicesConfig = { +export const outstandingInvoicesConfig = { meta: { - title: "Outstanding Invoices", + title: "Outstanding Invoices", }, readAll: { - acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices, - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, - paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoices, - infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoicesInfinite, - filters: { - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, - options: { - inputs: { - partnerId: true, - currency: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices, schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, - options: { - columns: { - invoiceId: true, - invoiceNumber: true, - invoiceDate: true, - invoiceAmount: true, - owedAmount: true, - currencyNotation: true, - daysOverdue: true, - dueDate: true, - invoiceInReview: true, - dunningBlock: true, - }, - sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, + paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoices, + infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoicesInfinite, + filters: { + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, + options: { + inputs: { + partnerId: true, + currency: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, + options: { + columns: { + invoiceId: true, + invoiceNumber: true, + invoiceDate: true, + invoiceAmount: true, + owedAmount: true, + currencyNotation: true, + daysOverdue: true, + dueDate: true, + invoiceInReview: true, + dunningBlock: true, }, - }; + sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts index 23aa85a..b07e9f3 100644 --- a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts +++ b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts @@ -2,206 +2,128 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace DunningPartnerOutstandingInvoicesModels { - /** - * PartnerOutstandingInvoiceSummaryFilterDtoSchema - * @type { object } - * @property { string } search Search string (partner name) - * @property { number } daysOverdueMin Minimum days overdue - * @property { string } partnerId Partner ID - * @property { number } outstandingAmountMin Minimum outstanding amount - * @property { string } currency Currency - * @property { string } dunningSystemId Dunning system ID - * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range - */ - export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z - .object({ - search: z.string().describe("Search string (partner name)"), - daysOverdueMin: z.number().describe("Minimum days overdue"), - partnerId: z.string().describe("Partner ID"), - outstandingAmountMin: z.number().describe("Minimum outstanding amount"), - currency: z.string().describe("Currency"), - dunningSystemId: z.string().describe("Dunning system ID"), - lastDunningDate: CommonModels.DateRangeDtoSchema.describe("Last dunning date range"), - }) - .readonly(); - export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer< - typeof PartnerOutstandingInvoiceSummaryFilterDtoSchema - >; +/** + * PartnerOutstandingInvoiceSummaryFilterDtoSchema + * @type { object } + * @property { string } search Search string (partner name) + * @property { number } daysOverdueMin Minimum days overdue + * @property { string } partnerId Partner ID + * @property { number } outstandingAmountMin Minimum outstanding amount + * @property { string } currency Currency + * @property { string } dunningSystemId Dunning system ID + * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range + */ +export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z.object({ search: z.string().nullable(), daysOverdueMin: z.number().nullable(), partnerId: z.string().nullable(), outstandingAmountMin: z.number().nullable(), currency: z.string().nullable(), dunningSystemId: z.string().nullable(), lastDunningDate: CommonModels.DateRangeDtoSchema.nullable() }).partial(); +export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer; - /** - * PartnerOutstandingInvoiceSummaryResponseDtoSchema - * @type { object } - * @property { string } partnerId Business partner ID - * @property { string } partnerName Business partner name - * @property { string } partnerCountry Business partner country - * @property { string } dunningSystemId Dunning system ID - * @property { string } dunningSystemName Dunning system name - * @property { number } invoiceCount Number of outstanding invoices - * @property { number } daysOverdue Maximum days overdue across all partner invoices - * @property { number } outstandingAmount Total outstanding amount - * @property { string } currencyNotation Currency of partner invoices - * @property { string } lastDunningDate Date of the most recent issued dunning document - */ - export const PartnerOutstandingInvoiceSummaryResponseDtoSchema = z - .object({ - partnerId: z.string().describe("Business partner ID"), - partnerName: z.string().describe("Business partner name"), - partnerCountry: z.string().describe("Business partner country").nullish(), - dunningSystemId: z.string().describe("Dunning system ID"), - dunningSystemName: z.string().describe("Dunning system name"), - invoiceCount: z.number().describe("Number of outstanding invoices"), - daysOverdue: z.number().describe("Maximum days overdue across all partner invoices").nullish(), - outstandingAmount: z.number().describe("Total outstanding amount"), - currencyNotation: z.string().describe("Currency of partner invoices"), - lastDunningDate: z.iso - .datetime({ offset: true }) - .describe("Date of the most recent issued dunning document") - .nullish(), - }) - .readonly(); - export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer< - typeof PartnerOutstandingInvoiceSummaryResponseDtoSchema - >; +/** + * PartnerOutstandingInvoiceSummaryResponseDtoSchema + * @type { object } + * @property { string } partnerId Business partner ID + * @property { string } partnerName Business partner name + * @property { string } partnerCountry Business partner country + * @property { string } dunningSystemId Dunning system ID + * @property { string } dunningSystemName Dunning system name + * @property { number } invoiceCount Number of outstanding invoices + * @property { number } daysOverdue Maximum days overdue across all partner invoices + * @property { number } outstandingAmount Total outstanding amount + * @property { string } currencyNotation Currency of partner invoices + * @property { string } lastDunningDate Date of the most recent issued dunning document + */ +export const PartnerOutstandingInvoiceSummaryResponseDtoSchema = z.object({ partnerId: z.string(), partnerName: z.string(), partnerCountry: z.string().nullish(), dunningSystemId: z.string(), dunningSystemName: z.string(), invoiceCount: z.number(), daysOverdue: z.number().nullish(), outstandingAmount: z.number(), currencyNotation: z.string(), lastDunningDate: z.iso.datetime({ offset: true }).nullish() }); +export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer; - /** - * PartnerOutstandingInvoiceResponseDtoSchema - * @type { object } - * @property { string } invoiceId Invoice ID - * @property { string } invoiceNumber Invoice number - * @property { string } invoiceDate Invoice date - * @property { number } invoiceAmount Invoice amount - * @property { number } owedAmount Owed amount - * @property { string } currencyNotation Currency notation - * @property { number } daysOverdue Days overdue - * @property { string } dueDate Due date - * @property { boolean } invoiceInReview - * @property { boolean } dunningBlock - */ - export const PartnerOutstandingInvoiceResponseDtoSchema = z - .object({ - invoiceId: z.string().describe("Invoice ID"), - invoiceNumber: z.string().describe("Invoice number").nullish(), - invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date").nullish(), - invoiceAmount: z.number().describe("Invoice amount"), - owedAmount: z.number().describe("Owed amount"), - currencyNotation: z.string().describe("Currency notation"), - daysOverdue: z.number().describe("Days overdue").nullish(), - dueDate: z.iso.datetime({ offset: true }).describe("Due date").nullish(), - invoiceInReview: z.boolean().nullish(), - dunningBlock: z.boolean().nullish(), - }) - .readonly(); - export type PartnerOutstandingInvoiceResponseDto = z.infer; +/** + * PartnerOutstandingInvoiceResponseDtoSchema + * @type { object } + * @property { string } invoiceId Invoice ID + * @property { string } invoiceNumber Invoice number + * @property { string } invoiceDate Invoice date + * @property { number } invoiceAmount Invoice amount + * @property { number } owedAmount Owed amount + * @property { string } currencyNotation Currency notation + * @property { number } daysOverdue Days overdue + * @property { string } dueDate Due date + * @property { boolean } invoiceInReview + * @property { boolean } dunningBlock + */ +export const PartnerOutstandingInvoiceResponseDtoSchema = z.object({ invoiceId: z.string(), invoiceNumber: z.string().nullish(), invoiceDate: z.iso.datetime({ offset: true }).nullish(), invoiceAmount: z.number(), owedAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number().nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), invoiceInReview: z.boolean().nullish(), dunningBlock: z.boolean().nullish() }); +export type PartnerOutstandingInvoiceResponseDto = z.infer; - /** - * PartnerOutstandingInvoiceFilterDtoSchema - * @type { object } - * @property { string } partnerId Partner ID to filter by - * @property { string } currency Invoice currency notation to filter by - */ - export const PartnerOutstandingInvoiceFilterDtoSchema = z - .object({ - partnerId: z.string().describe("Partner ID to filter by"), - currency: z.string().describe("Invoice currency notation to filter by"), - }) - .readonly(); - export type PartnerOutstandingInvoiceFilterDto = z.infer; +/** + * PartnerOutstandingInvoiceFilterDtoSchema + * @type { object } + * @property { string } partnerId Partner ID to filter by + * @property { string } currency Invoice currency notation to filter by + */ +export const PartnerOutstandingInvoiceFilterDtoSchema = z.object({ partnerId: z.string().nullable(), currency: z.string().nullable() }).partial(); +export type PartnerOutstandingInvoiceFilterDto = z.infer; - /** - * RecommendedDunningLevelsRequestDtoSchema - * @type { object } - * @property { string[] } invoiceIds Invoice IDs used to calculate the recommended dunning level. Min Items: `1`. Example: `123e4567-e89b-12d3-a456-426614174000` - */ - export const RecommendedDunningLevelsRequestDtoSchema = z - .object({ - invoiceIds: z - .array(z.string()) - .readonly() - .min(1) - .describe("Invoice IDs used to calculate the recommended dunning level"), - }) - .readonly(); - export type RecommendedDunningLevelsRequestDto = z.infer; +/** + * RecommendedDunningLevelsRequestDtoSchema + * @type { object } + * @property { string[] } invoiceIds Invoice IDs used to calculate the recommended dunning level. Min Items: `1`. Example: `123e4567-e89b-12d3-a456-426614174000` + */ +export const RecommendedDunningLevelsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).min(1) }); +export type RecommendedDunningLevelsRequestDto = z.infer; - /** - * RecommendedLabelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { boolean } isRecommended - */ - export const RecommendedLabelResponseDtoSchema = z - .object({ id: z.string(), label: z.string(), isRecommended: z.boolean() }) - .readonly(); - export type RecommendedLabelResponseDto = z.infer; +/** + * RecommendedLabelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { boolean } isRecommended + */ +export const RecommendedLabelResponseDtoSchema = z.object({ id: z.string(), label: z.string(), isRecommended: z.boolean() }); +export type RecommendedLabelResponseDto = z.infer; - /** - * ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema - * @type { enum } - */ - export const ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema = z.enum([ - "outstandingAmount", - "daysOverdue", - "lastDunningDate", - "invoiceCount", - "partnerCountry", - "partnerName", - "dunningSystemName", - ]); - export type ListPartnerOutstandingInvoiceSummariesOrderParamEnum = z.infer< - typeof ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema - >; - export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = - ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema.enum; +/** + * ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema + * @type { enum } + */ +export const ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema = z.enum(["outstandingAmount", "daysOverdue", "lastDunningDate", "invoiceCount", "partnerCountry", "partnerName", "dunningSystemName"]); +export type ListPartnerOutstandingInvoiceSummariesOrderParamEnum = z.infer; +export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema.enum; - /** - * ListPartnerOutstandingInvoiceSummariesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items - */ - export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).readonly() }).readonly().shape, - }); - export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer< - typeof ListPartnerOutstandingInvoiceSummariesResponseSchema - >; +/** + * ListPartnerOutstandingInvoiceSummariesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items + */ +export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).nullable() }).partial().shape }); +export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer; - /** - * ListPartnerOutstandingInvoicesOrderParamEnumSchema - * @type { enum } - */ - export const ListPartnerOutstandingInvoicesOrderParamEnumSchema = z.enum(["dueDate", "invoiceDate", "owedAmount"]); - export type ListPartnerOutstandingInvoicesOrderParamEnum = z.infer< - typeof ListPartnerOutstandingInvoicesOrderParamEnumSchema - >; - export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandingInvoicesOrderParamEnumSchema.enum; +/** + * ListPartnerOutstandingInvoicesOrderParamEnumSchema + * @type { enum } + */ +export const ListPartnerOutstandingInvoicesOrderParamEnumSchema = z.enum(["dueDate", "invoiceDate", "owedAmount"]); +export type ListPartnerOutstandingInvoicesOrderParamEnum = z.infer; +export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandingInvoicesOrderParamEnumSchema.enum; - /** - * ListPartnerOutstandingInvoicesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerOutstandingInvoiceResponseDto[] } items - */ - export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).readonly() }).readonly().shape, - }); - export type ListPartnerOutstandingInvoicesResponse = z.infer; +/** + * ListPartnerOutstandingInvoicesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerOutstandingInvoiceResponseDto[] } items + */ +export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).nullable() }).partial().shape }); +export type ListPartnerOutstandingInvoicesResponse = z.infer; + +/** + * ListRecommendedDunningLevelsResponseSchema + * @type { array } + */ +export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema); +export type ListRecommendedDunningLevelsResponse = z.infer; - /** - * ListRecommendedDunningLevelsResponseSchema - * @type { array } - */ - export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema).readonly(); - export type ListRecommendedDunningLevelsResponse = z.infer; } diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts index 5719173..5e8a555 100644 --- a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts +++ b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,357 +8,158 @@ import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstan import { DunningPartnerOutstandingInvoicesApi } from "./dunningPartnerOutstandingInvoices.api"; export namespace DunningPartnerOutstandingInvoicesQueries { - export const moduleName = QueryModule.DunningPartnerOutstandingInvoices; +export const moduleName = QueryModule.DunningPartnerOutstandingInvoices; - export const keys = { +export const keys = { all: [moduleName] as const, - listPartnerOutstandingInvoiceSummaries: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/partner-outstanding-invoices", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - listPartnerOutstandingInvoiceSummariesInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/partner-outstanding-invoices", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - listPartnerOutstandingInvoices: ( - partnerId: string, - officeId: string, - limit?: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/partners/:partnerId/outstanding-invoices", - partnerId, - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - listPartnerOutstandingInvoicesInfinite: ( - partnerId: string, - officeId: string, - limit?: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/partners/:partnerId/outstanding-invoices", - "infinite", - partnerId, - officeId, - limit, - order, - filter, - cursor, - ] as const, - }; + listPartnerOutstandingInvoiceSummaries: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", officeId, limit, order, filter, page, cursor] as const, + listPartnerOutstandingInvoiceSummariesInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", "infinite", officeId, limit, order, filter, cursor] as const, + listPartnerOutstandingInvoices: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", partnerId, officeId, limit, order, filter, page, cursor] as const, + listPartnerOutstandingInvoicesInfinite: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", "infinite", partnerId, officeId, limit, order, filter, cursor] as const, +}; - /** - * Query `useListPartnerOutstandingInvoiceSummaries` - * @summary List office outstanding invoice summaries per partner - * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListPartnerOutstandingInvoiceSummaries = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions< - typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries, - TData - >, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useListPartnerOutstandingInvoiceSummaries` + * @summary List office outstanding invoice summaries per partner + * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoiceSummaries = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId })); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries( - officeId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - }); - }; +/** + * Infinite query `useListPartnerOutstandingInvoiceSummariesInfinite + * @summary List office outstanding invoice summaries per partner + * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoiceSummariesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListPartnerOutstandingInvoiceSummariesInfinite - * @summary List office outstanding invoice summaries per partner - * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListPartnerOutstandingInvoiceSummariesInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions< - typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries, - TData - >, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId })); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries( - officeId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Query `useListPartnerOutstandingInvoices` - * @summary List outstanding invoices for a specific partner - * @permission Requires `canUseListPartnerOutstandingInvoices` ability - * @param { string } object.partnerId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListPartnerOutstandingInvoices = ( - { - partnerId, - officeId, - limit, - order, - filter, - page, - cursor, - }: { - partnerId: string; - officeId: string; - limit: number; - order?: string; - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useListPartnerOutstandingInvoices` + * @summary List outstanding invoices for a specific partner + * @permission Requires `canUseListPartnerOutstandingInvoices` ability + * @param { string } object.partnerId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoices = ({ partnerId, officeId, limit, order, filter, page, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId })); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices( - partnerId, - officeId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - }); - }; +/** + * Infinite query `useListPartnerOutstandingInvoicesInfinite + * @summary List outstanding invoices for a specific partner + * @permission Requires `canUseListPartnerOutstandingInvoices` ability + * @param { string } object.partnerId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` + * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListPartnerOutstandingInvoicesInfinite = ({ partnerId, officeId, limit, order, filter, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListPartnerOutstandingInvoicesInfinite - * @summary List outstanding invoices for a specific partner - * @permission Requires `canUseListPartnerOutstandingInvoices` ability - * @param { string } object.partnerId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListPartnerOutstandingInvoicesInfinite = ( - { - partnerId, - officeId, - limit, - order, - filter, - cursor, - }: { - partnerId: string; - officeId: string; - limit: number; - order?: string; - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions< - typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices, - TData - >, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId })); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices( - partnerId, - officeId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Mutation `useListRecommendedDunningLevels` + * @summary List recommended dunning levels for a partner + * @permission Requires `canUseListRecommendedDunningLevels` ability + * @param { string } mutation.partnerId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useListRecommendedDunningLevels = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useListRecommendedDunningLevels` - * @summary List recommended dunning levels for a partner - * @permission Requires `canUseListRecommendedDunningLevels` ability - * @param { string } mutation.partnerId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useListRecommendedDunningLevels = ( - options?: AppMutationOptions< - typeof DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels, - { - partnerId: string; - officeId: string; - data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ partnerId, officeId, data }) => { + checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId } )); + return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ partnerId, officeId, data }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId })); - return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/dunningSystems/dunningSystems.acl.ts b/test/generated/base/dunningSystems/dunningSystems.acl.ts index 2074067..14c8307 100644 --- a/test/generated/base/dunningSystems/dunningSystems.acl.ts +++ b/test/generated/base/dunningSystems/dunningSystems.acl.ts @@ -1,87 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace DunningSystemsAcl { - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List dunning system labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Read", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List dunning system labels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List dunning systems - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Read", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List dunning systems + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Create", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Create", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get dunning system by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Read", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get dunning system by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Update", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Update", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Archive", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive dunning system + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("DunningSystem", object) : "DunningSystem" +] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Archive", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; } diff --git a/test/generated/base/dunningSystems/dunningSystems.api.ts b/test/generated/base/dunningSystems/dunningSystems.api.ts index 9166e80..2d584ae 100644 --- a/test/generated/base/dunningSystems/dunningSystems.api.ts +++ b/test/generated/base/dunningSystems/dunningSystems.api.ts @@ -1,142 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DunningSystemsModels } from "./dunningSystems.models"; export namespace DunningSystemsApi { - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, - `/offices/${officeId}/dunning-systems/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, + `/offices/${officeId}/dunning-systems/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, - `/offices/${officeId}/dunning-systems`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = ( - officeId: string, - data: DunningSystemsModels.CreateDunningSystemRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, + `/offices/${officeId}/dunning-systems`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: DunningSystemsModels.CreateDunningSystemRequestDTO, ) => { return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems`, - ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), - config, - ); - }; - - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems`, + ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), + + ) +}; +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}`, - config, - ); - }; - - export const update = ( - id: string, - officeId: string, - data: DunningSystemsModels.UpdateDunningSystemRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}`, + + ) +}; +export const update = (id: string, officeId: string, data: DunningSystemsModels.UpdateDunningSystemRequestDTO, ) => { return AppRestClient.patch( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}`, - ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}`, + ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}/archive`, + + ) +}; +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, + `/offices/${officeId}/dunning-systems/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/dunningSystems/dunningSystems.configs.ts b/test/generated/base/dunningSystems/dunningSystems.configs.ts index 4928e9a..9040265 100644 --- a/test/generated/base/dunningSystems/dunningSystems.configs.ts +++ b/test/generated/base/dunningSystems/dunningSystems.configs.ts @@ -6,114 +6,115 @@ import { DunningSystemsQueries } from "./dunningSystems.queries"; import { DunningSystemsAcl } from "./dunningSystems.acl"; export namespace DunningSystemsConfigs { - export const dunningSystemsConfig = { +export const dunningSystemsConfig = { meta: { - title: "Dunning Systems", + title: "Dunning Systems", }, readAll: { - acl: DunningSystemsAcl.canUsePaginate, - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - paginated: DunningSystemsQueries.usePaginate, - infinite: DunningSystemsQueries.usePaginateInfinite, - filters: { - schema: DunningSystemsModels.DunningSystemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningSystemsModels.DunningSystemFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - isDefault: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DunningSystemsAcl.canUsePaginate, schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - isDefault: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema, + paginated: DunningSystemsQueries.usePaginate, + infinite: DunningSystemsQueries.usePaginateInfinite, + filters: { + schema: DunningSystemsModels.DunningSystemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningSystemsModels.DunningSystemFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + isDefault: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + isDefault: true, + archived: true, + archivedAt: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: DunningSystemsAcl.canUseFindById, - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - query: DunningSystemsQueries.useFindById, + acl: DunningSystemsAcl.canUseFindById, + schema: DunningSystemsModels.DunningSystemResponseDTOSchema, + query: DunningSystemsQueries.useFindById, }, create: { - acl: DunningSystemsAcl.canUseCreate, - schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, - mutation: DunningSystemsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: DunningSystemsAcl.canUseCreate, schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, - options: { - inputs: { - name: true, - isDefault: true, - }, - }, - }), + mutation: DunningSystemsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, + options: { + inputs: { + name: true, + isDefault: true, + }, + }, +}) }, update: { - acl: DunningSystemsAcl.canUseUpdate, - schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, - mutation: DunningSystemsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: DunningSystemsAcl.canUseUpdate, schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, - options: { - inputs: { - name: true, - isDefault: true, - }, - }, - }), + mutation: DunningSystemsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, + options: { + inputs: { + name: true, + isDefault: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: DunningSystemsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DunningSystemsQueries.usePaginateLabels, - infinite: DunningSystemsQueries.usePaginateLabelsInfinite, - filters: { - schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: DunningSystemsAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema, + paginated: DunningSystemsQueries.usePaginateLabels, + infinite: DunningSystemsQueries.usePaginateLabelsInfinite, + filters: { + schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/dunningSystems/dunningSystems.models.ts b/test/generated/base/dunningSystems/dunningSystems.models.ts index f3465f1..164270a 100644 --- a/test/generated/base/dunningSystems/dunningSystems.models.ts +++ b/test/generated/base/dunningSystems/dunningSystems.models.ts @@ -2,144 +2,110 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace DunningSystemsModels { - /** - * DunningSystemEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DunningSystemEmployeeDTO = z.infer; +/** + * DunningSystemEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type DunningSystemEmployeeDTO = z.infer; - /** - * DunningSystemResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name - * @property { boolean } isDefault - * @property { boolean } archived - * @property { string } archivedAt - * @property { string } createdById - * @property { DunningSystemEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DunningSystemEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const DunningSystemResponseDTOSchema = z - .object({ - id: z.string(), - officeId: z.string(), - name: z.string(), - isDefault: z.boolean(), - archived: z.boolean(), - archivedAt: z.iso.datetime({ offset: true }).nullish(), - createdById: z.string().nullish(), - createdBy: DunningSystemEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: DunningSystemEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type DunningSystemResponseDTO = z.infer; +/** + * DunningSystemResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name + * @property { boolean } isDefault + * @property { boolean } archived + * @property { string } archivedAt + * @property { string } createdById + * @property { DunningSystemEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { DunningSystemEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const DunningSystemResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isDefault: z.boolean(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: DunningSystemEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningSystemEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type DunningSystemResponseDTO = z.infer; - /** - * DunningSystemLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const DunningSystemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type DunningSystemLabelFilterDto = z.infer; +/** + * DunningSystemLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const DunningSystemLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type DunningSystemLabelFilterDto = z.infer; - /** - * DunningSystemFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - * @property { boolean } isDefault - */ - export const DunningSystemFilterDtoSchema = z - .object({ search: z.string(), archived: z.boolean(), isDefault: z.boolean() }) - .readonly(); - export type DunningSystemFilterDto = z.infer; +/** + * DunningSystemFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + * @property { boolean } isDefault + */ +export const DunningSystemFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable(), isDefault: z.boolean().nullable() }).partial(); +export type DunningSystemFilterDto = z.infer; - /** - * CreateDunningSystemRequestDTOSchema - * @type { object } - * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` - * @property { boolean } isDefault Is default dunning system - */ - export const CreateDunningSystemRequestDTOSchema = z - .object({ - name: z.string().min(3).max(100).describe("Dunning system name"), - isDefault: z.boolean().describe("Is default dunning system").nullish(), - }) - .readonly(); - export type CreateDunningSystemRequestDTO = z.infer; +/** + * CreateDunningSystemRequestDTOSchema + * @type { object } + * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` + * @property { boolean } isDefault Is default dunning system + */ +export const CreateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100), isDefault: z.boolean().nullish() }); +export type CreateDunningSystemRequestDTO = z.infer; - /** - * UpdateDunningSystemRequestDTOSchema - * @type { object } - * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` - * @property { boolean } isDefault Is default dunning system - */ - export const UpdateDunningSystemRequestDTOSchema = z - .object({ - name: z.string().min(3).max(100).describe("Dunning system name"), - isDefault: z.boolean().describe("Is default dunning system"), - }) - .readonly(); - export type UpdateDunningSystemRequestDTO = z.infer; +/** + * UpdateDunningSystemRequestDTOSchema + * @type { object } + * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` + * @property { boolean } isDefault Is default dunning system + */ +export const UpdateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100).nullable(), isDefault: z.boolean().nullable() }).partial(); +export type UpdateDunningSystemRequestDTO = z.infer; - /** - * DunningSystemsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const DunningSystemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); - export type DunningSystemsPaginateLabelsOrderParamEnum = z.infer< - typeof DunningSystemsPaginateLabelsOrderParamEnumSchema - >; - export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginateLabelsOrderParamEnumSchema.enum; +/** + * DunningSystemsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const DunningSystemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); +export type DunningSystemsPaginateLabelsOrderParamEnum = z.infer; +export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginateLabelsOrderParamEnumSchema.enum; - /** - * DunningSystemsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const DunningSystemsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DunningSystemsPaginateLabelsResponse = z.infer; +/** + * DunningSystemsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const DunningSystemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type DunningSystemsPaginateLabelsResponse = z.infer; - /** - * DunningSystemsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const DunningSystemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); - export type DunningSystemsPaginateOrderParamEnum = z.infer; - export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderParamEnumSchema.enum; +/** + * DunningSystemsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const DunningSystemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); +export type DunningSystemsPaginateOrderParamEnum = z.infer; +export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderParamEnumSchema.enum; + +/** + * DunningSystemsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { DunningSystemResponseDTO[] } items + */ +export const DunningSystemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningSystemResponseDTOSchema).nullable() }).partial().shape }); +export type DunningSystemsPaginateResponse = z.infer; - /** - * DunningSystemsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningSystemResponseDTO[] } items - */ - export const DunningSystemsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(DunningSystemResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DunningSystemsPaginateResponse = z.infer; } diff --git a/test/generated/base/dunningSystems/dunningSystems.queries.ts b/test/generated/base/dunningSystems/dunningSystems.queries.ts index acd8234..7ec4019 100644 --- a/test/generated/base/dunningSystems/dunningSystems.queries.ts +++ b/test/generated/base/dunningSystems/dunningSystems.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,412 +8,266 @@ import { DunningSystemsModels } from "./dunningSystems.models"; import { DunningSystemsApi } from "./dunningSystems.api"; export namespace DunningSystemsQueries { - export const moduleName = QueryModule.DunningSystems; +export const moduleName = QueryModule.DunningSystems; - export const keys = { +export const keys = { all: [moduleName] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/dunning-systems/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/dunning-systems/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/dunning-systems", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemFilterDto, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/dunning-systems", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/dunning-systems/:id", id, officeId] as const, - }; + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-systems/:id", id, officeId] as const, +}; - /** - * Query `usePaginateLabels` - * @summary Paginate dunning system labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningSystemsModels.DunningSystemLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginateLabels` + * @summary Paginate dunning system labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId })); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate dunning system labels + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate dunning system labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningSystemsModels.DunningSystemLabelFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId })); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Query `usePaginate` - * @summary List dunning systems - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningSystemsModels.DunningSystemFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginate` + * @summary List dunning systems + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); + return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUsePaginate({ officeId })); - return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateInfinite + * @summary List dunning systems + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` + * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateInfinite - * @summary List dunning systems - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningSystemsModels.DunningSystemFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); + return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningSystemsAcl.canUsePaginate({ officeId })); - return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Mutation `useCreate` + * @summary Create dunning system + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { DunningSystemsModels.CreateDunningSystemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreate` - * @summary Create dunning system - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningSystemsModels.CreateDunningSystemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof DunningSystemsApi.create, - { officeId: string; data: DunningSystemsModels.CreateDunningSystemRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningSystemsAcl.canUseCreate({ officeId })); - return DunningSystemsApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(DunningSystemsAcl.canUseCreate({ officeId } )); + return DunningSystemsApi.create(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useFindById` - * @summary Get dunning system by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get dunning system by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(DunningSystemsAcl.canUseFindById({ officeId } )); + return DunningSystemsApi.findById(id, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUseFindById({ officeId })); - return DunningSystemsApi.findById(id, officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update dunning system + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { DunningSystemsModels.UpdateDunningSystemRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update dunning system - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningSystemsModels.UpdateDunningSystemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof DunningSystemsApi.update, - { id: string; officeId: string; data: DunningSystemsModels.UpdateDunningSystemRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(DunningSystemsAcl.canUseUpdate({ officeId } )); + return DunningSystemsApi.update(id, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(DunningSystemsAcl.canUseUpdate({ officeId })); - return DunningSystemsApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive dunning system + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive dunning system - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningSystemsAcl.canUseArchive({ officeId } )); + return DunningSystemsApi.archive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningSystemsAcl.canUseArchive({ officeId })); - return DunningSystemsApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive dunning system + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive dunning system - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId } )); + return DunningSystemsApi.unarchive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId })); - return DunningSystemsApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/employee/employee.acl.ts b/test/generated/base/employee/employee.acl.ts index 29c1627..e796e7e 100644 --- a/test/generated/base/employee/employee.acl.ts +++ b/test/generated/base/employee/employee.acl.ts @@ -1,115 +1,153 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace EmployeeAcl { - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List employees - * @param { string } object.officeId officeId from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId?: string }) => - ["Read", object ? subject("Employee", object) : "Employee"] as AbilityTuple< - "Read", - "Employee" | (ForcedSubject<"Employee"> & { officeId?: string }) - >; +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List employees + * @param { string } object.officeId officeId from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId?: string, } +) => [ + "Read", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new employee - * @param { string } object.officeId officeId from mutation data - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId?: string }) => - ["Create", object ? subject("Employee", object) : "Employee"] as AbilityTuple< - "Create", - "Employee" | (ForcedSubject<"Employee"> & { officeId?: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new employee + * @param { string } object.officeId officeId from mutation data + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId?: string, } +) => [ + "Create", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; - /** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Employee" +] as AbilityTuple<"Read", "Employee">; - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Employee" +] as AbilityTuple<"Read", "Employee">; - /** - * Use for `useResendOnboardingWithOffice` mutation ability. For global ability, omit the object parameter. - * @description Resend employee onboarding email - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useResendOnboardingWithOffice` mutation - */ - export const canUseResendOnboardingWithOffice = (object?: { officeId: string }) => - ["Create", object ? subject("Employee", object) : "Employee"] as AbilityTuple< - "Create", - "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) - >; +/** + * Use for `useResendOnboardingWithOffice` mutation ability. For global ability, omit the object parameter. + * @description Resend employee onboarding email + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useResendOnboardingWithOffice` mutation + */ +export const canUseResendOnboardingWithOffice = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - /** - * Use for `useGet` query ability. - * @description Read Office Employee - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; +/** + * Use for `useGet` query ability. + * @description Read Office Employee + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( +) => [ + "Read", + "Employee" +] as AbilityTuple<"Read", "Employee">; - /** - * Use for `useUpdate` mutation ability. - * @description Update Office Employee - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Employee"] as AbilityTuple<"Update", "Employee">; +/** + * Use for `useUpdate` mutation ability. + * @description Update Office Employee + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Employee" +] as AbilityTuple<"Update", "Employee">; - /** - * Use for `useGetWithOffice` query ability. For global ability, omit the object parameter. - * @description Read Office Employee - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetWithOffice` query - */ - export const canUseGetWithOffice = (object?: { officeId: string }) => - ["Read", object ? subject("Employee", object) : "Employee"] as AbilityTuple< - "Read", - "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) - >; +/** + * Use for `useGetWithOffice` query ability. For global ability, omit the object parameter. + * @description Read Office Employee + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetWithOffice` query + */ +export const canUseGetWithOffice = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - /** - * Use for `useUpdateWithOffice` mutation ability. For global ability, omit the object parameter. - * @description Update Office Employee - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateWithOffice` mutation - */ - export const canUseUpdateWithOffice = (object?: { officeId: string }) => - ["Update", object ? subject("Employee", object) : "Employee"] as AbilityTuple< - "Update", - "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) - >; +/** + * Use for `useUpdateWithOffice` mutation ability. For global ability, omit the object parameter. + * @description Update Office Employee + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateWithOffice` mutation + */ +export const canUseUpdateWithOffice = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Employee", object) : "Employee" +] as AbilityTuple<"Update", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - /** - * Use for `useListRoles` query ability. - * @description List employee (global) roles - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query - */ - export const canUseListRoles = () => ["ListRoles", "Employee"] as AbilityTuple<"ListRoles", "Employee">; +/** + * Use for `useListRoles` query ability. + * @description List employee (global) roles + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query + */ +export const canUseListRoles = ( +) => [ + "ListRoles", + "Employee" +] as AbilityTuple<"ListRoles", "Employee">; - /** - * Use for `useUpdateRoles` mutation ability. - * @description Update employee (global) roles - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation - */ - export const canUseUpdateRoles = () => ["UpdateRoles", "Employee"] as AbilityTuple<"UpdateRoles", "Employee">; +/** + * Use for `useUpdateRoles` mutation ability. + * @description Update employee (global) roles + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation + */ +export const canUseUpdateRoles = ( +) => [ + "UpdateRoles", + "Employee" +] as AbilityTuple<"UpdateRoles", "Employee">; - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "Employee"] as AbilityTuple<"Archive", "Employee">; +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Employee" +] as AbilityTuple<"Archive", "Employee">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Unarchive", + "Employee" +] as AbilityTuple<"Unarchive", "Employee">; - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Unarchive", "Employee"] as AbilityTuple<"Unarchive", "Employee">; } diff --git a/test/generated/base/employee/employee.api.ts b/test/generated/base/employee/employee.api.ts index 8cb33e8..c0430ed 100644 --- a/test/generated/base/employee/employee.api.ts +++ b/test/generated/base/employee/employee.api.ts @@ -1,237 +1,147 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { EmployeeModels } from "./employee.models"; import { CommonModels } from "@/data/common/common.models"; export namespace EmployeeApi { - export const paginate = ( - limit: number, - order?: string, - populate?: EmployeeModels.EmployeePaginatePopulateParam, - filter?: EmployeeModels.EmployeeFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: EmployeeModels.EmployeePaginateResponseSchema }, `/employees`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { - type: "query", - name: "populate", - }), - filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: EmployeeModels.EmployeeCreateRequest, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeePaginateResponseSchema }, + `/employees`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: EmployeeModels.EmployeeCreateRequest, ) => { return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees`, - ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), - config, - ); - }; - - export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, config?: AxiosRequestConfig) => { + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees`, + ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), + + ) +}; +export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, ) => { return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/one-step`, - ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), - config, - ); - }; - - export const findAll = (search?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, `/employees/labels`, { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - }); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: EmployeeModels.EmployeeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/one-step`, + ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), + + ) +}; +export const findAll = (search?: string, ) => { return AppRestClient.get( - { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, - `/employees/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const resendOnboarding = (employeeId: string, config?: AxiosRequestConfig) => { + { resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, + `/employees/labels`, + { + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, + `/employees/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const resendOnboarding = (employeeId: string, ) => { return AppRestClient.post( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/employees/${employeeId}/resend-onboarding`, - undefined, - config, - ); - }; - - export const resendOnboardingWithOffice = (officeId: string, employeeId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/employees/${employeeId}/resend-onboarding`, + + ) +}; +export const resendOnboardingWithOffice = (officeId: string, employeeId: string, ) => { return AppRestClient.post( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, - undefined, - config, - ); - }; - - export const get = ( - employeeId: string, - populate?: EmployeeModels.EmployeeGetPopulateParam, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: EmployeeModels.EmployeeResponseSchema }, `/employees/${employeeId}`, { - ...config, - params: { - populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { - type: "query", - name: "populate", - }), - }, - }); - }; - - export const update = ( - employeeId: string, - data: EmployeeModels.EmployeeUpdateRequest, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, + + ) +}; +export const get = (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam, ) => { + return AppRestClient.get( + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}`, + { + params: { + populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + }, + } + ) +}; +export const update = (employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, ) => { return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}`, - ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - config, - ); - }; - - export const getWithOffice = ( - officeId: string, - employeeId: string, - populate?: EmployeeModels.GetWithOfficePopulateParam, - config?: AxiosRequestConfig, - ) => { + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}`, + ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), + + ) +}; +export const getWithOffice = (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam, ) => { return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/offices/${officeId}/employees/${employeeId}`, - { - ...config, - params: { - populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { - type: "query", - name: "populate", - }), - }, - }, - ); - }; - - export const updateWithOffice = ( - officeId: string, - employeeId: string, - data: EmployeeModels.EmployeeUpdateRequest, - config?: AxiosRequestConfig, - ) => { + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/offices/${officeId}/employees/${employeeId}`, + { + params: { + populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + }, + } + ) +}; +export const updateWithOffice = (officeId: string, employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, ) => { return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/offices/${officeId}/employees/${employeeId}`, - ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - config, - ); - }; - - export const listRoles = (employeeId: string, config?: AxiosRequestConfig) => { + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/offices/${officeId}/employees/${employeeId}`, + ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), + + ) +}; +export const listRoles = (employeeId: string, ) => { return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, - `/employees/${employeeId}/roles`, - config, - ); - }; - - export const updateRoles = ( - employeeId: string, - data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, - config?: AxiosRequestConfig, - ) => { + { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, + `/employees/${employeeId}/roles`, + + ) +}; +export const updateRoles = (employeeId: string, data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, ) => { return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, - `/employees/${employeeId}/roles`, - ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), - config, - ); - }; - - export const archive = (employeeId: string, config?: AxiosRequestConfig) => { + { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, + `/employees/${employeeId}/roles`, + ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), + + ) +}; +export const archive = (employeeId: string, ) => { return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (employeeId: string, config?: AxiosRequestConfig) => { + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}/archive`, + + ) +}; +export const unarchive = (employeeId: string, ) => { return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}/unarchive`, - undefined, - config, - ); - }; + { resSchema: EmployeeModels.EmployeeResponseSchema }, + `/employees/${employeeId}/unarchive`, + + ) +}; } diff --git a/test/generated/base/employee/employee.configs.ts b/test/generated/base/employee/employee.configs.ts index d2e574e..1288db2 100644 --- a/test/generated/base/employee/employee.configs.ts +++ b/test/generated/base/employee/employee.configs.ts @@ -6,129 +6,130 @@ import { EmployeeQueries } from "./employee.queries"; import { EmployeeAcl } from "./employee.acl"; export namespace EmployeeConfigs { - export const employeesConfig = { +export const employeesConfig = { meta: { - title: "Employees", + title: "Employees", }, readAll: { - acl: EmployeeAcl.canUsePaginate, - schema: EmployeeModels.EmployeeResponseSchema, - paginated: EmployeeQueries.usePaginate, - infinite: EmployeeQueries.usePaginateInfinite, - filters: { - schema: EmployeeModels.EmployeeFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeFilterDtoSchema, - options: { - inputs: { - office: true, - roles: true, - primaryOfficeId: true, - firstName: true, - lastName: true, - email: true, - ids: true, - archived: true, - search: true, - officeRole: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: EmployeeAcl.canUsePaginate, schema: EmployeeModels.EmployeeResponseSchema, - options: { - columns: { - id: true, - email: true, - firstName: true, - lastName: true, - locale: true, - phone: true, - archived: true, - primaryOfficeId: true, - primaryOffice: true, - employments: true, - roles: true, - createdAt: true, - updatedAt: true, - }, - sortable: EmployeeModels.EmployeePaginateOrderParamEnumSchema, + paginated: EmployeeQueries.usePaginate, + infinite: EmployeeQueries.usePaginateInfinite, + filters: { + schema: EmployeeModels.EmployeeFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeFilterDtoSchema, + options: { + inputs: { + office: true, + roles: true, + primaryOfficeId: true, + firstName: true, + lastName: true, + email: true, + ids: true, + archived: true, + search: true, + officeRole: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: EmployeeModels.EmployeeResponseSchema, + options: { + columns: { + id: true, + email: true, + firstName: true, + lastName: true, + locale: true, + phone: true, + archived: true, + primaryOfficeId: true, + primaryOffice: true, + employments: true, + roles: true, + createdAt: true, + updatedAt: true, + }, + sortable: EmployeeModels.EmployeePaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: EmployeeAcl.canUseGet, - schema: EmployeeModels.EmployeeResponseSchema, - query: EmployeeQueries.useGet, + acl: EmployeeAcl.canUseGet, + schema: EmployeeModels.EmployeeResponseSchema, + query: EmployeeQueries.useGet, }, create: { - acl: EmployeeAcl.canUseCreate, - schema: EmployeeModels.EmployeeCreateRequestSchema, - mutation: EmployeeQueries.useCreate, - inputDefs: dynamicInputs({ + acl: EmployeeAcl.canUseCreate, schema: EmployeeModels.EmployeeCreateRequestSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - locale: true, - primaryOfficeId: true, - phone: true, - }, - }, - }), + mutation: EmployeeQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeCreateRequestSchema, + options: { + inputs: { + firstName: true, + lastName: true, + email: true, + locale: true, + primaryOfficeId: true, + phone: true, + }, + }, +}) }, update: { - acl: EmployeeAcl.canUseUpdate, - schema: EmployeeModels.EmployeeUpdateRequestSchema, - mutation: EmployeeQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: EmployeeAcl.canUseUpdate, schema: EmployeeModels.EmployeeUpdateRequestSchema, - options: { - inputs: { - firstName: true, - lastName: true, - phone: true, - locale: true, - primaryOfficeId: true, - }, - }, - }), + mutation: EmployeeQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeUpdateRequestSchema, + options: { + inputs: { + firstName: true, + lastName: true, + phone: true, + locale: true, + primaryOfficeId: true, + }, + }, +}) }, - }; +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: EmployeeAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: EmployeeQueries.usePaginateLabels, - infinite: EmployeeQueries.usePaginateLabelsInfinite, - filters: { - schema: EmployeeModels.EmployeeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: EmployeeAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema, + paginated: EmployeeQueries.usePaginateLabels, + infinite: EmployeeQueries.usePaginateLabelsInfinite, + filters: { + schema: EmployeeModels.EmployeeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeModels.EmployeeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/employee/employee.models.ts b/test/generated/base/employee/employee.models.ts index 6aa71fa..7e5c67a 100644 --- a/test/generated/base/employee/employee.models.ts +++ b/test/generated/base/employee/employee.models.ts @@ -2,324 +2,224 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace EmployeeModels { - /** - * EmployeeResponseSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { CommonModels.LocaleEnum } locale - * @property { string } phone Phone number - * @property { boolean } archived Archived - * @property { string } primaryOfficeId Primary office id - * @property { CommonModels.EmployeeOfficeResponse } primaryOffice Primary office - * @property { CommonModels.EmploymentResponse[] } employments Employments - * @property { CommonModels.EmployeeRoleResponse[] } roles Global Roles - * @property { string } createdAt - * @property { string } updatedAt - */ - export const EmployeeResponseSchema = z - .object({ - id: z.string().describe("Employee ID"), - email: z.email().describe("Email"), - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - locale: CommonModels.LocaleEnumSchema.nullish(), - phone: z.string().describe("Phone number").nullish(), - archived: z.boolean().describe("Archived").nullish(), - primaryOfficeId: z.string().describe("Primary office id").nullish(), - primaryOffice: CommonModels.EmployeeOfficeResponseSchema.describe("Primary office").nullish(), - employments: z.array(CommonModels.EmploymentResponseSchema).readonly().describe("Employments").nullish(), - roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type EmployeeResponse = z.infer; +/** + * EmployeeResponseSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { CommonModels.LocaleEnum } locale + * @property { string } phone Phone number + * @property { boolean } archived Archived + * @property { string } primaryOfficeId Primary office id + * @property { CommonModels.EmployeeOfficeResponse } primaryOffice Primary office + * @property { CommonModels.EmploymentResponse[] } employments Employments + * @property { CommonModels.EmployeeRoleResponse[] } roles Global Roles + * @property { string } createdAt + * @property { string } updatedAt + */ +export const EmployeeResponseSchema = z.object({ id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), locale: CommonModels.LocaleEnumSchema.nullish(), phone: z.string().nullish(), archived: z.boolean().nullish(), primaryOfficeId: z.string().nullish(), primaryOffice: CommonModels.EmployeeOfficeResponseSchema.nullish(), employments: z.array(CommonModels.EmploymentResponseSchema).nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }); +export type EmployeeResponse = z.infer; + +/** + * EmployeeCreateRequestSchema + * @type { object } + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { CommonModels.LocaleEnum } locale + * @property { string } primaryOfficeId Primary office ID + * @property { string } phone Phone number + */ +export const EmployeeCreateRequestSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.email(), locale: CommonModels.LocaleEnumSchema.nullish(), primaryOfficeId: z.string().nullish(), phone: z.string().nullish() }); +export type EmployeeCreateRequest = z.infer; + +/** + * EmployeeOneStepCreateEmploymentRequestSchema + * @type { object } + * @property { string } officeId + * @property { string[] } roleIds Array of office role IDs + */ +export const EmployeeOneStepCreateEmploymentRequestSchema = z.object({ officeId: z.string(), roleIds: z.array(z.string()).nullish() }); +export type EmployeeOneStepCreateEmploymentRequest = z.infer; + +/** + * EmployeeOneStepCreateRequestSchema + * @type { object } + * @property { CommonModels.LocaleEnum } locale + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { string } phone Phone number + * @property { string[] } roleIds Array of global role IDs + * @property { string } primaryOfficeId Primary office ID + * @property { EmployeeOneStepCreateEmploymentRequest[] } employments Employments. Min Items: `1` + */ +export const EmployeeOneStepCreateRequestSchema = z.object({ locale: CommonModels.LocaleEnumSchema.nullish(), firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string().nullish(), roleIds: z.array(z.string()).nullish(), primaryOfficeId: z.string().nullish(), employments: z.array(EmployeeOneStepCreateEmploymentRequestSchema).min(1) }); +export type EmployeeOneStepCreateRequest = z.infer; + +/** + * EmployeeUpdateRequestSchema + * @type { object } + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number of the employee + * @property { CommonModels.LocaleEnum } locale + * @property { string } primaryOfficeId + */ +export const EmployeeUpdateRequestSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), phone: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullable(), primaryOfficeId: z.string().nullable() }).partial(); +export type EmployeeUpdateRequest = z.infer; + +/** + * EmployeeFilterDtoSchema + * @type { object } + * @property { string } office Office ID (single select, offices the user has access to) + * @property { string[] } roles Role IDs (multiselect) + * @property { string } primaryOfficeId Primary office id + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } email Email + * @property { string[] } ids Ids + * @property { boolean } archived Archived + * set to true to only return archived employees + * does not return archived employees by default. Default: `false` + * @property { string } search Free text search multiple fields + * @property { string } officeRole Office role + */ +export const EmployeeFilterDtoSchema = z.object({ office: z.string().nullable(), roles: z.array(z.string()).nullable(), primaryOfficeId: z.string().nullable(), firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), ids: z.array(z.string()).nullable(), archived: z.boolean().nullable().default(false), search: z.string().nullable(), officeRole: z.string().nullable() }).partial(); +export type EmployeeFilterDto = z.infer; + +/** + * EmployeeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type EmployeeLabelFilterDto = z.infer; + +/** + * EmployeeRoleMemberResponseSchema + * @type { object } + * @property { string } roleId + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string[] } permissions Permissions associated with the role + */ +export const EmployeeRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), permissions: z.array(z.string()) }); +export type EmployeeRoleMemberResponse = z.infer; + +/** + * EmployeeRoleMembershipsUpdateRequestSchema + * @type { object } + * @property { string[] } roleIds Array of role IDs + */ +export const EmployeeRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()) }); +export type EmployeeRoleMembershipsUpdateRequest = z.infer; + +/** + * EmployeePaginateOrderParamEnumSchema + * @type { enum } + */ +export const EmployeePaginateOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); +export type EmployeePaginateOrderParamEnum = z.infer; +export const EmployeePaginateOrderParamEnum = EmployeePaginateOrderParamEnumSchema.enum; + +/** + * EmployeePopulateFieldSchema + * @type { enum } + */ +export const EmployeePopulateFieldSchema = z.enum(["employments", "primaryOffice", "roles", "employments.roles", "employments.office"]); +export type EmployeePopulateField = z.infer; +export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; + +/** + * EmployeePaginatePopulateParamSchema + * @type { array } + */ +export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); +export type EmployeePaginatePopulateParam = z.infer; + +/** + * EmployeePaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeResponse[] } items + */ +export const EmployeePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeResponseSchema).nullable() }).partial().shape }); +export type EmployeePaginateResponse = z.infer; + +/** + * EmployeeFindAllResponseSchema + * @type { array } + */ +export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); +export type EmployeeFindAllResponse = z.infer; + +/** + * EmployeePaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const EmployeePaginateLabelsOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); +export type EmployeePaginateLabelsOrderParamEnum = z.infer; +export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderParamEnumSchema.enum; + +/** + * EmployeePaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const EmployeePaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type EmployeePaginateLabelsResponse = z.infer; + +/** + * EmployeeGetPopulateParamSchema + * @type { array } + */ +export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); +export type EmployeeGetPopulateParam = z.infer; + +/** + * GetWithOfficePopulateParamSchema + * @type { array } + */ +export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); +export type GetWithOfficePopulateParam = z.infer; + +/** + * EmployeeListRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleMemberResponse[] } items + */ +export const EmployeeListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).nullable() }).partial().shape }); +export type EmployeeListRolesResponse = z.infer; + +/** + * EmployeeUpdateRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleMemberResponse[] } items + */ +export const EmployeeUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).nullable() }).partial().shape }); +export type EmployeeUpdateRolesResponse = z.infer; - /** - * EmployeeCreateRequestSchema - * @type { object } - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { CommonModels.LocaleEnum } locale - * @property { string } primaryOfficeId Primary office ID - * @property { string } phone Phone number - */ - export const EmployeeCreateRequestSchema = z - .object({ - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - email: z.email().describe("Email"), - locale: CommonModels.LocaleEnumSchema.nullish(), - primaryOfficeId: z.string().describe("Primary office ID").nullish(), - phone: z.string().describe("Phone number").nullish(), - }) - .readonly(); - export type EmployeeCreateRequest = z.infer; - - /** - * EmployeeOneStepCreateEmploymentRequestSchema - * @type { object } - * @property { string } officeId - * @property { string[] } roleIds Array of office role IDs - */ - export const EmployeeOneStepCreateEmploymentRequestSchema = z - .object({ - officeId: z.string(), - roleIds: z.array(z.string()).readonly().describe("Array of office role IDs").nullish(), - }) - .readonly(); - export type EmployeeOneStepCreateEmploymentRequest = z.infer; - - /** - * EmployeeOneStepCreateRequestSchema - * @type { object } - * @property { CommonModels.LocaleEnum } locale - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { string } phone Phone number - * @property { string[] } roleIds Array of global role IDs - * @property { string } primaryOfficeId Primary office ID - * @property { EmployeeOneStepCreateEmploymentRequest[] } employments Employments. Min Items: `1` - */ - export const EmployeeOneStepCreateRequestSchema = z - .object({ - locale: CommonModels.LocaleEnumSchema.nullish(), - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - email: z.email().describe("Email"), - phone: z.string().describe("Phone number").nullish(), - roleIds: z.array(z.string()).readonly().describe("Array of global role IDs").nullish(), - primaryOfficeId: z.string().describe("Primary office ID").nullish(), - employments: z.array(EmployeeOneStepCreateEmploymentRequestSchema).readonly().min(1).describe("Employments"), - }) - .readonly(); - export type EmployeeOneStepCreateRequest = z.infer; - - /** - * EmployeeUpdateRequestSchema - * @type { object } - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number of the employee - * @property { CommonModels.LocaleEnum } locale - * @property { string } primaryOfficeId - */ - export const EmployeeUpdateRequestSchema = z - .object({ - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - phone: z.string().describe("Phone number of the employee"), - locale: CommonModels.LocaleEnumSchema, - primaryOfficeId: z.string(), - }) - .readonly(); - export type EmployeeUpdateRequest = z.infer; - - /** - * EmployeeFilterDtoSchema - * @type { object } - * @property { string } office Office ID (single select, offices the user has access to) - * @property { string[] } roles Role IDs (multiselect) - * @property { string } primaryOfficeId Primary office id - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { string[] } ids Ids - * @property { boolean } archived Archived - * set to true to only return archived employees - * does not return archived employees by default. Default: `false` - * @property { string } search Free text search multiple fields - * @property { string } officeRole Office role - */ - export const EmployeeFilterDtoSchema = z - .object({ - office: z.string().describe("Office ID (single select, offices the user has access to)"), - roles: z.array(z.string()).readonly().describe("Role IDs (multiselect)"), - primaryOfficeId: z.string().describe("Primary office id"), - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - email: z.string().describe("Email"), - ids: z.array(z.string()).readonly().describe("Ids"), - archived: z - .boolean() - .describe(`Archived - set to true to only return archived employees - does not return archived employees by default`) - .default(false), - search: z.string().describe("Free text search multiple fields"), - officeRole: z.string().describe("Office role"), - }) - .readonly(); - export type EmployeeFilterDto = z.infer; - - /** - * EmployeeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type EmployeeLabelFilterDto = z.infer; - - /** - * EmployeeRoleMemberResponseSchema - * @type { object } - * @property { string } roleId - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string[] } permissions Permissions associated with the role - */ - export const EmployeeRoleMemberResponseSchema = z - .object({ - roleId: z.string(), - name: z.string().describe("Name of the role"), - color: z.string().describe("Color associated with the role").nullish(), - description: z.string().describe("Description of the role").nullish(), - permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), - }) - .readonly(); - export type EmployeeRoleMemberResponse = z.infer; - - /** - * EmployeeRoleMembershipsUpdateRequestSchema - * @type { object } - * @property { string[] } roleIds Array of role IDs - */ - export const EmployeeRoleMembershipsUpdateRequestSchema = z - .object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }) - .readonly(); - export type EmployeeRoleMembershipsUpdateRequest = z.infer; - - /** - * EmployeePaginateOrderParamEnumSchema - * @type { enum } - */ - export const EmployeePaginateOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); - export type EmployeePaginateOrderParamEnum = z.infer; - export const EmployeePaginateOrderParamEnum = EmployeePaginateOrderParamEnumSchema.enum; - - /** - * EmployeePopulateFieldSchema - * @type { enum } - */ - export const EmployeePopulateFieldSchema = z.enum([ - "employments", - "primaryOffice", - "roles", - "employments.roles", - "employments.office", - ]); - export type EmployeePopulateField = z.infer; - export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; - - /** - * EmployeePaginatePopulateParamSchema - * @type { array } - */ - export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); - export type EmployeePaginatePopulateParam = z.infer; - - /** - * EmployeePaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeResponse[] } items - */ - export const EmployeePaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeeResponseSchema).readonly() }).readonly().shape, - }); - export type EmployeePaginateResponse = z.infer; - - /** - * EmployeeFindAllResponseSchema - * @type { array } - */ - export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type EmployeeFindAllResponse = z.infer; - - /** - * EmployeePaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const EmployeePaginateLabelsOrderParamEnumSchema = z.enum([ - "firstName", - "lastName", - "email", - "name", - "createdAt", - ]); - export type EmployeePaginateLabelsOrderParamEnum = z.infer; - export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderParamEnumSchema.enum; - - /** - * EmployeePaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const EmployeePaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type EmployeePaginateLabelsResponse = z.infer; - - /** - * EmployeeGetPopulateParamSchema - * @type { array } - */ - export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); - export type EmployeeGetPopulateParam = z.infer; - - /** - * GetWithOfficePopulateParamSchema - * @type { array } - */ - export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); - export type GetWithOfficePopulateParam = z.infer; - - /** - * EmployeeListRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleMemberResponse[] } items - */ - export const EmployeeListRolesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape, - }); - export type EmployeeListRolesResponse = z.infer; - - /** - * EmployeeUpdateRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleMemberResponse[] } items - */ - export const EmployeeUpdateRolesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape, - }); - export type EmployeeUpdateRolesResponse = z.infer; } diff --git a/test/generated/base/employee/employee.queries.ts b/test/generated/base/employee/employee.queries.ts index ab095fe..4d934bc 100644 --- a/test/generated/base/employee/employee.queries.ts +++ b/test/generated/base/employee/employee.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,618 +8,462 @@ import { EmployeeModels } from "./employee.models"; import { EmployeeApi } from "./employee.api"; export namespace EmployeeQueries { - export const moduleName = QueryModule.Employee; +export const moduleName = QueryModule.Employee; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - populate?: EmployeeModels.EmployeePaginatePopulateParam, - filter?: EmployeeModels.EmployeeFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/employees", limit, order, populate, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - populate?: EmployeeModels.EmployeePaginatePopulateParam, - filter?: EmployeeModels.EmployeeFilterDto, - cursor?: string, - ) => [...keys.all, "/employees", "infinite", limit, order, populate, filter, cursor] as const, + paginate: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees", limit, order, populate, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string) => [...keys.all, "/employees", "infinite", limit, order, populate, filter, cursor] as const, findAll: (search?: string) => [...keys.all, "/employees/labels", search] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: EmployeeModels.EmployeeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/employees/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: EmployeeModels.EmployeeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/employees/labels/paginate", "infinite", limit, order, filter, cursor] as const, - get: (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam) => - [...keys.all, "/employees/:employeeId", employeeId, populate] as const, - getWithOffice: (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam) => - [...keys.all, "/offices/:officeId/employees/:employeeId", officeId, employeeId, populate] as const, + paginateLabels: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string) => [...keys.all, "/employees/labels/paginate", "infinite", limit, order, filter, cursor] as const, + get: (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam) => [...keys.all, "/employees/:employeeId", employeeId, populate] as const, + getWithOffice: (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam) => [...keys.all, "/offices/:officeId/employees/:employeeId", officeId, employeeId, populate] as const, listRoles: (employeeId: string) => [...keys.all, "/employees/:employeeId/roles", employeeId] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Employees - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter - * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - populate, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - populate?: EmployeeModels.EmployeePaginatePopulateParam; - filter?: EmployeeModels.EmployeeFilterDto; - page?: number; - cursor?: string; +}; + +/** + * Query `usePaginate` + * @summary Paginate Employees + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter + * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, populate, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeAcl.canUsePaginate()); + return EmployeeApi.paginate(limit, order, populate, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Employees + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter + * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeAcl.canUsePaginate()); + return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, populate, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Employees - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter - * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - populate, - filter, - cursor, - }: { - limit: number; - order?: string; - populate?: EmployeeModels.EmployeePaginatePopulateParam; - filter?: EmployeeModels.EmployeeFilterDto; - cursor?: string; + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create Employee + * @permission Requires `canUseCreate` ability + * @param { EmployeeModels.EmployeeCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmployeeAcl.canUseCreate()); + return EmployeeApi.create(data) }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create Employee - * @permission Requires `canUseCreate` ability - * @param { EmployeeModels.EmployeeCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmployeeAcl.canUseCreate()); - return EmployeeApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useSingeStepCreate` - * @summary Create Employee in a single step - * - requires Employee:Create for creating a global employee - * - requires Employee:Create{officeId} for creating an office employee (first office is primary) - * - requires Employment:Create{officeId} for creating office employments - * - requires Employee:UpdateRoles for setting global roles - * - requires Employee:UpdateRoles{officeId} for setting office roles - * @param { EmployeeModels.EmployeeOneStepCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useSingeStepCreate = ( - options?: AppMutationOptions< - typeof EmployeeApi.singeStepCreate, - { data: EmployeeModels.EmployeeOneStepCreateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => EmployeeApi.singeStepCreate(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindAll` - * @summary List all employees with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { search }: { search?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search), - queryFn: () => { - checkAcl(EmployeeAcl.canUseFindAll()); - return EmployeeApi.findAll(search, config); - }, - ...options, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate employees with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: EmployeeModels.EmployeeLabelFilterDto; - page?: number; - cursor?: string; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate employees with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: EmployeeModels.EmployeeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useResendOnboarding` - * @summary Resend Employee Onboarding Email - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useResendOnboarding = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => EmployeeApi.resendOnboarding(employeeId, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useResendOnboardingWithOffice` - * @permission Requires `canUseResendOnboardingWithOffice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useResendOnboardingWithOffice = ( - options?: AppMutationOptions< - typeof EmployeeApi.resendOnboardingWithOffice, - { officeId: string; employeeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employeeId }) => { - checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId })); - return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGet` - * @summary Get Employee - * - allow global admins and office admins of primary office - * @permission Requires `canUseGet` ability - * @param { string } object.employeeId Path parameter - * @param { EmployeeModels.EmployeeGetPopulateParam } object.populate Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { employeeId, populate }: { employeeId: string; populate?: EmployeeModels.EmployeeGetPopulateParam }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(employeeId, populate), - queryFn: () => { - checkAcl(EmployeeAcl.canUseGet()); - return EmployeeApi.get(employeeId, populate, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update Employee - * - allow global admins and office admins of primary office - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof EmployeeApi.update, - { employeeId: string; data: EmployeeModels.EmployeeUpdateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdate()); - return EmployeeApi.update(employeeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetWithOffice` - * @permission Requires `canUseGetWithOffice` ability - * @param { string } object.officeId Path parameter - * @param { string } object.employeeId Path parameter - * @param { EmployeeModels.GetWithOfficePopulateParam } object.populate Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetWithOffice = ( - { - officeId, - employeeId, - populate, - }: { officeId: string; employeeId: string; populate?: EmployeeModels.GetWithOfficePopulateParam }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getWithOffice(officeId, employeeId, populate), - queryFn: () => { - checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId })); - return EmployeeApi.getWithOffice(officeId, employeeId, populate, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateWithOffice` - * @permission Requires `canUseUpdateWithOffice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateWithOffice = ( - options?: AppMutationOptions< - typeof EmployeeApi.updateWithOffice, - { officeId: string; employeeId: string; data: EmployeeModels.EmployeeUpdateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId })); - return EmployeeApi.updateWithOffice(officeId, employeeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, employeeId } = variables; - const updateKeys = [keys.get(employeeId), keys.getWithOffice(officeId, employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useListRoles` - * @summary List Employee (global) Roles - * @permission Requires `canUseListRoles` ability - * @param { string } object.employeeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListRoles = ( - { employeeId }: { employeeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoles(employeeId), - queryFn: () => { - checkAcl(EmployeeAcl.canUseListRoles()); - return EmployeeApi.listRoles(employeeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateRoles` - * @summary Update Employee (global) Roles - * @permission Requires `canUseUpdateRoles` ability - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeRoleMembershipsUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateRoles = ( - options?: AppMutationOptions< - typeof EmployeeApi.updateRoles, - { employeeId: string; data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdateRoles()); - return EmployeeApi.updateRoles(employeeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive Employee - * @permission Requires `canUseArchive` ability - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => { - checkAcl(EmployeeAcl.canUseArchive()); - return EmployeeApi.archive(employeeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Un-archive Employee - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + }); +}; + +/** + * Mutation `useSingeStepCreate` + * @summary Create Employee in a single step + * - requires Employee:Create for creating a global employee + * - requires Employee:Create{officeId} for creating an office employee (first office is primary) + * - requires Employment:Create{officeId} for creating office employments + * - requires Employee:UpdateRoles for setting global roles + * - requires Employee:UpdateRoles{officeId} for setting office roles + * @param { EmployeeModels.EmployeeOneStepCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useSingeStepCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + EmployeeApi.singeStepCreate(data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindAll` + * @summary List all employees with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search), + queryFn: () => { + checkAcl(EmployeeAcl.canUseFindAll()); + return EmployeeApi.findAll(search) }, + ...options, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate employees with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeAcl.canUsePaginateLabels()); + return EmployeeApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate employees with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` + * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeAcl.canUsePaginateLabels()); + return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useResendOnboarding` + * @summary Resend Employee Onboarding Email + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useResendOnboarding = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => + EmployeeApi.resendOnboarding(employeeId) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useResendOnboardingWithOffice` + * @permission Requires `canUseResendOnboardingWithOffice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useResendOnboardingWithOffice = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employeeId }) => { + checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId } )); + return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGet` + * @summary Get Employee + * - allow global admins and office admins of primary office + * @permission Requires `canUseGet` ability + * @param { string } object.employeeId Path parameter + * @param { EmployeeModels.EmployeeGetPopulateParam } object.populate Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ employeeId, populate }: { employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(employeeId, populate), + queryFn: () => { + checkAcl(EmployeeAcl.canUseGet()); + return EmployeeApi.get(employeeId, populate) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update Employee + * - allow global admins and office admins of primary office + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdate()); + return EmployeeApi.update(employeeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetWithOffice` + * @permission Requires `canUseGetWithOffice` ability + * @param { string } object.officeId Path parameter + * @param { string } object.employeeId Path parameter + * @param { EmployeeModels.GetWithOfficePopulateParam } object.populate Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetWithOffice = ({ officeId, employeeId, populate }: { officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getWithOffice(officeId, employeeId, populate), + queryFn: () => { + checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId } )); + return EmployeeApi.getWithOffice(officeId, employeeId, populate) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateWithOffice` + * @permission Requires `canUseUpdateWithOffice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateWithOffice = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId } )); + return EmployeeApi.updateWithOffice(officeId, employeeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, employeeId } = variables; + const updateKeys = [keys.get(employeeId), keys.getWithOffice(officeId, employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListRoles` + * @summary List Employee (global) Roles + * @permission Requires `canUseListRoles` ability + * @param { string } object.employeeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoles = ({ employeeId }: { employeeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoles(employeeId), + queryFn: () => { + checkAcl(EmployeeAcl.canUseListRoles()); + return EmployeeApi.listRoles(employeeId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateRoles` + * @summary Update Employee (global) Roles + * @permission Requires `canUseUpdateRoles` ability + * @param { string } mutation.employeeId Path parameter + * @param { EmployeeModels.EmployeeRoleMembershipsUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId, data }) => { + checkAcl(EmployeeAcl.canUseUpdateRoles()); + return EmployeeApi.updateRoles(employeeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Employee + * @permission Requires `canUseArchive` ability + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => { + checkAcl(EmployeeAcl.canUseArchive()); + return EmployeeApi.archive(employeeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Un-archive Employee + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.employeeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ employeeId }) => { + checkAcl(EmployeeAcl.canUseUnarchive()); + return EmployeeApi.unarchive(employeeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { employeeId } = variables; + const updateKeys = [keys.get(employeeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ employeeId }) => { - checkAcl(EmployeeAcl.canUseUnarchive()); - return EmployeeApi.unarchive(employeeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/employeeAccount/employeeAccount.api.ts b/test/generated/base/employeeAccount/employeeAccount.api.ts index e4fa223..22e4d03 100644 --- a/test/generated/base/employeeAccount/employeeAccount.api.ts +++ b/test/generated/base/employeeAccount/employeeAccount.api.ts @@ -1,13 +1,12 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { EmployeeAccountModels } from "./employeeAccount.models"; export namespace EmployeeAccountApi { - export const get = (config?: AxiosRequestConfig) => { +export const get = () => { return AppRestClient.get( - { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, - `/employees/account`, - config, - ); - }; + { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, + `/employees/account`, + + ) +}; } diff --git a/test/generated/base/employeeAccount/employeeAccount.models.ts b/test/generated/base/employeeAccount/employeeAccount.models.ts index bedbc9f..8f21c37 100644 --- a/test/generated/base/employeeAccount/employeeAccount.models.ts +++ b/test/generated/base/employeeAccount/employeeAccount.models.ts @@ -2,85 +2,52 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace EmployeeAccountModels { - /** - * EmployeeAccountEmploymentDtoSchema - * @type { object } - * @property { string } officeId Office ID - * @property { string } officeName Office name - */ - export const EmployeeAccountEmploymentDtoSchema = z - .object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }) - .readonly(); - export type EmployeeAccountEmploymentDto = z.infer; +/** + * EmployeeAccountEmploymentDtoSchema + * @type { object } + * @property { string } officeId Office ID + * @property { string } officeName Office name + */ +export const EmployeeAccountEmploymentDtoSchema = z.object({ officeId: z.string(), officeName: z.string() }); +export type EmployeeAccountEmploymentDto = z.infer; - /** - * EmployeeAccountPrimaryOfficeDtoSchema - * @type { object } - * @property { string } officeId Office ID - * @property { string } officeName Office name - */ - export const EmployeeAccountPrimaryOfficeDtoSchema = z - .object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }) - .readonly(); - export type EmployeeAccountPrimaryOfficeDto = z.infer; +/** + * EmployeeAccountPrimaryOfficeDtoSchema + * @type { object } + * @property { string } officeId Office ID + * @property { string } officeName Office name + */ +export const EmployeeAccountPrimaryOfficeDtoSchema = z.object({ officeId: z.string(), officeName: z.string() }); +export type EmployeeAccountPrimaryOfficeDto = z.infer; - /** - * EmployeeAccountRoleDtoSchema - * @type { object } - * @property { string } name Role name - * @property { string[] } permissions Role permissions - * @property { string } officeId Office ID - */ - export const EmployeeAccountRoleDtoSchema = z - .object({ - name: z.string().describe("Role name"), - permissions: z.array(z.string()).readonly().describe("Role permissions"), - officeId: z.string().describe("Office ID").nullish(), - }) - .readonly(); - export type EmployeeAccountRoleDto = z.infer; +/** + * EmployeeAccountRoleDtoSchema + * @type { object } + * @property { string } name Role name + * @property { string[] } permissions Role permissions + * @property { string } officeId Office ID + */ +export const EmployeeAccountRoleDtoSchema = z.object({ name: z.string(), permissions: z.array(z.string()), officeId: z.string().nullish() }); +export type EmployeeAccountRoleDto = z.infer; + +/** + * EmployeeAccountDtoSchema + * @type { object } + * @property { string } defaultUrl + * @property { string } costCenter + * @property { CommonModels.LocaleEnum } locale + * @property { array[] } aclRules Can hold any type of value + * @property { object } settings Employee settings keyed by setting name + * @property { string } id Employee ID + * @property { string } email Email + * @property { string } firstName First name + * @property { string } lastName Last name + * @property { string } phone Phone number + * @property { EmployeeAccountEmploymentDto[] } employments Employments + * @property { EmployeeAccountPrimaryOfficeDto } primaryOffice Primary office + * @property { EmployeeAccountRoleDto[] } roles Roles + */ +export const EmployeeAccountDtoSchema = z.object({ defaultUrl: z.string().nullish(), costCenter: z.string().nullish(), locale: CommonModels.LocaleEnumSchema.nullish(), aclRules: z.array(z.array(z.any())), settings: z.union([z.object({}).catchall(z.any()), z.array(z.object({}).catchall(z.any())), z.string(), z.array(z.string()), z.array(z.number())]), id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), phone: z.string().nullish(), employments: z.array(EmployeeAccountEmploymentDtoSchema), primaryOffice: EmployeeAccountPrimaryOfficeDtoSchema, roles: z.array(EmployeeAccountRoleDtoSchema) }); +export type EmployeeAccountDto = z.infer; - /** - * EmployeeAccountDtoSchema - * @type { object } - * @property { string } defaultUrl - * @property { string } costCenter - * @property { CommonModels.LocaleEnum } locale - * @property { array[] } aclRules Can hold any type of value - * @property { object } settings Employee settings keyed by setting name - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { EmployeeAccountEmploymentDto[] } employments Employments - * @property { EmployeeAccountPrimaryOfficeDto } primaryOffice Primary office - * @property { EmployeeAccountRoleDto[] } roles Roles - */ - export const EmployeeAccountDtoSchema = z - .object({ - defaultUrl: z.string().nullish(), - costCenter: z.string().nullish(), - locale: CommonModels.LocaleEnumSchema.nullish(), - aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), - settings: z - .union([ - z.object({}).catchall(z.any()).readonly(), - z.array(z.object({}).catchall(z.any()).readonly()).readonly(), - z.string(), - z.array(z.string()).readonly(), - z.array(z.number()).readonly(), - ]) - .describe("Employee settings keyed by setting name"), - id: z.string().describe("Employee ID"), - email: z.email().describe("Email"), - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - phone: z.string().describe("Phone number").nullish(), - employments: z.array(EmployeeAccountEmploymentDtoSchema).readonly().describe("Employments"), - primaryOffice: EmployeeAccountPrimaryOfficeDtoSchema.describe("Primary office"), - roles: z.array(EmployeeAccountRoleDtoSchema).readonly().describe("Roles"), - }) - .readonly(); - export type EmployeeAccountDto = z.infer; } diff --git a/test/generated/base/employeeAccount/employeeAccount.queries.ts b/test/generated/base/employeeAccount/employeeAccount.queries.ts index becd6e1..ad8f854 100644 --- a/test/generated/base/employeeAccount/employeeAccount.queries.ts +++ b/test/generated/base/employeeAccount/employeeAccount.queries.ts @@ -1,32 +1,30 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions } from "@povio/openapi-codegen-cli"; import { EmployeeAccountApi } from "./employeeAccount.api"; export namespace EmployeeAccountQueries { - export const moduleName = QueryModule.EmployeeAccount; +export const moduleName = QueryModule.EmployeeAccount; - export const keys = { +export const keys = { all: [moduleName] as const, - get: () => [...keys.all, "/employees/account"] as const, - }; + get: () => [...keys.all, "/employees/account", ] as const, +}; + +/** + * Query `useGet` + * @summary Get profile of logged-in user + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = (options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.get(), + queryFn: EmployeeAccountApi.get, + ...options, + }); +}; - /** - * Query `useGet` - * @summary Get profile of logged-in user - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.get(), - queryFn: () => EmployeeAccountApi.get(config), - ...options, - }); - }; } diff --git a/test/generated/base/employeePermissions/employeePermissions.acl.ts b/test/generated/base/employeePermissions/employeePermissions.acl.ts index fb09450..25d65ad 100644 --- a/test/generated/base/employeePermissions/employeePermissions.acl.ts +++ b/test/generated/base/employeePermissions/employeePermissions.acl.ts @@ -1,15 +1,24 @@ import { AbilityTuple } from "@casl/ability"; export namespace EmployeePermissionsAcl { - /** - * Use for `usePaginatePermissions` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query - */ - export const canUsePaginatePermissions = () => ["Read", "Permission"] as AbilityTuple<"Read", "Permission">; +/** + * Use for `usePaginatePermissions` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query + */ +export const canUsePaginatePermissions = ( +) => [ + "Read", + "Permission" +] as AbilityTuple<"Read", "Permission">; + +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Permission" +] as AbilityTuple<"Read", "Permission">; - /** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = () => ["Read", "Permission"] as AbilityTuple<"Read", "Permission">; } diff --git a/test/generated/base/employeePermissions/employeePermissions.api.ts b/test/generated/base/employeePermissions/employeePermissions.api.ts index 1a4e180..d5bad68 100644 --- a/test/generated/base/employeePermissions/employeePermissions.api.ts +++ b/test/generated/base/employeePermissions/employeePermissions.api.ts @@ -1,62 +1,33 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { EmployeePermissionsModels } from "./employeePermissions.models"; export namespace EmployeePermissionsApi { - export const paginatePermissions = ( - limit: number, - order?: string, - filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginatePermissions = (limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, - `/employees/permissions`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findAll = (search?: string, config?: AxiosRequestConfig) => { + { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, + `/employees/permissions`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findAll = (search?: string, ) => { return AppRestClient.get( - { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, - `/employees/permissions/labels`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - }, - ); - }; + { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, + `/employees/permissions/labels`, + { + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; } diff --git a/test/generated/base/employeePermissions/employeePermissions.configs.ts b/test/generated/base/employeePermissions/employeePermissions.configs.ts index 7b89c81..50dd5bf 100644 --- a/test/generated/base/employeePermissions/employeePermissions.configs.ts +++ b/test/generated/base/employeePermissions/employeePermissions.configs.ts @@ -5,40 +5,41 @@ import { EmployeePermissionsQueries } from "./employeePermissions.queries"; import { EmployeePermissionsAcl } from "./employeePermissions.acl"; export namespace EmployeePermissionsConfigs { - export const permissionsConfig = { +export const permissionsConfig = { meta: { - title: "Permissions", + title: "Permissions", }, readAll: { - acl: EmployeePermissionsAcl.canUsePaginatePermissions, - schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, - paginated: EmployeePermissionsQueries.usePaginatePermissions, - infinite: EmployeePermissionsQueries.usePaginatePermissionsInfinite, - filters: { - schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, - options: { - inputs: { - context: true, - ids: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: EmployeePermissionsAcl.canUsePaginatePermissions, schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, - options: { - columns: { - id: true, - label: true, - group: true, - description: true, - context: true, - }, - sortable: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, + paginated: EmployeePermissionsQueries.usePaginatePermissions, + infinite: EmployeePermissionsQueries.usePaginatePermissionsInfinite, + filters: { + schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, + options: { + inputs: { + context: true, + ids: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, + options: { + columns: { + id: true, + label: true, + group: true, + description: true, + context: true, + }, + sortable: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, + }, +}), }, - }; +}; + } diff --git a/test/generated/base/employeePermissions/employeePermissions.models.ts b/test/generated/base/employeePermissions/employeePermissions.models.ts index 08a273a..701c149 100644 --- a/test/generated/base/employeePermissions/employeePermissions.models.ts +++ b/test/generated/base/employeePermissions/employeePermissions.models.ts @@ -2,73 +2,53 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace EmployeePermissionsModels { - /** - * EmployeePermissionResponseSchema - * @type { object } - * @property { string } id Employee Permission unique identifier - * @property { string } label - * @property { string } group - * @property { string } description - * @property { string } context Scope where this rule is applied - */ - export const EmployeePermissionResponseSchema = z - .object({ - id: z.string().describe("Employee Permission unique identifier"), - label: z.string(), - group: z.string(), - description: z.string().nullish(), - context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), - }) - .readonly(); - export type EmployeePermissionResponse = z.infer; +/** + * EmployeePermissionResponseSchema + * @type { object } + * @property { string } id Employee Permission unique identifier + * @property { string } label + * @property { string } group + * @property { string } description + * @property { string } context Scope where this rule is applied + */ +export const EmployeePermissionResponseSchema = z.object({ id: z.string(), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema }); +export type EmployeePermissionResponse = z.infer; - /** - * EmployeePermissionFilterDtoSchema - * @type { object } - * @property { string } context Role context - * @property { string[] } ids Ids - */ - export const EmployeePermissionFilterDtoSchema = z - .object({ - context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), - ids: z.array(z.string()).readonly().describe("Ids"), - }) - .readonly(); - export type EmployeePermissionFilterDto = z.infer; +/** + * EmployeePermissionFilterDtoSchema + * @type { object } + * @property { string } context Role context + * @property { string[] } ids Ids + */ +export const EmployeePermissionFilterDtoSchema = z.object({ context: CommonModels.EmployeeRoleContextSchema.nullable(), ids: z.array(z.string()).nullable() }).partial(); +export type EmployeePermissionFilterDto = z.infer; - /** - * EmployeePermissionsPaginatePermissionsOrderParamEnumSchema - * @type { enum } - */ - export const EmployeePermissionsPaginatePermissionsOrderParamEnumSchema = z.enum(["id"]); - export type EmployeePermissionsPaginatePermissionsOrderParamEnum = z.infer< - typeof EmployeePermissionsPaginatePermissionsOrderParamEnumSchema - >; - export const EmployeePermissionsPaginatePermissionsOrderParamEnum = - EmployeePermissionsPaginatePermissionsOrderParamEnumSchema.enum; +/** + * EmployeePermissionsPaginatePermissionsOrderParamEnumSchema + * @type { enum } + */ +export const EmployeePermissionsPaginatePermissionsOrderParamEnumSchema = z.enum(["id"]); +export type EmployeePermissionsPaginatePermissionsOrderParamEnum = z.infer; +export const EmployeePermissionsPaginatePermissionsOrderParamEnum = EmployeePermissionsPaginatePermissionsOrderParamEnumSchema.enum; - /** - * EmployeePermissionsPaginatePermissionsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeePermissionResponse[] } items - */ - export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeePermissionResponseSchema).readonly() }).readonly().shape, - }); - export type EmployeePermissionsPaginatePermissionsResponse = z.infer< - typeof EmployeePermissionsPaginatePermissionsResponseSchema - >; +/** + * EmployeePermissionsPaginatePermissionsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeePermissionResponse[] } items + */ +export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeePermissionResponseSchema).nullable() }).partial().shape }); +export type EmployeePermissionsPaginatePermissionsResponse = z.infer; + +/** + * EmployeePermissionsFindAllResponseSchema + * @type { array } + */ +export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); +export type EmployeePermissionsFindAllResponse = z.infer; - /** - * EmployeePermissionsFindAllResponseSchema - * @type { array } - */ - export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type EmployeePermissionsFindAllResponse = z.infer; } diff --git a/test/generated/base/employeePermissions/employeePermissions.queries.ts b/test/generated/base/employeePermissions/employeePermissions.queries.ts index cd0f4ae..8859611 100644 --- a/test/generated/base/employeePermissions/employeePermissions.queries.ts +++ b/test/generated/base/employeePermissions/employeePermissions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -8,134 +7,87 @@ import { EmployeePermissionsModels } from "./employeePermissions.models"; import { EmployeePermissionsApi } from "./employeePermissions.api"; export namespace EmployeePermissionsQueries { - export const moduleName = QueryModule.EmployeePermissions; +export const moduleName = QueryModule.EmployeePermissions; - export const keys = { +export const keys = { all: [moduleName] as const, - paginatePermissions: ( - limit?: number, - order?: string, - filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/employees/permissions", limit, order, filter, page, cursor] as const, - paginatePermissionsInfinite: ( - limit?: number, - order?: string, - filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, - cursor?: string, - ) => [...keys.all, "/employees/permissions", "infinite", limit, order, filter, cursor] as const, + paginatePermissions: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/permissions", limit, order, filter, page, cursor] as const, + paginatePermissionsInfinite: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string) => [...keys.all, "/employees/permissions", "infinite", limit, order, filter, cursor] as const, findAll: (search?: string) => [...keys.all, "/employees/permissions/labels", search] as const, - }; +}; - /** - * Query `usePaginatePermissions` - * @permission Requires `canUsePaginatePermissions` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` - * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginatePermissions = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: EmployeePermissionsModels.EmployeePermissionFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginatePermissions` + * @permission Requires `canUsePaginatePermissions` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` + * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginatePermissions = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginatePermissionsInfinite + * @permission Requires `canUsePaginatePermissions` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` + * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginatePermissionsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginatePermissionsInfinite - * @permission Requires `canUsePaginatePermissions` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` - * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginatePermissionsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { - limit: number; - order?: string; - filter?: EmployeePermissionsModels.EmployeePermissionFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Query `useFindAll` - * @summary List all permissions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { search }: { search?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindAll` + * @summary List all permissions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(search), + queryFn: () => { + checkAcl(EmployeePermissionsAcl.canUseFindAll()); + return EmployeePermissionsApi.findAll(search) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findAll(search), - queryFn: () => { - checkAcl(EmployeePermissionsAcl.canUseFindAll()); - return EmployeePermissionsApi.findAll(search, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/employeeProfile/employeeProfile.api.ts b/test/generated/base/employeeProfile/employeeProfile.api.ts index 868a30c..745cd77 100644 --- a/test/generated/base/employeeProfile/employeeProfile.api.ts +++ b/test/generated/base/employeeProfile/employeeProfile.api.ts @@ -1,26 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { EmployeeProfileModels } from "./employeeProfile.models"; export namespace EmployeeProfileApi { - export const getProfile = (config?: AxiosRequestConfig) => { +export const getProfile = () => { return AppRestClient.get( - { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, - `/employee-profile`, - config, - ); - }; - - export const updateProfile = ( - data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, + `/employee-profile`, + + ) +}; +export const updateProfile = (data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, ) => { return AppRestClient.patch( - { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, - `/employee-profile`, - ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), - config, - ); - }; + { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, + `/employee-profile`, + ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/employeeProfile/employeeProfile.models.ts b/test/generated/base/employeeProfile/employeeProfile.models.ts index 019ef91..7e9d93e 100644 --- a/test/generated/base/employeeProfile/employeeProfile.models.ts +++ b/test/generated/base/employeeProfile/employeeProfile.models.ts @@ -2,51 +2,32 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace EmployeeProfileModels { - /** - * EmployeeProfileResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } firstName Employee first name - * @property { string } lastName Employee last name - * @property { string } email Employee email - * @property { string } phone Employee phone number - * @property { string } defaultUrl Employee default URL - * @property { CommonModels.LocaleEnum } locale Employee locale - */ - export const EmployeeProfileResponseDTOSchema = z - .object({ - id: z.string(), - firstName: z.string().describe("Employee first name"), - lastName: z.string().describe("Employee last name"), - email: z.string().describe("Employee email"), - phone: z.string().describe("Employee phone number").nullish(), - defaultUrl: z.string().describe("Employee default URL").nullish(), - locale: CommonModels.LocaleEnumSchema.describe("Employee locale").nullish(), - }) - .readonly(); - export type EmployeeProfileResponseDTO = z.infer; +/** + * EmployeeProfileResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } firstName Employee first name + * @property { string } lastName Employee last name + * @property { string } email Employee email + * @property { string } phone Employee phone number + * @property { string } defaultUrl Employee default URL + * @property { CommonModels.LocaleEnum } locale Employee locale + */ +export const EmployeeProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.string(), phone: z.string().nullish(), defaultUrl: z.string().nullish(), locale: CommonModels.LocaleEnumSchema.nullish() }); +export type EmployeeProfileResponseDTO = z.infer; + +/** + * UpdateEmployeeProfileRequestDTOSchema + * @type { object } + * @property { string } firstName Employee first name. Example: `John` + * @property { string } lastName Employee last name. Example: `Doe` + * @property { string } email Employee email address. Example: `john.doe@example.com` + * @property { string } phone Employee phone number. Example: `+1234567890` + * @property { string } defaultUrl Default URL for the employee profile. Example: `https://example.com` + * @property { string } costCenter Employee cost center + * @property { CommonModels.LocaleEnum } locale Employee locale preference. Example: `en-US` + */ +export const UpdateEmployeeProfileRequestDTOSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.email().nullable(), phone: z.string().nullable(), defaultUrl: z.url().nullable(), costCenter: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullable() }).partial(); +export type UpdateEmployeeProfileRequestDTO = z.infer; - /** - * UpdateEmployeeProfileRequestDTOSchema - * @type { object } - * @property { string } firstName Employee first name. Example: `John` - * @property { string } lastName Employee last name. Example: `Doe` - * @property { string } email Employee email address. Example: `john.doe@example.com` - * @property { string } phone Employee phone number. Example: `+1234567890` - * @property { string } defaultUrl Default URL for the employee profile. Example: `https://example.com` - * @property { string } costCenter Employee cost center - * @property { CommonModels.LocaleEnum } locale Employee locale preference. Example: `en-US` - */ - export const UpdateEmployeeProfileRequestDTOSchema = z - .object({ - firstName: z.string().describe("Employee first name"), - lastName: z.string().describe("Employee last name"), - email: z.email().describe("Employee email address"), - phone: z.string().describe("Employee phone number"), - defaultUrl: z.url().describe("Default URL for the employee profile"), - costCenter: z.string().describe("Employee cost center"), - locale: CommonModels.LocaleEnumSchema.describe("Employee locale preference"), - }) - .readonly(); - export type UpdateEmployeeProfileRequestDTO = z.infer; } diff --git a/test/generated/base/employeeProfile/employeeProfile.queries.ts b/test/generated/base/employeeProfile/employeeProfile.queries.ts index 9d9e747..bbcee98 100644 --- a/test/generated/base/employeeProfile/employeeProfile.queries.ts +++ b/test/generated/base/employeeProfile/employeeProfile.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -7,57 +6,51 @@ import { EmployeeProfileModels } from "./employeeProfile.models"; import { EmployeeProfileApi } from "./employeeProfile.api"; export namespace EmployeeProfileQueries { - export const moduleName = QueryModule.EmployeeProfile; +export const moduleName = QueryModule.EmployeeProfile; - export const keys = { +export const keys = { all: [moduleName] as const, - getProfile: () => [...keys.all, "/employee-profile"] as const, - }; + getProfile: () => [...keys.all, "/employee-profile", ] as const, +}; - /** - * Query `useGetProfile` - * @summary Get employee profile - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetProfile = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getProfile(), - queryFn: () => EmployeeProfileApi.getProfile(config), - ...options, - }); - }; +/** + * Query `useGetProfile` + * @summary Get employee profile + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetProfile = (options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.getProfile(), + queryFn: EmployeeProfileApi.getProfile, + ...options, + }); +}; - /** - * Mutation `useUpdateProfile` - * @summary Update employee profile - * @param { EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateProfile = ( - options?: AppMutationOptions< - typeof EmployeeProfileApi.updateProfile, - { data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdateProfile` + * @summary Update employee profile + * @param { EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateProfile = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + EmployeeProfileApi.updateProfile(data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.getProfile()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ data }) => EmployeeProfileApi.updateProfile(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.getProfile()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/employeeRoles/employeeRoles.acl.ts b/test/generated/base/employeeRoles/employeeRoles.acl.ts index 79b4ce6..a64e698 100644 --- a/test/generated/base/employeeRoles/employeeRoles.acl.ts +++ b/test/generated/base/employeeRoles/employeeRoles.acl.ts @@ -1,63 +1,97 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace EmployeeRolesAcl { - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List all possible roles - * @param { string } object.context context from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { context?: string }) => - ["Read", object ? subject("Role", object) : "Role"] as AbilityTuple< - "Read", - "Role" | (ForcedSubject<"Role"> & { context?: string }) - >; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Role"] as AbilityTuple<"Create", "Role">; - - /** - * Use for `useLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLabels` query - */ - export const canUseLabels = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; - - /** - * Use for `useFind` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query - */ - export const canUseFind = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Role"] as AbilityTuple<"Update", "Role">; - - /** - * Use for `useDeleteEmployeesRolesByRoleId` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteEmployeesRolesByRoleId` mutation - */ - export const canUseDeleteEmployeesRolesByRoleId = () => ["Delete", "Role"] as AbilityTuple<"Delete", "Role">; - - /** - * Use for `usePaginatePermissions` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query - */ - export const canUsePaginatePermissions = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; - - /** - * Use for `useTogglePermission` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTogglePermission` mutation - */ - export const canUseTogglePermission = () => ["Update", "Role"] as AbilityTuple<"Update", "Role">; - - /** - * Use for `useCopy` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopy` mutation - */ - export const canUseCopy = () => ["Create", "Role"] as AbilityTuple<"Create", "Role">; +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List all possible roles + * @param { string } object.context context from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { context?: string, } +) => [ + "Read", + object ? subject("Role", object) : "Role" +] as AbilityTuple<"Read", "Role" | ForcedSubject<"Role"> & { context?: string, }>; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Role" +] as AbilityTuple<"Create", "Role">; + +/** + * Use for `useLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLabels` query + */ +export const canUseLabels = ( +) => [ + "Read", + "Role" +] as AbilityTuple<"Read", "Role">; + +/** + * Use for `useFind` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query + */ +export const canUseFind = ( +) => [ + "Read", + "Role" +] as AbilityTuple<"Read", "Role">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Role" +] as AbilityTuple<"Update", "Role">; + +/** + * Use for `useDeleteEmployeesRolesByRoleId` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteEmployeesRolesByRoleId` mutation + */ +export const canUseDeleteEmployeesRolesByRoleId = ( +) => [ + "Delete", + "Role" +] as AbilityTuple<"Delete", "Role">; + +/** + * Use for `usePaginatePermissions` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query + */ +export const canUsePaginatePermissions = ( +) => [ + "Read", + "Role" +] as AbilityTuple<"Read", "Role">; + +/** + * Use for `useTogglePermission` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTogglePermission` mutation + */ +export const canUseTogglePermission = ( +) => [ + "Update", + "Role" +] as AbilityTuple<"Update", "Role">; + +/** + * Use for `useCopy` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopy` mutation + */ +export const canUseCopy = ( +) => [ + "Create", + "Role" +] as AbilityTuple<"Create", "Role">; + } diff --git a/test/generated/base/employeeRoles/employeeRoles.api.ts b/test/generated/base/employeeRoles/employeeRoles.api.ts index 52f5e62..2139057 100644 --- a/test/generated/base/employeeRoles/employeeRoles.api.ts +++ b/test/generated/base/employeeRoles/employeeRoles.api.ts @@ -1,127 +1,88 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { EmployeeRolesModels } from "./employeeRoles.models"; import { CommonModels } from "@/data/common/common.models"; export namespace EmployeeRolesApi { - export const list = ( - limit: number, - order?: string, - filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, `/employees/roles`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, config?: AxiosRequestConfig) => { +export const list = (limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, + `/employees/roles`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, ) => { return AppRestClient.post( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), - config, - ); - }; - - export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: EmployeeRolesModels.LabelsResponseSchema }, `/employees/roles/labels`, { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { - type: "query", - name: "context", - }), - }, - }); - }; - - export const find = (roleId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), + + ) +}; +export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, ) => { return AppRestClient.get( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}`, - config, - ); - }; - - export const update = ( - roleId: string, - data: EmployeeRolesModels.EmployeeRoleUpdateRequest, - config?: AxiosRequestConfig, - ) => { + { resSchema: EmployeeRolesModels.LabelsResponseSchema }, + `/employees/roles/labels`, + { + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { type: "query", name: "context" }), + }, + } + ) +}; +export const find = (roleId: string, ) => { + return AppRestClient.get( + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}`, + + ) +}; +export const update = (roleId: string, data: EmployeeRolesModels.EmployeeRoleUpdateRequest, ) => { return AppRestClient.put( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), - config, - ); - }; - - export const deleteEmployeesRolesByRoleId = (roleId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), + + ) +}; +export const deleteEmployeesRolesByRoleId = (roleId: string, ) => { return AppRestClient.delete( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/employees/roles/${roleId}`, - undefined, - config, - ); - }; - - export const paginatePermissions = (roleId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.StatusResponseDtoSchema }, + `/employees/roles/${roleId}`, + + ) +}; +export const paginatePermissions = (roleId: string, ) => { return AppRestClient.get( - { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, - `/employees/roles/${roleId}/permissions`, - config, - ); - }; - - export const togglePermission = ( - roleId: string, - permission: string, - data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, - config?: AxiosRequestConfig, - ) => { + { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, + `/employees/roles/${roleId}/permissions`, + + ) +}; +export const togglePermission = (roleId: string, permission: string, data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/employees/roles/${roleId}/permissions/${permission}/toggle`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), - config, - ); - }; - - export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/employees/roles/${roleId}/permissions/${permission}/toggle`, + ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), + + ) +}; +export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, ) => { return AppRestClient.post( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}/copy`, - ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), - config, - ); - }; + { resSchema: CommonModels.EmployeeRoleResponseSchema }, + `/employees/roles/${roleId}/copy`, + ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/employeeRoles/employeeRoles.configs.ts b/test/generated/base/employeeRoles/employeeRoles.configs.ts index 56a73dd..4e0b998 100644 --- a/test/generated/base/employeeRoles/employeeRoles.configs.ts +++ b/test/generated/base/employeeRoles/employeeRoles.configs.ts @@ -6,84 +6,85 @@ import { EmployeeRolesQueries } from "./employeeRoles.queries"; import { EmployeeRolesAcl } from "./employeeRoles.acl"; export namespace EmployeeRolesConfigs { - export const rolesConfig = { +export const rolesConfig = { meta: { - title: "Roles", + title: "Roles", }, readAll: { - acl: EmployeeRolesAcl.canUseList, - schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, - paginated: EmployeeRolesQueries.useList, - infinite: EmployeeRolesQueries.useListInfinite, - filters: { - schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, - options: { - inputs: { - name: true, - context: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: EmployeeRolesAcl.canUseList, schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, - options: { - columns: { - id: true, - name: true, - color: true, - description: true, - context: true, - permissions: true, - numberOfUsers: true, - }, - sortable: EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema, + paginated: EmployeeRolesQueries.useList, + infinite: EmployeeRolesQueries.useListInfinite, + filters: { + schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, + options: { + inputs: { + name: true, + context: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, + options: { + columns: { + id: true, + name: true, + color: true, + description: true, + context: true, + permissions: true, + numberOfUsers: true, + }, + sortable: EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema, + }, +}), }, read: { - acl: EmployeeRolesAcl.canUseFind, - schema: CommonModels.EmployeeRoleResponseSchema, - query: EmployeeRolesQueries.useFind, + acl: EmployeeRolesAcl.canUseFind, + schema: CommonModels.EmployeeRoleResponseSchema, + query: EmployeeRolesQueries.useFind, }, create: { - acl: EmployeeRolesAcl.canUseCreate, - schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, - mutation: EmployeeRolesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: EmployeeRolesAcl.canUseCreate, schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, - options: { - inputs: { - name: true, - color: true, - description: true, - context: true, - permissions: true, - }, - }, - }), + mutation: EmployeeRolesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, + options: { + inputs: { + name: true, + color: true, + description: true, + context: true, + permissions: true, + }, + }, +}) }, update: { - acl: EmployeeRolesAcl.canUseUpdate, - schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, - mutation: EmployeeRolesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: EmployeeRolesAcl.canUseUpdate, schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, - options: { - inputs: { - name: true, - color: true, - description: true, - }, - }, - }), + mutation: EmployeeRolesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, + options: { + inputs: { + name: true, + color: true, + description: true, + }, + }, +}) }, delete: { - acl: EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId, - mutation: EmployeeRolesQueries.useDeleteEmployeesRolesByRoleId, + acl: EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId, + mutation: EmployeeRolesQueries.useDeleteEmployeesRolesByRoleId, }, - }; +}; + } diff --git a/test/generated/base/employeeRoles/employeeRoles.models.ts b/test/generated/base/employeeRoles/employeeRoles.models.ts index ee2459c..f7b3720 100644 --- a/test/generated/base/employeeRoles/employeeRoles.models.ts +++ b/test/generated/base/employeeRoles/employeeRoles.models.ts @@ -2,174 +2,122 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace EmployeeRolesModels { - /** - * EmployeeRoleListItemResponseSchema - * @type { object } - * @property { string } id Unique identifier of the role - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string } context Role context - * @property { string[] } permissions Permissions associated with the role - * @property { number } numberOfUsers Number of users associated with the role - */ - export const EmployeeRoleListItemResponseSchema = z - .object({ - id: z.string().describe("Unique identifier of the role"), - name: z.string().describe("Name of the role"), - color: z.string().describe("Color associated with the role").nullish(), - description: z.string().describe("Description of the role").nullish(), - context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), - permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), - numberOfUsers: z.number().describe("Number of users associated with the role"), - }) - .readonly(); - export type EmployeeRoleListItemResponse = z.infer; +/** + * EmployeeRoleListItemResponseSchema + * @type { object } + * @property { string } id Unique identifier of the role + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string } context Role context + * @property { string[] } permissions Permissions associated with the role + * @property { number } numberOfUsers Number of users associated with the role + */ +export const EmployeeRoleListItemResponseSchema = z.object({ id: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.nullish(), permissions: z.array(z.string()), numberOfUsers: z.number() }); +export type EmployeeRoleListItemResponse = z.infer; - /** - * EmployeeRolePaginationFilterDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } context Role context - * @property { string } search - */ - export const EmployeeRolePaginationFilterDtoSchema = z - .object({ - name: z.string().describe("Name"), - context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), - search: z.string(), - }) - .readonly(); - export type EmployeeRolePaginationFilterDto = z.infer; +/** + * EmployeeRolePaginationFilterDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } context Role context + * @property { string } search + */ +export const EmployeeRolePaginationFilterDtoSchema = z.object({ name: z.string().nullable(), context: CommonModels.EmployeeRoleContextSchema.nullable(), search: z.string().nullable() }).partial(); +export type EmployeeRolePaginationFilterDto = z.infer; - /** - * EmployeeRoleCreateRequestSchema - * @type { object } - * @property { string } name Name of the role - * @property { string } color Color of the role - * @property { string } description Color of the role - * @property { string } context Role context - * - office or global - * @property { string[] } permissions Permission IDs associated with the role - * can only be either office or global. Default: `` - */ - export const EmployeeRoleCreateRequestSchema = z - .object({ - name: z.string().describe("Name of the role"), - color: z.string().describe("Color of the role"), - description: z.string().describe("Color of the role").nullish(), - context: CommonModels.EmployeeRoleContextSchema.describe(`Role context - - office or global`), - permissions: z - .array(z.string()) - .readonly() - .describe(`Permission IDs associated with the role - can only be either office or global`) - .default([]), - }) - .readonly(); - export type EmployeeRoleCreateRequest = z.infer; +/** + * EmployeeRoleCreateRequestSchema + * @type { object } + * @property { string } name Name of the role + * @property { string } color Color of the role + * @property { string } description Color of the role + * @property { string } context Role context + * - office or global + * @property { string[] } permissions Permission IDs associated with the role + * can only be either office or global. Default: `` + */ +export const EmployeeRoleCreateRequestSchema = z.object({ name: z.string(), color: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema, permissions: z.array(z.string()).default([]) }); +export type EmployeeRoleCreateRequest = z.infer; - /** - * EmployeeRolePermissionDtoSchema - * @type { object } - * @property { string } id Employee Permission unique identifier - * @property { string } label - * @property { string } group - * @property { string } description - * @property { string } context Scope where this rule is applied - * @property { boolean } enabled - */ - export const EmployeeRolePermissionDtoSchema = z - .object({ - id: z.string().describe("Employee Permission unique identifier"), - label: z.string(), - group: z.string(), - description: z.string().nullish(), - context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), - enabled: z.boolean(), - }) - .readonly(); - export type EmployeeRolePermissionDto = z.infer; +/** + * EmployeeRolePermissionDtoSchema + * @type { object } + * @property { string } id Employee Permission unique identifier + * @property { string } label + * @property { string } group + * @property { string } description + * @property { string } context Scope where this rule is applied + * @property { boolean } enabled + */ +export const EmployeeRolePermissionDtoSchema = z.object({ id: z.string(), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema, enabled: z.boolean() }); +export type EmployeeRolePermissionDto = z.infer; - /** - * EmployeeRoleUpdateRequestSchema - * @type { object } - * @property { string } name Role Id - * @property { string } color Role Color - * @property { string } description Role Description - */ - export const EmployeeRoleUpdateRequestSchema = z - .object({ - name: z.string().describe("Role Id"), - color: z.string().describe("Role Color"), - description: z.string().describe("Role Description"), - }) - .readonly(); - export type EmployeeRoleUpdateRequest = z.infer; +/** + * EmployeeRoleUpdateRequestSchema + * @type { object } + * @property { string } name Role Id + * @property { string } color Role Color + * @property { string } description Role Description + */ +export const EmployeeRoleUpdateRequestSchema = z.object({ name: z.string(), color: z.string(), description: z.string() }); +export type EmployeeRoleUpdateRequest = z.infer; - /** - * EmployeeRoleTogglePermissionRequestSchema - * @type { object } - * @property { boolean } toggled Turn the permission on or off - */ - export const EmployeeRoleTogglePermissionRequestSchema = z - .object({ toggled: z.boolean().describe("Turn the permission on or off") }) - .readonly(); - export type EmployeeRoleTogglePermissionRequest = z.infer; +/** + * EmployeeRoleTogglePermissionRequestSchema + * @type { object } + * @property { boolean } toggled Turn the permission on or off + */ +export const EmployeeRoleTogglePermissionRequestSchema = z.object({ toggled: z.boolean() }); +export type EmployeeRoleTogglePermissionRequest = z.infer; - /** - * CopyEmployeeRoleDtoSchema - * @type { object } - * @property { string } newRoleName - */ - export const CopyEmployeeRoleDtoSchema = z.object({ newRoleName: z.string() }).readonly(); - export type CopyEmployeeRoleDto = z.infer; +/** + * CopyEmployeeRoleDtoSchema + * @type { object } + * @property { string } newRoleName + */ +export const CopyEmployeeRoleDtoSchema = z.object({ newRoleName: z.string() }); +export type CopyEmployeeRoleDto = z.infer; - /** - * EmployeeRolesListOrderParamEnumSchema - * @type { enum } - */ - export const EmployeeRolesListOrderParamEnumSchema = z.enum(["name", "numberOfUsers"]); - export type EmployeeRolesListOrderParamEnum = z.infer; - export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSchema.enum; +/** + * EmployeeRolesListOrderParamEnumSchema + * @type { enum } + */ +export const EmployeeRolesListOrderParamEnumSchema = z.enum(["name", "numberOfUsers"]); +export type EmployeeRolesListOrderParamEnum = z.infer; +export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSchema.enum; - /** - * EmployeeRolesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleListItemResponse[] } items - */ - export const EmployeeRolesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).readonly() }).readonly().shape, - }); - export type EmployeeRolesListResponse = z.infer; +/** + * EmployeeRolesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRoleListItemResponse[] } items + */ +export const EmployeeRolesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).nullable() }).partial().shape }); +export type EmployeeRolesListResponse = z.infer; - /** - * LabelsResponseSchema - * @type { array } - */ - export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type LabelsResponse = z.infer; +/** + * LabelsResponseSchema + * @type { array } + */ +export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); +export type LabelsResponse = z.infer; + +/** + * EmployeeRolesPaginatePermissionsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmployeeRolePermissionDto[] } items + */ +export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).nullable() }).partial().shape }); +export type EmployeeRolesPaginatePermissionsResponse = z.infer; - /** - * EmployeeRolesPaginatePermissionsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRolePermissionDto[] } items - */ - export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).readonly() }).readonly().shape, - }); - export type EmployeeRolesPaginatePermissionsResponse = z.infer; } diff --git a/test/generated/base/employeeRoles/employeeRoles.queries.ts b/test/generated/base/employeeRoles/employeeRoles.queries.ts index 68a5d1e..c726a38 100644 --- a/test/generated/base/employeeRoles/employeeRoles.queries.ts +++ b/test/generated/base/employeeRoles/employeeRoles.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,359 +9,274 @@ import { CommonModels } from "@/data/common/common.models"; import { EmployeeRolesApi } from "./employeeRoles.api"; export namespace EmployeeRolesQueries { - export const moduleName = QueryModule.EmployeeRoles; +export const moduleName = QueryModule.EmployeeRoles; - export const keys = { +export const keys = { all: [moduleName] as const, - list: ( - limit?: number, - order?: string, - filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/employees/roles", limit, order, filter, page, cursor] as const, - listInfinite: ( - limit?: number, - order?: string, - filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/employees/roles", "infinite", limit, order, filter, cursor] as const, - labels: (search?: string, context?: CommonModels.EmployeeRoleContext) => - [...keys.all, "/employees/roles/labels", search, context] as const, + list: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/roles", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string) => [...keys.all, "/employees/roles", "infinite", limit, order, filter, cursor] as const, + labels: (search?: string, context?: CommonModels.EmployeeRoleContext) => [...keys.all, "/employees/roles/labels", search, context] as const, find: (roleId: string) => [...keys.all, "/employees/roles/:roleId", roleId] as const, paginatePermissions: (roleId: string) => [...keys.all, "/employees/roles/:roleId/permissions", roleId] as const, - }; +}; - /** - * Query `useList` - * @summary Paginate Employee Role Definitions - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` - * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary Paginate Employee Role Definitions - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` - * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `useList` + * @summary Paginate Employee Role Definitions + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` + * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseList()); + return EmployeeRolesApi.list(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Mutation `useCreate` - * @summary Create Employee Role Definition - * @permission Requires `canUseCreate` ability - * @param { EmployeeRolesModels.EmployeeRoleCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof EmployeeRolesApi.create, - { data: EmployeeRolesModels.EmployeeRoleCreateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Infinite query `useListInfinite + * @summary Paginate Employee Role Definitions + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` + * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmployeeRolesAcl.canUseCreate()); - return EmployeeRolesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmployeeRolesAcl.canUseList()); + return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useLabels` - * @summary List all employee roles with only their labels - * @permission Requires `canUseLabels` ability - * @param { string } object.search Query parameter - * @param { CommonModels.EmployeeRoleContext } object.context Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useLabels = ( - { search, context }: { search?: string; context?: CommonModels.EmployeeRoleContext }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Mutation `useCreate` + * @summary Create Employee Role Definition + * @permission Requires `canUseCreate` ability + * @param { EmployeeRolesModels.EmployeeRoleCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useQuery({ - queryKey: keys.labels(search, context), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseLabels()); - return EmployeeRolesApi.labels(search, context, config); - }, - ...options, - }); - }; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmployeeRolesAcl.canUseCreate()); + return EmployeeRolesApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useFind` - * @summary Get Employee Role Definition - * @permission Requires `canUseFind` ability - * @param { string } object.roleId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFind = ( - { roleId }: { roleId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useLabels` + * @summary List all employee roles with only their labels + * @permission Requires `canUseLabels` ability + * @param { string } object.search Query parameter + * @param { CommonModels.EmployeeRoleContext } object.context Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useLabels = ({ search, context }: { search?: string, context?: CommonModels.EmployeeRoleContext }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.labels(search, context), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseLabels()); + return EmployeeRolesApi.labels(search, context) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.find(roleId), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseFind()); - return EmployeeRolesApi.find(roleId, config); - }, - ...options, - }); - }; +/** + * Query `useFind` + * @summary Get Employee Role Definition + * @permission Requires `canUseFind` ability + * @param { string } object.roleId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFind = ({ roleId }: { roleId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.find(roleId), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUseFind()); + return EmployeeRolesApi.find(roleId) }, + ...options, + }); +}; - /** - * Mutation `useUpdate` - * @summary Update Employee Role Definition - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.roleId Path parameter - * @param { EmployeeRolesModels.EmployeeRoleUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof EmployeeRolesApi.update, - { roleId: string; data: EmployeeRolesModels.EmployeeRoleUpdateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdate` + * @summary Update Employee Role Definition + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.roleId Path parameter + * @param { EmployeeRolesModels.EmployeeRoleUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ roleId, data }) => { - checkAcl(EmployeeRolesAcl.canUseUpdate()); - return EmployeeRolesApi.update(roleId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { roleId } = variables; - const updateKeys = [keys.find(roleId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ roleId, data }) => { + checkAcl(EmployeeRolesAcl.canUseUpdate()); + return EmployeeRolesApi.update(roleId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { roleId } = variables; + const updateKeys = [keys.find(roleId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useDeleteEmployeesRolesByRoleId` - * @summary Delete Employee Role Definition - * @permission Requires `canUseDeleteEmployeesRolesByRoleId` ability - * @param { string } mutation.roleId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteEmployeesRolesByRoleId = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useDeleteEmployeesRolesByRoleId` + * @summary Delete Employee Role Definition + * @permission Requires `canUseDeleteEmployeesRolesByRoleId` ability + * @param { string } mutation.roleId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteEmployeesRolesByRoleId = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ roleId }) => { - checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); - return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ roleId }) => { + checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); + return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `usePaginatePermissions` - * @summary Get All Employee Role Definition Permissions - * - convenience endpoint to expand the permissions of a role - * - only returns the enabled permissions - * @permission Requires `canUsePaginatePermissions` ability - * @param { string } object.roleId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginatePermissions = ( - { roleId }: { roleId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginatePermissions` + * @summary Get All Employee Role Definition Permissions + * - convenience endpoint to expand the permissions of a role + * - only returns the enabled permissions + * @permission Requires `canUsePaginatePermissions` ability + * @param { string } object.roleId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginatePermissions = ({ roleId }: { roleId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginatePermissions(roleId), + queryFn: () => { + checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); + return EmployeeRolesApi.paginatePermissions(roleId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginatePermissions(roleId), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); - return EmployeeRolesApi.paginatePermissions(roleId, config); - }, - ...options, - }); - }; +/** + * Mutation `useTogglePermission` + * @summary Toggle Employee Role Definition Permission + * @permission Requires `canUseTogglePermission` ability + * @param { string } mutation.roleId Path parameter + * @param { string } mutation.permission Path parameter + * @param { EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useTogglePermission = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useTogglePermission` - * @summary Toggle Employee Role Definition Permission - * @permission Requires `canUseTogglePermission` ability - * @param { string } mutation.roleId Path parameter - * @param { string } mutation.permission Path parameter - * @param { EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useTogglePermission = ( - options?: AppMutationOptions< - typeof EmployeeRolesApi.togglePermission, - { roleId: string; permission: string; data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ roleId, permission, data }) => { + checkAcl(EmployeeRolesAcl.canUseTogglePermission()); + return EmployeeRolesApi.togglePermission(roleId, permission, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ roleId, permission, data }) => { - checkAcl(EmployeeRolesAcl.canUseTogglePermission()); - return EmployeeRolesApi.togglePermission(roleId, permission, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useCopy` + * @summary Copy Employee Role Definition + * @permission Requires `canUseCopy` ability + * @param { string } mutation.roleId Path parameter + * @param { EmployeeRolesModels.CopyEmployeeRoleDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCopy` - * @summary Copy Employee Role Definition - * @permission Requires `canUseCopy` ability - * @param { string } mutation.roleId Path parameter - * @param { EmployeeRolesModels.CopyEmployeeRoleDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCopy = ( - options?: AppMutationOptions< - typeof EmployeeRolesApi.copy, - { roleId: string; data: EmployeeRolesModels.CopyEmployeeRoleDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ roleId, data }) => { + checkAcl(EmployeeRolesAcl.canUseCopy()); + return EmployeeRolesApi.copy(roleId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { roleId } = variables; + const updateKeys = [keys.find(roleId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ roleId, data }) => { - checkAcl(EmployeeRolesAcl.canUseCopy()); - return EmployeeRolesApi.copy(roleId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { roleId } = variables; - const updateKeys = [keys.find(roleId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/employeeSettings/employeeSettings.api.ts b/test/generated/base/employeeSettings/employeeSettings.api.ts index 6035a86..2c14abc 100644 --- a/test/generated/base/employeeSettings/employeeSettings.api.ts +++ b/test/generated/base/employeeSettings/employeeSettings.api.ts @@ -1,28 +1,22 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { EmployeeSettingsModels } from "./employeeSettings.models"; export namespace EmployeeSettingsApi { - export const getAll = (config?: AxiosRequestConfig) => { +export const getAll = () => { return AppRestClient.get( - { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, - `/employees/settings`, - config, - ); - }; - - export const update = ( - key: string, - data: EmployeeSettingsModels.UpdateEmployeeSettingDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, + `/employees/settings`, + + ) +}; +export const update = (key: string, data: EmployeeSettingsModels.UpdateEmployeeSettingDto, ) => { return AppRestClient.patch( - { resSchema: z.void() }, - `/employees/settings/${key}`, - ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/employees/settings/${key}`, + ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/employeeSettings/employeeSettings.models.ts b/test/generated/base/employeeSettings/employeeSettings.models.ts index 7614af9..fd4ad3a 100644 --- a/test/generated/base/employeeSettings/employeeSettings.models.ts +++ b/test/generated/base/employeeSettings/employeeSettings.models.ts @@ -1,44 +1,20 @@ import { z } from "zod"; export namespace EmployeeSettingsModels { - /** - * EmployeeSettingsResponseDtoSchema - * @type { object } - * @property { object } settings Map of all settings for the employee - */ - export const EmployeeSettingsResponseDtoSchema = z - .object({ - settings: z - .union([ - z.object({}).catchall(z.any()).readonly(), - z.array(z.object({}).catchall(z.any()).readonly()).readonly(), - z.string(), - z.array(z.string()).readonly(), - z.array(z.number()).readonly(), - ]) - .describe("Map of all settings for the employee"), - }) - .readonly(); - export type EmployeeSettingsResponseDto = z.infer; +/** + * EmployeeSettingsResponseDtoSchema + * @type { object } + * @property { object } settings Map of all settings for the employee + */ +export const EmployeeSettingsResponseDtoSchema = z.object({ settings: z.union([z.object({}).catchall(z.any()), z.array(z.object({}).catchall(z.any())), z.string(), z.array(z.string()), z.array(z.number())]) }); +export type EmployeeSettingsResponseDto = z.infer; + +/** + * UpdateEmployeeSettingDtoSchema + * @type { object } + * @property { object } value The value to store for the setting. If null, the setting will be deleted. + */ +export const UpdateEmployeeSettingDtoSchema = z.object({ value: z.union([z.object({}).catchall(z.any()), z.array(z.unknown()), z.string(), z.number(), z.boolean()]).nullable() }).partial(); +export type UpdateEmployeeSettingDto = z.infer; - /** - * UpdateEmployeeSettingDtoSchema - * @type { object } - * @property { object } value The value to store for the setting. If null, the setting will be deleted. - */ - export const UpdateEmployeeSettingDtoSchema = z - .object({ - value: z - .union([ - z.object({}).catchall(z.any()).readonly(), - z.array(z.unknown()).readonly(), - z.string(), - z.number(), - z.boolean(), - ]) - .describe("The value to store for the setting. If null, the setting will be deleted.") - .nullable(), - }) - .readonly(); - export type UpdateEmployeeSettingDto = z.infer; } diff --git a/test/generated/base/employeeSettings/employeeSettings.queries.ts b/test/generated/base/employeeSettings/employeeSettings.queries.ts index 7aff1c3..7d4d3a7 100644 --- a/test/generated/base/employeeSettings/employeeSettings.queries.ts +++ b/test/generated/base/employeeSettings/employeeSettings.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -7,57 +6,51 @@ import { EmployeeSettingsModels } from "./employeeSettings.models"; import { EmployeeSettingsApi } from "./employeeSettings.api"; export namespace EmployeeSettingsQueries { - export const moduleName = QueryModule.EmployeeSettings; +export const moduleName = QueryModule.EmployeeSettings; - export const keys = { +export const keys = { all: [moduleName] as const, - getAll: () => [...keys.all, "/employees/settings"] as const, - }; + getAll: () => [...keys.all, "/employees/settings", ] as const, +}; - /** - * Query `useGetAll` - * @summary Get all employee settings - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetAll = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getAll(), - queryFn: () => EmployeeSettingsApi.getAll(config), - ...options, - }); - }; +/** + * Query `useGetAll` + * @summary Get all employee settings + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetAll = (options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.getAll(), + queryFn: EmployeeSettingsApi.getAll, + ...options, + }); +}; - /** - * Mutation `useUpdate` - * @summary Update employee setting - * @param { string } mutation.key Path parameter - * @param { EmployeeSettingsModels.UpdateEmployeeSettingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof EmployeeSettingsApi.update, - { key: string; data: EmployeeSettingsModels.UpdateEmployeeSettingDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdate` + * @summary Update employee setting + * @param { string } mutation.key Path parameter + * @param { EmployeeSettingsModels.UpdateEmployeeSettingDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ key, data }) => + EmployeeSettingsApi.update(key, data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ key, data }) => EmployeeSettingsApi.update(key, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/employment/employment.acl.ts b/test/generated/base/employment/employment.acl.ts index f842629..bbcaf77 100644 --- a/test/generated/base/employment/employment.acl.ts +++ b/test/generated/base/employment/employment.acl.ts @@ -1,87 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace EmploymentAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create new employment - * @param { string } object.officeId officeId from mutation data - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "Create", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create new employment + * @param { string } object.officeId officeId from mutation data + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List employments - * @param { string } object.officeId officeId from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId?: string }) => - ["Read", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "Read", - "Employment" | (ForcedSubject<"Employment"> & { officeId?: string }) - >; +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List employments + * @param { string } object.officeId officeId from filter query parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId?: string, } +) => [ + "Read", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Read", "Employment" | ForcedSubject<"Employment"> & { officeId?: string, }>; - /** - * Use for `useListRoles` query ability. For global ability, omit the object parameter. - * @description List employment roles - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query - */ - export const canUseListRoles = (object?: { officeId: string }) => - ["ListRoles", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "ListRoles", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; +/** + * Use for `useListRoles` query ability. For global ability, omit the object parameter. + * @description List employment roles + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query + */ +export const canUseListRoles = ( + object?: { officeId: string, } +) => [ + "ListRoles", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"ListRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - /** - * Use for `useUpdateRoles` mutation ability. For global ability, omit the object parameter. - * @description Update employment roles - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation - */ - export const canUseUpdateRoles = (object?: { officeId: string }) => - ["UpdateRoles", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "UpdateRoles", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; +/** + * Use for `useUpdateRoles` mutation ability. For global ability, omit the object parameter. + * @description Update employment roles + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation + */ +export const canUseUpdateRoles = ( + object?: { officeId: string, } +) => [ + "UpdateRoles", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"UpdateRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Create", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "Create", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "Archive", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Archive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive employment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("Employment", object) : "Employment" +] as AbilityTuple<"Unarchive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Unarchive", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "Unarchive", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; } diff --git a/test/generated/base/employment/employment.api.ts b/test/generated/base/employment/employment.api.ts index 022120c..f50e03e 100644 --- a/test/generated/base/employment/employment.api.ts +++ b/test/generated/base/employment/employment.api.ts @@ -1,112 +1,69 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; import { EmploymentModels } from "./employment.models"; export namespace EmploymentApi { - export const create = (data: EmploymentModels.EmploymentCreateRequest, config?: AxiosRequestConfig) => { +export const create = (data: EmploymentModels.EmploymentCreateRequest, ) => { return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/employees/employments`, - ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), - config, - ); - }; - - export const list = ( - limit: number, - order?: string, - populate?: EmploymentModels.EmploymentListPopulateParam, - filter?: EmploymentModels.EmploymentFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: EmploymentModels.EmploymentListResponseSchema }, `/employees/employments`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { - type: "query", - name: "populate", - }), - filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const listRoles = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.EmploymentResponseSchema }, + `/employees/employments`, + ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), + + ) +}; +export const list = (limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/roles`, - config, - ); - }; - - export const updateRoles = ( - officeId: string, - employmentId: string, - data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, - config?: AxiosRequestConfig, - ) => { + { resSchema: EmploymentModels.EmploymentListResponseSchema }, + `/employees/employments`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), + filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listRoles = (officeId: string, employmentId: string, ) => { + return AppRestClient.get( + { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/roles`, + + ) +}; +export const updateRoles = (officeId: string, employmentId: string, data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, ) => { return AppRestClient.put( - { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/roles`, - ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), - config, - ); - }; - - export const update = ( - officeId: string, - employmentId: string, - data: EmploymentModels.UpdateEmploymentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/roles`, + ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), + + ) +}; +export const update = (officeId: string, employmentId: string, data: EmploymentModels.UpdateEmploymentRequestDto, ) => { return AppRestClient.patch( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}`, - ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), - config, - ); - }; - - export const archive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}`, + ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), + + ) +}; +export const archive = (officeId: string, employmentId: string, ) => { return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/archive`, + + ) +}; +export const unarchive = (officeId: string, employmentId: string, ) => { return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/unarchive`, - undefined, - config, - ); - }; + { resSchema: CommonModels.EmploymentResponseSchema }, + `/offices/${officeId}/employments/${employmentId}/unarchive`, + + ) +}; } diff --git a/test/generated/base/employment/employment.configs.ts b/test/generated/base/employment/employment.configs.ts index b1b2136..b8525a4 100644 --- a/test/generated/base/employment/employment.configs.ts +++ b/test/generated/base/employment/employment.configs.ts @@ -6,57 +6,58 @@ import { EmploymentQueries } from "./employment.queries"; import { EmploymentAcl } from "./employment.acl"; export namespace EmploymentConfigs { - export const employmentsConfig = { +export const employmentsConfig = { meta: { - title: "Employments", + title: "Employments", }, readAll: { - acl: EmploymentAcl.canUseList, - schema: CommonModels.EmploymentResponseSchema, - paginated: EmploymentQueries.useList, - infinite: EmploymentQueries.useListInfinite, - filters: { - schema: EmploymentModels.EmploymentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmploymentModels.EmploymentFilterDtoSchema, - options: { - inputs: { - officeId: true, - employeeId: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: EmploymentAcl.canUseList, schema: CommonModels.EmploymentResponseSchema, - options: { - columns: { - id: true, - officeId: true, - office: true, - employeeId: true, - employee: true, - archived: true, - costCenter: true, - roles: true, - }, - sortable: EmploymentModels.EmploymentListOrderParamEnumSchema, + paginated: EmploymentQueries.useList, + infinite: EmploymentQueries.useListInfinite, + filters: { + schema: EmploymentModels.EmploymentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: EmploymentModels.EmploymentFilterDtoSchema, + options: { + inputs: { + officeId: true, + employeeId: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.EmploymentResponseSchema, + options: { + columns: { + id: true, + officeId: true, + office: true, + employeeId: true, + employee: true, + archived: true, + costCenter: true, + roles: true, + }, + sortable: EmploymentModels.EmploymentListOrderParamEnumSchema, + }, +}), }, create: { - acl: EmploymentAcl.canUseCreate, - schema: EmploymentModels.EmploymentCreateRequestSchema, - mutation: EmploymentQueries.useCreate, - inputDefs: dynamicInputs({ + acl: EmploymentAcl.canUseCreate, schema: EmploymentModels.EmploymentCreateRequestSchema, - options: { - inputs: { - officeId: true, - employeeId: true, - }, - }, - }), + mutation: EmploymentQueries.useCreate, + inputDefs: dynamicInputs({ + schema: EmploymentModels.EmploymentCreateRequestSchema, + options: { + inputs: { + officeId: true, + employeeId: true, }, - }; + }, +}) + }, +}; + } diff --git a/test/generated/base/employment/employment.models.ts b/test/generated/base/employment/employment.models.ts index ceba63b..151a915 100644 --- a/test/generated/base/employment/employment.models.ts +++ b/test/generated/base/employment/employment.models.ts @@ -2,138 +2,113 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace EmploymentModels { - /** - * EmploymentCreateRequestSchema - * @type { object } - * @property { string } officeId - * @property { string } employeeId - */ - export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }).readonly(); - export type EmploymentCreateRequest = z.infer; +/** + * EmploymentCreateRequestSchema + * @type { object } + * @property { string } officeId + * @property { string } employeeId + */ +export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }); +export type EmploymentCreateRequest = z.infer; - /** - * EmploymentFilterDtoSchema - * @type { object } - * @property { string } officeId Office IDs - * @property { string } employeeId Employee IDs - */ - export const EmploymentFilterDtoSchema = z - .object({ officeId: z.string().describe("Office IDs"), employeeId: z.string().describe("Employee IDs") }) - .readonly(); - export type EmploymentFilterDto = z.infer; +/** + * EmploymentFilterDtoSchema + * @type { object } + * @property { string } officeId Office IDs + * @property { string } employeeId Employee IDs + */ +export const EmploymentFilterDtoSchema = z.object({ officeId: z.string().nullable(), employeeId: z.string().nullable() }).partial(); +export type EmploymentFilterDto = z.infer; - /** - * EmploymentRoleMemberResponseSchema - * @type { object } - * @property { string } roleId - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string[] } permissions Permissions associated with the role - */ - export const EmploymentRoleMemberResponseSchema = z - .object({ - roleId: z.string(), - name: z.string().describe("Name of the role"), - color: z.string().describe("Color associated with the role").nullish(), - description: z.string().describe("Description of the role").nullish(), - permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), - }) - .readonly(); - export type EmploymentRoleMemberResponse = z.infer; +/** + * EmploymentRoleMemberResponseSchema + * @type { object } + * @property { string } roleId + * @property { string } name Name of the role + * @property { string } color Color associated with the role + * @property { string } description Description of the role + * @property { string[] } permissions Permissions associated with the role + */ +export const EmploymentRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), permissions: z.array(z.string()) }); +export type EmploymentRoleMemberResponse = z.infer; - /** - * EmploymentRoleMembershipsUpdateRequestSchema - * @type { object } - * @property { string[] } roleIds Array of role IDs - */ - export const EmploymentRoleMembershipsUpdateRequestSchema = z - .object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }) - .readonly(); - export type EmploymentRoleMembershipsUpdateRequest = z.infer; +/** + * EmploymentRoleMembershipsUpdateRequestSchema + * @type { object } + * @property { string[] } roleIds Array of role IDs + */ +export const EmploymentRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()) }); +export type EmploymentRoleMembershipsUpdateRequest = z.infer; - /** - * UpdateEmploymentRequestDtoSchema - * @type { object } - * @property { string } costCenter - * @property { string[] } roleIds - */ - export const UpdateEmploymentRequestDtoSchema = z - .object({ costCenter: z.string(), roleIds: z.array(z.string()).readonly() }) - .readonly(); - export type UpdateEmploymentRequestDto = z.infer; +/** + * UpdateEmploymentRequestDtoSchema + * @type { object } + * @property { string } costCenter + * @property { string[] } roleIds + */ +export const UpdateEmploymentRequestDtoSchema = z.object({ costCenter: z.string().nullable(), roleIds: z.array(z.string()).nullable() }).partial(); +export type UpdateEmploymentRequestDto = z.infer; - /** - * EmploymentListOrderParamEnumSchema - * @type { enum } - */ - export const EmploymentListOrderParamEnumSchema = z.enum(["officeId", "createdAt"]); - export type EmploymentListOrderParamEnum = z.infer; - export const EmploymentListOrderParamEnum = EmploymentListOrderParamEnumSchema.enum; +/** + * EmploymentListOrderParamEnumSchema + * @type { enum } + */ +export const EmploymentListOrderParamEnumSchema = z.enum(["officeId", "createdAt"]); +export type EmploymentListOrderParamEnum = z.infer; +export const EmploymentListOrderParamEnum = EmploymentListOrderParamEnumSchema.enum; - /** - * EmploymentPaginationPopulateFieldsSchema - * @type { enum } - */ - export const EmploymentPaginationPopulateFieldsSchema = z.enum(["office", "employee"]); - export type EmploymentPaginationPopulateFields = z.infer; - export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFieldsSchema.enum; +/** + * EmploymentPaginationPopulateFieldsSchema + * @type { enum } + */ +export const EmploymentPaginationPopulateFieldsSchema = z.enum(["office", "employee"]); +export type EmploymentPaginationPopulateFields = z.infer; +export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFieldsSchema.enum; - /** - * EmploymentListPopulateParamSchema - * @type { array } - */ - export const EmploymentListPopulateParamSchema = z - .array(EmploymentPaginationPopulateFieldsSchema) - .readonly() - .nullish(); - export type EmploymentListPopulateParam = z.infer; +/** + * EmploymentListPopulateParamSchema + * @type { array } + */ +export const EmploymentListPopulateParamSchema = z.array(EmploymentPaginationPopulateFieldsSchema).nullish(); +export type EmploymentListPopulateParam = z.infer; - /** - * EmploymentListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.EmploymentResponse[] } items - */ - export const EmploymentListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.EmploymentResponseSchema).readonly() }).readonly().shape, - }); - export type EmploymentListResponse = z.infer; +/** + * EmploymentListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.EmploymentResponse[] } items + */ +export const EmploymentListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.EmploymentResponseSchema).nullable() }).partial().shape }); +export type EmploymentListResponse = z.infer; - /** - * EmploymentListRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmploymentRoleMemberResponse[] } items - */ - export const EmploymentListRolesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape, - }); - export type EmploymentListRolesResponse = z.infer; +/** + * EmploymentListRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmploymentRoleMemberResponse[] } items + */ +export const EmploymentListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).nullable() }).partial().shape }); +export type EmploymentListRolesResponse = z.infer; + +/** + * EmploymentUpdateRolesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { EmploymentRoleMemberResponse[] } items + */ +export const EmploymentUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).nullable() }).partial().shape }); +export type EmploymentUpdateRolesResponse = z.infer; - /** - * EmploymentUpdateRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmploymentRoleMemberResponse[] } items - */ - export const EmploymentUpdateRolesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape, - }); - export type EmploymentUpdateRolesResponse = z.infer; } diff --git a/test/generated/base/employment/employment.queries.ts b/test/generated/base/employment/employment.queries.ts index c0e6627..bc84e99 100644 --- a/test/generated/base/employment/employment.queries.ts +++ b/test/generated/base/employment/employment.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,307 +8,227 @@ import { EmploymentModels } from "./employment.models"; import { EmploymentApi } from "./employment.api"; export namespace EmploymentQueries { - export const moduleName = QueryModule.Employment; +export const moduleName = QueryModule.Employment; - export const keys = { +export const keys = { all: [moduleName] as const, - list: ( - limit?: number, - order?: string, - populate?: EmploymentModels.EmploymentListPopulateParam, - filter?: EmploymentModels.EmploymentFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/employees/employments", limit, order, populate, filter, page, cursor] as const, - listInfinite: ( - limit?: number, - order?: string, - populate?: EmploymentModels.EmploymentListPopulateParam, - filter?: EmploymentModels.EmploymentFilterDto, - cursor?: string, - ) => [...keys.all, "/employees/employments", "infinite", limit, order, populate, filter, cursor] as const, - listRoles: (officeId: string, employmentId: string) => - [...keys.all, "/offices/:officeId/employments/:employmentId/roles", officeId, employmentId] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create new employment - * @permission Requires `canUseCreate` ability - * @param { EmploymentModels.EmploymentCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmploymentAcl.canUseCreate()); - return EmploymentApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useList` - * @summary List Employments - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` - * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter - * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - limit, - order, - populate, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - populate?: EmploymentModels.EmploymentListPopulateParam; - filter?: EmploymentModels.EmploymentFilterDto; - page?: number; - cursor?: string; + list: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/employments", limit, order, populate, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string) => [...keys.all, "/employees/employments", "infinite", limit, order, populate, filter, cursor] as const, + listRoles: (officeId: string, employmentId: string) => [...keys.all, "/offices/:officeId/employments/:employmentId/roles", officeId, employmentId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create new employment + * @permission Requires `canUseCreate` ability + * @param { EmploymentModels.EmploymentCreateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(EmploymentAcl.canUseCreate()); + return EmploymentApi.create(data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, populate, filter, page, cursor), - queryFn: () => { - checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List Employments - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` - * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter - * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - limit, - order, - populate, - filter, - cursor, - }: { - limit: number; - order?: string; - populate?: EmploymentModels.EmploymentListPopulateParam; - filter?: EmploymentModels.EmploymentFilterDto; - cursor?: string; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, populate, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useListRoles` - * @summary List Employments Roles - * @permission Requires `canUseListRoles` ability - * @param { string } object.officeId Path parameter - * @param { string } object.employmentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListRoles = ( - { officeId, employmentId }: { officeId: string; employmentId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoles(officeId, employmentId), - queryFn: () => { - checkAcl(EmploymentAcl.canUseListRoles({ officeId })); - return EmploymentApi.listRoles(officeId, employmentId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateRoles` - * @summary Update Employment Roles - * @permission Requires `canUseUpdateRoles` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { EmploymentModels.EmploymentRoleMembershipsUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateRoles = ( - options?: AppMutationOptions< - typeof EmploymentApi.updateRoles, - { officeId: string; employmentId: string; data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId, data }) => { - checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId })); - return EmploymentApi.updateRoles(officeId, employmentId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdate` - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { EmploymentModels.UpdateEmploymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof EmploymentApi.update, - { officeId: string; employmentId: string; data: EmploymentModels.UpdateEmploymentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId, data }) => { - checkAcl(EmploymentAcl.canUseUpdate({ officeId })); - return EmploymentApi.update(officeId, employmentId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive Employment - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId }) => { - checkAcl(EmploymentAcl.canUseArchive({ officeId })); - return EmploymentApi.archive(officeId, employmentId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Un-archive Employment - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + }); +}; + +/** + * Query `useList` + * @summary List Employments + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` + * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter + * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, populate, filter, page, cursor), + queryFn: () => { + checkAcl(EmploymentAcl.canUseList()); + return EmploymentApi.list(limit, order, populate, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `useListInfinite + * @summary List Employments + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` + * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter + * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, populate, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(EmploymentAcl.canUseList()); + return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useListRoles` + * @summary List Employments Roles + * @permission Requires `canUseListRoles` ability + * @param { string } object.officeId Path parameter + * @param { string } object.employmentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoles = ({ officeId, employmentId }: { officeId: string, employmentId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoles(officeId, employmentId), + queryFn: () => { + checkAcl(EmploymentAcl.canUseListRoles({ officeId } )); + return EmploymentApi.listRoles(officeId, employmentId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateRoles` + * @summary Update Employment Roles + * @permission Requires `canUseUpdateRoles` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { EmploymentModels.EmploymentRoleMembershipsUpdateRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId, data }) => { + checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId } )); + return EmploymentApi.updateRoles(officeId, employmentId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { EmploymentModels.UpdateEmploymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId, data }) => { + checkAcl(EmploymentAcl.canUseUpdate({ officeId } )); + return EmploymentApi.update(officeId, employmentId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive Employment + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId }) => { + checkAcl(EmploymentAcl.canUseArchive({ officeId } )); + return EmploymentApi.archive(officeId, employmentId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Un-archive Employment + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.employmentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, employmentId }) => { + checkAcl(EmploymentAcl.canUseUnarchive({ officeId } )); + return EmploymentApi.unarchive(officeId, employmentId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, employmentId }) => { - checkAcl(EmploymentAcl.canUseUnarchive({ officeId })); - return EmploymentApi.unarchive(officeId, employmentId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/factoringExport/factoringExport.acl.ts b/test/generated/base/factoringExport/factoringExport.acl.ts index b4cf272..cc07635 100644 --- a/test/generated/base/factoringExport/factoringExport.acl.ts +++ b/test/generated/base/factoringExport/factoringExport.acl.ts @@ -1,27 +1,30 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace FactoringExportAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create factoring export - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< - "Create", - "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create factoring export + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Create", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +/** + * Use for `useGetBatch` query ability. For global ability, omit the object parameter. + * @description Read factoring export + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query + */ +export const canUseGetBatch = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - /** - * Use for `useGetBatch` query ability. For global ability, omit the object parameter. - * @description Read factoring export - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query - */ - export const canUseGetBatch = (object?: { officeId: string }) => - ["Read", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< - "Read", - "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) - >; } diff --git a/test/generated/base/factoringExport/factoringExport.api.ts b/test/generated/base/factoringExport/factoringExport.api.ts index a1f1749..7ade703 100644 --- a/test/generated/base/factoringExport/factoringExport.api.ts +++ b/test/generated/base/factoringExport/factoringExport.api.ts @@ -1,27 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { FactoringExportModels } from "./factoringExport.models"; export namespace FactoringExportApi { - export const create = ( - officeId: string, - data: FactoringExportModels.CreateFactoringExportRequestDto, - config?: AxiosRequestConfig, - ) => { +export const create = (officeId: string, data: FactoringExportModels.CreateFactoringExportRequestDto, ) => { return AppRestClient.post( - { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-exports`, - ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), - config, - ); - }; - - export const getBatch = (batchId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-exports`, + ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), + + ) +}; +export const getBatch = (batchId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-exports/${batchId}`, - config, - ); - }; + { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-exports/${batchId}`, + + ) +}; } diff --git a/test/generated/base/factoringExport/factoringExport.models.ts b/test/generated/base/factoringExport/factoringExport.models.ts index 3b5ef07..d2b90ac 100644 --- a/test/generated/base/factoringExport/factoringExport.models.ts +++ b/test/generated/base/factoringExport/factoringExport.models.ts @@ -1,61 +1,41 @@ import { z } from "zod"; export namespace FactoringExportModels { - /** - * FactoringExportBatchStatusEnumSchema - * @type { enum } - */ - export const FactoringExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Failed"]); - export type FactoringExportBatchStatusEnum = z.infer; - export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSchema.enum; +/** + * FactoringExportBatchStatusEnumSchema + * @type { enum } + */ +export const FactoringExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Failed"]); +export type FactoringExportBatchStatusEnum = z.infer; +export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSchema.enum; - /** - * FactoringExportBatchResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { FactoringExportBatchStatusEnum } status - * @property { number } totalInvoices - * @property { number } totalAmount - * @property { string } currencyNotation - * @property { string } jobId - * @property { string } eurFileUrl - * @property { string } usdFileUrl - * @property { string } createdById - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } exportedAt - */ - export const FactoringExportBatchResponseDtoSchema = z - .object({ - id: z.string(), - officeId: z.string(), - status: FactoringExportBatchStatusEnumSchema, - totalInvoices: z.number(), - totalAmount: z.number(), - currencyNotation: z.string(), - jobId: z.string().nullish(), - eurFileUrl: z.string().nullish(), - usdFileUrl: z.string().nullish(), - createdById: z.string(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - exportedAt: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type FactoringExportBatchResponseDto = z.infer; +/** + * FactoringExportBatchResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { FactoringExportBatchStatusEnum } status + * @property { number } totalInvoices + * @property { number } totalAmount + * @property { string } currencyNotation + * @property { string } jobId + * @property { string } eurFileUrl + * @property { string } usdFileUrl + * @property { string } createdById + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } exportedAt + */ +export const FactoringExportBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringExportBatchStatusEnumSchema, totalInvoices: z.number(), totalAmount: z.number(), currencyNotation: z.string(), jobId: z.string().nullish(), eurFileUrl: z.string().nullish(), usdFileUrl: z.string().nullish(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish() }); +export type FactoringExportBatchResponseDto = z.infer; + +/** + * CreateFactoringExportRequestDtoSchema + * @type { object } + * @property { string } invoiceDateFrom Invoice date from + * @property { string } invoiceDateUntil Invoice date until + */ +export const CreateFactoringExportRequestDtoSchema = z.object({ invoiceDateFrom: z.iso.datetime({ offset: true }), invoiceDateUntil: z.iso.datetime({ offset: true }) }); +export type CreateFactoringExportRequestDto = z.infer; - /** - * CreateFactoringExportRequestDtoSchema - * @type { object } - * @property { string } invoiceDateFrom Invoice date from - * @property { string } invoiceDateUntil Invoice date until - */ - export const CreateFactoringExportRequestDtoSchema = z - .object({ - invoiceDateFrom: z.iso.datetime({ offset: true }).describe("Invoice date from"), - invoiceDateUntil: z.iso.datetime({ offset: true }).describe("Invoice date until"), - }) - .readonly(); - export type CreateFactoringExportRequestDto = z.infer; } diff --git a/test/generated/base/factoringExport/factoringExport.queries.ts b/test/generated/base/factoringExport/factoringExport.queries.ts index c2d5093..f73fe09 100644 --- a/test/generated/base/factoringExport/factoringExport.queries.ts +++ b/test/generated/base/factoringExport/factoringExport.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,72 +8,60 @@ import { FactoringExportModels } from "./factoringExport.models"; import { FactoringExportApi } from "./factoringExport.api"; export namespace FactoringExportQueries { - export const moduleName = QueryModule.FactoringExport; +export const moduleName = QueryModule.FactoringExport; - export const keys = { +export const keys = { all: [moduleName] as const, - getBatch: (batchId: string, officeId: string) => - [...keys.all, "/offices/:officeId/factoring-exports/:batchId", batchId, officeId] as const, - }; + getBatch: (batchId: string, officeId: string) => [...keys.all, "/offices/:officeId/factoring-exports/:batchId", batchId, officeId] as const, +}; - /** - * Mutation `useCreate` - * @summary Generate factoring export files for Raiffeisen Factor Bank - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { FactoringExportModels.CreateFactoringExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof FactoringExportApi.create, - { officeId: string; data: FactoringExportModels.CreateFactoringExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Generate factoring export files for Raiffeisen Factor Bank + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { FactoringExportModels.CreateFactoringExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(FactoringExportAcl.canUseCreate({ officeId })); - return FactoringExportApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(FactoringExportAcl.canUseCreate({ officeId } )); + return FactoringExportApi.create(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useGetBatch` - * @summary Get factoring export batch status - * @permission Requires `canUseGetBatch` ability - * @param { string } object.batchId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetBatch = ( - { batchId, officeId }: { batchId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetBatch` + * @summary Get factoring export batch status + * @permission Requires `canUseGetBatch` ability + * @param { string } object.batchId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBatch = ({ batchId, officeId }: { batchId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBatch(batchId, officeId), + queryFn: () => { + checkAcl(FactoringExportAcl.canUseGetBatch({ officeId } )); + return FactoringExportApi.getBatch(batchId, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getBatch(batchId, officeId), - queryFn: () => { - checkAcl(FactoringExportAcl.canUseGetBatch({ officeId })); - return FactoringExportApi.getBatch(batchId, officeId, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/factoringMerge/factoringMerge.acl.ts b/test/generated/base/factoringMerge/factoringMerge.acl.ts index 7a01e13..208ed2f 100644 --- a/test/generated/base/factoringMerge/factoringMerge.acl.ts +++ b/test/generated/base/factoringMerge/factoringMerge.acl.ts @@ -1,39 +1,43 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace FactoringMergeAcl { - /** - * Use for `usePrepareUpload` mutation ability. For global ability, omit the object parameter. - * @description Prepare factoring merge upload - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareUpload` mutation - */ - export const canUsePrepareUpload = (object?: { officeId: string }) => - ["Update", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< - "Update", - "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) - >; +/** + * Use for `usePrepareUpload` mutation ability. For global ability, omit the object parameter. + * @description Prepare factoring merge upload + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareUpload` mutation + */ +export const canUsePrepareUpload = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - /** - * Use for `useProcessMerge` mutation ability. For global ability, omit the object parameter. - * @description Process factoring merge - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useProcessMerge` mutation - */ - export const canUseProcessMerge = (object?: { officeId: string }) => - ["Update", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< - "Update", - "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) - >; +/** + * Use for `useProcessMerge` mutation ability. For global ability, omit the object parameter. + * @description Process factoring merge + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useProcessMerge` mutation + */ +export const canUseProcessMerge = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; + +/** + * Use for `useGetMergeBatch` query ability. For global ability, omit the object parameter. + * @description Read merge batch + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMergeBatch` query + */ +export const canUseGetMergeBatch = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("FactoringExport", object) : "FactoringExport" +] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - /** - * Use for `useGetMergeBatch` query ability. For global ability, omit the object parameter. - * @description Read merge batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMergeBatch` query - */ - export const canUseGetMergeBatch = (object?: { officeId: string }) => - ["Read", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< - "Read", - "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) - >; } diff --git a/test/generated/base/factoringMerge/factoringMerge.api.ts b/test/generated/base/factoringMerge/factoringMerge.api.ts index 17891c8..1a42dec 100644 --- a/test/generated/base/factoringMerge/factoringMerge.api.ts +++ b/test/generated/base/factoringMerge/factoringMerge.api.ts @@ -1,36 +1,28 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { FactoringMergeModels } from "./factoringMerge.models"; export namespace FactoringMergeApi { - export const prepareUpload = ( - officeId: string, - data: FactoringMergeModels.PrepareFactoringMergeRequestDto, - config?: AxiosRequestConfig, - ) => { +export const prepareUpload = (officeId: string, data: FactoringMergeModels.PrepareFactoringMergeRequestDto, ) => { return AppRestClient.post( - { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/prepare-upload`, - ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), - config, - ); - }; - - export const processMerge = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/prepare-upload`, + ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), + + ) +}; +export const processMerge = (officeId: string, batchId: string, ) => { return AppRestClient.post( - { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/${batchId}/process`, - undefined, - config, - ); - }; - - export const getMergeBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { + { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/${batchId}/process`, + + ) +}; +export const getMergeBatch = (officeId: string, batchId: string, ) => { return AppRestClient.get( - { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/${batchId}`, - config, - ); - }; + { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, + `/offices/${officeId}/factoring-merge/${batchId}`, + + ) +}; } diff --git a/test/generated/base/factoringMerge/factoringMerge.models.ts b/test/generated/base/factoringMerge/factoringMerge.models.ts index 70763bd..9d720a4 100644 --- a/test/generated/base/factoringMerge/factoringMerge.models.ts +++ b/test/generated/base/factoringMerge/factoringMerge.models.ts @@ -1,137 +1,84 @@ import { z } from "zod"; export namespace FactoringMergeModels { - /** - * FileMetadataDtoSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType File MIME type - * @property { number } fileSize File size in bytes. Minimum: `1` - */ - export const FileMetadataDtoSchema = z - .object({ - fileName: z.string().describe("File name"), - mimeType: z.string().describe("File MIME type"), - fileSize: z.number().gte(1).describe("File size in bytes"), - }) - .readonly(); - export type FileMetadataDto = z.infer; +/** + * FileMetadataDtoSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType File MIME type + * @property { number } fileSize File size in bytes. Minimum: `1` + */ +export const FileMetadataDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number().gte(1) }); +export type FileMetadataDto = z.infer; - /** - * PrepareFactoringMergeRequestDtoSchema - * @type { object } - * @property { FileMetadataDto } eurDebtorFile EUR debtor file metadata - * @property { FileMetadataDto } eurOperationsFile EUR operations file metadata - * @property { FileMetadataDto } eurExistingFactoringFile EUR existing factoring file metadata (optional) - * @property { FileMetadataDto } usdDebtorFile USD debtor file metadata - * @property { FileMetadataDto } usdOperationsFile USD operations file metadata - * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) - */ - export const PrepareFactoringMergeRequestDtoSchema = z - .object({ - eurDebtorFile: FileMetadataDtoSchema.describe("EUR debtor file metadata"), - eurOperationsFile: FileMetadataDtoSchema.describe("EUR operations file metadata"), - eurExistingFactoringFile: FileMetadataDtoSchema.describe( - "EUR existing factoring file metadata (optional)", - ).nullish(), - usdDebtorFile: FileMetadataDtoSchema.describe("USD debtor file metadata"), - usdOperationsFile: FileMetadataDtoSchema.describe("USD operations file metadata"), - usdExistingFactoringFile: FileMetadataDtoSchema.describe( - "USD existing factoring file metadata (optional)", - ).nullish(), - }) - .readonly(); - export type PrepareFactoringMergeRequestDto = z.infer; +/** + * PrepareFactoringMergeRequestDtoSchema + * @type { object } + * @property { FileMetadataDto } eurDebtorFile EUR debtor file metadata + * @property { FileMetadataDto } eurOperationsFile EUR operations file metadata + * @property { FileMetadataDto } eurExistingFactoringFile EUR existing factoring file metadata (optional) + * @property { FileMetadataDto } usdDebtorFile USD debtor file metadata + * @property { FileMetadataDto } usdOperationsFile USD operations file metadata + * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) + */ +export const PrepareFactoringMergeRequestDtoSchema = z.object({ eurDebtorFile: FileMetadataDtoSchema, eurOperationsFile: FileMetadataDtoSchema, eurExistingFactoringFile: FileMetadataDtoSchema.nullish(), usdDebtorFile: FileMetadataDtoSchema, usdOperationsFile: FileMetadataDtoSchema, usdExistingFactoringFile: FileMetadataDtoSchema.nullish() }); +export type PrepareFactoringMergeRequestDto = z.infer; - /** - * MediaUploadInstructionsDtoSchema - * @type { object } - * @property { string } id - * @property { string } method - * @property { string } url - */ - export const MediaUploadInstructionsDtoSchema = z - .object({ id: z.string(), method: z.string(), url: z.string() }) - .readonly(); - export type MediaUploadInstructionsDto = z.infer; +/** + * MediaUploadInstructionsDtoSchema + * @type { object } + * @property { string } id + * @property { string } method + * @property { string } url + */ +export const MediaUploadInstructionsDtoSchema = z.object({ id: z.string(), method: z.string(), url: z.string() }); +export type MediaUploadInstructionsDto = z.infer; - /** - * FactoringMergeUploadInstructionsResponseDtoSchema - * @type { object } - * @property { string } batchId - * @property { MediaUploadInstructionsDto } eurDebtorFile - * @property { MediaUploadInstructionsDto } eurOperationsFile - * @property { MediaUploadInstructionsDto } eurExistingFactoringFile - * @property { MediaUploadInstructionsDto } usdDebtorFile - * @property { MediaUploadInstructionsDto } usdOperationsFile - * @property { MediaUploadInstructionsDto } usdExistingFactoringFile - */ - export const FactoringMergeUploadInstructionsResponseDtoSchema = z - .object({ - batchId: z.string(), - eurDebtorFile: MediaUploadInstructionsDtoSchema, - eurOperationsFile: MediaUploadInstructionsDtoSchema, - eurExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), - usdDebtorFile: MediaUploadInstructionsDtoSchema, - usdOperationsFile: MediaUploadInstructionsDtoSchema, - usdExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), - }) - .readonly(); - export type FactoringMergeUploadInstructionsResponseDto = z.infer< - typeof FactoringMergeUploadInstructionsResponseDtoSchema - >; +/** + * FactoringMergeUploadInstructionsResponseDtoSchema + * @type { object } + * @property { string } batchId + * @property { MediaUploadInstructionsDto } eurDebtorFile + * @property { MediaUploadInstructionsDto } eurOperationsFile + * @property { MediaUploadInstructionsDto } eurExistingFactoringFile + * @property { MediaUploadInstructionsDto } usdDebtorFile + * @property { MediaUploadInstructionsDto } usdOperationsFile + * @property { MediaUploadInstructionsDto } usdExistingFactoringFile + */ +export const FactoringMergeUploadInstructionsResponseDtoSchema = z.object({ batchId: z.string(), eurDebtorFile: MediaUploadInstructionsDtoSchema, eurOperationsFile: MediaUploadInstructionsDtoSchema, eurExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), usdDebtorFile: MediaUploadInstructionsDtoSchema, usdOperationsFile: MediaUploadInstructionsDtoSchema, usdExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish() }); +export type FactoringMergeUploadInstructionsResponseDto = z.infer; - /** - * FactoringMergeBatchStatusEnumSchema - * @type { enum } - */ - export const FactoringMergeBatchStatusEnumSchema = z.enum(["Initializing", "Processing", "Completed", "Failed"]); - export type FactoringMergeBatchStatusEnum = z.infer; - export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema.enum; +/** + * FactoringMergeBatchStatusEnumSchema + * @type { enum } + */ +export const FactoringMergeBatchStatusEnumSchema = z.enum(["Initializing", "Processing", "Completed", "Failed"]); +export type FactoringMergeBatchStatusEnum = z.infer; +export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema.enum; + +/** + * FactoringMergeBatchResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { FactoringMergeBatchStatusEnum } status + * @property { string } eurDebtorFileMediaId + * @property { string } eurOperationsFileMediaId + * @property { string } eurExistingFactoringFileMediaId + * @property { string } usdDebtorFileMediaId + * @property { string } usdOperationsFileMediaId + * @property { string } usdExistingFactoringFileMediaId + * @property { string } eurResultFileMediaId + * @property { string } eurResultFileUrl + * @property { string } usdResultFileMediaId + * @property { string } usdResultFileUrl + * @property { string } jobId + * @property { string } errorMessage + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } completedAt + */ +export const FactoringMergeBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringMergeBatchStatusEnumSchema, eurDebtorFileMediaId: z.string(), eurOperationsFileMediaId: z.string(), eurExistingFactoringFileMediaId: z.string().nullish(), usdDebtorFileMediaId: z.string(), usdOperationsFileMediaId: z.string(), usdExistingFactoringFileMediaId: z.string().nullish(), eurResultFileMediaId: z.string().nullish(), eurResultFileUrl: z.string().nullish(), usdResultFileMediaId: z.string().nullish(), usdResultFileUrl: z.string().nullish(), jobId: z.string().nullish(), errorMessage: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), completedAt: z.iso.datetime({ offset: true }).nullish() }); +export type FactoringMergeBatchResponseDto = z.infer; - /** - * FactoringMergeBatchResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { FactoringMergeBatchStatusEnum } status - * @property { string } eurDebtorFileMediaId - * @property { string } eurOperationsFileMediaId - * @property { string } eurExistingFactoringFileMediaId - * @property { string } usdDebtorFileMediaId - * @property { string } usdOperationsFileMediaId - * @property { string } usdExistingFactoringFileMediaId - * @property { string } eurResultFileMediaId - * @property { string } eurResultFileUrl - * @property { string } usdResultFileMediaId - * @property { string } usdResultFileUrl - * @property { string } jobId - * @property { string } errorMessage - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } completedAt - */ - export const FactoringMergeBatchResponseDtoSchema = z - .object({ - id: z.string(), - officeId: z.string(), - status: FactoringMergeBatchStatusEnumSchema, - eurDebtorFileMediaId: z.string(), - eurOperationsFileMediaId: z.string(), - eurExistingFactoringFileMediaId: z.string().nullish(), - usdDebtorFileMediaId: z.string(), - usdOperationsFileMediaId: z.string(), - usdExistingFactoringFileMediaId: z.string().nullish(), - eurResultFileMediaId: z.string().nullish(), - eurResultFileUrl: z.string().nullish(), - usdResultFileMediaId: z.string().nullish(), - usdResultFileUrl: z.string().nullish(), - jobId: z.string().nullish(), - errorMessage: z.string().nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - completedAt: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type FactoringMergeBatchResponseDto = z.infer; } diff --git a/test/generated/base/factoringMerge/factoringMerge.queries.ts b/test/generated/base/factoringMerge/factoringMerge.queries.ts index 45c7497..9e1e382 100644 --- a/test/generated/base/factoringMerge/factoringMerge.queries.ts +++ b/test/generated/base/factoringMerge/factoringMerge.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,105 +8,89 @@ import { FactoringMergeModels } from "./factoringMerge.models"; import { FactoringMergeApi } from "./factoringMerge.api"; export namespace FactoringMergeQueries { - export const moduleName = QueryModule.FactoringMerge; +export const moduleName = QueryModule.FactoringMerge; - export const keys = { +export const keys = { all: [moduleName] as const, - getMergeBatch: (officeId: string, batchId: string) => - [...keys.all, "/offices/:officeId/factoring-merge/:batchId", officeId, batchId] as const, - }; + getMergeBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/factoring-merge/:batchId", officeId, batchId] as const, +}; - /** - * Mutation `usePrepareUpload` - * @summary Prepare upload instructions for MOVE files merge - * @permission Requires `canUsePrepareUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { FactoringMergeModels.PrepareFactoringMergeRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const usePrepareUpload = ( - options?: AppMutationOptions< - typeof FactoringMergeApi.prepareUpload, - { officeId: string; data: FactoringMergeModels.PrepareFactoringMergeRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `usePrepareUpload` + * @summary Prepare upload instructions for MOVE files merge + * @permission Requires `canUsePrepareUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { FactoringMergeModels.PrepareFactoringMergeRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const usePrepareUpload = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId })); - return FactoringMergeApi.prepareUpload(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId } )); + return FactoringMergeApi.prepareUpload(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useProcessMerge` - * @summary Start processing the merge batch - * @permission Requires `canUseProcessMerge` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const useProcessMerge = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useProcessMerge` + * @summary Start processing the merge batch + * @permission Requires `canUseProcessMerge` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.batchId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useProcessMerge = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId })); - return FactoringMergeApi.processMerge(officeId, batchId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, batchId } = variables; - const updateKeys = [keys.getMergeBatch(officeId, batchId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, batchId }) => { + checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId } )); + return FactoringMergeApi.processMerge(officeId, batchId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, batchId } = variables; + const updateKeys = [keys.getMergeBatch(officeId, batchId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useGetMergeBatch` - * @summary Get merge batch status - * @permission Requires `canUseGetMergeBatch` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, default] - */ - export const useGetMergeBatch = ( - { officeId, batchId }: { officeId: string; batchId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetMergeBatch` + * @summary Get merge batch status + * @permission Requires `canUseGetMergeBatch` ability + * @param { string } object.officeId Path parameter + * @param { string } object.batchId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, default] + */ +export const useGetMergeBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getMergeBatch(officeId, batchId), + queryFn: () => { + checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId } )); + return FactoringMergeApi.getMergeBatch(officeId, batchId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getMergeBatch(officeId, batchId), - queryFn: () => { - checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId })); - return FactoringMergeApi.getMergeBatch(officeId, batchId, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/files/files.api.ts b/test/generated/base/files/files.api.ts index fd93086..62289b9 100644 --- a/test/generated/base/files/files.api.ts +++ b/test/generated/base/files/files.api.ts @@ -1,96 +1,70 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { FilesModels } from "./files.models"; import { CommonModels } from "@/data/common/common.models"; export namespace FilesApi { - export const createUpload = ( - officeId: string, - folderId: string, - data: FilesModels.CreateFileRequestDTO, - config?: AxiosRequestConfig, - ) => { +export const createUpload = (officeId: string, folderId: string, data: FilesModels.CreateFileRequestDTO, ) => { return AppRestClient.post( - { resSchema: FilesModels.FileUploadResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}/files`, - ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), - config, - ); - }; - - export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: FilesModels.FileUploadResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}/files`, + ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), + + ) +}; +export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/files/eml`, - ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const rename = ( - officeId: string, - fileId: string, - data: FilesModels.RenameFileRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/files/eml`, + ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), + { + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const rename = (officeId: string, fileId: string, data: FilesModels.RenameFileRequestDTO, ) => { return AppRestClient.patch( - { resSchema: CommonModels.FileResponseDTOSchema }, - `/offices/${officeId}/files/${fileId}`, - ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), - config, - ); - }; - - export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.FileResponseDTOSchema }, + `/offices/${officeId}/files/${fileId}`, + ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), + + ) +}; +export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/move`, - ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - config, - ); - }; - - export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/files/move`, + ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), + + ) +}; +export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/copy`, - ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - config, - ); - }; - - export const archive = ( - officeId: string, - data: FilesModels.SetFilesArchivedRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/files/copy`, + ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), + + ) +}; +export const archive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/archive`, - ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - config, - ); - }; - - export const unarchive = ( - officeId: string, - data: FilesModels.SetFilesArchivedRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/files/archive`, + ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), + + ) +}; +export const unarchive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/unarchive`, - ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/files/unarchive`, + ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/files/files.models.ts b/test/generated/base/files/files.models.ts index 2f07427..2ac873f 100644 --- a/test/generated/base/files/files.models.ts +++ b/test/generated/base/files/files.models.ts @@ -1,62 +1,57 @@ import { z } from "zod"; export namespace FilesModels { - /** - * CreateFileRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } mimeType - * @property { number } fileSize Minimum: `0` - */ - export const CreateFileRequestDTOSchema = z - .object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }) - .readonly(); - export type CreateFileRequestDTO = z.infer; +/** + * CreateFileRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } mimeType + * @property { number } fileSize Minimum: `0` + */ +export const CreateFileRequestDTOSchema = z.object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }); +export type CreateFileRequestDTO = z.infer; - /** - * FileUploadResponseDTOSchema - * @type { object } - * @property { string } fileId - * @property { string } method - * @property { string } url - */ - export const FileUploadResponseDTOSchema = z - .object({ fileId: z.string(), method: z.string(), url: z.string() }) - .readonly(); - export type FileUploadResponseDTO = z.infer; +/** + * FileUploadResponseDTOSchema + * @type { object } + * @property { string } fileId + * @property { string } method + * @property { string } url + */ +export const FileUploadResponseDTOSchema = z.object({ fileId: z.string(), method: z.string(), url: z.string() }); +export type FileUploadResponseDTO = z.infer; - /** - * GetFilesEmlRequestDTOSchema - * @type { object } - * @property { string[] } ids Min Items: `1` - */ - export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); - export type GetFilesEmlRequestDTO = z.infer; +/** + * GetFilesEmlRequestDTOSchema + * @type { object } + * @property { string[] } ids Min Items: `1` + */ +export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).min(1) }); +export type GetFilesEmlRequestDTO = z.infer; - /** - * RenameFileRequestDTOSchema - * @type { object } - * @property { string } name - */ - export const RenameFileRequestDTOSchema = z.object({ name: z.string() }).readonly(); - export type RenameFileRequestDTO = z.infer; +/** + * RenameFileRequestDTOSchema + * @type { object } + * @property { string } name + */ +export const RenameFileRequestDTOSchema = z.object({ name: z.string() }); +export type RenameFileRequestDTO = z.infer; - /** - * MoveFilesRequestDTOSchema - * @type { object } - * @property { string[] } fileIds Min Items: `1` - * @property { string } targetFolderId - */ - export const MoveFilesRequestDTOSchema = z - .object({ fileIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }) - .readonly(); - export type MoveFilesRequestDTO = z.infer; +/** + * MoveFilesRequestDTOSchema + * @type { object } + * @property { string[] } fileIds Min Items: `1` + * @property { string } targetFolderId + */ +export const MoveFilesRequestDTOSchema = z.object({ fileIds: z.array(z.string()).min(1), targetFolderId: z.string() }); +export type MoveFilesRequestDTO = z.infer; + +/** + * SetFilesArchivedRequestDTOSchema + * @type { object } + * @property { string[] } ids Min Items: `1` + */ +export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).min(1) }); +export type SetFilesArchivedRequestDTO = z.infer; - /** - * SetFilesArchivedRequestDTOSchema - * @type { object } - * @property { string[] } ids Min Items: `1` - */ - export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); - export type SetFilesArchivedRequestDTO = z.infer; } diff --git a/test/generated/base/files/files.queries.ts b/test/generated/base/files/files.queries.ts index a37c4f3..6e53863 100644 --- a/test/generated/base/files/files.queries.ts +++ b/test/generated/base/files/files.queries.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -7,239 +7,204 @@ import { FilesModels } from "./files.models"; import { FilesApi } from "./files.api"; export namespace FilesQueries { - export const moduleName = QueryModule.Files; - - /** - * Mutation `useCreateUpload` - * @summary Create file upload instructions - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { FilesModels.CreateFileRequestDTO } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateUpload = ( - options?: AppMutationOptions< - typeof FilesApi.createUpload, - { - officeId: string; - folderId: string; - data: FilesModels.CreateFileRequestDTO; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { - const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } +export const moduleName = QueryModule.Files; + + + +/** + * Mutation `useCreateUpload` + * @summary Create file upload instructions + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { FilesModels.CreateFileRequestDTO } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { + const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); } - dataToSend.append("file", file); } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); + dataToSend.append("file", file); } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGetEml` - recommended when file should not be cached + * @summary Get files as EML file with attachments + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.GetFilesEmlRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.getEml(officeId, data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRename` + * @summary Rename file + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.fileId Path parameter + * @param { FilesModels.RenameFileRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useRename = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, fileId, data }) => + FilesApi.rename(officeId, fileId, data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMove` + * @summary Move files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useMove = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.move(officeId, data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopy` + * @summary Copy files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.copy(officeId, data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useArchive` + * @summary Archive files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.archive(officeId, data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnarchive` + * @summary Unarchive files + * @param { string } mutation.officeId Path parameter + * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => + FilesApi.unarchive(officeId, data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGetEml` - recommended when file should not be cached - * @summary Get files as EML file with attachments - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.GetFilesEmlRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGetEml = ( - options?: AppMutationOptions< - typeof FilesApi.getEml, - { officeId: string; data: FilesModels.GetFilesEmlRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FilesApi.getEml(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useRename` - * @summary Rename file - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.fileId Path parameter - * @param { FilesModels.RenameFileRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useRename = ( - options?: AppMutationOptions< - typeof FilesApi.rename, - { officeId: string; fileId: string; data: FilesModels.RenameFileRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, fileId, data }) => FilesApi.rename(officeId, fileId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useMove` - * @summary Move files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useMove = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FilesApi.move(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCopy` - * @summary Copy files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useCopy = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FilesApi.copy(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useArchive = ( - options?: AppMutationOptions< - typeof FilesApi.archive, - { officeId: string; data: FilesModels.SetFilesArchivedRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FilesApi.archive(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions< - typeof FilesApi.unarchive, - { officeId: string; data: FilesModels.SetFilesArchivedRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FilesApi.unarchive(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/folders/folders.api.ts b/test/generated/base/folders/folders.api.ts index eb72bda..b4cd844 100644 --- a/test/generated/base/folders/folders.api.ts +++ b/test/generated/base/folders/folders.api.ts @@ -1,92 +1,60 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { FoldersModels } from "./folders.models"; export namespace FoldersApi { - export const getTree = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { +export const getTree = (officeId: string, folderId: string, ) => { return AppRestClient.get( - { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}/tree`, - config, - ); - }; - - export const getContent = ( - officeId: string, - folderId: string, - limit: number, - order?: FoldersModels.GetContentOrderParam, - filter?: FoldersModels.FolderContentFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}/tree`, + + ) +}; +export const getContent = (officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}`, - { - ...config, - params: { - order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { - type: "query", - name: "order", - }), - filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const rename = ( - officeId: string, - folderId: string, - data: FoldersModels.RenameFolderRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}`, + { + params: { + order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const rename = (officeId: string, folderId: string, data: FoldersModels.RenameFolderRequestDTO, ) => { return AppRestClient.patch( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}`, - ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), - config, - ); - }; - - export const deleteFolder = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete({ resSchema: z.void() }, `/offices/${officeId}/folders/${folderId}`, undefined, config); - }; - - export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders/${folderId}`, + ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), + + ) +}; +export const deleteFolder = (officeId: string, folderId: string, ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/offices/${officeId}/folders/${folderId}`, + + ) +}; +export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, ) => { return AppRestClient.post( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders`, - ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), - config, - ); - }; - - export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: FoldersModels.FolderResponseDTOSchema }, + `/offices/${officeId}/folders`, + ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), + + ) +}; +export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/folders/move`, - ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/folders/move`, + ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/folders/folders.models.ts b/test/generated/base/folders/folders.models.ts index c9908a5..5ca5dda 100644 --- a/test/generated/base/folders/folders.models.ts +++ b/test/generated/base/folders/folders.models.ts @@ -2,132 +2,95 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace FoldersModels { - /** - * TargetEntityNameEnumSchema - * @type { enum } - */ - export const TargetEntityNameEnumSchema = z.enum(["invoice", "quote"]); - export type TargetEntityNameEnum = z.infer; - export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; +/** + * TargetEntityNameEnumSchema + * @type { enum } + */ +export const TargetEntityNameEnumSchema = z.enum(["invoice", "quote"]); +export type TargetEntityNameEnum = z.infer; +export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; - /** - * FolderSymlinkResponseDTOSchema - * @type { object } - * @property { string } targetEntityName - * @property { string } targetEntityId - */ - export const FolderSymlinkResponseDTOSchema = z - .object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }) - .readonly(); - export type FolderSymlinkResponseDTO = z.infer; +/** + * FolderSymlinkResponseDTOSchema + * @type { object } + * @property { string } targetEntityName + * @property { string } targetEntityId + */ +export const FolderSymlinkResponseDTOSchema = z.object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }); +export type FolderSymlinkResponseDTO = z.infer; - /** - * FolderTreeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } isSystem - * @property { boolean } isSymlink - * @property { FolderSymlinkResponseDTO } symlink - * @property { FolderTreeResponseDTO[] } folders - */ - export const FolderTreeResponseDTOSchema = z - .object({ - id: z.string(), - name: z.string(), - isSystem: z.boolean(), - isSymlink: z.boolean(), - symlink: FolderSymlinkResponseDTOSchema.nullable(), - get folders() { - return z.array(FolderTreeResponseDTOSchema).readonly(); - }, - }) - .readonly(); - export type FolderTreeResponseDTO = z.infer; +/** + * FolderTreeResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } isSystem + * @property { boolean } isSymlink + * @property { FolderSymlinkResponseDTO } symlink + * @property { FolderTreeResponseDTO[] } folders + */ +export const FolderTreeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), get folders() { return z.array(FolderTreeResponseDTOSchema) } }); +export type FolderTreeResponseDTO = z.infer; - /** - * FolderResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } archived - * @property { boolean } isSystem - * @property { boolean } isSymlink - * @property { FolderSymlinkResponseDTO } symlink - * @property { string } createdAt - * @property { string } updatedAt - * @property { CommonModels.FolderEmployeeDTO } createdBy - * @property { CommonModels.FolderEmployeeDTO } updatedBy - * @property { CommonModels.FileResponseDTO[] } files - * @property { FolderResponseDTO[] } folders - */ - export const FolderResponseDTOSchema = z - .object({ - id: z.string(), - name: z.string(), - archived: z.boolean(), - isSystem: z.boolean(), - isSymlink: z.boolean(), - symlink: FolderSymlinkResponseDTOSchema.nullable(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - createdBy: CommonModels.FolderEmployeeDTOSchema, - updatedBy: CommonModels.FolderEmployeeDTOSchema, - files: z.array(CommonModels.FileResponseDTOSchema).readonly(), - get folders() { - return z.array(FolderResponseDTOSchema).readonly(); - }, - }) - .readonly(); - export type FolderResponseDTO = z.infer; +/** + * FolderResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { boolean } archived + * @property { boolean } isSystem + * @property { boolean } isSymlink + * @property { FolderSymlinkResponseDTO } symlink + * @property { string } createdAt + * @property { string } updatedAt + * @property { CommonModels.FolderEmployeeDTO } createdBy + * @property { CommonModels.FolderEmployeeDTO } updatedBy + * @property { CommonModels.FileResponseDTO[] } files + * @property { FolderResponseDTO[] } folders + */ +export const FolderResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, files: z.array(CommonModels.FileResponseDTOSchema), get folders() { return z.array(FolderResponseDTOSchema) } }); +export type FolderResponseDTO = z.infer; - /** - * FolderContentFilterDtoSchema - * @type { object } - * @property { boolean } archived When omitted, both archived and unarchived files are returned. - */ - export const FolderContentFilterDtoSchema = z - .object({ archived: z.boolean().describe("When omitted, both archived and unarchived files are returned.") }) - .readonly(); - export type FolderContentFilterDto = z.infer; +/** + * FolderContentFilterDtoSchema + * @type { object } + * @property { boolean } archived When omitted, both archived and unarchived files are returned. + */ +export const FolderContentFilterDtoSchema = z.object({ archived: z.boolean().nullable() }).partial(); +export type FolderContentFilterDto = z.infer; - /** - * CreateFolderRequestDTOSchema - * @type { object } - * @property { string } parentFolderId - * @property { string } name - */ - export const CreateFolderRequestDTOSchema = z.object({ parentFolderId: z.string(), name: z.string() }).readonly(); - export type CreateFolderRequestDTO = z.infer; +/** + * CreateFolderRequestDTOSchema + * @type { object } + * @property { string } parentFolderId + * @property { string } name + */ +export const CreateFolderRequestDTOSchema = z.object({ parentFolderId: z.string(), name: z.string() }); +export type CreateFolderRequestDTO = z.infer; - /** - * RenameFolderRequestDTOSchema - * @type { object } - * @property { string } name - */ - export const RenameFolderRequestDTOSchema = z.object({ name: z.string() }).readonly(); - export type RenameFolderRequestDTO = z.infer; +/** + * RenameFolderRequestDTOSchema + * @type { object } + * @property { string } name + */ +export const RenameFolderRequestDTOSchema = z.object({ name: z.string() }); +export type RenameFolderRequestDTO = z.infer; - /** - * MoveFoldersRequestDTOSchema - * @type { object } - * @property { string[] } folderIds Min Items: `1` - * @property { string } targetFolderId - */ - export const MoveFoldersRequestDTOSchema = z - .object({ folderIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }) - .readonly(); - export type MoveFoldersRequestDTO = z.infer; +/** + * MoveFoldersRequestDTOSchema + * @type { object } + * @property { string[] } folderIds Min Items: `1` + * @property { string } targetFolderId + */ +export const MoveFoldersRequestDTOSchema = z.object({ folderIds: z.array(z.string()).min(1), targetFolderId: z.string() }); +export type MoveFoldersRequestDTO = z.infer; + +/** + * GetContentOrderParamSchema + * @type { array } + * @description Example: `name` + */ +export const GetContentOrderParamSchema = z.array(z.string()).nullish(); +export type GetContentOrderParam = z.infer; - /** - * GetContentOrderParamSchema - * @type { array } - * @description Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - */ - export const GetContentOrderParamSchema = z - .array(z.string()) - .readonly() - .describe("Order by fields (comma separated with +/- prefix): name, createdAt") - .nullish(); - export type GetContentOrderParam = z.infer; } diff --git a/test/generated/base/folders/folders.queries.ts b/test/generated/base/folders/folders.queries.ts index ce4299d..0174720 100644 --- a/test/generated/base/folders/folders.queries.ts +++ b/test/generated/base/folders/folders.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -7,273 +6,182 @@ import { FoldersModels } from "./folders.models"; import { FoldersApi } from "./folders.api"; export namespace FoldersQueries { - export const moduleName = QueryModule.Folders; +export const moduleName = QueryModule.Folders; - export const keys = { +export const keys = { all: [moduleName] as const, - getTree: (officeId: string, folderId: string) => - [...keys.all, "/offices/:officeId/folders/:folderId/tree", officeId, folderId] as const, - getContent: ( - officeId: string, - folderId: string, - limit?: number, - order?: FoldersModels.GetContentOrderParam, - filter?: FoldersModels.FolderContentFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/folders/:folderId", - officeId, - folderId, - limit, - order, - filter, - page, - cursor, - ] as const, - getContentInfinite: ( - officeId: string, - folderId: string, - limit?: number, - order?: FoldersModels.GetContentOrderParam, - filter?: FoldersModels.FolderContentFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/folders/:folderId", - "infinite", - officeId, - folderId, - limit, - order, - filter, - cursor, - ] as const, - }; + getTree: (officeId: string, folderId: string) => [...keys.all, "/offices/:officeId/folders/:folderId/tree", officeId, folderId] as const, + getContent: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", officeId, folderId, limit, order, filter, page, cursor] as const, + getContentInfinite: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", "infinite", officeId, folderId, limit, order, filter, cursor] as const, +}; - /** - * Query `useGetTree` - * @summary Get folder tree - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetTree = ( - { officeId, folderId }: { officeId: string; folderId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getTree(officeId, folderId), - queryFn: () => FoldersApi.getTree(officeId, folderId, config), - ...options, - }); - }; +/** + * Query `useGetTree` + * @summary Get folder tree + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetTree = ({ officeId, folderId }: { officeId: string, folderId: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.getTree(officeId, folderId), + queryFn: () => + FoldersApi.getTree(officeId, folderId), + ...options, + }); +}; - /** - * Query `useGetContent` - * @summary Get folder content - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetContent = ( - { - officeId, - folderId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - folderId: string; - limit: number; - order?: FoldersModels.GetContentOrderParam; - filter?: FoldersModels.FolderContentFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), - queryFn: () => FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor, config), - ...options, - }); - }; +/** + * Query `useGetContent` + * @summary Get folder content + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetContent = ({ officeId, folderId, limit, order, filter, page, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), + queryFn: () => + FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor), + ...options, + }); +}; + +/** + * Infinite query `useGetContentInfinite + * @summary Get folder content + * @param { string } object.officeId Path parameter + * @param { string } object.folderId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetContentInfinite = ({ officeId, folderId, limit, order, filter, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - /** - * Infinite query `useGetContentInfinite - * @summary Get folder content - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useGetContentInfinite = ( - { - officeId, - folderId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - folderId: string; - limit: number; - order?: FoldersModels.GetContentOrderParam; - filter?: FoldersModels.FolderContentFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => + FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => - FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Mutation `useRename` - * @summary Rename folder - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { FoldersModels.RenameFolderRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useRename = ( - options?: AppMutationOptions< - typeof FoldersApi.rename, - { officeId: string; folderId: string; data: FoldersModels.RenameFolderRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useRename` + * @summary Rename folder + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { FoldersModels.RenameFolderRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useRename = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, folderId, data }) => FoldersApi.rename(officeId, folderId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, folderId, data }) => + FoldersApi.rename(officeId, folderId, data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useDeleteFolder` - * @summary Delete folder - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteFolder = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useDeleteFolder` + * @summary Delete folder + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.folderId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteFolder = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, folderId }) => FoldersApi.deleteFolder(officeId, folderId, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, folderId }) => + FoldersApi.deleteFolder(officeId, folderId) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create folder - * @param { string } mutation.officeId Path parameter - * @param { FoldersModels.CreateFolderRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof FoldersApi.create, - { officeId: string; data: FoldersModels.CreateFolderRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create folder + * @param { string } mutation.officeId Path parameter + * @param { FoldersModels.CreateFolderRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, data }) => FoldersApi.create(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, data }) => + FoldersApi.create(officeId, data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMove` + * @summary Move folders + * @param { string } mutation.officeId Path parameter + * @param { FoldersModels.MoveFoldersRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useMove = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useMove` - * @summary Move folders - * @param { string } mutation.officeId Path parameter - * @param { FoldersModels.MoveFoldersRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useMove = ( - options?: AppMutationOptions< - typeof FoldersApi.move, - { officeId: string; data: FoldersModels.MoveFoldersRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, data }) => + FoldersApi.move(officeId, data) +, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, data }) => FoldersApi.move(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/hsCodes/hsCodes.acl.ts b/test/generated/base/hsCodes/hsCodes.acl.ts index e893613..3e48e9d 100644 --- a/test/generated/base/hsCodes/hsCodes.acl.ts +++ b/test/generated/base/hsCodes/hsCodes.acl.ts @@ -1,45 +1,74 @@ import { AbilityTuple } from "@casl/ability"; export namespace HsCodesAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "HsCode"] as AbilityTuple<"Create", "HsCode">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "HsCode"] as AbilityTuple<"Update", "HsCode">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "HsCode"] as AbilityTuple<"Archive", "HsCode">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "HsCode"] as AbilityTuple<"Archive", "HsCode">; +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "HsCode" +] as AbilityTuple<"Read", "HsCode">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "HsCode" +] as AbilityTuple<"Create", "HsCode">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "HsCode" +] as AbilityTuple<"Read", "HsCode">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "HsCode" +] as AbilityTuple<"Read", "HsCode">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "HsCode" +] as AbilityTuple<"Update", "HsCode">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "HsCode" +] as AbilityTuple<"Archive", "HsCode">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "HsCode" +] as AbilityTuple<"Archive", "HsCode">; + } diff --git a/test/generated/base/hsCodes/hsCodes.api.ts b/test/generated/base/hsCodes/hsCodes.api.ts index 98854f3..59dece6 100644 --- a/test/generated/base/hsCodes/hsCodes.api.ts +++ b/test/generated/base/hsCodes/hsCodes.api.ts @@ -1,123 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { HsCodesModels } from "./hsCodes.models"; export namespace HsCodesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: HsCodesModels.HsCodePaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, `/hs-codes`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, + `/hs-codes`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, ) => { return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes`, - ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), - config, - ); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: HsCodesModels.HsCodeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes`, + ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), + + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, - `/hs-codes/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: HsCodesModels.HsCodeResponseDTOSchema }, `/hs-codes/${id}`, config); - }; - - export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, + `/hs-codes/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, ) => { + return AppRestClient.get( + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}`, + + ) +}; +export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, ) => { return AppRestClient.patch( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}`, - ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}`, + ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, ) => { return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, + `/hs-codes/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/hsCodes/hsCodes.configs.ts b/test/generated/base/hsCodes/hsCodes.configs.ts index a69eec4..5b005a1 100644 --- a/test/generated/base/hsCodes/hsCodes.configs.ts +++ b/test/generated/base/hsCodes/hsCodes.configs.ts @@ -6,114 +6,115 @@ import { HsCodesQueries } from "./hsCodes.queries"; import { HsCodesAcl } from "./hsCodes.acl"; export namespace HsCodesConfigs { - export const hsCodesConfig = { +export const hsCodesConfig = { meta: { - title: "Hs Codes", + title: "Hs Codes", }, readAll: { - acl: HsCodesAcl.canUsePaginate, - schema: HsCodesModels.HsCodeResponseDTOSchema, - paginated: HsCodesQueries.usePaginate, - infinite: HsCodesQueries.usePaginateInfinite, - filters: { - schema: HsCodesModels.HsCodePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: HsCodesModels.HsCodePaginationFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: HsCodesAcl.canUsePaginate, schema: HsCodesModels.HsCodeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - description: true, - customArea: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: HsCodesModels.HsCodesPaginateOrderParamEnumSchema, + paginated: HsCodesQueries.usePaginate, + infinite: HsCodesQueries.usePaginateInfinite, + filters: { + schema: HsCodesModels.HsCodePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: HsCodesModels.HsCodePaginationFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: HsCodesModels.HsCodeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + description: true, + customArea: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: HsCodesModels.HsCodesPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: HsCodesAcl.canUseFindById, - schema: HsCodesModels.HsCodeResponseDTOSchema, - query: HsCodesQueries.useFindById, + acl: HsCodesAcl.canUseFindById, + schema: HsCodesModels.HsCodeResponseDTOSchema, + query: HsCodesQueries.useFindById, }, create: { - acl: HsCodesAcl.canUseCreate, - schema: HsCodesModels.CreateHsCodeRequestDTOSchema, - mutation: HsCodesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: HsCodesAcl.canUseCreate, schema: HsCodesModels.CreateHsCodeRequestDTOSchema, - options: { - inputs: { - name: true, - description: true, - customArea: true, - }, - }, - }), + mutation: HsCodesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: HsCodesModels.CreateHsCodeRequestDTOSchema, + options: { + inputs: { + name: true, + description: true, + customArea: true, + }, + }, +}) }, update: { - acl: HsCodesAcl.canUseUpdate, - schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, - mutation: HsCodesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: HsCodesAcl.canUseUpdate, schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, - options: { - inputs: { - name: true, - description: true, - customArea: true, - }, - }, - }), + mutation: HsCodesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, + options: { + inputs: { + name: true, + description: true, + customArea: true, + }, + }, +}) }, - }; +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: HsCodesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: HsCodesQueries.usePaginateLabels, - infinite: HsCodesQueries.usePaginateLabelsInfinite, - filters: { - schema: HsCodesModels.HsCodeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: HsCodesModels.HsCodeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: HsCodesAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema, + paginated: HsCodesQueries.usePaginateLabels, + infinite: HsCodesQueries.usePaginateLabelsInfinite, + filters: { + schema: HsCodesModels.HsCodeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: HsCodesModels.HsCodeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/hsCodes/hsCodes.models.ts b/test/generated/base/hsCodes/hsCodes.models.ts index 2631d56..a2d7cf2 100644 --- a/test/generated/base/hsCodes/hsCodes.models.ts +++ b/test/generated/base/hsCodes/hsCodes.models.ts @@ -2,157 +2,110 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace HsCodesModels { - /** - * HsCodeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type HsCodeEmployeeDTO = z.infer; +/** + * HsCodeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type HsCodeEmployeeDTO = z.infer; - /** - * HsCodeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the HS Code - * @property { string } name Name of the HS Code - * @property { string } description Description of the HS Code - * @property { string } customArea Custom area associated with the HS Code - * @property { boolean } archived Indicates if the HS Code is archived - * @property { string } createdById - * @property { HsCodeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { HsCodeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const HsCodeResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier for the HS Code"), - name: z.string().describe("Name of the HS Code"), - description: z.string().describe("Description of the HS Code"), - customArea: z.string().describe("Custom area associated with the HS Code"), - archived: z.boolean().describe("Indicates if the HS Code is archived"), - createdById: z.string().nullish(), - createdBy: HsCodeEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: HsCodeEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type HsCodeResponseDTO = z.infer; +/** + * HsCodeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the HS Code + * @property { string } name Name of the HS Code + * @property { string } description Description of the HS Code + * @property { string } customArea Custom area associated with the HS Code + * @property { boolean } archived Indicates if the HS Code is archived + * @property { string } createdById + * @property { HsCodeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { HsCodeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const HsCodeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), description: z.string(), customArea: z.string(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: HsCodeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: HsCodeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type HsCodeResponseDTO = z.infer; - /** - * HsCodePaginationFilterDtoSchema - * @type { object } - * @property { boolean } archived Archived status - * @property { string } search - */ - export const HsCodePaginationFilterDtoSchema = z - .object({ archived: z.boolean().describe("Archived status"), search: z.string() }) - .readonly(); - export type HsCodePaginationFilterDto = z.infer; +/** + * HsCodePaginationFilterDtoSchema + * @type { object } + * @property { boolean } archived Archived status + * @property { string } search + */ +export const HsCodePaginationFilterDtoSchema = z.object({ archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); +export type HsCodePaginationFilterDto = z.infer; - /** - * HsCodeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const HsCodeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type HsCodeLabelFilterDto = z.infer; +/** + * HsCodeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const HsCodeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type HsCodeLabelFilterDto = z.infer; - /** - * CreateHsCodeRequestDTOSchema - * @type { object } - * @property { string } name Unique name for the HS Code - * @property { string } description Description of the HS Code - * @property { string } customArea Custom area associated with the HS Code - */ - export const CreateHsCodeRequestDTOSchema = z - .object({ - name: z.string().describe("Unique name for the HS Code"), - description: z.string().describe("Description of the HS Code"), - customArea: z.string().describe("Custom area associated with the HS Code"), - }) - .readonly(); - export type CreateHsCodeRequestDTO = z.infer; +/** + * CreateHsCodeRequestDTOSchema + * @type { object } + * @property { string } name Unique name for the HS Code + * @property { string } description Description of the HS Code + * @property { string } customArea Custom area associated with the HS Code + */ +export const CreateHsCodeRequestDTOSchema = z.object({ name: z.string(), description: z.string(), customArea: z.string() }); +export type CreateHsCodeRequestDTO = z.infer; - /** - * UpdateHsCodeRequestDTOSchema - * @type { object } - * @property { string } name Updated name of the HS Code. - * @property { string } description Updated description of the HS Code. - * @property { string } customArea Updated custom area associated with the HS Code. - */ - export const UpdateHsCodeRequestDTOSchema = z - .object({ - name: z.string().describe("Updated name of the HS Code."), - description: z.string().describe("Updated description of the HS Code."), - customArea: z.string().describe("Updated custom area associated with the HS Code."), - }) - .readonly(); - export type UpdateHsCodeRequestDTO = z.infer; +/** + * UpdateHsCodeRequestDTOSchema + * @type { object } + * @property { string } name Updated name of the HS Code. + * @property { string } description Updated description of the HS Code. + * @property { string } customArea Updated custom area associated with the HS Code. + */ +export const UpdateHsCodeRequestDTOSchema = z.object({ name: z.string().nullable(), description: z.string().nullable(), customArea: z.string().nullable() }).partial(); +export type UpdateHsCodeRequestDTO = z.infer; - /** - * HsCodesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const HsCodesPaginateOrderParamEnumSchema = z.enum([ - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "name", - ]); - export type HsCodesPaginateOrderParamEnum = z.infer; - export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema.enum; +/** + * HsCodesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const HsCodesPaginateOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type HsCodesPaginateOrderParamEnum = z.infer; +export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema.enum; - /** - * HsCodesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { HsCodeResponseDTO[] } items - */ - export const HsCodesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(HsCodeResponseDTOSchema).readonly() }).readonly().shape, - }); - export type HsCodesPaginateResponse = z.infer; +/** + * HsCodesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { HsCodeResponseDTO[] } items + */ +export const HsCodesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(HsCodeResponseDTOSchema).nullable() }).partial().shape }); +export type HsCodesPaginateResponse = z.infer; - /** - * HsCodesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const HsCodesPaginateLabelsOrderParamEnumSchema = z.enum([ - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "name", - ]); - export type HsCodesPaginateLabelsOrderParamEnum = z.infer; - export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderParamEnumSchema.enum; +/** + * HsCodesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const HsCodesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); +export type HsCodesPaginateLabelsOrderParamEnum = z.infer; +export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * HsCodesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const HsCodesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type HsCodesPaginateLabelsResponse = z.infer; - /** - * HsCodesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const HsCodesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type HsCodesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/hsCodes/hsCodes.queries.ts b/test/generated/base/hsCodes/hsCodes.queries.ts index fb9390b..5722f0d 100644 --- a/test/generated/base/hsCodes/hsCodes.queries.ts +++ b/test/generated/base/hsCodes/hsCodes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,345 +8,257 @@ import { HsCodesModels } from "./hsCodes.models"; import { HsCodesApi } from "./hsCodes.api"; export namespace HsCodesQueries { - export const moduleName = QueryModule.HsCodes; +export const moduleName = QueryModule.HsCodes; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: HsCodesModels.HsCodePaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/hs-codes", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: HsCodesModels.HsCodePaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/hs-codes", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: HsCodesModels.HsCodeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/hs-codes/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: HsCodesModels.HsCodeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/hs-codes/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string) => [...keys.all, "/hs-codes", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/hs-codes/:id", id] as const, - }; +}; - /** - * Query `usePaginate` - * @summary Paginate HS Codes - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: HsCodesModels.HsCodePaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginate` + * @summary Paginate HS Codes + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(HsCodesAcl.canUsePaginate()); + return HsCodesApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateInfinite - * @summary Paginate HS Codes - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: HsCodesModels.HsCodePaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateInfinite + * @summary Paginate HS Codes + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create a new HS Code - * @permission Requires `canUseCreate` ability - * @param { HsCodesModels.CreateHsCodeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(HsCodesAcl.canUsePaginate()); + return HsCodesApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(HsCodesAcl.canUseCreate()); - return HsCodesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useCreate` + * @summary Create a new HS Code + * @permission Requires `canUseCreate` ability + * @param { HsCodesModels.CreateHsCodeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `usePaginateLabels` - * @summary Paginate HS codes with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: HsCodesModels.HsCodeLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(HsCodesAcl.canUseCreate()); + return HsCodesApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate HS codes with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(HsCodesAcl.canUsePaginateLabels()); + return HsCodesApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate HS codes with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: HsCodesModels.HsCodeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate HS codes with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` + * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(HsCodesAcl.canUsePaginateLabels()); + return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useFindById` - * @summary Get HS Code Details by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get HS Code Details by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(HsCodesAcl.canUseFindById()); + return HsCodesApi.findById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(HsCodesAcl.canUseFindById()); - return HsCodesApi.findById(id, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update an existing HS Code + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { HsCodesModels.UpdateHsCodeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update an existing HS Code - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { HsCodesModels.UpdateHsCodeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(HsCodesAcl.canUseUpdate()); + return HsCodesApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(HsCodesAcl.canUseUpdate()); - return HsCodesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive an HS Code + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive an HS Code - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(HsCodesAcl.canUseArchive()); + return HsCodesApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(HsCodesAcl.canUseArchive()); - return HsCodesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive an HS Code + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive an HS Code - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(HsCodesAcl.canUseUnarchive()); + return HsCodesApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(HsCodesAcl.canUseUnarchive()); - return HsCodesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/integrationChannels/integrationChannels.acl.ts b/test/generated/base/integrationChannels/integrationChannels.acl.ts index 497b407..de4ba2a 100644 --- a/test/generated/base/integrationChannels/integrationChannels.acl.ts +++ b/test/generated/base/integrationChannels/integrationChannels.acl.ts @@ -1,99 +1,108 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace IntegrationChannelsAcl { - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List integration channels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Read", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List integration channels + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Create", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Create", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Read integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Read", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Read integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Update", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Archive", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Archive", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive integration channel + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - /** - * Use for `useTestConnection` mutation ability. For global ability, omit the object parameter. - * @description Test integration channel connection - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTestConnection` mutation - */ - export const canUseTestConnection = (object?: { officeId: string }) => - ["Update", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Update", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; +/** + * Use for `useTestConnection` mutation ability. For global ability, omit the object parameter. + * @description Test integration channel connection + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTestConnection` mutation + */ +export const canUseTestConnection = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("IntegrationChannel", object) : "IntegrationChannel" +] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; + +/** + * Use for `useListMessages` query ability. For global ability, omit the object parameter. + * @description List integration channel messages + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListMessages` query + */ +export const canUseListMessages = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("IntegrationMessage", object) : "IntegrationMessage" +] as AbilityTuple<"Read", "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, }>; - /** - * Use for `useListMessages` query ability. For global ability, omit the object parameter. - * @description List integration channel messages - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListMessages` query - */ - export const canUseListMessages = (object?: { officeId: string }) => - ["Read", object ? subject("IntegrationMessage", object) : "IntegrationMessage"] as AbilityTuple< - "Read", - "IntegrationMessage" | (ForcedSubject<"IntegrationMessage"> & { officeId: string }) - >; } diff --git a/test/generated/base/integrationChannels/integrationChannels.api.ts b/test/generated/base/integrationChannels/integrationChannels.api.ts index a01d120..0835e70 100644 --- a/test/generated/base/integrationChannels/integrationChannels.api.ts +++ b/test/generated/base/integrationChannels/integrationChannels.api.ts @@ -1,152 +1,81 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { IntegrationChannelsModels } from "./integrationChannels.models"; export namespace IntegrationChannelsApi { - export const list = ( - officeId: string, - limit: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const list = (officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, - `/offices/${officeId}/integration-channels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = ( - officeId: string, - data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, + `/offices/${officeId}/integration-channels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, ) => { return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels`, - ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), - config, - ); - }; - - export const findById = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels`, + ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), + + ) +}; +export const findById = (officeId: string, id: string, ) => { return AppRestClient.get( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}`, - config, - ); - }; - - export const update = ( - officeId: string, - id: string, - data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}`, + + ) +}; +export const update = (officeId: string, id: string, data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, ) => { return AppRestClient.patch( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}`, - ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), - config, - ); - }; - - export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}`, + ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), + + ) +}; +export const archive = (officeId: string, id: string, ) => { return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/archive`, + + ) +}; +export const unarchive = (officeId: string, id: string, ) => { return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/unarchive`, - undefined, - config, - ); - }; - - export const testConnection = (officeId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/unarchive`, + + ) +}; +export const testConnection = (officeId: string, id: string, ) => { return AppRestClient.post( - { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/test-connection`, - undefined, - config, - ); - }; - - export const listMessages = ( - officeId: string, - id: string, - limit: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, + `/offices/${officeId}/integration-channels/${id}/test-connection`, + + ) +}; +export const listMessages = (officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, - `/offices/${officeId}/integration-channels/${id}/messages`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; + { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, + `/offices/${officeId}/integration-channels/${id}/messages`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; } diff --git a/test/generated/base/integrationChannels/integrationChannels.configs.ts b/test/generated/base/integrationChannels/integrationChannels.configs.ts index 4105a84..1b6f063 100644 --- a/test/generated/base/integrationChannels/integrationChannels.configs.ts +++ b/test/generated/base/integrationChannels/integrationChannels.configs.ts @@ -5,150 +5,151 @@ import { IntegrationChannelsQueries } from "./integrationChannels.queries"; import { IntegrationChannelsAcl } from "./integrationChannels.acl"; export namespace IntegrationChannelsConfigs { - export const integrationChannelsConfig = { +export const integrationChannelsConfig = { meta: { - title: "Integration Channels", + title: "Integration Channels", }, readAll: { - acl: IntegrationChannelsAcl.canUseList, - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - paginated: IntegrationChannelsQueries.useList, - infinite: IntegrationChannelsQueries.useListInfinite, - filters: { - schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: IntegrationChannelsAcl.canUseList, schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - options: { - columns: { - id: true, - officeId: true, - businessPartnerId: true, - businessPartner: true, - employeeId: true, - name: true, - archived: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - lastPolledAt: true, - createdAt: true, - createdById: true, - createdBy: true, - updatedAt: true, - updatedById: true, - updatedBy: true, - }, - sortable: IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema, + paginated: IntegrationChannelsQueries.useList, + infinite: IntegrationChannelsQueries.useListInfinite, + filters: { + schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + options: { + columns: { + id: true, + officeId: true, + businessPartnerId: true, + businessPartner: true, + employeeId: true, + name: true, + archived: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + lastPolledAt: true, + createdAt: true, + createdById: true, + createdBy: true, + updatedAt: true, + updatedById: true, + updatedBy: true, + }, + sortable: IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema, + }, +}), }, read: { - acl: IntegrationChannelsAcl.canUseFindById, - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - query: IntegrationChannelsQueries.useFindById, + acl: IntegrationChannelsAcl.canUseFindById, + schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, + query: IntegrationChannelsQueries.useFindById, }, create: { - acl: IntegrationChannelsAcl.canUseCreate, - schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, - mutation: IntegrationChannelsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: IntegrationChannelsAcl.canUseCreate, schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, - options: { - inputs: { - businessPartnerId: true, - employeeId: true, - name: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - sftpPassword: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - }, - }, - }), + mutation: IntegrationChannelsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, + options: { + inputs: { + businessPartnerId: true, + employeeId: true, + name: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + sftpPassword: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + }, + }, +}) }, update: { - acl: IntegrationChannelsAcl.canUseUpdate, - schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, - mutation: IntegrationChannelsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: IntegrationChannelsAcl.canUseUpdate, schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, - options: { - inputs: { - businessPartnerId: true, - employeeId: true, - name: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - sftpPassword: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - }, - }, - }), + mutation: IntegrationChannelsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, + options: { + inputs: { + businessPartnerId: true, + employeeId: true, + name: true, + sftpHost: true, + sftpPort: true, + sftpUsername: true, + sftpPassword: true, + inboundPath: true, + outboundPath: true, + pollingFrequencyMinutes: true, + }, + }, +}) }, - }; +}; - export const messagesConfig = { +export const messagesConfig = { meta: { - title: "Messages", + title: "Messages", }, readAll: { - acl: IntegrationChannelsAcl.canUseListMessages, - schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, - paginated: IntegrationChannelsQueries.useListMessages, - infinite: IntegrationChannelsQueries.useListMessagesInfinite, - filters: { - schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, - options: { - inputs: { - direction: true, - format: true, - status: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: IntegrationChannelsAcl.canUseListMessages, schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, - options: { - columns: { - id: true, - integrationChannelId: true, - positionId: true, - positionNumber: true, - direction: true, - format: true, - status: true, - rawContent: true, - fileName: true, - errorMessage: true, - processedAt: true, - sentAt: true, - createdAt: true, - }, - sortable: IntegrationChannelsModels.ListMessagesOrderParamEnumSchema, + paginated: IntegrationChannelsQueries.useListMessages, + infinite: IntegrationChannelsQueries.useListMessagesInfinite, + filters: { + schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, + options: { + inputs: { + direction: true, + format: true, + status: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, + options: { + columns: { + id: true, + integrationChannelId: true, + positionId: true, + positionNumber: true, + direction: true, + format: true, + status: true, + rawContent: true, + fileName: true, + errorMessage: true, + processedAt: true, + sentAt: true, + createdAt: true, }, - }; + sortable: IntegrationChannelsModels.ListMessagesOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/integrationChannels/integrationChannels.models.ts b/test/generated/base/integrationChannels/integrationChannels.models.ts index cbd4d90..543e8a7 100644 --- a/test/generated/base/integrationChannels/integrationChannels.models.ts +++ b/test/generated/base/integrationChannels/integrationChannels.models.ts @@ -2,282 +2,196 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace IntegrationChannelsModels { - /** - * IntegrationChannelBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const IntegrationChannelBusinessPartnerResponseDtoSchema = z - .object({ id: z.string(), name: z.string() }) - .readonly(); - export type IntegrationChannelBusinessPartnerResponseDto = z.infer< - typeof IntegrationChannelBusinessPartnerResponseDtoSchema - >; +/** + * IntegrationChannelBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const IntegrationChannelBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type IntegrationChannelBusinessPartnerResponseDto = z.infer; + +/** + * IntegrationChannelEmployeeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const IntegrationChannelEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type IntegrationChannelEmployeeResponseDto = z.infer; + +/** + * IntegrationChannelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } businessPartnerId + * @property { IntegrationChannelBusinessPartnerResponseDto } businessPartner + * @property { string } employeeId + * @property { string } name + * @property { boolean } archived + * @property { string } sftpHost + * @property { number } sftpPort + * @property { string } sftpUsername + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes + * @property { string } lastPolledAt + * @property { string } createdAt + * @property { string } createdById + * @property { IntegrationChannelEmployeeResponseDto } createdBy + * @property { string } updatedAt + * @property { string } updatedById + * @property { IntegrationChannelEmployeeResponseDto } updatedBy + */ +export const IntegrationChannelResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), businessPartnerId: z.string(), businessPartner: IntegrationChannelBusinessPartnerResponseDtoSchema, employeeId: z.string(), name: z.string(), archived: z.boolean(), sftpHost: z.string(), sftpPort: z.number(), sftpUsername: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number(), lastPolledAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), createdById: z.string(), createdBy: IntegrationChannelEmployeeResponseDtoSchema, updatedAt: z.iso.datetime({ offset: true }), updatedById: z.string(), updatedBy: IntegrationChannelEmployeeResponseDtoSchema }); +export type IntegrationChannelResponseDto = z.infer; + +/** + * IntegrationMessageDirectionEnumSchema + * @type { enum } + */ +export const IntegrationMessageDirectionEnumSchema = z.enum(["Inbound", "Outbound"]); +export type IntegrationMessageDirectionEnum = z.infer; +export const IntegrationMessageDirectionEnum = IntegrationMessageDirectionEnumSchema.enum; + +/** + * IntegrationMessageFormatEnumSchema + * @type { enum } + */ +export const IntegrationMessageFormatEnumSchema = z.enum(["IFTMBF", "IFTMBC"]); +export type IntegrationMessageFormatEnum = z.infer; +export const IntegrationMessageFormatEnum = IntegrationMessageFormatEnumSchema.enum; + +/** + * IntegrationMessageStatusEnumSchema + * @type { enum } + */ +export const IntegrationMessageStatusEnumSchema = z.enum(["Received", "Processed", "Failed", "Sent"]); +export type IntegrationMessageStatusEnum = z.infer; +export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.enum; + +/** + * IntegrationMessageFilterDtoSchema + * @type { object } + * @property { IntegrationMessageDirectionEnum } direction + * @property { IntegrationMessageFormatEnum } format + * @property { IntegrationMessageStatusEnum } status + * @property { string } search + */ +export const IntegrationMessageFilterDtoSchema = z.object({ direction: IntegrationMessageDirectionEnumSchema.nullable(), format: IntegrationMessageFormatEnumSchema.nullable(), status: IntegrationMessageStatusEnumSchema.nullable(), search: z.string().nullable() }).partial(); +export type IntegrationMessageFilterDto = z.infer; + +/** + * IntegrationChannelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const IntegrationChannelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type IntegrationChannelFilterDto = z.infer; + +/** + * CreateIntegrationChannelRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } employeeId + * @property { string } name + * @property { string } sftpHost + * @property { number } sftpPort Minimum: `1`. Maximum: `65535` + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes Minimum: `1` + */ +export const CreateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string(), employeeId: z.string(), name: z.string(), sftpHost: z.string(), sftpPort: z.number().gte(1).lte(65535), sftpUsername: z.string(), sftpPassword: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number().gte(1) }); +export type CreateIntegrationChannelRequestDto = z.infer; + +/** + * UpdateIntegrationChannelRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } employeeId + * @property { string } name + * @property { string } sftpHost + * @property { number } sftpPort Minimum: `1`. Maximum: `65535` + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } inboundPath + * @property { string } outboundPath + * @property { number } pollingFrequencyMinutes Minimum: `1` + */ +export const UpdateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string().nullable(), employeeId: z.string().nullable(), name: z.string().nullable(), sftpHost: z.string().nullable(), sftpPort: z.number().gte(1).lte(65535).nullable(), sftpUsername: z.string().nullable(), sftpPassword: z.string().nullable(), inboundPath: z.string().nullable(), outboundPath: z.string().nullable(), pollingFrequencyMinutes: z.number().gte(1).nullable() }).partial(); +export type UpdateIntegrationChannelRequestDto = z.infer; + +/** + * TestConnectionResponseDtoSchema + * @type { object } + * @property { boolean } success + */ +export const TestConnectionResponseDtoSchema = z.object({ success: z.boolean() }); +export type TestConnectionResponseDto = z.infer; + +/** + * IntegrationMessageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } integrationChannelId + * @property { string } positionId + * @property { string } positionNumber + * @property { string } direction + * @property { string } format + * @property { string } status + * @property { string } rawContent + * @property { string } fileName + * @property { string } errorMessage + * @property { string } processedAt + * @property { string } sentAt + * @property { string } createdAt + */ +export const IntegrationMessageResponseDtoSchema = z.object({ id: z.string(), integrationChannelId: z.string(), positionId: z.string().nullish(), positionNumber: z.string().nullish(), direction: z.string(), format: z.string(), status: z.string(), rawContent: z.string(), fileName: z.string(), errorMessage: z.string().nullish(), processedAt: z.iso.datetime({ offset: true }).nullish(), sentAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }) }); +export type IntegrationMessageResponseDto = z.infer; + +/** + * IntegrationChannelsListOrderParamEnumSchema + * @type { enum } + */ +export const IntegrationChannelsListOrderParamEnumSchema = z.enum(["createdAt", "name", "businessPartner", "lastPolledAt"]); +export type IntegrationChannelsListOrderParamEnum = z.infer; +export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrderParamEnumSchema.enum; + +/** + * IntegrationChannelsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { IntegrationChannelResponseDto[] } items + */ +export const IntegrationChannelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).nullable() }).partial().shape }); +export type IntegrationChannelsListResponse = z.infer; + +/** + * ListMessagesOrderParamEnumSchema + * @type { enum } + */ +export const ListMessagesOrderParamEnumSchema = z.enum(["createdAt", "status", "direction", "format"]); +export type ListMessagesOrderParamEnum = z.infer; +export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; + +/** + * ListMessagesResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { IntegrationMessageResponseDto[] } items + */ +export const ListMessagesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).nullable() }).partial().shape }); +export type ListMessagesResponse = z.infer; - /** - * IntegrationChannelEmployeeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const IntegrationChannelEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type IntegrationChannelEmployeeResponseDto = z.infer; - - /** - * IntegrationChannelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } businessPartnerId - * @property { IntegrationChannelBusinessPartnerResponseDto } businessPartner - * @property { string } employeeId - * @property { string } name - * @property { boolean } archived - * @property { string } sftpHost - * @property { number } sftpPort - * @property { string } sftpUsername - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes - * @property { string } lastPolledAt - * @property { string } createdAt - * @property { string } createdById - * @property { IntegrationChannelEmployeeResponseDto } createdBy - * @property { string } updatedAt - * @property { string } updatedById - * @property { IntegrationChannelEmployeeResponseDto } updatedBy - */ - export const IntegrationChannelResponseDtoSchema = z - .object({ - id: z.string(), - officeId: z.string(), - businessPartnerId: z.string(), - businessPartner: IntegrationChannelBusinessPartnerResponseDtoSchema, - employeeId: z.string(), - name: z.string(), - archived: z.boolean(), - sftpHost: z.string(), - sftpPort: z.number(), - sftpUsername: z.string(), - inboundPath: z.string(), - outboundPath: z.string(), - pollingFrequencyMinutes: z.number(), - lastPolledAt: z.iso.datetime({ offset: true }).nullish(), - createdAt: z.iso.datetime({ offset: true }), - createdById: z.string(), - createdBy: IntegrationChannelEmployeeResponseDtoSchema, - updatedAt: z.iso.datetime({ offset: true }), - updatedById: z.string(), - updatedBy: IntegrationChannelEmployeeResponseDtoSchema, - }) - .readonly(); - export type IntegrationChannelResponseDto = z.infer; - - /** - * IntegrationMessageDirectionEnumSchema - * @type { enum } - */ - export const IntegrationMessageDirectionEnumSchema = z.enum(["Inbound", "Outbound"]); - export type IntegrationMessageDirectionEnum = z.infer; - export const IntegrationMessageDirectionEnum = IntegrationMessageDirectionEnumSchema.enum; - - /** - * IntegrationMessageFormatEnumSchema - * @type { enum } - */ - export const IntegrationMessageFormatEnumSchema = z.enum(["IFTMBF", "IFTMBC"]); - export type IntegrationMessageFormatEnum = z.infer; - export const IntegrationMessageFormatEnum = IntegrationMessageFormatEnumSchema.enum; - - /** - * IntegrationMessageStatusEnumSchema - * @type { enum } - */ - export const IntegrationMessageStatusEnumSchema = z.enum(["Received", "Processed", "Failed", "Sent"]); - export type IntegrationMessageStatusEnum = z.infer; - export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.enum; - - /** - * IntegrationMessageFilterDtoSchema - * @type { object } - * @property { IntegrationMessageDirectionEnum } direction - * @property { IntegrationMessageFormatEnum } format - * @property { IntegrationMessageStatusEnum } status - * @property { string } search - */ - export const IntegrationMessageFilterDtoSchema = z - .object({ - direction: IntegrationMessageDirectionEnumSchema, - format: IntegrationMessageFormatEnumSchema, - status: IntegrationMessageStatusEnumSchema, - search: z.string(), - }) - .readonly(); - export type IntegrationMessageFilterDto = z.infer; - - /** - * IntegrationChannelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const IntegrationChannelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type IntegrationChannelFilterDto = z.infer; - - /** - * CreateIntegrationChannelRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } employeeId - * @property { string } name - * @property { string } sftpHost - * @property { number } sftpPort Minimum: `1`. Maximum: `65535` - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes Minimum: `1` - */ - export const CreateIntegrationChannelRequestDtoSchema = z - .object({ - businessPartnerId: z.string(), - employeeId: z.string(), - name: z.string(), - sftpHost: z.string(), - sftpPort: z.number().gte(1).lte(65535), - sftpUsername: z.string(), - sftpPassword: z.string(), - inboundPath: z.string(), - outboundPath: z.string(), - pollingFrequencyMinutes: z.number().gte(1), - }) - .readonly(); - export type CreateIntegrationChannelRequestDto = z.infer; - - /** - * UpdateIntegrationChannelRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } employeeId - * @property { string } name - * @property { string } sftpHost - * @property { number } sftpPort Minimum: `1`. Maximum: `65535` - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes Minimum: `1` - */ - export const UpdateIntegrationChannelRequestDtoSchema = z - .object({ - businessPartnerId: z.string(), - employeeId: z.string(), - name: z.string(), - sftpHost: z.string(), - sftpPort: z.number().gte(1).lte(65535), - sftpUsername: z.string(), - sftpPassword: z.string(), - inboundPath: z.string(), - outboundPath: z.string(), - pollingFrequencyMinutes: z.number().gte(1), - }) - .readonly(); - export type UpdateIntegrationChannelRequestDto = z.infer; - - /** - * TestConnectionResponseDtoSchema - * @type { object } - * @property { boolean } success - */ - export const TestConnectionResponseDtoSchema = z.object({ success: z.boolean() }).readonly(); - export type TestConnectionResponseDto = z.infer; - - /** - * IntegrationMessageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } integrationChannelId - * @property { string } positionId - * @property { string } positionNumber - * @property { string } direction - * @property { string } format - * @property { string } status - * @property { string } rawContent - * @property { string } fileName - * @property { string } errorMessage - * @property { string } processedAt - * @property { string } sentAt - * @property { string } createdAt - */ - export const IntegrationMessageResponseDtoSchema = z - .object({ - id: z.string(), - integrationChannelId: z.string(), - positionId: z.string().nullish(), - positionNumber: z.string().nullish(), - direction: z.string(), - format: z.string(), - status: z.string(), - rawContent: z.string(), - fileName: z.string(), - errorMessage: z.string().nullish(), - processedAt: z.iso.datetime({ offset: true }).nullish(), - sentAt: z.iso.datetime({ offset: true }).nullish(), - createdAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type IntegrationMessageResponseDto = z.infer; - - /** - * IntegrationChannelsListOrderParamEnumSchema - * @type { enum } - */ - export const IntegrationChannelsListOrderParamEnumSchema = z.enum([ - "createdAt", - "name", - "businessPartner", - "lastPolledAt", - ]); - export type IntegrationChannelsListOrderParamEnum = z.infer; - export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrderParamEnumSchema.enum; - - /** - * IntegrationChannelsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { IntegrationChannelResponseDto[] } items - */ - export const IntegrationChannelsListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).readonly() }).readonly().shape, - }); - export type IntegrationChannelsListResponse = z.infer; - - /** - * ListMessagesOrderParamEnumSchema - * @type { enum } - */ - export const ListMessagesOrderParamEnumSchema = z.enum(["createdAt", "status", "direction", "format"]); - export type ListMessagesOrderParamEnum = z.infer; - export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; - - /** - * ListMessagesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { IntegrationMessageResponseDto[] } items - */ - export const ListMessagesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).readonly() }).readonly().shape, - }); - export type ListMessagesResponse = z.infer; } diff --git a/test/generated/base/integrationChannels/integrationChannels.queries.ts b/test/generated/base/integrationChannels/integrationChannels.queries.ts index 9ba5b53..1f37862 100644 --- a/test/generated/base/integrationChannels/integrationChannels.queries.ts +++ b/test/generated/base/integrationChannels/integrationChannels.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,463 +8,295 @@ import { IntegrationChannelsModels } from "./integrationChannels.models"; import { IntegrationChannelsApi } from "./integrationChannels.api"; export namespace IntegrationChannelsQueries { - export const moduleName = QueryModule.IntegrationChannels; +export const moduleName = QueryModule.IntegrationChannels; - export const keys = { +export const keys = { all: [moduleName] as const, - list: ( - officeId: string, - limit?: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, - page?: number, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/integration-channels", officeId, limit, order, filter, page, cursor] as const, - listInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/integration-channels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/integration-channels/:id", officeId, id] as const, - listMessages: ( - officeId: string, - id: string, - limit?: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/integration-channels/:id/messages", - officeId, - id, - limit, - order, - filter, - page, - cursor, - ] as const, - listMessagesInfinite: ( - officeId: string, - id: string, - limit?: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/integration-channels/:id/messages", - "infinite", - officeId, - id, - limit, - order, - filter, - cursor, - ] as const, - }; + list: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/integration-channels/:id", officeId, id] as const, + listMessages: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", officeId, id, limit, order, filter, page, cursor] as const, + listMessagesInfinite: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", "infinite", officeId, id, limit, order, filter, cursor] as const, +}; - /** - * Query `useList` - * @summary List integration channels for an office - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: IntegrationChannelsModels.IntegrationChannelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useList` + * @summary List integration channels for an office + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); + return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseList({ officeId })); - return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useListInfinite + * @summary List integration channels for an office + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListInfinite - * @summary List integration channels for an office - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: IntegrationChannelsModels.IntegrationChannelFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); + return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(IntegrationChannelsAcl.canUseList({ officeId })); - return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create integration channel - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { IntegrationChannelsModels.CreateIntegrationChannelRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof IntegrationChannelsApi.create, - { officeId: string; data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId })); - return IntegrationChannelsApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + ...options, + }); +}; - /** - * Query `useFindById` - * @summary Get integration channel by id - * @permission Requires `canUseFindById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Mutation `useCreate` + * @summary Create integration channel + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { IntegrationChannelsModels.CreateIntegrationChannelRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useQuery({ - queryKey: keys.findById(officeId, id), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId })); - return IntegrationChannelsApi.findById(officeId, id, config); - }, - ...options, - }); - }; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId } )); + return IntegrationChannelsApi.create(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useUpdate` - * @summary Update integration channel by id - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof IntegrationChannelsApi.update, - { officeId: string; id: string; data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Query `useFindById` + * @summary Get integration channel by id + * @permission Requires `canUseFindById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(officeId, id), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId } )); + return IntegrationChannelsApi.findById(officeId, id) }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId })); - return IntegrationChannelsApi.update(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update integration channel by id + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive integration channel by id - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, id, data }) => { + checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId } )); + return IntegrationChannelsApi.update(officeId, id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId })); - return IntegrationChannelsApi.archive(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive integration channel by id + * @permission Requires `canUseArchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive integration channel by id - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId } )); + return IntegrationChannelsApi.archive(officeId, id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId })); - return IntegrationChannelsApi.unarchive(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive integration channel by id + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useTestConnection` - * @summary Test integration channel SFTP connection - * @permission Requires `canUseTestConnection` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useTestConnection = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId } )); + return IntegrationChannelsApi.unarchive(officeId, id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, id } = variables; + const updateKeys = [keys.findById(officeId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId })); - return IntegrationChannelsApi.testConnection(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useTestConnection` + * @summary Test integration channel SFTP connection + * @permission Requires `canUseTestConnection` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useTestConnection = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `useListMessages` - * @summary Paginate integration channel messages - * @permission Requires `canUseListMessages` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListMessages = ( - { - officeId, - id, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - id: string; - limit: number; - order?: string; - filter?: IntegrationChannelsModels.IntegrationMessageFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ officeId, id }) => { + checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId } )); + return IntegrationChannelsApi.testConnection(officeId, id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + }); +}; + +/** + * Query `useListMessages` + * @summary Paginate integration channel messages + * @permission Requires `canUseListMessages` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListMessages = ({ officeId, id, limit, order, filter, page, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId })); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useListMessagesInfinite + * @summary Paginate integration channel messages + * @permission Requires `canUseListMessages` ability + * @param { string } object.officeId Path parameter + * @param { string } object.id Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` + * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListMessagesInfinite = ({ officeId, id, limit, order, filter, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListMessagesInfinite - * @summary Paginate integration channel messages - * @permission Requires `canUseListMessages` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListMessagesInfinite = ( - { - officeId, - id, - limit, - order, - filter, - cursor, - }: { - officeId: string; - id: string; - limit: number; - order?: string; - filter?: IntegrationChannelsModels.IntegrationMessageFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId })); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; } diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts index f0a32a5..81c9083 100644 --- a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts +++ b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts @@ -1,39 +1,43 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace InttraOfficeIntegrationAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Read", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Read", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - /** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ - export const canUseGenerate = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update INTTRA credentials + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; } diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts index e54a3b6..7bed21a 100644 --- a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts +++ b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts @@ -1,36 +1,28 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; export namespace InttraOfficeIntegrationApi { - export const get = (officeId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, ) => { return AppRestClient.get( - { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - config, - ); - }; - - export const generate = (officeId: string, config?: AxiosRequestConfig) => { + { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + + ) +}; +export const generate = (officeId: string, ) => { return AppRestClient.post( - { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - undefined, - config, - ); - }; - - export const update = ( - officeId: string, - data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + + ) +}; +export const update = (officeId: string, data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, ) => { return AppRestClient.patch( - { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), - config, - ); - }; + { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, + `/offices/${officeId}/inttra/credentials`, + ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts index 607c312..635c0a5 100644 --- a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts +++ b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts @@ -1,76 +1,52 @@ import { z } from "zod"; export namespace InttraOfficeIntegrationModels { - /** - * OfficeInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } rotatedByUserId - * @property { string } officeId - * @property { string } sftpUsername - * @property { string } sftpPublicKey - * @property { string } partnerCode - * @property { string } ediId - * @property { string } notificationEmail - */ - export const OfficeInttraCredentialsResponseDtoSchema = z - .object({ - id: z.string(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - rotatedByUserId: z.string().nullish(), - officeId: z.string(), - sftpUsername: z.string().nullish(), - sftpPublicKey: z.string().nullish(), - partnerCode: z.string().nullish(), - ediId: z.string().nullish(), - notificationEmail: z.string().nullish(), - }) - .readonly(); - export type OfficeInttraCredentialsResponseDto = z.infer; +/** + * OfficeInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } rotatedByUserId + * @property { string } officeId + * @property { string } sftpUsername + * @property { string } sftpPublicKey + * @property { string } partnerCode + * @property { string } ediId + * @property { string } notificationEmail + */ +export const OfficeInttraCredentialsResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string().nullish(), officeId: z.string(), sftpUsername: z.string().nullish(), sftpPublicKey: z.string().nullish(), partnerCode: z.string().nullish(), ediId: z.string().nullish(), notificationEmail: z.string().nullish() }); +export type OfficeInttraCredentialsResponseDto = z.infer; - /** - * GenerateInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } publicKey - * @property { string } rotatedAt - * @property { string } rotatedByUserId - */ - export const GenerateInttraCredentialsResponseDtoSchema = z - .object({ publicKey: z.string(), rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }) - .readonly(); - export type GenerateInttraCredentialsResponseDto = z.infer; +/** + * GenerateInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } publicKey + * @property { string } rotatedAt + * @property { string } rotatedByUserId + */ +export const GenerateInttraCredentialsResponseDtoSchema = z.object({ publicKey: z.string(), rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }); +export type GenerateInttraCredentialsResponseDto = z.infer; - /** - * UpdateInttraCredentialsRequestDtoSchema - * @type { object } - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } partnerCode - * @property { string } ediId - * @property { string } notificationEmail - */ - export const UpdateInttraCredentialsRequestDtoSchema = z - .object({ - sftpUsername: z.string(), - sftpPassword: z.string(), - partnerCode: z.string(), - ediId: z.string(), - notificationEmail: z.string(), - }) - .readonly(); - export type UpdateInttraCredentialsRequestDto = z.infer; +/** + * UpdateInttraCredentialsRequestDtoSchema + * @type { object } + * @property { string } sftpUsername + * @property { string } sftpPassword + * @property { string } partnerCode + * @property { string } ediId + * @property { string } notificationEmail + */ +export const UpdateInttraCredentialsRequestDtoSchema = z.object({ sftpUsername: z.string().nullable(), sftpPassword: z.string().nullable(), partnerCode: z.string().nullable(), ediId: z.string().nullable(), notificationEmail: z.string().nullable() }).partial(); +export type UpdateInttraCredentialsRequestDto = z.infer; + +/** + * UpdateInttraCredentialsResponseDtoSchema + * @type { object } + * @property { string } rotatedAt + * @property { string } rotatedByUserId + */ +export const UpdateInttraCredentialsResponseDtoSchema = z.object({ rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }); +export type UpdateInttraCredentialsResponseDto = z.infer; - /** - * UpdateInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } rotatedAt - * @property { string } rotatedByUserId - */ - export const UpdateInttraCredentialsResponseDtoSchema = z - .object({ rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }) - .readonly(); - export type UpdateInttraCredentialsResponseDto = z.infer; } diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts index 39b82e3..78b7dc4 100644 --- a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts +++ b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,100 +8,85 @@ import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models" import { InttraOfficeIntegrationApi } from "./inttraOfficeIntegration.api"; export namespace InttraOfficeIntegrationQueries { - export const moduleName = QueryModule.InttraOfficeIntegration; +export const moduleName = QueryModule.InttraOfficeIntegration; - export const keys = { +export const keys = { all: [moduleName] as const, get: (officeId: string) => [...keys.all, "/offices/:officeId/inttra/credentials", officeId] as const, - }; +}; - /** - * Query `useGet` - * @summary Get INTTRA credentials for an office - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId }: { officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGet` + * @summary Get INTTRA credentials for an office + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId }: { officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId), + queryFn: () => { + checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId } )); + return InttraOfficeIntegrationApi.get(officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.get(officeId), - queryFn: () => { - checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId })); - return InttraOfficeIntegrationApi.get(officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useGenerate` + * @summary Generate and persist INTTRA SFTP RSA key pair for an office + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useGenerate` - * @summary Generate and persist INTTRA SFTP RSA key pair for an office - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useGenerate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId }) => { + checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId } )); + return InttraOfficeIntegrationApi.generate(officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId }) => { - checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId })); - return InttraOfficeIntegrationApi.generate(officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdate` + * @summary Manually update INTTRA credentials (username/password/passphrase) + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Manually update INTTRA credentials (username/password/passphrase) - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof InttraOfficeIntegrationApi.update, - { officeId: string; data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId } )); + return InttraOfficeIntegrationApi.update(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId })); - return InttraOfficeIntegrationApi.update(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts index 85c97fc..268366c 100644 --- a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts +++ b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts @@ -1,67 +1,56 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace InttraShippingInstructionMessagesAcl { - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List SI messages - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", - ] as AbilityTuple< - "Read", - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - >; +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List SI messages + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create SI message - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", - ] as AbilityTuple< - "Update", - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create SI message + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - /** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Get SI message details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ - export const canUseGetById = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", - ] as AbilityTuple< - "Read", - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - >; +/** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Get SI message details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update SI message + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" +] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update SI message - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", - ] as AbilityTuple< - "Update", - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - >; } diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts index bc8aaf4..66b0aa8 100644 --- a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts +++ b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts @@ -1,90 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; export namespace InttraShippingInstructionMessagesApi { - export const list = ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - limit: number, - page?: number, - cursor?: string, - filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, - config?: AxiosRequestConfig, - ) => { +export const list = (officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, ) => { return AppRestClient.get( - { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - filter: ZodExtended.parse( - InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - }, - }, - ); - }; - - export const create = ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, + { + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + filter: ZodExtended.parse(InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + }, + } + ) +}; +export const create = (officeId: string, positionId: string, shippingInstructionsId: string, data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, ) => { return AppRestClient.post( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, - ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), - config, - ); - }; - - export const getById = ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - messageId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, + ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), + + ) +}; +export const getById = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, ) => { return AppRestClient.get( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - config, - ); - }; - - export const update = ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - messageId: string, - data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, + + ) +}; +export const update = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, ) => { return AppRestClient.patch( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), - config, - ); - }; + { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, + ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts index 7942b4b..fbb3b0b 100644 --- a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts +++ b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts @@ -5,83 +5,84 @@ import { InttraShippingInstructionMessagesQueries } from "./inttraShippingInstru import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; export namespace InttraShippingInstructionMessagesConfigs { - export const messagesConfig = { +export const messagesConfig = { meta: { - title: "Messages", + title: "Messages", }, readAll: { - acl: InttraShippingInstructionMessagesAcl.canUseList, - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, - paginated: InttraShippingInstructionMessagesQueries.useList, - infinite: InttraShippingInstructionMessagesQueries.useListInfinite, - filters: { - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, - options: { - inputs: { - status: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: InttraShippingInstructionMessagesAcl.canUseList, schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, - options: { - columns: { - id: true, - createdAt: true, - updatedAt: true, - shippingInstructionsId: true, - positionId: true, - createdByUserId: true, - status: true, - fileName: true, - sftpPath: true, - sentAt: true, - uploadAttemptCount: true, - lastUploadError: true, - notes: true, - contrlStatus: true, - contrlReceivedAt: true, - contrlRaw: true, - aperakStatus: true, - aperakReceivedAt: true, - aperakRaw: true, - }, + paginated: InttraShippingInstructionMessagesQueries.useList, + infinite: InttraShippingInstructionMessagesQueries.useListInfinite, + filters: { + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, + options: { + inputs: { + status: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, + options: { + columns: { + id: true, + createdAt: true, + updatedAt: true, + shippingInstructionsId: true, + positionId: true, + createdByUserId: true, + status: true, + fileName: true, + sftpPath: true, + sentAt: true, + uploadAttemptCount: true, + lastUploadError: true, + notes: true, + contrlStatus: true, + contrlReceivedAt: true, + contrlRaw: true, + aperakStatus: true, + aperakReceivedAt: true, + aperakRaw: true, + }, + }, +}), }, read: { - acl: InttraShippingInstructionMessagesAcl.canUseGetById, - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema, - query: InttraShippingInstructionMessagesQueries.useGetById, + acl: InttraShippingInstructionMessagesAcl.canUseGetById, + schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema, + query: InttraShippingInstructionMessagesQueries.useGetById, }, create: { - acl: InttraShippingInstructionMessagesAcl.canUseCreate, - schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, - mutation: InttraShippingInstructionMessagesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: InttraShippingInstructionMessagesAcl.canUseCreate, schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, - options: { - inputs: { - isAmendment: true, - }, - }, - }), + mutation: InttraShippingInstructionMessagesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, + options: { + inputs: { + isAmendment: true, + }, + }, +}) }, update: { - acl: InttraShippingInstructionMessagesAcl.canUseUpdate, - schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, - mutation: InttraShippingInstructionMessagesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: InttraShippingInstructionMessagesAcl.canUseUpdate, schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, - options: { - inputs: { - notes: true, - }, - }, - }), + mutation: InttraShippingInstructionMessagesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, + options: { + inputs: { + notes: true, + }, + }, +}) }, - }; +}; + } diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts index cf33dde..6e252f5 100644 --- a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts +++ b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts @@ -2,171 +2,103 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace InttraShippingInstructionMessagesModels { - /** - * InttraShippingInstructionStatusEnumSchema - * @type { enum } - */ - export const InttraShippingInstructionStatusEnumSchema = z.enum([ - "PendingUpload", - "Uploaded", - "ContrlAccepted", - "ContrlRejected", - "AperakAccepted", - "AperakRejected", - "FailedUpload", - ]); - export type InttraShippingInstructionStatusEnum = z.infer; - export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStatusEnumSchema.enum; +/** + * InttraShippingInstructionStatusEnumSchema + * @type { enum } + */ +export const InttraShippingInstructionStatusEnumSchema = z.enum(["PendingUpload", "Uploaded", "ContrlAccepted", "ContrlRejected", "AperakAccepted", "AperakRejected", "FailedUpload"]); +export type InttraShippingInstructionStatusEnum = z.infer; +export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStatusEnumSchema.enum; - /** - * ShippingInstructionMessageListItemResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } shippingInstructionsId - * @property { string } positionId - * @property { string } createdByUserId - * @property { InttraShippingInstructionStatusEnum } status - * @property { string } fileName - * @property { string } sftpPath - * @property { string } sentAt - * @property { number } uploadAttemptCount - * @property { string } lastUploadError - * @property { string } notes - * @property { string } contrlStatus - * @property { string } contrlReceivedAt - * @property { string } contrlRaw - * @property { string } aperakStatus - * @property { string } aperakReceivedAt - * @property { string } aperakRaw - */ - export const ShippingInstructionMessageListItemResponseDtoSchema = z - .object({ - id: z.string(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - shippingInstructionsId: z.string(), - positionId: z.string(), - createdByUserId: z.string(), - status: InttraShippingInstructionStatusEnumSchema, - fileName: z.string(), - sftpPath: z.string(), - sentAt: z.iso.datetime({ offset: true }), - uploadAttemptCount: z.number(), - lastUploadError: z.string().nullish(), - notes: z.string().nullish(), - contrlStatus: z.string().nullish(), - contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), - contrlRaw: z.string().nullish(), - aperakStatus: z.string().nullish(), - aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), - aperakRaw: z.string().nullish(), - }) - .readonly(); - export type ShippingInstructionMessageListItemResponseDto = z.infer< - typeof ShippingInstructionMessageListItemResponseDtoSchema - >; +/** + * ShippingInstructionMessageListItemResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } shippingInstructionsId + * @property { string } positionId + * @property { string } createdByUserId + * @property { InttraShippingInstructionStatusEnum } status + * @property { string } fileName + * @property { string } sftpPath + * @property { string } sentAt + * @property { number } uploadAttemptCount + * @property { string } lastUploadError + * @property { string } notes + * @property { string } contrlStatus + * @property { string } contrlReceivedAt + * @property { string } contrlRaw + * @property { string } aperakStatus + * @property { string } aperakReceivedAt + * @property { string } aperakRaw + */ +export const ShippingInstructionMessageListItemResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }); +export type ShippingInstructionMessageListItemResponseDto = z.infer; - /** - * ShippingInstructionMessageFilterDtoSchema - * @type { object } - * @property { InttraShippingInstructionStatusEnum[] } status - */ - export const ShippingInstructionMessageFilterDtoSchema = z - .object({ status: z.array(InttraShippingInstructionStatusEnumSchema).readonly() }) - .readonly(); - export type ShippingInstructionMessageFilterDto = z.infer; +/** + * ShippingInstructionMessageFilterDtoSchema + * @type { object } + * @property { InttraShippingInstructionStatusEnum[] } status + */ +export const ShippingInstructionMessageFilterDtoSchema = z.object({ status: z.array(InttraShippingInstructionStatusEnumSchema).nullable() }).partial(); +export type ShippingInstructionMessageFilterDto = z.infer; - /** - * ShippingInstructionMessageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } shippingInstructionsId - * @property { string } positionId - * @property { string } createdByUserId - * @property { InttraShippingInstructionStatusEnum } status - * @property { object } shippingInstructionSnapshot - * @property { string } renderedRequestPayload - * @property { string } fileName - * @property { string } sftpPath - * @property { string } sentAt - * @property { number } uploadAttemptCount - * @property { string } lastUploadError - * @property { string } notes - * @property { string } contrlStatus - * @property { string } contrlReceivedAt - * @property { string } contrlRaw - * @property { string } aperakStatus - * @property { string } aperakReceivedAt - * @property { string } aperakRaw - */ - export const ShippingInstructionMessageResponseDtoSchema = z - .object({ - id: z.string(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - shippingInstructionsId: z.string(), - positionId: z.string(), - createdByUserId: z.string(), - status: InttraShippingInstructionStatusEnumSchema, - shippingInstructionSnapshot: z.object({}).readonly(), - renderedRequestPayload: z.string(), - fileName: z.string(), - sftpPath: z.string(), - sentAt: z.iso.datetime({ offset: true }), - uploadAttemptCount: z.number(), - lastUploadError: z.string().nullish(), - notes: z.string().nullish(), - contrlStatus: z.string().nullish(), - contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), - contrlRaw: z.string().nullish(), - aperakStatus: z.string().nullish(), - aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), - aperakRaw: z.string().nullish(), - }) - .readonly(); - export type ShippingInstructionMessageResponseDto = z.infer; +/** + * ShippingInstructionMessageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } shippingInstructionsId + * @property { string } positionId + * @property { string } createdByUserId + * @property { InttraShippingInstructionStatusEnum } status + * @property { object } shippingInstructionSnapshot + * @property { string } renderedRequestPayload + * @property { string } fileName + * @property { string } sftpPath + * @property { string } sentAt + * @property { number } uploadAttemptCount + * @property { string } lastUploadError + * @property { string } notes + * @property { string } contrlStatus + * @property { string } contrlReceivedAt + * @property { string } contrlRaw + * @property { string } aperakStatus + * @property { string } aperakReceivedAt + * @property { string } aperakRaw + */ +export const ShippingInstructionMessageResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, shippingInstructionSnapshot: z.object({}), renderedRequestPayload: z.string(), fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }); +export type ShippingInstructionMessageResponseDto = z.infer; - /** - * UpdateShippingInstructionMessageRequestDtoSchema - * @type { object } - * @property { string } notes - */ - export const UpdateShippingInstructionMessageRequestDtoSchema = z.object({ notes: z.string() }).readonly(); - export type UpdateShippingInstructionMessageRequestDto = z.infer< - typeof UpdateShippingInstructionMessageRequestDtoSchema - >; +/** + * UpdateShippingInstructionMessageRequestDtoSchema + * @type { object } + * @property { string } notes + */ +export const UpdateShippingInstructionMessageRequestDtoSchema = z.object({ notes: z.string().nullable() }).partial(); +export type UpdateShippingInstructionMessageRequestDto = z.infer; - /** - * CreateShippingInstructionMessageRequestDtoSchema - * @type { object } - * @property { boolean } isAmendment Default: `false` - */ - export const CreateShippingInstructionMessageRequestDtoSchema = z - .object({ isAmendment: z.boolean().default(false) }) - .readonly(); - export type CreateShippingInstructionMessageRequestDto = z.infer< - typeof CreateShippingInstructionMessageRequestDtoSchema - >; +/** + * CreateShippingInstructionMessageRequestDtoSchema + * @type { object } + * @property { boolean } isAmendment Default: `false` + */ +export const CreateShippingInstructionMessageRequestDtoSchema = z.object({ isAmendment: z.boolean().nullable().default(false) }).partial(); +export type CreateShippingInstructionMessageRequestDto = z.infer; + +/** + * InttraShippingInstructionMessagesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ShippingInstructionMessageListItemResponseDto[] } items + */ +export const InttraShippingInstructionMessagesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ShippingInstructionMessageListItemResponseDtoSchema).nullable() }).partial().shape }); +export type InttraShippingInstructionMessagesListResponse = z.infer; - /** - * InttraShippingInstructionMessagesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ShippingInstructionMessageListItemResponseDto[] } items - */ - export const InttraShippingInstructionMessagesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ShippingInstructionMessageListItemResponseDtoSchema).readonly() }).readonly().shape, - }); - export type InttraShippingInstructionMessagesListResponse = z.infer< - typeof InttraShippingInstructionMessagesListResponseSchema - >; } diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts index cd6ec39..410de3d 100644 --- a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts +++ b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,307 +8,157 @@ import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstruc import { InttraShippingInstructionMessagesApi } from "./inttraShippingInstructionMessages.api"; export namespace InttraShippingInstructionMessagesQueries { - export const moduleName = QueryModule.InttraShippingInstructionMessages; +export const moduleName = QueryModule.InttraShippingInstructionMessages; - export const keys = { +export const keys = { all: [moduleName] as const, - list: ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - limit?: number, - page?: number, - cursor?: string, - filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", - officeId, - positionId, - shippingInstructionsId, - limit, - page, - cursor, - filter, - ] as const, - listInfinite: ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - limit?: number, - cursor?: string, - filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", - "infinite", - officeId, - positionId, - shippingInstructionsId, - limit, - cursor, - filter, - ] as const, - getById: (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages/:messageId", - officeId, - positionId, - shippingInstructionsId, - messageId, - ] as const, - }; + list: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", officeId, positionId, shippingInstructionsId, limit, page, cursor, filter] as const, + listInfinite: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", "infinite", officeId, positionId, shippingInstructionsId, limit, cursor, filter] as const, + getById: (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages/:messageId", officeId, positionId, shippingInstructionsId, messageId] as const, +}; - /** - * Query `useList` - * @summary List Inttra shipping instruction messages for a position/BL instructions - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - positionId, - shippingInstructionsId, - limit, - page, - cursor, - filter, - }: { - officeId: string; - positionId: string; - shippingInstructionsId: string; - limit: number; - page?: number; - cursor?: string; - filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useList` + * @summary List Inttra shipping instruction messages for a position/BL instructions + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, positionId, shippingInstructionsId, limit, page, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), + queryFn: () => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); + return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), - queryFn: () => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId })); - return InttraShippingInstructionMessagesApi.list( - officeId, - positionId, - shippingInstructionsId, - limit, - page, - cursor, - filter, - config, - ); - }, - ...options, - }); - }; +/** + * Infinite query `useListInfinite + * @summary List Inttra shipping instruction messages for a position/BL instructions + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, positionId, shippingInstructionsId, limit, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListInfinite - * @summary List Inttra shipping instruction messages for a position/BL instructions - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - officeId, - positionId, - shippingInstructionsId, - limit, - cursor, - filter, - }: { - officeId: string; - positionId: string; - shippingInstructionsId: string; - limit: number; - cursor?: string; - filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto; + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), + queryFn: ({ pageParam }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); + return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, pageParam, cursor, filter) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), - queryFn: ({ pageParam }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId })); - return InttraShippingInstructionMessagesApi.list( - officeId, - positionId, - shippingInstructionsId, - limit, - pageParam, - cursor, - filter, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Mutation `useCreate` - * @summary Create Inttra shipping instruction message - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.shippingInstructionsId Path parameter - * @param { InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof InttraShippingInstructionMessagesApi.create, - { - officeId: string; - positionId: string; - shippingInstructionsId: string; - data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create Inttra shipping instruction message + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.shippingInstructionsId Path parameter + * @param { InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId })); - return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId } )); + return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useGetById` - * @summary Get Inttra shipping instruction message details - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { string } object.messageId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetById = ( - { - officeId, - positionId, - shippingInstructionsId, - messageId, - }: { officeId: string; positionId: string; shippingInstructionsId: string; messageId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetById` + * @summary Get Inttra shipping instruction message details + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.shippingInstructionsId Path parameter + * @param { string } object.messageId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ officeId, positionId, shippingInstructionsId, messageId }: { officeId: string, positionId: string, shippingInstructionsId: string, messageId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), + queryFn: () => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId } )); + return InttraShippingInstructionMessagesApi.getById(officeId, positionId, shippingInstructionsId, messageId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), - queryFn: () => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId })); - return InttraShippingInstructionMessagesApi.getById( - officeId, - positionId, - shippingInstructionsId, - messageId, - config, - ); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update Inttra shipping instruction message + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.shippingInstructionsId Path parameter + * @param { string } mutation.messageId Path parameter + * @param { InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update Inttra shipping instruction message - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.shippingInstructionsId Path parameter - * @param { string } mutation.messageId Path parameter - * @param { InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof InttraShippingInstructionMessagesApi.update, - { - officeId: string; - positionId: string; - shippingInstructionsId: string; - messageId: string; - data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { + checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId } )); + return InttraShippingInstructionMessagesApi.update(officeId, positionId, shippingInstructionsId, messageId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, shippingInstructionsId, messageId } = variables; + const updateKeys = [keys.getById(officeId, positionId, shippingInstructionsId, messageId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId })); - return InttraShippingInstructionMessagesApi.update( - officeId, - positionId, - shippingInstructionsId, - messageId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, shippingInstructionsId, messageId } = variables; - const updateKeys = [keys.getById(officeId, positionId, shippingInstructionsId, messageId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/invoicePayments/invoicePayments.acl.ts b/test/generated/base/invoicePayments/invoicePayments.acl.ts index 6abcc9b..e3061ca 100644 --- a/test/generated/base/invoicePayments/invoicePayments.acl.ts +++ b/test/generated/base/invoicePayments/invoicePayments.acl.ts @@ -1,111 +1,121 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace InvoicePaymentsAcl { - /** - * Use for `useListOfficePayments` query ability. For global ability, omit the object parameter. - * @description List office payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListOfficePayments` query - */ - export const canUseListOfficePayments = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useListOfficePayments` query ability. For global ability, omit the object parameter. + * @description List office payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListOfficePayments` query + */ +export const canUseListOfficePayments = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useBulkCreatePayments` mutation ability. For global ability, omit the object parameter. - * @description Bulk create invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useBulkCreatePayments` mutation - */ - export const canUseBulkCreatePayments = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useBulkCreatePayments` mutation ability. For global ability, omit the object parameter. + * @description Bulk create invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useBulkCreatePayments` mutation + */ +export const canUseBulkCreatePayments = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useCalculatePayments` mutation ability. For global ability, omit the object parameter. - * @description Calculate invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCalculatePayments` mutation - */ - export const canUseCalculatePayments = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useCalculatePayments` mutation ability. For global ability, omit the object parameter. + * @description Calculate invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCalculatePayments` mutation + */ +export const canUseCalculatePayments = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useExportOfficePayments` mutation ability. For global ability, omit the object parameter. - * @description Export office invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportOfficePayments` mutation - */ - export const canUseExportOfficePayments = (object?: { officeId: string }) => - ["Export", object ? subject("InvoicePayment", object) : "InvoicePayment"] as AbilityTuple< - "Export", - "InvoicePayment" | (ForcedSubject<"InvoicePayment"> & { officeId: string }) - >; +/** + * Use for `useExportOfficePayments` mutation ability. For global ability, omit the object parameter. + * @description Export office invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportOfficePayments` mutation + */ +export const canUseExportOfficePayments = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("InvoicePayment", object) : "InvoicePayment" +] as AbilityTuple<"Export", "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, }>; - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List invoice payments + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useGetPaymentById` query ability. For global ability, omit the object parameter. - * @description Create invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPaymentById` query - */ - export const canUseGetPaymentById = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useGetPaymentById` query ability. For global ability, omit the object parameter. + * @description Create invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPaymentById` query + */ +export const canUseGetPaymentById = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useDeleteInvoicePayment` mutation ability. For global ability, omit the object parameter. + * @description Delete invoice payment + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoicePayment` mutation + */ +export const canUseDeleteInvoicePayment = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useDeleteInvoicePayment` mutation ability. For global ability, omit the object parameter. - * @description Delete invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoicePayment` mutation - */ - export const canUseDeleteInvoicePayment = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; } diff --git a/test/generated/base/invoicePayments/invoicePayments.api.ts b/test/generated/base/invoicePayments/invoicePayments.api.ts index 84e29be..b19c0f4 100644 --- a/test/generated/base/invoicePayments/invoicePayments.api.ts +++ b/test/generated/base/invoicePayments/invoicePayments.api.ts @@ -1,181 +1,95 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { InvoicePaymentsModels } from "./invoicePayments.models"; export namespace InvoicePaymentsApi { - export const listOfficePayments = ( - officeId: string, - limit: number, - order?: string, - filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const listOfficePayments = (officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, - `/offices/${officeId}/payments`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const bulkCreatePayments = ( - officeId: string, - data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, + `/offices/${officeId}/payments`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const bulkCreatePayments = (officeId: string, data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, ) => { return AppRestClient.post( - { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, - `/offices/${officeId}/payments`, - ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), - config, - ); - }; - - export const calculatePayments = ( - officeId: string, - data: InvoicePaymentsModels.CalculatePaymentsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, + `/offices/${officeId}/payments`, + ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), + + ) +}; +export const calculatePayments = (officeId: string, data: InvoicePaymentsModels.CalculatePaymentsRequestDto, ) => { return AppRestClient.post( - { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, - `/offices/${officeId}/payments/calculate`, - ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), - config, - ); - }; - - export const exportOfficePayments = ( - officeId: string, - data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, + `/offices/${officeId}/payments/calculate`, + ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), + + ) +}; +export const exportOfficePayments = (officeId: string, data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payments/exports`, - ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const list = ( - officeId: string, - invoiceId: string, - limit: number, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payments/exports`, + ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const list = (officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = ( - officeId: string, - invoiceId: string, - data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments`, + { + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, invoiceId: string, data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, ) => { return AppRestClient.post( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments`, - ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), - config, - ); - }; - - export const getPaymentById = ( - officeId: string, - invoiceId: string, - paymentId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments`, + ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), + + ) +}; +export const getPaymentById = (officeId: string, invoiceId: string, paymentId: string, ) => { return AppRestClient.get( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - config, - ); - }; - - export const update = ( - officeId: string, - invoiceId: string, - paymentId: string, - data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + + ) +}; +export const update = (officeId: string, invoiceId: string, paymentId: string, data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, ) => { return AppRestClient.patch( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), - config, - ); - }; - - export const deleteInvoicePayment = ( - officeId: string, - invoiceId: string, - paymentId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), + + ) +}; +export const deleteInvoicePayment = (officeId: string, invoiceId: string, paymentId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - undefined, - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, + + ) +}; } diff --git a/test/generated/base/invoicePayments/invoicePayments.configs.ts b/test/generated/base/invoicePayments/invoicePayments.configs.ts index a5d2a8d..9f2d9ca 100644 --- a/test/generated/base/invoicePayments/invoicePayments.configs.ts +++ b/test/generated/base/invoicePayments/invoicePayments.configs.ts @@ -5,139 +5,140 @@ import { InvoicePaymentsQueries } from "./invoicePayments.queries"; import { InvoicePaymentsAcl } from "./invoicePayments.acl"; export namespace InvoicePaymentsConfigs { - export const paymentsConfig = { +export const paymentsConfig = { meta: { - title: "Payments", + title: "Payments", }, readAll: { - acl: InvoicePaymentsAcl.canUseListOfficePayments, - schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, - paginated: InvoicePaymentsQueries.useListOfficePayments, - infinite: InvoicePaymentsQueries.useListOfficePaymentsInfinite, - filters: { - schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, - options: { - inputs: { - search: true, - paymentDate: true, - invoiceIssuingDate: true, - invoiceDirection: true, - createdBy: true, - businessPartner: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: InvoicePaymentsAcl.canUseListOfficePayments, schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, - options: { - columns: { - id: true, - amount: true, - positionNumber: true, - currencyNotation: true, - paymentDate: true, - paymentMethod: true, - comment: true, - createdAt: true, - updatedAt: true, - createdBy: true, - invoice: true, - businessPartner: true, - }, - sortable: InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema, + paginated: InvoicePaymentsQueries.useListOfficePayments, + infinite: InvoicePaymentsQueries.useListOfficePaymentsInfinite, + filters: { + schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, + options: { + inputs: { + search: true, + paymentDate: true, + invoiceIssuingDate: true, + invoiceDirection: true, + createdBy: true, + businessPartner: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, + options: { + columns: { + id: true, + amount: true, + positionNumber: true, + currencyNotation: true, + paymentDate: true, + paymentMethod: true, + comment: true, + createdAt: true, + updatedAt: true, + createdBy: true, + invoice: true, + businessPartner: true, + }, + sortable: InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema, + }, +}), }, create: { - acl: InvoicePaymentsAcl.canUseBulkCreatePayments, - schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, - mutation: InvoicePaymentsQueries.useBulkCreatePayments, - inputDefs: dynamicInputs({ + acl: InvoicePaymentsAcl.canUseBulkCreatePayments, schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, - options: { - inputs: { - paymentDate: true, - invoiceIds: true, - comment: true, - }, - }, - }), + mutation: InvoicePaymentsQueries.useBulkCreatePayments, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, + options: { + inputs: { + paymentDate: true, + invoiceIds: true, + comment: true, }, - }; + }, +}) + }, +}; - export const invoicesPaymentsConfig = { +export const invoicesPaymentsConfig = { meta: { - title: "Invoices Payments", + title: "Invoices Payments", }, readAll: { - acl: InvoicePaymentsAcl.canUseList, - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - paginated: InvoicePaymentsQueries.useList, - infinite: InvoicePaymentsQueries.useListInfinite, - columns: dynamicColumns({ + acl: InvoicePaymentsAcl.canUseList, schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - options: { - columns: { - id: true, - amount: true, - currencyNotation: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - bankAccount: true, - comment: true, - createdAt: true, - updatedAt: true, - createdBy: true, - }, - }, - }), + paginated: InvoicePaymentsQueries.useList, + infinite: InvoicePaymentsQueries.useListInfinite, + columns: dynamicColumns({ + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + options: { + columns: { + id: true, + amount: true, + currencyNotation: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + bankAccount: true, + comment: true, + createdAt: true, + updatedAt: true, + createdBy: true, + }, + }, +}), }, read: { - acl: InvoicePaymentsAcl.canUseGetPaymentById, - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - query: InvoicePaymentsQueries.useGetPaymentById, + acl: InvoicePaymentsAcl.canUseGetPaymentById, + schema: InvoicePaymentsModels.PaymentResponseDtoSchema, + query: InvoicePaymentsQueries.useGetPaymentById, }, create: { - acl: InvoicePaymentsAcl.canUseCreate, - schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, - mutation: InvoicePaymentsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: InvoicePaymentsAcl.canUseCreate, schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, - options: { - inputs: { - amount: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - comment: true, - }, - }, - }), + mutation: InvoicePaymentsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, + options: { + inputs: { + amount: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + comment: true, + }, + }, +}) }, update: { - acl: InvoicePaymentsAcl.canUseUpdate, - schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, - mutation: InvoicePaymentsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: InvoicePaymentsAcl.canUseUpdate, schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, - options: { - inputs: { - amount: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - comment: true, - }, - }, - }), + mutation: InvoicePaymentsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, + options: { + inputs: { + amount: true, + paymentDate: true, + paymentMethod: true, + bankAccountId: true, + comment: true, + }, + }, +}) }, delete: { - acl: InvoicePaymentsAcl.canUseDeleteInvoicePayment, - mutation: InvoicePaymentsQueries.useDeleteInvoicePayment, + acl: InvoicePaymentsAcl.canUseDeleteInvoicePayment, + mutation: InvoicePaymentsQueries.useDeleteInvoicePayment, }, - }; +}; + } diff --git a/test/generated/base/invoicePayments/invoicePayments.models.ts b/test/generated/base/invoicePayments/invoicePayments.models.ts index 02ad0be..23fae1a 100644 --- a/test/generated/base/invoicePayments/invoicePayments.models.ts +++ b/test/generated/base/invoicePayments/invoicePayments.models.ts @@ -2,469 +2,291 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace InvoicePaymentsModels { - /** - * OfficePaymentTotalAmountsDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ - export const OfficePaymentTotalAmountsDtoSchema = z - .object({ amount: z.number(), currencyNotation: z.string() }) - .readonly(); - export type OfficePaymentTotalAmountsDto = z.infer; +/** + * OfficePaymentTotalAmountsDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ +export const OfficePaymentTotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); +export type OfficePaymentTotalAmountsDto = z.infer; - /** - * OfficePaymentListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { OfficePaymentTotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ - export const OfficePaymentListResponseDtoSchema = z - .object({ - items: z.array(z.string()).readonly().describe("Items"), - totalAmounts: z.array(OfficePaymentTotalAmountsDtoSchema).readonly(), - page: z.number().describe("1-indexed page number to begin from").nullish(), - cursor: z.string().describe("ID of item to start after").nullish(), - nextCursor: z.string().describe("Cursor for next set of items").nullish(), - limit: z.number().describe("Items per response"), - totalItems: z.number().describe("Total available items"), - }) - .readonly(); - export type OfficePaymentListResponseDto = z.infer; +/** + * OfficePaymentListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { OfficePaymentTotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const OfficePaymentListResponseDtoSchema = z.object({ items: z.array(z.string()), totalAmounts: z.array(OfficePaymentTotalAmountsDtoSchema), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); +export type OfficePaymentListResponseDto = z.infer; - /** - * OfficePaymentPreviewInvoiceDtoSchema - * @type { object } - * @property { string } id - * @property { string } invoiceNumber - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection - * @property { number } grossAmount - * @property { CommonModels.InvoiceStatusEnum } status - * @property { string } paidOn - * @property { string } issuingDate - */ - export const OfficePaymentPreviewInvoiceDtoSchema = z - .object({ - id: z.string(), - invoiceNumber: z.string(), - invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, - grossAmount: z.number(), - status: CommonModels.InvoiceStatusEnumSchema, - paidOn: z.iso.datetime({ offset: true }).nullable(), - issuingDate: z.iso.datetime({ offset: true }).nullable(), - }) - .readonly(); - export type OfficePaymentPreviewInvoiceDto = z.infer; +/** + * OfficePaymentPreviewInvoiceDtoSchema + * @type { object } + * @property { string } id + * @property { string } invoiceNumber + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection + * @property { number } grossAmount + * @property { CommonModels.InvoiceStatusEnum } status + * @property { string } paidOn + * @property { string } issuingDate + */ +export const OfficePaymentPreviewInvoiceDtoSchema = z.object({ id: z.string(), invoiceNumber: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, grossAmount: z.number(), status: CommonModels.InvoiceStatusEnumSchema, paidOn: z.iso.datetime({ offset: true }).nullable(), issuingDate: z.iso.datetime({ offset: true }).nullable() }); +export type OfficePaymentPreviewInvoiceDto = z.infer; - /** - * PaymentMethodEnumSchema - * @type { enum } - */ - export const PaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); - export type PaymentMethodEnum = z.infer; - export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; +/** + * PaymentMethodEnumSchema + * @type { enum } + */ +export const PaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); +export type PaymentMethodEnum = z.infer; +export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; - /** - * OfficePaymentPreviewCreatedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type OfficePaymentPreviewCreatedByDto = z.infer; +/** + * OfficePaymentPreviewCreatedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type OfficePaymentPreviewCreatedByDto = z.infer; - /** - * OfficePaymentBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ - export const OfficePaymentBusinessPartnerDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), - }) - .readonly(); - export type OfficePaymentBusinessPartnerDto = z.infer; +/** + * OfficePaymentBusinessPartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const OfficePaymentBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); +export type OfficePaymentBusinessPartnerDto = z.infer; - /** - * OfficePaymentPreviewDtoSchema - * @type { object } - * @property { string } id - * @property { number } amount - * @property { string } positionNumber - * @property { string } currencyNotation - * @property { string } paymentDate - * @property { PaymentMethodEnum } paymentMethod - * @property { string } comment - * @property { string } createdAt - * @property { string } updatedAt - * @property { OfficePaymentPreviewCreatedByDto } createdBy - * @property { OfficePaymentPreviewInvoiceDto } invoice - * @property { OfficePaymentBusinessPartnerDto } businessPartner - */ - export const OfficePaymentPreviewDtoSchema = z - .object({ - id: z.string(), - amount: z.number(), - positionNumber: z.string(), - currencyNotation: z.string(), - paymentDate: z.iso.datetime({ offset: true }), - paymentMethod: PaymentMethodEnumSchema, - comment: z.string().nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - createdBy: OfficePaymentPreviewCreatedByDtoSchema, - invoice: OfficePaymentPreviewInvoiceDtoSchema, - businessPartner: OfficePaymentBusinessPartnerDtoSchema.nullish(), - }) - .readonly(); - export type OfficePaymentPreviewDto = z.infer; +/** + * OfficePaymentPreviewDtoSchema + * @type { object } + * @property { string } id + * @property { number } amount + * @property { string } positionNumber + * @property { string } currencyNotation + * @property { string } paymentDate + * @property { PaymentMethodEnum } paymentMethod + * @property { string } comment + * @property { string } createdAt + * @property { string } updatedAt + * @property { OfficePaymentPreviewCreatedByDto } createdBy + * @property { OfficePaymentPreviewInvoiceDto } invoice + * @property { OfficePaymentBusinessPartnerDto } businessPartner + */ +export const OfficePaymentPreviewDtoSchema = z.object({ id: z.string(), amount: z.number(), positionNumber: z.string(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: OfficePaymentPreviewCreatedByDtoSchema, invoice: OfficePaymentPreviewInvoiceDtoSchema, businessPartner: OfficePaymentBusinessPartnerDtoSchema.nullish() }); +export type OfficePaymentPreviewDto = z.infer; - /** - * OfficeInvoicePaymentFilterDtoSchema - * @type { object } - * @property { string } search Search by invoice number - * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range - * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction - * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) - * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) - */ - export const OfficeInvoicePaymentFilterDtoSchema = z - .object({ - search: z.string().describe("Search by invoice number"), - paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), - invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), - invoiceDirection: z - .array(CommonModels.InvoiceDirectionEnumSchema) - .readonly() - .describe("Filter by invoice direction"), - createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), - businessPartner: z - .array(z.string()) - .readonly() - .describe("Filter by invoice customer/business partner (array of UUIDs)"), - }) - .readonly(); - export type OfficeInvoicePaymentFilterDto = z.infer; +/** + * OfficeInvoicePaymentFilterDtoSchema + * @type { object } + * @property { string } search Search by invoice number + * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range + * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction + * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) + * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) + */ +export const OfficeInvoicePaymentFilterDtoSchema = z.object({ search: z.string().nullable(), paymentDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), createdBy: z.array(z.string()).nullable(), businessPartner: z.array(z.string()).nullable() }).partial(); +export type OfficeInvoicePaymentFilterDto = z.infer; - /** - * BulkCreatePaymentBusinessPartnerDtoSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } name Business partner name - * @property { string } paymentDate Payment date applied to the partner invoices - */ - export const BulkCreatePaymentBusinessPartnerDtoSchema = z - .object({ - id: z.string().describe("Business partner ID"), - name: z.string().describe("Business partner name"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date applied to the partner invoices"), - }) - .readonly(); - export type BulkCreatePaymentBusinessPartnerDto = z.infer; +/** + * BulkCreatePaymentBusinessPartnerDtoSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } name Business partner name + * @property { string } paymentDate Payment date applied to the partner invoices + */ +export const BulkCreatePaymentBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), paymentDate: z.iso.datetime({ offset: true }) }); +export type BulkCreatePaymentBusinessPartnerDto = z.infer; - /** - * BulkCreatePaymentsResponseDtoSchema - * @type { object } - * @property { BulkCreatePaymentBusinessPartnerDto[] } businessPartners List of business partners paid in this bulk operation - */ - export const BulkCreatePaymentsResponseDtoSchema = z - .object({ - businessPartners: z - .array(BulkCreatePaymentBusinessPartnerDtoSchema) - .readonly() - .describe("List of business partners paid in this bulk operation"), - }) - .readonly(); - export type BulkCreatePaymentsResponseDto = z.infer; +/** + * BulkCreatePaymentsResponseDtoSchema + * @type { object } + * @property { BulkCreatePaymentBusinessPartnerDto[] } businessPartners List of business partners paid in this bulk operation + */ +export const BulkCreatePaymentsResponseDtoSchema = z.object({ businessPartners: z.array(BulkCreatePaymentBusinessPartnerDtoSchema) }); +export type BulkCreatePaymentsResponseDto = z.infer; - /** - * CalculatePaymentItemDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } businessPartnerName - * @property { number } amount - * @property { string } currency - */ - export const CalculatePaymentItemDtoSchema = z - .object({ - businessPartnerId: z.string(), - businessPartnerName: z.string(), - amount: z.number(), - currency: z.string(), - }) - .readonly(); - export type CalculatePaymentItemDto = z.infer; +/** + * CalculatePaymentItemDtoSchema + * @type { object } + * @property { string } businessPartnerId + * @property { string } businessPartnerName + * @property { number } amount + * @property { string } currency + */ +export const CalculatePaymentItemDtoSchema = z.object({ businessPartnerId: z.string(), businessPartnerName: z.string(), amount: z.number(), currency: z.string() }); +export type CalculatePaymentItemDto = z.infer; - /** - * CalculatePaymentTotalDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currency - */ - export const CalculatePaymentTotalDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); - export type CalculatePaymentTotalDto = z.infer; +/** + * CalculatePaymentTotalDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currency + */ +export const CalculatePaymentTotalDtoSchema = z.object({ amount: z.number(), currency: z.string() }); +export type CalculatePaymentTotalDto = z.infer; - /** - * CalculatePaymentsResponseDtoSchema - * @type { object } - * @property { CalculatePaymentItemDto[] } payments - * @property { CalculatePaymentTotalDto[] } totals - */ - export const CalculatePaymentsResponseDtoSchema = z - .object({ - payments: z.array(CalculatePaymentItemDtoSchema).readonly(), - totals: z.array(CalculatePaymentTotalDtoSchema).readonly(), - }) - .readonly(); - export type CalculatePaymentsResponseDto = z.infer; +/** + * CalculatePaymentsResponseDtoSchema + * @type { object } + * @property { CalculatePaymentItemDto[] } payments + * @property { CalculatePaymentTotalDto[] } totals + */ +export const CalculatePaymentsResponseDtoSchema = z.object({ payments: z.array(CalculatePaymentItemDtoSchema), totals: z.array(CalculatePaymentTotalDtoSchema) }); +export type CalculatePaymentsResponseDto = z.infer; - /** - * OfficeInvoicePaymentExportFilterDtoSchema - * @type { object } - * @property { string } search Search by invoice number - * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range - * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction - * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) - * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) - */ - export const OfficeInvoicePaymentExportFilterDtoSchema = z - .object({ - search: z.string().describe("Search by invoice number"), - paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), - invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), - invoiceDirection: z - .array(CommonModels.InvoiceDirectionEnumSchema) - .readonly() - .describe("Filter by invoice direction"), - createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), - businessPartner: z - .array(z.string()) - .readonly() - .describe("Filter by invoice customer/business partner (array of UUIDs)"), - }) - .readonly(); - export type OfficeInvoicePaymentExportFilterDto = z.infer; +/** + * OfficeInvoicePaymentExportFilterDtoSchema + * @type { object } + * @property { string } search Search by invoice number + * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range + * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction + * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) + * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) + */ +export const OfficeInvoicePaymentExportFilterDtoSchema = z.object({ search: z.string().nullable(), paymentDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), createdBy: z.array(z.string()).nullable(), businessPartner: z.array(z.string()).nullable() }).partial(); +export type OfficeInvoicePaymentExportFilterDto = z.infer; - /** - * OfficeInvoicePaymentExportColumnSchema - * @type { enum } - */ - export const OfficeInvoicePaymentExportColumnSchema = z.enum([ - "amount", - "currency", - "paymentDate", - "paymentMethod", - "comment", - "positionNumber", - "invoiceNumber", - "invoiceDirection", - "invoiceStatus", - "invoiceIssuingDate", - "invoiceGrossAmount", - "invoicePaidOn", - "businessPartnerName", - "createdByName", - ]); - export type OfficeInvoicePaymentExportColumn = z.infer; - export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumnSchema.enum; +/** + * OfficeInvoicePaymentExportColumnSchema + * @type { enum } + */ +export const OfficeInvoicePaymentExportColumnSchema = z.enum(["amount", "currency", "paymentDate", "paymentMethod", "comment", "positionNumber", "invoiceNumber", "invoiceDirection", "invoiceStatus", "invoiceIssuingDate", "invoiceGrossAmount", "invoicePaidOn", "businessPartnerName", "createdByName"]); +export type OfficeInvoicePaymentExportColumn = z.infer; +export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumnSchema.enum; - /** - * OfficeInvoicePaymentExportRequestDtoSchema - * @type { object } - * @property { OfficeInvoicePaymentExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { OfficeInvoicePaymentExportFilterDto } filter - */ - export const OfficeInvoicePaymentExportRequestDtoSchema = z - .object({ - columns: z.array(OfficeInvoicePaymentExportColumnSchema).readonly().min(1), - order: z.array(z.string()).readonly(), - filter: OfficeInvoicePaymentExportFilterDtoSchema, - }) - .readonly(); - export type OfficeInvoicePaymentExportRequestDto = z.infer; +/** + * OfficeInvoicePaymentExportRequestDtoSchema + * @type { object } + * @property { OfficeInvoicePaymentExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { OfficeInvoicePaymentExportFilterDto } filter + */ +export const OfficeInvoicePaymentExportRequestDtoSchema = z.object({ columns: z.array(OfficeInvoicePaymentExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: OfficeInvoicePaymentExportFilterDtoSchema.nullable() }).partial(); +export type OfficeInvoicePaymentExportRequestDto = z.infer; - /** - * PaymentCreatedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PaymentCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type PaymentCreatedByDto = z.infer; +/** + * PaymentCreatedByDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PaymentCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type PaymentCreatedByDto = z.infer; - /** - * PaymentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { number } amount - * @property { string } currencyNotation - * @property { string } paymentDate - * @property { PaymentMethodEnum } paymentMethod - * @property { string } bankAccountId - * @property { string } bankAccount - * @property { string } comment - * @property { string } createdAt - * @property { string } updatedAt - * @property { PaymentCreatedByDto } createdBy - */ - export const PaymentResponseDtoSchema = z - .object({ - id: z.string(), - amount: z.number(), - currencyNotation: z.string(), - paymentDate: z.iso.datetime({ offset: true }), - paymentMethod: PaymentMethodEnumSchema, - bankAccountId: z.string().nullish(), - bankAccount: z.string().nullish(), - comment: z.string().nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - createdBy: PaymentCreatedByDtoSchema.nullish(), - }) - .readonly(); - export type PaymentResponseDto = z.infer; +/** + * PaymentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { number } amount + * @property { string } currencyNotation + * @property { string } paymentDate + * @property { PaymentMethodEnum } paymentMethod + * @property { string } bankAccountId + * @property { string } bankAccount + * @property { string } comment + * @property { string } createdAt + * @property { string } updatedAt + * @property { PaymentCreatedByDto } createdBy + */ +export const PaymentResponseDtoSchema = z.object({ id: z.string(), amount: z.number(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, bankAccountId: z.string().nullish(), bankAccount: z.string().nullish(), comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: PaymentCreatedByDtoSchema.nullish() }); +export type PaymentResponseDto = z.infer; - /** - * PositionInvoicePaymentMethodEnumSchema - * @type { enum } - */ - export const PositionInvoicePaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); - export type PositionInvoicePaymentMethodEnum = z.infer; - export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnumSchema.enum; +/** + * PositionInvoicePaymentMethodEnumSchema + * @type { enum } + */ +export const PositionInvoicePaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); +export type PositionInvoicePaymentMethodEnum = z.infer; +export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnumSchema.enum; - /** - * CreateInvoicePaymentRequestDtoSchema - * @type { object } - * @property { number } amount Payment amount - * @property { string } paymentDate Payment date - * @property { PositionInvoicePaymentMethodEnum } paymentMethod Payment method - * @property { string } bankAccountId Bank account ID - * @property { string } comment Optional comment - */ - export const CreateInvoicePaymentRequestDtoSchema = z - .object({ - amount: z.number().describe("Payment amount"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), - paymentMethod: PositionInvoicePaymentMethodEnumSchema.describe("Payment method"), - bankAccountId: z.string().describe("Bank account ID").nullish(), - comment: z.string().describe("Optional comment").nullish(), - }) - .readonly(); - export type CreateInvoicePaymentRequestDto = z.infer; +/** + * CreateInvoicePaymentRequestDtoSchema + * @type { object } + * @property { number } amount Payment amount + * @property { string } paymentDate Payment date + * @property { PositionInvoicePaymentMethodEnum } paymentMethod Payment method + * @property { string } bankAccountId Bank account ID + * @property { string } comment Optional comment + */ +export const CreateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PositionInvoicePaymentMethodEnumSchema, bankAccountId: z.string().nullish(), comment: z.string().nullish() }); +export type CreateInvoicePaymentRequestDto = z.infer; - /** - * UpdateInvoicePaymentRequestDtoSchema - * @type { object } - * @property { number } amount Payment amount. Minimum: `0.01` - * @property { string } paymentDate Payment date - * @property { string } paymentMethod Payment method - * @property { string } bankAccountId Bank account ID - * @property { string } comment Payment comment - */ - export const UpdateInvoicePaymentRequestDtoSchema = z - .object({ - amount: z.number().gte(0.01).describe("Payment amount"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), - paymentMethod: PaymentMethodEnumSchema.describe("Payment method"), - bankAccountId: z.string().describe("Bank account ID"), - comment: z.string().describe("Payment comment"), - }) - .readonly(); - export type UpdateInvoicePaymentRequestDto = z.infer; +/** + * UpdateInvoicePaymentRequestDtoSchema + * @type { object } + * @property { number } amount Payment amount. Minimum: `0.01` + * @property { string } paymentDate Payment date + * @property { string } paymentMethod Payment method + * @property { string } bankAccountId Bank account ID + * @property { string } comment Payment comment + */ +export const UpdateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number().gte(0.01).nullable(), paymentDate: z.iso.datetime({ offset: true }).nullable(), paymentMethod: PaymentMethodEnumSchema.nullable(), bankAccountId: z.string().nullable(), comment: z.string().nullable() }).partial(); +export type UpdateInvoicePaymentRequestDto = z.infer; - /** - * BulkCreatePaymentsRequestDtoSchema - * @type { object } - * @property { string } paymentDate Payment date for all payments - * @property { string[] } invoiceIds List of invoice IDs to create payments for. Min Items: `1` - * @property { string } comment - */ - export const BulkCreatePaymentsRequestDtoSchema = z - .object({ - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date for all payments"), - invoiceIds: z.array(z.string()).readonly().min(1).describe("List of invoice IDs to create payments for"), - comment: z.string().nullish(), - }) - .readonly(); - export type BulkCreatePaymentsRequestDto = z.infer; +/** + * BulkCreatePaymentsRequestDtoSchema + * @type { object } + * @property { string } paymentDate Payment date for all payments + * @property { string[] } invoiceIds List of invoice IDs to create payments for. Min Items: `1` + * @property { string } comment + */ +export const BulkCreatePaymentsRequestDtoSchema = z.object({ paymentDate: z.iso.datetime({ offset: true }), invoiceIds: z.array(z.string()).min(1), comment: z.string().nullish() }); +export type BulkCreatePaymentsRequestDto = z.infer; - /** - * CalculatePaymentsRequestDtoSchema - * @type { object } - * @property { string[] } invoiceIds Invoice IDs (UUID v4). Min Items: `1`. Max Items: `30` - */ - export const CalculatePaymentsRequestDtoSchema = z - .object({ invoiceIds: z.array(z.string()).readonly().min(1).max(30).describe("Invoice IDs (UUID v4)") }) - .readonly(); - export type CalculatePaymentsRequestDto = z.infer; +/** + * CalculatePaymentsRequestDtoSchema + * @type { object } + * @property { string[] } invoiceIds Invoice IDs (UUID v4). Min Items: `1`. Max Items: `30` + */ +export const CalculatePaymentsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).min(1).max(30) }); +export type CalculatePaymentsRequestDto = z.infer; - /** - * ListOfficePaymentsOrderParamEnumSchema - * @type { enum } - */ - export const ListOfficePaymentsOrderParamEnumSchema = z.enum([ - "paymentDate", - "amount", - "paymentMethod", - "comment", - "createdAt", - "updatedAt", - "currencyNotation", - "createdByName", - "invoiceNumber", - "invoiceDirection", - "invoiceGrossAmount", - "invoiceStatus", - "invoicePaidOn", - "invoiceIssuingDate", - ]); - export type ListOfficePaymentsOrderParamEnum = z.infer; - export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnumSchema.enum; +/** + * ListOfficePaymentsOrderParamEnumSchema + * @type { enum } + */ +export const ListOfficePaymentsOrderParamEnumSchema = z.enum(["paymentDate", "amount", "paymentMethod", "comment", "createdAt", "updatedAt", "currencyNotation", "createdByName", "invoiceNumber", "invoiceDirection", "invoiceGrossAmount", "invoiceStatus", "invoicePaidOn", "invoiceIssuingDate"]); +export type ListOfficePaymentsOrderParamEnum = z.infer; +export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnumSchema.enum; - /** - * ListOfficePaymentsResponseSchema - * @type { object } - * @property { OfficePaymentTotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficePaymentPreviewDto[] } items - */ - export const ListOfficePaymentsResponseSchema = z.object({ - ...OfficePaymentListResponseDtoSchema.shape, - ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).readonly() }).readonly().shape, - }); - export type ListOfficePaymentsResponse = z.infer; +/** + * ListOfficePaymentsResponseSchema + * @type { object } + * @property { OfficePaymentTotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficePaymentPreviewDto[] } items + */ +export const ListOfficePaymentsResponseSchema = z.object({ ...OfficePaymentListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).nullable() }).partial().shape }); +export type ListOfficePaymentsResponse = z.infer; + +/** + * InvoicePaymentsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PaymentResponseDto[] } items + */ +export const InvoicePaymentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentResponseDtoSchema).nullable() }).partial().shape }); +export type InvoicePaymentsListResponse = z.infer; - /** - * InvoicePaymentsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PaymentResponseDto[] } items - */ - export const InvoicePaymentsListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PaymentResponseDtoSchema).readonly() }).readonly().shape, - }); - export type InvoicePaymentsListResponse = z.infer; } diff --git a/test/generated/base/invoicePayments/invoicePayments.queries.ts b/test/generated/base/invoicePayments/invoicePayments.queries.ts index 2616d8a..e31c011 100644 --- a/test/generated/base/invoicePayments/invoicePayments.queries.ts +++ b/test/generated/base/invoicePayments/invoicePayments.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,459 +8,318 @@ import { InvoicePaymentsModels } from "./invoicePayments.models"; import { InvoicePaymentsApi } from "./invoicePayments.api"; export namespace InvoicePaymentsQueries { - export const moduleName = QueryModule.InvoicePayments; +export const moduleName = QueryModule.InvoicePayments; - export const keys = { +export const keys = { all: [moduleName] as const, - listOfficePayments: ( - officeId: string, - limit?: number, - order?: string, - filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/payments", officeId, limit, order, filter, page, cursor] as const, - listOfficePaymentsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/payments", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, invoiceId: string, limit?: number, page?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/invoices/:invoiceId/payments", - officeId, - invoiceId, - limit, - page, - cursor, - ] as const, - listInfinite: (officeId: string, invoiceId: string, limit?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/invoices/:invoiceId/payments", - "infinite", - officeId, - invoiceId, - limit, - cursor, - ] as const, - getPaymentById: (officeId: string, invoiceId: string, paymentId: string) => - [ - ...keys.all, - "/offices/:officeId/invoices/:invoiceId/payments/:paymentId", - officeId, - invoiceId, - paymentId, - ] as const, - }; + listOfficePayments: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payments", officeId, limit, order, filter, page, cursor] as const, + listOfficePaymentsInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/payments", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, invoiceId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", officeId, invoiceId, limit, page, cursor] as const, + listInfinite: (officeId: string, invoiceId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", "infinite", officeId, invoiceId, limit, cursor] as const, + getPaymentById: (officeId: string, invoiceId: string, paymentId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments/:paymentId", officeId, invoiceId, paymentId] as const, +}; - /** - * Query `useListOfficePayments` - * @summary List all payments for an office - * @permission Requires `canUseListOfficePayments` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` - * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListOfficePayments = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useListOfficePayments` + * @summary List all payments for an office + * @permission Requires `canUseListOfficePayments` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` + * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListOfficePayments = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId })); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useListOfficePaymentsInfinite + * @summary List all payments for an office + * @permission Requires `canUseListOfficePayments` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` + * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListOfficePaymentsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListOfficePaymentsInfinite - * @summary List all payments for an office - * @permission Requires `canUseListOfficePayments` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` - * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListOfficePaymentsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId })); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Mutation `useBulkCreatePayments` - * @summary Bulk create payments for multiple invoices - * @permission Requires `canUseBulkCreatePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.BulkCreatePaymentsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useBulkCreatePayments = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.bulkCreatePayments, - { officeId: string; data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useBulkCreatePayments` + * @summary Bulk create payments for multiple invoices + * @permission Requires `canUseBulkCreatePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.BulkCreatePaymentsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useBulkCreatePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId })); - return InvoicePaymentsApi.bulkCreatePayments(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCalculatePayments` - * @summary Calculate grouped payments for provided invoices - * @permission Requires `canUseCalculatePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.CalculatePaymentsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useCalculatePayments = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.calculatePayments, - { officeId: string; data: InvoicePaymentsModels.CalculatePaymentsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId } )); + return InvoicePaymentsApi.bulkCreatePayments(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId })); - return InvoicePaymentsApi.calculatePayments(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useCalculatePayments` + * @summary Calculate grouped payments for provided invoices + * @permission Requires `canUseCalculatePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.CalculatePaymentsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useCalculatePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useExportOfficePayments` - recommended when file should not be cached - * @summary Export office invoice payments to Excel - * @permission Requires `canUseExportOfficePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportOfficePayments = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.exportOfficePayments, - { officeId: string; data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId } )); + return InvoicePaymentsApi.calculatePayments(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId })); - return InvoicePaymentsApi.exportOfficePayments(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useExportOfficePayments` - recommended when file should not be cached + * @summary Export office invoice payments to Excel + * @permission Requires `canUseExportOfficePayments` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportOfficePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `useList` - * @summary List payments for an invoice - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - invoiceId, - limit, - page, - cursor, - }: { officeId: string; invoiceId: string; limit: number; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId } )); + return InvoicePaymentsApi.exportOfficePayments(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useQuery({ - queryKey: keys.list(officeId, invoiceId, limit, page, cursor), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseList({ officeId })); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `useList` + * @summary List payments for an invoice + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, invoiceId, limit, page, cursor }: { officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, invoiceId, limit, page, cursor), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); + return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `useListInfinite - * @summary List payments for an invoice - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { officeId, invoiceId, limit, cursor }: { officeId: string; invoiceId: string; limit: number; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `useListInfinite + * @summary List payments for an invoice + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, invoiceId, limit, cursor }: { officeId: string, invoiceId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicePaymentsAcl.canUseList({ officeId })); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); + return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Mutation `useCreate` - * @summary Create a payment for an invoice - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicePaymentsModels.CreateInvoicePaymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.create, - { officeId: string; invoiceId: string; data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create a payment for an invoice + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicePaymentsModels.CreateInvoicePaymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId })); - return InvoicePaymentsApi.create(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId } )); + return InvoicePaymentsApi.create(officeId, invoiceId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useGetPaymentById` - * @summary Get a payment by ID - * @permission Requires `canUseGetPaymentById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { string } object.paymentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetPaymentById = ( - { officeId, invoiceId, paymentId }: { officeId: string; invoiceId: string; paymentId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetPaymentById` + * @summary Get a payment by ID + * @permission Requires `canUseGetPaymentById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { string } object.paymentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetPaymentById = ({ officeId, invoiceId, paymentId }: { officeId: string, invoiceId: string, paymentId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), + queryFn: () => { + checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId } )); + return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId })); - return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update a payment + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.paymentId Path parameter + * @param { InvoicePaymentsModels.UpdateInvoicePaymentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update a payment - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.paymentId Path parameter - * @param { InvoicePaymentsModels.UpdateInvoicePaymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.update, - { - officeId: string; - invoiceId: string; - paymentId: string; - data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, invoiceId, paymentId, data }) => { + checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId } )); + return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId, paymentId } = variables; + const updateKeys = [keys.getPaymentById(officeId, invoiceId, paymentId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, invoiceId, paymentId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId })); - return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId, paymentId } = variables; - const updateKeys = [keys.getPaymentById(officeId, invoiceId, paymentId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteInvoicePayment` + * @summary Delete a payment + * @permission Requires `canUseDeleteInvoicePayment` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.paymentId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteInvoicePayment = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteInvoicePayment` - * @summary Delete a payment - * @permission Requires `canUseDeleteInvoicePayment` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.paymentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteInvoicePayment = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.deleteInvoicePayment, - { officeId: string; invoiceId: string; paymentId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, invoiceId, paymentId }) => { + checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId } )); + return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, invoiceId, paymentId }) => { - checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId })); - return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/invoices/invoices.acl.ts b/test/generated/base/invoices/invoices.acl.ts index c9eae2a..65b9c24 100644 --- a/test/generated/base/invoices/invoices.acl.ts +++ b/test/generated/base/invoices/invoices.acl.ts @@ -1,375 +1,407 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace InvoicesAcl { - /** - * Use for `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download invoices as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation - */ - export const canUseGetInvoicesEml = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useFind` query ability. For global ability, omit the object parameter. - * @description List invoices for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query - */ - export const canUseFind = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useChangeIncomingCustomer` mutation ability. For global ability, omit the object parameter. - * @description PositionInvoice Fix - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useChangeIncomingCustomer` mutation - */ - export const canUseChangeIncomingCustomer = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useFindByOffice` query ability. For global ability, omit the object parameter. - * @description List invoices for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByOffice` query - */ - export const canUseFindByOffice = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useCreateDraft` mutation ability. For global ability, omit the object parameter. - * @description Create invoice for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDraft` mutation - */ - export const canUseCreateDraft = (object?: { officeId: string }) => - ["Create", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Create", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useExportInvoices` mutation ability. For global ability, omit the object parameter. - * @description Export invoices for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportInvoices` mutation - */ - export const canUseExportInvoices = (object?: { officeId: string }) => - ["Export", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Export", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useExportCharges` mutation ability. For global ability, omit the object parameter. - * @description Export invoice charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportCharges` mutation - */ - export const canUseExportCharges = (object?: { officeId: string }) => - ["Export", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Export", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetUnCharges` query ability. For global ability, omit the object parameter. - * @description List uninvoiced charges for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetUnCharges` query - */ - export const canUseGetUnCharges = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ - export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetOfficeUnCharges` query ability. For global ability, omit the object parameter. - * @description List uninvoiced charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetOfficeUnCharges` query - */ - export const canUseGetOfficeUnCharges = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useExportUnCharges` mutation ability. For global ability, omit the object parameter. - * @description Export uninvoiced charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportUnCharges` mutation - */ - export const canUseExportUnCharges = (object?: { officeId: string }) => - ["Export", object ? subject("UninvoicedCharge", object) : "UninvoicedCharge"] as AbilityTuple< - "Export", - "UninvoicedCharge" | (ForcedSubject<"UninvoicedCharge"> & { officeId: string }) - >; - - /** - * Use for `useCreateDirect` mutation ability. For global ability, omit the object parameter. - * @description Create direct invoice for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDirect` mutation - */ - export const canUseCreateDirect = (object?: { officeId: string }) => - ["CreateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "CreateDirectInvoice", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useAddChargeToDirect` mutation ability. For global ability, omit the object parameter. - * @description Add charge to direct invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddChargeToDirect` mutation - */ - export const canUseAddChargeToDirect = (object?: { officeId: string }) => - ["UpdateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "UpdateDirectInvoice", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useUpdateCharges` mutation ability. For global ability, omit the object parameter. - * @description Update invoice charges - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCharges` mutation - */ - export const canUseUpdateCharges = (object?: { officeId: string }) => - ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Update", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; - - /** - * Use for `useRemoveChargeFromDirect` mutation ability. For global ability, omit the object parameter. - * @description Remove charge from direct invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRemoveChargeFromDirect` mutation - */ - export const canUseRemoveChargeFromDirect = (object?: { officeId: string }) => - ["UpdateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "UpdateDirectInvoice", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetDetail` query ability. For global ability, omit the object parameter. - * @description Read invoice details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDetail` query - */ - export const canUseGetDetail = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useDeleteInvoice` mutation ability. For global ability, omit the object parameter. - * @description Delete invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoice` mutation - */ - export const canUseDeleteInvoice = (object?: { officeId: string }) => - ["Delete", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Delete", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useFix` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice accounting issues - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFix` mutation - */ - export const canUseFix = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ - export const canUseGenerate = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useUpdateIssuedVatRules` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice VAT rules - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedVatRules` mutation - */ - export const canUseUpdateIssuedVatRules = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useUpdateIssuedCharges` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice charges - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedCharges` mutation - */ - export const canUseUpdateIssuedCharges = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useIssue` mutation ability. For global ability, omit the object parameter. - * @description Issue invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssue` mutation - */ - export const canUseIssue = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useReportHungarian` mutation ability. For global ability, omit the object parameter. - * @description Report invoice to Hungarian tax authority - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReportHungarian` mutation - */ - export const canUseReportHungarian = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGenerateIncoming` mutation ability. For global ability, omit the object parameter. - * @description Generate incoming invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIncoming` mutation - */ - export const canUseGenerateIncoming = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useRegister` mutation ability. For global ability, omit the object parameter. - * @description Register invoice for bookkeeping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRegister` mutation - */ - export const canUseRegister = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetPreview` query or `useGetPreviewMutation` mutation ability. For global ability, omit the object parameter. - * @description View invoice preview - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` query or `useGetPreviewMutation` mutation - */ - export const canUseGetPreview = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download invoice as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation - */ - export const canUseGetInvoiceEml = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `usePrepareDocumentUpload` mutation ability. For global ability, omit the object parameter. - * @description Upload invoice document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareDocumentUpload` mutation - */ - export const canUsePrepareDocumentUpload = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ - export const canUseCancel = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useIssueCreditNote` mutation ability. For global ability, omit the object parameter. - * @description Issue credit note invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueCreditNote` mutation - */ - export const canUseIssueCreditNote = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download invoices as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation + */ +export const canUseGetInvoicesEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useFind` query ability. For global ability, omit the object parameter. + * @description List invoices for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query + */ +export const canUseFind = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useChangeIncomingCustomer` mutation ability. For global ability, omit the object parameter. + * @description PositionInvoice Fix + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useChangeIncomingCustomer` mutation + */ +export const canUseChangeIncomingCustomer = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useFindByOffice` query ability. For global ability, omit the object parameter. + * @description List invoices for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByOffice` query + */ +export const canUseFindByOffice = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useCreateDraft` mutation ability. For global ability, omit the object parameter. + * @description Create invoice for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDraft` mutation + */ +export const canUseCreateDraft = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Create", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportInvoices` mutation ability. For global ability, omit the object parameter. + * @description Export invoices for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportInvoices` mutation + */ +export const canUseExportInvoices = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportCharges` mutation ability. For global ability, omit the object parameter. + * @description Export invoice charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportCharges` mutation + */ +export const canUseExportCharges = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetUnCharges` query ability. For global ability, omit the object parameter. + * @description List uninvoiced charges for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetUnCharges` query + */ +export const canUseGetUnCharges = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ +export const canUseListAvailablePartnersFor = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetOfficeUnCharges` query ability. For global ability, omit the object parameter. + * @description List uninvoiced charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetOfficeUnCharges` query + */ +export const canUseGetOfficeUnCharges = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useExportUnCharges` mutation ability. For global ability, omit the object parameter. + * @description Export uninvoiced charges for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportUnCharges` mutation + */ +export const canUseExportUnCharges = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("UninvoicedCharge", object) : "UninvoicedCharge" +] as AbilityTuple<"Export", "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, }>; + +/** + * Use for `useCreateDirect` mutation ability. For global ability, omit the object parameter. + * @description Create direct invoice for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDirect` mutation + */ +export const canUseCreateDirect = ( + object?: { officeId: string, } +) => [ + "CreateDirectInvoice", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useAddChargeToDirect` mutation ability. For global ability, omit the object parameter. + * @description Add charge to direct invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddChargeToDirect` mutation + */ +export const canUseAddChargeToDirect = ( + object?: { officeId: string, } +) => [ + "UpdateDirectInvoice", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdateCharges` mutation ability. For global ability, omit the object parameter. + * @description Update invoice charges + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCharges` mutation + */ +export const canUseUpdateCharges = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useRemoveChargeFromDirect` mutation ability. For global ability, omit the object parameter. + * @description Remove charge from direct invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRemoveChargeFromDirect` mutation + */ +export const canUseRemoveChargeFromDirect = ( + object?: { officeId: string, } +) => [ + "UpdateDirectInvoice", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetDetail` query ability. For global ability, omit the object parameter. + * @description Read invoice details + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDetail` query + */ +export const canUseGetDetail = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useDeleteInvoice` mutation ability. For global ability, omit the object parameter. + * @description Delete invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoice` mutation + */ +export const canUseDeleteInvoice = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Delete", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useFix` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice accounting issues + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFix` mutation + */ +export const canUseFix = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdateIssuedVatRules` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice VAT rules + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedVatRules` mutation + */ +export const canUseUpdateIssuedVatRules = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useUpdateIssuedCharges` mutation ability. For global ability, omit the object parameter. + * @description Fix invoice charges + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedCharges` mutation + */ +export const canUseUpdateIssuedCharges = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useIssue` mutation ability. For global ability, omit the object parameter. + * @description Issue invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssue` mutation + */ +export const canUseIssue = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useReportHungarian` mutation ability. For global ability, omit the object parameter. + * @description Report invoice to Hungarian tax authority + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReportHungarian` mutation + */ +export const canUseReportHungarian = ( + object?: { officeId: string, } +) => [ + "Fix", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGenerateIncoming` mutation ability. For global ability, omit the object parameter. + * @description Generate incoming invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIncoming` mutation + */ +export const canUseGenerateIncoming = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useRegister` mutation ability. For global ability, omit the object parameter. + * @description Register invoice for bookkeeping + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRegister` mutation + */ +export const canUseRegister = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetPreview` query or `useGetPreviewMutation` mutation ability. For global ability, omit the object parameter. + * @description View invoice preview + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` query or `useGetPreviewMutation` mutation + */ +export const canUseGetPreview = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Download invoice as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation + */ +export const canUseGetInvoiceEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `usePrepareDocumentUpload` mutation ability. For global ability, omit the object parameter. + * @description Upload invoice document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareDocumentUpload` mutation + */ +export const canUsePrepareDocumentUpload = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ +export const canUseCancel = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useIssueCreditNote` mutation ability. For global ability, omit the object parameter. + * @description Issue credit note invoice + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueCreditNote` mutation + */ +export const canUseIssueCreditNote = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + } diff --git a/test/generated/base/invoices/invoices.api.ts b/test/generated/base/invoices/invoices.api.ts index 2ac0990..cc54d52 100644 --- a/test/generated/base/invoices/invoices.api.ts +++ b/test/generated/base/invoices/invoices.api.ts @@ -1,537 +1,327 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { InvoicesModels } from "./invoices.models"; import { CommonModels } from "@/data/common/common.models"; export namespace InvoicesApi { - export const getInvoicesEml = ( - officeId: string, - invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/eml`, { - ...config, - params: { - invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { - type: "query", - name: "invoiceIds", - }), - }, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }); - }; - - export const find = ( - officeId: string, - positionId: string, - limit: number, - order?: string, - filter?: InvoicesModels.InvoiceFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const getInvoicesEml = (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, ) => { return AppRestClient.get( - { resSchema: InvoicesModels.InvoicesFindResponseSchema }, - `/offices/${officeId}/positions/${positionId}/invoices`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const changeIncomingCustomer = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.ChangeInvoiceCustomerRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/eml`, + { + params: { + invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { type: "query", name: "invoiceIds" }), + }, + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const find = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: InvoicesModels.InvoicesFindResponseSchema }, + `/offices/${officeId}/positions/${positionId}/invoices`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const changeIncomingCustomer = (officeId: string, invoiceId: string, data: InvoicesModels.ChangeInvoiceCustomerRequestDto, ) => { return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/customer`, - ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), - config, - ); - }; - - export const findByOffice = ( - officeId: string, - limit: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/customer`, + ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), + + ) +}; +export const findByOffice = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: InvoicesModels.FindByOfficeResponseSchema }, - `/offices/${officeId}/invoices`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const createDraft = ( - officeId: string, - data: InvoicesModels.CreateDraftInvoiceRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicesModels.FindByOfficeResponseSchema }, + `/offices/${officeId}/invoices`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createDraft = (officeId: string, data: InvoicesModels.CreateDraftInvoiceRequestDto, ) => { return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices`, - ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), - config, - ); - }; - - export const exportInvoices = ( - officeId: string, - data: InvoicesModels.InvoiceExportRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices`, + ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), + + ) +}; +export const exportInvoices = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/exports`, - ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const exportCharges = ( - officeId: string, - data: InvoicesModels.InvoiceExportRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/exports`, + ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const exportCharges = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/charges/exports`, - ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const getUnCharges = ( - officeId: string, - positionId: string, - limit: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargePaginationDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/charges/exports`, + ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getUnCharges = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: InvoicesModels.GetUnChargesResponseSchema }, - `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const listAvailablePartnersFor = ( - officeId: string, - invoiceId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicesModels.GetUnChargesResponseSchema }, + `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listAvailablePartnersFor = (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { return AppRestClient.get( - { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/invoices/${invoiceId}/available-partners`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { - type: "query", - name: "useCase", - }), - }, - }, - ); - }; - - export const getOfficeUnCharges = ( - officeId: string, - limit: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargesFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/invoices/${invoiceId}/available-partners`, + { + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), + }, + } + ) +}; +export const getOfficeUnCharges = (officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, - `/offices/${officeId}/uninvoiced-charges`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const exportUnCharges = ( - officeId: string, - data: InvoicesModels.UninvoicedChargesExportRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, + `/offices/${officeId}/uninvoiced-charges`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const exportUnCharges = (officeId: string, data: InvoicesModels.UninvoicedChargesExportRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/uninvoiced-charges/exports`, - ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const createDirect = (officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/offices/${officeId}/direct-invoices`, undefined, config); - }; - - export const addChargeToDirect = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/uninvoiced-charges/exports`, + ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const createDirect = (officeId: string, ) => { return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges`, - ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), - config, - ); - }; - - export const updateCharges = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.UpdateInvoiceChargesRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/direct-invoices`, + + ) +}; +export const addChargeToDirect = (officeId: string, invoiceId: string, data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, ) => { + return AppRestClient.post( + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges`, + ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), + + ) +}; +export const updateCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceChargesRequestDto, ) => { return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges`, - ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), - config, - ); - }; - - export const removeChargeFromDirect = ( - officeId: string, - invoiceId: string, - chargeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges`, + ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), + + ) +}; +export const removeChargeFromDirect = (officeId: string, invoiceId: string, chargeId: string, ) => { return AppRestClient.delete( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, - undefined, - config, - ); - }; - - export const getDetail = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, + + ) +}; +export const getDetail = (officeId: string, invoiceId: string, ) => { return AppRestClient.get( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}`, - config, - ); - }; - - export const update = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.UpdateInvoiceRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}`, + + ) +}; +export const update = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceRequestDto, ) => { return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}`, - ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), - config, - ); - }; - - export const deleteInvoice = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}`, + ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), + + ) +}; +export const deleteInvoice = (officeId: string, invoiceId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}`, - undefined, - config, - ); - }; - - export const fix = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.FixInvoiceRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}`, + + ) +}; +export const fix = (officeId: string, invoiceId: string, data: InvoicesModels.FixInvoiceRequestDto, ) => { return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix`, - ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), - config, - ); - }; - - export const generate = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix`, + ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), + + ) +}; +export const generate = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/document`, - undefined, - config, - ); - }; - - export const updateIssuedVatRules = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/document`, + + ) +}; +export const updateIssuedVatRules = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, ) => { return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, - ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), - config, - ); - }; - - export const updateIssuedCharges = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, + ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), + + ) +}; +export const updateIssuedCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, ) => { return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, - ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), - config, - ); - }; - - export const issue = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, + ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), + + ) +}; +export const issue = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/issue`, - undefined, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const reportHungarian = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/issue`, + undefined, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const reportHungarian = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, - undefined, - config, - ); - }; - - export const generateIncoming = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, + + ) +}; +export const generateIncoming = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, - undefined, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const register = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, + undefined, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const register = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/register`, - undefined, - config, - ); - }; - - export const getPreview = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/preview`, { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }); - }; - - export const getInvoiceEml = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/eml`, { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }); - }; - - export const prepareDocumentUpload = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.PrepareUploadRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/register`, + + ) +}; +export const getPreview = (officeId: string, invoiceId: string, ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getInvoiceEml = (officeId: string, invoiceId: string, ) => { + return AppRestClient.get( + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/invoices/${invoiceId}/eml`, + { + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const prepareDocumentUpload = (officeId: string, invoiceId: string, data: InvoicesModels.PrepareUploadRequestDto, ) => { return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/upload-document`, - ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), - config, - ); - }; - - export const cancel = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/upload-document`, + ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), + + ) +}; +export const cancel = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/cancel`, - undefined, - config, - ); - }; - - export const issueCreditNote = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/cancel`, + + ) +}; +export const issueCreditNote = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, - undefined, - config, - ); - }; + { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, + `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, + + ) +}; } diff --git a/test/generated/base/invoices/invoices.configs.ts b/test/generated/base/invoices/invoices.configs.ts index ced8ba2..3443bf9 100644 --- a/test/generated/base/invoices/invoices.configs.ts +++ b/test/generated/base/invoices/invoices.configs.ts @@ -6,316 +6,317 @@ import { InvoicesQueries } from "./invoices.queries"; import { InvoicesAcl } from "./invoices.acl"; export namespace InvoicesConfigs { - export const invoicesConfig = { +export const invoicesConfig = { meta: { - title: "Invoices", + title: "Invoices", }, readAll: { - acl: InvoicesAcl.canUseFindByOffice, - schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, - paginated: InvoicesQueries.useFindByOffice, - infinite: InvoicesQueries.useFindByOfficeInfinite, - filters: { - schema: CommonModels.OfficeInvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CommonModels.OfficeInvoiceFilterDtoSchema, - options: { - inputs: { - search: true, - issuingDate: true, - serviceDate: true, - invoiceDirection: true, - invoiceType: true, - collective: true, - amountMin: true, - amountMax: true, - currencyNotation: true, - vatRule: true, - dueDate: true, - status: true, - receiver: true, - receiverCountry: true, - salesRep: true, - positionNumbersString: true, - positionNumbers: true, - invoiceNumbersString: true, - invoiceNumbers: true, - bookkeepingExportStatus: true, - dunningBlock: true, - invoiceInReview: true, - isInvoiceOk: true, - isVatOk: true, - invoiceNumberMin: true, - invoiceNumberMax: true, - internalNumberMin: true, - internalNumberMax: true, - externalSystemId: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - creditorId: true, - debtorId: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: InvoicesAcl.canUseFindByOffice, schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, - options: { - columns: { - id: true, - createdAt: true, - invoiceNumber: true, - invoiceDirection: true, - issuingDate: true, - invoiceType: true, - collective: true, - serviceDate: true, - internalNumber: true, - reference: true, - amount: true, - netAmount: true, - tax: true, - currency: true, - dueDate: true, - status: true, - payDate: true, - paidAmount: true, - position: true, - receiver: true, - receiverCountry: true, - clerk: true, - cancelled: true, - ok: true, - isExportedToBookkeeping: true, - dunningBlock: true, - invoiceInReview: true, - vatOk: true, - comments: true, - paymentComment: true, - creditorId: true, - debtorId: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vatRules: true, - }, - sortable: InvoicesModels.FindByOfficeOrderParamEnumSchema, + paginated: InvoicesQueries.useFindByOffice, + infinite: InvoicesQueries.useFindByOfficeInfinite, + filters: { + schema: CommonModels.OfficeInvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: CommonModels.OfficeInvoiceFilterDtoSchema, + options: { + inputs: { + search: true, + issuingDate: true, + serviceDate: true, + invoiceDirection: true, + invoiceType: true, + collective: true, + amountMin: true, + amountMax: true, + currencyNotation: true, + vatRule: true, + dueDate: true, + status: true, + receiver: true, + receiverCountry: true, + salesRep: true, + positionNumbersString: true, + positionNumbers: true, + invoiceNumbersString: true, + invoiceNumbers: true, + bookkeepingExportStatus: true, + dunningBlock: true, + invoiceInReview: true, + isInvoiceOk: true, + isVatOk: true, + invoiceNumberMin: true, + invoiceNumberMax: true, + internalNumberMin: true, + internalNumberMax: true, + externalSystemId: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + creditorId: true, + debtorId: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, + options: { + columns: { + id: true, + createdAt: true, + invoiceNumber: true, + invoiceDirection: true, + issuingDate: true, + invoiceType: true, + collective: true, + serviceDate: true, + internalNumber: true, + reference: true, + amount: true, + netAmount: true, + tax: true, + currency: true, + dueDate: true, + status: true, + payDate: true, + paidAmount: true, + position: true, + receiver: true, + receiverCountry: true, + clerk: true, + cancelled: true, + ok: true, + isExportedToBookkeeping: true, + dunningBlock: true, + invoiceInReview: true, + vatOk: true, + comments: true, + paymentComment: true, + creditorId: true, + debtorId: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vatRules: true, + }, + sortable: InvoicesModels.FindByOfficeOrderParamEnumSchema, + }, +}), }, read: { - acl: InvoicesAcl.canUseGetDetail, - schema: InvoicesModels.InvoiceDetailDtoSchema, - query: InvoicesQueries.useGetDetail, + acl: InvoicesAcl.canUseGetDetail, + schema: InvoicesModels.InvoiceDetailDtoSchema, + query: InvoicesQueries.useGetDetail, }, create: { - acl: InvoicesAcl.canUseCreateDraft, - schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, - mutation: InvoicesQueries.useCreateDraft, - inputDefs: dynamicInputs({ + acl: InvoicesAcl.canUseCreateDraft, schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, - options: { - inputs: { - chargeItemIds: true, - invoiceType: true, - customerId: true, - direction: true, - }, - }, - }), + mutation: InvoicesQueries.useCreateDraft, + inputDefs: dynamicInputs({ + schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, + options: { + inputs: { + chargeItemIds: true, + invoiceType: true, + customerId: true, + direction: true, + }, + }, +}) }, update: { - acl: InvoicesAcl.canUseUpdate, - schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, - mutation: InvoicesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: InvoicesAcl.canUseUpdate, schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, - options: { - inputs: { - issuingDate: true, - receiptDate: true, - serviceDate: true, - serviceDateUntil: true, - dueDate: true, - invoiceNumber: true, - internalNumber: true, - paymentTermDays: true, - paymentTermType: true, - serviceRecipientId: true, - bankAccountId: true, - remarks: true, - language: true, - showPaymentInstructions: true, - customer: true, - salesRepId: true, - currencyNotation: true, - exchangeRate: true, - }, - }, - }), + mutation: InvoicesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, + options: { + inputs: { + issuingDate: true, + receiptDate: true, + serviceDate: true, + serviceDateUntil: true, + dueDate: true, + invoiceNumber: true, + internalNumber: true, + paymentTermDays: true, + paymentTermType: true, + serviceRecipientId: true, + bankAccountId: true, + remarks: true, + language: true, + showPaymentInstructions: true, + customer: true, + salesRepId: true, + currencyNotation: true, + exchangeRate: true, + }, + }, +}) }, delete: { - acl: InvoicesAcl.canUseDeleteInvoice, - mutation: InvoicesQueries.useDeleteInvoice, + acl: InvoicesAcl.canUseDeleteInvoice, + mutation: InvoicesQueries.useDeleteInvoice, }, - }; +}; - export const uninvoicedChargesConfig = { +export const uninvoicedChargesConfig = { meta: { - title: "Uninvoiced Charges", + title: "Uninvoiced Charges", }, readAll: { - acl: InvoicesAcl.canUseGetOfficeUnCharges, - schema: InvoicesModels.UninvoicedChargeDtoSchema, - paginated: InvoicesQueries.useGetOfficeUnCharges, - infinite: InvoicesQueries.useGetOfficeUnChargesInfinite, - filters: { - schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, - options: { - inputs: { - direction: true, - chargeItemId: true, - receiverIds: true, - positionIds: true, - chargeTypeIds: true, - serviceDate: true, - currencies: true, - vatRuleIds: true, - employeeIds: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: InvoicesAcl.canUseGetOfficeUnCharges, schema: InvoicesModels.UninvoicedChargeDtoSchema, - options: { - columns: { - chargeItemId: true, - invoiceDirection: true, - receiver: true, - position: true, - chargeType: true, - currencyNotation: true, - amount: true, - amountInOfficeCurrency: true, - officeCurrency: true, - exchangeRate: true, - vatRule: true, - serviceDate: true, - status: true, - missingInformation: true, - employee: true, - }, - sortable: InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema, + paginated: InvoicesQueries.useGetOfficeUnCharges, + infinite: InvoicesQueries.useGetOfficeUnChargesInfinite, + filters: { + schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, + options: { + inputs: { + direction: true, + chargeItemId: true, + receiverIds: true, + positionIds: true, + chargeTypeIds: true, + serviceDate: true, + currencies: true, + vatRuleIds: true, + employeeIds: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: InvoicesModels.UninvoicedChargeDtoSchema, + options: { + columns: { + chargeItemId: true, + invoiceDirection: true, + receiver: true, + position: true, + chargeType: true, + currencyNotation: true, + amount: true, + amountInOfficeCurrency: true, + officeCurrency: true, + exchangeRate: true, + vatRule: true, + serviceDate: true, + status: true, + missingInformation: true, + employee: true, }, - }; + sortable: InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema, + }, +}), + }, +}; - export const positionsInvoicesConfig = { +export const positionsInvoicesConfig = { meta: { - title: "Positions Invoices", + title: "Positions Invoices", }, readAll: { - acl: InvoicesAcl.canUseFind, - schema: InvoicesModels.InvoicePreviewDtoSchema, - paginated: InvoicesQueries.useFind, - infinite: InvoicesQueries.useFindInfinite, - filters: { - schema: InvoicesModels.InvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.InvoiceFilterDtoSchema, - options: { - inputs: { - status: true, - direction: true, - receiver: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: InvoicesAcl.canUseFind, schema: InvoicesModels.InvoicePreviewDtoSchema, - options: { - columns: { - id: true, - invoiceDirection: true, - invoiceType: true, - invoiceNumber: true, - issuingDate: true, - amount: true, - currencyNotation: true, - status: true, - isExportedToBookkeeping: true, - internalNumber: true, - receiver: true, - representative: true, - collective: true, - creditNote: true, - cancelledInvoice: true, - }, - sortable: InvoicesModels.InvoicesFindOrderParamEnumSchema, + paginated: InvoicesQueries.useFind, + infinite: InvoicesQueries.useFindInfinite, + filters: { + schema: InvoicesModels.InvoiceFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.InvoiceFilterDtoSchema, + options: { + inputs: { + status: true, + direction: true, + receiver: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: InvoicesModels.InvoicePreviewDtoSchema, + options: { + columns: { + id: true, + invoiceDirection: true, + invoiceType: true, + invoiceNumber: true, + issuingDate: true, + amount: true, + currencyNotation: true, + status: true, + isExportedToBookkeeping: true, + internalNumber: true, + receiver: true, + representative: true, + collective: true, + creditNote: true, + cancelledInvoice: true, + }, + sortable: InvoicesModels.InvoicesFindOrderParamEnumSchema, + }, +}), }, - }; +}; - export const positionsUninvoicedChargesConfig = { +export const positionsUninvoicedChargesConfig = { meta: { - title: "Positions Uninvoiced Charges", + title: "Positions Uninvoiced Charges", }, readAll: { - acl: InvoicesAcl.canUseGetUnCharges, - schema: InvoicesModels.UninvoicedChargeDtoSchema, - paginated: InvoicesQueries.useGetUnCharges, - infinite: InvoicesQueries.useGetUnChargesInfinite, - filters: { - schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, - options: { - inputs: { - direction: true, - chargeItemId: true, - receiverId: true, - chargeTypeId: true, - serviceDate: true, - currency: true, - vatRuleId: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: InvoicesAcl.canUseGetUnCharges, schema: InvoicesModels.UninvoicedChargeDtoSchema, - options: { - columns: { - chargeItemId: true, - invoiceDirection: true, - receiver: true, - position: true, - chargeType: true, - currencyNotation: true, - amount: true, - amountInOfficeCurrency: true, - officeCurrency: true, - exchangeRate: true, - vatRule: true, - serviceDate: true, - status: true, - missingInformation: true, - employee: true, - }, - sortable: InvoicesModels.GetUnChargesOrderParamEnumSchema, + paginated: InvoicesQueries.useGetUnCharges, + infinite: InvoicesQueries.useGetUnChargesInfinite, + filters: { + schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, + filterDefs: dynamicInputs({ + schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, + options: { + inputs: { + direction: true, + chargeItemId: true, + receiverId: true, + chargeTypeId: true, + serviceDate: true, + currency: true, + vatRuleId: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: InvoicesModels.UninvoicedChargeDtoSchema, + options: { + columns: { + chargeItemId: true, + invoiceDirection: true, + receiver: true, + position: true, + chargeType: true, + currencyNotation: true, + amount: true, + amountInOfficeCurrency: true, + officeCurrency: true, + exchangeRate: true, + vatRule: true, + serviceDate: true, + status: true, + missingInformation: true, + employee: true, + }, + sortable: InvoicesModels.GetUnChargesOrderParamEnumSchema, + }, +}), }, - }; +}; + } diff --git a/test/generated/base/invoices/invoices.models.ts b/test/generated/base/invoices/invoices.models.ts index 6d1207e..f1cd629 100644 --- a/test/generated/base/invoices/invoices.models.ts +++ b/test/generated/base/invoices/invoices.models.ts @@ -2,1604 +2,986 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace InvoicesModels { - /** - * InvoiceBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - */ - export const InvoiceBusinessPartnerResponseDtoSchema = z - .object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }) - .readonly(); - export type InvoiceBusinessPartnerResponseDto = z.infer; - - /** - * InvoiceEmployeeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const InvoiceEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type InvoiceEmployeeResponseDto = z.infer; - - /** - * InvoiceRelatedInvoiceResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } internalNumber - */ - export const InvoiceRelatedInvoiceResponseDtoSchema = z - .object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }) - .readonly(); - export type InvoiceRelatedInvoiceResponseDto = z.infer; - - /** - * InvoicePreviewDtoSchema - * @type { object } - * @property { string } id - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection - * @property { CommonModels.InvoiceTypeEnum } invoiceType - * @property { string } invoiceNumber - * @property { string } issuingDate - * @property { number } amount - * @property { string } currencyNotation - * @property { CommonModels.InvoiceStatusEnum } status - * @property { boolean } isExportedToBookkeeping - * @property { string } internalNumber - * @property { InvoiceBusinessPartnerResponseDto } receiver - * @property { InvoiceEmployeeResponseDto } representative - * @property { boolean } collective - * @property { InvoiceRelatedInvoiceResponseDto } creditNote - * @property { InvoiceRelatedInvoiceResponseDto } cancelledInvoice - */ - export const InvoicePreviewDtoSchema = z - .object({ - id: z.string(), - invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, - invoiceType: CommonModels.InvoiceTypeEnumSchema, - invoiceNumber: z.string().nullable(), - issuingDate: z.iso.datetime({ offset: true }).nullish(), - amount: z.number(), - currencyNotation: z.string(), - status: CommonModels.InvoiceStatusEnumSchema, - isExportedToBookkeeping: z.boolean(), - internalNumber: z.string().nullish(), - receiver: InvoiceBusinessPartnerResponseDtoSchema.nullish(), - representative: InvoiceEmployeeResponseDtoSchema.nullish(), - collective: z.boolean(), - creditNote: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), - cancelledInvoice: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), - }) - .readonly(); - export type InvoicePreviewDto = z.infer; - - /** - * InvoicePartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ - export const InvoicePartnerDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), - }) - .readonly(); - export type InvoicePartnerDto = z.infer; - - /** - * InvoicePositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } transportType - * @property { string } ourReference - * @property { string } finalDestination - * @property { InvoicePartnerDto } shipper - * @property { InvoicePartnerDto } consignee - * @property { string } vessel - * @property { string } emptyPickup - * @property { string } loadingAddress - * @property { string } portOfLoading - * @property { string } portOfDischarge - * @property { string } carrierBl - * @property { string } houseBillOfLadingNumber - * @property { string } masterAWB - * @property { string } hawbNumber - * @property { string } flightNo - * @property { string } pickupAddress - * @property { string } originAirport - * @property { string } destinationAirport - * @property { string } originLocation - * @property { string } destinationLocation - * @property { string } dateOfDeparture - * @property { string } dateOfArrival - */ - export const InvoicePositionDtoSchema = z - .object({ - id: z.string(), - number: z.string(), - transportType: z.string(), - ourReference: z.string().nullish(), - finalDestination: z.string().nullish(), - shipper: InvoicePartnerDtoSchema.nullish(), - consignee: InvoicePartnerDtoSchema.nullish(), - vessel: z.string().nullish(), - emptyPickup: z.string().nullish(), - loadingAddress: z.string().nullish(), - portOfLoading: z.string().nullish(), - portOfDischarge: z.string().nullish(), - carrierBl: z.string().nullish(), - houseBillOfLadingNumber: z.string().nullish(), - masterAWB: z.string().nullish(), - hawbNumber: z.string().nullish(), - flightNo: z.string().nullish(), - pickupAddress: z.string().nullish(), - originAirport: z.string().nullish(), - destinationAirport: z.string().nullish(), - originLocation: z.string().nullish(), - destinationLocation: z.string().nullish(), - dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), - dateOfArrival: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type InvoicePositionDto = z.infer; - - /** - * InvoiceChargeTypeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type InvoiceChargeTypeDto = z.infer; - - /** - * InvoiceVatRuleDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { number } rate - */ - export const InvoiceVatRuleDtoSchema = z - .object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }) - .readonly(); - export type InvoiceVatRuleDto = z.infer; - - /** - * InvoiceFinanceLineDtoSchema - * @type { object } - * @property { string } positionChargeItemId - * @property { InvoiceChargeTypeDto } chargeType - * @property { string } additionalText - * @property { number } quantity - * @property { number } netAmount - * @property { number } grossAmount - * @property { number } sumInInvoiceCurrency - * @property { number } sumInOfficeCurrency - * @property { string } currencyNotation - * @property { number } exchangeRate - * @property { InvoiceVatRuleDto } vatRule - * @property { number } exchangedNetAmount - * @property { string } positionNumber - * @property { string } positionId - * @property { string } outgoingInvoiceId - * @property { string } registeredInvoiceId - */ - export const InvoiceFinanceLineDtoSchema = z - .object({ - positionChargeItemId: z.string(), - chargeType: InvoiceChargeTypeDtoSchema, - additionalText: z.string(), - quantity: z.number(), - netAmount: z.number(), - grossAmount: z.number(), - sumInInvoiceCurrency: z.number().nullish(), - sumInOfficeCurrency: z.number().nullish(), - currencyNotation: z.string(), - exchangeRate: z.number().nullish(), - vatRule: InvoiceVatRuleDtoSchema, - exchangedNetAmount: z.number().nullish(), - positionNumber: z.string().nullish(), - positionId: z.string().nullish(), - outgoingInvoiceId: z.string().nullish(), - registeredInvoiceId: z.string().nullish(), - }) - .readonly(); - export type InvoiceFinanceLineDto = z.infer; - - /** - * InvoiceConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl - * @property { string } headerImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ - export const InvoiceConfigDtoSchema = z - .object({ - footerImageUrl: z.string().nullish(), - headerImageUrl: z.string().nullish(), - showWatermarkOnDocuments: z.boolean(), - locale: CommonModels.LocaleEnumSchema.nullish(), - }) - .readonly(); - export type InvoiceConfigDto = z.infer; - - /** - * InvoiceCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { string } address - * @property { string } vatNumber - * @property { string } reference - * @property { string } contact - * @property { string } partnerRegistrationNumber - */ - export const InvoiceCustomerDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string().nullish(), - label: z.string().nullish(), - address: z.string().nullish(), - vatNumber: z.string(), - reference: z.string().nullish(), - contact: z.string().nullish(), - partnerRegistrationNumber: z.string().nullish(), - }) - .readonly(); - export type InvoiceCustomerDto = z.infer; - - /** - * InvoiceOfficeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type InvoiceOfficeDto = z.infer; - - /** - * InvoiceSalesRepDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } phoneNumber - */ - export const InvoiceSalesRepDtoSchema = z - .object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }) - .readonly(); - export type InvoiceSalesRepDto = z.infer; - - /** - * InvoiceServiceRecipientDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } address - * @property { string } vatNumber - * @property { string } partnerRegistrationNumber - */ - export const InvoiceServiceRecipientDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - address: z.string().nullish(), - vatNumber: z.string(), - partnerRegistrationNumber: z.string().nullish(), - }) - .readonly(); - export type InvoiceServiceRecipientDto = z.infer; - - /** - * InvoiceBankAccountDtoSchema - * @type { object } - * @property { string } id - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - * @property { string } name - * @property { boolean } useFooterOnInvoice - * @property { object } footer - * @property { string } footer.mediaUrl - */ - export const InvoiceBankAccountDtoSchema = z - .object({ - id: z.string(), - displayValue: z.string(), - iban: z.string(), - bankName: z.string(), - swiftBic: z.string(), - name: z.string(), - useFooterOnInvoice: z.boolean(), - footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), - }) - .readonly(); - export type InvoiceBankAccountDto = z.infer; - - /** - * InvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ - export const InvoiceRemarksDtoSchema = z - .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) - .readonly(); - export type InvoiceRemarksDto = z.infer; - - /** - * InvoiceVatLineDtoSchema - * @type { object } - * @property { string } vatRuleId ID of the VAT rule - * @property { string } name Name of the VAT rule - * @property { string } printNumber Reference numerical string for vat rules - * @property { string } matchCode Match code of the VAT rule - * @property { number } vatPercentage The actual VAT rate (e.g., 19 for 19%) - * @property { number } netAmount Sum of net amounts from financeLines using this vatRuleId - * @property { number } vatAmount Calculated total VAT for this rate (netAmount * vatPercentage / 100) - * @property { number } grossAmount Sum of netAmount + vatAmount for this rate - * @property { number } vatAmountInOfficeCurrency - * @property { number } netAmountInOfficeCurrency - * @property { number } grossAmountInOfficeCurrency - */ - export const InvoiceVatLineDtoSchema = z - .object({ - vatRuleId: z.string().describe("ID of the VAT rule"), - name: z.string().describe("Name of the VAT rule"), - printNumber: z.string().describe("Reference numerical string for vat rules"), - matchCode: z.string().describe("Match code of the VAT rule"), - vatPercentage: z.number().describe("The actual VAT rate (e.g., 19 for 19%)"), - netAmount: z.number().describe("Sum of net amounts from financeLines using this vatRuleId"), - vatAmount: z.number().describe("Calculated total VAT for this rate (netAmount * vatPercentage / 100)"), - grossAmount: z.number().describe("Sum of netAmount + vatAmount for this rate"), - vatAmountInOfficeCurrency: z.number().nullish(), - netAmountInOfficeCurrency: z.number().nullish(), - grossAmountInOfficeCurrency: z.number().nullish(), - }) - .readonly(); - export type InvoiceVatLineDto = z.infer; - - /** - * RelatedInvoiceDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } internalNumber - */ - export const RelatedInvoiceDetailDtoSchema = z - .object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }) - .readonly(); - export type RelatedInvoiceDetailDto = z.infer; - - /** - * InvoiceLanguageEnumSchema - * @type { enum } - */ - export const InvoiceLanguageEnumSchema = z.enum(["en", "de", "sl", "hu", "cs"]); - export type InvoiceLanguageEnum = z.infer; - export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; - - /** - * InvoiceDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } rootFolderId - * @property { string } invoiceDirection - * @property { string } invoiceType - * @property { string } invoiceNumber - * @property { string } costCenter - * @property { string } status - * @property { string } language - * @property { boolean } isVatOk - * @property { boolean } isInvoiceOk - * @property { string } issuingDate - * @property { string } receiptDate - * @property { string } serviceDate - * @property { string } serviceDateUntil - * @property { string } dueDate - * @property { string } internalNumber - * @property { boolean } isExportedToBookkeeping - * @property { string } sentAt - * @property { string } creditNoteId - * @property { string } draftCreditNoteId - * @property { string } cancelledInvoiceId - * @property { string } uploadedDocumentUrl - * @property { InvoiceCustomerDto } customer - * @property { string } customerNumber - * @property { string } customerNameOverride - * @property { string } customerReferenceOverride - * @property { string } customerContactOverride - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { InvoicePositionDto } position - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { InvoiceOfficeDto } salesOffice - * @property { InvoiceSalesRepDto } salesRep - * @property { number } totalNet - * @property { number } totalVat - * @property { number } totalGross - * @property { string } currencyNotation - * @property { number } exchangeRate - * @property { number } paymentTermDays - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { InvoiceServiceRecipientDto } serviceRecipient - * @property { boolean } showPaymentInstructions - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { string } comments - * @property { InvoiceBankAccountDto } bankAccount - * @property { InvoiceFinanceLineDto[] } financeLines - * @property { InvoiceRemarksDto } remarks - * @property { InvoiceVatLineDto[] } vatLines - * @property { InvoiceConfigDto } config - * @property { RelatedInvoiceDetailDto } creditNote - * @property { RelatedInvoiceDetailDto } draftCreditNote - * @property { RelatedInvoiceDetailDto } cancelledInvoice - * @property { string } officeCurrencyNotation - * @property { string } inverseCurrencyNotation - * @property { number } inverseExchangeRate - * @property { boolean } requiresSpecialTablePresentation - * @property { number } paidAmount - * @property { number } outstandingAmount - * @property { string } paidOn - * @property { boolean } isIssued - * @property { number } grossAmountInOfficeCurrency - * @property { string } createdAt - */ - export const InvoiceDetailDtoSchema = z - .object({ - id: z.string(), - rootFolderId: z.string().nullish(), - invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, - invoiceType: CommonModels.InvoiceTypeEnumSchema, - invoiceNumber: z.string().nullish(), - costCenter: z.string().nullish(), - status: CommonModels.InvoiceStatusEnumSchema, - language: InvoiceLanguageEnumSchema, - isVatOk: z.boolean(), - isInvoiceOk: z.boolean(), - issuingDate: z.iso.datetime({ offset: true }).nullish(), - receiptDate: z.iso.datetime({ offset: true }).nullish(), - serviceDate: z.iso.datetime({ offset: true }).nullish(), - serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), - dueDate: z.iso.datetime({ offset: true }).nullish(), - internalNumber: z.string().nullish(), - isExportedToBookkeeping: z.boolean(), - sentAt: z.iso.datetime({ offset: true }).nullish(), - creditNoteId: z.string().nullish(), - draftCreditNoteId: z.string().nullish(), - cancelledInvoiceId: z.string().nullish(), - uploadedDocumentUrl: z.string().nullish(), - customer: InvoiceCustomerDtoSchema.nullish(), - customerNumber: z.string().nullish(), - customerNameOverride: z.string().nullish(), - customerReferenceOverride: z.string().nullish(), - customerContactOverride: z.string().nullish(), - showInvoiceVatLinesInOfficeCurrency: z.boolean(), - position: InvoicePositionDtoSchema.nullish(), - serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), - salesOffice: InvoiceOfficeDtoSchema, - salesRep: InvoiceSalesRepDtoSchema, - totalNet: z.number(), - totalVat: z.number().nullish(), - totalGross: z.number(), - currencyNotation: z.string(), - exchangeRate: z.number().nullish(), - paymentTermDays: z.number().nullish(), - paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), - serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), - showPaymentInstructions: z.boolean().nullish(), - dunningBlock: z.boolean().nullish(), - invoiceInReview: z.boolean().nullish(), - comments: z.string().nullish(), - bankAccount: InvoiceBankAccountDtoSchema.nullish(), - financeLines: z.array(InvoiceFinanceLineDtoSchema).readonly(), - remarks: InvoiceRemarksDtoSchema.nullish(), - vatLines: z.array(InvoiceVatLineDtoSchema).readonly(), - config: InvoiceConfigDtoSchema.nullish(), - creditNote: RelatedInvoiceDetailDtoSchema.nullish(), - draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), - cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), - officeCurrencyNotation: z.string().nullish(), - inverseCurrencyNotation: z.string().nullish(), - inverseExchangeRate: z.number().nullish(), - requiresSpecialTablePresentation: z.boolean().nullish(), - paidAmount: z.number(), - outstandingAmount: z.number(), - paidOn: z.iso.datetime({ offset: true }).nullish(), - isIssued: z.boolean(), - grossAmountInOfficeCurrency: z.number().nullish(), - createdAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type InvoiceDetailDto = z.infer; - - /** - * TotalAmountsDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ - export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); - export type TotalAmountsDto = z.infer; - - /** - * OfficeInvoiceListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalAmountInDefaultCurrency - * @property { string } defaultCurrencyNotation - * @property { TotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ - export const OfficeInvoiceListResponseDtoSchema = z - .object({ - items: z.array(z.string()).readonly().describe("Items"), - totalAmountInDefaultCurrency: z.number().nullish(), - defaultCurrencyNotation: z.string().nullish(), - totalAmounts: z.array(TotalAmountsDtoSchema).readonly(), - page: z.number().describe("1-indexed page number to begin from").nullish(), - cursor: z.string().describe("ID of item to start after").nullish(), - nextCursor: z.string().describe("Cursor for next set of items").nullish(), - limit: z.number().describe("Items per response"), - totalItems: z.number().describe("Total available items"), - }) - .readonly(); - export type OfficeInvoiceListResponseDto = z.infer; - - /** - * InvoicePreviewPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } externalSystemId - */ - export const InvoicePreviewPositionDtoSchema = z - .object({ id: z.string(), number: z.string(), externalSystemId: z.string().nullish() }) - .readonly(); - export type InvoicePreviewPositionDto = z.infer; - - /** - * InvoicePreviewReceiverDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - */ - export const InvoicePreviewReceiverDtoSchema = z - .object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }) - .readonly(); - export type InvoicePreviewReceiverDto = z.infer; - - /** - * InvoicePreviewReceiverCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const InvoicePreviewReceiverCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type InvoicePreviewReceiverCountryDto = z.infer; - - /** - * InvoicePreviewClerkDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const InvoicePreviewClerkDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type InvoicePreviewClerkDto = z.infer; - - /** - * VatRuleLabelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } matchCode - * @property { string } name - */ - export const VatRuleLabelResponseDtoSchema = z - .object({ id: z.string(), matchCode: z.string(), name: z.string() }) - .readonly(); - export type VatRuleLabelResponseDto = z.infer; - - /** - * OfficeInvoicePreviewDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } invoiceNumber - * @property { string } invoiceDirection - * @property { string } issuingDate - * @property { CommonModels.InvoiceTypeEnum } invoiceType - * @property { boolean } collective - * @property { string } serviceDate - * @property { string } internalNumber - * @property { string } reference - * @property { number } amount - * @property { number } netAmount - * @property { number } tax - * @property { string } currency - * @property { string } dueDate - * @property { CommonModels.InvoiceStatusEnum } status - * @property { string } payDate - * @property { number } paidAmount - * @property { InvoicePreviewPositionDto } position - * @property { InvoicePreviewReceiverDto } receiver - * @property { InvoicePreviewReceiverCountryDto } receiverCountry - * @property { InvoicePreviewClerkDto } clerk - * @property { boolean } cancelled - * @property { boolean } ok - * @property { boolean } isExportedToBookkeeping - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { boolean } vatOk - * @property { string } comments - * @property { string } paymentComment - * @property { string } creditorId - * @property { string } debtorId - * @property { string } hblNumber - * @property { string } mblNumber - * @property { string } bookingNumber - * @property { string } vessel - * @property { string } voyage - * @property { VatRuleLabelResponseDto[] } vatRules - */ - export const OfficeInvoicePreviewDtoSchema = z - .object({ - id: z.string(), - createdAt: z.iso.datetime({ offset: true }), - invoiceNumber: z.string().nullish(), - invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, - issuingDate: z.iso.datetime({ offset: true }).nullish(), - invoiceType: CommonModels.InvoiceTypeEnumSchema, - collective: z.boolean(), - serviceDate: z.iso.datetime({ offset: true }).nullish(), - internalNumber: z.string().nullish(), - reference: z.string().nullish(), - amount: z.number(), - netAmount: z.number(), - tax: z.number(), - currency: z.string(), - dueDate: z.iso.datetime({ offset: true }).nullish(), - status: CommonModels.InvoiceStatusEnumSchema, - payDate: z.iso.datetime({ offset: true }).nullish(), - paidAmount: z.number().nullish(), - position: InvoicePreviewPositionDtoSchema.nullish(), - receiver: InvoicePreviewReceiverDtoSchema.nullish(), - receiverCountry: InvoicePreviewReceiverCountryDtoSchema.nullish(), - clerk: InvoicePreviewClerkDtoSchema.nullish(), - cancelled: z.boolean(), - ok: z.boolean(), - isExportedToBookkeeping: z.boolean(), - dunningBlock: z.boolean(), - invoiceInReview: z.boolean(), - vatOk: z.boolean(), - comments: z.string().nullish(), - paymentComment: z.string().nullish(), - creditorId: z.string().nullish(), - debtorId: z.string().nullish(), - hblNumber: z.string().nullish(), - mblNumber: z.string().nullish(), - bookingNumber: z.string().nullish(), - vessel: z.string().nullish(), - voyage: z.string().nullish(), - vatRules: z.array(VatRuleLabelResponseDtoSchema).readonly().nullish(), - }) - .readonly(); - export type OfficeInvoicePreviewDto = z.infer; - - /** - * InvoiceExportFilterDtoSchema - * @type { object } - * @property { string } search - * @property { CommonModels.DateRangeDto } issuingDate - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection - * @property { CommonModels.InvoiceTypeEnum[] } invoiceType - * @property { CommonModels.BooleanFilterEnum[] } collective - * @property { number } amountMin - * @property { number } amountMax - * @property { string[] } currencyNotation - * @property { CommonModels.DateRangeDto } dueDate - * @property { CommonModels.InvoiceStatusEnum[] } status - * @property { string[] } receiver Filter by invoice receiver/customer ID (UUID) - * @property { string } positionNumbersString - * @property { string[] } positionNumbers - * @property { string } invoiceNumbersString - * @property { string[] } invoiceNumbers - * @property { CommonModels.BooleanFilterEnum[] } bookkeepingExportStatus - * @property { CommonModels.BooleanFilterEnum[] } dunningBlock - * @property { CommonModels.BooleanFilterEnum[] } invoiceInReview - * @property { CommonModels.BooleanFilterEnum[] } isInvoiceOk - * @property { CommonModels.BooleanFilterEnum[] } isVatOk - * @property { number } invoiceNumberMin - * @property { number } invoiceNumberMax - * @property { number } internalNumberMin - * @property { number } internalNumberMax - */ - export const InvoiceExportFilterDtoSchema = z - .object({ - search: z.string(), - issuingDate: CommonModels.DateRangeDtoSchema, - serviceDate: CommonModels.DateRangeDtoSchema, - invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), - invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), - collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - amountMin: z.number(), - amountMax: z.number(), - currencyNotation: z.array(z.string()).readonly(), - dueDate: CommonModels.DateRangeDtoSchema, - status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), - receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer ID (UUID)"), - positionNumbersString: z.string(), - positionNumbers: z.array(z.string()).readonly(), - invoiceNumbersString: z.string(), - invoiceNumbers: z.array(z.string()).readonly(), - bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - invoiceNumberMin: z.number(), - invoiceNumberMax: z.number(), - internalNumberMin: z.number(), - internalNumberMax: z.number(), - }) - .readonly(); - export type InvoiceExportFilterDto = z.infer; - - /** - * InvoiceExportColumnSchema - * @type { enum } - */ - export const InvoiceExportColumnSchema = z.enum([ - "invoiceNumber", - "invoiceDirection", - "issuingDate", - "invoiceType", - "collective", - "serviceDate", - "internalNumber", - "reference", - "totalGross", - "totalNet", - "totalVat", - "currency", - "dueDate", - "status", - "payDate", - "paidAmount", - "positionNumber", - "hblHawb", - "mblMawb", - "bookingNumber", - "vessel", - "voyage", - "receiverName", - "receiverCountry", - "clerkName", - "cancelled", - "ok", - "vatOk", - "dunningBlock", - "invoiceInReview", - "exportedToBookkeeping", - "comments", - "paymentComment", - "vatRuleIds", - "creditorId", - "debtorId", - "createdAt", - ]); - export type InvoiceExportColumn = z.infer; - export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; - - /** - * InvoiceExportRequestDtoSchema - * @type { object } - * @property { InvoiceExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { InvoiceExportFilterDto } filter - */ - export const InvoiceExportRequestDtoSchema = z - .object({ - columns: z.array(InvoiceExportColumnSchema).readonly().min(1), - order: z.array(z.string()).readonly(), - filter: InvoiceExportFilterDtoSchema, - }) - .readonly(); - export type InvoiceExportRequestDto = z.infer; - - /** - * UninvoicedChargeTotalAmountDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ - export const UninvoicedChargeTotalAmountDtoSchema = z - .object({ amount: z.number(), currencyNotation: z.string() }) - .readonly(); - export type UninvoicedChargeTotalAmountDto = z.infer; - - /** - * UninvoicedChargeListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ - export const UninvoicedChargeListResponseDtoSchema = z - .object({ - items: z.array(z.string()).readonly().describe("Items"), - totalAmounts: z.array(UninvoicedChargeTotalAmountDtoSchema).readonly(), - page: z.number().describe("1-indexed page number to begin from").nullish(), - cursor: z.string().describe("ID of item to start after").nullish(), - nextCursor: z.string().describe("Cursor for next set of items").nullish(), - limit: z.number().describe("Items per response"), - totalItems: z.number().describe("Total available items"), - }) - .readonly(); - export type UninvoicedChargeListResponseDto = z.infer; - - /** - * ReceiverDtoSchema - * @type { object } - * @property { string } id Business Partner ID (Customer or Vendor) - * @property { string } name Business Partner name - * @property { string } matchCode Business Partner match code - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ - export const ReceiverDtoSchema = z - .object({ - id: z.string().describe("Business Partner ID (Customer or Vendor)"), - name: z.string().describe("Business Partner name"), - matchCode: z.string().describe("Business Partner match code"), - label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), - }) - .readonly(); - export type ReceiverDto = z.infer; - - /** - * UninvoicedChargePositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ - export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); - export type UninvoicedChargePositionDto = z.infer; - - /** - * UninvoicedChargeChargeTypeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const UninvoicedChargeChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type UninvoicedChargeChargeTypeDto = z.infer; - - /** - * UninvoicedChargeVatRuleDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchcode - */ - export const UninvoicedChargeVatRuleDtoSchema = z - .object({ id: z.string(), name: z.string(), matchcode: z.string() }) - .readonly(); - export type UninvoicedChargeVatRuleDto = z.infer; - - /** - * UninvoicedChargeGroupStatusEnumSchema - * @type { enum } - */ - export const UninvoicedChargeGroupStatusEnumSchema = z.enum(["ReadyForInvoice", "MissingInformation"]); - export type UninvoicedChargeGroupStatusEnum = z.infer; - export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSchema.enum; - - /** - * UninvoicedChargeEmployeeDtoSchema - * @type { object } - * @property { string } id - * @property { string } firstName - * @property { string } lastName - * @property { string } fullName - */ - export const UninvoicedChargeEmployeeDtoSchema = z - .object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }) - .readonly(); - export type UninvoicedChargeEmployeeDto = z.infer; - - /** - * UninvoicedChargeDtoSchema - * @type { object } - * @property { string } chargeItemId - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection Invoice direction (Incoming or Outgoing) - * @property { ReceiverDto } receiver Business Partner receiving the invoice - * @property { UninvoicedChargePositionDto } position - * @property { UninvoicedChargeChargeTypeDto } chargeType - * @property { string } currencyNotation ISO 4217 currency code - * @property { number } amount Charge amount in charge currency - * @property { number } amountInOfficeCurrency Charge amount in office currency - * @property { string } officeCurrency Office currency code - * @property { number } exchangeRate - * @property { UninvoicedChargeVatRuleDto } vatRule - * @property { string } serviceDate - * @property { UninvoicedChargeGroupStatusEnum } status Status of charge group - * @property { string[] } missingInformation Missing fields required for invoicing this charge - * @property { UninvoicedChargeEmployeeDto } employee - */ - export const UninvoicedChargeDtoSchema = z - .object({ - chargeItemId: z.string(), - invoiceDirection: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction (Incoming or Outgoing)"), - receiver: ReceiverDtoSchema.describe("Business Partner receiving the invoice"), - position: UninvoicedChargePositionDtoSchema, - chargeType: UninvoicedChargeChargeTypeDtoSchema.nullish(), - currencyNotation: z.string().describe("ISO 4217 currency code"), - amount: z.number().describe("Charge amount in charge currency"), - amountInOfficeCurrency: z.number().describe("Charge amount in office currency"), - officeCurrency: z.string().describe("Office currency code"), - exchangeRate: z.number().nullish(), - vatRule: UninvoicedChargeVatRuleDtoSchema.nullish(), - serviceDate: z.iso.datetime({ offset: true }).nullish(), - status: UninvoicedChargeGroupStatusEnumSchema.describe("Status of charge group"), - missingInformation: z - .array(z.string()) - .readonly() - .describe("Missing fields required for invoicing this charge") - .nullish(), - employee: UninvoicedChargeEmployeeDtoSchema.nullish(), - }) - .readonly(); - export type UninvoicedChargeDto = z.infer; - - /** - * UninvoicedChargePaginationDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string } receiverId - * @property { string } chargeTypeId - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currency - * @property { string } vatRuleId - */ - export const UninvoicedChargePaginationDtoSchema = z - .object({ - direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), - chargeItemId: z.string(), - receiverId: z.string(), - chargeTypeId: z.string(), - serviceDate: CommonModels.DateRangeDtoSchema, - currency: z.array(z.string()).readonly(), - vatRuleId: z.string(), - }) - .readonly(); - export type UninvoicedChargePaginationDto = z.infer; - - /** - * UninvoicedChargesFilterDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string[] } receiverIds - * @property { string[] } positionIds - * @property { string[] } chargeTypeIds - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currencies - * @property { string[] } vatRuleIds - * @property { string[] } employeeIds - */ - export const UninvoicedChargesFilterDtoSchema = z - .object({ - direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), - chargeItemId: z.string(), - receiverIds: z.array(z.string()).readonly(), - positionIds: z.array(z.string()).readonly(), - chargeTypeIds: z.array(z.string()).readonly(), - serviceDate: CommonModels.DateRangeDtoSchema, - currencies: z.array(z.string()).readonly(), - vatRuleIds: z.array(z.string()).readonly(), - employeeIds: z.array(z.string()).readonly(), - }) - .readonly(); - export type UninvoicedChargesFilterDto = z.infer; - - /** - * UninvoicedChargesExportFilterDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string[] } receiverIds - * @property { string[] } positionIds - * @property { string[] } chargeTypeIds - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currencies - * @property { string[] } vatRuleIds - */ - export const UninvoicedChargesExportFilterDtoSchema = z - .object({ - direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), - chargeItemId: z.string(), - receiverIds: z.array(z.string()).readonly(), - positionIds: z.array(z.string()).readonly(), - chargeTypeIds: z.array(z.string()).readonly(), - serviceDate: CommonModels.DateRangeDtoSchema, - currencies: z.array(z.string()).readonly(), - vatRuleIds: z.array(z.string()).readonly(), - }) - .readonly(); - export type UninvoicedChargesExportFilterDto = z.infer; - - /** - * UninvoicedChargeExportColumnSchema - * @type { enum } - */ - export const UninvoicedChargeExportColumnSchema = z.enum([ - "chargeItemId", - "invoiceDirection", - "status", - "receiverName", - "positionNumber", - "serviceDate", - "employee", - "chargeTypeName", - "amount", - "currency", - "exchangeRate", - "amountInOfficeCurrency", - "officeCurrency", - "vatRule", - ]); - export type UninvoicedChargeExportColumn = z.infer; - export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.enum; - - /** - * UninvoicedChargesExportRequestDtoSchema - * @type { object } - * @property { UninvoicedChargeExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { UninvoicedChargesExportFilterDto } filter - */ - export const UninvoicedChargesExportRequestDtoSchema = z - .object({ - columns: z.array(UninvoicedChargeExportColumnSchema).readonly().min(1), - order: z.array(z.string()).readonly(), - filter: UninvoicedChargesExportFilterDtoSchema, - }) - .readonly(); - export type UninvoicedChargesExportRequestDto = z.infer; - - /** - * CreateDraftInvoiceRequestDtoSchema - * @type { object } - * @property { string[] } chargeItemIds Charge item IDs to include in the invoice. Min Items: `1` - * @property { CommonModels.InvoiceTypeEnum } invoiceType Type of invoice - * @property { string } customerId Customer ID (required for outgoing invoices) - * @property { CommonModels.InvoiceDirectionEnum } direction Invoice direction - */ - export const CreateDraftInvoiceRequestDtoSchema = z - .object({ - chargeItemIds: z - .array(z.string()) - .readonly() - .min(1) - .describe("Charge item IDs to include in the invoice") - .nullish(), - invoiceType: CommonModels.InvoiceTypeEnumSchema.describe("Type of invoice"), - customerId: z.string().describe("Customer ID (required for outgoing invoices)"), - direction: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction"), - }) - .readonly(); - export type CreateDraftInvoiceRequestDto = z.infer; - - /** - * UpdateInvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ - export const UpdateInvoiceRemarksDtoSchema = z - .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) - .readonly(); - export type UpdateInvoiceRemarksDto = z.infer; - - /** - * UpdateInvoiceCustomerDtoSchema - * @type { object } - * @property { string } name - * @property { string } reference - * @property { string } contact - */ - export const UpdateInvoiceCustomerDtoSchema = z - .object({ name: z.string(), reference: z.string(), contact: z.string() }) - .readonly(); - export type UpdateInvoiceCustomerDto = z.infer; - - /** - * UpdateInvoiceRequestDtoSchema - * @type { object } - * @property { string } issuingDate Invoice date in ISO format - * @property { string } receiptDate Receipt date in ISO format - * @property { string } serviceDate Service date in ISO format - * @property { string } serviceDateUntil Service end date in ISO format - * @property { string } dueDate Due date in ISO format - * @property { string } invoiceNumber Invoice number - * @property { string } internalNumber Internal reference number - * @property { number } paymentTermDays Payment term in days - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { string } serviceRecipientId Service recipient ID - * @property { string } bankAccountId Bank account ID - * @property { UpdateInvoiceRemarksDto } remarks Additional remarks - * @property { InvoiceLanguageEnum } language Invoice language - * @property { boolean } showPaymentInstructions - * @property { UpdateInvoiceCustomerDto } customer - * @property { string } salesRepId - * @property { string } currencyNotation - * @property { number } exchangeRate Invoice exchange rate - */ - export const UpdateInvoiceRequestDtoSchema = z - .object({ - issuingDate: z.iso.datetime({ offset: true }).describe("Invoice date in ISO format"), - receiptDate: z.iso.datetime({ offset: true }).describe("Receipt date in ISO format"), - serviceDate: z.iso.datetime({ offset: true }).describe("Service date in ISO format"), - serviceDateUntil: z.iso.datetime({ offset: true }).describe("Service end date in ISO format"), - dueDate: z.iso.datetime({ offset: true }).describe("Due date in ISO format").nullable(), - invoiceNumber: z.string().describe("Invoice number").nullable(), - internalNumber: z.string().describe("Internal reference number").nullable(), - paymentTermDays: z.number().describe("Payment term in days").nullable(), - paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, - serviceRecipientId: z.string().describe("Service recipient ID").nullable(), - bankAccountId: z.string().describe("Bank account ID").nullable(), - remarks: UpdateInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), - language: InvoiceLanguageEnumSchema.describe("Invoice language"), - showPaymentInstructions: z.boolean(), - customer: UpdateInvoiceCustomerDtoSchema, - salesRepId: z.string(), - currencyNotation: z.string(), - exchangeRate: z.number().describe("Invoice exchange rate").nullable(), - }) - .readonly(); - export type UpdateInvoiceRequestDto = z.infer; - - /** - * FixInvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ - export const FixInvoiceRemarksDtoSchema = z - .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) - .readonly(); - export type FixInvoiceRemarksDto = z.infer; - - /** - * FixInvoiceCustomerDtoSchema - * @type { object } - * @property { string } reference Customer reference number - */ - export const FixInvoiceCustomerDtoSchema = z - .object({ reference: z.string().describe("Customer reference number") }) - .readonly(); - export type FixInvoiceCustomerDto = z.infer; - - /** - * FixInvoiceRequestDtoSchema - * @type { object } - * @property { string } currencyNotation Invoice currency (incoming invoices only) - * @property { string } issuingDate Update invoice date in ISO format - * @property { string } dueDate Update invoice due date in ISO format - * @property { number } exchangeRate Invoice exchange rate - * @property { number } paymentTermDays Payment term in days - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { string } receiptDate Update receipt date in ISO format - * @property { string } serviceDate Update service date in ISO format - * @property { string } serviceDateUntil Update service end date in ISO format - * @property { boolean } isVatOk Mark VAT as checked/OK by accounting - * @property { boolean } isInvoiceOk Mark overall invoice as checked/OK by accounting - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { string } comments - * @property { FixInvoiceRemarksDto } remarks Additional remarks - * @property { string } invoiceNumber Invoice number (incoming invoices only) - * @property { string } bankAccountId Bank account ID - * @property { string } serviceRecipientId Service recipient ID - * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) - */ - export const FixInvoiceRequestDtoSchema = z - .object({ - currencyNotation: z.string().describe("Invoice currency (incoming invoices only)"), - issuingDate: z.iso.datetime({ offset: true }).describe("Update invoice date in ISO format"), - dueDate: z.iso.datetime({ offset: true }).describe("Update invoice due date in ISO format"), - exchangeRate: z.number().describe("Invoice exchange rate").nullable(), - paymentTermDays: z.number().describe("Payment term in days").nullable(), - paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, - receiptDate: z.iso.datetime({ offset: true }).describe("Update receipt date in ISO format"), - serviceDate: z.iso.datetime({ offset: true }).describe("Update service date in ISO format").nullable(), - serviceDateUntil: z.iso.datetime({ offset: true }).describe("Update service end date in ISO format"), - isVatOk: z.boolean().describe("Mark VAT as checked/OK by accounting"), - isInvoiceOk: z.boolean().describe("Mark overall invoice as checked/OK by accounting"), - dunningBlock: z.boolean(), - invoiceInReview: z.boolean(), - comments: z.string(), - remarks: FixInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), - invoiceNumber: z.string().describe("Invoice number (incoming invoices only)").nullable(), - bankAccountId: z.string().describe("Bank account ID").nullable(), - serviceRecipientId: z.string().describe("Service recipient ID").nullable(), - customer: FixInvoiceCustomerDtoSchema.describe("Customer reference (incoming invoices only)"), - }) - .readonly(); - export type FixInvoiceRequestDto = z.infer; - - /** - * UpdateIssuedInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity. Minimum: `0` - * @property { number } amount Amount (must be positive). Minimum: `0.01` - * @property { string } vatRuleId VAT rule ID - * @property { number } exchangeRate Charge exchange rate (incoming invoices only) - * @property { string } currencyNotation - */ - export const UpdateIssuedInvoiceChargeRequestDtoSchema = z - .object({ - positionChargeItemId: z.string().describe("Position charge item ID"), - chargeTypeId: z.string().describe("Charge type ID").nullish(), - additionalText: z.string().describe("Additional text for the charge").nullish(), - quantity: z.number().gte(0).describe("Quantity").nullish(), - amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), - vatRuleId: z.string().describe("VAT rule ID").nullish(), - exchangeRate: z.number().describe("Charge exchange rate (incoming invoices only)").nullish(), - currencyNotation: z.string().nullish(), - }) - .readonly(); - export type UpdateIssuedInvoiceChargeRequestDto = z.infer; - - /** - * UpdateIssuedInvoiceChargesRequestDtoSchema - * @type { object } - * @property { UpdateIssuedInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` - */ - export const UpdateIssuedInvoiceChargesRequestDtoSchema = z - .object({ - charges: z.array(UpdateIssuedInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates"), - }) - .readonly(); - export type UpdateIssuedInvoiceChargesRequestDto = z.infer; - - /** - * UpdateInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity. Minimum: `0` - * @property { number } amount Amount (must be positive). Minimum: `0.01` - * @property { string } vatRuleId VAT rule ID - * @property { number } exchangeRate - * @property { string } currencyNotation - */ - export const UpdateInvoiceChargeRequestDtoSchema = z - .object({ - positionChargeItemId: z.string().describe("Position charge item ID"), - chargeTypeId: z.string().describe("Charge type ID").nullish(), - additionalText: z.string().describe("Additional text for the charge").nullish(), - quantity: z.number().gte(0).describe("Quantity").nullish(), - amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), - vatRuleId: z.string().describe("VAT rule ID").nullish(), - exchangeRate: z.number().nullish(), - currencyNotation: z.string().nullish(), - }) - .readonly(); - export type UpdateInvoiceChargeRequestDto = z.infer; - - /** - * UpdateInvoiceChargesRequestDtoSchema - * @type { object } - * @property { UpdateInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` - */ - export const UpdateInvoiceChargesRequestDtoSchema = z - .object({ - charges: z.array(UpdateInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates"), - }) - .readonly(); - export type UpdateInvoiceChargesRequestDto = z.infer; - - /** - * InvoiceFilterDtoSchema - * @type { object } - * @property { string[] } status - * @property { string } direction - * @property { string } receiver Filter by invoice receiver/customer ID (UUID) - */ - export const InvoiceFilterDtoSchema = z - .object({ - status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), - direction: CommonModels.InvoiceDirectionEnumSchema, - receiver: z.string().describe("Filter by invoice receiver/customer ID (UUID)"), - }) - .readonly(); - export type InvoiceFilterDto = z.infer; - - /** - * ChangeInvoiceCustomerRequestDtoSchema - * @type { object } - * @property { string } newCustomerId - */ - export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }).readonly(); - export type ChangeInvoiceCustomerRequestDto = z.infer; - - /** - * CreateDirectInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ - export const CreateDirectInvoiceChargeRequestDtoSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID"), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().describe("Quantity of the charge"), - buyRate: z.number().describe("Buy rate amount"), - buyCurrencyCode: z.string().describe("Buy rate currency code"), - buyVatRuleId: z.string().describe("Buy VAT rule ID"), - vendorId: z.string().describe("Vendor ID"), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), - sellRate: z.number().describe("Sell rate amount"), - sellCurrencyCode: z.string().describe("Sell rate currency code"), - sellVatRuleId: z.string().describe("Sell VAT rule ID"), - customerId: z.string().describe("Customer ID"), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), - }) - .readonly(); - export type CreateDirectInvoiceChargeRequestDto = z.infer; - - /** - * UpdateIssuedInvoiceVatRulesRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } vatRuleId VAT rule ID - */ - export const UpdateIssuedInvoiceVatRulesRequestDtoSchema = z - .object({ - positionChargeItemId: z.string().describe("Position charge item ID"), - vatRuleId: z.string().describe("VAT rule ID"), - }) - .readonly(); - export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; - - /** - * PrepareUploadRequestDtoSchema - * @type { object } - * @property { string } filename - * @property { string } mimeType - * @property { number } fileSize - */ - export const PrepareUploadRequestDtoSchema = z - .object({ filename: z.string().nullish(), mimeType: z.string(), fileSize: z.number() }) - .readonly(); - export type PrepareUploadRequestDto = z.infer; - - /** - * InvoiceUploadInstructionsDtoSchema - * @type { object } - * @property { string } url Pre-signed URL for the PUT request to storage - * @property { string } method HTTP method to use for upload - */ - export const InvoiceUploadInstructionsDtoSchema = z - .object({ - url: z.string().describe("Pre-signed URL for the PUT request to storage"), - method: z.string().describe("HTTP method to use for upload"), - }) - .readonly(); - export type InvoiceUploadInstructionsDto = z.infer; - - /** - * GetInvoicesEmlInvoiceIdsParamSchema - * @type { array } - * @description Invoice IDs - */ - export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).readonly().describe("Invoice IDs").nullish(); - export type GetInvoicesEmlInvoiceIdsParam = z.infer; - - /** - * InvoicesFindOrderParamEnumSchema - * @type { enum } - */ - export const InvoicesFindOrderParamEnumSchema = z.enum(["status", "createdAt", "serviceDate"]); - export type InvoicesFindOrderParamEnum = z.infer; - export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; - - /** - * InvoicesFindResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { InvoicePreviewDto[] } items - */ - export const InvoicesFindResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(InvoicePreviewDtoSchema).readonly() }).readonly().shape, - }); - export type InvoicesFindResponse = z.infer; - - /** - * FindByOfficeOrderParamEnumSchema - * @type { enum } - */ - export const FindByOfficeOrderParamEnumSchema = z.enum([ - "invoiceNumber", - "issuingDate", - "invoiceType", - "amount", - "netAmount", - "currencyNotation", - "dueDate", - "status", - "paidOn", - "serviceDate", - "internalNumber", - "positionNumber", - "invoiceDirection", - "receiver", - "receiverCountry", - "paidAmount", - "totalVat", - "dunningBlock", - "invoiceInReview", - "isInvoiceOk", - "isVatOk", - "comments", - "salesRepName", - "isExportedToBookkeeping", - "createdAt", - "customerReferenceOverride", - "externalSystemId", - ]); - export type FindByOfficeOrderParamEnum = z.infer; - export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; - - /** - * FindByOfficeResponseSchema - * @type { object } - * @property { number } totalAmountInDefaultCurrency - * @property { string } defaultCurrencyNotation - * @property { TotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficeInvoicePreviewDto[] } items - */ - export const FindByOfficeResponseSchema = z.object({ - ...OfficeInvoiceListResponseDtoSchema.shape, - ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).readonly() }).readonly().shape, - }); - export type FindByOfficeResponse = z.infer; - - /** - * GetUnChargesOrderParamEnumSchema - * @type { enum } - */ - export const GetUnChargesOrderParamEnumSchema = z.enum([ - "chargeItemId", - "orderPosition", - "serviceDate", - "receiverId", - "positionNumber", - "chargeTypeId", - "currency", - "vatRuleId", - ]); - export type GetUnChargesOrderParamEnum = z.infer; - export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; - - /** - * GetUnChargesResponseSchema - * @type { object } - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { UninvoicedChargeDto[] } items - */ - export const GetUnChargesResponseSchema = z.object({ - ...UninvoicedChargeListResponseDtoSchema.shape, - ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape, - }); - export type GetUnChargesResponse = z.infer; - - /** - * InvoicesListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ - export const InvoicesListAvailablePartnersForResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type InvoicesListAvailablePartnersForResponse = z.infer; - - /** - * GetOfficeUnChargesOrderParamEnumSchema - * @type { enum } - */ - export const GetOfficeUnChargesOrderParamEnumSchema = z.enum([ - "chargeItemId", - "orderPosition", - "serviceDate", - "receiverId", - "positionNumber", - "chargeTypeId", - "currency", - "vatRuleId", - ]); - export type GetOfficeUnChargesOrderParamEnum = z.infer; - export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnumSchema.enum; - - /** - * GetOfficeUnChargesResponseSchema - * @type { object } - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { UninvoicedChargeDto[] } items - */ - export const GetOfficeUnChargesResponseSchema = z.object({ - ...UninvoicedChargeListResponseDtoSchema.shape, - ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape, - }); - export type GetOfficeUnChargesResponse = z.infer; +/** + * InvoiceBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + */ +export const InvoiceBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); +export type InvoiceBusinessPartnerResponseDto = z.infer; + +/** + * InvoiceEmployeeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoiceEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type InvoiceEmployeeResponseDto = z.infer; + +/** + * InvoiceRelatedInvoiceResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } internalNumber + */ +export const InvoiceRelatedInvoiceResponseDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }); +export type InvoiceRelatedInvoiceResponseDto = z.infer; + +/** + * InvoicePreviewDtoSchema + * @type { object } + * @property { string } id + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection + * @property { CommonModels.InvoiceTypeEnum } invoiceType + * @property { string } invoiceNumber + * @property { string } issuingDate + * @property { number } amount + * @property { string } currencyNotation + * @property { CommonModels.InvoiceStatusEnum } status + * @property { boolean } isExportedToBookkeeping + * @property { string } internalNumber + * @property { InvoiceBusinessPartnerResponseDto } receiver + * @property { InvoiceEmployeeResponseDto } representative + * @property { boolean } collective + * @property { InvoiceRelatedInvoiceResponseDto } creditNote + * @property { InvoiceRelatedInvoiceResponseDto } cancelledInvoice + */ +export const InvoicePreviewDtoSchema = z.object({ id: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullable(), issuingDate: z.iso.datetime({ offset: true }).nullish(), amount: z.number(), currencyNotation: z.string(), status: CommonModels.InvoiceStatusEnumSchema, isExportedToBookkeeping: z.boolean(), internalNumber: z.string().nullish(), receiver: InvoiceBusinessPartnerResponseDtoSchema.nullish(), representative: InvoiceEmployeeResponseDtoSchema.nullish(), collective: z.boolean(), creditNote: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), cancelledInvoice: InvoiceRelatedInvoiceResponseDtoSchema.nullish() }); +export type InvoicePreviewDto = z.infer; + +/** + * InvoicePartnerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const InvoicePartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); +export type InvoicePartnerDto = z.infer; + +/** + * InvoicePositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } transportType + * @property { string } ourReference + * @property { string } finalDestination + * @property { InvoicePartnerDto } shipper + * @property { InvoicePartnerDto } consignee + * @property { string } vessel + * @property { string } emptyPickup + * @property { string } loadingAddress + * @property { string } portOfLoading + * @property { string } portOfDischarge + * @property { string } carrierBl + * @property { string } houseBillOfLadingNumber + * @property { string } masterAWB + * @property { string } hawbNumber + * @property { string } flightNo + * @property { string } pickupAddress + * @property { string } originAirport + * @property { string } destinationAirport + * @property { string } originLocation + * @property { string } destinationLocation + * @property { string } dateOfDeparture + * @property { string } dateOfArrival + */ +export const InvoicePositionDtoSchema = z.object({ id: z.string(), number: z.string(), transportType: z.string(), ourReference: z.string().nullish(), finalDestination: z.string().nullish(), shipper: InvoicePartnerDtoSchema.nullish(), consignee: InvoicePartnerDtoSchema.nullish(), vessel: z.string().nullish(), emptyPickup: z.string().nullish(), loadingAddress: z.string().nullish(), portOfLoading: z.string().nullish(), portOfDischarge: z.string().nullish(), carrierBl: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterAWB: z.string().nullish(), hawbNumber: z.string().nullish(), flightNo: z.string().nullish(), pickupAddress: z.string().nullish(), originAirport: z.string().nullish(), destinationAirport: z.string().nullish(), originLocation: z.string().nullish(), destinationLocation: z.string().nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish() }); +export type InvoicePositionDto = z.infer; + +/** + * InvoiceChargeTypeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type InvoiceChargeTypeDto = z.infer; + +/** + * InvoiceVatRuleDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { number } rate + */ +export const InvoiceVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }); +export type InvoiceVatRuleDto = z.infer; + +/** + * InvoiceFinanceLineDtoSchema + * @type { object } + * @property { string } positionChargeItemId + * @property { InvoiceChargeTypeDto } chargeType + * @property { string } additionalText + * @property { number } quantity + * @property { number } netAmount + * @property { number } grossAmount + * @property { number } sumInInvoiceCurrency + * @property { number } sumInOfficeCurrency + * @property { string } currencyNotation + * @property { number } exchangeRate + * @property { InvoiceVatRuleDto } vatRule + * @property { number } exchangedNetAmount + * @property { string } positionNumber + * @property { string } positionId + * @property { string } outgoingInvoiceId + * @property { string } registeredInvoiceId + */ +export const InvoiceFinanceLineDtoSchema = z.object({ positionChargeItemId: z.string(), chargeType: InvoiceChargeTypeDtoSchema, additionalText: z.string(), quantity: z.number(), netAmount: z.number(), grossAmount: z.number(), sumInInvoiceCurrency: z.number().nullish(), sumInOfficeCurrency: z.number().nullish(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), vatRule: InvoiceVatRuleDtoSchema, exchangedNetAmount: z.number().nullish(), positionNumber: z.string().nullish(), positionId: z.string().nullish(), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish() }); +export type InvoiceFinanceLineDto = z.infer; + +/** + * InvoiceConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl + * @property { string } headerImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ +export const InvoiceConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); +export type InvoiceConfigDto = z.infer; + +/** + * InvoiceCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + * @property { string } address + * @property { string } vatNumber + * @property { string } reference + * @property { string } contact + * @property { string } partnerRegistrationNumber + */ +export const InvoiceCustomerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string().nullish(), label: z.string().nullish(), address: z.string().nullish(), vatNumber: z.string(), reference: z.string().nullish(), contact: z.string().nullish(), partnerRegistrationNumber: z.string().nullish() }); +export type InvoiceCustomerDto = z.infer; + +/** + * InvoiceOfficeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type InvoiceOfficeDto = z.infer; + +/** + * InvoiceSalesRepDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } phoneNumber + */ +export const InvoiceSalesRepDtoSchema = z.object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }); +export type InvoiceSalesRepDto = z.infer; + +/** + * InvoiceServiceRecipientDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } address + * @property { string } vatNumber + * @property { string } partnerRegistrationNumber + */ +export const InvoiceServiceRecipientDtoSchema = z.object({ id: z.string(), name: z.string(), address: z.string().nullish(), vatNumber: z.string(), partnerRegistrationNumber: z.string().nullish() }); +export type InvoiceServiceRecipientDto = z.infer; + +/** + * InvoiceBankAccountDtoSchema + * @type { object } + * @property { string } id + * @property { string } displayValue + * @property { string } iban + * @property { string } bankName + * @property { string } swiftBic + * @property { string } name + * @property { boolean } useFooterOnInvoice + * @property { object } footer + * @property { string } footer.mediaUrl + */ +export const InvoiceBankAccountDtoSchema = z.object({ id: z.string(), displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string(), name: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).nullish() }); +export type InvoiceBankAccountDto = z.infer; + +/** + * InvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const InvoiceRemarksDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); +export type InvoiceRemarksDto = z.infer; + +/** + * InvoiceVatLineDtoSchema + * @type { object } + * @property { string } vatRuleId ID of the VAT rule + * @property { string } name Name of the VAT rule + * @property { string } printNumber Reference numerical string for vat rules + * @property { string } matchCode Match code of the VAT rule + * @property { number } vatPercentage The actual VAT rate (e.g., 19 for 19%) + * @property { number } netAmount Sum of net amounts from financeLines using this vatRuleId + * @property { number } vatAmount Calculated total VAT for this rate (netAmount * vatPercentage / 100) + * @property { number } grossAmount Sum of netAmount + vatAmount for this rate + * @property { number } vatAmountInOfficeCurrency + * @property { number } netAmountInOfficeCurrency + * @property { number } grossAmountInOfficeCurrency + */ +export const InvoiceVatLineDtoSchema = z.object({ vatRuleId: z.string(), name: z.string(), printNumber: z.string(), matchCode: z.string(), vatPercentage: z.number(), netAmount: z.number(), vatAmount: z.number(), grossAmount: z.number(), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish() }); +export type InvoiceVatLineDto = z.infer; + +/** + * RelatedInvoiceDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } internalNumber + */ +export const RelatedInvoiceDetailDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }); +export type RelatedInvoiceDetailDto = z.infer; + +/** + * InvoiceLanguageEnumSchema + * @type { enum } + */ +export const InvoiceLanguageEnumSchema = z.enum(["en", "de", "sl", "hu", "cs"]); +export type InvoiceLanguageEnum = z.infer; +export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; + +/** + * InvoiceDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } rootFolderId + * @property { string } invoiceDirection + * @property { string } invoiceType + * @property { string } invoiceNumber + * @property { string } costCenter + * @property { string } status + * @property { string } language + * @property { boolean } isVatOk + * @property { boolean } isInvoiceOk + * @property { string } issuingDate + * @property { string } receiptDate + * @property { string } serviceDate + * @property { string } serviceDateUntil + * @property { string } dueDate + * @property { string } internalNumber + * @property { boolean } isExportedToBookkeeping + * @property { string } sentAt + * @property { string } creditNoteId + * @property { string } draftCreditNoteId + * @property { string } cancelledInvoiceId + * @property { string } uploadedDocumentUrl + * @property { InvoiceCustomerDto } customer + * @property { string } customerNumber + * @property { string } customerNameOverride + * @property { string } customerReferenceOverride + * @property { string } customerContactOverride + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { InvoicePositionDto } position + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { InvoiceOfficeDto } salesOffice + * @property { InvoiceSalesRepDto } salesRep + * @property { number } totalNet + * @property { number } totalVat + * @property { number } totalGross + * @property { string } currencyNotation + * @property { number } exchangeRate + * @property { number } paymentTermDays + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { InvoiceServiceRecipientDto } serviceRecipient + * @property { boolean } showPaymentInstructions + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { string } comments + * @property { InvoiceBankAccountDto } bankAccount + * @property { InvoiceFinanceLineDto[] } financeLines + * @property { InvoiceRemarksDto } remarks + * @property { InvoiceVatLineDto[] } vatLines + * @property { InvoiceConfigDto } config + * @property { RelatedInvoiceDetailDto } creditNote + * @property { RelatedInvoiceDetailDto } draftCreditNote + * @property { RelatedInvoiceDetailDto } cancelledInvoice + * @property { string } officeCurrencyNotation + * @property { string } inverseCurrencyNotation + * @property { number } inverseExchangeRate + * @property { boolean } requiresSpecialTablePresentation + * @property { number } paidAmount + * @property { number } outstandingAmount + * @property { string } paidOn + * @property { boolean } isIssued + * @property { number } grossAmountInOfficeCurrency + * @property { string } createdAt + */ +export const InvoiceDetailDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullish(), costCenter: z.string().nullish(), status: CommonModels.InvoiceStatusEnumSchema, language: InvoiceLanguageEnumSchema, isVatOk: z.boolean(), isInvoiceOk: z.boolean(), issuingDate: z.iso.datetime({ offset: true }).nullish(), receiptDate: z.iso.datetime({ offset: true }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), isExportedToBookkeeping: z.boolean(), sentAt: z.iso.datetime({ offset: true }).nullish(), creditNoteId: z.string().nullish(), draftCreditNoteId: z.string().nullish(), cancelledInvoiceId: z.string().nullish(), uploadedDocumentUrl: z.string().nullish(), customer: InvoiceCustomerDtoSchema.nullish(), customerNumber: z.string().nullish(), customerNameOverride: z.string().nullish(), customerReferenceOverride: z.string().nullish(), customerContactOverride: z.string().nullish(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), position: InvoicePositionDtoSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesOffice: InvoiceOfficeDtoSchema, salesRep: InvoiceSalesRepDtoSchema, totalNet: z.number(), totalVat: z.number().nullish(), totalGross: z.number(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), paymentTermDays: z.number().nullish(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), showPaymentInstructions: z.boolean().nullish(), dunningBlock: z.boolean().nullish(), invoiceInReview: z.boolean().nullish(), comments: z.string().nullish(), bankAccount: InvoiceBankAccountDtoSchema.nullish(), financeLines: z.array(InvoiceFinanceLineDtoSchema), remarks: InvoiceRemarksDtoSchema.nullish(), vatLines: z.array(InvoiceVatLineDtoSchema), config: InvoiceConfigDtoSchema.nullish(), creditNote: RelatedInvoiceDetailDtoSchema.nullish(), draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), officeCurrencyNotation: z.string().nullish(), inverseCurrencyNotation: z.string().nullish(), inverseExchangeRate: z.number().nullish(), requiresSpecialTablePresentation: z.boolean().nullish(), paidAmount: z.number(), outstandingAmount: z.number(), paidOn: z.iso.datetime({ offset: true }).nullish(), isIssued: z.boolean(), grossAmountInOfficeCurrency: z.number().nullish(), createdAt: z.iso.datetime({ offset: true }) }); +export type InvoiceDetailDto = z.infer; + +/** + * TotalAmountsDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ +export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); +export type TotalAmountsDto = z.infer; + +/** + * OfficeInvoiceListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalAmountInDefaultCurrency + * @property { string } defaultCurrencyNotation + * @property { TotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const OfficeInvoiceListResponseDtoSchema = z.object({ items: z.array(z.string()), totalAmountInDefaultCurrency: z.number().nullish(), defaultCurrencyNotation: z.string().nullish(), totalAmounts: z.array(TotalAmountsDtoSchema), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); +export type OfficeInvoiceListResponseDto = z.infer; + +/** + * InvoicePreviewPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { string } externalSystemId + */ +export const InvoicePreviewPositionDtoSchema = z.object({ id: z.string(), number: z.string(), externalSystemId: z.string().nullish() }); +export type InvoicePreviewPositionDto = z.infer; + +/** + * InvoicePreviewReceiverDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchCode + * @property { string } label + */ +export const InvoicePreviewReceiverDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); +export type InvoicePreviewReceiverDto = z.infer; + +/** + * InvoicePreviewReceiverCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoicePreviewReceiverCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type InvoicePreviewReceiverCountryDto = z.infer; + +/** + * InvoicePreviewClerkDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const InvoicePreviewClerkDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type InvoicePreviewClerkDto = z.infer; + +/** + * VatRuleLabelResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } matchCode + * @property { string } name + */ +export const VatRuleLabelResponseDtoSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string() }); +export type VatRuleLabelResponseDto = z.infer; + +/** + * OfficeInvoicePreviewDtoSchema + * @type { object } + * @property { string } id + * @property { string } createdAt + * @property { string } invoiceNumber + * @property { string } invoiceDirection + * @property { string } issuingDate + * @property { CommonModels.InvoiceTypeEnum } invoiceType + * @property { boolean } collective + * @property { string } serviceDate + * @property { string } internalNumber + * @property { string } reference + * @property { number } amount + * @property { number } netAmount + * @property { number } tax + * @property { string } currency + * @property { string } dueDate + * @property { CommonModels.InvoiceStatusEnum } status + * @property { string } payDate + * @property { number } paidAmount + * @property { InvoicePreviewPositionDto } position + * @property { InvoicePreviewReceiverDto } receiver + * @property { InvoicePreviewReceiverCountryDto } receiverCountry + * @property { InvoicePreviewClerkDto } clerk + * @property { boolean } cancelled + * @property { boolean } ok + * @property { boolean } isExportedToBookkeeping + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { boolean } vatOk + * @property { string } comments + * @property { string } paymentComment + * @property { string } creditorId + * @property { string } debtorId + * @property { string } hblNumber + * @property { string } mblNumber + * @property { string } bookingNumber + * @property { string } vessel + * @property { string } voyage + * @property { VatRuleLabelResponseDto[] } vatRules + */ +export const OfficeInvoicePreviewDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), invoiceNumber: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, issuingDate: z.iso.datetime({ offset: true }).nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema, collective: z.boolean(), serviceDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), reference: z.string().nullish(), amount: z.number(), netAmount: z.number(), tax: z.number(), currency: z.string(), dueDate: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.InvoiceStatusEnumSchema, payDate: z.iso.datetime({ offset: true }).nullish(), paidAmount: z.number().nullish(), position: InvoicePreviewPositionDtoSchema.nullish(), receiver: InvoicePreviewReceiverDtoSchema.nullish(), receiverCountry: InvoicePreviewReceiverCountryDtoSchema.nullish(), clerk: InvoicePreviewClerkDtoSchema.nullish(), cancelled: z.boolean(), ok: z.boolean(), isExportedToBookkeeping: z.boolean(), dunningBlock: z.boolean(), invoiceInReview: z.boolean(), vatOk: z.boolean(), comments: z.string().nullish(), paymentComment: z.string().nullish(), creditorId: z.string().nullish(), debtorId: z.string().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vatRules: z.array(VatRuleLabelResponseDtoSchema).nullish() }); +export type OfficeInvoicePreviewDto = z.infer; + +/** + * InvoiceExportFilterDtoSchema + * @type { object } + * @property { string } search + * @property { CommonModels.DateRangeDto } issuingDate + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection + * @property { CommonModels.InvoiceTypeEnum[] } invoiceType + * @property { CommonModels.BooleanFilterEnum[] } collective + * @property { number } amountMin + * @property { number } amountMax + * @property { string[] } currencyNotation + * @property { CommonModels.DateRangeDto } dueDate + * @property { CommonModels.InvoiceStatusEnum[] } status + * @property { string[] } receiver Filter by invoice receiver/customer ID (UUID) + * @property { string } positionNumbersString + * @property { string[] } positionNumbers + * @property { string } invoiceNumbersString + * @property { string[] } invoiceNumbers + * @property { CommonModels.BooleanFilterEnum[] } bookkeepingExportStatus + * @property { CommonModels.BooleanFilterEnum[] } dunningBlock + * @property { CommonModels.BooleanFilterEnum[] } invoiceInReview + * @property { CommonModels.BooleanFilterEnum[] } isInvoiceOk + * @property { CommonModels.BooleanFilterEnum[] } isVatOk + * @property { number } invoiceNumberMin + * @property { number } invoiceNumberMax + * @property { number } internalNumberMin + * @property { number } internalNumberMax + */ +export const InvoiceExportFilterDtoSchema = z.object({ search: z.string().nullable(), issuingDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).nullable(), collective: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), amountMin: z.number().nullable(), amountMax: z.number().nullable(), currencyNotation: z.array(z.string()).nullable(), dueDate: CommonModels.DateRangeDtoSchema.nullable(), status: z.array(CommonModels.InvoiceStatusEnumSchema).nullable(), receiver: z.array(z.string()).nullable(), positionNumbersString: z.string().nullable(), positionNumbers: z.array(z.string()).nullable(), invoiceNumbersString: z.string().nullable(), invoiceNumbers: z.array(z.string()).nullable(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceNumberMin: z.number().nullable(), invoiceNumberMax: z.number().nullable(), internalNumberMin: z.number().nullable(), internalNumberMax: z.number().nullable() }).partial(); +export type InvoiceExportFilterDto = z.infer; + +/** + * InvoiceExportColumnSchema + * @type { enum } + */ +export const InvoiceExportColumnSchema = z.enum(["invoiceNumber", "invoiceDirection", "issuingDate", "invoiceType", "collective", "serviceDate", "internalNumber", "reference", "totalGross", "totalNet", "totalVat", "currency", "dueDate", "status", "payDate", "paidAmount", "positionNumber", "hblHawb", "mblMawb", "bookingNumber", "vessel", "voyage", "receiverName", "receiverCountry", "clerkName", "cancelled", "ok", "vatOk", "dunningBlock", "invoiceInReview", "exportedToBookkeeping", "comments", "paymentComment", "vatRuleIds", "creditorId", "debtorId", "createdAt"]); +export type InvoiceExportColumn = z.infer; +export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; + +/** + * InvoiceExportRequestDtoSchema + * @type { object } + * @property { InvoiceExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { InvoiceExportFilterDto } filter + */ +export const InvoiceExportRequestDtoSchema = z.object({ columns: z.array(InvoiceExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: InvoiceExportFilterDtoSchema.nullable() }).partial(); +export type InvoiceExportRequestDto = z.infer; + +/** + * UninvoicedChargeTotalAmountDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currencyNotation + */ +export const UninvoicedChargeTotalAmountDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); +export type UninvoicedChargeTotalAmountDto = z.infer; + +/** + * UninvoicedChargeListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const UninvoicedChargeListResponseDtoSchema = z.object({ items: z.array(z.string()), totalAmounts: z.array(UninvoicedChargeTotalAmountDtoSchema), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); +export type UninvoicedChargeListResponseDto = z.infer; + +/** + * ReceiverDtoSchema + * @type { object } + * @property { string } id Business Partner ID (Customer or Vendor) + * @property { string } name Business Partner name + * @property { string } matchCode Business Partner match code + * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name + */ +export const ReceiverDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); +export type ReceiverDto = z.infer; + +/** + * UninvoicedChargePositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }); +export type UninvoicedChargePositionDto = z.infer; + +/** + * UninvoicedChargeChargeTypeDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const UninvoicedChargeChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type UninvoicedChargeChargeTypeDto = z.infer; + +/** + * UninvoicedChargeVatRuleDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } matchcode + */ +export const UninvoicedChargeVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchcode: z.string() }); +export type UninvoicedChargeVatRuleDto = z.infer; + +/** + * UninvoicedChargeGroupStatusEnumSchema + * @type { enum } + */ +export const UninvoicedChargeGroupStatusEnumSchema = z.enum(["ReadyForInvoice", "MissingInformation"]); +export type UninvoicedChargeGroupStatusEnum = z.infer; +export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSchema.enum; + +/** + * UninvoicedChargeEmployeeDtoSchema + * @type { object } + * @property { string } id + * @property { string } firstName + * @property { string } lastName + * @property { string } fullName + */ +export const UninvoicedChargeEmployeeDtoSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }); +export type UninvoicedChargeEmployeeDto = z.infer; + +/** + * UninvoicedChargeDtoSchema + * @type { object } + * @property { string } chargeItemId + * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection Invoice direction (Incoming or Outgoing) + * @property { ReceiverDto } receiver Business Partner receiving the invoice + * @property { UninvoicedChargePositionDto } position + * @property { UninvoicedChargeChargeTypeDto } chargeType + * @property { string } currencyNotation ISO 4217 currency code + * @property { number } amount Charge amount in charge currency + * @property { number } amountInOfficeCurrency Charge amount in office currency + * @property { string } officeCurrency Office currency code + * @property { number } exchangeRate + * @property { UninvoicedChargeVatRuleDto } vatRule + * @property { string } serviceDate + * @property { UninvoicedChargeGroupStatusEnum } status Status of charge group + * @property { string[] } missingInformation Missing fields required for invoicing this charge + * @property { UninvoicedChargeEmployeeDto } employee + */ +export const UninvoicedChargeDtoSchema = z.object({ chargeItemId: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, receiver: ReceiverDtoSchema, position: UninvoicedChargePositionDtoSchema, chargeType: UninvoicedChargeChargeTypeDtoSchema.nullish(), currencyNotation: z.string(), amount: z.number(), amountInOfficeCurrency: z.number(), officeCurrency: z.string(), exchangeRate: z.number().nullish(), vatRule: UninvoicedChargeVatRuleDtoSchema.nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), status: UninvoicedChargeGroupStatusEnumSchema, missingInformation: z.array(z.string()).nullish(), employee: UninvoicedChargeEmployeeDtoSchema.nullish() }); +export type UninvoicedChargeDto = z.infer; + +/** + * UninvoicedChargePaginationDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string } receiverId + * @property { string } chargeTypeId + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currency + * @property { string } vatRuleId + */ +export const UninvoicedChargePaginationDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), chargeItemId: z.string().nullable(), receiverId: z.string().nullable(), chargeTypeId: z.string().nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), currency: z.array(z.string()).nullable(), vatRuleId: z.string().nullable() }).partial(); +export type UninvoicedChargePaginationDto = z.infer; + +/** + * UninvoicedChargesFilterDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string[] } receiverIds + * @property { string[] } positionIds + * @property { string[] } chargeTypeIds + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currencies + * @property { string[] } vatRuleIds + * @property { string[] } employeeIds + */ +export const UninvoicedChargesFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), chargeItemId: z.string().nullable(), receiverIds: z.array(z.string()).nullable(), positionIds: z.array(z.string()).nullable(), chargeTypeIds: z.array(z.string()).nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), currencies: z.array(z.string()).nullable(), vatRuleIds: z.array(z.string()).nullable(), employeeIds: z.array(z.string()).nullable() }).partial(); +export type UninvoicedChargesFilterDto = z.infer; + +/** + * UninvoicedChargesExportFilterDtoSchema + * @type { object } + * @property { string } direction Filter by invoice direction + * @property { string } chargeItemId + * @property { string[] } receiverIds + * @property { string[] } positionIds + * @property { string[] } chargeTypeIds + * @property { CommonModels.DateRangeDto } serviceDate + * @property { string[] } currencies + * @property { string[] } vatRuleIds + */ +export const UninvoicedChargesExportFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), chargeItemId: z.string().nullable(), receiverIds: z.array(z.string()).nullable(), positionIds: z.array(z.string()).nullable(), chargeTypeIds: z.array(z.string()).nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), currencies: z.array(z.string()).nullable(), vatRuleIds: z.array(z.string()).nullable() }).partial(); +export type UninvoicedChargesExportFilterDto = z.infer; + +/** + * UninvoicedChargeExportColumnSchema + * @type { enum } + */ +export const UninvoicedChargeExportColumnSchema = z.enum(["chargeItemId", "invoiceDirection", "status", "receiverName", "positionNumber", "serviceDate", "employee", "chargeTypeName", "amount", "currency", "exchangeRate", "amountInOfficeCurrency", "officeCurrency", "vatRule"]); +export type UninvoicedChargeExportColumn = z.infer; +export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.enum; + +/** + * UninvoicedChargesExportRequestDtoSchema + * @type { object } + * @property { UninvoicedChargeExportColumn[] } columns Min Items: `1` + * @property { string[] } order + * @property { UninvoicedChargesExportFilterDto } filter + */ +export const UninvoicedChargesExportRequestDtoSchema = z.object({ columns: z.array(UninvoicedChargeExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: UninvoicedChargesExportFilterDtoSchema.nullable() }).partial(); +export type UninvoicedChargesExportRequestDto = z.infer; + +/** + * CreateDraftInvoiceRequestDtoSchema + * @type { object } + * @property { string[] } chargeItemIds Charge item IDs to include in the invoice. Min Items: `1` + * @property { CommonModels.InvoiceTypeEnum } invoiceType Type of invoice + * @property { string } customerId Customer ID (required for outgoing invoices) + * @property { CommonModels.InvoiceDirectionEnum } direction Invoice direction + */ +export const CreateDraftInvoiceRequestDtoSchema = z.object({ chargeItemIds: z.array(z.string()).min(1).nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema, customerId: z.string(), direction: CommonModels.InvoiceDirectionEnumSchema }); +export type CreateDraftInvoiceRequestDto = z.infer; + +/** + * UpdateInvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const UpdateInvoiceRemarksDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); +export type UpdateInvoiceRemarksDto = z.infer; + +/** + * UpdateInvoiceCustomerDtoSchema + * @type { object } + * @property { string } name + * @property { string } reference + * @property { string } contact + */ +export const UpdateInvoiceCustomerDtoSchema = z.object({ name: z.string().nullable(), reference: z.string().nullable(), contact: z.string().nullable() }).partial(); +export type UpdateInvoiceCustomerDto = z.infer; + +/** + * UpdateInvoiceRequestDtoSchema + * @type { object } + * @property { string } issuingDate Invoice date in ISO format + * @property { string } receiptDate Receipt date in ISO format + * @property { string } serviceDate Service date in ISO format + * @property { string } serviceDateUntil Service end date in ISO format + * @property { string } dueDate Due date in ISO format + * @property { string } invoiceNumber Invoice number + * @property { string } internalNumber Internal reference number + * @property { number } paymentTermDays Payment term in days + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { string } serviceRecipientId Service recipient ID + * @property { string } bankAccountId Bank account ID + * @property { UpdateInvoiceRemarksDto } remarks Additional remarks + * @property { InvoiceLanguageEnum } language Invoice language + * @property { boolean } showPaymentInstructions + * @property { UpdateInvoiceCustomerDto } customer + * @property { string } salesRepId + * @property { string } currencyNotation + * @property { number } exchangeRate Invoice exchange rate + */ +export const UpdateInvoiceRequestDtoSchema = z.object({ issuingDate: z.iso.datetime({ offset: true }).nullable(), receiptDate: z.iso.datetime({ offset: true }).nullable(), serviceDate: z.iso.datetime({ offset: true }).nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).nullable(), dueDate: z.iso.datetime({ offset: true }).nullable(), invoiceNumber: z.string().nullable(), internalNumber: z.string().nullable(), paymentTermDays: z.number().nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullable(), serviceRecipientId: z.string().nullable(), bankAccountId: z.string().nullable(), remarks: UpdateInvoiceRemarksDtoSchema.nullable(), language: InvoiceLanguageEnumSchema.nullable(), showPaymentInstructions: z.boolean().nullable(), customer: UpdateInvoiceCustomerDtoSchema.nullable(), salesRepId: z.string().nullable(), currencyNotation: z.string().nullable(), exchangeRate: z.number().nullable() }).partial(); +export type UpdateInvoiceRequestDto = z.infer; + +/** + * FixInvoiceRemarksDtoSchema + * @type { object } + * @property { string } html + * @property { object } json + * @property { any } json.[key] + */ +export const FixInvoiceRemarksDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); +export type FixInvoiceRemarksDto = z.infer; + +/** + * FixInvoiceCustomerDtoSchema + * @type { object } + * @property { string } reference Customer reference number + */ +export const FixInvoiceCustomerDtoSchema = z.object({ reference: z.string().nullable() }).partial(); +export type FixInvoiceCustomerDto = z.infer; + +/** + * FixInvoiceRequestDtoSchema + * @type { object } + * @property { string } currencyNotation Invoice currency (incoming invoices only) + * @property { string } issuingDate Update invoice date in ISO format + * @property { string } dueDate Update invoice due date in ISO format + * @property { number } exchangeRate Invoice exchange rate + * @property { number } paymentTermDays Payment term in days + * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType + * @property { string } receiptDate Update receipt date in ISO format + * @property { string } serviceDate Update service date in ISO format + * @property { string } serviceDateUntil Update service end date in ISO format + * @property { boolean } isVatOk Mark VAT as checked/OK by accounting + * @property { boolean } isInvoiceOk Mark overall invoice as checked/OK by accounting + * @property { boolean } dunningBlock + * @property { boolean } invoiceInReview + * @property { string } comments + * @property { FixInvoiceRemarksDto } remarks Additional remarks + * @property { string } invoiceNumber Invoice number (incoming invoices only) + * @property { string } bankAccountId Bank account ID + * @property { string } serviceRecipientId Service recipient ID + * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) + */ +export const FixInvoiceRequestDtoSchema = z.object({ currencyNotation: z.string().nullable(), issuingDate: z.iso.datetime({ offset: true }).nullable(), dueDate: z.iso.datetime({ offset: true }).nullable(), exchangeRate: z.number().nullable(), paymentTermDays: z.number().nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullable(), receiptDate: z.iso.datetime({ offset: true }).nullable(), serviceDate: z.iso.datetime({ offset: true }).nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).nullable(), isVatOk: z.boolean().nullable(), isInvoiceOk: z.boolean().nullable(), dunningBlock: z.boolean().nullable(), invoiceInReview: z.boolean().nullable(), comments: z.string().nullable(), remarks: FixInvoiceRemarksDtoSchema.nullable(), invoiceNumber: z.string().nullable(), bankAccountId: z.string().nullable(), serviceRecipientId: z.string().nullable(), customer: FixInvoiceCustomerDtoSchema.nullable() }).partial(); +export type FixInvoiceRequestDto = z.infer; + +/** + * UpdateIssuedInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity. Minimum: `0` + * @property { number } amount Amount (must be positive). Minimum: `0.01` + * @property { string } vatRuleId VAT rule ID + * @property { number } exchangeRate Charge exchange rate (incoming invoices only) + * @property { string } currencyNotation + */ +export const UpdateIssuedInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string(), chargeTypeId: z.string().nullish(), additionalText: z.string().nullish(), quantity: z.number().gte(0).nullish(), amount: z.number().gte(0.01).nullish(), vatRuleId: z.string().nullish(), exchangeRate: z.number().nullish(), currencyNotation: z.string().nullish() }); +export type UpdateIssuedInvoiceChargeRequestDto = z.infer; + +/** + * UpdateIssuedInvoiceChargesRequestDtoSchema + * @type { object } + * @property { UpdateIssuedInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` + */ +export const UpdateIssuedInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateIssuedInvoiceChargeRequestDtoSchema).min(1) }); +export type UpdateIssuedInvoiceChargesRequestDto = z.infer; + +/** + * UpdateInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity. Minimum: `0` + * @property { number } amount Amount (must be positive). Minimum: `0.01` + * @property { string } vatRuleId VAT rule ID + * @property { number } exchangeRate + * @property { string } currencyNotation + */ +export const UpdateInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string(), chargeTypeId: z.string().nullish(), additionalText: z.string().nullish(), quantity: z.number().gte(0).nullish(), amount: z.number().gte(0.01).nullish(), vatRuleId: z.string().nullish(), exchangeRate: z.number().nullish(), currencyNotation: z.string().nullish() }); +export type UpdateInvoiceChargeRequestDto = z.infer; + +/** + * UpdateInvoiceChargesRequestDtoSchema + * @type { object } + * @property { UpdateInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` + */ +export const UpdateInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateInvoiceChargeRequestDtoSchema).min(1) }); +export type UpdateInvoiceChargesRequestDto = z.infer; + +/** + * InvoiceFilterDtoSchema + * @type { object } + * @property { string[] } status + * @property { string } direction + * @property { string } receiver Filter by invoice receiver/customer ID (UUID) + */ +export const InvoiceFilterDtoSchema = z.object({ status: z.array(CommonModels.InvoiceStatusEnumSchema).nullable(), direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), receiver: z.string().nullable() }).partial(); +export type InvoiceFilterDto = z.infer; + +/** + * ChangeInvoiceCustomerRequestDtoSchema + * @type { object } + * @property { string } newCustomerId + */ +export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }); +export type ChangeInvoiceCustomerRequestDto = z.infer; + +/** + * CreateDirectInvoiceChargeRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const CreateDirectInvoiceChargeRequestDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); +export type CreateDirectInvoiceChargeRequestDto = z.infer; + +/** + * UpdateIssuedInvoiceVatRulesRequestDtoSchema + * @type { object } + * @property { string } positionChargeItemId Position charge item ID + * @property { string } vatRuleId VAT rule ID + */ +export const UpdateIssuedInvoiceVatRulesRequestDtoSchema = z.object({ positionChargeItemId: z.string(), vatRuleId: z.string() }); +export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; + +/** + * PrepareUploadRequestDtoSchema + * @type { object } + * @property { string } filename + * @property { string } mimeType + * @property { number } fileSize + */ +export const PrepareUploadRequestDtoSchema = z.object({ filename: z.string().nullish(), mimeType: z.string(), fileSize: z.number() }); +export type PrepareUploadRequestDto = z.infer; + +/** + * InvoiceUploadInstructionsDtoSchema + * @type { object } + * @property { string } url Pre-signed URL for the PUT request to storage + * @property { string } method HTTP method to use for upload + */ +export const InvoiceUploadInstructionsDtoSchema = z.object({ url: z.string(), method: z.string() }); +export type InvoiceUploadInstructionsDto = z.infer; + +/** + * GetInvoicesEmlInvoiceIdsParamSchema + * @type { array } + */ +export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).nullish(); +export type GetInvoicesEmlInvoiceIdsParam = z.infer; + +/** + * InvoicesFindOrderParamEnumSchema + * @type { enum } + */ +export const InvoicesFindOrderParamEnumSchema = z.enum(["status", "createdAt", "serviceDate"]); +export type InvoicesFindOrderParamEnum = z.infer; +export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; + +/** + * InvoicesFindResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { InvoicePreviewDto[] } items + */ +export const InvoicesFindResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(InvoicePreviewDtoSchema).nullable() }).partial().shape }); +export type InvoicesFindResponse = z.infer; + +/** + * FindByOfficeOrderParamEnumSchema + * @type { enum } + */ +export const FindByOfficeOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); +export type FindByOfficeOrderParamEnum = z.infer; +export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; + +/** + * FindByOfficeResponseSchema + * @type { object } + * @property { number } totalAmountInDefaultCurrency + * @property { string } defaultCurrencyNotation + * @property { TotalAmountsDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficeInvoicePreviewDto[] } items + */ +export const FindByOfficeResponseSchema = z.object({ ...OfficeInvoiceListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).nullable() }).partial().shape }); +export type FindByOfficeResponse = z.infer; + +/** + * GetUnChargesOrderParamEnumSchema + * @type { enum } + */ +export const GetUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); +export type GetUnChargesOrderParamEnum = z.infer; +export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; + +/** + * GetUnChargesResponseSchema + * @type { object } + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { UninvoicedChargeDto[] } items + */ +export const GetUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).nullable() }).partial().shape }); +export type GetUnChargesResponse = z.infer; + +/** + * InvoicesListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ +export const InvoicesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).nullable() }).partial().shape }); +export type InvoicesListAvailablePartnersForResponse = z.infer; + +/** + * GetOfficeUnChargesOrderParamEnumSchema + * @type { enum } + */ +export const GetOfficeUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); +export type GetOfficeUnChargesOrderParamEnum = z.infer; +export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnumSchema.enum; + +/** + * GetOfficeUnChargesResponseSchema + * @type { object } + * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { UninvoicedChargeDto[] } items + */ +export const GetOfficeUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).nullable() }).partial().shape }); +export type GetOfficeUnChargesResponse = z.infer; + } diff --git a/test/generated/base/invoices/invoices.queries.ts b/test/generated/base/invoices/invoices.queries.ts index 5aa63ba..528519a 100644 --- a/test/generated/base/invoices/invoices.queries.ts +++ b/test/generated/base/invoices/invoices.queries.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,1591 +10,1114 @@ import { CommonModels } from "@/data/common/common.models"; import { InvoicesApi } from "./invoices.api"; export namespace InvoicesQueries { - export const moduleName = QueryModule.Invoices; +export const moduleName = QueryModule.Invoices; - export const keys = { +export const keys = { all: [moduleName] as const, - getInvoicesEml: (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam) => - [...keys.all, "/offices/:officeId/invoices/eml", officeId, invoiceIds] as const, - find: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.InvoiceFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/invoices", - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - ] as const, - findInfinite: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.InvoiceFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/invoices", - "infinite", - officeId, - positionId, - limit, - order, - filter, - cursor, - ] as const, - findByOffice: ( - officeId: string, - limit?: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/invoices", officeId, limit, order, filter, page, cursor] as const, - findByOfficeInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/invoices", "infinite", officeId, limit, order, filter, cursor] as const, - getUnCharges: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargePaginationDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/uninvoiced-charges", - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - ] as const, - getUnChargesInfinite: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargePaginationDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/uninvoiced-charges", - "infinite", - officeId, - positionId, - limit, - order, - filter, - cursor, - ] as const, - listAvailablePartnersFor: ( - officeId: string, - invoiceId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - ) => - [ - ...keys.all, - "/offices/:officeId/invoices/:invoiceId/available-partners", - officeId, - invoiceId, - search, - useCase, - ] as const, - getOfficeUnCharges: ( - officeId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargesFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/uninvoiced-charges", officeId, limit, order, filter, page, cursor] as const, - getOfficeUnChargesInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargesFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/uninvoiced-charges", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - getDetail: (officeId: string, invoiceId: string) => - [...keys.all, "/offices/:officeId/invoices/:invoiceId", officeId, invoiceId] as const, - getPreview: (officeId: string, invoiceId: string) => - [...keys.all, "/offices/:officeId/invoices/:invoiceId/preview", officeId, invoiceId] as const, - getInvoiceEml: (officeId: string, invoiceId: string) => - [...keys.all, "/offices/:officeId/invoices/:invoiceId/eml", officeId, invoiceId] as const, - }; - - /** - * Query `useGetInvoicesEml` - recommended when file should be cached - * @summary Get invoices as EML file with PDF attachments - * @permission Requires `canUseGetInvoicesEml` ability - * @param { string } object.officeId Path parameter - * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } object.invoiceIds Query parameter. Invoice IDs - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const useGetInvoicesEml = ( - { officeId, invoiceIds }: { officeId: string; invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvoicesEml(officeId, invoiceIds), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId })); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config); - }, - ...options, - }); - }; - - /** - * Mutation `useGetInvoicesEmlMutation` - recommended when file should not be cached - * @summary Get invoices as EML file with PDF attachments - * @permission Requires `canUseGetInvoicesEml` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } mutation.invoiceIds Query parameter. Invoice IDs - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGetInvoicesEmlMutation = ( - options?: AppMutationOptions< - typeof InvoicesApi.getInvoicesEml, - { officeId: string; invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceIds }) => { - checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId })); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFind` - * @summary List invoices for a position - * @permission Requires `canUseFind` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` - * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFind = ( - { - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: InvoicesModels.InvoiceFilterDto; - page?: number; - cursor?: string; + getInvoicesEml: (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam) => [...keys.all, "/offices/:officeId/invoices/eml", officeId, invoiceIds] as const, + find: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", officeId, positionId, limit, order, filter, page, cursor] as const, + findInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", "infinite", officeId, positionId, limit, order, filter, cursor] as const, + findByOffice: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", officeId, limit, order, filter, page, cursor] as const, + findByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", "infinite", officeId, limit, order, filter, cursor] as const, + getUnCharges: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", officeId, positionId, limit, order, filter, page, cursor] as const, + getUnChargesInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", "infinite", officeId, positionId, limit, order, filter, cursor] as const, + listAvailablePartnersFor: (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/available-partners", officeId, invoiceId, search, useCase] as const, + getOfficeUnCharges: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", officeId, limit, order, filter, page, cursor] as const, + getOfficeUnChargesInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", "infinite", officeId, limit, order, filter, cursor] as const, + getDetail: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId", officeId, invoiceId] as const, + getPreview: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/preview", officeId, invoiceId] as const, + getInvoiceEml: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/eml", officeId, invoiceId] as const, +}; + +/** + * Query `useGetInvoicesEml` - recommended when file should be cached + * @summary Get invoices as EML file with PDF attachments + * @permission Requires `canUseGetInvoicesEml` ability + * @param { string } object.officeId Path parameter + * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } object.invoiceIds Query parameter. Invoice IDs + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoicesEml = ({ officeId, invoiceIds }: { officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvoicesEml(officeId, invoiceIds), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); + return InvoicesApi.getInvoicesEml(officeId, invoiceIds) }, + ...options, + }); +}; + +/** + * Mutation `useGetInvoicesEmlMutation` - recommended when file should not be cached + * @summary Get invoices as EML file with PDF attachments + * @permission Requires `canUseGetInvoicesEml` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } mutation.invoiceIds Query parameter. Invoice IDs + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoicesEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceIds }) => { + checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); + return InvoicesApi.getInvoicesEml(officeId, invoiceIds) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseFind({ officeId })); - return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useFindInfinite - * @summary List invoices for a position - * @permission Requires `canUseFind` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` - * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindInfinite = ( - { - officeId, - positionId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: InvoicesModels.InvoiceFilterDto; - cursor?: string; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseFind({ officeId })); - return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useChangeIncomingCustomer` - * @summary Change incoming invoice customer and update vendors on registered charges - * @permission Requires `canUseChangeIncomingCustomer` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.ChangeInvoiceCustomerRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useChangeIncomingCustomer = ( - options?: AppMutationOptions< - typeof InvoicesApi.changeIncomingCustomer, - { officeId: string; invoiceId: string; data: InvoicesModels.ChangeInvoiceCustomerRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId })); - return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindByOffice` - * @summary List invoices for an office - * @permission Requires `canUseFindByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindByOffice = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CommonModels.OfficeInvoiceFilterDto; - page?: number; - cursor?: string; + }); +}; + +/** + * Query `useFind` + * @summary List invoices for a position + * @permission Requires `canUseFind` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` + * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFind = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseFind({ officeId } )); + return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `useFindInfinite + * @summary List invoices for a position + * @permission Requires `canUseFind` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` + * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseFind({ officeId } )); + return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseFindByOffice({ officeId })); - return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useFindByOfficeInfinite - * @summary List invoices for an office - * @permission Requires `canUseFindByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindByOfficeInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CommonModels.OfficeInvoiceFilterDto; - cursor?: string; + ...options, + }); +}; + +/** + * Mutation `useChangeIncomingCustomer` + * @summary Change incoming invoice customer and update vendors on registered charges + * @permission Requires `canUseChangeIncomingCustomer` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.ChangeInvoiceCustomerRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useChangeIncomingCustomer = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId } )); + return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data) }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseFindByOffice({ officeId })); - return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreateDraft` - * @summary Create a draft invoice from charge items - * @permission Requires `canUseCreateDraft` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.CreateDraftInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const useCreateDraft = ( - options?: AppMutationOptions< - typeof InvoicesApi.createDraft, - { officeId: string; data: InvoicesModels.CreateDraftInvoiceRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseCreateDraft({ officeId })); - return InvoicesApi.createDraft(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useExportInvoices` - recommended when file should not be cached - * @summary Export invoices to Excel - * @permission Requires `canUseExportInvoices` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportInvoices = ( - options?: AppMutationOptions< - typeof InvoicesApi.exportInvoices, - { officeId: string; data: InvoicesModels.InvoiceExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportInvoices({ officeId })); - return InvoicesApi.exportInvoices(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useExportCharges` - recommended when file should not be cached - * @summary Export invoice charges as Excel file - * @permission Requires `canUseExportCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportCharges = ( - options?: AppMutationOptions< - typeof InvoicesApi.exportCharges, - { officeId: string; data: InvoicesModels.InvoiceExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportCharges({ officeId })); - return InvoicesApi.exportCharges(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetUnCharges` - * @summary Get uninvoiced charges for a position - * @permission Requires `canUseGetUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetUnCharges = ( - { - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: InvoicesModels.UninvoicedChargePaginationDto; - page?: number; - cursor?: string; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId })); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useGetUnChargesInfinite - * @summary Get uninvoiced charges for a position - * @permission Requires `canUseGetUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useGetUnChargesInfinite = ( - { - officeId, - positionId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: InvoicesModels.UninvoicedChargePaginationDto; - cursor?: string; + }); +}; + +/** + * Query `useFindByOffice` + * @summary List invoices for an office + * @permission Requires `canUseFindByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); + return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `useFindByOfficeInfinite + * @summary List invoices for an office + * @permission Requires `canUseFindByOffice` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` + * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); + return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId })); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for an invoice (union of position involved parties) - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListAvailablePartnersFor = ( - { - officeId, - invoiceId, - search, - useCase, - }: { - officeId: string; - invoiceId: string; - search?: string; - useCase?: CommonModels.PositionAvailablePartnersUseCase; + ...options, + }); +}; + +/** + * Mutation `useCreateDraft` + * @summary Create a draft invoice from charge items + * @permission Requires `canUseCreateDraft` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.CreateDraftInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useCreateDraft = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseCreateDraft({ officeId } )); + return InvoicesApi.createDraft(officeId, data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), - queryFn: () => { - checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId })); - return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase, config); - }, - ...options, - }); - }; - - /** - * Query `useGetOfficeUnCharges` - * @summary Get uninvoiced charges for all positions in an office - * @permission Requires `canUseGetOfficeUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetOfficeUnCharges = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: InvoicesModels.UninvoicedChargesFilterDto; - page?: number; - cursor?: string; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId })); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useGetOfficeUnChargesInfinite - * @summary Get uninvoiced charges for all positions in an office - * @permission Requires `canUseGetOfficeUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useGetOfficeUnChargesInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: InvoicesModels.UninvoicedChargesFilterDto; - cursor?: string; + }); +}; + +/** + * Mutation `useExportInvoices` - recommended when file should not be cached + * @summary Export invoices to Excel + * @permission Requires `canUseExportInvoices` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportInvoices = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportInvoices({ officeId } )); + return InvoicesApi.exportInvoices(officeId, data) }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId })); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useExportUnCharges` - recommended when file should not be cached - * @summary Export uninvoiced charges as Excel file - * @permission Requires `canUseExportUnCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.UninvoicedChargesExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportUnCharges = ( - options?: AppMutationOptions< - typeof InvoicesApi.exportUnCharges, - { officeId: string; data: InvoicesModels.UninvoicedChargesExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId })); - return InvoicesApi.exportUnCharges(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCreateDirect` - * @summary Dummy endpoint to expose direct invoice permission to FE - * @permission Requires `canUseCreateDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const useCreateDirect = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId }) => { - checkAcl(InvoicesAcl.canUseCreateDirect({ officeId })); - return InvoicesApi.createDirect(officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useAddChargeToDirect` - * @summary Add a charge to a direct invoice - * @permission Requires `canUseAddChargeToDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.CreateDirectInvoiceChargeRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const useAddChargeToDirect = ( - options?: AppMutationOptions< - typeof InvoicesApi.addChargeToDirect, - { officeId: string; invoiceId: string; data: InvoicesModels.CreateDirectInvoiceChargeRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId })); - return InvoicesApi.addChargeToDirect(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateCharges` - * @summary Update charges on a draft invoice - * @permission Requires `canUseUpdateCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateInvoiceChargesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useUpdateCharges = ( - options?: AppMutationOptions< - typeof InvoicesApi.updateCharges, - { officeId: string; invoiceId: string; data: InvoicesModels.UpdateInvoiceChargesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId })); - return InvoicesApi.updateCharges(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useRemoveChargeFromDirect` - * @summary Remove a charge from a direct invoice - * @permission Requires `canUseRemoveChargeFromDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.chargeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useRemoveChargeFromDirect = ( - options?: AppMutationOptions< - typeof InvoicesApi.removeChargeFromDirect, - { officeId: string; invoiceId: string; chargeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, chargeId }) => { - checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId })); - return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetDetail` - * @summary Get invoice details - * @permission Requires `canUseGetDetail` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, default] - */ - export const useGetDetail = ( - { officeId, invoiceId }: { officeId: string; invoiceId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDetail(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetDetail({ officeId })); - return InvoicesApi.getDetail(officeId, invoiceId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update invoice details - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof InvoicesApi.update, - { officeId: string; invoiceId: string; data: InvoicesModels.UpdateInvoiceRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdate({ officeId })); - return InvoicesApi.update(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteInvoice` - * @summary Delete invoice - * @permission Requires `canUseDeleteInvoice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteInvoice = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId })); - return InvoicesApi.deleteInvoice(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useFix` - * @summary Fix invoice with accounting permission - * @permission Requires `canUseFix` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.FixInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useFix = ( - options?: AppMutationOptions< - typeof InvoicesApi.fix, - { officeId: string; invoiceId: string; data: InvoicesModels.FixInvoiceRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseFix({ officeId })); - return InvoicesApi.fix(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerate` - recommended when file should not be cached - * @summary Generate an invoice PDF - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [201, 401] - */ - export const useGenerate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGenerate({ officeId })); - return InvoicesApi.generate(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateIssuedVatRules` - * @summary Update VAT rules on issued invoice charges - * @permission Requires `canUseUpdateIssuedVatRules` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useUpdateIssuedVatRules = ( - options?: AppMutationOptions< - typeof InvoicesApi.updateIssuedVatRules, - { officeId: string; invoiceId: string; data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId })); - return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateIssuedCharges` - * @summary Update charges on issued invoice - * @permission Requires `canUseUpdateIssuedCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useUpdateIssuedCharges = ( - options?: AppMutationOptions< - typeof InvoicesApi.updateIssuedCharges, - { officeId: string; invoiceId: string; data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId })); - return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useIssue` - recommended when file should not be cached - * @summary Issue outgoing invoice - * @permission Requires `canUseIssue` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useIssue = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseIssue({ officeId })); - return InvoicesApi.issue(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [ - keys.getInvoicesEml(officeId), - keys.getPreview(officeId, invoiceId), - keys.getInvoiceEml(officeId, invoiceId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useReportHungarian` - * @summary Report invoice to Hungarian tax authority - * @permission Requires `canUseReportHungarian` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useReportHungarian = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseReportHungarian({ officeId })); - return InvoicesApi.reportHungarian(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateIncoming` - recommended when file should not be cached - * @summary Re-Generate an invoice PDF - * @permission Requires `canUseGenerateIncoming` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useGenerateIncoming = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId })); - return InvoicesApi.generateIncoming(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [ - keys.getInvoicesEml(officeId), - keys.getPreview(officeId, invoiceId), - keys.getInvoiceEml(officeId, invoiceId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useRegister` - * @summary Register incoming invoice - * @permission Requires `canUseRegister` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useRegister = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseRegister({ officeId })); - return InvoicesApi.register(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetPreview` - recommended when file should be cached - * @summary Get invoice PDF preview - * @permission Requires `canUseGetPreview` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const useGetPreview = ( - { officeId, invoiceId }: { officeId: string; invoiceId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getPreview(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetPreview({ officeId })); - return InvoicesApi.getPreview(officeId, invoiceId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useGetPreviewMutation` - recommended when file should not be cached - * @summary Get invoice PDF preview - * @permission Requires `canUseGetPreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGetPreviewMutation = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGetPreview({ officeId })); - return InvoicesApi.getPreview(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [ - keys.getInvoicesEml(officeId), - keys.getPreview(officeId, invoiceId), - keys.getInvoiceEml(officeId, invoiceId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetInvoiceEml` - recommended when file should be cached - * @summary Get invoice as EML file with PDF attachment - * @permission Requires `canUseGetInvoiceEml` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const useGetInvoiceEml = ( - { officeId, invoiceId }: { officeId: string; invoiceId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvoiceEml(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId })); - return InvoicesApi.getInvoiceEml(officeId, invoiceId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useGetInvoiceEmlMutation` - recommended when file should not be cached - * @summary Get invoice as EML file with PDF attachment - * @permission Requires `canUseGetInvoiceEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGetInvoiceEmlMutation = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId })); - return InvoicesApi.getInvoiceEml(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [ - keys.getInvoicesEml(officeId), - keys.getPreview(officeId, invoiceId), - keys.getInvoiceEml(officeId, invoiceId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `usePrepareDocumentUpload` - * @summary Prepare for invoice document upload - * @permission Requires `canUsePrepareDocumentUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.PrepareUploadRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const usePrepareDocumentUpload = ( - options?: AppMutationOptions< - typeof InvoicesApi.prepareDocumentUpload, - { - officeId: string; - invoiceId: string; - data: InvoicesModels.PrepareUploadRequestDto; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { - checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId })); - const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useExportCharges` - recommended when file should not be cached + * @summary Export invoice charges as Excel file + * @permission Requires `canUseExportCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportCharges({ officeId } )); + return InvoicesApi.exportCharges(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetUnCharges` + * @summary Get uninvoiced charges for a position + * @permission Requires `canUseGetUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetUnCharges = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `useGetUnChargesInfinite + * @summary Get uninvoiced charges for a position + * @permission Requires `canUseGetUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetUnChargesInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for an invoice (union of position involved parties) + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListAvailablePartnersFor = ({ officeId, invoiceId, search, useCase }: { officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), + queryFn: () => { + checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId } )); + return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase) }, + ...options, + }); +}; + +/** + * Query `useGetOfficeUnCharges` + * @summary Get uninvoiced charges for all positions in an office + * @permission Requires `canUseGetOfficeUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetOfficeUnCharges = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `useGetOfficeUnChargesInfinite + * @summary Get uninvoiced charges for all positions in an office + * @permission Requires `canUseGetOfficeUnCharges` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` + * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetOfficeUnChargesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useExportUnCharges` - recommended when file should not be cached + * @summary Export uninvoiced charges as Excel file + * @permission Requires `canUseExportUnCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { InvoicesModels.UninvoicedChargesExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportUnCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId } )); + return InvoicesApi.exportUnCharges(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateDirect` + * @summary Dummy endpoint to expose direct invoice permission to FE + * @permission Requires `canUseCreateDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useCreateDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId }) => { + checkAcl(InvoicesAcl.canUseCreateDirect({ officeId } )); + return InvoicesApi.createDirect(officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useAddChargeToDirect` + * @summary Add a charge to a direct invoice + * @permission Requires `canUseAddChargeToDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.CreateDirectInvoiceChargeRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useAddChargeToDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId } )); + return InvoicesApi.addChargeToDirect(officeId, invoiceId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateCharges` + * @summary Update charges on a draft invoice + * @permission Requires `canUseUpdateCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateInvoiceChargesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdateCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId } )); + return InvoicesApi.updateCharges(officeId, invoiceId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRemoveChargeFromDirect` + * @summary Remove a charge from a direct invoice + * @permission Requires `canUseRemoveChargeFromDirect` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { string } mutation.chargeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useRemoveChargeFromDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, chargeId }) => { + checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId } )); + return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetDetail` + * @summary Get invoice details + * @permission Requires `canUseGetDetail` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, default] + */ +export const useGetDetail = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDetail(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetDetail({ officeId } )); + return InvoicesApi.getDetail(officeId, invoiceId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update invoice details + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdate({ officeId } )); + return InvoicesApi.update(officeId, invoiceId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteInvoice` + * @summary Delete invoice + * @permission Requires `canUseDeleteInvoice` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteInvoice = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId } )); + return InvoicesApi.deleteInvoice(officeId, invoiceId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useFix` + * @summary Fix invoice with accounting permission + * @permission Requires `canUseFix` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.FixInvoiceRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useFix = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseFix({ officeId } )); + return InvoicesApi.fix(officeId, invoiceId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerate` - recommended when file should not be cached + * @summary Generate an invoice PDF + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGenerate({ officeId } )); + return InvoicesApi.generate(officeId, invoiceId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateIssuedVatRules` + * @summary Update VAT rules on issued invoice charges + * @permission Requires `canUseUpdateIssuedVatRules` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdateIssuedVatRules = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId } )); + return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateIssuedCharges` + * @summary Update charges on issued invoice + * @permission Requires `canUseUpdateIssuedCharges` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useUpdateIssuedCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId, data }) => { + checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId } )); + return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useIssue` - recommended when file should not be cached + * @summary Issue outgoing invoice + * @permission Requires `canUseIssue` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useIssue = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseIssue({ officeId } )); + return InvoicesApi.issue(officeId, invoiceId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReportHungarian` + * @summary Report invoice to Hungarian tax authority + * @permission Requires `canUseReportHungarian` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReportHungarian = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseReportHungarian({ officeId } )); + return InvoicesApi.reportHungarian(officeId, invoiceId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateIncoming` - recommended when file should not be cached + * @summary Re-Generate an invoice PDF + * @permission Requires `canUseGenerateIncoming` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGenerateIncoming = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId } )); + return InvoicesApi.generateIncoming(officeId, invoiceId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRegister` + * @summary Register incoming invoice + * @permission Requires `canUseRegister` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useRegister = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseRegister({ officeId } )); + return InvoicesApi.register(officeId, invoiceId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetPreview` - recommended when file should be cached + * @summary Get invoice PDF preview + * @permission Requires `canUseGetPreview` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetPreview = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getPreview(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); + return InvoicesApi.getPreview(officeId, invoiceId) }, + ...options, + }); +}; + +/** + * Mutation `useGetPreviewMutation` - recommended when file should not be cached + * @summary Get invoice PDF preview + * @permission Requires `canUseGetPreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetPreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); + return InvoicesApi.getPreview(officeId, invoiceId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetInvoiceEml` - recommended when file should be cached + * @summary Get invoice as EML file with PDF attachment + * @permission Requires `canUseGetInvoiceEml` ability + * @param { string } object.officeId Path parameter + * @param { string } object.invoiceId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoiceEml = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvoiceEml(officeId, invoiceId), + queryFn: () => { + checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); + return InvoicesApi.getInvoiceEml(officeId, invoiceId) }, + ...options, + }); +}; + +/** + * Mutation `useGetInvoiceEmlMutation` - recommended when file should not be cached + * @summary Get invoice as EML file with PDF attachment + * @permission Requires `canUseGetInvoiceEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGetInvoiceEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); + return InvoicesApi.getInvoiceEml(officeId, invoiceId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `usePrepareDocumentUpload` + * @summary Prepare for invoice document upload + * @permission Requires `canUsePrepareDocumentUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { InvoicesModels.PrepareUploadRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const usePrepareDocumentUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { + checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId } )); + const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); } - dataToSend.append("file", file); } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); + dataToSend.append("file", file); } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCancel` + * @summary Cancel invoice (create draft credit note) + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, default] + */ +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseCancel({ officeId } )); + return InvoicesApi.cancel(officeId, invoiceId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useIssueCreditNote` + * @summary Issue credit invoice + * @permission Requires `canUseIssueCreditNote` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.invoiceId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, default] + */ +export const useIssueCreditNote = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, invoiceId }) => { + checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId } )); + return InvoicesApi.issueCreditNote(officeId, invoiceId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, invoiceId } = variables; + const updateKeys = [keys.getDetail(officeId, invoiceId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCancel` - * @summary Cancel invoice (create draft credit note) - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const useCancel = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseCancel({ officeId })); - return InvoicesApi.cancel(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useIssueCreditNote` - * @summary Issue credit invoice - * @permission Requires `canUseIssueCreditNote` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useIssueCreditNote = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId })); - return InvoicesApi.issueCreditNote(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/masterData/masterData.acl.ts b/test/generated/base/masterData/masterData.acl.ts index 90517a8..2c0c2c9 100644 --- a/test/generated/base/masterData/masterData.acl.ts +++ b/test/generated/base/masterData/masterData.acl.ts @@ -1,15 +1,24 @@ import { AbilityTuple } from "@casl/ability"; export namespace MasterDataAcl { - /** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; +/** + * Use for `useFindAll` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Depot" +] as AbilityTuple<"Read", "Depot">; - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; } diff --git a/test/generated/base/masterData/masterData.api.ts b/test/generated/base/masterData/masterData.api.ts index c73f4c2..5eaf692 100644 --- a/test/generated/base/masterData/masterData.api.ts +++ b/test/generated/base/masterData/masterData.api.ts @@ -1,66 +1,34 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { MasterDataModels } from "./masterData.models"; export namespace MasterDataApi { - export const findAll = ( - officeId: string, - types: MasterDataModels.MasterDataFindAllTypesParam, - search?: string, - config?: AxiosRequestConfig, - ) => { +export const findAll = (officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string, ) => { return AppRestClient.get( - { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, - `/offices/${officeId}/master-data/autocomplete`, - { - ...config, - params: { - types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { - type: "query", - name: "types", - }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - }, - ); - }; - - export const paginate = ( - officeId: string, - types: MasterDataModels.MasterDataPaginateTypesParam, - limit: number, - search?: string, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, + `/offices/${officeId}/master-data/autocomplete`, + { + params: { + types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { type: "query", name: "types" }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +export const paginate = (officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, - `/offices/${officeId}/master-data/labels/paginated`, - { - ...config, - params: { - types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { - type: "query", - name: "types", - }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; + { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, + `/offices/${officeId}/master-data/labels/paginated`, + { + params: { + types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { type: "query", name: "types" }), + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; } diff --git a/test/generated/base/masterData/masterData.configs.ts b/test/generated/base/masterData/masterData.configs.ts index 3f2dbff..06f2f06 100644 --- a/test/generated/base/masterData/masterData.configs.ts +++ b/test/generated/base/masterData/masterData.configs.ts @@ -4,25 +4,26 @@ import { MasterDataQueries } from "./masterData.queries"; import { MasterDataAcl } from "./masterData.acl"; export namespace MasterDataConfigs { - export const paginatedConfig = { +export const paginatedConfig = { meta: { - title: "Paginated", + title: "Paginated", }, readAll: { - acl: MasterDataAcl.canUsePaginate, - schema: MasterDataModels.MasterDataLabelResponseDTOSchema, - paginated: MasterDataQueries.usePaginate, - infinite: MasterDataQueries.usePaginateInfinite, - columns: dynamicColumns({ + acl: MasterDataAcl.canUsePaginate, schema: MasterDataModels.MasterDataLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - type: true, - }, - }, - }), + paginated: MasterDataQueries.usePaginate, + infinite: MasterDataQueries.usePaginateInfinite, + columns: dynamicColumns({ + schema: MasterDataModels.MasterDataLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + type: true, }, - }; + }, +}), + }, +}; + } diff --git a/test/generated/base/masterData/masterData.models.ts b/test/generated/base/masterData/masterData.models.ts index 3a0dfae..832cbb1 100644 --- a/test/generated/base/masterData/masterData.models.ts +++ b/test/generated/base/masterData/masterData.models.ts @@ -2,93 +2,67 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace MasterDataModels { - /** - * MasterDataTypeEnumSchema - * @type { enum } - */ - export const MasterDataTypeEnumSchema = z.enum([ - "BusinessPartner", - "Depot", - "City", - "Warehouse", - "ContainerYard", - "PortTerminal", - "AirportTerminal", - "Port", - "Airport", - ]); - export type MasterDataTypeEnum = z.infer; - export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; +/** + * MasterDataTypeEnumSchema + * @type { enum } + */ +export const MasterDataTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "City", "Warehouse", "ContainerYard", "PortTerminal", "AirportTerminal", "Port", "Airport"]); +export type MasterDataTypeEnum = z.infer; +export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; - /** - * MasterDataItemResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the item - * @property { string } name Name of the item - * @property { MasterDataTypeEnum } type Type of the item - */ - export const MasterDataItemResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the item"), - name: z.string().describe("Name of the item"), - type: MasterDataTypeEnumSchema.describe("Type of the item"), - }) - .readonly(); - export type MasterDataItemResponseDTO = z.infer; +/** + * MasterDataItemResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the item + * @property { string } name Name of the item + * @property { MasterDataTypeEnum } type Type of the item + */ +export const MasterDataItemResponseDTOSchema = z.object({ id: z.string(), name: z.string(), type: MasterDataTypeEnumSchema }); +export type MasterDataItemResponseDTO = z.infer; - /** - * MasterDataItemsResponseDTOSchema - * @type { object } - * @property { MasterDataItemResponseDTO[] } items List of master data items - */ - export const MasterDataItemsResponseDTOSchema = z - .object({ items: z.array(MasterDataItemResponseDTOSchema).readonly().describe("List of master data items") }) - .readonly(); - export type MasterDataItemsResponseDTO = z.infer; +/** + * MasterDataItemsResponseDTOSchema + * @type { object } + * @property { MasterDataItemResponseDTO[] } items List of master data items + */ +export const MasterDataItemsResponseDTOSchema = z.object({ items: z.array(MasterDataItemResponseDTOSchema) }); +export type MasterDataItemsResponseDTO = z.infer; - /** - * MasterDataLabelResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the item - * @property { string } label Label of the item - * @property { MasterDataTypeEnum } type Type of the item - */ - export const MasterDataLabelResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the item"), - label: z.string().describe("Label of the item"), - type: MasterDataTypeEnumSchema.describe("Type of the item"), - }) - .readonly(); - export type MasterDataLabelResponseDTO = z.infer; +/** + * MasterDataLabelResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the item + * @property { string } label Label of the item + * @property { MasterDataTypeEnum } type Type of the item + */ +export const MasterDataLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), type: MasterDataTypeEnumSchema }); +export type MasterDataLabelResponseDTO = z.infer; - /** - * MasterDataFindAllTypesParamSchema - * @type { array } - */ - export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); - export type MasterDataFindAllTypesParam = z.infer; +/** + * MasterDataFindAllTypesParamSchema + * @type { array } + */ +export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema); +export type MasterDataFindAllTypesParam = z.infer; - /** - * MasterDataPaginateTypesParamSchema - * @type { array } - */ - export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); - export type MasterDataPaginateTypesParam = z.infer; +/** + * MasterDataPaginateTypesParamSchema + * @type { array } + */ +export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema); +export type MasterDataPaginateTypesParam = z.infer; + +/** + * MasterDataPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { MasterDataLabelResponseDTO[] } items + */ +export const MasterDataPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(MasterDataLabelResponseDTOSchema).nullable() }).partial().shape }); +export type MasterDataPaginateResponse = z.infer; - /** - * MasterDataPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { MasterDataLabelResponseDTO[] } items - */ - export const MasterDataPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(MasterDataLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type MasterDataPaginateResponse = z.infer; } diff --git a/test/generated/base/masterData/masterData.queries.ts b/test/generated/base/masterData/masterData.queries.ts index 7ba7283..8fba241 100644 --- a/test/generated/base/masterData/masterData.queries.ts +++ b/test/generated/base/masterData/masterData.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -8,171 +7,93 @@ import { MasterDataModels } from "./masterData.models"; import { MasterDataApi } from "./masterData.api"; export namespace MasterDataQueries { - export const moduleName = QueryModule.MasterData; +export const moduleName = QueryModule.MasterData; - export const keys = { +export const keys = { all: [moduleName] as const, - findAll: (officeId: string, types?: MasterDataModels.MasterDataFindAllTypesParam, search?: string) => - [...keys.all, "/offices/:officeId/master-data/autocomplete", officeId, types, search] as const, - paginate: ( - officeId: string, - types?: MasterDataModels.MasterDataPaginateTypesParam, - limit?: number, - search?: string, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/master-data/labels/paginated", - officeId, - types, - limit, - search, - page, - cursor, - ] as const, - paginateInfinite: ( - officeId: string, - types?: MasterDataModels.MasterDataPaginateTypesParam, - limit?: number, - search?: string, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/master-data/labels/paginated", - "infinite", - officeId, - types, - limit, - search, - cursor, - ] as const, - }; + findAll: (officeId: string, types?: MasterDataModels.MasterDataFindAllTypesParam, search?: string) => [...keys.all, "/offices/:officeId/master-data/autocomplete", officeId, types, search] as const, + paginate: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", officeId, types, limit, search, page, cursor] as const, + paginateInfinite: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", "infinite", officeId, types, limit, search, cursor] as const, +}; - /** - * Query `useFindAll` - * @summary List master data based on provided type - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataFindAllTypesParam } object.types Query parameter - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - officeId, - types, - search, - }: { officeId: string; types: MasterDataModels.MasterDataFindAllTypesParam; search?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindAll` + * @summary List master data based on provided type + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataFindAllTypesParam } object.types Query parameter + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ officeId, types, search }: { officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(officeId, types, search), + queryFn: () => { + checkAcl(MasterDataAcl.canUseFindAll()); + return MasterDataApi.findAll(officeId, types, search) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findAll(officeId, types, search), - queryFn: () => { - checkAcl(MasterDataAcl.canUseFindAll()); - return MasterDataApi.findAll(officeId, types, search, config); - }, - ...options, - }); - }; +/** + * Query `usePaginate` + * @summary Paginate master data based on provided type + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.search Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, types, limit, search, page, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, types, limit, search, page, cursor), + queryFn: () => { + checkAcl(MasterDataAcl.canUsePaginate()); + return MasterDataApi.paginate(officeId, types, limit, search, page, cursor) }, + ...options, + }); +}; - /** - * Query `usePaginate` - * @summary Paginate master data based on provided type - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.search Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - types, - limit, - search, - page, - cursor, - }: { - officeId: string; - types: MasterDataModels.MasterDataPaginateTypesParam; - limit: number; - search?: string; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, types, limit, search, page, cursor), - queryFn: () => { - checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateInfinite + * @summary Paginate master data based on provided type + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.search Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, types, limit, search, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateInfinite - * @summary Paginate master data based on provided type - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.search Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - types, - limit, - search, - cursor, - }: { - officeId: string; - types: MasterDataModels.MasterDataPaginateTypesParam; - limit: number; - search?: string; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), + queryFn: ({ pageParam }) => { + checkAcl(MasterDataAcl.canUsePaginate()); + return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), - queryFn: ({ pageParam }) => { - checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; } diff --git a/test/generated/base/masterDataImport/masterDataImport.acl.ts b/test/generated/base/masterDataImport/masterDataImport.acl.ts index 6146a3a..7e98741 100644 --- a/test/generated/base/masterDataImport/masterDataImport.acl.ts +++ b/test/generated/base/masterDataImport/masterDataImport.acl.ts @@ -1,39 +1,43 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace MasterDataImportAcl { - /** - * Use for `useUpload` mutation ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpload` mutation - */ - export const canUseUpload = (object?: { officeId: string }) => - ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< - "Import", - "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) - >; +/** + * Use for `useUpload` mutation ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpload` mutation + */ +export const canUseUpload = ( + object?: { officeId: string, } +) => [ + "Import", + object ? subject("MasterData", object) : "MasterData" +] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - /** - * Use for `usePostOfficesMasterDataImportByOfficeId` mutation ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePostOfficesMasterDataImportByOfficeId` mutation - */ - export const canUsePostOfficesMasterDataImportByOfficeId = (object?: { officeId: string }) => - ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< - "Import", - "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) - >; +/** + * Use for `usePostOfficesMasterDataImportByOfficeId` mutation ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePostOfficesMasterDataImportByOfficeId` mutation + */ +export const canUsePostOfficesMasterDataImportByOfficeId = ( + object?: { officeId: string, } +) => [ + "Import", + object ? subject("MasterData", object) : "MasterData" +] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; + +/** + * Use for `useGetImportStatus` query ability. For global ability, omit the object parameter. + * @description Create upload instructions for master data import file + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetImportStatus` query + */ +export const canUseGetImportStatus = ( + object?: { officeId: string, } +) => [ + "Import", + object ? subject("MasterData", object) : "MasterData" +] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - /** - * Use for `useGetImportStatus` query ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetImportStatus` query - */ - export const canUseGetImportStatus = (object?: { officeId: string }) => - ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< - "Import", - "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) - >; } diff --git a/test/generated/base/masterDataImport/masterDataImport.api.ts b/test/generated/base/masterDataImport/masterDataImport.api.ts index 8568423..af38583 100644 --- a/test/generated/base/masterDataImport/masterDataImport.api.ts +++ b/test/generated/base/masterDataImport/masterDataImport.api.ts @@ -1,40 +1,29 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { MasterDataImportModels } from "./masterDataImport.models"; export namespace MasterDataImportApi { - export const upload = ( - officeId: string, - data: MasterDataImportModels.MasterDataImportUploadRequestDto, - config?: AxiosRequestConfig, - ) => { +export const upload = (officeId: string, data: MasterDataImportModels.MasterDataImportUploadRequestDto, ) => { return AppRestClient.post( - { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, - `/offices/${officeId}/master-data/upload`, - ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), - config, - ); - }; - - export const postOfficesMasterDataImportByOfficeId = ( - officeId: string, - data: MasterDataImportModels.MasterDataImportRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, + `/offices/${officeId}/master-data/upload`, + ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), + + ) +}; +export const postOfficesMasterDataImportByOfficeId = (officeId: string, data: MasterDataImportModels.MasterDataImportRequestDto, ) => { return AppRestClient.post( - { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, - `/offices/${officeId}/master-data/import`, - ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), - config, - ); - }; - - export const getImportStatus = (jobId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, + `/offices/${officeId}/master-data/import`, + ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), + + ) +}; +export const getImportStatus = (jobId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, - `/offices/${officeId}/master-data/import/${jobId}/status`, - config, - ); - }; + { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, + `/offices/${officeId}/master-data/import/${jobId}/status`, + + ) +}; } diff --git a/test/generated/base/masterDataImport/masterDataImport.models.ts b/test/generated/base/masterDataImport/masterDataImport.models.ts index 27c6a3e..a2dc56c 100644 --- a/test/generated/base/masterDataImport/masterDataImport.models.ts +++ b/test/generated/base/masterDataImport/masterDataImport.models.ts @@ -1,110 +1,78 @@ import { z } from "zod"; export namespace MasterDataImportModels { - /** - * ImportStatusEnumSchema - * @type { enum } - * @description Import result status - */ - export const ImportStatusEnumSchema = z.enum(["Success", "Warning", "Error"]); - export type ImportStatusEnum = z.infer; - export const ImportStatusEnum = ImportStatusEnumSchema.enum; +/** + * ImportStatusEnumSchema + * @type { enum } + * @description Import result status + */ +export const ImportStatusEnumSchema = z.enum(["Success", "Warning", "Error"]); +export type ImportStatusEnum = z.infer; +export const ImportStatusEnum = ImportStatusEnumSchema.enum; - /** - * ImportTypeEnumSchema - * @type { enum } - */ - export const ImportTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Warehouse"]); - export type ImportTypeEnum = z.infer; - export const ImportTypeEnum = ImportTypeEnumSchema.enum; +/** + * ImportTypeEnumSchema + * @type { enum } + */ +export const ImportTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Warehouse"]); +export type ImportTypeEnum = z.infer; +export const ImportTypeEnum = ImportTypeEnumSchema.enum; - /** - * MasterDataImportRequestDtoSchema - * @type { object } - * @property { string } mediaId Media ID of the uploaded file - * @property { ImportTypeEnum } type Type of data to import - */ - export const MasterDataImportRequestDtoSchema = z - .object({ - mediaId: z.string().describe("Media ID of the uploaded file"), - type: ImportTypeEnumSchema.describe("Type of data to import"), - }) - .readonly(); - export type MasterDataImportRequestDto = z.infer; +/** + * MasterDataImportRequestDtoSchema + * @type { object } + * @property { string } mediaId Media ID of the uploaded file + * @property { ImportTypeEnum } type Type of data to import + */ +export const MasterDataImportRequestDtoSchema = z.object({ mediaId: z.string(), type: ImportTypeEnumSchema }); +export type MasterDataImportRequestDto = z.infer; - /** - * ImportResultDtoSchema - * @type { object } - * @property { string } importStatus Import result status - * @property { string } downloadUrl S3 presigned URL for result file download - * @property { string } expiresAt Download URL expiration time - * @property { string } errorCode - */ - export const ImportResultDtoSchema = z - .object({ - importStatus: ImportStatusEnumSchema.describe("Import result status").nullish(), - downloadUrl: z.string().describe("S3 presigned URL for result file download"), - expiresAt: z.iso.datetime({ offset: true }).describe("Download URL expiration time").nullish(), - errorCode: z.string().nullish(), - }) - .readonly(); - export type ImportResultDto = z.infer; +/** + * ImportResultDtoSchema + * @type { object } + * @property { string } importStatus Import result status + * @property { string } downloadUrl S3 presigned URL for result file download + * @property { string } expiresAt Download URL expiration time + * @property { string } errorCode + */ +export const ImportResultDtoSchema = z.object({ importStatus: ImportStatusEnumSchema.nullish(), downloadUrl: z.string(), expiresAt: z.iso.datetime({ offset: true }).nullish(), errorCode: z.string().nullish() }); +export type ImportResultDto = z.infer; - /** - * ImportStatusResponseDtoSchema - * @type { object } - * @property { string } status Current job status - * @property { ImportResultDto } result Import result data when job is completed - */ - export const ImportStatusResponseDtoSchema = z - .object({ - status: z.string().describe("Current job status").nullable(), - result: ImportResultDtoSchema.describe("Import result data when job is completed").nullish(), - }) - .readonly(); - export type ImportStatusResponseDto = z.infer; +/** + * ImportStatusResponseDtoSchema + * @type { object } + * @property { string } status Current job status + * @property { ImportResultDto } result Import result data when job is completed + */ +export const ImportStatusResponseDtoSchema = z.object({ status: z.string().nullable(), result: ImportResultDtoSchema.nullish() }); +export type ImportStatusResponseDto = z.infer; - /** - * MasterDataImportUploadRequestDtoSchema - * @type { object } - * @property { string } filename File name - * @property { string } contentType Content type of the file - * @property { number } fileSize File size in bytes. Minimum: `1` - */ - export const MasterDataImportUploadRequestDtoSchema = z - .object({ - filename: z.string().describe("File name"), - contentType: z.string().describe("Content type of the file"), - fileSize: z.number().gte(1).describe("File size in bytes"), - }) - .readonly(); - export type MasterDataImportUploadRequestDto = z.infer; +/** + * MasterDataImportUploadRequestDtoSchema + * @type { object } + * @property { string } filename File name + * @property { string } contentType Content type of the file + * @property { number } fileSize File size in bytes. Minimum: `1` + */ +export const MasterDataImportUploadRequestDtoSchema = z.object({ filename: z.string(), contentType: z.string(), fileSize: z.number().gte(1) }); +export type MasterDataImportUploadRequestDto = z.infer; - /** - * MasterDataImportUploadResponseDtoSchema - * @type { object } - * @property { string } mediaId Media ID for the uploaded file - * @property { string } url S3 presigned upload URL - */ - export const MasterDataImportUploadResponseDtoSchema = z - .object({ - mediaId: z.string().describe("Media ID for the uploaded file"), - url: z.string().describe("S3 presigned upload URL"), - }) - .readonly(); - export type MasterDataImportUploadResponseDto = z.infer; +/** + * MasterDataImportUploadResponseDtoSchema + * @type { object } + * @property { string } mediaId Media ID for the uploaded file + * @property { string } url S3 presigned upload URL + */ +export const MasterDataImportUploadResponseDtoSchema = z.object({ mediaId: z.string(), url: z.string() }); +export type MasterDataImportUploadResponseDto = z.infer; + +/** + * MasterDataImportResponseDtoSchema + * @type { object } + * @property { string } jobId PG Boss job ID + * @property { string } status Initial job status + */ +export const MasterDataImportResponseDtoSchema = z.object({ jobId: z.string(), status: z.string().nullish() }); +export type MasterDataImportResponseDto = z.infer; - /** - * MasterDataImportResponseDtoSchema - * @type { object } - * @property { string } jobId PG Boss job ID - * @property { string } status Initial job status - */ - export const MasterDataImportResponseDtoSchema = z - .object({ - jobId: z.string().describe("PG Boss job ID"), - status: z.string().describe("Initial job status").nullish(), - }) - .readonly(); - export type MasterDataImportResponseDto = z.infer; } diff --git a/test/generated/base/masterDataImport/masterDataImport.queries.ts b/test/generated/base/masterDataImport/masterDataImport.queries.ts index 60d6af7..e6f857d 100644 --- a/test/generated/base/masterDataImport/masterDataImport.queries.ts +++ b/test/generated/base/masterDataImport/masterDataImport.queries.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,138 +9,113 @@ import { MasterDataImportModels } from "./masterDataImport.models"; import { MasterDataImportApi } from "./masterDataImport.api"; export namespace MasterDataImportQueries { - export const moduleName = QueryModule.MasterDataImport; +export const moduleName = QueryModule.MasterDataImport; - export const keys = { +export const keys = { all: [moduleName] as const, - getImportStatus: (jobId: string, officeId: string) => - [...keys.all, "/offices/:officeId/master-data/import/:jobId/status", jobId, officeId] as const, - }; + getImportStatus: (jobId: string, officeId: string) => [...keys.all, "/offices/:officeId/master-data/import/:jobId/status", jobId, officeId] as const, +}; - /** - * Mutation `useUpload` - * @summary Create upload instructions for master data import file - * @permission Requires `canUseUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { MasterDataImportModels.MasterDataImportUploadRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useUpload = ( - options?: AppMutationOptions< - typeof MasterDataImportApi.upload, - { - officeId: string; - data: MasterDataImportModels.MasterDataImportUploadRequestDto; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(MasterDataImportAcl.canUseUpload({ officeId })); - const uploadInstructions = await MasterDataImportApi.upload(officeId, data, config); +/** + * Mutation `useUpload` + * @summary Create upload instructions for master data import file + * @permission Requires `canUseUpload` ability + * @param { string } mutation.officeId Path parameter + * @param { MasterDataImportModels.MasterDataImportUploadRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } + return useMutation({ + mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(MasterDataImportAcl.canUseUpload({ officeId } )); + const uploadInstructions = await MasterDataImportApi.upload(officeId, data); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); } - dataToSend.append("file", file); } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); + dataToSend.append("file", file); } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `usePostOfficesMasterDataImportByOfficeId` - * @summary Start master data import process - * @permission Requires `canUsePostOfficesMasterDataImportByOfficeId` ability - * @param { string } mutation.officeId Path parameter - * @param { MasterDataImportModels.MasterDataImportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const usePostOfficesMasterDataImportByOfficeId = ( - options?: AppMutationOptions< - typeof MasterDataImportApi.postOfficesMasterDataImportByOfficeId, - { officeId: string; data: MasterDataImportModels.MasterDataImportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `usePostOfficesMasterDataImportByOfficeId` + * @summary Start master data import process + * @permission Requires `canUsePostOfficesMasterDataImportByOfficeId` ability + * @param { string } mutation.officeId Path parameter + * @param { MasterDataImportModels.MasterDataImportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const usePostOfficesMasterDataImportByOfficeId = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId })); - return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId } )); + return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useGetImportStatus` - * @summary Get import job status - * @permission Requires `canUseGetImportStatus` ability - * @param { string } object.jobId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetImportStatus = ( - { jobId, officeId }: { jobId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetImportStatus` + * @summary Get import job status + * @permission Requires `canUseGetImportStatus` ability + * @param { string } object.jobId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetImportStatus = ({ jobId, officeId }: { jobId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getImportStatus(jobId, officeId), + queryFn: () => { + checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId } )); + return MasterDataImportApi.getImportStatus(jobId, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getImportStatus(jobId, officeId), - queryFn: () => { - checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId })); - return MasterDataImportApi.getImportStatus(jobId, officeId, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/offices/offices.acl.ts b/test/generated/base/offices/offices.acl.ts index aec8ce6..0f81019 100644 --- a/test/generated/base/offices/offices.acl.ts +++ b/test/generated/base/offices/offices.acl.ts @@ -1,84 +1,102 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace OfficesAcl { - /** - * Use for `useCreate` mutation ability. - * @description Create office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Office"] as AbilityTuple<"Create", "Office">; +/** + * Use for `useCreate` mutation ability. + * @description Create office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Office" +] as AbilityTuple<"Create", "Office">; - /** - * Use for `useGet` query ability. - * @description Read office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; +/** + * Use for `useGet` query ability. + * @description Read office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( +) => [ + "Read", + "Office" +] as AbilityTuple<"Read", "Office">; - /** - * Use for `useUpdate` mutation ability. - * @description Update office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Office"] as AbilityTuple<"Update", "Office">; +/** + * Use for `useUpdate` mutation ability. + * @description Update office + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Office" +] as AbilityTuple<"Update", "Office">; - /** - * Use for `useUploadDocumentImage` mutation ability. For global ability, omit the object parameter. - * @description Upload office document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadDocumentImage` mutation - */ - export const canUseUploadDocumentImage = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; +/** + * Use for `useUploadDocumentImage` mutation ability. For global ability, omit the object parameter. + * @description Upload office document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadDocumentImage` mutation + */ +export const canUseUploadDocumentImage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - /** - * Use for `useCreateBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Create office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBankAccount` mutation - */ - export const canUseCreateBankAccount = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; +/** + * Use for `useCreateBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Create office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBankAccount` mutation + */ +export const canUseCreateBankAccount = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - /** - * Use for `useUpdateBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Update office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBankAccount` mutation - */ - export const canUseUpdateBankAccount = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; +/** + * Use for `useUpdateBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Update office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBankAccount` mutation + */ +export const canUseUpdateBankAccount = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - /** - * Use for `useDeleteBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Delete office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBankAccount` mutation - */ - export const canUseDeleteBankAccount = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; +/** + * Use for `useDeleteBankAccount` mutation ability. For global ability, omit the object parameter. + * @description Delete office bank account + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBankAccount` mutation + */ +export const canUseDeleteBankAccount = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; + +/** + * Use for `useUploadBankAccountFooter` mutation ability. For global ability, omit the object parameter. + * @description Upload bank account footer + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadBankAccountFooter` mutation + */ +export const canUseUploadBankAccountFooter = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Office", object) : "Office" +] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - /** - * Use for `useUploadBankAccountFooter` mutation ability. For global ability, omit the object parameter. - * @description Upload bank account footer - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadBankAccountFooter` mutation - */ - export const canUseUploadBankAccountFooter = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; } diff --git a/test/generated/base/offices/offices.api.ts b/test/generated/base/offices/offices.api.ts index 877e43b..6e096af 100644 --- a/test/generated/base/offices/offices.api.ts +++ b/test/generated/base/offices/offices.api.ts @@ -1,177 +1,110 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { OfficesModels } from "./offices.models"; export namespace OfficesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: OfficesModels.OfficeFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: OfficesModels.OfficesPaginateResponseSchema }, `/offices`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: OfficesModels.CreateOfficeRequest, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficesPaginateResponseSchema }, + `/offices`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: OfficesModels.CreateOfficeRequest, ) => { return AppRestClient.post( - { resSchema: OfficesModels.OfficeResponseDtoSchema }, - `/offices`, - ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), - config, - ); - }; - - export const findAllLabels = (search?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: OfficesModels.FindAllLabelsResponseSchema }, `/offices/labels`, { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - }); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: OfficesModels.OfficeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: OfficesModels.OfficeResponseDtoSchema }, + `/offices`, + ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), + + ) +}; +export const findAllLabels = (search?: string, ) => { return AppRestClient.get( - { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, - `/offices/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const get = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, `/offices/${id}`, config); - }; - - export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, config?: AxiosRequestConfig) => { + { resSchema: OfficesModels.FindAllLabelsResponseSchema }, + `/offices/labels`, + { + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, + `/offices/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const get = (id: string, ) => { + return AppRestClient.get( + { resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, + `/offices/${id}`, + + ) +}; +export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, ) => { return AppRestClient.put( - { resSchema: OfficesModels.OfficeResponseDtoSchema }, - `/offices/${id}`, - ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), - config, - ); - }; - - export const uploadDocumentImage = ( - officeId: string, - data: OfficesModels.UploadOfficeDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: OfficesModels.OfficeResponseDtoSchema }, + `/offices/${id}`, + ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), + + ) +}; +export const uploadDocumentImage = (officeId: string, data: OfficesModels.UploadOfficeDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, - `/offices/${officeId}/document-image`, - ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), - config, - ); - }; - - export const createBankAccount = ( - officeId: string, - data: OfficesModels.CreateOfficeBankAccountDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, + `/offices/${officeId}/document-image`, + ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), + + ) +}; +export const createBankAccount = (officeId: string, data: OfficesModels.CreateOfficeBankAccountDto, ) => { return AppRestClient.post( - { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, - `/offices/${officeId}/bank-accounts`, - ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), - config, - ); - }; - - export const updateBankAccount = ( - accountId: string, - officeId: string, - data: OfficesModels.UpdateOfficeBankAccountDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, + `/offices/${officeId}/bank-accounts`, + ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), + + ) +}; +export const updateBankAccount = (accountId: string, officeId: string, data: OfficesModels.UpdateOfficeBankAccountDto, ) => { return AppRestClient.patch( - { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, - `/offices/${officeId}/bank-accounts/${accountId}`, - ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), - config, - ); - }; - - export const deleteBankAccount = (accountId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, + `/offices/${officeId}/bank-accounts/${accountId}`, + ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), + + ) +}; +export const deleteBankAccount = (accountId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/bank-accounts/${accountId}`, - undefined, - config, - ); - }; - - export const uploadBankAccountFooter = ( - accountId: string, - officeId: string, - data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/bank-accounts/${accountId}`, + + ) +}; +export const uploadBankAccountFooter = (accountId: string, officeId: string, data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, ) => { return AppRestClient.post( - { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, - `/offices/${officeId}/bank-accounts/${accountId}/footer`, - ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), - config, - ); - }; + { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, + `/offices/${officeId}/bank-accounts/${accountId}/footer`, + ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/offices/offices.configs.ts b/test/generated/base/offices/offices.configs.ts index c595c05..07f5587 100644 --- a/test/generated/base/offices/offices.configs.ts +++ b/test/generated/base/offices/offices.configs.ts @@ -6,129 +6,130 @@ import { OfficesQueries } from "./offices.queries"; import { OfficesAcl } from "./offices.acl"; export namespace OfficesConfigs { - export const officesConfig = { +export const officesConfig = { meta: { - title: "Offices", + title: "Offices", }, readAll: { - schema: OfficesModels.OfficeListItemResponseSchema, - paginated: OfficesQueries.usePaginate, - infinite: OfficesQueries.usePaginateInfinite, - filters: { - schema: OfficesModels.OfficeFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: OfficesModels.OfficeFilterDtoSchema, - options: { - inputs: { - name: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ schema: OfficesModels.OfficeListItemResponseSchema, - options: { - columns: { - id: true, - name: true, - numberOfEmployees: true, - }, - sortable: OfficesModels.OfficesPaginateOrderParamEnumSchema, + paginated: OfficesQueries.usePaginate, + infinite: OfficesQueries.usePaginateInfinite, + filters: { + schema: OfficesModels.OfficeFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: OfficesModels.OfficeFilterDtoSchema, + options: { + inputs: { + name: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: OfficesModels.OfficeListItemResponseSchema, + options: { + columns: { + id: true, + name: true, + numberOfEmployees: true, + }, + sortable: OfficesModels.OfficesPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: OfficesAcl.canUseGet, - schema: OfficesModels.OfficeDetailResponseDtoSchema, - query: OfficesQueries.useGet, + acl: OfficesAcl.canUseGet, + schema: OfficesModels.OfficeDetailResponseDtoSchema, + query: OfficesQueries.useGet, }, create: { - acl: OfficesAcl.canUseCreate, - schema: OfficesModels.CreateOfficeRequestSchema, - mutation: OfficesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: OfficesAcl.canUseCreate, schema: OfficesModels.CreateOfficeRequestSchema, - options: { - inputs: { - name: true, - }, - }, - }), + mutation: OfficesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: OfficesModels.CreateOfficeRequestSchema, + options: { + inputs: { + name: true, + }, + }, +}) }, update: { - acl: OfficesAcl.canUseUpdate, - schema: OfficesModels.UpdateOfficeRequestSchema, - mutation: OfficesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: OfficesAcl.canUseUpdate, schema: OfficesModels.UpdateOfficeRequestSchema, - options: { - inputs: { - name: true, - symbol: true, - invoicePrefix: true, - autoClosePositionsAfterDays: true, - defaultLanguage: true, - locale: true, - vatId: true, - taxNumber: true, - termsExport: true, - termsImport: true, - showPaymentInstructions: true, - showCompanyRegistrationNumber: true, - reportInvoicesToHungarianTaxAuthority: true, - restrictPositionInvolvedParties: true, - showWatermarkOnDocuments: true, - showInvoiceVatLinesInOfficeCurrency: true, - usePartnerMatchCodes: true, - restrictFinancePartnersToRelationship: true, - costCenterId: true, - minimumOutgoingInvoiceDate: true, - minimumOutgoingInvoiceServiceDate: true, - minimumIncomingInvoiceDate: true, - minimumIncomingInvoiceServiceDate: true, - countryId: true, - defaultCurrencyId: true, - representingBusinessPartnerId: true, - availableCurrencyIds: true, - generalLedgerSystem: true, - factoringReportingEnabled: true, - bankAccountCurrencyMapping: true, - }, - }, - }), + mutation: OfficesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: OfficesModels.UpdateOfficeRequestSchema, + options: { + inputs: { + name: true, + symbol: true, + invoicePrefix: true, + autoClosePositionsAfterDays: true, + defaultLanguage: true, + locale: true, + vatId: true, + taxNumber: true, + termsExport: true, + termsImport: true, + showPaymentInstructions: true, + showCompanyRegistrationNumber: true, + reportInvoicesToHungarianTaxAuthority: true, + restrictPositionInvolvedParties: true, + showWatermarkOnDocuments: true, + showInvoiceVatLinesInOfficeCurrency: true, + usePartnerMatchCodes: true, + restrictFinancePartnersToRelationship: true, + costCenterId: true, + minimumOutgoingInvoiceDate: true, + minimumOutgoingInvoiceServiceDate: true, + minimumIncomingInvoiceDate: true, + minimumIncomingInvoiceServiceDate: true, + countryId: true, + defaultCurrencyId: true, + representingBusinessPartnerId: true, + availableCurrencyIds: true, + generalLedgerSystem: true, + factoringReportingEnabled: true, + bankAccountCurrencyMapping: true, }, - }; + }, +}) + }, +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - schema: CommonModels.LabelResponseDTOSchema, - paginated: OfficesQueries.usePaginateLabels, - infinite: OfficesQueries.usePaginateLabelsInfinite, - filters: { - schema: OfficesModels.OfficeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: OfficesModels.OfficeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema, + paginated: OfficesQueries.usePaginateLabels, + infinite: OfficesQueries.usePaginateLabelsInfinite, + filters: { + schema: OfficesModels.OfficeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: OfficesModels.OfficeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/offices/offices.models.ts b/test/generated/base/offices/offices.models.ts index ca066ec..3083b80 100644 --- a/test/generated/base/offices/offices.models.ts +++ b/test/generated/base/offices/offices.models.ts @@ -2,602 +2,389 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace OfficesModels { - /** - * OfficeCurrencyResponseDtoSchema - * @type { object } - * @property { string } isoCode - * @property { string } name - */ - export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }).readonly(); - export type OfficeCurrencyResponseDto = z.infer; +/** + * OfficeCurrencyResponseDtoSchema + * @type { object } + * @property { string } isoCode + * @property { string } name + */ +export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }); +export type OfficeCurrencyResponseDto = z.infer; - /** - * OfficeBankAccountCurrencyMappingResponseDtoSchema - * @type { object } - * @property { string } currency - * @property { string } bankAccountId - * @property { string } bankAccountName - */ - export const OfficeBankAccountCurrencyMappingResponseDtoSchema = z - .object({ currency: z.string(), bankAccountId: z.string(), bankAccountName: z.string() }) - .readonly(); - export type OfficeBankAccountCurrencyMappingResponseDto = z.infer< - typeof OfficeBankAccountCurrencyMappingResponseDtoSchema - >; +/** + * OfficeBankAccountCurrencyMappingResponseDtoSchema + * @type { object } + * @property { string } currency + * @property { string } bankAccountId + * @property { string } bankAccountName + */ +export const OfficeBankAccountCurrencyMappingResponseDtoSchema = z.object({ currency: z.string(), bankAccountId: z.string(), bankAccountName: z.string() }); +export type OfficeBankAccountCurrencyMappingResponseDto = z.infer; - /** - * OfficeBookkeepingResponseDtoSchema - * @type { object } - * @property { string } generalLedgerSystem - * @property { OfficeCurrencyResponseDto } defaultCurrency - * @property { OfficeCurrencyResponseDto[] } availableCurrencies - * @property { boolean } showPaymentInstructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { OfficeBankAccountCurrencyMappingResponseDto[] } bankAccountCurrencyMapping - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { boolean } factoringReportingEnabled - */ - export const OfficeBookkeepingResponseDtoSchema = z - .object({ - generalLedgerSystem: z.string(), - defaultCurrency: OfficeCurrencyResponseDtoSchema.nullish(), - availableCurrencies: z.array(OfficeCurrencyResponseDtoSchema).readonly(), - showPaymentInstructions: z.boolean(), - showCompanyRegistrationNumber: z.boolean(), - showInvoiceVatLinesInOfficeCurrency: z.boolean(), - reportInvoicesToHungarianTaxAuthority: z.boolean(), - bankAccountCurrencyMapping: z.array(OfficeBankAccountCurrencyMappingResponseDtoSchema).readonly(), - costCenterId: z.string().nullish(), - minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), - factoringReportingEnabled: z.boolean(), - }) - .readonly(); - export type OfficeBookkeepingResponseDto = z.infer; +/** + * OfficeBookkeepingResponseDtoSchema + * @type { object } + * @property { string } generalLedgerSystem + * @property { OfficeCurrencyResponseDto } defaultCurrency + * @property { OfficeCurrencyResponseDto[] } availableCurrencies + * @property { boolean } showPaymentInstructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { OfficeBankAccountCurrencyMappingResponseDto[] } bankAccountCurrencyMapping + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { boolean } factoringReportingEnabled + */ +export const OfficeBookkeepingResponseDtoSchema = z.object({ generalLedgerSystem: z.string(), defaultCurrency: OfficeCurrencyResponseDtoSchema.nullish(), availableCurrencies: z.array(OfficeCurrencyResponseDtoSchema), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), bankAccountCurrencyMapping: z.array(OfficeBankAccountCurrencyMappingResponseDtoSchema), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), factoringReportingEnabled: z.boolean() }); +export type OfficeBookkeepingResponseDto = z.infer; - /** - * OfficeDocumentPartEnumSchema - * @type { enum } - */ - export const OfficeDocumentPartEnumSchema = z.enum([ - "DocumentFooter", - "DocumentHeader", - "GeneralTermsAndConditions", - "BLTermsAndConditions", - "FinanceDocumentFooter", - ]); - export type OfficeDocumentPartEnum = z.infer; - export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; +/** + * OfficeDocumentPartEnumSchema + * @type { enum } + */ +export const OfficeDocumentPartEnumSchema = z.enum(["DocumentFooter", "DocumentHeader", "GeneralTermsAndConditions", "BLTermsAndConditions", "FinanceDocumentFooter"]); +export type OfficeDocumentPartEnum = z.infer; +export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; - /** - * OfficeDocumentSettingsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } mediaUrl - * @property { CommonModels.LanguageEnum } language - * @property { OfficeDocumentPartEnum } documentPart - */ - export const OfficeDocumentSettingsResponseDtoSchema = z - .object({ - id: z.string(), - mediaUrl: z.string(), - language: CommonModels.LanguageEnumSchema, - documentPart: OfficeDocumentPartEnumSchema, - }) - .readonly(); - export type OfficeDocumentSettingsResponseDto = z.infer; +/** + * OfficeDocumentSettingsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } mediaUrl + * @property { CommonModels.LanguageEnum } language + * @property { OfficeDocumentPartEnum } documentPart + */ +export const OfficeDocumentSettingsResponseDtoSchema = z.object({ id: z.string(), mediaUrl: z.string(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }); +export type OfficeDocumentSettingsResponseDto = z.infer; - /** - * AddressResponseDTOSchema - * @type { object } - * @property { string } id ID of the address - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } city City name - * @property { string } district District - * @property { string } isoCode2 2 letter country code - * @property { string } country Country name - * @property { string } isoCode3 3 letter country code - */ - export const AddressResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the address"), - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street address"), - zip: z.string().describe("ZIP/Postal code"), - city: z.string().describe("City name"), - district: z.string().describe("District"), - isoCode2: z.string().describe("2 letter country code"), - country: z.string().describe("Country name"), - isoCode3: z.string().describe("3 letter country code"), - }) - .readonly(); - export type AddressResponseDTO = z.infer; +/** + * AddressResponseDTOSchema + * @type { object } + * @property { string } id ID of the address + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street address + * @property { string } zip ZIP/Postal code + * @property { string } city City name + * @property { string } district District + * @property { string } isoCode2 2 letter country code + * @property { string } country Country name + * @property { string } isoCode3 3 letter country code + */ +export const AddressResponseDTOSchema = z.object({ id: z.string(), street: z.string(), secondaryStreet: z.string(), zip: z.string(), city: z.string(), district: z.string(), isoCode2: z.string(), country: z.string(), isoCode3: z.string() }); +export type AddressResponseDTO = z.infer; - /** - * OfficeRepresentingBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string[] } types - * @property { string[] } email - * @property { string[] } phone - * @property { string } addressId - * @property { AddressResponseDTO } address - */ - export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - types: z.array(z.string()).readonly(), - email: z.array(z.string()).readonly().nullish(), - phone: z.array(z.string()).readonly().nullish(), - addressId: z.string().nullish(), - address: AddressResponseDTOSchema.nullish(), - }) - .readonly(); - export type OfficeRepresentingBusinessPartnerResponseDto = z.infer< - typeof OfficeRepresentingBusinessPartnerResponseDtoSchema - >; +/** + * OfficeRepresentingBusinessPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string[] } types + * @property { string[] } email + * @property { string[] } phone + * @property { string } addressId + * @property { AddressResponseDTO } address + */ +export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), types: z.array(z.string()), email: z.array(z.string()).nullish(), phone: z.array(z.string()).nullish(), addressId: z.string().nullish(), address: AddressResponseDTOSchema.nullish() }); +export type OfficeRepresentingBusinessPartnerResponseDto = z.infer; - /** - * OfficePaymentTermsResponseDtoSchema - * @type { object } - * @property { number } days - * @property { string } relativeTo - */ - export const OfficePaymentTermsResponseDtoSchema = z - .object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }) - .readonly(); - export type OfficePaymentTermsResponseDto = z.infer; +/** + * OfficePaymentTermsResponseDtoSchema + * @type { object } + * @property { number } days + * @property { string } relativeTo + */ +export const OfficePaymentTermsResponseDtoSchema = z.object({ days: z.number().nullable(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema.nullable() }).partial(); +export type OfficePaymentTermsResponseDto = z.infer; - /** - * OfficeCountryResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const OfficeCountryResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type OfficeCountryResponseDto = z.infer; +/** + * OfficeCountryResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const OfficeCountryResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type OfficeCountryResponseDto = z.infer; - /** - * OfficeBankAccountResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } bankName - * @property { string } iban - * @property { string } swiftBic - * @property { boolean } useFooterOnInvoice - * @property { object } footer - * @property { string } footer.mediaUrl - * @property { boolean } isFactoringBank - */ - export const OfficeBankAccountResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - bankName: z.string(), - iban: z.string(), - swiftBic: z.string(), - useFooterOnInvoice: z.boolean(), - footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), - isFactoringBank: z.boolean(), - }) - .readonly(); - export type OfficeBankAccountResponseDto = z.infer; +/** + * OfficeBankAccountResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } bankName + * @property { string } iban + * @property { string } swiftBic + * @property { boolean } useFooterOnInvoice + * @property { object } footer + * @property { string } footer.mediaUrl + * @property { boolean } isFactoringBank + */ +export const OfficeBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string(), bankName: z.string(), iban: z.string(), swiftBic: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).nullish(), isFactoringBank: z.boolean() }); +export type OfficeBankAccountResponseDto = z.infer; - /** - * OfficeDetailResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } symbol - * @property { number } invoicePrefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage - * @property { CommonModels.LocaleEnum } locale - * @property { string } vatId - * @property { string } taxNumber - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { OfficePaymentTermsResponseDto } termsExport - * @property { OfficePaymentTermsResponseDto } termsImport - * @property { OfficeCountryResponseDto } country - * @property { OfficeBankAccountResponseDto[] } bankAccounts - * @property { OfficeBookkeepingResponseDto } bookkeeping - * @property { OfficeDocumentSettingsResponseDto[] } documentSettings - * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner - * @property { boolean } hasInttraCredentials - */ - export const OfficeDetailResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - symbol: z.string().nullable(), - invoicePrefix: z.number().nullable(), - autoClosePositionsAfterDays: z.number().nullish(), - defaultLanguage: z.string().nullable(), - locale: CommonModels.LocaleEnumSchema.nullish(), - vatId: z.string().nullable(), - taxNumber: z.string().nullable(), - restrictPositionInvolvedParties: z.boolean(), - showWatermarkOnDocuments: z.boolean(), - usePartnerMatchCodes: z.boolean(), - restrictFinancePartnersToRelationship: z.boolean(), - termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), - termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), - country: OfficeCountryResponseDtoSchema.nullable(), - bankAccounts: z.array(OfficeBankAccountResponseDtoSchema).readonly(), - bookkeeping: OfficeBookkeepingResponseDtoSchema, - documentSettings: z.array(OfficeDocumentSettingsResponseDtoSchema).readonly(), - representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), - hasInttraCredentials: z.boolean().nullish(), - }) - .readonly(); - export type OfficeDetailResponseDto = z.infer; +/** + * OfficeDetailResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } symbol + * @property { number } invoicePrefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage + * @property { CommonModels.LocaleEnum } locale + * @property { string } vatId + * @property { string } taxNumber + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { OfficePaymentTermsResponseDto } termsExport + * @property { OfficePaymentTermsResponseDto } termsImport + * @property { OfficeCountryResponseDto } country + * @property { OfficeBankAccountResponseDto[] } bankAccounts + * @property { OfficeBookkeepingResponseDto } bookkeeping + * @property { OfficeDocumentSettingsResponseDto[] } documentSettings + * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner + * @property { boolean } hasInttraCredentials + */ +export const OfficeDetailResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), country: OfficeCountryResponseDtoSchema.nullable(), bankAccounts: z.array(OfficeBankAccountResponseDtoSchema), bookkeeping: OfficeBookkeepingResponseDtoSchema, documentSettings: z.array(OfficeDocumentSettingsResponseDtoSchema), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), hasInttraCredentials: z.boolean().nullish() }); +export type OfficeDetailResponseDto = z.infer; - /** - * OfficeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } symbol - * @property { number } invoicePrefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage - * @property { CommonModels.LocaleEnum } locale - * @property { string } vatId - * @property { string } taxNumber - * @property { OfficePaymentTermsResponseDto } termsExport - * @property { OfficePaymentTermsResponseDto } termsImport - * @property { boolean } showPaymentInstructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { string } countryId - * @property { string } defaultCurrencyId - * @property { string[] } availableCurrencyIds - * @property { string } generalLedgerSystem - * @property { string } representingBusinessPartnerId - * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner - * @property { boolean } factoringReportingEnabled - */ - export const OfficeResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - symbol: z.string().nullable(), - invoicePrefix: z.number().nullable(), - autoClosePositionsAfterDays: z.number().nullish(), - defaultLanguage: z.string().nullable(), - locale: CommonModels.LocaleEnumSchema.nullish(), - vatId: z.string().nullable(), - taxNumber: z.string().nullable(), - termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), - termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), - showPaymentInstructions: z.boolean(), - showCompanyRegistrationNumber: z.boolean(), - restrictPositionInvolvedParties: z.boolean(), - showWatermarkOnDocuments: z.boolean(), - showInvoiceVatLinesInOfficeCurrency: z.boolean(), - usePartnerMatchCodes: z.boolean(), - restrictFinancePartnersToRelationship: z.boolean(), - reportInvoicesToHungarianTaxAuthority: z.boolean(), - costCenterId: z.string().nullish(), - minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), - countryId: z.string().nullable(), - defaultCurrencyId: z.string().nullable(), - availableCurrencyIds: z.array(z.string()).readonly().nullable(), - generalLedgerSystem: z.string().nullable(), - representingBusinessPartnerId: z.string().nullable(), - representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), - factoringReportingEnabled: z.boolean(), - }) - .readonly(); - export type OfficeResponseDto = z.infer; +/** + * OfficeResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } symbol + * @property { number } invoicePrefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage + * @property { CommonModels.LocaleEnum } locale + * @property { string } vatId + * @property { string } taxNumber + * @property { OfficePaymentTermsResponseDto } termsExport + * @property { OfficePaymentTermsResponseDto } termsImport + * @property { boolean } showPaymentInstructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { string } countryId + * @property { string } defaultCurrencyId + * @property { string[] } availableCurrencyIds + * @property { string } generalLedgerSystem + * @property { string } representingBusinessPartnerId + * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner + * @property { boolean } factoringReportingEnabled + */ +export const OfficeResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), countryId: z.string().nullable(), defaultCurrencyId: z.string().nullable(), availableCurrencyIds: z.array(z.string()).nullable(), generalLedgerSystem: z.string().nullable(), representingBusinessPartnerId: z.string().nullable(), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), factoringReportingEnabled: z.boolean() }); +export type OfficeResponseDto = z.infer; - /** - * UpdateOfficePaymentTermsRequestSchema - * @type { object } - * @property { number } days - * @property { string } relativeTo - */ - export const UpdateOfficePaymentTermsRequestSchema = z - .object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }) - .readonly(); - export type UpdateOfficePaymentTermsRequest = z.infer; +/** + * UpdateOfficePaymentTermsRequestSchema + * @type { object } + * @property { number } days + * @property { string } relativeTo + */ +export const UpdateOfficePaymentTermsRequestSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }); +export type UpdateOfficePaymentTermsRequest = z.infer; - /** - * UpdateOfficeBankAccountCurrencyMappingSchema - * @type { object } - * @property { string } currency - * @property { string } bankAccountId - */ - export const UpdateOfficeBankAccountCurrencyMappingSchema = z - .object({ currency: z.string(), bankAccountId: z.string() }) - .readonly(); - export type UpdateOfficeBankAccountCurrencyMapping = z.infer; +/** + * UpdateOfficeBankAccountCurrencyMappingSchema + * @type { object } + * @property { string } currency + * @property { string } bankAccountId + */ +export const UpdateOfficeBankAccountCurrencyMappingSchema = z.object({ currency: z.string(), bankAccountId: z.string() }); +export type UpdateOfficeBankAccountCurrencyMapping = z.infer; - /** - * UpdateOfficeRequestSchema - * @type { object } - * @property { string } name Office Name - * @property { string } symbol Office Symbol - * @property { number } invoicePrefix Office Invoice Prefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage Office Default Language - * @property { string } locale - * @property { string } vatId Office Vat Id - * @property { string } taxNumber Office Tax Number - * @property { UpdateOfficePaymentTermsRequest } termsExport Office Terms Export - * @property { UpdateOfficePaymentTermsRequest } termsImport Office Terms Import - * @property { boolean } showPaymentInstructions Office Show Payment Instructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { string } countryId Office country id - * @property { string } defaultCurrencyId Office default currency id - * @property { string } representingBusinessPartnerId Representing business partner id - * @property { string[] } availableCurrencyIds Office availableCurrencyIds - * @property { string } generalLedgerSystem Office general ledger system - * @property { boolean } factoringReportingEnabled - * @property { UpdateOfficeBankAccountCurrencyMapping[] } bankAccountCurrencyMapping Office bank account currency mapping - */ - export const UpdateOfficeRequestSchema = z - .object({ - name: z.string().describe("Office Name"), - symbol: z.string().describe("Office Symbol"), - invoicePrefix: z.number().describe("Office Invoice Prefix"), - autoClosePositionsAfterDays: z.number(), - defaultLanguage: z.string().describe("Office Default Language"), - locale: CommonModels.LocaleEnumSchema, - vatId: z.string().describe("Office Vat Id"), - taxNumber: z.string().describe("Office Tax Number"), - termsExport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Export"), - termsImport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Import"), - showPaymentInstructions: z.boolean().describe("Office Show Payment Instructions"), - showCompanyRegistrationNumber: z.boolean(), - reportInvoicesToHungarianTaxAuthority: z.boolean(), - restrictPositionInvolvedParties: z.boolean(), - showWatermarkOnDocuments: z.boolean(), - showInvoiceVatLinesInOfficeCurrency: z.boolean(), - usePartnerMatchCodes: z.boolean(), - restrictFinancePartnersToRelationship: z.boolean(), - costCenterId: z.string(), - minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }), - minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }), - minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }), - minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }), - countryId: z.string().describe("Office country id"), - defaultCurrencyId: z.string().describe("Office default currency id"), - representingBusinessPartnerId: z.string().describe("Representing business partner id"), - availableCurrencyIds: z.array(z.string()).readonly().describe("Office availableCurrencyIds"), - generalLedgerSystem: z.string().describe("Office general ledger system"), - factoringReportingEnabled: z.boolean(), - bankAccountCurrencyMapping: z - .array(UpdateOfficeBankAccountCurrencyMappingSchema) - .readonly() - .describe("Office bank account currency mapping"), - }) - .readonly(); - export type UpdateOfficeRequest = z.infer; +/** + * UpdateOfficeRequestSchema + * @type { object } + * @property { string } name Office Name + * @property { string } symbol Office Symbol + * @property { number } invoicePrefix Office Invoice Prefix + * @property { number } autoClosePositionsAfterDays + * @property { string } defaultLanguage Office Default Language + * @property { string } locale + * @property { string } vatId Office Vat Id + * @property { string } taxNumber Office Tax Number + * @property { UpdateOfficePaymentTermsRequest } termsExport Office Terms Export + * @property { UpdateOfficePaymentTermsRequest } termsImport Office Terms Import + * @property { boolean } showPaymentInstructions Office Show Payment Instructions + * @property { boolean } showCompanyRegistrationNumber + * @property { boolean } reportInvoicesToHungarianTaxAuthority + * @property { boolean } restrictPositionInvolvedParties + * @property { boolean } showWatermarkOnDocuments + * @property { boolean } showInvoiceVatLinesInOfficeCurrency + * @property { boolean } usePartnerMatchCodes + * @property { boolean } restrictFinancePartnersToRelationship + * @property { string } costCenterId + * @property { string } minimumOutgoingInvoiceDate + * @property { string } minimumOutgoingInvoiceServiceDate + * @property { string } minimumIncomingInvoiceDate + * @property { string } minimumIncomingInvoiceServiceDate + * @property { string } countryId Office country id + * @property { string } defaultCurrencyId Office default currency id + * @property { string } representingBusinessPartnerId Representing business partner id + * @property { string[] } availableCurrencyIds Office availableCurrencyIds + * @property { string } generalLedgerSystem Office general ledger system + * @property { boolean } factoringReportingEnabled + * @property { UpdateOfficeBankAccountCurrencyMapping[] } bankAccountCurrencyMapping Office bank account currency mapping + */ +export const UpdateOfficeRequestSchema = z.object({ name: z.string().nullable(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullable(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullable(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), termsExport: UpdateOfficePaymentTermsRequestSchema.nullable(), termsImport: UpdateOfficePaymentTermsRequestSchema.nullable(), showPaymentInstructions: z.boolean().nullable(), showCompanyRegistrationNumber: z.boolean().nullable(), reportInvoicesToHungarianTaxAuthority: z.boolean().nullable(), restrictPositionInvolvedParties: z.boolean().nullable(), showWatermarkOnDocuments: z.boolean().nullable(), showInvoiceVatLinesInOfficeCurrency: z.boolean().nullable(), usePartnerMatchCodes: z.boolean().nullable(), restrictFinancePartnersToRelationship: z.boolean().nullable(), costCenterId: z.string().nullable(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullable(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullable(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullable(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullable(), countryId: z.string().nullable(), defaultCurrencyId: z.string().nullable(), representingBusinessPartnerId: z.string().nullable(), availableCurrencyIds: z.array(z.string()).nullable(), generalLedgerSystem: z.string().nullable(), factoringReportingEnabled: z.boolean().nullable(), bankAccountCurrencyMapping: z.array(UpdateOfficeBankAccountCurrencyMappingSchema).nullable() }).partial(); +export type UpdateOfficeRequest = z.infer; - /** - * UploadOfficeDocumentRequestDtoSchema - * @type { object } - * @property { string } fileName File name with extension - * @property { string } mimeType MIME type of the file - * @property { number } fileSize Size of the file - * @property { string } language Language of the document - * @property { string } documentPart Part of the document this image represents - */ - export const UploadOfficeDocumentRequestDtoSchema = z - .object({ - fileName: z.string().describe("File name with extension"), - mimeType: z.string().describe("MIME type of the file"), - fileSize: z.number().describe("Size of the file"), - language: CommonModels.LanguageEnumSchema.describe("Language of the document"), - documentPart: OfficeDocumentPartEnumSchema.describe("Part of the document this image represents"), - }) - .readonly(); - export type UploadOfficeDocumentRequestDto = z.infer; +/** + * UploadOfficeDocumentRequestDtoSchema + * @type { object } + * @property { string } fileName File name with extension + * @property { string } mimeType MIME type of the file + * @property { number } fileSize Size of the file + * @property { string } language Language of the document + * @property { string } documentPart Part of the document this image represents + */ +export const UploadOfficeDocumentRequestDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }); +export type UploadOfficeDocumentRequestDto = z.infer; - /** - * OfficeListItemResponseSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { number } numberOfEmployees - */ - export const OfficeListItemResponseSchema = z - .object({ id: z.string(), name: z.string(), numberOfEmployees: z.number() }) - .readonly(); - export type OfficeListItemResponse = z.infer; +/** + * OfficeListItemResponseSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { number } numberOfEmployees + */ +export const OfficeListItemResponseSchema = z.object({ id: z.string(), name: z.string(), numberOfEmployees: z.number() }); +export type OfficeListItemResponse = z.infer; - /** - * OfficeFilterDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } search - */ - export const OfficeFilterDtoSchema = z.object({ name: z.string().describe("Name"), search: z.string() }).readonly(); - export type OfficeFilterDto = z.infer; +/** + * OfficeFilterDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } search + */ +export const OfficeFilterDtoSchema = z.object({ name: z.string().nullable(), search: z.string().nullable() }).partial(); +export type OfficeFilterDto = z.infer; - /** - * OfficeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const OfficeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type OfficeLabelFilterDto = z.infer; +/** + * OfficeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const OfficeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type OfficeLabelFilterDto = z.infer; - /** - * CreateOfficeRequestSchema - * @type { object } - * @property { string } name - */ - export const CreateOfficeRequestSchema = z.object({ name: z.string() }).readonly(); - export type CreateOfficeRequest = z.infer; +/** + * CreateOfficeRequestSchema + * @type { object } + * @property { string } name + */ +export const CreateOfficeRequestSchema = z.object({ name: z.string() }); +export type CreateOfficeRequest = z.infer; - /** - * DocumentImageUploadInstructionsDtoSchema - * @type { object } - * @property { string } method HTTP method to use for upload - * @property { string } url URL to upload the file to - * @property { string } documentId ID of the created/updated document setting - */ - export const DocumentImageUploadInstructionsDtoSchema = z - .object({ - method: z.string().describe("HTTP method to use for upload"), - url: z.string().describe("URL to upload the file to"), - documentId: z.string().describe("ID of the created/updated document setting"), - }) - .readonly(); - export type DocumentImageUploadInstructionsDto = z.infer; +/** + * DocumentImageUploadInstructionsDtoSchema + * @type { object } + * @property { string } method HTTP method to use for upload + * @property { string } url URL to upload the file to + * @property { string } documentId ID of the created/updated document setting + */ +export const DocumentImageUploadInstructionsDtoSchema = z.object({ method: z.string(), url: z.string(), documentId: z.string() }); +export type DocumentImageUploadInstructionsDto = z.infer; - /** - * CreateOfficeBankAccountDtoSchema - * @type { object } - * @property { string } name Bank account name - * @property { string } bankName Bank name - * @property { string } iban IBAN - * @property { string } swiftBic SWIFT/BIC code - * @property { boolean } useFooterOnInvoice Use footer on invoice - */ - export const CreateOfficeBankAccountDtoSchema = z - .object({ - name: z.string().describe("Bank account name"), - bankName: z.string().describe("Bank name"), - iban: z.string().describe("IBAN"), - swiftBic: z.string().describe("SWIFT/BIC code"), - useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), - }) - .readonly(); - export type CreateOfficeBankAccountDto = z.infer; +/** + * CreateOfficeBankAccountDtoSchema + * @type { object } + * @property { string } name Bank account name + * @property { string } bankName Bank name + * @property { string } iban IBAN + * @property { string } swiftBic SWIFT/BIC code + * @property { boolean } useFooterOnInvoice Use footer on invoice + */ +export const CreateOfficeBankAccountDtoSchema = z.object({ name: z.string().nullable(), bankName: z.string().nullable(), iban: z.string().nullable(), swiftBic: z.string().nullable(), useFooterOnInvoice: z.boolean().nullable() }).partial(); +export type CreateOfficeBankAccountDto = z.infer; - /** - * UpdateOfficeBankAccountDtoSchema - * @type { object } - * @property { string } name Bank account name - * @property { string } bankName Bank name - * @property { string } iban IBAN - * @property { string } swiftBic SWIFT/BIC code - * @property { boolean } useFooterOnInvoice Use footer on invoice - * @property { boolean } isFactoringBank Is factoring bank - */ - export const UpdateOfficeBankAccountDtoSchema = z - .object({ - name: z.string().describe("Bank account name"), - bankName: z.string().describe("Bank name"), - iban: z.string().describe("IBAN"), - swiftBic: z.string().describe("SWIFT/BIC code"), - useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), - isFactoringBank: z.boolean().describe("Is factoring bank"), - }) - .readonly(); - export type UpdateOfficeBankAccountDto = z.infer; +/** + * UpdateOfficeBankAccountDtoSchema + * @type { object } + * @property { string } name Bank account name + * @property { string } bankName Bank name + * @property { string } iban IBAN + * @property { string } swiftBic SWIFT/BIC code + * @property { boolean } useFooterOnInvoice Use footer on invoice + * @property { boolean } isFactoringBank Is factoring bank + */ +export const UpdateOfficeBankAccountDtoSchema = z.object({ name: z.string().nullable(), bankName: z.string().nullable(), iban: z.string().nullable(), swiftBic: z.string().nullable(), useFooterOnInvoice: z.boolean().nullable(), isFactoringBank: z.boolean().nullable() }).partial(); +export type UpdateOfficeBankAccountDto = z.infer; - /** - * UploadOfficeBankAccountFooterRequestDtoSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType File MIME type - * @property { number } fileSize Size of the file - */ - export const UploadOfficeBankAccountFooterRequestDtoSchema = z - .object({ - fileName: z.string().describe("File name"), - mimeType: z.string().describe("File MIME type"), - fileSize: z.number().describe("Size of the file"), - }) - .readonly(); - export type UploadOfficeBankAccountFooterRequestDto = z.infer; +/** + * UploadOfficeBankAccountFooterRequestDtoSchema + * @type { object } + * @property { string } fileName File name + * @property { string } mimeType File MIME type + * @property { number } fileSize Size of the file + */ +export const UploadOfficeBankAccountFooterRequestDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number() }); +export type UploadOfficeBankAccountFooterRequestDto = z.infer; - /** - * OfficesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const OfficesPaginateOrderParamEnumSchema = z.enum(["name"]); - export type OfficesPaginateOrderParamEnum = z.infer; - export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema.enum; +/** + * OfficesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const OfficesPaginateOrderParamEnumSchema = z.enum(["name"]); +export type OfficesPaginateOrderParamEnum = z.infer; +export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema.enum; - /** - * OfficesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficeListItemResponse[] } items - */ - export const OfficesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(OfficeListItemResponseSchema).readonly() }).readonly().shape, - }); - export type OfficesPaginateResponse = z.infer; +/** + * OfficesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { OfficeListItemResponse[] } items + */ +export const OfficesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(OfficeListItemResponseSchema).nullable() }).partial().shape }); +export type OfficesPaginateResponse = z.infer; - /** - * FindAllLabelsResponseSchema - * @type { array } - */ - export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type FindAllLabelsResponse = z.infer; +/** + * FindAllLabelsResponseSchema + * @type { array } + */ +export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); +export type FindAllLabelsResponse = z.infer; - /** - * OfficesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const OfficesPaginateLabelsOrderParamEnumSchema = z.enum(["name"]); - export type OfficesPaginateLabelsOrderParamEnum = z.infer; - export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderParamEnumSchema.enum; +/** + * OfficesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const OfficesPaginateLabelsOrderParamEnumSchema = z.enum(["name"]); +export type OfficesPaginateLabelsOrderParamEnum = z.infer; +export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * OfficesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const OfficesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type OfficesPaginateLabelsResponse = z.infer; - /** - * OfficesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const OfficesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type OfficesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/offices/offices.queries.ts b/test/generated/base/offices/offices.queries.ts index a752a7b..5258732 100644 --- a/test/generated/base/offices/offices.queries.ts +++ b/test/generated/base/offices/offices.queries.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,502 +9,395 @@ import { OfficesModels } from "./offices.models"; import { OfficesApi } from "./offices.api"; export namespace OfficesQueries { - export const moduleName = QueryModule.Offices; +export const moduleName = QueryModule.Offices; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: OfficesModels.OfficeFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string) => - [...keys.all, "/offices", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string) => [...keys.all, "/offices", "infinite", limit, order, filter, cursor] as const, findAllLabels: (search?: string) => [...keys.all, "/offices/labels", search] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: OfficesModels.OfficeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: OfficesModels.OfficeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string) => [...keys.all, "/offices/labels/paginate", "infinite", limit, order, filter, cursor] as const, get: (id: string) => [...keys.all, "/offices/:id", id] as const, - }; +}; - /** - * Query `usePaginate` - * @summary Paginate offices - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: OfficesModels.OfficeFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => OfficesApi.paginate(limit, order, filter, page, cursor, config), - ...options, - }); - }; +/** + * Query `usePaginate` + * @summary Paginate offices + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => + OfficesApi.paginate(limit, order, filter, page, cursor), + ...options, + }); +}; - /** - * Infinite query `usePaginateInfinite - * @summary Paginate offices - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: OfficesModels.OfficeFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => OfficesApi.paginate(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateInfinite + * @summary Paginate offices + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - /** - * Mutation `useCreate` - * @summary Create new office - * @permission Requires `canUseCreate` ability - * @param { OfficesModels.CreateOfficeRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + OfficesApi.paginate(limit, order, filter, pageParam, cursor), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(OfficesAcl.canUseCreate()); - return OfficesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useCreate` + * @summary Create new office + * @permission Requires `canUseCreate` ability + * @param { OfficesModels.CreateOfficeRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `useFindAllLabels` - * @summary List all offices with only their labels - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllLabels = ( - { search }: { search?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findAllLabels(search), - queryFn: () => OfficesApi.findAllLabels(search, config), - ...options, - }); - }; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(OfficesAcl.canUseCreate()); + return OfficesApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `usePaginateLabels` - * @summary Paginate offices with only their labels - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: OfficesModels.OfficeLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => OfficesApi.paginateLabels(limit, order, filter, page, cursor, config), - ...options, - }); - }; +/** + * Query `useFindAllLabels` + * @summary List all offices with only their labels + * @param { string } object.search Query parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllLabels = ({ search }: { search?: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.findAllLabels(search), + queryFn: () => + OfficesApi.findAllLabels(search), + ...options, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate offices with only their labels - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: OfficesModels.OfficeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate offices with only their labels + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => + OfficesApi.paginateLabels(limit, order, filter, page, cursor), + ...options, + }); +}; - /** - * Query `useGet` - * @summary Get office by id - * @permission Requires `canUseGet` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate offices with only their labels + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` + * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - return useQuery({ - queryKey: keys.get(id), - queryFn: () => { - checkAcl(OfficesAcl.canUseGet()); - return OfficesApi.get(id, config); - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => + OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor), + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Mutation `useUpdate` - * @summary Update office - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { OfficesModels.UpdateOfficeRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Query `useGet` + * @summary Get office by id + * @permission Requires `canUseGet` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(id), + queryFn: () => { + checkAcl(OfficesAcl.canUseGet()); + return OfficesApi.get(id) }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(OfficesAcl.canUseUpdate()); - return OfficesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update office + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { OfficesModels.UpdateOfficeRequest } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUploadDocumentImage` - * @summary Upload document image for an office - * @permission Requires `canUseUploadDocumentImage` ability - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UploadOfficeDocumentRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useUploadDocumentImage = ( - options?: AppMutationOptions< - typeof OfficesApi.uploadDocumentImage, - { - officeId: string; - data: OfficesModels.UploadOfficeDocumentRequestDto; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(OfficesAcl.canUseUpdate()); + return OfficesApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId })); - const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data, config); +/** + * Mutation `useUploadDocumentImage` + * @summary Upload document image for an office + * @permission Requires `canUseUploadDocumentImage` ability + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UploadOfficeDocumentRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUploadDocumentImage = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } + return useMutation({ + mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId } )); + const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); } - dataToSend.append("file", file); } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); + dataToSend.append("file", file); } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCreateBankAccount` - * @summary Create office bank account - * @permission Requires `canUseCreateBankAccount` ability - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.CreateOfficeBankAccountDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateBankAccount = ( - options?: AppMutationOptions< - typeof OfficesApi.createBankAccount, - { officeId: string; data: OfficesModels.CreateOfficeBankAccountDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId })); - return OfficesApi.createBankAccount(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useCreateBankAccount` + * @summary Create office bank account + * @permission Requires `canUseCreateBankAccount` ability + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.CreateOfficeBankAccountDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdateBankAccount` - * @summary Update office bank account - * @permission Requires `canUseUpdateBankAccount` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UpdateOfficeBankAccountDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBankAccount = ( - options?: AppMutationOptions< - typeof OfficesApi.updateBankAccount, - { accountId: string; officeId: string; data: OfficesModels.UpdateOfficeBankAccountDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId } )); + return OfficesApi.createBankAccount(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ accountId, officeId, data }) => { - checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId })); - return OfficesApi.updateBankAccount(accountId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdateBankAccount` + * @summary Update office bank account + * @permission Requires `canUseUpdateBankAccount` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UpdateOfficeBankAccountDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteBankAccount` - * @summary Delete office bank account - * @permission Requires `canUseDeleteBankAccount` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteBankAccount = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ accountId, officeId, data }) => { + checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId } )); + return OfficesApi.updateBankAccount(accountId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ accountId, officeId }) => { - checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId })); - return OfficesApi.deleteBankAccount(accountId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteBankAccount` + * @summary Delete office bank account + * @permission Requires `canUseDeleteBankAccount` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUploadBankAccountFooter` - * @summary Upload office bank account footer - * @permission Requires `canUseUploadBankAccountFooter` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UploadOfficeBankAccountFooterRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useUploadBankAccountFooter = ( - options?: AppMutationOptions< - typeof OfficesApi.uploadBankAccountFooter, - { - accountId: string; - officeId: string; - data: OfficesModels.UploadOfficeBankAccountFooterRequestDto; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ accountId, officeId }) => { + checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId } )); + return OfficesApi.deleteBankAccount(accountId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId })); - const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data, config); +/** + * Mutation `useUploadBankAccountFooter` + * @summary Upload office bank account footer + * @permission Requires `canUseUploadBankAccountFooter` ability + * @param { string } mutation.accountId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { OfficesModels.UploadOfficeBankAccountFooterRequestDto } mutation.data Body parameter + * @param { File } mutation.file Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUploadBankAccountFooter = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } + return useMutation({ + mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { + checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId } )); + const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data); + + if (file && uploadInstructions.url) { + const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; + let dataToSend: File | FormData = file; + if (method === "post") { + dataToSend = new FormData(); + if (uploadInstructions.fields) { + for (const [key, value] of uploadInstructions.fields) { + dataToSend.append(key, value); } - dataToSend.append("file", file); } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); + dataToSend.append("file", file); } + await axios[method](uploadInstructions.url, dataToSend, { + headers: { + "Content-Type": file.type, + }, + signal: abortController?.signal, + onUploadProgress: onUploadProgress + ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) + : undefined, + }); + } + + return uploadInstructions; + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/packageTypes/packageTypes.acl.ts b/test/generated/base/packageTypes/packageTypes.acl.ts index 625e4db..f37bcb1 100644 --- a/test/generated/base/packageTypes/packageTypes.acl.ts +++ b/test/generated/base/packageTypes/packageTypes.acl.ts @@ -1,45 +1,74 @@ import { AbilityTuple } from "@casl/ability"; export namespace PackageTypesAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "PackageType"] as AbilityTuple<"Create", "PackageType">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "PackageType"] as AbilityTuple<"Update", "PackageType">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "PackageType"] as AbilityTuple<"Archive", "PackageType">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "PackageType"] as AbilityTuple<"Archive", "PackageType">; +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "PackageType" +] as AbilityTuple<"Read", "PackageType">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "PackageType" +] as AbilityTuple<"Create", "PackageType">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "PackageType" +] as AbilityTuple<"Read", "PackageType">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "PackageType" +] as AbilityTuple<"Read", "PackageType">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "PackageType" +] as AbilityTuple<"Update", "PackageType">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "PackageType" +] as AbilityTuple<"Archive", "PackageType">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "PackageType" +] as AbilityTuple<"Archive", "PackageType">; + } diff --git a/test/generated/base/packageTypes/packageTypes.api.ts b/test/generated/base/packageTypes/packageTypes.api.ts index 36375cd..72184b2 100644 --- a/test/generated/base/packageTypes/packageTypes.api.ts +++ b/test/generated/base/packageTypes/packageTypes.api.ts @@ -1,131 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PackageTypesModels } from "./packageTypes.models"; export namespace PackageTypesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: PackageTypesModels.PackageTypePaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, `/package-types`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, + `/package-types`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, ) => { return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types`, - ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), - config, - ); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: PackageTypesModels.PackageTypeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types`, + ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), + + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, - `/package-types/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { + { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, + `/package-types/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, ) => { return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}`, - config, - ); - }; - - export const update = ( - id: string, - data: PackageTypesModels.UpdatePackageTypeRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}`, + + ) +}; +export const update = (id: string, data: PackageTypesModels.UpdatePackageTypeRequestDTO, ) => { return AppRestClient.patch( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}`, - ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}`, + ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, ) => { return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, + `/package-types/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/packageTypes/packageTypes.configs.ts b/test/generated/base/packageTypes/packageTypes.configs.ts index 786762d..ba6aafd 100644 --- a/test/generated/base/packageTypes/packageTypes.configs.ts +++ b/test/generated/base/packageTypes/packageTypes.configs.ts @@ -6,123 +6,124 @@ import { PackageTypesQueries } from "./packageTypes.queries"; import { PackageTypesAcl } from "./packageTypes.acl"; export namespace PackageTypesConfigs { - export const packageTypesConfig = { +export const packageTypesConfig = { meta: { - title: "Package Types", + title: "Package Types", }, readAll: { - acl: PackageTypesAcl.canUsePaginate, - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - paginated: PackageTypesQueries.usePaginate, - infinite: PackageTypesQueries.usePaginateInfinite, - filters: { - schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: PackageTypesAcl.canUsePaginate, schema: PackageTypesModels.PackageTypeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - length: true, - width: true, - height: true, - unit: true, - archived: true, - code: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema, + paginated: PackageTypesQueries.usePaginate, + infinite: PackageTypesQueries.usePaginateInfinite, + filters: { + schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + length: true, + width: true, + height: true, + unit: true, + archived: true, + code: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: PackageTypesAcl.canUseFindById, - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - query: PackageTypesQueries.useFindById, + acl: PackageTypesAcl.canUseFindById, + schema: PackageTypesModels.PackageTypeResponseDTOSchema, + query: PackageTypesQueries.useFindById, }, create: { - acl: PackageTypesAcl.canUseCreate, - schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, - mutation: PackageTypesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: PackageTypesAcl.canUseCreate, schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, - options: { - inputs: { - name: true, - length: true, - width: true, - height: true, - unit: true, - code: true, - }, - }, - }), + mutation: PackageTypesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, + options: { + inputs: { + name: true, + length: true, + width: true, + height: true, + unit: true, + code: true, + }, + }, +}) }, update: { - acl: PackageTypesAcl.canUseUpdate, - schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, - mutation: PackageTypesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: PackageTypesAcl.canUseUpdate, schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, - options: { - inputs: { - name: true, - length: true, - width: true, - height: true, - unit: true, - code: true, - }, - }, - }), + mutation: PackageTypesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, + options: { + inputs: { + name: true, + length: true, + width: true, + height: true, + unit: true, + code: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: PackageTypesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PackageTypesQueries.usePaginateLabels, - infinite: PackageTypesQueries.usePaginateLabelsInfinite, - filters: { - schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: PackageTypesAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema, + paginated: PackageTypesQueries.usePaginateLabels, + infinite: PackageTypesQueries.usePaginateLabelsInfinite, + filters: { + schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/packageTypes/packageTypes.models.ts b/test/generated/base/packageTypes/packageTypes.models.ts index ab3d38c..25b4d59 100644 --- a/test/generated/base/packageTypes/packageTypes.models.ts +++ b/test/generated/base/packageTypes/packageTypes.models.ts @@ -2,571 +2,127 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace PackageTypesModels { - /** - * PackageTypeCodeEnumSchema - * @type { enum } - */ - export const PackageTypeCodeEnumSchema = z.enum([ - "1A", - "1B", - "1D", - "1F", - "1G", - "1W", - "2C", - "3A", - "3H", - "43", - "44", - "4A", - "4B", - "4C", - "4D", - "4F", - "4G", - "4H", - "5H", - "5L", - "5M", - "6H", - "6P", - "7A", - "7B", - "8A", - "8B", - "8C", - "AA", - "AB", - "AC", - "AD", - "AE", - "AF", - "AG", - "AH", - "AI", - "AJ", - "AL", - "AM", - "AP", - "AT", - "AV", - "B4", - "BA", - "BB", - "BC", - "BD", - "BE", - "BF", - "BG", - "BH", - "BI", - "BJ", - "BK", - "BL", - "BM", - "BN", - "BO", - "BP", - "BQ", - "BR", - "BS", - "BT", - "BU", - "BV", - "BW", - "BX", - "BY", - "BZ", - "CA", - "CB", - "CC", - "CD", - "CE", - "CF", - "CG", - "CH", - "CI", - "CJ", - "CK", - "CL", - "CM", - "CN", - "CO", - "CP", - "CQ", - "CR", - "CS", - "CT", - "CU", - "CV", - "CW", - "CX", - "CY", - "CZ", - "DA", - "DB", - "DC", - "DG", - "DH", - "DI", - "DJ", - "DK", - "DL", - "DM", - "DN", - "DP", - "DR", - "DS", - "DT", - "DU", - "DV", - "DW", - "DX", - "DY", - "EC", - "ED", - "EE", - "EF", - "EG", - "EH", - "EI", - "EN", - "FB", - "FC", - "FD", - "FE", - "FI", - "FL", - "FO", - "FP", - "FR", - "FT", - "FW", - "FX", - "GB", - "GI", - "GL", - "GR", - "GU", - "GY", - "GZ", - "HA", - "HB", - "HC", - "HG", - "HN", - "HR", - "IA", - "IB", - "IC", - "ID", - "IE", - "IF", - "IG", - "IH", - "IK", - "IL", - "IN", - "IZ", - "JB", - "JC", - "JG", - "JR", - "JT", - "JY", - "KG", - "KI", - "LE", - "LG", - "LT", - "LU", - "LV", - "LZ", - "MA", - "MB", - "MC", - "ME", - "MR", - "MS", - "MT", - "MW", - "MX", - "NA", - "NE", - "NF", - "NG", - "NS", - "NT", - "NU", - "NV", - "OA", - "OB", - "OC", - "OD", - "OE", - "OF", - "OK", - "OT", - "OU", - "P2", - "PA", - "PB", - "PC", - "PD", - "PE", - "PF", - "PG", - "PH", - "PI", - "PJ", - "PK", - "PL", - "PN", - "PO", - "PP", - "PR", - "PT", - "PU", - "PV", - "PX", - "PY", - "PZ", - "QA", - "QB", - "QC", - "QD", - "QF", - "QG", - "QH", - "QJ", - "QK", - "QL", - "QM", - "QN", - "QP", - "QQ", - "QR", - "QS", - "RD", - "RG", - "RJ", - "RK", - "RL", - "RO", - "RT", - "RZ", - "SA", - "SB", - "SC", - "SD", - "SE", - "SH", - "SI", - "SK", - "SL", - "SM", - "SO", - "SP", - "SS", - "ST", - "SU", - "SV", - "SW", - "SY", - "SZ", - "T1", - "TB", - "TC", - "TD", - "TE", - "TG", - "TI", - "TK", - "TL", - "TN", - "TO", - "TR", - "TS", - "TT", - "TU", - "TV", - "TW", - "TY", - "TZ", - "UC", - "UN", - "VA", - "VG", - "VI", - "VK", - "VL", - "VO", - "VP", - "VQ", - "VN", - "VR", - "VS", - "VY", - "WA", - "WB", - "WC", - "WD", - "WF", - "WG", - "WH", - "WJ", - "WK", - "WL", - "WM", - "WN", - "WP", - "WQ", - "WR", - "WS", - "WT", - "WU", - "WV", - "WW", - "WX", - "WY", - "WZ", - "XA", - "XB", - "XC", - "XD", - "XF", - "XG", - "XH", - "XJ", - "XK", - "YA", - "YB", - "YC", - "YD", - "YF", - "YG", - "YH", - "YJ", - "YK", - "YL", - "YM", - "YN", - "YP", - "YQ", - "YR", - "YS", - "YT", - "YV", - "YW", - "YX", - "YY", - "YZ", - "ZA", - "ZB", - "ZC", - "ZD", - "ZF", - "ZG", - "ZH", - "ZJ", - "ZK", - "ZL", - "ZM", - "ZN", - "ZP", - "ZQ", - "ZR", - "ZS", - "ZT", - "ZU", - "ZV", - "ZW", - "ZX", - "ZY", - "ZZ", - ]); - export type PackageTypeCodeEnum = z.infer; - export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; +/** + * PackageTypeCodeEnumSchema + * @type { enum } + */ +export const PackageTypeCodeEnumSchema = z.enum(["1A", "1B", "1D", "1F", "1G", "1W", "2C", "3A", "3H", "43", "44", "4A", "4B", "4C", "4D", "4F", "4G", "4H", "5H", "5L", "5M", "6H", "6P", "7A", "7B", "8A", "8B", "8C", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AL", "AM", "AP", "AT", "AV", "B4", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "DA", "DB", "DC", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DP", "DR", "DS", "DT", "DU", "DV", "DW", "DX", "DY", "EC", "ED", "EE", "EF", "EG", "EH", "EI", "EN", "FB", "FC", "FD", "FE", "FI", "FL", "FO", "FP", "FR", "FT", "FW", "FX", "GB", "GI", "GL", "GR", "GU", "GY", "GZ", "HA", "HB", "HC", "HG", "HN", "HR", "IA", "IB", "IC", "ID", "IE", "IF", "IG", "IH", "IK", "IL", "IN", "IZ", "JB", "JC", "JG", "JR", "JT", "JY", "KG", "KI", "LE", "LG", "LT", "LU", "LV", "LZ", "MA", "MB", "MC", "ME", "MR", "MS", "MT", "MW", "MX", "NA", "NE", "NF", "NG", "NS", "NT", "NU", "NV", "OA", "OB", "OC", "OD", "OE", "OF", "OK", "OT", "OU", "P2", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PI", "PJ", "PK", "PL", "PN", "PO", "PP", "PR", "PT", "PU", "PV", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "RD", "RG", "RJ", "RK", "RL", "RO", "RT", "RZ", "SA", "SB", "SC", "SD", "SE", "SH", "SI", "SK", "SL", "SM", "SO", "SP", "SS", "ST", "SU", "SV", "SW", "SY", "SZ", "T1", "TB", "TC", "TD", "TE", "TG", "TI", "TK", "TL", "TN", "TO", "TR", "TS", "TT", "TU", "TV", "TW", "TY", "TZ", "UC", "UN", "VA", "VG", "VI", "VK", "VL", "VO", "VP", "VQ", "VN", "VR", "VS", "VY", "WA", "WB", "WC", "WD", "WF", "WG", "WH", "WJ", "WK", "WL", "WM", "WN", "WP", "WQ", "WR", "WS", "WT", "WU", "WV", "WW", "WX", "WY", "WZ", "XA", "XB", "XC", "XD", "XF", "XG", "XH", "XJ", "XK", "YA", "YB", "YC", "YD", "YF", "YG", "YH", "YJ", "YK", "YL", "YM", "YN", "YP", "YQ", "YR", "YS", "YT", "YV", "YW", "YX", "YY", "YZ", "ZA", "ZB", "ZC", "ZD", "ZF", "ZG", "ZH", "ZJ", "ZK", "ZL", "ZM", "ZN", "ZP", "ZQ", "ZR", "ZS", "ZT", "ZU", "ZV", "ZW", "ZX", "ZY", "ZZ"]); +export type PackageTypeCodeEnum = z.infer; +export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; - /** - * PackageTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type PackageTypeEmployeeDTO = z.infer; +/** + * PackageTypeEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type PackageTypeEmployeeDTO = z.infer; - /** - * PackageTypeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the package type - * @property { string } name Unique name for the package type - * @property { number } length Length of the package type - * @property { number } width Width of the package type - * @property { number } height Height of the package type - * @property { string } unit Measurement unit for dimensions - * @property { boolean } archived Indicates if the package type is archived - * @property { PackageTypeCodeEnum } code - * @property { string } createdById - * @property { PackageTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PackageTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const PackageTypeResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier for the package type"), - name: z.string().describe("Unique name for the package type"), - length: z.number().describe("Length of the package type").nullish(), - width: z.number().describe("Width of the package type").nullish(), - height: z.number().describe("Height of the package type").nullish(), - unit: z.string().describe("Measurement unit for dimensions"), - archived: z.boolean().describe("Indicates if the package type is archived"), - code: PackageTypeCodeEnumSchema.nullish(), - createdById: z.string().nullish(), - createdBy: PackageTypeEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: PackageTypeEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type PackageTypeResponseDTO = z.infer; +/** + * PackageTypeResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the package type + * @property { string } name Unique name for the package type + * @property { number } length Length of the package type + * @property { number } width Width of the package type + * @property { number } height Height of the package type + * @property { string } unit Measurement unit for dimensions + * @property { boolean } archived Indicates if the package type is archived + * @property { PackageTypeCodeEnum } code + * @property { string } createdById + * @property { PackageTypeEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PackageTypeEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const PackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), unit: z.string(), archived: z.boolean(), code: PackageTypeCodeEnumSchema.nullish(), createdById: z.string().nullish(), createdBy: PackageTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PackageTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type PackageTypeResponseDTO = z.infer; - /** - * CreatePackageTypeRequestDTOSchema - * @type { object } - * @property { string } name Unique name for the package type - * @property { number } length Length of the package type - * @property { number } width Width of the package type - * @property { number } height Height of the package type - * @property { string } unit Measurement unit for dimensions - * @property { PackageTypeCodeEnum } code - */ - export const CreatePackageTypeRequestDTOSchema = z - .object({ - name: z.string().describe("Unique name for the package type"), - length: z.number().describe("Length of the package type").nullish(), - width: z.number().describe("Width of the package type").nullish(), - height: z.number().describe("Height of the package type").nullish(), - unit: z.string().describe("Measurement unit for dimensions"), - code: PackageTypeCodeEnumSchema.nullish(), - }) - .readonly(); - export type CreatePackageTypeRequestDTO = z.infer; +/** + * CreatePackageTypeRequestDTOSchema + * @type { object } + * @property { string } name Unique name for the package type + * @property { number } length Length of the package type + * @property { number } width Width of the package type + * @property { number } height Height of the package type + * @property { string } unit Measurement unit for dimensions + * @property { PackageTypeCodeEnum } code + */ +export const CreatePackageTypeRequestDTOSchema = z.object({ name: z.string(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), unit: z.string(), code: PackageTypeCodeEnumSchema.nullish() }); +export type CreatePackageTypeRequestDTO = z.infer; - /** - * UpdatePackageTypeRequestDTOSchema - * @type { object } - * @property { string } name Updated name for package type - * @property { number } length Updated length of the package type - * @property { number } width Updated width of the package type - * @property { number } height Updated height of the package type - * @property { string } unit Updated measurement unit for dimensions - * @property { PackageTypeCodeEnum } code - */ - export const UpdatePackageTypeRequestDTOSchema = z - .object({ - name: z.string().describe("Updated name for package type"), - length: z.number().describe("Updated length of the package type").nullable(), - width: z.number().describe("Updated width of the package type").nullable(), - height: z.number().describe("Updated height of the package type").nullable(), - unit: z.string().describe("Updated measurement unit for dimensions"), - code: PackageTypeCodeEnumSchema, - }) - .readonly(); - export type UpdatePackageTypeRequestDTO = z.infer; +/** + * UpdatePackageTypeRequestDTOSchema + * @type { object } + * @property { string } name Updated name for package type + * @property { number } length Updated length of the package type + * @property { number } width Updated width of the package type + * @property { number } height Updated height of the package type + * @property { string } unit Updated measurement unit for dimensions + * @property { PackageTypeCodeEnum } code + */ +export const UpdatePackageTypeRequestDTOSchema = z.object({ name: z.string().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), unit: z.string().nullable(), code: PackageTypeCodeEnumSchema.nullable() }).partial(); +export type UpdatePackageTypeRequestDTO = z.infer; - /** - * PackageTypePaginationFilterDtoSchema - * @type { object } - * @property { boolean } archived Archived - * @property { string } search - */ - export const PackageTypePaginationFilterDtoSchema = z - .object({ archived: z.boolean().describe("Archived"), search: z.string() }) - .readonly(); - export type PackageTypePaginationFilterDto = z.infer; +/** + * PackageTypePaginationFilterDtoSchema + * @type { object } + * @property { boolean } archived Archived + * @property { string } search + */ +export const PackageTypePaginationFilterDtoSchema = z.object({ archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); +export type PackageTypePaginationFilterDto = z.infer; - /** - * PackageTypeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const PackageTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type PackageTypeLabelFilterDto = z.infer; +/** + * PackageTypeLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const PackageTypeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type PackageTypeLabelFilterDto = z.infer; - /** - * PackageTypesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const PackageTypesPaginateOrderParamEnumSchema = z.enum([ - "matchCode", - "description", - "length", - "width", - "height", - "unit", - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PackageTypesPaginateOrderParamEnum = z.infer; - export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParamEnumSchema.enum; +/** + * PackageTypesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PackageTypesPaginateOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PackageTypesPaginateOrderParamEnum = z.infer; +export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParamEnumSchema.enum; - /** - * PackageTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PackageTypeResponseDTO[] } items - */ - export const PackageTypesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PackageTypeResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PackageTypesPaginateResponse = z.infer; +/** + * PackageTypesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PackageTypeResponseDTO[] } items + */ +export const PackageTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageTypeResponseDTOSchema).nullable() }).partial().shape }); +export type PackageTypesPaginateResponse = z.infer; - /** - * PackageTypesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PackageTypesPaginateLabelsOrderParamEnumSchema = z.enum([ - "matchCode", - "description", - "length", - "width", - "height", - "unit", - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PackageTypesPaginateLabelsOrderParamEnum = z.infer; - export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabelsOrderParamEnumSchema.enum; +/** + * PackageTypesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PackageTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PackageTypesPaginateLabelsOrderParamEnum = z.infer; +export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * PackageTypesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PackageTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type PackageTypesPaginateLabelsResponse = z.infer; - /** - * PackageTypesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PackageTypesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PackageTypesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/packageTypes/packageTypes.queries.ts b/test/generated/base/packageTypes/packageTypes.queries.ts index 2550517..86ebe9e 100644 --- a/test/generated/base/packageTypes/packageTypes.queries.ts +++ b/test/generated/base/packageTypes/packageTypes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,357 +8,257 @@ import { PackageTypesModels } from "./packageTypes.models"; import { PackageTypesApi } from "./packageTypes.api"; export namespace PackageTypesQueries { - export const moduleName = QueryModule.PackageTypes; +export const moduleName = QueryModule.PackageTypes; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: PackageTypesModels.PackageTypePaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/package-types", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: PackageTypesModels.PackageTypePaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/package-types", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: PackageTypesModels.PackageTypeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/package-types/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: PackageTypesModels.PackageTypeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/package-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string) => [...keys.all, "/package-types", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string) => [...keys.all, "/package-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/package-types/:id", id] as const, - }; +}; - /** - * Query `usePaginate` - * @summary Paginate Package Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: PackageTypesModels.PackageTypePaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Package Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: PackageTypesModels.PackageTypePaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginate` + * @summary Paginate Package Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PackageTypesAcl.canUsePaginate()); + return PackageTypesApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Package Types + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Mutation `useCreate` - * @summary Create a new Package Type - * @permission Requires `canUseCreate` ability - * @param { PackageTypesModels.CreatePackageTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof PackageTypesApi.create, - { data: PackageTypesModels.CreatePackageTypeRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PackageTypesAcl.canUsePaginate()); + return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PackageTypesAcl.canUseCreate()); - return PackageTypesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useCreate` + * @summary Create a new Package Type + * @permission Requires `canUseCreate` ability + * @param { PackageTypesModels.CreatePackageTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `usePaginateLabels` - * @summary Paginate package type labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: PackageTypesModels.PackageTypeLabelFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PackageTypesAcl.canUseCreate()); + return PackageTypesApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate package type labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PackageTypesAcl.canUsePaginateLabels()); + return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate package type labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: PackageTypesModels.PackageTypeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate package type labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` + * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PackageTypesAcl.canUsePaginateLabels()); + return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useFindById` - * @summary Get Package Type by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get Package Type by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PackageTypesAcl.canUseFindById()); + return PackageTypesApi.findById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PackageTypesAcl.canUseFindById()); - return PackageTypesApi.findById(id, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update Package Type + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PackageTypesModels.UpdatePackageTypeRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update Package Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PackageTypesModels.UpdatePackageTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof PackageTypesApi.update, - { id: string; data: PackageTypesModels.UpdatePackageTypeRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PackageTypesAcl.canUseUpdate()); + return PackageTypesApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PackageTypesAcl.canUseUpdate()); - return PackageTypesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive Package Type + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive Package Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PackageTypesAcl.canUseArchive()); + return PackageTypesApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PackageTypesAcl.canUseArchive()); - return PackageTypesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive Package Type + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive Package Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PackageTypesAcl.canUseUnarchive()); + return PackageTypesApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PackageTypesAcl.canUseUnarchive()); - return PackageTypesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/partnerNetworks/partnerNetworks.acl.ts b/test/generated/base/partnerNetworks/partnerNetworks.acl.ts index ff36863..b56d576 100644 --- a/test/generated/base/partnerNetworks/partnerNetworks.acl.ts +++ b/test/generated/base/partnerNetworks/partnerNetworks.acl.ts @@ -1,45 +1,74 @@ import { AbilityTuple } from "@casl/ability"; export namespace PartnerNetworksAcl { - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "PartnerNetwork"] as AbilityTuple<"Create", "PartnerNetwork">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "PartnerNetwork"] as AbilityTuple<"Update", "PartnerNetwork">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "PartnerNetwork"] as AbilityTuple<"Archive", "PartnerNetwork">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "PartnerNetwork"] as AbilityTuple<"Archive", "PartnerNetwork">; +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "PartnerNetwork" +] as AbilityTuple<"Read", "PartnerNetwork">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "PartnerNetwork" +] as AbilityTuple<"Read", "PartnerNetwork">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "PartnerNetwork" +] as AbilityTuple<"Create", "PartnerNetwork">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "PartnerNetwork" +] as AbilityTuple<"Read", "PartnerNetwork">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "PartnerNetwork" +] as AbilityTuple<"Update", "PartnerNetwork">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "PartnerNetwork" +] as AbilityTuple<"Archive", "PartnerNetwork">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "PartnerNetwork" +] as AbilityTuple<"Archive", "PartnerNetwork">; + } diff --git a/test/generated/base/partnerNetworks/partnerNetworks.api.ts b/test/generated/base/partnerNetworks/partnerNetworks.api.ts index 075c13e..2c6a4bf 100644 --- a/test/generated/base/partnerNetworks/partnerNetworks.api.ts +++ b/test/generated/base/partnerNetworks/partnerNetworks.api.ts @@ -1,135 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PartnerNetworksModels } from "./partnerNetworks.models"; export namespace PartnerNetworksApi { - export const paginateLabels = ( - limit: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginateLabels = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, - `/partner-networks/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const paginate = ( - limit: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, + `/partner-networks/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, - `/partner-networks`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, + `/partner-networks`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, ) => { return AppRestClient.post( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks`, - ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), - config, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks`, + ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), + + ) +}; +export const findById = (id: string, ) => { return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}`, - config, - ); - }; - - export const update = ( - id: string, - data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}`, + + ) +}; +export const update = (id: string, data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, ) => { return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}`, - ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}`, + ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, ) => { return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, + `/partner-networks/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/partnerNetworks/partnerNetworks.configs.ts b/test/generated/base/partnerNetworks/partnerNetworks.configs.ts index 1f87ddf..b9d6545 100644 --- a/test/generated/base/partnerNetworks/partnerNetworks.configs.ts +++ b/test/generated/base/partnerNetworks/partnerNetworks.configs.ts @@ -6,108 +6,109 @@ import { PartnerNetworksQueries } from "./partnerNetworks.queries"; import { PartnerNetworksAcl } from "./partnerNetworks.acl"; export namespace PartnerNetworksConfigs { - export const partnerNetworksConfig = { +export const partnerNetworksConfig = { meta: { - title: "Partner Networks", + title: "Partner Networks", }, readAll: { - acl: PartnerNetworksAcl.canUsePaginate, - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - paginated: PartnerNetworksQueries.usePaginate, - infinite: PartnerNetworksQueries.usePaginateInfinite, - filters: { - schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: PartnerNetworksAcl.canUsePaginate, schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema, + paginated: PartnerNetworksQueries.usePaginate, + infinite: PartnerNetworksQueries.usePaginateInfinite, + filters: { + schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: PartnerNetworksAcl.canUseFindById, - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - query: PartnerNetworksQueries.useFindById, + acl: PartnerNetworksAcl.canUseFindById, + schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, + query: PartnerNetworksQueries.useFindById, }, create: { - acl: PartnerNetworksAcl.canUseCreate, - schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, - mutation: PartnerNetworksQueries.useCreate, - inputDefs: dynamicInputs({ + acl: PartnerNetworksAcl.canUseCreate, schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), + mutation: PartnerNetworksQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) }, update: { - acl: PartnerNetworksAcl.canUseUpdate, - schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, - mutation: PartnerNetworksQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: PartnerNetworksAcl.canUseUpdate, schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), + mutation: PartnerNetworksQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) }, - }; +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: PartnerNetworksAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PartnerNetworksQueries.usePaginateLabels, - infinite: PartnerNetworksQueries.usePaginateLabelsInfinite, - filters: { - schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: PartnerNetworksAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema, + paginated: PartnerNetworksQueries.usePaginateLabels, + infinite: PartnerNetworksQueries.usePaginateLabelsInfinite, + filters: { + schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/partnerNetworks/partnerNetworks.models.ts b/test/generated/base/partnerNetworks/partnerNetworks.models.ts index 694c1ed..55c49ce 100644 --- a/test/generated/base/partnerNetworks/partnerNetworks.models.ts +++ b/test/generated/base/partnerNetworks/partnerNetworks.models.ts @@ -2,141 +2,104 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace PartnerNetworksModels { - /** - * PartnerNetworkEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type PartnerNetworkEmployeeDTO = z.infer; +/** + * PartnerNetworkEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type PartnerNetworkEmployeeDTO = z.infer; - /** - * PartnerNetworkResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the partner network - * @property { string } name Name of the partner network - * @property { boolean } archived Whether the partner network is archived - * @property { string } createdById - * @property { PartnerNetworkEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PartnerNetworkEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const PartnerNetworkResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the partner network"), - name: z.string().describe("Name of the partner network"), - archived: z.boolean().describe("Whether the partner network is archived"), - createdById: z.string().nullish(), - createdBy: PartnerNetworkEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: PartnerNetworkEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type PartnerNetworkResponseDTO = z.infer; +/** + * PartnerNetworkResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the partner network + * @property { string } name Name of the partner network + * @property { boolean } archived Whether the partner network is archived + * @property { string } createdById + * @property { PartnerNetworkEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PartnerNetworkEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const PartnerNetworkResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: PartnerNetworkEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PartnerNetworkEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type PartnerNetworkResponseDTO = z.infer; - /** - * PartnerNetworkLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const PartnerNetworkLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type PartnerNetworkLabelFilterDto = z.infer; +/** + * PartnerNetworkLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const PartnerNetworkLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type PartnerNetworkLabelFilterDto = z.infer; - /** - * PartnerNetworkPaginationFilterDtoSchema - * @type { object } - * @property { string } search Free search - * @property { boolean } archived - */ - export const PartnerNetworkPaginationFilterDtoSchema = z - .object({ search: z.string().describe("Free search"), archived: z.boolean() }) - .readonly(); - export type PartnerNetworkPaginationFilterDto = z.infer; +/** + * PartnerNetworkPaginationFilterDtoSchema + * @type { object } + * @property { string } search Free search + * @property { boolean } archived + */ +export const PartnerNetworkPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); +export type PartnerNetworkPaginationFilterDto = z.infer; - /** - * CreatePartnerNetworkRequestDTOSchema - * @type { object } - * @property { string } name Name of the partner network - */ - export const CreatePartnerNetworkRequestDTOSchema = z - .object({ name: z.string().describe("Name of the partner network") }) - .readonly(); - export type CreatePartnerNetworkRequestDTO = z.infer; +/** + * CreatePartnerNetworkRequestDTOSchema + * @type { object } + * @property { string } name Name of the partner network + */ +export const CreatePartnerNetworkRequestDTOSchema = z.object({ name: z.string() }); +export type CreatePartnerNetworkRequestDTO = z.infer; - /** - * UpdatePartnerNetworkRequestDTOSchema - * @type { object } - * @property { string } name Name of the partner network - */ - export const UpdatePartnerNetworkRequestDTOSchema = z - .object({ name: z.string().describe("Name of the partner network") }) - .readonly(); - export type UpdatePartnerNetworkRequestDTO = z.infer; +/** + * UpdatePartnerNetworkRequestDTOSchema + * @type { object } + * @property { string } name Name of the partner network + */ +export const UpdatePartnerNetworkRequestDTOSchema = z.object({ name: z.string().nullable() }).partial(); +export type UpdatePartnerNetworkRequestDTO = z.infer; - /** - * PartnerNetworksPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PartnerNetworksPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PartnerNetworksPaginateLabelsOrderParamEnum = z.infer< - typeof PartnerNetworksPaginateLabelsOrderParamEnumSchema - >; - export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPaginateLabelsOrderParamEnumSchema.enum; +/** + * PartnerNetworksPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PartnerNetworksPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PartnerNetworksPaginateLabelsOrderParamEnum = z.infer; +export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPaginateLabelsOrderParamEnumSchema.enum; - /** - * PartnerNetworksPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PartnerNetworksPaginateLabelsResponse = z.infer; +/** + * PartnerNetworksPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type PartnerNetworksPaginateLabelsResponse = z.infer; - /** - * PartnerNetworksPaginateOrderParamEnumSchema - * @type { enum } - */ - export const PartnerNetworksPaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PartnerNetworksPaginateOrderParamEnum = z.infer; - export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrderParamEnumSchema.enum; +/** + * PartnerNetworksPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PartnerNetworksPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PartnerNetworksPaginateOrderParamEnum = z.infer; +export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrderParamEnumSchema.enum; + +/** + * PartnerNetworksPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PartnerNetworkResponseDTO[] } items + */ +export const PartnerNetworksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).nullable() }).partial().shape }); +export type PartnerNetworksPaginateResponse = z.infer; - /** - * PartnerNetworksPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerNetworkResponseDTO[] } items - */ - export const PartnerNetworksPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PartnerNetworksPaginateResponse = z.infer; } diff --git a/test/generated/base/partnerNetworks/partnerNetworks.queries.ts b/test/generated/base/partnerNetworks/partnerNetworks.queries.ts index cd0e2ae..75ec4c5 100644 --- a/test/generated/base/partnerNetworks/partnerNetworks.queries.ts +++ b/test/generated/base/partnerNetworks/partnerNetworks.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,362 +8,257 @@ import { PartnerNetworksModels } from "./partnerNetworks.models"; import { PartnerNetworksApi } from "./partnerNetworks.api"; export namespace PartnerNetworksQueries { - export const moduleName = QueryModule.PartnerNetworks; +export const moduleName = QueryModule.PartnerNetworks; - export const keys = { +export const keys = { all: [moduleName] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/partner-networks/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/partner-networks/labels/paginate", "infinite", limit, order, filter, cursor] as const, - paginate: ( - limit?: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/partner-networks", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/partner-networks", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string) => [...keys.all, "/partner-networks", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/partner-networks/:id", id] as const, - }; +}; - /** - * Query `usePaginateLabels` - * @summary Paginate partner networks with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate partner networks with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); + return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate partner networks with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate partner networks with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginate` - * @summary Paginate Partner Networks - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto; - page?: number; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); + return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginate` + * @summary Paginate Partner Networks + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUsePaginate()); + return PartnerNetworksApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Partner Networks - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { - limit: number; - order?: string; - filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Partner Networks + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PartnerNetworksAcl.canUsePaginate()); + return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Mutation `useCreate` - * @summary Create a new Partner Network - * @permission Requires `canUseCreate` ability - * @param { PartnerNetworksModels.CreatePartnerNetworkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof PartnerNetworksApi.create, - { data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create a new Partner Network + * @permission Requires `canUseCreate` ability + * @param { PartnerNetworksModels.CreatePartnerNetworkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PartnerNetworksAcl.canUseCreate()); - return PartnerNetworksApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PartnerNetworksAcl.canUseCreate()); + return PartnerNetworksApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useFindById` - * @summary Get Partner Network by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get Partner Network by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PartnerNetworksAcl.canUseFindById()); + return PartnerNetworksApi.findById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUseFindById()); - return PartnerNetworksApi.findById(id, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update Partner Network + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update Partner Network - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof PartnerNetworksApi.update, - { id: string; data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PartnerNetworksAcl.canUseUpdate()); + return PartnerNetworksApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PartnerNetworksAcl.canUseUpdate()); - return PartnerNetworksApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive Partner Network + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive Partner Network - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PartnerNetworksAcl.canUseArchive()); + return PartnerNetworksApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PartnerNetworksAcl.canUseArchive()); - return PartnerNetworksApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive Partner Network + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive Partner Network - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(PartnerNetworksAcl.canUseUnarchive()); + return PartnerNetworksApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PartnerNetworksAcl.canUseUnarchive()); - return PartnerNetworksApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts index 972a857..2ede29d 100644 --- a/test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts +++ b/test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts @@ -1,39 +1,43 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace PaymentConfirmationsAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read payment confirmation items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read payment confirmation items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate payment confirmation document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ - export const canUseGenerate = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate payment confirmation document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; + +/** + * Use for `useGetEml` mutation ability. For global ability, omit the object parameter. + * @description Download payment confirmation as EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetEml` mutation + */ +export const canUseGetEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionInvoice", object) : "PositionInvoice" +] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - /** - * Use for `useGetEml` mutation ability. For global ability, omit the object parameter. - * @description Download payment confirmation as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetEml` mutation - */ - export const canUseGetEml = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; } diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.api.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.api.ts index f91b0f7..dd56bcd 100644 --- a/test/generated/base/paymentConfirmations/paymentConfirmations.api.ts +++ b/test/generated/base/paymentConfirmations/paymentConfirmations.api.ts @@ -1,88 +1,50 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; export namespace PaymentConfirmationsApi { - export const get = ( - officeId: string, - filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, - limit: number, - order?: string, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const get = (officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, - `/offices/${officeId}/payment-confirmations`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const generate = ( - officeId: string, - data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, + `/offices/${officeId}/payment-confirmations`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const generate = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payment-confirmations/generate`, - ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const getEml = ( - officeId: string, - data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payment-confirmations/generate`, + ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getEml = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payment-confirmations/eml`, - ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/payment-confirmations/eml`, + ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; } diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts index 79c3145..af0fe49 100644 --- a/test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts +++ b/test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts @@ -5,44 +5,45 @@ import { PaymentConfirmationsQueries } from "./paymentConfirmations.queries"; import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; export namespace PaymentConfirmationsConfigs { - export const paymentConfirmationsConfig = { +export const paymentConfirmationsConfig = { meta: { - title: "Payment Confirmations", + title: "Payment Confirmations", }, readAll: { - acl: PaymentConfirmationsAcl.canUseGet, - schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, - paginated: PaymentConfirmationsQueries.useGet, - infinite: PaymentConfirmationsQueries.useGetInfinite, - filters: { - schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, - options: { - inputs: { - businessPartnerId: true, - paymentDate: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: PaymentConfirmationsAcl.canUseGet, schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, - options: { - columns: { - invoiceId: true, - invoiceNumber: true, - invoiceDate: true, - invoiceAmount: true, - amount: true, - currencyNotation: true, - reference: true, - position: true, - paymentDate: true, - }, - sortable: PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema, + paginated: PaymentConfirmationsQueries.useGet, + infinite: PaymentConfirmationsQueries.useGetInfinite, + filters: { + schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, + options: { + inputs: { + businessPartnerId: true, + paymentDate: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, + options: { + columns: { + invoiceId: true, + invoiceNumber: true, + invoiceDate: true, + invoiceAmount: true, + amount: true, + currencyNotation: true, + reference: true, + position: true, + paymentDate: true, + }, + sortable: PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema, + }, +}), }, - }; +}; + } diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.models.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.models.ts index f7c4296..bdab7a3 100644 --- a/test/generated/base/paymentConfirmations/paymentConfirmations.models.ts +++ b/test/generated/base/paymentConfirmations/paymentConfirmations.models.ts @@ -2,94 +2,69 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace PaymentConfirmationsModels { - /** - * PaymentConfirmationPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ - export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); - export type PaymentConfirmationPositionDto = z.infer; +/** + * PaymentConfirmationPositionDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + */ +export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }); +export type PaymentConfirmationPositionDto = z.infer; - /** - * PaymentConfirmationItemDtoSchema - * @type { object } - * @property { string } invoiceId Invoice ID - * @property { string } invoiceNumber Invoice number - * @property { string } invoiceDate Invoice date - * @property { number } invoiceAmount Invoice amount - * @property { number } amount Payment amount - * @property { string } currencyNotation Currency notation - * @property { string } reference Reference - * @property { PaymentConfirmationPositionDto } position Position information - * @property { string } paymentDate Payment date - */ - export const PaymentConfirmationItemDtoSchema = z - .object({ - invoiceId: z.string().describe("Invoice ID"), - invoiceNumber: z.string().describe("Invoice number"), - invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date"), - invoiceAmount: z.number().describe("Invoice amount"), - amount: z.number().describe("Payment amount"), - currencyNotation: z.string().describe("Currency notation"), - reference: z.string().describe("Reference").nullish(), - position: PaymentConfirmationPositionDtoSchema.describe("Position information"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), - }) - .readonly(); - export type PaymentConfirmationItemDto = z.infer; +/** + * PaymentConfirmationItemDtoSchema + * @type { object } + * @property { string } invoiceId Invoice ID + * @property { string } invoiceNumber Invoice number + * @property { string } invoiceDate Invoice date + * @property { number } invoiceAmount Invoice amount + * @property { number } amount Payment amount + * @property { string } currencyNotation Currency notation + * @property { string } reference Reference + * @property { PaymentConfirmationPositionDto } position Position information + * @property { string } paymentDate Payment date + */ +export const PaymentConfirmationItemDtoSchema = z.object({ invoiceId: z.string(), invoiceNumber: z.string(), invoiceDate: z.iso.datetime({ offset: true }), invoiceAmount: z.number(), amount: z.number(), currencyNotation: z.string(), reference: z.string().nullish(), position: PaymentConfirmationPositionDtoSchema, paymentDate: z.iso.datetime({ offset: true }) }); +export type PaymentConfirmationItemDto = z.infer; - /** - * PaymentConfirmationItemFilterDtoSchema - * @type { object } - * @property { string } businessPartnerId Business partner ID - * @property { string } paymentDate Payment date - */ - export const PaymentConfirmationItemFilterDtoSchema = z - .object({ - businessPartnerId: z.string().describe("Business partner ID"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), - }) - .readonly(); - export type PaymentConfirmationItemFilterDto = z.infer; +/** + * PaymentConfirmationItemFilterDtoSchema + * @type { object } + * @property { string } businessPartnerId Business partner ID + * @property { string } paymentDate Payment date + */ +export const PaymentConfirmationItemFilterDtoSchema = z.object({ businessPartnerId: z.string(), paymentDate: z.iso.datetime({ offset: true }) }); +export type PaymentConfirmationItemFilterDto = z.infer; - /** - * GeneratePaymentConfirmationRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId Business partner ID - * @property { string } paymentDate Payment date - * @property { string } positionId Position ID (optional) - */ - export const GeneratePaymentConfirmationRequestDtoSchema = z - .object({ - businessPartnerId: z.string().describe("Business partner ID"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), - positionId: z.string().describe("Position ID (optional)").nullish(), - }) - .readonly(); - export type GeneratePaymentConfirmationRequestDto = z.infer; +/** + * GeneratePaymentConfirmationRequestDtoSchema + * @type { object } + * @property { string } businessPartnerId Business partner ID + * @property { string } paymentDate Payment date + * @property { string } positionId Position ID (optional) + */ +export const GeneratePaymentConfirmationRequestDtoSchema = z.object({ businessPartnerId: z.string(), paymentDate: z.iso.datetime({ offset: true }), positionId: z.string().nullish() }); +export type GeneratePaymentConfirmationRequestDto = z.infer; - /** - * PaymentConfirmationsGetOrderParamEnumSchema - * @type { enum } - */ - export const PaymentConfirmationsGetOrderParamEnumSchema = z.enum(["paymentDate", "invoiceNumber", "amount"]); - export type PaymentConfirmationsGetOrderParamEnum = z.infer; - export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrderParamEnumSchema.enum; +/** + * PaymentConfirmationsGetOrderParamEnumSchema + * @type { enum } + */ +export const PaymentConfirmationsGetOrderParamEnumSchema = z.enum(["paymentDate", "invoiceNumber", "amount"]); +export type PaymentConfirmationsGetOrderParamEnum = z.infer; +export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrderParamEnumSchema.enum; + +/** + * PaymentConfirmationsGetResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PaymentConfirmationItemDto[] } items + */ +export const PaymentConfirmationsGetResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).nullable() }).partial().shape }); +export type PaymentConfirmationsGetResponse = z.infer; - /** - * PaymentConfirmationsGetResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PaymentConfirmationItemDto[] } items - */ - export const PaymentConfirmationsGetResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).readonly() }).readonly().shape, - }); - export type PaymentConfirmationsGetResponse = z.infer; } diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts index 265dcc4..c780317 100644 --- a/test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts +++ b/test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,196 +8,123 @@ import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; import { PaymentConfirmationsApi } from "./paymentConfirmations.api"; export namespace PaymentConfirmationsQueries { - export const moduleName = QueryModule.PaymentConfirmations; +export const moduleName = QueryModule.PaymentConfirmations; - export const keys = { +export const keys = { all: [moduleName] as const, - get: ( - officeId: string, - filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, - limit?: number, - order?: string, - page?: number, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/payment-confirmations", officeId, filter, limit, order, page, cursor] as const, - getInfinite: ( - officeId: string, - filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, - limit?: number, - order?: string, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/payment-confirmations", - "infinite", - officeId, - filter, - limit, - order, - cursor, - ] as const, - }; + get: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", officeId, filter, limit, order, page, cursor] as const, + getInfinite: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", "infinite", officeId, filter, limit, order, cursor] as const, +}; - /** - * Query `useGet` - * @summary Get payment confirmation items - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { - officeId, - filter, - limit, - order, - page, - cursor, - }: { - officeId: string; - filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto; - limit: number; - order?: string; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGet` + * @summary Get payment confirmation items + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, filter, limit, order, page, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, filter, limit, order, page, cursor), + queryFn: () => { + checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); + return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.get(officeId, filter, limit, order, page, cursor), - queryFn: () => { - checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId })); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useGetInfinite + * @summary Get payment confirmation items + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useGetInfinite = ({ officeId, filter, limit, order, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useGetInfinite - * @summary Get payment confirmation items - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useGetInfinite = ( - { - officeId, - filter, - limit, - order, - cursor, - }: { - officeId: string; - filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto; - limit: number; - order?: string; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); + return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId })); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Mutation `useGenerate` - recommended when file should not be cached + * @summary Generate payment confirmation PDF + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useGenerate` - recommended when file should not be cached - * @summary Generate payment confirmation PDF - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useGenerate = ( - options?: AppMutationOptions< - typeof PaymentConfirmationsApi.generate, - { officeId: string; data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId } )); + return PaymentConfirmationsApi.generate(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId })); - return PaymentConfirmationsApi.generate(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useGetEml` - recommended when file should not be cached + * @summary Get payment confirmation as EML file with PDF attachment + * @permission Requires `canUseGetEml` ability + * @param { string } mutation.officeId Path parameter + * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useGetEml` - recommended when file should not be cached - * @summary Get payment confirmation as EML file with PDF attachment - * @permission Requires `canUseGetEml` ability - * @param { string } mutation.officeId Path parameter - * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useGetEml = ( - options?: AppMutationOptions< - typeof PaymentConfirmationsApi.getEml, - { officeId: string; data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId } )); + return PaymentConfirmationsApi.getEml(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId })); - return PaymentConfirmationsApi.getEml(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/ports/ports.acl.ts b/test/generated/base/ports/ports.acl.ts index 41bc6d7..9332110 100644 --- a/test/generated/base/ports/ports.acl.ts +++ b/test/generated/base/ports/ports.acl.ts @@ -1,33 +1,54 @@ import { AbilityTuple } from "@casl/ability"; export namespace PortsAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Port" +] as AbilityTuple<"Read", "Port">; - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Port"] as AbilityTuple<"Create", "Port">; +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Port" +] as AbilityTuple<"Create", "Port">; - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Port" +] as AbilityTuple<"Read", "Port">; - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Port"] as AbilityTuple<"Update", "Port">; +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Port" +] as AbilityTuple<"Update", "Port">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Port" +] as AbilityTuple<"Read", "Port">; - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; } diff --git a/test/generated/base/ports/ports.api.ts b/test/generated/base/ports/ports.api.ts index 86eba5f..bc62d36 100644 --- a/test/generated/base/ports/ports.api.ts +++ b/test/generated/base/ports/ports.api.ts @@ -1,100 +1,60 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PortsModels } from "./ports.models"; export namespace PortsApi { - export const paginate = ( - limit: number, - order?: string, - filter?: PortsModels.PortPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: PortsModels.PortsPaginateResponseSchema }, `/ports`, { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { - type: "query", - name: "order", - }), - filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: PortsModels.CreatePortRequestDTO, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: PortsModels.PortsPaginateResponseSchema }, + `/ports`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: PortsModels.CreatePortRequestDTO, ) => { return AppRestClient.post( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports`, - ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), - config, - ); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: PortsModels.PortLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, `/ports/labels/paginate`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports`, + ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), + + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, + `/ports/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, ) => { return AppRestClient.patch( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports/${id}`, - ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), - config, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: PortsModels.PortResponseDTOSchema }, `/ports/${id}`, config); - }; + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports/${id}`, + ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), + + ) +}; +export const findById = (id: string, ) => { + return AppRestClient.get( + { resSchema: PortsModels.PortResponseDTOSchema }, + `/ports/${id}`, + + ) +}; } diff --git a/test/generated/base/ports/ports.configs.ts b/test/generated/base/ports/ports.configs.ts index de7e09d..33adfc6 100644 --- a/test/generated/base/ports/ports.configs.ts +++ b/test/generated/base/ports/ports.configs.ts @@ -6,122 +6,123 @@ import { PortsQueries } from "./ports.queries"; import { PortsAcl } from "./ports.acl"; export namespace PortsConfigs { - export const portsConfig = { +export const portsConfig = { meta: { - title: "Ports", + title: "Ports", }, readAll: { - acl: PortsAcl.canUsePaginate, - schema: PortsModels.PortResponseDTOSchema, - paginated: PortsQueries.usePaginate, - infinite: PortsQueries.usePaginateInfinite, - filters: { - schema: PortsModels.PortPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PortsModels.PortPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: PortsAcl.canUsePaginate, schema: PortsModels.PortResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - address: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PortsModels.PortsPaginateOrderParamEnumSchema, + paginated: PortsQueries.usePaginate, + infinite: PortsQueries.usePaginateInfinite, + filters: { + schema: PortsModels.PortPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PortsModels.PortPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: PortsModels.PortResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + matchCode: true, + address: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: PortsModels.PortsPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: PortsAcl.canUseFindById, - schema: PortsModels.PortResponseDTOSchema, - query: PortsQueries.useFindById, + acl: PortsAcl.canUseFindById, + schema: PortsModels.PortResponseDTOSchema, + query: PortsQueries.useFindById, }, create: { - acl: PortsAcl.canUseCreate, - schema: PortsModels.CreatePortRequestDTOSchema, - mutation: PortsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: PortsAcl.canUseCreate, schema: PortsModels.CreatePortRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, - }), + mutation: PortsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PortsModels.CreatePortRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) }, update: { - acl: PortsAcl.canUseUpdate, - schema: PortsModels.UpdatePortRequestDTOSchema, - mutation: PortsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: PortsAcl.canUseUpdate, schema: PortsModels.UpdatePortRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, - }), + mutation: PortsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PortsModels.UpdatePortRequestDTOSchema, + options: { + inputs: { + name: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) }, - }; +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: PortsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PortsQueries.usePaginateLabels, - infinite: PortsQueries.usePaginateLabelsInfinite, - filters: { - schema: PortsModels.PortLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PortsModels.PortLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: PortsAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PortsModels.PortsPaginateLabelsOrderParamEnumSchema, + paginated: PortsQueries.usePaginateLabels, + infinite: PortsQueries.usePaginateLabelsInfinite, + filters: { + schema: PortsModels.PortLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PortsModels.PortLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: PortsModels.PortsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/ports/ports.models.ts b/test/generated/base/ports/ports.models.ts index caec629..6958ed9 100644 --- a/test/generated/base/ports/ports.models.ts +++ b/test/generated/base/ports/ports.models.ts @@ -2,216 +2,150 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace PortsModels { - /** - * PortCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type PortCityDto = z.infer; +/** + * PortCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type PortCityDto = z.infer; - /** - * PortCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ - export const PortCountryDtoSchema = z - .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) - .readonly(); - export type PortCountryDto = z.infer; +/** + * PortCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const PortCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); +export type PortCountryDto = z.infer; - /** - * PortAddressDtoSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { PortCityDto } city - * @property { string } district District name - * @property { PortCountryDto } country - */ - export const PortAddressDtoSchema = z - .object({ - street: z.string().describe("Street address"), - zip: z.string().describe("ZIP/Postal code"), - city: PortCityDtoSchema.nullish(), - district: z.string().describe("District name").nullish(), - country: PortCountryDtoSchema.nullish(), - }) - .readonly(); - export type PortAddressDto = z.infer; +/** + * PortAddressDtoSchema + * @type { object } + * @property { string } street Street address + * @property { string } zip ZIP/Postal code + * @property { PortCityDto } city + * @property { string } district District name + * @property { PortCountryDto } country + */ +export const PortAddressDtoSchema = z.object({ street: z.string(), zip: z.string(), city: PortCityDtoSchema.nullish(), district: z.string().nullish(), country: PortCountryDtoSchema.nullish() }); +export type PortAddressDto = z.infer; - /** - * PortEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type PortEmployeeDTO = z.infer; +/** + * PortEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type PortEmployeeDTO = z.infer; - /** - * PortResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the port - * @property { string } name Name of the port - * @property { string } matchCode Match code for the port - * @property { PortAddressDto } address Address details of the port - * @property { string } createdById - * @property { PortEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PortEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const PortResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the port"), - name: z.string().describe("Name of the port"), - matchCode: z.string().describe("Match code for the port"), - address: PortAddressDtoSchema.describe("Address details of the port"), - createdById: z.string().nullish(), - createdBy: PortEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: PortEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type PortResponseDTO = z.infer; +/** + * PortResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the port + * @property { string } name Name of the port + * @property { string } matchCode Match code for the port + * @property { PortAddressDto } address Address details of the port + * @property { string } createdById + * @property { PortEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { PortEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const PortResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), address: PortAddressDtoSchema, createdById: z.string().nullish(), createdBy: PortEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PortEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type PortResponseDTO = z.infer; - /** - * PortPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter ports by name or match code - */ - export const PortPaginationFilterDtoSchema = z - .object({ search: z.string().describe("Search term to filter ports by name or match code") }) - .readonly(); - export type PortPaginationFilterDto = z.infer; +/** + * PortPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter ports by name or match code + */ +export const PortPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type PortPaginationFilterDto = z.infer; - /** - * PortLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const PortLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type PortLabelFilterDto = z.infer; +/** + * PortLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const PortLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type PortLabelFilterDto = z.infer; - /** - * CreatePortRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } matchCode - * @property { string } street Street address - * @property { string } secondaryStreet - * @property { string } zip ZIP / Postal code - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } district - */ - export const CreatePortRequestDTOSchema = z - .object({ - name: z.string(), - matchCode: z.string(), - street: z.string().describe("Street address"), - secondaryStreet: z.string().nullish(), - zip: z.string().describe("ZIP / Postal code"), - cityId: z.string().describe("City id"), - countryId: z.string().describe("Country id"), - district: z.string().nullish(), - }) - .readonly(); - export type CreatePortRequestDTO = z.infer; +/** + * CreatePortRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } matchCode + * @property { string } street Street address + * @property { string } secondaryStreet + * @property { string } zip ZIP / Postal code + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } district + */ +export const CreatePortRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string().nullish() }); +export type CreatePortRequestDTO = z.infer; - /** - * UpdatePortRequestDTOSchema - * @type { object } - * @property { string } name Updated name - * @property { string } matchCode Updated match code - * @property { string } street Updated street address - * @property { string } secondaryStreet Updated secondary street - * @property { string } zip Updated ZIP/Postal code - * @property { string } cityId Updated city id - * @property { string } countryId Updated country id - * @property { string } district - */ - export const UpdatePortRequestDTOSchema = z - .object({ - name: z.string().describe("Updated name"), - matchCode: z.string().describe("Updated match code"), - street: z.string().describe("Updated street address"), - secondaryStreet: z.string().describe("Updated secondary street"), - zip: z.string().describe("Updated ZIP/Postal code"), - cityId: z.string().describe("Updated city id"), - countryId: z.string().describe("Updated country id"), - district: z.string(), - }) - .readonly(); - export type UpdatePortRequestDTO = z.infer; +/** + * UpdatePortRequestDTOSchema + * @type { object } + * @property { string } name Updated name + * @property { string } matchCode Updated match code + * @property { string } street Updated street address + * @property { string } secondaryStreet Updated secondary street + * @property { string } zip Updated ZIP/Postal code + * @property { string } cityId Updated city id + * @property { string } countryId Updated country id + * @property { string } district + */ +export const UpdatePortRequestDTOSchema = z.object({ name: z.string().nullable(), matchCode: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable() }).partial(); +export type UpdatePortRequestDTO = z.infer; - /** - * PortsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const PortsPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PortsPaginateOrderParamEnum = z.infer; - export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enum; +/** + * PortsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PortsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PortsPaginateOrderParamEnum = z.infer; +export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enum; - /** - * PortsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PortResponseDTO[] } items - */ - export const PortsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PortResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PortsPaginateResponse = z.infer; +/** + * PortsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PortResponseDTO[] } items + */ +export const PortsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PortResponseDTOSchema).nullable() }).partial().shape }); +export type PortsPaginateResponse = z.infer; - /** - * PortsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PortsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PortsPaginateLabelsOrderParamEnum = z.infer; - export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEnumSchema.enum; +/** + * PortsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PortsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PortsPaginateLabelsOrderParamEnum = z.infer; +export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * PortsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PortsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type PortsPaginateLabelsResponse = z.infer; - /** - * PortsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PortsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PortsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/ports/ports.queries.ts b/test/generated/base/ports/ports.queries.ts index 41a7842..7a034d1 100644 --- a/test/generated/base/ports/ports.queries.ts +++ b/test/generated/base/ports/ports.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,273 +8,201 @@ import { PortsModels } from "./ports.models"; import { PortsApi } from "./ports.api"; export namespace PortsQueries { - export const moduleName = QueryModule.Ports; +export const moduleName = QueryModule.Ports; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: PortsModels.PortPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/ports", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string) => - [...keys.all, "/ports", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: PortsModels.PortLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/ports/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: PortsModels.PortLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/ports/labels/paginate", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string) => [...keys.all, "/ports", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string) => [...keys.all, "/ports/labels/paginate", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/ports/:id", id] as const, - }; +}; + +/** + * Query `usePaginate` + * @summary Paginate Ports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PortsAcl.canUsePaginate()); + return PortsApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Ports + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PortsAcl.canUsePaginate()); + return PortsApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create port + * @permission Requires `canUseCreate` ability + * @param { PortsModels.CreatePortRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(PortsAcl.canUseCreate()); + return PortsApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePaginateLabels` + * @summary Paginate ports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PortsAcl.canUsePaginateLabels()); + return PortsApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate ports with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PortsAcl.canUsePaginateLabels()); + return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update port + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { PortsModels.UpdatePortRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(PortsAcl.canUseUpdate()); + return PortsApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindById` + * @summary Get port by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(PortsAcl.canUseFindById()); + return PortsApi.findById(id) }, + ...options, + }); +}; - /** - * Query `usePaginate` - * @summary Paginate Ports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: PortsModels.PortPaginationFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Ports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: PortsModels.PortPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create port - * @permission Requires `canUseCreate` ability - * @param { PortsModels.CreatePortRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PortsAcl.canUseCreate()); - return PortsApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate ports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: PortsModels.PortLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate ports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: PortsModels.PortLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update port - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PortsModels.UpdatePortRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PortsAcl.canUseUpdate()); - return PortsApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get port by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PortsAcl.canUseFindById()); - return PortsApi.findById(id, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/positionAccount/positionAccount.acl.ts b/test/generated/base/positionAccount/positionAccount.acl.ts index b5691fd..f887d12 100644 --- a/test/generated/base/positionAccount/positionAccount.acl.ts +++ b/test/generated/base/positionAccount/positionAccount.acl.ts @@ -1,15 +1,17 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace PositionAccountAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Read", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + } diff --git a/test/generated/base/positionAccount/positionAccount.api.ts b/test/generated/base/positionAccount/positionAccount.api.ts index 817f5b6..b484a7e 100644 --- a/test/generated/base/positionAccount/positionAccount.api.ts +++ b/test/generated/base/positionAccount/positionAccount.api.ts @@ -1,13 +1,12 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { PositionAccountModels } from "./positionAccount.models"; export namespace PositionAccountApi { - export const get = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const get = (positionId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/account`, - config, - ); - }; + { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/account`, + + ) +}; } diff --git a/test/generated/base/positionAccount/positionAccount.models.ts b/test/generated/base/positionAccount/positionAccount.models.ts index c4b204a..3c1e98c 100644 --- a/test/generated/base/positionAccount/positionAccount.models.ts +++ b/test/generated/base/positionAccount/positionAccount.models.ts @@ -2,77 +2,51 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionAccountModels { - /** - * PositionAccountTotalsResponseDtoSchema - * @type { object } - * @property { number } totalBuyRates Total buy rates - * @property { number } totalSellRates Total sell rates - * @property { number } totalProfit Total profit - * @property { number } margin Margin percentage - * @property { number } displayAmount Display amount - * @property { string } displayCurrencyCode Display currency code - */ - export const PositionAccountTotalsResponseDtoSchema = z - .object({ - totalBuyRates: z.number().describe("Total buy rates"), - totalSellRates: z.number().describe("Total sell rates"), - totalProfit: z.number().describe("Total profit"), - margin: z.number().describe("Margin percentage").nullish(), - displayAmount: z.number().describe("Display amount"), - displayCurrencyCode: z.string().describe("Display currency code"), - }) - .readonly(); - export type PositionAccountTotalsResponseDto = z.infer; +/** + * PositionAccountTotalsResponseDtoSchema + * @type { object } + * @property { number } totalBuyRates Total buy rates + * @property { number } totalSellRates Total sell rates + * @property { number } totalProfit Total profit + * @property { number } margin Margin percentage + * @property { number } displayAmount Display amount + * @property { string } displayCurrencyCode Display currency code + */ +export const PositionAccountTotalsResponseDtoSchema = z.object({ totalBuyRates: z.number(), totalSellRates: z.number(), totalProfit: z.number(), margin: z.number().nullish(), displayAmount: z.number(), displayCurrencyCode: z.string() }); +export type PositionAccountTotalsResponseDto = z.infer; - /** - * PositionAccountMasterTotalsDtoSchema - * @type { object } - * @property { PositionAccountTotalsResponseDto } totals - * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency - */ - export const PositionAccountMasterTotalsDtoSchema = z - .object({ - totals: PositionAccountTotalsResponseDtoSchema, - totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), - }) - .readonly(); - export type PositionAccountMasterTotalsDto = z.infer; +/** + * PositionAccountMasterTotalsDtoSchema + * @type { object } + * @property { PositionAccountTotalsResponseDto } totals + * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency + */ +export const PositionAccountMasterTotalsDtoSchema = z.object({ totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema) }); +export type PositionAccountMasterTotalsDto = z.infer; - /** - * ChildPositionAccountReferenceDtoSchema - * @type { object } - * @property { string } positionId - * @property { string } positionNumber - * @property { string } accountId - */ - export const ChildPositionAccountReferenceDtoSchema = z - .object({ positionId: z.string().nullish(), positionNumber: z.string(), accountId: z.string() }) - .readonly(); - export type ChildPositionAccountReferenceDto = z.infer; +/** + * ChildPositionAccountReferenceDtoSchema + * @type { object } + * @property { string } positionId + * @property { string } positionNumber + * @property { string } accountId + */ +export const ChildPositionAccountReferenceDtoSchema = z.object({ positionId: z.string().nullish(), positionNumber: z.string(), accountId: z.string() }); +export type ChildPositionAccountReferenceDto = z.infer; + +/** + * PositionAccountResponseDtoSchema + * @type { object } + * @property { string } id Account ID + * @property { string } positionId Position ID + * @property { string } invoiceId Invoice ID + * @property { CommonModels.PositionAccountItemDtoResponse[] } items Account items + * @property { PositionAccountTotalsResponseDto } totals + * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency + * @property { PositionAccountMasterTotalsDto } masterTotals + * @property { ChildPositionAccountReferenceDto[] } childPositionAccounts + */ +export const PositionAccountResponseDtoSchema = z.object({ id: z.string(), positionId: z.string().nullish(), invoiceId: z.string().nullish(), items: z.array(CommonModels.PositionAccountItemDtoResponseSchema), totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema), masterTotals: PositionAccountMasterTotalsDtoSchema.nullish(), childPositionAccounts: z.array(ChildPositionAccountReferenceDtoSchema).nullish() }); +export type PositionAccountResponseDto = z.infer; - /** - * PositionAccountResponseDtoSchema - * @type { object } - * @property { string } id Account ID - * @property { string } positionId Position ID - * @property { string } invoiceId Invoice ID - * @property { CommonModels.PositionAccountItemDtoResponse[] } items Account items - * @property { PositionAccountTotalsResponseDto } totals - * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency - * @property { PositionAccountMasterTotalsDto } masterTotals - * @property { ChildPositionAccountReferenceDto[] } childPositionAccounts - */ - export const PositionAccountResponseDtoSchema = z - .object({ - id: z.string().describe("Account ID"), - positionId: z.string().describe("Position ID").nullish(), - invoiceId: z.string().describe("Invoice ID").nullish(), - items: z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly().describe("Account items"), - totals: PositionAccountTotalsResponseDtoSchema, - totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), - masterTotals: PositionAccountMasterTotalsDtoSchema.nullish(), - childPositionAccounts: z.array(ChildPositionAccountReferenceDtoSchema).readonly().nullish(), - }) - .readonly(); - export type PositionAccountResponseDto = z.infer; } diff --git a/test/generated/base/positionAccount/positionAccount.queries.ts b/test/generated/base/positionAccount/positionAccount.queries.ts index ed77533..c7d81b6 100644 --- a/test/generated/base/positionAccount/positionAccount.queries.ts +++ b/test/generated/base/positionAccount/positionAccount.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -7,38 +6,33 @@ import { AppQueryOptions } from "@povio/openapi-codegen-cli"; import { PositionAccountApi } from "./positionAccount.api"; export namespace PositionAccountQueries { - export const moduleName = QueryModule.PositionAccount; +export const moduleName = QueryModule.PositionAccount; - export const keys = { +export const keys = { all: [moduleName] as const, - get: (positionId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/account", positionId, officeId] as const, - }; + get: (positionId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account", positionId, officeId] as const, +}; - /** - * Query `useGet` - * @summary Get position account details - * @permission Requires `canUseGet` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { positionId, officeId }: { positionId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGet` + * @summary Get position account details + * @permission Requires `canUseGet` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ positionId, officeId }: { positionId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(positionId, officeId), + queryFn: () => { + checkAcl(PositionAccountAcl.canUseGet({ officeId } )); + return PositionAccountApi.get(positionId, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.get(positionId, officeId), - queryFn: () => { - checkAcl(PositionAccountAcl.canUseGet({ officeId })); - return PositionAccountApi.get(positionId, officeId, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/positionAccountItems/positionAccountItems.acl.ts b/test/generated/base/positionAccountItems/positionAccountItems.acl.ts index 8602826..8f2be12 100644 --- a/test/generated/base/positionAccountItems/positionAccountItems.acl.ts +++ b/test/generated/base/positionAccountItems/positionAccountItems.acl.ts @@ -1,75 +1,82 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace PositionAccountItemsAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Update", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - /** - * Use for `useDeletePositionAccountItems` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePositionAccountItems` mutation - */ - export const canUseDeletePositionAccountItems = (object?: { officeId: string }) => - ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Update", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; +/** + * Use for `useDeletePositionAccountItems` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePositionAccountItems` mutation + */ +export const canUseDeletePositionAccountItems = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Update", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - /** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ - export const canUseDuplicate = (object?: { officeId: string }) => - ["Duplicate", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Duplicate", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; +/** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ +export const canUseDuplicate = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - /** - * Use for `useReassign` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReassign` mutation - */ - export const canUseReassign = (object?: { officeId: string }) => - ["Reassign", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Reassign", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; +/** + * Use for `useReassign` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReassign` mutation + */ +export const canUseReassign = ( + object?: { officeId: string, } +) => [ + "Reassign", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useReorder` mutation ability. For global ability, omit the object parameter. + * @description Update positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation + */ +export const canUseReorder = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - /** - * Use for `useReorder` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation - */ - export const canUseReorder = (object?: { officeId: string }) => - ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Update", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; } diff --git a/test/generated/base/positionAccountItems/positionAccountItems.api.ts b/test/generated/base/positionAccountItems/positionAccountItems.api.ts index 5be80b9..fbc3532 100644 --- a/test/generated/base/positionAccountItems/positionAccountItems.api.ts +++ b/test/generated/base/positionAccountItems/positionAccountItems.api.ts @@ -1,92 +1,55 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PositionAccountItemsModels } from "./positionAccountItems.models"; export namespace PositionAccountItemsApi { - export const create = ( - positionId: string, - officeId: string, - data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, - config?: AxiosRequestConfig, - ) => { +export const create = (positionId: string, officeId: string, data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, ) => { return AppRestClient.post( - { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), - config, - ); - }; - - export const deletePositionAccountItems = ( - positionId: string, - officeId: string, - data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), + + ) +}; +export const deletePositionAccountItems = (positionId: string, officeId: string, data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), - config, - ); - }; - - export const update = ( - positionId: string, - officeId: string, - data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), + + ) +}; +export const update = (positionId: string, officeId: string, data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, ) => { return AppRestClient.patch( - { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), - config, - ); - }; - - export const duplicate = ( - positionId: string, - officeId: string, - data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items`, + ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), + + ) +}; +export const duplicate = (positionId: string, officeId: string, data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, ) => { return AppRestClient.post( - { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, - ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), - config, - ); - }; - - export const reassign = ( - positionId: string, - officeId: string, - data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, + ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), + + ) +}; +export const reassign = (positionId: string, officeId: string, data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, ) => { return AppRestClient.patch( - { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items/reassign`, - ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), - config, - ); - }; - - export const reorder = ( - positionId: string, - itemId: string, - officeId: string, - data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/items/reassign`, + ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), + + ) +}; +export const reorder = (positionId: string, itemId: string, officeId: string, data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, ) => { return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, - ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, + ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/positionAccountItems/positionAccountItems.models.ts b/test/generated/base/positionAccountItems/positionAccountItems.models.ts index 3d0aeb7..6bdc3fe 100644 --- a/test/generated/base/positionAccountItems/positionAccountItems.models.ts +++ b/test/generated/base/positionAccountItems/positionAccountItems.models.ts @@ -2,250 +2,166 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionAccountItemsModels { - /** - * CreatePositionChargeDataRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ - export const CreatePositionChargeDataRequestDtoSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID"), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().gte(1).describe("Quantity of the charge"), - buyRate: z.number().describe("Buy rate amount"), - buyCurrencyCode: z.string().describe("Buy rate currency code"), - buyVatRuleId: z.string().describe("Buy VAT rule ID"), - vendorId: z.string().describe("Vendor ID"), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), - sellRate: z.number().describe("Sell rate amount"), - sellCurrencyCode: z.string().describe("Sell rate currency code"), - sellVatRuleId: z.string().describe("Sell VAT rule ID"), - customerId: z.string().describe("Customer ID"), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), - }) - .readonly(); - export type CreatePositionChargeDataRequestDto = z.infer; - - /** - * CreatePositionTextDataRequestDtoSchema - * @type { object } - * @property { string } content Text content - */ - export const CreatePositionTextDataRequestDtoSchema = z - .object({ content: z.string().describe("Text content") }) - .readonly(); - export type CreatePositionTextDataRequestDto = z.infer; - - /** - * CreatePositionAccountItemRequestDtoSchema - * @type { object } - * @property { CommonModels.PositionAccountItemTypeEnum } type Item type - * @property { CreatePositionChargeDataRequestDto } charge Charge data if type is CHARGE - * @property { CreatePositionTextDataRequestDto } text Text data if type is TEXT - */ - export const CreatePositionAccountItemRequestDtoSchema = z - .object({ - type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), - charge: CreatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), - text: CreatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish(), - }) - .readonly(); - export type CreatePositionAccountItemRequestDto = z.infer; - - /** - * CreatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { CreatePositionAccountItemRequestDto[] } items Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER) - */ - export const CreatePositionAccountItemsRequestDtoSchema = z - .object({ - items: z - .array(CreatePositionAccountItemRequestDtoSchema) - .readonly() - .describe( - "Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER)", - ), - }) - .readonly(); - export type CreatePositionAccountItemsRequestDto = z.infer; - - /** - * UpdatePositionChargeDataRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ - export const UpdatePositionChargeDataRequestDtoSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID"), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().gte(1).describe("Quantity of the charge"), - buyRate: z.number().describe("Buy rate amount").nullable(), - buyCurrencyCode: z.string().describe("Buy rate currency code"), - buyVatRuleId: z.string().describe("Buy VAT rule ID"), - vendorId: z.string().describe("Vendor ID"), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), - sellRate: z.number().describe("Sell rate amount").nullable(), - sellCurrencyCode: z.string().describe("Sell rate currency code"), - sellVatRuleId: z.string().describe("Sell VAT rule ID"), - customerId: z.string().describe("Customer ID"), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), - }) - .readonly(); - export type UpdatePositionChargeDataRequestDto = z.infer; - - /** - * UpdatePositionTextDataRequestDtoSchema - * @type { object } - * @property { string } content Text content - */ - export const UpdatePositionTextDataRequestDtoSchema = z - .object({ content: z.string().describe("Text content") }) - .readonly(); - export type UpdatePositionTextDataRequestDto = z.infer; - - /** - * UpdatePositionAccountItemRequestDtoSchema - * @type { object } - * @property { CommonModels.PositionAccountItemTypeEnum } type Item type - * @property { UpdatePositionChargeDataRequestDto } charge Charge data if type is CHARGE - * @property { UpdatePositionTextDataRequestDto } text Text data if type is TEXT - */ - export const UpdatePositionAccountItemRequestDtoSchema = z - .object({ - type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), - charge: UpdatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), - text: UpdatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish(), - }) - .readonly(); - export type UpdatePositionAccountItemRequestDto = z.infer; - - /** - * UpdatePositionAccountItemWithIdRequestDtoSchema - * @type { object } - * @property { string } id ID of the item to update - * @property { UpdatePositionAccountItemRequestDto } data Data to update - */ - export const UpdatePositionAccountItemWithIdRequestDtoSchema = z - .object({ - id: z.string().describe("ID of the item to update"), - data: UpdatePositionAccountItemRequestDtoSchema.describe("Data to update"), - }) - .readonly(); - export type UpdatePositionAccountItemWithIdRequestDto = z.infer< - typeof UpdatePositionAccountItemWithIdRequestDtoSchema - >; - - /** - * UpdatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { UpdatePositionAccountItemWithIdRequestDto[] } items Array of items to update - */ - export const UpdatePositionAccountItemsRequestDtoSchema = z - .object({ - items: z.array(UpdatePositionAccountItemWithIdRequestDtoSchema).readonly().describe("Array of items to update"), - }) - .readonly(); - export type UpdatePositionAccountItemsRequestDto = z.infer; - - /** - * DeletePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to delete - */ - export const DeletePositionAccountItemsRequestDtoSchema = z - .object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to delete") }) - .readonly(); - export type DeletePositionAccountItemsRequestDto = z.infer; - - /** - * DuplicatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to duplicate - */ - export const DuplicatePositionAccountItemsRequestDtoSchema = z - .object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to duplicate") }) - .readonly(); - export type DuplicatePositionAccountItemsRequestDto = z.infer; - - /** - * ReassignPositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to reassign - * @property { string } targetPositionId Target position ID to reassign items to - */ - export const ReassignPositionAccountItemsRequestDtoSchema = z - .object({ - ids: z.array(z.string()).readonly().describe("Array of item IDs to reassign"), - targetPositionId: z.string().describe("Target position ID to reassign items to"), - }) - .readonly(); - export type ReassignPositionAccountItemsRequestDto = z.infer; - - /** - * ReorderPositionAccountItemRequestDtoSchema - * @type { object } - * @property { number } orderPosition New order position for the item - */ - export const ReorderPositionAccountItemRequestDtoSchema = z - .object({ orderPosition: z.number().describe("New order position for the item") }) - .readonly(); - export type ReorderPositionAccountItemRequestDto = z.infer; - - /** - * PositionAccountItemsCreateResponseSchema - * @type { array } - */ - export const PositionAccountItemsCreateResponseSchema = z - .array(CommonModels.PositionAccountItemDtoResponseSchema) - .readonly(); - export type PositionAccountItemsCreateResponse = z.infer; - - /** - * PositionAccountItemsUpdateResponseSchema - * @type { array } - */ - export const PositionAccountItemsUpdateResponseSchema = z - .array(CommonModels.PositionAccountItemDtoResponseSchema) - .readonly(); - export type PositionAccountItemsUpdateResponse = z.infer; - - /** - * PositionAccountItemsDuplicateResponseSchema - * @type { array } - */ - export const PositionAccountItemsDuplicateResponseSchema = z - .array(CommonModels.PositionAccountItemDtoResponseSchema) - .readonly(); - export type PositionAccountItemsDuplicateResponse = z.infer; - - /** - * ReassignResponseSchema - * @type { array } - */ - export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); - export type ReassignResponse = z.infer; +/** + * CreatePositionChargeDataRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const CreatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); +export type CreatePositionChargeDataRequestDto = z.infer; + +/** + * CreatePositionTextDataRequestDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const CreatePositionTextDataRequestDtoSchema = z.object({ content: z.string().nullable() }).partial(); +export type CreatePositionTextDataRequestDto = z.infer; + +/** + * CreatePositionAccountItemRequestDtoSchema + * @type { object } + * @property { CommonModels.PositionAccountItemTypeEnum } type Item type + * @property { CreatePositionChargeDataRequestDto } charge Charge data if type is CHARGE + * @property { CreatePositionTextDataRequestDto } text Text data if type is TEXT + */ +export const CreatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema, charge: CreatePositionChargeDataRequestDtoSchema.nullish(), text: CreatePositionTextDataRequestDtoSchema.nullish() }); +export type CreatePositionAccountItemRequestDto = z.infer; + +/** + * CreatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { CreatePositionAccountItemRequestDto[] } items Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER) + */ +export const CreatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(CreatePositionAccountItemRequestDtoSchema) }); +export type CreatePositionAccountItemsRequestDto = z.infer; + +/** + * UpdatePositionChargeDataRequestDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const UpdatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); +export type UpdatePositionChargeDataRequestDto = z.infer; + +/** + * UpdatePositionTextDataRequestDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const UpdatePositionTextDataRequestDtoSchema = z.object({ content: z.string() }); +export type UpdatePositionTextDataRequestDto = z.infer; + +/** + * UpdatePositionAccountItemRequestDtoSchema + * @type { object } + * @property { CommonModels.PositionAccountItemTypeEnum } type Item type + * @property { UpdatePositionChargeDataRequestDto } charge Charge data if type is CHARGE + * @property { UpdatePositionTextDataRequestDto } text Text data if type is TEXT + */ +export const UpdatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema, charge: UpdatePositionChargeDataRequestDtoSchema.nullish(), text: UpdatePositionTextDataRequestDtoSchema.nullish() }); +export type UpdatePositionAccountItemRequestDto = z.infer; + +/** + * UpdatePositionAccountItemWithIdRequestDtoSchema + * @type { object } + * @property { string } id ID of the item to update + * @property { UpdatePositionAccountItemRequestDto } data Data to update + */ +export const UpdatePositionAccountItemWithIdRequestDtoSchema = z.object({ id: z.string(), data: UpdatePositionAccountItemRequestDtoSchema }); +export type UpdatePositionAccountItemWithIdRequestDto = z.infer; + +/** + * UpdatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { UpdatePositionAccountItemWithIdRequestDto[] } items Array of items to update + */ +export const UpdatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(UpdatePositionAccountItemWithIdRequestDtoSchema) }); +export type UpdatePositionAccountItemsRequestDto = z.infer; + +/** + * DeletePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to delete + */ +export const DeletePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()) }); +export type DeletePositionAccountItemsRequestDto = z.infer; + +/** + * DuplicatePositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to duplicate + */ +export const DuplicatePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()) }); +export type DuplicatePositionAccountItemsRequestDto = z.infer; + +/** + * ReassignPositionAccountItemsRequestDtoSchema + * @type { object } + * @property { string[] } ids Array of item IDs to reassign + * @property { string } targetPositionId Target position ID to reassign items to + */ +export const ReassignPositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()), targetPositionId: z.string() }); +export type ReassignPositionAccountItemsRequestDto = z.infer; + +/** + * ReorderPositionAccountItemRequestDtoSchema + * @type { object } + * @property { number } orderPosition New order position for the item + */ +export const ReorderPositionAccountItemRequestDtoSchema = z.object({ orderPosition: z.number() }); +export type ReorderPositionAccountItemRequestDto = z.infer; + +/** + * PositionAccountItemsCreateResponseSchema + * @type { array } + */ +export const PositionAccountItemsCreateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); +export type PositionAccountItemsCreateResponse = z.infer; + +/** + * PositionAccountItemsUpdateResponseSchema + * @type { array } + */ +export const PositionAccountItemsUpdateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); +export type PositionAccountItemsUpdateResponse = z.infer; + +/** + * PositionAccountItemsDuplicateResponseSchema + * @type { array } + */ +export const PositionAccountItemsDuplicateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); +export type PositionAccountItemsDuplicateResponse = z.infer; + +/** + * ReassignResponseSchema + * @type { array } + */ +export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); +export type ReassignResponse = z.infer; + } diff --git a/test/generated/base/positionAccountItems/positionAccountItems.queries.ts b/test/generated/base/positionAccountItems/positionAccountItems.queries.ts index 909d03c..a3b1ab7 100644 --- a/test/generated/base/positionAccountItems/positionAccountItems.queries.ts +++ b/test/generated/base/positionAccountItems/positionAccountItems.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,221 +8,177 @@ import { PositionAccountItemsModels } from "./positionAccountItems.models"; import { PositionAccountItemsApi } from "./positionAccountItems.api"; export namespace PositionAccountItemsQueries { - export const moduleName = QueryModule.PositionAccountItems; - - /** - * Mutation `useCreate` - * @summary Create position account items (bulk) - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.create, - { positionId: string; officeId: string; data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId })); - return PositionAccountItemsApi.create(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeletePositionAccountItems` - * @summary Delete position account items (bulk) - * @permission Requires `canUseDeletePositionAccountItems` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeletePositionAccountItems = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.deletePositionAccountItems, - { positionId: string; officeId: string; data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId })); - return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update position account items (bulk) - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.update, - { positionId: string; officeId: string; data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId })); - return PositionAccountItemsApi.update(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDuplicate` - * @summary Duplicate position account items (bulk) - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicate = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.duplicate, - { positionId: string; officeId: string; data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId })); - return PositionAccountItemsApi.duplicate(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useReassign` - * @summary Reassign position account items to another position (bulk) - * @permission Requires `canUseReassign` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useReassign = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.reassign, - { positionId: string; officeId: string; data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId })); - return PositionAccountItemsApi.reassign(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useReorder` - * @summary Reorder position account item - * @permission Requires `canUseReorder` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.ReorderPositionAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useReorder = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.reorder, - { - positionId: string; - itemId: string; - officeId: string; - data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, itemId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId })); - return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +export const moduleName = QueryModule.PositionAccountItems; + + + +/** + * Mutation `useCreate` + * @summary Create position account items (bulk) + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId } )); + return PositionAccountItemsApi.create(positionId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeletePositionAccountItems` + * @summary Delete position account items (bulk) + * @permission Requires `canUseDeletePositionAccountItems` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeletePositionAccountItems = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId } )); + return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update position account items (bulk) + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId } )); + return PositionAccountItemsApi.update(positionId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDuplicate` + * @summary Duplicate position account items (bulk) + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId } )); + return PositionAccountItemsApi.duplicate(positionId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReassign` + * @summary Reassign position account items to another position (bulk) + * @permission Requires `canUseReassign` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReassign = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId } )); + return PositionAccountItemsApi.reassign(positionId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useReorder` + * @summary Reorder position account item + * @permission Requires `canUseReorder` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { PositionAccountItemsModels.ReorderPositionAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, itemId, officeId, data }) => { + checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId } )); + return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + } diff --git a/test/generated/base/positionCargo/positionCargo.acl.ts b/test/generated/base/positionCargo/positionCargo.acl.ts index 3be8f2a..f62ee50 100644 --- a/test/generated/base/positionCargo/positionCargo.acl.ts +++ b/test/generated/base/positionCargo/positionCargo.acl.ts @@ -1,111 +1,121 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace PositionCargoAcl { - /** - * Use for `useListCargosByPositionId` query ability. For global ability, omit the object parameter. - * @description List cargo items by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByPositionId` query - */ - export const canUseListCargosByPositionId = (object?: { officeId: string }) => - ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Read", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useListCargosByPositionId` query ability. For global ability, omit the object parameter. + * @description List cargo items by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByPositionId` query + */ +export const canUseListCargosByPositionId = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useCreateCargo` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCargo` mutation - */ - export const canUseCreateCargo = (object?: { officeId: string }) => - ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Create", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useCreateCargo` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCargo` mutation + */ +export const canUseCreateCargo = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. - * @description List cargo labels by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query - */ - export const canUseListCargoLabels = (object?: { officeId: string }) => - ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Read", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. + * @description List cargo labels by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query + */ +export const canUseListCargoLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. - * @description Get cargo summary by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query - */ - export const canUseGetCargoSummary = (object?: { officeId: string }) => - ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Read", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. + * @description Get cargo summary by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query + */ +export const canUseGetCargoSummary = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. - * @description Get cargo item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query - */ - export const canUseGetCargoById = (object?: { officeId: string }) => - ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Read", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. + * @description Get cargo item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query + */ +export const canUseGetCargoById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. - * @description Update cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation - */ - export const canUseUpdateCargo = (object?: { officeId: string }) => - ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Update", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. + * @description Update cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation + */ +export const canUseUpdateCargo = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation - */ - export const canUseDeleteCargo = (object?: { officeId: string }) => - ["Delete", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Delete", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation + */ +export const canUseDeleteCargo = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation - */ - export const canUseCreateBulkCargos = (object?: { officeId: string }) => - ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Create", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation + */ +export const canUseCreateBulkCargos = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation + */ +export const canUseDuplicateCargo = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation - */ - export const canUseDuplicateCargo = (object?: { officeId: string }) => - ["Duplicate", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Duplicate", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; } diff --git a/test/generated/base/positionCargo/positionCargo.api.ts b/test/generated/base/positionCargo/positionCargo.api.ts index 69b09c6..a89b2ec 100644 --- a/test/generated/base/positionCargo/positionCargo.api.ts +++ b/test/generated/base/positionCargo/positionCargo.api.ts @@ -1,135 +1,81 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PositionCargoModels } from "./positionCargo.models"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionCargoApi { - export const listCargosByPositionId = ( - officeId: string, - positionId: string, - limit: number, - order?: PositionCargoModels.ListCargosByPositionIdOrderParam, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const listCargosByPositionId = (officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos`, - { - ...config, - params: { - order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { - type: "query", - name: "order", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const createCargo = ( - officeId: string, - positionId: string, - data: CommonModels.CreatePositionCargoDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos`, + { + params: { + order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const createCargo = (officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config, - ); - }; - - export const listCargoLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + + ) +}; +export const listCargoLabels = (officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/labels`, - config, - ); - }; - - export const getCargoSummary = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/labels`, + + ) +}; +export const getCargoSummary = (officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/summary`, - config, - ); - }; - - export const getCargoById = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/summary`, + + ) +}; +export const getCargoById = (officeId: string, positionId: string, cargoId: string, ) => { return AppRestClient.get( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - config, - ); - }; - - export const updateCargo = ( - officeId: string, - positionId: string, - cargoId: string, - data: CommonModels.UpdatePositionCargoDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + + ) +}; +export const updateCargo = (officeId: string, positionId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, ) => { return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - config, - ); - }; - - export const deleteCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), + + ) +}; +export const deleteCargo = (officeId: string, positionId: string, cargoId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - undefined, - config, - ); - }; - - export const createBulkCargos = ( - numberOfCargos: number, - officeId: string, - positionId: string, - data: CommonModels.CreatePositionCargoDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, + + ) +}; +export const createBulkCargos = (numberOfCargos: number, officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, ) => { return AppRestClient.post( - { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config, - ); - }; - - export const duplicateCargo = ( - officeId: string, - positionId: string, - cargoId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + + ) +}; +export const duplicateCargo = (officeId: string, positionId: string, cargoId: string, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, - undefined, - config, - ); - }; + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, + + ) +}; } diff --git a/test/generated/base/positionCargo/positionCargo.configs.ts b/test/generated/base/positionCargo/positionCargo.configs.ts index 318b8e9..a62c692 100644 --- a/test/generated/base/positionCargo/positionCargo.configs.ts +++ b/test/generated/base/positionCargo/positionCargo.configs.ts @@ -5,128 +5,129 @@ import { PositionCargoQueries } from "./positionCargo.queries"; import { PositionCargoAcl } from "./positionCargo.acl"; export namespace PositionCargoConfigs { - export const cargosConfig = { +export const cargosConfig = { meta: { - title: "Cargos", + title: "Cargos", }, readAll: { - acl: PositionCargoAcl.canUseListCargosByPositionId, - schema: CommonModels.PositionCargoResponseDTOSchema, - paginated: PositionCargoQueries.useListCargosByPositionId, - infinite: PositionCargoQueries.useListCargosByPositionIdInfinite, - columns: dynamicColumns({ + acl: PositionCargoAcl.canUseListCargosByPositionId, schema: CommonModels.PositionCargoResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - quoteId: true, - rootFolderId: true, - cargoType: true, - autoCalculateTotals: true, - autoCalculateRates: true, - autoCalculateVgm: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - rateOptions: true, - rateClass: true, - textForCustoms: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - ratePerKg: true, - totalRate: true, - tare: true, - vgm: true, - hsCodeLabels: true, - note: true, - packages: true, - createdAt: true, - updatedAt: true, - completeWeight: true, - packageTotals: true, - }, - }, - }), + paginated: PositionCargoQueries.useListCargosByPositionId, + infinite: PositionCargoQueries.useListCargosByPositionIdInfinite, + columns: dynamicColumns({ + schema: CommonModels.PositionCargoResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + quoteId: true, + rootFolderId: true, + cargoType: true, + autoCalculateTotals: true, + autoCalculateRates: true, + autoCalculateVgm: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + rateOptions: true, + rateClass: true, + textForCustoms: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + ratePerKg: true, + totalRate: true, + tare: true, + vgm: true, + hsCodeLabels: true, + note: true, + packages: true, + createdAt: true, + updatedAt: true, + completeWeight: true, + packageTotals: true, + }, + }, +}), }, read: { - acl: PositionCargoAcl.canUseGetCargoById, - schema: CommonModels.PositionCargoResponseDTOSchema, - query: PositionCargoQueries.useGetCargoById, + acl: PositionCargoAcl.canUseGetCargoById, + schema: CommonModels.PositionCargoResponseDTOSchema, + query: PositionCargoQueries.useGetCargoById, }, create: { - acl: PositionCargoAcl.canUseCreateCargo, - schema: CommonModels.CreatePositionCargoDTOSchema, - mutation: PositionCargoQueries.useCreateCargo, - inputDefs: dynamicInputs({ + acl: PositionCargoAcl.canUseCreateCargo, schema: CommonModels.CreatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, - }), + mutation: PositionCargoQueries.useCreateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.CreatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, +}) }, update: { - acl: PositionCargoAcl.canUseUpdateCargo, - schema: CommonModels.UpdatePositionCargoDTOSchema, - mutation: PositionCargoQueries.useUpdateCargo, - inputDefs: dynamicInputs({ + acl: PositionCargoAcl.canUseUpdateCargo, schema: CommonModels.UpdatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, - }), + mutation: PositionCargoQueries.useUpdateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.UpdatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, +}) }, delete: { - acl: PositionCargoAcl.canUseDeleteCargo, - mutation: PositionCargoQueries.useDeleteCargo, + acl: PositionCargoAcl.canUseDeleteCargo, + mutation: PositionCargoQueries.useDeleteCargo, }, - }; +}; + } diff --git a/test/generated/base/positionCargo/positionCargo.models.ts b/test/generated/base/positionCargo/positionCargo.models.ts index 5649851..53c8e51 100644 --- a/test/generated/base/positionCargo/positionCargo.models.ts +++ b/test/generated/base/positionCargo/positionCargo.models.ts @@ -2,56 +2,45 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionCargoModels { - /** - * ListCargosByPositionIdOrderParamSchema - * @type { array } - * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - */ - export const ListCargosByPositionIdOrderParamSchema = z - .array(CommonModels.PositionCargoPaginationOrderFieldSchema) - .readonly() - .describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt") - .nullish(); - export type ListCargosByPositionIdOrderParam = z.infer; +/** + * ListCargosByPositionIdOrderParamSchema + * @type { array } + */ +export const ListCargosByPositionIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).nullish(); +export type ListCargosByPositionIdOrderParam = z.infer; - /** - * ListCargosByPositionIdResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.PositionCargoResponseDTO[] } items - */ - export const ListCargosByPositionIdResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ListCargosByPositionIdResponse = z.infer; +/** + * ListCargosByPositionIdResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.PositionCargoResponseDTO[] } items + */ +export const ListCargosByPositionIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).nullable() }).partial().shape }); +export type ListCargosByPositionIdResponse = z.infer; - /** - * PositionCargoListCargoLabelsResponseSchema - * @type { array } - */ - export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type PositionCargoListCargoLabelsResponse = z.infer; +/** + * PositionCargoListCargoLabelsResponseSchema + * @type { array } + */ +export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); +export type PositionCargoListCargoLabelsResponse = z.infer; - /** - * PositionCargoGetCargoSummaryResponseSchema - * @type { array } - */ - export const PositionCargoGetCargoSummaryResponseSchema = z - .array(CommonModels.CargoSummaryResponseDTOSchema) - .readonly(); - export type PositionCargoGetCargoSummaryResponse = z.infer; +/** + * PositionCargoGetCargoSummaryResponseSchema + * @type { array } + */ +export const PositionCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema); +export type PositionCargoGetCargoSummaryResponse = z.infer; + +/** + * PositionCargoCreateBulkCargosResponseSchema + * @type { array } + */ +export const PositionCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema); +export type PositionCargoCreateBulkCargosResponse = z.infer; - /** - * PositionCargoCreateBulkCargosResponseSchema - * @type { array } - */ - export const PositionCargoCreateBulkCargosResponseSchema = z - .array(CommonModels.PositionCargoResponseDTOSchema) - .readonly(); - export type PositionCargoCreateBulkCargosResponse = z.infer; } diff --git a/test/generated/base/positionCargo/positionCargo.queries.ts b/test/generated/base/positionCargo/positionCargo.queries.ts index 4c2f731..0177598 100644 --- a/test/generated/base/positionCargo/positionCargo.queries.ts +++ b/test/generated/base/positionCargo/positionCargo.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,406 +9,285 @@ import { CommonModels } from "@/data/common/common.models"; import { PositionCargoApi } from "./positionCargo.api"; export namespace PositionCargoQueries { - export const moduleName = QueryModule.PositionCargo; +export const moduleName = QueryModule.PositionCargo; - export const keys = { +export const keys = { all: [moduleName] as const, - listCargosByPositionId: ( - officeId: string, - positionId: string, - limit?: number, - order?: PositionCargoModels.ListCargosByPositionIdOrderParam, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/cargos", - officeId, - positionId, - limit, - order, - page, - cursor, - ] as const, - listCargosByPositionIdInfinite: ( - officeId: string, - positionId: string, - limit?: number, - order?: PositionCargoModels.ListCargosByPositionIdOrderParam, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/cargos", - "infinite", - officeId, - positionId, - limit, - order, - cursor, - ] as const, - listCargoLabels: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/cargos/labels", officeId, positionId] as const, - getCargoSummary: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/cargos/summary", officeId, positionId] as const, - getCargoById: (officeId: string, positionId: string, cargoId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/cargos/:cargoId", officeId, positionId, cargoId] as const, - }; + listCargosByPositionId: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", officeId, positionId, limit, order, page, cursor] as const, + listCargosByPositionIdInfinite: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", "infinite", officeId, positionId, limit, order, cursor] as const, + listCargoLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/labels", officeId, positionId] as const, + getCargoSummary: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/summary", officeId, positionId] as const, + getCargoById: (officeId: string, positionId: string, cargoId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/:cargoId", officeId, positionId, cargoId] as const, +}; - /** - * Query `useListCargosByPositionId` - * @summary List all cargo items for a position - * @permission Requires `canUseListCargosByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargosByPositionId = ( - { - officeId, - positionId, - limit, - order, - page, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: PositionCargoModels.ListCargosByPositionIdOrderParam; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useListCargosByPositionId` + * @summary List all cargo items for a position + * @permission Requires `canUseListCargosByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByPositionId = ({ officeId, positionId, limit, order, page, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId })); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useListCargosByPositionIdInfinite + * @summary List all cargo items for a position + * @permission Requires `canUseListCargosByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByPositionIdInfinite = ({ officeId, positionId, limit, order, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListCargosByPositionIdInfinite - * @summary List all cargo items for a position - * @permission Requires `canUseListCargosByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargosByPositionIdInfinite = ( - { - officeId, - positionId, - limit, - order, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: PositionCargoModels.ListCargosByPositionIdOrderParam; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId })); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreateCargo` - * @summary Create a new cargo item - * @permission Requires `canUseCreateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateCargo = ( - options?: AppMutationOptions< - typeof PositionCargoApi.createCargo, - { officeId: string; positionId: string; data: CommonModels.CreatePositionCargoDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId })); - return PositionCargoApi.createCargo(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + ...options, + }); +}; - /** - * Query `useListCargoLabels` - * @summary List all cargo labels for a position - * @permission Requires `canUseListCargoLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargoLabels = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Mutation `useCreateCargo` + * @summary Create a new cargo item + * @permission Requires `canUseCreateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useQuery({ - queryKey: keys.listCargoLabels(officeId, positionId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId })); - return PositionCargoApi.listCargoLabels(officeId, positionId, config); - }, - ...options, - }); - }; + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId } )); + return PositionCargoApi.createCargo(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useGetCargoSummary` - * @summary Get cargo summary grouped by transport unit type - * @permission Requires `canUseGetCargoSummary` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCargoSummary = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useListCargoLabels` + * @summary List all cargo labels for a position + * @permission Requires `canUseListCargoLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargoLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargoLabels(officeId, positionId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId } )); + return PositionCargoApi.listCargoLabels(officeId, positionId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getCargoSummary(officeId, positionId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId })); - return PositionCargoApi.getCargoSummary(officeId, positionId, config); - }, - ...options, - }); - }; +/** + * Query `useGetCargoSummary` + * @summary Get cargo summary grouped by transport unit type + * @permission Requires `canUseGetCargoSummary` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoSummary = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoSummary(officeId, positionId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId } )); + return PositionCargoApi.getCargoSummary(officeId, positionId) }, + ...options, + }); +}; - /** - * Query `useGetCargoById` - * @summary Get a specific cargo item - * @permission Requires `canUseGetCargoById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.cargoId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCargoById = ( - { officeId, positionId, cargoId }: { officeId: string; positionId: string; cargoId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetCargoById` + * @summary Get a specific cargo item + * @permission Requires `canUseGetCargoById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.cargoId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoById = ({ officeId, positionId, cargoId }: { officeId: string, positionId: string, cargoId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoById(officeId, positionId, cargoId), + queryFn: () => { + checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId } )); + return PositionCargoApi.getCargoById(officeId, positionId, cargoId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getCargoById(officeId, positionId, cargoId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId })); - return PositionCargoApi.getCargoById(officeId, positionId, cargoId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdateCargo` + * @summary Update a cargo item + * @permission Requires `canUseUpdateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdateCargo` - * @summary Update a cargo item - * @permission Requires `canUseUpdateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCargo = ( - options?: AppMutationOptions< - typeof PositionCargoApi.updateCargo, - { officeId: string; positionId: string; cargoId: string; data: CommonModels.UpdatePositionCargoDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, data }) => { + checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId } )); + return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, data }) => { - checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId })); - return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteCargo` + * @summary Delete a cargo item + * @permission Requires `canUseDeleteCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteCargo` - * @summary Delete a cargo item - * @permission Requires `canUseDeleteCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteCargo = ( - options?: AppMutationOptions< - typeof PositionCargoApi.deleteCargo, - { officeId: string; positionId: string; cargoId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId }) => { + checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId } )); + return PositionCargoApi.deleteCargo(officeId, positionId, cargoId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId }) => { - checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId })); - return PositionCargoApi.deleteCargo(officeId, positionId, cargoId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useCreateBulkCargos` + * @summary Create a new cargo item + * @permission Requires `canUseCreateBulkCargos` ability + * @param { number } mutation.numberOfCargos Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreateBulkCargos` - * @summary Create a new cargo item - * @permission Requires `canUseCreateBulkCargos` ability - * @param { number } mutation.numberOfCargos Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateBulkCargos = ( - options?: AppMutationOptions< - typeof PositionCargoApi.createBulkCargos, - { numberOfCargos: number; officeId: string; positionId: string; data: CommonModels.CreatePositionCargoDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { + checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId } )); + return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { - checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId })); - return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDuplicateCargo` + * @summary Duplicate a cargo item + * @permission Requires `canUseDuplicateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDuplicateCargo` - * @summary Duplicate a cargo item - * @permission Requires `canUseDuplicateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicateCargo = ( - options?: AppMutationOptions< - typeof PositionCargoApi.duplicateCargo, - { officeId: string; positionId: string; cargoId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId }) => { + checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId } )); + return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId }) => { - checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId })); - return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts b/test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts index 1b45ca0..552d48c 100644 --- a/test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts +++ b/test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts @@ -1,63 +1,69 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace PositionCargoPackageAcl { - /** - * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. - * @description Create cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation - */ - export const canUseCreatePackage = (object?: { officeId: string }) => - ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Create", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. + * @description Create cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation + */ +export const canUseCreatePackage = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. - * @description Update cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation - */ - export const canUseUpdatePackage = (object?: { officeId: string }) => - ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Update", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. + * @description Update cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation + */ +export const canUseUpdatePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation - */ - export const canUseDeletePackage = (object?: { officeId: string }) => - ["Delete", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Delete", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation + */ +export const canUseDeletePackage = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation - */ - export const canUseDuplicatePackage = (object?: { officeId: string }) => - ["Duplicate", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Duplicate", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; +/** + * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation + */ +export const canUseDuplicatePackage = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; + +/** + * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. + * @description Move cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation + */ +export const canUseMovePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("PositionCargo", object) : "PositionCargo" +] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - /** - * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. - * @description Move cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation - */ - export const canUseMovePackage = (object?: { officeId: string }) => - ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Update", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; } diff --git a/test/generated/base/positionCargoPackage/positionCargoPackage.api.ts b/test/generated/base/positionCargoPackage/positionCargoPackage.api.ts index db2562e..0ccfabd 100644 --- a/test/generated/base/positionCargoPackage/positionCargoPackage.api.ts +++ b/test/generated/base/positionCargoPackage/positionCargoPackage.api.ts @@ -1,84 +1,45 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionCargoPackageApi { - export const createPackage = ( - officeId: string, - positionId: string, - cargoId: string, - data: CommonModels.CreatePositionCargoPackageDTO, - config?: AxiosRequestConfig, - ) => { +export const createPackage = (officeId: string, positionId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, - ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - config, - ); - }; - - export const updatePackage = ( - officeId: string, - positionId: string, - cargoId: string, - packageId: string, - data: CommonModels.UpdatePositionCargoPackageDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, + ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), + + ) +}; +export const updatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, ) => { return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - config, - ); - }; - - export const deletePackage = ( - officeId: string, - positionId: string, - cargoId: string, - packageId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), + + ) +}; +export const deletePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - undefined, - config, - ); - }; - - export const duplicatePackage = ( - officeId: string, - positionId: string, - cargoId: string, - packageId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, + + ) +}; +export const duplicatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - undefined, - config, - ); - }; - - export const movePackage = ( - officeId: string, - positionId: string, - cargoId: string, - packageId: string, - data: CommonModels.MovePositionCargoPackageRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, + + ) +}; +export const movePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, ) => { return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, - ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - config, - ); - }; + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, + ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts b/test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts index 3c69275..fc4eedb 100644 --- a/test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts +++ b/test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,199 +8,155 @@ import { CommonModels } from "@/data/common/common.models"; import { PositionCargoPackageApi } from "./positionCargoPackage.api"; export namespace PositionCargoPackageQueries { - export const moduleName = QueryModule.PositionCargoPackage; +export const moduleName = QueryModule.PositionCargoPackage; - /** - * Mutation `useCreatePackage` - * @summary Create a new package for a cargo - * @permission Requires `canUseCreatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreatePackage = ( - options?: AppMutationOptions< - typeof PositionCargoPackageApi.createPackage, - { officeId: string; positionId: string; cargoId: string; data: CommonModels.CreatePositionCargoPackageDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId })); - return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - /** - * Mutation `useUpdatePackage` - * @summary Update a package - * @permission Requires `canUseUpdatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdatePackage = ( - options?: AppMutationOptions< - typeof PositionCargoPackageApi.updatePackage, - { - officeId: string; - positionId: string; - cargoId: string; - packageId: string; - data: CommonModels.UpdatePositionCargoPackageDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreatePackage` + * @summary Create a new package for a cargo + * @permission Requires `canUseCreatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId })); - return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId } )); + return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useDeletePackage` - * @summary Delete a package - * @permission Requires `canUseDeletePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeletePackage = ( - options?: AppMutationOptions< - typeof PositionCargoPackageApi.deletePackage, - { officeId: string; positionId: string; cargoId: string; packageId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdatePackage` + * @summary Update a package + * @permission Requires `canUseUpdatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId }) => { - checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId })); - return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId } )); + return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useDuplicatePackage` - * @summary Duplicate a package - * @permission Requires `canUseDuplicatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicatePackage = ( - options?: AppMutationOptions< - typeof PositionCargoPackageApi.duplicatePackage, - { officeId: string; positionId: string; cargoId: string; packageId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useDeletePackage` + * @summary Delete a package + * @permission Requires `canUseDeletePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId }) => { - checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId })); - return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId }) => { + checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId } )); + return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useMovePackage` - * @summary Move a package to a different cargo - * @permission Requires `canUseMovePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useMovePackage = ( - options?: AppMutationOptions< - typeof PositionCargoPackageApi.movePackage, - { - officeId: string; - positionId: string; - cargoId: string; - packageId: string; - data: CommonModels.MovePositionCargoPackageRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useDuplicatePackage` + * @summary Duplicate a package + * @permission Requires `canUseDuplicatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId }) => { + checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId } )); + return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMovePackage` + * @summary Move a package to a different cargo + * @permission Requires `canUseMovePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { + checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId } )); + return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId })); - return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/positionChecklist/positionChecklist.acl.ts b/test/generated/base/positionChecklist/positionChecklist.acl.ts index 6047fe4..1f8dfca 100644 --- a/test/generated/base/positionChecklist/positionChecklist.acl.ts +++ b/test/generated/base/positionChecklist/positionChecklist.acl.ts @@ -1,75 +1,82 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace PositionChecklistAcl { - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List checklist items for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List checklist items for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useApplyTemplates` mutation ability. For global ability, omit the object parameter. - * @description Apply checklist templates to position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useApplyTemplates` mutation - */ - export const canUseApplyTemplates = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useApplyTemplates` mutation ability. For global ability, omit the object parameter. + * @description Apply checklist templates to position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useApplyTemplates` mutation + */ +export const canUseApplyTemplates = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useComplete` mutation ability. For global ability, omit the object parameter. - * @description Complete position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useComplete` mutation - */ - export const canUseComplete = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useComplete` mutation ability. For global ability, omit the object parameter. + * @description Complete position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useComplete` mutation + */ +export const canUseComplete = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useUncomplete` mutation ability. For global ability, omit the object parameter. - * @description Uncomplete position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUncomplete` mutation - */ - export const canUseUncomplete = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useUncomplete` mutation ability. For global ability, omit the object parameter. + * @description Uncomplete position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUncomplete` mutation + */ +export const canUseUncomplete = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useUpdateNotes` mutation ability. For global ability, omit the object parameter. - * @description Update position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateNotes` mutation - */ - export const canUseUpdateNotes = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useUpdateNotes` mutation ability. For global ability, omit the object parameter. + * @description Update position checklist item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateNotes` mutation + */ +export const canUseUpdateNotes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useReorder` mutation ability. For global ability, omit the object parameter. + * @description Reorder position checklist items + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation + */ +export const canUseReorder = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useReorder` mutation ability. For global ability, omit the object parameter. - * @description Reorder position checklist items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation - */ - export const canUseReorder = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; } diff --git a/test/generated/base/positionChecklist/positionChecklist.api.ts b/test/generated/base/positionChecklist/positionChecklist.api.ts index 729b72a..97c694e 100644 --- a/test/generated/base/positionChecklist/positionChecklist.api.ts +++ b/test/generated/base/positionChecklist/positionChecklist.api.ts @@ -1,75 +1,51 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { PositionChecklistModels } from "./positionChecklist.models"; export namespace PositionChecklistApi { - export const list = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const list = (officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist`, - config, - ); - }; - - export const applyTemplates = ( - officeId: string, - positionId: string, - data: PositionChecklistModels.ApplyTemplatesRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist`, + + ) +}; +export const applyTemplates = (officeId: string, positionId: string, data: PositionChecklistModels.ApplyTemplatesRequestDto, ) => { return AppRestClient.post( - { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, - ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), - config, - ); - }; - - export const complete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { + { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, + ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), + + ) +}; +export const complete = (officeId: string, positionId: string, itemId: string, ) => { return AppRestClient.post( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, - undefined, - config, - ); - }; - - export const uncomplete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, + + ) +}; +export const uncomplete = (officeId: string, positionId: string, itemId: string, ) => { return AppRestClient.post( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, - undefined, - config, - ); - }; - - export const updateNotes = ( - officeId: string, - positionId: string, - itemId: string, - data: PositionChecklistModels.UpdatePositionChecklistItemDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, + + ) +}; +export const updateNotes = (officeId: string, positionId: string, itemId: string, data: PositionChecklistModels.UpdatePositionChecklistItemDto, ) => { return AppRestClient.patch( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, - ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), - config, - ); - }; - - export const reorder = ( - officeId: string, - positionId: string, - data: PositionChecklistModels.ReorderPositionChecklistDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, + ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), + + ) +}; +export const reorder = (officeId: string, positionId: string, data: PositionChecklistModels.ReorderPositionChecklistDto, ) => { return AppRestClient.put( - { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/reorder`, - ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), - config, - ); - }; + { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, + `/offices/${officeId}/positions/${positionId}/checklist/reorder`, + ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/positionChecklist/positionChecklist.models.ts b/test/generated/base/positionChecklist/positionChecklist.models.ts index 58a0db3..98e27b8 100644 --- a/test/generated/base/positionChecklist/positionChecklist.models.ts +++ b/test/generated/base/positionChecklist/positionChecklist.models.ts @@ -1,96 +1,77 @@ import { z } from "zod"; export namespace PositionChecklistModels { - /** - * PositionChecklistCompletedByResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PositionChecklistCompletedByResponseDtoSchema = z - .object({ id: z.string(), name: z.string().nullable() }) - .readonly(); - export type PositionChecklistCompletedByResponseDto = z.infer; +/** + * PositionChecklistCompletedByResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const PositionChecklistCompletedByResponseDtoSchema = z.object({ id: z.string(), name: z.string().nullable() }); +export type PositionChecklistCompletedByResponseDto = z.infer; - /** - * PositionChecklistItemResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } checklistItemId - * @property { string } templateId - * @property { number } order - * @property { boolean } completed - * @property { string } completedAt - * @property { PositionChecklistCompletedByResponseDto } completedBy - * @property { string } notes - * @property { string } name - */ - export const PositionChecklistItemResponseDtoSchema = z - .object({ - id: z.string(), - positionId: z.string(), - checklistItemId: z.string(), - templateId: z.string().nullable(), - order: z.number(), - completed: z.boolean(), - completedAt: z.iso.datetime({ offset: true }).nullable(), - completedBy: PositionChecklistCompletedByResponseDtoSchema.nullable(), - notes: z.string().nullable(), - name: z.string().nullable(), - }) - .readonly(); - export type PositionChecklistItemResponseDto = z.infer; +/** + * PositionChecklistItemResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } checklistItemId + * @property { string } templateId + * @property { number } order + * @property { boolean } completed + * @property { string } completedAt + * @property { PositionChecklistCompletedByResponseDto } completedBy + * @property { string } notes + * @property { string } name + */ +export const PositionChecklistItemResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), checklistItemId: z.string(), templateId: z.string().nullable(), order: z.number(), completed: z.boolean(), completedAt: z.iso.datetime({ offset: true }).nullable(), completedBy: PositionChecklistCompletedByResponseDtoSchema.nullable(), notes: z.string().nullable(), name: z.string().nullable() }); +export type PositionChecklistItemResponseDto = z.infer; - /** - * PositionChecklistResponseDtoSchema - * @type { object } - * @property { PositionChecklistItemResponseDto[] } items - * @property { string[] } appliedTemplateIds - */ - export const PositionChecklistResponseDtoSchema = z - .object({ - items: z.array(PositionChecklistItemResponseDtoSchema).readonly(), - appliedTemplateIds: z.array(z.string()).readonly(), - }) - .readonly(); - export type PositionChecklistResponseDto = z.infer; +/** + * PositionChecklistResponseDtoSchema + * @type { object } + * @property { PositionChecklistItemResponseDto[] } items + * @property { string[] } appliedTemplateIds + */ +export const PositionChecklistResponseDtoSchema = z.object({ items: z.array(PositionChecklistItemResponseDtoSchema), appliedTemplateIds: z.array(z.string()) }); +export type PositionChecklistResponseDto = z.infer; - /** - * ApplyTemplatesRequestDtoSchema - * @type { object } - * @property { string[] } templateIds - */ - export const ApplyTemplatesRequestDtoSchema = z.object({ templateIds: z.array(z.string()).readonly() }).readonly(); - export type ApplyTemplatesRequestDto = z.infer; +/** + * ApplyTemplatesRequestDtoSchema + * @type { object } + * @property { string[] } templateIds + */ +export const ApplyTemplatesRequestDtoSchema = z.object({ templateIds: z.array(z.string()) }); +export type ApplyTemplatesRequestDto = z.infer; - /** - * UpdatePositionChecklistItemDtoSchema - * @type { object } - * @property { string } notes Max Length: `512` - */ - export const UpdatePositionChecklistItemDtoSchema = z.object({ notes: z.string().max(512) }).readonly(); - export type UpdatePositionChecklistItemDto = z.infer; +/** + * UpdatePositionChecklistItemDtoSchema + * @type { object } + * @property { string } notes Max Length: `512` + */ +export const UpdatePositionChecklistItemDtoSchema = z.object({ notes: z.string().max(512).nullable() }).partial(); +export type UpdatePositionChecklistItemDto = z.infer; - /** - * ReorderPositionChecklistDtoSchema - * @type { object } - * @property { string[] } itemIds - */ - export const ReorderPositionChecklistDtoSchema = z.object({ itemIds: z.array(z.string()).readonly() }).readonly(); - export type ReorderPositionChecklistDto = z.infer; +/** + * ReorderPositionChecklistDtoSchema + * @type { object } + * @property { string[] } itemIds + */ +export const ReorderPositionChecklistDtoSchema = z.object({ itemIds: z.array(z.string()) }); +export type ReorderPositionChecklistDto = z.infer; - /** - * ApplyTemplatesResponseSchema - * @type { array } - */ - export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); - export type ApplyTemplatesResponse = z.infer; +/** + * ApplyTemplatesResponseSchema + * @type { array } + */ +export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema); +export type ApplyTemplatesResponse = z.infer; + +/** + * PositionChecklistReorderResponseSchema + * @type { array } + */ +export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema); +export type PositionChecklistReorderResponse = z.infer; - /** - * PositionChecklistReorderResponseSchema - * @type { array } - */ - export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); - export type PositionChecklistReorderResponse = z.infer; } diff --git a/test/generated/base/positionChecklist/positionChecklist.queries.ts b/test/generated/base/positionChecklist/positionChecklist.queries.ts index 0309124..d9649af 100644 --- a/test/generated/base/positionChecklist/positionChecklist.queries.ts +++ b/test/generated/base/positionChecklist/positionChecklist.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,219 +8,174 @@ import { PositionChecklistModels } from "./positionChecklist.models"; import { PositionChecklistApi } from "./positionChecklist.api"; export namespace PositionChecklistQueries { - export const moduleName = QueryModule.PositionChecklist; +export const moduleName = QueryModule.PositionChecklist; - export const keys = { +export const keys = { all: [moduleName] as const, - list: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/checklist", officeId, positionId] as const, - }; + list: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/checklist", officeId, positionId] as const, +}; - /** - * Query `useList` - * @summary Get position checklist items - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useList` + * @summary Get position checklist items + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, positionId), + queryFn: () => { + checkAcl(PositionChecklistAcl.canUseList({ officeId } )); + return PositionChecklistApi.list(officeId, positionId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.list(officeId, positionId), - queryFn: () => { - checkAcl(PositionChecklistAcl.canUseList({ officeId })); - return PositionChecklistApi.list(officeId, positionId, config); - }, - ...options, - }); - }; +/** + * Mutation `useApplyTemplates` + * @summary Apply checklist templates to position + * @permission Requires `canUseApplyTemplates` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionChecklistModels.ApplyTemplatesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useApplyTemplates = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useApplyTemplates` - * @summary Apply checklist templates to position - * @permission Requires `canUseApplyTemplates` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionChecklistModels.ApplyTemplatesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useApplyTemplates = ( - options?: AppMutationOptions< - typeof PositionChecklistApi.applyTemplates, - { officeId: string; positionId: string; data: PositionChecklistModels.ApplyTemplatesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId } )); + return PositionChecklistApi.applyTemplates(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId })); - return PositionChecklistApi.applyTemplates(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useComplete` + * @summary Complete a checklist item + * @permission Requires `canUseComplete` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useComplete = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useComplete` - * @summary Complete a checklist item - * @permission Requires `canUseComplete` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useComplete = ( - options?: AppMutationOptions< - typeof PositionChecklistApi.complete, - { officeId: string; positionId: string; itemId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, itemId }) => { + checkAcl(PositionChecklistAcl.canUseComplete({ officeId } )); + return PositionChecklistApi.complete(officeId, positionId, itemId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, itemId }) => { - checkAcl(PositionChecklistAcl.canUseComplete({ officeId })); - return PositionChecklistApi.complete(officeId, positionId, itemId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUncomplete` + * @summary Mark checklist item as not completed + * @permission Requires `canUseUncomplete` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useUncomplete = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUncomplete` - * @summary Mark checklist item as not completed - * @permission Requires `canUseUncomplete` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useUncomplete = ( - options?: AppMutationOptions< - typeof PositionChecklistApi.uncomplete, - { officeId: string; positionId: string; itemId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, itemId }) => { + checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId } )); + return PositionChecklistApi.uncomplete(officeId, positionId, itemId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, itemId }) => { - checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId })); - return PositionChecklistApi.uncomplete(officeId, positionId, itemId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdateNotes` + * @summary Update checklist item notes + * @permission Requires `canUseUpdateNotes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { PositionChecklistModels.UpdatePositionChecklistItemDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateNotes = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdateNotes` - * @summary Update checklist item notes - * @permission Requires `canUseUpdateNotes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { PositionChecklistModels.UpdatePositionChecklistItemDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateNotes = ( - options?: AppMutationOptions< - typeof PositionChecklistApi.updateNotes, - { - officeId: string; - positionId: string; - itemId: string; - data: PositionChecklistModels.UpdatePositionChecklistItemDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, itemId, data }) => { + checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId } )); + return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, itemId, data }) => { - checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId })); - return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useReorder` + * @summary Reorder checklist items + * @permission Requires `canUseReorder` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionChecklistModels.ReorderPositionChecklistDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useReorder` - * @summary Reorder checklist items - * @permission Requires `canUseReorder` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionChecklistModels.ReorderPositionChecklistDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useReorder = ( - options?: AppMutationOptions< - typeof PositionChecklistApi.reorder, - { officeId: string; positionId: string; data: PositionChecklistModels.ReorderPositionChecklistDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionChecklistAcl.canUseReorder({ officeId } )); + return PositionChecklistApi.reorder(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionChecklistAcl.canUseReorder({ officeId })); - return PositionChecklistApi.reorder(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts index 7716790..8215460 100644 --- a/test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts +++ b/test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts @@ -1,51 +1,56 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace PositionInvolvedPartiesAcl { - /** - * Use for `useFindByPositionId` query ability. For global ability, omit the object parameter. - * @description List position involved parties - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByPositionId` query - */ - export const canUseFindByPositionId = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useFindByPositionId` query ability. For global ability, omit the object parameter. + * @description List position involved parties + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByPositionId` query + */ +export const canUseFindByPositionId = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation ability. For global ability, omit the object parameter. + * @description Delete position involved party + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation + */ +export const canUseDeleteOfficesPositionsInvolvedPartiesByPartyId = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation ability. For global ability, omit the object parameter. - * @description Delete position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation - */ - export const canUseDeleteOfficesPositionsInvolvedPartiesByPartyId = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; } diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts index ca5c543..bed6f4b 100644 --- a/test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts +++ b/test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts @@ -1,59 +1,38 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PositionInvolvedPartiesModels } from "./positionInvolvedParties.models"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionInvolvedPartiesApi { - export const findByPositionId = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const findByPositionId = (officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties`, - config, - ); - }; - - export const create = ( - officeId: string, - positionId: string, - data: CommonModels.CreateInvolvedPartyRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties`, + + ) +}; +export const create = (officeId: string, positionId: string, data: CommonModels.CreateInvolvedPartyRequestDto, ) => { return AppRestClient.post( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties`, - ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - config, - ); - }; - - export const update = ( - officeId: string, - positionId: string, - partyId: string, - data: CommonModels.UpdateInvolvedPartyDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties`, + ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), + + ) +}; +export const update = (officeId: string, positionId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, ) => { return AppRestClient.patch( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - config, - ); - }; - - export const deleteOfficesPositionsInvolvedPartiesByPartyId = ( - officeId: string, - positionId: string, - partyId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, + ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), + + ) +}; +export const deleteOfficesPositionsInvolvedPartiesByPartyId = (officeId: string, positionId: string, partyId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - undefined, - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, + + ) +}; } diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts index aeea1e4..310c296 100644 --- a/test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts +++ b/test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts @@ -2,10 +2,11 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionInvolvedPartiesModels { - /** - * FindByPositionIdResponseSchema - * @type { array } - */ - export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); - export type FindByPositionIdResponse = z.infer; +/** + * FindByPositionIdResponseSchema + * @type { array } + */ +export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema); +export type FindByPositionIdResponse = z.infer; + } diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts index ed6dde7..17bf8f0 100644 --- a/test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts +++ b/test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,149 +8,118 @@ import { CommonModels } from "@/data/common/common.models"; import { PositionInvolvedPartiesApi } from "./positionInvolvedParties.api"; export namespace PositionInvolvedPartiesQueries { - export const moduleName = QueryModule.PositionInvolvedParties; +export const moduleName = QueryModule.PositionInvolvedParties; - export const keys = { +export const keys = { all: [moduleName] as const, - findByPositionId: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/involved-parties", officeId, positionId] as const, - }; + findByPositionId: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/involved-parties", officeId, positionId] as const, +}; - /** - * Query `useFindByPositionId` - * @summary List position involved parties - * @permission Requires `canUseFindByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindByPositionId = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindByPositionId` + * @summary List position involved parties + * @permission Requires `canUseFindByPositionId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindByPositionId = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findByPositionId(officeId, positionId), + queryFn: () => { + checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId } )); + return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findByPositionId(officeId, positionId), - queryFn: () => { - checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId })); - return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId, config); - }, - ...options, - }); - }; +/** + * Mutation `useCreate` + * @summary Create position involved party + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreate` - * @summary Create position involved party - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof PositionInvolvedPartiesApi.create, - { officeId: string; positionId: string; data: CommonModels.CreateInvolvedPartyRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId } )); + return PositionInvolvedPartiesApi.create(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId })); - return PositionInvolvedPartiesApi.create(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update position involved party + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update position involved party - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof PositionInvolvedPartiesApi.update, - { officeId: string; positionId: string; partyId: string; data: CommonModels.UpdateInvolvedPartyDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, partyId, data }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId } )); + return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, partyId, data }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId })); - return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteOfficesPositionsInvolvedPartiesByPartyId` + * @summary Delete position involved party + * @permission Requires `canUseDeleteOfficesPositionsInvolvedPartiesByPartyId` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteOfficesPositionsInvolvedPartiesByPartyId` - * @summary Delete position involved party - * @permission Requires `canUseDeleteOfficesPositionsInvolvedPartiesByPartyId` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = ( - options?: AppMutationOptions< - typeof PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId, - { officeId: string; positionId: string; partyId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, partyId }) => { + checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId } )); + return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId(officeId, positionId, partyId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, partyId }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId })); - return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId( - officeId, - positionId, - partyId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts index 0060022..41a91df 100644 --- a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts +++ b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts @@ -1,29 +1,32 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace PositionProfitChangeTrackingAcl { - /** - * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. - * @description List position profit change groups - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.positionId positionId from positionId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query - */ - export const canUseFindProfitChangeGroups = (object?: { officeId: string; positionId: string }) => - ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Read", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) - >; +/** + * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. + * @description List position profit change groups + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.positionId positionId from positionId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query + */ +export const canUseFindProfitChangeGroups = ( + object?: { officeId: string, positionId: string, } +) => [ + "Read", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; + +/** + * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. + * @description Get position profit change group details + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.positionId positionId from positionId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query + */ +export const canUseFindProfitChangeGroupDetail = ( + object?: { officeId: string, positionId: string, } +) => [ + "Read", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; - /** - * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. - * @description Get position profit change group details - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.positionId positionId from positionId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query - */ - export const canUseFindProfitChangeGroupDetail = (object?: { officeId: string; positionId: string }) => - ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Read", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) - >; } diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts index ead5b67..fa66351 100644 --- a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts +++ b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts @@ -1,67 +1,29 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; export namespace PositionProfitChangeTrackingApi { - export const findProfitChangeGroups = ( - officeId: string, - positionId: string, - limit: number, - order?: string, - filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const findProfitChangeGroups = (officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { - resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema, - }, - `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findProfitChangeGroupDetail = ( - groupId: string, - officeId: string, - positionId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findProfitChangeGroupDetail = (groupId: string, officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, - `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, - config, - ); - }; + { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, + `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, + + ) +}; } diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts index 260a0d2..a7c8680 100644 --- a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts +++ b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts @@ -5,47 +5,47 @@ import { PositionProfitChangeTrackingQueries } from "./positionProfitChangeTrack import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; export namespace PositionProfitChangeTrackingConfigs { - export const profitChangeGroupsConfig = { +export const profitChangeGroupsConfig = { meta: { - title: "Profit Change Groups", + title: "Profit Change Groups", }, readAll: { - acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups, - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, - paginated: PositionProfitChangeTrackingQueries.useFindProfitChangeGroups, - infinite: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, - filters: { - schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, - options: { - inputs: { - userId: true, - dateFrom: true, - dateTo: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups, schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, - options: { - columns: { - id: true, - timestamp: true, - users: true, - profit: true, - changeCount: true, - }, - sortable: - PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, + paginated: PositionProfitChangeTrackingQueries.useFindProfitChangeGroups, + infinite: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, + filters: { + schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, + options: { + inputs: { + userId: true, + dateFrom: true, + dateTo: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, + options: { + columns: { + id: true, + timestamp: true, + users: true, + profit: true, + changeCount: true, + }, + sortable: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, + }, +}), }, read: { - acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema, - query: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, + acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, + schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema, + query: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, }, - }; +}; + } diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts index e06233f..c953904 100644 --- a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts +++ b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts @@ -2,116 +2,73 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionProfitChangeTrackingModels { - /** - * PositionAccountProfitChangeGroupDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto[] } users - * @property { object } profit - * @property { number } profit.amount - * @property { string } profit.currencyCode - * @property { number } changeCount - */ - export const PositionAccountProfitChangeGroupDtoSchema = z - .object({ - id: z.string(), - timestamp: z.iso.datetime({ offset: true }), - users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), - profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), - changeCount: z.number(), - }) - .readonly(); - export type PositionAccountProfitChangeGroupDto = z.infer; +/** + * PositionAccountProfitChangeGroupDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto[] } users + * @property { object } profit + * @property { number } profit.amount + * @property { string } profit.currencyCode + * @property { number } changeCount + */ +export const PositionAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema), profit: z.object({ amount: z.number(), currencyCode: z.string() }), changeCount: z.number() }); +export type PositionAccountProfitChangeGroupDto = z.infer; - /** - * PositionAccountProfitChangeEntryDtoSchema - * @type { object } - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto } user - * @property { number } changeNumber - * @property { number } oldProfit - * @property { number } newProfit - * @property { string } currencyCode - */ - export const PositionAccountProfitChangeEntryDtoSchema = z - .object({ - timestamp: z.iso.datetime({ offset: true }), - user: CommonModels.UserPreviewDtoSchema, - changeNumber: z.number(), - oldProfit: z.number(), - newProfit: z.number(), - currencyCode: z.string(), - }) - .readonly(); - export type PositionAccountProfitChangeEntryDto = z.infer; +/** + * PositionAccountProfitChangeEntryDtoSchema + * @type { object } + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto } user + * @property { number } changeNumber + * @property { number } oldProfit + * @property { number } newProfit + * @property { string } currencyCode + */ +export const PositionAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }); +export type PositionAccountProfitChangeEntryDto = z.infer; - /** - * PositionAccountProfitChangeGroupDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { string } currencyCode - * @property { PositionAccountProfitChangeEntryDto[] } entries - */ - export const PositionAccountProfitChangeGroupDetailDtoSchema = z - .object({ - id: z.string(), - timestamp: z.iso.datetime({ offset: true }), - currencyCode: z.string(), - entries: z.array(PositionAccountProfitChangeEntryDtoSchema).readonly(), - }) - .readonly(); - export type PositionAccountProfitChangeGroupDetailDto = z.infer< - typeof PositionAccountProfitChangeGroupDetailDtoSchema - >; +/** + * PositionAccountProfitChangeGroupDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { string } currencyCode + * @property { PositionAccountProfitChangeEntryDto[] } entries + */ +export const PositionAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(PositionAccountProfitChangeEntryDtoSchema) }); +export type PositionAccountProfitChangeGroupDetailDto = z.infer; - /** - * PositionProfitChangeTrackingFilterDtoSchema - * @type { object } - * @property { string } userId User IDs who made the changes - * @property { string } dateFrom Date range start - * @property { string } dateTo Date range end - */ - export const PositionProfitChangeTrackingFilterDtoSchema = z - .object({ - userId: z.string().describe("User IDs who made the changes"), - dateFrom: z.string().describe("Date range start"), - dateTo: z.string().describe("Date range end"), - }) - .readonly(); - export type PositionProfitChangeTrackingFilterDto = z.infer; +/** + * PositionProfitChangeTrackingFilterDtoSchema + * @type { object } + * @property { string } userId User IDs who made the changes + * @property { string } dateFrom Date range start + * @property { string } dateTo Date range end + */ +export const PositionProfitChangeTrackingFilterDtoSchema = z.object({ userId: z.string().nullable(), dateFrom: z.string().nullable(), dateTo: z.string().nullable() }).partial(); +export type PositionProfitChangeTrackingFilterDto = z.infer; - /** - * PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema - * @type { enum } - */ - export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema = z.enum([ - "timestamp", - "profitAmount", - "changeCount", - ]); - export type PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = z.infer< - typeof PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema - >; - export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = - PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema.enum; +/** + * PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema + * @type { enum } + */ +export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema = z.enum(["timestamp", "profitAmount", "changeCount"]); +export type PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = z.infer; +export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema.enum; + +/** + * PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionAccountProfitChangeGroupDto[] } items + */ +export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).nullable() }).partial().shape }); +export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; - /** - * PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionAccountProfitChangeGroupDto[] } items - */ - export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape, - }); - export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer< - typeof PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema - >; } diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts index 313343b..7c55275 100644 --- a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts +++ b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -8,201 +7,95 @@ import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracki import { PositionProfitChangeTrackingApi } from "./positionProfitChangeTracking.api"; export namespace PositionProfitChangeTrackingQueries { - export const moduleName = QueryModule.PositionProfitChangeTracking; +export const moduleName = QueryModule.PositionProfitChangeTracking; - export const keys = { +export const keys = { all: [moduleName] as const, - findProfitChangeGroups: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/account/profit-change-groups", - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - ] as const, - findProfitChangeGroupsInfinite: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/account/profit-change-groups", - "infinite", - officeId, - positionId, - limit, - order, - filter, - cursor, - ] as const, - findProfitChangeGroupDetail: (groupId: string, officeId: string, positionId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/account/profit-change-groups/:groupId", - groupId, - officeId, - positionId, - ] as const, - }; + findProfitChangeGroups: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", officeId, positionId, limit, order, filter, page, cursor] as const, + findProfitChangeGroupsInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", "infinite", officeId, positionId, limit, order, filter, cursor] as const, + findProfitChangeGroupDetail: (groupId: string, officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups/:groupId", groupId, officeId, positionId] as const, +}; - /** - * Query `useFindProfitChangeGroups` - * @summary List position profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` - * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroups = ( - { - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindProfitChangeGroups` + * @summary List position profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` + * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroups = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); + return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId })); - return PositionProfitChangeTrackingApi.findProfitChangeGroups( - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - }); - }; +/** + * Infinite query `useFindProfitChangeGroupsInfinite + * @summary List position profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` + * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupsInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useFindProfitChangeGroupsInfinite - * @summary List position profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` - * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroupsInfinite = ( - { - officeId, - positionId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); + return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId })); - return PositionProfitChangeTrackingApi.findProfitChangeGroups( - officeId, - positionId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Query `useFindProfitChangeGroupDetail` - * @summary Get position profit change group details - * @permission Requires `canUseFindProfitChangeGroupDetail` ability - * @param { string } object.groupId Path parameter - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroupDetail = ( - { groupId, officeId, positionId }: { groupId: string; officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindProfitChangeGroupDetail` + * @summary Get position profit change group details + * @permission Requires `canUseFindProfitChangeGroupDetail` ability + * @param { string } object.groupId Path parameter + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupDetail = ({ groupId, officeId, positionId }: { groupId: string, officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), + queryFn: () => { + checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId } )); + return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), - queryFn: () => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId })); - return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/positionRoutes/positionRoutes.acl.ts b/test/generated/base/positionRoutes/positionRoutes.acl.ts index 1ef520c..7cd4cb8 100644 --- a/test/generated/base/positionRoutes/positionRoutes.acl.ts +++ b/test/generated/base/positionRoutes/positionRoutes.acl.ts @@ -1,87 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace PositionRoutesAcl { - /** - * Use for `useListRoutes` query ability. For global ability, omit the object parameter. - * @description List position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query - */ - export const canUseListRoutes = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useListRoutes` query ability. For global ability, omit the object parameter. + * @description List position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query + */ +export const canUseListRoutes = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Create position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation - */ - export const canUseCreateRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Create position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation + */ +export const canUseCreateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Update position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation - */ - export const canUseUpdateRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Update position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation + */ +export const canUseUpdateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Delete position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation - */ - export const canUseDeleteRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Delete position route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation + */ +export const canUseDeleteRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. - * @description Split position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation - */ - export const canUseSplitRoutes = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. + * @description Split position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation + */ +export const canUseSplitRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. - * @description Merge position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation - */ - export const canUseMergeRoutes = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. + * @description Merge position routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation + */ +export const canUseMergeRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. + * @description Copy position route + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation + */ +export const canUseCopyRoute = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. - * @description Copy position route - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation - */ - export const canUseCopyRoute = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; } diff --git a/test/generated/base/positionRoutes/positionRoutes.api.ts b/test/generated/base/positionRoutes/positionRoutes.api.ts index 9330fa4..27b8e55 100644 --- a/test/generated/base/positionRoutes/positionRoutes.api.ts +++ b/test/generated/base/positionRoutes/positionRoutes.api.ts @@ -1,99 +1,60 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionRoutesApi { - export const listRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const listRoutes = (officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: CommonModels.RouteListResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes`, - config, - ); - }; - - export const createRoutePoint = ( - officeId: string, - positionId: string, - routeId: string, - data: CommonModels.CreateRoutePointRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.RouteListResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes`, + + ) +}; +export const createRoutePoint = (officeId: string, positionId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, ) => { return AppRestClient.post( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, - ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - config, - ); - }; - - export const updateRoutePoint = ( - officeId: string, - positionId: string, - routeId: string, - pointId: string, - data: CommonModels.UpdateRoutePointRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, + ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), + + ) +}; +export const updateRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, ) => { return AppRestClient.patch( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - config, - ); - }; - - export const deleteRoutePoint = ( - officeId: string, - positionId: string, - routeId: string, - pointId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, + ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), + + ) +}; +export const deleteRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - undefined, - config, - ); - }; - - export const splitRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, + + ) +}; +export const splitRoutes = (officeId: string, positionId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/split`, - undefined, - config, - ); - }; - - export const mergeRoutes = ( - officeId: string, - positionId: string, - data: CommonModels.MergeRoutesRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/split`, + + ) +}; +export const mergeRoutes = (officeId: string, positionId: string, data: CommonModels.MergeRoutesRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/merge`, - ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - config, - ); - }; - - export const copyRoute = ( - officeId: string, - positionId: string, - routeId: string, - data: CommonModels.CopyRouteRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/merge`, + ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), + + ) +}; +export const copyRoute = (officeId: string, positionId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, - ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, + ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/positionRoutes/positionRoutes.queries.ts b/test/generated/base/positionRoutes/positionRoutes.queries.ts index 78de073..b9544be 100644 --- a/test/generated/base/positionRoutes/positionRoutes.queries.ts +++ b/test/generated/base/positionRoutes/positionRoutes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,255 +8,205 @@ import { CommonModels } from "@/data/common/common.models"; import { PositionRoutesApi } from "./positionRoutes.api"; export namespace PositionRoutesQueries { - export const moduleName = QueryModule.PositionRoutes; +export const moduleName = QueryModule.PositionRoutes; - export const keys = { +export const keys = { all: [moduleName] as const, - listRoutes: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/routes", officeId, positionId] as const, - }; + listRoutes: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes", officeId, positionId] as const, +}; + +/** + * Query `useListRoutes` + * @summary List routes with points for a position (unified for sea/air/road) + * @permission Requires `canUseListRoutes` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoutes = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoutes(officeId, positionId), + queryFn: () => { + checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId } )); + return PositionRoutesApi.listRoutes(officeId, positionId) }, + ...options, + }); +}; + +/** + * Mutation `useCreateRoutePoint` + * @summary Create a route point + * @permission Requires `canUseCreateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, data }) => { + checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId } )); + return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateRoutePoint` + * @summary Update a route point + * @permission Requires `canUseUpdateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { + checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId } )); + return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRoutePoint` + * @summary Delete a route point + * @permission Requires `canUseDeleteRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, pointId }) => { + checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId } )); + return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useSplitRoutes` + * @summary Split routes by cargo (sea positions only) + * @permission Requires `canUseSplitRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId } )); + return PositionRoutesApi.splitRoutes(officeId, positionId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMergeRoutes` + * @summary Merge routes (sea positions only) + * @permission Requires `canUseMergeRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId } )); + return PositionRoutesApi.mergeRoutes(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopyRoute` + * @summary Copy route points to another route (sea positions only) + * @permission Requires `canUseCopyRoute` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, routeId, data }) => { + checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId } )); + return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useListRoutes` - * @summary List routes with points for a position (unified for sea/air/road) - * @permission Requires `canUseListRoutes` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListRoutes = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoutes(officeId, positionId), - queryFn: () => { - checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId })); - return PositionRoutesApi.listRoutes(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreateRoutePoint` - * @summary Create a route point - * @permission Requires `canUseCreateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateRoutePoint = ( - options?: AppMutationOptions< - typeof PositionRoutesApi.createRoutePoint, - { officeId: string; positionId: string; routeId: string; data: CommonModels.CreateRoutePointRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, data }) => { - checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId })); - return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateRoutePoint` - * @summary Update a route point - * @permission Requires `canUseUpdateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateRoutePoint = ( - options?: AppMutationOptions< - typeof PositionRoutesApi.updateRoutePoint, - { - officeId: string; - positionId: string; - routeId: string; - pointId: string; - data: CommonModels.UpdateRoutePointRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { - checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId })); - return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteRoutePoint` - * @summary Delete a route point - * @permission Requires `canUseDeleteRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteRoutePoint = ( - options?: AppMutationOptions< - typeof PositionRoutesApi.deleteRoutePoint, - { officeId: string; positionId: string; routeId: string; pointId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, pointId }) => { - checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId })); - return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useSplitRoutes` - * @summary Split routes by cargo (sea positions only) - * @permission Requires `canUseSplitRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useSplitRoutes = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId })); - return PositionRoutesApi.splitRoutes(officeId, positionId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useMergeRoutes` - * @summary Merge routes (sea positions only) - * @permission Requires `canUseMergeRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useMergeRoutes = ( - options?: AppMutationOptions< - typeof PositionRoutesApi.mergeRoutes, - { officeId: string; positionId: string; data: CommonModels.MergeRoutesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId })); - return PositionRoutesApi.mergeRoutes(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCopyRoute` - * @summary Copy route points to another route (sea positions only) - * @permission Requires `canUseCopyRoute` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useCopyRoute = ( - options?: AppMutationOptions< - typeof PositionRoutesApi.copyRoute, - { officeId: string; positionId: string; routeId: string; data: CommonModels.CopyRouteRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, data }) => { - checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId })); - return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/positions/positions.acl.ts b/test/generated/base/positions/positions.acl.ts index d2624a2..002471f 100644 --- a/test/generated/base/positions/positions.acl.ts +++ b/test/generated/base/positions/positions.acl.ts @@ -1,195 +1,212 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace PositionsAcl { - /** - * Use for `useFindAll` query ability. For global ability, omit the object parameter. - * @description List position labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Create", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useTotalProfit` query ability. For global ability, omit the object parameter. - * @description Fake endpoint - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTotalProfit` query - */ - export const canUseTotalProfit = (object?: { officeId: string }) => - ["TotalProfitView", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "TotalProfitView", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; - - /** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ - export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useExportPositions` mutation ability. For global ability, omit the object parameter. - * @description Export positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportPositions` mutation - */ - export const canUseExportPositions = (object?: { officeId: string }) => - ["Export", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Export", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useListRouteLabels` query ability. For global ability, omit the object parameter. - * @description List route labels for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRouteLabels` query - */ - export const canUseListRouteLabels = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useGetDuplicateDefaultParameters` query ability. For global ability, omit the object parameter. - * @description Read position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDuplicateDefaultParameters` query - */ - export const canUseGetDuplicateDefaultParameters = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ - export const canUseDuplicate = (object?: { officeId: string }) => - ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Create", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ - export const canUseCancel = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useRevertCancel` mutation ability. For global ability, omit the object parameter. - * @description Revert cancelled position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertCancel` mutation - */ - export const canUseRevertCancel = (object?: { officeId: string }) => - ["RevertCancel", object ? subject("Position", object) : "Position"] as AbilityTuple< - "RevertCancel", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useLinkChild` mutation ability. For global ability, omit the object parameter. - * @description Link positions to parent - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLinkChild` mutation - */ - export const canUseLinkChild = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useUnlinkChild` mutation ability. For global ability, omit the object parameter. - * @description Link positions to parent - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlinkChild` mutation - */ - export const canUseUnlinkChild = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useListChild` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListChild` query - */ - export const canUseListChild = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useFindAll` query ability. For global ability, omit the object parameter. + * @description List position labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query + */ +export const canUseFindAll = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useTotalProfit` query ability. For global ability, omit the object parameter. + * @description Fake endpoint + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTotalProfit` query + */ +export const canUseTotalProfit = ( + object?: { officeId: string, } +) => [ + "TotalProfitView", + object ? subject("PositionAccount", object) : "PositionAccount" +] as AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; + +/** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ +export const canUseListAvailablePartnersFor = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useExportPositions` mutation ability. For global ability, omit the object parameter. + * @description Export positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportPositions` mutation + */ +export const canUseExportPositions = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Export", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useListRouteLabels` query ability. For global ability, omit the object parameter. + * @description List route labels for position + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRouteLabels` query + */ +export const canUseListRouteLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useGetDuplicateDefaultParameters` query ability. For global ability, omit the object parameter. + * @description Read position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDuplicateDefaultParameters` query + */ +export const canUseGetDuplicateDefaultParameters = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ +export const canUseDuplicate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ +export const canUseCancel = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useRevertCancel` mutation ability. For global ability, omit the object parameter. + * @description Revert cancelled position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertCancel` mutation + */ +export const canUseRevertCancel = ( + object?: { officeId: string, } +) => [ + "RevertCancel", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useLinkChild` mutation ability. For global ability, omit the object parameter. + * @description Link positions to parent + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLinkChild` mutation + */ +export const canUseLinkChild = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUnlinkChild` mutation ability. For global ability, omit the object parameter. + * @description Link positions to parent + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlinkChild` mutation + */ +export const canUseUnlinkChild = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useListChild` query ability. For global ability, omit the object parameter. + * @description List positions for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListChild` query + */ +export const canUseListChild = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + } diff --git a/test/generated/base/positions/positions.api.ts b/test/generated/base/positions/positions.api.ts index 7793f57..35825af 100644 --- a/test/generated/base/positions/positions.api.ts +++ b/test/generated/base/positions/positions.api.ts @@ -1,277 +1,158 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PositionsModels } from "./positions.models"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionsApi { - export const findAll = ( - officeId: string, - limit: number, - filter?: PositionsModels.PositionLabelsFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const findAll = (officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: PositionsModels.PositionsFindAllResponseSchema }, - `/offices/${officeId}/positions/labels`, - { - ...config, - params: { - filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: PositionsModels.PositionFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionsModels.PositionsFindAllResponseSchema }, + `/offices/${officeId}/positions/labels`, + { + params: { + filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: PositionsModels.PositionsPaginateResponseSchema }, - `/offices/${officeId}/positions`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = ( - officeId: string, - data: PositionsModels.CreatePositionRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionsModels.PositionsPaginateResponseSchema }, + `/offices/${officeId}/positions`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: PositionsModels.CreatePositionRequestDto, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions`, - ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), - config, - ); - }; - - export const totalProfit = (officeId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions`, + ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), + + ) +}; +export const totalProfit = (officeId: string, ) => { return AppRestClient.get( - { resSchema: PositionsModels.TotalProfitResponseSchema }, - `/offices/${officeId}/positions/fake-total-profit`, - config, - ); - }; - - export const listAvailablePartnersFor = ( - officeId: string, - positionId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionsModels.TotalProfitResponseSchema }, + `/offices/${officeId}/positions/fake-total-profit`, + + ) +}; +export const listAvailablePartnersFor = (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { return AppRestClient.get( - { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/positions/${positionId}/available-partners`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { - type: "query", - name: "useCase", - }), - }, - }, - ); - }; - - export const exportPositions = ( - officeId: string, - data: PositionsModels.PositionExportRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/positions/${positionId}/available-partners`, + { + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), + }, + } + ) +}; +export const exportPositions = (officeId: string, data: PositionsModels.PositionExportRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/exports`, - ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/exports`, + ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const get = (officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}`, - config, - ); - }; - - export const update = ( - officeId: string, - positionId: string, - data: PositionsModels.UpdatePositionDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}`, + + ) +}; +export const update = (officeId: string, positionId: string, data: PositionsModels.UpdatePositionDto, ) => { return AppRestClient.patch( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}`, - ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), - config, - ); - }; - - export const listRouteLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}`, + ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), + + ) +}; +export const listRouteLabels = (officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/routes/labels`, - config, - ); - }; - - export const getDuplicateDefaultParameters = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, + `/offices/${officeId}/positions/${positionId}/routes/labels`, + + ) +}; +export const getDuplicateDefaultParameters = (officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, - config, - ); - }; - - export const duplicate = ( - officeId: string, - positionId: string, - data: PositionsModels.DuplicatePositionRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, + + ) +}; +export const duplicate = (officeId: string, positionId: string, data: PositionsModels.DuplicatePositionRequestDto, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/duplicate`, - ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), - config, - ); - }; - - export const cancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/duplicate`, + ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), + + ) +}; +export const cancel = (officeId: string, positionId: string, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/cancel`, - undefined, - config, - ); - }; - - export const revertCancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/cancel`, + + ) +}; +export const revertCancel = (officeId: string, positionId: string, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/uncancel`, - undefined, - config, - ); - }; - - export const linkChild = ( - officeId: string, - positionId: string, - data: PositionsModels.LinkChildPositionsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/uncancel`, + + ) +}; +export const linkChild = (officeId: string, positionId: string, data: PositionsModels.LinkChildPositionsRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/children`, - ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), - config, - ); - }; - - export const unlinkChild = ( - officeId: string, - positionId: string, - data: PositionsModels.UnlinkChildPositionsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/children`, + ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), + + ) +}; +export const unlinkChild = (officeId: string, positionId: string, data: PositionsModels.UnlinkChildPositionsRequestDto, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/children`, - ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), - config, - ); - }; - - export const listChild = ( - officeId: string, - positionId: string, - limit: number, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/children`, + ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), + + ) +}; +export const listChild = (officeId: string, positionId: string, limit: number, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: PositionsModels.ListChildResponseSchema }, - `/offices/${officeId}/positions/${positionId}/children`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; + { resSchema: PositionsModels.ListChildResponseSchema }, + `/offices/${officeId}/positions/${positionId}/children`, + { + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; } diff --git a/test/generated/base/positions/positions.configs.ts b/test/generated/base/positions/positions.configs.ts index a75b161..0e9cfce 100644 --- a/test/generated/base/positions/positions.configs.ts +++ b/test/generated/base/positions/positions.configs.ts @@ -6,253 +6,254 @@ import { PositionsQueries } from "./positions.queries"; import { PositionsAcl } from "./positions.acl"; export namespace PositionsConfigs { - export const positionsConfig = { +export const positionsConfig = { meta: { - title: "Positions", + title: "Positions", }, readAll: { - acl: PositionsAcl.canUsePaginate, - schema: PositionsModels.PositionPreviewResponseDtoSchema, - paginated: PositionsQueries.usePaginate, - infinite: PositionsQueries.usePaginateInfinite, - filters: { - schema: PositionsModels.PositionFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionsModels.PositionFilterDtoSchema, - options: { - inputs: { - transportMode: true, - customerId: true, - carrierId: true, - consigneeId: true, - isCancelled: true, - status: true, - number: true, - direction: true, - loadType: true, - serviceType: true, - employee: true, - searchQuery: true, - externalSystemId: true, - createdAt: true, - serviceDate: true, - departureDate: true, - arrivalDate: true, - blfromCostumerDate: true, - blfromCarrierDate: true, - customsDate: true, - vgmCustomerDate: true, - partnerNetworkId: true, - projectLiteId: true, - checklistItemsDone: true, - checklistItemsNotDone: true, - routing: true, - isExcludedFromStatistics: true, - isMasterPosition: true, - loadingPortId: true, - dischargePortId: true, - customerReference: true, - carrierReference: true, - consigneeReference: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: PositionsAcl.canUsePaginate, schema: PositionsModels.PositionPreviewResponseDtoSchema, - options: { - columns: { - id: true, - externalSystemId: true, - transportMode: true, - direction: true, - loadType: true, - createdAt: true, - number: true, - isCancelled: true, - customer: true, - customerReference: true, - consignee: true, - consigneeReference: true, - carrier: true, - carrierReference: true, - positionNumber: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - origin: true, - loadDate: true, - loadingPort: true, - dischargePort: true, - destination: true, - deliveryDate: true, - equipment: true, - serviceType: true, - destinationOffice: true, - currency: true, - profit: true, - margin: true, - employee: true, - project: true, - serviceDate: true, - departureDate: true, - arrivalDate: true, - blfromCostumerDate: true, - blfromCarrierDate: true, - customsDate: true, - vgmCustomerDate: true, - routing: true, - notes: true, - isMasterPosition: true, - hasInvoices: true, - parentPosition: true, - }, - sortable: PositionsModels.PositionsPaginateOrderParamEnumSchema, + paginated: PositionsQueries.usePaginate, + infinite: PositionsQueries.usePaginateInfinite, + filters: { + schema: PositionsModels.PositionFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionsModels.PositionFilterDtoSchema, + options: { + inputs: { + transportMode: true, + customerId: true, + carrierId: true, + consigneeId: true, + isCancelled: true, + status: true, + number: true, + direction: true, + loadType: true, + serviceType: true, + employee: true, + searchQuery: true, + externalSystemId: true, + createdAt: true, + serviceDate: true, + departureDate: true, + arrivalDate: true, + blfromCostumerDate: true, + blfromCarrierDate: true, + customsDate: true, + vgmCustomerDate: true, + partnerNetworkId: true, + projectLiteId: true, + checklistItemsDone: true, + checklistItemsNotDone: true, + routing: true, + isExcludedFromStatistics: true, + isMasterPosition: true, + loadingPortId: true, + dischargePortId: true, + customerReference: true, + carrierReference: true, + consigneeReference: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: PositionsModels.PositionPreviewResponseDtoSchema, + options: { + columns: { + id: true, + externalSystemId: true, + transportMode: true, + direction: true, + loadType: true, + createdAt: true, + number: true, + isCancelled: true, + customer: true, + customerReference: true, + consignee: true, + consigneeReference: true, + carrier: true, + carrierReference: true, + positionNumber: true, + hblNumber: true, + mblNumber: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + origin: true, + loadDate: true, + loadingPort: true, + dischargePort: true, + destination: true, + deliveryDate: true, + equipment: true, + serviceType: true, + destinationOffice: true, + currency: true, + profit: true, + margin: true, + employee: true, + project: true, + serviceDate: true, + departureDate: true, + arrivalDate: true, + blfromCostumerDate: true, + blfromCarrierDate: true, + customsDate: true, + vgmCustomerDate: true, + routing: true, + notes: true, + isMasterPosition: true, + hasInvoices: true, + parentPosition: true, + }, + sortable: PositionsModels.PositionsPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: PositionsAcl.canUseGet, - schema: CommonModels.PositionCoreResponseDtoSchema, - query: PositionsQueries.useGet, + acl: PositionsAcl.canUseGet, + schema: CommonModels.PositionCoreResponseDtoSchema, + query: PositionsQueries.useGet, }, create: { - acl: PositionsAcl.canUseCreate, - schema: PositionsModels.CreatePositionRequestDtoSchema, - mutation: PositionsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: PositionsAcl.canUseCreate, schema: PositionsModels.CreatePositionRequestDtoSchema, - options: { - inputs: { - section: true, - direction: true, - transportMode: true, - loadType: true, - serviceType: true, - estimatedServiceDate: true, - customerBusinessPartnerId: true, - }, - }, - }), + mutation: PositionsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: PositionsModels.CreatePositionRequestDtoSchema, + options: { + inputs: { + section: true, + direction: true, + transportMode: true, + loadType: true, + serviceType: true, + estimatedServiceDate: true, + customerBusinessPartnerId: true, + }, + }, +}) }, update: { - acl: PositionsAcl.canUseUpdate, - schema: PositionsModels.UpdatePositionDtoSchema, - mutation: PositionsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: PositionsAcl.canUseUpdate, schema: PositionsModels.UpdatePositionDtoSchema, - options: { - inputs: { - externalSystemId: true, - statusDate: true, - status: true, - loadType: true, - incoterms: true, - secondIncoterms: true, - fillingCompany: true, - sellingContract: true, - fillingScacCode: true, - serviceValidity: true, - ratesValidity: true, - serviceType: true, - buyRateReference: true, - frequency: true, - isParentPosition: true, - isExcludedFromStatistics: true, - team: true, - salesRepId: true, - responsibleEmployeeId: true, - receivedByEmployeeId: true, - originOfficeId: true, - projectLiteId: true, - notes: true, - inttraTypeOfMove: true, - volumetricWeightModifier: true, - }, - }, - }), + mutation: PositionsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: PositionsModels.UpdatePositionDtoSchema, + options: { + inputs: { + externalSystemId: true, + statusDate: true, + status: true, + loadType: true, + incoterms: true, + secondIncoterms: true, + fillingCompany: true, + sellingContract: true, + fillingScacCode: true, + serviceValidity: true, + ratesValidity: true, + serviceType: true, + buyRateReference: true, + frequency: true, + isParentPosition: true, + isExcludedFromStatistics: true, + team: true, + salesRepId: true, + responsibleEmployeeId: true, + receivedByEmployeeId: true, + originOfficeId: true, + projectLiteId: true, + notes: true, + inttraTypeOfMove: true, + volumetricWeightModifier: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: PositionsAcl.canUseFindAll, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PositionsQueries.useFindAll, - infinite: PositionsQueries.useFindAllInfinite, - filters: { - schema: PositionsModels.PositionLabelsFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionsModels.PositionLabelsFilterDtoSchema, - options: { - inputs: { - search: true, - isParentPosition: true, - isLinkedPosition: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: PositionsAcl.canUseFindAll, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, + paginated: PositionsQueries.useFindAll, + infinite: PositionsQueries.useFindAllInfinite, + filters: { + schema: PositionsModels.PositionLabelsFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: PositionsModels.PositionLabelsFilterDtoSchema, + options: { + inputs: { + search: true, + isParentPosition: true, + isLinkedPosition: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + }, +}), + }, +}; - export const childrenConfig = { +export const childrenConfig = { meta: { - title: "Children", + title: "Children", }, readAll: { - acl: PositionsAcl.canUseListChild, - schema: PositionsModels.ChildPositionResponseDtoSchema, - paginated: PositionsQueries.useListChild, - infinite: PositionsQueries.useListChildInfinite, - columns: dynamicColumns({ + acl: PositionsAcl.canUseListChild, schema: PositionsModels.ChildPositionResponseDtoSchema, - options: { - columns: { - id: true, - number: true, - packages: true, - weight: true, - volume: true, - customer: true, - profit: true, - }, - }, - }), + paginated: PositionsQueries.useListChild, + infinite: PositionsQueries.useListChildInfinite, + columns: dynamicColumns({ + schema: PositionsModels.ChildPositionResponseDtoSchema, + options: { + columns: { + id: true, + number: true, + packages: true, + weight: true, + volume: true, + customer: true, + profit: true, + }, + }, +}), }, create: { - acl: PositionsAcl.canUseLinkChild, - schema: PositionsModels.LinkChildPositionsRequestDtoSchema, - mutation: PositionsQueries.useLinkChild, - inputDefs: dynamicInputs({ + acl: PositionsAcl.canUseLinkChild, schema: PositionsModels.LinkChildPositionsRequestDtoSchema, - options: { - inputs: { - childPositionIds: true, - }, - }, - }), + mutation: PositionsQueries.useLinkChild, + inputDefs: dynamicInputs({ + schema: PositionsModels.LinkChildPositionsRequestDtoSchema, + options: { + inputs: { + childPositionIds: true, + }, + }, +}) }, - }; +}; + } diff --git a/test/generated/base/positions/positions.models.ts b/test/generated/base/positions/positions.models.ts index 8949f00..9c02819 100644 --- a/test/generated/base/positions/positions.models.ts +++ b/test/generated/base/positions/positions.models.ts @@ -2,887 +2,500 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionsModels { - /** - * PositionPreviewResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } externalSystemId - * @property { CommonModels.TransportModeEnum } transportMode - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { string } createdAt - * @property { string } number - * @property { boolean } isCancelled - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { string } customer.phone - * @property { string } customer.email - * @property { string } customerReference - * @property { object } consignee - * @property { string } consignee.id - * @property { string } consignee.name - * @property { string } consignee.matchCode - * @property { string } consignee.label - * @property { string } consigneeReference - * @property { object } carrier - * @property { string } carrier.id - * @property { string } carrier.name - * @property { string } carrier.matchCode - * @property { string } carrier.label - * @property { string } carrierReference - * @property { number } positionNumber - * @property { string } hblNumber - * @property { string } mblNumber - * @property { string } bookingNumber - * @property { string } vessel - * @property { string } voyage - * @property { string } vesselCarrier Carrier name from route point (sea positions only) - * @property { object } origin - * @property { string } origin.id - * @property { string } origin.name - * @property { string } loadDate - * @property { object } loadingPort - * @property { string } loadingPort.id - * @property { string } loadingPort.name - * @property { object } dischargePort - * @property { string } dischargePort.id - * @property { string } dischargePort.name - * @property { object } destination - * @property { string } destination.id - * @property { string } destination.name - * @property { string } deliveryDate - * @property { string } equipment - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { object } destinationOffice - * @property { string } destinationOffice.id - * @property { string } destinationOffice.name - * @property { string } currency - * @property { number } profit - * @property { number } margin - * @property { object } employee - * @property { string } employee.id - * @property { string } employee.name - * @property { object } project - * @property { string } project.id - * @property { string } project.name - * @property { string } serviceDate - * @property { string } departureDate - * @property { string } arrivalDate - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.EditorContentResponseDto } notes Notes - * @property { boolean } isMasterPosition - * @property { boolean } hasInvoices Whether this position has at least one invoice - * @property { object } parentPosition - * @property { string } parentPosition.id - * @property { string } parentPosition.number - */ - export const PositionPreviewResponseDtoSchema = z - .object({ - id: z.string(), - externalSystemId: z.string().nullish(), - transportMode: CommonModels.TransportModeEnumSchema, - direction: CommonModels.DirectionEnumSchema, - loadType: CommonModels.LoadTypeEnumSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }).nullish(), - number: z.string(), - isCancelled: z.boolean(), - customer: z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string(), - phone: z.string().nullish(), - email: z.string().nullish(), - }) - .readonly(), - customerReference: z.string().nullish(), - consignee: z - .object({ - id: z.string().nullable(), - name: z.string().nullable(), - matchCode: z.string().nullable(), - label: z.string().nullable(), - }) - .readonly() - .nullish(), - consigneeReference: z.string().nullish(), - carrier: z - .object({ - id: z.string().nullable(), - name: z.string().nullable(), - matchCode: z.string().nullable(), - label: z.string().nullable(), - }) - .readonly() - .nullish(), - carrierReference: z.string().nullish(), - positionNumber: z.number().nullish(), - hblNumber: z.string().nullish(), - mblNumber: z.string().nullish(), - bookingNumber: z.string().nullish(), - vessel: z.string().nullish(), - voyage: z.string().nullish(), - vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), - origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - loadDate: z.iso.datetime({ offset: true }).nullish(), - loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - deliveryDate: z.iso.datetime({ offset: true }).nullish(), - equipment: z.string().nullish(), - serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), - destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - currency: z.string().nullish(), - profit: z.number().nullish(), - margin: z.number().nullish(), - employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - serviceDate: z.iso.datetime({ offset: true }).nullish(), - departureDate: z.iso.datetime({ offset: true }).nullish(), - arrivalDate: z.iso.datetime({ offset: true }).nullish(), - blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), - blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), - customsDate: z.iso.datetime({ offset: true }).nullish(), - vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), - routing: CommonModels.SeaRoutingEnumSchema.nullish(), - notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), - isMasterPosition: z.boolean(), - hasInvoices: z.boolean().describe("Whether this position has at least one invoice").nullish(), - parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).readonly().nullish(), - }) - .readonly(); - export type PositionPreviewResponseDto = z.infer; - - /** - * PositionFilterDtoSchema - * @type { object } - * @property { CommonModels.TransportModeEnum } transportMode - * @property { string[] } customerId - * @property { string[] } carrierId Filter positions by carrier IDs - * @property { string[] } consigneeId Filter positions by consignee IDs - * @property { boolean } isCancelled - * @property { CommonModels.PositionStatusEnum } status - * @property { string } number - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } employee Filter positions by employee IDs - * @property { string } searchQuery - * @property { string } externalSystemId Filter positions by external system ID (substring match) - * @property { CommonModels.DateRangeDto } createdAt - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.DateRangeDto } departureDate - * @property { CommonModels.DateRangeDto } arrivalDate - * @property { CommonModels.DateRangeDto } blfromCostumerDate - * @property { CommonModels.DateRangeDto } blfromCarrierDate - * @property { CommonModels.DateRangeDto } customsDate - * @property { CommonModels.DateRangeDto } vgmCustomerDate - * @property { string } partnerNetworkId Filter positions by partner network ID - * @property { string[] } projectLiteId Filter positions by project IDs - * @property { string[] } checklistItemsDone Checklist item ids that must be completed - * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics - * @property { boolean } isMasterPosition - * @property { string[] } loadingPortId Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure) - * @property { string[] } dischargePortId Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport) - * @property { string } customerReference Filter positions by customer reference - * @property { string } carrierReference Filter positions by carrier reference - * @property { string } consigneeReference Filter positions by consignee reference - * @property { string } hblNumber Filter positions by HBL/HAWB number - * @property { string } mblNumber Filter positions by MBL/MAWB number - * @property { string } bookingNumber Filter positions by booking number - * @property { string } vessel Filter positions by vessel name - * @property { string } voyage Filter positions by voyage number - * @property { string } vesselCarrier Filter positions by vessel or carrier name - */ - export const PositionFilterDtoSchema = z - .object({ - transportMode: CommonModels.TransportModeEnumSchema, - customerId: z.array(z.string()).readonly(), - carrierId: z.array(z.string()).readonly().describe("Filter positions by carrier IDs"), - consigneeId: z.array(z.string()).readonly().describe("Filter positions by consignee IDs"), - isCancelled: z.boolean(), - status: CommonModels.PositionStatusEnumSchema, - number: z.string(), - direction: CommonModels.DirectionEnumSchema, - loadType: CommonModels.LoadTypeEnumSchema, - serviceType: CommonModels.ServiceTypeEnumSchema, - employee: z.array(z.string()).readonly().describe("Filter positions by employee IDs"), - searchQuery: z.string(), - externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), - createdAt: CommonModels.DateRangeDtoSchema, - serviceDate: CommonModels.DateRangeDtoSchema, - departureDate: CommonModels.DateRangeDtoSchema, - arrivalDate: CommonModels.DateRangeDtoSchema, - blfromCostumerDate: CommonModels.DateRangeDtoSchema, - blfromCarrierDate: CommonModels.DateRangeDtoSchema, - customsDate: CommonModels.DateRangeDtoSchema, - vgmCustomerDate: CommonModels.DateRangeDtoSchema, - partnerNetworkId: z.string().describe("Filter positions by partner network ID"), - projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), - checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), - checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), - routing: CommonModels.SeaRoutingEnumSchema, - isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - isMasterPosition: z.boolean(), - loadingPortId: z - .array(z.string()) - .readonly() - .describe( - "Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure)", - ), - dischargePortId: z - .array(z.string()) - .readonly() - .describe( - "Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport)", - ), - customerReference: z.string().describe("Filter positions by customer reference"), - carrierReference: z.string().describe("Filter positions by carrier reference"), - consigneeReference: z.string().describe("Filter positions by consignee reference"), - hblNumber: z.string().describe("Filter positions by HBL/HAWB number"), - mblNumber: z.string().describe("Filter positions by MBL/MAWB number"), - bookingNumber: z.string().describe("Filter positions by booking number"), - vessel: z.string().describe("Filter positions by vessel name"), - voyage: z.string().describe("Filter positions by voyage number"), - vesselCarrier: z.string().describe("Filter positions by vessel or carrier name"), - }) - .readonly(); - export type PositionFilterDto = z.infer; - - /** - * PositionExportFilterDtoSchema - * @type { object } - * @property { CommonModels.TransportModeEnum } transportMode - * @property { string[] } customerId - * @property { boolean } isCancelled - * @property { CommonModels.PositionStatusEnum } status - * @property { string } number - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } responsibleEmployee Filter positions by responsible employee IDs - * @property { string } searchQuery - * @property { string } externalSystemId Filter positions by external system ID (substring match) - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.DateRangeDto } dateOfDeparture - * @property { CommonModels.DateRangeDto } dateOfArrival - * @property { CommonModels.DateRangeDto } blfromCostumerDate - * @property { CommonModels.DateRangeDto } blfromCarrierDate - * @property { CommonModels.DateRangeDto } customsDate - * @property { CommonModels.DateRangeDto } vgmCustomerDate - * @property { string } partnerNetworkId Filter positions by partner network ID - * @property { string[] } projectLiteId Filter positions by project IDs - * @property { string[] } checklistItemsDone Checklist item ids that must be completed - * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics - */ - export const PositionExportFilterDtoSchema = z - .object({ - transportMode: CommonModels.TransportModeEnumSchema, - customerId: z.array(z.string()).readonly(), - isCancelled: z.boolean(), - status: CommonModels.PositionStatusEnumSchema, - number: z.string(), - direction: CommonModels.DirectionEnumSchema, - loadType: CommonModels.LoadTypeEnumSchema, - serviceType: CommonModels.ServiceTypeEnumSchema, - responsibleEmployee: z.array(z.string()).readonly().describe("Filter positions by responsible employee IDs"), - searchQuery: z.string(), - externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), - statusDate: CommonModels.DateRangeDtoSchema, - serviceDate: CommonModels.DateRangeDtoSchema, - dateOfDeparture: CommonModels.DateRangeDtoSchema, - dateOfArrival: CommonModels.DateRangeDtoSchema, - blfromCostumerDate: CommonModels.DateRangeDtoSchema, - blfromCarrierDate: CommonModels.DateRangeDtoSchema, - customsDate: CommonModels.DateRangeDtoSchema, - vgmCustomerDate: CommonModels.DateRangeDtoSchema, - partnerNetworkId: z.string().describe("Filter positions by partner network ID"), - projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), - checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), - checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), - routing: CommonModels.SeaRoutingEnumSchema, - isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - }) - .readonly(); - export type PositionExportFilterDto = z.infer; - - /** - * PositionExportColumnSchema - * @type { enum } - */ - export const PositionExportColumnSchema = z.enum([ - "id", - "externalSystemId", - "transportMode", - "direction", - "loadType", - "createdAt", - "number", - "isCancelled", - "customerName", - "customerPhone", - "customerEmail", - "customerReference", - "consigneeName", - "consigneeReference", - "carrierName", - "carrierReference", - "positionNumber", - "hblNumber", - "mblNumber", - "bookingNumber", - "vessel", - "voyage", - "originName", - "loadDate", - "loadingPortName", - "dischargePortName", - "destinationName", - "deliveryDate", - "equipment", - "serviceTypeName", - "departureDate", - "arrivalDate", - "destinationOfficeName", - "currency", - "profit", - "margin", - "employeeName", - "projectName", - "serviceDate", - "routing", - "notes", - "blFromCustomerDate", - "blFromCarrierDate", - "customsDate", - "vgmCustomerDate", - "isMasterPosition", - "parentPositionId", - "parentPositionNumber", - ]); - export type PositionExportColumn = z.infer; - export const PositionExportColumn = PositionExportColumnSchema.enum; - - /** - * PositionExportRequestDtoSchema - * @type { object } - * @property { string } order Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @property { PositionExportColumn[] } columns Min Items: `1` - * @property { PositionExportFilterDto } filter - */ - export const PositionExportRequestDtoSchema = z - .object({ - order: z - .string() - .describe( - "Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition", - ), - columns: z.array(PositionExportColumnSchema).readonly().min(1), - filter: PositionExportFilterDtoSchema, - }) - .readonly(); - export type PositionExportRequestDto = z.infer; - - /** - * CreatePositionRequestDtoSchema - * @type { object } - * @property { CommonModels.SectionEnum } section - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum } transportMode - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } estimatedServiceDate - * @property { string } customerBusinessPartnerId - */ - export const CreatePositionRequestDtoSchema = z - .object({ - section: CommonModels.SectionEnumSchema, - direction: CommonModels.DirectionEnumSchema, - transportMode: CommonModels.TransportModeEnumSchema, - loadType: CommonModels.LoadTypeEnumSchema, - serviceType: CommonModels.ServiceTypeEnumSchema, - estimatedServiceDate: z.iso.datetime({ offset: true }), - customerBusinessPartnerId: z.string(), - }) - .readonly(); - export type CreatePositionRequestDto = z.infer; - - /** - * DuplicatePositionPackageInformationParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } packageType - * @property { boolean } packageQuantity - * @property { boolean } packageDescription - * @property { boolean } packageHsCodes - * @property { boolean } packageNetWeight - * @property { boolean } packageGrossWeight - * @property { boolean } packageCaseMark - * @property { boolean } packageNote - * @property { boolean } packageCustomsMark - */ - export const DuplicatePositionPackageInformationParametersDtoSchema = z - .object({ - enabled: z.boolean(), - packageType: z.boolean(), - packageQuantity: z.boolean(), - packageDescription: z.boolean(), - packageHsCodes: z.boolean(), - packageNetWeight: z.boolean(), - packageGrossWeight: z.boolean(), - packageCaseMark: z.boolean(), - packageNote: z.boolean(), - packageCustomsMark: z.boolean(), - }) - .readonly(); - export type DuplicatePositionPackageInformationParametersDto = z.infer< - typeof DuplicatePositionPackageInformationParametersDtoSchema - >; - - /** - * DuplicatePositionCargoParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { DuplicatePositionPackageInformationParametersDto } packageInformation - */ - export const DuplicatePositionCargoParametersDtoSchema = z - .object({ enabled: z.boolean(), packageInformation: DuplicatePositionPackageInformationParametersDtoSchema }) - .readonly(); - export type DuplicatePositionCargoParametersDto = z.infer; - - /** - * DuplicatePositionOverviewParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } quoteReference - */ - export const DuplicatePositionOverviewParametersDtoSchema = z - .object({ enabled: z.boolean(), quoteReference: z.boolean() }) - .readonly(); - export type DuplicatePositionOverviewParametersDto = z.infer; - - /** - * DuplicatePositionInvolvedPartiesParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } involvedPartySection - */ - export const DuplicatePositionInvolvedPartiesParametersDtoSchema = z - .object({ enabled: z.boolean(), involvedPartySection: z.boolean() }) - .readonly(); - export type DuplicatePositionInvolvedPartiesParametersDto = z.infer< - typeof DuplicatePositionInvolvedPartiesParametersDtoSchema - >; - - /** - * DuplicatePositionRoutesParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } routeDates - * @property { boolean } routeLocation - */ - export const DuplicatePositionRoutesParametersDtoSchema = z - .object({ enabled: z.boolean(), routeDates: z.boolean(), routeLocation: z.boolean() }) - .readonly(); - export type DuplicatePositionRoutesParametersDto = z.infer; - - /** - * DuplicatePositionFinanceAccountParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } exchangeRate - */ - export const DuplicatePositionFinanceAccountParametersDtoSchema = z - .object({ enabled: z.boolean(), exchangeRate: z.boolean() }) - .readonly(); - export type DuplicatePositionFinanceAccountParametersDto = z.infer< - typeof DuplicatePositionFinanceAccountParametersDtoSchema - >; - - /** - * DuplicatePositionDocumentsParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } hblWorkingDocument - * @property { boolean } siWorkingDocument - */ - export const DuplicatePositionDocumentsParametersDtoSchema = z - .object({ enabled: z.boolean(), hblWorkingDocument: z.boolean(), siWorkingDocument: z.boolean() }) - .readonly(); - export type DuplicatePositionDocumentsParametersDto = z.infer; - - /** - * DuplicatePositionParametersDtoSchema - * @type { object } - * @property { DuplicatePositionOverviewParametersDto } overview - * @property { DuplicatePositionInvolvedPartiesParametersDto } involvedParties - * @property { DuplicatePositionCargoParametersDto } cargo - * @property { DuplicatePositionRoutesParametersDto } routes - * @property { DuplicatePositionFinanceAccountParametersDto } financeAccount - * @property { DuplicatePositionDocumentsParametersDto } documents - */ - export const DuplicatePositionParametersDtoSchema = z - .object({ - overview: DuplicatePositionOverviewParametersDtoSchema, - involvedParties: DuplicatePositionInvolvedPartiesParametersDtoSchema, - cargo: DuplicatePositionCargoParametersDtoSchema, - routes: DuplicatePositionRoutesParametersDtoSchema, - financeAccount: DuplicatePositionFinanceAccountParametersDtoSchema, - documents: DuplicatePositionDocumentsParametersDtoSchema, - }) - .readonly(); - export type DuplicatePositionParametersDto = z.infer; - - /** - * DuplicatePositionDefaultParametersResponseDtoSchema - * @type { object } - * @property { string } estimatedServiceDate Suggested estimated service date for the duplicated position (ISO 8601) - * @property { DuplicatePositionParametersDto } parameters Default duplication parameters with section and sub-parameter flags - */ - export const DuplicatePositionDefaultParametersResponseDtoSchema = z - .object({ - estimatedServiceDate: z - .string() - .describe("Suggested estimated service date for the duplicated position (ISO 8601)"), - parameters: DuplicatePositionParametersDtoSchema.describe( - "Default duplication parameters with section and sub-parameter flags", - ), - }) - .readonly(); - export type DuplicatePositionDefaultParametersResponseDto = z.infer< - typeof DuplicatePositionDefaultParametersResponseDtoSchema - >; - - /** - * PositionSectionEnumSchema - * @type { enum } - */ - export const PositionSectionEnumSchema = z.enum([ - "overview", - "involvedParties", - "cargo", - "financeAccount", - "routes", - "routeDates", - "documents", - ]); - export type PositionSectionEnum = z.infer; - export const PositionSectionEnum = PositionSectionEnumSchema.enum; - - /** - * DuplicatePositionRequestDtoSchema - * @type { object } - * @property { PositionSectionEnum[] } sections Legacy: sections to duplicate. Ignored when parameters is provided. - * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. - * @property { string } estimatedServiceDate - */ - export const DuplicatePositionRequestDtoSchema = z - .object({ - sections: z - .array(PositionSectionEnumSchema) - .readonly() - .describe("Legacy: sections to duplicate. Ignored when parameters is provided.") - .nullish(), - parameters: DuplicatePositionParametersDtoSchema.describe( - "Nested parameters for duplication control. Preferred over sections.", - ).nullish(), - estimatedServiceDate: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type DuplicatePositionRequestDto = z.infer; - - /** - * UpdatePositionDtoSchema - * @type { object } - * @property { string } externalSystemId - * @property { string } statusDate - * @property { CommonModels.PositionStatusEnum } status - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.IncotermsEnum } incoterms - * @property { CommonModels.IncotermsEnum } secondIncoterms - * @property { string } fillingCompany - * @property { string } sellingContract - * @property { string } fillingScacCode - * @property { string } serviceValidity - * @property { string } ratesValidity - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } buyRateReference - * @property { CommonModels.FrequencyEnum } frequency - * @property { boolean } isParentPosition - * @property { boolean } isExcludedFromStatistics - * @property { string } team - * @property { string } salesRepId - * @property { string } responsibleEmployeeId - * @property { string } receivedByEmployeeId - * @property { string } originOfficeId - * @property { string } projectLiteId - * @property { CommonModels.EditorContentUpdateDto } notes Notes - * @property { CommonModels.MovementTypeEnum } inttraTypeOfMove - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ - export const UpdatePositionDtoSchema = z - .object({ - externalSystemId: z.string(), - statusDate: z.iso.datetime({ offset: true }), - status: CommonModels.PositionStatusEnumSchema, - loadType: CommonModels.LoadTypeEnumSchema, - incoterms: CommonModels.IncotermsEnumSchema, - secondIncoterms: CommonModels.IncotermsEnumSchema, - fillingCompany: z.string(), - sellingContract: z.string(), - fillingScacCode: z.string(), - serviceValidity: z.iso.datetime({ offset: true }), - ratesValidity: z.iso.datetime({ offset: true }), - serviceType: CommonModels.ServiceTypeEnumSchema, - buyRateReference: z.string(), - frequency: CommonModels.FrequencyEnumSchema, - isParentPosition: z.boolean(), - isExcludedFromStatistics: z.boolean(), - team: z.string(), - salesRepId: z.string(), - responsibleEmployeeId: z.string(), - receivedByEmployeeId: z.string(), - originOfficeId: z.string(), - projectLiteId: z.string(), - notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), - inttraTypeOfMove: CommonModels.MovementTypeEnumSchema, - volumetricWeightModifier: z.number().describe("Volumetric weight modifier"), - }) - .readonly(); - export type UpdatePositionDto = z.infer; - - /** - * ChildPositionCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ChildPositionCustomerDto = z.infer; - - /** - * ChildPositionProfitDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currency - */ - export const ChildPositionProfitDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); - export type ChildPositionProfitDto = z.infer; - - /** - * ChildPositionResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { number } packages - * @property { number } weight - * @property { number } volume - * @property { ChildPositionCustomerDto } customer - * @property { ChildPositionProfitDto } profit - */ - export const ChildPositionResponseDtoSchema = z - .object({ - id: z.string(), - number: z.string(), - packages: z.number(), - weight: z.number(), - volume: z.number(), - customer: ChildPositionCustomerDtoSchema, - profit: ChildPositionProfitDtoSchema, - }) - .readonly(); - export type ChildPositionResponseDto = z.infer; - - /** - * PositionLabelsFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } isParentPosition - * @property { boolean } isLinkedPosition - */ - export const PositionLabelsFilterDtoSchema = z - .object({ search: z.string(), isParentPosition: z.boolean(), isLinkedPosition: z.boolean() }) - .readonly(); - export type PositionLabelsFilterDto = z.infer; - - /** - * PositionListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ - export const PositionListResponseDtoSchema = z - .object({ - items: z.array(z.string()).readonly().describe("Items"), - totalProfit: z.number(), - profitPerPosition: z.number(), - page: z.number().describe("1-indexed page number to begin from").nullish(), - cursor: z.string().describe("ID of item to start after").nullish(), - nextCursor: z.string().describe("Cursor for next set of items").nullish(), - limit: z.number().describe("Items per response"), - totalItems: z.number().describe("Total available items"), - }) - .readonly(); - export type PositionListResponseDto = z.infer; - - /** - * LinkChildPositionsRequestDtoSchema - * @type { object } - * @property { string[] } childPositionIds - */ - export const LinkChildPositionsRequestDtoSchema = z - .object({ childPositionIds: z.array(z.string()).readonly() }) - .readonly(); - export type LinkChildPositionsRequestDto = z.infer; - - /** - * UnlinkChildPositionsRequestDtoSchema - * @type { object } - * @property { string[] } childPositionIds - */ - export const UnlinkChildPositionsRequestDtoSchema = z - .object({ childPositionIds: z.array(z.string()).readonly() }) - .readonly(); - export type UnlinkChildPositionsRequestDto = z.infer; - - /** - * PositionsFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PositionsFindAllResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PositionsFindAllResponse = z.infer; - - /** - * PositionsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const PositionsPaginateOrderParamEnumSchema = z.enum([ - "number", - "transportMode", - "isCancelled", - "direction", - "loadType", - "serviceDate", - "createdAt", - "departureDate", - "arrivalDate", - "blfromCostumerDate", - "blfromCarrierDate", - "customsDate", - "vgmCustomerDate", - "serviceType", - "externalSystemId", - "employee", - "project", - "profit", - "margin", - "isMasterPosition", - ]); - export type PositionsPaginateOrderParamEnum = z.infer; - export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSchema.enum; - - /** - * PositionsPaginateResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionPreviewResponseDto[] } items - */ - export const PositionsPaginateResponseSchema = z.object({ - ...PositionListResponseDtoSchema.shape, - ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape, - }); - export type PositionsPaginateResponse = z.infer; - - /** - * TotalProfitResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionPreviewResponseDto[] } items - */ - export const TotalProfitResponseSchema = z.object({ - ...PositionListResponseDtoSchema.shape, - ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape, - }); - export type TotalProfitResponse = z.infer; - - /** - * PositionsListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ - export const PositionsListAvailablePartnersForResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PositionsListAvailablePartnersForResponse = z.infer< - typeof PositionsListAvailablePartnersForResponseSchema - >; - - /** - * ListRouteLabelsResponseSchema - * @type { array } - */ - export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type ListRouteLabelsResponse = z.infer; - - /** - * ListChildResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChildPositionResponseDto[] } items - */ - export const ListChildResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ChildPositionResponseDtoSchema).readonly() }).readonly().shape, - }); - export type ListChildResponse = z.infer; +/** + * PositionPreviewResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } externalSystemId + * @property { CommonModels.TransportModeEnum } transportMode + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { string } createdAt + * @property { string } number + * @property { boolean } isCancelled + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { string } customer.phone + * @property { string } customer.email + * @property { string } customerReference + * @property { object } consignee + * @property { string } consignee.id + * @property { string } consignee.name + * @property { string } consignee.matchCode + * @property { string } consignee.label + * @property { string } consigneeReference + * @property { object } carrier + * @property { string } carrier.id + * @property { string } carrier.name + * @property { string } carrier.matchCode + * @property { string } carrier.label + * @property { string } carrierReference + * @property { number } positionNumber + * @property { string } hblNumber + * @property { string } mblNumber + * @property { string } bookingNumber + * @property { string } vessel + * @property { string } voyage + * @property { string } vesselCarrier Carrier name from route point (sea positions only) + * @property { object } origin + * @property { string } origin.id + * @property { string } origin.name + * @property { string } loadDate + * @property { object } loadingPort + * @property { string } loadingPort.id + * @property { string } loadingPort.name + * @property { object } dischargePort + * @property { string } dischargePort.id + * @property { string } dischargePort.name + * @property { object } destination + * @property { string } destination.id + * @property { string } destination.name + * @property { string } deliveryDate + * @property { string } equipment + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { object } destinationOffice + * @property { string } destinationOffice.id + * @property { string } destinationOffice.name + * @property { string } currency + * @property { number } profit + * @property { number } margin + * @property { object } employee + * @property { string } employee.id + * @property { string } employee.name + * @property { object } project + * @property { string } project.id + * @property { string } project.name + * @property { string } serviceDate + * @property { string } departureDate + * @property { string } arrivalDate + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.EditorContentResponseDto } notes Notes + * @property { boolean } isMasterPosition + * @property { boolean } hasInvoices Whether this position has at least one invoice + * @property { object } parentPosition + * @property { string } parentPosition.id + * @property { string } parentPosition.number + */ +export const PositionPreviewResponseDtoSchema = z.object({ id: z.string(), externalSystemId: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), number: z.string(), isCancelled: z.boolean(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }), customerReference: z.string().nullish(), consignee: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).nullish(), consigneeReference: z.string().nullish(), carrier: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).nullish(), carrierReference: z.string().nullish(), positionNumber: z.number().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vesselCarrier: z.string().nullish(), origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), loadDate: z.iso.datetime({ offset: true }).nullish(), loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), deliveryDate: z.iso.datetime({ offset: true }).nullish(), equipment: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), currency: z.string().nullish(), profit: z.number().nullish(), margin: z.number().nullish(), employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), departureDate: z.iso.datetime({ offset: true }).nullish(), arrivalDate: z.iso.datetime({ offset: true }).nullish(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), notes: CommonModels.EditorContentResponseDtoSchema.nullish(), isMasterPosition: z.boolean(), hasInvoices: z.boolean().nullish(), parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).nullish() }); +export type PositionPreviewResponseDto = z.infer; + +/** + * PositionFilterDtoSchema + * @type { object } + * @property { CommonModels.TransportModeEnum } transportMode + * @property { string[] } customerId + * @property { string[] } carrierId Filter positions by carrier IDs + * @property { string[] } consigneeId Filter positions by consignee IDs + * @property { boolean } isCancelled + * @property { CommonModels.PositionStatusEnum } status + * @property { string } number + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } employee Filter positions by employee IDs + * @property { string } searchQuery + * @property { string } externalSystemId Filter positions by external system ID (substring match) + * @property { CommonModels.DateRangeDto } createdAt + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.DateRangeDto } departureDate + * @property { CommonModels.DateRangeDto } arrivalDate + * @property { CommonModels.DateRangeDto } blfromCostumerDate + * @property { CommonModels.DateRangeDto } blfromCarrierDate + * @property { CommonModels.DateRangeDto } customsDate + * @property { CommonModels.DateRangeDto } vgmCustomerDate + * @property { string } partnerNetworkId Filter positions by partner network ID + * @property { string[] } projectLiteId Filter positions by project IDs + * @property { string[] } checklistItemsDone Checklist item ids that must be completed + * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics + * @property { boolean } isMasterPosition + * @property { string[] } loadingPortId Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure) + * @property { string[] } dischargePortId Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport) + * @property { string } customerReference Filter positions by customer reference + * @property { string } carrierReference Filter positions by carrier reference + * @property { string } consigneeReference Filter positions by consignee reference + * @property { string } hblNumber Filter positions by HBL/HAWB number + * @property { string } mblNumber Filter positions by MBL/MAWB number + * @property { string } bookingNumber Filter positions by booking number + * @property { string } vessel Filter positions by vessel name + * @property { string } voyage Filter positions by voyage number + * @property { string } vesselCarrier Filter positions by vessel or carrier name + */ +export const PositionFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema.nullable(), customerId: z.array(z.string()).nullable(), carrierId: z.array(z.string()).nullable(), consigneeId: z.array(z.string()).nullable(), isCancelled: z.boolean().nullable(), status: CommonModels.PositionStatusEnumSchema.nullable(), number: z.string().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), employee: z.array(z.string()).nullable(), searchQuery: z.string().nullable(), externalSystemId: z.string().nullable(), createdAt: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), departureDate: CommonModels.DateRangeDtoSchema.nullable(), arrivalDate: CommonModels.DateRangeDtoSchema.nullable(), blfromCostumerDate: CommonModels.DateRangeDtoSchema.nullable(), blfromCarrierDate: CommonModels.DateRangeDtoSchema.nullable(), customsDate: CommonModels.DateRangeDtoSchema.nullable(), vgmCustomerDate: CommonModels.DateRangeDtoSchema.nullable(), partnerNetworkId: z.string().nullable(), projectLiteId: z.array(z.string()).nullable(), checklistItemsDone: z.array(z.string()).nullable(), checklistItemsNotDone: z.array(z.string()).nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable(), isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isMasterPosition: z.boolean().nullable(), loadingPortId: z.array(z.string()).nullable(), dischargePortId: z.array(z.string()).nullable(), customerReference: z.string().nullable(), carrierReference: z.string().nullable(), consigneeReference: z.string().nullable(), hblNumber: z.string().nullable(), mblNumber: z.string().nullable(), bookingNumber: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), vesselCarrier: z.string().nullable() }).partial(); +export type PositionFilterDto = z.infer; + +/** + * PositionExportFilterDtoSchema + * @type { object } + * @property { CommonModels.TransportModeEnum } transportMode + * @property { string[] } customerId + * @property { boolean } isCancelled + * @property { CommonModels.PositionStatusEnum } status + * @property { string } number + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string[] } responsibleEmployee Filter positions by responsible employee IDs + * @property { string } searchQuery + * @property { string } externalSystemId Filter positions by external system ID (substring match) + * @property { CommonModels.DateRangeDto } statusDate + * @property { CommonModels.DateRangeDto } serviceDate + * @property { CommonModels.DateRangeDto } dateOfDeparture + * @property { CommonModels.DateRangeDto } dateOfArrival + * @property { CommonModels.DateRangeDto } blfromCostumerDate + * @property { CommonModels.DateRangeDto } blfromCarrierDate + * @property { CommonModels.DateRangeDto } customsDate + * @property { CommonModels.DateRangeDto } vgmCustomerDate + * @property { string } partnerNetworkId Filter positions by partner network ID + * @property { string[] } projectLiteId Filter positions by project IDs + * @property { string[] } checklistItemsDone Checklist item ids that must be completed + * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed + * @property { CommonModels.SeaRoutingEnum } routing + * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics + */ +export const PositionExportFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema.nullable(), customerId: z.array(z.string()).nullable(), isCancelled: z.boolean().nullable(), status: CommonModels.PositionStatusEnumSchema.nullable(), number: z.string().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), responsibleEmployee: z.array(z.string()).nullable(), searchQuery: z.string().nullable(), externalSystemId: z.string().nullable(), statusDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), dateOfDeparture: CommonModels.DateRangeDtoSchema.nullable(), dateOfArrival: CommonModels.DateRangeDtoSchema.nullable(), blfromCostumerDate: CommonModels.DateRangeDtoSchema.nullable(), blfromCarrierDate: CommonModels.DateRangeDtoSchema.nullable(), customsDate: CommonModels.DateRangeDtoSchema.nullable(), vgmCustomerDate: CommonModels.DateRangeDtoSchema.nullable(), partnerNetworkId: z.string().nullable(), projectLiteId: z.array(z.string()).nullable(), checklistItemsDone: z.array(z.string()).nullable(), checklistItemsNotDone: z.array(z.string()).nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable(), isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).nullable() }).partial(); +export type PositionExportFilterDto = z.infer; + +/** + * PositionExportColumnSchema + * @type { enum } + */ +export const PositionExportColumnSchema = z.enum(["id", "externalSystemId", "transportMode", "direction", "loadType", "createdAt", "number", "isCancelled", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeName", "consigneeReference", "carrierName", "carrierReference", "positionNumber", "hblNumber", "mblNumber", "bookingNumber", "vessel", "voyage", "originName", "loadDate", "loadingPortName", "dischargePortName", "destinationName", "deliveryDate", "equipment", "serviceTypeName", "departureDate", "arrivalDate", "destinationOfficeName", "currency", "profit", "margin", "employeeName", "projectName", "serviceDate", "routing", "notes", "blFromCustomerDate", "blFromCarrierDate", "customsDate", "vgmCustomerDate", "isMasterPosition", "parentPositionId", "parentPositionNumber"]); +export type PositionExportColumn = z.infer; +export const PositionExportColumn = PositionExportColumnSchema.enum; + +/** + * PositionExportRequestDtoSchema + * @type { object } + * @property { string } order Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @property { PositionExportColumn[] } columns Min Items: `1` + * @property { PositionExportFilterDto } filter + */ +export const PositionExportRequestDtoSchema = z.object({ order: z.string().nullable(), columns: z.array(PositionExportColumnSchema).min(1).nullable(), filter: PositionExportFilterDtoSchema.nullable() }).partial(); +export type PositionExportRequestDto = z.infer; + +/** + * CreatePositionRequestDtoSchema + * @type { object } + * @property { CommonModels.SectionEnum } section + * @property { CommonModels.DirectionEnum } direction + * @property { CommonModels.TransportModeEnum } transportMode + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } estimatedServiceDate + * @property { string } customerBusinessPartnerId + */ +export const CreatePositionRequestDtoSchema = z.object({ section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, estimatedServiceDate: z.iso.datetime({ offset: true }), customerBusinessPartnerId: z.string() }); +export type CreatePositionRequestDto = z.infer; + +/** + * DuplicatePositionPackageInformationParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } packageType + * @property { boolean } packageQuantity + * @property { boolean } packageDescription + * @property { boolean } packageHsCodes + * @property { boolean } packageNetWeight + * @property { boolean } packageGrossWeight + * @property { boolean } packageCaseMark + * @property { boolean } packageNote + * @property { boolean } packageCustomsMark + */ +export const DuplicatePositionPackageInformationParametersDtoSchema = z.object({ enabled: z.boolean(), packageType: z.boolean(), packageQuantity: z.boolean(), packageDescription: z.boolean(), packageHsCodes: z.boolean(), packageNetWeight: z.boolean(), packageGrossWeight: z.boolean(), packageCaseMark: z.boolean(), packageNote: z.boolean(), packageCustomsMark: z.boolean() }); +export type DuplicatePositionPackageInformationParametersDto = z.infer; + +/** + * DuplicatePositionCargoParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { DuplicatePositionPackageInformationParametersDto } packageInformation + */ +export const DuplicatePositionCargoParametersDtoSchema = z.object({ enabled: z.boolean(), packageInformation: DuplicatePositionPackageInformationParametersDtoSchema }); +export type DuplicatePositionCargoParametersDto = z.infer; + +/** + * DuplicatePositionOverviewParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } quoteReference + */ +export const DuplicatePositionOverviewParametersDtoSchema = z.object({ enabled: z.boolean(), quoteReference: z.boolean() }); +export type DuplicatePositionOverviewParametersDto = z.infer; + +/** + * DuplicatePositionInvolvedPartiesParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } involvedPartySection + */ +export const DuplicatePositionInvolvedPartiesParametersDtoSchema = z.object({ enabled: z.boolean(), involvedPartySection: z.boolean() }); +export type DuplicatePositionInvolvedPartiesParametersDto = z.infer; + +/** + * DuplicatePositionRoutesParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } routeDates + * @property { boolean } routeLocation + */ +export const DuplicatePositionRoutesParametersDtoSchema = z.object({ enabled: z.boolean(), routeDates: z.boolean(), routeLocation: z.boolean() }); +export type DuplicatePositionRoutesParametersDto = z.infer; + +/** + * DuplicatePositionFinanceAccountParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } exchangeRate + */ +export const DuplicatePositionFinanceAccountParametersDtoSchema = z.object({ enabled: z.boolean(), exchangeRate: z.boolean() }); +export type DuplicatePositionFinanceAccountParametersDto = z.infer; + +/** + * DuplicatePositionDocumentsParametersDtoSchema + * @type { object } + * @property { boolean } enabled + * @property { boolean } hblWorkingDocument + * @property { boolean } siWorkingDocument + */ +export const DuplicatePositionDocumentsParametersDtoSchema = z.object({ enabled: z.boolean(), hblWorkingDocument: z.boolean(), siWorkingDocument: z.boolean() }); +export type DuplicatePositionDocumentsParametersDto = z.infer; + +/** + * DuplicatePositionParametersDtoSchema + * @type { object } + * @property { DuplicatePositionOverviewParametersDto } overview + * @property { DuplicatePositionInvolvedPartiesParametersDto } involvedParties + * @property { DuplicatePositionCargoParametersDto } cargo + * @property { DuplicatePositionRoutesParametersDto } routes + * @property { DuplicatePositionFinanceAccountParametersDto } financeAccount + * @property { DuplicatePositionDocumentsParametersDto } documents + */ +export const DuplicatePositionParametersDtoSchema = z.object({ overview: DuplicatePositionOverviewParametersDtoSchema, involvedParties: DuplicatePositionInvolvedPartiesParametersDtoSchema, cargo: DuplicatePositionCargoParametersDtoSchema, routes: DuplicatePositionRoutesParametersDtoSchema, financeAccount: DuplicatePositionFinanceAccountParametersDtoSchema, documents: DuplicatePositionDocumentsParametersDtoSchema }); +export type DuplicatePositionParametersDto = z.infer; + +/** + * DuplicatePositionDefaultParametersResponseDtoSchema + * @type { object } + * @property { string } estimatedServiceDate Suggested estimated service date for the duplicated position (ISO 8601) + * @property { DuplicatePositionParametersDto } parameters Default duplication parameters with section and sub-parameter flags + */ +export const DuplicatePositionDefaultParametersResponseDtoSchema = z.object({ estimatedServiceDate: z.string(), parameters: DuplicatePositionParametersDtoSchema }); +export type DuplicatePositionDefaultParametersResponseDto = z.infer; + +/** + * PositionSectionEnumSchema + * @type { enum } + */ +export const PositionSectionEnumSchema = z.enum(["overview", "involvedParties", "cargo", "financeAccount", "routes", "routeDates", "documents"]); +export type PositionSectionEnum = z.infer; +export const PositionSectionEnum = PositionSectionEnumSchema.enum; + +/** + * DuplicatePositionRequestDtoSchema + * @type { object } + * @property { PositionSectionEnum[] } sections Legacy: sections to duplicate. Ignored when parameters is provided. + * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. + * @property { string } estimatedServiceDate + */ +export const DuplicatePositionRequestDtoSchema = z.object({ sections: z.array(PositionSectionEnumSchema).nullish(), parameters: DuplicatePositionParametersDtoSchema.nullish(), estimatedServiceDate: z.iso.datetime({ offset: true }) }); +export type DuplicatePositionRequestDto = z.infer; + +/** + * UpdatePositionDtoSchema + * @type { object } + * @property { string } externalSystemId + * @property { string } statusDate + * @property { CommonModels.PositionStatusEnum } status + * @property { CommonModels.LoadTypeEnum } loadType + * @property { CommonModels.IncotermsEnum } incoterms + * @property { CommonModels.IncotermsEnum } secondIncoterms + * @property { string } fillingCompany + * @property { string } sellingContract + * @property { string } fillingScacCode + * @property { string } serviceValidity + * @property { string } ratesValidity + * @property { CommonModels.ServiceTypeEnum } serviceType + * @property { string } buyRateReference + * @property { CommonModels.FrequencyEnum } frequency + * @property { boolean } isParentPosition + * @property { boolean } isExcludedFromStatistics + * @property { string } team + * @property { string } salesRepId + * @property { string } responsibleEmployeeId + * @property { string } receivedByEmployeeId + * @property { string } originOfficeId + * @property { string } projectLiteId + * @property { CommonModels.EditorContentUpdateDto } notes Notes + * @property { CommonModels.MovementTypeEnum } inttraTypeOfMove + * @property { number } volumetricWeightModifier Volumetric weight modifier + */ +export const UpdatePositionDtoSchema = z.object({ externalSystemId: z.string().nullable(), statusDate: z.iso.datetime({ offset: true }).nullable(), status: CommonModels.PositionStatusEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), incoterms: CommonModels.IncotermsEnumSchema.nullable(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullable(), fillingCompany: z.string().nullable(), sellingContract: z.string().nullable(), fillingScacCode: z.string().nullable(), serviceValidity: z.iso.datetime({ offset: true }).nullable(), ratesValidity: z.iso.datetime({ offset: true }).nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), buyRateReference: z.string().nullable(), frequency: CommonModels.FrequencyEnumSchema.nullable(), isParentPosition: z.boolean().nullable(), isExcludedFromStatistics: z.boolean().nullable(), team: z.string().nullable(), salesRepId: z.string().nullable(), responsibleEmployeeId: z.string().nullable(), receivedByEmployeeId: z.string().nullable(), originOfficeId: z.string().nullable(), projectLiteId: z.string().nullable(), notes: CommonModels.EditorContentUpdateDtoSchema.nullable(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullable(), volumetricWeightModifier: z.number().nullable() }).partial(); +export type UpdatePositionDto = z.infer; + +/** + * ChildPositionCustomerDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type ChildPositionCustomerDto = z.infer; + +/** + * ChildPositionProfitDtoSchema + * @type { object } + * @property { number } amount + * @property { string } currency + */ +export const ChildPositionProfitDtoSchema = z.object({ amount: z.number(), currency: z.string() }); +export type ChildPositionProfitDto = z.infer; + +/** + * ChildPositionResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } number + * @property { number } packages + * @property { number } weight + * @property { number } volume + * @property { ChildPositionCustomerDto } customer + * @property { ChildPositionProfitDto } profit + */ +export const ChildPositionResponseDtoSchema = z.object({ id: z.string(), number: z.string(), packages: z.number(), weight: z.number(), volume: z.number(), customer: ChildPositionCustomerDtoSchema, profit: ChildPositionProfitDtoSchema }); +export type ChildPositionResponseDto = z.infer; + +/** + * PositionLabelsFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } isParentPosition + * @property { boolean } isLinkedPosition + */ +export const PositionLabelsFilterDtoSchema = z.object({ search: z.string().nullable(), isParentPosition: z.boolean().nullable(), isLinkedPosition: z.boolean().nullable() }).partial(); +export type PositionLabelsFilterDto = z.infer; + +/** + * PositionListResponseDtoSchema + * @type { object } + * @property { string[] } items Items + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + */ +export const PositionListResponseDtoSchema = z.object({ items: z.array(z.string()), totalProfit: z.number(), profitPerPosition: z.number(), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); +export type PositionListResponseDto = z.infer; + +/** + * LinkChildPositionsRequestDtoSchema + * @type { object } + * @property { string[] } childPositionIds + */ +export const LinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()) }); +export type LinkChildPositionsRequestDto = z.infer; + +/** + * UnlinkChildPositionsRequestDtoSchema + * @type { object } + * @property { string[] } childPositionIds + */ +export const UnlinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()) }); +export type UnlinkChildPositionsRequestDto = z.infer; + +/** + * PositionsFindAllResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PositionsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type PositionsFindAllResponse = z.infer; + +/** + * PositionsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const PositionsPaginateOrderParamEnumSchema = z.enum(["number", "transportMode", "isCancelled", "direction", "loadType", "serviceDate", "createdAt", "departureDate", "arrivalDate", "blfromCostumerDate", "blfromCarrierDate", "customsDate", "vgmCustomerDate", "serviceType", "externalSystemId", "employee", "project", "profit", "margin", "isMasterPosition"]); +export type PositionsPaginateOrderParamEnum = z.infer; +export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSchema.enum; + +/** + * PositionsPaginateResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionPreviewResponseDto[] } items + */ +export const PositionsPaginateResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).nullable() }).partial().shape }); +export type PositionsPaginateResponse = z.infer; + +/** + * TotalProfitResponseSchema + * @type { object } + * @property { number } totalProfit + * @property { number } profitPerPosition + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { PositionPreviewResponseDto[] } items + */ +export const TotalProfitResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).nullable() }).partial().shape }); +export type TotalProfitResponse = z.infer; + +/** + * PositionsListAvailablePartnersForResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items + */ +export const PositionsListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).nullable() }).partial().shape }); +export type PositionsListAvailablePartnersForResponse = z.infer; + +/** + * ListRouteLabelsResponseSchema + * @type { array } + */ +export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); +export type ListRouteLabelsResponse = z.infer; + +/** + * ListChildResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ChildPositionResponseDto[] } items + */ +export const ListChildResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChildPositionResponseDtoSchema).nullable() }).partial().shape }); +export type ListChildResponse = z.infer; + } diff --git a/test/generated/base/positions/positions.queries.ts b/test/generated/base/positions/positions.queries.ts index b3e5df0..3b89435 100644 --- a/test/generated/base/positions/positions.queries.ts +++ b/test/generated/base/positions/positions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,748 +9,527 @@ import { CommonModels } from "@/data/common/common.models"; import { PositionsApi } from "./positions.api"; export namespace PositionsQueries { - export const moduleName = QueryModule.Positions; +export const moduleName = QueryModule.Positions; - export const keys = { +export const keys = { all: [moduleName] as const, - findAll: ( - officeId: string, - limit?: number, - filter?: PositionsModels.PositionLabelsFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/positions/labels", officeId, limit, filter, page, cursor] as const, - findAllInfinite: ( - officeId: string, - limit?: number, - filter?: PositionsModels.PositionLabelsFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/positions/labels", "infinite", officeId, limit, filter, cursor] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: PositionsModels.PositionFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/positions", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: PositionsModels.PositionFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/positions", "infinite", officeId, limit, order, filter, cursor] as const, - totalProfit: (officeId: string) => - [...keys.all, "/offices/:officeId/positions/fake-total-profit", officeId] as const, - listAvailablePartnersFor: ( - officeId: string, - positionId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/available-partners", - officeId, - positionId, - search, - useCase, - ] as const, - get: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId", officeId, positionId] as const, - listRouteLabels: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/routes/labels", officeId, positionId] as const, - getDuplicateDefaultParameters: (officeId: string, positionId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/duplicate/default-parameters", - officeId, - positionId, - ] as const, - listChild: (officeId: string, positionId: string, limit?: number, page?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/children", - officeId, - positionId, - limit, - page, - cursor, - ] as const, - listChildInfinite: (officeId: string, positionId: string, limit?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/children", - "infinite", - officeId, - positionId, - limit, - cursor, - ] as const, - }; - - /** - * Query `useFindAll` - * @summary List all positions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - officeId, - limit, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - filter?: PositionsModels.PositionLabelsFilterDto; - page?: number; - cursor?: string; + findAll: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", officeId, limit, filter, page, cursor] as const, + findAllInfinite: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", "infinite", officeId, limit, filter, cursor] as const, + paginate: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions", "infinite", officeId, limit, order, filter, cursor] as const, + totalProfit: (officeId: string) => [...keys.all, "/offices/:officeId/positions/fake-total-profit", officeId] as const, + listAvailablePartnersFor: (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/positions/:positionId/available-partners", officeId, positionId, search, useCase] as const, + get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId", officeId, positionId] as const, + listRouteLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes/labels", officeId, positionId] as const, + getDuplicateDefaultParameters: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/duplicate/default-parameters", officeId, positionId] as const, + listChild: (officeId: string, positionId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", officeId, positionId, limit, page, cursor] as const, + listChildInfinite: (officeId: string, positionId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", "infinite", officeId, positionId, limit, cursor] as const, +}; + +/** + * Query `useFindAll` + * @summary List all positions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAll = ({ officeId, limit, filter, page, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findAll(officeId, limit, filter, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUseFindAll({ officeId } )); + return PositionsApi.findAll(officeId, limit, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `useFindAllInfinite + * @summary List all positions with only their labels + * @permission Requires `canUseFindAll` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindAllInfinite = ({ officeId, limit, filter, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUseFindAll({ officeId } )); + return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(officeId, limit, filter, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUseFindAll({ officeId })); - return PositionsApi.findAll(officeId, limit, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useFindAllInfinite - * @summary List all positions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllInfinite = ( - { - officeId, - limit, - filter, - cursor, - }: { officeId: string; limit: number; filter?: PositionsModels.PositionLabelsFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUseFindAll({ officeId })); - return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginate` - * @summary List positions - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @param { PositionsModels.PositionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: PositionsModels.PositionFilterDto; - page?: number; - cursor?: string; + ...options, + }); +}; + +/** + * Query `usePaginate` + * @summary List positions + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @param { PositionsModels.PositionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUsePaginate({ officeId } )); + return PositionsApi.paginate(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `usePaginateInfinite + * @summary List positions + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` + * @param { PositionsModels.PositionFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUsePaginate({ officeId } )); + return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUsePaginate({ officeId })); - return PositionsApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary List positions - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @param { PositionsModels.PositionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { officeId: string; limit: number; order?: string; filter?: PositionsModels.PositionFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUsePaginate({ officeId })); - return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create position - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { PositionsModels.CreatePositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position created successfully - * @statusCodes [201, 400, 401, 404] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof PositionsApi.create, - { officeId: string; data: PositionsModels.CreatePositionRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PositionsAcl.canUseCreate({ officeId })); - return PositionsApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useTotalProfit` - * @summary List positions - * @permission Requires `canUseTotalProfit` ability - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useTotalProfit = ( - { officeId }: { officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.totalProfit(officeId), - queryFn: () => { - checkAcl(PositionsAcl.canUseTotalProfit({ officeId })); - return PositionsApi.totalProfit(officeId, config); - }, - ...options, - }); - }; - - /** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for a position - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListAvailablePartnersFor = ( - { - officeId, - positionId, - search, - useCase, - }: { - officeId: string; - positionId: string; - search?: string; - useCase?: CommonModels.PositionAvailablePartnersUseCase; + ...options, + }); +}; + +/** + * Mutation `useCreate` + * @summary Create position + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { PositionsModels.CreatePositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position created successfully + * @statusCodes [201, 400, 401, 404] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PositionsAcl.canUseCreate({ officeId } )); + return PositionsApi.create(officeId, data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), - queryFn: () => { - checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId })); - return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase, config); - }, - ...options, - }); - }; - - /** - * Mutation `useExportPositions` - recommended when file should not be cached - * @summary Export positions to Excel - * @permission Requires `canUseExportPositions` ability - * @param { string } mutation.officeId Path parameter - * @param { PositionsModels.PositionExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportPositions = ( - options?: AppMutationOptions< - typeof PositionsApi.exportPositions, - { officeId: string; data: PositionsModels.PositionExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PositionsAcl.canUseExportPositions({ officeId })); - return PositionsApi.exportPositions(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGet` - * @summary Get position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Position retrieved successfully - * @statusCodes [200, 401, 403, 404] - */ - export const useGet = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseGet({ officeId })); - return PositionsApi.get(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.UpdatePositionDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position updated successfully - * @statusCodes [200, 400, 401, 404] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof PositionsApi.update, - { officeId: string; positionId: string; data: PositionsModels.UpdatePositionDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseUpdate({ officeId })); - return PositionsApi.update(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useListRouteLabels` - * @summary List all route labels for a position - * @permission Requires `canUseListRouteLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListRouteLabels = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRouteLabels(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseListRouteLabels({ officeId })); - return PositionsApi.listRouteLabels(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Query `useGetDuplicateDefaultParameters` - * @summary Get default duplication parameters for a position - * @permission Requires `canUseGetDuplicateDefaultParameters` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Default parameters and suggested estimated service date - * @statusCodes [200, 401, 404] - */ - export const useGetDuplicateDefaultParameters = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId })); - return PositionsApi.getDuplicateDefaultParameters(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useDuplicate` - * @summary Duplicate position - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.DuplicatePositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position duplicated successfully - * @statusCodes [201, 400, 401, 404] - */ - export const useDuplicate = ( - options?: AppMutationOptions< - typeof PositionsApi.duplicate, - { officeId: string; positionId: string; data: PositionsModels.DuplicatePositionRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseDuplicate({ officeId })); - return PositionsApi.duplicate(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCancel` - * @summary Cancel position - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position cancelled successfully - * @statusCodes [200, 400, 401, 403, 404] - */ - export const useCancel = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionsAcl.canUseCancel({ officeId })); - return PositionsApi.cancel(officeId, positionId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useRevertCancel` - * @summary Revert cancelled position (accounting) - * @permission Requires `canUseRevertCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position reverted successfully - * @statusCodes [200, 400, 401, 403, 404] - */ - export const useRevertCancel = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionsAcl.canUseRevertCancel({ officeId })); - return PositionsApi.revertCancel(officeId, positionId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useLinkChild` - * @summary Link child positions to parent - * @permission Requires `canUseLinkChild` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.LinkChildPositionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useLinkChild = ( - options?: AppMutationOptions< - typeof PositionsApi.linkChild, - { officeId: string; positionId: string; data: PositionsModels.LinkChildPositionsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseLinkChild({ officeId })); - return PositionsApi.linkChild(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnlinkChild` - * @summary Unlink child positions from parent - * @permission Requires `canUseUnlinkChild` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.UnlinkChildPositionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnlinkChild = ( - options?: AppMutationOptions< - typeof PositionsApi.unlinkChild, - { officeId: string; positionId: string; data: PositionsModels.UnlinkChildPositionsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseUnlinkChild({ officeId })); - return PositionsApi.unlinkChild(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useListChild` - * @summary Get child positions for parent - * @permission Requires `canUseListChild` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListChild = ( - { - officeId, - positionId, - limit, - page, - cursor, - }: { officeId: string; positionId: string; limit: number; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listChild(officeId, positionId, limit, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUseListChild({ officeId })); - return PositionsApi.listChild(officeId, positionId, limit, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListChildInfinite - * @summary Get child positions for parent - * @permission Requires `canUseListChild` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListChildInfinite = ( - { officeId, positionId, limit, cursor }: { officeId: string; positionId: string; limit: number; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUseListChild({ officeId })); - return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useTotalProfit` + * @summary List positions + * @permission Requires `canUseTotalProfit` ability + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useTotalProfit = ({ officeId }: { officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.totalProfit(officeId), + queryFn: () => { + checkAcl(PositionsAcl.canUseTotalProfit({ officeId } )); + return PositionsApi.totalProfit(officeId) }, + ...options, + }); +}; + +/** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for a position + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListAvailablePartnersFor = ({ officeId, positionId, search, useCase }: { officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), + queryFn: () => { + checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId } )); + return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase) }, + ...options, + }); +}; + +/** + * Mutation `useExportPositions` - recommended when file should not be cached + * @summary Export positions to Excel + * @permission Requires `canUseExportPositions` ability + * @param { string } mutation.officeId Path parameter + * @param { PositionsModels.PositionExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportPositions = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(PositionsAcl.canUseExportPositions({ officeId } )); + return PositionsApi.exportPositions(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGet` + * @summary Get position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Position retrieved successfully + * @statusCodes [200, 401, 403, 404] + */ +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseGet({ officeId } )); + return PositionsApi.get(officeId, positionId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.UpdatePositionDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position updated successfully + * @statusCodes [200, 400, 401, 404] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseUpdate({ officeId } )); + return PositionsApi.update(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListRouteLabels` + * @summary List all route labels for a position + * @permission Requires `canUseListRouteLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRouteLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRouteLabels(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseListRouteLabels({ officeId } )); + return PositionsApi.listRouteLabels(officeId, positionId) }, + ...options, + }); +}; + +/** + * Query `useGetDuplicateDefaultParameters` + * @summary Get default duplication parameters for a position + * @permission Requires `canUseGetDuplicateDefaultParameters` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Default parameters and suggested estimated service date + * @statusCodes [200, 401, 404] + */ +export const useGetDuplicateDefaultParameters = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), + queryFn: () => { + checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId } )); + return PositionsApi.getDuplicateDefaultParameters(officeId, positionId) }, + ...options, + }); +}; + +/** + * Mutation `useDuplicate` + * @summary Duplicate position + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.DuplicatePositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position duplicated successfully + * @statusCodes [201, 400, 401, 404] + */ +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseDuplicate({ officeId } )); + return PositionsApi.duplicate(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCancel` + * @summary Cancel position + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position cancelled successfully + * @statusCodes [200, 400, 401, 403, 404] + */ +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionsAcl.canUseCancel({ officeId } )); + return PositionsApi.cancel(officeId, positionId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useRevertCancel` + * @summary Revert cancelled position (accounting) + * @permission Requires `canUseRevertCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Position reverted successfully + * @statusCodes [200, 400, 401, 403, 404] + */ +export const useRevertCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(PositionsAcl.canUseRevertCancel({ officeId } )); + return PositionsApi.revertCancel(officeId, positionId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useLinkChild` + * @summary Link child positions to parent + * @permission Requires `canUseLinkChild` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.LinkChildPositionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useLinkChild = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseLinkChild({ officeId } )); + return PositionsApi.linkChild(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUnlinkChild` + * @summary Unlink child positions from parent + * @permission Requires `canUseUnlinkChild` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { PositionsModels.UnlinkChildPositionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnlinkChild = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(PositionsAcl.canUseUnlinkChild({ officeId } )); + return PositionsApi.unlinkChild(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useListChild` + * @summary Get child positions for parent + * @permission Requires `canUseListChild` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListChild = ({ officeId, positionId, limit, page, cursor }: { officeId: string, positionId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listChild(officeId, positionId, limit, page, cursor), + queryFn: () => { + checkAcl(PositionsAcl.canUseListChild({ officeId } )); + return PositionsApi.listChild(officeId, positionId, limit, page, cursor) }, + ...options, + }); +}; + +/** + * Infinite query `useListChildInfinite + * @summary Get child positions for parent + * @permission Requires `canUseListChild` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListChildInfinite = ({ officeId, positionId, limit, cursor }: { officeId: string, positionId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(PositionsAcl.canUseListChild({ officeId } )); + return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; + } diff --git a/test/generated/base/projectLite/projectLite.acl.ts b/test/generated/base/projectLite/projectLite.acl.ts index 746ff45..00ccf56 100644 --- a/test/generated/base/projectLite/projectLite.acl.ts +++ b/test/generated/base/projectLite/projectLite.acl.ts @@ -1,87 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace ProjectLiteAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create project in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Create", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create project in office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Create", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List projects for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Read", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List projects for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - /** - * Use for `usePaginateProjectLabels` query ability. For global ability, omit the object parameter. - * @description Paginate project labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateProjectLabels` query - */ - export const canUsePaginateProjectLabels = (object?: { officeId: string }) => - ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Read", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; +/** + * Use for `usePaginateProjectLabels` query ability. For global ability, omit the object parameter. + * @description Paginate project labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateProjectLabels` query + */ +export const canUsePaginateProjectLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get project by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Read", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get project by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Update", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Update", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Archive", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive project + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("ProjectLite", object) : "ProjectLite" +] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Archive", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; } diff --git a/test/generated/base/projectLite/projectLite.api.ts b/test/generated/base/projectLite/projectLite.api.ts index e27b360..3bb49bc 100644 --- a/test/generated/base/projectLite/projectLite.api.ts +++ b/test/generated/base/projectLite/projectLite.api.ts @@ -1,142 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ProjectLiteModels } from "./projectLite.models"; export namespace ProjectLiteApi { - export const create = ( - officeId: string, - data: ProjectLiteModels.CreateProjectLiteRequestDTO, - config?: AxiosRequestConfig, - ) => { +export const create = (officeId: string, data: ProjectLiteModels.CreateProjectLiteRequestDTO, ) => { return AppRestClient.post( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite`, - ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), - config, - ); - }; - - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite`, + ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), + + ) +}; +export const paginate = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, - `/offices/${officeId}/project-lite`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const paginateProjectLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, + `/offices/${officeId}/project-lite`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateProjectLabels = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, - `/offices/${officeId}/project-lite/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, + `/offices/${officeId}/project-lite/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite/${id}`, - config, - ); - }; - - export const update = ( - id: string, - officeId: string, - data: ProjectLiteModels.UpdateProjectLiteRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite/${id}`, + + ) +}; +export const update = (id: string, officeId: string, data: ProjectLiteModels.UpdateProjectLiteRequestDTO, ) => { return AppRestClient.patch( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite/${id}`, - ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, + `/offices/${officeId}/project-lite/${id}`, + ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/project-lite/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/project-lite/${id}/archive`, + + ) +}; +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/project-lite/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/project-lite/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/projectLite/projectLite.configs.ts b/test/generated/base/projectLite/projectLite.configs.ts index c5f3f45..5981c30 100644 --- a/test/generated/base/projectLite/projectLite.configs.ts +++ b/test/generated/base/projectLite/projectLite.configs.ts @@ -6,110 +6,111 @@ import { ProjectLiteQueries } from "./projectLite.queries"; import { ProjectLiteAcl } from "./projectLite.acl"; export namespace ProjectLiteConfigs { - export const projectLiteConfig = { +export const projectLiteConfig = { meta: { - title: "Project Lite", + title: "Project Lite", }, readAll: { - acl: ProjectLiteAcl.canUsePaginate, - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - paginated: ProjectLiteQueries.usePaginate, - infinite: ProjectLiteQueries.usePaginateInfinite, - filters: { - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: ProjectLiteAcl.canUsePaginate, schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema, + paginated: ProjectLiteQueries.usePaginate, + infinite: ProjectLiteQueries.usePaginateInfinite, + filters: { + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + officeId: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: ProjectLiteAcl.canUseFindById, - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - query: ProjectLiteQueries.useFindById, + acl: ProjectLiteAcl.canUseFindById, + schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, + query: ProjectLiteQueries.useFindById, }, create: { - acl: ProjectLiteAcl.canUseCreate, - schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, - mutation: ProjectLiteQueries.useCreate, - inputDefs: dynamicInputs({ + acl: ProjectLiteAcl.canUseCreate, schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), + mutation: ProjectLiteQueries.useCreate, + inputDefs: dynamicInputs({ + schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) }, update: { - acl: ProjectLiteAcl.canUseUpdate, - schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, - mutation: ProjectLiteQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: ProjectLiteAcl.canUseUpdate, schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), + mutation: ProjectLiteQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, + options: { + inputs: { + name: true, + }, + }, +}) }, - }; +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: ProjectLiteAcl.canUsePaginateProjectLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ProjectLiteQueries.usePaginateProjectLabels, - infinite: ProjectLiteQueries.usePaginateProjectLabelsInfinite, - filters: { - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: ProjectLiteAcl.canUsePaginateProjectLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema, + paginated: ProjectLiteQueries.usePaginateProjectLabels, + infinite: ProjectLiteQueries.usePaginateProjectLabelsInfinite, + filters: { + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/projectLite/projectLite.models.ts b/test/generated/base/projectLite/projectLite.models.ts index b70c907..a40cc28 100644 --- a/test/generated/base/projectLite/projectLite.models.ts +++ b/test/generated/base/projectLite/projectLite.models.ts @@ -2,127 +2,97 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace ProjectLiteModels { - /** - * ProjectLiteEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ProjectLiteEmployeeDTO = z.infer; +/** + * ProjectLiteEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type ProjectLiteEmployeeDTO = z.infer; - /** - * ProjectLiteResponseDTOSchema - * @type { object } - * @property { string } id Project ID - * @property { string } name Project name - * @property { string } officeId Office ID - * @property { boolean } archived Is archived - * @property { string } createdById ID of the employee who created this project - * @property { ProjectLiteEmployeeDTO } createdBy Employee who created this project - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this project - * @property { ProjectLiteEmployeeDTO } updatedBy Employee who last updated this project - * @property { string } updatedAt Updated at - */ - export const ProjectLiteResponseDTOSchema = z - .object({ - id: z.string().describe("Project ID"), - name: z.string().describe("Project name"), - officeId: z.string().describe("Office ID"), - archived: z.boolean().describe("Is archived"), - createdById: z.string().describe("ID of the employee who created this project").nullish(), - createdBy: ProjectLiteEmployeeDTOSchema.describe("Employee who created this project").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedById: z.string().describe("ID of the employee who last updated this project").nullish(), - updatedBy: ProjectLiteEmployeeDTOSchema.describe("Employee who last updated this project").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - }) - .readonly(); - export type ProjectLiteResponseDTO = z.infer; +/** + * ProjectLiteResponseDTOSchema + * @type { object } + * @property { string } id Project ID + * @property { string } name Project name + * @property { string } officeId Office ID + * @property { boolean } archived Is archived + * @property { string } createdById ID of the employee who created this project + * @property { ProjectLiteEmployeeDTO } createdBy Employee who created this project + * @property { string } createdAt Created at + * @property { string } updatedById ID of the employee who last updated this project + * @property { ProjectLiteEmployeeDTO } updatedBy Employee who last updated this project + * @property { string } updatedAt Updated at + */ +export const ProjectLiteResponseDTOSchema = z.object({ id: z.string(), name: z.string(), officeId: z.string(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: ProjectLiteEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ProjectLiteEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type ProjectLiteResponseDTO = z.infer; - /** - * CreateProjectLiteRequestDTOSchema - * @type { object } - * @property { string } name Project name - */ - export const CreateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); - export type CreateProjectLiteRequestDTO = z.infer; +/** + * CreateProjectLiteRequestDTOSchema + * @type { object } + * @property { string } name Project name + */ +export const CreateProjectLiteRequestDTOSchema = z.object({ name: z.string() }); +export type CreateProjectLiteRequestDTO = z.infer; - /** - * ProjectLiteFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ - export const ProjectLiteFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); - export type ProjectLiteFilterDto = z.infer; +/** + * ProjectLiteFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived + */ +export const ProjectLiteFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); +export type ProjectLiteFilterDto = z.infer; - /** - * UpdateProjectLiteRequestDTOSchema - * @type { object } - * @property { string } name Project name - */ - export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); - export type UpdateProjectLiteRequestDTO = z.infer; +/** + * UpdateProjectLiteRequestDTOSchema + * @type { object } + * @property { string } name Project name + */ +export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().nullable() }).partial(); +export type UpdateProjectLiteRequestDTO = z.infer; - /** - * ProjectLitePaginateOrderParamEnumSchema - * @type { enum } - */ - export const ProjectLitePaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ProjectLitePaginateOrderParamEnum = z.infer; - export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEnumSchema.enum; +/** + * ProjectLitePaginateOrderParamEnumSchema + * @type { enum } + */ +export const ProjectLitePaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type ProjectLitePaginateOrderParamEnum = z.infer; +export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEnumSchema.enum; - /** - * ProjectLitePaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ProjectLiteResponseDTO[] } items - */ - export const ProjectLitePaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ProjectLitePaginateResponse = z.infer; +/** + * ProjectLitePaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { ProjectLiteResponseDTO[] } items + */ +export const ProjectLitePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).nullable() }).partial().shape }); +export type ProjectLitePaginateResponse = z.infer; - /** - * PaginateProjectLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PaginateProjectLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PaginateProjectLabelsOrderParamEnum = z.infer; - export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderParamEnumSchema.enum; +/** + * PaginateProjectLabelsOrderParamEnumSchema + * @type { enum } + */ +export const PaginateProjectLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type PaginateProjectLabelsOrderParamEnum = z.infer; +export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderParamEnumSchema.enum; + +/** + * PaginateProjectLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const PaginateProjectLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type PaginateProjectLabelsResponse = z.infer; - /** - * PaginateProjectLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PaginateProjectLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PaginateProjectLabelsResponse = z.infer; } diff --git a/test/generated/base/projectLite/projectLite.queries.ts b/test/generated/base/projectLite/projectLite.queries.ts index aa91db8..52d1c07 100644 --- a/test/generated/base/projectLite/projectLite.queries.ts +++ b/test/generated/base/projectLite/projectLite.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,407 +8,262 @@ import { ProjectLiteModels } from "./projectLite.models"; import { ProjectLiteApi } from "./projectLite.api"; export namespace ProjectLiteQueries { - export const moduleName = QueryModule.ProjectLite; +export const moduleName = QueryModule.ProjectLite; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/project-lite", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/project-lite", "infinite", officeId, limit, order, filter, cursor] as const, - paginateProjectLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/project-lite/labels/paginate", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateProjectLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/project-lite/labels/paginate", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/project-lite/:id", id, officeId] as const, - }; + paginate: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", "infinite", officeId, limit, order, filter, cursor] as const, + paginateProjectLabels: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", officeId, limit, order, filter, page, cursor] as const, + paginateProjectLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/project-lite/:id", id, officeId] as const, +}; - /** - * Mutation `useCreate` - * @summary Create project - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ProjectLiteModels.CreateProjectLiteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof ProjectLiteApi.create, - { officeId: string; data: ProjectLiteModels.CreateProjectLiteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create project + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { ProjectLiteModels.CreateProjectLiteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ProjectLiteAcl.canUseCreate({ officeId })); - return ProjectLiteApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Get paginated projects - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ProjectLiteModels.ProjectLiteFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(ProjectLiteAcl.canUseCreate({ officeId } )); + return ProjectLiteApi.create(officeId, data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUsePaginate({ officeId })); - return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Get paginated projects - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ProjectLiteModels.ProjectLiteFilterDto; - cursor?: string; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ProjectLiteAcl.canUsePaginate({ officeId })); - return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `usePaginate` + * @summary Get paginated projects + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); + return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Query `usePaginateProjectLabels` - * @summary Paginate project labels - * @permission Requires `canUsePaginateProjectLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateProjectLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ProjectLiteModels.ProjectLiteFilterDto; - page?: number; - cursor?: string; +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated projects + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); + return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId })); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateProjectLabels` + * @summary Paginate project labels + * @permission Requires `canUsePaginateProjectLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateProjectLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateProjectLabelsInfinite - * @summary Paginate project labels - * @permission Requires `canUsePaginateProjectLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateProjectLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ProjectLiteModels.ProjectLiteFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateProjectLabelsInfinite + * @summary Paginate project labels + * @permission Requires `canUsePaginateProjectLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateProjectLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId })); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useFindById` - * @summary Get project by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get project by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(ProjectLiteAcl.canUseFindById({ officeId } )); + return ProjectLiteApi.findById(id, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUseFindById({ officeId })); - return ProjectLiteApi.findById(id, officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update project + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { ProjectLiteModels.UpdateProjectLiteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update project - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ProjectLiteModels.UpdateProjectLiteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ProjectLiteApi.update, - { id: string; officeId: string; data: ProjectLiteModels.UpdateProjectLiteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(ProjectLiteAcl.canUseUpdate({ officeId } )); + return ProjectLiteApi.update(id, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ProjectLiteAcl.canUseUpdate({ officeId })); - return ProjectLiteApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive project + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive project - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ProjectLiteAcl.canUseArchive({ officeId } )); + return ProjectLiteApi.archive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ProjectLiteAcl.canUseArchive({ officeId })); - return ProjectLiteApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive project + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive project - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId } )); + return ProjectLiteApi.unarchive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId })); - return ProjectLiteApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/queryModules.ts b/test/generated/base/queryModules.ts index cb83878..2daa74a 100644 --- a/test/generated/base/queryModules.ts +++ b/test/generated/base/queryModules.ts @@ -1,96 +1,96 @@ export const enum QueryModule { - WorkingDocuments = "WorkingDocumentsQueries", - Offices = "OfficesQueries", - BankAccounts = "BankAccountsQueries", - Currencies = "CurrenciesQueries", - Countries = "CountriesQueries", - Folders = "FoldersQueries", - Files = "FilesQueries", - WorkingDocumentsTemplatedDocument = "WorkingDocumentsTemplatedDocumentQueries", - BusinessPartners = "BusinessPartnersQueries", - BusinessPartnerBookkeepingMappings = "BusinessPartnerBookkeepingMappingsQueries", - BusinessPartnerContacts = "BusinessPartnerContactsQueries", - Cities = "CitiesQueries", - Depots = "DepotsQueries", - PartnerNetworks = "PartnerNetworksQueries", - Warehouses = "WarehousesQueries", - UserActivity = "UserActivityQueries", - DocumentTemplates = "DocumentTemplatesQueries", - HsCodes = "HsCodesQueries", - CargoTypes = "CargoTypesQueries", - SeaPositions = "SeaPositionsQueries", - Terminals = "TerminalsQueries", - Airports = "AirportsQueries", - Ports = "PortsQueries", - ContainerYards = "ContainerYardsQueries", - PositionInvolvedParties = "PositionInvolvedPartiesQueries", - PositionRoutes = "PositionRoutesQueries", - AirPositions = "AirPositionsQueries", - PositionAccount = "PositionAccountQueries", - PositionAccountItems = "PositionAccountItemsQueries", - PositionProfitChangeTracking = "PositionProfitChangeTrackingQueries", - WorkingDocumentsExportDeclaration = "WorkingDocumentsExportDeclarationQueries", - PositionCargo = "PositionCargoQueries", - PositionCargoPackage = "PositionCargoPackageQueries", - PackageTypes = "PackageTypesQueries", - WorkingDocumentsHouseBl = "WorkingDocumentsHouseBlQueries", - WorkingDocumentsBlInstructions = "WorkingDocumentsBlInstructionsQueries", - WorkingDocumentsAmsInstructions = "WorkingDocumentsAmsInstructionsQueries", - WorkingDocumentsHouseAwb = "WorkingDocumentsHouseAwbQueries", - ChargeTypes = "ChargeTypesQueries", - WorkingDocumentsMasterAwb = "WorkingDocumentsMasterAwbQueries", - WorkingDocumentsCmrForm = "WorkingDocumentsCmrFormQueries", - WorkingDocumentsIsfForm = "WorkingDocumentsIsfFormQueries", - WorkingDocumentsFcrForm = "WorkingDocumentsFcrFormQueries", - ShippingInstructions = "ShippingInstructionsQueries", - EmployeeAccount = "EmployeeAccountQueries", - EmployeeSettings = "EmployeeSettingsQueries", - EmployeeRoles = "EmployeeRolesQueries", - EmployeePermissions = "EmployeePermissionsQueries", - EmployeeProfile = "EmployeeProfileQueries", - Employee = "EmployeeQueries", - Employment = "EmploymentQueries", - CustomerAccount = "CustomerAccountQueries", - Customers = "CustomersQueries", - Quotes = "QuotesQueries", - QuoteAccount = "QuoteAccountQueries", - QuoteProfitChangeTracking = "QuoteProfitChangeTrackingQueries", - SeaQuotes = "SeaQuotesQueries", - RoadQuotes = "RoadQuotesQueries", - QuoteDocument = "QuoteDocumentQueries", - QuoteCargo = "QuoteCargoQueries", - QuoteCargoPackage = "QuoteCargoPackageQueries", - QuoteRoutes = "QuoteRoutesQueries", - DunningManagement = "DunningManagementQueries", - DunningPartnerOutstandingInvoices = "DunningPartnerOutstandingInvoicesQueries", - DunningLevels = "DunningLevelsQueries", - DunningSystems = "DunningSystemsQueries", - DunningAccountStatement = "DunningAccountStatementQueries", - Positions = "PositionsQueries", - QuoteConversion = "QuoteConversionQueries", - Invoices = "InvoicesQueries", - VatRules = "VatRulesQueries", - InvoicePayments = "InvoicePaymentsQueries", - PaymentConfirmations = "PaymentConfirmationsQueries", - ProjectLite = "ProjectLiteQueries", - PositionChecklist = "PositionChecklistQueries", - ChecklistTemplates = "ChecklistTemplatesQueries", - BookkeepingExport = "BookkeepingExportQueries", - FactoringExport = "FactoringExportQueries", - FactoringMerge = "FactoringMergeQueries", - AWBStocks = "AWBStocksQueries", - MasterData = "MasterDataQueries", - ChecklistItems = "ChecklistItemsQueries", - MasterDataImport = "MasterDataImportQueries", - RemarkTemplates = "RemarkTemplatesQueries", - IntegrationChannels = "IntegrationChannelsQueries", - ControlTowerBookings = "ControlTowerBookingsQueries", - ControlTowerPackages = "ControlTowerPackagesQueries", - ControlTowerContainers = "ControlTowerContainersQueries", - ControlTowerAuth = "ControlTowerAuthQueries", - ControlTowerMe = "ControlTowerMeQueries", - ControlTowerSearch = "ControlTowerSearchQueries", - ControlTowerCalendar = "ControlTowerCalendarQueries", - InttraShippingInstructionMessages = "InttraShippingInstructionMessagesQueries", - InttraOfficeIntegration = "InttraOfficeIntegrationQueries", -} + WorkingDocuments = "WorkingDocumentsQueries", + Offices = "OfficesQueries", + BankAccounts = "BankAccountsQueries", + Currencies = "CurrenciesQueries", + Countries = "CountriesQueries", + Folders = "FoldersQueries", + Files = "FilesQueries", + WorkingDocumentsTemplatedDocument = "WorkingDocumentsTemplatedDocumentQueries", + BusinessPartners = "BusinessPartnersQueries", + BusinessPartnerBookkeepingMappings = "BusinessPartnerBookkeepingMappingsQueries", + BusinessPartnerContacts = "BusinessPartnerContactsQueries", + Cities = "CitiesQueries", + Depots = "DepotsQueries", + PartnerNetworks = "PartnerNetworksQueries", + Warehouses = "WarehousesQueries", + UserActivity = "UserActivityQueries", + DocumentTemplates = "DocumentTemplatesQueries", + HsCodes = "HsCodesQueries", + CargoTypes = "CargoTypesQueries", + SeaPositions = "SeaPositionsQueries", + Terminals = "TerminalsQueries", + Airports = "AirportsQueries", + Ports = "PortsQueries", + ContainerYards = "ContainerYardsQueries", + PositionInvolvedParties = "PositionInvolvedPartiesQueries", + PositionRoutes = "PositionRoutesQueries", + AirPositions = "AirPositionsQueries", + PositionAccount = "PositionAccountQueries", + PositionAccountItems = "PositionAccountItemsQueries", + PositionProfitChangeTracking = "PositionProfitChangeTrackingQueries", + WorkingDocumentsExportDeclaration = "WorkingDocumentsExportDeclarationQueries", + PositionCargo = "PositionCargoQueries", + PositionCargoPackage = "PositionCargoPackageQueries", + PackageTypes = "PackageTypesQueries", + WorkingDocumentsHouseBl = "WorkingDocumentsHouseBlQueries", + WorkingDocumentsBlInstructions = "WorkingDocumentsBlInstructionsQueries", + WorkingDocumentsAmsInstructions = "WorkingDocumentsAmsInstructionsQueries", + WorkingDocumentsHouseAwb = "WorkingDocumentsHouseAwbQueries", + ChargeTypes = "ChargeTypesQueries", + WorkingDocumentsMasterAwb = "WorkingDocumentsMasterAwbQueries", + WorkingDocumentsCmrForm = "WorkingDocumentsCmrFormQueries", + WorkingDocumentsIsfForm = "WorkingDocumentsIsfFormQueries", + WorkingDocumentsFcrForm = "WorkingDocumentsFcrFormQueries", + ShippingInstructions = "ShippingInstructionsQueries", + EmployeeAccount = "EmployeeAccountQueries", + EmployeeSettings = "EmployeeSettingsQueries", + EmployeeRoles = "EmployeeRolesQueries", + EmployeePermissions = "EmployeePermissionsQueries", + EmployeeProfile = "EmployeeProfileQueries", + Employee = "EmployeeQueries", + Employment = "EmploymentQueries", + CustomerAccount = "CustomerAccountQueries", + Customers = "CustomersQueries", + Quotes = "QuotesQueries", + QuoteAccount = "QuoteAccountQueries", + QuoteProfitChangeTracking = "QuoteProfitChangeTrackingQueries", + SeaQuotes = "SeaQuotesQueries", + RoadQuotes = "RoadQuotesQueries", + QuoteDocument = "QuoteDocumentQueries", + QuoteCargo = "QuoteCargoQueries", + QuoteCargoPackage = "QuoteCargoPackageQueries", + QuoteRoutes = "QuoteRoutesQueries", + DunningManagement = "DunningManagementQueries", + DunningPartnerOutstandingInvoices = "DunningPartnerOutstandingInvoicesQueries", + DunningLevels = "DunningLevelsQueries", + DunningSystems = "DunningSystemsQueries", + DunningAccountStatement = "DunningAccountStatementQueries", + Positions = "PositionsQueries", + QuoteConversion = "QuoteConversionQueries", + Invoices = "InvoicesQueries", + VatRules = "VatRulesQueries", + InvoicePayments = "InvoicePaymentsQueries", + PaymentConfirmations = "PaymentConfirmationsQueries", + ProjectLite = "ProjectLiteQueries", + PositionChecklist = "PositionChecklistQueries", + ChecklistTemplates = "ChecklistTemplatesQueries", + BookkeepingExport = "BookkeepingExportQueries", + FactoringExport = "FactoringExportQueries", + FactoringMerge = "FactoringMergeQueries", + AWBStocks = "AWBStocksQueries", + MasterData = "MasterDataQueries", + ChecklistItems = "ChecklistItemsQueries", + MasterDataImport = "MasterDataImportQueries", + RemarkTemplates = "RemarkTemplatesQueries", + IntegrationChannels = "IntegrationChannelsQueries", + ControlTowerBookings = "ControlTowerBookingsQueries", + ControlTowerPackages = "ControlTowerPackagesQueries", + ControlTowerContainers = "ControlTowerContainersQueries", + ControlTowerAuth = "ControlTowerAuthQueries", + ControlTowerMe = "ControlTowerMeQueries", + ControlTowerSearch = "ControlTowerSearchQueries", + ControlTowerCalendar = "ControlTowerCalendarQueries", + InttraShippingInstructionMessages = "InttraShippingInstructionMessagesQueries", + InttraOfficeIntegration = "InttraOfficeIntegrationQueries", +} \ No newline at end of file diff --git a/test/generated/base/quoteAccount/quoteAccount.acl.ts b/test/generated/base/quoteAccount/quoteAccount.acl.ts index a86beb5..5a12701 100644 --- a/test/generated/base/quoteAccount/quoteAccount.acl.ts +++ b/test/generated/base/quoteAccount/quoteAccount.acl.ts @@ -1,63 +1,69 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace QuoteAccountAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description List quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description List quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useCreateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateItem` mutation - */ - export const canUseCreateItem = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useCreateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateItem` mutation + */ +export const canUseCreateItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useDeleteItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteItem` mutation - */ - export const canUseDeleteItem = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useDeleteItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteItem` mutation + */ +export const canUseDeleteItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useUpdateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateItem` mutation - */ - export const canUseUpdateItem = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useUpdateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateItem` mutation + */ +export const canUseUpdateItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDuplicateItem` mutation ability. For global ability, omit the object parameter. + * @description Update quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateItem` mutation + */ +export const canUseDuplicateItem = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useDuplicateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateItem` mutation - */ - export const canUseDuplicateItem = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; } diff --git a/test/generated/base/quoteAccount/quoteAccount.api.ts b/test/generated/base/quoteAccount/quoteAccount.api.ts index 517d13e..f29e866 100644 --- a/test/generated/base/quoteAccount/quoteAccount.api.ts +++ b/test/generated/base/quoteAccount/quoteAccount.api.ts @@ -1,62 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { QuoteAccountModels } from "./quoteAccount.models"; export namespace QuoteAccountApi { - export const get = (quoteId: string, officeId: string, config?: AxiosRequestConfig) => { +export const get = (quoteId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/account`, - config, - ); - }; - - export const createItem = ( - quoteId: string, - officeId: string, - data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/account`, + + ) +}; +export const createItem = (quoteId: string, officeId: string, data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, ) => { return AppRestClient.post( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items`, - ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), - config, - ); - }; - - export const deleteItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items`, + ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), + + ) +}; +export const deleteItem = (quoteId: string, itemId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - undefined, - config, - ); - }; - - export const updateItem = ( - quoteId: string, - itemId: string, - officeId: string, - data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, + + ) +}; +export const updateItem = (quoteId: string, itemId: string, officeId: string, data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, ) => { return AppRestClient.patch( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), - config, - ); - }; - - export const duplicateItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, + ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), + + ) +}; +export const duplicateItem = (quoteId: string, itemId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, - undefined, - config, - ); - }; + { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, + + ) +}; } diff --git a/test/generated/base/quoteAccount/quoteAccount.models.ts b/test/generated/base/quoteAccount/quoteAccount.models.ts index cc26d54..cdc459b 100644 --- a/test/generated/base/quoteAccount/quoteAccount.models.ts +++ b/test/generated/base/quoteAccount/quoteAccount.models.ts @@ -1,273 +1,170 @@ import { z } from "zod"; export namespace QuoteAccountModels { - /** - * QuoteAccountItemTypeEnumSchema - * @type { enum } - */ - export const QuoteAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); - export type QuoteAccountItemTypeEnum = z.infer; - export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; +/** + * QuoteAccountItemTypeEnumSchema + * @type { enum } + */ +export const QuoteAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); +export type QuoteAccountItemTypeEnum = z.infer; +export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; - /** - * QuoteChargeDtoResponseSchema - * @type { object } - * @property { object } chargeType - * @property { string } chargeType.id - * @property { string } chargeType.name - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { object } buyVatRule - * @property { string } buyVatRule.id - * @property { string } buyVatRule.name - * @property { string } buyVatRule.matchcode - * @property { string } buyVatRule.printCode - * @property { object } vendor - * @property { string } vendor.id - * @property { string } vendor.name - * @property { string } vendor.matchCode - * @property { string } vendor.label - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { object } sellVatRule - * @property { string } sellVatRule.id - * @property { string } sellVatRule.name - * @property { string } sellVatRule.matchcode - * @property { string } sellVatRule.printCode - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - * @property { number } profit Profit amount - */ - export const QuoteChargeDtoResponseSchema = z - .object({ - chargeType: z.object({ id: z.string(), name: z.string() }).readonly(), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().describe("Quantity of the charge").nullish(), - buyRate: z.number().describe("Buy rate amount").nullish(), - buyCurrencyCode: z.string().describe("Buy rate currency code"), - buyVatRule: z - .object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }) - .readonly(), - vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), - sellRate: z.number().describe("Sell rate amount").nullish(), - sellCurrencyCode: z.string().describe("Sell rate currency code"), - sellVatRule: z - .object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }) - .readonly(), - customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), - profit: z.number().describe("Profit amount").nullish(), - }) - .readonly(); - export type QuoteChargeDtoResponse = z.infer; +/** + * QuoteChargeDtoResponseSchema + * @type { object } + * @property { object } chargeType + * @property { string } chargeType.id + * @property { string } chargeType.name + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { object } buyVatRule + * @property { string } buyVatRule.id + * @property { string } buyVatRule.name + * @property { string } buyVatRule.matchcode + * @property { string } buyVatRule.printCode + * @property { object } vendor + * @property { string } vendor.id + * @property { string } vendor.name + * @property { string } vendor.matchCode + * @property { string } vendor.label + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { object } sellVatRule + * @property { string } sellVatRule.id + * @property { string } sellVatRule.name + * @property { string } sellVatRule.matchcode + * @property { string } sellVatRule.printCode + * @property { object } customer + * @property { string } customer.id + * @property { string } customer.name + * @property { string } customer.matchCode + * @property { string } customer.label + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + * @property { number } profit Profit amount + */ +export const QuoteChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }), additionalText: z.string(), quantity: z.number().nullish(), buyRate: z.number().nullish(), buyCurrencyCode: z.string(), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }), buyExchangeRate: z.number().nullish(), sellRate: z.number().nullish(), sellCurrencyCode: z.string(), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }), sellExchangeRate: z.number().nullish(), profit: z.number().nullish() }); +export type QuoteChargeDtoResponse = z.infer; - /** - * QuoteTextDtoResponseSchema - * @type { object } - * @property { string } content Text content - */ - export const QuoteTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); - export type QuoteTextDtoResponse = z.infer; +/** + * QuoteTextDtoResponseSchema + * @type { object } + * @property { string } content Text content + */ +export const QuoteTextDtoResponseSchema = z.object({ content: z.string() }); +export type QuoteTextDtoResponse = z.infer; - /** - * QuoteAccountItemDtoResponseSchema - * @type { object } - * @property { string } id Item ID - * @property { QuoteAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE - * @property { QuoteTextDtoResponse } text Text data if type is TEXT - */ - export const QuoteAccountItemDtoResponseSchema = z - .object({ - id: z.string().describe("Item ID"), - type: QuoteAccountItemTypeEnumSchema.describe("Item type"), - orderPosition: z.number().describe("Order position of the item"), - charge: QuoteChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), - text: QuoteTextDtoResponseSchema.describe("Text data if type is TEXT").nullish(), - }) - .readonly(); - export type QuoteAccountItemDtoResponse = z.infer; +/** + * QuoteAccountItemDtoResponseSchema + * @type { object } + * @property { string } id Item ID + * @property { QuoteAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE + * @property { QuoteTextDtoResponse } text Text data if type is TEXT + */ +export const QuoteAccountItemDtoResponseSchema = z.object({ id: z.string(), type: QuoteAccountItemTypeEnumSchema, orderPosition: z.number(), charge: QuoteChargeDtoResponseSchema.nullish(), text: QuoteTextDtoResponseSchema.nullish() }); +export type QuoteAccountItemDtoResponse = z.infer; - /** - * QuoteAccountResponseDtoSchema - * @type { object } - * @property { string } id Account ID - * @property { string } quoteId Quote ID - * @property { QuoteAccountItemDtoResponse[] } items Account items - * @property { object } totals Account totals - * @property { number } totals.totalBuyRates - * @property { number } totals.totalSellRates - * @property { number } totals.totalProfit - * @property { number } totals.displayAmount - * @property { string } totals.displayCurrencyCode - * @property { object[] } totalsPerCurrency Account totals per currency - * @property { number } totalsPerCurrency.[0].totalBuyRates - * @property { number } totalsPerCurrency.[0].totalSellRates - * @property { number } totalsPerCurrency.[0].totalProfit - * @property { number } totalsPerCurrency.[0].displayAmount - * @property { string } totalsPerCurrency.[0].displayCurrencyCode - */ - export const QuoteAccountResponseDtoSchema = z - .object({ - id: z.string().describe("Account ID"), - quoteId: z.string().describe("Quote ID"), - items: z.array(QuoteAccountItemDtoResponseSchema).readonly().describe("Account items"), - totals: z - .object({ - totalBuyRates: z.number(), - totalSellRates: z.number(), - totalProfit: z.number(), - displayAmount: z.number(), - displayCurrencyCode: z.string(), - }) - .readonly() - .describe("Account totals"), - totalsPerCurrency: z - .array( - z - .object({ - totalBuyRates: z.number(), - totalSellRates: z.number(), - totalProfit: z.number(), - displayAmount: z.number(), - displayCurrencyCode: z.string(), - }) - .readonly(), - ) - .readonly() - .describe("Account totals per currency"), - }) - .readonly(); - export type QuoteAccountResponseDto = z.infer; +/** + * QuoteAccountResponseDtoSchema + * @type { object } + * @property { string } id Account ID + * @property { string } quoteId Quote ID + * @property { QuoteAccountItemDtoResponse[] } items Account items + * @property { object } totals Account totals + * @property { number } totals.totalBuyRates + * @property { number } totals.totalSellRates + * @property { number } totals.totalProfit + * @property { number } totals.displayAmount + * @property { string } totals.displayCurrencyCode + * @property { object[] } totalsPerCurrency Account totals per currency + * @property { number } totalsPerCurrency.[0].totalBuyRates + * @property { number } totalsPerCurrency.[0].totalSellRates + * @property { number } totalsPerCurrency.[0].totalProfit + * @property { number } totalsPerCurrency.[0].displayAmount + * @property { string } totalsPerCurrency.[0].displayCurrencyCode + */ +export const QuoteAccountResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), items: z.array(QuoteAccountItemDtoResponseSchema), totals: z.object({ totalBuyRates: z.number().nullable(), totalSellRates: z.number().nullable(), totalProfit: z.number().nullable(), displayAmount: z.number().nullable(), displayCurrencyCode: z.string().nullable() }).partial(), totalsPerCurrency: z.array(z.object({ totalBuyRates: z.number().nullable(), totalSellRates: z.number().nullable(), totalProfit: z.number().nullable(), displayAmount: z.number().nullable(), displayCurrencyCode: z.string().nullable() }).partial()) }); +export type QuoteAccountResponseDto = z.infer; - /** - * CreateQuoteChargeDataDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1`. Default: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code. Default: `EUR` - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code. Default: `EUR` - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ - export const CreateQuoteChargeDataDtoSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID"), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().gte(1).describe("Quantity of the charge").default(1), - buyRate: z.number().describe("Buy rate amount"), - buyCurrencyCode: z.string().describe("Buy rate currency code").default("EUR"), - buyVatRuleId: z.string().describe("Buy VAT rule ID"), - vendorId: z.string().describe("Vendor ID"), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), - sellRate: z.number().describe("Sell rate amount"), - sellCurrencyCode: z.string().describe("Sell rate currency code").default("EUR"), - sellVatRuleId: z.string().describe("Sell VAT rule ID"), - customerId: z.string().describe("Customer ID"), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), - }) - .readonly(); - export type CreateQuoteChargeDataDto = z.infer; +/** + * CreateQuoteChargeDataDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1`. Default: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code. Default: `EUR` + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code. Default: `EUR` + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const CreateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable().default(1), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable().default("EUR"), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable().default("EUR"), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); +export type CreateQuoteChargeDataDto = z.infer; - /** - * CreateQuoteTextDataDtoSchema - * @type { object } - * @property { string } content Text content - */ - export const CreateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); - export type CreateQuoteTextDataDto = z.infer; +/** + * CreateQuoteTextDataDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const CreateQuoteTextDataDtoSchema = z.object({ content: z.string().nullable() }).partial(); +export type CreateQuoteTextDataDto = z.infer; - /** - * CreateQuoteAccountItemRequestDtoSchema - * @type { object } - * @property { QuoteAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { CreateQuoteChargeDataDto } charge Charge data if type is CHARGE - * @property { CreateQuoteTextDataDto } text Text data if type is TEXT - */ - export const CreateQuoteAccountItemRequestDtoSchema = z - .object({ - type: QuoteAccountItemTypeEnumSchema.describe("Item type"), - orderPosition: z.number().describe("Order position of the item").nullish(), - charge: CreateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE").nullish(), - text: CreateQuoteTextDataDtoSchema.describe("Text data if type is TEXT").nullish(), - }) - .readonly(); - export type CreateQuoteAccountItemRequestDto = z.infer; +/** + * CreateQuoteAccountItemRequestDtoSchema + * @type { object } + * @property { QuoteAccountItemTypeEnum } type Item type + * @property { number } orderPosition Order position of the item + * @property { CreateQuoteChargeDataDto } charge Charge data if type is CHARGE + * @property { CreateQuoteTextDataDto } text Text data if type is TEXT + */ +export const CreateQuoteAccountItemRequestDtoSchema = z.object({ type: QuoteAccountItemTypeEnumSchema, orderPosition: z.number().nullish(), charge: CreateQuoteChargeDataDtoSchema.nullish(), text: CreateQuoteTextDataDtoSchema.nullish() }); +export type CreateQuoteAccountItemRequestDto = z.infer; - /** - * UpdateQuoteChargeDataDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ - export const UpdateQuoteChargeDataDtoSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID"), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().gte(1).describe("Quantity of the charge"), - buyRate: z.number().describe("Buy rate amount").nullable(), - buyCurrencyCode: z.string().describe("Buy rate currency code"), - buyVatRuleId: z.string().describe("Buy VAT rule ID").nullable(), - vendorId: z.string().describe("Vendor ID").nullable(), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), - sellRate: z.number().describe("Sell rate amount").nullable(), - sellCurrencyCode: z.string().describe("Sell rate currency code"), - sellVatRuleId: z.string().describe("Sell VAT rule ID").nullable(), - customerId: z.string().describe("Customer ID").nullable(), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), - }) - .readonly(); - export type UpdateQuoteChargeDataDto = z.infer; +/** + * UpdateQuoteChargeDataDtoSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { string } additionalText Additional text for the charge + * @property { number } quantity Quantity of the charge. Minimum: `1` + * @property { number } buyRate Buy rate amount + * @property { string } buyCurrencyCode Buy rate currency code + * @property { string } buyVatRuleId Buy VAT rule ID + * @property { string } vendorId Vendor ID + * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy + * @property { number } sellRate Sell rate amount + * @property { string } sellCurrencyCode Sell rate currency code + * @property { string } sellVatRuleId Sell VAT rule ID + * @property { string } customerId Customer ID + * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy + */ +export const UpdateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); +export type UpdateQuoteChargeDataDto = z.infer; - /** - * UpdateQuoteTextDataDtoSchema - * @type { object } - * @property { string } content Text content - */ - export const UpdateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); - export type UpdateQuoteTextDataDto = z.infer; +/** + * UpdateQuoteTextDataDtoSchema + * @type { object } + * @property { string } content Text content + */ +export const UpdateQuoteTextDataDtoSchema = z.object({ content: z.string().nullable() }).partial(); +export type UpdateQuoteTextDataDto = z.infer; + +/** + * UpdateQuoteAccountItemRequestDtoSchema + * @type { object } + * @property { number } orderPosition Order position of the item + * @property { UpdateQuoteChargeDataDto } charge Charge data if type is CHARGE + * @property { UpdateQuoteTextDataDto } text Text data if type is TEXT + */ +export const UpdateQuoteAccountItemRequestDtoSchema = z.object({ orderPosition: z.number().nullable(), charge: UpdateQuoteChargeDataDtoSchema.nullable(), text: UpdateQuoteTextDataDtoSchema.nullable() }).partial(); +export type UpdateQuoteAccountItemRequestDto = z.infer; - /** - * UpdateQuoteAccountItemRequestDtoSchema - * @type { object } - * @property { number } orderPosition Order position of the item - * @property { UpdateQuoteChargeDataDto } charge Charge data if type is CHARGE - * @property { UpdateQuoteTextDataDto } text Text data if type is TEXT - */ - export const UpdateQuoteAccountItemRequestDtoSchema = z - .object({ - orderPosition: z.number().describe("Order position of the item"), - charge: UpdateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE"), - text: UpdateQuoteTextDataDtoSchema.describe("Text data if type is TEXT"), - }) - .readonly(); - export type UpdateQuoteAccountItemRequestDto = z.infer; } diff --git a/test/generated/base/quoteAccount/quoteAccount.queries.ts b/test/generated/base/quoteAccount/quoteAccount.queries.ts index abb1ca4..eeba0f1 100644 --- a/test/generated/base/quoteAccount/quoteAccount.queries.ts +++ b/test/generated/base/quoteAccount/quoteAccount.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,179 +8,146 @@ import { QuoteAccountModels } from "./quoteAccount.models"; import { QuoteAccountApi } from "./quoteAccount.api"; export namespace QuoteAccountQueries { - export const moduleName = QueryModule.QuoteAccount; +export const moduleName = QueryModule.QuoteAccount; - export const keys = { +export const keys = { all: [moduleName] as const, - get: (quoteId: string, officeId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/account", quoteId, officeId] as const, - }; + get: (quoteId: string, officeId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account", quoteId, officeId] as const, +}; - /** - * Query `useGet` - * @summary Get quote account details - * @permission Requires `canUseGet` ability - * @param { string } object.quoteId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { quoteId, officeId }: { quoteId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGet` + * @summary Get quote account details + * @permission Requires `canUseGet` ability + * @param { string } object.quoteId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ quoteId, officeId }: { quoteId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(quoteId, officeId), + queryFn: () => { + checkAcl(QuoteAccountAcl.canUseGet({ officeId } )); + return QuoteAccountApi.get(quoteId, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.get(quoteId, officeId), - queryFn: () => { - checkAcl(QuoteAccountAcl.canUseGet({ officeId })); - return QuoteAccountApi.get(quoteId, officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useCreateItem` + * @summary Create quote account item + * @permission Requires `canUseCreateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { QuoteAccountModels.CreateQuoteAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreateItem` - * @summary Create quote account item - * @permission Requires `canUseCreateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { QuoteAccountModels.CreateQuoteAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateItem = ( - options?: AppMutationOptions< - typeof QuoteAccountApi.createItem, - { quoteId: string; officeId: string; data: QuoteAccountModels.CreateQuoteAccountItemRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ quoteId, officeId, data }) => { + checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId } )); + return QuoteAccountApi.createItem(quoteId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ quoteId, officeId, data }) => { - checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId })); - return QuoteAccountApi.createItem(quoteId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteItem` + * @summary Delete quote account item + * @permission Requires `canUseDeleteItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteItem = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteItem` - * @summary Delete quote account item - * @permission Requires `canUseDeleteItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteItem = ( - options?: AppMutationOptions< - typeof QuoteAccountApi.deleteItem, - { quoteId: string; itemId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId }) => { + checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId } )); + return QuoteAccountApi.deleteItem(quoteId, itemId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId }) => { - checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId })); - return QuoteAccountApi.deleteItem(quoteId, itemId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdateItem` + * @summary Update quote account item + * @permission Requires `canUseUpdateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { QuoteAccountModels.UpdateQuoteAccountItemRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdateItem` - * @summary Update quote account item - * @permission Requires `canUseUpdateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { QuoteAccountModels.UpdateQuoteAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateItem = ( - options?: AppMutationOptions< - typeof QuoteAccountApi.updateItem, - { quoteId: string; itemId: string; officeId: string; data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId, data }) => { + checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId } )); + return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId, data }) => { - checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId })); - return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDuplicateItem` + * @summary Duplicate quote account item + * @permission Requires `canUseDuplicateItem` ability + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.itemId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDuplicateItem` - * @summary Duplicate quote account item - * @permission Requires `canUseDuplicateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicateItem = ( - options?: AppMutationOptions< - typeof QuoteAccountApi.duplicateItem, - { quoteId: string; itemId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ quoteId, itemId, officeId }) => { + checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId } )); + return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId }) => { - checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId })); - return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/quoteCargo/quoteCargo.acl.ts b/test/generated/base/quoteCargo/quoteCargo.acl.ts index fcf6fb3..38031c0 100644 --- a/test/generated/base/quoteCargo/quoteCargo.acl.ts +++ b/test/generated/base/quoteCargo/quoteCargo.acl.ts @@ -1,99 +1,108 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace QuoteCargoAcl { - /** - * Use for `useListCargosByQuoteId` query ability. For global ability, omit the object parameter. - * @description List cargo items by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByQuoteId` query - */ - export const canUseListCargosByQuoteId = (object?: { officeId: string }) => - ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Read", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useListCargosByQuoteId` query ability. For global ability, omit the object parameter. + * @description List cargo items by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByQuoteId` query + */ +export const canUseListCargosByQuoteId = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. - * @description List cargo labels by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query - */ - export const canUseListCargoLabels = (object?: { officeId: string }) => - ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Read", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. + * @description List cargo labels by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query + */ +export const canUseListCargoLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. - * @description Get cargo summary by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query - */ - export const canUseGetCargoSummary = (object?: { officeId: string }) => - ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Read", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. + * @description Get cargo summary by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query + */ +export const canUseGetCargoSummary = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. - * @description Get cargo item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query - */ - export const canUseGetCargoById = (object?: { officeId: string }) => - ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Read", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. + * @description Get cargo item by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query + */ +export const canUseGetCargoById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. - * @description Update cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation - */ - export const canUseUpdateCargo = (object?: { officeId: string }) => - ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Update", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. + * @description Update cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation + */ +export const canUseUpdateCargo = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation - */ - export const canUseDeleteCargo = (object?: { officeId: string }) => - ["Delete", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Delete", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation + */ +export const canUseDeleteCargo = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation - */ - export const canUseCreateBulkCargos = (object?: { officeId: string }) => - ["Create", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Create", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. + * @description Create cargo item for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation + */ +export const canUseCreateBulkCargos = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo item + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation + */ +export const canUseDuplicateCargo = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation - */ - export const canUseDuplicateCargo = (object?: { officeId: string }) => - ["Duplicate", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Duplicate", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; } diff --git a/test/generated/base/quoteCargo/quoteCargo.api.ts b/test/generated/base/quoteCargo/quoteCargo.api.ts index ad1b5ae..3d52cf1 100644 --- a/test/generated/base/quoteCargo/quoteCargo.api.ts +++ b/test/generated/base/quoteCargo/quoteCargo.api.ts @@ -1,116 +1,73 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { QuoteCargoModels } from "./quoteCargo.models"; import { CommonModels } from "@/data/common/common.models"; export namespace QuoteCargoApi { - export const listCargosByQuoteId = ( - officeId: string, - quoteId: string, - limit: number, - order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const listCargosByQuoteId = (officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos`, - { - ...config, - params: { - order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { - type: "query", - name: "order", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const listCargoLabels = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos`, + { + params: { + order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const listCargoLabels = (officeId: string, quoteId: string, ) => { return AppRestClient.get( - { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, - config, - ); - }; - - export const getCargoSummary = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, + + ) +}; +export const getCargoSummary = (officeId: string, quoteId: string, ) => { return AppRestClient.get( - { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, - config, - ); - }; - - export const getCargoById = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, + + ) +}; +export const getCargoById = (officeId: string, quoteId: string, cargoId: string, ) => { return AppRestClient.get( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - config, - ); - }; - - export const updateCargo = ( - officeId: string, - quoteId: string, - cargoId: string, - data: CommonModels.UpdatePositionCargoDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + + ) +}; +export const updateCargo = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, ) => { return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - config, - ); - }; - - export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), + + ) +}; +export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - undefined, - config, - ); - }; - - export const createBulkCargos = ( - numberOfCargos: number, - officeId: string, - quoteId: string, - data: CommonModels.CreatePositionCargoDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, + + ) +}; +export const createBulkCargos = (numberOfCargos: number, officeId: string, quoteId: string, data: CommonModels.CreatePositionCargoDTO, ) => { return AppRestClient.post( - { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config, - ); - }; - - export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { + { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, + ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), + + ) +}; +export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, - undefined, - config, - ); - }; + { resSchema: CommonModels.PositionCargoResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, + + ) +}; } diff --git a/test/generated/base/quoteCargo/quoteCargo.configs.ts b/test/generated/base/quoteCargo/quoteCargo.configs.ts index a00a304..bbd862c 100644 --- a/test/generated/base/quoteCargo/quoteCargo.configs.ts +++ b/test/generated/base/quoteCargo/quoteCargo.configs.ts @@ -5,95 +5,96 @@ import { QuoteCargoQueries } from "./quoteCargo.queries"; import { QuoteCargoAcl } from "./quoteCargo.acl"; export namespace QuoteCargoConfigs { - export const cargosConfig = { +export const cargosConfig = { meta: { - title: "Cargos", + title: "Cargos", }, readAll: { - acl: QuoteCargoAcl.canUseListCargosByQuoteId, - schema: CommonModels.PositionCargoResponseDTOSchema, - paginated: QuoteCargoQueries.useListCargosByQuoteId, - infinite: QuoteCargoQueries.useListCargosByQuoteIdInfinite, - columns: dynamicColumns({ + acl: QuoteCargoAcl.canUseListCargosByQuoteId, schema: CommonModels.PositionCargoResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - quoteId: true, - rootFolderId: true, - cargoType: true, - autoCalculateTotals: true, - autoCalculateRates: true, - autoCalculateVgm: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - rateOptions: true, - rateClass: true, - textForCustoms: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - ratePerKg: true, - totalRate: true, - tare: true, - vgm: true, - hsCodeLabels: true, - note: true, - packages: true, - createdAt: true, - updatedAt: true, - completeWeight: true, - packageTotals: true, - }, - }, - }), + paginated: QuoteCargoQueries.useListCargosByQuoteId, + infinite: QuoteCargoQueries.useListCargosByQuoteIdInfinite, + columns: dynamicColumns({ + schema: CommonModels.PositionCargoResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + quoteId: true, + rootFolderId: true, + cargoType: true, + autoCalculateTotals: true, + autoCalculateRates: true, + autoCalculateVgm: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + rateOptions: true, + rateClass: true, + textForCustoms: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + ratePerKg: true, + totalRate: true, + tare: true, + vgm: true, + hsCodeLabels: true, + note: true, + packages: true, + createdAt: true, + updatedAt: true, + completeWeight: true, + packageTotals: true, + }, + }, +}), }, read: { - acl: QuoteCargoAcl.canUseGetCargoById, - schema: CommonModels.PositionCargoResponseDTOSchema, - query: QuoteCargoQueries.useGetCargoById, + acl: QuoteCargoAcl.canUseGetCargoById, + schema: CommonModels.PositionCargoResponseDTOSchema, + query: QuoteCargoQueries.useGetCargoById, }, update: { - acl: QuoteCargoAcl.canUseUpdateCargo, - schema: CommonModels.UpdatePositionCargoDTOSchema, - mutation: QuoteCargoQueries.useUpdateCargo, - inputDefs: dynamicInputs({ + acl: QuoteCargoAcl.canUseUpdateCargo, schema: CommonModels.UpdatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, - }), + mutation: QuoteCargoQueries.useUpdateCargo, + inputDefs: dynamicInputs({ + schema: CommonModels.UpdatePositionCargoDTOSchema, + options: { + inputs: { + cargoTypeId: true, + note: true, + autoCalculateTotals: true, + transportUnitNumber: true, + seal1: true, + seal2: true, + totalVolume: true, + totalGrossWeight: true, + totalNetWeight: true, + totalVolumetricWeight: true, + totalChargeableWeight: true, + totalLoadMeter: true, + rateOptions: true, + rateClass: true, + ratePerKg: true, + totalRate: true, + textForCustoms: true, + tare: true, + vgm: true, + autoCalculateRates: true, + autoCalculateVgm: true, + }, + }, +}) }, delete: { - acl: QuoteCargoAcl.canUseDeleteCargo, - mutation: QuoteCargoQueries.useDeleteCargo, + acl: QuoteCargoAcl.canUseDeleteCargo, + mutation: QuoteCargoQueries.useDeleteCargo, }, - }; +}; + } diff --git a/test/generated/base/quoteCargo/quoteCargo.models.ts b/test/generated/base/quoteCargo/quoteCargo.models.ts index 8549bbb..8d7a3a0 100644 --- a/test/generated/base/quoteCargo/quoteCargo.models.ts +++ b/test/generated/base/quoteCargo/quoteCargo.models.ts @@ -2,54 +2,45 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace QuoteCargoModels { - /** - * ListCargosByQuoteIdOrderParamSchema - * @type { array } - * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - */ - export const ListCargosByQuoteIdOrderParamSchema = z - .array(CommonModels.PositionCargoPaginationOrderFieldSchema) - .readonly() - .describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt") - .nullish(); - export type ListCargosByQuoteIdOrderParam = z.infer; +/** + * ListCargosByQuoteIdOrderParamSchema + * @type { array } + */ +export const ListCargosByQuoteIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).nullish(); +export type ListCargosByQuoteIdOrderParam = z.infer; - /** - * ListCargosByQuoteIdResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.PositionCargoResponseDTO[] } items - */ - export const ListCargosByQuoteIdResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ListCargosByQuoteIdResponse = z.infer; +/** + * ListCargosByQuoteIdResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.PositionCargoResponseDTO[] } items + */ +export const ListCargosByQuoteIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).nullable() }).partial().shape }); +export type ListCargosByQuoteIdResponse = z.infer; - /** - * QuoteCargoListCargoLabelsResponseSchema - * @type { array } - */ - export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type QuoteCargoListCargoLabelsResponse = z.infer; +/** + * QuoteCargoListCargoLabelsResponseSchema + * @type { array } + */ +export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); +export type QuoteCargoListCargoLabelsResponse = z.infer; - /** - * QuoteCargoGetCargoSummaryResponseSchema - * @type { array } - */ - export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); - export type QuoteCargoGetCargoSummaryResponse = z.infer; +/** + * QuoteCargoGetCargoSummaryResponseSchema + * @type { array } + */ +export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema); +export type QuoteCargoGetCargoSummaryResponse = z.infer; + +/** + * QuoteCargoCreateBulkCargosResponseSchema + * @type { array } + */ +export const QuoteCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema); +export type QuoteCargoCreateBulkCargosResponse = z.infer; - /** - * QuoteCargoCreateBulkCargosResponseSchema - * @type { array } - */ - export const QuoteCargoCreateBulkCargosResponseSchema = z - .array(CommonModels.PositionCargoResponseDTOSchema) - .readonly(); - export type QuoteCargoCreateBulkCargosResponse = z.infer; } diff --git a/test/generated/base/quoteCargo/quoteCargo.queries.ts b/test/generated/base/quoteCargo/quoteCargo.queries.ts index 4b8d52a..3156a3e 100644 --- a/test/generated/base/quoteCargo/quoteCargo.queries.ts +++ b/test/generated/base/quoteCargo/quoteCargo.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,371 +9,257 @@ import { CommonModels } from "@/data/common/common.models"; import { QuoteCargoApi } from "./quoteCargo.api"; export namespace QuoteCargoQueries { - export const moduleName = QueryModule.QuoteCargo; +export const moduleName = QueryModule.QuoteCargo; - export const keys = { +export const keys = { all: [moduleName] as const, - listCargosByQuoteId: ( - officeId: string, - quoteId: string, - limit?: number, - order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/cargos", - officeId, - quoteId, - limit, - order, - page, - cursor, - ] as const, - listCargosByQuoteIdInfinite: ( - officeId: string, - quoteId: string, - limit?: number, - order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/cargos", - "infinite", - officeId, - quoteId, - limit, - order, - cursor, - ] as const, - listCargoLabels: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/labels", officeId, quoteId] as const, - getCargoSummary: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/summary", officeId, quoteId] as const, - getCargoById: (officeId: string, quoteId: string, cargoId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/:cargoId", officeId, quoteId, cargoId] as const, - }; + listCargosByQuoteId: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", officeId, quoteId, limit, order, page, cursor] as const, + listCargosByQuoteIdInfinite: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", "infinite", officeId, quoteId, limit, order, cursor] as const, + listCargoLabels: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/labels", officeId, quoteId] as const, + getCargoSummary: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/summary", officeId, quoteId] as const, + getCargoById: (officeId: string, quoteId: string, cargoId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/:cargoId", officeId, quoteId, cargoId] as const, +}; - /** - * Query `useListCargosByQuoteId` - * @summary List all cargo items for a quote - * @permission Requires `canUseListCargosByQuoteId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargosByQuoteId = ( - { - officeId, - quoteId, - limit, - order, - page, - cursor, - }: { - officeId: string; - quoteId: string; - limit: number; - order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useListCargosByQuoteId` + * @summary List all cargo items for a quote + * @permission Requires `canUseListCargosByQuoteId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByQuoteId = ({ officeId, quoteId, limit, order, page, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId })); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useListCargosByQuoteIdInfinite + * @summary List all cargo items for a quote + * @permission Requires `canUseListCargosByQuoteId` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargosByQuoteIdInfinite = ({ officeId, quoteId, limit, order, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListCargosByQuoteIdInfinite - * @summary List all cargo items for a quote - * @permission Requires `canUseListCargosByQuoteId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargosByQuoteIdInfinite = ( - { - officeId, - quoteId, - limit, - order, - cursor, - }: { - officeId: string; - quoteId: string; - limit: number; - order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId })); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useListCargoLabels` - * @summary List all cargo labels for a quote - * @permission Requires `canUseListCargoLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargoLabels = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useQuery({ - queryKey: keys.listCargoLabels(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId })); - return QuoteCargoApi.listCargoLabels(officeId, quoteId, config); - }, - ...options, - }); - }; +/** + * Query `useListCargoLabels` + * @summary List all cargo labels for a quote + * @permission Requires `canUseListCargoLabels` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListCargoLabels = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listCargoLabels(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId } )); + return QuoteCargoApi.listCargoLabels(officeId, quoteId) }, + ...options, + }); +}; - /** - * Query `useGetCargoSummary` - * @summary Get cargo summary grouped by transport unit type - * @permission Requires `canUseGetCargoSummary` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCargoSummary = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetCargoSummary` + * @summary Get cargo summary grouped by transport unit type + * @permission Requires `canUseGetCargoSummary` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoSummary = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoSummary(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId } )); + return QuoteCargoApi.getCargoSummary(officeId, quoteId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getCargoSummary(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId })); - return QuoteCargoApi.getCargoSummary(officeId, quoteId, config); - }, - ...options, - }); - }; +/** + * Query `useGetCargoById` + * @summary Get a specific cargo item + * @permission Requires `canUseGetCargoById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { string } object.cargoId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCargoById = ({ officeId, quoteId, cargoId }: { officeId: string, quoteId: string, cargoId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCargoById(officeId, quoteId, cargoId), + queryFn: () => { + checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId } )); + return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId) }, + ...options, + }); +}; - /** - * Query `useGetCargoById` - * @summary Get a specific cargo item - * @permission Requires `canUseGetCargoById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { string } object.cargoId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCargoById = ( - { officeId, quoteId, cargoId }: { officeId: string; quoteId: string; cargoId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Mutation `useUpdateCargo` + * @summary Update a cargo item + * @permission Requires `canUseUpdateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useQuery({ - queryKey: keys.getCargoById(officeId, quoteId, cargoId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId })); - return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateCargo` - * @summary Update a cargo item - * @permission Requires `canUseUpdateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCargo = ( - options?: AppMutationOptions< - typeof QuoteCargoApi.updateCargo, - { officeId: string; quoteId: string; cargoId: string; data: CommonModels.UpdatePositionCargoDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, data }) => { + checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId } )); + return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, data }) => { - checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId })); - return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteCargo` + * @summary Delete a cargo item + * @permission Requires `canUseDeleteCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteCargo` - * @summary Delete a cargo item - * @permission Requires `canUseDeleteCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteCargo = ( - options?: AppMutationOptions< - typeof QuoteCargoApi.deleteCargo, - { officeId: string; quoteId: string; cargoId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId }) => { + checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId } )); + return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId }) => { - checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId })); - return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useCreateBulkCargos` + * @summary Create a new cargo item + * @permission Requires `canUseCreateBulkCargos` ability + * @param { number } mutation.numberOfCargos Path parameter + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreateBulkCargos` - * @summary Create a new cargo item - * @permission Requires `canUseCreateBulkCargos` ability - * @param { number } mutation.numberOfCargos Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateBulkCargos = ( - options?: AppMutationOptions< - typeof QuoteCargoApi.createBulkCargos, - { numberOfCargos: number; officeId: string; quoteId: string; data: CommonModels.CreatePositionCargoDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { + checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId } )); + return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { - checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId })); - return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDuplicateCargo` + * @summary Duplicate a cargo item + * @permission Requires `canUseDuplicateCargo` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDuplicateCargo` - * @summary Duplicate a cargo item - * @permission Requires `canUseDuplicateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicateCargo = ( - options?: AppMutationOptions< - typeof QuoteCargoApi.duplicateCargo, - { officeId: string; quoteId: string; cargoId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId }) => { + checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId } )); + return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId, cargoId } = variables; + const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId }) => { - checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId })); - return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts b/test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts index d129f69..da1d43f 100644 --- a/test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts +++ b/test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts @@ -1,63 +1,69 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace QuoteCargoPackageAcl { - /** - * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. - * @description Create cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation - */ - export const canUseCreatePackage = (object?: { officeId: string }) => - ["Create", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Create", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. + * @description Create cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation + */ +export const canUseCreatePackage = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. - * @description Update cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation - */ - export const canUseUpdatePackage = (object?: { officeId: string }) => - ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Update", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. + * @description Update cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation + */ +export const canUseUpdatePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation - */ - export const canUseDeletePackage = (object?: { officeId: string }) => - ["Delete", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Delete", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. + * @description Delete cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation + */ +export const canUseDeletePackage = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation - */ - export const canUseDuplicatePackage = (object?: { officeId: string }) => - ["Duplicate", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Duplicate", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; +/** + * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. + * @description Duplicate cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation + */ +export const canUseDuplicatePackage = ( + object?: { officeId: string, } +) => [ + "Duplicate", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; + +/** + * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. + * @description Move cargo package + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation + */ +export const canUseMovePackage = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("QuoteCargo", object) : "QuoteCargo" +] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - /** - * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. - * @description Move cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation - */ - export const canUseMovePackage = (object?: { officeId: string }) => - ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Update", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; } diff --git a/test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts b/test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts index 8e9191a..f399bc6 100644 --- a/test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts +++ b/test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts @@ -1,84 +1,45 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; export namespace QuoteCargoPackageApi { - export const createPackage = ( - officeId: string, - quoteId: string, - cargoId: string, - data: CommonModels.CreatePositionCargoPackageDTO, - config?: AxiosRequestConfig, - ) => { +export const createPackage = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, - ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - config, - ); - }; - - export const updatePackage = ( - officeId: string, - quoteId: string, - cargoId: string, - packageId: string, - data: CommonModels.UpdatePositionCargoPackageDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, + ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), + + ) +}; +export const updatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, ) => { return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - config, - ); - }; - - export const deletePackage = ( - officeId: string, - quoteId: string, - cargoId: string, - packageId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, + ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), + + ) +}; +export const deletePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - undefined, - config, - ); - }; - - export const duplicatePackage = ( - officeId: string, - quoteId: string, - cargoId: string, - packageId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, + + ) +}; +export const duplicatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - undefined, - config, - ); - }; - - export const movePackage = ( - officeId: string, - quoteId: string, - cargoId: string, - packageId: string, - data: CommonModels.MovePositionCargoPackageRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, + + ) +}; +export const movePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, ) => { return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, - ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - config, - ); - }; + { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, + ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts b/test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts index 38cf1ca..8556a3a 100644 --- a/test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts +++ b/test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,199 +8,155 @@ import { CommonModels } from "@/data/common/common.models"; import { QuoteCargoPackageApi } from "./quoteCargoPackage.api"; export namespace QuoteCargoPackageQueries { - export const moduleName = QueryModule.QuoteCargoPackage; +export const moduleName = QueryModule.QuoteCargoPackage; - /** - * Mutation `useCreatePackage` - * @summary Create a new package for a cargo - * @permission Requires `canUseCreatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreatePackage = ( - options?: AppMutationOptions< - typeof QuoteCargoPackageApi.createPackage, - { officeId: string; quoteId: string; cargoId: string; data: CommonModels.CreatePositionCargoPackageDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId })); - return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - /** - * Mutation `useUpdatePackage` - * @summary Update a package - * @permission Requires `canUseUpdatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdatePackage = ( - options?: AppMutationOptions< - typeof QuoteCargoPackageApi.updatePackage, - { - officeId: string; - quoteId: string; - cargoId: string; - packageId: string; - data: CommonModels.UpdatePositionCargoPackageDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreatePackage` + * @summary Create a new package for a cargo + * @permission Requires `canUseCreatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId })); - return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId } )); + return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useDeletePackage` - * @summary Delete a package - * @permission Requires `canUseDeletePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeletePackage = ( - options?: AppMutationOptions< - typeof QuoteCargoPackageApi.deletePackage, - { officeId: string; quoteId: string; cargoId: string; packageId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdatePackage` + * @summary Update a package + * @permission Requires `canUseUpdatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { - checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId })); - return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId } )); + return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useDuplicatePackage` - * @summary Duplicate a package - * @permission Requires `canUseDuplicatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicatePackage = ( - options?: AppMutationOptions< - typeof QuoteCargoPackageApi.duplicatePackage, - { officeId: string; quoteId: string; cargoId: string; packageId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useDeletePackage` + * @summary Delete a package + * @permission Requires `canUseDeletePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { - checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId })); - return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { + checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId } )); + return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useMovePackage` - * @summary Move a package to a different cargo - * @permission Requires `canUseMovePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useMovePackage = ( - options?: AppMutationOptions< - typeof QuoteCargoPackageApi.movePackage, - { - officeId: string; - quoteId: string; - cargoId: string; - packageId: string; - data: CommonModels.MovePositionCargoPackageRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useDuplicatePackage` + * @summary Duplicate a package + * @permission Requires `canUseDuplicatePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { + checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId } )); + return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMovePackage` + * @summary Move a package to a different cargo + * @permission Requires `canUseMovePackage` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.cargoId Path parameter + * @param { string } mutation.packageId Path parameter + * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { + checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId } )); + return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId })); - return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/quoteConversion/quoteConversion.acl.ts b/test/generated/base/quoteConversion/quoteConversion.acl.ts index 3c9b7f1..8c0f3c4 100644 --- a/test/generated/base/quoteConversion/quoteConversion.acl.ts +++ b/test/generated/base/quoteConversion/quoteConversion.acl.ts @@ -1,15 +1,17 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace QuoteConversionAcl { - /** - * Use for `useConvertQuoteToPosition` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useConvertQuoteToPosition` mutation - */ - export const canUseConvertQuoteToPosition = (object?: { officeId: string }) => - ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Create", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useConvertQuoteToPosition` mutation ability. For global ability, omit the object parameter. + * @description Create position for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useConvertQuoteToPosition` mutation + */ +export const canUseConvertQuoteToPosition = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + } diff --git a/test/generated/base/quoteConversion/quoteConversion.api.ts b/test/generated/base/quoteConversion/quoteConversion.api.ts index 7bc1111..ecf19cc 100644 --- a/test/generated/base/quoteConversion/quoteConversion.api.ts +++ b/test/generated/base/quoteConversion/quoteConversion.api.ts @@ -1,21 +1,15 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; import { QuoteConversionModels } from "./quoteConversion.models"; export namespace QuoteConversionApi { - export const convertQuoteToPosition = ( - officeId: string, - quoteId: string, - data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, - config?: AxiosRequestConfig, - ) => { +export const convertQuoteToPosition = (officeId: string, quoteId: string, data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, ) => { return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/convert`, - ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), - config, - ); - }; + { resSchema: CommonModels.PositionCoreResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/convert`, + ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/quoteConversion/quoteConversion.models.ts b/test/generated/base/quoteConversion/quoteConversion.models.ts index 9eab729..ccca298 100644 --- a/test/generated/base/quoteConversion/quoteConversion.models.ts +++ b/test/generated/base/quoteConversion/quoteConversion.models.ts @@ -1,13 +1,12 @@ import { z } from "zod"; export namespace QuoteConversionModels { - /** - * ConvertQuoteToPositionRequestDtoSchema - * @type { object } - * @property { string } estimatedServiceDate - */ - export const ConvertQuoteToPositionRequestDtoSchema = z - .object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }) - .readonly(); - export type ConvertQuoteToPositionRequestDto = z.infer; +/** + * ConvertQuoteToPositionRequestDtoSchema + * @type { object } + * @property { string } estimatedServiceDate + */ +export const ConvertQuoteToPositionRequestDtoSchema = z.object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }); +export type ConvertQuoteToPositionRequestDto = z.infer; + } diff --git a/test/generated/base/quoteConversion/quoteConversion.queries.ts b/test/generated/base/quoteConversion/quoteConversion.queries.ts index 3695789..bfba951 100644 --- a/test/generated/base/quoteConversion/quoteConversion.queries.ts +++ b/test/generated/base/quoteConversion/quoteConversion.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,40 +8,36 @@ import { QuoteConversionModels } from "./quoteConversion.models"; import { QuoteConversionApi } from "./quoteConversion.api"; export namespace QuoteConversionQueries { - export const moduleName = QueryModule.QuoteConversion; +export const moduleName = QueryModule.QuoteConversion; - /** - * Mutation `useConvertQuoteToPosition` - * @summary Convert quote to position - * @permission Requires `canUseConvertQuoteToPosition` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteConversionModels.ConvertQuoteToPositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Quote converted to position successfully - * @statusCodes [201, 400, 401, 404] - */ - export const useConvertQuoteToPosition = ( - options?: AppMutationOptions< - typeof QuoteConversionApi.convertQuoteToPosition, - { officeId: string; quoteId: string; data: QuoteConversionModels.ConvertQuoteToPositionRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId })); - return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + +/** + * Mutation `useConvertQuoteToPosition` + * @summary Convert quote to position + * @permission Requires `canUseConvertQuoteToPosition` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteConversionModels.ConvertQuoteToPositionRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Quote converted to position successfully + * @statusCodes [201, 400, 401, 404] + */ +export const useConvertQuoteToPosition = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId } )); + return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + } diff --git a/test/generated/base/quoteDocument/quoteDocument.acl.ts b/test/generated/base/quoteDocument/quoteDocument.acl.ts index bb144a6..43dec1f 100644 --- a/test/generated/base/quoteDocument/quoteDocument.acl.ts +++ b/test/generated/base/quoteDocument/quoteDocument.acl.ts @@ -1,63 +1,69 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace QuoteDocumentAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useGetPreview` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` mutation - */ - export const canUseGetPreview = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useGetPreview` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` mutation + */ +export const canUseGetPreview = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ - export const canUseGenerate = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useGenerateEml` mutation ability. For global ability, omit the object parameter. + * @description Read quote document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateEml` mutation + */ +export const canUseGenerateEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useGenerateEml` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateEml` mutation - */ - export const canUseGenerateEml = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; } diff --git a/test/generated/base/quoteDocument/quoteDocument.api.ts b/test/generated/base/quoteDocument/quoteDocument.api.ts index 7544692..9c7c296 100644 --- a/test/generated/base/quoteDocument/quoteDocument.api.ts +++ b/test/generated/base/quoteDocument/quoteDocument.api.ts @@ -1,85 +1,58 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { QuoteDocumentModels } from "./quoteDocument.models"; export namespace QuoteDocumentApi { - export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, quoteId: string, ) => { return AppRestClient.get( - { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/document`, - config, - ); - }; - - export const update = ( - officeId: string, - quoteId: string, - data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/document`, + + ) +}; +export const update = (officeId: string, quoteId: string, data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, ) => { return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/document`, - ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), - config, - ); - }; - - export const getPreview = ( - officeId: string, - quoteId: string, - data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/document`, + ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), + + ) +}; +export const getPreview = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/${quoteId}/document/preview`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generate = ( - officeId: string, - quoteId: string, - data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/${quoteId}/document/preview`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generate = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/document/generate`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - config, - ); - }; - - export const generateEml = ( - officeId: string, - quoteId: string, - data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/document/generate`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), + + ) +}; +export const generateEml = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/${quoteId}/document/eml`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/${quoteId}/document/eml`, + ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; } diff --git a/test/generated/base/quoteDocument/quoteDocument.models.ts b/test/generated/base/quoteDocument/quoteDocument.models.ts index ea237e2..73bb8da 100644 --- a/test/generated/base/quoteDocument/quoteDocument.models.ts +++ b/test/generated/base/quoteDocument/quoteDocument.models.ts @@ -2,197 +2,133 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace QuoteDocumentModels { - /** - * QuoteDocumentDataDtoSchema - * @type { object } - * @property { CommonModels.RouteTableBlockResponseDto } routeTable - * @property { CommonModels.CargoTableBlockDto } cargoTable - * @property { CommonModels.FinanceTableBlockDto } financeTable - */ - export const QuoteDocumentDataDtoSchema = z - .object({ - routeTable: CommonModels.RouteTableBlockResponseDtoSchema, - cargoTable: CommonModels.CargoTableBlockDtoSchema, - financeTable: CommonModels.FinanceTableBlockDtoSchema, - }) - .readonly(); - export type QuoteDocumentDataDto = z.infer; +/** + * QuoteDocumentDataDtoSchema + * @type { object } + * @property { CommonModels.RouteTableBlockResponseDto } routeTable + * @property { CommonModels.CargoTableBlockDto } cargoTable + * @property { CommonModels.FinanceTableBlockDto } financeTable + */ +export const QuoteDocumentDataDtoSchema = z.object({ routeTable: CommonModels.RouteTableBlockResponseDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockDtoSchema.nullable() }).partial(); +export type QuoteDocumentDataDto = z.infer; - /** - * QuoteDocumentConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl - * @property { string } headerImageUrl - * @property { string } termsAndConditionsImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ - export const QuoteDocumentConfigDtoSchema = z - .object({ - footerImageUrl: z.string().nullish(), - headerImageUrl: z.string().nullish(), - termsAndConditionsImageUrl: z.string().nullish(), - showWatermarkOnDocuments: z.boolean(), - locale: CommonModels.LocaleEnumSchema.nullish(), - }) - .readonly(); - export type QuoteDocumentConfigDto = z.infer; +/** + * QuoteDocumentConfigDtoSchema + * @type { object } + * @property { string } footerImageUrl + * @property { string } headerImageUrl + * @property { string } termsAndConditionsImageUrl + * @property { boolean } showWatermarkOnDocuments + * @property { CommonModels.LocaleEnum } locale + */ +export const QuoteDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), termsAndConditionsImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); +export type QuoteDocumentConfigDto = z.infer; - /** - * CustomerDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - */ - export const CustomerDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); - export type CustomerDto = z.infer; +/** + * CustomerDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + */ +export const CustomerDtoSchema = z.object({ name: z.string(), address: z.string() }); +export type CustomerDto = z.infer; - /** - * ContactDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } phone - * @property { string } date - * @property { string } validFrom - * @property { string } validUntil - */ - export const ContactDtoSchema = z - .object({ - name: z.string(), - email: z.string(), - phone: z.string(), - date: z.iso.datetime({ offset: true }), - validFrom: z.iso.datetime({ offset: true }).nullish(), - validUntil: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type ContactDto = z.infer; +/** + * ContactDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } phone + * @property { string } date + * @property { string } validFrom + * @property { string } validUntil + */ +export const ContactDtoSchema = z.object({ name: z.string(), email: z.string(), phone: z.string(), date: z.iso.datetime({ offset: true }), validFrom: z.iso.datetime({ offset: true }).nullish(), validUntil: z.iso.datetime({ offset: true }).nullish() }); +export type ContactDto = z.infer; - /** - * QuoteDocumentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } quoteId - * @property { string } quoteNumber - * @property { CommonModels.TransportModeEnum } quoteTransportMode Mode of transport - * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote - * @property { string } transitDurationInDays Transit duration in days - * @property { CustomerDto } customer - * @property { ContactDto } contact - * @property { QuoteDocumentDataDto } data - * @property { boolean } suspendCargoTable - * @property { boolean } suspendFinanceTable - * @property { CommonModels.EditorContentResponseDto } bodyRemarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks - * @property { boolean } isIssued - * @property { number } version - * @property { QuoteDocumentConfigDto } config - * @property { string } issuedAt - */ - export const QuoteDocumentResponseDtoSchema = z - .object({ - id: z.string(), - quoteId: z.string(), - quoteNumber: z.string(), - quoteTransportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), - frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), - transitDurationInDays: z.string().describe("Transit duration in days").nullish(), - customer: CustomerDtoSchema, - contact: ContactDtoSchema, - data: QuoteDocumentDataDtoSchema.nullish(), - suspendCargoTable: z.boolean(), - suspendFinanceTable: z.boolean(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), - isIssued: z.boolean(), - version: z.number(), - config: QuoteDocumentConfigDtoSchema.nullish(), - issuedAt: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type QuoteDocumentResponseDto = z.infer; +/** + * QuoteDocumentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } quoteId + * @property { string } quoteNumber + * @property { CommonModels.TransportModeEnum } quoteTransportMode Mode of transport + * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote + * @property { string } transitDurationInDays Transit duration in days + * @property { CustomerDto } customer + * @property { ContactDto } contact + * @property { QuoteDocumentDataDto } data + * @property { boolean } suspendCargoTable + * @property { boolean } suspendFinanceTable + * @property { CommonModels.EditorContentResponseDto } bodyRemarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks + * @property { boolean } isIssued + * @property { number } version + * @property { QuoteDocumentConfigDto } config + * @property { string } issuedAt + */ +export const QuoteDocumentResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), quoteNumber: z.string(), quoteTransportMode: CommonModels.TransportModeEnumSchema, frequency: CommonModels.FrequencyEnumSchema.nullish(), transitDurationInDays: z.string().nullish(), customer: CustomerDtoSchema, contact: ContactDtoSchema, data: QuoteDocumentDataDtoSchema.nullish(), suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), isIssued: z.boolean(), version: z.number(), config: QuoteDocumentConfigDtoSchema.nullish(), issuedAt: z.iso.datetime({ offset: true }).nullish() }); +export type QuoteDocumentResponseDto = z.infer; - /** - * QuoteDocumentDataUpdateDtoSchema - * @type { object } - * @property { CommonModels.RouteTableUpdateBlockDto } routeTable - * @property { CommonModels.CargoTableBlockUpdateDto } cargoTable - * @property { CommonModels.FinanceTableBlockUpdateDto } financeTable - */ - export const QuoteDocumentDataUpdateDtoSchema = z - .object({ - routeTable: CommonModels.RouteTableUpdateBlockDtoSchema, - cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema, - financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema, - }) - .readonly(); - export type QuoteDocumentDataUpdateDto = z.infer; +/** + * QuoteDocumentDataUpdateDtoSchema + * @type { object } + * @property { CommonModels.RouteTableUpdateBlockDto } routeTable + * @property { CommonModels.CargoTableBlockUpdateDto } cargoTable + * @property { CommonModels.FinanceTableBlockUpdateDto } financeTable + */ +export const QuoteDocumentDataUpdateDtoSchema = z.object({ routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.nullable() }).partial(); +export type QuoteDocumentDataUpdateDto = z.infer; - /** - * CustomerUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - */ - export const CustomerUpdateDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); - export type CustomerUpdateDto = z.infer; +/** + * CustomerUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } address + */ +export const CustomerUpdateDtoSchema = z.object({ name: z.string().nullable(), address: z.string().nullable() }).partial(); +export type CustomerUpdateDto = z.infer; - /** - * ContactUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } phone - * @property { string } date - */ - export const ContactUpdateDtoSchema = z - .object({ name: z.string(), email: z.email(), phone: z.string(), date: z.iso.datetime({ offset: true }) }) - .readonly(); - export type ContactUpdateDto = z.infer; +/** + * ContactUpdateDtoSchema + * @type { object } + * @property { string } name + * @property { string } email + * @property { string } phone + * @property { string } date + */ +export const ContactUpdateDtoSchema = z.object({ name: z.string().nullable(), email: z.email().nullable(), phone: z.string().nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); +export type ContactUpdateDto = z.infer; - /** - * UpdateQuoteDocumentRequestDtoSchema - * @type { object } - * @property { CustomerUpdateDto } customer - * @property { ContactUpdateDto } contact - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks - * @property { boolean } suspendCargoTable - * @property { boolean } suspendFinanceTable - * @property { QuoteDocumentDataUpdateDto } data - */ - export const UpdateQuoteDocumentRequestDtoSchema = z - .object({ - customer: CustomerUpdateDtoSchema, - contact: ContactUpdateDtoSchema, - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema, - footerRemarks: CommonModels.EditorContentUpdateDtoSchema, - suspendCargoTable: z.boolean(), - suspendFinanceTable: z.boolean(), - data: QuoteDocumentDataUpdateDtoSchema, - }) - .readonly(); - export type UpdateQuoteDocumentRequestDto = z.infer; +/** + * UpdateQuoteDocumentRequestDtoSchema + * @type { object } + * @property { CustomerUpdateDto } customer + * @property { ContactUpdateDto } contact + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks + * @property { boolean } suspendCargoTable + * @property { boolean } suspendFinanceTable + * @property { QuoteDocumentDataUpdateDto } data + */ +export const UpdateQuoteDocumentRequestDtoSchema = z.object({ customer: CustomerUpdateDtoSchema.nullable(), contact: ContactUpdateDtoSchema.nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), suspendCargoTable: z.boolean().nullable(), suspendFinanceTable: z.boolean().nullable(), data: QuoteDocumentDataUpdateDtoSchema.nullable() }).partial(); +export type UpdateQuoteDocumentRequestDto = z.infer; - /** - * GenerateQuoteDocumentPreviewRequestDtoSchema - * @type { object } - * @property { string } issuedAt - */ - export const GenerateQuoteDocumentPreviewRequestDtoSchema = z - .object({ issuedAt: z.iso.datetime({ offset: true }) }) - .readonly(); - export type GenerateQuoteDocumentPreviewRequestDto = z.infer; +/** + * GenerateQuoteDocumentPreviewRequestDtoSchema + * @type { object } + * @property { string } issuedAt + */ +export const GenerateQuoteDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullable() }).partial(); +export type GenerateQuoteDocumentPreviewRequestDto = z.infer; + +/** + * GenerateQuoteDocumentRequestDtoSchema + * @type { object } + * @property { string } issuedAt + * @property { string } fileName + */ +export const GenerateQuoteDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }); +export type GenerateQuoteDocumentRequestDto = z.infer; - /** - * GenerateQuoteDocumentRequestDtoSchema - * @type { object } - * @property { string } issuedAt - * @property { string } fileName - */ - export const GenerateQuoteDocumentRequestDtoSchema = z - .object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }) - .readonly(); - export type GenerateQuoteDocumentRequestDto = z.infer; } diff --git a/test/generated/base/quoteDocument/quoteDocument.queries.ts b/test/generated/base/quoteDocument/quoteDocument.queries.ts index 394be8c..c9b50a2 100644 --- a/test/generated/base/quoteDocument/quoteDocument.queries.ts +++ b/test/generated/base/quoteDocument/quoteDocument.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,178 +8,145 @@ import { QuoteDocumentModels } from "./quoteDocument.models"; import { QuoteDocumentApi } from "./quoteDocument.api"; export namespace QuoteDocumentQueries { - export const moduleName = QueryModule.QuoteDocument; +export const moduleName = QueryModule.QuoteDocument; - export const keys = { +export const keys = { all: [moduleName] as const, - get: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/document", officeId, quoteId] as const, - }; + get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/document", officeId, quoteId] as const, +}; - /** - * Query `useGet` - * @summary Get quote document - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGet` + * @summary Get quote document + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteDocumentAcl.canUseGet({ officeId } )); + return QuoteDocumentApi.get(officeId, quoteId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteDocumentAcl.canUseGet({ officeId })); - return QuoteDocumentApi.get(officeId, quoteId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update quote document + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.UpdateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update quote document - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.UpdateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof QuoteDocumentApi.update, - { officeId: string; quoteId: string; data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId } )); + return QuoteDocumentApi.update(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId })); - return QuoteDocumentApi.update(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useGetPreview` - recommended when file should not be cached + * @summary Get quote document pdf preview + * @permission Requires `canUseGetPreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useGetPreview = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useGetPreview` - recommended when file should not be cached - * @summary Get quote document pdf preview - * @permission Requires `canUseGetPreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useGetPreview = ( - options?: AppMutationOptions< - typeof QuoteDocumentApi.getPreview, - { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId } )); + return QuoteDocumentApi.getPreview(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId })); - return QuoteDocumentApi.getPreview(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useGenerate` + * @summary Get quote document pdf preview + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useGenerate` - * @summary Get quote document pdf preview - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerate = ( - options?: AppMutationOptions< - typeof QuoteDocumentApi.generate, - { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId } )); + return QuoteDocumentApi.generate(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId })); - return QuoteDocumentApi.generate(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useGenerateEml` - recommended when file should not be cached + * @summary Generate quote document and return EML file + * @permission Requires `canUseGenerateEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateEml = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useGenerateEml` - recommended when file should not be cached - * @summary Generate quote document and return EML file - * @permission Requires `canUseGenerateEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGenerateEml = ( - options?: AppMutationOptions< - typeof QuoteDocumentApi.generateEml, - { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId } )); + return QuoteDocumentApi.generateEml(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId })); - return QuoteDocumentApi.generateEml(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts index e68b397..24ebb81 100644 --- a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts +++ b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts @@ -1,29 +1,32 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace QuoteProfitChangeTrackingAcl { - /** - * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. - * @description List quote profit change groups - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.quoteId quoteId from quoteId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query - */ - export const canUseFindProfitChangeGroups = (object?: { officeId: string; quoteId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) - >; +/** + * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. + * @description List quote profit change groups + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.quoteId quoteId from quoteId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query + */ +export const canUseFindProfitChangeGroups = ( + object?: { officeId: string, quoteId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; + +/** + * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. + * @description Get quote profit change group details + * @param { string } object.officeId officeId from officeId path parameter + * @param { string } object.quoteId quoteId from quoteId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query + */ +export const canUseFindProfitChangeGroupDetail = ( + object?: { officeId: string, quoteId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; - /** - * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. - * @description Get quote profit change group details - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.quoteId quoteId from quoteId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query - */ - export const canUseFindProfitChangeGroupDetail = (object?: { officeId: string; quoteId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) - >; } diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts index 876a0b2..2991187 100644 --- a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts +++ b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts @@ -1,51 +1,27 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; export namespace QuoteProfitChangeTrackingApi { - export const findProfitChangeGroups = ( - officeId: string, - quoteId: string, - limit: number, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const findProfitChangeGroups = (officeId: string, quoteId: string, limit: number, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findProfitChangeGroupDetail = ( - groupId: string, - officeId: string, - quoteId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, + { + params: { + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findProfitChangeGroupDetail = (groupId: string, officeId: string, quoteId: string, ) => { return AppRestClient.get( - { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, - config, - ); - }; + { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, + + ) +}; } diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts index 269b961..169ba81 100644 --- a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts +++ b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts @@ -4,32 +4,33 @@ import { QuoteProfitChangeTrackingQueries } from "./quoteProfitChangeTracking.qu import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; export namespace QuoteProfitChangeTrackingConfigs { - export const profitChangeGroupsConfig = { +export const profitChangeGroupsConfig = { meta: { - title: "Profit Change Groups", + title: "Profit Change Groups", }, readAll: { - acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups, - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, - paginated: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroups, - infinite: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, - columns: dynamicColumns({ + acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups, schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, - options: { - columns: { - id: true, - timestamp: true, - users: true, - profit: true, - changeCount: true, - }, - }, - }), + paginated: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroups, + infinite: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, + columns: dynamicColumns({ + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, + options: { + columns: { + id: true, + timestamp: true, + users: true, + profit: true, + changeCount: true, + }, + }, +}), }, read: { - acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema, - query: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, + acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, + schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema, + query: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, }, - }; +}; + } diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts index 4b453b4..9067c50 100644 --- a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts +++ b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts @@ -2,83 +2,55 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace QuoteProfitChangeTrackingModels { - /** - * QuoteAccountProfitChangeGroupDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto[] } users - * @property { object } profit - * @property { number } profit.amount - * @property { string } profit.currencyCode - * @property { number } changeCount - */ - export const QuoteAccountProfitChangeGroupDtoSchema = z - .object({ - id: z.string(), - timestamp: z.iso.datetime({ offset: true }), - users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), - profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), - changeCount: z.number(), - }) - .readonly(); - export type QuoteAccountProfitChangeGroupDto = z.infer; +/** + * QuoteAccountProfitChangeGroupDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto[] } users + * @property { object } profit + * @property { number } profit.amount + * @property { string } profit.currencyCode + * @property { number } changeCount + */ +export const QuoteAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema), profit: z.object({ amount: z.number(), currencyCode: z.string() }), changeCount: z.number() }); +export type QuoteAccountProfitChangeGroupDto = z.infer; - /** - * QuoteAccountProfitChangeEntryDtoSchema - * @type { object } - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto } user - * @property { number } changeNumber - * @property { number } oldProfit - * @property { number } newProfit - * @property { string } currencyCode - */ - export const QuoteAccountProfitChangeEntryDtoSchema = z - .object({ - timestamp: z.iso.datetime({ offset: true }), - user: CommonModels.UserPreviewDtoSchema, - changeNumber: z.number(), - oldProfit: z.number(), - newProfit: z.number(), - currencyCode: z.string(), - }) - .readonly(); - export type QuoteAccountProfitChangeEntryDto = z.infer; +/** + * QuoteAccountProfitChangeEntryDtoSchema + * @type { object } + * @property { string } timestamp + * @property { CommonModels.UserPreviewDto } user + * @property { number } changeNumber + * @property { number } oldProfit + * @property { number } newProfit + * @property { string } currencyCode + */ +export const QuoteAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }); +export type QuoteAccountProfitChangeEntryDto = z.infer; - /** - * QuoteAccountProfitChangeGroupDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { string } currencyCode - * @property { QuoteAccountProfitChangeEntryDto[] } entries - */ - export const QuoteAccountProfitChangeGroupDetailDtoSchema = z - .object({ - id: z.string(), - timestamp: z.iso.datetime({ offset: true }), - currencyCode: z.string(), - entries: z.array(QuoteAccountProfitChangeEntryDtoSchema).readonly(), - }) - .readonly(); - export type QuoteAccountProfitChangeGroupDetailDto = z.infer; +/** + * QuoteAccountProfitChangeGroupDetailDtoSchema + * @type { object } + * @property { string } id + * @property { string } timestamp + * @property { string } currencyCode + * @property { QuoteAccountProfitChangeEntryDto[] } entries + */ +export const QuoteAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(QuoteAccountProfitChangeEntryDtoSchema) }); +export type QuoteAccountProfitChangeGroupDetailDto = z.infer; + +/** + * QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { QuoteAccountProfitChangeGroupDto[] } items + */ +export const QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(QuoteAccountProfitChangeGroupDtoSchema).nullable() }).partial().shape }); +export type QuoteProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; - /** - * QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { QuoteAccountProfitChangeGroupDto[] } items - */ - export const QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(QuoteAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape, - }); - export type QuoteProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer< - typeof QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema - >; } diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts index d39ed96..9388eba 100644 --- a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts +++ b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -7,136 +6,91 @@ import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen import { QuoteProfitChangeTrackingApi } from "./quoteProfitChangeTracking.api"; export namespace QuoteProfitChangeTrackingQueries { - export const moduleName = QueryModule.QuoteProfitChangeTracking; +export const moduleName = QueryModule.QuoteProfitChangeTracking; - export const keys = { +export const keys = { all: [moduleName] as const, - findProfitChangeGroups: (officeId: string, quoteId: string, limit?: number, page?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", - officeId, - quoteId, - limit, - page, - cursor, - ] as const, - findProfitChangeGroupsInfinite: (officeId: string, quoteId: string, limit?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", - "infinite", - officeId, - quoteId, - limit, - cursor, - ] as const, - findProfitChangeGroupDetail: (groupId: string, officeId: string, quoteId: string) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/account/profit-change-groups/:groupId", - groupId, - officeId, - quoteId, - ] as const, - }; + findProfitChangeGroups: (officeId: string, quoteId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", officeId, quoteId, limit, page, cursor] as const, + findProfitChangeGroupsInfinite: (officeId: string, quoteId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", "infinite", officeId, quoteId, limit, cursor] as const, + findProfitChangeGroupDetail: (groupId: string, officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups/:groupId", groupId, officeId, quoteId] as const, +}; - /** - * Query `useFindProfitChangeGroups` - * @summary List quote profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroups = ( - { - officeId, - quoteId, - limit, - page, - cursor, - }: { officeId: string; quoteId: string; limit: number; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindProfitChangeGroups` + * @summary List quote profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroups = ({ officeId, quoteId, limit, page, cursor }: { officeId: string, quoteId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), + queryFn: () => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), - queryFn: () => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId })); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useFindProfitChangeGroupsInfinite + * @summary List quote profit change groups + * @permission Requires `canUseFindProfitChangeGroups` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupsInfinite = ({ officeId, quoteId, limit, cursor }: { officeId: string, quoteId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useFindProfitChangeGroupsInfinite - * @summary List quote profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroupsInfinite = ( - { officeId, quoteId, limit, cursor }: { officeId: string; quoteId: string; limit: number; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useInfiniteQuery({ + queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId })); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `useFindProfitChangeGroupDetail` + * @summary Get quote profit change group details + * @permission Requires `canUseFindProfitChangeGroupDetail` ability + * @param { string } object.groupId Path parameter + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindProfitChangeGroupDetail = ({ groupId, officeId, quoteId }: { groupId: string, officeId: string, quoteId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), + queryFn: () => { + checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId } )); + return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId) }, + ...options, + }); +}; - /** - * Query `useFindProfitChangeGroupDetail` - * @summary Get quote profit change group details - * @permission Requires `canUseFindProfitChangeGroupDetail` ability - * @param { string } object.groupId Path parameter - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroupDetail = ( - { groupId, officeId, quoteId }: { groupId: string; officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), - queryFn: () => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId })); - return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/quoteRoutes/quoteRoutes.acl.ts b/test/generated/base/quoteRoutes/quoteRoutes.acl.ts index ee5334d..23e12ea 100644 --- a/test/generated/base/quoteRoutes/quoteRoutes.acl.ts +++ b/test/generated/base/quoteRoutes/quoteRoutes.acl.ts @@ -1,87 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace QuoteRoutesAcl { - /** - * Use for `useListRoutes` query ability. For global ability, omit the object parameter. - * @description List quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query - */ - export const canUseListRoutes = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useListRoutes` query ability. For global ability, omit the object parameter. + * @description List quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query + */ +export const canUseListRoutes = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Create quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation - */ - export const canUseCreateRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Create quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation + */ +export const canUseCreateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Update quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation - */ - export const canUseUpdateRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Update quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation + */ +export const canUseUpdateRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Delete quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation - */ - export const canUseDeleteRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. + * @description Delete quote route point + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation + */ +export const canUseDeleteRoutePoint = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. - * @description Split quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation - */ - export const canUseSplitRoutes = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. + * @description Split quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation + */ +export const canUseSplitRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. - * @description Merge quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation - */ - export const canUseMergeRoutes = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. + * @description Merge quote routes + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation + */ +export const canUseMergeRoutes = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. + * @description Copy quote route points + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation + */ +export const canUseCopyRoute = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. - * @description Copy quote route points - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation - */ - export const canUseCopyRoute = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; } diff --git a/test/generated/base/quoteRoutes/quoteRoutes.api.ts b/test/generated/base/quoteRoutes/quoteRoutes.api.ts index 6a6b65e..8688bde 100644 --- a/test/generated/base/quoteRoutes/quoteRoutes.api.ts +++ b/test/generated/base/quoteRoutes/quoteRoutes.api.ts @@ -1,99 +1,60 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; export namespace QuoteRoutesApi { - export const listRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const listRoutes = (officeId: string, quoteId: string, ) => { return AppRestClient.get( - { resSchema: CommonModels.RouteListResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes`, - config, - ); - }; - - export const createRoutePoint = ( - officeId: string, - quoteId: string, - routeId: string, - data: CommonModels.CreateRoutePointRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.RouteListResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes`, + + ) +}; +export const createRoutePoint = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, ) => { return AppRestClient.post( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, - ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - config, - ); - }; - - export const updateRoutePoint = ( - officeId: string, - quoteId: string, - routeId: string, - pointId: string, - data: CommonModels.UpdateRoutePointRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, + ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), + + ) +}; +export const updateRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, ) => { return AppRestClient.patch( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - config, - ); - }; - - export const deleteRoutePoint = ( - officeId: string, - quoteId: string, - routeId: string, - pointId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.RoutePointResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, + ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), + + ) +}; +export const deleteRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - undefined, - config, - ); - }; - - export const splitRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, + + ) +}; +export const splitRoutes = (officeId: string, quoteId: string, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/split`, - undefined, - config, - ); - }; - - export const mergeRoutes = ( - officeId: string, - quoteId: string, - data: CommonModels.MergeRoutesRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/split`, + + ) +}; +export const mergeRoutes = (officeId: string, quoteId: string, data: CommonModels.MergeRoutesRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/merge`, - ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - config, - ); - }; - - export const copyRoute = ( - officeId: string, - quoteId: string, - routeId: string, - data: CommonModels.CopyRouteRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/merge`, + ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), + + ) +}; +export const copyRoute = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, - ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, + ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/quoteRoutes/quoteRoutes.queries.ts b/test/generated/base/quoteRoutes/quoteRoutes.queries.ts index 5269238..04ed45f 100644 --- a/test/generated/base/quoteRoutes/quoteRoutes.queries.ts +++ b/test/generated/base/quoteRoutes/quoteRoutes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,255 +8,205 @@ import { CommonModels } from "@/data/common/common.models"; import { QuoteRoutesApi } from "./quoteRoutes.api"; export namespace QuoteRoutesQueries { - export const moduleName = QueryModule.QuoteRoutes; +export const moduleName = QueryModule.QuoteRoutes; - export const keys = { +export const keys = { all: [moduleName] as const, - listRoutes: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/routes", officeId, quoteId] as const, - }; + listRoutes: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/routes", officeId, quoteId] as const, +}; + +/** + * Query `useListRoutes` + * @summary List routes with points for a quote + * @permission Requires `canUseListRoutes` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListRoutes = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listRoutes(officeId, quoteId), + queryFn: () => { + checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId } )); + return QuoteRoutesApi.listRoutes(officeId, quoteId) }, + ...options, + }); +}; + +/** + * Mutation `useCreateRoutePoint` + * @summary Create a route point for a quote route + * @permission Requires `canUseCreateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, data }) => { + checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId } )); + return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUpdateRoutePoint` + * @summary Update a route point for a quote route + * @permission Requires `canUseUpdateRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { + checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId } )); + return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteRoutePoint` + * @summary Delete a route point from a quote route + * @permission Requires `canUseDeleteRoutePoint` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { string } mutation.pointId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, pointId }) => { + checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId } )); + return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useSplitRoutes` + * @summary Split quote routes by cargo (sea only) + * @permission Requires `canUseSplitRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId }) => { + checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId } )); + return QuoteRoutesApi.splitRoutes(officeId, quoteId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useMergeRoutes` + * @summary Merge quote cargo routes into single route (sea only) + * @permission Requires `canUseMergeRoutes` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId } )); + return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCopyRoute` + * @summary Copy route points from one route to another (sea only) + * @permission Requires `canUseCopyRoute` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.routeId Path parameter + * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [204, 401] + */ +export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, quoteId, routeId, data }) => { + checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId } )); + return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useListRoutes` - * @summary List routes with points for a quote - * @permission Requires `canUseListRoutes` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListRoutes = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoutes(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId })); - return QuoteRoutesApi.listRoutes(officeId, quoteId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreateRoutePoint` - * @summary Create a route point for a quote route - * @permission Requires `canUseCreateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateRoutePoint = ( - options?: AppMutationOptions< - typeof QuoteRoutesApi.createRoutePoint, - { officeId: string; quoteId: string; routeId: string; data: CommonModels.CreateRoutePointRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, data }) => { - checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId })); - return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateRoutePoint` - * @summary Update a route point for a quote route - * @permission Requires `canUseUpdateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateRoutePoint = ( - options?: AppMutationOptions< - typeof QuoteRoutesApi.updateRoutePoint, - { - officeId: string; - quoteId: string; - routeId: string; - pointId: string; - data: CommonModels.UpdateRoutePointRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { - checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId })); - return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteRoutePoint` - * @summary Delete a route point from a quote route - * @permission Requires `canUseDeleteRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteRoutePoint = ( - options?: AppMutationOptions< - typeof QuoteRoutesApi.deleteRoutePoint, - { officeId: string; quoteId: string; routeId: string; pointId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, pointId }) => { - checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId })); - return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useSplitRoutes` - * @summary Split quote routes by cargo (sea only) - * @permission Requires `canUseSplitRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useSplitRoutes = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId }) => { - checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId })); - return QuoteRoutesApi.splitRoutes(officeId, quoteId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useMergeRoutes` - * @summary Merge quote cargo routes into single route (sea only) - * @permission Requires `canUseMergeRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useMergeRoutes = ( - options?: AppMutationOptions< - typeof QuoteRoutesApi.mergeRoutes, - { officeId: string; quoteId: string; data: CommonModels.MergeRoutesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId })); - return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCopyRoute` - * @summary Copy route points from one route to another (sea only) - * @permission Requires `canUseCopyRoute` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useCopyRoute = ( - options?: AppMutationOptions< - typeof QuoteRoutesApi.copyRoute, - { officeId: string; quoteId: string; routeId: string; data: CommonModels.CopyRouteRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, data }) => { - checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId })); - return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/quotes/quotes.acl.ts b/test/generated/base/quotes/quotes.acl.ts index c9ec7f0..d7f98e9 100644 --- a/test/generated/base/quotes/quotes.acl.ts +++ b/test/generated/base/quotes/quotes.acl.ts @@ -1,147 +1,160 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace QuotesAcl { - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `usePaginate` query ability. For global ability, omit the object parameter. + * @description List quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Create", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ - export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. + * @description List available partners for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query + */ +export const canUseListAvailablePartnersFor = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useExportQuotes` mutation ability. For global ability, omit the object parameter. - * @description Export quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportQuotes` mutation - */ - export const canUseExportQuotes = (object?: { officeId: string }) => - ["Export", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Export", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useExportQuotes` mutation ability. For global ability, omit the object parameter. + * @description Export quotes for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportQuotes` mutation + */ +export const canUseExportQuotes = ( + object?: { officeId: string, } +) => [ + "Export", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Get quote by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ - export const canUseGetById = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useGetById` query ability. For global ability, omit the object parameter. + * @description Get quote by id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ - export const canUseCancel = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useCancel` mutation ability. For global ability, omit the object parameter. + * @description Cancel quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation + */ +export const canUseCancel = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Duplicate quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ - export const canUseDuplicate = (object?: { officeId: string }) => - ["Create", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Create", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. + * @description Duplicate quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation + */ +export const canUseDuplicate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useGetInvolvedParties` query ability. For global ability, omit the object parameter. - * @description Get involved parties for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvolvedParties` query - */ - export const canUseGetInvolvedParties = (object?: { officeId: string }) => - ["ReadInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "ReadInvolvedParties", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useGetInvolvedParties` query ability. For global ability, omit the object parameter. + * @description Get involved parties for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvolvedParties` query + */ +export const canUseGetInvolvedParties = ( + object?: { officeId: string, } +) => [ + "ReadInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useCreateInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Create involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateInvolvedParty` mutation - */ - export const canUseCreateInvolvedParty = (object?: { officeId: string }) => - ["CreateInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "CreateInvolvedParties", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useCreateInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Create involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateInvolvedParty` mutation + */ +export const canUseCreateInvolvedParty = ( + object?: { officeId: string, } +) => [ + "CreateInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useUpdateInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Update involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateInvolvedParty` mutation - */ - export const canUseUpdateInvolvedParty = (object?: { officeId: string }) => - ["UpdateInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "UpdateInvolvedParties", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useUpdateInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Update involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateInvolvedParty` mutation + */ +export const canUseUpdateInvolvedParty = ( + object?: { officeId: string, } +) => [ + "UpdateInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useDeleteInvolvedParty` mutation ability. For global ability, omit the object parameter. + * @description Delete involved party for quote + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvolvedParty` mutation + */ +export const canUseDeleteInvolvedParty = ( + object?: { officeId: string, } +) => [ + "DeleteInvolvedParties", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useDeleteInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Delete involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvolvedParty` mutation - */ - export const canUseDeleteInvolvedParty = (object?: { officeId: string }) => - ["DeleteInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "DeleteInvolvedParties", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; } diff --git a/test/generated/base/quotes/quotes.api.ts b/test/generated/base/quotes/quotes.api.ts index 97c0391..53ffe08 100644 --- a/test/generated/base/quotes/quotes.api.ts +++ b/test/generated/base/quotes/quotes.api.ts @@ -1,193 +1,117 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { QuotesModels } from "./quotes.models"; import { CommonModels } from "@/data/common/common.models"; export namespace QuotesApi { - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: QuotesModels.QuoteFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: QuotesModels.QuotesPaginateResponseSchema }, `/offices/${officeId}/quotes`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, config?: AxiosRequestConfig) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: QuotesModels.QuotesPaginateResponseSchema }, + `/offices/${officeId}/quotes`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, ) => { return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes`, - ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), - config, - ); - }; - - export const listAvailablePartnersFor = ( - officeId: string, - quoteId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - config?: AxiosRequestConfig, - ) => { + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes`, + ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), + + ) +}; +export const listAvailablePartnersFor = (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { return AppRestClient.get( - { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/available-partners`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { - type: "query", - name: "useCase", - }), - }, - }, - ); - }; - - export const exportQuotes = ( - officeId: string, - data: QuotesModels.QuoteExportRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/available-partners`, + { + params: { + search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), + useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), + }, + } + ) +}; +export const exportQuotes = (officeId: string, data: QuotesModels.QuoteExportRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/exports`, - ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const getById = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/quotes/exports`, + ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const getById = (officeId: string, quoteId: string, ) => { return AppRestClient.get( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}`, - config, - ); - }; - - export const update = ( - officeId: string, - quoteId: string, - data: QuotesModels.UpdateQuoteRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}`, + + ) +}; +export const update = (officeId: string, quoteId: string, data: QuotesModels.UpdateQuoteRequestDTO, ) => { return AppRestClient.patch( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}`, - ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), - config, - ); - }; - - export const cancel = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}`, + ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), + + ) +}; +export const cancel = (officeId: string, quoteId: string, ) => { return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cancel`, - undefined, - config, - ); - }; - - export const duplicate = ( - officeId: string, - quoteId: string, - data: QuotesModels.DuplicateQuoteRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/cancel`, + + ) +}; +export const duplicate = (officeId: string, quoteId: string, data: QuotesModels.DuplicateQuoteRequestDto, ) => { return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/duplicate`, - ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), - config, - ); - }; - - export const getInvolvedParties = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { + { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/duplicate`, + ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), + + ) +}; +export const getInvolvedParties = (officeId: string, quoteId: string, ) => { return AppRestClient.get( - { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - config, - ); - }; - - export const createInvolvedParty = ( - officeId: string, - quoteId: string, - data: CommonModels.CreateInvolvedPartyRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties`, + + ) +}; +export const createInvolvedParty = (officeId: string, quoteId: string, data: CommonModels.CreateInvolvedPartyRequestDto, ) => { return AppRestClient.post( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - config, - ); - }; - - export const updateInvolvedParty = ( - officeId: string, - quoteId: string, - partyId: string, - data: CommonModels.UpdateInvolvedPartyDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties`, + ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), + + ) +}; +export const updateInvolvedParty = (officeId: string, quoteId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, ) => { return AppRestClient.patch( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - config, - ); - }; - - export const deleteInvolvedParty = ( - officeId: string, - quoteId: string, - partyId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, + ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), + + ) +}; +export const deleteInvolvedParty = (officeId: string, quoteId: string, partyId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - undefined, - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, + + ) +}; } diff --git a/test/generated/base/quotes/quotes.configs.ts b/test/generated/base/quotes/quotes.configs.ts index fa74aae..e288ac4 100644 --- a/test/generated/base/quotes/quotes.configs.ts +++ b/test/generated/base/quotes/quotes.configs.ts @@ -5,132 +5,133 @@ import { QuotesQueries } from "./quotes.queries"; import { QuotesAcl } from "./quotes.acl"; export namespace QuotesConfigs { - export const quotesConfig = { +export const quotesConfig = { meta: { - title: "Quotes", + title: "Quotes", }, readAll: { - acl: QuotesAcl.canUsePaginate, - schema: QuotesModels.QuotePreviewResponseDTOSchema, - paginated: QuotesQueries.usePaginate, - infinite: QuotesQueries.usePaginateInfinite, - filters: { - schema: QuotesModels.QuoteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: QuotesModels.QuoteFilterDtoSchema, - options: { - inputs: { - statusDate: true, - transportMode: true, - status: true, - direction: true, - loadType: true, - serviceType: true, - carrierId: true, - consigneeId: true, - employee: true, - routing: true, - number: true, - createdAt: true, - vesselCarrier: true, - searchQuery: true, - customer: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: QuotesAcl.canUsePaginate, schema: QuotesModels.QuotePreviewResponseDTOSchema, - options: { - columns: { - id: true, - transportMode: true, - statusDate: true, - createdAt: true, - number: true, - status: true, - direction: true, - loadType: true, - customer: true, - customerReference: true, - consignee: true, - consigneeReference: true, - carrier: true, - carrierReference: true, - employee: true, - origin: true, - destination: true, - portOfLoading: true, - dischargePort: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - equipment: true, - serviceType: true, - currency: true, - profit: true, - margin: true, - numberOfConvertedPositions: true, - departureDate: true, - arrivalDate: true, - routing: true, - }, - sortable: QuotesModels.QuotesPaginateOrderParamEnumSchema, + paginated: QuotesQueries.usePaginate, + infinite: QuotesQueries.usePaginateInfinite, + filters: { + schema: QuotesModels.QuoteFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: QuotesModels.QuoteFilterDtoSchema, + options: { + inputs: { + statusDate: true, + transportMode: true, + status: true, + direction: true, + loadType: true, + serviceType: true, + carrierId: true, + consigneeId: true, + employee: true, + routing: true, + number: true, + createdAt: true, + vesselCarrier: true, + searchQuery: true, + customer: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: QuotesModels.QuotePreviewResponseDTOSchema, + options: { + columns: { + id: true, + transportMode: true, + statusDate: true, + createdAt: true, + number: true, + status: true, + direction: true, + loadType: true, + customer: true, + customerReference: true, + consignee: true, + consigneeReference: true, + carrier: true, + carrierReference: true, + employee: true, + origin: true, + destination: true, + portOfLoading: true, + dischargePort: true, + bookingNumber: true, + vessel: true, + voyage: true, + vesselCarrier: true, + equipment: true, + serviceType: true, + currency: true, + profit: true, + margin: true, + numberOfConvertedPositions: true, + departureDate: true, + arrivalDate: true, + routing: true, + }, + sortable: QuotesModels.QuotesPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: QuotesAcl.canUseGetById, - schema: QuotesModels.QuoteCoreResponseDTOSchema, - query: QuotesQueries.useGetById, + acl: QuotesAcl.canUseGetById, + schema: QuotesModels.QuoteCoreResponseDTOSchema, + query: QuotesQueries.useGetById, }, create: { - acl: QuotesAcl.canUseCreate, - schema: QuotesModels.CreateQuoteRequestDTOSchema, - mutation: QuotesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: QuotesAcl.canUseCreate, schema: QuotesModels.CreateQuoteRequestDTOSchema, - options: { - inputs: { - section: true, - direction: true, - transportMode: true, - loadType: true, - serviceType: true, - customerBusinessPartnerId: true, - }, - }, - }), + mutation: QuotesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: QuotesModels.CreateQuoteRequestDTOSchema, + options: { + inputs: { + section: true, + direction: true, + transportMode: true, + loadType: true, + serviceType: true, + customerBusinessPartnerId: true, + }, + }, +}) }, update: { - acl: QuotesAcl.canUseUpdate, - schema: QuotesModels.UpdateQuoteRequestDTOSchema, - mutation: QuotesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: QuotesAcl.canUseUpdate, schema: QuotesModels.UpdateQuoteRequestDTOSchema, - options: { - inputs: { - number: true, - statusDate: true, - cargoType: true, - loadType: true, - incoterms: true, - secondIncoterms: true, - serviceType: true, - buyRateReference: true, - frequency: true, - transitDurationInDays: true, - quoteType: true, - defaultCurrencyId: true, - salesRepId: true, - responsibleEmployeeId: true, - receivedByEmployeeId: true, - team: true, - volumetricWeightModifier: true, - }, - }, - }), + mutation: QuotesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: QuotesModels.UpdateQuoteRequestDTOSchema, + options: { + inputs: { + number: true, + statusDate: true, + cargoType: true, + loadType: true, + incoterms: true, + secondIncoterms: true, + serviceType: true, + buyRateReference: true, + frequency: true, + transitDurationInDays: true, + quoteType: true, + defaultCurrencyId: true, + salesRepId: true, + responsibleEmployeeId: true, + receivedByEmployeeId: true, + team: true, + volumetricWeightModifier: true, + }, + }, +}) }, - }; +}; + } diff --git a/test/generated/base/quotes/quotes.models.ts b/test/generated/base/quotes/quotes.models.ts index 0411bf7..47c00a5 100644 --- a/test/generated/base/quotes/quotes.models.ts +++ b/test/generated/base/quotes/quotes.models.ts @@ -20,10 +20,9 @@ export const QuoteStatusEnum = QuoteStatusEnumSchema.enum; * @property { string } phone The phone number of the customer * @property { string } email The email of the customer */ -export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().describe("The phone number of the customer").nullish(), email: z.string().describe("The email of the customer").nullish() }).readonly(); +export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }); export type QuoteCustomerResponseDto = z.infer; - /** * QuoteNamedReferenceResponseDtoSchema * @type { object } @@ -32,10 +31,9 @@ export type QuoteCustomerResponseDto = z.infer; - /** * QuotePreviewResponseDTOSchema * @type { object } @@ -72,10 +70,9 @@ export type QuoteNamedReferenceResponseDto = z.infer; - /** * QuoteFilterDtoSchema * @type { object } @@ -95,10 +92,9 @@ export type QuotePreviewResponseDTO = z.infer; - /** * QuoteExportFilterDtoSchema * @type { object } @@ -109,10 +105,9 @@ export type QuoteFilterDto = z.infer; * @property { string } searchQuery * @property { string[] } customer */ -export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); +export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema.nullable(), transportMode: CommonModels.TransportModeEnumSchema.nullable(), status: z.array(QuoteStatusEnumSchema).nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), searchQuery: z.string().nullable(), customer: z.array(z.string()).nullable() }).partial(); export type QuoteExportFilterDto = z.infer; - /** * QuoteExportColumnSchema * @type { enum } @@ -128,10 +123,9 @@ export const QuoteExportColumn = QuoteExportColumnSchema.enum; * @property { string[] } order * @property { QuoteExportFilterDto } filter */ -export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: QuoteExportFilterDtoSchema }).readonly(); +export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: QuoteExportFilterDtoSchema.nullable() }).partial(); export type QuoteExportRequestDto = z.infer; - /** * CreateQuoteRequestDTOSchema * @type { object } @@ -142,30 +136,27 @@ export type QuoteExportRequestDto = z.infer; * @property { CommonModels.ServiceTypeEnum } serviceType The service type for the quote * @property { string } customerBusinessPartnerId The ID of the business partner that is the customer */ -export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema.describe("The section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("The direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("The mode of transport for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The service type for the quote"), customerBusinessPartnerId: z.string().describe("The ID of the business partner that is the customer") }).readonly(); +export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, customerBusinessPartnerId: z.string() }); export type CreateQuoteRequestDTO = z.infer; - /** * QuoteCustomerDtoSchema * @type { object } * @property { string } id * @property { string } name */ -export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); export type QuoteCustomerDto = z.infer; - /** * QuoteEmployeeResponseDTOSchema * @type { object } * @property { string } id Unique identifier of the employee * @property { string } name Name of the employee */ -export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the employee"), name: z.string().describe("Name of the employee") }).readonly(); +export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); export type QuoteEmployeeResponseDTO = z.infer; - /** * CargoTypeEnumSchema * @type { enum } @@ -188,10 +179,9 @@ export const QuoteTypeEnum = QuoteTypeEnumSchema.enum; * @property { string } positionId * @property { string } positionNumber */ -export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }).readonly(); +export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }); export type QuoteConvertedPositionDto = z.infer; - /** * QuoteCoreResponseDTOSchema * @type { object } @@ -228,10 +218,9 @@ export type QuoteConvertedPositionDto = z.infer; - /** * UpdateQuoteRequestDTOSchema * @type { object } @@ -253,10 +242,9 @@ export type QuoteCoreResponseDTO = z.infer; * @property { string } team The team responsible for the quote * @property { number } volumetricWeightModifier Volumetric weight modifier */ -export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().describe("The quote number"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status"), cargoType: CargoTypeEnumSchema.describe("The type of cargo for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), incoterms: CommonModels.IncotermsEnumSchema.describe("The incoterms for the quote"), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("The second incoterms for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The type of service for the quote"), buyRateReference: z.string().describe("The reference for the buy rate"), frequency: CommonModels.FrequencyEnumSchema.describe("The frequency of the quote"), transitDurationInDays: z.string().describe("The transit duration in days").nullable(), quoteType: QuoteTypeEnumSchema.describe("The type of quote"), defaultCurrencyId: z.string().describe("The default currency for the quote"), salesRepId: z.string().describe("The sales representative for the quote"), responsibleEmployeeId: z.string().describe("The responsible employee for the quote"), receivedByEmployeeId: z.string().describe("The employee who receieved the quote"), team: z.string().describe("The team responsible for the quote"), volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); +export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().nullable(), statusDate: z.iso.datetime({ offset: true }).nullable(), cargoType: CargoTypeEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), incoterms: CommonModels.IncotermsEnumSchema.nullable(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), buyRateReference: z.string().nullable(), frequency: CommonModels.FrequencyEnumSchema.nullable(), transitDurationInDays: z.string().nullable(), quoteType: QuoteTypeEnumSchema.nullable(), defaultCurrencyId: z.string().nullable(), salesRepId: z.string().nullable(), responsibleEmployeeId: z.string().nullable(), receivedByEmployeeId: z.string().nullable(), team: z.string().nullable(), volumetricWeightModifier: z.number().nullable() }).partial(); export type UpdateQuoteRequestDTO = z.infer; - /** * QuoteSectionEnumSchema * @type { enum } @@ -270,10 +258,9 @@ export const QuoteSectionEnum = QuoteSectionEnumSchema.enum; * @type { object } * @property { QuoteSectionEnum[] } sections The sections to duplicate. Min Items: `1` */ -export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).readonly().min(1).describe("The sections to duplicate") }).readonly(); +export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).min(1) }); export type DuplicateQuoteRequestDto = z.infer; - /** * QuoteListResponseDtoSchema * @type { object } @@ -286,10 +273,9 @@ export type DuplicateQuoteRequestDto = z.infer; - /** * QuotesPaginateOrderParamEnumSchema * @type { enum } @@ -310,10 +296,9 @@ export const QuotesPaginateOrderParamEnum = QuotesPaginateOrderParamEnumSchema.e * @property { number } totalItems Total available items * @property { QuotePreviewResponseDTO[] } items */ -export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).readonly() }).readonly().shape }); +export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).nullable() }).partial().shape }); export type QuotesPaginateResponse = z.infer; - /** * QuotesListAvailablePartnersForResponseSchema * @type { object } @@ -324,16 +309,14 @@ export type QuotesPaginateResponse = z.infer; - /** * GetInvolvedPartiesResponseSchema * @type { array } */ -export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); +export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema); export type GetInvolvedPartiesResponse = z.infer; - } diff --git a/test/generated/base/quotes/quotes.queries.ts b/test/generated/base/quotes/quotes.queries.ts index 42c7089..42b6e3c 100644 --- a/test/generated/base/quotes/quotes.queries.ts +++ b/test/generated/base/quotes/quotes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,498 +9,368 @@ import { CommonModels } from "@/data/common/common.models"; import { QuotesApi } from "./quotes.api"; export namespace QuotesQueries { - export const moduleName = QueryModule.Quotes; +export const moduleName = QueryModule.Quotes; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: QuotesModels.QuoteFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/quotes", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: QuotesModels.QuoteFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/quotes", "infinite", officeId, limit, order, filter, cursor] as const, - listAvailablePartnersFor: ( - officeId: string, - quoteId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - ) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/available-partners", - officeId, - quoteId, - search, - useCase, - ] as const, - getById: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId", officeId, quoteId] as const, - getInvolvedParties: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/involved-parties", officeId, quoteId] as const, - }; + paginate: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", officeId, limit, order, filter, page, cursor] as const, + paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", "infinite", officeId, limit, order, filter, cursor] as const, + listAvailablePartnersFor: (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/quotes/:quoteId/available-partners", officeId, quoteId, search, useCase] as const, + getById: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId", officeId, quoteId] as const, + getInvolvedParties: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/involved-parties", officeId, quoteId] as const, +}; - /** - * Query `usePaginate` - * @summary Paginate Quotes - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` - * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: QuotesModels.QuoteFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(QuotesAcl.canUsePaginate({ officeId })); - return QuotesApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Quotes - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` - * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { officeId: string; limit: number; order?: string; filter?: QuotesModels.QuoteFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginate` + * @summary Paginate Quotes + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` + * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(QuotesAcl.canUsePaginate({ officeId } )); + return QuotesApi.paginate(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuotesAcl.canUsePaginate({ officeId })); - return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Quotes + * @permission Requires `canUsePaginate` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` + * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Mutation `useCreate` - * @summary Create Quote - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { QuotesModels.CreateQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof QuotesApi.create, - { officeId: string; data: QuotesModels.CreateQuoteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(QuotesAcl.canUseCreate({ officeId })); - return QuotesApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(QuotesAcl.canUsePaginate({ officeId } )); + return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for a quote - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListAvailablePartnersFor = ( - { - officeId, - quoteId, - search, - useCase, - }: { officeId: string; quoteId: string; search?: string; useCase?: CommonModels.PositionAvailablePartnersUseCase }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Mutation `useCreate` + * @summary Create Quote + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { QuotesModels.CreateQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), - queryFn: () => { - checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId })); - return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase, config); - }, - ...options, - }); - }; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(QuotesAcl.canUseCreate({ officeId } )); + return QuotesApi.create(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useExportQuotes` - recommended when file should not be cached - * @summary Export quotes to Excel - * @permission Requires `canUseExportQuotes` ability - * @param { string } mutation.officeId Path parameter - * @param { QuotesModels.QuoteExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportQuotes = ( - options?: AppMutationOptions< - typeof QuotesApi.exportQuotes, - { officeId: string; data: QuotesModels.QuoteExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Query `useListAvailablePartnersFor` + * @summary List available business partners for a quote + * @permission Requires `canUseListAvailablePartnersFor` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { string } object.search Query parameter + * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useListAvailablePartnersFor = ({ officeId, quoteId, search, useCase }: { officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), + queryFn: () => { + checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId } )); + return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase) }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(QuotesAcl.canUseExportQuotes({ officeId })); - return QuotesApi.exportQuotes(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useExportQuotes` - recommended when file should not be cached + * @summary Export quotes to Excel + * @permission Requires `canUseExportQuotes` ability + * @param { string } mutation.officeId Path parameter + * @param { QuotesModels.QuoteExportRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const useExportQuotes = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `useGetById` - * @summary Get quote by id - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetById = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(QuotesAcl.canUseExportQuotes({ officeId } )); + return QuotesApi.exportQuotes(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useQuery({ - queryKey: keys.getById(officeId, quoteId), - queryFn: () => { - checkAcl(QuotesAcl.canUseGetById({ officeId })); - return QuotesApi.getById(officeId, quoteId, config); - }, - ...options, - }); - }; +/** + * Query `useGetById` + * @summary Get quote by id + * @permission Requires `canUseGetById` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(officeId, quoteId), + queryFn: () => { + checkAcl(QuotesAcl.canUseGetById({ officeId } )); + return QuotesApi.getById(officeId, quoteId) }, + ...options, + }); +}; - /** - * Mutation `useUpdate` - * @summary Update quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuotesModels.UpdateQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof QuotesApi.update, - { officeId: string; quoteId: string; data: QuotesModels.UpdateQuoteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useUpdate` + * @summary Update quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuotesModels.UpdateQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseUpdate({ officeId })); - return QuotesApi.update(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseUpdate({ officeId } )); + return QuotesApi.update(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCancel` - * @summary Cancel quote - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useCancel = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCancel` + * @summary Cancel quote + * @permission Requires `canUseCancel` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, quoteId }) => { - checkAcl(QuotesAcl.canUseCancel({ officeId })); - return QuotesApi.cancel(officeId, quoteId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, quoteId }) => { + checkAcl(QuotesAcl.canUseCancel({ officeId } )); + return QuotesApi.cancel(officeId, quoteId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useDuplicate` - * @summary Duplicate quote - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuotesModels.DuplicateQuoteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicate = ( - options?: AppMutationOptions< - typeof QuotesApi.duplicate, - { officeId: string; quoteId: string; data: QuotesModels.DuplicateQuoteRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useDuplicate` + * @summary Duplicate quote + * @permission Requires `canUseDuplicate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { QuotesModels.DuplicateQuoteRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseDuplicate({ officeId })); - return QuotesApi.duplicate(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseDuplicate({ officeId } )); + return QuotesApi.duplicate(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.getById(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useGetInvolvedParties` - * @summary Get involved parties for quote - * @permission Requires `canUseGetInvolvedParties` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetInvolvedParties = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetInvolvedParties` + * @summary Get involved parties for quote + * @permission Requires `canUseGetInvolvedParties` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetInvolvedParties = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getInvolvedParties(officeId, quoteId), + queryFn: () => { + checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId } )); + return QuotesApi.getInvolvedParties(officeId, quoteId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getInvolvedParties(officeId, quoteId), - queryFn: () => { - checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId })); - return QuotesApi.getInvolvedParties(officeId, quoteId, config); - }, - ...options, - }); - }; +/** + * Mutation `useCreateInvolvedParty` + * @summary Create involved party for quote + * @permission Requires `canUseCreateInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreateInvolvedParty` - * @summary Create involved party for quote - * @permission Requires `canUseCreateInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateInvolvedParty = ( - options?: AppMutationOptions< - typeof QuotesApi.createInvolvedParty, - { officeId: string; quoteId: string; data: CommonModels.CreateInvolvedPartyRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId } )); + return QuotesApi.createInvolvedParty(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId })); - return QuotesApi.createInvolvedParty(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdateInvolvedParty` + * @summary Update involved party for quote + * @permission Requires `canUseUpdateInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdateInvolvedParty` - * @summary Update involved party for quote - * @permission Requires `canUseUpdateInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateInvolvedParty = ( - options?: AppMutationOptions< - typeof QuotesApi.updateInvolvedParty, - { officeId: string; quoteId: string; partyId: string; data: CommonModels.UpdateInvolvedPartyDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, partyId, data }) => { + checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId } )); + return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, partyId, data }) => { - checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId })); - return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteInvolvedParty` + * @summary Delete involved party for quote + * @permission Requires `canUseDeleteInvolvedParty` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { string } mutation.partyId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useDeleteInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteInvolvedParty` - * @summary Delete involved party for quote - * @permission Requires `canUseDeleteInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteInvolvedParty = ( - options?: AppMutationOptions< - typeof QuotesApi.deleteInvolvedParty, - { officeId: string; quoteId: string; partyId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, partyId }) => { + checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId } )); + return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, partyId }) => { - checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId })); - return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/remarkTemplates/remarkTemplates.acl.ts b/test/generated/base/remarkTemplates/remarkTemplates.acl.ts index d7492ee..b194325 100644 --- a/test/generated/base/remarkTemplates/remarkTemplates.acl.ts +++ b/test/generated/base/remarkTemplates/remarkTemplates.acl.ts @@ -1,87 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace RemarkTemplatesAcl { - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List remark template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Read", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; +/** + * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. + * @description List remark template labels for office + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List remark templates - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Read", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List remark templates + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Create", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create a new remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Create", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get remark template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Read", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get remark template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update remark template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Update", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update remark template by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Update", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Archive", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; +/** + * Use for `useArchive` mutation ability. For global ability, omit the object parameter. + * @description Archive remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( + object?: { officeId: string, } +) => [ + "Archive", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Archive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; + +/** + * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. + * @description Unarchive remark template + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( + object?: { officeId: string, } +) => [ + "Unarchive", + object ? subject("RemarkTemplate", object) : "RemarkTemplate" +] as AbilityTuple<"Unarchive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Unarchive", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Unarchive", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; } diff --git a/test/generated/base/remarkTemplates/remarkTemplates.api.ts b/test/generated/base/remarkTemplates/remarkTemplates.api.ts index 93d8bc3..f4ba6d9 100644 --- a/test/generated/base/remarkTemplates/remarkTemplates.api.ts +++ b/test/generated/base/remarkTemplates/remarkTemplates.api.ts @@ -1,142 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { RemarkTemplatesModels } from "./remarkTemplates.models"; export namespace RemarkTemplatesApi { - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/remark-templates/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const list = ( - officeId: string, - limit: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, + `/offices/${officeId}/remark-templates/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, - `/offices/${officeId}/remark-templates`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const create = ( - officeId: string, - data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, + `/offices/${officeId}/remark-templates`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (officeId: string, data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, ) => { return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates`, - ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), - config, - ); - }; - - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates`, + ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), + + ) +}; +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}`, - config, - ); - }; - - export const update = ( - id: string, - officeId: string, - data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}`, + + ) +}; +export const update = (id: string, officeId: string, data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, ) => { return AppRestClient.patch( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}`, - ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}`, + ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}/archive`, + + ) +}; +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, + `/offices/${officeId}/remark-templates/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/remarkTemplates/remarkTemplates.configs.ts b/test/generated/base/remarkTemplates/remarkTemplates.configs.ts index d004179..616b1f4 100644 --- a/test/generated/base/remarkTemplates/remarkTemplates.configs.ts +++ b/test/generated/base/remarkTemplates/remarkTemplates.configs.ts @@ -5,118 +5,119 @@ import { RemarkTemplatesQueries } from "./remarkTemplates.queries"; import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; export namespace RemarkTemplatesConfigs { - export const remarkTemplatesConfig = { +export const remarkTemplatesConfig = { meta: { - title: "Remark Templates", + title: "Remark Templates", }, readAll: { - acl: RemarkTemplatesAcl.canUseList, - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - paginated: RemarkTemplatesQueries.useList, - infinite: RemarkTemplatesQueries.useListInfinite, - filters: { - schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - onlyUsedFor: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: RemarkTemplatesAcl.canUseList, schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - content: true, - onlyUsedFor: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema, + paginated: RemarkTemplatesQueries.useList, + infinite: RemarkTemplatesQueries.useListInfinite, + filters: { + schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, + options: { + inputs: { + archived: true, + search: true, + onlyUsedFor: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + options: { + columns: { + id: true, + officeId: true, + name: true, + content: true, + onlyUsedFor: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema, + }, +}), }, read: { - acl: RemarkTemplatesAcl.canUseFindById, - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - query: RemarkTemplatesQueries.useFindById, + acl: RemarkTemplatesAcl.canUseFindById, + schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, + query: RemarkTemplatesQueries.useFindById, }, create: { - acl: RemarkTemplatesAcl.canUseCreate, - schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, - mutation: RemarkTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: RemarkTemplatesAcl.canUseCreate, schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - content: true, - onlyUsedFor: true, - }, - }, - }), + mutation: RemarkTemplatesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + content: true, + onlyUsedFor: true, + }, + }, +}) }, update: { - acl: RemarkTemplatesAcl.canUseUpdate, - schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, - mutation: RemarkTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: RemarkTemplatesAcl.canUseUpdate, schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - content: true, - onlyUsedFor: true, - archived: true, - }, - }, - }), + mutation: RemarkTemplatesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, + options: { + inputs: { + name: true, + content: true, + onlyUsedFor: true, + archived: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: RemarkTemplatesAcl.canUsePaginateLabels, - schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, - paginated: RemarkTemplatesQueries.usePaginateLabels, - infinite: RemarkTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: RemarkTemplatesAcl.canUsePaginateLabels, schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - content: true, - }, - sortable: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema, + paginated: RemarkTemplatesQueries.usePaginateLabels, + infinite: RemarkTemplatesQueries.usePaginateLabelsInfinite, + filters: { + schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, + content: true, }, - }; + sortable: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/remarkTemplates/remarkTemplates.models.ts b/test/generated/base/remarkTemplates/remarkTemplates.models.ts index 21a682a..265dd7f 100644 --- a/test/generated/base/remarkTemplates/remarkTemplates.models.ts +++ b/test/generated/base/remarkTemplates/remarkTemplates.models.ts @@ -2,220 +2,131 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace RemarkTemplatesModels { - /** - * RemarkTemplateLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { CommonModels.EditorContentResponseDto } content Remark template content - */ - export const RemarkTemplateLabelResponseDTOSchema = z - .object({ - id: z.string(), - label: z.string(), - content: CommonModels.EditorContentResponseDtoSchema.describe("Remark template content"), - }) - .readonly(); - export type RemarkTemplateLabelResponseDTO = z.infer; +/** + * RemarkTemplateLabelResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } label + * @property { CommonModels.EditorContentResponseDto } content Remark template content + */ +export const RemarkTemplateLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), content: CommonModels.EditorContentResponseDtoSchema }); +export type RemarkTemplateLabelResponseDTO = z.infer; - /** - * RemarkTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const RemarkTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type RemarkTemplateEmployeeDTO = z.infer; +/** + * RemarkTemplateEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const RemarkTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type RemarkTemplateEmployeeDTO = z.infer; - /** - * OnlyUsedForEnumSchema - * @type { enum } - */ - export const OnlyUsedForEnumSchema = z.enum([ - "transport-order", - "export-declaration", - "house-bl", - "master-bl", - "house-awb", - "master-awb", - "bl-instructions", - "ams-instructions", - "cmr-form", - "fcr-form", - "isf-form", - "templated-document", - "invoice", - "quote-document", - "shipping-instructions", - "position-office-notes", - "invoice-body-remarks", - "business-partner-office-notes", - ]); - export type OnlyUsedForEnum = z.infer; - export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; +/** + * OnlyUsedForEnumSchema + * @type { enum } + */ +export const OnlyUsedForEnumSchema = z.enum(["transport-order", "export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "invoice", "quote-document", "shipping-instructions", "position-office-notes", "invoice-body-remarks", "business-partner-office-notes"]); +export type OnlyUsedForEnum = z.infer; +export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; - /** - * RemarkTemplateResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name Template name - * @property { CommonModels.EditorContentResponseDto } content Template content - * @property { string[] } onlyUsedFor Restrict template usage to specific document types - * @property { boolean } archived - * @property { string } createdById - * @property { RemarkTemplateEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { RemarkTemplateEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const RemarkTemplateResponseDTOSchema = z - .object({ - id: z.string(), - officeId: z.string(), - name: z.string().describe("Template name"), - content: CommonModels.EditorContentResponseDtoSchema.describe("Template content"), - onlyUsedFor: z - .array(OnlyUsedForEnumSchema) - .readonly() - .describe("Restrict template usage to specific document types") - .nullish(), - archived: z.boolean(), - createdById: z.string().nullish(), - createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type RemarkTemplateResponseDTO = z.infer; +/** + * RemarkTemplateResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } officeId + * @property { string } name Template name + * @property { CommonModels.EditorContentResponseDto } content Template content + * @property { string[] } onlyUsedFor Restrict template usage to specific document types + * @property { boolean } archived + * @property { string } createdById + * @property { RemarkTemplateEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { RemarkTemplateEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const RemarkTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), content: CommonModels.EditorContentResponseDtoSchema, onlyUsedFor: z.array(OnlyUsedForEnumSchema).nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type RemarkTemplateResponseDTO = z.infer; - /** - * CreateRemarkTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { CommonModels.EditorContentUpdateDto } content Template content - * @property { OnlyUsedForEnum[] } onlyUsedFor Restrict template usage to specific document types - */ - export const CreateRemarkTemplateRequestDTOSchema = z - .object({ - name: z.string().describe("Template name"), - content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), - onlyUsedFor: z - .array(OnlyUsedForEnumSchema) - .readonly() - .describe("Restrict template usage to specific document types") - .nullish(), - }) - .readonly(); - export type CreateRemarkTemplateRequestDTO = z.infer; +/** + * CreateRemarkTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { CommonModels.EditorContentUpdateDto } content Template content + * @property { OnlyUsedForEnum[] } onlyUsedFor Restrict template usage to specific document types + */ +export const CreateRemarkTemplateRequestDTOSchema = z.object({ name: z.string(), content: CommonModels.EditorContentUpdateDtoSchema, onlyUsedFor: z.array(OnlyUsedForEnumSchema).nullish() }); +export type CreateRemarkTemplateRequestDTO = z.infer; - /** - * UpdateRemarkTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { CommonModels.EditorContentUpdateDto } content Template content - * @property { string[] } onlyUsedFor Restrict template usage to specific document types - * @property { boolean } archived Archive status - */ - export const UpdateRemarkTemplateRequestDTOSchema = z - .object({ - name: z.string().describe("Template name"), - content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), - onlyUsedFor: z - .array(OnlyUsedForEnumSchema) - .readonly() - .describe("Restrict template usage to specific document types"), - archived: z.boolean().describe("Archive status"), - }) - .readonly(); - export type UpdateRemarkTemplateRequestDTO = z.infer; +/** + * UpdateRemarkTemplateRequestDTOSchema + * @type { object } + * @property { string } name Template name + * @property { CommonModels.EditorContentUpdateDto } content Template content + * @property { string[] } onlyUsedFor Restrict template usage to specific document types + * @property { boolean } archived Archive status + */ +export const UpdateRemarkTemplateRequestDTOSchema = z.object({ name: z.string().nullable(), content: CommonModels.EditorContentUpdateDtoSchema.nullable(), onlyUsedFor: z.array(OnlyUsedForEnumSchema).nullable(), archived: z.boolean().nullable() }).partial(); +export type UpdateRemarkTemplateRequestDTO = z.infer; - /** - * RemarkTemplateFilterDtoSchema - * @type { object } - * @property { boolean } archived - * @property { string } search - * @property { string } onlyUsedFor Filter by document type - */ - export const RemarkTemplateFilterDtoSchema = z - .object({ - archived: z.boolean(), - search: z.string(), - onlyUsedFor: OnlyUsedForEnumSchema.describe("Filter by document type"), - }) - .readonly(); - export type RemarkTemplateFilterDto = z.infer; +/** + * RemarkTemplateFilterDtoSchema + * @type { object } + * @property { boolean } archived + * @property { string } search + * @property { string } onlyUsedFor Filter by document type + */ +export const RemarkTemplateFilterDtoSchema = z.object({ archived: z.boolean().nullable(), search: z.string().nullable(), onlyUsedFor: OnlyUsedForEnumSchema.nullable() }).partial(); +export type RemarkTemplateFilterDto = z.infer; - /** - * RemarkTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const RemarkTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type RemarkTemplateLabelFilterDto = z.infer; +/** + * RemarkTemplateLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const RemarkTemplateLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type RemarkTemplateLabelFilterDto = z.infer; - /** - * RemarkTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const RemarkTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type RemarkTemplatesPaginateLabelsOrderParamEnum = z.infer< - typeof RemarkTemplatesPaginateLabelsOrderParamEnumSchema - >; - export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPaginateLabelsOrderParamEnumSchema.enum; +/** + * RemarkTemplatesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const RemarkTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type RemarkTemplatesPaginateLabelsOrderParamEnum = z.infer; +export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPaginateLabelsOrderParamEnumSchema.enum; - /** - * RemarkTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { RemarkTemplateLabelResponseDTO[] } items - */ - export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type RemarkTemplatesPaginateLabelsResponse = z.infer; +/** + * RemarkTemplatesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { RemarkTemplateLabelResponseDTO[] } items + */ +export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).nullable() }).partial().shape }); +export type RemarkTemplatesPaginateLabelsResponse = z.infer; - /** - * RemarkTemplatesListOrderParamEnumSchema - * @type { enum } - */ - export const RemarkTemplatesListOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type RemarkTemplatesListOrderParamEnum = z.infer; - export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEnumSchema.enum; +/** + * RemarkTemplatesListOrderParamEnumSchema + * @type { enum } + */ +export const RemarkTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type RemarkTemplatesListOrderParamEnum = z.infer; +export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEnumSchema.enum; + +/** + * RemarkTemplatesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { RemarkTemplateResponseDTO[] } items + */ +export const RemarkTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).nullable() }).partial().shape }); +export type RemarkTemplatesListResponse = z.infer; - /** - * RemarkTemplatesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { RemarkTemplateResponseDTO[] } items - */ - export const RemarkTemplatesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).readonly() }).readonly().shape, - }); - export type RemarkTemplatesListResponse = z.infer; } diff --git a/test/generated/base/remarkTemplates/remarkTemplates.queries.ts b/test/generated/base/remarkTemplates/remarkTemplates.queries.ts index e169038..aa1b35b 100644 --- a/test/generated/base/remarkTemplates/remarkTemplates.queries.ts +++ b/test/generated/base/remarkTemplates/remarkTemplates.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,412 +8,266 @@ import { RemarkTemplatesModels } from "./remarkTemplates.models"; import { RemarkTemplatesApi } from "./remarkTemplates.api"; export namespace RemarkTemplatesQueries { - export const moduleName = QueryModule.RemarkTemplates; +export const moduleName = QueryModule.RemarkTemplates; - export const keys = { +export const keys = { all: [moduleName] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/remark-templates/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/remark-templates/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - list: ( - officeId: string, - limit?: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/remark-templates", officeId, limit, order, filter, page, cursor] as const, - listInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/remark-templates", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/remark-templates/:id", id, officeId] as const, - }; + paginateLabels: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, + list: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", officeId, limit, order, filter, page, cursor] as const, + listInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", "infinite", officeId, limit, order, filter, cursor] as const, + findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/remark-templates/:id", id, officeId] as const, +}; - /** - * Query `usePaginateLabels` - * @summary Paginate remark template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginateLabels` + * @summary Paginate remark template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId })); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate remark template labels for office + * @permission Requires `canUsePaginateLabels` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate remark template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId })); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Query `useList` - * @summary List remark templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: RemarkTemplatesModels.RemarkTemplateFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useList` + * @summary List remark templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); + return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUseList({ officeId })); - return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useListInfinite + * @summary List remark templates + * @permission Requires `canUseList` ability + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListInfinite - * @summary List remark templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: RemarkTemplatesModels.RemarkTemplateFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); + return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(RemarkTemplatesAcl.canUseList({ officeId })); - return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Mutation `useCreate` + * @summary Create a new remark template + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useCreate` - * @summary Create a new remark template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof RemarkTemplatesApi.create, - { officeId: string; data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId })); - return RemarkTemplatesApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ officeId, data }) => { + checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId } )); + return RemarkTemplatesApi.create(officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useFindById` - * @summary Get remark template by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get remark template by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id, officeId), + queryFn: () => { + checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId } )); + return RemarkTemplatesApi.findById(id, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId })); - return RemarkTemplatesApi.findById(id, officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update remark template by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update remark template by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof RemarkTemplatesApi.update, - { id: string; officeId: string; data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId, data }) => { + checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId } )); + return RemarkTemplatesApi.update(id, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId })); - return RemarkTemplatesApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive remark template + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive remark template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId } )); + return RemarkTemplatesApi.archive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId })); - return RemarkTemplatesApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive remark template + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive remark template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, officeId }) => { + checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId } )); + return RemarkTemplatesApi.unarchive(id, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id, officeId } = variables; + const updateKeys = [keys.findById(id, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId })); - return RemarkTemplatesApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/roadQuotes/roadQuotes.acl.ts b/test/generated/base/roadQuotes/roadQuotes.acl.ts index 599c783..edf7693 100644 --- a/test/generated/base/roadQuotes/roadQuotes.acl.ts +++ b/test/generated/base/roadQuotes/roadQuotes.acl.ts @@ -1,27 +1,30 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace RoadQuotesAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get road quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get road quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update road quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update road quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; } diff --git a/test/generated/base/roadQuotes/roadQuotes.api.ts b/test/generated/base/roadQuotes/roadQuotes.api.ts index 8c1ddbe..38a1126 100644 --- a/test/generated/base/roadQuotes/roadQuotes.api.ts +++ b/test/generated/base/roadQuotes/roadQuotes.api.ts @@ -1,28 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { RoadQuotesModels } from "./roadQuotes.models"; export namespace RoadQuotesApi { - export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, quoteId: string, ) => { return AppRestClient.get( - { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/road-quote`, - config, - ); - }; - - export const update = ( - officeId: string, - quoteId: string, - data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/road-quote`, + + ) +}; +export const update = (officeId: string, quoteId: string, data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, ) => { return AppRestClient.patch( - { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/road-quote`, - ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), - config, - ); - }; + { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/road-quote`, + ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/roadQuotes/roadQuotes.models.ts b/test/generated/base/roadQuotes/roadQuotes.models.ts index f50ac2e..9008738 100644 --- a/test/generated/base/roadQuotes/roadQuotes.models.ts +++ b/test/generated/base/roadQuotes/roadQuotes.models.ts @@ -1,45 +1,29 @@ import { z } from "zod"; export namespace RoadQuotesModels { - /** - * RoadQuoteResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the road quote - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - */ - export const RoadQuoteResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier for the road quote"), - bookingMatchingCode: z.string().describe("Code for matching bookings"), - validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), - validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), - buyServiceContract: z.string().describe("Service contract for buying"), - sellServiceContract: z.string().describe("Service contract for selling"), - }) - .readonly(); - export type RoadQuoteResponseDTO = z.infer; +/** + * RoadQuoteResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the road quote + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + */ +export const RoadQuoteResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string(), sellServiceContract: z.string() }); +export type RoadQuoteResponseDTO = z.infer; + +/** + * UpdateRoadQuoteRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + */ +export const UpdateRoadQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), sellServiceContract: z.string().nullable() }).partial(); +export type UpdateRoadQuoteRequestDTO = z.infer; - /** - * UpdateRoadQuoteRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - */ - export const UpdateRoadQuoteRequestDTOSchema = z - .object({ - bookingMatchingCode: z.string().describe("Code for matching bookings"), - validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), - validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), - buyServiceContract: z.string().describe("Service contract for buying"), - sellServiceContract: z.string().describe("Service contract for selling"), - }) - .readonly(); - export type UpdateRoadQuoteRequestDTO = z.infer; } diff --git a/test/generated/base/roadQuotes/roadQuotes.queries.ts b/test/generated/base/roadQuotes/roadQuotes.queries.ts index ddd3e83..b7d125e 100644 --- a/test/generated/base/roadQuotes/roadQuotes.queries.ts +++ b/test/generated/base/roadQuotes/roadQuotes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,75 +8,63 @@ import { RoadQuotesModels } from "./roadQuotes.models"; import { RoadQuotesApi } from "./roadQuotes.api"; export namespace RoadQuotesQueries { - export const moduleName = QueryModule.RoadQuotes; +export const moduleName = QueryModule.RoadQuotes; - export const keys = { +export const keys = { all: [moduleName] as const, - get: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/road-quote", officeId, quoteId] as const, - }; + get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/road-quote", officeId, quoteId] as const, +}; - /** - * Query `useGet` - * @summary Get road quote by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGet` + * @summary Get road quote by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(RoadQuotesAcl.canUseGet({ officeId } )); + return RoadQuotesApi.get(officeId, quoteId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(RoadQuotesAcl.canUseGet({ officeId })); - return RoadQuotesApi.get(officeId, quoteId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update road quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { RoadQuotesModels.UpdateRoadQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update road quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { RoadQuotesModels.UpdateRoadQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof RoadQuotesApi.update, - { officeId: string; quoteId: string; data: RoadQuotesModels.UpdateRoadQuoteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(RoadQuotesAcl.canUseUpdate({ officeId } )); + return RoadQuotesApi.update(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.get(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(RoadQuotesAcl.canUseUpdate({ officeId })); - return RoadQuotesApi.update(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.get(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/seaPositions/seaPositions.acl.ts b/test/generated/base/seaPositions/seaPositions.acl.ts index 7b8c6cb..1040161 100644 --- a/test/generated/base/seaPositions/seaPositions.acl.ts +++ b/test/generated/base/seaPositions/seaPositions.acl.ts @@ -1,27 +1,30 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace SeaPositionsAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get sea position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get sea position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update sea position by position id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Position", object) : "Position" +] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update sea position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; } diff --git a/test/generated/base/seaPositions/seaPositions.api.ts b/test/generated/base/seaPositions/seaPositions.api.ts index ffdb6e9..022e8b7 100644 --- a/test/generated/base/seaPositions/seaPositions.api.ts +++ b/test/generated/base/seaPositions/seaPositions.api.ts @@ -1,28 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { SeaPositionsModels } from "./seaPositions.models"; export namespace SeaPositionsApi { - export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, positionId: string, ) => { return AppRestClient.get( - { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/sea-position`, - config, - ); - }; - - export const update = ( - officeId: string, - positionId: string, - data: SeaPositionsModels.UpdateSeaPositionRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/sea-position`, + + ) +}; +export const update = (officeId: string, positionId: string, data: SeaPositionsModels.UpdateSeaPositionRequestDTO, ) => { return AppRestClient.patch( - { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/sea-position`, - ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), - config, - ); - }; + { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/sea-position`, + ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/seaPositions/seaPositions.models.ts b/test/generated/base/seaPositions/seaPositions.models.ts index 738a8c5..90db05a 100644 --- a/test/generated/base/seaPositions/seaPositions.models.ts +++ b/test/generated/base/seaPositions/seaPositions.models.ts @@ -2,86 +2,48 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace SeaPositionsModels { - /** - * SeaPositionResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } bookingMatchingCode - * @property { string } houseBillOfLadingNumber - * @property { string } masterBillOfLadingNumber - * @property { boolean } hblRequired - * @property { boolean } mblRequired - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { string } buyServiceContract - * @property { string } sellServiceContract - * @property { string } quoteReference - * @property { string } createdAt - * @property { string } updatedAt - * @property { CommonModels.SeaRoutingEnum } routing - * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route - */ - export const SeaPositionResponseDTOSchema = z - .object({ - id: z.string(), - bookingMatchingCode: z.string().nullish(), - houseBillOfLadingNumber: z.string().nullish(), - masterBillOfLadingNumber: z.string().nullish(), - hblRequired: z.boolean(), - mblRequired: z.boolean(), - blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), - blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), - customsDate: z.iso.datetime({ offset: true }).nullish(), - vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), - buyServiceContract: z.string().nullish(), - sellServiceContract: z.string().nullish(), - quoteReference: z.string().nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - routing: CommonModels.SeaRoutingEnumSchema.nullish(), - defaultBookingNumber: z - .string() - .describe("Default booking number from the port of loading point of the default route") - .nullish(), - }) - .readonly(); - export type SeaPositionResponseDTO = z.infer; +/** + * SeaPositionResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } bookingMatchingCode + * @property { string } houseBillOfLadingNumber + * @property { string } masterBillOfLadingNumber + * @property { boolean } hblRequired + * @property { boolean } mblRequired + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { string } buyServiceContract + * @property { string } sellServiceContract + * @property { string } quoteReference + * @property { string } createdAt + * @property { string } updatedAt + * @property { CommonModels.SeaRoutingEnum } routing + * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route + */ +export const SeaPositionResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterBillOfLadingNumber: z.string().nullish(), hblRequired: z.boolean(), mblRequired: z.boolean(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), buyServiceContract: z.string().nullish(), sellServiceContract: z.string().nullish(), quoteReference: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), routing: CommonModels.SeaRoutingEnumSchema.nullish(), defaultBookingNumber: z.string().nullish() }); +export type SeaPositionResponseDTO = z.infer; + +/** + * UpdateSeaPositionRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode + * @property { string } houseBillOfLadingNumber + * @property { boolean } mblRequired + * @property { boolean } hblRequired + * @property { string } masterBillOfLadingNumber + * @property { string } blfromCostumerDate + * @property { string } blfromCarrierDate + * @property { string } customsDate + * @property { string } vgmCustomerDate + * @property { string } buyServiceContract + * @property { string } quoteReference + * @property { string } sellServiceContract + * @property { CommonModels.SeaRoutingEnum } routing + */ +export const UpdateSeaPositionRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), houseBillOfLadingNumber: z.string().nullable(), mblRequired: z.boolean().nullable(), hblRequired: z.boolean().nullable(), masterBillOfLadingNumber: z.string().nullable(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullable(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullable(), customsDate: z.iso.datetime({ offset: true }).nullable(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), quoteReference: z.string().nullable(), sellServiceContract: z.string().nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable() }).partial(); +export type UpdateSeaPositionRequestDTO = z.infer; - /** - * UpdateSeaPositionRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode - * @property { string } houseBillOfLadingNumber - * @property { boolean } mblRequired - * @property { boolean } hblRequired - * @property { string } masterBillOfLadingNumber - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { string } buyServiceContract - * @property { string } quoteReference - * @property { string } sellServiceContract - * @property { CommonModels.SeaRoutingEnum } routing - */ - export const UpdateSeaPositionRequestDTOSchema = z - .object({ - bookingMatchingCode: z.string(), - houseBillOfLadingNumber: z.string(), - mblRequired: z.boolean(), - hblRequired: z.boolean(), - masterBillOfLadingNumber: z.string(), - blfromCostumerDate: z.iso.datetime({ offset: true }), - blfromCarrierDate: z.iso.datetime({ offset: true }), - customsDate: z.iso.datetime({ offset: true }), - vgmCustomerDate: z.iso.datetime({ offset: true }), - buyServiceContract: z.string(), - quoteReference: z.string(), - sellServiceContract: z.string(), - routing: CommonModels.SeaRoutingEnumSchema, - }) - .readonly(); - export type UpdateSeaPositionRequestDTO = z.infer; } diff --git a/test/generated/base/seaPositions/seaPositions.queries.ts b/test/generated/base/seaPositions/seaPositions.queries.ts index f562c59..3652d69 100644 --- a/test/generated/base/seaPositions/seaPositions.queries.ts +++ b/test/generated/base/seaPositions/seaPositions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,75 +8,63 @@ import { SeaPositionsModels } from "./seaPositions.models"; import { SeaPositionsApi } from "./seaPositions.api"; export namespace SeaPositionsQueries { - export const moduleName = QueryModule.SeaPositions; +export const moduleName = QueryModule.SeaPositions; - export const keys = { +export const keys = { all: [moduleName] as const, - get: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/sea-position", officeId, positionId] as const, - }; + get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/sea-position", officeId, positionId] as const, +}; - /** - * Query `useGet` - * @summary Get sea position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGet` + * @summary Get sea position by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId), + queryFn: () => { + checkAcl(SeaPositionsAcl.canUseGet({ officeId } )); + return SeaPositionsApi.get(officeId, positionId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(SeaPositionsAcl.canUseGet({ officeId })); - return SeaPositionsApi.get(officeId, positionId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update sea position + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { SeaPositionsModels.UpdateSeaPositionRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update sea position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { SeaPositionsModels.UpdateSeaPositionRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof SeaPositionsApi.update, - { officeId: string; positionId: string; data: SeaPositionsModels.UpdateSeaPositionRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, positionId, data }) => { + checkAcl(SeaPositionsAcl.canUseUpdate({ officeId } )); + return SeaPositionsApi.update(officeId, positionId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId } = variables; + const updateKeys = [keys.get(officeId, positionId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(SeaPositionsAcl.canUseUpdate({ officeId })); - return SeaPositionsApi.update(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/seaQuotes/seaQuotes.acl.ts b/test/generated/base/seaQuotes/seaQuotes.acl.ts index 4841eaf..ca36ff7 100644 --- a/test/generated/base/seaQuotes/seaQuotes.acl.ts +++ b/test/generated/base/seaQuotes/seaQuotes.acl.ts @@ -1,27 +1,30 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace SeaQuotesAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get sea quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Get sea quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; + +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update sea quote by quote id + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("Quote", object) : "Quote" +] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update sea quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; } diff --git a/test/generated/base/seaQuotes/seaQuotes.api.ts b/test/generated/base/seaQuotes/seaQuotes.api.ts index 5c9df3d..6b3d574 100644 --- a/test/generated/base/seaQuotes/seaQuotes.api.ts +++ b/test/generated/base/seaQuotes/seaQuotes.api.ts @@ -1,28 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { SeaQuotesModels } from "./seaQuotes.models"; export namespace SeaQuotesApi { - export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, quoteId: string, ) => { return AppRestClient.get( - { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - config, - ); - }; - - export const update = ( - officeId: string, - quoteId: string, - data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/sea-quote`, + + ) +}; +export const update = (officeId: string, quoteId: string, data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, ) => { return AppRestClient.patch( - { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), - config, - ); - }; + { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, + `/offices/${officeId}/quotes/${quoteId}/sea-quote`, + ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), + + ) +}; } diff --git a/test/generated/base/seaQuotes/seaQuotes.models.ts b/test/generated/base/seaQuotes/seaQuotes.models.ts index f5b1795..2617ee7 100644 --- a/test/generated/base/seaQuotes/seaQuotes.models.ts +++ b/test/generated/base/seaQuotes/seaQuotes.models.ts @@ -2,51 +2,32 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace SeaQuotesModels { - /** - * SeaQuoteResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the sea quote - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - * @property { CommonModels.SeaRoutingEnum } routing - * @property { boolean } splitRoute Indicates if the route is split - */ - export const SeaQuoteResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier for the sea quote"), - bookingMatchingCode: z.string().describe("Code for matching bookings"), - validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), - validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), - buyServiceContract: z.string().describe("Service contract for buying"), - sellServiceContract: z.string().describe("Service contract for selling"), - routing: CommonModels.SeaRoutingEnumSchema.nullish(), - splitRoute: z.boolean().describe("Indicates if the route is split").nullish(), - }) - .readonly(); - export type SeaQuoteResponseDTO = z.infer; +/** + * SeaQuoteResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier for the sea quote + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + * @property { CommonModels.SeaRoutingEnum } routing + * @property { boolean } splitRoute Indicates if the route is split + */ +export const SeaQuoteResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string(), sellServiceContract: z.string(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), splitRoute: z.boolean().nullish() }); +export type SeaQuoteResponseDTO = z.infer; + +/** + * UpdateSeaQuoteRequestDTOSchema + * @type { object } + * @property { string } bookingMatchingCode Code for matching bookings + * @property { string } validFrom Start date of quote validity + * @property { string } validUntil End date of quote validity + * @property { string } buyServiceContract Service contract for buying + * @property { string } sellServiceContract Service contract for selling + * @property { CommonModels.SeaRoutingEnum } routing + */ +export const UpdateSeaQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), sellServiceContract: z.string().nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable() }).partial(); +export type UpdateSeaQuoteRequestDTO = z.infer; - /** - * UpdateSeaQuoteRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - * @property { CommonModels.SeaRoutingEnum } routing - */ - export const UpdateSeaQuoteRequestDTOSchema = z - .object({ - bookingMatchingCode: z.string().describe("Code for matching bookings"), - validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), - validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), - buyServiceContract: z.string().describe("Service contract for buying"), - sellServiceContract: z.string().describe("Service contract for selling"), - routing: CommonModels.SeaRoutingEnumSchema, - }) - .readonly(); - export type UpdateSeaQuoteRequestDTO = z.infer; } diff --git a/test/generated/base/seaQuotes/seaQuotes.queries.ts b/test/generated/base/seaQuotes/seaQuotes.queries.ts index f147e95..0efd079 100644 --- a/test/generated/base/seaQuotes/seaQuotes.queries.ts +++ b/test/generated/base/seaQuotes/seaQuotes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,75 +8,63 @@ import { SeaQuotesModels } from "./seaQuotes.models"; import { SeaQuotesApi } from "./seaQuotes.api"; export namespace SeaQuotesQueries { - export const moduleName = QueryModule.SeaQuotes; +export const moduleName = QueryModule.SeaQuotes; - export const keys = { +export const keys = { all: [moduleName] as const, - get: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/sea-quote", officeId, quoteId] as const, - }; + get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/sea-quote", officeId, quoteId] as const, +}; - /** - * Query `useGet` - * @summary Get sea quote by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGet` + * @summary Get sea quote by ID + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.quoteId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, quoteId), + queryFn: () => { + checkAcl(SeaQuotesAcl.canUseGet({ officeId } )); + return SeaQuotesApi.get(officeId, quoteId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(SeaQuotesAcl.canUseGet({ officeId })); - return SeaQuotesApi.get(officeId, quoteId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update sea quote + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.quoteId Path parameter + * @param { SeaQuotesModels.UpdateSeaQuoteRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update sea quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { SeaQuotesModels.UpdateSeaQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof SeaQuotesApi.update, - { officeId: string; quoteId: string; data: SeaQuotesModels.UpdateSeaQuoteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ officeId, quoteId, data }) => { + checkAcl(SeaQuotesAcl.canUseUpdate({ officeId } )); + return SeaQuotesApi.update(officeId, quoteId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, quoteId } = variables; + const updateKeys = [keys.get(officeId, quoteId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(SeaQuotesAcl.canUseUpdate({ officeId })); - return SeaQuotesApi.update(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.get(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/shippingInstructions/shippingInstructions.acl.ts b/test/generated/base/shippingInstructions/shippingInstructions.acl.ts index b0dc4c8..2eae90a 100644 --- a/test/generated/base/shippingInstructions/shippingInstructions.acl.ts +++ b/test/generated/base/shippingInstructions/shippingInstructions.acl.ts @@ -1,93 +1,82 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace ShippingInstructionsAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Create", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Create", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `useGet` query ability. For global ability, omit the object parameter. + * @description Read shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query + */ +export const canUseGet = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. + * @description Update shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `useDeleteOfficesPositionsShippingInstructionsById` mutation ability. For global ability, omit the object parameter. - * @description Delete shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsShippingInstructionsById` mutation - */ - export const canUseDeleteOfficesPositionsShippingInstructionsById = (object?: { officeId: string }) => - [ - "Delete", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Delete", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `useDeleteOfficesPositionsShippingInstructionsById` mutation ability. For global ability, omit the object parameter. + * @description Delete shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsShippingInstructionsById` mutation + */ +export const canUseDeleteOfficesPositionsShippingInstructionsById = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `usePreview` query or `usePreviewMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreview` query or `usePreviewMutation` mutation - */ - export const canUsePreview = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `usePreview` query or `usePreviewMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreview` query or `usePreviewMutation` mutation + */ +export const canUsePreview = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. + * @description Generate shipping instructions + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation + */ +export const canUseGenerate = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ - export const canUseGenerate = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; } diff --git a/test/generated/base/shippingInstructions/shippingInstructions.api.ts b/test/generated/base/shippingInstructions/shippingInstructions.api.ts index 6793650..e435f26 100644 --- a/test/generated/base/shippingInstructions/shippingInstructions.api.ts +++ b/test/generated/base/shippingInstructions/shippingInstructions.api.ts @@ -1,84 +1,58 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ShippingInstructionsModels } from "./shippingInstructions.models"; import { CommonModels } from "@/data/common/common.models"; export namespace ShippingInstructionsApi { - export const create = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const create = (officeId: string, positionId: string, ) => { return AppRestClient.post( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions`, - undefined, - config, - ); - }; - - export const get = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions`, + + ) +}; +export const get = (officeId: string, positionId: string, id: string, ) => { return AppRestClient.get( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - config, - ); - }; - - export const update = ( - officeId: string, - positionId: string, - id: string, - data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + + ) +}; +export const update = (officeId: string, positionId: string, id: string, data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, ) => { return AppRestClient.patch( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), - config, - ); - }; - - export const deleteOfficesPositionsShippingInstructionsById = ( - officeId: string, - positionId: string, - id: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), + + ) +}; +export const deleteOfficesPositionsShippingInstructionsById = (officeId: string, positionId: string, id: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - undefined, - config, - ); - }; - - export const preview = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, + + ) +}; +export const preview = (officeId: string, positionId: string, id: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generate = ( - officeId: string, - positionId: string, - id: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generate = (officeId: string, positionId: string, id: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/shippingInstructions/shippingInstructions.models.ts b/test/generated/base/shippingInstructions/shippingInstructions.models.ts index 50182eb..b15692a 100644 --- a/test/generated/base/shippingInstructions/shippingInstructions.models.ts +++ b/test/generated/base/shippingInstructions/shippingInstructions.models.ts @@ -2,846 +2,509 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace ShippingInstructionsModels { - /** - * EnsDeclarationEnumSchema - * @type { enum } - * @description ENS declaration - */ - export const EnsDeclarationEnumSchema = z.enum(["Carrier", "Self"]); - export type EnsDeclarationEnum = z.infer; - export const EnsDeclarationEnum = EnsDeclarationEnumSchema.enum; - - /** - * IssuedHouseBillsEnumSchema - * @type { enum } - * @description Issued house bills - */ - export const IssuedHouseBillsEnumSchema = z.enum(["None", "One", "Multiple"]); - export type IssuedHouseBillsEnum = z.infer; - export const IssuedHouseBillsEnum = IssuedHouseBillsEnumSchema.enum; - - /** - * WoodDeclarationEnumSchema - * @type { enum } - * @description Wood declaration - */ - export const WoodDeclarationEnumSchema = z.enum([ - "NoWood", - "TreatedAndCertified", - "NotTreatedAndNotCertified", - "Processed", - ]); - export type WoodDeclarationEnum = z.infer; - export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; - - /** - * ShippingInstructionsPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } addressLine1 - * @property { string } addressLine2 - * @property { string } city - * @property { string } postalCode - * @property { string } state - * @property { string } countryCode - * @property { string } contactName - * @property { string } contactPhone - * @property { string } contactEmail - */ - export const ShippingInstructionsPartnerResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - addressLine1: z.string(), - addressLine2: z.string(), - city: z.string(), - postalCode: z.string(), - state: z.string(), - countryCode: z.string(), - contactName: z.string(), - contactPhone: z.string(), - contactEmail: z.string(), - }) - .readonly(); - export type ShippingInstructionsPartnerResponseDto = z.infer; - - /** - * ShippingInstructionsGeneralDetailsDtoSchema - * @type { object } - * @property { ShippingInstructionsPartnerResponseDto } shipper - * @property { ShippingInstructionsPartnerResponseDto } consignee - * @property { ShippingInstructionsPartnerResponseDto } freightForwarder - * @property { ShippingInstructionsPartnerResponseDto } notifyParty - * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty1 - * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty2 - * @property { ShippingInstructionsPartnerResponseDto } contractParty - * @property { ShippingInstructionsPartnerResponseDto } manufacturer - * @property { ShippingInstructionsPartnerResponseDto } consolidator - * @property { ShippingInstructionsPartnerResponseDto } importer - * @property { ShippingInstructionsPartnerResponseDto } warehouseKeeper - */ - export const ShippingInstructionsGeneralDetailsDtoSchema = z - .object({ - shipper: ShippingInstructionsPartnerResponseDtoSchema, - consignee: ShippingInstructionsPartnerResponseDtoSchema, - freightForwarder: ShippingInstructionsPartnerResponseDtoSchema, - notifyParty: ShippingInstructionsPartnerResponseDtoSchema, - additionalNotifyParty1: ShippingInstructionsPartnerResponseDtoSchema, - additionalNotifyParty2: ShippingInstructionsPartnerResponseDtoSchema, - contractParty: ShippingInstructionsPartnerResponseDtoSchema, - manufacturer: ShippingInstructionsPartnerResponseDtoSchema, - consolidator: ShippingInstructionsPartnerResponseDtoSchema, - importer: ShippingInstructionsPartnerResponseDtoSchema, - warehouseKeeper: ShippingInstructionsPartnerResponseDtoSchema, - }) - .readonly(); - export type ShippingInstructionsGeneralDetailsDto = z.infer; - - /** - * ShippingInstructionsLocationResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } code - * @property { string } countryCode - * @property { string } eta - * @property { string } vessel - * @property { string } voyage - */ - export const ShippingInstructionsLocationResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - code: z.string(), - countryCode: z.string(), - eta: z.iso.datetime({ offset: true }), - vessel: z.string(), - voyage: z.string(), - }) - .readonly(); - export type ShippingInstructionsLocationResponseDto = z.infer; - - /** - * SIMoveTypeEnumSchema - * @type { enum } - */ - export const SIMoveTypeEnumSchema = z.enum(["DoorToDoor", "DoorToPort", "PortToDoor", "PortToPort"]); - export type SIMoveTypeEnum = z.infer; - export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; - - /** - * ShippingInstructionsTransportDtoSchema - * @type { object } - * @property { string } vessel - * @property { string } voyage - * @property { string } imo - * @property { ShippingInstructionsLocationResponseDto } placeOfReceipt - * @property { ShippingInstructionsLocationResponseDto } portOfLoading - * @property { ShippingInstructionsLocationResponseDto } portOfDischarge - * @property { ShippingInstructionsLocationResponseDto } placeOfDelivery - * @property { SIMoveTypeEnum } moveType - * @property { string } shipmentType - */ - export const ShippingInstructionsTransportDtoSchema = z - .object({ - vessel: z.string(), - voyage: z.string(), - imo: z.string(), - placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema, - portOfLoading: ShippingInstructionsLocationResponseDtoSchema, - portOfDischarge: ShippingInstructionsLocationResponseDtoSchema, - placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema, - moveType: SIMoveTypeEnumSchema, - shipmentType: z.string(), - }) - .readonly(); - export type ShippingInstructionsTransportDto = z.infer; - - /** - * ShippingInstructionsHazardousDtoSchema - * @type { object } - * @property { string } IMOClass - * @property { string } UNDGNumber - * @property { string } contact - */ - export const ShippingInstructionsHazardousDtoSchema = z - .object({ IMOClass: z.string(), UNDGNumber: z.string(), contact: z.string() }) - .readonly(); - export type ShippingInstructionsHazardousDto = z.infer; - - /** - * ShippingInstructionsPackageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { number } quantity - * @property { string } packageType - * @property { string } packageTypeDescription - * @property { string } packageDescription - * @property { string } hsCode - * @property { number } volume - * @property { number } grossWeight - * @property { string } caseMarks - * @property { ShippingInstructionsHazardousDto } hazardous - * @property { string } ncmCodes - * @property { string } cusCode - */ - export const ShippingInstructionsPackageResponseDtoSchema = z - .object({ - id: z.string(), - quantity: z.number(), - packageType: z.string(), - packageTypeDescription: z.string(), - packageDescription: z.string(), - hsCode: z.string(), - volume: z.number(), - grossWeight: z.number(), - caseMarks: z.string(), - hazardous: ShippingInstructionsHazardousDtoSchema, - ncmCodes: z.string(), - cusCode: z.string(), - }) - .readonly(); - export type ShippingInstructionsPackageResponseDto = z.infer; - - /** - * ShippingInstructionsCargoResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } transportUnitNumber - * @property { string } transportUnitType - * @property { string } transportUnitDescription - * @property { string } containerSupplier - * @property { number } grossWeight - * @property { number } tare - * @property { number } volume - * @property { string } seal1 - * @property { string } seal2 - * @property { string } woodDeclaration - * @property { ShippingInstructionsPackageResponseDto[] } packages - */ - export const ShippingInstructionsCargoResponseDtoSchema = z - .object({ - id: z.string().nullish(), - transportUnitNumber: z.string().nullish(), - transportUnitType: z.string().nullish(), - transportUnitDescription: z.string().nullish(), - containerSupplier: z.string().nullish(), - grossWeight: z.number().nullish(), - tare: z.number().nullish(), - volume: z.number().nullish(), - seal1: z.string().nullish(), - seal2: z.string().nullish(), - woodDeclaration: WoodDeclarationEnumSchema.nullish(), - packages: z.array(ShippingInstructionsPackageResponseDtoSchema).readonly(), - }) - .readonly(); - export type ShippingInstructionsCargoResponseDto = z.infer; - - /** - * ShippingInstructionsHeaderDtoSchema - * @type { object } - * @property { string } name - * @property { string } nameSuffix - * @property { number } versionNumber - * @property { string } shippingInstructionNumber - * @property { string } carrierScac - * @property { string } carrierBookingNumber - */ - export const ShippingInstructionsHeaderDtoSchema = z - .object({ - name: z.string(), - nameSuffix: z.string().nullish(), - versionNumber: z.number(), - shippingInstructionNumber: z.string().nullish(), - carrierScac: z.string().nullish(), - carrierBookingNumber: z.string().nullish(), - }) - .readonly(); - export type ShippingInstructionsHeaderDto = z.infer; - - /** - * ShippingInstructionsReferencesDtoSchema - * @type { object } - * @property { string } shipperReference - * @property { string } forwarderReference - * @property { string } transactionReferenceNumber - * @property { string } blReferenceNumber - * @property { string } uniqueConsignmentReference - * @property { string } purchaseOrderNumber - * @property { string } contractReferenceNumber - * @property { string } rucNumber - * @property { string } consigneeOrderNumber - * @property { string } invoiceReferenceNumber - * @property { string } letterOfCreditReference - * @property { string } customsHouseBrokerReference - * @property { string } fmcNumber - * @property { string } exportLicenseNumber - */ - export const ShippingInstructionsReferencesDtoSchema = z - .object({ - shipperReference: z.string(), - forwarderReference: z.string(), - transactionReferenceNumber: z.string(), - blReferenceNumber: z.string(), - uniqueConsignmentReference: z.string(), - purchaseOrderNumber: z.string(), - contractReferenceNumber: z.string(), - rucNumber: z.string(), - consigneeOrderNumber: z.string(), - invoiceReferenceNumber: z.string(), - letterOfCreditReference: z.string(), - customsHouseBrokerReference: z.string(), - fmcNumber: z.string(), - exportLicenseNumber: z.string(), - }) - .readonly(); - export type ShippingInstructionsReferencesDto = z.infer; - - /** - * ShippingInstructionsCustomsComplianceDtoSchema - * @type { object } - * @property { string } shipperTaxId - * @property { string } shipperEORI - * @property { string } consigneeTaxId - * @property { string } consigneeEORI - * @property { string } notifyPartyTaxId - * @property { string } notifyPartyEORI - */ - export const ShippingInstructionsCustomsComplianceDtoSchema = z - .object({ - shipperTaxId: z.string(), - shipperEORI: z.string(), - consigneeTaxId: z.string(), - consigneeEORI: z.string(), - notifyPartyTaxId: z.string(), - notifyPartyEORI: z.string(), - }) - .readonly(); - export type ShippingInstructionsCustomsComplianceDto = z.infer; - - /** - * ShippingInstructionsIcs2DtoSchema - * @type { object } - * @property { boolean } goodsDeliveredInEu - * @property { string } ensDeclaration - * @property { string } issuedHouseBills - */ - export const ShippingInstructionsIcs2DtoSchema = z - .object({ - goodsDeliveredInEu: z.boolean(), - ensDeclaration: EnsDeclarationEnumSchema, - issuedHouseBills: IssuedHouseBillsEnumSchema, - }) - .readonly(); - export type ShippingInstructionsIcs2Dto = z.infer; - - /** - * ShippingInstructionsCargoIdentificationNumbersDtoSchema - * @type { object } - * @property { string } PCINNumber - * @property { string } CSNNumber - * @property { string } MCINNumber - */ - export const ShippingInstructionsCargoIdentificationNumbersDtoSchema = z - .object({ PCINNumber: z.string(), CSNNumber: z.string(), MCINNumber: z.string() }) - .readonly(); - export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer< - typeof ShippingInstructionsCargoIdentificationNumbersDtoSchema - >; - - /** - * ShippingInstructionsControlTotalsDtoSchema - * @type { object } - * @property { number } totalNumberOfContainers - * @property { number } totalNumberOfPackages - * @property { number } totalShipmentWeight - * @property { number } totalShipmentVolume - */ - export const ShippingInstructionsControlTotalsDtoSchema = z - .object({ - totalNumberOfContainers: z.number(), - totalNumberOfPackages: z.number(), - totalShipmentWeight: z.number(), - totalShipmentVolume: z.number(), - }) - .readonly(); - export type ShippingInstructionsControlTotalsDto = z.infer; - - /** - * FreightChargesDtoSchema - * @type { object } - * @property { string } freightPayer - * @property { string } freightTerm - */ - export const FreightChargesDtoSchema = z - .object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }) - .readonly(); - export type FreightChargesDto = z.infer; - - /** - * ShippingInstructionsShippersDeclaredValueDtoSchema - * @type { object } - * @property { string } currency - * @property { number } shipperDeclaredValue - */ - export const ShippingInstructionsShippersDeclaredValueDtoSchema = z - .object({ currency: z.string(), shipperDeclaredValue: z.number() }) - .readonly(); - export type ShippingInstructionsShippersDeclaredValueDto = z.infer< - typeof ShippingInstructionsShippersDeclaredValueDtoSchema - >; - - /** - * ShippingInstructionsNotificationEmailsDtoSchema - * @type { object } - * @property { string } siRequestorEmails - */ - export const ShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string() }).readonly(); - export type ShippingInstructionsNotificationEmailsDto = z.infer< - typeof ShippingInstructionsNotificationEmailsDtoSchema - >; - - /** - * ShippingInstructionsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } name - * @property { string } nameSuffix - * @property { string } date - * @property { string } createdAt - * @property { string } updatedAt - * @property { number } versionNumber - * @property { ShippingInstructionsHeaderDto } header - * @property { ShippingInstructionsGeneralDetailsDto } generalDetails - * @property { ShippingInstructionsReferencesDto } references - * @property { ShippingInstructionsTransportDto } transport - * @property { ShippingInstructionsCustomsComplianceDto } customsCompliance - * @property { ShippingInstructionsIcs2Dto } ics2 - * @property { ShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers - * @property { ShippingInstructionsCargoResponseDto[] } cargo - * @property { ShippingInstructionsControlTotalsDto } controlTotals - * @property { FreightChargesDto } freightCharges - * @property { ShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue - * @property { ShippingInstructionsNotificationEmailsDto } notificationEmails - * @property { string } defaultFileName - */ - export const ShippingInstructionsResponseDtoSchema = z - .object({ - id: z.string(), - positionId: z.string(), - name: z.string(), - nameSuffix: z.string().nullish(), - date: z.iso.datetime({ offset: true }).nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - versionNumber: z.number(), - header: ShippingInstructionsHeaderDtoSchema, - generalDetails: ShippingInstructionsGeneralDetailsDtoSchema, - references: ShippingInstructionsReferencesDtoSchema, - transport: ShippingInstructionsTransportDtoSchema, - customsCompliance: ShippingInstructionsCustomsComplianceDtoSchema, - ics2: ShippingInstructionsIcs2DtoSchema, - cargoIdentificationNumbers: ShippingInstructionsCargoIdentificationNumbersDtoSchema, - cargo: z.array(ShippingInstructionsCargoResponseDtoSchema).readonly().nullish(), - controlTotals: ShippingInstructionsControlTotalsDtoSchema, - freightCharges: FreightChargesDtoSchema, - shippersDeclaredValue: ShippingInstructionsShippersDeclaredValueDtoSchema, - notificationEmails: ShippingInstructionsNotificationEmailsDtoSchema, - defaultFileName: z.string(), - }) - .readonly(); - export type ShippingInstructionsResponseDto = z.infer; - - /** - * UpdateShippingInstructionsPartnerDtoSchema - * @type { object } - * @property { string } id Partner id - * @property { string } name Partner name - * @property { string } addressLine1 Address line 1 - * @property { string } addressLine2 Address line 2 - * @property { string } city City - * @property { string } postalCode Postal code - * @property { string } state State - * @property { string } countryCode Country code - * @property { string } taxId Tax ID - * @property { string } contactName Contact name - * @property { string } contactPhone Contact phone - * @property { string } contactEmail Contact email - */ - export const UpdateShippingInstructionsPartnerDtoSchema = z - .object({ - id: z.string().describe("Partner id"), - name: z.string().describe("Partner name"), - addressLine1: z.string().describe("Address line 1"), - addressLine2: z.string().describe("Address line 2"), - city: z.string().describe("City"), - postalCode: z.string().describe("Postal code"), - state: z.string().describe("State"), - countryCode: z.string().describe("Country code"), - taxId: z.string().describe("Tax ID"), - contactName: z.string().describe("Contact name"), - contactPhone: z.string().describe("Contact phone"), - contactEmail: z.string().describe("Contact email"), - }) - .readonly(); - export type UpdateShippingInstructionsPartnerDto = z.infer; - - /** - * UpdateShippingInstructionsGeneralDetailsDtoSchema - * @type { object } - * @property { UpdateShippingInstructionsPartnerDto } shipper Shipper - * @property { UpdateShippingInstructionsPartnerDto } consignee Consignee - * @property { UpdateShippingInstructionsPartnerDto } freightForwarder Freight forwarder - * @property { UpdateShippingInstructionsPartnerDto } notifyParty Notify party - * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty1 Additional notify party 1 - * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty2 Additional notify party 2 - * @property { UpdateShippingInstructionsPartnerDto } contractParty Contract party - * @property { UpdateShippingInstructionsPartnerDto } manufacturer Manufacturer - * @property { UpdateShippingInstructionsPartnerDto } consolidator Consolidator - * @property { UpdateShippingInstructionsPartnerDto } importer Importer - * @property { UpdateShippingInstructionsPartnerDto } warehouseKeeper Warehouse keeper - */ - export const UpdateShippingInstructionsGeneralDetailsDtoSchema = z - .object({ - shipper: UpdateShippingInstructionsPartnerDtoSchema.describe("Shipper"), - consignee: UpdateShippingInstructionsPartnerDtoSchema.describe("Consignee"), - freightForwarder: UpdateShippingInstructionsPartnerDtoSchema.describe("Freight forwarder"), - notifyParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Notify party"), - additionalNotifyParty1: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 1"), - additionalNotifyParty2: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 2"), - contractParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Contract party"), - manufacturer: UpdateShippingInstructionsPartnerDtoSchema.describe("Manufacturer"), - consolidator: UpdateShippingInstructionsPartnerDtoSchema.describe("Consolidator"), - importer: UpdateShippingInstructionsPartnerDtoSchema.describe("Importer"), - warehouseKeeper: UpdateShippingInstructionsPartnerDtoSchema.describe("Warehouse keeper"), - }) - .readonly(); - export type UpdateShippingInstructionsGeneralDetailsDto = z.infer< - typeof UpdateShippingInstructionsGeneralDetailsDtoSchema - >; - - /** - * UpdateShippingInstructionsLocationDtoSchema - * @type { object } - * @property { string } id Location id - * @property { string } name Location name - * @property { string } code Location code - * @property { string } countryCode Country code - */ - export const UpdateShippingInstructionsLocationDtoSchema = z - .object({ - id: z.string().describe("Location id"), - name: z.string().describe("Location name"), - code: z.string().describe("Location code"), - countryCode: z.string().describe("Country code"), - }) - .readonly(); - export type UpdateShippingInstructionsLocationDto = z.infer; - - /** - * UpdateShippingInstructionsTransportDtoSchema - * @type { object } - * @property { string } vessel Vessel - * @property { string } voyage Voyage - * @property { string } imo IMO - * @property { UpdateShippingInstructionsLocationDto } placeOfReceipt Place of receipt - * @property { UpdateShippingInstructionsLocationDto } portOfLoading Port of loading - * @property { UpdateShippingInstructionsLocationDto } portOfDischarge Port of discharge - * @property { UpdateShippingInstructionsLocationDto } placeOfDelivery Place of delivery - * @property { SIMoveTypeEnum } moveType Move type - * @property { string } shipmentType Shipment type - */ - export const UpdateShippingInstructionsTransportDtoSchema = z - .object({ - vessel: z.string().describe("Vessel"), - voyage: z.string().describe("Voyage"), - imo: z.string().describe("IMO"), - placeOfReceipt: UpdateShippingInstructionsLocationDtoSchema.describe("Place of receipt"), - portOfLoading: UpdateShippingInstructionsLocationDtoSchema.describe("Port of loading"), - portOfDischarge: UpdateShippingInstructionsLocationDtoSchema.describe("Port of discharge"), - placeOfDelivery: UpdateShippingInstructionsLocationDtoSchema.describe("Place of delivery"), - moveType: SIMoveTypeEnumSchema.describe("Move type"), - shipmentType: z.string().describe("Shipment type"), - }) - .readonly(); - export type UpdateShippingInstructionsTransportDto = z.infer; - - /** - * UpdateShippingInstructionsHazardousDtoSchema - * @type { object } - * @property { string } IMOClass IMO class - * @property { string } UNDGNumber UNDG number - * @property { string } contact Contact - */ - export const UpdateShippingInstructionsHazardousDtoSchema = z - .object({ - IMOClass: z.string().describe("IMO class"), - UNDGNumber: z.string().describe("UNDG number"), - contact: z.string().describe("Contact"), - }) - .readonly(); - export type UpdateShippingInstructionsHazardousDto = z.infer; - - /** - * UpdateShippingInstructionsPackageDtoSchema - * @type { object } - * @property { string } id Package id - * @property { number } quantity Quantity - * @property { string } packageType Package type - * @property { string } packageTypeDescription Package type description - * @property { string } packageDescription Package description - * @property { string } hsCode HS code - * @property { number } volume Volume - * @property { number } grossWeight Gross weight - * @property { string } caseMarks Case marks - * @property { UpdateShippingInstructionsHazardousDto } hazardous Hazardous - * @property { string } ncmCodes NCM codes - * @property { string } cusCode CUS code - */ - export const UpdateShippingInstructionsPackageDtoSchema = z - .object({ - id: z.string().describe("Package id"), - quantity: z.number().describe("Quantity"), - packageType: z.string().describe("Package type"), - packageTypeDescription: z.string().describe("Package type description"), - packageDescription: z.string().describe("Package description"), - hsCode: z.string().describe("HS code"), - volume: z.number().describe("Volume"), - grossWeight: z.number().describe("Gross weight"), - caseMarks: z.string().describe("Case marks"), - hazardous: UpdateShippingInstructionsHazardousDtoSchema.describe("Hazardous"), - ncmCodes: z.string().describe("NCM codes"), - cusCode: z.string().describe("CUS code"), - }) - .readonly(); - export type UpdateShippingInstructionsPackageDto = z.infer; - - /** - * UpdateShippingInstructionsCargoDtoSchema - * @type { object } - * @property { string } id Cargo id - * @property { string } transportUnitNumber Transport unit number - * @property { string } transportUnitType Transport unit type - * @property { string } transportUnitDescription Transport unit description - * @property { string } containerSupplier Container supplier - * @property { number } grossWeight Gross weight - * @property { number } tare Tare - * @property { number } volume Volume - * @property { string } seal1 Seal 1 - * @property { string } seal2 Seal 2 - * @property { string } woodDeclaration Wood declaration - * @property { UpdateShippingInstructionsPackageDto[] } packages Packages - */ - export const UpdateShippingInstructionsCargoDtoSchema = z - .object({ - id: z.string().describe("Cargo id"), - transportUnitNumber: z.string().describe("Transport unit number"), - transportUnitType: z.string().describe("Transport unit type"), - transportUnitDescription: z.string().describe("Transport unit description"), - containerSupplier: z.string().describe("Container supplier"), - grossWeight: z.number().describe("Gross weight"), - tare: z.number().describe("Tare"), - volume: z.number().describe("Volume"), - seal1: z.string().describe("Seal 1"), - seal2: z.string().describe("Seal 2"), - woodDeclaration: WoodDeclarationEnumSchema.describe("Wood declaration"), - packages: z.array(UpdateShippingInstructionsPackageDtoSchema).readonly().describe("Packages"), - }) - .readonly(); - export type UpdateShippingInstructionsCargoDto = z.infer; - - /** - * UpdateShippingInstructionsHeaderDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } nameSuffix Name suffix - * @property { number } versionNumber Version number - * @property { string } shippingInstructionNumber Shipping instruction number - * @property { string } carrierScac Carrier SCAC - * @property { string } carrierBookingNumber Carrier booking number - */ - export const UpdateShippingInstructionsHeaderDtoSchema = z - .object({ - name: z.string().describe("Name"), - nameSuffix: z.string().describe("Name suffix"), - versionNumber: z.number().describe("Version number"), - shippingInstructionNumber: z.string().describe("Shipping instruction number"), - carrierScac: z.string().describe("Carrier SCAC"), - carrierBookingNumber: z.string().describe("Carrier booking number"), - }) - .readonly(); - export type UpdateShippingInstructionsHeaderDto = z.infer; - - /** - * UpdateShippingInstructionsReferencesDtoSchema - * @type { object } - * @property { string } shipperReference Shipper reference - * @property { string } forwarderReference Forwarder reference - * @property { string } transactionReferenceNumber Transaction reference number - * @property { string } blReferenceNumber BL reference number - * @property { string } uniqueConsignmentReference Unique consignment reference - * @property { string } purchaseOrderNumber Purchase order number - * @property { string } contractReferenceNumber Contract reference number - * @property { string } rucNumber RUC number - * @property { string } consigneeOrderNumber Consignee order number - * @property { string } invoiceReferenceNumber Invoice reference number - * @property { string } letterOfCreditReference Letter of credit reference - * @property { string } customsHouseBrokerReference Customs house broker reference - * @property { string } fmcNumber FMC number - * @property { string } exportLicenseNumber Export license number - */ - export const UpdateShippingInstructionsReferencesDtoSchema = z - .object({ - shipperReference: z.string().describe("Shipper reference"), - forwarderReference: z.string().describe("Forwarder reference"), - transactionReferenceNumber: z.string().describe("Transaction reference number"), - blReferenceNumber: z.string().describe("BL reference number"), - uniqueConsignmentReference: z.string().describe("Unique consignment reference"), - purchaseOrderNumber: z.string().describe("Purchase order number"), - contractReferenceNumber: z.string().describe("Contract reference number"), - rucNumber: z.string().describe("RUC number"), - consigneeOrderNumber: z.string().describe("Consignee order number"), - invoiceReferenceNumber: z.string().describe("Invoice reference number"), - letterOfCreditReference: z.string().describe("Letter of credit reference"), - customsHouseBrokerReference: z.string().describe("Customs house broker reference"), - fmcNumber: z.string().describe("FMC number"), - exportLicenseNumber: z.string().describe("Export license number"), - }) - .readonly(); - export type UpdateShippingInstructionsReferencesDto = z.infer; - - /** - * UpdateShippingInstructionsCustomsComplianceDtoSchema - * @type { object } - * @property { string } shipperTaxId Shipper tax ID - * @property { string } shipperEORI Shipper EORI - * @property { string } consigneeTaxId Consignee tax ID - * @property { string } consigneeEORI Consignee EORI - * @property { string } notifyPartyTaxId Notify party tax ID - * @property { string } notifyPartyEORI Notify party EORI - */ - export const UpdateShippingInstructionsCustomsComplianceDtoSchema = z - .object({ - shipperTaxId: z.string().describe("Shipper tax ID"), - shipperEORI: z.string().describe("Shipper EORI"), - consigneeTaxId: z.string().describe("Consignee tax ID"), - consigneeEORI: z.string().describe("Consignee EORI"), - notifyPartyTaxId: z.string().describe("Notify party tax ID"), - notifyPartyEORI: z.string().describe("Notify party EORI"), - }) - .readonly(); - export type UpdateShippingInstructionsCustomsComplianceDto = z.infer< - typeof UpdateShippingInstructionsCustomsComplianceDtoSchema - >; - - /** - * UpdateShippingInstructionsIcs2DtoSchema - * @type { object } - * @property { boolean } goodsDeliveredInEu Goods delivered in EU - * @property { string } ensDeclaration ENS declaration - * @property { string } issuedHouseBills Issued house bills - */ - export const UpdateShippingInstructionsIcs2DtoSchema = z - .object({ - goodsDeliveredInEu: z.boolean().describe("Goods delivered in EU"), - ensDeclaration: EnsDeclarationEnumSchema.describe("ENS declaration"), - issuedHouseBills: IssuedHouseBillsEnumSchema.describe("Issued house bills"), - }) - .readonly(); - export type UpdateShippingInstructionsIcs2Dto = z.infer; - - /** - * UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema - * @type { object } - * @property { string } PCINNumber PCIN number - * @property { string } CSNNumber CSN number - * @property { string } MCINNumber MCIN number - */ - export const UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema = z - .object({ - PCINNumber: z.string().describe("PCIN number"), - CSNNumber: z.string().describe("CSN number"), - MCINNumber: z.string().describe("MCIN number"), - }) - .readonly(); - export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer< - typeof UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema - >; - - /** - * UpdateFreightChargesDtoSchema - * @type { object } - * @property { string } freightPayer - * @property { string } freightTerm - */ - export const UpdateFreightChargesDtoSchema = z - .object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }) - .readonly(); - export type UpdateFreightChargesDto = z.infer; - - /** - * UpdateShippingInstructionsShippersDeclaredValueDtoSchema - * @type { object } - * @property { string } currency Currency - * @property { number } shipperDeclaredValue Shipper declared value - */ - export const UpdateShippingInstructionsShippersDeclaredValueDtoSchema = z - .object({ - currency: z.string().describe("Currency"), - shipperDeclaredValue: z.number().describe("Shipper declared value"), - }) - .readonly(); - export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer< - typeof UpdateShippingInstructionsShippersDeclaredValueDtoSchema - >; - - /** - * UpdateShippingInstructionsNotificationEmailsDtoSchema - * @type { object } - * @property { string } siRequestorEmails SI requestor emails - */ - export const UpdateShippingInstructionsNotificationEmailsDtoSchema = z - .object({ siRequestorEmails: z.string().describe("SI requestor emails") }) - .readonly(); - export type UpdateShippingInstructionsNotificationEmailsDto = z.infer< - typeof UpdateShippingInstructionsNotificationEmailsDtoSchema - >; - - /** - * UpdateShippingInstructionsRequestDtoSchema - * @type { object } - * @property { string } date Date - * @property { UpdateShippingInstructionsHeaderDto } header Header - * @property { UpdateShippingInstructionsGeneralDetailsDto } generalDetails General details - * @property { UpdateShippingInstructionsReferencesDto } references References - * @property { UpdateShippingInstructionsTransportDto } transport Transport - * @property { UpdateShippingInstructionsCustomsComplianceDto } customsCompliance Customs compliance - * @property { UpdateShippingInstructionsIcs2Dto } ics2 ICS2 - * @property { UpdateShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers Cargo identification numbers - * @property { UpdateShippingInstructionsCargoDto[] } cargo Cargo - * @property { UpdateFreightChargesDto } freightCharges - * @property { UpdateShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue Shipper's declared value - * @property { UpdateShippingInstructionsNotificationEmailsDto } notificationEmails Notification emails - */ - export const UpdateShippingInstructionsRequestDtoSchema = z - .object({ - date: z.iso.datetime({ offset: true }).describe("Date"), - header: UpdateShippingInstructionsHeaderDtoSchema.describe("Header"), - generalDetails: UpdateShippingInstructionsGeneralDetailsDtoSchema.describe("General details"), - references: UpdateShippingInstructionsReferencesDtoSchema.describe("References"), - transport: UpdateShippingInstructionsTransportDtoSchema.describe("Transport"), - customsCompliance: UpdateShippingInstructionsCustomsComplianceDtoSchema.describe("Customs compliance"), - ics2: UpdateShippingInstructionsIcs2DtoSchema.describe("ICS2"), - cargoIdentificationNumbers: - UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema.describe("Cargo identification numbers"), - cargo: z.array(UpdateShippingInstructionsCargoDtoSchema).readonly().describe("Cargo"), - freightCharges: UpdateFreightChargesDtoSchema, - shippersDeclaredValue: - UpdateShippingInstructionsShippersDeclaredValueDtoSchema.describe("Shipper's declared value"), - notificationEmails: UpdateShippingInstructionsNotificationEmailsDtoSchema.describe("Notification emails"), - }) - .readonly(); - export type UpdateShippingInstructionsRequestDto = z.infer; +/** + * EnsDeclarationEnumSchema + * @type { enum } + * @description ENS declaration + */ +export const EnsDeclarationEnumSchema = z.enum(["Carrier", "Self"]); +export type EnsDeclarationEnum = z.infer; +export const EnsDeclarationEnum = EnsDeclarationEnumSchema.enum; + +/** + * IssuedHouseBillsEnumSchema + * @type { enum } + * @description Issued house bills + */ +export const IssuedHouseBillsEnumSchema = z.enum(["None", "One", "Multiple"]); +export type IssuedHouseBillsEnum = z.infer; +export const IssuedHouseBillsEnum = IssuedHouseBillsEnumSchema.enum; + +/** + * WoodDeclarationEnumSchema + * @type { enum } + * @description Wood declaration + */ +export const WoodDeclarationEnumSchema = z.enum(["NoWood", "TreatedAndCertified", "NotTreatedAndNotCertified", "Processed"]); +export type WoodDeclarationEnum = z.infer; +export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; + +/** + * ShippingInstructionsPartnerResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } addressLine1 + * @property { string } addressLine2 + * @property { string } city + * @property { string } postalCode + * @property { string } state + * @property { string } countryCode + * @property { string } contactName + * @property { string } contactPhone + * @property { string } contactEmail + */ +export const ShippingInstructionsPartnerResponseDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), addressLine1: z.string().nullable(), addressLine2: z.string().nullable(), city: z.string().nullable(), postalCode: z.string().nullable(), state: z.string().nullable(), countryCode: z.string().nullable(), contactName: z.string().nullable(), contactPhone: z.string().nullable(), contactEmail: z.string().nullable() }).partial(); +export type ShippingInstructionsPartnerResponseDto = z.infer; + +/** + * ShippingInstructionsGeneralDetailsDtoSchema + * @type { object } + * @property { ShippingInstructionsPartnerResponseDto } shipper + * @property { ShippingInstructionsPartnerResponseDto } consignee + * @property { ShippingInstructionsPartnerResponseDto } freightForwarder + * @property { ShippingInstructionsPartnerResponseDto } notifyParty + * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty1 + * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty2 + * @property { ShippingInstructionsPartnerResponseDto } contractParty + * @property { ShippingInstructionsPartnerResponseDto } manufacturer + * @property { ShippingInstructionsPartnerResponseDto } consolidator + * @property { ShippingInstructionsPartnerResponseDto } importer + * @property { ShippingInstructionsPartnerResponseDto } warehouseKeeper + */ +export const ShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: ShippingInstructionsPartnerResponseDtoSchema.nullable(), consignee: ShippingInstructionsPartnerResponseDtoSchema.nullable(), freightForwarder: ShippingInstructionsPartnerResponseDtoSchema.nullable(), notifyParty: ShippingInstructionsPartnerResponseDtoSchema.nullable(), additionalNotifyParty1: ShippingInstructionsPartnerResponseDtoSchema.nullable(), additionalNotifyParty2: ShippingInstructionsPartnerResponseDtoSchema.nullable(), contractParty: ShippingInstructionsPartnerResponseDtoSchema.nullable(), manufacturer: ShippingInstructionsPartnerResponseDtoSchema.nullable(), consolidator: ShippingInstructionsPartnerResponseDtoSchema.nullable(), importer: ShippingInstructionsPartnerResponseDtoSchema.nullable(), warehouseKeeper: ShippingInstructionsPartnerResponseDtoSchema.nullable() }).partial(); +export type ShippingInstructionsGeneralDetailsDto = z.infer; + +/** + * ShippingInstructionsLocationResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } code + * @property { string } countryCode + * @property { string } eta + * @property { string } vessel + * @property { string } voyage + */ +export const ShippingInstructionsLocationResponseDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), code: z.string().nullable(), countryCode: z.string().nullable(), eta: z.iso.datetime({ offset: true }).nullable(), vessel: z.string().nullable(), voyage: z.string().nullable() }).partial(); +export type ShippingInstructionsLocationResponseDto = z.infer; + +/** + * SIMoveTypeEnumSchema + * @type { enum } + */ +export const SIMoveTypeEnumSchema = z.enum(["DoorToDoor", "DoorToPort", "PortToDoor", "PortToPort"]); +export type SIMoveTypeEnum = z.infer; +export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; + +/** + * ShippingInstructionsTransportDtoSchema + * @type { object } + * @property { string } vessel + * @property { string } voyage + * @property { string } imo + * @property { ShippingInstructionsLocationResponseDto } placeOfReceipt + * @property { ShippingInstructionsLocationResponseDto } portOfLoading + * @property { ShippingInstructionsLocationResponseDto } portOfDischarge + * @property { ShippingInstructionsLocationResponseDto } placeOfDelivery + * @property { SIMoveTypeEnum } moveType + * @property { string } shipmentType + */ +export const ShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string().nullable(), voyage: z.string().nullable(), imo: z.string().nullable(), placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema.nullable(), portOfLoading: ShippingInstructionsLocationResponseDtoSchema.nullable(), portOfDischarge: ShippingInstructionsLocationResponseDtoSchema.nullable(), placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema.nullable(), moveType: SIMoveTypeEnumSchema.nullable(), shipmentType: z.string().nullable() }).partial(); +export type ShippingInstructionsTransportDto = z.infer; + +/** + * ShippingInstructionsHazardousDtoSchema + * @type { object } + * @property { string } IMOClass + * @property { string } UNDGNumber + * @property { string } contact + */ +export const ShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string().nullable(), UNDGNumber: z.string().nullable(), contact: z.string().nullable() }).partial(); +export type ShippingInstructionsHazardousDto = z.infer; + +/** + * ShippingInstructionsPackageResponseDtoSchema + * @type { object } + * @property { string } id + * @property { number } quantity + * @property { string } packageType + * @property { string } packageTypeDescription + * @property { string } packageDescription + * @property { string } hsCode + * @property { number } volume + * @property { number } grossWeight + * @property { string } caseMarks + * @property { ShippingInstructionsHazardousDto } hazardous + * @property { string } ncmCodes + * @property { string } cusCode + */ +export const ShippingInstructionsPackageResponseDtoSchema = z.object({ id: z.string().nullable(), quantity: z.number().nullable(), packageType: z.string().nullable(), packageTypeDescription: z.string().nullable(), packageDescription: z.string().nullable(), hsCode: z.string().nullable(), volume: z.number().nullable(), grossWeight: z.number().nullable(), caseMarks: z.string().nullable(), hazardous: ShippingInstructionsHazardousDtoSchema.nullable(), ncmCodes: z.string().nullable(), cusCode: z.string().nullable() }).partial(); +export type ShippingInstructionsPackageResponseDto = z.infer; + +/** + * ShippingInstructionsCargoResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } transportUnitNumber + * @property { string } transportUnitType + * @property { string } transportUnitDescription + * @property { string } containerSupplier + * @property { number } grossWeight + * @property { number } tare + * @property { number } volume + * @property { string } seal1 + * @property { string } seal2 + * @property { string } woodDeclaration + * @property { ShippingInstructionsPackageResponseDto[] } packages + */ +export const ShippingInstructionsCargoResponseDtoSchema = z.object({ id: z.string().nullish(), transportUnitNumber: z.string().nullish(), transportUnitType: z.string().nullish(), transportUnitDescription: z.string().nullish(), containerSupplier: z.string().nullish(), grossWeight: z.number().nullish(), tare: z.number().nullish(), volume: z.number().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), woodDeclaration: WoodDeclarationEnumSchema.nullish(), packages: z.array(ShippingInstructionsPackageResponseDtoSchema) }); +export type ShippingInstructionsCargoResponseDto = z.infer; + +/** + * ShippingInstructionsHeaderDtoSchema + * @type { object } + * @property { string } name + * @property { string } nameSuffix + * @property { number } versionNumber + * @property { string } shippingInstructionNumber + * @property { string } carrierScac + * @property { string } carrierBookingNumber + */ +export const ShippingInstructionsHeaderDtoSchema = z.object({ name: z.string(), nameSuffix: z.string().nullish(), versionNumber: z.number(), shippingInstructionNumber: z.string().nullish(), carrierScac: z.string().nullish(), carrierBookingNumber: z.string().nullish() }); +export type ShippingInstructionsHeaderDto = z.infer; + +/** + * ShippingInstructionsReferencesDtoSchema + * @type { object } + * @property { string } shipperReference + * @property { string } forwarderReference + * @property { string } transactionReferenceNumber + * @property { string } blReferenceNumber + * @property { string } uniqueConsignmentReference + * @property { string } purchaseOrderNumber + * @property { string } contractReferenceNumber + * @property { string } rucNumber + * @property { string } consigneeOrderNumber + * @property { string } invoiceReferenceNumber + * @property { string } letterOfCreditReference + * @property { string } customsHouseBrokerReference + * @property { string } fmcNumber + * @property { string } exportLicenseNumber + */ +export const ShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string().nullable(), forwarderReference: z.string().nullable(), transactionReferenceNumber: z.string().nullable(), blReferenceNumber: z.string().nullable(), uniqueConsignmentReference: z.string().nullable(), purchaseOrderNumber: z.string().nullable(), contractReferenceNumber: z.string().nullable(), rucNumber: z.string().nullable(), consigneeOrderNumber: z.string().nullable(), invoiceReferenceNumber: z.string().nullable(), letterOfCreditReference: z.string().nullable(), customsHouseBrokerReference: z.string().nullable(), fmcNumber: z.string().nullable(), exportLicenseNumber: z.string().nullable() }).partial(); +export type ShippingInstructionsReferencesDto = z.infer; + +/** + * ShippingInstructionsCustomsComplianceDtoSchema + * @type { object } + * @property { string } shipperTaxId + * @property { string } shipperEORI + * @property { string } consigneeTaxId + * @property { string } consigneeEORI + * @property { string } notifyPartyTaxId + * @property { string } notifyPartyEORI + */ +export const ShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string().nullable(), shipperEORI: z.string().nullable(), consigneeTaxId: z.string().nullable(), consigneeEORI: z.string().nullable(), notifyPartyTaxId: z.string().nullable(), notifyPartyEORI: z.string().nullable() }).partial(); +export type ShippingInstructionsCustomsComplianceDto = z.infer; + +/** + * ShippingInstructionsIcs2DtoSchema + * @type { object } + * @property { boolean } goodsDeliveredInEu + * @property { string } ensDeclaration + * @property { string } issuedHouseBills + */ +export const ShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean().nullable(), ensDeclaration: EnsDeclarationEnumSchema.nullable(), issuedHouseBills: IssuedHouseBillsEnumSchema.nullable() }).partial(); +export type ShippingInstructionsIcs2Dto = z.infer; + +/** + * ShippingInstructionsCargoIdentificationNumbersDtoSchema + * @type { object } + * @property { string } PCINNumber + * @property { string } CSNNumber + * @property { string } MCINNumber + */ +export const ShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string().nullable(), CSNNumber: z.string().nullable(), MCINNumber: z.string().nullable() }).partial(); +export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer; + +/** + * ShippingInstructionsControlTotalsDtoSchema + * @type { object } + * @property { number } totalNumberOfContainers + * @property { number } totalNumberOfPackages + * @property { number } totalShipmentWeight + * @property { number } totalShipmentVolume + */ +export const ShippingInstructionsControlTotalsDtoSchema = z.object({ totalNumberOfContainers: z.number().nullable(), totalNumberOfPackages: z.number().nullable(), totalShipmentWeight: z.number().nullable(), totalShipmentVolume: z.number().nullable() }).partial(); +export type ShippingInstructionsControlTotalsDto = z.infer; + +/** + * FreightChargesDtoSchema + * @type { object } + * @property { string } freightPayer + * @property { string } freightTerm + */ +export const FreightChargesDtoSchema = z.object({ freightPayer: z.string().nullable(), freightTerm: CommonModels.ChargePaymentEnumSchema.nullable() }).partial(); +export type FreightChargesDto = z.infer; + +/** + * ShippingInstructionsShippersDeclaredValueDtoSchema + * @type { object } + * @property { string } currency + * @property { number } shipperDeclaredValue + */ +export const ShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string().nullable(), shipperDeclaredValue: z.number().nullable() }).partial(); +export type ShippingInstructionsShippersDeclaredValueDto = z.infer; + +/** + * ShippingInstructionsNotificationEmailsDtoSchema + * @type { object } + * @property { string } siRequestorEmails + */ +export const ShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string().nullable() }).partial(); +export type ShippingInstructionsNotificationEmailsDto = z.infer; + +/** + * ShippingInstructionsResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } name + * @property { string } nameSuffix + * @property { string } date + * @property { string } createdAt + * @property { string } updatedAt + * @property { number } versionNumber + * @property { ShippingInstructionsHeaderDto } header + * @property { ShippingInstructionsGeneralDetailsDto } generalDetails + * @property { ShippingInstructionsReferencesDto } references + * @property { ShippingInstructionsTransportDto } transport + * @property { ShippingInstructionsCustomsComplianceDto } customsCompliance + * @property { ShippingInstructionsIcs2Dto } ics2 + * @property { ShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers + * @property { ShippingInstructionsCargoResponseDto[] } cargo + * @property { ShippingInstructionsControlTotalsDto } controlTotals + * @property { FreightChargesDto } freightCharges + * @property { ShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue + * @property { ShippingInstructionsNotificationEmailsDto } notificationEmails + * @property { string } defaultFileName + */ +export const ShippingInstructionsResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), date: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), versionNumber: z.number(), header: ShippingInstructionsHeaderDtoSchema, generalDetails: ShippingInstructionsGeneralDetailsDtoSchema, references: ShippingInstructionsReferencesDtoSchema, transport: ShippingInstructionsTransportDtoSchema, customsCompliance: ShippingInstructionsCustomsComplianceDtoSchema, ics2: ShippingInstructionsIcs2DtoSchema, cargoIdentificationNumbers: ShippingInstructionsCargoIdentificationNumbersDtoSchema, cargo: z.array(ShippingInstructionsCargoResponseDtoSchema).nullish(), controlTotals: ShippingInstructionsControlTotalsDtoSchema, freightCharges: FreightChargesDtoSchema, shippersDeclaredValue: ShippingInstructionsShippersDeclaredValueDtoSchema, notificationEmails: ShippingInstructionsNotificationEmailsDtoSchema, defaultFileName: z.string() }); +export type ShippingInstructionsResponseDto = z.infer; + +/** + * UpdateShippingInstructionsPartnerDtoSchema + * @type { object } + * @property { string } id Partner id + * @property { string } name Partner name + * @property { string } addressLine1 Address line 1 + * @property { string } addressLine2 Address line 2 + * @property { string } city City + * @property { string } postalCode Postal code + * @property { string } state State + * @property { string } countryCode Country code + * @property { string } taxId Tax ID + * @property { string } contactName Contact name + * @property { string } contactPhone Contact phone + * @property { string } contactEmail Contact email + */ +export const UpdateShippingInstructionsPartnerDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), addressLine1: z.string().nullable(), addressLine2: z.string().nullable(), city: z.string().nullable(), postalCode: z.string().nullable(), state: z.string().nullable(), countryCode: z.string().nullable(), taxId: z.string().nullable(), contactName: z.string().nullable(), contactPhone: z.string().nullable(), contactEmail: z.string().nullable() }).partial(); +export type UpdateShippingInstructionsPartnerDto = z.infer; + +/** + * UpdateShippingInstructionsGeneralDetailsDtoSchema + * @type { object } + * @property { UpdateShippingInstructionsPartnerDto } shipper Shipper + * @property { UpdateShippingInstructionsPartnerDto } consignee Consignee + * @property { UpdateShippingInstructionsPartnerDto } freightForwarder Freight forwarder + * @property { UpdateShippingInstructionsPartnerDto } notifyParty Notify party + * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty1 Additional notify party 1 + * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty2 Additional notify party 2 + * @property { UpdateShippingInstructionsPartnerDto } contractParty Contract party + * @property { UpdateShippingInstructionsPartnerDto } manufacturer Manufacturer + * @property { UpdateShippingInstructionsPartnerDto } consolidator Consolidator + * @property { UpdateShippingInstructionsPartnerDto } importer Importer + * @property { UpdateShippingInstructionsPartnerDto } warehouseKeeper Warehouse keeper + */ +export const UpdateShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: UpdateShippingInstructionsPartnerDtoSchema.nullable(), consignee: UpdateShippingInstructionsPartnerDtoSchema.nullable(), freightForwarder: UpdateShippingInstructionsPartnerDtoSchema.nullable(), notifyParty: UpdateShippingInstructionsPartnerDtoSchema.nullable(), additionalNotifyParty1: UpdateShippingInstructionsPartnerDtoSchema.nullable(), additionalNotifyParty2: UpdateShippingInstructionsPartnerDtoSchema.nullable(), contractParty: UpdateShippingInstructionsPartnerDtoSchema.nullable(), manufacturer: UpdateShippingInstructionsPartnerDtoSchema.nullable(), consolidator: UpdateShippingInstructionsPartnerDtoSchema.nullable(), importer: UpdateShippingInstructionsPartnerDtoSchema.nullable(), warehouseKeeper: UpdateShippingInstructionsPartnerDtoSchema.nullable() }).partial(); +export type UpdateShippingInstructionsGeneralDetailsDto = z.infer; + +/** + * UpdateShippingInstructionsLocationDtoSchema + * @type { object } + * @property { string } id Location id + * @property { string } name Location name + * @property { string } code Location code + * @property { string } countryCode Country code + */ +export const UpdateShippingInstructionsLocationDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), code: z.string().nullable(), countryCode: z.string().nullable() }).partial(); +export type UpdateShippingInstructionsLocationDto = z.infer; + +/** + * UpdateShippingInstructionsTransportDtoSchema + * @type { object } + * @property { string } vessel Vessel + * @property { string } voyage Voyage + * @property { string } imo IMO + * @property { UpdateShippingInstructionsLocationDto } placeOfReceipt Place of receipt + * @property { UpdateShippingInstructionsLocationDto } portOfLoading Port of loading + * @property { UpdateShippingInstructionsLocationDto } portOfDischarge Port of discharge + * @property { UpdateShippingInstructionsLocationDto } placeOfDelivery Place of delivery + * @property { SIMoveTypeEnum } moveType Move type + * @property { string } shipmentType Shipment type + */ +export const UpdateShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string().nullable(), voyage: z.string().nullable(), imo: z.string().nullable(), placeOfReceipt: UpdateShippingInstructionsLocationDtoSchema.nullable(), portOfLoading: UpdateShippingInstructionsLocationDtoSchema.nullable(), portOfDischarge: UpdateShippingInstructionsLocationDtoSchema.nullable(), placeOfDelivery: UpdateShippingInstructionsLocationDtoSchema.nullable(), moveType: SIMoveTypeEnumSchema.nullable(), shipmentType: z.string().nullable() }).partial(); +export type UpdateShippingInstructionsTransportDto = z.infer; + +/** + * UpdateShippingInstructionsHazardousDtoSchema + * @type { object } + * @property { string } IMOClass IMO class + * @property { string } UNDGNumber UNDG number + * @property { string } contact Contact + */ +export const UpdateShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string().nullable(), UNDGNumber: z.string().nullable(), contact: z.string().nullable() }).partial(); +export type UpdateShippingInstructionsHazardousDto = z.infer; + +/** + * UpdateShippingInstructionsPackageDtoSchema + * @type { object } + * @property { string } id Package id + * @property { number } quantity Quantity + * @property { string } packageType Package type + * @property { string } packageTypeDescription Package type description + * @property { string } packageDescription Package description + * @property { string } hsCode HS code + * @property { number } volume Volume + * @property { number } grossWeight Gross weight + * @property { string } caseMarks Case marks + * @property { UpdateShippingInstructionsHazardousDto } hazardous Hazardous + * @property { string } ncmCodes NCM codes + * @property { string } cusCode CUS code + */ +export const UpdateShippingInstructionsPackageDtoSchema = z.object({ id: z.string().nullable(), quantity: z.number().nullable(), packageType: z.string().nullable(), packageTypeDescription: z.string().nullable(), packageDescription: z.string().nullable(), hsCode: z.string().nullable(), volume: z.number().nullable(), grossWeight: z.number().nullable(), caseMarks: z.string().nullable(), hazardous: UpdateShippingInstructionsHazardousDtoSchema.nullable(), ncmCodes: z.string().nullable(), cusCode: z.string().nullable() }).partial(); +export type UpdateShippingInstructionsPackageDto = z.infer; + +/** + * UpdateShippingInstructionsCargoDtoSchema + * @type { object } + * @property { string } id Cargo id + * @property { string } transportUnitNumber Transport unit number + * @property { string } transportUnitType Transport unit type + * @property { string } transportUnitDescription Transport unit description + * @property { string } containerSupplier Container supplier + * @property { number } grossWeight Gross weight + * @property { number } tare Tare + * @property { number } volume Volume + * @property { string } seal1 Seal 1 + * @property { string } seal2 Seal 2 + * @property { string } woodDeclaration Wood declaration + * @property { UpdateShippingInstructionsPackageDto[] } packages Packages + */ +export const UpdateShippingInstructionsCargoDtoSchema = z.object({ id: z.string().nullable(), transportUnitNumber: z.string().nullable(), transportUnitType: z.string().nullable(), transportUnitDescription: z.string().nullable(), containerSupplier: z.string().nullable(), grossWeight: z.number().nullable(), tare: z.number().nullable(), volume: z.number().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), woodDeclaration: WoodDeclarationEnumSchema.nullable(), packages: z.array(UpdateShippingInstructionsPackageDtoSchema).nullable() }).partial(); +export type UpdateShippingInstructionsCargoDto = z.infer; + +/** + * UpdateShippingInstructionsHeaderDtoSchema + * @type { object } + * @property { string } name Name + * @property { string } nameSuffix Name suffix + * @property { number } versionNumber Version number + * @property { string } shippingInstructionNumber Shipping instruction number + * @property { string } carrierScac Carrier SCAC + * @property { string } carrierBookingNumber Carrier booking number + */ +export const UpdateShippingInstructionsHeaderDtoSchema = z.object({ name: z.string().nullable(), nameSuffix: z.string().nullable(), versionNumber: z.number().nullable(), shippingInstructionNumber: z.string().nullable(), carrierScac: z.string().nullable(), carrierBookingNumber: z.string().nullable() }).partial(); +export type UpdateShippingInstructionsHeaderDto = z.infer; + +/** + * UpdateShippingInstructionsReferencesDtoSchema + * @type { object } + * @property { string } shipperReference Shipper reference + * @property { string } forwarderReference Forwarder reference + * @property { string } transactionReferenceNumber Transaction reference number + * @property { string } blReferenceNumber BL reference number + * @property { string } uniqueConsignmentReference Unique consignment reference + * @property { string } purchaseOrderNumber Purchase order number + * @property { string } contractReferenceNumber Contract reference number + * @property { string } rucNumber RUC number + * @property { string } consigneeOrderNumber Consignee order number + * @property { string } invoiceReferenceNumber Invoice reference number + * @property { string } letterOfCreditReference Letter of credit reference + * @property { string } customsHouseBrokerReference Customs house broker reference + * @property { string } fmcNumber FMC number + * @property { string } exportLicenseNumber Export license number + */ +export const UpdateShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string().nullable(), forwarderReference: z.string().nullable(), transactionReferenceNumber: z.string().nullable(), blReferenceNumber: z.string().nullable(), uniqueConsignmentReference: z.string().nullable(), purchaseOrderNumber: z.string().nullable(), contractReferenceNumber: z.string().nullable(), rucNumber: z.string().nullable(), consigneeOrderNumber: z.string().nullable(), invoiceReferenceNumber: z.string().nullable(), letterOfCreditReference: z.string().nullable(), customsHouseBrokerReference: z.string().nullable(), fmcNumber: z.string().nullable(), exportLicenseNumber: z.string().nullable() }).partial(); +export type UpdateShippingInstructionsReferencesDto = z.infer; + +/** + * UpdateShippingInstructionsCustomsComplianceDtoSchema + * @type { object } + * @property { string } shipperTaxId Shipper tax ID + * @property { string } shipperEORI Shipper EORI + * @property { string } consigneeTaxId Consignee tax ID + * @property { string } consigneeEORI Consignee EORI + * @property { string } notifyPartyTaxId Notify party tax ID + * @property { string } notifyPartyEORI Notify party EORI + */ +export const UpdateShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string().nullable(), shipperEORI: z.string().nullable(), consigneeTaxId: z.string().nullable(), consigneeEORI: z.string().nullable(), notifyPartyTaxId: z.string().nullable(), notifyPartyEORI: z.string().nullable() }).partial(); +export type UpdateShippingInstructionsCustomsComplianceDto = z.infer; + +/** + * UpdateShippingInstructionsIcs2DtoSchema + * @type { object } + * @property { boolean } goodsDeliveredInEu Goods delivered in EU + * @property { string } ensDeclaration ENS declaration + * @property { string } issuedHouseBills Issued house bills + */ +export const UpdateShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean().nullable(), ensDeclaration: EnsDeclarationEnumSchema.nullable(), issuedHouseBills: IssuedHouseBillsEnumSchema.nullable() }).partial(); +export type UpdateShippingInstructionsIcs2Dto = z.infer; + +/** + * UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema + * @type { object } + * @property { string } PCINNumber PCIN number + * @property { string } CSNNumber CSN number + * @property { string } MCINNumber MCIN number + */ +export const UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string().nullable(), CSNNumber: z.string().nullable(), MCINNumber: z.string().nullable() }).partial(); +export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer; + +/** + * UpdateFreightChargesDtoSchema + * @type { object } + * @property { string } freightPayer + * @property { string } freightTerm + */ +export const UpdateFreightChargesDtoSchema = z.object({ freightPayer: z.string().nullable(), freightTerm: CommonModels.ChargePaymentEnumSchema.nullable() }).partial(); +export type UpdateFreightChargesDto = z.infer; + +/** + * UpdateShippingInstructionsShippersDeclaredValueDtoSchema + * @type { object } + * @property { string } currency Currency + * @property { number } shipperDeclaredValue Shipper declared value + */ +export const UpdateShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string().nullable(), shipperDeclaredValue: z.number().nullable() }).partial(); +export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer; + +/** + * UpdateShippingInstructionsNotificationEmailsDtoSchema + * @type { object } + * @property { string } siRequestorEmails SI requestor emails + */ +export const UpdateShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string().nullable() }).partial(); +export type UpdateShippingInstructionsNotificationEmailsDto = z.infer; + +/** + * UpdateShippingInstructionsRequestDtoSchema + * @type { object } + * @property { string } date Date + * @property { UpdateShippingInstructionsHeaderDto } header Header + * @property { UpdateShippingInstructionsGeneralDetailsDto } generalDetails General details + * @property { UpdateShippingInstructionsReferencesDto } references References + * @property { UpdateShippingInstructionsTransportDto } transport Transport + * @property { UpdateShippingInstructionsCustomsComplianceDto } customsCompliance Customs compliance + * @property { UpdateShippingInstructionsIcs2Dto } ics2 ICS2 + * @property { UpdateShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers Cargo identification numbers + * @property { UpdateShippingInstructionsCargoDto[] } cargo Cargo + * @property { UpdateFreightChargesDto } freightCharges + * @property { UpdateShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue Shipper's declared value + * @property { UpdateShippingInstructionsNotificationEmailsDto } notificationEmails Notification emails + */ +export const UpdateShippingInstructionsRequestDtoSchema = z.object({ date: z.iso.datetime({ offset: true }).nullable(), header: UpdateShippingInstructionsHeaderDtoSchema.nullable(), generalDetails: UpdateShippingInstructionsGeneralDetailsDtoSchema.nullable(), references: UpdateShippingInstructionsReferencesDtoSchema.nullable(), transport: UpdateShippingInstructionsTransportDtoSchema.nullable(), customsCompliance: UpdateShippingInstructionsCustomsComplianceDtoSchema.nullable(), ics2: UpdateShippingInstructionsIcs2DtoSchema.nullable(), cargoIdentificationNumbers: UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema.nullable(), cargo: z.array(UpdateShippingInstructionsCargoDtoSchema).nullable(), freightCharges: UpdateFreightChargesDtoSchema.nullable(), shippersDeclaredValue: UpdateShippingInstructionsShippersDeclaredValueDtoSchema.nullable(), notificationEmails: UpdateShippingInstructionsNotificationEmailsDtoSchema.nullable() }).partial(); +export type UpdateShippingInstructionsRequestDto = z.infer; + } diff --git a/test/generated/base/shippingInstructions/shippingInstructions.queries.ts b/test/generated/base/shippingInstructions/shippingInstructions.queries.ts index f8e3607..4514025 100644 --- a/test/generated/base/shippingInstructions/shippingInstructions.queries.ts +++ b/test/generated/base/shippingInstructions/shippingInstructions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,263 +9,203 @@ import { CommonModels } from "@/data/common/common.models"; import { ShippingInstructionsApi } from "./shippingInstructions.api"; export namespace ShippingInstructionsQueries { - export const moduleName = QueryModule.ShippingInstructions; +export const moduleName = QueryModule.ShippingInstructions; - export const keys = { +export const keys = { all: [moduleName] as const, - get: (officeId: string, positionId: string, id: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/shipping-instructions/:id", - officeId, - positionId, - id, - ] as const, - preview: (officeId: string, positionId: string, id: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/shipping-instructions/:id/preview", - officeId, - positionId, - id, - ] as const, - }; + get: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id", officeId, positionId, id] as const, + preview: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id/preview", officeId, positionId, id] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create shipping instructions + * @permission Requires `canUseCreate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId }) => { + checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId } )); + return ShippingInstructionsApi.create(officeId, positionId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGet` + * @summary Get shipping instructions data + * @permission Requires `canUseGet` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.get(officeId, positionId, id), + queryFn: () => { + checkAcl(ShippingInstructionsAcl.canUseGet({ officeId } )); + return ShippingInstructionsApi.get(officeId, positionId, id) }, + ...options, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update shipping instructions + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { ShippingInstructionsModels.UpdateShippingInstructionsRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Shipping instructions updated successfully + * @statusCodes [200, 401, 404] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id, data }) => { + checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId } )); + return ShippingInstructionsApi.update(officeId, positionId, id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, id } = variables; + const updateKeys = [keys.get(officeId, positionId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteOfficesPositionsShippingInstructionsById` + * @summary Delete shipping instructions + * @permission Requires `canUseDeleteOfficesPositionsShippingInstructionsById` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Shipping instructions deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteOfficesPositionsShippingInstructionsById = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id }) => { + checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId } )); + return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreview` - recommended when file should be cached + * @summary Preview shipping instructions document + * @permission Requires `canUsePreview` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreview = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.preview(officeId, positionId, id), + queryFn: () => { + checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); + return ShippingInstructionsApi.preview(officeId, positionId, id) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewMutation` - recommended when file should not be cached + * @summary Preview shipping instructions document + * @permission Requires `canUsePreview` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id }) => { + checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); + return ShippingInstructionsApi.preview(officeId, positionId, id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, id } = variables; + const updateKeys = [keys.preview(officeId, positionId, id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerate` + * @summary Generate shipping instructions document + * @permission Requires `canUseGenerate` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.id Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, id, data }) => { + checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId } )); + return ShippingInstructionsApi.generate(officeId, positionId, id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create shipping instructions - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId })); - return ShippingInstructionsApi.create(officeId, positionId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGet` - * @summary Get shipping instructions data - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, positionId, id }: { officeId: string; positionId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId, id), - queryFn: () => { - checkAcl(ShippingInstructionsAcl.canUseGet({ officeId })); - return ShippingInstructionsApi.get(officeId, positionId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update shipping instructions - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { ShippingInstructionsModels.UpdateShippingInstructionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Shipping instructions updated successfully - * @statusCodes [200, 401, 404] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ShippingInstructionsApi.update, - { - officeId: string; - positionId: string; - id: string; - data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id, data }) => { - checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId })); - return ShippingInstructionsApi.update(officeId, positionId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, id } = variables; - const updateKeys = [keys.get(officeId, positionId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteOfficesPositionsShippingInstructionsById` - * @summary Delete shipping instructions - * @permission Requires `canUseDeleteOfficesPositionsShippingInstructionsById` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Shipping instructions deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteOfficesPositionsShippingInstructionsById = ( - options?: AppMutationOptions< - typeof ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById, - { officeId: string; positionId: string; id: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id }) => { - checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId })); - return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreview` - recommended when file should be cached - * @summary Preview shipping instructions document - * @permission Requires `canUsePreview` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreview = ( - { officeId, positionId, id }: { officeId: string; positionId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.preview(officeId, positionId, id), - queryFn: () => { - checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId })); - return ShippingInstructionsApi.preview(officeId, positionId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewMutation` - recommended when file should not be cached - * @summary Preview shipping instructions document - * @permission Requires `canUsePreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewMutation = ( - options?: AppMutationOptions< - typeof ShippingInstructionsApi.preview, - { officeId: string; positionId: string; id: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id }) => { - checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId })); - return ShippingInstructionsApi.preview(officeId, positionId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, id } = variables; - const updateKeys = [keys.preview(officeId, positionId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerate` - * @summary Generate shipping instructions document - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerate = ( - options?: AppMutationOptions< - typeof ShippingInstructionsApi.generate, - { officeId: string; positionId: string; id: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id, data }) => { - checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId })); - return ShippingInstructionsApi.generate(officeId, positionId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/terminals/terminals.acl.ts b/test/generated/base/terminals/terminals.acl.ts index b7aa7d6..d29c8a0 100644 --- a/test/generated/base/terminals/terminals.acl.ts +++ b/test/generated/base/terminals/terminals.acl.ts @@ -1,45 +1,74 @@ import { AbilityTuple } from "@casl/ability"; export namespace TerminalsAcl { - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Terminal"] as AbilityTuple<"Create", "Terminal">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; - - /** - * Use for `useGetById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ - export const canUseGetById = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Terminal"] as AbilityTuple<"Update", "Terminal">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "Terminal"] as AbilityTuple<"Archive", "Terminal">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Unarchive", "Terminal"] as AbilityTuple<"Unarchive", "Terminal">; +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Terminal" +] as AbilityTuple<"Create", "Terminal">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Terminal" +] as AbilityTuple<"Read", "Terminal">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Terminal" +] as AbilityTuple<"Read", "Terminal">; + +/** + * Use for `useGetById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query + */ +export const canUseGetById = ( +) => [ + "Read", + "Terminal" +] as AbilityTuple<"Read", "Terminal">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Terminal" +] as AbilityTuple<"Update", "Terminal">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Terminal" +] as AbilityTuple<"Archive", "Terminal">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Unarchive", + "Terminal" +] as AbilityTuple<"Unarchive", "Terminal">; + } diff --git a/test/generated/base/terminals/terminals.api.ts b/test/generated/base/terminals/terminals.api.ts index ff8bf00..4e021f0 100644 --- a/test/generated/base/terminals/terminals.api.ts +++ b/test/generated/base/terminals/terminals.api.ts @@ -1,113 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { TerminalsModels } from "./terminals.models"; export namespace TerminalsApi { - export const create = (data: TerminalsModels.CreateTerminalRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: TerminalsModels.CreateTerminalRequestDTO, ) => { return AppRestClient.post( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals`, - ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), - config, - ); - }; - - export const paginate = ( - limit: number, - order?: string, - filter?: TerminalsModels.TerminalPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, `/terminals`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: TerminalsModels.TerminalLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals`, + ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), + + ) +}; +export const paginate = (limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, - `/terminals/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const getById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: TerminalsModels.TerminalResponseDTOSchema }, `/terminals/${id}`, config); - }; - - export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, + `/terminals`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, + `/terminals/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const getById = (id: string, ) => { + return AppRestClient.get( + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals/${id}`, + + ) +}; +export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, ) => { return AppRestClient.patch( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals/${id}`, - ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/terminals/${id}/archive`, undefined, config); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/terminals/${id}/unarchive`, undefined, config); - }; + { resSchema: TerminalsModels.TerminalResponseDTOSchema }, + `/terminals/${id}`, + ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/terminals/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/terminals/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/terminals/terminals.configs.ts b/test/generated/base/terminals/terminals.configs.ts index ee3eb18..36d2f2c 100644 --- a/test/generated/base/terminals/terminals.configs.ts +++ b/test/generated/base/terminals/terminals.configs.ts @@ -6,140 +6,141 @@ import { TerminalsQueries } from "./terminals.queries"; import { TerminalsAcl } from "./terminals.acl"; export namespace TerminalsConfigs { - export const terminalsConfig = { +export const terminalsConfig = { meta: { - title: "Terminals", + title: "Terminals", }, readAll: { - acl: TerminalsAcl.canUsePaginate, - schema: TerminalsModels.TerminalResponseDTOSchema, - paginated: TerminalsQueries.usePaginate, - infinite: TerminalsQueries.usePaginateInfinite, - filters: { - schema: TerminalsModels.TerminalPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: TerminalsModels.TerminalPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - type: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: TerminalsAcl.canUsePaginate, schema: TerminalsModels.TerminalResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - name: true, - type: true, - airport: true, - port: true, - archived: true, - shortName: true, - address: true, - additionalInformation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: TerminalsModels.TerminalsPaginateOrderParamEnumSchema, + paginated: TerminalsQueries.usePaginate, + infinite: TerminalsQueries.usePaginateInfinite, + filters: { + schema: TerminalsModels.TerminalPaginationFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: TerminalsModels.TerminalPaginationFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + type: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: TerminalsModels.TerminalResponseDTOSchema, + options: { + columns: { + id: true, + matchCode: true, + name: true, + type: true, + airport: true, + port: true, + archived: true, + shortName: true, + address: true, + additionalInformation: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: TerminalsModels.TerminalsPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: TerminalsAcl.canUseGetById, - schema: TerminalsModels.TerminalResponseDTOSchema, - query: TerminalsQueries.useGetById, + acl: TerminalsAcl.canUseGetById, + schema: TerminalsModels.TerminalResponseDTOSchema, + query: TerminalsQueries.useGetById, }, create: { - acl: TerminalsAcl.canUseCreate, - schema: TerminalsModels.CreateTerminalRequestDTOSchema, - mutation: TerminalsQueries.useCreate, - inputDefs: dynamicInputs({ + acl: TerminalsAcl.canUseCreate, schema: TerminalsModels.CreateTerminalRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - type: true, - portId: true, - airportId: true, - street: true, - secondaryStreet: true, - zip: true, - district: true, - cityId: true, - countryId: true, - additionalInformation: true, - }, - }, - }), + mutation: TerminalsQueries.useCreate, + inputDefs: dynamicInputs({ + schema: TerminalsModels.CreateTerminalRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + type: true, + portId: true, + airportId: true, + street: true, + secondaryStreet: true, + zip: true, + district: true, + cityId: true, + countryId: true, + additionalInformation: true, + }, + }, +}) }, update: { - acl: TerminalsAcl.canUseUpdate, - schema: TerminalsModels.UpdateTerminalRequestDTOSchema, - mutation: TerminalsQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: TerminalsAcl.canUseUpdate, schema: TerminalsModels.UpdateTerminalRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - type: true, - portId: true, - airportId: true, - street: true, - secondaryStreet: true, - zip: true, - district: true, - cityId: true, - countryId: true, - additionalInformation: true, - }, - }, - }), + mutation: TerminalsQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: TerminalsModels.UpdateTerminalRequestDTOSchema, + options: { + inputs: { + matchCode: true, + shortName: true, + name: true, + type: true, + portId: true, + airportId: true, + street: true, + secondaryStreet: true, + zip: true, + district: true, + cityId: true, + countryId: true, + additionalInformation: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: TerminalsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: TerminalsQueries.usePaginateLabels, - infinite: TerminalsQueries.usePaginateLabelsInfinite, - filters: { - schema: TerminalsModels.TerminalLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: TerminalsModels.TerminalLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: TerminalsAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema, + paginated: TerminalsQueries.usePaginateLabels, + infinite: TerminalsQueries.usePaginateLabelsInfinite, + filters: { + schema: TerminalsModels.TerminalLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: TerminalsModels.TerminalLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/terminals/terminals.models.ts b/test/generated/base/terminals/terminals.models.ts index 56c6644..2ee003e 100644 --- a/test/generated/base/terminals/terminals.models.ts +++ b/test/generated/base/terminals/terminals.models.ts @@ -2,293 +2,195 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace TerminalsModels { - /** - * TerminalTypeSchema - * @type { enum } - */ - export const TerminalTypeSchema = z.enum(["port", "airport"]); - export type TerminalType = z.infer; - export const TerminalType = TerminalTypeSchema.enum; +/** + * TerminalTypeSchema + * @type { enum } + */ +export const TerminalTypeSchema = z.enum(["port", "airport"]); +export type TerminalType = z.infer; +export const TerminalType = TerminalTypeSchema.enum; + +/** + * CreateTerminalRequestDTOSchema + * @type { object } + * @property { string } matchCode Unique identifier code for the terminal + * @property { string } shortName Optional short name for the terminal + * @property { string } name Full name of the terminal + * @property { TerminalType } type Type of the terminal + * @property { string } portId ID of associated port, required if type is port + * @property { string } airportId ID of associated airport, required if type is airport + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP / Postal code + * @property { string } district District + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } additionalInformation Additional information + */ +export const CreateTerminalRequestDTOSchema = z.object({ matchCode: z.string(), shortName: z.string().nullish(), name: z.string(), type: TerminalTypeSchema, portId: z.string().nullish(), airportId: z.string().nullish(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), district: z.string().nullish(), cityId: z.string(), countryId: z.string(), additionalInformation: z.string().nullish() }); +export type CreateTerminalRequestDTO = z.infer; + +/** + * TerminalCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const TerminalCityDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type TerminalCityDto = z.infer; + +/** + * TerminalCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const TerminalCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); +export type TerminalCountryDto = z.infer; + +/** + * TerminalAddressDTOSchema + * @type { object } + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP/Postal code + * @property { TerminalCityDto } city + * @property { string } district District name + * @property { TerminalCountryDto } country + */ +export const TerminalAddressDTOSchema = z.object({ street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), city: TerminalCityDtoSchema.nullish(), district: z.string().nullish(), country: TerminalCountryDtoSchema.nullish() }); +export type TerminalAddressDTO = z.infer; + +/** + * AirportReferenceDTOSchema + * @type { object } + * @property { string } id Unique identifier of the airport + * @property { string } name Name of the airport + */ +export const AirportReferenceDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type AirportReferenceDTO = z.infer; + +/** + * PortReferenceDTOSchema + * @type { object } + * @property { string } id Unique identifier of the port + * @property { string } name Name of the port + */ +export const PortReferenceDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type PortReferenceDTO = z.infer; + +/** + * TerminalEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type TerminalEmployeeDTO = z.infer; + +/** + * TerminalResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the terminal + * @property { string } matchCode Match code for the terminal + * @property { string } name Name of the terminal + * @property { TerminalType } type Type of the terminal + * @property { AirportReferenceDTO } airport Associated airport information if terminal type is airport + * @property { PortReferenceDTO } port Associated port information if terminal type is port + * @property { boolean } archived Archived status of the terminal + * @property { string } shortName Short name of the terminal + * @property { TerminalAddressDTO } address Address of the terminal + * @property { string } additionalInformation Additional information + * @property { string } createdById + * @property { TerminalEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { TerminalEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const TerminalResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string(), type: TerminalTypeSchema.nullish(), airport: AirportReferenceDTOSchema.nullish(), port: PortReferenceDTOSchema.nullish(), archived: z.boolean(), shortName: z.string().nullish(), address: TerminalAddressDTOSchema.nullish(), additionalInformation: z.string().nullish(), createdById: z.string().nullish(), createdBy: TerminalEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: TerminalEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type TerminalResponseDTO = z.infer; + +/** + * UpdateTerminalRequestDTOSchema + * @type { object } + * @property { string } matchCode Updated match code for the terminal + * @property { string } shortName Updated short name + * @property { string } name Updated name + * @property { TerminalType } type Type of the terminal + * @property { string } portId ID of associated port, required if type is port + * @property { string } airportId ID of associated airport, required if type is airport + * @property { string } street Street address + * @property { string } secondaryStreet Secondary street + * @property { string } zip ZIP / Postal code + * @property { string } district District + * @property { string } cityId City id + * @property { string } countryId Country id + * @property { string } additionalInformation Additional information + */ +export const UpdateTerminalRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), name: z.string().nullable(), type: TerminalTypeSchema.nullable(), portId: z.string().nullable(), airportId: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), district: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), additionalInformation: z.string().nullable() }).partial(); +export type UpdateTerminalRequestDTO = z.infer; + +/** + * TerminalPaginationFilterDtoSchema + * @type { object } + * @property { string } search Search term to filter terminals by matchCode, shortName, or name + * @property { boolean } archived + * @property { string } type + */ +export const TerminalPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable(), type: TerminalTypeSchema.nullable() }).partial(); +export type TerminalPaginationFilterDto = z.infer; + +/** + * TerminalLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const TerminalLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type TerminalLabelFilterDto = z.infer; + +/** + * TerminalsPaginateOrderParamEnumSchema + * @type { enum } + */ +export const TerminalsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type TerminalsPaginateOrderParamEnum = z.infer; +export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSchema.enum; + +/** + * TerminalsPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { TerminalResponseDTO[] } items + */ +export const TerminalsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(TerminalResponseDTOSchema).nullable() }).partial().shape }); +export type TerminalsPaginateResponse = z.infer; + +/** + * TerminalsPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const TerminalsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type TerminalsPaginateLabelsOrderParamEnum = z.infer; +export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrderParamEnumSchema.enum; + +/** + * TerminalsPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const TerminalsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type TerminalsPaginateLabelsResponse = z.infer; - /** - * CreateTerminalRequestDTOSchema - * @type { object } - * @property { string } matchCode Unique identifier code for the terminal - * @property { string } shortName Optional short name for the terminal - * @property { string } name Full name of the terminal - * @property { TerminalType } type Type of the terminal - * @property { string } portId ID of associated port, required if type is port - * @property { string } airportId ID of associated airport, required if type is airport - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP / Postal code - * @property { string } district District - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } additionalInformation Additional information - */ - export const CreateTerminalRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Unique identifier code for the terminal"), - shortName: z.string().describe("Optional short name for the terminal").nullish(), - name: z.string().describe("Full name of the terminal"), - type: TerminalTypeSchema.describe("Type of the terminal"), - portId: z.string().describe("ID of associated port, required if type is port").nullish(), - airportId: z.string().describe("ID of associated airport, required if type is airport").nullish(), - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street").nullish(), - zip: z.string().describe("ZIP / Postal code"), - district: z.string().describe("District").nullish(), - cityId: z.string().describe("City id"), - countryId: z.string().describe("Country id"), - additionalInformation: z.string().describe("Additional information").nullish(), - }) - .readonly(); - export type CreateTerminalRequestDTO = z.infer; - - /** - * TerminalCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const TerminalCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type TerminalCityDto = z.infer; - - /** - * TerminalCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ - export const TerminalCountryDtoSchema = z - .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) - .readonly(); - export type TerminalCountryDto = z.infer; - - /** - * TerminalAddressDTOSchema - * @type { object } - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP/Postal code - * @property { TerminalCityDto } city - * @property { string } district District name - * @property { TerminalCountryDto } country - */ - export const TerminalAddressDTOSchema = z - .object({ - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street").nullish(), - zip: z.string().describe("ZIP/Postal code"), - city: TerminalCityDtoSchema.nullish(), - district: z.string().describe("District name").nullish(), - country: TerminalCountryDtoSchema.nullish(), - }) - .readonly(); - export type TerminalAddressDTO = z.infer; - - /** - * AirportReferenceDTOSchema - * @type { object } - * @property { string } id Unique identifier of the airport - * @property { string } name Name of the airport - */ - export const AirportReferenceDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the airport"), - name: z.string().describe("Name of the airport"), - }) - .readonly(); - export type AirportReferenceDTO = z.infer; - - /** - * PortReferenceDTOSchema - * @type { object } - * @property { string } id Unique identifier of the port - * @property { string } name Name of the port - */ - export const PortReferenceDTOSchema = z - .object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port") }) - .readonly(); - export type PortReferenceDTO = z.infer; - - /** - * TerminalEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type TerminalEmployeeDTO = z.infer; - - /** - * TerminalResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the terminal - * @property { string } matchCode Match code for the terminal - * @property { string } name Name of the terminal - * @property { TerminalType } type Type of the terminal - * @property { AirportReferenceDTO } airport Associated airport information if terminal type is airport - * @property { PortReferenceDTO } port Associated port information if terminal type is port - * @property { boolean } archived Archived status of the terminal - * @property { string } shortName Short name of the terminal - * @property { TerminalAddressDTO } address Address of the terminal - * @property { string } additionalInformation Additional information - * @property { string } createdById - * @property { TerminalEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { TerminalEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const TerminalResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the terminal"), - matchCode: z.string().describe("Match code for the terminal"), - name: z.string().describe("Name of the terminal"), - type: TerminalTypeSchema.describe("Type of the terminal").nullish(), - airport: AirportReferenceDTOSchema.describe( - "Associated airport information if terminal type is airport", - ).nullish(), - port: PortReferenceDTOSchema.describe("Associated port information if terminal type is port").nullish(), - archived: z.boolean().describe("Archived status of the terminal"), - shortName: z.string().describe("Short name of the terminal").nullish(), - address: TerminalAddressDTOSchema.describe("Address of the terminal").nullish(), - additionalInformation: z.string().describe("Additional information").nullish(), - createdById: z.string().nullish(), - createdBy: TerminalEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: TerminalEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type TerminalResponseDTO = z.infer; - - /** - * UpdateTerminalRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code for the terminal - * @property { string } shortName Updated short name - * @property { string } name Updated name - * @property { TerminalType } type Type of the terminal - * @property { string } portId ID of associated port, required if type is port - * @property { string } airportId ID of associated airport, required if type is airport - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP / Postal code - * @property { string } district District - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } additionalInformation Additional information - */ - export const UpdateTerminalRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Updated match code for the terminal"), - shortName: z.string().describe("Updated short name"), - name: z.string().describe("Updated name"), - type: TerminalTypeSchema.describe("Type of the terminal"), - portId: z.string().describe("ID of associated port, required if type is port"), - airportId: z.string().describe("ID of associated airport, required if type is airport"), - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street"), - zip: z.string().describe("ZIP / Postal code"), - district: z.string().describe("District"), - cityId: z.string().describe("City id"), - countryId: z.string().describe("Country id"), - additionalInformation: z.string().describe("Additional information"), - }) - .readonly(); - export type UpdateTerminalRequestDTO = z.infer; - - /** - * TerminalPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter terminals by matchCode, shortName, or name - * @property { boolean } archived - * @property { string } type - */ - export const TerminalPaginationFilterDtoSchema = z - .object({ - search: z.string().describe("Search term to filter terminals by matchCode, shortName, or name"), - archived: z.boolean(), - type: TerminalTypeSchema, - }) - .readonly(); - export type TerminalPaginationFilterDto = z.infer; - - /** - * TerminalLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const TerminalLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type TerminalLabelFilterDto = z.infer; - - /** - * TerminalsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const TerminalsPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type TerminalsPaginateOrderParamEnum = z.infer; - export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSchema.enum; - - /** - * TerminalsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { TerminalResponseDTO[] } items - */ - export const TerminalsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(TerminalResponseDTOSchema).readonly() }).readonly().shape, - }); - export type TerminalsPaginateResponse = z.infer; - - /** - * TerminalsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const TerminalsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type TerminalsPaginateLabelsOrderParamEnum = z.infer; - export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrderParamEnumSchema.enum; - - /** - * TerminalsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const TerminalsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type TerminalsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/terminals/terminals.queries.ts b/test/generated/base/terminals/terminals.queries.ts index 4de8274..b752c33 100644 --- a/test/generated/base/terminals/terminals.queries.ts +++ b/test/generated/base/terminals/terminals.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,350 +8,253 @@ import { TerminalsModels } from "./terminals.models"; import { TerminalsApi } from "./terminals.api"; export namespace TerminalsQueries { - export const moduleName = QueryModule.Terminals; +export const moduleName = QueryModule.Terminals; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: TerminalsModels.TerminalPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/terminals", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: TerminalsModels.TerminalPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/terminals", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: TerminalsModels.TerminalLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/terminals/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: TerminalsModels.TerminalLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/terminals/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string) => [...keys.all, "/terminals", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string) => [...keys.all, "/terminals/paginate/labels", "infinite", limit, order, filter, cursor] as const, getById: (id: string) => [...keys.all, "/terminals/:id", id] as const, - }; +}; - /** - * Mutation `useCreate` - * @summary Create a new terminal - * @permission Requires `canUseCreate` ability - * @param { TerminalsModels.CreateTerminalRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create a new terminal + * @permission Requires `canUseCreate` ability + * @param { TerminalsModels.CreateTerminalRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(TerminalsAcl.canUseCreate()); - return TerminalsApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Paginate Terminals - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: TerminalsModels.TerminalPaginationFilterDto; - page?: number; - cursor?: string; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(TerminalsAcl.canUseCreate()); + return TerminalsApi.create(data) }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Terminals - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: TerminalsModels.TerminalPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginate` + * @summary Paginate Terminals + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(TerminalsAcl.canUsePaginate()); + return TerminalsApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateInfinite + * @summary Paginate Terminals + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Query `usePaginateLabels` - * @summary Paginate terminals with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: TerminalsModels.TerminalLabelFilterDto; - page?: number; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(TerminalsAcl.canUsePaginate()); + return TerminalsApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate terminals with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(TerminalsAcl.canUsePaginateLabels()); + return TerminalsApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate terminals with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: TerminalsModels.TerminalLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate terminals with only their labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(TerminalsAcl.canUsePaginateLabels()); + return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useGetById` - * @summary Get terminal details by ID - * @permission Requires `canUseGetById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetById` + * @summary Get terminal details by ID + * @permission Requires `canUseGetById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getById(id), + queryFn: () => { + checkAcl(TerminalsAcl.canUseGetById()); + return TerminalsApi.getById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getById(id), - queryFn: () => { - checkAcl(TerminalsAcl.canUseGetById()); - return TerminalsApi.getById(id, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update terminal details + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { TerminalsModels.UpdateTerminalRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update terminal details - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { TerminalsModels.UpdateTerminalRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof TerminalsApi.update, - { id: string; data: TerminalsModels.UpdateTerminalRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(TerminalsAcl.canUseUpdate()); + return TerminalsApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.getById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(TerminalsAcl.canUseUpdate()); - return TerminalsApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.getById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive a terminal + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive a terminal - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(TerminalsAcl.canUseArchive()); + return TerminalsApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(TerminalsAcl.canUseArchive()); - return TerminalsApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive a terminal + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive a terminal - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(TerminalsAcl.canUseUnarchive()); + return TerminalsApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(TerminalsAcl.canUseUnarchive()); - return TerminalsApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/userActivity/userActivity.api.ts b/test/generated/base/userActivity/userActivity.api.ts index 94229d9..e1a978e 100644 --- a/test/generated/base/userActivity/userActivity.api.ts +++ b/test/generated/base/userActivity/userActivity.api.ts @@ -1,30 +1,18 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { UserActivityModels } from "./userActivity.models"; export namespace UserActivityApi { - export const get = ( - officeId: string, - entityType: string, - entityId: string, - activeThresholdMinutes?: number, - config?: AxiosRequestConfig, - ) => { +export const get = (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number, ) => { return AppRestClient.get( - { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, - `/offices/${officeId}/${entityType}/${entityId}/activity`, - { - ...config, - params: { - activeThresholdMinutes: ZodExtended.parse( - z.number().gte(1).describe("Active threshold in minutes").nullish(), - activeThresholdMinutes, - { type: "query", name: "activeThresholdMinutes" }, - ), - }, - }, - ); - }; + { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, + `/offices/${officeId}/${entityType}/${entityId}/activity`, + { + params: { + activeThresholdMinutes: ZodExtended.parse(z.number().gte(1).nullish(), activeThresholdMinutes, { type: "query", name: "activeThresholdMinutes" }), + }, + } + ) +}; } diff --git a/test/generated/base/userActivity/userActivity.models.ts b/test/generated/base/userActivity/userActivity.models.ts index 149f572..dfe9552 100644 --- a/test/generated/base/userActivity/userActivity.models.ts +++ b/test/generated/base/userActivity/userActivity.models.ts @@ -1,91 +1,64 @@ import { z } from "zod"; export namespace UserActivityModels { - /** - * ActivityTypeEnumSchema - * @type { enum } - */ - export const ActivityTypeEnumSchema = z.enum(["View", "Modify"]); - export type ActivityTypeEnum = z.infer; - export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; +/** + * ActivityTypeEnumSchema + * @type { enum } + */ +export const ActivityTypeEnumSchema = z.enum(["View", "Modify"]); +export type ActivityTypeEnum = z.infer; +export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; - /** - * UserSectionActivityDtoSchema - * @type { object } - * @property { string } section Section name - * @property { ActivityTypeEnum } activityType Type of activity - * @property { string } lastSeen Last seen timestamp - */ - export const UserSectionActivityDtoSchema = z - .object({ - section: z.string().describe("Section name"), - activityType: ActivityTypeEnumSchema.describe("Type of activity"), - lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), - }) - .readonly(); - export type UserSectionActivityDto = z.infer; +/** + * UserSectionActivityDtoSchema + * @type { object } + * @property { string } section Section name + * @property { ActivityTypeEnum } activityType Type of activity + * @property { string } lastSeen Last seen timestamp + */ +export const UserSectionActivityDtoSchema = z.object({ section: z.string(), activityType: ActivityTypeEnumSchema, lastSeen: z.iso.datetime({ offset: true }) }); +export type UserSectionActivityDto = z.infer; - /** - * ActiveUserDtoSchema - * @type { object } - * @property { string } userId User ID - * @property { string } firstName User first name - * @property { string } lastName User last name - * @property { string } userAvatar User avatar URL - * @property { UserSectionActivityDto } section User section activity - * @property { string } lastSeen Last seen timestamp - * @property { boolean } isCurrentlyActive Is currently active - */ - export const ActiveUserDtoSchema = z - .object({ - userId: z.string().describe("User ID"), - firstName: z.string().describe("User first name"), - lastName: z.string().describe("User last name"), - userAvatar: z.string().describe("User avatar URL").nullish(), - section: UserSectionActivityDtoSchema.describe("User section activity"), - lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), - isCurrentlyActive: z.boolean().describe("Is currently active"), - }) - .readonly(); - export type ActiveUserDto = z.infer; +/** + * ActiveUserDtoSchema + * @type { object } + * @property { string } userId User ID + * @property { string } firstName User first name + * @property { string } lastName User last name + * @property { string } userAvatar User avatar URL + * @property { UserSectionActivityDto } section User section activity + * @property { string } lastSeen Last seen timestamp + * @property { boolean } isCurrentlyActive Is currently active + */ +export const ActiveUserDtoSchema = z.object({ userId: z.string(), firstName: z.string(), lastName: z.string(), userAvatar: z.string().nullish(), section: UserSectionActivityDtoSchema, lastSeen: z.iso.datetime({ offset: true }), isCurrentlyActive: z.boolean() }); +export type ActiveUserDto = z.infer; - /** - * ActivityEntityTypeEnumSchema - * @type { enum } - */ - export const ActivityEntityTypeEnumSchema = z.enum(["Position", "Invoice", "BusinessPartner", "Quote"]); - export type ActivityEntityTypeEnum = z.infer; - export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; +/** + * ActivityEntityTypeEnumSchema + * @type { enum } + */ +export const ActivityEntityTypeEnumSchema = z.enum(["Position", "Invoice", "BusinessPartner", "Quote"]); +export type ActivityEntityTypeEnum = z.infer; +export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; - /** - * ActivityMetadataDtoSchema - * @type { object } - * @property { number } totalActiveUsers Total number of active users - * @property { string } entityId Entity ID - * @property { ActivityEntityTypeEnum } entityType Entity type - * @property { number } activeThresholdMinutes Active threshold in minutes - */ - export const ActivityMetadataDtoSchema = z - .object({ - totalActiveUsers: z.number().describe("Total number of active users"), - entityId: z.string().describe("Entity ID"), - entityType: ActivityEntityTypeEnumSchema.describe("Entity type"), - activeThresholdMinutes: z.number().describe("Active threshold in minutes"), - }) - .readonly(); - export type ActivityMetadataDto = z.infer; +/** + * ActivityMetadataDtoSchema + * @type { object } + * @property { number } totalActiveUsers Total number of active users + * @property { string } entityId Entity ID + * @property { ActivityEntityTypeEnum } entityType Entity type + * @property { number } activeThresholdMinutes Active threshold in minutes + */ +export const ActivityMetadataDtoSchema = z.object({ totalActiveUsers: z.number(), entityId: z.string(), entityType: ActivityEntityTypeEnumSchema, activeThresholdMinutes: z.number() }); +export type ActivityMetadataDto = z.infer; + +/** + * UserActivityResponseDtoSchema + * @type { object } + * @property { ActiveUserDto[] } activeUsers List of active users + * @property { ActivityMetadataDto } metadata Activity metadata + */ +export const UserActivityResponseDtoSchema = z.object({ activeUsers: z.array(ActiveUserDtoSchema), metadata: ActivityMetadataDtoSchema }); +export type UserActivityResponseDto = z.infer; - /** - * UserActivityResponseDtoSchema - * @type { object } - * @property { ActiveUserDto[] } activeUsers List of active users - * @property { ActivityMetadataDto } metadata Activity metadata - */ - export const UserActivityResponseDtoSchema = z - .object({ - activeUsers: z.array(ActiveUserDtoSchema).readonly().describe("List of active users"), - metadata: ActivityMetadataDtoSchema.describe("Activity metadata"), - }) - .readonly(); - export type UserActivityResponseDto = z.infer; } diff --git a/test/generated/base/userActivity/userActivity.queries.ts b/test/generated/base/userActivity/userActivity.queries.ts index 89790ac..b9e1bad 100644 --- a/test/generated/base/userActivity/userActivity.queries.ts +++ b/test/generated/base/userActivity/userActivity.queries.ts @@ -1,50 +1,35 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions } from "@povio/openapi-codegen-cli"; import { UserActivityApi } from "./userActivity.api"; export namespace UserActivityQueries { - export const moduleName = QueryModule.UserActivity; +export const moduleName = QueryModule.UserActivity; - export const keys = { +export const keys = { all: [moduleName] as const, - get: (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number) => - [ - ...keys.all, - "/offices/:officeId/:entityType/:entityId/activity", - officeId, - entityType, - entityId, - activeThresholdMinutes, - ] as const, - }; + get: (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number) => [...keys.all, "/offices/:officeId/:entityType/:entityId/activity", officeId, entityType, entityId, activeThresholdMinutes] as const, +}; + +/** + * Query `useGet` + * @summary Get user activity for an entity + * @param { string } object.officeId Path parameter + * @param { string } object.entityType Path parameter + * @param { string } object.entityId Path parameter + * @param { number } object.activeThresholdMinutes Query parameter. Active threshold in minutes. Minimum: `1` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGet = ({ officeId, entityType, entityId, activeThresholdMinutes }: { officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number }, options?: AppQueryOptions) => { + + return useQuery({ + queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), + queryFn: () => + UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes), + ...options, + }); +}; - /** - * Query `useGet` - * @summary Get user activity for an entity - * @param { string } object.officeId Path parameter - * @param { string } object.entityType Path parameter - * @param { string } object.entityId Path parameter - * @param { number } object.activeThresholdMinutes Query parameter. Active threshold in minutes. Minimum: `1` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { - officeId, - entityType, - entityId, - activeThresholdMinutes, - }: { officeId: string; entityType: string; entityId: string; activeThresholdMinutes?: number }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), - queryFn: () => UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes, config), - ...options, - }); - }; } diff --git a/test/generated/base/vatRules/vatRules.acl.ts b/test/generated/base/vatRules/vatRules.acl.ts index 25b5cb3..827096c 100644 --- a/test/generated/base/vatRules/vatRules.acl.ts +++ b/test/generated/base/vatRules/vatRules.acl.ts @@ -1,45 +1,74 @@ import { AbilityTuple } from "@casl/ability"; export namespace VatRulesAcl { - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; - - /** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "VatRule"] as AbilityTuple<"Create", "VatRule">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "VatRule" +] as AbilityTuple<"Read", "VatRule">; + +/** + * Use for `useList` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( +) => [ + "Read", + "VatRule" +] as AbilityTuple<"Read", "VatRule">; + +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "VatRule" +] as AbilityTuple<"Create", "VatRule">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "VatRule" +] as AbilityTuple<"Read", "VatRule">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "VatRule" +] as AbilityTuple<"Update", "VatRule">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Update", + "VatRule" +] as AbilityTuple<"Update", "VatRule">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Update", + "VatRule" +] as AbilityTuple<"Update", "VatRule">; + } diff --git a/test/generated/base/vatRules/vatRules.api.ts b/test/generated/base/vatRules/vatRules.api.ts index a8e66b1..ce19db0 100644 --- a/test/generated/base/vatRules/vatRules.api.ts +++ b/test/generated/base/vatRules/vatRules.api.ts @@ -1,123 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { VatRulesModels } from "./vatRules.models"; export namespace VatRulesApi { - export const paginateLabels = ( - limit: number, - order?: string, - filter?: VatRulesModels.VatRuleFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const paginateLabels = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, - `/vat-rules/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const list = ( - limit: number, - order?: string, - filter?: VatRulesModels.VatRuleFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: VatRulesModels.VatRulesListResponseSchema }, `/vat-rules`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, + `/vat-rules/labels/paginate`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const list = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: VatRulesModels.VatRulesListResponseSchema }, + `/vat-rules`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, ) => { return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules`, - ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), - config, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: VatRulesModels.VatRuleResponseDTOSchema }, `/vat-rules/${id}`, config); - }; - - export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules`, + ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), + + ) +}; +export const findById = (id: string, ) => { + return AppRestClient.get( + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}`, + + ) +}; +export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, ) => { return AppRestClient.patch( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}`, - ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}`, + ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, ) => { return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}/archive`, - undefined, - config, - ); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}/unarchive`, - undefined, - config, - ); - }; + { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, + `/vat-rules/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/vatRules/vatRules.configs.ts b/test/generated/base/vatRules/vatRules.configs.ts index b822df6..092a685 100644 --- a/test/generated/base/vatRules/vatRules.configs.ts +++ b/test/generated/base/vatRules/vatRules.configs.ts @@ -6,145 +6,146 @@ import { VatRulesQueries } from "./vatRules.queries"; import { VatRulesAcl } from "./vatRules.acl"; export namespace VatRulesConfigs { - export const vatRulesConfig = { +export const vatRulesConfig = { meta: { - title: "Vat Rules", + title: "Vat Rules", }, readAll: { - acl: VatRulesAcl.canUseList, - schema: VatRulesModels.VatRuleResponseDTOSchema, - paginated: VatRulesQueries.useList, - infinite: VatRulesQueries.useListInfinite, - filters: { - schema: VatRulesModels.VatRuleFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: VatRulesModels.VatRuleFilterDtoSchema, - options: { - inputs: { - matchcode: true, - name: true, - type: true, - officeId: true, - archived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: VatRulesAcl.canUseList, schema: VatRulesModels.VatRuleResponseDTOSchema, - options: { - columns: { - id: true, - matchcode: true, - name: true, - vatPercentage: true, - vatNumber: true, - noTax: true, - type: true, - archived: true, - isReverseCharge: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - officeId: true, - office: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - sortable: VatRulesModels.VatRulesListOrderParamEnumSchema, + paginated: VatRulesQueries.useList, + infinite: VatRulesQueries.useListInfinite, + filters: { + schema: VatRulesModels.VatRuleFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: VatRulesModels.VatRuleFilterDtoSchema, + options: { + inputs: { + matchcode: true, + name: true, + type: true, + officeId: true, + archived: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: VatRulesModels.VatRuleResponseDTOSchema, + options: { + columns: { + id: true, + matchcode: true, + name: true, + vatPercentage: true, + vatNumber: true, + noTax: true, + type: true, + archived: true, + isReverseCharge: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + officeId: true, + office: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + sortable: VatRulesModels.VatRulesListOrderParamEnumSchema, + }, +}), }, read: { - acl: VatRulesAcl.canUseFindById, - schema: VatRulesModels.VatRuleResponseDTOSchema, - query: VatRulesQueries.useFindById, + acl: VatRulesAcl.canUseFindById, + schema: VatRulesModels.VatRuleResponseDTOSchema, + query: VatRulesQueries.useFindById, }, create: { - acl: VatRulesAcl.canUseCreate, - schema: VatRulesModels.CreateVatRuleRequestDTOSchema, - mutation: VatRulesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: VatRulesAcl.canUseCreate, schema: VatRulesModels.CreateVatRuleRequestDTOSchema, - options: { - inputs: { - matchcode: true, - name: true, - noTax: true, - vatPercentage: true, - vatNumber: true, - type: true, - officeId: true, - isReverseCharge: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - }, - }), + mutation: VatRulesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: VatRulesModels.CreateVatRuleRequestDTOSchema, + options: { + inputs: { + matchcode: true, + name: true, + noTax: true, + vatPercentage: true, + vatNumber: true, + type: true, + officeId: true, + isReverseCharge: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + }, +}) }, update: { - acl: VatRulesAcl.canUseUpdate, - schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, - mutation: VatRulesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: VatRulesAcl.canUseUpdate, schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, - options: { - inputs: { - matchcode: true, - name: true, - noTax: true, - vatPercentage: true, - vatNumber: true, - type: true, - officeId: true, - isReverseCharge: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - }, - }), + mutation: VatRulesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, + options: { + inputs: { + matchcode: true, + name: true, + noTax: true, + vatPercentage: true, + vatNumber: true, + type: true, + officeId: true, + isReverseCharge: true, + bookkeepingId: true, + bookkeepingTargetAccountNumber: true, + }, + }, +}) }, - }; +}; - export const paginateConfig = { +export const paginateConfig = { meta: { - title: "Paginate", + title: "Paginate", }, readAll: { - acl: VatRulesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: VatRulesQueries.usePaginateLabels, - infinite: VatRulesQueries.usePaginateLabelsInfinite, - filters: { - schema: VatRulesModels.VatRuleFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: VatRulesModels.VatRuleFilterDtoSchema, - options: { - inputs: { - matchcode: true, - name: true, - type: true, - officeId: true, - archived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: VatRulesAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema, + paginated: VatRulesQueries.usePaginateLabels, + infinite: VatRulesQueries.usePaginateLabelsInfinite, + filters: { + schema: VatRulesModels.VatRuleFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: VatRulesModels.VatRuleFilterDtoSchema, + options: { + inputs: { + matchcode: true, + name: true, + type: true, + officeId: true, + archived: true, + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/vatRules/vatRules.models.ts b/test/generated/base/vatRules/vatRules.models.ts index 5ff8a61..f9ef2d5 100644 --- a/test/generated/base/vatRules/vatRules.models.ts +++ b/test/generated/base/vatRules/vatRules.models.ts @@ -2,223 +2,145 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace VatRulesModels { - /** - * VatRuleTypeEnumSchema - * @type { enum } - */ - export const VatRuleTypeEnumSchema = z.enum(["Outgoing", "Incoming"]); - export type VatRuleTypeEnum = z.infer; - export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; +/** + * VatRuleTypeEnumSchema + * @type { enum } + */ +export const VatRuleTypeEnumSchema = z.enum(["Outgoing", "Incoming"]); +export type VatRuleTypeEnum = z.infer; +export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; - /** - * VatRuleFilterDtoSchema - * @type { object } - * @property { string } matchcode Matchcode to filter by - * @property { string } name Name to filter by - * @property { VatRuleTypeEnum } type - * @property { string } officeId Office ID to filter by - * @property { boolean } archived Filter by archived status - * @property { string } search Search to filter by - */ - export const VatRuleFilterDtoSchema = z - .object({ - matchcode: z.string().describe("Matchcode to filter by"), - name: z.string().describe("Name to filter by"), - type: VatRuleTypeEnumSchema, - officeId: z.string().describe("Office ID to filter by"), - archived: z.boolean().describe("Filter by archived status"), - search: z.string().describe("Search to filter by"), - }) - .readonly(); - export type VatRuleFilterDto = z.infer; +/** + * VatRuleFilterDtoSchema + * @type { object } + * @property { string } matchcode Matchcode to filter by + * @property { string } name Name to filter by + * @property { VatRuleTypeEnum } type + * @property { string } officeId Office ID to filter by + * @property { boolean } archived Filter by archived status + * @property { string } search Search to filter by + */ +export const VatRuleFilterDtoSchema = z.object({ matchcode: z.string().nullable(), name: z.string().nullable(), type: VatRuleTypeEnumSchema.nullable(), officeId: z.string().nullable(), archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); +export type VatRuleFilterDto = z.infer; - /** - * VatRuleEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type VatRuleEmployeeDTO = z.infer; +/** + * VatRuleEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type VatRuleEmployeeDTO = z.infer; - /** - * VatRuleOfficeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type VatRuleOfficeDTO = z.infer; +/** + * VatRuleOfficeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type VatRuleOfficeDTO = z.infer; - /** - * VatRuleResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchcode - * @property { string } name - * @property { number } vatPercentage - * @property { number } vatNumber VAT rule reference number - * @property { boolean } noTax - * @property { VatRuleTypeEnum } type - * @property { boolean } archived - * @property { boolean } isReverseCharge - * @property { string } createdById - * @property { VatRuleEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { VatRuleEmployeeDTO } updatedBy - * @property { string } updatedAt - * @property { string } officeId - * @property { VatRuleOfficeDTO } office - * @property { string } bookkeepingId - * @property { string } bookkeepingTargetAccountNumber - */ - export const VatRuleResponseDTOSchema = z - .object({ - id: z.string(), - matchcode: z.string(), - name: z.string(), - vatPercentage: z.number(), - vatNumber: z.number().describe("VAT rule reference number").nullish(), - noTax: z.boolean().nullish(), - type: VatRuleTypeEnumSchema, - archived: z.boolean(), - isReverseCharge: z.boolean(), - createdById: z.string().nullish(), - createdBy: VatRuleEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: VatRuleEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - officeId: z.string(), - office: VatRuleOfficeDTOSchema.nullish(), - bookkeepingId: z.string().nullish(), - bookkeepingTargetAccountNumber: z.string().nullish(), - }) - .readonly(); - export type VatRuleResponseDTO = z.infer; +/** + * VatRuleResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } matchcode + * @property { string } name + * @property { number } vatPercentage + * @property { number } vatNumber VAT rule reference number + * @property { boolean } noTax + * @property { VatRuleTypeEnum } type + * @property { boolean } archived + * @property { boolean } isReverseCharge + * @property { string } createdById + * @property { VatRuleEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { VatRuleEmployeeDTO } updatedBy + * @property { string } updatedAt + * @property { string } officeId + * @property { VatRuleOfficeDTO } office + * @property { string } bookkeepingId + * @property { string } bookkeepingTargetAccountNumber + */ +export const VatRuleResponseDTOSchema = z.object({ id: z.string(), matchcode: z.string(), name: z.string(), vatPercentage: z.number(), vatNumber: z.number().nullish(), noTax: z.boolean().nullish(), type: VatRuleTypeEnumSchema, archived: z.boolean(), isReverseCharge: z.boolean(), createdById: z.string().nullish(), createdBy: VatRuleEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: VatRuleEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), officeId: z.string(), office: VatRuleOfficeDTOSchema.nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }); +export type VatRuleResponseDTO = z.infer; - /** - * CreateVatRuleRequestDTOSchema - * @type { object } - * @property { string } matchcode Unique matchcode for the VAT rule - * @property { string } name Name of the VAT rule - * @property { boolean } noTax - * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` - * @property { number } vatNumber VAT rule reference number - * @property { VatRuleTypeEnum } type Type of VAT rule - * @property { string } officeId Office ID - * @property { boolean } isReverseCharge Is reverse charge VAT rule - * @property { string } bookkeepingId Bookkeeping ID - * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number - */ - export const CreateVatRuleRequestDTOSchema = z - .object({ - matchcode: z.string().describe("Unique matchcode for the VAT rule"), - name: z.string().describe("Name of the VAT rule"), - noTax: z.boolean().nullish(), - vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), - vatNumber: z.number().describe("VAT rule reference number").nullish(), - type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), - officeId: z.string().describe("Office ID"), - isReverseCharge: z.boolean().describe("Is reverse charge VAT rule").nullish(), - bookkeepingId: z.string().describe("Bookkeeping ID").nullish(), - bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullish(), - }) - .readonly(); - export type CreateVatRuleRequestDTO = z.infer; +/** + * CreateVatRuleRequestDTOSchema + * @type { object } + * @property { string } matchcode Unique matchcode for the VAT rule + * @property { string } name Name of the VAT rule + * @property { boolean } noTax + * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` + * @property { number } vatNumber VAT rule reference number + * @property { VatRuleTypeEnum } type Type of VAT rule + * @property { string } officeId Office ID + * @property { boolean } isReverseCharge Is reverse charge VAT rule + * @property { string } bookkeepingId Bookkeeping ID + * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number + */ +export const CreateVatRuleRequestDTOSchema = z.object({ matchcode: z.string(), name: z.string(), noTax: z.boolean().nullish(), vatPercentage: z.number().gte(0).lte(100), vatNumber: z.number().nullish(), type: VatRuleTypeEnumSchema, officeId: z.string(), isReverseCharge: z.boolean().nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }); +export type CreateVatRuleRequestDTO = z.infer; - /** - * UpdateVatRuleRequestDTOSchema - * @type { object } - * @property { string } matchcode Unique matchcode for the VAT rule - * @property { string } name Name of the VAT rule - * @property { boolean } noTax - * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` - * @property { number } vatNumber VAT rule reference number. Minimum: `0` - * @property { VatRuleTypeEnum } type Type of VAT rule - * @property { string } officeId Office ID - * @property { boolean } isReverseCharge Is reverse charge VAT rule - * @property { string } bookkeepingId Bookkeeping ID - * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number - */ - export const UpdateVatRuleRequestDTOSchema = z - .object({ - matchcode: z.string().describe("Unique matchcode for the VAT rule"), - name: z.string().describe("Name of the VAT rule"), - noTax: z.boolean(), - vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), - vatNumber: z.number().gte(0).describe("VAT rule reference number").nullable(), - type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), - officeId: z.string().describe("Office ID"), - isReverseCharge: z.boolean().describe("Is reverse charge VAT rule"), - bookkeepingId: z.string().describe("Bookkeeping ID").nullable(), - bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullable(), - }) - .readonly(); - export type UpdateVatRuleRequestDTO = z.infer; +/** + * UpdateVatRuleRequestDTOSchema + * @type { object } + * @property { string } matchcode Unique matchcode for the VAT rule + * @property { string } name Name of the VAT rule + * @property { boolean } noTax + * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` + * @property { number } vatNumber VAT rule reference number. Minimum: `0` + * @property { VatRuleTypeEnum } type Type of VAT rule + * @property { string } officeId Office ID + * @property { boolean } isReverseCharge Is reverse charge VAT rule + * @property { string } bookkeepingId Bookkeeping ID + * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number + */ +export const UpdateVatRuleRequestDTOSchema = z.object({ matchcode: z.string().nullable(), name: z.string().nullable(), noTax: z.boolean().nullable(), vatPercentage: z.number().gte(0).lte(100).nullable(), vatNumber: z.number().gte(0).nullable(), type: VatRuleTypeEnumSchema.nullable(), officeId: z.string().nullable(), isReverseCharge: z.boolean().nullable(), bookkeepingId: z.string().nullable(), bookkeepingTargetAccountNumber: z.string().nullable() }).partial(); +export type UpdateVatRuleRequestDTO = z.infer; - /** - * VatRulesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const VatRulesPaginateLabelsOrderParamEnumSchema = z.enum([ - "matchcode", - "name", - "type", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type VatRulesPaginateLabelsOrderParamEnum = z.infer; - export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderParamEnumSchema.enum; +/** + * VatRulesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const VatRulesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type VatRulesPaginateLabelsOrderParamEnum = z.infer; +export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderParamEnumSchema.enum; - /** - * VatRulesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const VatRulesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type VatRulesPaginateLabelsResponse = z.infer; +/** + * VatRulesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const VatRulesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type VatRulesPaginateLabelsResponse = z.infer; - /** - * VatRulesListOrderParamEnumSchema - * @type { enum } - */ - export const VatRulesListOrderParamEnumSchema = z.enum([ - "matchcode", - "name", - "type", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type VatRulesListOrderParamEnum = z.infer; - export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; +/** + * VatRulesListOrderParamEnumSchema + * @type { enum } + */ +export const VatRulesListOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type VatRulesListOrderParamEnum = z.infer; +export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; + +/** + * VatRulesListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { VatRuleResponseDTO[] } items + */ +export const VatRulesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(VatRuleResponseDTOSchema).nullable() }).partial().shape }); +export type VatRulesListResponse = z.infer; - /** - * VatRulesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { VatRuleResponseDTO[] } items - */ - export const VatRulesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(VatRuleResponseDTOSchema).readonly() }).readonly().shape, - }); - export type VatRulesListResponse = z.infer; } diff --git a/test/generated/base/vatRules/vatRules.queries.ts b/test/generated/base/vatRules/vatRules.queries.ts index e0654f3..f582045 100644 --- a/test/generated/base/vatRules/vatRules.queries.ts +++ b/test/generated/base/vatRules/vatRules.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,333 +8,257 @@ import { VatRulesModels } from "./vatRules.models"; import { VatRulesApi } from "./vatRules.api"; export namespace VatRulesQueries { - export const moduleName = QueryModule.VatRules; +export const moduleName = QueryModule.VatRules; - export const keys = { +export const keys = { all: [moduleName] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: VatRulesModels.VatRuleFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/vat-rules/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: VatRulesModels.VatRuleFilterDto, - cursor?: string, - ) => [...keys.all, "/vat-rules/labels/paginate", "infinite", limit, order, filter, cursor] as const, - list: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => - [...keys.all, "/vat-rules", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => - [...keys.all, "/vat-rules", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", "infinite", limit, order, filter, cursor] as const, + list: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules", limit, order, filter, page, cursor] as const, + listInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/vat-rules/:id", id] as const, - }; +}; - /** - * Query `usePaginateLabels` - * @summary Paginate VAT rule labels (id and matchcode only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginateLabels` + * @summary Paginate VAT rule labels (id and matchcode only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(VatRulesAcl.canUsePaginateLabels()); + return VatRulesApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate VAT rule labels (id and matchcode only) + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate VAT rule labels (id and matchcode only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(VatRulesAcl.canUsePaginateLabels()); + return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Query `useList` + * @summary List VAT rules + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(VatRulesAcl.canUseList()); + return VatRulesApi.list(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Query `useList` - * @summary List VAT rules - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `useListInfinite + * @summary List VAT rules + * @permission Requires `canUseList` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` + * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.listInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(VatRulesAcl.canUseList()); + return VatRulesApi.list(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Infinite query `useListInfinite - * @summary List VAT rules - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Mutation `useCreate` + * @summary Create a new VAT rule + * @permission Requires `canUseCreate` ability + * @param { VatRulesModels.CreateVatRuleRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401, 409] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(VatRulesAcl.canUseCreate()); + return VatRulesApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create a new VAT rule - * @permission Requires `canUseCreate` ability - * @param { VatRulesModels.CreateVatRuleRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Query `useFindById` + * @summary Get VAT rule by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(VatRulesAcl.canUseFindById()); + return VatRulesApi.findById(id) }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(VatRulesAcl.canUseCreate()); - return VatRulesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update VAT rule by ID + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { VatRulesModels.UpdateVatRuleRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `useFindById` - * @summary Get VAT rule by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(VatRulesAcl.canUseUpdate()); + return VatRulesApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(VatRulesAcl.canUseFindById()); - return VatRulesApi.findById(id, config); - }, - ...options, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive VAT rule + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update VAT rule by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { VatRulesModels.UpdateVatRuleRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof VatRulesApi.update, - { id: string; data: VatRulesModels.UpdateVatRuleRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(VatRulesAcl.canUseArchive()); + return VatRulesApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(VatRulesAcl.canUseUpdate()); - return VatRulesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive VAT rule + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401, 404, 409] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive VAT rule - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(VatRulesAcl.canUseUnarchive()); + return VatRulesApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(VatRulesAcl.canUseArchive()); - return VatRulesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive VAT rule - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(VatRulesAcl.canUseUnarchive()); - return VatRulesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/warehouses/warehouses.acl.ts b/test/generated/base/warehouses/warehouses.acl.ts index 7465f13..65a76ba 100644 --- a/test/generated/base/warehouses/warehouses.acl.ts +++ b/test/generated/base/warehouses/warehouses.acl.ts @@ -1,45 +1,74 @@ import { AbilityTuple } from "@casl/ability"; export namespace WarehousesAcl { - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Warehouse"] as AbilityTuple<"Create", "Warehouse">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Warehouse"] as AbilityTuple<"Update", "Warehouse">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "Warehouse"] as AbilityTuple<"Archive", "Warehouse">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "Warehouse"] as AbilityTuple<"Archive", "Warehouse">; +/** + * Use for `useCreate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( +) => [ + "Create", + "Warehouse" +] as AbilityTuple<"Create", "Warehouse">; + +/** + * Use for `usePaginate` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query + */ +export const canUsePaginate = ( +) => [ + "Read", + "Warehouse" +] as AbilityTuple<"Read", "Warehouse">; + +/** + * Use for `usePaginateLabels` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query + */ +export const canUsePaginateLabels = ( +) => [ + "Read", + "Warehouse" +] as AbilityTuple<"Read", "Warehouse">; + +/** + * Use for `useFindById` query ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( +) => [ + "Read", + "Warehouse" +] as AbilityTuple<"Read", "Warehouse">; + +/** + * Use for `useUpdate` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation + */ +export const canUseUpdate = ( +) => [ + "Update", + "Warehouse" +] as AbilityTuple<"Update", "Warehouse">; + +/** + * Use for `useArchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation + */ +export const canUseArchive = ( +) => [ + "Archive", + "Warehouse" +] as AbilityTuple<"Archive", "Warehouse">; + +/** + * Use for `useUnarchive` mutation ability. + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation + */ +export const canUseUnarchive = ( +) => [ + "Archive", + "Warehouse" +] as AbilityTuple<"Archive", "Warehouse">; + } diff --git a/test/generated/base/warehouses/warehouses.api.ts b/test/generated/base/warehouses/warehouses.api.ts index 1520779..bfa128b 100644 --- a/test/generated/base/warehouses/warehouses.api.ts +++ b/test/generated/base/warehouses/warehouses.api.ts @@ -1,113 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WarehousesModels } from "./warehouses.models"; export namespace WarehousesApi { - export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, ) => { return AppRestClient.post( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses`, - ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), - config, - ); - }; - - export const paginate = ( - limit: number, - order?: string, - filter?: WarehousesModels.WarehouseFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, `/warehouses`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - - export const paginateLabels = ( - limit: number, - order?: string, - filter?: WarehousesModels.WarehouseLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses`, + ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), + + ) +}; +export const paginate = (limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, - `/warehouses/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: WarehousesModels.WarehouseResponseDTOSchema }, `/warehouses/${id}`, config); - }; - - export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, config?: AxiosRequestConfig) => { + { resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, + `/warehouses`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const paginateLabels = (limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string, ) => { + return AppRestClient.get( + { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, + `/warehouses/paginate/labels`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (id: string, ) => { + return AppRestClient.get( + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses/${id}`, + + ) +}; +export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, ) => { return AppRestClient.patch( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses/${id}`, - ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), - config, - ); - }; - - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/warehouses/${id}/archive`, undefined, config); - }; - - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/warehouses/${id}/unarchive`, undefined, config); - }; + { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, + `/warehouses/${id}`, + ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), + + ) +}; +export const archive = (id: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/warehouses/${id}/archive`, + + ) +}; +export const unarchive = (id: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/warehouses/${id}/unarchive`, + + ) +}; } diff --git a/test/generated/base/warehouses/warehouses.configs.ts b/test/generated/base/warehouses/warehouses.configs.ts index dfcf9ed..d53c994 100644 --- a/test/generated/base/warehouses/warehouses.configs.ts +++ b/test/generated/base/warehouses/warehouses.configs.ts @@ -6,135 +6,136 @@ import { WarehousesQueries } from "./warehouses.queries"; import { WarehousesAcl } from "./warehouses.acl"; export namespace WarehousesConfigs { - export const warehousesConfig = { +export const warehousesConfig = { meta: { - title: "Warehouses", + title: "Warehouses", }, readAll: { - acl: WarehousesAcl.canUsePaginate, - schema: WarehousesModels.WarehouseResponseDTOSchema, - paginated: WarehousesQueries.usePaginate, - infinite: WarehousesQueries.usePaginateInfinite, - filters: { - schema: WarehousesModels.WarehouseFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WarehousesModels.WarehouseFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: WarehousesAcl.canUsePaginate, schema: WarehousesModels.WarehouseResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - city: true, - country: true, - district: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: WarehousesModels.WarehousesPaginateOrderParamEnumSchema, + paginated: WarehousesQueries.usePaginate, + infinite: WarehousesQueries.usePaginateInfinite, + filters: { + schema: WarehousesModels.WarehouseFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WarehousesModels.WarehouseFilterDtoSchema, + options: { + inputs: { + search: true, + archived: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: WarehousesModels.WarehouseResponseDTOSchema, + options: { + columns: { + id: true, + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + city: true, + country: true, + district: true, + archived: true, + createdById: true, + createdBy: true, + createdAt: true, + updatedById: true, + updatedBy: true, + updatedAt: true, + }, + sortable: WarehousesModels.WarehousesPaginateOrderParamEnumSchema, + }, +}), }, read: { - acl: WarehousesAcl.canUseFindById, - schema: WarehousesModels.WarehouseResponseDTOSchema, - query: WarehousesQueries.useFindById, + acl: WarehousesAcl.canUseFindById, + schema: WarehousesModels.WarehouseResponseDTOSchema, + query: WarehousesQueries.useFindById, }, create: { - acl: WarehousesAcl.canUseCreate, - schema: WarehousesModels.CreateWarehouseRequestDTOSchema, - mutation: WarehousesQueries.useCreate, - inputDefs: dynamicInputs({ + acl: WarehousesAcl.canUseCreate, schema: WarehousesModels.CreateWarehouseRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, - }), + mutation: WarehousesQueries.useCreate, + inputDefs: dynamicInputs({ + schema: WarehousesModels.CreateWarehouseRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) }, update: { - acl: WarehousesAcl.canUseUpdate, - schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, - mutation: WarehousesQueries.useUpdate, - inputDefs: dynamicInputs({ + acl: WarehousesAcl.canUseUpdate, schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, - }), + mutation: WarehousesQueries.useUpdate, + inputDefs: dynamicInputs({ + schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, + options: { + inputs: { + name: true, + shortName: true, + additionalInformation: true, + matchCode: true, + street: true, + secondaryStreet: true, + zip: true, + cityId: true, + countryId: true, + district: true, + }, + }, +}) }, - }; +}; - export const labelsConfig = { +export const labelsConfig = { meta: { - title: "Labels", + title: "Labels", }, readAll: { - acl: WarehousesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: WarehousesQueries.usePaginateLabels, - infinite: WarehousesQueries.usePaginateLabelsInfinite, - filters: { - schema: WarehousesModels.WarehouseLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WarehousesModels.WarehouseLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: WarehousesAcl.canUsePaginateLabels, schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema, + paginated: WarehousesQueries.usePaginateLabels, + infinite: WarehousesQueries.usePaginateLabelsInfinite, + filters: { + schema: WarehousesModels.WarehouseLabelFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WarehousesModels.WarehouseLabelFilterDtoSchema, + options: { + inputs: { + search: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: CommonModels.LabelResponseDTOSchema, + options: { + columns: { + id: true, + label: true, }, - }; + sortable: WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema, + }, +}), + }, +}; + } diff --git a/test/generated/base/warehouses/warehouses.models.ts b/test/generated/base/warehouses/warehouses.models.ts index dfa717d..e60932b 100644 --- a/test/generated/base/warehouses/warehouses.models.ts +++ b/test/generated/base/warehouses/warehouses.models.ts @@ -2,223 +2,151 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WarehousesModels { - /** - * WarehouseCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type WarehouseCityDto = z.infer; +/** + * WarehouseCityDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type WarehouseCityDto = z.infer; - /** - * WarehouseCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ - export const WarehouseCountryDtoSchema = z - .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) - .readonly(); - export type WarehouseCountryDto = z.infer; +/** + * WarehouseCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } isoCode2 + * @property { string } isoCode3 + */ +export const WarehouseCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); +export type WarehouseCountryDto = z.infer; - /** - * WarehouseEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type WarehouseEmployeeDTO = z.infer; +/** + * WarehouseEmployeeDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); +export type WarehouseEmployeeDTO = z.infer; - /** - * WarehouseResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { WarehouseCityDto } city - * @property { WarehouseCountryDto } country - * @property { string } district - * @property { boolean } archived - * @property { string } createdById - * @property { WarehouseEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { WarehouseEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const WarehouseResponseDTOSchema = z - .object({ - id: z.string(), - name: z.string().nullish(), - shortName: z.string().nullish(), - additionalInformation: z.string().nullish(), - matchCode: z.string(), - street: z.string().nullish(), - secondaryStreet: z.string().nullish(), - zip: z.string().nullish(), - city: WarehouseCityDtoSchema.nullish(), - country: WarehouseCountryDtoSchema.nullish(), - district: z.string().nullish(), - archived: z.boolean(), - createdById: z.string().nullish(), - createdBy: WarehouseEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: WarehouseEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type WarehouseResponseDTO = z.infer; +/** + * WarehouseResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { WarehouseCityDto } city + * @property { WarehouseCountryDto } country + * @property { string } district + * @property { boolean } archived + * @property { string } createdById + * @property { WarehouseEmployeeDTO } createdBy + * @property { string } createdAt + * @property { string } updatedById + * @property { WarehouseEmployeeDTO } updatedBy + * @property { string } updatedAt + */ +export const WarehouseResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: WarehouseCityDtoSchema.nullish(), country: WarehouseCountryDtoSchema.nullish(), district: z.string().nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: WarehouseEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: WarehouseEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); +export type WarehouseResponseDTO = z.infer; - /** - * CreateWarehouseRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } countryId - * @property { string } district - */ - export const CreateWarehouseRequestDTOSchema = z - .object({ - name: z.string().nullish(), - shortName: z.string().nullish(), - additionalInformation: z.string().nullish(), - matchCode: z.string(), - street: z.string().nullish(), - secondaryStreet: z.string().nullish(), - zip: z.string().nullish(), - cityId: z.string().nullish(), - countryId: z.string().nullish(), - district: z.string().nullish(), - }) - .readonly(); - export type CreateWarehouseRequestDTO = z.infer; +/** + * CreateWarehouseRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } countryId + * @property { string } district + */ +export const CreateWarehouseRequestDTOSchema = z.object({ name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), cityId: z.string().nullish(), countryId: z.string().nullish(), district: z.string().nullish() }); +export type CreateWarehouseRequestDTO = z.infer; - /** - * WarehouseLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const WarehouseLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type WarehouseLabelFilterDto = z.infer; +/** + * WarehouseLabelFilterDtoSchema + * @type { object } + * @property { string } search + */ +export const WarehouseLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); +export type WarehouseLabelFilterDto = z.infer; - /** - * WarehouseFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived Filter by archived status - */ - export const WarehouseFilterDtoSchema = z - .object({ search: z.string(), archived: z.boolean().describe("Filter by archived status") }) - .readonly(); - export type WarehouseFilterDto = z.infer; +/** + * WarehouseFilterDtoSchema + * @type { object } + * @property { string } search + * @property { boolean } archived Filter by archived status + */ +export const WarehouseFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); +export type WarehouseFilterDto = z.infer; - /** - * UpdateWarehouseRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } countryId - * @property { string } district - */ - export const UpdateWarehouseRequestDTOSchema = z - .object({ - name: z.string(), - shortName: z.string(), - additionalInformation: z.string(), - matchCode: z.string(), - street: z.string(), - secondaryStreet: z.string(), - zip: z.string(), - cityId: z.string(), - countryId: z.string(), - district: z.string(), - }) - .readonly(); - export type UpdateWarehouseRequestDTO = z.infer; +/** + * UpdateWarehouseRequestDTOSchema + * @type { object } + * @property { string } name + * @property { string } shortName + * @property { string } additionalInformation + * @property { string } matchCode + * @property { string } street + * @property { string } secondaryStreet + * @property { string } zip + * @property { string } cityId + * @property { string } countryId + * @property { string } district + */ +export const UpdateWarehouseRequestDTOSchema = z.object({ name: z.string().nullable(), shortName: z.string().nullable(), additionalInformation: z.string().nullable(), matchCode: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable() }).partial(); +export type UpdateWarehouseRequestDTO = z.infer; - /** - * WarehousesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const WarehousesPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type WarehousesPaginateOrderParamEnum = z.infer; - export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnumSchema.enum; +/** + * WarehousesPaginateOrderParamEnumSchema + * @type { enum } + */ +export const WarehousesPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type WarehousesPaginateOrderParamEnum = z.infer; +export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnumSchema.enum; - /** - * WarehousesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { WarehouseResponseDTO[] } items - */ - export const WarehousesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(WarehouseResponseDTOSchema).readonly() }).readonly().shape, - }); - export type WarehousesPaginateResponse = z.infer; +/** + * WarehousesPaginateResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { WarehouseResponseDTO[] } items + */ +export const WarehousesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WarehouseResponseDTOSchema).nullable() }).partial().shape }); +export type WarehousesPaginateResponse = z.infer; - /** - * WarehousesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const WarehousesPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type WarehousesPaginateLabelsOrderParamEnum = z.infer; - export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOrderParamEnumSchema.enum; +/** + * WarehousesPaginateLabelsOrderParamEnumSchema + * @type { enum } + */ +export const WarehousesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); +export type WarehousesPaginateLabelsOrderParamEnum = z.infer; +export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOrderParamEnumSchema.enum; + +/** + * WarehousesPaginateLabelsResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { CommonModels.LabelResponseDTO[] } items + */ +export const WarehousesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); +export type WarehousesPaginateLabelsResponse = z.infer; - /** - * WarehousesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const WarehousesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type WarehousesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/base/warehouses/warehouses.queries.ts b/test/generated/base/warehouses/warehouses.queries.ts index 9fc4da2..5aa2949 100644 --- a/test/generated/base/warehouses/warehouses.queries.ts +++ b/test/generated/base/warehouses/warehouses.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -9,340 +8,253 @@ import { WarehousesModels } from "./warehouses.models"; import { WarehousesApi } from "./warehouses.api"; export namespace WarehousesQueries { - export const moduleName = QueryModule.Warehouses; +export const moduleName = QueryModule.Warehouses; - export const keys = { +export const keys = { all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: WarehousesModels.WarehouseFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/warehouses", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string) => - [...keys.all, "/warehouses", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: WarehousesModels.WarehouseLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/warehouses/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: WarehousesModels.WarehouseLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/warehouses/paginate/labels", "infinite", limit, order, filter, cursor] as const, + paginate: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses", limit, order, filter, page, cursor] as const, + paginateInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string) => [...keys.all, "/warehouses", "infinite", limit, order, filter, cursor] as const, + paginateLabels: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", limit, order, filter, page, cursor] as const, + paginateLabelsInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", "infinite", limit, order, filter, cursor] as const, findById: (id: string) => [...keys.all, "/warehouses/:id", id] as const, - }; +}; - /** - * Mutation `useCreate` - * @summary Create warehouse - * @permission Requires `canUseCreate` ability - * @param { WarehousesModels.CreateWarehouseRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create warehouse + * @permission Requires `canUseCreate` ability + * @param { WarehousesModels.CreateWarehouseRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(WarehousesAcl.canUseCreate()); - return WarehousesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Get paginated warehouses - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; + return useMutation({ + mutationFn: ({ data }) => { + checkAcl(WarehousesAcl.canUseCreate()); + return WarehousesApi.create(data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Infinite query `usePaginateInfinite - * @summary Get paginated warehouses - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `usePaginate` + * @summary Get paginated warehouses + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginate(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WarehousesAcl.canUsePaginate()); + return WarehousesApi.paginate(limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; +/** + * Infinite query `usePaginateInfinite + * @summary Get paginated warehouses + * @permission Requires `canUsePaginate` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Query `usePaginateLabels` - * @summary Paginate warehouse labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: WarehousesModels.WarehouseLabelFilterDto; - page?: number; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.paginateInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WarehousesAcl.canUsePaginate()); + return WarehousesApi.paginate(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + ...options, + }); +}; - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Query `usePaginateLabels` + * @summary Paginate warehouse labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.paginateLabels(limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WarehousesAcl.canUsePaginateLabels()); + return WarehousesApi.paginateLabels(limit, order, filter, page, cursor) }, + ...options, + }); +}; - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate warehouse labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Infinite query `usePaginateLabelsInfinite + * @summary Paginate warehouse labels + * @permission Requires `canUsePaginateLabels` ability + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` + * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + return useInfiniteQuery({ + queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WarehousesAcl.canUsePaginateLabels()); + return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; + }, + ...options, + }); +}; - /** - * Query `useFindById` - * @summary Get warehouse by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get warehouse by id + * @permission Requires `canUseFindById` ability + * @param { string } object.id Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(id), + queryFn: () => { + checkAcl(WarehousesAcl.canUseFindById()); + return WarehousesApi.findById(id) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(WarehousesAcl.canUseFindById()); - return WarehousesApi.findById(id, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdate` + * @summary Update warehouse + * @permission Requires `canUseUpdate` ability + * @param { string } mutation.id Path parameter + * @param { WarehousesModels.UpdateWarehouseRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdate` - * @summary Update warehouse - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { WarehousesModels.UpdateWarehouseRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof WarehousesApi.update, - { id: string; data: WarehousesModels.UpdateWarehouseRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id, data }) => { + checkAcl(WarehousesAcl.canUseUpdate()); + return WarehousesApi.update(id, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { id } = variables; + const updateKeys = [keys.findById(id)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(WarehousesAcl.canUseUpdate()); - return WarehousesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useArchive` + * @summary Archive warehouse + * @permission Requires `canUseArchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useArchive` - * @summary Archive warehouse - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(WarehousesAcl.canUseArchive()); + return WarehousesApi.archive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(WarehousesAcl.canUseArchive()); - return WarehousesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useUnarchive` + * @summary Unarchive warehouse + * @permission Requires `canUseUnarchive` ability + * @param { string } mutation.id Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUnarchive` - * @summary Unarchive warehouse - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ id }) => { + checkAcl(WarehousesAcl.canUseUnarchive()); + return WarehousesApi.unarchive(id) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(WarehousesAcl.canUseUnarchive()); - return WarehousesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/workingDocuments/workingDocuments.acl.ts b/test/generated/base/workingDocuments/workingDocuments.acl.ts index 5ef0f52..344f8c6 100644 --- a/test/generated/base/workingDocuments/workingDocuments.acl.ts +++ b/test/generated/base/workingDocuments/workingDocuments.acl.ts @@ -1,27 +1,30 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsAcl { - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List working documents - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument", object) : "WorkingDocument"] as AbilityTuple< - "Read", - "WorkingDocument" | (ForcedSubject<"WorkingDocument"> & { officeId: string }) - >; +/** + * Use for `useList` query ability. For global ability, omit the object parameter. + * @description List working documents + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query + */ +export const canUseList = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument", object) : "WorkingDocument" +] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; + +/** + * Use for `useFindById` query ability. For global ability, omit the object parameter. + * @description Get working document by ID + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query + */ +export const canUseFindById = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument", object) : "WorkingDocument" +] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get working document by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument", object) : "WorkingDocument"] as AbilityTuple< - "Read", - "WorkingDocument" | (ForcedSubject<"WorkingDocument"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocuments/workingDocuments.api.ts b/test/generated/base/workingDocuments/workingDocuments.api.ts index 7afc369..471babb 100644 --- a/test/generated/base/workingDocuments/workingDocuments.api.ts +++ b/test/generated/base/workingDocuments/workingDocuments.api.ts @@ -1,57 +1,29 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsModels } from "./workingDocuments.models"; export namespace WorkingDocumentsApi { - export const list = ( - positionId: string, - officeId: string, - limit: number, - order?: string, - filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { +export const list = (positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, - `/offices/${officeId}/positions/${positionId}/working-documents`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - - export const findById = (positionId: string, id: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, + `/offices/${officeId}/positions/${positionId}/working-documents`, + { + params: { + order: ZodExtended.parse(ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), + filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), + }, + } + ) +}; +export const findById = (positionId: string, id: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, - config, - ); - }; + { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, + + ) +}; } diff --git a/test/generated/base/workingDocuments/workingDocuments.configs.ts b/test/generated/base/workingDocuments/workingDocuments.configs.ts index 041fdcc..5e7d622 100644 --- a/test/generated/base/workingDocuments/workingDocuments.configs.ts +++ b/test/generated/base/workingDocuments/workingDocuments.configs.ts @@ -5,50 +5,51 @@ import { WorkingDocumentsQueries } from "./workingDocuments.queries"; import { WorkingDocumentsAcl } from "./workingDocuments.acl"; export namespace WorkingDocumentsConfigs { - export const workingDocumentsConfig = { +export const workingDocumentsConfig = { meta: { - title: "Working Documents", + title: "Working Documents", }, readAll: { - acl: WorkingDocumentsAcl.canUseList, - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - paginated: WorkingDocumentsQueries.useList, - infinite: WorkingDocumentsQueries.useListInfinite, - filters: { - schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, - options: { - inputs: { - search: true, - type: true, - }, - }, - }), - }, - columns: dynamicColumns({ + acl: WorkingDocumentsAcl.canUseList, schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - name: true, - nameSuffix: true, - type: true, - referenceTable: true, - referenceId: true, - createdById: true, - createdAt: true, - createdBy: true, - }, - sortable: WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema, + paginated: WorkingDocumentsQueries.useList, + infinite: WorkingDocumentsQueries.useListInfinite, + filters: { + schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, + filterDefs: dynamicInputs({ + schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, + options: { + inputs: { + search: true, + type: true, + }, + }, +}) }, - }), + columns: dynamicColumns({ + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + options: { + columns: { + id: true, + positionId: true, + name: true, + nameSuffix: true, + type: true, + referenceTable: true, + referenceId: true, + createdById: true, + createdAt: true, + createdBy: true, + }, + sortable: WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema, + }, +}), }, read: { - acl: WorkingDocumentsAcl.canUseFindById, - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - query: WorkingDocumentsQueries.useFindById, + acl: WorkingDocumentsAcl.canUseFindById, + schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, + query: WorkingDocumentsQueries.useFindById, }, - }; +}; + } diff --git a/test/generated/base/workingDocuments/workingDocuments.models.ts b/test/generated/base/workingDocuments/workingDocuments.models.ts index 5fc10dd..3386fdc 100644 --- a/test/generated/base/workingDocuments/workingDocuments.models.ts +++ b/test/generated/base/workingDocuments/workingDocuments.models.ts @@ -2,99 +2,69 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsModels { - /** - * TypeEnumSchema - * @type { enum } - * @description Working document type - */ - export const TypeEnumSchema = z.enum([ - "export-declaration", - "house-bl", - "master-bl", - "house-awb", - "master-awb", - "bl-instructions", - "ams-instructions", - "cmr-form", - "fcr-form", - "isf-form", - "templated-document", - "shipping-instructions", - ]); - export type TypeEnum = z.infer; - export const TypeEnum = TypeEnumSchema.enum; +/** + * TypeEnumSchema + * @type { enum } + * @description Working document type + */ +export const TypeEnumSchema = z.enum(["export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "shipping-instructions"]); +export type TypeEnum = z.infer; +export const TypeEnum = TypeEnumSchema.enum; - /** - * WorkingDocumentCreatedByResponseDTOSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } name Employee name - */ - export const WorkingDocumentCreatedByResponseDTOSchema = z - .object({ id: z.string().describe("Employee ID"), name: z.string().describe("Employee name").nullable() }) - .readonly(); - export type WorkingDocumentCreatedByResponseDTO = z.infer; +/** + * WorkingDocumentCreatedByResponseDTOSchema + * @type { object } + * @property { string } id Employee ID + * @property { string } name Employee name + */ +export const WorkingDocumentCreatedByResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullable() }); +export type WorkingDocumentCreatedByResponseDTO = z.infer; - /** - * WorkingDocumentResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } positionId Position ID - * @property { string } name Working document name - * @property { string } nameSuffix Working document name suffix - * @property { string } type Working document type - * @property { string } referenceTable Reference table - * @property { string } referenceId Reference ID - * @property { string } createdById Created by - * @property { string } createdAt Created at - * @property { WorkingDocumentCreatedByResponseDTO } createdBy Created by - */ - export const WorkingDocumentResponseDTOSchema = z - .object({ - id: z.string(), - positionId: z.string().describe("Position ID"), - name: z.string().describe("Working document name"), - nameSuffix: z.string().describe("Working document name suffix").nullish(), - type: TypeEnumSchema.describe("Working document type"), - referenceTable: z.string().describe("Reference table"), - referenceId: z.string().describe("Reference ID"), - createdById: z.string().describe("Created by"), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - createdBy: WorkingDocumentCreatedByResponseDTOSchema.describe("Created by"), - }) - .readonly(); - export type WorkingDocumentResponseDTO = z.infer; +/** + * WorkingDocumentResponseDTOSchema + * @type { object } + * @property { string } id + * @property { string } positionId Position ID + * @property { string } name Working document name + * @property { string } nameSuffix Working document name suffix + * @property { string } type Working document type + * @property { string } referenceTable Reference table + * @property { string } referenceId Reference ID + * @property { string } createdById Created by + * @property { string } createdAt Created at + * @property { WorkingDocumentCreatedByResponseDTO } createdBy Created by + */ +export const WorkingDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), type: TypeEnumSchema, referenceTable: z.string(), referenceId: z.string(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), createdBy: WorkingDocumentCreatedByResponseDTOSchema }); +export type WorkingDocumentResponseDTO = z.infer; - /** - * WorkingDocumentFilterDtoSchema - * @type { object } - * @property { string } search - * @property { string } type - */ - export const WorkingDocumentFilterDtoSchema = z.object({ search: z.string(), type: z.string() }).readonly(); - export type WorkingDocumentFilterDto = z.infer; +/** + * WorkingDocumentFilterDtoSchema + * @type { object } + * @property { string } search + * @property { string } type + */ +export const WorkingDocumentFilterDtoSchema = z.object({ search: z.string().nullable(), type: z.string().nullable() }).partial(); +export type WorkingDocumentFilterDto = z.infer; - /** - * WorkingDocumentsListOrderParamEnumSchema - * @type { enum } - */ - export const WorkingDocumentsListOrderParamEnumSchema = z.enum(["NAME", "TYPE", "CREATED_AT", "UPDATED_AT"]); - export type WorkingDocumentsListOrderParamEnum = z.infer; - export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParamEnumSchema.enum; +/** + * WorkingDocumentsListOrderParamEnumSchema + * @type { enum } + */ +export const WorkingDocumentsListOrderParamEnumSchema = z.enum(["NAME", "TYPE", "CREATED_AT", "UPDATED_AT"]); +export type WorkingDocumentsListOrderParamEnum = z.infer; +export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParamEnumSchema.enum; + +/** + * WorkingDocumentsListResponseSchema + * @type { object } + * @property { number } page 1-indexed page number to begin from + * @property { string } cursor ID of item to start after + * @property { string } nextCursor Cursor for next set of items + * @property { number } limit Items per response + * @property { number } totalItems Total available items + * @property { WorkingDocumentResponseDTO[] } items + */ +export const WorkingDocumentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).nullable() }).partial().shape }); +export type WorkingDocumentsListResponse = z.infer; - /** - * WorkingDocumentsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { WorkingDocumentResponseDTO[] } items - */ - export const WorkingDocumentsListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).readonly() }).readonly().shape, - }); - export type WorkingDocumentsListResponse = z.infer; } diff --git a/test/generated/base/workingDocuments/workingDocuments.queries.ts b/test/generated/base/workingDocuments/workingDocuments.queries.ts index 09fb3dc..0642218 100644 --- a/test/generated/base/workingDocuments/workingDocuments.queries.ts +++ b/test/generated/base/workingDocuments/workingDocuments.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -8,183 +7,95 @@ import { WorkingDocumentsModels } from "./workingDocuments.models"; import { WorkingDocumentsApi } from "./workingDocuments.api"; export namespace WorkingDocumentsQueries { - export const moduleName = QueryModule.WorkingDocuments; +export const moduleName = QueryModule.WorkingDocuments; - export const keys = { +export const keys = { all: [moduleName] as const, - list: ( - positionId: string, - officeId: string, - limit?: number, - order?: string, - filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/working-documents", - positionId, - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - listInfinite: ( - positionId: string, - officeId: string, - limit?: number, - order?: string, - filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/working-documents", - "infinite", - positionId, - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (positionId: string, id: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/working-documents/:id", - positionId, - id, - officeId, - ] as const, - }; + list: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", positionId, officeId, limit, order, filter, page, cursor] as const, + listInfinite: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", "infinite", positionId, officeId, limit, order, filter, cursor] as const, + findById: (positionId: string, id: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents/:id", positionId, id, officeId] as const, +}; - /** - * Query `useList` - * @summary List working documents - * @permission Requires `canUseList` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` - * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - positionId, - officeId, - limit, - order, - filter, - page, - cursor, - }: { - positionId: string; - officeId: string; - limit: number; - order?: string; - filter?: WorkingDocumentsModels.WorkingDocumentFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useList` + * @summary List working documents + * @permission Requires `canUseList` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` + * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useList = ({ positionId, officeId, limit, order, filter, page, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), + queryFn: () => { + checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WorkingDocumentsAcl.canUseList({ officeId })); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; +/** + * Infinite query `useListInfinite + * @summary List working documents + * @permission Requires `canUseList` ability + * @param { string } object.positionId Path parameter + * @param { string } object.officeId Path parameter + * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` + * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` + * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter + * @param { number } object.page Query parameter. 1-indexed page number to begin from + * @param { string } object.cursor Query parameter. ID of item to start after + * @param { AppInfiniteQueryOptions } options Infinite query options + * @returns { UseInfiniteQueryResult } + * @statusCodes [200, 401] + */ +export const useListInfinite = ({ positionId, officeId, limit, order, filter, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { + const { checkAcl } = useAclCheck(); - /** - * Infinite query `useListInfinite - * @summary List working documents - * @permission Requires `canUseList` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` - * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - positionId, - officeId, - limit, - order, - filter, - cursor, - }: { - positionId: string; - officeId: string; - limit: number; - order?: string; - filter?: WorkingDocumentsModels.WorkingDocumentFilterDto; - cursor?: string; + return useInfiniteQuery({ + queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), + queryFn: ({ pageParam }) => { + checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor) }, + initialPageParam: 1, + getNextPageParam: ({ page, totalItems, limit: limitParam }) => { + const pageParam = page ?? 1; + return pageParam * limitParam < totalItems ? pageParam + 1 : null; }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WorkingDocumentsAcl.canUseList({ officeId })); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; + ...options, + }); +}; - /** - * Query `useFindById` - * @summary Get working document by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ - export const useFindById = ( - { positionId, id, officeId }: { positionId: string; id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useFindById` + * @summary Get working document by ID + * @permission Requires `canUseFindById` ability + * @param { string } object.positionId Path parameter + * @param { string } object.id Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401, 404] + */ +export const useFindById = ({ positionId, id, officeId }: { positionId: string, id: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.findById(positionId, id, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId } )); + return WorkingDocumentsApi.findById(positionId, id, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.findById(positionId, id, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId })); - return WorkingDocumentsApi.findById(positionId, id, officeId, config); - }, - ...options, - }); - }; } diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts index 231e7ac..80d3476 100644 --- a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts +++ b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts @@ -1,93 +1,82 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsAmsInstructionsAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Create", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Create", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Create", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - /** - * Use for `useGetAMSInstructionsData` query ability. For global ability, omit the object parameter. - * @description Read AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAMSInstructionsData` query - */ - export const canUseGetAMSInstructionsData = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; +/** + * Use for `useGetAMSInstructionsData` query ability. For global ability, omit the object parameter. + * @description Read AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAMSInstructionsData` query + */ +export const canUseGetAMSInstructionsData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - /** - * Use for `useUpdateAMSInstructionsData` mutation ability. For global ability, omit the object parameter. - * @description Update AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateAMSInstructionsData` mutation - */ - export const canUseUpdateAMSInstructionsData = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; +/** + * Use for `useUpdateAMSInstructionsData` mutation ability. For global ability, omit the object parameter. + * @description Update AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateAMSInstructionsData` mutation + */ +export const canUseUpdateAMSInstructionsData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - /** - * Use for `useDeleteAMSInstructions` mutation ability. For global ability, omit the object parameter. - * @description Delete AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteAMSInstructions` mutation - */ - export const canUseDeleteAMSInstructions = (object?: { officeId: string }) => - [ - "Delete", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Delete", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; +/** + * Use for `useDeleteAMSInstructions` mutation ability. For global ability, omit the object parameter. + * @description Delete AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteAMSInstructions` mutation + */ +export const canUseDeleteAMSInstructions = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Delete", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - /** - * Use for `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation - */ - export const canUsePreviewAMSInstructions = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; +/** + * Use for `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation + */ +export const canUsePreviewAMSInstructions = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerateAMSInstructions` mutation ability. For global ability, omit the object parameter. + * @description Generate AMS Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAMSInstructions` mutation + */ +export const canUseGenerateAMSInstructions = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" +] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - /** - * Use for `useGenerateAMSInstructions` mutation ability. For global ability, omit the object parameter. - * @description Generate AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAMSInstructions` mutation - */ - export const canUseGenerateAMSInstructions = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts index 3963a2b..1cd287a 100644 --- a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts +++ b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts @@ -1,94 +1,58 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsAmsInstructionsApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions`, - undefined, - config, - ); - }; - - export const getAMSInstructionsData = ( - positionId: string, - amsInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions`, + + ) +}; +export const getAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - config, - ); - }; - - export const updateAMSInstructionsData = ( - positionId: string, - amsInstructionsId: string, - officeId: string, - data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + + ) +}; +export const updateAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, ) => { return AppRestClient.patch( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), - config, - ); - }; - - export const deleteAMSInstructions = ( - positionId: string, - amsInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), + + ) +}; +export const deleteAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - undefined, - config, - ); - }; - - export const previewAMSInstructions = ( - positionId: string, - amsInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, + + ) +}; +export const previewAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generateAMSInstructions = ( - positionId: string, - amsInstructionsId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts index f48fd4d..9f5e94c 100644 --- a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts +++ b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts @@ -2,244 +2,141 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsAmsInstructionsModels { - /** - * AMSInstructionsDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ - export const AMSInstructionsDocumentPortResponseDTOSchema = z - .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) - .readonly(); - export type AMSInstructionsDocumentPortResponseDTO = z.infer; +/** + * AMSInstructionsDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ +export const AMSInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type AMSInstructionsDocumentPortResponseDTO = z.infer; - /** - * AMSInstructionsDocumentCityResponseDTOSchema - * @type { object } - * @property { string } id ID of the city - * @property { string } name Name of the city - */ - export const AMSInstructionsDocumentCityResponseDTOSchema = z - .object({ id: z.string().describe("ID of the city"), name: z.string().describe("Name of the city") }) - .readonly(); - export type AMSInstructionsDocumentCityResponseDTO = z.infer; +/** + * AMSInstructionsDocumentCityResponseDTOSchema + * @type { object } + * @property { string } id ID of the city + * @property { string } name Name of the city + */ +export const AMSInstructionsDocumentCityResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type AMSInstructionsDocumentCityResponseDTO = z.infer; - /** - * AMSInstructionsDocumentSignedByResponseDTOSchema - * @type { object } - * @property { string } id ID of the employee - * @property { string } name Name of the employee - */ - export const AMSInstructionsDocumentSignedByResponseDTOSchema = z - .object({ id: z.string().describe("ID of the employee"), name: z.string().describe("Name of the employee") }) - .readonly(); - export type AMSInstructionsDocumentSignedByResponseDTO = z.infer< - typeof AMSInstructionsDocumentSignedByResponseDTOSchema - >; +/** + * AMSInstructionsDocumentSignedByResponseDTOSchema + * @type { object } + * @property { string } id ID of the employee + * @property { string } name Name of the employee + */ +export const AMSInstructionsDocumentSignedByResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type AMSInstructionsDocumentSignedByResponseDTO = z.infer; - /** - * AMSInstructionsDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const AMSInstructionsDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer< - typeof AMSInstructionsDocumentBusinessPartnerResponseDTOSchema - >; +/** + * AMSInstructionsDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const AMSInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); +export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer; - /** - * AMSInstructionsDocumentCargoDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { string } containerNumber Container number of the cargo - * @property { number } nrOfPackages Number of packages in the cargo - * @property { string } description Description of the cargo - * @property { number } weight Weight of the cargo - * @property { number } volume Volume of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - */ - export const AMSInstructionsDocumentCargoDTOSchema = z - .object({ - caseMarks: z.string().describe("Case marks of the cargo"), - containerNumber: z.string().describe("Container number of the cargo"), - nrOfPackages: z.number().describe("Number of packages in the cargo"), - description: z.string().describe("Description of the cargo"), - weight: z.number().describe("Weight of the cargo"), - volume: z.number().describe("Volume of the cargo"), - seal1: z.string().describe("Seal number 1 of the cargo"), - seal2: z.string().describe("Seal number 2 of the cargo"), - }) - .readonly(); - export type AMSInstructionsDocumentCargoDTO = z.infer; +/** + * AMSInstructionsDocumentCargoDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { string } containerNumber Container number of the cargo + * @property { number } nrOfPackages Number of packages in the cargo + * @property { string } description Description of the cargo + * @property { number } weight Weight of the cargo + * @property { number } volume Volume of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + */ +export const AMSInstructionsDocumentCargoDTOSchema = z.object({ caseMarks: z.string().nullable(), containerNumber: z.string().nullable(), nrOfPackages: z.number().nullable(), description: z.string().nullable(), weight: z.number().nullable(), volume: z.number().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable() }).partial(); +export type AMSInstructionsDocumentCargoDTO = z.infer; - /** - * AMSInstructionsDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the AMS Instructions document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the AMS Instructions document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } date Date of the AMS Instructions document - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { CommonModels.EditorContentResponseDto } additionalAMSText Additional AMS text - * @property { string } principalName Principal name - * @property { string } blNumber Bill of lading number - * @property { string } vessel Vessel - * @property { AMSInstructionsDocumentPortResponseDTO } portOfLoading Port of loading - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfDelivery Port of delivery - * @property { AMSInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfIssue Place of issue - * @property { string } dateOfIssue Date of issue - * @property { AMSInstructionsDocumentSignedByResponseDTO } signedBy Signed by - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } deliveryBusinessPartner Delivery business partner - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfAcceptance Port of acceptance - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Also notify party - * @property { string } applyTo Apply to - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string[] } availableContainerNumbers Available container numbers - * @property { string[] } selectedContainerNumbers Selected container numbers - * @property { string[] } selectedContainerLabels Selected container labels - * @property { AMSInstructionsDocumentCargoDTO[] } cargo Cargo information - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - */ - export const AMSInstructionsDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the AMS Instructions document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference").nullish(), - name: z.string().describe("Name of the AMS Instructions document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document").nullish(), - direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), - transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), - versionNumber: z.number().describe("Version number of the document"), - additionalAMSText: CommonModels.EditorContentResponseDtoSchema.describe("Additional AMS text").nullish(), - principalName: z.string().describe("Principal name").nullish(), - blNumber: z.string().describe("Bill of lading number").nullish(), - vessel: z.string().describe("Vessel").nullish(), - portOfLoading: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of loading").nullish(), - placeOfDelivery: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of delivery").nullish(), - portOfDischarge: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), - placeOfIssue: AMSInstructionsDocumentCityResponseDTOSchema.describe("Place of issue").nullish(), - dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue").nullish(), - signedBy: AMSInstructionsDocumentSignedByResponseDTOSchema.describe("Signed by").nullish(), - deliveryBusinessPartner: - AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Delivery business partner").nullish(), - placeOfAcceptance: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of acceptance").nullish(), - consignee: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), - shipper: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), - notify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Notify party").nullish(), - alsoNotify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Also notify party").nullish(), - applyTo: z.string().describe("Apply to").nullish(), - suppressWeight: z.boolean().describe("Whether to suppress weight information").nullish(), - suppressMeasurement: z.boolean().describe("Whether to suppress measurement information").nullish(), - availableContainerNumbers: z.array(z.string()).readonly().describe("Available container numbers").nullish(), - selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers").nullish(), - selectedContainerLabels: z.array(z.string()).readonly().describe("Selected container labels").nullish(), - cargo: z.array(AMSInstructionsDocumentCargoDTOSchema).readonly().describe("Cargo information").nullish(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at").nullish(), - }) - .readonly(); - export type AMSInstructionsDocumentResponseDTO = z.infer; +/** + * AMSInstructionsDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the AMS Instructions document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the AMS Instructions document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } date Date of the AMS Instructions document + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { CommonModels.EditorContentResponseDto } additionalAMSText Additional AMS text + * @property { string } principalName Principal name + * @property { string } blNumber Bill of lading number + * @property { string } vessel Vessel + * @property { AMSInstructionsDocumentPortResponseDTO } portOfLoading Port of loading + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfDelivery Port of delivery + * @property { AMSInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfIssue Place of issue + * @property { string } dateOfIssue Date of issue + * @property { AMSInstructionsDocumentSignedByResponseDTO } signedBy Signed by + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } deliveryBusinessPartner Delivery business partner + * @property { AMSInstructionsDocumentCityResponseDTO } placeOfAcceptance Port of acceptance + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party + * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Also notify party + * @property { string } applyTo Apply to + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string[] } availableContainerNumbers Available container numbers + * @property { string[] } selectedContainerNumbers Selected container numbers + * @property { string[] } selectedContainerLabels Selected container labels + * @property { AMSInstructionsDocumentCargoDTO[] } cargo Cargo information + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + */ +export const AMSInstructionsDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), versionNumber: z.number(), additionalAMSText: CommonModels.EditorContentResponseDtoSchema.nullish(), principalName: z.string().nullish(), blNumber: z.string().nullish(), vessel: z.string().nullish(), portOfLoading: AMSInstructionsDocumentPortResponseDTOSchema.nullish(), placeOfDelivery: AMSInstructionsDocumentCityResponseDTOSchema.nullish(), portOfDischarge: AMSInstructionsDocumentPortResponseDTOSchema.nullish(), placeOfIssue: AMSInstructionsDocumentCityResponseDTOSchema.nullish(), dateOfIssue: z.iso.datetime({ offset: true }).nullish(), signedBy: AMSInstructionsDocumentSignedByResponseDTOSchema.nullish(), deliveryBusinessPartner: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), placeOfAcceptance: AMSInstructionsDocumentCityResponseDTOSchema.nullish(), consignee: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), notify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), alsoNotify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), applyTo: z.string().nullish(), suppressWeight: z.boolean().nullish(), suppressMeasurement: z.boolean().nullish(), availableContainerNumbers: z.array(z.string()).nullish(), selectedContainerNumbers: z.array(z.string()).nullish(), selectedContainerLabels: z.array(z.string()).nullish(), cargo: z.array(AMSInstructionsDocumentCargoDTOSchema).nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.DocumentConfigDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), updatedAt: z.iso.datetime({ offset: true }).nullish() }); +export type AMSInstructionsDocumentResponseDTO = z.infer; - /** - * UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema - >; +/** + * UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); +export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateAMSInstructionsDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { CommonModels.EditorContentUpdateDto } additionalAMSText Additional AMS text + * @property { string } principalName Principal name + * @property { string } blNumber Bill of lading number + * @property { string } vessel Vessel + * @property { string } portOfLoadingId Port of loading id + * @property { string } placeOfDeliveryId Place of delivery id + * @property { string } portOfDischargeId Port of discharge id + * @property { string } placeOfIssueId Place of issue + * @property { string } dateOfIssue Date of issue + * @property { string } signedById Signed by employee ID + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } deliveryBusinessPartner Delivery business partner + * @property { string } placeOfAcceptanceId Port of acceptance + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party + * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party + * @property { string } applyTo Apply to + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string[] } selectedContainerNumbers Selected container numbers + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { string } date Date of the AMS Instructions document + */ +export const UpdateAMSInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), additionalAMSText: CommonModels.EditorContentUpdateDtoSchema.nullable(), principalName: z.string().nullable(), blNumber: z.string().nullable(), vessel: z.string().nullable(), portOfLoadingId: z.string().nullable(), placeOfDeliveryId: z.string().nullable(), portOfDischargeId: z.string().nullable(), placeOfIssueId: z.string().nullable(), dateOfIssue: z.iso.datetime({ offset: true }).nullable(), signedById: z.string().nullable(), deliveryBusinessPartner: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), placeOfAcceptanceId: z.string().nullable(), consignee: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), notify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), alsoNotify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), applyTo: z.string().nullable(), suppressWeight: z.boolean().nullable(), suppressMeasurement: z.boolean().nullable(), selectedContainerNumbers: z.array(z.string()).nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); +export type UpdateAMSInstructionsDocumentRequestDTO = z.infer; - /** - * UpdateAMSInstructionsDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { CommonModels.EditorContentUpdateDto } additionalAMSText Additional AMS text - * @property { string } principalName Principal name - * @property { string } blNumber Bill of lading number - * @property { string } vessel Vessel - * @property { string } portOfLoadingId Port of loading id - * @property { string } placeOfDeliveryId Place of delivery id - * @property { string } portOfDischargeId Port of discharge id - * @property { string } placeOfIssueId Place of issue - * @property { string } dateOfIssue Date of issue - * @property { string } signedById Signed by employee ID - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } deliveryBusinessPartner Delivery business partner - * @property { string } placeOfAcceptanceId Port of acceptance - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party - * @property { string } applyTo Apply to - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string[] } selectedContainerNumbers Selected container numbers - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { string } date Date of the AMS Instructions document - */ - export const UpdateAMSInstructionsDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Document name suffix"), - additionalAMSText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional AMS text"), - principalName: z.string().describe("Principal name"), - blNumber: z.string().describe("Bill of lading number"), - vessel: z.string().describe("Vessel"), - portOfLoadingId: z.string().describe("Port of loading id"), - placeOfDeliveryId: z.string().describe("Place of delivery id"), - portOfDischargeId: z.string().describe("Port of discharge id"), - placeOfIssueId: z.string().describe("Place of issue"), - dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue"), - signedById: z.string().describe("Signed by employee ID"), - deliveryBusinessPartner: - UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Delivery business partner"), - placeOfAcceptanceId: z.string().describe("Port of acceptance"), - consignee: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), - shipper: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), - notify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party"), - alsoNotify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party"), - applyTo: z.string().describe("Apply to"), - suppressWeight: z.boolean().describe("Whether to suppress weight information"), - suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), - selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document"), - }) - .readonly(); - export type UpdateAMSInstructionsDocumentRequestDTO = z.infer; } diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts index 5337c6a..7af1284 100644 --- a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts +++ b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,303 +9,203 @@ import { CommonModels } from "@/data/common/common.models"; import { WorkingDocumentsAmsInstructionsApi } from "./workingDocumentsAmsInstructions.api"; export namespace WorkingDocumentsAmsInstructionsQueries { - export const moduleName = QueryModule.WorkingDocumentsAmsInstructions; +export const moduleName = QueryModule.WorkingDocumentsAmsInstructions; - export const keys = { +export const keys = { all: [moduleName] as const, - getAMSInstructionsData: (positionId: string, amsInstructionsId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId", - positionId, - amsInstructionsId, - officeId, - ] as const, - previewAMSInstructions: (positionId: string, amsInstructionsId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId/preview", - positionId, - amsInstructionsId, - officeId, - ] as const, - }; + getAMSInstructionsData: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId", positionId, amsInstructionsId, officeId] as const, + previewAMSInstructions: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId/preview", positionId, amsInstructionsId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an AMS Instructions document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetAMSInstructionsData` + * @summary Get AMS Instructions document data + * @permission Requires `canUseGetAMSInstructionsData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.amsInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetAMSInstructionsData = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData(positionId, amsInstructionsId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateAMSInstructionsData` + * @summary Update AMS Instructions document data + * @permission Requires `canUseUpdateAMSInstructionsData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateAMSInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData(positionId, amsInstructionsId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, amsInstructionsId, officeId } = variables; + const updateKeys = [keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteAMSInstructions` + * @summary Delete AMS Instructions document + * @permission Requires `canUseDeleteAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } AMS Instructions document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions(positionId, amsInstructionsId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewAMSInstructions` - recommended when file should be cached + * @summary Preview AMS Instructions document + * @permission Requires `canUsePreviewAMSInstructions` ability + * @param { string } object.positionId Path parameter + * @param { string } object.amsInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewAMSInstructions = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewAMSInstructionsMutation` - recommended when file should not be cached + * @summary Preview AMS Instructions document + * @permission Requires `canUsePreviewAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewAMSInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, amsInstructionsId, officeId } = variables; + const updateKeys = [keys.previewAMSInstructions(positionId, amsInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateAMSInstructions` + * @summary Generate AMS Instructions document + * @permission Requires `canUseGenerateAMSInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.amsInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId } )); + return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions(positionId, amsInstructionsId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create an AMS Instructions document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof WorkingDocumentsAmsInstructionsApi.create, - { positionId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId })); - return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetAMSInstructionsData` - * @summary Get AMS Instructions document data - * @permission Requires `canUseGetAMSInstructionsData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.amsInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetAMSInstructionsData = ( - { positionId, amsInstructionsId, officeId }: { positionId: string; amsInstructionsId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId })); - return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData( - positionId, - amsInstructionsId, - officeId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateAMSInstructionsData` - * @summary Update AMS Instructions document data - * @permission Requires `canUseUpdateAMSInstructionsData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateAMSInstructionsData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData, - { - positionId: string; - amsInstructionsId: string; - officeId: string; - data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId })); - return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData( - positionId, - amsInstructionsId, - officeId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, amsInstructionsId, officeId } = variables; - const updateKeys = [keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteAMSInstructions` - * @summary Delete AMS Instructions document - * @permission Requires `canUseDeleteAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } AMS Instructions document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteAMSInstructions = ( - options?: AppMutationOptions< - typeof WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions, - { positionId: string; amsInstructionsId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId })); - return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions( - positionId, - amsInstructionsId, - officeId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewAMSInstructions` - recommended when file should be cached - * @summary Preview AMS Instructions document - * @permission Requires `canUsePreviewAMSInstructions` ability - * @param { string } object.positionId Path parameter - * @param { string } object.amsInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewAMSInstructions = ( - { positionId, amsInstructionsId, officeId }: { positionId: string; amsInstructionsId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId })); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions( - positionId, - amsInstructionsId, - officeId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewAMSInstructionsMutation` - recommended when file should not be cached - * @summary Preview AMS Instructions document - * @permission Requires `canUsePreviewAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewAMSInstructionsMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsAmsInstructionsApi.previewAMSInstructions, - { positionId: string; amsInstructionsId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId })); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions( - positionId, - amsInstructionsId, - officeId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, amsInstructionsId, officeId } = variables; - const updateKeys = [keys.previewAMSInstructions(positionId, amsInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateAMSInstructions` - * @summary Generate AMS Instructions document - * @permission Requires `canUseGenerateAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateAMSInstructions = ( - options?: AppMutationOptions< - typeof WorkingDocumentsAmsInstructionsApi.generateAMSInstructions, - { - positionId: string; - amsInstructionsId: string; - officeId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId })); - return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions( - positionId, - amsInstructionsId, - officeId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts index 11d2d8f..a026b68 100644 --- a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts +++ b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts @@ -1,108 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsBlInstructionsAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Create", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Create", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `useGetBlInstructionsData` query ability. For global ability, omit the object parameter. - * @description Read BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBlInstructionsData` query - */ - export const canUseGetBlInstructionsData = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `useGetBlInstructionsData` query ability. For global ability, omit the object parameter. + * @description Read BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBlInstructionsData` query + */ +export const canUseGetBlInstructionsData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `useUpdateBlInstructionsData` mutation ability. For global ability, omit the object parameter. - * @description Update BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBlInstructionsData` mutation - */ - export const canUseUpdateBlInstructionsData = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `useUpdateBlInstructionsData` mutation ability. For global ability, omit the object parameter. + * @description Update BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBlInstructionsData` mutation + */ +export const canUseUpdateBlInstructionsData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `useDeleteBlInstructions` mutation ability. For global ability, omit the object parameter. - * @description Delete BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBlInstructions` mutation - */ - export const canUseDeleteBlInstructions = (object?: { officeId: string }) => - [ - "Delete", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Delete", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `useDeleteBlInstructions` mutation ability. For global ability, omit the object parameter. + * @description Delete BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBlInstructions` mutation + */ +export const canUseDeleteBlInstructions = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation - */ - export const canUsePreviewBlInstructions = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation + */ +export const canUsePreviewBlInstructions = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `useGenerateBlInstructions` mutation ability. For global ability, omit the object parameter. - * @description Generate BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateBlInstructions` mutation - */ - export const canUseGenerateBlInstructions = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; +/** + * Use for `useGenerateBlInstructions` mutation ability. For global ability, omit the object parameter. + * @description Generate BL Instructions document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateBlInstructions` mutation + */ +export const canUseGenerateBlInstructions = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; + +/** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate BL Instructions document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ +export const canUseGenerateDocumentEml = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" +] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - /** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate BL Instructions document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ - export const canUseGenerateDocumentEml = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts index ff9b232..38303db 100644 --- a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts +++ b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts @@ -1,116 +1,72 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsBlInstructionsApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions`, - undefined, - config, - ); - }; - - export const getBlInstructionsData = ( - positionId: string, - blInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions`, + + ) +}; +export const getBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - config, - ); - }; - - export const updateBlInstructionsData = ( - positionId: string, - blInstructionsId: string, - officeId: string, - data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + + ) +}; +export const updateBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, ) => { return AppRestClient.patch( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), - config, - ); - }; - - export const deleteBlInstructions = ( - positionId: string, - blInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), + + ) +}; +export const deleteBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - undefined, - config, - ); - }; - - export const previewBlInstructions = ( - positionId: string, - blInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, + + ) +}; +export const previewBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generateBlInstructions = ( - positionId: string, - blInstructionsId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; - - export const generateDocumentEml = ( - positionId: string, - blInstructionsId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; +export const generateDocumentEml = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; } diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts index f1fe31c..cfea1e8 100644 --- a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts +++ b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts @@ -2,471 +2,259 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsBlInstructionsModels { - /** - * BlInstructionsDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { string } date Date - * @property { string } location Location - * @property { string } signer Siger - */ - export const BlInstructionsDocumentSettingsDtoDTOSchema = z - .object({ - quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), - date: z.iso.datetime({ offset: true }).describe("Date"), - location: z.string().describe("Location"), - signer: z.string().describe("Siger"), - }) - .readonly(); - export type BlInstructionsDocumentSettingsDtoDTO = z.infer; +/** + * BlInstructionsDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { string } date Date + * @property { string } location Location + * @property { string } signer Siger + */ +export const BlInstructionsDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), date: z.iso.datetime({ offset: true }).nullable(), location: z.string().nullable(), signer: z.string().nullable() }).partial(); +export type BlInstructionsDocumentSettingsDtoDTO = z.infer; - /** - * BlInstructionsDocumentCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ - export const BlInstructionsDocumentCountryResponseDTOSchema = z - .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) - .readonly(); - export type BlInstructionsDocumentCountryResponseDTO = z.infer; +/** + * BlInstructionsDocumentCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ +export const BlInstructionsDocumentCountryResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type BlInstructionsDocumentCountryResponseDTO = z.infer; - /** - * BlInstructionsDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - * @property { string } eori EORI number of the business partner - * @property { string } vatNumber VAT number of the business partner - */ - export const BlInstructionsDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - eori: z.string().describe("EORI number of the business partner"), - vatNumber: z.string().describe("VAT number of the business partner"), - }) - .readonly(); - export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer< - typeof BlInstructionsDocumentBusinessPartnerResponseDTOSchema - >; +/** + * BlInstructionsDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + * @property { string } eori EORI number of the business partner + * @property { string } vatNumber VAT number of the business partner + */ +export const BlInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable(), eori: z.string().nullable(), vatNumber: z.string().nullable() }).partial(); +export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer; - /** - * BlInstructionsDocumentPlaceResponseDTOSchema - * @type { object } - * @property { string } id ID of the place - * @property { string } name Name of the place - */ - export const BlInstructionsDocumentPlaceResponseDTOSchema = z - .object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }) - .readonly(); - export type BlInstructionsDocumentPlaceResponseDTO = z.infer; +/** + * BlInstructionsDocumentPlaceResponseDTOSchema + * @type { object } + * @property { string } id ID of the place + * @property { string } name Name of the place + */ +export const BlInstructionsDocumentPlaceResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type BlInstructionsDocumentPlaceResponseDTO = z.infer; - /** - * AllChargesEnumSchema - * @type { enum } - */ - export const AllChargesEnumSchema = z.enum(["Prepaid", "Collect", "Automatic", "Detailed"]); - export type AllChargesEnum = z.infer; - export const AllChargesEnum = AllChargesEnumSchema.enum; +/** + * AllChargesEnumSchema + * @type { enum } + */ +export const AllChargesEnumSchema = z.enum(["Prepaid", "Collect", "Automatic", "Detailed"]); +export type AllChargesEnum = z.infer; +export const AllChargesEnum = AllChargesEnumSchema.enum; - /** - * BlInstructionsDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - * @property { string } countryCode Country ISO2 code of the port - */ - export const BlInstructionsDocumentPortResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the port"), - name: z.string().describe("Name of the port"), - countryCode: z.string().describe("Country ISO2 code of the port"), - }) - .readonly(); - export type BlInstructionsDocumentPortResponseDTO = z.infer; +/** + * BlInstructionsDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + * @property { string } countryCode Country ISO2 code of the port + */ +export const BlInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), countryCode: z.string().nullable() }).partial(); +export type BlInstructionsDocumentPortResponseDTO = z.infer; - /** - * RequestedDocumentTypeEnumSchema - * @type { enum } - */ - export const RequestedDocumentTypeEnumSchema = z.enum(["SeawayBill", "Original"]); - export type RequestedDocumentTypeEnum = z.infer; - export const RequestedDocumentTypeEnum = RequestedDocumentTypeEnumSchema.enum; +/** + * RequestedDocumentTypeEnumSchema + * @type { enum } + */ +export const RequestedDocumentTypeEnumSchema = z.enum(["SeawayBill", "Original"]); +export type RequestedDocumentTypeEnum = z.infer; +export const RequestedDocumentTypeEnum = RequestedDocumentTypeEnumSchema.enum; - /** - * ManifestFilerStatusEnumSchema - * @type { enum } - */ - export const ManifestFilerStatusEnumSchema = z.enum(["Self", "Carrier"]); - export type ManifestFilerStatusEnum = z.infer; - export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; +/** + * ManifestFilerStatusEnumSchema + * @type { enum } + */ +export const ManifestFilerStatusEnumSchema = z.enum(["Self", "Carrier"]); +export type ManifestFilerStatusEnum = z.infer; +export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; - /** - * BlInstructionsDocumentCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type BlInstructionsDocumentCountryDto = z.infer; +/** + * BlInstructionsDocumentCountryDtoSchema + * @type { object } + * @property { string } id + * @property { string } name + */ +export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); +export type BlInstructionsDocumentCountryDto = z.infer; - /** - * BlInstructionsDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the BL Instructions document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the BL Instructions document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } date Date of the BL Instructions document - * @property { string } blNumber Bill of lading number - * @property { string } exportReference Export reference number - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { BlInstructionsDocumentCountryResponseDTO } originCountry Origin country - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } additionalText Additional text for the document - * @property { number } versionNumber Version number of the document - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } buyer Buyer information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } seller Seller information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } forwarder Forwarder party information - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information - * @property { BlInstructionsDocumentPlaceResponseDTO } stowedIntoContainerCity Stowed into container city information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfAcceptanceCity Place of acceptance city information - * @property { BlInstructionsDocumentPlaceResponseDTO } originalsToBeReleasedAt - * @property { string } originalsToBeReleasedAtText - * @property { BlInstructionsDocumentPlaceResponseDTO } loadingPierTerminal - * @property { string } loadingPierTerminalText - * @property { string } precarriageByText - * @property { string } placeOfReceiptText - * @property { string } portOfLoadingText - * @property { string } portOfDischargeText - * @property { string } placeOfDeliveryText - * @property { string } vessel Name of the vessel - * @property { string } voyage Name of the vessel - * @property { CommonModels.MovementTypeEnum } movementType - * @property { string } carrierBookingNumber - * @property { string } csnNumber - * @property { string } mcinNumber - * @property { string } pcinNumber - * @property { string } dueNumber - * @property { boolean } goodsDeliveredInEu - * @property { string } rucNumber - * @property { number } shipmentDeclaredValue - * @property { string } shipmentDeclaredValueCurrency - * @property { AllChargesEnum } allCharges Base freight payment term - * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term - * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term - * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term - * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term - * @property { string } shippingInstructionsComments Free-text shipping instructions comments - * @property { string } chargePayerId Charge payer business partner ID - * @property { string } chargePayLocationId Charge pay location ID - * @property { BlInstructionsDocumentPortResponseDTO } portOfLoading Port of loading information - * @property { BlInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information - * @property { BlInstructionsDocumentSettingsDtoDTO } settings Settings for the BL Instructions document - * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data - * @property { CommonModels.CargoTableBlockDto } cargo Cargo table block (identical to House BL cargo) - * @property { string } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document - * @property { RequestedDocumentTypeEnum } requestedDocumentType - * @property { boolean } requestedDocumentFreighted - * @property { number } requestedDocumentQuantity - * @property { ManifestFilerStatusEnum } manifestFilerStatus - * @property { string } manifestFilerIdentifier - * @property { BlInstructionsDocumentCountryDto } manifestFilingCountry - */ - export const BlInstructionsDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the BL Instructions document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference").nullish(), - name: z.string().describe("Name of the BL Instructions document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document").nullish(), - blNumber: z.string().describe("Bill of lading number").nullish(), - exportReference: z.string().describe("Export reference number").nullish(), - direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), - transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), - originCountry: BlInstructionsDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), - useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), - additionalText: z.string().describe("Additional text for the document").nullish(), - versionNumber: z.number().describe("Version number of the document"), - buyer: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( - "Buyer information for the shipment", - ).nullish(), - seller: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( - "Seller information for the shipment", - ).nullish(), - consignee: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( - "Consignee information for the shipment", - ), - shipper: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), - notify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( - "Notify party information for the shipment", - ), - alsoNotify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( - "Additional notify party information", - ), - forwarder: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Forwarder party information"), - precarriageBy: - BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), - placeOfReceipt: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), - stowedIntoContainerCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe( - "Stowed into container city information", - ).nullish(), - placeOfAcceptanceCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe( - "Place of acceptance city information", - ).nullish(), - originalsToBeReleasedAt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), - originalsToBeReleasedAtText: z.string().nullish(), - loadingPierTerminal: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), - loadingPierTerminalText: z.string().nullish(), - precarriageByText: z.string().nullish(), - placeOfReceiptText: z.string().nullish(), - portOfLoadingText: z.string().nullish(), - portOfDischargeText: z.string().nullish(), - placeOfDeliveryText: z.string().nullish(), - vessel: z.string().describe("Name of the vessel").nullish(), - voyage: z.string().describe("Name of the vessel").nullish(), - movementType: CommonModels.MovementTypeEnumSchema.nullish(), - carrierBookingNumber: z.string().nullish(), - csnNumber: z.string().nullish(), - mcinNumber: z.string().nullish(), - pcinNumber: z.string().nullish(), - dueNumber: z.string().nullish(), - goodsDeliveredInEu: z.boolean().nullish(), - rucNumber: z.string().nullish(), - shipmentDeclaredValue: z.number().nullish(), - shipmentDeclaredValueCurrency: z.string().nullish(), - allCharges: AllChargesEnumSchema.describe("Base freight payment term").nullish(), - baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term").nullish(), - additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term").nullish(), - originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( - "Origin haulage charges payment term", - ).nullish(), - originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term").nullish(), - destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe( - "Destination port charges payment term", - ).nullish(), - destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( - "Destination haulage charges payment term", - ).nullish(), - shippingInstructionsComments: z.string().describe("Free-text shipping instructions comments").nullish(), - chargePayerId: z.string().describe("Charge payer business partner ID").nullish(), - chargePayLocationId: z.string().describe("Charge pay location ID").nullish(), - portOfLoading: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), - portOfDischarge: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), - placeOfDelivery: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), - settings: BlInstructionsDocumentSettingsDtoDTOSchema.describe( - "Settings for the BL Instructions document", - ).nullish(), - data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), - cargo: CommonModels.CargoTableBlockDtoSchema.describe( - "Cargo table block (identical to House BL cargo)", - ).nullish(), - bodyRemarks: z.string().describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document"), - requestedDocumentType: RequestedDocumentTypeEnumSchema.nullish(), - requestedDocumentFreighted: z.boolean().nullish(), - requestedDocumentQuantity: z.number().nullish(), - manifestFilerStatus: ManifestFilerStatusEnumSchema.nullish(), - manifestFilerIdentifier: z.string().nullish(), - manifestFilingCountry: BlInstructionsDocumentCountryDtoSchema.nullish(), - }) - .readonly(); - export type BlInstructionsDocumentResponseDTO = z.infer; +/** + * BlInstructionsDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the BL Instructions document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the BL Instructions document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } date Date of the BL Instructions document + * @property { string } blNumber Bill of lading number + * @property { string } exportReference Export reference number + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { BlInstructionsDocumentCountryResponseDTO } originCountry Origin country + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } additionalText Additional text for the document + * @property { number } versionNumber Version number of the document + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } buyer Buyer information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } seller Seller information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } forwarder Forwarder party information + * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information + * @property { BlInstructionsDocumentPlaceResponseDTO } stowedIntoContainerCity Stowed into container city information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfAcceptanceCity Place of acceptance city information + * @property { BlInstructionsDocumentPlaceResponseDTO } originalsToBeReleasedAt + * @property { string } originalsToBeReleasedAtText + * @property { BlInstructionsDocumentPlaceResponseDTO } loadingPierTerminal + * @property { string } loadingPierTerminalText + * @property { string } precarriageByText + * @property { string } placeOfReceiptText + * @property { string } portOfLoadingText + * @property { string } portOfDischargeText + * @property { string } placeOfDeliveryText + * @property { string } vessel Name of the vessel + * @property { string } voyage Name of the vessel + * @property { CommonModels.MovementTypeEnum } movementType + * @property { string } carrierBookingNumber + * @property { string } csnNumber + * @property { string } mcinNumber + * @property { string } pcinNumber + * @property { string } dueNumber + * @property { boolean } goodsDeliveredInEu + * @property { string } rucNumber + * @property { number } shipmentDeclaredValue + * @property { string } shipmentDeclaredValueCurrency + * @property { AllChargesEnum } allCharges Base freight payment term + * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term + * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term + * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term + * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term + * @property { string } shippingInstructionsComments Free-text shipping instructions comments + * @property { string } chargePayerId Charge payer business partner ID + * @property { string } chargePayLocationId Charge pay location ID + * @property { BlInstructionsDocumentPortResponseDTO } portOfLoading Port of loading information + * @property { BlInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge information + * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information + * @property { BlInstructionsDocumentSettingsDtoDTO } settings Settings for the BL Instructions document + * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data + * @property { CommonModels.CargoTableBlockDto } cargo Cargo table block (identical to House BL cargo) + * @property { string } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document + * @property { RequestedDocumentTypeEnum } requestedDocumentType + * @property { boolean } requestedDocumentFreighted + * @property { number } requestedDocumentQuantity + * @property { ManifestFilerStatusEnum } manifestFilerStatus + * @property { string } manifestFilerIdentifier + * @property { BlInstructionsDocumentCountryDto } manifestFilingCountry + */ +export const BlInstructionsDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).nullish(), blNumber: z.string().nullish(), exportReference: z.string().nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), originCountry: BlInstructionsDocumentCountryResponseDTOSchema.nullish(), useLatterOfCredit: z.boolean().nullish(), additionalText: z.string().nullish(), versionNumber: z.number(), buyer: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), seller: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, shipper: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, notify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, alsoNotify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, forwarder: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, precarriageBy: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), placeOfReceipt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), stowedIntoContainerCity: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), placeOfAcceptanceCity: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAtText: z.string().nullish(), loadingPierTerminal: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), loadingPierTerminalText: z.string().nullish(), precarriageByText: z.string().nullish(), placeOfReceiptText: z.string().nullish(), portOfLoadingText: z.string().nullish(), portOfDischargeText: z.string().nullish(), placeOfDeliveryText: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), movementType: CommonModels.MovementTypeEnumSchema.nullish(), carrierBookingNumber: z.string().nullish(), csnNumber: z.string().nullish(), mcinNumber: z.string().nullish(), pcinNumber: z.string().nullish(), dueNumber: z.string().nullish(), goodsDeliveredInEu: z.boolean().nullish(), rucNumber: z.string().nullish(), shipmentDeclaredValue: z.number().nullish(), shipmentDeclaredValueCurrency: z.string().nullish(), allCharges: AllChargesEnumSchema.nullish(), baseFreight: CommonModels.ChargePaymentEnumSchema.nullish(), additionalCharges: CommonModels.ChargePaymentEnumSchema.nullish(), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullish(), originPortCharges: CommonModels.ChargePaymentEnumSchema.nullish(), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.nullish(), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullish(), shippingInstructionsComments: z.string().nullish(), chargePayerId: z.string().nullish(), chargePayLocationId: z.string().nullish(), portOfLoading: BlInstructionsDocumentPortResponseDTOSchema.nullish(), portOfDischarge: BlInstructionsDocumentPortResponseDTOSchema.nullish(), placeOfDelivery: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), settings: BlInstructionsDocumentSettingsDtoDTOSchema.nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.nullish(), cargo: CommonModels.CargoTableBlockDtoSchema.nullish(), bodyRemarks: z.string().nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.DocumentConfigDTOSchema, requestedDocumentType: RequestedDocumentTypeEnumSchema.nullish(), requestedDocumentFreighted: z.boolean().nullish(), requestedDocumentQuantity: z.number().nullish(), manifestFilerStatus: ManifestFilerStatusEnumSchema.nullish(), manifestFilerIdentifier: z.string().nullish(), manifestFilingCountry: BlInstructionsDocumentCountryDtoSchema.nullish() }); +export type BlInstructionsDocumentResponseDTO = z.infer; - /** - * UpdateBlInstructionsDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { string } blNumber BL number - * @property { string } exportReference Export reference number - * @property { string } location Location - * @property { string } signer Signer - * @property { string } date Date - */ - export const UpdateBlInstructionsDocumentSettingsRequestDTOSchema = z - .object({ - quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), - blNumber: z.string().describe("BL number"), - exportReference: z.string().describe("Export reference number"), - location: z.string().describe("Location"), - signer: z.string().describe("Signer"), - date: z.iso.datetime({ offset: true }).describe("Date"), - }) - .readonly(); - export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer< - typeof UpdateBlInstructionsDocumentSettingsRequestDTOSchema - >; +/** + * UpdateBlInstructionsDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { string } blNumber BL number + * @property { string } exportReference Export reference number + * @property { string } location Location + * @property { string } signer Signer + * @property { string } date Date + */ +export const UpdateBlInstructionsDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), blNumber: z.string().nullable(), exportReference: z.string().nullable(), location: z.string().nullable(), signer: z.string().nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); +export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer; - /** - * UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema - >; +/** + * UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); +export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateBlInstructionsDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } blNumber Bill of lading number + * @property { string } exportReference Export reference number + * @property { string } csnNumber + * @property { string } mcinNumber + * @property { string } pcinNumber + * @property { string } dueNumber + * @property { boolean } goodsDeliveredInEu + * @property { string } rucNumber + * @property { string } shipmentDeclaredValueCurrency + * @property { number } shipmentDeclaredValue + * @property { AllChargesEnum } allCharges All charges payment term + * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term + * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term + * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term + * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term + * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term + * @property { string } originCountryId Origin country ID + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } additionalText Additional text + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } buyer Buyer information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } seller Seller information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } forwarder Forwarder information + * @property { string } originalsToBeReleasedAtId Originals to be released at ID + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party information + * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information + * @property { string } shippingInstructionsComments Shipping instructions free-text comments + * @property { string } chargePayerId Charge payer business partner ID + * @property { string } chargePayLocationId Charge pay location ID + * @property { string } precarriageById Pre-carriage by ID + * @property { string } placeOfReceiptId Place of receipt ID + * @property { string } stowedIntoContainerCityId Stowed into container city ID + * @property { string } loadingPierTerminalId Loading pier/terminal ID + * @property { string } loadingPierTerminalText + * @property { string } placeOfAcceptanceCityId Place of acceptance city ID + * @property { string } vessel Vessel name + * @property { string } voyage Vessel name + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } portOfLoadingId Port of loading ID + * @property { string } portOfDischargeId Port of discharge ID + * @property { string } placeOfDeliveryId Place of delivery ID + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { string } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { string } date Date of the BL Instructions document + * @property { UpdateBlInstructionsDocumentSettingsRequestDTO } settings Settings + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data + * @property { RequestedDocumentTypeEnum } requestedDocumentType + * @property { boolean } requestedDocumentFreighted + * @property { number } requestedDocumentQuantity + * @property { string } precarriageByText + * @property { string } placeOfReceiptText + * @property { string } portOfLoadingText + * @property { string } portOfDischargeText + * @property { string } placeOfDeliveryText + * @property { ManifestFilerStatusEnum } manifestFilerStatus + * @property { string } manifestFilingCountryId + * @property { string } manifestFilerIdentifier + */ +export const UpdateBlInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), blNumber: z.string().nullable(), exportReference: z.string().nullable(), csnNumber: z.string().nullable(), mcinNumber: z.string().nullable(), pcinNumber: z.string().nullable(), dueNumber: z.string().nullable(), goodsDeliveredInEu: z.boolean().nullable(), rucNumber: z.string().nullable(), shipmentDeclaredValueCurrency: z.string().nullable(), shipmentDeclaredValue: z.number().nullable(), allCharges: AllChargesEnumSchema.nullable(), baseFreight: CommonModels.ChargePaymentEnumSchema.nullable(), additionalCharges: CommonModels.ChargePaymentEnumSchema.nullable(), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullable(), originPortCharges: CommonModels.ChargePaymentEnumSchema.nullable(), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.nullable(), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullable(), originCountryId: z.string().nullable(), useLatterOfCredit: z.boolean().nullable(), additionalText: z.string().nullable(), consignee: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), buyer: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), seller: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), forwarder: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), originalsToBeReleasedAtId: z.string().nullable(), originalsToBeReleasedAtText: z.string().nullable(), notify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), alsoNotify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), shippingInstructionsComments: z.string().nullable(), chargePayerId: z.string().nullable(), chargePayLocationId: z.string().nullable(), precarriageById: z.string().nullable(), placeOfReceiptId: z.string().nullable(), stowedIntoContainerCityId: z.string().nullable(), loadingPierTerminalId: z.string().nullable(), loadingPierTerminalText: z.string().nullable(), placeOfAcceptanceCityId: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), carrierBookingNumber: z.string().nullable(), portOfLoadingId: z.string().nullable(), portOfDischargeId: z.string().nullable(), placeOfDeliveryId: z.string().nullable(), suppressWeight: z.boolean().nullable(), suppressMeasurement: z.boolean().nullable(), bodyRemarks: z.string().nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), date: z.iso.datetime({ offset: true }).nullable(), settings: UpdateBlInstructionsDocumentSettingsRequestDTOSchema.nullable(), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.nullable(), requestedDocumentType: RequestedDocumentTypeEnumSchema.nullable(), requestedDocumentFreighted: z.boolean().nullable(), requestedDocumentQuantity: z.number().nullable(), precarriageByText: z.string().nullable(), placeOfReceiptText: z.string().nullable(), portOfLoadingText: z.string().nullable(), portOfDischargeText: z.string().nullable(), placeOfDeliveryText: z.string().nullable(), manifestFilerStatus: ManifestFilerStatusEnumSchema.nullable(), manifestFilingCountryId: z.string().nullable(), manifestFilerIdentifier: z.string().nullable() }).partial(); +export type UpdateBlInstructionsDocumentRequestDTO = z.infer; - /** - * UpdateBlInstructionsDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } blNumber Bill of lading number - * @property { string } exportReference Export reference number - * @property { string } csnNumber - * @property { string } mcinNumber - * @property { string } pcinNumber - * @property { string } dueNumber - * @property { boolean } goodsDeliveredInEu - * @property { string } rucNumber - * @property { string } shipmentDeclaredValueCurrency - * @property { number } shipmentDeclaredValue - * @property { AllChargesEnum } allCharges All charges payment term - * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term - * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term - * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term - * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term - * @property { string } originCountryId Origin country ID - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } additionalText Additional text - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } buyer Buyer information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } seller Seller information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } forwarder Forwarder information - * @property { string } originalsToBeReleasedAtId Originals to be released at ID - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information - * @property { string } shippingInstructionsComments Shipping instructions free-text comments - * @property { string } chargePayerId Charge payer business partner ID - * @property { string } chargePayLocationId Charge pay location ID - * @property { string } precarriageById Pre-carriage by ID - * @property { string } placeOfReceiptId Place of receipt ID - * @property { string } stowedIntoContainerCityId Stowed into container city ID - * @property { string } loadingPierTerminalId Loading pier/terminal ID - * @property { string } loadingPierTerminalText - * @property { string } placeOfAcceptanceCityId Place of acceptance city ID - * @property { string } vessel Vessel name - * @property { string } voyage Vessel name - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } portOfLoadingId Port of loading ID - * @property { string } portOfDischargeId Port of discharge ID - * @property { string } placeOfDeliveryId Place of delivery ID - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { string } date Date of the BL Instructions document - * @property { UpdateBlInstructionsDocumentSettingsRequestDTO } settings Settings - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data - * @property { RequestedDocumentTypeEnum } requestedDocumentType - * @property { boolean } requestedDocumentFreighted - * @property { number } requestedDocumentQuantity - * @property { string } precarriageByText - * @property { string } placeOfReceiptText - * @property { string } portOfLoadingText - * @property { string } portOfDischargeText - * @property { string } placeOfDeliveryText - * @property { ManifestFilerStatusEnum } manifestFilerStatus - * @property { string } manifestFilingCountryId - * @property { string } manifestFilerIdentifier - */ - export const UpdateBlInstructionsDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Document name suffix"), - blNumber: z.string().describe("Bill of lading number"), - exportReference: z.string().describe("Export reference number"), - csnNumber: z.string(), - mcinNumber: z.string(), - pcinNumber: z.string(), - dueNumber: z.string(), - goodsDeliveredInEu: z.boolean(), - rucNumber: z.string(), - shipmentDeclaredValueCurrency: z.string(), - shipmentDeclaredValue: z.number(), - allCharges: AllChargesEnumSchema.describe("All charges payment term"), - baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term"), - additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term"), - originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin haulage charges payment term"), - originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term"), - destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination port charges payment term"), - destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( - "Destination haulage charges payment term", - ), - originCountryId: z.string().describe("Origin country ID"), - useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), - additionalText: z.string().describe("Additional text"), - consignee: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), - shipper: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), - buyer: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), - seller: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), - forwarder: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), - originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), - originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), - notify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), - alsoNotify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), - shippingInstructionsComments: z.string().describe("Shipping instructions free-text comments"), - chargePayerId: z.string().describe("Charge payer business partner ID"), - chargePayLocationId: z.string().describe("Charge pay location ID"), - precarriageById: z.string().describe("Pre-carriage by ID"), - placeOfReceiptId: z.string().describe("Place of receipt ID"), - stowedIntoContainerCityId: z.string().describe("Stowed into container city ID"), - loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), - loadingPierTerminalText: z.string(), - placeOfAcceptanceCityId: z.string().describe("Place of acceptance city ID"), - vessel: z.string().describe("Vessel name"), - voyage: z.string().describe("Vessel name"), - carrierBookingNumber: z.string().describe("Carrier booking number"), - portOfLoadingId: z.string().describe("Port of loading ID"), - portOfDischargeId: z.string().describe("Port of discharge ID"), - placeOfDeliveryId: z.string().describe("Place of delivery ID"), - suppressWeight: z.boolean().describe("Whether to suppress weight information"), - suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), - bodyRemarks: z.string().describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document"), - settings: UpdateBlInstructionsDocumentSettingsRequestDTOSchema.describe("Settings"), - data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), - requestedDocumentType: RequestedDocumentTypeEnumSchema, - requestedDocumentFreighted: z.boolean(), - requestedDocumentQuantity: z.number(), - precarriageByText: z.string(), - placeOfReceiptText: z.string(), - portOfLoadingText: z.string(), - portOfDischargeText: z.string(), - placeOfDeliveryText: z.string(), - manifestFilerStatus: ManifestFilerStatusEnumSchema, - manifestFilingCountryId: z.string(), - manifestFilerIdentifier: z.string(), - }) - .readonly(); - export type UpdateBlInstructionsDocumentRequestDTO = z.infer; } diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts index 9736675..fcc46e2 100644 --- a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts +++ b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,332 +9,234 @@ import { CommonModels } from "@/data/common/common.models"; import { WorkingDocumentsBlInstructionsApi } from "./workingDocumentsBlInstructions.api"; export namespace WorkingDocumentsBlInstructionsQueries { - export const moduleName = QueryModule.WorkingDocumentsBlInstructions; +export const moduleName = QueryModule.WorkingDocumentsBlInstructions; - export const keys = { +export const keys = { all: [moduleName] as const, - getBlInstructionsData: (positionId: string, blInstructionsId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId", - positionId, - blInstructionsId, - officeId, - ] as const, - previewBlInstructions: (positionId: string, blInstructionsId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId/preview", - positionId, - blInstructionsId, - officeId, - ] as const, - }; + getBlInstructionsData: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId", positionId, blInstructionsId, officeId] as const, + previewBlInstructions: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId/preview", positionId, blInstructionsId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a BL Instructions document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId } )); + return WorkingDocumentsBlInstructionsApi.create(positionId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetBlInstructionsData` + * @summary Get BL Instructions document data + * @permission Requires `canUseGetBlInstructionsData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.blInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetBlInstructionsData = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId } )); + return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateBlInstructionsData` + * @summary Update BL Instructions document data + * @permission Requires `canUseUpdateBlInstructionsData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateBlInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId } )); + return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData(positionId, blInstructionsId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.getBlInstructionsData(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteBlInstructions` + * @summary Delete BL Instructions document + * @permission Requires `canUseDeleteBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } BL Instructions document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewBlInstructions` - recommended when file should be cached + * @summary Preview BL Instructions document + * @permission Requires `canUsePreviewBlInstructions` ability + * @param { string } object.positionId Path parameter + * @param { string } object.blInstructionsId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewBlInstructions = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewBlInstructionsMutation` - recommended when file should not be cached + * @summary Preview BL Instructions document + * @permission Requires `canUsePreviewBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewBlInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateBlInstructions` + * @summary Generate BL Instructions document + * @permission Requires `canUseGenerateBlInstructions` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId } )); + return WorkingDocumentsBlInstructionsApi.generateBlInstructions(positionId, blInstructionsId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate BL Instructions document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.blInstructionsId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { + checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId } )); + return WorkingDocumentsBlInstructionsApi.generateDocumentEml(positionId, blInstructionsId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, blInstructionsId, officeId } = variables; + const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create a BL Instructions document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.create, - { positionId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId })); - return WorkingDocumentsBlInstructionsApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetBlInstructionsData` - * @summary Get BL Instructions document data - * @permission Requires `canUseGetBlInstructionsData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.blInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetBlInstructionsData = ( - { positionId, blInstructionsId, officeId }: { positionId: string; blInstructionsId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId })); - return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateBlInstructionsData` - * @summary Update BL Instructions document data - * @permission Requires `canUseUpdateBlInstructionsData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBlInstructionsData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.updateBlInstructionsData, - { - positionId: string; - blInstructionsId: string; - officeId: string; - data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId })); - return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData( - positionId, - blInstructionsId, - officeId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.getBlInstructionsData(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteBlInstructions` - * @summary Delete BL Instructions document - * @permission Requires `canUseDeleteBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } BL Instructions document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteBlInstructions = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.deleteBlInstructions, - { positionId: string; blInstructionsId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId })); - return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewBlInstructions` - recommended when file should be cached - * @summary Preview BL Instructions document - * @permission Requires `canUsePreviewBlInstructions` ability - * @param { string } object.positionId Path parameter - * @param { string } object.blInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewBlInstructions = ( - { positionId, blInstructionsId, officeId }: { positionId: string; blInstructionsId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId })); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewBlInstructionsMutation` - recommended when file should not be cached - * @summary Preview BL Instructions document - * @permission Requires `canUsePreviewBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewBlInstructionsMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.previewBlInstructions, - { positionId: string; blInstructionsId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId })); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateBlInstructions` - * @summary Generate BL Instructions document - * @permission Requires `canUseGenerateBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateBlInstructions = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.generateBlInstructions, - { - positionId: string; - blInstructionsId: string; - officeId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId })); - return WorkingDocumentsBlInstructionsApi.generateBlInstructions( - positionId, - blInstructionsId, - officeId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate BL Instructions document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGenerateDocumentEml = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.generateDocumentEml, - { - positionId: string; - blInstructionsId: string; - officeId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId })); - return WorkingDocumentsBlInstructionsApi.generateDocumentEml( - positionId, - blInstructionsId, - officeId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts index 2e1de75..0454eb2 100644 --- a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts +++ b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts @@ -1,75 +1,82 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsCmrFormAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Create", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Create", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - /** - * Use for `useGetCmrData` query ability. For global ability, omit the object parameter. - * @description Read CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCmrData` query - */ - export const canUseGetCmrData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Read", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; +/** + * Use for `useGetCmrData` query ability. For global ability, omit the object parameter. + * @description Read CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCmrData` query + */ +export const canUseGetCmrData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - /** - * Use for `useUpdateCmrData` mutation ability. For global ability, omit the object parameter. - * @description Update CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCmrData` mutation - */ - export const canUseUpdateCmrData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Update", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; +/** + * Use for `useUpdateCmrData` mutation ability. For global ability, omit the object parameter. + * @description Update CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCmrData` mutation + */ +export const canUseUpdateCmrData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - /** - * Use for `useDeleteCmr` mutation ability. For global ability, omit the object parameter. - * @description Delete CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCmr` mutation - */ - export const canUseDeleteCmr = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Delete", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; +/** + * Use for `useDeleteCmr` mutation ability. For global ability, omit the object parameter. + * @description Delete CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCmr` mutation + */ +export const canUseDeleteCmr = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Delete", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - /** - * Use for `usePreviewCmr` query or `usePreviewCmrMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewCmr` query or `usePreviewCmrMutation` mutation - */ - export const canUsePreviewCmr = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Read", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; +/** + * Use for `usePreviewCmr` query or `usePreviewCmrMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewCmr` query or `usePreviewCmrMutation` mutation + */ +export const canUsePreviewCmr = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; + +/** + * Use for `useGenerateCmr` mutation ability. For global ability, omit the object parameter. + * @description Generate CMR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateCmr` mutation + */ +export const canUseGenerateCmr = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" +] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - /** - * Use for `useGenerateCmr` mutation ability. For global ability, omit the object parameter. - * @description Generate CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateCmr` mutation - */ - export const canUseGenerateCmr = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Update", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts index 982a193..2dc6978 100644 --- a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts +++ b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts @@ -1,79 +1,58 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsCmrFormApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs`, - undefined, - config, - ); - }; - - export const getCmrData = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs`, + + ) +}; +export const getCmrData = (positionId: string, cmrId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - config, - ); - }; - - export const updateCmrData = ( - positionId: string, - cmrId: string, - officeId: string, - data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + + ) +}; +export const updateCmrData = (positionId: string, cmrId: string, officeId: string, data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, ) => { return AppRestClient.patch( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), - config, - ); - }; - - export const deleteCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), + + ) +}; +export const deleteCmr = (positionId: string, cmrId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - undefined, - config, - ); - }; - - export const previewCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, + + ) +}; +export const previewCmr = (positionId: string, cmrId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generateCmr = ( - positionId: string, - cmrId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateCmr = (positionId: string, cmrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts index 4cc9266..c49f127 100644 --- a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts +++ b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts @@ -2,319 +2,186 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsCmrFormModels { - /** - * CmrDocumentLanguageSchema - * @type { enum } - */ - export const CmrDocumentLanguageSchema = z.enum(["en", "fr", "de"]); - export type CmrDocumentLanguage = z.infer; - export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; +/** + * CmrDocumentLanguageSchema + * @type { enum } + */ +export const CmrDocumentLanguageSchema = z.enum(["en", "fr", "de"]); +export type CmrDocumentLanguage = z.infer; +export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; - /** - * CmrDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CmrDocumentLanguage } primaryLanguage Primary language - * @property { CmrDocumentLanguage } secondaryLanguage Secondary language - */ - export const CmrDocumentSettingsDtoDTOSchema = z - .object({ - primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), - secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language"), - }) - .readonly(); - export type CmrDocumentSettingsDtoDTO = z.infer; +/** + * CmrDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CmrDocumentLanguage } primaryLanguage Primary language + * @property { CmrDocumentLanguage } secondaryLanguage Secondary language + */ +export const CmrDocumentSettingsDtoDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.nullable(), secondaryLanguage: CmrDocumentLanguageSchema.nullable() }).partial(); +export type CmrDocumentSettingsDtoDTO = z.infer; - /** - * CmrDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const CmrDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type CmrDocumentBusinessPartnerResponseDTO = z.infer; +/** + * CmrDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const CmrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); +export type CmrDocumentBusinessPartnerResponseDTO = z.infer; - /** - * CmrDocumentCityResponseDTOSchema - * @type { object } - * @property { string } cityId ID of the city - * @property { string } cityName Name of the city - * @property { string } date Date of delivery/takeover - * @property { string } countryName Country name - */ - export const CmrDocumentCityResponseDTOSchema = z - .object({ - cityId: z.string().describe("ID of the city"), - cityName: z.string().describe("Name of the city"), - date: z.iso.datetime({ offset: true }).describe("Date of delivery/takeover").nullish(), - countryName: z.string().describe("Country name").nullish(), - }) - .readonly(); - export type CmrDocumentCityResponseDTO = z.infer; +/** + * CmrDocumentCityResponseDTOSchema + * @type { object } + * @property { string } cityId ID of the city + * @property { string } cityName Name of the city + * @property { string } date Date of delivery/takeover + * @property { string } countryName Country name + */ +export const CmrDocumentCityResponseDTOSchema = z.object({ cityId: z.string(), cityName: z.string(), date: z.iso.datetime({ offset: true }).nullish(), countryName: z.string().nullish() }); +export type CmrDocumentCityResponseDTO = z.infer; - /** - * CmrDocumentCostsResponseDTOSchema - * @type { object } - * @property { number } carriageCharges Carriage charges - * @property { number } reductions Reductions - * @property { number } balance Balance - * @property { number } supplements Supplements - * @property { number } miscellaneous Miscellaneous charges - * @property { number } total Total amount - */ - export const CmrDocumentCostsResponseDTOSchema = z - .object({ - carriageCharges: z.number().describe("Carriage charges"), - reductions: z.number().describe("Reductions"), - balance: z.number().describe("Balance"), - supplements: z.number().describe("Supplements"), - miscellaneous: z.number().describe("Miscellaneous charges"), - total: z.number().describe("Total amount"), - }) - .readonly(); - export type CmrDocumentCostsResponseDTO = z.infer; +/** + * CmrDocumentCostsResponseDTOSchema + * @type { object } + * @property { number } carriageCharges Carriage charges + * @property { number } reductions Reductions + * @property { number } balance Balance + * @property { number } supplements Supplements + * @property { number } miscellaneous Miscellaneous charges + * @property { number } total Total amount + */ +export const CmrDocumentCostsResponseDTOSchema = z.object({ carriageCharges: z.number().nullable(), reductions: z.number().nullable(), balance: z.number().nullable(), supplements: z.number().nullable(), miscellaneous: z.number().nullable(), total: z.number().nullable() }).partial(); +export type CmrDocumentCostsResponseDTO = z.infer; - /** - * CmrDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { number } quantity Quantity of packages - * @property { string } description Description of the cargo - * @property { string } packageType - * @property { string } statisticNumber - * @property { string } positionNumber Position number of the cargo - * @property { number } grossWeight Gross weight of the cargo - * @property { number } volume Volume of the cargo - * @property { string } containerNumber Container number of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - */ - export const CmrDocumentCargoResponseDTOSchema = z - .object({ - caseMarks: z.string().describe("Case marks of the cargo"), - quantity: z.number().describe("Quantity of packages"), - description: z.string().describe("Description of the cargo"), - packageType: z.string(), - statisticNumber: z.string(), - positionNumber: z.string().describe("Position number of the cargo"), - grossWeight: z.number().describe("Gross weight of the cargo"), - volume: z.number().describe("Volume of the cargo"), - containerNumber: z.string().describe("Container number of the cargo"), - seal1: z.string().describe("Seal number 1 of the cargo"), - seal2: z.string().describe("Seal number 2 of the cargo"), - }) - .readonly(); - export type CmrDocumentCargoResponseDTO = z.infer; +/** + * CmrDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { number } quantity Quantity of packages + * @property { string } description Description of the cargo + * @property { string } packageType + * @property { string } statisticNumber + * @property { string } positionNumber Position number of the cargo + * @property { number } grossWeight Gross weight of the cargo + * @property { number } volume Volume of the cargo + * @property { string } containerNumber Container number of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + */ +export const CmrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().nullable(), quantity: z.number().nullable(), description: z.string().nullable(), packageType: z.string().nullable(), statisticNumber: z.string().nullable(), positionNumber: z.string().nullable(), grossWeight: z.number().nullable(), volume: z.number().nullable(), containerNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable() }).partial(); +export type CmrDocumentCargoResponseDTO = z.infer; - /** - * CmrDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } positionNumber Position number - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { number } versionNumber Version number of the document - * @property { string } cmrNumber CMR number - * @property { CmrDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { CmrDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { CmrDocumentBusinessPartnerResponseDTO } carrier Carrier information - * @property { CmrDocumentBusinessPartnerResponseDTO } successiveCarrier Successive carrier information - * @property { CmrDocumentCityResponseDTO } delivery Delivery information - * @property { CmrDocumentCityResponseDTO } takeover Takeover information - * @property { string } annexedDocuments Annexed documents - * @property { string } carriersObservations Carriers observations - * @property { string } senderInstructions Sender instructions - * @property { string } reimbursement Reimbursement information - * @property { string } specialAgreements Special agreements - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { boolean } freightPaid Whether freight is paid - * @property { boolean } freightToBePaid Whether freight is to be paid - * @property { string } creationPlace Place of creation - * @property { string } creationDate Date of creation - * @property { CmrDocumentCostsResponseDTO } costsForShipper Costs for shipper - * @property { CmrDocumentCostsResponseDTO } costsForConsignee Costs for consignee - * @property { string[] } selectedCargoIds List of selected cargo IDs - * @property { CmrDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CmrDocumentSettingsDtoDTO } settings Settings for the BL Instructions document - */ - export const CmrDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the document"), - name: z.string().describe("Name of the document"), - positionNumber: z.string().describe("Position number"), - nameSuffix: z.string().describe("Name suffix of the document").nullish(), - defaultFileName: z.string(), - positionId: z.string().describe("Position ID"), - versionNumber: z.number().describe("Version number of the document"), - cmrNumber: z.string().describe("CMR number").nullish(), - consignee: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), - shipper: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), - carrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Carrier information").nullish(), - successiveCarrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe( - "Successive carrier information", - ).nullish(), - delivery: CmrDocumentCityResponseDTOSchema.describe("Delivery information").nullish(), - takeover: CmrDocumentCityResponseDTOSchema.describe("Takeover information").nullish(), - annexedDocuments: z.string().describe("Annexed documents").nullish(), - carriersObservations: z.string().describe("Carriers observations").nullish(), - senderInstructions: z.string().describe("Sender instructions").nullish(), - reimbursement: z.string().describe("Reimbursement information").nullish(), - specialAgreements: z.string().describe("Special agreements").nullish(), - suppressWeight: z.boolean().describe("Whether to suppress weight information"), - suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), - freightPaid: z.boolean().describe("Whether freight is paid"), - freightToBePaid: z.boolean().describe("Whether freight is to be paid"), - creationPlace: z.string().describe("Place of creation"), - creationDate: z.string().describe("Date of creation"), - costsForShipper: CmrDocumentCostsResponseDTOSchema.describe("Costs for shipper").nullish(), - costsForConsignee: CmrDocumentCostsResponseDTOSchema.describe("Costs for consignee").nullish(), - selectedCargoIds: z.array(z.string()).readonly().describe("List of selected cargo IDs"), - cargo: z.array(CmrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), - config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - settings: CmrDocumentSettingsDtoDTOSchema.describe("Settings for the BL Instructions document").nullish(), - }) - .readonly(); - export type CmrDocumentResponseDTO = z.infer; +/** + * CmrDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } positionNumber Position number + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { number } versionNumber Version number of the document + * @property { string } cmrNumber CMR number + * @property { CmrDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { CmrDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { CmrDocumentBusinessPartnerResponseDTO } carrier Carrier information + * @property { CmrDocumentBusinessPartnerResponseDTO } successiveCarrier Successive carrier information + * @property { CmrDocumentCityResponseDTO } delivery Delivery information + * @property { CmrDocumentCityResponseDTO } takeover Takeover information + * @property { string } annexedDocuments Annexed documents + * @property { string } carriersObservations Carriers observations + * @property { string } senderInstructions Sender instructions + * @property { string } reimbursement Reimbursement information + * @property { string } specialAgreements Special agreements + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { boolean } freightPaid Whether freight is paid + * @property { boolean } freightToBePaid Whether freight is to be paid + * @property { string } creationPlace Place of creation + * @property { string } creationDate Date of creation + * @property { CmrDocumentCostsResponseDTO } costsForShipper Costs for shipper + * @property { CmrDocumentCostsResponseDTO } costsForConsignee Costs for consignee + * @property { string[] } selectedCargoIds List of selected cargo IDs + * @property { CmrDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CmrDocumentSettingsDtoDTO } settings Settings for the BL Instructions document + */ +export const CmrDocumentResponseDTOSchema = z.object({ id: z.string(), name: z.string(), positionNumber: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), positionId: z.string(), versionNumber: z.number(), cmrNumber: z.string().nullish(), consignee: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), carrier: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), successiveCarrier: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), delivery: CmrDocumentCityResponseDTOSchema.nullish(), takeover: CmrDocumentCityResponseDTOSchema.nullish(), annexedDocuments: z.string().nullish(), carriersObservations: z.string().nullish(), senderInstructions: z.string().nullish(), reimbursement: z.string().nullish(), specialAgreements: z.string().nullish(), suppressWeight: z.boolean(), suppressMeasurement: z.boolean(), freightPaid: z.boolean(), freightToBePaid: z.boolean(), creationPlace: z.string(), creationDate: z.string(), costsForShipper: CmrDocumentCostsResponseDTOSchema.nullish(), costsForConsignee: CmrDocumentCostsResponseDTOSchema.nullish(), selectedCargoIds: z.array(z.string()), cargo: z.array(CmrDocumentCargoResponseDTOSchema).nullish(), config: CommonModels.HBLDocumentConfigDtoSchema, bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), settings: CmrDocumentSettingsDtoDTOSchema.nullish() }); +export type CmrDocumentResponseDTO = z.infer; - /** - * UpdateCmrDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CmrDocumentLanguage } primaryLanguage Primary language - * @property { CmrDocumentLanguage } secondaryLanguage Secondary language - */ - export const UpdateCmrDocumentSettingsRequestDTOSchema = z - .object({ - primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), - secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language"), - }) - .readonly(); - export type UpdateCmrDocumentSettingsRequestDTO = z.infer; +/** + * UpdateCmrDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CmrDocumentLanguage } primaryLanguage Primary language + * @property { CmrDocumentLanguage } secondaryLanguage Secondary language + */ +export const UpdateCmrDocumentSettingsRequestDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.nullable(), secondaryLanguage: CmrDocumentLanguageSchema.nullable() }).partial(); +export type UpdateCmrDocumentSettingsRequestDTO = z.infer; - /** - * UpdateCmrDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateCmrDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateCmrDocumentBusinessPartnerRequestDTOSchema - >; +/** + * UpdateCmrDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateCmrDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); +export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer; - /** - * UpdateCmrDocumentDeliveryRequestDTOSchema - * @type { object } - * @property { string } cityId City ID - * @property { string } cityName City name - * @property { string } date Date - */ - export const UpdateCmrDocumentDeliveryRequestDTOSchema = z - .object({ - cityId: z.string().describe("City ID"), - cityName: z.string().describe("City name"), - date: z.iso.datetime({ offset: true }).describe("Date"), - }) - .readonly(); - export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; +/** + * UpdateCmrDocumentDeliveryRequestDTOSchema + * @type { object } + * @property { string } cityId City ID + * @property { string } cityName City name + * @property { string } date Date + */ +export const UpdateCmrDocumentDeliveryRequestDTOSchema = z.object({ cityId: z.string().nullable(), cityName: z.string().nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); +export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; - /** - * UpdateCmrDocumentCostsRequestDTOSchema - * @type { object } - * @property { number } carriageCharges Carriage charges - * @property { number } reductions Reductions - * @property { number } balance Balance - * @property { number } supplements Supplements - * @property { number } miscellaneous Miscellaneous - * @property { number } total Total - */ - export const UpdateCmrDocumentCostsRequestDTOSchema = z - .object({ - carriageCharges: z.number().describe("Carriage charges"), - reductions: z.number().describe("Reductions"), - balance: z.number().describe("Balance"), - supplements: z.number().describe("Supplements"), - miscellaneous: z.number().describe("Miscellaneous"), - total: z.number().describe("Total"), - }) - .readonly(); - export type UpdateCmrDocumentCostsRequestDTO = z.infer; +/** + * UpdateCmrDocumentCostsRequestDTOSchema + * @type { object } + * @property { number } carriageCharges Carriage charges + * @property { number } reductions Reductions + * @property { number } balance Balance + * @property { number } supplements Supplements + * @property { number } miscellaneous Miscellaneous + * @property { number } total Total + */ +export const UpdateCmrDocumentCostsRequestDTOSchema = z.object({ carriageCharges: z.number().nullable(), reductions: z.number().nullable(), balance: z.number().nullable(), supplements: z.number().nullable(), miscellaneous: z.number().nullable(), total: z.number().nullable() }).partial(); +export type UpdateCmrDocumentCostsRequestDTO = z.infer; + +/** + * UpdateCmrDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } cmrNumber CMR number + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } carrier Carrier information + * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } successiveCarrier Successive carrier information + * @property { UpdateCmrDocumentDeliveryRequestDTO } delivery Delivery information + * @property { UpdateCmrDocumentDeliveryRequestDTO } takeover Takeover information + * @property { string } annexedDocuments Annexed documents + * @property { string } carriersObservations Carriers observations + * @property { string } senderInstructions Sender instructions + * @property { string } reimbursement Reimbursement + * @property { string } specialAgreements Special agreements + * @property { boolean } suppressWeight Whether to suppress weight information + * @property { boolean } suppressMeasurement Whether to suppress measurement information + * @property { boolean } freightPaid Whether freight is paid + * @property { boolean } freightToBePaid Whether freight is to be paid + * @property { string } creationPlace Place of creation + * @property { string } creationDate Date of creation + * @property { UpdateCmrDocumentCostsRequestDTO } costsForShipper Costs for shipper + * @property { UpdateCmrDocumentCostsRequestDTO } costsForConsignee Costs for consignee + * @property { string[] } selectedCargoIds Selected cargo IDs + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { UpdateCmrDocumentSettingsRequestDTO } settings Settings + */ +export const UpdateCmrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), cmrNumber: z.string().nullable(), consignee: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), carrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), successiveCarrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), delivery: UpdateCmrDocumentDeliveryRequestDTOSchema.nullable(), takeover: UpdateCmrDocumentDeliveryRequestDTOSchema.nullable(), annexedDocuments: z.string().nullable(), carriersObservations: z.string().nullable(), senderInstructions: z.string().nullable(), reimbursement: z.string().nullable(), specialAgreements: z.string().nullable(), suppressWeight: z.boolean().nullable(), suppressMeasurement: z.boolean().nullable(), freightPaid: z.boolean().nullable(), freightToBePaid: z.boolean().nullable(), creationPlace: z.string().nullable(), creationDate: z.string().nullable(), costsForShipper: UpdateCmrDocumentCostsRequestDTOSchema.nullable(), costsForConsignee: UpdateCmrDocumentCostsRequestDTOSchema.nullable(), selectedCargoIds: z.array(z.string()).nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), settings: UpdateCmrDocumentSettingsRequestDTOSchema.nullable() }).partial(); +export type UpdateCmrDocumentRequestDTO = z.infer; - /** - * UpdateCmrDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } cmrNumber CMR number - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } carrier Carrier information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } successiveCarrier Successive carrier information - * @property { UpdateCmrDocumentDeliveryRequestDTO } delivery Delivery information - * @property { UpdateCmrDocumentDeliveryRequestDTO } takeover Takeover information - * @property { string } annexedDocuments Annexed documents - * @property { string } carriersObservations Carriers observations - * @property { string } senderInstructions Sender instructions - * @property { string } reimbursement Reimbursement - * @property { string } specialAgreements Special agreements - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { boolean } freightPaid Whether freight is paid - * @property { boolean } freightToBePaid Whether freight is to be paid - * @property { string } creationPlace Place of creation - * @property { string } creationDate Date of creation - * @property { UpdateCmrDocumentCostsRequestDTO } costsForShipper Costs for shipper - * @property { UpdateCmrDocumentCostsRequestDTO } costsForConsignee Costs for consignee - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { UpdateCmrDocumentSettingsRequestDTO } settings Settings - */ - export const UpdateCmrDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Name suffix"), - cmrNumber: z.string().describe("CMR number"), - consignee: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), - shipper: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), - carrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Carrier information"), - successiveCarrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Successive carrier information"), - delivery: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Delivery information"), - takeover: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Takeover information"), - annexedDocuments: z.string().describe("Annexed documents"), - carriersObservations: z.string().describe("Carriers observations"), - senderInstructions: z.string().describe("Sender instructions"), - reimbursement: z.string().describe("Reimbursement"), - specialAgreements: z.string().describe("Special agreements"), - suppressWeight: z.boolean().describe("Whether to suppress weight information"), - suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), - freightPaid: z.boolean().describe("Whether freight is paid"), - freightToBePaid: z.boolean().describe("Whether freight is to be paid"), - creationPlace: z.string().describe("Place of creation"), - creationDate: z.string().describe("Date of creation"), - costsForShipper: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for shipper"), - costsForConsignee: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for consignee"), - selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - settings: UpdateCmrDocumentSettingsRequestDTOSchema.describe("Settings"), - }) - .readonly(); - export type UpdateCmrDocumentRequestDTO = z.infer; } diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts index 213063b..15d2a7c 100644 --- a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts +++ b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,257 +9,203 @@ import { CommonModels } from "@/data/common/common.models"; import { WorkingDocumentsCmrFormApi } from "./workingDocumentsCmrForm.api"; export namespace WorkingDocumentsCmrFormQueries { - export const moduleName = QueryModule.WorkingDocumentsCmrForm; +export const moduleName = QueryModule.WorkingDocumentsCmrForm; - export const keys = { +export const keys = { all: [moduleName] as const, - getCmrData: (positionId: string, cmrId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId", positionId, cmrId, officeId] as const, - previewCmr: (positionId: string, cmrId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/cmrs/:cmrId/preview", - positionId, - cmrId, - officeId, - ] as const, - }; + getCmrData: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId", positionId, cmrId, officeId] as const, + previewCmr: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId/preview", positionId, cmrId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a CMR document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId } )); + return WorkingDocumentsCmrFormApi.create(positionId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetCmrData` + * @summary Get CMR document data + * @permission Requires `canUseGetCmrData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.cmrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetCmrData = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getCmrData(positionId, cmrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId } )); + return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateCmrData` + * @summary Update CMR document data + * @permission Requires `canUseUpdateCmrData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateCmrData = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId, data }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId } )); + return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, cmrId, officeId } = variables; + const updateKeys = [keys.getCmrData(positionId, cmrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteCmr` + * @summary Delete CMR document + * @permission Requires `canUseDeleteCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } CMR document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteCmr = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewCmr` - recommended when file should be cached + * @summary Preview CMR document + * @permission Requires `canUsePreviewCmr` ability + * @param { string } object.positionId Path parameter + * @param { string } object.cmrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewCmr = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewCmr(positionId, cmrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewCmrMutation` - recommended when file should not be cached + * @summary Preview CMR document + * @permission Requires `canUsePreviewCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewCmrMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, cmrId, officeId } = variables; + const updateKeys = [keys.previewCmr(positionId, cmrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateCmr` + * @summary Generate CMR document + * @permission Requires `canUseGenerateCmr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.cmrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateCmr = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, cmrId, officeId, data }) => { + checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId } )); + return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create a CMR document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId })); - return WorkingDocumentsCmrFormApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetCmrData` - * @summary Get CMR document data - * @permission Requires `canUseGetCmrData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.cmrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCmrData = ( - { positionId, cmrId, officeId }: { positionId: string; cmrId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCmrData(positionId, cmrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId })); - return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateCmrData` - * @summary Update CMR document data - * @permission Requires `canUseUpdateCmrData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCmrData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsCmrFormApi.updateCmrData, - { - positionId: string; - cmrId: string; - officeId: string; - data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId, data }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId })); - return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, cmrId, officeId } = variables; - const updateKeys = [keys.getCmrData(positionId, cmrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteCmr` - * @summary Delete CMR document - * @permission Requires `canUseDeleteCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } CMR document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteCmr = ( - options?: AppMutationOptions< - typeof WorkingDocumentsCmrFormApi.deleteCmr, - { positionId: string; cmrId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId })); - return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewCmr` - recommended when file should be cached - * @summary Preview CMR document - * @permission Requires `canUsePreviewCmr` ability - * @param { string } object.positionId Path parameter - * @param { string } object.cmrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewCmr = ( - { positionId, cmrId, officeId }: { positionId: string; cmrId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewCmr(positionId, cmrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId })); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewCmrMutation` - recommended when file should not be cached - * @summary Preview CMR document - * @permission Requires `canUsePreviewCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewCmrMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsCmrFormApi.previewCmr, - { positionId: string; cmrId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId })); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, cmrId, officeId } = variables; - const updateKeys = [keys.previewCmr(positionId, cmrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateCmr` - * @summary Generate CMR document - * @permission Requires `canUseGenerateCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateCmr = ( - options?: AppMutationOptions< - typeof WorkingDocumentsCmrFormApi.generateCmr, - { positionId: string; cmrId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId, data }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId })); - return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts index 96a5c3a..bd69b52 100644 --- a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts +++ b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts @@ -1,99 +1,82 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsExportDeclarationAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Create", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Create", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Create", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - /** - * Use for `useGetExportDeclarationData` query ability. For global ability, omit the object parameter. - * @description Read export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetExportDeclarationData` query - */ - export const canUseGetExportDeclarationData = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Read", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; +/** + * Use for `useGetExportDeclarationData` query ability. For global ability, omit the object parameter. + * @description Read export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetExportDeclarationData` query + */ +export const canUseGetExportDeclarationData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - /** - * Use for `useUpdateExportDeclarationData` mutation ability. For global ability, omit the object parameter. - * @description Update export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateExportDeclarationData` mutation - */ - export const canUseUpdateExportDeclarationData = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Update", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; +/** + * Use for `useUpdateExportDeclarationData` mutation ability. For global ability, omit the object parameter. + * @description Update export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateExportDeclarationData` mutation + */ +export const canUseUpdateExportDeclarationData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - /** - * Use for `useDeleteExportDeclaration` mutation ability. For global ability, omit the object parameter. - * @description Delete export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteExportDeclaration` mutation - */ - export const canUseDeleteExportDeclaration = (object?: { officeId: string }) => - [ - "Delete", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Delete", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; +/** + * Use for `useDeleteExportDeclaration` mutation ability. For global ability, omit the object parameter. + * @description Delete export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteExportDeclaration` mutation + */ +export const canUseDeleteExportDeclaration = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Delete", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - /** - * Use for `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation - */ - export const canUsePreviewExportDeclaration = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Read", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; +/** + * Use for `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation + */ +export const canUsePreviewExportDeclaration = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; + +/** + * Use for `useGenerateExportDeclaration` mutation ability. For global ability, omit the object parameter. + * @description Generate export declaration document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateExportDeclaration` mutation + */ +export const canUseGenerateExportDeclaration = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" +] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - /** - * Use for `useGenerateExportDeclaration` mutation ability. For global ability, omit the object parameter. - * @description Generate export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateExportDeclaration` mutation - */ - export const canUseGenerateExportDeclaration = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Update", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts index e1bd922..2b577d4 100644 --- a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts +++ b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts @@ -1,94 +1,58 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsExportDeclarationApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations`, - undefined, - config, - ); - }; - - export const getExportDeclarationData = ( - officeId: string, - positionId: string, - exportDeclarationId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations`, + + ) +}; +export const getExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - config, - ); - }; - - export const updateExportDeclarationData = ( - officeId: string, - positionId: string, - exportDeclarationId: string, - data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + + ) +}; +export const updateExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, ) => { return AppRestClient.patch( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), - config, - ); - }; - - export const deleteExportDeclaration = ( - positionId: string, - exportDeclarationId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), + + ) +}; +export const deleteExportDeclaration = (positionId: string, exportDeclarationId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - undefined, - config, - ); - }; - - export const previewExportDeclaration = ( - officeId: string, - positionId: string, - exportDeclarationId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, + + ) +}; +export const previewExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generateExportDeclaration = ( - officeId: string, - positionId: string, - exportDeclarationId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts index 3aca835..4394ac8 100644 --- a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts +++ b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts @@ -2,178 +2,93 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsExportDeclarationModels { - /** - * ExportDeclarationDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer< - typeof ExportDeclarationDocumentBusinessPartnerResponseDTOSchema - >; +/** + * ExportDeclarationDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); +export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer; - /** - * ExportDeclarationDocumentCargoResponseDTOSchema - * @type { object } - * @property { number } quantity Quantity of packages - * @property { number } weight Weight of the cargo - * @property { number } length Length of the cargo - * @property { number } width Width of the cargo - * @property { number } height Height of the cargo - * @property { string } packageType Type of package - * @property { string } positionNumber Position number - */ - export const ExportDeclarationDocumentCargoResponseDTOSchema = z - .object({ - quantity: z.number().describe("Quantity of packages"), - weight: z.number().describe("Weight of the cargo"), - length: z.number().describe("Length of the cargo"), - width: z.number().describe("Width of the cargo"), - height: z.number().describe("Height of the cargo"), - packageType: z.string().describe("Type of package"), - positionNumber: z.string().describe("Position number"), - }) - .readonly(); - export type ExportDeclarationDocumentCargoResponseDTO = z.infer< - typeof ExportDeclarationDocumentCargoResponseDTOSchema - >; +/** + * ExportDeclarationDocumentCargoResponseDTOSchema + * @type { object } + * @property { number } quantity Quantity of packages + * @property { number } weight Weight of the cargo + * @property { number } length Length of the cargo + * @property { number } width Width of the cargo + * @property { number } height Height of the cargo + * @property { string } packageType Type of package + * @property { string } positionNumber Position number + */ +export const ExportDeclarationDocumentCargoResponseDTOSchema = z.object({ quantity: z.number(), weight: z.number(), length: z.number(), width: z.number(), height: z.number(), packageType: z.string(), positionNumber: z.string() }); +export type ExportDeclarationDocumentCargoResponseDTO = z.infer; - /** - * ExportDeclarationDocumentRouteResponseDTOSchema - * @type { object } - * @property { string } pickupDate Pickup date - * @property { string } deliveryDate Delivery date - * @property { string } pickupCity Pickup city - * @property { string } deliveryCity Delivery city - */ - export const ExportDeclarationDocumentRouteResponseDTOSchema = z - .object({ - pickupDate: z.string().describe("Pickup date"), - deliveryDate: z.string().describe("Delivery date"), - pickupCity: z.string().describe("Pickup city"), - deliveryCity: z.string().describe("Delivery city"), - }) - .readonly(); - export type ExportDeclarationDocumentRouteResponseDTO = z.infer< - typeof ExportDeclarationDocumentRouteResponseDTOSchema - >; +/** + * ExportDeclarationDocumentRouteResponseDTOSchema + * @type { object } + * @property { string } pickupDate Pickup date + * @property { string } deliveryDate Delivery date + * @property { string } pickupCity Pickup city + * @property { string } deliveryCity Delivery city + */ +export const ExportDeclarationDocumentRouteResponseDTOSchema = z.object({ pickupDate: z.string(), deliveryDate: z.string(), pickupCity: z.string(), deliveryCity: z.string() }); +export type ExportDeclarationDocumentRouteResponseDTO = z.infer; - /** - * ExportDeclarationDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the export declaration document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the export declaration document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } dateOfHandover Date when the goods are handed over for export - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { string } issuerName Name of the issuer - * @property { string } issuerAddress Address of the issuer - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } customer Customer information - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { string } selectedCargoId ID of the selected cargo - * @property { ExportDeclarationDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { ExportDeclarationDocumentRouteResponseDTO } route Route information - * @property { string } signingPlace Place where the document is signed - * @property { string } signingDate Date when the document is signed - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } signedBy Information about who signed the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ - export const ExportDeclarationDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the export declaration document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference").nullish(), - name: z.string().describe("Name of the export declaration document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - dateOfHandover: z.iso - .datetime({ offset: true }) - .describe("Date when the goods are handed over for export") - .nullish(), - direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), - transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), - versionNumber: z.number().describe("Version number of the document"), - issuerName: z.string().describe("Name of the issuer").nullish(), - issuerAddress: z.string().describe("Address of the issuer").nullish(), - customer: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Customer information").nullish(), - shipper: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), - consignee: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), - selectedCargoId: z.string().describe("ID of the selected cargo").nullish(), - cargo: z - .array(ExportDeclarationDocumentCargoResponseDTOSchema) - .readonly() - .describe("List of cargo information") - .nullish(), - route: ExportDeclarationDocumentRouteResponseDTOSchema.describe("Route information").nullish(), - signingPlace: z.string().describe("Place where the document is signed").nullish(), - signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed").nullish(), - signedBy: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe( - "Information about who signed the document", - ).nullish(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document").nullish(), - }) - .readonly(); - export type ExportDeclarationDocumentResponseDTO = z.infer; +/** + * ExportDeclarationDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the export declaration document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the export declaration document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } dateOfHandover Date when the goods are handed over for export + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { string } issuerName Name of the issuer + * @property { string } issuerAddress Address of the issuer + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } customer Customer information + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { string } selectedCargoId ID of the selected cargo + * @property { ExportDeclarationDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { ExportDeclarationDocumentRouteResponseDTO } route Route information + * @property { string } signingPlace Place where the document is signed + * @property { string } signingDate Date when the document is signed + * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } signedBy Information about who signed the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ +export const ExportDeclarationDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), dateOfHandover: z.iso.datetime({ offset: true }).nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), versionNumber: z.number(), issuerName: z.string().nullish(), issuerAddress: z.string().nullish(), customer: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), selectedCargoId: z.string().nullish(), cargo: z.array(ExportDeclarationDocumentCargoResponseDTOSchema).nullish(), route: ExportDeclarationDocumentRouteResponseDTOSchema.nullish(), signingPlace: z.string().nullish(), signingDate: z.iso.datetime({ offset: true }).nullish(), signedBy: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.nullish() }); +export type ExportDeclarationDocumentResponseDTO = z.infer; + +/** + * UpdateExportDeclarationDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } dateOfHandover Date when goods are handed over for export + * @property { string } issuerName Name of the issuer + * @property { string } issuerAddress Address of the issuer + * @property { string } customerId Customer ID + * @property { string } customerAddress Customer address + * @property { string } shipperId Shipper ID + * @property { string } shipperAddress Shipper address + * @property { string } consigneeId Consignee ID + * @property { string } consigneeAddress Consignee address + * @property { string } selectedCargoId Selected cargo ID + * @property { string } signingPlace Place where the document is signed + * @property { string } signingDate Date when the document is signed + * @property { string } signedByEmployeeId ID of the employee who signed the document + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateExportDeclarationDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), dateOfHandover: z.iso.datetime({ offset: true }).nullable(), issuerName: z.string().nullable(), issuerAddress: z.string().nullable(), customerId: z.string().nullable(), customerAddress: z.string().nullable(), shipperId: z.string().nullable(), shipperAddress: z.string().nullable(), consigneeId: z.string().nullable(), consigneeAddress: z.string().nullable(), selectedCargoId: z.string().nullable(), signingPlace: z.string().nullable(), signingDate: z.iso.datetime({ offset: true }).nullable(), signedByEmployeeId: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); +export type UpdateExportDeclarationDocumentRequestDTO = z.infer; - /** - * UpdateExportDeclarationDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } dateOfHandover Date when goods are handed over for export - * @property { string } issuerName Name of the issuer - * @property { string } issuerAddress Address of the issuer - * @property { string } customerId Customer ID - * @property { string } customerAddress Customer address - * @property { string } shipperId Shipper ID - * @property { string } shipperAddress Shipper address - * @property { string } consigneeId Consignee ID - * @property { string } consigneeAddress Consignee address - * @property { string } selectedCargoId Selected cargo ID - * @property { string } signingPlace Place where the document is signed - * @property { string } signingDate Date when the document is signed - * @property { string } signedByEmployeeId ID of the employee who signed the document - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateExportDeclarationDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Name suffix"), - dateOfHandover: z.iso.datetime({ offset: true }).describe("Date when goods are handed over for export"), - issuerName: z.string().describe("Name of the issuer"), - issuerAddress: z.string().describe("Address of the issuer"), - customerId: z.string().describe("Customer ID"), - customerAddress: z.string().describe("Customer address"), - shipperId: z.string().describe("Shipper ID"), - shipperAddress: z.string().describe("Shipper address"), - consigneeId: z.string().describe("Consignee ID"), - consigneeAddress: z.string().describe("Consignee address"), - selectedCargoId: z.string().describe("Selected cargo ID"), - signingPlace: z.string().describe("Place where the document is signed"), - signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed"), - signedByEmployeeId: z.string().describe("ID of the employee who signed the document"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateExportDeclarationDocumentRequestDTO = z.infer< - typeof UpdateExportDeclarationDocumentRequestDTOSchema - >; } diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts index cd2bfa6..802056c 100644 --- a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts +++ b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,311 +9,203 @@ import { CommonModels } from "@/data/common/common.models"; import { WorkingDocumentsExportDeclarationApi } from "./workingDocumentsExportDeclaration.api"; export namespace WorkingDocumentsExportDeclarationQueries { - export const moduleName = QueryModule.WorkingDocumentsExportDeclaration; +export const moduleName = QueryModule.WorkingDocumentsExportDeclaration; - export const keys = { +export const keys = { all: [moduleName] as const, - getExportDeclarationData: (officeId: string, positionId: string, exportDeclarationId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId", - officeId, - positionId, - exportDeclarationId, - ] as const, - previewExportDeclaration: (officeId: string, positionId: string, exportDeclarationId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId/preview", - officeId, - positionId, - exportDeclarationId, - ] as const, - }; + getExportDeclarationData: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId", officeId, positionId, exportDeclarationId] as const, + previewExportDeclaration: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId/preview", officeId, positionId, exportDeclarationId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an export declaration document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId } )); + return WorkingDocumentsExportDeclarationApi.create(positionId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetExportDeclarationData` + * @summary Get export declaration document data + * @permission Requires `canUseGetExportDeclarationData` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.exportDeclarationId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetExportDeclarationData = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), + queryFn: () => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId } )); + return WorkingDocumentsExportDeclarationApi.getExportDeclarationData(officeId, positionId, exportDeclarationId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateExportDeclarationData` + * @summary Update export declaration document data + * @permission Requires `canUseUpdateExportDeclarationData` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateExportDeclarationData = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId } )); + return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData(officeId, positionId, exportDeclarationId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, exportDeclarationId } = variables; + const updateKeys = [keys.getExportDeclarationData(officeId, positionId, exportDeclarationId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteExportDeclaration` + * @summary Delete export declaration document + * @permission Requires `canUseDeleteExportDeclaration` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Export declaration document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, exportDeclarationId, officeId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration(positionId, exportDeclarationId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewExportDeclaration` - recommended when file should be cached + * @summary Preview export declaration document + * @permission Requires `canUsePreviewExportDeclaration` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.exportDeclarationId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewExportDeclaration = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), + queryFn: () => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewExportDeclarationMutation` - recommended when file should not be cached + * @summary Preview export declaration document + * @permission Requires `canUsePreviewExportDeclaration` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewExportDeclarationMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, exportDeclarationId } = variables; + const updateKeys = [keys.previewExportDeclaration(officeId, positionId, exportDeclarationId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateExportDeclaration` + * @summary Generate export declaration document + * @permission Requires `canUseGenerateExportDeclaration` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.exportDeclarationId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { + checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId } )); + return WorkingDocumentsExportDeclarationApi.generateExportDeclaration(officeId, positionId, exportDeclarationId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create an export declaration document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof WorkingDocumentsExportDeclarationApi.create, - { positionId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId })); - return WorkingDocumentsExportDeclarationApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetExportDeclarationData` - * @summary Get export declaration document data - * @permission Requires `canUseGetExportDeclarationData` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.exportDeclarationId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetExportDeclarationData = ( - { - officeId, - positionId, - exportDeclarationId, - }: { officeId: string; positionId: string; exportDeclarationId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), - queryFn: () => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId })); - return WorkingDocumentsExportDeclarationApi.getExportDeclarationData( - officeId, - positionId, - exportDeclarationId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateExportDeclarationData` - * @summary Update export declaration document data - * @permission Requires `canUseUpdateExportDeclarationData` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateExportDeclarationData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsExportDeclarationApi.updateExportDeclarationData, - { - officeId: string; - positionId: string; - exportDeclarationId: string; - data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId })); - return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData( - officeId, - positionId, - exportDeclarationId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, exportDeclarationId } = variables; - const updateKeys = [keys.getExportDeclarationData(officeId, positionId, exportDeclarationId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteExportDeclaration` - * @summary Delete export declaration document - * @permission Requires `canUseDeleteExportDeclaration` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Export declaration document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteExportDeclaration = ( - options?: AppMutationOptions< - typeof WorkingDocumentsExportDeclarationApi.deleteExportDeclaration, - { positionId: string; exportDeclarationId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, exportDeclarationId, officeId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId })); - return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration( - positionId, - exportDeclarationId, - officeId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewExportDeclaration` - recommended when file should be cached - * @summary Preview export declaration document - * @permission Requires `canUsePreviewExportDeclaration` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.exportDeclarationId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewExportDeclaration = ( - { - officeId, - positionId, - exportDeclarationId, - }: { officeId: string; positionId: string; exportDeclarationId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), - queryFn: () => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId })); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration( - officeId, - positionId, - exportDeclarationId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewExportDeclarationMutation` - recommended when file should not be cached - * @summary Preview export declaration document - * @permission Requires `canUsePreviewExportDeclaration` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewExportDeclarationMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsExportDeclarationApi.previewExportDeclaration, - { officeId: string; positionId: string; exportDeclarationId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId })); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration( - officeId, - positionId, - exportDeclarationId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, exportDeclarationId } = variables; - const updateKeys = [keys.previewExportDeclaration(officeId, positionId, exportDeclarationId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateExportDeclaration` - * @summary Generate export declaration document - * @permission Requires `canUseGenerateExportDeclaration` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateExportDeclaration = ( - options?: AppMutationOptions< - typeof WorkingDocumentsExportDeclarationApi.generateExportDeclaration, - { - officeId: string; - positionId: string; - exportDeclarationId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId })); - return WorkingDocumentsExportDeclarationApi.generateExportDeclaration( - officeId, - positionId, - exportDeclarationId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts index 3860d00..9c5da4d 100644 --- a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts +++ b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts @@ -1,75 +1,82 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsFcrFormAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Create", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Create", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - /** - * Use for `useGetFcrData` query ability. For global ability, omit the object parameter. - * @description Read FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetFcrData` query - */ - export const canUseGetFcrData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Read", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; +/** + * Use for `useGetFcrData` query ability. For global ability, omit the object parameter. + * @description Read FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetFcrData` query + */ +export const canUseGetFcrData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - /** - * Use for `useUpdateFcrData` mutation ability. For global ability, omit the object parameter. - * @description Update FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateFcrData` mutation - */ - export const canUseUpdateFcrData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Update", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; +/** + * Use for `useUpdateFcrData` mutation ability. For global ability, omit the object parameter. + * @description Update FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateFcrData` mutation + */ +export const canUseUpdateFcrData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - /** - * Use for `useDeleteFcr` mutation ability. For global ability, omit the object parameter. - * @description Delete FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteFcr` mutation - */ - export const canUseDeleteFcr = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Delete", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; +/** + * Use for `useDeleteFcr` mutation ability. For global ability, omit the object parameter. + * @description Delete FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteFcr` mutation + */ +export const canUseDeleteFcr = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Delete", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - /** - * Use for `usePreviewFcr` query or `usePreviewFcrMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewFcr` query or `usePreviewFcrMutation` mutation - */ - export const canUsePreviewFcr = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Read", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; +/** + * Use for `usePreviewFcr` query or `usePreviewFcrMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewFcr` query or `usePreviewFcrMutation` mutation + */ +export const canUsePreviewFcr = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; + +/** + * Use for `useGenerateFcr` mutation ability. For global ability, omit the object parameter. + * @description Generate FCR document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateFcr` mutation + */ +export const canUseGenerateFcr = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" +] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - /** - * Use for `useGenerateFcr` mutation ability. For global ability, omit the object parameter. - * @description Generate FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateFcr` mutation - */ - export const canUseGenerateFcr = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Update", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts index 590f307..3cc1061 100644 --- a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts +++ b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts @@ -1,79 +1,58 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsFcrFormApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs`, - undefined, - config, - ); - }; - - export const getFcrData = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs`, + + ) +}; +export const getFcrData = (positionId: string, fcrId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - config, - ); - }; - - export const updateFcrData = ( - positionId: string, - fcrId: string, - officeId: string, - data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + + ) +}; +export const updateFcrData = (positionId: string, fcrId: string, officeId: string, data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, ) => { return AppRestClient.patch( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), - config, - ); - }; - - export const deleteFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), + + ) +}; +export const deleteFcr = (positionId: string, fcrId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - undefined, - config, - ); - }; - - export const previewFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, + + ) +}; +export const previewFcr = (positionId: string, fcrId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generateFcr = ( - positionId: string, - fcrId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateFcr = (positionId: string, fcrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts index ea713a5..4979e6e 100644 --- a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts +++ b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts @@ -2,149 +2,85 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsFcrFormModels { - /** - * FcrDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const FcrDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type FcrDocumentBusinessPartnerResponseDTO = z.infer; +/** + * FcrDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const FcrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); +export type FcrDocumentBusinessPartnerResponseDTO = z.infer; - /** - * FcrDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { string } containerNumber Container number - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - * @property { number } quantity Quantity of the cargo - * @property { string } description Description of the cargo - * @property { number } weight Weight of the cargo - * @property { number } volume Volume of the cargo - */ - export const FcrDocumentCargoResponseDTOSchema = z - .object({ - caseMarks: z.string().describe("Case marks of the cargo"), - containerNumber: z.string().describe("Container number"), - seal1: z.string().describe("Seal number 1 of the cargo"), - seal2: z.string().describe("Seal number 2 of the cargo"), - quantity: z.number().describe("Quantity of the cargo"), - description: z.string().describe("Description of the cargo"), - weight: z.number().describe("Weight of the cargo"), - volume: z.number().describe("Volume of the cargo"), - }) - .readonly(); - export type FcrDocumentCargoResponseDTO = z.infer; +/** + * FcrDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } caseMarks Case marks of the cargo + * @property { string } containerNumber Container number + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + * @property { number } quantity Quantity of the cargo + * @property { string } description Description of the cargo + * @property { number } weight Weight of the cargo + * @property { number } volume Volume of the cargo + */ +export const FcrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().nullable(), containerNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), quantity: z.number().nullable(), description: z.string().nullable(), weight: z.number().nullable(), volume: z.number().nullable() }).partial(); +export type FcrDocumentCargoResponseDTO = z.infer; - /** - * FcrDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { number } versionNumber Version number of the document - * @property { string } fcrNumber FCR number - * @property { string } edvNumber EDV number - * @property { number } numberOfOriginals Number of originals - * @property { string } placeOfLoading Place of loading - * @property { string } dateOfLoading Date of loading - * @property { string } viaCity Via city - * @property { string } toDestination To destination - * @property { string } transportMode Transport mode - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } issuePlace Issue place - * @property { string } issueDate Issue date - * @property { string } deliveryTerms Delivery terms - * @property { FcrDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { FcrDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { FcrDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ - export const FcrDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the document"), - name: z.string().describe("Name of the document"), - nameSuffix: z.string().describe("Name suffix of the document").nullish(), - defaultFileName: z.string(), - positionId: z.string().describe("Position ID"), - positionNumber: z.string().describe("Position number"), - versionNumber: z.number().describe("Version number of the document"), - fcrNumber: z.string().describe("FCR number").nullish(), - edvNumber: z.string().describe("EDV number").nullish(), - numberOfOriginals: z.number().describe("Number of originals"), - placeOfLoading: z.string().describe("Place of loading").nullish(), - dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading").nullish(), - viaCity: z.string().describe("Via city").nullish(), - toDestination: z.string().describe("To destination").nullish(), - transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - issuePlace: z.string().describe("Issue place").nullish(), - issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), - deliveryTerms: z.string().describe("Delivery terms").nullish(), - shipper: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), - consignee: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), - cargo: z.array(FcrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), - config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), - }) - .readonly(); - export type FcrDocumentResponseDTO = z.infer; +/** + * FcrDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { number } versionNumber Version number of the document + * @property { string } fcrNumber FCR number + * @property { string } edvNumber EDV number + * @property { number } numberOfOriginals Number of originals + * @property { string } placeOfLoading Place of loading + * @property { string } dateOfLoading Date of loading + * @property { string } viaCity Via city + * @property { string } toDestination To destination + * @property { string } transportMode Transport mode + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } issuePlace Issue place + * @property { string } issueDate Issue date + * @property { string } deliveryTerms Delivery terms + * @property { FcrDocumentBusinessPartnerResponseDTO } shipper Shipper information + * @property { FcrDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { FcrDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ +export const FcrDocumentResponseDTOSchema = z.object({ id: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), positionId: z.string(), positionNumber: z.string(), versionNumber: z.number(), fcrNumber: z.string().nullish(), edvNumber: z.string().nullish(), numberOfOriginals: z.number(), placeOfLoading: z.string().nullish(), dateOfLoading: z.iso.datetime({ offset: true }).nullish(), viaCity: z.string().nullish(), toDestination: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), issuePlace: z.string().nullish(), issueDate: z.iso.datetime({ offset: true }).nullish(), deliveryTerms: z.string().nullish(), shipper: FcrDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: FcrDocumentBusinessPartnerResponseDTOSchema.nullish(), cargo: z.array(FcrDocumentCargoResponseDTOSchema).nullish(), config: CommonModels.HBLDocumentConfigDtoSchema }); +export type FcrDocumentResponseDTO = z.infer; + +/** + * UpdateFcrDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } fcrNumber FCR number + * @property { string } edvNumber EDV number + * @property { number } numberOfOriginals Number of originals + * @property { string } placeOfLoading Place of loading + * @property { string } dateOfLoading Date of loading + * @property { string } viaCity Via city + * @property { string } toDestination To destination + * @property { string } transportMode Transport mode + * @property { string } issuePlace Issue place + * @property { string } issueDate Issue date + * @property { string } deliveryTerms Delivery terms + * @property { string } shipperId Shipper ID + * @property { string } shipperAddress Shipper address + * @property { string } consigneeId Consignee ID + * @property { string } consigneeAddress Consignee address + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateFcrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), fcrNumber: z.string().nullable(), edvNumber: z.string().nullable(), numberOfOriginals: z.number().nullable(), placeOfLoading: z.string().nullable(), dateOfLoading: z.iso.datetime({ offset: true }).nullable(), viaCity: z.string().nullable(), toDestination: z.string().nullable(), transportMode: z.string().nullable(), issuePlace: z.string().nullable(), issueDate: z.iso.datetime({ offset: true }).nullable(), deliveryTerms: z.string().nullable(), shipperId: z.string().nullable(), shipperAddress: z.string().nullable(), consigneeId: z.string().nullable(), consigneeAddress: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); +export type UpdateFcrDocumentRequestDTO = z.infer; - /** - * UpdateFcrDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } fcrNumber FCR number - * @property { string } edvNumber EDV number - * @property { number } numberOfOriginals Number of originals - * @property { string } placeOfLoading Place of loading - * @property { string } dateOfLoading Date of loading - * @property { string } viaCity Via city - * @property { string } toDestination To destination - * @property { string } transportMode Transport mode - * @property { string } issuePlace Issue place - * @property { string } issueDate Issue date - * @property { string } deliveryTerms Delivery terms - * @property { string } shipperId Shipper ID - * @property { string } shipperAddress Shipper address - * @property { string } consigneeId Consignee ID - * @property { string } consigneeAddress Consignee address - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateFcrDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Name suffix"), - fcrNumber: z.string().describe("FCR number"), - edvNumber: z.string().describe("EDV number"), - numberOfOriginals: z.number().describe("Number of originals"), - placeOfLoading: z.string().describe("Place of loading"), - dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading"), - viaCity: z.string().describe("Via city"), - toDestination: z.string().describe("To destination"), - transportMode: z.string().describe("Transport mode"), - issuePlace: z.string().describe("Issue place"), - issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), - deliveryTerms: z.string().describe("Delivery terms"), - shipperId: z.string().describe("Shipper ID"), - shipperAddress: z.string().describe("Shipper address"), - consigneeId: z.string().describe("Consignee ID"), - consigneeAddress: z.string().describe("Consignee address"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateFcrDocumentRequestDTO = z.infer; } diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts index 7e9a7d2..1e532d0 100644 --- a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts +++ b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,257 +9,203 @@ import { CommonModels } from "@/data/common/common.models"; import { WorkingDocumentsFcrFormApi } from "./workingDocumentsFcrForm.api"; export namespace WorkingDocumentsFcrFormQueries { - export const moduleName = QueryModule.WorkingDocumentsFcrForm; +export const moduleName = QueryModule.WorkingDocumentsFcrForm; - export const keys = { +export const keys = { all: [moduleName] as const, - getFcrData: (positionId: string, fcrId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId", positionId, fcrId, officeId] as const, - previewFcr: (positionId: string, fcrId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/fcrs/:fcrId/preview", - positionId, - fcrId, - officeId, - ] as const, - }; + getFcrData: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId", positionId, fcrId, officeId] as const, + previewFcr: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId/preview", positionId, fcrId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an FCR document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId } )); + return WorkingDocumentsFcrFormApi.create(positionId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetFcrData` + * @summary Get FCR document data + * @permission Requires `canUseGetFcrData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.fcrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetFcrData = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getFcrData(positionId, fcrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId } )); + return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateFcrData` + * @summary Update FCR document data + * @permission Requires `canUseUpdateFcrData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateFcrData = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId, data }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId } )); + return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, fcrId, officeId } = variables; + const updateKeys = [keys.getFcrData(positionId, fcrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteFcr` + * @summary Delete FCR document + * @permission Requires `canUseDeleteFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } FCR document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteFcr = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewFcr` - recommended when file should be cached + * @summary Preview FCR document + * @permission Requires `canUsePreviewFcr` ability + * @param { string } object.positionId Path parameter + * @param { string } object.fcrId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewFcr = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewFcr(positionId, fcrId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewFcrMutation` - recommended when file should not be cached + * @summary Preview FCR document + * @permission Requires `canUsePreviewFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewFcrMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, fcrId, officeId } = variables; + const updateKeys = [keys.previewFcr(positionId, fcrId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateFcr` + * @summary Generate FCR document + * @permission Requires `canUseGenerateFcr` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.fcrId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateFcr = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, fcrId, officeId, data }) => { + checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId } )); + return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create an FCR document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId })); - return WorkingDocumentsFcrFormApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetFcrData` - * @summary Get FCR document data - * @permission Requires `canUseGetFcrData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.fcrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetFcrData = ( - { positionId, fcrId, officeId }: { positionId: string; fcrId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getFcrData(positionId, fcrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId })); - return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateFcrData` - * @summary Update FCR document data - * @permission Requires `canUseUpdateFcrData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateFcrData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsFcrFormApi.updateFcrData, - { - positionId: string; - fcrId: string; - officeId: string; - data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId, data }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId })); - return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, fcrId, officeId } = variables; - const updateKeys = [keys.getFcrData(positionId, fcrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteFcr` - * @summary Delete FCR document - * @permission Requires `canUseDeleteFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } FCR document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteFcr = ( - options?: AppMutationOptions< - typeof WorkingDocumentsFcrFormApi.deleteFcr, - { positionId: string; fcrId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId })); - return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewFcr` - recommended when file should be cached - * @summary Preview FCR document - * @permission Requires `canUsePreviewFcr` ability - * @param { string } object.positionId Path parameter - * @param { string } object.fcrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewFcr = ( - { positionId, fcrId, officeId }: { positionId: string; fcrId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewFcr(positionId, fcrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId })); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewFcrMutation` - recommended when file should not be cached - * @summary Preview FCR document - * @permission Requires `canUsePreviewFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewFcrMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsFcrFormApi.previewFcr, - { positionId: string; fcrId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId })); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, fcrId, officeId } = variables; - const updateKeys = [keys.previewFcr(positionId, fcrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateFcr` - * @summary Generate FCR document - * @permission Requires `canUseGenerateFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateFcr = ( - options?: AppMutationOptions< - typeof WorkingDocumentsFcrFormApi.generateFcr, - { positionId: string; fcrId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId, data }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId })); - return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts index 9d5e584..a7c5b44 100644 --- a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts +++ b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts @@ -1,75 +1,82 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsHouseAwbAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Create", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Create", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - /** - * Use for `useGetHouseAwbData` query ability. For global ability, omit the object parameter. - * @description Read House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseAwbData` query - */ - export const canUseGetHouseAwbData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Read", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; +/** + * Use for `useGetHouseAwbData` query ability. For global ability, omit the object parameter. + * @description Read House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseAwbData` query + */ +export const canUseGetHouseAwbData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - /** - * Use for `useUpdateHouseAwbData` mutation ability. For global ability, omit the object parameter. - * @description Update House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseAwbData` mutation - */ - export const canUseUpdateHouseAwbData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Update", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; +/** + * Use for `useUpdateHouseAwbData` mutation ability. For global ability, omit the object parameter. + * @description Update House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseAwbData` mutation + */ +export const canUseUpdateHouseAwbData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - /** - * Use for `useDeleteHouseAwb` mutation ability. For global ability, omit the object parameter. - * @description Delete House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseAwb` mutation - */ - export const canUseDeleteHouseAwb = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Delete", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; +/** + * Use for `useDeleteHouseAwb` mutation ability. For global ability, omit the object parameter. + * @description Delete House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseAwb` mutation + */ +export const canUseDeleteHouseAwb = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Delete", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - /** - * Use for `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation - */ - export const canUsePreviewHouseAwb = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Read", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; +/** + * Use for `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation + */ +export const canUsePreviewHouseAwb = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; + +/** + * Use for `useGenerateHouseAwb` mutation ability. For global ability, omit the object parameter. + * @description Generate House AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseAwb` mutation + */ +export const canUseGenerateHouseAwb = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" +] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - /** - * Use for `useGenerateHouseAwb` mutation ability. For global ability, omit the object parameter. - * @description Generate House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseAwb` mutation - */ - export const canUseGenerateHouseAwb = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Update", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts index 26bc759..11a3a68 100644 --- a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts +++ b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts @@ -1,89 +1,58 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsHouseAwbApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs`, - undefined, - config, - ); - }; - - export const getHouseAwbData = ( - positionId: string, - hawbId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs`, + + ) +}; +export const getHouseAwbData = (positionId: string, hawbId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - config, - ); - }; - - export const updateHouseAwbData = ( - positionId: string, - hawbId: string, - officeId: string, - data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + + ) +}; +export const updateHouseAwbData = (positionId: string, hawbId: string, officeId: string, data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, ) => { return AppRestClient.patch( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), - config, - ); - }; - - export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), + + ) +}; +export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - undefined, - config, - ); - }; - - export const previewHouseAwb = ( - positionId: string, - hawbId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, + + ) +}; +export const previewHouseAwb = (positionId: string, hawbId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generateHouseAwb = ( - positionId: string, - hawbId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateHouseAwb = (positionId: string, hawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts index e45408f..505f711 100644 --- a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts +++ b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts @@ -2,306 +2,173 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsHouseAwbModels { - /** - * HouseAwbDocumentOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - * @property { string } name Name - */ - export const HouseAwbDocumentOtherChargeDTOSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID").nullish(), - sellRate: z.number().describe("Sell rate"), - name: z.string().describe("Name").nullish(), - }) - .readonly(); - export type HouseAwbDocumentOtherChargeDTO = z.infer; +/** + * HouseAwbDocumentOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + * @property { string } name Name + */ +export const HouseAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullish(), sellRate: z.number(), name: z.string().nullish() }); +export type HouseAwbDocumentOtherChargeDTO = z.infer; - /** - * HouseAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { number } totalOtherCharges Total other charges - * @property { number } total Total - * @property { HouseAwbDocumentOtherChargeDTO[] } otherCharges Other charges - */ - export const HouseAwbDocumentChargesDTOSchema = z - .object({ - weightCharge: z.number().describe("Weight charge"), - totalOtherCharges: z.number().describe("Total other charges"), - total: z.number().describe("Total"), - otherCharges: z.array(HouseAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges"), - }) - .readonly(); - export type HouseAwbDocumentChargesDTO = z.infer; +/** + * HouseAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { number } totalOtherCharges Total other charges + * @property { number } total Total + * @property { HouseAwbDocumentOtherChargeDTO[] } otherCharges Other charges + */ +export const HouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number(), totalOtherCharges: z.number(), total: z.number(), otherCharges: z.array(HouseAwbDocumentOtherChargeDTOSchema) }); +export type HouseAwbDocumentChargesDTO = z.infer; - /** - * HouseAwbDocumentCargoDTOSchema - * @type { object } - * @property { number } quantity Quantity - * @property { number } grossWeight Gross weight - * @property { string } rateClass Rate class - * @property { string } commodityItemNo Commodity item number - * @property { number } rateOrCharge Rate or charge - * @property { number } total Total - * @property { string } description Description - */ - export const HouseAwbDocumentCargoDTOSchema = z - .object({ - quantity: z.number().describe("Quantity"), - grossWeight: z.number().describe("Gross weight").nullish(), - rateClass: z.string().describe("Rate class").nullish(), - commodityItemNo: z.string().describe("Commodity item number").nullish(), - rateOrCharge: z.number().describe("Rate or charge").nullish(), - total: z.number().describe("Total").nullish(), - description: z.string().describe("Description").nullish(), - }) - .readonly(); - export type HouseAwbDocumentCargoDTO = z.infer; +/** + * HouseAwbDocumentCargoDTOSchema + * @type { object } + * @property { number } quantity Quantity + * @property { number } grossWeight Gross weight + * @property { string } rateClass Rate class + * @property { string } commodityItemNo Commodity item number + * @property { number } rateOrCharge Rate or charge + * @property { number } total Total + * @property { string } description Description + */ +export const HouseAwbDocumentCargoDTOSchema = z.object({ quantity: z.number(), grossWeight: z.number().nullish(), rateClass: z.string().nullish(), commodityItemNo: z.string().nullish(), rateOrCharge: z.number().nullish(), total: z.number().nullish(), description: z.string().nullish() }); +export type HouseAwbDocumentCargoDTO = z.infer; - /** - * HouseAwbDocumentRouteDTOSchema - * @type { object } - * @property { string } airportOfDeparture Airport of departure - * @property { string } airportOfDestination Airport of destination - * @property { string } toAirport1 To airport 1 - * @property { string } byCarrier1 By carrier 1 - * @property { string } toAirport2 To airport 2 - * @property { string } byCarrier2 By carrier 2 - * @property { string } toAirport3 To airport 3 - * @property { string } byCarrier3 By carrier 3 - * @property { string } flightNumber1 Flight number 1 - * @property { string } flightDay1 Flight day 1 - * @property { string } flightNumber2 Flight number 2 - * @property { string } flightDay2 Flight day 2 - */ - export const HouseAwbDocumentRouteDTOSchema = z - .object({ - airportOfDeparture: z.string().describe("Airport of departure"), - airportOfDestination: z.string().describe("Airport of destination"), - toAirport1: z.string().describe("To airport 1").nullish(), - byCarrier1: z.string().describe("By carrier 1").nullish(), - toAirport2: z.string().describe("To airport 2").nullish(), - byCarrier2: z.string().describe("By carrier 2").nullish(), - toAirport3: z.string().describe("To airport 3").nullish(), - byCarrier3: z.string().describe("By carrier 3").nullish(), - flightNumber1: z.string().describe("Flight number 1").nullish(), - flightDay1: z.string().describe("Flight day 1").nullish(), - flightNumber2: z.string().describe("Flight number 2").nullish(), - flightDay2: z.string().describe("Flight day 2").nullish(), - }) - .readonly(); - export type HouseAwbDocumentRouteDTO = z.infer; +/** + * HouseAwbDocumentRouteDTOSchema + * @type { object } + * @property { string } airportOfDeparture Airport of departure + * @property { string } airportOfDestination Airport of destination + * @property { string } toAirport1 To airport 1 + * @property { string } byCarrier1 By carrier 1 + * @property { string } toAirport2 To airport 2 + * @property { string } byCarrier2 By carrier 2 + * @property { string } toAirport3 To airport 3 + * @property { string } byCarrier3 By carrier 3 + * @property { string } flightNumber1 Flight number 1 + * @property { string } flightDay1 Flight day 1 + * @property { string } flightNumber2 Flight number 2 + * @property { string } flightDay2 Flight day 2 + */ +export const HouseAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string(), airportOfDestination: z.string(), toAirport1: z.string().nullish(), byCarrier1: z.string().nullish(), toAirport2: z.string().nullish(), byCarrier2: z.string().nullish(), toAirport3: z.string().nullish(), byCarrier3: z.string().nullish(), flightNumber1: z.string().nullish(), flightDay1: z.string().nullish(), flightNumber2: z.string().nullish(), flightDay2: z.string().nullish() }); +export type HouseAwbDocumentRouteDTO = z.infer; - /** - * HouseAwbDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const HouseAwbDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer< - typeof HouseAwbDocumentBusinessPartnerResponseDTOSchema - >; +/** + * HouseAwbDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const HouseAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); +export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer; - /** - * HouseAwbDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the House AWB document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the House AWB document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } currency Currency - * @property { number } versionNumber Version number of the document - * @property { string } hawbNumber HAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { HouseAwbDocumentCargoDTO[] } cargo Cargo packages - * @property { HouseAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } signingLocation Signing location - * @property { string } issuerIataCode Issuer IATA code - * @property { HouseAwbDocumentRouteDTO } route Route - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } issuer Issuer - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { CommonModels.DocumentConfigDTO } config Config - */ - export const HouseAwbDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the House AWB document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference"), - name: z.string().describe("Name of the House AWB document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - currency: z.string().describe("Currency").nullish(), - versionNumber: z.number().describe("Version number of the document"), - hawbNumber: z.string().describe("HAWB number").nullish(), - sciReference: z.string().describe("SCI reference").nullish(), - reference1: z.string().describe("Reference 1").nullish(), - reference2: z.string().describe("Reference 2").nullish(), - reference3: z.string().describe("Reference 3").nullish(), - exchangeRate: z.number().describe("Exchange rate").nullish(), - additionalText: CommonModels.EditorContentResponseDtoSchema.describe( - "Additional text for the document", - ).nullish(), - handlingInstructions: z.string().describe("Handling instructions").nullish(), - accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), - additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), - isSecured: z.boolean().describe("Is secured"), - suppressContainerWeight: z.boolean().describe("Suppress container weight"), - suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), - cargo: z.array(HouseAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), - charges: HouseAwbDocumentChargesDTOSchema.describe("Charges").nullish(), - shipperSigner: z.string().describe("Shipper signer").nullish(), - shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), - signer: z.string().describe("Signer").nullish(), - signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), - signingLocation: z.string().describe("Signing location").nullish(), - issuerIataCode: z.string().describe("Issuer IATA code").nullish(), - route: HouseAwbDocumentRouteDTOSchema.describe("Route").nullish(), - issuer: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), - consignee: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), - shipper: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish(), - }) - .readonly(); - export type HouseAwbDocumentResponseDTO = z.infer; +/** + * HouseAwbDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the House AWB document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the House AWB document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } currency Currency + * @property { number } versionNumber Version number of the document + * @property { string } hawbNumber HAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { HouseAwbDocumentCargoDTO[] } cargo Cargo packages + * @property { HouseAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } signingLocation Signing location + * @property { string } issuerIataCode Issuer IATA code + * @property { HouseAwbDocumentRouteDTO } route Route + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } issuer Issuer + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { HouseAwbDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { CommonModels.DocumentConfigDTO } config Config + */ +export const HouseAwbDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), currency: z.string().nullish(), versionNumber: z.number(), hawbNumber: z.string().nullish(), sciReference: z.string().nullish(), reference1: z.string().nullish(), reference2: z.string().nullish(), reference3: z.string().nullish(), exchangeRate: z.number().nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.nullish(), handlingInstructions: z.string().nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.nullish(), additionalAccountingNotes: z.string().nullish(), isSecured: z.boolean(), suppressContainerWeight: z.boolean(), suppressCargoMeasurement: z.boolean(), cargo: z.array(HouseAwbDocumentCargoDTOSchema).nullish(), charges: HouseAwbDocumentChargesDTOSchema.nullish(), shipperSigner: z.string().nullish(), shipperSignerUserName: z.string().nullish(), signer: z.string().nullish(), signingDate: z.iso.datetime({ offset: true }).nullish(), signingLocation: z.string().nullish(), issuerIataCode: z.string().nullish(), route: HouseAwbDocumentRouteDTOSchema.nullish(), issuer: HouseAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: HouseAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: HouseAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), config: CommonModels.DocumentConfigDTOSchema.nullish() }); +export type HouseAwbDocumentResponseDTO = z.infer; - /** - * UpdateHouseAwbDocumentChargesOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - */ - export const UpdateHouseAwbDocumentChargesOtherChargeDTOSchema = z - .object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }) - .readonly(); - export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer< - typeof UpdateHouseAwbDocumentChargesOtherChargeDTOSchema - >; +/** + * UpdateHouseAwbDocumentChargesOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + */ +export const UpdateHouseAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullable(), sellRate: z.number().nullable() }).partial(); +export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer; - /** - * UpdateHouseAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { UpdateHouseAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges - */ - export const UpdateHouseAwbDocumentChargesDTOSchema = z - .object({ - weightCharge: z.number().describe("Weight charge"), - otherCharges: z.array(UpdateHouseAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges"), - }) - .readonly(); - export type UpdateHouseAwbDocumentChargesDTO = z.infer; +/** + * UpdateHouseAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { UpdateHouseAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges + */ +export const UpdateHouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().nullable(), otherCharges: z.array(UpdateHouseAwbDocumentChargesOtherChargeDTOSchema).nullable() }).partial(); +export type UpdateHouseAwbDocumentChargesDTO = z.infer; - /** - * UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema - >; +/** + * UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); +export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateHouseAwbDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } hawbNumber HAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { UpdateHouseAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } issuerId Issuer ID + * @property { string } issuerName Issuer name + * @property { string } issuerAddress Issuer address + * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateHouseAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), hawbNumber: z.string().nullable(), sciReference: z.string().nullable(), reference1: z.string().nullable(), reference2: z.string().nullable(), reference3: z.string().nullable(), exchangeRate: z.number().nullable(), additionalText: CommonModels.EditorContentUpdateDtoSchema.nullable(), handlingInstructions: z.string().nullable(), accountInformation: CommonModels.AccountInformationEnumSchema.nullable(), additionalAccountingNotes: z.string().nullable(), isSecured: z.boolean().nullable(), suppressContainerWeight: z.boolean().nullable(), suppressCargoMeasurement: z.boolean().nullable(), charges: UpdateHouseAwbDocumentChargesDTOSchema.nullable(), shipperSigner: z.string().nullable(), shipperSignerUserName: z.string().nullable(), signer: z.string().nullable(), signingDate: z.iso.datetime({ offset: true }).nullable(), issuerId: z.string().nullable(), issuerName: z.string().nullable(), issuerAddress: z.string().nullable(), consignee: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); +export type UpdateHouseAwbDocumentRequestDTO = z.infer; - /** - * UpdateHouseAwbDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } hawbNumber HAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { UpdateHouseAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } issuerId Issuer ID - * @property { string } issuerName Issuer name - * @property { string } issuerAddress Issuer address - * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateHouseAwbDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Document name suffix"), - hawbNumber: z.string().describe("HAWB number"), - sciReference: z.string().describe("SCI reference"), - reference1: z.string().describe("Reference 1"), - reference2: z.string().describe("Reference 2"), - reference3: z.string().describe("Reference 3"), - exchangeRate: z.number().describe("Exchange rate"), - additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), - handlingInstructions: z.string().describe("Handling instructions"), - accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), - additionalAccountingNotes: z.string().describe("Additional accounting notes"), - isSecured: z.boolean().describe("Is secured"), - suppressContainerWeight: z.boolean().describe("Suppress container weight"), - suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), - charges: UpdateHouseAwbDocumentChargesDTOSchema.describe("Charges"), - shipperSigner: z.string().describe("Shipper signer"), - shipperSignerUserName: z.string().describe("Shipper signer user name"), - signer: z.string().describe("Signer"), - signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), - issuerId: z.string().describe("Issuer ID"), - issuerName: z.string().describe("Issuer name"), - issuerAddress: z.string().describe("Issuer address"), - consignee: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), - shipper: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateHouseAwbDocumentRequestDTO = z.infer; } diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts index 6f91afa..2cb6a5e 100644 --- a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts +++ b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,257 +9,203 @@ import { CommonModels } from "@/data/common/common.models"; import { WorkingDocumentsHouseAwbApi } from "./workingDocumentsHouseAwb.api"; export namespace WorkingDocumentsHouseAwbQueries { - export const moduleName = QueryModule.WorkingDocumentsHouseAwb; +export const moduleName = QueryModule.WorkingDocumentsHouseAwb; - export const keys = { +export const keys = { all: [moduleName] as const, - getHouseAwbData: (positionId: string, hawbId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId", positionId, hawbId, officeId] as const, - previewHouseAwb: (positionId: string, hawbId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/hawbs/:hawbId/preview", - positionId, - hawbId, - officeId, - ] as const, - }; + getHouseAwbData: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId", positionId, hawbId, officeId] as const, + previewHouseAwb: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId/preview", positionId, hawbId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a House AWB document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId } )); + return WorkingDocumentsHouseAwbApi.create(positionId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetHouseAwbData` + * @summary Get House AWB document data + * @permission Requires `canUseGetHouseAwbData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.hawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetHouseAwbData = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId } )); + return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateHouseAwbData` + * @summary Update House AWB document data + * @permission Requires `canUseUpdateHouseAwbData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateHouseAwbData = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId } )); + return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, hawbId, officeId } = variables; + const updateKeys = [keys.getHouseAwbData(positionId, hawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteHouseAwb` + * @summary Delete House AWB document + * @permission Requires `canUseDeleteHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } House AWB document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewHouseAwb` - recommended when file should be cached + * @summary Preview House AWB document + * @permission Requires `canUsePreviewHouseAwb` ability + * @param { string } object.positionId Path parameter + * @param { string } object.hawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseAwb = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewHouseAwbMutation` - recommended when file should not be cached + * @summary Preview House AWB document + * @permission Requires `canUsePreviewHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, hawbId, officeId } = variables; + const updateKeys = [keys.previewHouseAwb(positionId, hawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateHouseAwb` + * @summary Generate House AWB document + * @permission Requires `canUseGenerateHouseAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.hawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, hawbId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId } )); + return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create a House AWB document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId })); - return WorkingDocumentsHouseAwbApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetHouseAwbData` - * @summary Get House AWB document data - * @permission Requires `canUseGetHouseAwbData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.hawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetHouseAwbData = ( - { positionId, hawbId, officeId }: { positionId: string; hawbId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId })); - return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateHouseAwbData` - * @summary Update House AWB document data - * @permission Requires `canUseUpdateHouseAwbData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateHouseAwbData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseAwbApi.updateHouseAwbData, - { - positionId: string; - hawbId: string; - officeId: string; - data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId })); - return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, hawbId, officeId } = variables; - const updateKeys = [keys.getHouseAwbData(positionId, hawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteHouseAwb` - * @summary Delete House AWB document - * @permission Requires `canUseDeleteHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } House AWB document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteHouseAwb = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseAwbApi.deleteHouseAwb, - { positionId: string; hawbId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId })); - return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewHouseAwb` - recommended when file should be cached - * @summary Preview House AWB document - * @permission Requires `canUsePreviewHouseAwb` ability - * @param { string } object.positionId Path parameter - * @param { string } object.hawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseAwb = ( - { positionId, hawbId, officeId }: { positionId: string; hawbId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId })); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewHouseAwbMutation` - recommended when file should not be cached - * @summary Preview House AWB document - * @permission Requires `canUsePreviewHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseAwbMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseAwbApi.previewHouseAwb, - { positionId: string; hawbId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId })); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, hawbId, officeId } = variables; - const updateKeys = [keys.previewHouseAwb(positionId, hawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateHouseAwb` - * @summary Generate House AWB document - * @permission Requires `canUseGenerateHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateHouseAwb = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseAwbApi.generateHouseAwb, - { positionId: string; hawbId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId })); - return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts index d23cec5..7e3bdd2 100644 --- a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts +++ b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts @@ -1,99 +1,108 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsHouseBlAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Create", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Create", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - /** - * Use for `useGetHouseBlData` query ability. For global ability, omit the object parameter. - * @description Read house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseBlData` query - */ - export const canUseGetHouseBlData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Read", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; +/** + * Use for `useGetHouseBlData` query ability. For global ability, omit the object parameter. + * @description Read house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseBlData` query + */ +export const canUseGetHouseBlData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - /** - * Use for `useUpdateHouseBlData` mutation ability. For global ability, omit the object parameter. - * @description Update house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseBlData` mutation - */ - export const canUseUpdateHouseBlData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Update", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; +/** + * Use for `useUpdateHouseBlData` mutation ability. For global ability, omit the object parameter. + * @description Update house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseBlData` mutation + */ +export const canUseUpdateHouseBlData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - /** - * Use for `useDeleteHouseBl` mutation ability. For global ability, omit the object parameter. - * @description Delete house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseBl` mutation - */ - export const canUseDeleteHouseBl = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Delete", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; +/** + * Use for `useDeleteHouseBl` mutation ability. For global ability, omit the object parameter. + * @description Delete house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseBl` mutation + */ +export const canUseDeleteHouseBl = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Delete", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - /** - * Use for `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation - */ - export const canUsePreviewHouseBl = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Read", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; +/** + * Use for `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation + */ +export const canUsePreviewHouseBl = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - /** - * Use for `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview house BL document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation - */ - export const canUsePreviewHouseBlEml = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Read", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; +/** + * Use for `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview house BL document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation + */ +export const canUsePreviewHouseBlEml = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - /** - * Use for `useGenerateHouseBl` mutation ability. For global ability, omit the object parameter. - * @description Generate house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseBl` mutation - */ - export const canUseGenerateHouseBl = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Update", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; +/** + * Use for `useGenerateHouseBl` mutation ability. For global ability, omit the object parameter. + * @description Generate house BL document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseBl` mutation + */ +export const canUseGenerateHouseBl = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; + +/** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate house BL document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ +export const canUseGenerateDocumentEml = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" +] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - /** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate house BL document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ - export const canUseGenerateDocumentEml = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Update", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts index 9efb3f5..7f9ed62 100644 --- a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts +++ b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts @@ -1,136 +1,85 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsHouseBlApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls`, - undefined, - config, - ); - }; - - export const getHouseBlData = ( - positionId: string, - houseBlId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls`, + + ) +}; +export const getHouseBlData = (positionId: string, houseBlId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - config, - ); - }; - - export const updateHouseBlData = ( - positionId: string, - houseBlId: string, - officeId: string, - data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + + ) +}; +export const updateHouseBlData = (positionId: string, houseBlId: string, officeId: string, data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, ) => { return AppRestClient.patch( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), - config, - ); - }; - - export const deleteHouseBl = ( - positionId: string, - houseBlId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), + + ) +}; +export const deleteHouseBl = (positionId: string, houseBlId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - undefined, - config, - ); - }; - - export const previewHouseBl = ( - positionId: string, - houseBlId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, + + ) +}; +export const previewHouseBl = (positionId: string, houseBlId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const previewHouseBlEml = ( - positionId: string, - houseBlId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const previewHouseBlEml = (positionId: string, houseBlId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generateHouseBl = ( - positionId: string, - houseBlId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, + { + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateHouseBl = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; - - export const generateDocumentEml = ( - positionId: string, - houseBlId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; +export const generateDocumentEml = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; } diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts index 1feb430..cd3e571 100644 --- a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts +++ b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts @@ -2,349 +2,195 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsHouseBlModels { - /** - * HouseBlDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { number } quantityOfCopies Quantity of copies - * @property { string } date Date - * @property { string } location Location - * @property { string } signer Signer - * @property { boolean } hideSignature Hide signature - * @property { boolean } capsLock Render issuer/signer in caps lock - * @property { string } documentTitle Document title - */ - export const HouseBlDocumentSettingsDtoDTOSchema = z - .object({ - quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), - quantityOfCopies: z.number().describe("Quantity of copies"), - date: z.iso.datetime({ offset: true }).describe("Date"), - location: z.string().describe("Location"), - signer: z.string().describe("Signer"), - hideSignature: z.boolean().describe("Hide signature"), - capsLock: z.boolean().describe("Render issuer/signer in caps lock"), - documentTitle: z.string().describe("Document title"), - }) - .readonly(); - export type HouseBlDocumentSettingsDtoDTO = z.infer; +/** + * HouseBlDocumentSettingsDtoDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { number } quantityOfCopies Quantity of copies + * @property { string } date Date + * @property { string } location Location + * @property { string } signer Signer + * @property { boolean } hideSignature Hide signature + * @property { boolean } capsLock Render issuer/signer in caps lock + * @property { string } documentTitle Document title + */ +export const HouseBlDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), quantityOfCopies: z.number().nullable(), date: z.iso.datetime({ offset: true }).nullable(), location: z.string().nullable(), signer: z.string().nullable(), hideSignature: z.boolean().nullable(), capsLock: z.boolean().nullable(), documentTitle: z.string().nullable() }).partial(); +export type HouseBlDocumentSettingsDtoDTO = z.infer; - /** - * HouseBlDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const HouseBlDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer< - typeof HouseBlDocumentBusinessPartnerResponseDTOSchema - >; +/** + * HouseBlDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const HouseBlDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); +export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer; - /** - * HouseBlDocumentCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ - export const HouseBlDocumentCountryResponseDTOSchema = z - .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) - .readonly(); - export type HouseBlDocumentCountryResponseDTO = z.infer; +/** + * HouseBlDocumentCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ +export const HouseBlDocumentCountryResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type HouseBlDocumentCountryResponseDTO = z.infer; - /** - * HouseBlDocumentPlaceResponseDTOSchema - * @type { object } - * @property { string } id ID of the place - * @property { string } name Name of the place - */ - export const HouseBlDocumentPlaceResponseDTOSchema = z - .object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }) - .readonly(); - export type HouseBlDocumentPlaceResponseDTO = z.infer; +/** + * HouseBlDocumentPlaceResponseDTOSchema + * @type { object } + * @property { string } id ID of the place + * @property { string } name Name of the place + */ +export const HouseBlDocumentPlaceResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type HouseBlDocumentPlaceResponseDTO = z.infer; - /** - * HouseBlDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ - export const HouseBlDocumentPortResponseDTOSchema = z - .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) - .readonly(); - export type HouseBlDocumentPortResponseDTO = z.infer; +/** + * HouseBlDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ +export const HouseBlDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type HouseBlDocumentPortResponseDTO = z.infer; - /** - * HouseBlDocumentTerminalResponseDTOSchema - * @type { object } - * @property { string } id ID of the terminal - * @property { string } name Name of the terminal - */ - export const HouseBlDocumentTerminalResponseDTOSchema = z - .object({ id: z.string().describe("ID of the terminal"), name: z.string().describe("Name of the terminal") }) - .readonly(); - export type HouseBlDocumentTerminalResponseDTO = z.infer; +/** + * HouseBlDocumentTerminalResponseDTOSchema + * @type { object } + * @property { string } id ID of the terminal + * @property { string } name Name of the terminal + */ +export const HouseBlDocumentTerminalResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type HouseBlDocumentTerminalResponseDTO = z.infer; - /** - * HouseBlDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the house BL document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the house BL document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } blNumber Bill of lading number - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } exportReference Export reference number - * @property { HouseBlDocumentBusinessPartnerResponseDTO } forwarder Forwarder information for the shipment - * @property { HouseBlDocumentCountryResponseDTO } originCountry Origin country - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { CommonModels.EditorContentResponseDto } additionalTextTop Additional text for the document - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { HouseBlDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } cargoReleaseBy Delivery agent information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information - * @property { HouseBlDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information - * @property { string } precarriageByText Pre-carriage by free-text override - * @property { HouseBlDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information - * @property { string } placeOfReceiptText Place of receipt free-text override - * @property { string } vessel Name of the vessel - * @property { string } voyage Voyage number of the vessel - * @property { string } declaredValue Declared value of the shipment - * @property { number } rateOfExchange Rate of exchange of the shipment - * @property { string } currency Currency of the shipment - * @property { string } freightPayable Freight payable of the shipment - * @property { string } issuer Issuer - * @property { HouseBlDocumentPortResponseDTO } portOfLoading Port of loading information - * @property { string } portOfLoadingText Port of loading free-text override - * @property { HouseBlDocumentTerminalResponseDTO } loadingPierTerminal Loading pier/terminal information - * @property { string } loadingPierTerminalText Loading pier/terminal free-text override - * @property { HouseBlDocumentPortResponseDTO } portOfDischarge Port of discharge information - * @property { string } portOfDischargeText Port of discharge free-text override - * @property { HouseBlDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information - * @property { string } placeOfDeliveryText Place of delivery free-text override - * @property { HouseBlDocumentPlaceResponseDTO } originalsToBeReleasedAt Originals to be released at information - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { string } typeOfMove Type of move - * @property { string } placeOfIssue - * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data - * @property { HouseBlDocumentSettingsDtoDTO } settings Settings for the House BL document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ - export const HouseBlDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the house BL document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference").nullish(), - name: z.string().describe("Name of the house BL document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - blNumber: z.string().describe("Bill of lading number").nullish(), - carrierBookingNumber: z.string().describe("Carrier booking number").nullish(), - exportReference: z.string().describe("Export reference number").nullish(), - forwarder: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe( - "Forwarder information for the shipment", - ).nullish(), - originCountry: HouseBlDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), - useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), - additionalText: CommonModels.EditorContentResponseDtoSchema.describe( - "Additional text for the document", - ).nullish(), - additionalTextTop: CommonModels.EditorContentResponseDtoSchema.describe( - "Additional text for the document", - ).nullish(), - direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), - transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), - versionNumber: z.number().describe("Version number of the document"), - consignee: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information for the shipment"), - shipper: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), - cargoReleaseBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe( - "Delivery agent information for the shipment", - ).nullish(), - notify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Notify party information for the shipment"), - alsoNotify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Additional notify party information"), - precarriageBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), - precarriageByText: z.string().describe("Pre-carriage by free-text override").nullish(), - placeOfReceipt: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), - placeOfReceiptText: z.string().describe("Place of receipt free-text override").nullish(), - vessel: z.string().describe("Name of the vessel").nullish(), - voyage: z.string().describe("Voyage number of the vessel").nullish(), - declaredValue: z.string().describe("Declared value of the shipment").nullish(), - rateOfExchange: z.number().describe("Rate of exchange of the shipment").nullish(), - currency: z.string().describe("Currency of the shipment").nullish(), - freightPayable: z.string().describe("Freight payable of the shipment").nullish(), - issuer: z.string().describe("Issuer").nullish(), - portOfLoading: HouseBlDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), - portOfLoadingText: z.string().describe("Port of loading free-text override").nullish(), - loadingPierTerminal: HouseBlDocumentTerminalResponseDTOSchema.describe( - "Loading pier/terminal information", - ).nullish(), - loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override").nullish(), - portOfDischarge: HouseBlDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), - portOfDischargeText: z.string().describe("Port of discharge free-text override").nullish(), - placeOfDelivery: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), - placeOfDeliveryText: z.string().describe("Place of delivery free-text override").nullish(), - originalsToBeReleasedAt: HouseBlDocumentPlaceResponseDTOSchema.describe( - "Originals to be released at information", - ).nullish(), - originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override").nullish(), - typeOfMove: z.string().describe("Type of move").nullish(), - placeOfIssue: z.string().nullish(), - data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), - settings: HouseBlDocumentSettingsDtoDTOSchema.describe("Settings for the House BL document").nullish(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), - }) - .readonly(); - export type HouseBlDocumentResponseDTO = z.infer; +/** + * HouseBlDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the house BL document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the house BL document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } blNumber Bill of lading number + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } exportReference Export reference number + * @property { HouseBlDocumentBusinessPartnerResponseDTO } forwarder Forwarder information for the shipment + * @property { HouseBlDocumentCountryResponseDTO } originCountry Origin country + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { CommonModels.EditorContentResponseDto } additionalTextTop Additional text for the document + * @property { string } direction Direction of the shipment (e.g., import/export) + * @property { string } transportMode Mode of transport for the shipment + * @property { number } versionNumber Version number of the document + * @property { HouseBlDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } cargoReleaseBy Delivery agent information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment + * @property { HouseBlDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information + * @property { HouseBlDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information + * @property { string } precarriageByText Pre-carriage by free-text override + * @property { HouseBlDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information + * @property { string } placeOfReceiptText Place of receipt free-text override + * @property { string } vessel Name of the vessel + * @property { string } voyage Voyage number of the vessel + * @property { string } declaredValue Declared value of the shipment + * @property { number } rateOfExchange Rate of exchange of the shipment + * @property { string } currency Currency of the shipment + * @property { string } freightPayable Freight payable of the shipment + * @property { string } issuer Issuer + * @property { HouseBlDocumentPortResponseDTO } portOfLoading Port of loading information + * @property { string } portOfLoadingText Port of loading free-text override + * @property { HouseBlDocumentTerminalResponseDTO } loadingPierTerminal Loading pier/terminal information + * @property { string } loadingPierTerminalText Loading pier/terminal free-text override + * @property { HouseBlDocumentPortResponseDTO } portOfDischarge Port of discharge information + * @property { string } portOfDischargeText Port of discharge free-text override + * @property { HouseBlDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information + * @property { string } placeOfDeliveryText Place of delivery free-text override + * @property { HouseBlDocumentPlaceResponseDTO } originalsToBeReleasedAt Originals to be released at information + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { string } typeOfMove Type of move + * @property { string } placeOfIssue + * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data + * @property { HouseBlDocumentSettingsDtoDTO } settings Settings for the House BL document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + */ +export const HouseBlDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), blNumber: z.string().nullish(), carrierBookingNumber: z.string().nullish(), exportReference: z.string().nullish(), forwarder: HouseBlDocumentBusinessPartnerResponseDTOSchema.nullish(), originCountry: HouseBlDocumentCountryResponseDTOSchema.nullish(), useLatterOfCredit: z.boolean().nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.nullish(), additionalTextTop: CommonModels.EditorContentResponseDtoSchema.nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), versionNumber: z.number(), consignee: HouseBlDocumentBusinessPartnerResponseDTOSchema, shipper: HouseBlDocumentBusinessPartnerResponseDTOSchema, cargoReleaseBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.nullish(), notify: HouseBlDocumentBusinessPartnerResponseDTOSchema, alsoNotify: HouseBlDocumentBusinessPartnerResponseDTOSchema, precarriageBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.nullish(), precarriageByText: z.string().nullish(), placeOfReceipt: HouseBlDocumentPlaceResponseDTOSchema.nullish(), placeOfReceiptText: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), declaredValue: z.string().nullish(), rateOfExchange: z.number().nullish(), currency: z.string().nullish(), freightPayable: z.string().nullish(), issuer: z.string().nullish(), portOfLoading: HouseBlDocumentPortResponseDTOSchema.nullish(), portOfLoadingText: z.string().nullish(), loadingPierTerminal: HouseBlDocumentTerminalResponseDTOSchema.nullish(), loadingPierTerminalText: z.string().nullish(), portOfDischarge: HouseBlDocumentPortResponseDTOSchema.nullish(), portOfDischargeText: z.string().nullish(), placeOfDelivery: HouseBlDocumentPlaceResponseDTOSchema.nullish(), placeOfDeliveryText: z.string().nullish(), originalsToBeReleasedAt: HouseBlDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAtText: z.string().nullish(), typeOfMove: z.string().nullish(), placeOfIssue: z.string().nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.nullish(), settings: HouseBlDocumentSettingsDtoDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.HBLDocumentConfigDtoSchema }); +export type HouseBlDocumentResponseDTO = z.infer; - /** - * UpdateHouseBlDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { number } quantityOfCopies Quantity of copies - * @property { string } blNumber BL number - * @property { string } exportReference Export reference number - * @property { string } location Location - * @property { string } signer Signer - * @property { boolean } hideSignature Hide signature - * @property { boolean } capsLock Render issuer/signer in caps lock - * @property { string } date Date - * @property { string } documentTitle Document title - */ - export const UpdateHouseBlDocumentSettingsRequestDTOSchema = z - .object({ - quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), - quantityOfCopies: z.number().describe("Quantity of copies"), - blNumber: z.string().describe("BL number"), - exportReference: z.string().describe("Export reference number"), - location: z.string().describe("Location"), - signer: z.string().describe("Signer"), - hideSignature: z.boolean().describe("Hide signature"), - capsLock: z.boolean().describe("Render issuer/signer in caps lock"), - date: z.iso.datetime({ offset: true }).describe("Date"), - documentTitle: z.string().describe("Document title"), - }) - .readonly(); - export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; +/** + * UpdateHouseBlDocumentSettingsRequestDTOSchema + * @type { object } + * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals + * @property { number } quantityOfCopies Quantity of copies + * @property { string } blNumber BL number + * @property { string } exportReference Export reference number + * @property { string } location Location + * @property { string } signer Signer + * @property { boolean } hideSignature Hide signature + * @property { boolean } capsLock Render issuer/signer in caps lock + * @property { string } date Date + * @property { string } documentTitle Document title + */ +export const UpdateHouseBlDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), quantityOfCopies: z.number().nullable(), blNumber: z.string().nullable(), exportReference: z.string().nullable(), location: z.string().nullable(), signer: z.string().nullable(), hideSignature: z.boolean().nullable(), capsLock: z.boolean().nullable(), date: z.iso.datetime({ offset: true }).nullable(), documentTitle: z.string().nullable() }).partial(); +export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; - /** - * UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema - >; +/** + * UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); +export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateHouseBlDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } blNumber Bill of lading number + * @property { string } carrierBookingNumber Carrier booking number + * @property { string } exportReference Export reference number + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } forwarder Forwarder information + * @property { string } originCountryId Origin country ID + * @property { boolean } useLatterOfCredit Whether to use letter of credit + * @property { string } declaredValue Declared value + * @property { number } rateOfExchange Rate of exchange + * @property { string } freightPayable Freight payable + * @property { string } issuer Issuer + * @property { string } placeOfIssue Place of issue + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text + * @property { CommonModels.EditorContentUpdateDto } additionalTextTop Additional text top + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } shipper Shipper information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } notify Notify party information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } cargoReleaseBy Cargo release party information + * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information + * @property { string } precarriageById Pre-carriage by ID + * @property { string } precarriageByText Pre-carriage by free-text override + * @property { string } placeOfReceiptId Place of receipt ID + * @property { string } placeOfReceiptText Place of receipt free-text override + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } portOfLoadingId Port of loading ID + * @property { string } portOfLoadingText Port of loading free-text override + * @property { string } loadingPierTerminalId Loading pier/terminal ID + * @property { string } loadingPierTerminalText Loading pier/terminal free-text override + * @property { string } portOfDischargeId Port of discharge ID + * @property { string } portOfDischargeText Port of discharge free-text override + * @property { string } placeOfDeliveryId Place of delivery ID + * @property { string } placeOfDeliveryText Place of delivery free-text override + * @property { string } originalsToBeReleasedAtId Originals to be released at ID + * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override + * @property { string } typeOfMove Type of move + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + * @property { UpdateHouseBlDocumentSettingsRequestDTO } settings Settings + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data + */ +export const UpdateHouseBlDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), blNumber: z.string().nullable(), carrierBookingNumber: z.string().nullable(), exportReference: z.string().nullable(), forwarder: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), originCountryId: z.string().nullable(), useLatterOfCredit: z.boolean().nullable(), declaredValue: z.string().nullable(), rateOfExchange: z.number().nullable(), freightPayable: z.string().nullable(), issuer: z.string().nullable(), placeOfIssue: z.string().nullable(), additionalText: CommonModels.EditorContentUpdateDtoSchema.nullable(), additionalTextTop: CommonModels.EditorContentUpdateDtoSchema.nullable(), consignee: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), notify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), cargoReleaseBy: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), alsoNotify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), precarriageById: z.string().nullable(), precarriageByText: z.string().nullable(), placeOfReceiptId: z.string().nullable(), placeOfReceiptText: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), portOfLoadingId: z.string().nullable(), portOfLoadingText: z.string().nullable(), loadingPierTerminalId: z.string().nullable(), loadingPierTerminalText: z.string().nullable(), portOfDischargeId: z.string().nullable(), portOfDischargeText: z.string().nullable(), placeOfDeliveryId: z.string().nullable(), placeOfDeliveryText: z.string().nullable(), originalsToBeReleasedAtId: z.string().nullable(), originalsToBeReleasedAtText: z.string().nullable(), typeOfMove: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), settings: UpdateHouseBlDocumentSettingsRequestDTOSchema.nullable(), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.nullable() }).partial(); +export type UpdateHouseBlDocumentRequestDTO = z.infer; - /** - * UpdateHouseBlDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } blNumber Bill of lading number - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } exportReference Export reference number - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } forwarder Forwarder information - * @property { string } originCountryId Origin country ID - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } declaredValue Declared value - * @property { number } rateOfExchange Rate of exchange - * @property { string } freightPayable Freight payable - * @property { string } issuer Issuer - * @property { string } placeOfIssue Place of issue - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text - * @property { CommonModels.EditorContentUpdateDto } additionalTextTop Additional text top - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } notify Notify party information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } cargoReleaseBy Cargo release party information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information - * @property { string } precarriageById Pre-carriage by ID - * @property { string } precarriageByText Pre-carriage by free-text override - * @property { string } placeOfReceiptId Place of receipt ID - * @property { string } placeOfReceiptText Place of receipt free-text override - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } portOfLoadingId Port of loading ID - * @property { string } portOfLoadingText Port of loading free-text override - * @property { string } loadingPierTerminalId Loading pier/terminal ID - * @property { string } loadingPierTerminalText Loading pier/terminal free-text override - * @property { string } portOfDischargeId Port of discharge ID - * @property { string } portOfDischargeText Port of discharge free-text override - * @property { string } placeOfDeliveryId Place of delivery ID - * @property { string } placeOfDeliveryText Place of delivery free-text override - * @property { string } originalsToBeReleasedAtId Originals to be released at ID - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { string } typeOfMove Type of move - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { UpdateHouseBlDocumentSettingsRequestDTO } settings Settings - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data - */ - export const UpdateHouseBlDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Document name suffix"), - blNumber: z.string().describe("Bill of lading number"), - carrierBookingNumber: z.string().describe("Carrier booking number"), - exportReference: z.string().describe("Export reference number"), - forwarder: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), - originCountryId: z.string().describe("Origin country ID"), - useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), - declaredValue: z.string().describe("Declared value"), - rateOfExchange: z.number().describe("Rate of exchange"), - freightPayable: z.string().describe("Freight payable"), - issuer: z.string().describe("Issuer"), - placeOfIssue: z.string().describe("Place of issue"), - additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), - additionalTextTop: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text top"), - consignee: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), - shipper: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), - notify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), - cargoReleaseBy: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Cargo release party information"), - alsoNotify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), - precarriageById: z.string().describe("Pre-carriage by ID"), - precarriageByText: z.string().describe("Pre-carriage by free-text override"), - placeOfReceiptId: z.string().describe("Place of receipt ID"), - placeOfReceiptText: z.string().describe("Place of receipt free-text override"), - vessel: z.string().describe("Vessel name"), - voyage: z.string().describe("Voyage number"), - portOfLoadingId: z.string().describe("Port of loading ID"), - portOfLoadingText: z.string().describe("Port of loading free-text override"), - loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), - loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override"), - portOfDischargeId: z.string().describe("Port of discharge ID"), - portOfDischargeText: z.string().describe("Port of discharge free-text override"), - placeOfDeliveryId: z.string().describe("Place of delivery ID"), - placeOfDeliveryText: z.string().describe("Place of delivery free-text override"), - originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), - originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), - typeOfMove: z.string().describe("Type of move"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - settings: UpdateHouseBlDocumentSettingsRequestDTOSchema.describe("Settings"), - data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), - }) - .readonly(); - export type UpdateHouseBlDocumentRequestDTO = z.infer; } diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts index 37c9f40..17f207b 100644 --- a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts +++ b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,383 +9,288 @@ import { CommonModels } from "@/data/common/common.models"; import { WorkingDocumentsHouseBlApi } from "./workingDocumentsHouseBl.api"; export namespace WorkingDocumentsHouseBlQueries { - export const moduleName = QueryModule.WorkingDocumentsHouseBl; +export const moduleName = QueryModule.WorkingDocumentsHouseBl; - export const keys = { +export const keys = { all: [moduleName] as const, - getHouseBlData: (positionId: string, houseBlId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/house-bls/:houseBlId", - positionId, - houseBlId, - officeId, - ] as const, - previewHouseBl: (positionId: string, houseBlId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview", - positionId, - houseBlId, - officeId, - ] as const, - previewHouseBlEml: (positionId: string, houseBlId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview/eml", - positionId, - houseBlId, - officeId, - ] as const, - }; + getHouseBlData: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId", positionId, houseBlId, officeId] as const, + previewHouseBl: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview", positionId, houseBlId, officeId] as const, + previewHouseBlEml: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview/eml", positionId, houseBlId, officeId] as const, +}; - /** - * Mutation `useCreate` - * @summary Create a house BL document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Mutation `useCreate` + * @summary Create a house BL document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId })); - return WorkingDocumentsHouseBlApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId } )); + return WorkingDocumentsHouseBlApi.create(positionId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Query `useGetHouseBlData` - * @summary Get house BL document data - * @permission Requires `canUseGetHouseBlData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetHouseBlData = ( - { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Query `useGetHouseBlData` + * @summary Get house BL document data + * @permission Requires `canUseGetHouseBlData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetHouseBlData = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId } )); + return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId) }, + ...options, + }); +}; - return useQuery({ - queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId })); - return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useUpdateHouseBlData` + * @summary Update house BL document data + * @permission Requires `canUseUpdateHouseBlData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateHouseBlData = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useUpdateHouseBlData` - * @summary Update house BL document data - * @permission Requires `canUseUpdateHouseBlData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateHouseBlData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.updateHouseBlData, - { - positionId: string; - houseBlId: string; - officeId: string; - data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId } )); + return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.getHouseBlData(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId })); - return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.getHouseBlData(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useDeleteHouseBl` + * @summary Delete house BL document + * @permission Requires `canUseDeleteHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } House BL document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteHouseBl = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useDeleteHouseBl` - * @summary Delete house BL document - * @permission Requires `canUseDeleteHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } House BL document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteHouseBl = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.deleteHouseBl, - { positionId: string; houseBlId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId })); - return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Query `usePreviewHouseBl` - recommended when file should be cached + * @summary Preview house BL document + * @permission Requires `canUsePreviewHouseBl` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBl = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId) }, + ...options, + }); +}; - /** - * Query `usePreviewHouseBl` - recommended when file should be cached - * @summary Preview house BL document - * @permission Requires `canUsePreviewHouseBl` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseBl = ( - { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); +/** + * Mutation `usePreviewHouseBlMutation` - recommended when file should not be cached + * @summary Preview house BL document + * @permission Requires `canUsePreviewHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - return useQuery({ - queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId })); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config); - }, - ...options, - }); - }; + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `usePreviewHouseBlMutation` - recommended when file should not be cached - * @summary Preview house BL document - * @permission Requires `canUsePreviewHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseBlMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.previewHouseBl, - { positionId: string; houseBlId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); +/** + * Query `usePreviewHouseBlEml` - recommended when file should be cached + * @summary Preview house BL document and return EML file + * @permission Requires `canUsePreviewHouseBlEml` ability + * @param { string } object.positionId Path parameter + * @param { string } object.houseBlId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBlEml = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId) }, + ...options, + }); +}; - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId })); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [ - keys.previewHouseBl(positionId, houseBlId, officeId), - keys.previewHouseBlEml(positionId, houseBlId, officeId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `usePreviewHouseBlEmlMutation` - recommended when file should not be cached + * @summary Preview house BL document and return EML file + * @permission Requires `canUsePreviewHouseBlEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewHouseBlEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Query `usePreviewHouseBlEml` - recommended when file should be cached - * @summary Preview house BL document and return EML file - * @permission Requires `canUsePreviewHouseBlEml` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseBlEml = ( - { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useQuery({ - queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId })); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config); - }, - ...options, - }); - }; +/** + * Mutation `useGenerateHouseBl` + * @summary Generate house BL document + * @permission Requires `canUseGenerateHouseBl` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateHouseBl = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `usePreviewHouseBlEmlMutation` - recommended when file should not be cached - * @summary Preview house BL document and return EML file - * @permission Requires `canUsePreviewHouseBlEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseBlEmlMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.previewHouseBlEml, - { positionId: string; houseBlId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId } )); + return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId })); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [ - keys.previewHouseBl(positionId, houseBlId, officeId), - keys.previewHouseBlEml(positionId, houseBlId, officeId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; +/** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate house BL document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.houseBlId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - /** - * Mutation `useGenerateHouseBl` - * @summary Generate house BL document - * @permission Requires `canUseGenerateHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateHouseBl = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.generateHouseBl, - { positionId: string; houseBlId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + return useMutation({ + mutationFn: ({ positionId, houseBlId, officeId, data }) => { + checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId } )); + return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, houseBlId, officeId } = variables; + const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId })); - return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate house BL document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGenerateDocumentEml = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.generateDocumentEml, - { positionId: string; houseBlId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId })); - return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [ - keys.previewHouseBl(positionId, houseBlId, officeId), - keys.previewHouseBlEml(positionId, houseBlId, officeId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts index 7d64f70..99aadd5 100644 --- a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts +++ b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts @@ -1,75 +1,82 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsIsfFormAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Create", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Create", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - /** - * Use for `useGetIsfData` query ability. For global ability, omit the object parameter. - * @description Read ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetIsfData` query - */ - export const canUseGetIsfData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Read", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; +/** + * Use for `useGetIsfData` query ability. For global ability, omit the object parameter. + * @description Read ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetIsfData` query + */ +export const canUseGetIsfData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - /** - * Use for `useUpdateIsfData` mutation ability. For global ability, omit the object parameter. - * @description Update ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIsfData` mutation - */ - export const canUseUpdateIsfData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Update", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; +/** + * Use for `useUpdateIsfData` mutation ability. For global ability, omit the object parameter. + * @description Update ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIsfData` mutation + */ +export const canUseUpdateIsfData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - /** - * Use for `useDeleteIsf` mutation ability. For global ability, omit the object parameter. - * @description Delete ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteIsf` mutation - */ - export const canUseDeleteIsf = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Delete", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; +/** + * Use for `useDeleteIsf` mutation ability. For global ability, omit the object parameter. + * @description Delete ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteIsf` mutation + */ +export const canUseDeleteIsf = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Delete", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - /** - * Use for `usePreviewIsf` query or `usePreviewIsfMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewIsf` query or `usePreviewIsfMutation` mutation - */ - export const canUsePreviewIsf = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Read", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; +/** + * Use for `usePreviewIsf` query or `usePreviewIsfMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewIsf` query or `usePreviewIsfMutation` mutation + */ +export const canUsePreviewIsf = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; + +/** + * Use for `useGenerateIsf` mutation ability. For global ability, omit the object parameter. + * @description Generate ISF document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIsf` mutation + */ +export const canUseGenerateIsf = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" +] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - /** - * Use for `useGenerateIsf` mutation ability. For global ability, omit the object parameter. - * @description Generate ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIsf` mutation - */ - export const canUseGenerateIsf = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Update", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts index 9dd47c9..ca27547 100644 --- a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts +++ b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts @@ -1,79 +1,58 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsIsfFormApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs`, - undefined, - config, - ); - }; - - export const getIsfData = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs`, + + ) +}; +export const getIsfData = (positionId: string, isfId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - config, - ); - }; - - export const updateIsfData = ( - positionId: string, - isfId: string, - officeId: string, - data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + + ) +}; +export const updateIsfData = (positionId: string, isfId: string, officeId: string, data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, ) => { return AppRestClient.patch( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), - config, - ); - }; - - export const deleteIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), + + ) +}; +export const deleteIsf = (positionId: string, isfId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - undefined, - config, - ); - }; - - export const previewIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, + + ) +}; +export const previewIsf = (positionId: string, isfId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generateIsf = ( - positionId: string, - isfId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateIsf = (positionId: string, isfId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts index 97121fe..2133bc5 100644 --- a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts +++ b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts @@ -2,259 +2,153 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsIsfFormModels { - /** - * IsfDocumentCargoCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ - export const IsfDocumentCargoCountryResponseDTOSchema = z - .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) - .readonly(); - export type IsfDocumentCargoCountryResponseDTO = z.infer; +/** + * IsfDocumentCargoCountryResponseDTOSchema + * @type { object } + * @property { string } id ID of the country + * @property { string } name Name of the country + */ +export const IsfDocumentCargoCountryResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type IsfDocumentCargoCountryResponseDTO = z.infer; - /** - * IsfDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } productCode Product code of the cargo - * @property { string } descriptionOfGoods Description of goods - * @property { string } htsCode HTS code of the cargo - * @property { string } manufacturerSupplier Manufacturer supplier of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - * @property { IsfDocumentCargoCountryResponseDTO } countryOfOrigin Country of origin of the cargo - */ - export const IsfDocumentCargoResponseDTOSchema = z - .object({ - productCode: z.string().describe("Product code of the cargo"), - descriptionOfGoods: z.string().describe("Description of goods"), - htsCode: z.string().describe("HTS code of the cargo"), - manufacturerSupplier: z.string().describe("Manufacturer supplier of the cargo"), - seal1: z.string().describe("Seal number 1 of the cargo"), - seal2: z.string().describe("Seal number 2 of the cargo"), - countryOfOrigin: IsfDocumentCargoCountryResponseDTOSchema.describe("Country of origin of the cargo"), - }) - .readonly(); - export type IsfDocumentCargoResponseDTO = z.infer; +/** + * IsfDocumentCargoResponseDTOSchema + * @type { object } + * @property { string } productCode Product code of the cargo + * @property { string } descriptionOfGoods Description of goods + * @property { string } htsCode HTS code of the cargo + * @property { string } manufacturerSupplier Manufacturer supplier of the cargo + * @property { string } seal1 Seal number 1 of the cargo + * @property { string } seal2 Seal number 2 of the cargo + * @property { IsfDocumentCargoCountryResponseDTO } countryOfOrigin Country of origin of the cargo + */ +export const IsfDocumentCargoResponseDTOSchema = z.object({ productCode: z.string().nullable(), descriptionOfGoods: z.string().nullable(), htsCode: z.string().nullable(), manufacturerSupplier: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), countryOfOrigin: IsfDocumentCargoCountryResponseDTOSchema.nullable() }).partial(); +export type IsfDocumentCargoResponseDTO = z.infer; - /** - * IsfDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ - export const IsfDocumentPortResponseDTOSchema = z - .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) - .readonly(); - export type IsfDocumentPortResponseDTO = z.infer; +/** + * IsfDocumentPortResponseDTOSchema + * @type { object } + * @property { string } id ID of the port + * @property { string } name Name of the port + */ +export const IsfDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); +export type IsfDocumentPortResponseDTO = z.infer; - /** - * IsfDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - * @property { string } number Number of the business partner - */ - export const IsfDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - number: z.string().describe("Number of the business partner"), - }) - .readonly(); - export type IsfDocumentBusinessPartnerResponseDTO = z.infer; +/** + * IsfDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + * @property { string } number Number of the business partner + */ +export const IsfDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable(), number: z.string().nullable() }).partial(); +export type IsfDocumentBusinessPartnerResponseDTO = z.infer; - /** - * IsfDocumentContainerLocationResponseDTOSchema - * @type { object } - * @property { string } id ID of the container location - * @property { string } name Name of the container location - * @property { string } address Address of the container location - */ - export const IsfDocumentContainerLocationResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the container location"), - name: z.string().describe("Name of the container location"), - address: z.string().describe("Address of the container location"), - }) - .readonly(); - export type IsfDocumentContainerLocationResponseDTO = z.infer; +/** + * IsfDocumentContainerLocationResponseDTOSchema + * @type { object } + * @property { string } id ID of the container location + * @property { string } name Name of the container location + * @property { string } address Address of the container location + */ +export const IsfDocumentContainerLocationResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); +export type IsfDocumentContainerLocationResponseDTO = z.infer; - /** - * IsfDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { number } versionNumber Version number of the document - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } hBLNumber HBL number - * @property { string } mBLNumber MBL number - * @property { string } scacCodeHBL SCAC code for HBL - * @property { string } scacCodeMBL SCAC code for MBL - * @property { IsfDocumentPortResponseDTO } portOfDischarge Port of discharge - * @property { string } issueLocation Issue location - * @property { string } issueDate Issue date - * @property { string } companyName Company name - * @property { object } completedBy - * @property { string } completedBy.name - * @property { string } completedBy.email - * @property { object } container - * @property { string } container.id - * @property { string } container.name - * @property { IsfDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { IsfDocumentBusinessPartnerResponseDTO } manufacturer Manufacturer information - * @property { IsfDocumentBusinessPartnerResponseDTO } seller Seller information - * @property { IsfDocumentBusinessPartnerResponseDTO } buyer Buyer information - * @property { IsfDocumentBusinessPartnerResponseDTO } consolidator Consolidator information - * @property { IsfDocumentContainerLocationResponseDTO } containerLocation Container location information - * @property { IsfDocumentBusinessPartnerResponseDTO } shipTo Ship to information - * @property { IsfDocumentBusinessPartnerResponseDTO } importer Importer information - * @property { IsfDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - */ - export const IsfDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the document"), - name: z.string().describe("Name of the document"), - nameSuffix: z.string().describe("Name suffix of the document").nullish(), - defaultFileName: z.string(), - positionId: z.string().describe("Position ID"), - positionNumber: z.string().describe("Position number"), - versionNumber: z.number().describe("Version number of the document"), - vessel: z.string().describe("Vessel name").nullish(), - voyage: z.string().describe("Voyage number").nullish(), - hBLNumber: z.string().describe("HBL number").nullish(), - mBLNumber: z.string().describe("MBL number").nullish(), - scacCodeHBL: z.string().describe("SCAC code for HBL").nullish(), - scacCodeMBL: z.string().describe("SCAC code for MBL").nullish(), - portOfDischarge: IsfDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), - issueLocation: z.string().describe("Issue location").nullish(), - issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), - companyName: z.string().describe("Company name").nullish(), - completedBy: z.object({ name: z.string(), email: z.string() }).readonly().nullish(), - container: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), - consignee: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), - manufacturer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Manufacturer information").nullish(), - seller: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Seller information").nullish(), - buyer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Buyer information").nullish(), - consolidator: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consolidator information").nullish(), - containerLocation: IsfDocumentContainerLocationResponseDTOSchema.describe( - "Container location information", - ).nullish(), - shipTo: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Ship to information").nullish(), - importer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Importer information").nullish(), - cargo: z.array(IsfDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), - config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - }) - .readonly(); - export type IsfDocumentResponseDTO = z.infer; +/** + * IsfDocumentResponseDTOSchema + * @type { object } + * @property { string } id ID of the document + * @property { string } name Name of the document + * @property { string } nameSuffix Name suffix of the document + * @property { string } defaultFileName + * @property { string } positionId Position ID + * @property { string } positionNumber Position number + * @property { number } versionNumber Version number of the document + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } hBLNumber HBL number + * @property { string } mBLNumber MBL number + * @property { string } scacCodeHBL SCAC code for HBL + * @property { string } scacCodeMBL SCAC code for MBL + * @property { IsfDocumentPortResponseDTO } portOfDischarge Port of discharge + * @property { string } issueLocation Issue location + * @property { string } issueDate Issue date + * @property { string } companyName Company name + * @property { object } completedBy + * @property { string } completedBy.name + * @property { string } completedBy.email + * @property { object } container + * @property { string } container.id + * @property { string } container.name + * @property { IsfDocumentBusinessPartnerResponseDTO } consignee Consignee information + * @property { IsfDocumentBusinessPartnerResponseDTO } manufacturer Manufacturer information + * @property { IsfDocumentBusinessPartnerResponseDTO } seller Seller information + * @property { IsfDocumentBusinessPartnerResponseDTO } buyer Buyer information + * @property { IsfDocumentBusinessPartnerResponseDTO } consolidator Consolidator information + * @property { IsfDocumentContainerLocationResponseDTO } containerLocation Container location information + * @property { IsfDocumentBusinessPartnerResponseDTO } shipTo Ship to information + * @property { IsfDocumentBusinessPartnerResponseDTO } importer Importer information + * @property { IsfDocumentCargoResponseDTO[] } cargo List of cargo information + * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + */ +export const IsfDocumentResponseDTOSchema = z.object({ id: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), positionId: z.string(), positionNumber: z.string(), versionNumber: z.number(), vessel: z.string().nullish(), voyage: z.string().nullish(), hBLNumber: z.string().nullish(), mBLNumber: z.string().nullish(), scacCodeHBL: z.string().nullish(), scacCodeMBL: z.string().nullish(), portOfDischarge: IsfDocumentPortResponseDTOSchema.nullish(), issueLocation: z.string().nullish(), issueDate: z.iso.datetime({ offset: true }).nullish(), companyName: z.string().nullish(), completedBy: z.object({ name: z.string(), email: z.string() }).nullish(), container: z.object({ id: z.string(), name: z.string() }).nullish(), consignee: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), manufacturer: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), seller: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), buyer: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), consolidator: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), containerLocation: IsfDocumentContainerLocationResponseDTOSchema.nullish(), shipTo: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), importer: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), cargo: z.array(IsfDocumentCargoResponseDTOSchema).nullish(), config: CommonModels.HBLDocumentConfigDtoSchema, bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish() }); +export type IsfDocumentResponseDTO = z.infer; - /** - * UpdateIsfDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - * @property { string } number Business partner number - */ - export const UpdateIsfDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - number: z.string().describe("Business partner number"), - }) - .readonly(); - export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateIsfDocumentBusinessPartnerRequestDTOSchema - >; +/** + * UpdateIsfDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + * @property { string } number Business partner number + */ +export const UpdateIsfDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable(), number: z.string().nullable() }).partial(); +export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer; - /** - * UpdateIsfDocumentCargoRequestDTOSchema - * @type { object } - * @property { string } productCode Product code - * @property { string } descriptionOfGoods Description of goods - * @property { string } htsCode HTS code - * @property { string } manufacturerSupplier Manufacturer supplier - * @property { string } countryOfOriginId Country of origin ID - */ - export const UpdateIsfDocumentCargoRequestDTOSchema = z - .object({ - productCode: z.string().describe("Product code"), - descriptionOfGoods: z.string().describe("Description of goods"), - htsCode: z.string().describe("HTS code"), - manufacturerSupplier: z.string().describe("Manufacturer supplier"), - countryOfOriginId: z.string().describe("Country of origin ID"), - }) - .readonly(); - export type UpdateIsfDocumentCargoRequestDTO = z.infer; +/** + * UpdateIsfDocumentCargoRequestDTOSchema + * @type { object } + * @property { string } productCode Product code + * @property { string } descriptionOfGoods Description of goods + * @property { string } htsCode HTS code + * @property { string } manufacturerSupplier Manufacturer supplier + * @property { string } countryOfOriginId Country of origin ID + */ +export const UpdateIsfDocumentCargoRequestDTOSchema = z.object({ productCode: z.string().nullable(), descriptionOfGoods: z.string().nullable(), htsCode: z.string().nullable(), manufacturerSupplier: z.string().nullable(), countryOfOriginId: z.string().nullable() }).partial(); +export type UpdateIsfDocumentCargoRequestDTO = z.infer; + +/** + * UpdateIsfDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Name suffix + * @property { string } vessel Vessel name + * @property { string } voyage Voyage number + * @property { string } hBLNumber HBL number + * @property { string } mBLNumber MBL number + * @property { string } scacCodeHBL SCAC code for HBL + * @property { string } scacCodeMBL SCAC code for MBL + * @property { string } portOfDischargeId Port of discharge Id + * @property { string } issueLocation Issue location + * @property { string } issueDate Issue date + * @property { string } companyName Company name + * @property { string } completedByName Completed by name + * @property { string } completedByEmail Completed by email + * @property { string } containerId Container ID + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consignee Consignee information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } manufacturer Manufacturer information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } seller Seller information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } buyer Buyer information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consolidator Consolidator information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } containerLocation Container location information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } shipTo Ship to information + * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } importer Importer information + * @property { UpdateIsfDocumentCargoRequestDTO[] } cargo Cargo information + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateIsfDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), hBLNumber: z.string().nullable(), mBLNumber: z.string().nullable(), scacCodeHBL: z.string().nullable(), scacCodeMBL: z.string().nullable(), portOfDischargeId: z.string().nullable(), issueLocation: z.string().nullable(), issueDate: z.iso.datetime({ offset: true }).nullable(), companyName: z.string().nullable(), completedByName: z.string().nullable(), completedByEmail: z.string().nullable(), containerId: z.string().nullable(), consignee: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), manufacturer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), seller: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), buyer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), consolidator: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), containerLocation: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), shipTo: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), importer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), cargo: z.array(UpdateIsfDocumentCargoRequestDTOSchema).nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); +export type UpdateIsfDocumentRequestDTO = z.infer; - /** - * UpdateIsfDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } hBLNumber HBL number - * @property { string } mBLNumber MBL number - * @property { string } scacCodeHBL SCAC code for HBL - * @property { string } scacCodeMBL SCAC code for MBL - * @property { string } portOfDischargeId Port of discharge Id - * @property { string } issueLocation Issue location - * @property { string } issueDate Issue date - * @property { string } companyName Company name - * @property { string } completedByName Completed by name - * @property { string } completedByEmail Completed by email - * @property { string } containerId Container ID - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } manufacturer Manufacturer information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } seller Seller information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } buyer Buyer information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consolidator Consolidator information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } containerLocation Container location information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } shipTo Ship to information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } importer Importer information - * @property { UpdateIsfDocumentCargoRequestDTO[] } cargo Cargo information - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateIsfDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Name suffix"), - vessel: z.string().describe("Vessel name"), - voyage: z.string().describe("Voyage number"), - hBLNumber: z.string().describe("HBL number"), - mBLNumber: z.string().describe("MBL number"), - scacCodeHBL: z.string().describe("SCAC code for HBL"), - scacCodeMBL: z.string().describe("SCAC code for MBL"), - portOfDischargeId: z.string().describe("Port of discharge Id"), - issueLocation: z.string().describe("Issue location"), - issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), - companyName: z.string().describe("Company name"), - completedByName: z.string().describe("Completed by name"), - completedByEmail: z.string().describe("Completed by email"), - containerId: z.string().describe("Container ID"), - consignee: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), - manufacturer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Manufacturer information"), - seller: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), - buyer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), - consolidator: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consolidator information"), - containerLocation: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Container location information"), - shipTo: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Ship to information"), - importer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Importer information"), - cargo: z.array(UpdateIsfDocumentCargoRequestDTOSchema).readonly().describe("Cargo information"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateIsfDocumentRequestDTO = z.infer; } diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts index 592b755..c190b46 100644 --- a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts +++ b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,257 +9,203 @@ import { CommonModels } from "@/data/common/common.models"; import { WorkingDocumentsIsfFormApi } from "./workingDocumentsIsfForm.api"; export namespace WorkingDocumentsIsfFormQueries { - export const moduleName = QueryModule.WorkingDocumentsIsfForm; +export const moduleName = QueryModule.WorkingDocumentsIsfForm; - export const keys = { +export const keys = { all: [moduleName] as const, - getIsfData: (positionId: string, isfId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId", positionId, isfId, officeId] as const, - previewIsf: (positionId: string, isfId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/isfs/:isfId/preview", - positionId, - isfId, - officeId, - ] as const, - }; + getIsfData: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId", positionId, isfId, officeId] as const, + previewIsf: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId/preview", positionId, isfId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create an ISF document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId } )); + return WorkingDocumentsIsfFormApi.create(positionId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetIsfData` + * @summary Get ISF document data + * @permission Requires `canUseGetIsfData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.isfId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetIsfData = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getIsfData(positionId, isfId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId } )); + return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateIsfData` + * @summary Update ISF document data + * @permission Requires `canUseUpdateIsfData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateIsfData = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId, data }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId } )); + return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, isfId, officeId } = variables; + const updateKeys = [keys.getIsfData(positionId, isfId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteIsf` + * @summary Delete ISF document + * @permission Requires `canUseDeleteIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } ISF document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteIsf = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewIsf` - recommended when file should be cached + * @summary Preview ISF document + * @permission Requires `canUsePreviewIsf` ability + * @param { string } object.positionId Path parameter + * @param { string } object.isfId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewIsf = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewIsf(positionId, isfId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewIsfMutation` - recommended when file should not be cached + * @summary Preview ISF document + * @permission Requires `canUsePreviewIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewIsfMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, isfId, officeId } = variables; + const updateKeys = [keys.previewIsf(positionId, isfId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateIsf` + * @summary Generate ISF document + * @permission Requires `canUseGenerateIsf` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.isfId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateIsf = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, isfId, officeId, data }) => { + checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId } )); + return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create an ISF document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId })); - return WorkingDocumentsIsfFormApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetIsfData` - * @summary Get ISF document data - * @permission Requires `canUseGetIsfData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.isfId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetIsfData = ( - { positionId, isfId, officeId }: { positionId: string; isfId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getIsfData(positionId, isfId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId })); - return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateIsfData` - * @summary Update ISF document data - * @permission Requires `canUseUpdateIsfData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateIsfData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsIsfFormApi.updateIsfData, - { - positionId: string; - isfId: string; - officeId: string; - data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId, data }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId })); - return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, isfId, officeId } = variables; - const updateKeys = [keys.getIsfData(positionId, isfId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteIsf` - * @summary Delete ISF document - * @permission Requires `canUseDeleteIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } ISF document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteIsf = ( - options?: AppMutationOptions< - typeof WorkingDocumentsIsfFormApi.deleteIsf, - { positionId: string; isfId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId })); - return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewIsf` - recommended when file should be cached - * @summary Preview ISF document - * @permission Requires `canUsePreviewIsf` ability - * @param { string } object.positionId Path parameter - * @param { string } object.isfId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewIsf = ( - { positionId, isfId, officeId }: { positionId: string; isfId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewIsf(positionId, isfId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId })); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewIsfMutation` - recommended when file should not be cached - * @summary Preview ISF document - * @permission Requires `canUsePreviewIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewIsfMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsIsfFormApi.previewIsf, - { positionId: string; isfId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId })); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, isfId, officeId } = variables; - const updateKeys = [keys.previewIsf(positionId, isfId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateIsf` - * @summary Generate ISF document - * @permission Requires `canUseGenerateIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateIsf = ( - options?: AppMutationOptions< - typeof WorkingDocumentsIsfFormApi.generateIsf, - { positionId: string; isfId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId, data }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId })); - return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts index 6d3d1a9..10d4871 100644 --- a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts +++ b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts @@ -1,75 +1,82 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsMasterAwbAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Create", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Create", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - /** - * Use for `useGetMasterAwbData` query ability. For global ability, omit the object parameter. - * @description Read Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMasterAwbData` query - */ - export const canUseGetMasterAwbData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Read", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; +/** + * Use for `useGetMasterAwbData` query ability. For global ability, omit the object parameter. + * @description Read Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMasterAwbData` query + */ +export const canUseGetMasterAwbData = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - /** - * Use for `useUpdateMasterAwbData` mutation ability. For global ability, omit the object parameter. - * @description Update Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateMasterAwbData` mutation - */ - export const canUseUpdateMasterAwbData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Update", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; +/** + * Use for `useUpdateMasterAwbData` mutation ability. For global ability, omit the object parameter. + * @description Update Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateMasterAwbData` mutation + */ +export const canUseUpdateMasterAwbData = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - /** - * Use for `useDeleteMasterAwb` mutation ability. For global ability, omit the object parameter. - * @description Delete Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteMasterAwb` mutation - */ - export const canUseDeleteMasterAwb = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Delete", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; +/** + * Use for `useDeleteMasterAwb` mutation ability. For global ability, omit the object parameter. + * @description Delete Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteMasterAwb` mutation + */ +export const canUseDeleteMasterAwb = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Delete", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - /** - * Use for `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation - */ - export const canUsePreviewMasterAwb = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Read", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; +/** + * Use for `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation ability. For global ability, omit the object parameter. + * @description Preview Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation + */ +export const canUsePreviewMasterAwb = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; + +/** + * Use for `useGenerateMasterAwb` mutation ability. For global ability, omit the object parameter. + * @description Generate Master AWB document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateMasterAwb` mutation + */ +export const canUseGenerateMasterAwb = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" +] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - /** - * Use for `useGenerateMasterAwb` mutation ability. For global ability, omit the object parameter. - * @description Generate Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateMasterAwb` mutation - */ - export const canUseGenerateMasterAwb = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Update", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts index 64f0399..274642e 100644 --- a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts +++ b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts @@ -1,94 +1,58 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsMasterAwbApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs`, - undefined, - config, - ); - }; - - export const getMasterAwbData = ( - positionId: string, - mawbId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs`, + + ) +}; +export const getMasterAwbData = (positionId: string, mawbId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - config, - ); - }; - - export const updateMasterAwbData = ( - positionId: string, - mawbId: string, - officeId: string, - data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + + ) +}; +export const updateMasterAwbData = (positionId: string, mawbId: string, officeId: string, data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, ) => { return AppRestClient.patch( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), - config, - ); - }; - - export const deleteMasterAwb = ( - positionId: string, - mawbId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), + + ) +}; +export const deleteMasterAwb = (positionId: string, mawbId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - undefined, - config, - ); - }; - - export const previewMasterAwb = ( - positionId: string, - mawbId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, + + ) +}; +export const previewMasterAwb = (positionId: string, mawbId: string, officeId: string, ) => { return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const generateMasterAwb = ( - positionId: string, - mawbId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const generateMasterAwb = (positionId: string, mawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; } diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts index e4e0a26..02909ab 100644 --- a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts +++ b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts @@ -2,310 +2,175 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsMasterAwbModels { - /** - * MasterAwbDocumentOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - * @property { string } name Name - */ - export const MasterAwbDocumentOtherChargeDTOSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID").nullish(), - sellRate: z.number().describe("Sell rate"), - name: z.string().describe("Name").nullish(), - }) - .readonly(); - export type MasterAwbDocumentOtherChargeDTO = z.infer; +/** + * MasterAwbDocumentOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + * @property { string } name Name + */ +export const MasterAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullish(), sellRate: z.number(), name: z.string().nullish() }); +export type MasterAwbDocumentOtherChargeDTO = z.infer; - /** - * MasterAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { number } totalOtherCharges Total other charges - * @property { number } total Total - * @property { MasterAwbDocumentOtherChargeDTO[] } otherCharges Other charges - */ - export const MasterAwbDocumentChargesDTOSchema = z - .object({ - weightCharge: z.number().describe("Weight charge"), - totalOtherCharges: z.number().describe("Total other charges"), - total: z.number().describe("Total"), - otherCharges: z.array(MasterAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges"), - }) - .readonly(); - export type MasterAwbDocumentChargesDTO = z.infer; +/** + * MasterAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { number } totalOtherCharges Total other charges + * @property { number } total Total + * @property { MasterAwbDocumentOtherChargeDTO[] } otherCharges Other charges + */ +export const MasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number(), totalOtherCharges: z.number(), total: z.number(), otherCharges: z.array(MasterAwbDocumentOtherChargeDTOSchema) }); +export type MasterAwbDocumentChargesDTO = z.infer; - /** - * MasterAwbDocumentCargoDTOSchema - * @type { object } - * @property { number } quantity Quantity - * @property { number } grossWeight Gross weight - * @property { string } rateClass Rate class - * @property { string } commodityItemNo Commodity item number - * @property { number } rateOrCharge Rate or charge - * @property { number } total Total - * @property { string } description Description - */ - export const MasterAwbDocumentCargoDTOSchema = z - .object({ - quantity: z.number().describe("Quantity"), - grossWeight: z.number().describe("Gross weight").nullish(), - rateClass: z.string().describe("Rate class").nullish(), - commodityItemNo: z.string().describe("Commodity item number").nullish(), - rateOrCharge: z.number().describe("Rate or charge").nullish(), - total: z.number().describe("Total").nullish(), - description: z.string().describe("Description").nullish(), - }) - .readonly(); - export type MasterAwbDocumentCargoDTO = z.infer; +/** + * MasterAwbDocumentCargoDTOSchema + * @type { object } + * @property { number } quantity Quantity + * @property { number } grossWeight Gross weight + * @property { string } rateClass Rate class + * @property { string } commodityItemNo Commodity item number + * @property { number } rateOrCharge Rate or charge + * @property { number } total Total + * @property { string } description Description + */ +export const MasterAwbDocumentCargoDTOSchema = z.object({ quantity: z.number(), grossWeight: z.number().nullish(), rateClass: z.string().nullish(), commodityItemNo: z.string().nullish(), rateOrCharge: z.number().nullish(), total: z.number().nullish(), description: z.string().nullish() }); +export type MasterAwbDocumentCargoDTO = z.infer; - /** - * MasterAwbDocumentRouteDTOSchema - * @type { object } - * @property { string } airportOfDeparture Airport of departure - * @property { string } airportOfDestination Airport of destination - * @property { string } toAirport1 To airport 1 - * @property { string } byCarrier1 By carrier 1 - * @property { string } toAirport2 To airport 2 - * @property { string } byCarrier2 By carrier 2 - * @property { string } toAirport3 To airport 3 - * @property { string } byCarrier3 By carrier 3 - * @property { string } flightNumber1 Flight number 1 - * @property { string } flightDay1 Flight day 1 - * @property { string } flightNumber2 Flight number 2 - * @property { string } flightDay2 Flight day 2 - */ - export const MasterAwbDocumentRouteDTOSchema = z - .object({ - airportOfDeparture: z.string().describe("Airport of departure"), - airportOfDestination: z.string().describe("Airport of destination"), - toAirport1: z.string().describe("To airport 1").nullish(), - byCarrier1: z.string().describe("By carrier 1").nullish(), - toAirport2: z.string().describe("To airport 2").nullish(), - byCarrier2: z.string().describe("By carrier 2").nullish(), - toAirport3: z.string().describe("To airport 3").nullish(), - byCarrier3: z.string().describe("By carrier 3").nullish(), - flightNumber1: z.string().describe("Flight number 1").nullish(), - flightDay1: z.string().describe("Flight day 1").nullish(), - flightNumber2: z.string().describe("Flight number 2").nullish(), - flightDay2: z.string().describe("Flight day 2").nullish(), - }) - .readonly(); - export type MasterAwbDocumentRouteDTO = z.infer; +/** + * MasterAwbDocumentRouteDTOSchema + * @type { object } + * @property { string } airportOfDeparture Airport of departure + * @property { string } airportOfDestination Airport of destination + * @property { string } toAirport1 To airport 1 + * @property { string } byCarrier1 By carrier 1 + * @property { string } toAirport2 To airport 2 + * @property { string } byCarrier2 By carrier 2 + * @property { string } toAirport3 To airport 3 + * @property { string } byCarrier3 By carrier 3 + * @property { string } flightNumber1 Flight number 1 + * @property { string } flightDay1 Flight day 1 + * @property { string } flightNumber2 Flight number 2 + * @property { string } flightDay2 Flight day 2 + */ +export const MasterAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string(), airportOfDestination: z.string(), toAirport1: z.string().nullish(), byCarrier1: z.string().nullish(), toAirport2: z.string().nullish(), byCarrier2: z.string().nullish(), toAirport3: z.string().nullish(), byCarrier3: z.string().nullish(), flightNumber1: z.string().nullish(), flightDay1: z.string().nullish(), flightNumber2: z.string().nullish(), flightDay2: z.string().nullish() }); +export type MasterAwbDocumentRouteDTO = z.infer; - /** - * MasterAwbDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const MasterAwbDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer< - typeof MasterAwbDocumentBusinessPartnerResponseDTOSchema - >; +/** + * MasterAwbDocumentBusinessPartnerResponseDTOSchema + * @type { object } + * @property { string } id ID of the business partner + * @property { string } name Name of the business partner + * @property { string } address Address of the business partner + */ +export const MasterAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); +export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer; - /** - * MasterAwbDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the Master AWB document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the Master AWB document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } currency Currency - * @property { number } versionNumber Version number of the document - * @property { string } mawbNumber MAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { MasterAwbDocumentCargoDTO[] } cargo Cargo packages - * @property { MasterAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } signingLocation Signing location - * @property { string } issuerIataCode Issuer IATA code - * @property { number } exchangeRate Exchange rate - * @property { MasterAwbDocumentRouteDTO } route Route - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } issuer Issuer - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { CommonModels.DocumentConfigDTO } config Config - */ - export const MasterAwbDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the Master AWB document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference"), - name: z.string().describe("Name of the Master AWB document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - currency: z.string().describe("Currency").nullish(), - versionNumber: z.number().describe("Version number of the document"), - mawbNumber: z.string().describe("MAWB number").nullish(), - sciReference: z.string().describe("SCI reference").nullish(), - reference1: z.string().describe("Reference 1").nullish(), - reference2: z.string().describe("Reference 2").nullish(), - reference3: z.string().describe("Reference 3").nullish(), - additionalText: CommonModels.EditorContentResponseDtoSchema.describe( - "Additional text for the document", - ).nullish(), - handlingInstructions: z.string().describe("Handling instructions").nullish(), - accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), - additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), - isSecured: z.boolean().describe("Is secured"), - suppressContainerWeight: z.boolean().describe("Suppress container weight"), - suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), - cargo: z.array(MasterAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), - charges: MasterAwbDocumentChargesDTOSchema.describe("Charges").nullish(), - shipperSigner: z.string().describe("Shipper signer").nullish(), - shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), - signer: z.string().describe("Signer").nullish(), - signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), - signingLocation: z.string().describe("Signing location").nullish(), - issuerIataCode: z.string().describe("Issuer IATA code").nullish(), - exchangeRate: z.number().describe("Exchange rate").nullish(), - route: MasterAwbDocumentRouteDTOSchema.describe("Route").nullish(), - consignee: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), - shipper: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), - issuer: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish(), - }) - .readonly(); - export type MasterAwbDocumentResponseDTO = z.infer; +/** + * MasterAwbDocumentResponseDTOSchema + * @type { object } + * @property { string } id Unique identifier of the Master AWB document + * @property { string } positionId Unique identifier of the position this document belongs to + * @property { string } positionNumber Position number for reference + * @property { string } name Name of the Master AWB document + * @property { string } nameSuffix Suffix to be added to the document name + * @property { string } defaultFileName + * @property { string } currency Currency + * @property { number } versionNumber Version number of the document + * @property { string } mawbNumber MAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { MasterAwbDocumentCargoDTO[] } cargo Cargo packages + * @property { MasterAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } signingLocation Signing location + * @property { string } issuerIataCode Issuer IATA code + * @property { number } exchangeRate Exchange rate + * @property { MasterAwbDocumentRouteDTO } route Route + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } consignee Consignee + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } shipper Shipper + * @property { MasterAwbDocumentBusinessPartnerResponseDTO } issuer Issuer + * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks + * @property { string } createdAt Created at + * @property { string } updatedAt Updated at + * @property { CommonModels.DocumentConfigDTO } config Config + */ +export const MasterAwbDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), currency: z.string().nullish(), versionNumber: z.number(), mawbNumber: z.string().nullish(), sciReference: z.string().nullish(), reference1: z.string().nullish(), reference2: z.string().nullish(), reference3: z.string().nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.nullish(), handlingInstructions: z.string().nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.nullish(), additionalAccountingNotes: z.string().nullish(), isSecured: z.boolean(), suppressContainerWeight: z.boolean(), suppressCargoMeasurement: z.boolean(), cargo: z.array(MasterAwbDocumentCargoDTOSchema).nullish(), charges: MasterAwbDocumentChargesDTOSchema.nullish(), shipperSigner: z.string().nullish(), shipperSignerUserName: z.string().nullish(), signer: z.string().nullish(), signingDate: z.iso.datetime({ offset: true }).nullish(), signingLocation: z.string().nullish(), issuerIataCode: z.string().nullish(), exchangeRate: z.number().nullish(), route: MasterAwbDocumentRouteDTOSchema.nullish(), consignee: MasterAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: MasterAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), issuer: MasterAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), config: CommonModels.DocumentConfigDTOSchema.nullish() }); +export type MasterAwbDocumentResponseDTO = z.infer; - /** - * UpdateMasterAwbDocumentChargesOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - */ - export const UpdateMasterAwbDocumentChargesOtherChargeDTOSchema = z - .object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }) - .readonly(); - export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer< - typeof UpdateMasterAwbDocumentChargesOtherChargeDTOSchema - >; +/** + * UpdateMasterAwbDocumentChargesOtherChargeDTOSchema + * @type { object } + * @property { string } chargeTypeId Charge type ID + * @property { number } sellRate Sell rate + */ +export const UpdateMasterAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullable(), sellRate: z.number().nullable() }).partial(); +export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer; - /** - * UpdateMasterAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { UpdateMasterAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges - */ - export const UpdateMasterAwbDocumentChargesDTOSchema = z - .object({ - weightCharge: z.number().describe("Weight charge"), - otherCharges: z.array(UpdateMasterAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges"), - }) - .readonly(); - export type UpdateMasterAwbDocumentChargesDTO = z.infer; +/** + * UpdateMasterAwbDocumentChargesDTOSchema + * @type { object } + * @property { number } weightCharge Weight charge + * @property { UpdateMasterAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges + */ +export const UpdateMasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().nullable(), otherCharges: z.array(UpdateMasterAwbDocumentChargesOtherChargeDTOSchema).nullable() }).partial(); +export type UpdateMasterAwbDocumentChargesDTO = z.infer; - /** - * UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema - >; +/** + * UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema + * @type { object } + * @property { string } id Business partner ID + * @property { string } address Business partner address + */ +export const UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); +export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer; + +/** + * UpdateMasterAwbDocumentRequestDTOSchema + * @type { object } + * @property { string } nameSuffix Document name suffix + * @property { string } mawbNumber MAWB number + * @property { string } sciReference SCI reference + * @property { string } reference1 Reference 1 + * @property { string } reference2 Reference 2 + * @property { string } reference3 Reference 3 + * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text for the document + * @property { string } handlingInstructions Handling instructions + * @property { string } accountInformation Account information + * @property { string } additionalAccountingNotes Additional accounting notes + * @property { boolean } isSecured Is secured + * @property { boolean } suppressContainerWeight Suppress container weight + * @property { boolean } suppressCargoMeasurement Suppress cargo measurement + * @property { UpdateMasterAwbDocumentChargesDTO } charges Charges + * @property { string } shipperSigner Shipper signer + * @property { string } shipperSignerUserName Shipper signer user name + * @property { string } signer Signer + * @property { string } signingDate Signing date + * @property { string } issuerId Issuer ID + * @property { string } issuerName Issuer name + * @property { string } issuerAddress Issuer address + * @property { string } issuerCity Issuer city + * @property { string } issuerIataCode Issuer IATA code + * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } consignee Consignee + * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } shipper Shipper + * @property { number } exchangeRate Exchange rate + * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks + * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks + */ +export const UpdateMasterAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), mawbNumber: z.string().nullable(), sciReference: z.string().nullable(), reference1: z.string().nullable(), reference2: z.string().nullable(), reference3: z.string().nullable(), additionalText: CommonModels.EditorContentUpdateDtoSchema.nullable(), handlingInstructions: z.string().nullable(), accountInformation: CommonModels.AccountInformationEnumSchema.nullable(), additionalAccountingNotes: z.string().nullable(), isSecured: z.boolean().nullable(), suppressContainerWeight: z.boolean().nullable(), suppressCargoMeasurement: z.boolean().nullable(), charges: UpdateMasterAwbDocumentChargesDTOSchema.nullable(), shipperSigner: z.string().nullable(), shipperSignerUserName: z.string().nullable(), signer: z.string().nullable(), signingDate: z.iso.datetime({ offset: true }).nullable(), issuerId: z.string().nullable(), issuerName: z.string().nullable(), issuerAddress: z.string().nullable(), issuerCity: z.string().nullable(), issuerIataCode: z.string().nullable(), consignee: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), exchangeRate: z.number().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); +export type UpdateMasterAwbDocumentRequestDTO = z.infer; - /** - * UpdateMasterAwbDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } mawbNumber MAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { UpdateMasterAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } issuerId Issuer ID - * @property { string } issuerName Issuer name - * @property { string } issuerAddress Issuer address - * @property { string } issuerCity Issuer city - * @property { string } issuerIataCode Issuer IATA code - * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateMasterAwbDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Document name suffix"), - mawbNumber: z.string().describe("MAWB number"), - sciReference: z.string().describe("SCI reference"), - reference1: z.string().describe("Reference 1"), - reference2: z.string().describe("Reference 2"), - reference3: z.string().describe("Reference 3"), - additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text for the document"), - handlingInstructions: z.string().describe("Handling instructions"), - accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), - additionalAccountingNotes: z.string().describe("Additional accounting notes"), - isSecured: z.boolean().describe("Is secured"), - suppressContainerWeight: z.boolean().describe("Suppress container weight"), - suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), - charges: UpdateMasterAwbDocumentChargesDTOSchema.describe("Charges"), - shipperSigner: z.string().describe("Shipper signer"), - shipperSignerUserName: z.string().describe("Shipper signer user name"), - signer: z.string().describe("Signer"), - signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), - issuerId: z.string().describe("Issuer ID"), - issuerName: z.string().describe("Issuer name"), - issuerAddress: z.string().describe("Issuer address"), - issuerCity: z.string().describe("Issuer city"), - issuerIataCode: z.string().describe("Issuer IATA code"), - consignee: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), - shipper: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), - exchangeRate: z.number().describe("Exchange rate"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateMasterAwbDocumentRequestDTO = z.infer; } diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts index 236a943..57207fc 100644 --- a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts +++ b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,257 +9,203 @@ import { CommonModels } from "@/data/common/common.models"; import { WorkingDocumentsMasterAwbApi } from "./workingDocumentsMasterAwb.api"; export namespace WorkingDocumentsMasterAwbQueries { - export const moduleName = QueryModule.WorkingDocumentsMasterAwb; +export const moduleName = QueryModule.WorkingDocumentsMasterAwb; - export const keys = { +export const keys = { all: [moduleName] as const, - getMasterAwbData: (positionId: string, mawbId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId", positionId, mawbId, officeId] as const, - previewMasterAwb: (positionId: string, mawbId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/mawbs/:mawbId/preview", - positionId, - mawbId, - officeId, - ] as const, - }; + getMasterAwbData: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId", positionId, mawbId, officeId] as const, + previewMasterAwb: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId/preview", positionId, mawbId, officeId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a Master AWB document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId } )); + return WorkingDocumentsMasterAwbApi.create(positionId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetMasterAwbData` + * @summary Get Master AWB document data + * @permission Requires `canUseGetMasterAwbData` ability + * @param { string } object.positionId Path parameter + * @param { string } object.mawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetMasterAwbData = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId } )); + return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateMasterAwbData` + * @summary Update Master AWB document data + * @permission Requires `canUseUpdateMasterAwbData` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateMasterAwbData = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId, data }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId } )); + return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, mawbId, officeId } = variables; + const updateKeys = [keys.getMasterAwbData(positionId, mawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteMasterAwb` + * @summary Delete Master AWB document + * @permission Requires `canUseDeleteMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Master AWB document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `usePreviewMasterAwb` - recommended when file should be cached + * @summary Preview Master AWB document + * @permission Requires `canUsePreviewMasterAwb` ability + * @param { string } object.positionId Path parameter + * @param { string } object.mawbId Path parameter + * @param { string } object.officeId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult> } + * @statusCodes [200, 401] + */ +export const usePreviewMasterAwb = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), + queryFn: () => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId) }, + ...options, + }); +}; + +/** + * Mutation `usePreviewMasterAwbMutation` - recommended when file should not be cached + * @summary Preview Master AWB document + * @permission Requires `canUsePreviewMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const usePreviewMasterAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { positionId, mawbId, officeId } = variables; + const updateKeys = [keys.previewMasterAwb(positionId, mawbId, officeId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateMasterAwb` + * @summary Generate Master AWB document + * @permission Requires `canUseGenerateMasterAwb` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.mawbId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useGenerateMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, mawbId, officeId, data }) => { + checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId } )); + return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create a Master AWB document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId })); - return WorkingDocumentsMasterAwbApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetMasterAwbData` - * @summary Get Master AWB document data - * @permission Requires `canUseGetMasterAwbData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.mawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetMasterAwbData = ( - { positionId, mawbId, officeId }: { positionId: string; mawbId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId })); - return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateMasterAwbData` - * @summary Update Master AWB document data - * @permission Requires `canUseUpdateMasterAwbData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateMasterAwbData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsMasterAwbApi.updateMasterAwbData, - { - positionId: string; - mawbId: string; - officeId: string; - data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId, data }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId })); - return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, mawbId, officeId } = variables; - const updateKeys = [keys.getMasterAwbData(positionId, mawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteMasterAwb` - * @summary Delete Master AWB document - * @permission Requires `canUseDeleteMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Master AWB document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteMasterAwb = ( - options?: AppMutationOptions< - typeof WorkingDocumentsMasterAwbApi.deleteMasterAwb, - { positionId: string; mawbId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId })); - return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewMasterAwb` - recommended when file should be cached - * @summary Preview Master AWB document - * @permission Requires `canUsePreviewMasterAwb` ability - * @param { string } object.positionId Path parameter - * @param { string } object.mawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewMasterAwb = ( - { positionId, mawbId, officeId }: { positionId: string; mawbId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId })); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewMasterAwbMutation` - recommended when file should not be cached - * @summary Preview Master AWB document - * @permission Requires `canUsePreviewMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewMasterAwbMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsMasterAwbApi.previewMasterAwb, - { positionId: string; mawbId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId })); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, mawbId, officeId } = variables; - const updateKeys = [keys.previewMasterAwb(positionId, mawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateMasterAwb` - * @summary Generate Master AWB document - * @permission Requires `canUseGenerateMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateMasterAwb = ( - options?: AppMutationOptions< - typeof WorkingDocumentsMasterAwbApi.generateMasterAwb, - { positionId: string; mawbId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId, data }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId })); - return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts index 5e29a04..ccebdd8 100644 --- a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts +++ b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts @@ -1,115 +1,95 @@ import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; export namespace WorkingDocumentsTemplatedDocumentAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Create", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Create", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; +/** + * Use for `useCreate` mutation ability. For global ability, omit the object parameter. + * @description Create templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation + */ +export const canUseCreate = ( + object?: { officeId: string, } +) => [ + "Create", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Create", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - /** - * Use for `useGetTemplatedDocument` query ability. For global ability, omit the object parameter. - * @description Read templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetTemplatedDocument` query - */ - export const canUseGetTemplatedDocument = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Read", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; +/** + * Use for `useGetTemplatedDocument` query ability. For global ability, omit the object parameter. + * @description Read templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetTemplatedDocument` query + */ +export const canUseGetTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - /** - * Use for `useUpdateTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Update templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateTemplatedDocument` mutation - */ - export const canUseUpdateTemplatedDocument = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Update", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; +/** + * Use for `useUpdateTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Update templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateTemplatedDocument` mutation + */ +export const canUseUpdateTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - /** - * Use for `useDeleteTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Delete templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteTemplatedDocument` mutation - */ - export const canUseDeleteTemplatedDocument = (object?: { officeId: string }) => - [ - "Delete", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Delete", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; +/** + * Use for `useDeleteTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Delete templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteTemplatedDocument` mutation + */ +export const canUseDeleteTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Delete", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - /** - * Use for `usePreviewTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Preview templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewTemplatedDocument` mutation - */ - export const canUsePreviewTemplatedDocument = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Read", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; +/** + * Use for `usePreviewTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Preview templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewTemplatedDocument` mutation + */ +export const canUsePreviewTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Read", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - /** - * Use for `useIssueTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Issue templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueTemplatedDocument` mutation - */ - export const canUseIssueTemplatedDocument = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Update", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; +/** + * Use for `useIssueTemplatedDocument` mutation ability. For global ability, omit the object parameter. + * @description Issue templated document + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueTemplatedDocument` mutation + */ +export const canUseIssueTemplatedDocument = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; + +/** + * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. + * @description Generate templated document EML + * @param { string } object.officeId officeId from officeId path parameter + * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation + */ +export const canUseGenerateDocumentEml = ( + object?: { officeId: string, } +) => [ + "Update", + object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" +] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - /** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate templated document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ - export const canUseGenerateDocumentEml = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Update", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; } diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts index 91883ef..bcde97f 100644 --- a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts +++ b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts @@ -1,123 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsTemplatedDocumentApi { - export const create = ( - positionId: string, - officeId: string, - data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { +export const create = (positionId: string, officeId: string, data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), - config, - ); - }; - - export const getTemplatedDocument = ( - officeId: string, - positionId: string, - templatedDocumentId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), + + ) +}; +export const getTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, ) => { return AppRestClient.get( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - config, - ); - }; - - export const updateTemplatedDocument = ( - officeId: string, - positionId: string, - templatedDocumentId: string, - data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + + ) +}; +export const updateTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, ) => { return AppRestClient.patch( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), - config, - ); - }; - - export const deleteTemplatedDocument = ( - positionId: string, - templatedDocumentId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { + { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), + + ) +}; +export const deleteTemplatedDocument = (positionId: string, templatedDocumentId: string, officeId: string, ) => { return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - undefined, - config, - ); - }; - - export const previewTemplatedDocument = ( - officeId: string, - positionId: string, - templatedDocumentId: string, - data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, + + ) +}; +export const previewTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - - export const issueTemplatedDocument = ( - officeId: string, - positionId: string, - templatedDocumentId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, + ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/pdf', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; +export const issueTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; - - export const generateDocumentEml = ( - officeId: string, - positionId: string, - templatedDocumentId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { + { resSchema: z.void() }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + + ) +}; +export const generateDocumentEml = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; + { resSchema: z.instanceof(Blob) }, + `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, + ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), + { + headers: { + 'Accept': 'application/octet-stream', + }, + responseType: "blob", + rawResponse: true, + } + ) +}; } diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts index a2d225e..b8a732e 100644 --- a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts +++ b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts @@ -2,93 +2,60 @@ import { z } from "zod"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsTemplatedDocumentModels { - /** - * TemplatedDocumentBlueprintDtoSchema - * @type { object } - * @property { string } templateId - * @property { string } templateName - * @property { string } capturedAt - * @property { CommonModels.TemplateBlocksResponseDTO } blocks - */ - export const TemplatedDocumentBlueprintDtoSchema = z - .object({ - templateId: z.string(), - templateName: z.string(), - capturedAt: z.string(), - blocks: CommonModels.TemplateBlocksResponseDTOSchema, - }) - .readonly(); - export type TemplatedDocumentBlueprintDto = z.infer; +/** + * TemplatedDocumentBlueprintDtoSchema + * @type { object } + * @property { string } templateId + * @property { string } templateName + * @property { string } capturedAt + * @property { CommonModels.TemplateBlocksResponseDTO } blocks + */ +export const TemplatedDocumentBlueprintDtoSchema = z.object({ templateId: z.string(), templateName: z.string(), capturedAt: z.string(), blocks: CommonModels.TemplateBlocksResponseDTOSchema }); +export type TemplatedDocumentBlueprintDto = z.infer; - /** - * TemplatedDocumentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } officeId - * @property { string } name - * @property { string } nameSuffix - * @property { string } defaultFileName - * @property { number } versionNumber - * @property { TemplatedDocumentBlueprintDto } blueprint Captured template blueprint - * @property { CommonModels.TemplatedDocumentDataDto } data Document data - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } issuedAt - */ - export const TemplatedDocumentResponseDtoSchema = z - .object({ - id: z.string(), - positionId: z.string(), - officeId: z.string(), - name: z.string(), - nameSuffix: z.string().nullish(), - defaultFileName: z.string(), - versionNumber: z.number(), - blueprint: TemplatedDocumentBlueprintDtoSchema.describe("Captured template blueprint"), - data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Document data"), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - issuedAt: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type TemplatedDocumentResponseDto = z.infer; +/** + * TemplatedDocumentResponseDtoSchema + * @type { object } + * @property { string } id + * @property { string } positionId + * @property { string } officeId + * @property { string } name + * @property { string } nameSuffix + * @property { string } defaultFileName + * @property { number } versionNumber + * @property { TemplatedDocumentBlueprintDto } blueprint Captured template blueprint + * @property { CommonModels.TemplatedDocumentDataDto } data Document data + * @property { string } createdAt + * @property { string } updatedAt + * @property { string } issuedAt + */ +export const TemplatedDocumentResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), officeId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), versionNumber: z.number(), blueprint: TemplatedDocumentBlueprintDtoSchema, data: CommonModels.TemplatedDocumentDataDtoSchema, createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), issuedAt: z.iso.datetime({ offset: true }).nullish() }); +export type TemplatedDocumentResponseDto = z.infer; - /** - * UpdateTemplatedDocumentRequestDtoSchema - * @type { object } - * @property { string } nameSuffix Optional suffix for the document name - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data Partial document data to update - */ - export const UpdateTemplatedDocumentRequestDtoSchema = z - .object({ - nameSuffix: z.string().describe("Optional suffix for the document name"), - data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("Partial document data to update"), - }) - .readonly(); - export type UpdateTemplatedDocumentRequestDto = z.infer; +/** + * UpdateTemplatedDocumentRequestDtoSchema + * @type { object } + * @property { string } nameSuffix Optional suffix for the document name + * @property { CommonModels.TemplatedDocumentDataUpdateDto } data Partial document data to update + */ +export const UpdateTemplatedDocumentRequestDtoSchema = z.object({ nameSuffix: z.string().nullable(), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.nullable() }).partial(); +export type UpdateTemplatedDocumentRequestDto = z.infer; - /** - * CreateTemplatedDocumentRequestDtoSchema - * @type { object } - * @property { string } templateId Template ID to use for creating the document - * @property { string } nameSuffix Optional suffix for the document name - */ - export const CreateTemplatedDocumentRequestDtoSchema = z - .object({ - templateId: z.string().describe("Template ID to use for creating the document"), - nameSuffix: z.string().describe("Optional suffix for the document name").nullish(), - }) - .readonly(); - export type CreateTemplatedDocumentRequestDto = z.infer; +/** + * CreateTemplatedDocumentRequestDtoSchema + * @type { object } + * @property { string } templateId Template ID to use for creating the document + * @property { string } nameSuffix Optional suffix for the document name + */ +export const CreateTemplatedDocumentRequestDtoSchema = z.object({ templateId: z.string(), nameSuffix: z.string().nullish() }); +export type CreateTemplatedDocumentRequestDto = z.infer; + +/** + * GenerateWorkingDocumentPreviewRequestDtoSchema + * @type { object } + * @property { string } issuedAt + */ +export const GenerateWorkingDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullable() }).partial(); +export type GenerateWorkingDocumentPreviewRequestDto = z.infer; - /** - * GenerateWorkingDocumentPreviewRequestDtoSchema - * @type { object } - * @property { string } issuedAt - */ - export const GenerateWorkingDocumentPreviewRequestDtoSchema = z - .object({ issuedAt: z.iso.datetime({ offset: true }) }) - .readonly(); - export type GenerateWorkingDocumentPreviewRequestDto = z.infer; } diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts index ac57ead..948d434 100644 --- a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts +++ b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -10,323 +9,208 @@ import { CommonModels } from "@/data/common/common.models"; import { WorkingDocumentsTemplatedDocumentApi } from "./workingDocumentsTemplatedDocument.api"; export namespace WorkingDocumentsTemplatedDocumentQueries { - export const moduleName = QueryModule.WorkingDocumentsTemplatedDocument; +export const moduleName = QueryModule.WorkingDocumentsTemplatedDocument; - export const keys = { +export const keys = { all: [moduleName] as const, - getTemplatedDocument: (officeId: string, positionId: string, templatedDocumentId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/templated-documents/:templatedDocumentId", - officeId, - positionId, - templatedDocumentId, - ] as const, - }; + getTemplatedDocument: (officeId: string, positionId: string, templatedDocumentId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/templated-documents/:templatedDocumentId", officeId, positionId, templatedDocumentId] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create a templated document + * @permission Requires `canUseCreate` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, officeId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetTemplatedDocument` + * @summary Get templated document data + * @permission Requires `canUseGetTemplatedDocument` ability + * @param { string } object.officeId Path parameter + * @param { string } object.positionId Path parameter + * @param { string } object.templatedDocumentId Path parameter + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [200, 401] + */ +export const useGetTemplatedDocument = ({ officeId, positionId, templatedDocumentId }: { officeId: string, positionId: string, templatedDocumentId: string }, options?: AppQueryOptions) => { + const { checkAcl } = useAclCheck(); + + return useQuery({ + queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), + queryFn: () => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument(officeId, positionId, templatedDocumentId) }, + ...options, + }); +}; + +/** + * Mutation `useUpdateTemplatedDocument` + * @summary Update templated document data + * @permission Requires `canUseUpdateTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [200, 401] + */ +export const useUpdateTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument(officeId, positionId, templatedDocumentId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + const { officeId, positionId, templatedDocumentId } = variables; + const updateKeys = [keys.getTemplatedDocument(officeId, positionId, templatedDocumentId)]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteTemplatedDocument` + * @summary Delete templated document + * @permission Requires `canUseDeleteTemplatedDocument` ability + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { string } mutation.officeId Path parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Templated document deleted + * @statusCodes [204, 401, 404] + */ +export const useDeleteTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ positionId, templatedDocumentId, officeId }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument(positionId, templatedDocumentId, officeId) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `usePreviewTemplatedDocument` - recommended when file should not be cached + * @summary Preview templated document + * @permission Requires `canUsePreviewTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 201, 401] + */ +export const usePreviewTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument(officeId, positionId, templatedDocumentId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useIssueTemplatedDocument` + * @summary Issue templated document (generate final PDF) + * @permission Requires `canUseIssueTemplatedDocument` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [201, 401] + */ +export const useIssueTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument(officeId, positionId, templatedDocumentId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useGenerateDocumentEml` - recommended when file should not be cached + * @summary Generate templated document and return EML file + * @permission Requires `canUseGenerateDocumentEml` ability + * @param { string } mutation.officeId Path parameter + * @param { string } mutation.positionId Path parameter + * @param { string } mutation.templatedDocumentId Path parameter + * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult> } + * @statusCodes [200, 401] + */ +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { + const { checkAcl } = useAclCheck(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { + checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId } )); + return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml(officeId, positionId, templatedDocumentId, data) + }, + ...options, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; - /** - * Mutation `useCreate` - * @summary Create a templated document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.create, - { - positionId: string; - officeId: string; - data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetTemplatedDocument` - * @summary Get templated document data - * @permission Requires `canUseGetTemplatedDocument` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.templatedDocumentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetTemplatedDocument = ( - { - officeId, - positionId, - templatedDocumentId, - }: { officeId: string; positionId: string; templatedDocumentId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), - queryFn: () => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument( - officeId, - positionId, - templatedDocumentId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateTemplatedDocument` - * @summary Update templated document data - * @permission Requires `canUseUpdateTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateTemplatedDocument = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument, - { - officeId: string; - positionId: string; - templatedDocumentId: string; - data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument( - officeId, - positionId, - templatedDocumentId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, templatedDocumentId } = variables; - const updateKeys = [keys.getTemplatedDocument(officeId, positionId, templatedDocumentId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteTemplatedDocument` - * @summary Delete templated document - * @permission Requires `canUseDeleteTemplatedDocument` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Templated document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteTemplatedDocument = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument, - { positionId: string; templatedDocumentId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, templatedDocumentId, officeId }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument( - positionId, - templatedDocumentId, - officeId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `usePreviewTemplatedDocument` - recommended when file should not be cached - * @summary Preview templated document - * @permission Requires `canUsePreviewTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const usePreviewTemplatedDocument = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument, - { - officeId: string; - positionId: string; - templatedDocumentId: string; - data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument( - officeId, - positionId, - templatedDocumentId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useIssueTemplatedDocument` - * @summary Issue templated document (generate final PDF) - * @permission Requires `canUseIssueTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useIssueTemplatedDocument = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument, - { - officeId: string; - positionId: string; - templatedDocumentId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument( - officeId, - positionId, - templatedDocumentId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate templated document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGenerateDocumentEml = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.generateDocumentEml, - { - officeId: string; - positionId: string; - templatedDocumentId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml( - officeId, - positionId, - templatedDocumentId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; } diff --git a/test/generated/base/zod.extended.ts b/test/generated/base/zod.extended.ts index 205405c..81e1e02 100644 --- a/test/generated/base/zod.extended.ts +++ b/test/generated/base/zod.extended.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; +import { ErrorHandler, SharedErrorHandler } from ""; export namespace ZodExtended { interface ParseOptions { diff --git a/test/generated/next/aWBStocks/aWBStocks.api.ts b/test/generated/next/aWBStocks/aWBStocks.api.ts index a71912d..47097eb 100644 --- a/test/generated/next/aWBStocks/aWBStocks.api.ts +++ b/test/generated/next/aWBStocks/aWBStocks.api.ts @@ -1,71 +1,67 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { AWBStocksModels } from "./aWBStocks.models"; export namespace AWBStocksApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, `/offices/${officeId}/awb-stocks`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (officeId: string, data: AWBStocksModels.CreateAWBStockRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: AWBStocksModels.CreateAWBStockRequestDTO, ) => { return AppRestClient.post( { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, `/offices/${officeId}/awb-stocks`, ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), - config + ) }; -export const findById = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { +export const findById = (stockId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, `/offices/${officeId}/awb-stocks/${stockId}`, - config + ) }; -export const update = (stockId: string, officeId: string, data: AWBStocksModels.UpdateAWBStockRequestDTO, config?: AxiosRequestConfig) => { +export const update = (stockId: string, officeId: string, data: AWBStocksModels.UpdateAWBStockRequestDTO, ) => { return AppRestClient.patch( { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, `/offices/${officeId}/awb-stocks/${stockId}`, ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), - config + ) }; -export const archive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { +export const archive = (stockId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, `/offices/${officeId}/awb-stocks/${stockId}/archive`, - undefined, - config + ) }; -export const unarchive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { +export const unarchive = (stockId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, - undefined, - config + ) }; -export const generateNextNumber = (officeId: string, data: AWBStocksModels.GenerateAWBNumberRequestDTO, config?: AxiosRequestConfig) => { +export const generateNextNumber = (officeId: string, data: AWBStocksModels.GenerateAWBNumberRequestDTO, ) => { return AppRestClient.post( { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, `/offices/${officeId}/awb-stocks/generate-number`, ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/aWBStocks/aWBStocks.models.ts b/test/generated/next/aWBStocks/aWBStocks.models.ts index 442057c..2d817fa 100644 --- a/test/generated/next/aWBStocks/aWBStocks.models.ts +++ b/test/generated/next/aWBStocks/aWBStocks.models.ts @@ -9,7 +9,7 @@ export namespace AWBStocksModels { * @property { string } name Business partner name * @property { string } carrierPrefix Carrier prefix (3 digits) */ -export const AWBStockBusinessPartnerPreviewDTOSchema = z.object({ id: z.string().describe("Business partner ID"), name: z.string().describe("Business partner name"), carrierPrefix: z.string().describe("Carrier prefix (3 digits)") }).readonly(); +export const AWBStockBusinessPartnerPreviewDTOSchema = z.object({ id: z.string(), name: z.string(), carrierPrefix: z.string() }); export type AWBStockBusinessPartnerPreviewDTO = z.infer; /** @@ -18,7 +18,7 @@ export type AWBStockBusinessPartnerPreviewDTO = z.infer; /** @@ -39,7 +39,7 @@ export type AWBStockEmployeePreviewDTO = z.infer; /** @@ -50,7 +50,7 @@ export type AWBStockResponseDTO = z.infer; * @property { string } searchQuery * @property { boolean } used */ -export const AWBStockFilterDtoSchema = z.object({ archived: z.boolean(), carrierId: z.string(), searchQuery: z.string(), used: z.boolean() }).readonly(); +export const AWBStockFilterDtoSchema = z.object({ archived: z.boolean().nullable(), carrierId: z.string().nullable(), searchQuery: z.string().nullable(), used: z.boolean().nullable() }).partial(); export type AWBStockFilterDto = z.infer; /** @@ -63,7 +63,7 @@ export type AWBStockFilterDto = z.infer; * @property { string } comments Comments * @property { string } officeId Office ID */ -export const CreateAWBStockRequestDTOSchema = z.object({ carrierId: z.string().describe("Carrier business partner ID"), startNumber: z.number().gte(0).describe("Start number"), stock: z.number().describe("Stock size"), priority: z.number().describe("Priority"), comments: z.string().describe("Comments").nullish(), officeId: z.string().describe("Office ID") }).readonly(); +export const CreateAWBStockRequestDTOSchema = z.object({ carrierId: z.string(), startNumber: z.number().gte(0), stock: z.number(), priority: z.number(), comments: z.string().nullish(), officeId: z.string() }); export type CreateAWBStockRequestDTO = z.infer; /** @@ -71,7 +71,7 @@ export type CreateAWBStockRequestDTO = z.infer; /** @@ -79,7 +79,7 @@ export type GenerateAWBNumberRequestDTO = z.infer; /** @@ -87,7 +87,7 @@ export type GenerateAWBNumberResponseDTO = z.infer; /** @@ -108,7 +108,7 @@ export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSc * @property { number } totalItems Total available items * @property { AWBStockResponseDTO[] } items */ -export const AWBStocksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AWBStockResponseDTOSchema).readonly() }).readonly().shape }); +export const AWBStocksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AWBStockResponseDTOSchema).nullable() }).partial().shape }); export type AWBStocksPaginateResponse = z.infer; } diff --git a/test/generated/next/aWBStocks/aWBStocks.queries.ts b/test/generated/next/aWBStocks/aWBStocks.queries.ts index 7c0a52a..7efe73d 100644 --- a/test/generated/next/aWBStocks/aWBStocks.queries.ts +++ b/test/generated/next/aWBStocks/aWBStocks.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -32,14 +31,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); - return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -58,14 +57,14 @@ export const usePaginate = ({ officeId, limit, order, filter, page, curso * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); - return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -85,14 +84,14 @@ export const usePaginateInfinite = ({ officeId, limit, order, filter, cur * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(AWBStocksAcl.canUseCreate({ officeId } )); - return AWBStocksApi.create(officeId, data, config) + return AWBStocksApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -112,14 +111,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindById = ({ stockId, officeId }: { stockId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ stockId, officeId }: { stockId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(stockId, officeId), queryFn: () => { checkAcl(AWBStocksAcl.canUseFindById({ officeId } )); - return AWBStocksApi.findById(stockId, officeId, config) }, + return AWBStocksApi.findById(stockId, officeId) }, ...options, }); }; @@ -135,14 +134,14 @@ export const useFindById = ({ stockId, officeId }: { stockId: string, off * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ stockId, officeId, data }) => { checkAcl(AWBStocksAcl.canUseUpdate({ officeId } )); - return AWBStocksApi.update(stockId, officeId, data, config) + return AWBStocksApi.update(stockId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -164,14 +163,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ stockId, officeId }) => { checkAcl(AWBStocksAcl.canUseArchive({ officeId } )); - return AWBStocksApi.archive(stockId, officeId, config) + return AWBStocksApi.archive(stockId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -193,14 +192,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ stockId, officeId }) => { checkAcl(AWBStocksAcl.canUseUnarchive({ officeId } )); - return AWBStocksApi.unarchive(stockId, officeId, config) + return AWBStocksApi.unarchive(stockId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -222,14 +221,14 @@ export const useUnarchive = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerateNextNumber = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateNextNumber = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId } )); - return AWBStocksApi.generateNextNumber(officeId, data, config) + return AWBStocksApi.generateNextNumber(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/acl/useAclCheck.ts b/test/generated/next/acl/useAclCheck.ts index 95b4403..723069f 100644 --- a/test/generated/next/acl/useAclCheck.ts +++ b/test/generated/next/acl/useAclCheck.ts @@ -1,6 +1,6 @@ import { AbilityTuple } from "@casl/ability"; -import { type ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; -import { AbilityContext } from "@povio/openapi-codegen-cli/acl"; +import { type ErrorHandler, SharedErrorHandler } from ""; +import { AbilityContext } from ""; import { useCallback } from "react"; import { AppAbilities } from "@/data/acl/app.ability"; @@ -9,7 +9,7 @@ interface UseAclCheckProps { } export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { - const ability = AbilityContext.useAbility(); + const ability = AbilityContext.useAbility(); const checkAcl = useCallback((appAbility: AppAbilities) => { if (!ability.can(...(appAbility as AbilityTuple))) { diff --git a/test/generated/next/airPositions/airPositions.api.ts b/test/generated/next/airPositions/airPositions.api.ts index 396d280..5b8e89a 100644 --- a/test/generated/next/airPositions/airPositions.api.ts +++ b/test/generated/next/airPositions/airPositions.api.ts @@ -1,22 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { AirPositionsModels } from "./airPositions.models"; export namespace AirPositionsApi { -export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/air-position`, - config + ) }; -export const update = (officeId: string, positionId: string, data: AirPositionsModels.UpdateAirPositionRequestDTO, config?: AxiosRequestConfig) => { +export const update = (officeId: string, positionId: string, data: AirPositionsModels.UpdateAirPositionRequestDTO, ) => { return AppRestClient.patch( { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/air-position`, ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/airPositions/airPositions.models.ts b/test/generated/next/airPositions/airPositions.models.ts index c2dc2e1..bd514c5 100644 --- a/test/generated/next/airPositions/airPositions.models.ts +++ b/test/generated/next/airPositions/airPositions.models.ts @@ -26,7 +26,7 @@ export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnum * @property { string } createdAt * @property { string } updatedAt */ -export const AirPositionResponseDTOSchema = z.object({ id: z.string(), hawbNumber: z.string().nullish(), mawbNumber: z.string().nullish(), airlineDeadline: z.iso.datetime({ offset: true }).nullish(), customsStatus: z.string().nullish(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), mrnT1Number: z.string().nullish(), isCourier: z.boolean().nullish(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const AirPositionResponseDTOSchema = z.object({ id: z.string(), hawbNumber: z.string().nullish(), mawbNumber: z.string().nullish(), airlineDeadline: z.iso.datetime({ offset: true }).nullish(), customsStatus: z.string().nullish(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), mrnT1Number: z.string().nullish(), isCourier: z.boolean().nullish(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }); export type AirPositionResponseDTO = z.infer; /** @@ -43,7 +43,7 @@ export type AirPositionResponseDTO = z.infer; } diff --git a/test/generated/next/airPositions/airPositions.queries.ts b/test/generated/next/airPositions/airPositions.queries.ts index 42c382c..3671950 100644 --- a/test/generated/next/airPositions/airPositions.queries.ts +++ b/test/generated/next/airPositions/airPositions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(officeId, positionId), queryFn: () => { checkAcl(AirPositionsAcl.canUseGet({ officeId } )); - return AirPositionsApi.get(officeId, positionId, config) }, + return AirPositionsApi.get(officeId, positionId) }, ...options, }); }; @@ -49,14 +48,14 @@ export const useGet = ({ officeId, positionId }: { officeId: string, posi * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(AirPositionsAcl.canUseUpdate({ officeId } )); - return AirPositionsApi.update(officeId, positionId, data, config) + return AirPositionsApi.update(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/airports/airports.api.ts b/test/generated/next/airports/airports.api.ts index 13b15e1..efd1d01 100644 --- a/test/generated/next/airports/airports.api.ts +++ b/test/generated/next/airports/airports.api.ts @@ -1,63 +1,60 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { AirportsModels } from "./airports.models"; export namespace AirportsApi { -export const paginate = (limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: AirportsModels.AirportsPaginateResponseSchema }, `/airports`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: AirportsModels.CreateAirportRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: AirportsModels.CreateAirportRequestDTO, ) => { return AppRestClient.post( { resSchema: AirportsModels.AirportResponseDTOSchema }, `/airports`, ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), - config + ) }; -export const paginateLabels = (limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, `/airports/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, ) => { return AppRestClient.patch( { resSchema: AirportsModels.AirportResponseDTOSchema }, `/airports/${id}`, ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), - config + ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: AirportsModels.AirportResponseDTOSchema }, `/airports/${id}`, - config + ) }; } diff --git a/test/generated/next/airports/airports.models.ts b/test/generated/next/airports/airports.models.ts index d1d7c6c..6d862c1 100644 --- a/test/generated/next/airports/airports.models.ts +++ b/test/generated/next/airports/airports.models.ts @@ -8,7 +8,7 @@ export namespace AirportsModels { * @property { string } id * @property { string } name */ -export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type AirportEmployeeDTO = z.infer; /** @@ -25,7 +25,7 @@ export type AirportEmployeeDTO = z.infer; * @property { AirportEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const AirportResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the airport"), name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport"), createdById: z.string().nullish(), createdBy: AirportEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: AirportEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const AirportResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), iataCode: z.string(), createdById: z.string().nullish(), createdBy: AirportEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: AirportEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type AirportResponseDTO = z.infer; /** @@ -33,7 +33,7 @@ export type AirportResponseDTO = z.infer; * @type { object } * @property { string } search Search term to filter airports by name, match code or IATA code */ -export const AirportPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter airports by name, match code or IATA code") }).readonly(); +export const AirportPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); export type AirportPaginationFilterDto = z.infer; /** @@ -41,7 +41,7 @@ export type AirportPaginationFilterDto = z.infer; /** @@ -51,7 +51,7 @@ export type AirportLabelFilterDto = z.infer; * @property { string } matchCode Match code for the airport * @property { string } iataCode IATA code of the airport */ -export const CreateAirportRequestDTOSchema = z.object({ name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport") }).readonly(); +export const CreateAirportRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), iataCode: z.string() }); export type CreateAirportRequestDTO = z.infer; /** @@ -61,7 +61,7 @@ export type CreateAirportRequestDTO = z.infer; /** @@ -82,7 +82,7 @@ export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSche * @property { number } totalItems Total available items * @property { AirportResponseDTO[] } items */ -export const AirportsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AirportResponseDTOSchema).readonly() }).readonly().shape }); +export const AirportsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AirportResponseDTOSchema).nullable() }).partial().shape }); export type AirportsPaginateResponse = z.infer; /** @@ -103,7 +103,7 @@ export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderP * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const AirportsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const AirportsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type AirportsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/airports/airports.queries.ts b/test/generated/next/airports/airports.queries.ts index 027bf29..47b06ab 100644 --- a/test/generated/next/airports/airports.queries.ts +++ b/test/generated/next/airports/airports.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, page, cursor, config) }, + return AirportsApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -58,14 +57,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return AirportsApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -84,14 +83,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseMutationResult } * @statusCodes [200, 201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(AirportsAcl.canUseCreate()); - return AirportsApi.create(data, config) + return AirportsApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -114,14 +113,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return AirportsApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -139,14 +138,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -166,14 +165,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(AirportsAcl.canUseUpdate()); - return AirportsApi.update(id, data, config) + return AirportsApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -194,14 +193,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(AirportsAcl.canUseFindById()); - return AirportsApi.findById(id, config) }, + return AirportsApi.findById(id) }, ...options, }); }; diff --git a/test/generated/next/bankAccounts/bankAccounts.api.ts b/test/generated/next/bankAccounts/bankAccounts.api.ts index 6a4092d..1274ba6 100644 --- a/test/generated/next/bankAccounts/bankAccounts.api.ts +++ b/test/generated/next/bankAccounts/bankAccounts.api.ts @@ -1,16 +1,14 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { BankAccountsModels } from "./bankAccounts.models"; export namespace BankAccountsApi { -export const findAll = (search?: string, officeId?: string, config?: AxiosRequestConfig) => { +export const findAll = (search?: string, officeId?: string, ) => { return AppRestClient.get( { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, `/bank-accounts/labels`, { - ...config, params: { search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), @@ -18,18 +16,17 @@ export const findAll = (search?: string, officeId?: string, config?: AxiosReques } ) }; -export const paginateLabels = (limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, `/bank-accounts/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) diff --git a/test/generated/next/bankAccounts/bankAccounts.models.ts b/test/generated/next/bankAccounts/bankAccounts.models.ts index 2f5199f..108934f 100644 --- a/test/generated/next/bankAccounts/bankAccounts.models.ts +++ b/test/generated/next/bankAccounts/bankAccounts.models.ts @@ -8,14 +8,14 @@ export namespace BankAccountsModels { * @property { string } search Search by name or bank name * @property { string } officeId Office ID to filter by */ -export const BankAccountFilterDtoSchema = z.object({ search: z.string().describe("Search by name or bank name"), officeId: z.string().describe("Office ID to filter by") }).readonly(); +export const BankAccountFilterDtoSchema = z.object({ search: z.string().nullable(), officeId: z.string().nullable() }).partial(); export type BankAccountFilterDto = z.infer; /** * BankAccountsFindAllResponseSchema * @type { array } */ -export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); export type BankAccountsFindAllResponse = z.infer; /** @@ -36,7 +36,7 @@ export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabe * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const BankAccountsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const BankAccountsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type BankAccountsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/bankAccounts/bankAccounts.queries.ts b/test/generated/next/bankAccounts/bankAccounts.queries.ts index 0fa5c5d..0a86f09 100644 --- a/test/generated/next/bankAccounts/bankAccounts.queries.ts +++ b/test/generated/next/bankAccounts/bankAccounts.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -27,14 +26,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindAll = ({ search, officeId }: { search?: string, officeId?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAll = ({ search, officeId }: { search?: string, officeId?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findAll(search, officeId), queryFn: () => { checkAcl(BankAccountsAcl.canUseFindAll()); - return BankAccountsApi.findAll(search, officeId, config) }, + return BankAccountsApi.findAll(search, officeId) }, ...options, }); }; @@ -52,14 +51,14 @@ export const useFindAll = ({ search, officeId }: { search?: string, offic * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -77,14 +76,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.api.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.api.ts index db3d8bd..75d9468 100644 --- a/test/generated/next/bookkeepingExport/bookkeepingExport.api.ts +++ b/test/generated/next/bookkeepingExport/bookkeepingExport.api.ts @@ -1,103 +1,96 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { BookkeepingExportModels } from "./bookkeepingExport.models"; export namespace BookkeepingExportApi { -export const createBatch = (officeId: string, data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, config?: AxiosRequestConfig) => { +export const createBatch = (officeId: string, data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, ) => { return AppRestClient.post( { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, `/offices/${officeId}/bookkeeping-exports`, ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), - config + ) }; -export const paginateBatches = (officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateBatches = (officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, `/offices/${officeId}/bookkeeping-exports`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const getBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { +export const getBatch = (officeId: string, batchId: string, ) => { return AppRestClient.get( { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, `/offices/${officeId}/bookkeeping-exports/${batchId}`, - config + ) }; -export const updateBatchFormat = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, config?: AxiosRequestConfig) => { +export const updateBatchFormat = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, ) => { return AppRestClient.patch( { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, `/offices/${officeId}/bookkeeping-exports/${batchId}`, ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), - config + ) }; -export const updateBatchItem = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, config?: AxiosRequestConfig) => { +export const updateBatchItem = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, ) => { return AppRestClient.patch( { resSchema: z.void() }, `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), - config + ) }; -export const paginateBatchItems = (officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateBatchItems = (officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const validateBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { +export const validateBookkeepingBatch = (officeId: string, batchId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, - undefined, - config + ) }; -export const exportBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { +export const exportBookkeepingBatch = (officeId: string, batchId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, - undefined, - config + ) }; -export const revertBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { +export const revertBookkeepingBatch = (officeId: string, batchId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, - undefined, - config + ) }; -export const getVatLineItems = (officeId: string, batchId: string, order?: string, config?: AxiosRequestConfig) => { +export const getVatLineItems = (officeId: string, batchId: string, order?: string, ) => { return AppRestClient.get( { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), }, diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.models.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.models.ts index 3d43eef..4cdb0f1 100644 --- a/test/generated/next/bookkeepingExport/bookkeepingExport.models.ts +++ b/test/generated/next/bookkeepingExport/bookkeepingExport.models.ts @@ -16,7 +16,7 @@ export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enu * @property { BookkeepingExportFormatEnum } format * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters */ -export const CreateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema.nullish(), invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema }).readonly(); +export const CreateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema.nullish(), invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema }); export type CreateBookkeepingExportBatchRequestDto = z.infer; /** @@ -34,7 +34,7 @@ export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema * @property { string } downloadUrl * @property { string } fileName */ -export const BookkeepingExportFileDtoSchema = z.object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }).readonly(); +export const BookkeepingExportFileDtoSchema = z.object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }); export type BookkeepingExportFileDto = z.infer; /** @@ -59,7 +59,7 @@ export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnum * @property { string } dateRange.from * @property { string } dateRange.to */ -export const BookkeepingExportBatchSummaryDtoSchema = z.object({ totalCount: z.number(), needsReviewCount: z.number(), readyForExportCount: z.number(), excludedCount: z.number(), invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).readonly().nullish(), dateRange: z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).readonly().nullish() }).readonly(); +export const BookkeepingExportBatchSummaryDtoSchema = z.object({ totalCount: z.number(), needsReviewCount: z.number(), readyForExportCount: z.number(), excludedCount: z.number(), invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).nullish(), dateRange: z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).nullish() }); export type BookkeepingExportBatchSummaryDto = z.infer; /** @@ -84,7 +84,7 @@ export type BookkeepingExportBatchSummaryDto = z.infer; /** @@ -92,7 +92,7 @@ export type BookkeepingExportBatchDetailsDto = z.infer; /** @@ -112,7 +112,7 @@ export type UpdateBookkeepingExportBatchRequestDto = z.infer; /** @@ -121,7 +121,7 @@ export type BookkeepingExportBatchPreviewDto = z.infer; /** @@ -132,7 +132,7 @@ export type DateRange = z.infer; * @property { BookkeepingExportFormatEnum[] } format * @property { string[] } createdBy */ -export const BookkeepingExportBatchPreviewFilterDtoSchema = z.object({ createdDate: DateRangeSchema, status: z.array(BookkeepingExportBatchStatusEnumSchema).readonly(), format: z.array(BookkeepingExportFormatEnumSchema).readonly(), createdBy: z.array(z.string()).readonly() }).readonly(); +export const BookkeepingExportBatchPreviewFilterDtoSchema = z.object({ createdDate: DateRangeSchema.nullable(), status: z.array(BookkeepingExportBatchStatusEnumSchema).nullable(), format: z.array(BookkeepingExportFormatEnumSchema).nullable(), createdBy: z.array(z.string()).nullable() }).partial(); export type BookkeepingExportBatchPreviewFilterDto = z.infer; /** @@ -167,7 +167,7 @@ export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemSt * @property { string } receiver.contraAccount * @property { string } comments */ -export const BookkeepingExportItemDetailDtoSchema = z.object({ id: z.string(), invoiceId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).readonly().nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), vatRules: z.array(z.string()).readonly() }).readonly(), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }).readonly(), comments: z.string().nullish() }).readonly(); +export const BookkeepingExportItemDetailDtoSchema = z.object({ id: z.string(), invoiceId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), vatRules: z.array(z.string()) }), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }), comments: z.string().nullish() }); export type BookkeepingExportItemDetailDto = z.infer; /** @@ -175,7 +175,7 @@ export type BookkeepingExportItemDetailDto = z.infer; /** @@ -211,7 +211,7 @@ export type BookkeepingExportItemDetailFilterDto = z.infer; /** @@ -219,7 +219,7 @@ export type BookkeepingExportVatLineItemDto = z.infer; /** @@ -230,7 +230,7 @@ export type CreateBookkeepingExportBatchResponseDto = z.infer; /** @@ -251,7 +251,7 @@ export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema * @property { number } totalItems Total available items * @property { BookkeepingExportBatchPreviewDto[] } items */ -export const PaginateBatchesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).readonly() }).readonly().shape }); +export const PaginateBatchesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).nullable() }).partial().shape }); export type PaginateBatchesResponse = z.infer; /** @@ -272,7 +272,7 @@ export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnum * @property { number } totalItems Total available items * @property { BookkeepingExportItemDetailDto[] } items */ -export const PaginateBatchItemsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).readonly() }).readonly().shape }); +export const PaginateBatchItemsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).nullable() }).partial().shape }); export type PaginateBatchItemsResponse = z.infer; /** @@ -287,7 +287,7 @@ export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema * GetVatLineItemsResponseSchema * @type { array } */ -export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema).readonly(); +export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema); export type GetVatLineItemsResponse = z.infer; } diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts index 5281e85..db9e500 100644 --- a/test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts +++ b/test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -31,14 +30,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId } )); - return BookkeepingExportApi.createBatch(officeId, data, config) + return BookkeepingExportApi.createBatch(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -62,14 +61,14 @@ export const useCreateBatch = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateBatches = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateBatches = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor, config) }, + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -88,14 +87,14 @@ export const usePaginateBatches = ({ officeId, limit, order, filter, page * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateBatchesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateBatchesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor, config) }, + return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -115,14 +114,14 @@ export const usePaginateBatchesInfinite = ({ officeId, limit, order, filt * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getBatch(officeId, batchId), queryFn: () => { checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId } )); - return BookkeepingExportApi.getBatch(officeId, batchId, config) }, + return BookkeepingExportApi.getBatch(officeId, batchId) }, ...options, }); }; @@ -138,14 +137,14 @@ export const useGetBatch = ({ officeId, batchId }: { officeId: string, ba * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateBatchFormat = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateBatchFormat = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, batchId, data }) => { checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId } )); - return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data, config) + return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -168,14 +167,14 @@ export const useUpdateBatchFormat = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdateBatchItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateBatchItem = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, batchId, data }) => { checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId } )); - return BookkeepingExportApi.updateBatchItem(officeId, batchId, data, config) + return BookkeepingExportApi.updateBatchItem(officeId, batchId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -200,14 +199,14 @@ export const useUpdateBatchItem = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateBatchItems = ({ officeId, batchId, limit, order, filter, page, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateBatchItems = ({ officeId, batchId, limit, order, filter, page, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); - return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor, config) }, + return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -227,14 +226,14 @@ export const usePaginateBatchItems = ({ officeId, batchId, limit, order, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateBatchItemsInfinite = ({ officeId, batchId, limit, order, filter, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateBatchItemsInfinite = ({ officeId, batchId, limit, order, filter, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); - return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, pageParam, cursor, config) }, + return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -254,14 +253,14 @@ export const usePaginateBatchItemsInfinite = ({ officeId, batchId, limit, * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useValidateBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useValidateBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, batchId }) => { checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId, config) + return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -281,14 +280,14 @@ export const useValidateBookkeepingBatch = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useExportBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useExportBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, batchId }) => { checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId, config) + return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -308,14 +307,14 @@ export const useExportBookkeepingBatch = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useRevertBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useRevertBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, batchId }) => { checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId, config) + return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -336,14 +335,14 @@ export const useRevertBookkeepingBatch = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetVatLineItems = ({ officeId, batchId, order }: { officeId: string, batchId: string, order?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetVatLineItems = ({ officeId, batchId, order }: { officeId: string, batchId: string, order?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getVatLineItems(officeId, batchId, order), queryFn: () => { checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId } )); - return BookkeepingExportApi.getVatLineItems(officeId, batchId, order, config) }, + return BookkeepingExportApi.getVatLineItems(officeId, batchId, order) }, ...options, }); }; diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts index b527abc..88b624e 100644 --- a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts +++ b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts @@ -1,47 +1,45 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; export namespace BusinessPartnerBookkeepingMappingsApi { -export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { +export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, ) => { return AppRestClient.get( { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - config + ) }; -export const createBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, config?: AxiosRequestConfig) => { +export const createBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, ) => { return AppRestClient.post( { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), - config + ) }; -export const updateBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, config?: AxiosRequestConfig) => { +export const updateBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, ) => { return AppRestClient.patch( { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), - config + ) }; -export const updateBookkeepingMappingById = (officeId: string, businessPartnerId: string, id: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, config?: AxiosRequestConfig) => { +export const updateBookkeepingMappingById = (officeId: string, businessPartnerId: string, id: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, ) => { return AppRestClient.patch( { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), - config + ) }; -export const deleteBookkeepingMapping = (officeId: string, businessPartnerId: string, id: string, config?: AxiosRequestConfig) => { +export const deleteBookkeepingMapping = (officeId: string, businessPartnerId: string, id: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - undefined, - config + ) }; } diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts index 90ad3ac..2bb5fda 100644 --- a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts +++ b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts @@ -11,7 +11,7 @@ export namespace BusinessPartnerBookkeepingMappingsModels { * @property { string } businessPartnerId * @property { boolean } paysTaxInEurForFactoring */ -export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z.object({ id: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), currencyNotation: z.string().nullish(), businessPartnerId: z.string(), paysTaxInEurForFactoring: z.boolean().nullish() }).readonly(); +export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z.object({ id: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), currencyNotation: z.string().nullish(), businessPartnerId: z.string(), paysTaxInEurForFactoring: z.boolean().nullish() }); export type BusinessPartnerBookkeepingMappingResponseDto = z.infer; /** @@ -19,7 +19,7 @@ export type BusinessPartnerBookkeepingMappingResponseDto = z.infer; /** @@ -30,7 +30,7 @@ export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer; /** @@ -38,7 +38,7 @@ export type UpdateBookkeepingMappingDto = z.infer; /** @@ -49,14 +49,14 @@ export type UpdateBookkeepingMappingRequestDto = z.infer; /** * UpdateBookkeepingMappingResponseSchema * @type { array } */ -export const UpdateBookkeepingMappingResponseSchema = z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly(); +export const UpdateBookkeepingMappingResponseSchema = z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema); export type UpdateBookkeepingMappingResponse = z.infer; } diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts index 78fb4aa..e176f36 100644 --- a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts +++ b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetBookkeepingMappings = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetBookkeepingMappings = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), queryFn: () => { checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId, config) }, + return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId) }, ...options, }); }; @@ -49,14 +48,14 @@ export const useGetBookkeepingMappings = ({ officeId, businessPartnerId } * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, businessPartnerId, data }) => { checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping(officeId, businessPartnerId, data, config) + return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping(officeId, businessPartnerId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -77,14 +76,14 @@ export const useCreateBookkeepingMapping = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, businessPartnerId, data }) => { checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping(officeId, businessPartnerId, data, config) + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping(officeId, businessPartnerId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -106,14 +105,14 @@ export const useUpdateBookkeepingMapping = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdateBookkeepingMappingById = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateBookkeepingMappingById = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, businessPartnerId, id, data }) => { checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById(officeId, businessPartnerId, id, data, config) + return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById(officeId, businessPartnerId, id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -134,14 +133,14 @@ export const useUpdateBookkeepingMappingById = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeleteBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, businessPartnerId, id }) => { checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id, config) + return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts index 45ab2f9..60c1869 100644 --- a/test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts +++ b/test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts @@ -1,55 +1,52 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; export namespace BusinessPartnerContactsApi { -export const getContacts = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { +export const getContacts = (officeId: string, businessPartnerId: string, ) => { return AppRestClient.get( { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - config + ) }; -export const createContact = (officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, config?: AxiosRequestConfig) => { +export const createContact = (officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, ) => { return AppRestClient.post( { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), - config + ) }; -export const paginateContactLabels = (officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateContactLabels = (officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const updateContact = (contactId: string, officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, config?: AxiosRequestConfig) => { +export const updateContact = (contactId: string, officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, ) => { return AppRestClient.patch( { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), - config + ) }; -export const deleteContact = (contactId: string, officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { +export const deleteContact = (contactId: string, officeId: string, businessPartnerId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - undefined, - config + ) }; } diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts index e2c3d48..c9b784b 100644 --- a/test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts +++ b/test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts @@ -19,7 +19,7 @@ export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSche * @property { string } email Contact email * @property { string } phone Contact phone */ -export const BusinessPartnerContactResponseDTOSchema = z.object({ id: z.string().describe("Contact ID"), role: BusinessPartnerContactRoleEnumSchema.nullish(), name: z.string().describe("Contact name").nullish(), email: z.string().describe("Contact email").nullish(), phone: z.string().describe("Contact phone").nullish() }).readonly(); +export const BusinessPartnerContactResponseDTOSchema = z.object({ id: z.string(), role: BusinessPartnerContactRoleEnumSchema.nullish(), name: z.string().nullish(), email: z.string().nullish(), phone: z.string().nullish() }); export type BusinessPartnerContactResponseDTO = z.infer; /** @@ -27,7 +27,7 @@ export type BusinessPartnerContactResponseDTO = z.infer; /** @@ -38,7 +38,7 @@ export type BusinessPartnerContactListResponseDTO = z.infer; /** @@ -49,7 +49,7 @@ export type CreateBusinessPartnerContactRequestDTO = z.infer; /** @@ -57,7 +57,7 @@ export type UpdateBusinessPartnerContactRequestDTO = z.infer; /** @@ -78,7 +78,7 @@ export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderPar * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const PaginateContactLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const PaginateContactLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type PaginateContactLabelsResponse = z.infer; } diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts index 345a304..8941f35 100644 --- a/test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts +++ b/test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetContacts = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetContacts = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getContacts(officeId, businessPartnerId), queryFn: () => { checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId } )); - return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId, config) }, + return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId) }, ...options, }); }; @@ -51,14 +50,14 @@ export const useGetContacts = ({ officeId, businessPartnerId }: { officeI * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateContact = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, businessPartnerId, data }) => { checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId } )); - return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data, config) + return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -83,14 +82,14 @@ export const useCreateContact = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateContactLabels = ({ officeId, businessPartnerId, limit, order, filter, page, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateContactLabels = ({ officeId, businessPartnerId, limit, order, filter, page, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); - return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor, config) }, + return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -110,14 +109,14 @@ export const usePaginateContactLabels = ({ officeId, businessPartnerId, l * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateContactLabelsInfinite = ({ officeId, businessPartnerId, limit, order, filter, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateContactLabelsInfinite = ({ officeId, businessPartnerId, limit, order, filter, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); - return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, pageParam, cursor, config) }, + return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -139,14 +138,14 @@ export const usePaginateContactLabelsInfinite = ({ officeId, businessPart * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateContact = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId } )); - return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data, config) + return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -166,14 +165,14 @@ export const useUpdateContact = (options?: AppMutationOptions } * @statusCodes [200, 204, 401] */ -export const useDeleteContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteContact = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ contactId, officeId, businessPartnerId }) => { checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId } )); - return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId, config) + return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/businessPartners/businessPartners.api.ts b/test/generated/next/businessPartners/businessPartners.api.ts index 379cea4..df8cc83 100644 --- a/test/generated/next/businessPartners/businessPartners.api.ts +++ b/test/generated/next/businessPartners/businessPartners.api.ts @@ -1,179 +1,171 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { BusinessPartnersModels } from "./businessPartners.models"; export namespace BusinessPartnersApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, `/offices/${officeId}/business-partners`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (officeId: string, data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, ) => { return AppRestClient.post( { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, `/offices/${officeId}/business-partners`, ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), - config + ) }; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, `/offices/${officeId}/business-partners/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const getById = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const getById = (officeId: string, id: string, ) => { return AppRestClient.get( { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}`, - config + ) }; -export const update = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, config?: AxiosRequestConfig) => { +export const update = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, ) => { return AppRestClient.patch( { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}`, ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), - config + ) }; -export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const archive = (officeId: string, id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/business-partners/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const unarchive = (officeId: string, id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/business-partners/${id}/unarchive`, - undefined, - config + ) }; -export const lock = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const lock = (officeId: string, id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/business-partners/${id}/lock`, - undefined, - config + ) }; -export const unlock = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const unlock = (officeId: string, id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/business-partners/${id}/unlock`, - undefined, - config + ) }; -export const getRemarks = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const getRemarks = (officeId: string, id: string, ) => { return AppRestClient.get( { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, `/offices/${officeId}/business-partners/${id}/remarks`, - config + ) }; -export const createRemark = (officeId: string, id: string, data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, config?: AxiosRequestConfig) => { +export const createRemark = (officeId: string, id: string, data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, ) => { return AppRestClient.post( { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}/remarks`, ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), - config + ) }; -export const updateRemark = (officeId: string, id: string, remarkId: string, data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, config?: AxiosRequestConfig) => { +export const updateRemark = (officeId: string, id: string, remarkId: string, data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, ) => { return AppRestClient.patch( { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), - config + ) }; -export const deleteRemark = (officeId: string, id: string, remarkId: string, config?: AxiosRequestConfig) => { +export const deleteRemark = (officeId: string, id: string, remarkId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - undefined, - config + ) }; -export const getBasicInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const getBasicInfo = (officeId: string, id: string, ) => { return AppRestClient.get( { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}/basic`, - config + ) }; -export const updateBasicInfo = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, config?: AxiosRequestConfig) => { +export const updateBasicInfo = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, ) => { return AppRestClient.patch( { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}/basic`, ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), - config + ) }; -export const createSignatureUploadInstructions = (officeId: string, id: string, data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, config?: AxiosRequestConfig) => { +export const createSignatureUploadInstructions = (officeId: string, id: string, data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, ) => { return AppRestClient.post( { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), - config + ) }; -export const getCargoAgentInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const getCargoAgentInfo = (officeId: string, id: string, ) => { return AppRestClient.get( { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}/cargo-agent`, - config + ) }; -export const updateCargoAgent = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCargoAgentDTO, config?: AxiosRequestConfig) => { +export const updateCargoAgent = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCargoAgentDTO, ) => { return AppRestClient.patch( { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}/cargo-agent`, ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), - config + ) }; -export const getCarrierInformation = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const getCarrierInformation = (officeId: string, id: string, ) => { return AppRestClient.get( { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}/carrier`, - config + ) }; -export const updateCarrier = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCarrierDTO, config?: AxiosRequestConfig) => { +export const updateCarrier = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCarrierDTO, ) => { return AppRestClient.patch( { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, `/offices/${officeId}/business-partners/${id}/carrier`, ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/businessPartners/businessPartners.models.ts b/test/generated/next/businessPartners/businessPartners.models.ts index 75c284e..b825ac4 100644 --- a/test/generated/next/businessPartners/businessPartners.models.ts +++ b/test/generated/next/businessPartners/businessPartners.models.ts @@ -26,7 +26,7 @@ export const RemarkType = RemarkTypeSchema.enum; * @property { string } content Content of the remark * @property { RemarkType } type Type of the remark */ -export const BusinessPartnerRemarkResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the remark"), visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), content: z.string().describe("Content of the remark"), type: RemarkTypeSchema.describe("Type of the remark") }).readonly(); +export const BusinessPartnerRemarkResponseDTOSchema = z.object({ id: z.string(), visibility: RemarkVisibilitySchema, content: z.string(), type: RemarkTypeSchema }); export type BusinessPartnerRemarkResponseDTO = z.infer; /** @@ -37,7 +37,7 @@ export type BusinessPartnerRemarkResponseDTO = z.infer; /** @@ -46,7 +46,7 @@ export type BusinessPartnerAddressDto = z.infer; /** @@ -72,7 +72,7 @@ export type BusinessPartnerEmployeeDTO = z.infer; /** @@ -88,7 +88,7 @@ export type BusinessPartnerListResponseDTO = z.infer; /** @@ -98,7 +98,7 @@ export type BusinessPartnerFilterDto = z.infer; /** @@ -109,7 +109,7 @@ export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; /** @@ -122,7 +122,7 @@ export type BusinessPartnerLabelsFilterDto = z.infer; /** @@ -135,7 +135,7 @@ export type CreateBusinessPartnerAddressDto = z.infer; /** @@ -146,7 +146,7 @@ export type CreateBusinessPartnerRequestDTO = z.infer; /** @@ -155,7 +155,7 @@ export type BusinessPartnerResponseDTO = z.infer; /** @@ -164,7 +164,7 @@ export type BusinessPartnerLabelResponseDto = z.infer; /** @@ -195,7 +195,7 @@ export type ContactResponseDTO = z.infer; * @property { ContactResponseDTO } salesRep Sales representative * @property { ContactResponseDTO } operations Operations contact */ -export const BusinessPartnerDetailResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), createdById: z.string().describe("ID of the employee who created this record").nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this record").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Creation timestamp"), updatedById: z.string().describe("ID of the employee who last updated this record").nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this record").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Last update timestamp"), matchCode: z.string().describe("Match code of the business partner"), shortName: z.string().describe("Short name"), name: z.string().describe("Full name"), secondaryName: z.string().describe("Secondary name"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), archived: z.boolean().describe("Archived status"), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information"), blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("BL address information"), similar: z.array(BusinessPartnerLabelResponseDtoSchema).readonly().describe("Similar named business partners").nullish(), locked: z.boolean(), addressIsDifferentForBl: z.boolean(), lockedById: z.string().describe("Unique identifier of the employee who locked the business partner").nullish(), lockedByName: z.string().nullish(), lockedAt: z.iso.datetime({ offset: true }).describe("Unique identifier of the employee who locked the business partner").nullish(), belongsTo: ContactResponseDTOSchema.describe("Parent business partner"), salesRep: ContactResponseDTOSchema.describe("Sales representative"), operations: ContactResponseDTOSchema.describe("Operations contact") }).readonly(); +export const BusinessPartnerDetailResponseDTOSchema = z.object({ id: z.string(), createdById: z.string().nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), matchCode: z.string(), shortName: z.string(), name: z.string(), secondaryName: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema), archived: z.boolean(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema, blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema, similar: z.array(BusinessPartnerLabelResponseDtoSchema).nullish(), locked: z.boolean(), addressIsDifferentForBl: z.boolean(), lockedById: z.string().nullish(), lockedByName: z.string().nullish(), lockedAt: z.iso.datetime({ offset: true }).nullish(), belongsTo: ContactResponseDTOSchema, salesRep: ContactResponseDTOSchema, operations: ContactResponseDTOSchema }); export type BusinessPartnerDetailResponseDTO = z.infer; /** @@ -208,7 +208,7 @@ export type BusinessPartnerDetailResponseDTO = z.infer; /** @@ -226,7 +226,7 @@ export type UpdateBusinessPartnerAddressDto = z.infer; /** @@ -236,7 +236,7 @@ export type UpdateBusinessPartnerRequestDTO = z.infer; /** @@ -246,7 +246,7 @@ export type CreateBusinessPartnerRemarkRequestDTO = z.infer; /** @@ -271,7 +271,7 @@ export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.e * @property { string } relativeTo * @property { number } days Minimum: `0` */ -export const BusinessPartnerPaymentTermsResponseDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }).readonly(); +export const BusinessPartnerPaymentTermsResponseDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }); export type BusinessPartnerPaymentTermsResponseDto = z.infer; /** @@ -280,7 +280,7 @@ export type BusinessPartnerPaymentTermsResponseDto = z.infer; /** @@ -289,7 +289,7 @@ export type BusinessPartnerBankAccountResponseDto = z.infer; /** @@ -321,7 +321,7 @@ export type PartnerNetworkInfoDto = z.infer; * @property { string } signatureFileAttachmentId Signature file attachment ID * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment */ -export const BusinessPartnerBasicResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Reference to the business partner"), relationship: z.array(z.string()).readonly().describe("List of relationships"), accountType: AccountTypeEnumSchema.nullish(), vat: z.string().describe("VAT number"), legacySystemId: z.string().describe("Legacy system (move) id").nullish(), registrationNumber: z.string().nullish(), eori: z.string().describe("EORI number"), authorization: BusinessPartnerAuthorizationSchema.describe("Authorization status").nullable(), creditLimit: z.number().describe("Credit limit"), invoiceLanguage: z.string().describe("Invoice language"), invoiceCurrency: z.string().describe("Invoice currency"), iban: z.string().describe("IBAN"), bankNumber: z.string().describe("Bank number"), bankAccountNumber: z.string().describe("Bank account number"), termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), bankAccountId: z.string().nullish(), bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), partnerNetworks: z.array(PartnerNetworkInfoDtoSchema).readonly().describe("Partner networks"), dunningSystemId: z.string().nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), hblIssuerSigner: z.string().describe("HBL issuer/signer prefill"), signatureFileAttachmentId: z.string().describe("Signature file attachment ID"), signatureFileAttachmentUrl: z.string().describe("Signed URL for signature file attachment").nullish() }).readonly(); +export const BusinessPartnerBasicResponseDTOSchema = z.object({ businessPartnerId: z.string(), relationship: z.array(z.string()), accountType: AccountTypeEnumSchema.nullish(), vat: z.string(), legacySystemId: z.string().nullish(), registrationNumber: z.string().nullish(), eori: z.string(), authorization: BusinessPartnerAuthorizationSchema.nullable(), creditLimit: z.number(), invoiceLanguage: z.string(), invoiceCurrency: z.string(), iban: z.string(), bankNumber: z.string(), bankAccountNumber: z.string(), termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, notes: CommonModels.EditorContentResponseDtoSchema.nullish(), bankAccountId: z.string().nullish(), bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), partnerNetworks: z.array(PartnerNetworkInfoDtoSchema), dunningSystemId: z.string().nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), hblIssuerSigner: z.string(), signatureFileAttachmentId: z.string(), signatureFileAttachmentUrl: z.string().nullish() }); export type BusinessPartnerBasicResponseDTO = z.infer; /** @@ -330,7 +330,7 @@ export type BusinessPartnerBasicResponseDTO = z.infer; /** @@ -358,7 +358,7 @@ export type UpdateBusinessPartnerPaymentTermsDto = z.infer; /** @@ -368,7 +368,7 @@ export type UpdateBusinessPartnerBasicRequestDTO = z.infer; /** @@ -378,7 +378,7 @@ export type BusinessPartnerSignatureUploadRequestDTO = z.infer; /** @@ -389,7 +389,7 @@ export type BusinessPartnerSignatureUploadResponseDTO = z.infer; /** @@ -399,7 +399,7 @@ export type CargoAgentResponseDTO = z.infer; * @property { string } iataAccountNumber IATA account number * @property { string } regulatedAgentCode Regulated agent code */ -export const UpdateCargoAgentDTOSchema = z.object({ portOfHamburgAccountNumber: z.string().describe("Hamburg port account number"), iataAccountNumber: z.string().describe("IATA account number"), regulatedAgentCode: z.string().describe("Regulated agent code") }).readonly(); +export const UpdateCargoAgentDTOSchema = z.object({ portOfHamburgAccountNumber: z.string().nullable(), iataAccountNumber: z.string().nullable(), regulatedAgentCode: z.string().nullable() }).partial(); export type UpdateCargoAgentDTO = z.infer; /** @@ -417,7 +417,7 @@ export type UpdateCargoAgentDTO = z.infer; * @property { string } fundReportSuffix Fund report suffix * @property { string } invoiceSuffix Invoice suffix */ -export const CarrierResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Business partner identifier"), scac: z.string().describe("SCAC code"), iataAirlinePrefix: z.string().describe("IATA airline prefix"), iataCode: z.string().describe("IATA code"), registrationAddress: z.string().describe("Registration address"), masterBlSuffix: z.string().describe("Master BL suffix"), houseBlSuffix: z.string().describe("House BL suffix"), airWaybillSuffix: z.string().describe("Air waybill suffix"), cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), fundReportSuffix: z.string().describe("Fund report suffix"), invoiceSuffix: z.string().describe("Invoice suffix") }).readonly(); +export const CarrierResponseDTOSchema = z.object({ businessPartnerId: z.string(), scac: z.string(), iataAirlinePrefix: z.string(), iataCode: z.string(), registrationAddress: z.string(), masterBlSuffix: z.string(), houseBlSuffix: z.string(), airWaybillSuffix: z.string(), cargoManifestSuffix: z.string(), fundReportSuffix: z.string(), invoiceSuffix: z.string() }); export type CarrierResponseDTO = z.infer; /** @@ -434,7 +434,7 @@ export type CarrierResponseDTO = z.infer; * @property { string } fundReportSuffix Fund report suffix * @property { string } invoiceSuffix Invoice suffix */ -export const UpdateCarrierDTOSchema = z.object({ scac: z.string().describe("SCAC code"), iataAirlinePrefix: z.string().describe("IATA airline prefix"), iataCode: z.string().describe("IATA code"), registrationAddress: z.string().describe("Registration address"), masterBlSuffix: z.string().describe("Master BL suffix"), houseBlSuffix: z.string().describe("House BL suffix"), airWaybillSuffix: z.string().describe("Air waybill suffix"), cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), fundReportSuffix: z.string().describe("Fund report suffix"), invoiceSuffix: z.string().describe("Invoice suffix") }).readonly(); +export const UpdateCarrierDTOSchema = z.object({ scac: z.string().nullable(), iataAirlinePrefix: z.string().nullable(), iataCode: z.string().nullable(), registrationAddress: z.string().nullable(), masterBlSuffix: z.string().nullable(), houseBlSuffix: z.string().nullable(), airWaybillSuffix: z.string().nullable(), cargoManifestSuffix: z.string().nullable(), fundReportSuffix: z.string().nullable(), invoiceSuffix: z.string().nullable() }).partial(); export type UpdateCarrierDTO = z.infer; /** @@ -455,7 +455,7 @@ export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOr * @property { number } totalItems Total available items * @property { BusinessPartnerListResponseDTO[] } items */ -export const BusinessPartnersPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).readonly() }).readonly().shape }); +export const BusinessPartnersPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).nullable() }).partial().shape }); export type BusinessPartnersPaginateResponse = z.infer; /** @@ -476,14 +476,14 @@ export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPagi * @property { number } totalItems Total available items * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items */ -export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).readonly() }).readonly().shape }); +export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).nullable() }).partial().shape }); export type BusinessPartnersPaginateLabelsResponse = z.infer; /** * GetRemarksResponseSchema * @type { array } */ -export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema).readonly(); +export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema); export type GetRemarksResponse = z.infer; } diff --git a/test/generated/next/businessPartners/businessPartners.queries.ts b/test/generated/next/businessPartners/businessPartners.queries.ts index 5c7e107..3050547 100644 --- a/test/generated/next/businessPartners/businessPartners.queries.ts +++ b/test/generated/next/businessPartners/businessPartners.queries.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -38,14 +38,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -64,14 +64,14 @@ export const usePaginate = ({ officeId, limit, order, filter, page, curso * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -91,14 +91,14 @@ export const usePaginateInfinite = ({ officeId, limit, order, filter, cur * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(BusinessPartnersAcl.canUseCreate({ officeId } )); - return BusinessPartnersApi.create(officeId, data, config) + return BusinessPartnersApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -121,14 +121,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -146,14 +146,14 @@ export const usePaginateLabels = ({ officeId, limit, order, filter, page, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -173,14 +173,14 @@ export const usePaginateLabelsInfinite = ({ officeId, limit, order, filte * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getById(officeId, id), queryFn: () => { checkAcl(BusinessPartnersAcl.canUseGetById({ officeId } )); - return BusinessPartnersApi.getById(officeId, id, config) }, + return BusinessPartnersApi.getById(officeId, id) }, ...options, }); }; @@ -196,14 +196,14 @@ export const useGetById = ({ officeId, id }: { officeId: string, id: stri * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id, data }) => { checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId } )); - return BusinessPartnersApi.update(officeId, id, data, config) + return BusinessPartnersApi.update(officeId, id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -225,14 +225,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id }) => { checkAcl(BusinessPartnersAcl.canUseArchive({ officeId } )); - return BusinessPartnersApi.archive(officeId, id, config) + return BusinessPartnersApi.archive(officeId, id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -252,14 +252,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id }) => { checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId } )); - return BusinessPartnersApi.unarchive(officeId, id, config) + return BusinessPartnersApi.unarchive(officeId, id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -279,14 +279,14 @@ export const useUnarchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useLock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useLock = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id }) => { checkAcl(BusinessPartnersAcl.canUseLock({ officeId } )); - return BusinessPartnersApi.lock(officeId, id, config) + return BusinessPartnersApi.lock(officeId, id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -306,14 +306,14 @@ export const useLock = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnlock = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id }) => { checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId } )); - return BusinessPartnersApi.unlock(officeId, id, config) + return BusinessPartnersApi.unlock(officeId, id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -333,14 +333,14 @@ export const useUnlock = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetRemarks = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetRemarks = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getRemarks(officeId, id), queryFn: () => { checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId } )); - return BusinessPartnersApi.getRemarks(officeId, id, config) }, + return BusinessPartnersApi.getRemarks(officeId, id) }, ...options, }); }; @@ -356,14 +356,14 @@ export const useGetRemarks = ({ officeId, id }: { officeId: string, id: s * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id, data }) => { checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId } )); - return BusinessPartnersApi.createRemark(officeId, id, data, config) + return BusinessPartnersApi.createRemark(officeId, id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -384,14 +384,14 @@ export const useCreateRemark = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdateRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id, remarkId, data }) => { checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId } )); - return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data, config) + return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -412,14 +412,14 @@ export const useUpdateRemark = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useDeleteRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id, remarkId }) => { checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId } )); - return BusinessPartnersApi.deleteRemark(officeId, id, remarkId, config) + return BusinessPartnersApi.deleteRemark(officeId, id, remarkId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -439,14 +439,14 @@ export const useDeleteRemark = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetBasicInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetBasicInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getBasicInfo(officeId, id), queryFn: () => { checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId } )); - return BusinessPartnersApi.getBasicInfo(officeId, id, config) }, + return BusinessPartnersApi.getBasicInfo(officeId, id) }, ...options, }); }; @@ -462,14 +462,14 @@ export const useGetBasicInfo = ({ officeId, id }: { officeId: string, id: * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateBasicInfo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateBasicInfo = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id, data }) => { checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId } )); - return BusinessPartnersApi.updateBasicInfo(officeId, id, data, config) + return BusinessPartnersApi.updateBasicInfo(officeId, id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -493,14 +493,14 @@ export const useUpdateBasicInfo = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useCreateSignatureUploadInstructions = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateSignatureUploadInstructions = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId } )); - const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions(officeId, id, data, config); + const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions(officeId, id, data); if (file && uploadInstructions.url) { const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; @@ -545,14 +545,14 @@ export const useCreateSignatureUploadInstructions = (options?: AppMutationOption * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetCargoAgentInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCargoAgentInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getCargoAgentInfo(officeId, id), queryFn: () => { checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId } )); - return BusinessPartnersApi.getCargoAgentInfo(officeId, id, config) }, + return BusinessPartnersApi.getCargoAgentInfo(officeId, id) }, ...options, }); }; @@ -568,14 +568,14 @@ export const useGetCargoAgentInfo = ({ officeId, id }: { officeId: string * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateCargoAgent = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateCargoAgent = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id, data }) => { checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId } )); - return BusinessPartnersApi.updateCargoAgent(officeId, id, data, config) + return BusinessPartnersApi.updateCargoAgent(officeId, id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -597,14 +597,14 @@ export const useUpdateCargoAgent = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetCarrierInformation = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCarrierInformation = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getCarrierInformation(officeId, id), queryFn: () => { checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId } )); - return BusinessPartnersApi.getCarrierInformation(officeId, id, config) }, + return BusinessPartnersApi.getCarrierInformation(officeId, id) }, ...options, }); }; @@ -620,14 +620,14 @@ export const useGetCarrierInformation = ({ officeId, id }: { officeId: st * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateCarrier = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateCarrier = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id, data }) => { checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId } )); - return BusinessPartnersApi.updateCarrier(officeId, id, data, config) + return BusinessPartnersApi.updateCarrier(officeId, id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/cargoTypes/cargoTypes.api.ts b/test/generated/next/cargoTypes/cargoTypes.api.ts index 5f6ca5c..48493ea 100644 --- a/test/generated/next/cargoTypes/cargoTypes.api.ts +++ b/test/generated/next/cargoTypes/cargoTypes.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CargoTypesModels } from "./cargoTypes.models"; export namespace CargoTypesApi { -export const paginate = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, `/cargo-types`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, ) => { return AppRestClient.post( { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, `/cargo-types`, ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), - config + ) }; -export const paginateLabels = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, `/cargo-types/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, `/cargo-types/${id}`, - config + ) }; -export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, ) => { return AppRestClient.patch( { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, `/cargo-types/${id}`, ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.post( { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, `/cargo-types/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.post( { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, `/cargo-types/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/cargoTypes/cargoTypes.models.ts b/test/generated/next/cargoTypes/cargoTypes.models.ts index 93eed88..660798b 100644 --- a/test/generated/next/cargoTypes/cargoTypes.models.ts +++ b/test/generated/next/cargoTypes/cargoTypes.models.ts @@ -8,7 +8,7 @@ export namespace CargoTypesModels { * @property { string } id * @property { string } name */ -export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type CargoTypeEmployeeDTO = z.infer; /** @@ -33,7 +33,7 @@ export type CargoTypeEmployeeDTO = z.infer; * @property { CargoTypeEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const CargoTypeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the cargo type"), name: z.string().describe("Name of the cargo type"), shortName: z.string().describe("Short name of the cargo type").nullish(), length: z.number().describe("Length of the cargo type").nullish(), width: z.number().describe("Width of the cargo type").nullish(), height: z.number().describe("Height of the cargo type").nullish(), unit: z.string().describe("Measurement unit for dimensions"), emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), containerIsoCode: z.string().describe("Container ISO code").nullish(), isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly().describe("Transport modules applicable to the cargo type"), archived: z.boolean().describe("Indicates if the cargo type is archived"), createdById: z.string().nullish(), createdBy: CargoTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CargoTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const CargoTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), shortName: z.string().nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), unit: z.string(), emptyWeight: z.number().nullish(), containerIsoCode: z.string().nullish(), isContainer: z.boolean().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), archived: z.boolean(), createdById: z.string().nullish(), createdBy: CargoTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CargoTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type CargoTypeResponseDTO = z.infer; /** @@ -51,7 +51,7 @@ export const TransportModuleEnum = TransportModuleEnumSchema.enum; * @property { boolean } archived Archived status filter * @property { string } search */ -export const CargoTypePaginationFilterDtoSchema = z.object({ module: TransportModuleEnumSchema, archived: z.boolean().describe("Archived status filter"), search: z.string() }).readonly(); +export const CargoTypePaginationFilterDtoSchema = z.object({ module: TransportModuleEnumSchema.nullable(), archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); export type CargoTypePaginationFilterDto = z.infer; /** @@ -68,7 +68,7 @@ export type CargoTypePaginationFilterDto = z.infer; /** @@ -85,7 +85,7 @@ export type CreateCargoTypeRequestDTO = z.infer; /** @@ -93,7 +93,7 @@ export type UpdateCargoTypeRequestDTO = z.infer; /** @@ -114,7 +114,7 @@ export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnum * @property { number } totalItems Total available items * @property { CargoTypeResponseDTO[] } items */ -export const CargoTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CargoTypeResponseDTOSchema).readonly() }).readonly().shape }); +export const CargoTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CargoTypeResponseDTOSchema).nullable() }).partial().shape }); export type CargoTypesPaginateResponse = z.infer; /** @@ -135,7 +135,7 @@ export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOr * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const CargoTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const CargoTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type CargoTypesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/cargoTypes/cargoTypes.queries.ts b/test/generated/next/cargoTypes/cargoTypes.queries.ts index 71cd268..f0d98ae 100644 --- a/test/generated/next/cargoTypes/cargoTypes.queries.ts +++ b/test/generated/next/cargoTypes/cargoTypes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, page, cursor, config) }, + return CargoTypesApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -58,14 +57,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -84,14 +83,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(CargoTypesAcl.canUseCreate()); - return CargoTypesApi.create(data, config) + return CargoTypesApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -114,14 +113,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -139,14 +138,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -165,14 +164,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(CargoTypesAcl.canUseFindById()); - return CargoTypesApi.findById(id, config) }, + return CargoTypesApi.findById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(CargoTypesAcl.canUseUpdate()); - return CargoTypesApi.update(id, data, config) + return CargoTypesApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(CargoTypesAcl.canUseArchive()); - return CargoTypesApi.archive(id, config) + return CargoTypesApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -243,14 +242,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(CargoTypesAcl.canUseUnarchive()); - return CargoTypesApi.unarchive(id, config) + return CargoTypesApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/chargeTypes/chargeTypes.api.ts b/test/generated/next/chargeTypes/chargeTypes.api.ts index b2876a9..acbab42 100644 --- a/test/generated/next/chargeTypes/chargeTypes.api.ts +++ b/test/generated/next/chargeTypes/chargeTypes.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ChargeTypesModels } from "./chargeTypes.models"; export namespace ChargeTypesApi { -export const findAll = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const findAll = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, `/charge-types/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginate = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, `/charge-types`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, ) => { return AppRestClient.post( { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, `/charge-types`, ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), - config + ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, `/charge-types/${id}`, - config + ) }; -export const update = (id: string, data: ChargeTypesModels.UpdateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: ChargeTypesModels.UpdateChargeTypeRequestDTO, ) => { return AppRestClient.patch( { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, `/charge-types/${id}`, ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.post( { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, `/charge-types/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.post( { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, `/charge-types/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/chargeTypes/chargeTypes.models.ts b/test/generated/next/chargeTypes/chargeTypes.models.ts index 53f5489..2175f9b 100644 --- a/test/generated/next/chargeTypes/chargeTypes.models.ts +++ b/test/generated/next/chargeTypes/chargeTypes.models.ts @@ -9,7 +9,7 @@ export namespace ChargeTypesModels { * @property { CommonModels.TransportModeEnum[] } transportModes * @property { string } search */ -export const ChargeTypeLabelFilterDtoSchema = z.object({ direction: CommonModels.DirectionEnumSchema, transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), search: z.string() }).readonly(); +export const ChargeTypeLabelFilterDtoSchema = z.object({ direction: CommonModels.DirectionEnumSchema.nullable(), transportModes: z.array(CommonModels.TransportModeEnumSchema).nullable(), search: z.string().nullable() }).partial(); export type ChargeTypeLabelFilterDto = z.infer; /** @@ -18,7 +18,7 @@ export type ChargeTypeLabelFilterDto = z.infer; /** @@ -27,7 +27,7 @@ export type ChargeTypeTranslationDto = z.infer; /** @@ -48,7 +48,7 @@ export type ChargeTypeEmployeeDTO = z.infer; * @property { ChargeTypeEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const ChargeTypeResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), directions: z.array(CommonModels.DirectionEnumSchema).readonly(), translations: z.array(ChargeTypeTranslationDtoSchema).readonly(), createdById: z.string().nullish(), createdBy: ChargeTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const ChargeTypeResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), directions: z.array(CommonModels.DirectionEnumSchema), translations: z.array(ChargeTypeTranslationDtoSchema), createdById: z.string().nullish(), createdBy: ChargeTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type ChargeTypeResponseDTO = z.infer; /** @@ -60,7 +60,7 @@ export type ChargeTypeResponseDTO = z.infer; * @property { CommonModels.DirectionEnum } direction * @property { CommonModels.TransportModeEnum[] } transportModes */ -export const ChargeTypePaginationFilterDtoSchema = z.object({ name: z.string(), search: z.string(), archived: z.boolean(), direction: CommonModels.DirectionEnumSchema, transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly() }).readonly(); +export const ChargeTypePaginationFilterDtoSchema = z.object({ name: z.string().nullable(), search: z.string().nullable(), archived: z.boolean().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), transportModes: z.array(CommonModels.TransportModeEnumSchema).nullable() }).partial(); export type ChargeTypePaginationFilterDto = z.infer; /** @@ -69,7 +69,7 @@ export type ChargeTypePaginationFilterDto = z.infer; /** @@ -83,7 +83,7 @@ export type CreateChargeTypeTranslationDto = z.infer; /** @@ -92,7 +92,7 @@ export type CreateChargeTypeRequestDTO = z.infer; /** @@ -106,7 +106,7 @@ export type UpdateChargeTypeTranslationDto = z.infer; /** @@ -127,7 +127,7 @@ export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnum * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const ChargeTypesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const ChargeTypesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type ChargeTypesFindAllResponse = z.infer; /** @@ -148,7 +148,7 @@ export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEn * @property { number } totalItems Total available items * @property { ChargeTypeResponseDTO[] } items */ -export const ChargeTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).readonly() }).readonly().shape }); +export const ChargeTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).nullable() }).partial().shape }); export type ChargeTypesPaginateResponse = z.infer; } diff --git a/test/generated/next/chargeTypes/chargeTypes.queries.ts b/test/generated/next/chargeTypes/chargeTypes.queries.ts index a91c683..93f7fcb 100644 --- a/test/generated/next/chargeTypes/chargeTypes.queries.ts +++ b/test/generated/next/chargeTypes/chargeTypes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findAll(limit, order, filter, page, cursor), queryFn: () => { checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, page, cursor, config) }, + return ChargeTypesApi.findAll(limit, order, filter, page, cursor) }, ...options, }); }; @@ -58,14 +57,14 @@ export const useFindAll = ({ limit, order, filter, page, cursor }: { limi * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.findAllInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor, config) }, + return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -88,14 +87,14 @@ export const useFindAllInfinite = ({ limit, order, filter, cursor }: { li * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, page, cursor, config) }, + return ChargeTypesApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -113,14 +112,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -139,14 +138,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(ChargeTypesAcl.canUseCreate()); - return ChargeTypesApi.create(data, config) + return ChargeTypesApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -165,14 +164,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(ChargeTypesAcl.canUseFindById()); - return ChargeTypesApi.findById(id, config) }, + return ChargeTypesApi.findById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(ChargeTypesAcl.canUseUpdate()); - return ChargeTypesApi.update(id, data, config) + return ChargeTypesApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(ChargeTypesAcl.canUseArchive()); - return ChargeTypesApi.archive(id, config) + return ChargeTypesApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -243,14 +242,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(ChargeTypesAcl.canUseUnarchive()); - return ChargeTypesApi.unarchive(id, config) + return ChargeTypesApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/checklistItems/checklistItems.api.ts b/test/generated/next/checklistItems/checklistItems.api.ts index 36508b8..83ffdbe 100644 --- a/test/generated/next/checklistItems/checklistItems.api.ts +++ b/test/generated/next/checklistItems/checklistItems.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ChecklistItemsModels } from "./checklistItems.models"; export namespace ChecklistItemsApi { -export const create = (officeId: string, data: ChecklistItemsModels.CreateChecklistItemRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: ChecklistItemsModels.CreateChecklistItemRequestDTO, ) => { return AppRestClient.post( { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, `/offices/${officeId}/checklist-items`, ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), - config + ) }; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, `/offices/${officeId}/checklist-items`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, `/offices/${officeId}/checklist-items/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, `/offices/${officeId}/checklist-items/${id}`, - config + ) }; -export const update = (id: string, officeId: string, data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, officeId: string, data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, ) => { return AppRestClient.patch( { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, `/offices/${officeId}/checklist-items/${id}`, ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/checklist-items/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/checklist-items/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/checklistItems/checklistItems.models.ts b/test/generated/next/checklistItems/checklistItems.models.ts index 5d31cea..a5191f9 100644 --- a/test/generated/next/checklistItems/checklistItems.models.ts +++ b/test/generated/next/checklistItems/checklistItems.models.ts @@ -8,7 +8,7 @@ export namespace ChecklistItemsModels { * @property { string } id * @property { string } name */ -export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type ChecklistItemEmployeeDTO = z.infer; /** @@ -26,7 +26,7 @@ export type ChecklistItemEmployeeDTO = z.infer; /** @@ -34,7 +34,7 @@ export type ChecklistItemResponseDTO = z.infer; /** @@ -42,7 +42,7 @@ export type CreateChecklistItemRequestDTO = z.infer; /** @@ -51,7 +51,7 @@ export type ChecklistItemLabelFilterDto = z.infer; /** @@ -59,7 +59,7 @@ export type ChecklistItemFilterDto = z.infer; /** @@ -80,7 +80,7 @@ export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderP * @property { number } totalItems Total available items * @property { ChecklistItemResponseDTO[] } items */ -export const ChecklistItemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).readonly() }).readonly().shape }); +export const ChecklistItemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).nullable() }).partial().shape }); export type ChecklistItemsPaginateResponse = z.infer; /** @@ -101,7 +101,7 @@ export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginate * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type ChecklistItemsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/checklistItems/checklistItems.queries.ts b/test/generated/next/checklistItems/checklistItems.queries.ts index 4ec35c8..17b4403 100644 --- a/test/generated/next/checklistItems/checklistItems.queries.ts +++ b/test/generated/next/checklistItems/checklistItems.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -30,14 +29,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(ChecklistItemsAcl.canUseCreate({ officeId } )); - return ChecklistItemsApi.create(officeId, data, config) + return ChecklistItemsApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -61,14 +60,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -87,14 +86,14 @@ export const usePaginate = ({ officeId, limit, order, filter, page, curso * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -118,14 +117,14 @@ export const usePaginateInfinite = ({ officeId, limit, order, filter, cur * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -144,14 +143,14 @@ export const usePaginateLabels = ({ officeId, limit, order, filter, page, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -171,14 +170,14 @@ export const usePaginateLabelsInfinite = ({ officeId, limit, order, filte * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id, officeId), queryFn: () => { checkAcl(ChecklistItemsAcl.canUseFindById({ officeId } )); - return ChecklistItemsApi.findById(id, officeId, config) }, + return ChecklistItemsApi.findById(id, officeId) }, ...options, }); }; @@ -194,14 +193,14 @@ export const useFindById = ({ id, officeId }: { id: string, officeId: str * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId, data }) => { checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId } )); - return ChecklistItemsApi.update(id, officeId, data, config) + return ChecklistItemsApi.update(id, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -223,14 +222,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(ChecklistItemsAcl.canUseArchive({ officeId } )); - return ChecklistItemsApi.archive(id, officeId, config) + return ChecklistItemsApi.archive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -250,14 +249,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId } )); - return ChecklistItemsApi.unarchive(id, officeId, config) + return ChecklistItemsApi.unarchive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/checklistTemplates/checklistTemplates.api.ts b/test/generated/next/checklistTemplates/checklistTemplates.api.ts index e0b177b..45c958a 100644 --- a/test/generated/next/checklistTemplates/checklistTemplates.api.ts +++ b/test/generated/next/checklistTemplates/checklistTemplates.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ChecklistTemplatesModels } from "./checklistTemplates.models"; export namespace ChecklistTemplatesApi { -export const create = (officeId: string, data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, ) => { return AppRestClient.post( { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, `/offices/${officeId}/checklist-templates`, ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), - config + ) }; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, `/offices/${officeId}/checklist-templates`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, `/offices/${officeId}/checklist-templates/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, `/offices/${officeId}/checklist-templates/${id}`, - config + ) }; -export const update = (id: string, officeId: string, data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, officeId: string, data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, ) => { return AppRestClient.put( { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, `/offices/${officeId}/checklist-templates/${id}`, ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/checklist-templates/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/checklist-templates/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/checklistTemplates/checklistTemplates.models.ts b/test/generated/next/checklistTemplates/checklistTemplates.models.ts index 3c0da4d..a26204c 100644 --- a/test/generated/next/checklistTemplates/checklistTemplates.models.ts +++ b/test/generated/next/checklistTemplates/checklistTemplates.models.ts @@ -8,7 +8,7 @@ export namespace ChecklistTemplatesModels { * @property { string } id * @property { string } name */ -export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type ChecklistTemplateEmployeeDTO = z.infer; /** @@ -18,7 +18,7 @@ export type ChecklistTemplateEmployeeDTO = z.infer; /** @@ -37,7 +37,7 @@ export type ChecklistTemplateItemResponseDTO = z.infer; /** @@ -45,7 +45,7 @@ export type ChecklistTemplateResponseDTO = z.infer; /** @@ -53,7 +53,7 @@ export type CreateChecklistTemplateRequestDTO = z.infer; /** @@ -62,7 +62,7 @@ export type ChecklistTemplateLabelFilterDto = z.infer; /** @@ -71,7 +71,7 @@ export type ChecklistTemplateFilterDto = z.infer; /** @@ -92,7 +92,7 @@ export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPagina * @property { number } totalItems Total available items * @property { ChecklistTemplateResponseDTO[] } items */ -export const ChecklistTemplatesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).readonly() }).readonly().shape }); +export const ChecklistTemplatesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).nullable() }).partial().shape }); export type ChecklistTemplatesPaginateResponse = z.infer; /** @@ -113,7 +113,7 @@ export const ChecklistTemplatesPaginateLabelsOrderParamEnum = ChecklistTemplates * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type ChecklistTemplatesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/checklistTemplates/checklistTemplates.queries.ts b/test/generated/next/checklistTemplates/checklistTemplates.queries.ts index bbbf515..00d431f 100644 --- a/test/generated/next/checklistTemplates/checklistTemplates.queries.ts +++ b/test/generated/next/checklistTemplates/checklistTemplates.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -30,14 +29,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId } )); - return ChecklistTemplatesApi.create(officeId, data, config) + return ChecklistTemplatesApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -61,14 +60,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -87,14 +86,14 @@ export const usePaginate = ({ officeId, limit, order, filter, page, curso * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -118,14 +117,14 @@ export const usePaginateInfinite = ({ officeId, limit, order, filter, cur * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -144,14 +143,14 @@ export const usePaginateLabels = ({ officeId, limit, order, filter, page, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -171,14 +170,14 @@ export const usePaginateLabelsInfinite = ({ officeId, limit, order, filte * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id, officeId), queryFn: () => { checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId } )); - return ChecklistTemplatesApi.findById(id, officeId, config) }, + return ChecklistTemplatesApi.findById(id, officeId) }, ...options, }); }; @@ -194,14 +193,14 @@ export const useFindById = ({ id, officeId }: { id: string, officeId: str * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId, data }) => { checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId } )); - return ChecklistTemplatesApi.update(id, officeId, data, config) + return ChecklistTemplatesApi.update(id, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -223,14 +222,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId } )); - return ChecklistTemplatesApi.archive(id, officeId, config) + return ChecklistTemplatesApi.archive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -250,14 +249,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId } )); - return ChecklistTemplatesApi.unarchive(id, officeId, config) + return ChecklistTemplatesApi.unarchive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/cities/cities.api.ts b/test/generated/next/cities/cities.api.ts index 17b6f45..af80ea7 100644 --- a/test/generated/next/cities/cities.api.ts +++ b/test/generated/next/cities/cities.api.ts @@ -1,86 +1,81 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CitiesModels } from "./cities.models"; export namespace CitiesApi { -export const paginate = (limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: CitiesModels.CitiesPaginateResponseSchema }, `/cities`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: CitiesModels.CreateCityRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: CitiesModels.CreateCityRequestDTO, ) => { return AppRestClient.post( { resSchema: CitiesModels.CityResponseDTOSchema }, `/cities`, ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), - config + ) }; -export const listCityLabels = (limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const listCityLabels = (limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: CitiesModels.ListCityLabelsResponseSchema }, `/cities/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const getCityLabelById = (id: string, config?: AxiosRequestConfig) => { +export const getCityLabelById = (id: string, ) => { return AppRestClient.get( { resSchema: CitiesModels.CityLabelResponseDTOSchema }, `/cities/${id}/labels`, - config + ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: CitiesModels.CityResponseDTOSchema }, `/cities/${id}`, - config + ) }; -export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, ) => { return AppRestClient.patch( { resSchema: CitiesModels.CityResponseDTOSchema }, `/cities/${id}`, ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/cities/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/cities/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/cities/cities.models.ts b/test/generated/next/cities/cities.models.ts index 8b422a7..4fbb83e 100644 --- a/test/generated/next/cities/cities.models.ts +++ b/test/generated/next/cities/cities.models.ts @@ -10,7 +10,7 @@ export namespace CitiesModels { * @property { string } isoCode2 2 character iso code of the country * @property { string } isoCode3 3 character iso code of the country */ -export const CityCountryDtoSchema = z.object({ id: z.string().describe("Unique identifier of the country"), name: z.string().describe("Name of the country"), isoCode2: z.string().describe("2 character iso code of the country"), isoCode3: z.string().describe("3 character iso code of the country") }).readonly(); +export const CityCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); export type CityCountryDto = z.infer; /** @@ -19,7 +19,7 @@ export type CityCountryDto = z.infer; * @property { string } id * @property { string } name */ -export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type CityEmployeeDTO = z.infer; /** @@ -39,7 +39,7 @@ export type CityEmployeeDTO = z.infer; * @property { CityEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const CityResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the city"), name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city").nullish(), stateCode: z.string().describe("State code of the city").nullish(), archived: z.boolean().describe("Whether the city is archived").nullish(), countryId: z.string().describe("Country ID").nullish(), country: CityCountryDtoSchema.nullish(), createdById: z.string().nullish(), createdBy: CityEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CityEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const CityResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isoCode: z.string().nullish(), stateCode: z.string().nullish(), archived: z.boolean().nullish(), countryId: z.string().nullish(), country: CityCountryDtoSchema.nullish(), createdById: z.string().nullish(), createdBy: CityEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CityEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type CityResponseDTO = z.infer; /** @@ -48,7 +48,7 @@ export type CityResponseDTO = z.infer; * @property { string } id * @property { string } name */ -export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); export type CityLabelCountryDto = z.infer; /** @@ -58,7 +58,7 @@ export type CityLabelCountryDto = z.infer; * @property { string } label * @property { CityLabelCountryDto } country */ -export const CityLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }).readonly(); +export const CityLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }); export type CityLabelResponseDTO = z.infer; /** @@ -67,7 +67,7 @@ export type CityLabelResponseDTO = z.infer; * @property { string } search Free search * @property { boolean } archived */ -export const CityPaginationFilterDtoSchema = z.object({ search: z.string().describe("Free search"), archived: z.boolean() }).readonly(); +export const CityPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); export type CityPaginationFilterDto = z.infer; /** @@ -75,7 +75,7 @@ export type CityPaginationFilterDto = z.infer; /** @@ -86,7 +86,7 @@ export type CityLabelFilterDto = z.infer; * @property { string } stateCode State code of the city * @property { string } countryId Country ID */ -export const CreateCityRequestDTOSchema = z.object({ name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city").nullish(), stateCode: z.string().describe("State code of the city").nullish(), countryId: z.string().describe("Country ID") }).readonly(); +export const CreateCityRequestDTOSchema = z.object({ name: z.string(), isoCode: z.string().nullish(), stateCode: z.string().nullish(), countryId: z.string() }); export type CreateCityRequestDTO = z.infer; /** @@ -97,7 +97,7 @@ export type CreateCityRequestDTO = z.infer; * @property { string } stateCode State code of the city * @property { string } countryId Country ID */ -export const UpdateCityRequestDTOSchema = z.object({ name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city"), stateCode: z.string().describe("State code of the city"), countryId: z.string().describe("Country ID") }).readonly(); +export const UpdateCityRequestDTOSchema = z.object({ name: z.string().nullable(), isoCode: z.string().nullable(), stateCode: z.string().nullable(), countryId: z.string().nullable() }).partial(); export type UpdateCityRequestDTO = z.infer; /** @@ -118,7 +118,7 @@ export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.e * @property { number } totalItems Total available items * @property { CityResponseDTO[] } items */ -export const CitiesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityResponseDTOSchema).readonly() }).readonly().shape }); +export const CitiesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityResponseDTOSchema).nullable() }).partial().shape }); export type CitiesPaginateResponse = z.infer; /** @@ -139,7 +139,7 @@ export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.e * @property { number } totalItems Total available items * @property { CityLabelResponseDTO[] } items */ -export const ListCityLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityLabelResponseDTOSchema).readonly() }).readonly().shape }); +export const ListCityLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityLabelResponseDTOSchema).nullable() }).partial().shape }); export type ListCityLabelsResponse = z.infer; } diff --git a/test/generated/next/cities/cities.queries.ts b/test/generated/next/cities/cities.queries.ts index 4ed9739..a8b951b 100644 --- a/test/generated/next/cities/cities.queries.ts +++ b/test/generated/next/cities/cities.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -34,14 +33,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, page, cursor, config) }, + return CitiesApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -59,14 +58,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return CitiesApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -85,14 +84,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(CitiesAcl.canUseCreate()); - return CitiesApi.create(data, config) + return CitiesApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -115,14 +114,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useListCityLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListCityLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listCityLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, page, cursor, config) }, + return CitiesApi.listCityLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -140,14 +139,14 @@ export const useListCityLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListCityLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListCityLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor, config) }, + return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -166,14 +165,14 @@ export const useListCityLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetCityLabelById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCityLabelById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getCityLabelById(id), queryFn: () => { checkAcl(CitiesAcl.canUseGetCityLabelById()); - return CitiesApi.getCityLabelById(id, config) }, + return CitiesApi.getCityLabelById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useGetCityLabelById = ({ id }: { id: string }, options?: App * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(CitiesAcl.canUseFindById()); - return CitiesApi.findById(id, config) }, + return CitiesApi.findById(id) }, ...options, }); }; @@ -209,14 +208,14 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(CitiesAcl.canUseUpdate()); - return CitiesApi.update(id, data, config) + return CitiesApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -237,14 +236,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(CitiesAcl.canUseArchive()); - return CitiesApi.archive(id, config) + return CitiesApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -263,14 +262,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(CitiesAcl.canUseUnarchive()); - return CitiesApi.unarchive(id, config) + return CitiesApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/common/common.models.ts b/test/generated/next/common/common.models.ts index 93928b8..285ef85 100644 --- a/test/generated/next/common/common.models.ts +++ b/test/generated/next/common/common.models.ts @@ -72,7 +72,7 @@ export const OfficePaymentTermsDateType = OfficePaymentTermsDateTypeSchema.enum; * @property { string } id * @property { string } name */ -export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type FolderEmployeeDTO = z.infer; /** @@ -88,7 +88,7 @@ export type FolderEmployeeDTO = z.infer; * @property { FolderEmployeeDTO } updatedBy * @property { string } downloadUrl */ -export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }).readonly(); +export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }); export type FileResponseDTO = z.infer; /** @@ -98,7 +98,7 @@ export type FileResponseDTO = z.infer; * @property { object } json * @property { any } json.[key] */ -export const EditorContentUpdateDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export const EditorContentUpdateDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); export type EditorContentUpdateDto = z.infer; /** @@ -109,7 +109,7 @@ export type EditorContentUpdateDto = z.infer; /** @@ -120,7 +120,7 @@ export type RemarkBlockDTO = z.infer; * @property { boolean } includePositionNumber * @property { boolean } allowManualOverride */ -export const TitleBlockDTOSchema = z.object({ enabled: z.boolean(), defaultTitle: z.string(), includePositionNumber: z.boolean(), allowManualOverride: z.boolean() }).readonly(); +export const TitleBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), defaultTitle: z.string().nullable(), includePositionNumber: z.boolean().nullable(), allowManualOverride: z.boolean().nullable() }).partial(); export type TitleBlockDTO = z.infer; /** @@ -137,7 +137,7 @@ export const PositionInvolvedPartyTypeEnum = PositionInvolvedPartyTypeEnumSchema * @property { boolean } enabled * @property { string } defaultRole */ -export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema }).readonly(); +export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema.nullable() }).partial(); export type ReceiverBlockDTO = z.infer; /** @@ -152,7 +152,7 @@ export type ReceiverBlockDTO = z.infer; * @property { boolean } showMasterBillOfLadingNumber * @property { boolean } showHouseBillOfLadingNumber */ -export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean(), showName: z.boolean(), showPhone: z.boolean(), showDate: z.boolean(), showBookingNumber: z.boolean(), showCustomerReference: z.boolean(), showMasterBillOfLadingNumber: z.boolean(), showHouseBillOfLadingNumber: z.boolean() }).readonly(); +export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), showName: z.boolean().nullable(), showPhone: z.boolean().nullable(), showDate: z.boolean().nullable(), showBookingNumber: z.boolean().nullable(), showCustomerReference: z.boolean().nullable(), showMasterBillOfLadingNumber: z.boolean().nullable(), showHouseBillOfLadingNumber: z.boolean().nullable() }).partial(); export type OurInformationBlockDTO = z.infer; /** @@ -168,7 +168,7 @@ export type OurInformationBlockDTO = z.infer; /** @@ -177,7 +177,7 @@ export type RouteTableBlockDTO = z.infer; * @property { boolean } enabled * @property { number } position 1-based order in the rendered document. Minimum: `1` */ -export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable() }).partial(); export type CargoTableBlockDTO = z.infer; /** @@ -186,7 +186,7 @@ export type CargoTableBlockDTO = z.infer; * @property { boolean } enabled * @property { number } position 1-based order in the rendered document. Minimum: `1` */ -export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); +export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable() }).partial(); export type CargoSummaryBlockDTO = z.infer; /** @@ -211,7 +211,7 @@ export type CargoSummaryBlockDTO = z.infer; * @property { boolean } showSellRateExchangeRates * @property { boolean } showTotal */ -export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showOnlyForReceiver: z.boolean(), showVendor: z.boolean(), showBuyRate: z.boolean(), showCustomer: z.boolean(), showSellRate: z.boolean(), showGrid: z.boolean(), showCharges: z.boolean(), showAdditionalText: z.boolean(), showQuantity: z.boolean(), showProfit: z.boolean(), showTotalsByCurrency: z.boolean(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean(), showSellRateExchangeRates: z.boolean(), showTotal: z.boolean() }).readonly(); +export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), showOnlyForReceiver: z.boolean().nullable(), showVendor: z.boolean().nullable(), showBuyRate: z.boolean().nullable(), showCustomer: z.boolean().nullable(), showSellRate: z.boolean().nullable(), showGrid: z.boolean().nullable(), showCharges: z.boolean().nullable(), showAdditionalText: z.boolean().nullable(), showQuantity: z.boolean().nullable(), showProfit: z.boolean().nullable(), showTotalsByCurrency: z.boolean().nullable(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean().nullable(), showSellRateExchangeRates: z.boolean().nullable(), showTotal: z.boolean().nullable() }).partial(); export type FinanceTableBlockDTO = z.infer; /** @@ -219,7 +219,7 @@ export type FinanceTableBlockDTO = z.infer; * @type { object } * @property { boolean } enabled */ -export const FooterBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export const FooterBlockDTOSchema = z.object({ enabled: z.boolean().nullable() }).partial(); export type FooterBlockDTO = z.infer; /** @@ -227,7 +227,7 @@ export type FooterBlockDTO = z.infer; * @type { object } * @property { boolean } enabled */ -export const TermsBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); +export const TermsBlockDTOSchema = z.object({ enabled: z.boolean().nullable() }).partial(); export type TermsBlockDTO = z.infer; /** @@ -240,7 +240,7 @@ export type TermsBlockDTO = z.infer; * @property { boolean } customsAMS * @property { boolean } vgmCustomer */ -export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), billOfLadingFromCustomer: z.boolean(), billOfLadingToCarrier: z.boolean(), customsAMS: z.boolean(), vgmCustomer: z.boolean() }).readonly(); +export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), billOfLadingFromCustomer: z.boolean().nullable(), billOfLadingToCarrier: z.boolean().nullable(), customsAMS: z.boolean().nullable(), vgmCustomer: z.boolean().nullable() }).partial(); export type CutOffDatesBlockDTO = z.infer; /** @@ -258,7 +258,7 @@ export type CutOffDatesBlockDTO = z.infer; * @property { TermsBlockDTO } termsBlock * @property { CutOffDatesBlockDTO } cutOffDatesBlock */ -export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); +export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema.nullable(), receiverBlock: CommonModels.ReceiverBlockDTOSchema.nullable(), ourInformationBlock: CommonModels.OurInformationBlockDTOSchema.nullable(), routeTableBlock: CommonModels.RouteTableBlockDTOSchema.nullable(), cargoTableBlock: CommonModels.CargoTableBlockDTOSchema.nullable(), cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema.nullable(), financeTableBlock: CommonModels.FinanceTableBlockDTOSchema.nullable(), remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).nullable(), footerBlock: CommonModels.FooterBlockDTOSchema.nullable(), termsBlock: CommonModels.TermsBlockDTOSchema.nullable(), cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema.nullable() }).partial(); export type TemplateBlocksResponseDTO = z.infer; /** @@ -267,7 +267,7 @@ export type TemplateBlocksResponseDTO = z.infer; /** @@ -285,7 +285,7 @@ export type RouteTableProviderDto = z.infer; * @property { string } voyage Voyage information * @property { string } carrier Carrier name */ -export const RouteTablePointDtoSchema = z.object({ id: z.string().describe("Route point ID"), type: z.string().describe("Route point type"), datetime: z.string().describe("Route point datetime").nullish(), secondaryDatetime: z.string().describe("Route point secondary datetime").nullish(), address: z.string().describe("Route point address").nullish(), name: z.string().describe("Route point address name").nullish(), reference: z.string().describe("Route point reference").nullish(), provider: CommonModels.RouteTableProviderDtoSchema.describe("Route point provider").nullish(), vessel: z.string().describe("Vessel information").nullish(), voyage: z.string().describe("Voyage information").nullish(), carrier: z.string().describe("Carrier name").nullish() }).readonly(); +export const RouteTablePointDtoSchema = z.object({ id: z.string(), type: z.string(), datetime: z.string().nullish(), secondaryDatetime: z.string().nullish(), address: z.string().nullish(), name: z.string().nullish(), reference: z.string().nullish(), provider: CommonModels.RouteTableProviderDtoSchema.nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), carrier: z.string().nullish() }); export type RouteTablePointDto = z.infer; /** @@ -304,7 +304,7 @@ export type RouteTablePointDto = z.infer; * @property { boolean } showGrid Show grid * @property { boolean } suppressRoute Suppress route */ -export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID").nullish(), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish(), showAddress: z.boolean().describe("Show address").nullish(), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); +export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().nullish(), selectedRoutePointIds: z.array(z.string()), showReference: z.boolean(), showVesselVoyage: z.boolean(), showProvider: z.boolean(), points: z.array(CommonModels.RouteTablePointDtoSchema).nullish(), showAddress: z.boolean().nullish(), showDates: z.boolean(), showType: z.boolean(), showLocation: z.boolean(), showGrid: z.boolean(), suppressRoute: z.boolean() }); export type RouteTableBlockResponseDto = z.infer; /** @@ -316,7 +316,7 @@ export type RouteTableBlockResponseDto = z.infer; /** @@ -337,7 +337,7 @@ export type CargoSpecialtyDto = z.infer; * @property { number } chargeableWeight Chargeable weight in kg * @property { number } volumetricWeight Volumetric weight in kg */ -export const CargoPackageDtoSchema = z.object({ id: z.string().describe("Package ID"), description: z.string().describe("Package description").nullish(), weight: z.string().describe("Weight").nullish(), hsCodes: z.string().describe("HS codes (numeric only)").nullish(), quantity: z.number().describe("Quantity").nullish(), width: z.number().describe("Width (cm)").nullish(), length: z.number().describe("Length (cm)").nullish(), height: z.number().describe("Height (cm)").nullish(), volume: z.number().describe("Total volume in m3 for this package group").nullish(), packageType: z.string().describe("Package type name").nullish(), caseMarks: z.string().describe("Case marks").nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).readonly().describe("Package specialties").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg").nullish() }).readonly(); +export const CargoPackageDtoSchema = z.object({ id: z.string(), description: z.string().nullish(), weight: z.string().nullish(), hsCodes: z.string().nullish(), quantity: z.number().nullish(), width: z.number().nullish(), length: z.number().nullish(), height: z.number().nullish(), volume: z.number().nullish(), packageType: z.string().nullish(), caseMarks: z.string().nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).nullish(), chargeableWeight: z.number().nullish(), volumetricWeight: z.number().nullish() }); export type CargoPackageDto = z.infer; /** @@ -346,7 +346,7 @@ export type CargoPackageDto = z.infer; * @property { string[] } selectedRoutePointIds Selected route point IDs * @property { RouteTablePointDto[] } points Route points */ -export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish() }).readonly(); +export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()), points: z.array(CommonModels.RouteTablePointDtoSchema).nullish() }); export type CargoItemRouteDto = z.infer; /** @@ -366,7 +366,7 @@ export type CargoItemRouteDto = z.infer; * @property { string[] } selectedPackageIds Selected cargo package IDs * @property { CargoItemRouteDto } route Cargo route (when routes are split) */ -export const CargoItemDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID"), cargoType: z.string().describe("Cargo type"), containerNumber: z.string().describe("Container number").nullish(), seal1: z.string().describe("First seal (sea cargo only)").nullish(), seal2: z.string().describe("Second seal (sea cargo only)").nullish(), vgm: z.string().describe("Verified gross mass (VGM) for container, sea cargo only").nullish(), totalGrossWeight: z.number().describe("Total gross weight from cargo details").nullish(), totalVolume: z.number().describe("Total volume (m3) calculated from cargo packages").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg for transport unit").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg for transport unit").nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema).readonly().describe("Cargo packages"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteDtoSchema.describe("Cargo route (when routes are split)").nullish() }).readonly(); +export const CargoItemDtoSchema = z.object({ cargoId: z.string(), cargoType: z.string(), containerNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), vgm: z.string().nullish(), totalGrossWeight: z.number().nullish(), totalVolume: z.number().nullish(), chargeableWeight: z.number().nullish(), volumetricWeight: z.number().nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema), selectedPackageIds: z.array(z.string()), route: CommonModels.CargoItemRouteDtoSchema.nullish() }); export type CargoItemDto = z.infer; /** @@ -399,7 +399,7 @@ export type CargoItemDto = z.infer; * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 * @property { CargoItemDto[] } items Cargo items */ -export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs").nullish(), suppressWeight: z.boolean().describe("Suppress weight column display").nullish(), showGrid: z.boolean().describe("Show grid borders in cargo table").nullish(), suppressVolume: z.boolean().describe("Suppress volume column display").nullish(), suppressSpecialities: z.boolean().describe("Suppress specialities column display").nullish(), suppressDimensions: z.boolean().describe("Suppress dimensions column display").nullish(), suppressPackageVolume: z.boolean().describe("Suppress package volume column display").nullish(), suppressPackageWeight: z.boolean().describe("Suppress package weight column display").nullish(), showGrandTotal: z.boolean().describe("Show grand total").nullish(), showTransportUnitTotal: z.boolean().describe("Show transport unit total").nullish(), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullish(), suppressCargo: z.boolean().describe("Suppress cargo table display").nullish(), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units").nullish(), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units").nullish(), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages").nullish(), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages").nullish(), showPackageHSCodes: z.boolean().describe("Show HS codes for packages").nullish(), showPackageType: z.boolean().describe("Show package type for packages").nullish(), showPackageQuantity: z.boolean().describe("Show quantity for packages").nullish(), showPackageDescription: z.boolean().describe("Show description for packages").nullish(), showPackageCaseMarks: z.boolean().describe("Show case marks for packages").nullish(), showTransportUnitNumber: z.boolean().describe("Show transport unit number").nullish(), showTransportUnitType: z.boolean().describe("Show transport unit type").nullish(), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1").nullish(), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2").nullish(), items: z.array(CommonModels.CargoItemDtoSchema).readonly().describe("Cargo items") }).readonly(); +export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).nullish(), suppressWeight: z.boolean().nullish(), showGrid: z.boolean().nullish(), suppressVolume: z.boolean().nullish(), suppressSpecialities: z.boolean().nullish(), suppressDimensions: z.boolean().nullish(), suppressPackageVolume: z.boolean().nullish(), suppressPackageWeight: z.boolean().nullish(), showGrandTotal: z.boolean().nullish(), showTransportUnitTotal: z.boolean().nullish(), showRoute: z.boolean().nullish(), suppressCargo: z.boolean().nullish(), showTransportUnitChargeableWeight: z.boolean().nullish(), showTransportUnitVolumetricWeight: z.boolean().nullish(), showPackageChargeableWeight: z.boolean().nullish(), showPackageVolumetricWeight: z.boolean().nullish(), showPackageHSCodes: z.boolean().nullish(), showPackageType: z.boolean().nullish(), showPackageQuantity: z.boolean().nullish(), showPackageDescription: z.boolean().nullish(), showPackageCaseMarks: z.boolean().nullish(), showTransportUnitNumber: z.boolean().nullish(), showTransportUnitType: z.boolean().nullish(), showTransportUnitSeal1: z.boolean().nullish(), showTransportUnitSeal2: z.boolean().nullish(), items: z.array(CommonModels.CargoItemDtoSchema) }); export type CargoTableBlockDto = z.infer; /** @@ -409,7 +409,7 @@ export type CargoTableBlockDto = z.infer; * @property { number } quantity Count of cargos for this type * @property { string } description Comma-joined transport unit numbers or custom description */ -export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), quantity: z.number().describe("Count of cargos for this type"), description: z.string().describe("Comma-joined transport unit numbers or custom description") }).readonly(); +export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string(), quantity: z.number(), description: z.string() }); export type SummaryCargoItemDto = z.infer; /** @@ -417,7 +417,7 @@ export type SummaryCargoItemDto = z.infer; * @type { object } * @property { SummaryCargoItemDto[] } items */ -export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema).readonly() }).readonly(); +export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema) }); export type SummaryCargoBlockResponseDto = z.infer; /** @@ -446,7 +446,7 @@ export const PositionAccountItemTypeEnum = PositionAccountItemTypeEnumSchema.enu * @property { number } buyExchangeRate Buy exchange rate * @property { number } quantity Quantity */ -export const FinanceRowDtoSchema = z.object({ id: z.string().describe("Finance row ID"), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), chargeType: z.string().describe("Charge type").nullish(), additionalText: z.string().describe("Additional text").nullish(), text: z.string().describe("Text content").nullish(), buyAmount: z.number().describe("Buy amount").nullish(), buyCurrencyNotation: z.string().describe("Buy currency notation").nullish(), sellAmount: z.number().describe("Sell amount").nullish(), sellCurrencyNotation: z.string().describe("Sell currency notation").nullish(), buyBPName: z.string().describe("Buy business partner name").nullish(), sellBPName: z.string().describe("Sell business partner name").nullish(), sellExchangeRate: z.number().describe("Sell exchange rate").nullish(), buyExchangeRate: z.number().describe("Buy exchange rate").nullish(), quantity: z.number().describe("Quantity").nullish() }).readonly(); +export const FinanceRowDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionAccountItemTypeEnumSchema, chargeType: z.string().nullish(), additionalText: z.string().nullish(), text: z.string().nullish(), buyAmount: z.number().nullish(), buyCurrencyNotation: z.string().nullish(), sellAmount: z.number().nullish(), sellCurrencyNotation: z.string().nullish(), buyBPName: z.string().nullish(), sellBPName: z.string().nullish(), sellExchangeRate: z.number().nullish(), buyExchangeRate: z.number().nullish(), quantity: z.number().nullish() }); export type FinanceRowDto = z.infer; /** @@ -457,7 +457,7 @@ export type FinanceRowDto = z.infer; * @property { number } combinedTotal Combined total * @property { string } currencyNotation Currency notation */ -export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().describe("Customer total"), vendorTotal: z.number().describe("Vendor total"), combinedTotal: z.number().describe("Combined total"), currencyNotation: z.string().describe("Currency notation") }).readonly(); +export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().nullable(), vendorTotal: z.number().nullable(), combinedTotal: z.number().nullable(), currencyNotation: z.string().nullable() }).partial(); export type FinanceTotalsDto = z.infer; /** @@ -467,7 +467,7 @@ export type FinanceTotalsDto = z.infer; * @property { number } vendorTotal Total for vendor side in this currency * @property { number } customerTotal Total for customer side in this currency */ -export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string().describe("Currency notation"), vendorTotal: z.number().describe("Total for vendor side in this currency").nullish(), customerTotal: z.number().describe("Total for customer side in this currency").nullish() }).readonly(); +export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string(), vendorTotal: z.number().nullish(), customerTotal: z.number().nullish() }); export type FinanceTotalsByCurrencyDto = z.infer; /** @@ -480,7 +480,7 @@ export type FinanceTotalsByCurrencyDto = z.infer; /** @@ -508,7 +508,7 @@ export type FinanceTablePositionDto = z.infer; /** @@ -519,7 +519,7 @@ export type FinanceTableBlockDto = z.infer; * @property { EditorContentUpdateDto } content * @property { boolean } enabled */ -export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }).readonly(); +export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }); export type RemarkBlockDto = z.infer; /** @@ -530,7 +530,7 @@ export type RemarkBlockDto = z.infer; * @property { boolean } showWatermarkOnDocuments Show watermark on documents * @property { LocaleEnum } locale */ -export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), showWatermarkOnDocuments: z.boolean().describe("Show watermark on documents"), locale: CommonModels.LocaleEnumSchema }).readonly(); +export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable(), showWatermarkOnDocuments: z.boolean().nullable(), locale: CommonModels.LocaleEnumSchema.nullable() }).partial(); export type ConfigBlockDto = z.infer; /** @@ -538,7 +538,7 @@ export type ConfigBlockDto = z.infer; * @type { object } * @property { string } value Title value */ -export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().describe("Title value") }).readonly(); +export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().nullable() }).partial(); export type TitleBlockUpdateDto = z.infer; /** @@ -547,7 +547,7 @@ export type TitleBlockUpdateDto = z.infer; * @property { string } selectedBpId Receiver business partner ID * @property { string } address Receiver address */ -export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Receiver business partner ID"), address: z.string().describe("Receiver address") }).readonly(); +export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().nullable(), address: z.string().nullable() }).partial(); export type ReceiverBlockUpdateDto = z.infer; /** @@ -562,7 +562,7 @@ export type ReceiverBlockUpdateDto = z.infer; /** @@ -570,7 +570,7 @@ export type OurInformationBlockUpdateDto = z.infer; /** @@ -581,7 +581,7 @@ export type TermsBlockDto = z.infer; * @property { string } customsAMS Customs AMS date * @property { string } vgmCustomer VGM customer date */ -export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().describe("Bill of lading from customer date"), billOfLadingToCarrier: z.string().describe("Bill of lading to carrier date"), customsAMS: z.string().describe("Customs AMS date"), vgmCustomer: z.string().describe("VGM customer date") }).readonly(); +export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().nullable(), billOfLadingToCarrier: z.string().nullable(), customsAMS: z.string().nullable(), vgmCustomer: z.string().nullable() }).partial(); export type CutOffDatesBlockUpdateDto = z.infer; /** @@ -599,7 +599,7 @@ export type CutOffDatesBlockUpdateDto = z.infer; /** @@ -618,7 +618,7 @@ export type TemplatedDocumentDataDto = z.infer; /** @@ -626,7 +626,7 @@ export type RouteTableUpdateBlockDto = z.infer; /** @@ -636,7 +636,7 @@ export type CargoItemRouteUpdateDto = z.infer; /** @@ -669,7 +669,7 @@ export type CargoItemUpdateDto = z.infer; * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 */ -export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), items: z.array(CommonModels.CargoItemUpdateDtoSchema).readonly().describe("Cargo items for package updates"), suppressWeight: z.boolean().describe("Suppress weight column display"), showGrid: z.boolean().describe("Show grid borders in cargo table"), suppressVolume: z.boolean().describe("Suppress volume column display"), suppressSpecialities: z.boolean().describe("Suppress specialities column display"), suppressDimensions: z.boolean().describe("Suppress dimensions column display"), suppressPackageVolume: z.boolean().describe("Suppress package volume column display"), suppressPackageWeight: z.boolean().describe("Suppress package weight column display"), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullable(), showGrandTotal: z.boolean().describe("Show grand total"), showTransportUnitTotal: z.boolean().describe("Show transport unit total"), suppressCargo: z.boolean().describe("Suppress cargo table display"), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units"), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units"), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages"), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages"), showPackageHSCodes: z.boolean().describe("Show HS codes for packages"), showPackageType: z.boolean().describe("Show package type for packages"), showPackageQuantity: z.boolean().describe("Show quantity for packages"), showPackageDescription: z.boolean().describe("Show description for packages"), showPackageCaseMarks: z.boolean().describe("Show case marks for packages"), showTransportUnitNumber: z.boolean().describe("Show transport unit number"), showTransportUnitType: z.boolean().describe("Show transport unit type"), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1"), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2") }).readonly(); +export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).nullable(), items: z.array(CommonModels.CargoItemUpdateDtoSchema).nullable(), suppressWeight: z.boolean().nullable(), showGrid: z.boolean().nullable(), suppressVolume: z.boolean().nullable(), suppressSpecialities: z.boolean().nullable(), suppressDimensions: z.boolean().nullable(), suppressPackageVolume: z.boolean().nullable(), suppressPackageWeight: z.boolean().nullable(), showRoute: z.boolean().nullable(), showGrandTotal: z.boolean().nullable(), showTransportUnitTotal: z.boolean().nullable(), suppressCargo: z.boolean().nullable(), showTransportUnitChargeableWeight: z.boolean().nullable(), showTransportUnitVolumetricWeight: z.boolean().nullable(), showPackageChargeableWeight: z.boolean().nullable(), showPackageVolumetricWeight: z.boolean().nullable(), showPackageHSCodes: z.boolean().nullable(), showPackageType: z.boolean().nullable(), showPackageQuantity: z.boolean().nullable(), showPackageDescription: z.boolean().nullable(), showPackageCaseMarks: z.boolean().nullable(), showTransportUnitNumber: z.boolean().nullable(), showTransportUnitType: z.boolean().nullable(), showTransportUnitSeal1: z.boolean().nullable(), showTransportUnitSeal2: z.boolean().nullable() }).partial(); export type CargoTableBlockUpdateDto = z.infer; /** @@ -678,7 +678,7 @@ export type CargoTableBlockUpdateDto = z.infer; /** @@ -686,7 +686,7 @@ export type SummaryCargoItemUpdateDto = z.infer; /** @@ -695,7 +695,7 @@ export type SummaryCargoBlockUpdateDto = z.infer; /** @@ -721,7 +721,7 @@ export type FinanceTablePositionUpdateDto = z.infer; /** @@ -732,7 +732,7 @@ export type FinanceTableBlockUpdateDto = z.infer; /** @@ -748,7 +748,7 @@ export type RemarkBlockUpdateDto = z.infer; * @property { RemarkBlockUpdateDto[] } remarks Remark blocks * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data */ -export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).readonly().describe("Remark blocks"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); +export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.nullable(), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.nullable(), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.nullable(), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.nullable(), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.nullable(), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).nullable(), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.nullable() }).partial(); export type TemplatedDocumentDataUpdateDto = z.infer; /** @@ -765,7 +765,7 @@ export const BusinessPartnerType = BusinessPartnerTypeSchema.enum; * @property { string } id * @property { string } name */ -export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }); export type BusinessPartnerAddressCityDto = z.infer; /** @@ -776,7 +776,7 @@ export type BusinessPartnerAddressCityDto = z.infer; /** @@ -790,7 +790,7 @@ export type BusinessPartnerAddressCountryDto = z.infer; /** @@ -800,7 +800,7 @@ export type BusinessPartnerAddressResponseDTO = z.infer; /** @@ -810,7 +810,7 @@ export type EditorContentResponseDto = z.infer; /** @@ -838,7 +838,7 @@ export const SeaRoutingEnum = SeaRoutingEnumSchema.enum; * @property { string } label * @property { BusinessPartnerAddressResponseDTO } address Main address information */ -export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information").nullish() }).readonly(); +export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.nullish() }); export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; /** @@ -847,7 +847,7 @@ export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; /** @@ -859,7 +859,7 @@ export type InvolvedPartyContactResponseDTO = z.infer; /** @@ -867,7 +867,7 @@ export type InvolvedPartyResponseDto = z.infer; /** @@ -885,7 +885,7 @@ export const RouteLocationTypeEnum = RouteLocationTypeEnumSchema.enum; * @property { string } name * @property { RouteLocationTypeEnum } type */ -export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }).readonly(); +export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }); export type RoutePointLocationResponseDto = z.infer; /** @@ -918,7 +918,7 @@ export const PositionRouteTransportModeEnum = PositionRouteTransportModeEnumSche * @property { string } id * @property { string } name */ -export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); export type RoutePointProviderResponseDto = z.infer; /** @@ -940,7 +940,7 @@ export type RoutePointProviderResponseDto = z.infer; /** @@ -951,7 +951,7 @@ export type RoutePointResponseDto = z.infer; * @property { string } cargoNumber Cargo number (sea positions only) * @property { RoutePointResponseDto[] } points */ -export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().describe("Cargo ID (sea positions only)").nullish(), cargoNumber: z.string().describe("Cargo number (sea positions only)").nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema).readonly() }).readonly(); +export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().nullish(), cargoNumber: z.string().nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema) }); export type RouteResponseDto = z.infer; /** @@ -960,7 +960,7 @@ export type RouteResponseDto = z.infer; * @property { RouteResponseDto[] } routes * @property { boolean } splitRoute Whether the position routes are split by cargo (sea positions only) */ -export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema).readonly(), splitRoute: z.boolean().describe("Whether the position routes are split by cargo (sea positions only)") }).readonly(); +export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema), splitRoute: z.boolean() }); export type RouteListResponseDto = z.infer; /** @@ -968,7 +968,7 @@ export type RouteListResponseDto = z.infer; * @type { object } * @property { RoutePointTypeEnum } type */ -export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }).readonly(); +export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }); export type CreateRoutePointRequestDto = z.infer; /** @@ -987,7 +987,7 @@ export type CreateRoutePointRequestDto = z.infer; /** @@ -1029,7 +1029,7 @@ export type UpdateRoutePointRequestDto = z.infer; /** @@ -1037,7 +1037,7 @@ export type PositionChargeDtoResponse = z.infer; /** @@ -1053,7 +1053,7 @@ export type PositionTextDtoResponse = z.infer; /** @@ -1062,7 +1062,7 @@ export type PositionAccountItemDtoResponse = z.infer; /** @@ -1074,7 +1074,7 @@ export type UserPreviewDto = z.infer; * @property { string } signatureImageUrl Signature image URL * @property { boolean } hasSignatureImage Whether office has a signature image configured */ -export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), blTermsAndConditionsImageUrl: z.string().describe("BL terms and conditions image URL"), signatureImageUrl: z.string().describe("Signature image URL"), hasSignatureImage: z.boolean().describe("Whether office has a signature image configured") }).readonly(); +export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable(), blTermsAndConditionsImageUrl: z.string().nullable(), signatureImageUrl: z.string().nullable(), hasSignatureImage: z.boolean().nullable() }).partial(); export type HBLDocumentConfigDto = z.infer; /** @@ -1112,7 +1112,7 @@ export const HazardousPackingGroupEnum = HazardousPackingGroupEnumSchema.enum; * @property { string } emergencyPhone * @property { string } emergencySchedule */ -export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number(), totalWidth: z.number(), temperature: z.number(), unNumber: z.string(), IMOClass: z.string(), shippingName: z.string(), technicalName: z.string(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema, netWeight: z.number(), flashpoint: z.number(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly(), acceptanceNumber: z.string(), medGuide: z.string(), emergencyPhone: z.string(), emergencySchedule: z.string() }).readonly(); +export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number().nullable(), totalWidth: z.number().nullable(), temperature: z.number().nullable(), unNumber: z.string().nullable(), IMOClass: z.string().nullable(), shippingName: z.string().nullable(), technicalName: z.string().nullable(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.nullable(), netWeight: z.number().nullable(), flashpoint: z.number().nullable(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).nullable(), acceptanceNumber: z.string().nullable(), medGuide: z.string().nullable(), emergencyPhone: z.string().nullable(), emergencySchedule: z.string().nullable() }).partial(); export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; /** @@ -1121,7 +1121,7 @@ export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; /** @@ -1130,7 +1130,7 @@ export type PositionCargoPackageTypeResponseDTO = z.infer; /** @@ -1139,7 +1139,7 @@ export type HsCodeLabelDto = z.infer; * @property { number } temperatureFrom * @property { number } temperatureUntil */ -export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number().nullable(), temperatureUntil: z.number().nullable() }).partial(); export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.infer; /** @@ -1149,7 +1149,7 @@ export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.in * @property { string } positionId * @property { string } positionNumber */ -export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }).readonly(); +export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }); export type PositionCargoSourcePackageResponseDTO = z.infer; /** @@ -1190,7 +1190,7 @@ export type PositionCargoSourcePackageResponseDTO = z.infer; /** @@ -1202,7 +1202,7 @@ export type PositionCargoPackageResponseDTO = z.infer; /** @@ -1216,7 +1216,7 @@ export type PackageTotalsDto = z.infer; * @property { PackageTotalsDto } oversized * @property { PackageTotalsDto } total */ -export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }).readonly(); +export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }); export type PackageSpecialtyTotalsResponseDto = z.infer; /** @@ -1226,7 +1226,7 @@ export type PackageSpecialtyTotalsResponseDto = z.infer; /** @@ -1264,7 +1264,7 @@ export type PositionCargoCargoTypeResponseDTO = z.infer; /** @@ -1286,7 +1286,7 @@ export type PositionCargoResponseDTO = z.infer; /** @@ -1295,7 +1295,7 @@ export type HazardousSpecialtyDTO = z.infer; * @property { number } temperatureFrom * @property { number } temperatureUntil */ -export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); +export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number().nullable(), temperatureUntil: z.number().nullable() }).partial(); export type TemperatureControlledSpecialtyDto = z.infer; /** @@ -1326,7 +1326,7 @@ export type TemperatureControlledSpecialtyDto = z.infer; /** @@ -1358,7 +1358,7 @@ export type CreatePositionCargoPackageDTO = z.infer; /** @@ -1391,7 +1391,7 @@ export const ChargePaymentEnum = ChargePaymentEnumSchema.enum; * @property { string } footerImageUrl Footer image URL * @property { string } headerImageUrl Header image URL */ -export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL") }).readonly(); +export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable() }).partial(); export type DocumentConfigDTO = z.infer; /** @@ -1412,7 +1412,7 @@ export const EmployeeRoleContext = EmployeeRoleContextSchema.enum; * @property { string } context Role context * @property { string[] } permissions Permissions associated with the role */ -export const EmployeeRoleResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export const EmployeeRoleResponseSchema = z.object({ id: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.nullish(), permissions: z.array(z.string()) }); export type EmployeeRoleResponse = z.infer; /** @@ -1426,7 +1426,7 @@ export type EmployeeRoleResponse = z.infer; * @property { boolean } archived Archived * @property { EmployeeRoleResponse[] } roles Global Roles */ -export const EmploymentEmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish() }).readonly(); +export const EmploymentEmployeeResponseSchema = z.object({ id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), phone: z.string().nullish(), archived: z.boolean().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).nullish() }); export type EmploymentEmployeeResponse = z.infer; /** @@ -1435,7 +1435,7 @@ export type EmploymentEmployeeResponse = z.infer; /** @@ -1450,7 +1450,7 @@ export type EmployeeOfficeResponse = z.infer; /** @@ -1475,7 +1475,7 @@ export const ServiceTypeEnum = ServiceTypeEnumSchema.enum; * @property { string } start * @property { string } end */ -export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }), end: z.iso.datetime({ offset: true }) }).readonly(); +export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }).nullable(), end: z.iso.datetime({ offset: true }).nullable() }).partial(); export type DateRangeDto = z.infer; /** @@ -1485,7 +1485,7 @@ export type DateRangeDto = z.infer; * @property { string } label * @property { BusinessPartnerType[] } types Array of business partner types */ -export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); +export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema) }); export type BusinessPartnerLabelResponseDTO = z.infer; /** @@ -1576,7 +1576,7 @@ export const InvoiceStatusEnum = InvoiceStatusEnumSchema.enum; * @property { string } creditorId Filter invoices by creditor ID (substring match) * @property { string } debtorId Filter invoices by debtor ID (substring match) */ -export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), vatRule: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer IDs (UUID)"), receiverCountry: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer country IDs"), salesRep: z.array(z.string()).readonly().describe("Filter by sales rep id"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number(), externalSystemId: z.string().describe("Filter invoices by position external system ID (substring match)"), hblNumber: z.string().describe("Filter invoices by HBL/HAWB (substring match)"), mblNumber: z.string().describe("Filter invoices by MBL/MAWB (substring match)"), bookingNumber: z.string().describe("Filter invoices by booking number (substring match)"), vessel: z.string().describe("Filter invoices by vessel name (substring match)"), voyage: z.string().describe("Filter invoices by voyage number (substring match)"), creditorId: z.string().describe("Filter invoices by creditor ID (substring match)"), debtorId: z.string().describe("Filter invoices by debtor ID (substring match)") }).readonly(); +export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string().nullable(), issuingDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).nullable(), collective: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), amountMin: z.number().nullable(), amountMax: z.number().nullable(), currencyNotation: z.array(z.string()).nullable(), vatRule: z.array(z.string()).nullable(), dueDate: CommonModels.DateRangeDtoSchema.nullable(), status: z.array(CommonModels.InvoiceStatusEnumSchema).nullable(), receiver: z.array(z.string()).nullable(), receiverCountry: z.array(z.string()).nullable(), salesRep: z.array(z.string()).nullable(), positionNumbersString: z.string().nullable(), positionNumbers: z.array(z.string()).nullable(), invoiceNumbersString: z.string().nullable(), invoiceNumbers: z.array(z.string()).nullable(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceNumberMin: z.number().nullable(), invoiceNumberMax: z.number().nullable(), internalNumberMin: z.number().nullable(), internalNumberMax: z.number().nullable(), externalSystemId: z.string().nullable(), hblNumber: z.string().nullable(), mblNumber: z.string().nullable(), bookingNumber: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), creditorId: z.string().nullable(), debtorId: z.string().nullable() }).partial(); export type OfficeInvoiceFilterDto = z.infer; /** @@ -1593,7 +1593,7 @@ export const PositionStatusEnum = PositionStatusEnumSchema.enum; * @property { string } id * @property { string } name */ -export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); export type PositionCustomerDto = z.infer; /** @@ -1602,7 +1602,7 @@ export type PositionCustomerDto = z.infer; * @property { string } id * @property { string } number */ -export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }); export type PositionQuoteDto = z.infer; /** @@ -1611,7 +1611,7 @@ export type PositionQuoteDto = z.infer; * @property { string } id * @property { string } number */ -export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }); export type ParentPositionDto = z.infer; /** @@ -1628,7 +1628,7 @@ export const PositionTypeEnum = PositionTypeEnumSchema.enum; * @property { string } id * @property { string } name */ -export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }); export type PositionProjectLiteDto = z.infer; /** @@ -1637,7 +1637,7 @@ export type PositionProjectLiteDto = z.infer; /** @@ -1688,7 +1688,7 @@ export type EmployeeDto = z.infer; * @property { EditorContentResponseDto } notes Notes * @property { number } volumetricWeightModifier Volumetric weight modifier */ -export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); +export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.nullish(), volumetricWeightModifier: z.number().nullish() }); export type PositionCoreResponseDto = z.infer; /** @@ -1698,7 +1698,7 @@ export type PositionCoreResponseDto = z.infer; /** @@ -1708,7 +1708,7 @@ export type VesselDto = z.infer; * @property { string } message Message * @property { string } code Alphanumeric code of the message type */ -export const StatusResponseDtoSchema = z.object({ status: z.string().describe("Status"), message: z.string().describe("Message"), code: z.string().describe("Alphanumeric code of the message type") }).readonly(); +export const StatusResponseDtoSchema = z.object({ status: z.string(), message: z.string(), code: z.string() }); export type StatusResponseDto = z.infer; /** @@ -1721,7 +1721,7 @@ export type StatusResponseDto = z.infer; * @property { number } limit Items per response * @property { number } totalItems Total available items */ -export const PaginationDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export const PaginationDtoSchema = z.object({ items: z.array(z.string()), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); export type PaginationDto = z.infer; /** @@ -1730,7 +1730,7 @@ export type PaginationDto = z.infer; * @property { string } id * @property { string } label */ -export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }).readonly(); +export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }); export type LabelResponseDTO = z.infer; /** @@ -1739,7 +1739,7 @@ export type LabelResponseDTO = z.infer; * @property { string } issuedAt * @property { string } fileName */ -export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); +export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }); export type GenerateWorkingDocumentRequestDto = z.infer; /** @@ -1749,7 +1749,7 @@ export type GenerateWorkingDocumentRequestDto = z.infer; /** @@ -1757,7 +1757,7 @@ export type UpdateInvolvedPartyDto = z.infer; /** @@ -1765,7 +1765,7 @@ export type MergeRoutesRequestDto = z.infer; * @type { object } * @property { string } targetCargoId Target cargo ID to copy to (sea positions only) */ -export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to copy to (sea positions only)").nullable() }).readonly(); +export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().nullable() }); export type CopyRouteRequestDto = z.infer; /** @@ -1774,7 +1774,7 @@ export type CopyRouteRequestDto = z.infer; * @property { string } transportUnitTypeName Transport unit type name (e.g., "40' DRY", "20'") * @property { number } quantity Total quantity of this transport unit type */ -export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string().describe("Transport unit type name (e.g., \"40' DRY\", \"20'\")"), quantity: z.number().describe("Total quantity of this transport unit type") }).readonly(); +export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string(), quantity: z.number() }); export type CargoSummaryResponseDTO = z.infer; /** @@ -1802,7 +1802,7 @@ export type CargoSummaryResponseDTO = z.infer; /** @@ -1830,7 +1830,7 @@ export type CreatePositionCargoDTO = z.infer; /** @@ -1838,7 +1838,7 @@ export type UpdatePositionCargoDTO = z.infer; /** diff --git a/test/generated/next/containerYards/containerYards.api.ts b/test/generated/next/containerYards/containerYards.api.ts index 57fbfcf..60ae21e 100644 --- a/test/generated/next/containerYards/containerYards.api.ts +++ b/test/generated/next/containerYards/containerYards.api.ts @@ -1,87 +1,82 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ContainerYardsModels } from "./containerYards.models"; import { CommonModels } from "@/data/common/common.models"; export namespace ContainerYardsApi { -export const paginate = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, `/container-yards`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, ) => { return AppRestClient.post( { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, `/container-yards`, ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), - config + ) }; -export const paginateLabels = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, `/container-yards/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const getLabelById = (id: string, config?: AxiosRequestConfig) => { +export const getLabelById = (id: string, ) => { return AppRestClient.get( { resSchema: CommonModels.LabelResponseDTOSchema }, `/container-yards/${id}/labels`, - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.patch( { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, `/container-yards/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.patch( { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, `/container-yards/${id}/unarchive`, - undefined, - config + ) }; -export const update = (id: string, data: ContainerYardsModels.UpdateContainerYardRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: ContainerYardsModels.UpdateContainerYardRequestDTO, ) => { return AppRestClient.patch( { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, `/container-yards/${id}`, ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), - config + ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, `/container-yards/${id}`, - config + ) }; } diff --git a/test/generated/next/containerYards/containerYards.models.ts b/test/generated/next/containerYards/containerYards.models.ts index bed80b9..d85e878 100644 --- a/test/generated/next/containerYards/containerYards.models.ts +++ b/test/generated/next/containerYards/containerYards.models.ts @@ -8,7 +8,7 @@ export namespace ContainerYardsModels { * @property { string } id * @property { string } name */ -export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type ContainerYardEmployeeDTO = z.infer; /** @@ -39,7 +39,7 @@ export type ContainerYardEmployeeDTO = z.infer; /** @@ -48,7 +48,7 @@ export type ContainerYardResponseDTO = z.infer; /** @@ -56,7 +56,7 @@ export type ContainerYardFilterDto = z.infer; /** @@ -73,7 +73,7 @@ export type ContainerYardLabelFilterDto = z.infer; /** @@ -91,7 +91,7 @@ export type CreateContainerYardRequestDTO = z.infer; /** @@ -112,7 +112,7 @@ export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderP * @property { number } totalItems Total available items * @property { ContainerYardResponseDTO[] } items */ -export const ContainerYardsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerYardResponseDTOSchema).readonly() }).readonly().shape }); +export const ContainerYardsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerYardResponseDTOSchema).nullable() }).partial().shape }); export type ContainerYardsPaginateResponse = z.infer; /** @@ -133,7 +133,7 @@ export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginate * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const ContainerYardsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const ContainerYardsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type ContainerYardsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/containerYards/containerYards.queries.ts b/test/generated/next/containerYards/containerYards.queries.ts index c737b06..97b958b 100644 --- a/test/generated/next/containerYards/containerYards.queries.ts +++ b/test/generated/next/containerYards/containerYards.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -34,14 +33,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, page, cursor, config) }, + return ContainerYardsApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -59,14 +58,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -85,14 +84,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseMutationResult } * @statusCodes [200, 201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(ContainerYardsAcl.canUseCreate()); - return ContainerYardsApi.create(data, config) + return ContainerYardsApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -115,14 +114,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -140,14 +139,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -166,14 +165,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetLabelById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetLabelById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getLabelById(id), queryFn: () => { checkAcl(ContainerYardsAcl.canUseGetLabelById()); - return ContainerYardsApi.getLabelById(id, config) }, + return ContainerYardsApi.getLabelById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useGetLabelById = ({ id }: { id: string }, options?: AppQuer * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(ContainerYardsAcl.canUseArchive()); - return ContainerYardsApi.archive(id, config) + return ContainerYardsApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(ContainerYardsAcl.canUseUnarchive()); - return ContainerYardsApi.unarchive(id, config) + return ContainerYardsApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -244,14 +243,14 @@ export const useUnarchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(ContainerYardsAcl.canUseUpdate()); - return ContainerYardsApi.update(id, data, config) + return ContainerYardsApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -272,14 +271,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(ContainerYardsAcl.canUseFindById()); - return ContainerYardsApi.findById(id, config) }, + return ContainerYardsApi.findById(id) }, ...options, }); }; diff --git a/test/generated/next/controlTowerAuth/controlTowerAuth.api.ts b/test/generated/next/controlTowerAuth/controlTowerAuth.api.ts index b52d90f..13804d1 100644 --- a/test/generated/next/controlTowerAuth/controlTowerAuth.api.ts +++ b/test/generated/next/controlTowerAuth/controlTowerAuth.api.ts @@ -1,23 +1,22 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerAuthModels } from "./controlTowerAuth.models"; export namespace ControlTowerAuthApi { -export const login = (data: ControlTowerAuthModels.LoginRequestDto, config?: AxiosRequestConfig) => { +export const login = (data: ControlTowerAuthModels.LoginRequestDto, ) => { return AppRestClient.post( { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, `/auth/move/login`, ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), - config + ) }; -export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, config?: AxiosRequestConfig) => { +export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, ) => { return AppRestClient.post( { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, `/auth/reset-password`, ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/controlTowerAuth/controlTowerAuth.models.ts b/test/generated/next/controlTowerAuth/controlTowerAuth.models.ts index 287265f..8cc05bd 100644 --- a/test/generated/next/controlTowerAuth/controlTowerAuth.models.ts +++ b/test/generated/next/controlTowerAuth/controlTowerAuth.models.ts @@ -7,7 +7,7 @@ export namespace ControlTowerAuthModels { * @property { string } username * @property { string } password */ -export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }).readonly(); +export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }); export type LoginRequestDto = z.infer; /** @@ -18,7 +18,7 @@ export type LoginRequestDto = z.infer; * @property { string } passwordResetToken * @property { string } username */ -export const LoginResponseDtoSchema = z.object({ accessToken: z.string().nullable(), resetPasswordRequired: z.boolean().nullish(), passwordResetToken: z.string().nullish(), username: z.string().nullish() }).readonly(); +export const LoginResponseDtoSchema = z.object({ accessToken: z.string().nullable(), resetPasswordRequired: z.boolean().nullish(), passwordResetToken: z.string().nullish(), username: z.string().nullish() }); export type LoginResponseDto = z.infer; /** @@ -28,7 +28,7 @@ export type LoginResponseDto = z.infer; * @property { string } username * @property { string } token */ -export const PasswordResetDtoSchema = z.object({ password: z.string(), username: z.string(), token: z.string() }).readonly(); +export const PasswordResetDtoSchema = z.object({ password: z.string(), username: z.string(), token: z.string() }); export type PasswordResetDto = z.infer; } diff --git a/test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts b/test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts index 37e2167..9fdc009 100644 --- a/test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts +++ b/test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -19,12 +18,12 @@ export const moduleName = QueryModule.ControlTowerAuth; * @returns { UseMutationResult } * @statusCodes [200, 400, 401] */ -export const useLogin = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useLogin = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => - ControlTowerAuthApi.login(data, config) + ControlTowerAuthApi.login(data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -42,12 +41,12 @@ export const useLogin = (options?: AppMutationOptions } * @statusCodes [200, 400, 401] */ -export const useResetPassword = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useResetPassword = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => - ControlTowerAuthApi.resetPassword(data, config) + ControlTowerAuthApi.resetPassword(data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.api.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.api.ts index 2ba8093..ac13db5 100644 --- a/test/generated/next/controlTowerBookings/controlTowerBookings.api.ts +++ b/test/generated/next/controlTowerBookings/controlTowerBookings.api.ts @@ -1,38 +1,36 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; export namespace ControlTowerBookingsApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const findAll = (limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, `/bookings`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, `/bookings/${id}`, - config + ) }; -export const findPackageById = (packageId: string, bookingId: string, config?: AxiosRequestConfig) => { +export const findPackageById = (packageId: string, bookingId: string, ) => { return AppRestClient.get( { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, `/bookings/${bookingId}/packages/${packageId}`, - config + ) }; } diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.models.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.models.ts index 1671d53..8170c63 100644 --- a/test/generated/next/controlTowerBookings/controlTowerBookings.models.ts +++ b/test/generated/next/controlTowerBookings/controlTowerBookings.models.ts @@ -18,7 +18,7 @@ export namespace ControlTowerBookingsModels { * @property { string } journeyTo * @property { CommonModels.VesselDto } vessel */ -export const BookingListItemDtoSchema = z.object({ id: z.string(), bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export const BookingListItemDtoSchema = z.object({ id: z.string(), bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); export type BookingListItemDto = z.infer; /** @@ -37,7 +37,7 @@ export type BookingListItemDto = z.infer; * @property { string } lastEventDate * @property { string } seals */ -export const BookingContainerDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), loadType: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), hsCode: z.array(z.string()).readonly().nullable(), noS: z.number().nullable(), weight: z.number().nullable(), lastEventLocation: z.string().nullable(), lastEventName: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), seals: z.string().nullable() }).readonly(); +export const BookingContainerDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), loadType: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), hsCode: z.array(z.string()).nullable(), noS: z.number().nullable(), weight: z.number().nullable(), lastEventLocation: z.string().nullable(), lastEventName: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), seals: z.string().nullable() }); export type BookingContainerDto = z.infer; /** @@ -52,7 +52,7 @@ export type BookingContainerDto = z.infer; * @property { string } lastEventLocation * @property { string } lastEventDate */ -export const BookingPackageDtoSchema = z.object({ id: z.string(), packageNumber: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), description: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable() }).readonly(); +export const BookingPackageDtoSchema = z.object({ id: z.string(), packageNumber: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), description: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable() }); export type BookingPackageDto = z.infer; /** @@ -76,7 +76,7 @@ export type BookingPackageDto = z.infer; * @property { CommonModels.VesselDto } vessel * @property { string } id */ -export const BookingResponseDtoSchema = z.object({ bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), etaPod: z.iso.datetime({ offset: true }).nullable(), etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), destination: z.string().nullable(), lastEvent: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), poNumber: z.string().nullable(), blNumber: z.string().nullable(), containers: z.array(BookingContainerDtoSchema).readonly().nullish(), packages: z.array(BookingPackageDtoSchema).readonly().nullish(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable(), id: z.string() }).readonly(); +export const BookingResponseDtoSchema = z.object({ bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), etaPod: z.iso.datetime({ offset: true }).nullable(), etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), destination: z.string().nullable(), lastEvent: z.string().nullable(), files: z.array(z.string()).nullable(), poNumber: z.string().nullable(), blNumber: z.string().nullable(), containers: z.array(BookingContainerDtoSchema).nullish(), packages: z.array(BookingPackageDtoSchema).nullish(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable(), id: z.string() }); export type BookingResponseDto = z.infer; /** @@ -109,7 +109,7 @@ export type BookingResponseDto = z.infer; * @property { string } journeyTo * @property { CommonModels.VesselDto } vessel */ -export const PackageResponseDtoSchema = z.object({ id: z.string(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), containerNumber: z.string().nullable(), packageNumber: z.string().nullable(), description: z.string().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), volume: z.number().nullable(), storageInstruction: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export const PackageResponseDtoSchema = z.object({ id: z.string(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), containerNumber: z.string().nullable(), packageNumber: z.string().nullable(), description: z.string().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), volume: z.number().nullable(), storageInstruction: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); export type PackageResponseDto = z.infer; /** @@ -120,7 +120,7 @@ export type PackageResponseDto = z.infer; * @property { string[] } companyIds * @property { string } purchaseOrderId */ -export const BookingFilterDtoSchema = z.object({ projectId: z.string(), search: z.string().min(1), companyIds: z.array(z.string()).readonly(), purchaseOrderId: z.string() }).readonly(); +export const BookingFilterDtoSchema = z.object({ projectId: z.string().nullable(), search: z.string().min(1).nullable(), companyIds: z.array(z.string()).nullable(), purchaseOrderId: z.string().nullable() }).partial(); export type BookingFilterDto = z.infer; /** @@ -141,7 +141,7 @@ export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFin * @property { number } totalItems Total available items * @property { BookingListItemDto[] } items */ -export const ControlTowerBookingsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookingListItemDtoSchema).readonly() }).readonly().shape }); +export const ControlTowerBookingsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookingListItemDtoSchema).nullable() }).partial().shape }); export type ControlTowerBookingsFindAllResponse = z.infer; } diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts index 7ab4d73..0fd4b0d 100644 --- a/test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts +++ b/test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; @@ -28,12 +27,12 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.findAll(limit, order, filter, page, cursor), queryFn: () => - ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor, config), + ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor), ...options, }); }; @@ -50,12 +49,12 @@ export const useFindAll = ({ limit, order, filter, page, cursor }: { limi * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { return useInfiniteQuery({ queryKey: keys.findAllInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => - ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor, config), + ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor), initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -73,12 +72,12 @@ export const useFindAllInfinite = ({ limit, order, filter, cursor }: { li * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.findById(id), queryFn: () => - ControlTowerBookingsApi.findById(id, config), + ControlTowerBookingsApi.findById(id), ...options, }); }; @@ -92,12 +91,12 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindPackageById = ({ packageId, bookingId }: { packageId: string, bookingId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindPackageById = ({ packageId, bookingId }: { packageId: string, bookingId: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.findPackageById(packageId, bookingId), queryFn: () => - ControlTowerBookingsApi.findPackageById(packageId, bookingId, config), + ControlTowerBookingsApi.findPackageById(packageId, bookingId), ...options, }); }; diff --git a/test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts b/test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts index 198615d..a35354b 100644 --- a/test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts +++ b/test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts @@ -1,16 +1,14 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; export namespace ControlTowerCalendarApi { -export const getCalendar = (from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, config?: AxiosRequestConfig) => { +export const getCalendar = (from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, ) => { return AppRestClient.get( { resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, `/calendar`, { - ...config, params: { from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), diff --git a/test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts b/test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts index 5c33c81..43dbf63 100644 --- a/test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts +++ b/test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts @@ -16,7 +16,7 @@ export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; * @property { string } id * @property { string } number */ -export const CalendarEventRelationDtoSchema = z.object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }).readonly(); +export const CalendarEventRelationDtoSchema = z.object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }); export type CalendarEventRelationDto = z.infer; /** @@ -37,7 +37,7 @@ export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; * @property { string } title * @property { CalendarEventRelationDto[] } relations */ -export const CalendarEventDtoSchema = z.object({ entityId: z.string(), entityNumber: z.string(), entityType: CalendarTypeEnumSchema, date: z.iso.datetime({ offset: true }), title: z.string(), relations: z.array(CalendarEventRelationDtoSchema).readonly() }).readonly(); +export const CalendarEventDtoSchema = z.object({ entityId: z.string(), entityNumber: z.string(), entityType: CalendarTypeEnumSchema, date: z.iso.datetime({ offset: true }), title: z.string(), relations: z.array(CalendarEventRelationDtoSchema) }); export type CalendarEventDto = z.infer; /** @@ -47,7 +47,7 @@ export type CalendarEventDto = z.infer; * @property { string[] } bookingNumbers * @property { string[] } containerNumbers */ -export const FiltersDtoSchema = z.object({ poNumbers: z.array(z.string()).readonly(), bookingNumbers: z.array(z.string()).readonly(), containerNumbers: z.array(z.string()).readonly() }).readonly(); +export const FiltersDtoSchema = z.object({ poNumbers: z.array(z.string()), bookingNumbers: z.array(z.string()), containerNumbers: z.array(z.string()) }); export type FiltersDto = z.infer; /** @@ -56,7 +56,7 @@ export type FiltersDto = z.infer; * @property { CalendarEventDto[] } events * @property { FiltersDto } filters */ -export const CalendarDtoSchema = z.object({ events: z.array(CalendarEventDtoSchema).readonly(), filters: FiltersDtoSchema }).readonly(); +export const CalendarDtoSchema = z.object({ events: z.array(CalendarEventDtoSchema), filters: FiltersDtoSchema }); export type CalendarDto = z.infer; /** @@ -64,28 +64,28 @@ export type CalendarDto = z.infer; * @type { object } * @property { CalendarDto } data */ -export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }).readonly(); +export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }); export type CalendarResponseDto = z.infer; /** * GetCalendarPoNumbersParamSchema * @type { array } */ -export const GetCalendarPoNumbersParamSchema = z.array(z.string()).readonly().nullish(); +export const GetCalendarPoNumbersParamSchema = z.array(z.string()).nullish(); export type GetCalendarPoNumbersParam = z.infer; /** * GetCalendarContainerNumbersParamSchema * @type { array } */ -export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).readonly().nullish(); +export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).nullish(); export type GetCalendarContainerNumbersParam = z.infer; /** * GetCalendarBookingNumbersParamSchema * @type { array } */ -export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).readonly().nullish(); +export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).nullish(); export type GetCalendarBookingNumbersParam = z.infer; } diff --git a/test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts b/test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts index 115102b..5e81f36 100644 --- a/test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts +++ b/test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions } from "@povio/openapi-codegen-cli"; @@ -26,12 +25,12 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetCalendar = ({ from, to, type, search, poNumbers, containerNumbers, bookingNumbers }: { from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCalendar = ({ from, to, type, search, poNumbers, containerNumbers, bookingNumbers }: { from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), queryFn: () => - ControlTowerCalendarApi.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers, config), + ControlTowerCalendarApi.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), ...options, }); }; diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.api.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.api.ts index 4708306..3196fe3 100644 --- a/test/generated/next/controlTowerContainers/controlTowerContainers.api.ts +++ b/test/generated/next/controlTowerContainers/controlTowerContainers.api.ts @@ -1,38 +1,36 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerContainersModels } from "./controlTowerContainers.models"; export namespace ControlTowerContainersApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const findAll = (limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, `/containers`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, `/containers/${id}`, - config + ) }; -export const getJourney = (id: string, config?: AxiosRequestConfig) => { +export const getJourney = (id: string, ) => { return AppRestClient.get( { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, `/containers/${id}/journey`, - config + ) }; } diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.models.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.models.ts index 410f1aa..e0df923 100644 --- a/test/generated/next/controlTowerContainers/controlTowerContainers.models.ts +++ b/test/generated/next/controlTowerContainers/controlTowerContainers.models.ts @@ -18,7 +18,7 @@ export namespace ControlTowerContainersModels { * @property { string } journeyTo * @property { CommonModels.VesselDto } vessel */ -export const ContainerListItemDtoSchema = z.object({ containerNumber: z.string().nullable(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export const ContainerListItemDtoSchema = z.object({ containerNumber: z.string().nullable(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); export type ContainerListItemDto = z.infer; /** @@ -29,7 +29,7 @@ export type ContainerListItemDto = z.infer; * @property { string } date * @property { boolean } checkedIn */ -export const ContainerEventDtoSchema = z.object({ vessel: CommonModels.VesselDtoSchema.nullable(), name: z.string(), date: z.iso.datetime({ offset: true }).nullable(), checkedIn: z.boolean() }).readonly(); +export const ContainerEventDtoSchema = z.object({ vessel: CommonModels.VesselDtoSchema.nullable(), name: z.string(), date: z.iso.datetime({ offset: true }).nullable(), checkedIn: z.boolean() }); export type ContainerEventDto = z.infer; /** @@ -41,7 +41,7 @@ export type ContainerEventDto = z.infer; * @property { boolean } checkedIn * @property { ContainerEventDto[] } events */ -export const ContainerJourneyDtoSchema = z.object({ id: z.string(), country: z.string().nullable(), terminal: z.string().nullable(), checkedIn: z.boolean(), events: z.array(ContainerEventDtoSchema).readonly() }).readonly(); +export const ContainerJourneyDtoSchema = z.object({ id: z.string(), country: z.string().nullable(), terminal: z.string().nullable(), checkedIn: z.boolean(), events: z.array(ContainerEventDtoSchema) }); export type ContainerJourneyDto = z.infer; /** @@ -51,7 +51,7 @@ export type ContainerJourneyDto = z.infer; * @property { string } type * @property { string } description */ -export const PackageNumberDtoSchema = z.object({ id: z.string(), type: z.string().nullable(), description: z.string() }).readonly(); +export const PackageNumberDtoSchema = z.object({ id: z.string(), type: z.string().nullable(), description: z.string() }); export type PackageNumberDto = z.infer; /** @@ -86,7 +86,7 @@ export type PackageNumberDto = z.infer; * @property { string } journeyTo * @property { CommonModels.VesselDto } vessel */ -export const ContainerResponseDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), containerType: z.string().nullable(), loadType: z.string().nullable(), hsCode: z.array(z.string()).readonly().nullable(), totalVolume: z.number().nullable(), totalWeight: z.number().nullable(), cargoDescription: z.string().nullable(), noS: z.number().nullable(), journeys: z.array(ContainerJourneyDtoSchema).readonly().nullish(), packages: z.array(PackageNumberDtoSchema).readonly().nullish(), bookingId: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export const ContainerResponseDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), containerType: z.string().nullable(), loadType: z.string().nullable(), hsCode: z.array(z.string()).nullable(), totalVolume: z.number().nullable(), totalWeight: z.number().nullable(), cargoDescription: z.string().nullable(), noS: z.number().nullable(), journeys: z.array(ContainerJourneyDtoSchema).nullish(), packages: z.array(PackageNumberDtoSchema).nullish(), bookingId: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); export type ContainerResponseDto = z.infer; /** @@ -97,7 +97,7 @@ export type ContainerResponseDto = z.infer; * @property { ContainerJourneyDto[] } journeys * @property { string[] } packageNumbers */ -export const ContainerJourneyResponseDtoSchema = z.object({ id: z.string(), number: z.string(), journeys: z.array(ContainerJourneyDtoSchema).readonly(), packageNumbers: z.array(z.string()).readonly() }).readonly(); +export const ContainerJourneyResponseDtoSchema = z.object({ id: z.string(), number: z.string(), journeys: z.array(ContainerJourneyDtoSchema), packageNumbers: z.array(z.string()) }); export type ContainerJourneyResponseDto = z.infer; /** @@ -106,7 +106,7 @@ export type ContainerJourneyResponseDto = z.infer; /** @@ -127,7 +127,7 @@ export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainer * @property { number } totalItems Total available items * @property { ContainerListItemDto[] } items */ -export const ControlTowerContainersFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerListItemDtoSchema).readonly() }).readonly().shape }); +export const ControlTowerContainersFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerListItemDtoSchema).nullable() }).partial().shape }); export type ControlTowerContainersFindAllResponse = z.infer; } diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts index eef15d1..ccb35ea 100644 --- a/test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts +++ b/test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; @@ -28,12 +27,12 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.findAll(limit, order, filter, page, cursor), queryFn: () => - ControlTowerContainersApi.findAll(limit, order, filter, page, cursor, config), + ControlTowerContainersApi.findAll(limit, order, filter, page, cursor), ...options, }); }; @@ -50,12 +49,12 @@ export const useFindAll = ({ limit, order, filter, page, cursor }: { limi * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { return useInfiniteQuery({ queryKey: keys.findAllInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => - ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor, config), + ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor), initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -73,12 +72,12 @@ export const useFindAllInfinite = ({ limit, order, filter, cursor }: { li * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.findById(id), queryFn: () => - ControlTowerContainersApi.findById(id, config), + ControlTowerContainersApi.findById(id), ...options, }); }; @@ -91,12 +90,12 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetJourney = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetJourney = ({ id }: { id: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.getJourney(id), queryFn: () => - ControlTowerContainersApi.getJourney(id, config), + ControlTowerContainersApi.getJourney(id), ...options, }); }; diff --git a/test/generated/next/controlTowerMe/controlTowerMe.api.ts b/test/generated/next/controlTowerMe/controlTowerMe.api.ts index 6852384..91b82bc 100644 --- a/test/generated/next/controlTowerMe/controlTowerMe.api.ts +++ b/test/generated/next/controlTowerMe/controlTowerMe.api.ts @@ -1,55 +1,53 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerMeModels } from "./controlTowerMe.models"; export namespace ControlTowerMeApi { -export const getUserProfile = (config?: AxiosRequestConfig) => { +export const getUserProfile = () => { return AppRestClient.get( { resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, `/me`, - config + ) }; -export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, config?: AxiosRequestConfig) => { +export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, ) => { return AppRestClient.put( { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, `/me`, ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), - config + ) }; -export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, config?: AxiosRequestConfig) => { +export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, ) => { return AppRestClient.put( { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, `/me/basic`, ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), - config + ) }; -export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, config?: AxiosRequestConfig) => { +export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, ) => { return AppRestClient.put( { resSchema: z.void() }, `/me/password`, ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), - config + ) }; -export const updateEmailPreferences = (data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, config?: AxiosRequestConfig) => { +export const updateEmailPreferences = (data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, ) => { return AppRestClient.put( { resSchema: z.void() }, `/me/email-preferences`, ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), - config + ) }; -export const updateProjectAccess = (config?: AxiosRequestConfig) => { +export const updateProjectAccess = () => { return AppRestClient.put( { resSchema: z.void() }, `/me/access`, - undefined, - config + ) }; } diff --git a/test/generated/next/controlTowerMe/controlTowerMe.models.ts b/test/generated/next/controlTowerMe/controlTowerMe.models.ts index df9a49b..e453fe6 100644 --- a/test/generated/next/controlTowerMe/controlTowerMe.models.ts +++ b/test/generated/next/controlTowerMe/controlTowerMe.models.ts @@ -7,7 +7,7 @@ export namespace ControlTowerMeModels { * @property { string } self * @property { string } related */ -export const LinksDtoSchema = z.object({ self: z.string(), related: z.string() }).readonly(); +export const LinksDtoSchema = z.object({ self: z.string().nullable(), related: z.string().nullable() }).partial(); export type LinksDto = z.infer; /** @@ -19,7 +19,7 @@ export type LinksDto = z.infer; * @property { object } relationships * @property { LinksDto } links */ -export const ApiResponseDataDtoSchema = z.object({ type: z.string(), id: z.string(), attributes: z.object({}).readonly().nullish(), relationships: z.object({}).readonly().nullish(), links: LinksDtoSchema.nullish() }).readonly(); +export const ApiResponseDataDtoSchema = z.object({ type: z.string(), id: z.string(), attributes: z.object({}).nullish(), relationships: z.object({}).nullish(), links: LinksDtoSchema.nullish() }); export type ApiResponseDataDto = z.infer; /** @@ -29,7 +29,7 @@ export type ApiResponseDataDto = z.infer; * @property { string } self * @property { string } last */ -export const PaginationLinksDtoSchema = z.object({ next: z.string(), self: z.string(), last: z.string() }).readonly(); +export const PaginationLinksDtoSchema = z.object({ next: z.string().nullable(), self: z.string().nullable(), last: z.string().nullable() }).partial(); export type PaginationLinksDto = z.infer; /** @@ -38,7 +38,7 @@ export type PaginationLinksDto = z.infer; * @property { ApiResponseDataDto } data * @property { PaginationLinksDto } links */ -export const ApiResponseDtoSchema = z.object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }).readonly(); +export const ApiResponseDtoSchema = z.object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }); export type ApiResponseDto = z.infer; /** @@ -58,7 +58,7 @@ export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; * @property { boolean } onsiteDelivery * @property { DelayNotificationEnum } delay */ -export const UserEmailPreferencesDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }).readonly(); +export const UserEmailPreferencesDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }); export type UserEmailPreferencesDto = z.infer; /** @@ -66,7 +66,7 @@ export type UserEmailPreferencesDto = z.infer; /** @@ -88,7 +88,7 @@ export const UserRoleEnum = UserRoleEnumSchema.enum; * @property { UserRoleEnum } role * @property { boolean } isAdmin */ -export const UserDetailDtoSchema = z.object({ id: z.string(), name: z.string().min(3), email: z.email(), emailPreferences: UserEmailPreferencesDtoSchema.nullable(), projectAccess: UserProjectAccessDtoSchema.nullable(), role: UserRoleEnumSchema.nullable(), isAdmin: z.boolean() }).readonly(); +export const UserDetailDtoSchema = z.object({ id: z.string(), name: z.string().min(3), email: z.email(), emailPreferences: UserEmailPreferencesDtoSchema.nullable(), projectAccess: UserProjectAccessDtoSchema.nullable(), role: UserRoleEnumSchema.nullable(), isAdmin: z.boolean() }); export type UserDetailDto = z.infer; /** @@ -100,7 +100,7 @@ export type UserDetailDto = z.infer; * @property { boolean } onsiteDelivery * @property { DelayNotificationEnum } delay */ -export const UserEmailPreferencesUpdateDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }).readonly(); +export const UserEmailPreferencesUpdateDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }); export type UserEmailPreferencesUpdateDto = z.infer; /** @@ -108,7 +108,7 @@ export type UserEmailPreferencesUpdateDto = z.infer; /** @@ -120,7 +120,7 @@ export type UserProjectAccessUpdateDto = z.infer; /** @@ -129,7 +129,7 @@ export type UserUpdateDto = z.infer; * @property { string } name * @property { string } email */ -export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }).readonly(); +export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }); export type UserBasicUpdateDto = z.infer; /** @@ -137,7 +137,7 @@ export type UserBasicUpdateDto = z.infer; * @type { object } * @property { string } password */ -export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }).readonly(); +export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }); export type UserPasswordUpdateDto = z.infer; /** @@ -147,7 +147,7 @@ export type UserPasswordUpdateDto = z.infer; * @property { PaginationLinksDto } links * @property { UserDetailDto } data.attributes */ -export const GetUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape }); +export const GetUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema.nullable() }).partial().nullable() }).partial().shape }); export type GetUserProfileResponse = z.infer; /** @@ -157,7 +157,7 @@ export type GetUserProfileResponse = z.infer; /** @@ -167,7 +167,7 @@ export type UpdateUserDataResponse = z.infer; } diff --git a/test/generated/next/controlTowerMe/controlTowerMe.queries.ts b/test/generated/next/controlTowerMe/controlTowerMe.queries.ts index fa4d7c0..ae8316f 100644 --- a/test/generated/next/controlTowerMe/controlTowerMe.queries.ts +++ b/test/generated/next/controlTowerMe/controlTowerMe.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -21,12 +20,11 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200] */ -export const useGetUserProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetUserProfile = (options?: AppQueryOptions) => { return useQuery({ queryKey: keys.getUserProfile(), - queryFn: () => - ControlTowerMeApi.getUserProfile(config), + queryFn: ControlTowerMeApi.getUserProfile, ...options, }); }; @@ -39,12 +37,12 @@ export const useGetUserProfile = (options?: AppQueryOptions } * @statusCodes [200] */ -export const useUpdateUserData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateUserData = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => - ControlTowerMeApi.updateUserData(data, config) + ControlTowerMeApi.updateUserData(data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -62,12 +60,12 @@ export const useUpdateUserData = (options?: AppMutationOptions } * @statusCodes [200] */ -export const useUpdateUserProfile = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateUserProfile = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => - ControlTowerMeApi.updateUserProfile(data, config) + ControlTowerMeApi.updateUserProfile(data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -85,12 +83,12 @@ export const useUpdateUserProfile = (options?: AppMutationOptions } * @statusCodes [200] */ -export const useUpdatePassword = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdatePassword = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => - ControlTowerMeApi.updatePassword(data, config) + ControlTowerMeApi.updatePassword(data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -108,12 +106,12 @@ export const useUpdatePassword = (options?: AppMutationOptions } * @statusCodes [200] */ -export const useUpdateEmailPreferences = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateEmailPreferences = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => - ControlTowerMeApi.updateEmailPreferences(data, config) + ControlTowerMeApi.updateEmailPreferences(data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -130,12 +128,12 @@ export const useUpdateEmailPreferences = (options?: AppMutationOptions } * @statusCodes [200] */ -export const useUpdateProjectAccess = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateProjectAccess = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: () => - ControlTowerMeApi.updateProjectAccess(config) + ControlTowerMeApi.updateProjectAccess() , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.api.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.api.ts index 6cab316..1a72562 100644 --- a/test/generated/next/controlTowerPackages/controlTowerPackages.api.ts +++ b/test/generated/next/controlTowerPackages/controlTowerPackages.api.ts @@ -1,22 +1,20 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; export namespace ControlTowerPackagesApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const findAll = (limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, `/packages`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.models.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.models.ts index 4d4fd3b..af298ca 100644 --- a/test/generated/next/controlTowerPackages/controlTowerPackages.models.ts +++ b/test/generated/next/controlTowerPackages/controlTowerPackages.models.ts @@ -19,7 +19,7 @@ export namespace ControlTowerPackagesModels { * @property { string } journeyTo * @property { CommonModels.VesselDto } vessel */ -export const PackageListItemDtoSchema = z.object({ packageNumber: z.string(), bookingId: z.string(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); +export const PackageListItemDtoSchema = z.object({ packageNumber: z.string(), bookingId: z.string(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); export type PackageListItemDto = z.infer; /** @@ -27,7 +27,7 @@ export type PackageListItemDto = z.infer; * @type { object } * @property { string } search Min Length: `1` */ -export const PackageFilterDtoSchema = z.object({ search: z.string().min(1) }).readonly(); +export const PackageFilterDtoSchema = z.object({ search: z.string().min(1).nullable() }).partial(); export type PackageFilterDto = z.infer; /** @@ -48,7 +48,7 @@ export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFin * @property { number } totalItems Total available items * @property { PackageListItemDto[] } items */ -export const ControlTowerPackagesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageListItemDtoSchema).readonly() }).readonly().shape }); +export const ControlTowerPackagesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageListItemDtoSchema).nullable() }).partial().shape }); export type ControlTowerPackagesFindAllResponse = z.infer; } diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts index d55ee3d..006ba2a 100644 --- a/test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts +++ b/test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; @@ -26,12 +25,12 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.findAll(limit, order, filter, page, cursor), queryFn: () => - ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor, config), + ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor), ...options, }); }; @@ -48,12 +47,12 @@ export const useFindAll = ({ limit, order, filter, page, cursor }: { limi * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { return useInfiniteQuery({ queryKey: keys.findAllInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => - ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor, config), + ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor), initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; diff --git a/test/generated/next/controlTowerSearch/controlTowerSearch.api.ts b/test/generated/next/controlTowerSearch/controlTowerSearch.api.ts index 4ff685b..089524b 100644 --- a/test/generated/next/controlTowerSearch/controlTowerSearch.api.ts +++ b/test/generated/next/controlTowerSearch/controlTowerSearch.api.ts @@ -1,17 +1,15 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ControlTowerSearchModels } from "./controlTowerSearch.models"; export namespace ControlTowerSearchApi { -export const search = (data: ControlTowerSearchModels.SearchRequestDto, type?: ControlTowerSearchModels.SearchItemTypeEnum, limit?: number, config?: AxiosRequestConfig) => { +export const search = (data: ControlTowerSearchModels.SearchRequestDto, type?: ControlTowerSearchModels.SearchItemTypeEnum, limit?: number, ) => { return AppRestClient.post( { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, `/search`, ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), { - ...config, params: { type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { type: "query", name: "type" }), limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), diff --git a/test/generated/next/controlTowerSearch/controlTowerSearch.models.ts b/test/generated/next/controlTowerSearch/controlTowerSearch.models.ts index 77d7c82..c08141b 100644 --- a/test/generated/next/controlTowerSearch/controlTowerSearch.models.ts +++ b/test/generated/next/controlTowerSearch/controlTowerSearch.models.ts @@ -16,7 +16,7 @@ export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; * @property { string } id * @property { string } label */ -export const SearchItemDtoSchema = z.object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }).readonly(); +export const SearchItemDtoSchema = z.object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }); export type SearchItemDto = z.infer; /** @@ -28,7 +28,7 @@ export type SearchItemDto = z.infer; * @property { number } containersCount * @property { number } totalCount */ -export const SearchResponseDtoSchema = z.object({ items: z.array(SearchItemDtoSchema).readonly(), projectsCount: z.number(), bookingsCount: z.number(), containersCount: z.number(), totalCount: z.number() }).readonly(); +export const SearchResponseDtoSchema = z.object({ items: z.array(SearchItemDtoSchema), projectsCount: z.number(), bookingsCount: z.number(), containersCount: z.number(), totalCount: z.number() }); export type SearchResponseDto = z.infer; /** @@ -36,7 +36,7 @@ export type SearchResponseDto = z.infer; * @type { object } * @property { string } search */ -export const SearchRequestDtoSchema = z.object({ search: z.string() }).readonly(); +export const SearchRequestDtoSchema = z.object({ search: z.string() }); export type SearchRequestDto = z.infer; } diff --git a/test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts b/test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts index 11200f8..4f95297 100644 --- a/test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts +++ b/test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -20,12 +19,12 @@ export const moduleName = QueryModule.ControlTowerSearch; * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useSearch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useSearch = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data, type, limit }) => - ControlTowerSearchApi.search(data, type, limit, config) + ControlTowerSearchApi.search(data, type, limit) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/countries/countries.api.ts b/test/generated/next/countries/countries.api.ts index 7363457..a40357c 100644 --- a/test/generated/next/countries/countries.api.ts +++ b/test/generated/next/countries/countries.api.ts @@ -1,47 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CountriesModels } from "./countries.models"; export namespace CountriesApi { -export const paginate = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: CountriesModels.CountriesPaginateResponseSchema }, `/countries/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginateCountryLabels = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateCountryLabels = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, `/countries/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const getCountryById = (id: string, config?: AxiosRequestConfig) => { +export const getCountryById = (id: string, ) => { return AppRestClient.get( { resSchema: CountriesModels.CountryResponseDTOSchema }, `/countries/${id}`, - config + ) }; } diff --git a/test/generated/next/countries/countries.models.ts b/test/generated/next/countries/countries.models.ts index 335259c..70ffc2c 100644 --- a/test/generated/next/countries/countries.models.ts +++ b/test/generated/next/countries/countries.models.ts @@ -8,7 +8,7 @@ export namespace CountriesModels { * @property { string } id * @property { string } name */ -export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type CountryEmployeeDTO = z.infer; /** @@ -26,7 +26,7 @@ export type CountryEmployeeDTO = z.infer; * @property { CountryEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const CountryResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the country"), name: z.string().describe("Name of the country"), isoCode2: z.string().describe("ISO 2-letter code"), isoCode3: z.string().describe("ISO 3-letter code"), currencyNotation: z.string().describe("Currency notation"), createdById: z.string().nullish(), createdBy: CountryEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CountryEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const CountryResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string(), currencyNotation: z.string(), createdById: z.string().nullish(), createdBy: CountryEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CountryEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type CountryResponseDTO = z.infer; /** @@ -34,7 +34,7 @@ export type CountryResponseDTO = z.infer; * @type { object } * @property { string } search */ -export const CountryPaginationFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export const CountryPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); export type CountryPaginationFilterDto = z.infer; /** @@ -55,7 +55,7 @@ export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSc * @property { number } totalItems Total available items * @property { CountryResponseDTO[] } items */ -export const CountriesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CountryResponseDTOSchema).readonly() }).readonly().shape }); +export const CountriesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CountryResponseDTOSchema).nullable() }).partial().shape }); export type CountriesPaginateResponse = z.infer; /** @@ -76,7 +76,7 @@ export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderPar * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const PaginateCountryLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const PaginateCountryLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type PaginateCountryLabelsResponse = z.infer; } diff --git a/test/generated/next/countries/countries.queries.ts b/test/generated/next/countries/countries.queries.ts index 911e551..e6a56f4 100644 --- a/test/generated/next/countries/countries.queries.ts +++ b/test/generated/next/countries/countries.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -32,14 +31,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, page, cursor, config) }, + return CountriesApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -57,14 +56,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return CountriesApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -87,14 +86,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateCountryLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateCountryLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor, config) }, + return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -112,14 +111,14 @@ export const usePaginateCountryLabels = ({ limit, order, filter, page, cu * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateCountryLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateCountryLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor, config) }, + return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -138,14 +137,14 @@ export const usePaginateCountryLabelsInfinite = ({ limit, order, filter, * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetCountryById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCountryById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getCountryById(id), queryFn: () => { checkAcl(CountriesAcl.canUseGetCountryById()); - return CountriesApi.getCountryById(id, config) }, + return CountriesApi.getCountryById(id) }, ...options, }); }; diff --git a/test/generated/next/currencies/currencies.api.ts b/test/generated/next/currencies/currencies.api.ts index 721f437..f989e32 100644 --- a/test/generated/next/currencies/currencies.api.ts +++ b/test/generated/next/currencies/currencies.api.ts @@ -1,77 +1,73 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CurrenciesModels } from "./currencies.models"; export namespace CurrenciesApi { -export const list = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: CurrenciesModels.CurrenciesListResponseSchema }, `/currencies`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, config?: AxiosRequestConfig) => { +export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, ) => { return AppRestClient.post( { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, `/currencies`, ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), - config + ) }; -export const paginateCurrencyLabels = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateCurrencyLabels = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, `/currencies/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const getCurrencyById = (isoCode: string, config?: AxiosRequestConfig) => { +export const getCurrencyById = (isoCode: string, ) => { return AppRestClient.get( { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, `/currencies/${isoCode}`, - config + ) }; -export const updateCurrency = (isoCode: string, data: CurrenciesModels.UpdateCurrencyRequestDTO, config?: AxiosRequestConfig) => { +export const updateCurrency = (isoCode: string, data: CurrenciesModels.UpdateCurrencyRequestDTO, ) => { return AppRestClient.patch( { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, `/currencies/${isoCode}`, ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), - config + ) }; -export const paginateCurrencyLabelsByOffice = (officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateCurrencyLabelsByOffice = (officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, `/offices/${officeId}/currencies/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) diff --git a/test/generated/next/currencies/currencies.models.ts b/test/generated/next/currencies/currencies.models.ts index 560fc3c..1124eaf 100644 --- a/test/generated/next/currencies/currencies.models.ts +++ b/test/generated/next/currencies/currencies.models.ts @@ -8,7 +8,7 @@ export namespace CurrenciesModels { * @property { string } id * @property { string } name */ -export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type CurrencyEmployeeDTO = z.infer; /** @@ -25,7 +25,7 @@ export type CurrencyEmployeeDTO = z.infer; * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency * @property { string } updatedAt Date when the currency was last updated */ -export const CurrencyResponseDtoSchema = z.object({ isoCode: z.string().describe("isoCode of the currency"), name: z.string().describe("Name of the currency"), symbol: z.string().describe("Symbol of the currency").nullish(), alignment: z.string().describe("Alignment of the currency").nullish(), createdById: z.string().describe("ID of the employee who created this currency").nullish(), createdBy: CurrencyEmployeeDTOSchema.describe("Employee who created this currency").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Date when the currency was created"), updatedById: z.string().describe("ID of the employee who last updated this currency").nullish(), updatedBy: CurrencyEmployeeDTOSchema.describe("Employee who last updated this currency").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Date when the currency was last updated") }).readonly(); +export const CurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string(), symbol: z.string().nullish(), alignment: z.string().nullish(), createdById: z.string().nullish(), createdBy: CurrencyEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CurrencyEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type CurrencyResponseDto = z.infer; /** @@ -34,7 +34,7 @@ export type CurrencyResponseDto = z.infer; * @property { string } officeId * @property { string } search */ -export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string(), search: z.string() }).readonly(); +export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string().nullable(), search: z.string().nullable() }).partial(); export type CurrencyPaginationFilterDto = z.infer; /** @@ -45,7 +45,7 @@ export type CurrencyPaginationFilterDto = z.infer; /** @@ -53,7 +53,7 @@ export type CreateCurrencyRequestDTO = z.infer; /** @@ -74,7 +74,7 @@ export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.e * @property { number } totalItems Total available items * @property { CurrencyResponseDto[] } items */ -export const CurrenciesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CurrencyResponseDtoSchema).readonly() }).readonly().shape }); +export const CurrenciesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CurrencyResponseDtoSchema).nullable() }).partial().shape }); export type CurrenciesListResponse = z.infer; /** @@ -95,7 +95,7 @@ export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderP * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const PaginateCurrencyLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const PaginateCurrencyLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type PaginateCurrencyLabelsResponse = z.infer; /** @@ -116,7 +116,7 @@ export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabe * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type PaginateCurrencyLabelsByOfficeResponse = z.infer; } diff --git a/test/generated/next/currencies/currencies.queries.ts b/test/generated/next/currencies/currencies.queries.ts index ba31720..0758b4a 100644 --- a/test/generated/next/currencies/currencies.queries.ts +++ b/test/generated/next/currencies/currencies.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -35,14 +34,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(limit, order, filter, page, cursor), queryFn: () => { checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, page, cursor, config) }, + return CurrenciesApi.list(limit, order, filter, page, cursor) }, ...options, }); }; @@ -60,14 +59,14 @@ export const useList = ({ limit, order, filter, page, cursor }: { limit: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, pageParam, cursor, config) }, + return CurrenciesApi.list(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -86,14 +85,14 @@ export const useListInfinite = ({ limit, order, filter, cursor }: { limit * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateCurrency = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateCurrency = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(CurrenciesAcl.canUseCreateCurrency()); - return CurrenciesApi.createCurrency(data, config) + return CurrenciesApi.createCurrency(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -116,14 +115,14 @@ export const useCreateCurrency = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateCurrencyLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateCurrencyLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor, config) }, + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -141,14 +140,14 @@ export const usePaginateCurrencyLabels = ({ limit, order, filter, page, c * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateCurrencyLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateCurrencyLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor, config) }, + return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -167,14 +166,14 @@ export const usePaginateCurrencyLabelsInfinite = ({ limit, order, filter, * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetCurrencyById = ({ isoCode }: { isoCode: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCurrencyById = ({ isoCode }: { isoCode: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getCurrencyById(isoCode), queryFn: () => { checkAcl(CurrenciesAcl.canUseGetCurrencyById()); - return CurrenciesApi.getCurrencyById(isoCode, config) }, + return CurrenciesApi.getCurrencyById(isoCode) }, ...options, }); }; @@ -189,14 +188,14 @@ export const useGetCurrencyById = ({ isoCode }: { isoCode: string }, opti * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateCurrency = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateCurrency = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ isoCode, data }) => { checkAcl(CurrenciesAcl.canUseUpdateCurrency()); - return CurrenciesApi.updateCurrency(isoCode, data, config) + return CurrenciesApi.updateCurrency(isoCode, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -222,14 +221,14 @@ export const useUpdateCurrency = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateCurrencyLabelsByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateCurrencyLabelsByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor, config) }, + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -248,14 +247,14 @@ export const usePaginateCurrencyLabelsByOffice = ({ officeId, limit, orde * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateCurrencyLabelsByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateCurrencyLabelsByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor, config) }, + return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; diff --git a/test/generated/next/customerAccount/customerAccount.api.ts b/test/generated/next/customerAccount/customerAccount.api.ts index 360b9b1..6f77176 100644 --- a/test/generated/next/customerAccount/customerAccount.api.ts +++ b/test/generated/next/customerAccount/customerAccount.api.ts @@ -1,13 +1,12 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { CustomerAccountModels } from "./customerAccount.models"; export namespace CustomerAccountApi { -export const get = (config?: AxiosRequestConfig) => { +export const get = () => { return AppRestClient.get( { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, `/customers/account`, - config + ) }; } diff --git a/test/generated/next/customerAccount/customerAccount.models.ts b/test/generated/next/customerAccount/customerAccount.models.ts index 4e0da5a..2656a0e 100644 --- a/test/generated/next/customerAccount/customerAccount.models.ts +++ b/test/generated/next/customerAccount/customerAccount.models.ts @@ -7,7 +7,7 @@ export namespace CustomerAccountModels { * @property { string } id Company ID * @property { string } name Company name */ -export const CustomerCompanyDtoSchema = z.object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name").nullish() }).readonly(); +export const CustomerCompanyDtoSchema = z.object({ id: z.string(), name: z.string().nullish() }); export type CustomerCompanyDto = z.infer; /** @@ -16,7 +16,7 @@ export type CustomerCompanyDto = z.infer; * @property { string } id Company ID * @property { string } name Company name */ -export const CustomerBusinessPartnerDtoSchema = z.object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name") }).readonly(); +export const CustomerBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); export type CustomerBusinessPartnerDto = z.infer; /** @@ -31,7 +31,7 @@ export type CustomerBusinessPartnerDto = z.infer; } diff --git a/test/generated/next/customerAccount/customerAccount.queries.ts b/test/generated/next/customerAccount/customerAccount.queries.ts index 38f8624..daf37c4 100644 --- a/test/generated/next/customerAccount/customerAccount.queries.ts +++ b/test/generated/next/customerAccount/customerAccount.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions } from "@povio/openapi-codegen-cli"; @@ -19,12 +18,11 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = (options?: AppQueryOptions) => { return useQuery({ queryKey: keys.get(), - queryFn: () => - CustomerAccountApi.get(config), + queryFn: CustomerAccountApi.get, ...options, }); }; diff --git a/test/generated/next/customers/customers.api.ts b/test/generated/next/customers/customers.api.ts index 0f87f69..e418796 100644 --- a/test/generated/next/customers/customers.api.ts +++ b/test/generated/next/customers/customers.api.ts @@ -1,70 +1,66 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CustomersModels } from "./customers.models"; export namespace CustomersApi { -export const findProfile = (config?: AxiosRequestConfig) => { +export const findProfile = () => { return AppRestClient.get( { resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, `/customers/me`, - config + ) }; -export const create = (data: CustomersModels.CreateCustomerDTO, config?: AxiosRequestConfig) => { +export const create = (data: CustomersModels.CreateCustomerDTO, ) => { return AppRestClient.post( { resSchema: CustomersModels.CustomerResponseDTOSchema }, `/customers`, ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), - config + ) }; -export const list = (limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: CustomersModels.CustomersListResponseSchema }, `/customers`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (customerId: string, config?: AxiosRequestConfig) => { +export const findById = (customerId: string, ) => { return AppRestClient.get( { resSchema: CustomersModels.CustomerResponseDTOSchema }, `/customers/${customerId}`, - config + ) }; -export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, config?: AxiosRequestConfig) => { +export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, ) => { return AppRestClient.put( { resSchema: CustomersModels.CustomerResponseDTOSchema }, `/customers/${customerId}`, ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), - config + ) }; -export const deactivate = (id: string, config?: AxiosRequestConfig) => { +export const deactivate = (id: string, ) => { return AppRestClient.post( { resSchema: CustomersModels.CustomerResponseDTOSchema }, `/customers/${id}/deactivate`, - undefined, - config + ) }; -export const reactivate = (id: string, config?: AxiosRequestConfig) => { +export const reactivate = (id: string, ) => { return AppRestClient.post( { resSchema: CustomersModels.CustomerResponseDTOSchema }, `/customers/${id}/reactivate`, - undefined, - config + ) }; } diff --git a/test/generated/next/customers/customers.models.ts b/test/generated/next/customers/customers.models.ts index e12d751..bf5e842 100644 --- a/test/generated/next/customers/customers.models.ts +++ b/test/generated/next/customers/customers.models.ts @@ -8,7 +8,7 @@ export namespace CustomersModels { * @property { string } id * @property { string } name */ -export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); export type CustomerProfileBusinessPartnerDto = z.infer; /** @@ -23,7 +23,7 @@ export type CustomerProfileBusinessPartnerDto = z.infer; /** @@ -32,7 +32,7 @@ export type CustomerProfileResponseDTO = z.infer; /** @@ -48,7 +48,7 @@ export type CustomerBusinessPartnerResponseDto = z.infer; /** @@ -57,7 +57,7 @@ export type CustomerResponseDTO = z.infer; * @property { string } id * @property { string } name */ -export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); export type CustomerListItemBusinessPartnerDto = z.infer; /** @@ -72,7 +72,7 @@ export type CustomerListItemBusinessPartnerDto = z.infer; /** @@ -85,7 +85,7 @@ export type CustomerListItemDTO = z.infer; * @property { string } companyId Company id of the customer * @property { string } businessPartnerId Business partner id of the customer */ -export const CreateCustomerDTOSchema = z.object({ firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.email().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer").nullish(), companyId: z.string().describe("Company id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner id of the customer").nullish() }).readonly(); +export const CreateCustomerDTOSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string().nullish(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish() }); export type CreateCustomerDTO = z.infer; /** @@ -98,7 +98,7 @@ export type CreateCustomerDTO = z.infer; * @property { string } businessPartnerId * @property { string } search */ -export const CustomerPaginationFilterDtoSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.string(), companyId: z.string(), businessPartnerId: z.string(), search: z.string() }).readonly(); +export const CustomerPaginationFilterDtoSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), companyId: z.string().nullable(), businessPartnerId: z.string().nullable(), search: z.string().nullable() }).partial(); export type CustomerPaginationFilterDto = z.infer; /** @@ -110,7 +110,7 @@ export type CustomerPaginationFilterDto = z.infer; /** @@ -131,7 +131,7 @@ export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enu * @property { number } totalItems Total available items * @property { CustomerListItemDTO[] } items */ -export const CustomersListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CustomerListItemDTOSchema).readonly() }).readonly().shape }); +export const CustomersListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CustomerListItemDTOSchema).nullable() }).partial().shape }); export type CustomersListResponse = z.infer; } diff --git a/test/generated/next/customers/customers.queries.ts b/test/generated/next/customers/customers.queries.ts index 44fef2d..e187d61 100644 --- a/test/generated/next/customers/customers.queries.ts +++ b/test/generated/next/customers/customers.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,12 +25,11 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindProfile = (options?: AppQueryOptions) => { return useQuery({ queryKey: keys.findProfile(), - queryFn: () => - CustomersApi.findProfile(config), + queryFn: CustomersApi.findProfile, ...options, }); }; @@ -45,14 +43,14 @@ export const useFindProfile = (options?: AppQueryOptions } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(CustomersAcl.canUseCreate()); - return CustomersApi.create(data, config) + return CustomersApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -75,14 +73,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(limit, order, filter, page, cursor), queryFn: () => { checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, page, cursor, config) }, + return CustomersApi.list(limit, order, filter, page, cursor) }, ...options, }); }; @@ -100,14 +98,14 @@ export const useList = ({ limit, order, filter, page, cursor }: { limit: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, pageParam, cursor, config) }, + return CustomersApi.list(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -126,14 +124,14 @@ export const useListInfinite = ({ limit, order, filter, cursor }: { limit * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ customerId }: { customerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ customerId }: { customerId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(customerId), queryFn: () => { checkAcl(CustomersAcl.canUseFindById()); - return CustomersApi.findById(customerId, config) }, + return CustomersApi.findById(customerId) }, ...options, }); }; @@ -148,14 +146,14 @@ export const useFindById = ({ customerId }: { customerId: string }, optio * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ customerId, data }) => { checkAcl(CustomersAcl.canUseUpdate()); - return CustomersApi.update(customerId, data, config) + return CustomersApi.update(customerId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -176,14 +174,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useDeactivate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeactivate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(CustomersAcl.canUseDeactivate()); - return CustomersApi.deactivate(id, config) + return CustomersApi.deactivate(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -202,14 +200,14 @@ export const useDeactivate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useReactivate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useReactivate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(CustomersAcl.canUseReactivate()); - return CustomersApi.reactivate(id, config) + return CustomersApi.reactivate(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/depots/depots.api.ts b/test/generated/next/depots/depots.api.ts index 0bd409f..5b6a5b3 100644 --- a/test/generated/next/depots/depots.api.ts +++ b/test/generated/next/depots/depots.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DepotsModels } from "./depots.models"; export namespace DepotsApi { -export const create = (data: DepotsModels.CreateDepotRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: DepotsModels.CreateDepotRequestDTO, ) => { return AppRestClient.post( { resSchema: DepotsModels.DepotResponseDTOSchema }, `/depots`, ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), - config + ) }; -export const paginate = (limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DepotsModels.DepotsPaginateResponseSchema }, `/depots`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginateLabels = (limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, `/depots/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: DepotsModels.DepotResponseDTOSchema }, `/depots/${id}`, - config + ) }; -export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, ) => { return AppRestClient.put( { resSchema: DepotsModels.DepotResponseDTOSchema }, `/depots/${id}`, ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/depots/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/depots/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/depots/depots.models.ts b/test/generated/next/depots/depots.models.ts index 9ee1c5d..a7395cb 100644 --- a/test/generated/next/depots/depots.models.ts +++ b/test/generated/next/depots/depots.models.ts @@ -8,7 +8,7 @@ export namespace DepotsModels { * @property { string } id * @property { string } name */ -export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }); export type DepotCityDto = z.infer; /** @@ -19,7 +19,7 @@ export type DepotCityDto = z.infer; * @property { string } isoCode2 * @property { string } isoCode3 */ -export const DepotCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export const DepotCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); export type DepotCountryDto = z.infer; /** @@ -31,7 +31,7 @@ export type DepotCountryDto = z.infer; * @property { string } district District name * @property { DepotCountryDto } country */ -export const AddressDTOSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: DepotCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: DepotCountryDtoSchema.nullish() }).readonly(); +export const AddressDTOSchema = z.object({ street: z.string(), zip: z.string(), city: DepotCityDtoSchema.nullish(), district: z.string().nullish(), country: DepotCountryDtoSchema.nullish() }); export type AddressDTO = z.infer; /** @@ -40,7 +40,7 @@ export type AddressDTO = z.infer; * @property { string } id * @property { string } name */ -export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type DepotEmployeeDTO = z.infer; /** @@ -60,7 +60,7 @@ export type DepotEmployeeDTO = z.infer; * @property { DepotEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const DepotResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the depot"), matchCode: z.string().describe("Match code for the depot"), name: z.string().describe("Name of the depot"), shortName: z.string().describe("Short name of the depot").nullish(), additionalInformation: z.string().describe("Additional info of the depot").nullish(), address: AddressDTOSchema.describe("Address details of the depot"), archived: z.boolean(), createdById: z.string().nullish(), createdBy: DepotEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DepotEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const DepotResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), address: AddressDTOSchema, archived: z.boolean(), createdById: z.string().nullish(), createdBy: DepotEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DepotEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type DepotResponseDTO = z.infer; /** @@ -76,7 +76,7 @@ export type DepotResponseDTO = z.infer; * @property { string } cityId City id * @property { string } countryId Country code */ -export const CreateDepotRequestDTOSchema = z.object({ matchCode: z.string().describe("Unique identifier code for the depot"), shortName: z.string().describe("Optional short name for the depot").nullish(), additionalInformation: z.string().nullish(), name: z.string().describe("Full name of the depot"), street: z.string().describe("Street address of the depot"), zip: z.string().describe("ZIP/Postal code"), district: z.string().describe("District information").nullish(), cityId: z.string().describe("City id"), countryId: z.string().describe("Country code") }).readonly(); +export const CreateDepotRequestDTOSchema = z.object({ matchCode: z.string(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), name: z.string(), street: z.string(), zip: z.string(), district: z.string().nullish(), cityId: z.string(), countryId: z.string() }); export type CreateDepotRequestDTO = z.infer; /** @@ -85,7 +85,7 @@ export type CreateDepotRequestDTO = z.infer; * @property { string } search Search term to filter depots by name, matchCode, or shortName * @property { boolean } archived */ -export const DepotPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter depots by name, matchCode, or shortName"), archived: z.boolean() }).readonly(); +export const DepotPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); export type DepotPaginationFilterDto = z.infer; /** @@ -93,7 +93,7 @@ export type DepotPaginationFilterDto = z.infer; /** @@ -109,7 +109,7 @@ export type DepotLabelFilterDto = z.infer; * @property { string } cityId Updated city id * @property { string } countryId Updated country code */ -export const UpdateDepotRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code for the depot"), shortName: z.string().describe("Updated short name"), additionalInformation: z.string().describe("Updated short name"), name: z.string().describe("Updated full name"), street: z.string().describe("Updated street address"), zip: z.string().describe("Updated ZIP/Postal code"), district: z.string().describe("Updated district information"), cityId: z.string().describe("Updated city id"), countryId: z.string().describe("Updated country code") }).readonly(); +export const UpdateDepotRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), additionalInformation: z.string().nullable(), name: z.string().nullable(), street: z.string().nullable(), zip: z.string().nullable(), district: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable() }).partial(); export type UpdateDepotRequestDTO = z.infer; /** @@ -130,7 +130,7 @@ export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.e * @property { number } totalItems Total available items * @property { DepotResponseDTO[] } items */ -export const DepotsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DepotResponseDTOSchema).readonly() }).readonly().shape }); +export const DepotsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DepotResponseDTOSchema).nullable() }).partial().shape }); export type DepotsPaginateResponse = z.infer; /** @@ -151,7 +151,7 @@ export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParam * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const DepotsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const DepotsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type DepotsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/depots/depots.queries.ts b/test/generated/next/depots/depots.queries.ts index 72505fa..49c639f 100644 --- a/test/generated/next/depots/depots.queries.ts +++ b/test/generated/next/depots/depots.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -29,14 +28,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(DepotsAcl.canUseCreate()); - return DepotsApi.create(data, config) + return DepotsApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -59,14 +58,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, page, cursor, config) }, + return DepotsApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -84,14 +83,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return DepotsApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -114,14 +113,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return DepotsApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -139,14 +138,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -165,14 +164,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(DepotsAcl.canUseFindById()); - return DepotsApi.findById(id, config) }, + return DepotsApi.findById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(DepotsAcl.canUseUpdate()); - return DepotsApi.update(id, data, config) + return DepotsApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(DepotsAcl.canUseArchive()); - return DepotsApi.archive(id, config) + return DepotsApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -241,14 +240,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(DepotsAcl.canUseUnarchive()); - return DepotsApi.unarchive(id, config) + return DepotsApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/documentTemplates/documentTemplates.api.ts b/test/generated/next/documentTemplates/documentTemplates.api.ts index 496354d..6b9a31a 100644 --- a/test/generated/next/documentTemplates/documentTemplates.api.ts +++ b/test/generated/next/documentTemplates/documentTemplates.api.ts @@ -1,95 +1,89 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DocumentTemplatesModels } from "./documentTemplates.models"; export namespace DocumentTemplatesApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, `/offices/${officeId}/document-templates/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const list = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, `/offices/${officeId}/document-templates`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (officeId: string, data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, ) => { return AppRestClient.post( { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, `/offices/${officeId}/document-templates`, ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), - config + ) }; -export const findById = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { +export const findById = (documentTemplateId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, `/offices/${officeId}/document-templates/${documentTemplateId}`, - config + ) }; -export const update = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, config?: AxiosRequestConfig) => { +export const update = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, ) => { return AppRestClient.patch( { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, `/offices/${officeId}/document-templates/${documentTemplateId}`, ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), - config + ) }; -export const addRemarkBlock = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, config?: AxiosRequestConfig) => { +export const addRemarkBlock = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, ) => { return AppRestClient.post( { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), - config + ) }; -export const deleteRemarkBlock = (documentTemplateId: string, remarkBlockId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteRemarkBlock = (documentTemplateId: string, remarkBlockId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, - undefined, - config + ) }; -export const archive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { +export const archive = (documentTemplateId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, - undefined, - config + ) }; -export const unarchive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { +export const unarchive = (documentTemplateId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/documentTemplates/documentTemplates.models.ts b/test/generated/next/documentTemplates/documentTemplates.models.ts index 6916a75..5747c5c 100644 --- a/test/generated/next/documentTemplates/documentTemplates.models.ts +++ b/test/generated/next/documentTemplates/documentTemplates.models.ts @@ -8,7 +8,7 @@ export namespace DocumentTemplatesModels { * @property { string } id * @property { string } name */ -export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type DocumentTemplateEmployeeDTO = z.infer; /** @@ -26,7 +26,7 @@ export type DocumentTemplateEmployeeDTO = z.infer; /** @@ -44,7 +44,7 @@ export type DocumentTemplateResponseDTO = z.infer; /** @@ -53,7 +53,7 @@ export type TemplateBlocksDTO = z.infer; * @property { string } name Template name * @property { TemplateBlocksDTO } blocks */ -export const CreateDocumentTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), blocks: TemplateBlocksDTOSchema.nullish() }).readonly(); +export const CreateDocumentTemplateRequestDTOSchema = z.object({ name: z.string(), blocks: TemplateBlocksDTOSchema.nullish() }); export type CreateDocumentTemplateRequestDTO = z.infer; /** @@ -63,7 +63,7 @@ export type CreateDocumentTemplateRequestDTO = z.infer; /** @@ -73,7 +73,7 @@ export type UpdateDocumentTemplateRequestDTO = z.infer; /** @@ -81,7 +81,7 @@ export type CreateRemarkBlockRequestDTO = z.infer; /** @@ -90,7 +90,7 @@ export type DocumentTemplateLabelFilterDto = z.infer; /** @@ -111,7 +111,7 @@ export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPa * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type DocumentTemplatesPaginateLabelsResponse = z.infer; /** @@ -132,7 +132,7 @@ export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderPar * @property { number } totalItems Total available items * @property { DocumentTemplateResponseDTO[] } items */ -export const DocumentTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).readonly() }).readonly().shape }); +export const DocumentTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).nullable() }).partial().shape }); export type DocumentTemplatesListResponse = z.infer; } diff --git a/test/generated/next/documentTemplates/documentTemplates.queries.ts b/test/generated/next/documentTemplates/documentTemplates.queries.ts index 6d6f164..1a3f849 100644 --- a/test/generated/next/documentTemplates/documentTemplates.queries.ts +++ b/test/generated/next/documentTemplates/documentTemplates.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -34,14 +33,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -60,14 +59,14 @@ export const usePaginateLabels = ({ officeId, limit, order, filter, page, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -91,14 +90,14 @@ export const usePaginateLabelsInfinite = ({ officeId, limit, order, filte * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); - return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor, config) }, + return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -117,14 +116,14 @@ export const useList = ({ officeId, limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); - return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -144,14 +143,14 @@ export const useListInfinite = ({ officeId, limit, order, filter, cursor * @returns { UseMutationResult } * @statusCodes [201, 401, 409] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId } )); - return DocumentTemplatesApi.create(officeId, data, config) + return DocumentTemplatesApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -171,14 +170,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401, 404] */ -export const useFindById = ({ documentTemplateId, officeId }: { documentTemplateId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ documentTemplateId, officeId }: { documentTemplateId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(documentTemplateId, officeId), queryFn: () => { checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId } )); - return DocumentTemplatesApi.findById(documentTemplateId, officeId, config) }, + return DocumentTemplatesApi.findById(documentTemplateId, officeId) }, ...options, }); }; @@ -194,14 +193,14 @@ export const useFindById = ({ documentTemplateId, officeId }: { documentT * @returns { UseMutationResult } * @statusCodes [200, 401, 404, 409] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ documentTemplateId, officeId, data }) => { checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId } )); - return DocumentTemplatesApi.update(documentTemplateId, officeId, data, config) + return DocumentTemplatesApi.update(documentTemplateId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -224,14 +223,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useAddRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useAddRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ documentTemplateId, officeId, data }) => { checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId } )); - return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data, config) + return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -254,14 +253,14 @@ export const useAddRemarkBlock = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useDeleteRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId } )); - return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId, config) + return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -283,14 +282,14 @@ export const useDeleteRemarkBlock = (options?: AppMutationOptions } * @statusCodes [200, 401, 404, 409] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ documentTemplateId, officeId }) => { checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId } )); - return DocumentTemplatesApi.archive(documentTemplateId, officeId, config) + return DocumentTemplatesApi.archive(documentTemplateId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -312,14 +311,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401, 404, 409] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ documentTemplateId, officeId }) => { checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId } )); - return DocumentTemplatesApi.unarchive(documentTemplateId, officeId, config) + return DocumentTemplatesApi.unarchive(documentTemplateId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts index a351427..094141a 100644 --- a/test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts +++ b/test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts @@ -1,30 +1,28 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; import { CommonModels } from "@/data/common/common.models"; export namespace DunningAccountStatementApi { -export const dataGenFake = (config?: AxiosRequestConfig) => { +export const dataGenFake = () => { return AppRestClient.get( { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, `/data-gen-fake/account-statement`, - config + ) }; -export const generateAccountStatement = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const generateAccountStatement = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/account-statement`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, headers: { 'Accept': 'application/pdf', @@ -34,13 +32,12 @@ export const generateAccountStatement = (officeId: string, limit: number, order? } ) }; -export const getAccountStatementEml = (officeId: string, data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, config?: AxiosRequestConfig) => { +export const getAccountStatementEml = (officeId: string, data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/account-statement/eml`, ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), { - ...config, headers: { 'Accept': 'application/octet-stream', }, diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts index 40e5f92..83d04d1 100644 --- a/test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts +++ b/test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts @@ -13,7 +13,7 @@ export namespace DunningAccountStatementModels { * @property { number } outstandingAmount * @property { string } currencyNotation */ -export const AccountStatementPdfPayloadInvoiceDtoSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }), dueDays: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string() }).readonly(); +export const AccountStatementPdfPayloadInvoiceDtoSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }), dueDays: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string() }); export type AccountStatementPdfPayloadInvoiceDto = z.infer; /** @@ -24,7 +24,7 @@ export type AccountStatementPdfPayloadInvoiceDto = z.infer; /** @@ -34,7 +34,7 @@ export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer; /** @@ -45,7 +45,7 @@ export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer; /** @@ -57,7 +57,7 @@ export type AccountStatementPdfPayloadBankAccountDto = z.infer; /** @@ -69,7 +69,7 @@ export type AccountStatementPdfPayloadDTO = z.infer; /** diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts index 6c56860..4ac5c03 100644 --- a/test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts +++ b/test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,12 +25,11 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useDataGenFake = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useDataGenFake = (options?: AppQueryOptions) => { return useQuery({ queryKey: keys.dataGenFake(), - queryFn: () => - DunningAccountStatementApi.dataGenFake(config), + queryFn: DunningAccountStatementApi.dataGenFake, ...options, }); }; @@ -50,14 +48,14 @@ export const useDataGenFake = (options?: AppQueryOptions> } * @statusCodes [200, 401] */ -export const useGenerateAccountStatement = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGenerateAccountStatement = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor, config) }, + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -76,14 +74,14 @@ export const useGenerateAccountStatement = ({ officeId, limit, order, fil * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const useGenerateAccountStatementMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateAccountStatementMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor, config) + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -109,14 +107,14 @@ export const useGenerateAccountStatementMutation = (options?: AppMutationOptions * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useGenerateAccountStatementInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useGenerateAccountStatementInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, pageParam, cursor, config) }, + return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -136,14 +134,14 @@ export const useGenerateAccountStatementInfinite = ({ officeId, limit, or * @returns { UseMutationResult> } * @statusCodes [200, 201, 401] */ -export const useGetAccountStatementEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGetAccountStatementEml = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId } )); - return DunningAccountStatementApi.getAccountStatementEml(officeId, data, config) + return DunningAccountStatementApi.getAccountStatementEml(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/dunningLevels/dunningLevels.api.ts b/test/generated/next/dunningLevels/dunningLevels.api.ts index 6a93d2f..9829ae1 100644 --- a/test/generated/next/dunningLevels/dunningLevels.api.ts +++ b/test/generated/next/dunningLevels/dunningLevels.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DunningLevelsModels } from "./dunningLevels.models"; export namespace DunningLevelsApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, `/offices/${officeId}/dunning-levels/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const list = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, `/offices/${officeId}/dunning-levels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (officeId: string, data: DunningLevelsModels.CreateDunningLevelRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: DunningLevelsModels.CreateDunningLevelRequestDTO, ) => { return AppRestClient.post( { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, `/offices/${officeId}/dunning-levels`, ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), - config + ) }; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, `/offices/${officeId}/dunning-levels/${id}`, - config + ) }; -export const update = (id: string, officeId: string, data: DunningLevelsModels.UpdateDunningLevelRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, officeId: string, data: DunningLevelsModels.UpdateDunningLevelRequestDTO, ) => { return AppRestClient.patch( { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, `/offices/${officeId}/dunning-levels/${id}`, ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, `/offices/${officeId}/dunning-levels/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, `/offices/${officeId}/dunning-levels/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/dunningLevels/dunningLevels.models.ts b/test/generated/next/dunningLevels/dunningLevels.models.ts index ed66cf5..a19a7cf 100644 --- a/test/generated/next/dunningLevels/dunningLevels.models.ts +++ b/test/generated/next/dunningLevels/dunningLevels.models.ts @@ -9,7 +9,7 @@ export namespace DunningLevelsModels { * @property { string } name * @property { string } currencyNotation */ -export const DunningLevelOfficeDTOSchema = z.object({ id: z.string(), name: z.string(), currencyNotation: z.string() }).readonly(); +export const DunningLevelOfficeDTOSchema = z.object({ id: z.string(), name: z.string(), currencyNotation: z.string() }); export type DunningLevelOfficeDTO = z.infer; /** @@ -18,7 +18,7 @@ export type DunningLevelOfficeDTO = z.infer; * @property { string } id * @property { string } name */ -export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type DunningLevelEmployeeDTO = z.infer; /** @@ -42,7 +42,7 @@ export type DunningLevelEmployeeDTO = z.infer; /** @@ -56,7 +56,7 @@ export type DunningLevelResponseDTO = z.infer; /** @@ -70,7 +70,7 @@ export type CreateDunningLevelRequestDTO = z.infer; /** @@ -78,7 +78,7 @@ export type UpdateDunningLevelRequestDTO = z.infer; /** @@ -88,7 +88,7 @@ export type DunningLevelLabelFilterDto = z.infer; /** @@ -109,7 +109,7 @@ export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLa * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const DunningLevelsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const DunningLevelsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type DunningLevelsPaginateLabelsResponse = z.infer; /** @@ -130,7 +130,7 @@ export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSc * @property { number } totalItems Total available items * @property { DunningLevelResponseDTO[] } items */ -export const DunningLevelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningLevelResponseDTOSchema).readonly() }).readonly().shape }); +export const DunningLevelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningLevelResponseDTOSchema).nullable() }).partial().shape }); export type DunningLevelsListResponse = z.infer; } diff --git a/test/generated/next/dunningLevels/dunningLevels.queries.ts b/test/generated/next/dunningLevels/dunningLevels.queries.ts index 98ba1a5..b75b7a0 100644 --- a/test/generated/next/dunningLevels/dunningLevels.queries.ts +++ b/test/generated/next/dunningLevels/dunningLevels.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -34,14 +33,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -60,14 +59,14 @@ export const usePaginateLabels = ({ officeId, limit, order, filter, page, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -91,14 +90,14 @@ export const usePaginateLabelsInfinite = ({ officeId, limit, order, filte * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(DunningLevelsAcl.canUseList({ officeId } )); - return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor, config) }, + return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -117,14 +116,14 @@ export const useList = ({ officeId, limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DunningLevelsAcl.canUseList({ officeId } )); - return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -144,14 +143,14 @@ export const useListInfinite = ({ officeId, limit, order, filter, cursor * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(DunningLevelsAcl.canUseCreate({ officeId } )); - return DunningLevelsApi.create(officeId, data, config) + return DunningLevelsApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -171,14 +170,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id, officeId), queryFn: () => { checkAcl(DunningLevelsAcl.canUseFindById({ officeId } )); - return DunningLevelsApi.findById(id, officeId, config) }, + return DunningLevelsApi.findById(id, officeId) }, ...options, }); }; @@ -194,14 +193,14 @@ export const useFindById = ({ id, officeId }: { id: string, officeId: str * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId, data }) => { checkAcl(DunningLevelsAcl.canUseUpdate({ officeId } )); - return DunningLevelsApi.update(id, officeId, data, config) + return DunningLevelsApi.update(id, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -223,14 +222,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(DunningLevelsAcl.canUseArchive({ officeId } )); - return DunningLevelsApi.archive(id, officeId, config) + return DunningLevelsApi.archive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -252,14 +251,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId } )); - return DunningLevelsApi.unarchive(id, officeId, config) + return DunningLevelsApi.unarchive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/dunningManagement/dunningManagement.api.ts b/test/generated/next/dunningManagement/dunningManagement.api.ts index 7445607..5b706b4 100644 --- a/test/generated/next/dunningManagement/dunningManagement.api.ts +++ b/test/generated/next/dunningManagement/dunningManagement.api.ts @@ -1,47 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DunningManagementModels } from "./dunningManagement.models"; export namespace DunningManagementApi { -export const listDunnings = (officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const listDunnings = (officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DunningManagementModels.ListDunningsResponseSchema }, `/offices/${officeId}/dunnings`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const createDunningWithInvoices = (partnerId: string, officeId: string, data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, config?: AxiosRequestConfig) => { +export const createDunningWithInvoices = (partnerId: string, officeId: string, data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, ) => { return AppRestClient.post( { resSchema: DunningManagementModels.DunningResponseDtoSchema }, `/offices/${officeId}/partners/${partnerId}/dunnings`, ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), - config + ) }; -export const dataGenFake = (config?: AxiosRequestConfig) => { +export const dataGenFake = () => { return AppRestClient.get( { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, `/data-gen-fake`, - config + ) }; -export const getDunningEml = (officeId: string, dunningId: string, config?: AxiosRequestConfig) => { +export const getDunningEml = (officeId: string, dunningId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/dunnings/${dunningId}/eml`, { - ...config, headers: { 'Accept': 'application/octet-stream', }, diff --git a/test/generated/next/dunningManagement/dunningManagement.models.ts b/test/generated/next/dunningManagement/dunningManagement.models.ts index 9ab47ce..572426f 100644 --- a/test/generated/next/dunningManagement/dunningManagement.models.ts +++ b/test/generated/next/dunningManagement/dunningManagement.models.ts @@ -10,7 +10,7 @@ export namespace DunningManagementModels { * @property { string } matchCode * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name */ -export const DunningPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); +export const DunningPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); export type DunningPartnerDto = z.infer; /** @@ -19,7 +19,7 @@ export type DunningPartnerDto = z.infer; * @property { string } id * @property { string } name */ -export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }); export type DunningConfirmedByDto = z.infer; /** @@ -48,7 +48,7 @@ export const DunningStatus = DunningStatusSchema.enum; * @property { DunningConfirmedByDto } confirmedBy * @property { string } documentUrl */ -export const DunningResponseDtoSchema = z.object({ id: z.string(), partner: DunningPartnerDtoSchema, level: z.number(), dunningLevelId: z.string().nullish(), status: DunningStatusSchema, invoiceCount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number(), dunningFee: z.number(), createdAt: z.iso.datetime({ offset: true }), statusChangedOn: z.iso.datetime({ offset: true }), confirmedBy: DunningConfirmedByDtoSchema.nullish(), documentUrl: z.string().nullish() }).readonly(); +export const DunningResponseDtoSchema = z.object({ id: z.string(), partner: DunningPartnerDtoSchema, level: z.number(), dunningLevelId: z.string().nullish(), status: DunningStatusSchema, invoiceCount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number(), dunningFee: z.number(), createdAt: z.iso.datetime({ offset: true }), statusChangedOn: z.iso.datetime({ offset: true }), confirmedBy: DunningConfirmedByDtoSchema.nullish(), documentUrl: z.string().nullish() }); export type DunningResponseDto = z.infer; /** @@ -63,7 +63,7 @@ export type DunningResponseDto = z.infer; * @property { string } createdTo Created to (ISO date string) * @property { string } confirmedBy Confirmed by employee ID */ -export const DunningFilterDtoSchema = z.object({ status: z.array(DunningStatusSchema).readonly(), partnerId: z.string().describe("Partner ID to filter by"), level: z.array(z.array(z.any()).readonly()).readonly().describe("Dunning level(s) to filter by"), outstandingAmountMin: z.number().describe("Minimum outstanding amount"), outstandingAmountMax: z.number().describe("Maximum outstanding amount"), createdFrom: z.iso.datetime({ offset: true }).describe("Created from (ISO date string)"), createdTo: z.iso.datetime({ offset: true }).describe("Created to (ISO date string)"), confirmedBy: z.string().describe("Confirmed by employee ID") }).readonly(); +export const DunningFilterDtoSchema = z.object({ status: z.array(DunningStatusSchema).nullable(), partnerId: z.string().nullable(), level: z.array(z.array(z.any())).nullable(), outstandingAmountMin: z.number().nullable(), outstandingAmountMax: z.number().nullable(), createdFrom: z.iso.datetime({ offset: true }).nullable(), createdTo: z.iso.datetime({ offset: true }).nullable(), confirmedBy: z.string().nullable() }).partial(); export type DunningFilterDto = z.infer; /** @@ -74,7 +74,7 @@ export type DunningFilterDto = z.infer; * @property { boolean } showWatermarkOnDocuments * @property { CommonModels.LocaleEnum } locale */ -export const DunningPdfConfigDTOSchema = z.object({ headerImageUrl: z.string(), footerImageUrl: z.string(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); +export const DunningPdfConfigDTOSchema = z.object({ headerImageUrl: z.string(), footerImageUrl: z.string(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); export type DunningPdfConfigDTO = z.infer; /** @@ -85,7 +85,7 @@ export type DunningPdfConfigDTO = z.infer; * @property { string } address * @property { string } referenceNumber */ -export const DunningPdfBusinessPartnerDTOSchema = z.object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }).readonly(); +export const DunningPdfBusinessPartnerDTOSchema = z.object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }); export type DunningPdfBusinessPartnerDTO = z.infer; /** @@ -101,7 +101,7 @@ export type DunningPdfBusinessPartnerDTO = z.infer; /** @@ -112,7 +112,7 @@ export type DunningPdfInvoiceDTO = z.infer; * @property { number } interest * @property { string } currencyNotation */ -export const DunningPdfTotalDTOSchema = z.object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }).readonly(); +export const DunningPdfTotalDTOSchema = z.object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }); export type DunningPdfTotalDTO = z.infer; /** @@ -123,7 +123,7 @@ export type DunningPdfTotalDTO = z.infer; * @property { string } bankName * @property { string } swiftBic */ -export const DunningPdfBankAccountDTOSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }).readonly(); +export const DunningPdfBankAccountDTOSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }); export type DunningPdfBankAccountDTO = z.infer; /** @@ -137,7 +137,7 @@ export type DunningPdfBankAccountDTO = z.infer; /** @@ -156,7 +156,7 @@ export type DunningPdfUpcomingInvoiceDTO = z.infer; /** @@ -168,7 +168,7 @@ export type DunningPdfPayloadDTO = z.infer; * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` * @property { boolean } includeUpcomingInvoices */ -export const CreateDunningWithInvoicesRequestDTOSchema = z.object({ invoiceIds: z.array(z.string()).readonly().describe("Array of outstanding invoice IDs to include in the dunning"), dunningLevelId: z.string().describe("The ID of the dunning level to use for this dunning"), dunningFee: z.number().gte(0).describe("Optional dunning fee to use. If not provided, the fee from the dunning level will be used").nullish(), interestRate: z.number().gte(0).lte(100).nullish(), includeUpcomingInvoices: z.boolean().nullish() }).readonly(); +export const CreateDunningWithInvoicesRequestDTOSchema = z.object({ invoiceIds: z.array(z.string()), dunningLevelId: z.string(), dunningFee: z.number().gte(0).nullish(), interestRate: z.number().gte(0).lte(100).nullish(), includeUpcomingInvoices: z.boolean().nullish() }); export type CreateDunningWithInvoicesRequestDTO = z.infer; /** @@ -189,7 +189,7 @@ export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; * @property { number } totalItems Total available items * @property { DunningResponseDto[] } items */ -export const ListDunningsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningResponseDtoSchema).readonly() }).readonly().shape }); +export const ListDunningsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningResponseDtoSchema).nullable() }).partial().shape }); export type ListDunningsResponse = z.infer; } diff --git a/test/generated/next/dunningManagement/dunningManagement.queries.ts b/test/generated/next/dunningManagement/dunningManagement.queries.ts index db162c4..53428c9 100644 --- a/test/generated/next/dunningManagement/dunningManagement.queries.ts +++ b/test/generated/next/dunningManagement/dunningManagement.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListDunnings = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListDunnings = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor, config) }, + return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -59,14 +58,14 @@ export const useListDunnings = ({ officeId, limit, order, filter, page, c * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListDunningsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListDunningsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor, config) }, + return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -87,14 +86,14 @@ export const useListDunningsInfinite = ({ officeId, limit, order, filter, * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateDunningWithInvoices = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateDunningWithInvoices = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ partnerId, officeId, data }) => { checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId } )); - return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data, config) + return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -111,12 +110,11 @@ export const useCreateDunningWithInvoices = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useDataGenFake = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useDataGenFake = (options?: AppQueryOptions) => { return useQuery({ queryKey: keys.dataGenFake(), - queryFn: () => - DunningManagementApi.dataGenFake(config), + queryFn: DunningManagementApi.dataGenFake, ...options, }); }; @@ -131,14 +129,14 @@ export const useDataGenFake = (options?: AppQueryOptions> } * @statusCodes [200, 401] */ -export const useGetDunningEml = ({ officeId, dunningId }: { officeId: string, dunningId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetDunningEml = ({ officeId, dunningId }: { officeId: string, dunningId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getDunningEml(officeId, dunningId), queryFn: () => { checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); - return DunningManagementApi.getDunningEml(officeId, dunningId, config) }, + return DunningManagementApi.getDunningEml(officeId, dunningId) }, ...options, }); }; @@ -153,14 +151,14 @@ export const useGetDunningEml = ({ officeId, dunningId }: { officeId: str * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const useGetDunningEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGetDunningEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, dunningId }) => { checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); - return DunningManagementApi.getDunningEml(officeId, dunningId, config) + return DunningManagementApi.getDunningEml(officeId, dunningId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts index 1b8014c..d7cdd8a 100644 --- a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts +++ b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts @@ -1,48 +1,45 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; export namespace DunningPartnerOutstandingInvoicesApi { -export const listPartnerOutstandingInvoiceSummaries = (officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const listPartnerOutstandingInvoiceSummaries = (officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, `/offices/${officeId}/partner-outstanding-invoices`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const listPartnerOutstandingInvoices = (partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const listPartnerOutstandingInvoices = (partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const listRecommendedDunningLevels = (partnerId: string, officeId: string, data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, config?: AxiosRequestConfig) => { +export const listRecommendedDunningLevels = (partnerId: string, officeId: string, data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, ) => { return AppRestClient.post( { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts index 7adfe1f..b07e9f3 100644 --- a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts +++ b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts @@ -13,7 +13,7 @@ export namespace DunningPartnerOutstandingInvoicesModels { * @property { string } dunningSystemId Dunning system ID * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range */ -export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z.object({ search: z.string().describe("Search string (partner name)"), daysOverdueMin: z.number().describe("Minimum days overdue"), partnerId: z.string().describe("Partner ID"), outstandingAmountMin: z.number().describe("Minimum outstanding amount"), currency: z.string().describe("Currency"), dunningSystemId: z.string().describe("Dunning system ID"), lastDunningDate: CommonModels.DateRangeDtoSchema.describe("Last dunning date range") }).readonly(); +export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z.object({ search: z.string().nullable(), daysOverdueMin: z.number().nullable(), partnerId: z.string().nullable(), outstandingAmountMin: z.number().nullable(), currency: z.string().nullable(), dunningSystemId: z.string().nullable(), lastDunningDate: CommonModels.DateRangeDtoSchema.nullable() }).partial(); export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer; /** @@ -30,7 +30,7 @@ export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer; /** @@ -47,7 +47,7 @@ export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer; /** @@ -56,7 +56,7 @@ export type PartnerOutstandingInvoiceResponseDto = z.infer; /** @@ -64,7 +64,7 @@ export type PartnerOutstandingInvoiceFilterDto = z.infer; /** @@ -74,7 +74,7 @@ export type RecommendedDunningLevelsRequestDto = z.infer; /** @@ -95,7 +95,7 @@ export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = ListPartnerO * @property { number } totalItems Total available items * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items */ -export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).readonly() }).readonly().shape }); +export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).nullable() }).partial().shape }); export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer; /** @@ -116,14 +116,14 @@ export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandi * @property { number } totalItems Total available items * @property { PartnerOutstandingInvoiceResponseDto[] } items */ -export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).readonly() }).readonly().shape }); +export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).nullable() }).partial().shape }); export type ListPartnerOutstandingInvoicesResponse = z.infer; /** * ListRecommendedDunningLevelsResponseSchema * @type { array } */ -export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema).readonly(); +export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema); export type ListRecommendedDunningLevelsResponse = z.infer; } diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts index 4a777fa..5e8a555 100644 --- a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts +++ b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListPartnerOutstandingInvoiceSummaries = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListPartnerOutstandingInvoiceSummaries = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor, config) }, + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -59,14 +58,14 @@ export const useListPartnerOutstandingInvoiceSummaries = ({ officeId, lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListPartnerOutstandingInvoiceSummariesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListPartnerOutstandingInvoiceSummariesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, pageParam, cursor, config) }, + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -91,14 +90,14 @@ export const useListPartnerOutstandingInvoiceSummariesInfinite = ({ offic * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListPartnerOutstandingInvoices = ({ partnerId, officeId, limit, order, filter, page, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListPartnerOutstandingInvoices = ({ partnerId, officeId, limit, order, filter, page, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor, config) }, + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -118,14 +117,14 @@ export const useListPartnerOutstandingInvoices = ({ partnerId, officeId, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListPartnerOutstandingInvoicesInfinite = ({ partnerId, officeId, limit, order, filter, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListPartnerOutstandingInvoicesInfinite = ({ partnerId, officeId, limit, order, filter, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, pageParam, cursor, config) }, + return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -146,14 +145,14 @@ export const useListPartnerOutstandingInvoicesInfinite = ({ partnerId, of * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useListRecommendedDunningLevels = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useListRecommendedDunningLevels = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ partnerId, officeId, data }) => { checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data, config) + return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/dunningSystems/dunningSystems.api.ts b/test/generated/next/dunningSystems/dunningSystems.api.ts index 2b609b0..2d584ae 100644 --- a/test/generated/next/dunningSystems/dunningSystems.api.ts +++ b/test/generated/next/dunningSystems/dunningSystems.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { DunningSystemsModels } from "./dunningSystems.models"; export namespace DunningSystemsApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, `/offices/${officeId}/dunning-systems/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginate = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, `/offices/${officeId}/dunning-systems`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (officeId: string, data: DunningSystemsModels.CreateDunningSystemRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: DunningSystemsModels.CreateDunningSystemRequestDTO, ) => { return AppRestClient.post( { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, `/offices/${officeId}/dunning-systems`, ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), - config + ) }; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, `/offices/${officeId}/dunning-systems/${id}`, - config + ) }; -export const update = (id: string, officeId: string, data: DunningSystemsModels.UpdateDunningSystemRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, officeId: string, data: DunningSystemsModels.UpdateDunningSystemRequestDTO, ) => { return AppRestClient.patch( { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, `/offices/${officeId}/dunning-systems/${id}`, ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, `/offices/${officeId}/dunning-systems/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, `/offices/${officeId}/dunning-systems/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/dunningSystems/dunningSystems.models.ts b/test/generated/next/dunningSystems/dunningSystems.models.ts index df46055..164270a 100644 --- a/test/generated/next/dunningSystems/dunningSystems.models.ts +++ b/test/generated/next/dunningSystems/dunningSystems.models.ts @@ -8,7 +8,7 @@ export namespace DunningSystemsModels { * @property { string } id * @property { string } name */ -export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type DunningSystemEmployeeDTO = z.infer; /** @@ -27,7 +27,7 @@ export type DunningSystemEmployeeDTO = z.infer; /** @@ -35,7 +35,7 @@ export type DunningSystemResponseDTO = z.infer; /** @@ -45,7 +45,7 @@ export type DunningSystemLabelFilterDto = z.infer; /** @@ -54,7 +54,7 @@ export type DunningSystemFilterDto = z.infer; /** @@ -63,7 +63,7 @@ export type CreateDunningSystemRequestDTO = z.infer; /** @@ -84,7 +84,7 @@ export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginate * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const DunningSystemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const DunningSystemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type DunningSystemsPaginateLabelsResponse = z.infer; /** @@ -105,7 +105,7 @@ export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderP * @property { number } totalItems Total available items * @property { DunningSystemResponseDTO[] } items */ -export const DunningSystemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningSystemResponseDTOSchema).readonly() }).readonly().shape }); +export const DunningSystemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningSystemResponseDTOSchema).nullable() }).partial().shape }); export type DunningSystemsPaginateResponse = z.infer; } diff --git a/test/generated/next/dunningSystems/dunningSystems.queries.ts b/test/generated/next/dunningSystems/dunningSystems.queries.ts index a25f0a7..7ec4019 100644 --- a/test/generated/next/dunningSystems/dunningSystems.queries.ts +++ b/test/generated/next/dunningSystems/dunningSystems.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -34,14 +33,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -60,14 +59,14 @@ export const usePaginateLabels = ({ officeId, limit, order, filter, page, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -91,14 +90,14 @@ export const usePaginateLabelsInfinite = ({ officeId, limit, order, filte * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); - return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -117,14 +116,14 @@ export const usePaginate = ({ officeId, limit, order, filter, page, curso * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); - return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -144,14 +143,14 @@ export const usePaginateInfinite = ({ officeId, limit, order, filter, cur * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(DunningSystemsAcl.canUseCreate({ officeId } )); - return DunningSystemsApi.create(officeId, data, config) + return DunningSystemsApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -171,14 +170,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id, officeId), queryFn: () => { checkAcl(DunningSystemsAcl.canUseFindById({ officeId } )); - return DunningSystemsApi.findById(id, officeId, config) }, + return DunningSystemsApi.findById(id, officeId) }, ...options, }); }; @@ -194,14 +193,14 @@ export const useFindById = ({ id, officeId }: { id: string, officeId: str * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId, data }) => { checkAcl(DunningSystemsAcl.canUseUpdate({ officeId } )); - return DunningSystemsApi.update(id, officeId, data, config) + return DunningSystemsApi.update(id, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -223,14 +222,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(DunningSystemsAcl.canUseArchive({ officeId } )); - return DunningSystemsApi.archive(id, officeId, config) + return DunningSystemsApi.archive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -252,14 +251,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId } )); - return DunningSystemsApi.unarchive(id, officeId, config) + return DunningSystemsApi.unarchive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/employee/employee.api.ts b/test/generated/next/employee/employee.api.ts index e7cb049..c0430ed 100644 --- a/test/generated/next/employee/employee.api.ts +++ b/test/generated/next/employee/employee.api.ts @@ -1,157 +1,147 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { EmployeeModels } from "./employee.models"; import { CommonModels } from "@/data/common/common.models"; export namespace EmployeeApi { -export const paginate = (limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: EmployeeModels.EmployeePaginateResponseSchema }, `/employees`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: EmployeeModels.EmployeeCreateRequest, config?: AxiosRequestConfig) => { +export const create = (data: EmployeeModels.EmployeeCreateRequest, ) => { return AppRestClient.post( { resSchema: EmployeeModels.EmployeeResponseSchema }, `/employees`, ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), - config + ) }; -export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, config?: AxiosRequestConfig) => { +export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, ) => { return AppRestClient.post( { resSchema: EmployeeModels.EmployeeResponseSchema }, `/employees/one-step`, ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), - config + ) }; -export const findAll = (search?: string, config?: AxiosRequestConfig) => { +export const findAll = (search?: string, ) => { return AppRestClient.get( { resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, `/employees/labels`, { - ...config, params: { search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), }, } ) }; -export const paginateLabels = (limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, `/employees/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const resendOnboarding = (employeeId: string, config?: AxiosRequestConfig) => { +export const resendOnboarding = (employeeId: string, ) => { return AppRestClient.post( { resSchema: CommonModels.StatusResponseDtoSchema }, `/employees/${employeeId}/resend-onboarding`, - undefined, - config + ) }; -export const resendOnboardingWithOffice = (officeId: string, employeeId: string, config?: AxiosRequestConfig) => { +export const resendOnboardingWithOffice = (officeId: string, employeeId: string, ) => { return AppRestClient.post( { resSchema: CommonModels.StatusResponseDtoSchema }, `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, - undefined, - config + ) }; -export const get = (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam, config?: AxiosRequestConfig) => { +export const get = (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam, ) => { return AppRestClient.get( { resSchema: EmployeeModels.EmployeeResponseSchema }, `/employees/${employeeId}`, { - ...config, params: { populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), }, } ) }; -export const update = (employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, config?: AxiosRequestConfig) => { +export const update = (employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, ) => { return AppRestClient.put( { resSchema: EmployeeModels.EmployeeResponseSchema }, `/employees/${employeeId}`, ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - config + ) }; -export const getWithOffice = (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam, config?: AxiosRequestConfig) => { +export const getWithOffice = (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam, ) => { return AppRestClient.get( { resSchema: EmployeeModels.EmployeeResponseSchema }, `/offices/${officeId}/employees/${employeeId}`, { - ...config, params: { populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), }, } ) }; -export const updateWithOffice = (officeId: string, employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, config?: AxiosRequestConfig) => { +export const updateWithOffice = (officeId: string, employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, ) => { return AppRestClient.put( { resSchema: EmployeeModels.EmployeeResponseSchema }, `/offices/${officeId}/employees/${employeeId}`, ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - config + ) }; -export const listRoles = (employeeId: string, config?: AxiosRequestConfig) => { +export const listRoles = (employeeId: string, ) => { return AppRestClient.get( { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, `/employees/${employeeId}/roles`, - config + ) }; -export const updateRoles = (employeeId: string, data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, config?: AxiosRequestConfig) => { +export const updateRoles = (employeeId: string, data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, ) => { return AppRestClient.put( { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, `/employees/${employeeId}/roles`, ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), - config + ) }; -export const archive = (employeeId: string, config?: AxiosRequestConfig) => { +export const archive = (employeeId: string, ) => { return AppRestClient.post( { resSchema: EmployeeModels.EmployeeResponseSchema }, `/employees/${employeeId}/archive`, - undefined, - config + ) }; -export const unarchive = (employeeId: string, config?: AxiosRequestConfig) => { +export const unarchive = (employeeId: string, ) => { return AppRestClient.post( { resSchema: EmployeeModels.EmployeeResponseSchema }, `/employees/${employeeId}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/employee/employee.models.ts b/test/generated/next/employee/employee.models.ts index f63c9a4..7e5c67a 100644 --- a/test/generated/next/employee/employee.models.ts +++ b/test/generated/next/employee/employee.models.ts @@ -19,7 +19,7 @@ export namespace EmployeeModels { * @property { string } createdAt * @property { string } updatedAt */ -export const EmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), locale: CommonModels.LocaleEnumSchema.nullish(), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), primaryOfficeId: z.string().describe("Primary office id").nullish(), primaryOffice: CommonModels.EmployeeOfficeResponseSchema.describe("Primary office").nullish(), employments: z.array(CommonModels.EmploymentResponseSchema).readonly().describe("Employments").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const EmployeeResponseSchema = z.object({ id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), locale: CommonModels.LocaleEnumSchema.nullish(), phone: z.string().nullish(), archived: z.boolean().nullish(), primaryOfficeId: z.string().nullish(), primaryOffice: CommonModels.EmployeeOfficeResponseSchema.nullish(), employments: z.array(CommonModels.EmploymentResponseSchema).nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }); export type EmployeeResponse = z.infer; /** @@ -32,7 +32,7 @@ export type EmployeeResponse = z.infer; * @property { string } primaryOfficeId Primary office ID * @property { string } phone Phone number */ -export const EmployeeCreateRequestSchema = z.object({ firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.email().describe("Email"), locale: CommonModels.LocaleEnumSchema.nullish(), primaryOfficeId: z.string().describe("Primary office ID").nullish(), phone: z.string().describe("Phone number").nullish() }).readonly(); +export const EmployeeCreateRequestSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.email(), locale: CommonModels.LocaleEnumSchema.nullish(), primaryOfficeId: z.string().nullish(), phone: z.string().nullish() }); export type EmployeeCreateRequest = z.infer; /** @@ -41,7 +41,7 @@ export type EmployeeCreateRequest = z.infer; * @property { string } officeId * @property { string[] } roleIds Array of office role IDs */ -export const EmployeeOneStepCreateEmploymentRequestSchema = z.object({ officeId: z.string(), roleIds: z.array(z.string()).readonly().describe("Array of office role IDs").nullish() }).readonly(); +export const EmployeeOneStepCreateEmploymentRequestSchema = z.object({ officeId: z.string(), roleIds: z.array(z.string()).nullish() }); export type EmployeeOneStepCreateEmploymentRequest = z.infer; /** @@ -56,7 +56,7 @@ export type EmployeeOneStepCreateEmploymentRequest = z.infer; /** @@ -68,7 +68,7 @@ export type EmployeeOneStepCreateRequest = z.infer; /** @@ -87,7 +87,7 @@ export type EmployeeUpdateRequest = z.infer; * @property { string } search Free text search multiple fields * @property { string } officeRole Office role */ -export const EmployeeFilterDtoSchema = z.object({ office: z.string().describe("Office ID (single select, offices the user has access to)"), roles: z.array(z.string()).readonly().describe("Role IDs (multiselect)"), primaryOfficeId: z.string().describe("Primary office id"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.string().describe("Email"), ids: z.array(z.string()).readonly().describe("Ids"), archived: z.boolean().describe("Archived\n set to true to only return archived employees\n does not return archived employees by default").default(false), search: z.string().describe("Free text search multiple fields"), officeRole: z.string().describe("Office role") }).readonly(); +export const EmployeeFilterDtoSchema = z.object({ office: z.string().nullable(), roles: z.array(z.string()).nullable(), primaryOfficeId: z.string().nullable(), firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), ids: z.array(z.string()).nullable(), archived: z.boolean().nullable().default(false), search: z.string().nullable(), officeRole: z.string().nullable() }).partial(); export type EmployeeFilterDto = z.infer; /** @@ -95,7 +95,7 @@ export type EmployeeFilterDto = z.infer; * @type { object } * @property { string } search */ -export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); export type EmployeeLabelFilterDto = z.infer; /** @@ -107,7 +107,7 @@ export type EmployeeLabelFilterDto = z.infer; /** @@ -115,7 +115,7 @@ export type EmployeeRoleMemberResponse = z.infer; /** @@ -138,7 +138,7 @@ export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; * EmployeePaginatePopulateParamSchema * @type { array } */ -export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); +export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); export type EmployeePaginatePopulateParam = z.infer; /** @@ -151,14 +151,14 @@ export type EmployeePaginatePopulateParam = z.infer; /** * EmployeeFindAllResponseSchema * @type { array } */ -export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); export type EmployeeFindAllResponse = z.infer; /** @@ -179,21 +179,21 @@ export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderP * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const EmployeePaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const EmployeePaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type EmployeePaginateLabelsResponse = z.infer; /** * EmployeeGetPopulateParamSchema * @type { array } */ -export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); +export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); export type EmployeeGetPopulateParam = z.infer; /** * GetWithOfficePopulateParamSchema * @type { array } */ -export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); +export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); export type GetWithOfficePopulateParam = z.infer; /** @@ -206,7 +206,7 @@ export type GetWithOfficePopulateParam = z.infer; /** @@ -219,7 +219,7 @@ export type EmployeeListRolesResponse = z.infer; } diff --git a/test/generated/next/employee/employee.queries.ts b/test/generated/next/employee/employee.queries.ts index 8881af1..4d934bc 100644 --- a/test/generated/next/employee/employee.queries.ts +++ b/test/generated/next/employee/employee.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -37,14 +36,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, populate, filter, page, cursor), queryFn: () => { checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, page, cursor, config) }, + return EmployeeApi.paginate(limit, order, populate, filter, page, cursor) }, ...options, }); }; @@ -63,14 +62,14 @@ export const usePaginate = ({ limit, order, populate, filter, page, curso * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor, config) }, + return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -89,14 +88,14 @@ export const usePaginateInfinite = ({ limit, order, populate, filter, cur * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(EmployeeAcl.canUseCreate()); - return EmployeeApi.create(data, config) + return EmployeeApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -119,12 +118,12 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useSingeStepCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useSingeStepCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => - EmployeeApi.singeStepCreate(data, config) + EmployeeApi.singeStepCreate(data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -143,14 +142,14 @@ export const useSingeStepCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findAll(search), queryFn: () => { checkAcl(EmployeeAcl.canUseFindAll()); - return EmployeeApi.findAll(search, config) }, + return EmployeeApi.findAll(search) }, ...options, }); }; @@ -168,14 +167,14 @@ export const useFindAll = ({ search }: { search?: string }, options?: App * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return EmployeeApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -193,14 +192,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -218,12 +217,12 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useResendOnboarding = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useResendOnboarding = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ employeeId }) => - EmployeeApi.resendOnboarding(employeeId, config) + EmployeeApi.resendOnboarding(employeeId) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -242,14 +241,14 @@ export const useResendOnboarding = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useResendOnboardingWithOffice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useResendOnboardingWithOffice = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, employeeId }) => { checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId } )); - return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId, config) + return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -270,14 +269,14 @@ export const useResendOnboardingWithOffice = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGet = ({ employeeId, populate }: { employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ employeeId, populate }: { employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(employeeId, populate), queryFn: () => { checkAcl(EmployeeAcl.canUseGet()); - return EmployeeApi.get(employeeId, populate, config) }, + return EmployeeApi.get(employeeId, populate) }, ...options, }); }; @@ -293,14 +292,14 @@ export const useGet = ({ employeeId, populate }: { employeeId: string, po * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ employeeId, data }) => { checkAcl(EmployeeAcl.canUseUpdate()); - return EmployeeApi.update(employeeId, data, config) + return EmployeeApi.update(employeeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -322,14 +321,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetWithOffice = ({ officeId, employeeId, populate }: { officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetWithOffice = ({ officeId, employeeId, populate }: { officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getWithOffice(officeId, employeeId, populate), queryFn: () => { checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId } )); - return EmployeeApi.getWithOffice(officeId, employeeId, populate, config) }, + return EmployeeApi.getWithOffice(officeId, employeeId, populate) }, ...options, }); }; @@ -344,14 +343,14 @@ export const useGetWithOffice = ({ officeId, employeeId, populate }: { of * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateWithOffice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateWithOffice = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, employeeId, data }) => { checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId } )); - return EmployeeApi.updateWithOffice(officeId, employeeId, data, config) + return EmployeeApi.updateWithOffice(officeId, employeeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -372,14 +371,14 @@ export const useUpdateWithOffice = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useListRoles = ({ employeeId }: { employeeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListRoles = ({ employeeId }: { employeeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listRoles(employeeId), queryFn: () => { checkAcl(EmployeeAcl.canUseListRoles()); - return EmployeeApi.listRoles(employeeId, config) }, + return EmployeeApi.listRoles(employeeId) }, ...options, }); }; @@ -394,14 +393,14 @@ export const useListRoles = ({ employeeId }: { employeeId: string }, opti * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ employeeId, data }) => { checkAcl(EmployeeAcl.canUseUpdateRoles()); - return EmployeeApi.updateRoles(employeeId, data, config) + return EmployeeApi.updateRoles(employeeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -420,14 +419,14 @@ export const useUpdateRoles = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ employeeId }) => { checkAcl(EmployeeAcl.canUseArchive()); - return EmployeeApi.archive(employeeId, config) + return EmployeeApi.archive(employeeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -448,14 +447,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ employeeId }) => { checkAcl(EmployeeAcl.canUseUnarchive()); - return EmployeeApi.unarchive(employeeId, config) + return EmployeeApi.unarchive(employeeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/employeeAccount/employeeAccount.api.ts b/test/generated/next/employeeAccount/employeeAccount.api.ts index 7eac01c..22e4d03 100644 --- a/test/generated/next/employeeAccount/employeeAccount.api.ts +++ b/test/generated/next/employeeAccount/employeeAccount.api.ts @@ -1,13 +1,12 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { EmployeeAccountModels } from "./employeeAccount.models"; export namespace EmployeeAccountApi { -export const get = (config?: AxiosRequestConfig) => { +export const get = () => { return AppRestClient.get( { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, `/employees/account`, - config + ) }; } diff --git a/test/generated/next/employeeAccount/employeeAccount.models.ts b/test/generated/next/employeeAccount/employeeAccount.models.ts index 4b3cb64..8f21c37 100644 --- a/test/generated/next/employeeAccount/employeeAccount.models.ts +++ b/test/generated/next/employeeAccount/employeeAccount.models.ts @@ -8,7 +8,7 @@ export namespace EmployeeAccountModels { * @property { string } officeId Office ID * @property { string } officeName Office name */ -export const EmployeeAccountEmploymentDtoSchema = z.object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }).readonly(); +export const EmployeeAccountEmploymentDtoSchema = z.object({ officeId: z.string(), officeName: z.string() }); export type EmployeeAccountEmploymentDto = z.infer; /** @@ -17,7 +17,7 @@ export type EmployeeAccountEmploymentDto = z.infer; /** @@ -27,7 +27,7 @@ export type EmployeeAccountPrimaryOfficeDto = z.infer; /** @@ -47,7 +47,7 @@ export type EmployeeAccountRoleDto = z.infer; } diff --git a/test/generated/next/employeeAccount/employeeAccount.queries.ts b/test/generated/next/employeeAccount/employeeAccount.queries.ts index 3d5b964..ad8f854 100644 --- a/test/generated/next/employeeAccount/employeeAccount.queries.ts +++ b/test/generated/next/employeeAccount/employeeAccount.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions } from "@povio/openapi-codegen-cli"; @@ -19,12 +18,11 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = (options?: AppQueryOptions) => { return useQuery({ queryKey: keys.get(), - queryFn: () => - EmployeeAccountApi.get(config), + queryFn: EmployeeAccountApi.get, ...options, }); }; diff --git a/test/generated/next/employeePermissions/employeePermissions.api.ts b/test/generated/next/employeePermissions/employeePermissions.api.ts index 090ea01..d5bad68 100644 --- a/test/generated/next/employeePermissions/employeePermissions.api.ts +++ b/test/generated/next/employeePermissions/employeePermissions.api.ts @@ -1,32 +1,29 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { EmployeePermissionsModels } from "./employeePermissions.models"; export namespace EmployeePermissionsApi { -export const paginatePermissions = (limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginatePermissions = (limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, `/employees/permissions`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findAll = (search?: string, config?: AxiosRequestConfig) => { +export const findAll = (search?: string, ) => { return AppRestClient.get( { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, `/employees/permissions/labels`, { - ...config, params: { search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), }, diff --git a/test/generated/next/employeePermissions/employeePermissions.models.ts b/test/generated/next/employeePermissions/employeePermissions.models.ts index efe698e..701c149 100644 --- a/test/generated/next/employeePermissions/employeePermissions.models.ts +++ b/test/generated/next/employeePermissions/employeePermissions.models.ts @@ -11,7 +11,7 @@ export namespace EmployeePermissionsModels { * @property { string } description * @property { string } context Scope where this rule is applied */ -export const EmployeePermissionResponseSchema = z.object({ id: z.string().describe("Employee Permission unique identifier"), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied") }).readonly(); +export const EmployeePermissionResponseSchema = z.object({ id: z.string(), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema }); export type EmployeePermissionResponse = z.infer; /** @@ -20,7 +20,7 @@ export type EmployeePermissionResponse = z.infer; /** @@ -41,14 +41,14 @@ export const EmployeePermissionsPaginatePermissionsOrderParamEnum = EmployeePerm * @property { number } totalItems Total available items * @property { EmployeePermissionResponse[] } items */ -export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeePermissionResponseSchema).readonly() }).readonly().shape }); +export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeePermissionResponseSchema).nullable() }).partial().shape }); export type EmployeePermissionsPaginatePermissionsResponse = z.infer; /** * EmployeePermissionsFindAllResponseSchema * @type { array } */ -export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); export type EmployeePermissionsFindAllResponse = z.infer; } diff --git a/test/generated/next/employeePermissions/employeePermissions.queries.ts b/test/generated/next/employeePermissions/employeePermissions.queries.ts index 715d356..8859611 100644 --- a/test/generated/next/employeePermissions/employeePermissions.queries.ts +++ b/test/generated/next/employeePermissions/employeePermissions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -29,14 +28,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginatePermissions = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginatePermissions = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), queryFn: () => { checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor, config) }, + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor) }, ...options, }); }; @@ -53,14 +52,14 @@ export const usePaginatePermissions = ({ limit, order, filter, page, curs * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginatePermissionsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginatePermissionsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor, config) }, + return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -79,14 +78,14 @@ export const usePaginatePermissionsInfinite = ({ limit, order, filter, cu * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findAll(search), queryFn: () => { checkAcl(EmployeePermissionsAcl.canUseFindAll()); - return EmployeePermissionsApi.findAll(search, config) }, + return EmployeePermissionsApi.findAll(search) }, ...options, }); }; diff --git a/test/generated/next/employeeProfile/employeeProfile.api.ts b/test/generated/next/employeeProfile/employeeProfile.api.ts index 8b3c712..745cd77 100644 --- a/test/generated/next/employeeProfile/employeeProfile.api.ts +++ b/test/generated/next/employeeProfile/employeeProfile.api.ts @@ -1,22 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { EmployeeProfileModels } from "./employeeProfile.models"; export namespace EmployeeProfileApi { -export const getProfile = (config?: AxiosRequestConfig) => { +export const getProfile = () => { return AppRestClient.get( { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, `/employee-profile`, - config + ) }; -export const updateProfile = (data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, config?: AxiosRequestConfig) => { +export const updateProfile = (data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, ) => { return AppRestClient.patch( { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, `/employee-profile`, ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/employeeProfile/employeeProfile.models.ts b/test/generated/next/employeeProfile/employeeProfile.models.ts index f67e1c2..7e9d93e 100644 --- a/test/generated/next/employeeProfile/employeeProfile.models.ts +++ b/test/generated/next/employeeProfile/employeeProfile.models.ts @@ -13,7 +13,7 @@ export namespace EmployeeProfileModels { * @property { string } defaultUrl Employee default URL * @property { CommonModels.LocaleEnum } locale Employee locale */ -export const EmployeeProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string().describe("Employee first name"), lastName: z.string().describe("Employee last name"), email: z.string().describe("Employee email"), phone: z.string().describe("Employee phone number").nullish(), defaultUrl: z.string().describe("Employee default URL").nullish(), locale: CommonModels.LocaleEnumSchema.describe("Employee locale").nullish() }).readonly(); +export const EmployeeProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.string(), phone: z.string().nullish(), defaultUrl: z.string().nullish(), locale: CommonModels.LocaleEnumSchema.nullish() }); export type EmployeeProfileResponseDTO = z.infer; /** @@ -27,7 +27,7 @@ export type EmployeeProfileResponseDTO = z.infer; } diff --git a/test/generated/next/employeeProfile/employeeProfile.queries.ts b/test/generated/next/employeeProfile/employeeProfile.queries.ts index a0c77f2..bbcee98 100644 --- a/test/generated/next/employeeProfile/employeeProfile.queries.ts +++ b/test/generated/next/employeeProfile/employeeProfile.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -21,12 +20,11 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetProfile = (options?: AppQueryOptions) => { return useQuery({ queryKey: keys.getProfile(), - queryFn: () => - EmployeeProfileApi.getProfile(config), + queryFn: EmployeeProfileApi.getProfile, ...options, }); }; @@ -39,12 +37,12 @@ export const useGetProfile = (options?: AppQueryOptions } * @statusCodes [200, 401] */ -export const useUpdateProfile = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateProfile = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => - EmployeeProfileApi.updateProfile(data, config) + EmployeeProfileApi.updateProfile(data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/employeeRoles/employeeRoles.api.ts b/test/generated/next/employeeRoles/employeeRoles.api.ts index eb87de3..2139057 100644 --- a/test/generated/next/employeeRoles/employeeRoles.api.ts +++ b/test/generated/next/employeeRoles/employeeRoles.api.ts @@ -1,41 +1,38 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { EmployeeRolesModels } from "./employeeRoles.models"; import { CommonModels } from "@/data/common/common.models"; export namespace EmployeeRolesApi { -export const list = (limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, `/employees/roles`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, config?: AxiosRequestConfig) => { +export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, ) => { return AppRestClient.post( { resSchema: CommonModels.EmployeeRoleResponseSchema }, `/employees/roles`, ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), - config + ) }; -export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, config?: AxiosRequestConfig) => { +export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, ) => { return AppRestClient.get( { resSchema: EmployeeRolesModels.LabelsResponseSchema }, `/employees/roles/labels`, { - ...config, params: { search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { type: "query", name: "context" }), @@ -43,50 +40,49 @@ export const labels = (search?: string, context?: CommonModels.EmployeeRoleConte } ) }; -export const find = (roleId: string, config?: AxiosRequestConfig) => { +export const find = (roleId: string, ) => { return AppRestClient.get( { resSchema: CommonModels.EmployeeRoleResponseSchema }, `/employees/roles/${roleId}`, - config + ) }; -export const update = (roleId: string, data: EmployeeRolesModels.EmployeeRoleUpdateRequest, config?: AxiosRequestConfig) => { +export const update = (roleId: string, data: EmployeeRolesModels.EmployeeRoleUpdateRequest, ) => { return AppRestClient.put( { resSchema: CommonModels.EmployeeRoleResponseSchema }, `/employees/roles/${roleId}`, ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), - config + ) }; -export const deleteEmployeesRolesByRoleId = (roleId: string, config?: AxiosRequestConfig) => { +export const deleteEmployeesRolesByRoleId = (roleId: string, ) => { return AppRestClient.delete( { resSchema: CommonModels.StatusResponseDtoSchema }, `/employees/roles/${roleId}`, - undefined, - config + ) }; -export const paginatePermissions = (roleId: string, config?: AxiosRequestConfig) => { +export const paginatePermissions = (roleId: string, ) => { return AppRestClient.get( { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, `/employees/roles/${roleId}/permissions`, - config + ) }; -export const togglePermission = (roleId: string, permission: string, data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, config?: AxiosRequestConfig) => { +export const togglePermission = (roleId: string, permission: string, data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, ) => { return AppRestClient.post( { resSchema: z.void() }, `/employees/roles/${roleId}/permissions/${permission}/toggle`, ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), - config + ) }; -export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, config?: AxiosRequestConfig) => { +export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, ) => { return AppRestClient.post( { resSchema: CommonModels.EmployeeRoleResponseSchema }, `/employees/roles/${roleId}/copy`, ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/employeeRoles/employeeRoles.models.ts b/test/generated/next/employeeRoles/employeeRoles.models.ts index e3eab5d..f7b3720 100644 --- a/test/generated/next/employeeRoles/employeeRoles.models.ts +++ b/test/generated/next/employeeRoles/employeeRoles.models.ts @@ -13,7 +13,7 @@ export namespace EmployeeRolesModels { * @property { string[] } permissions Permissions associated with the role * @property { number } numberOfUsers Number of users associated with the role */ -export const EmployeeRoleListItemResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), numberOfUsers: z.number().describe("Number of users associated with the role") }).readonly(); +export const EmployeeRoleListItemResponseSchema = z.object({ id: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.nullish(), permissions: z.array(z.string()), numberOfUsers: z.number() }); export type EmployeeRoleListItemResponse = z.infer; /** @@ -23,7 +23,7 @@ export type EmployeeRoleListItemResponse = z.infer; /** @@ -37,7 +37,7 @@ export type EmployeeRolePaginationFilterDto = z.infer; /** @@ -50,7 +50,7 @@ export type EmployeeRoleCreateRequest = z.infer; /** @@ -60,7 +60,7 @@ export type EmployeeRolePermissionDto = z.infer; /** @@ -68,7 +68,7 @@ export type EmployeeRoleUpdateRequest = z.infer; /** @@ -76,7 +76,7 @@ export type EmployeeRoleTogglePermissionRequest = z.infer; /** @@ -97,14 +97,14 @@ export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSc * @property { number } totalItems Total available items * @property { EmployeeRoleListItemResponse[] } items */ -export const EmployeeRolesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).readonly() }).readonly().shape }); +export const EmployeeRolesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).nullable() }).partial().shape }); export type EmployeeRolesListResponse = z.infer; /** * LabelsResponseSchema * @type { array } */ -export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); export type LabelsResponse = z.infer; /** @@ -117,7 +117,7 @@ export type LabelsResponse = z.infer; * @property { number } totalItems Total available items * @property { EmployeeRolePermissionDto[] } items */ -export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).readonly() }).readonly().shape }); +export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).nullable() }).partial().shape }); export type EmployeeRolesPaginatePermissionsResponse = z.infer; } diff --git a/test/generated/next/employeeRoles/employeeRoles.queries.ts b/test/generated/next/employeeRoles/employeeRoles.queries.ts index b10fa5d..c726a38 100644 --- a/test/generated/next/employeeRoles/employeeRoles.queries.ts +++ b/test/generated/next/employeeRoles/employeeRoles.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -34,14 +33,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(limit, order, filter, page, cursor), queryFn: () => { checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, page, cursor, config) }, + return EmployeeRolesApi.list(limit, order, filter, page, cursor) }, ...options, }); }; @@ -59,14 +58,14 @@ export const useList = ({ limit, order, filter, page, cursor }: { limit: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor, config) }, + return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -85,14 +84,14 @@ export const useListInfinite = ({ limit, order, filter, cursor }: { limit * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(EmployeeRolesAcl.canUseCreate()); - return EmployeeRolesApi.create(data, config) + return EmployeeRolesApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -112,14 +111,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useLabels = ({ search, context }: { search?: string, context?: CommonModels.EmployeeRoleContext }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useLabels = ({ search, context }: { search?: string, context?: CommonModels.EmployeeRoleContext }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.labels(search, context), queryFn: () => { checkAcl(EmployeeRolesAcl.canUseLabels()); - return EmployeeRolesApi.labels(search, context, config) }, + return EmployeeRolesApi.labels(search, context) }, ...options, }); }; @@ -133,14 +132,14 @@ export const useLabels = ({ search, context }: { search?: string, context * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFind = ({ roleId }: { roleId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFind = ({ roleId }: { roleId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.find(roleId), queryFn: () => { checkAcl(EmployeeRolesAcl.canUseFind()); - return EmployeeRolesApi.find(roleId, config) }, + return EmployeeRolesApi.find(roleId) }, ...options, }); }; @@ -155,14 +154,14 @@ export const useFind = ({ roleId }: { roleId: string }, options?: AppQuer * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ roleId, data }) => { checkAcl(EmployeeRolesAcl.canUseUpdate()); - return EmployeeRolesApi.update(roleId, data, config) + return EmployeeRolesApi.update(roleId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -183,14 +182,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useDeleteEmployeesRolesByRoleId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteEmployeesRolesByRoleId = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ roleId }) => { checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); - return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId, config) + return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -211,14 +210,14 @@ export const useDeleteEmployeesRolesByRoleId = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginatePermissions = ({ roleId }: { roleId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginatePermissions = ({ roleId }: { roleId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginatePermissions(roleId), queryFn: () => { checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); - return EmployeeRolesApi.paginatePermissions(roleId, config) }, + return EmployeeRolesApi.paginatePermissions(roleId) }, ...options, }); }; @@ -234,14 +233,14 @@ export const usePaginatePermissions = ({ roleId }: { roleId: string }, op * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useTogglePermission = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useTogglePermission = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ roleId, permission, data }) => { checkAcl(EmployeeRolesAcl.canUseTogglePermission()); - return EmployeeRolesApi.togglePermission(roleId, permission, data, config) + return EmployeeRolesApi.togglePermission(roleId, permission, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -261,14 +260,14 @@ export const useTogglePermission = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ roleId, data }) => { checkAcl(EmployeeRolesAcl.canUseCopy()); - return EmployeeRolesApi.copy(roleId, data, config) + return EmployeeRolesApi.copy(roleId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/employeeSettings/employeeSettings.api.ts b/test/generated/next/employeeSettings/employeeSettings.api.ts index 21fa47a..2c14abc 100644 --- a/test/generated/next/employeeSettings/employeeSettings.api.ts +++ b/test/generated/next/employeeSettings/employeeSettings.api.ts @@ -1,23 +1,22 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { EmployeeSettingsModels } from "./employeeSettings.models"; export namespace EmployeeSettingsApi { -export const getAll = (config?: AxiosRequestConfig) => { +export const getAll = () => { return AppRestClient.get( { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, `/employees/settings`, - config + ) }; -export const update = (key: string, data: EmployeeSettingsModels.UpdateEmployeeSettingDto, config?: AxiosRequestConfig) => { +export const update = (key: string, data: EmployeeSettingsModels.UpdateEmployeeSettingDto, ) => { return AppRestClient.patch( { resSchema: z.void() }, `/employees/settings/${key}`, ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/employeeSettings/employeeSettings.models.ts b/test/generated/next/employeeSettings/employeeSettings.models.ts index 08b58ca..fd4ad3a 100644 --- a/test/generated/next/employeeSettings/employeeSettings.models.ts +++ b/test/generated/next/employeeSettings/employeeSettings.models.ts @@ -6,7 +6,7 @@ export namespace EmployeeSettingsModels { * @type { object } * @property { object } settings Map of all settings for the employee */ -export const EmployeeSettingsResponseDtoSchema = z.object({ settings: z.union([z.object({}).catchall(z.any()).readonly(), z.array(z.object({}).catchall(z.any()).readonly()).readonly(), z.string(), z.array(z.string()).readonly(), z.array(z.number()).readonly()]).describe("Map of all settings for the employee") }).readonly(); +export const EmployeeSettingsResponseDtoSchema = z.object({ settings: z.union([z.object({}).catchall(z.any()), z.array(z.object({}).catchall(z.any())), z.string(), z.array(z.string()), z.array(z.number())]) }); export type EmployeeSettingsResponseDto = z.infer; /** @@ -14,7 +14,7 @@ export type EmployeeSettingsResponseDto = z.infer; } diff --git a/test/generated/next/employeeSettings/employeeSettings.queries.ts b/test/generated/next/employeeSettings/employeeSettings.queries.ts index 389d6e3..7d4d3a7 100644 --- a/test/generated/next/employeeSettings/employeeSettings.queries.ts +++ b/test/generated/next/employeeSettings/employeeSettings.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -21,12 +20,11 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetAll = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetAll = (options?: AppQueryOptions) => { return useQuery({ queryKey: keys.getAll(), - queryFn: () => - EmployeeSettingsApi.getAll(config), + queryFn: EmployeeSettingsApi.getAll, ...options, }); }; @@ -40,12 +38,12 @@ export const useGetAll = (options?: AppQueryOptions } * @statusCodes [204, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ key, data }) => - EmployeeSettingsApi.update(key, data, config) + EmployeeSettingsApi.update(key, data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/employment/employment.api.ts b/test/generated/next/employment/employment.api.ts index d5718ab..f50e03e 100644 --- a/test/generated/next/employment/employment.api.ts +++ b/test/generated/next/employment/employment.api.ts @@ -1,73 +1,69 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; import { EmploymentModels } from "./employment.models"; export namespace EmploymentApi { -export const create = (data: EmploymentModels.EmploymentCreateRequest, config?: AxiosRequestConfig) => { +export const create = (data: EmploymentModels.EmploymentCreateRequest, ) => { return AppRestClient.post( { resSchema: CommonModels.EmploymentResponseSchema }, `/employees/employments`, ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), - config + ) }; -export const list = (limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: EmploymentModels.EmploymentListResponseSchema }, `/employees/employments`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const listRoles = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { +export const listRoles = (officeId: string, employmentId: string, ) => { return AppRestClient.get( { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, `/offices/${officeId}/employments/${employmentId}/roles`, - config + ) }; -export const updateRoles = (officeId: string, employmentId: string, data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, config?: AxiosRequestConfig) => { +export const updateRoles = (officeId: string, employmentId: string, data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, ) => { return AppRestClient.put( { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, `/offices/${officeId}/employments/${employmentId}/roles`, ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), - config + ) }; -export const update = (officeId: string, employmentId: string, data: EmploymentModels.UpdateEmploymentRequestDto, config?: AxiosRequestConfig) => { +export const update = (officeId: string, employmentId: string, data: EmploymentModels.UpdateEmploymentRequestDto, ) => { return AppRestClient.patch( { resSchema: CommonModels.EmploymentResponseSchema }, `/offices/${officeId}/employments/${employmentId}`, ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), - config + ) }; -export const archive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { +export const archive = (officeId: string, employmentId: string, ) => { return AppRestClient.post( { resSchema: CommonModels.EmploymentResponseSchema }, `/offices/${officeId}/employments/${employmentId}/archive`, - undefined, - config + ) }; -export const unarchive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { +export const unarchive = (officeId: string, employmentId: string, ) => { return AppRestClient.post( { resSchema: CommonModels.EmploymentResponseSchema }, `/offices/${officeId}/employments/${employmentId}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/employment/employment.models.ts b/test/generated/next/employment/employment.models.ts index b81dd37..151a915 100644 --- a/test/generated/next/employment/employment.models.ts +++ b/test/generated/next/employment/employment.models.ts @@ -8,7 +8,7 @@ export namespace EmploymentModels { * @property { string } officeId * @property { string } employeeId */ -export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }).readonly(); +export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }); export type EmploymentCreateRequest = z.infer; /** @@ -17,7 +17,7 @@ export type EmploymentCreateRequest = z.infer; /** @@ -29,7 +29,7 @@ export type EmploymentFilterDto = z.infer; * @property { string } description Description of the role * @property { string[] } permissions Permissions associated with the role */ -export const EmploymentRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); +export const EmploymentRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), permissions: z.array(z.string()) }); export type EmploymentRoleMemberResponse = z.infer; /** @@ -37,7 +37,7 @@ export type EmploymentRoleMemberResponse = z.infer; /** @@ -46,7 +46,7 @@ export type EmploymentRoleMembershipsUpdateRequest = z.infer; /** @@ -69,7 +69,7 @@ export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFi * EmploymentListPopulateParamSchema * @type { array } */ -export const EmploymentListPopulateParamSchema = z.array(EmploymentPaginationPopulateFieldsSchema).readonly().nullish(); +export const EmploymentListPopulateParamSchema = z.array(EmploymentPaginationPopulateFieldsSchema).nullish(); export type EmploymentListPopulateParam = z.infer; /** @@ -82,7 +82,7 @@ export type EmploymentListPopulateParam = z.infer; /** @@ -95,7 +95,7 @@ export type EmploymentListResponse = z.infer; /** @@ -108,7 +108,7 @@ export type EmploymentListRolesResponse = z.infer; } diff --git a/test/generated/next/employment/employment.queries.ts b/test/generated/next/employment/employment.queries.ts index f4556da..bc84e99 100644 --- a/test/generated/next/employment/employment.queries.ts +++ b/test/generated/next/employment/employment.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -27,14 +26,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(EmploymentAcl.canUseCreate()); - return EmploymentApi.create(data, config) + return EmploymentApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -58,14 +57,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useList = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(limit, order, populate, filter, page, cursor), queryFn: () => { checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, page, cursor, config) }, + return EmploymentApi.list(limit, order, populate, filter, page, cursor) }, ...options, }); }; @@ -84,14 +83,14 @@ export const useList = ({ limit, order, populate, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(limit, order, populate, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor, config) }, + return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -111,14 +110,14 @@ export const useListInfinite = ({ limit, order, populate, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListRoles = ({ officeId, employmentId }: { officeId: string, employmentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListRoles = ({ officeId, employmentId }: { officeId: string, employmentId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listRoles(officeId, employmentId), queryFn: () => { checkAcl(EmploymentAcl.canUseListRoles({ officeId } )); - return EmploymentApi.listRoles(officeId, employmentId, config) }, + return EmploymentApi.listRoles(officeId, employmentId) }, ...options, }); }; @@ -134,14 +133,14 @@ export const useListRoles = ({ officeId, employmentId }: { officeId: stri * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, employmentId, data }) => { checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId } )); - return EmploymentApi.updateRoles(officeId, employmentId, data, config) + return EmploymentApi.updateRoles(officeId, employmentId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -161,14 +160,14 @@ export const useUpdateRoles = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, employmentId, data }) => { checkAcl(EmploymentAcl.canUseUpdate({ officeId } )); - return EmploymentApi.update(officeId, employmentId, data, config) + return EmploymentApi.update(officeId, employmentId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -188,14 +187,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, employmentId }) => { checkAcl(EmploymentAcl.canUseArchive({ officeId } )); - return EmploymentApi.archive(officeId, employmentId, config) + return EmploymentApi.archive(officeId, employmentId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, employmentId }) => { checkAcl(EmploymentAcl.canUseUnarchive({ officeId } )); - return EmploymentApi.unarchive(officeId, employmentId, config) + return EmploymentApi.unarchive(officeId, employmentId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/factoringExport/factoringExport.api.ts b/test/generated/next/factoringExport/factoringExport.api.ts index 471d0ec..7ade703 100644 --- a/test/generated/next/factoringExport/factoringExport.api.ts +++ b/test/generated/next/factoringExport/factoringExport.api.ts @@ -1,22 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { FactoringExportModels } from "./factoringExport.models"; export namespace FactoringExportApi { -export const create = (officeId: string, data: FactoringExportModels.CreateFactoringExportRequestDto, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: FactoringExportModels.CreateFactoringExportRequestDto, ) => { return AppRestClient.post( { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, `/offices/${officeId}/factoring-exports`, ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), - config + ) }; -export const getBatch = (batchId: string, officeId: string, config?: AxiosRequestConfig) => { +export const getBatch = (batchId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, `/offices/${officeId}/factoring-exports/${batchId}`, - config + ) }; } diff --git a/test/generated/next/factoringExport/factoringExport.models.ts b/test/generated/next/factoringExport/factoringExport.models.ts index 1135505..d2b90ac 100644 --- a/test/generated/next/factoringExport/factoringExport.models.ts +++ b/test/generated/next/factoringExport/factoringExport.models.ts @@ -26,7 +26,7 @@ export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSche * @property { string } updatedAt * @property { string } exportedAt */ -export const FactoringExportBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringExportBatchStatusEnumSchema, totalInvoices: z.number(), totalAmount: z.number(), currencyNotation: z.string(), jobId: z.string().nullish(), eurFileUrl: z.string().nullish(), usdFileUrl: z.string().nullish(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export const FactoringExportBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringExportBatchStatusEnumSchema, totalInvoices: z.number(), totalAmount: z.number(), currencyNotation: z.string(), jobId: z.string().nullish(), eurFileUrl: z.string().nullish(), usdFileUrl: z.string().nullish(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish() }); export type FactoringExportBatchResponseDto = z.infer; /** @@ -35,7 +35,7 @@ export type FactoringExportBatchResponseDto = z.infer; } diff --git a/test/generated/next/factoringExport/factoringExport.queries.ts b/test/generated/next/factoringExport/factoringExport.queries.ts index 5bee5fa..f73fe09 100644 --- a/test/generated/next/factoringExport/factoringExport.queries.ts +++ b/test/generated/next/factoringExport/factoringExport.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(FactoringExportAcl.canUseCreate({ officeId } )); - return FactoringExportApi.create(officeId, data, config) + return FactoringExportApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -53,14 +52,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetBatch = ({ batchId, officeId }: { batchId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetBatch = ({ batchId, officeId }: { batchId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getBatch(batchId, officeId), queryFn: () => { checkAcl(FactoringExportAcl.canUseGetBatch({ officeId } )); - return FactoringExportApi.getBatch(batchId, officeId, config) }, + return FactoringExportApi.getBatch(batchId, officeId) }, ...options, }); }; diff --git a/test/generated/next/factoringMerge/factoringMerge.api.ts b/test/generated/next/factoringMerge/factoringMerge.api.ts index f095cec..1a42dec 100644 --- a/test/generated/next/factoringMerge/factoringMerge.api.ts +++ b/test/generated/next/factoringMerge/factoringMerge.api.ts @@ -1,30 +1,28 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { FactoringMergeModels } from "./factoringMerge.models"; export namespace FactoringMergeApi { -export const prepareUpload = (officeId: string, data: FactoringMergeModels.PrepareFactoringMergeRequestDto, config?: AxiosRequestConfig) => { +export const prepareUpload = (officeId: string, data: FactoringMergeModels.PrepareFactoringMergeRequestDto, ) => { return AppRestClient.post( { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, `/offices/${officeId}/factoring-merge/prepare-upload`, ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), - config + ) }; -export const processMerge = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { +export const processMerge = (officeId: string, batchId: string, ) => { return AppRestClient.post( { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, `/offices/${officeId}/factoring-merge/${batchId}/process`, - undefined, - config + ) }; -export const getMergeBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { +export const getMergeBatch = (officeId: string, batchId: string, ) => { return AppRestClient.get( { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, `/offices/${officeId}/factoring-merge/${batchId}`, - config + ) }; } diff --git a/test/generated/next/factoringMerge/factoringMerge.models.ts b/test/generated/next/factoringMerge/factoringMerge.models.ts index e285edd..9d720a4 100644 --- a/test/generated/next/factoringMerge/factoringMerge.models.ts +++ b/test/generated/next/factoringMerge/factoringMerge.models.ts @@ -8,7 +8,7 @@ export namespace FactoringMergeModels { * @property { string } mimeType File MIME type * @property { number } fileSize File size in bytes. Minimum: `1` */ -export const FileMetadataDtoSchema = z.object({ fileName: z.string().describe("File name"), mimeType: z.string().describe("File MIME type"), fileSize: z.number().gte(1).describe("File size in bytes") }).readonly(); +export const FileMetadataDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number().gte(1) }); export type FileMetadataDto = z.infer; /** @@ -21,7 +21,7 @@ export type FileMetadataDto = z.infer; * @property { FileMetadataDto } usdOperationsFile USD operations file metadata * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) */ -export const PrepareFactoringMergeRequestDtoSchema = z.object({ eurDebtorFile: FileMetadataDtoSchema.describe("EUR debtor file metadata"), eurOperationsFile: FileMetadataDtoSchema.describe("EUR operations file metadata"), eurExistingFactoringFile: FileMetadataDtoSchema.describe("EUR existing factoring file metadata (optional)").nullish(), usdDebtorFile: FileMetadataDtoSchema.describe("USD debtor file metadata"), usdOperationsFile: FileMetadataDtoSchema.describe("USD operations file metadata"), usdExistingFactoringFile: FileMetadataDtoSchema.describe("USD existing factoring file metadata (optional)").nullish() }).readonly(); +export const PrepareFactoringMergeRequestDtoSchema = z.object({ eurDebtorFile: FileMetadataDtoSchema, eurOperationsFile: FileMetadataDtoSchema, eurExistingFactoringFile: FileMetadataDtoSchema.nullish(), usdDebtorFile: FileMetadataDtoSchema, usdOperationsFile: FileMetadataDtoSchema, usdExistingFactoringFile: FileMetadataDtoSchema.nullish() }); export type PrepareFactoringMergeRequestDto = z.infer; /** @@ -31,7 +31,7 @@ export type PrepareFactoringMergeRequestDto = z.infer; /** @@ -45,7 +45,7 @@ export type MediaUploadInstructionsDto = z.infer; /** @@ -78,7 +78,7 @@ export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema * @property { string } updatedAt * @property { string } completedAt */ -export const FactoringMergeBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringMergeBatchStatusEnumSchema, eurDebtorFileMediaId: z.string(), eurOperationsFileMediaId: z.string(), eurExistingFactoringFileMediaId: z.string().nullish(), usdDebtorFileMediaId: z.string(), usdOperationsFileMediaId: z.string(), usdExistingFactoringFileMediaId: z.string().nullish(), eurResultFileMediaId: z.string().nullish(), eurResultFileUrl: z.string().nullish(), usdResultFileMediaId: z.string().nullish(), usdResultFileUrl: z.string().nullish(), jobId: z.string().nullish(), errorMessage: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), completedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export const FactoringMergeBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringMergeBatchStatusEnumSchema, eurDebtorFileMediaId: z.string(), eurOperationsFileMediaId: z.string(), eurExistingFactoringFileMediaId: z.string().nullish(), usdDebtorFileMediaId: z.string(), usdOperationsFileMediaId: z.string(), usdExistingFactoringFileMediaId: z.string().nullish(), eurResultFileMediaId: z.string().nullish(), eurResultFileUrl: z.string().nullish(), usdResultFileMediaId: z.string().nullish(), usdResultFileUrl: z.string().nullish(), jobId: z.string().nullish(), errorMessage: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), completedAt: z.iso.datetime({ offset: true }).nullish() }); export type FactoringMergeBatchResponseDto = z.infer; } diff --git a/test/generated/next/factoringMerge/factoringMerge.queries.ts b/test/generated/next/factoringMerge/factoringMerge.queries.ts index 80ea921..9e1e382 100644 --- a/test/generated/next/factoringMerge/factoringMerge.queries.ts +++ b/test/generated/next/factoringMerge/factoringMerge.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401, default] */ -export const usePrepareUpload = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePrepareUpload = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId } )); - return FactoringMergeApi.prepareUpload(officeId, data, config) + return FactoringMergeApi.prepareUpload(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -53,14 +52,14 @@ export const usePrepareUpload = (options?: AppMutationOptions } * @statusCodes [201, 401, default] */ -export const useProcessMerge = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useProcessMerge = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, batchId }) => { checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId } )); - return FactoringMergeApi.processMerge(officeId, batchId, config) + return FactoringMergeApi.processMerge(officeId, batchId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -82,14 +81,14 @@ export const useProcessMerge = (options?: AppMutationOptions } * @statusCodes [200, 401, default] */ -export const useGetMergeBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetMergeBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getMergeBatch(officeId, batchId), queryFn: () => { checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId } )); - return FactoringMergeApi.getMergeBatch(officeId, batchId, config) }, + return FactoringMergeApi.getMergeBatch(officeId, batchId) }, ...options, }); }; diff --git a/test/generated/next/files/files.api.ts b/test/generated/next/files/files.api.ts index 286fe3a..62289b9 100644 --- a/test/generated/next/files/files.api.ts +++ b/test/generated/next/files/files.api.ts @@ -1,26 +1,24 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { FilesModels } from "./files.models"; import { CommonModels } from "@/data/common/common.models"; export namespace FilesApi { -export const createUpload = (officeId: string, folderId: string, data: FilesModels.CreateFileRequestDTO, config?: AxiosRequestConfig) => { +export const createUpload = (officeId: string, folderId: string, data: FilesModels.CreateFileRequestDTO, ) => { return AppRestClient.post( { resSchema: FilesModels.FileUploadResponseDTOSchema }, `/offices/${officeId}/folders/${folderId}/files`, ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), - config + ) }; -export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, config?: AxiosRequestConfig) => { +export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/files/eml`, ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), { - ...config, headers: { 'Accept': 'application/octet-stream', }, @@ -29,44 +27,44 @@ export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO } ) }; -export const rename = (officeId: string, fileId: string, data: FilesModels.RenameFileRequestDTO, config?: AxiosRequestConfig) => { +export const rename = (officeId: string, fileId: string, data: FilesModels.RenameFileRequestDTO, ) => { return AppRestClient.patch( { resSchema: CommonModels.FileResponseDTOSchema }, `/offices/${officeId}/files/${fileId}`, ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), - config + ) }; -export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { +export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/files/move`, ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - config + ) }; -export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { +export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/files/copy`, ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - config + ) }; -export const archive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, config?: AxiosRequestConfig) => { +export const archive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/files/archive`, ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - config + ) }; -export const unarchive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, config?: AxiosRequestConfig) => { +export const unarchive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/files/unarchive`, ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/files/files.models.ts b/test/generated/next/files/files.models.ts index c7e5145..2ac873f 100644 --- a/test/generated/next/files/files.models.ts +++ b/test/generated/next/files/files.models.ts @@ -8,7 +8,7 @@ export namespace FilesModels { * @property { string } mimeType * @property { number } fileSize Minimum: `0` */ -export const CreateFileRequestDTOSchema = z.object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }).readonly(); +export const CreateFileRequestDTOSchema = z.object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }); export type CreateFileRequestDTO = z.infer; /** @@ -18,7 +18,7 @@ export type CreateFileRequestDTO = z.infer; * @property { string } method * @property { string } url */ -export const FileUploadResponseDTOSchema = z.object({ fileId: z.string(), method: z.string(), url: z.string() }).readonly(); +export const FileUploadResponseDTOSchema = z.object({ fileId: z.string(), method: z.string(), url: z.string() }); export type FileUploadResponseDTO = z.infer; /** @@ -26,7 +26,7 @@ export type FileUploadResponseDTO = z.infer; * @type { object } * @property { string[] } ids Min Items: `1` */ -export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); +export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).min(1) }); export type GetFilesEmlRequestDTO = z.infer; /** @@ -34,7 +34,7 @@ export type GetFilesEmlRequestDTO = z.infer; * @type { object } * @property { string } name */ -export const RenameFileRequestDTOSchema = z.object({ name: z.string() }).readonly(); +export const RenameFileRequestDTOSchema = z.object({ name: z.string() }); export type RenameFileRequestDTO = z.infer; /** @@ -43,7 +43,7 @@ export type RenameFileRequestDTO = z.infer; * @property { string[] } fileIds Min Items: `1` * @property { string } targetFolderId */ -export const MoveFilesRequestDTOSchema = z.object({ fileIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }).readonly(); +export const MoveFilesRequestDTOSchema = z.object({ fileIds: z.array(z.string()).min(1), targetFolderId: z.string() }); export type MoveFilesRequestDTO = z.infer; /** @@ -51,7 +51,7 @@ export type MoveFilesRequestDTO = z.infer; * @type { object } * @property { string[] } ids Min Items: `1` */ -export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); +export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).min(1) }); export type SetFilesArchivedRequestDTO = z.infer; } diff --git a/test/generated/next/files/files.queries.ts b/test/generated/next/files/files.queries.ts index ee44a92..6e53863 100644 --- a/test/generated/next/files/files.queries.ts +++ b/test/generated/next/files/files.queries.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -22,12 +22,12 @@ export const moduleName = QueryModule.Files; * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { - const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data, config); + const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data); if (file && uploadInstructions.url) { const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; @@ -71,12 +71,12 @@ export const useCreateUpload = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => - FilesApi.getEml(officeId, data, config) + FilesApi.getEml(officeId, data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -96,12 +96,12 @@ export const useGetEml = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useRename = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useRename = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, fileId, data }) => - FilesApi.rename(officeId, fileId, data, config) + FilesApi.rename(officeId, fileId, data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -120,12 +120,12 @@ export const useRename = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useMove = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useMove = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => - FilesApi.move(officeId, data, config) + FilesApi.move(officeId, data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -144,12 +144,12 @@ export const useMove = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => - FilesApi.copy(officeId, data, config) + FilesApi.copy(officeId, data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -168,12 +168,12 @@ export const useCopy = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => - FilesApi.archive(officeId, data, config) + FilesApi.archive(officeId, data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,12 +192,12 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => - FilesApi.unarchive(officeId, data, config) + FilesApi.unarchive(officeId, data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/folders/folders.api.ts b/test/generated/next/folders/folders.api.ts index 2644437..b4cd844 100644 --- a/test/generated/next/folders/folders.api.ts +++ b/test/generated/next/folders/folders.api.ts @@ -1,63 +1,60 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { FoldersModels } from "./folders.models"; export namespace FoldersApi { -export const getTree = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { +export const getTree = (officeId: string, folderId: string, ) => { return AppRestClient.get( { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, `/offices/${officeId}/folders/${folderId}/tree`, - config + ) }; -export const getContent = (officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const getContent = (officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: FoldersModels.FolderResponseDTOSchema }, `/offices/${officeId}/folders/${folderId}`, { - ...config, params: { order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const rename = (officeId: string, folderId: string, data: FoldersModels.RenameFolderRequestDTO, config?: AxiosRequestConfig) => { +export const rename = (officeId: string, folderId: string, data: FoldersModels.RenameFolderRequestDTO, ) => { return AppRestClient.patch( { resSchema: FoldersModels.FolderResponseDTOSchema }, `/offices/${officeId}/folders/${folderId}`, ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), - config + ) }; -export const deleteFolder = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { +export const deleteFolder = (officeId: string, folderId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/folders/${folderId}`, - undefined, - config + ) }; -export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, ) => { return AppRestClient.post( { resSchema: FoldersModels.FolderResponseDTOSchema }, `/offices/${officeId}/folders`, ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), - config + ) }; -export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, config?: AxiosRequestConfig) => { +export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/folders/move`, ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/folders/folders.models.ts b/test/generated/next/folders/folders.models.ts index 977f922..5ca5dda 100644 --- a/test/generated/next/folders/folders.models.ts +++ b/test/generated/next/folders/folders.models.ts @@ -16,7 +16,7 @@ export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; * @property { string } targetEntityName * @property { string } targetEntityId */ -export const FolderSymlinkResponseDTOSchema = z.object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }).readonly(); +export const FolderSymlinkResponseDTOSchema = z.object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }); export type FolderSymlinkResponseDTO = z.infer; /** @@ -29,7 +29,7 @@ export type FolderSymlinkResponseDTO = z.infer; /** @@ -48,7 +48,7 @@ export type FolderTreeResponseDTO = z.infer; * @property { CommonModels.FileResponseDTO[] } files * @property { FolderResponseDTO[] } folders */ -export const FolderResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, files: z.array(CommonModels.FileResponseDTOSchema).readonly(), get folders() { return z.array(FolderResponseDTOSchema).readonly() } }).readonly(); +export const FolderResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, files: z.array(CommonModels.FileResponseDTOSchema), get folders() { return z.array(FolderResponseDTOSchema) } }); export type FolderResponseDTO = z.infer; /** @@ -56,7 +56,7 @@ export type FolderResponseDTO = z.infer; * @type { object } * @property { boolean } archived When omitted, both archived and unarchived files are returned. */ -export const FolderContentFilterDtoSchema = z.object({ archived: z.boolean().describe("When omitted, both archived and unarchived files are returned.") }).readonly(); +export const FolderContentFilterDtoSchema = z.object({ archived: z.boolean().nullable() }).partial(); export type FolderContentFilterDto = z.infer; /** @@ -65,7 +65,7 @@ export type FolderContentFilterDto = z.infer; /** @@ -73,7 +73,7 @@ export type CreateFolderRequestDTO = z.infer; /** @@ -82,15 +82,15 @@ export type RenameFolderRequestDTO = z.infer; /** * GetContentOrderParamSchema * @type { array } - * @description Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` + * @description Example: `name` */ -export const GetContentOrderParamSchema = z.array(z.string()).readonly().describe("Order by fields (comma separated with +/- prefix): name, createdAt").nullish(); +export const GetContentOrderParamSchema = z.array(z.string()).nullish(); export type GetContentOrderParam = z.infer; } diff --git a/test/generated/next/folders/folders.queries.ts b/test/generated/next/folders/folders.queries.ts index ef642ed..0174720 100644 --- a/test/generated/next/folders/folders.queries.ts +++ b/test/generated/next/folders/folders.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -25,12 +24,12 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetTree = ({ officeId, folderId }: { officeId: string, folderId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetTree = ({ officeId, folderId }: { officeId: string, folderId: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.getTree(officeId, folderId), queryFn: () => - FoldersApi.getTree(officeId, folderId, config), + FoldersApi.getTree(officeId, folderId), ...options, }); }; @@ -49,12 +48,12 @@ export const useGetTree = ({ officeId, folderId }: { officeId: string, fo * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetContent = ({ officeId, folderId, limit, order, filter, page, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetContent = ({ officeId, folderId, limit, order, filter, page, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), queryFn: () => - FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor, config), + FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor), ...options, }); }; @@ -73,12 +72,12 @@ export const useGetContent = ({ officeId, folderId, limit, order, filter, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useGetContentInfinite = ({ officeId, folderId, limit, order, filter, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useGetContentInfinite = ({ officeId, folderId, limit, order, filter, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { return useInfiniteQuery({ queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), queryFn: ({ pageParam }) => - FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor, config), + FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor), initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -98,12 +97,12 @@ export const useGetContentInfinite = ({ officeId, folderId, limit, order, * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useRename = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useRename = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, folderId, data }) => - FoldersApi.rename(officeId, folderId, data, config) + FoldersApi.rename(officeId, folderId, data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -122,12 +121,12 @@ export const useRename = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeleteFolder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteFolder = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, folderId }) => - FoldersApi.deleteFolder(officeId, folderId, config) + FoldersApi.deleteFolder(officeId, folderId) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -146,12 +145,12 @@ export const useDeleteFolder = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => - FoldersApi.create(officeId, data, config) + FoldersApi.create(officeId, data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -170,12 +169,12 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useMove = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useMove = (options?: AppMutationOptions & MutationEffectsOptions) => { const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => - FoldersApi.move(officeId, data, config) + FoldersApi.move(officeId, data) , ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/hsCodes/hsCodes.api.ts b/test/generated/next/hsCodes/hsCodes.api.ts index ec87c77..59dece6 100644 --- a/test/generated/next/hsCodes/hsCodes.api.ts +++ b/test/generated/next/hsCodes/hsCodes.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { HsCodesModels } from "./hsCodes.models"; export namespace HsCodesApi { -export const paginate = (limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, `/hs-codes`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, ) => { return AppRestClient.post( { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, `/hs-codes`, ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), - config + ) }; -export const paginateLabels = (limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, `/hs-codes/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, `/hs-codes/${id}`, - config + ) }; -export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, ) => { return AppRestClient.patch( { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, `/hs-codes/${id}`, ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.post( { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, `/hs-codes/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.post( { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, `/hs-codes/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/hsCodes/hsCodes.models.ts b/test/generated/next/hsCodes/hsCodes.models.ts index 1861991..a2d7cf2 100644 --- a/test/generated/next/hsCodes/hsCodes.models.ts +++ b/test/generated/next/hsCodes/hsCodes.models.ts @@ -8,7 +8,7 @@ export namespace HsCodesModels { * @property { string } id * @property { string } name */ -export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type HsCodeEmployeeDTO = z.infer; /** @@ -26,7 +26,7 @@ export type HsCodeEmployeeDTO = z.infer; * @property { HsCodeEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const HsCodeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the HS Code"), name: z.string().describe("Name of the HS Code"), description: z.string().describe("Description of the HS Code"), customArea: z.string().describe("Custom area associated with the HS Code"), archived: z.boolean().describe("Indicates if the HS Code is archived"), createdById: z.string().nullish(), createdBy: HsCodeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: HsCodeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const HsCodeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), description: z.string(), customArea: z.string(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: HsCodeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: HsCodeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type HsCodeResponseDTO = z.infer; /** @@ -35,7 +35,7 @@ export type HsCodeResponseDTO = z.infer; * @property { boolean } archived Archived status * @property { string } search */ -export const HsCodePaginationFilterDtoSchema = z.object({ archived: z.boolean().describe("Archived status"), search: z.string() }).readonly(); +export const HsCodePaginationFilterDtoSchema = z.object({ archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); export type HsCodePaginationFilterDto = z.infer; /** @@ -43,7 +43,7 @@ export type HsCodePaginationFilterDto = z.infer; /** @@ -53,7 +53,7 @@ export type HsCodeLabelFilterDto = z.infer; * @property { string } description Description of the HS Code * @property { string } customArea Custom area associated with the HS Code */ -export const CreateHsCodeRequestDTOSchema = z.object({ name: z.string().describe("Unique name for the HS Code"), description: z.string().describe("Description of the HS Code"), customArea: z.string().describe("Custom area associated with the HS Code") }).readonly(); +export const CreateHsCodeRequestDTOSchema = z.object({ name: z.string(), description: z.string(), customArea: z.string() }); export type CreateHsCodeRequestDTO = z.infer; /** @@ -63,7 +63,7 @@ export type CreateHsCodeRequestDTO = z.infer; /** @@ -84,7 +84,7 @@ export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema * @property { number } totalItems Total available items * @property { HsCodeResponseDTO[] } items */ -export const HsCodesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(HsCodeResponseDTOSchema).readonly() }).readonly().shape }); +export const HsCodesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(HsCodeResponseDTOSchema).nullable() }).partial().shape }); export type HsCodesPaginateResponse = z.infer; /** @@ -105,7 +105,7 @@ export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderPar * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const HsCodesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const HsCodesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type HsCodesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/hsCodes/hsCodes.queries.ts b/test/generated/next/hsCodes/hsCodes.queries.ts index 87e8809..5722f0d 100644 --- a/test/generated/next/hsCodes/hsCodes.queries.ts +++ b/test/generated/next/hsCodes/hsCodes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, page, cursor, config) }, + return HsCodesApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -58,14 +57,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return HsCodesApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -84,14 +83,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(HsCodesAcl.canUseCreate()); - return HsCodesApi.create(data, config) + return HsCodesApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -114,14 +113,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return HsCodesApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -139,14 +138,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -165,14 +164,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(HsCodesAcl.canUseFindById()); - return HsCodesApi.findById(id, config) }, + return HsCodesApi.findById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(HsCodesAcl.canUseUpdate()); - return HsCodesApi.update(id, data, config) + return HsCodesApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(HsCodesAcl.canUseArchive()); - return HsCodesApi.archive(id, config) + return HsCodesApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -243,14 +242,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(HsCodesAcl.canUseUnarchive()); - return HsCodesApi.unarchive(id, config) + return HsCodesApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/integrationChannels/integrationChannels.api.ts b/test/generated/next/integrationChannels/integrationChannels.api.ts index d1996fc..0835e70 100644 --- a/test/generated/next/integrationChannels/integrationChannels.api.ts +++ b/test/generated/next/integrationChannels/integrationChannels.api.ts @@ -1,85 +1,79 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { IntegrationChannelsModels } from "./integrationChannels.models"; export namespace IntegrationChannelsApi { -export const list = (officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, `/offices/${officeId}/integration-channels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (officeId: string, data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, ) => { return AppRestClient.post( { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, `/offices/${officeId}/integration-channels`, ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), - config + ) }; -export const findById = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const findById = (officeId: string, id: string, ) => { return AppRestClient.get( { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, `/offices/${officeId}/integration-channels/${id}`, - config + ) }; -export const update = (officeId: string, id: string, data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, config?: AxiosRequestConfig) => { +export const update = (officeId: string, id: string, data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, ) => { return AppRestClient.patch( { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, `/offices/${officeId}/integration-channels/${id}`, ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), - config + ) }; -export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const archive = (officeId: string, id: string, ) => { return AppRestClient.post( { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, `/offices/${officeId}/integration-channels/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const unarchive = (officeId: string, id: string, ) => { return AppRestClient.post( { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, `/offices/${officeId}/integration-channels/${id}/unarchive`, - undefined, - config + ) }; -export const testConnection = (officeId: string, id: string, config?: AxiosRequestConfig) => { +export const testConnection = (officeId: string, id: string, ) => { return AppRestClient.post( { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, `/offices/${officeId}/integration-channels/${id}/test-connection`, - undefined, - config + ) }; -export const listMessages = (officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const listMessages = (officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, `/offices/${officeId}/integration-channels/${id}/messages`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) diff --git a/test/generated/next/integrationChannels/integrationChannels.models.ts b/test/generated/next/integrationChannels/integrationChannels.models.ts index d3f8e74..543e8a7 100644 --- a/test/generated/next/integrationChannels/integrationChannels.models.ts +++ b/test/generated/next/integrationChannels/integrationChannels.models.ts @@ -8,7 +8,7 @@ export namespace IntegrationChannelsModels { * @property { string } id * @property { string } name */ -export const IntegrationChannelBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const IntegrationChannelBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); export type IntegrationChannelBusinessPartnerResponseDto = z.infer; /** @@ -17,7 +17,7 @@ export type IntegrationChannelBusinessPartnerResponseDto = z.infer; /** @@ -44,7 +44,7 @@ export type IntegrationChannelEmployeeResponseDto = z.infer; /** @@ -79,7 +79,7 @@ export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.e * @property { IntegrationMessageStatusEnum } status * @property { string } search */ -export const IntegrationMessageFilterDtoSchema = z.object({ direction: IntegrationMessageDirectionEnumSchema, format: IntegrationMessageFormatEnumSchema, status: IntegrationMessageStatusEnumSchema, search: z.string() }).readonly(); +export const IntegrationMessageFilterDtoSchema = z.object({ direction: IntegrationMessageDirectionEnumSchema.nullable(), format: IntegrationMessageFormatEnumSchema.nullable(), status: IntegrationMessageStatusEnumSchema.nullable(), search: z.string().nullable() }).partial(); export type IntegrationMessageFilterDto = z.infer; /** @@ -87,7 +87,7 @@ export type IntegrationMessageFilterDto = z.infer; /** @@ -104,7 +104,7 @@ export type IntegrationChannelFilterDto = z.infer; /** @@ -121,7 +121,7 @@ export type CreateIntegrationChannelRequestDto = z.infer; /** @@ -129,7 +129,7 @@ export type UpdateIntegrationChannelRequestDto = z.infer; /** @@ -149,7 +149,7 @@ export type TestConnectionResponseDto = z.infer; /** @@ -170,7 +170,7 @@ export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrde * @property { number } totalItems Total available items * @property { IntegrationChannelResponseDto[] } items */ -export const IntegrationChannelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).readonly() }).readonly().shape }); +export const IntegrationChannelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).nullable() }).partial().shape }); export type IntegrationChannelsListResponse = z.infer; /** @@ -191,7 +191,7 @@ export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; * @property { number } totalItems Total available items * @property { IntegrationMessageResponseDto[] } items */ -export const ListMessagesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).readonly() }).readonly().shape }); +export const ListMessagesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).nullable() }).partial().shape }); export type ListMessagesResponse = z.infer; } diff --git a/test/generated/next/integrationChannels/integrationChannels.queries.ts b/test/generated/next/integrationChannels/integrationChannels.queries.ts index 9b9b630..1f37862 100644 --- a/test/generated/next/integrationChannels/integrationChannels.queries.ts +++ b/test/generated/next/integrationChannels/integrationChannels.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -34,14 +33,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); - return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor, config) }, + return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -60,14 +59,14 @@ export const useList = ({ officeId, limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); - return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -87,14 +86,14 @@ export const useListInfinite = ({ officeId, limit, order, filter, cursor * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId } )); - return IntegrationChannelsApi.create(officeId, data, config) + return IntegrationChannelsApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -114,14 +113,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(officeId, id), queryFn: () => { checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId } )); - return IntegrationChannelsApi.findById(officeId, id, config) }, + return IntegrationChannelsApi.findById(officeId, id) }, ...options, }); }; @@ -137,14 +136,14 @@ export const useFindById = ({ officeId, id }: { officeId: string, id: str * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id, data }) => { checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId } )); - return IntegrationChannelsApi.update(officeId, id, data, config) + return IntegrationChannelsApi.update(officeId, id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -166,14 +165,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id }) => { checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId } )); - return IntegrationChannelsApi.archive(officeId, id, config) + return IntegrationChannelsApi.archive(officeId, id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -195,14 +194,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id }) => { checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId } )); - return IntegrationChannelsApi.unarchive(officeId, id, config) + return IntegrationChannelsApi.unarchive(officeId, id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -224,14 +223,14 @@ export const useUnarchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useTestConnection = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useTestConnection = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, id }) => { checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId } )); - return IntegrationChannelsApi.testConnection(officeId, id, config) + return IntegrationChannelsApi.testConnection(officeId, id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -256,14 +255,14 @@ export const useTestConnection = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useListMessages = ({ officeId, id, limit, order, filter, page, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListMessages = ({ officeId, id, limit, order, filter, page, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), queryFn: () => { checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor, config) }, + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor) }, ...options, }); }; @@ -283,14 +282,14 @@ export const useListMessages = ({ officeId, id, limit, order, filter, pag * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListMessagesInfinite = ({ officeId, id, limit, order, filter, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListMessagesInfinite = ({ officeId, id, limit, order, filter, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor, config) }, + return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts index 07235c7..7bed21a 100644 --- a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts +++ b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts @@ -1,30 +1,28 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; export namespace InttraOfficeIntegrationApi { -export const get = (officeId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, ) => { return AppRestClient.get( { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, `/offices/${officeId}/inttra/credentials`, - config + ) }; -export const generate = (officeId: string, config?: AxiosRequestConfig) => { +export const generate = (officeId: string, ) => { return AppRestClient.post( { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, `/offices/${officeId}/inttra/credentials`, - undefined, - config + ) }; -export const update = (officeId: string, data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, config?: AxiosRequestConfig) => { +export const update = (officeId: string, data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, ) => { return AppRestClient.patch( { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, `/offices/${officeId}/inttra/credentials`, ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts index fee95ed..635c0a5 100644 --- a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts +++ b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts @@ -15,7 +15,7 @@ export namespace InttraOfficeIntegrationModels { * @property { string } ediId * @property { string } notificationEmail */ -export const OfficeInttraCredentialsResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string().nullish(), officeId: z.string(), sftpUsername: z.string().nullish(), sftpPublicKey: z.string().nullish(), partnerCode: z.string().nullish(), ediId: z.string().nullish(), notificationEmail: z.string().nullish() }).readonly(); +export const OfficeInttraCredentialsResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string().nullish(), officeId: z.string(), sftpUsername: z.string().nullish(), sftpPublicKey: z.string().nullish(), partnerCode: z.string().nullish(), ediId: z.string().nullish(), notificationEmail: z.string().nullish() }); export type OfficeInttraCredentialsResponseDto = z.infer; /** @@ -25,7 +25,7 @@ export type OfficeInttraCredentialsResponseDto = z.infer; /** @@ -37,7 +37,7 @@ export type GenerateInttraCredentialsResponseDto = z.infer; /** @@ -46,7 +46,7 @@ export type UpdateInttraCredentialsRequestDto = z.infer; } diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts index 384b020..78b7dc4 100644 --- a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts +++ b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -25,14 +24,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ officeId }: { officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ officeId }: { officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(officeId), queryFn: () => { checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId } )); - return InttraOfficeIntegrationApi.get(officeId, config) }, + return InttraOfficeIntegrationApi.get(officeId) }, ...options, }); }; @@ -46,14 +45,14 @@ export const useGet = ({ officeId }: { officeId: string }, options?: AppQ * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId }) => { checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId } )); - return InttraOfficeIntegrationApi.generate(officeId, config) + return InttraOfficeIntegrationApi.generate(officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -73,14 +72,14 @@ export const useGenerate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId } )); - return InttraOfficeIntegrationApi.update(officeId, data, config) + return InttraOfficeIntegrationApi.update(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts index 0159428..66b0aa8 100644 --- a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts +++ b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts @@ -1,46 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; export namespace InttraShippingInstructionMessagesApi { -export const list = (officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, config?: AxiosRequestConfig) => { +export const list = (officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, ) => { return AppRestClient.get( { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, { - ...config, params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), filter: ZodExtended.parse(InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), }, } ) }; -export const create = (officeId: string, positionId: string, shippingInstructionsId: string, data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, config?: AxiosRequestConfig) => { +export const create = (officeId: string, positionId: string, shippingInstructionsId: string, data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, ) => { return AppRestClient.post( { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), - config + ) }; -export const getById = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, config?: AxiosRequestConfig) => { +export const getById = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, ) => { return AppRestClient.get( { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - config + ) }; -export const update = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, config?: AxiosRequestConfig) => { +export const update = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, ) => { return AppRestClient.patch( { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts index 0537827..6e252f5 100644 --- a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts +++ b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts @@ -33,7 +33,7 @@ export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStat * @property { string } aperakReceivedAt * @property { string } aperakRaw */ -export const ShippingInstructionMessageListItemResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }).readonly(); +export const ShippingInstructionMessageListItemResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }); export type ShippingInstructionMessageListItemResponseDto = z.infer; /** @@ -41,7 +41,7 @@ export type ShippingInstructionMessageListItemResponseDto = z.infer; /** @@ -69,7 +69,7 @@ export type ShippingInstructionMessageFilterDto = z.infer; /** @@ -77,7 +77,7 @@ export type ShippingInstructionMessageResponseDto = z.infer; /** @@ -85,7 +85,7 @@ export type UpdateShippingInstructionMessageRequestDto = z.infer; /** @@ -98,7 +98,7 @@ export type CreateShippingInstructionMessageRequestDto = z.infer; } diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts index f1e57ad..410de3d 100644 --- a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts +++ b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useList = ({ officeId, positionId, shippingInstructionsId, limit, page, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ officeId, positionId, shippingInstructionsId, limit, page, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), queryFn: () => { checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); - return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter, config) }, + return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter) }, ...options, }); }; @@ -60,14 +59,14 @@ export const useList = ({ officeId, positionId, shippingInstructionsId, l * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ officeId, positionId, shippingInstructionsId, limit, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ officeId, positionId, shippingInstructionsId, limit, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), queryFn: ({ pageParam }) => { checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); - return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, pageParam, cursor, filter, config) }, + return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, pageParam, cursor, filter) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -89,14 +88,14 @@ export const useListInfinite = ({ officeId, positionId, shippingInstructi * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId } )); - return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data, config) + return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -118,14 +117,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetById = ({ officeId, positionId, shippingInstructionsId, messageId }: { officeId: string, positionId: string, shippingInstructionsId: string, messageId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetById = ({ officeId, positionId, shippingInstructionsId, messageId }: { officeId: string, positionId: string, shippingInstructionsId: string, messageId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), queryFn: () => { checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId } )); - return InttraShippingInstructionMessagesApi.getById(officeId, positionId, shippingInstructionsId, messageId, config) }, + return InttraShippingInstructionMessagesApi.getById(officeId, positionId, shippingInstructionsId, messageId) }, ...options, }); }; @@ -143,14 +142,14 @@ export const useGetById = ({ officeId, positionId, shippingInstructionsId * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId } )); - return InttraShippingInstructionMessagesApi.update(officeId, positionId, shippingInstructionsId, messageId, data, config) + return InttraShippingInstructionMessagesApi.update(officeId, positionId, shippingInstructionsId, messageId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/invoicePayments/invoicePayments.api.ts b/test/generated/next/invoicePayments/invoicePayments.api.ts index 170e7d1..b19c0f4 100644 --- a/test/generated/next/invoicePayments/invoicePayments.api.ts +++ b/test/generated/next/invoicePayments/invoicePayments.api.ts @@ -1,49 +1,46 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { InvoicePaymentsModels } from "./invoicePayments.models"; export namespace InvoicePaymentsApi { -export const listOfficePayments = (officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const listOfficePayments = (officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, `/offices/${officeId}/payments`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const bulkCreatePayments = (officeId: string, data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, config?: AxiosRequestConfig) => { +export const bulkCreatePayments = (officeId: string, data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, ) => { return AppRestClient.post( { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, `/offices/${officeId}/payments`, ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), - config + ) }; -export const calculatePayments = (officeId: string, data: InvoicePaymentsModels.CalculatePaymentsRequestDto, config?: AxiosRequestConfig) => { +export const calculatePayments = (officeId: string, data: InvoicePaymentsModels.CalculatePaymentsRequestDto, ) => { return AppRestClient.post( { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, `/offices/${officeId}/payments/calculate`, ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), - config + ) }; -export const exportOfficePayments = (officeId: string, data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, config?: AxiosRequestConfig) => { +export const exportOfficePayments = (officeId: string, data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/payments/exports`, ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', }, @@ -52,49 +49,47 @@ export const exportOfficePayments = (officeId: string, data: InvoicePaymentsMode } ) }; -export const list = (officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, `/offices/${officeId}/invoices/${invoiceId}/payments`, { - ...config, params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (officeId: string, invoiceId: string, data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, config?: AxiosRequestConfig) => { +export const create = (officeId: string, invoiceId: string, data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, ) => { return AppRestClient.post( { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/payments`, ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), - config + ) }; -export const getPaymentById = (officeId: string, invoiceId: string, paymentId: string, config?: AxiosRequestConfig) => { +export const getPaymentById = (officeId: string, invoiceId: string, paymentId: string, ) => { return AppRestClient.get( { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - config + ) }; -export const update = (officeId: string, invoiceId: string, paymentId: string, data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, config?: AxiosRequestConfig) => { +export const update = (officeId: string, invoiceId: string, paymentId: string, data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, ) => { return AppRestClient.patch( { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), - config + ) }; -export const deleteInvoicePayment = (officeId: string, invoiceId: string, paymentId: string, config?: AxiosRequestConfig) => { +export const deleteInvoicePayment = (officeId: string, invoiceId: string, paymentId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - undefined, - config + ) }; } diff --git a/test/generated/next/invoicePayments/invoicePayments.models.ts b/test/generated/next/invoicePayments/invoicePayments.models.ts index 3605942..23fae1a 100644 --- a/test/generated/next/invoicePayments/invoicePayments.models.ts +++ b/test/generated/next/invoicePayments/invoicePayments.models.ts @@ -8,7 +8,7 @@ export namespace InvoicePaymentsModels { * @property { number } amount * @property { string } currencyNotation */ -export const OfficePaymentTotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); +export const OfficePaymentTotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); export type OfficePaymentTotalAmountsDto = z.infer; /** @@ -22,7 +22,7 @@ export type OfficePaymentTotalAmountsDto = z.infer; /** @@ -36,7 +36,7 @@ export type OfficePaymentListResponseDto = z.infer; /** @@ -53,7 +53,7 @@ export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; * @property { string } id * @property { string } name */ -export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }); export type OfficePaymentPreviewCreatedByDto = z.infer; /** @@ -64,7 +64,7 @@ export type OfficePaymentPreviewCreatedByDto = z.infer; /** @@ -83,7 +83,7 @@ export type OfficePaymentBusinessPartnerDto = z.infer; /** @@ -96,7 +96,7 @@ export type OfficePaymentPreviewDto = z.infer; /** @@ -106,7 +106,7 @@ export type OfficeInvoicePaymentFilterDto = z.infer; /** @@ -114,7 +114,7 @@ export type BulkCreatePaymentBusinessPartnerDto = z.infer; /** @@ -125,7 +125,7 @@ export type BulkCreatePaymentsResponseDto = z.infer; /** @@ -134,7 +134,7 @@ export type CalculatePaymentItemDto = z.infer; /** @@ -143,7 +143,7 @@ export type CalculatePaymentTotalDto = z.infer; /** @@ -156,7 +156,7 @@ export type CalculatePaymentsResponseDto = z.infer; /** @@ -174,7 +174,7 @@ export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumn * @property { string[] } order * @property { OfficeInvoicePaymentExportFilterDto } filter */ -export const OfficeInvoicePaymentExportRequestDtoSchema = z.object({ columns: z.array(OfficeInvoicePaymentExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: OfficeInvoicePaymentExportFilterDtoSchema }).readonly(); +export const OfficeInvoicePaymentExportRequestDtoSchema = z.object({ columns: z.array(OfficeInvoicePaymentExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: OfficeInvoicePaymentExportFilterDtoSchema.nullable() }).partial(); export type OfficeInvoicePaymentExportRequestDto = z.infer; /** @@ -183,7 +183,7 @@ export type OfficeInvoicePaymentExportRequestDto = z.infer; /** @@ -201,7 +201,7 @@ export type PaymentCreatedByDto = z.infer; * @property { string } updatedAt * @property { PaymentCreatedByDto } createdBy */ -export const PaymentResponseDtoSchema = z.object({ id: z.string(), amount: z.number(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, bankAccountId: z.string().nullish(), bankAccount: z.string().nullish(), comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: PaymentCreatedByDtoSchema.nullish() }).readonly(); +export const PaymentResponseDtoSchema = z.object({ id: z.string(), amount: z.number(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, bankAccountId: z.string().nullish(), bankAccount: z.string().nullish(), comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: PaymentCreatedByDtoSchema.nullish() }); export type PaymentResponseDto = z.infer; /** @@ -221,7 +221,7 @@ export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnum * @property { string } bankAccountId Bank account ID * @property { string } comment Optional comment */ -export const CreateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number().describe("Payment amount"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), paymentMethod: PositionInvoicePaymentMethodEnumSchema.describe("Payment method"), bankAccountId: z.string().describe("Bank account ID").nullish(), comment: z.string().describe("Optional comment").nullish() }).readonly(); +export const CreateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PositionInvoicePaymentMethodEnumSchema, bankAccountId: z.string().nullish(), comment: z.string().nullish() }); export type CreateInvoicePaymentRequestDto = z.infer; /** @@ -233,7 +233,7 @@ export type CreateInvoicePaymentRequestDto = z.infer; /** @@ -243,7 +243,7 @@ export type UpdateInvoicePaymentRequestDto = z.infer; /** @@ -251,7 +251,7 @@ export type BulkCreatePaymentsRequestDto = z.infer; /** @@ -273,7 +273,7 @@ export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnum * @property { number } totalItems Total available items * @property { OfficePaymentPreviewDto[] } items */ -export const ListOfficePaymentsResponseSchema = z.object({ ...OfficePaymentListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).readonly() }).readonly().shape }); +export const ListOfficePaymentsResponseSchema = z.object({ ...OfficePaymentListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).nullable() }).partial().shape }); export type ListOfficePaymentsResponse = z.infer; /** @@ -286,7 +286,7 @@ export type ListOfficePaymentsResponse = z.infer; } diff --git a/test/generated/next/invoicePayments/invoicePayments.queries.ts b/test/generated/next/invoicePayments/invoicePayments.queries.ts index 228c4ea..e31c011 100644 --- a/test/generated/next/invoicePayments/invoicePayments.queries.ts +++ b/test/generated/next/invoicePayments/invoicePayments.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -34,14 +33,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListOfficePayments = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListOfficePayments = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor, config) }, + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -60,14 +59,14 @@ export const useListOfficePayments = ({ officeId, limit, order, filter, p * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListOfficePaymentsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListOfficePaymentsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor, config) }, + return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -87,14 +86,14 @@ export const useListOfficePaymentsInfinite = ({ officeId, limit, order, f * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useBulkCreatePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useBulkCreatePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId } )); - return InvoicePaymentsApi.bulkCreatePayments(officeId, data, config) + return InvoicePaymentsApi.bulkCreatePayments(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -114,14 +113,14 @@ export const useBulkCreatePayments = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useCalculatePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCalculatePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId } )); - return InvoicePaymentsApi.calculatePayments(officeId, data, config) + return InvoicePaymentsApi.calculatePayments(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -141,14 +140,14 @@ export const useCalculatePayments = (options?: AppMutationOptions> } * @statusCodes [200, 201, 401] */ -export const useExportOfficePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useExportOfficePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId } )); - return InvoicePaymentsApi.exportOfficePayments(officeId, data, config) + return InvoicePaymentsApi.exportOfficePayments(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -171,14 +170,14 @@ export const useExportOfficePayments = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useList = ({ officeId, invoiceId, limit, page, cursor }: { officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ officeId, invoiceId, limit, page, cursor }: { officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(officeId, invoiceId, limit, page, cursor), queryFn: () => { checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor, config) }, + return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor) }, ...options, }); }; @@ -196,14 +195,14 @@ export const useList = ({ officeId, invoiceId, limit, page, cursor }: { o * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ officeId, invoiceId, limit, cursor }: { officeId: string, invoiceId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ officeId, invoiceId, limit, cursor }: { officeId: string, invoiceId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), queryFn: ({ pageParam }) => { checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor, config) }, + return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -224,14 +223,14 @@ export const useListInfinite = ({ officeId, invoiceId, limit, cursor }: { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, data }) => { checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId } )); - return InvoicePaymentsApi.create(officeId, invoiceId, data, config) + return InvoicePaymentsApi.create(officeId, invoiceId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -252,14 +251,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetPaymentById = ({ officeId, invoiceId, paymentId }: { officeId: string, invoiceId: string, paymentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetPaymentById = ({ officeId, invoiceId, paymentId }: { officeId: string, invoiceId: string, paymentId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), queryFn: () => { checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId } )); - return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId, config) }, + return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId) }, ...options, }); }; @@ -276,14 +275,14 @@ export const useGetPaymentById = ({ officeId, invoiceId, paymentId }: { o * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, paymentId, data }) => { checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId } )); - return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data, config) + return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -306,14 +305,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useDeleteInvoicePayment = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteInvoicePayment = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, paymentId }) => { checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId } )); - return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId, config) + return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/invoices/invoices.api.ts b/test/generated/next/invoices/invoices.api.ts index 336241b..cc54d52 100644 --- a/test/generated/next/invoices/invoices.api.ts +++ b/test/generated/next/invoices/invoices.api.ts @@ -1,17 +1,15 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { InvoicesModels } from "./invoices.models"; import { CommonModels } from "@/data/common/common.models"; export namespace InvoicesApi { -export const getInvoicesEml = (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, config?: AxiosRequestConfig) => { +export const getInvoicesEml = (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/eml`, { - ...config, params: { invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { type: "query", name: "invoiceIds" }), }, @@ -23,61 +21,58 @@ export const getInvoicesEml = (officeId: string, invoiceIds?: InvoicesModels.Get } ) }; -export const find = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const find = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: InvoicesModels.InvoicesFindResponseSchema }, `/offices/${officeId}/positions/${positionId}/invoices`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const changeIncomingCustomer = (officeId: string, invoiceId: string, data: InvoicesModels.ChangeInvoiceCustomerRequestDto, config?: AxiosRequestConfig) => { +export const changeIncomingCustomer = (officeId: string, invoiceId: string, data: InvoicesModels.ChangeInvoiceCustomerRequestDto, ) => { return AppRestClient.patch( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/customer`, ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), - config + ) }; -export const findByOffice = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const findByOffice = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: InvoicesModels.FindByOfficeResponseSchema }, `/offices/${officeId}/invoices`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const createDraft = (officeId: string, data: InvoicesModels.CreateDraftInvoiceRequestDto, config?: AxiosRequestConfig) => { +export const createDraft = (officeId: string, data: InvoicesModels.CreateDraftInvoiceRequestDto, ) => { return AppRestClient.post( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices`, ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), - config + ) }; -export const exportInvoices = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, config?: AxiosRequestConfig) => { +export const exportInvoices = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/exports`, ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', }, @@ -86,13 +81,12 @@ export const exportInvoices = (officeId: string, data: InvoicesModels.InvoiceExp } ) }; -export const exportCharges = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, config?: AxiosRequestConfig) => { +export const exportCharges = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/charges/exports`, ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', }, @@ -101,28 +95,26 @@ export const exportCharges = (officeId: string, data: InvoicesModels.InvoiceExpo } ) }; -export const getUnCharges = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const getUnCharges = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: InvoicesModels.GetUnChargesResponseSchema }, `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const listAvailablePartnersFor = (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { +export const listAvailablePartnersFor = (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { return AppRestClient.get( { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, `/offices/${officeId}/invoices/${invoiceId}/available-partners`, { - ...config, params: { search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), @@ -130,29 +122,27 @@ export const listAvailablePartnersFor = (officeId: string, invoiceId: string, se } ) }; -export const getOfficeUnCharges = (officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const getOfficeUnCharges = (officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, `/offices/${officeId}/uninvoiced-charges`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const exportUnCharges = (officeId: string, data: InvoicesModels.UninvoicedChargesExportRequestDto, config?: AxiosRequestConfig) => { +export const exportUnCharges = (officeId: string, data: InvoicesModels.UninvoicedChargesExportRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/uninvoiced-charges/exports`, ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', }, @@ -161,100 +151,95 @@ export const exportUnCharges = (officeId: string, data: InvoicesModels.Uninvoice } ) }; -export const createDirect = (officeId: string, config?: AxiosRequestConfig) => { +export const createDirect = (officeId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/direct-invoices`, - undefined, - config + ) }; -export const addChargeToDirect = (officeId: string, invoiceId: string, data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, config?: AxiosRequestConfig) => { +export const addChargeToDirect = (officeId: string, invoiceId: string, data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, ) => { return AppRestClient.post( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/charges`, ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), - config + ) }; -export const updateCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceChargesRequestDto, config?: AxiosRequestConfig) => { +export const updateCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceChargesRequestDto, ) => { return AppRestClient.patch( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/charges`, ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), - config + ) }; -export const removeChargeFromDirect = (officeId: string, invoiceId: string, chargeId: string, config?: AxiosRequestConfig) => { +export const removeChargeFromDirect = (officeId: string, invoiceId: string, chargeId: string, ) => { return AppRestClient.delete( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, - undefined, - config + ) }; -export const getDetail = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const getDetail = (officeId: string, invoiceId: string, ) => { return AppRestClient.get( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}`, - config + ) }; -export const update = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceRequestDto, config?: AxiosRequestConfig) => { +export const update = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceRequestDto, ) => { return AppRestClient.patch( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}`, ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), - config + ) }; -export const deleteInvoice = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const deleteInvoice = (officeId: string, invoiceId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/invoices/${invoiceId}`, - undefined, - config + ) }; -export const fix = (officeId: string, invoiceId: string, data: InvoicesModels.FixInvoiceRequestDto, config?: AxiosRequestConfig) => { +export const fix = (officeId: string, invoiceId: string, data: InvoicesModels.FixInvoiceRequestDto, ) => { return AppRestClient.patch( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/fix`, ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), - config + ) }; -export const generate = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const generate = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/invoices/${invoiceId}/document`, - undefined, - config + ) }; -export const updateIssuedVatRules = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, config?: AxiosRequestConfig) => { +export const updateIssuedVatRules = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, ) => { return AppRestClient.patch( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), - config + ) }; -export const updateIssuedCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, config?: AxiosRequestConfig) => { +export const updateIssuedCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, ) => { return AppRestClient.patch( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), - config + ) }; -export const issue = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const issue = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/issue`, undefined, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -263,21 +248,19 @@ export const issue = (officeId: string, invoiceId: string, config?: AxiosRequest } ) }; -export const reportHungarian = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const reportHungarian = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, - undefined, - config + ) }; -export const generateIncoming = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const generateIncoming = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, undefined, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -286,20 +269,18 @@ export const generateIncoming = (officeId: string, invoiceId: string, config?: A } ) }; -export const register = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const register = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/register`, - undefined, - config + ) }; -export const getPreview = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const getPreview = (officeId: string, invoiceId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -308,12 +289,11 @@ export const getPreview = (officeId: string, invoiceId: string, config?: AxiosRe } ) }; -export const getInvoiceEml = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const getInvoiceEml = (officeId: string, invoiceId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/eml`, { - ...config, headers: { 'Accept': 'application/octet-stream', }, @@ -322,28 +302,26 @@ export const getInvoiceEml = (officeId: string, invoiceId: string, config?: Axio } ) }; -export const prepareDocumentUpload = (officeId: string, invoiceId: string, data: InvoicesModels.PrepareUploadRequestDto, config?: AxiosRequestConfig) => { +export const prepareDocumentUpload = (officeId: string, invoiceId: string, data: InvoicesModels.PrepareUploadRequestDto, ) => { return AppRestClient.post( { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/upload-document`, ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), - config + ) }; -export const cancel = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const cancel = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/cancel`, - undefined, - config + ) }; -export const issueCreditNote = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { +export const issueCreditNote = (officeId: string, invoiceId: string, ) => { return AppRestClient.post( { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, - undefined, - config + ) }; } diff --git a/test/generated/next/invoices/invoices.models.ts b/test/generated/next/invoices/invoices.models.ts index 08cb405..f1cd629 100644 --- a/test/generated/next/invoices/invoices.models.ts +++ b/test/generated/next/invoices/invoices.models.ts @@ -10,7 +10,7 @@ export namespace InvoicesModels { * @property { string } matchCode * @property { string } label */ -export const InvoiceBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(); +export const InvoiceBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); export type InvoiceBusinessPartnerResponseDto = z.infer; /** @@ -19,7 +19,7 @@ export type InvoiceBusinessPartnerResponseDto = z.infer; /** @@ -29,7 +29,7 @@ export type InvoiceEmployeeResponseDto = z.infer; /** @@ -51,7 +51,7 @@ export type InvoiceRelatedInvoiceResponseDto = z.infer; /** @@ -62,7 +62,7 @@ export type InvoicePreviewDto = z.infer; * @property { string } matchCode * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name */ -export const InvoicePartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); +export const InvoicePartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); export type InvoicePartnerDto = z.infer; /** @@ -93,7 +93,7 @@ export type InvoicePartnerDto = z.infer; * @property { string } dateOfDeparture * @property { string } dateOfArrival */ -export const InvoicePositionDtoSchema = z.object({ id: z.string(), number: z.string(), transportType: z.string(), ourReference: z.string().nullish(), finalDestination: z.string().nullish(), shipper: InvoicePartnerDtoSchema.nullish(), consignee: InvoicePartnerDtoSchema.nullish(), vessel: z.string().nullish(), emptyPickup: z.string().nullish(), loadingAddress: z.string().nullish(), portOfLoading: z.string().nullish(), portOfDischarge: z.string().nullish(), carrierBl: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterAWB: z.string().nullish(), hawbNumber: z.string().nullish(), flightNo: z.string().nullish(), pickupAddress: z.string().nullish(), originAirport: z.string().nullish(), destinationAirport: z.string().nullish(), originLocation: z.string().nullish(), destinationLocation: z.string().nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export const InvoicePositionDtoSchema = z.object({ id: z.string(), number: z.string(), transportType: z.string(), ourReference: z.string().nullish(), finalDestination: z.string().nullish(), shipper: InvoicePartnerDtoSchema.nullish(), consignee: InvoicePartnerDtoSchema.nullish(), vessel: z.string().nullish(), emptyPickup: z.string().nullish(), loadingAddress: z.string().nullish(), portOfLoading: z.string().nullish(), portOfDischarge: z.string().nullish(), carrierBl: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterAWB: z.string().nullish(), hawbNumber: z.string().nullish(), flightNo: z.string().nullish(), pickupAddress: z.string().nullish(), originAirport: z.string().nullish(), destinationAirport: z.string().nullish(), originLocation: z.string().nullish(), destinationLocation: z.string().nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish() }); export type InvoicePositionDto = z.infer; /** @@ -102,7 +102,7 @@ export type InvoicePositionDto = z.infer; * @property { string } id * @property { string } name */ -export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }); export type InvoiceChargeTypeDto = z.infer; /** @@ -113,7 +113,7 @@ export type InvoiceChargeTypeDto = z.infer; * @property { string } matchCode * @property { number } rate */ -export const InvoiceVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }).readonly(); +export const InvoiceVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }); export type InvoiceVatRuleDto = z.infer; /** @@ -136,7 +136,7 @@ export type InvoiceVatRuleDto = z.infer; * @property { string } outgoingInvoiceId * @property { string } registeredInvoiceId */ -export const InvoiceFinanceLineDtoSchema = z.object({ positionChargeItemId: z.string(), chargeType: InvoiceChargeTypeDtoSchema, additionalText: z.string(), quantity: z.number(), netAmount: z.number(), grossAmount: z.number(), sumInInvoiceCurrency: z.number().nullish(), sumInOfficeCurrency: z.number().nullish(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), vatRule: InvoiceVatRuleDtoSchema, exchangedNetAmount: z.number().nullish(), positionNumber: z.string().nullish(), positionId: z.string().nullish(), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish() }).readonly(); +export const InvoiceFinanceLineDtoSchema = z.object({ positionChargeItemId: z.string(), chargeType: InvoiceChargeTypeDtoSchema, additionalText: z.string(), quantity: z.number(), netAmount: z.number(), grossAmount: z.number(), sumInInvoiceCurrency: z.number().nullish(), sumInOfficeCurrency: z.number().nullish(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), vatRule: InvoiceVatRuleDtoSchema, exchangedNetAmount: z.number().nullish(), positionNumber: z.string().nullish(), positionId: z.string().nullish(), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish() }); export type InvoiceFinanceLineDto = z.infer; /** @@ -147,7 +147,7 @@ export type InvoiceFinanceLineDto = z.infer; * @property { boolean } showWatermarkOnDocuments * @property { CommonModels.LocaleEnum } locale */ -export const InvoiceConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); +export const InvoiceConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); export type InvoiceConfigDto = z.infer; /** @@ -163,7 +163,7 @@ export type InvoiceConfigDto = z.infer; * @property { string } contact * @property { string } partnerRegistrationNumber */ -export const InvoiceCustomerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string().nullish(), label: z.string().nullish(), address: z.string().nullish(), vatNumber: z.string(), reference: z.string().nullish(), contact: z.string().nullish(), partnerRegistrationNumber: z.string().nullish() }).readonly(); +export const InvoiceCustomerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string().nullish(), label: z.string().nullish(), address: z.string().nullish(), vatNumber: z.string(), reference: z.string().nullish(), contact: z.string().nullish(), partnerRegistrationNumber: z.string().nullish() }); export type InvoiceCustomerDto = z.infer; /** @@ -172,7 +172,7 @@ export type InvoiceCustomerDto = z.infer; * @property { string } id * @property { string } name */ -export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }); export type InvoiceOfficeDto = z.infer; /** @@ -182,7 +182,7 @@ export type InvoiceOfficeDto = z.infer; * @property { string } name * @property { string } phoneNumber */ -export const InvoiceSalesRepDtoSchema = z.object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }).readonly(); +export const InvoiceSalesRepDtoSchema = z.object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }); export type InvoiceSalesRepDto = z.infer; /** @@ -194,7 +194,7 @@ export type InvoiceSalesRepDto = z.infer; * @property { string } vatNumber * @property { string } partnerRegistrationNumber */ -export const InvoiceServiceRecipientDtoSchema = z.object({ id: z.string(), name: z.string(), address: z.string().nullish(), vatNumber: z.string(), partnerRegistrationNumber: z.string().nullish() }).readonly(); +export const InvoiceServiceRecipientDtoSchema = z.object({ id: z.string(), name: z.string(), address: z.string().nullish(), vatNumber: z.string(), partnerRegistrationNumber: z.string().nullish() }); export type InvoiceServiceRecipientDto = z.infer; /** @@ -210,7 +210,7 @@ export type InvoiceServiceRecipientDto = z.infer; /** @@ -220,7 +220,7 @@ export type InvoiceBankAccountDto = z.infer; * @property { object } json * @property { any } json.[key] */ -export const InvoiceRemarksDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); +export const InvoiceRemarksDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); export type InvoiceRemarksDto = z.infer; /** @@ -238,7 +238,7 @@ export type InvoiceRemarksDto = z.infer; * @property { number } netAmountInOfficeCurrency * @property { number } grossAmountInOfficeCurrency */ -export const InvoiceVatLineDtoSchema = z.object({ vatRuleId: z.string().describe("ID of the VAT rule"), name: z.string().describe("Name of the VAT rule"), printNumber: z.string().describe("Reference numerical string for vat rules"), matchCode: z.string().describe("Match code of the VAT rule"), vatPercentage: z.number().describe("The actual VAT rate (e.g., 19 for 19%)"), netAmount: z.number().describe("Sum of net amounts from financeLines using this vatRuleId"), vatAmount: z.number().describe("Calculated total VAT for this rate (netAmount * vatPercentage / 100)"), grossAmount: z.number().describe("Sum of netAmount + vatAmount for this rate"), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish() }).readonly(); +export const InvoiceVatLineDtoSchema = z.object({ vatRuleId: z.string(), name: z.string(), printNumber: z.string(), matchCode: z.string(), vatPercentage: z.number(), netAmount: z.number(), vatAmount: z.number(), grossAmount: z.number(), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish() }); export type InvoiceVatLineDto = z.infer; /** @@ -248,7 +248,7 @@ export type InvoiceVatLineDto = z.infer; * @property { string } number * @property { string } internalNumber */ -export const RelatedInvoiceDetailDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }).readonly(); +export const RelatedInvoiceDetailDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }); export type RelatedInvoiceDetailDto = z.infer; /** @@ -325,7 +325,7 @@ export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; * @property { number } grossAmountInOfficeCurrency * @property { string } createdAt */ -export const InvoiceDetailDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullish(), costCenter: z.string().nullish(), status: CommonModels.InvoiceStatusEnumSchema, language: InvoiceLanguageEnumSchema, isVatOk: z.boolean(), isInvoiceOk: z.boolean(), issuingDate: z.iso.datetime({ offset: true }).nullish(), receiptDate: z.iso.datetime({ offset: true }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), isExportedToBookkeeping: z.boolean(), sentAt: z.iso.datetime({ offset: true }).nullish(), creditNoteId: z.string().nullish(), draftCreditNoteId: z.string().nullish(), cancelledInvoiceId: z.string().nullish(), uploadedDocumentUrl: z.string().nullish(), customer: InvoiceCustomerDtoSchema.nullish(), customerNumber: z.string().nullish(), customerNameOverride: z.string().nullish(), customerReferenceOverride: z.string().nullish(), customerContactOverride: z.string().nullish(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), position: InvoicePositionDtoSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesOffice: InvoiceOfficeDtoSchema, salesRep: InvoiceSalesRepDtoSchema, totalNet: z.number(), totalVat: z.number().nullish(), totalGross: z.number(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), paymentTermDays: z.number().nullish(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), showPaymentInstructions: z.boolean().nullish(), dunningBlock: z.boolean().nullish(), invoiceInReview: z.boolean().nullish(), comments: z.string().nullish(), bankAccount: InvoiceBankAccountDtoSchema.nullish(), financeLines: z.array(InvoiceFinanceLineDtoSchema).readonly(), remarks: InvoiceRemarksDtoSchema.nullish(), vatLines: z.array(InvoiceVatLineDtoSchema).readonly(), config: InvoiceConfigDtoSchema.nullish(), creditNote: RelatedInvoiceDetailDtoSchema.nullish(), draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), officeCurrencyNotation: z.string().nullish(), inverseCurrencyNotation: z.string().nullish(), inverseExchangeRate: z.number().nullish(), requiresSpecialTablePresentation: z.boolean().nullish(), paidAmount: z.number(), outstandingAmount: z.number(), paidOn: z.iso.datetime({ offset: true }).nullish(), isIssued: z.boolean(), grossAmountInOfficeCurrency: z.number().nullish(), createdAt: z.iso.datetime({ offset: true }) }).readonly(); +export const InvoiceDetailDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullish(), costCenter: z.string().nullish(), status: CommonModels.InvoiceStatusEnumSchema, language: InvoiceLanguageEnumSchema, isVatOk: z.boolean(), isInvoiceOk: z.boolean(), issuingDate: z.iso.datetime({ offset: true }).nullish(), receiptDate: z.iso.datetime({ offset: true }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), isExportedToBookkeeping: z.boolean(), sentAt: z.iso.datetime({ offset: true }).nullish(), creditNoteId: z.string().nullish(), draftCreditNoteId: z.string().nullish(), cancelledInvoiceId: z.string().nullish(), uploadedDocumentUrl: z.string().nullish(), customer: InvoiceCustomerDtoSchema.nullish(), customerNumber: z.string().nullish(), customerNameOverride: z.string().nullish(), customerReferenceOverride: z.string().nullish(), customerContactOverride: z.string().nullish(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), position: InvoicePositionDtoSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesOffice: InvoiceOfficeDtoSchema, salesRep: InvoiceSalesRepDtoSchema, totalNet: z.number(), totalVat: z.number().nullish(), totalGross: z.number(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), paymentTermDays: z.number().nullish(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), showPaymentInstructions: z.boolean().nullish(), dunningBlock: z.boolean().nullish(), invoiceInReview: z.boolean().nullish(), comments: z.string().nullish(), bankAccount: InvoiceBankAccountDtoSchema.nullish(), financeLines: z.array(InvoiceFinanceLineDtoSchema), remarks: InvoiceRemarksDtoSchema.nullish(), vatLines: z.array(InvoiceVatLineDtoSchema), config: InvoiceConfigDtoSchema.nullish(), creditNote: RelatedInvoiceDetailDtoSchema.nullish(), draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), officeCurrencyNotation: z.string().nullish(), inverseCurrencyNotation: z.string().nullish(), inverseExchangeRate: z.number().nullish(), requiresSpecialTablePresentation: z.boolean().nullish(), paidAmount: z.number(), outstandingAmount: z.number(), paidOn: z.iso.datetime({ offset: true }).nullish(), isIssued: z.boolean(), grossAmountInOfficeCurrency: z.number().nullish(), createdAt: z.iso.datetime({ offset: true }) }); export type InvoiceDetailDto = z.infer; /** @@ -334,7 +334,7 @@ export type InvoiceDetailDto = z.infer; * @property { number } amount * @property { string } currencyNotation */ -export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); +export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); export type TotalAmountsDto = z.infer; /** @@ -350,7 +350,7 @@ export type TotalAmountsDto = z.infer; * @property { number } limit Items per response * @property { number } totalItems Total available items */ -export const OfficeInvoiceListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalAmountInDefaultCurrency: z.number().nullish(), defaultCurrencyNotation: z.string().nullish(), totalAmounts: z.array(TotalAmountsDtoSchema).readonly(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); +export const OfficeInvoiceListResponseDtoSchema = z.object({ items: z.array(z.string()), totalAmountInDefaultCurrency: z.number().nullish(), defaultCurrencyNotation: z.string().nullish(), totalAmounts: z.array(TotalAmountsDtoSchema), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); export type OfficeInvoiceListResponseDto = z.infer; /** @@ -360,7 +360,7 @@ export type OfficeInvoiceListResponseDto = z.infer; /** @@ -371,7 +371,7 @@ export type InvoicePreviewPositionDto = z.infer; /** @@ -380,7 +380,7 @@ export type InvoicePreviewReceiverDto = z.infer; /** @@ -389,7 +389,7 @@ export type InvoicePreviewReceiverCountryDto = z.infer; /** @@ -399,7 +399,7 @@ export type InvoicePreviewClerkDto = z.infer; /** @@ -444,7 +444,7 @@ export type VatRuleLabelResponseDto = z.infer; /** @@ -476,7 +476,7 @@ export type OfficeInvoicePreviewDto = z.infer; /** @@ -494,7 +494,7 @@ export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; * @property { string[] } order * @property { InvoiceExportFilterDto } filter */ -export const InvoiceExportRequestDtoSchema = z.object({ columns: z.array(InvoiceExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: InvoiceExportFilterDtoSchema }).readonly(); +export const InvoiceExportRequestDtoSchema = z.object({ columns: z.array(InvoiceExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: InvoiceExportFilterDtoSchema.nullable() }).partial(); export type InvoiceExportRequestDto = z.infer; /** @@ -503,7 +503,7 @@ export type InvoiceExportRequestDto = z.infer; /** @@ -517,7 +517,7 @@ export type UninvoicedChargeTotalAmountDto = z.infer; /** @@ -528,7 +528,7 @@ export type UninvoicedChargeListResponseDto = z.infer; /** @@ -537,7 +537,7 @@ export type ReceiverDto = z.infer; * @property { string } id * @property { string } number */ -export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }); export type UninvoicedChargePositionDto = z.infer; /** @@ -546,7 +546,7 @@ export type UninvoicedChargePositionDto = z.infer; /** @@ -556,7 +556,7 @@ export type UninvoicedChargeChargeTypeDto = z.infer; /** @@ -575,7 +575,7 @@ export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSc * @property { string } lastName * @property { string } fullName */ -export const UninvoicedChargeEmployeeDtoSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }).readonly(); +export const UninvoicedChargeEmployeeDtoSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }); export type UninvoicedChargeEmployeeDto = z.infer; /** @@ -597,7 +597,7 @@ export type UninvoicedChargeEmployeeDto = z.infer; /** @@ -611,7 +611,7 @@ export type UninvoicedChargeDto = z.infer; * @property { string[] } currency * @property { string } vatRuleId */ -export const UninvoicedChargePaginationDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), chargeItemId: z.string(), receiverId: z.string(), chargeTypeId: z.string(), serviceDate: CommonModels.DateRangeDtoSchema, currency: z.array(z.string()).readonly(), vatRuleId: z.string() }).readonly(); +export const UninvoicedChargePaginationDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), chargeItemId: z.string().nullable(), receiverId: z.string().nullable(), chargeTypeId: z.string().nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), currency: z.array(z.string()).nullable(), vatRuleId: z.string().nullable() }).partial(); export type UninvoicedChargePaginationDto = z.infer; /** @@ -627,7 +627,7 @@ export type UninvoicedChargePaginationDto = z.infer; /** @@ -642,7 +642,7 @@ export type UninvoicedChargesFilterDto = z.infer; /** @@ -660,7 +660,7 @@ export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.e * @property { string[] } order * @property { UninvoicedChargesExportFilterDto } filter */ -export const UninvoicedChargesExportRequestDtoSchema = z.object({ columns: z.array(UninvoicedChargeExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: UninvoicedChargesExportFilterDtoSchema }).readonly(); +export const UninvoicedChargesExportRequestDtoSchema = z.object({ columns: z.array(UninvoicedChargeExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: UninvoicedChargesExportFilterDtoSchema.nullable() }).partial(); export type UninvoicedChargesExportRequestDto = z.infer; /** @@ -671,7 +671,7 @@ export type UninvoicedChargesExportRequestDto = z.infer; /** @@ -681,7 +681,7 @@ export type CreateDraftInvoiceRequestDto = z.infer; /** @@ -691,7 +691,7 @@ export type UpdateInvoiceRemarksDto = z.infer; /** @@ -716,7 +716,7 @@ export type UpdateInvoiceCustomerDto = z.infer; /** @@ -726,7 +726,7 @@ export type UpdateInvoiceRequestDto = z.infer; /** @@ -734,7 +734,7 @@ export type FixInvoiceRemarksDto = z.infer; * @type { object } * @property { string } reference Customer reference number */ -export const FixInvoiceCustomerDtoSchema = z.object({ reference: z.string().describe("Customer reference number") }).readonly(); +export const FixInvoiceCustomerDtoSchema = z.object({ reference: z.string().nullable() }).partial(); export type FixInvoiceCustomerDto = z.infer; /** @@ -760,7 +760,7 @@ export type FixInvoiceCustomerDto = z.infer; * @property { string } serviceRecipientId Service recipient ID * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) */ -export const FixInvoiceRequestDtoSchema = z.object({ currencyNotation: z.string().describe("Invoice currency (incoming invoices only)"), issuingDate: z.iso.datetime({ offset: true }).describe("Update invoice date in ISO format"), dueDate: z.iso.datetime({ offset: true }).describe("Update invoice due date in ISO format"), exchangeRate: z.number().describe("Invoice exchange rate").nullable(), paymentTermDays: z.number().describe("Payment term in days").nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, receiptDate: z.iso.datetime({ offset: true }).describe("Update receipt date in ISO format"), serviceDate: z.iso.datetime({ offset: true }).describe("Update service date in ISO format").nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).describe("Update service end date in ISO format"), isVatOk: z.boolean().describe("Mark VAT as checked/OK by accounting"), isInvoiceOk: z.boolean().describe("Mark overall invoice as checked/OK by accounting"), dunningBlock: z.boolean(), invoiceInReview: z.boolean(), comments: z.string(), remarks: FixInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), invoiceNumber: z.string().describe("Invoice number (incoming invoices only)").nullable(), bankAccountId: z.string().describe("Bank account ID").nullable(), serviceRecipientId: z.string().describe("Service recipient ID").nullable(), customer: FixInvoiceCustomerDtoSchema.describe("Customer reference (incoming invoices only)") }).readonly(); +export const FixInvoiceRequestDtoSchema = z.object({ currencyNotation: z.string().nullable(), issuingDate: z.iso.datetime({ offset: true }).nullable(), dueDate: z.iso.datetime({ offset: true }).nullable(), exchangeRate: z.number().nullable(), paymentTermDays: z.number().nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullable(), receiptDate: z.iso.datetime({ offset: true }).nullable(), serviceDate: z.iso.datetime({ offset: true }).nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).nullable(), isVatOk: z.boolean().nullable(), isInvoiceOk: z.boolean().nullable(), dunningBlock: z.boolean().nullable(), invoiceInReview: z.boolean().nullable(), comments: z.string().nullable(), remarks: FixInvoiceRemarksDtoSchema.nullable(), invoiceNumber: z.string().nullable(), bankAccountId: z.string().nullable(), serviceRecipientId: z.string().nullable(), customer: FixInvoiceCustomerDtoSchema.nullable() }).partial(); export type FixInvoiceRequestDto = z.infer; /** @@ -775,7 +775,7 @@ export type FixInvoiceRequestDto = z.infer; * @property { number } exchangeRate Charge exchange rate (incoming invoices only) * @property { string } currencyNotation */ -export const UpdateIssuedInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string().describe("Position charge item ID"), chargeTypeId: z.string().describe("Charge type ID").nullish(), additionalText: z.string().describe("Additional text for the charge").nullish(), quantity: z.number().gte(0).describe("Quantity").nullish(), amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), vatRuleId: z.string().describe("VAT rule ID").nullish(), exchangeRate: z.number().describe("Charge exchange rate (incoming invoices only)").nullish(), currencyNotation: z.string().nullish() }).readonly(); +export const UpdateIssuedInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string(), chargeTypeId: z.string().nullish(), additionalText: z.string().nullish(), quantity: z.number().gte(0).nullish(), amount: z.number().gte(0.01).nullish(), vatRuleId: z.string().nullish(), exchangeRate: z.number().nullish(), currencyNotation: z.string().nullish() }); export type UpdateIssuedInvoiceChargeRequestDto = z.infer; /** @@ -783,7 +783,7 @@ export type UpdateIssuedInvoiceChargeRequestDto = z.infer; /** @@ -798,7 +798,7 @@ export type UpdateIssuedInvoiceChargesRequestDto = z.infer; /** @@ -806,7 +806,7 @@ export type UpdateInvoiceChargeRequestDto = z.infer; /** @@ -816,7 +816,7 @@ export type UpdateInvoiceChargesRequestDto = z.infer; /** @@ -824,7 +824,7 @@ export type InvoiceFilterDto = z.infer; * @type { object } * @property { string } newCustomerId */ -export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }).readonly(); +export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }); export type ChangeInvoiceCustomerRequestDto = z.infer; /** @@ -844,7 +844,7 @@ export type ChangeInvoiceCustomerRequestDto = z.infer; /** @@ -853,7 +853,7 @@ export type CreateDirectInvoiceChargeRequestDto = z.infer; /** @@ -863,7 +863,7 @@ export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; /** @@ -872,15 +872,14 @@ export type PrepareUploadRequestDto = z.infer; /** * GetInvoicesEmlInvoiceIdsParamSchema * @type { array } - * @description Invoice IDs */ -export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).readonly().describe("Invoice IDs").nullish(); +export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).nullish(); export type GetInvoicesEmlInvoiceIdsParam = z.infer; /** @@ -901,7 +900,7 @@ export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; * @property { number } totalItems Total available items * @property { InvoicePreviewDto[] } items */ -export const InvoicesFindResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(InvoicePreviewDtoSchema).readonly() }).readonly().shape }); +export const InvoicesFindResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(InvoicePreviewDtoSchema).nullable() }).partial().shape }); export type InvoicesFindResponse = z.infer; /** @@ -925,7 +924,7 @@ export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; * @property { number } totalItems Total available items * @property { OfficeInvoicePreviewDto[] } items */ -export const FindByOfficeResponseSchema = z.object({ ...OfficeInvoiceListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).readonly() }).readonly().shape }); +export const FindByOfficeResponseSchema = z.object({ ...OfficeInvoiceListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).nullable() }).partial().shape }); export type FindByOfficeResponse = z.infer; /** @@ -947,7 +946,7 @@ export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; * @property { number } totalItems Total available items * @property { UninvoicedChargeDto[] } items */ -export const GetUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape }); +export const GetUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).nullable() }).partial().shape }); export type GetUnChargesResponse = z.infer; /** @@ -960,7 +959,7 @@ export type GetUnChargesResponse = z.infer; * @property { number } totalItems Total available items * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items */ -export const InvoicesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); +export const InvoicesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).nullable() }).partial().shape }); export type InvoicesListAvailablePartnersForResponse = z.infer; /** @@ -982,7 +981,7 @@ export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnum * @property { number } totalItems Total available items * @property { UninvoicedChargeDto[] } items */ -export const GetOfficeUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape }); +export const GetOfficeUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).nullable() }).partial().shape }); export type GetOfficeUnChargesResponse = z.infer; } diff --git a/test/generated/next/invoices/invoices.queries.ts b/test/generated/next/invoices/invoices.queries.ts index 1046ddd..528519a 100644 --- a/test/generated/next/invoices/invoices.queries.ts +++ b/test/generated/next/invoices/invoices.queries.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -39,14 +39,14 @@ export const keys = { * @returns { UseQueryResult> } * @statusCodes [200, 401] */ -export const useGetInvoicesEml = ({ officeId, invoiceIds }: { officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetInvoicesEml = ({ officeId, invoiceIds }: { officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getInvoicesEml(officeId, invoiceIds), queryFn: () => { checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config) }, + return InvoicesApi.getInvoicesEml(officeId, invoiceIds) }, ...options, }); }; @@ -61,14 +61,14 @@ export const useGetInvoicesEml = ({ officeId, invoiceIds }: { officeId: s * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const useGetInvoicesEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGetInvoicesEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceIds }) => { checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config) + return InvoicesApi.getInvoicesEml(officeId, invoiceIds) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -95,14 +95,14 @@ export const useGetInvoicesEmlMutation = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFind = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFind = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(InvoicesAcl.canUseFind({ officeId } )); - return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor, config) }, + return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -122,14 +122,14 @@ export const useFind = ({ officeId, positionId, limit, order, filter, pag * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useFindInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useFindInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(InvoicesAcl.canUseFind({ officeId } )); - return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, + return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -150,14 +150,14 @@ export const useFindInfinite = ({ officeId, positionId, limit, order, fil * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useChangeIncomingCustomer = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useChangeIncomingCustomer = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, data }) => { checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId } )); - return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data, config) + return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -183,14 +183,14 @@ export const useChangeIncomingCustomer = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); - return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor, config) }, + return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -209,14 +209,14 @@ export const useFindByOffice = ({ officeId, limit, order, filter, page, c * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useFindByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useFindByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); - return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor, config) }, + return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -236,14 +236,14 @@ export const useFindByOfficeInfinite = ({ officeId, limit, order, filter, * @returns { UseMutationResult } * @statusCodes [201, 401, default] */ -export const useCreateDraft = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateDraft = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(InvoicesAcl.canUseCreateDraft({ officeId } )); - return InvoicesApi.createDraft(officeId, data, config) + return InvoicesApi.createDraft(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -263,14 +263,14 @@ export const useCreateDraft = (options?: AppMutationOptions> } * @statusCodes [200, 201, 401] */ -export const useExportInvoices = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useExportInvoices = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(InvoicesAcl.canUseExportInvoices({ officeId } )); - return InvoicesApi.exportInvoices(officeId, data, config) + return InvoicesApi.exportInvoices(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -292,14 +292,14 @@ export const useExportInvoices = (options?: AppMutationOptions> } * @statusCodes [200, 201, 401] */ -export const useExportCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useExportCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(InvoicesAcl.canUseExportCharges({ officeId } )); - return InvoicesApi.exportCharges(officeId, data, config) + return InvoicesApi.exportCharges(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -326,14 +326,14 @@ export const useExportCharges = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetUnCharges = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetUnCharges = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor, config) }, + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -353,14 +353,14 @@ export const useGetUnCharges = ({ officeId, positionId, limit, order, fil * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useGetUnChargesInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useGetUnChargesInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, + return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -382,14 +382,14 @@ export const useGetUnChargesInfinite = ({ officeId, positionId, limit, or * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListAvailablePartnersFor = ({ officeId, invoiceId, search, useCase }: { officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListAvailablePartnersFor = ({ officeId, invoiceId, search, useCase }: { officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), queryFn: () => { checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId } )); - return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase, config) }, + return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase) }, ...options, }); }; @@ -408,14 +408,14 @@ export const useListAvailablePartnersFor = ({ officeId, invoiceId, search * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetOfficeUnCharges = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetOfficeUnCharges = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor, config) }, + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -434,14 +434,14 @@ export const useGetOfficeUnCharges = ({ officeId, limit, order, filter, p * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useGetOfficeUnChargesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useGetOfficeUnChargesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor, config) }, + return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -461,14 +461,14 @@ export const useGetOfficeUnChargesInfinite = ({ officeId, limit, order, f * @returns { UseMutationResult> } * @statusCodes [200, 201, 401] */ -export const useExportUnCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useExportUnCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId } )); - return InvoicesApi.exportUnCharges(officeId, data, config) + return InvoicesApi.exportUnCharges(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -489,14 +489,14 @@ export const useExportUnCharges = (options?: AppMutationOptions } * @statusCodes [201, 401, default] */ -export const useCreateDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId }) => { checkAcl(InvoicesAcl.canUseCreateDirect({ officeId } )); - return InvoicesApi.createDirect(officeId, config) + return InvoicesApi.createDirect(officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -517,14 +517,14 @@ export const useCreateDirect = (options?: AppMutationOptions } * @statusCodes [201, 401, default] */ -export const useAddChargeToDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useAddChargeToDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, data }) => { checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId } )); - return InvoicesApi.addChargeToDirect(officeId, invoiceId, data, config) + return InvoicesApi.addChargeToDirect(officeId, invoiceId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -547,14 +547,14 @@ export const useAddChargeToDirect = (options?: AppMutationOptions } * @statusCodes [200, 401, default] */ -export const useUpdateCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, data }) => { checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId } )); - return InvoicesApi.updateCharges(officeId, invoiceId, data, config) + return InvoicesApi.updateCharges(officeId, invoiceId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -577,14 +577,14 @@ export const useUpdateCharges = (options?: AppMutationOptions } * @statusCodes [200, 401, default] */ -export const useRemoveChargeFromDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useRemoveChargeFromDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, chargeId }) => { checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId } )); - return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId, config) + return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -606,14 +606,14 @@ export const useRemoveChargeFromDirect = (options?: AppMutationOptions } * @statusCodes [200, 401, default] */ -export const useGetDetail = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetDetail = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getDetail(officeId, invoiceId), queryFn: () => { checkAcl(InvoicesAcl.canUseGetDetail({ officeId } )); - return InvoicesApi.getDetail(officeId, invoiceId, config) }, + return InvoicesApi.getDetail(officeId, invoiceId) }, ...options, }); }; @@ -629,14 +629,14 @@ export const useGetDetail = ({ officeId, invoiceId }: { officeId: string, * @returns { UseMutationResult } * @statusCodes [200, 401, default] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, data }) => { checkAcl(InvoicesAcl.canUseUpdate({ officeId } )); - return InvoicesApi.update(officeId, invoiceId, data, config) + return InvoicesApi.update(officeId, invoiceId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -658,14 +658,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeleteInvoice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteInvoice = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId }) => { checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId } )); - return InvoicesApi.deleteInvoice(officeId, invoiceId, config) + return InvoicesApi.deleteInvoice(officeId, invoiceId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -686,14 +686,14 @@ export const useDeleteInvoice = (options?: AppMutationOptions } * @statusCodes [200, 401, default] */ -export const useFix = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useFix = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, data }) => { checkAcl(InvoicesAcl.canUseFix({ officeId } )); - return InvoicesApi.fix(officeId, invoiceId, data, config) + return InvoicesApi.fix(officeId, invoiceId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -715,14 +715,14 @@ export const useFix = (options?: AppMutationOptions> } * @statusCodes [201, 401] */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId }) => { checkAcl(InvoicesAcl.canUseGenerate({ officeId } )); - return InvoicesApi.generate(officeId, invoiceId, config) + return InvoicesApi.generate(officeId, invoiceId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -743,14 +743,14 @@ export const useGenerate = (options?: AppMutationOptions } * @statusCodes [200, 401, default] */ -export const useUpdateIssuedVatRules = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateIssuedVatRules = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, data }) => { checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId } )); - return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data, config) + return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -773,14 +773,14 @@ export const useUpdateIssuedVatRules = (options?: AppMutationOptions } * @statusCodes [200, 401, default] */ -export const useUpdateIssuedCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateIssuedCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId, data }) => { checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId } )); - return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data, config) + return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -802,14 +802,14 @@ export const useUpdateIssuedCharges = (options?: AppMutationOptions> } * @statusCodes [200, 201, 401] */ -export const useIssue = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useIssue = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId }) => { checkAcl(InvoicesAcl.canUseIssue({ officeId } )); - return InvoicesApi.issue(officeId, invoiceId, config) + return InvoicesApi.issue(officeId, invoiceId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -831,14 +831,14 @@ export const useIssue = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useReportHungarian = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useReportHungarian = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId }) => { checkAcl(InvoicesAcl.canUseReportHungarian({ officeId } )); - return InvoicesApi.reportHungarian(officeId, invoiceId, config) + return InvoicesApi.reportHungarian(officeId, invoiceId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -858,14 +858,14 @@ export const useReportHungarian = (options?: AppMutationOptions> } * @statusCodes [200, 201, 401] */ -export const useGenerateIncoming = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateIncoming = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId }) => { checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId } )); - return InvoicesApi.generateIncoming(officeId, invoiceId, config) + return InvoicesApi.generateIncoming(officeId, invoiceId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -887,14 +887,14 @@ export const useGenerateIncoming = (options?: AppMutationOptions } * @statusCodes [200, 401, default] */ -export const useRegister = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useRegister = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId }) => { checkAcl(InvoicesAcl.canUseRegister({ officeId } )); - return InvoicesApi.register(officeId, invoiceId, config) + return InvoicesApi.register(officeId, invoiceId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -916,14 +916,14 @@ export const useRegister = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const useGetPreview = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetPreview = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getPreview(officeId, invoiceId), queryFn: () => { checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); - return InvoicesApi.getPreview(officeId, invoiceId, config) }, + return InvoicesApi.getPreview(officeId, invoiceId) }, ...options, }); }; @@ -938,14 +938,14 @@ export const useGetPreview = ({ officeId, invoiceId }: { officeId: string * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const useGetPreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGetPreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId }) => { checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); - return InvoicesApi.getPreview(officeId, invoiceId, config) + return InvoicesApi.getPreview(officeId, invoiceId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -967,14 +967,14 @@ export const useGetPreviewMutation = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const useGetInvoiceEml = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetInvoiceEml = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getInvoiceEml(officeId, invoiceId), queryFn: () => { checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); - return InvoicesApi.getInvoiceEml(officeId, invoiceId, config) }, + return InvoicesApi.getInvoiceEml(officeId, invoiceId) }, ...options, }); }; @@ -989,14 +989,14 @@ export const useGetInvoiceEml = ({ officeId, invoiceId }: { officeId: str * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const useGetInvoiceEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGetInvoiceEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId }) => { checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); - return InvoicesApi.getInvoiceEml(officeId, invoiceId, config) + return InvoicesApi.getInvoiceEml(officeId, invoiceId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -1020,14 +1020,14 @@ export const useGetInvoiceEmlMutation = (options?: AppMutationOptions } * @statusCodes [200, 401, default] */ -export const usePrepareDocumentUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePrepareDocumentUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId } )); - const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data, config); + const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data); if (file && uploadInstructions.url) { const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; @@ -1072,14 +1072,14 @@ export const usePrepareDocumentUpload = (options?: AppMutationOptions } * @statusCodes [201, 401, default] */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId }) => { checkAcl(InvoicesAcl.canUseCancel({ officeId } )); - return InvoicesApi.cancel(officeId, invoiceId, config) + return InvoicesApi.cancel(officeId, invoiceId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -1101,14 +1101,14 @@ export const useCancel = (options?: AppMutationOptions } * @statusCodes [200, 401, default] */ -export const useIssueCreditNote = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useIssueCreditNote = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, invoiceId }) => { checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId } )); - return InvoicesApi.issueCreditNote(officeId, invoiceId, config) + return InvoicesApi.issueCreditNote(officeId, invoiceId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/masterData/masterData.api.ts b/test/generated/next/masterData/masterData.api.ts index 831aadf..5eaf692 100644 --- a/test/generated/next/masterData/masterData.api.ts +++ b/test/generated/next/masterData/masterData.api.ts @@ -1,16 +1,14 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { MasterDataModels } from "./masterData.models"; export namespace MasterDataApi { -export const findAll = (officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string, config?: AxiosRequestConfig) => { +export const findAll = (officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string, ) => { return AppRestClient.get( { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, `/offices/${officeId}/master-data/autocomplete`, { - ...config, params: { types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { type: "query", name: "types" }), search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), @@ -18,18 +16,17 @@ export const findAll = (officeId: string, types: MasterDataModels.MasterDataFind } ) }; -export const paginate = (officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, `/offices/${officeId}/master-data/labels/paginated`, { - ...config, params: { types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { type: "query", name: "types" }), search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) diff --git a/test/generated/next/masterData/masterData.models.ts b/test/generated/next/masterData/masterData.models.ts index 018a2dc..832cbb1 100644 --- a/test/generated/next/masterData/masterData.models.ts +++ b/test/generated/next/masterData/masterData.models.ts @@ -17,7 +17,7 @@ export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; * @property { string } name Name of the item * @property { MasterDataTypeEnum } type Type of the item */ -export const MasterDataItemResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the item"), name: z.string().describe("Name of the item"), type: MasterDataTypeEnumSchema.describe("Type of the item") }).readonly(); +export const MasterDataItemResponseDTOSchema = z.object({ id: z.string(), name: z.string(), type: MasterDataTypeEnumSchema }); export type MasterDataItemResponseDTO = z.infer; /** @@ -25,7 +25,7 @@ export type MasterDataItemResponseDTO = z.infer; /** @@ -35,21 +35,21 @@ export type MasterDataItemsResponseDTO = z.infer; /** * MasterDataFindAllTypesParamSchema * @type { array } */ -export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); +export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema); export type MasterDataFindAllTypesParam = z.infer; /** * MasterDataPaginateTypesParamSchema * @type { array } */ -export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); +export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema); export type MasterDataPaginateTypesParam = z.infer; /** @@ -62,7 +62,7 @@ export type MasterDataPaginateTypesParam = z.infer; } diff --git a/test/generated/next/masterData/masterData.queries.ts b/test/generated/next/masterData/masterData.queries.ts index 444ccd6..8fba241 100644 --- a/test/generated/next/masterData/masterData.queries.ts +++ b/test/generated/next/masterData/masterData.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindAll = ({ officeId, types, search }: { officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAll = ({ officeId, types, search }: { officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findAll(officeId, types, search), queryFn: () => { checkAcl(MasterDataAcl.canUseFindAll()); - return MasterDataApi.findAll(officeId, types, search, config) }, + return MasterDataApi.findAll(officeId, types, search) }, ...options, }); }; @@ -54,14 +53,14 @@ export const useFindAll = ({ officeId, types, search }: { officeId: strin * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ officeId, types, limit, search, page, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ officeId, types, limit, search, page, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(officeId, types, limit, search, page, cursor), queryFn: () => { checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, page, cursor, config) }, + return MasterDataApi.paginate(officeId, types, limit, search, page, cursor) }, ...options, }); }; @@ -80,14 +79,14 @@ export const usePaginate = ({ officeId, types, limit, search, page, curso * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ officeId, types, limit, search, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ officeId, types, limit, search, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), queryFn: ({ pageParam }) => { checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor, config) }, + return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; diff --git a/test/generated/next/masterDataImport/masterDataImport.api.ts b/test/generated/next/masterDataImport/masterDataImport.api.ts index 8690f02..af38583 100644 --- a/test/generated/next/masterDataImport/masterDataImport.api.ts +++ b/test/generated/next/masterDataImport/masterDataImport.api.ts @@ -1,30 +1,29 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { MasterDataImportModels } from "./masterDataImport.models"; export namespace MasterDataImportApi { -export const upload = (officeId: string, data: MasterDataImportModels.MasterDataImportUploadRequestDto, config?: AxiosRequestConfig) => { +export const upload = (officeId: string, data: MasterDataImportModels.MasterDataImportUploadRequestDto, ) => { return AppRestClient.post( { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, `/offices/${officeId}/master-data/upload`, ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), - config + ) }; -export const postOfficesMasterDataImportByOfficeId = (officeId: string, data: MasterDataImportModels.MasterDataImportRequestDto, config?: AxiosRequestConfig) => { +export const postOfficesMasterDataImportByOfficeId = (officeId: string, data: MasterDataImportModels.MasterDataImportRequestDto, ) => { return AppRestClient.post( { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, `/offices/${officeId}/master-data/import`, ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), - config + ) }; -export const getImportStatus = (jobId: string, officeId: string, config?: AxiosRequestConfig) => { +export const getImportStatus = (jobId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, `/offices/${officeId}/master-data/import/${jobId}/status`, - config + ) }; } diff --git a/test/generated/next/masterDataImport/masterDataImport.models.ts b/test/generated/next/masterDataImport/masterDataImport.models.ts index 6033091..a2dc56c 100644 --- a/test/generated/next/masterDataImport/masterDataImport.models.ts +++ b/test/generated/next/masterDataImport/masterDataImport.models.ts @@ -24,7 +24,7 @@ export const ImportTypeEnum = ImportTypeEnumSchema.enum; * @property { string } mediaId Media ID of the uploaded file * @property { ImportTypeEnum } type Type of data to import */ -export const MasterDataImportRequestDtoSchema = z.object({ mediaId: z.string().describe("Media ID of the uploaded file"), type: ImportTypeEnumSchema.describe("Type of data to import") }).readonly(); +export const MasterDataImportRequestDtoSchema = z.object({ mediaId: z.string(), type: ImportTypeEnumSchema }); export type MasterDataImportRequestDto = z.infer; /** @@ -35,7 +35,7 @@ export type MasterDataImportRequestDto = z.infer; /** @@ -44,7 +44,7 @@ export type ImportResultDto = z.infer; * @property { string } status Current job status * @property { ImportResultDto } result Import result data when job is completed */ -export const ImportStatusResponseDtoSchema = z.object({ status: z.string().describe("Current job status").nullable(), result: ImportResultDtoSchema.describe("Import result data when job is completed").nullish() }).readonly(); +export const ImportStatusResponseDtoSchema = z.object({ status: z.string().nullable(), result: ImportResultDtoSchema.nullish() }); export type ImportStatusResponseDto = z.infer; /** @@ -54,7 +54,7 @@ export type ImportStatusResponseDto = z.infer; /** @@ -63,7 +63,7 @@ export type MasterDataImportUploadRequestDto = z.infer; /** @@ -72,7 +72,7 @@ export type MasterDataImportUploadResponseDto = z.infer; } diff --git a/test/generated/next/masterDataImport/masterDataImport.queries.ts b/test/generated/next/masterDataImport/masterDataImport.queries.ts index 07d3f9b..e6f857d 100644 --- a/test/generated/next/masterDataImport/masterDataImport.queries.ts +++ b/test/generated/next/masterDataImport/masterDataImport.queries.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -27,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { checkAcl(MasterDataImportAcl.canUseUpload({ officeId } )); - const uploadInstructions = await MasterDataImportApi.upload(officeId, data, config); + const uploadInstructions = await MasterDataImportApi.upload(officeId, data); if (file && uploadInstructions.url) { const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; @@ -79,14 +79,14 @@ export const useUpload = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const usePostOfficesMasterDataImportByOfficeId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePostOfficesMasterDataImportByOfficeId = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId } )); - return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data, config) + return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -106,14 +106,14 @@ export const usePostOfficesMasterDataImportByOfficeId = (options?: AppMutationOp * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetImportStatus = ({ jobId, officeId }: { jobId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetImportStatus = ({ jobId, officeId }: { jobId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getImportStatus(jobId, officeId), queryFn: () => { checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId } )); - return MasterDataImportApi.getImportStatus(jobId, officeId, config) }, + return MasterDataImportApi.getImportStatus(jobId, officeId) }, ...options, }); }; diff --git a/test/generated/next/offices/offices.api.ts b/test/generated/next/offices/offices.api.ts index 23f37d7..6e096af 100644 --- a/test/generated/next/offices/offices.api.ts +++ b/test/generated/next/offices/offices.api.ts @@ -1,115 +1,110 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { OfficesModels } from "./offices.models"; export namespace OfficesApi { -export const paginate = (limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: OfficesModels.OfficesPaginateResponseSchema }, `/offices`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: OfficesModels.CreateOfficeRequest, config?: AxiosRequestConfig) => { +export const create = (data: OfficesModels.CreateOfficeRequest, ) => { return AppRestClient.post( { resSchema: OfficesModels.OfficeResponseDtoSchema }, `/offices`, ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), - config + ) }; -export const findAllLabels = (search?: string, config?: AxiosRequestConfig) => { +export const findAllLabels = (search?: string, ) => { return AppRestClient.get( { resSchema: OfficesModels.FindAllLabelsResponseSchema }, `/offices/labels`, { - ...config, params: { search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), }, } ) }; -export const paginateLabels = (limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, `/offices/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const get = (id: string, config?: AxiosRequestConfig) => { +export const get = (id: string, ) => { return AppRestClient.get( { resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, `/offices/${id}`, - config + ) }; -export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, config?: AxiosRequestConfig) => { +export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, ) => { return AppRestClient.put( { resSchema: OfficesModels.OfficeResponseDtoSchema }, `/offices/${id}`, ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), - config + ) }; -export const uploadDocumentImage = (officeId: string, data: OfficesModels.UploadOfficeDocumentRequestDto, config?: AxiosRequestConfig) => { +export const uploadDocumentImage = (officeId: string, data: OfficesModels.UploadOfficeDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, `/offices/${officeId}/document-image`, ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), - config + ) }; -export const createBankAccount = (officeId: string, data: OfficesModels.CreateOfficeBankAccountDto, config?: AxiosRequestConfig) => { +export const createBankAccount = (officeId: string, data: OfficesModels.CreateOfficeBankAccountDto, ) => { return AppRestClient.post( { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, `/offices/${officeId}/bank-accounts`, ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), - config + ) }; -export const updateBankAccount = (accountId: string, officeId: string, data: OfficesModels.UpdateOfficeBankAccountDto, config?: AxiosRequestConfig) => { +export const updateBankAccount = (accountId: string, officeId: string, data: OfficesModels.UpdateOfficeBankAccountDto, ) => { return AppRestClient.patch( { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, `/offices/${officeId}/bank-accounts/${accountId}`, ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), - config + ) }; -export const deleteBankAccount = (accountId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteBankAccount = (accountId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/bank-accounts/${accountId}`, - undefined, - config + ) }; -export const uploadBankAccountFooter = (accountId: string, officeId: string, data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, config?: AxiosRequestConfig) => { +export const uploadBankAccountFooter = (accountId: string, officeId: string, data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, ) => { return AppRestClient.post( { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, `/offices/${officeId}/bank-accounts/${accountId}/footer`, ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/offices/offices.models.ts b/test/generated/next/offices/offices.models.ts index c36fc5b..3083b80 100644 --- a/test/generated/next/offices/offices.models.ts +++ b/test/generated/next/offices/offices.models.ts @@ -8,7 +8,7 @@ export namespace OfficesModels { * @property { string } isoCode * @property { string } name */ -export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }).readonly(); +export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }); export type OfficeCurrencyResponseDto = z.infer; /** @@ -18,7 +18,7 @@ export type OfficeCurrencyResponseDto = z.infer; /** @@ -39,7 +39,7 @@ export type OfficeBankAccountCurrencyMappingResponseDto = z.infer; /** @@ -58,7 +58,7 @@ export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; * @property { CommonModels.LanguageEnum } language * @property { OfficeDocumentPartEnum } documentPart */ -export const OfficeDocumentSettingsResponseDtoSchema = z.object({ id: z.string(), mediaUrl: z.string(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }).readonly(); +export const OfficeDocumentSettingsResponseDtoSchema = z.object({ id: z.string(), mediaUrl: z.string(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }); export type OfficeDocumentSettingsResponseDto = z.infer; /** @@ -74,7 +74,7 @@ export type OfficeDocumentSettingsResponseDto = z.infer; /** @@ -88,7 +88,7 @@ export type AddressResponseDTO = z.infer; * @property { string } addressId * @property { AddressResponseDTO } address */ -export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), types: z.array(z.string()).readonly(), email: z.array(z.string()).readonly().nullish(), phone: z.array(z.string()).readonly().nullish(), addressId: z.string().nullish(), address: AddressResponseDTOSchema.nullish() }).readonly(); +export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), types: z.array(z.string()), email: z.array(z.string()).nullish(), phone: z.array(z.string()).nullish(), addressId: z.string().nullish(), address: AddressResponseDTOSchema.nullish() }); export type OfficeRepresentingBusinessPartnerResponseDto = z.infer; /** @@ -97,7 +97,7 @@ export type OfficeRepresentingBusinessPartnerResponseDto = z.infer; /** @@ -106,7 +106,7 @@ export type OfficePaymentTermsResponseDto = z.infer; /** @@ -122,7 +122,7 @@ export type OfficeCountryResponseDto = z.infer; /** @@ -150,7 +150,7 @@ export type OfficeBankAccountResponseDto = z.infer; /** @@ -188,7 +188,7 @@ export type OfficeDetailResponseDto = z.infer; /** @@ -197,7 +197,7 @@ export type OfficeResponseDto = z.infer; * @property { number } days * @property { string } relativeTo */ -export const UpdateOfficePaymentTermsRequestSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }).readonly(); +export const UpdateOfficePaymentTermsRequestSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }); export type UpdateOfficePaymentTermsRequest = z.infer; /** @@ -206,7 +206,7 @@ export type UpdateOfficePaymentTermsRequest = z.infer; /** @@ -243,7 +243,7 @@ export type UpdateOfficeBankAccountCurrencyMapping = z.infer; /** @@ -255,7 +255,7 @@ export type UpdateOfficeRequest = z.infer; * @property { string } language Language of the document * @property { string } documentPart Part of the document this image represents */ -export const UploadOfficeDocumentRequestDtoSchema = z.object({ fileName: z.string().describe("File name with extension"), mimeType: z.string().describe("MIME type of the file"), fileSize: z.number().describe("Size of the file"), language: CommonModels.LanguageEnumSchema.describe("Language of the document"), documentPart: OfficeDocumentPartEnumSchema.describe("Part of the document this image represents") }).readonly(); +export const UploadOfficeDocumentRequestDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }); export type UploadOfficeDocumentRequestDto = z.infer; /** @@ -265,7 +265,7 @@ export type UploadOfficeDocumentRequestDto = z.infer; /** @@ -274,7 +274,7 @@ export type OfficeListItemResponse = z.infer; /** @@ -282,7 +282,7 @@ export type OfficeFilterDto = z.infer; * @type { object } * @property { string } search */ -export const OfficeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); +export const OfficeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); export type OfficeLabelFilterDto = z.infer; /** @@ -290,7 +290,7 @@ export type OfficeLabelFilterDto = z.infer; * @type { object } * @property { string } name */ -export const CreateOfficeRequestSchema = z.object({ name: z.string() }).readonly(); +export const CreateOfficeRequestSchema = z.object({ name: z.string() }); export type CreateOfficeRequest = z.infer; /** @@ -300,7 +300,7 @@ export type CreateOfficeRequest = z.infer; * @property { string } url URL to upload the file to * @property { string } documentId ID of the created/updated document setting */ -export const DocumentImageUploadInstructionsDtoSchema = z.object({ method: z.string().describe("HTTP method to use for upload"), url: z.string().describe("URL to upload the file to"), documentId: z.string().describe("ID of the created/updated document setting") }).readonly(); +export const DocumentImageUploadInstructionsDtoSchema = z.object({ method: z.string(), url: z.string(), documentId: z.string() }); export type DocumentImageUploadInstructionsDto = z.infer; /** @@ -312,7 +312,7 @@ export type DocumentImageUploadInstructionsDto = z.infer; /** @@ -325,7 +325,7 @@ export type CreateOfficeBankAccountDto = z.infer; /** @@ -335,7 +335,7 @@ export type UpdateOfficeBankAccountDto = z.infer; /** @@ -356,14 +356,14 @@ export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema * @property { number } totalItems Total available items * @property { OfficeListItemResponse[] } items */ -export const OfficesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(OfficeListItemResponseSchema).readonly() }).readonly().shape }); +export const OfficesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(OfficeListItemResponseSchema).nullable() }).partial().shape }); export type OfficesPaginateResponse = z.infer; /** * FindAllLabelsResponseSchema * @type { array } */ -export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); export type FindAllLabelsResponse = z.infer; /** @@ -384,7 +384,7 @@ export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderPar * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const OfficesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const OfficesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type OfficesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/offices/offices.queries.ts b/test/generated/next/offices/offices.queries.ts index beb29d6..5258732 100644 --- a/test/generated/next/offices/offices.queries.ts +++ b/test/generated/next/offices/offices.queries.ts @@ -1,4 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; +import axios, { } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,12 +33,12 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => - OfficesApi.paginate(limit, order, filter, page, cursor, config), + OfficesApi.paginate(limit, order, filter, page, cursor), ...options, }); }; @@ -55,12 +55,12 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => - OfficesApi.paginate(limit, order, filter, pageParam, cursor, config), + OfficesApi.paginate(limit, order, filter, pageParam, cursor), initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -79,14 +79,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(OfficesAcl.canUseCreate()); - return OfficesApi.create(data, config) + return OfficesApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -104,12 +104,12 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindAllLabels = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAllLabels = ({ search }: { search?: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.findAllLabels(search), queryFn: () => - OfficesApi.findAllLabels(search, config), + OfficesApi.findAllLabels(search), ...options, }); }; @@ -126,12 +126,12 @@ export const useFindAllLabels = ({ search }: { search?: string }, options * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => - OfficesApi.paginateLabels(limit, order, filter, page, cursor, config), + OfficesApi.paginateLabels(limit, order, filter, page, cursor), ...options, }); }; @@ -148,12 +148,12 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => - OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor, config), + OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor), initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -172,14 +172,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(id), queryFn: () => { checkAcl(OfficesAcl.canUseGet()); - return OfficesApi.get(id, config) }, + return OfficesApi.get(id) }, ...options, }); }; @@ -194,14 +194,14 @@ export const useGet = ({ id }: { id: string }, options?: AppQueryOptions< * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(OfficesAcl.canUseUpdate()); - return OfficesApi.update(id, data, config) + return OfficesApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -222,14 +222,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useUploadDocumentImage = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUploadDocumentImage = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId } )); - const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data, config); + const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data); if (file && uploadInstructions.url) { const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; @@ -274,14 +274,14 @@ export const useUploadDocumentImage = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useCreateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId } )); - return OfficesApi.createBankAccount(officeId, data, config) + return OfficesApi.createBankAccount(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -302,14 +302,14 @@ export const useCreateBankAccount = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ accountId, officeId, data }) => { checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId } )); - return OfficesApi.updateBankAccount(accountId, officeId, data, config) + return OfficesApi.updateBankAccount(accountId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -329,14 +329,14 @@ export const useUpdateBankAccount = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useDeleteBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ accountId, officeId }) => { checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId } )); - return OfficesApi.deleteBankAccount(accountId, officeId, config) + return OfficesApi.deleteBankAccount(accountId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -358,14 +358,14 @@ export const useDeleteBankAccount = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useUploadBankAccountFooter = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUploadBankAccountFooter = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId } )); - const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data, config); + const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data); if (file && uploadInstructions.url) { const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; diff --git a/test/generated/next/packageTypes/packageTypes.api.ts b/test/generated/next/packageTypes/packageTypes.api.ts index afa5bc0..72184b2 100644 --- a/test/generated/next/packageTypes/packageTypes.api.ts +++ b/test/generated/next/packageTypes/packageTypes.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PackageTypesModels } from "./packageTypes.models"; export namespace PackageTypesApi { -export const paginate = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, `/package-types`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, ) => { return AppRestClient.post( { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, `/package-types`, ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), - config + ) }; -export const paginateLabels = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, `/package-types/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, `/package-types/${id}`, - config + ) }; -export const update = (id: string, data: PackageTypesModels.UpdatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: PackageTypesModels.UpdatePackageTypeRequestDTO, ) => { return AppRestClient.patch( { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, `/package-types/${id}`, ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.post( { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, `/package-types/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.post( { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, `/package-types/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/packageTypes/packageTypes.models.ts b/test/generated/next/packageTypes/packageTypes.models.ts index f3d28da..25b4d59 100644 --- a/test/generated/next/packageTypes/packageTypes.models.ts +++ b/test/generated/next/packageTypes/packageTypes.models.ts @@ -16,7 +16,7 @@ export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; * @property { string } id * @property { string } name */ -export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type PackageTypeEmployeeDTO = z.infer; /** @@ -37,7 +37,7 @@ export type PackageTypeEmployeeDTO = z.infer; /** @@ -50,7 +50,7 @@ export type PackageTypeResponseDTO = z.infer; /** @@ -63,7 +63,7 @@ export type CreatePackageTypeRequestDTO = z.infer; /** @@ -72,7 +72,7 @@ export type UpdatePackageTypeRequestDTO = z.infer; /** @@ -80,7 +80,7 @@ export type PackageTypePaginationFilterDto = z.infer; /** @@ -101,7 +101,7 @@ export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParam * @property { number } totalItems Total available items * @property { PackageTypeResponseDTO[] } items */ -export const PackageTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageTypeResponseDTOSchema).readonly() }).readonly().shape }); +export const PackageTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageTypeResponseDTOSchema).nullable() }).partial().shape }); export type PackageTypesPaginateResponse = z.infer; /** @@ -122,7 +122,7 @@ export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabe * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const PackageTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const PackageTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type PackageTypesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/packageTypes/packageTypes.queries.ts b/test/generated/next/packageTypes/packageTypes.queries.ts index b7a20a5..86ebe9e 100644 --- a/test/generated/next/packageTypes/packageTypes.queries.ts +++ b/test/generated/next/packageTypes/packageTypes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, page, cursor, config) }, + return PackageTypesApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -58,14 +57,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -84,14 +83,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(PackageTypesAcl.canUseCreate()); - return PackageTypesApi.create(data, config) + return PackageTypesApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -114,14 +113,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -139,14 +138,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -165,14 +164,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(PackageTypesAcl.canUseFindById()); - return PackageTypesApi.findById(id, config) }, + return PackageTypesApi.findById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(PackageTypesAcl.canUseUpdate()); - return PackageTypesApi.update(id, data, config) + return PackageTypesApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(PackageTypesAcl.canUseArchive()); - return PackageTypesApi.archive(id, config) + return PackageTypesApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -243,14 +242,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(PackageTypesAcl.canUseUnarchive()); - return PackageTypesApi.unarchive(id, config) + return PackageTypesApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/partnerNetworks/partnerNetworks.api.ts b/test/generated/next/partnerNetworks/partnerNetworks.api.ts index d24231a..2c6a4bf 100644 --- a/test/generated/next/partnerNetworks/partnerNetworks.api.ts +++ b/test/generated/next/partnerNetworks/partnerNetworks.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PartnerNetworksModels } from "./partnerNetworks.models"; export namespace PartnerNetworksApi { -export const paginateLabels = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, `/partner-networks/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginate = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, `/partner-networks`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, ) => { return AppRestClient.post( { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, `/partner-networks`, ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), - config + ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, `/partner-networks/${id}`, - config + ) }; -export const update = (id: string, data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, ) => { return AppRestClient.patch( { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, `/partner-networks/${id}`, ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.patch( { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, `/partner-networks/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.patch( { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, `/partner-networks/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/partnerNetworks/partnerNetworks.models.ts b/test/generated/next/partnerNetworks/partnerNetworks.models.ts index e87d278..55c49ce 100644 --- a/test/generated/next/partnerNetworks/partnerNetworks.models.ts +++ b/test/generated/next/partnerNetworks/partnerNetworks.models.ts @@ -8,7 +8,7 @@ export namespace PartnerNetworksModels { * @property { string } id * @property { string } name */ -export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type PartnerNetworkEmployeeDTO = z.infer; /** @@ -24,7 +24,7 @@ export type PartnerNetworkEmployeeDTO = z.infer; /** @@ -32,7 +32,7 @@ export type PartnerNetworkResponseDTO = z.infer; /** @@ -41,7 +41,7 @@ export type PartnerNetworkLabelFilterDto = z.infer; /** @@ -49,7 +49,7 @@ export type PartnerNetworkPaginationFilterDto = z.infer; /** @@ -57,7 +57,7 @@ export type CreatePartnerNetworkRequestDTO = z.infer; /** @@ -78,7 +78,7 @@ export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPagina * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type PartnerNetworksPaginateLabelsResponse = z.infer; /** @@ -99,7 +99,7 @@ export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrde * @property { number } totalItems Total available items * @property { PartnerNetworkResponseDTO[] } items */ -export const PartnerNetworksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).readonly() }).readonly().shape }); +export const PartnerNetworksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).nullable() }).partial().shape }); export type PartnerNetworksPaginateResponse = z.infer; } diff --git a/test/generated/next/partnerNetworks/partnerNetworks.queries.ts b/test/generated/next/partnerNetworks/partnerNetworks.queries.ts index a0514a6..75ec4c5 100644 --- a/test/generated/next/partnerNetworks/partnerNetworks.queries.ts +++ b/test/generated/next/partnerNetworks/partnerNetworks.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -58,14 +57,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -88,14 +87,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, page, cursor, config) }, + return PartnerNetworksApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -113,14 +112,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -139,14 +138,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(PartnerNetworksAcl.canUseCreate()); - return PartnerNetworksApi.create(data, config) + return PartnerNetworksApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -165,14 +164,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(PartnerNetworksAcl.canUseFindById()); - return PartnerNetworksApi.findById(id, config) }, + return PartnerNetworksApi.findById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(PartnerNetworksAcl.canUseUpdate()); - return PartnerNetworksApi.update(id, data, config) + return PartnerNetworksApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(PartnerNetworksAcl.canUseArchive()); - return PartnerNetworksApi.archive(id, config) + return PartnerNetworksApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -243,14 +242,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(PartnerNetworksAcl.canUseUnarchive()); - return PartnerNetworksApi.unarchive(id, config) + return PartnerNetworksApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.api.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.api.ts index 25755a1..dd56bcd 100644 --- a/test/generated/next/paymentConfirmations/paymentConfirmations.api.ts +++ b/test/generated/next/paymentConfirmations/paymentConfirmations.api.ts @@ -1,33 +1,30 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; export namespace PaymentConfirmationsApi { -export const get = (officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, `/offices/${officeId}/payment-confirmations`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const generate = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, config?: AxiosRequestConfig) => { +export const generate = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/payment-confirmations/generate`, ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -36,13 +33,12 @@ export const generate = (officeId: string, data: PaymentConfirmationsModels.Gene } ) }; -export const getEml = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, config?: AxiosRequestConfig) => { +export const getEml = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/payment-confirmations/eml`, ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/octet-stream', }, diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.models.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.models.ts index acbe59b..bdab7a3 100644 --- a/test/generated/next/paymentConfirmations/paymentConfirmations.models.ts +++ b/test/generated/next/paymentConfirmations/paymentConfirmations.models.ts @@ -8,7 +8,7 @@ export namespace PaymentConfirmationsModels { * @property { string } id * @property { string } number */ -export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); +export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }); export type PaymentConfirmationPositionDto = z.infer; /** @@ -24,7 +24,7 @@ export type PaymentConfirmationPositionDto = z.infer; /** @@ -33,7 +33,7 @@ export type PaymentConfirmationItemDto = z.infer; /** @@ -43,7 +43,7 @@ export type PaymentConfirmationItemFilterDto = z.infer; /** @@ -64,7 +64,7 @@ export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrde * @property { number } totalItems Total available items * @property { PaymentConfirmationItemDto[] } items */ -export const PaymentConfirmationsGetResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).readonly() }).readonly().shape }); +export const PaymentConfirmationsGetResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).nullable() }).partial().shape }); export type PaymentConfirmationsGetResponse = z.infer; } diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts index 129aa28..c780317 100644 --- a/test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts +++ b/test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -31,14 +30,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ officeId, filter, limit, order, page, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ officeId, filter, limit, order, page, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(officeId, filter, limit, order, page, cursor), queryFn: () => { checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor, config) }, + return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor) }, ...options, }); }; @@ -57,14 +56,14 @@ export const useGet = ({ officeId, filter, limit, order, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useGetInfinite = ({ officeId, filter, limit, order, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useGetInfinite = ({ officeId, filter, limit, order, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), queryFn: ({ pageParam }) => { checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor, config) }, + return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -84,14 +83,14 @@ export const useGetInfinite = ({ officeId, filter, limit, order, cursor } * @returns { UseMutationResult> } * @statusCodes [200, 201, 401] */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId } )); - return PaymentConfirmationsApi.generate(officeId, data, config) + return PaymentConfirmationsApi.generate(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -111,14 +110,14 @@ export const useGenerate = (options?: AppMutationOptions> } * @statusCodes [200, 201, 401] */ -export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId } )); - return PaymentConfirmationsApi.getEml(officeId, data, config) + return PaymentConfirmationsApi.getEml(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/ports/ports.api.ts b/test/generated/next/ports/ports.api.ts index 413f9ec..bc62d36 100644 --- a/test/generated/next/ports/ports.api.ts +++ b/test/generated/next/ports/ports.api.ts @@ -1,63 +1,60 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PortsModels } from "./ports.models"; export namespace PortsApi { -export const paginate = (limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PortsModels.PortsPaginateResponseSchema }, `/ports`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: PortsModels.CreatePortRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: PortsModels.CreatePortRequestDTO, ) => { return AppRestClient.post( { resSchema: PortsModels.PortResponseDTOSchema }, `/ports`, ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), - config + ) }; -export const paginateLabels = (limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, `/ports/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, ) => { return AppRestClient.patch( { resSchema: PortsModels.PortResponseDTOSchema }, `/ports/${id}`, ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), - config + ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: PortsModels.PortResponseDTOSchema }, `/ports/${id}`, - config + ) }; } diff --git a/test/generated/next/ports/ports.models.ts b/test/generated/next/ports/ports.models.ts index 7bb660d..6958ed9 100644 --- a/test/generated/next/ports/ports.models.ts +++ b/test/generated/next/ports/ports.models.ts @@ -8,7 +8,7 @@ export namespace PortsModels { * @property { string } id * @property { string } name */ -export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }); export type PortCityDto = z.infer; /** @@ -19,7 +19,7 @@ export type PortCityDto = z.infer; * @property { string } isoCode2 * @property { string } isoCode3 */ -export const PortCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export const PortCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); export type PortCountryDto = z.infer; /** @@ -31,7 +31,7 @@ export type PortCountryDto = z.infer; * @property { string } district District name * @property { PortCountryDto } country */ -export const PortAddressDtoSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: PortCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: PortCountryDtoSchema.nullish() }).readonly(); +export const PortAddressDtoSchema = z.object({ street: z.string(), zip: z.string(), city: PortCityDtoSchema.nullish(), district: z.string().nullish(), country: PortCountryDtoSchema.nullish() }); export type PortAddressDto = z.infer; /** @@ -40,7 +40,7 @@ export type PortAddressDto = z.infer; * @property { string } id * @property { string } name */ -export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type PortEmployeeDTO = z.infer; /** @@ -57,7 +57,7 @@ export type PortEmployeeDTO = z.infer; * @property { PortEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const PortResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port"), matchCode: z.string().describe("Match code for the port"), address: PortAddressDtoSchema.describe("Address details of the port"), createdById: z.string().nullish(), createdBy: PortEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PortEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const PortResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), address: PortAddressDtoSchema, createdById: z.string().nullish(), createdBy: PortEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PortEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type PortResponseDTO = z.infer; /** @@ -65,7 +65,7 @@ export type PortResponseDTO = z.infer; * @type { object } * @property { string } search Search term to filter ports by name or match code */ -export const PortPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter ports by name or match code") }).readonly(); +export const PortPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); export type PortPaginationFilterDto = z.infer; /** @@ -73,7 +73,7 @@ export type PortPaginationFilterDto = z.infer; /** @@ -88,7 +88,7 @@ export type PortLabelFilterDto = z.infer; * @property { string } countryId Country id * @property { string } district */ -export const CreatePortRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), street: z.string().describe("Street address"), secondaryStreet: z.string().nullish(), zip: z.string().describe("ZIP / Postal code"), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), district: z.string().nullish() }).readonly(); +export const CreatePortRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string().nullish() }); export type CreatePortRequestDTO = z.infer; /** @@ -103,7 +103,7 @@ export type CreatePortRequestDTO = z.infer; * @property { string } countryId Updated country id * @property { string } district */ -export const UpdatePortRequestDTOSchema = z.object({ name: z.string().describe("Updated name"), matchCode: z.string().describe("Updated match code"), street: z.string().describe("Updated street address"), secondaryStreet: z.string().describe("Updated secondary street"), zip: z.string().describe("Updated ZIP/Postal code"), cityId: z.string().describe("Updated city id"), countryId: z.string().describe("Updated country id"), district: z.string() }).readonly(); +export const UpdatePortRequestDTOSchema = z.object({ name: z.string().nullable(), matchCode: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable() }).partial(); export type UpdatePortRequestDTO = z.infer; /** @@ -124,7 +124,7 @@ export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enu * @property { number } totalItems Total available items * @property { PortResponseDTO[] } items */ -export const PortsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PortResponseDTOSchema).readonly() }).readonly().shape }); +export const PortsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PortResponseDTOSchema).nullable() }).partial().shape }); export type PortsPaginateResponse = z.infer; /** @@ -145,7 +145,7 @@ export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEn * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const PortsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const PortsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type PortsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/ports/ports.queries.ts b/test/generated/next/ports/ports.queries.ts index 60aaca2..7a034d1 100644 --- a/test/generated/next/ports/ports.queries.ts +++ b/test/generated/next/ports/ports.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, page, cursor, config) }, + return PortsApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -58,14 +57,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return PortsApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -84,14 +83,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(PortsAcl.canUseCreate()); - return PortsApi.create(data, config) + return PortsApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -114,14 +113,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return PortsApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -139,14 +138,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -166,14 +165,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(PortsAcl.canUseUpdate()); - return PortsApi.update(id, data, config) + return PortsApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -194,14 +193,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(PortsAcl.canUseFindById()); - return PortsApi.findById(id, config) }, + return PortsApi.findById(id) }, ...options, }); }; diff --git a/test/generated/next/positionAccount/positionAccount.api.ts b/test/generated/next/positionAccount/positionAccount.api.ts index 50e84d6..b484a7e 100644 --- a/test/generated/next/positionAccount/positionAccount.api.ts +++ b/test/generated/next/positionAccount/positionAccount.api.ts @@ -1,13 +1,12 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { PositionAccountModels } from "./positionAccount.models"; export namespace PositionAccountApi { -export const get = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const get = (positionId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/account`, - config + ) }; } diff --git a/test/generated/next/positionAccount/positionAccount.models.ts b/test/generated/next/positionAccount/positionAccount.models.ts index 192acb9..3c1e98c 100644 --- a/test/generated/next/positionAccount/positionAccount.models.ts +++ b/test/generated/next/positionAccount/positionAccount.models.ts @@ -12,7 +12,7 @@ export namespace PositionAccountModels { * @property { number } displayAmount Display amount * @property { string } displayCurrencyCode Display currency code */ -export const PositionAccountTotalsResponseDtoSchema = z.object({ totalBuyRates: z.number().describe("Total buy rates"), totalSellRates: z.number().describe("Total sell rates"), totalProfit: z.number().describe("Total profit"), margin: z.number().describe("Margin percentage").nullish(), displayAmount: z.number().describe("Display amount"), displayCurrencyCode: z.string().describe("Display currency code") }).readonly(); +export const PositionAccountTotalsResponseDtoSchema = z.object({ totalBuyRates: z.number(), totalSellRates: z.number(), totalProfit: z.number(), margin: z.number().nullish(), displayAmount: z.number(), displayCurrencyCode: z.string() }); export type PositionAccountTotalsResponseDto = z.infer; /** @@ -21,7 +21,7 @@ export type PositionAccountTotalsResponseDto = z.infer; /** @@ -31,7 +31,7 @@ export type PositionAccountMasterTotalsDto = z.infer; /** @@ -46,7 +46,7 @@ export type ChildPositionAccountReferenceDto = z.infer; } diff --git a/test/generated/next/positionAccount/positionAccount.queries.ts b/test/generated/next/positionAccount/positionAccount.queries.ts index cb137f9..c7d81b6 100644 --- a/test/generated/next/positionAccount/positionAccount.queries.ts +++ b/test/generated/next/positionAccount/positionAccount.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -24,14 +23,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ positionId, officeId }: { positionId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ positionId, officeId }: { positionId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(positionId, officeId), queryFn: () => { checkAcl(PositionAccountAcl.canUseGet({ officeId } )); - return PositionAccountApi.get(positionId, officeId, config) }, + return PositionAccountApi.get(positionId, officeId) }, ...options, }); }; diff --git a/test/generated/next/positionAccountItems/positionAccountItems.api.ts b/test/generated/next/positionAccountItems/positionAccountItems.api.ts index 3813a9b..fbc3532 100644 --- a/test/generated/next/positionAccountItems/positionAccountItems.api.ts +++ b/test/generated/next/positionAccountItems/positionAccountItems.api.ts @@ -1,56 +1,55 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PositionAccountItemsModels } from "./positionAccountItems.models"; export namespace PositionAccountItemsApi { -export const create = (positionId: string, officeId: string, data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, ) => { return AppRestClient.post( { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, `/offices/${officeId}/positions/${positionId}/account/items`, ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), - config + ) }; -export const deletePositionAccountItems = (positionId: string, officeId: string, data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { +export const deletePositionAccountItems = (positionId: string, officeId: string, data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/account/items`, ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), - config + ) }; -export const update = (positionId: string, officeId: string, data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { +export const update = (positionId: string, officeId: string, data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, ) => { return AppRestClient.patch( { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, `/offices/${officeId}/positions/${positionId}/account/items`, ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), - config + ) }; -export const duplicate = (positionId: string, officeId: string, data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { +export const duplicate = (positionId: string, officeId: string, data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, ) => { return AppRestClient.post( { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), - config + ) }; -export const reassign = (positionId: string, officeId: string, data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { +export const reassign = (positionId: string, officeId: string, data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, ) => { return AppRestClient.patch( { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, `/offices/${officeId}/positions/${positionId}/account/items/reassign`, ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), - config + ) }; -export const reorder = (positionId: string, itemId: string, officeId: string, data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, config?: AxiosRequestConfig) => { +export const reorder = (positionId: string, itemId: string, officeId: string, data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, ) => { return AppRestClient.patch( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/positionAccountItems/positionAccountItems.models.ts b/test/generated/next/positionAccountItems/positionAccountItems.models.ts index 3ed5734..6bdc3fe 100644 --- a/test/generated/next/positionAccountItems/positionAccountItems.models.ts +++ b/test/generated/next/positionAccountItems/positionAccountItems.models.ts @@ -19,7 +19,7 @@ export namespace PositionAccountItemsModels { * @property { string } customerId Customer ID * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy */ -export const CreatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount"), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount"), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); +export const CreatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); export type CreatePositionChargeDataRequestDto = z.infer; /** @@ -27,7 +27,7 @@ export type CreatePositionChargeDataRequestDto = z.infer; /** @@ -37,7 +37,7 @@ export type CreatePositionTextDataRequestDto = z.infer; /** @@ -45,7 +45,7 @@ export type CreatePositionAccountItemRequestDto = z.infer; /** @@ -65,7 +65,7 @@ export type CreatePositionAccountItemsRequestDto = z.infer; /** @@ -73,7 +73,7 @@ export type UpdatePositionChargeDataRequestDto = z.infer; /** @@ -83,7 +83,7 @@ export type UpdatePositionTextDataRequestDto = z.infer; /** @@ -92,7 +92,7 @@ export type UpdatePositionAccountItemRequestDto = z.infer; /** @@ -100,7 +100,7 @@ export type UpdatePositionAccountItemWithIdRequestDto = z.infer; /** @@ -108,7 +108,7 @@ export type UpdatePositionAccountItemsRequestDto = z.infer; /** @@ -116,7 +116,7 @@ export type DeletePositionAccountItemsRequestDto = z.infer; /** @@ -125,7 +125,7 @@ export type DuplicatePositionAccountItemsRequestDto = z.infer; /** @@ -133,35 +133,35 @@ export type ReassignPositionAccountItemsRequestDto = z.infer; /** * PositionAccountItemsCreateResponseSchema * @type { array } */ -export const PositionAccountItemsCreateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export const PositionAccountItemsCreateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); export type PositionAccountItemsCreateResponse = z.infer; /** * PositionAccountItemsUpdateResponseSchema * @type { array } */ -export const PositionAccountItemsUpdateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export const PositionAccountItemsUpdateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); export type PositionAccountItemsUpdateResponse = z.infer; /** * PositionAccountItemsDuplicateResponseSchema * @type { array } */ -export const PositionAccountItemsDuplicateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export const PositionAccountItemsDuplicateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); export type PositionAccountItemsDuplicateResponse = z.infer; /** * ReassignResponseSchema * @type { array } */ -export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); +export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); export type ReassignResponse = z.infer; } diff --git a/test/generated/next/positionAccountItems/positionAccountItems.queries.ts b/test/generated/next/positionAccountItems/positionAccountItems.queries.ts index 25c26e1..a3b1ab7 100644 --- a/test/generated/next/positionAccountItems/positionAccountItems.queries.ts +++ b/test/generated/next/positionAccountItems/positionAccountItems.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -24,14 +23,14 @@ export const moduleName = QueryModule.PositionAccountItems; * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId, data }) => { checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId } )); - return PositionAccountItemsApi.create(positionId, officeId, data, config) + return PositionAccountItemsApi.create(positionId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -52,14 +51,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeletePositionAccountItems = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeletePositionAccountItems = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId, data }) => { checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId } )); - return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data, config) + return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -80,14 +79,14 @@ export const useDeletePositionAccountItems = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId, data }) => { checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId } )); - return PositionAccountItemsApi.update(positionId, officeId, data, config) + return PositionAccountItemsApi.update(positionId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -108,14 +107,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId, data }) => { checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId } )); - return PositionAccountItemsApi.duplicate(positionId, officeId, data, config) + return PositionAccountItemsApi.duplicate(positionId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -136,14 +135,14 @@ export const useDuplicate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useReassign = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useReassign = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId, data }) => { checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId } )); - return PositionAccountItemsApi.reassign(positionId, officeId, data, config) + return PositionAccountItemsApi.reassign(positionId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -165,14 +164,14 @@ export const useReassign = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, itemId, officeId, data }) => { checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId } )); - return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data, config) + return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/positionCargo/positionCargo.api.ts b/test/generated/next/positionCargo/positionCargo.api.ts index e65a328..a89b2ec 100644 --- a/test/generated/next/positionCargo/positionCargo.api.ts +++ b/test/generated/next/positionCargo/positionCargo.api.ts @@ -1,85 +1,81 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PositionCargoModels } from "./positionCargo.models"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionCargoApi { -export const listCargosByPositionId = (officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const listCargosByPositionId = (officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, `/offices/${officeId}/positions/${positionId}/cargos`, { - ...config, params: { order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const createCargo = (officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { +export const createCargo = (officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCargoResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cargos`, ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config + ) }; -export const listCargoLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const listCargoLabels = (officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, `/offices/${officeId}/positions/${positionId}/cargos/labels`, - config + ) }; -export const getCargoSummary = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const getCargoSummary = (officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, `/offices/${officeId}/positions/${positionId}/cargos/summary`, - config + ) }; -export const getCargoById = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { +export const getCargoById = (officeId: string, positionId: string, cargoId: string, ) => { return AppRestClient.get( { resSchema: CommonModels.PositionCargoResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - config + ) }; -export const updateCargo = (officeId: string, positionId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, config?: AxiosRequestConfig) => { +export const updateCargo = (officeId: string, positionId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, ) => { return AppRestClient.patch( { resSchema: CommonModels.PositionCargoResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - config + ) }; -export const deleteCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { +export const deleteCargo = (officeId: string, positionId: string, cargoId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - undefined, - config + ) }; -export const createBulkCargos = (numberOfCargos: number, officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { +export const createBulkCargos = (numberOfCargos: number, officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, ) => { return AppRestClient.post( { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config + ) }; -export const duplicateCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { +export const duplicateCargo = (officeId: string, positionId: string, cargoId: string, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCargoResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, - undefined, - config + ) }; } diff --git a/test/generated/next/positionCargo/positionCargo.models.ts b/test/generated/next/positionCargo/positionCargo.models.ts index 1e3b8cc..53c8e51 100644 --- a/test/generated/next/positionCargo/positionCargo.models.ts +++ b/test/generated/next/positionCargo/positionCargo.models.ts @@ -5,9 +5,8 @@ export namespace PositionCargoModels { /** * ListCargosByPositionIdOrderParamSchema * @type { array } - * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt */ -export const ListCargosByPositionIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).readonly().describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt").nullish(); +export const ListCargosByPositionIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).nullish(); export type ListCargosByPositionIdOrderParam = z.infer; /** @@ -20,28 +19,28 @@ export type ListCargosByPositionIdOrderParam = z.infer; /** * PositionCargoListCargoLabelsResponseSchema * @type { array } */ -export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); export type PositionCargoListCargoLabelsResponse = z.infer; /** * PositionCargoGetCargoSummaryResponseSchema * @type { array } */ -export const PositionCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); +export const PositionCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema); export type PositionCargoGetCargoSummaryResponse = z.infer; /** * PositionCargoCreateBulkCargosResponseSchema * @type { array } */ -export const PositionCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema).readonly(); +export const PositionCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema); export type PositionCargoCreateBulkCargosResponse = z.infer; } diff --git a/test/generated/next/positionCargo/positionCargo.queries.ts b/test/generated/next/positionCargo/positionCargo.queries.ts index bc814ea..0177598 100644 --- a/test/generated/next/positionCargo/positionCargo.queries.ts +++ b/test/generated/next/positionCargo/positionCargo.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -35,14 +34,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListCargosByPositionId = ({ officeId, positionId, limit, order, page, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListCargosByPositionId = ({ officeId, positionId, limit, order, page, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), queryFn: () => { checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor, config) }, + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor) }, ...options, }); }; @@ -61,14 +60,14 @@ export const useListCargosByPositionId = ({ officeId, positionId, limit, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListCargosByPositionIdInfinite = ({ officeId, positionId, limit, order, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListCargosByPositionIdInfinite = ({ officeId, positionId, limit, order, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), queryFn: ({ pageParam }) => { checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor, config) }, + return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -89,14 +88,14 @@ export const useListCargosByPositionIdInfinite = ({ officeId, positionId, * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId } )); - return PositionCargoApi.createCargo(officeId, positionId, data, config) + return PositionCargoApi.createCargo(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -116,14 +115,14 @@ export const useCreateCargo = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useListCargoLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListCargoLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listCargoLabels(officeId, positionId), queryFn: () => { checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId } )); - return PositionCargoApi.listCargoLabels(officeId, positionId, config) }, + return PositionCargoApi.listCargoLabels(officeId, positionId) }, ...options, }); }; @@ -138,14 +137,14 @@ export const useListCargoLabels = ({ officeId, positionId }: { officeId: * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetCargoSummary = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCargoSummary = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getCargoSummary(officeId, positionId), queryFn: () => { checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId } )); - return PositionCargoApi.getCargoSummary(officeId, positionId, config) }, + return PositionCargoApi.getCargoSummary(officeId, positionId) }, ...options, }); }; @@ -161,14 +160,14 @@ export const useGetCargoSummary = ({ officeId, positionId }: { officeId: * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetCargoById = ({ officeId, positionId, cargoId }: { officeId: string, positionId: string, cargoId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCargoById = ({ officeId, positionId, cargoId }: { officeId: string, positionId: string, cargoId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getCargoById(officeId, positionId, cargoId), queryFn: () => { checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId } )); - return PositionCargoApi.getCargoById(officeId, positionId, cargoId, config) }, + return PositionCargoApi.getCargoById(officeId, positionId, cargoId) }, ...options, }); }; @@ -185,14 +184,14 @@ export const useGetCargoById = ({ officeId, positionId, cargoId }: { offi * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, cargoId, data }) => { checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId } )); - return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data, config) + return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useUpdateCargo = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, cargoId }) => { checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId } )); - return PositionCargoApi.deleteCargo(officeId, positionId, cargoId, config) + return PositionCargoApi.deleteCargo(officeId, positionId, cargoId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -244,14 +243,14 @@ export const useDeleteCargo = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId } )); - return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data, config) + return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -272,14 +271,14 @@ export const useCreateBulkCargos = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, cargoId }) => { checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId } )); - return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId, config) + return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/positionCargoPackage/positionCargoPackage.api.ts b/test/generated/next/positionCargoPackage/positionCargoPackage.api.ts index bc571c0..0ccfabd 100644 --- a/test/generated/next/positionCargoPackage/positionCargoPackage.api.ts +++ b/test/generated/next/positionCargoPackage/positionCargoPackage.api.ts @@ -1,48 +1,45 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionCargoPackageApi { -export const createPackage = (officeId: string, positionId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { +export const createPackage = (officeId: string, positionId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - config + ) }; -export const updatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { +export const updatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, ) => { return AppRestClient.patch( { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - config + ) }; -export const deletePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { +export const deletePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - undefined, - config + ) }; -export const duplicatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { +export const duplicatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - undefined, - config + ) }; -export const movePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, config?: AxiosRequestConfig) => { +export const movePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, ) => { return AppRestClient.patch( { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts b/test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts index fc8a8bd..fc4eedb 100644 --- a/test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts +++ b/test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -25,14 +24,14 @@ export const moduleName = QueryModule.PositionCargoPackage; * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, cargoId, data }) => { checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId } )); - return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data, config) + return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -55,14 +54,14 @@ export const useCreatePackage = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId } )); - return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data, config) + return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -84,14 +83,14 @@ export const useUpdatePackage = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, cargoId, packageId }) => { checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId } )); - return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId, config) + return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -113,14 +112,14 @@ export const useDeletePackage = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, cargoId, packageId }) => { checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId } )); - return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId, config) + return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -143,14 +142,14 @@ export const useDuplicatePackage = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId } )); - return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data, config) + return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/positionChecklist/positionChecklist.api.ts b/test/generated/next/positionChecklist/positionChecklist.api.ts index ff7bf54..97c694e 100644 --- a/test/generated/next/positionChecklist/positionChecklist.api.ts +++ b/test/generated/next/positionChecklist/positionChecklist.api.ts @@ -1,54 +1,51 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { PositionChecklistModels } from "./positionChecklist.models"; export namespace PositionChecklistApi { -export const list = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const list = (officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/checklist`, - config + ) }; -export const applyTemplates = (officeId: string, positionId: string, data: PositionChecklistModels.ApplyTemplatesRequestDto, config?: AxiosRequestConfig) => { +export const applyTemplates = (officeId: string, positionId: string, data: PositionChecklistModels.ApplyTemplatesRequestDto, ) => { return AppRestClient.post( { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), - config + ) }; -export const complete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { +export const complete = (officeId: string, positionId: string, itemId: string, ) => { return AppRestClient.post( { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, - undefined, - config + ) }; -export const uncomplete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { +export const uncomplete = (officeId: string, positionId: string, itemId: string, ) => { return AppRestClient.post( { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, - undefined, - config + ) }; -export const updateNotes = (officeId: string, positionId: string, itemId: string, data: PositionChecklistModels.UpdatePositionChecklistItemDto, config?: AxiosRequestConfig) => { +export const updateNotes = (officeId: string, positionId: string, itemId: string, data: PositionChecklistModels.UpdatePositionChecklistItemDto, ) => { return AppRestClient.patch( { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), - config + ) }; -export const reorder = (officeId: string, positionId: string, data: PositionChecklistModels.ReorderPositionChecklistDto, config?: AxiosRequestConfig) => { +export const reorder = (officeId: string, positionId: string, data: PositionChecklistModels.ReorderPositionChecklistDto, ) => { return AppRestClient.put( { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, `/offices/${officeId}/positions/${positionId}/checklist/reorder`, ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/positionChecklist/positionChecklist.models.ts b/test/generated/next/positionChecklist/positionChecklist.models.ts index 55eb2b7..98e27b8 100644 --- a/test/generated/next/positionChecklist/positionChecklist.models.ts +++ b/test/generated/next/positionChecklist/positionChecklist.models.ts @@ -7,7 +7,7 @@ export namespace PositionChecklistModels { * @property { string } id * @property { string } name */ -export const PositionChecklistCompletedByResponseDtoSchema = z.object({ id: z.string(), name: z.string().nullable() }).readonly(); +export const PositionChecklistCompletedByResponseDtoSchema = z.object({ id: z.string(), name: z.string().nullable() }); export type PositionChecklistCompletedByResponseDto = z.infer; /** @@ -24,7 +24,7 @@ export type PositionChecklistCompletedByResponseDto = z.infer; /** @@ -33,7 +33,7 @@ export type PositionChecklistItemResponseDto = z.infer; /** @@ -41,7 +41,7 @@ export type PositionChecklistResponseDto = z.infer; /** @@ -49,7 +49,7 @@ export type ApplyTemplatesRequestDto = z.infer; /** @@ -57,21 +57,21 @@ export type UpdatePositionChecklistItemDto = z.infer; /** * ApplyTemplatesResponseSchema * @type { array } */ -export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); +export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema); export type ApplyTemplatesResponse = z.infer; /** * PositionChecklistReorderResponseSchema * @type { array } */ -export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); +export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema); export type PositionChecklistReorderResponse = z.infer; } diff --git a/test/generated/next/positionChecklist/positionChecklist.queries.ts b/test/generated/next/positionChecklist/positionChecklist.queries.ts index 77020bb..d9649af 100644 --- a/test/generated/next/positionChecklist/positionChecklist.queries.ts +++ b/test/generated/next/positionChecklist/positionChecklist.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useList = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(officeId, positionId), queryFn: () => { checkAcl(PositionChecklistAcl.canUseList({ officeId } )); - return PositionChecklistApi.list(officeId, positionId, config) }, + return PositionChecklistApi.list(officeId, positionId) }, ...options, }); }; @@ -49,14 +48,14 @@ export const useList = ({ officeId, positionId }: { officeId: string, pos * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useApplyTemplates = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useApplyTemplates = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId } )); - return PositionChecklistApi.applyTemplates(officeId, positionId, data, config) + return PositionChecklistApi.applyTemplates(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -77,14 +76,14 @@ export const useApplyTemplates = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useComplete = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useComplete = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, itemId }) => { checkAcl(PositionChecklistAcl.canUseComplete({ officeId } )); - return PositionChecklistApi.complete(officeId, positionId, itemId, config) + return PositionChecklistApi.complete(officeId, positionId, itemId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -105,14 +104,14 @@ export const useComplete = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useUncomplete = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUncomplete = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, itemId }) => { checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId } )); - return PositionChecklistApi.uncomplete(officeId, positionId, itemId, config) + return PositionChecklistApi.uncomplete(officeId, positionId, itemId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -134,14 +133,14 @@ export const useUncomplete = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdateNotes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateNotes = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, itemId, data }) => { checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId } )); - return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data, config) + return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -162,14 +161,14 @@ export const useUpdateNotes = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(PositionChecklistAcl.canUseReorder({ officeId } )); - return PositionChecklistApi.reorder(officeId, positionId, data, config) + return PositionChecklistApi.reorder(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts index a99a8f4..bed6f4b 100644 --- a/test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts +++ b/test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts @@ -1,40 +1,38 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PositionInvolvedPartiesModels } from "./positionInvolvedParties.models"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionInvolvedPartiesApi { -export const findByPositionId = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const findByPositionId = (officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, `/offices/${officeId}/positions/${positionId}/involved-parties`, - config + ) }; -export const create = (officeId: string, positionId: string, data: CommonModels.CreateInvolvedPartyRequestDto, config?: AxiosRequestConfig) => { +export const create = (officeId: string, positionId: string, data: CommonModels.CreateInvolvedPartyRequestDto, ) => { return AppRestClient.post( { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/involved-parties`, ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - config + ) }; -export const update = (officeId: string, positionId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, config?: AxiosRequestConfig) => { +export const update = (officeId: string, positionId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, ) => { return AppRestClient.patch( { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - config + ) }; -export const deleteOfficesPositionsInvolvedPartiesByPartyId = (officeId: string, positionId: string, partyId: string, config?: AxiosRequestConfig) => { +export const deleteOfficesPositionsInvolvedPartiesByPartyId = (officeId: string, positionId: string, partyId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - undefined, - config + ) }; } diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts index eaa5fc6..310c296 100644 --- a/test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts +++ b/test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts @@ -6,7 +6,7 @@ export namespace PositionInvolvedPartiesModels { * FindByPositionIdResponseSchema * @type { array } */ -export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); +export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema); export type FindByPositionIdResponse = z.infer; } diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts index 0190d0e..17bf8f0 100644 --- a/test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts +++ b/test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindByPositionId = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindByPositionId = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findByPositionId(officeId, positionId), queryFn: () => { checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId } )); - return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId, config) }, + return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId) }, ...options, }); }; @@ -49,14 +48,14 @@ export const useFindByPositionId = ({ officeId, positionId }: { officeId: * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId } )); - return PositionInvolvedPartiesApi.create(officeId, positionId, data, config) + return PositionInvolvedPartiesApi.create(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -78,14 +77,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, partyId, data }) => { checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId } )); - return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data, config) + return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -106,14 +105,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, partyId }) => { checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId } )); - return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId(officeId, positionId, partyId, config) + return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId(officeId, positionId, partyId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts index a516599..fa66351 100644 --- a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts +++ b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts @@ -1,31 +1,29 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; export namespace PositionProfitChangeTrackingApi { -export const findProfitChangeGroups = (officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const findProfitChangeGroups = (officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findProfitChangeGroupDetail = (groupId: string, officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const findProfitChangeGroupDetail = (groupId: string, officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, - config + ) }; } diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts index f4040ce..c953904 100644 --- a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts +++ b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts @@ -13,7 +13,7 @@ export namespace PositionProfitChangeTrackingModels { * @property { string } profit.currencyCode * @property { number } changeCount */ -export const PositionAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), changeCount: z.number() }).readonly(); +export const PositionAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema), profit: z.object({ amount: z.number(), currencyCode: z.string() }), changeCount: z.number() }); export type PositionAccountProfitChangeGroupDto = z.infer; /** @@ -26,7 +26,7 @@ export type PositionAccountProfitChangeGroupDto = z.infer; /** @@ -37,7 +37,7 @@ export type PositionAccountProfitChangeEntryDto = z.infer; /** @@ -47,7 +47,7 @@ export type PositionAccountProfitChangeGroupDetailDto = z.infer; /** @@ -68,7 +68,7 @@ export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = * @property { number } totalItems Total available items * @property { PositionAccountProfitChangeGroupDto[] } items */ -export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape }); +export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).nullable() }).partial().shape }); export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; } diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts index 71d116b..7c55275 100644 --- a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts +++ b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -32,14 +31,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindProfitChangeGroups = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindProfitChangeGroups = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor, config) }, + return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -59,14 +58,14 @@ export const useFindProfitChangeGroups = ({ officeId, positionId, limit, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useFindProfitChangeGroupsInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useFindProfitChangeGroupsInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, + return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -87,14 +86,14 @@ export const useFindProfitChangeGroupsInfinite = ({ officeId, positionId, * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindProfitChangeGroupDetail = ({ groupId, officeId, positionId }: { groupId: string, officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindProfitChangeGroupDetail = ({ groupId, officeId, positionId }: { groupId: string, officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), queryFn: () => { checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId, config) }, + return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId) }, ...options, }); }; diff --git a/test/generated/next/positionRoutes/positionRoutes.api.ts b/test/generated/next/positionRoutes/positionRoutes.api.ts index 1e0faf5..27b8e55 100644 --- a/test/generated/next/positionRoutes/positionRoutes.api.ts +++ b/test/generated/next/positionRoutes/positionRoutes.api.ts @@ -1,63 +1,60 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionRoutesApi { -export const listRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const listRoutes = (officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: CommonModels.RouteListResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/routes`, - config + ) }; -export const createRoutePoint = (officeId: string, positionId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, config?: AxiosRequestConfig) => { +export const createRoutePoint = (officeId: string, positionId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, ) => { return AppRestClient.post( { resSchema: CommonModels.RoutePointResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - config + ) }; -export const updateRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, config?: AxiosRequestConfig) => { +export const updateRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, ) => { return AppRestClient.patch( { resSchema: CommonModels.RoutePointResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - config + ) }; -export const deleteRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, config?: AxiosRequestConfig) => { +export const deleteRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - undefined, - config + ) }; -export const splitRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const splitRoutes = (officeId: string, positionId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/routes/split`, - undefined, - config + ) }; -export const mergeRoutes = (officeId: string, positionId: string, data: CommonModels.MergeRoutesRequestDto, config?: AxiosRequestConfig) => { +export const mergeRoutes = (officeId: string, positionId: string, data: CommonModels.MergeRoutesRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/routes/merge`, ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - config + ) }; -export const copyRoute = (officeId: string, positionId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, config?: AxiosRequestConfig) => { +export const copyRoute = (officeId: string, positionId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/positionRoutes/positionRoutes.queries.ts b/test/generated/next/positionRoutes/positionRoutes.queries.ts index 8d22b16..b9544be 100644 --- a/test/generated/next/positionRoutes/positionRoutes.queries.ts +++ b/test/generated/next/positionRoutes/positionRoutes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListRoutes = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListRoutes = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listRoutes(officeId, positionId), queryFn: () => { checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId } )); - return PositionRoutesApi.listRoutes(officeId, positionId, config) }, + return PositionRoutesApi.listRoutes(officeId, positionId) }, ...options, }); }; @@ -50,14 +49,14 @@ export const useListRoutes = ({ officeId, positionId }: { officeId: strin * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, routeId, data }) => { checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId } )); - return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data, config) + return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -80,14 +79,14 @@ export const useCreateRoutePoint = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId } )); - return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data, config) + return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -109,14 +108,14 @@ export const useUpdateRoutePoint = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, routeId, pointId }) => { checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId } )); - return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId, config) + return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -136,14 +135,14 @@ export const useDeleteRoutePoint = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId }) => { checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId } )); - return PositionRoutesApi.splitRoutes(officeId, positionId, config) + return PositionRoutesApi.splitRoutes(officeId, positionId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -164,14 +163,14 @@ export const useSplitRoutes = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId } )); - return PositionRoutesApi.mergeRoutes(officeId, positionId, data, config) + return PositionRoutesApi.mergeRoutes(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -193,14 +192,14 @@ export const useMergeRoutes = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, routeId, data }) => { checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId } )); - return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data, config) + return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/positions/positions.api.ts b/test/generated/next/positions/positions.api.ts index b990f57..35825af 100644 --- a/test/generated/next/positions/positions.api.ts +++ b/test/generated/next/positions/positions.api.ts @@ -1,63 +1,59 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { PositionsModels } from "./positions.models"; import { CommonModels } from "@/data/common/common.models"; export namespace PositionsApi { -export const findAll = (officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const findAll = (officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PositionsModels.PositionsFindAllResponseSchema }, `/offices/${officeId}/positions/labels`, { - ...config, params: { filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginate = (officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PositionsModels.PositionsPaginateResponseSchema }, `/offices/${officeId}/positions`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (officeId: string, data: PositionsModels.CreatePositionRequestDto, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: PositionsModels.CreatePositionRequestDto, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCoreResponseDtoSchema }, `/offices/${officeId}/positions`, ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), - config + ) }; -export const totalProfit = (officeId: string, config?: AxiosRequestConfig) => { +export const totalProfit = (officeId: string, ) => { return AppRestClient.get( { resSchema: PositionsModels.TotalProfitResponseSchema }, `/offices/${officeId}/positions/fake-total-profit`, - config + ) }; -export const listAvailablePartnersFor = (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { +export const listAvailablePartnersFor = (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { return AppRestClient.get( { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, `/offices/${officeId}/positions/${positionId}/available-partners`, { - ...config, params: { search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), @@ -65,13 +61,12 @@ export const listAvailablePartnersFor = (officeId: string, positionId: string, s } ) }; -export const exportPositions = (officeId: string, data: PositionsModels.PositionExportRequestDto, config?: AxiosRequestConfig) => { +export const exportPositions = (officeId: string, data: PositionsModels.PositionExportRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/exports`, ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', }, @@ -80,85 +75,82 @@ export const exportPositions = (officeId: string, data: PositionsModels.Position } ) }; -export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: CommonModels.PositionCoreResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}`, - config + ) }; -export const update = (officeId: string, positionId: string, data: PositionsModels.UpdatePositionDto, config?: AxiosRequestConfig) => { +export const update = (officeId: string, positionId: string, data: PositionsModels.UpdatePositionDto, ) => { return AppRestClient.patch( { resSchema: CommonModels.PositionCoreResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}`, ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), - config + ) }; -export const listRouteLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const listRouteLabels = (officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, `/offices/${officeId}/positions/${positionId}/routes/labels`, - config + ) }; -export const getDuplicateDefaultParameters = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const getDuplicateDefaultParameters = (officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, - config + ) }; -export const duplicate = (officeId: string, positionId: string, data: PositionsModels.DuplicatePositionRequestDto, config?: AxiosRequestConfig) => { +export const duplicate = (officeId: string, positionId: string, data: PositionsModels.DuplicatePositionRequestDto, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCoreResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/duplicate`, ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), - config + ) }; -export const cancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const cancel = (officeId: string, positionId: string, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCoreResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/cancel`, - undefined, - config + ) }; -export const revertCancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const revertCancel = (officeId: string, positionId: string, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCoreResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/uncancel`, - undefined, - config + ) }; -export const linkChild = (officeId: string, positionId: string, data: PositionsModels.LinkChildPositionsRequestDto, config?: AxiosRequestConfig) => { +export const linkChild = (officeId: string, positionId: string, data: PositionsModels.LinkChildPositionsRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/children`, ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), - config + ) }; -export const unlinkChild = (officeId: string, positionId: string, data: PositionsModels.UnlinkChildPositionsRequestDto, config?: AxiosRequestConfig) => { +export const unlinkChild = (officeId: string, positionId: string, data: PositionsModels.UnlinkChildPositionsRequestDto, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/children`, ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), - config + ) }; -export const listChild = (officeId: string, positionId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const listChild = (officeId: string, positionId: string, limit: number, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: PositionsModels.ListChildResponseSchema }, `/offices/${officeId}/positions/${positionId}/children`, { - ...config, params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) diff --git a/test/generated/next/positions/positions.models.ts b/test/generated/next/positions/positions.models.ts index 6f71cac..9c02819 100644 --- a/test/generated/next/positions/positions.models.ts +++ b/test/generated/next/positions/positions.models.ts @@ -83,7 +83,7 @@ export namespace PositionsModels { * @property { string } parentPosition.id * @property { string } parentPosition.number */ -export const PositionPreviewResponseDtoSchema = z.object({ id: z.string(), externalSystemId: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), number: z.string(), isCancelled: z.boolean(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }).readonly(), customerReference: z.string().nullish(), consignee: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).readonly().nullish(), consigneeReference: z.string().nullish(), carrier: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).readonly().nullish(), carrierReference: z.string().nullish(), positionNumber: z.number().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), loadDate: z.iso.datetime({ offset: true }).nullish(), loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), deliveryDate: z.iso.datetime({ offset: true }).nullish(), equipment: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), currency: z.string().nullish(), profit: z.number().nullish(), margin: z.number().nullish(), employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), departureDate: z.iso.datetime({ offset: true }).nullish(), arrivalDate: z.iso.datetime({ offset: true }).nullish(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), isMasterPosition: z.boolean(), hasInvoices: z.boolean().describe("Whether this position has at least one invoice").nullish(), parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).readonly().nullish() }).readonly(); +export const PositionPreviewResponseDtoSchema = z.object({ id: z.string(), externalSystemId: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), number: z.string(), isCancelled: z.boolean(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }), customerReference: z.string().nullish(), consignee: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).nullish(), consigneeReference: z.string().nullish(), carrier: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).nullish(), carrierReference: z.string().nullish(), positionNumber: z.number().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vesselCarrier: z.string().nullish(), origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), loadDate: z.iso.datetime({ offset: true }).nullish(), loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), deliveryDate: z.iso.datetime({ offset: true }).nullish(), equipment: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), currency: z.string().nullish(), profit: z.number().nullish(), margin: z.number().nullish(), employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), departureDate: z.iso.datetime({ offset: true }).nullish(), arrivalDate: z.iso.datetime({ offset: true }).nullish(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), notes: CommonModels.EditorContentResponseDtoSchema.nullish(), isMasterPosition: z.boolean(), hasInvoices: z.boolean().nullish(), parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).nullish() }); export type PositionPreviewResponseDto = z.infer; /** @@ -129,7 +129,7 @@ export type PositionPreviewResponseDto = z.infer; /** @@ -161,7 +161,7 @@ export type PositionFilterDto = z.infer; * @property { CommonModels.SeaRoutingEnum } routing * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics */ -export const PositionExportFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema, customerId: z.array(z.string()).readonly(), isCancelled: z.boolean(), status: CommonModels.PositionStatusEnumSchema, number: z.string(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, responsibleEmployee: z.array(z.string()).readonly().describe("Filter positions by responsible employee IDs"), searchQuery: z.string(), externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), statusDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, dateOfDeparture: CommonModels.DateRangeDtoSchema, dateOfArrival: CommonModels.DateRangeDtoSchema, blfromCostumerDate: CommonModels.DateRangeDtoSchema, blfromCarrierDate: CommonModels.DateRangeDtoSchema, customsDate: CommonModels.DateRangeDtoSchema, vgmCustomerDate: CommonModels.DateRangeDtoSchema, partnerNetworkId: z.string().describe("Filter positions by partner network ID"), projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), routing: CommonModels.SeaRoutingEnumSchema, isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly() }).readonly(); +export const PositionExportFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema.nullable(), customerId: z.array(z.string()).nullable(), isCancelled: z.boolean().nullable(), status: CommonModels.PositionStatusEnumSchema.nullable(), number: z.string().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), responsibleEmployee: z.array(z.string()).nullable(), searchQuery: z.string().nullable(), externalSystemId: z.string().nullable(), statusDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), dateOfDeparture: CommonModels.DateRangeDtoSchema.nullable(), dateOfArrival: CommonModels.DateRangeDtoSchema.nullable(), blfromCostumerDate: CommonModels.DateRangeDtoSchema.nullable(), blfromCarrierDate: CommonModels.DateRangeDtoSchema.nullable(), customsDate: CommonModels.DateRangeDtoSchema.nullable(), vgmCustomerDate: CommonModels.DateRangeDtoSchema.nullable(), partnerNetworkId: z.string().nullable(), projectLiteId: z.array(z.string()).nullable(), checklistItemsDone: z.array(z.string()).nullable(), checklistItemsNotDone: z.array(z.string()).nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable(), isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).nullable() }).partial(); export type PositionExportFilterDto = z.infer; /** @@ -179,7 +179,7 @@ export const PositionExportColumn = PositionExportColumnSchema.enum; * @property { PositionExportColumn[] } columns Min Items: `1` * @property { PositionExportFilterDto } filter */ -export const PositionExportRequestDtoSchema = z.object({ order: z.string().describe("Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition"), columns: z.array(PositionExportColumnSchema).readonly().min(1), filter: PositionExportFilterDtoSchema }).readonly(); +export const PositionExportRequestDtoSchema = z.object({ order: z.string().nullable(), columns: z.array(PositionExportColumnSchema).min(1).nullable(), filter: PositionExportFilterDtoSchema.nullable() }).partial(); export type PositionExportRequestDto = z.infer; /** @@ -193,7 +193,7 @@ export type PositionExportRequestDto = z.infer; /** @@ -210,7 +210,7 @@ export type CreatePositionRequestDto = z.infer; /** @@ -219,7 +219,7 @@ export type DuplicatePositionPackageInformationParametersDto = z.infer; /** @@ -228,7 +228,7 @@ export type DuplicatePositionCargoParametersDto = z.infer; /** @@ -237,7 +237,7 @@ export type DuplicatePositionOverviewParametersDto = z.infer; /** @@ -247,7 +247,7 @@ export type DuplicatePositionInvolvedPartiesParametersDto = z.infer; /** @@ -256,7 +256,7 @@ export type DuplicatePositionRoutesParametersDto = z.infer; /** @@ -266,7 +266,7 @@ export type DuplicatePositionFinanceAccountParametersDto = z.infer; /** @@ -279,7 +279,7 @@ export type DuplicatePositionDocumentsParametersDto = z.infer; /** @@ -288,7 +288,7 @@ export type DuplicatePositionParametersDto = z.infer; /** @@ -306,7 +306,7 @@ export const PositionSectionEnum = PositionSectionEnumSchema.enum; * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. * @property { string } estimatedServiceDate */ -export const DuplicatePositionRequestDtoSchema = z.object({ sections: z.array(PositionSectionEnumSchema).readonly().describe("Legacy: sections to duplicate. Ignored when parameters is provided.").nullish(), parameters: DuplicatePositionParametersDtoSchema.describe("Nested parameters for duplication control. Preferred over sections.").nullish(), estimatedServiceDate: z.iso.datetime({ offset: true }) }).readonly(); +export const DuplicatePositionRequestDtoSchema = z.object({ sections: z.array(PositionSectionEnumSchema).nullish(), parameters: DuplicatePositionParametersDtoSchema.nullish(), estimatedServiceDate: z.iso.datetime({ offset: true }) }); export type DuplicatePositionRequestDto = z.infer; /** @@ -338,7 +338,7 @@ export type DuplicatePositionRequestDto = z.infer; /** @@ -347,7 +347,7 @@ export type UpdatePositionDto = z.infer; * @property { string } id * @property { string } name */ -export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); export type ChildPositionCustomerDto = z.infer; /** @@ -356,7 +356,7 @@ export type ChildPositionCustomerDto = z.infer; /** @@ -370,7 +370,7 @@ export type ChildPositionProfitDto = z.infer; /** @@ -380,7 +380,7 @@ export type ChildPositionResponseDto = z.infer; /** @@ -395,7 +395,7 @@ export type PositionLabelsFilterDto = z.infer; /** @@ -403,7 +403,7 @@ export type PositionListResponseDto = z.infer; /** @@ -411,7 +411,7 @@ export type LinkChildPositionsRequestDto = z.infer; /** @@ -424,7 +424,7 @@ export type UnlinkChildPositionsRequestDto = z.infer; /** @@ -447,7 +447,7 @@ export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSc * @property { number } totalItems Total available items * @property { PositionPreviewResponseDto[] } items */ -export const PositionsPaginateResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape }); +export const PositionsPaginateResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).nullable() }).partial().shape }); export type PositionsPaginateResponse = z.infer; /** @@ -462,7 +462,7 @@ export type PositionsPaginateResponse = z.infer; /** @@ -475,14 +475,14 @@ export type TotalProfitResponse = z.infer; * @property { number } totalItems Total available items * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items */ -export const PositionsListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); +export const PositionsListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).nullable() }).partial().shape }); export type PositionsListAvailablePartnersForResponse = z.infer; /** * ListRouteLabelsResponseSchema * @type { array } */ -export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); export type ListRouteLabelsResponse = z.infer; /** @@ -495,7 +495,7 @@ export type ListRouteLabelsResponse = z.infer; } diff --git a/test/generated/next/positions/positions.queries.ts b/test/generated/next/positions/positions.queries.ts index 869e77f..3b89435 100644 --- a/test/generated/next/positions/positions.queries.ts +++ b/test/generated/next/positions/positions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -40,14 +39,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindAll = ({ officeId, limit, filter, page, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAll = ({ officeId, limit, filter, page, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findAll(officeId, limit, filter, page, cursor), queryFn: () => { checkAcl(PositionsAcl.canUseFindAll({ officeId } )); - return PositionsApi.findAll(officeId, limit, filter, page, cursor, config) }, + return PositionsApi.findAll(officeId, limit, filter, page, cursor) }, ...options, }); }; @@ -65,14 +64,14 @@ export const useFindAll = ({ officeId, limit, filter, page, cursor }: { o * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useFindAllInfinite = ({ officeId, limit, filter, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useFindAllInfinite = ({ officeId, limit, filter, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(PositionsAcl.canUseFindAll({ officeId } )); - return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor, config) }, + return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -96,14 +95,14 @@ export const useFindAllInfinite = ({ officeId, limit, filter, cursor }: { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(PositionsAcl.canUsePaginate({ officeId } )); - return PositionsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + return PositionsApi.paginate(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -122,14 +121,14 @@ export const usePaginate = ({ officeId, limit, order, filter, page, curso * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(PositionsAcl.canUsePaginate({ officeId } )); - return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -149,14 +148,14 @@ export const usePaginateInfinite = ({ officeId, limit, order, filter, cur * @returns { UseMutationResult } Position created successfully * @statusCodes [201, 400, 401, 404] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(PositionsAcl.canUseCreate({ officeId } )); - return PositionsApi.create(officeId, data, config) + return PositionsApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -175,14 +174,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useTotalProfit = ({ officeId }: { officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useTotalProfit = ({ officeId }: { officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.totalProfit(officeId), queryFn: () => { checkAcl(PositionsAcl.canUseTotalProfit({ officeId } )); - return PositionsApi.totalProfit(officeId, config) }, + return PositionsApi.totalProfit(officeId) }, ...options, }); }; @@ -199,14 +198,14 @@ export const useTotalProfit = ({ officeId }: { officeId: string }, option * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListAvailablePartnersFor = ({ officeId, positionId, search, useCase }: { officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListAvailablePartnersFor = ({ officeId, positionId, search, useCase }: { officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), queryFn: () => { checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId } )); - return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase, config) }, + return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase) }, ...options, }); }; @@ -221,14 +220,14 @@ export const useListAvailablePartnersFor = ({ officeId, positionId, searc * @returns { UseMutationResult> } * @statusCodes [200, 201, 401] */ -export const useExportPositions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useExportPositions = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(PositionsAcl.canUseExportPositions({ officeId } )); - return PositionsApi.exportPositions(officeId, data, config) + return PositionsApi.exportPositions(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -248,14 +247,14 @@ export const useExportPositions = (options?: AppMutationOptions } Position retrieved successfully * @statusCodes [200, 401, 403, 404] */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(officeId, positionId), queryFn: () => { checkAcl(PositionsAcl.canUseGet({ officeId } )); - return PositionsApi.get(officeId, positionId, config) }, + return PositionsApi.get(officeId, positionId) }, ...options, }); }; @@ -271,14 +270,14 @@ export const useGet = ({ officeId, positionId }: { officeId: string, posi * @returns { UseMutationResult } Position updated successfully * @statusCodes [200, 400, 401, 404] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(PositionsAcl.canUseUpdate({ officeId } )); - return PositionsApi.update(officeId, positionId, data, config) + return PositionsApi.update(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -300,14 +299,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useListRouteLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListRouteLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listRouteLabels(officeId, positionId), queryFn: () => { checkAcl(PositionsAcl.canUseListRouteLabels({ officeId } )); - return PositionsApi.listRouteLabels(officeId, positionId, config) }, + return PositionsApi.listRouteLabels(officeId, positionId) }, ...options, }); }; @@ -322,14 +321,14 @@ export const useListRouteLabels = ({ officeId, positionId }: { officeId: * @returns { UseQueryResult } Default parameters and suggested estimated service date * @statusCodes [200, 401, 404] */ -export const useGetDuplicateDefaultParameters = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetDuplicateDefaultParameters = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), queryFn: () => { checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId } )); - return PositionsApi.getDuplicateDefaultParameters(officeId, positionId, config) }, + return PositionsApi.getDuplicateDefaultParameters(officeId, positionId) }, ...options, }); }; @@ -345,14 +344,14 @@ export const useGetDuplicateDefaultParameters = ({ officeId, positionId } * @returns { UseMutationResult } Position duplicated successfully * @statusCodes [201, 400, 401, 404] */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(PositionsAcl.canUseDuplicate({ officeId } )); - return PositionsApi.duplicate(officeId, positionId, data, config) + return PositionsApi.duplicate(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -374,14 +373,14 @@ export const useDuplicate = (options?: AppMutationOptions } Position cancelled successfully * @statusCodes [200, 400, 401, 403, 404] */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId }) => { checkAcl(PositionsAcl.canUseCancel({ officeId } )); - return PositionsApi.cancel(officeId, positionId, config) + return PositionsApi.cancel(officeId, positionId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -403,14 +402,14 @@ export const useCancel = (options?: AppMutationOptions } Position reverted successfully * @statusCodes [200, 400, 401, 403, 404] */ -export const useRevertCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useRevertCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId }) => { checkAcl(PositionsAcl.canUseRevertCancel({ officeId } )); - return PositionsApi.revertCancel(officeId, positionId, config) + return PositionsApi.revertCancel(officeId, positionId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -433,14 +432,14 @@ export const useRevertCancel = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useLinkChild = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useLinkChild = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(PositionsAcl.canUseLinkChild({ officeId } )); - return PositionsApi.linkChild(officeId, positionId, data, config) + return PositionsApi.linkChild(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -461,14 +460,14 @@ export const useLinkChild = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnlinkChild = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnlinkChild = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(PositionsAcl.canUseUnlinkChild({ officeId } )); - return PositionsApi.unlinkChild(officeId, positionId, data, config) + return PositionsApi.unlinkChild(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -491,14 +490,14 @@ export const useUnlinkChild = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useListChild = ({ officeId, positionId, limit, page, cursor }: { officeId: string, positionId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListChild = ({ officeId, positionId, limit, page, cursor }: { officeId: string, positionId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listChild(officeId, positionId, limit, page, cursor), queryFn: () => { checkAcl(PositionsAcl.canUseListChild({ officeId } )); - return PositionsApi.listChild(officeId, positionId, limit, page, cursor, config) }, + return PositionsApi.listChild(officeId, positionId, limit, page, cursor) }, ...options, }); }; @@ -516,14 +515,14 @@ export const useListChild = ({ officeId, positionId, limit, page, cursor * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListChildInfinite = ({ officeId, positionId, limit, cursor }: { officeId: string, positionId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListChildInfinite = ({ officeId, positionId, limit, cursor }: { officeId: string, positionId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), queryFn: ({ pageParam }) => { checkAcl(PositionsAcl.canUseListChild({ officeId } )); - return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor, config) }, + return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; diff --git a/test/generated/next/projectLite/projectLite.api.ts b/test/generated/next/projectLite/projectLite.api.ts index caa5b16..3bb49bc 100644 --- a/test/generated/next/projectLite/projectLite.api.ts +++ b/test/generated/next/projectLite/projectLite.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ProjectLiteModels } from "./projectLite.models"; export namespace ProjectLiteApi { -export const create = (officeId: string, data: ProjectLiteModels.CreateProjectLiteRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: ProjectLiteModels.CreateProjectLiteRequestDTO, ) => { return AppRestClient.post( { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, `/offices/${officeId}/project-lite`, ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), - config + ) }; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, `/offices/${officeId}/project-lite`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginateProjectLabels = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateProjectLabels = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, `/offices/${officeId}/project-lite/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, `/offices/${officeId}/project-lite/${id}`, - config + ) }; -export const update = (id: string, officeId: string, data: ProjectLiteModels.UpdateProjectLiteRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, officeId: string, data: ProjectLiteModels.UpdateProjectLiteRequestDTO, ) => { return AppRestClient.patch( { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, `/offices/${officeId}/project-lite/${id}`, ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/project-lite/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/project-lite/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/projectLite/projectLite.models.ts b/test/generated/next/projectLite/projectLite.models.ts index fabb95a..a40cc28 100644 --- a/test/generated/next/projectLite/projectLite.models.ts +++ b/test/generated/next/projectLite/projectLite.models.ts @@ -8,7 +8,7 @@ export namespace ProjectLiteModels { * @property { string } id * @property { string } name */ -export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type ProjectLiteEmployeeDTO = z.infer; /** @@ -25,7 +25,7 @@ export type ProjectLiteEmployeeDTO = z.infer; /** @@ -33,7 +33,7 @@ export type ProjectLiteResponseDTO = z.infer; /** @@ -42,7 +42,7 @@ export type CreateProjectLiteRequestDTO = z.infer; /** @@ -50,7 +50,7 @@ export type ProjectLiteFilterDto = z.infer; * @type { object } * @property { string } name Project name */ -export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); +export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().nullable() }).partial(); export type UpdateProjectLiteRequestDTO = z.infer; /** @@ -71,7 +71,7 @@ export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEn * @property { number } totalItems Total available items * @property { ProjectLiteResponseDTO[] } items */ -export const ProjectLitePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).readonly() }).readonly().shape }); +export const ProjectLitePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).nullable() }).partial().shape }); export type ProjectLitePaginateResponse = z.infer; /** @@ -92,7 +92,7 @@ export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderPar * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const PaginateProjectLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const PaginateProjectLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type PaginateProjectLabelsResponse = z.infer; } diff --git a/test/generated/next/projectLite/projectLite.queries.ts b/test/generated/next/projectLite/projectLite.queries.ts index 43432ae..52d1c07 100644 --- a/test/generated/next/projectLite/projectLite.queries.ts +++ b/test/generated/next/projectLite/projectLite.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -30,14 +29,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(ProjectLiteAcl.canUseCreate({ officeId } )); - return ProjectLiteApi.create(officeId, data, config) + return ProjectLiteApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -61,14 +60,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); - return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -87,14 +86,14 @@ export const usePaginate = ({ officeId, limit, order, filter, page, curso * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); - return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -118,14 +117,14 @@ export const usePaginateInfinite = ({ officeId, limit, order, filter, cur * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateProjectLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateProjectLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor, config) }, + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -144,14 +143,14 @@ export const usePaginateProjectLabels = ({ officeId, limit, order, filter * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateProjectLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateProjectLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -171,14 +170,14 @@ export const usePaginateProjectLabelsInfinite = ({ officeId, limit, order * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id, officeId), queryFn: () => { checkAcl(ProjectLiteAcl.canUseFindById({ officeId } )); - return ProjectLiteApi.findById(id, officeId, config) }, + return ProjectLiteApi.findById(id, officeId) }, ...options, }); }; @@ -194,14 +193,14 @@ export const useFindById = ({ id, officeId }: { id: string, officeId: str * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId, data }) => { checkAcl(ProjectLiteAcl.canUseUpdate({ officeId } )); - return ProjectLiteApi.update(id, officeId, data, config) + return ProjectLiteApi.update(id, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -223,14 +222,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(ProjectLiteAcl.canUseArchive({ officeId } )); - return ProjectLiteApi.archive(id, officeId, config) + return ProjectLiteApi.archive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -250,14 +249,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId } )); - return ProjectLiteApi.unarchive(id, officeId, config) + return ProjectLiteApi.unarchive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/quoteAccount/quoteAccount.api.ts b/test/generated/next/quoteAccount/quoteAccount.api.ts index 0ef7323..f29e866 100644 --- a/test/generated/next/quoteAccount/quoteAccount.api.ts +++ b/test/generated/next/quoteAccount/quoteAccount.api.ts @@ -1,47 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { QuoteAccountModels } from "./quoteAccount.models"; export namespace QuoteAccountApi { -export const get = (quoteId: string, officeId: string, config?: AxiosRequestConfig) => { +export const get = (quoteId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, `/offices/${officeId}/quotes/${quoteId}/account`, - config + ) }; -export const createItem = (quoteId: string, officeId: string, data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, config?: AxiosRequestConfig) => { +export const createItem = (quoteId: string, officeId: string, data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, ) => { return AppRestClient.post( { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, `/offices/${officeId}/quotes/${quoteId}/account/items`, ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), - config + ) }; -export const deleteItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteItem = (quoteId: string, itemId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - undefined, - config + ) }; -export const updateItem = (quoteId: string, itemId: string, officeId: string, data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, config?: AxiosRequestConfig) => { +export const updateItem = (quoteId: string, itemId: string, officeId: string, data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, ) => { return AppRestClient.patch( { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), - config + ) }; -export const duplicateItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { +export const duplicateItem = (quoteId: string, itemId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, - undefined, - config + ) }; } diff --git a/test/generated/next/quoteAccount/quoteAccount.models.ts b/test/generated/next/quoteAccount/quoteAccount.models.ts index 71ef66e..cdc459b 100644 --- a/test/generated/next/quoteAccount/quoteAccount.models.ts +++ b/test/generated/next/quoteAccount/quoteAccount.models.ts @@ -45,7 +45,7 @@ export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy * @property { number } profit Profit amount */ -export const QuoteChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).readonly(), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge").nullish(), buyRate: z.number().describe("Buy rate amount").nullish(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }).readonly(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), sellRate: z.number().describe("Sell rate amount").nullish(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }).readonly(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), profit: z.number().describe("Profit amount").nullish() }).readonly(); +export const QuoteChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }), additionalText: z.string(), quantity: z.number().nullish(), buyRate: z.number().nullish(), buyCurrencyCode: z.string(), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }), buyExchangeRate: z.number().nullish(), sellRate: z.number().nullish(), sellCurrencyCode: z.string(), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }), sellExchangeRate: z.number().nullish(), profit: z.number().nullish() }); export type QuoteChargeDtoResponse = z.infer; /** @@ -53,7 +53,7 @@ export type QuoteChargeDtoResponse = z.infer; /** @@ -65,7 +65,7 @@ export type QuoteTextDtoResponse = z.infer; * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE * @property { QuoteTextDtoResponse } text Text data if type is TEXT */ -export const QuoteAccountItemDtoResponseSchema = z.object({ id: z.string().describe("Item ID"), type: QuoteAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item"), charge: QuoteChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), text: QuoteTextDtoResponseSchema.describe("Text data if type is TEXT").nullish() }).readonly(); +export const QuoteAccountItemDtoResponseSchema = z.object({ id: z.string(), type: QuoteAccountItemTypeEnumSchema, orderPosition: z.number(), charge: QuoteChargeDtoResponseSchema.nullish(), text: QuoteTextDtoResponseSchema.nullish() }); export type QuoteAccountItemDtoResponse = z.infer; /** @@ -87,7 +87,7 @@ export type QuoteAccountItemDtoResponse = z.infer; /** @@ -107,7 +107,7 @@ export type QuoteAccountResponseDto = z.infer; /** @@ -115,7 +115,7 @@ export type CreateQuoteChargeDataDto = z.infer; /** @@ -126,7 +126,7 @@ export type CreateQuoteTextDataDto = z.infer; /** @@ -146,7 +146,7 @@ export type CreateQuoteAccountItemRequestDto = z.infer; /** @@ -154,7 +154,7 @@ export type UpdateQuoteChargeDataDto = z.infer; /** @@ -164,7 +164,7 @@ export type UpdateQuoteTextDataDto = z.infer; } diff --git a/test/generated/next/quoteAccount/quoteAccount.queries.ts b/test/generated/next/quoteAccount/quoteAccount.queries.ts index 69c6456..eeba0f1 100644 --- a/test/generated/next/quoteAccount/quoteAccount.queries.ts +++ b/test/generated/next/quoteAccount/quoteAccount.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ quoteId, officeId }: { quoteId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ quoteId, officeId }: { quoteId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(quoteId, officeId), queryFn: () => { checkAcl(QuoteAccountAcl.canUseGet({ officeId } )); - return QuoteAccountApi.get(quoteId, officeId, config) }, + return QuoteAccountApi.get(quoteId, officeId) }, ...options, }); }; @@ -49,14 +48,14 @@ export const useGet = ({ quoteId, officeId }: { quoteId: string, officeId * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ quoteId, officeId, data }) => { checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId } )); - return QuoteAccountApi.createItem(quoteId, officeId, data, config) + return QuoteAccountApi.createItem(quoteId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -77,14 +76,14 @@ export const useCreateItem = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useDeleteItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteItem = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ quoteId, itemId, officeId }) => { checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId } )); - return QuoteAccountApi.deleteItem(quoteId, itemId, officeId, config) + return QuoteAccountApi.deleteItem(quoteId, itemId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -106,14 +105,14 @@ export const useDeleteItem = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ quoteId, itemId, officeId, data }) => { checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId } )); - return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data, config) + return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -134,14 +133,14 @@ export const useUpdateItem = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useDuplicateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDuplicateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ quoteId, itemId, officeId }) => { checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId } )); - return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId, config) + return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/quoteCargo/quoteCargo.api.ts b/test/generated/next/quoteCargo/quoteCargo.api.ts index dc2e9a4..3d52cf1 100644 --- a/test/generated/next/quoteCargo/quoteCargo.api.ts +++ b/test/generated/next/quoteCargo/quoteCargo.api.ts @@ -1,77 +1,73 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { QuoteCargoModels } from "./quoteCargo.models"; import { CommonModels } from "@/data/common/common.models"; export namespace QuoteCargoApi { -export const listCargosByQuoteId = (officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const listCargosByQuoteId = (officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos`, { - ...config, params: { order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const listCargoLabels = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const listCargoLabels = (officeId: string, quoteId: string, ) => { return AppRestClient.get( { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, - config + ) }; -export const getCargoSummary = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const getCargoSummary = (officeId: string, quoteId: string, ) => { return AppRestClient.get( { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, - config + ) }; -export const getCargoById = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { +export const getCargoById = (officeId: string, quoteId: string, cargoId: string, ) => { return AppRestClient.get( { resSchema: CommonModels.PositionCargoResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - config + ) }; -export const updateCargo = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, config?: AxiosRequestConfig) => { +export const updateCargo = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, ) => { return AppRestClient.patch( { resSchema: CommonModels.PositionCargoResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - config + ) }; -export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { +export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - undefined, - config + ) }; -export const createBulkCargos = (numberOfCargos: number, officeId: string, quoteId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { +export const createBulkCargos = (numberOfCargos: number, officeId: string, quoteId: string, data: CommonModels.CreatePositionCargoDTO, ) => { return AppRestClient.post( { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config + ) }; -export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { +export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCargoResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, - undefined, - config + ) }; } diff --git a/test/generated/next/quoteCargo/quoteCargo.models.ts b/test/generated/next/quoteCargo/quoteCargo.models.ts index 6520815..8d7a3a0 100644 --- a/test/generated/next/quoteCargo/quoteCargo.models.ts +++ b/test/generated/next/quoteCargo/quoteCargo.models.ts @@ -5,9 +5,8 @@ export namespace QuoteCargoModels { /** * ListCargosByQuoteIdOrderParamSchema * @type { array } - * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt */ -export const ListCargosByQuoteIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).readonly().describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt").nullish(); +export const ListCargosByQuoteIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).nullish(); export type ListCargosByQuoteIdOrderParam = z.infer; /** @@ -20,28 +19,28 @@ export type ListCargosByQuoteIdOrderParam = z.infer; /** * QuoteCargoListCargoLabelsResponseSchema * @type { array } */ -export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); +export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); export type QuoteCargoListCargoLabelsResponse = z.infer; /** * QuoteCargoGetCargoSummaryResponseSchema * @type { array } */ -export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); +export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema); export type QuoteCargoGetCargoSummaryResponse = z.infer; /** * QuoteCargoCreateBulkCargosResponseSchema * @type { array } */ -export const QuoteCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema).readonly(); +export const QuoteCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema); export type QuoteCargoCreateBulkCargosResponse = z.infer; } diff --git a/test/generated/next/quoteCargo/quoteCargo.queries.ts b/test/generated/next/quoteCargo/quoteCargo.queries.ts index 792ae63..3156a3e 100644 --- a/test/generated/next/quoteCargo/quoteCargo.queries.ts +++ b/test/generated/next/quoteCargo/quoteCargo.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -35,14 +34,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListCargosByQuoteId = ({ officeId, quoteId, limit, order, page, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListCargosByQuoteId = ({ officeId, quoteId, limit, order, page, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), queryFn: () => { checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor, config) }, + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor) }, ...options, }); }; @@ -61,14 +60,14 @@ export const useListCargosByQuoteId = ({ officeId, quoteId, limit, order, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListCargosByQuoteIdInfinite = ({ officeId, quoteId, limit, order, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListCargosByQuoteIdInfinite = ({ officeId, quoteId, limit, order, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), queryFn: ({ pageParam }) => { checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor, config) }, + return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -88,14 +87,14 @@ export const useListCargosByQuoteIdInfinite = ({ officeId, quoteId, limit * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListCargoLabels = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListCargoLabels = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listCargoLabels(officeId, quoteId), queryFn: () => { checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId } )); - return QuoteCargoApi.listCargoLabels(officeId, quoteId, config) }, + return QuoteCargoApi.listCargoLabels(officeId, quoteId) }, ...options, }); }; @@ -110,14 +109,14 @@ export const useListCargoLabels = ({ officeId, quoteId }: { officeId: str * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetCargoSummary = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCargoSummary = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getCargoSummary(officeId, quoteId), queryFn: () => { checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId } )); - return QuoteCargoApi.getCargoSummary(officeId, quoteId, config) }, + return QuoteCargoApi.getCargoSummary(officeId, quoteId) }, ...options, }); }; @@ -133,14 +132,14 @@ export const useGetCargoSummary = ({ officeId, quoteId }: { officeId: str * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetCargoById = ({ officeId, quoteId, cargoId }: { officeId: string, quoteId: string, cargoId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCargoById = ({ officeId, quoteId, cargoId }: { officeId: string, quoteId: string, cargoId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getCargoById(officeId, quoteId, cargoId), queryFn: () => { checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId } )); - return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId, config) }, + return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId) }, ...options, }); }; @@ -157,14 +156,14 @@ export const useGetCargoById = ({ officeId, quoteId, cargoId }: { officeI * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, cargoId, data }) => { checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId } )); - return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data, config) + return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -187,14 +186,14 @@ export const useUpdateCargo = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, cargoId }) => { checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId } )); - return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId, config) + return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -216,14 +215,14 @@ export const useDeleteCargo = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId } )); - return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data, config) + return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -244,14 +243,14 @@ export const useCreateBulkCargos = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, cargoId }) => { checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId } )); - return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId, config) + return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts b/test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts index 17b3e8f..f399bc6 100644 --- a/test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts +++ b/test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts @@ -1,48 +1,45 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; export namespace QuoteCargoPackageApi { -export const createPackage = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { +export const createPackage = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - config + ) }; -export const updatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { +export const updatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, ) => { return AppRestClient.patch( { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - config + ) }; -export const deletePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { +export const deletePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - undefined, - config + ) }; -export const duplicatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { +export const duplicatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - undefined, - config + ) }; -export const movePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, config?: AxiosRequestConfig) => { +export const movePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, ) => { return AppRestClient.patch( { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts b/test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts index 722792e..8556a3a 100644 --- a/test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts +++ b/test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -25,14 +24,14 @@ export const moduleName = QueryModule.QuoteCargoPackage; * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, cargoId, data }) => { checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId } )); - return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data, config) + return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -55,14 +54,14 @@ export const useCreatePackage = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId } )); - return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data, config) + return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -84,14 +83,14 @@ export const useUpdatePackage = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId } )); - return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId, config) + return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -113,14 +112,14 @@ export const useDeletePackage = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId } )); - return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId, config) + return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -143,14 +142,14 @@ export const useDuplicatePackage = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId } )); - return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data, config) + return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/quoteConversion/quoteConversion.api.ts b/test/generated/next/quoteConversion/quoteConversion.api.ts index 30eb85a..ecf19cc 100644 --- a/test/generated/next/quoteConversion/quoteConversion.api.ts +++ b/test/generated/next/quoteConversion/quoteConversion.api.ts @@ -1,16 +1,15 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; import { QuoteConversionModels } from "./quoteConversion.models"; export namespace QuoteConversionApi { -export const convertQuoteToPosition = (officeId: string, quoteId: string, data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, config?: AxiosRequestConfig) => { +export const convertQuoteToPosition = (officeId: string, quoteId: string, data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, ) => { return AppRestClient.post( { resSchema: CommonModels.PositionCoreResponseDtoSchema }, `/offices/${officeId}/quotes/${quoteId}/convert`, ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/quoteConversion/quoteConversion.models.ts b/test/generated/next/quoteConversion/quoteConversion.models.ts index 08987fb..ccca298 100644 --- a/test/generated/next/quoteConversion/quoteConversion.models.ts +++ b/test/generated/next/quoteConversion/quoteConversion.models.ts @@ -6,7 +6,7 @@ export namespace QuoteConversionModels { * @type { object } * @property { string } estimatedServiceDate */ -export const ConvertQuoteToPositionRequestDtoSchema = z.object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }).readonly(); +export const ConvertQuoteToPositionRequestDtoSchema = z.object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }); export type ConvertQuoteToPositionRequestDto = z.infer; } diff --git a/test/generated/next/quoteConversion/quoteConversion.queries.ts b/test/generated/next/quoteConversion/quoteConversion.queries.ts index 9fbcf1d..bfba951 100644 --- a/test/generated/next/quoteConversion/quoteConversion.queries.ts +++ b/test/generated/next/quoteConversion/quoteConversion.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -24,14 +23,14 @@ export const moduleName = QueryModule.QuoteConversion; * @returns { UseMutationResult } Quote converted to position successfully * @statusCodes [201, 400, 401, 404] */ -export const useConvertQuoteToPosition = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useConvertQuoteToPosition = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId } )); - return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data, config) + return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/quoteDocument/quoteDocument.api.ts b/test/generated/next/quoteDocument/quoteDocument.api.ts index b5f9bfb..9c7c296 100644 --- a/test/generated/next/quoteDocument/quoteDocument.api.ts +++ b/test/generated/next/quoteDocument/quoteDocument.api.ts @@ -1,32 +1,30 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { QuoteDocumentModels } from "./quoteDocument.models"; export namespace QuoteDocumentApi { -export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, quoteId: string, ) => { return AppRestClient.get( { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, `/offices/${officeId}/quotes/${quoteId}/document`, - config + ) }; -export const update = (officeId: string, quoteId: string, data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { +export const update = (officeId: string, quoteId: string, data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, ) => { return AppRestClient.patch( { resSchema: z.void() }, `/offices/${officeId}/quotes/${quoteId}/document`, ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), - config + ) }; -export const getPreview = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, config?: AxiosRequestConfig) => { +export const getPreview = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/quotes/${quoteId}/document/preview`, ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -35,21 +33,20 @@ export const getPreview = (officeId: string, quoteId: string, data: QuoteDocumen } ) }; -export const generate = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generate = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/quotes/${quoteId}/document/generate`, ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - config + ) }; -export const generateEml = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateEml = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/quotes/${quoteId}/document/eml`, ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/octet-stream', }, diff --git a/test/generated/next/quoteDocument/quoteDocument.models.ts b/test/generated/next/quoteDocument/quoteDocument.models.ts index 8362f3f..73bb8da 100644 --- a/test/generated/next/quoteDocument/quoteDocument.models.ts +++ b/test/generated/next/quoteDocument/quoteDocument.models.ts @@ -9,7 +9,7 @@ export namespace QuoteDocumentModels { * @property { CommonModels.CargoTableBlockDto } cargoTable * @property { CommonModels.FinanceTableBlockDto } financeTable */ -export const QuoteDocumentDataDtoSchema = z.object({ routeTable: CommonModels.RouteTableBlockResponseDtoSchema, cargoTable: CommonModels.CargoTableBlockDtoSchema, financeTable: CommonModels.FinanceTableBlockDtoSchema }).readonly(); +export const QuoteDocumentDataDtoSchema = z.object({ routeTable: CommonModels.RouteTableBlockResponseDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockDtoSchema.nullable() }).partial(); export type QuoteDocumentDataDto = z.infer; /** @@ -21,7 +21,7 @@ export type QuoteDocumentDataDto = z.infer; * @property { boolean } showWatermarkOnDocuments * @property { CommonModels.LocaleEnum } locale */ -export const QuoteDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), termsAndConditionsImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); +export const QuoteDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), termsAndConditionsImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); export type QuoteDocumentConfigDto = z.infer; /** @@ -30,7 +30,7 @@ export type QuoteDocumentConfigDto = z.infer; /** @@ -43,7 +43,7 @@ export type CustomerDto = z.infer; * @property { string } validFrom * @property { string } validUntil */ -export const ContactDtoSchema = z.object({ name: z.string(), email: z.string(), phone: z.string(), date: z.iso.datetime({ offset: true }), validFrom: z.iso.datetime({ offset: true }).nullish(), validUntil: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export const ContactDtoSchema = z.object({ name: z.string(), email: z.string(), phone: z.string(), date: z.iso.datetime({ offset: true }), validFrom: z.iso.datetime({ offset: true }).nullish(), validUntil: z.iso.datetime({ offset: true }).nullish() }); export type ContactDto = z.infer; /** @@ -67,7 +67,7 @@ export type ContactDto = z.infer; * @property { QuoteDocumentConfigDto } config * @property { string } issuedAt */ -export const QuoteDocumentResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), quoteNumber: z.string(), quoteTransportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), transitDurationInDays: z.string().describe("Transit duration in days").nullish(), customer: CustomerDtoSchema, contact: ContactDtoSchema, data: QuoteDocumentDataDtoSchema.nullish(), suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), isIssued: z.boolean(), version: z.number(), config: QuoteDocumentConfigDtoSchema.nullish(), issuedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); +export const QuoteDocumentResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), quoteNumber: z.string(), quoteTransportMode: CommonModels.TransportModeEnumSchema, frequency: CommonModels.FrequencyEnumSchema.nullish(), transitDurationInDays: z.string().nullish(), customer: CustomerDtoSchema, contact: ContactDtoSchema, data: QuoteDocumentDataDtoSchema.nullish(), suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), isIssued: z.boolean(), version: z.number(), config: QuoteDocumentConfigDtoSchema.nullish(), issuedAt: z.iso.datetime({ offset: true }).nullish() }); export type QuoteDocumentResponseDto = z.infer; /** @@ -77,7 +77,7 @@ export type QuoteDocumentResponseDto = z.infer; /** @@ -86,7 +86,7 @@ export type QuoteDocumentDataUpdateDto = z.infer; /** @@ -97,7 +97,7 @@ export type CustomerUpdateDto = z.infer; * @property { string } phone * @property { string } date */ -export const ContactUpdateDtoSchema = z.object({ name: z.string(), email: z.email(), phone: z.string(), date: z.iso.datetime({ offset: true }) }).readonly(); +export const ContactUpdateDtoSchema = z.object({ name: z.string().nullable(), email: z.email().nullable(), phone: z.string().nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); export type ContactUpdateDto = z.infer; /** @@ -111,7 +111,7 @@ export type ContactUpdateDto = z.infer; * @property { boolean } suspendFinanceTable * @property { QuoteDocumentDataUpdateDto } data */ -export const UpdateQuoteDocumentRequestDtoSchema = z.object({ customer: CustomerUpdateDtoSchema, contact: ContactUpdateDtoSchema, bodyRemarks: CommonModels.EditorContentUpdateDtoSchema, footerRemarks: CommonModels.EditorContentUpdateDtoSchema, suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), data: QuoteDocumentDataUpdateDtoSchema }).readonly(); +export const UpdateQuoteDocumentRequestDtoSchema = z.object({ customer: CustomerUpdateDtoSchema.nullable(), contact: ContactUpdateDtoSchema.nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), suspendCargoTable: z.boolean().nullable(), suspendFinanceTable: z.boolean().nullable(), data: QuoteDocumentDataUpdateDtoSchema.nullable() }).partial(); export type UpdateQuoteDocumentRequestDto = z.infer; /** @@ -119,7 +119,7 @@ export type UpdateQuoteDocumentRequestDto = z.infer; /** @@ -128,7 +128,7 @@ export type GenerateQuoteDocumentPreviewRequestDto = z.infer; } diff --git a/test/generated/next/quoteDocument/quoteDocument.queries.ts b/test/generated/next/quoteDocument/quoteDocument.queries.ts index fd43c96..c9b50a2 100644 --- a/test/generated/next/quoteDocument/quoteDocument.queries.ts +++ b/test/generated/next/quoteDocument/quoteDocument.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(officeId, quoteId), queryFn: () => { checkAcl(QuoteDocumentAcl.canUseGet({ officeId } )); - return QuoteDocumentApi.get(officeId, quoteId, config) }, + return QuoteDocumentApi.get(officeId, quoteId) }, ...options, }); }; @@ -49,14 +48,14 @@ export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId } )); - return QuoteDocumentApi.update(officeId, quoteId, data, config) + return QuoteDocumentApi.update(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -77,14 +76,14 @@ export const useUpdate = (options?: AppMutationOptions> } * @statusCodes [200, 201, 401] */ -export const useGetPreview = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGetPreview = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId } )); - return QuoteDocumentApi.getPreview(officeId, quoteId, data, config) + return QuoteDocumentApi.getPreview(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -105,14 +104,14 @@ export const useGetPreview = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId } )); - return QuoteDocumentApi.generate(officeId, quoteId, data, config) + return QuoteDocumentApi.generate(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -133,14 +132,14 @@ export const useGenerate = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const useGenerateEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateEml = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId } )); - return QuoteDocumentApi.generateEml(officeId, quoteId, data, config) + return QuoteDocumentApi.generateEml(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts index aa8e7c0..2991187 100644 --- a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts +++ b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts @@ -1,29 +1,27 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; export namespace QuoteProfitChangeTrackingApi { -export const findProfitChangeGroups = (officeId: string, quoteId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const findProfitChangeGroups = (officeId: string, quoteId: string, limit: number, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, { - ...config, params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findProfitChangeGroupDetail = (groupId: string, officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const findProfitChangeGroupDetail = (groupId: string, officeId: string, quoteId: string, ) => { return AppRestClient.get( { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, - config + ) }; } diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts index a87cf72..9067c50 100644 --- a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts +++ b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts @@ -13,7 +13,7 @@ export namespace QuoteProfitChangeTrackingModels { * @property { string } profit.currencyCode * @property { number } changeCount */ -export const QuoteAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), changeCount: z.number() }).readonly(); +export const QuoteAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema), profit: z.object({ amount: z.number(), currencyCode: z.string() }), changeCount: z.number() }); export type QuoteAccountProfitChangeGroupDto = z.infer; /** @@ -26,7 +26,7 @@ export type QuoteAccountProfitChangeGroupDto = z.infer; /** @@ -37,7 +37,7 @@ export type QuoteAccountProfitChangeEntryDto = z.infer; /** @@ -50,7 +50,7 @@ export type QuoteAccountProfitChangeGroupDetailDto = z.infer; } diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts index 380a658..9388eba 100644 --- a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts +++ b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -29,14 +28,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindProfitChangeGroups = ({ officeId, quoteId, limit, page, cursor }: { officeId: string, quoteId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindProfitChangeGroups = ({ officeId, quoteId, limit, page, cursor }: { officeId: string, quoteId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), queryFn: () => { checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor, config) }, + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor) }, ...options, }); }; @@ -54,14 +53,14 @@ export const useFindProfitChangeGroups = ({ officeId, quoteId, limit, pag * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useFindProfitChangeGroupsInfinite = ({ officeId, quoteId, limit, cursor }: { officeId: string, quoteId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useFindProfitChangeGroupsInfinite = ({ officeId, quoteId, limit, cursor }: { officeId: string, quoteId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), queryFn: ({ pageParam }) => { checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor, config) }, + return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -82,14 +81,14 @@ export const useFindProfitChangeGroupsInfinite = ({ officeId, quoteId, li * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindProfitChangeGroupDetail = ({ groupId, officeId, quoteId }: { groupId: string, officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindProfitChangeGroupDetail = ({ groupId, officeId, quoteId }: { groupId: string, officeId: string, quoteId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), queryFn: () => { checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId, config) }, + return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId) }, ...options, }); }; diff --git a/test/generated/next/quoteRoutes/quoteRoutes.api.ts b/test/generated/next/quoteRoutes/quoteRoutes.api.ts index ac83816..8688bde 100644 --- a/test/generated/next/quoteRoutes/quoteRoutes.api.ts +++ b/test/generated/next/quoteRoutes/quoteRoutes.api.ts @@ -1,63 +1,60 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { CommonModels } from "@/data/common/common.models"; export namespace QuoteRoutesApi { -export const listRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const listRoutes = (officeId: string, quoteId: string, ) => { return AppRestClient.get( { resSchema: CommonModels.RouteListResponseDtoSchema }, `/offices/${officeId}/quotes/${quoteId}/routes`, - config + ) }; -export const createRoutePoint = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, config?: AxiosRequestConfig) => { +export const createRoutePoint = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, ) => { return AppRestClient.post( { resSchema: CommonModels.RoutePointResponseDtoSchema }, `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - config + ) }; -export const updateRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, config?: AxiosRequestConfig) => { +export const updateRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, ) => { return AppRestClient.patch( { resSchema: CommonModels.RoutePointResponseDtoSchema }, `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - config + ) }; -export const deleteRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, config?: AxiosRequestConfig) => { +export const deleteRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - undefined, - config + ) }; -export const splitRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const splitRoutes = (officeId: string, quoteId: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/quotes/${quoteId}/routes/split`, - undefined, - config + ) }; -export const mergeRoutes = (officeId: string, quoteId: string, data: CommonModels.MergeRoutesRequestDto, config?: AxiosRequestConfig) => { +export const mergeRoutes = (officeId: string, quoteId: string, data: CommonModels.MergeRoutesRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/quotes/${quoteId}/routes/merge`, ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - config + ) }; -export const copyRoute = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, config?: AxiosRequestConfig) => { +export const copyRoute = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/quoteRoutes/quoteRoutes.queries.ts b/test/generated/next/quoteRoutes/quoteRoutes.queries.ts index e7634ea..04ed45f 100644 --- a/test/generated/next/quoteRoutes/quoteRoutes.queries.ts +++ b/test/generated/next/quoteRoutes/quoteRoutes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useListRoutes = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListRoutes = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listRoutes(officeId, quoteId), queryFn: () => { checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId } )); - return QuoteRoutesApi.listRoutes(officeId, quoteId, config) }, + return QuoteRoutesApi.listRoutes(officeId, quoteId) }, ...options, }); }; @@ -50,14 +49,14 @@ export const useListRoutes = ({ officeId, quoteId }: { officeId: string, * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, routeId, data }) => { checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId } )); - return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data, config) + return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -80,14 +79,14 @@ export const useCreateRoutePoint = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId } )); - return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data, config) + return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -109,14 +108,14 @@ export const useUpdateRoutePoint = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, routeId, pointId }) => { checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId } )); - return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId, config) + return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -136,14 +135,14 @@ export const useDeleteRoutePoint = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId }) => { checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId } )); - return QuoteRoutesApi.splitRoutes(officeId, quoteId, config) + return QuoteRoutesApi.splitRoutes(officeId, quoteId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -164,14 +163,14 @@ export const useSplitRoutes = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId } )); - return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data, config) + return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -193,14 +192,14 @@ export const useMergeRoutes = (options?: AppMutationOptions } * @statusCodes [204, 401] */ -export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, routeId, data }) => { checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId } )); - return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data, config) + return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/quotes/quotes.api.ts b/test/generated/next/quotes/quotes.api.ts index 0e682d4..53ffe08 100644 --- a/test/generated/next/quotes/quotes.api.ts +++ b/test/generated/next/quotes/quotes.api.ts @@ -1,41 +1,38 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { QuotesModels } from "./quotes.models"; import { CommonModels } from "@/data/common/common.models"; export namespace QuotesApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: QuotesModels.QuotesPaginateResponseSchema }, `/offices/${officeId}/quotes`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, ) => { return AppRestClient.post( { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, `/offices/${officeId}/quotes`, ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), - config + ) }; -export const listAvailablePartnersFor = (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { +export const listAvailablePartnersFor = (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { return AppRestClient.get( { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, `/offices/${officeId}/quotes/${quoteId}/available-partners`, { - ...config, params: { search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), @@ -43,13 +40,12 @@ export const listAvailablePartnersFor = (officeId: string, quoteId: string, sear } ) }; -export const exportQuotes = (officeId: string, data: QuotesModels.QuoteExportRequestDto, config?: AxiosRequestConfig) => { +export const exportQuotes = (officeId: string, data: QuotesModels.QuoteExportRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/quotes/exports`, ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', }, @@ -58,66 +54,64 @@ export const exportQuotes = (officeId: string, data: QuotesModels.QuoteExportReq } ) }; -export const getById = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const getById = (officeId: string, quoteId: string, ) => { return AppRestClient.get( { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}`, - config + ) }; -export const update = (officeId: string, quoteId: string, data: QuotesModels.UpdateQuoteRequestDTO, config?: AxiosRequestConfig) => { +export const update = (officeId: string, quoteId: string, data: QuotesModels.UpdateQuoteRequestDTO, ) => { return AppRestClient.patch( { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}`, ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), - config + ) }; -export const cancel = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const cancel = (officeId: string, quoteId: string, ) => { return AppRestClient.post( { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/cancel`, - undefined, - config + ) }; -export const duplicate = (officeId: string, quoteId: string, data: QuotesModels.DuplicateQuoteRequestDto, config?: AxiosRequestConfig) => { +export const duplicate = (officeId: string, quoteId: string, data: QuotesModels.DuplicateQuoteRequestDto, ) => { return AppRestClient.post( { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/duplicate`, ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), - config + ) }; -export const getInvolvedParties = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const getInvolvedParties = (officeId: string, quoteId: string, ) => { return AppRestClient.get( { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - config + ) }; -export const createInvolvedParty = (officeId: string, quoteId: string, data: CommonModels.CreateInvolvedPartyRequestDto, config?: AxiosRequestConfig) => { +export const createInvolvedParty = (officeId: string, quoteId: string, data: CommonModels.CreateInvolvedPartyRequestDto, ) => { return AppRestClient.post( { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, `/offices/${officeId}/quotes/${quoteId}/involved-parties`, ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - config + ) }; -export const updateInvolvedParty = (officeId: string, quoteId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, config?: AxiosRequestConfig) => { +export const updateInvolvedParty = (officeId: string, quoteId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, ) => { return AppRestClient.patch( { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - config + ) }; -export const deleteInvolvedParty = (officeId: string, quoteId: string, partyId: string, config?: AxiosRequestConfig) => { +export const deleteInvolvedParty = (officeId: string, quoteId: string, partyId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - undefined, - config + ) }; } diff --git a/test/generated/next/quotes/quotes.models.ts b/test/generated/next/quotes/quotes.models.ts index 77132f4..47c00a5 100644 --- a/test/generated/next/quotes/quotes.models.ts +++ b/test/generated/next/quotes/quotes.models.ts @@ -20,7 +20,7 @@ export const QuoteStatusEnum = QuoteStatusEnumSchema.enum; * @property { string } phone The phone number of the customer * @property { string } email The email of the customer */ -export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().describe("The phone number of the customer").nullish(), email: z.string().describe("The email of the customer").nullish() }).readonly(); +export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }); export type QuoteCustomerResponseDto = z.infer; /** @@ -31,7 +31,7 @@ export type QuoteCustomerResponseDto = z.infer; /** @@ -70,7 +70,7 @@ export type QuoteNamedReferenceResponseDto = z.infer; /** @@ -92,7 +92,7 @@ export type QuotePreviewResponseDTO = z.infer; /** @@ -105,7 +105,7 @@ export type QuoteFilterDto = z.infer; * @property { string } searchQuery * @property { string[] } customer */ -export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); +export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema.nullable(), transportMode: CommonModels.TransportModeEnumSchema.nullable(), status: z.array(QuoteStatusEnumSchema).nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), searchQuery: z.string().nullable(), customer: z.array(z.string()).nullable() }).partial(); export type QuoteExportFilterDto = z.infer; /** @@ -123,7 +123,7 @@ export const QuoteExportColumn = QuoteExportColumnSchema.enum; * @property { string[] } order * @property { QuoteExportFilterDto } filter */ -export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: QuoteExportFilterDtoSchema }).readonly(); +export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: QuoteExportFilterDtoSchema.nullable() }).partial(); export type QuoteExportRequestDto = z.infer; /** @@ -136,7 +136,7 @@ export type QuoteExportRequestDto = z.infer; * @property { CommonModels.ServiceTypeEnum } serviceType The service type for the quote * @property { string } customerBusinessPartnerId The ID of the business partner that is the customer */ -export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema.describe("The section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("The direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("The mode of transport for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The service type for the quote"), customerBusinessPartnerId: z.string().describe("The ID of the business partner that is the customer") }).readonly(); +export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, customerBusinessPartnerId: z.string() }); export type CreateQuoteRequestDTO = z.infer; /** @@ -145,7 +145,7 @@ export type CreateQuoteRequestDTO = z.infer; * @property { string } id * @property { string } name */ -export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); export type QuoteCustomerDto = z.infer; /** @@ -154,7 +154,7 @@ export type QuoteCustomerDto = z.infer; * @property { string } id Unique identifier of the employee * @property { string } name Name of the employee */ -export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the employee"), name: z.string().describe("Name of the employee") }).readonly(); +export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); export type QuoteEmployeeResponseDTO = z.infer; /** @@ -179,7 +179,7 @@ export const QuoteTypeEnum = QuoteTypeEnumSchema.enum; * @property { string } positionId * @property { string } positionNumber */ -export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }).readonly(); +export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }); export type QuoteConvertedPositionDto = z.infer; /** @@ -218,7 +218,7 @@ export type QuoteConvertedPositionDto = z.infer; /** @@ -242,7 +242,7 @@ export type QuoteCoreResponseDTO = z.infer; * @property { string } team The team responsible for the quote * @property { number } volumetricWeightModifier Volumetric weight modifier */ -export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().describe("The quote number"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status"), cargoType: CargoTypeEnumSchema.describe("The type of cargo for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), incoterms: CommonModels.IncotermsEnumSchema.describe("The incoterms for the quote"), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("The second incoterms for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The type of service for the quote"), buyRateReference: z.string().describe("The reference for the buy rate"), frequency: CommonModels.FrequencyEnumSchema.describe("The frequency of the quote"), transitDurationInDays: z.string().describe("The transit duration in days").nullable(), quoteType: QuoteTypeEnumSchema.describe("The type of quote"), defaultCurrencyId: z.string().describe("The default currency for the quote"), salesRepId: z.string().describe("The sales representative for the quote"), responsibleEmployeeId: z.string().describe("The responsible employee for the quote"), receivedByEmployeeId: z.string().describe("The employee who receieved the quote"), team: z.string().describe("The team responsible for the quote"), volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); +export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().nullable(), statusDate: z.iso.datetime({ offset: true }).nullable(), cargoType: CargoTypeEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), incoterms: CommonModels.IncotermsEnumSchema.nullable(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), buyRateReference: z.string().nullable(), frequency: CommonModels.FrequencyEnumSchema.nullable(), transitDurationInDays: z.string().nullable(), quoteType: QuoteTypeEnumSchema.nullable(), defaultCurrencyId: z.string().nullable(), salesRepId: z.string().nullable(), responsibleEmployeeId: z.string().nullable(), receivedByEmployeeId: z.string().nullable(), team: z.string().nullable(), volumetricWeightModifier: z.number().nullable() }).partial(); export type UpdateQuoteRequestDTO = z.infer; /** @@ -258,7 +258,7 @@ export const QuoteSectionEnum = QuoteSectionEnumSchema.enum; * @type { object } * @property { QuoteSectionEnum[] } sections The sections to duplicate. Min Items: `1` */ -export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).readonly().min(1).describe("The sections to duplicate") }).readonly(); +export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).min(1) }); export type DuplicateQuoteRequestDto = z.infer; /** @@ -273,7 +273,7 @@ export type DuplicateQuoteRequestDto = z.infer; /** @@ -296,7 +296,7 @@ export const QuotesPaginateOrderParamEnum = QuotesPaginateOrderParamEnumSchema.e * @property { number } totalItems Total available items * @property { QuotePreviewResponseDTO[] } items */ -export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).readonly() }).readonly().shape }); +export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).nullable() }).partial().shape }); export type QuotesPaginateResponse = z.infer; /** @@ -309,14 +309,14 @@ export type QuotesPaginateResponse = z.infer; /** * GetInvolvedPartiesResponseSchema * @type { array } */ -export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); +export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema); export type GetInvolvedPartiesResponse = z.infer; } diff --git a/test/generated/next/quotes/quotes.queries.ts b/test/generated/next/quotes/quotes.queries.ts index 8d2f75e..42b6e3c 100644 --- a/test/generated/next/quotes/quotes.queries.ts +++ b/test/generated/next/quotes/quotes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -35,14 +34,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(QuotesAcl.canUsePaginate({ officeId } )); - return QuotesApi.paginate(officeId, limit, order, filter, page, cursor, config) }, + return QuotesApi.paginate(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -61,14 +60,14 @@ export const usePaginate = ({ officeId, limit, order, filter, page, curso * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(QuotesAcl.canUsePaginate({ officeId } )); - return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, + return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -88,14 +87,14 @@ export const usePaginateInfinite = ({ officeId, limit, order, filter, cur * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(QuotesAcl.canUseCreate({ officeId } )); - return QuotesApi.create(officeId, data, config) + return QuotesApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -117,14 +116,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useListAvailablePartnersFor = ({ officeId, quoteId, search, useCase }: { officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useListAvailablePartnersFor = ({ officeId, quoteId, search, useCase }: { officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), queryFn: () => { checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId } )); - return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase, config) }, + return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase) }, ...options, }); }; @@ -139,14 +138,14 @@ export const useListAvailablePartnersFor = ({ officeId, quoteId, search, * @returns { UseMutationResult> } * @statusCodes [200, 201, 401] */ -export const useExportQuotes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useExportQuotes = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(QuotesAcl.canUseExportQuotes({ officeId } )); - return QuotesApi.exportQuotes(officeId, data, config) + return QuotesApi.exportQuotes(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -166,14 +165,14 @@ export const useExportQuotes = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetById = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetById = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getById(officeId, quoteId), queryFn: () => { checkAcl(QuotesAcl.canUseGetById({ officeId } )); - return QuotesApi.getById(officeId, quoteId, config) }, + return QuotesApi.getById(officeId, quoteId) }, ...options, }); }; @@ -189,14 +188,14 @@ export const useGetById = ({ officeId, quoteId }: { officeId: string, quo * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(QuotesAcl.canUseUpdate({ officeId } )); - return QuotesApi.update(officeId, quoteId, data, config) + return QuotesApi.update(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -218,14 +217,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId }) => { checkAcl(QuotesAcl.canUseCancel({ officeId } )); - return QuotesApi.cancel(officeId, quoteId, config) + return QuotesApi.cancel(officeId, quoteId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -248,14 +247,14 @@ export const useCancel = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(QuotesAcl.canUseDuplicate({ officeId } )); - return QuotesApi.duplicate(officeId, quoteId, data, config) + return QuotesApi.duplicate(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -277,14 +276,14 @@ export const useDuplicate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetInvolvedParties = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetInvolvedParties = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getInvolvedParties(officeId, quoteId), queryFn: () => { checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId } )); - return QuotesApi.getInvolvedParties(officeId, quoteId, config) }, + return QuotesApi.getInvolvedParties(officeId, quoteId) }, ...options, }); }; @@ -300,14 +299,14 @@ export const useGetInvolvedParties = ({ officeId, quoteId }: { officeId: * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId } )); - return QuotesApi.createInvolvedParty(officeId, quoteId, data, config) + return QuotesApi.createInvolvedParty(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -329,14 +328,14 @@ export const useCreateInvolvedParty = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUpdateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, partyId, data }) => { checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId } )); - return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data, config) + return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -357,14 +356,14 @@ export const useUpdateInvolvedParty = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useDeleteInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, partyId }) => { checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId } )); - return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId, config) + return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/remarkTemplates/remarkTemplates.api.ts b/test/generated/next/remarkTemplates/remarkTemplates.api.ts index c4f8e86..f4ba6d9 100644 --- a/test/generated/next/remarkTemplates/remarkTemplates.api.ts +++ b/test/generated/next/remarkTemplates/remarkTemplates.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { RemarkTemplatesModels } from "./remarkTemplates.models"; export namespace RemarkTemplatesApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, `/offices/${officeId}/remark-templates/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const list = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, `/offices/${officeId}/remark-templates`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (officeId: string, data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, config?: AxiosRequestConfig) => { +export const create = (officeId: string, data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, ) => { return AppRestClient.post( { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, `/offices/${officeId}/remark-templates`, ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), - config + ) }; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, officeId: string, ) => { return AppRestClient.get( { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, `/offices/${officeId}/remark-templates/${id}`, - config + ) }; -export const update = (id: string, officeId: string, data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, officeId: string, data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, ) => { return AppRestClient.patch( { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, `/offices/${officeId}/remark-templates/${id}`, ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, `/offices/${officeId}/remark-templates/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, officeId: string, ) => { return AppRestClient.post( { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, `/offices/${officeId}/remark-templates/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/remarkTemplates/remarkTemplates.models.ts b/test/generated/next/remarkTemplates/remarkTemplates.models.ts index 10f5d41..265dd7f 100644 --- a/test/generated/next/remarkTemplates/remarkTemplates.models.ts +++ b/test/generated/next/remarkTemplates/remarkTemplates.models.ts @@ -9,7 +9,7 @@ export namespace RemarkTemplatesModels { * @property { string } label * @property { CommonModels.EditorContentResponseDto } content Remark template content */ -export const RemarkTemplateLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), content: CommonModels.EditorContentResponseDtoSchema.describe("Remark template content") }).readonly(); +export const RemarkTemplateLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), content: CommonModels.EditorContentResponseDtoSchema }); export type RemarkTemplateLabelResponseDTO = z.infer; /** @@ -18,7 +18,7 @@ export type RemarkTemplateLabelResponseDTO = z.infer; /** @@ -45,7 +45,7 @@ export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; * @property { RemarkTemplateEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const RemarkTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string().describe("Template name"), content: CommonModels.EditorContentResponseDtoSchema.describe("Template content"), onlyUsedFor: z.array(OnlyUsedForEnumSchema).readonly().describe("Restrict template usage to specific document types").nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const RemarkTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), content: CommonModels.EditorContentResponseDtoSchema, onlyUsedFor: z.array(OnlyUsedForEnumSchema).nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type RemarkTemplateResponseDTO = z.infer; /** @@ -55,7 +55,7 @@ export type RemarkTemplateResponseDTO = z.infer; /** @@ -66,7 +66,7 @@ export type CreateRemarkTemplateRequestDTO = z.infer; /** @@ -76,7 +76,7 @@ export type UpdateRemarkTemplateRequestDTO = z.infer; /** @@ -84,7 +84,7 @@ export type RemarkTemplateFilterDto = z.infer; /** @@ -105,7 +105,7 @@ export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPagina * @property { number } totalItems Total available items * @property { RemarkTemplateLabelResponseDTO[] } items */ -export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).readonly() }).readonly().shape }); +export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).nullable() }).partial().shape }); export type RemarkTemplatesPaginateLabelsResponse = z.infer; /** @@ -126,7 +126,7 @@ export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEn * @property { number } totalItems Total available items * @property { RemarkTemplateResponseDTO[] } items */ -export const RemarkTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).readonly() }).readonly().shape }); +export const RemarkTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).nullable() }).partial().shape }); export type RemarkTemplatesListResponse = z.infer; } diff --git a/test/generated/next/remarkTemplates/remarkTemplates.queries.ts b/test/generated/next/remarkTemplates/remarkTemplates.queries.ts index 52f9b4a..aa1b35b 100644 --- a/test/generated/next/remarkTemplates/remarkTemplates.queries.ts +++ b/test/generated/next/remarkTemplates/remarkTemplates.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -34,14 +33,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -60,14 +59,14 @@ export const usePaginateLabels = ({ officeId, limit, order, filter, page, * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, + return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -91,14 +90,14 @@ export const usePaginateLabelsInfinite = ({ officeId, limit, order, filte * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); - return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor, config) }, + return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -117,14 +116,14 @@ export const useList = ({ officeId, limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); - return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, + return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -144,14 +143,14 @@ export const useListInfinite = ({ officeId, limit, order, filter, cursor * @returns { UseMutationResult } * @statusCodes [201, 401, 409] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, data }) => { checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId } )); - return RemarkTemplatesApi.create(officeId, data, config) + return RemarkTemplatesApi.create(officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -171,14 +170,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401, 404] */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id, officeId), queryFn: () => { checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId } )); - return RemarkTemplatesApi.findById(id, officeId, config) }, + return RemarkTemplatesApi.findById(id, officeId) }, ...options, }); }; @@ -194,14 +193,14 @@ export const useFindById = ({ id, officeId }: { id: string, officeId: str * @returns { UseMutationResult } * @statusCodes [200, 401, 404, 409] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId, data }) => { checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId } )); - return RemarkTemplatesApi.update(id, officeId, data, config) + return RemarkTemplatesApi.update(id, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -223,14 +222,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401, 404, 409] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId } )); - return RemarkTemplatesApi.archive(id, officeId, config) + return RemarkTemplatesApi.archive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -252,14 +251,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401, 404, 409] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, officeId }) => { checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId } )); - return RemarkTemplatesApi.unarchive(id, officeId, config) + return RemarkTemplatesApi.unarchive(id, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/roadQuotes/roadQuotes.api.ts b/test/generated/next/roadQuotes/roadQuotes.api.ts index eb644c0..38a1126 100644 --- a/test/generated/next/roadQuotes/roadQuotes.api.ts +++ b/test/generated/next/roadQuotes/roadQuotes.api.ts @@ -1,22 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { RoadQuotesModels } from "./roadQuotes.models"; export namespace RoadQuotesApi { -export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, quoteId: string, ) => { return AppRestClient.get( { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/road-quote`, - config + ) }; -export const update = (officeId: string, quoteId: string, data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, config?: AxiosRequestConfig) => { +export const update = (officeId: string, quoteId: string, data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, ) => { return AppRestClient.patch( { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/road-quote`, ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/roadQuotes/roadQuotes.models.ts b/test/generated/next/roadQuotes/roadQuotes.models.ts index e5ae99e..9008738 100644 --- a/test/generated/next/roadQuotes/roadQuotes.models.ts +++ b/test/generated/next/roadQuotes/roadQuotes.models.ts @@ -11,7 +11,7 @@ export namespace RoadQuotesModels { * @property { string } buyServiceContract Service contract for buying * @property { string } sellServiceContract Service contract for selling */ -export const RoadQuoteResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the road quote"), bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling") }).readonly(); +export const RoadQuoteResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string(), sellServiceContract: z.string() }); export type RoadQuoteResponseDTO = z.infer; /** @@ -23,7 +23,7 @@ export type RoadQuoteResponseDTO = z.infer; * @property { string } buyServiceContract Service contract for buying * @property { string } sellServiceContract Service contract for selling */ -export const UpdateRoadQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling") }).readonly(); +export const UpdateRoadQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), sellServiceContract: z.string().nullable() }).partial(); export type UpdateRoadQuoteRequestDTO = z.infer; } diff --git a/test/generated/next/roadQuotes/roadQuotes.queries.ts b/test/generated/next/roadQuotes/roadQuotes.queries.ts index 2740233..b7d125e 100644 --- a/test/generated/next/roadQuotes/roadQuotes.queries.ts +++ b/test/generated/next/roadQuotes/roadQuotes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(officeId, quoteId), queryFn: () => { checkAcl(RoadQuotesAcl.canUseGet({ officeId } )); - return RoadQuotesApi.get(officeId, quoteId, config) }, + return RoadQuotesApi.get(officeId, quoteId) }, ...options, }); }; @@ -49,14 +48,14 @@ export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(RoadQuotesAcl.canUseUpdate({ officeId } )); - return RoadQuotesApi.update(officeId, quoteId, data, config) + return RoadQuotesApi.update(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/seaPositions/seaPositions.api.ts b/test/generated/next/seaPositions/seaPositions.api.ts index c617cd0..022e8b7 100644 --- a/test/generated/next/seaPositions/seaPositions.api.ts +++ b/test/generated/next/seaPositions/seaPositions.api.ts @@ -1,22 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { SeaPositionsModels } from "./seaPositions.models"; export namespace SeaPositionsApi { -export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, positionId: string, ) => { return AppRestClient.get( { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/sea-position`, - config + ) }; -export const update = (officeId: string, positionId: string, data: SeaPositionsModels.UpdateSeaPositionRequestDTO, config?: AxiosRequestConfig) => { +export const update = (officeId: string, positionId: string, data: SeaPositionsModels.UpdateSeaPositionRequestDTO, ) => { return AppRestClient.patch( { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/sea-position`, ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/seaPositions/seaPositions.models.ts b/test/generated/next/seaPositions/seaPositions.models.ts index 80dd1d9..90db05a 100644 --- a/test/generated/next/seaPositions/seaPositions.models.ts +++ b/test/generated/next/seaPositions/seaPositions.models.ts @@ -23,7 +23,7 @@ export namespace SeaPositionsModels { * @property { CommonModels.SeaRoutingEnum } routing * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route */ -export const SeaPositionResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterBillOfLadingNumber: z.string().nullish(), hblRequired: z.boolean(), mblRequired: z.boolean(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), buyServiceContract: z.string().nullish(), sellServiceContract: z.string().nullish(), quoteReference: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), routing: CommonModels.SeaRoutingEnumSchema.nullish(), defaultBookingNumber: z.string().describe("Default booking number from the port of loading point of the default route").nullish() }).readonly(); +export const SeaPositionResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterBillOfLadingNumber: z.string().nullish(), hblRequired: z.boolean(), mblRequired: z.boolean(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), buyServiceContract: z.string().nullish(), sellServiceContract: z.string().nullish(), quoteReference: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), routing: CommonModels.SeaRoutingEnumSchema.nullish(), defaultBookingNumber: z.string().nullish() }); export type SeaPositionResponseDTO = z.infer; /** @@ -43,7 +43,7 @@ export type SeaPositionResponseDTO = z.infer; } diff --git a/test/generated/next/seaPositions/seaPositions.queries.ts b/test/generated/next/seaPositions/seaPositions.queries.ts index 97e123e..3652d69 100644 --- a/test/generated/next/seaPositions/seaPositions.queries.ts +++ b/test/generated/next/seaPositions/seaPositions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(officeId, positionId), queryFn: () => { checkAcl(SeaPositionsAcl.canUseGet({ officeId } )); - return SeaPositionsApi.get(officeId, positionId, config) }, + return SeaPositionsApi.get(officeId, positionId) }, ...options, }); }; @@ -49,14 +48,14 @@ export const useGet = ({ officeId, positionId }: { officeId: string, posi * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, data }) => { checkAcl(SeaPositionsAcl.canUseUpdate({ officeId } )); - return SeaPositionsApi.update(officeId, positionId, data, config) + return SeaPositionsApi.update(officeId, positionId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/seaQuotes/seaQuotes.api.ts b/test/generated/next/seaQuotes/seaQuotes.api.ts index f3ee817..6b3d574 100644 --- a/test/generated/next/seaQuotes/seaQuotes.api.ts +++ b/test/generated/next/seaQuotes/seaQuotes.api.ts @@ -1,22 +1,21 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { ZodExtended } from "@/data/zod.extended"; import { SeaQuotesModels } from "./seaQuotes.models"; export namespace SeaQuotesApi { -export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, quoteId: string, ) => { return AppRestClient.get( { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - config + ) }; -export const update = (officeId: string, quoteId: string, data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, config?: AxiosRequestConfig) => { +export const update = (officeId: string, quoteId: string, data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, ) => { return AppRestClient.patch( { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, `/offices/${officeId}/quotes/${quoteId}/sea-quote`, ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), - config + ) }; } diff --git a/test/generated/next/seaQuotes/seaQuotes.models.ts b/test/generated/next/seaQuotes/seaQuotes.models.ts index f03b400..2617ee7 100644 --- a/test/generated/next/seaQuotes/seaQuotes.models.ts +++ b/test/generated/next/seaQuotes/seaQuotes.models.ts @@ -14,7 +14,7 @@ export namespace SeaQuotesModels { * @property { CommonModels.SeaRoutingEnum } routing * @property { boolean } splitRoute Indicates if the route is split */ -export const SeaQuoteResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the sea quote"), bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling"), routing: CommonModels.SeaRoutingEnumSchema.nullish(), splitRoute: z.boolean().describe("Indicates if the route is split").nullish() }).readonly(); +export const SeaQuoteResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string(), sellServiceContract: z.string(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), splitRoute: z.boolean().nullish() }); export type SeaQuoteResponseDTO = z.infer; /** @@ -27,7 +27,7 @@ export type SeaQuoteResponseDTO = z.infer; * @property { string } sellServiceContract Service contract for selling * @property { CommonModels.SeaRoutingEnum } routing */ -export const UpdateSeaQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling"), routing: CommonModels.SeaRoutingEnumSchema }).readonly(); +export const UpdateSeaQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), sellServiceContract: z.string().nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable() }).partial(); export type UpdateSeaQuoteRequestDTO = z.infer; } diff --git a/test/generated/next/seaQuotes/seaQuotes.queries.ts b/test/generated/next/seaQuotes/seaQuotes.queries.ts index 5949292..0efd079 100644 --- a/test/generated/next/seaQuotes/seaQuotes.queries.ts +++ b/test/generated/next/seaQuotes/seaQuotes.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -26,14 +25,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(officeId, quoteId), queryFn: () => { checkAcl(SeaQuotesAcl.canUseGet({ officeId } )); - return SeaQuotesApi.get(officeId, quoteId, config) }, + return SeaQuotesApi.get(officeId, quoteId) }, ...options, }); }; @@ -49,14 +48,14 @@ export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, quoteId, data }) => { checkAcl(SeaQuotesAcl.canUseUpdate({ officeId } )); - return SeaQuotesApi.update(officeId, quoteId, data, config) + return SeaQuotesApi.update(officeId, quoteId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/shippingInstructions/shippingInstructions.api.ts b/test/generated/next/shippingInstructions/shippingInstructions.api.ts index e535ba2..e435f26 100644 --- a/test/generated/next/shippingInstructions/shippingInstructions.api.ts +++ b/test/generated/next/shippingInstructions/shippingInstructions.api.ts @@ -1,48 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { ShippingInstructionsModels } from "./shippingInstructions.models"; import { CommonModels } from "@/data/common/common.models"; export namespace ShippingInstructionsApi { -export const create = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { +export const create = (officeId: string, positionId: string, ) => { return AppRestClient.post( { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/shipping-instructions`, - undefined, - config + ) }; -export const get = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { +export const get = (officeId: string, positionId: string, id: string, ) => { return AppRestClient.get( { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - config + ) }; -export const update = (officeId: string, positionId: string, id: string, data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, config?: AxiosRequestConfig) => { +export const update = (officeId: string, positionId: string, id: string, data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, ) => { return AppRestClient.patch( { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), - config + ) }; -export const deleteOfficesPositionsShippingInstructionsById = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { +export const deleteOfficesPositionsShippingInstructionsById = (officeId: string, positionId: string, id: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - undefined, - config + ) }; -export const preview = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { +export const preview = (officeId: string, positionId: string, id: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -51,12 +47,12 @@ export const preview = (officeId: string, positionId: string, id: string, config } ) }; -export const generate = (officeId: string, positionId: string, id: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generate = (officeId: string, positionId: string, id: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/shippingInstructions/shippingInstructions.models.ts b/test/generated/next/shippingInstructions/shippingInstructions.models.ts index 7f8248c..b15692a 100644 --- a/test/generated/next/shippingInstructions/shippingInstructions.models.ts +++ b/test/generated/next/shippingInstructions/shippingInstructions.models.ts @@ -44,7 +44,7 @@ export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; * @property { string } contactPhone * @property { string } contactEmail */ -export const ShippingInstructionsPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), addressLine1: z.string(), addressLine2: z.string(), city: z.string(), postalCode: z.string(), state: z.string(), countryCode: z.string(), contactName: z.string(), contactPhone: z.string(), contactEmail: z.string() }).readonly(); +export const ShippingInstructionsPartnerResponseDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), addressLine1: z.string().nullable(), addressLine2: z.string().nullable(), city: z.string().nullable(), postalCode: z.string().nullable(), state: z.string().nullable(), countryCode: z.string().nullable(), contactName: z.string().nullable(), contactPhone: z.string().nullable(), contactEmail: z.string().nullable() }).partial(); export type ShippingInstructionsPartnerResponseDto = z.infer; /** @@ -62,7 +62,7 @@ export type ShippingInstructionsPartnerResponseDto = z.infer; /** @@ -76,7 +76,7 @@ export type ShippingInstructionsGeneralDetailsDto = z.infer; /** @@ -100,7 +100,7 @@ export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; * @property { SIMoveTypeEnum } moveType * @property { string } shipmentType */ -export const ShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string(), voyage: z.string(), imo: z.string(), placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema, portOfLoading: ShippingInstructionsLocationResponseDtoSchema, portOfDischarge: ShippingInstructionsLocationResponseDtoSchema, placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema, moveType: SIMoveTypeEnumSchema, shipmentType: z.string() }).readonly(); +export const ShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string().nullable(), voyage: z.string().nullable(), imo: z.string().nullable(), placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema.nullable(), portOfLoading: ShippingInstructionsLocationResponseDtoSchema.nullable(), portOfDischarge: ShippingInstructionsLocationResponseDtoSchema.nullable(), placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema.nullable(), moveType: SIMoveTypeEnumSchema.nullable(), shipmentType: z.string().nullable() }).partial(); export type ShippingInstructionsTransportDto = z.infer; /** @@ -110,7 +110,7 @@ export type ShippingInstructionsTransportDto = z.infer; /** @@ -129,7 +129,7 @@ export type ShippingInstructionsHazardousDto = z.infer; /** @@ -148,7 +148,7 @@ export type ShippingInstructionsPackageResponseDto = z.infer; /** @@ -161,7 +161,7 @@ export type ShippingInstructionsCargoResponseDto = z.infer; /** @@ -182,7 +182,7 @@ export type ShippingInstructionsHeaderDto = z.infer; /** @@ -195,7 +195,7 @@ export type ShippingInstructionsReferencesDto = z.infer; /** @@ -205,7 +205,7 @@ export type ShippingInstructionsCustomsComplianceDto = z.infer; /** @@ -215,7 +215,7 @@ export type ShippingInstructionsIcs2Dto = z.infer; /** @@ -226,7 +226,7 @@ export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer; /** @@ -235,7 +235,7 @@ export type ShippingInstructionsControlTotalsDto = z.infer; /** @@ -244,7 +244,7 @@ export type FreightChargesDto = z.infer; * @property { string } currency * @property { number } shipperDeclaredValue */ -export const ShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string(), shipperDeclaredValue: z.number() }).readonly(); +export const ShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string().nullable(), shipperDeclaredValue: z.number().nullable() }).partial(); export type ShippingInstructionsShippersDeclaredValueDto = z.infer; /** @@ -252,7 +252,7 @@ export type ShippingInstructionsShippersDeclaredValueDto = z.infer; /** @@ -280,7 +280,7 @@ export type ShippingInstructionsNotificationEmailsDto = z.infer; /** @@ -299,7 +299,7 @@ export type ShippingInstructionsResponseDto = z.infer; /** @@ -317,7 +317,7 @@ export type UpdateShippingInstructionsPartnerDto = z.infer; /** @@ -328,7 +328,7 @@ export type UpdateShippingInstructionsGeneralDetailsDto = z.infer; /** @@ -344,7 +344,7 @@ export type UpdateShippingInstructionsLocationDto = z.infer; /** @@ -354,7 +354,7 @@ export type UpdateShippingInstructionsTransportDto = z.infer; /** @@ -373,7 +373,7 @@ export type UpdateShippingInstructionsHazardousDto = z.infer; /** @@ -392,7 +392,7 @@ export type UpdateShippingInstructionsPackageDto = z.infer; /** @@ -405,7 +405,7 @@ export type UpdateShippingInstructionsCargoDto = z.infer; /** @@ -426,7 +426,7 @@ export type UpdateShippingInstructionsHeaderDto = z.infer; /** @@ -439,7 +439,7 @@ export type UpdateShippingInstructionsReferencesDto = z.infer; /** @@ -449,7 +449,7 @@ export type UpdateShippingInstructionsCustomsComplianceDto = z.infer; /** @@ -459,7 +459,7 @@ export type UpdateShippingInstructionsIcs2Dto = z.infer; /** @@ -468,7 +468,7 @@ export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer; /** @@ -477,7 +477,7 @@ export type UpdateFreightChargesDto = z.infer; /** @@ -485,7 +485,7 @@ export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer; /** @@ -504,7 +504,7 @@ export type UpdateShippingInstructionsNotificationEmailsDto = z.infer; } diff --git a/test/generated/next/shippingInstructions/shippingInstructions.queries.ts b/test/generated/next/shippingInstructions/shippingInstructions.queries.ts index a3a9034..4514025 100644 --- a/test/generated/next/shippingInstructions/shippingInstructions.queries.ts +++ b/test/generated/next/shippingInstructions/shippingInstructions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId }) => { checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId } )); - return ShippingInstructionsApi.create(officeId, positionId, config) + return ShippingInstructionsApi.create(officeId, positionId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -56,14 +55,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGet = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.get(officeId, positionId, id), queryFn: () => { checkAcl(ShippingInstructionsAcl.canUseGet({ officeId } )); - return ShippingInstructionsApi.get(officeId, positionId, id, config) }, + return ShippingInstructionsApi.get(officeId, positionId, id) }, ...options, }); }; @@ -80,14 +79,14 @@ export const useGet = ({ officeId, positionId, id }: { officeId: string, * @returns { UseMutationResult } Shipping instructions updated successfully * @statusCodes [200, 401, 404] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, id, data }) => { checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId } )); - return ShippingInstructionsApi.update(officeId, positionId, id, data, config) + return ShippingInstructionsApi.update(officeId, positionId, id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -110,14 +109,14 @@ export const useUpdate = (options?: AppMutationOptions } Shipping instructions deleted * @statusCodes [204, 401, 404] */ -export const useDeleteOfficesPositionsShippingInstructionsById = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteOfficesPositionsShippingInstructionsById = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, id }) => { checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId } )); - return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id, config) + return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -138,14 +137,14 @@ export const useDeleteOfficesPositionsShippingInstructionsById = (options?: AppM * @returns { UseQueryResult> } * @statusCodes [200, 401] */ -export const usePreview = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreview = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.preview(officeId, positionId, id), queryFn: () => { checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); - return ShippingInstructionsApi.preview(officeId, positionId, id, config) }, + return ShippingInstructionsApi.preview(officeId, positionId, id) }, ...options, }); }; @@ -161,14 +160,14 @@ export const usePreview = ({ officeId, positionId, id }: { officeId: stri * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, id }) => { checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); - return ShippingInstructionsApi.preview(officeId, positionId, id, config) + return ShippingInstructionsApi.preview(officeId, positionId, id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,14 +191,14 @@ export const usePreviewMutation = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, id, data }) => { checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId } )); - return ShippingInstructionsApi.generate(officeId, positionId, id, data, config) + return ShippingInstructionsApi.generate(officeId, positionId, id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/terminals/terminals.api.ts b/test/generated/next/terminals/terminals.api.ts index 31b5d76..4e021f0 100644 --- a/test/generated/next/terminals/terminals.api.ts +++ b/test/generated/next/terminals/terminals.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { TerminalsModels } from "./terminals.models"; export namespace TerminalsApi { -export const create = (data: TerminalsModels.CreateTerminalRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: TerminalsModels.CreateTerminalRequestDTO, ) => { return AppRestClient.post( { resSchema: TerminalsModels.TerminalResponseDTOSchema }, `/terminals`, ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), - config + ) }; -export const paginate = (limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, `/terminals`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginateLabels = (limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, `/terminals/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const getById = (id: string, config?: AxiosRequestConfig) => { +export const getById = (id: string, ) => { return AppRestClient.get( { resSchema: TerminalsModels.TerminalResponseDTOSchema }, `/terminals/${id}`, - config + ) }; -export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, ) => { return AppRestClient.patch( { resSchema: TerminalsModels.TerminalResponseDTOSchema }, `/terminals/${id}`, ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/terminals/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/terminals/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/terminals/terminals.models.ts b/test/generated/next/terminals/terminals.models.ts index a543664..2ee003e 100644 --- a/test/generated/next/terminals/terminals.models.ts +++ b/test/generated/next/terminals/terminals.models.ts @@ -27,7 +27,7 @@ export const TerminalType = TerminalTypeSchema.enum; * @property { string } countryId Country id * @property { string } additionalInformation Additional information */ -export const CreateTerminalRequestDTOSchema = z.object({ matchCode: z.string().describe("Unique identifier code for the terminal"), shortName: z.string().describe("Optional short name for the terminal").nullish(), name: z.string().describe("Full name of the terminal"), type: TerminalTypeSchema.describe("Type of the terminal"), portId: z.string().describe("ID of associated port, required if type is port").nullish(), airportId: z.string().describe("ID of associated airport, required if type is airport").nullish(), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street").nullish(), zip: z.string().describe("ZIP / Postal code"), district: z.string().describe("District").nullish(), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), additionalInformation: z.string().describe("Additional information").nullish() }).readonly(); +export const CreateTerminalRequestDTOSchema = z.object({ matchCode: z.string(), shortName: z.string().nullish(), name: z.string(), type: TerminalTypeSchema, portId: z.string().nullish(), airportId: z.string().nullish(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), district: z.string().nullish(), cityId: z.string(), countryId: z.string(), additionalInformation: z.string().nullish() }); export type CreateTerminalRequestDTO = z.infer; /** @@ -36,7 +36,7 @@ export type CreateTerminalRequestDTO = z.infer; /** @@ -47,7 +47,7 @@ export type TerminalCityDto = z.infer; * @property { string } isoCode2 * @property { string } isoCode3 */ -export const TerminalCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export const TerminalCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); export type TerminalCountryDto = z.infer; /** @@ -60,7 +60,7 @@ export type TerminalCountryDto = z.infer; * @property { string } district District name * @property { TerminalCountryDto } country */ -export const TerminalAddressDTOSchema = z.object({ street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street").nullish(), zip: z.string().describe("ZIP/Postal code"), city: TerminalCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: TerminalCountryDtoSchema.nullish() }).readonly(); +export const TerminalAddressDTOSchema = z.object({ street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), city: TerminalCityDtoSchema.nullish(), district: z.string().nullish(), country: TerminalCountryDtoSchema.nullish() }); export type TerminalAddressDTO = z.infer; /** @@ -69,7 +69,7 @@ export type TerminalAddressDTO = z.infer; * @property { string } id Unique identifier of the airport * @property { string } name Name of the airport */ -export const AirportReferenceDTOSchema = z.object({ id: z.string().describe("Unique identifier of the airport"), name: z.string().describe("Name of the airport") }).readonly(); +export const AirportReferenceDTOSchema = z.object({ id: z.string(), name: z.string() }); export type AirportReferenceDTO = z.infer; /** @@ -78,7 +78,7 @@ export type AirportReferenceDTO = z.infer; * @property { string } id Unique identifier of the port * @property { string } name Name of the port */ -export const PortReferenceDTOSchema = z.object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port") }).readonly(); +export const PortReferenceDTOSchema = z.object({ id: z.string(), name: z.string() }); export type PortReferenceDTO = z.infer; /** @@ -87,7 +87,7 @@ export type PortReferenceDTO = z.infer; * @property { string } id * @property { string } name */ -export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type TerminalEmployeeDTO = z.infer; /** @@ -110,7 +110,7 @@ export type TerminalEmployeeDTO = z.infer; * @property { TerminalEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const TerminalResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the terminal"), matchCode: z.string().describe("Match code for the terminal"), name: z.string().describe("Name of the terminal"), type: TerminalTypeSchema.describe("Type of the terminal").nullish(), airport: AirportReferenceDTOSchema.describe("Associated airport information if terminal type is airport").nullish(), port: PortReferenceDTOSchema.describe("Associated port information if terminal type is port").nullish(), archived: z.boolean().describe("Archived status of the terminal"), shortName: z.string().describe("Short name of the terminal").nullish(), address: TerminalAddressDTOSchema.describe("Address of the terminal").nullish(), additionalInformation: z.string().describe("Additional information").nullish(), createdById: z.string().nullish(), createdBy: TerminalEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: TerminalEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const TerminalResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string(), type: TerminalTypeSchema.nullish(), airport: AirportReferenceDTOSchema.nullish(), port: PortReferenceDTOSchema.nullish(), archived: z.boolean(), shortName: z.string().nullish(), address: TerminalAddressDTOSchema.nullish(), additionalInformation: z.string().nullish(), createdById: z.string().nullish(), createdBy: TerminalEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: TerminalEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type TerminalResponseDTO = z.infer; /** @@ -130,7 +130,7 @@ export type TerminalResponseDTO = z.infer; * @property { string } countryId Country id * @property { string } additionalInformation Additional information */ -export const UpdateTerminalRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code for the terminal"), shortName: z.string().describe("Updated short name"), name: z.string().describe("Updated name"), type: TerminalTypeSchema.describe("Type of the terminal"), portId: z.string().describe("ID of associated port, required if type is port"), airportId: z.string().describe("ID of associated airport, required if type is airport"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street"), zip: z.string().describe("ZIP / Postal code"), district: z.string().describe("District"), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), additionalInformation: z.string().describe("Additional information") }).readonly(); +export const UpdateTerminalRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), name: z.string().nullable(), type: TerminalTypeSchema.nullable(), portId: z.string().nullable(), airportId: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), district: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), additionalInformation: z.string().nullable() }).partial(); export type UpdateTerminalRequestDTO = z.infer; /** @@ -140,7 +140,7 @@ export type UpdateTerminalRequestDTO = z.infer; /** @@ -148,7 +148,7 @@ export type TerminalPaginationFilterDto = z.infer; /** @@ -169,7 +169,7 @@ export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSc * @property { number } totalItems Total available items * @property { TerminalResponseDTO[] } items */ -export const TerminalsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(TerminalResponseDTOSchema).readonly() }).readonly().shape }); +export const TerminalsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(TerminalResponseDTOSchema).nullable() }).partial().shape }); export type TerminalsPaginateResponse = z.infer; /** @@ -190,7 +190,7 @@ export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrde * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const TerminalsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const TerminalsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type TerminalsPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/terminals/terminals.queries.ts b/test/generated/next/terminals/terminals.queries.ts index bec7227..b752c33 100644 --- a/test/generated/next/terminals/terminals.queries.ts +++ b/test/generated/next/terminals/terminals.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -29,14 +28,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(TerminalsAcl.canUseCreate()); - return TerminalsApi.create(data, config) + return TerminalsApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -59,14 +58,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, page, cursor, config) }, + return TerminalsApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -84,14 +83,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return TerminalsApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -114,14 +113,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return TerminalsApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -139,14 +138,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -165,14 +164,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGetById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getById(id), queryFn: () => { checkAcl(TerminalsAcl.canUseGetById()); - return TerminalsApi.getById(id, config) }, + return TerminalsApi.getById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useGetById = ({ id }: { id: string }, options?: AppQueryOpti * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(TerminalsAcl.canUseUpdate()); - return TerminalsApi.update(id, data, config) + return TerminalsApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(TerminalsAcl.canUseArchive()); - return TerminalsApi.archive(id, config) + return TerminalsApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -241,14 +240,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(TerminalsAcl.canUseUnarchive()); - return TerminalsApi.unarchive(id, config) + return TerminalsApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/userActivity/userActivity.api.ts b/test/generated/next/userActivity/userActivity.api.ts index affc18b..e1a978e 100644 --- a/test/generated/next/userActivity/userActivity.api.ts +++ b/test/generated/next/userActivity/userActivity.api.ts @@ -1,18 +1,16 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { UserActivityModels } from "./userActivity.models"; export namespace UserActivityApi { -export const get = (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number, config?: AxiosRequestConfig) => { +export const get = (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number, ) => { return AppRestClient.get( { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, `/offices/${officeId}/${entityType}/${entityId}/activity`, { - ...config, params: { - activeThresholdMinutes: ZodExtended.parse(z.number().gte(1).describe("Active threshold in minutes").nullish(), activeThresholdMinutes, { type: "query", name: "activeThresholdMinutes" }), + activeThresholdMinutes: ZodExtended.parse(z.number().gte(1).nullish(), activeThresholdMinutes, { type: "query", name: "activeThresholdMinutes" }), }, } ) diff --git a/test/generated/next/userActivity/userActivity.models.ts b/test/generated/next/userActivity/userActivity.models.ts index 5a79039..dfe9552 100644 --- a/test/generated/next/userActivity/userActivity.models.ts +++ b/test/generated/next/userActivity/userActivity.models.ts @@ -16,7 +16,7 @@ export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; * @property { ActivityTypeEnum } activityType Type of activity * @property { string } lastSeen Last seen timestamp */ -export const UserSectionActivityDtoSchema = z.object({ section: z.string().describe("Section name"), activityType: ActivityTypeEnumSchema.describe("Type of activity"), lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp") }).readonly(); +export const UserSectionActivityDtoSchema = z.object({ section: z.string(), activityType: ActivityTypeEnumSchema, lastSeen: z.iso.datetime({ offset: true }) }); export type UserSectionActivityDto = z.infer; /** @@ -30,7 +30,7 @@ export type UserSectionActivityDto = z.infer; /** @@ -49,7 +49,7 @@ export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; * @property { ActivityEntityTypeEnum } entityType Entity type * @property { number } activeThresholdMinutes Active threshold in minutes */ -export const ActivityMetadataDtoSchema = z.object({ totalActiveUsers: z.number().describe("Total number of active users"), entityId: z.string().describe("Entity ID"), entityType: ActivityEntityTypeEnumSchema.describe("Entity type"), activeThresholdMinutes: z.number().describe("Active threshold in minutes") }).readonly(); +export const ActivityMetadataDtoSchema = z.object({ totalActiveUsers: z.number(), entityId: z.string(), entityType: ActivityEntityTypeEnumSchema, activeThresholdMinutes: z.number() }); export type ActivityMetadataDto = z.infer; /** @@ -58,7 +58,7 @@ export type ActivityMetadataDto = z.infer; * @property { ActiveUserDto[] } activeUsers List of active users * @property { ActivityMetadataDto } metadata Activity metadata */ -export const UserActivityResponseDtoSchema = z.object({ activeUsers: z.array(ActiveUserDtoSchema).readonly().describe("List of active users"), metadata: ActivityMetadataDtoSchema.describe("Activity metadata") }).readonly(); +export const UserActivityResponseDtoSchema = z.object({ activeUsers: z.array(ActiveUserDtoSchema), metadata: ActivityMetadataDtoSchema }); export type UserActivityResponseDto = z.infer; } diff --git a/test/generated/next/userActivity/userActivity.queries.ts b/test/generated/next/userActivity/userActivity.queries.ts index 4e54389..b9e1bad 100644 --- a/test/generated/next/userActivity/userActivity.queries.ts +++ b/test/generated/next/userActivity/userActivity.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { AppQueryOptions } from "@povio/openapi-codegen-cli"; @@ -23,12 +22,12 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useGet = ({ officeId, entityType, entityId, activeThresholdMinutes }: { officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGet = ({ officeId, entityType, entityId, activeThresholdMinutes }: { officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number }, options?: AppQueryOptions) => { return useQuery({ queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), queryFn: () => - UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes, config), + UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes), ...options, }); }; diff --git a/test/generated/next/vatRules/vatRules.api.ts b/test/generated/next/vatRules/vatRules.api.ts index 4280101..ce19db0 100644 --- a/test/generated/next/vatRules/vatRules.api.ts +++ b/test/generated/next/vatRules/vatRules.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { VatRulesModels } from "./vatRules.models"; export namespace VatRulesApi { -export const paginateLabels = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, `/vat-rules/labels/paginate`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const list = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: VatRulesModels.VatRulesListResponseSchema }, `/vat-rules`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, ) => { return AppRestClient.post( { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, `/vat-rules`, ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), - config + ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, `/vat-rules/${id}`, - config + ) }; -export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, ) => { return AppRestClient.patch( { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, `/vat-rules/${id}`, ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.post( { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, `/vat-rules/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.post( { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, `/vat-rules/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/vatRules/vatRules.models.ts b/test/generated/next/vatRules/vatRules.models.ts index 6b65ef4..f9ef2d5 100644 --- a/test/generated/next/vatRules/vatRules.models.ts +++ b/test/generated/next/vatRules/vatRules.models.ts @@ -20,7 +20,7 @@ export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; * @property { boolean } archived Filter by archived status * @property { string } search Search to filter by */ -export const VatRuleFilterDtoSchema = z.object({ matchcode: z.string().describe("Matchcode to filter by"), name: z.string().describe("Name to filter by"), type: VatRuleTypeEnumSchema, officeId: z.string().describe("Office ID to filter by"), archived: z.boolean().describe("Filter by archived status"), search: z.string().describe("Search to filter by") }).readonly(); +export const VatRuleFilterDtoSchema = z.object({ matchcode: z.string().nullable(), name: z.string().nullable(), type: VatRuleTypeEnumSchema.nullable(), officeId: z.string().nullable(), archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); export type VatRuleFilterDto = z.infer; /** @@ -29,7 +29,7 @@ export type VatRuleFilterDto = z.infer; * @property { string } id * @property { string } name */ -export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type VatRuleEmployeeDTO = z.infer; /** @@ -38,7 +38,7 @@ export type VatRuleEmployeeDTO = z.infer; * @property { string } id * @property { string } name */ -export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type VatRuleOfficeDTO = z.infer; /** @@ -64,7 +64,7 @@ export type VatRuleOfficeDTO = z.infer; * @property { string } bookkeepingId * @property { string } bookkeepingTargetAccountNumber */ -export const VatRuleResponseDTOSchema = z.object({ id: z.string(), matchcode: z.string(), name: z.string(), vatPercentage: z.number(), vatNumber: z.number().describe("VAT rule reference number").nullish(), noTax: z.boolean().nullish(), type: VatRuleTypeEnumSchema, archived: z.boolean(), isReverseCharge: z.boolean(), createdById: z.string().nullish(), createdBy: VatRuleEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: VatRuleEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), officeId: z.string(), office: VatRuleOfficeDTOSchema.nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }).readonly(); +export const VatRuleResponseDTOSchema = z.object({ id: z.string(), matchcode: z.string(), name: z.string(), vatPercentage: z.number(), vatNumber: z.number().nullish(), noTax: z.boolean().nullish(), type: VatRuleTypeEnumSchema, archived: z.boolean(), isReverseCharge: z.boolean(), createdById: z.string().nullish(), createdBy: VatRuleEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: VatRuleEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), officeId: z.string(), office: VatRuleOfficeDTOSchema.nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }); export type VatRuleResponseDTO = z.infer; /** @@ -81,7 +81,7 @@ export type VatRuleResponseDTO = z.infer; * @property { string } bookkeepingId Bookkeeping ID * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number */ -export const CreateVatRuleRequestDTOSchema = z.object({ matchcode: z.string().describe("Unique matchcode for the VAT rule"), name: z.string().describe("Name of the VAT rule"), noTax: z.boolean().nullish(), vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), vatNumber: z.number().describe("VAT rule reference number").nullish(), type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), officeId: z.string().describe("Office ID"), isReverseCharge: z.boolean().describe("Is reverse charge VAT rule").nullish(), bookkeepingId: z.string().describe("Bookkeeping ID").nullish(), bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullish() }).readonly(); +export const CreateVatRuleRequestDTOSchema = z.object({ matchcode: z.string(), name: z.string(), noTax: z.boolean().nullish(), vatPercentage: z.number().gte(0).lte(100), vatNumber: z.number().nullish(), type: VatRuleTypeEnumSchema, officeId: z.string(), isReverseCharge: z.boolean().nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }); export type CreateVatRuleRequestDTO = z.infer; /** @@ -98,7 +98,7 @@ export type CreateVatRuleRequestDTO = z.infer; /** @@ -119,7 +119,7 @@ export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderP * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const VatRulesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const VatRulesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type VatRulesPaginateLabelsResponse = z.infer; /** @@ -140,7 +140,7 @@ export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; * @property { number } totalItems Total available items * @property { VatRuleResponseDTO[] } items */ -export const VatRulesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(VatRuleResponseDTOSchema).readonly() }).readonly().shape }); +export const VatRulesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(VatRuleResponseDTOSchema).nullable() }).partial().shape }); export type VatRulesListResponse = z.infer; } diff --git a/test/generated/next/vatRules/vatRules.queries.ts b/test/generated/next/vatRules/vatRules.queries.ts index e0cd0f9..f582045 100644 --- a/test/generated/next/vatRules/vatRules.queries.ts +++ b/test/generated/next/vatRules/vatRules.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -33,14 +32,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return VatRulesApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -58,14 +57,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -88,14 +87,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(limit, order, filter, page, cursor), queryFn: () => { checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, page, cursor, config) }, + return VatRulesApi.list(limit, order, filter, page, cursor) }, ...options, }); }; @@ -113,14 +112,14 @@ export const useList = ({ limit, order, filter, page, cursor }: { limit: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, pageParam, cursor, config) }, + return VatRulesApi.list(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -139,14 +138,14 @@ export const useListInfinite = ({ limit, order, filter, cursor }: { limit * @returns { UseMutationResult } * @statusCodes [201, 401, 409] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(VatRulesAcl.canUseCreate()); - return VatRulesApi.create(data, config) + return VatRulesApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -165,14 +164,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401, 404] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(VatRulesAcl.canUseFindById()); - return VatRulesApi.findById(id, config) }, + return VatRulesApi.findById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseMutationResult } * @statusCodes [200, 401, 404, 409] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(VatRulesAcl.canUseUpdate()); - return VatRulesApi.update(id, data, config) + return VatRulesApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401, 404, 409] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(VatRulesAcl.canUseArchive()); - return VatRulesApi.archive(id, config) + return VatRulesApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -243,14 +242,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401, 404, 409] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(VatRulesAcl.canUseUnarchive()); - return VatRulesApi.unarchive(id, config) + return VatRulesApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/warehouses/warehouses.api.ts b/test/generated/next/warehouses/warehouses.api.ts index b2e2dc5..bfa128b 100644 --- a/test/generated/next/warehouses/warehouses.api.ts +++ b/test/generated/next/warehouses/warehouses.api.ts @@ -1,79 +1,74 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WarehousesModels } from "./warehouses.models"; export namespace WarehousesApi { -export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, config?: AxiosRequestConfig) => { +export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, ) => { return AppRestClient.post( { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, `/warehouses`, ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), - config + ) }; -export const paginate = (limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginate = (limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, `/warehouses`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const paginateLabels = (limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const paginateLabels = (limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, `/warehouses/paginate/labels`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (id: string, config?: AxiosRequestConfig) => { +export const findById = (id: string, ) => { return AppRestClient.get( { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, `/warehouses/${id}`, - config + ) }; -export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, config?: AxiosRequestConfig) => { +export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, ) => { return AppRestClient.patch( { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, `/warehouses/${id}`, ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), - config + ) }; -export const archive = (id: string, config?: AxiosRequestConfig) => { +export const archive = (id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/warehouses/${id}/archive`, - undefined, - config + ) }; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { +export const unarchive = (id: string, ) => { return AppRestClient.post( { resSchema: z.void() }, `/warehouses/${id}/unarchive`, - undefined, - config + ) }; } diff --git a/test/generated/next/warehouses/warehouses.models.ts b/test/generated/next/warehouses/warehouses.models.ts index 0c5b059..e60932b 100644 --- a/test/generated/next/warehouses/warehouses.models.ts +++ b/test/generated/next/warehouses/warehouses.models.ts @@ -8,7 +8,7 @@ export namespace WarehousesModels { * @property { string } id * @property { string } name */ -export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }); export type WarehouseCityDto = z.infer; /** @@ -19,7 +19,7 @@ export type WarehouseCityDto = z.infer; * @property { string } isoCode2 * @property { string } isoCode3 */ -export const WarehouseCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); +export const WarehouseCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); export type WarehouseCountryDto = z.infer; /** @@ -28,7 +28,7 @@ export type WarehouseCountryDto = z.infer; * @property { string } id * @property { string } name */ -export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); export type WarehouseEmployeeDTO = z.infer; /** @@ -53,7 +53,7 @@ export type WarehouseEmployeeDTO = z.infer; * @property { WarehouseEmployeeDTO } updatedBy * @property { string } updatedAt */ -export const WarehouseResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: WarehouseCityDtoSchema.nullish(), country: WarehouseCountryDtoSchema.nullish(), district: z.string().nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: WarehouseEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: WarehouseEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); +export const WarehouseResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: WarehouseCityDtoSchema.nullish(), country: WarehouseCountryDtoSchema.nullish(), district: z.string().nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: WarehouseEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: WarehouseEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); export type WarehouseResponseDTO = z.infer; /** @@ -70,7 +70,7 @@ export type WarehouseResponseDTO = z.infer; * @property { string } countryId * @property { string } district */ -export const CreateWarehouseRequestDTOSchema = z.object({ name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), cityId: z.string().nullish(), countryId: z.string().nullish(), district: z.string().nullish() }).readonly(); +export const CreateWarehouseRequestDTOSchema = z.object({ name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), cityId: z.string().nullish(), countryId: z.string().nullish(), district: z.string().nullish() }); export type CreateWarehouseRequestDTO = z.infer; /** @@ -78,7 +78,7 @@ export type CreateWarehouseRequestDTO = z.infer; /** @@ -87,7 +87,7 @@ export type WarehouseLabelFilterDto = z.infer; /** @@ -104,7 +104,7 @@ export type WarehouseFilterDto = z.infer; * @property { string } countryId * @property { string } district */ -export const UpdateWarehouseRequestDTOSchema = z.object({ name: z.string(), shortName: z.string(), additionalInformation: z.string(), matchCode: z.string(), street: z.string(), secondaryStreet: z.string(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string() }).readonly(); +export const UpdateWarehouseRequestDTOSchema = z.object({ name: z.string().nullable(), shortName: z.string().nullable(), additionalInformation: z.string().nullable(), matchCode: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable() }).partial(); export type UpdateWarehouseRequestDTO = z.infer; /** @@ -125,7 +125,7 @@ export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnum * @property { number } totalItems Total available items * @property { WarehouseResponseDTO[] } items */ -export const WarehousesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WarehouseResponseDTOSchema).readonly() }).readonly().shape }); +export const WarehousesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WarehouseResponseDTOSchema).nullable() }).partial().shape }); export type WarehousesPaginateResponse = z.infer; /** @@ -146,7 +146,7 @@ export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOr * @property { number } totalItems Total available items * @property { CommonModels.LabelResponseDTO[] } items */ -export const WarehousesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); +export const WarehousesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); export type WarehousesPaginateLabelsResponse = z.infer; } diff --git a/test/generated/next/warehouses/warehouses.queries.ts b/test/generated/next/warehouses/warehouses.queries.ts index 667e346..5aa2949 100644 --- a/test/generated/next/warehouses/warehouses.queries.ts +++ b/test/generated/next/warehouses/warehouses.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -29,14 +28,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ data }) => { checkAcl(WarehousesAcl.canUseCreate()); - return WarehousesApi.create(data, config) + return WarehousesApi.create(data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -59,14 +58,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginate(limit, order, filter, page, cursor), queryFn: () => { checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, page, cursor, config) }, + return WarehousesApi.paginate(limit, order, filter, page, cursor) }, ...options, }); }; @@ -84,14 +83,14 @@ export const usePaginate = ({ limit, order, filter, page, cursor }: { lim * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, pageParam, cursor, config) }, + return WarehousesApi.paginate(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -114,14 +113,14 @@ export const usePaginateInfinite = ({ limit, order, filter, cursor }: { l * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.paginateLabels(limit, order, filter, page, cursor), queryFn: () => { checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, page, cursor, config) }, + return WarehousesApi.paginateLabels(limit, order, filter, page, cursor) }, ...options, }); }; @@ -139,14 +138,14 @@ export const usePaginateLabels = ({ limit, order, filter, page, cursor }: * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, + return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -165,14 +164,14 @@ export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(id), queryFn: () => { checkAcl(WarehousesAcl.canUseFindById()); - return WarehousesApi.findById(id, config) }, + return WarehousesApi.findById(id) }, ...options, }); }; @@ -187,14 +186,14 @@ export const useFindById = ({ id }: { id: string }, options?: AppQueryOpt * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id, data }) => { checkAcl(WarehousesAcl.canUseUpdate()); - return WarehousesApi.update(id, data, config) + return WarehousesApi.update(id, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -215,14 +214,14 @@ export const useUpdate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(WarehousesAcl.canUseArchive()); - return WarehousesApi.archive(id, config) + return WarehousesApi.archive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -241,14 +240,14 @@ export const useArchive = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ id }) => { checkAcl(WarehousesAcl.canUseUnarchive()); - return WarehousesApi.unarchive(id, config) + return WarehousesApi.unarchive(id) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/workingDocuments/workingDocuments.api.ts b/test/generated/next/workingDocuments/workingDocuments.api.ts index bef7393..471babb 100644 --- a/test/generated/next/workingDocuments/workingDocuments.api.ts +++ b/test/generated/next/workingDocuments/workingDocuments.api.ts @@ -1,31 +1,29 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsModels } from "./workingDocuments.models"; export namespace WorkingDocumentsApi { -export const list = (positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { +export const list = (positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, `/offices/${officeId}/positions/${positionId}/working-documents`, { - ...config, params: { order: ZodExtended.parse(ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), + limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), + page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), + cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), }, } ) }; -export const findById = (positionId: string, id: string, officeId: string, config?: AxiosRequestConfig) => { +export const findById = (positionId: string, id: string, officeId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, - config + ) }; } diff --git a/test/generated/next/workingDocuments/workingDocuments.models.ts b/test/generated/next/workingDocuments/workingDocuments.models.ts index 1e946b4..3386fdc 100644 --- a/test/generated/next/workingDocuments/workingDocuments.models.ts +++ b/test/generated/next/workingDocuments/workingDocuments.models.ts @@ -17,7 +17,7 @@ export const TypeEnum = TypeEnumSchema.enum; * @property { string } id Employee ID * @property { string } name Employee name */ -export const WorkingDocumentCreatedByResponseDTOSchema = z.object({ id: z.string().describe("Employee ID"), name: z.string().describe("Employee name").nullable() }).readonly(); +export const WorkingDocumentCreatedByResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullable() }); export type WorkingDocumentCreatedByResponseDTO = z.infer; /** @@ -34,7 +34,7 @@ export type WorkingDocumentCreatedByResponseDTO = z.infer; /** @@ -43,7 +43,7 @@ export type WorkingDocumentResponseDTO = z.infer; /** @@ -64,7 +64,7 @@ export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParam * @property { number } totalItems Total available items * @property { WorkingDocumentResponseDTO[] } items */ -export const WorkingDocumentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).readonly() }).readonly().shape }); +export const WorkingDocumentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).nullable() }).partial().shape }); export type WorkingDocumentsListResponse = z.infer; } diff --git a/test/generated/next/workingDocuments/workingDocuments.queries.ts b/test/generated/next/workingDocuments/workingDocuments.queries.ts index a6dbf68..0642218 100644 --- a/test/generated/next/workingDocuments/workingDocuments.queries.ts +++ b/test/generated/next/workingDocuments/workingDocuments.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { useAclCheck } from "@/data/acl/useAclCheck"; @@ -32,14 +31,14 @@ export const keys = { * @returns { UseQueryResult } * @statusCodes [200, 401] */ -export const useList = ({ positionId, officeId, limit, order, filter, page, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useList = ({ positionId, officeId, limit, order, filter, page, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), queryFn: () => { checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor, config) }, + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor) }, ...options, }); }; @@ -59,14 +58,14 @@ export const useList = ({ positionId, officeId, limit, order, filter, pag * @returns { UseInfiniteQueryResult } * @statusCodes [200, 401] */ -export const useListInfinite = ({ positionId, officeId, limit, order, filter, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { +export const useListInfinite = ({ positionId, officeId, limit, order, filter, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { const { checkAcl } = useAclCheck(); return useInfiniteQuery({ queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), queryFn: ({ pageParam }) => { checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor, config) }, + return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor) }, initialPageParam: 1, getNextPageParam: ({ page, totalItems, limit: limitParam }) => { const pageParam = page ?? 1; @@ -87,14 +86,14 @@ export const useListInfinite = ({ positionId, officeId, limit, order, fil * @returns { UseQueryResult } * @statusCodes [200, 401, 404] */ -export const useFindById = ({ positionId, id, officeId }: { positionId: string, id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useFindById = ({ positionId, id, officeId }: { positionId: string, id: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.findById(positionId, id, officeId), queryFn: () => { checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId } )); - return WorkingDocumentsApi.findById(positionId, id, officeId, config) }, + return WorkingDocumentsApi.findById(positionId, id, officeId) }, ...options, }); }; diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts index aa27c95..1cd287a 100644 --- a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts +++ b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts @@ -1,48 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsAmsInstructionsApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/ams-instructions`, - undefined, - config + ) }; -export const getAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { +export const getAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - config + ) }; -export const updateAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, config?: AxiosRequestConfig) => { +export const updateAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, ) => { return AppRestClient.patch( { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), - config + ) }; -export const deleteAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - undefined, - config + ) }; -export const previewAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { +export const previewAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -51,12 +47,12 @@ export const previewAMSInstructions = (positionId: string, amsInstructionsId: st } ) }; -export const generateAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts index 75d8fd8..9f5e94c 100644 --- a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts +++ b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts @@ -8,7 +8,7 @@ export namespace WorkingDocumentsAmsInstructionsModels { * @property { string } id ID of the port * @property { string } name Name of the port */ -export const AMSInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }).readonly(); +export const AMSInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); export type AMSInstructionsDocumentPortResponseDTO = z.infer; /** @@ -17,7 +17,7 @@ export type AMSInstructionsDocumentPortResponseDTO = z.infer; /** @@ -26,7 +26,7 @@ export type AMSInstructionsDocumentCityResponseDTO = z.infer; /** @@ -36,7 +36,7 @@ export type AMSInstructionsDocumentSignedByResponseDTO = z.infer; /** @@ -51,7 +51,7 @@ export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -96,7 +96,7 @@ export type AMSInstructionsDocumentCargoDTO = z.infer; /** @@ -105,7 +105,7 @@ export type AMSInstructionsDocumentResponseDTO = z.infer; /** @@ -136,7 +136,7 @@ export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer; } diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts index aa81d88..7af1284 100644 --- a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts +++ b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId }) => { checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId, config) + return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -56,14 +55,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetAMSInstructionsData = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetAMSInstructionsData = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), queryFn: () => { checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData(positionId, amsInstructionsId, officeId, config) }, + return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData(positionId, amsInstructionsId, officeId) }, ...options, }); }; @@ -80,14 +79,14 @@ export const useGetAMSInstructionsData = ({ positionId, amsInstructionsId * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateAMSInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateAMSInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData(positionId, amsInstructionsId, officeId, data, config) + return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData(positionId, amsInstructionsId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -110,14 +109,14 @@ export const useUpdateAMSInstructionsData = (options?: AppMutationOptions } AMS Instructions document deleted * @statusCodes [204, 401, 404] */ -export const useDeleteAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, amsInstructionsId, officeId }) => { checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions(positionId, amsInstructionsId, officeId, config) + return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions(positionId, amsInstructionsId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -138,14 +137,14 @@ export const useDeleteAMSInstructions = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const usePreviewAMSInstructions = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreviewAMSInstructions = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), queryFn: () => { checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId, config) }, + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId) }, ...options, }); }; @@ -161,14 +160,14 @@ export const usePreviewAMSInstructions = ({ positionId, amsInstructionsId * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewAMSInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewAMSInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, amsInstructionsId, officeId }) => { checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId, config) + return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,14 +191,14 @@ export const usePreviewAMSInstructionsMutation = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerateAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions(positionId, amsInstructionsId, officeId, data, config) + return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions(positionId, amsInstructionsId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts index a9d7914..38303db 100644 --- a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts +++ b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts @@ -1,48 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsBlInstructionsApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/bl-instructions`, - undefined, - config + ) }; -export const getBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { +export const getBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - config + ) }; -export const updateBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, config?: AxiosRequestConfig) => { +export const updateBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, ) => { return AppRestClient.patch( { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), - config + ) }; -export const deleteBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - undefined, - config + ) }; -export const previewBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { +export const previewBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -51,21 +47,20 @@ export const previewBlInstructions = (positionId: string, blInstructionsId: stri } ) }; -export const generateBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; -export const generateDocumentEml = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateDocumentEml = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/octet-stream', }, diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts index cbf7cdd..cfea1e8 100644 --- a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts +++ b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts @@ -10,7 +10,7 @@ export namespace WorkingDocumentsBlInstructionsModels { * @property { string } location Location * @property { string } signer Siger */ -export const BlInstructionsDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), date: z.iso.datetime({ offset: true }).describe("Date"), location: z.string().describe("Location"), signer: z.string().describe("Siger") }).readonly(); +export const BlInstructionsDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), date: z.iso.datetime({ offset: true }).nullable(), location: z.string().nullable(), signer: z.string().nullable() }).partial(); export type BlInstructionsDocumentSettingsDtoDTO = z.infer; /** @@ -19,7 +19,7 @@ export type BlInstructionsDocumentSettingsDtoDTO = z.infer; /** @@ -31,7 +31,7 @@ export type BlInstructionsDocumentCountryResponseDTO = z.infer; /** @@ -40,7 +40,7 @@ export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -58,7 +58,7 @@ export const AllChargesEnum = AllChargesEnumSchema.enum; * @property { string } name Name of the port * @property { string } countryCode Country ISO2 code of the port */ -export const BlInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port"), countryCode: z.string().describe("Country ISO2 code of the port") }).readonly(); +export const BlInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), countryCode: z.string().nullable() }).partial(); export type BlInstructionsDocumentPortResponseDTO = z.infer; /** @@ -83,7 +83,7 @@ export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; * @property { string } id * @property { string } name */ -export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); +export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); export type BlInstructionsDocumentCountryDto = z.infer; /** @@ -162,7 +162,7 @@ export type BlInstructionsDocumentCountryDto = z.infer; /** @@ -175,7 +175,7 @@ export type BlInstructionsDocumentResponseDTO = z.infer; /** @@ -184,7 +184,7 @@ export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer; /** @@ -254,7 +254,7 @@ export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer; } diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts index 6131b35..fcc46e2 100644 --- a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts +++ b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId }) => { checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId } )); - return WorkingDocumentsBlInstructionsApi.create(positionId, officeId, config) + return WorkingDocumentsBlInstructionsApi.create(positionId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -56,14 +55,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetBlInstructionsData = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetBlInstructionsData = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), queryFn: () => { checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId } )); - return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId, config) }, + return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId) }, ...options, }); }; @@ -80,14 +79,14 @@ export const useGetBlInstructionsData = ({ positionId, blInstructionsId, * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateBlInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateBlInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId } )); - return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData(positionId, blInstructionsId, officeId, data, config) + return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData(positionId, blInstructionsId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -110,14 +109,14 @@ export const useUpdateBlInstructionsData = (options?: AppMutationOptions } BL Instructions document deleted * @statusCodes [204, 401, 404] */ -export const useDeleteBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, blInstructionsId, officeId }) => { checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId, config) + return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -138,14 +137,14 @@ export const useDeleteBlInstructions = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const usePreviewBlInstructions = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreviewBlInstructions = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), queryFn: () => { checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config) }, + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId) }, ...options, }); }; @@ -161,14 +160,14 @@ export const usePreviewBlInstructions = ({ positionId, blInstructionsId, * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewBlInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewBlInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, blInstructionsId, officeId }) => { checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config) + return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,14 +191,14 @@ export const usePreviewBlInstructionsMutation = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerateBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.generateBlInstructions(positionId, blInstructionsId, officeId, data, config) + return WorkingDocumentsBlInstructionsApi.generateBlInstructions(positionId, blInstructionsId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -221,14 +220,14 @@ export const useGenerateBlInstructions = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsBlInstructionsApi.generateDocumentEml(positionId, blInstructionsId, officeId, data, config) + return WorkingDocumentsBlInstructionsApi.generateDocumentEml(positionId, blInstructionsId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts index f070e6b..2dc6978 100644 --- a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts +++ b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts @@ -1,48 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsCmrFormApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cmrs`, - undefined, - config + ) }; -export const getCmrData = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { +export const getCmrData = (positionId: string, cmrId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - config + ) }; -export const updateCmrData = (positionId: string, cmrId: string, officeId: string, data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, config?: AxiosRequestConfig) => { +export const updateCmrData = (positionId: string, cmrId: string, officeId: string, data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, ) => { return AppRestClient.patch( { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), - config + ) }; -export const deleteCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteCmr = (positionId: string, cmrId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - undefined, - config + ) }; -export const previewCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { +export const previewCmr = (positionId: string, cmrId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -51,12 +47,12 @@ export const previewCmr = (positionId: string, cmrId: string, officeId: string, } ) }; -export const generateCmr = (positionId: string, cmrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateCmr = (positionId: string, cmrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts index a94b23e..c49f127 100644 --- a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts +++ b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts @@ -16,7 +16,7 @@ export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; * @property { CmrDocumentLanguage } primaryLanguage Primary language * @property { CmrDocumentLanguage } secondaryLanguage Secondary language */ -export const CmrDocumentSettingsDtoDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language") }).readonly(); +export const CmrDocumentSettingsDtoDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.nullable(), secondaryLanguage: CmrDocumentLanguageSchema.nullable() }).partial(); export type CmrDocumentSettingsDtoDTO = z.infer; /** @@ -26,7 +26,7 @@ export type CmrDocumentSettingsDtoDTO = z.infer; /** @@ -37,7 +37,7 @@ export type CmrDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -50,7 +50,7 @@ export type CmrDocumentCityResponseDTO = z.infer; /** @@ -68,7 +68,7 @@ export type CmrDocumentCostsResponseDTO = z.infer; /** @@ -108,7 +108,7 @@ export type CmrDocumentCargoResponseDTO = z.infer; /** @@ -117,7 +117,7 @@ export type CmrDocumentResponseDTO = z.infer; /** @@ -126,7 +126,7 @@ export type UpdateCmrDocumentSettingsRequestDTO = z.infer; /** @@ -136,7 +136,7 @@ export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer; /** @@ -149,7 +149,7 @@ export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; /** @@ -181,7 +181,7 @@ export type UpdateCmrDocumentCostsRequestDTO = z.infer; } diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts index 769f861..15d2a7c 100644 --- a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts +++ b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId }) => { checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsCmrFormApi.create(positionId, officeId, config) + return WorkingDocumentsCmrFormApi.create(positionId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -56,14 +55,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetCmrData = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetCmrData = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getCmrData(positionId, cmrId, officeId), queryFn: () => { checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId } )); - return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId, config) }, + return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId) }, ...options, }); }; @@ -80,14 +79,14 @@ export const useGetCmrData = ({ positionId, cmrId, officeId }: { position * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateCmrData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateCmrData = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, cmrId, officeId, data }) => { checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId } )); - return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data, config) + return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -110,14 +109,14 @@ export const useUpdateCmrData = (options?: AppMutationOptions } CMR document deleted * @statusCodes [204, 401, 404] */ -export const useDeleteCmr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteCmr = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, cmrId, officeId }) => { checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId, config) + return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -138,14 +137,14 @@ export const useDeleteCmr = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const usePreviewCmr = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreviewCmr = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.previewCmr(positionId, cmrId, officeId), queryFn: () => { checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config) }, + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId) }, ...options, }); }; @@ -161,14 +160,14 @@ export const usePreviewCmr = ({ positionId, cmrId, officeId }: { position * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewCmrMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewCmrMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, cmrId, officeId }) => { checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config) + return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,14 +191,14 @@ export const usePreviewCmrMutation = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerateCmr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateCmr = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, cmrId, officeId, data }) => { checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data, config) + return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts index 9eb1a57..2b577d4 100644 --- a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts +++ b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts @@ -1,48 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsExportDeclarationApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/export-declarations`, - undefined, - config + ) }; -export const getExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, config?: AxiosRequestConfig) => { +export const getExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - config + ) }; -export const updateExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, config?: AxiosRequestConfig) => { +export const updateExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, ) => { return AppRestClient.patch( { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), - config + ) }; -export const deleteExportDeclaration = (positionId: string, exportDeclarationId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteExportDeclaration = (positionId: string, exportDeclarationId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - undefined, - config + ) }; -export const previewExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, config?: AxiosRequestConfig) => { +export const previewExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -51,12 +47,12 @@ export const previewExportDeclaration = (officeId: string, positionId: string, e } ) }; -export const generateExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts index 1dc6ab5..4394ac8 100644 --- a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts +++ b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts @@ -9,7 +9,7 @@ export namespace WorkingDocumentsExportDeclarationModels { * @property { string } name Name of the business partner * @property { string } address Address of the business partner */ -export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -23,7 +23,7 @@ export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -34,7 +34,7 @@ export type ExportDeclarationDocumentCargoResponseDTO = z.infer; /** @@ -65,7 +65,7 @@ export type ExportDeclarationDocumentRouteResponseDTO = z.infer; /** @@ -88,7 +88,7 @@ export type ExportDeclarationDocumentResponseDTO = z.infer; } diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts index e58dbad..802056c 100644 --- a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts +++ b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId }) => { checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId } )); - return WorkingDocumentsExportDeclarationApi.create(positionId, officeId, config) + return WorkingDocumentsExportDeclarationApi.create(positionId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -56,14 +55,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetExportDeclarationData = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetExportDeclarationData = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), queryFn: () => { checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId } )); - return WorkingDocumentsExportDeclarationApi.getExportDeclarationData(officeId, positionId, exportDeclarationId, config) }, + return WorkingDocumentsExportDeclarationApi.getExportDeclarationData(officeId, positionId, exportDeclarationId) }, ...options, }); }; @@ -80,14 +79,14 @@ export const useGetExportDeclarationData = ({ officeId, positionId, expor * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateExportDeclarationData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateExportDeclarationData = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId } )); - return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData(officeId, positionId, exportDeclarationId, data, config) + return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData(officeId, positionId, exportDeclarationId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -110,14 +109,14 @@ export const useUpdateExportDeclarationData = (options?: AppMutationOptions } Export declaration document deleted * @statusCodes [204, 401, 404] */ -export const useDeleteExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, exportDeclarationId, officeId }) => { checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration(positionId, exportDeclarationId, officeId, config) + return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration(positionId, exportDeclarationId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -138,14 +137,14 @@ export const useDeleteExportDeclaration = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const usePreviewExportDeclaration = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreviewExportDeclaration = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), queryFn: () => { checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId, config) }, + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId) }, ...options, }); }; @@ -161,14 +160,14 @@ export const usePreviewExportDeclaration = ({ officeId, positionId, expor * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewExportDeclarationMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewExportDeclarationMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, exportDeclarationId }) => { checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId, config) + return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,14 +191,14 @@ export const usePreviewExportDeclarationMutation = (options?: AppMutationOptions * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useGenerateExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.generateExportDeclaration(officeId, positionId, exportDeclarationId, data, config) + return WorkingDocumentsExportDeclarationApi.generateExportDeclaration(officeId, positionId, exportDeclarationId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts index 0c25cd4..3cc1061 100644 --- a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts +++ b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts @@ -1,48 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsFcrFormApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/fcrs`, - undefined, - config + ) }; -export const getFcrData = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { +export const getFcrData = (positionId: string, fcrId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - config + ) }; -export const updateFcrData = (positionId: string, fcrId: string, officeId: string, data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, config?: AxiosRequestConfig) => { +export const updateFcrData = (positionId: string, fcrId: string, officeId: string, data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, ) => { return AppRestClient.patch( { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), - config + ) }; -export const deleteFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteFcr = (positionId: string, fcrId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - undefined, - config + ) }; -export const previewFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { +export const previewFcr = (positionId: string, fcrId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -51,12 +47,12 @@ export const previewFcr = (positionId: string, fcrId: string, officeId: string, } ) }; -export const generateFcr = (positionId: string, fcrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateFcr = (positionId: string, fcrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts index 3d3752b..4979e6e 100644 --- a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts +++ b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts @@ -9,7 +9,7 @@ export namespace WorkingDocumentsFcrFormModels { * @property { string } name Name of the business partner * @property { string } address Address of the business partner */ -export const FcrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); +export const FcrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); export type FcrDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -24,7 +24,7 @@ export type FcrDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -55,7 +55,7 @@ export type FcrDocumentCargoResponseDTO = z.infer; /** @@ -80,7 +80,7 @@ export type FcrDocumentResponseDTO = z.infer; } diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts index 1479d71..1e532d0 100644 --- a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts +++ b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId }) => { checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsFcrFormApi.create(positionId, officeId, config) + return WorkingDocumentsFcrFormApi.create(positionId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -56,14 +55,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetFcrData = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetFcrData = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getFcrData(positionId, fcrId, officeId), queryFn: () => { checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId } )); - return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId, config) }, + return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId) }, ...options, }); }; @@ -80,14 +79,14 @@ export const useGetFcrData = ({ positionId, fcrId, officeId }: { position * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateFcrData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateFcrData = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, fcrId, officeId, data }) => { checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId } )); - return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data, config) + return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -110,14 +109,14 @@ export const useUpdateFcrData = (options?: AppMutationOptions } FCR document deleted * @statusCodes [204, 401, 404] */ -export const useDeleteFcr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteFcr = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, fcrId, officeId }) => { checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId, config) + return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -138,14 +137,14 @@ export const useDeleteFcr = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const usePreviewFcr = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreviewFcr = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.previewFcr(positionId, fcrId, officeId), queryFn: () => { checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config) }, + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId) }, ...options, }); }; @@ -161,14 +160,14 @@ export const usePreviewFcr = ({ positionId, fcrId, officeId }: { position * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewFcrMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewFcrMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, fcrId, officeId }) => { checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config) + return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,14 +191,14 @@ export const usePreviewFcrMutation = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerateFcr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateFcr = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, fcrId, officeId, data }) => { checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data, config) + return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts index 319c3d3..11a3a68 100644 --- a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts +++ b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts @@ -1,48 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsHouseAwbApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/hawbs`, - undefined, - config + ) }; -export const getHouseAwbData = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { +export const getHouseAwbData = (positionId: string, hawbId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - config + ) }; -export const updateHouseAwbData = (positionId: string, hawbId: string, officeId: string, data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, config?: AxiosRequestConfig) => { +export const updateHouseAwbData = (positionId: string, hawbId: string, officeId: string, data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, ) => { return AppRestClient.patch( { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), - config + ) }; -export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - undefined, - config + ) }; -export const previewHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { +export const previewHouseAwb = (positionId: string, hawbId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -51,12 +47,12 @@ export const previewHouseAwb = (positionId: string, hawbId: string, officeId: st } ) }; -export const generateHouseAwb = (positionId: string, hawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateHouseAwb = (positionId: string, hawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts index 6428bad..505f711 100644 --- a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts +++ b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts @@ -9,7 +9,7 @@ export namespace WorkingDocumentsHouseAwbModels { * @property { number } sellRate Sell rate * @property { string } name Name */ -export const HouseAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID").nullish(), sellRate: z.number().describe("Sell rate"), name: z.string().describe("Name").nullish() }).readonly(); +export const HouseAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullish(), sellRate: z.number(), name: z.string().nullish() }); export type HouseAwbDocumentOtherChargeDTO = z.infer; /** @@ -20,7 +20,7 @@ export type HouseAwbDocumentOtherChargeDTO = z.infer; /** @@ -34,7 +34,7 @@ export type HouseAwbDocumentChargesDTO = z.infer; /** @@ -53,7 +53,7 @@ export type HouseAwbDocumentCargoDTO = z.infer; /** @@ -63,7 +63,7 @@ export type HouseAwbDocumentRouteDTO = z.infer; /** @@ -108,7 +108,7 @@ export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -117,7 +117,7 @@ export type HouseAwbDocumentResponseDTO = z.infer; /** @@ -126,7 +126,7 @@ export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer; /** @@ -135,7 +135,7 @@ export type UpdateHouseAwbDocumentChargesDTO = z.infer; /** @@ -168,7 +168,7 @@ export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer; } diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts index 8062a30..2cb6a5e 100644 --- a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts +++ b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId }) => { checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId } )); - return WorkingDocumentsHouseAwbApi.create(positionId, officeId, config) + return WorkingDocumentsHouseAwbApi.create(positionId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -56,14 +55,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetHouseAwbData = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetHouseAwbData = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), queryFn: () => { checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId } )); - return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId, config) }, + return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId) }, ...options, }); }; @@ -80,14 +79,14 @@ export const useGetHouseAwbData = ({ positionId, hawbId, officeId }: { po * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateHouseAwbData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateHouseAwbData = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, hawbId, officeId, data }) => { checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId } )); - return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data, config) + return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -110,14 +109,14 @@ export const useUpdateHouseAwbData = (options?: AppMutationOptions } House AWB document deleted * @statusCodes [204, 401, 404] */ -export const useDeleteHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, hawbId, officeId }) => { checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId, config) + return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -138,14 +137,14 @@ export const useDeleteHouseAwb = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const usePreviewHouseAwb = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreviewHouseAwb = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), queryFn: () => { checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config) }, + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId) }, ...options, }); }; @@ -161,14 +160,14 @@ export const usePreviewHouseAwb = ({ positionId, hawbId, officeId }: { po * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewHouseAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewHouseAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, hawbId, officeId }) => { checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config) + return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,14 +191,14 @@ export const usePreviewHouseAwbMutation = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerateHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, hawbId, officeId, data }) => { checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data, config) + return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts index c137af4..7f9ed62 100644 --- a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts +++ b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts @@ -1,48 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsHouseBlApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/house-bls`, - undefined, - config + ) }; -export const getHouseBlData = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { +export const getHouseBlData = (positionId: string, houseBlId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - config + ) }; -export const updateHouseBlData = (positionId: string, houseBlId: string, officeId: string, data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, config?: AxiosRequestConfig) => { +export const updateHouseBlData = (positionId: string, houseBlId: string, officeId: string, data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, ) => { return AppRestClient.patch( { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), - config + ) }; -export const deleteHouseBl = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteHouseBl = (positionId: string, houseBlId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - undefined, - config + ) }; -export const previewHouseBl = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { +export const previewHouseBl = (positionId: string, houseBlId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -51,12 +47,11 @@ export const previewHouseBl = (positionId: string, houseBlId: string, officeId: } ) }; -export const previewHouseBlEml = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { +export const previewHouseBlEml = (positionId: string, houseBlId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, { - ...config, headers: { 'Accept': 'application/octet-stream', }, @@ -65,21 +60,20 @@ export const previewHouseBlEml = (positionId: string, houseBlId: string, officeI } ) }; -export const generateHouseBl = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateHouseBl = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; -export const generateDocumentEml = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateDocumentEml = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/octet-stream', }, diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts index ad68756..cd3e571 100644 --- a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts +++ b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts @@ -14,7 +14,7 @@ export namespace WorkingDocumentsHouseBlModels { * @property { boolean } capsLock Render issuer/signer in caps lock * @property { string } documentTitle Document title */ -export const HouseBlDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), quantityOfCopies: z.number().describe("Quantity of copies"), date: z.iso.datetime({ offset: true }).describe("Date"), location: z.string().describe("Location"), signer: z.string().describe("Signer"), hideSignature: z.boolean().describe("Hide signature"), capsLock: z.boolean().describe("Render issuer/signer in caps lock"), documentTitle: z.string().describe("Document title") }).readonly(); +export const HouseBlDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), quantityOfCopies: z.number().nullable(), date: z.iso.datetime({ offset: true }).nullable(), location: z.string().nullable(), signer: z.string().nullable(), hideSignature: z.boolean().nullable(), capsLock: z.boolean().nullable(), documentTitle: z.string().nullable() }).partial(); export type HouseBlDocumentSettingsDtoDTO = z.infer; /** @@ -24,7 +24,7 @@ export type HouseBlDocumentSettingsDtoDTO = z.infer; /** @@ -33,7 +33,7 @@ export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -42,7 +42,7 @@ export type HouseBlDocumentCountryResponseDTO = z.infer; /** @@ -51,7 +51,7 @@ export type HouseBlDocumentPlaceResponseDTO = z.infer; /** @@ -60,7 +60,7 @@ export type HouseBlDocumentPortResponseDTO = z.infer; /** @@ -117,7 +117,7 @@ export type HouseBlDocumentTerminalResponseDTO = z.infer; /** @@ -134,7 +134,7 @@ export type HouseBlDocumentResponseDTO = z.infer; /** @@ -143,7 +143,7 @@ export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; /** @@ -190,7 +190,7 @@ export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer; } diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts index ea0ca6a..17f207b 100644 --- a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts +++ b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -29,14 +28,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId }) => { checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId } )); - return WorkingDocumentsHouseBlApi.create(positionId, officeId, config) + return WorkingDocumentsHouseBlApi.create(positionId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -57,14 +56,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetHouseBlData = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetHouseBlData = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), queryFn: () => { checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId } )); - return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId, config) }, + return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId) }, ...options, }); }; @@ -81,14 +80,14 @@ export const useGetHouseBlData = ({ positionId, houseBlId, officeId }: { * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateHouseBlData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateHouseBlData = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, houseBlId, officeId, data }) => { checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId } )); - return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data, config) + return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -111,14 +110,14 @@ export const useUpdateHouseBlData = (options?: AppMutationOptions } House BL document deleted * @statusCodes [204, 401, 404] */ -export const useDeleteHouseBl = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteHouseBl = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, houseBlId, officeId }) => { checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId, config) + return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -139,14 +138,14 @@ export const useDeleteHouseBl = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const usePreviewHouseBl = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreviewHouseBl = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), queryFn: () => { checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config) }, + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId) }, ...options, }); }; @@ -162,14 +161,14 @@ export const usePreviewHouseBl = ({ positionId, houseBlId, officeId }: { * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewHouseBlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewHouseBlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, houseBlId, officeId }) => { checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config) + return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,14 +191,14 @@ export const usePreviewHouseBlMutation = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const usePreviewHouseBlEml = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreviewHouseBlEml = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), queryFn: () => { checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config) }, + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId) }, ...options, }); }; @@ -215,14 +214,14 @@ export const usePreviewHouseBlEml = ({ positionId, houseBlId, officeId }: * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewHouseBlEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewHouseBlEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, houseBlId, officeId }) => { checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config) + return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -246,14 +245,14 @@ export const usePreviewHouseBlEmlMutation = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerateHouseBl = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateHouseBl = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, houseBlId, officeId, data }) => { checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data, config) + return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -275,14 +274,14 @@ export const useGenerateHouseBl = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, houseBlId, officeId, data }) => { checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data, config) + return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts index a618bc0..ca27547 100644 --- a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts +++ b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts @@ -1,48 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsIsfFormApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/isfs`, - undefined, - config + ) }; -export const getIsfData = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { +export const getIsfData = (positionId: string, isfId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - config + ) }; -export const updateIsfData = (positionId: string, isfId: string, officeId: string, data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, config?: AxiosRequestConfig) => { +export const updateIsfData = (positionId: string, isfId: string, officeId: string, data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, ) => { return AppRestClient.patch( { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), - config + ) }; -export const deleteIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteIsf = (positionId: string, isfId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - undefined, - config + ) }; -export const previewIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { +export const previewIsf = (positionId: string, isfId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -51,12 +47,12 @@ export const previewIsf = (positionId: string, isfId: string, officeId: string, } ) }; -export const generateIsf = (positionId: string, isfId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateIsf = (positionId: string, isfId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts index 7e851f1..2133bc5 100644 --- a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts +++ b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts @@ -8,7 +8,7 @@ export namespace WorkingDocumentsIsfFormModels { * @property { string } id ID of the country * @property { string } name Name of the country */ -export const IsfDocumentCargoCountryResponseDTOSchema = z.object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }).readonly(); +export const IsfDocumentCargoCountryResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); export type IsfDocumentCargoCountryResponseDTO = z.infer; /** @@ -22,7 +22,7 @@ export type IsfDocumentCargoCountryResponseDTO = z.infer; /** @@ -31,7 +31,7 @@ export type IsfDocumentCargoResponseDTO = z.infer; /** @@ -42,7 +42,7 @@ export type IsfDocumentPortResponseDTO = z.infer; /** @@ -52,7 +52,7 @@ export type IsfDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -94,7 +94,7 @@ export type IsfDocumentContainerLocationResponseDTO = z.infer; /** @@ -104,7 +104,7 @@ export type IsfDocumentResponseDTO = z.infer; /** @@ -116,7 +116,7 @@ export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer; /** @@ -148,7 +148,7 @@ export type UpdateIsfDocumentCargoRequestDTO = z.infer; } diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts index 7974d64..c190b46 100644 --- a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts +++ b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId }) => { checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsIsfFormApi.create(positionId, officeId, config) + return WorkingDocumentsIsfFormApi.create(positionId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -56,14 +55,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetIsfData = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetIsfData = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getIsfData(positionId, isfId, officeId), queryFn: () => { checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId } )); - return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId, config) }, + return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId) }, ...options, }); }; @@ -80,14 +79,14 @@ export const useGetIsfData = ({ positionId, isfId, officeId }: { position * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateIsfData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateIsfData = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, isfId, officeId, data }) => { checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId } )); - return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data, config) + return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -110,14 +109,14 @@ export const useUpdateIsfData = (options?: AppMutationOptions } ISF document deleted * @statusCodes [204, 401, 404] */ -export const useDeleteIsf = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteIsf = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, isfId, officeId }) => { checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId, config) + return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -138,14 +137,14 @@ export const useDeleteIsf = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const usePreviewIsf = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreviewIsf = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.previewIsf(positionId, isfId, officeId), queryFn: () => { checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config) }, + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId) }, ...options, }); }; @@ -161,14 +160,14 @@ export const usePreviewIsf = ({ positionId, isfId, officeId }: { position * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewIsfMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewIsfMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, isfId, officeId }) => { checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config) + return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,14 +191,14 @@ export const usePreviewIsfMutation = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerateIsf = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateIsf = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, isfId, officeId, data }) => { checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data, config) + return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts index 905a525..274642e 100644 --- a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts +++ b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts @@ -1,48 +1,44 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsMasterAwbApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, ) => { return AppRestClient.post( { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/mawbs`, - undefined, - config + ) }; -export const getMasterAwbData = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { +export const getMasterAwbData = (positionId: string, mawbId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - config + ) }; -export const updateMasterAwbData = (positionId: string, mawbId: string, officeId: string, data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, config?: AxiosRequestConfig) => { +export const updateMasterAwbData = (positionId: string, mawbId: string, officeId: string, data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, ) => { return AppRestClient.patch( { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), - config + ) }; -export const deleteMasterAwb = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteMasterAwb = (positionId: string, mawbId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - undefined, - config + ) }; -export const previewMasterAwb = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { +export const previewMasterAwb = (positionId: string, mawbId: string, officeId: string, ) => { return AppRestClient.get( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -51,12 +47,12 @@ export const previewMasterAwb = (positionId: string, mawbId: string, officeId: s } ) }; -export const generateMasterAwb = (positionId: string, mawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateMasterAwb = (positionId: string, mawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; } diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts index 4483704..02909ab 100644 --- a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts +++ b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts @@ -9,7 +9,7 @@ export namespace WorkingDocumentsMasterAwbModels { * @property { number } sellRate Sell rate * @property { string } name Name */ -export const MasterAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID").nullish(), sellRate: z.number().describe("Sell rate"), name: z.string().describe("Name").nullish() }).readonly(); +export const MasterAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullish(), sellRate: z.number(), name: z.string().nullish() }); export type MasterAwbDocumentOtherChargeDTO = z.infer; /** @@ -20,7 +20,7 @@ export type MasterAwbDocumentOtherChargeDTO = z.infer; /** @@ -34,7 +34,7 @@ export type MasterAwbDocumentChargesDTO = z.infer; /** @@ -53,7 +53,7 @@ export type MasterAwbDocumentCargoDTO = z.infer; /** @@ -63,7 +63,7 @@ export type MasterAwbDocumentRouteDTO = z.infer; /** @@ -108,7 +108,7 @@ export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer; /** @@ -117,7 +117,7 @@ export type MasterAwbDocumentResponseDTO = z.infer; /** @@ -126,7 +126,7 @@ export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer; /** @@ -135,7 +135,7 @@ export type UpdateMasterAwbDocumentChargesDTO = z.infer; /** @@ -170,7 +170,7 @@ export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer; } diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts index 89bd2fa..57207fc 100644 --- a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts +++ b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId }) => { checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId } )); - return WorkingDocumentsMasterAwbApi.create(positionId, officeId, config) + return WorkingDocumentsMasterAwbApi.create(positionId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -56,14 +55,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetMasterAwbData = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetMasterAwbData = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), queryFn: () => { checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId } )); - return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId, config) }, + return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId) }, ...options, }); }; @@ -80,14 +79,14 @@ export const useGetMasterAwbData = ({ positionId, mawbId, officeId }: { p * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateMasterAwbData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateMasterAwbData = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, mawbId, officeId, data }) => { checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId } )); - return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data, config) + return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -110,14 +109,14 @@ export const useUpdateMasterAwbData = (options?: AppMutationOptions } Master AWB document deleted * @statusCodes [204, 401, 404] */ -export const useDeleteMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, mawbId, officeId }) => { checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId, config) + return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -138,14 +137,14 @@ export const useDeleteMasterAwb = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const usePreviewMasterAwb = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const usePreviewMasterAwb = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), queryFn: () => { checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config) }, + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId) }, ...options, }); }; @@ -161,14 +160,14 @@ export const usePreviewMasterAwb = ({ positionId, mawbId, officeId }: { p * @returns { UseMutationResult> } * @statusCodes [200, 401] */ -export const usePreviewMasterAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewMasterAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, mawbId, officeId }) => { checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config) + return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -192,14 +191,14 @@ export const usePreviewMasterAwbMutation = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useGenerateMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, mawbId, officeId, data }) => { checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data, config) + return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts index 4d0042d..bcde97f 100644 --- a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts +++ b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts @@ -1,49 +1,46 @@ import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; import { z } from "zod"; import { ZodExtended } from "@/data/zod.extended"; import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; import { CommonModels } from "@/data/common/common.models"; export namespace WorkingDocumentsTemplatedDocumentApi { -export const create = (positionId: string, officeId: string, data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, config?: AxiosRequestConfig) => { +export const create = (positionId: string, officeId: string, data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/templated-documents`, ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), - config + ) }; -export const getTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, config?: AxiosRequestConfig) => { +export const getTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, ) => { return AppRestClient.get( { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - config + ) }; -export const updateTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, config?: AxiosRequestConfig) => { +export const updateTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, ) => { return AppRestClient.patch( { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), - config + ) }; -export const deleteTemplatedDocument = (positionId: string, templatedDocumentId: string, officeId: string, config?: AxiosRequestConfig) => { +export const deleteTemplatedDocument = (positionId: string, templatedDocumentId: string, officeId: string, ) => { return AppRestClient.delete( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - undefined, - config + ) }; -export const previewTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, config?: AxiosRequestConfig) => { +export const previewTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/pdf', }, @@ -52,21 +49,20 @@ export const previewTemplatedDocument = (officeId: string, positionId: string, t } ) }; -export const issueTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const issueTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.void() }, `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config + ) }; -export const generateDocumentEml = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { +export const generateDocumentEml = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { return AppRestClient.post( { resSchema: z.instanceof(Blob) }, `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), { - ...config, headers: { 'Accept': 'application/octet-stream', }, diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts index bba201a..b8a732e 100644 --- a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts +++ b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts @@ -10,7 +10,7 @@ export namespace WorkingDocumentsTemplatedDocumentModels { * @property { string } capturedAt * @property { CommonModels.TemplateBlocksResponseDTO } blocks */ -export const TemplatedDocumentBlueprintDtoSchema = z.object({ templateId: z.string(), templateName: z.string(), capturedAt: z.string(), blocks: CommonModels.TemplateBlocksResponseDTOSchema }).readonly(); +export const TemplatedDocumentBlueprintDtoSchema = z.object({ templateId: z.string(), templateName: z.string(), capturedAt: z.string(), blocks: CommonModels.TemplateBlocksResponseDTOSchema }); export type TemplatedDocumentBlueprintDto = z.infer; /** @@ -29,7 +29,7 @@ export type TemplatedDocumentBlueprintDto = z.infer; /** @@ -38,7 +38,7 @@ export type TemplatedDocumentResponseDto = z.infer; /** @@ -47,7 +47,7 @@ export type UpdateTemplatedDocumentRequestDto = z.infer; /** @@ -55,7 +55,7 @@ export type CreateTemplatedDocumentRequestDto = z.infer; } diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts index 8385890..948d434 100644 --- a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts +++ b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts @@ -1,4 +1,3 @@ -import { AxiosRequestConfig } from "axios"; import { useQuery, useMutation } from "@tanstack/react-query"; import { QueryModule } from "@/data/queryModules"; import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; @@ -28,14 +27,14 @@ export const keys = { * @returns { UseMutationResult } * @statusCodes [201, 401] */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, officeId, data }) => { checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data, config) + return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -56,14 +55,14 @@ export const useCreate = (options?: AppMutationOptions } * @statusCodes [200, 401] */ -export const useGetTemplatedDocument = ({ officeId, positionId, templatedDocumentId }: { officeId: string, positionId: string, templatedDocumentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { +export const useGetTemplatedDocument = ({ officeId, positionId, templatedDocumentId }: { officeId: string, positionId: string, templatedDocumentId: string }, options?: AppQueryOptions) => { const { checkAcl } = useAclCheck(); return useQuery({ queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), queryFn: () => { checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument(officeId, positionId, templatedDocumentId, config) }, + return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument(officeId, positionId, templatedDocumentId) }, ...options, }); }; @@ -80,14 +79,14 @@ export const useGetTemplatedDocument = ({ officeId, positionId, templated * @returns { UseMutationResult } * @statusCodes [200, 401] */ -export const useUpdateTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useUpdateTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) + return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument(officeId, positionId, templatedDocumentId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -110,14 +109,14 @@ export const useUpdateTemplatedDocument = (options?: AppMutationOptions } Templated document deleted * @statusCodes [204, 401, 404] */ -export const useDeleteTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useDeleteTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ positionId, templatedDocumentId, officeId }) => { checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument(positionId, templatedDocumentId, officeId, config) + return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument(positionId, templatedDocumentId, officeId) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -139,14 +138,14 @@ export const useDeleteTemplatedDocument = (options?: AppMutationOptions> } * @statusCodes [200, 201, 401] */ -export const usePreviewTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const usePreviewTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) + return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument(officeId, positionId, templatedDocumentId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -168,14 +167,14 @@ export const usePreviewTemplatedDocument = (options?: AppMutationOptions } * @statusCodes [201, 401] */ -export const useIssueTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useIssueTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) + return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument(officeId, positionId, templatedDocumentId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { @@ -197,14 +196,14 @@ export const useIssueTemplatedDocument = (options?: AppMutationOptions> } * @statusCodes [200, 401] */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { +export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { const { checkAcl } = useAclCheck(); const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); return useMutation({ mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml(officeId, positionId, templatedDocumentId, data, config) + return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml(officeId, positionId, templatedDocumentId, data) }, ...options, onSuccess: async (resData, variables, onMutateResult, context) => { diff --git a/test/generated/next/zod.extended.ts b/test/generated/next/zod.extended.ts index 205405c..81e1e02 100644 --- a/test/generated/next/zod.extended.ts +++ b/test/generated/next/zod.extended.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; +import { ErrorHandler, SharedErrorHandler } from ""; export namespace ZodExtended { interface ParseOptions { From eacd562f7d68beaebb521878c70445388832d2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Urban=20Lavbi=C4=8D?= Date: Thu, 26 Feb 2026 08:21:38 +0100 Subject: [PATCH 03/12] Vite plugin --- README.md | 23 ++++ package.json | 9 +- scripts/benchmark-vite-codegen.mjs | 102 ++++++++++++++++ scripts/snapshot-openapi-localhost.mjs | 23 ++++ src/commands/generate.command.ts | 3 + src/commands/generate.ts | 74 +----------- src/generators/const/options.const.ts | 1 + src/generators/run/generate.runner.ts | 154 +++++++++++++++++++++++++ src/generators/types/options.ts | 1 + src/generators/utils/file.utils.ts | 16 ++- src/vite.ts | 2 + src/vite/openapi-codegen.plugin.ts | 72 ++++++++++++ vite.config.mjs | 4 + 13 files changed, 412 insertions(+), 72 deletions(-) create mode 100644 scripts/benchmark-vite-codegen.mjs create mode 100644 scripts/snapshot-openapi-localhost.mjs create mode 100644 src/generators/run/generate.runner.ts create mode 100644 src/vite.ts create mode 100644 src/vite/openapi-codegen.plugin.ts diff --git a/README.md b/README.md index ef50e47..7e82c25 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ yarn openapi-codegen generate --config my-config.ts --config Path to TS config file (default: 'openapi-codegen.config.ts') --input Path/URL to OpenAPI JSON/YAML document --output Output directory path (default: 'output') + --incremental Skip generation when OpenAPI and config are unchanged (default: true) --format Format the generated code using Oxfmt (default: true) --verbose Display detailed log messages during execution (default: false) @@ -223,6 +224,28 @@ const config: OpenAPICodegenConfig = { }; ``` +### Vite Plugin + +You can run codegen directly from Vite config (without CLI config file): + +```ts +import { defineConfig } from "vite"; +import { openApiCodegen } from "@povio/openapi-codegen-cli/vite"; + +export default defineConfig({ + plugins: [ + openApiCodegen({ + input: "./openapi.yaml", + output: "./src/data", + inlineEndpoints: true, + incremental: true, + }), + ], +}); +``` + +The plugin runs on both `vite serve` and `vite build`, and watches local OpenAPI files in dev mode. + ### Enums If you're using Enums in your backend DTOs with `@Expose()` and `@IsEnum`, they may still not appear correctly in the OpenAPI schema unless you also provide both `enum` **and** `enumName` to `@ApiProperty`. diff --git a/package.json b/package.json index 1eb3cdf..03df2d4 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,11 @@ "import": "./dist/index.mjs", "require": "./dist/index.mjs" }, + "./vite": { + "types": "./dist/vite.d.ts", + "import": "./dist/vite.mjs", + "require": "./dist/vite.mjs" + }, "./generator": { "types": "./dist/generator.d.ts", "import": "./dist/generator.js", @@ -64,7 +69,9 @@ "check": "yarn typecheck && yarn lint && yarn test", "push": "yarn exec ./scripts/publish.sh", "dev:generate": "rm -rf ./output && yarn start generate --config ./test/config.mjs", - "dev:check": "yarn start check --config ./test/config.mjs" + "dev:check": "yarn start check --config ./test/config.mjs", + "snapshot:openapi-localhost": "node ./scripts/snapshot-openapi-localhost.mjs", + "bench:vite-codegen": "node ./scripts/benchmark-vite-codegen.mjs" }, "dependencies": { "i18next": "^25.8.11", diff --git a/scripts/benchmark-vite-codegen.mjs b/scripts/benchmark-vite-codegen.mjs new file mode 100644 index 0000000..ec673af --- /dev/null +++ b/scripts/benchmark-vite-codegen.mjs @@ -0,0 +1,102 @@ +import fs from "fs"; +import { spawnSync } from "child_process"; +import path from "path"; + +const ROOT = process.cwd(); +const EXAMPLE_ROOT = path.join(ROOT, "test/vite-example"); +const DATA_DIR = path.join(EXAMPLE_ROOT, "src/data"); +const DIST_INDEX = path.join(ROOT, "dist/index.mjs"); +const DIST_VITE = path.join(ROOT, "dist/vite.mjs"); +const SNAPSHOT_OPENAPI = path.join(ROOT, "test/benchmarks/openapi.localhost4000.json"); + +function run(command, args, env = {}) { + const start = process.hrtime.bigint(); + const result = spawnSync(command, args, { + cwd: ROOT, + stdio: "pipe", + shell: process.platform === "win32", + env: { ...process.env, ...env }, + encoding: "utf-8", + }); + const elapsedMs = Number(process.hrtime.bigint() - start) / 1_000_000; + + if (result.status !== 0) { + const stdout = result.stdout?.toString() ?? ""; + const stderr = result.stderr?.toString() ?? ""; + throw new Error(`Command failed: ${command} ${args.join(" ")}\n${stdout}\n${stderr}`); + } + + return elapsedMs; +} + +function ensureBuiltPackage() { + if (!fs.existsSync(DIST_INDEX) || !fs.existsSync(DIST_VITE)) { + console.log("Building package (dist)..."); + run("yarn", ["build"]); + } +} + +function ensureBaselineGeneratedData() { + fs.rmSync(DATA_DIR, { recursive: true, force: true }); + run("yarn", [ + "start", + "generate", + "--input", + "./test/petstore.yaml", + "--output", + "./test/vite-example/src/data", + "--importPath", + "relative", + "--no-prettier", + ]); +} + +function buildBaseline() { + return run("yarn", ["vite", "build", "--config", "test/vite-example/vite.base.config.ts"]); +} + +function buildWithCodegen(incremental) { + if (!incremental) { + fs.rmSync(DATA_DIR, { recursive: true, force: true }); + } + const openApiInput = fs.existsSync(SNAPSHOT_OPENAPI) ? SNAPSHOT_OPENAPI : path.join(ROOT, "test/petstore.yaml"); + return run("yarn", ["vite", "build", "--config", "test/vite-example/vite.codegen.config.ts"], { + OPENAPI_CODEGEN_INCREMENTAL: incremental ? "true" : "false", + OPENAPI_CODEGEN_INPUT: openApiInput, + }); +} + +function pctDiff(value, baseline) { + return ((value - baseline) / baseline) * 100; +} + +function printMs(label, ms) { + console.log(`${label}: ${ms.toFixed(1)}ms`); +} + +function main() { + ensureBuiltPackage(); + ensureBaselineGeneratedData(); + + const baselineMs = buildBaseline(); + const codegenColdMs = buildWithCodegen(false); + + // Prime cache once; measure second incremental run. + buildWithCodegen(true); + const codegenWarmMs = buildWithCodegen(true); + + console.log("\nVite build benchmark (test/vite-example):"); + console.log( + `OpenAPI input: ${fs.existsSync(SNAPSHOT_OPENAPI) ? "test/benchmarks/openapi.localhost4000.json" : "test/petstore.yaml (fallback)"}`, + ); + printMs("baseline (no plugin)", baselineMs); + printMs("with openApiCodegen (incremental=false)", codegenColdMs); + printMs("with openApiCodegen (incremental=true, warm)", codegenWarmMs); + console.log( + `\nOverhead vs baseline:\n` + + `cold: ${pctDiff(codegenColdMs, baselineMs).toFixed(1)}%\n` + + `warm: ${pctDiff(codegenWarmMs, baselineMs).toFixed(1)}%`, + ); +} + +main(); diff --git a/scripts/snapshot-openapi-localhost.mjs b/scripts/snapshot-openapi-localhost.mjs new file mode 100644 index 0000000..ae75fa5 --- /dev/null +++ b/scripts/snapshot-openapi-localhost.mjs @@ -0,0 +1,23 @@ +import fs from "fs"; +import path from "path"; + +const ROOT = process.cwd(); +const URL = process.env.OPENAPI_SNAPSHOT_URL ?? "http://localhost:4000/docs-json"; +const OUTPUT = path.resolve(ROOT, process.env.OPENAPI_SNAPSHOT_OUTPUT ?? "test/benchmarks/openapi.localhost4000.json"); + +async function main() { + const res = await fetch(URL); + if (!res.ok) { + throw new Error(`Failed to fetch OpenAPI (${res.status} ${res.statusText}) from ${URL}`); + } + + const json = await res.json(); + fs.mkdirSync(path.dirname(OUTPUT), { recursive: true }); + fs.writeFileSync(OUTPUT, `${JSON.stringify(json, null, 2)}\n`, "utf-8"); + console.log(`Saved OpenAPI snapshot to ${OUTPUT}`); +} + +main().catch((error) => { + console.error(error instanceof Error ? error.message : String(error)); + process.exit(1); +}); diff --git a/src/commands/generate.command.ts b/src/commands/generate.command.ts index 58ec380..e484555 100644 --- a/src/commands/generate.command.ts +++ b/src/commands/generate.command.ts @@ -16,6 +16,9 @@ class GenerateOptions implements GenerateParams { @YargOption({ envAlias: "output" }) output?: string; + @YargOption({ envAlias: "incremental", type: "boolean" }) + incremental?: boolean; + @YargOption({ envAlias: "tsNamespaces", type: "boolean" }) tsNamespaces?: boolean; diff --git a/src/commands/generate.ts b/src/commands/generate.ts index 3ad9995..24c81ae 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -1,10 +1,6 @@ -import SwaggerParser from "@apidevtools/swagger-parser"; import { exec } from "child_process"; -import { OpenAPIV3 } from "openapi-types"; -import { resolveConfig } from "@/generators/core/resolveConfig"; -import { generateCodeFromOpenAPIDoc } from "@/generators/generateCodeFromOpenAPIDoc"; +import { runGenerate } from "@/generators/run/generate.runner"; import { GenerateOptions } from "@/generators/types/options"; -import { writeGenerateFileData } from "@/generators/utils/file.utils"; import { logError, logInfo, logSuccess } from "@/helpers/cli.helper"; import { loadConfig } from "@/helpers/config.helper"; import { Profiler } from "@/helpers/profile.helper"; @@ -20,6 +16,7 @@ export type GenerateParams = { GenerateOptions, | "input" | "output" + | "incremental" | "tsNamespaces" | "tsPath" | "splitByTags" @@ -47,26 +44,16 @@ export async function generate({ prettier, verbose, config: configParam, ...para const start = Date.now(); const profiler = new Profiler(process.env.OPENAPI_CODEGEN_PROFILE === "1"); - if (verbose) { - logInfo("Resolving config..."); - } const fileConfig = await profiler.runAsync("config.load", async () => await loadConfig(configParam)); - const config = profiler.runSync("config.resolve", () => resolveConfig({ fileConfig, params })); - - if (verbose) { - logInfo("Parsing OpenAPI spec..."); - } - const openApiDoc = await getOpenApiDoc(config.input, profiler); - if (verbose) { logInfo("Generating code..."); } - const filesData = profiler.runSync("generate.total", () => generateCodeFromOpenAPIDoc(openApiDoc, config, profiler)); + const result = await runGenerate({ fileConfig, params, profiler }); + const config = result.config; - if (verbose) { - logInfo("Writing files..."); + if (result.skipped && verbose) { + logInfo("OpenAPI and config unchanged. Skipping generation."); } - profiler.runSync("files.write", () => writeGenerateFileData(filesData)); if (verbose) { logSuccess(`Time: ${Date.now() - start}ms`); if (profiler.enabled) { @@ -80,55 +67,6 @@ export async function generate({ prettier, verbose, config: configParam, ...para } } -async function getOpenApiDoc(input: string, profiler: Profiler): Promise { - const parsedDoc = (await profiler.runAsync( - "openapi.parse", - async () => await SwaggerParser.parse(input), - )) as OpenAPIV3.Document; - const hasExternalRefs = profiler.runSync("openapi.detectExternalRefs", () => hasExternalRef(parsedDoc)); - if (!hasExternalRefs) { - return parsedDoc; - } - - return (await profiler.runAsync( - "openapi.bundle", - async () => await SwaggerParser.bundle(input), - )) as OpenAPIV3.Document; -} - -function hasExternalRef(value: unknown): boolean { - const stack = [value]; - const visited = new Set(); - - while (stack.length > 0) { - const current = stack.pop(); - if (!current || typeof current !== "object") { - continue; - } - - if (visited.has(current)) { - continue; - } - visited.add(current); - - if ( - "$ref" in current && - typeof (current as { $ref?: unknown }).$ref === "string" && - !(current as { $ref: string }).$ref.startsWith("#/") - ) { - return true; - } - - for (const nested of Object.values(current)) { - if (nested && typeof nested === "object") { - stack.push(nested); - } - } - } - - return false; -} - function execPrettier({ output, verbose }: Pick) { if (verbose) { logInfo("Running Prettier..."); diff --git a/src/generators/const/options.const.ts b/src/generators/const/options.const.ts index 101e089..779907c 100644 --- a/src/generators/const/options.const.ts +++ b/src/generators/const/options.const.ts @@ -8,6 +8,7 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = { // Base options input: "http://localhost:4000/docs-json/", output: "output", + incremental: true, splitByTags: true, defaultTag: "Common", excludeTags: [], diff --git a/src/generators/run/generate.runner.ts b/src/generators/run/generate.runner.ts new file mode 100644 index 0000000..12c4ff5 --- /dev/null +++ b/src/generators/run/generate.runner.ts @@ -0,0 +1,154 @@ +import fs from "fs"; +import path from "path"; + +import SwaggerParser from "@apidevtools/swagger-parser"; +import { OpenAPIV3 } from "openapi-types"; + +import { resolveConfig } from "@/generators/core/resolveConfig"; +import { generateCodeFromOpenAPIDoc } from "@/generators/generateCodeFromOpenAPIDoc"; +import { GenerateOptions } from "@/generators/types/options"; +import { writeGenerateFileData } from "@/generators/utils/file.utils"; +import { Profiler } from "@/helpers/profile.helper"; + +const CACHE_FILE_NAME = ".openapi-codegen-cache.json"; + +type CacheData = { + openApiHash: string; + optionsHash: string; +}; + +export async function runGenerate({ + fileConfig, + params, + profiler = new Profiler(process.env.OPENAPI_CODEGEN_PROFILE === "1"), +}: { + fileConfig?: Partial | null; + params?: Partial< + Omit & { + excludeTags: string; + inlineEndpointsExcludeModules: string; + } + >; + profiler?: Profiler; +}) { + const config = profiler.runSync("config.resolve", () => resolveConfig({ fileConfig, params: params ?? {} })); + const openApiDoc = await getOpenApiDoc(config.input, profiler); + + const openApiHash = hashString(stableStringify(openApiDoc)); + const optionsHash = hashString(stableStringify(getCacheableConfig(config))); + const cacheFilePath = path.resolve(config.output, CACHE_FILE_NAME); + + if (config.incremental) { + const cached = readCache(cacheFilePath); + if (cached && cached.openApiHash === openApiHash && cached.optionsHash === optionsHash) { + return { skipped: true, config }; + } + } + + const filesData = profiler.runSync("generate.total", () => generateCodeFromOpenAPIDoc(openApiDoc, config, profiler)); + profiler.runSync("files.write", () => writeGenerateFileData(filesData)); + + if (config.incremental) { + writeCache(cacheFilePath, { openApiHash, optionsHash }); + } + + return { skipped: false, config }; +} + +async function getOpenApiDoc(input: string, profiler: Profiler): Promise { + const parsedDoc = (await profiler.runAsync( + "openapi.parse", + async () => await SwaggerParser.parse(input), + )) as OpenAPIV3.Document; + const hasExternalRefs = profiler.runSync("openapi.detectExternalRefs", () => hasExternalRef(parsedDoc)); + if (!hasExternalRefs) { + return parsedDoc; + } + + return (await profiler.runAsync( + "openapi.bundle", + async () => await SwaggerParser.bundle(input), + )) as OpenAPIV3.Document; +} + +function hasExternalRef(value: unknown): boolean { + const stack = [value]; + const visited = new Set(); + + while (stack.length > 0) { + const current = stack.pop(); + if (!current || typeof current !== "object") { + continue; + } + + if (visited.has(current)) { + continue; + } + visited.add(current); + + if ( + "$ref" in current && + typeof (current as { $ref?: unknown }).$ref === "string" && + !(current as { $ref: string }).$ref.startsWith("#/") + ) { + return true; + } + + for (const nested of Object.values(current)) { + if (nested && typeof nested === "object") { + stack.push(nested); + } + } + } + + return false; +} + +function getCacheableConfig(config: GenerateOptions) { + const { output, incremental, ...cacheableConfig } = config; + void output; + void incremental; + return cacheableConfig; +} + +function readCache(filePath: string): CacheData | null { + if (!fs.existsSync(filePath)) { + return null; + } + try { + return JSON.parse(fs.readFileSync(filePath, "utf-8")) as CacheData; + } catch { + return null; + } +} + +function writeCache(filePath: string, data: CacheData) { + const dir = path.dirname(filePath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(filePath, JSON.stringify(data), "utf-8"); +} + +function hashString(input: string) { + let hash = 2166136261; + for (let i = 0; i < input.length; i += 1) { + hash ^= input.charCodeAt(i); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0).toString(16); +} + +function stableStringify(input: unknown): string { + if (input === null || typeof input !== "object") { + return JSON.stringify(input); + } + + if (Array.isArray(input)) { + return `[${input.map((item) => stableStringify(item)).join(",")}]`; + } + + const obj = input as Record; + const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b)); + return `{${keys.map((key) => `${JSON.stringify(key)}:${stableStringify(obj[key])}`).join(",")}}`; +} diff --git a/src/generators/types/options.ts b/src/generators/types/options.ts index 0ca2d94..582d488 100644 --- a/src/generators/types/options.ts +++ b/src/generators/types/options.ts @@ -63,6 +63,7 @@ interface GenerateConfig { interface BaseGenerateOptions { input: string; output: string; + incremental?: boolean; splitByTags: boolean; defaultTag: string; excludeTags: string[]; diff --git a/src/generators/utils/file.utils.ts b/src/generators/utils/file.utils.ts index 8e7fcc9..c9c1a24 100644 --- a/src/generators/utils/file.utils.ts +++ b/src/generators/utils/file.utils.ts @@ -1,14 +1,24 @@ import fs from "fs"; import path from "path"; +import { fileURLToPath } from "url"; import { GenerateFileData } from "@/generators/types/generate"; function readFileSync(filePath: string) { - if (process.env.NODE_ENV === "production") { - return fs.readFileSync(path.join(__dirname, `../${filePath}`), "utf-8"); + const moduleDir = path.dirname(fileURLToPath(import.meta.url)); + const candidates = [ + path.resolve(process.cwd(), filePath), + path.resolve(moduleDir, "../../../", filePath), + path.resolve(moduleDir, "../", filePath), + ]; + + for (const candidatePath of candidates) { + if (fs.existsSync(candidatePath)) { + return fs.readFileSync(candidatePath, "utf-8"); + } } - return fs.readFileSync(filePath, "utf-8"); + throw new Error(`Cannot read file: ${filePath}`); } export function readAssetSync(fileName: string) { diff --git a/src/vite.ts b/src/vite.ts new file mode 100644 index 0000000..7afb9fb --- /dev/null +++ b/src/vite.ts @@ -0,0 +1,2 @@ +export { openApiCodegen } from "./vite/openapi-codegen.plugin"; +export type { OpenAPICodegenConfig } from "./generators/types/config"; diff --git a/src/vite/openapi-codegen.plugin.ts b/src/vite/openapi-codegen.plugin.ts new file mode 100644 index 0000000..da376ff --- /dev/null +++ b/src/vite/openapi-codegen.plugin.ts @@ -0,0 +1,72 @@ +import path from "path"; + +import { runGenerate } from "@/generators/run/generate.runner"; +import { OpenAPICodegenConfig } from "@/generators/types/config"; +import { Profiler } from "@/helpers/profile.helper"; + +import type { Plugin, ResolvedConfig, ViteDevServer } from "vite"; + +export function openApiCodegen(config: OpenAPICodegenConfig): Plugin { + let resolvedViteConfig: ResolvedConfig | undefined; + let queue: Promise = Promise.resolve(); + const isLocalInput = typeof config.input === "string" && !/^https?:\/\//i.test(config.input); + const normalizedConfig = { ...config }; + + const enqueueGenerate = () => { + queue = queue.then(async () => { + const currentConfig = resolvedViteConfig; + if (!currentConfig) { + return; + } + + const fileConfig = normalizePaths(normalizedConfig, currentConfig.root); + const profiler = new Profiler(process.env.OPENAPI_CODEGEN_PROFILE === "1"); + await runGenerate({ fileConfig, profiler }); + }); + }; + + const setupWatcher = (server: ViteDevServer) => { + if (!isLocalInput || !config.input) { + return; + } + + const openApiPath = path.resolve(server.config.root, config.input); + server.watcher.add(openApiPath); + server.watcher.on("change", (changedPath) => { + if (path.resolve(changedPath) === openApiPath) { + enqueueGenerate(); + } + }); + }; + + return { + name: "openapi-codegen", + configResolved(config) { + resolvedViteConfig = config; + }, + buildStart() { + enqueueGenerate(); + }, + configureServer(server) { + setupWatcher(server); + }, + }; +} + +function normalizePaths(config: OpenAPICodegenConfig, root: string): OpenAPICodegenConfig { + const normalized = { ...config }; + + if (typeof normalized.output === "string" && !path.isAbsolute(normalized.output)) { + normalized.output = path.resolve(root, normalized.output); + } + + if ( + typeof normalized.input === "string" && + !path.isAbsolute(normalized.input) && + !/^https?:\/\//i.test(normalized.input) + ) { + normalized.input = path.resolve(root, normalized.input); + } + + return normalized; +} diff --git a/vite.config.mjs b/vite.config.mjs index 3948c67..7b3f5de 100644 --- a/vite.config.mjs +++ b/vite.config.mjs @@ -1,5 +1,6 @@ import { readFileSync } from "fs"; import { resolve } from "path"; +import { builtinModules } from "module"; import { defineConfig } from "vite"; import dts from "vite-plugin-dts"; @@ -35,6 +36,7 @@ export default defineConfig({ formats: ["es"], entry: { index: "src/index.ts", + vite: "src/vite.ts", acl: "src/acl.ts", }, }, @@ -45,6 +47,8 @@ export default defineConfig({ // Externalize all dependencies and peerDependencies ...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.peerDependencies || {}), + ...builtinModules, + ...builtinModules.map((moduleName) => `node:${moduleName}`), /^react($|\/)/, /^react-dom($|\/)/, /^@[\w-]+\//, From a44f56e9bff80aa273a02a8c418d7b20bf66cb19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Urban=20Lavbi=C4=8D?= Date: Thu, 26 Feb 2026 08:29:50 +0100 Subject: [PATCH 04/12] onError hook support for general error handling --- src/generators/generate/generateQueries.ts | 7 + src/lib/config/queryConfig.context.tsx | 6 +- .../tmp-onerror/.openapi-codegen-cache.json | 1 + test/generated/tmp-onerror/acl/app.ability.ts | 5 + test/generated/tmp-onerror/acl/useAclCheck.ts | 21 ++ test/generated/tmp-onerror/app-rest-client.ts | 7 + test/generated/tmp-onerror/pet/pet.api.ts | 92 ++++++++ test/generated/tmp-onerror/pet/pet.models.ts | 83 +++++++ test/generated/tmp-onerror/pet/pet.queries.ts | 214 ++++++++++++++++++ test/generated/tmp-onerror/queryModules.ts | 5 + test/generated/tmp-onerror/store/store.api.ts | 36 +++ .../tmp-onerror/store/store.models.ts | 34 +++ .../tmp-onerror/store/store.queries.ts | 109 +++++++++ .../useCrossTabQueryInvalidation.ts | 40 ++++ .../tmp-onerror/useMutationEffects.ts | 95 ++++++++ test/generated/tmp-onerror/user/user.api.ts | 67 ++++++ .../generated/tmp-onerror/user/user.models.ts | 26 +++ .../tmp-onerror/user/user.queries.ts | 185 +++++++++++++++ test/generated/tmp-onerror/zod.extended.ts | 47 ++++ 19 files changed, 1078 insertions(+), 2 deletions(-) create mode 100644 test/generated/tmp-onerror/.openapi-codegen-cache.json create mode 100644 test/generated/tmp-onerror/acl/app.ability.ts create mode 100644 test/generated/tmp-onerror/acl/useAclCheck.ts create mode 100644 test/generated/tmp-onerror/app-rest-client.ts create mode 100644 test/generated/tmp-onerror/pet/pet.api.ts create mode 100644 test/generated/tmp-onerror/pet/pet.models.ts create mode 100644 test/generated/tmp-onerror/pet/pet.queries.ts create mode 100644 test/generated/tmp-onerror/queryModules.ts create mode 100644 test/generated/tmp-onerror/store/store.api.ts create mode 100644 test/generated/tmp-onerror/store/store.models.ts create mode 100644 test/generated/tmp-onerror/store/store.queries.ts create mode 100644 test/generated/tmp-onerror/useCrossTabQueryInvalidation.ts create mode 100644 test/generated/tmp-onerror/useMutationEffects.ts create mode 100644 test/generated/tmp-onerror/user/user.api.ts create mode 100644 test/generated/tmp-onerror/user/user.models.ts create mode 100644 test/generated/tmp-onerror/user/user.queries.ts create mode 100644 test/generated/tmp-onerror/zod.extended.ts diff --git a/src/generators/generate/generateQueries.ts b/src/generators/generate/generateQueries.ts index 228c1f0..25254cb 100644 --- a/src/generators/generate/generateQueries.ts +++ b/src/generators/generate/generateQueries.ts @@ -116,6 +116,7 @@ export function generateQueries(params: GenerateTypeParams) { const queryTypesImport: Import = { bindings: [ + "OpenApiQueryConfig", ...(queryEndpoints.length > 0 ? [QUERY_OPTIONS_TYPES.query] : []), ...(resolver.options.infiniteQueries && infiniteQueryEndpoints.length > 0 ? [QUERY_OPTIONS_TYPES.infiniteQuery] @@ -640,6 +641,7 @@ function renderQuery({ lines.push( `export const ${getQueryName(endpoint)} = (${endpointParams ? `{ ${endpointArgs} }: { ${endpointParams} }, ` : ""}options?: AppQueryOptions${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, ); + lines.push(" const queryConfig = OpenApiQueryConfig.useConfig();"); if (hasAclCheck) { lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); } @@ -659,6 +661,7 @@ function renderQuery({ lines.push(` queryFn: ${importedEndpoint},`); } lines.push(" ...options,"); + lines.push(" onError: options?.onError ?? queryConfig.onError,"); lines.push(" });"); lines.push("};"); return lines.join("\n"); @@ -706,6 +709,7 @@ function renderMutation({ lines.push( `export const ${getQueryName(endpoint, true)} = (options?: AppMutationOptions${hasMutationEffects ? ` & ${MUTATION_EFFECTS.optionsType}` : ""}${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, ); + lines.push(" const queryConfig = OpenApiQueryConfig.useConfig();"); if (hasAclCheck) { lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); } @@ -775,6 +779,7 @@ function renderMutation({ } lines.push(" ...options,"); + lines.push(" onError: options?.onError ?? queryConfig.onError,"); if (hasMutationEffects) { lines.push(" onSuccess: async (resData, variables, onMutateResult, context) => {"); if (updateQueryEndpoints.length > 0) { @@ -915,6 +920,7 @@ function renderInfiniteQuery({ lines.push( `export const ${getInfiniteQueryName(endpoint)} = (${endpointParams ? `{ ${endpointArgsWithoutPage} }: { ${endpointParams} }, ` : ""}options?: AppInfiniteQueryOptions${hasAxiosRequestConfig ? `, ${AXIOS_REQUEST_CONFIG_NAME}?: ${AXIOS_REQUEST_CONFIG_TYPE}` : ""}) => {`, ); + lines.push(" const queryConfig = OpenApiQueryConfig.useConfig();"); if (hasAclCheck) { lines.push(` const { checkAcl } = ${ACL_CHECK_HOOK}();`); } @@ -939,6 +945,7 @@ function renderInfiniteQuery({ ); lines.push(" },"); lines.push(" ...options,"); + lines.push(" onError: options?.onError ?? queryConfig.onError,"); lines.push(" });"); lines.push("};"); return lines.join("\n"); diff --git a/src/lib/config/queryConfig.context.tsx b/src/lib/config/queryConfig.context.tsx index 77e4fec..401d6e0 100644 --- a/src/lib/config/queryConfig.context.tsx +++ b/src/lib/config/queryConfig.context.tsx @@ -17,6 +17,7 @@ export namespace OpenApiQueryConfig { invalidateCurrentModule?: boolean; invalidationMap?: InvalidationMap; crossTabInvalidation?: boolean; + onError?: (error: unknown) => void; } const Context = createContext({}); @@ -28,12 +29,13 @@ export namespace OpenApiQueryConfig { invalidateCurrentModule, invalidationMap, crossTabInvalidation, + onError, children, }: PropsWithChildren) => { const value = useMemo( - () => ({ preferUpdate, invalidateCurrentModule, invalidationMap, crossTabInvalidation }), - [preferUpdate, invalidateCurrentModule, invalidationMap, crossTabInvalidation], + () => ({ preferUpdate, invalidateCurrentModule, invalidationMap, crossTabInvalidation, onError }), + [preferUpdate, invalidateCurrentModule, invalidationMap, crossTabInvalidation, onError], ); return {children}; diff --git a/test/generated/tmp-onerror/.openapi-codegen-cache.json b/test/generated/tmp-onerror/.openapi-codegen-cache.json new file mode 100644 index 0000000..9624e8a --- /dev/null +++ b/test/generated/tmp-onerror/.openapi-codegen-cache.json @@ -0,0 +1 @@ +{"openApiHash":"bcc2bcf5","optionsHash":"f50c4ca3"} \ No newline at end of file diff --git a/test/generated/tmp-onerror/acl/app.ability.ts b/test/generated/tmp-onerror/acl/app.ability.ts new file mode 100644 index 0000000..6c06fc9 --- /dev/null +++ b/test/generated/tmp-onerror/acl/app.ability.ts @@ -0,0 +1,5 @@ +import { PureAbility, AbilityTuple, Subject } from "@casl/ability"; + +export type AppAbilities = AbilityTuple; + +export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/tmp-onerror/acl/useAclCheck.ts b/test/generated/tmp-onerror/acl/useAclCheck.ts new file mode 100644 index 0000000..5e19407 --- /dev/null +++ b/test/generated/tmp-onerror/acl/useAclCheck.ts @@ -0,0 +1,21 @@ +import { AbilityTuple } from "@casl/ability"; +import { type ErrorHandler, SharedErrorHandler } from ""; +import { AbilityContext } from ""; +import { useCallback } from "react"; +import { AppAbilities } from "../acl/app.ability"; + +interface UseAclCheckProps { + errorHandler?: ErrorHandler; +} + +export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { + const ability = AbilityContext.useAbility(); + + const checkAcl = useCallback((appAbility: AppAbilities) => { + if (!ability.can(...(appAbility as AbilityTuple))) { + (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); + } + }, [ability, errorHandler]); + + return { checkAcl }; +} diff --git a/test/generated/tmp-onerror/app-rest-client.ts b/test/generated/tmp-onerror/app-rest-client.ts new file mode 100644 index 0000000..493b224 --- /dev/null +++ b/test/generated/tmp-onerror/app-rest-client.ts @@ -0,0 +1,7 @@ +import { RestClient } from "@povio/openapi-codegen-cli"; + +export const AppRestClient = new RestClient({ + config: { + baseURL: "https://petstore3.swagger.io/api/v3" + }, +}); diff --git a/test/generated/tmp-onerror/pet/pet.api.ts b/test/generated/tmp-onerror/pet/pet.api.ts new file mode 100644 index 0000000..94fd0ed --- /dev/null +++ b/test/generated/tmp-onerror/pet/pet.api.ts @@ -0,0 +1,92 @@ +import { AppRestClient } from "../app-rest-client"; +import { z } from "zod"; +import { ZodExtended } from "../zod.extended"; +import { PetModels } from "./pet.models"; + +export namespace PetApi { +export const update = (data: PetModels.Pet, ) => { + return AppRestClient.put( + { resSchema: PetModels.PetSchema }, + `/pet`, + ZodExtended.parse(PetModels.PetSchema, data), + + ) +}; +export const add = (data: PetModels.Pet, ) => { + return AppRestClient.post( + { resSchema: PetModels.PetSchema }, + `/pet`, + ZodExtended.parse(PetModels.PetSchema, data), + + ) +}; +export const findByStatus = (status?: PetModels.FindByStatusStatusParam, ) => { + return AppRestClient.get( + { resSchema: PetModels.FindByStatusResponseSchema }, + `/pet/findByStatus`, + { + params: { + status: ZodExtended.parse(PetModels.FindByStatusStatusParamSchema.optional(), status, { type: "query", name: "status" }), + }, + } + ) +}; +export const findByTags = (tags?: PetModels.FindByTagsTagsParam, ) => { + return AppRestClient.get( + { resSchema: PetModels.FindByTagsResponseSchema }, + `/pet/findByTags`, + { + params: { + tags: ZodExtended.parse(PetModels.FindByTagsTagsParamSchema.optional(), tags, { type: "query", name: "tags" }), + }, + } + ) +}; +export const getById = (petId: number, ) => { + return AppRestClient.get( + { resSchema: PetModels.PetSchema }, + `/pet/${petId}`, + + ) +}; +export const updateWithForm = (petId: number, name: string, status: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/pet/${petId}`, + undefined, + { + params: { + name: ZodExtended.parse(z.string().nullish(), name, { type: "query", name: "name" }), + status: ZodExtended.parse(z.string().nullish(), status, { type: "query", name: "status" }), + }, + } + ) +}; +export const deletePet = (petId: number, api_key?: string, ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/pet/${petId}`, + undefined, + { + headers: { + 'api_key': api_key, + }, + } + ) +}; +export const uploadFile = (petId: number, data: string, additionalMetadata?: string, ) => { + return AppRestClient.post( + { resSchema: PetModels.ApiResponseSchema }, + `/pet/${petId}/uploadImage`, + ZodExtended.parse(z.instanceof(Blob), data), + { + params: { + additionalMetadata: ZodExtended.parse(z.string().nullish(), additionalMetadata, { type: "query", name: "additionalMetadata" }), + }, + headers: { + 'Content-Type': 'application/octet-stream', + }, + } + ) +}; +} diff --git a/test/generated/tmp-onerror/pet/pet.models.ts b/test/generated/tmp-onerror/pet/pet.models.ts new file mode 100644 index 0000000..2b7a204 --- /dev/null +++ b/test/generated/tmp-onerror/pet/pet.models.ts @@ -0,0 +1,83 @@ +import { z } from "zod"; + +export namespace PetModels { +/** + * FindByStatusStatusEnumSchema + * @type { enum } + * @description pet status in the store. Default: `available` + */ +export const FindByStatusStatusEnumSchema = z.enum(["available", "pending", "sold"]); +export type FindByStatusStatusEnum = z.infer; +export const FindByStatusStatusEnum = FindByStatusStatusEnumSchema.enum; + +/** + * CategorySchema + * @type { object } + * @property { integer } id Example: `1` + * @property { string } name Example: `Dogs` + */ +export const CategorySchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); +export type Category = z.infer; + +/** + * TagSchema + * @type { object } + * @property { integer } id + * @property { string } name + */ +export const TagSchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); +export type Tag = z.infer; + +/** + * PetSchema + * @type { object } + * @property { integer } id Example: `10` + * @property { string } name Example: `doggie` + * @property { Category } category + * @property { string[] } photoUrls + * @property { Tag[] } tags + * @property { string } status pet status in the store + */ +export const PetSchema = z.object({ id: z.int().nullish(), name: z.string(), category: CategorySchema.nullish(), photoUrls: z.array(z.string()), tags: z.array(TagSchema).nullish(), status: FindByStatusStatusEnumSchema.nullish() }); +export type Pet = z.infer; + +/** + * ApiResponseSchema + * @type { object } + * @property { integer } code + * @property { string } type + * @property { string } message + */ +export const ApiResponseSchema = z.object({ code: z.int().nullable(), type: z.string().nullable(), message: z.string().nullable() }).partial(); +export type ApiResponse = z.infer; + +/** + * FindByStatusStatusParamSchema + * @type { string } + * @description Default: `available` + */ +export const FindByStatusStatusParamSchema = FindByStatusStatusEnumSchema.nullish().default("available"); +export type FindByStatusStatusParam = z.infer; + +/** + * FindByStatusResponseSchema + * @type { array } + */ +export const FindByStatusResponseSchema = z.array(PetSchema); +export type FindByStatusResponse = z.infer; + +/** + * FindByTagsTagsParamSchema + * @type { array } + */ +export const FindByTagsTagsParamSchema = z.array(z.string()).nullish(); +export type FindByTagsTagsParam = z.infer; + +/** + * FindByTagsResponseSchema + * @type { array } + */ +export const FindByTagsResponseSchema = z.array(PetSchema); +export type FindByTagsResponse = z.infer; + +} diff --git a/test/generated/tmp-onerror/pet/pet.queries.ts b/test/generated/tmp-onerror/pet/pet.queries.ts new file mode 100644 index 0000000..b19320b --- /dev/null +++ b/test/generated/tmp-onerror/pet/pet.queries.ts @@ -0,0 +1,214 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "../queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; +import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PetModels } from "./pet.models"; +import { PetApi } from "./pet.api"; + +export namespace PetQueries { +export const moduleName = QueryModule.pet; + +export const keys = { + all: [moduleName] as const, + findByStatus: (status?: PetModels.FindByStatusStatusParam) => [...keys.all, "/pet/findByStatus", status] as const, + findByTags: (tags?: PetModels.FindByTagsTagsParam) => [...keys.all, "/pet/findByTags", tags] as const, + getById: (petId: number) => [...keys.all, "/pet/:petId", petId] as const, +}; + +/** + * Mutation `useUpdate` + * @summary Update an existing pet + * @description Update an existing pet by Id + * @param { PetModels.Pet } mutation.data Body parameter. Update an existent pet in the store + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, 400, 404, 405] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + PetApi.update(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useAdd` + * @summary Add a new pet to the store + * @description Add a new pet to the store + * @param { PetModels.Pet } mutation.data Body parameter. Create a new pet in the store + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, 405] + */ +export const useAdd = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + PetApi.add(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindByStatus` + * @summary Finds Pets by status + * @description Multiple status values can be provided with comma separated strings + * @param { PetModels.FindByStatusStatusParam } object.status Query parameter. Status values that need to be considered for filter. Default: `available` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400] + */ +export const useFindByStatus = ({ status }: { status?: PetModels.FindByStatusStatusParam }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.findByStatus(status), + queryFn: () => + PetApi.findByStatus(status), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useFindByTags` + * @summary Finds Pets by tags + * @description Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * @param { PetModels.FindByTagsTagsParam } object.tags Query parameter. Tags to filter by + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400] + */ +export const useFindByTags = ({ tags }: { tags?: PetModels.FindByTagsTagsParam }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.findByTags(tags), + queryFn: () => + PetApi.findByTags(tags), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useGetById` + * @summary Find pet by ID + * @description Returns a single pet + * @param { number } object.petId Path parameter. ID of pet to return + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400, 404] + */ +export const useGetById = ({ petId }: { petId: number }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getById(petId), + queryFn: () => + PetApi.getById(petId), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `useUpdateWithForm` + * @summary Updates a pet in the store with form data + * @param { number } mutation.petId Path parameter. ID of pet that needs to be updated + * @param { string } mutation.name Query parameter. Name of pet that needs to be updated + * @param { string } mutation.status Query parameter. Status of pet that needs to be updated + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [405] + */ +export const useUpdateWithForm = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ petId, name, status }) => + PetApi.updateWithForm(petId, name, status) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeletePet` + * @summary Deletes a pet + * @description delete a pet + * @param { number } mutation.petId Path parameter. Pet id to delete + * @param { string } mutation.api_key Header parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [400] + */ +export const useDeletePet = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ petId, api_key }) => + PetApi.deletePet(petId, api_key) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUploadFile` + * @summary uploads an image + * @param { number } mutation.petId Path parameter. ID of pet to update + * @param { string } mutation.data Body parameter + * @param { string } mutation.additionalMetadata Query parameter. Additional Metadata + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200] + */ +export const useUploadFile = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ petId, data, additionalMetadata }) => + PetApi.uploadFile(petId, data, additionalMetadata) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/tmp-onerror/queryModules.ts b/test/generated/tmp-onerror/queryModules.ts new file mode 100644 index 0000000..c815cfe --- /dev/null +++ b/test/generated/tmp-onerror/queryModules.ts @@ -0,0 +1,5 @@ +export const enum QueryModule { + pet = "PetQueries", + store = "StoreQueries", + user = "UserQueries", +} \ No newline at end of file diff --git a/test/generated/tmp-onerror/store/store.api.ts b/test/generated/tmp-onerror/store/store.api.ts new file mode 100644 index 0000000..7a4712b --- /dev/null +++ b/test/generated/tmp-onerror/store/store.api.ts @@ -0,0 +1,36 @@ +import { AppRestClient } from "../app-rest-client"; +import { z } from "zod"; +import { ZodExtended } from "../zod.extended"; +import { StoreModels } from "./store.models"; + +export namespace StoreApi { +export const getInventory = () => { + return AppRestClient.get( + { resSchema: StoreModels.GetInventoryResponseSchema }, + `/store/inventory`, + + ) +}; +export const placeOrder = (data: StoreModels.Order, ) => { + return AppRestClient.post( + { resSchema: StoreModels.OrderSchema }, + `/store/order`, + ZodExtended.parse(StoreModels.OrderSchema.optional(), data), + + ) +}; +export const getOrderById = (orderId: number, ) => { + return AppRestClient.get( + { resSchema: StoreModels.OrderSchema }, + `/store/order/${orderId}`, + + ) +}; +export const deleteOrder = (orderId: number, ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/store/order/${orderId}`, + + ) +}; +} diff --git a/test/generated/tmp-onerror/store/store.models.ts b/test/generated/tmp-onerror/store/store.models.ts new file mode 100644 index 0000000..3e4cc16 --- /dev/null +++ b/test/generated/tmp-onerror/store/store.models.ts @@ -0,0 +1,34 @@ +import { z } from "zod"; + +export namespace StoreModels { +/** + * OrderStatusEnumSchema + * @type { enum } + * @description Order Status. Example: `approved` + */ +export const OrderStatusEnumSchema = z.enum(["placed", "approved", "delivered"]); +export type OrderStatusEnum = z.infer; +export const OrderStatusEnum = OrderStatusEnumSchema.enum; + +/** + * OrderSchema + * @type { object } + * @property { integer } id Example: `10` + * @property { integer } petId Example: `198772` + * @property { integer } quantity Example: `7` + * @property { string } shipDate + * @property { string } status Order Status. Example: `approved` + * @property { boolean } complete + */ +export const OrderSchema = z.object({ id: z.int().nullable(), petId: z.int().nullable(), quantity: z.int().nullable(), shipDate: z.iso.datetime({ offset: true }).nullable(), status: OrderStatusEnumSchema.nullable(), complete: z.boolean().nullable() }).partial(); +export type Order = z.infer; + +/** + * GetInventoryResponseSchema + * @type { object } + * @property { integer } [key] + */ +export const GetInventoryResponseSchema = z.object({}).catchall(z.int()); +export type GetInventoryResponse = z.infer; + +} diff --git a/test/generated/tmp-onerror/store/store.queries.ts b/test/generated/tmp-onerror/store/store.queries.ts new file mode 100644 index 0000000..335a090 --- /dev/null +++ b/test/generated/tmp-onerror/store/store.queries.ts @@ -0,0 +1,109 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "../queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; +import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { StoreModels } from "./store.models"; +import { StoreApi } from "./store.api"; + +export namespace StoreQueries { +export const moduleName = QueryModule.store; + +export const keys = { + all: [moduleName] as const, + getInventory: () => [...keys.all, "/store/inventory", ] as const, + getOrderById: (orderId: number) => [...keys.all, "/store/order/:orderId", orderId] as const, +}; + +/** + * Query `useGetInventory` + * @summary Returns pet inventories by status + * @description Returns a map of status codes to quantities + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200] + */ +export const useGetInventory = (options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getInventory(), + queryFn: StoreApi.getInventory, + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `usePlaceOrder` + * @summary Place an order for a pet + * @description Place a new order in the store + * @param { StoreModels.Order } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, 405] + */ +export const usePlaceOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + StoreApi.placeOrder(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetOrderById` + * @summary Find purchase order by ID + * @description For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. + * @param { number } object.orderId Path parameter. ID of order that needs to be fetched + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400, 404] + */ +export const useGetOrderById = ({ orderId }: { orderId: number }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getOrderById(orderId), + queryFn: () => + StoreApi.getOrderById(orderId), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `useDeleteOrder` + * @summary Delete purchase order by ID + * @description For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * @param { number } mutation.orderId Path parameter. ID of the order that needs to be deleted + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [400, 404] + */ +export const useDeleteOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ orderId }) => + StoreApi.deleteOrder(orderId) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/tmp-onerror/useCrossTabQueryInvalidation.ts b/test/generated/tmp-onerror/useCrossTabQueryInvalidation.ts new file mode 100644 index 0000000..d74d707 --- /dev/null +++ b/test/generated/tmp-onerror/useCrossTabQueryInvalidation.ts @@ -0,0 +1,40 @@ +import type { QueryClient, QueryKey } from "@tanstack/react-query"; + +const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; + +/** + * Broadcasts a query invalidation event to all other open tabs via localStorage. + * + * @param queryKeys - An array of query keys to invalidate (array of arrays). + * + * NOTE: The `storage` event only fires in *other* tabs — the calling tab + * must invalidate its own queryClient separately if needed. + */ +export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { + localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); +}; + +/** + * Registers a one-time global `storage` event listener that reacts to + * cross-tab invalidation broadcasts. Safe to call from multiple hooks — + * only the first call sets up the listener. + */ +let isListenerSetUp = false; + +export const setupCrossTabListener = (queryClient: QueryClient) => { + if (isListenerSetUp) return; + isListenerSetUp = true; + + window.addEventListener("storage", (e: StorageEvent) => { + if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; + + try { + const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; + for (const queryKey of keys) { + queryClient.invalidateQueries({ queryKey }); + } + } catch { + // Ignore malformed payloads + } + }); +}; diff --git a/test/generated/tmp-onerror/useMutationEffects.ts b/test/generated/tmp-onerror/useMutationEffects.ts new file mode 100644 index 0000000..ed61406 --- /dev/null +++ b/test/generated/tmp-onerror/useMutationEffects.ts @@ -0,0 +1,95 @@ +import { useCallback, useEffect } from "react"; + +import { QueryKey, useQueryClient } from "@tanstack/react-query"; +import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; +import { QueryModule } from "./queryModules"; +import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; + +export interface MutationEffectsOptions { + invalidateCurrentModule?: boolean; + crossTabInvalidation?: boolean; + invalidationMap?: InvalidationMap; + invalidateModules?: QueryModule[]; + invalidateKeys?: QueryKey[]; + preferUpdate?: boolean; +} + +export interface UseMutationEffectsProps { + currentModule: QueryModule; +} + +export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { + const queryClient = useQueryClient(); + const config = OpenApiQueryConfig.useConfig(); + + useEffect(() => { + if (!config.crossTabInvalidation) return; + setupCrossTabListener(queryClient); + }, [queryClient, config.crossTabInvalidation]); + + const runMutationEffects = useCallback( + async ( + data: TData, + variables: TVariables, + options: MutationEffectsOptions = {}, + updateKeys?: QueryKey[], + ) => { + const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; + const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; + const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; + + const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => + keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); + const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => + prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); + const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); + + const shouldInvalidateQuery = (queryKey: QueryKey) => { + const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); + if (shouldUpdate && isUpdateKey) { + return false; + } + + const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; + const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); + const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + const isMappedKey = + !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + + return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; + }; + + const invalidatedQueryKeys: QueryKey[] = []; + + queryClient.invalidateQueries({ + predicate: ({ queryKey }) => { + const shouldInvalidate = shouldInvalidateQuery(queryKey); + + if (shouldInvalidate && config.crossTabInvalidation) { + invalidatedQueryKeys.push([...queryKey]); + } + + return shouldInvalidate; + }, + }); + + if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { + broadcastQueryInvalidation(invalidatedQueryKeys); + } + + if (shouldUpdate && updateKeys) { + updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); + } + }, + [ + queryClient, + currentModule, + config.preferUpdate, + config.invalidateCurrentModule, + config.invalidationMap, + config.crossTabInvalidation, + ], + ); + + return { runMutationEffects }; +} diff --git a/test/generated/tmp-onerror/user/user.api.ts b/test/generated/tmp-onerror/user/user.api.ts new file mode 100644 index 0000000..69c5f69 --- /dev/null +++ b/test/generated/tmp-onerror/user/user.api.ts @@ -0,0 +1,67 @@ +import { AppRestClient } from "../app-rest-client"; +import { z } from "zod"; +import { ZodExtended } from "../zod.extended"; +import { UserModels } from "./user.models"; + +export namespace UserApi { +export const create = (data: UserModels.User, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/user`, + ZodExtended.parse(UserModels.UserSchema.optional(), data), + + ) +}; +export const createWithListInput = (data: UserModels.CreateWithListInputBody, ) => { + return AppRestClient.post( + { resSchema: UserModels.UserSchema }, + `/user/createWithList`, + ZodExtended.parse(UserModels.CreateWithListInputBodySchema.optional(), data), + + ) +}; +export const login = (username?: string, password?: string, ) => { + return AppRestClient.get( + { resSchema: z.string() }, + `/user/login`, + { + params: { + username: ZodExtended.parse(z.string().nullish(), username, { type: "query", name: "username" }), + password: ZodExtended.parse(z.string().nullish(), password, { type: "query", name: "password" }), + }, + headers: { + 'Accept': 'application/xml', + }, + } + ) +}; +export const logout = () => { + return AppRestClient.get( + { resSchema: z.void() }, + `/user/logout`, + + ) +}; +export const getByName = (username: string, ) => { + return AppRestClient.get( + { resSchema: UserModels.UserSchema }, + `/user/${username}`, + + ) +}; +export const update = (username: string, data: UserModels.User, ) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/user/${username}`, + ZodExtended.parse(UserModels.UserSchema.optional(), data), + + ) +}; +export const deleteUser = (username: string, ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/user/${username}`, + + ) +}; +} diff --git a/test/generated/tmp-onerror/user/user.models.ts b/test/generated/tmp-onerror/user/user.models.ts new file mode 100644 index 0000000..c6a09e7 --- /dev/null +++ b/test/generated/tmp-onerror/user/user.models.ts @@ -0,0 +1,26 @@ +import { z } from "zod"; + +export namespace UserModels { +/** + * UserSchema + * @type { object } + * @property { integer } id Example: `10` + * @property { string } username Example: `theUser` + * @property { string } firstName Example: `John` + * @property { string } lastName Example: `James` + * @property { string } email Example: `john@email.com` + * @property { string } password Example: `12345` + * @property { string } phone Example: `12345` + * @property { integer } userStatus User Status. Example: `1` + */ +export const UserSchema = z.object({ id: z.int().nullable(), username: z.string().nullable(), firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), password: z.string().nullable(), phone: z.string().nullable(), userStatus: z.int().nullable() }).partial(); +export type User = z.infer; + +/** + * CreateWithListInputBodySchema + * @type { array } + */ +export const CreateWithListInputBodySchema = z.array(UserSchema); +export type CreateWithListInputBody = z.infer; + +} diff --git a/test/generated/tmp-onerror/user/user.queries.ts b/test/generated/tmp-onerror/user/user.queries.ts new file mode 100644 index 0000000..a3dabbc --- /dev/null +++ b/test/generated/tmp-onerror/user/user.queries.ts @@ -0,0 +1,185 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "../queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; +import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { UserModels } from "./user.models"; +import { UserApi } from "./user.api"; + +export namespace UserQueries { +export const moduleName = QueryModule.user; + +export const keys = { + all: [moduleName] as const, + login: (username?: string, password?: string) => [...keys.all, "/user/login", username, password] as const, + logout: () => [...keys.all, "/user/logout", ] as const, + getByName: (username: string) => [...keys.all, "/user/:username", username] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create user + * @description This can only be done by the logged in user. + * @param { UserModels.User } mutation.data Body parameter. Created user object + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [default] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + UserApi.create(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.logout()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateWithListInput` + * @summary Creates list of users with given input array + * @description Creates list of users with given input array + * @param { UserModels.CreateWithListInputBody } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, default] + */ +export const useCreateWithListInput = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + UserApi.createWithListInput(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useLogin` + * @summary Logs user into the system + * @param { string } object.username Query parameter. The user name for login + * @param { string } object.password Query parameter. The password for login in clear text + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400] + */ +export const useLogin = ({ username, password }: { username?: string, password?: string }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.login(username, password), + queryFn: () => + UserApi.login(username, password), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useLogout` + * @summary Logs out current logged in user session + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [default] + */ +export const useLogout = (options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.logout(), + queryFn: UserApi.logout, + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useGetByName` + * @summary Get user by user name + * @param { string } object.username Path parameter. The name that needs to be fetched. Use user1 for testing. + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400, 404] + */ +export const useGetByName = ({ username }: { username: string }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getByName(username), + queryFn: () => + UserApi.getByName(username), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update user + * @description This can only be done by the logged in user. + * @param { string } mutation.username Path parameter. name that need to be deleted + * @param { UserModels.User } mutation.data Body parameter. Update an existent user in the store + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [default] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ username, data }) => + UserApi.update(username, data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.logout()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteUser` + * @summary Delete user + * @description This can only be done by the logged in user. + * @param { string } mutation.username Path parameter. The name that needs to be deleted + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [400, 404] + */ +export const useDeleteUser = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ username }) => + UserApi.deleteUser(username) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.logout()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/tmp-onerror/zod.extended.ts b/test/generated/tmp-onerror/zod.extended.ts new file mode 100644 index 0000000..81e1e02 --- /dev/null +++ b/test/generated/tmp-onerror/zod.extended.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { ErrorHandler, SharedErrorHandler } from ""; + +export namespace ZodExtended { + interface ParseOptions { + type: "body" | "query"; + name?: string; + errorHandler?: ErrorHandler; + } + + export function parse( + schema: z.ZodType, + data: unknown, + { type, name, errorHandler }: ParseOptions = { type: "body" }, + ) { + try { + return schema.parse(data); + } catch (e) { + if (e instanceof z.ZodError) { + e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; + } + (errorHandler ?? SharedErrorHandler).rethrowError(e); + throw e; + } + } + + function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { + if (data === undefined || data === "" || enumSchema.options.length === 0) { + return true; + } + + const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; + const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; + return new RegExp(`^${commaSeparatedOptions}$`).test(data); + } + + export const sortExp = (enumSchema: z.ZodEnum) => + z.string().superRefine((arg, ctx) => { + if (!isSortExpValid(enumSchema, arg)) { + ctx.addIssue({ + code: "invalid_value", + message: "Invalid sorting string.", + values: [], + }); + } + }); +} From 45b6c41e732f32a8a08a05345a5126f9e4259b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Urban=20Lavbi=C4=8D?= Date: Thu, 26 Feb 2026 08:44:55 +0100 Subject: [PATCH 05/12] Add re-export from CommonModels support --- README.md | 3 + src/commands/generate.command.ts | 3 + src/commands/generate.ts | 1 + src/generators/const/options.const.ts | 1 + src/generators/core/getDataFromOpenAPIDoc.ts | 2 +- src/generators/generate/generateModels.ts | 105 ++++++++- src/generators/types/options.ts | 1 + .../utils/generate/generate.imports.utils.ts | 3 +- .../tmp-models-common-v2/acl/app.ability.ts | 5 + .../tmp-models-common-v2/acl/useAclCheck.ts | 21 ++ .../tmp-models-common-v2/app-rest-client.ts | 7 + .../common/common.models.ts | 135 +++++++++++ .../tmp-models-common-v2/pet/pet.api.ts | 92 ++++++++ .../tmp-models-common-v2/pet/pet.models.ts | 23 ++ .../tmp-models-common-v2/pet/pet.queries.ts | 214 ++++++++++++++++++ .../tmp-models-common-v2/queryModules.ts | 5 + .../tmp-models-common-v2/store/store.api.ts | 36 +++ .../store/store.models.ts | 11 + .../store/store.queries.ts | 109 +++++++++ .../useCrossTabQueryInvalidation.ts | 40 ++++ .../useMutationEffects.ts | 95 ++++++++ .../tmp-models-common-v2/user/user.api.ts | 67 ++++++ .../tmp-models-common-v2/user/user.models.ts | 8 + .../tmp-models-common-v2/user/user.queries.ts | 185 +++++++++++++++ .../tmp-models-common-v2/zod.extended.ts | 47 ++++ .../.openapi-codegen-cache.json | 1 + .../tmp-models-common/acl/app.ability.ts | 5 + .../tmp-models-common/acl/useAclCheck.ts | 21 ++ .../tmp-models-common/app-rest-client.ts | 7 + .../tmp-models-common/common/common.models.ts | 135 +++++++++++ .../tmp-models-common/pet/pet.api.ts | 92 ++++++++ .../tmp-models-common/pet/pet.models.ts | 23 ++ .../tmp-models-common/pet/pet.queries.ts | 214 ++++++++++++++++++ .../tmp-models-common/queryModules.ts | 5 + .../tmp-models-common/store/store.api.ts | 36 +++ .../tmp-models-common/store/store.models.ts | 11 + .../tmp-models-common/store/store.queries.ts | 109 +++++++++ .../useCrossTabQueryInvalidation.ts | 40 ++++ .../tmp-models-common/useMutationEffects.ts | 95 ++++++++ .../tmp-models-common/user/user.api.ts | 67 ++++++ .../tmp-models-common/user/user.models.ts | 8 + .../tmp-models-common/user/user.queries.ts | 185 +++++++++++++++ .../tmp-models-common/zod.extended.ts | 47 ++++ 43 files changed, 2316 insertions(+), 4 deletions(-) create mode 100644 test/generated/tmp-models-common-v2/acl/app.ability.ts create mode 100644 test/generated/tmp-models-common-v2/acl/useAclCheck.ts create mode 100644 test/generated/tmp-models-common-v2/app-rest-client.ts create mode 100644 test/generated/tmp-models-common-v2/common/common.models.ts create mode 100644 test/generated/tmp-models-common-v2/pet/pet.api.ts create mode 100644 test/generated/tmp-models-common-v2/pet/pet.models.ts create mode 100644 test/generated/tmp-models-common-v2/pet/pet.queries.ts create mode 100644 test/generated/tmp-models-common-v2/queryModules.ts create mode 100644 test/generated/tmp-models-common-v2/store/store.api.ts create mode 100644 test/generated/tmp-models-common-v2/store/store.models.ts create mode 100644 test/generated/tmp-models-common-v2/store/store.queries.ts create mode 100644 test/generated/tmp-models-common-v2/useCrossTabQueryInvalidation.ts create mode 100644 test/generated/tmp-models-common-v2/useMutationEffects.ts create mode 100644 test/generated/tmp-models-common-v2/user/user.api.ts create mode 100644 test/generated/tmp-models-common-v2/user/user.models.ts create mode 100644 test/generated/tmp-models-common-v2/user/user.queries.ts create mode 100644 test/generated/tmp-models-common-v2/zod.extended.ts create mode 100644 test/generated/tmp-models-common/.openapi-codegen-cache.json create mode 100644 test/generated/tmp-models-common/acl/app.ability.ts create mode 100644 test/generated/tmp-models-common/acl/useAclCheck.ts create mode 100644 test/generated/tmp-models-common/app-rest-client.ts create mode 100644 test/generated/tmp-models-common/common/common.models.ts create mode 100644 test/generated/tmp-models-common/pet/pet.api.ts create mode 100644 test/generated/tmp-models-common/pet/pet.models.ts create mode 100644 test/generated/tmp-models-common/pet/pet.queries.ts create mode 100644 test/generated/tmp-models-common/queryModules.ts create mode 100644 test/generated/tmp-models-common/store/store.api.ts create mode 100644 test/generated/tmp-models-common/store/store.models.ts create mode 100644 test/generated/tmp-models-common/store/store.queries.ts create mode 100644 test/generated/tmp-models-common/useCrossTabQueryInvalidation.ts create mode 100644 test/generated/tmp-models-common/useMutationEffects.ts create mode 100644 test/generated/tmp-models-common/user/user.api.ts create mode 100644 test/generated/tmp-models-common/user/user.models.ts create mode 100644 test/generated/tmp-models-common/user/user.queries.ts create mode 100644 test/generated/tmp-models-common/zod.extended.ts diff --git a/README.md b/README.md index 7e82c25..d7e90cd 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ yarn openapi-codegen generate --config my-config.ts --tsPath (Requires `--importPath` to be 'ts') Typescript import path (default: '@/data') --removeOperationPrefixEndingWith Remove operation name prefixes that end with the specified string (default: 'Controller_') --extractEnums Extract enums into separate Zod schemas (default: true) + --modelsInCommon Keep all schema declarations in defaultTag models and emit per-module proxy exports (default: false) --replaceOptionalWithNullish Replace `.optional()` chains with `.nullish()` in generated Zod schemas (default: false) --axiosRequestConfig Include Axios request config parameters in query hooks (default: false) @@ -221,6 +222,8 @@ const config: OpenAPICodegenConfig = { // inlineEndpointsExcludeModules: ["Users", "Billing"], // 3) Models-only mode: generate only *.models.ts files // modelsOnly: true, + // 4) Keep all model declarations in common.models and generate per-module model proxies + // modelsInCommon: true, }; ``` diff --git a/src/commands/generate.command.ts b/src/commands/generate.command.ts index e484555..f3181ad 100644 --- a/src/commands/generate.command.ts +++ b/src/commands/generate.command.ts @@ -46,6 +46,9 @@ class GenerateOptions implements GenerateParams { @YargOption({ envAlias: "extractEnums", type: "boolean" }) extractEnums?: boolean; + @YargOption({ envAlias: "modelsInCommon", type: "boolean" }) + modelsInCommon?: boolean; + @YargOption({ envAlias: "removeOperationPrefixEndingWith" }) removeOperationPrefixEndingWith?: string; diff --git a/src/commands/generate.ts b/src/commands/generate.ts index 24c81ae..421b079 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -24,6 +24,7 @@ export type GenerateParams = { | "removeOperationPrefixEndingWith" | "importPath" | "extractEnums" + | "modelsInCommon" | "acl" | "checkAcl" | "standalone" diff --git a/src/generators/const/options.const.ts b/src/generators/const/options.const.ts index 779907c..a6649ac 100644 --- a/src/generators/const/options.const.ts +++ b/src/generators/const/options.const.ts @@ -45,6 +45,7 @@ export const DEFAULT_GENERATE_OPTIONS: GenerateOptions = { // Zod options schemaSuffix: SCHEMA_SUFFIX, enumSuffix: ENUM_SUFFIX, + modelsInCommon: false, withDefaultValues: true, extractEnums: true, replaceOptionalWithNullish: false, diff --git a/src/generators/core/getDataFromOpenAPIDoc.ts b/src/generators/core/getDataFromOpenAPIDoc.ts index 98c7b19..d4aa46c 100644 --- a/src/generators/core/getDataFromOpenAPIDoc.ts +++ b/src/generators/core/getDataFromOpenAPIDoc.ts @@ -54,7 +54,7 @@ function splitDataByTags({ }); Object.entries(zodSchemas).forEach(([zodSchemaName, zodSchemaCode]) => { - const tag = resolver.getTagByZodSchemaName(zodSchemaName); + const tag = options.modelsInCommon ? options.defaultTag : resolver.getTagByZodSchemaName(zodSchemaName); if (tag) { getTagElement(tag, data).zodSchemas[zodSchemaName] = zodSchemaCode; } diff --git a/src/generators/generate/generateModels.ts b/src/generators/generate/generateModels.ts index 68879d5..5c498fb 100644 --- a/src/generators/generate/generateModels.ts +++ b/src/generators/generate/generateModels.ts @@ -1,7 +1,9 @@ import { ZOD_IMPORT } from "@/generators/const/zod.const"; import { getZodSchemaRefs } from "@/generators/core/zod/getZodSchemaRefs"; +import { Endpoint } from "@/generators/types/endpoint"; import { GenerateType, GenerateTypeParams, GenerateZodSchemaData, Import } from "@/generators/types/generate"; -import { getModelsImports } from "@/generators/utils/generate/generate.imports.utils"; +import { getModelsImports, getImportPath } from "@/generators/utils/generate/generate.imports.utils"; +import { getTagImportPath } from "@/generators/utils/generate/generate.utils"; import { getZodSchemaDescription, getZodSchemaInferedTypeName, @@ -9,9 +11,14 @@ import { getZodSchemaType, } from "@/generators/utils/generate/generate.zod.utils"; import { getNamespaceName } from "@/generators/utils/namespace.utils"; -import { isEnumZodSchema } from "@/generators/utils/zod-schema.utils"; +import { isEnumZodSchema, isNamedZodSchema } from "@/generators/utils/zod-schema.utils"; +import { getUniqueArray } from "@/generators/utils/array.utils"; export function generateModels({ resolver, data, tag }: GenerateTypeParams) { + if (resolver.options.modelsInCommon && resolver.options.splitByTags && tag !== resolver.options.defaultTag) { + return renderModelsProxy({ resolver, data, tag }); + } + const zodSchemas = data.get(tag)?.zodSchemas; if (!zodSchemas || Object.keys(zodSchemas).length === 0) { return; @@ -72,6 +79,100 @@ export function generateModels({ resolver, data, tag }: GenerateTypeParams) { return lines.join("\n").trimEnd() + "\n"; } +function renderModelsProxy({ resolver, data, tag }: GenerateTypeParams) { + const commonZodSchemas = data.get(resolver.options.defaultTag)?.zodSchemas ?? {}; + const endpoints = data.get(tag)?.endpoints ?? []; + const schemaNames = getUsedSchemaNames({ resolver, endpoints }).filter((schemaName) => Boolean(commonZodSchemas[schemaName])); + if (schemaNames.length === 0) { + return; + } + + const modelsNamespace = getNamespaceName({ type: GenerateType.Models, tag, options: resolver.options }); + const commonNamespace = getNamespaceName({ + type: GenerateType.Models, + tag: resolver.options.defaultTag, + options: resolver.options, + }); + const commonModelsPath = `${getImportPath(resolver.options)}${getTagImportPath({ + type: GenerateType.Models, + tag: resolver.options.defaultTag, + includeTagDir: true, + options: resolver.options, + })}`; + const inferredTypeNames = schemaNames.map((schemaName) => getZodSchemaInferedTypeName(schemaName, resolver.options)); + const enumInferredTypeNames = schemaNames + .filter((schemaName) => isEnumZodSchema(commonZodSchemas[schemaName] ?? "")) + .map((schemaName) => getZodSchemaInferedTypeName(schemaName, resolver.options)); + + if (resolver.options.tsNamespaces) { + const lines: string[] = []; + lines.push(`import { ${commonNamespace} } from "${commonModelsPath}";`); + lines.push(""); + lines.push(`export namespace ${modelsNamespace} {`); + for (const schemaName of schemaNames) { + lines.push(` export const ${schemaName} = ${commonNamespace}.${schemaName};`); + } + for (const typeName of inferredTypeNames) { + lines.push(` export type ${typeName} = ${commonNamespace}.${typeName};`); + } + for (const enumName of enumInferredTypeNames) { + lines.push(` export const ${enumName} = ${commonNamespace}.${enumName};`); + } + lines.push("}"); + lines.push(""); + return lines.join("\n"); + } + + const valueExports = getUniqueArray([...schemaNames, ...enumInferredTypeNames]); + + const lines: string[] = []; + if (valueExports.length > 0) { + lines.push(`export { ${valueExports.join(", ")} } from "${commonModelsPath}";`); + } + if (inferredTypeNames.length > 0) { + lines.push(`export type { ${inferredTypeNames.join(", ")} } from "${commonModelsPath}";`); + } + + return lines.join("\n") + "\n"; +} + +function getUsedSchemaNames({ resolver, endpoints }: { resolver: GenerateTypeParams["resolver"]; endpoints: Endpoint[] }) { + const usedSchemaNames = new Set(); + const queue: string[] = []; + + const enqueue = (schemaName?: string) => { + if (!schemaName || !isNamedZodSchema(schemaName) || usedSchemaNames.has(schemaName)) { + return; + } + usedSchemaNames.add(schemaName); + queue.push(schemaName); + }; + + for (const endpoint of endpoints) { + enqueue(endpoint.response); + for (const error of endpoint.errors) { + enqueue(error.zodSchema); + } + for (const param of endpoint.parameters) { + enqueue(param.zodSchema); + enqueue(param.parameterSortingEnumSchemaName); + } + } + + while (queue.length > 0) { + const schemaName = queue.shift(); + if (!schemaName) { + continue; + } + const refs = getZodSchemaRefs(resolver, schemaName); + for (const ref of refs) { + enqueue(ref); + } + } + + return Array.from(usedSchemaNames); +} + function renderImport(importData: Import) { const names = [ ...(importData.defaultImport ? [importData.defaultImport] : []), diff --git a/src/generators/types/options.ts b/src/generators/types/options.ts index 582d488..1f15007 100644 --- a/src/generators/types/options.ts +++ b/src/generators/types/options.ts @@ -3,6 +3,7 @@ import { GenerateType } from "./generate"; interface ZodGenerateOptions { schemaSuffix: string; enumSuffix: string; + modelsInCommon?: boolean; withImplicitRequiredProps?: boolean; withDefaultValues?: boolean; withDescription?: boolean; diff --git a/src/generators/utils/generate/generate.imports.utils.ts b/src/generators/utils/generate/generate.imports.utils.ts index a9b467d..ed16361 100644 --- a/src/generators/utils/generate/generate.imports.utils.ts +++ b/src/generators/utils/generate/generate.imports.utils.ts @@ -181,7 +181,8 @@ function getImports({ }) { const imports = new Map(); entities.forEach((entity) => { - const tag = getTag(entity); + const tag = + type === GenerateType.Models && options.modelsInCommon && options.splitByTags ? currentTag : getTag(entity); if (!imports.has(tag)) { const sameTagDir = currentTag === tag; imports.set(tag, { diff --git a/test/generated/tmp-models-common-v2/acl/app.ability.ts b/test/generated/tmp-models-common-v2/acl/app.ability.ts new file mode 100644 index 0000000..6c06fc9 --- /dev/null +++ b/test/generated/tmp-models-common-v2/acl/app.ability.ts @@ -0,0 +1,5 @@ +import { PureAbility, AbilityTuple, Subject } from "@casl/ability"; + +export type AppAbilities = AbilityTuple; + +export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/tmp-models-common-v2/acl/useAclCheck.ts b/test/generated/tmp-models-common-v2/acl/useAclCheck.ts new file mode 100644 index 0000000..5e19407 --- /dev/null +++ b/test/generated/tmp-models-common-v2/acl/useAclCheck.ts @@ -0,0 +1,21 @@ +import { AbilityTuple } from "@casl/ability"; +import { type ErrorHandler, SharedErrorHandler } from ""; +import { AbilityContext } from ""; +import { useCallback } from "react"; +import { AppAbilities } from "../acl/app.ability"; + +interface UseAclCheckProps { + errorHandler?: ErrorHandler; +} + +export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { + const ability = AbilityContext.useAbility(); + + const checkAcl = useCallback((appAbility: AppAbilities) => { + if (!ability.can(...(appAbility as AbilityTuple))) { + (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); + } + }, [ability, errorHandler]); + + return { checkAcl }; +} diff --git a/test/generated/tmp-models-common-v2/app-rest-client.ts b/test/generated/tmp-models-common-v2/app-rest-client.ts new file mode 100644 index 0000000..493b224 --- /dev/null +++ b/test/generated/tmp-models-common-v2/app-rest-client.ts @@ -0,0 +1,7 @@ +import { RestClient } from "@povio/openapi-codegen-cli"; + +export const AppRestClient = new RestClient({ + config: { + baseURL: "https://petstore3.swagger.io/api/v3" + }, +}); diff --git a/test/generated/tmp-models-common-v2/common/common.models.ts b/test/generated/tmp-models-common-v2/common/common.models.ts new file mode 100644 index 0000000..ab3e7a4 --- /dev/null +++ b/test/generated/tmp-models-common-v2/common/common.models.ts @@ -0,0 +1,135 @@ +import { z } from "zod"; + +export namespace CommonModels { +/** + * FindByStatusStatusEnumSchema + * @type { enum } + * @description pet status in the store. Default: `available` + */ +export const FindByStatusStatusEnumSchema = z.enum(["available", "pending", "sold"]); +export type FindByStatusStatusEnum = z.infer; +export const FindByStatusStatusEnum = FindByStatusStatusEnumSchema.enum; + +/** + * OrderStatusEnumSchema + * @type { enum } + * @description Order Status. Example: `approved` + */ +export const OrderStatusEnumSchema = z.enum(["placed", "approved", "delivered"]); +export type OrderStatusEnum = z.infer; +export const OrderStatusEnum = OrderStatusEnumSchema.enum; + +/** + * CategorySchema + * @type { object } + * @property { integer } id Example: `1` + * @property { string } name Example: `Dogs` + */ +export const CategorySchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); +export type Category = z.infer; + +/** + * TagSchema + * @type { object } + * @property { integer } id + * @property { string } name + */ +export const TagSchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); +export type Tag = z.infer; + +/** + * PetSchema + * @type { object } + * @property { integer } id Example: `10` + * @property { string } name Example: `doggie` + * @property { PetModels.Category } category + * @property { string[] } photoUrls + * @property { PetModels.Tag[] } tags + * @property { string } status pet status in the store + */ +export const PetSchema = z.object({ id: z.int().nullish(), name: z.string(), category: CategorySchema.nullish(), photoUrls: z.array(z.string()), tags: z.array(TagSchema).nullish(), status: FindByStatusStatusEnumSchema.nullish() }); +export type Pet = z.infer; + +/** + * OrderSchema + * @type { object } + * @property { integer } id Example: `10` + * @property { integer } petId Example: `198772` + * @property { integer } quantity Example: `7` + * @property { string } shipDate + * @property { string } status Order Status. Example: `approved` + * @property { boolean } complete + */ +export const OrderSchema = z.object({ id: z.int().nullable(), petId: z.int().nullable(), quantity: z.int().nullable(), shipDate: z.iso.datetime({ offset: true }).nullable(), status: OrderStatusEnumSchema.nullable(), complete: z.boolean().nullable() }).partial(); +export type Order = z.infer; + +/** + * UserSchema + * @type { object } + * @property { integer } id Example: `10` + * @property { string } username Example: `theUser` + * @property { string } firstName Example: `John` + * @property { string } lastName Example: `James` + * @property { string } email Example: `john@email.com` + * @property { string } password Example: `12345` + * @property { string } phone Example: `12345` + * @property { integer } userStatus User Status. Example: `1` + */ +export const UserSchema = z.object({ id: z.int().nullable(), username: z.string().nullable(), firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), password: z.string().nullable(), phone: z.string().nullable(), userStatus: z.int().nullable() }).partial(); +export type User = z.infer; + +/** + * ApiResponseSchema + * @type { object } + * @property { integer } code + * @property { string } type + * @property { string } message + */ +export const ApiResponseSchema = z.object({ code: z.int().nullable(), type: z.string().nullable(), message: z.string().nullable() }).partial(); +export type ApiResponse = z.infer; + +/** + * FindByStatusStatusParamSchema + * @type { string } + * @description Default: `available` + */ +export const FindByStatusStatusParamSchema = FindByStatusStatusEnumSchema.nullish().default("available"); +export type FindByStatusStatusParam = z.infer; + +/** + * FindByStatusResponseSchema + * @type { array } + */ +export const FindByStatusResponseSchema = z.array(PetSchema); +export type FindByStatusResponse = z.infer; + +/** + * FindByTagsTagsParamSchema + * @type { array } + */ +export const FindByTagsTagsParamSchema = z.array(z.string()).nullish(); +export type FindByTagsTagsParam = z.infer; + +/** + * FindByTagsResponseSchema + * @type { array } + */ +export const FindByTagsResponseSchema = z.array(PetSchema); +export type FindByTagsResponse = z.infer; + +/** + * GetInventoryResponseSchema + * @type { object } + * @property { integer } [key] + */ +export const GetInventoryResponseSchema = z.object({}).catchall(z.int()); +export type GetInventoryResponse = z.infer; + +/** + * CreateWithListInputBodySchema + * @type { array } + */ +export const CreateWithListInputBodySchema = z.array(UserSchema); +export type CreateWithListInputBody = z.infer; + +} diff --git a/test/generated/tmp-models-common-v2/pet/pet.api.ts b/test/generated/tmp-models-common-v2/pet/pet.api.ts new file mode 100644 index 0000000..94fd0ed --- /dev/null +++ b/test/generated/tmp-models-common-v2/pet/pet.api.ts @@ -0,0 +1,92 @@ +import { AppRestClient } from "../app-rest-client"; +import { z } from "zod"; +import { ZodExtended } from "../zod.extended"; +import { PetModels } from "./pet.models"; + +export namespace PetApi { +export const update = (data: PetModels.Pet, ) => { + return AppRestClient.put( + { resSchema: PetModels.PetSchema }, + `/pet`, + ZodExtended.parse(PetModels.PetSchema, data), + + ) +}; +export const add = (data: PetModels.Pet, ) => { + return AppRestClient.post( + { resSchema: PetModels.PetSchema }, + `/pet`, + ZodExtended.parse(PetModels.PetSchema, data), + + ) +}; +export const findByStatus = (status?: PetModels.FindByStatusStatusParam, ) => { + return AppRestClient.get( + { resSchema: PetModels.FindByStatusResponseSchema }, + `/pet/findByStatus`, + { + params: { + status: ZodExtended.parse(PetModels.FindByStatusStatusParamSchema.optional(), status, { type: "query", name: "status" }), + }, + } + ) +}; +export const findByTags = (tags?: PetModels.FindByTagsTagsParam, ) => { + return AppRestClient.get( + { resSchema: PetModels.FindByTagsResponseSchema }, + `/pet/findByTags`, + { + params: { + tags: ZodExtended.parse(PetModels.FindByTagsTagsParamSchema.optional(), tags, { type: "query", name: "tags" }), + }, + } + ) +}; +export const getById = (petId: number, ) => { + return AppRestClient.get( + { resSchema: PetModels.PetSchema }, + `/pet/${petId}`, + + ) +}; +export const updateWithForm = (petId: number, name: string, status: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/pet/${petId}`, + undefined, + { + params: { + name: ZodExtended.parse(z.string().nullish(), name, { type: "query", name: "name" }), + status: ZodExtended.parse(z.string().nullish(), status, { type: "query", name: "status" }), + }, + } + ) +}; +export const deletePet = (petId: number, api_key?: string, ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/pet/${petId}`, + undefined, + { + headers: { + 'api_key': api_key, + }, + } + ) +}; +export const uploadFile = (petId: number, data: string, additionalMetadata?: string, ) => { + return AppRestClient.post( + { resSchema: PetModels.ApiResponseSchema }, + `/pet/${petId}/uploadImage`, + ZodExtended.parse(z.instanceof(Blob), data), + { + params: { + additionalMetadata: ZodExtended.parse(z.string().nullish(), additionalMetadata, { type: "query", name: "additionalMetadata" }), + }, + headers: { + 'Content-Type': 'application/octet-stream', + }, + } + ) +}; +} diff --git a/test/generated/tmp-models-common-v2/pet/pet.models.ts b/test/generated/tmp-models-common-v2/pet/pet.models.ts new file mode 100644 index 0000000..4047409 --- /dev/null +++ b/test/generated/tmp-models-common-v2/pet/pet.models.ts @@ -0,0 +1,23 @@ +import { CommonModels } from "../common/common.models"; + +export namespace PetModels { + export const PetSchema = CommonModels.PetSchema; + export const FindByStatusResponseSchema = CommonModels.FindByStatusResponseSchema; + export const FindByStatusStatusParamSchema = CommonModels.FindByStatusStatusParamSchema; + export const FindByTagsResponseSchema = CommonModels.FindByTagsResponseSchema; + export const FindByTagsTagsParamSchema = CommonModels.FindByTagsTagsParamSchema; + export const ApiResponseSchema = CommonModels.ApiResponseSchema; + export const CategorySchema = CommonModels.CategorySchema; + export const TagSchema = CommonModels.TagSchema; + export const FindByStatusStatusEnumSchema = CommonModels.FindByStatusStatusEnumSchema; + export type Pet = CommonModels.Pet; + export type FindByStatusResponse = CommonModels.FindByStatusResponse; + export type FindByStatusStatusParam = CommonModels.FindByStatusStatusParam; + export type FindByTagsResponse = CommonModels.FindByTagsResponse; + export type FindByTagsTagsParam = CommonModels.FindByTagsTagsParam; + export type ApiResponse = CommonModels.ApiResponse; + export type Category = CommonModels.Category; + export type Tag = CommonModels.Tag; + export type FindByStatusStatusEnum = CommonModels.FindByStatusStatusEnum; + export const FindByStatusStatusEnum = CommonModels.FindByStatusStatusEnum; +} diff --git a/test/generated/tmp-models-common-v2/pet/pet.queries.ts b/test/generated/tmp-models-common-v2/pet/pet.queries.ts new file mode 100644 index 0000000..b19320b --- /dev/null +++ b/test/generated/tmp-models-common-v2/pet/pet.queries.ts @@ -0,0 +1,214 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "../queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; +import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PetModels } from "./pet.models"; +import { PetApi } from "./pet.api"; + +export namespace PetQueries { +export const moduleName = QueryModule.pet; + +export const keys = { + all: [moduleName] as const, + findByStatus: (status?: PetModels.FindByStatusStatusParam) => [...keys.all, "/pet/findByStatus", status] as const, + findByTags: (tags?: PetModels.FindByTagsTagsParam) => [...keys.all, "/pet/findByTags", tags] as const, + getById: (petId: number) => [...keys.all, "/pet/:petId", petId] as const, +}; + +/** + * Mutation `useUpdate` + * @summary Update an existing pet + * @description Update an existing pet by Id + * @param { PetModels.Pet } mutation.data Body parameter. Update an existent pet in the store + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, 400, 404, 405] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + PetApi.update(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useAdd` + * @summary Add a new pet to the store + * @description Add a new pet to the store + * @param { PetModels.Pet } mutation.data Body parameter. Create a new pet in the store + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, 405] + */ +export const useAdd = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + PetApi.add(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindByStatus` + * @summary Finds Pets by status + * @description Multiple status values can be provided with comma separated strings + * @param { PetModels.FindByStatusStatusParam } object.status Query parameter. Status values that need to be considered for filter. Default: `available` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400] + */ +export const useFindByStatus = ({ status }: { status?: PetModels.FindByStatusStatusParam }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.findByStatus(status), + queryFn: () => + PetApi.findByStatus(status), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useFindByTags` + * @summary Finds Pets by tags + * @description Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * @param { PetModels.FindByTagsTagsParam } object.tags Query parameter. Tags to filter by + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400] + */ +export const useFindByTags = ({ tags }: { tags?: PetModels.FindByTagsTagsParam }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.findByTags(tags), + queryFn: () => + PetApi.findByTags(tags), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useGetById` + * @summary Find pet by ID + * @description Returns a single pet + * @param { number } object.petId Path parameter. ID of pet to return + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400, 404] + */ +export const useGetById = ({ petId }: { petId: number }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getById(petId), + queryFn: () => + PetApi.getById(petId), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `useUpdateWithForm` + * @summary Updates a pet in the store with form data + * @param { number } mutation.petId Path parameter. ID of pet that needs to be updated + * @param { string } mutation.name Query parameter. Name of pet that needs to be updated + * @param { string } mutation.status Query parameter. Status of pet that needs to be updated + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [405] + */ +export const useUpdateWithForm = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ petId, name, status }) => + PetApi.updateWithForm(petId, name, status) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeletePet` + * @summary Deletes a pet + * @description delete a pet + * @param { number } mutation.petId Path parameter. Pet id to delete + * @param { string } mutation.api_key Header parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [400] + */ +export const useDeletePet = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ petId, api_key }) => + PetApi.deletePet(petId, api_key) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUploadFile` + * @summary uploads an image + * @param { number } mutation.petId Path parameter. ID of pet to update + * @param { string } mutation.data Body parameter + * @param { string } mutation.additionalMetadata Query parameter. Additional Metadata + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200] + */ +export const useUploadFile = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ petId, data, additionalMetadata }) => + PetApi.uploadFile(petId, data, additionalMetadata) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/tmp-models-common-v2/queryModules.ts b/test/generated/tmp-models-common-v2/queryModules.ts new file mode 100644 index 0000000..c815cfe --- /dev/null +++ b/test/generated/tmp-models-common-v2/queryModules.ts @@ -0,0 +1,5 @@ +export const enum QueryModule { + pet = "PetQueries", + store = "StoreQueries", + user = "UserQueries", +} \ No newline at end of file diff --git a/test/generated/tmp-models-common-v2/store/store.api.ts b/test/generated/tmp-models-common-v2/store/store.api.ts new file mode 100644 index 0000000..7a4712b --- /dev/null +++ b/test/generated/tmp-models-common-v2/store/store.api.ts @@ -0,0 +1,36 @@ +import { AppRestClient } from "../app-rest-client"; +import { z } from "zod"; +import { ZodExtended } from "../zod.extended"; +import { StoreModels } from "./store.models"; + +export namespace StoreApi { +export const getInventory = () => { + return AppRestClient.get( + { resSchema: StoreModels.GetInventoryResponseSchema }, + `/store/inventory`, + + ) +}; +export const placeOrder = (data: StoreModels.Order, ) => { + return AppRestClient.post( + { resSchema: StoreModels.OrderSchema }, + `/store/order`, + ZodExtended.parse(StoreModels.OrderSchema.optional(), data), + + ) +}; +export const getOrderById = (orderId: number, ) => { + return AppRestClient.get( + { resSchema: StoreModels.OrderSchema }, + `/store/order/${orderId}`, + + ) +}; +export const deleteOrder = (orderId: number, ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/store/order/${orderId}`, + + ) +}; +} diff --git a/test/generated/tmp-models-common-v2/store/store.models.ts b/test/generated/tmp-models-common-v2/store/store.models.ts new file mode 100644 index 0000000..2d9d5c7 --- /dev/null +++ b/test/generated/tmp-models-common-v2/store/store.models.ts @@ -0,0 +1,11 @@ +import { CommonModels } from "../common/common.models"; + +export namespace StoreModels { + export const GetInventoryResponseSchema = CommonModels.GetInventoryResponseSchema; + export const OrderSchema = CommonModels.OrderSchema; + export const OrderStatusEnumSchema = CommonModels.OrderStatusEnumSchema; + export type GetInventoryResponse = CommonModels.GetInventoryResponse; + export type Order = CommonModels.Order; + export type OrderStatusEnum = CommonModels.OrderStatusEnum; + export const OrderStatusEnum = CommonModels.OrderStatusEnum; +} diff --git a/test/generated/tmp-models-common-v2/store/store.queries.ts b/test/generated/tmp-models-common-v2/store/store.queries.ts new file mode 100644 index 0000000..335a090 --- /dev/null +++ b/test/generated/tmp-models-common-v2/store/store.queries.ts @@ -0,0 +1,109 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "../queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; +import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { StoreModels } from "./store.models"; +import { StoreApi } from "./store.api"; + +export namespace StoreQueries { +export const moduleName = QueryModule.store; + +export const keys = { + all: [moduleName] as const, + getInventory: () => [...keys.all, "/store/inventory", ] as const, + getOrderById: (orderId: number) => [...keys.all, "/store/order/:orderId", orderId] as const, +}; + +/** + * Query `useGetInventory` + * @summary Returns pet inventories by status + * @description Returns a map of status codes to quantities + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200] + */ +export const useGetInventory = (options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getInventory(), + queryFn: StoreApi.getInventory, + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `usePlaceOrder` + * @summary Place an order for a pet + * @description Place a new order in the store + * @param { StoreModels.Order } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, 405] + */ +export const usePlaceOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + StoreApi.placeOrder(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetOrderById` + * @summary Find purchase order by ID + * @description For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. + * @param { number } object.orderId Path parameter. ID of order that needs to be fetched + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400, 404] + */ +export const useGetOrderById = ({ orderId }: { orderId: number }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getOrderById(orderId), + queryFn: () => + StoreApi.getOrderById(orderId), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `useDeleteOrder` + * @summary Delete purchase order by ID + * @description For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * @param { number } mutation.orderId Path parameter. ID of the order that needs to be deleted + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [400, 404] + */ +export const useDeleteOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ orderId }) => + StoreApi.deleteOrder(orderId) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/tmp-models-common-v2/useCrossTabQueryInvalidation.ts b/test/generated/tmp-models-common-v2/useCrossTabQueryInvalidation.ts new file mode 100644 index 0000000..d74d707 --- /dev/null +++ b/test/generated/tmp-models-common-v2/useCrossTabQueryInvalidation.ts @@ -0,0 +1,40 @@ +import type { QueryClient, QueryKey } from "@tanstack/react-query"; + +const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; + +/** + * Broadcasts a query invalidation event to all other open tabs via localStorage. + * + * @param queryKeys - An array of query keys to invalidate (array of arrays). + * + * NOTE: The `storage` event only fires in *other* tabs — the calling tab + * must invalidate its own queryClient separately if needed. + */ +export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { + localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); +}; + +/** + * Registers a one-time global `storage` event listener that reacts to + * cross-tab invalidation broadcasts. Safe to call from multiple hooks — + * only the first call sets up the listener. + */ +let isListenerSetUp = false; + +export const setupCrossTabListener = (queryClient: QueryClient) => { + if (isListenerSetUp) return; + isListenerSetUp = true; + + window.addEventListener("storage", (e: StorageEvent) => { + if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; + + try { + const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; + for (const queryKey of keys) { + queryClient.invalidateQueries({ queryKey }); + } + } catch { + // Ignore malformed payloads + } + }); +}; diff --git a/test/generated/tmp-models-common-v2/useMutationEffects.ts b/test/generated/tmp-models-common-v2/useMutationEffects.ts new file mode 100644 index 0000000..ed61406 --- /dev/null +++ b/test/generated/tmp-models-common-v2/useMutationEffects.ts @@ -0,0 +1,95 @@ +import { useCallback, useEffect } from "react"; + +import { QueryKey, useQueryClient } from "@tanstack/react-query"; +import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; +import { QueryModule } from "./queryModules"; +import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; + +export interface MutationEffectsOptions { + invalidateCurrentModule?: boolean; + crossTabInvalidation?: boolean; + invalidationMap?: InvalidationMap; + invalidateModules?: QueryModule[]; + invalidateKeys?: QueryKey[]; + preferUpdate?: boolean; +} + +export interface UseMutationEffectsProps { + currentModule: QueryModule; +} + +export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { + const queryClient = useQueryClient(); + const config = OpenApiQueryConfig.useConfig(); + + useEffect(() => { + if (!config.crossTabInvalidation) return; + setupCrossTabListener(queryClient); + }, [queryClient, config.crossTabInvalidation]); + + const runMutationEffects = useCallback( + async ( + data: TData, + variables: TVariables, + options: MutationEffectsOptions = {}, + updateKeys?: QueryKey[], + ) => { + const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; + const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; + const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; + + const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => + keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); + const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => + prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); + const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); + + const shouldInvalidateQuery = (queryKey: QueryKey) => { + const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); + if (shouldUpdate && isUpdateKey) { + return false; + } + + const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; + const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); + const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + const isMappedKey = + !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + + return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; + }; + + const invalidatedQueryKeys: QueryKey[] = []; + + queryClient.invalidateQueries({ + predicate: ({ queryKey }) => { + const shouldInvalidate = shouldInvalidateQuery(queryKey); + + if (shouldInvalidate && config.crossTabInvalidation) { + invalidatedQueryKeys.push([...queryKey]); + } + + return shouldInvalidate; + }, + }); + + if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { + broadcastQueryInvalidation(invalidatedQueryKeys); + } + + if (shouldUpdate && updateKeys) { + updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); + } + }, + [ + queryClient, + currentModule, + config.preferUpdate, + config.invalidateCurrentModule, + config.invalidationMap, + config.crossTabInvalidation, + ], + ); + + return { runMutationEffects }; +} diff --git a/test/generated/tmp-models-common-v2/user/user.api.ts b/test/generated/tmp-models-common-v2/user/user.api.ts new file mode 100644 index 0000000..69c5f69 --- /dev/null +++ b/test/generated/tmp-models-common-v2/user/user.api.ts @@ -0,0 +1,67 @@ +import { AppRestClient } from "../app-rest-client"; +import { z } from "zod"; +import { ZodExtended } from "../zod.extended"; +import { UserModels } from "./user.models"; + +export namespace UserApi { +export const create = (data: UserModels.User, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/user`, + ZodExtended.parse(UserModels.UserSchema.optional(), data), + + ) +}; +export const createWithListInput = (data: UserModels.CreateWithListInputBody, ) => { + return AppRestClient.post( + { resSchema: UserModels.UserSchema }, + `/user/createWithList`, + ZodExtended.parse(UserModels.CreateWithListInputBodySchema.optional(), data), + + ) +}; +export const login = (username?: string, password?: string, ) => { + return AppRestClient.get( + { resSchema: z.string() }, + `/user/login`, + { + params: { + username: ZodExtended.parse(z.string().nullish(), username, { type: "query", name: "username" }), + password: ZodExtended.parse(z.string().nullish(), password, { type: "query", name: "password" }), + }, + headers: { + 'Accept': 'application/xml', + }, + } + ) +}; +export const logout = () => { + return AppRestClient.get( + { resSchema: z.void() }, + `/user/logout`, + + ) +}; +export const getByName = (username: string, ) => { + return AppRestClient.get( + { resSchema: UserModels.UserSchema }, + `/user/${username}`, + + ) +}; +export const update = (username: string, data: UserModels.User, ) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/user/${username}`, + ZodExtended.parse(UserModels.UserSchema.optional(), data), + + ) +}; +export const deleteUser = (username: string, ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/user/${username}`, + + ) +}; +} diff --git a/test/generated/tmp-models-common-v2/user/user.models.ts b/test/generated/tmp-models-common-v2/user/user.models.ts new file mode 100644 index 0000000..b9f893b --- /dev/null +++ b/test/generated/tmp-models-common-v2/user/user.models.ts @@ -0,0 +1,8 @@ +import { CommonModels } from "../common/common.models"; + +export namespace UserModels { + export const UserSchema = CommonModels.UserSchema; + export const CreateWithListInputBodySchema = CommonModels.CreateWithListInputBodySchema; + export type User = CommonModels.User; + export type CreateWithListInputBody = CommonModels.CreateWithListInputBody; +} diff --git a/test/generated/tmp-models-common-v2/user/user.queries.ts b/test/generated/tmp-models-common-v2/user/user.queries.ts new file mode 100644 index 0000000..a3dabbc --- /dev/null +++ b/test/generated/tmp-models-common-v2/user/user.queries.ts @@ -0,0 +1,185 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "../queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; +import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { UserModels } from "./user.models"; +import { UserApi } from "./user.api"; + +export namespace UserQueries { +export const moduleName = QueryModule.user; + +export const keys = { + all: [moduleName] as const, + login: (username?: string, password?: string) => [...keys.all, "/user/login", username, password] as const, + logout: () => [...keys.all, "/user/logout", ] as const, + getByName: (username: string) => [...keys.all, "/user/:username", username] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create user + * @description This can only be done by the logged in user. + * @param { UserModels.User } mutation.data Body parameter. Created user object + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [default] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + UserApi.create(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.logout()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateWithListInput` + * @summary Creates list of users with given input array + * @description Creates list of users with given input array + * @param { UserModels.CreateWithListInputBody } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, default] + */ +export const useCreateWithListInput = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + UserApi.createWithListInput(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useLogin` + * @summary Logs user into the system + * @param { string } object.username Query parameter. The user name for login + * @param { string } object.password Query parameter. The password for login in clear text + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400] + */ +export const useLogin = ({ username, password }: { username?: string, password?: string }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.login(username, password), + queryFn: () => + UserApi.login(username, password), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useLogout` + * @summary Logs out current logged in user session + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [default] + */ +export const useLogout = (options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.logout(), + queryFn: UserApi.logout, + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useGetByName` + * @summary Get user by user name + * @param { string } object.username Path parameter. The name that needs to be fetched. Use user1 for testing. + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400, 404] + */ +export const useGetByName = ({ username }: { username: string }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getByName(username), + queryFn: () => + UserApi.getByName(username), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update user + * @description This can only be done by the logged in user. + * @param { string } mutation.username Path parameter. name that need to be deleted + * @param { UserModels.User } mutation.data Body parameter. Update an existent user in the store + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [default] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ username, data }) => + UserApi.update(username, data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.logout()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteUser` + * @summary Delete user + * @description This can only be done by the logged in user. + * @param { string } mutation.username Path parameter. The name that needs to be deleted + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [400, 404] + */ +export const useDeleteUser = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ username }) => + UserApi.deleteUser(username) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.logout()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/tmp-models-common-v2/zod.extended.ts b/test/generated/tmp-models-common-v2/zod.extended.ts new file mode 100644 index 0000000..81e1e02 --- /dev/null +++ b/test/generated/tmp-models-common-v2/zod.extended.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { ErrorHandler, SharedErrorHandler } from ""; + +export namespace ZodExtended { + interface ParseOptions { + type: "body" | "query"; + name?: string; + errorHandler?: ErrorHandler; + } + + export function parse( + schema: z.ZodType, + data: unknown, + { type, name, errorHandler }: ParseOptions = { type: "body" }, + ) { + try { + return schema.parse(data); + } catch (e) { + if (e instanceof z.ZodError) { + e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; + } + (errorHandler ?? SharedErrorHandler).rethrowError(e); + throw e; + } + } + + function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { + if (data === undefined || data === "" || enumSchema.options.length === 0) { + return true; + } + + const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; + const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; + return new RegExp(`^${commaSeparatedOptions}$`).test(data); + } + + export const sortExp = (enumSchema: z.ZodEnum) => + z.string().superRefine((arg, ctx) => { + if (!isSortExpValid(enumSchema, arg)) { + ctx.addIssue({ + code: "invalid_value", + message: "Invalid sorting string.", + values: [], + }); + } + }); +} diff --git a/test/generated/tmp-models-common/.openapi-codegen-cache.json b/test/generated/tmp-models-common/.openapi-codegen-cache.json new file mode 100644 index 0000000..05df273 --- /dev/null +++ b/test/generated/tmp-models-common/.openapi-codegen-cache.json @@ -0,0 +1 @@ +{"openApiHash":"bcc2bcf5","optionsHash":"fbfc5717"} \ No newline at end of file diff --git a/test/generated/tmp-models-common/acl/app.ability.ts b/test/generated/tmp-models-common/acl/app.ability.ts new file mode 100644 index 0000000..6c06fc9 --- /dev/null +++ b/test/generated/tmp-models-common/acl/app.ability.ts @@ -0,0 +1,5 @@ +import { PureAbility, AbilityTuple, Subject } from "@casl/ability"; + +export type AppAbilities = AbilityTuple; + +export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/tmp-models-common/acl/useAclCheck.ts b/test/generated/tmp-models-common/acl/useAclCheck.ts new file mode 100644 index 0000000..5e19407 --- /dev/null +++ b/test/generated/tmp-models-common/acl/useAclCheck.ts @@ -0,0 +1,21 @@ +import { AbilityTuple } from "@casl/ability"; +import { type ErrorHandler, SharedErrorHandler } from ""; +import { AbilityContext } from ""; +import { useCallback } from "react"; +import { AppAbilities } from "../acl/app.ability"; + +interface UseAclCheckProps { + errorHandler?: ErrorHandler; +} + +export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { + const ability = AbilityContext.useAbility(); + + const checkAcl = useCallback((appAbility: AppAbilities) => { + if (!ability.can(...(appAbility as AbilityTuple))) { + (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); + } + }, [ability, errorHandler]); + + return { checkAcl }; +} diff --git a/test/generated/tmp-models-common/app-rest-client.ts b/test/generated/tmp-models-common/app-rest-client.ts new file mode 100644 index 0000000..493b224 --- /dev/null +++ b/test/generated/tmp-models-common/app-rest-client.ts @@ -0,0 +1,7 @@ +import { RestClient } from "@povio/openapi-codegen-cli"; + +export const AppRestClient = new RestClient({ + config: { + baseURL: "https://petstore3.swagger.io/api/v3" + }, +}); diff --git a/test/generated/tmp-models-common/common/common.models.ts b/test/generated/tmp-models-common/common/common.models.ts new file mode 100644 index 0000000..ab3e7a4 --- /dev/null +++ b/test/generated/tmp-models-common/common/common.models.ts @@ -0,0 +1,135 @@ +import { z } from "zod"; + +export namespace CommonModels { +/** + * FindByStatusStatusEnumSchema + * @type { enum } + * @description pet status in the store. Default: `available` + */ +export const FindByStatusStatusEnumSchema = z.enum(["available", "pending", "sold"]); +export type FindByStatusStatusEnum = z.infer; +export const FindByStatusStatusEnum = FindByStatusStatusEnumSchema.enum; + +/** + * OrderStatusEnumSchema + * @type { enum } + * @description Order Status. Example: `approved` + */ +export const OrderStatusEnumSchema = z.enum(["placed", "approved", "delivered"]); +export type OrderStatusEnum = z.infer; +export const OrderStatusEnum = OrderStatusEnumSchema.enum; + +/** + * CategorySchema + * @type { object } + * @property { integer } id Example: `1` + * @property { string } name Example: `Dogs` + */ +export const CategorySchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); +export type Category = z.infer; + +/** + * TagSchema + * @type { object } + * @property { integer } id + * @property { string } name + */ +export const TagSchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); +export type Tag = z.infer; + +/** + * PetSchema + * @type { object } + * @property { integer } id Example: `10` + * @property { string } name Example: `doggie` + * @property { PetModels.Category } category + * @property { string[] } photoUrls + * @property { PetModels.Tag[] } tags + * @property { string } status pet status in the store + */ +export const PetSchema = z.object({ id: z.int().nullish(), name: z.string(), category: CategorySchema.nullish(), photoUrls: z.array(z.string()), tags: z.array(TagSchema).nullish(), status: FindByStatusStatusEnumSchema.nullish() }); +export type Pet = z.infer; + +/** + * OrderSchema + * @type { object } + * @property { integer } id Example: `10` + * @property { integer } petId Example: `198772` + * @property { integer } quantity Example: `7` + * @property { string } shipDate + * @property { string } status Order Status. Example: `approved` + * @property { boolean } complete + */ +export const OrderSchema = z.object({ id: z.int().nullable(), petId: z.int().nullable(), quantity: z.int().nullable(), shipDate: z.iso.datetime({ offset: true }).nullable(), status: OrderStatusEnumSchema.nullable(), complete: z.boolean().nullable() }).partial(); +export type Order = z.infer; + +/** + * UserSchema + * @type { object } + * @property { integer } id Example: `10` + * @property { string } username Example: `theUser` + * @property { string } firstName Example: `John` + * @property { string } lastName Example: `James` + * @property { string } email Example: `john@email.com` + * @property { string } password Example: `12345` + * @property { string } phone Example: `12345` + * @property { integer } userStatus User Status. Example: `1` + */ +export const UserSchema = z.object({ id: z.int().nullable(), username: z.string().nullable(), firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), password: z.string().nullable(), phone: z.string().nullable(), userStatus: z.int().nullable() }).partial(); +export type User = z.infer; + +/** + * ApiResponseSchema + * @type { object } + * @property { integer } code + * @property { string } type + * @property { string } message + */ +export const ApiResponseSchema = z.object({ code: z.int().nullable(), type: z.string().nullable(), message: z.string().nullable() }).partial(); +export type ApiResponse = z.infer; + +/** + * FindByStatusStatusParamSchema + * @type { string } + * @description Default: `available` + */ +export const FindByStatusStatusParamSchema = FindByStatusStatusEnumSchema.nullish().default("available"); +export type FindByStatusStatusParam = z.infer; + +/** + * FindByStatusResponseSchema + * @type { array } + */ +export const FindByStatusResponseSchema = z.array(PetSchema); +export type FindByStatusResponse = z.infer; + +/** + * FindByTagsTagsParamSchema + * @type { array } + */ +export const FindByTagsTagsParamSchema = z.array(z.string()).nullish(); +export type FindByTagsTagsParam = z.infer; + +/** + * FindByTagsResponseSchema + * @type { array } + */ +export const FindByTagsResponseSchema = z.array(PetSchema); +export type FindByTagsResponse = z.infer; + +/** + * GetInventoryResponseSchema + * @type { object } + * @property { integer } [key] + */ +export const GetInventoryResponseSchema = z.object({}).catchall(z.int()); +export type GetInventoryResponse = z.infer; + +/** + * CreateWithListInputBodySchema + * @type { array } + */ +export const CreateWithListInputBodySchema = z.array(UserSchema); +export type CreateWithListInputBody = z.infer; + +} diff --git a/test/generated/tmp-models-common/pet/pet.api.ts b/test/generated/tmp-models-common/pet/pet.api.ts new file mode 100644 index 0000000..94fd0ed --- /dev/null +++ b/test/generated/tmp-models-common/pet/pet.api.ts @@ -0,0 +1,92 @@ +import { AppRestClient } from "../app-rest-client"; +import { z } from "zod"; +import { ZodExtended } from "../zod.extended"; +import { PetModels } from "./pet.models"; + +export namespace PetApi { +export const update = (data: PetModels.Pet, ) => { + return AppRestClient.put( + { resSchema: PetModels.PetSchema }, + `/pet`, + ZodExtended.parse(PetModels.PetSchema, data), + + ) +}; +export const add = (data: PetModels.Pet, ) => { + return AppRestClient.post( + { resSchema: PetModels.PetSchema }, + `/pet`, + ZodExtended.parse(PetModels.PetSchema, data), + + ) +}; +export const findByStatus = (status?: PetModels.FindByStatusStatusParam, ) => { + return AppRestClient.get( + { resSchema: PetModels.FindByStatusResponseSchema }, + `/pet/findByStatus`, + { + params: { + status: ZodExtended.parse(PetModels.FindByStatusStatusParamSchema.optional(), status, { type: "query", name: "status" }), + }, + } + ) +}; +export const findByTags = (tags?: PetModels.FindByTagsTagsParam, ) => { + return AppRestClient.get( + { resSchema: PetModels.FindByTagsResponseSchema }, + `/pet/findByTags`, + { + params: { + tags: ZodExtended.parse(PetModels.FindByTagsTagsParamSchema.optional(), tags, { type: "query", name: "tags" }), + }, + } + ) +}; +export const getById = (petId: number, ) => { + return AppRestClient.get( + { resSchema: PetModels.PetSchema }, + `/pet/${petId}`, + + ) +}; +export const updateWithForm = (petId: number, name: string, status: string, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/pet/${petId}`, + undefined, + { + params: { + name: ZodExtended.parse(z.string().nullish(), name, { type: "query", name: "name" }), + status: ZodExtended.parse(z.string().nullish(), status, { type: "query", name: "status" }), + }, + } + ) +}; +export const deletePet = (petId: number, api_key?: string, ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/pet/${petId}`, + undefined, + { + headers: { + 'api_key': api_key, + }, + } + ) +}; +export const uploadFile = (petId: number, data: string, additionalMetadata?: string, ) => { + return AppRestClient.post( + { resSchema: PetModels.ApiResponseSchema }, + `/pet/${petId}/uploadImage`, + ZodExtended.parse(z.instanceof(Blob), data), + { + params: { + additionalMetadata: ZodExtended.parse(z.string().nullish(), additionalMetadata, { type: "query", name: "additionalMetadata" }), + }, + headers: { + 'Content-Type': 'application/octet-stream', + }, + } + ) +}; +} diff --git a/test/generated/tmp-models-common/pet/pet.models.ts b/test/generated/tmp-models-common/pet/pet.models.ts new file mode 100644 index 0000000..4047409 --- /dev/null +++ b/test/generated/tmp-models-common/pet/pet.models.ts @@ -0,0 +1,23 @@ +import { CommonModels } from "../common/common.models"; + +export namespace PetModels { + export const PetSchema = CommonModels.PetSchema; + export const FindByStatusResponseSchema = CommonModels.FindByStatusResponseSchema; + export const FindByStatusStatusParamSchema = CommonModels.FindByStatusStatusParamSchema; + export const FindByTagsResponseSchema = CommonModels.FindByTagsResponseSchema; + export const FindByTagsTagsParamSchema = CommonModels.FindByTagsTagsParamSchema; + export const ApiResponseSchema = CommonModels.ApiResponseSchema; + export const CategorySchema = CommonModels.CategorySchema; + export const TagSchema = CommonModels.TagSchema; + export const FindByStatusStatusEnumSchema = CommonModels.FindByStatusStatusEnumSchema; + export type Pet = CommonModels.Pet; + export type FindByStatusResponse = CommonModels.FindByStatusResponse; + export type FindByStatusStatusParam = CommonModels.FindByStatusStatusParam; + export type FindByTagsResponse = CommonModels.FindByTagsResponse; + export type FindByTagsTagsParam = CommonModels.FindByTagsTagsParam; + export type ApiResponse = CommonModels.ApiResponse; + export type Category = CommonModels.Category; + export type Tag = CommonModels.Tag; + export type FindByStatusStatusEnum = CommonModels.FindByStatusStatusEnum; + export const FindByStatusStatusEnum = CommonModels.FindByStatusStatusEnum; +} diff --git a/test/generated/tmp-models-common/pet/pet.queries.ts b/test/generated/tmp-models-common/pet/pet.queries.ts new file mode 100644 index 0000000..b19320b --- /dev/null +++ b/test/generated/tmp-models-common/pet/pet.queries.ts @@ -0,0 +1,214 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "../queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; +import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { PetModels } from "./pet.models"; +import { PetApi } from "./pet.api"; + +export namespace PetQueries { +export const moduleName = QueryModule.pet; + +export const keys = { + all: [moduleName] as const, + findByStatus: (status?: PetModels.FindByStatusStatusParam) => [...keys.all, "/pet/findByStatus", status] as const, + findByTags: (tags?: PetModels.FindByTagsTagsParam) => [...keys.all, "/pet/findByTags", tags] as const, + getById: (petId: number) => [...keys.all, "/pet/:petId", petId] as const, +}; + +/** + * Mutation `useUpdate` + * @summary Update an existing pet + * @description Update an existing pet by Id + * @param { PetModels.Pet } mutation.data Body parameter. Update an existent pet in the store + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, 400, 404, 405] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + PetApi.update(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useAdd` + * @summary Add a new pet to the store + * @description Add a new pet to the store + * @param { PetModels.Pet } mutation.data Body parameter. Create a new pet in the store + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, 405] + */ +export const useAdd = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + PetApi.add(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useFindByStatus` + * @summary Finds Pets by status + * @description Multiple status values can be provided with comma separated strings + * @param { PetModels.FindByStatusStatusParam } object.status Query parameter. Status values that need to be considered for filter. Default: `available` + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400] + */ +export const useFindByStatus = ({ status }: { status?: PetModels.FindByStatusStatusParam }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.findByStatus(status), + queryFn: () => + PetApi.findByStatus(status), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useFindByTags` + * @summary Finds Pets by tags + * @description Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * @param { PetModels.FindByTagsTagsParam } object.tags Query parameter. Tags to filter by + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400] + */ +export const useFindByTags = ({ tags }: { tags?: PetModels.FindByTagsTagsParam }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.findByTags(tags), + queryFn: () => + PetApi.findByTags(tags), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useGetById` + * @summary Find pet by ID + * @description Returns a single pet + * @param { number } object.petId Path parameter. ID of pet to return + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400, 404] + */ +export const useGetById = ({ petId }: { petId: number }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getById(petId), + queryFn: () => + PetApi.getById(petId), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `useUpdateWithForm` + * @summary Updates a pet in the store with form data + * @param { number } mutation.petId Path parameter. ID of pet that needs to be updated + * @param { string } mutation.name Query parameter. Name of pet that needs to be updated + * @param { string } mutation.status Query parameter. Status of pet that needs to be updated + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [405] + */ +export const useUpdateWithForm = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ petId, name, status }) => + PetApi.updateWithForm(petId, name, status) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeletePet` + * @summary Deletes a pet + * @description delete a pet + * @param { number } mutation.petId Path parameter. Pet id to delete + * @param { string } mutation.api_key Header parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [400] + */ +export const useDeletePet = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ petId, api_key }) => + PetApi.deletePet(petId, api_key) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useUploadFile` + * @summary uploads an image + * @param { number } mutation.petId Path parameter. ID of pet to update + * @param { string } mutation.data Body parameter + * @param { string } mutation.additionalMetadata Query parameter. Additional Metadata + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200] + */ +export const useUploadFile = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ petId, data, additionalMetadata }) => + PetApi.uploadFile(petId, data, additionalMetadata) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/tmp-models-common/queryModules.ts b/test/generated/tmp-models-common/queryModules.ts new file mode 100644 index 0000000..c815cfe --- /dev/null +++ b/test/generated/tmp-models-common/queryModules.ts @@ -0,0 +1,5 @@ +export const enum QueryModule { + pet = "PetQueries", + store = "StoreQueries", + user = "UserQueries", +} \ No newline at end of file diff --git a/test/generated/tmp-models-common/store/store.api.ts b/test/generated/tmp-models-common/store/store.api.ts new file mode 100644 index 0000000..7a4712b --- /dev/null +++ b/test/generated/tmp-models-common/store/store.api.ts @@ -0,0 +1,36 @@ +import { AppRestClient } from "../app-rest-client"; +import { z } from "zod"; +import { ZodExtended } from "../zod.extended"; +import { StoreModels } from "./store.models"; + +export namespace StoreApi { +export const getInventory = () => { + return AppRestClient.get( + { resSchema: StoreModels.GetInventoryResponseSchema }, + `/store/inventory`, + + ) +}; +export const placeOrder = (data: StoreModels.Order, ) => { + return AppRestClient.post( + { resSchema: StoreModels.OrderSchema }, + `/store/order`, + ZodExtended.parse(StoreModels.OrderSchema.optional(), data), + + ) +}; +export const getOrderById = (orderId: number, ) => { + return AppRestClient.get( + { resSchema: StoreModels.OrderSchema }, + `/store/order/${orderId}`, + + ) +}; +export const deleteOrder = (orderId: number, ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/store/order/${orderId}`, + + ) +}; +} diff --git a/test/generated/tmp-models-common/store/store.models.ts b/test/generated/tmp-models-common/store/store.models.ts new file mode 100644 index 0000000..2d9d5c7 --- /dev/null +++ b/test/generated/tmp-models-common/store/store.models.ts @@ -0,0 +1,11 @@ +import { CommonModels } from "../common/common.models"; + +export namespace StoreModels { + export const GetInventoryResponseSchema = CommonModels.GetInventoryResponseSchema; + export const OrderSchema = CommonModels.OrderSchema; + export const OrderStatusEnumSchema = CommonModels.OrderStatusEnumSchema; + export type GetInventoryResponse = CommonModels.GetInventoryResponse; + export type Order = CommonModels.Order; + export type OrderStatusEnum = CommonModels.OrderStatusEnum; + export const OrderStatusEnum = CommonModels.OrderStatusEnum; +} diff --git a/test/generated/tmp-models-common/store/store.queries.ts b/test/generated/tmp-models-common/store/store.queries.ts new file mode 100644 index 0000000..335a090 --- /dev/null +++ b/test/generated/tmp-models-common/store/store.queries.ts @@ -0,0 +1,109 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "../queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; +import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { StoreModels } from "./store.models"; +import { StoreApi } from "./store.api"; + +export namespace StoreQueries { +export const moduleName = QueryModule.store; + +export const keys = { + all: [moduleName] as const, + getInventory: () => [...keys.all, "/store/inventory", ] as const, + getOrderById: (orderId: number) => [...keys.all, "/store/order/:orderId", orderId] as const, +}; + +/** + * Query `useGetInventory` + * @summary Returns pet inventories by status + * @description Returns a map of status codes to quantities + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200] + */ +export const useGetInventory = (options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getInventory(), + queryFn: StoreApi.getInventory, + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `usePlaceOrder` + * @summary Place an order for a pet + * @description Place a new order in the store + * @param { StoreModels.Order } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, 405] + */ +export const usePlaceOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + StoreApi.placeOrder(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useGetOrderById` + * @summary Find purchase order by ID + * @description For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. + * @param { number } object.orderId Path parameter. ID of order that needs to be fetched + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400, 404] + */ +export const useGetOrderById = ({ orderId }: { orderId: number }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getOrderById(orderId), + queryFn: () => + StoreApi.getOrderById(orderId), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `useDeleteOrder` + * @summary Delete purchase order by ID + * @description For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * @param { number } mutation.orderId Path parameter. ID of the order that needs to be deleted + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [400, 404] + */ +export const useDeleteOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ orderId }) => + StoreApi.deleteOrder(orderId) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/tmp-models-common/useCrossTabQueryInvalidation.ts b/test/generated/tmp-models-common/useCrossTabQueryInvalidation.ts new file mode 100644 index 0000000..d74d707 --- /dev/null +++ b/test/generated/tmp-models-common/useCrossTabQueryInvalidation.ts @@ -0,0 +1,40 @@ +import type { QueryClient, QueryKey } from "@tanstack/react-query"; + +const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; + +/** + * Broadcasts a query invalidation event to all other open tabs via localStorage. + * + * @param queryKeys - An array of query keys to invalidate (array of arrays). + * + * NOTE: The `storage` event only fires in *other* tabs — the calling tab + * must invalidate its own queryClient separately if needed. + */ +export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { + localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); +}; + +/** + * Registers a one-time global `storage` event listener that reacts to + * cross-tab invalidation broadcasts. Safe to call from multiple hooks — + * only the first call sets up the listener. + */ +let isListenerSetUp = false; + +export const setupCrossTabListener = (queryClient: QueryClient) => { + if (isListenerSetUp) return; + isListenerSetUp = true; + + window.addEventListener("storage", (e: StorageEvent) => { + if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; + + try { + const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; + for (const queryKey of keys) { + queryClient.invalidateQueries({ queryKey }); + } + } catch { + // Ignore malformed payloads + } + }); +}; diff --git a/test/generated/tmp-models-common/useMutationEffects.ts b/test/generated/tmp-models-common/useMutationEffects.ts new file mode 100644 index 0000000..ed61406 --- /dev/null +++ b/test/generated/tmp-models-common/useMutationEffects.ts @@ -0,0 +1,95 @@ +import { useCallback, useEffect } from "react"; + +import { QueryKey, useQueryClient } from "@tanstack/react-query"; +import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; +import { QueryModule } from "./queryModules"; +import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; + +export interface MutationEffectsOptions { + invalidateCurrentModule?: boolean; + crossTabInvalidation?: boolean; + invalidationMap?: InvalidationMap; + invalidateModules?: QueryModule[]; + invalidateKeys?: QueryKey[]; + preferUpdate?: boolean; +} + +export interface UseMutationEffectsProps { + currentModule: QueryModule; +} + +export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { + const queryClient = useQueryClient(); + const config = OpenApiQueryConfig.useConfig(); + + useEffect(() => { + if (!config.crossTabInvalidation) return; + setupCrossTabListener(queryClient); + }, [queryClient, config.crossTabInvalidation]); + + const runMutationEffects = useCallback( + async ( + data: TData, + variables: TVariables, + options: MutationEffectsOptions = {}, + updateKeys?: QueryKey[], + ) => { + const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; + const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; + const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; + + const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => + keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); + const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => + prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); + const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); + + const shouldInvalidateQuery = (queryKey: QueryKey) => { + const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); + if (shouldUpdate && isUpdateKey) { + return false; + } + + const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; + const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); + const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + const isMappedKey = + !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); + + return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; + }; + + const invalidatedQueryKeys: QueryKey[] = []; + + queryClient.invalidateQueries({ + predicate: ({ queryKey }) => { + const shouldInvalidate = shouldInvalidateQuery(queryKey); + + if (shouldInvalidate && config.crossTabInvalidation) { + invalidatedQueryKeys.push([...queryKey]); + } + + return shouldInvalidate; + }, + }); + + if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { + broadcastQueryInvalidation(invalidatedQueryKeys); + } + + if (shouldUpdate && updateKeys) { + updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); + } + }, + [ + queryClient, + currentModule, + config.preferUpdate, + config.invalidateCurrentModule, + config.invalidationMap, + config.crossTabInvalidation, + ], + ); + + return { runMutationEffects }; +} diff --git a/test/generated/tmp-models-common/user/user.api.ts b/test/generated/tmp-models-common/user/user.api.ts new file mode 100644 index 0000000..69c5f69 --- /dev/null +++ b/test/generated/tmp-models-common/user/user.api.ts @@ -0,0 +1,67 @@ +import { AppRestClient } from "../app-rest-client"; +import { z } from "zod"; +import { ZodExtended } from "../zod.extended"; +import { UserModels } from "./user.models"; + +export namespace UserApi { +export const create = (data: UserModels.User, ) => { + return AppRestClient.post( + { resSchema: z.void() }, + `/user`, + ZodExtended.parse(UserModels.UserSchema.optional(), data), + + ) +}; +export const createWithListInput = (data: UserModels.CreateWithListInputBody, ) => { + return AppRestClient.post( + { resSchema: UserModels.UserSchema }, + `/user/createWithList`, + ZodExtended.parse(UserModels.CreateWithListInputBodySchema.optional(), data), + + ) +}; +export const login = (username?: string, password?: string, ) => { + return AppRestClient.get( + { resSchema: z.string() }, + `/user/login`, + { + params: { + username: ZodExtended.parse(z.string().nullish(), username, { type: "query", name: "username" }), + password: ZodExtended.parse(z.string().nullish(), password, { type: "query", name: "password" }), + }, + headers: { + 'Accept': 'application/xml', + }, + } + ) +}; +export const logout = () => { + return AppRestClient.get( + { resSchema: z.void() }, + `/user/logout`, + + ) +}; +export const getByName = (username: string, ) => { + return AppRestClient.get( + { resSchema: UserModels.UserSchema }, + `/user/${username}`, + + ) +}; +export const update = (username: string, data: UserModels.User, ) => { + return AppRestClient.put( + { resSchema: z.void() }, + `/user/${username}`, + ZodExtended.parse(UserModels.UserSchema.optional(), data), + + ) +}; +export const deleteUser = (username: string, ) => { + return AppRestClient.delete( + { resSchema: z.void() }, + `/user/${username}`, + + ) +}; +} diff --git a/test/generated/tmp-models-common/user/user.models.ts b/test/generated/tmp-models-common/user/user.models.ts new file mode 100644 index 0000000..b9f893b --- /dev/null +++ b/test/generated/tmp-models-common/user/user.models.ts @@ -0,0 +1,8 @@ +import { CommonModels } from "../common/common.models"; + +export namespace UserModels { + export const UserSchema = CommonModels.UserSchema; + export const CreateWithListInputBodySchema = CommonModels.CreateWithListInputBodySchema; + export type User = CommonModels.User; + export type CreateWithListInputBody = CommonModels.CreateWithListInputBody; +} diff --git a/test/generated/tmp-models-common/user/user.queries.ts b/test/generated/tmp-models-common/user/user.queries.ts new file mode 100644 index 0000000..a3dabbc --- /dev/null +++ b/test/generated/tmp-models-common/user/user.queries.ts @@ -0,0 +1,185 @@ +import { useQuery, useMutation } from "@tanstack/react-query"; +import { QueryModule } from "../queryModules"; +import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; +import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; +import { UserModels } from "./user.models"; +import { UserApi } from "./user.api"; + +export namespace UserQueries { +export const moduleName = QueryModule.user; + +export const keys = { + all: [moduleName] as const, + login: (username?: string, password?: string) => [...keys.all, "/user/login", username, password] as const, + logout: () => [...keys.all, "/user/logout", ] as const, + getByName: (username: string) => [...keys.all, "/user/:username", username] as const, +}; + +/** + * Mutation `useCreate` + * @summary Create user + * @description This can only be done by the logged in user. + * @param { UserModels.User } mutation.data Body parameter. Created user object + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [default] + */ +export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + UserApi.create(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.logout()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useCreateWithListInput` + * @summary Creates list of users with given input array + * @description Creates list of users with given input array + * @param { UserModels.CreateWithListInputBody } mutation.data Body parameter + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } Successful operation + * @statusCodes [200, default] + */ +export const useCreateWithListInput = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ data }) => + UserApi.createWithListInput(data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + await runMutationEffects(resData, variables, options); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Query `useLogin` + * @summary Logs user into the system + * @param { string } object.username Query parameter. The user name for login + * @param { string } object.password Query parameter. The password for login in clear text + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400] + */ +export const useLogin = ({ username, password }: { username?: string, password?: string }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.login(username, password), + queryFn: () => + UserApi.login(username, password), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useLogout` + * @summary Logs out current logged in user session + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } + * @statusCodes [default] + */ +export const useLogout = (options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.logout(), + queryFn: UserApi.logout, + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Query `useGetByName` + * @summary Get user by user name + * @param { string } object.username Path parameter. The name that needs to be fetched. Use user1 for testing. + * @param { AppQueryOptions } options Query options + * @returns { UseQueryResult } Successful operation + * @statusCodes [200, 400, 404] + */ +export const useGetByName = ({ username }: { username: string }, options?: AppQueryOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + + return useQuery({ + queryKey: keys.getByName(username), + queryFn: () => + UserApi.getByName(username), + ...options, + onError: options?.onError ?? queryConfig.onError, + }); +}; + +/** + * Mutation `useUpdate` + * @summary Update user + * @description This can only be done by the logged in user. + * @param { string } mutation.username Path parameter. name that need to be deleted + * @param { UserModels.User } mutation.data Body parameter. Update an existent user in the store + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [default] + */ +export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ username, data }) => + UserApi.update(username, data) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.logout()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +/** + * Mutation `useDeleteUser` + * @summary Delete user + * @description This can only be done by the logged in user. + * @param { string } mutation.username Path parameter. The name that needs to be deleted + * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options + * @returns { UseMutationResult } + * @statusCodes [400, 404] + */ +export const useDeleteUser = (options?: AppMutationOptions & MutationEffectsOptions) => { + const queryConfig = OpenApiQueryConfig.useConfig(); + const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); + + return useMutation({ + mutationFn: ({ username }) => + UserApi.deleteUser(username) +, + ...options, + onError: options?.onError ?? queryConfig.onError, + onSuccess: async (resData, variables, onMutateResult, context) => { + const updateKeys = [keys.logout()]; + await runMutationEffects(resData, variables, options, updateKeys); + options?.onSuccess?.(resData, variables, onMutateResult, context); + }, + }); +}; + +} diff --git a/test/generated/tmp-models-common/zod.extended.ts b/test/generated/tmp-models-common/zod.extended.ts new file mode 100644 index 0000000..81e1e02 --- /dev/null +++ b/test/generated/tmp-models-common/zod.extended.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { ErrorHandler, SharedErrorHandler } from ""; + +export namespace ZodExtended { + interface ParseOptions { + type: "body" | "query"; + name?: string; + errorHandler?: ErrorHandler; + } + + export function parse( + schema: z.ZodType, + data: unknown, + { type, name, errorHandler }: ParseOptions = { type: "body" }, + ) { + try { + return schema.parse(data); + } catch (e) { + if (e instanceof z.ZodError) { + e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; + } + (errorHandler ?? SharedErrorHandler).rethrowError(e); + throw e; + } + } + + function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { + if (data === undefined || data === "" || enumSchema.options.length === 0) { + return true; + } + + const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; + const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; + return new RegExp(`^${commaSeparatedOptions}$`).test(data); + } + + export const sortExp = (enumSchema: z.ZodEnum) => + z.string().superRefine((arg, ctx) => { + if (!isSortExpValid(enumSchema, arg)) { + ctx.addIssue({ + code: "invalid_value", + message: "Invalid sorting string.", + values: [], + }); + } + }); +} From 8cf4ef873c89c9633428473440b6eb58e7d4157b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Urban=20Lavbi=C4=8D?= Date: Thu, 26 Feb 2026 09:07:00 +0100 Subject: [PATCH 06/12] Switch build pipeline --- esbuild.mjs | 27 -- package.json | 22 +- tsdown.config.ts | 30 ++ yarn.lock | 1002 ++++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 973 insertions(+), 108 deletions(-) delete mode 100644 esbuild.mjs create mode 100644 tsdown.config.ts diff --git a/esbuild.mjs b/esbuild.mjs deleted file mode 100644 index ac78c66..0000000 --- a/esbuild.mjs +++ /dev/null @@ -1,27 +0,0 @@ -import fs from "fs"; - -import { build } from "esbuild"; - -const packageJson = JSON.parse(fs.readFileSync("package.json", "utf-8")); - -const external = [...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.peerDependencies || {})]; - -// CLI and Node.js builds - run in Node.js -const nodeBuildOptions = { - bundle: true, - sourcemap: false, - platform: "node", - minify: true, - metafile: false, - keepNames: true, - external, - target: "node14", - logLevel: "info", - define: { - "process.env.OPENAPI_CODEGEN_VERSION": `"${packageJson.version}"`, - "process.env.NODE_ENV": `"production"`, - }, -}; - -await build({ ...nodeBuildOptions, entryPoints: ["./src/sh.ts"], outfile: "./dist/sh.js" }); -await build({ ...nodeBuildOptions, entryPoints: ["./src/generator.ts"], outfile: "./dist/generator.js" }); diff --git a/package.json b/package.json index 03df2d4..3a807ae 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "url": "git+https://github.com/povio/openapi-codegen-cli.git" }, "bin": { - "openapi-codegen": "./dist/sh.js" + "openapi-codegen": "./dist/sh.mjs" }, "files": [ "README.md", @@ -29,23 +29,19 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.mjs" + "import": "./dist/index.mjs" }, "./vite": { "types": "./dist/vite.d.ts", - "import": "./dist/vite.mjs", - "require": "./dist/vite.mjs" + "import": "./dist/vite.mjs" }, "./generator": { "types": "./dist/generator.d.ts", - "import": "./dist/generator.js", - "require": "./dist/generator.js" + "import": "./dist/generator.mjs" }, "./acl": { "types": "./dist/acl.d.ts", - "import": "./dist/acl.mjs", - "require": "./dist/acl.mjs" + "import": "./dist/acl.mjs" } }, "scripts": { @@ -54,9 +50,9 @@ "test:watch": "vitest", "build:clean": "rm -rf ./dist", "build:client": "vite build", - "build:cli": "node ./esbuild.mjs && chmod +x ./dist/sh.js", + "build:cli": "tsdown --config tsdown.config.ts && chmod +x ./dist/sh.mjs", "build": "yarn build:clean && yarn build:cli && yarn build:client", - "start:dist": "node ./dist/sh.js", + "start:dist": "node ./dist/sh.mjs", "gen:base": "rm -rf ./test/generated/base && mkdir -p ./test/generated/base && yarn start generate --config ./test/config.mjs --output ./test/generated/base --no-prettier", "gen:next": "rm -rf ./test/generated/next && mkdir -p ./test/generated/next && yarn start generate --config ./test/config.mjs --output ./test/generated/next --no-prettier", "test:generated-eq": "vitest run ./src/generators/generated-output-eq.test.ts", @@ -89,7 +85,6 @@ "@types/yargs": "^17.0.35", "@vitejs/plugin-react": "^5.1.4", "axios": "^1.13.5", - "esbuild": "0.27.3", "handlebars": "^4.7.8", "openapi-types": "^12.1.3", "oxfmt": "^0.34.0", @@ -99,10 +94,11 @@ "react": "^19.2.4", "reflect-metadata": "^0.2.2", "ts-pattern": "^5.9.0", + "tsdown": "^0.21.0-beta.1", "tsx": "^4.21.0", "type-fest": "^5.4.4", "typescript": "^5.9.3", - "vite": "^7.3.1", + "vite": "npm:rolldown-vite@^7.3.1", "vite-plugin-dts": "^4.5.4", "vitest": "4.0.18", "zod": "^4.3.6" diff --git a/tsdown.config.ts b/tsdown.config.ts new file mode 100644 index 0000000..10f37bb --- /dev/null +++ b/tsdown.config.ts @@ -0,0 +1,30 @@ +import { readFileSync } from "node:fs"; + +import { defineConfig } from "tsdown"; + +const pkg = JSON.parse(readFileSync("./package.json", "utf-8")) as { + dependencies?: Record; + peerDependencies?: Record; + version?: string; +}; + +const external = [...Object.keys(pkg.dependencies ?? {}), ...Object.keys(pkg.peerDependencies ?? {})]; + +export default defineConfig({ + entry: ["./src/sh.ts", "./src/generator.ts"], + format: "esm", + outDir: "dist", + platform: "node", + target: "node14", + minify: true, + clean: false, + dts: false, + deps: { + neverBundle: external, + onlyAllowBundle: false, + }, + define: { + "process.env.OPENAPI_CODEGEN_VERSION": JSON.stringify(pkg.version ?? "unknown"), + "process.env.NODE_ENV": JSON.stringify("production"), + }, +}); diff --git a/yarn.lock b/yarn.lock index 9f89097..8e0bb55 100644 --- a/yarn.lock +++ b/yarn.lock @@ -88,6 +88,20 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:8.0.0-rc.1": + version: 8.0.0-rc.1 + resolution: "@babel/generator@npm:8.0.0-rc.1" + dependencies: + "@babel/parser": "npm:^8.0.0-rc.1" + "@babel/types": "npm:^8.0.0-rc.1" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + "@types/jsesc": "npm:^2.5.0" + jsesc: "npm:^3.0.2" + checksum: 10c0/476ae68898837e85a4749b20b572d8d5d66f0e90adff54e55ec24ec7f481e2d1af9923cf86c24d504463dd0c30d2713234d0df3d53600eecc8d26abef819eb69 + languageName: node + linkType: hard + "@babel/generator@npm:^7.29.0": version: 7.29.0 resolution: "@babel/generator@npm:7.29.0" @@ -158,6 +172,20 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^8.0.0-rc.1, @babel/helper-string-parser@npm:^8.0.0-rc.2": + version: 8.0.0-rc.2 + resolution: "@babel/helper-string-parser@npm:8.0.0-rc.2" + checksum: 10c0/74b5107ed84c99948651a52ebd880d91f0c307fcf0273b75c79552b2c5469c27573640a5187c87df636e96c247a43c57be70bdac1ce06c29a30aefd499952121 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:8.0.0-rc.1": + version: 8.0.0-rc.1 + resolution: "@babel/helper-validator-identifier@npm:8.0.0-rc.1" + checksum: 10c0/440f44c7bf6d82fa070f401c68a0e8ae4e6f6e178ba023fea4aac3221bfe5f66c94f7f3ed9bddff704982f94f88df8155c3b946cd5b0f8a7d9e57f26bb2098c2 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-validator-identifier@npm:7.28.5" @@ -165,6 +193,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^8.0.0-rc.1, @babel/helper-validator-identifier@npm:^8.0.0-rc.2": + version: 8.0.0-rc.2 + resolution: "@babel/helper-validator-identifier@npm:8.0.0-rc.2" + checksum: 10c0/9a1687e18bfb50728ae38b1dac889c1a3bc2c53bdf4c1632533b1b0672cc272c087507a2a7c60c3af20d58bd645e169dd685f892d2a62d580e759e26d67e8788 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-option@npm:7.27.1" @@ -182,6 +217,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:8.0.0-rc.1": + version: 8.0.0-rc.1 + resolution: "@babel/parser@npm:8.0.0-rc.1" + dependencies: + "@babel/types": "npm:^8.0.0-rc.1" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/f09a4694bee40d9ba27aa7ccca3eb4d8dedf2ac17cbaa53f47f6aca5b0eb2a2bbdf1dfed99ba1e082731278424217265f7187f74cc6928d5d77e4aaafeb4d41d + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.28.5, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": version: 7.29.0 resolution: "@babel/parser@npm:7.29.0" @@ -193,6 +239,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^8.0.0-beta.4, @babel/parser@npm:^8.0.0-rc.1": + version: 8.0.0-rc.2 + resolution: "@babel/parser@npm:8.0.0-rc.2" + dependencies: + "@babel/types": "npm:^8.0.0-rc.2" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/704ddbc1fce338e5b8df6327c1a7eeb1a554d136f89738135a8be5f5e2e854bd3f05eb3946b9d7b6814491bcd677175496076657696674eaecbed0e582749b2e + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-self@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" @@ -248,6 +305,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:8.0.0-rc.1": + version: 8.0.0-rc.1 + resolution: "@babel/types@npm:8.0.0-rc.1" + dependencies: + "@babel/helper-string-parser": "npm:^8.0.0-rc.1" + "@babel/helper-validator-identifier": "npm:^8.0.0-rc.1" + checksum: 10c0/cb617e14873666d5284a8dfce11eca7155f2bc30db8ba0fbf132a07e96366883678cad23ea889d78e1e30371fdd656482005ebd69acbf6981fc8f42bac8030d8 + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": version: 7.29.0 resolution: "@babel/types@npm:7.29.0" @@ -258,6 +325,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^8.0.0-rc.1, @babel/types@npm:^8.0.0-rc.2": + version: 8.0.0-rc.2 + resolution: "@babel/types@npm:8.0.0-rc.2" + dependencies: + "@babel/helper-string-parser": "npm:^8.0.0-rc.2" + "@babel/helper-validator-identifier": "npm:^8.0.0-rc.2" + checksum: 10c0/8b372115aa4ee3f55541e19887683655e32b78b64579d2402119920af3512594a2be820e05db4a3100cb38db3da3a7bdcc1beb7d031a4ab0129f28d858f129bd + languageName: node + linkType: hard + "@casl/ability@npm:^6.8.0": version: 6.8.0 resolution: "@casl/ability@npm:6.8.0" @@ -277,6 +354,34 @@ __metadata: languageName: node linkType: hard +"@emnapi/core@npm:^1.7.1": + version: 1.8.1 + resolution: "@emnapi/core@npm:1.8.1" + dependencies: + "@emnapi/wasi-threads": "npm:1.1.0" + tslib: "npm:^2.4.0" + checksum: 10c0/2c242f4b49779bac403e1cbcc98edacdb1c8ad36562408ba9a20663824669e930bc8493be46a2522d9dc946b8d96cd7073970bae914928c7671b5221c85b432e + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.7.1": + version: 1.8.1 + resolution: "@emnapi/runtime@npm:1.8.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f4929d75e37aafb24da77d2f58816761fe3f826aad2e37fa6d4421dac9060cbd5098eea1ac3c9ecc4526b89deb58153852fa432f87021dc57863f2ff726d713f + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.1.0": + version: 1.1.0 + resolution: "@emnapi/wasi-threads@npm:1.1.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.27.2": version: 0.27.2 resolution: "@esbuild/aix-ppc64@npm:0.27.2" @@ -811,6 +916,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^1.1.0, @napi-rs/wasm-runtime@npm:^1.1.1": + version: 1.1.1 + resolution: "@napi-rs/wasm-runtime@npm:1.1.1" + dependencies: + "@emnapi/core": "npm:^1.7.1" + "@emnapi/runtime": "npm:^1.7.1" + "@tybys/wasm-util": "npm:^0.10.1" + checksum: 10c0/04d57b67e80736e41fe44674a011878db0a8ad893f4d44abb9d3608debb7c174224cba2796ed5b0c1d367368159f3ca6be45f1c59222f70e32ddc880f803d447 + languageName: node + linkType: hard + "@npmcli/agent@npm:^2.0.0": version: 2.2.2 resolution: "@npmcli/agent@npm:2.2.2" @@ -833,6 +949,27 @@ __metadata: languageName: node linkType: hard +"@oxc-project/runtime@npm:0.101.0": + version: 0.101.0 + resolution: "@oxc-project/runtime@npm:0.101.0" + checksum: 10c0/86fd7bb37e94986e7a09bde07a16fa63cebeaada6bcb8963bc07087d54c107d1a128e1c4a5d27b9b593354c092b8976d7653b6700fbb0da0a2b925fb3de4b34c + languageName: node + linkType: hard + +"@oxc-project/types@npm:=0.101.0": + version: 0.101.0 + resolution: "@oxc-project/types@npm:0.101.0" + checksum: 10c0/e4e98da6e34ef0163a652e842e795bda77b703d8282fed4984292ff7b289c4e03d848ed8762e549445e33a142d3883e1013cd9ed43156f6eba34c151b8f599c1 + languageName: node + linkType: hard + +"@oxc-project/types@npm:=0.114.0": + version: 0.114.0 + resolution: "@oxc-project/types@npm:0.114.0" + checksum: 10c0/37efc4a3b3375efb281ef669e306a3d20783a91d36c24eeef9e164995ba93db5571f84ce9a7961004b0bda0d1533d35d0b1f6fe3318d574779c0847bf1f3ba65 + languageName: node + linkType: hard + "@oxfmt/binding-android-arm-eabi@npm:0.34.0": version: 0.34.0 resolution: "@oxfmt/binding-android-arm-eabi@npm:0.34.0" @@ -1162,7 +1299,6 @@ __metadata: "@types/yargs": "npm:^17.0.35" "@vitejs/plugin-react": "npm:^5.1.4" axios: "npm:^1.13.5" - esbuild: "npm:0.27.3" handlebars: "npm:^4.7.8" i18next: "npm:^25.8.11" import-fresh: "npm:^3.3.1" @@ -1174,10 +1310,11 @@ __metadata: react: "npm:^19.2.4" reflect-metadata: "npm:^0.2.2" ts-pattern: "npm:^5.9.0" + tsdown: "npm:^0.21.0-beta.1" tsx: "npm:^4.21.0" type-fest: "npm:^5.4.4" typescript: "npm:^5.9.3" - vite: "npm:^7.3.1" + vite: "npm:rolldown-vite@^7.3.1" vite-plugin-dts: "npm:^4.5.4" vitest: "npm:4.0.18" yargs: "npm:^18.0.0" @@ -1199,6 +1336,208 @@ __metadata: languageName: unknown linkType: soft +"@quansync/fs@npm:^1.0.0": + version: 1.0.0 + resolution: "@quansync/fs@npm:1.0.0" + dependencies: + quansync: "npm:^1.0.0" + checksum: 10c0/41a7e145d4fc349eaeac20ee7ffe0c876a7c26b2268d5704b462b3e7379091221336e315b2b346d5b07a531502a41cad15c9f374800cc60b6339d074ef99aa16 + languageName: node + linkType: hard + +"@rolldown/binding-android-arm64@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-android-arm64@npm:1.0.0-beta.53" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-android-arm64@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-android-arm64@npm:1.0.0-rc.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-arm64@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-beta.53" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-arm64@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-rc.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-x64@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-beta.53" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-x64@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-rc.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-freebsd-x64@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-beta.53" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-freebsd-x64@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-rc.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.53" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.53" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.5" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.53" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.5" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.53" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.5" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.53" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.5" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-openharmony-arm64@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-beta.53" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.5" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.53" + dependencies: + "@napi-rs/wasm-runtime": "npm:^1.1.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.5" + dependencies: + "@napi-rs/wasm-runtime": "npm:^1.1.1" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.53" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.53" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/pluginutils@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.53" + checksum: 10c0/e8b0a7eb76be22f6f103171f28072de821525a4e400454850516da91a7381957932ff0ce495f227bcb168e86815788b0c1d249ca9e34dca366a82c8825b714ce + languageName: node + linkType: hard + "@rolldown/pluginutils@npm:1.0.0-rc.3": version: 1.0.0-rc.3 resolution: "@rolldown/pluginutils@npm:1.0.0-rc.3" @@ -1206,6 +1545,13 @@ __metadata: languageName: node linkType: hard +"@rolldown/pluginutils@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "@rolldown/pluginutils@npm:1.0.0-rc.5" + checksum: 10c0/024425dd33d34d7b7e2f9259c406db97248c405462a37e780f7df5a0460a051847f4658295741c6b9382141d3b032f687d23ed8feab9d9c045cb6b8ba93a0bb3 + languageName: node + linkType: hard + "@rollup/pluginutils@npm:^5.1.4": version: 5.3.0 resolution: "@rollup/pluginutils@npm:5.3.0" @@ -1493,6 +1839,15 @@ __metadata: languageName: node linkType: hard +"@tybys/wasm-util@npm:^0.10.1": + version: 0.10.1 + resolution: "@tybys/wasm-util@npm:0.10.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8 + languageName: node + linkType: hard + "@types/argparse@npm:1.0.38": version: 1.0.38 resolution: "@types/argparse@npm:1.0.38" @@ -1572,6 +1927,13 @@ __metadata: languageName: node linkType: hard +"@types/jsesc@npm:^2.5.0": + version: 2.5.1 + resolution: "@types/jsesc@npm:2.5.1" + checksum: 10c0/12ba7bf5968aeeb36408269f4b5a39718efc6411fa197cf0f5e967ba36ad7b7d555b78787fc480db43ce63ebe6ab0ffe5fd9f64b1ea3b0d073877f0747491b30 + languageName: node + linkType: hard + "@types/node@npm:^25.3.0": version: 25.3.0 resolution: "@types/node@npm:25.3.0" @@ -1981,6 +2343,13 @@ __metadata: languageName: node linkType: hard +"ansis@npm:^4.2.0": + version: 4.2.0 + resolution: "ansis@npm:4.2.0" + checksum: 10c0/cd6a7a681ecd36e72e0d79c1e34f1f3bcb1b15bcbb6f0f8969b4228062d3bfebbef468e09771b00d93b2294370b34f707599d4a113542a876de26823b795b5d2 + languageName: node + linkType: hard + "argparse@npm:^1.0.7, argparse@npm:~1.0.9": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -1997,6 +2366,17 @@ __metadata: languageName: node linkType: hard +"ast-kit@npm:^3.0.0-beta.1": + version: 3.0.0-beta.1 + resolution: "ast-kit@npm:3.0.0-beta.1" + dependencies: + "@babel/parser": "npm:^8.0.0-beta.4" + estree-walker: "npm:^3.0.3" + pathe: "npm:^2.0.3" + checksum: 10c0/27a0309d495100e088c6aa6449e2bb79fdf6321c42bb73c196d646935ff788c2202d8dfc19e04499c623f0676cbe5d6baaeb645ede4b349fac2bd5c276419d5a + languageName: node + linkType: hard + "async-function@npm:^1.0.0": version: 1.0.0 resolution: "async-function@npm:1.0.0" @@ -2045,6 +2425,13 @@ __metadata: languageName: node linkType: hard +"birpc@npm:^4.0.0": + version: 4.0.0 + resolution: "birpc@npm:4.0.0" + checksum: 10c0/61f4e893ff4c5948b2c587c971c04883af0d8b2658d4632c8e77073db9f9e8b040402f985d56308021890b2ad32ef8392e36a8335cab1e3771d99e1b025d1af6 + languageName: node + linkType: hard + "brace-expansion@npm:^2.0.1": version: 2.0.1 resolution: "brace-expansion@npm:2.0.1" @@ -2069,6 +2456,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 + languageName: node + linkType: hard + "cacache@npm:^18.0.0": version: 18.0.3 resolution: "cacache@npm:18.0.3" @@ -2254,6 +2648,13 @@ __metadata: languageName: node linkType: hard +"defu@npm:^6.1.4": + version: 6.1.4 + resolution: "defu@npm:6.1.4" + checksum: 10c0/2d6cc366262dc0cb8096e429368e44052fdf43ed48e53ad84cc7c9407f890301aa5fcb80d0995abaaf842b3949f154d060be4160f7a46cb2bc2f7726c81526f5 + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -2261,6 +2662,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.3": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 + languageName: node + linkType: hard + "diff@npm:~8.0.2": version: 8.0.3 resolution: "diff@npm:8.0.3" @@ -2268,6 +2676,18 @@ __metadata: languageName: node linkType: hard +"dts-resolver@npm:^2.1.3": + version: 2.1.3 + resolution: "dts-resolver@npm:2.1.3" + peerDependencies: + oxc-resolver: ">=11.0.0" + peerDependenciesMeta: + oxc-resolver: + optional: true + checksum: 10c0/bf589ba9bfacdb23ff9c075948175f5a21ae0bccb2ca36f8315bff2729358902256ee7aca972f5b259641f08a4b5973034e082a730113d5af76e64062e45fe3a + languageName: node + linkType: hard + "dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -2314,6 +2734,13 @@ __metadata: languageName: node linkType: hard +"empathic@npm:^2.0.0": + version: 2.0.0 + resolution: "empathic@npm:2.0.0" + checksum: 10c0/7d3b14b04a93b35c47bcc950467ec914fd241cd9acc0269b0ea160f13026ec110f520c90fae64720fde72cc1757b57f3f292fb606617b7fccac1f4d008a76506 + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -2386,41 +2813,41 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:0.27.3, esbuild@npm:~0.27.0": - version: 0.27.3 - resolution: "esbuild@npm:0.27.3" +"esbuild@npm:^0.27.0": + version: 0.27.2 + resolution: "esbuild@npm:0.27.2" dependencies: - "@esbuild/aix-ppc64": "npm:0.27.3" - "@esbuild/android-arm": "npm:0.27.3" - "@esbuild/android-arm64": "npm:0.27.3" - "@esbuild/android-x64": "npm:0.27.3" - "@esbuild/darwin-arm64": "npm:0.27.3" - "@esbuild/darwin-x64": "npm:0.27.3" - "@esbuild/freebsd-arm64": "npm:0.27.3" - "@esbuild/freebsd-x64": "npm:0.27.3" - "@esbuild/linux-arm": "npm:0.27.3" - "@esbuild/linux-arm64": "npm:0.27.3" - "@esbuild/linux-ia32": "npm:0.27.3" - "@esbuild/linux-loong64": "npm:0.27.3" - "@esbuild/linux-mips64el": "npm:0.27.3" - "@esbuild/linux-ppc64": "npm:0.27.3" - "@esbuild/linux-riscv64": "npm:0.27.3" - "@esbuild/linux-s390x": "npm:0.27.3" - "@esbuild/linux-x64": "npm:0.27.3" - "@esbuild/netbsd-arm64": "npm:0.27.3" - "@esbuild/netbsd-x64": "npm:0.27.3" - "@esbuild/openbsd-arm64": "npm:0.27.3" - "@esbuild/openbsd-x64": "npm:0.27.3" - "@esbuild/openharmony-arm64": "npm:0.27.3" - "@esbuild/sunos-x64": "npm:0.27.3" - "@esbuild/win32-arm64": "npm:0.27.3" - "@esbuild/win32-ia32": "npm:0.27.3" - "@esbuild/win32-x64": "npm:0.27.3" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true + "@esbuild/aix-ppc64": "npm:0.27.2" + "@esbuild/android-arm": "npm:0.27.2" + "@esbuild/android-arm64": "npm:0.27.2" + "@esbuild/android-x64": "npm:0.27.2" + "@esbuild/darwin-arm64": "npm:0.27.2" + "@esbuild/darwin-x64": "npm:0.27.2" + "@esbuild/freebsd-arm64": "npm:0.27.2" + "@esbuild/freebsd-x64": "npm:0.27.2" + "@esbuild/linux-arm": "npm:0.27.2" + "@esbuild/linux-arm64": "npm:0.27.2" + "@esbuild/linux-ia32": "npm:0.27.2" + "@esbuild/linux-loong64": "npm:0.27.2" + "@esbuild/linux-mips64el": "npm:0.27.2" + "@esbuild/linux-ppc64": "npm:0.27.2" + "@esbuild/linux-riscv64": "npm:0.27.2" + "@esbuild/linux-s390x": "npm:0.27.2" + "@esbuild/linux-x64": "npm:0.27.2" + "@esbuild/netbsd-arm64": "npm:0.27.2" + "@esbuild/netbsd-x64": "npm:0.27.2" + "@esbuild/openbsd-arm64": "npm:0.27.2" + "@esbuild/openbsd-x64": "npm:0.27.2" + "@esbuild/openharmony-arm64": "npm:0.27.2" + "@esbuild/sunos-x64": "npm:0.27.2" + "@esbuild/win32-arm64": "npm:0.27.2" + "@esbuild/win32-ia32": "npm:0.27.2" + "@esbuild/win32-x64": "npm:0.27.2" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true "@esbuild/android-arm64": optional: true "@esbuild/android-x64": @@ -2471,40 +2898,40 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/fdc3f87a3f08b3ef98362f37377136c389a0d180fda4b8d073b26ba930cf245521db0a368f119cc7624bc619248fff1439f5811f062d853576f8ffa3df8ee5f1 + checksum: 10c0/cf83f626f55500f521d5fe7f4bc5871bec240d3deb2a01fbd379edc43b3664d1167428738a5aad8794b35d1cca985c44c375b1cd38a2ca613c77ced2c83aafcd languageName: node linkType: hard -"esbuild@npm:^0.27.0": - version: 0.27.2 - resolution: "esbuild@npm:0.27.2" +"esbuild@npm:~0.27.0": + version: 0.27.3 + resolution: "esbuild@npm:0.27.3" dependencies: - "@esbuild/aix-ppc64": "npm:0.27.2" - "@esbuild/android-arm": "npm:0.27.2" - "@esbuild/android-arm64": "npm:0.27.2" - "@esbuild/android-x64": "npm:0.27.2" - "@esbuild/darwin-arm64": "npm:0.27.2" - "@esbuild/darwin-x64": "npm:0.27.2" - "@esbuild/freebsd-arm64": "npm:0.27.2" - "@esbuild/freebsd-x64": "npm:0.27.2" - "@esbuild/linux-arm": "npm:0.27.2" - "@esbuild/linux-arm64": "npm:0.27.2" - "@esbuild/linux-ia32": "npm:0.27.2" - "@esbuild/linux-loong64": "npm:0.27.2" - "@esbuild/linux-mips64el": "npm:0.27.2" - "@esbuild/linux-ppc64": "npm:0.27.2" - "@esbuild/linux-riscv64": "npm:0.27.2" - "@esbuild/linux-s390x": "npm:0.27.2" - "@esbuild/linux-x64": "npm:0.27.2" - "@esbuild/netbsd-arm64": "npm:0.27.2" - "@esbuild/netbsd-x64": "npm:0.27.2" - "@esbuild/openbsd-arm64": "npm:0.27.2" - "@esbuild/openbsd-x64": "npm:0.27.2" - "@esbuild/openharmony-arm64": "npm:0.27.2" - "@esbuild/sunos-x64": "npm:0.27.2" - "@esbuild/win32-arm64": "npm:0.27.2" - "@esbuild/win32-ia32": "npm:0.27.2" - "@esbuild/win32-x64": "npm:0.27.2" + "@esbuild/aix-ppc64": "npm:0.27.3" + "@esbuild/android-arm": "npm:0.27.3" + "@esbuild/android-arm64": "npm:0.27.3" + "@esbuild/android-x64": "npm:0.27.3" + "@esbuild/darwin-arm64": "npm:0.27.3" + "@esbuild/darwin-x64": "npm:0.27.3" + "@esbuild/freebsd-arm64": "npm:0.27.3" + "@esbuild/freebsd-x64": "npm:0.27.3" + "@esbuild/linux-arm": "npm:0.27.3" + "@esbuild/linux-arm64": "npm:0.27.3" + "@esbuild/linux-ia32": "npm:0.27.3" + "@esbuild/linux-loong64": "npm:0.27.3" + "@esbuild/linux-mips64el": "npm:0.27.3" + "@esbuild/linux-ppc64": "npm:0.27.3" + "@esbuild/linux-riscv64": "npm:0.27.3" + "@esbuild/linux-s390x": "npm:0.27.3" + "@esbuild/linux-x64": "npm:0.27.3" + "@esbuild/netbsd-arm64": "npm:0.27.3" + "@esbuild/netbsd-x64": "npm:0.27.3" + "@esbuild/openbsd-arm64": "npm:0.27.3" + "@esbuild/openbsd-x64": "npm:0.27.3" + "@esbuild/openharmony-arm64": "npm:0.27.3" + "@esbuild/sunos-x64": "npm:0.27.3" + "@esbuild/win32-arm64": "npm:0.27.3" + "@esbuild/win32-ia32": "npm:0.27.3" + "@esbuild/win32-x64": "npm:0.27.3" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -2560,7 +2987,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/cf83f626f55500f521d5fe7f4bc5871bec240d3deb2a01fbd379edc43b3664d1167428738a5aad8794b35d1cca985c44c375b1cd38a2ca613c77ced2c83aafcd + checksum: 10c0/fdc3f87a3f08b3ef98362f37377136c389a0d180fda4b8d073b26ba930cf245521db0a368f119cc7624bc619248fff1439f5811f062d853576f8ffa3df8ee5f1 languageName: node linkType: hard @@ -2798,6 +3225,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.13.1": + version: 4.13.6 + resolution: "get-tsconfig@npm:4.13.6" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10c0/bab6937302f542f97217cbe7cbbdfa7e85a56a377bc7a73e69224c1f0b7c9ae8365918e55752ae8648265903f506c1705f63c0de1d4bab1ec2830fef3e539a1a + languageName: node + linkType: hard + "get-tsconfig@npm:^4.7.5": version: 4.7.5 resolution: "get-tsconfig@npm:4.7.5" @@ -2895,6 +3331,13 @@ __metadata: languageName: node linkType: hard +"hookable@npm:^6.0.1": + version: 6.0.1 + resolution: "hookable@npm:6.0.1" + checksum: 10c0/a53592937c1aa74a650b3b92a9d8cf8bd58eee48422124a90299344f81e90cd2ee2f3d9f3686c45c0bc87edbc9fede4de709edf6b987dd6837bdcfa502447fa0 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -2962,6 +3405,13 @@ __metadata: languageName: node linkType: hard +"import-without-cache@npm:^0.2.5": + version: 0.2.5 + resolution: "import-without-cache@npm:0.2.5" + checksum: 10c0/5cf7a00e317a23569f16c87391170270277c073cba498c913bf043af56c56118d023c8d041046535566135c34503c90a9320483448b070a4ab4ae29949547a71 + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -3114,6 +3564,126 @@ __metadata: languageName: node linkType: hard +"lightningcss-android-arm64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-android-arm64@npm:1.31.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-arm64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-darwin-arm64@npm:1.31.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-darwin-x64@npm:1.31.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-freebsd-x64@npm:1.31.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.31.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-arm64-gnu@npm:1.31.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-arm64-musl@npm:1.31.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-x64-gnu@npm:1.31.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-x64-musl@npm:1.31.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-win32-arm64-msvc@npm:1.31.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-win32-x64-msvc@npm:1.31.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:^1.30.2": + version: 1.31.1 + resolution: "lightningcss@npm:1.31.1" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-android-arm64: "npm:1.31.1" + lightningcss-darwin-arm64: "npm:1.31.1" + lightningcss-darwin-x64: "npm:1.31.1" + lightningcss-freebsd-x64: "npm:1.31.1" + lightningcss-linux-arm-gnueabihf: "npm:1.31.1" + lightningcss-linux-arm64-gnu: "npm:1.31.1" + lightningcss-linux-arm64-musl: "npm:1.31.1" + lightningcss-linux-x64-gnu: "npm:1.31.1" + lightningcss-linux-x64-musl: "npm:1.31.1" + lightningcss-win32-arm64-msvc: "npm:1.31.1" + lightningcss-win32-x64-msvc: "npm:1.31.1" + dependenciesMeta: + lightningcss-android-arm64: + optional: true + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/c6754b305d4a73652e472fc0d7d65384a6e16c336ea61068eca60de2a45bd5c30abbf012358b82eac56ee98b5d88028932cda5268ff61967cffa400b9e7ee2ba + languageName: node + linkType: hard + "local-pkg@npm:^1.0.0": version: 1.1.2 resolution: "local-pkg@npm:1.1.2" @@ -3772,6 +4342,13 @@ __metadata: languageName: node linkType: hard +"quansync@npm:^1.0.0": + version: 1.0.0 + resolution: "quansync@npm:1.0.0" + checksum: 10c0/076542634399a0cc46078baab6b31acee7a88c5a435234345f645aedaa42bc6a63836e655fb39b1b21a83c98ec86a4b73ec5e2b2d6f3fdc22711eeeff9463253 + languageName: node + linkType: hard + "react-refresh@npm:^0.18.0": version: 0.18.0 resolution: "react-refresh@npm:0.18.0" @@ -3847,6 +4424,142 @@ __metadata: languageName: node linkType: hard +"rolldown-plugin-dts@npm:^0.22.1": + version: 0.22.1 + resolution: "rolldown-plugin-dts@npm:0.22.1" + dependencies: + "@babel/generator": "npm:8.0.0-rc.1" + "@babel/helper-validator-identifier": "npm:8.0.0-rc.1" + "@babel/parser": "npm:8.0.0-rc.1" + "@babel/types": "npm:8.0.0-rc.1" + ast-kit: "npm:^3.0.0-beta.1" + birpc: "npm:^4.0.0" + dts-resolver: "npm:^2.1.3" + get-tsconfig: "npm:^4.13.1" + obug: "npm:^2.1.1" + peerDependencies: + "@ts-macro/tsc": ^0.3.6 + "@typescript/native-preview": ">=7.0.0-dev.20250601.1" + rolldown: ^1.0.0-rc.3 + typescript: ^5.0.0 + vue-tsc: ~3.2.0 + peerDependenciesMeta: + "@ts-macro/tsc": + optional: true + "@typescript/native-preview": + optional: true + typescript: + optional: true + vue-tsc: + optional: true + checksum: 10c0/b84ff0fb2b2c459a519929184f1d0434a8e47a1f4ef1af185f95fa20b6fa089e6ce34588d5f5d5261ab6696d410868a7413635b8d280951c3627a1043125d430 + languageName: node + linkType: hard + +"rolldown@npm:1.0.0-beta.53": + version: 1.0.0-beta.53 + resolution: "rolldown@npm:1.0.0-beta.53" + dependencies: + "@oxc-project/types": "npm:=0.101.0" + "@rolldown/binding-android-arm64": "npm:1.0.0-beta.53" + "@rolldown/binding-darwin-arm64": "npm:1.0.0-beta.53" + "@rolldown/binding-darwin-x64": "npm:1.0.0-beta.53" + "@rolldown/binding-freebsd-x64": "npm:1.0.0-beta.53" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-beta.53" + "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-beta.53" + "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-beta.53" + "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-beta.53" + "@rolldown/binding-linux-x64-musl": "npm:1.0.0-beta.53" + "@rolldown/binding-openharmony-arm64": "npm:1.0.0-beta.53" + "@rolldown/binding-wasm32-wasi": "npm:1.0.0-beta.53" + "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-beta.53" + "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-beta.53" + "@rolldown/pluginutils": "npm:1.0.0-beta.53" + dependenciesMeta: + "@rolldown/binding-android-arm64": + optional: true + "@rolldown/binding-darwin-arm64": + optional: true + "@rolldown/binding-darwin-x64": + optional: true + "@rolldown/binding-freebsd-x64": + optional: true + "@rolldown/binding-linux-arm-gnueabihf": + optional: true + "@rolldown/binding-linux-arm64-gnu": + optional: true + "@rolldown/binding-linux-arm64-musl": + optional: true + "@rolldown/binding-linux-x64-gnu": + optional: true + "@rolldown/binding-linux-x64-musl": + optional: true + "@rolldown/binding-openharmony-arm64": + optional: true + "@rolldown/binding-wasm32-wasi": + optional: true + "@rolldown/binding-win32-arm64-msvc": + optional: true + "@rolldown/binding-win32-x64-msvc": + optional: true + bin: + rolldown: bin/cli.mjs + checksum: 10c0/363109aa38b31254e682e69aa9f199074d98b823b437faac6d05fd1b4a2b73168b9434043a060fecfc25d3e1d441e2d3b757e92621bc1e843a3e916e2b0d3f58 + languageName: node + linkType: hard + +"rolldown@npm:1.0.0-rc.5": + version: 1.0.0-rc.5 + resolution: "rolldown@npm:1.0.0-rc.5" + dependencies: + "@oxc-project/types": "npm:=0.114.0" + "@rolldown/binding-android-arm64": "npm:1.0.0-rc.5" + "@rolldown/binding-darwin-arm64": "npm:1.0.0-rc.5" + "@rolldown/binding-darwin-x64": "npm:1.0.0-rc.5" + "@rolldown/binding-freebsd-x64": "npm:1.0.0-rc.5" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-rc.5" + "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-rc.5" + "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-rc.5" + "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-rc.5" + "@rolldown/binding-linux-x64-musl": "npm:1.0.0-rc.5" + "@rolldown/binding-openharmony-arm64": "npm:1.0.0-rc.5" + "@rolldown/binding-wasm32-wasi": "npm:1.0.0-rc.5" + "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-rc.5" + "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-rc.5" + "@rolldown/pluginutils": "npm:1.0.0-rc.5" + dependenciesMeta: + "@rolldown/binding-android-arm64": + optional: true + "@rolldown/binding-darwin-arm64": + optional: true + "@rolldown/binding-darwin-x64": + optional: true + "@rolldown/binding-freebsd-x64": + optional: true + "@rolldown/binding-linux-arm-gnueabihf": + optional: true + "@rolldown/binding-linux-arm64-gnu": + optional: true + "@rolldown/binding-linux-arm64-musl": + optional: true + "@rolldown/binding-linux-x64-gnu": + optional: true + "@rolldown/binding-linux-x64-musl": + optional: true + "@rolldown/binding-openharmony-arm64": + optional: true + "@rolldown/binding-wasm32-wasi": + optional: true + "@rolldown/binding-win32-arm64-msvc": + optional: true + "@rolldown/binding-win32-x64-msvc": + optional: true + bin: + rolldown: bin/cli.mjs + checksum: 10c0/66af94a3d91657631967cc1db377fae3291665821d2882ad2abc01cf124539459cf3c053334002f4dcb45a53e67d5c3678aa31c2deffbab76b7b73dc495e243a + languageName: node + linkType: hard + "rollup@npm:^4.43.0": version: 4.57.1 resolution: "rollup@npm:4.57.1" @@ -3962,6 +4675,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.7.4": + version: 7.7.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 + languageName: node + linkType: hard + "semver@npm:~7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" @@ -4240,6 +4962,15 @@ __metadata: languageName: node linkType: hard +"tree-kill@npm:^1.2.2": + version: 1.2.2 + resolution: "tree-kill@npm:1.2.2" + bin: + tree-kill: cli.js + checksum: 10c0/7b1b7c7f17608a8f8d20a162e7957ac1ef6cd1636db1aba92f4e072dc31818c2ff0efac1e3d91064ede67ed5dc57c565420531a8134090a12ac10cf792ab14d2 + languageName: node + linkType: hard + "ts-pattern@npm:^5.9.0": version: 5.9.0 resolution: "ts-pattern@npm:5.9.0" @@ -4247,6 +4978,59 @@ __metadata: languageName: node linkType: hard +"tsdown@npm:^0.21.0-beta.1": + version: 0.21.0-beta.1 + resolution: "tsdown@npm:0.21.0-beta.1" + dependencies: + ansis: "npm:^4.2.0" + cac: "npm:^6.7.14" + defu: "npm:^6.1.4" + empathic: "npm:^2.0.0" + hookable: "npm:^6.0.1" + import-without-cache: "npm:^0.2.5" + obug: "npm:^2.1.1" + picomatch: "npm:^4.0.3" + rolldown: "npm:1.0.0-rc.5" + rolldown-plugin-dts: "npm:^0.22.1" + semver: "npm:^7.7.4" + tinyexec: "npm:^1.0.2" + tinyglobby: "npm:^0.2.15" + tree-kill: "npm:^1.2.2" + unconfig-core: "npm:^7.5.0" + unrun: "npm:^0.2.28" + peerDependencies: + "@arethetypeswrong/core": ^0.18.1 + "@vitejs/devtools": "*" + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + "@arethetypeswrong/core": + optional: true + "@vitejs/devtools": + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + bin: + tsdown: dist/run.mjs + checksum: 10c0/5dc5232c08f14000447b5fc2280850adad293678468be13b371966fab7522be14284a39fd3efa20673e94f66cf201a9bd8b6de3a886c964c5818dfb801bba0ef + languageName: node + linkType: hard + +"tslib@npm:^2.4.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + "tsx@npm:^4.21.0": version: 4.21.0 resolution: "tsx@npm:4.21.0" @@ -4328,6 +5112,16 @@ __metadata: languageName: node linkType: hard +"unconfig-core@npm:^7.5.0": + version: 7.5.0 + resolution: "unconfig-core@npm:7.5.0" + dependencies: + "@quansync/fs": "npm:^1.0.0" + quansync: "npm:^1.0.0" + checksum: 10c0/9c9f745254aa8e267140430a432353d17ee87f625b0ea0668e189d88736828d117b66bd2dd41f1d48bd40d44d5b7c7d160e8b7996a60c8f484e2975ef73c7cb7 + languageName: node + linkType: hard + "undici-types@npm:~7.18.0": version: 7.18.2 resolution: "undici-types@npm:7.18.2" @@ -4360,6 +5154,22 @@ __metadata: languageName: node linkType: hard +"unrun@npm:^0.2.28": + version: 0.2.28 + resolution: "unrun@npm:0.2.28" + dependencies: + rolldown: "npm:1.0.0-rc.5" + peerDependencies: + synckit: ^0.11.11 + peerDependenciesMeta: + synckit: + optional: true + bin: + unrun: dist/cli.mjs + checksum: 10c0/c36b8f4a10d594a0ded6a362447a5b5ff45e2058e89a9b8765287e20ee11b663d6ee2728b6ad508d7d4788da1d8cbf4aa19eaa6bad158b31e663283ab0bb5b92 + languageName: node + linkType: hard + "update-browserslist-db@npm:^1.2.0": version: 1.2.3 resolution: "update-browserslist-db@npm:1.2.3" @@ -4406,7 +5216,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^6.0.0 || ^7.0.0, vite@npm:^7.3.1": +"vite@npm:^6.0.0 || ^7.0.0": version: 7.3.1 resolution: "vite@npm:7.3.1" dependencies: @@ -4461,6 +5271,62 @@ __metadata: languageName: node linkType: hard +"vite@npm:rolldown-vite@^7.3.1": + version: 7.3.1 + resolution: "rolldown-vite@npm:7.3.1" + dependencies: + "@oxc-project/runtime": "npm:0.101.0" + fdir: "npm:^6.5.0" + fsevents: "npm:~2.3.3" + lightningcss: "npm:^1.30.2" + picomatch: "npm:^4.0.3" + postcss: "npm:^8.5.6" + rolldown: "npm:1.0.0-beta.53" + tinyglobby: "npm:^0.2.15" + peerDependencies: + "@types/node": ^20.19.0 || >=22.12.0 + esbuild: ^0.27.0 + jiti: ">=1.21.0" + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/01b6af00aabbdfbb59a069e5b932336769b1a8effd0fbea0e6ea78b0c3b97ff5be721f3d16b3cd5928444e22566e5850e12eee53b5d9101e98e52828e6e53e00 + languageName: node + linkType: hard + "vitest@npm:4.0.18": version: 4.0.18 resolution: "vitest@npm:4.0.18" From 434118ac6cc1187a2ccfc041fdfcab501f0ae557 Mon Sep 17 00:00:00 2001 From: Jure Rotar Date: Thu, 26 Feb 2026 11:07:45 +0100 Subject: [PATCH 07/12] chore: updated tsdown config --- package.json | 8 +++----- tsdown.config.ts | 17 +++++++++-------- yarn.lock | 2 +- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 3a807ae..04aea84 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "react-query", "zod" ], + "type": "module", "homepage": "https://github.com/povio/openapi-codegen-cli", "bugs": "https://github.com/povio/openapi-codegen-cli/issues", "license": "BSD-3-Clause", @@ -48,10 +49,7 @@ "start": "node --import tsx ./src/sh.ts", "test": "vitest run", "test:watch": "vitest", - "build:clean": "rm -rf ./dist", - "build:client": "vite build", - "build:cli": "tsdown --config tsdown.config.ts && chmod +x ./dist/sh.mjs", - "build": "yarn build:clean && yarn build:cli && yarn build:client", + "build": "tsdown", "start:dist": "node ./dist/sh.mjs", "gen:base": "rm -rf ./test/generated/base && mkdir -p ./test/generated/base && yarn start generate --config ./test/config.mjs --output ./test/generated/base --no-prettier", "gen:next": "rm -rf ./test/generated/next && mkdir -p ./test/generated/next && yarn start generate --config ./test/config.mjs --output ./test/generated/next --no-prettier", @@ -124,5 +122,5 @@ "npm": ">= 8", "yarn": ">= 3.2" }, - "packageManager": "yarn@4.2.2" + "packageManager": "yarn@4.12.0" } diff --git a/tsdown.config.ts b/tsdown.config.ts index 10f37bb..e1e619a 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -1,5 +1,4 @@ import { readFileSync } from "node:fs"; - import { defineConfig } from "tsdown"; const pkg = JSON.parse(readFileSync("./package.json", "utf-8")) as { @@ -8,17 +7,19 @@ const pkg = JSON.parse(readFileSync("./package.json", "utf-8")) as { version?: string; }; -const external = [...Object.keys(pkg.dependencies ?? {}), ...Object.keys(pkg.peerDependencies ?? {})]; +const external = [ + ...Object.keys(pkg.dependencies ?? {}), + ...Object.keys(pkg.peerDependencies ?? {}), + "vite", + "postcss", +]; export default defineConfig({ - entry: ["./src/sh.ts", "./src/generator.ts"], + entry: ["./src/sh.ts", "./src/generator.ts", "./src/index.ts", "./src/vite.ts", "./src/acl.ts"], format: "esm", - outDir: "dist", platform: "node", - target: "node14", - minify: true, - clean: false, - dts: false, + target: "esnext", + dts: true, deps: { neverBundle: external, onlyAllowBundle: false, diff --git a/yarn.lock b/yarn.lock index 8e0bb55..f8eee30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1332,7 +1332,7 @@ __metadata: "@casl/react": optional: true bin: - openapi-codegen: ./dist/sh.js + openapi-codegen: ./dist/sh.mjs languageName: unknown linkType: soft From 07043e22c7efd3dc009d02c16eb9ad9281446f66 Mon Sep 17 00:00:00 2001 From: Jure Rotar Date: Thu, 26 Feb 2026 13:17:39 +0100 Subject: [PATCH 08/12] chore: updated tsdown config --- package.json | 22 ++++++++++++---------- povio-openapi-codegen-cli-2.0.8-rc.5.tgz | Bin 1494388 -> 0 bytes tsdown.config.ts | 21 ++------------------- 3 files changed, 14 insertions(+), 29 deletions(-) delete mode 100644 povio-openapi-codegen-cli-2.0.8-rc.5.tgz diff --git a/package.json b/package.json index 04aea84..a677c5b 100644 --- a/package.json +++ b/package.json @@ -68,12 +68,17 @@ "bench:vite-codegen": "node ./scripts/benchmark-vite-codegen.mjs" }, "dependencies": { + "@apidevtools/swagger-parser": "^10.1.0", + "handlebars": "^4.7.8", "i18next": "^25.8.11", "import-fresh": "^3.3.1", + "prompt-sync": "^4.2.0", + "reflect-metadata": "^0.2.2", + "ts-pattern": "^5.9.0", + "typescript": "^5.9.3", "yargs": "^18.0.0" }, "devDependencies": { - "@apidevtools/swagger-parser": "^10.1.0", "@casl/ability": "^6.8.0", "@casl/react": "^5.0.1", "@tanstack/react-query": "~5.90.21", @@ -82,31 +87,25 @@ "@types/react": "^19.2.14", "@types/yargs": "^17.0.35", "@vitejs/plugin-react": "^5.1.4", - "axios": "^1.13.5", - "handlebars": "^4.7.8", - "openapi-types": "^12.1.3", "oxfmt": "^0.34.0", "oxlint": "^1.49.0", "oxlint-tsgolint": "^0.14.1", - "prompt-sync": "^4.2.0", "react": "^19.2.4", - "reflect-metadata": "^0.2.2", - "ts-pattern": "^5.9.0", "tsdown": "^0.21.0-beta.1", "tsx": "^4.21.0", "type-fest": "^5.4.4", - "typescript": "^5.9.3", "vite": "npm:rolldown-vite@^7.3.1", "vite-plugin-dts": "^4.5.4", - "vitest": "4.0.18", - "zod": "^4.3.6" + "vitest": "4.0.18" }, "peerDependencies": { "@casl/ability": "^6.7.3", "@casl/react": "^5.0.0", "@tanstack/react-query": "^5.90.21", "axios": "^1.13.1", + "openapi-types": "^12.1.3", "react": "^19.1.0", + "vite": "^6.0.0 || ^7.0.0", "zod": "^4.1.12" }, "peerDependenciesMeta": { @@ -115,6 +114,9 @@ }, "@casl/react": { "optional": true + }, + "vite": { + "optional": true } }, "engines": { diff --git a/povio-openapi-codegen-cli-2.0.8-rc.5.tgz b/povio-openapi-codegen-cli-2.0.8-rc.5.tgz deleted file mode 100644 index 6bfab59ba275d748c8e0ae9305eddcfa5ae8696c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1494388 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%0AUnwij#iM^#D&Xd6-S8&+A^aSjo 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%0A+Ox^wVYY2u@uCRbN#q!)x!1KGC) z#ddd*2nH%ySy$7;n$nt0?o{pjTivg!iMCT~T~Kqs!d9MVce*fcw|QAum{c;#R@+w5 zSoi6Nmkx5?vN9oCvudI~b8gW1)RXLSLp%k=(_Ns`Z<3aBTjE8}WeQP$SO zTiDt{vm5;?YqTG0kawhYv#8N`kA%vg)+|F*EG$}psKb!hsA2G+% zl$y+g8~!!X)GBVHRziZb_y@bOOovXZs2Z)7cw(wkWnD_Di>9AWD%4d-kY|=dbE4-H z6&AH+ynKO`j@ziQz~4M6H`8)%@{Po8)K|DbqZY+XsS>wK+EEwoPqwVE>P)g%W&cv5 z;=z0Ap}fu{${OBrcqpi6l~{ePeDx6bvRtC^ok108Uw#3qE?l5NJe2)M<%J7$Z;>Q! zTU;c0=y)k6am`Jche(QiiP<&keSe73@>(LUvg+AGJ8^T-#BJ1Pcu;2eAT^H~NnDs5 zA1oC961A^Y{yt(ZS0?H-B*?vM6PUfGxNcjpjHTGwMjb~@$-*k{(*oYpuCE5A?n&*w zts{==dimJJ?`i^EK{lFwx5BDa`d2C;T?OlRw~|&?`9=0>(8XWl`@yR20QHzIa^L7T z7oanFLVbyV*n40`SZne%uqZa_P`ZkA-i+###R!t)r)zSzw!Pb{l*+1ZrH-kz0G$$K z#cfooNRanER1~+@9HlQog&0MEB5tGlM1tf?Po`=}m-%hfnRrlnziShM#qG7ex#Jai z!UVGW?dt}+^6l6$Dl6hPDpMq=b}r*~zh(mE>&0iG8pVTZ^PmE>oK9C!nNlsVH`w_k z8PiggZ`qQ;kCxhthR)U(u{MB!DlXihSKiPk z^aZW&<;fKzt`nk$_#LpAsFtY~_+1bcT23D-6}HMUPcLSriredK`))v0q#|ywcRZ}Z zjxut$vc)bBv0Gs0O>k=Kdg?qL?bqVotVU8Gx7T^*T(~7&db^_%#{wJ+5QEdV79bMs zt;*9fxw37+6uCfQ5yM!WW>Z_lNEF)nVh}rI=HP*Ak>ifAcko7#WL@)adygq!PLSP6 zna{Z`0r3?uMtTPBC`l(Ok2}qdqmrqjc=`!T%R0@j)J%BP?BqJj%j;w^s;!ClJ&Q4< zh~?Dl87ZqmJtwmp)_rxF`Y@GRFLJ{Kmz20eRu~4ryy0vz!a~#w;e)Wqg253Bx`WD~ zni5e3maV0A9aI8U3q%F#F7AR(%NTrFs6gEslisdFt||f~kod}q5xW{ufMsuI<1uhv zjJ;|)E8r5H#6MA^XKJ`bqLQOx?x0qu0vG6xhP{KDoC;i^Bkwp$hm5|i(IwoQ9tea$ z=%un+Ga|H|B+rnTD9M4cjUry-IxGsFFHDHGo{`| z2g2T`lP__nZ6*?)z2cp01kLm$3cx(Hqj8dgm&cmKL!kVK7Ygxs=iGf*JDR?}P!F-ia;n+b6W^J#ws3*2O$rFx%#;AjeaLsggly(afaMq@26cD%wT~GB$^P-tT9NAgTBipOfzK??u-M7=!Dy`qrgD9Ug2T~ z(ael7$lIBOv?_O{hh)6v0I_E`xdD4Ej?^XLuE|CTDtEf#Cd~v9#9btKbQ0dWSR)$j zd@+P5L)2A!dTF41vDT;&u9+MOclRrB4~W|qdzFAz>QoYC=BfblW{l^%6@_aDbux<)gohsV+^M;yef8WDPvL2feW$LY z`K&?F@15cIkw?nR=*qx-U2sXL;P8N2ujC-2bm_uGi zMOuT6tAe$)ML-50xl*epIE{uudwl*LVHi#G}0)L5%Un=S88(&d;po)^z zDyU$gm<=vWo?CcrPEiH~z|%027r0kn3wAr#AVH8Fq6A6RBM%l2y92X#JxMw#fKB7; z6A3a-k{~9e!?Yx>FJ47ax&k-oyY~({#B(Biw?JBIvfRR|&n7Zx)e`dtv65Khr9j+So3ZP4P^Bt?o(-f%?X=f=eQ6BopyP_ssJ+$I zj#)--tK28gE~_y8>9m?_vhxcNt?3o)N*H^Ht_*iVWX$cCF!!0{+7-CA2CZ2<%AZQ4#UyjCN)=IVA3@ENmi+cc8TWBPutNG!o2QH}nXq{D2ab}`%;Q|a#` z`VH~_f_1sPFJ3{RqQxfxo#e@^zLx2 z@#*~3Px9cSlT+TsX&)&%G4+$XDcPG!?nkon)|LhM;JR1wS?HQ&;~}JvJ$!JkQuO)8 zkCGGNDG|)b{zRWv`xE0KV@{>RnSU5nPoc{G)`yS3w}p;PkUIgbs@*DN&Y56WyC#XA zTT-KRla$XXsL{E(#7~w8P06rKhle?-|FaQg1*V`p3yb~QlkwbE?X9ljsZw9;RduR$ zR%JD>3M&GK*UEieyVq=Xdwr|8s^Z9z@w;l3oi$YsvPsPwkX-|jhS=zoYqjef1 zO~(gOmUxxePTySg%W7_!SJ9{-WetlOhCw=1^aZ~^e>k1YhC`)BAa$X?I6rAW|8xxe z5jyz8PkjcV;m02nN@N7rZ+sk8;9iAXjnU|ej;IRQ!Tv2NzEG?*0k9rkW5{JS2a0w% z&hF@BtHRB31@1`G^4j3{$Y0Qh+mjTr*7ZrsWnmcn&MTw%&dS&t-zD=RrbP!og|jD) zDE`tn#y1Kg^cOgx=80Zd=$ZWY^E0_MD>HiCtjt)h&$21L3w}t)#JFSp5%o46DGC8; zbQSN?$q45F=!bqVzB#Bs+@FvvkBn}?YoM;k%IG&~0h|M|DCSvfN5<;Cx>aMEP4j5> zadrorNro(BzNM~+M(^J|UCDQ*3#9hRD8-nJEX32Jl*VK0F3B76YLev&Oha(+?4t#Ox}K0Y5k;C#o#yy9Gcm^mO=T&Kw&(80T_EhU84Nu3eZ* z77GdqD37Et3=+K*v+s=NQLct+guyW<3aws={jGpKbmyYGEo)ToyZ-<~$(wYNXiixI zWIPjJROp+iCbhD`$uK3xpI51U=2bi_6JDYCQ``C6TZ=ZF90`%02o{Z|$%BfQ2opJE z7+j#Msyb1eBbGVu3fx&jJQB=`*9?LY;wQJsI2~yrix~9ULNg4Et94Hr;I{i-B`~Z1 zR(YoR_?n{HzSu9--2Nhjy2Zt<>wsT{kqe$jlM{HDd$U8ms4ol%G$)`e zF@0;~TU#xu3vo+T+N-PBp_;NoCI{(+FUNlfnd`1q$lAFK#_|@i}uU42yQ+)41=ThG}S|SAne{x)vzReCo|>xSst6j zCgV?PY^WE`aW@Wj*W)4BzdSreWw5&*HRzHF3bhib}+W_Q=a=ug2P9cLM- zYT^C*!7u%KAlNXFI{(wjHzbXU%stFkoU z*J%!(%(p6D^}WVTk@o7nz*h0Dh<=-bn&#FBZBc8$T|%Huv?MWQ_<}w&pY_Ew$A2{&G3s%v@?w&8-aF|wMr zq=?yBy;?%wKh|q}CI{fxA|``uW(`Z?LSJjXZX5D0s@z)Sp*NTZq!-Ne3(g#Ip=1tC zEAWy_MON_iCh;sqtWu5Vv6Zagk=}B~(|9Sr0;R`-K81hl%NsKaN4YB0q&%m6Qk;BA z!3CYZ_Ip_0YwV4h0Eu9U^#|~@RE>uh?^nNPBw{~UZx*}5xl*-y$ z2_5^uz=D{{1*IkiB%1PVP3CNhIyaYNwPoJd8f|Z}KXJn?5jXmML{IbK#G)uP-@2e! zbjEXB-zuc(I3c4a8?%SNbSsW z2nvCkFe9^mAJuLL%>DBFEGuc_NKufcS6nLm0KOp!4sDgU3tpKW7O+{cA+W^7Ri#kq z>;S$$ac0^`-HQ-Jb!T<$Pmab31X&d^j*ZdCk6??2wI#6+jIdF|? zyczU{bk2}U>3``Afs>AvF{mfUTho5G-{~})>#KaJ>LUVLCVRx-3BeU^%)?V=~y(UwJ;1$bg%AZuNEf5gary$U)30^Ta(d;WIUrm z{63nEP^W#s4|BAsFpR{4G8x+%?zYG++l02(AU8QAqjg1cNQtJ2I-{+MD?6t(im^^7 zy^XmpC@ckiX1(S-TZXTsRpxq7uHLUlY8+@Fb)zau^Y0 zZDJc&&x_?0_qsBEldxZfm$3H6JiGZl0fCq}0nuTs#xoYASP3H_o@)%FF<0k-tI>U# zZ>w-Mo%@Np6xaL;$Y8OA@FRtXD#Vh0zQkCthti9h|GplvhE($ z5a0I5H>`(u-jk6b(<;L`38+3Yp%E!tn-;*tH$x4%@WaqBCrVP8!*Rn^^XcS7vp! zrPsWjpm?p{U+?L;@g2n2H^Fle)0>0VklYhyfq^k-w_>+mPnxvX1NE`Fkc4Txg`~`F zs8vtb+*Ztzt=6p+xfIb`r!DXUOgG1hDSj!SXfN|hR|4h8tEM|bG0sk7Sd zk@l~)*dxnw9as|J6bbrkusu5LjV+G1j%eO%ce<1cL4YMyew!5UvmvAu?{*DU*1)Pm zSQq`VD=uMr_Z{XA{ppL1X^X_R;cm8?y;X`6W`WMpF`FVmW@C6`@J?yCp2cwt>@!sy zWE#_N>=mW#`T^}wE~D?6XL z#;DQ@4Hk%ITi=`d#~=U}ijp2^rquzuOqEOr!)|4MiA_}@v~bMHI#7}2CfAx?<8Eew zb`FgoYZzJymH8YjGb=v=q|d2g4-F^lfVD}m*7XZ!)&ji+9{1$ZHon=zJO#^Zu(Z@J zj~CsN z1xV;Wi;q^^Y@DB8T4B@VFrts8-vB3t5ce+@P640x`D8n$=(NnD6K1-L;`x=~_nJkNE9jW3z9VTO=x)RS? z(>4X64-qKCgn4!l4%FRgl3%G3DX|X}2{m{3M$-2O#h$5u{PqQ*TPXv5 zY<+oa_H0#Z92N;ocqK!2A*_6$^-_@at;w9+5GQjd$sye_$*Ta; zkjFN2qtwh(sGymZYFJlJbeJEcYN_pLmPkoYw3dF?xY!s+IRSHT2Ut(K+7s6U0*$+& z@re4lK-)$0QcLvQ#`s>r(akzQSN*T4mVTBFo(6{rkqfm~Cx*VjgO}&hkPh#57p_z+ zX_#pRA9=Q#-7nl*e_Z#fb8bG|t&s+&&1SYL^YVBgw`SVOsKh(q*qsX4d3 z0$xcHBo(g$Y^LRrv6?tc^%a&UPY&=d6bG`LBov{Jfg@lR#t#;J_*Sfq-S{B!aWRjMUy}Y}| zt6Rs4%T+;6X66TFWxytZX<`7xy|vCNt2zzPzoLx0&313KLxHp{*uNL$0QnZ+--trGxwdm5 z>QTinV7}3pBvGRf@%sV-Kdwdn>{2+wXcH}vKuf^rd)8^gYk&!`!#k?mY_IjZl&{Cz zPj=u%F!8v%*6cLfYptF$H3Gv3zW-$DqaNoM zU1%h#4bfP0(CMu;n|ks@fu*+QUZvk#ZLY2A1aIyQixK)R#>yc;tNrzUyUUp*>v5_r z$kFcgyK7xG+Nr^)R*t(p2nf}$)bYRnF!!phch}d~n_XutTqJq2AnQV72sZ+lgTgD( z7m5(VPwOdHThKjxiGXWNuL%u8 z&nd2bxNi|=;smuQ4??xX(~e+PojM%|7RcsJ4sd%wxdndT9Thd1$B83qA(jqofkUsg zyE|hb!t%JPDVO$^!(_ajkO})vG9J#xi5K1P8MFoM?B1tE>A2P`K+#_y{3Xne5CU;s zxmQ(~`U$q6TIy9pG1(vSN?}bmWh~JBs=tSg?P8hY!jrnI2>LxNZh}mJRL_iwoRx)G zi&}B!qf)ACp#ntq%4)sknp%jqupPJam147)7qCE1=NI!nVHo7hnS7DA>EJP*r*PBP zWY2hf(zB%tkx|LK!bzDY8bR-T1JTl@M!u@J$zZk!p#wFQ{q%tcz1I#Q*5 z051vrgRPz3w@-}=nX#y`II2@r1q#oYs9=?`6#FQ@(NgBIp zo_xFRidpw>xG_+w;f)c7!E61BE$0zOv}vyBrY zRV!{u4Fe@Fp^QaIU8zhnFRc804`C)C@6f+q2wiZOXp@6rrtbr_YymtZ9 zLvT+<{;W6A&qj-py4$@7G)Y{rYdo z{DO1}_{#=8r15}X^s?Vf;Jxn*1p9axlh~HA{ViOBSl3ykUGF4fJYGzD9q9+-wus)$ z(ydDZJg=|Sir1HQxan10ZAhpkKU7_fR_2<~IMkFbuB^Yizo5D^3Lb(tBJ0&ADx(vI z!Li}lM9j^PNj}kM4FBe7ByJKW&$5jtv#Tprn3!4iQ4{;3NUnG}(QjtPCAI7SDk;ZrLKdBYqaIdm_{&^!u%JU-MOjpY6eRcM9w|Ims6M6fwKoPR#DTEN4X^{-QSD>*@W+ z4V!qcMn~CrjK*B0%5Re~$4IOexK!1z)e;1?wjyT*@^FZms4Wsg=g#$P^5rD`rgSYM zg!&~mGDfj`iw1={90osE5Dq6t2{?>XsL3p+&Ho$%jp#pmM7JHUW%1@_-J5HNy!Gsm z|GzeJVHj-dullvJPO1x}er41yiD$p4?o;Z%p{DcH>tA)Rhp(T%0?Tf0vdOO}ENRgL zZ=~N|(?0s`H7}9hUQ>{J4LF$>rMh9y4EU){4cg7tDlQuOX~FGg++%RNDZp(!7U-u2 zTRK6%9l}CH!Y3`QJ|tbz1$|r4ZUWE51?{Fsj9N9+2;*Dkx4=n}TOU1gR9&V=OW%*# zPK~tOCOFSj8S9KvB5hT9fV?-3w0IT>zn=WbDk^$#i(ac+9D4CgonF#Q;;XAByUA`j zrZ4{dZqGTpn>gvhF!-t)|K`f}d7dU$iWp;vP`{_th^76yBF#55A_c)TMPV3x)9*>& z{y<;^Ue|g>!@yBWARe>R6CCE#6a7d7d#cNI+zwjH{Gi)9Jc#Mq@$kSC2iIJ25K@P* zxcb3~>3q_mSk5OMz2;YmgE(1rc2c`$C-LD*KLvOVzkq%UaNlmnz5uVA?bup(cIjH( zE^TpS1o-J}-u24nZ8zH;3V}es1-whTP5S-(X2(IMt!{@IypIY-rr$KiAN11r!_^5S zlMxtJkXC>m>~d(CijZ9{! z)&LcfqM+Umgph8M`>kS_rWTRxTq@E5-I%gftR~9J>s+ZLmG4>{*h(Ila4)l2?xMmJx=+eY|S_{7pn?GF(sTkQV{lFZu;~&y?2+1ExdL2x`Ai zo5m|3{OsyFxrtZTaAn~G!E-f*P?z9sVYeSxa=@3>6;ieH7+1?VJuSs(__4%gO>)*d zXR>Bw4ClRg6_)Wi z9|`Ac@hWzP&w}%QjB2QJJ_OF!<5d`$bEf`Dj7yW#i(bUI{w|n)5Xoh6aKv<3ZzE>B z^!j9Wi*;OA;9CDVZZIEy4R#=~gm`+vVijhS9{&M1?9XxIAA0-(7Gj^{2H!P;tv_^% zkKr4zSca+PwFS`vU?uU)LJS9(RNfKnsLc*KUt{vL{>sxGxA01irx5}VK(AOzfg3s8 z;Pf~H+u_e~V@8j+oW=f@9`87_JmK11Uk9-k~G#A_&&aO{E@Gqt^81#L{uudMfv*DxMCpNa7r z=0W6qRWbVPzvF{9M$4V|th|WVpfA5MFCDL;a|!ETD4Y2q^O7;-aItWeuI(LWdp3-A!WK<$pi_~JBz(tF%(X$*Yk@@x!& z5@9s(r-t6#BrzJ1;ZG(3Ss8cXgGM?9!YG?va9GB;)5Q`4U^+prv^}I1_?zMP!*Ozx zuq_4@S^(3KTqUK-Pp^|n+=DR|0DVLi*D*#4xi%v|Rz*QokRjqHrXA^I21Z;!KHw+Q zjH#OFQHG9~XSW!~xFyQX5CecmxXI;WfTt=SV(1`Pu>8O!W9SX?Ph;JguQOI3_K;A` zr1r2-Hz`jSEO7IvISCUXGseSJ02l+8D+U%3OSOcMigBxrv<`lY^=;D4nMmr6FzTl!Fm)Nk&_FO7zBWm1#3?GjrDRr zE#k%ss+Lwxi+lWy{_2qbqp>pLqF>?RAO3ldzwhY*JhWH-Daaf9w7?LP5V9Ftx`3y2 za+#r5`#;dg4Yl$cHh)8{zrNv@@$(L14heGy%Z7|OWK4R7ESdV7itpGivyGNb<*6^r zJ+O-oUn>m+e=Y7^1Qx}lzo?YREDQy|zJq23KnK=}9jh`aKRU3c&NwMyRXh+{yB?mF zUL9E9#)lKY8pJg(_=c389aztcydkA;2e#@*-H_tDhH*e;P^P$XH%x(x|5_Dn0flMQ zOn@<)$@w|7Mau@2{1^%Q-gmLCMe>u*+28?w?zn0o0WJU&jKiFbR<$j4U16PRv{Tu) ztFEH>4$_WsI>#pWt*h&>+;(cb$}4Wx-}7{L(~n3a>$-Bc?pdnFqZ)r|guAF)cS%~- zmj4Hx*^~WlBtCzIdoUF@QwAPl__>}L#r`4LNiei7m za9;94+ILnl&mz`t4|GL$?APlM+^T;}!KlVszwKqYa8j2} zr$1DqHa3tg-j^XtJdgkH*I1BU`&GLIPHUZBx4$^QHb%hpPB9-SQS}LCo@Ajoy(GXz zF(;P2q5SMVBD%Xd-bVE|&uy(p#<`SxLDZTKGuUhNfR&TA>>_}r5KY*cVo?UWX9LG=1 z?Mr*D-|tr3<|=b-Jgg4UIupWP-+60gwb{qH`wq5iATEy0_i0f&P4@ch9de2M4)&tp zrQXu74*uB@-VjtWvAO}wdkRS_&>g9L=I^`CQg$MxpU;Qqg;e1D z{_O2{vgUyxPxmOs6VBeFVBQfdZR;!~ws327n?g#0-J7&D`RRS2%@!zPZS*-$pdV&~ zgD4d&0obrgBKG}3#<`!#O!T*8O6O)3Zj;?4kUK?G;Mg6N0@GQ8Nf8#Z3dVr~Ue$mL zK69%DrW4s0HSv2`=*Tq-ik-@p-dY3C1?5h4QH^Az3fvoCPUdcM&{PWi@ii6roUfKx zBUQ%ia4ee4$Dm;}czpi*aGle9JXJYLUo3N4h%}4j+)*6k+JJNrvSBht3@t+%h;Zee zFpd@#CD6J+O-dPNOGBi~#Y88Vw(hh7tU03j#2B4!XQR2uJ?0nbo8(!cAjpg+1)M_1 zNOtuIy!U2BiAj;i+0{&@YjF$oSD>_p4m?JXvp^n-lKDR2aac;8?;yi#XUsoO&OAmO z^NQGVk7?TP-?>ruR1F_mmpOIN zjvRIu05$Q}0Zg10HHLkl(BW2Qh2!{-Njl6%YGL^a+@8z_?Fc9W_#=@6@}LtryQ~;= zVOUTsKfD~QQmGgqhS*VB<^IuF!2k_b7xdwER&I^QgH=5iaJ7KU(x4Yn@See11fgxx z;(8}b#;O>q!CIuf4bh(^om>spqW9Sqa5iFq`;ntk7_3J^#W7fqcy(ZC^R3Bgnh$@!8-R)cZQdh)vyfK z*Po()y9w<}H5nCb?vB4@^uyRjJ6!0P$<5P_)DPOANI!2)M#r;>2>VyC5z}G>BQ+(X zq)cc(>nFi()0V}b+;bQZFcCneiXNN{d&b?+6Qn6lCo>lGVB=Ra$8c!oBuJiMV-nr3>nvs8Z@?Yl;_C+?S#DYD!H~ z0ZrnNv$4myS7IfkcWN#pR1(A_pnIJb)2sjz4Y82n?Aw|!&_Eo`>yOsatN0FLs_TrU zG+Vgm3(xibc}#5pofjpDDty+HrMLsrc7iUR?Y>)Ld;|_Jb@(CPiVn=6@p)o!^_s61 z)$KV`t;hLnYfJ0)pzR!lyQ*wPw<=Kt+ec3F<3Nd@__yXK{&dVHaRSlL6b&cMqwlP( z{goU|u+*hj@Mrs77As#_w z_Uc2ck%q`Ospo|n5aT(yu44v!OFWo)T;!9!=AkNx1gi_zE@~B*#{; z09VVSZ^)b~GAu+L0_WW@@!iMjNA*F?XZ1m?sy;|t_P<97s4Z;$-&@fKe`5HL4%_34 zsCfrj`C5%33>F*qO8~11liZ?U@L&PpN!6BD77^#Z0=8Z&iACkxKnc@piEOqkD&N<5 zV9ig`V@@B77DFyfW?&b3k|ee%x*fQ$UugF$$_2DT-B#tDVlyLs_*4t36;9F%c$d~H z)fMp+P|M6N%H|B&NsSUnfV4aA)mWR68O4qRGr*1fyqa55g4%8iPAkCIKP+z5{k!{pwzsPEp zzyk~ej9ERL)Gk$ujj|IaT7RG6P+hnr4lIuerqqFpg|&5ALSWiLS`4@a=BkE+y0<&4 z>-{F@tdpVJ->N(4Nvl4eL-7b*O>d9}SzI!Kw5Ff*;^@ zl2*~Iw!Mz{7=Ax0E%a91PSiJmA+JoZg0!4*8VD1i+b^p|?5@^sH@)cH^^K4`_8j34xJpldnmLF!aiX~1uyzg^YVFhl(r-(%HhBIrkC|X~vb*XoCRa^aa zq|WulZUl9Ua57CMf|@Nr@b?@k4Kmr z^aQ@|FlSX2eWRS^UT3|hhhZUF-SJ9+t7z5Ml<R9gE7f2k7f;$jlYF9Y_f0V;Qp? zR(?kgJI&MSSe<|={hziRmR1w$O&x&i^n(O=Vm=c(4(O0WN+2fe?pAZ3C_xknw z_#xMEss|5AepL)UJxr1tHE5KyG%{v+2QQn^kS_0mIuBkppCZN_rx!njH%-dxA3~gD zuQ+qsE5B`ngSpty)Zo<(nkCdBO^t85Ed3mPNhhO0>nUm^H=|cNq~&nl@P+_8YO zsb?Cxp$x}fBUnwMmc^?fhSnQAAgoQWN#;ZUDek?tE)$BVp_}U>(q*1p{SYGMiX-*w z4^_x#lQO;eKJHVLk6rCmp|&`3pMEf#wote~TDnX`M1aS=3^Oib_yE>ARKQhq^up+P z$ou4s0g+XC#oM4c@4JDbcsY5z+Ud78F0(wK@Hx$m^k3i{G`T9TH`1Se3iCL~|Mjoc z@TdGIwKBX;@*Py<1!-tv>#UR+MU@M}r!siojT%>^wpFkHxoE!y4;u0Eyr+Wj0l#IX zD3jrrQxLk}gEHY?t!8t1IjAiIuS#e>@2RL!D7gEO#T>9_BBx>p{h&Ci0{zw&NXg`i zqbTriqv%kj30sH1IjWwf8be`%^ftY^j@t@G9)9ZEu~9m^i78tyJ!qqhySR-$tnafs zj+VhT02kAEqV8V2PD&Lt#ZaB@LU5z-fd^WxTq&L6c66HFs2~p?A1|g)WpKI+gYFc{ zF;B+|W}Mo2Xs;%3BRb9QCoEe^ifYwWsr_l)EMHZd68xy81x7)VGADh@!R;} zeRenKv?FS3(CbFf(4f8Adx~anW9Y#6Z5VC6*FSCNwzCpCmtF=h@e6k+w`rc?g|B8a zL+bekE!iY!oSy8Qf809Vd3%0z`2PL=!JGYq)7|3_Tkjju@NKv;dm9gHkaphwaq#YB z|KGcfX#6&Oe4M?74mp^A9PGT^I(W1D8mgSWJ>ETed-(qK30K&9FUB;OMI(1^YI+|0 zz4S19I$wGit(4gxV4p$pr=I?X#hl`-;aJM)DuNkp&yn6^(*RdZ7)=AcsPH$gyD%Er zy3^o->ds^6;YGMHUtSJ^(c@zGAOWX0$Ru( zCiL;}o@or--AFHkDNoaj3*Flb(c25t+m}uLtd}j@;zckIA4Z?%pX2GL`RB(+_zCMU z@q6d=V_4}2wH)M+kJE5@85Y}g^I>IWWfZNftW2KSYgYB#oZ)POE zxD_3k^c3vTD2<9Jp^gmW)DYBBoNHoQEH95XWr*q( zdNm4;sYl!KCljk~du8gy{5p;ZMj7Rr{B#1tH5+vV0^m>o(f;V9p4t(^NalG~Z)Ar|0zu>2z2FGz6r!{YAMNZ2{!5bKXFdS^ZjDeL{ zUJk0QRqJfWG4K+baDKyrmuu=C)>LtqmcwiKHB1Wi0#1A$n_>eYP?I4ELE!jj$WSzQ zM00f?Y=^Y!kHcs`*cRh|2d_y*p*ubMPz;@NXY}!LFE|!xd-Z5BxO11l&t$VQIOgxZ z7)+z%NIxO@c%R*Qd~!1xgk+gd2-LA`{*dTqsI2*Q7{iTl9gmM3ihM>P!rHN zZY?hlmzReyGQob726JQsLp%)j;_Ecn4<8>JD~;$lo&jGH>;Xb>O_)%y7u}gI9IqHL zcqf}p%AbDn=$VfIJ=hG6DP%$rMzfU>^2)(p7!G{oSFfUECC312_!YHu@Pa;_KKw3L z!8~e3!G5#{uLs8PO#zJyF7PB!KZ0`^f7M1^N^n3 z#6y9!AIEWnc3We4Irti$qwT{dFpFo_#)}I_6<|IVWdF5 zy4PIoy=gHdu5FVBW^gZ>Eyn3k1tA2V*iDAl!BPCn5w{nD1gjATpNh{<{=^VpYWfWe z_vPzuFtzPRMfmtAp3PVXO4ET^7=0K8(=c?Vv<%Xokts>LM?4<{`{JOxW@Nt+ZPihI z)e5dLy9=Wt&h3*P-}Gf17n=cN$9beoKLceL(`p|>|F>cK2 zk_zI7tPE(y8A35o(X3D)pq_wXAy^vj@t75ZJVKEvcSy@11t>X2g2(qsmV-+R+z4o# zR273Fg0ZJisBj-Rr$kbNB+6AX236x=7}-5Km_@^}N^<=;deQ=uK1DC+q@5eUeRLET zuY;F)7~MH1Y;YExs%WgDcVYa?SZ(eHXVJUpRD}a2iZ%qhVxc5QtN1QB3!`flPjOq! zRk(4jHm@NL+9jWugWy`lX8%IVJBl~&o!U?;*irD#$H(AQy~LfnynL!wz)tZx&nDTd z_~^{UW)R$o_l3I79fX6)uT;s)3%IDWXs)6i6-IC9=c$5YScCBqkC#&wM!Ls?Ry2f3 zqGpQ0xr&^2HQzE$CtnJFc#5V-sOBoVcHb7gTV4*XF+k#%Vsq2{#MwDfWf&q8^Nu)_ zTNRJh^76wd#a%x*vq#BTnbYG|EiYeSwYiFJRTxQpNwHvzcNDgKr{cpE)Fe~<@=;(% zaDy6TPK4Wpeg``$zT*yuS{B|hwCr6NMt63qU%iT6ipS;UV5%|a3Nh)+dHg<%f;$yP zAMx)UC{XR78v_07O;~^S?a8$W--$!dgBb0ojW{LBIUKPP9R)CfHsnkl~&v6`2hhdmr20IG=^0wGlv2AT* zUv2IyI?z^DR^Ek!9XixX6}{63Qb_6xTk^6QZXoDR*-k&0#jvlQ!uXec72GO3xL}I~ zbG<8I-MMGr+@Hj2+w7g-+wK=zkAF~}}6%OV&5vNLSExO_<2Ja$MVeo0J zfKj+#UJgdVeHh&vMbLdb3%*4y;HTig%}+B5wXq|Xc|&ycTR`jhY~$XDvxmXobcziI zFS5z$qGkqz7fTQGl_LG7p8h66a;oC9EC{2q(#HVm-8Np{FE113h8PY-b|^uJ(N=?S z!zeFa&LKeCL}9BBx1i%2e7Y9Ha;wa^>?koXck1c$Q#@B2b4>%TsS#LaZ-QIctw5PK zf-|1*YeCD;s-&E1jA0w%!zgT*>2kp6)WP&rgJvfsBA}kJv+-|s!@wqZu+OYz0>{NwgWrW(Ve0JOgW3|E` z4h*eOCY^;3XA35Cc{%VPreP1R_mXY+joIxFG=L7Rc=;|g%5z@ZTS+hs&O%^OqFbd8 z&?A`Uvk+sGQ*$A52hxK(tzs&Ff5&iWhx>Mocoj+dKT@Pw1;!A=4zidTj+q!R!RWz)xqZ`I@DIi9~}rgjvNe?5l#@U>$VZrs7( z0f)Y0#2xSo9Jze)ocktu@;hoUfOiGAD*p62WUX6?4c@7!kt}S-E+Iv{t&tfn%3%LJ z(8*s?C>g6Te0)rL%mL?7D(a?Q-LsXH-C|$~ZoX^|^39j60r1352?%%}gdWZ79wZXX za&V}&QNc+hO2$t52zIQoE;TmW2He+rsWp*wFVtsGW;{Q9+7oE3NDSBMLHV zXf&b%#`X`X05I~~j!vj4)yP`!XWmjoNi+nK2+L5nycrB1AA@0>28uOAd7z@Ut z2kmGWh64b#q9KmnN6`b42lU(bviv)JN~|Wr^eV_*h9$>fqO*|_q8W%Ji_qYeMF>pd z)~}dl=NUA3aR968Syb_2t^gySfLb6e$i;lLO)G}X&7Hfp%+a-EA4Qi1@5aLHMgH8u^oQj63oEzJ zqp}#9PaWJtcMc#WsT~7gQjQFo?Z{n}f+7T=;4HmwJ{jDj(i>Hj$<1`I7ctjx{G>0- zwABC2{Q7EseT?{$CpwE?w)j9J(Hwhtsv=M8ajTw$&4mgQ6@5|Bp^84J@Zp1s=PLN1 zKr;(3KQDb5^MhJ3t%n|A=Jw{D zLE+QRLF;O?eSBFn0%}I+pbl$6yTiTU1BlFYQ=}^>IFyu%;o4(gMYAZ6_QEhyqSLw} zTd)oES&bnlU`&K?3!kFTn2(Q-!N(YGc^{tNBTte8duJPX^Y|FNiNF3A8<=y~k$p@+ z2oqEJGS;k_R*EYjFakW0ch+PCH7{+Goy-r!b6C_uIu%-|ATU9Sd6c5sG3PYd@Lqg*pGC;>6pL$@4qXHr1@` z$}g5?!meZqQ4C{Qzct|&Z9AGpRCZnhx1PX{>N4JUS^$(Ax1A4a^XuRnHFl_?GZp{x zr>=7*>WDV~tZfs9=S)RIwXqMvJPg!I0YTo-&^1vj4htz)5IS$as+ z(_rud&0EvS)eF9xcu{6AmL7KC(rQm_l2h}fYz!JY<^0p0OTCzb`x|;9JGGMsauDI8 zV1H;G%!|6tupvHlr_5d$3jcQ)9l&su`5cFRCy#?KK;c`Dk1zK&lfjX~t^Ywq`h?|YMVFt^78F4c#}ts|J4AI>b{KM08;!W=QY!e z-sp?#SFI5GE94othkcVjKE44UIKWe5XP}b7*A#i21CatrbK|~TUOt4C5#5(jkps=6 zF5$!e=CKNjoNN@%%E6ur2mH9a%)^CxdD)C@L(DpSxE@MkoI(0NR3Yyoi+NVT$cWSXy$12!Ey_|lduw1I)KkN``O3gR{R)_J7e|b1B zU9*rg;0Ml>?9`cZ>_a|?M-Zt$04;cYG!YQxgmsKGG0k zU4kKs=|kx66y-Dh&fQ6YG0-f-NGhG%SxnT-TKxySOyi&bGr<@(FCPE%SMcdS;pdvo!Drj654d|_T zMt_wsnpsFzpk*{rm63%G^ZB&Q8X?hwhY?fPC%j*dF5@lw z2E5w}xNAZrI#?p3B)>~1jp)9%bev9R_l?KLd2|#%l-GH7w|{w%AyoyNgXk`v8T=rO z_G93OqP-aGrHJD@nNNl*G+di?Z@5b*opu8b+uAxFG&+vY&*5`m2dzM0F%TC5Fd~4I zAK~V3<)18_1VdN=fD@db^RF;!oS$DNU)1?Iq7H0B(RRGJYw+>k;^G`vgGL+Pje;#IqcW6^xqb+^!w^LRm%1cG5lpPRPir& zDj2HJY&_79HGZIWBecT7p>j1bdbHK#cE$KN?CrnbU7(?P`O>d(aCpFu6I6NkxJHRn z`Y=_Z=LPZQ_E4zp9pPfmh zj4-SZx}~BVWwUa{6gRBx_rF^Om({#{hARw%uZkK1p%LQR zYI&Z2+g$hHUxXH@RmrMMHqX@HeV0KeZ@1d3JzKy+EWAVA zpiq}w3C-BmIJ-#3D_6tiW%Dx#Bi->ES!d;1CDT6&HNqjniA=xI_p%J4@JaJNOU4vw zNv)&>R0zV&C588_gXUAD?$Z*hpDKrdYk2q+sR@kf&e0!7bW-Mn6xLYbLr+ySoX+Sm zom}l=wGj(FFJDd{AOFk)+rAoZR4eD#$z(KE8zAN`q5Y6<(|-ft2#!^RQm|3G z5XC*VZl7GA367}B5UPHxo}QlI2*I~BtU33a4SBr`RDsqViBaILTQaqej`TWX`z7ac znLhVH`U@@r-^=z4$I9~RymvCVBZuSWSUo z$5ty-*gFkPpH_&Du?nGDT$BmqUZU*~@2Th_#_tHw&?S1=6q2qaxDYwm+)VAM_|KW( zu8%=uTgHFGD+WLRy!4P=gD^|?)Qv&o=f>00!=8Hj+Zd`GlwhbbgzV2FRe&|#L5YIh z9)xdLndM_vT$S*qO4-K#C`ilbtc>=e{x2Su4p zF=)COQX{%gtCIvdD1u`ZJ+Rz1*dt3Npg3vCYbbmO(h`os3u}v&0=H)Q8&J?(#4HY7 zM1L#I;f~CDxCo<% zTyuL6W5JN?#ESV?=OTiv?<=H?OfTob8EZkN+N^E~r1-+F_#rOUXeve&RxPS|%tYWe zs=uMTlQNxt=ye-l3i9$#6}$_qMCjhp33h9!>~Q^c_wyC#5r5GnZ%Mfx(w0k!!@ zV)^^*PL~6va_{nRM@BHgiM_@H=mP{xglLkJ5+ZM;d`|~0L}|%>Q>soKo2<+xPE%I607j#l6o4r#ZSlK$BL(PFfywo;4L5Na?5SVkHYg!KH9w$YO6zlINOd{}Q)TIn~U4lMBsKjK{J*-1U7YlFD)*KBWhZ?Eywk}~TW=3@`$ z12XRFGr9r(`Ak<3wufyo`7kd7k$4Q%&D9Qg+2ID@THZaGW(=5G(;~2vAh{nt+`&C{ zN-_QlBz165e)6-%6yJ?i5L^l+~8&F z$+@f(2MTpc8qXfpluOt1#3`?;-L$iUt?@;9M;KA7f3KheU$h=$u+u68Q_vAa6qe2v-h?91zLF6sf zEqwimTw5B$y=0UwFT4Yz%mY zTSqWT#@m(YFmC+Zhz{PzjlceCMB|={8-t&JZbWahGXD9mzka^5-+TU6xDEmr(p`Ie zg#XvuPi1ia77Q=9CUdj` zdm}qHCvg_S%zz}UAus_jl6W2M-@fOos(t~D8O(#qy}#HZ*ilyaQi{X=>srxK6&Y+gOUve;kt~lMeMZDTmS@Y~tFHeM0sW0p`dxFsw8a18 z>MXVbtvgQ%oo4m2*SU=fQvt#bfL>Hkqu6R+8c3FR+yX(*i(ZHQ!$RmA=iTwg6_e8Y zF}C9z_fBGxs9bmp(Fb5us~XYo)A;*qoAS$d_PkUg_8&dMgtc+TV(Ur#V|n)S9VxDW zqqoo7&D5T^@t0S#i${;*-(C%d!+-rN{_<)%p&w_M8XFEm{tLYP@mIG|9xY0DSbkSc zNw%cSX(L34`Q%c$CGy7u^~(|XI_)11aL=C%)T?OauS24TX!6;`zy5{)PbY@%NDc~5 zVC~-_YFzxiKjkY{K%3(gWgeTY=UWZ6rO5TaP|wPi1byP4%X*R1dO`i1Rs(!j>i!b2 z0|u%j5*EY#pRX6s{`75cs6Xi9xBcg8Sf3S-2OpDbnExz4uULs~bm_H`vCvp7G#e^O zMqiMm8ZSftVfayvof2_1#u@wH*Az7Z2 zMMUBMceZ>y;P%$~ss6b9_)#?jC-s9~X4M4wSe||VEzPl4Dz5SNjII-`yO$+#M z`_KPh{wzn#!!6PA6SzgD#INKelgmqfMMO0rONr<4v$Oc>-QX-f?-}!d7nQe9@1hT9 zNd2!yXwd?4%b06=;izsye_W~D4w#l@>5&w53wAnRhzMUW{EHGqi$NXhqF`JRykK3b z5)(W3)vL3JL=excQh)J0(uziES=51M&!Ugz*&kP=9l*@gQ>X)BpfV^(yPE>1s;3>! z0qH#LJkCj0UW+XVFaLt9{!TM)YCcjHvEGb6v$LX?t6d`~aIm|^!dvF|zl%*lqp$Pq zt~xOP$7J1@`&(|VZ;GhV5zl%0Dp~N>B{)6YsOTm9G3&U^k7{5)mS_J*7SXjv(UK1fS&(XY>JpbX{v*g3MER(dc_oA!9nH(4n9h>y!RsVTmM;)F&Bgwvc z)hL)P(%-5ZmZ8)~uz%tFDnEZ(tXD~i`KecGJq14dTX9yLKYCO=U1#gF^WNVR;OQ0r z_*kC(4R*qj21V?t>Y#ImczaC=L7k3u42=?epyxf7kUkQ8n{Tg4uOAv|Er#Bs4W$Qm zI?vAFYI*c%zM+4dpFdWUanQ@p*_pduP$<(-Gg5~0Go;VourtT7pMUP0KR52o-)CiS zy*Ph{OT}L|y-u3tcT_ZwAdX$gz_+i|9z4f!Ql`q^{~;^h-yyr@0s(rF3(2a!GyxAR z9z6mU8D`F}vL%w&gC?T-nt7|p|861-|M8h>m-CobaR#Y<{~yM^kt@U+wQmGi(%-(q zYteGEh?~tw30O~`KF!a6#kEG3)$=c^=SsT3{dI$T+h_5={*~RHC3JLu9$zKT;wud7 z`D24T3u{M7ud~SR=1EHY9kwstX|~eiMRYdDY3;d@=o!oMu{?Y6t`a(7D1H5{Gx6TO zI^$_g{l5NI?xr&4%VtA-RoGu7Z*B>PKIYHQ%!eU=JAY>HhQ(D#2U;5RTFklnR=-T1 zzZ(EnsL-2|9Ap-iB>-oY-tsExt*@57`PH&_e}!GB&sp@#-$q}Y|GK_f5}6NIm171s z`aq|RM~{||2WY;0{J2+dx%?8ro15p)&o&ha))eTvzFM+^Ke#6?I=lREg@ewcM`u4= zMcnHB)eleBu)%wVLi3z|rsqCx^K-$QkiJ8I-|BDqs6L+J+Vk1{`NnM2o5xohvjip2 z@i{%~e2)Llua=L8n%hRFtDMiD46&?NWz#2yq;^{9&7TZ`KUi0XUk4a0Zc{yDeDMt( z5ub0aHcgzqA*zd>t;C~8XEF^W2-wp1Of?jg#LZ(sgY@o!;k9|}h_~+jfJ_?t)BNg( z^DmZHKRh0&bpxXl@k9j>59LZ1m5)f>(5s)~i>Q7|l9 z-uZmKIm^$V(GB=TWUba!UQCzP>f7I|`@j0&VtsKkk6NGq{PgF~@eueqKUvGmu>@K^ z{hUI-^Q&CPvz_-KEia0B&*pM&Epj3Gsgk?(D*jWGtbeuho@-m9-U*$3@UL>jp(9OF z-e#M!>PxwEQLn&77DEuY`~8+tYoPeYOr4Z?Q6qoRa~jrXvOa1&uQN)`{$r-VS!_Bq zd9>e~##PP0vwqL=8_=%&Zh*xd;6Lqr2lGvx`m^})dhxM5n{RrZ7@^NCY5ncTCWp{- z%!$V_N%*%P6;*Z-;!b5cTKFj4_p1mCfqF%>UL*Msm*5bW^S|=*^JiAWd6uo>D1|GixWW-k1S(#h6||<_ z_g#@}8NOK>8LU^#WB8j{&yGH4s(&{4qVlPH)|X?YnNSNep=ffe7qZCpmPmxw=BnU} zumzId$7xetah8uC(@~3jR(-VHoS#L1U;d-F`1|r7=Z2aR=wo^I%@Q_C%P2{U>OOJv zdw0J{_}-mZD7-fXKF!D2wFwA~e!vy)V|jM-`(DRv;&!Hs*&}W6jV;#cZAj-zSyWQY<^XoMStJ?1D|Mdw!pvWlc%F386`PCBS_DA9!GCK$|19|s4TA* zvg&Sd%$ApRi#ah|^SzEPgJO}tcRGZZkN+%j$-l#gQoEb0*N-1F2ZC~`46d_`X>I(n ze|1Hx;g|hhho*LLw<*dXPD*4Z&a?71n8!gRM~EOZzst=t3wvCZ$uf5p3z~bSh8>|MMqu29S0J7zo@R^)D{$ort^Ie>m zKV~*<=b_?dh1}nMJS&!G}Fo#XDXV=>Pe7FZlon)Xml6 z?|pJ3M2{Z5UISTHA*awKh~5GS0`Pf9;uJg2)W1IOe1YCq%g39K6=S}7RTK8dOq=ri zyz*xFhp~BR`r-?9g2>N|bKc#76WM{uLh2zv2SmkJ^&qy^XmDt+WjM`CB{>;r*EpWrdfNWqV}W>DXHe7LI$1sElurRgm}I#sE*fiwnf= zKP!59Oj$%fAz%-`%rx$%Sx6xs}7stDzs)ey}{)W$}TW!5n*0%{S! zg3^LUPwG&IPH^bsK+pLyhiTuVW z4I?Sb$Lt2g?tt!)Wq^5-2GTd+zJci*aNhuZgD4GDUx@ruY7O(-IAw9Dkf%RpT&W!PDhSNkik3)FE!XynN>u;;1kO3WgHQCh{l8=3o(-CGK2k00i zX%Ja|Lq|xe%PTso%Re`9fn6iKi}JT&lrF<0P0EBEDLKnZ3*G^}AuSe0-PKv9RM!Aq zgD71FR##h{>P)EDxd@6!{)UhpSQ-2&aMwk_Cmra{KFcbu`JNOmS||2UP@*t zHi*3^F=%q>*JSOTLs+bAN`a!ZpK|UrW|e09sZ{wAKwvLL+|Oa(v8jHt!~VVl;(oTn z{+^>y{dDV`X=zi-@%~S9! zv7D!dyngO(4OwV`^e%dVG!4*Ht}dDk%}89);$<8T-1U1nlPk@x*5E(WR~^llW~;Q8 zBfPy3+k|VnkNQ>K6@^FrI>T*>%2=A|x^dxOlOm+bxg^1$D#1P^AmN}c zp-c@kxru~2gHs$3NCY4O4T{a$I{)$6B3_2`d*?7uXTU5E@2FP0?4qm$eZEIffgbd& z5{<4tQ7R(A{NBDB(5VuiCKHiu7@B-fi^bhM0V{D{&?>Sia9%{@b(j)52FXpIWa~bV z5+CFDv~qBVKswNpvMF$~M2CPnKq6BxJ&f|$xd`HnEo|YrjX#tk79Ah=>j>F!Xf(Zo zD39%1C7sMgXw{2Py1d@SwJA7{VFG5C>Mx_hnI+~mWYAG;M%djlS?^f{INiQuS(gQ<&76>E#U1j9>%JS0PLdUdVJQNGq087h{ z+4>35w+~1KX3W#&)3P96puA@gg8&TF(?(={)L9;MnTNYo*E|wt_NZGft9#+~U({Pe z@(Z8G!b~>RbQ}Msi_Z9Rn;ibj&G>SQJWUsxu!xn{EwhjJ@rP(puI|GujVpKgG2bBf z>Ims(y#5w(*$q@b>pmd;f-H?IcX^jn#RLs*lF7g$gHQq!44Y_C<{LbBgC zXJCnb^?DKrKjf5yAN3}Fc=Lz?;rGO79avfiq_w$NW^y><>-oDVSs|-4e199KAy=Nk zCHB=<-@SOf$dh#$PRK)ho7~*0sX8?m&!ecpHq(wpicVjAzgMIJkP0-Zz>o?iZQsat?ZgkQ|@rmS}L38Jl2E0mN8SSErwL0GQubXat!HJLNC6&uqiIp^VUN%hOI8; zCCr{8*)^T}+&SdLCd7KC39mqH4VXv5D~JNcE9gSYuH4ah)lgD89xAp)d7JT#cp_WZ zj=aOPWx)Gjwcv`oD2t1vmb=6 z`3cfig~rL%mzo7Hu)TG2^cn#Dgjyw4(xEJ&~?Ss_zfu&%D$o`r9ABBnnT1m&r1?&o%+L5o$UV4Z5n`ulv>8KK+mkupp6HM8sb26&XeoF2h?Ir<9_fjk? zrA1P!uSi-k5WZN4@P%{cl(ErAXxu*3JIMQ}a05i9m);PG!ze=EOJ8I~@WMVH_GFlQ z`rO{b*y~4?_fg@5qj;pFxn*`!EI_U#?>U_!Tx{~yeK^mfg*bAjvj&9^A_2c^i5|#>q}suX6_78EMnTdp?`)3u7g zmgquOHeU;{z0eC8y^WjgiCWaZ=`E}->mP3;+soQlx}Cop2H<5sGoRhI#^65FpO+ID z;9;&dRk&NTYdC9D3h-ahGZ&p|2K~Oh{Wi1=(azd?;ZM!3l}9!WxG8oMI=0ZsqS*S9 zUlW7&h5b50Dmq)Co3)mE-=Qlaa@7XQyzpMcOLd4dDGNSXX`w%m0)(cAVD8_w#*GQ6 z)1XO>s7sH{FnS*)Ww^?+we3U}L%||R^|o7(_c$uqU8mknDYi!9Iaoc~0v?J5^v4E) zO*kM1-GDe)?rRw}=1{p>7v#5&O1e;&**ahjn2y4M7j1=JVx1UtT%COa=BR-<1+*=^ z?UdC*%dm5B8T92z=Y(`&3VHfbRIOQT!u9OqHb*LGvVkV+9%WvHlpc7vkXarwqHEO* zva6k*Jggzx9uYsn6j>fH^~(9~HV#+ubxBnv!XjC+Q;3e1*|jB!N@al48k3JTpDM4? zK{TM=RNO}(@B{<`5Mb}N97?lmTW^&LF^_{TQRzaDKWy&S@;;=NpGBS(g>h@mvrW20 zDj5k*yJ-7PkQ5s$ddS<6TBN9l@p7piDvW?mGcD$X&2uS2>ZpRlh(Krwqhb=RrjM=4 zlGJ!*JYKeQX~6kSp1*=Ic4YG>$KgX;x;)W*< zIteOKF;C_TqmV~tLmTR01RxJKR_Ps3Z{-URhn}JkR6j$aphD~j&lyBlgZh@kY+{*rC09=Ne3Q?_3AahBlKHyVozYjNqxA zwPk<#F+12UVJqrSckEcL$wA}kt{rNZx~`IGn9YBQ7o|?PwJ(TwsF}N7#mYmS#05L; zaJVYq)P*CKl~h?wN0Wn+lG?OqdnMH#J>q3Sovp9+5R6CX3L-<%k=XHSSn4oP%V zwya%6p9Vh_{20jn%;NtSpBJ>rVK5ldrr5dMrT6{3B~V z7?$IH-3@JV8TV_hXLqr2uwz`x172~wEkJtEQGeFw5Sun?Kg$sw``Q|CG-YX};S4wp zXKOp~!Iz6h0X3qnSvS)8H(6yd;DnmYSpy_Ph8MFh++{4w!#}+Kt4^nJX-$NduLbB% z4BbDx{;S3ivFX2Tnlqde^U^;_D4*qJ!>stG76njLW9j5fVV>w!5)rfJjqwOF5RvxK zS~x*b3C>fe6@$8?Qjws_SImHd%!yPXN6doay_i?Dxq(?lL<+fySl&jk^`4+ zgR#=i22K_Cyw@U1l<)f-*t~C7h>M+8^)ns`>gRjvrGCnv>f_dsDom?`NkvL+!@j@G z3W+8`WRjkd99oQ2(oLHD6V6pCBdLRt2UG2ReP~HwDR#&%yteXZIrA!K5~5OjIuI|( zrYhjll#>|;K2v@xs~xb~T^-Q8RbhE$@Iso{i7$+NzK5-+J8gX`)?l{F)&fA`MOd-Z zc9_@6jH_~R-o^PUiGtuJ?*`ZR*T)R#L=trCTV*S}*{BXFvW^J|=OAI9dh7E8%# zWB{|>ONr+7Z&^f0Rwej@7@Wh=KZO(_nC+b8WHDvF2Q)c*QLHmX6$_-nB5bsQHrkafI3_2vo^7 zSZ35@qqTEqTQJ4)Neu(lFyMxP)zHESQge4ZYRuqrY9R#e?gL4t1|LXG_Fece=1oMO z9jus3J?tCuMn+Y*Y8F%=m5w6?`5AA?yuIj?h!w%9XA;qYd(H*EJ|fM^jyz?}E{{mF za^hG)>!>sL?S?4tMkTJNmo~=)%?4&YZ`BKu5A+gVc{XZ}3gTKGVL!Z$a4WIn z6|$T^Ax`Jp-Voe}9o0&nIBp}{Q37cxPdjdWR7+!2KrdPu!$rGjWsFxJ>Th<+9cvy? z>!=(9PQ5#%J0u-3tdxC#C3>P5L$k97}Q?7VCI{Vd0IO^YKnb6Z%X$ zLQq|l^v7OFBh+tS-6*~1CvKtH4U+3X6K&Rd*8+CYtlai>>Y`DHol6m4NfEo3CaBC4 z#>FC9#|&+zZ8(q1_qbp7KlCYvvj1Vw|N85%zvgGpB6%m1|5AUQr=bevF4fn|Bm*HC zFiA!u(_~fhJjdjjM=Q#Q)sj`J5G+)t=%SnnTiA^&PGvs%oo)H&jyq zjyfyDJibQoew63gdk8Y*l*IO(LUd7K9i~TR5#b&I^{@gSnvsN>Vc1kE+gBOAwB~X$ zls!wYF4!^T<@_#Nsy|1y-z?2<;EhZ(f;p4mfoqglMP-trjH4ynXJ|!QJgod+*6F>G zh>T|Jq-LBsm6R7KW^(-P%69#m0NbSm1a$7QWvAQIfBZH2=>Nmg{WV;gY&I1=!Db7@ zY){|lUG9YT(%Ulc7wyJwWNn!bDhtMLWVYCoj-5VTNC@Xn`*+TJe^y&8U!rISBQ*&_ zGET9CFIDlF!c|Loz;&_+Q`3N2NWrl=SIJ-QN*mC+Nq zIr?ybuyO+o`zkW4xgErk5G`q>&q5qjtQ-Lr6*F(5^?H?XX|P?X4}#d|e1^dHDhHGIs>x#T6%PxP+&{*O_D(T1M~TsUje&Kl}W1ZRV$9=BHVH z^Ld;;`RVoNFz)C78P7jAa(u3>`MG6CdCenx**8ap{e{m|Z5M745($COE5ks&=p9E3 zrj}PdGOT?!Rrp~9{i(MVx7vwBOXwxQQ&zIiPpf%c#Q8gHqgn1ln;3F6y#pygk6}ac zO0#oN?JuGcfQARe;ZXKp$uL~g1xMYsqfMD%E@2_L_v$=4M(2H)!a$>A4HSGOlSFf* z&Cua^LZeD?*OsOnA7je4tYF6R(Pk8G?TlANf!WV06EBj?KI%>yFlP2t!!s~(@tqFF z)}s>@5~GpjXd{m#eD=xA#cI|$oY4(E@W|WEUWodQz z@&Obew2EX_fpoRfYxYYPrkDv2mf-j@x-o$ownuZwNvlmwzmcuR9J zt~lV7Hv%apcyi)UoI_vT`R5DMx8VS_6@anj0%r+juQ5D{S@l{g!{N-U?9R?mX694I zlgs6+y|Rm+3N+~RMbY!#KOFVjiN2jw2tutCQK1YPC(rxl??ph+OH~C*O`diWuG}S? zW(CA^I2tq}D;!D}N)MXA7xX$=L1p7-V@m2Wd2My5Pybu5i~8i3*Ssfcq1gb#tQ<`9-dsjrb? zPeBrDE9h9K3T8D3##xzb+B57}BI;W9-Ak(N!!9XDC#DSpaDI^)yuDQ4Ht@b`4NjI0 zdygv>fdFs9MSX(2${04yFOg>69hERTtKp!3_eiB49F% zzT;u-*CNT>Bmt`uWm2#|cB#c-Wh9pVcyiE-!|mxS;en|JthqS|R^iH|VE64(E30w- zRcex+z}o}whGT>BzeiVyuQC2rN|T=4yF&Gy9Ld&#URam)Jvu|w3v)eJsgJFNRV#xH z`@p3nZsAmW8{gxdg+;uyA4Yd|fnb-``=^T%!R04zl_O62=u-8vPV3J|eifTE>&k2- z&!2Gvv%E81u>M$jP-Z4sKWf3(pQs{c^0HlGJ$5o0FEfGIs8gsnkl6Up2pNTtO^WIZ zQZ;Jo^@P-((23wd=!c-*F~t3m%*IVez${F>@^DoR!|J|zJ?TD}T@HOj=Hk_#LL^vr z@PL**@O}AVRNw2Jm5XwJ3PCUi!-pJ$eO`6-k-~y6-s@x{MZ%9D1AC0@!-<7{ywCYW zN)kG|))pWbda)`PIuC)+o4XiM7HUt-as#LbxJvDRX01)#iU;Nh>zHyDMcH)r&T8$>`rZfgBB$UOMOwwD{J=y_>@4mf!z6#r#E@lGZhVg3kG(0?LZ zBGa*b%qc}FqS{1V>Em)lkm4CT!cc^e7shHfi znvThRY4281j?%(~{1=b&QO_8YOBeY6NSaXYQjL$5nswCkh0YIiaokv7ekIVEqmXt$ z5e}^0%tj*Oc zRJUCI)BOS(x6y;L`-eB0Z|8~i?HK?5OZ${U-U@4TFiG*NBIBFW)}>e`lwMPXI9#|lf2pvt?lS69d>-j(XE zS{1e?riMA`Z}W-lc6CiJ9MF`*sX>_w8&JjX>#~l9?HpZhO-l2I!R4UkOdx00bVIHf z!Sf=BuNs=E&MBH+Hq^a54G-Ak(qA6ayqIu#YL#=#9FXqDOzf&6t8tkgZ@3NqZ z<+vmv5T7GXWn^h2~=#HSp@+3SgJ6`%tb*~*;GukYZdIy*fLLO>ohON-W)9_ zG0MDY+Ap9DA#prPq%I@A9YZDr5j)|@JcZg1r(449aoDLm#3AvV?hB zeHCV4wv*6IhL&6ULFI&zhsKd@cySDg z=2fk?J6E{k`iV!Pl_*=0*AMe8$=~>ss+grqA%k77VY=kBvA(?>1<2h(%xub0i^An@ zKiFi{s(QIw$+<3H{YkLGiH^jQZl<3~)G8OPl8BFBjFoqK;?Q*L)wKTZ=<3QxZ+VL} zuQjrk21Fgtuc|cEcEKB;TN$J82rAH!05%kjU1~NxrrNc?s}Dp?IN!sIX|-&4o34;q zPHL9e)wiW4#P5S}#S66)%pMc#3XMWAf%a8C9gyCM}b@IDDV1 z5MB2!dmBsspbkdh$81$&q@exCZNfWAA@TN%UU+)qFvX>cdSc1}CGK z2Oo8Dl%hu)pW8}^2fy||K79y_L}j>&qoP!%nLUVU3>VmF_CPj@%7C~iWBp0(THYj_ zn^iWCR$;-ZQ}DhNp5x~?*X*<=>j`J*W_gzfX99W9p> zF++vc7T(0Ej?$zk*rE=H<&fVqO9BB1cuxaHtNxxn{>Sd9!rJg}~GB zIWBVPA(y!fx)qCcDU*b3#%GY_l0t%DG<^g3^yR=EG`faA$lKsiOG*Y~5|Qlh;(Q*J$sM2dUUL;gOC5atecnolLcujs^|kqO*c@Db zTE4KQ#NDfja@DQli`oe!43xwM^f9z8$}12L4efBumW#M*T@7ppW~r8Wk17L+1*{1{^2!mP@5Du zP(I<(Ob=?H%n#8*30K9KD@XH4>D zVSV1Y|1;miyq9k3-or73c`u!GKH_E4I625&f4{Cb+Ci^rZOC?uBIf{$-%y@cOhXlR zLZ77IAm%nATK#D12l`XEX}P$xmDiBRVJ4o1hnE-3w8Npry2**m;_8&=BGXVs($HEW zppUr?^ww~!ZonsGrzu&<+>Vr`{`(B6jc(UR3Wo)LJ7l!zPc)VUB>mrPEG@Xc;8%DP zkdUIHfcTxoZ=L@JA0k6ye+uz1c!Mp2_dnsg`?r2(!%sO=)X;?+uFQbjK!HbW@=@h%dulGQ^vFHf%IS$&cnebb4_a2~UO33$4pUqt4VZ9` ze1emVaUK;I2|ig+ZHLO)iSgKvq62-$9VXJCB5PBpQa$TD@Qvfe@)vwh6vu`y>6&Vx z3Y<(DM}j`GcpKfs;V%XIZ0{oSdaG|OO6zD_?9nCK_t~a_xvKe$ubTe(XMBSj!Otx5 z710qNAUjN*2WavMu3}^ujN{}}T*v|*2aYV|MVm%K!ScvR1YH@5rx*%y24gI&g(ynv zNMs!C!VEAN4MOzv$JOH(>*|O5kw^23RQ zAc3VEBrNZDBVHJ2m~abS;yHRBan&x#uw@w>qz9GO;7Gx9uNn|aK)x2%-KbC3vWH^= zGhEVRFj&|%iP;bivV_X5a7@7yyBfny@WB?W9bUo~n>pl+{U{U6!8{op;0$W4Inn1NIon z+yViT6=6TViav9GyX6Nu=TYu={8A~iT5VgXm}LhZBnHzlQL6|8rykTFvg2UFoz?tT z`xwe>+0h9}s)6Ve`SM$HwJ*b#=##xfuMvU#lYQj3FUfl>R@xDL34$+)`Xx$V|_MH#EvS@<^iFz5(0JD&{j|YRzkTn_v{S8 z#X+fa2vyJR*a6;LtQz7MA4;s#Xi?s;Vk@m=G?;lau=b+_HDJ} zb6{KZA^F3k1KXs;%$U?ZK5K3dWoSARlqU7E;6oAXuM6xv&;%aZCVxmtVDh15a>YyK zrxa2*keL1E!Djc%`!u>s7UnXo?j#k6X`G0vFw^YqiHl)>*ysNZ!?;M1&by$q_Af;k z-7OU!_2zCFrr9zcO!i+?H3_;+--ll~;;PG(0kS~;a*>$*d3}T(QiZv2p?aa3kV_qN78y2CE45e#!9V{K|Scf$3YUjWG zXcco2PIy6)Dg>JMYQ-=QmRC)pTkowxCF=RKX$B82O!iYIRn5J{vJyDRa-<)pOZpCC z4pbivRlLE2^Mg%Iyn(O_$}9`6w|7#AktDwBfj{t{jZymdL!pwlINbaBxA z-=?hB3v+)J=S?m9M}H%?SrO}`yeQnH$v-!-$~Sc~Qn4mtI*=h1$oWGu3c-f2)M{d~ zE2*Atq(5MA(P@DZ>dAslAbG8o3|PfT0=^twBu!-xvFDk1=aU7^1J_;ykG)RE1Ew0( zO(hs`dszi6kQ@vilA2eslP;mVhv0UZ3)N6+$5jZWRL z?#2hO>SekB09nrNjby<;S7J({@D2{tr8)-i_hu4RMhxfuDFlFNE?Qv~SVcS?3<9kC z!i(d}t5G9Sz|7R?gO>)A$daVj3{35U+R?nMKySrTdb>~+#Che;(q$sqnktlk#F*eG zrwx12t0htH*75OZ?pIL02=IVtcU1{<-VqFO9h$Gvp{z>v(18Mr_}nSU`sP@~zcwF- z3o~^PA?R6yo6?moi4q4NQJ0>|_cv!JKDMfFX{#_~*P1N!ThB4?ejS@@7oQ{<0Q|vt zgy7J|7U<_O1xIqYfaTk{n|3{yms^uk`y(C`OmiXCP`Pjz#HT0pyftl39sob!if)Biq zW%NX!?5ZU&w!3Y1_}YwPZ9k9Ni*Oaq<5e~GOD_n5(B0e$+R~Q(BA_A0u<0r9kahy!|e#d1G@zG2g;lfpo5Z+ zun!$RMQ9p56I!CK5;^-b+V=6ppcA17cm?(%(5G4YglSnu04+-S_A$~AzGhC-{=U00 z#KVUDCm&D!0<0#u*BoR7!+6$cH{B3SXU#StODL8<MCK-99(+Fem`XyIVt;kxv+nl**o-8-9P& zt`7DHs5CgW^_r74F4g4NgoC8q;5)VNDZDK(VDZUlLKoW1w5vpX4k~|6?b+s(jte?D zLg8W|lFk*!fpE4^6>SG_v|g_gMr6<#rR2aQykvg5EHKMmFu8e_t#IUIjk3Jr85RRg zY((dW6acoHIEc;`*rV-(7H(V{MsdSW1lTOx=%~W%$V)ws^Ijkfdu(xP;<}{^U+f}M z8YGNc1=HdLkGFj`(bN}WxTO~~oq8e#(M4jERm5#n1YPRG4&BtYD0_p{2gOSZ(va`N zD3tU0L|x`vcY|zlDYwkYaf#}KRDFW^J)CSkoDi?%a47X;qnjJd2L(}B4dSgqTifu^ zi`yuX)s3NcjwS}B2wI0I89c*k+;0sf+eV%yN_zq6mbXz^J<#aAoB^4SrUlhzdjsf# zTJ?CO4h27Qx{BhmJ8o3cwT3Z=#EV{~eI{`sxW%Ai7wzb?67XIk_$RwHh64Lh7R#$tkrH`?; z!+o`FCJ1eZ`)jM~!`G9#Y(z%RQ`0Z`QnmY@Ug2!4a=N5PcUZmHi_Iufq+C|sveqLD zLh(d|q5VjMB}$%~jvkN-;`j85$1#ZV$BY-!rEZ zQGw(3dc8^rcPb0Z_gPrPxI~q)r`)axIfamW^n!HQkEsjJnpsf3&jQuOQ-9Zp6*0aU zMPF2>n22*>#M#;!Vq9o3B1Sc%SheabD|Y(nOo$`PaJk!0XGKM#!%jb)iEFGKn%Ffu zok4N;4FR*X2_IQB&);@w8rqfF#guBWMftB96#Wvv3O zd6N3<2xdX4`~+HrVAeK+X-laI@fk*T+KuI0PkwNLF1N|et=!E8!txX70dvyH+hEGH%DL07>}~Of2Yay_ zV-h)|le0_7piPVi7lbRwHr)zZWALQxcYXT6Tb$V#QS)_ z?m&rm9M~D!^7O<*kUqj3yH4>xr53#T+cqzAZn&=f^`Htfv)6# zIvGuHn==~=o`#%dGr)$ zu!L37LY;<-rtmi%OQ!+C_UZ~fOz>^xsZ+cZp2#>A3fI8Sy!L7FH0IUr_90qtmC3vj zDnS}HJo403cF5Uq%MMxT08xg`yB_8E+dCP2pK1$zmqZG`nC>a;3!IH`u5NAwj&Pi) z7QwqDA}k+M!;JiVTRHKgupoSVvkZsKdc1>mwHIU=w~&S3jde#xL*6c6nd#gN`rq&4 z)fz7#Q6V0ugulH-cDGJeasK_(QkpA-~9^yc~Zv)rP!l{kTtIAlsUSXw&jJbbN^c^>8WcCn=f^@ot6bsxy0vzMiVU1e#TVcIkC?Tq98Xg^8o8|An^Iz;rQ zozpvXrB^;{)W?mZzNIT1(7WytK7q=WcAUzcJ5{|;DG7s%QJKI7A>@U&~!3EM#K^m#|?6hW>yJq5McQ@v_ zw9V7HF9f`_jC9v5sM*_fsGVR{F+2|iFCz56;OIAk3}o48A#c$d(qJwBL13V|)V52p zj1>AWjR^wJZz_wr$4Y~KgOwV)h3MorkRx5)I^S=~^`_)6#rl5Mc}5XQeKUvE3-!S8 zW@%|tIEoI$$9BO)_%pOVP$8lxp?o3gg_~DAP3$10EMQPA6uniYG9<&pl-xoWN)HcL z+C-Ws_K6l@OQ3FlquF+`eKT-m&%nLfD6|?Q?)o0}EY=eSJ$IM9Du#TbwEwFnr zk>h9N{=)2>k(0xe+%Y33hbz6uj4ZZ`?VFL##=2L3sAX@l#dh`TGxAkh=J(+`OBnFN zIrQ{*UYW-O+Jz4%0{O8$6NP{%==2A5Lf|pkaj`u@gv!a3j~9c>BNeMsg{GHBYg#}2 zx<{6Hi@?5_=UnjGcZM?dl`r0+)b=@td>AA#B#Wf1*q0<6_N(KtrALVN6&oX2Mm6_X zyS+I6c`_XABcEqd5a8Dy0yoWoZ`*&g!=Zh%*!h7HKGwJUe2i*BZJBvPXBTdqWkY+r zZJtptCC*M-FbCQxD}Mn=!Y+~!I{9^-1Se{7_=C*EiI1M$48$jO;+(HVZS{@Sx=B_C_rVP`i=XkfZ8w9$npX#z}y=|I1s_d`MFy=8QLQ#++=`NC(#nsaUT=f#F z{|+~vT+*4tkGHW7*^;d8b)Mbi(Vaf^5a2Lz9MNLgwo8Z(k`a2Xujmw~BJI`r=UL~x zhf(B+o>i8u|A)oUjTs^3ljs0uc!|SYmZ&7+_CGR$&O~$VwB3Kln6xqD!F&oWFz!P) zCT;f&_@5V%_9sEs)JRhJU`^?CMxk+&w@N3qn2#WgVskt(SRF?Mp=1EA@KNMCLyi$_ z+$^syNOjG-cu@(dQpuY*&gnE57Jgg_Tk<}5*QdLK*aCcEggq^ArE*X?BHD$5v z-0AVyF3H`#FC?{!ZBs`a22{uxBlD%EIF_9~{YouF*O`SbpQH)$tdsweWot}(;m)>@ z1RI%ZNW~?vl^KW-)7XN-sfI~eu>2dwT_(`WrKIcfO2GIh2U38fqfYOQz}QrStt@nZ z^5J2r>oD@>Qj&O!r*96berV?>DF7)HHYo=N>Zl2%@#)*iAEI}WfbPqEjf1PR4UpEcufGR!HyPkAd#9|(Z(0w; z0+yqPFrgnXeG`+-^wovQ&{x+-j^YOWK+|WV5`7eQP#5H!w?r!u8HZBb zQOYt;<{N;}A~?`S_#HE_#)I<;!O4RPt#j;|k-lB%TYt{GvXv8!11PRSnh`}XDn^Vj z@{Y3Z^ufh*l7}ygQq$(yG7%_Zy`ETEs;1r#Hj#{7l#R!{_~Tb=rj>VViUM(SN#D0j)HAyS z+lXNh_~U?)p1?>?U?g3!C$-ac2!lh{pS#PJaai2a*Ex?BntvYubCcw>5%BC{+m0A) zW8coO6s`_$OjkVe#BT!b3j@fl;*E6X%mVKI=BYbR7|2(6(AoyC$5{cZJ7Y9_f(&VAC42uGF2z)nyPAw z627^x39>XM3q1+ywtT|R2An>xW-!fWHMJ{|H#&2@61<|zZRmfzUPZ;N{*f(Ijm-qFeL)hM3d{O0rD*sk?@RZQjm?3167i*0h+l8+$=H7+~7H_F3Y zuf%Fz*KtsTPme25c0jOW4_=3Rblwn1tTzInQ@#`VC(BV1|CloTF)%4tA+n| z=}fT8th6LF?4`Q~4WVz*2u!+8`|WgXA`*f`Yuz*u34O1&mMt`K>c75^Se)x@lkzcm zI%uOwGZAQFhqE?n;ub%BAF)P631%5rcNBBP-oB&MZRzYNx{e3D%)+nR3TU-bVV0u+-`^&S+wgs|S~1Qa z18(TK%{MHv+(o|?e(K>|Lhxt@n_4M!OH2Y{5`YOK4>Ayl{>Ye#11M~8bSjy}P`KhRulUB(s2FZJTF>s)XA5dDDeo#dzHlRS2 z>}Yb|X?{-w44AoMipRq8f26^y*ZN6~N6AB*kxTWA4t^@CRi5Qbvf#fLIIQ5qBP2?O ztI@?|#uwy;Yit9h2?B{)@CPMrx=y(mlZV@X_;pzT@ul%b(<|Uly{kh%eX|ef~u&N z<#$mTO67FkEH4yl(!pe)k>DqRMgSTC)6jU|Wfm|E5&a3%2&Aw&ZIRK2)=h*I{Fuk` zLM{<->dva(@$F?A=}^=N|KR?4jM}338E^l^of4Uvi5A>a9**%KVQPGj8QA4h2n6Fz zJH0M3>pTmHky`YzY6zpAdXMh~*7ng0eknc#XVmbQ;={9m_&oWg_;601leoAG#M0bI zW^}-6KR$2`Yu``syLd+Sm7}0)L!_Fgxyr z?aIURHBfnz=^!P%%)ZQZ;=TxkU5{2?EBskgPd!&}t6bc+onHsjh*1IBBCc*#u&(oK z|6@n0*69Pm8wAndAjHsmI!s6oJ+%Q|+(zjQuo9&m)!CpgugpR!Ah5tnLj_VY)Qokm zb{wjN$skoyR#|HAhL;>6_6Yu z&vYhYmMGi;mVtdYl>jOX-4uX$wuwI_n0?~3Qpyk>@V4EK8I9&L0@BsGr za)#EF_7p9bg0&7;#?No6R{r@7w+FcDz8^pfTXGD{<#2CXwxJEf4fme7 zu0?7Fd1KAr{pa5?AN*+l33nJf*lo1`2Y=*;tZPs`{-^}YUbY;af}j1$Z^wh>%(q=$KsuUvVfI#4V>#rs%Q-{ubpKRBgHCkKW= z>@5TAIypE5;*=KG(P?};o5$Cg3E9vw{+DiSTvJ=9<%GQPb&VUU0N<`jg?9etI!)b(7CQ`AqR8r%4H|J)YmCgC$c&rp$deU{N}3Cr92k$U3aFC%iH&Zlm?*O zDV3){jLCtn%3rE}>hkCb7vX%d)T%~l*FbDAv920+JVB_W>VoM&jX(!#P!#*qr%w^B zp(#406C1|k5b08h&2P|pe5lrqbfNtC2<1}&o(&r3?-z+rMo#&oF77Emrc^D!eTH+s?Kj zT6V04+c;AVye2}r3gf#dSxISWqzX~`45l_+#ZdqzX8{MgtlkMoLXUx}v)7=4Dcz{( zNq&){CnuaN4~V8(rGHA31s;z#ES1W$Qonv3mqqxF|7O-yM5h(W-DXurX`F2eu0%fR z57iodBC1e)C@Zw|4bC>_tguRAQhxx^;Ow3J)vVKqg>%WO{0=x%*X4%Rrkgz5I4NOG z!}99&us^u04EIQ7f}DaRv>r*$2)vU*FJO9BAZO!9GeLK-UvK6r@CpVpsT`CSmX`iCxQxSpZX%QJ zbi;7-dKa4XC%g>qZVt%^$5OWqOj~3{-6W;6$^2;}<;OU?ILqO0Pg08mOF;YJ?#AGc zT~AsfE&wMGYKc|Z5{AFpTm@U*(luDmt7{7QSjT0eP7;&;g?y9k`aqP6j&zXg&@Ekl z^<+cDjOkFxo9lJX*YsIb?Y$0m=g|U-D+RH$O0-G0?*yp_EcHLTp8b}41-ci<%TrK@-)w34;`LYGd=swX zQtc!I4iIV69^wpHoJE5X(||ez+<`w;Jm}|lNs6sX>&Kr6OEBV3a!WgK9(CMCmfGCN zNlo+55au^_64M&y6582mY5w`KWn*WzHGESb=hQ2_+mss#!&$601xnvy-H8yRQ{Jk9 znQYnOk01`sCe52Ytyts|!}NDbCMwE-rc8@nw7BJ*BdPLPnZr4~Cy{ir9L*8Lsb(0< zE)(o7`CxCK z)lvJ;JX(iTsErh%%Io|WE97A^pe_4h7{FTC#x-?kMiX_jXIIq@Kt7oHim90xz5$pDM!e zG#$!DdpH@0YPMeAUMF56n~rl@U^@OaQ4jqhOUsBxRaZ(~W*eLc)=0(Pkn?1(1MYC> zUo}t95+)jY*Hk_CgqK~qm3ak**M7%mYkH}>y$%J_JN$4|nTg(}kbmUPMs>5-Az^Bd zSN^6gJjb?Qs*&N?@=7&w+a@_hz%$3mE-g7UA1!yNNe#E^X|bJdRaEnwZqrmV+&M^D zZu7oqHL$7=#JFfN!f;z?iC(1lb+U(VbY4eHgJ+6ie^^ts(LT5=Fp_Mvb?Y3y>3SVT zjm|U10owVcRc6C%_a|phh1sre&zT1eGuvNauz7sNA(`cEMt#(0jUJwJ2xcA4tMX+w z6gF%gP3@#zT|$UcXcKrY(P@-+@m?7dDbJ06%Pb-3B`?*l;SaJY?P*=#nAj zOTUYUbskn+Z3hs7l0(=3=Dq1I4RC$w_Z8_k4Q$vZ{FeSD0XHlZEnqs;G5!D$c2+`9 z>wf*pyUP|M?GSrl{;=3cxy&4190V-UK5RN#Ky^YU@uFm*JT~7Iimue|;SX--`fS;4 zl3<_b*%%mcBJyjRH_X&8EK-8bN~q`K2eHW=W6YNmHvU8s(s=& z#ZIM5ci8HYLEg*fH`hEcRDCopV{)}blrT`?LAXgyIF^0?Wf-9@JoSm{ML17x00^!kT+EVVB1G!fR>s@gzcX~C+RH(g zyLNSOj9IHpI7#h_`+_0Y2*%KkB$D)VVa|WCl6*D9g~FixVHHP(S$GUl)xchX#{J$9 z%04{n5X{&-`u9$_lS+UWODS$TyV$~L6@E_xW~f&do3et})C)}SU6w3^zWU#1eSsFR zLzfvosveO~wIJ$gSah(aIK`-j1fVnf+0FwEFz~?qVCR9L3^;MpjQUhhzoJqV^|UWK z+EXlL<`Kdslrz9Qf<{^VesTW+mdbupMpE=34}<^D~JN{l8nH#AuT0PykJAZj0rka@Tyw_ z&XD+jyE=@(CsQQC8}%Bgk|kw!v{ATv64+|ev3Z+(I94#{Sie-NoJ^UBZR}b-glson z=e$>oZ1o?I?&b-F{AOtxe~@s6F&+C4BLGDyezqPK>pw|x|3LMptayKD?j8!z@%$Jv zPy@&A#u(q$${?Z-9|B=8_lb8xp;A$q%n4_xd>`}StdN$^UY!kxeT~nuXYUYwCGL-Y zLDlH!%np(5?tydQ}s>&w@XBuv^$j(7M z)(Vq`fj-U@6aV0!+8%1fsHJYG+gqk^)0a-tqWqgt%?jN#F(@TE35BgRwb!QylVyNy;h>a{8dxjW)rGPA(s4Zp4@D*O+h7h$Tdypbb>mP z)Lv!yyJ#&1?fMGxEgXceH|zE4p7BVstbCc|y5N~A^#atSq+nK2DI1RlM|o(GV7!@3 z6J34^m9h{AuXu3{Ao7+oGn|=)nVJcA(OSy#>1QHS{rPFYT*+}GjT&xr; zh3u|axuA>Y$E(eqHs z$y_JtlAZm+c5Ky}vHl1iV^d59f8lT%O;F=^O2s{0Rz&97fay;htk0&lU^l4(bxK`2 zT|h);mK>J_y}&>-7|fdCh|jhD2H>S@S-OY~Hn^f?k~<|n62wvYBFpo*SZAEsPjjYH zplUecQ{fR*Am&A71nz9}pzIc^W7uSP4pz%hIp&X6c^ob8%@{;#6!>sDFyL?T2d*J& zSB4>3%?60Yfwz&Qyl2HPYa{+ZEMcKbGieZVfhi;0%)E)z%uz8fv`=a@Hp9{sq#;w9 zofqqo*3yL*jS5@>D{uiDm9V7Y?r`PgECy|aconM>E5i{V4^K%J)|okAqlRYnxi}OgFSfrtxwD#{EqOW?YZQOsvn|{W};=+z(qeVrf7sud;cxQqrqH zP?div+hxo8lvp%bLL zXqJwAje2l&KN%f+#k#RsvM86;Rn2Jw&X<+N>ZU4%$(hs&9fO?>uW zL@VY$GY^k@^@e0K{g$Z1QRH-Vt^KS6?Pnc|CmxDuGH%^WeKV?nNXWA0h(zLZiqv5Q zLUecPY&y3kmx5aDylQdY1+b2h99opo;%&H$*X1pFL84q8F&!uQh;yp;>Iabr9jjA7 zodW6<=uS;e?&?y(XA-)TqBJknMPbo~^>xG781f9gi->8BJyhoEz_|_OvD`Y%@yT3~ zS&WhOacpf4K}O~~(QVBs%DobEbwfSflOnuJ3VNeWQpXTuF8sE&C76#prkSyXG^Ja$ zV*;1rS{0Vl6yf!v&rN%Pr^Ye_gE`PuDkeEubBS6%$_6P1u?OguU<@QrAALTT(j{x0uuTJhr`` zjyQ*DpKg%&(lM{@)8dsBOY<`RV7=4osy*AjnHjIid-a5%vyODL-gR|xpWWY-HbUaE zF8s#i)S&jALUhrXY{qPfD{p#b|t;HPWqf~2RY5&E!)3BA;%}WE?sA@2zbHSbNhFPq!%6CS8qgeC{RG=+}Cv& zlgNLeME%-`qBo6a^*u!ueNN-|EIIAgM^J$R*o29Me_kju_2(E>H@cg~@4FiR(aQI& z2*M&8aL4AB5KALBT4)1Rk<0=`6# zQ;+ou#+3zi0GkS|R-XWHAg>9Kloq}e*ZlOJ-`*tXKhk(a!_kBfArC+vW}wrFSv|Q> zp$>%OisFU-lDe9Bw-IJexcH z7>jsbB^M{zCg~#QAo>i!b@~UvRHV(g54J)Ax{H58}qU}8j zU*F%&vlT*9zA>S}a8~e8=^TXzR|w2xsEF6zVRYvSq zqB?rAve`F%2Q?-ZWOMDnDjn4w${WU`7xfh(^2Qt=E{8{x3ANeW7 zFU{2L*%PNq!N_KkvNwEs=?PA)wuHo&^@vo8Nj8&LJDguwq|9ry!lHFh$E-K91XXb` z3(On+RFJBUCkG7}yUK`f9=R2Ctpi+Uz16z3Sj9XpN;_%Qtp2n?0IVM!lv=cgyg2OqP>IN{r>;@+-7Y{5hF?;ncM!RL(N(C~HTFKm) zZbzhoq;w1CC5^FDEcm#R7ug(Yg~o1{=fw2VhRS~6H{vR6baUrV~pOrHhdXFn@4M|-YaJv!>7$g%bsf_`mP!2!*jNoBYCo zV%eJr40+LUDbT9ns2xj<3R9oLHapK+eAzl6r^)4e!7%+h8$+y19$$PTCi14q5qrc- z_NQO&X2(9hw-p&?oSo*C{*$kR-{UNvMN9h;pJobX?c7QeKu~O!>YvHPm;9!5Ac+tJ zI;OuJ{!0@OYt7usK0sJ)mOfEGw-H}~!3k^mk%b?(5#CP#qK{jMu2AGea`~~1;1czv z_5j)rBshzupR|#F3l*p^X`up>=;?)()>xs@MiHGCK=m~_ik~%@w$Z@X9imTLh_3Sq zs8T2Qb=(t~Vy^a2jxA>KE*x(|LsN)yVLK00JH1JAyDe;0)nAMC4DW&^J z7E|&rS#F}03-Xa5$vwY8!8U8MTItHGm2(8Z&&WIBll4rhQ=gbNY`~?g6=4_gH9@vK z2s`NKm1ODF$~k-BXCnTz3316p7k;IHyEX-7L8;$U44=BvRGe*mY@JOT@tTe#51ULI z(VjFBI$H|X7RcLw;@CmOpyK;0q=1ATC-%{1>GdjEloFpc-y|!#lS+nm4XGup-vqyQx-$HMC0^%pUy zdy7>$1Me)Nd%in?^uw0@l~KD=mBfiv860uPv4*q8xq2Edu)?fy%2MOnbk*-@&X>(? zF@J@V@;_)^Quj|i`w4Ik3AaUZ6ck!GYHl^zxUb5QJ{+GATsk%rg#ttmH{0!lqD2eG zo;ytD^+QFBLAZ+F#VgAdWh%*9A4NT#Nojjhx7oNqXmp#MSX>OipxJE}5oqEQ;%0fy zOd(wBBvem)4RGh*JS;0ddZIyNuwI#5_xEV|k{ zJ>LbvUtBoET8szWR}B71HO_znRLRu$$6b&oHL>6BWt+rHb)*7S(##y|$Ng<_9Q)CO zVYY;A1l{W_fBN)kl6I|6RkmTgc1t{+A-I>O)nSt=&>V8hs!sM&bt^&WI@wp(+Bh>w zcHtwg=OBe!MC*(VviB)T!wAzujnFbI)fbYrd#u_;qPHW5}4%9JjWELO5(oBlGrLeE|8h6;YI3JLdv({nit)7VN6Q zY!v}|m{S?tV@6PXFdonnhv`3C(M#F2bKEda0zKnv(WV+ER}rB1K9!w~`KOWaKQhbJ4|efaZQi1FSy+(g=rG)|AjVh>G50@$-}ZzwU+$UTlo2Z;X_El9p_ zzcFJz`Wrw9!gQvSdsA>9_w5t#P@cz&Qe)Q@_LXA5>?VfY?k*5uq6JX4(0u|`%fY%| zc;U*@t(Movd*|H{>URHXJ!I)4{VhVRkH$OS(@t6@QKLtnFgg}o~K$il? z(!5R%d8`JEj{`-ma)f^SW8VmW)dtMV^us4q>#ahg*p4H6hCC!g*l|>uThgyquR_0B zTCNzyRPRMYn*hG+8X2W&8=LCo=pYqsWb*NF(#EEzU?HjUpmsm^bt&FfBuuDAn&T`^1DcR1QE?~;0)xN9OU z#U@zdA=~cZ`N9B0GP=&Gq)k)ta^_5rx8p2z-vMc#zDr8Z)i;?g*HWs5!@Y^ND9L9S zf9-lRIt-tgT+>ra$>qhQG_wY?Hvko|keq4B!^5E(Y|arMVIH0#%sHYXjKOlPm`Y|B zLwqV;T*^%9L2I~ugOGtCk+U_qm{_@XW+c2;x&|a1#=p1u#_h~^3?mqB+{$pmB_J+T z-E2>TNi;5FtJuJ^0tT9-lB};<*wDVbCNuWyk(8h^A)!dTuQak$72wb$l~jJ!!iEYi z>N@#`M`88k@hU2Tc`r>>;K`UlVvi#Pjixn?eB-DveiRkeR0W~vI!Z|q-X_asoT7Ae zByn1{SQ@~I+!RKg3#S~@0c4=eMYT3pQUpu~Rj4D5>~i$e*iPizQ0jcch0OfB6YcK} zEg%GTZ~k-h4#mAQRS(HgO-k|X99i>PE^W%&JlovdZkaPPOY{e24m-?@9Wqs<$+5i@ z3EDaNOnRWS5nhe6Q8aYKc00T(rS58)`Y~V5>YX z;v7*HGy@0Z7tGcwx@D2AS+l>-NE+ak|uIXkyb^d2I6_l)`7&yfIPo0 znhJO9K%zr)5#xwk#vnDJtdB?Xm64WPLS7Z`Unk2_elZ560Qhac_sZIa6^ z6d|c9PN9kMc)U%q?F69Cc!xUmLKA|9Tq`rtBtr`ybPK2TNf6&7`t?o`KA_|b6$Jbd-;0Dzcn=#|( z9?%=w;21_-pK#Y|sb31N=I-PL#A29d$vOca)Im?fpKzoHxAKM zIZxUdp;}OC?jH*lW8kep)zAgP419H{=FMZKN}57b@l48bl=k)rI9F7$PoH=vssd!Y zJ`hUEIFkEAypVDZr2{||NC$n|v?4T9+2xx9)2UwVv?7)FW+i}?&8@)s!sXoP!%f2% z-@R0)RC~m=SB|I~z%Jgf83yuz-jMB*r_PJ-UaA|3J#(~+j%2pFIu~g946u{Y4FN@J zHl_Gp7@gN7XO9^QasSScc2>PCtKPDJ3kCMwCpuEf&dhGd*wj;2oBp)lUTmj#h`#&F zZE7qRZc#BSN~(&MG@cGTu~aTT(s(-Xhd|X)ktk0~+^IUUZxu1nGLjAWnR`Q_yz2-t zioCi{hZbnlo&+G_&>%QTZyooC-l}$y)jN>hEciTO^fg7&M2VU&)2<5_rCU=W$5V0c zo{%ooWG}7|RT@|s5@wCCE6_#h)^x}ho}dgTE4mVbEjWuDJ!nUGPsJsBJUQsfj@Mdz zhns?3jpcTr8JT3a=LC4~sO#mIoz6g10EOwN3Ii)wZ^Y z-Z&#_Znj#CHr?lO!jm*1RRWduy4X734yO*KFSbp;n$NBp>CKJ<95xMUZv}M8`s5HO zJ|Rq-Y5+?kNY_vVm?NJIc9(l^YQ)TxkB_;}JU6agJt5M}f3a%B+tlAD1;4Lz+|SGv zFQqaU241u<=y&g;gbQ>K#1qHGV&q>d17D9Bci+`BHfjvVQtuY#>VbWcb!?-$4Rc$T}DCzg-o%n64BhD1<;n*?Y8 zl$N%`?|$OTOI-kv1W8cd^JCmgL}gYc3RPKo`I4?PNouzoT24qZmUJg~DuhY47s$Kr zgtt)(2gp}Z{Qka+b3Shw2Jby)2xU%84R?>!S$KUS>8h5bcAuoRk928irRT1Hgh;jG zCa9tdC-tC$jjTA(!-`Z$`p{#hx?Eg^@I>OJc!eT0K&00Pt8}VI$_135t*IOz)y3!P zOv#8x2@OHXG8HmMKO<^l6JyV(2sg#H@$s(kOzad6G3eXHv>?~4vI-hLDry;HNO3S6 zdjpfQB}gaEXPFf0@#EQi7k$Ul&Cigoi5ldapCg|orYG=s(RXyNt>d!lt`s<91Dim$ zN|J_nR54t=U7CcP(`B*?av_L8$~A!UDt=FaLpG2MWbNP#qlaNfi*8(sj!olWc4Rx4 zSap|}pg2-Un?r3;;rq|rt&r2U=C0SRdmd1U{}IpNQ$X*P%kQ^eo6-T zh%AHS#lzX^l;Yv}=vY~4YkJVY=y)wD`aiTU9{%{{Sa{jEJsN}5jB9rR6-YI{Q4)vZ z)W&zRFI3%H%cs-@&u1sS!1i^)^VzBI@|3z@b{5$*Pt(eT&Mj`ii}o9giNLj|9IBGv zS@^l*dAfiY#GU&NDw{kS1-(B@e-M5CFTeUq`-3pFg3u(}L!J@ms-1!}y)^z(I*nS! z3@_K>X-ss%&QpEVpDCWTlhaj4Un|Q+QNRKkbZC`DBBIAP^whY!$BK^r?KN1`IGz zj1xC1<<`MYamKMbeK6)q2NXuSn6%j{;L)Zv11uWj1&&I&h8U0d&%VvhAo|s^zR$%&e!a-OW#(UWwrVPf=IP{e)}?baHrW1ZVBFxQ?9m?^HL4Pu&$xua^b z4xR5uc>P+~&@snsf-E&BUM~PE>9Au2m*fKyTr5s6zDS@^>i9{QRggW$)(t-tWt=C) zFRZw^7ic_#3=}f2MjRP3Q5-M7Y4QWN9$oPQH~b_mc?sZ5mX|oEb^csdVFjo1R2!B#aj~?yj>H8MnAsdZZ6s zF6lx4iWxq|sUKp~TNWA?H?En9HpFN@5R!0rV>7Cf?Zpj@o0h^EtCNr_e0yrb2xylR zgDBIpmpb8IRE!_rko7>Sj3KAS@1#F#Fn;%s!E9&Emahj^WehVld%w#B@57-?AZc)F zQk4?z)totDV9)$xfQ*962x0y(3%<()GQ^oP0hq!4sZ;`{Vp1}^UH$jfNw^&i-Frl* zFcA~RA$u3*V0Od2JUzJ`7OR(^PEjMOQaaIHA92%>o|MFhWakVIF}Oi!CqV22a5~Cx z&Y8zNMoCH~mmM4OLs8}t?p%s2HyOB*fR+O>O~<{@qpDf#*q~*U#eh57Q$_h`Qx*9) zPj%R;Ez2GfnDnqsV-}sXc4m=()A^#baqfAQok@ z>9pmrw0zXt~ zozOvG7npfdl$~mN$C_J!p>3C_#8Uq;_$TK_RVqiC;3V9SS(crf^$|brpi~xpx(}10 z9T5mQ-2+PD?hdkI-OLf8;OuFfsNnBKZr?hrGZSRr`v}W5bGE#0=t9()-4U6nzXiH& z@362<7=Q00@)^Q^18YId(5D?dU3;2;xJ?79V_0_S|JE5*NG^@yC>QgN9$*pafqhLy zoc08@G2-{A+#e1EjV1&2Vze8BS&L7?zeOAiARQ}&C0~&r3ui=g$v(p5)H>w@m@&mV zr5l23+xlAaO4S1ESe`;%G-Rlsnh64)9&qH%#FvX#`Aqj5!&aT#hSnfJ!u_L&+O-V79=VVl=whIJLd9LsIjD4^<}*op;KISID7? zFh6c1M}i#ECyawYd<-9|A@gG;MfZ>qZsLFAVYj#fnnWW{C}eRxj0v|4q2YY=E7Lu! zQf|`bw-hJcFqGPfBSVa9EKhfbN*g!7H#yzM`N%}|d`64=ElhXZ*?7W$YI~jlU$_AH zXDWx6pHVQh<|2fKu?CZySq%5Eu*l_jXb&HY?|ncN?1UAjqeF7JkAwN>kdTzX=}+T> zH80pXLnT@9ORa)9kE6$D+R_nX+hz%)!c7#1>wGepHs7O-8DVI^rhRehj>OV6R00I! zh>GLPt(>aVO3p%r^Q@#<5T+zo;v}ke0*|yL07SddknVJ^@nhid@-JM z*8}9b?ZmT%oAoh{wLQVC_Xc$T4}H9HBS2TUwWrx zIyd>tC_#6dXPczpBT>p5M6!Aw^u)pnU7IJgHaj^%y2;5$3B$sX&Tgr>5KT9xPan?G zGy#G0v-l_Dd5d(=3mHL&^L7cOCJu3F_WwxP{P8(TpJMze*PVQwJmm0@{FJ}(&)RT)ojlm1fD_KR7f_am z>!=jZ+@yMoz1mblFsomEjXH^6khwU1_rW(=@RscYFr}k~nBq^lREr0~^moBe`CFh| zd1qNC4?TN4u?lQ6qbv_d4Xs~AvLpp;fV0NI#>t?y^1Q)N#o%OBBuml-NU#XMYe-cK z`#vweR859WNo%!dF|T1m`kFdmDpMH96cm1fc3^Jz0zPcamd2ZJG1KJ>rstPl!pelR z>$;%`aVQ&4K`fXYb(VpAhMWWdEYP}q@=VT6GWqyr%b10ICy)Ucqo=G?U90_e;6cnx zEH8#6{73(vHerZCjh?a+kz$W)gx1DD13JKd;;}zG0`r)-^N7lT9zQan4`IPj68Z=m z1#v>a+OiQl83jNn1n@{vXl=D`XYtI%lin?9h{)b_rfZ~PtAgq3UhX6^000qyCPkq& z+`bW4Sq+uMvC2D{SC+)Sr!m=ibzS(`WVLtUyGoo6+OT}H&BowpTOZ40QTMSN8;Geb z8XYWlB;~KrNP*n;yet1jHlbS7?HPM}6kTW5INnJT#u)3EatOLNLe^>ScdE?(en~f@ z^*Tt(-&yykA|`C2Hz|q|BzMl`b0okTsU0v$x=)l>q@KtzHFZ71SLF!JIc{d*6>Oq6 zsmcdUqFG(41(A7YOHA%0sq%gQ;9*S-6HlM0YWa$+LC1T4%3elt$~fA`$6K z$$V#YA+46qJ5d%dB+fAy5QUvxW?4W)=^7_Q0}u_AXvHX#584d~6J|26O!DU^WenIN z#nco81m{Z5@>gM~yPymWG~iRqR^cLN5Ee79ZcEyLdMcuVL%JTEIt)EJnKociAA%m8 zOq*e*4?~YOmzv1oTmxX6OsD(nQu#>mr6!O zTph@ho;71eol6u#%^K09ObHQD>qqE) z+(Q_PgvtiIte>F^@IIMM&vGHOVgMaYFLE>B-ox-^RKnop8EH#sVukO>ZFleF@f<^@ zo-jJs8KWT|cGMr85)&t}=NMA;&nbty3$xVn9R5TqoYJIf2G=_FC}x6%EwfEes;ucsMdx(EZe02bsY5^^ zw^j@C$l>MZIFGNOk+>N42b0ROpGf`o^`{ADrox-9h0Knf&|oJ`4+^=MTeM0B-vqxa zy*O4))Aw;GeM_;0S(EdYNnZxk7-QO}dg(CZ8s{R{GBH`@@fXSre}PwL8OK|4_?WEH zBxS!0Pu4oh&m@D{8@IVfgIiV@8UbjKgUBSUDve4)(l*bQJ4&Swcd040r#q8)?C|E+ zNIuNMJjOU_VLV~{yNhXspyVeGDWM<=h>#S`;f^I9KOuxSX9&HYF-&i#1eAHST=F15 zxJw2MdM~5OCQ0R!EP#)haL(Ui@Qx<*V(`u;G%YzOCWw~HpohOv##|{0JLnW0ugN#b zn}?|8eNAuw^~v8_zrf);n(T|=zrbX#yhQ%%d%eah82gpiEra-{)^C0Ej(3H{=>Ouo zLUnb-gG;i!t3Y_yVuv?3 zt^naBT3%blcl&McRx#jw*ni1D)M_mO@TZm*Tq)|q;)%iQ&YOpD0;blo`txVSs1{A!MI=qy-%n*%(fPA@Q_f`BSKxq1Hw;_3SY%AtT1u# z49`-NPA!lBzDx3$6Ah5La`<)6TE6bqWTA{%>y^+Gx;;)@Kt{}4=kj;4g68Mz=`{Ax z-~2NDb+OX^`1yZKSO|b4$zuZ8FaoyHY<0a(K`QB=M89F|M;YtK8lcN5WAa^xK?w3U zMBN0bEOkcI(zJMcv4fVRy%YcX$It(BFAS=|jB2<%t+vai%Oe#~XalDqi(Tux-DW5R zYU;C{Hg(oE<81>d1%7eWEh$WutmgF1CLB;(3#?#^h{Q6CtFP`XS`cbnc}q?LR3-g6 zeY5Eb0paSc*A7%u<%MJ`S{|C=SC)D5uq)#|I%dC!TevXoSHoqOP=urn@v&?bKz2Pg_ssr~8NOyL90R{j>i59NgqngRyugE^DzTb|hLl3jc8<#fl`mznSh#~Dd zUTP`vq{k|deRY$tSqEGykMxxCnYQq_BKcgimd>I9`R0N$982LMm9WaC0*GcDpOzJQJE=ntg`*?CJG=Yx>eATR zoFt4+jx{xC*3^Zxp`XD%{n*r}^VFkEDx33b0;}jH&N+7!=Q?3$x{?gSPb-ExA+&=M z6`BN+jC(r0Xq!j(J#s2uQ6EM>>J1KeI<6okB+5-D;EH*?+@(u6d@HTbrwkUWkd(V^pr{&p}UA)C*Kc0U>BYN8B+^ zbyV%)ZotnapV5aKspXE)k-#?s0lMqESt(P-JM4}q^g62It4n@l1rWZLfPyooCwJ<9 zP>PPA=ZURl@=vPMHEod$q~FPE7&ocmBD&DTc#kGb6DE^k)0mOtDP*um89xd3&enc4 z2UBU1G~7hnt)lh}Sbp2<;sR0-+4R52R`#no-cTMN7SpQK5*)qk8TIR(Z^*@i_3Ptw zFl}{xY)28oPFvm(-Iw^=K*;{;AH#os)#J*;Gw#^Uv+U%aJsr$0P}E6NfEH)nXtAR! z_vdVvKgP5L^o{+^35;^95YB~uJ7lw-G7Lh)Oyx1ODIk+kM*XVzijH@=aOg0t0y@r! zS{zF29hu^y-4wl%nB}7FEO{iqJS|tMh+XAb@N{6-lS#jdUpWRpW#q-P#)lYvqk|pg z)o0G*=|(`e0UGa2+*QUg-ndEd)CbPgPo;p#5A5VUogSY*C^!pbn`bY{GPbZf6y^|x zEZxRa+pM6tgg8TpISVs#md$1KAlk?-CM9NIdnhEL#N3`%N{lp+XzS>sauTG)GI?w# z=lH0cZRtVI@i94-SUWlY>nLkkOXl9s({6fvP?dbbRdrY409{OOEcrv?%3?PD1y)w$ zfI&q+WVP&@@gCsZvO1=w7z>-#A!%sDAZ+c|!X9AWvNr0NDzIsm&v~|cdgf`IIQ3yw zE3+o8bjSq?nl&hhH*jI1a-XWLVMSZVQJ-XJ^K> zU0{yYJsP%MV&(=i8lJGo{IF8Bmu^G#t0t@BajOveFP`v7U7wc`gCHYui&on3Hr3N= zQYjv{)pPV;;{Eec+Za~Dh27-YkJX`f>~YL*Y<+Y-x*MZRxR2Ls^&Q$UCSISD$7hq< zV(|~wRCis3(Uy?W%tR;kBL1@}LY7Hmb-yDKj1(ei(nTzo!kTKei@=g>KoP2k&<5~( zQVfu9kYoeFQS7&UntFJZ7m1Dy{1AFw@Ia0X%zKebymD&>b*|+Wvr8^ zkoP1==w|D4Ym0FqcHAlQiOr0Gc4d}O*X+jfa-`-ZUhlTb3xj#lnqgkIW{DPoAF35E}<1Lg6N%Q}bV>B7Eurd0v$t zR9S7*9lhCPSaR$OKThSomCsEUsKu+1-c!Ud5QbEE3ik%uEvtz4RF}ssFgDvPrP9f^ z`}l(E@=hKNK^HeNG_XV4?bLeG?VcF@MZK?NCGu-9Jx=Wj=z=6N*18OY3tpmHW6v_` zlzs^6&Y{c1HKk0W2<5Y+=$r1T_Aqvl7a7)F1~Y>_4Rf5vLdcd&3iZJ86)Ccrj981S z488+Ap$JKY&i-|_rV9ymhP6%$h6Z~NrXiR$x7V?}@D&KJpu&rxe4l|QA-oi`$>78P zhOP(rOknVhvLcfNt_e4Ka2U~$)B03D4FH7z@TLmkkDI{fGLv_t2@$T^HAS5%bc1)WWqnI^dv*%h4gE%HF&ha-`$Y;tA zqcQ4}cJ40C5d(tjFu?Kha@;FOt6`X0df`Owk zH_q;NM{^V>90K7GnEQQ`E**EL*h2mAd&scP9;0;~SL-3R*)??BYttashU=!ij2=XH z{I_B@Nxc>*21K!r)AbPBG##=Pw8PMS3oza~R?mRD%1@`Q0D2q8LzLE_y-hGagMU&I z?C)9%U~)NS3Y23fQjFS4(M$xQj7|~7Bzmeapkt)@l)gmkWT~&5=7KvFU(VTjH`jmL z!)2B2QobQDTHqyQAkp~7&`^f}356?{L*v%>7T69kMCiVyJSJJqb6BL|E`@K+jE#_= z!`>{XaWNB$Mfgcu;VT_N^t4XD%!~0T2I2|xI&v$=f=#O zd}QYvVs7;5F*i{SFViMn2gD7EeWMq|+yar29CF^|)bf?84{jys+Chw}hF)-SA?vBK z49NuYwNZomoKCqL@q6$FvzrPpW2sAV3U@Dbtuf^lFfXj-%6cS2%zqCxtk4z$7SDvV z`OM|*m3;kOx)#L2H>|ZdVi)Ba6)SH>P~iE-U-;6+=$-GuHw3eGie+AWgKNmRXKu1c zi5ne4%+07+q`W^6usAU~F&i9;PMj2qm<^7EB2J4tR9dgY%4ux5K4|RUKAklrFq}dJ z0@V{5w92fxQ9B22n>w_A?NHBFt`ljSCok~YQt*!MskTckVmAu>%td#V8kLzeuIQRL zgy$X>R+Ma2bx8?z+IacWYrEevbq1E^qCUTL0nX8KKAlH&}h*%`zV}kXC{rgFC+#@W)wDKgnp&eD=G-fUit{SI2uaw zXgwo_vV(Fzg@q^I&{nMJVN9;MHJE+c&t|DKy;Z0$)NLzv3cfk?3j8I0d(HA?1*zRO zI@hr;S;AMw*`m@5w=3!pbK$qhRcJ9LEyFzhN|-lzBA96&d!b~LLeNNGU?;^5)Jk16(niXpAj<@!_Vn9)0mDXUFQlO zq!07QJs+Fyi zxB>4Y-)HG^#Mk9HpRA{khIDk4t}C8(4evRzH8b4Y%!;auy@J@r>c;hwz0n@h=#c@K z*}UR;uHdt=mT{wGtE+A!rc`I1uaF2=@p+p_r)Y4|U>UX=j)^Yn_Fx*AvCYjcECq6n zUxH-YQ0z?g9jx_5|5Bvfz4Sv+?*baPsi0b_M>KZ8yRe%9ikT1ikFPl#117Zg1I;k0-hlcS^>legNUg#YHN+dsvtGQ^flm*8x(iA)+YwP@l7 z6SxSQRQ_cg#;X-Nn(!RyOudK>CXe$KL<0Okw`LGA3B%O;iMv?f)@+IZmT@3N?r(1Y zSDy_7>54@x{6;VD_Gjgta<7Ptl5Hd1Lg?$!Sh7a0J+v~Z;mK`0P+$%VY!XKo!_P5b5aah1w zf;eLHy1o#cU-~fN@^H?gWJf48DzMHur-4<=NBBF;1`4J#U%PsHjp4XUGM)O&3)c-9 z-@6aME&w}Hu~_GBJ|i8+`g}luK>{tW$r_4e+Pk|WRC87WRSGjO6R#K34)GxlAM-de z83UPJdh#7|VgJd4p$IDPXM`satrL9Jbgh2a zC2MNWXdd~4zSKVN74|}CUbpOij012T4iKC00yyiS3jU!i_ySKX?vm7bOnKZZHk*4- zHEYT2vp)i^_rzB^>-V|R;k2P42HxR;pdRHM0yo2n%t~EZY9xSN|0&XP9`Tt9e~gsy;K(q?$E)Pq~XWU6ALf` zt3gjRcZ+Lv6z&_`_Mo2iC&v!z&gKhdM-J*F4L*LJSo{<+bj(Bt&R(y2D~HDHrWCr~;~4S@eMPUAdzRKK8k z#}9G&8ppO~%kL-7!jOe`9s!5|n@vW$UPSZig@RXB<##G~JS4EbQ|ESNZ+tvg*Hg3q zSxn1u(!kPAE7vf42|UJK<3zLm;uv#|0?qo17Q7vVPIx!D;WZ`Yye5xvh)vLf)PllN z@eChg18G>s{P7zY&WlKeAY=|WI8F_zfJog3*i@4@>qSP3iGHZW%Jwb?=KYAZXH zSA21+}dfAB*nA$$+L>s+U(Z`kNLJBlL%h^mFcER6*%IX(gtHn=1d3%@UG5Rttd6J8kkU1AJgUE}M z0CnzzpI)=TuoT~!Wbj}tULvtHp>EC>H$3SS)l9a~+m!omVylrFXGozl{@n2+`p z71XKzO466?m)LO~8q^!p-7?*+*Q^>hX}RS<20ugjM#bFz!1a4hm29yhkQJv^pj+2!is;1b8|Zii?_`~w&t)-QReuv$jh~gk~NA- z^Icjd8z;Gra$dM>F!2#C((p48U;zhGoOpG%P|M)P@(L_3iD59ao)oVzJ8`~&A4*w; zpOf3C4B2XOAvV&W$AbRq{{H@}+6QWOAv1SQG?H4NKNeXkHND7*-)OzzPO*CbR%Bf4 zmKM64N3{a>Zka%Z)hc(lq{&f>BY;+zFP*9fo&rZ4pdZAirI;%~i;_pM z6?&U1@3&<}VQ;$kMr1+gT>)wPQT|j2;0tnTcqeBp(u-+f&NvmlUEA#DczF+cAtz$? zT9L-D0oFPw{svv?{`{A(g5UmopgaEe8f5G@*UQ@M>={Fiwi|#6W3TYZtFt2j6DXiBoTI}%@>aEN8QlJX`r1*FX2+L7;Oo%|B7IeLx5 zkG6ylwaOWIdt!J$qnr~r#zXa3UwaZz+fY2#%FDR)tD7oc`-C6mcqlw2p`5daNt&=R zQ-*>NruV^zYK0GZtWs16Wci*9fQtKDT-Sw# zQn0IKo5wFnwky_e)_7{l(-@B%{OT7HhIYnv_q$THXbg6-S*q52YslfCo$1!2i&2C*L+jY!cL-RQ0mro_qfb4kEpUB)4=r{HkjivPJ`b?oRuGUHl z!g4O7r(WSSe>Ka?+3(ofWMZ<)GfTrt<2aDGt?!0g^lj( zae7>jmoS0$rmeJB(L+Q0qNc?FtUPT|IL%slWckK$)BY+(NL@PwvAyKuq=y)QproGLdHd7Wu!pm?@7_6 z*VIt=)nme@;ESvr50BI-RBiMYGCulA<3fy5Gshd`l(sgx7r&O!FYsNmJb6me2<^R1 zXNQunLjWx_9!5qMKXD{xNWmF9EU?3Ddxw&5P&!PFRjzukKyW98qcmeu9(okBP;-!L z;w!+`Nnt%DsX(e9U^-$~=Aj3{a&%*!I>3rl6hK^JbgMN-i0Zc-7qf=xJiB$@p4}S)MH6% z`c^6lSy>TR8zWWQvQc$ENqKakYd(%$UyGxw-5mqD7HyWiJE-ltuT5^+Z@c&_bDZ{1 z_yVd^tt@Z-x%w?IpziU9F`Ys42cb`&@l`Z(y7c>CAl-Li4`wHPA5E&d_)F2e0Jv*Q z?NX$9oQ$;drPNB1Y{gNmX!bF-jK&x&#ZdK>7+BbsoO&Re3_WZqfqt5~r?a zjSAe)7vNKJeM+|C_@{7dxPY?8S6P0StvJ3WAe03s%=qE#&SZ@8JbDWYE*jmZ-SIWF z+r$~#9bZqo#4=!(@2=xz%wO5gMr<2YJ-ME${Ru$TlWVKmV|iTTD42VK#7v&{#q4tN zB?A``6-fSs;vsr=-%D^4QLZ{CyaXqiMR^5=7nS#S^hzXYSkw?0H5_;^xDNGg7Afb1 z8?kJqC(neHH`9Am`+-oyOtB7(pNXOroEmOqvsIxya_=O$D)Gov=X!`4f`tV89plyIG&U49k zpBWcIyFnp_h(a*J&gMxopl!&EMl?^V(VsCJG*70%i7^{APNK5H)Q$R@RvDGd3sOk*8YP^=&$zA!p27r1PR;^9Vqk^n z8F4W2O=QWrZSJNhFdJpQiwz)mQrMI$l;iM|n$ua$GUnnc53OuA8ygSywb_E1`mzl# zZ^ILG5AZT5;7MWg!%+LfPYSPkQZpBIl^&c*Q6MOcnga71wNVPTHcuIWP^3q6J7Re1;E2GomeBclo@HS}Vw&~-gY zsSibjWs59s4u$|30P*F?};W%>R6J=!80(jDm`Tb-$g!7)9YK^b}&9M?m(I!_N_ zKTP9zSsXnt=R?V&Kl(UkY@v7P@nc69J9I4;0_BlWB4Y*vrpVZa*%i@KycbttKC*a> z=aa(hM{ZGog;fA4PKpGn+n~tU+#y=~Fcq**(n5$e`U|x6N4+0&Qw%@fURDzsdgly> z2o!&!9(PzSy@LMBpte8im6^uZ68CL}i+GsCU{ulc66N6m&25TGyHS{?$utqal30s& z2y56y`SFs}Y@iuQ1tvj&C#1N(M<2&bEIzMINwe{0q!5_Lsji{4mbPDv8FFha>Pcxk zRn8b*_mp9n6*WI9t)X47#tgW-7PYgq-6}s(or!c~YdOKWPO$wzOmQw#G+oYrHPqVriC({z+J0X6MJq)9}4?s5U&q>P)z4htWET3hwhmXc|%ZT)03hi~Th>9ZvwtJzRZLy{wbUpv@{rqgNCh zQ)Kfjv9l9bZNb(fxpkPP>d?jV)i#YPc8`y7jJ&$&DZ&O5ntlRKW)7tu?Mc?*CbTBM zR%q(<#YH{x!%CeK$3KCIYo zd$y07Z`ZHnB|l}QQ^ITAWQrI>O*|AY$jgDjQ-Z0(iXF?2aYaT@>G;NSA*W#__4z3) zsn>K+ckCIcA8H+9fPTD$9a`Rs6=d?uQe+br$)nr+!~l(w$x)iZF)})mb)4IjQ9IsZ zmo6qYN550*P?BlJV1Dyjs~D_PGJi@_#ug}XlY$x;0u}@HQ|VL%P!>C0DRq7`_ zO&b_&&XT-J2nD@nVHt0>*oM89#yqP$|x6^z*(}GPJs*`k`q;B7-nP61E#~i?naKwn0U~5RF z1M$*c&-9HOWLqc92ZxJkd0)@;U^|RTJzZyQPsf-rpo?*aG<(|+Y#DF!_>mA-Ovq+o z{A{hqK~{C6xd3NKueUA3>>!J5%YC%66v0{H zY;az*Gc}3J>@{7-FY)@5Nh(;a zqo-o@+8@0bHoGh_HjA9iM3k#N}demTNCr6to;=998sE|~`eF;$OcyOW;?`RSRER#dq3iK9h)JfUqLWMt z#UuNZFf%P~#r7$Ws9zV|DjbxMJ}Y2m{h8OD8uT_Zj!@!dYw1jnFFLfr%LPc{JpeVD zmgB7je=;p2om5k-5u~Onex{4Dp(^34j{|06lA1n*PmU+r=Ju4~I*up+=(c;6BCo<( zR&zH0&ZYuo5hMWCk6mIWNvI5n1i5W(Us$RBViMRb9K$NhouG`VJ);-TsU@%i9@g38 zFJAnnKrA6y(FFo+y3!?I#mH|>?mjnT&bg#1L!8GNh16vZ8yCa>TAr90{7& z&3LqGxD~9Er{|L5NjxUn(mN%cxp7f68nHU_92^7dH&C}jpD;_*g&@JL@Q0@skv;L6PfRr)Lf z5OZYU@Z4*u7%gVBO*X`6AA`=cBjR>N*%A;W#%kZh`IDTbbia?qn*f7LN@ZCNvf(bK z1(9H`DIsZaM1-tqPlWgjYTF5RzNZA@<~O)b zG2>gE!G4_&rj_mx=hK7yQ@@3TViTe5Sy5?_<&fjxo*~CdsDRu^`Ib8gx@quMB*o>exr&d5Uxv-*xE^<=Klbc^9_&e9K*J}b>z4n+UJ4ex8+YT-V~ zUt)pr9Ps5m-XtY~V{y^0S&xP0B)RKaQZMFJBmC08Yt61 zD~>H&D75-rNrH!Mj9I}wm7Ra#ch9UogsCsQo|#p^(-WYv>j<;+VZSBPbroWEKJ1?e zT-^*Z`)Q-_{h9-dgMdzoVz-s+A49O27;IBGo5HV%i4NxUKf}HkmEFo~WuXKG;%d@ zP0rBO$kCPI^{-e*Zq|g`@Tm?{JRgm!X%_njgm}D?C{gJXwGWi|M?l-7E3{yta=Hgy z{7wEOH7qwMrF2q!{QBDupC9vNTbkub@2QsQK^x;T=7bsZQW`qaTg+8SJaHz(3K?^s zwCm3o>Kxx#UJBkyy!e7|l0~UKyX8gge+)14!7%`it|>Py1#Sse5JR7v)#JFmSV^3t zDvUHu#hKatzwB*#i;)j!hGu=Qmo@p2=}6TK zJoU8-=9XZ>y7>$&{;Wy-_Cz4!tU*Lg%~O9ZQ&4DHFVz9w=Jnd|K|`2Pwh;{*%a768 zf)R@;Fk(ORIpZ;P@-VO0ep4C)T4}q}7y^Mqpj`yFFX7fdMlX?kjpVAQOff2cDFBFT z@eZ--On1e(pweEE4fL>R74K!OaKP8{36zi2@)SVmHGFPqotvhPA5!u`=PR7QVy{V) z74*VQHVJKXWVIosChUiwO6$6jM;Qu=V=>i!(DSiE-(QhY2sR8@Y`Cb=DD7L&lUKO# zB?Mg5i1<`mFOodZz*QXcsWzOJFnt>CQnGCG7!C8%C$6v6bAw&&THl(K4lszKYcn>>@&YTKlAFyAa`?En8A+c%?O3z`A@9{_+rf4?8z zi~(f-ObCN%iOtyJjB4)9oRM2Qr3)Rvdi?L$zFUoWkW3Z}{o&0RBlai4CnUlSgsGRm z1IPr8JqtdL$(%Cf5B3Xp+!+I#rPbWLZSKIbUWpC#V?bJg$DlE8f!{HSSzdXDMQrsv zCh&=vM65l{-j45?EcvAE4vS~oZS81$q3CRyWw^Sd%72?+P5CJWb{!^0g|^o~7UO>Of(b*up=L zf%6=F1)Qm5^Cl&!m$Tbe+{Zz}22S2KqV=e#Gg;fL4mL(QA_@7)@Zfr2n{KJ}D06NV zzdB*Zz{~nZLO_$PO!M?ZA`Q*TC&)Y}^ME#0V0sWJDHH$}sdHpuq@=dXE z%PicW1GlB6EcmsIPI)bth=O-BI_ce1UjT1sbnc5!ITH61wVP&cirfW68vLZu$hw!l z(H98S1wBCw{s(s|g8m$e%8B+mqlwll`?%+Q*dGqn0bjfoWxP=b;qgEKeIiFIEoYVF zXofg`4`Hwh$nMX!cl=UM_*P9I;ZPU>3=uN00R`5f2`x-d4Ki>?nl=TcvuXx5#mrYp zyoSxADYVq_D3%;QiK}a@(H&nE(5<_*G}=Bobqh1U5C*I=&WFM#G}4=5!Dl6SCA zdotgd7~uMpVVLOR#u*dXF@YH)jkg6yTKh#GL_|7pTYZSDNf!p>-(<217IXC`T&PX_ z92K9e-$)T8=hOZ{7^N;J1!jj(l@8vgAL452i0NNo>VgF#x^i1b=NGlb9VPsw=O9^r zFc*mf`eL!g-xP%pS+<4?hTZf8u%tk2^!;XO;|n>USAHP_agbkqLUFdW`k&kGK z--LM4qCofwx+|Qdi6Y0*wv(kzujBB`_A`|T;8p5+yb`f=8GnhFBqI=Or0wi{I`p%Z zP8bhm3~L!nLV&(tuV#!1kkCSa9g2Ktw~J_eE$OY*u!av;&-)*X$GtYL#soT`J{@8g zoDeb*Hnq5k$42(@22I%v<~HFUC*S!{sEI+pugnQL8`pJald4-snw&iB1HmRaVbS&} zU9A%Y4#`kJx0tnj`bB1T=n6(=&7R;JLsDcYU0;4Hw|2jI(wrf^--R=nSt~$0P6JXByhYX*;`JXAPVn>Fo|@@btt7%^!(C1YLh@SUrCdPwD6P6jHU9#J{- zlZ~GCcDhB#1^fzcp_&nfWU!2)9$KwM#|HpVA&_lQU(lZZ`&~*EA?bD#CSidjgJt|8 zAMEFKR6IZITXEdQn+<%Cm3z7D_-{B*6XnKJEplP0_mas24NcC(=on9QivWa#l)r&Ci} z-j{0=szn~Nt@Krd7Ya~h;-pz+yOa-W2MzuLQkea?(zVo9p!2!Rw<}bWfR><-!G8tV zGI9A3vHh|+-eF{q@&vh@(sXFz$(f0Li+Dw`lTU?m_GD|9jGJhS(yBZ`na(zP`~|44 zvW1F0Gn?#JQMWUK8Yg?zh^7h4IPpr4holUM7vGE|pafphhewzNDk5my{G(A3;GPD`mSY1Ite=c_^GxrcCLmFbr4`RORNrIRo8l z-n*vhyBcV<;M^q~Nkh?Xp3z-fqiCMG!-u$hjV0nGPZnXeE1^orV`3}@^+ixDn#oYd zqtp!Mw>huA&1=bmw>hu8%~l_e`&|gHKzP|mnfH1Ek(lE}qPSkbnxmCqB1Zdg4%y+4A*I;VMEx;M>V3F4?r#Vu3dS6PM`I8Di+$lSKa% z2>o+T=z3uT9c2$#jCs6WM~@sjOlq;Bp9`sxmsC4)D-#*g4>tq22Kf-g8>=ShOa$#f zX(J+;RD)CZ!Oy7926dAtNZH3ss(0UPD%bBd^L>_b^|~_OV<^|IAfhif;fUPG9C!Bs zqYynB$8LRJt5M;&-*>dn#eFaTzcMt32 zQSlHYr0C1idP^Df_vxx5E+Kdv&=#{%lm&@b`Z~LG8xlz_RMhZ@qAt?V@VJJqqMF7@ zpY*W}_U_gf(S}kE?c9yp=;GrtGc_&$+9+Xq^vG&S4suW1oLHtyU^`JiX^^tOn#5(N zZZ-50)vab#dd;3Yb=d4PpUtj*F^L*q6!404f*L3PB0UxxRi7ms zw36^JCCE2uC*Kjt`bQdwP&^cuY#W`<(J7Kk96pV!-NTWD>HIauW*m zybkF)Y*P>^`+(&iX`h+S=|dl*8%w-eWmpy6fn1Uuo0+If7Z9wtaNGPxVsnmu44Se` zpH(qFM-^34ka~Q9)CQheyTlCJFM+1@J!vaceKAi?5TkkB{@|I14*ulv9pudA%#h0O zz!nN3BxcVv^#L?n>~9w=`i`V*{uX8(>apn)nRTzaeP7N6QZ#)~^9wao|IX%@>*C<& z_a5Kf!qLiA`9Wa|tFV8;2iNVFHtKhwxrR?{)bCJBN4~8~KdRB-TqV@LrqSR6vG;sN z%@f*xOFjP5tI)@n(}m~_fXD6pm#ts-sWWbR*Q2v!ufOQgxzg@=%jQmA3KEC!+!Ad3 zekx*r24Go^U5W8K0 z)5B`(iW#&wJ*d6+UwD_UxLJ3qt1q=#r^;$xV?R0#l53yJ)48v{y}iiTaqlq;Xmoy~ zy!L##PnRyi6RgPV2;KaNFRrKM3PUivx|a8S=-o-!@Ub(d-L+VRV9>eZPWkBH;cFic z_N%aC_F%SGo&WmJyxZ@au>`No2`U|4Po<}Q(-(itqmDFI|B6T5>8RD`ds%vi1ZJAv zxM*tJpsB0yg!0C9ub@W=IRS<(VebZt+2B**W8z0wLu4aP2kD#TSP~52*K>wjpBqnvFggJ*}#MI zuDWN6+xS&a2G`PV!)HAiTv59%zw2)DF8RZr47*fb?aQ7FJ5<*xpZ4{?=>wOEZka=k z`|lV3%8$9zuXx`b0ls4Kz`U?=yg3OK0_D22Wx0+-~~Y& z>&&j~!0%AfM&~`l8D5bK)HuA38jnZZ&yuFWVb7?DozjI~M&0P;SOQ1CBd7Vnbu>Pr zq0V?hapU8PJKMQ+$@1!?CUiRKT$S~uH@Sue+bzTkeCP*P;Iv6?-7|ysrhBw^k<gr2v)~T{ut+C6TZl@b1^9KE0We(8iyjh=@I{!MbPC5~}`Qu((OT$f{ z_u|SLZuxg+E-YZk|vKf4F+d{12Cwv!C~U&j$OI*DZ6Xa&S|Cb}pYm*YEoGke4PW^2jylm*{i_{yrJYuv>p7m#gG;FC&e0(gXlTz(<2;w^sf*`w z$cx$JauwB=&7>2hv|2MQeS4>G=}otVD=>q)_S_a)dl);|z)zE``D>e9tg)sKY}S=> zT7FY!fu_vnXUSgwa^~ksdjyezyK%3Rs3l|w1KXW5Jj7tPB%ix=W9&&q`QOB=Xtyr4 zWubKOk(JTHBR(hl;Q}fU1lEC&kawUBeqtGDdX#4A+a}u;a%Z7WVH3S6Sgy{N+MQ-4b^d0Zj1LrWpF>{1iH=fz0S~v(ebN%nk1>w0SH|WZN=Xv+VnE7-A0v1WtQG>jFXT4socb#yR^#Y%H4js z{~P%YcHF9z28z66?Ol8!HOM-a*2JaP0Jf*}dfEe4wqYfxJ>7($4mXB%gDty>HxKk; zoas@2cJ9$DO&X2LSyVO~J0J&H$t-NJhXbaiO(3nXLJuu{xuv6B5e>I1emu)teUnYT z-j)O)${zo%QaJCby_f&-jdga4ILCI>*@?oPc^hsuzt*PLpg%uX2Q3Y*L4SUsVyb2q zX=b0HMH{L%8Rw>F{qQl#A9w30rzTjdIFHemyL^r}MT}lNtcZo#k53#985g?wnz7_h zl5f+D56t+$j;Cqwwz|Pt?ro+mSpH`W4>9;g#)_lQOuogG9go3dwxK3I*@nAg`Tmq5 zL+2jThF-TjYFX1~AqEu}#03N))}ZcvAd0-6sG*kUk)fuzNokwc>lR9VasNyd{$hIF z$Q~{$ox1d(1@%ju=ja)~$(G3~iF2pJRDrC+GD=c>Ly953%wq0$rA@)5^A!EgYO&oN zugnulGo2yjT#=89It8HzyfW(r%FXF(RRors2W<|Hf!ml|dS1~p7pPR5g_)ko33nEI zh>BRnWhIU-P+}V{(B0?~-D&qO(~UXdUSDA1>awaW`T$x>G5{%awVRm6wLmLs90@ zW2x8m@;Ra}?D#i4?PO85m;rPE&c8AluXuN4RJ59(l zjrZZ;;Evkm9Kh_*j(W19uVBrexUkw<_rqa_T0Y1XS{`<)<#X-+E96~0949UNiYS(?4mXv3Q(PtWE0&20@{W?_-6#rJ~t zw|SoB;ZONnxZ5tH5+5|_E8T8FX+a-;L-s?#1k(6R$uEJfX74c{yaZg)lvlvKtnZHa ziI0vuUK3Al7c5NOe&uBr2vfFMi0OUsQ~nkxSALVdbh`;e4Z+tF0F6){$R7uHZ z(c`n%LKt0?|Iz>FJ?T)$V{KyhCGxic(HD2;YeXH9+4B$IXYU^)`7`l>V!lsfnVHNw z;RfnOiEi-W&@?mWvnnYNY1wT!(DFcL{x1C`&0fk8f}tC*39f8H(iA! zG%>r(6-N$q+%uVCr?ya|0_L5XItrP0Y~D0#C=MTYd5$SQXGLkvt75mMoMvz)rf|We&ryy`$Up#GqnJhj8Z=d=5x6u0(4aU79v~V4(SRs_NY-&! zY~#mdl|1rZE2{?fbb?rD9zX8#B6*2JJFVAby?l)FW%!{e<2)&TvH$UPw#Io#a&lPY zYCOUTH#i1^z+<3G6V`Ep0IXpUSiLBN;8(qW`?ua#zp-|nycqTna_T}IS(l|5t4IqZVV(Q!d!&lGZ<98*Kx1fEFe#kNB*vB^;-?KL@f>m}_VuX$3& zO$&j$E**X_oN!YmdWyCdda7wbe9uyB^NdnWtp90~e9_2Sk?r!wST+I5Rlp~Y^M0MA zG0lnr>@O!4P8g&9dr_8fr0B3nmgy!@8p$OT~&QToY4 z9PTKB_#CHUoRH}vFIIxv3Hj$=Am2^pp z_w$+F-nY@#5v?$Pb3`YVGBWHn*@P2Dg#F%rsBN`Z;nZ_gcXwCVzdP!!YEAvVe5T0f zlI=?Q%Nwk0nLh6XlVMdOr;vcOLtk3YIjl4Sp%GXbb}N&-oTGE7OnlU8;@(t8ZKqnB z+=s9%91K2Z z8B7~DBcUNSC#8Yi-T7pC_cm)4(vX3gECWl7Gyl+NM$b9EOqbyXcg!q}?WN@LIYO9O z1W{ne6UT-VMQNmgc7K&yb{SxBkfm|Z`?p?T#$lqLcMnCGlsnnVlN4{4*bh#dI-O-5 zP=hcy)?8Am@if>P5eH|9$a#TVqv7IN_Z*}c!yAG16++2qD)Dek+ctfbV~iJ%a6LJuO1o8N^m*FcJG4Nd>rW)@mGYGk z3HzWs|0mX)e8DSKSMozvKD&V>T;Bf}y+ra)Hn9E_M>+1X zIqlfbWw|Znv-!M^if8`+(JxWBDfqv2Myyn_8{T8KP&Z5t=GAN%fmZ-tf$|EJ7k^Ot z-GP@I{emmP@)8>{Ak_p=4Ne|X&2N7F>*$y0epCF~u)pAX=-hN=Q(s(kRdmQfU5gH` zjqVLuw{w|a9v9jACH`ZPrR>FMo-gkE?6vq219swTLDOD@oG8FcVTy?$_g#a0IAPqr z@6BbuMt+Za;790H8PNA!#1uB|35$zVjz`54!~STi3D8NO{c7BV+6sXwdWeMFOAE1%tjh-l9EFHlogOZt>s3Y<@|cp)mYG+ zKBcSd590bTBw5n2>*>7aETE*Zx0)PwzMs>sB(5t`ez$=#D(TK zNG6QfZfpuK-~?mS_c<=adBiw%XHtL`rbY`m&*k_sR2oAQIQbkZ`?sg2fD^;SwR#@Y zn;qV~_Jo?0{A*M`K38_jxy#>w01W32L;AJ0TkaX#Bsqn`rkg;Bb)b} ztcBKNLX5bP0jF)=ZJm3XWYFv=WFWeWX+e&`32s8oVQ`#;$lBqL_0VnuhsQ%w<`Hhd zP~q!y^7w3r?9x1@7#4Olc_l;ngu9~)afjx^KD0~0%_4O9?Gar&#Ly)ZMZ*sDP(4dB z+7rj0Fwk6c{9fW1RO{&{+C0R3!Qpimt!b0X7&9DvFz059>!;Nzk+C1{p; z$!WXJ(%XPV$GtOk20-)^-T=L4k=GH2M09oQ{AQIqJ3+Z;GJ;xX?bQk{s?y&5{e92X z8+iF@bAD94{Y1G=E|?&tIhqpaLJ=B7mdCe8hHyfs50oa$W@EmsGEZKTXuW=OD|tRh zr8XXl^hTM+s5y>u_K?j@#N^u3fsQrU;=>GzfENlVAxdU`f#IinqS+%1Kex;% z_#oBhMt<^Nsr<)X9?qTMZ^aiVPtJ!H{*8vQ&_Fw9hI=>oTk(YxA#|(%j&9EDsD#rN z!KxyR@|Ycd>vi_3+>v4?I09Ffn9Tw)~Kg3OVt@d&};h8Wx_ z1B$p6L6pbrTx14vEf)^P^;pEEwY!){5Cy^`=-vOCOfZug6c=&+5`PUF|6{t_xJLLg zDR8?GN$83b(|v=lnu~##V{{fFNIUTIi>hSY1)y|9a=i!%E!{TqEGw;17$IDOBi*1B zq=MtaLJaluZaWN99?EBmG1iofG?)TA!5|ogq;hhdiEBeRs(zGsq0a*t{bFqtgjkGYY$dJX(k z*JP`uVL~i8CBg`S6lFQr`&?!S&MeabB~-UdHq)-f0~#X>Ee)6fr)e1FAPrhAGFpO$ ziLAXtD)u+oR^LaXmmU?;gDL$FiiofV9(L(+t)Jh#_2+jYd1z;T(nq)_2*51h^Hwh6 z^%h3{&P2xdHjf`8hVWf-n5-zXt%2Cb$)BWdL~Ia#<{*tpZdQNpQ<~-RH$ssX06PnY z&BbI;s(=>0$CSbep&9V5)7w+v_E+bnAYI}ij$yxTvX^)n{;-Zw@W}r}<{H5ry=A*RWM|8c_X}31pXGTr zF(|8+?}?-fPz!|GeZb`8-$;KW;3SX>JaWx}^tz&0hEa2fykUJ!7|yUUldArBZT08z za+fZnw5$LN9!N(Oe8LN;VAA8NY7^W_g-ivM@JPa{%;Y7`AEGkZaG>n-TUth6oVgsZ z4}SjkoAAT8-(WlXOo1{M)3r4^Bo66ad!vc8Yg8XLKYsr98*FwT=zs9qnF)K93(CSv zi!zRuEYtLMbbI6d9n--{j(Swh`=TGbr7}2kUmBjgRgMmAl{0VUU2#&-%FN#?f2;MC z=WLh5Gq%f7yX|st>4rJ4DD|Q(vvP?4*5s<4zioc+mUuXJh2H$+L+g`8AFoOjb~m~) zYTu^pXRb5k8eE_k*KJZaVDvJoUp0M)zrqb7UX_8v=_}v0(y$>^c14*@O^W)A8!a~0 z(4b$_(D@X@38N`~Uy-3v2MyBhG5l2S|BO>a8p-3wg(RD3OQ&ZXQFJ5E<6@hoWXFkTvugeHxQ(~{20C1%1kAhvG zTr^*qxwvNtSM3QGxU;01&v3ankz2nUWZLgfAY<(}Olx8yv6ZrnA7c(w>RPg{a><>r zaZF-CmPPwP;0?1wN9Y2y9&*WR}Jw2M|j$P{LDfYI*6?Z;V!$tsM}H#TpI@D*zKp|kpul_M;XI{9bxQRIF@r^A2Kp3U zDnGSHDa2*a-zWH#i^&^=BmWRQBq%YX{%q`JDcrVQg#gH8<{@d~Mu-fi#3ov;s2mq> zp4k5lXB{FjkI(VrFG>2u)1>|PJ(xmn?A*jF5HjLMD%>t&1>ca;%sj-r?gPSvFf~EU zj8-RU@iqXrz!j0U-(Qj~ht2e_*xg*v7rVy{=mcmv0s>Lh$uG&4LtOeeHZ~Xh#q3A2 z93&%>Hj_M#*6gOkp8K|0C+ROTnUS-Cjt;?WMs``r^R)Zmd3Mxc!DVFbM8-? z%UNb&6t1%MGS1cM>?J7CbccO5|E|j_1S1;;BB6y3!zuA!@P(9_0^(Udv}|uBG!g~O z$oRSaf?rx<>{+qtT2p{*U`csDU{+N8MSrD4s++HF`JTX^-jF^$`3oM$7bgF_`Rdjf zu0#4x#5N@$3j8-UVvIIhe4XB0Xn9wE!pP~3{kzWR`>o^H;PJF_y}x6y1tchbbMw{h zf5~bSp0q5@-|#%vp!`8teM*ZsFMVhT6&`=!jfP?3t<^rFC3N!G5F>ANpobwLceR2p z7HqLHlDswP%ZLIP@_9*Cho&-a)La|U;d=aG%mqiIJ{dSq!W84AM?86dZ%W`EpQH2% zmc8^EF>JhqY)gn|Lqg{>RW~GwvHP-QPm|A~FZx{}{MzKeEOA2XjJ?X_>iy#&Bvj%vN$he>`vxChvfL zP~*{|Yp^~F7Ndi=;0>@ZtXrTOwdXod#_5(u6wH24l)vG5%wazskPP5lP9DH%%4M8y zl9Vn+f8S+J0c%3VFxxCGVw=7>?T-Zu=!9{Y83O{@K>-g^Si1zCL>^R4`c(0_ABno7 z#8+i;fu{X2r#!ZK9y6kxMS0k1SRz^z-<3fL`cw88IX*J!5xvUtO}LKIryYzH%0H0* zE&;zr*Wy3G(ZuHn`x<4oW$uy1kO?pv-X7In2(7)pVxBt5P--htN-v@ty zbBjrD0+)yG|$$@uu0IQ=rbkG137! z%p0c&(c)V?K%5*}bn1G}2+hbAT0t*L-+CsA^AD^K%7f2#DZ3pQZKnDYn2+=bEW|z!dJHLs6uqQ z+zH9RBdLBM?&i%TB^9m+gk-h-Pf>N-cncSkqq`o}6U&RE&VigRuSu*d?X>FTIg1u# zoK{>y-WLGz=xRxY$MWiX|DmLMPI7J4<4hTc)?-Nxu&whHQB)MRW@(vcYld=V2bdk= zUO>oHz;Uc@jX*oq=hb^#@p8UOVGq+76>m!j%Dwx9phv&V~e@F zV{Xn?AQ`p06jw`d#AF8MzY+%tSOg=~2ZV1O$U9cn!r2hIp$oMv{B1$@p2!7ML3Oc}e*8Sc{+i`cndSUZ zP3gEfaU|p+kZv9pxWfz{FSgu|pJ#y`)@qKnxEaRICN868R7Uhub?VbrQ*T8O5>4Ak zWJ{spuU2aGlP~C}G%2})12JSLPN@DlN|MTB2{PB$6v;Rf-^_)y!YKnTID~@84J)cM zk5aCfP-7V*TRhb6Z?!{R3_rX)AOX8@+K$0Y$&=#@kQprx%t)-I_zMQvPAwEqU^7C> z0@g_x=h2#1&}``0TJ1+;mP6O3;-R)}3lF7bA-#ijD0{!&sFX;|IlMh_QETH+RITOw zTC=o7maMxXdGhQLy^s_nAs;H!QF9RMK!Y2h~(Gwb5S|mjor)c^C8J2Fbpkyl)sJgWK8M`&lrGW{P8&n7cK7l(T z;8qYy0t5)u5@OcL1J!M_3C9**l0L3?OWP%;>cE~YTyyb63Yh)EF$QJ0`1siZ)ZyAV z#`R%4bN}P#|7naJ&OLLs;i+)S$N@TsKYsq7rl=vsTcZu%x>75SMXe|w;Z_4K1;*RQ|xM@O^dqI)Y zG)Z5wU*aX-^67~GDCN+!)pF<=M;L*D(prG|#e(wr@eXXE85}==&)!RXV4B~SMtApYiyqfwPBV-@mTuz=n&wwk=mfy<%1?EZHyS%S$&E*EJ z&r)!f-B|GanfsZra76qC;2v)Lc0S|y?a8At-`R~j)VaCIj2$&$sDl9cZ8L4HIj*2R z$yDjIIdLSWi8JQg#u=FkWF2-Z23~cdv{d@knyGNjci9jO(8v^pulAE*3uQ?qifLlVxNNIFrijM*bFb zQl3cxlclbEG(0G3P`$T-p`m(H8o#mguWgK?90OSZgA8Z+E?aQ~}Kn5`6U^HtA=X zuEqmunA{i!s)VRuFWavrH|fCZ)AuWhaWsrrn6R&SsC}$<7H(>iN2ykSM0Lk%L$>+jw*F7d`|)8hE!As*(lz~yR|n{k9rA<*wFw;=hKUX86GODlnT+g66v%V#$!34zRP4V+FHzwZX7JrsGBrhILz}vN zX^ySuUmpp>fn`Y_+IJ zt->ayE94#l`)Z`@|5W;lfHfWTM)FnnUatW4OrY zvv3c*_Jc9Wg>$|+2b&x2*RRA{IF4yE^bBimN*kwTp0IOR-w@4{3v`Y>8cw;;Q%q%U zJ}b}Bhiu+@^BtMjk)ehoWEGh$oU3n67=`H!8t=w(3AT$6=ME35=DWarLK5Pm=3OK& zEVQg^TPro-f|%0>W1hoGMoSNd7Z2?Pb}Y0gAAzl^67P>NqM$U#q^S<~^zB==DIL=cVc$&djryJfdo>9lLM{+?6sx@^?<#|e zEAAqS5O9y_b> zeR%GypAKrFg>UON5Ej2-*ogL;sJgudTq1PBs1RdLlxD9(%&s{4T2ygG9OaMCT$;qz z#Bks*(EX2Negn^!L7$O48}PGSjbsdhAN>{VpdQAYV2)(;Uy|*X&;J@%-ZzJw#(OC( z2tYZ!{-Spv6b+%p_RlIzw`Z8 z{Jp#^xEA#I!yz8^j$m6OZ!W{P;tj6B`-`K@e9?ScGlgoqbd8WSuDo(5TCJle>fN%T zj^2ghvrPvhw~a$LbRnD5(m{xt+zq}bdWCXKm~PolQ*aO`e*ooyKq-YqWg~yQ_&=zw zAsjdrEx2*XB1E=h?)gZ`VYE7LG4^=*hv(G|{-UViCkd(GfkAb8|GaOWpvnz|x z*I#1l^~xsZXk`2Av>AlyjodCd29_Qza8N(aPA$SYe~EMI>~Mc``@j0tOgJZ55anBJ zrj5q+gtzL0n8LW0*XE=X(o^-+J4alJd5g026?u0a$bQt#G4B6wvY}i>3~QRz!Y1tTxa2u zrV|vT>pcMN4kGBhWwV6_T=ImB9RrF3e?U&=i4lA@x5 zGi2qM7-%YW^!QwJ*N&-z^*z{!V0Od20>g{WTjAwEKvUyp$?BIjPr@)DhF(5bRB%eK z35nu-khE{e+~6YqA<7X%PSt%#FboEI&T(=Y&^)K`iWNr}{)^~9BZHgU9ucARV|G=7 zh()!#v3}DVi^AtrY2EjX=b61BzOx5ki!{G*O~f(fiJmkL^L3J3tox+F|3l5-D8u%_|7jN2BF3Wg^G$ms5$*-n3^uRBy}$L z)uK6Mey$|3)1=y$8Lf_ksiI*VK7~KhpZrYEEDxVq3Dauz+;x~iNz+Oh9g;kSlTH0E zGs>?xk{5a##P?74L66wod+gZMe6|Tjys0?*3BPMD=!W-#b~V~{&DJI>#9k85A_Adj zH!cN#m(hhnRLB`Zn+CewVhfAWTG%L#F5lxD+d}IAhV@}H7{}iS{iTBTdelw2*&Lf5o zprkWO0N=}R(l`7LKON#(KBRRwSWlqinZ|NWjPUNR#A)GLdc{bGxS%!tT9A~P~F;)wum zl-#(oWUrHl03q`}`NWl~s}xpmZ8nDqL$aKM9>zdeF4zl_pnxg)jb$SMF>8P^F?0}O zF8zX}qO1-U!zTdvA4xQjryBNl0InutmLqZV9X0o9 z**aS#1YQQ@N$tkl5UWjMJkLQ8is6t?`I)TNr$+5 zg`Bj7+$-99vC&sH-F=x=537Vi6U>V56Q5A+Sii%nG*YdJGHJEe+O*~gT9Ld(iuO{7a3lQ6L< zcF(1VVVVp)B^NO{Ij%YLriwr=>cvX2=kGw$Wg8V%Zb}$6Sb$S)&Kmw8KusQ)#mYUn zD@I_za-|=`4hw#&&2x*sT4gr`&1q9!ljRcC0)eblQIxU?Y%J7o;1W#Slv%<0po-O^ zRPUjgSd`tflE;7zHgB?AMojyPXxpgDLVXl2!Ntu}(B{I^^71@LYnYV<)9A{>DG+^ zams@I-VBj(Y*!2nrqGY_?xY`qcIvcepOx!J*0`q4Qn(P(%~#nvs|BQ|$gLAld=B!a zhMFvUL{A7gyl~wjbc;+k_)3jyP`l~Uzqn7zWPy@yIB?6h(!fF=Oh>xF?`sZeMzV~% zwiJvhyH5i#{hb~q+&PKjoN*+OwKOp)n7{q{c6a#uU^-SrbnHH0krVU*GNuhL@$PE;m$JK;ou!d*i`O%$l~PA>^C*)k#}P7?rl76yGNF5ss(c z0@|{8(AIuzR|rLw?wSZlIL~^ssq_1OO~qr`;L!j{E;L)x5yruV*M(j@`CHyE|GAFJQqGoISegXP#hLZ9SIkAv}fdr0N7JzwRa$NwSkzXS+q* zPX=Poc8cvlzd{=1*kBrjZ@5{fWwubKBY|}_O3|YP6iZEa_XqZXfG|O%dE}e7O3|Y^ zT_A2&HTe<%J(MmsWC7;e**zd=v6hNNgKNU!JedaM#SWtcB10g`w-3S*pbA&_DJ2}$ zMf@>MA7C>qrBG8|6+Vk5tP)_Z3Kpw0DLF+ijjKhOrtGF<(1n*EAA|UXqm7Rdv?HY* z32n7gg0cnnVnS)N^+>cO@70<5nX6xIPcnEF9Av~prTgn+x?u>C1?w#T%vG|shabE& z?jsQ)oCiISv)6a<-oCBLG2iEBN2FDo+U0mN3 z68<)y_#n>blf;N7F4QxPdPI9&U+V*XCrw$CnWP!&IeO^odv0k2(WIUyw;+WR_Fh)G zE9+mxb78Ix*2$9q`Vw zJV|wd5~YKbTtwtvMMTe?r&OB~my)ci!mk->SPlEMvutexVSHFJ>}a&{Yl_-WI7oY% zv_I%iAc6HC=U{D)?}bjPCI~qEu!dY_e0M{Tp2+7#UV7gu_{ci2IubU)rCL-aKnyhR zwWyh7uq-&*f1QwTxMJa^ok$)h6U9KL-8dg82WE*X;sbp~LiI|ia=L+1-HVnIN(*=9 z6MNAaU&_~alW9KN3#f89MGSd%0Om?#@I;b*@%FjC{ZKOJAyg3u$KZ(# zSwq(c&5JYehx)D$oiVI5bDg28b52jMLyELK3ioVyiq<6plwg6gWn86e3b%&&$C{iU zugM)Wp|1JK>XKkn0w2zn5fhGxFs){$d=w`IY5wp7`wV$SV|0l9jbk*$s^*JK88{71 zE!Nge0UTrp?T0rRm)O#|(=FJbDcEsDAn*WlK#aejA+W;(p-opPxS7;7hyd;Y6)ND> zYyb?fxN?QMzc~csds736fYKE3fRbRo?LT#hfB@G#eN=O(LzGdMD7(5rq)~@Rh;Z%Y z>0?jrqn2=?%LW?dF=L-i9v)UtK=QvYmUM~iqDxrJaogu}C;SA~{V zq`m!~5}dtRrfK_3j$d0R@7D2}yU#if(fGORsC*;@Y0GoVyVKzMXi(A?A&7YWT$s`h zZ|nKME!rZ7&=e!q#WUe9_Hu!u&I^Fitu+gaG5Vu{yc+DDC@*oFtg0uAk~bXoJ2u)@ z(-;lA_D__cpq5Q^JPmQdVu%YjTVu$$1>122bamkLv<$*$h75^ucG?);zy#P}HAZ1; zQ?|(Z8`~%bbpPN92O&5Vq)dKq)}^52(8)P)k-p>D=HbxCHXqmx^1B#i>ccNW;B>f; z9l<+}EcO*SllZ$|euF;TF?-mk*%`C|!?09m5`Fi}Z;?C>qNDVFi1QoOo~3Bq|Qg@v?Y&CuZs_AS}~`uFQeWTX0RT*wS_003c~}Vr^cTx zwe|MDZc|q-j~`Y^4cAJ=$B8BG>0Bg1nJzYEg}uRb&MBB@rAxkjo2ux}w{XlH;a5N1 z|LV^(61@89-dAr*2uk@spBAK`fU&dTfC@LdK|rgKuAFkiM#0Ll;J%$NsJ zKVMr>{6|(3HXa3taVDAMo6`3smlL|N-dIYWL zVx*bBIMh=s^;s8HEe7F`9QkLY3iZMOe4pGkt4G%nkrlJfk>(87W*#KRCn$Y%27Mo( z@XYFbFy83zZAAcwqy8C+0PbWHgUQ*d0TL_DsoGi?@VjEOT3U!Vj%H*qH95DZwq~vg zKpqOh%84W}SiYXvtdbUQd4HvM;6=L=*`_)HXZ+C^V;S;3?~oqgdkR` zddG)=(U9+n&P5bsB*%-r02hjZ_1w4tLY3jHGVoBIBnPu+l|nyTxo%Qg6`29uqzE|0 zy7;6a2lAA*%3w%cHLZpW-|{8+K~)@0pH&J=Z8b!^BFD=>WiT`9;F&eF+f^&;eZwOq zZc})2$n?HR7m2{(0|+Qa(0oD%)1r*Kd|eq|7#5sNH5`qd?p}rqR5n(Xc^2xXRTh!3 zz;2b1pZ6}Udyz6}Af<{AF5?Tz0#E~Aeck&fbC6jH{_wW5DZ||y&>Hej%)v#PZaY7| zc3TghfC$#N_BUc!Zc>dYvVPqWMGKtL9TLI}bbaL{MexA2zh={wD%FT2X^{|ruRd2TJOuGAqymA!1EQ#emuChwG)q~_6^-L$ixDHYN#J;pgg|&2O{TUcex+TVmKajfLT0?EXF!$ z!&}t*U7v>mUYrKN%7Yy~1Hl#D&j{5TcxmbA^H3tyj?7=c3u+`9uX0HhKb8pe%;PfQ zD9n2#w=HSn0WS>hJzn$2BM#3x6HSbKbYTcaO3(+l5kX}93&G2XDZ(F+M@%v5Ig$p| zUcN7bxH}nl;aT6q*cP03n=} zC}0o#w@>fY@(EqFoDpIJuU9)-w@>)YmRvjfo19O2kCj=4nvvX<1T-p8>Lw zE2-YR0Cwq5!^ymT3(Uz*!^ymP6^#9jgYp{pzEW4%*F>)Bgh3UPI&eL3qW=lKWAyE~ zTGpDx?u2+5Y40eh$=}c^?!YGy4>|LGYa6g0Y+?QT;18b`yc^7Q<$=71di}-h4?u$L z>I}J#L4;j-G;sFGX>#SoUaUMyH+fy&WHmq!zV|+%5I}D@9UTCmcK|UAZFC%}-ZrXD zs6B}y@vxu#j-~L&lhL_5OeU?H*qCndDCL*OZ39%!MjBc$p(`F*l<#b%(#Vs4$(QZ` z8zrqv-iWRdiSU7@D9mY1eWQCAJ&jcgErYHoc~Bhz@jjeR4zy&S%^wP!1en%a&0U!J z!i(>L952PaalDQLdf(%B?s8a9rw2H!+b(E^GuZEf?r?kNb*o=|LXM?^$lMM5MGNP(o+= zxPJ|D*Ml0AWJpSVyqfFzkr{%_(=w0$ip|QTzTc(^vdAi6;W4f?LB*#iR+>Mo9j;cM zrprnWEgLafHV;U4Wo0$dWnWAz=(B-CTik|aGRY!lUVn<18JkSZECMr|lCR7nWyYBH zDT=P<4{L|`MLLKA9Ym}H!K*4$O7Rgt6(V@~$~~*J*v7(Lz22nWK&B{&GR54eTU%uM znO80VTn*g&p!}?q^};d`2z=1fRjY-fvnQ1 zA`5q=e3N=ppCUFq!|>C%5RMnPdR3freN~iimhziq^$^N^K)^$-zxr_MC$(9nrsK^f zU#|FWL_Q%6_;aso`xi7n{R=uy3cQ{9iC>T_iDEhnzn=MOG%nq}h8Or~xRAwDu_@!l zrYt?0xlu)xvO~#Ta}#H|^nl$yn9~39^fN(w%TVZrFiy>v5HJR_3*q&Q&xPx6fMFyI zqh6C^FA|-Y>v&ZP9j#d_2whUe^e!nPMPKuljH!n-E#GKu5FFHep!W4(OGZ?8AE;xn zHRGw-#{_OmeRkX6Nh4YYnw-WG4NX1w-R&XG(D{JE#x~rA*B|Lb(#WS;#J5=o8P3K=z z_%Sf`mmvv3cxpWbAqHe}j|@3+-|05lfV&>`hsMX((I`d}@2%6#&$N(>i=xWv)CbdO zj=h+jfkQBri@#BS%prS6_l8vC3)9tw=D2Kp=^8i;(bWKQ-g5B3y(CWF0Q}}=ldWpL zK)3Z<1}raSzn{<>@=pA%&#ezSxR;zubdRVz-?Ez|7ke~nMlHqtc)h74(OWHog;OYh z!*#hyS$=ZCJ%b9yF}=9_@M|k3N`?b6oFpz}q6d9z(n#Q|*qBK4#_ZbfQ+owfGpBOzZY=`C~ zXncbD+5O_kW)+aBC>so?JB>ONw5kC;rz)@%{=g{5lr1^p`|@W}ib2PKdAPTP07GPw z;Y_7*iUM=RHW1o?97jyh;W2NslMV(rJn~)oRkh)xI%H58d0L$bJ7~1y zag7cd*B(+B+UU@sW#q{} zz~*uWgUr&(#A-OOp&N>zF+f10Mg&J^L&#*~Ivg?)wNlic*W|WXmQT|8kq*bp6rmUm z1Sc)XXvCN@4EAXxARq<*k~d>nKCxsG^^drJ1L%ok0d|Vc|90y=%Q@RFXQMrYnr#(| z{~hcNhzi25TyZ|&N*=uSL$E;Xh(2i)3w%Ww2I~1xNak#vR&}y|2w(_=5BZ`F>;dL* zCuwts&Fq?o8@H2a%lAPNOn0vCc)t7Fu;BgtJ_3=qE-tWCJ=DR712mpV3E~bdNI$>x zrc!pVQm}!UT%bAJ5R=!5t?Glv)mVFvCxbz?*WE>e6v~@atn|Z2#36k}PKj3QqBQ3m z9FFVzG%LgPF}rQ;C>)FNTv8a>SU;wy$SFe$bo}`V$8e$(EVP&Ke1==e8^2@~a`rB6 z$u73}7b7X9u(vTpqx1{El1WSOgyn0qF9<>Y5z!Nm8llFowQN zfJ+iQg9^l*DN;R1=$fbVE3U4nyPV)|WGg}cAgscrMfxC+D(=(d8?j3-J}RGoragkSf0Hv#>GF_WfTJ6Z?h6qIc0X_(58fHN_f@&(GHeMFpM_~l zKic}N?7yAcz!Loc& zQt*7TYWeYI^8;OJTZmxL^TRx9hC;KXon}>WH6K9v7Ug!9jcT7GzLh$eMhprj;fhQD z0R6Wpw@Pg*gC29Fr3w}l3hL)m04X^TkcaH{mMXc>&LLN2+J;a2*Mp-D!O!3f4GoSx zD^o2BQ}t8X!dzPkyfVbiN(C4NfvS72S?DS618U_G>^4N_n;ktI&Bw@gys@ zV}K_bvaQiQ&z5Zt?O)*}E>nrsXE1j2abkC8{EMWjHtUopqoR(ximy^5mrw^*PjPa4 zi$U^^Emv8Wd7*ol#Hbww51*23CHo6|S1QRce=RUJh*D%Q z??gjDV50sly@@UV*T1|CLk=hfkq1lulP@7G6bN67;S~ul#{9gxGVHWaa0kntFKwYb zonuLOzKUK8_)ZjRNV8u4mfl2Gkk`Mw4PzuoLt0g^%I#kjlK^e4pB+Z{$iN}O& zi~8ozt+ZoFVleY_Rnswn;LGh5h<4=IKBIEeh_Cy<1j`uAw(4w8TJy_Qb~?XayK6m- z=7TS(>A`=OrngsrI`7b1U-*1@e*HGSc?u(WA*~*^3N)9hoe%=Uy>nG&<`LD~p2-l* zj$SwS;298b>;AbpI;OtcbM@L<1IDcB@t4%}_`grn9jn0j{Q7UN0h4p;?wv}V{CEv#E|E9Nb>{@azb+lKP>z98A%oOk7 z`pdq9=GwE@v)ORa4`S4%SPQupJh7`uqiSA0rHTdbXt#p98RIi5u-tAvZ2-S3J5Tc>p>}d^oZ<1VN0( zVNij8P5*O~AxC#>1|qH)(u`71@`A9-;B{VSwL#bY8Mg`yCMj4lW3JZrB}9UrXBWcD zCHn(qQYwCWUaVZt>s6%8b|*#R+JhOQ9jn24!`rIp3EZV%*8El}ICDp;trY2#tXx^1 zw51G&6?)Ad_%mriTi3J%DB`oprtJwOSLIJ~cV!`zwyNW;V^db0@&sd=ZynPiG%%L= z*0D&VEn_ib_|C8Xlx|CK000i;TIq$N*22&$eF;Uuk*{_Qkc+Op41*ZtFD!LV-X#D6 zr5*_cvr_l98kPDE#ZV>;F>if}lv%PZ^)@C*?Z>Q28F-ylK{mv>NMi6XCO&}R2OdL5 zo@`bfkPQ2$$Pte|5cLmdG3V*mA;V}Dh5U_L7#I$w`C5jV37!KuBExTE&Kor9PtY;>T z5m8jDtJQ?STcsOWx{;wPIAcOLtc=kA<5V5oCacv=viP`F1=pvlUlA9@saQ2!Fk*tyE#EYXZ3t2KAk(=Gdojcaqo!uNI5(#H4x{^;lbH| za*+Ks)o9YVu0F?W3AkTKqLZCSnZY#?d@&p(D=}!YGB(J?Fta};D+C2*dEhePA<0ee z%QJ^k_@>u~vcfiaRac+s|7-f20-ath*nAAm46v>o#)=@L5o>XZLUyNh0ZyXe-L>+wq(5wBD z!f3BIrKpS?sfe)(#U36Y_8vkQ!*Kr?VC91fKO!G1!msRrekrrOCKMuaT{e7{4@qgD zjlGd5DK|MnlpipOaP=Vg&y&7HZ=RDd2F$^nSzZ&65qUlvE>BSPkjdV*l+2zS0nrbU zr)p|3P|X*!LeTQkEc=o&SOk^Rfp6h2mEhU)xW{3l{WIucxZ_qPePY)UE>F}f8N(DA zQ(8#&1S0>Rw!Ll9Ih?aNXV>@X)2?^KW1Vb$$48RGP$%2oth~60Y2lwwyI!=M-5C^0 zN(U$+FBvbc$O(N;RG5^9GnG^MQC%VW^uqVk+5$<`la9Sed-7fYe;sKGy96+c_*g31+%nW9TbmHPd3%6q|=;2DFN^S(7^Y$cAc#JxfSwh~^i zB6ZyKgqu!Ybb|+4kh*n!t5UypTF+wqnI(E+&qAVs3&?p#C^^A>B(5$ZA6ZyWgQl1A zBwA3yz$rmIPtj)<{He$8iA3Wah*VGDLlSkw$VtkNjVnb_q1Kzm zlsA||yFk*Rlhn13e*5W7B<)#hX>UvE>ZOju#|9!uj+#98^n4+JNYnnvmZCbO8^ju! znpAq};~=wv1LFHc=(ArmDr~e$Zqk*gYP?@A(+5J0_X zPoxA*%^H=vK*m(qHU6alTvC=YB7-sgwTM?meh2q87lTQc@!OngQax$H7IO6RO@jCx zD$9AF#x=aWX}&0y`UToMV;L&BKVF6bGypHiUyF#TM~?cd=xt8ru%0xrtGbMoK3Ds^ zPb1Kels>Hp_NKZrB@3F%O(xbpZGGvowN3Nb=LWUxSPB^2+(Vi*m#>Tu3Rlv-wRaoY z7p4*p8}+>1*lRpZM>93$=pa6 zyC-gI3$_4YjJR01S}!Eaow22b=cnxKKNm@ieQ0VDwxMOrsIlC&EVe9nMq0CGy+<`L z3k|+0pP<>ShaoR})LgBOC4+H|8cUUUQ~Y9u&(G&>HY;fGT_2aGX4E-?Xs4Vir*syV z?1X(yArfKpaRqAMj^yxaH$Z%PXCFV95zS2~gaL^N=G+B-76 zZC-Fhz15j{XACUNGY!;pW%`oEe{Qmh?lM7L@3qaKG6Ls*V5K@8=bz@KB-`@WaU&sIa zRHyOJB^+x%CFRHXpMU;Izu=qnF3YKYP$O)X2Rw8Gehw{+a;T$BqTk;CaCIGlP(*|x z5Q@I~=bwN2T0eG2su^8N-#U)DYOVOapU|F*y4z|WlDTtaPsj}m2i=@$<83!WjV|hL zD;+vprttLh7P?OBWSP_nTP*3KXjxUXs@ji@1s}Ut@JwKjeV^9Z;tl%_wf2^?p%%?Lq|>3VJ^R8! zL2py{0Xkk*O;l(aek|t2D~hX+r@WjGG6FNX?5O0XV~YxU-sTH*Aa_4CfMU4*g1LOt zpj3amGab$ZaQ~1V7_lHBqq!7#F!ypFr2Pl+ZyP(z*OU)}Hm^3_Ue&nuQwPfD zhqTPZvuNk}D!oetUoxM;^l_S zr{--N&pS34pEO}gCL{ZyM+1Mg_e^>i-oV}M@!J8hh>5lCX&tfX@%~AZs+5>HHIwL8k#fov&dnLLw}+sD@tjda=uodNC0(-%#AR#%X+uq0K-BZRv|Lq5{GtF zTHqrgRI&RM;V$yd19!|zvWB{>+a^HbMAnIfnyEk8^CDLq_K2|Rkoo30+C+KLMX?*E zRW0FOCJzr~ku2{0LIY1SSAC{C2fnGUo~k-s$K@t>F;#-oV=|4uf1*Ib0HI!GS7H za6$Y~R2;M_-!5xs!u2Q5OdC3xTsXqb-9StQ2X?NjDky8+fa)?zsz^v@O2 z09*Z{SKk+v+&(1_4{1`WH#z`5o{pv-!}erK80pkO*jilJOS5tk9dT@q$Z0_#dQhsetiN{iau-E=<_~|?SU-m*A;7a*RX6PK9($t+XutbTn^9CAp@qLu^+(Ql#4;t@A8X|ncT2C|s6di~}hd`dbQ z_Z0>4bV4!62m+$pg(FYJyHZg@hpx*q6uJwa+P%fEYvI~OpAF?W1~E6zQgYdX-rqAG z*zM#zgfZZO*+Kkj87zqW)e_YpY)7g3bVCn-ii`Xv1JGF3vM^r**&>#_chjL=7Vvw?@Psd2z*=OSHY?vpW<5gLqW~ zcqr0PliL(Isb!K^4`k@$J{QJTnXaBBG=g1v7%Y3_Yzpp0=(8e1gDvMGit@5mJ; zvXLhn3E4=tDL-M`5@GRU~iYhjSP zP2?(9whprV^1M*W_FA#nz|XVF`ME-%3f18+vcVBEsT z?S>K>fGYvVCnBQM9DFXL^wr&~s7JrP3RrQ<@O`gKc|VlN9f{*FduU9Q#v{+FgGcD7 z6{Y((tMj@`oiD*0D!uMdsq!*+QKVE#EK**(RUBwo>9KO%UslI*koEPyH+rbxkk4(i zN`}nfHGi)@OYT%jqr~5@E2J4#A6d0?tJ;_33DwSxYUS|k%aU*8WFvv7+h((`9D?$icla+tEl*@FgHYb!{MNHZ_Y`tlQ;IiUYQj?di zoOk<_`Fjk1Li3}U>r=++CO&d_VKyJgxyOy-9VJ(<;e0Pj)=)8~=Dxp~hYDdV88ad;V zre(`Kacr04eX0wN`Em^1>p$gmQ&x`)h!D2xw5k$1@iv3VLeGoD z?`nm_DHlCEBUKEKd{`1M>7prQl#XOGIIZc)k?2}2v1oTN2MP8_DQtXP_l`GuoW_CK ztt*SSe3S^=fm})L<(NP%lg8%gP{xQuq#V?_#~h;I0HEub4|;PPno3$HpR@I5jjC(7 zPG6=E^}XNZU0g})R+`>)kYr5v+R4MiDqGNH2t{E^_7N*@+Em_4F^3wb4K)g{haV~&&OgD%;H;a|@iCiC=LfWStoY0^q>S^v2(;)U~ zZ=V=FY!*tuUiH@47nHh85(Gbv$+!|ksvyCvuo z4ph)JNz&bLlci*W*q3sXFIewfT0T=>C-0&%@25fb)&5S9)aG9K9wZ)xp4DRpr)5{pqQ!+o9d2`tOwWm;yy#-Rk)l;{3BDL-mj21+w?N1sp2nwT0F+xcii z6;tnI^MoTIjQ1^sBOy#*8WVP^P{J;ich8i-b}YyfbObA;VlzyJtoFxR&QO!(j1@84 zGbK(U4L!_uPYFj?j&p_7g;u(HVCEz@p}Rv3>=z>Jg-VP8A7__y_}TP&$6)smz>u!D z4~enA(47(@*@AGvdNif&Dk|CDCgswh0rTS6_FH?KVmh~L>#3wLpt)IbC6PQx?evsr z{cU-`+t!D_=Y!7FRiLL4a|h^>mvM85$W$8IEHFz>Cl-U08Jxcs#D=G?1)>yQWT!3@ zdX?Q!+7iz>)VWD3@rV&f2UbAJT&7&~qJ$U80GV)00^a4uZWW$M(%E@PVx*jB#`MII zCQTwok3Krk^SCJ7lCXNYv97t$n$1Rs?|=|0WAb}>|E!pb>F0+eckjX{mq?g}x83EO znk>l)8Rq27oWb+btf4ZsifpcYueywS!mdYtxZeM84F6|O%v{H@kpaUdl{s9)n)1R()?ru1Db}dIm`p$`l=^%hxAlbb-9dsu5*voO$#q$9!T%Tgx|NB zz>BepKP6=*@x`d=Sd$x#<(}-@O?FU#=#xF$33ZQLcNhvlY(RI4g-tTby%64l6ye_Q zLsBN|6lct=3gzYk5y$t2%vA3IU7<#nT5u)YjBs6}tg`aH@wLt*UXE}+icL-UHR4HP z5ocV+`j8HgYIb2;Yd9W5d-SAzPkmK^8{NZzu~!JIEL+cb3-$1y43{f8K`aN?8>X>S?m73Q4OV47zRf zX%jVv@7X-O6L>kPptE^!F~Fr|VI>ML_E1Z`a`2*%&K6M7+gk<2NgNO>*j+~87kMpg z<-vK&{$Ss_6G`)$g560ICA(e?(6mW%fU9Zq(D3kvHF(cJH3rSDTNNS6LoCxPcyJ9$ zwaJiRlHERB9}pBIKW2#gT5ayKylO^ZUT+B~I-ozs(j7MxWJ6|%2II~KZ#%?g;m|?K z!H?5?vu^nvSz2}C`j5P?Fkm2l);=uK=H54>DGtyfw8(SQt= zX|kf2X}SQRXvY-;Ofsl*m8{eFc9jrVL+-{G*bir=kFi^;!s9wCaSv0d#O12RQ&-Sv zP>(hEKfDwBJJzWy< zion1}tBUiG88B{3(hAclZX`PNQ}I!6UxHv5nrDT(WJz05A7v2r!Afe~_neyz^whlP zVIGn2;BvKLw2jQ`!rkGdt+PHW zEubgYvxXsaMh4K)EHrqCIwiH<7}z7BE}*51Xe_agu-cXeD5-&a(sGF}inaIUa$Vc4 zZ6M!umqT0|n6KFfJyR_JZwX#oJe;mp;9@Xud{{FV1!x(01YJnr=xj?0m=r;(w9;ee z{pLhJq-%_hjmgWn=xm4zo)m$uG}B%=2Ap#EA8_GDJv8XIrrExvM2S3YRtc~eadQK6 z_Z(svipRNAN-_|Q8Wu{FWRa)M@&X1|j)J+vixiV5?Z87_Y%}?O8~7Sr!t|MxFsz}* zg@;!%7Cy%TkGi;MavF#58XclIqu$J<(H618wh(O8Ett2FyRmIdD1y7_+~(DsxAATc z><$527&sG?C5pV(`*<8WQ+xdAH#u5rW-7mIY(FFKIh`Lc;xhv8*J}pLWzTyUTFw z2(A#g#NkVjhYqlt5N)3M7^0)i`z?qAG#m64G@DrTBHpnEfrj66xdAvnLjmNk(oJbH2wlAShGaF!(@31T)w1rvOcEExdp-@Pdo zfyp)N4?0b*6G>vkgDwj#I4jej3A(oTXQkMa!2)c65Ru_55X(aYcutFJ+2DZH@f^CVj5{44U@DQp9j5B0=I&d=Xlx}#; z0Np00KC9p6K_omDJa4Vu2$KEe*=*j7T)5?XGg=vFNoR~X=MxmD(``myLiKprM`(7wj<|H0n-d#@_mT{upeJ^XiI*r+NHiaVIBqiexpbORKb*!Ec!{5c2VzF+li0ek|_f z=uSbcX6fmue`fGotZ7VEFu^q13vEvy)A-#g zsqTY#X!^xpP0t2_i{d%tVi2=QMy=C6SwFPDAvE*VHje++8+d$97AQiIu8Ee z`|o~wtxn@Q$(KpFG!TDmy;9*yd9NNE@9>@&hl9fN-LACTmFp(9Eq61HIE5Kp6%K)6 zrd9a58i3=-yWbR0P@Xm;)h%XKQY!Gt5_>7*msk_UZ|5E)#h&95g*uxJ#?2V^^E1Lg z$BpQAi=&m43bL}qb}d|tW#sp0aJh0Db-<;mum%jOxjA_(%8xQrCe6|B>4l+88bfJd zp!zG9h`KNy7zYR8SSJT6bK0T^p_WyN66#eNr*aD*(IFzYAmyHoD#pd2xkNJZB<&fF z0*jhvD%D=E(nv^Z7)!8J)4c?(m+t(0linwvvZ6HDdA1@vt~*@Pi&?UR=!SEU#mH^! z189EZJcmlopzhf^^0+N==`t?FNZ(7fxxLL68R&Y_%l?#Y9>odPe#3fh^QdExm)o(~~_FrTO@B=Mg3P{O|B~E0NbOa#q;e+OUQK8 z6WTpjcgzNanJhIQip!DA9Brrxs?JYh=5|gVT&_~&_b=7}yFQ*r38N*C2Zum&NTQ~) zdNTg&$jJ-LrHnio4zc1e*afYwixrh%H1TIuyvaZ2#be&_I2GqEKdCIyuRL{)yI-Pmokx zT?4!>BW31mnh7)Y5*payUM1K6gnviogE`&xT!@`G5UC9JI zlXB*FnzMH5 zBJRh7c*v5>P%-e?v>@^9f(b>Aki(I2ge3fdC?WpNQ6kK{-}`@{=4h6_FL^Fn3SgH z!1c7x(0!oY8C()HXx5s}bb|6fq8AQFlpJvJ^`+)9m>#q$2fw2emRk7{{dA>bOh+s{ z)lc-(TR6vy2PQ>p*S@BpKEAk=FFpFlfBeVjf*W7ZDigNueSJyA>f=pL2=KmuSe4ey zl|JR|jld6Ir4+rtjJQ$sfm?mRtf|uaqQS@m?OR^c7O!SIu$y+Va}5p0z%6l8JW>_( z^+S=~@9RqnNzQJ~ z)ZrQBnzNvEPT1QPlEBdafR-$apJ|toOhYe<|CnF@^ah{jZ~VV^?tA_I-IVLqeg}6+ zwupary#6YI2=hL>;GRc`mNYDhW-0ja`lmM^unv6qP5;64_}|~Zn|`?Dy0;&M=!eVb zXRl|_{XivC*AE+tlULwvjSSB6pd!PZ9c%}+kJ0+VH}%k(ufiPU`6Q{vQsRk8)MW)PH1qsj6{6asDRazbQ-XvKsD3M|^>m zaRm^6rudb#reebw3_~Udjvkx>{mwQpkbW;K26W{y|6u1`v9Iegx_V@Dj`;bTDpDQu zb76?&iV#d3t-}a#4usmI^(ECr#+%@Q2kxq@zQ->88-~S*C1rzx z{Njl;EXu`wirR5CjTiBnenz~Pd{xEus>_T3VH`SXM?D&b$9@Xt9I=&&=jJAD++RXw zydRhV#4EbGA|jX3)eXNJ3Nfy$1v`yW2JR+*f5HH&k>!VTa_+z=(o!tYta5;4q9hN# z+AgLexZY2}$3=YQ3)8RYyPtph>F2-3_}}ZlzIn%rV`D#jf-#bbPd`WcGr}u>{1L5w zdHdt{zs5iR^8W45e-%1pAap$jF<9TPfBZ4hXOTQZT+ZwF-~DSyii3~r@1Q}ELio{i z{^#G`{`e;BOgmlhJ33=mqaRIYKj`*w*j==xMU3ZxdYXe0jm1B{{p( zs^LQr99+035uQZ!1Xg*q5L5bn=$8IYCJmEjV|`y+a3UMNT6`P54}I3!Ms_@j1Z}Tn zbtTIs1rdvb0$y&4q|wWFmTIK?;WMd0?$L!O)w$?>rL;J7SsVpI%ZCNL`WidRU0$#= zBjCTVqIzRa3TRMJwsRDhjD9o1eL^=uhSY^$GVh#TPX&RQSkv2-xJS@U!3s17Sc zA_<1|QLO#vbj>PTwB#}ps$7FWsJ1@6eakH0L-_PbogF;N`QC+fTYrpZzGo@Dl&cD#X{o*O z(&!v{OJ}lSe>mhg>6_w{1;P0K-Cxts?C9V^K!JB!f$Z4He>62VC;%c-8ZhdZMl;bPkyH;1 z<$uW~MBHZxBZjZJPY_`j4-}tc*6&Xs@d2%4w7u|6qu%fRKYEdG9^EGhsf&8Q5B~6o zM!&e!`h9{-A;=-kAqkd7*Y-eBej-$&y>eVbj=gOm1U_kQc%TG%`e;z6;zzDX!l{3a9 zcop~Mh{ht8=FZeyL3h0c)0DI@=tB!5C6-00KQjSMFOm4-66+OYrt*>6P3v{?Y zXtGD}rcRKz-yT1$Jukxm3c;$R)EkrGH1+h`>fxK3Picw5%2p_DS9y@CeteTI=(;xZ z)4O|ctev612|6=%)nYht`m7-oad_=2Vd2hNJAxK`#s^uvwlgM_Pt|ucN3hVyUco# z@fAMIU9@A=C)Ng83umVdbx=~i1b^+?H2h~n5oDe;oL-0qfI&?k8Pn#}CxXKQW6DEJ zS|LhgSc(OPE8jgk?qJFv%-N_y19aRY6fF#cavYOZj1yV2az#Ne{*`Pr`!?DmUYaa` zc$^o_;6EP!?8terlOzT|JNEUPg%pkQq8U<1Y)rp0jHrT``-_4ltEhN{uhuD` z`%Q$?W~TzS%&=qLi^SUC^$0bC3e0b4)cuCeFDKs6XxkgI7U$j<)oq?0^}aaZh+dme zGl~hUxc}SVUuYPisS$T+Ig@-|s;v8sNYe$J{|<{X)w zXQ78-!{8(srf$2dV?vRYCFG*sU*7%OD_T>SB*yw%4tS?~0qreU;p#E2ewRbp6jDb$y|~Mf98W{-J?y@8Rv47THnT z8-X&+rXL#U_8#0GdiX1c$n*F(>r|#+!trdxYecrr-nKDXUQk225g?s#LaNNVgyYue zGA?6;V4Wd*3|;nEAKnSFz!M}r+}t_P8@$zi?pP@~f>AM@ofF1ew_U5mhzy?>QWdK2i+4v1c+nRDc6GGGV71VyKhRK!vH!O@4Z}+J%~>Gc?2#V zxKv75L1i4|Ph1e5?zxbMwS0>6hjpCA70i!i`biSlIHYud@J=KZ@Fs!W>?J%KxLmN_ z4F{NoD}_4Aau0&yGD-TZHrlqo1Y0N(JNf(aDf*BkDNokf!o#`y(oE}3Mekf4 zUs7NZfH*Wg+zb+}(N2FBdQb~?dLb4m{JSY$31XNk&UMDr@F{NUh$fbqf3SgE`a;D? zC>aOHr)6@JQL^q$T0f=;wk_7{BLB-fvS+`47yl%|-=DH1fP|qO?*~{Z3YDT5)0#Cx zU?>c|Ts*#e%Io{I&K8n^_12}I%=#l!<>O_=gKB-{kBakVn!F<66)7(=w!eQD39sl= zmIN3!j+aAsQQ&ONkBLMVQWtHDGUzS6r|c`n0i)=YT4ES@O1(BCtLi5Q@n}{l;H4lO zz4W(-R1as#@sYeIB=K#Mt>CIjd;v^ng$t0q3r`XrF1OZ|J>ZqnVWZFbBMQd&5`)0I zgvI!tGAbP}jyyqp29bOfz4q_tikNB1SHI#ivxw@xIA)C1Mj@WOyCspR3@k)t=4>JG z{VwoIxVQx3NOZ=Zr$KxFDS3FnP}z4$YrqyKV7dmTO=^rmvVBh@0R7D`w6_8=(UP&% zpDX>HdH9w?!21qVB3aZM$}L8^Uqx{$S>otiVkUIy(zzR?`1V+X8b^TCD zSR?N@^xwOzzTey+Scm_9g9O^FPFGKu1Iryh)@3SC9_s`-81k##&`6(SvhTmdsA4cf zfFB3Kv-zO-8OkpbemtR>-(|FLr&(qQa}>FP!jJ&d!7%C($8W#+h86c}QLF%JK$XA0 zX{e|5H#GGPE9o1z0r%*pH`v3IvMe4w6yhRz5TJqkG`?FEH&j_d(tsd6t9QV6y3e8n z%?;@GHrV8ej4$(`WJtSA#-|E#B_#Ux^seWTd_V}y;jr%k?acDaU#cRPmU112Ln;r6 zjxWz4gYn>W@{=)6qDOKQF&(^6G9r0*?_FKB==Jn24FnI2CL+laY^?6cv`(HF4dym2 zOU-84pq?F%b#ysAEcECY(is2fxHu(NL=rIrUbEK86T{6g15U0X28Tv9ouH606moXj z(8&16c&X!6vOi+#czsNukMk0SGA75wZ5^+P6OM?-t7f|U+c^s-=xX|`Q|a-_JLUrO zc&*K#wU=T6b2AklAX|On%lQrvlb!UTv@=tVL3i7YXjkawb1Vdsmczgq{+OkE zlPxJNah+0d7~AoDY?utfQ0Sv5U~Ge6x2HjI3^{`(^LZ$M7)mfx|MS{VPBZrz%%UtzfX9v_Ysr!68D6?tQXr-!He`)wZN zv-D)D?tzz<0xFz}55esR3e85&7VwIM7x@r`SH!$R^a9S&S6;6oP8%a;t-uY?rXfS) z{8DYSt&MQ6HY=)D*d3@_SJsPi=fW%wxIvuIwf>i24n@Pn?h&(I5dCZ8?TH&9!FGoZ z*Om44IDU-_#;cAC#^aoMb@`+vt53T_lNIgyct7H4tfAoR)BK2a`J`pFpL3Tskh?U- z+M$GIt3fFT(|@oNHPL zv)~XbWJ6>f+ zLz)qT)s_ybReBs;2FN@@KAIj!^n!d8R?K~lk?lPL$Ez706wf(aU^4TcOA4bH>$R^p z=!5z@hYkxSh)h+6f<0z56PX^TP{1H2GF7C1Pta%&mp<;F`XZ)s6gf%xQ|E^{N$2$b zlU0@+r|oMucaG@`d0mWvbUa*Avfb9jk^^`Smvyekm?L{b+PR!cSi{==NbNcU_y`Si zHug#V<7>{oeji%j$Ib~?lkaeu2VUl*dPCxYlh_sPJ5*lp>C+c;{UbCrD|PO!8SQ=o{ZR8a~cVVKO!GZeue&#?|GQExKL48I%dmn% z22LTpKMSW`R3~>4vx=D2w)DZGgyNJ{bn_JT{;bS;c-s3j^COx@e|?RkN$NVGYBdP9 z;`%LG%_$)DBJGLjC0avcZq!*MdWqSK`9fM<9pDw3r4&kIL8gG`1Cm^Y*DT_b$;y;TT z1~oQ=qINu8==KJOJ@IYh`m5%6NxIhY_P)3elA796elxwu=ECRl_6P=)z&?>Gm~8I& zYbO5%E4@zcc%Wq2pMxAm3NxQ*wH8#DfjDeFTD~U6>IMTD3iqR8Lmy$m_(z#oG>@El$$5yU6TzrPw^9sj zRTbLhCcT9<%q@A)WWT%|6DZ^Q!g6p+g;+PlA(E>OHl*d+LzvJm%%#RwRiWLOi|ZGx zk}i2FxpU*;L#rI0Y59|4J#5&m<&g)zK1Ba~}tWbAa(yuC^?{Dha;f_De};6(_-z)k|ESI^Zng~)2?$uspn zeYV~Ylm>dAo=!d**b=NqXN{~X@aZkhkSf;dEI=JP4`nED zW&wuC=4S7j8UGgOAUddAU3C%WydcCVoK**c(0oR^&;X-3gXmeu|GI`14nS}?c3kX! zr`Sj8ftUZ6pbve}Zcs-=oIFWB3!qayN9x7pE}cUaeA{>~lCe|*b9ql^8L+vcJI9C{ zIRa-Ga+o!6o-wPB|13iep?%IU;sC|xECc@DhXE?s3rE=Lr3zO851L!jLt>FIzMzsWd5Cl z9L7dvd3ZoH0GZ6r*TZk@&_OnE^vrBx4}irS-80I02QJ@f^f1hM8?w*LMkVG!Klg2O z`DU$`_6B*^uhR=!SIHPtZ?wY}r7AeM;VP-B(9`;+Snb;xILzWpu#M*&kO5v1^RnQ= zetYn|oRi%1!tK8DiiFpG+kr0-<*uGzwXRi3SkYs*vIcBKJf9qtF}QHFBn&_%j;?fx z^%?FP=q!B!5%LcC646Y1(5bf zc5}GhrY_w5SmmZHI}@Z5?D`nlDW}3%!$Cm;sUT~(^Oh}zNy#ZAvao9TLgovI4V}}~ zjq*L-9r-B$8Kd7-Fb#ILTswJwXO70{PXSch}UmrU!m&u5e z)T~Xew-U&{RftF}8hg}-u*c7NK5_82cKbQ~Ew*#Ine;qK5_7yL8(45Fef`>_zO6&u zj1QbR#Bt!3l+>Ne z2-tEi(KQG5z&NS$FXwJGj^gw=rtU0;Ae+6?7}ysU=X$R=7Aa=VaWFgO@ss}`fgBtN z%QN3Ej|UK$bDYU;an!#NNMjwOLie^^IgCW&xQ}DH#dD7CV7aW@RAjnsmk~QmG_z8( zY=gsOv-{wjBRKX8XFBbaE`YabNjTgo;kLeza=1&%0N|!mQe_ju9o(lOh)he~QDXug zLjh8c!UXchTmhmnPax-DcH{fIw<^J1qq5NtenK|xz zyhr};d$i$N@fsne_65s4QJG(o6$U+#LAzdD^;FgemsX(0j4|E6@?G9XNfo{S8m+h> zy#{J2Cq_H`luDejNq%9_uQ3XL1>5O8OYdgdZRAnBX_t&Tp4WPhx#eBEe5l6qy;Moz$7M0NF!n`JmTC1+us;zJE>;BvT_E@er;ff1VHkwJAJC8F z9olgBpi_ilNGA#(!e)#vzjmE7U%BXROe5s|Nnj_OH5 z(v1)65pFC9#@#sMt~di}SB~0pP~JtU@6`qTz&qBQ7m=?e##ABh>PElLI@U=^Cm_Sn9*8^?yi-kw&0Z0#-wWf-opW_=aqT{o+K?e9ryxNg+< z3Lp)`HQKDt5R;c5cdNq16C`AoPj23Cl?zasU(F~rWSN#3(10|1a-enU&rO?#N@eP0 zm2(#~T!ukna2;uZYuC4K7f#AT5#l~I^SAtCjvAXhc^Ch=$*PQVS|8|tvT0!QnOrIW$av2Xo1ks_W#nn+gl@5*B6iAh&Cn7pQkTPEZUKX73ljCEl?xFZd4EbFrNI%rAWVv#qkaVw2TIoV;*@9Ivn zPPW_iO`F~hNt3AlUVZ*Se)=JSs-HZhrmTp%+Bi$SE}T)XfAQ{RQo)#V8yK5Ncd4SP6C`V$MHw6&bZ*-5Kq|%u>LA+ZQ^;?5 zMs;7)YLOtP4@H*{$08m9$ySq`QwTKRd3>fL?Ut|qJYG=xagGK zhcg{lS%qjo;l$VQWWJCikmMDw*P(q#yrHiA)T0-n3v3eZ!Z+~FaG`Dv;{0KQT?KE4 zF~?hs-nkUwEMKfPt}Zb38PGLH`nmOBC}SBp{PUM$L<$%wI6AmQcp#|fT}pTrIaX0m zc=e=+F?D4Gah$$;!m;sq$fuznGOl-(_}Yz(b3u%TJ z)U%1vz=n#rYmZpYj_w?kcoQ49xm<~I3-7QRq>O@Uf*sL~zl6`a zkSc3thoA-`8dc{yrXR^RZh(7?5i!Fn9{zum5f13WjF1-UqKJqY8r)#>cg!L`S_CcV zXxp%OT{E!p$%=~R;g^13XBzK3_}rK2ZRad*eDp0@t3&w73mx=Z(jL~Gu(A71d8KpqWL+5oFxejwHd>#*G{z zUymwy8mMOi%EX2eZ*qzQXoh`z(|k_*7@=k!(19cvUuf%yTQ}pSzhw*0OQE5x2*p>X z6T>ukPCO=_hsLHN=w9i*)vD&d?rcDmrx)gF{2*qg0gSl#eelP{2lvU-Yf@5U^NsTZ zA~ZH1H4)O1ye^cz6&MV^=13#H8$rPAg?tm1hj z7Oj^&95m!;wIkkxkT*AKzgU^t)kC_XA})2|_zca|51teKq5lH(A%6t@;3JSwUZpv* zpMX9idL#1z@PigD8EAv#*ph5CAYX88MEOl2$o_b8};^f zF}1pIjo@{=<)jpuT0LpmGaR8wu?d-I2kU`ly|V+!FfcOUHHZ<(;&g}t)%uJBiLC^o zu_``%N=!7;-{%_OQLvqI+-!5Ajwa!@+H6JCC&Bj0A+xQisv42k@Jm^&vno|nU^KN_ zYqlXSQ~R>aYm!#~z~*bk9^B?;u=)N7r3%z^=iH%@^puu?RQMGrTEoN?%jY=eQuWy5k76r3*GdR_V!4$>oiuik7MJ(&f{3sJdceByUt@(cpy`)CQh%nRHYFghkF5&U|ZeNl)&xm zE}OVFLG9>!Tl%1-x9sBAyv9mvtyVrEpQ-?;3}ZG+4(vqIj4yl-IW|^WiM8^%_*?-X zoF-gU8Fj2RkhDDbO>ml;wS!u&^*GUEN71n1m^rsBkO&A`P;)16RL|Mef(X| ziRkskWse_r(*6FkJ*1hEndnR3cy|k;J-^V$+u;8$90#nIW(ux~MY57bb=o(4I@=LG zVc&DZ0%~R_H@a|I@&$bGCWXnss3~kf)aink_2ldK=&My5#}wnZ4J^g!(3vzHZHR%( zMKonLZbOR@{q0Vo#79azct}(=SI}-EO78p5>{Yo*0A4|^mAYs+N2X)e{jQe8Xnf(C zMQA3sRdr!~BTA>8VbKzG zi%=Mv3%ErR=WQdKPN%+G4tBLA_AZMXw@l*lZRF8a-Km%eC|_lH+Ke4114`$ZbCMm^ znIyaJPM1XRHhMOr$k`-o%u%as@GZs66E+DSw9Mx`x3BN;-X!qcyh-!cNNnlqrKF=A z^^Qd5pOW&Ultz&I7;qprf*_3c*?GRT8Nr42FSw1=8;~|&M{OuNjoxf3J9u$x0YuWz z4@tiCC?bMCj*PsAWFfPB#+L}sphKe4Rf7-_bRhaqQA%@gteH=hwPyF!{Xu(qY?l(2((BJTd?GooWxIDODD zJfF8xEeg8vL+4r7U>i+|%dB(gJ_CeWc4;+WcipX9&*plYh8+X9wZR2S{Y6p#r%v{obHWIwmMXhfaR(5f0+rF^>sIrPYn zM1l`B^h?XLAe{WpH$iZ>^#j=kL~dey3SvR~9gL!BtCYeZ?^Af_bWDtUCM@Wa+trRZ z;qybGa@Q#8IcR)t_9|4e4ax$6Swp`*){35ns&x@mVl)`wA_c7o96b}cU)a}{c)80o z*RtoqEV^%396nqp>$$&J+0u~s&fT4gYqgan3C50Hh20E6B$`6-1;mkEW9lekX+MMX z8RAK_y|?l<>GmDEcHt(3VBspHi-f`6xvvk2W;al}pT}ErVI~A#;cBUOn6*4FW$PXe zyR2DhLfnQOMyxz{>z0b$Ua|Q0VtXrMF>-5_4yUn7y-8PT9k^YW4d8%@yVTg#lDP5R z2AWyVtZnA6H@4BC#paPhjUS4t%5L<74sJb;=uMKD%aARS$vPJIBI+J#cjF*+F~{!y ziEDt0d{gTU-PV?*nHtxpi$ZqyR@|_?6wr+2f%{)A)~v`e>sTH3_9eMy?FEBoJ*&)g zG}i7R>&KyzUmvuj95$BgLspqXN7r8B4;amS`v$RBdR@8=sGV#Wd!&^cQZV>?wJa8K zRX?rttP=!nv6OuAb9k?q`uN*ch(lejsEaHyL4?;)QaQ+-06Gv@0(73$I5kKyI8yQh zDAVW$M~yD}N|Ahe|0l8=d=V*a?)G&M9V9bA|EB9Mi6zqU4Z{ebT|G$dVGt!G^Tapz z!Ag}e9h;sO06Q)|CU;JXk+mtew?}bK*a? zcg|G3yX(%mYFZLa+go{0TJ}S$C9$0}t%jzlUTORxi1-M?YDWlR*36p)qp1r+Je3g1 zJJo1JIuryEiPesf#H?&YhhS~{PpSD=`em&ZQC4yFMo#q>6JPIPCvuDUTv{|R-M<_m zzhJh4*Q!Vfq0}PdGRqyWSyMPfGW^zB!Iu-cb3CRW$$K5HG}_60sU4x2O^eb@0}*E4 zWq8`zLXA3%Pin*SptV?S3sBTAb=+?+SKIr<)T6avZ3}I58?hZx7%!n>47vv2XiD4% z9SZ1C!=AtN5VokrD#2YmGlTFhW$g_9J$LGby#J;O9XK>j{Y(Yf!9~QVMqG%+_Ljt4!!3GPhuk+S zC=R}DW8v<~OQO##oS3a;d|y8jskx|kr7qFu=_lyFq&Wb41cehIGX~dErJ*%^cT3`r zMOvFhy}PuQWVVX_rA>`SG+l?68Rusj2Y!%NBjRP9AwGpimL3!uY$$#ktLvtwyV+eg zRJ)BOBQ_#OD^DL?Xy>FqrUkD3l!(tA9wQR9^7K(dI9*6YnI?;SjtVW7LUPg%q9(#7 zF*UGZ67G3~=bpH3S{)2*SVmVfVq#)3blYk$vMCUJ5hL`6%>)U#j#OQ!#1+){&SL!`$|9eDDsn+x&Z2%e*N{Y)mUTa0#7 z;x_5J(GV|>z&DDsN2&SCAequQMNm*nU_EkB#lf9On5hxQ^-w=64ipp<<84Yy-BS|M zmYs++Yl^h96Nxlyh~(I-JXS`Tp9L`C=?&kMWchG`h@>ow$HqO*#2xt$>O>;x$-V#_ zJk1mC!DVwJ>S1qwKwW5Jx#*I@Sxnp75o0x(gdG-`Ca+(EAqrssfK(+l3{yJZtFpk3|kY@ z%MnV}SS?di>_vRoK9;1j5%C)}*3Q(_aS6gA1rZZGYsLlg*S^ z^qw^CIT{(T)Fiy@2qP-nr{RuZ&xwSH>~2ZSrtQ;kJA~8foRaB6h(FMoHQ!CM9dVmA zUJs?!nMNINXA8gUuGiGb^Sa}GZQ-kd%bfgJX+9jFXQ`xd^6=n%DI$k)8y?=5bxPAn^@|;CxuAt5O~&a3VZ~Km4fnBk9Y}`ZUKvP3a#jaj#<>Ckf##w~mYbs~XuA!L|q;qQC6QabdUYI?C>mC-!YGNZa6D^qn{K$5Z?XgOsA zxy76NGmad2J~omc8dv>K(*-3dEGBpfY-<`*Lw7+cFrGUiN$|aJ#M<@@ z+e!c0tuwpY5_4T=dem}9nr%RBn`czm4_oZFx>BimTZU~OQ{78}Q6bFSI>MkA^pg@~ zEDPI-`~W6oL1DttZ5&eSYDwhBA$h8nVB#Ab7`VB&wQ;O+t^4F%gJv`ndxN{b7s)d* zceyqIR=XJAqUysPs`C_X93W0xDW<`}yU~VtPVMR2HE46-7w;)-Dh_zG+-9u<`Ih#? zdDc9fd+umVAC8m4EZH7Hea~Wlecf2>59mpfT{qVC0DOJdBED_T>Gw3>H8J@cn(v&G zjWy6Y_nH2@-&h4b;s8Aj*FpENaWIH)vb!v=QP0@oun3Dm^N6seIdL2`4hs>tjq(t6 zrG0GZrYUNi4?B(zTY8Wf!}c+vTM&Cja!cMSmH9mn!tCsG;t~Y3`W3LZN^6sfOI~vh z7SXphHo++NF;N}+XcLYqk%zr7{KaR?xd^FtFiXg`83S_+2@d1Z z%pwQ5z~!t(!f9i!HCmAn({PG8dtYnNxUbi%7})ytllQz2`h7bi z5AGaOS2IziXXJWnok{eJxTkvQ?K;=uNcR4}zW?dR4q00vi-+|lVVl8=ErIFSfUY~F zZLOe#{;>1@%&($@esitvSV>zc3?{3-zr`;*=ubMcA9i;oi6&i{5T=rXbMby!yp&_2dm&^a zBKz$(-y|QCSL^B6a4xk&L@1quzo1|mXanpxNK<9)WckE{D)vszNAvb<5KPNW^V z`FR$qG@_BtSqlGBl3WXcY(PUYB9al4q7~^Y(aoxYsO?+dQB-sOvx^4jrZ4lVI9&fqHeAf zk(BF5|i5S_w|iEu&u%HB>SmyKo79t_=G7ZLaHXl8q3gt%Nc zUe~9zEVCt7Xbj@Y2b}%$96BWU{Gj+EuIY{G;0T5B=CZFh>x9fF15Oa?dLGkLzqJQ7 z8SF&gc6V5hlnPg1mnafWaB(OW3&5JhS-7={+}AstDuz>E%8 z28)*+piNn?PG00s>ta(iY|~*g)3Du;*f+8bU8^qZ*u@AmSdAO3!bZeq9J1j%{B9Oq zmiDl9-`z5)ht2!$Em0b+HFIcPuZ`7lXq>L$I`|!Jt*Dc5n^6U31KZU(0tv%8v=?#b zI2>%asIGu6z)1IKUtQ;z7Iv5xoyxoA(&g{qek7T!fKAvjSD7mBk}Vj!_-q=s0q4)` zX-X2z+qw~#jET5&S-I5{1v8_~r zuoY@Uf%2;u7w(OPCX_NG}8c(zHQtm|ZY|9<_s8)Nq;nG=5WLmCk$;WG6 z^f<5CuG3Th2g?#p&N5C*u59yS$(3!NPkDQ?$?H|fayP3rB;q{EhjSAyuAyb^UX@0M zzM0T~d@l`}W5p$Np>hZ90@v5r5H(DQ)_qz@!pal(TvX!jWXVI<#RPLmLXwVQXDnJ* z#R(R_nvaeYQ=s;5iK*W+njZ;)F!qoOd1xv#h*ZmewRsu9G`Dke}?Ajs^;6`^WFahhAI?y8~00jvC&u@`wY zJ|4kA7m^FPu{ObaeOsIfS)GfjB$X~@SwogJnPoYQueRX{rD-;WN+Mt8KHRvoL9WbC z7{u+pQe|GF%w1liHG^ai(HUEL6swDiXZ6gyJIjrz)bf1O3aPVPcj49?66#hUDV*0w zVecqKc=gcR<`7XAsj_dvPUlDYIGc_heg8yNLLIHJa(d_N%2I@t(>HBpk+nzPKT)WO zB2qSgKhNn@h6)*3dj}}TpG;iZAn~g0{2yD6FsoewP>QCrEVfoV7bvfxOkCU0!44d~ zEK+_5MX!tEM-?VKy(K&$8mO{&A&W2;N_3SY(>OKQ;^@h$JXEzW!(1pqR*seK#;~Hi zkanbLZt3{3?FDz#y|OIf6s*Qch)k-WCJJu##u8{T6<*jMMnK~pys$TdK*J^om!6vc z)Iz|?I-2SufG#{v1?MWT?;7?b>I$pid##51a_^syqZ9L{??!tAI`)3H2uL$Phv8 z+rE@xM4uJopg!N%B?PHRS_NA_5!er2I}X@iLw7Kjz{sHwdSekS=cZcw!V>jVU#|8u zT#1HzhqK`dY~0lzhbxd;B3?`9pX{KY%5{!C*+DNM>zsDdS9O;O6Nhv9b5I3-XRR+q zp3%o^33|{ss+}5wp3z*YrFLtrsv4&gL82zvMUP4l_$z$HLLScb%MO$ZM$9KO;-y8aZ2@_r{pWqPo5N-e!aGC ze^rqXzdxswgn9XW_C2|c2=A#$u5HUlV4vz)OJWuwG{|dzrK6989n1aYqsvj|r)y^r4CLAp7sV&i8 z97?%6C)MC+j%an{kxkluwG**gziNCuoQ;n=JuIttyTkE;VuXv^8I7h4IW6Pvc70e# zJ3+z0Tjzo7NJeFCeWD6PY*va2uATMi=p^eBbTj~&CD=Zt{&Hrjs7HTahxw*M1;~k2 z@?(88NNC5;r&SK`jFxO5FNG)F1`5hKFV3y}F$jbuNK0K@s@rApwo|&iVxIIQRJ?n8 z=y-m5nvtSQy1mE~-Qzhpe_b$(mQNXfL|H<2>EtmAl9Eii&d5XJO~EEgZi^#qq7Bb$ zw4x=xv6YJuh`PLE6ODM@k`I?)lzLV1%Bsqyu6R{lWw){xE84nU(YIr(mtoazSVW#a zhE>01k;Ji@Ve9F=xb_@ek&Wt6?t={{x2pe^q39hLJF9DJdN6iYR@d8wJ+NeTuHJ`z zRZ=Fc6MJgZ9CwzSAjHv@p3el>)7*C2ZV*czvwb(HmHk!vy)L&O1Avh7`#f&@u4gNk z(H1v}(ACj&tv#%?a?`BE42fmX+&pr3enLtKUiX{ao5+1%S;6bC4U0S*O;yUubwN|mJ60R)bvQlijbvT44`2ULR8>*@2C70KvVzXCJx7MEI6C7b$16WLc z8H02tt~1%8bARF%w0wfYH$uPF@IfRAXJwn(1DP0Y{M544jM%6Pu4x4|?ujJptkm`e z;!S4KQkWm)Qyeg=Rg#@5#l55T^=?fa0(IL0>Yop7M6f72;aUq+bMa-TN#df@`aZb^ z)E2pcaWNZa6FS;Fnh1?VJwqD2?r58hwtXfjYM4!qV|-1*p*s(8;1Ynea34(zSG7xD zsCh|eCQ4qA#d}^%B-#$pzB?yj1!m>`f9Y!&LMIMdh@5N4xka|W4q zsW9@gCp|S$zcy0TyPllQox7#A*()nto7dN~+45pi3NoCRveUKh&dW7bDXw0WmG<<% z)EHoMh4xPMM0cLnO{GioMDUx@BtN7Z^lEvJxSyV$A~U|~B*1ZGPy5|D`=#rl9`<|Y zZ>uXsW#Z(1U73OwqOrF+S6o*)3rv$6EuaAL2 z4GvapV_=PF*$M!iH7fw91u3Ra_a0UX2a}g0We32u4-)NAt(uQ7NyvtB{@2A?HrqO? zOkS?3u>L42v0SQwrUsamMKM3f5Pk&VA1JIeg36S91@@7`{_`PHt0LK|-nP(`0_&qd zt|^cd&Zgu&tsPl^n5iIs=#P}AmVhS`X#XMJ;nA!WAh4-g@X8;+-SH$t^oL-K2!ddP z^caK<{(|$qvjJme@vPZKah$)bGI7&urnIK0jTY}m79sQkVjI?p;0v2+&1H&%|5Qlu zI4C5{1gDF9$_vGXl*&YNam;5UewtU6uxc)K$Yg#ooAUP*uokt`qWuEks42p{AYduB zr_`-NfVZaL^=(Eqyt~LK^=$S&%f%%Wgrtb<04%?I{OXZ3e9%pQU^I{OqvLu;MR$?c zKMI@LAKgKAX=H1_q9DW%KVfIRY6{zONT7rS&KpV_$|T{(5G^QAhsQHa&n9lctj7kSytUeW8+(ZUj`gh9H`Nm;ujt4&R(VDb}E z>cRMO4y&HN=aOPhO;Hjxzbs_xF9@1H)E7|KLS_xR4wEQ)g}P9HCl#Rr-`eX1cyz`7 zf{*jVE82-$2V4&`i0fCat70+k9qNy`@)ecD7AClk-^$CUvh-N(qAI{o3Au6%A~G5A z(b4E>a|RcUC6mFQffIEtxFA^>aTWTB-8ETR>;7BJ!p<&rpK7~LWl^1sbk)>%e@%5l z9i^yTt2=?M@vWn+wfm|cNLJdFb_=0n#v}nanL{bj+BEXcg5@4%U;8*!E`=8kzGWr@@IgdmV-rB5fAlfHf@1QK*3>U>Ll3>1O;uO z(DzU|6`D-L9w=| zLHv}ozO}YnePX*FEr(!)j01^{I|^AT zh3N1+d!I=G39@QAf-{sYE`%4?CP@HvXOcMJ0W2MS>GYj+(#vMPQ%s6%I=zxuv{Y!~FyRL?6JlO#H1y1CDl_T5 zG&OV`E(p6yebTyCX??z8z|)n{U$Hjo08J%bM=zo%kE$+B+xEHY12H7?L$NO8eF3t~ zL9_5W83@flAE)`DWWLpv0}b#x)-$f}l%T@~bn7z#4t2nF*ysEB-Uqh!BbTtF9@vd@ zI_2oEpm9iFfjl_AZf)_Zmgsq@*7%NQfz#{M4?$G0rdF4(H|xr`l+1cZ))8ft;-+9p zyJjRJ^J-B&?g%S7(4+i47t#7o7u8i0sTNh(Eq&p~7AEX$T{|engD#F#nj-z7v^?ZS zoI+J9r`is)PO^_Ytt*{*Q5%uak1s_S(p9WgsYJ{kzMUi=dBRuuYzrRhTwEC0xX6C$ zhVOd~fB6}}s3Bg>Wv&sZ`???QCvW`1HY`VyI_u!P5@&VE`K7#?RoPe(`+|?>N3;BQ zB8svQ<+v0iGB4+dTReG1;cQC`3@71Ut~TG7tL>{-OI_vHD^^&j<+)1K$JP$cD{;J- zymeX?uIUx3QldgZo$q&Qq`4$px9A1^BV>y=WQQG4Ej5?`Dv1jhLj{Vj?giZ7&anp=a$k&xg zjzI+ZSCOPeod0sI7@zbSjOO)d@{OE+R!v()F;fB8NaNAo29V5 zi53Nx9E2}l!HB>c4fIyKiD&)P8Hg&x3{;h9oSMFapYkee2V^?oSLBQ(2c+e-NV(^Q z7&X~1cEi?vA;8ohw$20U%mcD+wqig@!1evD9iPbiC?Pt7z~A37%-ii+N&DMq$jxgR zS%N=IBkQ&r{x)JpH9z6A-Ey~9m%T1th?)$uDSkNRdigX>UFYV8fZkTa!zsTD(Cgx_ z1_as1roSt0QV5E?qXeN)U-GD-(o@gEuUWIw5SE_?;kv znz*ha!Kvqi`FzT=S%Ron2L;bglE`J_tmH}Lu`xmjC6UjFYe}L2zI;_aJLgFh3BSH1 z3Uvp+1i`H){NViPh!;r|Gj&M>f=Op+El7lDlxURiGQqXu8OM!L8M8*Kx7JejWB{SH_{@aMV!y_ zGZgY8rX+2|TOc+(L2QKgS&<-AGQuV$h&X(44DS&{`GpoBK}6jvc!ehjdP%oHCWxCS z?jJ&2I@BBZx9sopD#cyRud>DPH4VfT$Efpi`0}M`vg3fS`hLB&we|8PGp>!qj+t?5 zB#y<5p^-Q?GfX3K9A>;T631o6FGk{c%-Av#$7jaY7JdZG*ftU;WCk-5Ct}6}BXKQe zJTwy5Va9{hNL-g05ApPvk>cqyV;#=`f8$4p7x)n|BSp!W85>68S#01EsNl zVedde9D4f9qi4(_JmHEN(2tP0l*5i#Kv^7{*-rG!FD84T&A4~(Z1&`Q>kU6TpJv5( zwJqc6G&?GvW##T{l8<=_0Kw{vPv+I5>GT)&&UIF2dOOQ;>&7qaUEqB%*FLYPQYTuS zb-&8TCs$|@A6Mx+gcP8EkuCoP;$Q4A$M%?G2h8#CFJhtPv(UC!=-4cD0~UG~3-KQR ze2e}?5&n5BiUJlzA&X**MX}3b%aQ*)7Fz*}tw{W{Efza5i{bl0j@;xK3sPo-;Mp!* z_*^*gxIusXb z!7Y_CiJBym3Fxka&EIjXNF}z#9LKSk`!?_dUD=YJP}( zA^i%F#LNjS3yFgyVh#q%32YmQi^M|`APJd+adQG6nSD^i?!s0uKG0|NQQS3ZK_wrDYhsX_>%B~M| zecW;5kXa05gM#H@2e;1}BTE2xv0xgh|A2;?pk zUnKw)y7Vh#ZivX3n0hYgkc+7&6LgbI03O(f=&%so9wH!9h;T?@*d(YNksCs^jgrXn zkc7;Q&~=o6;<}i6E~cIvqcJhcV!n8|fX#y#;DJ?>Nr-omjf8&TUF_CLh$Ld3V+Ba? z%XXRPI6m_nfD(z1uPEWfzD!)pt`m=W7*NmkBIX6aC5Rj(J`%i(JtRS$M9jlF_d=8n zJxT&3G4n#-VIG#Q2kPyGz&VWZ4#gtNsuKr^j|3ka{ONei!^Y)Bz#sw!5ir1N^y1iI zJ`NB1SVD9^5#1u-WBc9r4qkR@F571#3~70BzOl_OC~{`L@ELEg$+CMVxL7If02(K@@*SQ z$RgjtFEmgjXptXz%(k5XsS9q$#;me!7dlPbg;LG-Vu#Wgyqe`u8c-S{1s`VnKK=IN zCJlTojflk~Mi1PdN*5 zxRleSH}Jc#BdVQJ2eS~V&uqsfzMr^G$A$Nk<9hVQ^C*pwf<<*aI21V^4CusBAw?;l z-us?KsY@xnk0_Pkf3^yoc?C=v9~cJO=M<$C%)r1x^A4+XBG_&2qq{dyeCV zNIkswi5z2Ld&H4>gbC7^NHX#SM7PoNo&(0%a{{8(*rq%OEU@Qfiy|D%DkB~YRQGa9ysql#7@Lbx1Tm)G0T*tR4^(l>; zG{mMM_78NA=ejPvL9<*JXu57pdkVq#Lc30Vs+T&z#RNwhP>NDM?M`4hJvSgs0)n7Y zdL!~+`;#f{MlPlyQlC=b84_+P^_tYBuO5~1=#5WlKsf{Y9TMb--b4g5wkUNe1tzq0 zxe>vP2xr>IT$(1H1$;dCd;31ft?z>`^L^~fzVCSSCbn5XI0PQ#;J^b17h?58S}t#Azy;gbUa9g z;42)oe1%|)KVAQGMP!FLK7?BzRr;tLTcVPfW0iEoW?Y0lEUz>p}?DRSeKBpocz2*#J;3 zZsdj_<$8c8)DF-jh(stLLgspa?BQY+O%;L8@eqFc4=5!7PbSC$OnqP~6OXw*`U-@? zg%l^%82Bob7tkLBh+-U&>fj%t#=uvgwo-Y4b?!oNcOgK#5oUXzLIca$jSwmslC>Kl z^duInO8hzrWrCHwqyoXb!pd{8^4u6f;9~GtI3?@hoPbP7K@upn2&Ut|k7~mYk;Gq3 z$q^|f2cQTgM`-seIV=ZBt?qyVVoBYBcVI7pSpbG70Nn{dasmv|vNB|q3dD7Y=|qA* zeS8h?REq#|VA)8Z5dohp6eN+W6ePZd#9;v@b^r+~0M{O1bb<(wb@hoOlqLbXJ_KnG z!PJIOPlOhjMKn+P=e_2(DV|hq?7C{h< zu;wDLbt3tIBE^E@!*-B_DuJd01OKn9X8C;8O8BR#RzSpTVNd&zn#J`$TFqip>iqMn zTv}=tQmxSYz_FK9E~I85IG?X_0mzOz1^bUfTaiO50#eVrpd!7hl|ZOg;zqSXFx#pX zQmXhtqgshH)k^3!suiIm!LH;61hY@I;?}B_)#{O0Q;!5+Mm=I%l#-GJ>M0NO&+|a` zzN*^fAF3+BwjTI6F&Ox8hYoxTc>0hAkdh(=+nY}t?n>1PwZaGC?W$Q^E&U=YmjWu6 zz-O_=Vytq9{aMZmU?1`Ck2@_OxJ(?(Y3Orgz*h*7GHF~ItUCD|=LYvq z=LY9fog07#*n1ah%YTfULsV-8ycKf)e_R#*$y^m;=3^Q7@NE1`KP%mM4#uXfF&JbR)lCm=t9*shZc=Xj1LO0T_(^P){Mn8ybbcr8m$B27!xu1DAGn2!sI!3@McN0eD`d^j^3tQd#T>NL@;W zmfiw$K)*ptg8+6Yq@=#5{FrY+5W%DnLu8- zKO$%m;TBO_U~mhFeF=zH2`G4JKuigYAVHnd8jNuI25CqsY$RmeiC|U^BJ3kU1eXq^ z9#Ws)fX$1r4|Vjc-%xQc5;8!d9k)iA-b46C)4!jnE1S z|Bx(k(7S|INYFxp7E;eZe-c`ePZ9*Z2lbGtEev=hTG%*_6~efK6#Z{IXoc-SE2&b5 z6gFshXk!kml!OGET0|Pd&;}nis-QBx%^t z$b>ct9CjR0**I3IL-t6O0yoDdX^3V5>Gwj1M!!zoCWS#$rb32-t|WB8FV$)2G%5O% z_}I_^&974u!f1Sn{|p^aB&774;DnS%q>)W2$!gRtC&v77XwDPw7dkLMhc0&2&;?zp zQ=de-fWD#?E<`7!^d57A6iO;3tjMP$bg{QKDe}`ux!7An*T)!stS zp%(>|Mx>PveHIe!4TJD@MBWj#ZF8)p=gU8Xbq71EOsGD#$-;4T?7(}T`RO%OsbvOg)|+z&;Z09)WtFJ zU3D7AEcS4AI3~Re(vZ@)PC*%L%YvN%5BLsRHW}zZM(8hWP_}J>)1XI84`}=G2*pFZ zj73h8>?|lm@Q5Sr5j*1HTH@jA4^Mpa33N>MR@)^vO7fMl;VWs0M?en}=*T<8wq0xy z^q`k;NVDx&{1r!(C5}k;i{n5(0`Z`nF@bI#u6T%?p~w=6Z`80Dj08RW)&tU<1(t#y zK0Tn*cPxw?Jv{LcIV15GNp+S5Jn^8H;NqSHgA(C2ws38JTMN9Ym-#$+SKKw6K)>9$VrL< zha@o&c85f5n-KKit7^j%ft()9O7!r=BNPwH0`n3*L>5OBAk2K5kf&Q>Z5S?W@rauT z@x=59#Y4O#l|kUe;w5!5#EaI$Z9S-f7&y|r(Sv~bG*Oy|t3O<;_3&Gdu=R-bhbMq} z0*WUJc%oV_(jUIvdbq8J-+F|tN31^rQ5@zvJiOLJ6bMBdLXjmDwMXJ*BEExy!pq{1u+^|0G`V zjWrh5M3MZ*Q~pDq@?`eKSpGRa^Y*`;&%E=I_GRZ&{NsD9&s|S>>re2McR%bY?=#nR zq80Y))n4&V?G^9d=@lP-eXn?QJGS)C^pF3r{rhguc1)W8c((uPp6zHL_@%F99gmfD z{OkI-Lw%?FxO;c`xVzRD@o|qn&&M76N)UOZizQ{NQ~SL~pXc{}w*`L5D_&XK|Kkh) z8NTp;s(t=n)YJWoc(-fz`9ISp{}G<+ALFh5$#!_*y6!to+T+IVf3zFB{fFJyg}uFH zSN}wp_CLps{R8&!|G2jc_jcORzP@|A{ZDISheAN5tL*K>Ldf((w)fz3ZSM~K2G0Mn z!~c`m;mO8sk-gm_YdqP*KVXw58#@$ANaH5`1Y3RZRc-ay`+|sA%_s)u9lJff0k$0* zzI&GqpKR&Mh9BQ)!$(SE7lT`z_*O)=eZg+W-pAVWV`9oFr(?xm#-2}QUBb#0R(Fdm@Rs`}?fgFFr=G$7 zj+9D;1Tze~_J0w&Or+8m01$lglJKd2e8S2ne58+n@C$J1Hv|)lbk}Vkfv#VGg;9pH zvD^3v#Ppl&{|IH>_zSp=zW_v_w!Z+`^BuC}OWy(EH9+=!sI)u21Hi<_t{Rdp0Nw<4 zzfS@AAV{AA`*VB>gg1drDV2o<+o8GY(EN13ll1x*_~cXIdrSTWUgKFnUmbccQ}QNo zNl5$@KLX)Fpm`IJKSD@yrtVV^k;g%V8AYnl(1C^GgT4kf`4QMrlRD&aKo$^-yaPa! zA!U7z)aM5C=h%oC2K#0fP5B0r|X;Gij<^hjJpe(7P>yw`{jHV z9Hg%Mu|5j{y@BsQ+kYXT-=W*}Ww6PA!44X~hREsqHNZ~fT6Xw{d>r7>fD;1naq#c* zaR62x=4VU?Q2y=x9b8xv=t0r+e5yV2$(bP%EsDsX4-=#<9=>?Q^zg~w0jnDi;R|7h z@-NEbkW3!q*p6+-Zs3TA_aASIe+h333o@?lkh`4i*h2SVyHu_1QAgSymW5+`WRb5Q zm_5w{nhnPmz6rMQO%UeRyZt#Lvepx!ribwEAjOFzoG$3}B0Yru#uk1cw#ex?%U&TC zjhK3Ld_;ujhw>32#|qaWw~kdFBZ2NQB2+-iV?-#2zL3WV)kngv?mr?NM*{Iz=>Erl z<>M;-=6`?w2LJ8+T>j;MhE=(VJFLgmCNGM4 zaZ{C>`O$1%aPu2hQtshS^7A)0KmW!2%LfZ&DDXeSouuUaW}44V%y07M{-3L7L(U5G zIzJrp2gN(<7gJoUvTkord9{|O7AwZsk0**Fs{sme(`aIi;I4H$&6fG2GQJHv|nXKr9+&L zs}&$;HONYUoR6zsn0phPk;dZUh?U8yhS$uW`xLn(Zc?Txpux)?kotY;21hR#I#&&dcLrX|giSx9OIu zZFQGa_Rx01!QlDfFf#{(VJoXC^4{L6$ya~GjM)2*8RPls;=JN7^BJe9Tk5TS@)}c@ zVK&wGccK6G=4FlyuMbh~(QH!p{>}%!4+XU3+n2-lS3_F zzi(eE{Lr1l;(>K@Q#?%7FrYiKogytBSUXmteb`YyHtnQHUT+;{`E>Z}x7lQEn$P%} zxOi%74OJ&=_pXauMju26$)fn6z}&8h3~Q&^0=Kb^=S9KC)y~?z>vBC!aRt+wwUaM~ zob7!#EKM^peqB@t|qp&g(64@!4?vKtM8+2CKn9`8q;Q~pif?9 zi<_Ha{X4}9qVYCq4PMc3_fNmWCxUW{ZQ`Csf64y22D~I^^#V?cP5v(bUirkpJAz)Y@BAu%+AyCPLbqnf_}tuVGHr=oK5Nmj&~-Ti)67mxvhq0UOh79 zx4gRGe5UYf4bpzr+TISIsD+K;-Op+uA0CARee%3L9&+>M=J}zZ)dyGD8Gky?E547r z<6h<`EhQZ)Z6x>e+0m57R7aJXq@!xrsMNJN^)L6f8a_V+T)_Dj)LaKPdeXj|(TfOm zKfJAmqbDf#BtObq+{37KA0q*vb_YHc4Mi`+A^l}r4j|!@#=LySFPES#+P6E_VB$6y z2VfQg%%lCsySp!W)u9~+txaFRy}42NVJLk}gn(fDG%xxo(4>ox>Jb#42n1e_t8BW| zl2epy$W3cgE}E^o*|yc@OwU;UY0IZ0p00d)p?C(C`tHdWvOwS@H47_B`ia`K(=@f} z?OwjjvFn4_ouW9{roUdyC z`3knB*svAjQfQ0|h}Fgh%bV)P>H2!Mt!~lW{y^sutX5tx1klnHOb~>M9yGkryhd}1 zjnvt0Hp9VS{du>5X>OZT3%Wp6b-N0#(+gJ!Djm3#eK1&s9)S?tS+TKk+pb9}dq2LwayE zJU6L8CvVM+V){PIm{FeOi+bKdDmZwShRp<)O+**hn{M$iwM<4$5t~G-mp5(GT(ypA zMjkw?$4(5W*g~!C^1;Eg?Q&zoT%G`>x!&x$>$ci6b8GlH7K_-HJPjZUfDh|k9JbKJ$sC#+xx&rHb& zbQ;XEn(al~OQ37r+|bi8Y0Vc8vb$CW?xV#u!cFg&wEuY$ifsadBpl4QsBPWQ1*}cK{h*D9u2iN(Yr{Cja;cPfcqt&0{NA2 z_n$RnnT^@Gs9?et?0{Xd%XHmlduhoo(sT4+PN-k+rR##-+fARpMCa}f2E#nvRde~4 zCqfi`h$WssDB1$)Zd&vUq`M7OZ|7*Jdfuk$5Md<|UgO)qi(L)|!>e@NGC!KS=Y7;2 zh(1l1&|q&sb@IdEQzD=@H%}!!M*eS8@pi{aT=sjKQ>|yEYTU={!er}wFu169 z=!@-1`a4^sIXg(dWmoANOb+X|O;gvnPJwr83cPEY*O#Om*frJguzZOmukl(%(1(%9 zF0fLbF(a>dkyZTh{1kUbzsY7tyd@3nE^7?-pAFY-hPUfBeYmZLyRVrcl~pf!Hpyp4 zIz%1d_jdxc6u|ErfIk#jKD`6tk>K+bL!<$o#Y*ca@b*7EJ zW;@?mP#`{kNgyRn)`7e_Y9Xei50WGUC4NAnp@k*2#JAP()e$z2JJi4LEw!0T&_c{< zKoe=Vckrj@OHnjR)@`${O=*y!F0tCxbv47;qOHjI5&Nq}eX;)PXjrnE@t6F*P*aYf z65P%jem2_>@4yDFzqf`GQbzhZv&#dmTesCPTeMO8fnT;zySx&pL1U_RJZ#~Uv{ZW@ z+hZ4Ompx@~Qj2|?TI~1K+MaG!T}vb&5aVe=;9SYSBP&dLZaI z`+!Jl_Nc6Qk(VcB1I>lw%qoc8Vus1|g`s8$^gGtg&E7*CWoa!PD)5Gvym-$i&~&IG z57WpU4E7$RvWT9C3cZCqaGKAuiccDB)!?7lq=GgT;*&$&%T4zIr%S}n# zjL~RHoKi^u0h!DqDvYgdqAhJ8y;ciNn1JU!czeLJi*@H4(uPV+GzT1cE-~Md%@Y`O86KEhG|iyi|s{v##x3;FZj)kg)D55E-GlN{>}_?e{fp7 zIUky8NEd*-ZnGDZKCV*3Xz5iKRm%BrK^)nlBCgWB-n~iTOm@b1hD~Wyypigg`;4=N zX(q$no7AR*B7Yyg;5$cKug<4czL=7RsN~~wEXvVL5Z_VB7g>>2^P(JO1s~1k)o6h& zpu!GuwDtY!Y}s@=zu=S6F)uho-X( zj{U(vZ_6hjvuP7LkE@NP{()#CRWIL@8TVdVF42!f$2p{)tlHi z2~GHheG;0?HrZlx6H@|nL@3h0QD5<)37B+@~dr=^z-J7vy;kXvCxpH76Kz$RoiuU27>|h z<_nQUe9qEzN`7fp0rI!?zq{-~}HHhHv>sYHS%BFF2;0eDSz4 z&Ezd#TA-E5b_W<&C3;eAe4L-6Z!hxdcr+E8(&%?y%$K^Gdbiq~ag$w$dGVIB7>K># zwbB0OW_Mr*s)iSWR;7(ee|>#O8QL(eFVeSM_1H+;bO69)`$XZUt;M4+niqm@61{{l z`O|P=GOmO{IrQm*T}wBF$JK3mf+2YfI%f|ClXoxpFKL<@Gh^rP!!wYsN27!MD4$ho z_Kk$?d~{xN49}Bg>)bqJsIYh;O4eTW=#5hb0andqP}XxE|xb2cE+JrlEX*yyQL;M z=4$-pNIj+(>o(riGlB2agyscjb|AOZV+r=V%WPbUsqy+ynS)!^ysxW~AZ0Zc-a&&Q zA-&3H`RV!TovMykm>peCY45?pD*4~>xeMe?upV>Mr=BJM(12){++ImdhjgRHX z_YU<1h8nY+M(&Kuky9l81@=g=Q;V9LLVrC>56tTqyv-&(uCN+*Z&JZj=pye(WKkepaZMVQ^oKvX$50HUpoM`5w2~Vi>l@lu=``$RJYZzl7p|*8jog^{kHy3 zQ_{Dl1Mz8u7{*#-YTnKi`!wRS$!LB!BCkGX7;4Ul0hA_2!2?P=qZcJ|_T1d8!^MZT zItktQ*)pUxP?`>X=>y^033X4iI|?pPe3W)YUwY>F(qF)KLa_-8zVI(wX&9J}WDpO|XkD zHqSUSe*XE=*m%nuslX1*twkohhlUO_EW;E$@~T#RNIv+qs(Lq#x7@s~^#uATu!Si{ zJCLIrDvv0AFn5OS;n~r+@Gmwls-dE{zUz#HHOk8tW3RepsX_f+@PeCWvZC>El&Gb0 zAeV}52kPDbQ@^t0t6%@muj*A(^1aGtIrY24x~NybE95&jRH!9P8|;A77xz&25o_41QTr<)dZwA&o5*A zj9+FGIoBp_IdggNw;|>JrD`&H8` zi;5a_vZ6t6(I9Z9c0g#K0AEB_8w^f}t#v)O29@q(6Wi!(^+{FJiA5!+pkpP?0D514 z02?qA<*yIT4-KkZ*0!7U?f%;>M^ktQ*S}n~B#n-LsF(;hHyRm?%)#Kj1x|xw|3gE6 zz^Dt%lvg6ZQ*3Z_y9tS7(&i|GCb$54uUi|V0m+c;o87}Vt+%|=|>C`TRA^B#;+ zt!_9FKJg>#(xMH-y0opQPoF*=<+Jhhyv*N2Y-Nj0XpKaL#6dL}uHv60b`AOTcNQBP ziB?Wyr&mzNy2`hFr>3dP8xQG{BlgxK4K9vp)pCBXnN~Xo1sw)4hJJ^$w!=obfiV?i z|BR={eCS~~>+woSxR>jf)C_x^84J!&R#uzIYJbwI8w`FLN+MR%tXXS9o$+Qay?|b? znM-F%$*W!YlEne_OLHt5V8saxv z&0Yv=M_uZA#y4mywMdnUt%fIZBDGyrS|a~zt+y^T4^^0T95U;qwo}uG3*B5KJX+4=`GPZXz@YBnzt1Z= z-rX1;< z9#{WJos%#%tqUU#v=EzK^e~-qIZw_o#P1frFd>C%Dx}X=7LmU4M>$Wv&1YG0^}1+| zX0+xCwAI&I#bW7OJHv|&sFT_5z>Pd|T>O1^cwufB@VWuYwq+(mQi4Mx?nKSXzmV2b z$7GI~z;7Yw{TP|a#)ZjZkjGIab-v%`N4v9X|NQVUzigc$!JNiixJnmnH?^dincEP3eTPga<PBWVBpuUU>IU>1J?ndBEmO6nt+k8v0;GH|wQbq` zO43`~ODjIamMV&by=bV~LaVOL^Hq^(xriI}V;+VL=6)a;l;ujirb!AfPl=&x;)5gG z;n|({j(*le2VaWn>qR#=|8BCd}X4jn4dRt~xEKQ4w(!Hg1xC6C2?T(Qf3 z+UDGLhx)o^DwTmpowO3UpoR-!4_>#~vnsvpvS6jQJ(pFxtZW4JB_LRhE}cC`b~w>L zgS{Cv)dX%ZrT?7|P2tSon5@&lXQa3<#}#{4ne3#xxgjw_dL)g=T}_ismiquj0NTS~ zxwm&M@gQynUlA0kYTa-!9$HV*;Z;o`ZkerBb|G12XpwJjh945CF5s>p9+$?(1-d8j z*q$&m_tqZ-di``K>(hhckf6p(JbF!sJO19k;KH66X06x} zY>lu+D+rS7nn^Ak0Q5zstC~Eg$!*s&*i|Glu)jnbR_({yuIBo!HfUHi>nc#|sy=@C z=~&73$=xLA+f9POK-on$91v@XiPNIifxBX0v>h*Kdeo1U{N*v}@{MHqy3S4zj_c7ukz@40vW4VsU7S>AdMjf6+~0yyBE3wnNHw4- z0H9zKV;RSFH=psHz4VL|H4_8C_Rz2~9USaMvlY{(>+dxq_eMcPVChnT|E-*`@GqksdHm#$e@`3={|Be{V?(sAKp>Ds%Vfpu7m7p!`AG5}n$Q`zgMw zQG9C^#djLcI5u0Zr+e7Du`P2Ji0Q53xuPx)~9q&b=tg!O#tIk2*7MnTEF zcKPEk^9`HP2m<`>I2d68t<4F+$31SXIbS3qqn}Oq&87_;MqH<$V$Xt&JL*{ z8mZAzQsZ0RBR00$x~AmF*rB&p=dBGFzKzaH7p*h*tIf^Evu|IVMW76@WC#JYRnB&N zSV-wpQ~UafR?@S~XG`^Y_F(X=GN0-7$qzR-5+nJ;c6?I?jYGFlHym7%V=BUG+}z}~ z;@6M2&Bf;C_L5a<*|xdo?Ucoq(C0KC5nF z8k`njF5hyvn9w1k?<+7*bdJQlHE(+;_g-qZh+SSO64M-_Yn{cfG=E&2#>Mgyo*W)o zX~iFLK<39qb#t?R27gwpsS_-(XB8_eHY(Wp4350dxfb-K8s4kKo+Op#=QH8J`kb5W zIhW(e_Brz51-{Q0Lz5AOB98@6Iiq9dB7#VzyrIkAWJRq5?gWb_&0f(ZeNT&Y!QK>- z{z-=AO(8gzO~s+q@{!=41EDAstC_OBX zl}K%7uC_DRTv3&Z8|1omRd4xrJJJvuew3w)?T?4iMfdj#8fkV}3YLuJC+^6g$I6%1v|>vV)H12DotY0?iZa!zRJ=C`>9Od zlEtt-J0ee{ydC~jVv|kNt8Bv-XzrgMEHXqU6AQeo&HY&Sd{)&iMg@oKP&PWvXXoXp z%#UX53YcAGCN?tSf6E7h z^;fxhtyh4EC#r>>I6zaEJjz7LSGjqV4F~zIGzX9@0p_~n zHDQgO?Hj;-C$D`btnT_OxJjueZvZ!fcOIEgDe=zg_m#_$sxk z!CM!dL!QFaMI)=}i3PKmacj_-GSMMA2xU4^77C?XY7+SSsNf4;(IHkeWwH6RFqdhY*HA92Mf2=L*o=30F*K8-YDlv^cFpCy9%=aQDG9b# zM%9WLnuu=-Vpz=28Ir|aBhuRrFKptkN%Rznc~W#JGxnT)Df2v=h<iiE^bY>Zt3yz4%KNkVRc$Y zaw@pSyV2b1FmZcbCQcq_m~bJ&a80cxDT(q~F@FA8`aZ|8;=B}ihM+-vg{i9(`bf=Q zF>q~pu7zm)xPNNRMieM@G^I$XYM|BjR1?cJoG>Q5>a)Flb(%|@YKyul_Y6K5?qVgSLtx@d`-Mphm%x-v7G-{U*Jsf`Ai4x1a87?Xu$ic6B)s9OCZ0NwM@6;C4ztBNScghNrx~#;czLawspOcGQGkMO} z)7klSIv70XTgO>ByfANW&SzWY{1h!uAA;y3!;YZi$zCC|iBk(J7-!noNa+rOLsUo2 zqSN#0Jey9hM*LEGqSBU_jgLojaIR7YPlnI=&d%^TG=mpw`<$ezt!y$GUYP7zwX*|5 zcm3&EB|kw0`Md1%zXBH^*pd>3R8^C4sa&|H1bH|@Az~YaU3?58_IQp%E!B6I?SQ;s z8LsuXlbz*ln>7iKJ>e-Ww^W@l33T*R${p-#n>{VVPxc(|fmFD#qtg>d% zb!Wi!r<(aq3JyPd!>3@u*%keMm4h9Bs$wCgDVP!x7GCA8cUO3Kls&x4L|0L0l_im( zwal+{j_LJm^T=Y(?abZ z%F-atPKdq4*xWRT-Wh{|k#tE14HMKl2pE&iCZ2ycN5;8a z^9M4o?~$HV`L16HHoiK}s?i11%cI4-Ec1iu)#x;<#>b=6d4bbf8S!5fo?IJ(9LLLq zT}N^o*=WX(NTt^us5cm>H$ouTuh`#aINpj@0inG@Zbq%>!%-W1H!`pPHiMJLKS>*w zv8T=U%L^NrUY)W3=jZ}C^+-BVOM*Qu=z@don#+D#wB{ogRGnEap6lhlgzHz)P+1Xq z1j~UOg>~w6nqTT-LYLhARAdWuHhrA&lA1+d)LBP)It9yi(_yDYs#Yvo+p&UPpGsNy z3(?g#f|S20YMsr39c5x+6WjKW8Ru6yTWr3{O%nZwG}tCvKgz!7o}wyglp5=&g(ks@ z9fTA*(8~Sj4UaPHCZ|Q;&e3}JQ)vzcSJ}g#%1_x%)a>q%A)@EH1n5RW0{r@OvZ-+} z7=9hff|g0i{0{<$tg{;Y>h&ZxPqAakVXyV(>4JUSzWKHKU-+V=J@nwNUHG;kWC&1J zXbj0dubO+JS_j)^x>;er>Y5e0oJOmsbmFQ{QQ`Xw)Zjj$&+}Kr`#&ny_fw zuCC~5OdGD4xNjv`sPma&NdLRDUR95b-;y;NVf-15M~C233=k z;_#!J=6lG2)f zx;E5X){1`ly$1R&wrYahYeFW#eubEERhwY+-m3*&)U`(c^z~9Nux>xCS}&gep=o@t zTAIcn#XE+Pw5D^rC9n0Cz^u`_L9hB4g9ff$f!wI+gu0xWtkva&ejxVa=w$-V_ zP;aPmZ;h;kG*HU^<8+-kM97pz6$$NAS`=+{Wgvs4y~@+a@>`VEshv#t+ZydK}sl{8cU|_`9vGt)BYW*4EZZ!14Gl z;9{mgX@AG$f0diJia%V)Q-S@HQnRUl;iyNowq5mQ<8{(+?fxKwEBV&dQj1QJK35DcITbEI` zFHqKySyVgYW3n-tNfT~lBfVF#d(}g0r_FcV!?DrCFmNTZtY&|HUW|F~?tEF$rmMDw zdliL@=@aBu@e8=KtWd#UM1FiXO!i1P^i||^dap_!QUKuLvr5@DpH;NL?p0f~qnJ{D z)|`uaji(cePA4MU^@JF@S8XlkB_4b>*=+uzI>`A|jcIwQ>V|_UmL7!3o~73dl8jB% zyip;Vcdy!_Y5nj7!Jbd5o!ZHz6(nv%zv#41CYwcsa5Cp2@EgC(%W5RLpv*LH(yWZtZKG0IE7CQ(nk`EjVL@K)w9I3$6vI zTIE`_YX7KRN3F(d6mgc>@wXIJ4~K(PAdlV)-yaEp`82PtTJeaB+W(m@4v?p?{tD0Q zt*XdR<=qQRJ211*e9&h+c}5_vNxhzs!vIc^!DHZ-;ePLAQBik3F4XN@yNBHiH(J*+ z6rH|2lNVskxH_pI+1D5Ro&Aecx>n_;APSpwn}LzkS4peS`O$1%@cM%d5&W+Og~+M# zcnTV#ZqLzZQKetfut+bN2vZ^Mc(|;6%v+bT=m5%M*i)SD1S^Yf>AUW3X?Y6GD8R6# zLr$;QUOLa^?Gw|Pf~_u1X-N-xgA|>sfr3(=&v7j?f&ctjt{}87bZOn~S+>DMb^|7G z1(-*r0`siT3;)|{)qx|sK5*2!Cg$#=MmszDQ6oRXweR&9wczMTP_I#U=7+V&gvUc`j&n-+YG*hl+n209Qb$zYX`~ zSwR^?L%%D-H?I+aY13%OmC{28%R_fO1vV2=yNsEb~Uuix5j( z^Nv^%IR~mnik;I@C!ESNie=LY?F*aqdViY@JA?z6+*ZTibfU4k{L@^W$rEd3H?@}5 zi@J`l34X33sL-I(l#YY#Gn~)d*jR|W`6SeOmDIOli|Grus7;%WL(3ROIKzd2kTTNK z!Brg)#%zy`aDw}-8qx{pp0h)dgARDAy07mVsa6+C1=8vc&?92i=TFqp*E+P->flo! z5wEFxaKAaUkNeD5gxzcceA-P6EYC@n;sR+g5A=8ke)Cer6lhEkeZd!+zza?2q`t68 zO~|A`%ja6#?HlFSv{(~b*}&^YAkv}_X(6T@e>v<_;B+sk$M#hlPhg$+XAFU$VjbLy zgU~Y(NKs-s6+7U8n;@u7JoT5ZMDF7pw$IqauAO?(Y<> zpn*M~r7yIBJ)jWv!0QTlT>`JY^rT`J=`&zhR_tj?CkDZyNeOl7s@ig<^PHmFB*!>o zMt#j&D_Cb=5gSELX3UV6#I<%rjRTxuv&!o$KwBa|vOSe7Kcx4Z8U6R>>7{0w*1eMy z_m~(4J4m%_eRd|&BPKcH8wf4ShiAB;3@FbsW|Ygge4kMpvy@_TelIe~yYyPO-xidQ zi+ryN%BNrA*Am}Kv6qR=e=jL>=X$@EaaQbo--`Uta}7A6BeZT(6QaZKBI^$oW$j)G zs25m>n4C2mOjp8z*O+0(&oG~66pjM%ti%D*U0QbwI!)iYNw9TUjzHwiMmpm=w!8yJ zptJIBL4(AbD`t!-QUIpUti6VQ^jen;^R4=}yhqiL?)UxC)2`5a)au6Z@vxb$99P8n zZm{DdlBcs0;5a@OSKsaDzqi_Rjw^&|`>ngmdXSQ+oyr)8q?d z-a4Gl=f!ZyHwhW@8@ecVg94AUJgwjVH{NeheDAvsDd1}1+iG||u9$IN9ooTnGxWtH zY3_ZRO{dUy7~&@2!*M$hy6UwZo<8h*Kjda|KCUz)xTkgKA$1V!%wBKhveL(a@Rom- zEr#+gNIt8IoR`Dvu1+{Hx^E12H12yV7DHl)r@_i`^IJSe6nmI7!0MCs3MDT4-rt%g zI|*tB|KU4>j+7WoJV(#?r8sVhH_!Mb9@E8fcEGEAtp31rc7?RWF;_k@nDK2s$wx4{ z7xQWTr~2_K2YqSsy)u~bI4k*R7fJ;vYVcxLzD2gj$K>2S`U(0QygZywC*sRbkDvBs zIE8XVW_Z=j@N#~^i?M?J)64Gn@1MSS+^y!tay>uf)s#12e&~LGyIAPeyfv8dBrA{c z5TZuY;1Q{rwf-H;+eNQHX8824@^^ZUGX&1jv2ZoR=*X`~iPG;xLbse%}Ma zA56oEC$EFOaLQAnK?(d&Po!rY6r6@`u6(cyavi&JAg}oJoclE6jt_%yo?08^I$gk^yQE+z#!@>)x&t|(5EQ*IUg0156~fJ)T#5&2nXivR&`j1RpG7cx{g>ZJjnf06m}8T{iZE$zw~ zUvhaQQ&sAUrRdC8#7Q5Xr43YN=kU*%7-)C|rK0Bo9OaqWbMA_bB3q6<10Yv5oq?#IK)>Nxe*u6_^>I`b~>XBh`Yncl*lImzfcL{E<*n4jz%#S>=NG- zmw@8@+a=RPT&8%9B5@&u&t#1E@h!g)ywYGKE&|y27C#vi?>0(qu_&B{;xY|~c*{5} zM#hN#E+g{dBh$5;j689Xm?dMEUp!np$nBJ~Ik!`Szk$1i3vrQhHz9-UtGIFO5$1^t zwtH_(_{V(p8dDbDQXJG{hET>KBhgg69L{2KLArh<1P9#=$-6h7v2bwe1tEWVhRZ#a zdLh5#OW~Y(zR&q3dPl@1AR~_1zK6uzM}yj(+k`E@HNP;FIwKnUnG0gx?}mSsC8m;{(p;!6l5w zd<1+LPkGst@@qH|7o5-^An67C_F@tYE~muz2l5zL`4G4qdJqtPCtwnf-<)t< zVK-vPo`ozP4{-NFOwMkQH#{RZBo^d5qxV4cvs=XR>=yq<;{^F4e(jI2f&CF5K7HT0 z#miuC?BM|Iv)i$#@hV}r*j0TtCwTGrH5yU85OJLnaS8bI1Xo`G@o7F9C;Tjg+cjL~ zj0XI)lQ{e`*zX6%jQKm7OST>^ad9pm~A2v zE|P%p3%22s;25|hQ^GvXLR_YOdl@E1-(Hf0i3^FwF)pc>qX5>?OK%i>0RaM5e>o=i z{BkG09Aj%P;be+S$ff7H;=;T9(!+7~VVt<+p5QpY^n$Ut5FbAZN3OUCu;D0FxTb|1 zv5=9$WjLL2e&#ZqhvG85!Mg-2go|8bFXw(JF0nT_BO@H_mvfxJmviPJpKwJ+H{wEq zd%p19GI8C(P6Bd6ei1gf{Fx92bpFl<(Qz=Q%;WNfj|9>E zKA+F|fp3b(kng{K{lWt++UTa-y)FP1s+BkW{#x!~R~2eDH;E?b{W`Nip?5js;@+JE zqL9G%EFk`A=q5gefF>8z&xP)q?Q3x6GmF}%$M$R&z|8jTN))nqCvf+vD}!q7dt?-Z zQS3R9kRRXqsr>lIkL_){;(Ir1Gz#cLyf#dHf6ZNsqsq1YqtTGhn)T*J=2=~Pwr)P# z)*dy@M_byXhWV(iJ*u0JTIr+4w)tpNd$eUf+Rz@g%}49nqn7!oDIc{&(Y01&_oC$0p*>QH4PAM8qyboUxe$9bXO8?Il_pbBU~UwC*S$puOjDDg=iv*U_$b) z&kf`FD<|F!M03xE#rf*!`kOV3mH(0ol^!@dI(7vTKwi#BaA2y%ZXju?_N{V^2Tj(E zPty;Nql4+pG+KN(GL%m2ZC6xYt+GE6DNtJ-r7-rmUsZG-MqV~z>S;d@Y!*fUs!PEr z6x4@(4hxmESzyO9Ii?YZ722nR=nE|Sdc!4# zFkigxx%es7Z(g;kMeC`{&{G}|!Ow#?j9@cuKj~Y7p0*sBwxEYC<2s;4t1(U?T69F6 z7!fa`#08Et+gn}_*BD;(%OL9zPXt6e;#47B`jXjB*LxW$vi#X4)vEKh3+m^SzFl!C zC;{E8CxPE)M}!zv)oME7z_g&82u0KFAOrQHZ!sIkn2lrW72X304vZo8G@qyah zDS1#N7Cl(ABk{}&ENqaCW4oqNEb8s}7Era54$;D9W*WD5WTDLgT^oA9i(66mZ6td3 zZN0Vz`>AC`HmN~5qO;oV5`NbcC9lNqj{NeKj2j{q)jzInPg;q3f6AdFgSvO=5AWJ0 zUGJrc{!G*>)hZ12$fiHYbxpkQq|}JyVEjR@C9#r}kY61uLSo_PwKq|B$G03isoCV^ z%SW$EY{tV|N6G>cT;BJN>`DN#ec$^b7(B_I2y~7(PUg9QP7mdek52!`Uj5I)8X z+^Or|0l-=`BY~RY0lhy_i^rD@KAyP#7037)z0V?bZ|sw}Ya+~AwW`4r`{unIqZ-WP z=o2XJf)O?L-$`GQy^y2|bcU)k5_G7oo^rZQ`Z{^E$_0z~;-ow2TglME#4mN-vWPbi zI$vA6rM1S3lQ-rQmDhs)s9%f80JpZ+Wjd)NSgCkP4QB#NX{C%(oo?felg=LJT-$EfvuEANzUdNs-c5Ay4*)(9;Lp4Bmx%`6OXrho&(qb0JYbX<>*3W+4Ukf$ z=l1za>*m!%P0gA~-xBMOOXA%TXZ2J6x{><#N;ylfi8V2VqK#cGSijfWQ|ziYOXJq>pMeTyd=zM9V{s5zz( zbhLk;u@riknbRx6tz_g`)Lw@G$O?R;-3A6@2B#PW?p%21?Ni4`;cl3jyZST_m zy)D{Bbof@{b(xjgebTgp8~CO~wr1kjY2!wJ@t0aI;9Shs5SDgzFY9)Ry6#>JIh!8k3C!OJ&h^WVo<191T}>%R8rfCst~*Ho)>ts6cC zXq6R*5Q`|lY;}XWeGip29s$_LA+_FL_Rn}i1naoA9Nu2YSTX}YAD?%y2~qho$Ck@& zi&Kl)oxr`4os1@=2S;`V9rQ^|`Ec0@T6?;_b7H!R;~Q74o{?$nyiPj1Zdwk_G-uAdasH{{w}J5qXm? zfUp-HGrKbM0(U2HXcU_!$wwM@Xo=;Z+Q9refacML*zqEI#VF09`87)Eq70}P3j~^C z1C209L%DmC{#uSkZ}cyq6<;HySSc>woC4v^TL@}K*BoK{x)WP@v$^S?WhbO9sz=4UC#+g4q0{Ntrg(6EK1ftCiOts3^+!U)5FG9grrbz!C{it8- zz@L2A2p_kx*%52PTI#SZ(eo6?(`>`W7z#U1w8EFqTF4A_K|nQ(Yqn=JsiB0k9uip8 z+F0-K?b=%-Y?MqfoVcpp8(JT!6)BQMdO*--Lq#dV)}~mCnEB1kc1Kbj4mB|{k+sEQ zKQ;;snx(}mHwYX}fcpou--Qgi-ltK7j1(LPTskyFG)L)3_!()eC#zOJQj67kOp~}A z2@$mFnPLaZT|2R>U?%UnI<=L!; zj`q8KkY~8`h(y_;{w^cch8hC94s^(G4DRneb}^%-mmU$@H8nPwHyX!!YMy38C>ff~ zc1LWRRL+ZI-||#?5>u4CKF3cj5oSEV@s+!6asP@L_ZqW8STa6qiBwbPR08| zHdi?b^3D*mpuNQ#pUw|X0`cxgYI(JuCx@glEg7fO$wXVWSiwYnGzJ5B)Sn3EKakD` zd^nVKY9vqYiusY%VSg_cmha$o$}bZb*1ccwOdt+J?`NcqyppQ$8!n3xCp!2MBx)$t2Y^tO*Z?~MJ_)}*!XXgKuLUlpoAJGr*`dUuX0Zh;xA(&Z*BGF5UeS7>4T6*e=B9I9*TuG91prJ>rbb15C?MeEbWYdpE_-jn-magctFI zE~NXG6!$cWz;tRE62M}LT^MaX)<|~YFN0*Ly^3HU-ADKK^oIQJcJnkKgMbAA@{Eer}3&kFs^& z&XCc#KT1Exm|~fV&ssUGN8fR&GRA&#<9kl#(-(fhr-J$~{GzW5sNT=lKgas}M*ZC3 zBZI(Czu;Sez)!#M^8yUs8wIFZf#E@XId&P=Lj09*Y~q;#9}t zf)W?v++>jW>=%42kofEue_w#Zr#u+%y#Vt`2Lp<8=D8&V-Or81OKi!$HWX9;z)VxV z6wD&olrK6C2804Ec5+zkZK48C!{Q)Frdd*+WIuaAX6!T6ivDrl^yGM<$A@o}z|Ay#{=weph0UNrP*7U!gy9>Mr(cg7W~aDs;AKV@C> zCHS+Z>2{N*x!h(dyJ-|uCWTPds?Y&htowyoxRt_LYjxGjR9mar&qoi0^9>U#W6jk} zu6X~Iv_56(3n~%X6C@_`6>##;eE(aX-iyBXhSt>pj_<;5;|sH*wJF6UwD#;=9gIn} zN_ev%&eO<>YKsNg(a-(-DQp`3+?dO>9rl0V6F}MEp)~)#tue0yDp)8Bn1~4k1gM#L z+&o^2(+<9mG(jYjO}Rbfb~%cqkau04-mM`j=CeW#>p5#N z8ATnZW4D~1CAUQAu@I{&*_1lOB!HJOwTD!`k)ith!tm5x@{;$>jLRO#UD%qQR_A=%#E z)l43CI+cnYiDFP^B9hy~+etMXJ!}C;|;c7~%bD5%Sqh`A#Eyt=DRs~YIlB&3QhWTu< zIGIsg*RxO3Q@2?TQ1%0hDvHouxh$K9wG}4TUEEj1y8CNnf$GmIsVrM=9QFGAWPUIl z^7u8zi9wT+7&CFYZ^-zZFoFMohF#MK1{X}se& zG>Sr2B4;|%xvjv%v9h|VG-9m{WT8$_8z#&?IK;g%%ys=7qccLxDTZ`*gf<%d3{?V% z?rDI0QVfXhVR}#E`?>F546{qv8zqj`fFQ5a?KT_D#e(0g%bN{xv);mma|l)Sg-1@V zxLrb(YFd_Ol zT+R~T_oDG$NPHSO#;mxQYH;^wsjdO0^%)n9r9U!4lL}7oO0~MmU)hl&ZD9SUIKJQo znAR6E1hT;f=#@{wVsQ)i`>9=tZoL_}Zh4R>_h9Nl)QhxVj3w-&-qUK_WQO}k?Afz0 z09xdz`+cL3x|{3T+R)sDkeuJKzji@w&}TCE#ii6G8He)X9@}c@Ft=bye0QXjAqNk$ zkj26p%4p@+LKN3G^yO=P15o^mD9RH%t~e*&ZT2+t{lpAc)o6jC+IK-FmuA_k(ZUPX6YrLm@R-EGM;;2kt)s+4&P3iEW zG)*!MNpoFlP0g747e|Hl_J=&Sl`-7zG~^qbs@1Tey}LtFi}QC$>kp0dKY&xsKjfBy z834Ji`+8EcZ>%ufTluDd7=1m_0iJrU>(f3kGyjWTffzOUhC6m62tAH5Ba7&MNd7|5x7NA?3_KH zB#|@=*lOhHR@~N)VhD;yyq`-Nd)d&23wHZr!3hAaNsTqXkAXj0U@)(6%7R+oq_0ZfiBTr##B#FaAVIFAE=bghjYGFB8Z2G|Va@G3Lzf~>U zGpZFb^y1oo_4UO|)@8uv3`NQdv+8=2^BN2+-^3lVFu(8!0hW#@^p5%$A_3YH6!o-hd5s_!3myZ!C2m?9vSb?+bU4AW1Nrf_2XbyB-uOhGH}R7FyZ~ow^sV`VzCFr zz|?&ESs;BTGGLO}b9VjExh>mOLVe}0Rwp16RoHzGvw%y$(Bt9_q^X??wt=;$$4II$ z^eG7h3ulbj7A=^*O_>L>(Uw!NEvHvo&b;<^mY;3b)y&J-Hmzc+l1Ym$Xrw0i)I$LU45bxzGjmVUJ@>PA*m!1 zr|OXovd?%-0~{%)I&L{LExGCTy1dzxH(T;X&c3atENO|!v(Z4so?3GX9DQy)b9`Ew z&&-B?hF!-z12>)mmYqu{cV&1~wpt}1KImDi;|J`))k9chHG@;ws}i+uoa;i` z90w4D&Y==HL*IK)#-nSKPn&Z~XV}gG7lp>-(CxD#YM$zL@4K8)oF(E^<>>oKwnLqV zrDIcV0&>xAwABFI$PLNtXkFiggSzt|+4LeGG+lP#@UFu70>nO1wC=N#?=S1i@L#VB zB-iVk@}{+9lEI;(j#4~4l*`jPuQp4%U42%~KI&VzCtI9l=|7Yo-qgCLFK0Th^TDU) za>M2A3BygHibOAwfO!mh#h zkS~2ctowXe(}Zfo?X#3H1#my_vJFJdb^{9TSZiOf0WLM z=T-Kloc48T-(8n+VCr%^uNM#dFa4#}7trj*lD2N8^1GtSUL0kI))P%Vdb+7incus) zo|PUddE%BTXm*r2cLu?g(?r=59`%>uSwNFGq048iT*O<7DF<m8pOKaZqJj5G2&+gE(zMF1s2UnS$+ zlsEEx+Lk>k55UbW@u<12@y*H^K{5A*dY(poqmTjcAN1A~%~O$_uj+KNVZ^^u+5!1kRxbr7+w$O5mm?|t zM4ofhTD2}Ql+u>wy82uqwza;Thur0-v|=J>4?@56ne{%`U%zm2eS+)&#U1s&xTBhi z3bH{>N#LezhZG7mn`+XvOAmLu>Tvg-H!p)zwp}bK7o9g-x#_x@pRSOa3ZyY^j^_~i+M>MuYd;7CX{&wN%iJ@@r+0Im~fx_du1HR*<* z0k@IL^|Ttg^;C+W7QxJBxW1X$C)YRI@Y|vQO$zYo8|Kwr$ZX~z9by(Gs z2f?*c1|Ju^9Xd!Kzh&pZYg~MW4p3Ot`)b z`V){TR9#PvSP%Ey73;k?U`;u}E}d{jA$Y$jZuAV67Tgi-DGxH?CENv}V|~? z5ZFVJ4_Cq*v7!sxICugoM ziB62V&Rm5nCMocKWzu;*!2q`85v#SOiIF3|eh9%<2AvnJXM+URnlI77#bMTwEVQ4? zp(&{`0{h8{(Nhw%HcaDFgp+Fv5O z^2g;{Qf|#uM~X&PVA^bLWO$WEyOovlO6EriRa2I!C6`=v8kFLxrVOONo0iQpCkrGRDd=He)W~8LG~;hA7>lN*K@O@Is;3mMTV267YA# z&3avyY&GShb#c?!mS1g&lD350mM^COH^t4is&rG{$gf%oPD9?vueKWU<+?;nYD3%W z@)_Ructt?K8)>`}5 zb99tArL+dtf$)t}Lr!rISuDdmmYcGgP1Uz@ut=&jHzc|n>Sg)PrtBp}unpOyP5Jqz zZ1$#lBpa})zLM{3s7IpG_00{C67xnHE!$1vvoK!LDQ8Kcmb10pOO-H&8^9{`d~2~l zy-o)wk~*85B^fFkx($P{I2hE2PI>nG ztHT;Dr?s^GXl?_GJd}M0rfWiu&}Z+Xhhkd%TCRE8YAX_eOlc@kg?woU{*VZo}XhaLj?ALWpXJU!I_;gt?7oD*Q}GBHCvn3OzT2G%R)Ya})G!cO8=5^B;e9 z*U<$1Za+Q6WF+U_q|ivbsoR{dH|xf)=3;SnfTzM6ZYp`UhZpqog7fS|RVV!2%8d_i z3Y*Z}$~NI9Z9>)yd0gV91NsY;L2E8KMzrdA@rOYEy}5AcDf;l+OlUj}|4|;i@HaYU zc32ulXLS|5Yh@H{n0B)?vI5Y<;NYT(8U9H4^hOi>ChOAr&@kWj(o;DEk!|2dWk>bB ze@=C29x61=T6;Oe8tow#!U$K);1Zm^6uUrd>$XYF?Ty6(74o2EI4aYl8ys5UC~s_; zRw=NSk%`o)tHoW=9L!9AwP?3dZ?CsE8e7eE&4*K8FMhSC3bO32fKMqOEHXTQ%@Ix@ z!rfRzGLQcBRG9MUPgbqo%q>rk(HB9?@s}^r@eg0HSU0NKOb;2Ylz343t3{Q`EBI@| z>NH9yn3T9GNw6NCEG)AuPJh4xeIDl4=j>W{c2K;mY#Iwm%lHNIjI#qZ&B2{C3-(A8 zwS12_#~~da_33sp;!ed!M>zB@XcQNE37(8nc!`TKA#+~#w8(+I!%Nf9!EPAu zTTT7K#q^i0Y{0T~GJ;l?V)eO|%|*ezbulud7mO?|UqEfm;gx}TXA9QkXcyZ5X0u`WH`y(Q6&yqfKF$=iCb;H4krRpVOt zciKspH_vvvPVX?bj_<6*J|b3PJJ7zD4STf#+US~nIkys?Dxp^Eq_1&eh?m}^Vq~{g ztpX+QBg;i6brFxCT6GUGnw=UjaSS;Lx^Lla0%7hz$j`TONj#I`hNa-}2=Wl@-gPT+ zt(T6O#5QMW-`_B5g0&3au6LhP79iu4eBJfy0MMIOPT;X&xCDD`SrF8&Zt z*2#tj%saP_6LSz@FfF~(#bQA1oag*Fp;_1kp7ReRoi`%+(Hj-8R$KSjT0~>Z(}QK& zUK;ffwkRTF=W|KX6(*C{V_MG(qQJ`W>F z1(_PAl0K@`;62D(DPH2?$f1Bg+6(<;8W<0G5r51#K;tnls?=;R+KDk6d4H%?u!>GV z#*<3T298WLNwy$;J^#@B0#l@;MnQhGnkFi_nOnw4luuqYYBd9N3PloG!ObdjVi$AP3r0Qy=Hm!Qrm>ef6Jr&^ z5CKC^#TsAjc3GxqvA6@l0}m_WOza9z-x2Mg|GzwVN1>l&_cHmN@<=?upe3I%meCzx z9ip>z1hUgCAf8deV8ut7B~-wRTrRkPmD0csY#13NA)a2My=1~nC#i!>3>EP4X0Wwl zoVlp`c6EQ(8tpGCx*y7wHK zJPg?ZamGavzAqDVkE21%JQ~5G$oGXGkxi~~a}&9Dm_=+JS>KUJI8f7NqAEHFVrJ;u z4(4Vpw{)&mA$L!~qc9P;pGfcoH_*8P|A897eKB6?ns_ePwBLL$iy%K0=46188P4Vh zyp0AK_S4-loUDmu%c@~ad)fC^IH}qC(?>`+>HG8F;baYGn}yHyMIM-1AkMyBNg`NA zpPYUlOiiLnFa?r79-QV~;`?7b*UWwO{U|eQX9N?_FuXz6%o(FI3Vg#VllNHec+5$B z!tjCo0h-DqyE0=ToYU0F>Nq<1nSficF^e;^4&=ZL4hkaIfXintVq+Eovz>hnTD(Lm(|! z>`gyaCrd%w?IzW#^?ArMckG4Jndei+Lx4mUeBW*MevH6>)Ovr5+ZVs@b}UkR z{JTT0uWR-J(|i4(008M)Th)?5hk*5R?EqH|uG$aq3(+WVumW1cgnu5cp2v-|!W zTNKfV6NdN0z>!psD4LE8$Y7TE{(w=8djriRQyRE~aU9R0!5;A0gG--8WBzyK#pC2= z;Dl5Dd!G(LY)Jh%Mq^)67&A)w-IPR-Ynzv1AMy$sHnEX3&~VY3UF?07sr{QRkJ)@c zT+!x$-Ve0%?7$tw5l_%MW7+kUWAec=D-XJ1(bl}pvfzhCWHyn8J zfMUnNI3ce4FV05q!_@KYY3R~UWD82c zn%^N1hgdEbXP`itNd8=8KMvz}kgG2j#OA9ePCJDI$53o0HJit-#+u$oVSpxc zcGLy2Vg-`q_9|=BII47b!Gsq~qKXvj5D>JidcfPq5Z^}!w#UnGV)Pi%-t5h&LoNW1b7j-gyeja!&o3-|+A^Pkc0E-juL;xBE2O^4({k zUwT4##``cnft`n$sop5$<-Z-JX_~bVoGPuU3UjH>@T6PU()PX~GB>HyWj_cc!GjdM zkfPK|@O1C?R-MISHL_gWsdc0%!SuQN#&tnLcyb)1{H(DOT<8anOEiJ8Q+aWHV{5bB zl49qJ1CRlTbm)*Q470}?q5y6~BfoFfx7!Ucwz4b*v)O7kHZ~CCV!?<-?TdpNrmEyG zEV{B*Ta^en7@Y{#2r?QmIwCPeLymnC6GNW_Vjz*fFAMw5iLwT381kVoTDZ@phRpK?0YYyus%C zJ7W<{r^nlFy=LFdEmr$Mufg?*$7)6SvrH^5<3J9xt>tl>x57kUs1dOd5Q^9) zLf3~H?3WE-UNaGHi4t?a5fk3~5y6D_enc-D*ROa=Z&l6vp+$5lc~Yy@-Z+24DY@X$ zn_BYfl^o^?NYY|HE)N112w9Y`eKs+LwyUTNg+R|Z?$Qi&(b||qTVmj zx4jZSV~xoND@x@h|8^Da4#PQ56~bjU!9letQSAI@MZzc^Q%><=`aV4W2wDbdT@Mw%dIpE|Y9{!l|7wxq~_@_)6i4+g2sPdZd1ST<60S}Gu$FWAgJ zcWRv%?h**4UnR4Dx8AGG;=U;&0j_ute8oFtWI81*w->T@W-8Ie;v_=D%~hCDU>5q7 zNzD&yXJHlC^?c!$5&#pzW$WSi3-YPw3~o|&n`hA<(RJ<3%a@Us4?3Fpo z)oj=szo1W00PBxh+oPQ!kM8A%qr|jWDZ%jn22KK@qXL9V@i{aSZ+sl{pf#(OgZZ&F zzT%L(KJ5f^2}W(MhRx92ST$sad>jLe^LYuSE@Kk7gt-g}QEwTJWUmmSz>(|~Lo7#;9%_Tc(EGBNn6P!DU9Ga0%|E?NGFkSr z$seb=ty420mfBjZu39@zycW|a#vB@b{l`1~$Fct7O#gA3{xJMQ=^?jfa>7yI{i5y_ z^JYFp@mWE-12?A-&NsGM+)9kf;^O9d?gasL3&39`MlvvAoMJJ|+>mtN{`mXF?@M5^ zlQjkh0d7MD%+KTBc5+<BTs*+V$KN8!$u65tKxa`6LRjsZEdVx_|)TNPi^&PvI8$xQpB1Hc2 zIS4iE!Lc}-yx@#A?$+mFlt1ajhx&-(+*GxC0~}V*^|J{NWlm|?Q9Zs*VP|0=gL{>uHhkbCsJq%wLp3@U zxkq^K#MbaZI}GyNC;$hvY3TvcU`=&Ll+{%Xr+bE*)B|@OQJIdkfY&VN(=atGtF8CG zpqCzGxLW-@vdkg~&z3C{=_J9oeIjB3ge+Db!aI>L*)L0KdRJ^{+v9}l6s6Dpc_%fe zX=U*2lgQ3(G%Z7v z!2;L{M`o~}Ycx_iIwY8XeQ#^oMGSAQ7|KH!RWq_6Yv6kz{ z9M9RD=U>niRG%Zm2a6xp#iaYc;HoMt+kR{B;H`Y>CGa-&zfQZEj`B8f6#qaz~@}|l3Nl4Ok`CSTeG8Kk-{D}@3 zLp~pNqXAl|$xWVn0jMqaH^!~%ls%JT|NweAcQ6aJXwJxwYAyJ&7 zz<*clN*rELkhxPAe_VzvmbZ8qfO}AqRIWh-$OCnR?5TziD7?KB%>(D3`~<^+CBq?I z{y}r2^P@5)54-c2p5U3LVpkZAykBVJEAHXOr7>hO!#05p?~pR>_9}emJy2JGz&7s0 z;nZ`Y<@mON#x4LQ*uhRX1xe?@1J{E=m!`K~bP_tZ?-+$2en{Yh5U>CnHz_liSJVuIQA(%gOepF`YwuN|KjtQgga|wtoxY4N>L3isFj#zjv zsF|fSJQCDWeSG87=Pes`Bf9)F?m*jchUeM9O!|WN;9M=x$P|vxA zzDoiR6RC;Gy4CqnaYINMrxRGbbV=ig6Z3)&ed@$d*GFbEe~!aWgwMo*J_I?VjN}Rh zK8^K)5smrZ{(X>!qvaxR9FMTXvoH?f?9d-pP^VFmw&_9S@xc(@2OszYHn)*Kc7KX7EYnUp+4lHP|O2>%0K?6z!Hoym?H%@C)XBXFDht>t!9r{ zqxIFhjJD>g&BCd)?9`TQaAUg$ipUiKWDf;&ZZ3< z!V#`MUI3Sv;Dv}%B8rJ9AJ1nY?piDf9N5Sh*q#8C8x|Xbq|xG!1p3dI!=-z$fbd+> z=ezEb#{Wk3X`_+=czxihK$1#v9fNu94W+BNU5Vz?DUF%u?CYgobeY^lG{#8{KV|?x z{@nK>U^rvoDmljIES!1~{pV&CvNeo2eEY?WK)4Ts(pL`aI)Cw!#<5RbS=xZoU~cSo zUOX0dj7;=_@C12!)xfpvmd@X)4HV~{E2bk*4FP_ktSph9y6XX$52t` z1@TUdBSA2Qn28FrZ6XK3rl=%A`p+m%=rkWEGA+&+sdVFw;4dZvwJSHF&$-nHAEq;iz<*@-tB~)0fK`aq)bEi;H^@xO(5H(+^H=Z+Z~8 z;ts++irWisG>-L=gcdj2rV8Uo9ImudlONu|h4BmZ{dXao3SL+HsrAM`y;tqY&cTTw zIHY|@A>~c!JIrSKG*ia2o`UHNlYD`gj!(1DDYqdE{v}@lY|JTA>*;gLmR!Fg{p*7V z>ii2I9|y7j^cUxT!iay7_;Nb%-R?Og+bSj*Uo4)zX6HteSaPQ{CN7vfz%m-yWZ$Hh+7++x!CnapFHt%WIP<{4>g=38sjeAXz`ci55$Cj z{}djQyY&gCW_{l1MEp6aD|UwFYN2<9!MN)Et)~agfAYi%&^dpGW<{DAl8kikib=kFBtg6{|dBQ8~?LN$YuH&Sk&dd{2#`L zZxsJq5JIbpr@O~d@~g*Mt!CdQv}@7sTZ{gnYiD6VyY=gC1#T)f76Ar3k>hz>bI@(T z<4hrcRSy{@UT$7@EBRvn`W0nU54@p1!QqPEy24jI>TX|(!04{_rZC!e zqw`xvqiFVi9(KHHW3k{S7>!oD-EKBoy`Q7bmx*Tgfxey}lQ5>e${&@Nk<_ZKZ`WQ{ z{-|{RsQjT7Zq#1>QTgN1h#i`y6OdsoQ#4BIw@H_-F>()@h+gmgp`~irZq-T}C*y@z z{;s?vFDrjn-pJaG@)y750~tT4@|bzBWj^@3@^}MjlpixO@D+{FwonGjms-y11}OO; zLV7wRgre%DXpHG-k0r|69+IIodzF>fl}_b#1=MEn{88C!4vFVme~U4;0(4mU0}SKg z?(vV6AdFXtq~v+}dmzUlhN$sr36YQKk6xeV>~Y?qMtd5`2O@9 zJmMi*1pZxl@%twz5g#jmcPf>aV8(QwP)+HDrvehhpW*y%q=z=ZeE=n{rmVC6a%->c z%HTz#q80!3<@Ly}3@|LtJ-VQhTP;&1$W&6_2_t0Np{D4(fsj+xwy@Op4mkyaLlwTT z&-UPWg1%CQz7*dT`mb+ba-~#XX*A~sXu)!^62W%)kVk@xoiSHFekHfrb%hBunP#Fb@;* z(5e)p(V@u2e&~lc#4kne)=-Tiq%@W7t%%#tV>QSK5G5-5KsRqcK-cK3eLMC(S}9(R zLl%!o;2MbKqtG0fh78IWpT~YhgW{XeonwTbxE!#NRKbkunhqT^R`}LpF&9&IU*v_t zfSWi}MRY#Uw9U|B*~o@6DvX@dtZ!i2+FcA~#k&Qe?IfdVQE;)DZjyjwvRWl#4$U6& z!F9^u;5VtUzBXgT{sWPeMK#kTO|mD_9<)>jYQVwFR}C0NRxX9Ne735A%RJQ0;mBb+ z^7Tf@<{2@053>o3F>kRRrYV=Z7}z}sBD6YtuslG^+V$~fcVu}yUP!3SiF5=?M*4X! zWOQS(Xw>T}AN)3iEIa1|5=_X#;QeJ9(2+MZ8zAb+G&`8`Bmz*CGZ4n};I+Y_MVTxL zV9l^^OjUDe7)A<*namiecZlRiM3_S1t-&uF9pohP@d~x{9b~Z+%)2Qz4G?;r?BACIU$OAJx%!GD^eeTMzq&IA`o`H#qcc12? zO>@>}6Vs|N_bLW`K0AZTd7#4iuWz(E|H(YPgD0tihIx#dN$pD$nKtE^fXog{Yd$#; z2J1W^%jGAKt2-7-3j_riR^s^UvH=ggs^K$}vOt%o_Go$q) zUyfk8BA(9pg~+^fCKCCahY=bmn9F%#6m74aC#}pUtRND_y_gh_?nH4I_j82MGQDg0CxxYR^f z%1snMn{6gH=cQU`TD0sHX5Jzrjoe9BBFI#o-OZ#cB?{=o#zu}ompea{XK~3-WJx#C zU8Vcn2N&bUP}d^Tynb?^o$AXVUCl}p(<%8*1wu&($l7K4J z8Pv1p(_vhDSy`*R#Gec_*7A7JkbBGuoErH!T`c@a-uLhmtqW2(d`xHP$xGjeZMs>6 z$Nyi1N7`!&Hd>a~URFAKeb4F6s~MUnkW5;&>UHcDf+Gz+3F2A z4FuAsWZxsBAOxGbcOlDpD(nl#|FyNXNJiuX>uliWkUK}pJcKEo&w7PIR$d&zT8e||!v z$oyEkLN0mdrI)@1QQ=@C;jgA`0;l_2s8Az7n@W64bypSpH+aZHXcg$S4zqbZ9nW?! z64M%7Y=^{j6tX$|7Pt14Qw>A;Mr)v)>qVVtO)It;==G@!n;hfr!X08eBnSh~A^s61 zE&|kk!&JUgk)2=!YTdS^t7eC$+pXEEx@=XQw~A$2#fn?Sc&k{4J=H1?@SYtO4mD`R zGSn{&4g*e15LH^QvD>Y1=Z{M7H{wq-_|szi4Ip;Fi{SETK7t@0sRLb#ypA!nAbnz- zYSLL!M0=d1lKy;h@*-@BmuZPt+!9Zsi$|a$T;GN40ZnOt#f3 z%e@FG9X$~}>7{Vs0=GEqG;O{(b|PuD zxsfJPE~!d>XcBpSyXbxGM524&8K16iHi|xtdD^S;DnUpkV?o)8_N~Jy;{MBXH^D%j za=pRR_Y7jKthcLGym?d8o&yRuUDsT3H0mbyP3`ef#NIYzKJdknH&KPMSslUoUaoV% z9Mx>njTQ_49Aaa5%Ck}W>FN}UdTC4?j0uU`NabqmMJu47P8eOmc&aNg^F|}eRxmbb z=k;qI3=|~suTMRPg;6++UxT=g2kCq5MNvYd*UkD?eY=t}Vxkrrxc`A#Y8|aLZ~tF3 z=Fk6JTkIX*BEqd2R5N?I^)lz**(lNIRjaFeGcKaJYG`V=!XpX3nfmC`;)KPCILg^I!^q7fuh zv=1;gmv+H-K(dFKMQy4J=fZYIM14Vt8wS2{l62Yys(;Z22LXI0YzG|vK4pV1`6Zu1 z9uZ%Dn)~W@zxXT2es;SrzRETGy`FhWd}XASQbW0=qioS9A81j|-&AGonxoM0T|_<78vQ$g#$~h!y0VF-4=^ zTrBSQ(9@eidH{%>kBc;a2&HJSpb6)MlR9PKqW%I+Ah>ini{62ruiW@;bBrxNuf5y zJ5$-A^4Z_@Nso*i}HMzB%-DMQ~eBmW(IkVXh9c-CC< zY#sKqjW)*Y;AGPiR9?u8Dxe71apLal|NiSW{ulk@PbL*qe?>1L|HWU?Ke~TK|FC+U zKYsl8AJ_l*V^R6>-<9isRBCJg=>7Hj?Q8pZ2?UHT{xpcQB_Mq7=4k-^3;;59U%4_; z@BG?f{2|`P>$k79WF%v;AvCtu z{}cl^O%K|vD?`S5u|4X#Jc@0~1Dv#5Xebr9JODM;97$6#zyOR-(}Ddr(>DFf{GT9}s8qkCl58tx$}bMctJ+T)CkuWCbL* zV0Y=RKz;T~8bfm>WGgeFA_A*f8bvE!u=0lo(RJhgQ0`-YtW`AKj?&yHg%OHCIPyFb zD+)|h*3Y(K`I_2brXz{1@f@K2;Tt*bm>73#$+$Bl8JT`&1^wI=*{`CQfujA5GSFE1 zLSD9zrfF?8%x^JC<T*6v9do2x#~lvu*Ow{*h_U+}f)B_QXS7^((4gV@O(}Q-M{+7Rw9SmK=#bI?;+P2q!YO~hKP<6Q43Fh8uvUmxeLEwl zZKM{98)ZV+_4;OZp)`YbhsWYv#g92OTV?S5O1p-%-^jjXe_ZOE5NU09DrlKX|^=gvC2I?0zqO5>J zy_)2KN(+!3jPH_d>1VyA);%l{J(P=7tNLjU`#}Vk9`Pgi5Ug!^9O`Nn%WAx#mV{ekfq|f$z5=H5x;iyRyQZpF#7t?r7Z$8BT6WON~XN(54jG}1P zj4xdZ2eyDC4hN*#r4Y{dQ!^5&X^$;xx*h1NIHbzPg!VxKxva#F%2hJt*doF*NfSak zi$zqeLP&e32OGBBqtKLSU+t00*9Kp02$*~)tMp3a3!0j*yqs|8S4n2NgER&>q*HLQx<5<6Ey&}hgN$&{u4N0A)v&={0DknbTX z<)slp4obK=lkgPIVowkSUXCfo=;L4zYf$x+&zW#EI}1w8dnoqCRgO%w^=ow~eVy{ZY3HBSkKfNb>h01*uikug| zryHGWQ=gUc9``t*&@r@HwOFDb{%^HTuN4T#G6O-Rd4`#=YS^jBY%uo|9@Y zu1sz=)@#djyx~mgcvXN?o&RtDyR|fc#hta~#4oC3f0A{uMYn4_SyrnS`f}(TTh`eY zhr6n4e-YeNgS0YX+VXUodFkHU8zfK{)4I|RP> zP3d~8+?2TKs0OkeyaJcfucyE5WkIEDT%+AyEIi{3@0q9eOYnkU?RHtU8fhS+R4ljA zQGVShd6~9(8nitU>{7wln(;dB^G9OGMfzxc23z~SOsG}}X57w!(I77tiAZn&pvD3z zk+-4*qWa?Z^6{{86GO@yE@FkFDWbyjqtx<4rCNRZeQjUfPWNTKy41xFAYe-+gd&zL zIkqd#lD6(OR0teSwOXog<2DS(kXTSH>t3~rcR39RTu)Khh`9{7{fp2qL7=i~o9xymyC+F#;Z#TL7XTWx9l$4>Do1q(jqT9>SZ9 zA0?G?l}hC?AKoE-7F%~bGQ)Hh&y6rO1|zXAxD`XMoD1W#)rQn_>Q~G7wbfJh&2W(5 zLh}86p26np6@OwF_l-*TVHu|(HAavMaH+>jwW;#VCS6aJuDsb$e0q`URjd=LMDCn2 zTtZVCOEgsg0>$qu6MJ=HY|6Tt5{;&MM^@340GqO|ri8q%zEV|4fHELLQwBt6Zf&Rb z?Bc8ZR;m2qUkvo~pJJ@i9euUi%`rKv86~lO@yWs%ylol$Lq`co}F+5x7Uj?|6K zrws&@-^UVjfX%J6CgZHBD%$Qyj~?awltBr2JY5VfwN$Mp@N=+P;9e4{!YE&1R9azF+>CU2+cYgyG!24iaDDj;n#X?03vIcWZA-duZ^$0bMZQVT zRoM=xR#(4|m1Pkqx7CXwp7K&n%5mWsS>G;2G;_dtKeD(3;IR;ArDMN9pmjD$GmaNq ziEY)3*Q0crL)?&wX>ao}q0Bhme=x-QpSh*WBs?db3q(r_R_K za%I-D>MTBz-sq+%7#XKp{kdqKL7>LUm*S9{iRWTkP!rF;k-7R8_g|@ z;I$v{w!Od1R@tAFf8SW&Xg1ny9t5l}rY1PoWP!ZXfuN5L_~J}VywAcIzBL5I$4e>~ zp<*$&__0KPKQugnPYr94S!&B6rANpl$RAm631J5zUr|;Pxq>v^a}zcB#zW8p%Y|ig z16HB($EbZhov5^u7>nl88wDgz%Zv4PQjkV+Xo&2rY{WX0{-$8%odCD&_Ye^&jC-%iy*RIEF(Rb&R0xdyxM@TM(t7? zB_%<;3JZc^O&{_Qk(Sek=RkZi*cKh?OMQTTB~_?28;UWu=#WRaG(w{Ghfh}VHIpb> zNQqZX=aFjl=fGmU+_Km)eu~C_ZPBM&{{{2tAUa3XpP9OZx!zM}GT!Pk=M&`x{2WIW z)_pr_3sv{Lt&Nza7HN0wOvuP}P;bB$mgzel6cqzj_t}1!+=#%{Mr;Q&53~rEt@~}% zYZBlEU#IYFu7NW|3p0J=M0>Qw!gbOBu#1IHM6^*{s#4adWY@T9XIFX*x~vZbJnHCU z0GA$}?<_pxY$7A{l3awkMqDWnszwPXcd)tJ90fl;I8OpCaS?{MCAzqikC^hcT z&;uN6zJ+Z)ZgI6bZd%MfytA}ixGv{EI6YD7O#(M8fqfxk9B4L2x{;CBeH$bwoBl{G zPd42v^r^$hyp_x$15q?eY(C5{!1ZfPB7q;8(iG{Ab`NxeBfh*CTASKaXW7<M~acRwKTmRX(R?@GT%$ipb zx@KL2yvrkZ@rm+OcS1YFW{4Y7nc(~S10G!I*%KwWQU9n-!N8QD4= zL@85HUo2Q^Gy?MWreIo^HR^oWUv%qT;HP*Nwl*s0yqtE zOOE-L{LIE&N-?pHt!$jN9BIC|E^St$Sozw^8Us*G>(0tGu^*|G=|BFHi|0WMuXRT) zD|v%n0pHd`6#=n76x1>FoMu4fuVWnTU*YuMJ9W9)^(pA6I#+Xi#D-Lk)k4)dZj1V} z+`E}Y_TCHJ@V){gy!@qz`okw)8DY?ZO0CwzHa#Hs(P2ZXq20Tx^Cn%@=h-r+G*ucKW2&u05~m4gPPqhvYk0M#;gWBTn91%mjPwPt;K-cpWn7NAwSw7Z zE@Oy5*^um|3F9>bU&HhG@EIWaK^Y)EXaUEI0q*Dr;J`y}=<1MLAwXs3D3G+*vEG@d zbqL%!BV9}sbOaFdb%IXWx;gOXV!_=8SO?4$j(u&P$uMNuxZ*>d+M%({A-7nqLi5b_ z;AvAIkNU&dD}893KeO*4KO%w#=qY`xRSeRp@3ysSb+BiY)vv|zV7Mm_D!^*<%JvO_ z*@GK1k3m{rKE@W~tE^C8f%gjUB*S|{A6(4A!DXO)V1!Y-nv-q zImOM+-d2bPiv>_$OwS)#_Jb?cu7|Yjv*LR?3}B1g}-P1bqqFt+}M`8lfge z=Qy|^?T)#;L*rzGSfT6<#hZh#lSlJPu2G|kj zz>M`+2e!3|h;l9U_R8A=$LmfGR-fgf^wzai9aUp^W&liqm(bWBJ?gPHv=EKO0+Fhv zVUBrJ3m&7kz6`k>B5h?xP&kog9UD+NZho?)2_;1<4M4*~n$~^tqjfpvxq;?tmT>|r zO+$Ag)M0v&H?%CTj4jBB{_MmI7d8aO=`#{K|2-;v7~>VXs>L_sRrBaRl9tw zn`F;!zBqXV3l*dhiwn3Y{u8Wl4uu_@;`95%T`wSPUc993wX;&3)T?kE;I%~r8a}C) zdkh6bS|q}eC;6Ob7sS4?R+(e)N2{wz({O7G_$G@=CE`DkYh!w>g0B3|<`3$4AOyBn zy~SeHVwwCN)#~a#KWwgAUN-kfty-NObGyCSF-|QdN0wm{c>?mZEl$&lB81CAk1gINEZ+R|V-pHnFs z8r}+p+MVBJ5h2su3ftKv3)1?$DLpHiZDnSn-jOO}O=+teOGSXZLxLkBvrQ>gq+#ZB zpp2Al?@h52b|b6zw}dN@F5il}Z+{M~2p6=RDYLO(mo$HUQw44q0>hippW5f4ibJ5k zXn9@jb)~$scj{R*baQnbnnrBB{$e$*{-M?<1s^{BeS67gPkybsok#5InA5^2{f&dK(MZ806llElm^N6^_T-_7f?# zmJS>xH4z=Nkqc{MJWn$8KUQA`CZlREVh-m<$JgQc|a;@j;NrKnAJ$_m{Xxo)&3^67z zID{p&zIaZ4oT9$S4Bp)AU1r75TV`*N>4#^}glwE_pvj~blqa0byjqg};Kf0K zc|w+>Jl=-)r;)Uqi5xL zINn#MJ2Y+4mX54>+H9}LMZVcy*QDy}n@y?wG+Lc4krK?=o+jbtlfdvR9#TzRj%R)u z2wI#ZywrC|y`zXJU!Kf!PkJm@)In{MQI@)1vuthP);vr@wH#}WD_MSj9+U@(sF(S% zso*2U0ZP}yMv+J(|Wgeky>kCaJ+-YGb+YQ|kY<*qV?5uA<1Kp{r0HZ4T9x-H1 z=lU@LD_Jb&Q@*U8bBC~^&)yq{_6xoop9V`0?PZz~kVF_#Xcc$oy^tnwyPE#6_;B*g zh(=Y43kGq~N+9`c?mcl5LuNl)x=c&*ymwm-(}7F8%QefY)!$mwXth%H6gU4vtK7+W zW23{z?&kwj=WLt~a{f&;{}g6g(Nmc6A0)zPr(m2=bG8quK%!(p_*!LzqzS=`0H8IZAG6AS!rqFg7#MSaH|fk$~HV77;d99 zO=p^TQbJbkRVL=SWQAHhg3U~}N=UM42Aa$7nQ82{x`N!uxU;0u4^uak=98hoQrq{9 zM#iyC+o)Svv-r)eOia8q|oAs zzvF$YQI#Z<%(eDCcZ`f6m#S0s^)}CAe~N&_1J;R@rO;h?Fm(;VHoyd%fYHM*XE@)# z&h#*oQz%lKq2yt2Jh51M&^jHFrgvZft{!unM|8aeV_1%SG9t~35s_nu_TjM}3d#|G zx$MCS^FE8)8}3cKD`%+e^0b-)>G&~Byad-gM@KOU!u=uU4x`Tc1xP)SGYn1F-hG93 zA8rDrLSNao?X<4Lo2Elm`w4V0OFG>%5Ys4vwRPZ+A`+ZEPKZYjGO235QVpOAdi()J zdDC|wC0{NJ9IR!z1a62Rxf&Ptd*WvjnhF6cf4Kd?VPyI^33(lqyX>*-f-f682-1P7 z?7;@0SqY9R+!lfqaCm|NE5AdV+bY4&JB=m5bU;hv5?TGzVe*~S8RQgPq9x6OTuGiR z_2p_lNdv)=Bgg{ck>&Dh&YMh`>wHlu+65H~M`hYET(X z3;HB&?PmJ+u)^+31z(OG+Mfg6mz{7Od)HBJ&s$|co60euOXdeI0kmddlTK9y!mE=? zUqL{US)AHjXEnUdH86tt!H3%C1j2~U8*iL8KjV6}3O&=e?^Jt5fx2-t4d}oo;~7wo zr3QFcR(5|r(Fsn`NbgE3$=L%5MpGxVj9}TU#*2#3c5zK-k4dmW4Z%d$@MyH?-zG(q z3X%iYkXoF*1&BR2Dv;s25&nJ8e#4MAl4%B3o{NgwYFHAKuYBe_ zDedfl53N8RTD~pMJG>X-7EmmLHOIG5_xY9}uGEn}oF`43F7xbQ1xnTsS^UlplB5^Y zsY>%9+qvb;kEci>;6@!wu2@$XA{L9E1@?UI+yE$(0X-}$Jl5EGVXE_jstWs|dK!R@ zMwN0Qr_q8z{O=BktrL4!C)cF(VLBmp`Nr1ZK{Fu;O+);M*w&4$@gMXR5ZzAWiDy@C zY>ofWOkxqc)<9KC`m|TAXNeZ@EUE=t@IvHTbkb!>U}V#^Z6O;f0={ScJ0-wNd$ri#MG2 zkEz?#@3W2vF9=LB%<#30^RKwUG|ImR{C)vAJjaPRgAT50L1U`Ig}XL*x^NPB#)`5+ z=HSVOej}=qAJad3lnwr#Qq2=a4&&`Jh~Joq?R7=o6MjLU4yw|*HOO^J1*Jc%+K$o2`P? z)QJr}Aeb%`Oydd`c5qDf8Y2S7%k&zvn9D;-j$-g7t8^)F z!-rUjz-uN>#IPgHdmLIvK4bE2+(Qc&pC=8(K>}~zD^i_KFjZ$nQK2Z96xs>WTMd}X zu$x%1_%qafLph^7r@$;e#O#=#t$$XNypa8$u+8C!m{B##YX(@}8d*~$tG=c5v82WC zG$eyu*f!#bcsbJPbg{kMGhaTo=e2oiyBAkkHfYq^)zLNSqet zgOX1o(cG?NFkl4G+g9$j)ElHQw$m-Pcl=v3h-%spD91)~q69z@X4G*Vd7XZAsoj8NVUU;+b~waEgtZnjA{9K^C$!E zLE-NJG|pDPgX6zP0ICp{;^Ro4AL`h7hKZkJF!A$4hfT2&Vw&cb(C_?%9^mbrG;VKXr-L9Mq*5nz`6MV=SB>~6^IxWrHTl9MkRW0m0BrHRLMEdh~se{>^5Zk zKqXCk6PJXMN_6l`2FySLw_=gJv8_6Ak^VxAg7=g>Q(0o^NP8VzKa(QIVV- z(_`P{#VkHb1{`0mWF@!+ad~!3SKE(=iFf?o?{YqpZm93CQWsRHC1!batZt3J&GuB5 z=v72_0h9*%E?08ladogB=Ey~lq!Im z<+Z5Am1;zAJg4DXWV- zS-TbP0?x%aAUZ^*LOHM%u0(eG*!$oPL@)Y{-Qv1*|RnV%7SDU$~-HB} z79z^9n??A`HLe`*E2lt&q@D)y&-7soU9_KGHi$_#+l#gVUpV`+C^Bb=p2`yoUBO%6 zx@t6Up*pQ|WX_^}0gE$bbAg^b8zjs9S&);2cOr&Gjl`R`Xx!SfH;qZkT5UgkxA_zzCB!VCIJ{(vD^XR+EtVpHq&{#!$j zS6sQ?Po|GK-X>$^ZjqPCe_5B#P88|Hxcng_8^j)&NdU;aNme`d43c8FpMIb+ERZiS2G~j7qtgr@=^Y zcj34@9l(KJ!-NzFHC?GK7cjKh(7(oIC)%4in2!`#nu+Dbu8QpMUS)9hIs z-fC#ntA@vu@YWwhut;36i&J=e7JQ_^`732#M!ozB%erLf1=rL{g3Bq?;j4HsZnIFJ zmGZW%XvxvHe5Dc((EhK;_vCm5eF#EKAa6jxaf1TxcNlQApn$Up1e^?zK8VOHgn~kz z98+-q%g70$@B?`~A#>k#Mu(FJKbU4zb&)GI-wb7kQ^5PjM?w#rk;|zAz*~zcTiE^R zR=yvdfEpccNAN%|G>A-s_ac0v*O%MO_2o`#As@{WkZVR9Gtpp6INyk~K5xeMF`IRq zqTo&l;n=|43&W}FgVU3rLe4r)(G(ED$suN?-zqn)jPAIy8Z5k;K?E1et(95h0#+cm zlI05Kq*S_(Vtk)DlGXw{j)3|9vkSWhvycDcshtt1?eHD{p`_dUaA4PygnJ(j=*@FWQ`!WezdSHXg2A2&*A7Z`c;J6@8}R-M}A1Srup|_Jh88>kn^9 z7|}QE2k+HKc!3KsKB_{e4NH+a8HPU0tjDK~6|3TAO&lBq=C_qz+mh8zSlo!UrMhzc zOX9Gc|NmbIH`CYc3qSySPJ^)5oBwEU;H_2PNn0UVjf~H!wY8Joj;!rw5?)`)lp$y% z)~xNF6hlS=r*2t0D|}ugfy!?PJXY`&p4W8E(R6wr&zg=oB+)UV4IcQ;a54=e-wm5F1j_;5v*e|$ z&uB?~(8Yy|5x3G$)#gg(Kf3x?z}on_x2dtgi!N&e}#&xmXv&D6|V@lO(S^s5i7? zqS?ke8_VVO4YpR_9!~YZT-dwx)gtk@AxtY>EcQ$63agh&CHO?VECYF1K%9sqJ-I&} zjR@B?zNN9h(}xM{~!5%eWs# zeiWy#p^JfH@2#WQlO{o>%yL;aij{H|P5Ksy2g9ZbJ1tPDD8yCNn8zxsd!e9TfsDRI z%WLAF(k*d3W4Y`{QmL0Shr)V8lz^iz7>HW;>KIiMO3AFPK0;evfB&w1kIUt9c?14f zgYR*rT-n0^w;^P!cJq2@er9q1`h&P{u@8dpljZgI??0pjWsFqrznJ>ijrcs*DLP__ zOrpRiq5h=(KU!1!{yox6?fU~hKEUGu9|!Q*$HzWA2KX4j;{+ck@c11czkk=vzqG%a ze|`V1{bg!@Vc=hysr|sG9}p93hd=2P3)&Vz+YmJ0s?h+bKNibM3!uPfLxwGqZ&;8- zTh}#c9BrMHqAAsW=~mq+MbnQnAewbTn2l^&Zd9Q^L%2tgi97Yk$7o>HX^&o#pK*G< zKTnX1QHGm_Sub;hV_$w1tn+D@I0)_9)vaPNd}G%dE$#dFdAW>VSmq>aYsYSclNnTc z_?2p5$f?deP^V~&^!_Og~ zzqBFQAa|<7etrEfX%se&Zsf(`vx*r>Y*rQ1slp5kBdYb__o689`*Fm2eAUo8P7kfk?ba7JYJSTfPh>>Llh_ZkB`NBmu`HCNQ%8s;cWpF4 zPJgcw5^R8WIvQoawna)I>_M~>Oo)g>Y&u!oNlP?B-4Uig z3)+r*ANeX>`pJR(SxUX6uiI`Ei@_V)s#GYwfjf#l66)FpZmA~+jJqfBCn28nm=YQ$ z!b!uv)-+RFTU%SxZjyrE-X#T}G_I|i9bxKZpEP&_`)`0uWqsW^X_P<=uAeln{SE78 zJ@IQiXWUl?X+yBmRoYHu{*xCY)2rWT`g z|o@23Tz6j3mV@iC;L+vP$Nts5_8GFNDkGkwMEMrn9~- z^&YJ{Et)Gp^^VAKLNvpi>xTJ+0nNV2tJdtAa;eQnQzU72Ok~G%LPCdPGtzYf9NO2{ zpG{4Drx~V4awBhSJe!*OPBTm~zF9n98uIit41(@7Wbeg?YRM}a535QeIrx@+E?AOI zNAY;VUWP6IZC`k5{rOZEDhX)#V}dufwF#!S!@_e)=4g!VY(yY1kE|^Rc1}s?9-q8 z-p+pu{hA111|Z^hV#dgW@X9TI$dtAs5bY4)gO1D#!`_AA&ITqoQJ@id{V&Pbcc-JI z4Bn0lqzY;9>lpM6j$zdZR8mFBtD+AR9WA!<3)8h7%`gLX2KjJ@8jt;`OAy*ClS(tp zC%7xF_ySy93gu^IjsYvOuY*lQD)c$06;qMZ@1Es0)@PEBnLXy1h%dFGR@|gMElNUIspw7&q1+96pC8mXfqc0h|A?i ze4U7i(Dh#ko4}~>nBC*T>F5D`6JNquoK{tOH3FymO!f5r5Se4(T^xX2z=0nS;BH^& zREjZW+C!0auOCiFF$~z~RB2^T5s?mJ}B{h%8I{9Q)NF zkF7h!B2w=ai-j*U-J#ZR;IYS0b7oF-Yb3{F8r%mTFWm3OV{RFvd~bq7f_)W213WO7 zlx%aqfEfExWwy5?eP-{j=z^J{HgGa@Ovipd)&173ulry}xVq}Ay3h;_)3smhWHYu8 z4|O<0J7x&rucl{@dU~9YN436P>7LO9UGm4{7uq5{BKo-_0=($_5ed#_h|8uMrjr2w zOk=29%YhnvMe%^i0}Z2z!Nf3~b-=vnvyM4?oE(n*=q!$AaRiN*uE*s-oeIa8aeiIU zdiRp$EHk*iSOU#a{!j^e?!XU_s0zQrbnLJ-#|nj}zoOIpmwGy8^4sh{ia`!yy7u{< z?ugzS^>oKrcb_Bu`0n=~m8D)dmuW-ue4JB9S|>AI*=tP>ziB4XT^g)b{#uj6 z<>8@P!S;6;D|~btCSXc^ zCnO((QLA-Ua&L)yPf2t<9ufSgpqS+nu*!qHL7o9Bcb(A)+>=f1aN@#^ngqmK`wR2? zYweL%c+FY+i@Rg)0DkkKqNlbEA z2qcn&$&A|*!!vVxIxe(fiHv=DgC11@#nF5jVL`oKRi;=gixELZY#4%`d`keAa*J>ZUAPLum^-C7l21XKOzA9 zMaM5+dHGP<5B0MTdT7Gk7u2sSwum5i3ous2hrx-vPIA2DwOv_+v#JnOvzFz&+?AOW zf|rirR2h=8TSw#c{@m0;(G#c6qD^3srD$ls-la~|bZ7N{(`+kt)(~VYxjSo!N8zvO zc?12{nS3CR2fj)v#}7UxUPqy0@el?xFacb0bQeyj9+{sFbO*{ndAuu0p1HTM(R5A6 z*8|f<503$Pp(5EW{QX^08xWNmPwZ}ogPaC?_U=*~YOJ^f3KE@wT<^i9t&o-r>_M%*!BMw$lQtrA5K#$>QlN~c)xg==Q^*Q`cAdz*eS*wyeSHtv3ow=`V!-j}So(@X zC=mFMlOh!;$BwMncvwh2qpzyEPfwAD9U+T58vtD4s0(vHwXNT&RFki&oSp3MU{!Kh zr6Bm!QQ&bp3mJY7wwE!Q;h}z-jL<=?H`W7mHpBtlSx~=5KL{fMEj|t4c+j4DiXN%k zNzwB%$T#86u7F*rFDXs@=LZE8{knW3nIA~uLCb2EZ=grI9cHe=Sl*@qWe?_Y6?Y>U za04rwalHp`BR+GIED;%QGMPrX(EXQlfhd{ztYWcnVM#>5sjq`o^7DfX%L3nYNge#J zZqcGY`yHPjWVi@H_zZ`~2U8OTbVA4>$2It^0^cP7PC&801MC1EckVU>r z!skOdmkzU7O2A0B8m$6A1Bk3;q|$l=uzs|kF`Ou%;)hfh1ucCZlRz0)bKbxOta-9^ zq7TEomkYeZ!R~VLqtf^tTi_QxpNkL9ugCd|?jF&tPp>B6(;-@HWhY$CrR9OHNW6Oc zKrq&VW3ee=yKc1{J7`J)+b!1)nv`Qk*Z5dnyLG~~$6z`cuH7SS8>L==QzJCt$%7sP zC7+|m$mZ$@ydTdV@9QxgO6ClH1k6nfikks!Pb*w5_0W!urf)IgZTe zVm@jZ&lrOzLso(`s;i8Q6)cwp&W8G>O6?2aePW`IPJc=WMHuZ{bn1{;1;KcE{n$^T zqp)>oUqZNCo%nDja~4=hZFwD6R6V!;G<3P7SRt)>|FZNt_CnHP(A@<7}!eBv(gp$fN)*XsAy{% z#b=+{Z1X{rNq~3>4O}48vCSE3;yqScAA7719%p83nEjHZj$|Lv^5w5=&g?>YXI3n_ zIaPt>FyyVC*U5+S6@wn?aiKS7aPEj(4phgckZc~{tzRy5Vq&Oa_6?)y*>Z?SlP|!S zbuK=?3!hJ$Z%!jTLYD>R93AVRB>dUMOm^+Z^$Mj0dtOk}kgj3Q?JnTaFZfLcv+2@o z9z%U$(5&$HTSwH$*tNUsm0}TwzYd@2n4V!Kox3m#mRTs9E=ag%_7iybfvOx+n;wZA z_m+69tXp{I z?8788o@Nqgh(5DN^eT2uGrTcFMn~{SZJW7P4$T8LX6rP1-<)G7Kl0;!$A0|Z5W_?p z7X5LfW4wmn23FfIagz!#x#{c}QUK1F&c+7C@|Ry|#X^RiVwq;&opLj=Ci9=0A0!+tS#dz_oe<)gE&0ju{)JDDcO+vE#M$R6RVy zjDi1COkFysji&TvxOzJhINV5<=tjPqpMIvY{k=Wpm*MU#zjy@~)mKwLGPMtYq5Aoy zD~EPRzIjoCpFxbr%6*2{cjZv593To;z~^EarUI%_snwBjo?5)n6nTY4@?i=;-@=4Z z8xsOre&Bn#pSwR#7g|R%<^4G(-GhPbxKUoxugB@6Rs~JwztUdb8~1%O$xZtHHl4I) zRZs|YOOvuQPi_b8r#}`89qy}rdqEs;IvFkUvT(h0@tc)K9kX#giUdU5DVkg;Ba4kB zWn>ot+UYIhf+FC|K)lQV%V0e{rj&^|$}y`)AzYw&Wky>juY*KEsyP4d+U11t$*R{| z~VE}ZZ>W2AC3Kitm<|iq%-muDBTlK18ew1_AtX8Z> zqq1cf=4Ux}t+rV=C_-AytVAxHM{E`413yf$lNIX})mXX+dDXz$1h&f%C(!R3YoPkg z7p+aJ+_089jNo#)THmT}8N0i?6`(R7Km}>WzaJp3QadPy_6sgE+z9?pKC`2YG&&h+ z<{*82airzs_FlS%_Qxm=7)sMAG@5+GfNlm!%w?#vEnHM+c(uG;=R=`FyYT(-3u82= zHe@J|RD{M%A!7zh`}k0&Wa-J38RP&%Qxmnmnr7Pn_%O$Z)smSA!2Mk7RB0s#Fut==$as&#z%6b#BzRWDtzw!=%w^n=3HIjg<2Oa#q4$ za9VhWFxb@9m18p`Xc7sIs50E&QKD?jqzXu)6s7Bh^pBlXB^q^_zQHQf0DPFoj+{-v z@E`z=Q-Dt7Wlqke%ung^2?efTp&;kKEhQg`IB4g$K^-g(gZ7GCRX1YAIkAzgHKL6TYe8_X3djneu}`3aTMUpmf#HqLIVHFR zdyHl&ysDs(N;CK*?S0Nckjtoy@dx_eOjaB8Gu-4{MEpc+l4dTKtDC&!5WkkS{S3?9 zWj85AX0GC441l`tCn_LTUZ9o$c!MBh2-J2EF%X#ZpSB7Rze%T5Hg5DF7f}XDW|}Yv z@&=VrEWYar9I{A1jnx6MVn|u6Td*dDvLSnF4WbN&RK>D5hLi$oc4$#%1*)7xrEETB z%S4`cI3N=?=SZL6#CxIfIujXmI}6o}(CrzF9?*RKYA~hR6pKI?Jg^$bZKUoVR^kuF0s5^9Par`DypRkvlD$L;oUaZ1*;w`I5>>qNtE@n*ZZ;Ia z)k?AWGezgDyx+>c2d6+>*AAv&0+P0M{-qGZP-Jl#)erhEmEEs~4DU&At-tHKPn=$G z;!A4ZPpP`%yca`HD1XezG@n0mFSuSCuYi0z&H~`s>51@9oAHdYPf~EH^cvu|v&W35M2l$ST6s7}DeTo{u1$A5k~s4aXGi$4^X3ChK={Vr3Ay^mQJum=W5;=8Rkm6I zRk=Av(|H3Q)6#j!?rwc)ZNoL61r+O>OOW_NRFvY#ajnX-QmH19cX#VNer^URb*U&h zY%MF*vYdle$z<_zwj2~(FIcAbaYE)Z6sfKO;KAB#>ci1b=4^?XROWC#b0!|~_E`gQ zuFvyBTia{z9~>SXzwNwxe{%Zatb2ZOdG+zr=PzHsIeph7gW;`zcRw0Wrn8?x7{w2d z^Tn^SRoSf8>W!`K_1Cs0Av($CX6QOiyV4A8aG&Z&o88@t z8QVHM7B`JIZ>mfGI$XDIc6Y0$hvDniP0^|uZ{Ae!Rpn-Pw{FgC`dqAUn&G;&YdbB^ zp26WgT(9if4yyVM=$%>{$dc_2Y_H3g&j zdR39Y$>UdekSk+&$A1&?5kqmB|stP!l+^sG=C1k*9^GTkvue|>$2ACPpX2!j`S z^(x$$7KRFd5bRJ@9_EXs>9L4i*@D(~-@K_WV`wmcecfbHSCs6sW7&%pQ>cR2u%of5 zEqitVCddvc-2oc%^s!YbmPbqdsRu?AMjGm{PM|O3w~7@h&zW0j(uf{`h^pfT4+Wlf z&gv#S=&x_U`JXnW1FA>G-`asI6&o-ts9rU8c&D5n3UlV*+PML51~q8ix&bw7DzI_` z8vIn?<_&0pb+=gG#5oY}?pBMN=E8;!uHlUFc6Td9t7gt^-NQ*#U(R4yEU4K7+;z&W zkS;BKqdBL+GbPwu7|rAvRL{=3UFBU2!yC1@cS+mR##8o!bJ-a9IHXL}K?x93sT)Bq zf%wM;b7l;Mrk+oe^KaBt+$oVDm5o_hwy5_;k^SR)@V|bTGkE%6KO{}ErQEV7)BuNF zw8cHUH{z5U6#S1X;ifb8T%Ahxey7fWilk4@N9DFPlh9sHV>J$Q;OmfPw#Zl)dh^uIvuo;f=2|Np0-(z2+YCF zYHwg&yA$cIr(CFN=u(7_KI{hW;upJZ1xjeJZNbSw)VO3)Ck)odL*p>4=3K< z#LF+HS4}sLlxx7}Ymcc_^RgBlpePH}6Gq{LuNy35)DR>L(Rjl{80mE9op`y`GttTj zE{Z3fsm*>n2C%#3Yy?1mYr|^3br|W8Nh?{fXrFbMle-c8`hyy&qsWx3(5N}v zua|4{fy|@dSL9PqS#I3(>@fJ$V-sVaL1bpy*F8^Lr@XO!YC9b4+CExRM!I_rkZ4W- zR+cNX@~8=(U54B!J;lbx+HSA|qJTnw!P-bZS&{^d0d^CQ9ksgwdGM!ksI)_aiz%mkGBmf?aE}Sh$B=<)FT}8ip9@B z6RzP8^yi83t3SiAc9Rl)^k~^A))Qn}r9^6+z>QPDzSW=H zht$a&tpu87G!mhJ86s4<3DL7y!D0ruK<*+_(+f00Xe_z$i^b2G{)lI&nqbueje1_J zS02Vnmt=Mg5T z1(^c^-?l2Xx-bJ-3zyDws&T86L$?Ah9ZH-4D zx@x-5X^JTt=LL=_R-(vTAo=ICV2y+LCvf&Oe`z5FkJL1eLKz8uJErDfC%^aA1L~Mc z#!@y+X$~DL%|ww{D*XvdB5a8P1cYp;rE4)bPpH1ga#;wLONLT=PZqEzvKvgnw&n2T zW}~=cQqwMfLP?JqyBx^VY+Iwfq0yqC*lYjB46gl~#HCZHJf)NciJGohq#-sY6D3Qa z0E2S`ql0cea3Y6RS)I?!f}E5F)8NoSZVnSRB;o|PA-OZykcbncoToo5B=h?xKp-2D zh@ihQOpOT&9{kCWhB(i*zmt@qga3`ai-;-SPEf#U46?IZC)8u3XzAg-;Pbq@w}_)B~j@wzQ`Lp($p`P$X>r( zUNO$(FSy0iZUrNv6(Df4bJeQO+S)|3x=NXuHCmgS?4h>JAIj{ZE?!wYGEY^j@`oCG zu*557C}~xBNR=h8a1`oIYm+~SkQ#re^M?k1*y0ah3pm50Klchw?>3&BuWqiWe9Lf| zb8&*dV2RE)08R%@UC3A!E@v~}@+HzeI&A0-?WL0Ac5caNiYk6>!Ss&Xf&wm~WPDX4Yidv8*VuthaPX_uy2GMxRo$2%I`B_r=c#3HVnwSV05XmA@ zLV^vcQ>@gmTwoCZq7#StaWaNXj@ZUSx!tK%QJB~G%Vl?(|3)q{=k<#fV7e6g@u6%q zm3(=awxz-<=0pwD;Ae!reRM|m*$x1aA}on)vxMI7OlY+ITgRV#c1HJrPYe8!vSf&< zVQ?7itRRc8)SECg7?t)8aF_U#m?WolVG5XjwS})-&Z?JwZ_$h+XP9|YZK7BtWk@JU zwgeNG;N}wSPPKYM#FZM+ypU(v(D0W!w)02zEfo|QPXM_=H&~mP_(P(8wgVa@?}BWY z&=={uxbo8XZ1yxJ!H{&sPdZPOxC}x^38S~syfC`wDlc3(y`V&hy0pb3qE;pp@MWIz zV&sI ze>||C;7Bm_h;+wbxbttB7(Vruf#gH$X45<{8Fl(K1N#@>m`&MdDRbk{%cb+~eYP-}swo3SIAHSGmMZgnweOQ>1&BL;0W=RIeYM9C}Y7!tO)Qxb;G zP?b`AqlpWHcCko`MICa{u?F8Dqp`E-1B%Wc=0;@qeaLdqz9t~fx`A{1n5F=~E+?@l z<+oX$q2eQdC}BpFN+kgFSPyptiOVG+j`0oiG$ve4%xuye35B^2qDG~;&Cp~OMmCPvbe)I{r@^A>l=!0wW=QaR>Jc*_cp~{YnGiULIv6t> zX!7;5i3hT;hl19R!I~sZtYEaIIHVvK30;Jgu=WKxM2Ho65SRHSOSr93qzy3ppHrjT zqk{OHDJOXHcEU>=5}?5lNb5+*02#`MVPmhF7=FLcms)M-B%P1wSazkZwEdR8s+HW|HzbR)?j{Xs=2eg`x6t=4SXmp* z)sb9bC+C2q9GB$?#uMykSJV7~{{B!NR8nh%)S=l=Dgc&P2|_-&Pam!-L0P7Hu~=40 zrIKSj!MZ_3ZbDAG=EC9;%8LgO9q2AB9w>liiw9u?EZ{@SSH_f^jH56$j>47WD9l?o zSkM8P1q3qkl4wa7EGfO1FDcLp`K?U4I)RTD4UJ2;^sxX`s{8PI4l z`mOs9bIe(L*$>u`?3dh{{{Pgh%xO)M-e>Z`=4$K1`Q*)t)FCRR<43w>iFspZLupPs<=@SCN z;*)(H02ja)W?B!moG8q?a^ol^jn6aNaEtyy-2KF(dQ4@VQk&;+R-AT}^Ws{mTQ{7QoL|G#JiR zfWsu$>?>`-bk#sJc99vE3epo7U@+ZF-ZqDR>)GH|xtSk3H?r&MdExvM$?A8;atX+; zIT82?o{LU%qJYYTJHmBzAB^0f$#QEBW_X};yMhxKYs{Bhk9Pv=?jh^$A$B)A=J^G2 zy2FLnmsbtLWU)deR%nMxEOwL<2S@2$lCGtMIky6RPv;aW6q~t3SDE`qI3d8~M07D?X zPwuB&dxrm3F>*&s!Uy;bos=##=RkX?uCaU#w54?~brK83Y9~bs)XGR5$=e?QHemWo zv0iHS<1|VT(;!!vvY8>>utn{-!8G-gVeAYETAZq*a8XT6MO3+RvBF3AFRFX*ROsOh z4GR`ks!^yCs;0XN2m$_?%P&_cBa3cIc99{Z;oU~70&Xi*7J;-Ql(a6Gjz5O}WJt4D ztWVT6S^r7BJOGGu8xB&ktU=|)O7l_~xHV*JS12dPy2qquN7KM1-qp0t>eyZ!;a;sk z+Bakiv>swUP(`D_lXC3cC#OUdHn+~i^HI2HAJudRT)Uk-8Xs1xlpWh2WcbWY-I&+& zQSD|&C%}}&#uIz2AuKe75gtXtN%(OTalgffnU0sf9YI#=*t<|KeRUOl-7$gw13*wm zeFvDg;jDk&;Jgrr`3aR#D_NF*8b~+I%{O3H9K6Ba|3;yozA$u{1(;5ZsgiIKIrBY4 zeG6$ZNa+}7&Z+0h*o9Ntc_d$~;s}w5Wlkn0q@4}yCucO8K2pO3;B5_s2YT3i^2m$; z_^a!auz9To1R-ki;O9ROnkb2{-Iy*djv9_dIssx{FsWHt26W_avNh;t#j^!bd*lQ| z5@qT~jh1q&0V@Y4Lh>9onR%GeYEc)l7$ufgxm+x6Up=ht?bc?qlJgyY zIK`_OT{W`v_<;m{C-TS4Ru31N)sr`s8~QNhWRNrBNywMShy>Hwf6$((oO0ST6=Ua5 zM_%qg6T>SRQ{22*7@%f97gsrGj9U`%4)&i8 z5~w{&z6V>-iW=pNw3Ts%gN8UiQJBx|rWk5}GK{kMzdVMd)&V>J6_xwH*K+Bx_)^QU zxc{>)2N|E{Z?-ut_UDUGCi~T&n8f+>g-BX6P zS&E$H9t`zJ@IdV%z?LmLVpDsGX8yyyC|d+BM5$~uO`Nku0wFzE%sHcfr&XlnziSn# z0Z*Om9w@!m%zxM+r_QWcoDJllKlpUq7~W<32JJlFg)eP8?-CG_7C0TSBu();TUs0v zYCCc?4bXq$$R{H&Ty+dKUpmB-(u&-YTD@={-fpf;pRM*}3c#wq>qmQ&MW(VKIdSus ziZ1v(YD#j=cqxA%hx<~2No1ggZazo9~PRQ+Y4VB`=iL8bRz0-Nx9bk?Jv&DOv_y! zfVb!DFel{;U_H1Cj9}qb2td>Y9 z3y1mMvGbP{)9tOet(l(&zdcczq(_oS;ufgJ8IJAW>}_T+w10DyH>0lj-W9h2HU75- z#9w)iR3m>`5ji*K`?(Z3IU%W$Ml<_`9nCy{fY;e$fEw!%OOiHe^|jYdm2v8%8tvPI zXtZ~!yuacnuh>YGsFKA{Lv``0p@Y{p_)5KRP|7gc7T_z@0niGtCqBG9RrLC8Nl@$d zlA|NL!B(4!)K(?R9#f{Eq}72Y`)~rYMRCrGdMX$wHo?b9KpgiLB7^F~wrzC4jCwE$ z)pwon5U|J;Z^-;C01~U!#2mVkjl>tj72+9M4;M40o13sb5;5W z$aNN+e)Y>0*R|y=6r`qD)~1!4v%ndSoe=!kb?q*kQ=LZ0{3^`QJ_&W-X!+NPbMH;l zH=W<-6vUIr2T*6zg-jfybCJx9YbXU#B6^?^pY2YAMAOLY_$g}`fa$sLV`)iHh9Z6F@*nm{*jdWAcn>TeM<{f9Ec>XmkbC2&ExoFQ}iaJY+#^h&t3(69rBJL!u=zM4piusUgbaY39Bn�=!j+jMQDF|H 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

      bLJhbcA)O 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 z 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%0DI`K8j`lw-@~97IIT< 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

      ?<5ZHy&fzW=K-iOk6Xp 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

      Ch`{ZSf*H%p^_?YbqBB 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 hHUSVJp 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

      ? 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�_S1zp6Qu|f^ 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%0A`Czmo46IRQcGKllDhc9vMh;NUeTyQp=FCqh>lqU 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

    1. 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

      E=$st4epO`7k6SY5pIqkr&`k@QAG#@7^Fz1T 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 be=cBf8()p*s#I5Y|>ddnJd!C^=0& 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 diff --git a/tsdown.config.ts b/tsdown.config.ts index e1e619a..d96d06d 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -1,18 +1,5 @@ -import { readFileSync } from "node:fs"; import { defineConfig } from "tsdown"; - -const pkg = JSON.parse(readFileSync("./package.json", "utf-8")) as { - dependencies?: Record; - peerDependencies?: Record; - version?: string; -}; - -const external = [ - ...Object.keys(pkg.dependencies ?? {}), - ...Object.keys(pkg.peerDependencies ?? {}), - "vite", - "postcss", -]; +import { version } from './package.json'; export default defineConfig({ entry: ["./src/sh.ts", "./src/generator.ts", "./src/index.ts", "./src/vite.ts", "./src/acl.ts"], @@ -20,12 +7,8 @@ export default defineConfig({ platform: "node", target: "esnext", dts: true, - deps: { - neverBundle: external, - onlyAllowBundle: false, - }, define: { - "process.env.OPENAPI_CODEGEN_VERSION": JSON.stringify(pkg.version ?? "unknown"), + "process.env.OPENAPI_CODEGEN_VERSION": JSON.stringify(version), "process.env.NODE_ENV": JSON.stringify("production"), }, }); From a8ad5ee122da5ef571633b83c6b2522b59e3f812 Mon Sep 17 00:00:00 2001 From: Jure Rotar Date: Thu, 26 Feb 2026 13:35:11 +0100 Subject: [PATCH 09/12] chore: converted to pnpm --- package.json | 19 +- pnpm-lock.yaml | 3870 ++++++++++++++++++++++++++++++++ tsdown.config.ts | 4 +- yarn.lock | 5517 ---------------------------------------------- 4 files changed, 3881 insertions(+), 5529 deletions(-) create mode 100644 pnpm-lock.yaml delete mode 100644 yarn.lock diff --git a/package.json b/package.json index a677c5b..3037101 100644 --- a/package.json +++ b/package.json @@ -51,19 +51,19 @@ "test:watch": "vitest", "build": "tsdown", "start:dist": "node ./dist/sh.mjs", - "gen:base": "rm -rf ./test/generated/base && mkdir -p ./test/generated/base && yarn start generate --config ./test/config.mjs --output ./test/generated/base --no-prettier", - "gen:next": "rm -rf ./test/generated/next && mkdir -p ./test/generated/next && yarn start generate --config ./test/config.mjs --output ./test/generated/next --no-prettier", + "gen:base": "rm -rf ./test/generated/base && mkdir -p ./test/generated/base && pnpm start generate --config ./test/config.mjs --output ./test/generated/base --no-prettier", + "gen:next": "rm -rf ./test/generated/next && mkdir -p ./test/generated/next && pnpm start generate --config ./test/config.mjs --output ./test/generated/next --no-prettier", "test:generated-eq": "vitest run ./src/generators/generated-output-eq.test.ts", - "gen:verify": "yarn gen:base && yarn gen:next && yarn test:generated-eq", + "gen:verify": "pnpm gen:base && pnpm gen:next && pnpm test:generated-eq", "typecheck": "tsc --noEmit", "lint": "oxlint --type-aware --fix", "lint:check": "oxlint --type-aware", "format": "oxfmt", "format:check": "oxfmt --check", - "check": "yarn typecheck && yarn lint && yarn test", - "push": "yarn exec ./scripts/publish.sh", - "dev:generate": "rm -rf ./output && yarn start generate --config ./test/config.mjs", - "dev:check": "yarn start check --config ./test/config.mjs", + "check": "pnpm typecheck && pnpm lint && pnpm test", + "push": "pnpm exec ./scripts/publish.sh", + "dev:generate": "rm -rf ./output && pnpm start generate --config ./test/config.mjs", + "dev:check": "pnpm start check --config ./test/config.mjs", "snapshot:openapi-localhost": "node ./scripts/snapshot-openapi-localhost.mjs", "bench:vite-codegen": "node ./scripts/benchmark-vite-codegen.mjs" }, @@ -121,8 +121,7 @@ }, "engines": { "node": ">= 14", - "npm": ">= 8", - "yarn": ">= 3.2" + "pnpm": ">= 9" }, - "packageManager": "yarn@4.12.0" + "packageManager": "pnpm@10.4.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..b30cf43 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3870 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@apidevtools/swagger-parser': + specifier: ^10.1.0 + version: 10.1.1(openapi-types@12.1.3) + axios: + specifier: ^1.13.1 + version: 1.13.5 + handlebars: + specifier: ^4.7.8 + version: 4.7.8 + i18next: + specifier: ^25.8.11 + version: 25.8.13(typescript@5.9.3) + import-fresh: + specifier: ^3.3.1 + version: 3.3.1 + openapi-types: + specifier: ^12.1.3 + version: 12.1.3 + prompt-sync: + specifier: ^4.2.0 + version: 4.2.0 + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + ts-pattern: + specifier: ^5.9.0 + version: 5.9.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + yargs: + specifier: ^18.0.0 + version: 18.0.0 + zod: + specifier: ^4.1.12 + version: 4.3.6 + devDependencies: + '@casl/ability': + specifier: ^6.8.0 + version: 6.8.0 + '@casl/react': + specifier: ^5.0.1 + version: 5.0.1(@casl/ability@6.8.0)(react@19.2.4) + '@tanstack/react-query': + specifier: ~5.90.21 + version: 5.90.21(react@19.2.4) + '@types/node': + specifier: ^25.3.0 + version: 25.3.1 + '@types/prompt-sync': + specifier: ^4.2.3 + version: 4.2.3 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/yargs': + specifier: ^17.0.35 + version: 17.0.35 + '@vitejs/plugin-react': + specifier: ^5.1.4 + version: 5.1.4(rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0)) + oxfmt: + specifier: ^0.34.0 + version: 0.34.0 + oxlint: + specifier: ^1.49.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) + oxlint-tsgolint: + specifier: ^0.14.1 + version: 0.14.2 + react: + specifier: ^19.2.4 + version: 19.2.4 + tsdown: + specifier: ^0.21.0-beta.1 + version: 0.21.0-beta.2(typescript@5.9.3) + tsx: + specifier: ^4.21.0 + version: 4.21.0 + type-fest: + specifier: ^5.4.4 + version: 5.4.4 + vite: + specifier: npm:rolldown-vite@^7.3.1 + version: rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0) + vite-plugin-dts: + specifier: ^4.5.4 + version: 4.5.4(@types/node@25.3.1)(rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0))(rollup@4.59.0)(typescript@5.9.3) + vitest: + specifier: 4.0.18 + version: 4.0.18(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0) + +packages: + + '@apidevtools/json-schema-ref-parser@11.7.2': + resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==} + engines: {node: '>= 16'} + + '@apidevtools/openapi-schemas@2.1.0': + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + + '@apidevtools/swagger-methods@3.0.2': + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + + '@apidevtools/swagger-parser@10.1.1': + resolution: {integrity: sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==} + peerDependencies: + openapi-types: '>=7' + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@8.0.0-rc.1': + resolution: {integrity: sha512-3ypWOOiC4AYHKr8vYRVtWtWmyvcoItHtVqF8paFax+ydpmUdPsJpLBkBBs5ItmhdrwC3a0ZSqqFAdzls4ODP3w==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@8.0.0-rc.2': + resolution: {integrity: sha512-noLx87RwlBEMrTzncWd/FvTxoJ9+ycHNg0n8yyYydIoDsLZuxknKgWRJUqcrVkNrJ74uGyhWQzQaS3q8xfGAhQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@8.0.0-rc.1': + resolution: {integrity: sha512-I4YnARytXC2RzkLNVnf5qFNFMzp679qZpmtw/V3Jt2uGnWiIxyJtaukjG7R8pSx8nG2NamICpGfljQsogj+FbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@8.0.0-rc.1': + resolution: {integrity: sha512-6HyyU5l1yK/7h9Ki52i5h6mDAx4qJdiLQO4FdCyJNoB/gy3T3GGJdhQzzbZgvgZCugYBvwtQiWRt94QKedHnkA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@babel/types@8.0.0-rc.1': + resolution: {integrity: sha512-ubmJ6TShyaD69VE9DQrlXcdkvJbmwWPB8qYj0H2kaJi29O7vJT9ajSdBd2W8CG34pwL9pYA74fi7RHC1qbLoVQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@casl/ability@6.8.0': + resolution: {integrity: sha512-Ipt4mzI4gSgnomFdaPjaLgY2MWuXqAEZLrU6qqWBB7khGiBBuuEp6ytYDnq09bRXqcjaeeHiaCvCGFbBA2SpvA==} + + '@casl/react@5.0.1': + resolution: {integrity: sha512-8E3GkvwlxEW+bkxWTdvjn6SALNJZa9khNk591xTpU27nPK/nzgfqsVfEvrFjYIQ2LODrxXsWLmw7iHPEI0/TaQ==} + peerDependencies: + '@casl/ability': ^4.0.0 || ^5.1.0 || ^6.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@microsoft/api-extractor-model@7.33.4': + resolution: {integrity: sha512-u1LTaNTikZAQ9uK6KG1Ms7nvNedsnODnspq/gH2dcyETWvH4hVNGNDvRAEutH66kAmxA4/necElqGNs1FggC8w==} + + '@microsoft/api-extractor@7.57.6': + resolution: {integrity: sha512-0rFv/D8Grzw1Mjs2+8NGUR+o4h9LVm5zKRtMeWnpdB5IMJF4TeHCL1zR5LMCIudkOvyvjbhMG5Wjs0B5nqsrRQ==} + hasBin: true + + '@microsoft/tsdoc-config@0.18.1': + resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==} + + '@microsoft/tsdoc@0.16.0': + resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + + '@oxc-project/runtime@0.101.0': + resolution: {integrity: sha512-t3qpfVZIqSiLQ5Kqt/MC4Ge/WCOGrrcagAdzTcDaggupjiGxUx4nJF2v6wUCXWSzWHn5Ns7XLv13fCJEwCOERQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/types@0.101.0': + resolution: {integrity: sha512-nuFhqlUzJX+gVIPPfuE6xurd4lST3mdcWOhyK/rZO0B9XWMKm79SuszIQEnSMmmDhq1DC8WWVYGVd+6F93o1gQ==} + + '@oxc-project/types@0.114.0': + resolution: {integrity: sha512-//nBfbzHQHvJs8oFIjv6coZ6uxQ4alLfiPe6D5vit6c4pmxATHHlVwgB1k+Hv4yoAMyncdxgRBF5K4BYWUCzvA==} + + '@oxfmt/binding-android-arm-eabi@0.34.0': + resolution: {integrity: sha512-sqkqjh/Z38l+duOb1HtVqJTAj1grt2ttkobCopC/72+a4Xxz4xUgZPFyQ4HxrYMvyqO/YA0tvM1QbfOu70Gk1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.34.0': + resolution: {integrity: sha512-1KRCtasHcVcGOMwfOP9d5Bus2NFsN8yAYM5cBwi8LBg5UtXC3C49WHKrlEa8iF1BjOS6CR2qIqiFbGoA0DJQNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.34.0': + resolution: {integrity: sha512-b+Rmw9Bva6e/7PBES2wLO8sEU7Mi0+/Kv+pXSe/Y8i4fWNftZZlGwp8P01eECaUqpXATfSgNxdEKy7+ssVNz7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.34.0': + resolution: {integrity: sha512-QGjpevWzf1T9COEokZEWt80kPOtthW1zhRbo7x4Qoz646eTTfi6XsHG2uHeDWJmTbgBoJZPMgj2TAEV/ppEZaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.34.0': + resolution: {integrity: sha512-VMSaC02cG75qL59M9M/szEaqq/RsLfgpzQ4nqUu8BUnX1zkiZIW2gTpUv3ZJ6qpWnHxIlAXiRZjQwmcwpvtbcg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.34.0': + resolution: {integrity: sha512-Klm367PFJhH6vYK3vdIOxFepSJZHPaBfIuqwxdkOcfSQ4qqc/M8sgK0UTFnJWWTA/IkhMIh1kW6uEqiZ/xtQqg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.34.0': + resolution: {integrity: sha512-nqn0QueVXRfbN9m58/E9Zij0Ap8lzayx591eWBYn0sZrGzY1IRv9RYS7J/1YUXbb0Ugedo0a8qIWzUHU9bWQuA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.34.0': + resolution: {integrity: sha512-DDn+dcqW+sMTCEjvLoQvC/VWJjG7h8wcdN/J+g7ZTdf/3/Dx730pQElxPPGsCXPhprb11OsPyMp5FwXjMY3qvA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.34.0': + resolution: {integrity: sha512-H+F8+71gHQoGTFPPJ6z4dD0Fzfzi0UP8Zx94h5kUmIFThLvMq5K1Y/bUUubiXwwHfwb5C3MPjUpYijiy0rj51Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.34.0': + resolution: {integrity: sha512-dIGnzTNhCXqQD5pzBwduLg8pClm+t8R53qaE9i5h8iua1iaFAJyLffh4847CNZSlASb7gn1Ofuv7KoG/EpoGZg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-gnu@0.34.0': + resolution: {integrity: sha512-FGQ2GTTooilDte/ogwWwkHuuL3lGtcE3uKM2EcC7kOXNWdUfMY6Jx3JCodNVVbFoybv4A+HuCj8WJji2uu1Ceg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.34.0': + resolution: {integrity: sha512-2dGbGneJ7ptOIVKMwEIHdCkdZEomh74X3ggo4hCzEXL/rl9HwfsZDR15MkqfQqAs6nVXMvtGIOMxjDYa5lwKaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.34.0': + resolution: {integrity: sha512-cCtGgmrTrxq3OeSG0UAO+w6yLZTMeOF4XM9SAkNrRUxYhRQELSDQ/iNPCLyHhYNi38uHJQbS5RQweLUDpI4ajA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.34.0': + resolution: {integrity: sha512-7AvMzmeX+k7GdgitXp99GQoIV/QZIpAS7rwxQvC/T541yWC45nwvk4mpnU8N+V6dE5SPEObnqfhCjO80s7qIsg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-linux-x64-musl@0.34.0': + resolution: {integrity: sha512-uNiglhcmivJo1oDMh3hoN/Z0WsbEXOpRXZdQ3W/IkOpyV8WF308jFjSC1ZxajdcNRXWej0zgge9QXba58Owt+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.34.0': + resolution: {integrity: sha512-5eFsTjCyji25j6zznzlMc+wQAZJoL9oWy576xhqd2efv+N4g1swIzuSDcb1dz4gpcVC6veWe9pAwD7HnrGjLwg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.34.0': + resolution: {integrity: sha512-6id8kK0t5hKfbV6LHDzRO21wRTA6ctTlKGTZIsG/mcoir0rssvaYsedUymF4HDj7tbCUlnxCX/qOajKlEuqbIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.34.0': + resolution: {integrity: sha512-QHaz+w673mlYqn9v/+fuiKZpjkmagleXQ+NygShDv8tdHpRYX2oYhTJwwt9j1ZfVhRgza1EIUW3JmzCXmtPdhQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.34.0': + resolution: {integrity: sha512-CXKQM/VaF+yuvGru8ktleHLJoBdjBtTFmAsLGePiESiTN0NjCI/PiaiOCfHMJ1HdP1LykvARUwMvgaN3tDhcrg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint-tsgolint/darwin-arm64@0.14.2': + resolution: {integrity: sha512-03WxIXguCXf1pTmoG2C6vqRcbrU9GaJCW6uTIiQdIQq4BrJnVWZv99KEUQQRkuHK78lOLa9g7B4K58NcVcB54g==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.14.2': + resolution: {integrity: sha512-ksMLl1cIWz3Jw+U79BhyCPdvohZcJ/xAKri5bpT6oeEM2GVnQCHBk/KZKlYrd7hZUTxz0sLnnKHE11XFnLASNQ==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.14.2': + resolution: {integrity: sha512-2BgR535w7GLxBCyQD5DR3dBzbAgiBbG5QX1kAEVzOmWxJhhGxt5lsHdHebRo7ilukYLpBDkerz0mbMErblghCQ==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.14.2': + resolution: {integrity: sha512-TUHFyVHfbbGtnTQZbUFgwvv3NzXBgzNLKdMUJw06thpiC7u5OW5qdk4yVXIC/xeVvdl3NAqTfcT4sA32aiMubg==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.14.2': + resolution: {integrity: sha512-OfYHa/irfVggIFEC4TbawsI7Hwrttppv//sO/e00tu4b2QRga7+VHAwtCkSFWSr0+BsO4InRYVA0+pun5BinpQ==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.14.2': + resolution: {integrity: sha512-5gxwbWYE2pP+pzrO4SEeYvLk4N609eAe18rVXUx+en3qtHBkU8VM2jBmMcZdIHn+G05leu4pYvwAvw6tvT9VbA==} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.50.0': + resolution: {integrity: sha512-G7MRGk/6NCe+L8ntonRdZP7IkBfEpiZ/he3buLK6JkLgMHgJShXZ+BeOwADmspXez7U7F7L1Anf4xLSkLHiGTg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.50.0': + resolution: {integrity: sha512-GeSuMoJWCVpovJi/e3xDSNgjeR8WEZ6MCXL6EtPiCIM2NTzv7LbflARINTXTJy2oFBYyvdf/l2PwHzYo6EdXvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.50.0': + resolution: {integrity: sha512-w3SY5YtxGnxCHPJ8Twl3KmS9oja1gERYk3AMoZ7Hv8P43ZtB6HVfs02TxvarxfL214Tm3uzvc2vn+DhtUNeKnw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.50.0': + resolution: {integrity: sha512-hNfogDqy7tvmllXKBSlHo6k5x7dhTUVOHbMSE15CCAcXzmqf5883aPvBYPOq9AE7DpDUQUZ1kVE22YbiGW+tuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.50.0': + resolution: {integrity: sha512-ykZevOWEyu0nsxolA911ucxpEv0ahw8jfEeGWOwwb/VPoE4xoexuTOAiPNlWZNJqANlJl7yp8OyzCtXTUAxotw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.50.0': + resolution: {integrity: sha512-hif3iDk7vo5GGJ4OLCCZAf2vjnU9FztGw4L0MbQL0M2iY9LKFtDMMiQAHmkF0PQGQMVbTYtPdXCLKVgdkiqWXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.50.0': + resolution: {integrity: sha512-dVp9iSssiGAnTNey2Ruf6xUaQhdnvcFOJyRWd/mu5o2jVbFK15E5fbWGeFRfmuobu5QXuROtFga44+7DOS3PLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.50.0': + resolution: {integrity: sha512-1cT7yz2HA910CKA9NkH1ZJo50vTtmND2fkoW1oyiSb0j6WvNtJ0Wx2zoySfXWc/c+7HFoqRK5AbEoL41LOn9oA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.50.0': + resolution: {integrity: sha512-++B3k/HEPFVlj89cOz8kWfQccMZB/aWL9AhsW7jPIkG++63Mpwb2cE9XOEsd0PATbIan78k2Gky+09uWM1d/gQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.50.0': + resolution: {integrity: sha512-Z9b/KpFMkx66w3gVBqjIC1AJBTZAGoI9+U+K5L4QM0CB/G0JSNC1es9b3Y0Vcrlvtdn8A+IQTkYjd/Q0uCSaZw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.50.0': + resolution: {integrity: sha512-jvmuIw8wRSohsQlFNIST5uUwkEtEJmOQYr33bf/K2FrFPXHhM4KqGekI3ShYJemFS/gARVacQFgBzzJKCAyJjg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.50.0': + resolution: {integrity: sha512-x+UrN47oYNh90nmAAyql8eQaaRpHbDPu5guasDg10+OpszUQ3/1+1J6zFMmV4xfIEgTcUXG/oI5fxJhF4eWCNA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.50.0': + resolution: {integrity: sha512-i/JLi2ljLUIVfekMj4ISmdt+Hn11wzYUdRRrkVUYsCWw7zAy5xV7X9iA+KMyM156LTFympa7s3oKBjuCLoTAUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.50.0': + resolution: {integrity: sha512-/C7brhn6c6UUPccgSPCcpLQXcp+xKIW/3sji/5VZ8/OItL3tQ2U7KalHz887UxxSQeEOmd1kY6lrpuwFnmNqOA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.50.0': + resolution: {integrity: sha512-oDR1f+bGOYU8LfgtEW8XtotWGB63ghtcxk5Jm6IDTCk++rTA/IRMsjOid2iMd+1bW+nP9Mdsmcdc7VbPD3+iyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.50.0': + resolution: {integrity: sha512-4CmRGPp5UpvXyu4jjP9Tey/SrXDQLRvZXm4pb4vdZBxAzbFZkCyh0KyRy4txld/kZKTJlW4TO8N1JKrNEk+mWw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.50.0': + resolution: {integrity: sha512-Fq0M6vsGcFsSfeuWAACDhd5KJrO85ckbEfe1EGuBj+KPyJz7KeWte2fSFrFGmNKNXyhEMyx4tbgxiWRujBM2KQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.50.0': + resolution: {integrity: sha512-qTdWR9KwY/vxJGhHVIZG2eBOhidOQvOwzDxnX+jhW/zIVacal1nAhR8GLkiywW8BIFDkQKXo/zOfT+/DY+ns/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.50.0': + resolution: {integrity: sha512-682t7npLC4G2Ca+iNlI9fhAKTcFPYYXJjwoa88H4q+u5HHHlsnL/gHULapX3iqp+A8FIJbgdylL5KMYo2LaluQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-Ok9V8o7o6YfSdTTYA/uHH30r3YtOxLD6G3wih/U9DO0ucBBFq8WPt/DslU53OgfteLRHITZny9N/qCUxMf9kjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-android-arm64@1.0.0-rc.5': + resolution: {integrity: sha512-zCEmUrt1bggwgBgeKLxNj217J1OrChrp3jJt24VK9jAharSTeVaHODNL+LpcQVhRz+FktYWfT9cjo5oZ99ZLpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-yIsKqMz0CtRnVa6x3Pa+mzTihr4Ty+Z6HfPbZ7RVbk1Uxnco4+CUn7Qbm/5SBol1JD/7nvY8rphAgyAi7Lj6Vg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.5': + resolution: {integrity: sha512-ZP9xb9lPAex36pvkNWCjSEJW/Gfdm9I3ssiqOFLmpZ/vosPXgpoGxCmh+dX1Qs+/bWQE6toNFXWWL8vYoKoK9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.53': + resolution: {integrity: sha512-GTXe+mxsCGUnJOFMhfGWmefP7Q9TpYUseHvhAhr21nCTgdS8jPsvirb0tJwM3lN0/u/cg7bpFNa16fQrjKrCjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.5': + resolution: {integrity: sha512-7IdrPunf6dp9mywMgTOKMMGDnMHQ6+h5gRl6LW8rhD8WK2kXX0IwzcM5Zc0B5J7xQs8QWOlKjv8BJsU/1CD3pg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.53': + resolution: {integrity: sha512-9Tmp7bBvKqyDkMcL4e089pH3RsjD3SUungjmqWtyhNOxoQMh0fSmINTyYV8KXtE+JkxYMPWvnEt+/mfpVCkk8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.5': + resolution: {integrity: sha512-o/JCk+dL0IN68EBhZ4DqfsfvxPfMeoM6cJtxORC1YYoxGHZyth2Kb2maXDb4oddw2wu8iIbnYXYPEzBtAF5CAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.53': + resolution: {integrity: sha512-a1y5fiB0iovuzdbjUxa7+Zcvgv+mTmlGGC4XydVIsyl48eoxgaYkA3l9079hyTyhECsPq+mbr0gVQsFU11OJAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.5': + resolution: {integrity: sha512-IIBwTtA6VwxQLcEgq2mfrUgam7VvPZjhd/jxmeS1npM+edWsrrpRLHUdze+sk4rhb8/xpP3flemgcZXXUW6ukw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.53': + resolution: {integrity: sha512-bpIGX+ov9PhJYV+wHNXl9rzq4F0QvILiURn0y0oepbQx+7stmQsKA0DhPGwmhfvF856wq+gbM8L92SAa/CBcLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.5': + resolution: {integrity: sha512-KSol1De1spMZL+Xg7K5IBWXIvRWv7+pveaxFWXpezezAG7CS6ojzRjtCGCiLxQricutTAi/LkNWKMsd2wNhMKQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': + resolution: {integrity: sha512-bGe5EBB8FVjHBR1mOLOPEFg1Lp3//7geqWkU5NIhxe+yH0W8FVrQ6WRYOap4SUTKdklD/dC4qPLREkMMQ855FA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.5': + resolution: {integrity: sha512-WFljyDkxtXRlWxMjxeegf7xMYXxUr8u7JdXlOEWKYgDqEgxUnSEsVDxBiNWQ1D5kQKwf8Wo4sVKEYPRhCdsjwA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': + resolution: {integrity: sha512-qL+63WKVQs1CMvFedlPt0U9PiEKJOAL/bsHMKUDS6Vp2Q+YAv/QLPu8rcvkfIMvQ0FPU2WL0aX4eWwF6e/GAnA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.5': + resolution: {integrity: sha512-CUlplTujmbDWp2gamvrqVKi2Or8lmngXT1WxsizJfts7JrvfGhZObciaY/+CbdbS9qNnskvwMZNEhTPrn7b+WA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.53': + resolution: {integrity: sha512-VGl9JIGjoJh3H8Mb+7xnVqODajBmrdOOb9lxWXdcmxyI+zjB2sux69br0hZJDTyLJfvBoYm439zPACYbCjGRmw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.5': + resolution: {integrity: sha512-wdf7g9NbVZCeAo2iGhsjJb7I8ZFfs6X8bumfrWg82VK+8P6AlLXwk48a1ASiJQDTS7Svq2xVzZg3sGO2aXpHRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-B4iIserJXuSnNzA5xBLFUIjTfhNy7d9sq4FUMQY3GhQWGVhS2RWWzzDnkSU6MUt7/aHUrep0CdQfXUJI9D3W7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.5': + resolution: {integrity: sha512-0CWY7ubu12nhzz+tkpHjoG3IRSTlWYe0wrfJRf4qqjqQSGtAYgoL9kwzdvlhaFdZ5ffVeyYw9qLsChcjUMEloQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': + resolution: {integrity: sha512-BUjAEgpABEJXilGq/BPh7jeU3WAJ5o15c1ZEgHaDWSz3LB881LQZnbNJHmUiM4d1JQWMYYyR1Y490IBHi2FPJg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.5': + resolution: {integrity: sha512-LztXnGzv6t2u830mnZrFLRVqT/DPJ9DL4ZTz/y93rqUVkeHjMMYIYaFj+BUthiYxbVH9dH0SZYufETspKY/NhA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': + resolution: {integrity: sha512-s27uU7tpCWSjHBnxyVXHt3rMrQdJq5MHNv3BzsewCIroIw3DJFjMH1dzCPPMUFxnh1r52Nf9IJ/eWp6LDoyGcw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.5': + resolution: {integrity: sha512-jUct1XVeGtyjqJXEAfvdFa8xoigYZ2rge7nYEm70ppQxpfH9ze2fbIrpHmP2tNM2vL/F6Dd0CpXhpjPbC6bSxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': + resolution: {integrity: sha512-cjWL/USPJ1g0en2htb4ssMjIycc36RvdQAx1WlXnS6DpULswiUTVXPDesTifSKYSyvx24E0YqQkEm0K/M2Z/AA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.5': + resolution: {integrity: sha512-VQ8F9ld5gw29epjnVGdrx8ugiLTe8BMqmhDYy7nGbdeDo4HAt4bgdZvLbViEhg7DZyHLpiEUlO5/jPSUrIuxRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + + '@rolldown/pluginutils@1.0.0-rc.3': + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} + + '@rolldown/pluginutils@1.0.0-rc.5': + resolution: {integrity: sha512-RxlLX/DPoarZ9PtxVrQgZhPoor987YtKQqCo5zkjX+0S0yLJ7Vv515Wk6+xtTL67VONKJKxETWZwuZjss2idYw==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.59.0': + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.59.0': + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.59.0': + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.59.0': + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.59.0': + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.59.0': + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.59.0': + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.59.0': + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.59.0': + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.59.0': + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.59.0': + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.59.0': + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.59.0': + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@5.20.3': + resolution: {integrity: sha512-95JgEPq2k7tHxhF9/OJnnyHDXfC9cLhhta0An/6MlkDsX2A6dTzDrTUG18vx4vjc280V0fi0xDH9iQczpSuWsw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/problem-matcher@0.2.1': + resolution: {integrity: sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.7.2': + resolution: {integrity: sha512-9XbFWuqMYcHUso4mnETfhGVUSaADBRj6HUAAEYk50nMPn8WRICmBuCphycQGNB3duIR6EEZX3Xj3SYc2XiP+9A==} + + '@rushstack/terminal@0.22.3': + resolution: {integrity: sha512-gHC9pIMrUPzAbBiI4VZMU7Q+rsCzb8hJl36lFIulIzoceKotyKL3Rd76AZ2CryCTKEg+0bnTj406HE5YY5OQvw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@5.3.3': + resolution: {integrity: sha512-c+ltdcvC7ym+10lhwR/vWiOhsrm/bP3By2VsFcs5qTKv+6tTmxgbVrtJ5NdNjANiV5TcmOZgUN+5KYQ4llsvEw==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@tanstack/query-core@5.90.20': + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} + + '@tanstack/react-query@5.90.21': + resolution: {integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==} + peerDependencies: + react: ^18 || ^19 + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@25.3.1': + resolution: {integrity: sha512-hj9YIJimBCipHVfHKRMnvmHg+wfhKc0o4mTtXh9pKBjC8TLJzz0nzGmLi5UJsYAUgSvXFHgb0V2oY10DUFtImw==} + + '@types/prompt-sync@4.2.3': + resolution: {integrity: sha512-Ox77gCSx0YyeakGt/qfOZUSFNSSi+sh3ABoGOiCwiO2KODx492BJnUm9oIXS+AHJtqp12iM4RduY6viTJ9bYwA==} + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + + '@ucast/core@1.10.2': + resolution: {integrity: sha512-ons5CwXZ/51wrUPfoduC+cO7AS1/wRb0ybpQJ9RrssossDxVy4t49QxWoWgfBDvVKsz9VXzBk9z0wqTdZ+Cq8g==} + + '@ucast/js@3.1.0': + resolution: {integrity: sha512-eJ7yQeYtMK85UZjxoxBEbTWx6UMxEXKbjVyp+NlzrT5oMKV5Gpo/9bjTl3r7msaXTVC8iD9NJacqJ8yp7joX+Q==} + + '@ucast/mongo2js@1.4.1': + resolution: {integrity: sha512-9aeg5cmqwRQnKCXHN6I17wk83Rcm487bHelaG8T4vfpWneAI469wSI3Srnbu+PuZ5znWRbnwtVq9RgPL+bN6CA==} + + '@ucast/mongo@2.4.3': + resolution: {integrity: sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA==} + + '@vitejs/plugin-react@5.1.4': + resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vue/compiler-core@3.5.29': + resolution: {integrity: sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==} + + '@vue/compiler-dom@3.5.29': + resolution: {integrity: sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/shared@3.5.29': + resolution: {integrity: sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==} + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-kit@3.0.0-beta.1: + resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} + engines: {node: '>=20.19.0'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.13.5: + resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.0: + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + engines: {node: '>=6.0.0'} + hasBin: true + + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + + brace-expansion@5.0.3: + resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==} + engines: {node: 18 || 20 || >=22} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001774: + resolution: {integrity: sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + + dts-resolver@2.1.3: + resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} + engines: {node: '>=20.19.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.302: + resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hookable@6.0.1: + resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==} + + i18next@25.8.13: + resolution: {integrity: sha512-E0vzjBY1yM+nsFrtgkjLhST2NBkirkvOVoQa0MSldhsuZ3jUge7ZNpuwG0Cfc74zwo5ZwRzg3uOgT+McBn32iA==} + peerDependencies: + typescript: ^5 + peerDependenciesMeta: + typescript: + optional: true + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + import-without-cache@0.2.5: + resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} + engines: {node: '>=20.19.0'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + lightningcss-android-arm64@1.31.1: + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.31.1: + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.31.1: + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.31.1: + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.31.1: + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.31.1: + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.31.1: + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.31.1: + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.31.1: + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.31.1: + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.31.1: + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.31.1: + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + engines: {node: '>= 12.0.0'} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@10.2.1: + resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==} + engines: {node: 20 || >=22} + + minimatch@9.0.8: + resolution: {integrity: sha512-reYkDYtj/b19TeqbNZCV4q9t+Yxylf/rYBsLb42SXJatTv4/ylq5lEiAmhA/IToxO7NI2UzNMghHoHuaqDkAjw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + oxfmt@0.34.0: + resolution: {integrity: sha512-t+zTE4XGpzPTK+Zk9gSwcJcFi4pqjl6PwO/ZxPBJiJQ2XCKMucwjPlHxvPHyVKJtkMSyrDGfQ7Ntg/hUr4OgHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint-tsgolint@0.14.2: + resolution: {integrity: sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==} + hasBin: true + + oxlint@1.50.0: + resolution: {integrity: sha512-iSJ4IZEICBma8cZX7kxIIz9PzsYLF2FaLAYN6RKu7VwRVKdu7RIgpP99bTZaGl//Yao7fsaGZLSEo5xBrI5ReQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.14.1' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prompt-sync@4.2.0: + resolution: {integrity: sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + rolldown-plugin-dts@0.22.2: + resolution: {integrity: sha512-Ge+XF962Kobjr0hRPx1neVnLU2jpKkD2zevZTfPKf/0el4eYo9SyGPm0stiHDG2JQuL0Q3HLD0Kn+ST8esvVdA==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-rc.3 + typescript: ^5.0.0 || ^6.0.0-beta + vue-tsc: ~3.2.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown-vite@7.3.1: + resolution: {integrity: sha512-LYzdNAjRHhF2yA4JUQm/QyARyi216N2rpJ0lJZb8E9FU2y5v6Vk+xq/U4XBOxMefpWixT5H3TslmAHm1rqIq2w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + esbuild: ^0.27.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + rolldown@1.0.0-beta.53: + resolution: {integrity: sha512-Qd9c2p0XKZdgT5AYd+KgAMggJ8ZmCs3JnS9PTMWkyUfteKlfmKtxJbWTHkVakxwXs1Ub7jrRYVeFeF7N0sQxyw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rolldown@1.0.0-rc.5: + resolution: {integrity: sha512-0AdalTs6hNTioaCYIkAa7+xsmHBfU5hCNclZnM/lp7lGGDuUOb6N4BVNtwiomybbencDjq/waKjTImqiGCs5sw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-pattern@5.9.0: + resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} + + tsdown@0.21.0-beta.2: + resolution: {integrity: sha512-OKj8mKf0ws1ucxuEi3mO/OGyfRQxO9MY2D6SoIE/7RZcbojsZSBhJr4xC4MNivMqrQvi3Ke2e+aRZDemPBWPCw==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@vitejs/devtools': '*' + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@vitejs/devtools': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-fest@5.4.4: + resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} + engines: {node: '>=20'} + + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unrun@0.2.28: + resolution: {integrity: sha512-LqMrI3ZEUMZ2476aCsbUTfy95CHByqez05nju4AQv4XFPkxh5yai7Di1/Qb0FoELHEEPDWhQi23EJeFyrBV0Og==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + synckit: ^0.11.11 + peerDependenciesMeta: + synckit: + optional: true + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + vite-plugin-dts@4.5.4: + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + +snapshots: + + '@apidevtools/json-schema-ref-parser@11.7.2': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.1 + + '@apidevtools/openapi-schemas@2.1.0': {} + + '@apidevtools/swagger-methods@3.0.2': {} + + '@apidevtools/swagger-parser@10.1.1(openapi-types@12.1.3)': + dependencies: + '@apidevtools/json-schema-ref-parser': 11.7.2 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + ajv: 8.18.0 + ajv-draft-04: 1.0.0(ajv@8.18.0) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.0': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@8.0.0-rc.1': + dependencies: + '@babel/parser': 8.0.0-rc.1 + '@babel/types': 8.0.0-rc.1 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-string-parser@8.0.0-rc.2': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-identifier@8.0.0-rc.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/parser@8.0.0-rc.1': + dependencies: + '@babel/types': 8.0.0-rc.1 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/runtime@7.28.6': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@babel/types@8.0.0-rc.1': + dependencies: + '@babel/helper-string-parser': 8.0.0-rc.2 + '@babel/helper-validator-identifier': 8.0.0-rc.1 + + '@casl/ability@6.8.0': + dependencies: + '@ucast/mongo2js': 1.4.1 + + '@casl/react@5.0.1(@casl/ability@6.8.0)(react@19.2.4)': + dependencies: + '@casl/ability': 6.8.0 + react: 19.2.4 + + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.3': + optional: true + + '@esbuild/android-arm64@0.27.3': + optional: true + + '@esbuild/android-arm@0.27.3': + optional: true + + '@esbuild/android-x64@0.27.3': + optional: true + + '@esbuild/darwin-arm64@0.27.3': + optional: true + + '@esbuild/darwin-x64@0.27.3': + optional: true + + '@esbuild/freebsd-arm64@0.27.3': + optional: true + + '@esbuild/freebsd-x64@0.27.3': + optional: true + + '@esbuild/linux-arm64@0.27.3': + optional: true + + '@esbuild/linux-arm@0.27.3': + optional: true + + '@esbuild/linux-ia32@0.27.3': + optional: true + + '@esbuild/linux-loong64@0.27.3': + optional: true + + '@esbuild/linux-mips64el@0.27.3': + optional: true + + '@esbuild/linux-ppc64@0.27.3': + optional: true + + '@esbuild/linux-riscv64@0.27.3': + optional: true + + '@esbuild/linux-s390x@0.27.3': + optional: true + + '@esbuild/linux-x64@0.27.3': + optional: true + + '@esbuild/netbsd-arm64@0.27.3': + optional: true + + '@esbuild/netbsd-x64@0.27.3': + optional: true + + '@esbuild/openbsd-arm64@0.27.3': + optional: true + + '@esbuild/openbsd-x64@0.27.3': + optional: true + + '@esbuild/openharmony-arm64@0.27.3': + optional: true + + '@esbuild/sunos-x64@0.27.3': + optional: true + + '@esbuild/win32-arm64@0.27.3': + optional: true + + '@esbuild/win32-ia32@0.27.3': + optional: true + + '@esbuild/win32-x64@0.27.3': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jsdevtools/ono@7.1.3': {} + + '@microsoft/api-extractor-model@7.33.4(@types/node@25.3.1)': + dependencies: + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.20.3(@types/node@25.3.1) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.57.6(@types/node@25.3.1)': + dependencies: + '@microsoft/api-extractor-model': 7.33.4(@types/node@25.3.1) + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.20.3(@types/node@25.3.1) + '@rushstack/rig-package': 0.7.2 + '@rushstack/terminal': 0.22.3(@types/node@25.3.1) + '@rushstack/ts-command-line': 5.3.3(@types/node@25.3.1) + diff: 8.0.3 + lodash: 4.17.23 + minimatch: 10.2.1 + resolve: 1.22.11 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.18.1': + dependencies: + '@microsoft/tsdoc': 0.16.0 + ajv: 8.18.0 + jju: 1.4.0 + resolve: 1.22.11 + + '@microsoft/tsdoc@0.16.0': {} + + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/runtime@0.101.0': {} + + '@oxc-project/types@0.101.0': {} + + '@oxc-project/types@0.114.0': {} + + '@oxfmt/binding-android-arm-eabi@0.34.0': + optional: true + + '@oxfmt/binding-android-arm64@0.34.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.34.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.34.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.34.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.34.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.34.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.34.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.34.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.34.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.34.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.34.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.34.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.34.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.34.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.34.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.34.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.34.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.34.0': + optional: true + + '@oxlint-tsgolint/darwin-arm64@0.14.2': + optional: true + + '@oxlint-tsgolint/darwin-x64@0.14.2': + optional: true + + '@oxlint-tsgolint/linux-arm64@0.14.2': + optional: true + + '@oxlint-tsgolint/linux-x64@0.14.2': + optional: true + + '@oxlint-tsgolint/win32-arm64@0.14.2': + optional: true + + '@oxlint-tsgolint/win32-x64@0.14.2': + optional: true + + '@oxlint/binding-android-arm-eabi@1.50.0': + optional: true + + '@oxlint/binding-android-arm64@1.50.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.50.0': + optional: true + + '@oxlint/binding-darwin-x64@1.50.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.50.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.50.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.50.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.50.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.50.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.50.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.50.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.50.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.50.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.50.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.50.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.50.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.50.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.50.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.50.0': + optional: true + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-android-arm64@1.0.0-rc.5': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.5': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.5': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.5': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.5': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.5': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.5': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.5': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.5': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.5': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.5': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.5': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.5': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.53': {} + + '@rolldown/pluginutils@1.0.0-rc.3': {} + + '@rolldown/pluginutils@1.0.0-rc.5': {} + + '@rollup/pluginutils@5.3.0(rollup@4.59.0)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.59.0 + + '@rollup/rollup-android-arm-eabi@4.59.0': + optional: true + + '@rollup/rollup-android-arm64@4.59.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.59.0': + optional: true + + '@rollup/rollup-darwin-x64@4.59.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.59.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.59.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.59.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.59.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.59.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.59.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.59.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.59.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.59.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.59.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.59.0': + optional: true + + '@rushstack/node-core-library@5.20.3(@types/node@25.3.1)': + dependencies: + ajv: 8.18.0 + ajv-draft-04: 1.0.0(ajv@8.18.0) + ajv-formats: 3.0.1(ajv@8.18.0) + fs-extra: 11.3.3 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.11 + semver: 7.5.4 + optionalDependencies: + '@types/node': 25.3.1 + + '@rushstack/problem-matcher@0.2.1(@types/node@25.3.1)': + optionalDependencies: + '@types/node': 25.3.1 + + '@rushstack/rig-package@0.7.2': + dependencies: + resolve: 1.22.11 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.22.3(@types/node@25.3.1)': + dependencies: + '@rushstack/node-core-library': 5.20.3(@types/node@25.3.1) + '@rushstack/problem-matcher': 0.2.1(@types/node@25.3.1) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 25.3.1 + + '@rushstack/ts-command-line@5.3.3(@types/node@25.3.1)': + dependencies: + '@rushstack/terminal': 0.22.3(@types/node@25.3.1) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@standard-schema/spec@1.1.0': {} + + '@tanstack/query-core@5.90.20': {} + + '@tanstack/react-query@5.90.21(react@19.2.4)': + dependencies: + '@tanstack/query-core': 5.90.20 + react: 19.2.4 + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/argparse@1.0.38': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/jsesc@2.5.1': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@25.3.1': + dependencies: + undici-types: 7.18.2 + + '@types/prompt-sync@4.2.3': {} + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@ucast/core@1.10.2': {} + + '@ucast/js@3.1.0': + dependencies: + '@ucast/core': 1.10.2 + + '@ucast/mongo2js@1.4.1': + dependencies: + '@ucast/core': 1.10.2 + '@ucast/js': 3.1.0 + '@ucast/mongo': 2.4.3 + + '@ucast/mongo@2.4.3': + dependencies: + '@ucast/core': 1.10.2 + + '@vitejs/plugin-react@5.1.4(rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.3 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@4.0.18': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0) + + '@vitest/pretty-format@4.0.18': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.18': + dependencies: + '@vitest/utils': 4.0.18 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.18': {} + + '@vitest/utils@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.29': + dependencies: + '@babel/parser': 7.29.0 + '@vue/shared': 3.5.29 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.29': + dependencies: + '@vue/compiler-core': 3.5.29 + '@vue/shared': 3.5.29 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.0(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.28 + '@vue/compiler-dom': 3.5.29 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.29 + alien-signals: 0.4.14 + minimatch: 9.0.8 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.9.3 + + '@vue/shared@3.5.29': {} + + acorn@8.16.0: {} + + ajv-draft-04@1.0.0(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + alien-signals@0.4.14: {} + + ansi-regex@4.1.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@6.2.3: {} + + ansis@4.2.0: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + assertion-error@2.0.1: {} + + ast-kit@3.0.0-beta.1: + dependencies: + '@babel/parser': 8.0.0-rc.1 + estree-walker: 3.0.3 + pathe: 2.0.3 + + asynckit@0.4.0: {} + + axios@1.13.5: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.0: {} + + birpc@4.0.0: {} + + brace-expansion@5.0.3: + dependencies: + balanced-match: 4.0.4 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.10.0 + caniuse-lite: 1.0.30001774 + electron-to-chromium: 1.5.302 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-me-maybe@1.0.2: {} + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001774: {} + + chai@6.2.2: {} + + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + compare-versions@6.1.1: {} + + confbox@0.1.8: {} + + confbox@0.2.4: {} + + convert-source-map@2.0.0: {} + + csstype@3.2.3: {} + + de-indent@1.0.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + detect-libc@2.1.2: {} + + diff@8.0.3: {} + + dts-resolver@2.1.3: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.302: {} + + emoji-regex@10.6.0: {} + + empathic@2.0.0: {} + + entities@7.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + + escalade@3.2.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + expect-type@1.3.0: {} + + exsolve@1.0.8: {} + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.0: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + follow-redirects@1.15.11: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs-extra@11.3.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.5.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-tsconfig@4.13.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hookable@6.0.1: {} + + i18next@25.8.13(typescript@5.9.3): + dependencies: + '@babel/runtime': 7.28.6 + optionalDependencies: + typescript: 5.9.3 + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + import-without-cache@0.2.5: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kolorist@1.8.0: {} + + lightningcss-android-arm64@1.31.1: + optional: true + + lightningcss-darwin-arm64@1.31.1: + optional: true + + lightningcss-darwin-x64@1.31.1: + optional: true + + lightningcss-freebsd-x64@1.31.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.31.1: + optional: true + + lightningcss-linux-arm64-gnu@1.31.1: + optional: true + + lightningcss-linux-arm64-musl@1.31.1: + optional: true + + lightningcss-linux-x64-gnu@1.31.1: + optional: true + + lightningcss-linux-x64-musl@1.31.1: + optional: true + + lightningcss-win32-arm64-msvc@1.31.1: + optional: true + + lightningcss-win32-x64-msvc@1.31.1: + optional: true + + lightningcss@1.31.1: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.31.1 + lightningcss-darwin-arm64: 1.31.1 + lightningcss-darwin-x64: 1.31.1 + lightningcss-freebsd-x64: 1.31.1 + lightningcss-linux-arm-gnueabihf: 1.31.1 + lightningcss-linux-arm64-gnu: 1.31.1 + lightningcss-linux-arm64-musl: 1.31.1 + lightningcss-linux-x64-gnu: 1.31.1 + lightningcss-linux-x64-musl: 1.31.1 + lightningcss-win32-arm64-msvc: 1.31.1 + lightningcss-win32-x64-msvc: 1.31.1 + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + lodash@4.17.23: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@10.2.1: + dependencies: + brace-expansion: 5.0.3 + + minimatch@9.0.8: + dependencies: + brace-expansion: 5.0.3 + + minimist@1.2.8: {} + + mlly@1.8.0: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + neo-async@2.6.2: {} + + node-releases@2.0.27: {} + + obug@2.1.1: {} + + openapi-types@12.1.3: {} + + oxfmt@0.34.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.34.0 + '@oxfmt/binding-android-arm64': 0.34.0 + '@oxfmt/binding-darwin-arm64': 0.34.0 + '@oxfmt/binding-darwin-x64': 0.34.0 + '@oxfmt/binding-freebsd-x64': 0.34.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.34.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.34.0 + '@oxfmt/binding-linux-arm64-gnu': 0.34.0 + '@oxfmt/binding-linux-arm64-musl': 0.34.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.34.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.34.0 + '@oxfmt/binding-linux-riscv64-musl': 0.34.0 + '@oxfmt/binding-linux-s390x-gnu': 0.34.0 + '@oxfmt/binding-linux-x64-gnu': 0.34.0 + '@oxfmt/binding-linux-x64-musl': 0.34.0 + '@oxfmt/binding-openharmony-arm64': 0.34.0 + '@oxfmt/binding-win32-arm64-msvc': 0.34.0 + '@oxfmt/binding-win32-ia32-msvc': 0.34.0 + '@oxfmt/binding-win32-x64-msvc': 0.34.0 + + oxlint-tsgolint@0.14.2: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.14.2 + '@oxlint-tsgolint/darwin-x64': 0.14.2 + '@oxlint-tsgolint/linux-arm64': 0.14.2 + '@oxlint-tsgolint/linux-x64': 0.14.2 + '@oxlint-tsgolint/win32-arm64': 0.14.2 + '@oxlint-tsgolint/win32-x64': 0.14.2 + + oxlint@1.50.0(oxlint-tsgolint@0.14.2): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.50.0 + '@oxlint/binding-android-arm64': 1.50.0 + '@oxlint/binding-darwin-arm64': 1.50.0 + '@oxlint/binding-darwin-x64': 1.50.0 + '@oxlint/binding-freebsd-x64': 1.50.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.50.0 + '@oxlint/binding-linux-arm-musleabihf': 1.50.0 + '@oxlint/binding-linux-arm64-gnu': 1.50.0 + '@oxlint/binding-linux-arm64-musl': 1.50.0 + '@oxlint/binding-linux-ppc64-gnu': 1.50.0 + '@oxlint/binding-linux-riscv64-gnu': 1.50.0 + '@oxlint/binding-linux-riscv64-musl': 1.50.0 + '@oxlint/binding-linux-s390x-gnu': 1.50.0 + '@oxlint/binding-linux-x64-gnu': 1.50.0 + '@oxlint/binding-linux-x64-musl': 1.50.0 + '@oxlint/binding-openharmony-arm64': 1.50.0 + '@oxlint/binding-win32-arm64-msvc': 1.50.0 + '@oxlint/binding-win32-ia32-msvc': 1.50.0 + '@oxlint/binding-win32-x64-msvc': 1.50.0 + oxlint-tsgolint: 0.14.2 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-browserify@1.0.1: {} + + path-parse@1.0.7: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.4 + exsolve: 1.0.8 + pathe: 2.0.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prompt-sync@4.2.0: + dependencies: + strip-ansi: 5.2.0 + + proxy-from-env@1.1.0: {} + + quansync@0.2.11: {} + + quansync@1.0.0: {} + + react-refresh@0.18.0: {} + + react@19.2.4: {} + + reflect-metadata@0.2.2: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rolldown-plugin-dts@0.22.2(rolldown@1.0.0-rc.5)(typescript@5.9.3): + dependencies: + '@babel/generator': 8.0.0-rc.1 + '@babel/helper-validator-identifier': 8.0.0-rc.1 + '@babel/parser': 8.0.0-rc.1 + '@babel/types': 8.0.0-rc.1 + ast-kit: 3.0.0-beta.1 + birpc: 4.0.0 + dts-resolver: 2.1.3 + get-tsconfig: 4.13.6 + obug: 2.1.1 + rolldown: 1.0.0-rc.5 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - oxc-resolver + + rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0): + dependencies: + '@oxc-project/runtime': 0.101.0 + fdir: 6.5.0(picomatch@4.0.3) + lightningcss: 1.31.1 + picomatch: 4.0.3 + postcss: 8.5.6 + rolldown: 1.0.0-beta.53 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.3.1 + esbuild: 0.27.3 + fsevents: 2.3.3 + tsx: 4.21.0 + + rolldown@1.0.0-beta.53: + dependencies: + '@oxc-project/types': 0.101.0 + '@rolldown/pluginutils': 1.0.0-beta.53 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.53 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.53 + '@rolldown/binding-darwin-x64': 1.0.0-beta.53 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.53 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.53 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.53 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.53 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.53 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.53 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.53 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.53 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.53 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.53 + + rolldown@1.0.0-rc.5: + dependencies: + '@oxc-project/types': 0.114.0 + '@rolldown/pluginutils': 1.0.0-rc.5 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.5 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.5 + '@rolldown/binding-darwin-x64': 1.0.0-rc.5 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.5 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.5 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.5 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.5 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.5 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.5 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.5 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.5 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.5 + + rollup@4.59.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.59.0 + '@rollup/rollup-android-arm64': 4.59.0 + '@rollup/rollup-darwin-arm64': 4.59.0 + '@rollup/rollup-darwin-x64': 4.59.0 + '@rollup/rollup-freebsd-arm64': 4.59.0 + '@rollup/rollup-freebsd-x64': 4.59.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 + '@rollup/rollup-linux-arm64-musl': 4.59.0 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 + '@rollup/rollup-linux-loong64-musl': 4.59.0 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 + '@rollup/rollup-linux-x64-gnu': 4.59.0 + '@rollup/rollup-linux-x64-musl': 4.59.0 + '@rollup/rollup-openbsd-x64': 4.59.0 + '@rollup/rollup-openharmony-arm64': 4.59.0 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 + '@rollup/rollup-win32-x64-gnu': 4.59.0 + '@rollup/rollup-win32-x64-msvc': 4.59.0 + fsevents: 2.3.3 + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.4: {} + + siginfo@2.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + string-argv@0.3.2: {} + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.5.0 + strip-ansi: 7.1.2 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-json-comments@3.1.1: {} + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tagged-tag@1.0.0: {} + + tinybench@2.9.0: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@2.1.0: {} + + tinyrainbow@3.0.3: {} + + tree-kill@1.2.2: {} + + ts-pattern@5.9.0: {} + + tsdown@0.21.0-beta.2(typescript@5.9.3): + dependencies: + ansis: 4.2.0 + cac: 6.7.14 + defu: 6.1.4 + empathic: 2.0.0 + hookable: 6.0.1 + import-without-cache: 0.2.5 + obug: 2.1.1 + picomatch: 4.0.3 + rolldown: 1.0.0-rc.5 + rolldown-plugin-dts: 0.22.2(rolldown@1.0.0-rc.5)(typescript@5.9.3) + semver: 7.7.4 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + unconfig-core: 7.5.0 + unrun: 0.2.28 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - synckit + - vue-tsc + + tslib@2.8.1: + optional: true + + tsx@4.21.0: + dependencies: + esbuild: 0.27.3 + get-tsconfig: 4.13.6 + optionalDependencies: + fsevents: 2.3.3 + + type-fest@5.4.4: + dependencies: + tagged-tag: 1.0.0 + + typescript@5.8.2: {} + + typescript@5.9.3: {} + + ufo@1.6.3: {} + + uglify-js@3.19.3: + optional: true + + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + undici-types@7.18.2: {} + + universalify@2.0.1: {} + + unrun@0.2.28: + dependencies: + rolldown: 1.0.0-rc.5 + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + vite-plugin-dts@4.5.4(@types/node@25.3.1)(rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0))(rollup@4.59.0)(typescript@5.9.3): + dependencies: + '@microsoft/api-extractor': 7.57.6(@types/node@25.3.1) + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@volar/typescript': 2.4.28 + '@vue/language-core': 2.2.0(typescript@5.9.3) + compare-versions: 6.1.1 + debug: 4.4.3 + kolorist: 1.8.0 + local-pkg: 1.1.2 + magic-string: 0.30.21 + typescript: 5.9.3 + optionalDependencies: + vite: rolldown-vite@7.3.1(@types/node@25.3.1)(esbuild@0.27.3)(tsx@4.21.0) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite@7.3.1(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.59.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.3.1 + fsevents: 2.3.3 + lightningcss: 1.31.1 + tsx: 4.21.0 + + vitest@4.0.18(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@25.3.1)(lightningcss@1.31.1)(tsx@4.21.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.3.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + vscode-uri@3.1.0: {} + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wordwrap@1.0.0: {} + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yargs-parser@22.0.0: {} + + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + zod@4.3.6: {} diff --git a/tsdown.config.ts b/tsdown.config.ts index d96d06d..8f0d0e8 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from "tsdown"; -import { version } from './package.json'; +import packageJson from './package.json' with { type: 'json' }; export default defineConfig({ entry: ["./src/sh.ts", "./src/generator.ts", "./src/index.ts", "./src/vite.ts", "./src/acl.ts"], @@ -8,7 +8,7 @@ export default defineConfig({ target: "esnext", dts: true, define: { - "process.env.OPENAPI_CODEGEN_VERSION": JSON.stringify(version), + "process.env.OPENAPI_CODEGEN_VERSION": JSON.stringify(packageJson.version), "process.env.NODE_ENV": JSON.stringify("production"), }, }); diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index f8eee30..0000000 --- a/yarn.lock +++ /dev/null @@ -1,5517 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@apidevtools/json-schema-ref-parser@npm:9.0.6": - version: 9.0.6 - resolution: "@apidevtools/json-schema-ref-parser@npm:9.0.6" - dependencies: - "@jsdevtools/ono": "npm:^7.1.3" - call-me-maybe: "npm:^1.0.1" - js-yaml: "npm:^3.13.1" - checksum: 10c0/fc2cde5d8f99480bce78d9578d8c691f4a24fe1360aa52c22015d69ebb71c9caf27f9baa64239b69224ddc0d3c34792fc368a1a7fa3c55e26902cbbcd2f7ae53 - languageName: node - linkType: hard - -"@apidevtools/openapi-schemas@npm:^2.1.0": - version: 2.1.0 - resolution: "@apidevtools/openapi-schemas@npm:2.1.0" - checksum: 10c0/f4aa0f9df32e474d166c84ef91bceb18fa1c4f44b5593879529154ef340846811ea57dc2921560f157f692262827d28d988dd6e19fb21f00320e9961964176b4 - languageName: node - linkType: hard - -"@apidevtools/swagger-methods@npm:^3.0.2": - version: 3.0.2 - resolution: "@apidevtools/swagger-methods@npm:3.0.2" - checksum: 10c0/8c390e8e50c0be7787ba0ba4c3758488bde7c66c2d995209b4b48c1f8bc988faf393cbb24a4bd1cd2d42ce5167c26538e8adea5c85eb922761b927e4dab9fa1c - languageName: node - linkType: hard - -"@apidevtools/swagger-parser@npm:^10.1.0": - version: 10.1.0 - resolution: "@apidevtools/swagger-parser@npm:10.1.0" - dependencies: - "@apidevtools/json-schema-ref-parser": "npm:9.0.6" - "@apidevtools/openapi-schemas": "npm:^2.1.0" - "@apidevtools/swagger-methods": "npm:^3.0.2" - "@jsdevtools/ono": "npm:^7.1.3" - ajv: "npm:^8.6.3" - ajv-draft-04: "npm:^1.0.0" - call-me-maybe: "npm:^1.0.1" - peerDependencies: - openapi-types: ">=7" - checksum: 10c0/9a81529af6498a26e1d981bbbaccc02d1c7513ec4fdaa56c5f8fd048a73c171f6f92e55e85befa6fafc1bc4901be93c8af476fedc969cbf71b264c4f69cece84 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/code-frame@npm:7.29.0" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.28.5" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.1.1" - checksum: 10c0/d34cc504e7765dfb576a663d97067afb614525806b5cad1a5cc1a7183b916fec8ff57fa233585e3926fd5a9e6b31aae6df91aa81ae9775fb7a28f658d3346f0d - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.28.6": - version: 7.29.0 - resolution: "@babel/compat-data@npm:7.29.0" - checksum: 10c0/08f348554989d23aa801bf1405aa34b15e841c0d52d79da7e524285c77a5f9d298e70e11d91cc578d8e2c9542efc586d50c5f5cf8e1915b254a9dcf786913a94 - languageName: node - linkType: hard - -"@babel/core@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/core@npm:7.29.0" - dependencies: - "@babel/code-frame": "npm:^7.29.0" - "@babel/generator": "npm:^7.29.0" - "@babel/helper-compilation-targets": "npm:^7.28.6" - "@babel/helper-module-transforms": "npm:^7.28.6" - "@babel/helpers": "npm:^7.28.6" - "@babel/parser": "npm:^7.29.0" - "@babel/template": "npm:^7.28.6" - "@babel/traverse": "npm:^7.29.0" - "@babel/types": "npm:^7.29.0" - "@jridgewell/remapping": "npm:^2.3.5" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/5127d2e8e842ae409e11bcbb5c2dff9874abf5415e8026925af7308e903f4f43397341467a130490d1a39884f461bc2b67f3063bce0be44340db89687fd852aa - languageName: node - linkType: hard - -"@babel/generator@npm:8.0.0-rc.1": - version: 8.0.0-rc.1 - resolution: "@babel/generator@npm:8.0.0-rc.1" - dependencies: - "@babel/parser": "npm:^8.0.0-rc.1" - "@babel/types": "npm:^8.0.0-rc.1" - "@jridgewell/gen-mapping": "npm:^0.3.12" - "@jridgewell/trace-mapping": "npm:^0.3.28" - "@types/jsesc": "npm:^2.5.0" - jsesc: "npm:^3.0.2" - checksum: 10c0/476ae68898837e85a4749b20b572d8d5d66f0e90adff54e55ec24ec7f481e2d1af9923cf86c24d504463dd0c30d2713234d0df3d53600eecc8d26abef819eb69 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/generator@npm:7.29.0" - dependencies: - "@babel/parser": "npm:^7.29.0" - "@babel/types": "npm:^7.29.0" - "@jridgewell/gen-mapping": "npm:^0.3.12" - "@jridgewell/trace-mapping": "npm:^0.3.28" - jsesc: "npm:^3.0.2" - checksum: 10c0/5c3df8f2475bfd5f97ad0211c52171aff630088b148e7b89d056b39d69855179bc9f2d1ee200263c76c2398a49e4fdbb38b9709ebc4f043cc04d9ee09a66668a - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-compilation-targets@npm:7.28.6" - dependencies: - "@babel/compat-data": "npm:^7.28.6" - "@babel/helper-validator-option": "npm:^7.27.1" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/3fcdf3b1b857a1578e99d20508859dbd3f22f3c87b8a0f3dc540627b4be539bae7f6e61e49d931542fe5b557545347272bbdacd7f58a5c77025a18b745593a50 - languageName: node - linkType: hard - -"@babel/helper-globals@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/helper-globals@npm:7.28.0" - checksum: 10c0/5a0cd0c0e8c764b5f27f2095e4243e8af6fa145daea2b41b53c0c1414fe6ff139e3640f4e2207ae2b3d2153a1abd346f901c26c290ee7cb3881dd922d4ee9232 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-module-imports@npm:7.28.6" - dependencies: - "@babel/traverse": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10c0/b49d8d8f204d9dbfd5ac70c54e533e5269afb3cea966a9d976722b13e9922cc773a653405f53c89acb247d5aebdae4681d631a3ae3df77ec046b58da76eda2ac - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-module-transforms@npm:7.28.6" - dependencies: - "@babel/helper-module-imports": "npm:^7.28.6" - "@babel/helper-validator-identifier": "npm:^7.28.5" - "@babel/traverse": "npm:^7.28.6" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/6f03e14fc30b287ce0b839474b5f271e72837d0cafe6b172d759184d998fbee3903a035e81e07c2c596449e504f453463d58baa65b6f40a37ded5bec74620b2b - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.27.1": - version: 7.28.6 - resolution: "@babel/helper-plugin-utils@npm:7.28.6" - checksum: 10c0/3f5f8acc152fdbb69a84b8624145ff4f9b9f6e776cb989f9f968f8606eb7185c5c3cfcf3ba08534e37e1e0e1c118ac67080610333f56baa4f7376c99b5f1143d - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-string-parser@npm:7.27.1" - checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^8.0.0-rc.1, @babel/helper-string-parser@npm:^8.0.0-rc.2": - version: 8.0.0-rc.2 - resolution: "@babel/helper-string-parser@npm:8.0.0-rc.2" - checksum: 10c0/74b5107ed84c99948651a52ebd880d91f0c307fcf0273b75c79552b2c5469c27573640a5187c87df636e96c247a43c57be70bdac1ce06c29a30aefd499952121 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:8.0.0-rc.1": - version: 8.0.0-rc.1 - resolution: "@babel/helper-validator-identifier@npm:8.0.0-rc.1" - checksum: 10c0/440f44c7bf6d82fa070f401c68a0e8ae4e6f6e178ba023fea4aac3221bfe5f66c94f7f3ed9bddff704982f94f88df8155c3b946cd5b0f8a7d9e57f26bb2098c2 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/helper-validator-identifier@npm:7.28.5" - checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^8.0.0-rc.1, @babel/helper-validator-identifier@npm:^8.0.0-rc.2": - version: 8.0.0-rc.2 - resolution: "@babel/helper-validator-identifier@npm:8.0.0-rc.2" - checksum: 10c0/9a1687e18bfb50728ae38b1dac889c1a3bc2c53bdf4c1632533b1b0672cc272c087507a2a7c60c3af20d58bd645e169dd685f892d2a62d580e759e26d67e8788 - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-validator-option@npm:7.27.1" - checksum: 10c0/6fec5f006eba40001a20f26b1ef5dbbda377b7b68c8ad518c05baa9af3f396e780bdfded24c4eef95d14bb7b8fd56192a6ed38d5d439b97d10efc5f1a191d148 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helpers@npm:7.28.6" - dependencies: - "@babel/template": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10c0/c4a779c66396bb0cf619402d92f1610601ff3832db2d3b86b9c9dd10983bf79502270e97ac6d5280cea1b1a37de2f06ecbac561bd2271545270407fbe64027cb - languageName: node - linkType: hard - -"@babel/parser@npm:8.0.0-rc.1": - version: 8.0.0-rc.1 - resolution: "@babel/parser@npm:8.0.0-rc.1" - dependencies: - "@babel/types": "npm:^8.0.0-rc.1" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/f09a4694bee40d9ba27aa7ccca3eb4d8dedf2ac17cbaa53f47f6aca5b0eb2a2bbdf1dfed99ba1e082731278424217265f7187f74cc6928d5d77e4aaafeb4d41d - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.28.5, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/parser@npm:7.29.0" - dependencies: - "@babel/types": "npm:^7.29.0" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/333b2aa761264b91577a74bee86141ef733f9f9f6d4fc52548e4847dc35dfbf821f58c46832c637bfa761a6d9909d6a68f7d1ed59e17e4ffbb958dc510c17b62 - languageName: node - linkType: hard - -"@babel/parser@npm:^8.0.0-beta.4, @babel/parser@npm:^8.0.0-rc.1": - version: 8.0.0-rc.2 - resolution: "@babel/parser@npm:8.0.0-rc.2" - dependencies: - "@babel/types": "npm:^8.0.0-rc.2" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/704ddbc1fce338e5b8df6327c1a7eeb1a554d136f89738135a8be5f5e2e854bd3f05eb3946b9d7b6814491bcd677175496076657696674eaecbed0e582749b2e - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-self@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/00a4f917b70a608f9aca2fb39aabe04a60aa33165a7e0105fd44b3a8531630eb85bf5572e9f242f51e6ad2fa38c2e7e780902176c863556c58b5ba6f6e164031 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-source@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5e67b56c39c4d03e59e03ba80692b24c5a921472079b63af711b1d250fc37c1733a17069b63537f750f3e937ec44a42b1ee6a46cd23b1a0df5163b17f741f7f2 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/runtime@npm:7.28.4" - checksum: 10c0/792ce7af9750fb9b93879cc9d1db175701c4689da890e6ced242ea0207c9da411ccf16dc04e689cc01158b28d7898c40d75598f4559109f761c12ce01e959bf7 - languageName: node - linkType: hard - -"@babel/template@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/template@npm:7.28.6" - dependencies: - "@babel/code-frame": "npm:^7.28.6" - "@babel/parser": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10c0/66d87225ed0bc77f888181ae2d97845021838c619944877f7c4398c6748bcf611f216dfd6be74d39016af502bca876e6ce6873db3c49e4ac354c56d34d57e9f5 - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/traverse@npm:7.29.0" - dependencies: - "@babel/code-frame": "npm:^7.29.0" - "@babel/generator": "npm:^7.29.0" - "@babel/helper-globals": "npm:^7.28.0" - "@babel/parser": "npm:^7.29.0" - "@babel/template": "npm:^7.28.6" - "@babel/types": "npm:^7.29.0" - debug: "npm:^4.3.1" - checksum: 10c0/f63ef6e58d02a9fbf3c0e2e5f1c877da3e0bc57f91a19d2223d53e356a76859cbaf51171c9211c71816d94a0e69efa2732fd27ffc0e1bbc84b636e60932333eb - languageName: node - linkType: hard - -"@babel/types@npm:8.0.0-rc.1": - version: 8.0.0-rc.1 - resolution: "@babel/types@npm:8.0.0-rc.1" - dependencies: - "@babel/helper-string-parser": "npm:^8.0.0-rc.1" - "@babel/helper-validator-identifier": "npm:^8.0.0-rc.1" - checksum: 10c0/cb617e14873666d5284a8dfce11eca7155f2bc30db8ba0fbf132a07e96366883678cad23ea889d78e1e30371fdd656482005ebd69acbf6981fc8f42bac8030d8 - languageName: node - linkType: hard - -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/types@npm:7.29.0" - dependencies: - "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.28.5" - checksum: 10c0/23cc3466e83bcbfab8b9bd0edaafdb5d4efdb88b82b3be6728bbade5ba2f0996f84f63b1c5f7a8c0d67efded28300898a5f930b171bb40b311bca2029c4e9b4f - languageName: node - linkType: hard - -"@babel/types@npm:^8.0.0-rc.1, @babel/types@npm:^8.0.0-rc.2": - version: 8.0.0-rc.2 - resolution: "@babel/types@npm:8.0.0-rc.2" - dependencies: - "@babel/helper-string-parser": "npm:^8.0.0-rc.2" - "@babel/helper-validator-identifier": "npm:^8.0.0-rc.2" - checksum: 10c0/8b372115aa4ee3f55541e19887683655e32b78b64579d2402119920af3512594a2be820e05db4a3100cb38db3da3a7bdcc1beb7d031a4ab0129f28d858f129bd - languageName: node - linkType: hard - -"@casl/ability@npm:^6.8.0": - version: 6.8.0 - resolution: "@casl/ability@npm:6.8.0" - dependencies: - "@ucast/mongo2js": "npm:^1.3.0" - checksum: 10c0/82ad74b64af7b25caffc9bac3dd75d2ac3304ac25a616e09d55b8b750311187a01e291216d9f26fe36f40d190eedcb7d07b69bfd8702bdb78986b7da0c41036e - languageName: node - linkType: hard - -"@casl/react@npm:^5.0.1": - version: 5.0.1 - resolution: "@casl/react@npm:5.0.1" - peerDependencies: - "@casl/ability": ^4.0.0 || ^5.1.0 || ^6.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/d66877b3c3c651f4bb1f9cc08db53d468483c52a2c0da4cea3b6b9dcfebbc815986e274cbfabd6238731f9af8950191fe382b3a1a59f02ffc9cd6504d3f599d0 - languageName: node - linkType: hard - -"@emnapi/core@npm:^1.7.1": - version: 1.8.1 - resolution: "@emnapi/core@npm:1.8.1" - dependencies: - "@emnapi/wasi-threads": "npm:1.1.0" - tslib: "npm:^2.4.0" - checksum: 10c0/2c242f4b49779bac403e1cbcc98edacdb1c8ad36562408ba9a20663824669e930bc8493be46a2522d9dc946b8d96cd7073970bae914928c7671b5221c85b432e - languageName: node - linkType: hard - -"@emnapi/runtime@npm:^1.7.1": - version: 1.8.1 - resolution: "@emnapi/runtime@npm:1.8.1" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/f4929d75e37aafb24da77d2f58816761fe3f826aad2e37fa6d4421dac9060cbd5098eea1ac3c9ecc4526b89deb58153852fa432f87021dc57863f2ff726d713f - languageName: node - linkType: hard - -"@emnapi/wasi-threads@npm:1.1.0": - version: 1.1.0 - resolution: "@emnapi/wasi-threads@npm:1.1.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/aix-ppc64@npm:0.27.2" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/aix-ppc64@npm:0.27.3" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/android-arm64@npm:0.27.2" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-arm64@npm:0.27.3" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/android-arm@npm:0.27.2" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-arm@npm:0.27.3" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/android-x64@npm:0.27.2" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-x64@npm:0.27.3" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/darwin-arm64@npm:0.27.2" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/darwin-arm64@npm:0.27.3" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/darwin-x64@npm:0.27.2" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/darwin-x64@npm:0.27.3" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/freebsd-arm64@npm:0.27.2" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/freebsd-arm64@npm:0.27.3" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/freebsd-x64@npm:0.27.2" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/freebsd-x64@npm:0.27.3" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-arm64@npm:0.27.2" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-arm64@npm:0.27.3" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-arm@npm:0.27.2" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-arm@npm:0.27.3" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-ia32@npm:0.27.2" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-ia32@npm:0.27.3" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-loong64@npm:0.27.2" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-loong64@npm:0.27.3" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-mips64el@npm:0.27.2" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-mips64el@npm:0.27.3" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-ppc64@npm:0.27.2" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-ppc64@npm:0.27.3" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-riscv64@npm:0.27.2" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-riscv64@npm:0.27.3" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-s390x@npm:0.27.2" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-s390x@npm:0.27.3" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-x64@npm:0.27.2" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-x64@npm:0.27.3" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/netbsd-arm64@npm:0.27.2" - conditions: os=netbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/netbsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/netbsd-arm64@npm:0.27.3" - conditions: os=netbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/netbsd-x64@npm:0.27.2" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/netbsd-x64@npm:0.27.3" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/openbsd-arm64@npm:0.27.2" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openbsd-arm64@npm:0.27.3" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/openbsd-x64@npm:0.27.2" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openbsd-x64@npm:0.27.3" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openharmony-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/openharmony-arm64@npm:0.27.2" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openharmony-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openharmony-arm64@npm:0.27.3" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/sunos-x64@npm:0.27.2" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/sunos-x64@npm:0.27.3" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/win32-arm64@npm:0.27.2" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-arm64@npm:0.27.3" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/win32-ia32@npm:0.27.2" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-ia32@npm:0.27.3" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/win32-x64@npm:0.27.2" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-x64@npm:0.27.3" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@isaacs/balanced-match@npm:^4.0.1": - version: 4.0.1 - resolution: "@isaacs/balanced-match@npm:4.0.1" - checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420 - languageName: node - linkType: hard - -"@isaacs/brace-expansion@npm:^5.0.0": - version: 5.0.1 - resolution: "@isaacs/brace-expansion@npm:5.0.1" - dependencies: - "@isaacs/balanced-match": "npm:^4.0.1" - checksum: 10c0/e5d67c7bbf1f17b88132a35bc638af306d48acbb72810d48fa6e6edd8ab375854773108e8bf70f021f7ef6a8273455a6d1f0c3b5aa2aff06ce7894049ab77fb8 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.12": - version: 0.3.13 - resolution: "@jridgewell/gen-mapping@npm:0.3.13" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" - dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb - languageName: node - linkType: hard - -"@jridgewell/remapping@npm:^2.3.5": - version: 2.3.5 - resolution: "@jridgewell/remapping@npm:2.3.5" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/3de494219ffeb2c5c38711d0d7bb128097edf91893090a2dbc8ee0b55d092bb7347b1fd0f478486c5eab010e855c73927b1666f2107516d472d24a73017d1194 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.5.5": - version: 1.5.5 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" - checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.24": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.28": - version: 0.3.31 - resolution: "@jridgewell/trace-mapping@npm:0.3.31" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 - languageName: node - linkType: hard - -"@jsdevtools/ono@npm:^7.1.3": - version: 7.1.3 - resolution: "@jsdevtools/ono@npm:7.1.3" - checksum: 10c0/a9f7e3e8e3bc315a34959934a5e2f874c423cf4eae64377d3fc9de0400ed9f36cb5fd5ebce3300d2e8f4085f557c4a8b591427a583729a87841fda46e6c216b9 - languageName: node - linkType: hard - -"@microsoft/api-extractor-model@npm:7.32.2": - version: 7.32.2 - resolution: "@microsoft/api-extractor-model@npm:7.32.2" - dependencies: - "@microsoft/tsdoc": "npm:~0.16.0" - "@microsoft/tsdoc-config": "npm:~0.18.0" - "@rushstack/node-core-library": "npm:5.19.1" - checksum: 10c0/26c7cf56d8b74dbe20270a767ae365a9b93178cd378363c20c15823a68124d55af5c2b4aea5f30dc2b4a93194db3041b4861e39ace79e3d649f06b4b0a6bfb87 - languageName: node - linkType: hard - -"@microsoft/api-extractor@npm:^7.50.1": - version: 7.56.0 - resolution: "@microsoft/api-extractor@npm:7.56.0" - dependencies: - "@microsoft/api-extractor-model": "npm:7.32.2" - "@microsoft/tsdoc": "npm:~0.16.0" - "@microsoft/tsdoc-config": "npm:~0.18.0" - "@rushstack/node-core-library": "npm:5.19.1" - "@rushstack/rig-package": "npm:0.6.0" - "@rushstack/terminal": "npm:0.21.0" - "@rushstack/ts-command-line": "npm:5.1.7" - diff: "npm:~8.0.2" - lodash: "npm:~4.17.15" - minimatch: "npm:10.0.3" - resolve: "npm:~1.22.1" - semver: "npm:~7.5.4" - source-map: "npm:~0.6.1" - typescript: "npm:5.8.2" - bin: - api-extractor: bin/api-extractor - checksum: 10c0/18147cb9dd827377a8a7cbb4bc93b8d5984b5b746bb74f830d2fffe3d3a8ded3db313c423f679bba6fad7c32493aee6cdcf535dff0105f87e3fa336eb860cfc6 - languageName: node - linkType: hard - -"@microsoft/tsdoc-config@npm:~0.18.0": - version: 0.18.0 - resolution: "@microsoft/tsdoc-config@npm:0.18.0" - dependencies: - "@microsoft/tsdoc": "npm:0.16.0" - ajv: "npm:~8.12.0" - jju: "npm:~1.4.0" - resolve: "npm:~1.22.2" - checksum: 10c0/6e2c3bfde3e5fa4c0360127c86fe016dcf1b09d0091d767c06ce916284d3f6aeea3617a33b855c5bb2615ab0f2840eeebd4c7f4a1f879f951828d213bf306cfd - languageName: node - linkType: hard - -"@microsoft/tsdoc@npm:0.16.0, @microsoft/tsdoc@npm:~0.16.0": - version: 0.16.0 - resolution: "@microsoft/tsdoc@npm:0.16.0" - checksum: 10c0/8883bb0ed22753af7360e9222687fda4eb448f0a574ea34b4596c11e320148b3ae0d24e00f8923df8ba7bc62a46a6f53b9343243a348640d923dfd55d52cd6bb - languageName: node - linkType: hard - -"@napi-rs/wasm-runtime@npm:^1.1.0, @napi-rs/wasm-runtime@npm:^1.1.1": - version: 1.1.1 - resolution: "@napi-rs/wasm-runtime@npm:1.1.1" - dependencies: - "@emnapi/core": "npm:^1.7.1" - "@emnapi/runtime": "npm:^1.7.1" - "@tybys/wasm-util": "npm:^0.10.1" - checksum: 10c0/04d57b67e80736e41fe44674a011878db0a8ad893f4d44abb9d3608debb7c174224cba2796ed5b0c1d367368159f3ca6be45f1c59222f70e32ddc880f803d447 - languageName: node - linkType: hard - -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 - languageName: node - linkType: hard - -"@oxc-project/runtime@npm:0.101.0": - version: 0.101.0 - resolution: "@oxc-project/runtime@npm:0.101.0" - checksum: 10c0/86fd7bb37e94986e7a09bde07a16fa63cebeaada6bcb8963bc07087d54c107d1a128e1c4a5d27b9b593354c092b8976d7653b6700fbb0da0a2b925fb3de4b34c - languageName: node - linkType: hard - -"@oxc-project/types@npm:=0.101.0": - version: 0.101.0 - resolution: "@oxc-project/types@npm:0.101.0" - checksum: 10c0/e4e98da6e34ef0163a652e842e795bda77b703d8282fed4984292ff7b289c4e03d848ed8762e549445e33a142d3883e1013cd9ed43156f6eba34c151b8f599c1 - languageName: node - linkType: hard - -"@oxc-project/types@npm:=0.114.0": - version: 0.114.0 - resolution: "@oxc-project/types@npm:0.114.0" - checksum: 10c0/37efc4a3b3375efb281ef669e306a3d20783a91d36c24eeef9e164995ba93db5571f84ce9a7961004b0bda0d1533d35d0b1f6fe3318d574779c0847bf1f3ba65 - languageName: node - linkType: hard - -"@oxfmt/binding-android-arm-eabi@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-android-arm-eabi@npm:0.34.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@oxfmt/binding-android-arm64@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-android-arm64@npm:0.34.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@oxfmt/binding-darwin-arm64@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-darwin-arm64@npm:0.34.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@oxfmt/binding-darwin-x64@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-darwin-x64@npm:0.34.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@oxfmt/binding-freebsd-x64@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-freebsd-x64@npm:0.34.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@oxfmt/binding-linux-arm-gnueabihf@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-arm-gnueabihf@npm:0.34.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxfmt/binding-linux-arm-musleabihf@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-arm-musleabihf@npm:0.34.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxfmt/binding-linux-arm64-gnu@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-arm64-gnu@npm:0.34.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@oxfmt/binding-linux-arm64-musl@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-arm64-musl@npm:0.34.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@oxfmt/binding-linux-ppc64-gnu@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-ppc64-gnu@npm:0.34.0" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@oxfmt/binding-linux-riscv64-gnu@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-riscv64-gnu@npm:0.34.0" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@oxfmt/binding-linux-riscv64-musl@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-riscv64-musl@npm:0.34.0" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@oxfmt/binding-linux-s390x-gnu@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-s390x-gnu@npm:0.34.0" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@oxfmt/binding-linux-x64-gnu@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-x64-gnu@npm:0.34.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@oxfmt/binding-linux-x64-musl@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-linux-x64-musl@npm:0.34.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@oxfmt/binding-openharmony-arm64@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-openharmony-arm64@npm:0.34.0" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@oxfmt/binding-win32-arm64-msvc@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-win32-arm64-msvc@npm:0.34.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@oxfmt/binding-win32-ia32-msvc@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-win32-ia32-msvc@npm:0.34.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@oxfmt/binding-win32-x64-msvc@npm:0.34.0": - version: 0.34.0 - resolution: "@oxfmt/binding-win32-x64-msvc@npm:0.34.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/darwin-arm64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/darwin-arm64@npm:0.14.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/darwin-x64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/darwin-x64@npm:0.14.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/linux-arm64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/linux-arm64@npm:0.14.1" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/linux-x64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/linux-x64@npm:0.14.1" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/win32-arm64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/win32-arm64@npm:0.14.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint-tsgolint/win32-x64@npm:0.14.1": - version: 0.14.1 - resolution: "@oxlint-tsgolint/win32-x64@npm:0.14.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@oxlint/binding-android-arm-eabi@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-android-arm-eabi@npm:1.49.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@oxlint/binding-android-arm64@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-android-arm64@npm:1.49.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint/binding-darwin-arm64@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-darwin-arm64@npm:1.49.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint/binding-darwin-x64@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-darwin-x64@npm:1.49.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@oxlint/binding-freebsd-x64@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-freebsd-x64@npm:1.49.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@oxlint/binding-linux-arm-gnueabihf@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-arm-gnueabihf@npm:1.49.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxlint/binding-linux-arm-musleabihf@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-arm-musleabihf@npm:1.49.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@oxlint/binding-linux-arm64-gnu@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-arm64-gnu@npm:1.49.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@oxlint/binding-linux-arm64-musl@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-arm64-musl@npm:1.49.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@oxlint/binding-linux-ppc64-gnu@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-ppc64-gnu@npm:1.49.0" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@oxlint/binding-linux-riscv64-gnu@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-riscv64-gnu@npm:1.49.0" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@oxlint/binding-linux-riscv64-musl@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-riscv64-musl@npm:1.49.0" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@oxlint/binding-linux-s390x-gnu@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-s390x-gnu@npm:1.49.0" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@oxlint/binding-linux-x64-gnu@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-x64-gnu@npm:1.49.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@oxlint/binding-linux-x64-musl@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-linux-x64-musl@npm:1.49.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@oxlint/binding-openharmony-arm64@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-openharmony-arm64@npm:1.49.0" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint/binding-win32-arm64-msvc@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-win32-arm64-msvc@npm:1.49.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@oxlint/binding-win32-ia32-msvc@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-win32-ia32-msvc@npm:1.49.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@oxlint/binding-win32-x64-msvc@npm:1.49.0": - version: 1.49.0 - resolution: "@oxlint/binding-win32-x64-msvc@npm:1.49.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd - languageName: node - linkType: hard - -"@povio/openapi-codegen-cli@workspace:.": - version: 0.0.0-use.local - resolution: "@povio/openapi-codegen-cli@workspace:." - dependencies: - "@apidevtools/swagger-parser": "npm:^10.1.0" - "@casl/ability": "npm:^6.8.0" - "@casl/react": "npm:^5.0.1" - "@tanstack/react-query": "npm:~5.90.21" - "@types/node": "npm:^25.3.0" - "@types/prompt-sync": "npm:^4.2.3" - "@types/react": "npm:^19.2.14" - "@types/yargs": "npm:^17.0.35" - "@vitejs/plugin-react": "npm:^5.1.4" - axios: "npm:^1.13.5" - handlebars: "npm:^4.7.8" - i18next: "npm:^25.8.11" - import-fresh: "npm:^3.3.1" - openapi-types: "npm:^12.1.3" - oxfmt: "npm:^0.34.0" - oxlint: "npm:^1.49.0" - oxlint-tsgolint: "npm:^0.14.1" - prompt-sync: "npm:^4.2.0" - react: "npm:^19.2.4" - reflect-metadata: "npm:^0.2.2" - ts-pattern: "npm:^5.9.0" - tsdown: "npm:^0.21.0-beta.1" - tsx: "npm:^4.21.0" - type-fest: "npm:^5.4.4" - typescript: "npm:^5.9.3" - vite: "npm:rolldown-vite@^7.3.1" - vite-plugin-dts: "npm:^4.5.4" - vitest: "npm:4.0.18" - yargs: "npm:^18.0.0" - zod: "npm:^4.3.6" - peerDependencies: - "@casl/ability": ^6.7.3 - "@casl/react": ^5.0.0 - "@tanstack/react-query": ^5.90.21 - axios: ^1.13.1 - react: ^19.1.0 - zod: ^4.1.12 - peerDependenciesMeta: - "@casl/ability": - optional: true - "@casl/react": - optional: true - bin: - openapi-codegen: ./dist/sh.mjs - languageName: unknown - linkType: soft - -"@quansync/fs@npm:^1.0.0": - version: 1.0.0 - resolution: "@quansync/fs@npm:1.0.0" - dependencies: - quansync: "npm:^1.0.0" - checksum: 10c0/41a7e145d4fc349eaeac20ee7ffe0c876a7c26b2268d5704b462b3e7379091221336e315b2b346d5b07a531502a41cad15c9f374800cc60b6339d074ef99aa16 - languageName: node - linkType: hard - -"@rolldown/binding-android-arm64@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-android-arm64@npm:1.0.0-beta.53" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-android-arm64@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-android-arm64@npm:1.0.0-rc.5" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-darwin-arm64@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-beta.53" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-darwin-arm64@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-rc.5" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-darwin-x64@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-beta.53" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-darwin-x64@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-rc.5" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-freebsd-x64@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-beta.53" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-freebsd-x64@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-rc.5" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.53" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.5" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.53" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.5" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.53" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.5" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.53" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.5" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.53" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.5" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rolldown/binding-openharmony-arm64@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-beta.53" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.5" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.53" - dependencies: - "@napi-rs/wasm-runtime": "npm:^1.1.0" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.5" - dependencies: - "@napi-rs/wasm-runtime": "npm:^1.1.1" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.53" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.5" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.53" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.5" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/pluginutils@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/pluginutils@npm:1.0.0-beta.53" - checksum: 10c0/e8b0a7eb76be22f6f103171f28072de821525a4e400454850516da91a7381957932ff0ce495f227bcb168e86815788b0c1d249ca9e34dca366a82c8825b714ce - languageName: node - linkType: hard - -"@rolldown/pluginutils@npm:1.0.0-rc.3": - version: 1.0.0-rc.3 - resolution: "@rolldown/pluginutils@npm:1.0.0-rc.3" - checksum: 10c0/3928b6282a30f307d1b075d2f217180ae173ea9e00638ce46ab65f089bd5f7a0b2c488ae1ce530f509387793c656a2910337c4cd68fa9d37d7e439365989e699 - languageName: node - linkType: hard - -"@rolldown/pluginutils@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "@rolldown/pluginutils@npm:1.0.0-rc.5" - checksum: 10c0/024425dd33d34d7b7e2f9259c406db97248c405462a37e780f7df5a0460a051847f4658295741c6b9382141d3b032f687d23ed8feab9d9c045cb6b8ba93a0bb3 - languageName: node - linkType: hard - -"@rollup/pluginutils@npm:^5.1.4": - version: 5.3.0 - resolution: "@rollup/pluginutils@npm:5.3.0" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-walker: "npm:^2.0.2" - picomatch: "npm:^4.0.2" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/001834bf62d7cf5bac424d2617c113f7f7d3b2bf3c1778cbcccb72cdc957b68989f8e7747c782c2b911f1dde8257f56f8ac1e779e29e74e638e3f1e2cac2bcd0 - languageName: node - linkType: hard - -"@rollup/rollup-android-arm-eabi@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.57.1" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-android-arm64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-android-arm64@npm:4.57.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-arm64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-darwin-arm64@npm:4.57.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-x64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-darwin-x64@npm:4.57.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-arm64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.57.1" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-x64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-freebsd-x64@npm:4.57.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-gnueabihf@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.57.1" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-musleabihf@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.57.1" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.57.1" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-musl@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.57.1" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-loong64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.57.1" - conditions: os=linux & cpu=loong64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-loong64-musl@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-loong64-musl@npm:4.57.1" - conditions: os=linux & cpu=loong64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.57.1" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-musl@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.57.1" - conditions: os=linux & cpu=ppc64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.57.1" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-musl@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.57.1" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.57.1" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.57.1" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-musl@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.57.1" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-openbsd-x64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-openbsd-x64@npm:4.57.1" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-openharmony-arm64@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.57.1" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.57.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-ia32-msvc@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.57.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-gnu@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-win32-x64-gnu@npm:4.57.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.57.1": - version: 4.57.1 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.57.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rushstack/node-core-library@npm:5.19.1": - version: 5.19.1 - resolution: "@rushstack/node-core-library@npm:5.19.1" - dependencies: - ajv: "npm:~8.13.0" - ajv-draft-04: "npm:~1.0.0" - ajv-formats: "npm:~3.0.1" - fs-extra: "npm:~11.3.0" - import-lazy: "npm:~4.0.0" - jju: "npm:~1.4.0" - resolve: "npm:~1.22.1" - semver: "npm:~7.5.4" - peerDependencies: - "@types/node": "*" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/1c9174e1d38ce6d1cf5dfff394d800de6a5cb43666da67df7d07b93243a61b0479f5ef04e9c5f8c31759309203a0d7e174157c515c869bab26d23187202bff1c - languageName: node - linkType: hard - -"@rushstack/problem-matcher@npm:0.1.1": - version: 0.1.1 - resolution: "@rushstack/problem-matcher@npm:0.1.1" - peerDependencies: - "@types/node": "*" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/c847e721d3536ebb316fdd90b3e4033a7d24ff8c70e38e3eaeaadf167c4d14a7f16377ae4af8097532386bcfa81c15cfec7d2da517542c07882d273d56861d78 - languageName: node - linkType: hard - -"@rushstack/rig-package@npm:0.6.0": - version: 0.6.0 - resolution: "@rushstack/rig-package@npm:0.6.0" - dependencies: - resolve: "npm:~1.22.1" - strip-json-comments: "npm:~3.1.1" - checksum: 10c0/303c5c010a698343124036414dbeed44b24e67585307ffa6effd052624b0384cc08a12aeb153e8466b7abd6f516900ecf8629600230f0f2c33cd5c0c3dace65e - languageName: node - linkType: hard - -"@rushstack/terminal@npm:0.21.0": - version: 0.21.0 - resolution: "@rushstack/terminal@npm:0.21.0" - dependencies: - "@rushstack/node-core-library": "npm:5.19.1" - "@rushstack/problem-matcher": "npm:0.1.1" - supports-color: "npm:~8.1.1" - peerDependencies: - "@types/node": "*" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/47f5688674a10785b65a07760fdb4b010bd9dbad141ea2ae78c8c0c320daecd66363d1c4fad78137e87582cabd6432f2919f7f4eb7557c0f836ce24b58ca45ca - languageName: node - linkType: hard - -"@rushstack/ts-command-line@npm:5.1.7": - version: 5.1.7 - resolution: "@rushstack/ts-command-line@npm:5.1.7" - dependencies: - "@rushstack/terminal": "npm:0.21.0" - "@types/argparse": "npm:1.0.38" - argparse: "npm:~1.0.9" - string-argv: "npm:~0.3.1" - checksum: 10c0/5ec13fcde7fe66ea0af6dac78908c9887810044656269c296db0c4311b703aa73ee7b4d5ace00c51062598da936f94695ce0d5caec0d1c0c6022040d335b77ac - languageName: node - linkType: hard - -"@standard-schema/spec@npm:^1.0.0": - version: 1.1.0 - resolution: "@standard-schema/spec@npm:1.1.0" - checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 - languageName: node - linkType: hard - -"@tanstack/query-core@npm:5.90.20": - version: 5.90.20 - resolution: "@tanstack/query-core@npm:5.90.20" - checksum: 10c0/70637dfcecd5ed9d810629aa27f1632af8a4bcd083e75cf29408d058c32f8234704a3231ec280e2c4016ea0485b16124fdf70ab97793b5a7b670f43f7659e9fe - languageName: node - linkType: hard - -"@tanstack/react-query@npm:~5.90.21": - version: 5.90.21 - resolution: "@tanstack/react-query@npm:5.90.21" - dependencies: - "@tanstack/query-core": "npm:5.90.20" - peerDependencies: - react: ^18 || ^19 - checksum: 10c0/e8994c57f6ceb2c886a4d6486a8c6a3f89bc6b1220de3e732448d7fcbeb386e9358f03c73804de72004c6ac2668d0bf1b44cedbb273d3e4b33afcbaee7b7d24d - languageName: node - linkType: hard - -"@tybys/wasm-util@npm:^0.10.1": - version: 0.10.1 - resolution: "@tybys/wasm-util@npm:0.10.1" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8 - languageName: node - linkType: hard - -"@types/argparse@npm:1.0.38": - version: 1.0.38 - resolution: "@types/argparse@npm:1.0.38" - checksum: 10c0/4fc892da5df16923f48180da2d1f4562fa8b0507cf636b24780444fa0a1d7321d4dc0c0ecbee6152968823f5a2ae0d321b4f8c705a489bf1ae1245bdeb0868fd - languageName: node - linkType: hard - -"@types/babel__core@npm:^7.20.5": - version: 7.20.5 - resolution: "@types/babel__core@npm:7.20.5" - dependencies: - "@babel/parser": "npm:^7.20.7" - "@babel/types": "npm:^7.20.7" - "@types/babel__generator": "npm:*" - "@types/babel__template": "npm:*" - "@types/babel__traverse": "npm:*" - checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff - languageName: node - linkType: hard - -"@types/babel__generator@npm:*": - version: 7.27.0 - resolution: "@types/babel__generator@npm:7.27.0" - dependencies: - "@babel/types": "npm:^7.0.0" - checksum: 10c0/9f9e959a8792df208a9d048092fda7e1858bddc95c6314857a8211a99e20e6830bdeb572e3587ae8be5429e37f2a96fcf222a9f53ad232f5537764c9e13a2bbd - languageName: node - linkType: hard - -"@types/babel__template@npm:*": - version: 7.4.4 - resolution: "@types/babel__template@npm:7.4.4" - dependencies: - "@babel/parser": "npm:^7.1.0" - "@babel/types": "npm:^7.0.0" - checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b - languageName: node - linkType: hard - -"@types/babel__traverse@npm:*": - version: 7.28.0 - resolution: "@types/babel__traverse@npm:7.28.0" - dependencies: - "@babel/types": "npm:^7.28.2" - checksum: 10c0/b52d7d4e8fc6a9018fe7361c4062c1c190f5778cf2466817cb9ed19d69fbbb54f9a85ffedeb748ed8062d2cf7d4cc088ee739848f47c57740de1c48cbf0d0994 - languageName: node - linkType: hard - -"@types/chai@npm:^5.2.2": - version: 5.2.3 - resolution: "@types/chai@npm:5.2.3" - dependencies: - "@types/deep-eql": "npm:*" - assertion-error: "npm:^2.0.1" - checksum: 10c0/e0ef1de3b6f8045a5e473e867c8565788c444271409d155588504840ad1a53611011f85072188c2833941189400228c1745d78323dac13fcede9c2b28bacfb2f - languageName: node - linkType: hard - -"@types/deep-eql@npm:*": - version: 4.0.2 - resolution: "@types/deep-eql@npm:4.0.2" - checksum: 10c0/bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 - languageName: node - linkType: hard - -"@types/estree@npm:1.0.8": - version: 1.0.8 - resolution: "@types/estree@npm:1.0.8" - checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 - languageName: node - linkType: hard - -"@types/estree@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d - languageName: node - linkType: hard - -"@types/jsesc@npm:^2.5.0": - version: 2.5.1 - resolution: "@types/jsesc@npm:2.5.1" - checksum: 10c0/12ba7bf5968aeeb36408269f4b5a39718efc6411fa197cf0f5e967ba36ad7b7d555b78787fc480db43ce63ebe6ab0ffe5fd9f64b1ea3b0d073877f0747491b30 - languageName: node - linkType: hard - -"@types/node@npm:^25.3.0": - version: 25.3.0 - resolution: "@types/node@npm:25.3.0" - dependencies: - undici-types: "npm:~7.18.0" - checksum: 10c0/7b2b18c9d68047157367fc2f786d4f166d22dc0ad9f82331ca02fb16f2f391854123dbe604dcb938cda119c87051e4bb71dcb9ece44a579f483a6f96d4bd41de - languageName: node - linkType: hard - -"@types/prompt-sync@npm:^4.2.3": - version: 4.2.3 - resolution: "@types/prompt-sync@npm:4.2.3" - checksum: 10c0/e787a2d99938eba1dbdf94534c9777e0b45aac8aa099364467f576e07b1667b9bf3b3fda7b47333903dee62924174d3d8c0df0c34f371e4c70321fd6966a9840 - languageName: node - linkType: hard - -"@types/react@npm:^19.2.14": - version: 19.2.14 - resolution: "@types/react@npm:19.2.14" - dependencies: - csstype: "npm:^3.2.2" - checksum: 10c0/7d25bf41b57719452d86d2ac0570b659210402707313a36ee612666bf11275a1c69824f8c3ee1fdca077ccfe15452f6da8f1224529b917050eb2d861e52b59b7 - languageName: node - linkType: hard - -"@types/yargs-parser@npm:*": - version: 21.0.3 - resolution: "@types/yargs-parser@npm:21.0.3" - checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 - languageName: node - linkType: hard - -"@types/yargs@npm:^17.0.35": - version: 17.0.35 - resolution: "@types/yargs@npm:17.0.35" - dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10c0/609557826a6b85e73ccf587923f6429850d6dc70e420b455bab4601b670bfadf684b09ae288bccedab042c48ba65f1666133cf375814204b544009f57d6eef63 - languageName: node - linkType: hard - -"@ucast/core@npm:^1.0.0, @ucast/core@npm:^1.4.1, @ucast/core@npm:^1.6.1": - version: 1.10.2 - resolution: "@ucast/core@npm:1.10.2" - checksum: 10c0/bc24a2b02d796b5c14353aaf1c8faf8103157695522e82e9d6d7813a300e631a406d4809030c582bda99a72232a8eb19f25b4d78857f1c9fab2e8fb2028706e8 - languageName: node - linkType: hard - -"@ucast/js@npm:^3.0.0": - version: 3.0.4 - resolution: "@ucast/js@npm:3.0.4" - dependencies: - "@ucast/core": "npm:^1.0.0" - checksum: 10c0/c1243a22a82afa6a553317ed8201dbc496b86d3a33220778033773789bd7f38efe8ddb65d6dd9dd7b8035239f87a467b17c560afd206c0ece8b71780333d4f17 - languageName: node - linkType: hard - -"@ucast/mongo2js@npm:^1.3.0": - version: 1.4.0 - resolution: "@ucast/mongo2js@npm:1.4.0" - dependencies: - "@ucast/core": "npm:^1.6.1" - "@ucast/js": "npm:^3.0.0" - "@ucast/mongo": "npm:^2.4.0" - checksum: 10c0/3feeb7b175fc8263764fbcb8a88d0bfa26640bc7fb2d76aa7c34cb21397ecb2008e8b66387f4204bf435d98cd9fad0afddef0948f82aa64e98fa7574b8dbb181 - languageName: node - linkType: hard - -"@ucast/mongo@npm:^2.4.0": - version: 2.4.3 - resolution: "@ucast/mongo@npm:2.4.3" - dependencies: - "@ucast/core": "npm:^1.4.1" - checksum: 10c0/3b806014f5754594faae5045f778e330c03216904895116ad524bd5e57e24875d7994add478e873628b5b2406d8c4cbce6e3eba5a7c6591924e4226e956d78b6 - languageName: node - linkType: hard - -"@vitejs/plugin-react@npm:^5.1.4": - version: 5.1.4 - resolution: "@vitejs/plugin-react@npm:5.1.4" - dependencies: - "@babel/core": "npm:^7.29.0" - "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" - "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" - "@rolldown/pluginutils": "npm:1.0.0-rc.3" - "@types/babel__core": "npm:^7.20.5" - react-refresh: "npm:^0.18.0" - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/dd7b8f40717ecd4a5ab18f467134ea8135f9a443359333d71e4114aeacfc8b679be9fd36dc12290d076c78883a02e708bfe1f0d93411c06c9659da0879b952e3 - languageName: node - linkType: hard - -"@vitest/expect@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/expect@npm:4.0.18" - dependencies: - "@standard-schema/spec": "npm:^1.0.0" - "@types/chai": "npm:^5.2.2" - "@vitest/spy": "npm:4.0.18" - "@vitest/utils": "npm:4.0.18" - chai: "npm:^6.2.1" - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/123b0aa111682e82ec5289186df18037b1a1768700e468ee0f9879709aaa320cf790463c15c0d8ee10df92b402f4394baf5d27797e604d78e674766d87bcaadc - languageName: node - linkType: hard - -"@vitest/mocker@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/mocker@npm:4.0.18" - dependencies: - "@vitest/spy": "npm:4.0.18" - estree-walker: "npm:^3.0.3" - magic-string: "npm:^0.30.21" - peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - checksum: 10c0/fb0a257e7e167759d4ad228d53fa7bad2267586459c4a62188f2043dd7163b4b02e1e496dc3c227837f776e7d73d6c4343613e89e7da379d9d30de8260f1ee4b - languageName: node - linkType: hard - -"@vitest/pretty-format@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/pretty-format@npm:4.0.18" - dependencies: - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/0086b8c88eeca896d8e4b98fcdef452c8041a1b63eb9e85d3e0bcc96c8aa76d8e9e0b6990ebb0bb0a697c4ebab347e7735888b24f507dbff2742ddce7723fd94 - languageName: node - linkType: hard - -"@vitest/runner@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/runner@npm:4.0.18" - dependencies: - "@vitest/utils": "npm:4.0.18" - pathe: "npm:^2.0.3" - checksum: 10c0/fdb4afa411475133c05ba266c8092eaf1e56cbd5fb601f92ec6ccb9bab7ca52e06733ee8626599355cba4ee71cb3a8f28c84d3b69dc972e41047edc50229bc01 - languageName: node - linkType: hard - -"@vitest/snapshot@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/snapshot@npm:4.0.18" - dependencies: - "@vitest/pretty-format": "npm:4.0.18" - magic-string: "npm:^0.30.21" - pathe: "npm:^2.0.3" - checksum: 10c0/d3bfefa558db9a69a66886ace6575eb96903a5ba59f4d9a5d0fecb4acc2bb8dbb443ef409f5ac1475f2e1add30bd1d71280f98912da35e89c75829df9e84ea43 - languageName: node - linkType: hard - -"@vitest/spy@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/spy@npm:4.0.18" - checksum: 10c0/6de537890b3994fcadb8e8d8ac05942320ae184f071ec395d978a5fba7fa928cbb0c5de85af86a1c165706c466e840de8779eaff8c93450c511c7abaeb9b8a4e - languageName: node - linkType: hard - -"@vitest/utils@npm:4.0.18": - version: 4.0.18 - resolution: "@vitest/utils@npm:4.0.18" - dependencies: - "@vitest/pretty-format": "npm:4.0.18" - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/4a3c43c1421eb90f38576926496f6c80056167ba111e63f77cf118983902673737a1a38880b890d7c06ec0a12475024587344ee502b3c43093781533022f2aeb - languageName: node - linkType: hard - -"@volar/language-core@npm:2.4.28, @volar/language-core@npm:~2.4.11": - version: 2.4.28 - resolution: "@volar/language-core@npm:2.4.28" - dependencies: - "@volar/source-map": "npm:2.4.28" - checksum: 10c0/d41f7327fed7fa5301fbf2d8f96753d645a976b21dbbeb869794a780aa6523d1e6bf258242bc3d8ccd37f8e8b98a04fea9574e6f63badc585a8a3c2e068c4a86 - languageName: node - linkType: hard - -"@volar/source-map@npm:2.4.28": - version: 2.4.28 - resolution: "@volar/source-map@npm:2.4.28" - checksum: 10c0/24b0b02c7f66febe47f0bfda4a5ed4beaf949041eddc6325c7478b900faeb071795b696d97a4f326dde47217d06e40b67129300bc544f054772c5cb84c2f254e - languageName: node - linkType: hard - -"@volar/typescript@npm:^2.4.11": - version: 2.4.28 - resolution: "@volar/typescript@npm:2.4.28" - dependencies: - "@volar/language-core": "npm:2.4.28" - path-browserify: "npm:^1.0.1" - vscode-uri: "npm:^3.0.8" - checksum: 10c0/075c890b9ec1cb17f17e38aaed035f8ee7d507439e87270d8e3c394356fc9387fd0bda9ec1069b36ea4c378d9375a08f5bc64c063a83427010ddd86d472124fc - languageName: node - linkType: hard - -"@vue/compiler-core@npm:3.5.27": - version: 3.5.27 - resolution: "@vue/compiler-core@npm:3.5.27" - dependencies: - "@babel/parser": "npm:^7.28.5" - "@vue/shared": "npm:3.5.27" - entities: "npm:^7.0.0" - estree-walker: "npm:^2.0.2" - source-map-js: "npm:^1.2.1" - checksum: 10c0/10ea10c0678d314f3f86c226b6f93f2b91e8e2dc6f6388b0e4b5792d5338d60c80e36430c86d007ee5fab629f3ef526af94e2fe2d550e1ae1ee1d389cfebf4e6 - languageName: node - linkType: hard - -"@vue/compiler-dom@npm:^3.5.0": - version: 3.5.27 - resolution: "@vue/compiler-dom@npm:3.5.27" - dependencies: - "@vue/compiler-core": "npm:3.5.27" - "@vue/shared": "npm:3.5.27" - checksum: 10c0/0a91a1b93a0f25936c83a2881da7222d22c6ad160f3405f9aed86668b66f4c7ff1611bcc769441fccd0fecb3c83607c0c1c78a43d8acf3aa106b87034de54e50 - languageName: node - linkType: hard - -"@vue/compiler-vue2@npm:^2.7.16": - version: 2.7.16 - resolution: "@vue/compiler-vue2@npm:2.7.16" - dependencies: - de-indent: "npm:^1.0.2" - he: "npm:^1.2.0" - checksum: 10c0/c76c3fad770b9a7da40b314116cc9da173da20e5fd68785c8ed8dd8a87d02f239545fa296e16552e040ec86b47bfb18283b39447b250c2e76e479bd6ae475bb3 - languageName: node - linkType: hard - -"@vue/language-core@npm:2.2.0": - version: 2.2.0 - resolution: "@vue/language-core@npm:2.2.0" - dependencies: - "@volar/language-core": "npm:~2.4.11" - "@vue/compiler-dom": "npm:^3.5.0" - "@vue/compiler-vue2": "npm:^2.7.16" - "@vue/shared": "npm:^3.5.0" - alien-signals: "npm:^0.4.9" - minimatch: "npm:^9.0.3" - muggle-string: "npm:^0.4.1" - path-browserify: "npm:^1.0.1" - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/1c44cc4067266bbc825af358a867aed455963a08c160cd9df9a47571fd917a87d9de9bdea6149877e0c8309a6cf39f263e7cf2fbadeceba47a5a158f392151b2 - languageName: node - linkType: hard - -"@vue/shared@npm:3.5.27, @vue/shared@npm:^3.5.0": - version: 3.5.27 - resolution: "@vue/shared@npm:3.5.27" - checksum: 10c0/c80a84464530d51cf3d5fa1aab6c3e9717e5901fbc1b8a8eb9962edfc02985c1e03e6dc6d0d205d10cdff067c1c5f689d7156446d2a4c7686a8409a40e3a5f20 - languageName: node - linkType: hard - -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 - languageName: node - linkType: hard - -"acorn@npm:^8.15.0": - version: 8.15.0 - resolution: "acorn@npm:8.15.0" - bin: - acorn: bin/acorn - checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec - languageName: node - linkType: hard - -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 - languageName: node - linkType: hard - -"ajv-draft-04@npm:^1.0.0, ajv-draft-04@npm:~1.0.0": - version: 1.0.0 - resolution: "ajv-draft-04@npm:1.0.0" - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/6044310bd38c17d77549fd326bd40ce1506fa10b0794540aa130180808bf94117fac8c9b448c621512bea60e4a947278f6a978e87f10d342950c15b33ddd9271 - languageName: node - linkType: hard - -"ajv-formats@npm:~3.0.1": - version: 3.0.1 - resolution: "ajv-formats@npm:3.0.1" - dependencies: - ajv: "npm:^8.0.0" - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/168d6bca1ea9f163b41c8147bae537e67bd963357a5488a1eaf3abe8baa8eec806d4e45f15b10767e6020679315c7e1e5e6803088dfb84efa2b4e9353b83dd0a - languageName: node - linkType: hard - -"ajv@npm:^8.0.0, ajv@npm:^8.6.3": - version: 8.17.1 - resolution: "ajv@npm:8.17.1" - dependencies: - fast-deep-equal: "npm:^3.1.3" - fast-uri: "npm:^3.0.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 - languageName: node - linkType: hard - -"ajv@npm:~8.12.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" - dependencies: - fast-deep-equal: "npm:^3.1.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e - languageName: node - linkType: hard - -"ajv@npm:~8.13.0": - version: 8.13.0 - resolution: "ajv@npm:8.13.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.4.1" - checksum: 10c0/14c6497b6f72843986d7344175a1aa0e2c35b1e7f7475e55bc582cddb765fca7e6bf950f465dc7846f817776d9541b706f4b5b3fbedd8dfdeb5fce6f22864264 - languageName: node - linkType: hard - -"alien-signals@npm:^0.4.9": - version: 0.4.14 - resolution: "alien-signals@npm:0.4.14" - checksum: 10c0/5abb3377bcaf6b3819e950084b3ebd022ad90210105afb450c89dc347e80e28da441bf34858a57ea122abe7603e552ddbad80dc597c8f02a0a5206c5fb9c20cb - languageName: node - linkType: hard - -"ansi-regex@npm:^4.1.0": - version: 4.1.1 - resolution: "ansi-regex@npm:4.1.1" - checksum: 10c0/d36d34234d077e8770169d980fed7b2f3724bfa2a01da150ccd75ef9707c80e883d27cdf7a0eac2f145ac1d10a785a8a855cffd05b85f778629a0db62e7033da - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c - languageName: node - linkType: hard - -"ansi-styles@npm:^6.2.1": - version: 6.2.3 - resolution: "ansi-styles@npm:6.2.3" - checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 - languageName: node - linkType: hard - -"ansis@npm:^4.2.0": - version: 4.2.0 - resolution: "ansis@npm:4.2.0" - checksum: 10c0/cd6a7a681ecd36e72e0d79c1e34f1f3bcb1b15bcbb6f0f8969b4228062d3bfebbef468e09771b00d93b2294370b34f707599d4a113542a876de26823b795b5d2 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7, argparse@npm:~1.0.9": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: "npm:~1.0.2" - checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de - languageName: node - linkType: hard - -"assertion-error@npm:^2.0.1": - version: 2.0.1 - resolution: "assertion-error@npm:2.0.1" - checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 - languageName: node - linkType: hard - -"ast-kit@npm:^3.0.0-beta.1": - version: 3.0.0-beta.1 - resolution: "ast-kit@npm:3.0.0-beta.1" - dependencies: - "@babel/parser": "npm:^8.0.0-beta.4" - estree-walker: "npm:^3.0.3" - pathe: "npm:^2.0.3" - checksum: 10c0/27a0309d495100e088c6aa6449e2bb79fdf6321c42bb73c196d646935ff788c2202d8dfc19e04499c623f0676cbe5d6baaeb645ede4b349fac2bd5c276419d5a - languageName: node - linkType: hard - -"async-function@npm:^1.0.0": - version: 1.0.0 - resolution: "async-function@npm:1.0.0" - checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 - languageName: node - linkType: hard - -"async-generator-function@npm:^1.0.0": - version: 1.0.0 - resolution: "async-generator-function@npm:1.0.0" - checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d - languageName: node - linkType: hard - -"axios@npm:^1.13.5": - version: 1.13.5 - resolution: "axios@npm:1.13.5" - dependencies: - follow-redirects: "npm:^1.15.11" - form-data: "npm:^4.0.5" - proxy-from-env: "npm:^1.1.0" - checksum: 10c0/abf468c34f2d145f3dc7dbc0f1be67e520630624307bda69a41bbe8d386bd672d87b4405c4ee77f9ff54b235ab02f96a9968fb00e75b13ce64706e352a3068fd - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"baseline-browser-mapping@npm:^2.9.0": - version: 2.9.19 - resolution: "baseline-browser-mapping@npm:2.9.19" - bin: - baseline-browser-mapping: dist/cli.js - checksum: 10c0/569928db78bcd081953d7db79e4243a59a579a34b4ae1806b9b42d3b7f84e5bc40e6e82ae4fa06e7bef8291bf747b33b3f9ef5d3c6e1e420cb129d9295536129 - languageName: node - linkType: hard - -"birpc@npm:^4.0.0": - version: 4.0.0 - resolution: "birpc@npm:4.0.0" - checksum: 10c0/61f4e893ff4c5948b2c587c971c04883af0d8b2658d4632c8e77073db9f9e8b040402f985d56308021890b2ad32ef8392e36a8335cab1e3771d99e1b025d1af6 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f - languageName: node - linkType: hard - -"browserslist@npm:^4.24.0": - version: 4.28.1 - resolution: "browserslist@npm:4.28.1" - dependencies: - baseline-browser-mapping: "npm:^2.9.0" - caniuse-lite: "npm:^1.0.30001759" - electron-to-chromium: "npm:^1.5.263" - node-releases: "npm:^2.0.27" - update-browserslist-db: "npm:^1.2.0" - bin: - browserslist: cli.js - checksum: 10c0/545a5fa9d7234e3777a7177ec1e9134bb2ba60a69e6b95683f6982b1473aad347c77c1264ccf2ac5dea609a9731fbfbda6b85782bdca70f80f86e28a402504bd - languageName: node - linkType: hard - -"cac@npm:^6.7.14": - version: 6.7.14 - resolution: "cac@npm:6.7.14" - checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 - languageName: node - linkType: hard - -"cacache@npm:^18.0.0": - version: 18.0.3 - resolution: "cacache@npm:18.0.3" - dependencies: - "@npmcli/fs": "npm:^3.1.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10c0/dfda92840bb371fb66b88c087c61a74544363b37a265023223a99965b16a16bbb87661fe4948718d79df6e0cc04e85e62784fbcf1832b2a5e54ff4c46fbb45b7 - languageName: node - linkType: hard - -"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind-apply-helpers@npm:1.0.2" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 - languageName: node - linkType: hard - -"call-me-maybe@npm:^1.0.1": - version: 1.0.2 - resolution: "call-me-maybe@npm:1.0.2" - checksum: 10c0/8eff5dbb61141ebb236ed71b4e9549e488bcb5451c48c11e5667d5c75b0532303788a1101e6978cafa2d0c8c1a727805599c2741e3e0982855c9f1d78cd06c9f - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001759": - version: 1.0.30001767 - resolution: "caniuse-lite@npm:1.0.30001767" - checksum: 10c0/37067c6d2b26623f81494a1f206adbff2b80baed3318ba430684e428bd7d81be889f39db8ef081501d1db5f7dd5d15972892f173eb59c9f3bb780e0b38e6610a - languageName: node - linkType: hard - -"chai@npm:^6.2.1": - version: 6.2.2 - resolution: "chai@npm:6.2.2" - checksum: 10c0/e6c69e5f0c11dffe6ea13d0290936ebb68fcc1ad688b8e952e131df6a6d5797d5e860bc55cef1aca2e950c3e1f96daf79e9d5a70fb7dbaab4e46355e2635ed53 - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 - languageName: node - linkType: hard - -"cliui@npm:^9.0.1": - version: 9.0.1 - resolution: "cliui@npm:9.0.1" - dependencies: - string-width: "npm:^7.2.0" - strip-ansi: "npm:^7.1.0" - wrap-ansi: "npm:^9.0.0" - checksum: 10c0/13441832e9efe7c7a76bd2b8e683555c478d461a9f249dc5db9b17fe8d4b47fa9277b503914b90bd00e4a151abb6b9b02b2288972ffe2e5e3ca40bcb1c2330d3 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: "npm:~1.0.0" - checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 - languageName: node - linkType: hard - -"compare-versions@npm:^6.1.1": - version: 6.1.1 - resolution: "compare-versions@npm:6.1.1" - checksum: 10c0/415205c7627f9e4f358f571266422980c9fe2d99086be0c9a48008ef7c771f32b0fbe8e97a441ffedc3910872f917a0675fe0fe3c3b6d331cda6d8690be06338 - languageName: node - linkType: hard - -"confbox@npm:^0.1.8": - version: 0.1.8 - resolution: "confbox@npm:0.1.8" - checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 - languageName: node - linkType: hard - -"confbox@npm:^0.2.2": - version: 0.2.2 - resolution: "confbox@npm:0.2.2" - checksum: 10c0/7c246588d533d31e8cdf66cb4701dff6de60f9be77ab54c0d0338e7988750ac56863cc0aca1b3f2046f45ff223a765d3e5d4977a7674485afcd37b6edf3fd129 - languageName: node - linkType: hard - -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0": - version: 7.0.6 - resolution: "cross-spawn@npm:7.0.6" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 - languageName: node - linkType: hard - -"csstype@npm:^3.2.2": - version: 3.2.3 - resolution: "csstype@npm:3.2.3" - checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce - languageName: node - linkType: hard - -"de-indent@npm:^1.0.2": - version: 1.0.2 - resolution: "de-indent@npm:1.0.2" - checksum: 10c0/7058ce58abd6dfc123dd204e36be3797abd419b59482a634605420f47ae97639d0c183ec5d1b904f308a01033f473673897afc2bd59bc620ebf1658763ef4291 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 - languageName: node - linkType: hard - -"debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.4.0": - version: 4.4.3 - resolution: "debug@npm:4.4.3" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 - languageName: node - linkType: hard - -"defu@npm:^6.1.4": - version: 6.1.4 - resolution: "defu@npm:6.1.4" - checksum: 10c0/2d6cc366262dc0cb8096e429368e44052fdf43ed48e53ad84cc7c9407f890301aa5fcb80d0995abaaf842b3949f154d060be4160f7a46cb2bc2f7726c81526f5 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.3": - version: 2.1.2 - resolution: "detect-libc@npm:2.1.2" - checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 - languageName: node - linkType: hard - -"diff@npm:~8.0.2": - version: 8.0.3 - resolution: "diff@npm:8.0.3" - checksum: 10c0/d29321c70d3545fdcb56c5fdd76028c3f04c012462779e062303d4c3c531af80d2c360c26b871e6e2b9a971d2422d47e1779a859106c4cac4b5d2d143df70e20 - languageName: node - linkType: hard - -"dts-resolver@npm:^2.1.3": - version: 2.1.3 - resolution: "dts-resolver@npm:2.1.3" - peerDependencies: - oxc-resolver: ">=11.0.0" - peerDependenciesMeta: - oxc-resolver: - optional: true - checksum: 10c0/bf589ba9bfacdb23ff9c075948175f5a21ae0bccb2ca36f8315bff2729358902256ee7aca972f5b259641f08a4b5973034e082a730113d5af76e64062e45fe3a - languageName: node - linkType: hard - -"dunder-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "dunder-proto@npm:1.0.1" - dependencies: - call-bind-apply-helpers: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.2.0" - checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.263": - version: 1.5.286 - resolution: "electron-to-chromium@npm:1.5.286" - checksum: 10c0/5384510f9682d7e46f98fa48b874c3901d9639de96e9e387afce1fe010fbac31376df0534524edc15f66e9902bfacee54037a5e598004e9c6a617884e379926d - languageName: node - linkType: hard - -"emoji-regex@npm:^10.3.0": - version: 10.6.0 - resolution: "emoji-regex@npm:10.6.0" - checksum: 10c0/1e4aa097bb007301c3b4b1913879ae27327fdc48e93eeefefe3b87e495eb33c5af155300be951b4349ff6ac084f4403dc9eff970acba7c1c572d89396a9a32d7 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 - languageName: node - linkType: hard - -"empathic@npm:^2.0.0": - version: 2.0.0 - resolution: "empathic@npm:2.0.0" - checksum: 10c0/7d3b14b04a93b35c47bcc950467ec914fd241cd9acc0269b0ea160f13026ec110f520c90fae64720fde72cc1757b57f3f292fb606617b7fccac1f4d008a76506 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 - languageName: node - linkType: hard - -"entities@npm:^7.0.0": - version: 7.0.1 - resolution: "entities@npm:7.0.1" - checksum: 10c0/b4fb9937bb47ecb00aaaceb9db9cdd1cc0b0fb649c0e843d05cf5dbbd2e9d2df8f98721d8b1b286445689c72af7b54a7242fc2d63ef7c9739037a8c73363e7ca - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.1": - version: 1.0.1 - resolution: "es-define-property@npm:1.0.1" - checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 - languageName: node - linkType: hard - -"es-module-lexer@npm:^1.7.0": - version: 1.7.0 - resolution: "es-module-lexer@npm:1.7.0" - checksum: 10c0/4c935affcbfeba7fb4533e1da10fa8568043df1e3574b869385980de9e2d475ddc36769891936dbb07036edb3c3786a8b78ccf44964cd130dedc1f2c984b6c7b - languageName: node - linkType: hard - -"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": - version: 1.1.1 - resolution: "es-object-atoms@npm:1.1.1" - dependencies: - es-errors: "npm:^1.3.0" - checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.1.0": - version: 2.1.0 - resolution: "es-set-tostringtag@npm:2.1.0" - dependencies: - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af - languageName: node - linkType: hard - -"esbuild@npm:^0.27.0": - version: 0.27.2 - resolution: "esbuild@npm:0.27.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.27.2" - "@esbuild/android-arm": "npm:0.27.2" - "@esbuild/android-arm64": "npm:0.27.2" - "@esbuild/android-x64": "npm:0.27.2" - "@esbuild/darwin-arm64": "npm:0.27.2" - "@esbuild/darwin-x64": "npm:0.27.2" - "@esbuild/freebsd-arm64": "npm:0.27.2" - "@esbuild/freebsd-x64": "npm:0.27.2" - "@esbuild/linux-arm": "npm:0.27.2" - "@esbuild/linux-arm64": "npm:0.27.2" - "@esbuild/linux-ia32": "npm:0.27.2" - "@esbuild/linux-loong64": "npm:0.27.2" - "@esbuild/linux-mips64el": "npm:0.27.2" - "@esbuild/linux-ppc64": "npm:0.27.2" - "@esbuild/linux-riscv64": "npm:0.27.2" - "@esbuild/linux-s390x": "npm:0.27.2" - "@esbuild/linux-x64": "npm:0.27.2" - "@esbuild/netbsd-arm64": "npm:0.27.2" - "@esbuild/netbsd-x64": "npm:0.27.2" - "@esbuild/openbsd-arm64": "npm:0.27.2" - "@esbuild/openbsd-x64": "npm:0.27.2" - "@esbuild/openharmony-arm64": "npm:0.27.2" - "@esbuild/sunos-x64": "npm:0.27.2" - "@esbuild/win32-arm64": "npm:0.27.2" - "@esbuild/win32-ia32": "npm:0.27.2" - "@esbuild/win32-x64": "npm:0.27.2" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-arm64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/openharmony-arm64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/cf83f626f55500f521d5fe7f4bc5871bec240d3deb2a01fbd379edc43b3664d1167428738a5aad8794b35d1cca985c44c375b1cd38a2ca613c77ced2c83aafcd - languageName: node - linkType: hard - -"esbuild@npm:~0.27.0": - version: 0.27.3 - resolution: "esbuild@npm:0.27.3" - dependencies: - "@esbuild/aix-ppc64": "npm:0.27.3" - "@esbuild/android-arm": "npm:0.27.3" - "@esbuild/android-arm64": "npm:0.27.3" - "@esbuild/android-x64": "npm:0.27.3" - "@esbuild/darwin-arm64": "npm:0.27.3" - "@esbuild/darwin-x64": "npm:0.27.3" - "@esbuild/freebsd-arm64": "npm:0.27.3" - "@esbuild/freebsd-x64": "npm:0.27.3" - "@esbuild/linux-arm": "npm:0.27.3" - "@esbuild/linux-arm64": "npm:0.27.3" - "@esbuild/linux-ia32": "npm:0.27.3" - "@esbuild/linux-loong64": "npm:0.27.3" - "@esbuild/linux-mips64el": "npm:0.27.3" - "@esbuild/linux-ppc64": "npm:0.27.3" - "@esbuild/linux-riscv64": "npm:0.27.3" - "@esbuild/linux-s390x": "npm:0.27.3" - "@esbuild/linux-x64": "npm:0.27.3" - "@esbuild/netbsd-arm64": "npm:0.27.3" - "@esbuild/netbsd-x64": "npm:0.27.3" - "@esbuild/openbsd-arm64": "npm:0.27.3" - "@esbuild/openbsd-x64": "npm:0.27.3" - "@esbuild/openharmony-arm64": "npm:0.27.3" - "@esbuild/sunos-x64": "npm:0.27.3" - "@esbuild/win32-arm64": "npm:0.27.3" - "@esbuild/win32-ia32": "npm:0.27.3" - "@esbuild/win32-x64": "npm:0.27.3" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-arm64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/openharmony-arm64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/fdc3f87a3f08b3ef98362f37377136c389a0d180fda4b8d073b26ba930cf245521db0a368f119cc7624bc619248fff1439f5811f062d853576f8ffa3df8ee5f1 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 - languageName: node - linkType: hard - -"escalade@npm:^3.2.0": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 - languageName: node - linkType: hard - -"esprima@npm:^4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 - languageName: node - linkType: hard - -"estree-walker@npm:^2.0.2": - version: 2.0.2 - resolution: "estree-walker@npm:2.0.2" - checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af - languageName: node - linkType: hard - -"estree-walker@npm:^3.0.3": - version: 3.0.3 - resolution: "estree-walker@npm:3.0.3" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d - languageName: node - linkType: hard - -"expect-type@npm:^1.2.2": - version: 1.3.0 - resolution: "expect-type@npm:1.3.0" - checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 - languageName: node - linkType: hard - -"exsolve@npm:^1.0.7": - version: 1.0.8 - resolution: "exsolve@npm:1.0.8" - checksum: 10c0/65e44ae05bd4a4a5d87cfdbbd6b8f24389282cf9f85fa5feb17ca87ad3f354877e6af4cd99e02fc29044174891f82d1d68c77f69234410eb8f163530e6278c67 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fast-uri@npm:^3.0.1": - version: 3.0.1 - resolution: "fast-uri@npm:3.0.1" - checksum: 10c0/3cd46d6006083b14ca61ffe9a05b8eef75ef87e9574b6f68f2e17ecf4daa7aaadeff44e3f0f7a0ef4e0f7e7c20fc07beec49ff14dc72d0b500f00386592f2d10 - languageName: node - linkType: hard - -"fdir@npm:^6.5.0": - version: 6.5.0 - resolution: "fdir@npm:6.5.0" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f - languageName: node - linkType: hard - -"follow-redirects@npm:^1.15.11": - version: 1.15.11 - resolution: "follow-redirects@npm:1.15.11" - peerDependenciesMeta: - debug: - optional: true - checksum: 10c0/d301f430542520a54058d4aeeb453233c564aaccac835d29d15e050beb33f339ad67d9bddbce01739c5dc46a6716dbe3d9d0d5134b1ca203effa11a7ef092343 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 - languageName: node - linkType: hard - -"form-data@npm:^4.0.5": - version: 4.0.5 - resolution: "form-data@npm:4.0.5" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.8" - es-set-tostringtag: "npm:^2.1.0" - hasown: "npm:^2.0.2" - mime-types: "npm:^2.1.12" - checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b - languageName: node - linkType: hard - -"fs-extra@npm:~11.3.0": - version: 11.3.3 - resolution: "fs-extra@npm:11.3.3" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10c0/984924ff4104e3e9f351b658a864bf3b354b2c90429f57aec0acd12d92c4e6b762cbacacdffb4e745b280adce882e1f980c485d9f02c453f769ab4e7fc646ce3 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"generator-function@npm:^2.0.0": - version: 2.0.1 - resolution: "generator-function@npm:2.0.1" - checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8 - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde - languageName: node - linkType: hard - -"get-east-asian-width@npm:^1.0.0": - version: 1.5.0 - resolution: "get-east-asian-width@npm:1.5.0" - checksum: 10c0/bff8bbc8d81790b9477f7aa55b1806b9f082a8dc1359fff7bd8b96939622c86b729685afc2bfeb22def1fc6ef1e5228e4d87dd4e6da60bc43a5edfb03c4ee167 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.6": - version: 1.3.1 - resolution: "get-intrinsic@npm:1.3.1" - dependencies: - async-function: "npm:^1.0.0" - async-generator-function: "npm:^1.0.0" - call-bind-apply-helpers: "npm:^1.0.2" - es-define-property: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.1.1" - function-bind: "npm:^1.1.2" - generator-function: "npm:^2.0.0" - get-proto: "npm:^1.0.1" - gopd: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - hasown: "npm:^2.0.2" - math-intrinsics: "npm:^1.1.0" - checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d - languageName: node - linkType: hard - -"get-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "get-proto@npm:1.0.1" - dependencies: - dunder-proto: "npm:^1.0.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c - languageName: node - linkType: hard - -"get-tsconfig@npm:^4.13.1": - version: 4.13.6 - resolution: "get-tsconfig@npm:4.13.6" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/bab6937302f542f97217cbe7cbbdfa7e85a56a377bc7a73e69224c1f0b7c9ae8365918e55752ae8648265903f506c1705f63c0de1d4bab1ec2830fef3e539a1a - languageName: node - linkType: hard - -"get-tsconfig@npm:^4.7.5": - version: 4.7.5 - resolution: "get-tsconfig@npm:4.7.5" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/a917dff2ba9ee187c41945736bf9bbab65de31ce5bc1effd76267be483a7340915cff232199406379f26517d2d0a4edcdbcda8cca599c2480a0f2cf1e1de3efa - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.3.15 - resolution: "glob@npm:10.3.15" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.3.6" - minimatch: "npm:^9.0.1" - minipass: "npm:^7.0.4" - path-scurry: "npm:^1.11.0" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/cda748ddc181b31b3df9548c0991800406d5cc3b3f8110e37a8751ec1e39f37cdae7d7782d5422d7df92775121cdf00599992dff22f7ff1260344843af227c2b - languageName: node - linkType: hard - -"gopd@npm:^1.2.0": - version: 1.2.0 - resolution: "gopd@npm:1.2.0" - checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"handlebars@npm:^4.7.8": - version: 4.7.8 - resolution: "handlebars@npm:4.7.8" - dependencies: - minimist: "npm:^1.2.5" - neo-async: "npm:^2.6.2" - source-map: "npm:^0.6.1" - uglify-js: "npm:^3.1.4" - wordwrap: "npm:^1.0.0" - dependenciesMeta: - uglify-js: - optional: true - bin: - handlebars: bin/handlebars - checksum: 10c0/7aff423ea38a14bb379316f3857fe0df3c5d66119270944247f155ba1f08e07a92b340c58edaa00cfe985c21508870ee5183e0634dcb53dd405f35c93ef7f10d - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": - version: 1.1.0 - resolution: "has-symbols@npm:1.1.0" - checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c - languageName: node - linkType: hard - -"hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 - languageName: node - linkType: hard - -"hookable@npm:^6.0.1": - version: 6.0.1 - resolution: "hookable@npm:6.0.1" - checksum: 10c0/a53592937c1aa74a650b3b92a9d8cf8bd58eee48422124a90299344f81e90cd2ee2f3d9f3686c45c0bc87edbc9fede4de709edf6b987dd6837bdcfa502447fa0 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.4 - resolution: "https-proxy-agent@npm:7.0.4" - dependencies: - agent-base: "npm:^7.0.2" - debug: "npm:4" - checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b - languageName: node - linkType: hard - -"i18next@npm:^25.8.11": - version: 25.8.11 - resolution: "i18next@npm:25.8.11" - dependencies: - "@babel/runtime": "npm:^7.28.4" - peerDependencies: - typescript: ^5 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/6e7a4068a5276825e10fa6e883c06acf34a3be273a69cb4117ea3154b04a85be94a685a2c78bfb1a42d89d8db10577cb2a248e4a65481ba5a435d28e741fed0c - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - -"import-fresh@npm:^3.3.1": - version: 3.3.1 - resolution: "import-fresh@npm:3.3.1" - dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec - languageName: node - linkType: hard - -"import-lazy@npm:~4.0.0": - version: 4.0.0 - resolution: "import-lazy@npm:4.0.0" - checksum: 10c0/a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca - languageName: node - linkType: hard - -"import-without-cache@npm:^0.2.5": - version: 0.2.5 - resolution: "import-without-cache@npm:0.2.5" - checksum: 10c0/5cf7a00e317a23569f16c87391170270277c073cba498c913bf043af56c56118d023c8d041046535566135c34503c90a9320483448b070a4ab4ae29949547a71 - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc - languageName: node - linkType: hard - -"is-core-module@npm:^2.16.1": - version: 2.16.1 - resolution: "is-core-module@npm:2.16.1" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 - languageName: node - linkType: hard - -"jackspeak@npm:^2.3.6": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 - languageName: node - linkType: hard - -"jju@npm:~1.4.0": - version: 1.4.0 - resolution: "jju@npm:1.4.0" - checksum: 10c0/f3f444557e4364cfc06b1abf8331bf3778b26c0c8552ca54429bc0092652172fdea26cbffe33e1017b303d5aa506f7ede8571857400efe459cb7439180e2acad - languageName: node - linkType: hard - -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed - languageName: node - linkType: hard - -"js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^4.0.0" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 - languageName: node - linkType: hard - -"jsesc@npm:^3.0.2": - version: 3.1.0 - resolution: "jsesc@npm:3.1.0" - bin: - jsesc: bin/jsesc - checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 - languageName: node - linkType: hard - -"json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.2.0 - resolution: "jsonfile@npm:6.2.0" - dependencies: - graceful-fs: "npm:^4.1.6" - universalify: "npm:^2.0.0" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 10c0/7f4f43b08d1869ded8a6822213d13ae3b99d651151d77efd1557ced0889c466296a7d9684e397bd126acf5eb2cfcb605808c3e681d0fdccd2fe5a04b47e76c0d - languageName: node - linkType: hard - -"kolorist@npm:^1.8.0": - version: 1.8.0 - resolution: "kolorist@npm:1.8.0" - checksum: 10c0/73075db44a692bf6c34a649f3b4b3aea4993b84f6b754cbf7a8577e7c7db44c0bad87752bd23b0ce533f49de2244ce2ce03b7b1b667a85ae170a94782cc50f9b - languageName: node - linkType: hard - -"lightningcss-android-arm64@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-android-arm64@npm:1.31.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-darwin-arm64@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-darwin-arm64@npm:1.31.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-darwin-x64@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-darwin-x64@npm:1.31.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-freebsd-x64@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-freebsd-x64@npm:1.31.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-linux-arm-gnueabihf@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-linux-arm-gnueabihf@npm:1.31.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"lightningcss-linux-arm64-gnu@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-linux-arm64-gnu@npm:1.31.1" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"lightningcss-linux-arm64-musl@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-linux-arm64-musl@npm:1.31.1" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"lightningcss-linux-x64-gnu@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-linux-x64-gnu@npm:1.31.1" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"lightningcss-linux-x64-musl@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-linux-x64-musl@npm:1.31.1" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"lightningcss-win32-arm64-msvc@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-win32-arm64-msvc@npm:1.31.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-win32-x64-msvc@npm:1.31.1": - version: 1.31.1 - resolution: "lightningcss-win32-x64-msvc@npm:1.31.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"lightningcss@npm:^1.30.2": - version: 1.31.1 - resolution: "lightningcss@npm:1.31.1" - dependencies: - detect-libc: "npm:^2.0.3" - lightningcss-android-arm64: "npm:1.31.1" - lightningcss-darwin-arm64: "npm:1.31.1" - lightningcss-darwin-x64: "npm:1.31.1" - lightningcss-freebsd-x64: "npm:1.31.1" - lightningcss-linux-arm-gnueabihf: "npm:1.31.1" - lightningcss-linux-arm64-gnu: "npm:1.31.1" - lightningcss-linux-arm64-musl: "npm:1.31.1" - lightningcss-linux-x64-gnu: "npm:1.31.1" - lightningcss-linux-x64-musl: "npm:1.31.1" - lightningcss-win32-arm64-msvc: "npm:1.31.1" - lightningcss-win32-x64-msvc: "npm:1.31.1" - dependenciesMeta: - lightningcss-android-arm64: - optional: true - lightningcss-darwin-arm64: - optional: true - lightningcss-darwin-x64: - optional: true - lightningcss-freebsd-x64: - optional: true - lightningcss-linux-arm-gnueabihf: - optional: true - lightningcss-linux-arm64-gnu: - optional: true - lightningcss-linux-arm64-musl: - optional: true - lightningcss-linux-x64-gnu: - optional: true - lightningcss-linux-x64-musl: - optional: true - lightningcss-win32-arm64-msvc: - optional: true - lightningcss-win32-x64-msvc: - optional: true - checksum: 10c0/c6754b305d4a73652e472fc0d7d65384a6e16c336ea61068eca60de2a45bd5c30abbf012358b82eac56ee98b5d88028932cda5268ff61967cffa400b9e7ee2ba - languageName: node - linkType: hard - -"local-pkg@npm:^1.0.0": - version: 1.1.2 - resolution: "local-pkg@npm:1.1.2" - dependencies: - mlly: "npm:^1.7.4" - pkg-types: "npm:^2.3.0" - quansync: "npm:^0.2.11" - checksum: 10c0/1bcfcc5528dea95cba3caa478126a348d3985aad9f69ecf7802c13efef90897e1c5ff7851974332c5e6d4a4698efe610fef758a068c8bc3feb5322aeb35d5993 - languageName: node - linkType: hard - -"lodash@npm:~4.17.15": - version: 4.17.23 - resolution: "lodash@npm:4.17.23" - checksum: 10c0/1264a90469f5bb95d4739c43eb6277d15b6d9e186df4ac68c3620443160fc669e2f14c11e7d8b2ccf078b81d06147c01a8ccced9aab9f9f63d50dcf8cace6bf6 - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.2.2 - resolution: "lru-cache@npm:10.2.2" - checksum: 10c0/402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6 - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: "npm:^3.0.2" - checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 - languageName: node - linkType: hard - -"magic-string@npm:^0.30.17, magic-string@npm:^0.30.21": - version: 0.30.21 - resolution: "magic-string@npm:0.30.21" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.5" - checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a - languageName: node - linkType: hard - -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" - dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e - languageName: node - linkType: hard - -"math-intrinsics@npm:^1.1.0": - version: 1.1.0 - resolution: "math-intrinsics@npm:1.1.0" - checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - -"minimatch@npm:10.0.3": - version: 10.0.3 - resolution: "minimatch@npm:10.0.3" - dependencies: - "@isaacs/brace-expansion": "npm:^5.0.0" - checksum: 10c0/e43e4a905c5d70ac4cec8530ceaeccb9c544b1ba8ac45238e2a78121a01c17ff0c373346472d221872563204eabe929ad02669bb575cb1f0cc30facab369f70f - languageName: node - linkType: hard - -"minimatch@npm:^9.0.1": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.3": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed - languageName: node - linkType: hard - -"minimist@npm:^1.2.5": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4": - version: 7.1.1 - resolution: "minipass@npm:7.1.1" - checksum: 10c0/fdccc2f99c31083f45f881fd1e6971d798e333e078ab3c8988fb818c470fbd5e935388ad9adb286397eba50baebf46ef8ff487c8d3f455a69c6f3efc327bdff9 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: "npm:^3.0.0" - yallist: "npm:^4.0.0" - checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf - languageName: node - linkType: hard - -"mlly@npm:^1.7.4": - version: 1.8.0 - resolution: "mlly@npm:1.8.0" - dependencies: - acorn: "npm:^8.15.0" - pathe: "npm:^2.0.3" - pkg-types: "npm:^1.3.1" - ufo: "npm:^1.6.1" - checksum: 10c0/f174b844ae066c71e9b128046677868e2e28694f0bbeeffbe760b2a9d8ff24de0748d0fde6fabe706700c1d2e11d3c0d7a53071b5ea99671592fac03364604ab - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc - languageName: node - linkType: hard - -"ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"muggle-string@npm:^0.4.1": - version: 0.4.1 - resolution: "muggle-string@npm:0.4.1" - checksum: 10c0/e914b63e24cd23f97e18376ec47e4ba3aa24365e4776212b666add2e47bb158003212980d732c49abf3719568900af7861873844a6e2d3a7ca7e86952c0e99e9 - languageName: node - linkType: hard - -"nanoid@npm:^3.3.11": - version: 3.3.11 - resolution: "nanoid@npm:3.3.11" - bin: - nanoid: bin/nanoid.cjs - checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 - languageName: node - linkType: hard - -"neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 10.1.0 - resolution: "node-gyp@npm:10.1.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^3.0.0" - semver: "npm:^7.3.5" - tar: "npm:^6.1.2" - which: "npm:^4.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c - languageName: node - linkType: hard - -"node-releases@npm:^2.0.27": - version: 2.0.27 - resolution: "node-releases@npm:2.0.27" - checksum: 10c0/f1e6583b7833ea81880627748d28a3a7ff5703d5409328c216ae57befbced10ce2c991bea86434e8ec39003bd017f70481e2e5f8c1f7e0a7663241f81d6e00e2 - languageName: node - linkType: hard - -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" - dependencies: - abbrev: "npm:^2.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 - languageName: node - linkType: hard - -"obug@npm:^2.1.1": - version: 2.1.1 - resolution: "obug@npm:2.1.1" - checksum: 10c0/59dccd7de72a047e08f8649e94c1015ec72f94eefb6ddb57fb4812c4b425a813bc7e7cd30c9aca20db3c59abc3c85cc7a62bb656a968741d770f4e8e02bc2e78 - languageName: node - linkType: hard - -"openapi-types@npm:^12.1.3": - version: 12.1.3 - resolution: "openapi-types@npm:12.1.3" - checksum: 10c0/4ad4eb91ea834c237edfa6ab31394e87e00c888fc2918009763389c00d02342345195d6f302d61c3fd807f17723cd48df29b47b538b68375b3827b3758cd520f - languageName: node - linkType: hard - -"oxfmt@npm:^0.34.0": - version: 0.34.0 - resolution: "oxfmt@npm:0.34.0" - dependencies: - "@oxfmt/binding-android-arm-eabi": "npm:0.34.0" - "@oxfmt/binding-android-arm64": "npm:0.34.0" - "@oxfmt/binding-darwin-arm64": "npm:0.34.0" - "@oxfmt/binding-darwin-x64": "npm:0.34.0" - "@oxfmt/binding-freebsd-x64": "npm:0.34.0" - "@oxfmt/binding-linux-arm-gnueabihf": "npm:0.34.0" - "@oxfmt/binding-linux-arm-musleabihf": "npm:0.34.0" - "@oxfmt/binding-linux-arm64-gnu": "npm:0.34.0" - "@oxfmt/binding-linux-arm64-musl": "npm:0.34.0" - "@oxfmt/binding-linux-ppc64-gnu": "npm:0.34.0" - "@oxfmt/binding-linux-riscv64-gnu": "npm:0.34.0" - "@oxfmt/binding-linux-riscv64-musl": "npm:0.34.0" - "@oxfmt/binding-linux-s390x-gnu": "npm:0.34.0" - "@oxfmt/binding-linux-x64-gnu": "npm:0.34.0" - "@oxfmt/binding-linux-x64-musl": "npm:0.34.0" - "@oxfmt/binding-openharmony-arm64": "npm:0.34.0" - "@oxfmt/binding-win32-arm64-msvc": "npm:0.34.0" - "@oxfmt/binding-win32-ia32-msvc": "npm:0.34.0" - "@oxfmt/binding-win32-x64-msvc": "npm:0.34.0" - tinypool: "npm:2.1.0" - dependenciesMeta: - "@oxfmt/binding-android-arm-eabi": - optional: true - "@oxfmt/binding-android-arm64": - optional: true - "@oxfmt/binding-darwin-arm64": - optional: true - "@oxfmt/binding-darwin-x64": - optional: true - "@oxfmt/binding-freebsd-x64": - optional: true - "@oxfmt/binding-linux-arm-gnueabihf": - optional: true - "@oxfmt/binding-linux-arm-musleabihf": - optional: true - "@oxfmt/binding-linux-arm64-gnu": - optional: true - "@oxfmt/binding-linux-arm64-musl": - optional: true - "@oxfmt/binding-linux-ppc64-gnu": - optional: true - "@oxfmt/binding-linux-riscv64-gnu": - optional: true - "@oxfmt/binding-linux-riscv64-musl": - optional: true - "@oxfmt/binding-linux-s390x-gnu": - optional: true - "@oxfmt/binding-linux-x64-gnu": - optional: true - "@oxfmt/binding-linux-x64-musl": - optional: true - "@oxfmt/binding-openharmony-arm64": - optional: true - "@oxfmt/binding-win32-arm64-msvc": - optional: true - "@oxfmt/binding-win32-ia32-msvc": - optional: true - "@oxfmt/binding-win32-x64-msvc": - optional: true - bin: - oxfmt: bin/oxfmt - checksum: 10c0/af774ad06cadd4ea3340e7c86e30f82d316b190f53ed25bad66a622be83487eaed6b37cf380fbb2557d0a58b258190d40df7c062582e1777bbdf375b72a02adc - languageName: node - linkType: hard - -"oxlint-tsgolint@npm:^0.14.1": - version: 0.14.1 - resolution: "oxlint-tsgolint@npm:0.14.1" - dependencies: - "@oxlint-tsgolint/darwin-arm64": "npm:0.14.1" - "@oxlint-tsgolint/darwin-x64": "npm:0.14.1" - "@oxlint-tsgolint/linux-arm64": "npm:0.14.1" - "@oxlint-tsgolint/linux-x64": "npm:0.14.1" - "@oxlint-tsgolint/win32-arm64": "npm:0.14.1" - "@oxlint-tsgolint/win32-x64": "npm:0.14.1" - dependenciesMeta: - "@oxlint-tsgolint/darwin-arm64": - optional: true - "@oxlint-tsgolint/darwin-x64": - optional: true - "@oxlint-tsgolint/linux-arm64": - optional: true - "@oxlint-tsgolint/linux-x64": - optional: true - "@oxlint-tsgolint/win32-arm64": - optional: true - "@oxlint-tsgolint/win32-x64": - optional: true - bin: - tsgolint: bin/tsgolint.js - checksum: 10c0/c490d883349b3ecd11d573ca9129984016e580caa0fce5003463089c48cf10f61077f1a686f193fb7fdf2487e1058e4ea22159868d8d655575cc00d54596f2c6 - languageName: node - linkType: hard - -"oxlint@npm:^1.49.0": - version: 1.49.0 - resolution: "oxlint@npm:1.49.0" - dependencies: - "@oxlint/binding-android-arm-eabi": "npm:1.49.0" - "@oxlint/binding-android-arm64": "npm:1.49.0" - "@oxlint/binding-darwin-arm64": "npm:1.49.0" - "@oxlint/binding-darwin-x64": "npm:1.49.0" - "@oxlint/binding-freebsd-x64": "npm:1.49.0" - "@oxlint/binding-linux-arm-gnueabihf": "npm:1.49.0" - "@oxlint/binding-linux-arm-musleabihf": "npm:1.49.0" - "@oxlint/binding-linux-arm64-gnu": "npm:1.49.0" - "@oxlint/binding-linux-arm64-musl": "npm:1.49.0" - "@oxlint/binding-linux-ppc64-gnu": "npm:1.49.0" - "@oxlint/binding-linux-riscv64-gnu": "npm:1.49.0" - "@oxlint/binding-linux-riscv64-musl": "npm:1.49.0" - "@oxlint/binding-linux-s390x-gnu": "npm:1.49.0" - "@oxlint/binding-linux-x64-gnu": "npm:1.49.0" - "@oxlint/binding-linux-x64-musl": "npm:1.49.0" - "@oxlint/binding-openharmony-arm64": "npm:1.49.0" - "@oxlint/binding-win32-arm64-msvc": "npm:1.49.0" - "@oxlint/binding-win32-ia32-msvc": "npm:1.49.0" - "@oxlint/binding-win32-x64-msvc": "npm:1.49.0" - peerDependencies: - oxlint-tsgolint: ">=0.14.1" - dependenciesMeta: - "@oxlint/binding-android-arm-eabi": - optional: true - "@oxlint/binding-android-arm64": - optional: true - "@oxlint/binding-darwin-arm64": - optional: true - "@oxlint/binding-darwin-x64": - optional: true - "@oxlint/binding-freebsd-x64": - optional: true - "@oxlint/binding-linux-arm-gnueabihf": - optional: true - "@oxlint/binding-linux-arm-musleabihf": - optional: true - "@oxlint/binding-linux-arm64-gnu": - optional: true - "@oxlint/binding-linux-arm64-musl": - optional: true - "@oxlint/binding-linux-ppc64-gnu": - optional: true - "@oxlint/binding-linux-riscv64-gnu": - optional: true - "@oxlint/binding-linux-riscv64-musl": - optional: true - "@oxlint/binding-linux-s390x-gnu": - optional: true - "@oxlint/binding-linux-x64-gnu": - optional: true - "@oxlint/binding-linux-x64-musl": - optional: true - "@oxlint/binding-openharmony-arm64": - optional: true - "@oxlint/binding-win32-arm64-msvc": - optional: true - "@oxlint/binding-win32-ia32-msvc": - optional: true - "@oxlint/binding-win32-x64-msvc": - optional: true - peerDependenciesMeta: - oxlint-tsgolint: - optional: true - bin: - oxlint: bin/oxlint - checksum: 10c0/86ab075209d21182036383c70aa126618b16d1321019c0cd4a0a22f9285160444dd641589c10e27fc9bd1fb312d05f082a22b3a169cc9846396ec9f42f4c895b - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: "npm:^3.0.0" - checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 - languageName: node - linkType: hard - -"path-browserify@npm:^1.0.1": - version: 1.0.1 - resolution: "path-browserify@npm:1.0.1" - checksum: 10c0/8b8c3fd5c66bd340272180590ae4ff139769e9ab79522e2eb82e3d571a89b8117c04147f65ad066dccfb42fcad902e5b7d794b3d35e0fd840491a8ddbedf8c66 - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.0": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - -"pathe@npm:^2.0.1, pathe@npm:^2.0.3": - version: 2.0.3 - resolution: "pathe@npm:2.0.3" - checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 - languageName: node - linkType: hard - -"picocolors@npm:^1.1.1": - version: 1.1.1 - resolution: "picocolors@npm:1.1.1" - checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 - languageName: node - linkType: hard - -"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": - version: 4.0.3 - resolution: "picomatch@npm:4.0.3" - checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 - languageName: node - linkType: hard - -"pkg-types@npm:^1.3.1": - version: 1.3.1 - resolution: "pkg-types@npm:1.3.1" - dependencies: - confbox: "npm:^0.1.8" - mlly: "npm:^1.7.4" - pathe: "npm:^2.0.1" - checksum: 10c0/19e6cb8b66dcc66c89f2344aecfa47f2431c988cfa3366bdfdcfb1dd6695f87dcce37fbd90fe9d1605e2f4440b77f391e83c23255347c35cf84e7fd774d7fcea - languageName: node - linkType: hard - -"pkg-types@npm:^2.3.0": - version: 2.3.0 - resolution: "pkg-types@npm:2.3.0" - dependencies: - confbox: "npm:^0.2.2" - exsolve: "npm:^1.0.7" - pathe: "npm:^2.0.3" - checksum: 10c0/d2bbddc5b81bd4741e1529c08ef4c5f1542bbdcf63498b73b8e1d84cff71806d1b8b1577800549bb569cb7aa20056257677b979bff48c97967cba7e64f72ae12 - languageName: node - linkType: hard - -"postcss@npm:^8.5.6": - version: 8.5.6 - resolution: "postcss@npm:8.5.6" - dependencies: - nanoid: "npm:^3.3.11" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 - languageName: node - linkType: hard - -"proc-log@npm:^3.0.0": - version: 3.0.0 - resolution: "proc-log@npm:3.0.0" - checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc - languageName: node - linkType: hard - -"proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - -"prompt-sync@npm:^4.2.0": - version: 4.2.0 - resolution: "prompt-sync@npm:4.2.0" - dependencies: - strip-ansi: "npm:^5.0.0" - checksum: 10c0/1312154b8d84c7487b734afdc5d9f7e092ac7a3a303aec8dfd3ba680502374f5942ca501943c6314ae77979aa4dcd3c6cd03db5da6ac7e4531d384c9740261ad - languageName: node - linkType: hard - -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 - languageName: node - linkType: hard - -"quansync@npm:^0.2.11": - version: 0.2.11 - resolution: "quansync@npm:0.2.11" - checksum: 10c0/cb9a1f8ebce074069f2f6a78578873ffedd9de9f6aa212039b44c0870955c04a71c3b1311b5d97f8ac2f2ec476de202d0a5c01160cb12bc0a11b7ef36d22ef56 - languageName: node - linkType: hard - -"quansync@npm:^1.0.0": - version: 1.0.0 - resolution: "quansync@npm:1.0.0" - checksum: 10c0/076542634399a0cc46078baab6b31acee7a88c5a435234345f645aedaa42bc6a63836e655fb39b1b21a83c98ec86a4b73ec5e2b2d6f3fdc22711eeeff9463253 - languageName: node - linkType: hard - -"react-refresh@npm:^0.18.0": - version: 0.18.0 - resolution: "react-refresh@npm:0.18.0" - checksum: 10c0/34a262f7fd803433a534f50deb27a148112a81adcae440c7d1cbae7ef14d21ea8f2b3d783e858cb7698968183b77755a38b4d4b5b1d79b4f4689c2f6d358fff2 - languageName: node - linkType: hard - -"react@npm:^19.2.4": - version: 19.2.4 - resolution: "react@npm:19.2.4" - checksum: 10c0/cd2c9ff67a720799cc3b38a516009986f7fc4cb8d3e15716c6211cf098d1357ee3e348ab05ad0600042bbb0fd888530ba92e329198c92eafa0994f5213396596 - languageName: node - linkType: hard - -"reflect-metadata@npm:^0.2.2": - version: 0.2.2 - resolution: "reflect-metadata@npm:0.2.2" - checksum: 10c0/1cd93a15ea291e420204955544637c264c216e7aac527470e393d54b4bb075f10a17e60d8168ec96600c7e0b9fcc0cb0bb6e91c3fbf5b0d8c9056f04e6ac1ec2 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 - languageName: node - linkType: hard - -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab - languageName: node - linkType: hard - -"resolve@npm:~1.22.1, resolve@npm:~1.22.2": - version: 1.22.11 - resolution: "resolve@npm:1.22.11" - dependencies: - is-core-module: "npm:^2.16.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/f657191507530f2cbecb5815b1ee99b20741ea6ee02a59c57028e9ec4c2c8d7681afcc35febbd554ac0ded459db6f2d8153382c53a2f266cee2575e512674409 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A~1.22.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin": - version: 1.22.11 - resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.16.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/ee5b182f2e37cb1165465e58c6abc797fec0a80b5ba3231607beb4677db0c9291ac010c47cf092b6daa2b7f518d69a0e21888e7e2b633f68d501a874212a8c63 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe - languageName: node - linkType: hard - -"rolldown-plugin-dts@npm:^0.22.1": - version: 0.22.1 - resolution: "rolldown-plugin-dts@npm:0.22.1" - dependencies: - "@babel/generator": "npm:8.0.0-rc.1" - "@babel/helper-validator-identifier": "npm:8.0.0-rc.1" - "@babel/parser": "npm:8.0.0-rc.1" - "@babel/types": "npm:8.0.0-rc.1" - ast-kit: "npm:^3.0.0-beta.1" - birpc: "npm:^4.0.0" - dts-resolver: "npm:^2.1.3" - get-tsconfig: "npm:^4.13.1" - obug: "npm:^2.1.1" - peerDependencies: - "@ts-macro/tsc": ^0.3.6 - "@typescript/native-preview": ">=7.0.0-dev.20250601.1" - rolldown: ^1.0.0-rc.3 - typescript: ^5.0.0 - vue-tsc: ~3.2.0 - peerDependenciesMeta: - "@ts-macro/tsc": - optional: true - "@typescript/native-preview": - optional: true - typescript: - optional: true - vue-tsc: - optional: true - checksum: 10c0/b84ff0fb2b2c459a519929184f1d0434a8e47a1f4ef1af185f95fa20b6fa089e6ce34588d5f5d5261ab6696d410868a7413635b8d280951c3627a1043125d430 - languageName: node - linkType: hard - -"rolldown@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "rolldown@npm:1.0.0-beta.53" - dependencies: - "@oxc-project/types": "npm:=0.101.0" - "@rolldown/binding-android-arm64": "npm:1.0.0-beta.53" - "@rolldown/binding-darwin-arm64": "npm:1.0.0-beta.53" - "@rolldown/binding-darwin-x64": "npm:1.0.0-beta.53" - "@rolldown/binding-freebsd-x64": "npm:1.0.0-beta.53" - "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-beta.53" - "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-beta.53" - "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-beta.53" - "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-beta.53" - "@rolldown/binding-linux-x64-musl": "npm:1.0.0-beta.53" - "@rolldown/binding-openharmony-arm64": "npm:1.0.0-beta.53" - "@rolldown/binding-wasm32-wasi": "npm:1.0.0-beta.53" - "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-beta.53" - "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-beta.53" - "@rolldown/pluginutils": "npm:1.0.0-beta.53" - dependenciesMeta: - "@rolldown/binding-android-arm64": - optional: true - "@rolldown/binding-darwin-arm64": - optional: true - "@rolldown/binding-darwin-x64": - optional: true - "@rolldown/binding-freebsd-x64": - optional: true - "@rolldown/binding-linux-arm-gnueabihf": - optional: true - "@rolldown/binding-linux-arm64-gnu": - optional: true - "@rolldown/binding-linux-arm64-musl": - optional: true - "@rolldown/binding-linux-x64-gnu": - optional: true - "@rolldown/binding-linux-x64-musl": - optional: true - "@rolldown/binding-openharmony-arm64": - optional: true - "@rolldown/binding-wasm32-wasi": - optional: true - "@rolldown/binding-win32-arm64-msvc": - optional: true - "@rolldown/binding-win32-x64-msvc": - optional: true - bin: - rolldown: bin/cli.mjs - checksum: 10c0/363109aa38b31254e682e69aa9f199074d98b823b437faac6d05fd1b4a2b73168b9434043a060fecfc25d3e1d441e2d3b757e92621bc1e843a3e916e2b0d3f58 - languageName: node - linkType: hard - -"rolldown@npm:1.0.0-rc.5": - version: 1.0.0-rc.5 - resolution: "rolldown@npm:1.0.0-rc.5" - dependencies: - "@oxc-project/types": "npm:=0.114.0" - "@rolldown/binding-android-arm64": "npm:1.0.0-rc.5" - "@rolldown/binding-darwin-arm64": "npm:1.0.0-rc.5" - "@rolldown/binding-darwin-x64": "npm:1.0.0-rc.5" - "@rolldown/binding-freebsd-x64": "npm:1.0.0-rc.5" - "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-rc.5" - "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-rc.5" - "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-rc.5" - "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-rc.5" - "@rolldown/binding-linux-x64-musl": "npm:1.0.0-rc.5" - "@rolldown/binding-openharmony-arm64": "npm:1.0.0-rc.5" - "@rolldown/binding-wasm32-wasi": "npm:1.0.0-rc.5" - "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-rc.5" - "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-rc.5" - "@rolldown/pluginutils": "npm:1.0.0-rc.5" - dependenciesMeta: - "@rolldown/binding-android-arm64": - optional: true - "@rolldown/binding-darwin-arm64": - optional: true - "@rolldown/binding-darwin-x64": - optional: true - "@rolldown/binding-freebsd-x64": - optional: true - "@rolldown/binding-linux-arm-gnueabihf": - optional: true - "@rolldown/binding-linux-arm64-gnu": - optional: true - "@rolldown/binding-linux-arm64-musl": - optional: true - "@rolldown/binding-linux-x64-gnu": - optional: true - "@rolldown/binding-linux-x64-musl": - optional: true - "@rolldown/binding-openharmony-arm64": - optional: true - "@rolldown/binding-wasm32-wasi": - optional: true - "@rolldown/binding-win32-arm64-msvc": - optional: true - "@rolldown/binding-win32-x64-msvc": - optional: true - bin: - rolldown: bin/cli.mjs - checksum: 10c0/66af94a3d91657631967cc1db377fae3291665821d2882ad2abc01cf124539459cf3c053334002f4dcb45a53e67d5c3678aa31c2deffbab76b7b73dc495e243a - languageName: node - linkType: hard - -"rollup@npm:^4.43.0": - version: 4.57.1 - resolution: "rollup@npm:4.57.1" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.57.1" - "@rollup/rollup-android-arm64": "npm:4.57.1" - "@rollup/rollup-darwin-arm64": "npm:4.57.1" - "@rollup/rollup-darwin-x64": "npm:4.57.1" - "@rollup/rollup-freebsd-arm64": "npm:4.57.1" - "@rollup/rollup-freebsd-x64": "npm:4.57.1" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.57.1" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.57.1" - "@rollup/rollup-linux-arm64-gnu": "npm:4.57.1" - "@rollup/rollup-linux-arm64-musl": "npm:4.57.1" - "@rollup/rollup-linux-loong64-gnu": "npm:4.57.1" - "@rollup/rollup-linux-loong64-musl": "npm:4.57.1" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.57.1" - "@rollup/rollup-linux-ppc64-musl": "npm:4.57.1" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.57.1" - "@rollup/rollup-linux-riscv64-musl": "npm:4.57.1" - "@rollup/rollup-linux-s390x-gnu": "npm:4.57.1" - "@rollup/rollup-linux-x64-gnu": "npm:4.57.1" - "@rollup/rollup-linux-x64-musl": "npm:4.57.1" - "@rollup/rollup-openbsd-x64": "npm:4.57.1" - "@rollup/rollup-openharmony-arm64": "npm:4.57.1" - "@rollup/rollup-win32-arm64-msvc": "npm:4.57.1" - "@rollup/rollup-win32-ia32-msvc": "npm:4.57.1" - "@rollup/rollup-win32-x64-gnu": "npm:4.57.1" - "@rollup/rollup-win32-x64-msvc": "npm:4.57.1" - "@types/estree": "npm:1.0.8" - fsevents: "npm:~2.3.2" - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-freebsd-arm64": - optional: true - "@rollup/rollup-freebsd-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-loong64-gnu": - optional: true - "@rollup/rollup-linux-loong64-musl": - optional: true - "@rollup/rollup-linux-ppc64-gnu": - optional: true - "@rollup/rollup-linux-ppc64-musl": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-riscv64-musl": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-openbsd-x64": - optional: true - "@rollup/rollup-openharmony-arm64": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-gnu": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/a90aaf1166fc495920e44e52dced0b12283aaceb0924abd6f863102128dd428bbcbf85970f792c06bc63d2a2168e7f073b73e05f6f8d76fdae17b7ac6cacba06 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d - languageName: node - linkType: hard - -"semver@npm:^7.3.5": - version: 7.6.2 - resolution: "semver@npm:7.6.2" - bin: - semver: bin/semver.js - checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c - languageName: node - linkType: hard - -"semver@npm:^7.7.4": - version: 7.7.4 - resolution: "semver@npm:7.7.4" - bin: - semver: bin/semver.js - checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 - languageName: node - linkType: hard - -"semver@npm:~7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: "npm:^6.0.0" - bin: - semver: bin/semver.js - checksum: 10c0/5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 - languageName: node - linkType: hard - -"siginfo@npm:^2.0.0": - version: 2.0.0 - resolution: "siginfo@npm:2.0.0" - checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.3 - resolution: "socks-proxy-agent@npm:8.0.3" - dependencies: - agent-base: "npm:^7.1.1" - debug: "npm:^4.3.4" - socks: "npm:^2.7.1" - checksum: 10c0/4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d - languageName: node - linkType: hard - -"socks@npm:^2.7.1": - version: 2.8.3 - resolution: "socks@npm:2.8.3" - dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 - languageName: node - linkType: hard - -"source-map-js@npm:^1.2.1": - version: 1.2.1 - resolution: "source-map-js@npm:1.2.1" - checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf - languageName: node - linkType: hard - -"source-map@npm:^0.6.1, source-map@npm:~0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 - languageName: node - linkType: hard - -"stackback@npm:0.0.2": - version: 0.0.2 - resolution: "stackback@npm:0.0.2" - checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 - languageName: node - linkType: hard - -"std-env@npm:^3.10.0": - version: 3.10.0 - resolution: "std-env@npm:3.10.0" - checksum: 10c0/1814927a45004d36dde6707eaf17552a546769bc79a6421be2c16ce77d238158dfe5de30910b78ec30d95135cc1c59ea73ee22d2ca170f8b9753f84da34c427f - languageName: node - linkType: hard - -"string-argv@npm:~0.3.1": - version: 0.3.2 - resolution: "string-argv@npm:0.3.2" - checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca - languageName: node - linkType: hard - -"string-width@npm:^7.0.0, string-width@npm:^7.2.0": - version: 7.2.0 - resolution: "string-width@npm:7.2.0" - dependencies: - emoji-regex: "npm:^10.3.0" - get-east-asian-width: "npm:^1.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 - languageName: node - linkType: hard - -"strip-ansi@npm:^5.0.0": - version: 5.2.0 - resolution: "strip-ansi@npm:5.2.0" - dependencies: - ansi-regex: "npm:^4.1.0" - checksum: 10c0/de4658c8a097ce3b15955bc6008f67c0790f85748bdc025b7bc8c52c7aee94bc4f9e50624516150ed173c3db72d851826cd57e7a85fe4e4bb6dbbebd5d297fdf - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 - languageName: node - linkType: hard - -"strip-ansi@npm:^7.1.0": - version: 7.1.2 - resolution: "strip-ansi@npm:7.1.2" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/0d6d7a023de33368fd042aab0bf48f4f4077abdfd60e5393e73c7c411e85e1b3a83507c11af2e656188511475776215df9ca589b4da2295c9455cc399ce1858b - languageName: node - linkType: hard - -"strip-json-comments@npm:~3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd - languageName: node - linkType: hard - -"supports-color@npm:~8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 - languageName: node - linkType: hard - -"tagged-tag@npm:^1.0.0": - version: 1.0.0 - resolution: "tagged-tag@npm:1.0.0" - checksum: 10c0/91d25c9ffb86a91f20522cefb2cbec9b64caa1febe27ad0df52f08993ff60888022d771e868e6416cf2e72dab68449d2139e8709ba009b74c6c7ecd4000048d1 - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.1 - resolution: "tar@npm:6.2.1" - dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^5.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 - languageName: node - linkType: hard - -"tinybench@npm:^2.9.0": - version: 2.9.0 - resolution: "tinybench@npm:2.9.0" - checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c - languageName: node - linkType: hard - -"tinyexec@npm:^1.0.2": - version: 1.0.2 - resolution: "tinyexec@npm:1.0.2" - checksum: 10c0/1261a8e34c9b539a9aae3b7f0bb5372045ff28ee1eba035a2a059e532198fe1a182ec61ac60fa0b4a4129f0c4c4b1d2d57355b5cb9aa2d17ac9454ecace502ee - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.15": - version: 0.2.15 - resolution: "tinyglobby@npm:0.2.15" - dependencies: - fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.3" - checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 - languageName: node - linkType: hard - -"tinypool@npm:2.1.0": - version: 2.1.0 - resolution: "tinypool@npm:2.1.0" - checksum: 10c0/9fb1c760558c6264e0f4cfde96a63b12450b43f1730fbe6274aa24ddbdf488745c08924d0dea7a1303b47d555416a6415f2113898c69b6ecf731e75ac95238a5 - languageName: node - linkType: hard - -"tinyrainbow@npm:^3.0.3": - version: 3.0.3 - resolution: "tinyrainbow@npm:3.0.3" - checksum: 10c0/1e799d35cd23cabe02e22550985a3051dc88814a979be02dc632a159c393a998628eacfc558e4c746b3006606d54b00bcdea0c39301133956d10a27aa27e988c - languageName: node - linkType: hard - -"tree-kill@npm:^1.2.2": - version: 1.2.2 - resolution: "tree-kill@npm:1.2.2" - bin: - tree-kill: cli.js - checksum: 10c0/7b1b7c7f17608a8f8d20a162e7957ac1ef6cd1636db1aba92f4e072dc31818c2ff0efac1e3d91064ede67ed5dc57c565420531a8134090a12ac10cf792ab14d2 - languageName: node - linkType: hard - -"ts-pattern@npm:^5.9.0": - version: 5.9.0 - resolution: "ts-pattern@npm:5.9.0" - checksum: 10c0/7640db25c39d29b287471b2b82d4f7b4674a02098c6ba4d10fed180adfb07d0e0c71930d9e59dc0d90654145e02fd320af63cf0df3c41e100d4154658a612a0a - languageName: node - linkType: hard - -"tsdown@npm:^0.21.0-beta.1": - version: 0.21.0-beta.1 - resolution: "tsdown@npm:0.21.0-beta.1" - dependencies: - ansis: "npm:^4.2.0" - cac: "npm:^6.7.14" - defu: "npm:^6.1.4" - empathic: "npm:^2.0.0" - hookable: "npm:^6.0.1" - import-without-cache: "npm:^0.2.5" - obug: "npm:^2.1.1" - picomatch: "npm:^4.0.3" - rolldown: "npm:1.0.0-rc.5" - rolldown-plugin-dts: "npm:^0.22.1" - semver: "npm:^7.7.4" - tinyexec: "npm:^1.0.2" - tinyglobby: "npm:^0.2.15" - tree-kill: "npm:^1.2.2" - unconfig-core: "npm:^7.5.0" - unrun: "npm:^0.2.28" - peerDependencies: - "@arethetypeswrong/core": ^0.18.1 - "@vitejs/devtools": "*" - publint: ^0.3.0 - typescript: ^5.0.0 - unplugin-lightningcss: ^0.4.0 - unplugin-unused: ^0.5.0 - peerDependenciesMeta: - "@arethetypeswrong/core": - optional: true - "@vitejs/devtools": - optional: true - publint: - optional: true - typescript: - optional: true - unplugin-lightningcss: - optional: true - unplugin-unused: - optional: true - bin: - tsdown: dist/run.mjs - checksum: 10c0/5dc5232c08f14000447b5fc2280850adad293678468be13b371966fab7522be14284a39fd3efa20673e94f66cf201a9bd8b6de3a886c964c5818dfb801bba0ef - languageName: node - linkType: hard - -"tslib@npm:^2.4.0": - version: 2.8.1 - resolution: "tslib@npm:2.8.1" - checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 - languageName: node - linkType: hard - -"tsx@npm:^4.21.0": - version: 4.21.0 - resolution: "tsx@npm:4.21.0" - dependencies: - esbuild: "npm:~0.27.0" - fsevents: "npm:~2.3.3" - get-tsconfig: "npm:^4.7.5" - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: 10c0/f5072923cd8459a1f9a26df87823a2ab5754641739d69df2a20b415f61814322b751fa6be85db7c6ec73cf68ba8fac2fd1cfc76bdb0aa86ded984d84d5d2126b - languageName: node - linkType: hard - -"type-fest@npm:^5.4.4": - version: 5.4.4 - resolution: "type-fest@npm:5.4.4" - dependencies: - tagged-tag: "npm:^1.0.0" - checksum: 10c0/bf9c6d7df5383fd720aac71da8ce8690ff1c554459d19cf3c72d61eac98255dba57abe20c628f91f4116f66211791462fdafa90b2be2d7405a5a4c295e4d849d - languageName: node - linkType: hard - -"typescript@npm:5.8.2": - version: 5.8.2 - resolution: "typescript@npm:5.8.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5c4f6fbf1c6389b6928fe7b8fcd5dc73bb2d58cd4e3883f1d774ed5bd83b151cbac6b7ecf11723de56d4676daeba8713894b1e9af56174f2f9780ae7848ec3c6 - languageName: node - linkType: hard - -"typescript@npm:^5.9.3": - version: 5.9.3 - resolution: "typescript@npm:5.9.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A5.8.2#optional!builtin": - version: 5.8.2 - resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=b45daf" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/8a6cd29dfb59bd5a978407b93ae0edb530ee9376a5b95a42ad057a6f80ffb0c410489ccd6fe48d1d0dfad6e8adf5d62d3874bbd251f488ae30e11a1ce6dabd28 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5.9.3#optional!builtin": - version: 5.9.3 - resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=b45daf" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/6f7e53bf0d9702350deeb6f35e08b69cbc8b958c33e0ec77bdc0ad6a6c8e280f3959dcbfde6f5b0848bece57810696489deaaa53d75de3578ff255d168c1efbd - languageName: node - linkType: hard - -"ufo@npm:^1.6.1": - version: 1.6.3 - resolution: "ufo@npm:1.6.3" - checksum: 10c0/bf0e4ebff99e54da1b9c7182ac2f40475988b41faa881d579bc97bc2a0509672107b0a0e94c4b8d31a0ab8c4bf07f4aa0b469ac6da8536d56bda5b085ea2e953 - languageName: node - linkType: hard - -"uglify-js@npm:^3.1.4": - version: 3.19.3 - resolution: "uglify-js@npm:3.19.3" - bin: - uglifyjs: bin/uglifyjs - checksum: 10c0/83b0a90eca35f778e07cad9622b80c448b6aad457c9ff8e568afed978212b42930a95f9e1be943a1ffa4258a3340fbb899f41461131c05bb1d0a9c303aed8479 - languageName: node - linkType: hard - -"unconfig-core@npm:^7.5.0": - version: 7.5.0 - resolution: "unconfig-core@npm:7.5.0" - dependencies: - "@quansync/fs": "npm:^1.0.0" - quansync: "npm:^1.0.0" - checksum: 10c0/9c9f745254aa8e267140430a432353d17ee87f625b0ea0668e189d88736828d117b66bd2dd41f1d48bd40d44d5b7c7d160e8b7996a60c8f484e2975ef73c7cb7 - languageName: node - linkType: hard - -"undici-types@npm:~7.18.0": - version: 7.18.2 - resolution: "undici-types@npm:7.18.2" - checksum: 10c0/85a79189113a238959d7a647368e4f7c5559c3a404ebdb8fc4488145ce9426fcd82252a844a302798dfc0e37e6fb178ff481ed03bc4caf634c5757d9ef43521d - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.1 - resolution: "universalify@npm:2.0.1" - checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a - languageName: node - linkType: hard - -"unrun@npm:^0.2.28": - version: 0.2.28 - resolution: "unrun@npm:0.2.28" - dependencies: - rolldown: "npm:1.0.0-rc.5" - peerDependencies: - synckit: ^0.11.11 - peerDependenciesMeta: - synckit: - optional: true - bin: - unrun: dist/cli.mjs - checksum: 10c0/c36b8f4a10d594a0ded6a362447a5b5ff45e2058e89a9b8765287e20ee11b663d6ee2728b6ad508d7d4788da1d8cbf4aa19eaa6bad158b31e663283ab0bb5b92 - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.2.0": - version: 1.2.3 - resolution: "update-browserslist-db@npm:1.2.3" - dependencies: - escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.1" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10c0/13a00355ea822388f68af57410ce3255941d5fb9b7c49342c4709a07c9f230bbef7f7499ae0ca7e0de532e79a82cc0c4edbd125f1a323a1845bf914efddf8bec - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c - languageName: node - linkType: hard - -"vite-plugin-dts@npm:^4.5.4": - version: 4.5.4 - resolution: "vite-plugin-dts@npm:4.5.4" - dependencies: - "@microsoft/api-extractor": "npm:^7.50.1" - "@rollup/pluginutils": "npm:^5.1.4" - "@volar/typescript": "npm:^2.4.11" - "@vue/language-core": "npm:2.2.0" - compare-versions: "npm:^6.1.1" - debug: "npm:^4.4.0" - kolorist: "npm:^1.8.0" - local-pkg: "npm:^1.0.0" - magic-string: "npm:^0.30.17" - peerDependencies: - typescript: "*" - vite: "*" - peerDependenciesMeta: - vite: - optional: true - checksum: 10c0/5fcb7f3739d115f36195a692c0e9f9fca4e504bbbbabe29e71ee06630dd05ea2920169371e80e548eb4779d2eca14107277497838d7df588d53e1fadf84be861 - languageName: node - linkType: hard - -"vite@npm:^6.0.0 || ^7.0.0": - version: 7.3.1 - resolution: "vite@npm:7.3.1" - dependencies: - esbuild: "npm:^0.27.0" - fdir: "npm:^6.5.0" - fsevents: "npm:~2.3.3" - picomatch: "npm:^4.0.3" - postcss: "npm:^8.5.6" - rollup: "npm:^4.43.0" - tinyglobby: "npm:^0.2.15" - peerDependencies: - "@types/node": ^20.19.0 || >=22.12.0 - jiti: ">=1.21.0" - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: ">=0.54.8" - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - bin: - vite: bin/vite.js - checksum: 10c0/5c7548f5f43a23533e53324304db4ad85f1896b1bfd3ee32ae9b866bac2933782c77b350eb2b52a02c625c8ad1ddd4c000df077419410650c982cd97fde8d014 - languageName: node - linkType: hard - -"vite@npm:rolldown-vite@^7.3.1": - version: 7.3.1 - resolution: "rolldown-vite@npm:7.3.1" - dependencies: - "@oxc-project/runtime": "npm:0.101.0" - fdir: "npm:^6.5.0" - fsevents: "npm:~2.3.3" - lightningcss: "npm:^1.30.2" - picomatch: "npm:^4.0.3" - postcss: "npm:^8.5.6" - rolldown: "npm:1.0.0-beta.53" - tinyglobby: "npm:^0.2.15" - peerDependencies: - "@types/node": ^20.19.0 || >=22.12.0 - esbuild: ^0.27.0 - jiti: ">=1.21.0" - less: ^4.0.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: ">=0.54.8" - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - esbuild: - optional: true - jiti: - optional: true - less: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - bin: - vite: bin/vite.js - checksum: 10c0/01b6af00aabbdfbb59a069e5b932336769b1a8effd0fbea0e6ea78b0c3b97ff5be721f3d16b3cd5928444e22566e5850e12eee53b5d9101e98e52828e6e53e00 - languageName: node - linkType: hard - -"vitest@npm:4.0.18": - version: 4.0.18 - resolution: "vitest@npm:4.0.18" - dependencies: - "@vitest/expect": "npm:4.0.18" - "@vitest/mocker": "npm:4.0.18" - "@vitest/pretty-format": "npm:4.0.18" - "@vitest/runner": "npm:4.0.18" - "@vitest/snapshot": "npm:4.0.18" - "@vitest/spy": "npm:4.0.18" - "@vitest/utils": "npm:4.0.18" - es-module-lexer: "npm:^1.7.0" - expect-type: "npm:^1.2.2" - magic-string: "npm:^0.30.21" - obug: "npm:^2.1.1" - pathe: "npm:^2.0.3" - picomatch: "npm:^4.0.3" - std-env: "npm:^3.10.0" - tinybench: "npm:^2.9.0" - tinyexec: "npm:^1.0.2" - tinyglobby: "npm:^0.2.15" - tinyrainbow: "npm:^3.0.3" - vite: "npm:^6.0.0 || ^7.0.0" - why-is-node-running: "npm:^2.3.0" - peerDependencies: - "@edge-runtime/vm": "*" - "@opentelemetry/api": ^1.9.0 - "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 - "@vitest/browser-playwright": 4.0.18 - "@vitest/browser-preview": 4.0.18 - "@vitest/browser-webdriverio": 4.0.18 - "@vitest/ui": 4.0.18 - happy-dom: "*" - jsdom: "*" - peerDependenciesMeta: - "@edge-runtime/vm": - optional: true - "@opentelemetry/api": - optional: true - "@types/node": - optional: true - "@vitest/browser-playwright": - optional: true - "@vitest/browser-preview": - optional: true - "@vitest/browser-webdriverio": - optional: true - "@vitest/ui": - optional: true - happy-dom: - optional: true - jsdom: - optional: true - bin: - vitest: vitest.mjs - checksum: 10c0/b913cd32032c95f29ff08c931f4b4c6fd6d2da498908d6770952c561a1b8d75c62499a1f04cadf82fb89cc0f9a33f29fb5dfdb899f6dbb27686a9d91571be5fa - languageName: node - linkType: hard - -"vscode-uri@npm:^3.0.8": - version: 3.1.0 - resolution: "vscode-uri@npm:3.1.0" - checksum: 10c0/5f6c9c10fd9b1664d71fab4e9fbbae6be93c7f75bb3a1d9d74399a88ab8649e99691223fd7cef4644376cac6e94fa2c086d802521b9a8e31c5af3e60f0f35624 - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f - languageName: node - linkType: hard - -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a - languageName: node - linkType: hard - -"why-is-node-running@npm:^2.3.0": - version: 2.3.0 - resolution: "why-is-node-running@npm:2.3.0" - dependencies: - siginfo: "npm:^2.0.0" - stackback: "npm:0.0.2" - bin: - why-is-node-running: cli.js - checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 - languageName: node - linkType: hard - -"wordwrap@npm:^1.0.0": - version: 1.0.0 - resolution: "wordwrap@npm:1.0.0" - checksum: 10c0/7ed2e44f3c33c5c3e3771134d2b0aee4314c9e49c749e37f464bf69f2bcdf0cbf9419ca638098e2717cff4875c47f56a007532f6111c3319f557a2ca91278e92 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - -"wrap-ansi@npm:^9.0.0": - version: 9.0.2 - resolution: "wrap-ansi@npm:9.0.2" - dependencies: - ansi-styles: "npm:^6.2.1" - string-width: "npm:^7.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10c0/3305839b9a0d6fb930cb63a52f34d3936013d8b0682ff3ec133c9826512620f213800ffa19ea22904876d5b7e9a3c1f40682f03597d986a4ca881fa7b033688c - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"yargs-parser@npm:^22.0.0": - version: 22.0.0 - resolution: "yargs-parser@npm:22.0.0" - checksum: 10c0/cb7ef81759c4271cb1d96b9351dbbc9a9ce35d3e1122d2b739bf6c432603824fa02c67cc12dcef6ea80283379d63495686e8f41cc7b06c6576e792aba4d33e1c - languageName: node - linkType: hard - -"yargs@npm:^18.0.0": - version: 18.0.0 - resolution: "yargs@npm:18.0.0" - dependencies: - cliui: "npm:^9.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - string-width: "npm:^7.2.0" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^22.0.0" - checksum: 10c0/bf290e4723876ea9c638c786a5c42ac28e03c9ca2325e1424bf43b94e5876456292d3ed905b853ebbba6daf43ed29e772ac2a6b3c5fb1b16533245d6211778f3 - languageName: node - linkType: hard - -"zod@npm:^4.3.6": - version: 4.3.6 - resolution: "zod@npm:4.3.6" - checksum: 10c0/860d25a81ab41d33aa25f8d0d07b091a04acb426e605f396227a796e9e800c44723ed96d0f53a512b57be3d1520f45bf69c0cb3b378a232a00787a2609625307 - languageName: node - linkType: hard From 2e98261a6a3c0d26deff283720c30a01d010d55a Mon Sep 17 00:00:00 2001 From: Jure Rotar Date: Thu, 26 Feb 2026 14:11:32 +0100 Subject: [PATCH 10/12] chore: publish fix --- package.json | 4 ++-- scripts/publish.mjs | 53 +++++++++++++++++++++++++++++++++++++++++++++ scripts/publish.sh | 24 -------------------- 3 files changed, 55 insertions(+), 26 deletions(-) create mode 100644 scripts/publish.mjs delete mode 100755 scripts/publish.sh diff --git a/package.json b/package.json index 3037101..4be0cc5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@povio/openapi-codegen-cli", - "version": "2.0.8-rc.5", + "version": "2.0.8-rc.6", "keywords": [ "codegen", "openapi", @@ -61,7 +61,7 @@ "format": "oxfmt", "format:check": "oxfmt --check", "check": "pnpm typecheck && pnpm lint && pnpm test", - "push": "pnpm exec ./scripts/publish.sh", + "push": "node ./scripts/publish.mjs", "dev:generate": "rm -rf ./output && pnpm start generate --config ./test/config.mjs", "dev:check": "pnpm start check --config ./test/config.mjs", "snapshot:openapi-localhost": "node ./scripts/snapshot-openapi-localhost.mjs", diff --git a/scripts/publish.mjs b/scripts/publish.mjs new file mode 100644 index 0000000..e984f45 --- /dev/null +++ b/scripts/publish.mjs @@ -0,0 +1,53 @@ +import { execSync } from "child_process"; +import fs from "fs"; +import path from "path"; +import readline from "readline"; + +function exec(command) { + try { + return execSync(command, { encoding: "utf8", stdio: ["inherit", "pipe", "inherit"] }).trim(); + } catch (error) { + process.exit(1); + } +} + +function main() { + // check if the working directory is clean + const status = execSync("git status --porcelain", { encoding: "utf8" }).trim(); + if (status) { + console.error("Working directory not clean. Please commit all changes before publishing."); + process.exit(1); + } + + // build, just in case + console.log("Building..."); + execSync("pnpm build", { stdio: "inherit" }); + + // read version from package.json + const pkg = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), "package.json"), "utf8")); + const version = pkg.version; + + // create a new git tag + console.log(`Creating tag v${version}...`); + try { + execSync(`git tag -a v${version} -m "v${version}"`, { stdio: "inherit" }); + } catch (error) { + console.error(`Failed to create tag v${version}. It might already exist.`); + process.exit(1); + } + + console.log(`Publishing version: v${version}`); + + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + rl.question("Press enter to continue (or Ctrl+C to cancel)", () => { + rl.close(); + console.log("Pushing tag..."); + execSync(`git push origin "v${version}"`, { stdio: "inherit" }); + }); +} + +main(); diff --git a/scripts/publish.sh b/scripts/publish.sh deleted file mode 100755 index 3ae5eaa..0000000 --- a/scripts/publish.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -set -e - -# check if the working directory is clean -if [ -n "$(git status --porcelain)" ]; then - echo "Working directory not clean. Please commit all changes before publishing." - exit 1 -fi - -# build, just in case -yarn build - -# read version from package.json -VERSION=$(node -p -e "require('./package.json').version") - -# create a new git tag or error out if the tag already exists -git tag -a v$VERSION -m "v$VERSION" - -echo "Publishing version: v$VERSION" - -read -p "Press enter to continue" - -git push origin "v$VERSION" \ No newline at end of file From f5e2e085d17ce2960c025a4362a48888c31b9bc2 Mon Sep 17 00:00:00 2001 From: Jure Rotar Date: Thu, 26 Feb 2026 14:18:03 +0100 Subject: [PATCH 11/12] fix: fixed actions --- .github/workflows/publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 26d4459..ceaa9d9 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -22,11 +22,11 @@ jobs: - uses: actions/setup-node@v6 with: node-version: 24 - cache: "yarn" + cache: "pnpm" - - run: yarn install --immutable + - run: pnpm install --frozen-lockfile - - run: yarn build + - run: pnpm build - run: npm pack From 7d1fe80d3771d436f8e270b2c09425e7e1379fe8 Mon Sep 17 00:00:00 2001 From: Jure Rotar Date: Thu, 26 Feb 2026 14:55:57 +0100 Subject: [PATCH 12/12] chore: removed generated tests --- .gitignore | 1 + test/generated/.gitkeep | 0 .../generated/base/aWBStocks/aWBStocks.acl.ts | 95 - .../generated/base/aWBStocks/aWBStocks.api.ts | 67 - .../base/aWBStocks/aWBStocks.configs.ts | 92 - .../base/aWBStocks/aWBStocks.models.ts | 114 - .../base/aWBStocks/aWBStocks.queries.ts | 241 --- test/generated/base/acl/app.ability.ts | 32 - test/generated/base/acl/useAclCheck.ts | 21 - .../base/airPositions/airPositions.acl.ts | 30 - .../base/airPositions/airPositions.api.ts | 21 - .../base/airPositions/airPositions.models.ts | 49 - .../base/airPositions/airPositions.queries.ts | 70 - test/generated/base/airports/airports.acl.ts | 54 - test/generated/base/airports/airports.api.ts | 60 - .../base/airports/airports.configs.ts | 118 -- .../base/airports/airports.models.ts | 109 - .../base/airports/airports.queries.ts | 208 -- test/generated/base/app-rest-client.ts | 7 - .../base/bankAccounts/bankAccounts.acl.ts | 24 - .../base/bankAccounts/bankAccounts.api.ts | 34 - .../base/bankAccounts/bankAccounts.configs.ts | 43 - .../base/bankAccounts/bankAccounts.models.ts | 42 - .../base/bankAccounts/bankAccounts.queries.ts | 96 - .../bookkeepingExport.acl.ts | 134 -- .../bookkeepingExport.api.ts | 100 - .../bookkeepingExport.configs.ts | 123 -- .../bookkeepingExport.models.ts | 293 --- .../bookkeepingExport.queries.ts | 350 ---- .../businessPartnerBookkeepingMappings.acl.ts | 69 - .../businessPartnerBookkeepingMappings.api.ts | 45 - ...sinessPartnerBookkeepingMappings.models.ts | 62 - ...inessPartnerBookkeepingMappings.queries.ts | 153 -- .../businessPartnerContacts.acl.ts | 69 - .../businessPartnerContacts.api.ts | 52 - .../businessPartnerContacts.configs.ts | 42 - .../businessPartnerContacts.models.ts | 84 - .../businessPartnerContacts.queries.ts | 185 -- .../businessPartners/businessPartners.acl.ts | 264 --- .../businessPartners/businessPartners.api.ts | 171 -- .../businessPartners.configs.ts | 149 -- .../businessPartners.models.ts | 489 ----- .../businessPartners.queries.ts | 642 ------ .../base/cargoTypes/cargoTypes.acl.ts | 74 - .../base/cargoTypes/cargoTypes.api.ts | 74 - .../base/cargoTypes/cargoTypes.configs.ts | 142 -- .../base/cargoTypes/cargoTypes.models.ts | 141 -- .../base/cargoTypes/cargoTypes.queries.ts | 264 --- .../base/chargeTypes/chargeTypes.acl.ts | 74 - .../base/chargeTypes/chargeTypes.api.ts | 74 - .../base/chargeTypes/chargeTypes.configs.ts | 136 -- .../base/chargeTypes/chargeTypes.models.ts | 154 -- .../base/chargeTypes/chargeTypes.queries.ts | 264 --- .../base/checklistItems/checklistItems.acl.ts | 95 - .../base/checklistItems/checklistItems.api.ts | 74 - .../checklistItems/checklistItems.configs.ts | 116 - .../checklistItems/checklistItems.models.ts | 107 - .../checklistItems/checklistItems.queries.ts | 269 --- .../checklistTemplates.acl.ts | 95 - .../checklistTemplates.api.ts | 74 - .../checklistTemplates.configs.ts | 118 -- .../checklistTemplates.models.ts | 119 -- .../checklistTemplates.queries.ts | 269 --- test/generated/base/cities/cities.acl.ts | 84 - test/generated/base/cities/cities.api.ts | 81 - test/generated/base/cities/cities.configs.ts | 124 -- test/generated/base/cities/cities.models.ts | 145 -- test/generated/base/cities/cities.queries.ts | 282 --- test/generated/base/common/common.models.ts | 1860 ----------------- .../base/containerYards/containerYards.acl.ts | 84 - .../base/containerYards/containerYards.api.ts | 82 - .../containerYards/containerYards.configs.ts | 142 -- .../containerYards/containerYards.models.ts | 139 -- .../containerYards/containerYards.queries.ts | 286 --- .../controlTowerAuth/controlTowerAuth.api.ts | 22 - .../controlTowerAuth.models.ts | 34 - .../controlTowerAuth.queries.ts | 59 - .../controlTowerBookings.api.ts | 36 - .../controlTowerBookings.configs.ts | 56 - .../controlTowerBookings.models.ts | 147 -- .../controlTowerBookings.queries.ts | 104 - .../controlTowerCalendar.api.ts | 24 - .../controlTowerCalendar.models.ts | 91 - .../controlTowerCalendar.queries.ts | 38 - .../controlTowerContainers.api.ts | 36 - .../controlTowerContainers.configs.ts | 54 - .../controlTowerContainers.models.ts | 133 -- .../controlTowerContainers.queries.ts | 103 - .../base/controlTowerMe/controlTowerMe.api.ts | 53 - .../controlTowerMe/controlTowerMe.models.ts | 173 -- .../controlTowerMe/controlTowerMe.queries.ts | 146 -- .../controlTowerPackages.api.ts | 22 - .../controlTowerPackages.configs.ts | 50 - .../controlTowerPackages.models.ts | 54 - .../controlTowerPackages.queries.ts | 65 - .../controlTowerSearch.api.ts | 20 - .../controlTowerSearch.models.ts | 42 - .../controlTowerSearch.queries.ts | 37 - .../generated/base/countries/countries.acl.ts | 34 - .../generated/base/countries/countries.api.ts | 44 - .../base/countries/countries.configs.ts | 84 - .../base/countries/countries.models.ts | 82 - .../base/countries/countries.queries.ts | 152 -- .../base/currencies/currencies.acl.ts | 64 - .../base/currencies/currencies.api.ts | 75 - .../base/currencies/currencies.configs.ts | 153 -- .../base/currencies/currencies.models.ts | 122 -- .../base/currencies/currencies.queries.ts | 267 --- .../customerAccount/customerAccount.api.ts | 12 - .../customerAccount/customerAccount.models.ts | 37 - .../customerAccount.queries.ts | 30 - .../generated/base/customers/customers.acl.ts | 66 - .../generated/base/customers/customers.api.ts | 66 - .../base/customers/customers.configs.ts | 92 - .../base/customers/customers.models.ts | 137 -- .../base/customers/customers.queries.ts | 220 -- test/generated/base/depots/depots.acl.ts | 74 - test/generated/base/depots/depots.api.ts | 74 - test/generated/base/depots/depots.configs.ts | 134 -- test/generated/base/depots/depots.models.ts | 157 -- test/generated/base/depots/depots.queries.ts | 260 --- .../documentTemplates.acl.ts | 121 -- .../documentTemplates.api.ts | 89 - .../documentTemplates.configs.ts | 119 -- .../documentTemplates.models.ts | 138 -- .../documentTemplates.queries.ts | 333 --- .../dunningAccountStatement.acl.ts | 30 - .../dunningAccountStatement.api.ts | 49 - .../dunningAccountStatement.models.ts | 83 - .../dunningAccountStatement.queries.ts | 154 -- .../base/dunningLevels/dunningLevels.acl.ts | 95 - .../base/dunningLevels/dunningLevels.api.ts | 74 - .../dunningLevels/dunningLevels.configs.ts | 135 -- .../dunningLevels/dunningLevels.models.ts | 136 -- .../dunningLevels/dunningLevels.queries.ts | 273 --- .../dunningManagement.acl.ts | 43 - .../dunningManagement.api.ts | 50 - .../dunningManagement.configs.ts | 60 - .../dunningManagement.models.ts | 195 -- .../dunningManagement.queries.ts | 173 -- .../dunningPartnerOutstandingInvoices.acl.ts | 43 - .../dunningPartnerOutstandingInvoices.api.ts | 45 - ...nningPartnerOutstandingInvoices.configs.ts | 97 - ...unningPartnerOutstandingInvoices.models.ts | 129 -- ...nningPartnerOutstandingInvoices.queries.ts | 165 -- .../base/dunningSystems/dunningSystems.acl.ts | 95 - .../base/dunningSystems/dunningSystems.api.ts | 74 - .../dunningSystems/dunningSystems.configs.ts | 120 -- .../dunningSystems/dunningSystems.models.ts | 111 - .../dunningSystems/dunningSystems.queries.ts | 273 --- test/generated/base/employee/employee.acl.ts | 153 -- test/generated/base/employee/employee.api.ts | 147 -- .../base/employee/employee.configs.ts | 135 -- .../base/employee/employee.models.ts | 225 -- .../base/employee/employee.queries.ts | 469 ----- .../employeeAccount/employeeAccount.api.ts | 12 - .../employeeAccount/employeeAccount.models.ts | 53 - .../employeeAccount.queries.ts | 30 - .../employeePermissions.acl.ts | 24 - .../employeePermissions.api.ts | 33 - .../employeePermissions.configs.ts | 45 - .../employeePermissions.models.ts | 54 - .../employeePermissions.queries.ts | 93 - .../employeeProfile/employeeProfile.api.ts | 21 - .../employeeProfile/employeeProfile.models.ts | 33 - .../employeeProfile.queries.ts | 56 - .../base/employeeRoles/employeeRoles.acl.ts | 97 - .../base/employeeRoles/employeeRoles.api.ts | 88 - .../employeeRoles/employeeRoles.configs.ts | 90 - .../employeeRoles/employeeRoles.models.ts | 123 -- .../employeeRoles/employeeRoles.queries.ts | 282 --- .../employeeSettings/employeeSettings.api.ts | 22 - .../employeeSettings.models.ts | 20 - .../employeeSettings.queries.ts | 56 - .../base/employment/employment.acl.ts | 95 - .../base/employment/employment.api.ts | 69 - .../base/employment/employment.configs.ts | 63 - .../base/employment/employment.models.ts | 114 - .../base/employment/employment.queries.ts | 234 --- .../factoringExport/factoringExport.acl.ts | 30 - .../factoringExport/factoringExport.api.ts | 21 - .../factoringExport/factoringExport.models.ts | 41 - .../factoringExport.queries.ts | 67 - .../base/factoringMerge/factoringMerge.acl.ts | 43 - .../base/factoringMerge/factoringMerge.api.ts | 28 - .../factoringMerge/factoringMerge.models.ts | 84 - .../factoringMerge/factoringMerge.queries.ts | 96 - test/generated/base/files/files.api.ts | 70 - test/generated/base/files/files.models.ts | 57 - test/generated/base/files/files.queries.ts | 210 -- test/generated/base/folders/folders.api.ts | 60 - test/generated/base/folders/folders.models.ts | 96 - .../generated/base/folders/folders.queries.ts | 187 -- test/generated/base/hsCodes/hsCodes.acl.ts | 74 - test/generated/base/hsCodes/hsCodes.api.ts | 74 - .../generated/base/hsCodes/hsCodes.configs.ts | 120 -- test/generated/base/hsCodes/hsCodes.models.ts | 111 - .../generated/base/hsCodes/hsCodes.queries.ts | 264 --- .../integrationChannels.acl.ts | 108 - .../integrationChannels.api.ts | 81 - .../integrationChannels.configs.ts | 155 -- .../integrationChannels.models.ts | 197 -- .../integrationChannels.queries.ts | 302 --- .../inttraOfficeIntegration.acl.ts | 43 - .../inttraOfficeIntegration.api.ts | 28 - .../inttraOfficeIntegration.models.ts | 52 - .../inttraOfficeIntegration.queries.ts | 92 - .../inttraShippingInstructionMessages.acl.ts | 56 - .../inttraShippingInstructionMessages.api.ts | 44 - ...ttraShippingInstructionMessages.configs.ts | 88 - ...nttraShippingInstructionMessages.models.ts | 104 - ...ttraShippingInstructionMessages.queries.ts | 164 -- .../invoicePayments/invoicePayments.acl.ts | 121 -- .../invoicePayments/invoicePayments.api.ts | 95 - .../invoicePayments.configs.ts | 144 -- .../invoicePayments/invoicePayments.models.ts | 292 --- .../invoicePayments.queries.ts | 325 --- test/generated/base/invoices/invoices.acl.ts | 407 ---- test/generated/base/invoices/invoices.api.ts | 327 --- .../base/invoices/invoices.configs.ts | 322 --- .../base/invoices/invoices.models.ts | 987 --------- .../base/invoices/invoices.queries.ts | 1123 ---------- .../base/masterData/masterData.acl.ts | 24 - .../base/masterData/masterData.api.ts | 34 - .../base/masterData/masterData.configs.ts | 29 - .../base/masterData/masterData.models.ts | 68 - .../base/masterData/masterData.queries.ts | 99 - .../masterDataImport/masterDataImport.acl.ts | 43 - .../masterDataImport/masterDataImport.api.ts | 29 - .../masterDataImport.models.ts | 78 - .../masterDataImport.queries.ts | 121 -- test/generated/base/offices/offices.acl.ts | 102 - test/generated/base/offices/offices.api.ts | 110 - .../generated/base/offices/offices.configs.ts | 135 -- test/generated/base/offices/offices.models.ts | 390 ---- .../generated/base/offices/offices.queries.ts | 403 ---- .../base/packageTypes/packageTypes.acl.ts | 74 - .../base/packageTypes/packageTypes.api.ts | 74 - .../base/packageTypes/packageTypes.configs.ts | 129 -- .../base/packageTypes/packageTypes.models.ts | 128 -- .../base/packageTypes/packageTypes.queries.ts | 264 --- .../partnerNetworks/partnerNetworks.acl.ts | 74 - .../partnerNetworks/partnerNetworks.api.ts | 74 - .../partnerNetworks.configs.ts | 114 - .../partnerNetworks/partnerNetworks.models.ts | 105 - .../partnerNetworks.queries.ts | 264 --- .../paymentConfirmations.acl.ts | 43 - .../paymentConfirmations.api.ts | 50 - .../paymentConfirmations.configs.ts | 49 - .../paymentConfirmations.models.ts | 70 - .../paymentConfirmations.queries.ts | 130 -- test/generated/base/ports/ports.acl.ts | 54 - test/generated/base/ports/ports.api.ts | 60 - test/generated/base/ports/ports.configs.ts | 128 -- test/generated/base/ports/ports.models.ts | 151 -- test/generated/base/ports/ports.queries.ts | 208 -- .../positionAccount/positionAccount.acl.ts | 17 - .../positionAccount/positionAccount.api.ts | 12 - .../positionAccount/positionAccount.models.ts | 52 - .../positionAccount.queries.ts | 38 - .../positionAccountItems.acl.ts | 82 - .../positionAccountItems.api.ts | 55 - .../positionAccountItems.models.ts | 167 -- .../positionAccountItems.queries.ts | 184 -- .../base/positionCargo/positionCargo.acl.ts | 121 -- .../base/positionCargo/positionCargo.api.ts | 81 - .../positionCargo/positionCargo.configs.ts | 133 -- .../positionCargo/positionCargo.models.ts | 46 - .../positionCargo/positionCargo.queries.ts | 293 --- .../positionCargoPackage.acl.ts | 69 - .../positionCargoPackage.api.ts | 45 - .../positionCargoPackage.queries.ts | 162 -- .../positionChecklist.acl.ts | 82 - .../positionChecklist.api.ts | 51 - .../positionChecklist.models.ts | 77 - .../positionChecklist.queries.ts | 181 -- .../positionInvolvedParties.acl.ts | 56 - .../positionInvolvedParties.api.ts | 38 - .../positionInvolvedParties.models.ts | 12 - .../positionInvolvedParties.queries.ts | 125 -- .../positionProfitChangeTracking.acl.ts | 32 - .../positionProfitChangeTracking.api.ts | 29 - .../positionProfitChangeTracking.configs.ts | 51 - .../positionProfitChangeTracking.models.ts | 74 - .../positionProfitChangeTracking.queries.ts | 101 - .../base/positionRoutes/positionRoutes.acl.ts | 95 - .../base/positionRoutes/positionRoutes.api.ts | 60 - .../positionRoutes/positionRoutes.queries.ts | 212 -- .../generated/base/positions/positions.acl.ts | 212 -- .../generated/base/positions/positions.api.ts | 158 -- .../base/positions/positions.configs.ts | 259 --- .../base/positions/positions.models.ts | 501 ----- .../base/positions/positions.queries.ts | 535 ----- .../base/projectLite/projectLite.acl.ts | 95 - .../base/projectLite/projectLite.api.ts | 74 - .../base/projectLite/projectLite.configs.ts | 116 - .../base/projectLite/projectLite.models.ts | 98 - .../base/projectLite/projectLite.queries.ts | 269 --- test/generated/base/queryModules.ts | 96 - .../base/quoteAccount/quoteAccount.acl.ts | 69 - .../base/quoteAccount/quoteAccount.api.ts | 44 - .../base/quoteAccount/quoteAccount.models.ts | 170 -- .../base/quoteAccount/quoteAccount.queries.ts | 153 -- .../base/quoteCargo/quoteCargo.acl.ts | 108 - .../base/quoteCargo/quoteCargo.api.ts | 73 - .../base/quoteCargo/quoteCargo.configs.ts | 100 - .../base/quoteCargo/quoteCargo.models.ts | 46 - .../base/quoteCargo/quoteCargo.queries.ts | 265 --- .../quoteCargoPackage.acl.ts | 69 - .../quoteCargoPackage.api.ts | 45 - .../quoteCargoPackage.queries.ts | 162 -- .../quoteConversion/quoteConversion.acl.ts | 17 - .../quoteConversion/quoteConversion.api.ts | 15 - .../quoteConversion/quoteConversion.models.ts | 12 - .../quoteConversion.queries.ts | 43 - .../base/quoteDocument/quoteDocument.acl.ts | 69 - .../base/quoteDocument/quoteDocument.api.ts | 58 - .../quoteDocument/quoteDocument.models.ts | 134 -- .../quoteDocument/quoteDocument.queries.ts | 152 -- .../quoteProfitChangeTracking.acl.ts | 32 - .../quoteProfitChangeTracking.api.ts | 27 - .../quoteProfitChangeTracking.configs.ts | 36 - .../quoteProfitChangeTracking.models.ts | 56 - .../quoteProfitChangeTracking.queries.ts | 96 - .../base/quoteRoutes/quoteRoutes.acl.ts | 95 - .../base/quoteRoutes/quoteRoutes.api.ts | 60 - .../base/quoteRoutes/quoteRoutes.queries.ts | 212 -- test/generated/base/quotes/quotes.acl.ts | 160 -- test/generated/base/quotes/quotes.api.ts | 117 -- test/generated/base/quotes/quotes.configs.ts | 137 -- test/generated/base/quotes/quotes.models.ts | 322 --- test/generated/base/quotes/quotes.queries.ts | 376 ---- .../remarkTemplates/remarkTemplates.acl.ts | 95 - .../remarkTemplates/remarkTemplates.api.ts | 74 - .../remarkTemplates.configs.ts | 123 -- .../remarkTemplates/remarkTemplates.models.ts | 132 -- .../remarkTemplates.queries.ts | 273 --- .../base/roadQuotes/roadQuotes.acl.ts | 30 - .../base/roadQuotes/roadQuotes.api.ts | 21 - .../base/roadQuotes/roadQuotes.models.ts | 29 - .../base/roadQuotes/roadQuotes.queries.ts | 70 - .../base/seaPositions/seaPositions.acl.ts | 30 - .../base/seaPositions/seaPositions.api.ts | 21 - .../base/seaPositions/seaPositions.models.ts | 49 - .../base/seaPositions/seaPositions.queries.ts | 70 - .../generated/base/seaQuotes/seaQuotes.acl.ts | 30 - .../generated/base/seaQuotes/seaQuotes.api.ts | 21 - .../base/seaQuotes/seaQuotes.models.ts | 33 - .../base/seaQuotes/seaQuotes.queries.ts | 70 - .../shippingInstructions.acl.ts | 82 - .../shippingInstructions.api.ts | 58 - .../shippingInstructions.models.ts | 510 ----- .../shippingInstructions.queries.ts | 211 -- .../generated/base/terminals/terminals.acl.ts | 74 - .../generated/base/terminals/terminals.api.ts | 74 - .../base/terminals/terminals.configs.ts | 146 -- .../base/terminals/terminals.models.ts | 196 -- .../base/terminals/terminals.queries.ts | 260 --- .../base/useCrossTabQueryInvalidation.ts | 40 - test/generated/base/useMutationEffects.ts | 95 - .../base/userActivity/userActivity.api.ts | 18 - .../base/userActivity/userActivity.models.ts | 64 - .../base/userActivity/userActivity.queries.ts | 35 - test/generated/base/vatRules/vatRules.acl.ts | 74 - test/generated/base/vatRules/vatRules.api.ts | 74 - .../base/vatRules/vatRules.configs.ts | 151 -- .../base/vatRules/vatRules.models.ts | 146 -- .../base/vatRules/vatRules.queries.ts | 264 --- .../base/warehouses/warehouses.acl.ts | 74 - .../base/warehouses/warehouses.api.ts | 74 - .../base/warehouses/warehouses.configs.ts | 141 -- .../base/warehouses/warehouses.models.ts | 152 -- .../base/warehouses/warehouses.queries.ts | 260 --- .../workingDocuments/workingDocuments.acl.ts | 30 - .../workingDocuments/workingDocuments.api.ts | 29 - .../workingDocuments.configs.ts | 55 - .../workingDocuments.models.ts | 70 - .../workingDocuments.queries.ts | 101 - .../workingDocumentsAmsInstructions.acl.ts | 82 - .../workingDocumentsAmsInstructions.api.ts | 58 - .../workingDocumentsAmsInstructions.models.ts | 142 -- ...workingDocumentsAmsInstructions.queries.ts | 211 -- .../workingDocumentsBlInstructions.acl.ts | 95 - .../workingDocumentsBlInstructions.api.ts | 72 - .../workingDocumentsBlInstructions.models.ts | 260 --- .../workingDocumentsBlInstructions.queries.ts | 242 --- .../workingDocumentsCmrForm.acl.ts | 82 - .../workingDocumentsCmrForm.api.ts | 58 - .../workingDocumentsCmrForm.models.ts | 187 -- .../workingDocumentsCmrForm.queries.ts | 211 -- .../workingDocumentsExportDeclaration.acl.ts | 82 - .../workingDocumentsExportDeclaration.api.ts | 58 - ...orkingDocumentsExportDeclaration.models.ts | 94 - ...rkingDocumentsExportDeclaration.queries.ts | 211 -- .../workingDocumentsFcrForm.acl.ts | 82 - .../workingDocumentsFcrForm.api.ts | 58 - .../workingDocumentsFcrForm.models.ts | 86 - .../workingDocumentsFcrForm.queries.ts | 211 -- .../workingDocumentsHouseAwb.acl.ts | 82 - .../workingDocumentsHouseAwb.api.ts | 58 - .../workingDocumentsHouseAwb.models.ts | 174 -- .../workingDocumentsHouseAwb.queries.ts | 211 -- .../workingDocumentsHouseBl.acl.ts | 108 - .../workingDocumentsHouseBl.api.ts | 85 - .../workingDocumentsHouseBl.models.ts | 196 -- .../workingDocumentsHouseBl.queries.ts | 296 --- .../workingDocumentsIsfForm.acl.ts | 82 - .../workingDocumentsIsfForm.api.ts | 58 - .../workingDocumentsIsfForm.models.ts | 154 -- .../workingDocumentsIsfForm.queries.ts | 211 -- .../workingDocumentsMasterAwb.acl.ts | 82 - .../workingDocumentsMasterAwb.api.ts | 58 - .../workingDocumentsMasterAwb.models.ts | 176 -- .../workingDocumentsMasterAwb.queries.ts | 211 -- .../workingDocumentsTemplatedDocument.acl.ts | 95 - .../workingDocumentsTemplatedDocument.api.ts | 74 - ...orkingDocumentsTemplatedDocument.models.ts | 61 - ...rkingDocumentsTemplatedDocument.queries.ts | 216 -- test/generated/base/zod.extended.ts | 47 - .../generated/dist/aWBStocks/aWBStocks.acl.ts | 87 - .../generated/dist/aWBStocks/aWBStocks.api.ts | 108 - .../dist/aWBStocks/aWBStocks.configs.ts | 91 - .../dist/aWBStocks/aWBStocks.models.ts | 164 -- .../dist/aWBStocks/aWBStocks.queries.ts | 319 --- test/generated/dist/acl/app.ability.ts | 387 ---- test/generated/dist/acl/useAclCheck.ts | 24 - .../dist/airPositions/airPositions.acl.ts | 27 - .../dist/airPositions/airPositions.api.ts | 27 - .../dist/airPositions/airPositions.models.ts | 77 - .../dist/airPositions/airPositions.queries.ts | 83 - test/generated/dist/airports/airports.acl.ts | 33 - test/generated/dist/airports/airports.api.ts | 101 - .../dist/airports/airports.configs.ts | 117 -- .../dist/airports/airports.models.ts | 157 -- .../dist/airports/airports.queries.ts | 294 --- test/generated/dist/app-rest-client.ts | 7 - .../dist/bankAccounts/bankAccounts.acl.ts | 15 - .../dist/bankAccounts/bankAccounts.api.ts | 60 - .../dist/bankAccounts/bankAccounts.configs.ts | 42 - .../dist/bankAccounts/bankAccounts.models.ts | 49 - .../dist/bankAccounts/bankAccounts.queries.ts | 139 -- .../bookkeepingExport.acl.ts | 123 -- .../bookkeepingExport.api.ts | 176 -- .../bookkeepingExport.configs.ts | 122 -- .../bookkeepingExport.models.ts | 466 ----- .../bookkeepingExport.queries.ts | 555 ----- .../businessPartnerBookkeepingMappings.acl.ts | 63 - .../businessPartnerBookkeepingMappings.api.ts | 68 - ...sinessPartnerBookkeepingMappings.models.ts | 94 - ...inessPartnerBookkeepingMappings.queries.ts | 221 -- .../businessPartnerContacts.acl.ts | 63 - .../businessPartnerContacts.api.ts | 97 - .../businessPartnerContacts.configs.ts | 41 - .../businessPartnerContacts.models.ts | 125 -- .../businessPartnerContacts.queries.ts | 321 --- .../businessPartners/businessPartners.acl.ts | 243 --- .../businessPartners/businessPartners.api.ts | 267 --- .../businessPartners.configs.ts | 148 -- .../businessPartners.models.ts | 814 -------- .../businessPartners.queries.ts | 895 -------- .../dist/cargoTypes/cargoTypes.acl.ts | 45 - .../dist/cargoTypes/cargoTypes.api.ts | 117 -- .../dist/cargoTypes/cargoTypes.configs.ts | 141 -- .../dist/cargoTypes/cargoTypes.models.ts | 224 -- .../dist/cargoTypes/cargoTypes.queries.ts | 362 ---- .../dist/chargeTypes/chargeTypes.acl.ts | 45 - .../dist/chargeTypes/chargeTypes.api.ts | 125 -- .../dist/chargeTypes/chargeTypes.configs.ts | 135 -- .../dist/chargeTypes/chargeTypes.models.ts | 230 -- .../dist/chargeTypes/chargeTypes.queries.ts | 362 ---- .../dist/checklistItems/checklistItems.acl.ts | 87 - .../dist/checklistItems/checklistItems.api.ts | 136 -- .../checklistItems/checklistItems.configs.ts | 115 - .../checklistItems/checklistItems.models.ts | 144 -- .../checklistItems/checklistItems.queries.ts | 416 ---- .../checklistTemplates.acl.ts | 87 - .../checklistTemplates.api.ts | 138 -- .../checklistTemplates.configs.ts | 117 -- .../checklistTemplates.models.ts | 167 -- .../checklistTemplates.queries.ts | 425 ---- test/generated/dist/cities/cities.acl.ts | 51 - test/generated/dist/cities/cities.api.ts | 106 - test/generated/dist/cities/cities.configs.ts | 123 -- test/generated/dist/cities/cities.models.ts | 203 -- test/generated/dist/cities/cities.queries.ts | 370 ---- test/generated/dist/common/common.models.ts | 1860 ----------------- .../dist/containerYards/containerYards.acl.ts | 51 - .../dist/containerYards/containerYards.api.ts | 137 -- .../containerYards/containerYards.configs.ts | 141 -- .../containerYards/containerYards.models.ts | 211 -- .../containerYards/containerYards.queries.ts | 392 ---- .../controlTowerAuth/controlTowerAuth.api.ts | 23 - .../controlTowerAuth.models.ts | 42 - .../controlTowerAuth.queries.ts | 64 - .../controlTowerBookings.api.ts | 61 - .../controlTowerBookings.configs.ts | 55 - .../controlTowerBookings.models.ts | 248 --- .../controlTowerBookings.queries.ts | 141 -- .../controlTowerCalendar.api.ts | 45 - .../controlTowerCalendar.models.ts | 109 - .../controlTowerCalendar.queries.ts | 74 - .../controlTowerContainers.api.ts | 63 - .../controlTowerContainers.configs.ts | 53 - .../controlTowerContainers.models.ts | 209 -- .../controlTowerContainers.queries.ts | 139 -- .../dist/controlTowerMe/controlTowerMe.api.ts | 49 - .../controlTowerMe/controlTowerMe.models.ts | 225 -- .../controlTowerMe/controlTowerMe.queries.ts | 169 -- .../controlTowerPackages.api.ts | 47 - .../controlTowerPackages.configs.ts | 49 - .../controlTowerPackages.models.ts | 74 - .../controlTowerPackages.queries.ts | 97 - .../controlTowerSearch.api.ts | 30 - .../controlTowerSearch.models.ts | 51 - .../controlTowerSearch.queries.ts | 44 - .../generated/dist/countries/countries.acl.ts | 21 - .../generated/dist/countries/countries.api.ts | 85 - .../dist/countries/countries.configs.ts | 83 - .../dist/countries/countries.models.ts | 117 -- .../dist/countries/countries.queries.ts | 233 --- .../dist/currencies/currencies.acl.ts | 39 - .../dist/currencies/currencies.api.ts | 149 -- .../dist/currencies/currencies.configs.ts | 152 -- .../dist/currencies/currencies.models.ts | 175 -- .../dist/currencies/currencies.queries.ts | 431 ---- .../customerAccount/customerAccount.api.ts | 13 - .../customerAccount/customerAccount.models.ts | 51 - .../customerAccount.queries.ts | 32 - .../generated/dist/customers/customers.acl.ts | 41 - .../generated/dist/customers/customers.api.ts | 85 - .../dist/customers/customers.configs.ts | 91 - .../dist/customers/customers.models.ts | 199 -- .../dist/customers/customers.queries.ts | 282 --- test/generated/dist/depots/depots.acl.ts | 45 - test/generated/dist/depots/depots.api.ts | 107 - test/generated/dist/depots/depots.configs.ts | 133 -- test/generated/dist/depots/depots.models.ts | 233 --- test/generated/dist/depots/depots.queries.ts | 349 ---- .../documentTemplates.acl.ts | 111 - .../documentTemplates.api.ts | 162 -- .../documentTemplates.configs.ts | 118 -- .../documentTemplates.models.ts | 195 -- .../documentTemplates.queries.ts | 509 ----- .../dunningAccountStatement.acl.ts | 27 - .../dunningAccountStatement.api.ts | 76 - .../dunningAccountStatement.models.ts | 156 -- .../dunningAccountStatement.queries.ts | 270 --- .../dist/dunningLevels/dunningLevels.acl.ts | 87 - .../dist/dunningLevels/dunningLevels.api.ts | 136 -- .../dunningLevels/dunningLevels.configs.ts | 134 -- .../dunningLevels/dunningLevels.models.ts | 207 -- .../dunningLevels/dunningLevels.queries.ts | 420 ---- .../dunningManagement.acl.ts | 39 - .../dunningManagement.api.ts | 78 - .../dunningManagement.configs.ts | 59 - .../dunningManagement.models.ts | 299 --- .../dunningManagement.queries.ts | 241 --- .../dunningPartnerOutstandingInvoices.acl.ts | 39 - .../dunningPartnerOutstandingInvoices.api.ts | 108 - ...nningPartnerOutstandingInvoices.configs.ts | 96 - ...unningPartnerOutstandingInvoices.models.ts | 207 -- ...nningPartnerOutstandingInvoices.queries.ts | 365 ---- .../dist/dunningSystems/dunningSystems.acl.ts | 87 - .../dist/dunningSystems/dunningSystems.api.ts | 136 -- .../dunningSystems/dunningSystems.configs.ts | 119 -- .../dunningSystems/dunningSystems.models.ts | 145 -- .../dunningSystems/dunningSystems.queries.ts | 420 ---- test/generated/dist/employee/employee.acl.ts | 115 - test/generated/dist/employee/employee.api.ts | 223 -- .../dist/employee/employee.configs.ts | 134 -- .../dist/employee/employee.models.ts | 325 --- .../dist/employee/employee.queries.ts | 626 ------ .../employeeAccount/employeeAccount.api.ts | 13 - .../employeeAccount/employeeAccount.models.ts | 86 - .../employeeAccount.queries.ts | 32 - .../employeePermissions.acl.ts | 15 - .../employeePermissions.api.ts | 61 - .../employeePermissions.configs.ts | 44 - .../employeePermissions.models.ts | 74 - .../employeePermissions.queries.ts | 141 -- .../employeeProfile/employeeProfile.api.ts | 25 - .../employeeProfile/employeeProfile.models.ts | 52 - .../employeeProfile.queries.ts | 63 - .../dist/employeeRoles/employeeRoles.acl.ts | 63 - .../dist/employeeRoles/employeeRoles.api.ts | 119 -- .../employeeRoles/employeeRoles.configs.ts | 89 - .../employeeRoles/employeeRoles.models.ts | 175 -- .../employeeRoles/employeeRoles.queries.ts | 368 ---- .../employeeSettings/employeeSettings.api.ts | 27 - .../employeeSettings.models.ts | 44 - .../employeeSettings.queries.ts | 63 - .../dist/employment/employment.acl.ts | 87 - .../dist/employment/employment.api.ts | 106 - .../dist/employment/employment.configs.ts | 62 - .../dist/employment/employment.models.ts | 139 -- .../dist/employment/employment.queries.ts | 315 --- .../factoringExport/factoringExport.acl.ts | 27 - .../factoringExport/factoringExport.api.ts | 26 - .../factoringExport/factoringExport.models.ts | 61 - .../factoringExport.queries.ts | 80 - .../dist/factoringMerge/factoringMerge.acl.ts | 39 - .../dist/factoringMerge/factoringMerge.api.ts | 34 - .../factoringMerge/factoringMerge.models.ts | 137 -- .../factoringMerge/factoringMerge.queries.ts | 113 - test/generated/dist/files/files.api.ts | 90 - test/generated/dist/files/files.models.ts | 62 - test/generated/dist/files/files.queries.ts | 245 --- test/generated/dist/folders/folders.api.ts | 87 - test/generated/dist/folders/folders.models.ts | 133 -- .../generated/dist/folders/folders.queries.ts | 279 --- test/generated/dist/hsCodes/hsCodes.acl.ts | 45 - test/generated/dist/hsCodes/hsCodes.api.ts | 117 -- .../generated/dist/hsCodes/hsCodes.configs.ts | 119 -- test/generated/dist/hsCodes/hsCodes.models.ts | 158 -- .../generated/dist/hsCodes/hsCodes.queries.ts | 353 ---- .../integrationChannels.acl.ts | 99 - .../integrationChannels.api.ts | 145 -- .../integrationChannels.configs.ts | 154 -- .../integrationChannels.models.ts | 283 --- .../integrationChannels.queries.ts | 471 ----- .../inttraOfficeIntegration.acl.ts | 39 - .../inttraOfficeIntegration.api.ts | 34 - .../inttraOfficeIntegration.models.ts | 76 - .../inttraOfficeIntegration.queries.ts | 108 - .../inttraShippingInstructionMessages.acl.ts | 67 - .../inttraShippingInstructionMessages.api.ts | 87 - ...ttraShippingInstructionMessages.configs.ts | 87 - ...nttraShippingInstructionMessages.models.ts | 172 -- ...ttraShippingInstructionMessages.queries.ts | 315 --- .../invoicePayments/invoicePayments.acl.ts | 111 - .../invoicePayments/invoicePayments.api.ts | 173 -- .../invoicePayments.configs.ts | 143 -- .../invoicePayments/invoicePayments.models.ts | 470 ----- .../invoicePayments.queries.ts | 467 ----- test/generated/dist/invoices/invoices.acl.ts | 375 ---- test/generated/dist/invoices/invoices.api.ts | 507 ----- .../dist/invoices/invoices.configs.ts | 321 --- .../dist/invoices/invoices.models.ts | 1605 -------------- .../dist/invoices/invoices.queries.ts | 1600 -------------- .../dist/masterData/masterData.acl.ts | 15 - .../dist/masterData/masterData.api.ts | 65 - .../dist/masterData/masterData.configs.ts | 28 - .../dist/masterData/masterData.models.ts | 94 - .../dist/masterData/masterData.queries.ts | 178 -- .../masterDataImport/masterDataImport.acl.ts | 39 - .../masterDataImport/masterDataImport.api.ts | 38 - .../masterDataImport.models.ts | 110 - .../masterDataImport.queries.ts | 146 -- test/generated/dist/offices/offices.acl.ts | 84 - test/generated/dist/offices/offices.api.ts | 167 -- .../generated/dist/offices/offices.configs.ts | 134 -- test/generated/dist/offices/offices.models.ts | 603 ------ .../generated/dist/offices/offices.queries.ts | 510 ----- .../dist/packageTypes/packageTypes.acl.ts | 45 - .../dist/packageTypes/packageTypes.api.ts | 125 -- .../dist/packageTypes/packageTypes.configs.ts | 128 -- .../dist/packageTypes/packageTypes.models.ts | 572 ----- .../dist/packageTypes/packageTypes.queries.ts | 365 ---- .../partnerNetworks/partnerNetworks.acl.ts | 45 - .../partnerNetworks/partnerNetworks.api.ts | 129 -- .../partnerNetworks.configs.ts | 113 - .../partnerNetworks/partnerNetworks.models.ts | 142 -- .../partnerNetworks.queries.ts | 370 ---- .../paymentConfirmations.acl.ts | 39 - .../paymentConfirmations.api.ts | 86 - .../paymentConfirmations.configs.ts | 48 - .../paymentConfirmations.models.ts | 95 - .../paymentConfirmations.queries.ts | 204 -- test/generated/dist/ports/ports.acl.ts | 33 - test/generated/dist/ports/ports.api.ts | 96 - test/generated/dist/ports/ports.configs.ts | 127 -- test/generated/dist/ports/ports.models.ts | 217 -- test/generated/dist/ports/ports.queries.ts | 281 --- .../positionAccount/positionAccount.acl.ts | 15 - .../positionAccount/positionAccount.api.ts | 13 - .../positionAccount/positionAccount.models.ts | 78 - .../positionAccount.queries.ts | 44 - .../positionAccountItems.acl.ts | 75 - .../positionAccountItems.api.ts | 87 - .../positionAccountItems.models.ts | 251 --- .../positionAccountItems.queries.ts | 229 -- .../dist/positionCargo/positionCargo.acl.ts | 111 - .../dist/positionCargo/positionCargo.api.ts | 127 -- .../positionCargo/positionCargo.configs.ts | 132 -- .../positionCargo/positionCargo.models.ts | 57 - .../positionCargo/positionCargo.queries.ts | 415 ---- .../positionCargoPackage.acl.ts | 63 - .../positionCargoPackage.api.ts | 80 - .../positionCargoPackage.queries.ts | 207 -- .../positionChecklist.acl.ts | 75 - .../positionChecklist.api.ts | 70 - .../positionChecklist.models.ts | 96 - .../positionChecklist.queries.ts | 227 -- .../positionInvolvedParties.acl.ts | 51 - .../positionInvolvedParties.api.ts | 56 - .../positionInvolvedParties.models.ts | 11 - .../positionInvolvedParties.queries.ts | 157 -- .../positionProfitChangeTracking.acl.ts | 29 - .../positionProfitChangeTracking.api.ts | 66 - .../positionProfitChangeTracking.configs.ts | 51 - .../positionProfitChangeTracking.models.ts | 117 -- .../positionProfitChangeTracking.queries.ts | 208 -- .../dist/positionRoutes/positionRoutes.acl.ts | 87 - .../dist/positionRoutes/positionRoutes.api.ts | 93 - .../positionRoutes/positionRoutes.queries.ts | 263 --- .../generated/dist/positions/positions.acl.ts | 195 -- .../generated/dist/positions/positions.api.ts | 262 --- .../dist/positions/positions.configs.ts | 258 --- .../dist/positions/positions.models.ts | 888 -------- .../dist/positions/positions.queries.ts | 757 ------- .../dist/projectLite/projectLite.acl.ts | 87 - .../dist/projectLite/projectLite.api.ts | 136 -- .../dist/projectLite/projectLite.configs.ts | 115 - .../dist/projectLite/projectLite.models.ts | 128 -- .../dist/projectLite/projectLite.queries.ts | 415 ---- test/generated/dist/queryModules.ts | 96 - .../dist/quoteAccount/quoteAccount.acl.ts | 63 - .../dist/quoteAccount/quoteAccount.api.ts | 58 - .../dist/quoteAccount/quoteAccount.models.ts | 273 --- .../dist/quoteAccount/quoteAccount.queries.ts | 187 -- .../dist/quoteCargo/quoteCargo.acl.ts | 99 - .../dist/quoteCargo/quoteCargo.api.ts | 109 - .../dist/quoteCargo/quoteCargo.configs.ts | 99 - .../dist/quoteCargo/quoteCargo.models.ts | 55 - .../dist/quoteCargo/quoteCargo.queries.ts | 380 ---- .../quoteCargoPackage.acl.ts | 63 - .../quoteCargoPackage.api.ts | 80 - .../quoteCargoPackage.queries.ts | 207 -- .../quoteConversion/quoteConversion.acl.ts | 15 - .../quoteConversion/quoteConversion.api.ts | 21 - .../quoteConversion/quoteConversion.models.ts | 13 - .../quoteConversion.queries.ts | 48 - .../dist/quoteDocument/quoteDocument.acl.ts | 63 - .../dist/quoteDocument/quoteDocument.api.ts | 81 - .../quoteDocument/quoteDocument.models.ts | 198 -- .../quoteDocument/quoteDocument.queries.ts | 186 -- .../quoteProfitChangeTracking.acl.ts | 29 - .../quoteProfitChangeTracking.api.ts | 50 - .../quoteProfitChangeTracking.configs.ts | 35 - .../quoteProfitChangeTracking.models.ts | 84 - .../quoteProfitChangeTracking.queries.ts | 142 -- .../dist/quoteRoutes/quoteRoutes.acl.ts | 87 - .../dist/quoteRoutes/quoteRoutes.api.ts | 93 - .../dist/quoteRoutes/quoteRoutes.queries.ts | 263 --- test/generated/dist/quotes/quotes.acl.ts | 147 -- test/generated/dist/quotes/quotes.api.ts | 182 -- test/generated/dist/quotes/quotes.configs.ts | 136 -- test/generated/dist/quotes/quotes.models.ts | 322 --- test/generated/dist/quotes/quotes.queries.ts | 507 ----- .../remarkTemplates/remarkTemplates.acl.ts | 87 - .../remarkTemplates/remarkTemplates.api.ts | 136 -- .../remarkTemplates.configs.ts | 122 -- .../remarkTemplates/remarkTemplates.models.ts | 221 -- .../remarkTemplates.queries.ts | 420 ---- .../dist/roadQuotes/roadQuotes.acl.ts | 27 - .../dist/roadQuotes/roadQuotes.api.ts | 27 - .../dist/roadQuotes/roadQuotes.models.ts | 45 - .../dist/roadQuotes/roadQuotes.queries.ts | 83 - .../dist/seaPositions/seaPositions.acl.ts | 27 - .../dist/seaPositions/seaPositions.api.ts | 27 - .../dist/seaPositions/seaPositions.models.ts | 87 - .../dist/seaPositions/seaPositions.queries.ts | 83 - .../generated/dist/seaQuotes/seaQuotes.acl.ts | 27 - .../generated/dist/seaQuotes/seaQuotes.api.ts | 27 - .../dist/seaQuotes/seaQuotes.models.ts | 52 - .../dist/seaQuotes/seaQuotes.queries.ts | 83 - .../shippingInstructions.acl.ts | 93 - .../shippingInstructions.api.ts | 79 - .../shippingInstructions.models.ts | 847 -------- .../shippingInstructions.queries.ts | 272 --- .../generated/dist/terminals/terminals.acl.ts | 45 - .../generated/dist/terminals/terminals.api.ts | 107 - .../dist/terminals/terminals.configs.ts | 145 -- .../dist/terminals/terminals.models.ts | 294 --- .../dist/terminals/terminals.queries.ts | 358 ---- .../dist/useCrossTabQueryInvalidation.ts | 40 - test/generated/dist/useMutationEffects.ts | 95 - .../dist/userActivity/userActivity.api.ts | 30 - .../dist/userActivity/userActivity.models.ts | 91 - .../dist/userActivity/userActivity.queries.ts | 50 - test/generated/dist/vatRules/vatRules.acl.ts | 45 - test/generated/dist/vatRules/vatRules.api.ts | 117 -- .../dist/vatRules/vatRules.configs.ts | 150 -- .../dist/vatRules/vatRules.models.ts | 224 -- .../dist/vatRules/vatRules.queries.ts | 341 --- .../dist/warehouses/warehouses.acl.ts | 45 - .../dist/warehouses/warehouses.api.ts | 107 - .../dist/warehouses/warehouses.configs.ts | 140 -- .../dist/warehouses/warehouses.models.ts | 224 -- .../dist/warehouses/warehouses.queries.ts | 348 --- .../workingDocuments/workingDocuments.acl.ts | 27 - .../workingDocuments/workingDocuments.api.ts | 56 - .../workingDocuments.configs.ts | 54 - .../workingDocuments.models.ts | 100 - .../workingDocuments.queries.ts | 190 -- .../workingDocumentsAmsInstructions.acl.ts | 93 - .../workingDocumentsAmsInstructions.api.ts | 89 - .../workingDocumentsAmsInstructions.models.ts | 245 --- ...workingDocumentsAmsInstructions.queries.ts | 312 --- .../workingDocumentsBlInstructions.acl.ts | 108 - .../workingDocumentsBlInstructions.api.ts | 110 - .../workingDocumentsBlInstructions.models.ts | 472 ----- .../workingDocumentsBlInstructions.queries.ts | 341 --- .../workingDocumentsCmrForm.acl.ts | 75 - .../workingDocumentsCmrForm.api.ts | 74 - .../workingDocumentsCmrForm.models.ts | 320 --- .../workingDocumentsCmrForm.queries.ts | 266 --- .../workingDocumentsExportDeclaration.acl.ts | 99 - .../workingDocumentsExportDeclaration.api.ts | 89 - ...orkingDocumentsExportDeclaration.models.ts | 179 -- ...rkingDocumentsExportDeclaration.queries.ts | 320 --- .../workingDocumentsFcrForm.acl.ts | 75 - .../workingDocumentsFcrForm.api.ts | 74 - .../workingDocumentsFcrForm.models.ts | 150 -- .../workingDocumentsFcrForm.queries.ts | 266 --- .../workingDocumentsHouseAwb.acl.ts | 75 - .../workingDocumentsHouseAwb.api.ts | 84 - .../workingDocumentsHouseAwb.models.ts | 307 --- .../workingDocumentsHouseAwb.queries.ts | 266 --- .../workingDocumentsHouseBl.acl.ts | 99 - .../workingDocumentsHouseBl.api.ts | 129 -- .../workingDocumentsHouseBl.models.ts | 350 ---- .../workingDocumentsHouseBl.queries.ts | 392 ---- .../workingDocumentsIsfForm.acl.ts | 75 - .../workingDocumentsIsfForm.api.ts | 74 - .../workingDocumentsIsfForm.models.ts | 260 --- .../workingDocumentsIsfForm.queries.ts | 266 --- .../workingDocumentsMasterAwb.acl.ts | 75 - .../workingDocumentsMasterAwb.api.ts | 89 - .../workingDocumentsMasterAwb.models.ts | 311 --- .../workingDocumentsMasterAwb.queries.ts | 266 --- .../workingDocumentsTemplatedDocument.acl.ts | 115 - .../workingDocumentsTemplatedDocument.api.ts | 117 -- ...orkingDocumentsTemplatedDocument.models.ts | 94 - ...rkingDocumentsTemplatedDocument.queries.ts | 332 --- test/generated/dist/zod.extended.ts | 47 - .../generated/full/aWBStocks/aWBStocks.acl.ts | 95 - .../generated/full/aWBStocks/aWBStocks.api.ts | 71 - .../full/aWBStocks/aWBStocks.configs.ts | 92 - .../full/aWBStocks/aWBStocks.models.ts | 114 - .../full/aWBStocks/aWBStocks.queries.ts | 242 --- test/generated/full/acl/app.ability.ts | 32 - test/generated/full/acl/useAclCheck.ts | 21 - .../full/airPositions/airPositions.acl.ts | 30 - .../full/airPositions/airPositions.api.ts | 22 - .../full/airPositions/airPositions.models.ts | 49 - .../full/airPositions/airPositions.queries.ts | 71 - test/generated/full/airports/airports.acl.ts | 54 - test/generated/full/airports/airports.api.ts | 63 - .../full/airports/airports.configs.ts | 118 -- .../full/airports/airports.models.ts | 109 - .../full/airports/airports.queries.ts | 209 -- test/generated/full/app-rest-client.ts | 7 - .../full/bankAccounts/bankAccounts.acl.ts | 24 - .../full/bankAccounts/bankAccounts.api.ts | 37 - .../full/bankAccounts/bankAccounts.configs.ts | 43 - .../full/bankAccounts/bankAccounts.models.ts | 42 - .../full/bankAccounts/bankAccounts.queries.ts | 97 - .../bookkeepingExport.acl.ts | 134 -- .../bookkeepingExport.api.ts | 107 - .../bookkeepingExport.configs.ts | 123 -- .../bookkeepingExport.models.ts | 293 --- .../bookkeepingExport.queries.ts | 351 ---- .../businessPartnerBookkeepingMappings.acl.ts | 69 - .../businessPartnerBookkeepingMappings.api.ts | 47 - ...sinessPartnerBookkeepingMappings.models.ts | 62 - ...inessPartnerBookkeepingMappings.queries.ts | 154 -- .../businessPartnerContacts.acl.ts | 69 - .../businessPartnerContacts.api.ts | 55 - .../businessPartnerContacts.configs.ts | 42 - .../businessPartnerContacts.models.ts | 84 - .../businessPartnerContacts.queries.ts | 186 -- .../businessPartners/businessPartners.acl.ts | 264 --- .../businessPartners/businessPartners.api.ts | 179 -- .../businessPartners.configs.ts | 149 -- .../businessPartners.models.ts | 489 ----- .../businessPartners.queries.ts | 642 ------ .../full/cargoTypes/cargoTypes.acl.ts | 74 - .../full/cargoTypes/cargoTypes.api.ts | 79 - .../full/cargoTypes/cargoTypes.configs.ts | 142 -- .../full/cargoTypes/cargoTypes.models.ts | 141 -- .../full/cargoTypes/cargoTypes.queries.ts | 265 --- .../full/chargeTypes/chargeTypes.acl.ts | 74 - .../full/chargeTypes/chargeTypes.api.ts | 79 - .../full/chargeTypes/chargeTypes.configs.ts | 136 -- .../full/chargeTypes/chargeTypes.models.ts | 154 -- .../full/chargeTypes/chargeTypes.queries.ts | 265 --- .../full/checklistItems/checklistItems.acl.ts | 95 - .../full/checklistItems/checklistItems.api.ts | 79 - .../checklistItems/checklistItems.configs.ts | 116 - .../checklistItems/checklistItems.models.ts | 107 - .../checklistItems/checklistItems.queries.ts | 270 --- .../checklistTemplates.acl.ts | 95 - .../checklistTemplates.api.ts | 79 - .../checklistTemplates.configs.ts | 118 -- .../checklistTemplates.models.ts | 119 -- .../checklistTemplates.queries.ts | 270 --- test/generated/full/cities/cities.acl.ts | 84 - test/generated/full/cities/cities.api.ts | 86 - test/generated/full/cities/cities.configs.ts | 124 -- test/generated/full/cities/cities.models.ts | 145 -- test/generated/full/cities/cities.queries.ts | 283 --- test/generated/full/common/common.models.ts | 1860 ----------------- .../full/containerYards/containerYards.acl.ts | 84 - .../full/containerYards/containerYards.api.ts | 87 - .../containerYards/containerYards.configs.ts | 142 -- .../containerYards/containerYards.models.ts | 139 -- .../containerYards/containerYards.queries.ts | 287 --- .../controlTowerAuth/controlTowerAuth.api.ts | 23 - .../controlTowerAuth.models.ts | 34 - .../controlTowerAuth.queries.ts | 60 - .../controlTowerBookings.api.ts | 38 - .../controlTowerBookings.configs.ts | 56 - .../controlTowerBookings.models.ts | 147 -- .../controlTowerBookings.queries.ts | 105 - .../controlTowerCalendar.api.ts | 26 - .../controlTowerCalendar.models.ts | 91 - .../controlTowerCalendar.queries.ts | 39 - .../controlTowerContainers.api.ts | 38 - .../controlTowerContainers.configs.ts | 54 - .../controlTowerContainers.models.ts | 133 -- .../controlTowerContainers.queries.ts | 104 - .../full/controlTowerMe/controlTowerMe.api.ts | 55 - .../controlTowerMe/controlTowerMe.models.ts | 173 -- .../controlTowerMe/controlTowerMe.queries.ts | 148 -- .../controlTowerPackages.api.ts | 24 - .../controlTowerPackages.configs.ts | 50 - .../controlTowerPackages.models.ts | 54 - .../controlTowerPackages.queries.ts | 66 - .../controlTowerSearch.api.ts | 22 - .../controlTowerSearch.models.ts | 42 - .../controlTowerSearch.queries.ts | 38 - .../generated/full/countries/countries.acl.ts | 34 - .../generated/full/countries/countries.api.ts | 47 - .../full/countries/countries.configs.ts | 84 - .../full/countries/countries.models.ts | 82 - .../full/countries/countries.queries.ts | 153 -- .../full/currencies/currencies.acl.ts | 64 - .../full/currencies/currencies.api.ts | 79 - .../full/currencies/currencies.configs.ts | 153 -- .../full/currencies/currencies.models.ts | 122 -- .../full/currencies/currencies.queries.ts | 268 --- .../customerAccount/customerAccount.api.ts | 13 - .../customerAccount/customerAccount.models.ts | 37 - .../customerAccount.queries.ts | 32 - .../generated/full/customers/customers.acl.ts | 66 - .../generated/full/customers/customers.api.ts | 70 - .../full/customers/customers.configs.ts | 92 - .../full/customers/customers.models.ts | 137 -- .../full/customers/customers.queries.ts | 222 -- test/generated/full/depots/depots.acl.ts | 74 - test/generated/full/depots/depots.api.ts | 79 - test/generated/full/depots/depots.configs.ts | 134 -- test/generated/full/depots/depots.models.ts | 157 -- test/generated/full/depots/depots.queries.ts | 261 --- .../documentTemplates.acl.ts | 121 -- .../documentTemplates.api.ts | 95 - .../documentTemplates.configs.ts | 119 -- .../documentTemplates.models.ts | 138 -- .../documentTemplates.queries.ts | 334 --- .../dunningAccountStatement.acl.ts | 30 - .../dunningAccountStatement.api.ts | 52 - .../dunningAccountStatement.models.ts | 83 - .../dunningAccountStatement.queries.ts | 156 -- .../full/dunningLevels/dunningLevels.acl.ts | 95 - .../full/dunningLevels/dunningLevels.api.ts | 79 - .../dunningLevels/dunningLevels.configs.ts | 135 -- .../dunningLevels/dunningLevels.models.ts | 136 -- .../dunningLevels/dunningLevels.queries.ts | 274 --- .../dunningManagement.acl.ts | 43 - .../dunningManagement.api.ts | 53 - .../dunningManagement.configs.ts | 60 - .../dunningManagement.models.ts | 195 -- .../dunningManagement.queries.ts | 175 -- .../dunningPartnerOutstandingInvoices.acl.ts | 43 - .../dunningPartnerOutstandingInvoices.api.ts | 48 - ...nningPartnerOutstandingInvoices.configs.ts | 97 - ...unningPartnerOutstandingInvoices.models.ts | 129 -- ...nningPartnerOutstandingInvoices.queries.ts | 166 -- .../full/dunningSystems/dunningSystems.acl.ts | 95 - .../full/dunningSystems/dunningSystems.api.ts | 79 - .../dunningSystems/dunningSystems.configs.ts | 120 -- .../dunningSystems/dunningSystems.models.ts | 111 - .../dunningSystems/dunningSystems.queries.ts | 274 --- test/generated/full/employee/employee.acl.ts | 153 -- test/generated/full/employee/employee.api.ts | 157 -- .../full/employee/employee.configs.ts | 135 -- .../full/employee/employee.models.ts | 227 -- .../full/employee/employee.queries.ts | 470 ----- .../employeeAccount/employeeAccount.api.ts | 13 - .../employeeAccount/employeeAccount.models.ts | 53 - .../employeeAccount.queries.ts | 32 - .../employeePermissions.acl.ts | 24 - .../employeePermissions.api.ts | 36 - .../employeePermissions.configs.ts | 45 - .../employeePermissions.models.ts | 54 - .../employeePermissions.queries.ts | 94 - .../employeeProfile/employeeProfile.api.ts | 22 - .../employeeProfile/employeeProfile.models.ts | 33 - .../employeeProfile.queries.ts | 58 - .../full/employeeRoles/employeeRoles.acl.ts | 97 - .../full/employeeRoles/employeeRoles.api.ts | 92 - .../employeeRoles/employeeRoles.configs.ts | 90 - .../employeeRoles/employeeRoles.models.ts | 125 -- .../employeeRoles/employeeRoles.queries.ts | 283 --- .../employeeSettings/employeeSettings.api.ts | 23 - .../employeeSettings.models.ts | 20 - .../employeeSettings.queries.ts | 58 - .../full/employment/employment.acl.ts | 95 - .../full/employment/employment.api.ts | 73 - .../full/employment/employment.configs.ts | 63 - .../full/employment/employment.models.ts | 114 - .../full/employment/employment.queries.ts | 235 --- .../factoringExport/factoringExport.acl.ts | 30 - .../factoringExport/factoringExport.api.ts | 22 - .../factoringExport/factoringExport.models.ts | 41 - .../factoringExport.queries.ts | 68 - .../full/factoringMerge/factoringMerge.acl.ts | 43 - .../full/factoringMerge/factoringMerge.api.ts | 30 - .../factoringMerge/factoringMerge.models.ts | 84 - .../factoringMerge/factoringMerge.queries.ts | 97 - test/generated/full/files/files.api.ts | 72 - test/generated/full/files/files.models.ts | 57 - test/generated/full/files/files.queries.ts | 210 -- test/generated/full/folders/folders.api.ts | 63 - test/generated/full/folders/folders.models.ts | 96 - .../generated/full/folders/folders.queries.ts | 188 -- test/generated/full/hsCodes/hsCodes.acl.ts | 74 - test/generated/full/hsCodes/hsCodes.api.ts | 79 - .../generated/full/hsCodes/hsCodes.configs.ts | 120 -- test/generated/full/hsCodes/hsCodes.models.ts | 111 - .../generated/full/hsCodes/hsCodes.queries.ts | 265 --- .../integrationChannels.acl.ts | 108 - .../integrationChannels.api.ts | 87 - .../integrationChannels.configs.ts | 155 -- .../integrationChannels.models.ts | 197 -- .../integrationChannels.queries.ts | 303 --- .../inttraOfficeIntegration.acl.ts | 43 - .../inttraOfficeIntegration.api.ts | 30 - .../inttraOfficeIntegration.models.ts | 52 - .../inttraOfficeIntegration.queries.ts | 93 - .../inttraShippingInstructionMessages.acl.ts | 56 - .../inttraShippingInstructionMessages.api.ts | 46 - ...ttraShippingInstructionMessages.configs.ts | 88 - ...nttraShippingInstructionMessages.models.ts | 104 - ...ttraShippingInstructionMessages.queries.ts | 165 -- .../invoicePayments/invoicePayments.acl.ts | 121 -- .../invoicePayments/invoicePayments.api.ts | 100 - .../invoicePayments.configs.ts | 144 -- .../invoicePayments/invoicePayments.models.ts | 292 --- .../invoicePayments.queries.ts | 326 --- test/generated/full/invoices/invoices.acl.ts | 407 ---- test/generated/full/invoices/invoices.api.ts | 349 ---- .../full/invoices/invoices.configs.ts | 322 --- .../full/invoices/invoices.models.ts | 988 --------- .../full/invoices/invoices.queries.ts | 1123 ---------- .../full/masterData/masterData.acl.ts | 24 - .../full/masterData/masterData.api.ts | 37 - .../full/masterData/masterData.configs.ts | 29 - .../full/masterData/masterData.models.ts | 68 - .../full/masterData/masterData.queries.ts | 100 - .../masterDataImport/masterDataImport.acl.ts | 43 - .../masterDataImport/masterDataImport.api.ts | 30 - .../masterDataImport.models.ts | 78 - .../masterDataImport.queries.ts | 121 -- test/generated/full/offices/offices.acl.ts | 102 - test/generated/full/offices/offices.api.ts | 115 - .../generated/full/offices/offices.configs.ts | 135 -- test/generated/full/offices/offices.models.ts | 390 ---- .../generated/full/offices/offices.queries.ts | 403 ---- .../full/packageTypes/packageTypes.acl.ts | 74 - .../full/packageTypes/packageTypes.api.ts | 79 - .../full/packageTypes/packageTypes.configs.ts | 129 -- .../full/packageTypes/packageTypes.models.ts | 128 -- .../full/packageTypes/packageTypes.queries.ts | 265 --- .../partnerNetworks/partnerNetworks.acl.ts | 74 - .../partnerNetworks/partnerNetworks.api.ts | 79 - .../partnerNetworks.configs.ts | 114 - .../partnerNetworks/partnerNetworks.models.ts | 105 - .../partnerNetworks.queries.ts | 265 --- .../paymentConfirmations.acl.ts | 43 - .../paymentConfirmations.api.ts | 54 - .../paymentConfirmations.configs.ts | 49 - .../paymentConfirmations.models.ts | 70 - .../paymentConfirmations.queries.ts | 131 -- test/generated/full/ports/ports.acl.ts | 54 - test/generated/full/ports/ports.api.ts | 63 - test/generated/full/ports/ports.configs.ts | 128 -- test/generated/full/ports/ports.models.ts | 151 -- test/generated/full/ports/ports.queries.ts | 209 -- .../positionAccount/positionAccount.acl.ts | 17 - .../positionAccount/positionAccount.api.ts | 13 - .../positionAccount/positionAccount.models.ts | 52 - .../positionAccount.queries.ts | 39 - .../positionAccountItems.acl.ts | 82 - .../positionAccountItems.api.ts | 56 - .../positionAccountItems.models.ts | 167 -- .../positionAccountItems.queries.ts | 185 -- .../full/positionCargo/positionCargo.acl.ts | 121 -- .../full/positionCargo/positionCargo.api.ts | 85 - .../positionCargo/positionCargo.configs.ts | 133 -- .../positionCargo/positionCargo.models.ts | 47 - .../positionCargo/positionCargo.queries.ts | 294 --- .../positionCargoPackage.acl.ts | 69 - .../positionCargoPackage.api.ts | 48 - .../positionCargoPackage.queries.ts | 163 -- .../positionChecklist.acl.ts | 82 - .../positionChecklist.api.ts | 54 - .../positionChecklist.models.ts | 77 - .../positionChecklist.queries.ts | 182 -- .../positionInvolvedParties.acl.ts | 56 - .../positionInvolvedParties.api.ts | 40 - .../positionInvolvedParties.models.ts | 12 - .../positionInvolvedParties.queries.ts | 126 -- .../positionProfitChangeTracking.acl.ts | 32 - .../positionProfitChangeTracking.api.ts | 31 - .../positionProfitChangeTracking.configs.ts | 51 - .../positionProfitChangeTracking.models.ts | 74 - .../positionProfitChangeTracking.queries.ts | 102 - .../full/positionRoutes/positionRoutes.acl.ts | 95 - .../full/positionRoutes/positionRoutes.api.ts | 63 - .../positionRoutes/positionRoutes.queries.ts | 213 -- .../generated/full/positions/positions.acl.ts | 212 -- .../generated/full/positions/positions.api.ts | 166 -- .../full/positions/positions.configs.ts | 259 --- .../full/positions/positions.models.ts | 501 ----- .../full/positions/positions.queries.ts | 536 ----- .../full/projectLite/projectLite.acl.ts | 95 - .../full/projectLite/projectLite.api.ts | 79 - .../full/projectLite/projectLite.configs.ts | 116 - .../full/projectLite/projectLite.models.ts | 98 - .../full/projectLite/projectLite.queries.ts | 270 --- test/generated/full/queryModules.ts | 96 - .../full/quoteAccount/quoteAccount.acl.ts | 69 - .../full/quoteAccount/quoteAccount.api.ts | 47 - .../full/quoteAccount/quoteAccount.models.ts | 170 -- .../full/quoteAccount/quoteAccount.queries.ts | 154 -- .../full/quoteCargo/quoteCargo.acl.ts | 108 - .../full/quoteCargo/quoteCargo.api.ts | 77 - .../full/quoteCargo/quoteCargo.configs.ts | 100 - .../full/quoteCargo/quoteCargo.models.ts | 47 - .../full/quoteCargo/quoteCargo.queries.ts | 266 --- .../quoteCargoPackage.acl.ts | 69 - .../quoteCargoPackage.api.ts | 48 - .../quoteCargoPackage.queries.ts | 163 -- .../quoteConversion/quoteConversion.acl.ts | 17 - .../quoteConversion/quoteConversion.api.ts | 16 - .../quoteConversion/quoteConversion.models.ts | 12 - .../quoteConversion.queries.ts | 44 - .../full/quoteDocument/quoteDocument.acl.ts | 69 - .../full/quoteDocument/quoteDocument.api.ts | 61 - .../quoteDocument/quoteDocument.models.ts | 134 -- .../quoteDocument/quoteDocument.queries.ts | 153 -- .../quoteProfitChangeTracking.acl.ts | 32 - .../quoteProfitChangeTracking.api.ts | 29 - .../quoteProfitChangeTracking.configs.ts | 36 - .../quoteProfitChangeTracking.models.ts | 56 - .../quoteProfitChangeTracking.queries.ts | 97 - .../full/quoteRoutes/quoteRoutes.acl.ts | 95 - .../full/quoteRoutes/quoteRoutes.api.ts | 63 - .../full/quoteRoutes/quoteRoutes.queries.ts | 213 -- test/generated/full/quotes/quotes.acl.ts | 160 -- test/generated/full/quotes/quotes.api.ts | 123 -- test/generated/full/quotes/quotes.configs.ts | 137 -- test/generated/full/quotes/quotes.models.ts | 322 --- test/generated/full/quotes/quotes.queries.ts | 377 ---- .../remarkTemplates/remarkTemplates.acl.ts | 95 - .../remarkTemplates/remarkTemplates.api.ts | 79 - .../remarkTemplates.configs.ts | 123 -- .../remarkTemplates/remarkTemplates.models.ts | 132 -- .../remarkTemplates.queries.ts | 274 --- .../full/roadQuotes/roadQuotes.acl.ts | 30 - .../full/roadQuotes/roadQuotes.api.ts | 22 - .../full/roadQuotes/roadQuotes.models.ts | 29 - .../full/roadQuotes/roadQuotes.queries.ts | 71 - .../full/seaPositions/seaPositions.acl.ts | 30 - .../full/seaPositions/seaPositions.api.ts | 22 - .../full/seaPositions/seaPositions.models.ts | 49 - .../full/seaPositions/seaPositions.queries.ts | 71 - .../generated/full/seaQuotes/seaQuotes.acl.ts | 30 - .../generated/full/seaQuotes/seaQuotes.api.ts | 22 - .../full/seaQuotes/seaQuotes.models.ts | 33 - .../full/seaQuotes/seaQuotes.queries.ts | 71 - .../shippingInstructions.acl.ts | 82 - .../shippingInstructions.api.ts | 62 - .../shippingInstructions.models.ts | 510 ----- .../shippingInstructions.queries.ts | 212 -- .../generated/full/terminals/terminals.acl.ts | 74 - .../generated/full/terminals/terminals.api.ts | 79 - .../full/terminals/terminals.configs.ts | 146 -- .../full/terminals/terminals.models.ts | 196 -- .../full/terminals/terminals.queries.ts | 261 --- .../full/useCrossTabQueryInvalidation.ts | 40 - test/generated/full/useMutationEffects.ts | 95 - .../full/userActivity/userActivity.api.ts | 20 - .../full/userActivity/userActivity.models.ts | 64 - .../full/userActivity/userActivity.queries.ts | 36 - test/generated/full/vatRules/vatRules.acl.ts | 74 - test/generated/full/vatRules/vatRules.api.ts | 79 - .../full/vatRules/vatRules.configs.ts | 151 -- .../full/vatRules/vatRules.models.ts | 146 -- .../full/vatRules/vatRules.queries.ts | 265 --- .../full/warehouses/warehouses.acl.ts | 74 - .../full/warehouses/warehouses.api.ts | 79 - .../full/warehouses/warehouses.configs.ts | 141 -- .../full/warehouses/warehouses.models.ts | 152 -- .../full/warehouses/warehouses.queries.ts | 261 --- .../workingDocuments/workingDocuments.acl.ts | 30 - .../workingDocuments/workingDocuments.api.ts | 31 - .../workingDocuments.configs.ts | 55 - .../workingDocuments.models.ts | 70 - .../workingDocuments.queries.ts | 102 - .../workingDocumentsAmsInstructions.acl.ts | 82 - .../workingDocumentsAmsInstructions.api.ts | 62 - .../workingDocumentsAmsInstructions.models.ts | 142 -- ...workingDocumentsAmsInstructions.queries.ts | 212 -- .../workingDocumentsBlInstructions.acl.ts | 95 - .../workingDocumentsBlInstructions.api.ts | 77 - .../workingDocumentsBlInstructions.models.ts | 260 --- .../workingDocumentsBlInstructions.queries.ts | 243 --- .../workingDocumentsCmrForm.acl.ts | 82 - .../workingDocumentsCmrForm.api.ts | 62 - .../workingDocumentsCmrForm.models.ts | 187 -- .../workingDocumentsCmrForm.queries.ts | 212 -- .../workingDocumentsExportDeclaration.acl.ts | 82 - .../workingDocumentsExportDeclaration.api.ts | 62 - ...orkingDocumentsExportDeclaration.models.ts | 94 - ...rkingDocumentsExportDeclaration.queries.ts | 212 -- .../workingDocumentsFcrForm.acl.ts | 82 - .../workingDocumentsFcrForm.api.ts | 62 - .../workingDocumentsFcrForm.models.ts | 86 - .../workingDocumentsFcrForm.queries.ts | 212 -- .../workingDocumentsHouseAwb.acl.ts | 82 - .../workingDocumentsHouseAwb.api.ts | 62 - .../workingDocumentsHouseAwb.models.ts | 174 -- .../workingDocumentsHouseAwb.queries.ts | 212 -- .../workingDocumentsHouseBl.acl.ts | 108 - .../workingDocumentsHouseBl.api.ts | 91 - .../workingDocumentsHouseBl.models.ts | 196 -- .../workingDocumentsHouseBl.queries.ts | 297 --- .../workingDocumentsIsfForm.acl.ts | 82 - .../workingDocumentsIsfForm.api.ts | 62 - .../workingDocumentsIsfForm.models.ts | 154 -- .../workingDocumentsIsfForm.queries.ts | 212 -- .../workingDocumentsMasterAwb.acl.ts | 82 - .../workingDocumentsMasterAwb.api.ts | 62 - .../workingDocumentsMasterAwb.models.ts | 176 -- .../workingDocumentsMasterAwb.queries.ts | 212 -- .../workingDocumentsTemplatedDocument.acl.ts | 95 - .../workingDocumentsTemplatedDocument.api.ts | 78 - ...orkingDocumentsTemplatedDocument.models.ts | 61 - ...rkingDocumentsTemplatedDocument.queries.ts | 217 -- test/generated/full/zod.extended.ts | 47 - .../generated/next/aWBStocks/aWBStocks.acl.ts | 95 - .../generated/next/aWBStocks/aWBStocks.api.ts | 67 - .../next/aWBStocks/aWBStocks.configs.ts | 92 - .../next/aWBStocks/aWBStocks.models.ts | 114 - .../next/aWBStocks/aWBStocks.queries.ts | 241 --- test/generated/next/acl/app.ability.ts | 32 - test/generated/next/acl/useAclCheck.ts | 21 - .../next/airPositions/airPositions.acl.ts | 30 - .../next/airPositions/airPositions.api.ts | 21 - .../next/airPositions/airPositions.models.ts | 49 - .../next/airPositions/airPositions.queries.ts | 70 - test/generated/next/airports/airports.acl.ts | 54 - test/generated/next/airports/airports.api.ts | 60 - .../next/airports/airports.configs.ts | 118 -- .../next/airports/airports.models.ts | 109 - .../next/airports/airports.queries.ts | 208 -- test/generated/next/app-rest-client.ts | 7 - .../next/bankAccounts/bankAccounts.acl.ts | 24 - .../next/bankAccounts/bankAccounts.api.ts | 34 - .../next/bankAccounts/bankAccounts.configs.ts | 43 - .../next/bankAccounts/bankAccounts.models.ts | 42 - .../next/bankAccounts/bankAccounts.queries.ts | 96 - .../bookkeepingExport.acl.ts | 134 -- .../bookkeepingExport.api.ts | 100 - .../bookkeepingExport.configs.ts | 123 -- .../bookkeepingExport.models.ts | 293 --- .../bookkeepingExport.queries.ts | 350 ---- .../businessPartnerBookkeepingMappings.acl.ts | 69 - .../businessPartnerBookkeepingMappings.api.ts | 45 - ...sinessPartnerBookkeepingMappings.models.ts | 62 - ...inessPartnerBookkeepingMappings.queries.ts | 153 -- .../businessPartnerContacts.acl.ts | 69 - .../businessPartnerContacts.api.ts | 52 - .../businessPartnerContacts.configs.ts | 42 - .../businessPartnerContacts.models.ts | 84 - .../businessPartnerContacts.queries.ts | 185 -- .../businessPartners/businessPartners.acl.ts | 264 --- .../businessPartners/businessPartners.api.ts | 171 -- .../businessPartners.configs.ts | 149 -- .../businessPartners.models.ts | 489 ----- .../businessPartners.queries.ts | 642 ------ .../next/cargoTypes/cargoTypes.acl.ts | 74 - .../next/cargoTypes/cargoTypes.api.ts | 74 - .../next/cargoTypes/cargoTypes.configs.ts | 142 -- .../next/cargoTypes/cargoTypes.models.ts | 141 -- .../next/cargoTypes/cargoTypes.queries.ts | 264 --- .../next/chargeTypes/chargeTypes.acl.ts | 74 - .../next/chargeTypes/chargeTypes.api.ts | 74 - .../next/chargeTypes/chargeTypes.configs.ts | 136 -- .../next/chargeTypes/chargeTypes.models.ts | 154 -- .../next/chargeTypes/chargeTypes.queries.ts | 264 --- .../next/checklistItems/checklistItems.acl.ts | 95 - .../next/checklistItems/checklistItems.api.ts | 74 - .../checklistItems/checklistItems.configs.ts | 116 - .../checklistItems/checklistItems.models.ts | 107 - .../checklistItems/checklistItems.queries.ts | 269 --- .../checklistTemplates.acl.ts | 95 - .../checklistTemplates.api.ts | 74 - .../checklistTemplates.configs.ts | 118 -- .../checklistTemplates.models.ts | 119 -- .../checklistTemplates.queries.ts | 269 --- test/generated/next/cities/cities.acl.ts | 84 - test/generated/next/cities/cities.api.ts | 81 - test/generated/next/cities/cities.configs.ts | 124 -- test/generated/next/cities/cities.models.ts | 145 -- test/generated/next/cities/cities.queries.ts | 282 --- test/generated/next/common/common.models.ts | 1860 ----------------- .../next/containerYards/containerYards.acl.ts | 84 - .../next/containerYards/containerYards.api.ts | 82 - .../containerYards/containerYards.configs.ts | 142 -- .../containerYards/containerYards.models.ts | 139 -- .../containerYards/containerYards.queries.ts | 286 --- .../controlTowerAuth/controlTowerAuth.api.ts | 22 - .../controlTowerAuth.models.ts | 34 - .../controlTowerAuth.queries.ts | 59 - .../controlTowerBookings.api.ts | 36 - .../controlTowerBookings.configs.ts | 56 - .../controlTowerBookings.models.ts | 147 -- .../controlTowerBookings.queries.ts | 104 - .../controlTowerCalendar.api.ts | 24 - .../controlTowerCalendar.models.ts | 91 - .../controlTowerCalendar.queries.ts | 38 - .../controlTowerContainers.api.ts | 36 - .../controlTowerContainers.configs.ts | 54 - .../controlTowerContainers.models.ts | 133 -- .../controlTowerContainers.queries.ts | 103 - .../next/controlTowerMe/controlTowerMe.api.ts | 53 - .../controlTowerMe/controlTowerMe.models.ts | 173 -- .../controlTowerMe/controlTowerMe.queries.ts | 146 -- .../controlTowerPackages.api.ts | 22 - .../controlTowerPackages.configs.ts | 50 - .../controlTowerPackages.models.ts | 54 - .../controlTowerPackages.queries.ts | 65 - .../controlTowerSearch.api.ts | 20 - .../controlTowerSearch.models.ts | 42 - .../controlTowerSearch.queries.ts | 37 - .../generated/next/countries/countries.acl.ts | 34 - .../generated/next/countries/countries.api.ts | 44 - .../next/countries/countries.configs.ts | 84 - .../next/countries/countries.models.ts | 82 - .../next/countries/countries.queries.ts | 152 -- .../next/currencies/currencies.acl.ts | 64 - .../next/currencies/currencies.api.ts | 75 - .../next/currencies/currencies.configs.ts | 153 -- .../next/currencies/currencies.models.ts | 122 -- .../next/currencies/currencies.queries.ts | 267 --- .../customerAccount/customerAccount.api.ts | 12 - .../customerAccount/customerAccount.models.ts | 37 - .../customerAccount.queries.ts | 30 - .../generated/next/customers/customers.acl.ts | 66 - .../generated/next/customers/customers.api.ts | 66 - .../next/customers/customers.configs.ts | 92 - .../next/customers/customers.models.ts | 137 -- .../next/customers/customers.queries.ts | 220 -- test/generated/next/depots/depots.acl.ts | 74 - test/generated/next/depots/depots.api.ts | 74 - test/generated/next/depots/depots.configs.ts | 134 -- test/generated/next/depots/depots.models.ts | 157 -- test/generated/next/depots/depots.queries.ts | 260 --- .../documentTemplates.acl.ts | 121 -- .../documentTemplates.api.ts | 89 - .../documentTemplates.configs.ts | 119 -- .../documentTemplates.models.ts | 138 -- .../documentTemplates.queries.ts | 333 --- .../dunningAccountStatement.acl.ts | 30 - .../dunningAccountStatement.api.ts | 49 - .../dunningAccountStatement.models.ts | 83 - .../dunningAccountStatement.queries.ts | 154 -- .../next/dunningLevels/dunningLevels.acl.ts | 95 - .../next/dunningLevels/dunningLevels.api.ts | 74 - .../dunningLevels/dunningLevels.configs.ts | 135 -- .../dunningLevels/dunningLevels.models.ts | 136 -- .../dunningLevels/dunningLevels.queries.ts | 273 --- .../dunningManagement.acl.ts | 43 - .../dunningManagement.api.ts | 50 - .../dunningManagement.configs.ts | 60 - .../dunningManagement.models.ts | 195 -- .../dunningManagement.queries.ts | 173 -- .../dunningPartnerOutstandingInvoices.acl.ts | 43 - .../dunningPartnerOutstandingInvoices.api.ts | 45 - ...nningPartnerOutstandingInvoices.configs.ts | 97 - ...unningPartnerOutstandingInvoices.models.ts | 129 -- ...nningPartnerOutstandingInvoices.queries.ts | 165 -- .../next/dunningSystems/dunningSystems.acl.ts | 95 - .../next/dunningSystems/dunningSystems.api.ts | 74 - .../dunningSystems/dunningSystems.configs.ts | 120 -- .../dunningSystems/dunningSystems.models.ts | 111 - .../dunningSystems/dunningSystems.queries.ts | 273 --- test/generated/next/employee/employee.acl.ts | 153 -- test/generated/next/employee/employee.api.ts | 147 -- .../next/employee/employee.configs.ts | 135 -- .../next/employee/employee.models.ts | 225 -- .../next/employee/employee.queries.ts | 469 ----- .../employeeAccount/employeeAccount.api.ts | 12 - .../employeeAccount/employeeAccount.models.ts | 53 - .../employeeAccount.queries.ts | 30 - .../employeePermissions.acl.ts | 24 - .../employeePermissions.api.ts | 33 - .../employeePermissions.configs.ts | 45 - .../employeePermissions.models.ts | 54 - .../employeePermissions.queries.ts | 93 - .../employeeProfile/employeeProfile.api.ts | 21 - .../employeeProfile/employeeProfile.models.ts | 33 - .../employeeProfile.queries.ts | 56 - .../next/employeeRoles/employeeRoles.acl.ts | 97 - .../next/employeeRoles/employeeRoles.api.ts | 88 - .../employeeRoles/employeeRoles.configs.ts | 90 - .../employeeRoles/employeeRoles.models.ts | 123 -- .../employeeRoles/employeeRoles.queries.ts | 282 --- .../employeeSettings/employeeSettings.api.ts | 22 - .../employeeSettings.models.ts | 20 - .../employeeSettings.queries.ts | 56 - .../next/employment/employment.acl.ts | 95 - .../next/employment/employment.api.ts | 69 - .../next/employment/employment.configs.ts | 63 - .../next/employment/employment.models.ts | 114 - .../next/employment/employment.queries.ts | 234 --- .../factoringExport/factoringExport.acl.ts | 30 - .../factoringExport/factoringExport.api.ts | 21 - .../factoringExport/factoringExport.models.ts | 41 - .../factoringExport.queries.ts | 67 - .../next/factoringMerge/factoringMerge.acl.ts | 43 - .../next/factoringMerge/factoringMerge.api.ts | 28 - .../factoringMerge/factoringMerge.models.ts | 84 - .../factoringMerge/factoringMerge.queries.ts | 96 - test/generated/next/files/files.api.ts | 70 - test/generated/next/files/files.models.ts | 57 - test/generated/next/files/files.queries.ts | 210 -- test/generated/next/folders/folders.api.ts | 60 - test/generated/next/folders/folders.models.ts | 96 - .../generated/next/folders/folders.queries.ts | 187 -- test/generated/next/hsCodes/hsCodes.acl.ts | 74 - test/generated/next/hsCodes/hsCodes.api.ts | 74 - .../generated/next/hsCodes/hsCodes.configs.ts | 120 -- test/generated/next/hsCodes/hsCodes.models.ts | 111 - .../generated/next/hsCodes/hsCodes.queries.ts | 264 --- .../integrationChannels.acl.ts | 108 - .../integrationChannels.api.ts | 81 - .../integrationChannels.configs.ts | 155 -- .../integrationChannels.models.ts | 197 -- .../integrationChannels.queries.ts | 302 --- .../inttraOfficeIntegration.acl.ts | 43 - .../inttraOfficeIntegration.api.ts | 28 - .../inttraOfficeIntegration.models.ts | 52 - .../inttraOfficeIntegration.queries.ts | 92 - .../inttraShippingInstructionMessages.acl.ts | 56 - .../inttraShippingInstructionMessages.api.ts | 44 - ...ttraShippingInstructionMessages.configs.ts | 88 - ...nttraShippingInstructionMessages.models.ts | 104 - ...ttraShippingInstructionMessages.queries.ts | 164 -- .../invoicePayments/invoicePayments.acl.ts | 121 -- .../invoicePayments/invoicePayments.api.ts | 95 - .../invoicePayments.configs.ts | 144 -- .../invoicePayments/invoicePayments.models.ts | 292 --- .../invoicePayments.queries.ts | 325 --- test/generated/next/invoices/invoices.acl.ts | 407 ---- test/generated/next/invoices/invoices.api.ts | 327 --- .../next/invoices/invoices.configs.ts | 322 --- .../next/invoices/invoices.models.ts | 987 --------- .../next/invoices/invoices.queries.ts | 1123 ---------- .../next/masterData/masterData.acl.ts | 24 - .../next/masterData/masterData.api.ts | 34 - .../next/masterData/masterData.configs.ts | 29 - .../next/masterData/masterData.models.ts | 68 - .../next/masterData/masterData.queries.ts | 99 - .../masterDataImport/masterDataImport.acl.ts | 43 - .../masterDataImport/masterDataImport.api.ts | 29 - .../masterDataImport.models.ts | 78 - .../masterDataImport.queries.ts | 121 -- test/generated/next/offices/offices.acl.ts | 102 - test/generated/next/offices/offices.api.ts | 110 - .../generated/next/offices/offices.configs.ts | 135 -- test/generated/next/offices/offices.models.ts | 390 ---- .../generated/next/offices/offices.queries.ts | 403 ---- .../next/packageTypes/packageTypes.acl.ts | 74 - .../next/packageTypes/packageTypes.api.ts | 74 - .../next/packageTypes/packageTypes.configs.ts | 129 -- .../next/packageTypes/packageTypes.models.ts | 128 -- .../next/packageTypes/packageTypes.queries.ts | 264 --- .../partnerNetworks/partnerNetworks.acl.ts | 74 - .../partnerNetworks/partnerNetworks.api.ts | 74 - .../partnerNetworks.configs.ts | 114 - .../partnerNetworks/partnerNetworks.models.ts | 105 - .../partnerNetworks.queries.ts | 264 --- .../paymentConfirmations.acl.ts | 43 - .../paymentConfirmations.api.ts | 50 - .../paymentConfirmations.configs.ts | 49 - .../paymentConfirmations.models.ts | 70 - .../paymentConfirmations.queries.ts | 130 -- test/generated/next/ports/ports.acl.ts | 54 - test/generated/next/ports/ports.api.ts | 60 - test/generated/next/ports/ports.configs.ts | 128 -- test/generated/next/ports/ports.models.ts | 151 -- test/generated/next/ports/ports.queries.ts | 208 -- .../positionAccount/positionAccount.acl.ts | 17 - .../positionAccount/positionAccount.api.ts | 12 - .../positionAccount/positionAccount.models.ts | 52 - .../positionAccount.queries.ts | 38 - .../positionAccountItems.acl.ts | 82 - .../positionAccountItems.api.ts | 55 - .../positionAccountItems.models.ts | 167 -- .../positionAccountItems.queries.ts | 184 -- .../next/positionCargo/positionCargo.acl.ts | 121 -- .../next/positionCargo/positionCargo.api.ts | 81 - .../positionCargo/positionCargo.configs.ts | 133 -- .../positionCargo/positionCargo.models.ts | 46 - .../positionCargo/positionCargo.queries.ts | 293 --- .../positionCargoPackage.acl.ts | 69 - .../positionCargoPackage.api.ts | 45 - .../positionCargoPackage.queries.ts | 162 -- .../positionChecklist.acl.ts | 82 - .../positionChecklist.api.ts | 51 - .../positionChecklist.models.ts | 77 - .../positionChecklist.queries.ts | 181 -- .../positionInvolvedParties.acl.ts | 56 - .../positionInvolvedParties.api.ts | 38 - .../positionInvolvedParties.models.ts | 12 - .../positionInvolvedParties.queries.ts | 125 -- .../positionProfitChangeTracking.acl.ts | 32 - .../positionProfitChangeTracking.api.ts | 29 - .../positionProfitChangeTracking.configs.ts | 51 - .../positionProfitChangeTracking.models.ts | 74 - .../positionProfitChangeTracking.queries.ts | 101 - .../next/positionRoutes/positionRoutes.acl.ts | 95 - .../next/positionRoutes/positionRoutes.api.ts | 60 - .../positionRoutes/positionRoutes.queries.ts | 212 -- .../generated/next/positions/positions.acl.ts | 212 -- .../generated/next/positions/positions.api.ts | 158 -- .../next/positions/positions.configs.ts | 259 --- .../next/positions/positions.models.ts | 501 ----- .../next/positions/positions.queries.ts | 535 ----- .../next/projectLite/projectLite.acl.ts | 95 - .../next/projectLite/projectLite.api.ts | 74 - .../next/projectLite/projectLite.configs.ts | 116 - .../next/projectLite/projectLite.models.ts | 98 - .../next/projectLite/projectLite.queries.ts | 269 --- test/generated/next/queryModules.ts | 96 - .../next/quoteAccount/quoteAccount.acl.ts | 69 - .../next/quoteAccount/quoteAccount.api.ts | 44 - .../next/quoteAccount/quoteAccount.models.ts | 170 -- .../next/quoteAccount/quoteAccount.queries.ts | 153 -- .../next/quoteCargo/quoteCargo.acl.ts | 108 - .../next/quoteCargo/quoteCargo.api.ts | 73 - .../next/quoteCargo/quoteCargo.configs.ts | 100 - .../next/quoteCargo/quoteCargo.models.ts | 46 - .../next/quoteCargo/quoteCargo.queries.ts | 265 --- .../quoteCargoPackage.acl.ts | 69 - .../quoteCargoPackage.api.ts | 45 - .../quoteCargoPackage.queries.ts | 162 -- .../quoteConversion/quoteConversion.acl.ts | 17 - .../quoteConversion/quoteConversion.api.ts | 15 - .../quoteConversion/quoteConversion.models.ts | 12 - .../quoteConversion.queries.ts | 43 - .../next/quoteDocument/quoteDocument.acl.ts | 69 - .../next/quoteDocument/quoteDocument.api.ts | 58 - .../quoteDocument/quoteDocument.models.ts | 134 -- .../quoteDocument/quoteDocument.queries.ts | 152 -- .../quoteProfitChangeTracking.acl.ts | 32 - .../quoteProfitChangeTracking.api.ts | 27 - .../quoteProfitChangeTracking.configs.ts | 36 - .../quoteProfitChangeTracking.models.ts | 56 - .../quoteProfitChangeTracking.queries.ts | 96 - .../next/quoteRoutes/quoteRoutes.acl.ts | 95 - .../next/quoteRoutes/quoteRoutes.api.ts | 60 - .../next/quoteRoutes/quoteRoutes.queries.ts | 212 -- test/generated/next/quotes/quotes.acl.ts | 160 -- test/generated/next/quotes/quotes.api.ts | 117 -- test/generated/next/quotes/quotes.configs.ts | 137 -- test/generated/next/quotes/quotes.models.ts | 322 --- test/generated/next/quotes/quotes.queries.ts | 376 ---- .../remarkTemplates/remarkTemplates.acl.ts | 95 - .../remarkTemplates/remarkTemplates.api.ts | 74 - .../remarkTemplates.configs.ts | 123 -- .../remarkTemplates/remarkTemplates.models.ts | 132 -- .../remarkTemplates.queries.ts | 273 --- .../next/roadQuotes/roadQuotes.acl.ts | 30 - .../next/roadQuotes/roadQuotes.api.ts | 21 - .../next/roadQuotes/roadQuotes.models.ts | 29 - .../next/roadQuotes/roadQuotes.queries.ts | 70 - .../next/seaPositions/seaPositions.acl.ts | 30 - .../next/seaPositions/seaPositions.api.ts | 21 - .../next/seaPositions/seaPositions.models.ts | 49 - .../next/seaPositions/seaPositions.queries.ts | 70 - .../generated/next/seaQuotes/seaQuotes.acl.ts | 30 - .../generated/next/seaQuotes/seaQuotes.api.ts | 21 - .../next/seaQuotes/seaQuotes.models.ts | 33 - .../next/seaQuotes/seaQuotes.queries.ts | 70 - .../shippingInstructions.acl.ts | 82 - .../shippingInstructions.api.ts | 58 - .../shippingInstructions.models.ts | 510 ----- .../shippingInstructions.queries.ts | 211 -- .../generated/next/terminals/terminals.acl.ts | 74 - .../generated/next/terminals/terminals.api.ts | 74 - .../next/terminals/terminals.configs.ts | 146 -- .../next/terminals/terminals.models.ts | 196 -- .../next/terminals/terminals.queries.ts | 260 --- .../next/useCrossTabQueryInvalidation.ts | 40 - test/generated/next/useMutationEffects.ts | 95 - .../next/userActivity/userActivity.api.ts | 18 - .../next/userActivity/userActivity.models.ts | 64 - .../next/userActivity/userActivity.queries.ts | 35 - test/generated/next/vatRules/vatRules.acl.ts | 74 - test/generated/next/vatRules/vatRules.api.ts | 74 - .../next/vatRules/vatRules.configs.ts | 151 -- .../next/vatRules/vatRules.models.ts | 146 -- .../next/vatRules/vatRules.queries.ts | 264 --- .../next/warehouses/warehouses.acl.ts | 74 - .../next/warehouses/warehouses.api.ts | 74 - .../next/warehouses/warehouses.configs.ts | 141 -- .../next/warehouses/warehouses.models.ts | 152 -- .../next/warehouses/warehouses.queries.ts | 260 --- .../workingDocuments/workingDocuments.acl.ts | 30 - .../workingDocuments/workingDocuments.api.ts | 29 - .../workingDocuments.configs.ts | 55 - .../workingDocuments.models.ts | 70 - .../workingDocuments.queries.ts | 101 - .../workingDocumentsAmsInstructions.acl.ts | 82 - .../workingDocumentsAmsInstructions.api.ts | 58 - .../workingDocumentsAmsInstructions.models.ts | 142 -- ...workingDocumentsAmsInstructions.queries.ts | 211 -- .../workingDocumentsBlInstructions.acl.ts | 95 - .../workingDocumentsBlInstructions.api.ts | 72 - .../workingDocumentsBlInstructions.models.ts | 260 --- .../workingDocumentsBlInstructions.queries.ts | 242 --- .../workingDocumentsCmrForm.acl.ts | 82 - .../workingDocumentsCmrForm.api.ts | 58 - .../workingDocumentsCmrForm.models.ts | 187 -- .../workingDocumentsCmrForm.queries.ts | 211 -- .../workingDocumentsExportDeclaration.acl.ts | 82 - .../workingDocumentsExportDeclaration.api.ts | 58 - ...orkingDocumentsExportDeclaration.models.ts | 94 - ...rkingDocumentsExportDeclaration.queries.ts | 211 -- .../workingDocumentsFcrForm.acl.ts | 82 - .../workingDocumentsFcrForm.api.ts | 58 - .../workingDocumentsFcrForm.models.ts | 86 - .../workingDocumentsFcrForm.queries.ts | 211 -- .../workingDocumentsHouseAwb.acl.ts | 82 - .../workingDocumentsHouseAwb.api.ts | 58 - .../workingDocumentsHouseAwb.models.ts | 174 -- .../workingDocumentsHouseAwb.queries.ts | 211 -- .../workingDocumentsHouseBl.acl.ts | 108 - .../workingDocumentsHouseBl.api.ts | 85 - .../workingDocumentsHouseBl.models.ts | 196 -- .../workingDocumentsHouseBl.queries.ts | 296 --- .../workingDocumentsIsfForm.acl.ts | 82 - .../workingDocumentsIsfForm.api.ts | 58 - .../workingDocumentsIsfForm.models.ts | 154 -- .../workingDocumentsIsfForm.queries.ts | 211 -- .../workingDocumentsMasterAwb.acl.ts | 82 - .../workingDocumentsMasterAwb.api.ts | 58 - .../workingDocumentsMasterAwb.models.ts | 176 -- .../workingDocumentsMasterAwb.queries.ts | 211 -- .../workingDocumentsTemplatedDocument.acl.ts | 95 - .../workingDocumentsTemplatedDocument.api.ts | 74 - ...orkingDocumentsTemplatedDocument.models.ts | 61 - ...rkingDocumentsTemplatedDocument.queries.ts | 216 -- test/generated/next/zod.extended.ts | 47 - .../tmp-models-common-v2/acl/app.ability.ts | 5 - .../tmp-models-common-v2/acl/useAclCheck.ts | 21 - .../tmp-models-common-v2/app-rest-client.ts | 7 - .../common/common.models.ts | 135 -- .../tmp-models-common-v2/pet/pet.api.ts | 92 - .../tmp-models-common-v2/pet/pet.models.ts | 23 - .../tmp-models-common-v2/pet/pet.queries.ts | 214 -- .../tmp-models-common-v2/queryModules.ts | 5 - .../tmp-models-common-v2/store/store.api.ts | 36 - .../store/store.models.ts | 11 - .../store/store.queries.ts | 109 - .../useCrossTabQueryInvalidation.ts | 40 - .../useMutationEffects.ts | 95 - .../tmp-models-common-v2/user/user.api.ts | 67 - .../tmp-models-common-v2/user/user.models.ts | 8 - .../tmp-models-common-v2/user/user.queries.ts | 185 -- .../tmp-models-common-v2/zod.extended.ts | 47 - .../.openapi-codegen-cache.json | 1 - .../tmp-models-common/acl/app.ability.ts | 5 - .../tmp-models-common/acl/useAclCheck.ts | 21 - .../tmp-models-common/app-rest-client.ts | 7 - .../tmp-models-common/common/common.models.ts | 135 -- .../tmp-models-common/pet/pet.api.ts | 92 - .../tmp-models-common/pet/pet.models.ts | 23 - .../tmp-models-common/pet/pet.queries.ts | 214 -- .../tmp-models-common/queryModules.ts | 5 - .../tmp-models-common/store/store.api.ts | 36 - .../tmp-models-common/store/store.models.ts | 11 - .../tmp-models-common/store/store.queries.ts | 109 - .../useCrossTabQueryInvalidation.ts | 40 - .../tmp-models-common/useMutationEffects.ts | 95 - .../tmp-models-common/user/user.api.ts | 67 - .../tmp-models-common/user/user.models.ts | 8 - .../tmp-models-common/user/user.queries.ts | 185 -- .../tmp-models-common/zod.extended.ts | 47 - .../tmp-onerror/.openapi-codegen-cache.json | 1 - test/generated/tmp-onerror/acl/app.ability.ts | 5 - test/generated/tmp-onerror/acl/useAclCheck.ts | 21 - test/generated/tmp-onerror/app-rest-client.ts | 7 - test/generated/tmp-onerror/pet/pet.api.ts | 92 - test/generated/tmp-onerror/pet/pet.models.ts | 83 - test/generated/tmp-onerror/pet/pet.queries.ts | 214 -- test/generated/tmp-onerror/queryModules.ts | 5 - test/generated/tmp-onerror/store/store.api.ts | 36 - .../tmp-onerror/store/store.models.ts | 34 - .../tmp-onerror/store/store.queries.ts | 109 - .../useCrossTabQueryInvalidation.ts | 40 - .../tmp-onerror/useMutationEffects.ts | 95 - test/generated/tmp-onerror/user/user.api.ts | 67 - .../generated/tmp-onerror/user/user.models.ts | 26 - .../tmp-onerror/user/user.queries.ts | 185 -- test/generated/tmp-onerror/zod.extended.ts | 47 - 1722 files changed, 1 insertion(+), 228358 deletions(-) delete mode 100644 test/generated/.gitkeep delete mode 100644 test/generated/base/aWBStocks/aWBStocks.acl.ts delete mode 100644 test/generated/base/aWBStocks/aWBStocks.api.ts delete mode 100644 test/generated/base/aWBStocks/aWBStocks.configs.ts delete mode 100644 test/generated/base/aWBStocks/aWBStocks.models.ts delete mode 100644 test/generated/base/aWBStocks/aWBStocks.queries.ts delete mode 100644 test/generated/base/acl/app.ability.ts delete mode 100644 test/generated/base/acl/useAclCheck.ts delete mode 100644 test/generated/base/airPositions/airPositions.acl.ts delete mode 100644 test/generated/base/airPositions/airPositions.api.ts delete mode 100644 test/generated/base/airPositions/airPositions.models.ts delete mode 100644 test/generated/base/airPositions/airPositions.queries.ts delete mode 100644 test/generated/base/airports/airports.acl.ts delete mode 100644 test/generated/base/airports/airports.api.ts delete mode 100644 test/generated/base/airports/airports.configs.ts delete mode 100644 test/generated/base/airports/airports.models.ts delete mode 100644 test/generated/base/airports/airports.queries.ts delete mode 100644 test/generated/base/app-rest-client.ts delete mode 100644 test/generated/base/bankAccounts/bankAccounts.acl.ts delete mode 100644 test/generated/base/bankAccounts/bankAccounts.api.ts delete mode 100644 test/generated/base/bankAccounts/bankAccounts.configs.ts delete mode 100644 test/generated/base/bankAccounts/bankAccounts.models.ts delete mode 100644 test/generated/base/bankAccounts/bankAccounts.queries.ts delete mode 100644 test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts delete mode 100644 test/generated/base/bookkeepingExport/bookkeepingExport.api.ts delete mode 100644 test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts delete mode 100644 test/generated/base/bookkeepingExport/bookkeepingExport.models.ts delete mode 100644 test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts delete mode 100644 test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts delete mode 100644 test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts delete mode 100644 test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts delete mode 100644 test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts delete mode 100644 test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts delete mode 100644 test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts delete mode 100644 test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts delete mode 100644 test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts delete mode 100644 test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts delete mode 100644 test/generated/base/businessPartners/businessPartners.acl.ts delete mode 100644 test/generated/base/businessPartners/businessPartners.api.ts delete mode 100644 test/generated/base/businessPartners/businessPartners.configs.ts delete mode 100644 test/generated/base/businessPartners/businessPartners.models.ts delete mode 100644 test/generated/base/businessPartners/businessPartners.queries.ts delete mode 100644 test/generated/base/cargoTypes/cargoTypes.acl.ts delete mode 100644 test/generated/base/cargoTypes/cargoTypes.api.ts delete mode 100644 test/generated/base/cargoTypes/cargoTypes.configs.ts delete mode 100644 test/generated/base/cargoTypes/cargoTypes.models.ts delete mode 100644 test/generated/base/cargoTypes/cargoTypes.queries.ts delete mode 100644 test/generated/base/chargeTypes/chargeTypes.acl.ts delete mode 100644 test/generated/base/chargeTypes/chargeTypes.api.ts delete mode 100644 test/generated/base/chargeTypes/chargeTypes.configs.ts delete mode 100644 test/generated/base/chargeTypes/chargeTypes.models.ts delete mode 100644 test/generated/base/chargeTypes/chargeTypes.queries.ts delete mode 100644 test/generated/base/checklistItems/checklistItems.acl.ts delete mode 100644 test/generated/base/checklistItems/checklistItems.api.ts delete mode 100644 test/generated/base/checklistItems/checklistItems.configs.ts delete mode 100644 test/generated/base/checklistItems/checklistItems.models.ts delete mode 100644 test/generated/base/checklistItems/checklistItems.queries.ts delete mode 100644 test/generated/base/checklistTemplates/checklistTemplates.acl.ts delete mode 100644 test/generated/base/checklistTemplates/checklistTemplates.api.ts delete mode 100644 test/generated/base/checklistTemplates/checklistTemplates.configs.ts delete mode 100644 test/generated/base/checklistTemplates/checklistTemplates.models.ts delete mode 100644 test/generated/base/checklistTemplates/checklistTemplates.queries.ts delete mode 100644 test/generated/base/cities/cities.acl.ts delete mode 100644 test/generated/base/cities/cities.api.ts delete mode 100644 test/generated/base/cities/cities.configs.ts delete mode 100644 test/generated/base/cities/cities.models.ts delete mode 100644 test/generated/base/cities/cities.queries.ts delete mode 100644 test/generated/base/common/common.models.ts delete mode 100644 test/generated/base/containerYards/containerYards.acl.ts delete mode 100644 test/generated/base/containerYards/containerYards.api.ts delete mode 100644 test/generated/base/containerYards/containerYards.configs.ts delete mode 100644 test/generated/base/containerYards/containerYards.models.ts delete mode 100644 test/generated/base/containerYards/containerYards.queries.ts delete mode 100644 test/generated/base/controlTowerAuth/controlTowerAuth.api.ts delete mode 100644 test/generated/base/controlTowerAuth/controlTowerAuth.models.ts delete mode 100644 test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts delete mode 100644 test/generated/base/controlTowerBookings/controlTowerBookings.api.ts delete mode 100644 test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts delete mode 100644 test/generated/base/controlTowerBookings/controlTowerBookings.models.ts delete mode 100644 test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts delete mode 100644 test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts delete mode 100644 test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts delete mode 100644 test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts delete mode 100644 test/generated/base/controlTowerContainers/controlTowerContainers.api.ts delete mode 100644 test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts delete mode 100644 test/generated/base/controlTowerContainers/controlTowerContainers.models.ts delete mode 100644 test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts delete mode 100644 test/generated/base/controlTowerMe/controlTowerMe.api.ts delete mode 100644 test/generated/base/controlTowerMe/controlTowerMe.models.ts delete mode 100644 test/generated/base/controlTowerMe/controlTowerMe.queries.ts delete mode 100644 test/generated/base/controlTowerPackages/controlTowerPackages.api.ts delete mode 100644 test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts delete mode 100644 test/generated/base/controlTowerPackages/controlTowerPackages.models.ts delete mode 100644 test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts delete mode 100644 test/generated/base/controlTowerSearch/controlTowerSearch.api.ts delete mode 100644 test/generated/base/controlTowerSearch/controlTowerSearch.models.ts delete mode 100644 test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts delete mode 100644 test/generated/base/countries/countries.acl.ts delete mode 100644 test/generated/base/countries/countries.api.ts delete mode 100644 test/generated/base/countries/countries.configs.ts delete mode 100644 test/generated/base/countries/countries.models.ts delete mode 100644 test/generated/base/countries/countries.queries.ts delete mode 100644 test/generated/base/currencies/currencies.acl.ts delete mode 100644 test/generated/base/currencies/currencies.api.ts delete mode 100644 test/generated/base/currencies/currencies.configs.ts delete mode 100644 test/generated/base/currencies/currencies.models.ts delete mode 100644 test/generated/base/currencies/currencies.queries.ts delete mode 100644 test/generated/base/customerAccount/customerAccount.api.ts delete mode 100644 test/generated/base/customerAccount/customerAccount.models.ts delete mode 100644 test/generated/base/customerAccount/customerAccount.queries.ts delete mode 100644 test/generated/base/customers/customers.acl.ts delete mode 100644 test/generated/base/customers/customers.api.ts delete mode 100644 test/generated/base/customers/customers.configs.ts delete mode 100644 test/generated/base/customers/customers.models.ts delete mode 100644 test/generated/base/customers/customers.queries.ts delete mode 100644 test/generated/base/depots/depots.acl.ts delete mode 100644 test/generated/base/depots/depots.api.ts delete mode 100644 test/generated/base/depots/depots.configs.ts delete mode 100644 test/generated/base/depots/depots.models.ts delete mode 100644 test/generated/base/depots/depots.queries.ts delete mode 100644 test/generated/base/documentTemplates/documentTemplates.acl.ts delete mode 100644 test/generated/base/documentTemplates/documentTemplates.api.ts delete mode 100644 test/generated/base/documentTemplates/documentTemplates.configs.ts delete mode 100644 test/generated/base/documentTemplates/documentTemplates.models.ts delete mode 100644 test/generated/base/documentTemplates/documentTemplates.queries.ts delete mode 100644 test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts delete mode 100644 test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts delete mode 100644 test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts delete mode 100644 test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts delete mode 100644 test/generated/base/dunningLevels/dunningLevels.acl.ts delete mode 100644 test/generated/base/dunningLevels/dunningLevels.api.ts delete mode 100644 test/generated/base/dunningLevels/dunningLevels.configs.ts delete mode 100644 test/generated/base/dunningLevels/dunningLevels.models.ts delete mode 100644 test/generated/base/dunningLevels/dunningLevels.queries.ts delete mode 100644 test/generated/base/dunningManagement/dunningManagement.acl.ts delete mode 100644 test/generated/base/dunningManagement/dunningManagement.api.ts delete mode 100644 test/generated/base/dunningManagement/dunningManagement.configs.ts delete mode 100644 test/generated/base/dunningManagement/dunningManagement.models.ts delete mode 100644 test/generated/base/dunningManagement/dunningManagement.queries.ts delete mode 100644 test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts delete mode 100644 test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts delete mode 100644 test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts delete mode 100644 test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts delete mode 100644 test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts delete mode 100644 test/generated/base/dunningSystems/dunningSystems.acl.ts delete mode 100644 test/generated/base/dunningSystems/dunningSystems.api.ts delete mode 100644 test/generated/base/dunningSystems/dunningSystems.configs.ts delete mode 100644 test/generated/base/dunningSystems/dunningSystems.models.ts delete mode 100644 test/generated/base/dunningSystems/dunningSystems.queries.ts delete mode 100644 test/generated/base/employee/employee.acl.ts delete mode 100644 test/generated/base/employee/employee.api.ts delete mode 100644 test/generated/base/employee/employee.configs.ts delete mode 100644 test/generated/base/employee/employee.models.ts delete mode 100644 test/generated/base/employee/employee.queries.ts delete mode 100644 test/generated/base/employeeAccount/employeeAccount.api.ts delete mode 100644 test/generated/base/employeeAccount/employeeAccount.models.ts delete mode 100644 test/generated/base/employeeAccount/employeeAccount.queries.ts delete mode 100644 test/generated/base/employeePermissions/employeePermissions.acl.ts delete mode 100644 test/generated/base/employeePermissions/employeePermissions.api.ts delete mode 100644 test/generated/base/employeePermissions/employeePermissions.configs.ts delete mode 100644 test/generated/base/employeePermissions/employeePermissions.models.ts delete mode 100644 test/generated/base/employeePermissions/employeePermissions.queries.ts delete mode 100644 test/generated/base/employeeProfile/employeeProfile.api.ts delete mode 100644 test/generated/base/employeeProfile/employeeProfile.models.ts delete mode 100644 test/generated/base/employeeProfile/employeeProfile.queries.ts delete mode 100644 test/generated/base/employeeRoles/employeeRoles.acl.ts delete mode 100644 test/generated/base/employeeRoles/employeeRoles.api.ts delete mode 100644 test/generated/base/employeeRoles/employeeRoles.configs.ts delete mode 100644 test/generated/base/employeeRoles/employeeRoles.models.ts delete mode 100644 test/generated/base/employeeRoles/employeeRoles.queries.ts delete mode 100644 test/generated/base/employeeSettings/employeeSettings.api.ts delete mode 100644 test/generated/base/employeeSettings/employeeSettings.models.ts delete mode 100644 test/generated/base/employeeSettings/employeeSettings.queries.ts delete mode 100644 test/generated/base/employment/employment.acl.ts delete mode 100644 test/generated/base/employment/employment.api.ts delete mode 100644 test/generated/base/employment/employment.configs.ts delete mode 100644 test/generated/base/employment/employment.models.ts delete mode 100644 test/generated/base/employment/employment.queries.ts delete mode 100644 test/generated/base/factoringExport/factoringExport.acl.ts delete mode 100644 test/generated/base/factoringExport/factoringExport.api.ts delete mode 100644 test/generated/base/factoringExport/factoringExport.models.ts delete mode 100644 test/generated/base/factoringExport/factoringExport.queries.ts delete mode 100644 test/generated/base/factoringMerge/factoringMerge.acl.ts delete mode 100644 test/generated/base/factoringMerge/factoringMerge.api.ts delete mode 100644 test/generated/base/factoringMerge/factoringMerge.models.ts delete mode 100644 test/generated/base/factoringMerge/factoringMerge.queries.ts delete mode 100644 test/generated/base/files/files.api.ts delete mode 100644 test/generated/base/files/files.models.ts delete mode 100644 test/generated/base/files/files.queries.ts delete mode 100644 test/generated/base/folders/folders.api.ts delete mode 100644 test/generated/base/folders/folders.models.ts delete mode 100644 test/generated/base/folders/folders.queries.ts delete mode 100644 test/generated/base/hsCodes/hsCodes.acl.ts delete mode 100644 test/generated/base/hsCodes/hsCodes.api.ts delete mode 100644 test/generated/base/hsCodes/hsCodes.configs.ts delete mode 100644 test/generated/base/hsCodes/hsCodes.models.ts delete mode 100644 test/generated/base/hsCodes/hsCodes.queries.ts delete mode 100644 test/generated/base/integrationChannels/integrationChannels.acl.ts delete mode 100644 test/generated/base/integrationChannels/integrationChannels.api.ts delete mode 100644 test/generated/base/integrationChannels/integrationChannels.configs.ts delete mode 100644 test/generated/base/integrationChannels/integrationChannels.models.ts delete mode 100644 test/generated/base/integrationChannels/integrationChannels.queries.ts delete mode 100644 test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts delete mode 100644 test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts delete mode 100644 test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts delete mode 100644 test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts delete mode 100644 test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts delete mode 100644 test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts delete mode 100644 test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts delete mode 100644 test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts delete mode 100644 test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts delete mode 100644 test/generated/base/invoicePayments/invoicePayments.acl.ts delete mode 100644 test/generated/base/invoicePayments/invoicePayments.api.ts delete mode 100644 test/generated/base/invoicePayments/invoicePayments.configs.ts delete mode 100644 test/generated/base/invoicePayments/invoicePayments.models.ts delete mode 100644 test/generated/base/invoicePayments/invoicePayments.queries.ts delete mode 100644 test/generated/base/invoices/invoices.acl.ts delete mode 100644 test/generated/base/invoices/invoices.api.ts delete mode 100644 test/generated/base/invoices/invoices.configs.ts delete mode 100644 test/generated/base/invoices/invoices.models.ts delete mode 100644 test/generated/base/invoices/invoices.queries.ts delete mode 100644 test/generated/base/masterData/masterData.acl.ts delete mode 100644 test/generated/base/masterData/masterData.api.ts delete mode 100644 test/generated/base/masterData/masterData.configs.ts delete mode 100644 test/generated/base/masterData/masterData.models.ts delete mode 100644 test/generated/base/masterData/masterData.queries.ts delete mode 100644 test/generated/base/masterDataImport/masterDataImport.acl.ts delete mode 100644 test/generated/base/masterDataImport/masterDataImport.api.ts delete mode 100644 test/generated/base/masterDataImport/masterDataImport.models.ts delete mode 100644 test/generated/base/masterDataImport/masterDataImport.queries.ts delete mode 100644 test/generated/base/offices/offices.acl.ts delete mode 100644 test/generated/base/offices/offices.api.ts delete mode 100644 test/generated/base/offices/offices.configs.ts delete mode 100644 test/generated/base/offices/offices.models.ts delete mode 100644 test/generated/base/offices/offices.queries.ts delete mode 100644 test/generated/base/packageTypes/packageTypes.acl.ts delete mode 100644 test/generated/base/packageTypes/packageTypes.api.ts delete mode 100644 test/generated/base/packageTypes/packageTypes.configs.ts delete mode 100644 test/generated/base/packageTypes/packageTypes.models.ts delete mode 100644 test/generated/base/packageTypes/packageTypes.queries.ts delete mode 100644 test/generated/base/partnerNetworks/partnerNetworks.acl.ts delete mode 100644 test/generated/base/partnerNetworks/partnerNetworks.api.ts delete mode 100644 test/generated/base/partnerNetworks/partnerNetworks.configs.ts delete mode 100644 test/generated/base/partnerNetworks/partnerNetworks.models.ts delete mode 100644 test/generated/base/partnerNetworks/partnerNetworks.queries.ts delete mode 100644 test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts delete mode 100644 test/generated/base/paymentConfirmations/paymentConfirmations.api.ts delete mode 100644 test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts delete mode 100644 test/generated/base/paymentConfirmations/paymentConfirmations.models.ts delete mode 100644 test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts delete mode 100644 test/generated/base/ports/ports.acl.ts delete mode 100644 test/generated/base/ports/ports.api.ts delete mode 100644 test/generated/base/ports/ports.configs.ts delete mode 100644 test/generated/base/ports/ports.models.ts delete mode 100644 test/generated/base/ports/ports.queries.ts delete mode 100644 test/generated/base/positionAccount/positionAccount.acl.ts delete mode 100644 test/generated/base/positionAccount/positionAccount.api.ts delete mode 100644 test/generated/base/positionAccount/positionAccount.models.ts delete mode 100644 test/generated/base/positionAccount/positionAccount.queries.ts delete mode 100644 test/generated/base/positionAccountItems/positionAccountItems.acl.ts delete mode 100644 test/generated/base/positionAccountItems/positionAccountItems.api.ts delete mode 100644 test/generated/base/positionAccountItems/positionAccountItems.models.ts delete mode 100644 test/generated/base/positionAccountItems/positionAccountItems.queries.ts delete mode 100644 test/generated/base/positionCargo/positionCargo.acl.ts delete mode 100644 test/generated/base/positionCargo/positionCargo.api.ts delete mode 100644 test/generated/base/positionCargo/positionCargo.configs.ts delete mode 100644 test/generated/base/positionCargo/positionCargo.models.ts delete mode 100644 test/generated/base/positionCargo/positionCargo.queries.ts delete mode 100644 test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts delete mode 100644 test/generated/base/positionCargoPackage/positionCargoPackage.api.ts delete mode 100644 test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts delete mode 100644 test/generated/base/positionChecklist/positionChecklist.acl.ts delete mode 100644 test/generated/base/positionChecklist/positionChecklist.api.ts delete mode 100644 test/generated/base/positionChecklist/positionChecklist.models.ts delete mode 100644 test/generated/base/positionChecklist/positionChecklist.queries.ts delete mode 100644 test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts delete mode 100644 test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts delete mode 100644 test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts delete mode 100644 test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts delete mode 100644 test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts delete mode 100644 test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts delete mode 100644 test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts delete mode 100644 test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts delete mode 100644 test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts delete mode 100644 test/generated/base/positionRoutes/positionRoutes.acl.ts delete mode 100644 test/generated/base/positionRoutes/positionRoutes.api.ts delete mode 100644 test/generated/base/positionRoutes/positionRoutes.queries.ts delete mode 100644 test/generated/base/positions/positions.acl.ts delete mode 100644 test/generated/base/positions/positions.api.ts delete mode 100644 test/generated/base/positions/positions.configs.ts delete mode 100644 test/generated/base/positions/positions.models.ts delete mode 100644 test/generated/base/positions/positions.queries.ts delete mode 100644 test/generated/base/projectLite/projectLite.acl.ts delete mode 100644 test/generated/base/projectLite/projectLite.api.ts delete mode 100644 test/generated/base/projectLite/projectLite.configs.ts delete mode 100644 test/generated/base/projectLite/projectLite.models.ts delete mode 100644 test/generated/base/projectLite/projectLite.queries.ts delete mode 100644 test/generated/base/queryModules.ts delete mode 100644 test/generated/base/quoteAccount/quoteAccount.acl.ts delete mode 100644 test/generated/base/quoteAccount/quoteAccount.api.ts delete mode 100644 test/generated/base/quoteAccount/quoteAccount.models.ts delete mode 100644 test/generated/base/quoteAccount/quoteAccount.queries.ts delete mode 100644 test/generated/base/quoteCargo/quoteCargo.acl.ts delete mode 100644 test/generated/base/quoteCargo/quoteCargo.api.ts delete mode 100644 test/generated/base/quoteCargo/quoteCargo.configs.ts delete mode 100644 test/generated/base/quoteCargo/quoteCargo.models.ts delete mode 100644 test/generated/base/quoteCargo/quoteCargo.queries.ts delete mode 100644 test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts delete mode 100644 test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts delete mode 100644 test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts delete mode 100644 test/generated/base/quoteConversion/quoteConversion.acl.ts delete mode 100644 test/generated/base/quoteConversion/quoteConversion.api.ts delete mode 100644 test/generated/base/quoteConversion/quoteConversion.models.ts delete mode 100644 test/generated/base/quoteConversion/quoteConversion.queries.ts delete mode 100644 test/generated/base/quoteDocument/quoteDocument.acl.ts delete mode 100644 test/generated/base/quoteDocument/quoteDocument.api.ts delete mode 100644 test/generated/base/quoteDocument/quoteDocument.models.ts delete mode 100644 test/generated/base/quoteDocument/quoteDocument.queries.ts delete mode 100644 test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts delete mode 100644 test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts delete mode 100644 test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts delete mode 100644 test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts delete mode 100644 test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts delete mode 100644 test/generated/base/quoteRoutes/quoteRoutes.acl.ts delete mode 100644 test/generated/base/quoteRoutes/quoteRoutes.api.ts delete mode 100644 test/generated/base/quoteRoutes/quoteRoutes.queries.ts delete mode 100644 test/generated/base/quotes/quotes.acl.ts delete mode 100644 test/generated/base/quotes/quotes.api.ts delete mode 100644 test/generated/base/quotes/quotes.configs.ts delete mode 100644 test/generated/base/quotes/quotes.models.ts delete mode 100644 test/generated/base/quotes/quotes.queries.ts delete mode 100644 test/generated/base/remarkTemplates/remarkTemplates.acl.ts delete mode 100644 test/generated/base/remarkTemplates/remarkTemplates.api.ts delete mode 100644 test/generated/base/remarkTemplates/remarkTemplates.configs.ts delete mode 100644 test/generated/base/remarkTemplates/remarkTemplates.models.ts delete mode 100644 test/generated/base/remarkTemplates/remarkTemplates.queries.ts delete mode 100644 test/generated/base/roadQuotes/roadQuotes.acl.ts delete mode 100644 test/generated/base/roadQuotes/roadQuotes.api.ts delete mode 100644 test/generated/base/roadQuotes/roadQuotes.models.ts delete mode 100644 test/generated/base/roadQuotes/roadQuotes.queries.ts delete mode 100644 test/generated/base/seaPositions/seaPositions.acl.ts delete mode 100644 test/generated/base/seaPositions/seaPositions.api.ts delete mode 100644 test/generated/base/seaPositions/seaPositions.models.ts delete mode 100644 test/generated/base/seaPositions/seaPositions.queries.ts delete mode 100644 test/generated/base/seaQuotes/seaQuotes.acl.ts delete mode 100644 test/generated/base/seaQuotes/seaQuotes.api.ts delete mode 100644 test/generated/base/seaQuotes/seaQuotes.models.ts delete mode 100644 test/generated/base/seaQuotes/seaQuotes.queries.ts delete mode 100644 test/generated/base/shippingInstructions/shippingInstructions.acl.ts delete mode 100644 test/generated/base/shippingInstructions/shippingInstructions.api.ts delete mode 100644 test/generated/base/shippingInstructions/shippingInstructions.models.ts delete mode 100644 test/generated/base/shippingInstructions/shippingInstructions.queries.ts delete mode 100644 test/generated/base/terminals/terminals.acl.ts delete mode 100644 test/generated/base/terminals/terminals.api.ts delete mode 100644 test/generated/base/terminals/terminals.configs.ts delete mode 100644 test/generated/base/terminals/terminals.models.ts delete mode 100644 test/generated/base/terminals/terminals.queries.ts delete mode 100644 test/generated/base/useCrossTabQueryInvalidation.ts delete mode 100644 test/generated/base/useMutationEffects.ts delete mode 100644 test/generated/base/userActivity/userActivity.api.ts delete mode 100644 test/generated/base/userActivity/userActivity.models.ts delete mode 100644 test/generated/base/userActivity/userActivity.queries.ts delete mode 100644 test/generated/base/vatRules/vatRules.acl.ts delete mode 100644 test/generated/base/vatRules/vatRules.api.ts delete mode 100644 test/generated/base/vatRules/vatRules.configs.ts delete mode 100644 test/generated/base/vatRules/vatRules.models.ts delete mode 100644 test/generated/base/vatRules/vatRules.queries.ts delete mode 100644 test/generated/base/warehouses/warehouses.acl.ts delete mode 100644 test/generated/base/warehouses/warehouses.api.ts delete mode 100644 test/generated/base/warehouses/warehouses.configs.ts delete mode 100644 test/generated/base/warehouses/warehouses.models.ts delete mode 100644 test/generated/base/warehouses/warehouses.queries.ts delete mode 100644 test/generated/base/workingDocuments/workingDocuments.acl.ts delete mode 100644 test/generated/base/workingDocuments/workingDocuments.api.ts delete mode 100644 test/generated/base/workingDocuments/workingDocuments.configs.ts delete mode 100644 test/generated/base/workingDocuments/workingDocuments.models.ts delete mode 100644 test/generated/base/workingDocuments/workingDocuments.queries.ts delete mode 100644 test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts delete mode 100644 test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts delete mode 100644 test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts delete mode 100644 test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts delete mode 100644 test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts delete mode 100644 test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts delete mode 100644 test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts delete mode 100644 test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts delete mode 100644 test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts delete mode 100644 test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts delete mode 100644 test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts delete mode 100644 test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts delete mode 100644 test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts delete mode 100644 test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts delete mode 100644 test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts delete mode 100644 test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts delete mode 100644 test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts delete mode 100644 test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts delete mode 100644 test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts delete mode 100644 test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts delete mode 100644 test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts delete mode 100644 test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts delete mode 100644 test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts delete mode 100644 test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts delete mode 100644 test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts delete mode 100644 test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts delete mode 100644 test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts delete mode 100644 test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts delete mode 100644 test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts delete mode 100644 test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts delete mode 100644 test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts delete mode 100644 test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts delete mode 100644 test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts delete mode 100644 test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts delete mode 100644 test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts delete mode 100644 test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts delete mode 100644 test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts delete mode 100644 test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts delete mode 100644 test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts delete mode 100644 test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts delete mode 100644 test/generated/base/zod.extended.ts delete mode 100644 test/generated/dist/aWBStocks/aWBStocks.acl.ts delete mode 100644 test/generated/dist/aWBStocks/aWBStocks.api.ts delete mode 100644 test/generated/dist/aWBStocks/aWBStocks.configs.ts delete mode 100644 test/generated/dist/aWBStocks/aWBStocks.models.ts delete mode 100644 test/generated/dist/aWBStocks/aWBStocks.queries.ts delete mode 100644 test/generated/dist/acl/app.ability.ts delete mode 100644 test/generated/dist/acl/useAclCheck.ts delete mode 100644 test/generated/dist/airPositions/airPositions.acl.ts delete mode 100644 test/generated/dist/airPositions/airPositions.api.ts delete mode 100644 test/generated/dist/airPositions/airPositions.models.ts delete mode 100644 test/generated/dist/airPositions/airPositions.queries.ts delete mode 100644 test/generated/dist/airports/airports.acl.ts delete mode 100644 test/generated/dist/airports/airports.api.ts delete mode 100644 test/generated/dist/airports/airports.configs.ts delete mode 100644 test/generated/dist/airports/airports.models.ts delete mode 100644 test/generated/dist/airports/airports.queries.ts delete mode 100644 test/generated/dist/app-rest-client.ts delete mode 100644 test/generated/dist/bankAccounts/bankAccounts.acl.ts delete mode 100644 test/generated/dist/bankAccounts/bankAccounts.api.ts delete mode 100644 test/generated/dist/bankAccounts/bankAccounts.configs.ts delete mode 100644 test/generated/dist/bankAccounts/bankAccounts.models.ts delete mode 100644 test/generated/dist/bankAccounts/bankAccounts.queries.ts delete mode 100644 test/generated/dist/bookkeepingExport/bookkeepingExport.acl.ts delete mode 100644 test/generated/dist/bookkeepingExport/bookkeepingExport.api.ts delete mode 100644 test/generated/dist/bookkeepingExport/bookkeepingExport.configs.ts delete mode 100644 test/generated/dist/bookkeepingExport/bookkeepingExport.models.ts delete mode 100644 test/generated/dist/bookkeepingExport/bookkeepingExport.queries.ts delete mode 100644 test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts delete mode 100644 test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts delete mode 100644 test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts delete mode 100644 test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts delete mode 100644 test/generated/dist/businessPartnerContacts/businessPartnerContacts.acl.ts delete mode 100644 test/generated/dist/businessPartnerContacts/businessPartnerContacts.api.ts delete mode 100644 test/generated/dist/businessPartnerContacts/businessPartnerContacts.configs.ts delete mode 100644 test/generated/dist/businessPartnerContacts/businessPartnerContacts.models.ts delete mode 100644 test/generated/dist/businessPartnerContacts/businessPartnerContacts.queries.ts delete mode 100644 test/generated/dist/businessPartners/businessPartners.acl.ts delete mode 100644 test/generated/dist/businessPartners/businessPartners.api.ts delete mode 100644 test/generated/dist/businessPartners/businessPartners.configs.ts delete mode 100644 test/generated/dist/businessPartners/businessPartners.models.ts delete mode 100644 test/generated/dist/businessPartners/businessPartners.queries.ts delete mode 100644 test/generated/dist/cargoTypes/cargoTypes.acl.ts delete mode 100644 test/generated/dist/cargoTypes/cargoTypes.api.ts delete mode 100644 test/generated/dist/cargoTypes/cargoTypes.configs.ts delete mode 100644 test/generated/dist/cargoTypes/cargoTypes.models.ts delete mode 100644 test/generated/dist/cargoTypes/cargoTypes.queries.ts delete mode 100644 test/generated/dist/chargeTypes/chargeTypes.acl.ts delete mode 100644 test/generated/dist/chargeTypes/chargeTypes.api.ts delete mode 100644 test/generated/dist/chargeTypes/chargeTypes.configs.ts delete mode 100644 test/generated/dist/chargeTypes/chargeTypes.models.ts delete mode 100644 test/generated/dist/chargeTypes/chargeTypes.queries.ts delete mode 100644 test/generated/dist/checklistItems/checklistItems.acl.ts delete mode 100644 test/generated/dist/checklistItems/checklistItems.api.ts delete mode 100644 test/generated/dist/checklistItems/checklistItems.configs.ts delete mode 100644 test/generated/dist/checklistItems/checklistItems.models.ts delete mode 100644 test/generated/dist/checklistItems/checklistItems.queries.ts delete mode 100644 test/generated/dist/checklistTemplates/checklistTemplates.acl.ts delete mode 100644 test/generated/dist/checklistTemplates/checklistTemplates.api.ts delete mode 100644 test/generated/dist/checklistTemplates/checklistTemplates.configs.ts delete mode 100644 test/generated/dist/checklistTemplates/checklistTemplates.models.ts delete mode 100644 test/generated/dist/checklistTemplates/checklistTemplates.queries.ts delete mode 100644 test/generated/dist/cities/cities.acl.ts delete mode 100644 test/generated/dist/cities/cities.api.ts delete mode 100644 test/generated/dist/cities/cities.configs.ts delete mode 100644 test/generated/dist/cities/cities.models.ts delete mode 100644 test/generated/dist/cities/cities.queries.ts delete mode 100644 test/generated/dist/common/common.models.ts delete mode 100644 test/generated/dist/containerYards/containerYards.acl.ts delete mode 100644 test/generated/dist/containerYards/containerYards.api.ts delete mode 100644 test/generated/dist/containerYards/containerYards.configs.ts delete mode 100644 test/generated/dist/containerYards/containerYards.models.ts delete mode 100644 test/generated/dist/containerYards/containerYards.queries.ts delete mode 100644 test/generated/dist/controlTowerAuth/controlTowerAuth.api.ts delete mode 100644 test/generated/dist/controlTowerAuth/controlTowerAuth.models.ts delete mode 100644 test/generated/dist/controlTowerAuth/controlTowerAuth.queries.ts delete mode 100644 test/generated/dist/controlTowerBookings/controlTowerBookings.api.ts delete mode 100644 test/generated/dist/controlTowerBookings/controlTowerBookings.configs.ts delete mode 100644 test/generated/dist/controlTowerBookings/controlTowerBookings.models.ts delete mode 100644 test/generated/dist/controlTowerBookings/controlTowerBookings.queries.ts delete mode 100644 test/generated/dist/controlTowerCalendar/controlTowerCalendar.api.ts delete mode 100644 test/generated/dist/controlTowerCalendar/controlTowerCalendar.models.ts delete mode 100644 test/generated/dist/controlTowerCalendar/controlTowerCalendar.queries.ts delete mode 100644 test/generated/dist/controlTowerContainers/controlTowerContainers.api.ts delete mode 100644 test/generated/dist/controlTowerContainers/controlTowerContainers.configs.ts delete mode 100644 test/generated/dist/controlTowerContainers/controlTowerContainers.models.ts delete mode 100644 test/generated/dist/controlTowerContainers/controlTowerContainers.queries.ts delete mode 100644 test/generated/dist/controlTowerMe/controlTowerMe.api.ts delete mode 100644 test/generated/dist/controlTowerMe/controlTowerMe.models.ts delete mode 100644 test/generated/dist/controlTowerMe/controlTowerMe.queries.ts delete mode 100644 test/generated/dist/controlTowerPackages/controlTowerPackages.api.ts delete mode 100644 test/generated/dist/controlTowerPackages/controlTowerPackages.configs.ts delete mode 100644 test/generated/dist/controlTowerPackages/controlTowerPackages.models.ts delete mode 100644 test/generated/dist/controlTowerPackages/controlTowerPackages.queries.ts delete mode 100644 test/generated/dist/controlTowerSearch/controlTowerSearch.api.ts delete mode 100644 test/generated/dist/controlTowerSearch/controlTowerSearch.models.ts delete mode 100644 test/generated/dist/controlTowerSearch/controlTowerSearch.queries.ts delete mode 100644 test/generated/dist/countries/countries.acl.ts delete mode 100644 test/generated/dist/countries/countries.api.ts delete mode 100644 test/generated/dist/countries/countries.configs.ts delete mode 100644 test/generated/dist/countries/countries.models.ts delete mode 100644 test/generated/dist/countries/countries.queries.ts delete mode 100644 test/generated/dist/currencies/currencies.acl.ts delete mode 100644 test/generated/dist/currencies/currencies.api.ts delete mode 100644 test/generated/dist/currencies/currencies.configs.ts delete mode 100644 test/generated/dist/currencies/currencies.models.ts delete mode 100644 test/generated/dist/currencies/currencies.queries.ts delete mode 100644 test/generated/dist/customerAccount/customerAccount.api.ts delete mode 100644 test/generated/dist/customerAccount/customerAccount.models.ts delete mode 100644 test/generated/dist/customerAccount/customerAccount.queries.ts delete mode 100644 test/generated/dist/customers/customers.acl.ts delete mode 100644 test/generated/dist/customers/customers.api.ts delete mode 100644 test/generated/dist/customers/customers.configs.ts delete mode 100644 test/generated/dist/customers/customers.models.ts delete mode 100644 test/generated/dist/customers/customers.queries.ts delete mode 100644 test/generated/dist/depots/depots.acl.ts delete mode 100644 test/generated/dist/depots/depots.api.ts delete mode 100644 test/generated/dist/depots/depots.configs.ts delete mode 100644 test/generated/dist/depots/depots.models.ts delete mode 100644 test/generated/dist/depots/depots.queries.ts delete mode 100644 test/generated/dist/documentTemplates/documentTemplates.acl.ts delete mode 100644 test/generated/dist/documentTemplates/documentTemplates.api.ts delete mode 100644 test/generated/dist/documentTemplates/documentTemplates.configs.ts delete mode 100644 test/generated/dist/documentTemplates/documentTemplates.models.ts delete mode 100644 test/generated/dist/documentTemplates/documentTemplates.queries.ts delete mode 100644 test/generated/dist/dunningAccountStatement/dunningAccountStatement.acl.ts delete mode 100644 test/generated/dist/dunningAccountStatement/dunningAccountStatement.api.ts delete mode 100644 test/generated/dist/dunningAccountStatement/dunningAccountStatement.models.ts delete mode 100644 test/generated/dist/dunningAccountStatement/dunningAccountStatement.queries.ts delete mode 100644 test/generated/dist/dunningLevels/dunningLevels.acl.ts delete mode 100644 test/generated/dist/dunningLevels/dunningLevels.api.ts delete mode 100644 test/generated/dist/dunningLevels/dunningLevels.configs.ts delete mode 100644 test/generated/dist/dunningLevels/dunningLevels.models.ts delete mode 100644 test/generated/dist/dunningLevels/dunningLevels.queries.ts delete mode 100644 test/generated/dist/dunningManagement/dunningManagement.acl.ts delete mode 100644 test/generated/dist/dunningManagement/dunningManagement.api.ts delete mode 100644 test/generated/dist/dunningManagement/dunningManagement.configs.ts delete mode 100644 test/generated/dist/dunningManagement/dunningManagement.models.ts delete mode 100644 test/generated/dist/dunningManagement/dunningManagement.queries.ts delete mode 100644 test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts delete mode 100644 test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts delete mode 100644 test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts delete mode 100644 test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts delete mode 100644 test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts delete mode 100644 test/generated/dist/dunningSystems/dunningSystems.acl.ts delete mode 100644 test/generated/dist/dunningSystems/dunningSystems.api.ts delete mode 100644 test/generated/dist/dunningSystems/dunningSystems.configs.ts delete mode 100644 test/generated/dist/dunningSystems/dunningSystems.models.ts delete mode 100644 test/generated/dist/dunningSystems/dunningSystems.queries.ts delete mode 100644 test/generated/dist/employee/employee.acl.ts delete mode 100644 test/generated/dist/employee/employee.api.ts delete mode 100644 test/generated/dist/employee/employee.configs.ts delete mode 100644 test/generated/dist/employee/employee.models.ts delete mode 100644 test/generated/dist/employee/employee.queries.ts delete mode 100644 test/generated/dist/employeeAccount/employeeAccount.api.ts delete mode 100644 test/generated/dist/employeeAccount/employeeAccount.models.ts delete mode 100644 test/generated/dist/employeeAccount/employeeAccount.queries.ts delete mode 100644 test/generated/dist/employeePermissions/employeePermissions.acl.ts delete mode 100644 test/generated/dist/employeePermissions/employeePermissions.api.ts delete mode 100644 test/generated/dist/employeePermissions/employeePermissions.configs.ts delete mode 100644 test/generated/dist/employeePermissions/employeePermissions.models.ts delete mode 100644 test/generated/dist/employeePermissions/employeePermissions.queries.ts delete mode 100644 test/generated/dist/employeeProfile/employeeProfile.api.ts delete mode 100644 test/generated/dist/employeeProfile/employeeProfile.models.ts delete mode 100644 test/generated/dist/employeeProfile/employeeProfile.queries.ts delete mode 100644 test/generated/dist/employeeRoles/employeeRoles.acl.ts delete mode 100644 test/generated/dist/employeeRoles/employeeRoles.api.ts delete mode 100644 test/generated/dist/employeeRoles/employeeRoles.configs.ts delete mode 100644 test/generated/dist/employeeRoles/employeeRoles.models.ts delete mode 100644 test/generated/dist/employeeRoles/employeeRoles.queries.ts delete mode 100644 test/generated/dist/employeeSettings/employeeSettings.api.ts delete mode 100644 test/generated/dist/employeeSettings/employeeSettings.models.ts delete mode 100644 test/generated/dist/employeeSettings/employeeSettings.queries.ts delete mode 100644 test/generated/dist/employment/employment.acl.ts delete mode 100644 test/generated/dist/employment/employment.api.ts delete mode 100644 test/generated/dist/employment/employment.configs.ts delete mode 100644 test/generated/dist/employment/employment.models.ts delete mode 100644 test/generated/dist/employment/employment.queries.ts delete mode 100644 test/generated/dist/factoringExport/factoringExport.acl.ts delete mode 100644 test/generated/dist/factoringExport/factoringExport.api.ts delete mode 100644 test/generated/dist/factoringExport/factoringExport.models.ts delete mode 100644 test/generated/dist/factoringExport/factoringExport.queries.ts delete mode 100644 test/generated/dist/factoringMerge/factoringMerge.acl.ts delete mode 100644 test/generated/dist/factoringMerge/factoringMerge.api.ts delete mode 100644 test/generated/dist/factoringMerge/factoringMerge.models.ts delete mode 100644 test/generated/dist/factoringMerge/factoringMerge.queries.ts delete mode 100644 test/generated/dist/files/files.api.ts delete mode 100644 test/generated/dist/files/files.models.ts delete mode 100644 test/generated/dist/files/files.queries.ts delete mode 100644 test/generated/dist/folders/folders.api.ts delete mode 100644 test/generated/dist/folders/folders.models.ts delete mode 100644 test/generated/dist/folders/folders.queries.ts delete mode 100644 test/generated/dist/hsCodes/hsCodes.acl.ts delete mode 100644 test/generated/dist/hsCodes/hsCodes.api.ts delete mode 100644 test/generated/dist/hsCodes/hsCodes.configs.ts delete mode 100644 test/generated/dist/hsCodes/hsCodes.models.ts delete mode 100644 test/generated/dist/hsCodes/hsCodes.queries.ts delete mode 100644 test/generated/dist/integrationChannels/integrationChannels.acl.ts delete mode 100644 test/generated/dist/integrationChannels/integrationChannels.api.ts delete mode 100644 test/generated/dist/integrationChannels/integrationChannels.configs.ts delete mode 100644 test/generated/dist/integrationChannels/integrationChannels.models.ts delete mode 100644 test/generated/dist/integrationChannels/integrationChannels.queries.ts delete mode 100644 test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts delete mode 100644 test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.api.ts delete mode 100644 test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.models.ts delete mode 100644 test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts delete mode 100644 test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts delete mode 100644 test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts delete mode 100644 test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts delete mode 100644 test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts delete mode 100644 test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts delete mode 100644 test/generated/dist/invoicePayments/invoicePayments.acl.ts delete mode 100644 test/generated/dist/invoicePayments/invoicePayments.api.ts delete mode 100644 test/generated/dist/invoicePayments/invoicePayments.configs.ts delete mode 100644 test/generated/dist/invoicePayments/invoicePayments.models.ts delete mode 100644 test/generated/dist/invoicePayments/invoicePayments.queries.ts delete mode 100644 test/generated/dist/invoices/invoices.acl.ts delete mode 100644 test/generated/dist/invoices/invoices.api.ts delete mode 100644 test/generated/dist/invoices/invoices.configs.ts delete mode 100644 test/generated/dist/invoices/invoices.models.ts delete mode 100644 test/generated/dist/invoices/invoices.queries.ts delete mode 100644 test/generated/dist/masterData/masterData.acl.ts delete mode 100644 test/generated/dist/masterData/masterData.api.ts delete mode 100644 test/generated/dist/masterData/masterData.configs.ts delete mode 100644 test/generated/dist/masterData/masterData.models.ts delete mode 100644 test/generated/dist/masterData/masterData.queries.ts delete mode 100644 test/generated/dist/masterDataImport/masterDataImport.acl.ts delete mode 100644 test/generated/dist/masterDataImport/masterDataImport.api.ts delete mode 100644 test/generated/dist/masterDataImport/masterDataImport.models.ts delete mode 100644 test/generated/dist/masterDataImport/masterDataImport.queries.ts delete mode 100644 test/generated/dist/offices/offices.acl.ts delete mode 100644 test/generated/dist/offices/offices.api.ts delete mode 100644 test/generated/dist/offices/offices.configs.ts delete mode 100644 test/generated/dist/offices/offices.models.ts delete mode 100644 test/generated/dist/offices/offices.queries.ts delete mode 100644 test/generated/dist/packageTypes/packageTypes.acl.ts delete mode 100644 test/generated/dist/packageTypes/packageTypes.api.ts delete mode 100644 test/generated/dist/packageTypes/packageTypes.configs.ts delete mode 100644 test/generated/dist/packageTypes/packageTypes.models.ts delete mode 100644 test/generated/dist/packageTypes/packageTypes.queries.ts delete mode 100644 test/generated/dist/partnerNetworks/partnerNetworks.acl.ts delete mode 100644 test/generated/dist/partnerNetworks/partnerNetworks.api.ts delete mode 100644 test/generated/dist/partnerNetworks/partnerNetworks.configs.ts delete mode 100644 test/generated/dist/partnerNetworks/partnerNetworks.models.ts delete mode 100644 test/generated/dist/partnerNetworks/partnerNetworks.queries.ts delete mode 100644 test/generated/dist/paymentConfirmations/paymentConfirmations.acl.ts delete mode 100644 test/generated/dist/paymentConfirmations/paymentConfirmations.api.ts delete mode 100644 test/generated/dist/paymentConfirmations/paymentConfirmations.configs.ts delete mode 100644 test/generated/dist/paymentConfirmations/paymentConfirmations.models.ts delete mode 100644 test/generated/dist/paymentConfirmations/paymentConfirmations.queries.ts delete mode 100644 test/generated/dist/ports/ports.acl.ts delete mode 100644 test/generated/dist/ports/ports.api.ts delete mode 100644 test/generated/dist/ports/ports.configs.ts delete mode 100644 test/generated/dist/ports/ports.models.ts delete mode 100644 test/generated/dist/ports/ports.queries.ts delete mode 100644 test/generated/dist/positionAccount/positionAccount.acl.ts delete mode 100644 test/generated/dist/positionAccount/positionAccount.api.ts delete mode 100644 test/generated/dist/positionAccount/positionAccount.models.ts delete mode 100644 test/generated/dist/positionAccount/positionAccount.queries.ts delete mode 100644 test/generated/dist/positionAccountItems/positionAccountItems.acl.ts delete mode 100644 test/generated/dist/positionAccountItems/positionAccountItems.api.ts delete mode 100644 test/generated/dist/positionAccountItems/positionAccountItems.models.ts delete mode 100644 test/generated/dist/positionAccountItems/positionAccountItems.queries.ts delete mode 100644 test/generated/dist/positionCargo/positionCargo.acl.ts delete mode 100644 test/generated/dist/positionCargo/positionCargo.api.ts delete mode 100644 test/generated/dist/positionCargo/positionCargo.configs.ts delete mode 100644 test/generated/dist/positionCargo/positionCargo.models.ts delete mode 100644 test/generated/dist/positionCargo/positionCargo.queries.ts delete mode 100644 test/generated/dist/positionCargoPackage/positionCargoPackage.acl.ts delete mode 100644 test/generated/dist/positionCargoPackage/positionCargoPackage.api.ts delete mode 100644 test/generated/dist/positionCargoPackage/positionCargoPackage.queries.ts delete mode 100644 test/generated/dist/positionChecklist/positionChecklist.acl.ts delete mode 100644 test/generated/dist/positionChecklist/positionChecklist.api.ts delete mode 100644 test/generated/dist/positionChecklist/positionChecklist.models.ts delete mode 100644 test/generated/dist/positionChecklist/positionChecklist.queries.ts delete mode 100644 test/generated/dist/positionInvolvedParties/positionInvolvedParties.acl.ts delete mode 100644 test/generated/dist/positionInvolvedParties/positionInvolvedParties.api.ts delete mode 100644 test/generated/dist/positionInvolvedParties/positionInvolvedParties.models.ts delete mode 100644 test/generated/dist/positionInvolvedParties/positionInvolvedParties.queries.ts delete mode 100644 test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts delete mode 100644 test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.api.ts delete mode 100644 test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts delete mode 100644 test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.models.ts delete mode 100644 test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts delete mode 100644 test/generated/dist/positionRoutes/positionRoutes.acl.ts delete mode 100644 test/generated/dist/positionRoutes/positionRoutes.api.ts delete mode 100644 test/generated/dist/positionRoutes/positionRoutes.queries.ts delete mode 100644 test/generated/dist/positions/positions.acl.ts delete mode 100644 test/generated/dist/positions/positions.api.ts delete mode 100644 test/generated/dist/positions/positions.configs.ts delete mode 100644 test/generated/dist/positions/positions.models.ts delete mode 100644 test/generated/dist/positions/positions.queries.ts delete mode 100644 test/generated/dist/projectLite/projectLite.acl.ts delete mode 100644 test/generated/dist/projectLite/projectLite.api.ts delete mode 100644 test/generated/dist/projectLite/projectLite.configs.ts delete mode 100644 test/generated/dist/projectLite/projectLite.models.ts delete mode 100644 test/generated/dist/projectLite/projectLite.queries.ts delete mode 100644 test/generated/dist/queryModules.ts delete mode 100644 test/generated/dist/quoteAccount/quoteAccount.acl.ts delete mode 100644 test/generated/dist/quoteAccount/quoteAccount.api.ts delete mode 100644 test/generated/dist/quoteAccount/quoteAccount.models.ts delete mode 100644 test/generated/dist/quoteAccount/quoteAccount.queries.ts delete mode 100644 test/generated/dist/quoteCargo/quoteCargo.acl.ts delete mode 100644 test/generated/dist/quoteCargo/quoteCargo.api.ts delete mode 100644 test/generated/dist/quoteCargo/quoteCargo.configs.ts delete mode 100644 test/generated/dist/quoteCargo/quoteCargo.models.ts delete mode 100644 test/generated/dist/quoteCargo/quoteCargo.queries.ts delete mode 100644 test/generated/dist/quoteCargoPackage/quoteCargoPackage.acl.ts delete mode 100644 test/generated/dist/quoteCargoPackage/quoteCargoPackage.api.ts delete mode 100644 test/generated/dist/quoteCargoPackage/quoteCargoPackage.queries.ts delete mode 100644 test/generated/dist/quoteConversion/quoteConversion.acl.ts delete mode 100644 test/generated/dist/quoteConversion/quoteConversion.api.ts delete mode 100644 test/generated/dist/quoteConversion/quoteConversion.models.ts delete mode 100644 test/generated/dist/quoteConversion/quoteConversion.queries.ts delete mode 100644 test/generated/dist/quoteDocument/quoteDocument.acl.ts delete mode 100644 test/generated/dist/quoteDocument/quoteDocument.api.ts delete mode 100644 test/generated/dist/quoteDocument/quoteDocument.models.ts delete mode 100644 test/generated/dist/quoteDocument/quoteDocument.queries.ts delete mode 100644 test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts delete mode 100644 test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts delete mode 100644 test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts delete mode 100644 test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts delete mode 100644 test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts delete mode 100644 test/generated/dist/quoteRoutes/quoteRoutes.acl.ts delete mode 100644 test/generated/dist/quoteRoutes/quoteRoutes.api.ts delete mode 100644 test/generated/dist/quoteRoutes/quoteRoutes.queries.ts delete mode 100644 test/generated/dist/quotes/quotes.acl.ts delete mode 100644 test/generated/dist/quotes/quotes.api.ts delete mode 100644 test/generated/dist/quotes/quotes.configs.ts delete mode 100644 test/generated/dist/quotes/quotes.models.ts delete mode 100644 test/generated/dist/quotes/quotes.queries.ts delete mode 100644 test/generated/dist/remarkTemplates/remarkTemplates.acl.ts delete mode 100644 test/generated/dist/remarkTemplates/remarkTemplates.api.ts delete mode 100644 test/generated/dist/remarkTemplates/remarkTemplates.configs.ts delete mode 100644 test/generated/dist/remarkTemplates/remarkTemplates.models.ts delete mode 100644 test/generated/dist/remarkTemplates/remarkTemplates.queries.ts delete mode 100644 test/generated/dist/roadQuotes/roadQuotes.acl.ts delete mode 100644 test/generated/dist/roadQuotes/roadQuotes.api.ts delete mode 100644 test/generated/dist/roadQuotes/roadQuotes.models.ts delete mode 100644 test/generated/dist/roadQuotes/roadQuotes.queries.ts delete mode 100644 test/generated/dist/seaPositions/seaPositions.acl.ts delete mode 100644 test/generated/dist/seaPositions/seaPositions.api.ts delete mode 100644 test/generated/dist/seaPositions/seaPositions.models.ts delete mode 100644 test/generated/dist/seaPositions/seaPositions.queries.ts delete mode 100644 test/generated/dist/seaQuotes/seaQuotes.acl.ts delete mode 100644 test/generated/dist/seaQuotes/seaQuotes.api.ts delete mode 100644 test/generated/dist/seaQuotes/seaQuotes.models.ts delete mode 100644 test/generated/dist/seaQuotes/seaQuotes.queries.ts delete mode 100644 test/generated/dist/shippingInstructions/shippingInstructions.acl.ts delete mode 100644 test/generated/dist/shippingInstructions/shippingInstructions.api.ts delete mode 100644 test/generated/dist/shippingInstructions/shippingInstructions.models.ts delete mode 100644 test/generated/dist/shippingInstructions/shippingInstructions.queries.ts delete mode 100644 test/generated/dist/terminals/terminals.acl.ts delete mode 100644 test/generated/dist/terminals/terminals.api.ts delete mode 100644 test/generated/dist/terminals/terminals.configs.ts delete mode 100644 test/generated/dist/terminals/terminals.models.ts delete mode 100644 test/generated/dist/terminals/terminals.queries.ts delete mode 100644 test/generated/dist/useCrossTabQueryInvalidation.ts delete mode 100644 test/generated/dist/useMutationEffects.ts delete mode 100644 test/generated/dist/userActivity/userActivity.api.ts delete mode 100644 test/generated/dist/userActivity/userActivity.models.ts delete mode 100644 test/generated/dist/userActivity/userActivity.queries.ts delete mode 100644 test/generated/dist/vatRules/vatRules.acl.ts delete mode 100644 test/generated/dist/vatRules/vatRules.api.ts delete mode 100644 test/generated/dist/vatRules/vatRules.configs.ts delete mode 100644 test/generated/dist/vatRules/vatRules.models.ts delete mode 100644 test/generated/dist/vatRules/vatRules.queries.ts delete mode 100644 test/generated/dist/warehouses/warehouses.acl.ts delete mode 100644 test/generated/dist/warehouses/warehouses.api.ts delete mode 100644 test/generated/dist/warehouses/warehouses.configs.ts delete mode 100644 test/generated/dist/warehouses/warehouses.models.ts delete mode 100644 test/generated/dist/warehouses/warehouses.queries.ts delete mode 100644 test/generated/dist/workingDocuments/workingDocuments.acl.ts delete mode 100644 test/generated/dist/workingDocuments/workingDocuments.api.ts delete mode 100644 test/generated/dist/workingDocuments/workingDocuments.configs.ts delete mode 100644 test/generated/dist/workingDocuments/workingDocuments.models.ts delete mode 100644 test/generated/dist/workingDocuments/workingDocuments.queries.ts delete mode 100644 test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts delete mode 100644 test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts delete mode 100644 test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts delete mode 100644 test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts delete mode 100644 test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts delete mode 100644 test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts delete mode 100644 test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts delete mode 100644 test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts delete mode 100644 test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts delete mode 100644 test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts delete mode 100644 test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts delete mode 100644 test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts delete mode 100644 test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts delete mode 100644 test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts delete mode 100644 test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts delete mode 100644 test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts delete mode 100644 test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts delete mode 100644 test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts delete mode 100644 test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts delete mode 100644 test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts delete mode 100644 test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts delete mode 100644 test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts delete mode 100644 test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts delete mode 100644 test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts delete mode 100644 test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts delete mode 100644 test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts delete mode 100644 test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts delete mode 100644 test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts delete mode 100644 test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts delete mode 100644 test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts delete mode 100644 test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts delete mode 100644 test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts delete mode 100644 test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts delete mode 100644 test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts delete mode 100644 test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts delete mode 100644 test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts delete mode 100644 test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts delete mode 100644 test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts delete mode 100644 test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts delete mode 100644 test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts delete mode 100644 test/generated/dist/zod.extended.ts delete mode 100644 test/generated/full/aWBStocks/aWBStocks.acl.ts delete mode 100644 test/generated/full/aWBStocks/aWBStocks.api.ts delete mode 100644 test/generated/full/aWBStocks/aWBStocks.configs.ts delete mode 100644 test/generated/full/aWBStocks/aWBStocks.models.ts delete mode 100644 test/generated/full/aWBStocks/aWBStocks.queries.ts delete mode 100644 test/generated/full/acl/app.ability.ts delete mode 100644 test/generated/full/acl/useAclCheck.ts delete mode 100644 test/generated/full/airPositions/airPositions.acl.ts delete mode 100644 test/generated/full/airPositions/airPositions.api.ts delete mode 100644 test/generated/full/airPositions/airPositions.models.ts delete mode 100644 test/generated/full/airPositions/airPositions.queries.ts delete mode 100644 test/generated/full/airports/airports.acl.ts delete mode 100644 test/generated/full/airports/airports.api.ts delete mode 100644 test/generated/full/airports/airports.configs.ts delete mode 100644 test/generated/full/airports/airports.models.ts delete mode 100644 test/generated/full/airports/airports.queries.ts delete mode 100644 test/generated/full/app-rest-client.ts delete mode 100644 test/generated/full/bankAccounts/bankAccounts.acl.ts delete mode 100644 test/generated/full/bankAccounts/bankAccounts.api.ts delete mode 100644 test/generated/full/bankAccounts/bankAccounts.configs.ts delete mode 100644 test/generated/full/bankAccounts/bankAccounts.models.ts delete mode 100644 test/generated/full/bankAccounts/bankAccounts.queries.ts delete mode 100644 test/generated/full/bookkeepingExport/bookkeepingExport.acl.ts delete mode 100644 test/generated/full/bookkeepingExport/bookkeepingExport.api.ts delete mode 100644 test/generated/full/bookkeepingExport/bookkeepingExport.configs.ts delete mode 100644 test/generated/full/bookkeepingExport/bookkeepingExport.models.ts delete mode 100644 test/generated/full/bookkeepingExport/bookkeepingExport.queries.ts delete mode 100644 test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts delete mode 100644 test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts delete mode 100644 test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts delete mode 100644 test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts delete mode 100644 test/generated/full/businessPartnerContacts/businessPartnerContacts.acl.ts delete mode 100644 test/generated/full/businessPartnerContacts/businessPartnerContacts.api.ts delete mode 100644 test/generated/full/businessPartnerContacts/businessPartnerContacts.configs.ts delete mode 100644 test/generated/full/businessPartnerContacts/businessPartnerContacts.models.ts delete mode 100644 test/generated/full/businessPartnerContacts/businessPartnerContacts.queries.ts delete mode 100644 test/generated/full/businessPartners/businessPartners.acl.ts delete mode 100644 test/generated/full/businessPartners/businessPartners.api.ts delete mode 100644 test/generated/full/businessPartners/businessPartners.configs.ts delete mode 100644 test/generated/full/businessPartners/businessPartners.models.ts delete mode 100644 test/generated/full/businessPartners/businessPartners.queries.ts delete mode 100644 test/generated/full/cargoTypes/cargoTypes.acl.ts delete mode 100644 test/generated/full/cargoTypes/cargoTypes.api.ts delete mode 100644 test/generated/full/cargoTypes/cargoTypes.configs.ts delete mode 100644 test/generated/full/cargoTypes/cargoTypes.models.ts delete mode 100644 test/generated/full/cargoTypes/cargoTypes.queries.ts delete mode 100644 test/generated/full/chargeTypes/chargeTypes.acl.ts delete mode 100644 test/generated/full/chargeTypes/chargeTypes.api.ts delete mode 100644 test/generated/full/chargeTypes/chargeTypes.configs.ts delete mode 100644 test/generated/full/chargeTypes/chargeTypes.models.ts delete mode 100644 test/generated/full/chargeTypes/chargeTypes.queries.ts delete mode 100644 test/generated/full/checklistItems/checklistItems.acl.ts delete mode 100644 test/generated/full/checklistItems/checklistItems.api.ts delete mode 100644 test/generated/full/checklistItems/checklistItems.configs.ts delete mode 100644 test/generated/full/checklistItems/checklistItems.models.ts delete mode 100644 test/generated/full/checklistItems/checklistItems.queries.ts delete mode 100644 test/generated/full/checklistTemplates/checklistTemplates.acl.ts delete mode 100644 test/generated/full/checklistTemplates/checklistTemplates.api.ts delete mode 100644 test/generated/full/checklistTemplates/checklistTemplates.configs.ts delete mode 100644 test/generated/full/checklistTemplates/checklistTemplates.models.ts delete mode 100644 test/generated/full/checklistTemplates/checklistTemplates.queries.ts delete mode 100644 test/generated/full/cities/cities.acl.ts delete mode 100644 test/generated/full/cities/cities.api.ts delete mode 100644 test/generated/full/cities/cities.configs.ts delete mode 100644 test/generated/full/cities/cities.models.ts delete mode 100644 test/generated/full/cities/cities.queries.ts delete mode 100644 test/generated/full/common/common.models.ts delete mode 100644 test/generated/full/containerYards/containerYards.acl.ts delete mode 100644 test/generated/full/containerYards/containerYards.api.ts delete mode 100644 test/generated/full/containerYards/containerYards.configs.ts delete mode 100644 test/generated/full/containerYards/containerYards.models.ts delete mode 100644 test/generated/full/containerYards/containerYards.queries.ts delete mode 100644 test/generated/full/controlTowerAuth/controlTowerAuth.api.ts delete mode 100644 test/generated/full/controlTowerAuth/controlTowerAuth.models.ts delete mode 100644 test/generated/full/controlTowerAuth/controlTowerAuth.queries.ts delete mode 100644 test/generated/full/controlTowerBookings/controlTowerBookings.api.ts delete mode 100644 test/generated/full/controlTowerBookings/controlTowerBookings.configs.ts delete mode 100644 test/generated/full/controlTowerBookings/controlTowerBookings.models.ts delete mode 100644 test/generated/full/controlTowerBookings/controlTowerBookings.queries.ts delete mode 100644 test/generated/full/controlTowerCalendar/controlTowerCalendar.api.ts delete mode 100644 test/generated/full/controlTowerCalendar/controlTowerCalendar.models.ts delete mode 100644 test/generated/full/controlTowerCalendar/controlTowerCalendar.queries.ts delete mode 100644 test/generated/full/controlTowerContainers/controlTowerContainers.api.ts delete mode 100644 test/generated/full/controlTowerContainers/controlTowerContainers.configs.ts delete mode 100644 test/generated/full/controlTowerContainers/controlTowerContainers.models.ts delete mode 100644 test/generated/full/controlTowerContainers/controlTowerContainers.queries.ts delete mode 100644 test/generated/full/controlTowerMe/controlTowerMe.api.ts delete mode 100644 test/generated/full/controlTowerMe/controlTowerMe.models.ts delete mode 100644 test/generated/full/controlTowerMe/controlTowerMe.queries.ts delete mode 100644 test/generated/full/controlTowerPackages/controlTowerPackages.api.ts delete mode 100644 test/generated/full/controlTowerPackages/controlTowerPackages.configs.ts delete mode 100644 test/generated/full/controlTowerPackages/controlTowerPackages.models.ts delete mode 100644 test/generated/full/controlTowerPackages/controlTowerPackages.queries.ts delete mode 100644 test/generated/full/controlTowerSearch/controlTowerSearch.api.ts delete mode 100644 test/generated/full/controlTowerSearch/controlTowerSearch.models.ts delete mode 100644 test/generated/full/controlTowerSearch/controlTowerSearch.queries.ts delete mode 100644 test/generated/full/countries/countries.acl.ts delete mode 100644 test/generated/full/countries/countries.api.ts delete mode 100644 test/generated/full/countries/countries.configs.ts delete mode 100644 test/generated/full/countries/countries.models.ts delete mode 100644 test/generated/full/countries/countries.queries.ts delete mode 100644 test/generated/full/currencies/currencies.acl.ts delete mode 100644 test/generated/full/currencies/currencies.api.ts delete mode 100644 test/generated/full/currencies/currencies.configs.ts delete mode 100644 test/generated/full/currencies/currencies.models.ts delete mode 100644 test/generated/full/currencies/currencies.queries.ts delete mode 100644 test/generated/full/customerAccount/customerAccount.api.ts delete mode 100644 test/generated/full/customerAccount/customerAccount.models.ts delete mode 100644 test/generated/full/customerAccount/customerAccount.queries.ts delete mode 100644 test/generated/full/customers/customers.acl.ts delete mode 100644 test/generated/full/customers/customers.api.ts delete mode 100644 test/generated/full/customers/customers.configs.ts delete mode 100644 test/generated/full/customers/customers.models.ts delete mode 100644 test/generated/full/customers/customers.queries.ts delete mode 100644 test/generated/full/depots/depots.acl.ts delete mode 100644 test/generated/full/depots/depots.api.ts delete mode 100644 test/generated/full/depots/depots.configs.ts delete mode 100644 test/generated/full/depots/depots.models.ts delete mode 100644 test/generated/full/depots/depots.queries.ts delete mode 100644 test/generated/full/documentTemplates/documentTemplates.acl.ts delete mode 100644 test/generated/full/documentTemplates/documentTemplates.api.ts delete mode 100644 test/generated/full/documentTemplates/documentTemplates.configs.ts delete mode 100644 test/generated/full/documentTemplates/documentTemplates.models.ts delete mode 100644 test/generated/full/documentTemplates/documentTemplates.queries.ts delete mode 100644 test/generated/full/dunningAccountStatement/dunningAccountStatement.acl.ts delete mode 100644 test/generated/full/dunningAccountStatement/dunningAccountStatement.api.ts delete mode 100644 test/generated/full/dunningAccountStatement/dunningAccountStatement.models.ts delete mode 100644 test/generated/full/dunningAccountStatement/dunningAccountStatement.queries.ts delete mode 100644 test/generated/full/dunningLevels/dunningLevels.acl.ts delete mode 100644 test/generated/full/dunningLevels/dunningLevels.api.ts delete mode 100644 test/generated/full/dunningLevels/dunningLevels.configs.ts delete mode 100644 test/generated/full/dunningLevels/dunningLevels.models.ts delete mode 100644 test/generated/full/dunningLevels/dunningLevels.queries.ts delete mode 100644 test/generated/full/dunningManagement/dunningManagement.acl.ts delete mode 100644 test/generated/full/dunningManagement/dunningManagement.api.ts delete mode 100644 test/generated/full/dunningManagement/dunningManagement.configs.ts delete mode 100644 test/generated/full/dunningManagement/dunningManagement.models.ts delete mode 100644 test/generated/full/dunningManagement/dunningManagement.queries.ts delete mode 100644 test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts delete mode 100644 test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts delete mode 100644 test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts delete mode 100644 test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts delete mode 100644 test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts delete mode 100644 test/generated/full/dunningSystems/dunningSystems.acl.ts delete mode 100644 test/generated/full/dunningSystems/dunningSystems.api.ts delete mode 100644 test/generated/full/dunningSystems/dunningSystems.configs.ts delete mode 100644 test/generated/full/dunningSystems/dunningSystems.models.ts delete mode 100644 test/generated/full/dunningSystems/dunningSystems.queries.ts delete mode 100644 test/generated/full/employee/employee.acl.ts delete mode 100644 test/generated/full/employee/employee.api.ts delete mode 100644 test/generated/full/employee/employee.configs.ts delete mode 100644 test/generated/full/employee/employee.models.ts delete mode 100644 test/generated/full/employee/employee.queries.ts delete mode 100644 test/generated/full/employeeAccount/employeeAccount.api.ts delete mode 100644 test/generated/full/employeeAccount/employeeAccount.models.ts delete mode 100644 test/generated/full/employeeAccount/employeeAccount.queries.ts delete mode 100644 test/generated/full/employeePermissions/employeePermissions.acl.ts delete mode 100644 test/generated/full/employeePermissions/employeePermissions.api.ts delete mode 100644 test/generated/full/employeePermissions/employeePermissions.configs.ts delete mode 100644 test/generated/full/employeePermissions/employeePermissions.models.ts delete mode 100644 test/generated/full/employeePermissions/employeePermissions.queries.ts delete mode 100644 test/generated/full/employeeProfile/employeeProfile.api.ts delete mode 100644 test/generated/full/employeeProfile/employeeProfile.models.ts delete mode 100644 test/generated/full/employeeProfile/employeeProfile.queries.ts delete mode 100644 test/generated/full/employeeRoles/employeeRoles.acl.ts delete mode 100644 test/generated/full/employeeRoles/employeeRoles.api.ts delete mode 100644 test/generated/full/employeeRoles/employeeRoles.configs.ts delete mode 100644 test/generated/full/employeeRoles/employeeRoles.models.ts delete mode 100644 test/generated/full/employeeRoles/employeeRoles.queries.ts delete mode 100644 test/generated/full/employeeSettings/employeeSettings.api.ts delete mode 100644 test/generated/full/employeeSettings/employeeSettings.models.ts delete mode 100644 test/generated/full/employeeSettings/employeeSettings.queries.ts delete mode 100644 test/generated/full/employment/employment.acl.ts delete mode 100644 test/generated/full/employment/employment.api.ts delete mode 100644 test/generated/full/employment/employment.configs.ts delete mode 100644 test/generated/full/employment/employment.models.ts delete mode 100644 test/generated/full/employment/employment.queries.ts delete mode 100644 test/generated/full/factoringExport/factoringExport.acl.ts delete mode 100644 test/generated/full/factoringExport/factoringExport.api.ts delete mode 100644 test/generated/full/factoringExport/factoringExport.models.ts delete mode 100644 test/generated/full/factoringExport/factoringExport.queries.ts delete mode 100644 test/generated/full/factoringMerge/factoringMerge.acl.ts delete mode 100644 test/generated/full/factoringMerge/factoringMerge.api.ts delete mode 100644 test/generated/full/factoringMerge/factoringMerge.models.ts delete mode 100644 test/generated/full/factoringMerge/factoringMerge.queries.ts delete mode 100644 test/generated/full/files/files.api.ts delete mode 100644 test/generated/full/files/files.models.ts delete mode 100644 test/generated/full/files/files.queries.ts delete mode 100644 test/generated/full/folders/folders.api.ts delete mode 100644 test/generated/full/folders/folders.models.ts delete mode 100644 test/generated/full/folders/folders.queries.ts delete mode 100644 test/generated/full/hsCodes/hsCodes.acl.ts delete mode 100644 test/generated/full/hsCodes/hsCodes.api.ts delete mode 100644 test/generated/full/hsCodes/hsCodes.configs.ts delete mode 100644 test/generated/full/hsCodes/hsCodes.models.ts delete mode 100644 test/generated/full/hsCodes/hsCodes.queries.ts delete mode 100644 test/generated/full/integrationChannels/integrationChannels.acl.ts delete mode 100644 test/generated/full/integrationChannels/integrationChannels.api.ts delete mode 100644 test/generated/full/integrationChannels/integrationChannels.configs.ts delete mode 100644 test/generated/full/integrationChannels/integrationChannels.models.ts delete mode 100644 test/generated/full/integrationChannels/integrationChannels.queries.ts delete mode 100644 test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts delete mode 100644 test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.api.ts delete mode 100644 test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.models.ts delete mode 100644 test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts delete mode 100644 test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts delete mode 100644 test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts delete mode 100644 test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts delete mode 100644 test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts delete mode 100644 test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts delete mode 100644 test/generated/full/invoicePayments/invoicePayments.acl.ts delete mode 100644 test/generated/full/invoicePayments/invoicePayments.api.ts delete mode 100644 test/generated/full/invoicePayments/invoicePayments.configs.ts delete mode 100644 test/generated/full/invoicePayments/invoicePayments.models.ts delete mode 100644 test/generated/full/invoicePayments/invoicePayments.queries.ts delete mode 100644 test/generated/full/invoices/invoices.acl.ts delete mode 100644 test/generated/full/invoices/invoices.api.ts delete mode 100644 test/generated/full/invoices/invoices.configs.ts delete mode 100644 test/generated/full/invoices/invoices.models.ts delete mode 100644 test/generated/full/invoices/invoices.queries.ts delete mode 100644 test/generated/full/masterData/masterData.acl.ts delete mode 100644 test/generated/full/masterData/masterData.api.ts delete mode 100644 test/generated/full/masterData/masterData.configs.ts delete mode 100644 test/generated/full/masterData/masterData.models.ts delete mode 100644 test/generated/full/masterData/masterData.queries.ts delete mode 100644 test/generated/full/masterDataImport/masterDataImport.acl.ts delete mode 100644 test/generated/full/masterDataImport/masterDataImport.api.ts delete mode 100644 test/generated/full/masterDataImport/masterDataImport.models.ts delete mode 100644 test/generated/full/masterDataImport/masterDataImport.queries.ts delete mode 100644 test/generated/full/offices/offices.acl.ts delete mode 100644 test/generated/full/offices/offices.api.ts delete mode 100644 test/generated/full/offices/offices.configs.ts delete mode 100644 test/generated/full/offices/offices.models.ts delete mode 100644 test/generated/full/offices/offices.queries.ts delete mode 100644 test/generated/full/packageTypes/packageTypes.acl.ts delete mode 100644 test/generated/full/packageTypes/packageTypes.api.ts delete mode 100644 test/generated/full/packageTypes/packageTypes.configs.ts delete mode 100644 test/generated/full/packageTypes/packageTypes.models.ts delete mode 100644 test/generated/full/packageTypes/packageTypes.queries.ts delete mode 100644 test/generated/full/partnerNetworks/partnerNetworks.acl.ts delete mode 100644 test/generated/full/partnerNetworks/partnerNetworks.api.ts delete mode 100644 test/generated/full/partnerNetworks/partnerNetworks.configs.ts delete mode 100644 test/generated/full/partnerNetworks/partnerNetworks.models.ts delete mode 100644 test/generated/full/partnerNetworks/partnerNetworks.queries.ts delete mode 100644 test/generated/full/paymentConfirmations/paymentConfirmations.acl.ts delete mode 100644 test/generated/full/paymentConfirmations/paymentConfirmations.api.ts delete mode 100644 test/generated/full/paymentConfirmations/paymentConfirmations.configs.ts delete mode 100644 test/generated/full/paymentConfirmations/paymentConfirmations.models.ts delete mode 100644 test/generated/full/paymentConfirmations/paymentConfirmations.queries.ts delete mode 100644 test/generated/full/ports/ports.acl.ts delete mode 100644 test/generated/full/ports/ports.api.ts delete mode 100644 test/generated/full/ports/ports.configs.ts delete mode 100644 test/generated/full/ports/ports.models.ts delete mode 100644 test/generated/full/ports/ports.queries.ts delete mode 100644 test/generated/full/positionAccount/positionAccount.acl.ts delete mode 100644 test/generated/full/positionAccount/positionAccount.api.ts delete mode 100644 test/generated/full/positionAccount/positionAccount.models.ts delete mode 100644 test/generated/full/positionAccount/positionAccount.queries.ts delete mode 100644 test/generated/full/positionAccountItems/positionAccountItems.acl.ts delete mode 100644 test/generated/full/positionAccountItems/positionAccountItems.api.ts delete mode 100644 test/generated/full/positionAccountItems/positionAccountItems.models.ts delete mode 100644 test/generated/full/positionAccountItems/positionAccountItems.queries.ts delete mode 100644 test/generated/full/positionCargo/positionCargo.acl.ts delete mode 100644 test/generated/full/positionCargo/positionCargo.api.ts delete mode 100644 test/generated/full/positionCargo/positionCargo.configs.ts delete mode 100644 test/generated/full/positionCargo/positionCargo.models.ts delete mode 100644 test/generated/full/positionCargo/positionCargo.queries.ts delete mode 100644 test/generated/full/positionCargoPackage/positionCargoPackage.acl.ts delete mode 100644 test/generated/full/positionCargoPackage/positionCargoPackage.api.ts delete mode 100644 test/generated/full/positionCargoPackage/positionCargoPackage.queries.ts delete mode 100644 test/generated/full/positionChecklist/positionChecklist.acl.ts delete mode 100644 test/generated/full/positionChecklist/positionChecklist.api.ts delete mode 100644 test/generated/full/positionChecklist/positionChecklist.models.ts delete mode 100644 test/generated/full/positionChecklist/positionChecklist.queries.ts delete mode 100644 test/generated/full/positionInvolvedParties/positionInvolvedParties.acl.ts delete mode 100644 test/generated/full/positionInvolvedParties/positionInvolvedParties.api.ts delete mode 100644 test/generated/full/positionInvolvedParties/positionInvolvedParties.models.ts delete mode 100644 test/generated/full/positionInvolvedParties/positionInvolvedParties.queries.ts delete mode 100644 test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts delete mode 100644 test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.api.ts delete mode 100644 test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts delete mode 100644 test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.models.ts delete mode 100644 test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts delete mode 100644 test/generated/full/positionRoutes/positionRoutes.acl.ts delete mode 100644 test/generated/full/positionRoutes/positionRoutes.api.ts delete mode 100644 test/generated/full/positionRoutes/positionRoutes.queries.ts delete mode 100644 test/generated/full/positions/positions.acl.ts delete mode 100644 test/generated/full/positions/positions.api.ts delete mode 100644 test/generated/full/positions/positions.configs.ts delete mode 100644 test/generated/full/positions/positions.models.ts delete mode 100644 test/generated/full/positions/positions.queries.ts delete mode 100644 test/generated/full/projectLite/projectLite.acl.ts delete mode 100644 test/generated/full/projectLite/projectLite.api.ts delete mode 100644 test/generated/full/projectLite/projectLite.configs.ts delete mode 100644 test/generated/full/projectLite/projectLite.models.ts delete mode 100644 test/generated/full/projectLite/projectLite.queries.ts delete mode 100644 test/generated/full/queryModules.ts delete mode 100644 test/generated/full/quoteAccount/quoteAccount.acl.ts delete mode 100644 test/generated/full/quoteAccount/quoteAccount.api.ts delete mode 100644 test/generated/full/quoteAccount/quoteAccount.models.ts delete mode 100644 test/generated/full/quoteAccount/quoteAccount.queries.ts delete mode 100644 test/generated/full/quoteCargo/quoteCargo.acl.ts delete mode 100644 test/generated/full/quoteCargo/quoteCargo.api.ts delete mode 100644 test/generated/full/quoteCargo/quoteCargo.configs.ts delete mode 100644 test/generated/full/quoteCargo/quoteCargo.models.ts delete mode 100644 test/generated/full/quoteCargo/quoteCargo.queries.ts delete mode 100644 test/generated/full/quoteCargoPackage/quoteCargoPackage.acl.ts delete mode 100644 test/generated/full/quoteCargoPackage/quoteCargoPackage.api.ts delete mode 100644 test/generated/full/quoteCargoPackage/quoteCargoPackage.queries.ts delete mode 100644 test/generated/full/quoteConversion/quoteConversion.acl.ts delete mode 100644 test/generated/full/quoteConversion/quoteConversion.api.ts delete mode 100644 test/generated/full/quoteConversion/quoteConversion.models.ts delete mode 100644 test/generated/full/quoteConversion/quoteConversion.queries.ts delete mode 100644 test/generated/full/quoteDocument/quoteDocument.acl.ts delete mode 100644 test/generated/full/quoteDocument/quoteDocument.api.ts delete mode 100644 test/generated/full/quoteDocument/quoteDocument.models.ts delete mode 100644 test/generated/full/quoteDocument/quoteDocument.queries.ts delete mode 100644 test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts delete mode 100644 test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts delete mode 100644 test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts delete mode 100644 test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts delete mode 100644 test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts delete mode 100644 test/generated/full/quoteRoutes/quoteRoutes.acl.ts delete mode 100644 test/generated/full/quoteRoutes/quoteRoutes.api.ts delete mode 100644 test/generated/full/quoteRoutes/quoteRoutes.queries.ts delete mode 100644 test/generated/full/quotes/quotes.acl.ts delete mode 100644 test/generated/full/quotes/quotes.api.ts delete mode 100644 test/generated/full/quotes/quotes.configs.ts delete mode 100644 test/generated/full/quotes/quotes.models.ts delete mode 100644 test/generated/full/quotes/quotes.queries.ts delete mode 100644 test/generated/full/remarkTemplates/remarkTemplates.acl.ts delete mode 100644 test/generated/full/remarkTemplates/remarkTemplates.api.ts delete mode 100644 test/generated/full/remarkTemplates/remarkTemplates.configs.ts delete mode 100644 test/generated/full/remarkTemplates/remarkTemplates.models.ts delete mode 100644 test/generated/full/remarkTemplates/remarkTemplates.queries.ts delete mode 100644 test/generated/full/roadQuotes/roadQuotes.acl.ts delete mode 100644 test/generated/full/roadQuotes/roadQuotes.api.ts delete mode 100644 test/generated/full/roadQuotes/roadQuotes.models.ts delete mode 100644 test/generated/full/roadQuotes/roadQuotes.queries.ts delete mode 100644 test/generated/full/seaPositions/seaPositions.acl.ts delete mode 100644 test/generated/full/seaPositions/seaPositions.api.ts delete mode 100644 test/generated/full/seaPositions/seaPositions.models.ts delete mode 100644 test/generated/full/seaPositions/seaPositions.queries.ts delete mode 100644 test/generated/full/seaQuotes/seaQuotes.acl.ts delete mode 100644 test/generated/full/seaQuotes/seaQuotes.api.ts delete mode 100644 test/generated/full/seaQuotes/seaQuotes.models.ts delete mode 100644 test/generated/full/seaQuotes/seaQuotes.queries.ts delete mode 100644 test/generated/full/shippingInstructions/shippingInstructions.acl.ts delete mode 100644 test/generated/full/shippingInstructions/shippingInstructions.api.ts delete mode 100644 test/generated/full/shippingInstructions/shippingInstructions.models.ts delete mode 100644 test/generated/full/shippingInstructions/shippingInstructions.queries.ts delete mode 100644 test/generated/full/terminals/terminals.acl.ts delete mode 100644 test/generated/full/terminals/terminals.api.ts delete mode 100644 test/generated/full/terminals/terminals.configs.ts delete mode 100644 test/generated/full/terminals/terminals.models.ts delete mode 100644 test/generated/full/terminals/terminals.queries.ts delete mode 100644 test/generated/full/useCrossTabQueryInvalidation.ts delete mode 100644 test/generated/full/useMutationEffects.ts delete mode 100644 test/generated/full/userActivity/userActivity.api.ts delete mode 100644 test/generated/full/userActivity/userActivity.models.ts delete mode 100644 test/generated/full/userActivity/userActivity.queries.ts delete mode 100644 test/generated/full/vatRules/vatRules.acl.ts delete mode 100644 test/generated/full/vatRules/vatRules.api.ts delete mode 100644 test/generated/full/vatRules/vatRules.configs.ts delete mode 100644 test/generated/full/vatRules/vatRules.models.ts delete mode 100644 test/generated/full/vatRules/vatRules.queries.ts delete mode 100644 test/generated/full/warehouses/warehouses.acl.ts delete mode 100644 test/generated/full/warehouses/warehouses.api.ts delete mode 100644 test/generated/full/warehouses/warehouses.configs.ts delete mode 100644 test/generated/full/warehouses/warehouses.models.ts delete mode 100644 test/generated/full/warehouses/warehouses.queries.ts delete mode 100644 test/generated/full/workingDocuments/workingDocuments.acl.ts delete mode 100644 test/generated/full/workingDocuments/workingDocuments.api.ts delete mode 100644 test/generated/full/workingDocuments/workingDocuments.configs.ts delete mode 100644 test/generated/full/workingDocuments/workingDocuments.models.ts delete mode 100644 test/generated/full/workingDocuments/workingDocuments.queries.ts delete mode 100644 test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts delete mode 100644 test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts delete mode 100644 test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts delete mode 100644 test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts delete mode 100644 test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts delete mode 100644 test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts delete mode 100644 test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts delete mode 100644 test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts delete mode 100644 test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts delete mode 100644 test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts delete mode 100644 test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts delete mode 100644 test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts delete mode 100644 test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts delete mode 100644 test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts delete mode 100644 test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts delete mode 100644 test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts delete mode 100644 test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts delete mode 100644 test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts delete mode 100644 test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts delete mode 100644 test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts delete mode 100644 test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts delete mode 100644 test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts delete mode 100644 test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts delete mode 100644 test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts delete mode 100644 test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts delete mode 100644 test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts delete mode 100644 test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts delete mode 100644 test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts delete mode 100644 test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts delete mode 100644 test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts delete mode 100644 test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts delete mode 100644 test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts delete mode 100644 test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts delete mode 100644 test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts delete mode 100644 test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts delete mode 100644 test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts delete mode 100644 test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts delete mode 100644 test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts delete mode 100644 test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts delete mode 100644 test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts delete mode 100644 test/generated/full/zod.extended.ts delete mode 100644 test/generated/next/aWBStocks/aWBStocks.acl.ts delete mode 100644 test/generated/next/aWBStocks/aWBStocks.api.ts delete mode 100644 test/generated/next/aWBStocks/aWBStocks.configs.ts delete mode 100644 test/generated/next/aWBStocks/aWBStocks.models.ts delete mode 100644 test/generated/next/aWBStocks/aWBStocks.queries.ts delete mode 100644 test/generated/next/acl/app.ability.ts delete mode 100644 test/generated/next/acl/useAclCheck.ts delete mode 100644 test/generated/next/airPositions/airPositions.acl.ts delete mode 100644 test/generated/next/airPositions/airPositions.api.ts delete mode 100644 test/generated/next/airPositions/airPositions.models.ts delete mode 100644 test/generated/next/airPositions/airPositions.queries.ts delete mode 100644 test/generated/next/airports/airports.acl.ts delete mode 100644 test/generated/next/airports/airports.api.ts delete mode 100644 test/generated/next/airports/airports.configs.ts delete mode 100644 test/generated/next/airports/airports.models.ts delete mode 100644 test/generated/next/airports/airports.queries.ts delete mode 100644 test/generated/next/app-rest-client.ts delete mode 100644 test/generated/next/bankAccounts/bankAccounts.acl.ts delete mode 100644 test/generated/next/bankAccounts/bankAccounts.api.ts delete mode 100644 test/generated/next/bankAccounts/bankAccounts.configs.ts delete mode 100644 test/generated/next/bankAccounts/bankAccounts.models.ts delete mode 100644 test/generated/next/bankAccounts/bankAccounts.queries.ts delete mode 100644 test/generated/next/bookkeepingExport/bookkeepingExport.acl.ts delete mode 100644 test/generated/next/bookkeepingExport/bookkeepingExport.api.ts delete mode 100644 test/generated/next/bookkeepingExport/bookkeepingExport.configs.ts delete mode 100644 test/generated/next/bookkeepingExport/bookkeepingExport.models.ts delete mode 100644 test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts delete mode 100644 test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts delete mode 100644 test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts delete mode 100644 test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts delete mode 100644 test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts delete mode 100644 test/generated/next/businessPartnerContacts/businessPartnerContacts.acl.ts delete mode 100644 test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts delete mode 100644 test/generated/next/businessPartnerContacts/businessPartnerContacts.configs.ts delete mode 100644 test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts delete mode 100644 test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts delete mode 100644 test/generated/next/businessPartners/businessPartners.acl.ts delete mode 100644 test/generated/next/businessPartners/businessPartners.api.ts delete mode 100644 test/generated/next/businessPartners/businessPartners.configs.ts delete mode 100644 test/generated/next/businessPartners/businessPartners.models.ts delete mode 100644 test/generated/next/businessPartners/businessPartners.queries.ts delete mode 100644 test/generated/next/cargoTypes/cargoTypes.acl.ts delete mode 100644 test/generated/next/cargoTypes/cargoTypes.api.ts delete mode 100644 test/generated/next/cargoTypes/cargoTypes.configs.ts delete mode 100644 test/generated/next/cargoTypes/cargoTypes.models.ts delete mode 100644 test/generated/next/cargoTypes/cargoTypes.queries.ts delete mode 100644 test/generated/next/chargeTypes/chargeTypes.acl.ts delete mode 100644 test/generated/next/chargeTypes/chargeTypes.api.ts delete mode 100644 test/generated/next/chargeTypes/chargeTypes.configs.ts delete mode 100644 test/generated/next/chargeTypes/chargeTypes.models.ts delete mode 100644 test/generated/next/chargeTypes/chargeTypes.queries.ts delete mode 100644 test/generated/next/checklistItems/checklistItems.acl.ts delete mode 100644 test/generated/next/checklistItems/checklistItems.api.ts delete mode 100644 test/generated/next/checklistItems/checklistItems.configs.ts delete mode 100644 test/generated/next/checklistItems/checklistItems.models.ts delete mode 100644 test/generated/next/checklistItems/checklistItems.queries.ts delete mode 100644 test/generated/next/checklistTemplates/checklistTemplates.acl.ts delete mode 100644 test/generated/next/checklistTemplates/checklistTemplates.api.ts delete mode 100644 test/generated/next/checklistTemplates/checklistTemplates.configs.ts delete mode 100644 test/generated/next/checklistTemplates/checklistTemplates.models.ts delete mode 100644 test/generated/next/checklistTemplates/checklistTemplates.queries.ts delete mode 100644 test/generated/next/cities/cities.acl.ts delete mode 100644 test/generated/next/cities/cities.api.ts delete mode 100644 test/generated/next/cities/cities.configs.ts delete mode 100644 test/generated/next/cities/cities.models.ts delete mode 100644 test/generated/next/cities/cities.queries.ts delete mode 100644 test/generated/next/common/common.models.ts delete mode 100644 test/generated/next/containerYards/containerYards.acl.ts delete mode 100644 test/generated/next/containerYards/containerYards.api.ts delete mode 100644 test/generated/next/containerYards/containerYards.configs.ts delete mode 100644 test/generated/next/containerYards/containerYards.models.ts delete mode 100644 test/generated/next/containerYards/containerYards.queries.ts delete mode 100644 test/generated/next/controlTowerAuth/controlTowerAuth.api.ts delete mode 100644 test/generated/next/controlTowerAuth/controlTowerAuth.models.ts delete mode 100644 test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts delete mode 100644 test/generated/next/controlTowerBookings/controlTowerBookings.api.ts delete mode 100644 test/generated/next/controlTowerBookings/controlTowerBookings.configs.ts delete mode 100644 test/generated/next/controlTowerBookings/controlTowerBookings.models.ts delete mode 100644 test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts delete mode 100644 test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts delete mode 100644 test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts delete mode 100644 test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts delete mode 100644 test/generated/next/controlTowerContainers/controlTowerContainers.api.ts delete mode 100644 test/generated/next/controlTowerContainers/controlTowerContainers.configs.ts delete mode 100644 test/generated/next/controlTowerContainers/controlTowerContainers.models.ts delete mode 100644 test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts delete mode 100644 test/generated/next/controlTowerMe/controlTowerMe.api.ts delete mode 100644 test/generated/next/controlTowerMe/controlTowerMe.models.ts delete mode 100644 test/generated/next/controlTowerMe/controlTowerMe.queries.ts delete mode 100644 test/generated/next/controlTowerPackages/controlTowerPackages.api.ts delete mode 100644 test/generated/next/controlTowerPackages/controlTowerPackages.configs.ts delete mode 100644 test/generated/next/controlTowerPackages/controlTowerPackages.models.ts delete mode 100644 test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts delete mode 100644 test/generated/next/controlTowerSearch/controlTowerSearch.api.ts delete mode 100644 test/generated/next/controlTowerSearch/controlTowerSearch.models.ts delete mode 100644 test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts delete mode 100644 test/generated/next/countries/countries.acl.ts delete mode 100644 test/generated/next/countries/countries.api.ts delete mode 100644 test/generated/next/countries/countries.configs.ts delete mode 100644 test/generated/next/countries/countries.models.ts delete mode 100644 test/generated/next/countries/countries.queries.ts delete mode 100644 test/generated/next/currencies/currencies.acl.ts delete mode 100644 test/generated/next/currencies/currencies.api.ts delete mode 100644 test/generated/next/currencies/currencies.configs.ts delete mode 100644 test/generated/next/currencies/currencies.models.ts delete mode 100644 test/generated/next/currencies/currencies.queries.ts delete mode 100644 test/generated/next/customerAccount/customerAccount.api.ts delete mode 100644 test/generated/next/customerAccount/customerAccount.models.ts delete mode 100644 test/generated/next/customerAccount/customerAccount.queries.ts delete mode 100644 test/generated/next/customers/customers.acl.ts delete mode 100644 test/generated/next/customers/customers.api.ts delete mode 100644 test/generated/next/customers/customers.configs.ts delete mode 100644 test/generated/next/customers/customers.models.ts delete mode 100644 test/generated/next/customers/customers.queries.ts delete mode 100644 test/generated/next/depots/depots.acl.ts delete mode 100644 test/generated/next/depots/depots.api.ts delete mode 100644 test/generated/next/depots/depots.configs.ts delete mode 100644 test/generated/next/depots/depots.models.ts delete mode 100644 test/generated/next/depots/depots.queries.ts delete mode 100644 test/generated/next/documentTemplates/documentTemplates.acl.ts delete mode 100644 test/generated/next/documentTemplates/documentTemplates.api.ts delete mode 100644 test/generated/next/documentTemplates/documentTemplates.configs.ts delete mode 100644 test/generated/next/documentTemplates/documentTemplates.models.ts delete mode 100644 test/generated/next/documentTemplates/documentTemplates.queries.ts delete mode 100644 test/generated/next/dunningAccountStatement/dunningAccountStatement.acl.ts delete mode 100644 test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts delete mode 100644 test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts delete mode 100644 test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts delete mode 100644 test/generated/next/dunningLevels/dunningLevels.acl.ts delete mode 100644 test/generated/next/dunningLevels/dunningLevels.api.ts delete mode 100644 test/generated/next/dunningLevels/dunningLevels.configs.ts delete mode 100644 test/generated/next/dunningLevels/dunningLevels.models.ts delete mode 100644 test/generated/next/dunningLevels/dunningLevels.queries.ts delete mode 100644 test/generated/next/dunningManagement/dunningManagement.acl.ts delete mode 100644 test/generated/next/dunningManagement/dunningManagement.api.ts delete mode 100644 test/generated/next/dunningManagement/dunningManagement.configs.ts delete mode 100644 test/generated/next/dunningManagement/dunningManagement.models.ts delete mode 100644 test/generated/next/dunningManagement/dunningManagement.queries.ts delete mode 100644 test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts delete mode 100644 test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts delete mode 100644 test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts delete mode 100644 test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts delete mode 100644 test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts delete mode 100644 test/generated/next/dunningSystems/dunningSystems.acl.ts delete mode 100644 test/generated/next/dunningSystems/dunningSystems.api.ts delete mode 100644 test/generated/next/dunningSystems/dunningSystems.configs.ts delete mode 100644 test/generated/next/dunningSystems/dunningSystems.models.ts delete mode 100644 test/generated/next/dunningSystems/dunningSystems.queries.ts delete mode 100644 test/generated/next/employee/employee.acl.ts delete mode 100644 test/generated/next/employee/employee.api.ts delete mode 100644 test/generated/next/employee/employee.configs.ts delete mode 100644 test/generated/next/employee/employee.models.ts delete mode 100644 test/generated/next/employee/employee.queries.ts delete mode 100644 test/generated/next/employeeAccount/employeeAccount.api.ts delete mode 100644 test/generated/next/employeeAccount/employeeAccount.models.ts delete mode 100644 test/generated/next/employeeAccount/employeeAccount.queries.ts delete mode 100644 test/generated/next/employeePermissions/employeePermissions.acl.ts delete mode 100644 test/generated/next/employeePermissions/employeePermissions.api.ts delete mode 100644 test/generated/next/employeePermissions/employeePermissions.configs.ts delete mode 100644 test/generated/next/employeePermissions/employeePermissions.models.ts delete mode 100644 test/generated/next/employeePermissions/employeePermissions.queries.ts delete mode 100644 test/generated/next/employeeProfile/employeeProfile.api.ts delete mode 100644 test/generated/next/employeeProfile/employeeProfile.models.ts delete mode 100644 test/generated/next/employeeProfile/employeeProfile.queries.ts delete mode 100644 test/generated/next/employeeRoles/employeeRoles.acl.ts delete mode 100644 test/generated/next/employeeRoles/employeeRoles.api.ts delete mode 100644 test/generated/next/employeeRoles/employeeRoles.configs.ts delete mode 100644 test/generated/next/employeeRoles/employeeRoles.models.ts delete mode 100644 test/generated/next/employeeRoles/employeeRoles.queries.ts delete mode 100644 test/generated/next/employeeSettings/employeeSettings.api.ts delete mode 100644 test/generated/next/employeeSettings/employeeSettings.models.ts delete mode 100644 test/generated/next/employeeSettings/employeeSettings.queries.ts delete mode 100644 test/generated/next/employment/employment.acl.ts delete mode 100644 test/generated/next/employment/employment.api.ts delete mode 100644 test/generated/next/employment/employment.configs.ts delete mode 100644 test/generated/next/employment/employment.models.ts delete mode 100644 test/generated/next/employment/employment.queries.ts delete mode 100644 test/generated/next/factoringExport/factoringExport.acl.ts delete mode 100644 test/generated/next/factoringExport/factoringExport.api.ts delete mode 100644 test/generated/next/factoringExport/factoringExport.models.ts delete mode 100644 test/generated/next/factoringExport/factoringExport.queries.ts delete mode 100644 test/generated/next/factoringMerge/factoringMerge.acl.ts delete mode 100644 test/generated/next/factoringMerge/factoringMerge.api.ts delete mode 100644 test/generated/next/factoringMerge/factoringMerge.models.ts delete mode 100644 test/generated/next/factoringMerge/factoringMerge.queries.ts delete mode 100644 test/generated/next/files/files.api.ts delete mode 100644 test/generated/next/files/files.models.ts delete mode 100644 test/generated/next/files/files.queries.ts delete mode 100644 test/generated/next/folders/folders.api.ts delete mode 100644 test/generated/next/folders/folders.models.ts delete mode 100644 test/generated/next/folders/folders.queries.ts delete mode 100644 test/generated/next/hsCodes/hsCodes.acl.ts delete mode 100644 test/generated/next/hsCodes/hsCodes.api.ts delete mode 100644 test/generated/next/hsCodes/hsCodes.configs.ts delete mode 100644 test/generated/next/hsCodes/hsCodes.models.ts delete mode 100644 test/generated/next/hsCodes/hsCodes.queries.ts delete mode 100644 test/generated/next/integrationChannels/integrationChannels.acl.ts delete mode 100644 test/generated/next/integrationChannels/integrationChannels.api.ts delete mode 100644 test/generated/next/integrationChannels/integrationChannels.configs.ts delete mode 100644 test/generated/next/integrationChannels/integrationChannels.models.ts delete mode 100644 test/generated/next/integrationChannels/integrationChannels.queries.ts delete mode 100644 test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts delete mode 100644 test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts delete mode 100644 test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts delete mode 100644 test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts delete mode 100644 test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts delete mode 100644 test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts delete mode 100644 test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts delete mode 100644 test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts delete mode 100644 test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts delete mode 100644 test/generated/next/invoicePayments/invoicePayments.acl.ts delete mode 100644 test/generated/next/invoicePayments/invoicePayments.api.ts delete mode 100644 test/generated/next/invoicePayments/invoicePayments.configs.ts delete mode 100644 test/generated/next/invoicePayments/invoicePayments.models.ts delete mode 100644 test/generated/next/invoicePayments/invoicePayments.queries.ts delete mode 100644 test/generated/next/invoices/invoices.acl.ts delete mode 100644 test/generated/next/invoices/invoices.api.ts delete mode 100644 test/generated/next/invoices/invoices.configs.ts delete mode 100644 test/generated/next/invoices/invoices.models.ts delete mode 100644 test/generated/next/invoices/invoices.queries.ts delete mode 100644 test/generated/next/masterData/masterData.acl.ts delete mode 100644 test/generated/next/masterData/masterData.api.ts delete mode 100644 test/generated/next/masterData/masterData.configs.ts delete mode 100644 test/generated/next/masterData/masterData.models.ts delete mode 100644 test/generated/next/masterData/masterData.queries.ts delete mode 100644 test/generated/next/masterDataImport/masterDataImport.acl.ts delete mode 100644 test/generated/next/masterDataImport/masterDataImport.api.ts delete mode 100644 test/generated/next/masterDataImport/masterDataImport.models.ts delete mode 100644 test/generated/next/masterDataImport/masterDataImport.queries.ts delete mode 100644 test/generated/next/offices/offices.acl.ts delete mode 100644 test/generated/next/offices/offices.api.ts delete mode 100644 test/generated/next/offices/offices.configs.ts delete mode 100644 test/generated/next/offices/offices.models.ts delete mode 100644 test/generated/next/offices/offices.queries.ts delete mode 100644 test/generated/next/packageTypes/packageTypes.acl.ts delete mode 100644 test/generated/next/packageTypes/packageTypes.api.ts delete mode 100644 test/generated/next/packageTypes/packageTypes.configs.ts delete mode 100644 test/generated/next/packageTypes/packageTypes.models.ts delete mode 100644 test/generated/next/packageTypes/packageTypes.queries.ts delete mode 100644 test/generated/next/partnerNetworks/partnerNetworks.acl.ts delete mode 100644 test/generated/next/partnerNetworks/partnerNetworks.api.ts delete mode 100644 test/generated/next/partnerNetworks/partnerNetworks.configs.ts delete mode 100644 test/generated/next/partnerNetworks/partnerNetworks.models.ts delete mode 100644 test/generated/next/partnerNetworks/partnerNetworks.queries.ts delete mode 100644 test/generated/next/paymentConfirmations/paymentConfirmations.acl.ts delete mode 100644 test/generated/next/paymentConfirmations/paymentConfirmations.api.ts delete mode 100644 test/generated/next/paymentConfirmations/paymentConfirmations.configs.ts delete mode 100644 test/generated/next/paymentConfirmations/paymentConfirmations.models.ts delete mode 100644 test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts delete mode 100644 test/generated/next/ports/ports.acl.ts delete mode 100644 test/generated/next/ports/ports.api.ts delete mode 100644 test/generated/next/ports/ports.configs.ts delete mode 100644 test/generated/next/ports/ports.models.ts delete mode 100644 test/generated/next/ports/ports.queries.ts delete mode 100644 test/generated/next/positionAccount/positionAccount.acl.ts delete mode 100644 test/generated/next/positionAccount/positionAccount.api.ts delete mode 100644 test/generated/next/positionAccount/positionAccount.models.ts delete mode 100644 test/generated/next/positionAccount/positionAccount.queries.ts delete mode 100644 test/generated/next/positionAccountItems/positionAccountItems.acl.ts delete mode 100644 test/generated/next/positionAccountItems/positionAccountItems.api.ts delete mode 100644 test/generated/next/positionAccountItems/positionAccountItems.models.ts delete mode 100644 test/generated/next/positionAccountItems/positionAccountItems.queries.ts delete mode 100644 test/generated/next/positionCargo/positionCargo.acl.ts delete mode 100644 test/generated/next/positionCargo/positionCargo.api.ts delete mode 100644 test/generated/next/positionCargo/positionCargo.configs.ts delete mode 100644 test/generated/next/positionCargo/positionCargo.models.ts delete mode 100644 test/generated/next/positionCargo/positionCargo.queries.ts delete mode 100644 test/generated/next/positionCargoPackage/positionCargoPackage.acl.ts delete mode 100644 test/generated/next/positionCargoPackage/positionCargoPackage.api.ts delete mode 100644 test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts delete mode 100644 test/generated/next/positionChecklist/positionChecklist.acl.ts delete mode 100644 test/generated/next/positionChecklist/positionChecklist.api.ts delete mode 100644 test/generated/next/positionChecklist/positionChecklist.models.ts delete mode 100644 test/generated/next/positionChecklist/positionChecklist.queries.ts delete mode 100644 test/generated/next/positionInvolvedParties/positionInvolvedParties.acl.ts delete mode 100644 test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts delete mode 100644 test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts delete mode 100644 test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts delete mode 100644 test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts delete mode 100644 test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts delete mode 100644 test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts delete mode 100644 test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts delete mode 100644 test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts delete mode 100644 test/generated/next/positionRoutes/positionRoutes.acl.ts delete mode 100644 test/generated/next/positionRoutes/positionRoutes.api.ts delete mode 100644 test/generated/next/positionRoutes/positionRoutes.queries.ts delete mode 100644 test/generated/next/positions/positions.acl.ts delete mode 100644 test/generated/next/positions/positions.api.ts delete mode 100644 test/generated/next/positions/positions.configs.ts delete mode 100644 test/generated/next/positions/positions.models.ts delete mode 100644 test/generated/next/positions/positions.queries.ts delete mode 100644 test/generated/next/projectLite/projectLite.acl.ts delete mode 100644 test/generated/next/projectLite/projectLite.api.ts delete mode 100644 test/generated/next/projectLite/projectLite.configs.ts delete mode 100644 test/generated/next/projectLite/projectLite.models.ts delete mode 100644 test/generated/next/projectLite/projectLite.queries.ts delete mode 100644 test/generated/next/queryModules.ts delete mode 100644 test/generated/next/quoteAccount/quoteAccount.acl.ts delete mode 100644 test/generated/next/quoteAccount/quoteAccount.api.ts delete mode 100644 test/generated/next/quoteAccount/quoteAccount.models.ts delete mode 100644 test/generated/next/quoteAccount/quoteAccount.queries.ts delete mode 100644 test/generated/next/quoteCargo/quoteCargo.acl.ts delete mode 100644 test/generated/next/quoteCargo/quoteCargo.api.ts delete mode 100644 test/generated/next/quoteCargo/quoteCargo.configs.ts delete mode 100644 test/generated/next/quoteCargo/quoteCargo.models.ts delete mode 100644 test/generated/next/quoteCargo/quoteCargo.queries.ts delete mode 100644 test/generated/next/quoteCargoPackage/quoteCargoPackage.acl.ts delete mode 100644 test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts delete mode 100644 test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts delete mode 100644 test/generated/next/quoteConversion/quoteConversion.acl.ts delete mode 100644 test/generated/next/quoteConversion/quoteConversion.api.ts delete mode 100644 test/generated/next/quoteConversion/quoteConversion.models.ts delete mode 100644 test/generated/next/quoteConversion/quoteConversion.queries.ts delete mode 100644 test/generated/next/quoteDocument/quoteDocument.acl.ts delete mode 100644 test/generated/next/quoteDocument/quoteDocument.api.ts delete mode 100644 test/generated/next/quoteDocument/quoteDocument.models.ts delete mode 100644 test/generated/next/quoteDocument/quoteDocument.queries.ts delete mode 100644 test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts delete mode 100644 test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts delete mode 100644 test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts delete mode 100644 test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts delete mode 100644 test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts delete mode 100644 test/generated/next/quoteRoutes/quoteRoutes.acl.ts delete mode 100644 test/generated/next/quoteRoutes/quoteRoutes.api.ts delete mode 100644 test/generated/next/quoteRoutes/quoteRoutes.queries.ts delete mode 100644 test/generated/next/quotes/quotes.acl.ts delete mode 100644 test/generated/next/quotes/quotes.api.ts delete mode 100644 test/generated/next/quotes/quotes.configs.ts delete mode 100644 test/generated/next/quotes/quotes.models.ts delete mode 100644 test/generated/next/quotes/quotes.queries.ts delete mode 100644 test/generated/next/remarkTemplates/remarkTemplates.acl.ts delete mode 100644 test/generated/next/remarkTemplates/remarkTemplates.api.ts delete mode 100644 test/generated/next/remarkTemplates/remarkTemplates.configs.ts delete mode 100644 test/generated/next/remarkTemplates/remarkTemplates.models.ts delete mode 100644 test/generated/next/remarkTemplates/remarkTemplates.queries.ts delete mode 100644 test/generated/next/roadQuotes/roadQuotes.acl.ts delete mode 100644 test/generated/next/roadQuotes/roadQuotes.api.ts delete mode 100644 test/generated/next/roadQuotes/roadQuotes.models.ts delete mode 100644 test/generated/next/roadQuotes/roadQuotes.queries.ts delete mode 100644 test/generated/next/seaPositions/seaPositions.acl.ts delete mode 100644 test/generated/next/seaPositions/seaPositions.api.ts delete mode 100644 test/generated/next/seaPositions/seaPositions.models.ts delete mode 100644 test/generated/next/seaPositions/seaPositions.queries.ts delete mode 100644 test/generated/next/seaQuotes/seaQuotes.acl.ts delete mode 100644 test/generated/next/seaQuotes/seaQuotes.api.ts delete mode 100644 test/generated/next/seaQuotes/seaQuotes.models.ts delete mode 100644 test/generated/next/seaQuotes/seaQuotes.queries.ts delete mode 100644 test/generated/next/shippingInstructions/shippingInstructions.acl.ts delete mode 100644 test/generated/next/shippingInstructions/shippingInstructions.api.ts delete mode 100644 test/generated/next/shippingInstructions/shippingInstructions.models.ts delete mode 100644 test/generated/next/shippingInstructions/shippingInstructions.queries.ts delete mode 100644 test/generated/next/terminals/terminals.acl.ts delete mode 100644 test/generated/next/terminals/terminals.api.ts delete mode 100644 test/generated/next/terminals/terminals.configs.ts delete mode 100644 test/generated/next/terminals/terminals.models.ts delete mode 100644 test/generated/next/terminals/terminals.queries.ts delete mode 100644 test/generated/next/useCrossTabQueryInvalidation.ts delete mode 100644 test/generated/next/useMutationEffects.ts delete mode 100644 test/generated/next/userActivity/userActivity.api.ts delete mode 100644 test/generated/next/userActivity/userActivity.models.ts delete mode 100644 test/generated/next/userActivity/userActivity.queries.ts delete mode 100644 test/generated/next/vatRules/vatRules.acl.ts delete mode 100644 test/generated/next/vatRules/vatRules.api.ts delete mode 100644 test/generated/next/vatRules/vatRules.configs.ts delete mode 100644 test/generated/next/vatRules/vatRules.models.ts delete mode 100644 test/generated/next/vatRules/vatRules.queries.ts delete mode 100644 test/generated/next/warehouses/warehouses.acl.ts delete mode 100644 test/generated/next/warehouses/warehouses.api.ts delete mode 100644 test/generated/next/warehouses/warehouses.configs.ts delete mode 100644 test/generated/next/warehouses/warehouses.models.ts delete mode 100644 test/generated/next/warehouses/warehouses.queries.ts delete mode 100644 test/generated/next/workingDocuments/workingDocuments.acl.ts delete mode 100644 test/generated/next/workingDocuments/workingDocuments.api.ts delete mode 100644 test/generated/next/workingDocuments/workingDocuments.configs.ts delete mode 100644 test/generated/next/workingDocuments/workingDocuments.models.ts delete mode 100644 test/generated/next/workingDocuments/workingDocuments.queries.ts delete mode 100644 test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts delete mode 100644 test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts delete mode 100644 test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts delete mode 100644 test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts delete mode 100644 test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts delete mode 100644 test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts delete mode 100644 test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts delete mode 100644 test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts delete mode 100644 test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts delete mode 100644 test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts delete mode 100644 test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts delete mode 100644 test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts delete mode 100644 test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts delete mode 100644 test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts delete mode 100644 test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts delete mode 100644 test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts delete mode 100644 test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts delete mode 100644 test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts delete mode 100644 test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts delete mode 100644 test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts delete mode 100644 test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts delete mode 100644 test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts delete mode 100644 test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts delete mode 100644 test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts delete mode 100644 test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts delete mode 100644 test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts delete mode 100644 test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts delete mode 100644 test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts delete mode 100644 test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts delete mode 100644 test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts delete mode 100644 test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts delete mode 100644 test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts delete mode 100644 test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts delete mode 100644 test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts delete mode 100644 test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts delete mode 100644 test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts delete mode 100644 test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts delete mode 100644 test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts delete mode 100644 test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts delete mode 100644 test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts delete mode 100644 test/generated/next/zod.extended.ts delete mode 100644 test/generated/tmp-models-common-v2/acl/app.ability.ts delete mode 100644 test/generated/tmp-models-common-v2/acl/useAclCheck.ts delete mode 100644 test/generated/tmp-models-common-v2/app-rest-client.ts delete mode 100644 test/generated/tmp-models-common-v2/common/common.models.ts delete mode 100644 test/generated/tmp-models-common-v2/pet/pet.api.ts delete mode 100644 test/generated/tmp-models-common-v2/pet/pet.models.ts delete mode 100644 test/generated/tmp-models-common-v2/pet/pet.queries.ts delete mode 100644 test/generated/tmp-models-common-v2/queryModules.ts delete mode 100644 test/generated/tmp-models-common-v2/store/store.api.ts delete mode 100644 test/generated/tmp-models-common-v2/store/store.models.ts delete mode 100644 test/generated/tmp-models-common-v2/store/store.queries.ts delete mode 100644 test/generated/tmp-models-common-v2/useCrossTabQueryInvalidation.ts delete mode 100644 test/generated/tmp-models-common-v2/useMutationEffects.ts delete mode 100644 test/generated/tmp-models-common-v2/user/user.api.ts delete mode 100644 test/generated/tmp-models-common-v2/user/user.models.ts delete mode 100644 test/generated/tmp-models-common-v2/user/user.queries.ts delete mode 100644 test/generated/tmp-models-common-v2/zod.extended.ts delete mode 100644 test/generated/tmp-models-common/.openapi-codegen-cache.json delete mode 100644 test/generated/tmp-models-common/acl/app.ability.ts delete mode 100644 test/generated/tmp-models-common/acl/useAclCheck.ts delete mode 100644 test/generated/tmp-models-common/app-rest-client.ts delete mode 100644 test/generated/tmp-models-common/common/common.models.ts delete mode 100644 test/generated/tmp-models-common/pet/pet.api.ts delete mode 100644 test/generated/tmp-models-common/pet/pet.models.ts delete mode 100644 test/generated/tmp-models-common/pet/pet.queries.ts delete mode 100644 test/generated/tmp-models-common/queryModules.ts delete mode 100644 test/generated/tmp-models-common/store/store.api.ts delete mode 100644 test/generated/tmp-models-common/store/store.models.ts delete mode 100644 test/generated/tmp-models-common/store/store.queries.ts delete mode 100644 test/generated/tmp-models-common/useCrossTabQueryInvalidation.ts delete mode 100644 test/generated/tmp-models-common/useMutationEffects.ts delete mode 100644 test/generated/tmp-models-common/user/user.api.ts delete mode 100644 test/generated/tmp-models-common/user/user.models.ts delete mode 100644 test/generated/tmp-models-common/user/user.queries.ts delete mode 100644 test/generated/tmp-models-common/zod.extended.ts delete mode 100644 test/generated/tmp-onerror/.openapi-codegen-cache.json delete mode 100644 test/generated/tmp-onerror/acl/app.ability.ts delete mode 100644 test/generated/tmp-onerror/acl/useAclCheck.ts delete mode 100644 test/generated/tmp-onerror/app-rest-client.ts delete mode 100644 test/generated/tmp-onerror/pet/pet.api.ts delete mode 100644 test/generated/tmp-onerror/pet/pet.models.ts delete mode 100644 test/generated/tmp-onerror/pet/pet.queries.ts delete mode 100644 test/generated/tmp-onerror/queryModules.ts delete mode 100644 test/generated/tmp-onerror/store/store.api.ts delete mode 100644 test/generated/tmp-onerror/store/store.models.ts delete mode 100644 test/generated/tmp-onerror/store/store.queries.ts delete mode 100644 test/generated/tmp-onerror/useCrossTabQueryInvalidation.ts delete mode 100644 test/generated/tmp-onerror/useMutationEffects.ts delete mode 100644 test/generated/tmp-onerror/user/user.api.ts delete mode 100644 test/generated/tmp-onerror/user/user.models.ts delete mode 100644 test/generated/tmp-onerror/user/user.queries.ts delete mode 100644 test/generated/tmp-onerror/zod.extended.ts diff --git a/.gitignore b/.gitignore index d6b77ec..31ef6e0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ !.yarn/releases !.yarn/sdks +/test/generated/ /output /dist diff --git a/test/generated/.gitkeep b/test/generated/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/test/generated/base/aWBStocks/aWBStocks.acl.ts b/test/generated/base/aWBStocks/aWBStocks.acl.ts deleted file mode 100644 index ab8512e..0000000 --- a/test/generated/base/aWBStocks/aWBStocks.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace AWBStocksAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List AWB stocks - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Create", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get AWB stock details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useGenerateNextNumber` mutation ability. For global ability, omit the object parameter. - * @description Generate next AWB number - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateNextNumber` mutation - */ -export const canUseGenerateNextNumber = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -} diff --git a/test/generated/base/aWBStocks/aWBStocks.api.ts b/test/generated/base/aWBStocks/aWBStocks.api.ts deleted file mode 100644 index 47097eb..0000000 --- a/test/generated/base/aWBStocks/aWBStocks.api.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { AWBStocksModels } from "./aWBStocks.models"; - -export namespace AWBStocksApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, - `/offices/${officeId}/awb-stocks`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: AWBStocksModels.CreateAWBStockRequestDTO, ) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks`, - ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), - - ) -}; -export const findById = (stockId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}`, - - ) -}; -export const update = (stockId: string, officeId: string, data: AWBStocksModels.UpdateAWBStockRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}`, - ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), - - ) -}; -export const archive = (stockId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}/archive`, - - ) -}; -export const unarchive = (stockId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, - - ) -}; -export const generateNextNumber = (officeId: string, data: AWBStocksModels.GenerateAWBNumberRequestDTO, ) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/generate-number`, - ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/aWBStocks/aWBStocks.configs.ts b/test/generated/base/aWBStocks/aWBStocks.configs.ts deleted file mode 100644 index 66cd58d..0000000 --- a/test/generated/base/aWBStocks/aWBStocks.configs.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { AWBStocksModels } from "./aWBStocks.models"; -import { AWBStocksQueries } from "./aWBStocks.queries"; -import { AWBStocksAcl } from "./aWBStocks.acl"; - -export namespace AWBStocksConfigs { -export const awbStocksConfig = { - meta: { - title: "Awb Stocks", - }, - readAll: { - acl: AWBStocksAcl.canUsePaginate, - schema: AWBStocksModels.AWBStockResponseDTOSchema, - paginated: AWBStocksQueries.usePaginate, - infinite: AWBStocksQueries.usePaginateInfinite, - filters: { - schema: AWBStocksModels.AWBStockFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AWBStocksModels.AWBStockFilterDtoSchema, - options: { - inputs: { - archived: true, - carrierId: true, - searchQuery: true, - used: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: AWBStocksModels.AWBStockResponseDTOSchema, - options: { - columns: { - id: true, - carrier: true, - startNumber: true, - lastUsedNumber: true, - stock: true, - usedCodes: true, - priority: true, - archived: true, - comments: true, - createdAt: true, - updatedAt: true, - createdBy: true, - updatedBy: true, - officeId: true, - }, - sortable: AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: AWBStocksAcl.canUseFindById, - schema: AWBStocksModels.AWBStockResponseDTOSchema, - query: AWBStocksQueries.useFindById, - }, - create: { - acl: AWBStocksAcl.canUseCreate, - schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, - mutation: AWBStocksQueries.useCreate, - inputDefs: dynamicInputs({ - schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, - options: { - inputs: { - carrierId: true, - startNumber: true, - stock: true, - priority: true, - comments: true, - officeId: true, - }, - }, -}) - }, - update: { - acl: AWBStocksAcl.canUseUpdate, - schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, - mutation: AWBStocksQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, - options: { - inputs: { - comments: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/base/aWBStocks/aWBStocks.models.ts b/test/generated/base/aWBStocks/aWBStocks.models.ts deleted file mode 100644 index 2d817fa..0000000 --- a/test/generated/base/aWBStocks/aWBStocks.models.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace AWBStocksModels { -/** - * AWBStockBusinessPartnerPreviewDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } name Business partner name - * @property { string } carrierPrefix Carrier prefix (3 digits) - */ -export const AWBStockBusinessPartnerPreviewDTOSchema = z.object({ id: z.string(), name: z.string(), carrierPrefix: z.string() }); -export type AWBStockBusinessPartnerPreviewDTO = z.infer; - -/** - * AWBStockEmployeePreviewDTOSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Employee email - */ -export const AWBStockEmployeePreviewDTOSchema = z.object({ id: z.string(), email: z.string() }); -export type AWBStockEmployeePreviewDTO = z.infer; - -/** - * AWBStockResponseDTOSchema - * @type { object } - * @property { string } id AWB stock ID - * @property { AWBStockBusinessPartnerPreviewDTO } carrier Carrier business partner - * @property { number } startNumber Start number - * @property { number } lastUsedNumber Last used number - * @property { number } stock Stock size - * @property { number } usedCodes Used codes count - * @property { number } priority Priority - * @property { boolean } archived Is archived - * @property { string } comments Comments - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { AWBStockEmployeePreviewDTO } createdBy User who created the stock - * @property { AWBStockEmployeePreviewDTO } updatedBy User who updated the stock - * @property { string } officeId Office ID - */ -export const AWBStockResponseDTOSchema = z.object({ id: z.string(), carrier: AWBStockBusinessPartnerPreviewDTOSchema, startNumber: z.number(), lastUsedNumber: z.number().nullish(), stock: z.number(), usedCodes: z.number(), priority: z.number(), archived: z.boolean(), comments: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: AWBStockEmployeePreviewDTOSchema, updatedBy: AWBStockEmployeePreviewDTOSchema.nullish(), officeId: z.string() }); -export type AWBStockResponseDTO = z.infer; - -/** - * AWBStockFilterDtoSchema - * @type { object } - * @property { boolean } archived - * @property { string } carrierId - * @property { string } searchQuery - * @property { boolean } used - */ -export const AWBStockFilterDtoSchema = z.object({ archived: z.boolean().nullable(), carrierId: z.string().nullable(), searchQuery: z.string().nullable(), used: z.boolean().nullable() }).partial(); -export type AWBStockFilterDto = z.infer; - -/** - * CreateAWBStockRequestDTOSchema - * @type { object } - * @property { string } carrierId Carrier business partner ID - * @property { number } startNumber Start number. Minimum: `0` - * @property { number } stock Stock size - * @property { number } priority Priority - * @property { string } comments Comments - * @property { string } officeId Office ID - */ -export const CreateAWBStockRequestDTOSchema = z.object({ carrierId: z.string(), startNumber: z.number().gte(0), stock: z.number(), priority: z.number(), comments: z.string().nullish(), officeId: z.string() }); -export type CreateAWBStockRequestDTO = z.infer; - -/** - * GenerateAWBNumberRequestDTOSchema - * @type { object } - * @property { string } carrierId Carrier ID. Example: `e847c7dd-a364-4488-bed6-1e5878aff022` - */ -export const GenerateAWBNumberRequestDTOSchema = z.object({ carrierId: z.string() }); -export type GenerateAWBNumberRequestDTO = z.infer; - -/** - * GenerateAWBNumberResponseDTOSchema - * @type { object } - * @property { string } formattedAwbNumber Generated AWB number. Example: `123-45678901` - */ -export const GenerateAWBNumberResponseDTOSchema = z.object({ formattedAwbNumber: z.string() }); -export type GenerateAWBNumberResponseDTO = z.infer; - -/** - * UpdateAWBStockRequestDTOSchema - * @type { object } - * @property { string } comments Comments - */ -export const UpdateAWBStockRequestDTOSchema = z.object({ comments: z.string().nullable() }).partial(); -export type UpdateAWBStockRequestDTO = z.infer; - -/** - * AWBStocksPaginateOrderParamEnumSchema - * @type { enum } - */ -export const AWBStocksPaginateOrderParamEnumSchema = z.enum(["createdAt", "updatedAt", "createdBy", "updatedBy", "carrierName", "startNumber", "priority"]); -export type AWBStocksPaginateOrderParamEnum = z.infer; -export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSchema.enum; - -/** - * AWBStocksPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { AWBStockResponseDTO[] } items - */ -export const AWBStocksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AWBStockResponseDTOSchema).nullable() }).partial().shape }); -export type AWBStocksPaginateResponse = z.infer; - -} diff --git a/test/generated/base/aWBStocks/aWBStocks.queries.ts b/test/generated/base/aWBStocks/aWBStocks.queries.ts deleted file mode 100644 index 7efe73d..0000000 --- a/test/generated/base/aWBStocks/aWBStocks.queries.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AWBStocksAcl } from "./aWBStocks.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AWBStocksModels } from "./aWBStocks.models"; -import { AWBStocksApi } from "./aWBStocks.api"; - -export namespace AWBStocksQueries { -export const moduleName = QueryModule.AWBStocks; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (stockId: string, officeId: string) => [...keys.all, "/offices/:officeId/awb-stocks/:stockId", stockId, officeId] as const, -}; - -/** - * Query `usePaginate` - * @summary List AWB stocks - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` - * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); - return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary List AWB stocks - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` - * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); - return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create AWB stock - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.CreateAWBStockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(AWBStocksAcl.canUseCreate({ officeId } )); - return AWBStocksApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get AWB stock details - * @permission Requires `canUseFindById` ability - * @param { string } object.stockId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ stockId, officeId }: { stockId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(stockId, officeId), - queryFn: () => { - checkAcl(AWBStocksAcl.canUseFindById({ officeId } )); - return AWBStocksApi.findById(stockId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update AWB stock comments - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.UpdateAWBStockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId, data }) => { - checkAcl(AWBStocksAcl.canUseUpdate({ officeId } )); - return AWBStocksApi.update(stockId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive AWB stock - * @permission Requires `canUseArchive` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId }) => { - checkAcl(AWBStocksAcl.canUseArchive({ officeId } )); - return AWBStocksApi.archive(stockId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive AWB stock - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId }) => { - checkAcl(AWBStocksAcl.canUseUnarchive({ officeId } )); - return AWBStocksApi.unarchive(stockId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateNextNumber` - * @summary Generate next AWB number for carrier - * @permission Requires `canUseGenerateNextNumber` ability - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.GenerateAWBNumberRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateNextNumber = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId } )); - return AWBStocksApi.generateNextNumber(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/acl/app.ability.ts b/test/generated/base/acl/app.ability.ts deleted file mode 100644 index 7b598a8..0000000 --- a/test/generated/base/acl/app.ability.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { PureAbility, AbilityTuple, ForcedSubject } from "@casl/ability"; - -export type AppAbilities = -| AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, } | "Office" | "Currency" | "Country" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | ForcedSubject<"Role"> & { context?: string, } | "Permission" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId?: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, } | ForcedSubject<"Office"> & { officeId: string, }> -| AbilityTuple<"Create", "Office" | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "Airport" | "Port" | "ContainerYard" | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> -| AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, } | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }> -| AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "PackageType" | "ChargeType" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> -| AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "Terminal" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }> -| AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }> -| AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> -| AbilityTuple<"ListRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> -| AbilityTuple<"UpdateRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> -| AbilityTuple<"Deactivate", "Customer"> -| AbilityTuple<"Reactivate", "Customer"> -| AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, } | "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }> -| AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> -| AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }> -| AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }> - -export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/base/acl/useAclCheck.ts b/test/generated/base/acl/useAclCheck.ts deleted file mode 100644 index 723069f..0000000 --- a/test/generated/base/acl/useAclCheck.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; -import { type ErrorHandler, SharedErrorHandler } from ""; -import { AbilityContext } from ""; -import { useCallback } from "react"; -import { AppAbilities } from "@/data/acl/app.ability"; - -interface UseAclCheckProps { - errorHandler?: ErrorHandler; -} - -export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { - const ability = AbilityContext.useAbility(); - - const checkAcl = useCallback((appAbility: AppAbilities) => { - if (!ability.can(...(appAbility as AbilityTuple))) { - (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); - } - }, [ability, errorHandler]); - - return { checkAcl }; -} diff --git a/test/generated/base/airPositions/airPositions.acl.ts b/test/generated/base/airPositions/airPositions.acl.ts deleted file mode 100644 index 6c0afca..0000000 --- a/test/generated/base/airPositions/airPositions.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace AirPositionsAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get air position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update air position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/base/airPositions/airPositions.api.ts b/test/generated/base/airPositions/airPositions.api.ts deleted file mode 100644 index 5b8e89a..0000000 --- a/test/generated/base/airPositions/airPositions.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { AirPositionsModels } from "./airPositions.models"; - -export namespace AirPositionsApi { -export const get = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/air-position`, - - ) -}; -export const update = (officeId: string, positionId: string, data: AirPositionsModels.UpdateAirPositionRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/air-position`, - ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/airPositions/airPositions.models.ts b/test/generated/base/airPositions/airPositions.models.ts deleted file mode 100644 index bd514c5..0000000 --- a/test/generated/base/airPositions/airPositions.models.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { z } from "zod"; - -export namespace AirPositionsModels { -/** - * AirPositionCustomsStatusTypeEnumSchema - * @type { enum } - */ -export const AirPositionCustomsStatusTypeEnumSchema = z.enum(["Other", "X", "C", "TD", "T1"]); -export type AirPositionCustomsStatusTypeEnum = z.infer; -export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnumSchema.enum; - -/** - * AirPositionResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } hawbNumber - * @property { string } mawbNumber - * @property { string } airlineDeadline - * @property { string } customsStatus - * @property { AirPositionCustomsStatusTypeEnum } customsStatusType - * @property { boolean } hawbRequired - * @property { boolean } mawbRequired - * @property { string } mrnT1Number - * @property { boolean } isCourier - * @property { string } deliveryToConsignee - * @property { string } createdAt - * @property { string } updatedAt - */ -export const AirPositionResponseDTOSchema = z.object({ id: z.string(), hawbNumber: z.string().nullish(), mawbNumber: z.string().nullish(), airlineDeadline: z.iso.datetime({ offset: true }).nullish(), customsStatus: z.string().nullish(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), mrnT1Number: z.string().nullish(), isCourier: z.boolean().nullish(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }); -export type AirPositionResponseDTO = z.infer; - -/** - * UpdateAirPositionRequestDTOSchema - * @type { object } - * @property { string } hawbNumber - * @property { string } mawbNumber - * @property { string } airlineDeadline - * @property { string } customsStatus - * @property { AirPositionCustomsStatusTypeEnum } customsStatusType - * @property { string } mrnT1Number - * @property { boolean } hawbRequired - * @property { boolean } mawbRequired - * @property { boolean } isCourier - * @property { string } deliveryToConsignee - */ -export const UpdateAirPositionRequestDTOSchema = z.object({ hawbNumber: z.string().nullable(), mawbNumber: z.string().nullable(), airlineDeadline: z.iso.datetime({ offset: true }).nullable(), customsStatus: z.string().nullable(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullable(), mrnT1Number: z.string().nullable(), hawbRequired: z.boolean().nullable(), mawbRequired: z.boolean().nullable(), isCourier: z.boolean().nullable(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type UpdateAirPositionRequestDTO = z.infer; - -} diff --git a/test/generated/base/airPositions/airPositions.queries.ts b/test/generated/base/airPositions/airPositions.queries.ts deleted file mode 100644 index 3671950..0000000 --- a/test/generated/base/airPositions/airPositions.queries.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AirPositionsAcl } from "./airPositions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AirPositionsModels } from "./airPositions.models"; -import { AirPositionsApi } from "./airPositions.api"; - -export namespace AirPositionsQueries { -export const moduleName = QueryModule.AirPositions; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/air-position", officeId, positionId] as const, -}; - -/** - * Query `useGet` - * @summary Get air position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(AirPositionsAcl.canUseGet({ officeId } )); - return AirPositionsApi.get(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update air position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AirPositionsModels.UpdateAirPositionRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(AirPositionsAcl.canUseUpdate({ officeId } )); - return AirPositionsApi.update(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/airports/airports.acl.ts b/test/generated/base/airports/airports.acl.ts deleted file mode 100644 index 1af795c..0000000 --- a/test/generated/base/airports/airports.acl.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace AirportsAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Airport" -] as AbilityTuple<"Read", "Airport">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Airport" -] as AbilityTuple<"Create", "Airport">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Airport" -] as AbilityTuple<"Read", "Airport">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Airport" -] as AbilityTuple<"Update", "Airport">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Airport" -] as AbilityTuple<"Read", "Airport">; - -} diff --git a/test/generated/base/airports/airports.api.ts b/test/generated/base/airports/airports.api.ts deleted file mode 100644 index efd1d01..0000000 --- a/test/generated/base/airports/airports.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { AirportsModels } from "./airports.models"; - -export namespace AirportsApi { -export const paginate = (limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: AirportsModels.AirportsPaginateResponseSchema }, - `/airports`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: AirportsModels.CreateAirportRequestDTO, ) => { - return AppRestClient.post( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports`, - ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, - `/airports/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports/${id}`, - ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports/${id}`, - - ) -}; -} diff --git a/test/generated/base/airports/airports.configs.ts b/test/generated/base/airports/airports.configs.ts deleted file mode 100644 index 9b47119..0000000 --- a/test/generated/base/airports/airports.configs.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { AirportsModels } from "./airports.models"; -import { CommonModels } from "@/data/common/common.models"; -import { AirportsQueries } from "./airports.queries"; -import { AirportsAcl } from "./airports.acl"; - -export namespace AirportsConfigs { -export const airportsConfig = { - meta: { - title: "Airports", - }, - readAll: { - acl: AirportsAcl.canUsePaginate, - schema: AirportsModels.AirportResponseDTOSchema, - paginated: AirportsQueries.usePaginate, - infinite: AirportsQueries.usePaginateInfinite, - filters: { - schema: AirportsModels.AirportPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AirportsModels.AirportPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: AirportsModels.AirportResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - iataCode: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: AirportsModels.AirportsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: AirportsAcl.canUseFindById, - schema: AirportsModels.AirportResponseDTOSchema, - query: AirportsQueries.useFindById, - }, - create: { - acl: AirportsAcl.canUseCreate, - schema: AirportsModels.CreateAirportRequestDTOSchema, - mutation: AirportsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: AirportsModels.CreateAirportRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - iataCode: true, - }, - }, -}) - }, - update: { - acl: AirportsAcl.canUseUpdate, - schema: AirportsModels.UpdateAirportRequestDTOSchema, - mutation: AirportsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: AirportsModels.UpdateAirportRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - iataCode: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: AirportsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: AirportsQueries.usePaginateLabels, - infinite: AirportsQueries.usePaginateLabelsInfinite, - filters: { - schema: AirportsModels.AirportLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AirportsModels.AirportLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/airports/airports.models.ts b/test/generated/base/airports/airports.models.ts deleted file mode 100644 index 6d862c1..0000000 --- a/test/generated/base/airports/airports.models.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace AirportsModels { -/** - * AirportEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type AirportEmployeeDTO = z.infer; - -/** - * AirportResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the airport - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - * @property { string } createdById - * @property { AirportEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { AirportEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const AirportResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), iataCode: z.string(), createdById: z.string().nullish(), createdBy: AirportEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: AirportEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type AirportResponseDTO = z.infer; - -/** - * AirportPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter airports by name, match code or IATA code - */ -export const AirportPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type AirportPaginationFilterDto = z.infer; - -/** - * AirportLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const AirportLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type AirportLabelFilterDto = z.infer; - -/** - * CreateAirportRequestDTOSchema - * @type { object } - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - */ -export const CreateAirportRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), iataCode: z.string() }); -export type CreateAirportRequestDTO = z.infer; - -/** - * UpdateAirportRequestDTOSchema - * @type { object } - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - */ -export const UpdateAirportRequestDTOSchema = z.object({ name: z.string().nullable(), matchCode: z.string().nullable(), iataCode: z.string().nullable() }).partial(); -export type UpdateAirportRequestDTO = z.infer; - -/** - * AirportsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const AirportsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type AirportsPaginateOrderParamEnum = z.infer; -export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSchema.enum; - -/** - * AirportsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { AirportResponseDTO[] } items - */ -export const AirportsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AirportResponseDTOSchema).nullable() }).partial().shape }); -export type AirportsPaginateResponse = z.infer; - -/** - * AirportsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const AirportsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type AirportsPaginateLabelsOrderParamEnum = z.infer; -export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * AirportsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const AirportsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type AirportsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/airports/airports.queries.ts b/test/generated/base/airports/airports.queries.ts deleted file mode 100644 index 47b06ab..0000000 --- a/test/generated/base/airports/airports.queries.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AirportsAcl } from "./airports.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AirportsModels } from "./airports.models"; -import { AirportsApi } from "./airports.api"; - -export namespace AirportsQueries { -export const moduleName = QueryModule.Airports; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string) => [...keys.all, "/airports", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string) => [...keys.all, "/airports/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/airports/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Airports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Airports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create airport - * @permission Requires `canUseCreate` ability - * @param { AirportsModels.CreateAirportRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(AirportsAcl.canUseCreate()); - return AirportsApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate airports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate airports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update airport - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { AirportsModels.UpdateAirportRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(AirportsAcl.canUseUpdate()); - return AirportsApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get airport - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(AirportsAcl.canUseFindById()); - return AirportsApi.findById(id) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/app-rest-client.ts b/test/generated/base/app-rest-client.ts deleted file mode 100644 index dc174bc..0000000 --- a/test/generated/base/app-rest-client.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RestClient } from "@povio/openapi-codegen-cli"; - -export const AppRestClient = new RestClient({ - config: { - baseURL: "http://localhost:4000" - }, -}); diff --git a/test/generated/base/bankAccounts/bankAccounts.acl.ts b/test/generated/base/bankAccounts/bankAccounts.acl.ts deleted file mode 100644 index 18ce4b2..0000000 --- a/test/generated/base/bankAccounts/bankAccounts.acl.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace BankAccountsAcl { -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Office" -] as AbilityTuple<"Read", "Office">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Office" -] as AbilityTuple<"Read", "Office">; - -} diff --git a/test/generated/base/bankAccounts/bankAccounts.api.ts b/test/generated/base/bankAccounts/bankAccounts.api.ts deleted file mode 100644 index 1274ba6..0000000 --- a/test/generated/base/bankAccounts/bankAccounts.api.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BankAccountsModels } from "./bankAccounts.models"; - -export namespace BankAccountsApi { -export const findAll = (search?: string, officeId?: string, ) => { - return AppRestClient.get( - { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, - `/bank-accounts/labels`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, - `/bank-accounts/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/base/bankAccounts/bankAccounts.configs.ts b/test/generated/base/bankAccounts/bankAccounts.configs.ts deleted file mode 100644 index 23ecfc1..0000000 --- a/test/generated/base/bankAccounts/bankAccounts.configs.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { BankAccountsModels } from "./bankAccounts.models"; -import { BankAccountsQueries } from "./bankAccounts.queries"; -import { BankAccountsAcl } from "./bankAccounts.acl"; - -export namespace BankAccountsConfigs { -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: BankAccountsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: BankAccountsQueries.usePaginateLabels, - infinite: BankAccountsQueries.usePaginateLabelsInfinite, - filters: { - schema: BankAccountsModels.BankAccountFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BankAccountsModels.BankAccountFilterDtoSchema, - options: { - inputs: { - search: true, - officeId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/bankAccounts/bankAccounts.models.ts b/test/generated/base/bankAccounts/bankAccounts.models.ts deleted file mode 100644 index 108934f..0000000 --- a/test/generated/base/bankAccounts/bankAccounts.models.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BankAccountsModels { -/** - * BankAccountFilterDtoSchema - * @type { object } - * @property { string } search Search by name or bank name - * @property { string } officeId Office ID to filter by - */ -export const BankAccountFilterDtoSchema = z.object({ search: z.string().nullable(), officeId: z.string().nullable() }).partial(); -export type BankAccountFilterDto = z.infer; - -/** - * BankAccountsFindAllResponseSchema - * @type { array } - */ -export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type BankAccountsFindAllResponse = z.infer; - -/** - * BankAccountsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const BankAccountsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "bankName", "createdAt", "updatedAt"]); -export type BankAccountsPaginateLabelsOrderParamEnum = z.infer; -export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * BankAccountsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const BankAccountsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type BankAccountsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/bankAccounts/bankAccounts.queries.ts b/test/generated/base/bankAccounts/bankAccounts.queries.ts deleted file mode 100644 index 0a86f09..0000000 --- a/test/generated/base/bankAccounts/bankAccounts.queries.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BankAccountsAcl } from "./bankAccounts.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { BankAccountsModels } from "./bankAccounts.models"; -import { BankAccountsApi } from "./bankAccounts.api"; - -export namespace BankAccountsQueries { -export const moduleName = QueryModule.BankAccounts; - -export const keys = { - all: [moduleName] as const, - findAll: (search?: string, officeId?: string) => [...keys.all, "/bank-accounts/labels", search, officeId] as const, - paginateLabels: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", "infinite", limit, order, filter, cursor] as const, -}; - -/** - * Query `useFindAll` - * @summary List all bank accounts with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { string } object.officeId Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ search, officeId }: { search?: string, officeId?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search, officeId), - queryFn: () => { - checkAcl(BankAccountsAcl.canUseFindAll()); - return BankAccountsApi.findAll(search, officeId) }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate bank account labels (id and name only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` - * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate bank account labels (id and name only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` - * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts deleted file mode 100644 index 055a8b8..0000000 --- a/test/generated/base/bookkeepingExport/bookkeepingExport.acl.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BookkeepingExportAcl { -/** - * Use for `useCreateBatch` mutation ability. For global ability, omit the object parameter. - * @description Create bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBatch` mutation - */ -export const canUseCreateBatch = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Create", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `usePaginateBatches` query ability. For global ability, omit the object parameter. - * @description List bookkeeping export batches - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatches` query - */ -export const canUsePaginateBatches = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useGetBatch` query ability. For global ability, omit the object parameter. - * @description Get bookkeeping export batch details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query - */ -export const canUseGetBatch = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useUpdateBatchFormat` mutation ability. For global ability, omit the object parameter. - * @description Update bookkeeping export batch format - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchFormat` mutation - */ -export const canUseUpdateBatchFormat = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useUpdateBatchItem` mutation ability. For global ability, omit the object parameter. - * @description Update bookkeeping export batch item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchItem` mutation - */ -export const canUseUpdateBatchItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `usePaginateBatchItems` query ability. For global ability, omit the object parameter. - * @description List batch items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatchItems` query - */ -export const canUsePaginateBatchItems = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useValidateBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Export bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useValidateBookkeepingBatch` mutation - */ -export const canUseValidateBookkeepingBatch = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useExportBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Export bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportBookkeepingBatch` mutation - */ -export const canUseExportBookkeepingBatch = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useRevertBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Revert bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertBookkeepingBatch` mutation - */ -export const canUseRevertBookkeepingBatch = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useGetVatLineItems` query ability. For global ability, omit the object parameter. - * @description Get VAT line items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetVatLineItems` query - */ -export const canUseGetVatLineItems = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -} diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.api.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.api.ts deleted file mode 100644 index 75d9468..0000000 --- a/test/generated/base/bookkeepingExport/bookkeepingExport.api.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; - -export namespace BookkeepingExportApi { -export const createBatch = (officeId: string, data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, ) => { - return AppRestClient.post( - { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, - `/offices/${officeId}/bookkeeping-exports`, - ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), - - ) -}; -export const paginateBatches = (officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, - `/offices/${officeId}/bookkeeping-exports`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getBatch = (officeId: string, batchId: string, ) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, - `/offices/${officeId}/bookkeeping-exports/${batchId}`, - - ) -}; -export const updateBatchFormat = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, ) => { - return AppRestClient.patch( - { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, - `/offices/${officeId}/bookkeeping-exports/${batchId}`, - ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), - - ) -}; -export const updateBatchItem = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, - ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), - - ) -}; -export const paginateBatchItems = (officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, - `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const validateBookkeepingBatch = (officeId: string, batchId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, - - ) -}; -export const exportBookkeepingBatch = (officeId: string, batchId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, - - ) -}; -export const revertBookkeepingBatch = (officeId: string, batchId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, - - ) -}; -export const getVatLineItems = (officeId: string, batchId: string, order?: string, ) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, - `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - }, - } - ) -}; -} diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts deleted file mode 100644 index b28771d..0000000 --- a/test/generated/base/bookkeepingExport/bookkeepingExport.configs.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; -import { BookkeepingExportQueries } from "./bookkeepingExport.queries"; -import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; - -export namespace BookkeepingExportConfigs { -export const bookkeepingExportsConfig = { - meta: { - title: "Bookkeeping Exports", - }, - readAll: { - acl: BookkeepingExportAcl.canUsePaginateBatches, - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, - paginated: BookkeepingExportQueries.usePaginateBatches, - infinite: BookkeepingExportQueries.usePaginateBatchesInfinite, - filters: { - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, - options: { - inputs: { - createdDate: true, - status: true, - format: true, - createdBy: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, - options: { - columns: { - id: true, - format: true, - status: true, - totalInvoiceCount: true, - exportedInvoiceCount: true, - createdBy: true, - createdAt: true, - exportedAt: true, - revertedAt: true, - files: true, - }, - sortable: BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema, - }, -}), - }, - read: { - acl: BookkeepingExportAcl.canUseGetBatch, - schema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema, - query: BookkeepingExportQueries.useGetBatch, - }, - create: { - acl: BookkeepingExportAcl.canUseCreateBatch, - schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, - mutation: BookkeepingExportQueries.useCreateBatch, - inputDefs: dynamicInputs({ - schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, - options: { - inputs: { - format: true, - invoiceFilters: true, - }, - }, -}) - }, - update: { - acl: BookkeepingExportAcl.canUseUpdateBatchFormat, - schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, - mutation: BookkeepingExportQueries.useUpdateBatchFormat, - inputDefs: dynamicInputs({ - schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, - options: { - inputs: { - format: true, - }, - }, -}) - }, -}; - -export const itemsConfig = { - meta: { - title: "Items", - }, - readAll: { - acl: BookkeepingExportAcl.canUsePaginateBatchItems, - schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, - paginated: BookkeepingExportQueries.usePaginateBatchItems, - infinite: BookkeepingExportQueries.usePaginateBatchItemsInfinite, - filters: { - schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, - options: { - inputs: { - status: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, - options: { - columns: { - id: true, - invoiceId: true, - status: true, - includedInExport: true, - validationIssues: true, - invoice: true, - receiver: true, - comments: true, - }, - sortable: BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.models.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.models.ts deleted file mode 100644 index 4cdb0f1..0000000 --- a/test/generated/base/bookkeepingExport/bookkeepingExport.models.ts +++ /dev/null @@ -1,293 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BookkeepingExportModels { -/** - * BookkeepingExportFormatEnumSchema - * @type { enum } - */ -export const BookkeepingExportFormatEnumSchema = z.enum(["Bmd", "BmdWithoutCost", "BmdHamburg", "Abra", "Pantheon"]); -export type BookkeepingExportFormatEnum = z.infer; -export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enum; - -/** - * CreateBookkeepingExportBatchRequestDtoSchema - * @type { object } - * @property { BookkeepingExportFormatEnum } format - * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters - */ -export const CreateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema.nullish(), invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema }); -export type CreateBookkeepingExportBatchRequestDto = z.infer; - -/** - * BookkeepingExportFileTypeEnumSchema - * @type { enum } - */ -export const BookkeepingExportFileTypeEnumSchema = z.enum(["Invoices", "BusinessPartners", "Report", "AbraAddressBook", "AbraIssuedInvoices", "AbraIssuedInvoiceItems", "AbraReceivedInvoices", "AbraReceivedInvoiceItems", "PantheonInvoicesOutgoingEur", "PantheonInvoicesOutgoingUsd", "PantheonInvoicesIncomingEur", "PantheonInvoicesIncomingUsd", "PantheonCostCenters"]); -export type BookkeepingExportFileTypeEnum = z.infer; -export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema.enum; - -/** - * BookkeepingExportFileDtoSchema - * @type { object } - * @property { BookkeepingExportFileTypeEnum } variant - * @property { string } downloadUrl - * @property { string } fileName - */ -export const BookkeepingExportFileDtoSchema = z.object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }); -export type BookkeepingExportFileDto = z.infer; - -/** - * BookkeepingExportBatchStatusEnumSchema - * @type { enum } - */ -export const BookkeepingExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Reverted", "Failed"]); -export type BookkeepingExportBatchStatusEnum = z.infer; -export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnumSchema.enum; - -/** - * BookkeepingExportBatchSummaryDtoSchema - * @type { object } - * @property { number } totalCount - * @property { number } needsReviewCount - * @property { number } readyForExportCount - * @property { number } excludedCount - * @property { object } invoiceNumberRange - * @property { string } invoiceNumberRange.from - * @property { string } invoiceNumberRange.to - * @property { object } dateRange - * @property { string } dateRange.from - * @property { string } dateRange.to - */ -export const BookkeepingExportBatchSummaryDtoSchema = z.object({ totalCount: z.number(), needsReviewCount: z.number(), readyForExportCount: z.number(), excludedCount: z.number(), invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).nullish(), dateRange: z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).nullish() }); -export type BookkeepingExportBatchSummaryDto = z.infer; - -/** - * BookkeepingExportBatchDetailsDtoSchema - * @type { object } - * @property { string } id - * @property { BookkeepingExportFormatEnum } format - * @property { BookkeepingExportBatchStatusEnum } status - * @property { number } totalInvoiceCount - * @property { number } exportedInvoiceCount - * @property { object } createdBy - * @property { string } createdBy.id - * @property { string } createdBy.fullName - * @property { string } createdBy.email - * @property { string } createdAt - * @property { string } exportedAt - * @property { string } revertedAt - * @property { object } revertedBy - * @property { string } revertedBy.id - * @property { string } revertedBy.fullName - * @property { string } revertedBy.email - * @property { BookkeepingExportBatchSummaryDto } summary - * @property { BookkeepingExportFileDto[] } files - */ -export const BookkeepingExportBatchDetailsDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), revertedBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).nullish(), summary: BookkeepingExportBatchSummaryDtoSchema, files: z.array(BookkeepingExportFileDtoSchema).nullish() }); -export type BookkeepingExportBatchDetailsDto = z.infer; - -/** - * UpdateBookkeepingExportBatchRequestDtoSchema - * @type { object } - * @property { BookkeepingExportFormatEnum } format - */ -export const UpdateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema }); -export type UpdateBookkeepingExportBatchRequestDto = z.infer; - -/** - * BookkeepingExportBatchPreviewDtoSchema - * @type { object } - * @property { string } id - * @property { BookkeepingExportFormatEnum } format - * @property { BookkeepingExportBatchStatusEnum } status - * @property { number } totalInvoiceCount - * @property { number } exportedInvoiceCount - * @property { object } createdBy - * @property { string } createdBy.id - * @property { string } createdBy.fullName - * @property { string } createdBy.email - * @property { string } createdAt - * @property { string } exportedAt - * @property { string } revertedAt - * @property { BookkeepingExportFileDto[] } files - */ -export const BookkeepingExportBatchPreviewDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), files: z.array(BookkeepingExportFileDtoSchema).nullish() }); -export type BookkeepingExportBatchPreviewDto = z.infer; - -/** - * DateRangeSchema - * @type { object } - * @property { string } from - * @property { string } to - */ -export const DateRangeSchema = z.object({ from: z.iso.datetime({ offset: true }).nullable(), to: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type DateRange = z.infer; - -/** - * BookkeepingExportBatchPreviewFilterDtoSchema - * @type { object } - * @property { DateRange } createdDate - * @property { BookkeepingExportBatchStatusEnum[] } status - * @property { BookkeepingExportFormatEnum[] } format - * @property { string[] } createdBy - */ -export const BookkeepingExportBatchPreviewFilterDtoSchema = z.object({ createdDate: DateRangeSchema.nullable(), status: z.array(BookkeepingExportBatchStatusEnumSchema).nullable(), format: z.array(BookkeepingExportFormatEnumSchema).nullable(), createdBy: z.array(z.string()).nullable() }).partial(); -export type BookkeepingExportBatchPreviewFilterDto = z.infer; - -/** - * BookkeepingExportBatchItemStatusEnumSchema - * @type { enum } - */ -export const BookkeepingExportBatchItemStatusEnumSchema = z.enum(["Selected", "NeedsReview", "ReadyForExport", "Exported", "Excluded"]); -export type BookkeepingExportBatchItemStatusEnum = z.infer; -export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemStatusEnumSchema.enum; - -/** - * BookkeepingExportItemDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } invoiceId - * @property { BookkeepingExportBatchItemStatusEnum } status - * @property { boolean } includedInExport - * @property { string[] } validationIssues - * @property { object } invoice - * @property { string } invoice.invoiceNumber - * @property { string } invoice.issuingDate - * @property { string } invoice.currency - * @property { number } invoice.amount - * @property { number } invoice.tax - * @property { string[] } invoice.vatRules - * @property { object } receiver - * @property { string } receiver.id - * @property { string } receiver.name - * @property { string } receiver.matchCode - * @property { string } receiver.label - * @property { string } receiver.account - * @property { string } receiver.contraAccount - * @property { string } comments - */ -export const BookkeepingExportItemDetailDtoSchema = z.object({ id: z.string(), invoiceId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), vatRules: z.array(z.string()) }), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }), comments: z.string().nullish() }); -export type BookkeepingExportItemDetailDto = z.infer; - -/** - * BookkeepingExportItemDetailFilterDtoSchema - * @type { object } - * @property { BookkeepingExportBatchItemStatusEnum[] } status - */ -export const BookkeepingExportItemDetailFilterDtoSchema = z.object({ status: z.array(BookkeepingExportBatchItemStatusEnumSchema).nullable() }).partial(); -export type BookkeepingExportItemDetailFilterDto = z.infer; - -/** - * BookkeepingExportVatLineItemDtoSchema - * @type { object } - * @property { string } invoiceId - * @property { string } batchId - * @property { string } batchItemId - * @property { BookkeepingExportBatchItemStatusEnum } status - * @property { boolean } includedInExport - * @property { string[] } validationIssues - * @property { object } invoice - * @property { string } invoice.invoiceNumber - * @property { string } invoice.issuingDate - * @property { string } invoice.currency - * @property { number } invoice.amount - * @property { number } invoice.tax - * @property { string } invoice.comments - * @property { object } receiver - * @property { string } receiver.id - * @property { string } receiver.name - * @property { string } receiver.matchCode - * @property { string } receiver.label - * @property { string } receiver.account - * @property { string } receiver.contraAccount - * @property { number } vatPercentage - * @property { string } vatRule - * @property { number } netAmount - * @property { number } vatAmount - * @property { number } grossAmount - * @property { number } vatAmountInOfficeCurrency - * @property { number } netAmountInOfficeCurrency - * @property { number } grossAmountInOfficeCurrency - * @property { string } officeCurrency - */ -export const BookkeepingExportVatLineItemDtoSchema = z.object({ invoiceId: z.string(), batchId: z.string(), batchItemId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), comments: z.string().nullish() }), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }), vatPercentage: z.number(), vatRule: z.string(), netAmount: z.number(), vatAmount: z.number(), grossAmount: z.number(), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish(), officeCurrency: z.string() }); -export type BookkeepingExportVatLineItemDto = z.infer; - -/** - * CreateBookkeepingExportBatchResponseDtoSchema - * @type { object } - * @property { string } batchId - */ -export const CreateBookkeepingExportBatchResponseDtoSchema = z.object({ batchId: z.string() }); -export type CreateBookkeepingExportBatchResponseDto = z.infer; - -/** - * UpdateBookkeepingExportBatchItemRequestDtoSchema - * @type { object } - * @property { boolean } includedInExport Whether the item should be included in the export - * @property { string[] } itemIds Min Items: `0` - * @property { boolean } vatOk - * @property { boolean } invoiceOk - */ -export const UpdateBookkeepingExportBatchItemRequestDtoSchema = z.object({ includedInExport: z.boolean().nullish(), itemIds: z.array(z.string()), vatOk: z.boolean().nullish(), invoiceOk: z.boolean().nullish() }); -export type UpdateBookkeepingExportBatchItemRequestDto = z.infer; - -/** - * PaginateBatchesOrderParamEnumSchema - * @type { enum } - */ -export const PaginateBatchesOrderParamEnumSchema = z.enum(["createdAt", "status", "format", "totalInvoiceCount"]); -export type PaginateBatchesOrderParamEnum = z.infer; -export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema.enum; - -/** - * PaginateBatchesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookkeepingExportBatchPreviewDto[] } items - */ -export const PaginateBatchesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).nullable() }).partial().shape }); -export type PaginateBatchesResponse = z.infer; - -/** - * PaginateBatchItemsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateBatchItemsOrderParamEnumSchema = z.enum(["issuingDate"]); -export type PaginateBatchItemsOrderParamEnum = z.infer; -export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnumSchema.enum; - -/** - * PaginateBatchItemsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookkeepingExportItemDetailDto[] } items - */ -export const PaginateBatchItemsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).nullable() }).partial().shape }); -export type PaginateBatchItemsResponse = z.infer; - -/** - * GetVatLineItemsOrderParamEnumSchema - * @type { enum } - */ -export const GetVatLineItemsOrderParamEnumSchema = z.enum(["account", "contraAccount", "issuingDate", "invoiceNumber", "receiver"]); -export type GetVatLineItemsOrderParamEnum = z.infer; -export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema.enum; - -/** - * GetVatLineItemsResponseSchema - * @type { array } - */ -export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema); -export type GetVatLineItemsResponse = z.infer; - -} diff --git a/test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts b/test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts deleted file mode 100644 index db9e500..0000000 --- a/test/generated/base/bookkeepingExport/bookkeepingExport.queries.ts +++ /dev/null @@ -1,350 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; -import { BookkeepingExportApi } from "./bookkeepingExport.api"; - -export namespace BookkeepingExportQueries { -export const moduleName = QueryModule.BookkeepingExport; - -export const keys = { - all: [moduleName] as const, - paginateBatches: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", officeId, limit, order, filter, page, cursor] as const, - paginateBatchesInfinite: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", "infinite", officeId, limit, order, filter, cursor] as const, - getBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/:batchId", officeId, batchId] as const, - paginateBatchItems: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", officeId, batchId, limit, order, filter, page, cursor] as const, - paginateBatchItemsInfinite: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", "infinite", officeId, batchId, limit, order, filter, cursor] as const, - getVatLineItems: (officeId: string, batchId: string, order?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/vat-line-items", officeId, batchId, order] as const, -}; - -/** - * Mutation `useCreateBatch` - * @summary Create bookkeeping export batch - * @permission Requires `canUseCreateBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId } )); - return BookkeepingExportApi.createBatch(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateBatches` - * @summary List bookkeeping export batches - * @permission Requires `canUsePaginateBatches` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` - * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatches = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateBatchesInfinite - * @summary List bookkeeping export batches - * @permission Requires `canUsePaginateBatches` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` - * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatchesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetBatch` - * @summary Get bookkeeping export batch details - * @permission Requires `canUseGetBatch` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBatch(officeId, batchId), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId } )); - return BookkeepingExportApi.getBatch(officeId, batchId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateBatchFormat` - * @summary Update bookkeeping export batch format - * @permission Requires `canUseUpdateBatchFormat` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBatchFormat = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId, data }) => { - checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId } )); - return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, batchId } = variables; - const updateKeys = [keys.getBatch(officeId, batchId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBatchItem` - * @summary Update bookkeeping export batch item inclusion - * @permission Requires `canUseUpdateBatchItem` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBatchItem = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId, data }) => { - checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId } )); - return BookkeepingExportApi.updateBatchItem(officeId, batchId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateBatchItems` - * @summary List batch items with filters and pagination - * @permission Requires `canUsePaginateBatchItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` - * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatchItems = ({ officeId, batchId, limit, order, filter, page, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); - return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateBatchItemsInfinite - * @summary List batch items with filters and pagination - * @permission Requires `canUsePaginateBatchItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` - * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatchItemsInfinite = ({ officeId, batchId, limit, order, filter, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); - return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useValidateBookkeepingBatch` - * @summary Validate bookkeeping batch - * @permission Requires `canUseValidateBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useValidateBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportBookkeepingBatch` - * @summary Export bookkeeping batch - * @permission Requires `canUseExportBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useExportBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRevertBookkeepingBatch` - * @summary Revert bookkeeping export batch - * @permission Requires `canUseRevertBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useRevertBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetVatLineItems` - * @summary Get VAT line items for bookkeeping export batch - * @permission Requires `canUseGetVatLineItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): account, contraAccount, issuingDate, invoiceNumber, receiver. Example: `account` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetVatLineItems = ({ officeId, batchId, order }: { officeId: string, batchId: string, order?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getVatLineItems(officeId, batchId, order), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId } )); - return BookkeepingExportApi.getVatLineItems(officeId, batchId, order) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts deleted file mode 100644 index 1fc9403..0000000 --- a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnerBookkeepingMappingsAcl { -/** - * Use for `useGetBookkeepingMappings` query ability. For global ability, omit the object parameter. - * @description List business partner bookkeeping mappings - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBookkeepingMappings` query - */ -export const canUseGetBookkeepingMappings = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Create business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBookkeepingMapping` mutation - */ -export const canUseCreateBookkeepingMapping = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -/** - * Use for `useUpdateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Update business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMapping` mutation - */ -export const canUseUpdateBookkeepingMapping = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -/** - * Use for `useUpdateBookkeepingMappingById` mutation ability. For global ability, omit the object parameter. - * @description Update business partner bookkeeping mapping by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMappingById` mutation - */ -export const canUseUpdateBookkeepingMappingById = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -/** - * Use for `useDeleteBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBookkeepingMapping` mutation - */ -export const canUseDeleteBookkeepingMapping = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Delete", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -} diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts deleted file mode 100644 index 88b624e..0000000 --- a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; - -export namespace BusinessPartnerBookkeepingMappingsApi { -export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - - ) -}; -export const createBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, ) => { - return AppRestClient.post( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), - - ) -}; -export const updateBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), - - ) -}; -export const updateBookkeepingMappingById = (officeId: string, businessPartnerId: string, id: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), - - ) -}; -export const deleteBookkeepingMapping = (officeId: string, businessPartnerId: string, id: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - - ) -}; -} diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts deleted file mode 100644 index 2bb5fda..0000000 --- a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { z } from "zod"; - -export namespace BusinessPartnerBookkeepingMappingsModels { -/** - * BusinessPartnerBookkeepingMappingResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { string } businessPartnerId - * @property { boolean } paysTaxInEurForFactoring - */ -export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z.object({ id: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), currencyNotation: z.string().nullish(), businessPartnerId: z.string(), paysTaxInEurForFactoring: z.boolean().nullish() }); -export type BusinessPartnerBookkeepingMappingResponseDto = z.infer; - -/** - * BusinessPartnerBookkeepingMappingsResponseDtoSchema - * @type { object } - * @property { BusinessPartnerBookkeepingMappingResponseDto[] } bookkeepingMappings - */ -export const BusinessPartnerBookkeepingMappingsResponseDtoSchema = z.object({ bookkeepingMappings: z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema) }); -export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer; - -/** - * UpdateBookkeepingMappingDtoSchema - * @type { object } - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) - */ -export const UpdateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string().nullable(), creditorId: z.string().nullable(), currencyNotation: z.string().nullable(), paysTaxInEurForFactoring: z.boolean().nullable() }).partial(); -export type UpdateBookkeepingMappingDto = z.infer; - -/** - * UpdateBookkeepingMappingRequestDtoSchema - * @type { object } - * @property { UpdateBookkeepingMappingDto[] } bookkeepingMappings - */ -export const UpdateBookkeepingMappingRequestDtoSchema = z.object({ bookkeepingMappings: z.array(UpdateBookkeepingMappingDtoSchema).nullable() }).partial(); -export type UpdateBookkeepingMappingRequestDto = z.infer; - -/** - * CreateBookkeepingMappingDtoSchema - * @type { object } - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) - */ -export const CreateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string().nullable(), creditorId: z.string().nullable(), currencyNotation: z.string().nullable(), paysTaxInEurForFactoring: z.boolean().nullable() }).partial(); -export type CreateBookkeepingMappingDto = z.infer; - -/** - * UpdateBookkeepingMappingResponseSchema - * @type { array } - */ -export const UpdateBookkeepingMappingResponseSchema = z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema); -export type UpdateBookkeepingMappingResponse = z.infer; - -} diff --git a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts b/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts deleted file mode 100644 index e176f36..0000000 --- a/test/generated/base/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnerBookkeepingMappingsAcl } from "./businessPartnerBookkeepingMappings.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; -import { BusinessPartnerBookkeepingMappingsApi } from "./businessPartnerBookkeepingMappings.api"; - -export namespace BusinessPartnerBookkeepingMappingsQueries { -export const moduleName = QueryModule.BusinessPartnerBookkeepingMappings; - -export const keys = { - all: [moduleName] as const, - getBookkeepingMappings: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/bookkeeping-mappings", officeId, businessPartnerId] as const, -}; - -/** - * Query `useGetBookkeepingMappings` - * @summary Fetch all bookkeeping mappings for a business partner - * @permission Requires `canUseGetBookkeepingMappings` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBookkeepingMappings = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), - queryFn: () => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateBookkeepingMapping` - * @summary Create a bookkeeping mapping for a business partner - * @permission Requires `canUseCreateBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping(officeId, businessPartnerId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBookkeepingMapping` - * @summary Update an existing bookkeeping mapping for a business partner - * @permission Requires `canUseUpdateBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping(officeId, businessPartnerId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBookkeepingMappingById` - * @summary Update a specific bookkeeping mapping by ID for a business partner - * @permission Requires `canUseUpdateBookkeepingMappingById` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBookkeepingMappingById = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, id, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById(officeId, businessPartnerId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteBookkeepingMapping` - * @summary Delete an existing bookkeeping mapping for a business partner - * @permission Requires `canUseDeleteBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, id }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts deleted file mode 100644 index ea3ab69..0000000 --- a/test/generated/base/businessPartnerContacts/businessPartnerContacts.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnerContactsAcl { -/** - * Use for `useGetContacts` query ability. For global ability, omit the object parameter. - * @description List business partner contacts - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetContacts` query - */ -export const canUseGetContacts = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreateContact` mutation ability. For global ability, omit the object parameter. - * @description Create business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateContact` mutation - */ -export const canUseCreateContact = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `usePaginateContactLabels` query ability. For global ability, omit the object parameter. - * @description Paginate business partner contact labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateContactLabels` query - */ -export const canUsePaginateContactLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateContact` mutation ability. For global ability, omit the object parameter. - * @description Update business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateContact` mutation - */ -export const canUseUpdateContact = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useDeleteContact` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteContact` mutation - */ -export const canUseDeleteContact = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -} diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts deleted file mode 100644 index 60c1869..0000000 --- a/test/generated/base/businessPartnerContacts/businessPartnerContacts.api.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; - -export namespace BusinessPartnerContactsApi { -export const getContacts = (officeId: string, businessPartnerId: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - - ) -}; -export const createContact = (officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, ) => { - return AppRestClient.post( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), - - ) -}; -export const paginateContactLabels = (officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const updateContact = (contactId: string, officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), - - ) -}; -export const deleteContact = (contactId: string, officeId: string, businessPartnerId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - - ) -}; -} diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts deleted file mode 100644 index 9c4ccc5..0000000 --- a/test/generated/base/businessPartnerContacts/businessPartnerContacts.configs.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; -import { BusinessPartnerContactsQueries } from "./businessPartnerContacts.queries"; -import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; - -export namespace BusinessPartnerContactsConfigs { -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: BusinessPartnerContactsAcl.canUsePaginateContactLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: BusinessPartnerContactsQueries.usePaginateContactLabels, - infinite: BusinessPartnerContactsQueries.usePaginateContactLabelsInfinite, - filters: { - schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts deleted file mode 100644 index c9b784b..0000000 --- a/test/generated/base/businessPartnerContacts/businessPartnerContacts.models.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BusinessPartnerContactsModels { -/** - * BusinessPartnerContactRoleEnumSchema - * @type { enum } - */ -export const BusinessPartnerContactRoleEnumSchema = z.enum(["General", "CommercialManager", "SystemEngineer", "TechnicalEngineer", "Logistics", "Operations", "Sales", "Accounting", "Invoice", "Dunnings", "Reclamations", "Management"]); -export type BusinessPartnerContactRoleEnum = z.infer; -export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSchema.enum; - -/** - * BusinessPartnerContactResponseDTOSchema - * @type { object } - * @property { string } id Contact ID - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ -export const BusinessPartnerContactResponseDTOSchema = z.object({ id: z.string(), role: BusinessPartnerContactRoleEnumSchema.nullish(), name: z.string().nullish(), email: z.string().nullish(), phone: z.string().nullish() }); -export type BusinessPartnerContactResponseDTO = z.infer; - -/** - * BusinessPartnerContactListResponseDTOSchema - * @type { object } - * @property { BusinessPartnerContactResponseDTO[] } contacts List of contacts - */ -export const BusinessPartnerContactListResponseDTOSchema = z.object({ contacts: z.array(BusinessPartnerContactResponseDTOSchema) }); -export type BusinessPartnerContactListResponseDTO = z.infer; - -/** - * CreateBusinessPartnerContactRequestDTOSchema - * @type { object } - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ -export const CreateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema.nullable(), name: z.string().nullable(), email: z.string().nullable(), phone: z.string().nullable() }).partial(); -export type CreateBusinessPartnerContactRequestDTO = z.infer; - -/** - * UpdateBusinessPartnerContactRequestDTOSchema - * @type { object } - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ -export const UpdateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema.nullable(), name: z.string().nullable(), email: z.string().nullable(), phone: z.string().nullable() }).partial(); -export type UpdateBusinessPartnerContactRequestDTO = z.infer; - -/** - * BusinessPartnerContactFilterDtoSchema - * @type { object } - * @property { string } search Search by name, email, or phone - */ -export const BusinessPartnerContactFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type BusinessPartnerContactFilterDto = z.infer; - -/** - * PaginateContactLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateContactLabelsOrderParamEnumSchema = z.enum(["name", "role", "email", "createdAt", "updatedAt"]); -export type PaginateContactLabelsOrderParamEnum = z.infer; -export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderParamEnumSchema.enum; - -/** - * PaginateContactLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateContactLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PaginateContactLabelsResponse = z.infer; - -} diff --git a/test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts b/test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts deleted file mode 100644 index 8941f35..0000000 --- a/test/generated/base/businessPartnerContacts/businessPartnerContacts.queries.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; -import { BusinessPartnerContactsApi } from "./businessPartnerContacts.api"; - -export namespace BusinessPartnerContactsQueries { -export const moduleName = QueryModule.BusinessPartnerContacts; - -export const keys = { - all: [moduleName] as const, - getContacts: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts", officeId, businessPartnerId] as const, - paginateContactLabels: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", officeId, businessPartnerId, limit, order, filter, page, cursor] as const, - paginateContactLabelsInfinite: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", "infinite", officeId, businessPartnerId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useGetContacts` - * @summary Get all contacts for a business partner - * @permission Requires `canUseGetContacts` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetContacts = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getContacts(officeId, businessPartnerId), - queryFn: () => { - checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId } )); - return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateContact` - * @summary Create a new contact for a business partner - * @permission Requires `canUseCreateContact` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateContact = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId } )); - return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateContactLabels` - * @summary Paginate business partner contact labels (id and name only) - * @permission Requires `canUsePaginateContactLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` - * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateContactLabels = ({ officeId, businessPartnerId, limit, order, filter, page, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); - return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateContactLabelsInfinite - * @summary Paginate business partner contact labels (id and name only) - * @permission Requires `canUsePaginateContactLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` - * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateContactLabelsInfinite = ({ officeId, businessPartnerId, limit, order, filter, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); - return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useUpdateContact` - * @summary Update a business partner contact - * @permission Requires `canUseUpdateContact` ability - * @param { string } mutation.contactId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateContact = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId } )); - return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteContact` - * @permission Requires `canUseDeleteContact` ability - * @param { string } mutation.contactId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 204, 401] - */ -export const useDeleteContact = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ contactId, officeId, businessPartnerId }) => { - checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId } )); - return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/businessPartners/businessPartners.acl.ts b/test/generated/base/businessPartners/businessPartners.acl.ts deleted file mode 100644 index a532e2e..0000000 --- a/test/generated/base/businessPartners/businessPartners.acl.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnersAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List business partners - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Create", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Paginate business partner labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Read business partner details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useLock` mutation ability. For global ability, omit the object parameter. - * @description Lock business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLock` mutation - */ -export const canUseLock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUnlock` mutation ability. For global ability, omit the object parameter. - * @description Unlock business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlock` mutation - */ -export const canUseUnlock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetRemarks` query ability. For global ability, omit the object parameter. - * @description List business partner remarks - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetRemarks` query - */ -export const canUseGetRemarks = ( - object?: { officeId: string, } -) => [ - "ReadRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreateRemark` mutation ability. For global ability, omit the object parameter. - * @description Create business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRemark` mutation - */ -export const canUseCreateRemark = ( - object?: { officeId: string, } -) => [ - "CreateRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateRemark` mutation ability. For global ability, omit the object parameter. - * @description Update business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRemark` mutation - */ -export const canUseUpdateRemark = ( - object?: { officeId: string, } -) => [ - "UpdateRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useDeleteRemark` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemark` mutation - */ -export const canUseDeleteRemark = ( - object?: { officeId: string, } -) => [ - "DeleteRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetBasicInfo` query ability. For global ability, omit the object parameter. - * @description Read business partner basic info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBasicInfo` query - */ -export const canUseGetBasicInfo = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateBasicInfo` mutation ability. For global ability, omit the object parameter. - * @description Update business partner basic info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBasicInfo` mutation - */ -export const canUseUpdateBasicInfo = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" -] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; - -/** - * Use for `useCreateSignatureUploadInstructions` mutation ability. For global ability, omit the object parameter. - * @description Create business partner signature upload instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateSignatureUploadInstructions` mutation - */ -export const canUseCreateSignatureUploadInstructions = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" -] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; - -/** - * Use for `useGetCargoAgentInfo` query ability. For global ability, omit the object parameter. - * @description Read business partner cargo agent info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoAgentInfo` query - */ -export const canUseGetCargoAgentInfo = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateCargoAgent` mutation ability. For global ability, omit the object parameter. - * @description Update business partner cargo agent info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargoAgent` mutation - */ -export const canUseUpdateCargoAgent = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetCarrierInformation` query ability. For global ability, omit the object parameter. - * @description Read business partner carrier info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCarrierInformation` query - */ -export const canUseGetCarrierInformation = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateCarrier` mutation ability. For global ability, omit the object parameter. - * @description Update business partner carrier info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCarrier` mutation - */ -export const canUseUpdateCarrier = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -} diff --git a/test/generated/base/businessPartners/businessPartners.api.ts b/test/generated/base/businessPartners/businessPartners.api.ts deleted file mode 100644 index df8cc83..0000000 --- a/test/generated/base/businessPartners/businessPartners.api.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnersModels } from "./businessPartners.models"; - -export namespace BusinessPartnersApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, - `/offices/${officeId}/business-partners`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, ) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, - `/offices/${officeId}/business-partners`, - ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, - `/offices/${officeId}/business-partners/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getById = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}`, - - ) -}; -export const update = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), - - ) -}; -export const archive = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/archive`, - - ) -}; -export const unarchive = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/unarchive`, - - ) -}; -export const lock = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/lock`, - - ) -}; -export const unlock = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/unlock`, - - ) -}; -export const getRemarks = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, - `/offices/${officeId}/business-partners/${id}/remarks`, - - ) -}; -export const createRemark = (officeId: string, id: string, data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, ) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/remarks`, - ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), - - ) -}; -export const updateRemark = (officeId: string, id: string, remarkId: string, data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), - - ) -}; -export const deleteRemark = (officeId: string, id: string, remarkId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - - ) -}; -export const getBasicInfo = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic`, - - ) -}; -export const updateBasicInfo = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), - - ) -}; -export const createSignatureUploadInstructions = (officeId: string, id: string, data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, ) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, - ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), - - ) -}; -export const getCargoAgentInfo = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/cargo-agent`, - - ) -}; -export const updateCargoAgent = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCargoAgentDTO, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/cargo-agent`, - ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), - - ) -}; -export const getCarrierInformation = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/carrier`, - - ) -}; -export const updateCarrier = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCarrierDTO, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/carrier`, - ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/businessPartners/businessPartners.configs.ts b/test/generated/base/businessPartners/businessPartners.configs.ts deleted file mode 100644 index 971a761..0000000 --- a/test/generated/base/businessPartners/businessPartners.configs.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { BusinessPartnersModels } from "./businessPartners.models"; -import { BusinessPartnersQueries } from "./businessPartners.queries"; -import { BusinessPartnersAcl } from "./businessPartners.acl"; - -export namespace BusinessPartnersConfigs { -export const businessPartnersConfig = { - meta: { - title: "Business Partners", - }, - readAll: { - acl: BusinessPartnersAcl.canUsePaginate, - schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, - paginated: BusinessPartnersQueries.usePaginate, - infinite: BusinessPartnersQueries.usePaginateInfinite, - filters: { - schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, - options: { - inputs: { - search: true, - types: true, - shortName: true, - name: true, - vat: true, - debtorId: true, - creditorId: true, - matchCode: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - address: true, - types: true, - archived: true, - shortName: true, - vat: true, - debtorId: true, - creditorId: true, - locked: true, - currency: true, - remarks: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: BusinessPartnersAcl.canUseGetById, - schema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema, - query: BusinessPartnersQueries.useGetById, - }, - create: { - acl: BusinessPartnersAcl.canUseCreate, - schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, - mutation: BusinessPartnersQueries.useCreate, - inputDefs: dynamicInputs({ - schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, - options: { - inputs: { - name: true, - secondaryName: true, - types: true, - matchCode: true, - shortName: true, - address: true, - }, - }, -}) - }, - update: { - acl: BusinessPartnersAcl.canUseUpdate, - schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, - mutation: BusinessPartnersQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - secondaryName: true, - types: true, - address: true, - blAddress: true, - belongsToId: true, - salesRepId: true, - operationsId: true, - addressIsDifferentForBl: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: BusinessPartnersAcl.canUsePaginateLabels, - schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, - paginated: BusinessPartnersQueries.usePaginateLabels, - infinite: BusinessPartnersQueries.usePaginateLabelsInfinite, - filters: { - schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, - options: { - inputs: { - search: true, - ids: true, - types: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - types: true, - }, - sortable: BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/businessPartners/businessPartners.models.ts b/test/generated/base/businessPartners/businessPartners.models.ts deleted file mode 100644 index b825ac4..0000000 --- a/test/generated/base/businessPartners/businessPartners.models.ts +++ /dev/null @@ -1,489 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BusinessPartnersModels { -/** - * RemarkVisibilitySchema - * @type { enum } - */ -export const RemarkVisibilitySchema = z.enum(["internal", "popup"]); -export type RemarkVisibility = z.infer; -export const RemarkVisibility = RemarkVisibilitySchema.enum; - -/** - * RemarkTypeSchema - * @type { enum } - */ -export const RemarkTypeSchema = z.enum(["INFORMATIONAL", "WARNING"]); -export type RemarkType = z.infer; -export const RemarkType = RemarkTypeSchema.enum; - -/** - * BusinessPartnerRemarkResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the remark - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of the remark - */ -export const BusinessPartnerRemarkResponseDTOSchema = z.object({ id: z.string(), visibility: RemarkVisibilitySchema, content: z.string(), type: RemarkTypeSchema }); -export type BusinessPartnerRemarkResponseDTO = z.infer; - -/** - * BusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { string } city City name - * @property { string } isoCode Country code - */ -export const BusinessPartnerAddressDtoSchema = z.object({ street: z.string().nullable(), zip: z.string().nullable(), city: z.string().nullable(), isoCode: z.string().nullable() }).partial(); -export type BusinessPartnerAddressDto = z.infer; - -/** - * BusinessPartnerEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BusinessPartnerEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type BusinessPartnerEmployeeDTO = z.infer; - -/** - * BusinessPartnerListResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - * @property { string } matchCode Match code of the business partner - * @property { BusinessPartnerAddressDto } address Address information - * @property { CommonModels.BusinessPartnerType[] } types List of business partner types - * @property { boolean } archived Archive status - * @property { string } shortName Short name of the business partner - * @property { string } vat VAT number of the business partner - * @property { string } debtorId Debtor ID for the local currency - * @property { string } creditorId Creditor ID for the local currency - * @property { boolean } locked Whether the business partner is locked - * @property { string } currency Currency (invoice currency) - * @property { BusinessPartnerRemarkResponseDTO[] } remarks Remarks for the business partner - * @property { string } createdById ID of the employee who created this business partner - * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this business partner - * @property { string } createdAt Date when the business partner was created - * @property { string } updatedById ID of the employee who last updated this business partner - * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this business partner - * @property { string } updatedAt Date when the business partner was last updated - */ -export const BusinessPartnerListResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), address: BusinessPartnerAddressDtoSchema, types: z.array(CommonModels.BusinessPartnerTypeSchema), archived: z.boolean(), shortName: z.string().nullish(), vat: z.string().nullish(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), locked: z.boolean(), currency: z.string().nullish(), remarks: z.array(BusinessPartnerRemarkResponseDTOSchema), createdById: z.string().nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type BusinessPartnerListResponseDTO = z.infer; - -/** - * BusinessPartnerFilterDtoSchema - * @type { object } - * @property { string } search - * @property { CommonModels.BusinessPartnerType[] } types - * @property { string } shortName - * @property { string } name - * @property { string } vat - * @property { string } debtorId - * @property { string } creditorId - * @property { string } matchCode - * @property { boolean } archived Filter by archived status - */ -export const BusinessPartnerFilterDtoSchema = z.object({ search: z.string().nullable(), types: z.array(CommonModels.BusinessPartnerTypeSchema).nullable(), shortName: z.string().nullable(), name: z.string().nullable(), vat: z.string().nullable(), debtorId: z.string().nullable(), creditorId: z.string().nullable(), matchCode: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type BusinessPartnerFilterDto = z.infer; - -/** - * BusinessPartnerPaginatedLabelResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } label Label of the business partner - * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types - */ -export const BusinessPartnerPaginatedLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema) }); -export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; - -/** - * BusinessPartnerLabelsFilterDtoSchema - * @type { object } - * @property { string } search - * @property { string[] } ids Business partner ids to filter by - * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types to filter by - * @property { boolean } archived Filter by archived status - */ -export const BusinessPartnerLabelsFilterDtoSchema = z.object({ search: z.string().nullable(), ids: z.array(z.string()).nullable(), types: z.array(CommonModels.BusinessPartnerTypeSchema).nullable(), archived: z.boolean().nullable() }).partial(); -export type BusinessPartnerLabelsFilterDto = z.infer; - -/** - * CreateBusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } district - * @property { string } countryId - */ -export const CreateBusinessPartnerAddressDtoSchema = z.object({ street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), district: z.string().nullable(), countryId: z.string().nullable() }).partial(); -export type CreateBusinessPartnerAddressDto = z.infer; - -/** - * CreateBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } name Full name of the business partner. Min Length: `3` - * @property { string } secondaryName Full name of the business partner. Min Length: `3` - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { string } matchCode Unique identifier code - * @property { string } shortName Short name for the business partner - * @property { CreateBusinessPartnerAddressDto } address Address information - */ -export const CreateBusinessPartnerRequestDTOSchema = z.object({ name: z.string().min(3), secondaryName: z.string().min(3).nullish(), types: z.array(CommonModels.BusinessPartnerTypeSchema), matchCode: z.string().nullish(), shortName: z.string().nullish(), address: CreateBusinessPartnerAddressDtoSchema.nullish() }); -export type CreateBusinessPartnerRequestDTO = z.infer; - -/** - * BusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { string } rootFolderId Root folder identifier associated with this business partner - */ -export const BusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema), rootFolderId: z.string().nullish() }); -export type BusinessPartnerResponseDTO = z.infer; - -/** - * BusinessPartnerLabelResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - */ -export const BusinessPartnerLabelResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type BusinessPartnerLabelResponseDto = z.infer; - -/** - * ContactResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the contact - * @property { string } name Name of the contact - */ -export const ContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ContactResponseDTO = z.infer; - -/** - * BusinessPartnerDetailResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } createdById ID of the employee who created this record - * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this record - * @property { string } createdAt Creation timestamp - * @property { string } updatedById ID of the employee who last updated this record - * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this record - * @property { string } updatedAt Last update timestamp - * @property { string } matchCode Match code of the business partner - * @property { string } shortName Short name - * @property { string } name Full name - * @property { string } secondaryName Secondary name - * @property { CommonModels.BusinessPartnerType[] } types List of business partner types - * @property { boolean } archived Archived status - * @property { CommonModels.BusinessPartnerAddressResponseDTO } address Main address information - * @property { CommonModels.BusinessPartnerAddressResponseDTO } blAddress BL address information - * @property { BusinessPartnerLabelResponseDto[] } similar Similar named business partners - * @property { boolean } locked - * @property { boolean } addressIsDifferentForBl - * @property { string } lockedById Unique identifier of the employee who locked the business partner - * @property { string } lockedByName - * @property { string } lockedAt Unique identifier of the employee who locked the business partner - * @property { ContactResponseDTO } belongsTo Parent business partner - * @property { ContactResponseDTO } salesRep Sales representative - * @property { ContactResponseDTO } operations Operations contact - */ -export const BusinessPartnerDetailResponseDTOSchema = z.object({ id: z.string(), createdById: z.string().nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), matchCode: z.string(), shortName: z.string(), name: z.string(), secondaryName: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema), archived: z.boolean(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema, blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema, similar: z.array(BusinessPartnerLabelResponseDtoSchema).nullish(), locked: z.boolean(), addressIsDifferentForBl: z.boolean(), lockedById: z.string().nullish(), lockedByName: z.string().nullish(), lockedAt: z.iso.datetime({ offset: true }).nullish(), belongsTo: ContactResponseDTOSchema, salesRep: ContactResponseDTOSchema, operations: ContactResponseDTOSchema }); -export type BusinessPartnerDetailResponseDTO = z.infer; - -/** - * UpdateBusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } district - * @property { string } countryId - */ -export const UpdateBusinessPartnerAddressDtoSchema = z.object({ street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), district: z.string().nullable(), countryId: z.string().nullable() }).partial(); -export type UpdateBusinessPartnerAddressDto = z.infer; - -/** - * UpdateBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code - * @property { string } shortName Updated short name - * @property { string } name Updated full name - * @property { string } secondaryName Updated secondary name - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { UpdateBusinessPartnerAddressDto } address Address information - * @property { UpdateBusinessPartnerAddressDto } blAddress Bl address information - * @property { string } belongsToId Parent business partner - * @property { string } salesRepId Sales representative - * @property { string } operationsId Operations contact - * @property { boolean } addressIsDifferentForBl Different address for BL - */ -export const UpdateBusinessPartnerRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), name: z.string().nullable(), secondaryName: z.string().nullable(), types: z.array(CommonModels.BusinessPartnerTypeSchema).nullable(), address: UpdateBusinessPartnerAddressDtoSchema.nullable(), blAddress: UpdateBusinessPartnerAddressDtoSchema.nullable(), belongsToId: z.string().nullable(), salesRepId: z.string().nullable(), operationsId: z.string().nullable(), addressIsDifferentForBl: z.boolean().nullable() }).partial(); -export type UpdateBusinessPartnerRequestDTO = z.infer; - -/** - * CreateBusinessPartnerRemarkRequestDTOSchema - * @type { object } - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of remark - */ -export const CreateBusinessPartnerRemarkRequestDTOSchema = z.object({ visibility: RemarkVisibilitySchema, content: z.string(), type: RemarkTypeSchema }); -export type CreateBusinessPartnerRemarkRequestDTO = z.infer; - -/** - * UpdateBusinessPartnerRemarkRequestDtoSchema - * @type { object } - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of remark - */ -export const UpdateBusinessPartnerRemarkRequestDtoSchema = z.object({ visibility: RemarkVisibilitySchema.nullable(), content: z.string().nullable(), type: RemarkTypeSchema.nullable() }).partial(); -export type UpdateBusinessPartnerRemarkRequestDto = z.infer; - -/** - * AccountTypeEnumSchema - * @type { enum } - */ -export const AccountTypeEnumSchema = z.enum(["Direct Account", "Logistic Provider / Forwarder", "4PL/NVOCC", "LLP", "Carrier", "Service Provider (other)", "Strategic", "Key Account", "Transactional", "Agent", "Other"]); -export type AccountTypeEnum = z.infer; -export const AccountTypeEnum = AccountTypeEnumSchema.enum; - -/** - * BusinessPartnerAuthorizationSchema - * @type { enum } - */ -export const BusinessPartnerAuthorizationSchema = z.enum(["requiresApproval", "blocked", "regularBusinessPartner"]); -export type BusinessPartnerAuthorization = z.infer; -export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.enum; - -/** - * BusinessPartnerPaymentTermsResponseDtoSchema - * @type { object } - * @property { string } relativeTo - * @property { number } days Minimum: `0` - */ -export const BusinessPartnerPaymentTermsResponseDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }); -export type BusinessPartnerPaymentTermsResponseDto = z.infer; - -/** - * BusinessPartnerBankAccountResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BusinessPartnerBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type BusinessPartnerBankAccountResponseDto = z.infer; - -/** - * PartnerNetworkInfoDtoSchema - * @type { object } - * @property { string } id Partner network ID - * @property { string } name Partner network name - */ -export const PartnerNetworkInfoDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type PartnerNetworkInfoDto = z.infer; - -/** - * BusinessPartnerBasicResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Reference to the business partner - * @property { string[] } relationship List of relationships - * @property { AccountTypeEnum } accountType - * @property { string } vat VAT number - * @property { string } legacySystemId Legacy system (move) id - * @property { string } registrationNumber - * @property { string } eori EORI number - * @property { BusinessPartnerAuthorization } authorization Authorization status - * @property { number } creditLimit Credit limit - * @property { string } invoiceLanguage Invoice language - * @property { string } invoiceCurrency Invoice currency - * @property { string } iban IBAN - * @property { string } bankNumber Bank number - * @property { string } bankAccountNumber Bank account number - * @property { BusinessPartnerPaymentTermsResponseDto } termsExport - * @property { BusinessPartnerPaymentTermsResponseDto } termsImport - * @property { CommonModels.EditorContentResponseDto } notes Notes - * @property { string } bankAccountId - * @property { BusinessPartnerBankAccountResponseDto } bankAccount - * @property { PartnerNetworkInfoDto[] } partnerNetworks Partner networks - * @property { string } dunningSystemId - * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem - * @property { string } hblIssuerSigner HBL issuer/signer prefill - * @property { string } signatureFileAttachmentId Signature file attachment ID - * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment - */ -export const BusinessPartnerBasicResponseDTOSchema = z.object({ businessPartnerId: z.string(), relationship: z.array(z.string()), accountType: AccountTypeEnumSchema.nullish(), vat: z.string(), legacySystemId: z.string().nullish(), registrationNumber: z.string().nullish(), eori: z.string(), authorization: BusinessPartnerAuthorizationSchema.nullable(), creditLimit: z.number(), invoiceLanguage: z.string(), invoiceCurrency: z.string(), iban: z.string(), bankNumber: z.string(), bankAccountNumber: z.string(), termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, notes: CommonModels.EditorContentResponseDtoSchema.nullish(), bankAccountId: z.string().nullish(), bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), partnerNetworks: z.array(PartnerNetworkInfoDtoSchema), dunningSystemId: z.string().nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), hblIssuerSigner: z.string(), signatureFileAttachmentId: z.string(), signatureFileAttachmentUrl: z.string().nullish() }); -export type BusinessPartnerBasicResponseDTO = z.infer; - -/** - * UpdateBusinessPartnerPaymentTermsDtoSchema - * @type { object } - * @property { string } relativeTo - * @property { number } days Minimum: `0` - */ -export const UpdateBusinessPartnerPaymentTermsDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema.nullable(), days: z.number().gte(0).nullable() }).partial(); -export type UpdateBusinessPartnerPaymentTermsDto = z.infer; - -/** - * UpdateBusinessPartnerBasicRequestDTOSchema - * @type { object } - * @property { string[] } relationship Updated relationships - * @property { string } vat Updated VAT number - * @property { string } eori Updated EORI number - * @property { AccountTypeEnum } accountType - * @property { BusinessPartnerAuthorization } authorization Updated authorization status - * @property { number } creditLimit Updated credit limit - * @property { string } invoiceLanguage Invoice language - * @property { string } invoiceCurrency Invoice currency - * @property { string } iban IBAN - * @property { string } bankNumber Bank number - * @property { string } bankAccountNumber Bank account number - * @property { string } legacySystemId Legacy system (move) id - * @property { string } registrationNumber - * @property { UpdateBusinessPartnerPaymentTermsDto } termsExport - * @property { UpdateBusinessPartnerPaymentTermsDto } termsImport - * @property { CommonModels.EditorContentUpdateDto } notes Notes - * @property { string } bankAccountId - * @property { string[] } partnerNetworkIds Partner network IDs - * @property { string } dunningSystemId Dunning system ID - * @property { string } hblIssuerSigner HBL issuer/signer prefill - * @property { string } signatureFileAttachmentId Signature file attachment ID - */ -export const UpdateBusinessPartnerBasicRequestDTOSchema = z.object({ relationship: z.array(z.string()).nullable(), vat: z.string().nullable(), eori: z.string().nullable(), accountType: AccountTypeEnumSchema.nullable(), authorization: BusinessPartnerAuthorizationSchema.nullable(), creditLimit: z.number().nullable(), invoiceLanguage: z.string().nullable(), invoiceCurrency: z.string().nullable(), iban: z.string().nullable(), bankNumber: z.string().nullable(), bankAccountNumber: z.string().nullable(), legacySystemId: z.string().nullable(), registrationNumber: z.string().nullable(), termsExport: UpdateBusinessPartnerPaymentTermsDtoSchema.nullable(), termsImport: UpdateBusinessPartnerPaymentTermsDtoSchema.nullable(), notes: CommonModels.EditorContentUpdateDtoSchema.nullable(), bankAccountId: z.string().nullable(), partnerNetworkIds: z.array(z.string()).nullable(), dunningSystemId: z.string().nullable(), hblIssuerSigner: z.string().nullable(), signatureFileAttachmentId: z.string().nullable() }).partial(); -export type UpdateBusinessPartnerBasicRequestDTO = z.infer; - -/** - * BusinessPartnerSignatureUploadRequestDTOSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType Mime type - * @property { number } fileSize File size in bytes. Minimum: `1` - */ -export const BusinessPartnerSignatureUploadRequestDTOSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number().gte(1) }); -export type BusinessPartnerSignatureUploadRequestDTO = z.infer; - -/** - * BusinessPartnerSignatureUploadResponseDTOSchema - * @type { object } - * @property { string } mediaId Media ID for the uploaded signature - * @property { string } method HTTP method to use for upload - * @property { string } url URL to upload the file to - */ -export const BusinessPartnerSignatureUploadResponseDTOSchema = z.object({ mediaId: z.string(), method: z.string(), url: z.string() }); -export type BusinessPartnerSignatureUploadResponseDTO = z.infer; - -/** - * CargoAgentResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Business partner identifier - * @property { string } portOfHamburgAccountNumber Port of Hamburg account number - * @property { string } iataAccountNumber IATA account number - * @property { string } regulatedAgentCode Regulated agent code - */ -export const CargoAgentResponseDTOSchema = z.object({ businessPartnerId: z.string(), portOfHamburgAccountNumber: z.string(), iataAccountNumber: z.string(), regulatedAgentCode: z.string() }); -export type CargoAgentResponseDTO = z.infer; - -/** - * UpdateCargoAgentDTOSchema - * @type { object } - * @property { string } portOfHamburgAccountNumber Hamburg port account number - * @property { string } iataAccountNumber IATA account number - * @property { string } regulatedAgentCode Regulated agent code - */ -export const UpdateCargoAgentDTOSchema = z.object({ portOfHamburgAccountNumber: z.string().nullable(), iataAccountNumber: z.string().nullable(), regulatedAgentCode: z.string().nullable() }).partial(); -export type UpdateCargoAgentDTO = z.infer; - -/** - * CarrierResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Business partner identifier - * @property { string } scac SCAC code - * @property { string } iataAirlinePrefix IATA airline prefix - * @property { string } iataCode IATA code - * @property { string } registrationAddress Registration address - * @property { string } masterBlSuffix Master BL suffix - * @property { string } houseBlSuffix House BL suffix - * @property { string } airWaybillSuffix Air waybill suffix - * @property { string } cargoManifestSuffix Cargo manifest suffix - * @property { string } fundReportSuffix Fund report suffix - * @property { string } invoiceSuffix Invoice suffix - */ -export const CarrierResponseDTOSchema = z.object({ businessPartnerId: z.string(), scac: z.string(), iataAirlinePrefix: z.string(), iataCode: z.string(), registrationAddress: z.string(), masterBlSuffix: z.string(), houseBlSuffix: z.string(), airWaybillSuffix: z.string(), cargoManifestSuffix: z.string(), fundReportSuffix: z.string(), invoiceSuffix: z.string() }); -export type CarrierResponseDTO = z.infer; - -/** - * UpdateCarrierDTOSchema - * @type { object } - * @property { string } scac SCAC code - * @property { string } iataAirlinePrefix IATA airline prefix - * @property { string } iataCode IATA code - * @property { string } registrationAddress Registration address - * @property { string } masterBlSuffix Master BL suffix - * @property { string } houseBlSuffix House BL suffix - * @property { string } airWaybillSuffix Air waybill suffix - * @property { string } cargoManifestSuffix Cargo manifest suffix - * @property { string } fundReportSuffix Fund report suffix - * @property { string } invoiceSuffix Invoice suffix - */ -export const UpdateCarrierDTOSchema = z.object({ scac: z.string().nullable(), iataAirlinePrefix: z.string().nullable(), iataCode: z.string().nullable(), registrationAddress: z.string().nullable(), masterBlSuffix: z.string().nullable(), houseBlSuffix: z.string().nullable(), airWaybillSuffix: z.string().nullable(), cargoManifestSuffix: z.string().nullable(), fundReportSuffix: z.string().nullable(), invoiceSuffix: z.string().nullable() }).partial(); -export type UpdateCarrierDTO = z.infer; - -/** - * BusinessPartnersPaginateOrderParamEnumSchema - * @type { enum } - */ -export const BusinessPartnersPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); -export type BusinessPartnersPaginateOrderParamEnum = z.infer; -export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOrderParamEnumSchema.enum; - -/** - * BusinessPartnersPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BusinessPartnerListResponseDTO[] } items - */ -export const BusinessPartnersPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).nullable() }).partial().shape }); -export type BusinessPartnersPaginateResponse = z.infer; - -/** - * BusinessPartnersPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const BusinessPartnersPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); -export type BusinessPartnersPaginateLabelsOrderParamEnum = z.infer; -export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPaginateLabelsOrderParamEnumSchema.enum; - -/** - * BusinessPartnersPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items - */ -export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).nullable() }).partial().shape }); -export type BusinessPartnersPaginateLabelsResponse = z.infer; - -/** - * GetRemarksResponseSchema - * @type { array } - */ -export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema); -export type GetRemarksResponse = z.infer; - -} diff --git a/test/generated/base/businessPartners/businessPartners.queries.ts b/test/generated/base/businessPartners/businessPartners.queries.ts deleted file mode 100644 index 3050547..0000000 --- a/test/generated/base/businessPartners/businessPartners.queries.ts +++ /dev/null @@ -1,642 +0,0 @@ -import axios, { } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnersAcl } from "./businessPartners.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnersModels } from "./businessPartners.models"; -import { BusinessPartnersApi } from "./businessPartners.api"; - -export namespace BusinessPartnersQueries { -export const moduleName = QueryModule.BusinessPartners; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - getById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id", officeId, id] as const, - getRemarks: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/remarks", officeId, id] as const, - getBasicInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/basic", officeId, id] as const, - getCargoAgentInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/cargo-agent", officeId, id] as const, - getCarrierInformation: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/carrier", officeId, id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate business partners - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate business partners - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create business partner - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { BusinessPartnersModels.CreateBusinessPartnerRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(BusinessPartnersAcl.canUseCreate({ officeId } )); - return BusinessPartnersApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetById` - * @summary Get business partner by ID - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetById({ officeId } )); - return BusinessPartnersApi.getById(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update business partner - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId } )); - return BusinessPartnersApi.update(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive business partner - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseArchive({ officeId } )); - return BusinessPartnersApi.archive(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive business partner - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId } )); - return BusinessPartnersApi.unarchive(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useLock` - * @summary Lock business partner - * @permission Requires `canUseLock` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useLock = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseLock({ officeId } )); - return BusinessPartnersApi.lock(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnlock` - * @summary Unlock business partner - * @permission Requires `canUseUnlock` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnlock = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId } )); - return BusinessPartnersApi.unlock(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetRemarks` - * @summary Get business partner remarks - * @permission Requires `canUseGetRemarks` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetRemarks = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getRemarks(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId } )); - return BusinessPartnersApi.getRemarks(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useCreateRemark` - * @summary Create business partner remark - * @permission Requires `canUseCreateRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId } )); - return BusinessPartnersApi.createRemark(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateRemark` - * @permission Requires `canUseUpdateRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { string } mutation.remarkId Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, remarkId, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId } )); - return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRemark` - * @summary Delete business partner remark - * @permission Requires `canUseDeleteRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { string } mutation.remarkId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, remarkId }) => { - checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId } )); - return BusinessPartnersApi.deleteRemark(officeId, id, remarkId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetBasicInfo` - * @summary Get business partner basic info - * @permission Requires `canUseGetBasicInfo` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBasicInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBasicInfo(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId } )); - return BusinessPartnersApi.getBasicInfo(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateBasicInfo` - * @summary Update business partner basic info - * @permission Requires `canUseUpdateBasicInfo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBasicInfo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId } )); - return BusinessPartnersApi.updateBasicInfo(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getBasicInfo(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateSignatureUploadInstructions` - * @summary Create upload instructions for business partner signature - * @permission Requires `canUseCreateSignatureUploadInstructions` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateSignatureUploadInstructions = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { - checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId } )); - const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions(officeId, id, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetCargoAgentInfo` - * @summary Get cargo agent information for business partner - * @permission Requires `canUseGetCargoAgentInfo` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoAgentInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoAgentInfo(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId } )); - return BusinessPartnersApi.getCargoAgentInfo(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCargoAgent` - * @summary Update cargo agent information for business partner - * @permission Requires `canUseUpdateCargoAgent` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateCargoAgentDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCargoAgent = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId } )); - return BusinessPartnersApi.updateCargoAgent(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getCargoAgentInfo(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetCarrierInformation` - * @summary Get carrier information for business partner - * @permission Requires `canUseGetCarrierInformation` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCarrierInformation = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCarrierInformation(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId } )); - return BusinessPartnersApi.getCarrierInformation(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCarrier` - * @summary Update carrier information for business partner - * @permission Requires `canUseUpdateCarrier` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateCarrierDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCarrier = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId } )); - return BusinessPartnersApi.updateCarrier(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getCarrierInformation(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/cargoTypes/cargoTypes.acl.ts b/test/generated/base/cargoTypes/cargoTypes.acl.ts deleted file mode 100644 index 404b05b..0000000 --- a/test/generated/base/cargoTypes/cargoTypes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CargoTypesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "CargoType" -] as AbilityTuple<"Read", "CargoType">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "CargoType" -] as AbilityTuple<"Create", "CargoType">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "CargoType" -] as AbilityTuple<"Read", "CargoType">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "CargoType" -] as AbilityTuple<"Read", "CargoType">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "CargoType" -] as AbilityTuple<"Update", "CargoType">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "CargoType" -] as AbilityTuple<"Archive", "CargoType">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "CargoType" -] as AbilityTuple<"Archive", "CargoType">; - -} diff --git a/test/generated/base/cargoTypes/cargoTypes.api.ts b/test/generated/base/cargoTypes/cargoTypes.api.ts deleted file mode 100644 index 48493ea..0000000 --- a/test/generated/base/cargoTypes/cargoTypes.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CargoTypesModels } from "./cargoTypes.models"; - -export namespace CargoTypesApi { -export const paginate = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, - `/cargo-types`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, ) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types`, - ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, - `/cargo-types/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}`, - - ) -}; -export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}`, - ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/cargoTypes/cargoTypes.configs.ts b/test/generated/base/cargoTypes/cargoTypes.configs.ts deleted file mode 100644 index 5d2769f..0000000 --- a/test/generated/base/cargoTypes/cargoTypes.configs.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CargoTypesModels } from "./cargoTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CargoTypesQueries } from "./cargoTypes.queries"; -import { CargoTypesAcl } from "./cargoTypes.acl"; - -export namespace CargoTypesConfigs { -export const cargoTypesConfig = { - meta: { - title: "Cargo Types", - }, - readAll: { - acl: CargoTypesAcl.canUsePaginate, - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - paginated: CargoTypesQueries.usePaginate, - infinite: CargoTypesQueries.usePaginateInfinite, - filters: { - schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, - options: { - inputs: { - module: true, - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - shortName: true, - length: true, - width: true, - height: true, - unit: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - modules: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CargoTypesAcl.canUseFindById, - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - query: CargoTypesQueries.useFindById, - }, - create: { - acl: CargoTypesAcl.canUseCreate, - schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, - mutation: CargoTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - length: true, - width: true, - height: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - unit: true, - modules: true, - }, - }, -}) - }, - update: { - acl: CargoTypesAcl.canUseUpdate, - schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, - mutation: CargoTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - length: true, - width: true, - height: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - unit: true, - modules: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CargoTypesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CargoTypesQueries.usePaginateLabels, - infinite: CargoTypesQueries.usePaginateLabelsInfinite, - filters: { - schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/cargoTypes/cargoTypes.models.ts b/test/generated/base/cargoTypes/cargoTypes.models.ts deleted file mode 100644 index 660798b..0000000 --- a/test/generated/base/cargoTypes/cargoTypes.models.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CargoTypesModels { -/** - * CargoTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type CargoTypeEmployeeDTO = z.infer; - -/** - * CargoTypeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the cargo type - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { string } unit Measurement unit for dimensions - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type - * @property { boolean } archived Indicates if the cargo type is archived - * @property { string } createdById - * @property { CargoTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CargoTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const CargoTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), shortName: z.string().nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), unit: z.string(), emptyWeight: z.number().nullish(), containerIsoCode: z.string().nullish(), isContainer: z.boolean().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), archived: z.boolean(), createdById: z.string().nullish(), createdBy: CargoTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CargoTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type CargoTypeResponseDTO = z.infer; - -/** - * TransportModuleEnumSchema - * @type { enum } - */ -export const TransportModuleEnumSchema = z.enum(["Air", "Sea", "Road"]); -export type TransportModuleEnum = z.infer; -export const TransportModuleEnum = TransportModuleEnumSchema.enum; - -/** - * CargoTypePaginationFilterDtoSchema - * @type { object } - * @property { TransportModuleEnum } module - * @property { boolean } archived Archived status filter - * @property { string } search - */ -export const CargoTypePaginationFilterDtoSchema = z.object({ module: TransportModuleEnumSchema.nullable(), archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); -export type CargoTypePaginationFilterDto = z.infer; - -/** - * CreateCargoTypeRequestDTOSchema - * @type { object } - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { string } unit Measurement unit for dimensions - * @property { CommonModels.TransportModeEnum[] } modules Transport modes applicable to the cargo type - */ -export const CreateCargoTypeRequestDTOSchema = z.object({ name: z.string(), shortName: z.string().nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), emptyWeight: z.number().nullish(), containerIsoCode: z.string().nullish(), isContainer: z.boolean().nullish(), unit: z.string(), modules: z.array(CommonModels.TransportModeEnumSchema) }); -export type CreateCargoTypeRequestDTO = z.infer; - -/** - * UpdateCargoTypeRequestDTOSchema - * @type { object } - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { string } unit Measurement unit for dimensions - * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type - */ -export const UpdateCargoTypeRequestDTOSchema = z.object({ name: z.string().nullable(), shortName: z.string().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), emptyWeight: z.number().nullable(), containerIsoCode: z.string().nullable(), isContainer: z.boolean().nullable(), unit: z.string().nullable(), modules: z.array(CommonModels.TransportModeEnumSchema).nullable() }).partial(); -export type UpdateCargoTypeRequestDTO = z.infer; - -/** - * CargoTypeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const CargoTypeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type CargoTypeLabelFilterDto = z.infer; - -/** - * CargoTypesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const CargoTypesPaginateOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type CargoTypesPaginateOrderParamEnum = z.infer; -export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnumSchema.enum; - -/** - * CargoTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CargoTypeResponseDTO[] } items - */ -export const CargoTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CargoTypeResponseDTOSchema).nullable() }).partial().shape }); -export type CargoTypesPaginateResponse = z.infer; - -/** - * CargoTypesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const CargoTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type CargoTypesPaginateLabelsOrderParamEnum = z.infer; -export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * CargoTypesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const CargoTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type CargoTypesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/cargoTypes/cargoTypes.queries.ts b/test/generated/base/cargoTypes/cargoTypes.queries.ts deleted file mode 100644 index f0d98ae..0000000 --- a/test/generated/base/cargoTypes/cargoTypes.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CargoTypesAcl } from "./cargoTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CargoTypesModels } from "./cargoTypes.models"; -import { CargoTypesApi } from "./cargoTypes.api"; - -export namespace CargoTypesQueries { -export const moduleName = QueryModule.CargoTypes; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string) => [...keys.all, "/cargo-types", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/cargo-types/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Cargo Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Cargo Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Cargo Type - * @permission Requires `canUseCreate` ability - * @param { CargoTypesModels.CreateCargoTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CargoTypesAcl.canUseCreate()); - return CargoTypesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate cargo types with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate cargo types with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get Cargo Type by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(CargoTypesAcl.canUseFindById()); - return CargoTypesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Cargo Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { CargoTypesModels.UpdateCargoTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(CargoTypesAcl.canUseUpdate()); - return CargoTypesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Cargo Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CargoTypesAcl.canUseArchive()); - return CargoTypesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive Cargo Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CargoTypesAcl.canUseUnarchive()); - return CargoTypesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/chargeTypes/chargeTypes.acl.ts b/test/generated/base/chargeTypes/chargeTypes.acl.ts deleted file mode 100644 index 469c483..0000000 --- a/test/generated/base/chargeTypes/chargeTypes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace ChargeTypesAcl { -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "ChargeType" -] as AbilityTuple<"Read", "ChargeType">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "ChargeType" -] as AbilityTuple<"Read", "ChargeType">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "ChargeType" -] as AbilityTuple<"Create", "ChargeType">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "ChargeType" -] as AbilityTuple<"Read", "ChargeType">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "ChargeType" -] as AbilityTuple<"Update", "ChargeType">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "ChargeType" -] as AbilityTuple<"Archive", "ChargeType">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "ChargeType" -] as AbilityTuple<"Archive", "ChargeType">; - -} diff --git a/test/generated/base/chargeTypes/chargeTypes.api.ts b/test/generated/base/chargeTypes/chargeTypes.api.ts deleted file mode 100644 index acbab42..0000000 --- a/test/generated/base/chargeTypes/chargeTypes.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChargeTypesModels } from "./chargeTypes.models"; - -export namespace ChargeTypesApi { -export const findAll = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, - `/charge-types/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, - `/charge-types`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, ) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types`, - ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}`, - - ) -}; -export const update = (id: string, data: ChargeTypesModels.UpdateChargeTypeRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}`, - ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/chargeTypes/chargeTypes.configs.ts b/test/generated/base/chargeTypes/chargeTypes.configs.ts deleted file mode 100644 index 30d69aa..0000000 --- a/test/generated/base/chargeTypes/chargeTypes.configs.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChargeTypesModels } from "./chargeTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChargeTypesQueries } from "./chargeTypes.queries"; -import { ChargeTypesAcl } from "./chargeTypes.acl"; - -export namespace ChargeTypesConfigs { -export const chargeTypesConfig = { - meta: { - title: "Charge Types", - }, - readAll: { - acl: ChargeTypesAcl.canUsePaginate, - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - paginated: ChargeTypesQueries.usePaginate, - infinite: ChargeTypesQueries.usePaginateInfinite, - filters: { - schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, - options: { - inputs: { - name: true, - search: true, - archived: true, - direction: true, - transportModes: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ChargeTypesAcl.canUseFindById, - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - query: ChargeTypesQueries.useFindById, - }, - create: { - acl: ChargeTypesAcl.canUseCreate, - schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, - mutation: ChargeTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, - options: { - inputs: { - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - }, - }, -}) - }, - update: { - acl: ChargeTypesAcl.canUseUpdate, - schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, - mutation: ChargeTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, - options: { - inputs: { - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ChargeTypesAcl.canUseFindAll, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChargeTypesQueries.useFindAll, - infinite: ChargeTypesQueries.useFindAllInfinite, - filters: { - schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, - options: { - inputs: { - direction: true, - transportModes: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/chargeTypes/chargeTypes.models.ts b/test/generated/base/chargeTypes/chargeTypes.models.ts deleted file mode 100644 index 2175f9b..0000000 --- a/test/generated/base/chargeTypes/chargeTypes.models.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChargeTypesModels { -/** - * ChargeTypeLabelFilterDtoSchema - * @type { object } - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum[] } transportModes - * @property { string } search - */ -export const ChargeTypeLabelFilterDtoSchema = z.object({ direction: CommonModels.DirectionEnumSchema.nullable(), transportModes: z.array(CommonModels.TransportModeEnumSchema).nullable(), search: z.string().nullable() }).partial(); -export type ChargeTypeLabelFilterDto = z.infer; - -/** - * ChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ -export const ChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }); -export type ChargeTypeTranslationDto = z.infer; - -/** - * ChargeTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChargeTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ChargeTypeEmployeeDTO = z.infer; - -/** - * ChargeTypeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { ChargeTypeTranslationDto[] } translations - * @property { string } createdById - * @property { ChargeTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { ChargeTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const ChargeTypeResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), directions: z.array(CommonModels.DirectionEnumSchema), translations: z.array(ChargeTypeTranslationDtoSchema), createdById: z.string().nullish(), createdBy: ChargeTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type ChargeTypeResponseDTO = z.infer; - -/** - * ChargeTypePaginationFilterDtoSchema - * @type { object } - * @property { string } name - * @property { string } search - * @property { boolean } archived - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum[] } transportModes - */ -export const ChargeTypePaginationFilterDtoSchema = z.object({ name: z.string().nullable(), search: z.string().nullable(), archived: z.boolean().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), transportModes: z.array(CommonModels.TransportModeEnumSchema).nullable() }).partial(); -export type ChargeTypePaginationFilterDto = z.infer; - -/** - * CreateChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ -export const CreateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }); -export type CreateChargeTypeTranslationDto = z.infer; - -/** - * CreateChargeTypeRequestDTOSchema - * @type { object } - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { CreateChargeTypeTranslationDto[] } translations - */ -export const CreateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string(), englishName: z.string().nullish(), archived: z.boolean().nullish(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), directions: z.array(CommonModels.DirectionEnumSchema), translations: z.array(CreateChargeTypeTranslationDtoSchema).nullish() }); -export type CreateChargeTypeRequestDTO = z.infer; - -/** - * UpdateChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ -export const UpdateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }); -export type UpdateChargeTypeTranslationDto = z.infer; - -/** - * UpdateChargeTypeRequestDTOSchema - * @type { object } - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { UpdateChargeTypeTranslationDto[] } translations - */ -export const UpdateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string().nullable(), englishName: z.string().nullable(), archived: z.boolean().nullable(), description: z.string().nullable(), modules: z.array(CommonModels.TransportModeEnumSchema).nullable(), directions: z.array(CommonModels.DirectionEnumSchema).nullable(), translations: z.array(UpdateChargeTypeTranslationDtoSchema).nullable() }).partial(); -export type UpdateChargeTypeRequestDTO = z.infer; - -/** - * ChargeTypesFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ChargeTypesFindAllOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); -export type ChargeTypesFindAllOrderParamEnum = z.infer; -export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnumSchema.enum; - -/** - * ChargeTypesFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ChargeTypesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type ChargeTypesFindAllResponse = z.infer; - -/** - * ChargeTypesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ChargeTypesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); -export type ChargeTypesPaginateOrderParamEnum = z.infer; -export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEnumSchema.enum; - -/** - * ChargeTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChargeTypeResponseDTO[] } items - */ -export const ChargeTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).nullable() }).partial().shape }); -export type ChargeTypesPaginateResponse = z.infer; - -} diff --git a/test/generated/base/chargeTypes/chargeTypes.queries.ts b/test/generated/base/chargeTypes/chargeTypes.queries.ts deleted file mode 100644 index 93f7fcb..0000000 --- a/test/generated/base/chargeTypes/chargeTypes.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChargeTypesAcl } from "./chargeTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChargeTypesModels } from "./chargeTypes.models"; -import { ChargeTypesApi } from "./chargeTypes.api"; - -export namespace ChargeTypesQueries { -export const moduleName = QueryModule.ChargeTypes; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, - paginate: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string) => [...keys.all, "/charge-types", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/charge-types/:id", id] as const, -}; - -/** - * Query `useFindAll` - * @summary Paginate charge types with only their labels - * @permission Requires `canUseFindAll` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @summary Paginate charge types with only their labels - * @permission Requires `canUseFindAll` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Charge Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Charge Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new Charge Type - * @permission Requires `canUseCreate` ability - * @param { ChargeTypesModels.CreateChargeTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(ChargeTypesAcl.canUseCreate()); - return ChargeTypesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get Charge Type Details by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUseFindById()); - return ChargeTypesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update an existing Charge Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { ChargeTypesModels.UpdateChargeTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(ChargeTypesAcl.canUseUpdate()); - return ChargeTypesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a Charge Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ChargeTypesAcl.canUseArchive()); - return ChargeTypesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a Charge Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ChargeTypesAcl.canUseUnarchive()); - return ChargeTypesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/checklistItems/checklistItems.acl.ts b/test/generated/base/checklistItems/checklistItems.acl.ts deleted file mode 100644 index a58bf1f..0000000 --- a/test/generated/base/checklistItems/checklistItems.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ChecklistItemsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create checklist item in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Create", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List checklist items for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Paginate checklist item labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get checklist item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Update", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -} diff --git a/test/generated/base/checklistItems/checklistItems.api.ts b/test/generated/base/checklistItems/checklistItems.api.ts deleted file mode 100644 index 83ffdbe..0000000 --- a/test/generated/base/checklistItems/checklistItems.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChecklistItemsModels } from "./checklistItems.models"; - -export namespace ChecklistItemsApi { -export const create = (officeId: string, data: ChecklistItemsModels.CreateChecklistItemRequestDTO, ) => { - return AppRestClient.post( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items`, - ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), - - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, - `/offices/${officeId}/checklist-items`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, - `/offices/${officeId}/checklist-items/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items/${id}`, - ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-items/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-items/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/checklistItems/checklistItems.configs.ts b/test/generated/base/checklistItems/checklistItems.configs.ts deleted file mode 100644 index f67024d..0000000 --- a/test/generated/base/checklistItems/checklistItems.configs.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChecklistItemsModels } from "./checklistItems.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChecklistItemsQueries } from "./checklistItems.queries"; -import { ChecklistItemsAcl } from "./checklistItems.acl"; - -export namespace ChecklistItemsConfigs { -export const checklistItemsConfig = { - meta: { - title: "Checklist Items", - }, - readAll: { - acl: ChecklistItemsAcl.canUsePaginate, - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - paginated: ChecklistItemsQueries.usePaginate, - infinite: ChecklistItemsQueries.usePaginateInfinite, - filters: { - schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ChecklistItemsAcl.canUseFindById, - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - query: ChecklistItemsQueries.useFindById, - }, - create: { - acl: ChecklistItemsAcl.canUseCreate, - schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, - mutation: ChecklistItemsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: ChecklistItemsAcl.canUseUpdate, - schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, - mutation: ChecklistItemsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: ChecklistItemsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChecklistItemsQueries.usePaginateLabels, - infinite: ChecklistItemsQueries.usePaginateLabelsInfinite, - filters: { - schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/checklistItems/checklistItems.models.ts b/test/generated/base/checklistItems/checklistItems.models.ts deleted file mode 100644 index a5191f9..0000000 --- a/test/generated/base/checklistItems/checklistItems.models.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChecklistItemsModels { -/** - * ChecklistItemEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ChecklistItemEmployeeDTO = z.infer; - -/** - * ChecklistItemResponseDTOSchema - * @type { object } - * @property { string } id Checklist item ID - * @property { string } name Checklist item name - * @property { string } officeId Office ID - * @property { boolean } archived Is archived - * @property { string } archivedAt Archived at - * @property { string } createdById ID of the employee who created this checklist item - * @property { ChecklistItemEmployeeDTO } createdBy Employee who created this checklist item - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this checklist item - * @property { ChecklistItemEmployeeDTO } updatedBy Employee who last updated this checklist item - * @property { string } updatedAt Updated at - */ -export const ChecklistItemResponseDTOSchema = z.object({ id: z.string(), name: z.string(), officeId: z.string(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: ChecklistItemEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChecklistItemEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type ChecklistItemResponseDTO = z.infer; - -/** - * CreateChecklistItemRequestDTOSchema - * @type { object } - * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` - */ -export const CreateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256) }); -export type CreateChecklistItemRequestDTO = z.infer; - -/** - * ChecklistItemLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const ChecklistItemLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type ChecklistItemLabelFilterDto = z.infer; - -/** - * ChecklistItemFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ChecklistItemFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type ChecklistItemFilterDto = z.infer; - -/** - * UpdateChecklistItemRequestDTOSchema - * @type { object } - * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` - */ -export const UpdateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256).nullable() }).partial(); -export type UpdateChecklistItemRequestDTO = z.infer; - -/** - * ChecklistItemsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistItemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistItemsPaginateOrderParamEnum = z.infer; -export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderParamEnumSchema.enum; - -/** - * ChecklistItemsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChecklistItemResponseDTO[] } items - */ -export const ChecklistItemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).nullable() }).partial().shape }); -export type ChecklistItemsPaginateResponse = z.infer; - -/** - * ChecklistItemsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistItemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistItemsPaginateLabelsOrderParamEnum = z.infer; -export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * ChecklistItemsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type ChecklistItemsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/checklistItems/checklistItems.queries.ts b/test/generated/base/checklistItems/checklistItems.queries.ts deleted file mode 100644 index 17b4403..0000000 --- a/test/generated/base/checklistItems/checklistItems.queries.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChecklistItemsAcl } from "./checklistItems.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChecklistItemsModels } from "./checklistItems.models"; -import { ChecklistItemsApi } from "./checklistItems.api"; - -export namespace ChecklistItemsQueries { -export const moduleName = QueryModule.ChecklistItems; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-items/:id", id, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create checklist item - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ChecklistItemsModels.CreateChecklistItemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ChecklistItemsAcl.canUseCreate({ officeId } )); - return ChecklistItemsApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated checklist items - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated checklist items - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate checklist item labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate checklist item labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get checklist item by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUseFindById({ officeId } )); - return ChecklistItemsApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update checklist item - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ChecklistItemsModels.UpdateChecklistItemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId } )); - return ChecklistItemsApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive checklist item - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistItemsAcl.canUseArchive({ officeId } )); - return ChecklistItemsApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive checklist item - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId } )); - return ChecklistItemsApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/checklistTemplates/checklistTemplates.acl.ts b/test/generated/base/checklistTemplates/checklistTemplates.acl.ts deleted file mode 100644 index d92f5fd..0000000 --- a/test/generated/base/checklistTemplates/checklistTemplates.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ChecklistTemplatesAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create checklist template in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Create", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List checklist templates for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Get checklist template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get checklist template by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Update", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -} diff --git a/test/generated/base/checklistTemplates/checklistTemplates.api.ts b/test/generated/base/checklistTemplates/checklistTemplates.api.ts deleted file mode 100644 index 45c958a..0000000 --- a/test/generated/base/checklistTemplates/checklistTemplates.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; - -export namespace ChecklistTemplatesApi { -export const create = (officeId: string, data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, ) => { - return AppRestClient.post( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates`, - ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), - - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, - `/offices/${officeId}/checklist-templates`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/checklist-templates/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, ) => { - return AppRestClient.put( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates/${id}`, - ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-templates/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-templates/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/checklistTemplates/checklistTemplates.configs.ts b/test/generated/base/checklistTemplates/checklistTemplates.configs.ts deleted file mode 100644 index 474d9c0..0000000 --- a/test/generated/base/checklistTemplates/checklistTemplates.configs.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChecklistTemplatesQueries } from "./checklistTemplates.queries"; -import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; - -export namespace ChecklistTemplatesConfigs { -export const checklistTemplatesConfig = { - meta: { - title: "Checklist Templates", - }, - readAll: { - acl: ChecklistTemplatesAcl.canUsePaginate, - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - paginated: ChecklistTemplatesQueries.usePaginate, - infinite: ChecklistTemplatesQueries.usePaginateInfinite, - filters: { - schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - items: true, - }, - sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ChecklistTemplatesAcl.canUseFindById, - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - query: ChecklistTemplatesQueries.useFindById, - }, - create: { - acl: ChecklistTemplatesAcl.canUseCreate, - schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, - mutation: ChecklistTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: ChecklistTemplatesAcl.canUseUpdate, - schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, - mutation: ChecklistTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - items: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ChecklistTemplatesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChecklistTemplatesQueries.usePaginateLabels, - infinite: ChecklistTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/checklistTemplates/checklistTemplates.models.ts b/test/generated/base/checklistTemplates/checklistTemplates.models.ts deleted file mode 100644 index a26204c..0000000 --- a/test/generated/base/checklistTemplates/checklistTemplates.models.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChecklistTemplatesModels { -/** - * ChecklistTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ChecklistTemplateEmployeeDTO = z.infer; - -/** - * ChecklistTemplateItemResponseDTOSchema - * @type { object } - * @property { string } checklistItemId Checklist item id - * @property { number } order Order index - * @property { string } name Checklist item name - */ -export const ChecklistTemplateItemResponseDTOSchema = z.object({ checklistItemId: z.string(), order: z.number(), name: z.string().nullish() }); -export type ChecklistTemplateItemResponseDTO = z.infer; - -/** - * ChecklistTemplateResponseDTOSchema - * @type { object } - * @property { string } id Template id - * @property { string } name Template name - * @property { string } officeId Office id - * @property { boolean } archived Is archived - * @property { string } archivedAt Archived at - * @property { string } createdById ID of the employee who created this template - * @property { ChecklistTemplateEmployeeDTO } createdBy Employee who created this template - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this template - * @property { ChecklistTemplateEmployeeDTO } updatedBy Employee who last updated this template - * @property { string } updatedAt Updated at - * @property { ChecklistTemplateItemResponseDTO[] } items Ordered items - */ -export const ChecklistTemplateResponseDTOSchema = z.object({ id: z.string(), name: z.string(), officeId: z.string(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: ChecklistTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChecklistTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), items: z.array(ChecklistTemplateItemResponseDTOSchema) }); -export type ChecklistTemplateResponseDTO = z.infer; - -/** - * CreateChecklistTemplateRequestDTOSchema - * @type { object } - * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` - */ -export const CreateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120) }); -export type CreateChecklistTemplateRequestDTO = z.infer; - -/** - * ChecklistTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const ChecklistTemplateLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type ChecklistTemplateLabelFilterDto = z.infer; - -/** - * ChecklistTemplateFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ChecklistTemplateFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type ChecklistTemplateFilterDto = z.infer; - -/** - * UpdateChecklistTemplateRequestDTOSchema - * @type { object } - * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` - * @property { string[] } items Ordered checklist item ids - */ -export const UpdateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120), items: z.array(z.uuid()) }); -export type UpdateChecklistTemplateRequestDTO = z.infer; - -/** - * ChecklistTemplatesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistTemplatesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistTemplatesPaginateOrderParamEnum = z.infer; -export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPaginateOrderParamEnumSchema.enum; - -/** - * ChecklistTemplatesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChecklistTemplateResponseDTO[] } items - */ -export const ChecklistTemplatesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).nullable() }).partial().shape }); -export type ChecklistTemplatesPaginateResponse = z.infer; - -/** - * ChecklistTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistTemplatesPaginateLabelsOrderParamEnum = z.infer; -export const ChecklistTemplatesPaginateLabelsOrderParamEnum = ChecklistTemplatesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * ChecklistTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type ChecklistTemplatesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/checklistTemplates/checklistTemplates.queries.ts b/test/generated/base/checklistTemplates/checklistTemplates.queries.ts deleted file mode 100644 index 00d431f..0000000 --- a/test/generated/base/checklistTemplates/checklistTemplates.queries.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; -import { ChecklistTemplatesApi } from "./checklistTemplates.api"; - -export namespace ChecklistTemplatesQueries { -export const moduleName = QueryModule.ChecklistTemplates; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-templates/:id", id, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create checklist template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId } )); - return ChecklistTemplatesApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated checklist templates - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated checklist templates - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate checklist template labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate checklist template labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get checklist template by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId } )); - return ChecklistTemplatesApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Replace checklist template - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId } )); - return ChecklistTemplatesApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive checklist template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId } )); - return ChecklistTemplatesApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive checklist template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId } )); - return ChecklistTemplatesApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/cities/cities.acl.ts b/test/generated/base/cities/cities.acl.ts deleted file mode 100644 index 877afd1..0000000 --- a/test/generated/base/cities/cities.acl.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CitiesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "City" -] as AbilityTuple<"Create", "City">; - -/** - * Use for `useListCityLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCityLabels` query - */ -export const canUseListCityLabels = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useGetCityLabelById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCityLabelById` query - */ -export const canUseGetCityLabelById = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "City" -] as AbilityTuple<"Update", "City">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "City" -] as AbilityTuple<"Archive", "City">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "City" -] as AbilityTuple<"Archive", "City">; - -} diff --git a/test/generated/base/cities/cities.api.ts b/test/generated/base/cities/cities.api.ts deleted file mode 100644 index af80ea7..0000000 --- a/test/generated/base/cities/cities.api.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CitiesModels } from "./cities.models"; - -export namespace CitiesApi { -export const paginate = (limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CitiesModels.CitiesPaginateResponseSchema }, - `/cities`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: CitiesModels.CreateCityRequestDTO, ) => { - return AppRestClient.post( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities`, - ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), - - ) -}; -export const listCityLabels = (limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CitiesModels.ListCityLabelsResponseSchema }, - `/cities/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getCityLabelById = (id: string, ) => { - return AppRestClient.get( - { resSchema: CitiesModels.CityLabelResponseDTOSchema }, - `/cities/${id}/labels`, - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities/${id}`, - - ) -}; -export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities/${id}`, - ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/cities/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/cities/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/cities/cities.configs.ts b/test/generated/base/cities/cities.configs.ts deleted file mode 100644 index f31740c..0000000 --- a/test/generated/base/cities/cities.configs.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CitiesModels } from "./cities.models"; -import { CitiesQueries } from "./cities.queries"; -import { CitiesAcl } from "./cities.acl"; - -export namespace CitiesConfigs { -export const citiesConfig = { - meta: { - title: "Cities", - }, - readAll: { - acl: CitiesAcl.canUsePaginate, - schema: CitiesModels.CityResponseDTOSchema, - paginated: CitiesQueries.usePaginate, - infinite: CitiesQueries.usePaginateInfinite, - filters: { - schema: CitiesModels.CityPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CitiesModels.CityPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CitiesModels.CityResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - isoCode: true, - stateCode: true, - archived: true, - countryId: true, - country: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CitiesModels.CitiesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CitiesAcl.canUseFindById, - schema: CitiesModels.CityResponseDTOSchema, - query: CitiesQueries.useFindById, - }, - create: { - acl: CitiesAcl.canUseCreate, - schema: CitiesModels.CreateCityRequestDTOSchema, - mutation: CitiesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CitiesModels.CreateCityRequestDTOSchema, - options: { - inputs: { - name: true, - isoCode: true, - stateCode: true, - countryId: true, - }, - }, -}) - }, - update: { - acl: CitiesAcl.canUseUpdate, - schema: CitiesModels.UpdateCityRequestDTOSchema, - mutation: CitiesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CitiesModels.UpdateCityRequestDTOSchema, - options: { - inputs: { - name: true, - isoCode: true, - stateCode: true, - countryId: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: CitiesAcl.canUseListCityLabels, - schema: CitiesModels.CityLabelResponseDTOSchema, - paginated: CitiesQueries.useListCityLabels, - infinite: CitiesQueries.useListCityLabelsInfinite, - filters: { - schema: CitiesModels.CityLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CitiesModels.CityLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CitiesModels.CityLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - country: true, - }, - sortable: CitiesModels.ListCityLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/cities/cities.models.ts b/test/generated/base/cities/cities.models.ts deleted file mode 100644 index 4fbb83e..0000000 --- a/test/generated/base/cities/cities.models.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CitiesModels { -/** - * CityCountryDtoSchema - * @type { object } - * @property { string } id Unique identifier of the country - * @property { string } name Name of the country - * @property { string } isoCode2 2 character iso code of the country - * @property { string } isoCode3 3 character iso code of the country - */ -export const CityCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type CityCountryDto = z.infer; - -/** - * CityEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type CityEmployeeDTO = z.infer; - -/** - * CityResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the city - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { boolean } archived Whether the city is archived - * @property { string } countryId Country ID - * @property { CityCountryDto } country - * @property { string } createdById - * @property { CityEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CityEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const CityResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isoCode: z.string().nullish(), stateCode: z.string().nullish(), archived: z.boolean().nullish(), countryId: z.string().nullish(), country: CityCountryDtoSchema.nullish(), createdById: z.string().nullish(), createdBy: CityEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CityEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type CityResponseDTO = z.infer; - -/** - * CityLabelCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type CityLabelCountryDto = z.infer; - -/** - * CityLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { CityLabelCountryDto } country - */ -export const CityLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }); -export type CityLabelResponseDTO = z.infer; - -/** - * CityPaginationFilterDtoSchema - * @type { object } - * @property { string } search Free search - * @property { boolean } archived - */ -export const CityPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type CityPaginationFilterDto = z.infer; - -/** - * CityLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const CityLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type CityLabelFilterDto = z.infer; - -/** - * CreateCityRequestDTOSchema - * @type { object } - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { string } countryId Country ID - */ -export const CreateCityRequestDTOSchema = z.object({ name: z.string(), isoCode: z.string().nullish(), stateCode: z.string().nullish(), countryId: z.string() }); -export type CreateCityRequestDTO = z.infer; - -/** - * UpdateCityRequestDTOSchema - * @type { object } - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { string } countryId Country ID - */ -export const UpdateCityRequestDTOSchema = z.object({ name: z.string().nullable(), isoCode: z.string().nullable(), stateCode: z.string().nullable(), countryId: z.string().nullable() }).partial(); -export type UpdateCityRequestDTO = z.infer; - -/** - * CitiesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const CitiesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type CitiesPaginateOrderParamEnum = z.infer; -export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.enum; - -/** - * CitiesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CityResponseDTO[] } items - */ -export const CitiesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityResponseDTOSchema).nullable() }).partial().shape }); -export type CitiesPaginateResponse = z.infer; - -/** - * ListCityLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ListCityLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ListCityLabelsOrderParamEnum = z.infer; -export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.enum; - -/** - * ListCityLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CityLabelResponseDTO[] } items - */ -export const ListCityLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityLabelResponseDTOSchema).nullable() }).partial().shape }); -export type ListCityLabelsResponse = z.infer; - -} diff --git a/test/generated/base/cities/cities.queries.ts b/test/generated/base/cities/cities.queries.ts deleted file mode 100644 index a8b951b..0000000 --- a/test/generated/base/cities/cities.queries.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CitiesAcl } from "./cities.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CitiesModels } from "./cities.models"; -import { CitiesApi } from "./cities.api"; - -export namespace CitiesQueries { -export const moduleName = QueryModule.Cities; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string) => [...keys.all, "/cities", "infinite", limit, order, filter, cursor] as const, - listCityLabels: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities/paginate/labels", limit, order, filter, page, cursor] as const, - listCityLabelsInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string) => [...keys.all, "/cities/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getCityLabelById: (id: string) => [...keys.all, "/cities/:id/labels", id] as const, - findById: (id: string) => [...keys.all, "/cities/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Cities - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Cities - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create city - * @permission Requires `canUseCreate` ability - * @param { CitiesModels.CreateCityRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CitiesAcl.canUseCreate()); - return CitiesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListCityLabels` - * @summary Paginate cities with only their labels (id and name) and country information - * @permission Requires `canUseListCityLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCityLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCityLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListCityLabelsInfinite - * @summary Paginate cities with only their labels (id and name) and country information - * @permission Requires `canUseListCityLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListCityLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetCityLabelById` - * @summary Get city by ID with label format (id and formatted name) and country information - * @permission Requires `canUseGetCityLabelById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCityLabelById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCityLabelById(id), - queryFn: () => { - checkAcl(CitiesAcl.canUseGetCityLabelById()); - return CitiesApi.getCityLabelById(id) }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get city by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(CitiesAcl.canUseFindById()); - return CitiesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update city - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { CitiesModels.UpdateCityRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(CitiesAcl.canUseUpdate()); - return CitiesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive city - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CitiesAcl.canUseArchive()); - return CitiesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive city - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CitiesAcl.canUseUnarchive()); - return CitiesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/common/common.models.ts b/test/generated/base/common/common.models.ts deleted file mode 100644 index 285ef85..0000000 --- a/test/generated/base/common/common.models.ts +++ /dev/null @@ -1,1860 +0,0 @@ -import { z } from "zod"; - -export namespace CommonModels { -/** - * PositionCargoPackageEnumSchema - * @type { enum } - */ -export const PositionCargoPackageEnumSchema = z.enum(["Hazardous", "NonStackable", "TemperatureControlled", "OversizedCargo", "DiplomaticCargo"]); -export type PositionCargoPackageEnum = z.infer; -export const PositionCargoPackageEnum = PositionCargoPackageEnumSchema.enum; - -/** - * HazardousSpecialtyEnumSchema - * @type { enum } - */ -export const HazardousSpecialtyEnumSchema = z.enum(["Explosives", "FlammableGas", "NonToxicAndFlammableGas", "PoisonGases", "FlammableLiquid", "FlammableSolid", "SpontaneouslyCombustible", "DangerousWhenWet", "Oxidizers", "OrganicPeroxides", "Poison", "InfectiousSubstances", "Radioactive", "Corrosive", "MiscellaneousDangerousSubstances"]); -export type HazardousSpecialtyEnum = z.infer; -export const HazardousSpecialtyEnum = HazardousSpecialtyEnumSchema.enum; - -/** - * RateOptionsEnumSchema - * @type { enum } - */ -export const RateOptionsEnumSchema = z.enum(["AsAgreed", "SpotRate"]); -export type RateOptionsEnum = z.infer; -export const RateOptionsEnum = RateOptionsEnumSchema.enum; - -/** - * RateClassEnumSchema - * @type { enum } - */ -export const RateClassEnumSchema = z.enum(["MinimumCharge", "NormalRate", "QuantityRate"]); -export type RateClassEnum = z.infer; -export const RateClassEnum = RateClassEnumSchema.enum; - -/** - * AccountInformationEnumSchema - * @type { enum } - * @description Account information - */ -export const AccountInformationEnumSchema = z.enum(["FreightCollect", "FreightPrepaid"]); -export type AccountInformationEnum = z.infer; -export const AccountInformationEnum = AccountInformationEnumSchema.enum; - -/** - * LanguageEnumSchema - * @type { enum } - */ -export const LanguageEnumSchema = z.enum(["English", "German", "Hungarian", "Czech", "Turkish", "Slovenian"]); -export type LanguageEnum = z.infer; -export const LanguageEnum = LanguageEnumSchema.enum; - -/** - * LocaleEnumSchema - * @type { enum } - */ -export const LocaleEnumSchema = z.enum(["en-US", "de-DE", "cs-CZ", "sl-SI", "tr-TR", "hu-HU"]); -export type LocaleEnum = z.infer; -export const LocaleEnum = LocaleEnumSchema.enum; - -/** - * OfficePaymentTermsDateTypeSchema - * @type { enum } - */ -export const OfficePaymentTermsDateTypeSchema = z.enum(["InvoiceDate", "ServiceDate"]); -export type OfficePaymentTermsDateType = z.infer; -export const OfficePaymentTermsDateType = OfficePaymentTermsDateTypeSchema.enum; - -/** - * FolderEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type FolderEmployeeDTO = z.infer; - -/** - * FileResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } archived - * @property { boolean } isSystem - * @property { string } createdAt - * @property { string } updatedAt - * @property { FolderEmployeeDTO } createdBy - * @property { FolderEmployeeDTO } updatedBy - * @property { string } downloadUrl - */ -export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }); -export type FileResponseDTO = z.infer; - -/** - * EditorContentUpdateDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const EditorContentUpdateDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); -export type EditorContentUpdateDto = z.infer; - -/** - * RemarkBlockDTOSchema - * @type { object } - * @property { string } id - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { EditorContentUpdateDto } content - */ -export const RemarkBlockDTOSchema = z.object({ id: z.string().nullable(), enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), content: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type RemarkBlockDTO = z.infer; - -/** - * TitleBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { string } defaultTitle - * @property { boolean } includePositionNumber - * @property { boolean } allowManualOverride - */ -export const TitleBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), defaultTitle: z.string().nullable(), includePositionNumber: z.boolean().nullable(), allowManualOverride: z.boolean().nullable() }).partial(); -export type TitleBlockDTO = z.infer; - -/** - * PositionInvolvedPartyTypeEnumSchema - * @type { enum } - */ -export const PositionInvolvedPartyTypeEnumSchema = z.enum(["Customer", "Notify", "AlsoNotify", "FOBForwarder", "RoutingAgent", "DeliveryAgent", "TransportProvider", "OceanCarrier", "OriginServiceProvider", "DestinationServiceProvider", "InsuranceProvider", "OriginCustomsAgent", "DestinationCustomsAgent", "StuffingProvider", "StrippingProvider", "Shipper", "Consignee", "CustomsBroker", "Courier", "Trucker", "Airline", "DestinationAgent", "OriginAgent"]); -export type PositionInvolvedPartyTypeEnum = z.infer; -export const PositionInvolvedPartyTypeEnum = PositionInvolvedPartyTypeEnumSchema.enum; - -/** - * ReceiverBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { string } defaultRole - */ -export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema.nullable() }).partial(); -export type ReceiverBlockDTO = z.infer; - -/** - * OurInformationBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } showName - * @property { boolean } showPhone - * @property { boolean } showDate - * @property { boolean } showBookingNumber - * @property { boolean } showCustomerReference - * @property { boolean } showMasterBillOfLadingNumber - * @property { boolean } showHouseBillOfLadingNumber - */ -export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), showName: z.boolean().nullable(), showPhone: z.boolean().nullable(), showDate: z.boolean().nullable(), showBookingNumber: z.boolean().nullable(), showCustomerReference: z.boolean().nullable(), showMasterBillOfLadingNumber: z.boolean().nullable(), showHouseBillOfLadingNumber: z.boolean().nullable() }).partial(); -export type OurInformationBlockDTO = z.infer; - -/** - * RouteTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } showDate - * @property { boolean } showLocation - * @property { boolean } showType - * @property { boolean } showReference - * @property { boolean } showVesselVoyage - * @property { boolean } showAddress - * @property { boolean } showProvider - */ -export const RouteTableBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), showDate: z.boolean().nullable(), showLocation: z.boolean().nullable(), showType: z.boolean().nullable(), showReference: z.boolean().nullable(), showVesselVoyage: z.boolean().nullable(), showAddress: z.boolean().nullable(), showProvider: z.boolean().nullable() }).partial(); -export type RouteTableBlockDTO = z.infer; - -/** - * CargoTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - */ -export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable() }).partial(); -export type CargoTableBlockDTO = z.infer; - -/** - * CargoSummaryBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - */ -export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable() }).partial(); -export type CargoSummaryBlockDTO = z.infer; - -/** - * FinanceTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } showOnlyForReceiver - * @property { boolean } showVendor - * @property { boolean } showBuyRate - * @property { boolean } showCustomer - * @property { boolean } showSellRate - * @property { boolean } showGrid - * @property { boolean } showCharges - * @property { boolean } showAdditionalText - * @property { boolean } showQuantity - * @property { boolean } showProfit - * @property { boolean } showTotalsByCurrency - * @property { boolean } includeSubPositions - * @property { boolean } subPositionTotals - * @property { boolean } showBuyRateExchangeRates - * @property { boolean } showSellRateExchangeRates - * @property { boolean } showTotal - */ -export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), showOnlyForReceiver: z.boolean().nullable(), showVendor: z.boolean().nullable(), showBuyRate: z.boolean().nullable(), showCustomer: z.boolean().nullable(), showSellRate: z.boolean().nullable(), showGrid: z.boolean().nullable(), showCharges: z.boolean().nullable(), showAdditionalText: z.boolean().nullable(), showQuantity: z.boolean().nullable(), showProfit: z.boolean().nullable(), showTotalsByCurrency: z.boolean().nullable(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean().nullable(), showSellRateExchangeRates: z.boolean().nullable(), showTotal: z.boolean().nullable() }).partial(); -export type FinanceTableBlockDTO = z.infer; - -/** - * FooterBlockDTOSchema - * @type { object } - * @property { boolean } enabled - */ -export const FooterBlockDTOSchema = z.object({ enabled: z.boolean().nullable() }).partial(); -export type FooterBlockDTO = z.infer; - -/** - * TermsBlockDTOSchema - * @type { object } - * @property { boolean } enabled - */ -export const TermsBlockDTOSchema = z.object({ enabled: z.boolean().nullable() }).partial(); -export type TermsBlockDTO = z.infer; - -/** - * CutOffDatesBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } billOfLadingFromCustomer - * @property { boolean } billOfLadingToCarrier - * @property { boolean } customsAMS - * @property { boolean } vgmCustomer - */ -export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), billOfLadingFromCustomer: z.boolean().nullable(), billOfLadingToCarrier: z.boolean().nullable(), customsAMS: z.boolean().nullable(), vgmCustomer: z.boolean().nullable() }).partial(); -export type CutOffDatesBlockDTO = z.infer; - -/** - * TemplateBlocksResponseDTOSchema - * @type { object } - * @property { TitleBlockDTO } titleBlock - * @property { ReceiverBlockDTO } receiverBlock - * @property { OurInformationBlockDTO } ourInformationBlock - * @property { RouteTableBlockDTO } routeTableBlock - * @property { CargoTableBlockDTO } cargoTableBlock - * @property { CargoSummaryBlockDTO } cargoSummaryBlock - * @property { FinanceTableBlockDTO } financeTableBlock - * @property { RemarkBlockDTO[] } remarkBlocks - * @property { FooterBlockDTO } footerBlock - * @property { TermsBlockDTO } termsBlock - * @property { CutOffDatesBlockDTO } cutOffDatesBlock - */ -export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema.nullable(), receiverBlock: CommonModels.ReceiverBlockDTOSchema.nullable(), ourInformationBlock: CommonModels.OurInformationBlockDTOSchema.nullable(), routeTableBlock: CommonModels.RouteTableBlockDTOSchema.nullable(), cargoTableBlock: CommonModels.CargoTableBlockDTOSchema.nullable(), cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema.nullable(), financeTableBlock: CommonModels.FinanceTableBlockDTOSchema.nullable(), remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).nullable(), footerBlock: CommonModels.FooterBlockDTOSchema.nullable(), termsBlock: CommonModels.TermsBlockDTOSchema.nullable(), cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema.nullable() }).partial(); -export type TemplateBlocksResponseDTO = z.infer; - -/** - * RouteTableProviderDtoSchema - * @type { object } - * @property { string } id Provider ID - * @property { string } name Provider name - */ -export const RouteTableProviderDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type RouteTableProviderDto = z.infer; - -/** - * RouteTablePointDtoSchema - * @type { object } - * @property { string } id Route point ID - * @property { string } type Route point type - * @property { string } datetime Route point datetime - * @property { string } secondaryDatetime Route point secondary datetime - * @property { string } address Route point address - * @property { string } name Route point address name - * @property { string } reference Route point reference - * @property { RouteTableProviderDto } provider Route point provider - * @property { string } vessel Vessel information - * @property { string } voyage Voyage information - * @property { string } carrier Carrier name - */ -export const RouteTablePointDtoSchema = z.object({ id: z.string(), type: z.string(), datetime: z.string().nullish(), secondaryDatetime: z.string().nullish(), address: z.string().nullish(), name: z.string().nullish(), reference: z.string().nullish(), provider: CommonModels.RouteTableProviderDtoSchema.nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), carrier: z.string().nullish() }); -export type RouteTablePointDto = z.infer; - -/** - * RouteTableBlockResponseDtoSchema - * @type { object } - * @property { string } selectedRouteId Selected route ID - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { boolean } showReference Show reference column - * @property { boolean } showVesselVoyage Show vessel/voyage column - * @property { boolean } showProvider Show provider column - * @property { RouteTablePointDto[] } points Route points - * @property { boolean } showAddress Show address - * @property { boolean } showDates Show dates - * @property { boolean } showType Show type - * @property { boolean } showLocation Show location - * @property { boolean } showGrid Show grid - * @property { boolean } suppressRoute Suppress route - */ -export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().nullish(), selectedRoutePointIds: z.array(z.string()), showReference: z.boolean(), showVesselVoyage: z.boolean(), showProvider: z.boolean(), points: z.array(CommonModels.RouteTablePointDtoSchema).nullish(), showAddress: z.boolean().nullish(), showDates: z.boolean(), showType: z.boolean(), showLocation: z.boolean(), showGrid: z.boolean(), suppressRoute: z.boolean() }); -export type RouteTableBlockResponseDto = z.infer; - -/** - * CargoSpecialtyDtoSchema - * @type { object } - * @property { string } name - * @property { string } unNumber UN number for hazardous specialty - * @property { string } IMOClass IMO class for hazardous specialty - * @property { number } temperatureFrom Temperature from (°C) for temperature-controlled specialty - * @property { number } temperatureUntil Temperature until (°C) for temperature-controlled specialty - */ -export const CargoSpecialtyDtoSchema = z.object({ name: CommonModels.PositionCargoPackageEnumSchema, unNumber: z.string().nullish(), IMOClass: z.string().nullish(), temperatureFrom: z.number().nullish(), temperatureUntil: z.number().nullish() }); -export type CargoSpecialtyDto = z.infer; - -/** - * CargoPackageDtoSchema - * @type { object } - * @property { string } id Package ID - * @property { string } description Package description - * @property { string } weight Weight - * @property { string } hsCodes HS codes (numeric only) - * @property { number } quantity Quantity - * @property { number } width Width (cm) - * @property { number } length Length (cm) - * @property { number } height Height (cm) - * @property { number } volume Total volume in m3 for this package group - * @property { string } packageType Package type name - * @property { string } caseMarks Case marks - * @property { CargoSpecialtyDto[] } specialties Package specialties - * @property { number } chargeableWeight Chargeable weight in kg - * @property { number } volumetricWeight Volumetric weight in kg - */ -export const CargoPackageDtoSchema = z.object({ id: z.string(), description: z.string().nullish(), weight: z.string().nullish(), hsCodes: z.string().nullish(), quantity: z.number().nullish(), width: z.number().nullish(), length: z.number().nullish(), height: z.number().nullish(), volume: z.number().nullish(), packageType: z.string().nullish(), caseMarks: z.string().nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).nullish(), chargeableWeight: z.number().nullish(), volumetricWeight: z.number().nullish() }); -export type CargoPackageDto = z.infer; - -/** - * CargoItemRouteDtoSchema - * @type { object } - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { RouteTablePointDto[] } points Route points - */ -export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()), points: z.array(CommonModels.RouteTablePointDtoSchema).nullish() }); -export type CargoItemRouteDto = z.infer; - -/** - * CargoItemDtoSchema - * @type { object } - * @property { string } cargoId Cargo ID - * @property { string } cargoType Cargo type - * @property { string } containerNumber Container number - * @property { string } seal1 First seal (sea cargo only) - * @property { string } seal2 Second seal (sea cargo only) - * @property { string } vgm Verified gross mass (VGM) for container, sea cargo only - * @property { number } totalGrossWeight Total gross weight from cargo details - * @property { number } totalVolume Total volume (m3) calculated from cargo packages - * @property { number } chargeableWeight Chargeable weight in kg for transport unit - * @property { number } volumetricWeight Volumetric weight in kg for transport unit - * @property { CargoPackageDto[] } packages Cargo packages - * @property { string[] } selectedPackageIds Selected cargo package IDs - * @property { CargoItemRouteDto } route Cargo route (when routes are split) - */ -export const CargoItemDtoSchema = z.object({ cargoId: z.string(), cargoType: z.string(), containerNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), vgm: z.string().nullish(), totalGrossWeight: z.number().nullish(), totalVolume: z.number().nullish(), chargeableWeight: z.number().nullish(), volumetricWeight: z.number().nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema), selectedPackageIds: z.array(z.string()), route: CommonModels.CargoItemRouteDtoSchema.nullish() }); -export type CargoItemDto = z.infer; - -/** - * CargoTableBlockDtoSchema - * @type { object } - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { boolean } suppressWeight Suppress weight column display - * @property { boolean } showGrid Show grid borders in cargo table - * @property { boolean } suppressVolume Suppress volume column display - * @property { boolean } suppressSpecialities Suppress specialities column display - * @property { boolean } suppressDimensions Suppress dimensions column display - * @property { boolean } suppressPackageVolume Suppress package volume column display - * @property { boolean } suppressPackageWeight Suppress package weight column display - * @property { boolean } showGrandTotal Show grand total - * @property { boolean } showTransportUnitTotal Show transport unit total - * @property { boolean } showRoute Show route information (only applicable when routes are split) - * @property { boolean } suppressCargo Suppress cargo table display - * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units - * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units - * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages - * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages - * @property { boolean } showPackageHSCodes Show HS codes for packages - * @property { boolean } showPackageType Show package type for packages - * @property { boolean } showPackageQuantity Show quantity for packages - * @property { boolean } showPackageDescription Show description for packages - * @property { boolean } showPackageCaseMarks Show case marks for packages - * @property { boolean } showTransportUnitNumber Show transport unit number - * @property { boolean } showTransportUnitType Show transport unit type - * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 - * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 - * @property { CargoItemDto[] } items Cargo items - */ -export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).nullish(), suppressWeight: z.boolean().nullish(), showGrid: z.boolean().nullish(), suppressVolume: z.boolean().nullish(), suppressSpecialities: z.boolean().nullish(), suppressDimensions: z.boolean().nullish(), suppressPackageVolume: z.boolean().nullish(), suppressPackageWeight: z.boolean().nullish(), showGrandTotal: z.boolean().nullish(), showTransportUnitTotal: z.boolean().nullish(), showRoute: z.boolean().nullish(), suppressCargo: z.boolean().nullish(), showTransportUnitChargeableWeight: z.boolean().nullish(), showTransportUnitVolumetricWeight: z.boolean().nullish(), showPackageChargeableWeight: z.boolean().nullish(), showPackageVolumetricWeight: z.boolean().nullish(), showPackageHSCodes: z.boolean().nullish(), showPackageType: z.boolean().nullish(), showPackageQuantity: z.boolean().nullish(), showPackageDescription: z.boolean().nullish(), showPackageCaseMarks: z.boolean().nullish(), showTransportUnitNumber: z.boolean().nullish(), showTransportUnitType: z.boolean().nullish(), showTransportUnitSeal1: z.boolean().nullish(), showTransportUnitSeal2: z.boolean().nullish(), items: z.array(CommonModels.CargoItemDtoSchema) }); -export type CargoTableBlockDto = z.infer; - -/** - * SummaryCargoItemDtoSchema - * @type { object } - * @property { string } transportUnitType Cargo type name (transport unit type) - * @property { number } quantity Count of cargos for this type - * @property { string } description Comma-joined transport unit numbers or custom description - */ -export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string(), quantity: z.number(), description: z.string() }); -export type SummaryCargoItemDto = z.infer; - -/** - * SummaryCargoBlockResponseDtoSchema - * @type { object } - * @property { SummaryCargoItemDto[] } items - */ -export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema) }); -export type SummaryCargoBlockResponseDto = z.infer; - -/** - * PositionAccountItemTypeEnumSchema - * @type { enum } - */ -export const PositionAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); -export type PositionAccountItemTypeEnum = z.infer; -export const PositionAccountItemTypeEnum = PositionAccountItemTypeEnumSchema.enum; - -/** - * FinanceRowDtoSchema - * @type { object } - * @property { string } id Finance row ID - * @property { PositionAccountItemTypeEnum } type Item type - * @property { string } chargeType Charge type - * @property { string } additionalText Additional text - * @property { string } text Text content - * @property { number } buyAmount Buy amount - * @property { string } buyCurrencyNotation Buy currency notation - * @property { number } sellAmount Sell amount - * @property { string } sellCurrencyNotation Sell currency notation - * @property { string } buyBPName Buy business partner name - * @property { string } sellBPName Sell business partner name - * @property { number } sellExchangeRate Sell exchange rate - * @property { number } buyExchangeRate Buy exchange rate - * @property { number } quantity Quantity - */ -export const FinanceRowDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionAccountItemTypeEnumSchema, chargeType: z.string().nullish(), additionalText: z.string().nullish(), text: z.string().nullish(), buyAmount: z.number().nullish(), buyCurrencyNotation: z.string().nullish(), sellAmount: z.number().nullish(), sellCurrencyNotation: z.string().nullish(), buyBPName: z.string().nullish(), sellBPName: z.string().nullish(), sellExchangeRate: z.number().nullish(), buyExchangeRate: z.number().nullish(), quantity: z.number().nullish() }); -export type FinanceRowDto = z.infer; - -/** - * FinanceTotalsDtoSchema - * @type { object } - * @property { number } customerTotal Customer total - * @property { number } vendorTotal Vendor total - * @property { number } combinedTotal Combined total - * @property { string } currencyNotation Currency notation - */ -export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().nullable(), vendorTotal: z.number().nullable(), combinedTotal: z.number().nullable(), currencyNotation: z.string().nullable() }).partial(); -export type FinanceTotalsDto = z.infer; - -/** - * FinanceTotalsByCurrencyDtoSchema - * @type { object } - * @property { string } currencyNotation Currency notation - * @property { number } vendorTotal Total for vendor side in this currency - * @property { number } customerTotal Total for customer side in this currency - */ -export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string(), vendorTotal: z.number().nullish(), customerTotal: z.number().nullish() }); -export type FinanceTotalsByCurrencyDto = z.infer; - -/** - * FinanceTablePositionDtoSchema - * @type { object } - * @property { FinanceRowDto[] } rows Finance rows - * @property { FinanceTotalsDto } totals Finance totals - * @property { string[] } selectedFinanceRowIds Selected finance row IDs - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency - */ -export const FinanceTablePositionDtoSchema = z.object({ rows: z.array(CommonModels.FinanceRowDtoSchema).nullable(), totals: CommonModels.FinanceTotalsDtoSchema.nullable(), selectedFinanceRowIds: z.array(z.string()).nullable(), positionId: z.string().nullable(), positionNumber: z.string().nullable(), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).nullable() }).partial(); -export type FinanceTablePositionDto = z.infer; - -/** - * FinanceTableBlockDtoSchema - * @type { object } - * @property { string } selectedBpId Selected business partner ID - * @property { boolean } showVendor Show vendor - * @property { boolean } showBuyRate Show buy rate - * @property { boolean } showCustomer Show customer - * @property { boolean } showSellRate Show sell rate - * @property { boolean } showGrid Show grid - * @property { boolean } showCharges Show charges - * @property { boolean } showAdditionalText Show additional text - * @property { boolean } showQuantity Show quantity - * @property { boolean } showTotalsByCurrency Show totals grouped by currency - * @property { boolean } suppressFinances Suppress finances from output - * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero - * @property { boolean } showTotal Show total from output - * @property { boolean } showProfit Show profit from output - * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output - * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output - * @property { boolean } includeSubPositions Include sub-positions - * @property { boolean } subPositionTotals Show sub-position totals - * @property { FinanceTablePositionDto[] } positions Finance positions - * @property { FinanceTotalsDto } totals Finance totals - * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency - */ -export const FinanceTableBlockDtoSchema = z.object({ selectedBpId: z.string().nullable(), showVendor: z.boolean().nullable(), showBuyRate: z.boolean().nullable(), showCustomer: z.boolean().nullable(), showSellRate: z.boolean().nullable(), showGrid: z.boolean().nullable(), showCharges: z.boolean().nullable(), showAdditionalText: z.boolean().nullable(), showQuantity: z.boolean().nullable(), showTotalsByCurrency: z.boolean().nullable(), suppressFinances: z.boolean().nullable(), suppressZeroLines: z.boolean().nullable(), showTotal: z.boolean().nullable(), showProfit: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean().nullable(), showSellRateExchangeRates: z.boolean().nullable(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), positions: z.array(CommonModels.FinanceTablePositionDtoSchema).nullable(), totals: CommonModels.FinanceTotalsDtoSchema.nullable(), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).nullable() }).partial(); -export type FinanceTableBlockDto = z.infer; - -/** - * RemarkBlockDtoSchema - * @type { object } - * @property { string } id - * @property { number } position Minimum: `1` - * @property { EditorContentUpdateDto } content - * @property { boolean } enabled - */ -export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }); -export type RemarkBlockDto = z.infer; - -/** - * ConfigBlockDtoSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - * @property { boolean } showWatermarkOnDocuments Show watermark on documents - * @property { LocaleEnum } locale - */ -export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable(), showWatermarkOnDocuments: z.boolean().nullable(), locale: CommonModels.LocaleEnumSchema.nullable() }).partial(); -export type ConfigBlockDto = z.infer; - -/** - * TitleBlockUpdateDtoSchema - * @type { object } - * @property { string } value Title value - */ -export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().nullable() }).partial(); -export type TitleBlockUpdateDto = z.infer; - -/** - * ReceiverBlockUpdateDtoSchema - * @type { object } - * @property { string } selectedBpId Receiver business partner ID - * @property { string } address Receiver address - */ -export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().nullable(), address: z.string().nullable() }).partial(); -export type ReceiverBlockUpdateDto = z.infer; - -/** - * OurInformationBlockUpdateDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } phone Phone number - * @property { string } date Date - * @property { string } bookingNumber Booking number - * @property { string } customerReference Customer reference - * @property { string } masterBillOfLadingNumber Master bill of lading number - * @property { string } houseBillOfLadingNumber House bill of lading number - * @property { string } positionNumber Position number - */ -export const OurInformationBlockUpdateDtoSchema = z.object({ name: z.string().nullable(), phone: z.string().nullable(), date: z.string().nullable(), bookingNumber: z.string().nullable(), customerReference: z.string().nullable(), masterBillOfLadingNumber: z.string().nullable(), houseBillOfLadingNumber: z.string().nullable(), positionNumber: z.string().nullable() }).partial(); -export type OurInformationBlockUpdateDto = z.infer; - -/** - * TermsBlockDtoSchema - * @type { object } - * @property { string } termsImageUrl Terms image URL - */ -export const TermsBlockDtoSchema = z.object({ termsImageUrl: z.string().nullable() }).partial(); -export type TermsBlockDto = z.infer; - -/** - * CutOffDatesBlockUpdateDtoSchema - * @type { object } - * @property { string } billOfLadingFromCustomer Bill of lading from customer date - * @property { string } billOfLadingToCarrier Bill of lading to carrier date - * @property { string } customsAMS Customs AMS date - * @property { string } vgmCustomer VGM customer date - */ -export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().nullable(), billOfLadingToCarrier: z.string().nullable(), customsAMS: z.string().nullable(), vgmCustomer: z.string().nullable() }).partial(); -export type CutOffDatesBlockUpdateDto = z.infer; - -/** - * TemplatedDocumentDataDtoSchema - * @type { object } - * @property { TitleBlockUpdateDto } title Title block data - * @property { ReceiverBlockUpdateDto } receiver Receiver block data - * @property { OurInformationBlockUpdateDto } ourInformation Our information block data - * @property { RouteTableBlockResponseDto } routeTable Route table block data - * @property { CargoTableBlockDto } cargoTable Cargo table block data - * @property { SummaryCargoBlockResponseDto } summaryCargo Summary cargo block data - * @property { FinanceTableBlockDto } financeTable Finance table block data - * @property { RemarkBlockDto[] } remarks Remark blocks - * @property { TermsBlockDto } terms Terms block data - * @property { ConfigBlockDto } config Config block data - * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data - */ -export const TemplatedDocumentDataDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.nullable(), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.nullable(), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.nullable(), routeTable: CommonModels.RouteTableBlockResponseDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockDtoSchema.nullable(), summaryCargo: CommonModels.SummaryCargoBlockResponseDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockDtoSchema.nullable(), remarks: z.array(CommonModels.RemarkBlockDtoSchema).nullable(), terms: CommonModels.TermsBlockDtoSchema.nullable(), config: CommonModels.ConfigBlockDtoSchema.nullable(), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.nullable() }).partial(); -export type TemplatedDocumentDataDto = z.infer; - -/** - * RouteTableUpdateBlockDtoSchema - * @type { object } - * @property { string } selectedRouteId Selected route ID - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { boolean } showReference Show reference column - * @property { boolean } showVesselVoyage Show vessel/voyage column - * @property { boolean } showProvider Show provider column - * @property { RouteTablePointDto[] } points Route points - * @property { boolean } showAddress Show address - * @property { boolean } showDates Show dates - * @property { boolean } showType Show type - * @property { boolean } showLocation Show location - * @property { boolean } showGrid Show grid - * @property { boolean } suppressRoute Suppress route - */ -export const RouteTableUpdateBlockDtoSchema = z.object({ selectedRouteId: z.string().nullable(), selectedRoutePointIds: z.array(z.string()).nullable(), showReference: z.boolean().nullable(), showVesselVoyage: z.boolean().nullable(), showProvider: z.boolean().nullable(), points: z.array(CommonModels.RouteTablePointDtoSchema).nullable(), showAddress: z.boolean().nullable(), showDates: z.boolean().nullable(), showType: z.boolean().nullable(), showLocation: z.boolean().nullable(), showGrid: z.boolean().nullable(), suppressRoute: z.boolean().nullable() }).partial(); -export type RouteTableUpdateBlockDto = z.infer; - -/** - * CargoItemRouteUpdateDtoSchema - * @type { object } - * @property { string[] } selectedRoutePointIds Selected route point IDs - */ -export const CargoItemRouteUpdateDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()) }); -export type CargoItemRouteUpdateDto = z.infer; - -/** - * CargoItemUpdateDtoSchema - * @type { object } - * @property { string } cargoId Cargo ID to update packages for - * @property { string[] } selectedPackageIds Selected cargo package IDs - * @property { CargoItemRouteUpdateDto } route Cargo route (when routes are split) - */ -export const CargoItemUpdateDtoSchema = z.object({ cargoId: z.string().nullable(), selectedPackageIds: z.array(z.string()).nullable(), route: CommonModels.CargoItemRouteUpdateDtoSchema.nullable() }).partial(); -export type CargoItemUpdateDto = z.infer; - -/** - * CargoTableBlockUpdateDtoSchema - * @type { object } - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { CargoItemUpdateDto[] } items Cargo items for package updates - * @property { boolean } suppressWeight Suppress weight column display - * @property { boolean } showGrid Show grid borders in cargo table - * @property { boolean } suppressVolume Suppress volume column display - * @property { boolean } suppressSpecialities Suppress specialities column display - * @property { boolean } suppressDimensions Suppress dimensions column display - * @property { boolean } suppressPackageVolume Suppress package volume column display - * @property { boolean } suppressPackageWeight Suppress package weight column display - * @property { boolean } showRoute Show route information (only applicable when routes are split) - * @property { boolean } showGrandTotal Show grand total - * @property { boolean } showTransportUnitTotal Show transport unit total - * @property { boolean } suppressCargo Suppress cargo table display - * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units - * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units - * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages - * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages - * @property { boolean } showPackageHSCodes Show HS codes for packages - * @property { boolean } showPackageType Show package type for packages - * @property { boolean } showPackageQuantity Show quantity for packages - * @property { boolean } showPackageDescription Show description for packages - * @property { boolean } showPackageCaseMarks Show case marks for packages - * @property { boolean } showTransportUnitNumber Show transport unit number - * @property { boolean } showTransportUnitType Show transport unit type - * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 - * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 - */ -export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).nullable(), items: z.array(CommonModels.CargoItemUpdateDtoSchema).nullable(), suppressWeight: z.boolean().nullable(), showGrid: z.boolean().nullable(), suppressVolume: z.boolean().nullable(), suppressSpecialities: z.boolean().nullable(), suppressDimensions: z.boolean().nullable(), suppressPackageVolume: z.boolean().nullable(), suppressPackageWeight: z.boolean().nullable(), showRoute: z.boolean().nullable(), showGrandTotal: z.boolean().nullable(), showTransportUnitTotal: z.boolean().nullable(), suppressCargo: z.boolean().nullable(), showTransportUnitChargeableWeight: z.boolean().nullable(), showTransportUnitVolumetricWeight: z.boolean().nullable(), showPackageChargeableWeight: z.boolean().nullable(), showPackageVolumetricWeight: z.boolean().nullable(), showPackageHSCodes: z.boolean().nullable(), showPackageType: z.boolean().nullable(), showPackageQuantity: z.boolean().nullable(), showPackageDescription: z.boolean().nullable(), showPackageCaseMarks: z.boolean().nullable(), showTransportUnitNumber: z.boolean().nullable(), showTransportUnitType: z.boolean().nullable(), showTransportUnitSeal1: z.boolean().nullable(), showTransportUnitSeal2: z.boolean().nullable() }).partial(); -export type CargoTableBlockUpdateDto = z.infer; - -/** - * SummaryCargoItemUpdateDtoSchema - * @type { object } - * @property { string } transportUnitType Cargo type name (transport unit type) - * @property { string } description Updated description for this cargo type - */ -export const SummaryCargoItemUpdateDtoSchema = z.object({ transportUnitType: z.string(), description: z.string() }); -export type SummaryCargoItemUpdateDto = z.infer; - -/** - * SummaryCargoBlockUpdateDtoSchema - * @type { object } - * @property { SummaryCargoItemUpdateDto[] } items - */ -export const SummaryCargoBlockUpdateDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemUpdateDtoSchema) }); -export type SummaryCargoBlockUpdateDto = z.infer; - -/** - * FinanceTablePositionUpdateDtoSchema - * @type { object } - * @property { string[] } selectedFinanceRowIds Selected finance row IDs - * @property { string } positionId Position ID - */ -export const FinanceTablePositionUpdateDtoSchema = z.object({ selectedFinanceRowIds: z.array(z.string()).nullable(), positionId: z.string().nullable() }).partial(); -export type FinanceTablePositionUpdateDto = z.infer; - -/** - * FinanceTableBlockUpdateDtoSchema - * @type { object } - * @property { string } selectedBpId Selected business partner ID - * @property { boolean } showVendor Show vendor - * @property { boolean } showBuyRate Show buy rate - * @property { boolean } showCustomer Show customer - * @property { boolean } showSellRate Show sell rate - * @property { boolean } showGrid Show grid - * @property { boolean } showCharges Show charges - * @property { boolean } showAdditionalText Show additional text - * @property { boolean } showQuantity Show quantity - * @property { boolean } showTotalsByCurrency Show totals grouped by currency - * @property { boolean } suppressFinances Suppress finances from output - * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero - * @property { boolean } showTotal Show total from output - * @property { boolean } showProfit Show profit from output - * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output - * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output - * @property { boolean } includeSubPositions Include sub-positions - * @property { boolean } subPositionTotals Show sub-position totals - * @property { FinanceTablePositionUpdateDto[] } positions Finance positions - */ -export const FinanceTableBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().nullable(), showVendor: z.boolean().nullable(), showBuyRate: z.boolean().nullable(), showCustomer: z.boolean().nullable(), showSellRate: z.boolean().nullable(), showGrid: z.boolean().nullable(), showCharges: z.boolean().nullable(), showAdditionalText: z.boolean().nullable(), showQuantity: z.boolean().nullable(), showTotalsByCurrency: z.boolean().nullable(), suppressFinances: z.boolean().nullable(), suppressZeroLines: z.boolean().nullable(), showTotal: z.boolean().nullable(), showProfit: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean().nullable(), showSellRateExchangeRates: z.boolean().nullable(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), positions: z.array(CommonModels.FinanceTablePositionUpdateDtoSchema).nullable() }).partial(); -export type FinanceTableBlockUpdateDto = z.infer; - -/** - * RemarkBlockUpdateDtoSchema - * @type { object } - * @property { string } id - * @property { number } position Minimum: `1` - * @property { EditorContentUpdateDto } content - * @property { boolean } enabled - */ -export const RemarkBlockUpdateDtoSchema = z.object({ id: z.string(), position: z.number().gte(1).nullish(), content: CommonModels.EditorContentUpdateDtoSchema.nullish(), enabled: z.boolean().nullish() }); -export type RemarkBlockUpdateDto = z.infer; - -/** - * TemplatedDocumentDataUpdateDtoSchema - * @type { object } - * @property { TitleBlockUpdateDto } title Title block data - * @property { ReceiverBlockUpdateDto } receiver Receiver block data - * @property { OurInformationBlockUpdateDto } ourInformation Our information block data - * @property { RouteTableUpdateBlockDto } routeTable Route table block data - * @property { CargoTableBlockUpdateDto } cargoTable Cargo table block data - * @property { SummaryCargoBlockUpdateDto } summaryCargo Summary cargo block data - * @property { FinanceTableBlockUpdateDto } financeTable Finance table block data - * @property { RemarkBlockUpdateDto[] } remarks Remark blocks - * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data - */ -export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.nullable(), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.nullable(), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.nullable(), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.nullable(), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.nullable(), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).nullable(), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.nullable() }).partial(); -export type TemplatedDocumentDataUpdateDto = z.infer; - -/** - * BusinessPartnerTypeSchema - * @type { enum } - */ -export const BusinessPartnerTypeSchema = z.enum(["businessPartner", "destinationAgent", "oceanCarrier", "office", "customsAgent", "stuffingStrippingProvider", "shipper", "fobForwarder", "routingAgent", "transportProvider", "originServiceProvider", "insuranceProvider", "consignee", "courier", "trucker", "airline", "originAgent"]); -export type BusinessPartnerType = z.infer; -export const BusinessPartnerType = BusinessPartnerTypeSchema.enum; - -/** - * BusinessPartnerAddressCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type BusinessPartnerAddressCityDto = z.infer; - -/** - * BusinessPartnerAddressCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const BusinessPartnerAddressCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type BusinessPartnerAddressCountryDto = z.infer; - -/** - * BusinessPartnerAddressResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the address - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street information - * @property { string } zip ZIP/Postal code - * @property { BusinessPartnerAddressCityDto } city Country data - * @property { string } district District information - * @property { BusinessPartnerAddressCountryDto } country Country data - */ -export const BusinessPartnerAddressResponseDTOSchema = z.object({ id: z.string(), street: z.string(), secondaryStreet: z.string(), zip: z.string(), city: CommonModels.BusinessPartnerAddressCityDtoSchema, district: z.string(), country: CommonModels.BusinessPartnerAddressCountryDtoSchema }); -export type BusinessPartnerAddressResponseDTO = z.infer; - -/** - * EditorContentResponseDtoSchema - * @type { object } - * @property { string } html HTML content - * @property { object } json JSON content - * @property { any } json.[key] - */ -export const EditorContentResponseDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); -export type EditorContentResponseDto = z.infer; - -/** - * DunningSystemReferenceDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } isDefault - */ -export const DunningSystemReferenceDTOSchema = z.object({ id: z.string(), name: z.string(), isDefault: z.boolean() }); -export type DunningSystemReferenceDTO = z.infer; - -/** - * TransportModeEnumSchema - * @type { enum } - */ -export const TransportModeEnumSchema = z.enum(["Air", "Sea", "Road"]); -export type TransportModeEnum = z.infer; -export const TransportModeEnum = TransportModeEnumSchema.enum; - -/** - * SeaRoutingEnumSchema - * @type { enum } - */ -export const SeaRoutingEnumSchema = z.enum(["Direct", "Transhipment"]); -export type SeaRoutingEnum = z.infer; -export const SeaRoutingEnum = SeaRoutingEnumSchema.enum; - -/** - * InvolvedPartyBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { BusinessPartnerAddressResponseDTO } address Main address information - */ -export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.nullish() }); -export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; - -/** - * InvolvedPartyContactResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvolvedPartyContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type InvolvedPartyContactResponseDTO = z.infer; - -/** - * InvolvedPartyResponseDtoSchema - * @type { object } - * @property { string } id - * @property { PositionInvolvedPartyTypeEnum } type - * @property { string } reference - * @property { InvolvedPartyBusinessPartnerResponseDTO } businessPartner - * @property { InvolvedPartyContactResponseDTO } contact - */ -export const InvolvedPartyResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionInvolvedPartyTypeEnumSchema, reference: z.string().nullish(), businessPartner: CommonModels.InvolvedPartyBusinessPartnerResponseDTOSchema.nullish(), contact: CommonModels.InvolvedPartyContactResponseDTOSchema.nullish() }); -export type InvolvedPartyResponseDto = z.infer; - -/** - * CreateInvolvedPartyRequestDtoSchema - * @type { object } - * @property { PositionInvolvedPartyTypeEnum } type Type of the involved party to create - */ -export const CreateInvolvedPartyRequestDtoSchema = z.object({ type: CommonModels.PositionInvolvedPartyTypeEnumSchema }); -export type CreateInvolvedPartyRequestDto = z.infer; - -/** - * RouteLocationTypeEnumSchema - * @type { enum } - */ -export const RouteLocationTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Port", "Terminal", "City", "Warehouse", "ContainerYard", "Airport"]); -export type RouteLocationTypeEnum = z.infer; -export const RouteLocationTypeEnum = RouteLocationTypeEnumSchema.enum; - -/** - * RoutePointLocationResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { RouteLocationTypeEnum } type - */ -export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }); -export type RoutePointLocationResponseDto = z.infer; - -/** - * RoutePointTypeEnumSchema - * @type { enum } - */ -export const RoutePointTypeEnumSchema = z.enum(["EmptyContainerDepot", "LoadingAddress", "Stop", "FumigationStop", "OriginCustomsStop", "StuffingLocation", "PortTerminal", "PortOfLoading", "TransshipmentPort", "PortOfDischarge", "StrippingLocation", "ContainerYard", "DestinationCustomsStop", "FinalDestination", "EmptyContainerReturn", "OriginAgent", "HandlingAgent", "XRay", "CustomsBroker", "AirportOfDeparture", "StopAirport", "DestinationAirport", "CustomsStop", "DestinationAgent", "DeliveryAddress", "Courier", "PickupAddress", "StopAddress"]); -export type RoutePointTypeEnum = z.infer; -export const RoutePointTypeEnum = RoutePointTypeEnumSchema.enum; - -/** - * IncotermsEnumSchema - * @type { enum } - */ -export const IncotermsEnumSchema = z.enum(["EXW", "FCA", "CPT", "CIP", "DAP", "DPU", "DDP", "FAS", "FOB", "CFR", "CIF"]); -export type IncotermsEnum = z.infer; -export const IncotermsEnum = IncotermsEnumSchema.enum; - -/** - * PositionRouteTransportModeEnumSchema - * @type { enum } - */ -export const PositionRouteTransportModeEnumSchema = z.enum(["Truck", "Rail/Truck", "Rail", "Barge"]); -export type PositionRouteTransportModeEnum = z.infer; -export const PositionRouteTransportModeEnum = PositionRouteTransportModeEnumSchema.enum; - -/** - * RoutePointProviderResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type RoutePointProviderResponseDto = z.infer; - -/** - * RoutePointResponseDtoSchema - * @type { object } - * @property { string } id - * @property { RoutePointTypeEnum } type - * @property { string } name - * @property { number } sequenceNumber - * @property { RoutePointLocationResponseDto } location - * @property { string } estimatedTime - * @property { string } secondaryEstimatedTime Secondary estimated time (sea positions only) - * @property { string } reference - * @property { string } secondaryReference - * @property { IncotermsEnum } incoterm - * @property { PositionRouteTransportModeEnum } transportMode - * @property { RoutePointProviderResponseDto } provider - * @property { string } vessel Vessel name (sea positions only) - * @property { string } voyage Voyage number (sea positions only) - * @property { string } carrier Carrier name (sea positions only) - */ -export const RoutePointResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.RoutePointTypeEnumSchema, name: z.string(), sequenceNumber: z.number(), location: CommonModels.RoutePointLocationResponseDtoSchema.nullish(), estimatedTime: z.iso.datetime({ offset: true }).nullish(), secondaryEstimatedTime: z.iso.datetime({ offset: true }).nullish(), reference: z.string().nullish(), secondaryReference: z.string().nullish(), incoterm: CommonModels.IncotermsEnumSchema.nullish(), transportMode: CommonModels.PositionRouteTransportModeEnumSchema.nullish(), provider: CommonModels.RoutePointProviderResponseDtoSchema.nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), carrier: z.string().nullish() }); -export type RoutePointResponseDto = z.infer; - -/** - * RouteResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } cargoId Cargo ID (sea positions only) - * @property { string } cargoNumber Cargo number (sea positions only) - * @property { RoutePointResponseDto[] } points - */ -export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().nullish(), cargoNumber: z.string().nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema) }); -export type RouteResponseDto = z.infer; - -/** - * RouteListResponseDtoSchema - * @type { object } - * @property { RouteResponseDto[] } routes - * @property { boolean } splitRoute Whether the position routes are split by cargo (sea positions only) - */ -export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema), splitRoute: z.boolean() }); -export type RouteListResponseDto = z.infer; - -/** - * CreateRoutePointRequestDtoSchema - * @type { object } - * @property { RoutePointTypeEnum } type - */ -export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }); -export type CreateRoutePointRequestDto = z.infer; - -/** - * UpdateRoutePointRequestDtoSchema - * @type { object } - * @property { string } locationId Location ID for the route point - * @property { RouteLocationTypeEnum } locationType Type of location - * @property { string } estimatedTime Updated estimated time for the route point - * @property { string } secondaryEstimatedTime Secondary estimated time for the route point (sea positions only) - * @property { string } reference Reference for the route point - * @property { string } secondaryReference Secondary reference for the route point - * @property { IncotermsEnum } incoterm - * @property { PositionRouteTransportModeEnum } transportMode - * @property { string } providerId - * @property { string } vessel Vessel name (sea positions only) - * @property { string } voyage Voyage number (sea positions only) - * @property { string } carrier Carrier name (sea positions only) - */ -export const UpdateRoutePointRequestDtoSchema = z.object({ locationId: z.string().nullable(), locationType: CommonModels.RouteLocationTypeEnumSchema.nullable(), estimatedTime: z.iso.datetime({ offset: true }).nullable(), secondaryEstimatedTime: z.iso.datetime({ offset: true }).nullable(), reference: z.string().nullable(), secondaryReference: z.string().nullable(), incoterm: CommonModels.IncotermsEnumSchema.nullable(), transportMode: CommonModels.PositionRouteTransportModeEnumSchema.nullable(), providerId: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), carrier: z.string().nullable() }).partial(); -export type UpdateRoutePointRequestDto = z.infer; - -/** - * PositionChargeDtoResponseSchema - * @type { object } - * @property { object } chargeType - * @property { string } chargeType.id - * @property { string } chargeType.name - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { object } buyVatRule - * @property { string } buyVatRule.id - * @property { string } buyVatRule.name - * @property { string } buyVatRule.matchcode - * @property { object } vendor - * @property { string } vendor.id - * @property { string } vendor.name - * @property { string } vendor.matchCode - * @property { string } vendor.label - * @property { string } vendor.debtorId - * @property { string } vendor.creditorId - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { object } sellVatRule - * @property { string } sellVatRule.id - * @property { string } sellVatRule.name - * @property { string } sellVatRule.matchcode - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { string } customer.debtorId - * @property { string } customer.creditorId - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - * @property { number } profit Profit amount - * @property { string } profitCurrencyCode Profit currency code - */ -export const PositionChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).nullish(), additionalText: z.string(), quantity: z.number().nullish(), buyRate: z.number().nullish(), buyCurrencyCode: z.string(), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).nullish(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).nullish(), buyExchangeRate: z.number().nullish(), sellRate: z.number().nullish(), sellCurrencyCode: z.string(), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).nullish(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).nullish(), sellExchangeRate: z.number().nullish(), profit: z.number().nullish(), profitCurrencyCode: z.string().nullish() }); -export type PositionChargeDtoResponse = z.infer; - -/** - * PositionTextDtoResponseSchema - * @type { object } - * @property { string } content Text content - */ -export const PositionTextDtoResponseSchema = z.object({ content: z.string() }); -export type PositionTextDtoResponse = z.infer; - -/** - * PositionAccountItemDtoResponseSchema - * @type { object } - * @property { string } id Item ID - * @property { string } outgoingInvoiceId - * @property { string } registeredInvoiceId - * @property { PositionAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { PositionChargeDtoResponse } charge Charge data if type is CHARGE - * @property { PositionTextDtoResponse } text Text data if type is TEXT - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - */ -export const PositionAccountItemDtoResponseSchema = z.object({ id: z.string(), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish(), type: CommonModels.PositionAccountItemTypeEnumSchema, orderPosition: z.number(), charge: CommonModels.PositionChargeDtoResponseSchema.nullish(), text: CommonModels.PositionTextDtoResponseSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }); -export type PositionAccountItemDtoResponse = z.infer; - -/** - * UserPreviewDtoSchema - * @type { object } - * @property { string } userId - * @property { string } name - */ -export const UserPreviewDtoSchema = z.object({ userId: z.string(), name: z.string() }); -export type UserPreviewDto = z.infer; - -/** - * HBLDocumentConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - * @property { string } blTermsAndConditionsImageUrl BL terms and conditions image URL - * @property { string } signatureImageUrl Signature image URL - * @property { boolean } hasSignatureImage Whether office has a signature image configured - */ -export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable(), blTermsAndConditionsImageUrl: z.string().nullable(), signatureImageUrl: z.string().nullable(), hasSignatureImage: z.boolean().nullable() }).partial(); -export type HBLDocumentConfigDto = z.infer; - -/** - * DirectionEnumSchema - * @type { enum } - */ -export const DirectionEnumSchema = z.enum(["Import", "Export"]); -export type DirectionEnum = z.infer; -export const DirectionEnum = DirectionEnumSchema.enum; - -/** - * HazardousPackingGroupEnumSchema - * @type { enum } - */ -export const HazardousPackingGroupEnumSchema = z.enum(["PG I", "PG II", "PG III"]); -export type HazardousPackingGroupEnum = z.infer; -export const HazardousPackingGroupEnum = HazardousPackingGroupEnumSchema.enum; - -/** - * PositionCargoPackageHazardousSpecialtyResponseDTOSchema - * @type { object } - * @property { number } totalLength - * @property { number } totalWidth - * @property { number } temperature - * @property { string } unNumber - * @property { string } IMOClass - * @property { string } shippingName - * @property { string } technicalName - * @property { HazardousPackingGroupEnum } packagingGroup - * @property { number } netWeight - * @property { number } flashpoint - * @property { string[] } properties - * @property { string } acceptanceNumber - * @property { string } medGuide - * @property { string } emergencyPhone - * @property { string } emergencySchedule - */ -export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number().nullable(), totalWidth: z.number().nullable(), temperature: z.number().nullable(), unNumber: z.string().nullable(), IMOClass: z.string().nullable(), shippingName: z.string().nullable(), technicalName: z.string().nullable(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.nullable(), netWeight: z.number().nullable(), flashpoint: z.number().nullable(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).nullable(), acceptanceNumber: z.string().nullable(), medGuide: z.string().nullable(), emergencyPhone: z.string().nullable(), emergencySchedule: z.string().nullable() }).partial(); -export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; - -/** - * PositionCargoPackageTypeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionCargoPackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type PositionCargoPackageTypeResponseDTO = z.infer; - -/** - * HsCodeLabelDtoSchema - * @type { object } - * @property { string } id - * @property { string } label - */ -export const HsCodeLabelDtoSchema = z.object({ id: z.string(), label: z.string() }); -export type HsCodeLabelDto = z.infer; - -/** - * PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema - * @type { object } - * @property { number } temperatureFrom - * @property { number } temperatureUntil - */ -export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number().nullable(), temperatureUntil: z.number().nullable() }).partial(); -export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.infer; - -/** - * PositionCargoSourcePackageResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } positionNumber - */ -export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }); -export type PositionCargoSourcePackageResponseDTO = z.infer; - -/** - * PositionCargoPackageResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } cargoId - * @property { string } rootFolderId - * @property { number } quantity - * @property { string } packageTypeId - * @property { PositionCargoPackageTypeResponseDTO } packageType - * @property { number } length - * @property { number } width - * @property { number } height - * @property { number } netWeight - * @property { number } grossWeight - * @property { number } chargeableWeight - * @property { string } note - * @property { string } name - * @property { number } orderNumber - * @property { number } volume - * @property { number } volumetricWeight - * @property { string } caseMarks - * @property { string } description - * @property { string[] } hsCodes - * @property { HsCodeLabelDto[] } hsCodeLabels HS code details - * @property { string } customsRemarks - * @property { number } loadMeter - * @property { string[] } specialties - * @property { PositionCargoPackageHazardousSpecialtyResponseDTO } hazardousSpecialty - * @property { PositionCargoPackageTemperatureControlledSpecialtyResponseDto } temperatureControlledSpecialty - * @property { PositionCargoSourcePackageResponseDTO } sourcePackage - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const PositionCargoPackageResponseDTOSchema = z.object({ id: z.string(), cargoId: z.string(), rootFolderId: z.string().nullish(), quantity: z.number().nullish(), packageTypeId: z.string().nullish(), packageType: CommonModels.PositionCargoPackageTypeResponseDTOSchema.nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), netWeight: z.number().nullish(), grossWeight: z.number().nullish(), chargeableWeight: z.number().nullish(), note: z.string().nullish(), name: z.string().nullish(), orderNumber: z.number().nullish(), volume: z.number().nullish(), volumetricWeight: z.number().nullish(), caseMarks: z.string().nullish(), description: z.string().nullish(), hsCodes: z.array(z.string()).nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).nullish(), customsRemarks: z.string().nullish(), loadMeter: z.number().nullish(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema), hazardousSpecialty: CommonModels.PositionCargoPackageHazardousSpecialtyResponseDTOSchema.nullish(), temperatureControlledSpecialty: CommonModels.PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema.nullish(), sourcePackage: CommonModels.PositionCargoSourcePackageResponseDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), mrn: z.string().nullish(), exportPortFilling: z.string().nullish(), customsReleased: z.boolean().nullish(), importCustomsReleaseNumber: z.string().nullish(), portCustomsNumber: z.string().nullish() }); -export type PositionCargoPackageResponseDTO = z.infer; - -/** - * PackageTotalsDtoSchema - * @type { object } - * @property { number } quantity - * @property { number } weightPerPiece - * @property { number } volume - * @property { number } chargeableWeight - * @property { number } loadMeter - */ -export const PackageTotalsDtoSchema = z.object({ quantity: z.number(), weightPerPiece: z.number(), volume: z.number(), chargeableWeight: z.number().nullish(), loadMeter: z.number().nullish() }); -export type PackageTotalsDto = z.infer; - -/** - * PackageSpecialtyTotalsResponseDtoSchema - * @type { object } - * @property { PackageTotalsDto } noSpecialties - * @property { PackageTotalsDto } hazardous - * @property { PackageTotalsDto } nonStackable - * @property { PackageTotalsDto } temperatureControlled - * @property { PackageTotalsDto } diplomatic - * @property { PackageTotalsDto } oversized - * @property { PackageTotalsDto } total - */ -export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }); -export type PackageSpecialtyTotalsResponseDto = z.infer; - -/** - * PositionCargoCargoTypeResponseDTOSchema - * @type { object } - * @property { string } id Cargo type ID. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } name Cargo type name. Example: `Electronics` - * @property { string } shortName Cargo type short name. Example: `ELEC` - */ -export const PositionCargoCargoTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), shortName: z.string().nullish() }); -export type PositionCargoCargoTypeResponseDTO = z.infer; - -/** - * PositionCargoResponseDTOSchema - * @type { object } - * @property { string } id Cargo ID. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } positionId Position ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } quoteId Quote ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } rootFolderId Folder id bound to this cargo. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { PositionCargoCargoTypeResponseDTO } cargoType Cargo type - * @property { boolean } autoCalculateTotals - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { string } rateOptions - * @property { string } rateClass - * @property { string } textForCustoms - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { number } ratePerKg - * @property { number } totalRate - * @property { number } tare - * @property { number } vgm - * @property { HsCodeLabelDto[] } hsCodeLabels HS code details - * @property { string } note - * @property { PositionCargoPackageResponseDTO[] } packages Packages for the cargo - * @property { string } createdAt Creation date. Example: `2023-04-09T12:00:00Z` - * @property { string } updatedAt Last update date. Example: `2023-04-09T12:00:00Z` - * @property { number } completeWeight - * @property { PackageSpecialtyTotalsResponseDto } packageTotals - */ -export const PositionCargoResponseDTOSchema = z.object({ id: z.string(), positionId: z.string().nullish(), quoteId: z.string().nullish(), rootFolderId: z.string().nullish(), cargoType: CommonModels.PositionCargoCargoTypeResponseDTOSchema.nullish(), autoCalculateTotals: z.boolean(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean(), transportUnitNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), rateOptions: z.string().nullish(), rateClass: z.string().nullish(), textForCustoms: z.string().nullish(), totalVolume: z.number().nullish(), totalGrossWeight: z.number().nullish(), totalNetWeight: z.number().nullish(), totalVolumetricWeight: z.number().nullish(), totalChargeableWeight: z.number().nullish(), totalLoadMeter: z.number().nullish(), ratePerKg: z.number().nullish(), totalRate: z.number().nullish(), tare: z.number().nullish(), vgm: z.number().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).nullish(), note: z.string().nullish(), packages: z.array(CommonModels.PositionCargoPackageResponseDTOSchema).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), completeWeight: z.number().nullish(), packageTotals: CommonModels.PackageSpecialtyTotalsResponseDtoSchema.nullish() }); -export type PositionCargoResponseDTO = z.infer; - -/** - * HazardousSpecialtyDTOSchema - * @type { object } - * @property { number } totalLength Total length - * @property { number } totalWidth Total width - * @property { number } temperature Temperature - * @property { string } unNumber UN number - * @property { string } IMOClass IMOClass - * @property { string } shippingName Shipping name - * @property { string } technicalName Technical name - * @property { HazardousPackingGroupEnum } packagingGroup Packaging - * @property { number } netWeight Net weight - * @property { number } flashpoint Flashpoint - * @property { string[] } properties Properties - * @property { string } acceptanceNumber Acceptance number - * @property { string } medGuide Medical guide - * @property { string } emergencyPhone Emergency phone - * @property { string } emergencySchedule Emergency schedule - */ -export const HazardousSpecialtyDTOSchema = z.object({ totalLength: z.number().nullable(), totalWidth: z.number().nullable(), temperature: z.number().nullable(), unNumber: z.string().nullable(), IMOClass: z.string().nullable(), shippingName: z.string().nullable(), technicalName: z.string().nullable(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.nullable(), netWeight: z.number().nullable(), flashpoint: z.number().nullable(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).nullable(), acceptanceNumber: z.string().nullable(), medGuide: z.string().nullable(), emergencyPhone: z.string().nullable(), emergencySchedule: z.string().nullable() }).partial(); -export type HazardousSpecialtyDTO = z.infer; - -/** - * TemperatureControlledSpecialtyDtoSchema - * @type { object } - * @property { number } temperatureFrom - * @property { number } temperatureUntil - */ -export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number().nullable(), temperatureUntil: z.number().nullable() }).partial(); -export type TemperatureControlledSpecialtyDto = z.infer; - -/** - * CreatePositionCargoPackageDTOSchema - * @type { object } - * @property { number } quantity Package quantity - * @property { string } packageTypeId Package type ID - * @property { number } length Package length - * @property { number } width Package width - * @property { number } height Package height - * @property { number } netWeight Package net weight - * @property { number } grossWeight Package gross weight - * @property { number } loadMeter Package load meter - * @property { number } chargeableWeight Package chargeable weight - * @property { number } volume Package volume - * @property { number } volumetricWeight Package volumetric weight - * @property { string } caseMarks Package case marks - * @property { string } note Package note - * @property { string } description Package description - * @property { string[] } hsCodes Package HS codes - * @property { string } customsRemarks Text for customs - * @property { string[] } specialties - * @property { HazardousSpecialtyDTO } hazardousSpecialty - * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const CreatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().nullable(), packageTypeId: z.string().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), loadMeter: z.number().nullable(), chargeableWeight: z.number().nullable(), volume: z.number().nullable(), volumetricWeight: z.number().nullable(), caseMarks: z.string().nullable(), note: z.string().nullable(), description: z.string().nullable(), hsCodes: z.array(z.string()).nullable(), customsRemarks: z.string().nullable(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).nullable(), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema.nullable(), temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema.nullable(), mrn: z.string().nullable(), exportPortFilling: z.string().nullable(), customsReleased: z.boolean().nullable(), importCustomsReleaseNumber: z.string().nullable(), portCustomsNumber: z.string().nullable() }).partial(); -export type CreatePositionCargoPackageDTO = z.infer; - -/** - * UpdatePositionCargoPackageDTOSchema - * @type { object } - * @property { number } quantity Package quantity - * @property { string } packageTypeId Package type ID - * @property { number } length Package length - * @property { number } width Package width - * @property { number } height Package height - * @property { number } netWeight Package net weight - * @property { number } grossWeight Package gross weight - * @property { number } chargeableWeight Package chargeable weight - * @property { string } note Package case marks - * @property { number } volume Package volume - * @property { number } volumetricWeight Package volumetric weight - * @property { number } orderNumber Package order number - * @property { string } caseMarks Package case marks - * @property { string } description Package description - * @property { string[] } hsCodes Package HS codes - * @property { string } customsRemarks Text for customs - * @property { number } loadMeter Load meter - * @property { string[] } specialties Package specialties - * @property { HazardousSpecialtyDTO } hazardousSpecialty Hazardous specialty details - * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const UpdatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().nullable(), packageTypeId: z.string().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), chargeableWeight: z.number().nullable(), note: z.string().nullable(), volume: z.number().nullable(), volumetricWeight: z.number().nullable(), orderNumber: z.number().nullable(), caseMarks: z.string().nullable(), description: z.string().nullable(), hsCodes: z.array(z.string()).nullable(), customsRemarks: z.string().nullable(), loadMeter: z.number().nullable(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).nullable(), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema.nullable(), temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema.nullable(), mrn: z.string().nullable(), exportPortFilling: z.string().nullable(), customsReleased: z.boolean().nullable(), importCustomsReleaseNumber: z.string().nullable(), portCustomsNumber: z.string().nullable() }).partial(); -export type UpdatePositionCargoPackageDTO = z.infer; - -/** - * QuantityOfOriginalBlDocumentsEnumSchema - * @type { enum } - */ -export const QuantityOfOriginalBlDocumentsEnumSchema = z.enum(["ZERO", "ONE", "TWO", "THREE"]); -export type QuantityOfOriginalBlDocumentsEnum = z.infer; -export const QuantityOfOriginalBlDocumentsEnum = QuantityOfOriginalBlDocumentsEnumSchema.enum; - -/** - * MovementTypeEnumSchema - * @type { enum } - */ -export const MovementTypeEnumSchema = z.enum(["DoorToDoor", "PortToPort", "PortToDoor", "DoorToPort"]); -export type MovementTypeEnum = z.infer; -export const MovementTypeEnum = MovementTypeEnumSchema.enum; - -/** - * ChargePaymentEnumSchema - * @type { enum } - */ -export const ChargePaymentEnumSchema = z.enum(["Prepaid", "Collect", "PayableElsewhere"]); -export type ChargePaymentEnum = z.infer; -export const ChargePaymentEnum = ChargePaymentEnumSchema.enum; - -/** - * DocumentConfigDTOSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - */ -export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable() }).partial(); -export type DocumentConfigDTO = z.infer; - -/** - * EmployeeRoleContextSchema - * @type { enum } - */ -export const EmployeeRoleContextSchema = z.enum(["global", "office"]); -export type EmployeeRoleContext = z.infer; -export const EmployeeRoleContext = EmployeeRoleContextSchema.enum; - -/** - * EmployeeRoleResponseSchema - * @type { object } - * @property { string } id Unique identifier of the role - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string } context Role context - * @property { string[] } permissions Permissions associated with the role - */ -export const EmployeeRoleResponseSchema = z.object({ id: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.nullish(), permissions: z.array(z.string()) }); -export type EmployeeRoleResponse = z.infer; - -/** - * EmploymentEmployeeResponseSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { boolean } archived Archived - * @property { EmployeeRoleResponse[] } roles Global Roles - */ -export const EmploymentEmployeeResponseSchema = z.object({ id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), phone: z.string().nullish(), archived: z.boolean().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).nullish() }); -export type EmploymentEmployeeResponse = z.infer; - -/** - * EmployeeOfficeResponseSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const EmployeeOfficeResponseSchema = z.object({ id: z.string(), name: z.string() }); -export type EmployeeOfficeResponse = z.infer; - -/** - * EmploymentResponseSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { EmployeeOfficeResponse } office - * @property { string } employeeId - * @property { EmploymentEmployeeResponse } employee - * @property { boolean } archived - * @property { string } costCenter - * @property { EmployeeRoleResponse[] } roles Employment Roles - */ -export const EmploymentResponseSchema = z.object({ id: z.string(), officeId: z.string(), office: CommonModels.EmployeeOfficeResponseSchema.nullish(), employeeId: z.string(), employee: CommonModels.EmploymentEmployeeResponseSchema.nullish(), archived: z.boolean(), costCenter: z.string().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).nullish() }); -export type EmploymentResponse = z.infer; - -/** - * LoadTypeEnumSchema - * @type { enum } - */ -export const LoadTypeEnumSchema = z.enum(["LCL", "FCL", "Trailer", "Container", "BreakBulk", "Roro", "MAFI", "LTL_ROAD", "FTL_ROAD", "Standard"]); -export type LoadTypeEnum = z.infer; -export const LoadTypeEnum = LoadTypeEnumSchema.enum; - -/** - * ServiceTypeEnumSchema - * @type { enum } - */ -export const ServiceTypeEnumSchema = z.enum(["InlandTransport", "DoorToPortOfDischarge", "PortOfLoadingToDoor", "DoorToDoor", "PortToPort", "DoorToAirport", "AirportToAirport", "AirportToDoor", "PortOfDischargeRampToDoor"]); -export type ServiceTypeEnum = z.infer; -export const ServiceTypeEnum = ServiceTypeEnumSchema.enum; - -/** - * DateRangeDtoSchema - * @type { object } - * @property { string } start - * @property { string } end - */ -export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }).nullable(), end: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type DateRangeDto = z.infer; - -/** - * BusinessPartnerLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { BusinessPartnerType[] } types Array of business partner types - */ -export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema) }); -export type BusinessPartnerLabelResponseDTO = z.infer; - -/** - * SectionEnumSchema - * @type { enum } - */ -export const SectionEnumSchema = z.enum(["Logistics"]); -export type SectionEnum = z.infer; -export const SectionEnum = SectionEnumSchema.enum; - -/** - * FrequencyEnumSchema - * @type { enum } - */ -export const FrequencyEnumSchema = z.enum(["Daily", "Weekly", "Monthly"]); -export type FrequencyEnum = z.infer; -export const FrequencyEnum = FrequencyEnumSchema.enum; - -/** - * InvoiceDirectionEnumSchema - * @type { enum } - */ -export const InvoiceDirectionEnumSchema = z.enum(["Incoming", "Outgoing"]); -export type InvoiceDirectionEnum = z.infer; -export const InvoiceDirectionEnum = InvoiceDirectionEnumSchema.enum; - -/** - * InvoiceTypeEnumSchema - * @type { enum } - */ -export const InvoiceTypeEnumSchema = z.enum(["CreditNote", "Invoice", "CollectiveInvoice", "ProForma", "PartialCreditNote", "DirectInvoice"]); -export type InvoiceTypeEnum = z.infer; -export const InvoiceTypeEnum = InvoiceTypeEnumSchema.enum; - -/** - * BooleanFilterEnumSchema - * @type { enum } - */ -export const BooleanFilterEnumSchema = z.enum(["Yes", "No"]); -export type BooleanFilterEnum = z.infer; -export const BooleanFilterEnum = BooleanFilterEnumSchema.enum; - -/** - * InvoiceStatusEnumSchema - * @type { enum } - */ -export const InvoiceStatusEnumSchema = z.enum(["Credited", "Draft", "Overpaid", "PartiallyPaid", "Outstanding", "Paid", "CreditNote", "ProForma"]); -export type InvoiceStatusEnum = z.infer; -export const InvoiceStatusEnum = InvoiceStatusEnumSchema.enum; - -/** - * OfficeInvoiceFilterDtoSchema - * @type { object } - * @property { string } search - * @property { DateRangeDto } issuingDate - * @property { DateRangeDto } serviceDate - * @property { InvoiceDirectionEnum[] } invoiceDirection - * @property { InvoiceTypeEnum[] } invoiceType - * @property { BooleanFilterEnum[] } collective - * @property { number } amountMin - * @property { number } amountMax - * @property { string[] } currencyNotation - * @property { string[] } vatRule - * @property { DateRangeDto } dueDate - * @property { InvoiceStatusEnum[] } status - * @property { string[] } receiver Filter by invoice receiver/customer IDs (UUID) - * @property { string[] } receiverCountry Filter by invoice receiver/customer country IDs - * @property { string[] } salesRep Filter by sales rep id - * @property { string } positionNumbersString - * @property { string[] } positionNumbers - * @property { string } invoiceNumbersString - * @property { string[] } invoiceNumbers - * @property { BooleanFilterEnum[] } bookkeepingExportStatus - * @property { BooleanFilterEnum[] } dunningBlock - * @property { BooleanFilterEnum[] } invoiceInReview - * @property { BooleanFilterEnum[] } isInvoiceOk - * @property { BooleanFilterEnum[] } isVatOk - * @property { number } invoiceNumberMin - * @property { number } invoiceNumberMax - * @property { number } internalNumberMin - * @property { number } internalNumberMax - * @property { string } externalSystemId Filter invoices by position external system ID (substring match) - * @property { string } hblNumber Filter invoices by HBL/HAWB (substring match) - * @property { string } mblNumber Filter invoices by MBL/MAWB (substring match) - * @property { string } bookingNumber Filter invoices by booking number (substring match) - * @property { string } vessel Filter invoices by vessel name (substring match) - * @property { string } voyage Filter invoices by voyage number (substring match) - * @property { string } creditorId Filter invoices by creditor ID (substring match) - * @property { string } debtorId Filter invoices by debtor ID (substring match) - */ -export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string().nullable(), issuingDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).nullable(), collective: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), amountMin: z.number().nullable(), amountMax: z.number().nullable(), currencyNotation: z.array(z.string()).nullable(), vatRule: z.array(z.string()).nullable(), dueDate: CommonModels.DateRangeDtoSchema.nullable(), status: z.array(CommonModels.InvoiceStatusEnumSchema).nullable(), receiver: z.array(z.string()).nullable(), receiverCountry: z.array(z.string()).nullable(), salesRep: z.array(z.string()).nullable(), positionNumbersString: z.string().nullable(), positionNumbers: z.array(z.string()).nullable(), invoiceNumbersString: z.string().nullable(), invoiceNumbers: z.array(z.string()).nullable(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceNumberMin: z.number().nullable(), invoiceNumberMax: z.number().nullable(), internalNumberMin: z.number().nullable(), internalNumberMax: z.number().nullable(), externalSystemId: z.string().nullable(), hblNumber: z.string().nullable(), mblNumber: z.string().nullable(), bookingNumber: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), creditorId: z.string().nullable(), debtorId: z.string().nullable() }).partial(); -export type OfficeInvoiceFilterDto = z.infer; - -/** - * PositionStatusEnumSchema - * @type { enum } - */ -export const PositionStatusEnumSchema = z.enum(["Preparing", "NeedsDocumentation", "Executing", "Done"]); -export type PositionStatusEnum = z.infer; -export const PositionStatusEnum = PositionStatusEnumSchema.enum; - -/** - * PositionCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type PositionCustomerDto = z.infer; - -/** - * PositionQuoteDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }); -export type PositionQuoteDto = z.infer; - -/** - * ParentPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }); -export type ParentPositionDto = z.infer; - -/** - * PositionTypeEnumSchema - * @type { enum } - */ -export const PositionTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); -export type PositionTypeEnum = z.infer; -export const PositionTypeEnum = PositionTypeEnumSchema.enum; - -/** - * PositionProjectLiteDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type PositionProjectLiteDto = z.infer; - -/** - * EmployeeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const EmployeeDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type EmployeeDto = z.infer; - -/** - * PositionCoreResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } rootFolderId - * @property { string } externalSystemId - * @property { MovementTypeEnum } inttraTypeOfMove - * @property { PositionCustomerDto } customer - * @property { boolean } isCancelled - * @property { string } owningOfficeId - * @property { string } originOfficeId - * @property { PositionQuoteDto } quote - * @property { string } number - * @property { SectionEnum } section - * @property { DirectionEnum } direction - * @property { TransportModeEnum } transportMode - * @property { string } statusDate - * @property { string } serviceDate - * @property { string } dateOfDeparture - * @property { string } dateOfArrival - * @property { PositionStatusEnum } status - * @property { LoadTypeEnum } loadType - * @property { IncotermsEnum } incoterms - * @property { IncotermsEnum } secondIncoterms - * @property { ServiceTypeEnum } serviceType - * @property { ParentPositionDto } parentPosition - * @property { string } buyRateReference - * @property { FrequencyEnum } frequency - * @property { PositionTypeEnum } positionType - * @property { boolean } isParentPosition - * @property { boolean } hasParentPosition - * @property { boolean } hasChildPositions - * @property { PositionProjectLiteDto } projectLite - * @property { boolean } isExcludedFromStatistics - * @property { EmployeeDto } salesRep - * @property { string } fillingCompany - * @property { string } sellingContract - * @property { string } fillingScacCode - * @property { string } serviceValidity - * @property { string } ratesValidity - * @property { EmployeeDto } responsibleEmployee - * @property { EmployeeDto } receivedByEmployee - * @property { string } team - * @property { string } createdAt - * @property { string } updatedAt - * @property { EditorContentResponseDto } notes Notes - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.nullish(), volumetricWeightModifier: z.number().nullish() }); -export type PositionCoreResponseDto = z.infer; - -/** - * VesselDtoSchema - * @type { object } - * @property { string } name - * @property { number } imo - * @property { number } mmsi - */ -export const VesselDtoSchema = z.object({ name: z.string(), imo: z.number().nullish(), mmsi: z.number().nullish() }); -export type VesselDto = z.infer; - -/** - * StatusResponseDtoSchema - * @type { object } - * @property { string } status Status - * @property { string } message Message - * @property { string } code Alphanumeric code of the message type - */ -export const StatusResponseDtoSchema = z.object({ status: z.string(), message: z.string(), code: z.string() }); -export type StatusResponseDto = z.infer; - -/** - * PaginationDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const PaginationDtoSchema = z.object({ items: z.array(z.string()), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type PaginationDto = z.infer; - -/** - * LabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - */ -export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }); -export type LabelResponseDTO = z.infer; - -/** - * GenerateWorkingDocumentRequestDtoSchema - * @type { object } - * @property { string } issuedAt - * @property { string } fileName - */ -export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }); -export type GenerateWorkingDocumentRequestDto = z.infer; - -/** - * UpdateInvolvedPartyDtoSchema - * @type { object } - * @property { string } reference - * @property { string } businessPartnerId - * @property { string } contactId - */ -export const UpdateInvolvedPartyDtoSchema = z.object({ reference: z.string().nullable(), businessPartnerId: z.string().nullable(), contactId: z.string().nullable() }).partial(); -export type UpdateInvolvedPartyDto = z.infer; - -/** - * MergeRoutesRequestDtoSchema - * @type { object } - * @property { string } sourceCargoId Source cargo ID to merge from (sea positions only) - */ -export const MergeRoutesRequestDtoSchema = z.object({ sourceCargoId: z.string().nullable() }); -export type MergeRoutesRequestDto = z.infer; - -/** - * CopyRouteRequestDtoSchema - * @type { object } - * @property { string } targetCargoId Target cargo ID to copy to (sea positions only) - */ -export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().nullable() }); -export type CopyRouteRequestDto = z.infer; - -/** - * CargoSummaryResponseDTOSchema - * @type { object } - * @property { string } transportUnitTypeName Transport unit type name (e.g., "40' DRY", "20'") - * @property { number } quantity Total quantity of this transport unit type - */ -export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string(), quantity: z.number() }); -export type CargoSummaryResponseDTO = z.infer; - -/** - * CreatePositionCargoDTOSchema - * @type { object } - * @property { string } cargoTypeId Cargo type ID - * @property { string } note - * @property { boolean } autoCalculateTotals - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { string } rateOptions - * @property { string } rateClass - * @property { number } ratePerKg - * @property { number } totalRate - * @property { string } textForCustoms - * @property { number } tare - * @property { number } vgm - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - */ -export const CreatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().nullable(), note: z.string().nullable(), autoCalculateTotals: z.boolean().nullable(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean().nullable(), autoCalculateVgm: z.boolean().nullable() }).partial(); -export type CreatePositionCargoDTO = z.infer; - -/** - * UpdatePositionCargoDTOSchema - * @type { object } - * @property { string } cargoTypeId Cargo type ID - * @property { string } note - * @property { boolean } autoCalculateTotals - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { string } rateOptions - * @property { string } rateClass - * @property { number } ratePerKg - * @property { number } totalRate - * @property { string } textForCustoms - * @property { number } tare - * @property { number } vgm - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - */ -export const UpdatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().nullable(), note: z.string().nullable(), autoCalculateTotals: z.boolean().nullable(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean().nullable(), autoCalculateVgm: z.boolean().nullable() }).partial(); -export type UpdatePositionCargoDTO = z.infer; - -/** - * MovePositionCargoPackageRequestDTOSchema - * @type { object } - * @property { string } targetCargoId Target cargo ID to move the package to - */ -export const MovePositionCargoPackageRequestDTOSchema = z.object({ targetCargoId: z.string() }); -export type MovePositionCargoPackageRequestDTO = z.infer; - -/** - * PositionCargoPaginationOrderFieldSchema - * @type { enum } - */ -export const PositionCargoPaginationOrderFieldSchema = z.enum(["createdAt", "updatedAt"]); -export type PositionCargoPaginationOrderField = z.infer; -export const PositionCargoPaginationOrderField = PositionCargoPaginationOrderFieldSchema.enum; - -/** - * PositionAvailablePartnersUseCaseSchema - * @type { enum } - */ -export const PositionAvailablePartnersUseCaseSchema = z.enum(["financeCustomer", "financeVendor"]); -export type PositionAvailablePartnersUseCase = z.infer; -export const PositionAvailablePartnersUseCase = PositionAvailablePartnersUseCaseSchema.enum; - -} diff --git a/test/generated/base/containerYards/containerYards.acl.ts b/test/generated/base/containerYards/containerYards.acl.ts deleted file mode 100644 index f4e07a4..0000000 --- a/test/generated/base/containerYards/containerYards.acl.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace ContainerYardsAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "ContainerYard" -] as AbilityTuple<"Create", "ContainerYard">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -/** - * Use for `useGetLabelById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetLabelById` query - */ -export const canUseGetLabelById = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Update", - "ContainerYard" -] as AbilityTuple<"Update", "ContainerYard">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Update", - "ContainerYard" -] as AbilityTuple<"Update", "ContainerYard">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "ContainerYard" -] as AbilityTuple<"Update", "ContainerYard">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -} diff --git a/test/generated/base/containerYards/containerYards.api.ts b/test/generated/base/containerYards/containerYards.api.ts deleted file mode 100644 index 60ae21e..0000000 --- a/test/generated/base/containerYards/containerYards.api.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ContainerYardsModels } from "./containerYards.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ContainerYardsApi { -export const paginate = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, - `/container-yards`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, ) => { - return AppRestClient.post( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards`, - ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, - `/container-yards/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getLabelById = (id: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.LabelResponseDTOSchema }, - `/container-yards/${id}/labels`, - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}/unarchive`, - - ) -}; -export const update = (id: string, data: ContainerYardsModels.UpdateContainerYardRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}`, - ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}`, - - ) -}; -} diff --git a/test/generated/base/containerYards/containerYards.configs.ts b/test/generated/base/containerYards/containerYards.configs.ts deleted file mode 100644 index 4458f76..0000000 --- a/test/generated/base/containerYards/containerYards.configs.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ContainerYardsModels } from "./containerYards.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ContainerYardsQueries } from "./containerYards.queries"; -import { ContainerYardsAcl } from "./containerYards.acl"; - -export namespace ContainerYardsConfigs { -export const containerYardsConfig = { - meta: { - title: "Container Yards", - }, - readAll: { - acl: ContainerYardsAcl.canUsePaginate, - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - paginated: ContainerYardsQueries.usePaginate, - infinite: ContainerYardsQueries.usePaginateInfinite, - filters: { - schema: ContainerYardsModels.ContainerYardFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ContainerYardsModels.ContainerYardFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - shortName: true, - name: true, - archived: true, - street: true, - secondaryStreet: true, - zip: true, - city: true, - country: true, - district: true, - additionalInformation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ContainerYardsAcl.canUseFindById, - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - query: ContainerYardsQueries.useFindById, - }, - create: { - acl: ContainerYardsAcl.canUseCreate, - schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, - mutation: ContainerYardsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, - options: { - inputs: { - matchCode: true, - name: true, - shortName: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - additionalInformation: true, - }, - }, -}) - }, - update: { - acl: ContainerYardsAcl.canUseUpdate, - schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, - mutation: ContainerYardsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, - options: { - inputs: { - matchCode: true, - name: true, - shortName: true, - addressId: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - additionalInformation: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ContainerYardsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ContainerYardsQueries.usePaginateLabels, - infinite: ContainerYardsQueries.usePaginateLabelsInfinite, - filters: { - schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/containerYards/containerYards.models.ts b/test/generated/base/containerYards/containerYards.models.ts deleted file mode 100644 index d85e878..0000000 --- a/test/generated/base/containerYards/containerYards.models.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ContainerYardsModels { -/** - * ContainerYardEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ContainerYardEmployeeDTO = z.infer; - -/** - * ContainerYardResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchCode Container yard match code - * @property { string } shortName Container yard short name - * @property { string } name Container yard name - * @property { boolean } archived Whether the container yard is archived - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { object } city - * @property { string } city.id - * @property { string } city.name - * @property { object } country - * @property { string } country.id - * @property { string } country.name - * @property { string } country.isoCode2 - * @property { string } country.isoCode3 - * @property { string } district District - * @property { string } additionalInformation Additional information - * @property { string } createdById - * @property { ContainerYardEmployeeDTO } createdBy - * @property { string } createdAt Date when the container yard was created - * @property { string } updatedById - * @property { ContainerYardEmployeeDTO } updatedBy - * @property { string } updatedAt Date when the container yard was last updated - */ -export const ContainerYardResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), shortName: z.string().nullish(), name: z.string(), archived: z.boolean(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: z.object({ id: z.string(), name: z.string() }).nullish(), country: z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).nullish(), district: z.string().nullish(), additionalInformation: z.string().nullish(), createdById: z.string().nullish(), createdBy: ContainerYardEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ContainerYardEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type ContainerYardResponseDTO = z.infer; - -/** - * ContainerYardFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ContainerYardFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type ContainerYardFilterDto = z.infer; - -/** - * ContainerYardLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const ContainerYardLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type ContainerYardLabelFilterDto = z.infer; - -/** - * CreateContainerYardRequestDTOSchema - * @type { object } - * @property { string } matchCode Match code - * @property { string } name Name - * @property { string } shortName Short name - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } cityId City ID - * @property { string } countryId Country ID - * @property { string } district District - * @property { string } additionalInformation Additional information - */ -export const CreateContainerYardRequestDTOSchema = z.object({ matchCode: z.string(), name: z.string(), shortName: z.string().nullish(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string().nullish(), additionalInformation: z.string().nullish() }); -export type CreateContainerYardRequestDTO = z.infer; - -/** - * UpdateContainerYardRequestDTOSchema - * @type { object } - * @property { string } matchCode Match code - * @property { string } name Name - * @property { string } shortName Short name - * @property { string } addressId Address ID - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } cityId City ID - * @property { string } countryId Country ID - * @property { string } district District - * @property { string } additionalInformation Additional information - */ -export const UpdateContainerYardRequestDTOSchema = z.object({ matchCode: z.string().nullable(), name: z.string().nullable(), shortName: z.string().nullable(), addressId: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable(), additionalInformation: z.string().nullable() }).partial(); -export type UpdateContainerYardRequestDTO = z.infer; - -/** - * ContainerYardsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ContainerYardsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ContainerYardsPaginateOrderParamEnum = z.infer; -export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderParamEnumSchema.enum; - -/** - * ContainerYardsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ContainerYardResponseDTO[] } items - */ -export const ContainerYardsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerYardResponseDTOSchema).nullable() }).partial().shape }); -export type ContainerYardsPaginateResponse = z.infer; - -/** - * ContainerYardsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ContainerYardsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ContainerYardsPaginateLabelsOrderParamEnum = z.infer; -export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * ContainerYardsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ContainerYardsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type ContainerYardsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/containerYards/containerYards.queries.ts b/test/generated/base/containerYards/containerYards.queries.ts deleted file mode 100644 index 97b958b..0000000 --- a/test/generated/base/containerYards/containerYards.queries.ts +++ /dev/null @@ -1,286 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ContainerYardsAcl } from "./containerYards.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ContainerYardsModels } from "./containerYards.models"; -import { ContainerYardsApi } from "./containerYards.api"; - -export namespace ContainerYardsQueries { -export const moduleName = QueryModule.ContainerYards; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string) => [...keys.all, "/container-yards", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getLabelById: (id: string) => [...keys.all, "/container-yards/:id/labels", id] as const, - findById: (id: string) => [...keys.all, "/container-yards/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Container Yards - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Container Yards - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create container yard - * @permission Requires `canUseCreate` ability - * @param { ContainerYardsModels.CreateContainerYardRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(ContainerYardsAcl.canUseCreate()); - return ContainerYardsApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate container yard labels (id and name) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate container yard labels (id and name) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetLabelById` - * @summary Get container yard by ID with label format (id and formatted name) - * @permission Requires `canUseGetLabelById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetLabelById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getLabelById(id), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUseGetLabelById()); - return ContainerYardsApi.getLabelById(id) }, - ...options, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive container yard - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ContainerYardsAcl.canUseArchive()); - return ContainerYardsApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive container yard - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ContainerYardsAcl.canUseUnarchive()); - return ContainerYardsApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update container yard - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { ContainerYardsModels.UpdateContainerYardRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(ContainerYardsAcl.canUseUpdate()); - return ContainerYardsApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get container yard - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUseFindById()); - return ContainerYardsApi.findById(id) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/controlTowerAuth/controlTowerAuth.api.ts b/test/generated/base/controlTowerAuth/controlTowerAuth.api.ts deleted file mode 100644 index 13804d1..0000000 --- a/test/generated/base/controlTowerAuth/controlTowerAuth.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerAuthModels } from "./controlTowerAuth.models"; - -export namespace ControlTowerAuthApi { -export const login = (data: ControlTowerAuthModels.LoginRequestDto, ) => { - return AppRestClient.post( - { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, - `/auth/move/login`, - ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), - - ) -}; -export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, ) => { - return AppRestClient.post( - { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, - `/auth/reset-password`, - ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/controlTowerAuth/controlTowerAuth.models.ts b/test/generated/base/controlTowerAuth/controlTowerAuth.models.ts deleted file mode 100644 index 8cc05bd..0000000 --- a/test/generated/base/controlTowerAuth/controlTowerAuth.models.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerAuthModels { -/** - * LoginRequestDtoSchema - * @type { object } - * @property { string } username - * @property { string } password - */ -export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }); -export type LoginRequestDto = z.infer; - -/** - * LoginResponseDtoSchema - * @type { object } - * @property { string } accessToken - * @property { boolean } resetPasswordRequired - * @property { string } passwordResetToken - * @property { string } username - */ -export const LoginResponseDtoSchema = z.object({ accessToken: z.string().nullable(), resetPasswordRequired: z.boolean().nullish(), passwordResetToken: z.string().nullish(), username: z.string().nullish() }); -export type LoginResponseDto = z.infer; - -/** - * PasswordResetDtoSchema - * @type { object } - * @property { string } password - * @property { string } username - * @property { string } token - */ -export const PasswordResetDtoSchema = z.object({ password: z.string(), username: z.string(), token: z.string() }); -export type PasswordResetDto = z.infer; - -} diff --git a/test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts b/test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts deleted file mode 100644 index 9fdc009..0000000 --- a/test/generated/base/controlTowerAuth/controlTowerAuth.queries.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerAuthModels } from "./controlTowerAuth.models"; -import { ControlTowerAuthApi } from "./controlTowerAuth.api"; - -export namespace ControlTowerAuthQueries { -export const moduleName = QueryModule.ControlTowerAuth; - - - -/** - * Mutation `useLogin` - * @description Returns an access token to authenticate for protected endpoints - * @param { ControlTowerAuthModels.LoginRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 400, 401] - */ -export const useLogin = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerAuthApi.login(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useResetPassword` - * @description Resets the password for the requesting user - * @param { ControlTowerAuthModels.PasswordResetDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 400, 401] - */ -export const useResetPassword = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerAuthApi.resetPassword(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.api.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.api.ts deleted file mode 100644 index ac13db5..0000000 --- a/test/generated/base/controlTowerBookings/controlTowerBookings.api.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; - -export namespace ControlTowerBookingsApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, - `/bookings`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, - `/bookings/${id}`, - - ) -}; -export const findPackageById = (packageId: string, bookingId: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, - `/bookings/${bookingId}/packages/${packageId}`, - - ) -}; -} diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts deleted file mode 100644 index ce75a71..0000000 --- a/test/generated/base/controlTowerBookings/controlTowerBookings.configs.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; -import { ControlTowerBookingsQueries } from "./controlTowerBookings.queries"; - -export namespace ControlTowerBookingsConfigs { -export const bookingsConfig = { - meta: { - title: "Bookings", - }, - readAll: { - schema: ControlTowerBookingsModels.BookingListItemDtoSchema, - paginated: ControlTowerBookingsQueries.useFindAll, - infinite: ControlTowerBookingsQueries.useFindAllInfinite, - filters: { - schema: ControlTowerBookingsModels.BookingFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerBookingsModels.BookingFilterDtoSchema, - options: { - inputs: { - projectId: true, - search: true, - companyIds: true, - purchaseOrderId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ControlTowerBookingsModels.BookingListItemDtoSchema, - options: { - columns: { - id: true, - bookingNumber: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema, - }, -}), - }, - read: { - schema: ControlTowerBookingsModels.BookingResponseDtoSchema, - query: ControlTowerBookingsQueries.useFindById, - }, -}; - -} diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.models.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.models.ts deleted file mode 100644 index 8170c63..0000000 --- a/test/generated/base/controlTowerBookings/controlTowerBookings.models.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerBookingsModels { -/** - * BookingListItemDtoSchema - * @type { object } - * @property { string } id - * @property { string } bookingNumber - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const BookingListItemDtoSchema = z.object({ id: z.string(), bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); -export type BookingListItemDto = z.infer; - -/** - * BookingContainerDtoSchema - * @type { object } - * @property { string } id - * @property { string } containerNumber - * @property { string } type - * @property { string } loadType - * @property { string } stuffedInContainer - * @property { string[] } hsCode - * @property { number } noS - * @property { number } weight - * @property { string } lastEventLocation - * @property { string } lastEventName - * @property { string } lastEventDate - * @property { string } seals - */ -export const BookingContainerDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), loadType: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), hsCode: z.array(z.string()).nullable(), noS: z.number().nullable(), weight: z.number().nullable(), lastEventLocation: z.string().nullable(), lastEventName: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), seals: z.string().nullable() }); -export type BookingContainerDto = z.infer; - -/** - * BookingPackageDtoSchema - * @type { object } - * @property { string } id - * @property { string } packageNumber - * @property { string } containerNumber - * @property { string } type - * @property { string } description - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - */ -export const BookingPackageDtoSchema = z.object({ id: z.string(), packageNumber: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), description: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable() }); -export type BookingPackageDto = z.infer; - -/** - * BookingResponseDtoSchema - * @type { object } - * @property { string } bookingNumber - * @property { string } ets - * @property { string } etaPod - * @property { string } etaFinalDeliveryPlace - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } destination - * @property { string } lastEvent - * @property { string[] } files - * @property { string } poNumber - * @property { string } blNumber - * @property { BookingContainerDto[] } containers - * @property { BookingPackageDto[] } packages - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - * @property { string } id - */ -export const BookingResponseDtoSchema = z.object({ bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), etaPod: z.iso.datetime({ offset: true }).nullable(), etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), destination: z.string().nullable(), lastEvent: z.string().nullable(), files: z.array(z.string()).nullable(), poNumber: z.string().nullable(), blNumber: z.string().nullable(), containers: z.array(BookingContainerDtoSchema).nullish(), packages: z.array(BookingPackageDtoSchema).nullish(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable(), id: z.string() }); -export type BookingResponseDto = z.infer; - -/** - * PackageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } poNumber - * @property { string } bookingNumber - * @property { string } blNumber - * @property { string } containerNumber - * @property { string } packageNumber - * @property { string } description - * @property { number } netWeight - * @property { number } grossWeight - * @property { number } length - * @property { number } width - * @property { number } height - * @property { number } volume - * @property { string } storageInstruction - * @property { string } destination - * @property { string[] } files - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const PackageResponseDtoSchema = z.object({ id: z.string(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), containerNumber: z.string().nullable(), packageNumber: z.string().nullable(), description: z.string().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), volume: z.number().nullable(), storageInstruction: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); -export type PackageResponseDto = z.infer; - -/** - * BookingFilterDtoSchema - * @type { object } - * @property { string } projectId - * @property { string } search Min Length: `1` - * @property { string[] } companyIds - * @property { string } purchaseOrderId - */ -export const BookingFilterDtoSchema = z.object({ projectId: z.string().nullable(), search: z.string().min(1).nullable(), companyIds: z.array(z.string()).nullable(), purchaseOrderId: z.string().nullable() }).partial(); -export type BookingFilterDto = z.infer; - -/** - * ControlTowerBookingsFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ControlTowerBookingsFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); -export type ControlTowerBookingsFindAllOrderParamEnum = z.infer; -export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFindAllOrderParamEnumSchema.enum; - -/** - * ControlTowerBookingsFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookingListItemDto[] } items - */ -export const ControlTowerBookingsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookingListItemDtoSchema).nullable() }).partial().shape }); -export type ControlTowerBookingsFindAllResponse = z.infer; - -} diff --git a/test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts b/test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts deleted file mode 100644 index 0fd4b0d..0000000 --- a/test/generated/base/controlTowerBookings/controlTowerBookings.queries.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; -import { ControlTowerBookingsApi } from "./controlTowerBookings.api"; - -export namespace ControlTowerBookingsQueries { -export const moduleName = QueryModule.ControlTowerBookings; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string) => [...keys.all, "/bookings", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string) => [...keys.all, "/bookings", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/bookings/:id", id] as const, - findPackageById: (packageId: string, bookingId: string) => [...keys.all, "/bookings/:bookingId/packages/:packageId", packageId, bookingId] as const, -}; - -/** - * Query `useFindAll` - * @summary Get all accessible bookings for the customer - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => - ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @summary Get all accessible bookings for the customer - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @description Returns a booking with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => - ControlTowerBookingsApi.findById(id), - ...options, - }); -}; - -/** - * Query `useFindPackageById` - * @description Returns a package with the specified id - * @param { string } object.packageId Path parameter - * @param { string } object.bookingId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindPackageById = ({ packageId, bookingId }: { packageId: string, bookingId: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findPackageById(packageId, bookingId), - queryFn: () => - ControlTowerBookingsApi.findPackageById(packageId, bookingId), - ...options, - }); -}; - -} diff --git a/test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts b/test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts deleted file mode 100644 index a35354b..0000000 --- a/test/generated/base/controlTowerCalendar/controlTowerCalendar.api.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; - -export namespace ControlTowerCalendarApi { -export const getCalendar = (from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, ) => { - return AppRestClient.get( - { resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, - `/calendar`, - { - params: { - from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), - to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), - type: ZodExtended.parse(ControlTowerCalendarModels.CalendarTypeEnumSchema, type, { type: "query", name: "type" }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - poNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarPoNumbersParamSchema.optional(), poNumbers, { type: "query", name: "poNumbers" }), - containerNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarContainerNumbersParamSchema.optional(), containerNumbers, { type: "query", name: "containerNumbers" }), - bookingNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarBookingNumbersParamSchema.optional(), bookingNumbers, { type: "query", name: "bookingNumbers" }), - }, - } - ) -}; -} diff --git a/test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts b/test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts deleted file mode 100644 index 43dbf63..0000000 --- a/test/generated/base/controlTowerCalendar/controlTowerCalendar.models.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerCalendarModels { -/** - * EventRelationTypeEnumSchema - * @type { enum } - */ -export const EventRelationTypeEnumSchema = z.enum(["Booking", "Container", "PurchaseOrder"]); -export type EventRelationTypeEnum = z.infer; -export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; - -/** - * CalendarEventRelationDtoSchema - * @type { object } - * @property { EventRelationTypeEnum } type - * @property { string } id - * @property { string } number - */ -export const CalendarEventRelationDtoSchema = z.object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }); -export type CalendarEventRelationDto = z.infer; - -/** - * CalendarTypeEnumSchema - * @type { enum } - */ -export const CalendarTypeEnumSchema = z.enum(["PurchaseOrder", "Booking", "Container", "Package"]); -export type CalendarTypeEnum = z.infer; -export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; - -/** - * CalendarEventDtoSchema - * @type { object } - * @property { string } entityId - * @property { string } entityNumber - * @property { CalendarTypeEnum } entityType - * @property { string } date - * @property { string } title - * @property { CalendarEventRelationDto[] } relations - */ -export const CalendarEventDtoSchema = z.object({ entityId: z.string(), entityNumber: z.string(), entityType: CalendarTypeEnumSchema, date: z.iso.datetime({ offset: true }), title: z.string(), relations: z.array(CalendarEventRelationDtoSchema) }); -export type CalendarEventDto = z.infer; - -/** - * FiltersDtoSchema - * @type { object } - * @property { string[] } poNumbers - * @property { string[] } bookingNumbers - * @property { string[] } containerNumbers - */ -export const FiltersDtoSchema = z.object({ poNumbers: z.array(z.string()), bookingNumbers: z.array(z.string()), containerNumbers: z.array(z.string()) }); -export type FiltersDto = z.infer; - -/** - * CalendarDtoSchema - * @type { object } - * @property { CalendarEventDto[] } events - * @property { FiltersDto } filters - */ -export const CalendarDtoSchema = z.object({ events: z.array(CalendarEventDtoSchema), filters: FiltersDtoSchema }); -export type CalendarDto = z.infer; - -/** - * CalendarResponseDtoSchema - * @type { object } - * @property { CalendarDto } data - */ -export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }); -export type CalendarResponseDto = z.infer; - -/** - * GetCalendarPoNumbersParamSchema - * @type { array } - */ -export const GetCalendarPoNumbersParamSchema = z.array(z.string()).nullish(); -export type GetCalendarPoNumbersParam = z.infer; - -/** - * GetCalendarContainerNumbersParamSchema - * @type { array } - */ -export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).nullish(); -export type GetCalendarContainerNumbersParam = z.infer; - -/** - * GetCalendarBookingNumbersParamSchema - * @type { array } - */ -export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).nullish(); -export type GetCalendarBookingNumbersParam = z.infer; - -} diff --git a/test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts b/test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts deleted file mode 100644 index 5e81f36..0000000 --- a/test/generated/base/controlTowerCalendar/controlTowerCalendar.queries.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; -import { ControlTowerCalendarApi } from "./controlTowerCalendar.api"; - -export namespace ControlTowerCalendarQueries { -export const moduleName = QueryModule.ControlTowerCalendar; - -export const keys = { - all: [moduleName] as const, - getCalendar: (from?: string, to?: string, type?: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam) => [...keys.all, "/calendar", from, to, type, search, poNumbers, containerNumbers, bookingNumbers] as const, -}; - -/** - * Query `useGetCalendar` - * @param { string } object.from Query parameter - * @param { string } object.to Query parameter - * @param { ControlTowerCalendarModels.CalendarTypeEnum } object.type Query parameter - * @param { string } object.search Query parameter - * @param { ControlTowerCalendarModels.GetCalendarPoNumbersParam } object.poNumbers Query parameter - * @param { ControlTowerCalendarModels.GetCalendarContainerNumbersParam } object.containerNumbers Query parameter - * @param { ControlTowerCalendarModels.GetCalendarBookingNumbersParam } object.bookingNumbers Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCalendar = ({ from, to, type, search, poNumbers, containerNumbers, bookingNumbers }: { from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), - queryFn: () => - ControlTowerCalendarApi.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), - ...options, - }); -}; - -} diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.api.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.api.ts deleted file mode 100644 index 3196fe3..0000000 --- a/test/generated/base/controlTowerContainers/controlTowerContainers.api.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; - -export namespace ControlTowerContainersApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, - `/containers`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, - `/containers/${id}`, - - ) -}; -export const getJourney = (id: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, - `/containers/${id}/journey`, - - ) -}; -} diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts deleted file mode 100644 index 98105eb..0000000 --- a/test/generated/base/controlTowerContainers/controlTowerContainers.configs.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; -import { ControlTowerContainersQueries } from "./controlTowerContainers.queries"; - -export namespace ControlTowerContainersConfigs { -export const containersConfig = { - meta: { - title: "Containers", - }, - readAll: { - schema: ControlTowerContainersModels.ContainerListItemDtoSchema, - paginated: ControlTowerContainersQueries.useFindAll, - infinite: ControlTowerContainersQueries.useFindAllInfinite, - filters: { - schema: ControlTowerContainersModels.ContainerFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerContainersModels.ContainerFilterDtoSchema, - options: { - inputs: { - companyIds: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ControlTowerContainersModels.ContainerListItemDtoSchema, - options: { - columns: { - containerNumber: true, - id: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, - }, -}), - }, - read: { - schema: ControlTowerContainersModels.ContainerResponseDtoSchema, - query: ControlTowerContainersQueries.useFindById, - }, -}; - -} diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.models.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.models.ts deleted file mode 100644 index e0df923..0000000 --- a/test/generated/base/controlTowerContainers/controlTowerContainers.models.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerContainersModels { -/** - * ContainerListItemDtoSchema - * @type { object } - * @property { string } containerNumber - * @property { string } id - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const ContainerListItemDtoSchema = z.object({ containerNumber: z.string().nullable(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); -export type ContainerListItemDto = z.infer; - -/** - * ContainerEventDtoSchema - * @type { object } - * @property { CommonModels.VesselDto } vessel - * @property { string } name - * @property { string } date - * @property { boolean } checkedIn - */ -export const ContainerEventDtoSchema = z.object({ vessel: CommonModels.VesselDtoSchema.nullable(), name: z.string(), date: z.iso.datetime({ offset: true }).nullable(), checkedIn: z.boolean() }); -export type ContainerEventDto = z.infer; - -/** - * ContainerJourneyDtoSchema - * @type { object } - * @property { string } id - * @property { string } country - * @property { string } terminal - * @property { boolean } checkedIn - * @property { ContainerEventDto[] } events - */ -export const ContainerJourneyDtoSchema = z.object({ id: z.string(), country: z.string().nullable(), terminal: z.string().nullable(), checkedIn: z.boolean(), events: z.array(ContainerEventDtoSchema) }); -export type ContainerJourneyDto = z.infer; - -/** - * PackageNumberDtoSchema - * @type { object } - * @property { string } id - * @property { string } type - * @property { string } description - */ -export const PackageNumberDtoSchema = z.object({ id: z.string(), type: z.string().nullable(), description: z.string() }); -export type PackageNumberDto = z.infer; - -/** - * ContainerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } containerNumber - * @property { string } poNumber - * @property { string } bookingNumber - * @property { string } blNumber - * @property { string } stuffedInContainer - * @property { string } containerType - * @property { string } loadType - * @property { string[] } hsCode - * @property { number } totalVolume - * @property { number } totalWeight - * @property { string } cargoDescription - * @property { number } noS - * @property { ContainerJourneyDto[] } journeys - * @property { PackageNumberDto[] } packages - * @property { string } bookingId - * @property { string } destination - * @property { string[] } files - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const ContainerResponseDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), containerType: z.string().nullable(), loadType: z.string().nullable(), hsCode: z.array(z.string()).nullable(), totalVolume: z.number().nullable(), totalWeight: z.number().nullable(), cargoDescription: z.string().nullable(), noS: z.number().nullable(), journeys: z.array(ContainerJourneyDtoSchema).nullish(), packages: z.array(PackageNumberDtoSchema).nullish(), bookingId: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); -export type ContainerResponseDto = z.infer; - -/** - * ContainerJourneyResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { ContainerJourneyDto[] } journeys - * @property { string[] } packageNumbers - */ -export const ContainerJourneyResponseDtoSchema = z.object({ id: z.string(), number: z.string(), journeys: z.array(ContainerJourneyDtoSchema), packageNumbers: z.array(z.string()) }); -export type ContainerJourneyResponseDto = z.infer; - -/** - * ContainerFilterDtoSchema - * @type { object } - * @property { number[] } companyIds - * @property { string } search - */ -export const ContainerFilterDtoSchema = z.object({ companyIds: z.array(z.number()).nullable(), search: z.string().nullable() }).partial(); -export type ContainerFilterDto = z.infer; - -/** - * ControlTowerContainersFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ControlTowerContainersFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); -export type ControlTowerContainersFindAllOrderParamEnum = z.infer; -export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainersFindAllOrderParamEnumSchema.enum; - -/** - * ControlTowerContainersFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ContainerListItemDto[] } items - */ -export const ControlTowerContainersFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerListItemDtoSchema).nullable() }).partial().shape }); -export type ControlTowerContainersFindAllResponse = z.infer; - -} diff --git a/test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts b/test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts deleted file mode 100644 index ccb35ea..0000000 --- a/test/generated/base/controlTowerContainers/controlTowerContainers.queries.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; -import { ControlTowerContainersApi } from "./controlTowerContainers.api"; - -export namespace ControlTowerContainersQueries { -export const moduleName = QueryModule.ControlTowerContainers; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string) => [...keys.all, "/containers", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string) => [...keys.all, "/containers", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/containers/:id", id] as const, - getJourney: (id: string) => [...keys.all, "/containers/:id/journey", id] as const, -}; - -/** - * Query `useFindAll` - * @description Lists containers - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => - ControlTowerContainersApi.findAll(limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @description Lists containers - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @description Returns a container with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => - ControlTowerContainersApi.findById(id), - ...options, - }); -}; - -/** - * Query `useGetJourney` - * @description Returns the journey and package numbers of a container with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetJourney = ({ id }: { id: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getJourney(id), - queryFn: () => - ControlTowerContainersApi.getJourney(id), - ...options, - }); -}; - -} diff --git a/test/generated/base/controlTowerMe/controlTowerMe.api.ts b/test/generated/base/controlTowerMe/controlTowerMe.api.ts deleted file mode 100644 index 91b82bc..0000000 --- a/test/generated/base/controlTowerMe/controlTowerMe.api.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerMeModels } from "./controlTowerMe.models"; - -export namespace ControlTowerMeApi { -export const getUserProfile = () => { - return AppRestClient.get( - { resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, - `/me`, - - ) -}; -export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, ) => { - return AppRestClient.put( - { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, - `/me`, - ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), - - ) -}; -export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, ) => { - return AppRestClient.put( - { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, - `/me/basic`, - ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), - - ) -}; -export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, ) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/password`, - ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), - - ) -}; -export const updateEmailPreferences = (data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, ) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/email-preferences`, - ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), - - ) -}; -export const updateProjectAccess = () => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/access`, - - ) -}; -} diff --git a/test/generated/base/controlTowerMe/controlTowerMe.models.ts b/test/generated/base/controlTowerMe/controlTowerMe.models.ts deleted file mode 100644 index e453fe6..0000000 --- a/test/generated/base/controlTowerMe/controlTowerMe.models.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerMeModels { -/** - * LinksDtoSchema - * @type { object } - * @property { string } self - * @property { string } related - */ -export const LinksDtoSchema = z.object({ self: z.string().nullable(), related: z.string().nullable() }).partial(); -export type LinksDto = z.infer; - -/** - * ApiResponseDataDtoSchema - * @type { object } - * @property { string } type - * @property { string } id - * @property { object } attributes - * @property { object } relationships - * @property { LinksDto } links - */ -export const ApiResponseDataDtoSchema = z.object({ type: z.string(), id: z.string(), attributes: z.object({}).nullish(), relationships: z.object({}).nullish(), links: LinksDtoSchema.nullish() }); -export type ApiResponseDataDto = z.infer; - -/** - * PaginationLinksDtoSchema - * @type { object } - * @property { string } next - * @property { string } self - * @property { string } last - */ -export const PaginationLinksDtoSchema = z.object({ next: z.string().nullable(), self: z.string().nullable(), last: z.string().nullable() }).partial(); -export type PaginationLinksDto = z.infer; - -/** - * ApiResponseDtoSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - */ -export const ApiResponseDtoSchema = z.object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }); -export type ApiResponseDto = z.infer; - -/** - * DelayNotificationEnumSchema - * @type { enum } - */ -export const DelayNotificationEnumSchema = z.enum(["EveryDelay", "LongerThan24Hours", "LongerThan3Days"]); -export type DelayNotificationEnum = z.infer; -export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; - -/** - * UserEmailPreferencesDtoSchema - * @type { object } - * @property { boolean } originDeparture - * @property { boolean } loadedOnVessel - * @property { boolean } destinationArrival - * @property { boolean } onsiteDelivery - * @property { DelayNotificationEnum } delay - */ -export const UserEmailPreferencesDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }); -export type UserEmailPreferencesDto = z.infer; - -/** - * UserProjectAccessDtoSchema - * @type { object } - * @property { string[] } projectIds - */ -export const UserProjectAccessDtoSchema = z.object({ projectIds: z.array(z.string()) }); -export type UserProjectAccessDto = z.infer; - -/** - * UserRoleEnumSchema - * @type { enum } - */ -export const UserRoleEnumSchema = z.enum(["User", "Admin"]); -export type UserRoleEnum = z.infer; -export const UserRoleEnum = UserRoleEnumSchema.enum; - -/** - * UserDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } name Min Length: `3` - * @property { string } email - * @property { UserEmailPreferencesDto } emailPreferences - * @property { UserProjectAccessDto } projectAccess - * @property { UserRoleEnum } role - * @property { boolean } isAdmin - */ -export const UserDetailDtoSchema = z.object({ id: z.string(), name: z.string().min(3), email: z.email(), emailPreferences: UserEmailPreferencesDtoSchema.nullable(), projectAccess: UserProjectAccessDtoSchema.nullable(), role: UserRoleEnumSchema.nullable(), isAdmin: z.boolean() }); -export type UserDetailDto = z.infer; - -/** - * UserEmailPreferencesUpdateDtoSchema - * @type { object } - * @property { boolean } originDeparture - * @property { boolean } loadedOnVessel - * @property { boolean } destinationArrival - * @property { boolean } onsiteDelivery - * @property { DelayNotificationEnum } delay - */ -export const UserEmailPreferencesUpdateDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }); -export type UserEmailPreferencesUpdateDto = z.infer; - -/** - * UserProjectAccessUpdateDtoSchema - * @type { object } - * @property { number[] } projectIds - */ -export const UserProjectAccessUpdateDtoSchema = z.object({ projectIds: z.array(z.number()) }); -export type UserProjectAccessUpdateDto = z.infer; - -/** - * UserUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } password - * @property { UserEmailPreferencesUpdateDto } emailPreferences - * @property { UserProjectAccessUpdateDto } projectAccess - */ -export const UserUpdateDtoSchema = z.object({ name: z.string(), email: z.email(), password: z.string(), emailPreferences: UserEmailPreferencesUpdateDtoSchema, projectAccess: UserProjectAccessUpdateDtoSchema }); -export type UserUpdateDto = z.infer; - -/** - * UserBasicUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - */ -export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }); -export type UserBasicUpdateDto = z.infer; - -/** - * UserPasswordUpdateDtoSchema - * @type { object } - * @property { string } password - */ -export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }); -export type UserPasswordUpdateDto = z.infer; - -/** - * GetUserProfileResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ -export const GetUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema.nullable() }).partial().nullable() }).partial().shape }); -export type GetUserProfileResponse = z.infer; - -/** - * UpdateUserDataResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ -export const UpdateUserDataResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema.nullable() }).partial().nullable() }).partial().shape }); -export type UpdateUserDataResponse = z.infer; - -/** - * UpdateUserProfileResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ -export const UpdateUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema.nullable() }).partial().nullable() }).partial().shape }); -export type UpdateUserProfileResponse = z.infer; - -} diff --git a/test/generated/base/controlTowerMe/controlTowerMe.queries.ts b/test/generated/base/controlTowerMe/controlTowerMe.queries.ts deleted file mode 100644 index ae8316f..0000000 --- a/test/generated/base/controlTowerMe/controlTowerMe.queries.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerMeModels } from "./controlTowerMe.models"; -import { ControlTowerMeApi } from "./controlTowerMe.api"; - -export namespace ControlTowerMeQueries { -export const moduleName = QueryModule.ControlTowerMe; - -export const keys = { - all: [moduleName] as const, - getUserProfile: () => [...keys.all, "/me", ] as const, -}; - -/** - * Query `useGetUserProfile` - * @description Get basic user profile data - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200] - */ -export const useGetUserProfile = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getUserProfile(), - queryFn: ControlTowerMeApi.getUserProfile, - ...options, - }); -}; - -/** - * Mutation `useUpdateUserData` - * @description Update user data - * @param { ControlTowerMeModels.UserUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateUserData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updateUserData(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateUserProfile` - * @description Update basic user profile data - * @param { ControlTowerMeModels.UserBasicUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateUserProfile = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updateUserProfile(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdatePassword` - * @description Update user password - * @param { ControlTowerMeModels.UserPasswordUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdatePassword = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updatePassword(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateEmailPreferences` - * @description Update user email notification preferences - * @param { ControlTowerMeModels.UserEmailPreferencesUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateEmailPreferences = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updateEmailPreferences(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateProjectAccess` - * @description Update user project access - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateProjectAccess = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: () => - ControlTowerMeApi.updateProjectAccess() -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.api.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.api.ts deleted file mode 100644 index 1a72562..0000000 --- a/test/generated/base/controlTowerPackages/controlTowerPackages.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; - -export namespace ControlTowerPackagesApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, - `/packages`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts deleted file mode 100644 index 17e4ee5..0000000 --- a/test/generated/base/controlTowerPackages/controlTowerPackages.configs.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; -import { ControlTowerPackagesQueries } from "./controlTowerPackages.queries"; - -export namespace ControlTowerPackagesConfigs { -export const packagesConfig = { - meta: { - title: "Packages", - }, - readAll: { - schema: ControlTowerPackagesModels.PackageListItemDtoSchema, - paginated: ControlTowerPackagesQueries.useFindAll, - infinite: ControlTowerPackagesQueries.useFindAllInfinite, - filters: { - schema: ControlTowerPackagesModels.PackageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerPackagesModels.PackageFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ControlTowerPackagesModels.PackageListItemDtoSchema, - options: { - columns: { - packageNumber: true, - bookingId: true, - id: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.models.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.models.ts deleted file mode 100644 index af298ca..0000000 --- a/test/generated/base/controlTowerPackages/controlTowerPackages.models.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerPackagesModels { -/** - * PackageListItemDtoSchema - * @type { object } - * @property { string } packageNumber - * @property { string } bookingId - * @property { string } id - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const PackageListItemDtoSchema = z.object({ packageNumber: z.string(), bookingId: z.string(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); -export type PackageListItemDto = z.infer; - -/** - * PackageFilterDtoSchema - * @type { object } - * @property { string } search Min Length: `1` - */ -export const PackageFilterDtoSchema = z.object({ search: z.string().min(1).nullable() }).partial(); -export type PackageFilterDto = z.infer; - -/** - * ControlTowerPackagesFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ControlTowerPackagesFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); -export type ControlTowerPackagesFindAllOrderParamEnum = z.infer; -export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFindAllOrderParamEnumSchema.enum; - -/** - * ControlTowerPackagesFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PackageListItemDto[] } items - */ -export const ControlTowerPackagesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageListItemDtoSchema).nullable() }).partial().shape }); -export type ControlTowerPackagesFindAllResponse = z.infer; - -} diff --git a/test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts b/test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts deleted file mode 100644 index 006ba2a..0000000 --- a/test/generated/base/controlTowerPackages/controlTowerPackages.queries.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; -import { ControlTowerPackagesApi } from "./controlTowerPackages.api"; - -export namespace ControlTowerPackagesQueries { -export const moduleName = QueryModule.ControlTowerPackages; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string) => [...keys.all, "/packages", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string) => [...keys.all, "/packages", "infinite", limit, order, filter, cursor] as const, -}; - -/** - * Query `useFindAll` - * @description Lists packages - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => - ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @description Lists packages - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/base/controlTowerSearch/controlTowerSearch.api.ts b/test/generated/base/controlTowerSearch/controlTowerSearch.api.ts deleted file mode 100644 index 089524b..0000000 --- a/test/generated/base/controlTowerSearch/controlTowerSearch.api.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerSearchModels } from "./controlTowerSearch.models"; - -export namespace ControlTowerSearchApi { -export const search = (data: ControlTowerSearchModels.SearchRequestDto, type?: ControlTowerSearchModels.SearchItemTypeEnum, limit?: number, ) => { - return AppRestClient.post( - { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, - `/search`, - ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), - { - params: { - type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { type: "query", name: "type" }), - limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), - }, - } - ) -}; -} diff --git a/test/generated/base/controlTowerSearch/controlTowerSearch.models.ts b/test/generated/base/controlTowerSearch/controlTowerSearch.models.ts deleted file mode 100644 index c08141b..0000000 --- a/test/generated/base/controlTowerSearch/controlTowerSearch.models.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerSearchModels { -/** - * SearchItemTypeEnumSchema - * @type { enum } - */ -export const SearchItemTypeEnumSchema = z.enum(["Project", "Booking", "Container"]); -export type SearchItemTypeEnum = z.infer; -export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; - -/** - * SearchItemDtoSchema - * @type { object } - * @property { SearchItemTypeEnum } type - * @property { string } id - * @property { string } label - */ -export const SearchItemDtoSchema = z.object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }); -export type SearchItemDto = z.infer; - -/** - * SearchResponseDtoSchema - * @type { object } - * @property { SearchItemDto[] } items - * @property { number } projectsCount - * @property { number } bookingsCount - * @property { number } containersCount - * @property { number } totalCount - */ -export const SearchResponseDtoSchema = z.object({ items: z.array(SearchItemDtoSchema), projectsCount: z.number(), bookingsCount: z.number(), containersCount: z.number(), totalCount: z.number() }); -export type SearchResponseDto = z.infer; - -/** - * SearchRequestDtoSchema - * @type { object } - * @property { string } search - */ -export const SearchRequestDtoSchema = z.object({ search: z.string() }); -export type SearchRequestDto = z.infer; - -} diff --git a/test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts b/test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts deleted file mode 100644 index 4f95297..0000000 --- a/test/generated/base/controlTowerSearch/controlTowerSearch.queries.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerSearchModels } from "./controlTowerSearch.models"; -import { ControlTowerSearchApi } from "./controlTowerSearch.api"; - -export namespace ControlTowerSearchQueries { -export const moduleName = QueryModule.ControlTowerSearch; - - - -/** - * Mutation `useSearch` - * @param { ControlTowerSearchModels.SearchRequestDto } mutation.data Body parameter - * @param { ControlTowerSearchModels.SearchItemTypeEnum } mutation.type Query parameter - * @param { number } mutation.limit Query parameter. Minimum: `1` - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useSearch = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data, type, limit }) => - ControlTowerSearchApi.search(data, type, limit) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/countries/countries.acl.ts b/test/generated/base/countries/countries.acl.ts deleted file mode 100644 index 0d2de89..0000000 --- a/test/generated/base/countries/countries.acl.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CountriesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Country" -] as AbilityTuple<"Read", "Country">; - -/** - * Use for `usePaginateCountryLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCountryLabels` query - */ -export const canUsePaginateCountryLabels = ( -) => [ - "Read", - "Country" -] as AbilityTuple<"Read", "Country">; - -/** - * Use for `useGetCountryById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCountryById` query - */ -export const canUseGetCountryById = ( -) => [ - "Read", - "Country" -] as AbilityTuple<"Read", "Country">; - -} diff --git a/test/generated/base/countries/countries.api.ts b/test/generated/base/countries/countries.api.ts deleted file mode 100644 index a40357c..0000000 --- a/test/generated/base/countries/countries.api.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CountriesModels } from "./countries.models"; - -export namespace CountriesApi { -export const paginate = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CountriesModels.CountriesPaginateResponseSchema }, - `/countries/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateCountryLabels = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, - `/countries/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getCountryById = (id: string, ) => { - return AppRestClient.get( - { resSchema: CountriesModels.CountryResponseDTOSchema }, - `/countries/${id}`, - - ) -}; -} diff --git a/test/generated/base/countries/countries.configs.ts b/test/generated/base/countries/countries.configs.ts deleted file mode 100644 index 52d1c12..0000000 --- a/test/generated/base/countries/countries.configs.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CountriesModels } from "./countries.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CountriesQueries } from "./countries.queries"; -import { CountriesAcl } from "./countries.acl"; - -export namespace CountriesConfigs { -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CountriesAcl.canUsePaginate, - schema: CountriesModels.CountryResponseDTOSchema, - paginated: CountriesQueries.usePaginate, - infinite: CountriesQueries.usePaginateInfinite, - filters: { - schema: CountriesModels.CountryPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CountriesModels.CountryPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CountriesModels.CountryResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - isoCode2: true, - isoCode3: true, - currencyNotation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CountriesModels.CountriesPaginateOrderParamEnumSchema, - }, -}), - }, -}; - -export const labelsPaginateConfig = { - meta: { - title: "Labels Paginate", - }, - readAll: { - acl: CountriesAcl.canUsePaginateCountryLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CountriesQueries.usePaginateCountryLabels, - infinite: CountriesQueries.usePaginateCountryLabelsInfinite, - filters: { - schema: CountriesModels.CountryPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CountriesModels.CountryPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CountriesModels.PaginateCountryLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/countries/countries.models.ts b/test/generated/base/countries/countries.models.ts deleted file mode 100644 index 70ffc2c..0000000 --- a/test/generated/base/countries/countries.models.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CountriesModels { -/** - * CountryEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type CountryEmployeeDTO = z.infer; - -/** - * CountryResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the country - * @property { string } name Name of the country - * @property { string } isoCode2 ISO 2-letter code - * @property { string } isoCode3 ISO 3-letter code - * @property { string } currencyNotation Currency notation - * @property { string } createdById - * @property { CountryEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CountryEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const CountryResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string(), currencyNotation: z.string(), createdById: z.string().nullish(), createdBy: CountryEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CountryEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type CountryResponseDTO = z.infer; - -/** - * CountryPaginationFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const CountryPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type CountryPaginationFilterDto = z.infer; - -/** - * CountriesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const CountriesPaginateOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type CountriesPaginateOrderParamEnum = z.infer; -export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSchema.enum; - -/** - * CountriesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CountryResponseDTO[] } items - */ -export const CountriesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CountryResponseDTOSchema).nullable() }).partial().shape }); -export type CountriesPaginateResponse = z.infer; - -/** - * PaginateCountryLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateCountryLabelsOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateCountryLabelsOrderParamEnum = z.infer; -export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderParamEnumSchema.enum; - -/** - * PaginateCountryLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateCountryLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PaginateCountryLabelsResponse = z.infer; - -} diff --git a/test/generated/base/countries/countries.queries.ts b/test/generated/base/countries/countries.queries.ts deleted file mode 100644 index e6a56f4..0000000 --- a/test/generated/base/countries/countries.queries.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CountriesAcl } from "./countries.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { CountriesModels } from "./countries.models"; -import { CountriesApi } from "./countries.api"; - -export namespace CountriesQueries { -export const moduleName = QueryModule.Countries; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/paginate", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/paginate", "infinite", limit, order, filter, cursor] as const, - paginateCountryLabels: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/labels/paginate", limit, order, filter, page, cursor] as const, - paginateCountryLabelsInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/labels/paginate", "infinite", limit, order, filter, cursor] as const, - getCountryById: (id: string) => [...keys.all, "/countries/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Countries - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Countries - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateCountryLabels` - * @summary Paginate country labels (id and name only) - * @permission Requires `canUsePaginateCountryLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCountryLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateCountryLabelsInfinite - * @summary Paginate country labels (id and name only) - * @permission Requires `canUsePaginateCountryLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCountryLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetCountryById` - * @summary Get country by ID with complete details - * @permission Requires `canUseGetCountryById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCountryById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCountryById(id), - queryFn: () => { - checkAcl(CountriesAcl.canUseGetCountryById()); - return CountriesApi.getCountryById(id) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/currencies/currencies.acl.ts b/test/generated/base/currencies/currencies.acl.ts deleted file mode 100644 index ff528da..0000000 --- a/test/generated/base/currencies/currencies.acl.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CurrenciesAcl { -/** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -/** - * Use for `useCreateCurrency` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCurrency` mutation - */ -export const canUseCreateCurrency = ( -) => [ - "Create", - "Currency" -] as AbilityTuple<"Create", "Currency">; - -/** - * Use for `usePaginateCurrencyLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabels` query - */ -export const canUsePaginateCurrencyLabels = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -/** - * Use for `useGetCurrencyById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCurrencyById` query - */ -export const canUseGetCurrencyById = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -/** - * Use for `useUpdateCurrency` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCurrency` mutation - */ -export const canUseUpdateCurrency = ( -) => [ - "Update", - "Currency" -] as AbilityTuple<"Update", "Currency">; - -/** - * Use for `usePaginateCurrencyLabelsByOffice` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabelsByOffice` query - */ -export const canUsePaginateCurrencyLabelsByOffice = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -} diff --git a/test/generated/base/currencies/currencies.api.ts b/test/generated/base/currencies/currencies.api.ts deleted file mode 100644 index f989e32..0000000 --- a/test/generated/base/currencies/currencies.api.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CurrenciesModels } from "./currencies.models"; - -export namespace CurrenciesApi { -export const list = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.CurrenciesListResponseSchema }, - `/currencies`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, ) => { - return AppRestClient.post( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies`, - ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), - - ) -}; -export const paginateCurrencyLabels = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, - `/currencies/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getCurrencyById = (isoCode: string, ) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies/${isoCode}`, - - ) -}; -export const updateCurrency = (isoCode: string, data: CurrenciesModels.UpdateCurrencyRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies/${isoCode}`, - ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), - - ) -}; -export const paginateCurrencyLabelsByOffice = (officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, - `/offices/${officeId}/currencies/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/base/currencies/currencies.configs.ts b/test/generated/base/currencies/currencies.configs.ts deleted file mode 100644 index 6d36fb1..0000000 --- a/test/generated/base/currencies/currencies.configs.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CurrenciesModels } from "./currencies.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CurrenciesQueries } from "./currencies.queries"; -import { CurrenciesAcl } from "./currencies.acl"; - -export namespace CurrenciesConfigs { -export const currenciesConfig = { - meta: { - title: "Currencies", - }, - readAll: { - acl: CurrenciesAcl.canUseList, - schema: CurrenciesModels.CurrencyResponseDtoSchema, - paginated: CurrenciesQueries.useList, - infinite: CurrenciesQueries.useListInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CurrenciesModels.CurrencyResponseDtoSchema, - options: { - columns: { - isoCode: true, - name: true, - symbol: true, - alignment: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CurrenciesModels.CurrenciesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CurrenciesAcl.canUseGetCurrencyById, - schema: CurrenciesModels.CurrencyResponseDtoSchema, - query: CurrenciesQueries.useGetCurrencyById, - }, - create: { - acl: CurrenciesAcl.canUseCreateCurrency, - schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, - mutation: CurrenciesQueries.useCreateCurrency, - inputDefs: dynamicInputs({ - schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, - options: { - inputs: { - isoCode: true, - name: true, - symbol: true, - alignment: true, - }, - }, -}) - }, - update: { - acl: CurrenciesAcl.canUseUpdateCurrency, - schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, - mutation: CurrenciesQueries.useUpdateCurrency, - inputDefs: dynamicInputs({ - schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CurrenciesAcl.canUsePaginateCurrencyLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CurrenciesQueries.usePaginateCurrencyLabels, - infinite: CurrenciesQueries.usePaginateCurrencyLabelsInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -export const labelsPaginateConfig = { - meta: { - title: "Labels Paginate", - }, - readAll: { - acl: CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CurrenciesQueries.usePaginateCurrencyLabelsByOffice, - infinite: CurrenciesQueries.usePaginateCurrencyLabelsByOfficeInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/currencies/currencies.models.ts b/test/generated/base/currencies/currencies.models.ts deleted file mode 100644 index 1124eaf..0000000 --- a/test/generated/base/currencies/currencies.models.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CurrenciesModels { -/** - * CurrencyEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type CurrencyEmployeeDTO = z.infer; - -/** - * CurrencyResponseDtoSchema - * @type { object } - * @property { string } isoCode isoCode of the currency - * @property { string } name Name of the currency - * @property { string } symbol Symbol of the currency - * @property { string } alignment Alignment of the currency - * @property { string } createdById ID of the employee who created this currency - * @property { CurrencyEmployeeDTO } createdBy Employee who created this currency - * @property { string } createdAt Date when the currency was created - * @property { string } updatedById ID of the employee who last updated this currency - * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency - * @property { string } updatedAt Date when the currency was last updated - */ -export const CurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string(), symbol: z.string().nullish(), alignment: z.string().nullish(), createdById: z.string().nullish(), createdBy: CurrencyEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CurrencyEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type CurrencyResponseDto = z.infer; - -/** - * CurrencyPaginationFilterDtoSchema - * @type { object } - * @property { string } officeId - * @property { string } search - */ -export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string().nullable(), search: z.string().nullable() }).partial(); -export type CurrencyPaginationFilterDto = z.infer; - -/** - * CreateCurrencyRequestDTOSchema - * @type { object } - * @property { string } isoCode Unique identifier for the currency - * @property { string } name Name of the currency - * @property { string } symbol Symbol of the currency - * @property { string } alignment Alignment of the currency - */ -export const CreateCurrencyRequestDTOSchema = z.object({ isoCode: z.string(), name: z.string(), symbol: z.string(), alignment: z.string() }); -export type CreateCurrencyRequestDTO = z.infer; - -/** - * UpdateCurrencyRequestDTOSchema - * @type { object } - * @property { string } name Name of the currency - */ -export const UpdateCurrencyRequestDTOSchema = z.object({ name: z.string().nullable() }).partial(); -export type UpdateCurrencyRequestDTO = z.infer; - -/** - * CurrenciesListOrderParamEnumSchema - * @type { enum } - */ -export const CurrenciesListOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type CurrenciesListOrderParamEnum = z.infer; -export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.enum; - -/** - * CurrenciesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CurrencyResponseDto[] } items - */ -export const CurrenciesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CurrencyResponseDtoSchema).nullable() }).partial().shape }); -export type CurrenciesListResponse = z.infer; - -/** - * PaginateCurrencyLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateCurrencyLabelsOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateCurrencyLabelsOrderParamEnum = z.infer; -export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderParamEnumSchema.enum; - -/** - * PaginateCurrencyLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateCurrencyLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PaginateCurrencyLabelsResponse = z.infer; - -/** - * PaginateCurrencyLabelsByOfficeOrderParamEnumSchema - * @type { enum } - */ -export const PaginateCurrencyLabelsByOfficeOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateCurrencyLabelsByOfficeOrderParamEnum = z.infer; -export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabelsByOfficeOrderParamEnumSchema.enum; - -/** - * PaginateCurrencyLabelsByOfficeResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PaginateCurrencyLabelsByOfficeResponse = z.infer; - -} diff --git a/test/generated/base/currencies/currencies.queries.ts b/test/generated/base/currencies/currencies.queries.ts deleted file mode 100644 index 0758b4a..0000000 --- a/test/generated/base/currencies/currencies.queries.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CurrenciesAcl } from "./currencies.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CurrenciesModels } from "./currencies.models"; -import { CurrenciesApi } from "./currencies.api"; - -export namespace CurrenciesQueries { -export const moduleName = QueryModule.Currencies; - -export const keys = { - all: [moduleName] as const, - list: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies", "infinite", limit, order, filter, cursor] as const, - paginateCurrencyLabels: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies/labels/paginate", limit, order, filter, page, cursor] as const, - paginateCurrencyLabelsInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies/labels/paginate", "infinite", limit, order, filter, cursor] as const, - getCurrencyById: (isoCode: string) => [...keys.all, "/currencies/:isoCode", isoCode] as const, - paginateCurrencyLabelsByOffice: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", officeId, limit, order, filter, page, cursor] as const, - paginateCurrencyLabelsByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useList` - * @summary List Currencies - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List Currencies - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateCurrency` - * @summary Create Currency - * @permission Requires `canUseCreateCurrency` ability - * @param { CurrenciesModels.CreateCurrencyRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateCurrency = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CurrenciesAcl.canUseCreateCurrency()); - return CurrenciesApi.createCurrency(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateCurrencyLabels` - * @summary Paginate Currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateCurrencyLabelsInfinite - * @summary Paginate Currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetCurrencyById` - * @summary Get Currency by iso code - * @permission Requires `canUseGetCurrencyById` ability - * @param { string } object.isoCode Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCurrencyById = ({ isoCode }: { isoCode: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCurrencyById(isoCode), - queryFn: () => { - checkAcl(CurrenciesAcl.canUseGetCurrencyById()); - return CurrenciesApi.getCurrencyById(isoCode) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCurrency` - * @summary Update Currency - * @permission Requires `canUseUpdateCurrency` ability - * @param { string } mutation.isoCode Path parameter - * @param { CurrenciesModels.UpdateCurrencyRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCurrency = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ isoCode, data }) => { - checkAcl(CurrenciesAcl.canUseUpdateCurrency()); - return CurrenciesApi.updateCurrency(isoCode, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { isoCode } = variables; - const updateKeys = [keys.getCurrencyById(isoCode)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateCurrencyLabelsByOffice` - * @summary Paginate office currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabelsByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateCurrencyLabelsByOfficeInfinite - * @summary Paginate office currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabelsByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/base/customerAccount/customerAccount.api.ts b/test/generated/base/customerAccount/customerAccount.api.ts deleted file mode 100644 index 6f77176..0000000 --- a/test/generated/base/customerAccount/customerAccount.api.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { CustomerAccountModels } from "./customerAccount.models"; - -export namespace CustomerAccountApi { -export const get = () => { - return AppRestClient.get( - { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, - `/customers/account`, - - ) -}; -} diff --git a/test/generated/base/customerAccount/customerAccount.models.ts b/test/generated/base/customerAccount/customerAccount.models.ts deleted file mode 100644 index 2656a0e..0000000 --- a/test/generated/base/customerAccount/customerAccount.models.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { z } from "zod"; - -export namespace CustomerAccountModels { -/** - * CustomerCompanyDtoSchema - * @type { object } - * @property { string } id Company ID - * @property { string } name Company name - */ -export const CustomerCompanyDtoSchema = z.object({ id: z.string(), name: z.string().nullish() }); -export type CustomerCompanyDto = z.infer; - -/** - * CustomerBusinessPartnerDtoSchema - * @type { object } - * @property { string } id Company ID - * @property { string } name Company name - */ -export const CustomerBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type CustomerBusinessPartnerDto = z.infer; - -/** - * CustomerAccountDtoSchema - * @type { object } - * @property { array[] } aclRules Can hold any type of value - * @property { string } id Customer ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { CustomerCompanyDto } company Company - * @property { CustomerBusinessPartnerDto } businessPartner - */ -export const CustomerAccountDtoSchema = z.object({ aclRules: z.array(z.array(z.any())), id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), phone: z.string().nullish(), company: CustomerCompanyDtoSchema.nullish(), businessPartner: CustomerBusinessPartnerDtoSchema.nullish() }); -export type CustomerAccountDto = z.infer; - -} diff --git a/test/generated/base/customerAccount/customerAccount.queries.ts b/test/generated/base/customerAccount/customerAccount.queries.ts deleted file mode 100644 index daf37c4..0000000 --- a/test/generated/base/customerAccount/customerAccount.queries.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { CustomerAccountApi } from "./customerAccount.api"; - -export namespace CustomerAccountQueries { -export const moduleName = QueryModule.CustomerAccount; - -export const keys = { - all: [moduleName] as const, - get: () => [...keys.all, "/customers/account", ] as const, -}; - -/** - * Query `useGet` - * @summary Get profile of logged-in user - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.get(), - queryFn: CustomerAccountApi.get, - ...options, - }); -}; - -} diff --git a/test/generated/base/customers/customers.acl.ts b/test/generated/base/customers/customers.acl.ts deleted file mode 100644 index bb972e0..0000000 --- a/test/generated/base/customers/customers.acl.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CustomersAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Customer" -] as AbilityTuple<"Create", "Customer">; - -/** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( -) => [ - "Read", - "Customer" -] as AbilityTuple<"Read", "Customer">; - -/** - * Use for `useFindById` query ability. - * @description Read a customer with id - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Customer" -] as AbilityTuple<"Read", "Customer">; - -/** - * Use for `useUpdate` mutation ability. - * @description Update Customer - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Customer" -] as AbilityTuple<"Update", "Customer">; - -/** - * Use for `useDeactivate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeactivate` mutation - */ -export const canUseDeactivate = ( -) => [ - "Deactivate", - "Customer" -] as AbilityTuple<"Deactivate", "Customer">; - -/** - * Use for `useReactivate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReactivate` mutation - */ -export const canUseReactivate = ( -) => [ - "Reactivate", - "Customer" -] as AbilityTuple<"Reactivate", "Customer">; - -} diff --git a/test/generated/base/customers/customers.api.ts b/test/generated/base/customers/customers.api.ts deleted file mode 100644 index e418796..0000000 --- a/test/generated/base/customers/customers.api.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CustomersModels } from "./customers.models"; - -export namespace CustomersApi { -export const findProfile = () => { - return AppRestClient.get( - { resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, - `/customers/me`, - - ) -}; -export const create = (data: CustomersModels.CreateCustomerDTO, ) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers`, - ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), - - ) -}; -export const list = (limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CustomersModels.CustomersListResponseSchema }, - `/customers`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (customerId: string, ) => { - return AppRestClient.get( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${customerId}`, - - ) -}; -export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, ) => { - return AppRestClient.put( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${customerId}`, - ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), - - ) -}; -export const deactivate = (id: string, ) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${id}/deactivate`, - - ) -}; -export const reactivate = (id: string, ) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${id}/reactivate`, - - ) -}; -} diff --git a/test/generated/base/customers/customers.configs.ts b/test/generated/base/customers/customers.configs.ts deleted file mode 100644 index 95eec1d..0000000 --- a/test/generated/base/customers/customers.configs.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CustomersModels } from "./customers.models"; -import { CustomersQueries } from "./customers.queries"; -import { CustomersAcl } from "./customers.acl"; - -export namespace CustomersConfigs { -export const customersConfig = { - meta: { - title: "Customers", - }, - readAll: { - acl: CustomersAcl.canUseList, - schema: CustomersModels.CustomerListItemDTOSchema, - paginated: CustomersQueries.useList, - infinite: CustomersQueries.useListInfinite, - filters: { - schema: CustomersModels.CustomerPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CustomersModels.CustomerPaginationFilterDtoSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - companyId: true, - businessPartnerId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CustomersModels.CustomerListItemDTOSchema, - options: { - columns: { - id: true, - firstName: true, - lastName: true, - email: true, - phone: true, - companyId: true, - businessPartnerId: true, - businessPartner: true, - }, - sortable: CustomersModels.CustomersListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CustomersAcl.canUseFindById, - schema: CustomersModels.CustomerResponseDTOSchema, - query: CustomersQueries.useFindById, - }, - create: { - acl: CustomersAcl.canUseCreate, - schema: CustomersModels.CreateCustomerDTOSchema, - mutation: CustomersQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CustomersModels.CreateCustomerDTOSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - phone: true, - companyId: true, - businessPartnerId: true, - }, - }, -}) - }, - update: { - acl: CustomersAcl.canUseUpdate, - schema: CustomersModels.UpdateCustomerDTOSchema, - mutation: CustomersQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CustomersModels.UpdateCustomerDTOSchema, - options: { - inputs: { - firstName: true, - lastName: true, - phone: true, - companyId: true, - businessPartnerId: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/base/customers/customers.models.ts b/test/generated/base/customers/customers.models.ts deleted file mode 100644 index bf5e842..0000000 --- a/test/generated/base/customers/customers.models.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CustomersModels { -/** - * CustomerProfileBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type CustomerProfileBusinessPartnerDto = z.infer; - -/** - * CustomerProfileResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - * @property { CustomerProfileBusinessPartnerDto } businessPartner - */ -export const CustomerProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish(), businessPartner: CustomerProfileBusinessPartnerDtoSchema.nullish() }); -export type CustomerProfileResponseDTO = z.infer; - -/** - * CustomerBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CustomerBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type CustomerBusinessPartnerResponseDto = z.infer; - -/** - * CustomerResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company Id of the customer - * @property { string } businessPartnerId Business partner Id of the customer - * @property { boolean } archived Wether the customer is archived - * @property { CustomerBusinessPartnerResponseDto } businessPartner - */ -export const CustomerResponseDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish(), archived: z.boolean(), businessPartner: CustomerBusinessPartnerResponseDtoSchema.nullish() }); -export type CustomerResponseDTO = z.infer; - -/** - * CustomerListItemBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type CustomerListItemBusinessPartnerDto = z.infer; - -/** - * CustomerListItemDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - * @property { CustomerListItemBusinessPartnerDto } businessPartner - */ -export const CustomerListItemDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.string(), phone: z.string(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish(), businessPartner: CustomerListItemBusinessPartnerDtoSchema.nullish() }); -export type CustomerListItemDTO = z.infer; - -/** - * CreateCustomerDTOSchema - * @type { object } - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - */ -export const CreateCustomerDTOSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string().nullish(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish() }); -export type CreateCustomerDTO = z.infer; - -/** - * CustomerPaginationFilterDtoSchema - * @type { object } - * @property { string } firstName - * @property { string } lastName - * @property { string } email - * @property { string } companyId - * @property { string } businessPartnerId - * @property { string } search - */ -export const CustomerPaginationFilterDtoSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), companyId: z.string().nullable(), businessPartnerId: z.string().nullable(), search: z.string().nullable() }).partial(); -export type CustomerPaginationFilterDto = z.infer; - -/** - * UpdateCustomerDTOSchema - * @type { object } - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - */ -export const UpdateCustomerDTOSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), phone: z.string().nullable(), companyId: z.string().nullable(), businessPartnerId: z.string().nullable() }).partial(); -export type UpdateCustomerDTO = z.infer; - -/** - * CustomersListOrderParamEnumSchema - * @type { enum } - */ -export const CustomersListOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "createdAt"]); -export type CustomersListOrderParamEnum = z.infer; -export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enum; - -/** - * CustomersListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CustomerListItemDTO[] } items - */ -export const CustomersListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CustomerListItemDTOSchema).nullable() }).partial().shape }); -export type CustomersListResponse = z.infer; - -} diff --git a/test/generated/base/customers/customers.queries.ts b/test/generated/base/customers/customers.queries.ts deleted file mode 100644 index e187d61..0000000 --- a/test/generated/base/customers/customers.queries.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CustomersAcl } from "./customers.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CustomersModels } from "./customers.models"; -import { CustomersApi } from "./customers.api"; - -export namespace CustomersQueries { -export const moduleName = QueryModule.Customers; - -export const keys = { - all: [moduleName] as const, - findProfile: () => [...keys.all, "/customers/me", ] as const, - list: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/customers", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string) => [...keys.all, "/customers", "infinite", limit, order, filter, cursor] as const, - findById: (customerId: string) => [...keys.all, "/customers/:customerId", customerId] as const, -}; - -/** - * Query `useFindProfile` - * @summary Get customer by id - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfile = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findProfile(), - queryFn: CustomersApi.findProfile, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create new customer - * @permission Requires `canUseCreate` ability - * @param { CustomersModels.CreateCustomerDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CustomersAcl.canUseCreate()); - return CustomersApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useList` - * @summary List customers - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` - * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List customers - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` - * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get customer by id - * @permission Requires `canUseFindById` ability - * @param { string } object.customerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ customerId }: { customerId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(customerId), - queryFn: () => { - checkAcl(CustomersAcl.canUseFindById()); - return CustomersApi.findById(customerId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update customer - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.customerId Path parameter - * @param { CustomersModels.UpdateCustomerDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ customerId, data }) => { - checkAcl(CustomersAcl.canUseUpdate()); - return CustomersApi.update(customerId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { customerId } = variables; - const updateKeys = [keys.findById(customerId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeactivate` - * @summary Deactivate customer - * @permission Requires `canUseDeactivate` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeactivate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CustomersAcl.canUseDeactivate()); - return CustomersApi.deactivate(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReactivate` - * @summary Reactivate customer - * @permission Requires `canUseReactivate` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReactivate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CustomersAcl.canUseReactivate()); - return CustomersApi.reactivate(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/depots/depots.acl.ts b/test/generated/base/depots/depots.acl.ts deleted file mode 100644 index 46e2374..0000000 --- a/test/generated/base/depots/depots.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace DepotsAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Depot" -] as AbilityTuple<"Create", "Depot">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Depot" -] as AbilityTuple<"Update", "Depot">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Depot" -] as AbilityTuple<"Archive", "Depot">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "Depot" -] as AbilityTuple<"Archive", "Depot">; - -} diff --git a/test/generated/base/depots/depots.api.ts b/test/generated/base/depots/depots.api.ts deleted file mode 100644 index 5b6a5b3..0000000 --- a/test/generated/base/depots/depots.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DepotsModels } from "./depots.models"; - -export namespace DepotsApi { -export const create = (data: DepotsModels.CreateDepotRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots`, - ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), - - ) -}; -export const paginate = (limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DepotsModels.DepotsPaginateResponseSchema }, - `/depots`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, - `/depots/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots/${id}`, - - ) -}; -export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, ) => { - return AppRestClient.put( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots/${id}`, - ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/depots/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/depots/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/depots/depots.configs.ts b/test/generated/base/depots/depots.configs.ts deleted file mode 100644 index 3e95aff..0000000 --- a/test/generated/base/depots/depots.configs.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DepotsModels } from "./depots.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DepotsQueries } from "./depots.queries"; -import { DepotsAcl } from "./depots.acl"; - -export namespace DepotsConfigs { -export const depotsConfig = { - meta: { - title: "Depots", - }, - readAll: { - acl: DepotsAcl.canUsePaginate, - schema: DepotsModels.DepotResponseDTOSchema, - paginated: DepotsQueries.usePaginate, - infinite: DepotsQueries.usePaginateInfinite, - filters: { - schema: DepotsModels.DepotPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DepotsModels.DepotPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DepotsModels.DepotResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - name: true, - shortName: true, - additionalInformation: true, - address: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: DepotsModels.DepotsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DepotsAcl.canUseFindById, - schema: DepotsModels.DepotResponseDTOSchema, - query: DepotsQueries.useFindById, - }, - create: { - acl: DepotsAcl.canUseCreate, - schema: DepotsModels.CreateDepotRequestDTOSchema, - mutation: DepotsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DepotsModels.CreateDepotRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - additionalInformation: true, - name: true, - street: true, - zip: true, - district: true, - cityId: true, - countryId: true, - }, - }, -}) - }, - update: { - acl: DepotsAcl.canUseUpdate, - schema: DepotsModels.UpdateDepotRequestDTOSchema, - mutation: DepotsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DepotsModels.UpdateDepotRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - additionalInformation: true, - name: true, - street: true, - zip: true, - district: true, - cityId: true, - countryId: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DepotsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DepotsQueries.usePaginateLabels, - infinite: DepotsQueries.usePaginateLabelsInfinite, - filters: { - schema: DepotsModels.DepotLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DepotsModels.DepotLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/depots/depots.models.ts b/test/generated/base/depots/depots.models.ts deleted file mode 100644 index a7395cb..0000000 --- a/test/generated/base/depots/depots.models.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DepotsModels { -/** - * DepotCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type DepotCityDto = z.infer; - -/** - * DepotCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const DepotCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type DepotCountryDto = z.infer; - -/** - * AddressDTOSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { DepotCityDto } city - * @property { string } district District name - * @property { DepotCountryDto } country - */ -export const AddressDTOSchema = z.object({ street: z.string(), zip: z.string(), city: DepotCityDtoSchema.nullish(), district: z.string().nullish(), country: DepotCountryDtoSchema.nullish() }); -export type AddressDTO = z.infer; - -/** - * DepotEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type DepotEmployeeDTO = z.infer; - -/** - * DepotResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the depot - * @property { string } matchCode Match code for the depot - * @property { string } name Name of the depot - * @property { string } shortName Short name of the depot - * @property { string } additionalInformation Additional info of the depot - * @property { AddressDTO } address Address details of the depot - * @property { boolean } archived - * @property { string } createdById - * @property { DepotEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DepotEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const DepotResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), address: AddressDTOSchema, archived: z.boolean(), createdById: z.string().nullish(), createdBy: DepotEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DepotEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type DepotResponseDTO = z.infer; - -/** - * CreateDepotRequestDTOSchema - * @type { object } - * @property { string } matchCode Unique identifier code for the depot - * @property { string } shortName Optional short name for the depot - * @property { string } additionalInformation - * @property { string } name Full name of the depot - * @property { string } street Street address of the depot - * @property { string } zip ZIP/Postal code - * @property { string } district District information - * @property { string } cityId City id - * @property { string } countryId Country code - */ -export const CreateDepotRequestDTOSchema = z.object({ matchCode: z.string(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), name: z.string(), street: z.string(), zip: z.string(), district: z.string().nullish(), cityId: z.string(), countryId: z.string() }); -export type CreateDepotRequestDTO = z.infer; - -/** - * DepotPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter depots by name, matchCode, or shortName - * @property { boolean } archived - */ -export const DepotPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type DepotPaginationFilterDto = z.infer; - -/** - * DepotLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DepotLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type DepotLabelFilterDto = z.infer; - -/** - * UpdateDepotRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code for the depot - * @property { string } shortName Updated short name - * @property { string } additionalInformation Updated short name - * @property { string } name Updated full name - * @property { string } street Updated street address - * @property { string } zip Updated ZIP/Postal code - * @property { string } district Updated district information - * @property { string } cityId Updated city id - * @property { string } countryId Updated country code - */ -export const UpdateDepotRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), additionalInformation: z.string().nullable(), name: z.string().nullable(), street: z.string().nullable(), zip: z.string().nullable(), district: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable() }).partial(); -export type UpdateDepotRequestDTO = z.infer; - -/** - * DepotsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const DepotsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DepotsPaginateOrderParamEnum = z.infer; -export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.enum; - -/** - * DepotsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DepotResponseDTO[] } items - */ -export const DepotsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DepotResponseDTOSchema).nullable() }).partial().shape }); -export type DepotsPaginateResponse = z.infer; - -/** - * DepotsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DepotsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DepotsPaginateLabelsOrderParamEnum = z.infer; -export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DepotsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DepotsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type DepotsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/depots/depots.queries.ts b/test/generated/base/depots/depots.queries.ts deleted file mode 100644 index 49c639f..0000000 --- a/test/generated/base/depots/depots.queries.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DepotsAcl } from "./depots.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DepotsModels } from "./depots.models"; -import { DepotsApi } from "./depots.api"; - -export namespace DepotsQueries { -export const moduleName = QueryModule.Depots; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string) => [...keys.all, "/depots", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string) => [...keys.all, "/depots/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/depots/:id", id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a new depot - * @permission Requires `canUseCreate` ability - * @param { DepotsModels.CreateDepotRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(DepotsAcl.canUseCreate()); - return DepotsApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Depots - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Depots - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate depots with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate depots with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Fetch depot by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(DepotsAcl.canUseFindById()); - return DepotsApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update a depot - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { DepotsModels.UpdateDepotRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(DepotsAcl.canUseUpdate()); - return DepotsApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a depot - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(DepotsAcl.canUseArchive()); - return DepotsApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a depot - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(DepotsAcl.canUseUnarchive()); - return DepotsApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/documentTemplates/documentTemplates.acl.ts b/test/generated/base/documentTemplates/documentTemplates.acl.ts deleted file mode 100644 index 8996246..0000000 --- a/test/generated/base/documentTemplates/documentTemplates.acl.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DocumentTemplatesAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List document template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List document templates - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Create", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get document template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update document template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useAddRemarkBlock` mutation ability. For global ability, omit the object parameter. - * @description Add remark block to document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddRemarkBlock` mutation - */ -export const canUseAddRemarkBlock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useDeleteRemarkBlock` mutation ability. For global ability, omit the object parameter. - * @description Delete remark block from document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemarkBlock` mutation - */ -export const canUseDeleteRemarkBlock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Archive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -} diff --git a/test/generated/base/documentTemplates/documentTemplates.api.ts b/test/generated/base/documentTemplates/documentTemplates.api.ts deleted file mode 100644 index 6b9a31a..0000000 --- a/test/generated/base/documentTemplates/documentTemplates.api.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; - -export namespace DocumentTemplatesApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/document-templates/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, - `/offices/${officeId}/document-templates`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates`, - ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), - - ) -}; -export const findById = (documentTemplateId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}`, - - ) -}; -export const update = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}`, - ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), - - ) -}; -export const addRemarkBlock = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, - ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), - - ) -}; -export const deleteRemarkBlock = (documentTemplateId: string, remarkBlockId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, - - ) -}; -export const archive = (documentTemplateId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, - - ) -}; -export const unarchive = (documentTemplateId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/documentTemplates/documentTemplates.configs.ts b/test/generated/base/documentTemplates/documentTemplates.configs.ts deleted file mode 100644 index bb792f1..0000000 --- a/test/generated/base/documentTemplates/documentTemplates.configs.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DocumentTemplatesQueries } from "./documentTemplates.queries"; -import { DocumentTemplatesAcl } from "./documentTemplates.acl"; - -export namespace DocumentTemplatesConfigs { -export const documentTemplatesConfig = { - meta: { - title: "Document Templates", - }, - readAll: { - acl: DocumentTemplatesAcl.canUseList, - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - paginated: DocumentTemplatesQueries.useList, - infinite: DocumentTemplatesQueries.useListInfinite, - filters: { - schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, - options: { - inputs: { - isArchived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - isArchived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - blocks: true, - }, - sortable: DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DocumentTemplatesAcl.canUseFindById, - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - query: DocumentTemplatesQueries.useFindById, - }, - create: { - acl: DocumentTemplatesAcl.canUseCreate, - schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, - mutation: DocumentTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - blocks: true, - }, - }, -}) - }, - update: { - acl: DocumentTemplatesAcl.canUseUpdate, - schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, - mutation: DocumentTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - isArchived: true, - blocks: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DocumentTemplatesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DocumentTemplatesQueries.usePaginateLabels, - infinite: DocumentTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/documentTemplates/documentTemplates.models.ts b/test/generated/base/documentTemplates/documentTemplates.models.ts deleted file mode 100644 index 5747c5c..0000000 --- a/test/generated/base/documentTemplates/documentTemplates.models.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DocumentTemplatesModels { -/** - * DocumentTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type DocumentTemplateEmployeeDTO = z.infer; - -/** - * DocumentTemplateResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name - * @property { boolean } isArchived - * @property { string } createdById ID of the employee who created this template - * @property { DocumentTemplateEmployeeDTO } createdBy Employee who created this template - * @property { string } createdAt - * @property { string } updatedById ID of the employee who last updated this template - * @property { DocumentTemplateEmployeeDTO } updatedBy Employee who last updated this template - * @property { string } updatedAt - * @property { CommonModels.TemplateBlocksResponseDTO } blocks - */ -export const DocumentTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isArchived: z.boolean(), createdById: z.string().nullish(), createdBy: DocumentTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DocumentTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), blocks: CommonModels.TemplateBlocksResponseDTOSchema }); -export type DocumentTemplateResponseDTO = z.infer; - -/** - * TemplateBlocksDTOSchema - * @type { object } - * @property { CommonModels.TitleBlockDTO } titleBlock - * @property { CommonModels.ReceiverBlockDTO } receiverBlock - * @property { CommonModels.OurInformationBlockDTO } ourInformationBlock - * @property { CommonModels.RouteTableBlockDTO } routeTableBlock - * @property { CommonModels.CargoTableBlockDTO } cargoTableBlock - * @property { CommonModels.CargoSummaryBlockDTO } cargoSummaryBlock - * @property { CommonModels.FinanceTableBlockDTO } financeTableBlock - * @property { CommonModels.RemarkBlockDTO[] } remarkBlocks - * @property { CommonModels.FooterBlockDTO } footerBlock - * @property { CommonModels.TermsBlockDTO } termsBlock - * @property { CommonModels.CutOffDatesBlockDTO } cutOffDatesBlock - */ -export const TemplateBlocksDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema.nullable(), receiverBlock: CommonModels.ReceiverBlockDTOSchema.nullable(), ourInformationBlock: CommonModels.OurInformationBlockDTOSchema.nullable(), routeTableBlock: CommonModels.RouteTableBlockDTOSchema.nullable(), cargoTableBlock: CommonModels.CargoTableBlockDTOSchema.nullable(), cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema.nullable(), financeTableBlock: CommonModels.FinanceTableBlockDTOSchema.nullable(), remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).nullable(), footerBlock: CommonModels.FooterBlockDTOSchema.nullable(), termsBlock: CommonModels.TermsBlockDTOSchema.nullable(), cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema.nullable() }).partial(); -export type TemplateBlocksDTO = z.infer; - -/** - * CreateDocumentTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { TemplateBlocksDTO } blocks - */ -export const CreateDocumentTemplateRequestDTOSchema = z.object({ name: z.string(), blocks: TemplateBlocksDTOSchema.nullish() }); -export type CreateDocumentTemplateRequestDTO = z.infer; - -/** - * UpdateDocumentTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { boolean } isArchived - * @property { TemplateBlocksDTO } blocks - */ -export const UpdateDocumentTemplateRequestDTOSchema = z.object({ name: z.string().nullable(), isArchived: z.boolean().nullable(), blocks: TemplateBlocksDTOSchema.nullable() }).partial(); -export type UpdateDocumentTemplateRequestDTO = z.infer; - -/** - * CreateRemarkBlockRequestDTOSchema - * @type { object } - * @property { CommonModels.EditorContentUpdateDto } content - * @property { number } position 1-based position of the remark block. Minimum: `1` - * @property { boolean } enabled - */ -export const CreateRemarkBlockRequestDTOSchema = z.object({ content: CommonModels.EditorContentUpdateDtoSchema, position: z.number().gte(1).nullish(), enabled: z.boolean().nullish() }); -export type CreateRemarkBlockRequestDTO = z.infer; - -/** - * DocumentTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DocumentTemplateLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type DocumentTemplateLabelFilterDto = z.infer; - -/** - * DocumentTemplateFilterDtoSchema - * @type { object } - * @property { boolean } isArchived - * @property { string } search - */ -export const DocumentTemplateFilterDtoSchema = z.object({ isArchived: z.boolean().nullable(), search: z.string().nullable() }).partial(); -export type DocumentTemplateFilterDto = z.infer; - -/** - * DocumentTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DocumentTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DocumentTemplatesPaginateLabelsOrderParamEnum = z.infer; -export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DocumentTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type DocumentTemplatesPaginateLabelsResponse = z.infer; - -/** - * DocumentTemplatesListOrderParamEnumSchema - * @type { enum } - */ -export const DocumentTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DocumentTemplatesListOrderParamEnum = z.infer; -export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderParamEnumSchema.enum; - -/** - * DocumentTemplatesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DocumentTemplateResponseDTO[] } items - */ -export const DocumentTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).nullable() }).partial().shape }); -export type DocumentTemplatesListResponse = z.infer; - -} diff --git a/test/generated/base/documentTemplates/documentTemplates.queries.ts b/test/generated/base/documentTemplates/documentTemplates.queries.ts deleted file mode 100644 index 1a3f849..0000000 --- a/test/generated/base/documentTemplates/documentTemplates.queries.ts +++ /dev/null @@ -1,333 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DocumentTemplatesAcl } from "./documentTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; -import { DocumentTemplatesApi } from "./documentTemplates.api"; - -export namespace DocumentTemplatesQueries { -export const moduleName = QueryModule.DocumentTemplates; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (documentTemplateId: string, officeId: string) => [...keys.all, "/offices/:officeId/document-templates/:documentTemplateId", documentTemplateId, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate document template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate document template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List document templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); - return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List document templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); - return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new document template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId } )); - return DocumentTemplatesApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get document template by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.documentTemplateId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ documentTemplateId, officeId }: { documentTemplateId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(documentTemplateId, officeId), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId } )); - return DocumentTemplatesApi.findById(documentTemplateId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update document template by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId } )); - return DocumentTemplatesApi.update(documentTemplateId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useAddRemarkBlock` - * @summary Add a remark block to a document template - * @permission Requires `canUseAddRemarkBlock` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.CreateRemarkBlockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useAddRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId } )); - return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRemarkBlock` - * @summary Delete a remark block from a document template - * @permission Requires `canUseDeleteRemarkBlock` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.remarkBlockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId } )); - return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive document template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId } )); - return DocumentTemplatesApi.archive(documentTemplateId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive document template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId } )); - return DocumentTemplatesApi.unarchive(documentTemplateId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts deleted file mode 100644 index dc538a3..0000000 --- a/test/generated/base/dunningAccountStatement/dunningAccountStatement.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningAccountStatementAcl { -/** - * Use for `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation ability. For global ability, omit the object parameter. - * @description Generate account statement - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation - */ -export const canUseGenerateAccountStatement = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetAccountStatementEml` mutation ability. For global ability, omit the object parameter. - * @description Download account statement as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAccountStatementEml` mutation - */ -export const canUseGetAccountStatementEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts deleted file mode 100644 index 094141a..0000000 --- a/test/generated/base/dunningAccountStatement/dunningAccountStatement.api.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningAccountStatementApi { -export const dataGenFake = () => { - return AppRestClient.get( - { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, - `/data-gen-fake/account-statement`, - - ) -}; -export const generateAccountStatement = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/account-statement`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getAccountStatementEml = (officeId: string, data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/account-statement/eml`, - ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts deleted file mode 100644 index 83d04d1..0000000 --- a/test/generated/base/dunningAccountStatement/dunningAccountStatement.models.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningAccountStatementModels { -/** - * AccountStatementPdfPayloadInvoiceDtoSchema - * @type { object } - * @property { string } number - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } dueDays - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - */ -export const AccountStatementPdfPayloadInvoiceDtoSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }), dueDays: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string() }); -export type AccountStatementPdfPayloadInvoiceDto = z.infer; - -/** - * AccountStatementInvoicesByCurrencyAndDirectionDtoSchema - * @type { object } - * @property { string } direction - * @property { string } currency - * @property { AccountStatementPdfPayloadInvoiceDto[] } invoices - * @property { number } totalOutstandingAmount - */ -export const AccountStatementInvoicesByCurrencyAndDirectionDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema, currency: z.string(), invoices: z.array(AccountStatementPdfPayloadInvoiceDtoSchema), totalOutstandingAmount: z.number() }); -export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer; - -/** - * AccountStatementPdfPayloadBusinessPartnerDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - * @property { string } referenceNumber - */ -export const AccountStatementPdfPayloadBusinessPartnerDtoSchema = z.object({ name: z.string(), address: z.string().nullish(), referenceNumber: z.string().nullish() }); -export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer; - -/** - * AccountStatementPdfPayloadBankAccountDtoSchema - * @type { object } - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - */ -export const AccountStatementPdfPayloadBankAccountDtoSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }); -export type AccountStatementPdfPayloadBankAccountDto = z.infer; - -/** - * AccountStatementPdfPayloadDTOSchema - * @type { object } - * @property { AccountStatementPdfPayloadBusinessPartnerDto } businessPartner - * @property { AccountStatementInvoicesByCurrencyAndDirectionDto[] } invoicesByCurrencyAndDirection - * @property { AccountStatementPdfPayloadBankAccountDto } bankAccount - * @property { string } employeeName - * @property { CommonModels.ConfigBlockDto } config - */ -export const AccountStatementPdfPayloadDTOSchema = z.object({ businessPartner: AccountStatementPdfPayloadBusinessPartnerDtoSchema, invoicesByCurrencyAndDirection: z.array(AccountStatementInvoicesByCurrencyAndDirectionDtoSchema), bankAccount: AccountStatementPdfPayloadBankAccountDtoSchema, employeeName: z.string().nullable(), config: CommonModels.ConfigBlockDtoSchema }); -export type AccountStatementPdfPayloadDTO = z.infer; - -/** - * OfficeInvoiceListQueryDtoSchema - * @type { object } - * @property { string } order Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @property { CommonModels.OfficeInvoiceFilterDto } filter - * @property { number } limit Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - */ -export const OfficeInvoiceListQueryDtoSchema = z.object({ order: z.string().nullish(), filter: CommonModels.OfficeInvoiceFilterDtoSchema.nullish(), limit: z.number().gte(1).lte(100).default(20), page: z.number().nullish(), cursor: z.string().nullish() }); -export type OfficeInvoiceListQueryDto = z.infer; - -/** - * GenerateAccountStatementOrderParamEnumSchema - * @type { enum } - */ -export const GenerateAccountStatementOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); -export type GenerateAccountStatementOrderParamEnum = z.infer; -export const GenerateAccountStatementOrderParamEnum = GenerateAccountStatementOrderParamEnumSchema.enum; - -} diff --git a/test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts b/test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts deleted file mode 100644 index 4ac5c03..0000000 --- a/test/generated/base/dunningAccountStatement/dunningAccountStatement.queries.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningAccountStatementAcl } from "./dunningAccountStatement.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; -import { DunningAccountStatementApi } from "./dunningAccountStatement.api"; - -export namespace DunningAccountStatementQueries { -export const moduleName = QueryModule.DunningAccountStatement; - -export const keys = { - all: [moduleName] as const, - dataGenFake: () => [...keys.all, "/data-gen-fake/account-statement", ] as const, - generateAccountStatement: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", officeId, limit, order, filter, page, cursor] as const, - generateAccountStatementInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", "infinite", officeId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useDataGenFake` - * @summary Expose account statement PDF payload DTO for model generation - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useDataGenFake = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.dataGenFake(), - queryFn: DunningAccountStatementApi.dataGenFake, - ...options, - }); -}; - -/** - * Query `useGenerateAccountStatement` - recommended when file should be cached - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGenerateAccountStatement = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Mutation `useGenerateAccountStatementMutation` - recommended when file should not be cached - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } mutation.officeId Path parameter - * @param { number } mutation.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } mutation.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } mutation.filter Query parameter - * @param { number } mutation.page Query parameter. 1-indexed page number to begin from - * @param { string } mutation.cursor Query parameter. ID of item to start after - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateAccountStatementMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, limit } = variables; - const updateKeys = [keys.generateAccountStatement(officeId, limit)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Infinite query `useGenerateAccountStatementInfinite - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGenerateAccountStatementInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useGetAccountStatementEml` - recommended when file should not be cached - * @summary Get account statement as EML file with PDF attachment - * @permission Requires `canUseGetAccountStatementEml` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningAccountStatementModels.OfficeInvoiceListQueryDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGetAccountStatementEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId } )); - return DunningAccountStatementApi.getAccountStatementEml(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/dunningLevels/dunningLevels.acl.ts b/test/generated/base/dunningLevels/dunningLevels.acl.ts deleted file mode 100644 index eb52ae7..0000000 --- a/test/generated/base/dunningLevels/dunningLevels.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningLevelsAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List dunning level labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List dunning levels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Create", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get dunning level by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Update", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive a dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Archive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive a dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Unarchive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -} diff --git a/test/generated/base/dunningLevels/dunningLevels.api.ts b/test/generated/base/dunningLevels/dunningLevels.api.ts deleted file mode 100644 index 9829ae1..0000000 --- a/test/generated/base/dunningLevels/dunningLevels.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningLevelsModels } from "./dunningLevels.models"; - -export namespace DunningLevelsApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, - `/offices/${officeId}/dunning-levels/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, - `/offices/${officeId}/dunning-levels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: DunningLevelsModels.CreateDunningLevelRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels`, - ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: DunningLevelsModels.UpdateDunningLevelRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}`, - ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/dunningLevels/dunningLevels.configs.ts b/test/generated/base/dunningLevels/dunningLevels.configs.ts deleted file mode 100644 index ddfe0e9..0000000 --- a/test/generated/base/dunningLevels/dunningLevels.configs.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningLevelsModels } from "./dunningLevels.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningLevelsQueries } from "./dunningLevels.queries"; -import { DunningLevelsAcl } from "./dunningLevels.acl"; - -export namespace DunningLevelsConfigs { -export const dunningLevelsConfig = { - meta: { - title: "Dunning Levels", - }, - readAll: { - acl: DunningLevelsAcl.canUseList, - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - paginated: DunningLevelsQueries.useList, - infinite: DunningLevelsQueries.useListInfinite, - filters: { - schema: DunningLevelsModels.DunningLevelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningLevelsModels.DunningLevelFilterDtoSchema, - options: { - inputs: { - dunningSystemId: true, - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - options: { - columns: { - id: true, - level: true, - daysOverdue: true, - dunningFee: true, - interestRate: true, - usedInOfficeId: true, - usedInOffice: true, - dunningSystem: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - archived: true, - bodyRemarks: true, - footerRemarks: true, - }, - sortable: DunningLevelsModels.DunningLevelsListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DunningLevelsAcl.canUseFindById, - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - query: DunningLevelsQueries.useFindById, - }, - create: { - acl: DunningLevelsAcl.canUseCreate, - schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, - mutation: DunningLevelsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, - options: { - inputs: { - level: true, - daysOverdue: true, - dunningFee: true, - dunningSystemId: true, - interestRate: true, - bodyRemarks: true, - footerRemarks: true, - }, - }, -}) - }, - update: { - acl: DunningLevelsAcl.canUseUpdate, - schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, - mutation: DunningLevelsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, - options: { - inputs: { - level: true, - daysOverdue: true, - dunningFee: true, - interestRate: true, - dunningSystemId: true, - bodyRemarks: true, - footerRemarks: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DunningLevelsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DunningLevelsQueries.usePaginateLabels, - infinite: DunningLevelsQueries.usePaginateLabelsInfinite, - filters: { - schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/dunningLevels/dunningLevels.models.ts b/test/generated/base/dunningLevels/dunningLevels.models.ts deleted file mode 100644 index a19a7cf..0000000 --- a/test/generated/base/dunningLevels/dunningLevels.models.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningLevelsModels { -/** - * DunningLevelOfficeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } currencyNotation - */ -export const DunningLevelOfficeDTOSchema = z.object({ id: z.string(), name: z.string(), currencyNotation: z.string() }); -export type DunningLevelOfficeDTO = z.infer; - -/** - * DunningLevelEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type DunningLevelEmployeeDTO = z.infer; - -/** - * DunningLevelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { number } level - * @property { number } daysOverdue - * @property { number } dunningFee - * @property { number } interestRate - * @property { string } usedInOfficeId - * @property { DunningLevelOfficeDTO } usedInOffice - * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem - * @property { string } createdById - * @property { DunningLevelEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DunningLevelEmployeeDTO } updatedBy - * @property { string } updatedAt - * @property { boolean } archived - * @property { CommonModels.EditorContentResponseDto } bodyRemarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks - */ -export const DunningLevelResponseDTOSchema = z.object({ id: z.string(), level: z.number(), daysOverdue: z.number(), dunningFee: z.number(), interestRate: z.number().nullish(), usedInOfficeId: z.string(), usedInOffice: DunningLevelOfficeDTOSchema.nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), createdById: z.string().nullish(), createdBy: DunningLevelEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningLevelEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), archived: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish() }); -export type DunningLevelResponseDTO = z.infer; - -/** - * CreateDunningLevelRequestDTOSchema - * @type { object } - * @property { number } level Dunning level number. Minimum: `1` - * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` - * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` - * @property { string } dunningSystemId Dunning system ID - * @property { number } interestRate Minimum: `0`. Maximum: `100` - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const CreateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1), daysOverdue: z.number().gte(1), dunningFee: z.number().gte(0), dunningSystemId: z.string().nullish(), interestRate: z.number().gte(0).lte(100).nullish(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullish() }); -export type CreateDunningLevelRequestDTO = z.infer; - -/** - * UpdateDunningLevelRequestDTOSchema - * @type { object } - * @property { number } level Dunning level number. Minimum: `1` - * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` - * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` - * @property { number } interestRate Minimum: `0`. Maximum: `100` - * @property { string } dunningSystemId Dunning system ID - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1).nullable(), daysOverdue: z.number().gte(1).nullable(), dunningFee: z.number().gte(0).nullable(), interestRate: z.number().gte(0).lte(100).nullable(), dunningSystemId: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateDunningLevelRequestDTO = z.infer; - -/** - * DunningLevelLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DunningLevelLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type DunningLevelLabelFilterDto = z.infer; - -/** - * DunningLevelFilterDtoSchema - * @type { object } - * @property { string } dunningSystemId Dunning system ID to filter by - * @property { string } search Search to filter by - * @property { boolean } archived Filter by archived status - */ -export const DunningLevelFilterDtoSchema = z.object({ dunningSystemId: z.string().nullable(), search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type DunningLevelFilterDto = z.infer; - -/** - * DunningLevelsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DunningLevelsPaginateLabelsOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DunningLevelsPaginateLabelsOrderParamEnum = z.infer; -export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DunningLevelsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DunningLevelsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type DunningLevelsPaginateLabelsResponse = z.infer; - -/** - * DunningLevelsListOrderParamEnumSchema - * @type { enum } - */ -export const DunningLevelsListOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DunningLevelsListOrderParamEnum = z.infer; -export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSchema.enum; - -/** - * DunningLevelsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningLevelResponseDTO[] } items - */ -export const DunningLevelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningLevelResponseDTOSchema).nullable() }).partial().shape }); -export type DunningLevelsListResponse = z.infer; - -} diff --git a/test/generated/base/dunningLevels/dunningLevels.queries.ts b/test/generated/base/dunningLevels/dunningLevels.queries.ts deleted file mode 100644 index b75b7a0..0000000 --- a/test/generated/base/dunningLevels/dunningLevels.queries.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningLevelsAcl } from "./dunningLevels.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningLevelsModels } from "./dunningLevels.models"; -import { DunningLevelsApi } from "./dunningLevels.api"; - -export namespace DunningLevelsQueries { -export const moduleName = QueryModule.DunningLevels; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-levels/:id", id, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate dunning level labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate dunning level labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List dunning levels - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUseList({ officeId } )); - return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List dunning levels - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningLevelsAcl.canUseList({ officeId } )); - return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create dunning level - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningLevelsModels.CreateDunningLevelRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningLevelsAcl.canUseCreate({ officeId } )); - return DunningLevelsApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get dunning level by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUseFindById({ officeId } )); - return DunningLevelsApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update dunning level - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningLevelsModels.UpdateDunningLevelRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(DunningLevelsAcl.canUseUpdate({ officeId } )); - return DunningLevelsApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a dunning level - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningLevelsAcl.canUseArchive({ officeId } )); - return DunningLevelsApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a dunning level - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId } )); - return DunningLevelsApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/dunningManagement/dunningManagement.acl.ts b/test/generated/base/dunningManagement/dunningManagement.acl.ts deleted file mode 100644 index 251aea8..0000000 --- a/test/generated/base/dunningManagement/dunningManagement.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningManagementAcl { -/** - * Use for `useListDunnings` query ability. For global ability, omit the object parameter. - * @description List dunnings - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListDunnings` query - */ -export const canUseListDunnings = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Dunning", object) : "Dunning" -] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - -/** - * Use for `useCreateDunningWithInvoices` mutation ability. For global ability, omit the object parameter. - * @description Create dunning - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDunningWithInvoices` mutation - */ -export const canUseCreateDunningWithInvoices = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Dunning", object) : "Dunning" -] as AbilityTuple<"Create", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - -/** - * Use for `useGetDunningEml` query or `useGetDunningEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download dunning as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDunningEml` query or `useGetDunningEmlMutation` mutation - */ -export const canUseGetDunningEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Dunning", object) : "Dunning" -] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - -} diff --git a/test/generated/base/dunningManagement/dunningManagement.api.ts b/test/generated/base/dunningManagement/dunningManagement.api.ts deleted file mode 100644 index 5b706b4..0000000 --- a/test/generated/base/dunningManagement/dunningManagement.api.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningManagementModels } from "./dunningManagement.models"; - -export namespace DunningManagementApi { -export const listDunnings = (officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningManagementModels.ListDunningsResponseSchema }, - `/offices/${officeId}/dunnings`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createDunningWithInvoices = (partnerId: string, officeId: string, data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DunningManagementModels.DunningResponseDtoSchema }, - `/offices/${officeId}/partners/${partnerId}/dunnings`, - ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), - - ) -}; -export const dataGenFake = () => { - return AppRestClient.get( - { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, - `/data-gen-fake`, - - ) -}; -export const getDunningEml = (officeId: string, dunningId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/dunnings/${dunningId}/eml`, - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/base/dunningManagement/dunningManagement.configs.ts b/test/generated/base/dunningManagement/dunningManagement.configs.ts deleted file mode 100644 index 6c09ba7..0000000 --- a/test/generated/base/dunningManagement/dunningManagement.configs.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningManagementModels } from "./dunningManagement.models"; -import { DunningManagementQueries } from "./dunningManagement.queries"; -import { DunningManagementAcl } from "./dunningManagement.acl"; - -export namespace DunningManagementConfigs { -export const dunningsConfig = { - meta: { - title: "Dunnings", - }, - readAll: { - acl: DunningManagementAcl.canUseListDunnings, - schema: DunningManagementModels.DunningResponseDtoSchema, - paginated: DunningManagementQueries.useListDunnings, - infinite: DunningManagementQueries.useListDunningsInfinite, - filters: { - schema: DunningManagementModels.DunningFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningManagementModels.DunningFilterDtoSchema, - options: { - inputs: { - status: true, - partnerId: true, - level: true, - outstandingAmountMin: true, - outstandingAmountMax: true, - createdFrom: true, - createdTo: true, - confirmedBy: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningManagementModels.DunningResponseDtoSchema, - options: { - columns: { - id: true, - partner: true, - level: true, - dunningLevelId: true, - status: true, - invoiceCount: true, - outstandingAmount: true, - currencyNotation: true, - daysOverdue: true, - dunningFee: true, - createdAt: true, - statusChangedOn: true, - confirmedBy: true, - documentUrl: true, - }, - sortable: DunningManagementModels.ListDunningsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/dunningManagement/dunningManagement.models.ts b/test/generated/base/dunningManagement/dunningManagement.models.ts deleted file mode 100644 index 572426f..0000000 --- a/test/generated/base/dunningManagement/dunningManagement.models.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningManagementModels { -/** - * DunningPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const DunningPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type DunningPartnerDto = z.infer; - -/** - * DunningConfirmedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type DunningConfirmedByDto = z.infer; - -/** - * DunningStatusSchema - * @type { enum } - */ -export const DunningStatusSchema = z.enum(["PREPARED", "ISSUED"]); -export type DunningStatus = z.infer; -export const DunningStatus = DunningStatusSchema.enum; - -/** - * DunningResponseDtoSchema - * @type { object } - * @property { string } id - * @property { DunningPartnerDto } partner - * @property { number } level - * @property { string } dunningLevelId - * @property { string } status - * @property { number } invoiceCount - * @property { number } outstandingAmount - * @property { string } currencyNotation - * @property { number } daysOverdue - * @property { number } dunningFee - * @property { string } createdAt - * @property { string } statusChangedOn - * @property { DunningConfirmedByDto } confirmedBy - * @property { string } documentUrl - */ -export const DunningResponseDtoSchema = z.object({ id: z.string(), partner: DunningPartnerDtoSchema, level: z.number(), dunningLevelId: z.string().nullish(), status: DunningStatusSchema, invoiceCount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number(), dunningFee: z.number(), createdAt: z.iso.datetime({ offset: true }), statusChangedOn: z.iso.datetime({ offset: true }), confirmedBy: DunningConfirmedByDtoSchema.nullish(), documentUrl: z.string().nullish() }); -export type DunningResponseDto = z.infer; - -/** - * DunningFilterDtoSchema - * @type { object } - * @property { DunningStatus[] } status - * @property { string } partnerId Partner ID to filter by - * @property { array[] } level Dunning level(s) to filter by - * @property { number } outstandingAmountMin Minimum outstanding amount - * @property { number } outstandingAmountMax Maximum outstanding amount - * @property { string } createdFrom Created from (ISO date string) - * @property { string } createdTo Created to (ISO date string) - * @property { string } confirmedBy Confirmed by employee ID - */ -export const DunningFilterDtoSchema = z.object({ status: z.array(DunningStatusSchema).nullable(), partnerId: z.string().nullable(), level: z.array(z.array(z.any())).nullable(), outstandingAmountMin: z.number().nullable(), outstandingAmountMax: z.number().nullable(), createdFrom: z.iso.datetime({ offset: true }).nullable(), createdTo: z.iso.datetime({ offset: true }).nullable(), confirmedBy: z.string().nullable() }).partial(); -export type DunningFilterDto = z.infer; - -/** - * DunningPdfConfigDTOSchema - * @type { object } - * @property { string } headerImageUrl - * @property { string } footerImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ -export const DunningPdfConfigDTOSchema = z.object({ headerImageUrl: z.string(), footerImageUrl: z.string(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); -export type DunningPdfConfigDTO = z.infer; - -/** - * DunningPdfBusinessPartnerDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } address - * @property { string } referenceNumber - */ -export const DunningPdfBusinessPartnerDTOSchema = z.object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }); -export type DunningPdfBusinessPartnerDTO = z.infer; - -/** - * DunningPdfInvoiceDTOSchema - * @type { object } - * @property { string } invoiceNumber - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } daysOverdue - * @property { number } dunningLevel - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - * @property { number } interest - */ -export const DunningPdfInvoiceDTOSchema = z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }).nullish(), daysOverdue: z.number(), dunningLevel: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), interest: z.number().nullish() }); -export type DunningPdfInvoiceDTO = z.infer; - -/** - * DunningPdfTotalDTOSchema - * @type { object } - * @property { number } invoicesSum - * @property { number } dunningFee - * @property { number } interest - * @property { string } currencyNotation - */ -export const DunningPdfTotalDTOSchema = z.object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }); -export type DunningPdfTotalDTO = z.infer; - -/** - * DunningPdfBankAccountDTOSchema - * @type { object } - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - */ -export const DunningPdfBankAccountDTOSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }); -export type DunningPdfBankAccountDTO = z.infer; - -/** - * DunningPdfUpcomingInvoiceDTOSchema - * @type { object } - * @property { string } number - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } dueDays - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - */ -export const DunningPdfUpcomingInvoiceDTOSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), dueDays: z.number().nullish(), invoiceAmount: z.number().nullish(), outstandingAmount: z.number().nullish(), currencyNotation: z.string().nullish() }); -export type DunningPdfUpcomingInvoiceDTO = z.infer; - -/** - * DunningPdfPayloadDTOSchema - * @type { object } - * @property { string } dunningId - * @property { number } dunningLevel - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { DunningPdfBusinessPartnerDTO } businessPartner - * @property { DunningPdfInvoiceDTO[] } invoices - * @property { DunningPdfTotalDTO } total - * @property { DunningPdfBankAccountDTO } bankAccount - * @property { string } employeeName - * @property { DunningPdfConfigDTO } config - * @property { CommonModels.LanguageEnum } language - * @property { DunningPdfUpcomingInvoiceDTO[] } upcomingInvoices - */ -export const DunningPdfPayloadDTOSchema = z.object({ dunningId: z.string(), dunningLevel: z.number(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), businessPartner: DunningPdfBusinessPartnerDTOSchema, invoices: z.array(DunningPdfInvoiceDTOSchema), total: DunningPdfTotalDTOSchema, bankAccount: DunningPdfBankAccountDTOSchema, employeeName: z.string().nullable(), config: DunningPdfConfigDTOSchema, language: CommonModels.LanguageEnumSchema.nullish(), upcomingInvoices: z.array(DunningPdfUpcomingInvoiceDTOSchema).nullish() }); -export type DunningPdfPayloadDTO = z.infer; - -/** - * CreateDunningWithInvoicesRequestDTOSchema - * @type { object } - * @property { string[] } invoiceIds Array of outstanding invoice IDs to include in the dunning. Example: `123e4567-e89b-12d3-a456-426614174000,123e4567-e89b-12d3-a456-426614174001` - * @property { string } dunningLevelId The ID of the dunning level to use for this dunning. Example: `123e4567-e89b-12d3-a456-426614174002` - * @property { number } dunningFee Optional dunning fee to use. If not provided, the fee from the dunning level will be used. Minimum: `0`. Example: `25.5` - * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` - * @property { boolean } includeUpcomingInvoices - */ -export const CreateDunningWithInvoicesRequestDTOSchema = z.object({ invoiceIds: z.array(z.string()), dunningLevelId: z.string(), dunningFee: z.number().gte(0).nullish(), interestRate: z.number().gte(0).lte(100).nullish(), includeUpcomingInvoices: z.boolean().nullish() }); -export type CreateDunningWithInvoicesRequestDTO = z.infer; - -/** - * ListDunningsOrderParamEnumSchema - * @type { enum } - */ -export const ListDunningsOrderParamEnumSchema = z.enum(["createdAt", "level", "outstandingAmount", "statusChangedOn"]); -export type ListDunningsOrderParamEnum = z.infer; -export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; - -/** - * ListDunningsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningResponseDto[] } items - */ -export const ListDunningsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningResponseDtoSchema).nullable() }).partial().shape }); -export type ListDunningsResponse = z.infer; - -} diff --git a/test/generated/base/dunningManagement/dunningManagement.queries.ts b/test/generated/base/dunningManagement/dunningManagement.queries.ts deleted file mode 100644 index 53428c9..0000000 --- a/test/generated/base/dunningManagement/dunningManagement.queries.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningManagementAcl } from "./dunningManagement.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningManagementModels } from "./dunningManagement.models"; -import { DunningManagementApi } from "./dunningManagement.api"; - -export namespace DunningManagementQueries { -export const moduleName = QueryModule.DunningManagement; - -export const keys = { - all: [moduleName] as const, - listDunnings: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", officeId, limit, order, filter, page, cursor] as const, - listDunningsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", "infinite", officeId, limit, order, filter, cursor] as const, - dataGenFake: () => [...keys.all, "/data-gen-fake", ] as const, - getDunningEml: (officeId: string, dunningId: string) => [...keys.all, "/offices/:officeId/dunnings/:dunningId/eml", officeId, dunningId] as const, -}; - -/** - * Query `useListDunnings` - * @summary List dunnings for an office - * @permission Requires `canUseListDunnings` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` - * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListDunnings = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListDunningsInfinite - * @summary List dunnings for an office - * @permission Requires `canUseListDunnings` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` - * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListDunningsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateDunningWithInvoices` - * @summary Create a dunning with outstanding invoices - * @permission Requires `canUseCreateDunningWithInvoices` ability - * @param { string } mutation.partnerId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningManagementModels.CreateDunningWithInvoicesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateDunningWithInvoices = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ partnerId, officeId, data }) => { - checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId } )); - return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useDataGenFake` - * @summary Expose dunning PDF payload DTO for model generation - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useDataGenFake = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.dataGenFake(), - queryFn: DunningManagementApi.dataGenFake, - ...options, - }); -}; - -/** - * Query `useGetDunningEml` - recommended when file should be cached - * @summary Get dunning as EML file with PDF attachment - * @permission Requires `canUseGetDunningEml` ability - * @param { string } object.officeId Path parameter - * @param { string } object.dunningId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetDunningEml = ({ officeId, dunningId }: { officeId: string, dunningId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDunningEml(officeId, dunningId), - queryFn: () => { - checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); - return DunningManagementApi.getDunningEml(officeId, dunningId) }, - ...options, - }); -}; - -/** - * Mutation `useGetDunningEmlMutation` - recommended when file should not be cached - * @summary Get dunning as EML file with PDF attachment - * @permission Requires `canUseGetDunningEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.dunningId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetDunningEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, dunningId }) => { - checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); - return DunningManagementApi.getDunningEml(officeId, dunningId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, dunningId } = variables; - const updateKeys = [keys.getDunningEml(officeId, dunningId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts deleted file mode 100644 index 4294b32..0000000 --- a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningPartnerOutstandingInvoicesAcl { -/** - * Use for `useListPartnerOutstandingInvoiceSummaries` query ability. For global ability, omit the object parameter. - * @description List office outstanding invoice summaries per partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoiceSummaries` query - */ -export const canUseListPartnerOutstandingInvoiceSummaries = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useListPartnerOutstandingInvoices` query ability. For global ability, omit the object parameter. - * @description List partner outstanding invoices - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoices` query - */ -export const canUseListPartnerOutstandingInvoices = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useListRecommendedDunningLevels` mutation ability. For global ability, omit the object parameter. - * @description List recommended dunning levels for a partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRecommendedDunningLevels` mutation - */ -export const canUseListRecommendedDunningLevels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts deleted file mode 100644 index d7cdd8a..0000000 --- a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; - -export namespace DunningPartnerOutstandingInvoicesApi { -export const listPartnerOutstandingInvoiceSummaries = (officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, - `/offices/${officeId}/partner-outstanding-invoices`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listPartnerOutstandingInvoices = (partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, - `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listRecommendedDunningLevels = (partnerId: string, officeId: string, data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, ) => { - return AppRestClient.post( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, - `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, - ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts deleted file mode 100644 index 3fc3451..0000000 --- a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; -import { DunningPartnerOutstandingInvoicesQueries } from "./dunningPartnerOutstandingInvoices.queries"; -import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; - -export namespace DunningPartnerOutstandingInvoicesConfigs { -export const partnerOutstandingInvoicesConfig = { - meta: { - title: "Partner Outstanding Invoices", - }, - readAll: { - acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries, - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, - paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummaries, - infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummariesInfinite, - filters: { - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, - options: { - inputs: { - search: true, - daysOverdueMin: true, - partnerId: true, - outstandingAmountMin: true, - currency: true, - dunningSystemId: true, - lastDunningDate: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, - options: { - columns: { - partnerId: true, - partnerName: true, - partnerCountry: true, - dunningSystemId: true, - dunningSystemName: true, - invoiceCount: true, - daysOverdue: true, - outstandingAmount: true, - currencyNotation: true, - lastDunningDate: true, - }, - sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, - }, -}), - }, -}; - -export const outstandingInvoicesConfig = { - meta: { - title: "Outstanding Invoices", - }, - readAll: { - acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices, - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, - paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoices, - infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoicesInfinite, - filters: { - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, - options: { - inputs: { - partnerId: true, - currency: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, - options: { - columns: { - invoiceId: true, - invoiceNumber: true, - invoiceDate: true, - invoiceAmount: true, - owedAmount: true, - currencyNotation: true, - daysOverdue: true, - dueDate: true, - invoiceInReview: true, - dunningBlock: true, - }, - sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts deleted file mode 100644 index b07e9f3..0000000 --- a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningPartnerOutstandingInvoicesModels { -/** - * PartnerOutstandingInvoiceSummaryFilterDtoSchema - * @type { object } - * @property { string } search Search string (partner name) - * @property { number } daysOverdueMin Minimum days overdue - * @property { string } partnerId Partner ID - * @property { number } outstandingAmountMin Minimum outstanding amount - * @property { string } currency Currency - * @property { string } dunningSystemId Dunning system ID - * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range - */ -export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z.object({ search: z.string().nullable(), daysOverdueMin: z.number().nullable(), partnerId: z.string().nullable(), outstandingAmountMin: z.number().nullable(), currency: z.string().nullable(), dunningSystemId: z.string().nullable(), lastDunningDate: CommonModels.DateRangeDtoSchema.nullable() }).partial(); -export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer; - -/** - * PartnerOutstandingInvoiceSummaryResponseDtoSchema - * @type { object } - * @property { string } partnerId Business partner ID - * @property { string } partnerName Business partner name - * @property { string } partnerCountry Business partner country - * @property { string } dunningSystemId Dunning system ID - * @property { string } dunningSystemName Dunning system name - * @property { number } invoiceCount Number of outstanding invoices - * @property { number } daysOverdue Maximum days overdue across all partner invoices - * @property { number } outstandingAmount Total outstanding amount - * @property { string } currencyNotation Currency of partner invoices - * @property { string } lastDunningDate Date of the most recent issued dunning document - */ -export const PartnerOutstandingInvoiceSummaryResponseDtoSchema = z.object({ partnerId: z.string(), partnerName: z.string(), partnerCountry: z.string().nullish(), dunningSystemId: z.string(), dunningSystemName: z.string(), invoiceCount: z.number(), daysOverdue: z.number().nullish(), outstandingAmount: z.number(), currencyNotation: z.string(), lastDunningDate: z.iso.datetime({ offset: true }).nullish() }); -export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer; - -/** - * PartnerOutstandingInvoiceResponseDtoSchema - * @type { object } - * @property { string } invoiceId Invoice ID - * @property { string } invoiceNumber Invoice number - * @property { string } invoiceDate Invoice date - * @property { number } invoiceAmount Invoice amount - * @property { number } owedAmount Owed amount - * @property { string } currencyNotation Currency notation - * @property { number } daysOverdue Days overdue - * @property { string } dueDate Due date - * @property { boolean } invoiceInReview - * @property { boolean } dunningBlock - */ -export const PartnerOutstandingInvoiceResponseDtoSchema = z.object({ invoiceId: z.string(), invoiceNumber: z.string().nullish(), invoiceDate: z.iso.datetime({ offset: true }).nullish(), invoiceAmount: z.number(), owedAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number().nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), invoiceInReview: z.boolean().nullish(), dunningBlock: z.boolean().nullish() }); -export type PartnerOutstandingInvoiceResponseDto = z.infer; - -/** - * PartnerOutstandingInvoiceFilterDtoSchema - * @type { object } - * @property { string } partnerId Partner ID to filter by - * @property { string } currency Invoice currency notation to filter by - */ -export const PartnerOutstandingInvoiceFilterDtoSchema = z.object({ partnerId: z.string().nullable(), currency: z.string().nullable() }).partial(); -export type PartnerOutstandingInvoiceFilterDto = z.infer; - -/** - * RecommendedDunningLevelsRequestDtoSchema - * @type { object } - * @property { string[] } invoiceIds Invoice IDs used to calculate the recommended dunning level. Min Items: `1`. Example: `123e4567-e89b-12d3-a456-426614174000` - */ -export const RecommendedDunningLevelsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).min(1) }); -export type RecommendedDunningLevelsRequestDto = z.infer; - -/** - * RecommendedLabelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { boolean } isRecommended - */ -export const RecommendedLabelResponseDtoSchema = z.object({ id: z.string(), label: z.string(), isRecommended: z.boolean() }); -export type RecommendedLabelResponseDto = z.infer; - -/** - * ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema - * @type { enum } - */ -export const ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema = z.enum(["outstandingAmount", "daysOverdue", "lastDunningDate", "invoiceCount", "partnerCountry", "partnerName", "dunningSystemName"]); -export type ListPartnerOutstandingInvoiceSummariesOrderParamEnum = z.infer; -export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema.enum; - -/** - * ListPartnerOutstandingInvoiceSummariesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items - */ -export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).nullable() }).partial().shape }); -export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer; - -/** - * ListPartnerOutstandingInvoicesOrderParamEnumSchema - * @type { enum } - */ -export const ListPartnerOutstandingInvoicesOrderParamEnumSchema = z.enum(["dueDate", "invoiceDate", "owedAmount"]); -export type ListPartnerOutstandingInvoicesOrderParamEnum = z.infer; -export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandingInvoicesOrderParamEnumSchema.enum; - -/** - * ListPartnerOutstandingInvoicesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerOutstandingInvoiceResponseDto[] } items - */ -export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).nullable() }).partial().shape }); -export type ListPartnerOutstandingInvoicesResponse = z.infer; - -/** - * ListRecommendedDunningLevelsResponseSchema - * @type { array } - */ -export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema); -export type ListRecommendedDunningLevelsResponse = z.infer; - -} diff --git a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts b/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts deleted file mode 100644 index 5e8a555..0000000 --- a/test/generated/base/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; -import { DunningPartnerOutstandingInvoicesApi } from "./dunningPartnerOutstandingInvoices.api"; - -export namespace DunningPartnerOutstandingInvoicesQueries { -export const moduleName = QueryModule.DunningPartnerOutstandingInvoices; - -export const keys = { - all: [moduleName] as const, - listPartnerOutstandingInvoiceSummaries: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", officeId, limit, order, filter, page, cursor] as const, - listPartnerOutstandingInvoiceSummariesInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", "infinite", officeId, limit, order, filter, cursor] as const, - listPartnerOutstandingInvoices: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", partnerId, officeId, limit, order, filter, page, cursor] as const, - listPartnerOutstandingInvoicesInfinite: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", "infinite", partnerId, officeId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useListPartnerOutstandingInvoiceSummaries` - * @summary List office outstanding invoice summaries per partner - * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoiceSummaries = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListPartnerOutstandingInvoiceSummariesInfinite - * @summary List office outstanding invoice summaries per partner - * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoiceSummariesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListPartnerOutstandingInvoices` - * @summary List outstanding invoices for a specific partner - * @permission Requires `canUseListPartnerOutstandingInvoices` ability - * @param { string } object.partnerId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoices = ({ partnerId, officeId, limit, order, filter, page, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListPartnerOutstandingInvoicesInfinite - * @summary List outstanding invoices for a specific partner - * @permission Requires `canUseListPartnerOutstandingInvoices` ability - * @param { string } object.partnerId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoicesInfinite = ({ partnerId, officeId, limit, order, filter, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useListRecommendedDunningLevels` - * @summary List recommended dunning levels for a partner - * @permission Requires `canUseListRecommendedDunningLevels` ability - * @param { string } mutation.partnerId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useListRecommendedDunningLevels = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ partnerId, officeId, data }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/dunningSystems/dunningSystems.acl.ts b/test/generated/base/dunningSystems/dunningSystems.acl.ts deleted file mode 100644 index 14c8307..0000000 --- a/test/generated/base/dunningSystems/dunningSystems.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningSystemsAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List dunning system labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List dunning systems - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Create", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get dunning system by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Update", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -} diff --git a/test/generated/base/dunningSystems/dunningSystems.api.ts b/test/generated/base/dunningSystems/dunningSystems.api.ts deleted file mode 100644 index 2d584ae..0000000 --- a/test/generated/base/dunningSystems/dunningSystems.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningSystemsModels } from "./dunningSystems.models"; - -export namespace DunningSystemsApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, - `/offices/${officeId}/dunning-systems/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, - `/offices/${officeId}/dunning-systems`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: DunningSystemsModels.CreateDunningSystemRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems`, - ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: DunningSystemsModels.UpdateDunningSystemRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}`, - ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/dunningSystems/dunningSystems.configs.ts b/test/generated/base/dunningSystems/dunningSystems.configs.ts deleted file mode 100644 index 9040265..0000000 --- a/test/generated/base/dunningSystems/dunningSystems.configs.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningSystemsModels } from "./dunningSystems.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningSystemsQueries } from "./dunningSystems.queries"; -import { DunningSystemsAcl } from "./dunningSystems.acl"; - -export namespace DunningSystemsConfigs { -export const dunningSystemsConfig = { - meta: { - title: "Dunning Systems", - }, - readAll: { - acl: DunningSystemsAcl.canUsePaginate, - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - paginated: DunningSystemsQueries.usePaginate, - infinite: DunningSystemsQueries.usePaginateInfinite, - filters: { - schema: DunningSystemsModels.DunningSystemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningSystemsModels.DunningSystemFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - isDefault: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - isDefault: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DunningSystemsAcl.canUseFindById, - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - query: DunningSystemsQueries.useFindById, - }, - create: { - acl: DunningSystemsAcl.canUseCreate, - schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, - mutation: DunningSystemsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, - options: { - inputs: { - name: true, - isDefault: true, - }, - }, -}) - }, - update: { - acl: DunningSystemsAcl.canUseUpdate, - schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, - mutation: DunningSystemsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, - options: { - inputs: { - name: true, - isDefault: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DunningSystemsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DunningSystemsQueries.usePaginateLabels, - infinite: DunningSystemsQueries.usePaginateLabelsInfinite, - filters: { - schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/dunningSystems/dunningSystems.models.ts b/test/generated/base/dunningSystems/dunningSystems.models.ts deleted file mode 100644 index 164270a..0000000 --- a/test/generated/base/dunningSystems/dunningSystems.models.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningSystemsModels { -/** - * DunningSystemEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type DunningSystemEmployeeDTO = z.infer; - -/** - * DunningSystemResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name - * @property { boolean } isDefault - * @property { boolean } archived - * @property { string } archivedAt - * @property { string } createdById - * @property { DunningSystemEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DunningSystemEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const DunningSystemResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isDefault: z.boolean(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: DunningSystemEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningSystemEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type DunningSystemResponseDTO = z.infer; - -/** - * DunningSystemLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DunningSystemLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type DunningSystemLabelFilterDto = z.infer; - -/** - * DunningSystemFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - * @property { boolean } isDefault - */ -export const DunningSystemFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable(), isDefault: z.boolean().nullable() }).partial(); -export type DunningSystemFilterDto = z.infer; - -/** - * CreateDunningSystemRequestDTOSchema - * @type { object } - * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` - * @property { boolean } isDefault Is default dunning system - */ -export const CreateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100), isDefault: z.boolean().nullish() }); -export type CreateDunningSystemRequestDTO = z.infer; - -/** - * UpdateDunningSystemRequestDTOSchema - * @type { object } - * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` - * @property { boolean } isDefault Is default dunning system - */ -export const UpdateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100).nullable(), isDefault: z.boolean().nullable() }).partial(); -export type UpdateDunningSystemRequestDTO = z.infer; - -/** - * DunningSystemsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DunningSystemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); -export type DunningSystemsPaginateLabelsOrderParamEnum = z.infer; -export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DunningSystemsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DunningSystemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type DunningSystemsPaginateLabelsResponse = z.infer; - -/** - * DunningSystemsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const DunningSystemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); -export type DunningSystemsPaginateOrderParamEnum = z.infer; -export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderParamEnumSchema.enum; - -/** - * DunningSystemsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningSystemResponseDTO[] } items - */ -export const DunningSystemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningSystemResponseDTOSchema).nullable() }).partial().shape }); -export type DunningSystemsPaginateResponse = z.infer; - -} diff --git a/test/generated/base/dunningSystems/dunningSystems.queries.ts b/test/generated/base/dunningSystems/dunningSystems.queries.ts deleted file mode 100644 index 7ec4019..0000000 --- a/test/generated/base/dunningSystems/dunningSystems.queries.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningSystemsAcl } from "./dunningSystems.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningSystemsModels } from "./dunningSystems.models"; -import { DunningSystemsApi } from "./dunningSystems.api"; - -export namespace DunningSystemsQueries { -export const moduleName = QueryModule.DunningSystems; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-systems/:id", id, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate dunning system labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate dunning system labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary List dunning systems - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); - return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary List dunning systems - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); - return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create dunning system - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningSystemsModels.CreateDunningSystemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningSystemsAcl.canUseCreate({ officeId } )); - return DunningSystemsApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get dunning system by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUseFindById({ officeId } )); - return DunningSystemsApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update dunning system - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningSystemsModels.UpdateDunningSystemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(DunningSystemsAcl.canUseUpdate({ officeId } )); - return DunningSystemsApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive dunning system - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningSystemsAcl.canUseArchive({ officeId } )); - return DunningSystemsApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive dunning system - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId } )); - return DunningSystemsApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/employee/employee.acl.ts b/test/generated/base/employee/employee.acl.ts deleted file mode 100644 index e796e7e..0000000 --- a/test/generated/base/employee/employee.acl.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmployeeAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List employees - * @param { string } object.officeId officeId from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId?: string, } -) => [ - "Read", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new employee - * @param { string } object.officeId officeId from mutation data - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId?: string, } -) => [ - "Create", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; - -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Employee" -] as AbilityTuple<"Read", "Employee">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Employee" -] as AbilityTuple<"Read", "Employee">; - -/** - * Use for `useResendOnboardingWithOffice` mutation ability. For global ability, omit the object parameter. - * @description Resend employee onboarding email - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useResendOnboardingWithOffice` mutation - */ -export const canUseResendOnboardingWithOffice = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - -/** - * Use for `useGet` query ability. - * @description Read Office Employee - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( -) => [ - "Read", - "Employee" -] as AbilityTuple<"Read", "Employee">; - -/** - * Use for `useUpdate` mutation ability. - * @description Update Office Employee - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Employee" -] as AbilityTuple<"Update", "Employee">; - -/** - * Use for `useGetWithOffice` query ability. For global ability, omit the object parameter. - * @description Read Office Employee - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetWithOffice` query - */ -export const canUseGetWithOffice = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - -/** - * Use for `useUpdateWithOffice` mutation ability. For global ability, omit the object parameter. - * @description Update Office Employee - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateWithOffice` mutation - */ -export const canUseUpdateWithOffice = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Update", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - -/** - * Use for `useListRoles` query ability. - * @description List employee (global) roles - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query - */ -export const canUseListRoles = ( -) => [ - "ListRoles", - "Employee" -] as AbilityTuple<"ListRoles", "Employee">; - -/** - * Use for `useUpdateRoles` mutation ability. - * @description Update employee (global) roles - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation - */ -export const canUseUpdateRoles = ( -) => [ - "UpdateRoles", - "Employee" -] as AbilityTuple<"UpdateRoles", "Employee">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Employee" -] as AbilityTuple<"Archive", "Employee">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Unarchive", - "Employee" -] as AbilityTuple<"Unarchive", "Employee">; - -} diff --git a/test/generated/base/employee/employee.api.ts b/test/generated/base/employee/employee.api.ts deleted file mode 100644 index c0430ed..0000000 --- a/test/generated/base/employee/employee.api.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeModels } from "./employee.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeApi { -export const paginate = (limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeePaginateResponseSchema }, - `/employees`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: EmployeeModels.EmployeeCreateRequest, ) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees`, - ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), - - ) -}; -export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, ) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/one-step`, - ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), - - ) -}; -export const findAll = (search?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, - `/employees/labels`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, - `/employees/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const resendOnboarding = (employeeId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/employees/${employeeId}/resend-onboarding`, - - ) -}; -export const resendOnboardingWithOffice = (officeId: string, employeeId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, - - ) -}; -export const get = (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}`, - { - params: { - populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - }, - } - ) -}; -export const update = (employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, ) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}`, - ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - - ) -}; -export const getWithOffice = (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/offices/${officeId}/employees/${employeeId}`, - { - params: { - populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - }, - } - ) -}; -export const updateWithOffice = (officeId: string, employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, ) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/offices/${officeId}/employees/${employeeId}`, - ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - - ) -}; -export const listRoles = (employeeId: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, - `/employees/${employeeId}/roles`, - - ) -}; -export const updateRoles = (employeeId: string, data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, ) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, - `/employees/${employeeId}/roles`, - ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), - - ) -}; -export const archive = (employeeId: string, ) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}/archive`, - - ) -}; -export const unarchive = (employeeId: string, ) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/employee/employee.configs.ts b/test/generated/base/employee/employee.configs.ts deleted file mode 100644 index 1288db2..0000000 --- a/test/generated/base/employee/employee.configs.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeeModels } from "./employee.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeQueries } from "./employee.queries"; -import { EmployeeAcl } from "./employee.acl"; - -export namespace EmployeeConfigs { -export const employeesConfig = { - meta: { - title: "Employees", - }, - readAll: { - acl: EmployeeAcl.canUsePaginate, - schema: EmployeeModels.EmployeeResponseSchema, - paginated: EmployeeQueries.usePaginate, - infinite: EmployeeQueries.usePaginateInfinite, - filters: { - schema: EmployeeModels.EmployeeFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeFilterDtoSchema, - options: { - inputs: { - office: true, - roles: true, - primaryOfficeId: true, - firstName: true, - lastName: true, - email: true, - ids: true, - archived: true, - search: true, - officeRole: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: EmployeeModels.EmployeeResponseSchema, - options: { - columns: { - id: true, - email: true, - firstName: true, - lastName: true, - locale: true, - phone: true, - archived: true, - primaryOfficeId: true, - primaryOffice: true, - employments: true, - roles: true, - createdAt: true, - updatedAt: true, - }, - sortable: EmployeeModels.EmployeePaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: EmployeeAcl.canUseGet, - schema: EmployeeModels.EmployeeResponseSchema, - query: EmployeeQueries.useGet, - }, - create: { - acl: EmployeeAcl.canUseCreate, - schema: EmployeeModels.EmployeeCreateRequestSchema, - mutation: EmployeeQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeCreateRequestSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - locale: true, - primaryOfficeId: true, - phone: true, - }, - }, -}) - }, - update: { - acl: EmployeeAcl.canUseUpdate, - schema: EmployeeModels.EmployeeUpdateRequestSchema, - mutation: EmployeeQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeUpdateRequestSchema, - options: { - inputs: { - firstName: true, - lastName: true, - phone: true, - locale: true, - primaryOfficeId: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: EmployeeAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: EmployeeQueries.usePaginateLabels, - infinite: EmployeeQueries.usePaginateLabelsInfinite, - filters: { - schema: EmployeeModels.EmployeeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/employee/employee.models.ts b/test/generated/base/employee/employee.models.ts deleted file mode 100644 index 7e5c67a..0000000 --- a/test/generated/base/employee/employee.models.ts +++ /dev/null @@ -1,225 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeModels { -/** - * EmployeeResponseSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { CommonModels.LocaleEnum } locale - * @property { string } phone Phone number - * @property { boolean } archived Archived - * @property { string } primaryOfficeId Primary office id - * @property { CommonModels.EmployeeOfficeResponse } primaryOffice Primary office - * @property { CommonModels.EmploymentResponse[] } employments Employments - * @property { CommonModels.EmployeeRoleResponse[] } roles Global Roles - * @property { string } createdAt - * @property { string } updatedAt - */ -export const EmployeeResponseSchema = z.object({ id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), locale: CommonModels.LocaleEnumSchema.nullish(), phone: z.string().nullish(), archived: z.boolean().nullish(), primaryOfficeId: z.string().nullish(), primaryOffice: CommonModels.EmployeeOfficeResponseSchema.nullish(), employments: z.array(CommonModels.EmploymentResponseSchema).nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }); -export type EmployeeResponse = z.infer; - -/** - * EmployeeCreateRequestSchema - * @type { object } - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { CommonModels.LocaleEnum } locale - * @property { string } primaryOfficeId Primary office ID - * @property { string } phone Phone number - */ -export const EmployeeCreateRequestSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.email(), locale: CommonModels.LocaleEnumSchema.nullish(), primaryOfficeId: z.string().nullish(), phone: z.string().nullish() }); -export type EmployeeCreateRequest = z.infer; - -/** - * EmployeeOneStepCreateEmploymentRequestSchema - * @type { object } - * @property { string } officeId - * @property { string[] } roleIds Array of office role IDs - */ -export const EmployeeOneStepCreateEmploymentRequestSchema = z.object({ officeId: z.string(), roleIds: z.array(z.string()).nullish() }); -export type EmployeeOneStepCreateEmploymentRequest = z.infer; - -/** - * EmployeeOneStepCreateRequestSchema - * @type { object } - * @property { CommonModels.LocaleEnum } locale - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { string } phone Phone number - * @property { string[] } roleIds Array of global role IDs - * @property { string } primaryOfficeId Primary office ID - * @property { EmployeeOneStepCreateEmploymentRequest[] } employments Employments. Min Items: `1` - */ -export const EmployeeOneStepCreateRequestSchema = z.object({ locale: CommonModels.LocaleEnumSchema.nullish(), firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string().nullish(), roleIds: z.array(z.string()).nullish(), primaryOfficeId: z.string().nullish(), employments: z.array(EmployeeOneStepCreateEmploymentRequestSchema).min(1) }); -export type EmployeeOneStepCreateRequest = z.infer; - -/** - * EmployeeUpdateRequestSchema - * @type { object } - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number of the employee - * @property { CommonModels.LocaleEnum } locale - * @property { string } primaryOfficeId - */ -export const EmployeeUpdateRequestSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), phone: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullable(), primaryOfficeId: z.string().nullable() }).partial(); -export type EmployeeUpdateRequest = z.infer; - -/** - * EmployeeFilterDtoSchema - * @type { object } - * @property { string } office Office ID (single select, offices the user has access to) - * @property { string[] } roles Role IDs (multiselect) - * @property { string } primaryOfficeId Primary office id - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { string[] } ids Ids - * @property { boolean } archived Archived - * set to true to only return archived employees - * does not return archived employees by default. Default: `false` - * @property { string } search Free text search multiple fields - * @property { string } officeRole Office role - */ -export const EmployeeFilterDtoSchema = z.object({ office: z.string().nullable(), roles: z.array(z.string()).nullable(), primaryOfficeId: z.string().nullable(), firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), ids: z.array(z.string()).nullable(), archived: z.boolean().nullable().default(false), search: z.string().nullable(), officeRole: z.string().nullable() }).partial(); -export type EmployeeFilterDto = z.infer; - -/** - * EmployeeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type EmployeeLabelFilterDto = z.infer; - -/** - * EmployeeRoleMemberResponseSchema - * @type { object } - * @property { string } roleId - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string[] } permissions Permissions associated with the role - */ -export const EmployeeRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), permissions: z.array(z.string()) }); -export type EmployeeRoleMemberResponse = z.infer; - -/** - * EmployeeRoleMembershipsUpdateRequestSchema - * @type { object } - * @property { string[] } roleIds Array of role IDs - */ -export const EmployeeRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()) }); -export type EmployeeRoleMembershipsUpdateRequest = z.infer; - -/** - * EmployeePaginateOrderParamEnumSchema - * @type { enum } - */ -export const EmployeePaginateOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); -export type EmployeePaginateOrderParamEnum = z.infer; -export const EmployeePaginateOrderParamEnum = EmployeePaginateOrderParamEnumSchema.enum; - -/** - * EmployeePopulateFieldSchema - * @type { enum } - */ -export const EmployeePopulateFieldSchema = z.enum(["employments", "primaryOffice", "roles", "employments.roles", "employments.office"]); -export type EmployeePopulateField = z.infer; -export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; - -/** - * EmployeePaginatePopulateParamSchema - * @type { array } - */ -export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); -export type EmployeePaginatePopulateParam = z.infer; - -/** - * EmployeePaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeResponse[] } items - */ -export const EmployeePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeResponseSchema).nullable() }).partial().shape }); -export type EmployeePaginateResponse = z.infer; - -/** - * EmployeeFindAllResponseSchema - * @type { array } - */ -export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type EmployeeFindAllResponse = z.infer; - -/** - * EmployeePaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const EmployeePaginateLabelsOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); -export type EmployeePaginateLabelsOrderParamEnum = z.infer; -export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderParamEnumSchema.enum; - -/** - * EmployeePaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const EmployeePaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type EmployeePaginateLabelsResponse = z.infer; - -/** - * EmployeeGetPopulateParamSchema - * @type { array } - */ -export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); -export type EmployeeGetPopulateParam = z.infer; - -/** - * GetWithOfficePopulateParamSchema - * @type { array } - */ -export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); -export type GetWithOfficePopulateParam = z.infer; - -/** - * EmployeeListRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleMemberResponse[] } items - */ -export const EmployeeListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).nullable() }).partial().shape }); -export type EmployeeListRolesResponse = z.infer; - -/** - * EmployeeUpdateRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleMemberResponse[] } items - */ -export const EmployeeUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).nullable() }).partial().shape }); -export type EmployeeUpdateRolesResponse = z.infer; - -} diff --git a/test/generated/base/employee/employee.queries.ts b/test/generated/base/employee/employee.queries.ts deleted file mode 100644 index 4d934bc..0000000 --- a/test/generated/base/employee/employee.queries.ts +++ /dev/null @@ -1,469 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeeAcl } from "./employee.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeModels } from "./employee.models"; -import { EmployeeApi } from "./employee.api"; - -export namespace EmployeeQueries { -export const moduleName = QueryModule.Employee; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees", limit, order, populate, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string) => [...keys.all, "/employees", "infinite", limit, order, populate, filter, cursor] as const, - findAll: (search?: string) => [...keys.all, "/employees/labels", search] as const, - paginateLabels: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string) => [...keys.all, "/employees/labels/paginate", "infinite", limit, order, filter, cursor] as const, - get: (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam) => [...keys.all, "/employees/:employeeId", employeeId, populate] as const, - getWithOffice: (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam) => [...keys.all, "/offices/:officeId/employees/:employeeId", officeId, employeeId, populate] as const, - listRoles: (employeeId: string) => [...keys.all, "/employees/:employeeId/roles", employeeId] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Employees - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter - * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, populate, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Employees - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter - * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Employee - * @permission Requires `canUseCreate` ability - * @param { EmployeeModels.EmployeeCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmployeeAcl.canUseCreate()); - return EmployeeApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useSingeStepCreate` - * @summary Create Employee in a single step - * - requires Employee:Create for creating a global employee - * - requires Employee:Create{officeId} for creating an office employee (first office is primary) - * - requires Employment:Create{officeId} for creating office employments - * - requires Employee:UpdateRoles for setting global roles - * - requires Employee:UpdateRoles{officeId} for setting office roles - * @param { EmployeeModels.EmployeeOneStepCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useSingeStepCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - EmployeeApi.singeStepCreate(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindAll` - * @summary List all employees with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search), - queryFn: () => { - checkAcl(EmployeeAcl.canUseFindAll()); - return EmployeeApi.findAll(search) }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate employees with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate employees with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useResendOnboarding` - * @summary Resend Employee Onboarding Email - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useResendOnboarding = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => - EmployeeApi.resendOnboarding(employeeId) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useResendOnboardingWithOffice` - * @permission Requires `canUseResendOnboardingWithOffice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useResendOnboardingWithOffice = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employeeId }) => { - checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId } )); - return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGet` - * @summary Get Employee - * - allow global admins and office admins of primary office - * @permission Requires `canUseGet` ability - * @param { string } object.employeeId Path parameter - * @param { EmployeeModels.EmployeeGetPopulateParam } object.populate Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ employeeId, populate }: { employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(employeeId, populate), - queryFn: () => { - checkAcl(EmployeeAcl.canUseGet()); - return EmployeeApi.get(employeeId, populate) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Employee - * - allow global admins and office admins of primary office - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdate()); - return EmployeeApi.update(employeeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetWithOffice` - * @permission Requires `canUseGetWithOffice` ability - * @param { string } object.officeId Path parameter - * @param { string } object.employeeId Path parameter - * @param { EmployeeModels.GetWithOfficePopulateParam } object.populate Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetWithOffice = ({ officeId, employeeId, populate }: { officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getWithOffice(officeId, employeeId, populate), - queryFn: () => { - checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId } )); - return EmployeeApi.getWithOffice(officeId, employeeId, populate) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateWithOffice` - * @permission Requires `canUseUpdateWithOffice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateWithOffice = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId } )); - return EmployeeApi.updateWithOffice(officeId, employeeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, employeeId } = variables; - const updateKeys = [keys.get(employeeId), keys.getWithOffice(officeId, employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListRoles` - * @summary List Employee (global) Roles - * @permission Requires `canUseListRoles` ability - * @param { string } object.employeeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoles = ({ employeeId }: { employeeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoles(employeeId), - queryFn: () => { - checkAcl(EmployeeAcl.canUseListRoles()); - return EmployeeApi.listRoles(employeeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateRoles` - * @summary Update Employee (global) Roles - * @permission Requires `canUseUpdateRoles` ability - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeRoleMembershipsUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdateRoles()); - return EmployeeApi.updateRoles(employeeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Employee - * @permission Requires `canUseArchive` ability - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => { - checkAcl(EmployeeAcl.canUseArchive()); - return EmployeeApi.archive(employeeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Un-archive Employee - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => { - checkAcl(EmployeeAcl.canUseUnarchive()); - return EmployeeApi.unarchive(employeeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/employeeAccount/employeeAccount.api.ts b/test/generated/base/employeeAccount/employeeAccount.api.ts deleted file mode 100644 index 22e4d03..0000000 --- a/test/generated/base/employeeAccount/employeeAccount.api.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { EmployeeAccountModels } from "./employeeAccount.models"; - -export namespace EmployeeAccountApi { -export const get = () => { - return AppRestClient.get( - { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, - `/employees/account`, - - ) -}; -} diff --git a/test/generated/base/employeeAccount/employeeAccount.models.ts b/test/generated/base/employeeAccount/employeeAccount.models.ts deleted file mode 100644 index 8f21c37..0000000 --- a/test/generated/base/employeeAccount/employeeAccount.models.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeAccountModels { -/** - * EmployeeAccountEmploymentDtoSchema - * @type { object } - * @property { string } officeId Office ID - * @property { string } officeName Office name - */ -export const EmployeeAccountEmploymentDtoSchema = z.object({ officeId: z.string(), officeName: z.string() }); -export type EmployeeAccountEmploymentDto = z.infer; - -/** - * EmployeeAccountPrimaryOfficeDtoSchema - * @type { object } - * @property { string } officeId Office ID - * @property { string } officeName Office name - */ -export const EmployeeAccountPrimaryOfficeDtoSchema = z.object({ officeId: z.string(), officeName: z.string() }); -export type EmployeeAccountPrimaryOfficeDto = z.infer; - -/** - * EmployeeAccountRoleDtoSchema - * @type { object } - * @property { string } name Role name - * @property { string[] } permissions Role permissions - * @property { string } officeId Office ID - */ -export const EmployeeAccountRoleDtoSchema = z.object({ name: z.string(), permissions: z.array(z.string()), officeId: z.string().nullish() }); -export type EmployeeAccountRoleDto = z.infer; - -/** - * EmployeeAccountDtoSchema - * @type { object } - * @property { string } defaultUrl - * @property { string } costCenter - * @property { CommonModels.LocaleEnum } locale - * @property { array[] } aclRules Can hold any type of value - * @property { object } settings Employee settings keyed by setting name - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { EmployeeAccountEmploymentDto[] } employments Employments - * @property { EmployeeAccountPrimaryOfficeDto } primaryOffice Primary office - * @property { EmployeeAccountRoleDto[] } roles Roles - */ -export const EmployeeAccountDtoSchema = z.object({ defaultUrl: z.string().nullish(), costCenter: z.string().nullish(), locale: CommonModels.LocaleEnumSchema.nullish(), aclRules: z.array(z.array(z.any())), settings: z.union([z.object({}).catchall(z.any()), z.array(z.object({}).catchall(z.any())), z.string(), z.array(z.string()), z.array(z.number())]), id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), phone: z.string().nullish(), employments: z.array(EmployeeAccountEmploymentDtoSchema), primaryOffice: EmployeeAccountPrimaryOfficeDtoSchema, roles: z.array(EmployeeAccountRoleDtoSchema) }); -export type EmployeeAccountDto = z.infer; - -} diff --git a/test/generated/base/employeeAccount/employeeAccount.queries.ts b/test/generated/base/employeeAccount/employeeAccount.queries.ts deleted file mode 100644 index ad8f854..0000000 --- a/test/generated/base/employeeAccount/employeeAccount.queries.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeAccountApi } from "./employeeAccount.api"; - -export namespace EmployeeAccountQueries { -export const moduleName = QueryModule.EmployeeAccount; - -export const keys = { - all: [moduleName] as const, - get: () => [...keys.all, "/employees/account", ] as const, -}; - -/** - * Query `useGet` - * @summary Get profile of logged-in user - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.get(), - queryFn: EmployeeAccountApi.get, - ...options, - }); -}; - -} diff --git a/test/generated/base/employeePermissions/employeePermissions.acl.ts b/test/generated/base/employeePermissions/employeePermissions.acl.ts deleted file mode 100644 index 25d65ad..0000000 --- a/test/generated/base/employeePermissions/employeePermissions.acl.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace EmployeePermissionsAcl { -/** - * Use for `usePaginatePermissions` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query - */ -export const canUsePaginatePermissions = ( -) => [ - "Read", - "Permission" -] as AbilityTuple<"Read", "Permission">; - -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Permission" -] as AbilityTuple<"Read", "Permission">; - -} diff --git a/test/generated/base/employeePermissions/employeePermissions.api.ts b/test/generated/base/employeePermissions/employeePermissions.api.ts deleted file mode 100644 index d5bad68..0000000 --- a/test/generated/base/employeePermissions/employeePermissions.api.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; - -export namespace EmployeePermissionsApi { -export const paginatePermissions = (limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, - `/employees/permissions`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findAll = (search?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, - `/employees/permissions/labels`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -} diff --git a/test/generated/base/employeePermissions/employeePermissions.configs.ts b/test/generated/base/employeePermissions/employeePermissions.configs.ts deleted file mode 100644 index 50dd5bf..0000000 --- a/test/generated/base/employeePermissions/employeePermissions.configs.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; -import { EmployeePermissionsQueries } from "./employeePermissions.queries"; -import { EmployeePermissionsAcl } from "./employeePermissions.acl"; - -export namespace EmployeePermissionsConfigs { -export const permissionsConfig = { - meta: { - title: "Permissions", - }, - readAll: { - acl: EmployeePermissionsAcl.canUsePaginatePermissions, - schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, - paginated: EmployeePermissionsQueries.usePaginatePermissions, - infinite: EmployeePermissionsQueries.usePaginatePermissionsInfinite, - filters: { - schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, - options: { - inputs: { - context: true, - ids: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, - options: { - columns: { - id: true, - label: true, - group: true, - description: true, - context: true, - }, - sortable: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/employeePermissions/employeePermissions.models.ts b/test/generated/base/employeePermissions/employeePermissions.models.ts deleted file mode 100644 index 701c149..0000000 --- a/test/generated/base/employeePermissions/employeePermissions.models.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeePermissionsModels { -/** - * EmployeePermissionResponseSchema - * @type { object } - * @property { string } id Employee Permission unique identifier - * @property { string } label - * @property { string } group - * @property { string } description - * @property { string } context Scope where this rule is applied - */ -export const EmployeePermissionResponseSchema = z.object({ id: z.string(), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema }); -export type EmployeePermissionResponse = z.infer; - -/** - * EmployeePermissionFilterDtoSchema - * @type { object } - * @property { string } context Role context - * @property { string[] } ids Ids - */ -export const EmployeePermissionFilterDtoSchema = z.object({ context: CommonModels.EmployeeRoleContextSchema.nullable(), ids: z.array(z.string()).nullable() }).partial(); -export type EmployeePermissionFilterDto = z.infer; - -/** - * EmployeePermissionsPaginatePermissionsOrderParamEnumSchema - * @type { enum } - */ -export const EmployeePermissionsPaginatePermissionsOrderParamEnumSchema = z.enum(["id"]); -export type EmployeePermissionsPaginatePermissionsOrderParamEnum = z.infer; -export const EmployeePermissionsPaginatePermissionsOrderParamEnum = EmployeePermissionsPaginatePermissionsOrderParamEnumSchema.enum; - -/** - * EmployeePermissionsPaginatePermissionsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeePermissionResponse[] } items - */ -export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeePermissionResponseSchema).nullable() }).partial().shape }); -export type EmployeePermissionsPaginatePermissionsResponse = z.infer; - -/** - * EmployeePermissionsFindAllResponseSchema - * @type { array } - */ -export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type EmployeePermissionsFindAllResponse = z.infer; - -} diff --git a/test/generated/base/employeePermissions/employeePermissions.queries.ts b/test/generated/base/employeePermissions/employeePermissions.queries.ts deleted file mode 100644 index 8859611..0000000 --- a/test/generated/base/employeePermissions/employeePermissions.queries.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeePermissionsAcl } from "./employeePermissions.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; -import { EmployeePermissionsApi } from "./employeePermissions.api"; - -export namespace EmployeePermissionsQueries { -export const moduleName = QueryModule.EmployeePermissions; - -export const keys = { - all: [moduleName] as const, - paginatePermissions: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/permissions", limit, order, filter, page, cursor] as const, - paginatePermissionsInfinite: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string) => [...keys.all, "/employees/permissions", "infinite", limit, order, filter, cursor] as const, - findAll: (search?: string) => [...keys.all, "/employees/permissions/labels", search] as const, -}; - -/** - * Query `usePaginatePermissions` - * @permission Requires `canUsePaginatePermissions` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` - * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginatePermissions = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginatePermissionsInfinite - * @permission Requires `canUsePaginatePermissions` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` - * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginatePermissionsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindAll` - * @summary List all permissions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search), - queryFn: () => { - checkAcl(EmployeePermissionsAcl.canUseFindAll()); - return EmployeePermissionsApi.findAll(search) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/employeeProfile/employeeProfile.api.ts b/test/generated/base/employeeProfile/employeeProfile.api.ts deleted file mode 100644 index 745cd77..0000000 --- a/test/generated/base/employeeProfile/employeeProfile.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeProfileModels } from "./employeeProfile.models"; - -export namespace EmployeeProfileApi { -export const getProfile = () => { - return AppRestClient.get( - { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, - `/employee-profile`, - - ) -}; -export const updateProfile = (data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, - `/employee-profile`, - ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/employeeProfile/employeeProfile.models.ts b/test/generated/base/employeeProfile/employeeProfile.models.ts deleted file mode 100644 index 7e9d93e..0000000 --- a/test/generated/base/employeeProfile/employeeProfile.models.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeProfileModels { -/** - * EmployeeProfileResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } firstName Employee first name - * @property { string } lastName Employee last name - * @property { string } email Employee email - * @property { string } phone Employee phone number - * @property { string } defaultUrl Employee default URL - * @property { CommonModels.LocaleEnum } locale Employee locale - */ -export const EmployeeProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.string(), phone: z.string().nullish(), defaultUrl: z.string().nullish(), locale: CommonModels.LocaleEnumSchema.nullish() }); -export type EmployeeProfileResponseDTO = z.infer; - -/** - * UpdateEmployeeProfileRequestDTOSchema - * @type { object } - * @property { string } firstName Employee first name. Example: `John` - * @property { string } lastName Employee last name. Example: `Doe` - * @property { string } email Employee email address. Example: `john.doe@example.com` - * @property { string } phone Employee phone number. Example: `+1234567890` - * @property { string } defaultUrl Default URL for the employee profile. Example: `https://example.com` - * @property { string } costCenter Employee cost center - * @property { CommonModels.LocaleEnum } locale Employee locale preference. Example: `en-US` - */ -export const UpdateEmployeeProfileRequestDTOSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.email().nullable(), phone: z.string().nullable(), defaultUrl: z.url().nullable(), costCenter: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullable() }).partial(); -export type UpdateEmployeeProfileRequestDTO = z.infer; - -} diff --git a/test/generated/base/employeeProfile/employeeProfile.queries.ts b/test/generated/base/employeeProfile/employeeProfile.queries.ts deleted file mode 100644 index bbcee98..0000000 --- a/test/generated/base/employeeProfile/employeeProfile.queries.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeProfileModels } from "./employeeProfile.models"; -import { EmployeeProfileApi } from "./employeeProfile.api"; - -export namespace EmployeeProfileQueries { -export const moduleName = QueryModule.EmployeeProfile; - -export const keys = { - all: [moduleName] as const, - getProfile: () => [...keys.all, "/employee-profile", ] as const, -}; - -/** - * Query `useGetProfile` - * @summary Get employee profile - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetProfile = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getProfile(), - queryFn: EmployeeProfileApi.getProfile, - ...options, - }); -}; - -/** - * Mutation `useUpdateProfile` - * @summary Update employee profile - * @param { EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateProfile = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - EmployeeProfileApi.updateProfile(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.getProfile()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/employeeRoles/employeeRoles.acl.ts b/test/generated/base/employeeRoles/employeeRoles.acl.ts deleted file mode 100644 index a64e698..0000000 --- a/test/generated/base/employeeRoles/employeeRoles.acl.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmployeeRolesAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List all possible roles - * @param { string } object.context context from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { context?: string, } -) => [ - "Read", - object ? subject("Role", object) : "Role" -] as AbilityTuple<"Read", "Role" | ForcedSubject<"Role"> & { context?: string, }>; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Role" -] as AbilityTuple<"Create", "Role">; - -/** - * Use for `useLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLabels` query - */ -export const canUseLabels = ( -) => [ - "Read", - "Role" -] as AbilityTuple<"Read", "Role">; - -/** - * Use for `useFind` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query - */ -export const canUseFind = ( -) => [ - "Read", - "Role" -] as AbilityTuple<"Read", "Role">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Role" -] as AbilityTuple<"Update", "Role">; - -/** - * Use for `useDeleteEmployeesRolesByRoleId` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteEmployeesRolesByRoleId` mutation - */ -export const canUseDeleteEmployeesRolesByRoleId = ( -) => [ - "Delete", - "Role" -] as AbilityTuple<"Delete", "Role">; - -/** - * Use for `usePaginatePermissions` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query - */ -export const canUsePaginatePermissions = ( -) => [ - "Read", - "Role" -] as AbilityTuple<"Read", "Role">; - -/** - * Use for `useTogglePermission` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTogglePermission` mutation - */ -export const canUseTogglePermission = ( -) => [ - "Update", - "Role" -] as AbilityTuple<"Update", "Role">; - -/** - * Use for `useCopy` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopy` mutation - */ -export const canUseCopy = ( -) => [ - "Create", - "Role" -] as AbilityTuple<"Create", "Role">; - -} diff --git a/test/generated/base/employeeRoles/employeeRoles.api.ts b/test/generated/base/employeeRoles/employeeRoles.api.ts deleted file mode 100644 index 2139057..0000000 --- a/test/generated/base/employeeRoles/employeeRoles.api.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeRolesApi { -export const list = (limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, - `/employees/roles`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, ) => { - return AppRestClient.post( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), - - ) -}; -export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, ) => { - return AppRestClient.get( - { resSchema: EmployeeRolesModels.LabelsResponseSchema }, - `/employees/roles/labels`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { type: "query", name: "context" }), - }, - } - ) -}; -export const find = (roleId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}`, - - ) -}; -export const update = (roleId: string, data: EmployeeRolesModels.EmployeeRoleUpdateRequest, ) => { - return AppRestClient.put( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), - - ) -}; -export const deleteEmployeesRolesByRoleId = (roleId: string, ) => { - return AppRestClient.delete( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/employees/roles/${roleId}`, - - ) -}; -export const paginatePermissions = (roleId: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, - `/employees/roles/${roleId}/permissions`, - - ) -}; -export const togglePermission = (roleId: string, permission: string, data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/employees/roles/${roleId}/permissions/${permission}/toggle`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), - - ) -}; -export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}/copy`, - ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/employeeRoles/employeeRoles.configs.ts b/test/generated/base/employeeRoles/employeeRoles.configs.ts deleted file mode 100644 index 4e0b998..0000000 --- a/test/generated/base/employeeRoles/employeeRoles.configs.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeRolesQueries } from "./employeeRoles.queries"; -import { EmployeeRolesAcl } from "./employeeRoles.acl"; - -export namespace EmployeeRolesConfigs { -export const rolesConfig = { - meta: { - title: "Roles", - }, - readAll: { - acl: EmployeeRolesAcl.canUseList, - schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, - paginated: EmployeeRolesQueries.useList, - infinite: EmployeeRolesQueries.useListInfinite, - filters: { - schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, - options: { - inputs: { - name: true, - context: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, - options: { - columns: { - id: true, - name: true, - color: true, - description: true, - context: true, - permissions: true, - numberOfUsers: true, - }, - sortable: EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: EmployeeRolesAcl.canUseFind, - schema: CommonModels.EmployeeRoleResponseSchema, - query: EmployeeRolesQueries.useFind, - }, - create: { - acl: EmployeeRolesAcl.canUseCreate, - schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, - mutation: EmployeeRolesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, - options: { - inputs: { - name: true, - color: true, - description: true, - context: true, - permissions: true, - }, - }, -}) - }, - update: { - acl: EmployeeRolesAcl.canUseUpdate, - schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, - mutation: EmployeeRolesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, - options: { - inputs: { - name: true, - color: true, - description: true, - }, - }, -}) - }, - delete: { - acl: EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId, - mutation: EmployeeRolesQueries.useDeleteEmployeesRolesByRoleId, - }, -}; - -} diff --git a/test/generated/base/employeeRoles/employeeRoles.models.ts b/test/generated/base/employeeRoles/employeeRoles.models.ts deleted file mode 100644 index f7b3720..0000000 --- a/test/generated/base/employeeRoles/employeeRoles.models.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeRolesModels { -/** - * EmployeeRoleListItemResponseSchema - * @type { object } - * @property { string } id Unique identifier of the role - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string } context Role context - * @property { string[] } permissions Permissions associated with the role - * @property { number } numberOfUsers Number of users associated with the role - */ -export const EmployeeRoleListItemResponseSchema = z.object({ id: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.nullish(), permissions: z.array(z.string()), numberOfUsers: z.number() }); -export type EmployeeRoleListItemResponse = z.infer; - -/** - * EmployeeRolePaginationFilterDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } context Role context - * @property { string } search - */ -export const EmployeeRolePaginationFilterDtoSchema = z.object({ name: z.string().nullable(), context: CommonModels.EmployeeRoleContextSchema.nullable(), search: z.string().nullable() }).partial(); -export type EmployeeRolePaginationFilterDto = z.infer; - -/** - * EmployeeRoleCreateRequestSchema - * @type { object } - * @property { string } name Name of the role - * @property { string } color Color of the role - * @property { string } description Color of the role - * @property { string } context Role context - * - office or global - * @property { string[] } permissions Permission IDs associated with the role - * can only be either office or global. Default: `` - */ -export const EmployeeRoleCreateRequestSchema = z.object({ name: z.string(), color: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema, permissions: z.array(z.string()).default([]) }); -export type EmployeeRoleCreateRequest = z.infer; - -/** - * EmployeeRolePermissionDtoSchema - * @type { object } - * @property { string } id Employee Permission unique identifier - * @property { string } label - * @property { string } group - * @property { string } description - * @property { string } context Scope where this rule is applied - * @property { boolean } enabled - */ -export const EmployeeRolePermissionDtoSchema = z.object({ id: z.string(), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema, enabled: z.boolean() }); -export type EmployeeRolePermissionDto = z.infer; - -/** - * EmployeeRoleUpdateRequestSchema - * @type { object } - * @property { string } name Role Id - * @property { string } color Role Color - * @property { string } description Role Description - */ -export const EmployeeRoleUpdateRequestSchema = z.object({ name: z.string(), color: z.string(), description: z.string() }); -export type EmployeeRoleUpdateRequest = z.infer; - -/** - * EmployeeRoleTogglePermissionRequestSchema - * @type { object } - * @property { boolean } toggled Turn the permission on or off - */ -export const EmployeeRoleTogglePermissionRequestSchema = z.object({ toggled: z.boolean() }); -export type EmployeeRoleTogglePermissionRequest = z.infer; - -/** - * CopyEmployeeRoleDtoSchema - * @type { object } - * @property { string } newRoleName - */ -export const CopyEmployeeRoleDtoSchema = z.object({ newRoleName: z.string() }); -export type CopyEmployeeRoleDto = z.infer; - -/** - * EmployeeRolesListOrderParamEnumSchema - * @type { enum } - */ -export const EmployeeRolesListOrderParamEnumSchema = z.enum(["name", "numberOfUsers"]); -export type EmployeeRolesListOrderParamEnum = z.infer; -export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSchema.enum; - -/** - * EmployeeRolesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleListItemResponse[] } items - */ -export const EmployeeRolesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).nullable() }).partial().shape }); -export type EmployeeRolesListResponse = z.infer; - -/** - * LabelsResponseSchema - * @type { array } - */ -export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type LabelsResponse = z.infer; - -/** - * EmployeeRolesPaginatePermissionsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRolePermissionDto[] } items - */ -export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).nullable() }).partial().shape }); -export type EmployeeRolesPaginatePermissionsResponse = z.infer; - -} diff --git a/test/generated/base/employeeRoles/employeeRoles.queries.ts b/test/generated/base/employeeRoles/employeeRoles.queries.ts deleted file mode 100644 index c726a38..0000000 --- a/test/generated/base/employeeRoles/employeeRoles.queries.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeeRolesAcl } from "./employeeRoles.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeRolesApi } from "./employeeRoles.api"; - -export namespace EmployeeRolesQueries { -export const moduleName = QueryModule.EmployeeRoles; - -export const keys = { - all: [moduleName] as const, - list: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/roles", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string) => [...keys.all, "/employees/roles", "infinite", limit, order, filter, cursor] as const, - labels: (search?: string, context?: CommonModels.EmployeeRoleContext) => [...keys.all, "/employees/roles/labels", search, context] as const, - find: (roleId: string) => [...keys.all, "/employees/roles/:roleId", roleId] as const, - paginatePermissions: (roleId: string) => [...keys.all, "/employees/roles/:roleId/permissions", roleId] as const, -}; - -/** - * Query `useList` - * @summary Paginate Employee Role Definitions - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` - * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary Paginate Employee Role Definitions - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` - * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Employee Role Definition - * @permission Requires `canUseCreate` ability - * @param { EmployeeRolesModels.EmployeeRoleCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmployeeRolesAcl.canUseCreate()); - return EmployeeRolesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useLabels` - * @summary List all employee roles with only their labels - * @permission Requires `canUseLabels` ability - * @param { string } object.search Query parameter - * @param { CommonModels.EmployeeRoleContext } object.context Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useLabels = ({ search, context }: { search?: string, context?: CommonModels.EmployeeRoleContext }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.labels(search, context), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseLabels()); - return EmployeeRolesApi.labels(search, context) }, - ...options, - }); -}; - -/** - * Query `useFind` - * @summary Get Employee Role Definition - * @permission Requires `canUseFind` ability - * @param { string } object.roleId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFind = ({ roleId }: { roleId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.find(roleId), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseFind()); - return EmployeeRolesApi.find(roleId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Employee Role Definition - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.roleId Path parameter - * @param { EmployeeRolesModels.EmployeeRoleUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, data }) => { - checkAcl(EmployeeRolesAcl.canUseUpdate()); - return EmployeeRolesApi.update(roleId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { roleId } = variables; - const updateKeys = [keys.find(roleId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteEmployeesRolesByRoleId` - * @summary Delete Employee Role Definition - * @permission Requires `canUseDeleteEmployeesRolesByRoleId` ability - * @param { string } mutation.roleId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteEmployeesRolesByRoleId = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId }) => { - checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); - return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginatePermissions` - * @summary Get All Employee Role Definition Permissions - * - convenience endpoint to expand the permissions of a role - * - only returns the enabled permissions - * @permission Requires `canUsePaginatePermissions` ability - * @param { string } object.roleId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginatePermissions = ({ roleId }: { roleId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginatePermissions(roleId), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); - return EmployeeRolesApi.paginatePermissions(roleId) }, - ...options, - }); -}; - -/** - * Mutation `useTogglePermission` - * @summary Toggle Employee Role Definition Permission - * @permission Requires `canUseTogglePermission` ability - * @param { string } mutation.roleId Path parameter - * @param { string } mutation.permission Path parameter - * @param { EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useTogglePermission = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, permission, data }) => { - checkAcl(EmployeeRolesAcl.canUseTogglePermission()); - return EmployeeRolesApi.togglePermission(roleId, permission, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopy` - * @summary Copy Employee Role Definition - * @permission Requires `canUseCopy` ability - * @param { string } mutation.roleId Path parameter - * @param { EmployeeRolesModels.CopyEmployeeRoleDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, data }) => { - checkAcl(EmployeeRolesAcl.canUseCopy()); - return EmployeeRolesApi.copy(roleId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { roleId } = variables; - const updateKeys = [keys.find(roleId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/employeeSettings/employeeSettings.api.ts b/test/generated/base/employeeSettings/employeeSettings.api.ts deleted file mode 100644 index 2c14abc..0000000 --- a/test/generated/base/employeeSettings/employeeSettings.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeSettingsModels } from "./employeeSettings.models"; - -export namespace EmployeeSettingsApi { -export const getAll = () => { - return AppRestClient.get( - { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, - `/employees/settings`, - - ) -}; -export const update = (key: string, data: EmployeeSettingsModels.UpdateEmployeeSettingDto, ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/employees/settings/${key}`, - ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/employeeSettings/employeeSettings.models.ts b/test/generated/base/employeeSettings/employeeSettings.models.ts deleted file mode 100644 index fd4ad3a..0000000 --- a/test/generated/base/employeeSettings/employeeSettings.models.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { z } from "zod"; - -export namespace EmployeeSettingsModels { -/** - * EmployeeSettingsResponseDtoSchema - * @type { object } - * @property { object } settings Map of all settings for the employee - */ -export const EmployeeSettingsResponseDtoSchema = z.object({ settings: z.union([z.object({}).catchall(z.any()), z.array(z.object({}).catchall(z.any())), z.string(), z.array(z.string()), z.array(z.number())]) }); -export type EmployeeSettingsResponseDto = z.infer; - -/** - * UpdateEmployeeSettingDtoSchema - * @type { object } - * @property { object } value The value to store for the setting. If null, the setting will be deleted. - */ -export const UpdateEmployeeSettingDtoSchema = z.object({ value: z.union([z.object({}).catchall(z.any()), z.array(z.unknown()), z.string(), z.number(), z.boolean()]).nullable() }).partial(); -export type UpdateEmployeeSettingDto = z.infer; - -} diff --git a/test/generated/base/employeeSettings/employeeSettings.queries.ts b/test/generated/base/employeeSettings/employeeSettings.queries.ts deleted file mode 100644 index 7d4d3a7..0000000 --- a/test/generated/base/employeeSettings/employeeSettings.queries.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeSettingsModels } from "./employeeSettings.models"; -import { EmployeeSettingsApi } from "./employeeSettings.api"; - -export namespace EmployeeSettingsQueries { -export const moduleName = QueryModule.EmployeeSettings; - -export const keys = { - all: [moduleName] as const, - getAll: () => [...keys.all, "/employees/settings", ] as const, -}; - -/** - * Query `useGetAll` - * @summary Get all employee settings - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetAll = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getAll(), - queryFn: EmployeeSettingsApi.getAll, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update employee setting - * @param { string } mutation.key Path parameter - * @param { EmployeeSettingsModels.UpdateEmployeeSettingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ key, data }) => - EmployeeSettingsApi.update(key, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/employment/employment.acl.ts b/test/generated/base/employment/employment.acl.ts deleted file mode 100644 index bbcaf77..0000000 --- a/test/generated/base/employment/employment.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmploymentAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create new employment - * @param { string } object.officeId officeId from mutation data - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List employments - * @param { string } object.officeId officeId from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId?: string, } -) => [ - "Read", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Read", "Employment" | ForcedSubject<"Employment"> & { officeId?: string, }>; - -/** - * Use for `useListRoles` query ability. For global ability, omit the object parameter. - * @description List employment roles - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query - */ -export const canUseListRoles = ( - object?: { officeId: string, } -) => [ - "ListRoles", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"ListRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useUpdateRoles` mutation ability. For global ability, omit the object parameter. - * @description Update employment roles - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation - */ -export const canUseUpdateRoles = ( - object?: { officeId: string, } -) => [ - "UpdateRoles", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"UpdateRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Archive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Unarchive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -} diff --git a/test/generated/base/employment/employment.api.ts b/test/generated/base/employment/employment.api.ts deleted file mode 100644 index f50e03e..0000000 --- a/test/generated/base/employment/employment.api.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; -import { EmploymentModels } from "./employment.models"; - -export namespace EmploymentApi { -export const create = (data: EmploymentModels.EmploymentCreateRequest, ) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/employees/employments`, - ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), - - ) -}; -export const list = (limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: EmploymentModels.EmploymentListResponseSchema }, - `/employees/employments`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listRoles = (officeId: string, employmentId: string, ) => { - return AppRestClient.get( - { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/roles`, - - ) -}; -export const updateRoles = (officeId: string, employmentId: string, data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, ) => { - return AppRestClient.put( - { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/roles`, - ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), - - ) -}; -export const update = (officeId: string, employmentId: string, data: EmploymentModels.UpdateEmploymentRequestDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}`, - ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), - - ) -}; -export const archive = (officeId: string, employmentId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/archive`, - - ) -}; -export const unarchive = (officeId: string, employmentId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/employment/employment.configs.ts b/test/generated/base/employment/employment.configs.ts deleted file mode 100644 index b8525a4..0000000 --- a/test/generated/base/employment/employment.configs.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { EmploymentModels } from "./employment.models"; -import { EmploymentQueries } from "./employment.queries"; -import { EmploymentAcl } from "./employment.acl"; - -export namespace EmploymentConfigs { -export const employmentsConfig = { - meta: { - title: "Employments", - }, - readAll: { - acl: EmploymentAcl.canUseList, - schema: CommonModels.EmploymentResponseSchema, - paginated: EmploymentQueries.useList, - infinite: EmploymentQueries.useListInfinite, - filters: { - schema: EmploymentModels.EmploymentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmploymentModels.EmploymentFilterDtoSchema, - options: { - inputs: { - officeId: true, - employeeId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.EmploymentResponseSchema, - options: { - columns: { - id: true, - officeId: true, - office: true, - employeeId: true, - employee: true, - archived: true, - costCenter: true, - roles: true, - }, - sortable: EmploymentModels.EmploymentListOrderParamEnumSchema, - }, -}), - }, - create: { - acl: EmploymentAcl.canUseCreate, - schema: EmploymentModels.EmploymentCreateRequestSchema, - mutation: EmploymentQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmploymentModels.EmploymentCreateRequestSchema, - options: { - inputs: { - officeId: true, - employeeId: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/base/employment/employment.models.ts b/test/generated/base/employment/employment.models.ts deleted file mode 100644 index 151a915..0000000 --- a/test/generated/base/employment/employment.models.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmploymentModels { -/** - * EmploymentCreateRequestSchema - * @type { object } - * @property { string } officeId - * @property { string } employeeId - */ -export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }); -export type EmploymentCreateRequest = z.infer; - -/** - * EmploymentFilterDtoSchema - * @type { object } - * @property { string } officeId Office IDs - * @property { string } employeeId Employee IDs - */ -export const EmploymentFilterDtoSchema = z.object({ officeId: z.string().nullable(), employeeId: z.string().nullable() }).partial(); -export type EmploymentFilterDto = z.infer; - -/** - * EmploymentRoleMemberResponseSchema - * @type { object } - * @property { string } roleId - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string[] } permissions Permissions associated with the role - */ -export const EmploymentRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), permissions: z.array(z.string()) }); -export type EmploymentRoleMemberResponse = z.infer; - -/** - * EmploymentRoleMembershipsUpdateRequestSchema - * @type { object } - * @property { string[] } roleIds Array of role IDs - */ -export const EmploymentRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()) }); -export type EmploymentRoleMembershipsUpdateRequest = z.infer; - -/** - * UpdateEmploymentRequestDtoSchema - * @type { object } - * @property { string } costCenter - * @property { string[] } roleIds - */ -export const UpdateEmploymentRequestDtoSchema = z.object({ costCenter: z.string().nullable(), roleIds: z.array(z.string()).nullable() }).partial(); -export type UpdateEmploymentRequestDto = z.infer; - -/** - * EmploymentListOrderParamEnumSchema - * @type { enum } - */ -export const EmploymentListOrderParamEnumSchema = z.enum(["officeId", "createdAt"]); -export type EmploymentListOrderParamEnum = z.infer; -export const EmploymentListOrderParamEnum = EmploymentListOrderParamEnumSchema.enum; - -/** - * EmploymentPaginationPopulateFieldsSchema - * @type { enum } - */ -export const EmploymentPaginationPopulateFieldsSchema = z.enum(["office", "employee"]); -export type EmploymentPaginationPopulateFields = z.infer; -export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFieldsSchema.enum; - -/** - * EmploymentListPopulateParamSchema - * @type { array } - */ -export const EmploymentListPopulateParamSchema = z.array(EmploymentPaginationPopulateFieldsSchema).nullish(); -export type EmploymentListPopulateParam = z.infer; - -/** - * EmploymentListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.EmploymentResponse[] } items - */ -export const EmploymentListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.EmploymentResponseSchema).nullable() }).partial().shape }); -export type EmploymentListResponse = z.infer; - -/** - * EmploymentListRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmploymentRoleMemberResponse[] } items - */ -export const EmploymentListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).nullable() }).partial().shape }); -export type EmploymentListRolesResponse = z.infer; - -/** - * EmploymentUpdateRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmploymentRoleMemberResponse[] } items - */ -export const EmploymentUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).nullable() }).partial().shape }); -export type EmploymentUpdateRolesResponse = z.infer; - -} diff --git a/test/generated/base/employment/employment.queries.ts b/test/generated/base/employment/employment.queries.ts deleted file mode 100644 index bc84e99..0000000 --- a/test/generated/base/employment/employment.queries.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmploymentAcl } from "./employment.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmploymentModels } from "./employment.models"; -import { EmploymentApi } from "./employment.api"; - -export namespace EmploymentQueries { -export const moduleName = QueryModule.Employment; - -export const keys = { - all: [moduleName] as const, - list: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/employments", limit, order, populate, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string) => [...keys.all, "/employees/employments", "infinite", limit, order, populate, filter, cursor] as const, - listRoles: (officeId: string, employmentId: string) => [...keys.all, "/offices/:officeId/employments/:employmentId/roles", officeId, employmentId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create new employment - * @permission Requires `canUseCreate` ability - * @param { EmploymentModels.EmploymentCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmploymentAcl.canUseCreate()); - return EmploymentApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useList` - * @summary List Employments - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` - * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter - * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, populate, filter, page, cursor), - queryFn: () => { - checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List Employments - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` - * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter - * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, populate, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListRoles` - * @summary List Employments Roles - * @permission Requires `canUseListRoles` ability - * @param { string } object.officeId Path parameter - * @param { string } object.employmentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoles = ({ officeId, employmentId }: { officeId: string, employmentId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoles(officeId, employmentId), - queryFn: () => { - checkAcl(EmploymentAcl.canUseListRoles({ officeId } )); - return EmploymentApi.listRoles(officeId, employmentId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateRoles` - * @summary Update Employment Roles - * @permission Requires `canUseUpdateRoles` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { EmploymentModels.EmploymentRoleMembershipsUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId, data }) => { - checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId } )); - return EmploymentApi.updateRoles(officeId, employmentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { EmploymentModels.UpdateEmploymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId, data }) => { - checkAcl(EmploymentAcl.canUseUpdate({ officeId } )); - return EmploymentApi.update(officeId, employmentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Employment - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId }) => { - checkAcl(EmploymentAcl.canUseArchive({ officeId } )); - return EmploymentApi.archive(officeId, employmentId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Un-archive Employment - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId }) => { - checkAcl(EmploymentAcl.canUseUnarchive({ officeId } )); - return EmploymentApi.unarchive(officeId, employmentId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/factoringExport/factoringExport.acl.ts b/test/generated/base/factoringExport/factoringExport.acl.ts deleted file mode 100644 index cc07635..0000000 --- a/test/generated/base/factoringExport/factoringExport.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace FactoringExportAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create factoring export - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Create", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -/** - * Use for `useGetBatch` query ability. For global ability, omit the object parameter. - * @description Read factoring export - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query - */ -export const canUseGetBatch = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -} diff --git a/test/generated/base/factoringExport/factoringExport.api.ts b/test/generated/base/factoringExport/factoringExport.api.ts deleted file mode 100644 index 7ade703..0000000 --- a/test/generated/base/factoringExport/factoringExport.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { FactoringExportModels } from "./factoringExport.models"; - -export namespace FactoringExportApi { -export const create = (officeId: string, data: FactoringExportModels.CreateFactoringExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-exports`, - ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), - - ) -}; -export const getBatch = (batchId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-exports/${batchId}`, - - ) -}; -} diff --git a/test/generated/base/factoringExport/factoringExport.models.ts b/test/generated/base/factoringExport/factoringExport.models.ts deleted file mode 100644 index d2b90ac..0000000 --- a/test/generated/base/factoringExport/factoringExport.models.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { z } from "zod"; - -export namespace FactoringExportModels { -/** - * FactoringExportBatchStatusEnumSchema - * @type { enum } - */ -export const FactoringExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Failed"]); -export type FactoringExportBatchStatusEnum = z.infer; -export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSchema.enum; - -/** - * FactoringExportBatchResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { FactoringExportBatchStatusEnum } status - * @property { number } totalInvoices - * @property { number } totalAmount - * @property { string } currencyNotation - * @property { string } jobId - * @property { string } eurFileUrl - * @property { string } usdFileUrl - * @property { string } createdById - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } exportedAt - */ -export const FactoringExportBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringExportBatchStatusEnumSchema, totalInvoices: z.number(), totalAmount: z.number(), currencyNotation: z.string(), jobId: z.string().nullish(), eurFileUrl: z.string().nullish(), usdFileUrl: z.string().nullish(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish() }); -export type FactoringExportBatchResponseDto = z.infer; - -/** - * CreateFactoringExportRequestDtoSchema - * @type { object } - * @property { string } invoiceDateFrom Invoice date from - * @property { string } invoiceDateUntil Invoice date until - */ -export const CreateFactoringExportRequestDtoSchema = z.object({ invoiceDateFrom: z.iso.datetime({ offset: true }), invoiceDateUntil: z.iso.datetime({ offset: true }) }); -export type CreateFactoringExportRequestDto = z.infer; - -} diff --git a/test/generated/base/factoringExport/factoringExport.queries.ts b/test/generated/base/factoringExport/factoringExport.queries.ts deleted file mode 100644 index f73fe09..0000000 --- a/test/generated/base/factoringExport/factoringExport.queries.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { FactoringExportAcl } from "./factoringExport.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FactoringExportModels } from "./factoringExport.models"; -import { FactoringExportApi } from "./factoringExport.api"; - -export namespace FactoringExportQueries { -export const moduleName = QueryModule.FactoringExport; - -export const keys = { - all: [moduleName] as const, - getBatch: (batchId: string, officeId: string) => [...keys.all, "/offices/:officeId/factoring-exports/:batchId", batchId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Generate factoring export files for Raiffeisen Factor Bank - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { FactoringExportModels.CreateFactoringExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(FactoringExportAcl.canUseCreate({ officeId } )); - return FactoringExportApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetBatch` - * @summary Get factoring export batch status - * @permission Requires `canUseGetBatch` ability - * @param { string } object.batchId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBatch = ({ batchId, officeId }: { batchId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBatch(batchId, officeId), - queryFn: () => { - checkAcl(FactoringExportAcl.canUseGetBatch({ officeId } )); - return FactoringExportApi.getBatch(batchId, officeId) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/factoringMerge/factoringMerge.acl.ts b/test/generated/base/factoringMerge/factoringMerge.acl.ts deleted file mode 100644 index 208ed2f..0000000 --- a/test/generated/base/factoringMerge/factoringMerge.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace FactoringMergeAcl { -/** - * Use for `usePrepareUpload` mutation ability. For global ability, omit the object parameter. - * @description Prepare factoring merge upload - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareUpload` mutation - */ -export const canUsePrepareUpload = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -/** - * Use for `useProcessMerge` mutation ability. For global ability, omit the object parameter. - * @description Process factoring merge - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useProcessMerge` mutation - */ -export const canUseProcessMerge = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -/** - * Use for `useGetMergeBatch` query ability. For global ability, omit the object parameter. - * @description Read merge batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMergeBatch` query - */ -export const canUseGetMergeBatch = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -} diff --git a/test/generated/base/factoringMerge/factoringMerge.api.ts b/test/generated/base/factoringMerge/factoringMerge.api.ts deleted file mode 100644 index 1a42dec..0000000 --- a/test/generated/base/factoringMerge/factoringMerge.api.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { FactoringMergeModels } from "./factoringMerge.models"; - -export namespace FactoringMergeApi { -export const prepareUpload = (officeId: string, data: FactoringMergeModels.PrepareFactoringMergeRequestDto, ) => { - return AppRestClient.post( - { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/prepare-upload`, - ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), - - ) -}; -export const processMerge = (officeId: string, batchId: string, ) => { - return AppRestClient.post( - { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/${batchId}/process`, - - ) -}; -export const getMergeBatch = (officeId: string, batchId: string, ) => { - return AppRestClient.get( - { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/${batchId}`, - - ) -}; -} diff --git a/test/generated/base/factoringMerge/factoringMerge.models.ts b/test/generated/base/factoringMerge/factoringMerge.models.ts deleted file mode 100644 index 9d720a4..0000000 --- a/test/generated/base/factoringMerge/factoringMerge.models.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { z } from "zod"; - -export namespace FactoringMergeModels { -/** - * FileMetadataDtoSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType File MIME type - * @property { number } fileSize File size in bytes. Minimum: `1` - */ -export const FileMetadataDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number().gte(1) }); -export type FileMetadataDto = z.infer; - -/** - * PrepareFactoringMergeRequestDtoSchema - * @type { object } - * @property { FileMetadataDto } eurDebtorFile EUR debtor file metadata - * @property { FileMetadataDto } eurOperationsFile EUR operations file metadata - * @property { FileMetadataDto } eurExistingFactoringFile EUR existing factoring file metadata (optional) - * @property { FileMetadataDto } usdDebtorFile USD debtor file metadata - * @property { FileMetadataDto } usdOperationsFile USD operations file metadata - * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) - */ -export const PrepareFactoringMergeRequestDtoSchema = z.object({ eurDebtorFile: FileMetadataDtoSchema, eurOperationsFile: FileMetadataDtoSchema, eurExistingFactoringFile: FileMetadataDtoSchema.nullish(), usdDebtorFile: FileMetadataDtoSchema, usdOperationsFile: FileMetadataDtoSchema, usdExistingFactoringFile: FileMetadataDtoSchema.nullish() }); -export type PrepareFactoringMergeRequestDto = z.infer; - -/** - * MediaUploadInstructionsDtoSchema - * @type { object } - * @property { string } id - * @property { string } method - * @property { string } url - */ -export const MediaUploadInstructionsDtoSchema = z.object({ id: z.string(), method: z.string(), url: z.string() }); -export type MediaUploadInstructionsDto = z.infer; - -/** - * FactoringMergeUploadInstructionsResponseDtoSchema - * @type { object } - * @property { string } batchId - * @property { MediaUploadInstructionsDto } eurDebtorFile - * @property { MediaUploadInstructionsDto } eurOperationsFile - * @property { MediaUploadInstructionsDto } eurExistingFactoringFile - * @property { MediaUploadInstructionsDto } usdDebtorFile - * @property { MediaUploadInstructionsDto } usdOperationsFile - * @property { MediaUploadInstructionsDto } usdExistingFactoringFile - */ -export const FactoringMergeUploadInstructionsResponseDtoSchema = z.object({ batchId: z.string(), eurDebtorFile: MediaUploadInstructionsDtoSchema, eurOperationsFile: MediaUploadInstructionsDtoSchema, eurExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), usdDebtorFile: MediaUploadInstructionsDtoSchema, usdOperationsFile: MediaUploadInstructionsDtoSchema, usdExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish() }); -export type FactoringMergeUploadInstructionsResponseDto = z.infer; - -/** - * FactoringMergeBatchStatusEnumSchema - * @type { enum } - */ -export const FactoringMergeBatchStatusEnumSchema = z.enum(["Initializing", "Processing", "Completed", "Failed"]); -export type FactoringMergeBatchStatusEnum = z.infer; -export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema.enum; - -/** - * FactoringMergeBatchResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { FactoringMergeBatchStatusEnum } status - * @property { string } eurDebtorFileMediaId - * @property { string } eurOperationsFileMediaId - * @property { string } eurExistingFactoringFileMediaId - * @property { string } usdDebtorFileMediaId - * @property { string } usdOperationsFileMediaId - * @property { string } usdExistingFactoringFileMediaId - * @property { string } eurResultFileMediaId - * @property { string } eurResultFileUrl - * @property { string } usdResultFileMediaId - * @property { string } usdResultFileUrl - * @property { string } jobId - * @property { string } errorMessage - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } completedAt - */ -export const FactoringMergeBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringMergeBatchStatusEnumSchema, eurDebtorFileMediaId: z.string(), eurOperationsFileMediaId: z.string(), eurExistingFactoringFileMediaId: z.string().nullish(), usdDebtorFileMediaId: z.string(), usdOperationsFileMediaId: z.string(), usdExistingFactoringFileMediaId: z.string().nullish(), eurResultFileMediaId: z.string().nullish(), eurResultFileUrl: z.string().nullish(), usdResultFileMediaId: z.string().nullish(), usdResultFileUrl: z.string().nullish(), jobId: z.string().nullish(), errorMessage: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), completedAt: z.iso.datetime({ offset: true }).nullish() }); -export type FactoringMergeBatchResponseDto = z.infer; - -} diff --git a/test/generated/base/factoringMerge/factoringMerge.queries.ts b/test/generated/base/factoringMerge/factoringMerge.queries.ts deleted file mode 100644 index 9e1e382..0000000 --- a/test/generated/base/factoringMerge/factoringMerge.queries.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { FactoringMergeAcl } from "./factoringMerge.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FactoringMergeModels } from "./factoringMerge.models"; -import { FactoringMergeApi } from "./factoringMerge.api"; - -export namespace FactoringMergeQueries { -export const moduleName = QueryModule.FactoringMerge; - -export const keys = { - all: [moduleName] as const, - getMergeBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/factoring-merge/:batchId", officeId, batchId] as const, -}; - -/** - * Mutation `usePrepareUpload` - * @summary Prepare upload instructions for MOVE files merge - * @permission Requires `canUsePrepareUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { FactoringMergeModels.PrepareFactoringMergeRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const usePrepareUpload = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId } )); - return FactoringMergeApi.prepareUpload(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useProcessMerge` - * @summary Start processing the merge batch - * @permission Requires `canUseProcessMerge` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useProcessMerge = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId } )); - return FactoringMergeApi.processMerge(officeId, batchId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, batchId } = variables; - const updateKeys = [keys.getMergeBatch(officeId, batchId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetMergeBatch` - * @summary Get merge batch status - * @permission Requires `canUseGetMergeBatch` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, default] - */ -export const useGetMergeBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getMergeBatch(officeId, batchId), - queryFn: () => { - checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId } )); - return FactoringMergeApi.getMergeBatch(officeId, batchId) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/files/files.api.ts b/test/generated/base/files/files.api.ts deleted file mode 100644 index 62289b9..0000000 --- a/test/generated/base/files/files.api.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { FilesModels } from "./files.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace FilesApi { -export const createUpload = (officeId: string, folderId: string, data: FilesModels.CreateFileRequestDTO, ) => { - return AppRestClient.post( - { resSchema: FilesModels.FileUploadResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}/files`, - ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), - - ) -}; -export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/files/eml`, - ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const rename = (officeId: string, fileId: string, data: FilesModels.RenameFileRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.FileResponseDTOSchema }, - `/offices/${officeId}/files/${fileId}`, - ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), - - ) -}; -export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/move`, - ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - - ) -}; -export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/copy`, - ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - - ) -}; -export const archive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/archive`, - ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - - ) -}; -export const unarchive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/unarchive`, - ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/files/files.models.ts b/test/generated/base/files/files.models.ts deleted file mode 100644 index 2ac873f..0000000 --- a/test/generated/base/files/files.models.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { z } from "zod"; - -export namespace FilesModels { -/** - * CreateFileRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } mimeType - * @property { number } fileSize Minimum: `0` - */ -export const CreateFileRequestDTOSchema = z.object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }); -export type CreateFileRequestDTO = z.infer; - -/** - * FileUploadResponseDTOSchema - * @type { object } - * @property { string } fileId - * @property { string } method - * @property { string } url - */ -export const FileUploadResponseDTOSchema = z.object({ fileId: z.string(), method: z.string(), url: z.string() }); -export type FileUploadResponseDTO = z.infer; - -/** - * GetFilesEmlRequestDTOSchema - * @type { object } - * @property { string[] } ids Min Items: `1` - */ -export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).min(1) }); -export type GetFilesEmlRequestDTO = z.infer; - -/** - * RenameFileRequestDTOSchema - * @type { object } - * @property { string } name - */ -export const RenameFileRequestDTOSchema = z.object({ name: z.string() }); -export type RenameFileRequestDTO = z.infer; - -/** - * MoveFilesRequestDTOSchema - * @type { object } - * @property { string[] } fileIds Min Items: `1` - * @property { string } targetFolderId - */ -export const MoveFilesRequestDTOSchema = z.object({ fileIds: z.array(z.string()).min(1), targetFolderId: z.string() }); -export type MoveFilesRequestDTO = z.infer; - -/** - * SetFilesArchivedRequestDTOSchema - * @type { object } - * @property { string[] } ids Min Items: `1` - */ -export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).min(1) }); -export type SetFilesArchivedRequestDTO = z.infer; - -} diff --git a/test/generated/base/files/files.queries.ts b/test/generated/base/files/files.queries.ts deleted file mode 100644 index 6e53863..0000000 --- a/test/generated/base/files/files.queries.ts +++ /dev/null @@ -1,210 +0,0 @@ -import axios, { } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FilesModels } from "./files.models"; -import { FilesApi } from "./files.api"; - -export namespace FilesQueries { -export const moduleName = QueryModule.Files; - - - -/** - * Mutation `useCreateUpload` - * @summary Create file upload instructions - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { FilesModels.CreateFileRequestDTO } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { - const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGetEml` - recommended when file should not be cached - * @summary Get files as EML file with attachments - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.GetFilesEmlRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.getEml(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRename` - * @summary Rename file - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.fileId Path parameter - * @param { FilesModels.RenameFileRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useRename = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, fileId, data }) => - FilesApi.rename(officeId, fileId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMove` - * @summary Move files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useMove = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.move(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopy` - * @summary Copy files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.copy(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.archive(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.unarchive(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/folders/folders.api.ts b/test/generated/base/folders/folders.api.ts deleted file mode 100644 index b4cd844..0000000 --- a/test/generated/base/folders/folders.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { FoldersModels } from "./folders.models"; - -export namespace FoldersApi { -export const getTree = (officeId: string, folderId: string, ) => { - return AppRestClient.get( - { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}/tree`, - - ) -}; -export const getContent = (officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}`, - { - params: { - order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const rename = (officeId: string, folderId: string, data: FoldersModels.RenameFolderRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}`, - ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), - - ) -}; -export const deleteFolder = (officeId: string, folderId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/folders/${folderId}`, - - ) -}; -export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, ) => { - return AppRestClient.post( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders`, - ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), - - ) -}; -export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/folders/move`, - ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/folders/folders.models.ts b/test/generated/base/folders/folders.models.ts deleted file mode 100644 index 5ca5dda..0000000 --- a/test/generated/base/folders/folders.models.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace FoldersModels { -/** - * TargetEntityNameEnumSchema - * @type { enum } - */ -export const TargetEntityNameEnumSchema = z.enum(["invoice", "quote"]); -export type TargetEntityNameEnum = z.infer; -export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; - -/** - * FolderSymlinkResponseDTOSchema - * @type { object } - * @property { string } targetEntityName - * @property { string } targetEntityId - */ -export const FolderSymlinkResponseDTOSchema = z.object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }); -export type FolderSymlinkResponseDTO = z.infer; - -/** - * FolderTreeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } isSystem - * @property { boolean } isSymlink - * @property { FolderSymlinkResponseDTO } symlink - * @property { FolderTreeResponseDTO[] } folders - */ -export const FolderTreeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), get folders() { return z.array(FolderTreeResponseDTOSchema) } }); -export type FolderTreeResponseDTO = z.infer; - -/** - * FolderResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } archived - * @property { boolean } isSystem - * @property { boolean } isSymlink - * @property { FolderSymlinkResponseDTO } symlink - * @property { string } createdAt - * @property { string } updatedAt - * @property { CommonModels.FolderEmployeeDTO } createdBy - * @property { CommonModels.FolderEmployeeDTO } updatedBy - * @property { CommonModels.FileResponseDTO[] } files - * @property { FolderResponseDTO[] } folders - */ -export const FolderResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, files: z.array(CommonModels.FileResponseDTOSchema), get folders() { return z.array(FolderResponseDTOSchema) } }); -export type FolderResponseDTO = z.infer; - -/** - * FolderContentFilterDtoSchema - * @type { object } - * @property { boolean } archived When omitted, both archived and unarchived files are returned. - */ -export const FolderContentFilterDtoSchema = z.object({ archived: z.boolean().nullable() }).partial(); -export type FolderContentFilterDto = z.infer; - -/** - * CreateFolderRequestDTOSchema - * @type { object } - * @property { string } parentFolderId - * @property { string } name - */ -export const CreateFolderRequestDTOSchema = z.object({ parentFolderId: z.string(), name: z.string() }); -export type CreateFolderRequestDTO = z.infer; - -/** - * RenameFolderRequestDTOSchema - * @type { object } - * @property { string } name - */ -export const RenameFolderRequestDTOSchema = z.object({ name: z.string() }); -export type RenameFolderRequestDTO = z.infer; - -/** - * MoveFoldersRequestDTOSchema - * @type { object } - * @property { string[] } folderIds Min Items: `1` - * @property { string } targetFolderId - */ -export const MoveFoldersRequestDTOSchema = z.object({ folderIds: z.array(z.string()).min(1), targetFolderId: z.string() }); -export type MoveFoldersRequestDTO = z.infer; - -/** - * GetContentOrderParamSchema - * @type { array } - * @description Example: `name` - */ -export const GetContentOrderParamSchema = z.array(z.string()).nullish(); -export type GetContentOrderParam = z.infer; - -} diff --git a/test/generated/base/folders/folders.queries.ts b/test/generated/base/folders/folders.queries.ts deleted file mode 100644 index 0174720..0000000 --- a/test/generated/base/folders/folders.queries.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FoldersModels } from "./folders.models"; -import { FoldersApi } from "./folders.api"; - -export namespace FoldersQueries { -export const moduleName = QueryModule.Folders; - -export const keys = { - all: [moduleName] as const, - getTree: (officeId: string, folderId: string) => [...keys.all, "/offices/:officeId/folders/:folderId/tree", officeId, folderId] as const, - getContent: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", officeId, folderId, limit, order, filter, page, cursor] as const, - getContentInfinite: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", "infinite", officeId, folderId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useGetTree` - * @summary Get folder tree - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetTree = ({ officeId, folderId }: { officeId: string, folderId: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getTree(officeId, folderId), - queryFn: () => - FoldersApi.getTree(officeId, folderId), - ...options, - }); -}; - -/** - * Query `useGetContent` - * @summary Get folder content - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetContent = ({ officeId, folderId, limit, order, filter, page, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), - queryFn: () => - FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `useGetContentInfinite - * @summary Get folder content - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetContentInfinite = ({ officeId, folderId, limit, order, filter, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => - FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useRename` - * @summary Rename folder - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { FoldersModels.RenameFolderRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useRename = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, folderId, data }) => - FoldersApi.rename(officeId, folderId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteFolder` - * @summary Delete folder - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteFolder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, folderId }) => - FoldersApi.deleteFolder(officeId, folderId) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create folder - * @param { string } mutation.officeId Path parameter - * @param { FoldersModels.CreateFolderRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FoldersApi.create(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMove` - * @summary Move folders - * @param { string } mutation.officeId Path parameter - * @param { FoldersModels.MoveFoldersRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useMove = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FoldersApi.move(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/hsCodes/hsCodes.acl.ts b/test/generated/base/hsCodes/hsCodes.acl.ts deleted file mode 100644 index 3e48e9d..0000000 --- a/test/generated/base/hsCodes/hsCodes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace HsCodesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "HsCode" -] as AbilityTuple<"Read", "HsCode">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "HsCode" -] as AbilityTuple<"Create", "HsCode">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "HsCode" -] as AbilityTuple<"Read", "HsCode">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "HsCode" -] as AbilityTuple<"Read", "HsCode">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "HsCode" -] as AbilityTuple<"Update", "HsCode">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "HsCode" -] as AbilityTuple<"Archive", "HsCode">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "HsCode" -] as AbilityTuple<"Archive", "HsCode">; - -} diff --git a/test/generated/base/hsCodes/hsCodes.api.ts b/test/generated/base/hsCodes/hsCodes.api.ts deleted file mode 100644 index 59dece6..0000000 --- a/test/generated/base/hsCodes/hsCodes.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { HsCodesModels } from "./hsCodes.models"; - -export namespace HsCodesApi { -export const paginate = (limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, - `/hs-codes`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, ) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes`, - ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, - `/hs-codes/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}`, - - ) -}; -export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}`, - ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/hsCodes/hsCodes.configs.ts b/test/generated/base/hsCodes/hsCodes.configs.ts deleted file mode 100644 index 5b005a1..0000000 --- a/test/generated/base/hsCodes/hsCodes.configs.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { HsCodesModels } from "./hsCodes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { HsCodesQueries } from "./hsCodes.queries"; -import { HsCodesAcl } from "./hsCodes.acl"; - -export namespace HsCodesConfigs { -export const hsCodesConfig = { - meta: { - title: "Hs Codes", - }, - readAll: { - acl: HsCodesAcl.canUsePaginate, - schema: HsCodesModels.HsCodeResponseDTOSchema, - paginated: HsCodesQueries.usePaginate, - infinite: HsCodesQueries.usePaginateInfinite, - filters: { - schema: HsCodesModels.HsCodePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: HsCodesModels.HsCodePaginationFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: HsCodesModels.HsCodeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - description: true, - customArea: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: HsCodesModels.HsCodesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: HsCodesAcl.canUseFindById, - schema: HsCodesModels.HsCodeResponseDTOSchema, - query: HsCodesQueries.useFindById, - }, - create: { - acl: HsCodesAcl.canUseCreate, - schema: HsCodesModels.CreateHsCodeRequestDTOSchema, - mutation: HsCodesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: HsCodesModels.CreateHsCodeRequestDTOSchema, - options: { - inputs: { - name: true, - description: true, - customArea: true, - }, - }, -}) - }, - update: { - acl: HsCodesAcl.canUseUpdate, - schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, - mutation: HsCodesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, - options: { - inputs: { - name: true, - description: true, - customArea: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: HsCodesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: HsCodesQueries.usePaginateLabels, - infinite: HsCodesQueries.usePaginateLabelsInfinite, - filters: { - schema: HsCodesModels.HsCodeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: HsCodesModels.HsCodeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/hsCodes/hsCodes.models.ts b/test/generated/base/hsCodes/hsCodes.models.ts deleted file mode 100644 index a2d7cf2..0000000 --- a/test/generated/base/hsCodes/hsCodes.models.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace HsCodesModels { -/** - * HsCodeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type HsCodeEmployeeDTO = z.infer; - -/** - * HsCodeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the HS Code - * @property { string } name Name of the HS Code - * @property { string } description Description of the HS Code - * @property { string } customArea Custom area associated with the HS Code - * @property { boolean } archived Indicates if the HS Code is archived - * @property { string } createdById - * @property { HsCodeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { HsCodeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const HsCodeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), description: z.string(), customArea: z.string(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: HsCodeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: HsCodeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type HsCodeResponseDTO = z.infer; - -/** - * HsCodePaginationFilterDtoSchema - * @type { object } - * @property { boolean } archived Archived status - * @property { string } search - */ -export const HsCodePaginationFilterDtoSchema = z.object({ archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); -export type HsCodePaginationFilterDto = z.infer; - -/** - * HsCodeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const HsCodeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type HsCodeLabelFilterDto = z.infer; - -/** - * CreateHsCodeRequestDTOSchema - * @type { object } - * @property { string } name Unique name for the HS Code - * @property { string } description Description of the HS Code - * @property { string } customArea Custom area associated with the HS Code - */ -export const CreateHsCodeRequestDTOSchema = z.object({ name: z.string(), description: z.string(), customArea: z.string() }); -export type CreateHsCodeRequestDTO = z.infer; - -/** - * UpdateHsCodeRequestDTOSchema - * @type { object } - * @property { string } name Updated name of the HS Code. - * @property { string } description Updated description of the HS Code. - * @property { string } customArea Updated custom area associated with the HS Code. - */ -export const UpdateHsCodeRequestDTOSchema = z.object({ name: z.string().nullable(), description: z.string().nullable(), customArea: z.string().nullable() }).partial(); -export type UpdateHsCodeRequestDTO = z.infer; - -/** - * HsCodesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const HsCodesPaginateOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type HsCodesPaginateOrderParamEnum = z.infer; -export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema.enum; - -/** - * HsCodesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { HsCodeResponseDTO[] } items - */ -export const HsCodesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(HsCodeResponseDTOSchema).nullable() }).partial().shape }); -export type HsCodesPaginateResponse = z.infer; - -/** - * HsCodesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const HsCodesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type HsCodesPaginateLabelsOrderParamEnum = z.infer; -export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * HsCodesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const HsCodesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type HsCodesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/hsCodes/hsCodes.queries.ts b/test/generated/base/hsCodes/hsCodes.queries.ts deleted file mode 100644 index 5722f0d..0000000 --- a/test/generated/base/hsCodes/hsCodes.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { HsCodesAcl } from "./hsCodes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { HsCodesModels } from "./hsCodes.models"; -import { HsCodesApi } from "./hsCodes.api"; - -export namespace HsCodesQueries { -export const moduleName = QueryModule.HsCodes; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string) => [...keys.all, "/hs-codes", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/hs-codes/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate HS Codes - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate HS Codes - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new HS Code - * @permission Requires `canUseCreate` ability - * @param { HsCodesModels.CreateHsCodeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(HsCodesAcl.canUseCreate()); - return HsCodesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate HS codes with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate HS codes with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get HS Code Details by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(HsCodesAcl.canUseFindById()); - return HsCodesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update an existing HS Code - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { HsCodesModels.UpdateHsCodeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(HsCodesAcl.canUseUpdate()); - return HsCodesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive an HS Code - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(HsCodesAcl.canUseArchive()); - return HsCodesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive an HS Code - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(HsCodesAcl.canUseUnarchive()); - return HsCodesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/integrationChannels/integrationChannels.acl.ts b/test/generated/base/integrationChannels/integrationChannels.acl.ts deleted file mode 100644 index de4ba2a..0000000 --- a/test/generated/base/integrationChannels/integrationChannels.acl.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace IntegrationChannelsAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List integration channels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Create", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Read integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useTestConnection` mutation ability. For global ability, omit the object parameter. - * @description Test integration channel connection - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTestConnection` mutation - */ -export const canUseTestConnection = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useListMessages` query ability. For global ability, omit the object parameter. - * @description List integration channel messages - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListMessages` query - */ -export const canUseListMessages = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("IntegrationMessage", object) : "IntegrationMessage" -] as AbilityTuple<"Read", "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, }>; - -} diff --git a/test/generated/base/integrationChannels/integrationChannels.api.ts b/test/generated/base/integrationChannels/integrationChannels.api.ts deleted file mode 100644 index 0835e70..0000000 --- a/test/generated/base/integrationChannels/integrationChannels.api.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; - -export namespace IntegrationChannelsApi { -export const list = (officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, - `/offices/${officeId}/integration-channels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, ) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels`, - ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), - - ) -}; -export const findById = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}`, - - ) -}; -export const update = (officeId: string, id: string, data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, ) => { - return AppRestClient.patch( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}`, - ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), - - ) -}; -export const archive = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/archive`, - - ) -}; -export const unarchive = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/unarchive`, - - ) -}; -export const testConnection = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/test-connection`, - - ) -}; -export const listMessages = (officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, - `/offices/${officeId}/integration-channels/${id}/messages`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/base/integrationChannels/integrationChannels.configs.ts b/test/generated/base/integrationChannels/integrationChannels.configs.ts deleted file mode 100644 index 1b6f063..0000000 --- a/test/generated/base/integrationChannels/integrationChannels.configs.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; -import { IntegrationChannelsQueries } from "./integrationChannels.queries"; -import { IntegrationChannelsAcl } from "./integrationChannels.acl"; - -export namespace IntegrationChannelsConfigs { -export const integrationChannelsConfig = { - meta: { - title: "Integration Channels", - }, - readAll: { - acl: IntegrationChannelsAcl.canUseList, - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - paginated: IntegrationChannelsQueries.useList, - infinite: IntegrationChannelsQueries.useListInfinite, - filters: { - schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - options: { - columns: { - id: true, - officeId: true, - businessPartnerId: true, - businessPartner: true, - employeeId: true, - name: true, - archived: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - lastPolledAt: true, - createdAt: true, - createdById: true, - createdBy: true, - updatedAt: true, - updatedById: true, - updatedBy: true, - }, - sortable: IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: IntegrationChannelsAcl.canUseFindById, - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - query: IntegrationChannelsQueries.useFindById, - }, - create: { - acl: IntegrationChannelsAcl.canUseCreate, - schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, - mutation: IntegrationChannelsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, - options: { - inputs: { - businessPartnerId: true, - employeeId: true, - name: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - sftpPassword: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - }, - }, -}) - }, - update: { - acl: IntegrationChannelsAcl.canUseUpdate, - schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, - mutation: IntegrationChannelsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, - options: { - inputs: { - businessPartnerId: true, - employeeId: true, - name: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - sftpPassword: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - }, - }, -}) - }, -}; - -export const messagesConfig = { - meta: { - title: "Messages", - }, - readAll: { - acl: IntegrationChannelsAcl.canUseListMessages, - schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, - paginated: IntegrationChannelsQueries.useListMessages, - infinite: IntegrationChannelsQueries.useListMessagesInfinite, - filters: { - schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, - options: { - inputs: { - direction: true, - format: true, - status: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, - options: { - columns: { - id: true, - integrationChannelId: true, - positionId: true, - positionNumber: true, - direction: true, - format: true, - status: true, - rawContent: true, - fileName: true, - errorMessage: true, - processedAt: true, - sentAt: true, - createdAt: true, - }, - sortable: IntegrationChannelsModels.ListMessagesOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/integrationChannels/integrationChannels.models.ts b/test/generated/base/integrationChannels/integrationChannels.models.ts deleted file mode 100644 index 543e8a7..0000000 --- a/test/generated/base/integrationChannels/integrationChannels.models.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace IntegrationChannelsModels { -/** - * IntegrationChannelBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const IntegrationChannelBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type IntegrationChannelBusinessPartnerResponseDto = z.infer; - -/** - * IntegrationChannelEmployeeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const IntegrationChannelEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type IntegrationChannelEmployeeResponseDto = z.infer; - -/** - * IntegrationChannelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } businessPartnerId - * @property { IntegrationChannelBusinessPartnerResponseDto } businessPartner - * @property { string } employeeId - * @property { string } name - * @property { boolean } archived - * @property { string } sftpHost - * @property { number } sftpPort - * @property { string } sftpUsername - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes - * @property { string } lastPolledAt - * @property { string } createdAt - * @property { string } createdById - * @property { IntegrationChannelEmployeeResponseDto } createdBy - * @property { string } updatedAt - * @property { string } updatedById - * @property { IntegrationChannelEmployeeResponseDto } updatedBy - */ -export const IntegrationChannelResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), businessPartnerId: z.string(), businessPartner: IntegrationChannelBusinessPartnerResponseDtoSchema, employeeId: z.string(), name: z.string(), archived: z.boolean(), sftpHost: z.string(), sftpPort: z.number(), sftpUsername: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number(), lastPolledAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), createdById: z.string(), createdBy: IntegrationChannelEmployeeResponseDtoSchema, updatedAt: z.iso.datetime({ offset: true }), updatedById: z.string(), updatedBy: IntegrationChannelEmployeeResponseDtoSchema }); -export type IntegrationChannelResponseDto = z.infer; - -/** - * IntegrationMessageDirectionEnumSchema - * @type { enum } - */ -export const IntegrationMessageDirectionEnumSchema = z.enum(["Inbound", "Outbound"]); -export type IntegrationMessageDirectionEnum = z.infer; -export const IntegrationMessageDirectionEnum = IntegrationMessageDirectionEnumSchema.enum; - -/** - * IntegrationMessageFormatEnumSchema - * @type { enum } - */ -export const IntegrationMessageFormatEnumSchema = z.enum(["IFTMBF", "IFTMBC"]); -export type IntegrationMessageFormatEnum = z.infer; -export const IntegrationMessageFormatEnum = IntegrationMessageFormatEnumSchema.enum; - -/** - * IntegrationMessageStatusEnumSchema - * @type { enum } - */ -export const IntegrationMessageStatusEnumSchema = z.enum(["Received", "Processed", "Failed", "Sent"]); -export type IntegrationMessageStatusEnum = z.infer; -export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.enum; - -/** - * IntegrationMessageFilterDtoSchema - * @type { object } - * @property { IntegrationMessageDirectionEnum } direction - * @property { IntegrationMessageFormatEnum } format - * @property { IntegrationMessageStatusEnum } status - * @property { string } search - */ -export const IntegrationMessageFilterDtoSchema = z.object({ direction: IntegrationMessageDirectionEnumSchema.nullable(), format: IntegrationMessageFormatEnumSchema.nullable(), status: IntegrationMessageStatusEnumSchema.nullable(), search: z.string().nullable() }).partial(); -export type IntegrationMessageFilterDto = z.infer; - -/** - * IntegrationChannelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const IntegrationChannelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type IntegrationChannelFilterDto = z.infer; - -/** - * CreateIntegrationChannelRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } employeeId - * @property { string } name - * @property { string } sftpHost - * @property { number } sftpPort Minimum: `1`. Maximum: `65535` - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes Minimum: `1` - */ -export const CreateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string(), employeeId: z.string(), name: z.string(), sftpHost: z.string(), sftpPort: z.number().gte(1).lte(65535), sftpUsername: z.string(), sftpPassword: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number().gte(1) }); -export type CreateIntegrationChannelRequestDto = z.infer; - -/** - * UpdateIntegrationChannelRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } employeeId - * @property { string } name - * @property { string } sftpHost - * @property { number } sftpPort Minimum: `1`. Maximum: `65535` - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes Minimum: `1` - */ -export const UpdateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string().nullable(), employeeId: z.string().nullable(), name: z.string().nullable(), sftpHost: z.string().nullable(), sftpPort: z.number().gte(1).lte(65535).nullable(), sftpUsername: z.string().nullable(), sftpPassword: z.string().nullable(), inboundPath: z.string().nullable(), outboundPath: z.string().nullable(), pollingFrequencyMinutes: z.number().gte(1).nullable() }).partial(); -export type UpdateIntegrationChannelRequestDto = z.infer; - -/** - * TestConnectionResponseDtoSchema - * @type { object } - * @property { boolean } success - */ -export const TestConnectionResponseDtoSchema = z.object({ success: z.boolean() }); -export type TestConnectionResponseDto = z.infer; - -/** - * IntegrationMessageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } integrationChannelId - * @property { string } positionId - * @property { string } positionNumber - * @property { string } direction - * @property { string } format - * @property { string } status - * @property { string } rawContent - * @property { string } fileName - * @property { string } errorMessage - * @property { string } processedAt - * @property { string } sentAt - * @property { string } createdAt - */ -export const IntegrationMessageResponseDtoSchema = z.object({ id: z.string(), integrationChannelId: z.string(), positionId: z.string().nullish(), positionNumber: z.string().nullish(), direction: z.string(), format: z.string(), status: z.string(), rawContent: z.string(), fileName: z.string(), errorMessage: z.string().nullish(), processedAt: z.iso.datetime({ offset: true }).nullish(), sentAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }) }); -export type IntegrationMessageResponseDto = z.infer; - -/** - * IntegrationChannelsListOrderParamEnumSchema - * @type { enum } - */ -export const IntegrationChannelsListOrderParamEnumSchema = z.enum(["createdAt", "name", "businessPartner", "lastPolledAt"]); -export type IntegrationChannelsListOrderParamEnum = z.infer; -export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrderParamEnumSchema.enum; - -/** - * IntegrationChannelsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { IntegrationChannelResponseDto[] } items - */ -export const IntegrationChannelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).nullable() }).partial().shape }); -export type IntegrationChannelsListResponse = z.infer; - -/** - * ListMessagesOrderParamEnumSchema - * @type { enum } - */ -export const ListMessagesOrderParamEnumSchema = z.enum(["createdAt", "status", "direction", "format"]); -export type ListMessagesOrderParamEnum = z.infer; -export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; - -/** - * ListMessagesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { IntegrationMessageResponseDto[] } items - */ -export const ListMessagesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).nullable() }).partial().shape }); -export type ListMessagesResponse = z.infer; - -} diff --git a/test/generated/base/integrationChannels/integrationChannels.queries.ts b/test/generated/base/integrationChannels/integrationChannels.queries.ts deleted file mode 100644 index 1f37862..0000000 --- a/test/generated/base/integrationChannels/integrationChannels.queries.ts +++ /dev/null @@ -1,302 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { IntegrationChannelsAcl } from "./integrationChannels.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; -import { IntegrationChannelsApi } from "./integrationChannels.api"; - -export namespace IntegrationChannelsQueries { -export const moduleName = QueryModule.IntegrationChannels; - -export const keys = { - all: [moduleName] as const, - list: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/integration-channels/:id", officeId, id] as const, - listMessages: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", officeId, id, limit, order, filter, page, cursor] as const, - listMessagesInfinite: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", "infinite", officeId, id, limit, order, filter, cursor] as const, -}; - -/** - * Query `useList` - * @summary List integration channels for an office - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); - return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List integration channels for an office - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); - return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create integration channel - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { IntegrationChannelsModels.CreateIntegrationChannelRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId } )); - return IntegrationChannelsApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get integration channel by id - * @permission Requires `canUseFindById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(officeId, id), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId } )); - return IntegrationChannelsApi.findById(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update integration channel by id - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId } )); - return IntegrationChannelsApi.update(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive integration channel by id - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId } )); - return IntegrationChannelsApi.archive(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive integration channel by id - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId } )); - return IntegrationChannelsApi.unarchive(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useTestConnection` - * @summary Test integration channel SFTP connection - * @permission Requires `canUseTestConnection` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useTestConnection = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId } )); - return IntegrationChannelsApi.testConnection(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListMessages` - * @summary Paginate integration channel messages - * @permission Requires `canUseListMessages` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListMessages = ({ officeId, id, limit, order, filter, page, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListMessagesInfinite - * @summary Paginate integration channel messages - * @permission Requires `canUseListMessages` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListMessagesInfinite = ({ officeId, id, limit, order, filter, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts deleted file mode 100644 index 81c9083..0000000 --- a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InttraOfficeIntegrationAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Read", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -} diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts deleted file mode 100644 index 7bed21a..0000000 --- a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.api.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; - -export namespace InttraOfficeIntegrationApi { -export const get = (officeId: string, ) => { - return AppRestClient.get( - { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - - ) -}; -export const generate = (officeId: string, ) => { - return AppRestClient.post( - { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - - ) -}; -export const update = (officeId: string, data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts deleted file mode 100644 index 635c0a5..0000000 --- a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.models.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { z } from "zod"; - -export namespace InttraOfficeIntegrationModels { -/** - * OfficeInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } rotatedByUserId - * @property { string } officeId - * @property { string } sftpUsername - * @property { string } sftpPublicKey - * @property { string } partnerCode - * @property { string } ediId - * @property { string } notificationEmail - */ -export const OfficeInttraCredentialsResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string().nullish(), officeId: z.string(), sftpUsername: z.string().nullish(), sftpPublicKey: z.string().nullish(), partnerCode: z.string().nullish(), ediId: z.string().nullish(), notificationEmail: z.string().nullish() }); -export type OfficeInttraCredentialsResponseDto = z.infer; - -/** - * GenerateInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } publicKey - * @property { string } rotatedAt - * @property { string } rotatedByUserId - */ -export const GenerateInttraCredentialsResponseDtoSchema = z.object({ publicKey: z.string(), rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }); -export type GenerateInttraCredentialsResponseDto = z.infer; - -/** - * UpdateInttraCredentialsRequestDtoSchema - * @type { object } - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } partnerCode - * @property { string } ediId - * @property { string } notificationEmail - */ -export const UpdateInttraCredentialsRequestDtoSchema = z.object({ sftpUsername: z.string().nullable(), sftpPassword: z.string().nullable(), partnerCode: z.string().nullable(), ediId: z.string().nullable(), notificationEmail: z.string().nullable() }).partial(); -export type UpdateInttraCredentialsRequestDto = z.infer; - -/** - * UpdateInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } rotatedAt - * @property { string } rotatedByUserId - */ -export const UpdateInttraCredentialsResponseDtoSchema = z.object({ rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }); -export type UpdateInttraCredentialsResponseDto = z.infer; - -} diff --git a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts b/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts deleted file mode 100644 index 78b7dc4..0000000 --- a/test/generated/base/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InttraOfficeIntegrationAcl } from "./inttraOfficeIntegration.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; -import { InttraOfficeIntegrationApi } from "./inttraOfficeIntegration.api"; - -export namespace InttraOfficeIntegrationQueries { -export const moduleName = QueryModule.InttraOfficeIntegration; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string) => [...keys.all, "/offices/:officeId/inttra/credentials", officeId] as const, -}; - -/** - * Query `useGet` - * @summary Get INTTRA credentials for an office - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId }: { officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId), - queryFn: () => { - checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId } )); - return InttraOfficeIntegrationApi.get(officeId) }, - ...options, - }); -}; - -/** - * Mutation `useGenerate` - * @summary Generate and persist INTTRA SFTP RSA key pair for an office - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId }) => { - checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId } )); - return InttraOfficeIntegrationApi.generate(officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Manually update INTTRA credentials (username/password/passphrase) - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId } )); - return InttraOfficeIntegrationApi.update(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts deleted file mode 100644 index 268366c..0000000 --- a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InttraShippingInstructionMessagesAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List SI messages - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create SI message - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -/** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Get SI message details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update SI message - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts deleted file mode 100644 index 66b0aa8..0000000 --- a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; - -export namespace InttraShippingInstructionMessagesApi { -export const list = (officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, ) => { - return AppRestClient.get( - { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, - { - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - filter: ZodExtended.parse(InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - }, - } - ) -}; -export const create = (officeId: string, positionId: string, shippingInstructionsId: string, data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, ) => { - return AppRestClient.post( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, - ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), - - ) -}; -export const getById = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, ) => { - return AppRestClient.get( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - - ) -}; -export const update = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts deleted file mode 100644 index fbb3b0b..0000000 --- a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; -import { InttraShippingInstructionMessagesQueries } from "./inttraShippingInstructionMessages.queries"; -import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; - -export namespace InttraShippingInstructionMessagesConfigs { -export const messagesConfig = { - meta: { - title: "Messages", - }, - readAll: { - acl: InttraShippingInstructionMessagesAcl.canUseList, - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, - paginated: InttraShippingInstructionMessagesQueries.useList, - infinite: InttraShippingInstructionMessagesQueries.useListInfinite, - filters: { - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, - options: { - inputs: { - status: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, - options: { - columns: { - id: true, - createdAt: true, - updatedAt: true, - shippingInstructionsId: true, - positionId: true, - createdByUserId: true, - status: true, - fileName: true, - sftpPath: true, - sentAt: true, - uploadAttemptCount: true, - lastUploadError: true, - notes: true, - contrlStatus: true, - contrlReceivedAt: true, - contrlRaw: true, - aperakStatus: true, - aperakReceivedAt: true, - aperakRaw: true, - }, - }, -}), - }, - read: { - acl: InttraShippingInstructionMessagesAcl.canUseGetById, - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema, - query: InttraShippingInstructionMessagesQueries.useGetById, - }, - create: { - acl: InttraShippingInstructionMessagesAcl.canUseCreate, - schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, - mutation: InttraShippingInstructionMessagesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, - options: { - inputs: { - isAmendment: true, - }, - }, -}) - }, - update: { - acl: InttraShippingInstructionMessagesAcl.canUseUpdate, - schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, - mutation: InttraShippingInstructionMessagesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, - options: { - inputs: { - notes: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts deleted file mode 100644 index 6e252f5..0000000 --- a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InttraShippingInstructionMessagesModels { -/** - * InttraShippingInstructionStatusEnumSchema - * @type { enum } - */ -export const InttraShippingInstructionStatusEnumSchema = z.enum(["PendingUpload", "Uploaded", "ContrlAccepted", "ContrlRejected", "AperakAccepted", "AperakRejected", "FailedUpload"]); -export type InttraShippingInstructionStatusEnum = z.infer; -export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStatusEnumSchema.enum; - -/** - * ShippingInstructionMessageListItemResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } shippingInstructionsId - * @property { string } positionId - * @property { string } createdByUserId - * @property { InttraShippingInstructionStatusEnum } status - * @property { string } fileName - * @property { string } sftpPath - * @property { string } sentAt - * @property { number } uploadAttemptCount - * @property { string } lastUploadError - * @property { string } notes - * @property { string } contrlStatus - * @property { string } contrlReceivedAt - * @property { string } contrlRaw - * @property { string } aperakStatus - * @property { string } aperakReceivedAt - * @property { string } aperakRaw - */ -export const ShippingInstructionMessageListItemResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }); -export type ShippingInstructionMessageListItemResponseDto = z.infer; - -/** - * ShippingInstructionMessageFilterDtoSchema - * @type { object } - * @property { InttraShippingInstructionStatusEnum[] } status - */ -export const ShippingInstructionMessageFilterDtoSchema = z.object({ status: z.array(InttraShippingInstructionStatusEnumSchema).nullable() }).partial(); -export type ShippingInstructionMessageFilterDto = z.infer; - -/** - * ShippingInstructionMessageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } shippingInstructionsId - * @property { string } positionId - * @property { string } createdByUserId - * @property { InttraShippingInstructionStatusEnum } status - * @property { object } shippingInstructionSnapshot - * @property { string } renderedRequestPayload - * @property { string } fileName - * @property { string } sftpPath - * @property { string } sentAt - * @property { number } uploadAttemptCount - * @property { string } lastUploadError - * @property { string } notes - * @property { string } contrlStatus - * @property { string } contrlReceivedAt - * @property { string } contrlRaw - * @property { string } aperakStatus - * @property { string } aperakReceivedAt - * @property { string } aperakRaw - */ -export const ShippingInstructionMessageResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, shippingInstructionSnapshot: z.object({}), renderedRequestPayload: z.string(), fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }); -export type ShippingInstructionMessageResponseDto = z.infer; - -/** - * UpdateShippingInstructionMessageRequestDtoSchema - * @type { object } - * @property { string } notes - */ -export const UpdateShippingInstructionMessageRequestDtoSchema = z.object({ notes: z.string().nullable() }).partial(); -export type UpdateShippingInstructionMessageRequestDto = z.infer; - -/** - * CreateShippingInstructionMessageRequestDtoSchema - * @type { object } - * @property { boolean } isAmendment Default: `false` - */ -export const CreateShippingInstructionMessageRequestDtoSchema = z.object({ isAmendment: z.boolean().nullable().default(false) }).partial(); -export type CreateShippingInstructionMessageRequestDto = z.infer; - -/** - * InttraShippingInstructionMessagesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ShippingInstructionMessageListItemResponseDto[] } items - */ -export const InttraShippingInstructionMessagesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ShippingInstructionMessageListItemResponseDtoSchema).nullable() }).partial().shape }); -export type InttraShippingInstructionMessagesListResponse = z.infer; - -} diff --git a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts b/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts deleted file mode 100644 index 410de3d..0000000 --- a/test/generated/base/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; -import { InttraShippingInstructionMessagesApi } from "./inttraShippingInstructionMessages.api"; - -export namespace InttraShippingInstructionMessagesQueries { -export const moduleName = QueryModule.InttraShippingInstructionMessages; - -export const keys = { - all: [moduleName] as const, - list: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", officeId, positionId, shippingInstructionsId, limit, page, cursor, filter] as const, - listInfinite: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", "infinite", officeId, positionId, shippingInstructionsId, limit, cursor, filter] as const, - getById: (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages/:messageId", officeId, positionId, shippingInstructionsId, messageId] as const, -}; - -/** - * Query `useList` - * @summary List Inttra shipping instruction messages for a position/BL instructions - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, positionId, shippingInstructionsId, limit, page, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), - queryFn: () => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); - return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List Inttra shipping instruction messages for a position/BL instructions - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, positionId, shippingInstructionsId, limit, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), - queryFn: ({ pageParam }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); - return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, pageParam, cursor, filter) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Inttra shipping instruction message - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.shippingInstructionsId Path parameter - * @param { InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId } )); - return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetById` - * @summary Get Inttra shipping instruction message details - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { string } object.messageId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ officeId, positionId, shippingInstructionsId, messageId }: { officeId: string, positionId: string, shippingInstructionsId: string, messageId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), - queryFn: () => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId } )); - return InttraShippingInstructionMessagesApi.getById(officeId, positionId, shippingInstructionsId, messageId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Inttra shipping instruction message - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.shippingInstructionsId Path parameter - * @param { string } mutation.messageId Path parameter - * @param { InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId } )); - return InttraShippingInstructionMessagesApi.update(officeId, positionId, shippingInstructionsId, messageId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, shippingInstructionsId, messageId } = variables; - const updateKeys = [keys.getById(officeId, positionId, shippingInstructionsId, messageId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/invoicePayments/invoicePayments.acl.ts b/test/generated/base/invoicePayments/invoicePayments.acl.ts deleted file mode 100644 index e3061ca..0000000 --- a/test/generated/base/invoicePayments/invoicePayments.acl.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InvoicePaymentsAcl { -/** - * Use for `useListOfficePayments` query ability. For global ability, omit the object parameter. - * @description List office payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListOfficePayments` query - */ -export const canUseListOfficePayments = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useBulkCreatePayments` mutation ability. For global ability, omit the object parameter. - * @description Bulk create invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useBulkCreatePayments` mutation - */ -export const canUseBulkCreatePayments = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCalculatePayments` mutation ability. For global ability, omit the object parameter. - * @description Calculate invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCalculatePayments` mutation - */ -export const canUseCalculatePayments = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportOfficePayments` mutation ability. For global ability, omit the object parameter. - * @description Export office invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportOfficePayments` mutation - */ -export const canUseExportOfficePayments = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("InvoicePayment", object) : "InvoicePayment" -] as AbilityTuple<"Export", "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetPaymentById` query ability. For global ability, omit the object parameter. - * @description Create invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPaymentById` query - */ -export const canUseGetPaymentById = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useDeleteInvoicePayment` mutation ability. For global ability, omit the object parameter. - * @description Delete invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoicePayment` mutation - */ -export const canUseDeleteInvoicePayment = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/base/invoicePayments/invoicePayments.api.ts b/test/generated/base/invoicePayments/invoicePayments.api.ts deleted file mode 100644 index b19c0f4..0000000 --- a/test/generated/base/invoicePayments/invoicePayments.api.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; - -export namespace InvoicePaymentsApi { -export const listOfficePayments = (officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, - `/offices/${officeId}/payments`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const bulkCreatePayments = (officeId: string, data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, - `/offices/${officeId}/payments`, - ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), - - ) -}; -export const calculatePayments = (officeId: string, data: InvoicePaymentsModels.CalculatePaymentsRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, - `/offices/${officeId}/payments/calculate`, - ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), - - ) -}; -export const exportOfficePayments = (officeId: string, data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payments/exports`, - ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const list = (officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments`, - { - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, invoiceId: string, data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments`, - ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), - - ) -}; -export const getPaymentById = (officeId: string, invoiceId: string, paymentId: string, ) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - - ) -}; -export const update = (officeId: string, invoiceId: string, paymentId: string, data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), - - ) -}; -export const deleteInvoicePayment = (officeId: string, invoiceId: string, paymentId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - - ) -}; -} diff --git a/test/generated/base/invoicePayments/invoicePayments.configs.ts b/test/generated/base/invoicePayments/invoicePayments.configs.ts deleted file mode 100644 index 9f2d9ca..0000000 --- a/test/generated/base/invoicePayments/invoicePayments.configs.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; -import { InvoicePaymentsQueries } from "./invoicePayments.queries"; -import { InvoicePaymentsAcl } from "./invoicePayments.acl"; - -export namespace InvoicePaymentsConfigs { -export const paymentsConfig = { - meta: { - title: "Payments", - }, - readAll: { - acl: InvoicePaymentsAcl.canUseListOfficePayments, - schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, - paginated: InvoicePaymentsQueries.useListOfficePayments, - infinite: InvoicePaymentsQueries.useListOfficePaymentsInfinite, - filters: { - schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, - options: { - inputs: { - search: true, - paymentDate: true, - invoiceIssuingDate: true, - invoiceDirection: true, - createdBy: true, - businessPartner: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, - options: { - columns: { - id: true, - amount: true, - positionNumber: true, - currencyNotation: true, - paymentDate: true, - paymentMethod: true, - comment: true, - createdAt: true, - updatedAt: true, - createdBy: true, - invoice: true, - businessPartner: true, - }, - sortable: InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema, - }, -}), - }, - create: { - acl: InvoicePaymentsAcl.canUseBulkCreatePayments, - schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, - mutation: InvoicePaymentsQueries.useBulkCreatePayments, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, - options: { - inputs: { - paymentDate: true, - invoiceIds: true, - comment: true, - }, - }, -}) - }, -}; - -export const invoicesPaymentsConfig = { - meta: { - title: "Invoices Payments", - }, - readAll: { - acl: InvoicePaymentsAcl.canUseList, - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - paginated: InvoicePaymentsQueries.useList, - infinite: InvoicePaymentsQueries.useListInfinite, - columns: dynamicColumns({ - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - options: { - columns: { - id: true, - amount: true, - currencyNotation: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - bankAccount: true, - comment: true, - createdAt: true, - updatedAt: true, - createdBy: true, - }, - }, -}), - }, - read: { - acl: InvoicePaymentsAcl.canUseGetPaymentById, - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - query: InvoicePaymentsQueries.useGetPaymentById, - }, - create: { - acl: InvoicePaymentsAcl.canUseCreate, - schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, - mutation: InvoicePaymentsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, - options: { - inputs: { - amount: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - comment: true, - }, - }, -}) - }, - update: { - acl: InvoicePaymentsAcl.canUseUpdate, - schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, - mutation: InvoicePaymentsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, - options: { - inputs: { - amount: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - comment: true, - }, - }, -}) - }, - delete: { - acl: InvoicePaymentsAcl.canUseDeleteInvoicePayment, - mutation: InvoicePaymentsQueries.useDeleteInvoicePayment, - }, -}; - -} diff --git a/test/generated/base/invoicePayments/invoicePayments.models.ts b/test/generated/base/invoicePayments/invoicePayments.models.ts deleted file mode 100644 index 23fae1a..0000000 --- a/test/generated/base/invoicePayments/invoicePayments.models.ts +++ /dev/null @@ -1,292 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicePaymentsModels { -/** - * OfficePaymentTotalAmountsDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ -export const OfficePaymentTotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); -export type OfficePaymentTotalAmountsDto = z.infer; - -/** - * OfficePaymentListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { OfficePaymentTotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const OfficePaymentListResponseDtoSchema = z.object({ items: z.array(z.string()), totalAmounts: z.array(OfficePaymentTotalAmountsDtoSchema), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type OfficePaymentListResponseDto = z.infer; - -/** - * OfficePaymentPreviewInvoiceDtoSchema - * @type { object } - * @property { string } id - * @property { string } invoiceNumber - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection - * @property { number } grossAmount - * @property { CommonModels.InvoiceStatusEnum } status - * @property { string } paidOn - * @property { string } issuingDate - */ -export const OfficePaymentPreviewInvoiceDtoSchema = z.object({ id: z.string(), invoiceNumber: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, grossAmount: z.number(), status: CommonModels.InvoiceStatusEnumSchema, paidOn: z.iso.datetime({ offset: true }).nullable(), issuingDate: z.iso.datetime({ offset: true }).nullable() }); -export type OfficePaymentPreviewInvoiceDto = z.infer; - -/** - * PaymentMethodEnumSchema - * @type { enum } - */ -export const PaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); -export type PaymentMethodEnum = z.infer; -export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; - -/** - * OfficePaymentPreviewCreatedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type OfficePaymentPreviewCreatedByDto = z.infer; - -/** - * OfficePaymentBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const OfficePaymentBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type OfficePaymentBusinessPartnerDto = z.infer; - -/** - * OfficePaymentPreviewDtoSchema - * @type { object } - * @property { string } id - * @property { number } amount - * @property { string } positionNumber - * @property { string } currencyNotation - * @property { string } paymentDate - * @property { PaymentMethodEnum } paymentMethod - * @property { string } comment - * @property { string } createdAt - * @property { string } updatedAt - * @property { OfficePaymentPreviewCreatedByDto } createdBy - * @property { OfficePaymentPreviewInvoiceDto } invoice - * @property { OfficePaymentBusinessPartnerDto } businessPartner - */ -export const OfficePaymentPreviewDtoSchema = z.object({ id: z.string(), amount: z.number(), positionNumber: z.string(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: OfficePaymentPreviewCreatedByDtoSchema, invoice: OfficePaymentPreviewInvoiceDtoSchema, businessPartner: OfficePaymentBusinessPartnerDtoSchema.nullish() }); -export type OfficePaymentPreviewDto = z.infer; - -/** - * OfficeInvoicePaymentFilterDtoSchema - * @type { object } - * @property { string } search Search by invoice number - * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range - * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction - * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) - * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) - */ -export const OfficeInvoicePaymentFilterDtoSchema = z.object({ search: z.string().nullable(), paymentDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), createdBy: z.array(z.string()).nullable(), businessPartner: z.array(z.string()).nullable() }).partial(); -export type OfficeInvoicePaymentFilterDto = z.infer; - -/** - * BulkCreatePaymentBusinessPartnerDtoSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } name Business partner name - * @property { string } paymentDate Payment date applied to the partner invoices - */ -export const BulkCreatePaymentBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), paymentDate: z.iso.datetime({ offset: true }) }); -export type BulkCreatePaymentBusinessPartnerDto = z.infer; - -/** - * BulkCreatePaymentsResponseDtoSchema - * @type { object } - * @property { BulkCreatePaymentBusinessPartnerDto[] } businessPartners List of business partners paid in this bulk operation - */ -export const BulkCreatePaymentsResponseDtoSchema = z.object({ businessPartners: z.array(BulkCreatePaymentBusinessPartnerDtoSchema) }); -export type BulkCreatePaymentsResponseDto = z.infer; - -/** - * CalculatePaymentItemDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } businessPartnerName - * @property { number } amount - * @property { string } currency - */ -export const CalculatePaymentItemDtoSchema = z.object({ businessPartnerId: z.string(), businessPartnerName: z.string(), amount: z.number(), currency: z.string() }); -export type CalculatePaymentItemDto = z.infer; - -/** - * CalculatePaymentTotalDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currency - */ -export const CalculatePaymentTotalDtoSchema = z.object({ amount: z.number(), currency: z.string() }); -export type CalculatePaymentTotalDto = z.infer; - -/** - * CalculatePaymentsResponseDtoSchema - * @type { object } - * @property { CalculatePaymentItemDto[] } payments - * @property { CalculatePaymentTotalDto[] } totals - */ -export const CalculatePaymentsResponseDtoSchema = z.object({ payments: z.array(CalculatePaymentItemDtoSchema), totals: z.array(CalculatePaymentTotalDtoSchema) }); -export type CalculatePaymentsResponseDto = z.infer; - -/** - * OfficeInvoicePaymentExportFilterDtoSchema - * @type { object } - * @property { string } search Search by invoice number - * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range - * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction - * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) - * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) - */ -export const OfficeInvoicePaymentExportFilterDtoSchema = z.object({ search: z.string().nullable(), paymentDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), createdBy: z.array(z.string()).nullable(), businessPartner: z.array(z.string()).nullable() }).partial(); -export type OfficeInvoicePaymentExportFilterDto = z.infer; - -/** - * OfficeInvoicePaymentExportColumnSchema - * @type { enum } - */ -export const OfficeInvoicePaymentExportColumnSchema = z.enum(["amount", "currency", "paymentDate", "paymentMethod", "comment", "positionNumber", "invoiceNumber", "invoiceDirection", "invoiceStatus", "invoiceIssuingDate", "invoiceGrossAmount", "invoicePaidOn", "businessPartnerName", "createdByName"]); -export type OfficeInvoicePaymentExportColumn = z.infer; -export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumnSchema.enum; - -/** - * OfficeInvoicePaymentExportRequestDtoSchema - * @type { object } - * @property { OfficeInvoicePaymentExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { OfficeInvoicePaymentExportFilterDto } filter - */ -export const OfficeInvoicePaymentExportRequestDtoSchema = z.object({ columns: z.array(OfficeInvoicePaymentExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: OfficeInvoicePaymentExportFilterDtoSchema.nullable() }).partial(); -export type OfficeInvoicePaymentExportRequestDto = z.infer; - -/** - * PaymentCreatedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PaymentCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type PaymentCreatedByDto = z.infer; - -/** - * PaymentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { number } amount - * @property { string } currencyNotation - * @property { string } paymentDate - * @property { PaymentMethodEnum } paymentMethod - * @property { string } bankAccountId - * @property { string } bankAccount - * @property { string } comment - * @property { string } createdAt - * @property { string } updatedAt - * @property { PaymentCreatedByDto } createdBy - */ -export const PaymentResponseDtoSchema = z.object({ id: z.string(), amount: z.number(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, bankAccountId: z.string().nullish(), bankAccount: z.string().nullish(), comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: PaymentCreatedByDtoSchema.nullish() }); -export type PaymentResponseDto = z.infer; - -/** - * PositionInvoicePaymentMethodEnumSchema - * @type { enum } - */ -export const PositionInvoicePaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); -export type PositionInvoicePaymentMethodEnum = z.infer; -export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnumSchema.enum; - -/** - * CreateInvoicePaymentRequestDtoSchema - * @type { object } - * @property { number } amount Payment amount - * @property { string } paymentDate Payment date - * @property { PositionInvoicePaymentMethodEnum } paymentMethod Payment method - * @property { string } bankAccountId Bank account ID - * @property { string } comment Optional comment - */ -export const CreateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PositionInvoicePaymentMethodEnumSchema, bankAccountId: z.string().nullish(), comment: z.string().nullish() }); -export type CreateInvoicePaymentRequestDto = z.infer; - -/** - * UpdateInvoicePaymentRequestDtoSchema - * @type { object } - * @property { number } amount Payment amount. Minimum: `0.01` - * @property { string } paymentDate Payment date - * @property { string } paymentMethod Payment method - * @property { string } bankAccountId Bank account ID - * @property { string } comment Payment comment - */ -export const UpdateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number().gte(0.01).nullable(), paymentDate: z.iso.datetime({ offset: true }).nullable(), paymentMethod: PaymentMethodEnumSchema.nullable(), bankAccountId: z.string().nullable(), comment: z.string().nullable() }).partial(); -export type UpdateInvoicePaymentRequestDto = z.infer; - -/** - * BulkCreatePaymentsRequestDtoSchema - * @type { object } - * @property { string } paymentDate Payment date for all payments - * @property { string[] } invoiceIds List of invoice IDs to create payments for. Min Items: `1` - * @property { string } comment - */ -export const BulkCreatePaymentsRequestDtoSchema = z.object({ paymentDate: z.iso.datetime({ offset: true }), invoiceIds: z.array(z.string()).min(1), comment: z.string().nullish() }); -export type BulkCreatePaymentsRequestDto = z.infer; - -/** - * CalculatePaymentsRequestDtoSchema - * @type { object } - * @property { string[] } invoiceIds Invoice IDs (UUID v4). Min Items: `1`. Max Items: `30` - */ -export const CalculatePaymentsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).min(1).max(30) }); -export type CalculatePaymentsRequestDto = z.infer; - -/** - * ListOfficePaymentsOrderParamEnumSchema - * @type { enum } - */ -export const ListOfficePaymentsOrderParamEnumSchema = z.enum(["paymentDate", "amount", "paymentMethod", "comment", "createdAt", "updatedAt", "currencyNotation", "createdByName", "invoiceNumber", "invoiceDirection", "invoiceGrossAmount", "invoiceStatus", "invoicePaidOn", "invoiceIssuingDate"]); -export type ListOfficePaymentsOrderParamEnum = z.infer; -export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnumSchema.enum; - -/** - * ListOfficePaymentsResponseSchema - * @type { object } - * @property { OfficePaymentTotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficePaymentPreviewDto[] } items - */ -export const ListOfficePaymentsResponseSchema = z.object({ ...OfficePaymentListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).nullable() }).partial().shape }); -export type ListOfficePaymentsResponse = z.infer; - -/** - * InvoicePaymentsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PaymentResponseDto[] } items - */ -export const InvoicePaymentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentResponseDtoSchema).nullable() }).partial().shape }); -export type InvoicePaymentsListResponse = z.infer; - -} diff --git a/test/generated/base/invoicePayments/invoicePayments.queries.ts b/test/generated/base/invoicePayments/invoicePayments.queries.ts deleted file mode 100644 index e31c011..0000000 --- a/test/generated/base/invoicePayments/invoicePayments.queries.ts +++ /dev/null @@ -1,325 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InvoicePaymentsAcl } from "./invoicePayments.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; -import { InvoicePaymentsApi } from "./invoicePayments.api"; - -export namespace InvoicePaymentsQueries { -export const moduleName = QueryModule.InvoicePayments; - -export const keys = { - all: [moduleName] as const, - listOfficePayments: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payments", officeId, limit, order, filter, page, cursor] as const, - listOfficePaymentsInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/payments", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, invoiceId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", officeId, invoiceId, limit, page, cursor] as const, - listInfinite: (officeId: string, invoiceId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", "infinite", officeId, invoiceId, limit, cursor] as const, - getPaymentById: (officeId: string, invoiceId: string, paymentId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments/:paymentId", officeId, invoiceId, paymentId] as const, -}; - -/** - * Query `useListOfficePayments` - * @summary List all payments for an office - * @permission Requires `canUseListOfficePayments` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` - * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListOfficePayments = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListOfficePaymentsInfinite - * @summary List all payments for an office - * @permission Requires `canUseListOfficePayments` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` - * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListOfficePaymentsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useBulkCreatePayments` - * @summary Bulk create payments for multiple invoices - * @permission Requires `canUseBulkCreatePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.BulkCreatePaymentsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useBulkCreatePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId } )); - return InvoicePaymentsApi.bulkCreatePayments(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCalculatePayments` - * @summary Calculate grouped payments for provided invoices - * @permission Requires `canUseCalculatePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.CalculatePaymentsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useCalculatePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId } )); - return InvoicePaymentsApi.calculatePayments(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportOfficePayments` - recommended when file should not be cached - * @summary Export office invoice payments to Excel - * @permission Requires `canUseExportOfficePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportOfficePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId } )); - return InvoicePaymentsApi.exportOfficePayments(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useList` - * @summary List payments for an invoice - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, invoiceId, limit, page, cursor }: { officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, invoiceId, limit, page, cursor), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List payments for an invoice - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, invoiceId, limit, cursor }: { officeId: string, invoiceId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a payment for an invoice - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicePaymentsModels.CreateInvoicePaymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId } )); - return InvoicePaymentsApi.create(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetPaymentById` - * @summary Get a payment by ID - * @permission Requires `canUseGetPaymentById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { string } object.paymentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetPaymentById = ({ officeId, invoiceId, paymentId }: { officeId: string, invoiceId: string, paymentId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId } )); - return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update a payment - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.paymentId Path parameter - * @param { InvoicePaymentsModels.UpdateInvoicePaymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, paymentId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId } )); - return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId, paymentId } = variables; - const updateKeys = [keys.getPaymentById(officeId, invoiceId, paymentId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteInvoicePayment` - * @summary Delete a payment - * @permission Requires `canUseDeleteInvoicePayment` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.paymentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteInvoicePayment = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, paymentId }) => { - checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId } )); - return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/invoices/invoices.acl.ts b/test/generated/base/invoices/invoices.acl.ts deleted file mode 100644 index 65b9c24..0000000 --- a/test/generated/base/invoices/invoices.acl.ts +++ /dev/null @@ -1,407 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InvoicesAcl { -/** - * Use for `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download invoices as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation - */ -export const canUseGetInvoicesEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useFind` query ability. For global ability, omit the object parameter. - * @description List invoices for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query - */ -export const canUseFind = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useChangeIncomingCustomer` mutation ability. For global ability, omit the object parameter. - * @description PositionInvoice Fix - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useChangeIncomingCustomer` mutation - */ -export const canUseChangeIncomingCustomer = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useFindByOffice` query ability. For global ability, omit the object parameter. - * @description List invoices for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByOffice` query - */ -export const canUseFindByOffice = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCreateDraft` mutation ability. For global ability, omit the object parameter. - * @description Create invoice for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDraft` mutation - */ -export const canUseCreateDraft = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Create", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportInvoices` mutation ability. For global ability, omit the object parameter. - * @description Export invoices for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportInvoices` mutation - */ -export const canUseExportInvoices = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportCharges` mutation ability. For global ability, omit the object parameter. - * @description Export invoice charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportCharges` mutation - */ -export const canUseExportCharges = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetUnCharges` query ability. For global ability, omit the object parameter. - * @description List uninvoiced charges for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetUnCharges` query - */ -export const canUseGetUnCharges = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ -export const canUseListAvailablePartnersFor = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetOfficeUnCharges` query ability. For global ability, omit the object parameter. - * @description List uninvoiced charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetOfficeUnCharges` query - */ -export const canUseGetOfficeUnCharges = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportUnCharges` mutation ability. For global ability, omit the object parameter. - * @description Export uninvoiced charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportUnCharges` mutation - */ -export const canUseExportUnCharges = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("UninvoicedCharge", object) : "UninvoicedCharge" -] as AbilityTuple<"Export", "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, }>; - -/** - * Use for `useCreateDirect` mutation ability. For global ability, omit the object parameter. - * @description Create direct invoice for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDirect` mutation - */ -export const canUseCreateDirect = ( - object?: { officeId: string, } -) => [ - "CreateDirectInvoice", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useAddChargeToDirect` mutation ability. For global ability, omit the object parameter. - * @description Add charge to direct invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddChargeToDirect` mutation - */ -export const canUseAddChargeToDirect = ( - object?: { officeId: string, } -) => [ - "UpdateDirectInvoice", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdateCharges` mutation ability. For global ability, omit the object parameter. - * @description Update invoice charges - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCharges` mutation - */ -export const canUseUpdateCharges = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useRemoveChargeFromDirect` mutation ability. For global ability, omit the object parameter. - * @description Remove charge from direct invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRemoveChargeFromDirect` mutation - */ -export const canUseRemoveChargeFromDirect = ( - object?: { officeId: string, } -) => [ - "UpdateDirectInvoice", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetDetail` query ability. For global ability, omit the object parameter. - * @description Read invoice details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDetail` query - */ -export const canUseGetDetail = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useDeleteInvoice` mutation ability. For global ability, omit the object parameter. - * @description Delete invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoice` mutation - */ -export const canUseDeleteInvoice = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Delete", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useFix` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice accounting issues - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFix` mutation - */ -export const canUseFix = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdateIssuedVatRules` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice VAT rules - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedVatRules` mutation - */ -export const canUseUpdateIssuedVatRules = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdateIssuedCharges` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice charges - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedCharges` mutation - */ -export const canUseUpdateIssuedCharges = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useIssue` mutation ability. For global ability, omit the object parameter. - * @description Issue invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssue` mutation - */ -export const canUseIssue = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useReportHungarian` mutation ability. For global ability, omit the object parameter. - * @description Report invoice to Hungarian tax authority - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReportHungarian` mutation - */ -export const canUseReportHungarian = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGenerateIncoming` mutation ability. For global ability, omit the object parameter. - * @description Generate incoming invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIncoming` mutation - */ -export const canUseGenerateIncoming = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useRegister` mutation ability. For global ability, omit the object parameter. - * @description Register invoice for bookkeeping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRegister` mutation - */ -export const canUseRegister = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetPreview` query or `useGetPreviewMutation` mutation ability. For global ability, omit the object parameter. - * @description View invoice preview - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` query or `useGetPreviewMutation` mutation - */ -export const canUseGetPreview = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download invoice as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation - */ -export const canUseGetInvoiceEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `usePrepareDocumentUpload` mutation ability. For global ability, omit the object parameter. - * @description Upload invoice document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareDocumentUpload` mutation - */ -export const canUsePrepareDocumentUpload = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ -export const canUseCancel = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useIssueCreditNote` mutation ability. For global ability, omit the object parameter. - * @description Issue credit note invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueCreditNote` mutation - */ -export const canUseIssueCreditNote = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/base/invoices/invoices.api.ts b/test/generated/base/invoices/invoices.api.ts deleted file mode 100644 index cc54d52..0000000 --- a/test/generated/base/invoices/invoices.api.ts +++ /dev/null @@ -1,327 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicesApi { -export const getInvoicesEml = (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/eml`, - { - params: { - invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { type: "query", name: "invoiceIds" }), - }, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const find = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoicesFindResponseSchema }, - `/offices/${officeId}/positions/${positionId}/invoices`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const changeIncomingCustomer = (officeId: string, invoiceId: string, data: InvoicesModels.ChangeInvoiceCustomerRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/customer`, - ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), - - ) -}; -export const findByOffice = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.FindByOfficeResponseSchema }, - `/offices/${officeId}/invoices`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createDraft = (officeId: string, data: InvoicesModels.CreateDraftInvoiceRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices`, - ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), - - ) -}; -export const exportInvoices = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/exports`, - ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const exportCharges = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/charges/exports`, - ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getUnCharges = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.GetUnChargesResponseSchema }, - `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listAvailablePartnersFor = (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/invoices/${invoiceId}/available-partners`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), - }, - } - ) -}; -export const getOfficeUnCharges = (officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, - `/offices/${officeId}/uninvoiced-charges`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const exportUnCharges = (officeId: string, data: InvoicesModels.UninvoicedChargesExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/uninvoiced-charges/exports`, - ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const createDirect = (officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/direct-invoices`, - - ) -}; -export const addChargeToDirect = (officeId: string, invoiceId: string, data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges`, - ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), - - ) -}; -export const updateCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceChargesRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges`, - ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), - - ) -}; -export const removeChargeFromDirect = (officeId: string, invoiceId: string, chargeId: string, ) => { - return AppRestClient.delete( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, - - ) -}; -export const getDetail = (officeId: string, invoiceId: string, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}`, - - ) -}; -export const update = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}`, - ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), - - ) -}; -export const deleteInvoice = (officeId: string, invoiceId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}`, - - ) -}; -export const fix = (officeId: string, invoiceId: string, data: InvoicesModels.FixInvoiceRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix`, - ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), - - ) -}; -export const generate = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/document`, - - ) -}; -export const updateIssuedVatRules = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, - ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), - - ) -}; -export const updateIssuedCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, - ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), - - ) -}; -export const issue = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/issue`, - undefined, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const reportHungarian = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, - - ) -}; -export const generateIncoming = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, - undefined, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const register = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/register`, - - ) -}; -export const getPreview = (officeId: string, invoiceId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getInvoiceEml = (officeId: string, invoiceId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/eml`, - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const prepareDocumentUpload = (officeId: string, invoiceId: string, data: InvoicesModels.PrepareUploadRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/upload-document`, - ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), - - ) -}; -export const cancel = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/cancel`, - - ) -}; -export const issueCreditNote = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, - - ) -}; -} diff --git a/test/generated/base/invoices/invoices.configs.ts b/test/generated/base/invoices/invoices.configs.ts deleted file mode 100644 index 3443bf9..0000000 --- a/test/generated/base/invoices/invoices.configs.ts +++ /dev/null @@ -1,322 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { InvoicesQueries } from "./invoices.queries"; -import { InvoicesAcl } from "./invoices.acl"; - -export namespace InvoicesConfigs { -export const invoicesConfig = { - meta: { - title: "Invoices", - }, - readAll: { - acl: InvoicesAcl.canUseFindByOffice, - schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, - paginated: InvoicesQueries.useFindByOffice, - infinite: InvoicesQueries.useFindByOfficeInfinite, - filters: { - schema: CommonModels.OfficeInvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CommonModels.OfficeInvoiceFilterDtoSchema, - options: { - inputs: { - search: true, - issuingDate: true, - serviceDate: true, - invoiceDirection: true, - invoiceType: true, - collective: true, - amountMin: true, - amountMax: true, - currencyNotation: true, - vatRule: true, - dueDate: true, - status: true, - receiver: true, - receiverCountry: true, - salesRep: true, - positionNumbersString: true, - positionNumbers: true, - invoiceNumbersString: true, - invoiceNumbers: true, - bookkeepingExportStatus: true, - dunningBlock: true, - invoiceInReview: true, - isInvoiceOk: true, - isVatOk: true, - invoiceNumberMin: true, - invoiceNumberMax: true, - internalNumberMin: true, - internalNumberMax: true, - externalSystemId: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - creditorId: true, - debtorId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, - options: { - columns: { - id: true, - createdAt: true, - invoiceNumber: true, - invoiceDirection: true, - issuingDate: true, - invoiceType: true, - collective: true, - serviceDate: true, - internalNumber: true, - reference: true, - amount: true, - netAmount: true, - tax: true, - currency: true, - dueDate: true, - status: true, - payDate: true, - paidAmount: true, - position: true, - receiver: true, - receiverCountry: true, - clerk: true, - cancelled: true, - ok: true, - isExportedToBookkeeping: true, - dunningBlock: true, - invoiceInReview: true, - vatOk: true, - comments: true, - paymentComment: true, - creditorId: true, - debtorId: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vatRules: true, - }, - sortable: InvoicesModels.FindByOfficeOrderParamEnumSchema, - }, -}), - }, - read: { - acl: InvoicesAcl.canUseGetDetail, - schema: InvoicesModels.InvoiceDetailDtoSchema, - query: InvoicesQueries.useGetDetail, - }, - create: { - acl: InvoicesAcl.canUseCreateDraft, - schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, - mutation: InvoicesQueries.useCreateDraft, - inputDefs: dynamicInputs({ - schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, - options: { - inputs: { - chargeItemIds: true, - invoiceType: true, - customerId: true, - direction: true, - }, - }, -}) - }, - update: { - acl: InvoicesAcl.canUseUpdate, - schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, - mutation: InvoicesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, - options: { - inputs: { - issuingDate: true, - receiptDate: true, - serviceDate: true, - serviceDateUntil: true, - dueDate: true, - invoiceNumber: true, - internalNumber: true, - paymentTermDays: true, - paymentTermType: true, - serviceRecipientId: true, - bankAccountId: true, - remarks: true, - language: true, - showPaymentInstructions: true, - customer: true, - salesRepId: true, - currencyNotation: true, - exchangeRate: true, - }, - }, -}) - }, - delete: { - acl: InvoicesAcl.canUseDeleteInvoice, - mutation: InvoicesQueries.useDeleteInvoice, - }, -}; - -export const uninvoicedChargesConfig = { - meta: { - title: "Uninvoiced Charges", - }, - readAll: { - acl: InvoicesAcl.canUseGetOfficeUnCharges, - schema: InvoicesModels.UninvoicedChargeDtoSchema, - paginated: InvoicesQueries.useGetOfficeUnCharges, - infinite: InvoicesQueries.useGetOfficeUnChargesInfinite, - filters: { - schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, - options: { - inputs: { - direction: true, - chargeItemId: true, - receiverIds: true, - positionIds: true, - chargeTypeIds: true, - serviceDate: true, - currencies: true, - vatRuleIds: true, - employeeIds: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.UninvoicedChargeDtoSchema, - options: { - columns: { - chargeItemId: true, - invoiceDirection: true, - receiver: true, - position: true, - chargeType: true, - currencyNotation: true, - amount: true, - amountInOfficeCurrency: true, - officeCurrency: true, - exchangeRate: true, - vatRule: true, - serviceDate: true, - status: true, - missingInformation: true, - employee: true, - }, - sortable: InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema, - }, -}), - }, -}; - -export const positionsInvoicesConfig = { - meta: { - title: "Positions Invoices", - }, - readAll: { - acl: InvoicesAcl.canUseFind, - schema: InvoicesModels.InvoicePreviewDtoSchema, - paginated: InvoicesQueries.useFind, - infinite: InvoicesQueries.useFindInfinite, - filters: { - schema: InvoicesModels.InvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.InvoiceFilterDtoSchema, - options: { - inputs: { - status: true, - direction: true, - receiver: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.InvoicePreviewDtoSchema, - options: { - columns: { - id: true, - invoiceDirection: true, - invoiceType: true, - invoiceNumber: true, - issuingDate: true, - amount: true, - currencyNotation: true, - status: true, - isExportedToBookkeeping: true, - internalNumber: true, - receiver: true, - representative: true, - collective: true, - creditNote: true, - cancelledInvoice: true, - }, - sortable: InvoicesModels.InvoicesFindOrderParamEnumSchema, - }, -}), - }, -}; - -export const positionsUninvoicedChargesConfig = { - meta: { - title: "Positions Uninvoiced Charges", - }, - readAll: { - acl: InvoicesAcl.canUseGetUnCharges, - schema: InvoicesModels.UninvoicedChargeDtoSchema, - paginated: InvoicesQueries.useGetUnCharges, - infinite: InvoicesQueries.useGetUnChargesInfinite, - filters: { - schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, - options: { - inputs: { - direction: true, - chargeItemId: true, - receiverId: true, - chargeTypeId: true, - serviceDate: true, - currency: true, - vatRuleId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.UninvoicedChargeDtoSchema, - options: { - columns: { - chargeItemId: true, - invoiceDirection: true, - receiver: true, - position: true, - chargeType: true, - currencyNotation: true, - amount: true, - amountInOfficeCurrency: true, - officeCurrency: true, - exchangeRate: true, - vatRule: true, - serviceDate: true, - status: true, - missingInformation: true, - employee: true, - }, - sortable: InvoicesModels.GetUnChargesOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/invoices/invoices.models.ts b/test/generated/base/invoices/invoices.models.ts deleted file mode 100644 index f1cd629..0000000 --- a/test/generated/base/invoices/invoices.models.ts +++ /dev/null @@ -1,987 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicesModels { -/** - * InvoiceBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - */ -export const InvoiceBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type InvoiceBusinessPartnerResponseDto = z.infer; - -/** - * InvoiceEmployeeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoiceEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type InvoiceEmployeeResponseDto = z.infer; - -/** - * InvoiceRelatedInvoiceResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } internalNumber - */ -export const InvoiceRelatedInvoiceResponseDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }); -export type InvoiceRelatedInvoiceResponseDto = z.infer; - -/** - * InvoicePreviewDtoSchema - * @type { object } - * @property { string } id - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection - * @property { CommonModels.InvoiceTypeEnum } invoiceType - * @property { string } invoiceNumber - * @property { string } issuingDate - * @property { number } amount - * @property { string } currencyNotation - * @property { CommonModels.InvoiceStatusEnum } status - * @property { boolean } isExportedToBookkeeping - * @property { string } internalNumber - * @property { InvoiceBusinessPartnerResponseDto } receiver - * @property { InvoiceEmployeeResponseDto } representative - * @property { boolean } collective - * @property { InvoiceRelatedInvoiceResponseDto } creditNote - * @property { InvoiceRelatedInvoiceResponseDto } cancelledInvoice - */ -export const InvoicePreviewDtoSchema = z.object({ id: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullable(), issuingDate: z.iso.datetime({ offset: true }).nullish(), amount: z.number(), currencyNotation: z.string(), status: CommonModels.InvoiceStatusEnumSchema, isExportedToBookkeeping: z.boolean(), internalNumber: z.string().nullish(), receiver: InvoiceBusinessPartnerResponseDtoSchema.nullish(), representative: InvoiceEmployeeResponseDtoSchema.nullish(), collective: z.boolean(), creditNote: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), cancelledInvoice: InvoiceRelatedInvoiceResponseDtoSchema.nullish() }); -export type InvoicePreviewDto = z.infer; - -/** - * InvoicePartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const InvoicePartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type InvoicePartnerDto = z.infer; - -/** - * InvoicePositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } transportType - * @property { string } ourReference - * @property { string } finalDestination - * @property { InvoicePartnerDto } shipper - * @property { InvoicePartnerDto } consignee - * @property { string } vessel - * @property { string } emptyPickup - * @property { string } loadingAddress - * @property { string } portOfLoading - * @property { string } portOfDischarge - * @property { string } carrierBl - * @property { string } houseBillOfLadingNumber - * @property { string } masterAWB - * @property { string } hawbNumber - * @property { string } flightNo - * @property { string } pickupAddress - * @property { string } originAirport - * @property { string } destinationAirport - * @property { string } originLocation - * @property { string } destinationLocation - * @property { string } dateOfDeparture - * @property { string } dateOfArrival - */ -export const InvoicePositionDtoSchema = z.object({ id: z.string(), number: z.string(), transportType: z.string(), ourReference: z.string().nullish(), finalDestination: z.string().nullish(), shipper: InvoicePartnerDtoSchema.nullish(), consignee: InvoicePartnerDtoSchema.nullish(), vessel: z.string().nullish(), emptyPickup: z.string().nullish(), loadingAddress: z.string().nullish(), portOfLoading: z.string().nullish(), portOfDischarge: z.string().nullish(), carrierBl: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterAWB: z.string().nullish(), hawbNumber: z.string().nullish(), flightNo: z.string().nullish(), pickupAddress: z.string().nullish(), originAirport: z.string().nullish(), destinationAirport: z.string().nullish(), originLocation: z.string().nullish(), destinationLocation: z.string().nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish() }); -export type InvoicePositionDto = z.infer; - -/** - * InvoiceChargeTypeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type InvoiceChargeTypeDto = z.infer; - -/** - * InvoiceVatRuleDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { number } rate - */ -export const InvoiceVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }); -export type InvoiceVatRuleDto = z.infer; - -/** - * InvoiceFinanceLineDtoSchema - * @type { object } - * @property { string } positionChargeItemId - * @property { InvoiceChargeTypeDto } chargeType - * @property { string } additionalText - * @property { number } quantity - * @property { number } netAmount - * @property { number } grossAmount - * @property { number } sumInInvoiceCurrency - * @property { number } sumInOfficeCurrency - * @property { string } currencyNotation - * @property { number } exchangeRate - * @property { InvoiceVatRuleDto } vatRule - * @property { number } exchangedNetAmount - * @property { string } positionNumber - * @property { string } positionId - * @property { string } outgoingInvoiceId - * @property { string } registeredInvoiceId - */ -export const InvoiceFinanceLineDtoSchema = z.object({ positionChargeItemId: z.string(), chargeType: InvoiceChargeTypeDtoSchema, additionalText: z.string(), quantity: z.number(), netAmount: z.number(), grossAmount: z.number(), sumInInvoiceCurrency: z.number().nullish(), sumInOfficeCurrency: z.number().nullish(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), vatRule: InvoiceVatRuleDtoSchema, exchangedNetAmount: z.number().nullish(), positionNumber: z.string().nullish(), positionId: z.string().nullish(), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish() }); -export type InvoiceFinanceLineDto = z.infer; - -/** - * InvoiceConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl - * @property { string } headerImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ -export const InvoiceConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); -export type InvoiceConfigDto = z.infer; - -/** - * InvoiceCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { string } address - * @property { string } vatNumber - * @property { string } reference - * @property { string } contact - * @property { string } partnerRegistrationNumber - */ -export const InvoiceCustomerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string().nullish(), label: z.string().nullish(), address: z.string().nullish(), vatNumber: z.string(), reference: z.string().nullish(), contact: z.string().nullish(), partnerRegistrationNumber: z.string().nullish() }); -export type InvoiceCustomerDto = z.infer; - -/** - * InvoiceOfficeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type InvoiceOfficeDto = z.infer; - -/** - * InvoiceSalesRepDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } phoneNumber - */ -export const InvoiceSalesRepDtoSchema = z.object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }); -export type InvoiceSalesRepDto = z.infer; - -/** - * InvoiceServiceRecipientDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } address - * @property { string } vatNumber - * @property { string } partnerRegistrationNumber - */ -export const InvoiceServiceRecipientDtoSchema = z.object({ id: z.string(), name: z.string(), address: z.string().nullish(), vatNumber: z.string(), partnerRegistrationNumber: z.string().nullish() }); -export type InvoiceServiceRecipientDto = z.infer; - -/** - * InvoiceBankAccountDtoSchema - * @type { object } - * @property { string } id - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - * @property { string } name - * @property { boolean } useFooterOnInvoice - * @property { object } footer - * @property { string } footer.mediaUrl - */ -export const InvoiceBankAccountDtoSchema = z.object({ id: z.string(), displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string(), name: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).nullish() }); -export type InvoiceBankAccountDto = z.infer; - -/** - * InvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const InvoiceRemarksDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); -export type InvoiceRemarksDto = z.infer; - -/** - * InvoiceVatLineDtoSchema - * @type { object } - * @property { string } vatRuleId ID of the VAT rule - * @property { string } name Name of the VAT rule - * @property { string } printNumber Reference numerical string for vat rules - * @property { string } matchCode Match code of the VAT rule - * @property { number } vatPercentage The actual VAT rate (e.g., 19 for 19%) - * @property { number } netAmount Sum of net amounts from financeLines using this vatRuleId - * @property { number } vatAmount Calculated total VAT for this rate (netAmount * vatPercentage / 100) - * @property { number } grossAmount Sum of netAmount + vatAmount for this rate - * @property { number } vatAmountInOfficeCurrency - * @property { number } netAmountInOfficeCurrency - * @property { number } grossAmountInOfficeCurrency - */ -export const InvoiceVatLineDtoSchema = z.object({ vatRuleId: z.string(), name: z.string(), printNumber: z.string(), matchCode: z.string(), vatPercentage: z.number(), netAmount: z.number(), vatAmount: z.number(), grossAmount: z.number(), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish() }); -export type InvoiceVatLineDto = z.infer; - -/** - * RelatedInvoiceDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } internalNumber - */ -export const RelatedInvoiceDetailDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }); -export type RelatedInvoiceDetailDto = z.infer; - -/** - * InvoiceLanguageEnumSchema - * @type { enum } - */ -export const InvoiceLanguageEnumSchema = z.enum(["en", "de", "sl", "hu", "cs"]); -export type InvoiceLanguageEnum = z.infer; -export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; - -/** - * InvoiceDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } rootFolderId - * @property { string } invoiceDirection - * @property { string } invoiceType - * @property { string } invoiceNumber - * @property { string } costCenter - * @property { string } status - * @property { string } language - * @property { boolean } isVatOk - * @property { boolean } isInvoiceOk - * @property { string } issuingDate - * @property { string } receiptDate - * @property { string } serviceDate - * @property { string } serviceDateUntil - * @property { string } dueDate - * @property { string } internalNumber - * @property { boolean } isExportedToBookkeeping - * @property { string } sentAt - * @property { string } creditNoteId - * @property { string } draftCreditNoteId - * @property { string } cancelledInvoiceId - * @property { string } uploadedDocumentUrl - * @property { InvoiceCustomerDto } customer - * @property { string } customerNumber - * @property { string } customerNameOverride - * @property { string } customerReferenceOverride - * @property { string } customerContactOverride - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { InvoicePositionDto } position - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { InvoiceOfficeDto } salesOffice - * @property { InvoiceSalesRepDto } salesRep - * @property { number } totalNet - * @property { number } totalVat - * @property { number } totalGross - * @property { string } currencyNotation - * @property { number } exchangeRate - * @property { number } paymentTermDays - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { InvoiceServiceRecipientDto } serviceRecipient - * @property { boolean } showPaymentInstructions - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { string } comments - * @property { InvoiceBankAccountDto } bankAccount - * @property { InvoiceFinanceLineDto[] } financeLines - * @property { InvoiceRemarksDto } remarks - * @property { InvoiceVatLineDto[] } vatLines - * @property { InvoiceConfigDto } config - * @property { RelatedInvoiceDetailDto } creditNote - * @property { RelatedInvoiceDetailDto } draftCreditNote - * @property { RelatedInvoiceDetailDto } cancelledInvoice - * @property { string } officeCurrencyNotation - * @property { string } inverseCurrencyNotation - * @property { number } inverseExchangeRate - * @property { boolean } requiresSpecialTablePresentation - * @property { number } paidAmount - * @property { number } outstandingAmount - * @property { string } paidOn - * @property { boolean } isIssued - * @property { number } grossAmountInOfficeCurrency - * @property { string } createdAt - */ -export const InvoiceDetailDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullish(), costCenter: z.string().nullish(), status: CommonModels.InvoiceStatusEnumSchema, language: InvoiceLanguageEnumSchema, isVatOk: z.boolean(), isInvoiceOk: z.boolean(), issuingDate: z.iso.datetime({ offset: true }).nullish(), receiptDate: z.iso.datetime({ offset: true }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), isExportedToBookkeeping: z.boolean(), sentAt: z.iso.datetime({ offset: true }).nullish(), creditNoteId: z.string().nullish(), draftCreditNoteId: z.string().nullish(), cancelledInvoiceId: z.string().nullish(), uploadedDocumentUrl: z.string().nullish(), customer: InvoiceCustomerDtoSchema.nullish(), customerNumber: z.string().nullish(), customerNameOverride: z.string().nullish(), customerReferenceOverride: z.string().nullish(), customerContactOverride: z.string().nullish(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), position: InvoicePositionDtoSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesOffice: InvoiceOfficeDtoSchema, salesRep: InvoiceSalesRepDtoSchema, totalNet: z.number(), totalVat: z.number().nullish(), totalGross: z.number(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), paymentTermDays: z.number().nullish(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), showPaymentInstructions: z.boolean().nullish(), dunningBlock: z.boolean().nullish(), invoiceInReview: z.boolean().nullish(), comments: z.string().nullish(), bankAccount: InvoiceBankAccountDtoSchema.nullish(), financeLines: z.array(InvoiceFinanceLineDtoSchema), remarks: InvoiceRemarksDtoSchema.nullish(), vatLines: z.array(InvoiceVatLineDtoSchema), config: InvoiceConfigDtoSchema.nullish(), creditNote: RelatedInvoiceDetailDtoSchema.nullish(), draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), officeCurrencyNotation: z.string().nullish(), inverseCurrencyNotation: z.string().nullish(), inverseExchangeRate: z.number().nullish(), requiresSpecialTablePresentation: z.boolean().nullish(), paidAmount: z.number(), outstandingAmount: z.number(), paidOn: z.iso.datetime({ offset: true }).nullish(), isIssued: z.boolean(), grossAmountInOfficeCurrency: z.number().nullish(), createdAt: z.iso.datetime({ offset: true }) }); -export type InvoiceDetailDto = z.infer; - -/** - * TotalAmountsDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ -export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); -export type TotalAmountsDto = z.infer; - -/** - * OfficeInvoiceListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalAmountInDefaultCurrency - * @property { string } defaultCurrencyNotation - * @property { TotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const OfficeInvoiceListResponseDtoSchema = z.object({ items: z.array(z.string()), totalAmountInDefaultCurrency: z.number().nullish(), defaultCurrencyNotation: z.string().nullish(), totalAmounts: z.array(TotalAmountsDtoSchema), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type OfficeInvoiceListResponseDto = z.infer; - -/** - * InvoicePreviewPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } externalSystemId - */ -export const InvoicePreviewPositionDtoSchema = z.object({ id: z.string(), number: z.string(), externalSystemId: z.string().nullish() }); -export type InvoicePreviewPositionDto = z.infer; - -/** - * InvoicePreviewReceiverDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - */ -export const InvoicePreviewReceiverDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type InvoicePreviewReceiverDto = z.infer; - -/** - * InvoicePreviewReceiverCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoicePreviewReceiverCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type InvoicePreviewReceiverCountryDto = z.infer; - -/** - * InvoicePreviewClerkDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoicePreviewClerkDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type InvoicePreviewClerkDto = z.infer; - -/** - * VatRuleLabelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } matchCode - * @property { string } name - */ -export const VatRuleLabelResponseDtoSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string() }); -export type VatRuleLabelResponseDto = z.infer; - -/** - * OfficeInvoicePreviewDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } invoiceNumber - * @property { string } invoiceDirection - * @property { string } issuingDate - * @property { CommonModels.InvoiceTypeEnum } invoiceType - * @property { boolean } collective - * @property { string } serviceDate - * @property { string } internalNumber - * @property { string } reference - * @property { number } amount - * @property { number } netAmount - * @property { number } tax - * @property { string } currency - * @property { string } dueDate - * @property { CommonModels.InvoiceStatusEnum } status - * @property { string } payDate - * @property { number } paidAmount - * @property { InvoicePreviewPositionDto } position - * @property { InvoicePreviewReceiverDto } receiver - * @property { InvoicePreviewReceiverCountryDto } receiverCountry - * @property { InvoicePreviewClerkDto } clerk - * @property { boolean } cancelled - * @property { boolean } ok - * @property { boolean } isExportedToBookkeeping - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { boolean } vatOk - * @property { string } comments - * @property { string } paymentComment - * @property { string } creditorId - * @property { string } debtorId - * @property { string } hblNumber - * @property { string } mblNumber - * @property { string } bookingNumber - * @property { string } vessel - * @property { string } voyage - * @property { VatRuleLabelResponseDto[] } vatRules - */ -export const OfficeInvoicePreviewDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), invoiceNumber: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, issuingDate: z.iso.datetime({ offset: true }).nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema, collective: z.boolean(), serviceDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), reference: z.string().nullish(), amount: z.number(), netAmount: z.number(), tax: z.number(), currency: z.string(), dueDate: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.InvoiceStatusEnumSchema, payDate: z.iso.datetime({ offset: true }).nullish(), paidAmount: z.number().nullish(), position: InvoicePreviewPositionDtoSchema.nullish(), receiver: InvoicePreviewReceiverDtoSchema.nullish(), receiverCountry: InvoicePreviewReceiverCountryDtoSchema.nullish(), clerk: InvoicePreviewClerkDtoSchema.nullish(), cancelled: z.boolean(), ok: z.boolean(), isExportedToBookkeeping: z.boolean(), dunningBlock: z.boolean(), invoiceInReview: z.boolean(), vatOk: z.boolean(), comments: z.string().nullish(), paymentComment: z.string().nullish(), creditorId: z.string().nullish(), debtorId: z.string().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vatRules: z.array(VatRuleLabelResponseDtoSchema).nullish() }); -export type OfficeInvoicePreviewDto = z.infer; - -/** - * InvoiceExportFilterDtoSchema - * @type { object } - * @property { string } search - * @property { CommonModels.DateRangeDto } issuingDate - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection - * @property { CommonModels.InvoiceTypeEnum[] } invoiceType - * @property { CommonModels.BooleanFilterEnum[] } collective - * @property { number } amountMin - * @property { number } amountMax - * @property { string[] } currencyNotation - * @property { CommonModels.DateRangeDto } dueDate - * @property { CommonModels.InvoiceStatusEnum[] } status - * @property { string[] } receiver Filter by invoice receiver/customer ID (UUID) - * @property { string } positionNumbersString - * @property { string[] } positionNumbers - * @property { string } invoiceNumbersString - * @property { string[] } invoiceNumbers - * @property { CommonModels.BooleanFilterEnum[] } bookkeepingExportStatus - * @property { CommonModels.BooleanFilterEnum[] } dunningBlock - * @property { CommonModels.BooleanFilterEnum[] } invoiceInReview - * @property { CommonModels.BooleanFilterEnum[] } isInvoiceOk - * @property { CommonModels.BooleanFilterEnum[] } isVatOk - * @property { number } invoiceNumberMin - * @property { number } invoiceNumberMax - * @property { number } internalNumberMin - * @property { number } internalNumberMax - */ -export const InvoiceExportFilterDtoSchema = z.object({ search: z.string().nullable(), issuingDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).nullable(), collective: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), amountMin: z.number().nullable(), amountMax: z.number().nullable(), currencyNotation: z.array(z.string()).nullable(), dueDate: CommonModels.DateRangeDtoSchema.nullable(), status: z.array(CommonModels.InvoiceStatusEnumSchema).nullable(), receiver: z.array(z.string()).nullable(), positionNumbersString: z.string().nullable(), positionNumbers: z.array(z.string()).nullable(), invoiceNumbersString: z.string().nullable(), invoiceNumbers: z.array(z.string()).nullable(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceNumberMin: z.number().nullable(), invoiceNumberMax: z.number().nullable(), internalNumberMin: z.number().nullable(), internalNumberMax: z.number().nullable() }).partial(); -export type InvoiceExportFilterDto = z.infer; - -/** - * InvoiceExportColumnSchema - * @type { enum } - */ -export const InvoiceExportColumnSchema = z.enum(["invoiceNumber", "invoiceDirection", "issuingDate", "invoiceType", "collective", "serviceDate", "internalNumber", "reference", "totalGross", "totalNet", "totalVat", "currency", "dueDate", "status", "payDate", "paidAmount", "positionNumber", "hblHawb", "mblMawb", "bookingNumber", "vessel", "voyage", "receiverName", "receiverCountry", "clerkName", "cancelled", "ok", "vatOk", "dunningBlock", "invoiceInReview", "exportedToBookkeeping", "comments", "paymentComment", "vatRuleIds", "creditorId", "debtorId", "createdAt"]); -export type InvoiceExportColumn = z.infer; -export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; - -/** - * InvoiceExportRequestDtoSchema - * @type { object } - * @property { InvoiceExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { InvoiceExportFilterDto } filter - */ -export const InvoiceExportRequestDtoSchema = z.object({ columns: z.array(InvoiceExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: InvoiceExportFilterDtoSchema.nullable() }).partial(); -export type InvoiceExportRequestDto = z.infer; - -/** - * UninvoicedChargeTotalAmountDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ -export const UninvoicedChargeTotalAmountDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); -export type UninvoicedChargeTotalAmountDto = z.infer; - -/** - * UninvoicedChargeListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const UninvoicedChargeListResponseDtoSchema = z.object({ items: z.array(z.string()), totalAmounts: z.array(UninvoicedChargeTotalAmountDtoSchema), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type UninvoicedChargeListResponseDto = z.infer; - -/** - * ReceiverDtoSchema - * @type { object } - * @property { string } id Business Partner ID (Customer or Vendor) - * @property { string } name Business Partner name - * @property { string } matchCode Business Partner match code - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const ReceiverDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type ReceiverDto = z.infer; - -/** - * UninvoicedChargePositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }); -export type UninvoicedChargePositionDto = z.infer; - -/** - * UninvoicedChargeChargeTypeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const UninvoicedChargeChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type UninvoicedChargeChargeTypeDto = z.infer; - -/** - * UninvoicedChargeVatRuleDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchcode - */ -export const UninvoicedChargeVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchcode: z.string() }); -export type UninvoicedChargeVatRuleDto = z.infer; - -/** - * UninvoicedChargeGroupStatusEnumSchema - * @type { enum } - */ -export const UninvoicedChargeGroupStatusEnumSchema = z.enum(["ReadyForInvoice", "MissingInformation"]); -export type UninvoicedChargeGroupStatusEnum = z.infer; -export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSchema.enum; - -/** - * UninvoicedChargeEmployeeDtoSchema - * @type { object } - * @property { string } id - * @property { string } firstName - * @property { string } lastName - * @property { string } fullName - */ -export const UninvoicedChargeEmployeeDtoSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }); -export type UninvoicedChargeEmployeeDto = z.infer; - -/** - * UninvoicedChargeDtoSchema - * @type { object } - * @property { string } chargeItemId - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection Invoice direction (Incoming or Outgoing) - * @property { ReceiverDto } receiver Business Partner receiving the invoice - * @property { UninvoicedChargePositionDto } position - * @property { UninvoicedChargeChargeTypeDto } chargeType - * @property { string } currencyNotation ISO 4217 currency code - * @property { number } amount Charge amount in charge currency - * @property { number } amountInOfficeCurrency Charge amount in office currency - * @property { string } officeCurrency Office currency code - * @property { number } exchangeRate - * @property { UninvoicedChargeVatRuleDto } vatRule - * @property { string } serviceDate - * @property { UninvoicedChargeGroupStatusEnum } status Status of charge group - * @property { string[] } missingInformation Missing fields required for invoicing this charge - * @property { UninvoicedChargeEmployeeDto } employee - */ -export const UninvoicedChargeDtoSchema = z.object({ chargeItemId: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, receiver: ReceiverDtoSchema, position: UninvoicedChargePositionDtoSchema, chargeType: UninvoicedChargeChargeTypeDtoSchema.nullish(), currencyNotation: z.string(), amount: z.number(), amountInOfficeCurrency: z.number(), officeCurrency: z.string(), exchangeRate: z.number().nullish(), vatRule: UninvoicedChargeVatRuleDtoSchema.nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), status: UninvoicedChargeGroupStatusEnumSchema, missingInformation: z.array(z.string()).nullish(), employee: UninvoicedChargeEmployeeDtoSchema.nullish() }); -export type UninvoicedChargeDto = z.infer; - -/** - * UninvoicedChargePaginationDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string } receiverId - * @property { string } chargeTypeId - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currency - * @property { string } vatRuleId - */ -export const UninvoicedChargePaginationDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), chargeItemId: z.string().nullable(), receiverId: z.string().nullable(), chargeTypeId: z.string().nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), currency: z.array(z.string()).nullable(), vatRuleId: z.string().nullable() }).partial(); -export type UninvoicedChargePaginationDto = z.infer; - -/** - * UninvoicedChargesFilterDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string[] } receiverIds - * @property { string[] } positionIds - * @property { string[] } chargeTypeIds - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currencies - * @property { string[] } vatRuleIds - * @property { string[] } employeeIds - */ -export const UninvoicedChargesFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), chargeItemId: z.string().nullable(), receiverIds: z.array(z.string()).nullable(), positionIds: z.array(z.string()).nullable(), chargeTypeIds: z.array(z.string()).nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), currencies: z.array(z.string()).nullable(), vatRuleIds: z.array(z.string()).nullable(), employeeIds: z.array(z.string()).nullable() }).partial(); -export type UninvoicedChargesFilterDto = z.infer; - -/** - * UninvoicedChargesExportFilterDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string[] } receiverIds - * @property { string[] } positionIds - * @property { string[] } chargeTypeIds - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currencies - * @property { string[] } vatRuleIds - */ -export const UninvoicedChargesExportFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), chargeItemId: z.string().nullable(), receiverIds: z.array(z.string()).nullable(), positionIds: z.array(z.string()).nullable(), chargeTypeIds: z.array(z.string()).nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), currencies: z.array(z.string()).nullable(), vatRuleIds: z.array(z.string()).nullable() }).partial(); -export type UninvoicedChargesExportFilterDto = z.infer; - -/** - * UninvoicedChargeExportColumnSchema - * @type { enum } - */ -export const UninvoicedChargeExportColumnSchema = z.enum(["chargeItemId", "invoiceDirection", "status", "receiverName", "positionNumber", "serviceDate", "employee", "chargeTypeName", "amount", "currency", "exchangeRate", "amountInOfficeCurrency", "officeCurrency", "vatRule"]); -export type UninvoicedChargeExportColumn = z.infer; -export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.enum; - -/** - * UninvoicedChargesExportRequestDtoSchema - * @type { object } - * @property { UninvoicedChargeExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { UninvoicedChargesExportFilterDto } filter - */ -export const UninvoicedChargesExportRequestDtoSchema = z.object({ columns: z.array(UninvoicedChargeExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: UninvoicedChargesExportFilterDtoSchema.nullable() }).partial(); -export type UninvoicedChargesExportRequestDto = z.infer; - -/** - * CreateDraftInvoiceRequestDtoSchema - * @type { object } - * @property { string[] } chargeItemIds Charge item IDs to include in the invoice. Min Items: `1` - * @property { CommonModels.InvoiceTypeEnum } invoiceType Type of invoice - * @property { string } customerId Customer ID (required for outgoing invoices) - * @property { CommonModels.InvoiceDirectionEnum } direction Invoice direction - */ -export const CreateDraftInvoiceRequestDtoSchema = z.object({ chargeItemIds: z.array(z.string()).min(1).nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema, customerId: z.string(), direction: CommonModels.InvoiceDirectionEnumSchema }); -export type CreateDraftInvoiceRequestDto = z.infer; - -/** - * UpdateInvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const UpdateInvoiceRemarksDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); -export type UpdateInvoiceRemarksDto = z.infer; - -/** - * UpdateInvoiceCustomerDtoSchema - * @type { object } - * @property { string } name - * @property { string } reference - * @property { string } contact - */ -export const UpdateInvoiceCustomerDtoSchema = z.object({ name: z.string().nullable(), reference: z.string().nullable(), contact: z.string().nullable() }).partial(); -export type UpdateInvoiceCustomerDto = z.infer; - -/** - * UpdateInvoiceRequestDtoSchema - * @type { object } - * @property { string } issuingDate Invoice date in ISO format - * @property { string } receiptDate Receipt date in ISO format - * @property { string } serviceDate Service date in ISO format - * @property { string } serviceDateUntil Service end date in ISO format - * @property { string } dueDate Due date in ISO format - * @property { string } invoiceNumber Invoice number - * @property { string } internalNumber Internal reference number - * @property { number } paymentTermDays Payment term in days - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { string } serviceRecipientId Service recipient ID - * @property { string } bankAccountId Bank account ID - * @property { UpdateInvoiceRemarksDto } remarks Additional remarks - * @property { InvoiceLanguageEnum } language Invoice language - * @property { boolean } showPaymentInstructions - * @property { UpdateInvoiceCustomerDto } customer - * @property { string } salesRepId - * @property { string } currencyNotation - * @property { number } exchangeRate Invoice exchange rate - */ -export const UpdateInvoiceRequestDtoSchema = z.object({ issuingDate: z.iso.datetime({ offset: true }).nullable(), receiptDate: z.iso.datetime({ offset: true }).nullable(), serviceDate: z.iso.datetime({ offset: true }).nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).nullable(), dueDate: z.iso.datetime({ offset: true }).nullable(), invoiceNumber: z.string().nullable(), internalNumber: z.string().nullable(), paymentTermDays: z.number().nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullable(), serviceRecipientId: z.string().nullable(), bankAccountId: z.string().nullable(), remarks: UpdateInvoiceRemarksDtoSchema.nullable(), language: InvoiceLanguageEnumSchema.nullable(), showPaymentInstructions: z.boolean().nullable(), customer: UpdateInvoiceCustomerDtoSchema.nullable(), salesRepId: z.string().nullable(), currencyNotation: z.string().nullable(), exchangeRate: z.number().nullable() }).partial(); -export type UpdateInvoiceRequestDto = z.infer; - -/** - * FixInvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const FixInvoiceRemarksDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); -export type FixInvoiceRemarksDto = z.infer; - -/** - * FixInvoiceCustomerDtoSchema - * @type { object } - * @property { string } reference Customer reference number - */ -export const FixInvoiceCustomerDtoSchema = z.object({ reference: z.string().nullable() }).partial(); -export type FixInvoiceCustomerDto = z.infer; - -/** - * FixInvoiceRequestDtoSchema - * @type { object } - * @property { string } currencyNotation Invoice currency (incoming invoices only) - * @property { string } issuingDate Update invoice date in ISO format - * @property { string } dueDate Update invoice due date in ISO format - * @property { number } exchangeRate Invoice exchange rate - * @property { number } paymentTermDays Payment term in days - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { string } receiptDate Update receipt date in ISO format - * @property { string } serviceDate Update service date in ISO format - * @property { string } serviceDateUntil Update service end date in ISO format - * @property { boolean } isVatOk Mark VAT as checked/OK by accounting - * @property { boolean } isInvoiceOk Mark overall invoice as checked/OK by accounting - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { string } comments - * @property { FixInvoiceRemarksDto } remarks Additional remarks - * @property { string } invoiceNumber Invoice number (incoming invoices only) - * @property { string } bankAccountId Bank account ID - * @property { string } serviceRecipientId Service recipient ID - * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) - */ -export const FixInvoiceRequestDtoSchema = z.object({ currencyNotation: z.string().nullable(), issuingDate: z.iso.datetime({ offset: true }).nullable(), dueDate: z.iso.datetime({ offset: true }).nullable(), exchangeRate: z.number().nullable(), paymentTermDays: z.number().nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullable(), receiptDate: z.iso.datetime({ offset: true }).nullable(), serviceDate: z.iso.datetime({ offset: true }).nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).nullable(), isVatOk: z.boolean().nullable(), isInvoiceOk: z.boolean().nullable(), dunningBlock: z.boolean().nullable(), invoiceInReview: z.boolean().nullable(), comments: z.string().nullable(), remarks: FixInvoiceRemarksDtoSchema.nullable(), invoiceNumber: z.string().nullable(), bankAccountId: z.string().nullable(), serviceRecipientId: z.string().nullable(), customer: FixInvoiceCustomerDtoSchema.nullable() }).partial(); -export type FixInvoiceRequestDto = z.infer; - -/** - * UpdateIssuedInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity. Minimum: `0` - * @property { number } amount Amount (must be positive). Minimum: `0.01` - * @property { string } vatRuleId VAT rule ID - * @property { number } exchangeRate Charge exchange rate (incoming invoices only) - * @property { string } currencyNotation - */ -export const UpdateIssuedInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string(), chargeTypeId: z.string().nullish(), additionalText: z.string().nullish(), quantity: z.number().gte(0).nullish(), amount: z.number().gte(0.01).nullish(), vatRuleId: z.string().nullish(), exchangeRate: z.number().nullish(), currencyNotation: z.string().nullish() }); -export type UpdateIssuedInvoiceChargeRequestDto = z.infer; - -/** - * UpdateIssuedInvoiceChargesRequestDtoSchema - * @type { object } - * @property { UpdateIssuedInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` - */ -export const UpdateIssuedInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateIssuedInvoiceChargeRequestDtoSchema).min(1) }); -export type UpdateIssuedInvoiceChargesRequestDto = z.infer; - -/** - * UpdateInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity. Minimum: `0` - * @property { number } amount Amount (must be positive). Minimum: `0.01` - * @property { string } vatRuleId VAT rule ID - * @property { number } exchangeRate - * @property { string } currencyNotation - */ -export const UpdateInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string(), chargeTypeId: z.string().nullish(), additionalText: z.string().nullish(), quantity: z.number().gte(0).nullish(), amount: z.number().gte(0.01).nullish(), vatRuleId: z.string().nullish(), exchangeRate: z.number().nullish(), currencyNotation: z.string().nullish() }); -export type UpdateInvoiceChargeRequestDto = z.infer; - -/** - * UpdateInvoiceChargesRequestDtoSchema - * @type { object } - * @property { UpdateInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` - */ -export const UpdateInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateInvoiceChargeRequestDtoSchema).min(1) }); -export type UpdateInvoiceChargesRequestDto = z.infer; - -/** - * InvoiceFilterDtoSchema - * @type { object } - * @property { string[] } status - * @property { string } direction - * @property { string } receiver Filter by invoice receiver/customer ID (UUID) - */ -export const InvoiceFilterDtoSchema = z.object({ status: z.array(CommonModels.InvoiceStatusEnumSchema).nullable(), direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), receiver: z.string().nullable() }).partial(); -export type InvoiceFilterDto = z.infer; - -/** - * ChangeInvoiceCustomerRequestDtoSchema - * @type { object } - * @property { string } newCustomerId - */ -export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }); -export type ChangeInvoiceCustomerRequestDto = z.infer; - -/** - * CreateDirectInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const CreateDirectInvoiceChargeRequestDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); -export type CreateDirectInvoiceChargeRequestDto = z.infer; - -/** - * UpdateIssuedInvoiceVatRulesRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } vatRuleId VAT rule ID - */ -export const UpdateIssuedInvoiceVatRulesRequestDtoSchema = z.object({ positionChargeItemId: z.string(), vatRuleId: z.string() }); -export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; - -/** - * PrepareUploadRequestDtoSchema - * @type { object } - * @property { string } filename - * @property { string } mimeType - * @property { number } fileSize - */ -export const PrepareUploadRequestDtoSchema = z.object({ filename: z.string().nullish(), mimeType: z.string(), fileSize: z.number() }); -export type PrepareUploadRequestDto = z.infer; - -/** - * InvoiceUploadInstructionsDtoSchema - * @type { object } - * @property { string } url Pre-signed URL for the PUT request to storage - * @property { string } method HTTP method to use for upload - */ -export const InvoiceUploadInstructionsDtoSchema = z.object({ url: z.string(), method: z.string() }); -export type InvoiceUploadInstructionsDto = z.infer; - -/** - * GetInvoicesEmlInvoiceIdsParamSchema - * @type { array } - */ -export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).nullish(); -export type GetInvoicesEmlInvoiceIdsParam = z.infer; - -/** - * InvoicesFindOrderParamEnumSchema - * @type { enum } - */ -export const InvoicesFindOrderParamEnumSchema = z.enum(["status", "createdAt", "serviceDate"]); -export type InvoicesFindOrderParamEnum = z.infer; -export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; - -/** - * InvoicesFindResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { InvoicePreviewDto[] } items - */ -export const InvoicesFindResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(InvoicePreviewDtoSchema).nullable() }).partial().shape }); -export type InvoicesFindResponse = z.infer; - -/** - * FindByOfficeOrderParamEnumSchema - * @type { enum } - */ -export const FindByOfficeOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); -export type FindByOfficeOrderParamEnum = z.infer; -export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; - -/** - * FindByOfficeResponseSchema - * @type { object } - * @property { number } totalAmountInDefaultCurrency - * @property { string } defaultCurrencyNotation - * @property { TotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficeInvoicePreviewDto[] } items - */ -export const FindByOfficeResponseSchema = z.object({ ...OfficeInvoiceListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).nullable() }).partial().shape }); -export type FindByOfficeResponse = z.infer; - -/** - * GetUnChargesOrderParamEnumSchema - * @type { enum } - */ -export const GetUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); -export type GetUnChargesOrderParamEnum = z.infer; -export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; - -/** - * GetUnChargesResponseSchema - * @type { object } - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { UninvoicedChargeDto[] } items - */ -export const GetUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).nullable() }).partial().shape }); -export type GetUnChargesResponse = z.infer; - -/** - * InvoicesListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ -export const InvoicesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).nullable() }).partial().shape }); -export type InvoicesListAvailablePartnersForResponse = z.infer; - -/** - * GetOfficeUnChargesOrderParamEnumSchema - * @type { enum } - */ -export const GetOfficeUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); -export type GetOfficeUnChargesOrderParamEnum = z.infer; -export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnumSchema.enum; - -/** - * GetOfficeUnChargesResponseSchema - * @type { object } - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { UninvoicedChargeDto[] } items - */ -export const GetOfficeUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).nullable() }).partial().shape }); -export type GetOfficeUnChargesResponse = z.infer; - -} diff --git a/test/generated/base/invoices/invoices.queries.ts b/test/generated/base/invoices/invoices.queries.ts deleted file mode 100644 index 528519a..0000000 --- a/test/generated/base/invoices/invoices.queries.ts +++ /dev/null @@ -1,1123 +0,0 @@ -import axios, { } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InvoicesAcl } from "./invoices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { InvoicesApi } from "./invoices.api"; - -export namespace InvoicesQueries { -export const moduleName = QueryModule.Invoices; - -export const keys = { - all: [moduleName] as const, - getInvoicesEml: (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam) => [...keys.all, "/offices/:officeId/invoices/eml", officeId, invoiceIds] as const, - find: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", officeId, positionId, limit, order, filter, page, cursor] as const, - findInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", "infinite", officeId, positionId, limit, order, filter, cursor] as const, - findByOffice: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", officeId, limit, order, filter, page, cursor] as const, - findByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", "infinite", officeId, limit, order, filter, cursor] as const, - getUnCharges: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", officeId, positionId, limit, order, filter, page, cursor] as const, - getUnChargesInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", "infinite", officeId, positionId, limit, order, filter, cursor] as const, - listAvailablePartnersFor: (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/available-partners", officeId, invoiceId, search, useCase] as const, - getOfficeUnCharges: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", officeId, limit, order, filter, page, cursor] as const, - getOfficeUnChargesInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", "infinite", officeId, limit, order, filter, cursor] as const, - getDetail: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId", officeId, invoiceId] as const, - getPreview: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/preview", officeId, invoiceId] as const, - getInvoiceEml: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/eml", officeId, invoiceId] as const, -}; - -/** - * Query `useGetInvoicesEml` - recommended when file should be cached - * @summary Get invoices as EML file with PDF attachments - * @permission Requires `canUseGetInvoicesEml` ability - * @param { string } object.officeId Path parameter - * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } object.invoiceIds Query parameter. Invoice IDs - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoicesEml = ({ officeId, invoiceIds }: { officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvoicesEml(officeId, invoiceIds), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds) }, - ...options, - }); -}; - -/** - * Mutation `useGetInvoicesEmlMutation` - recommended when file should not be cached - * @summary Get invoices as EML file with PDF attachments - * @permission Requires `canUseGetInvoicesEml` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } mutation.invoiceIds Query parameter. Invoice IDs - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoicesEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceIds }) => { - checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFind` - * @summary List invoices for a position - * @permission Requires `canUseFind` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` - * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFind = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseFind({ officeId } )); - return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindInfinite - * @summary List invoices for a position - * @permission Requires `canUseFind` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` - * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseFind({ officeId } )); - return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useChangeIncomingCustomer` - * @summary Change incoming invoice customer and update vendors on registered charges - * @permission Requires `canUseChangeIncomingCustomer` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.ChangeInvoiceCustomerRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useChangeIncomingCustomer = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId } )); - return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindByOffice` - * @summary List invoices for an office - * @permission Requires `canUseFindByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); - return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindByOfficeInfinite - * @summary List invoices for an office - * @permission Requires `canUseFindByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); - return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateDraft` - * @summary Create a draft invoice from charge items - * @permission Requires `canUseCreateDraft` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.CreateDraftInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useCreateDraft = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseCreateDraft({ officeId } )); - return InvoicesApi.createDraft(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportInvoices` - recommended when file should not be cached - * @summary Export invoices to Excel - * @permission Requires `canUseExportInvoices` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportInvoices = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportInvoices({ officeId } )); - return InvoicesApi.exportInvoices(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportCharges` - recommended when file should not be cached - * @summary Export invoice charges as Excel file - * @permission Requires `canUseExportCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportCharges({ officeId } )); - return InvoicesApi.exportCharges(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetUnCharges` - * @summary Get uninvoiced charges for a position - * @permission Requires `canUseGetUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetUnCharges = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useGetUnChargesInfinite - * @summary Get uninvoiced charges for a position - * @permission Requires `canUseGetUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetUnChargesInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for an invoice (union of position involved parties) - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListAvailablePartnersFor = ({ officeId, invoiceId, search, useCase }: { officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), - queryFn: () => { - checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId } )); - return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase) }, - ...options, - }); -}; - -/** - * Query `useGetOfficeUnCharges` - * @summary Get uninvoiced charges for all positions in an office - * @permission Requires `canUseGetOfficeUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetOfficeUnCharges = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useGetOfficeUnChargesInfinite - * @summary Get uninvoiced charges for all positions in an office - * @permission Requires `canUseGetOfficeUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetOfficeUnChargesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useExportUnCharges` - recommended when file should not be cached - * @summary Export uninvoiced charges as Excel file - * @permission Requires `canUseExportUnCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.UninvoicedChargesExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportUnCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId } )); - return InvoicesApi.exportUnCharges(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateDirect` - * @summary Dummy endpoint to expose direct invoice permission to FE - * @permission Requires `canUseCreateDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useCreateDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId }) => { - checkAcl(InvoicesAcl.canUseCreateDirect({ officeId } )); - return InvoicesApi.createDirect(officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useAddChargeToDirect` - * @summary Add a charge to a direct invoice - * @permission Requires `canUseAddChargeToDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.CreateDirectInvoiceChargeRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useAddChargeToDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId } )); - return InvoicesApi.addChargeToDirect(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateCharges` - * @summary Update charges on a draft invoice - * @permission Requires `canUseUpdateCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateInvoiceChargesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdateCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId } )); - return InvoicesApi.updateCharges(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRemoveChargeFromDirect` - * @summary Remove a charge from a direct invoice - * @permission Requires `canUseRemoveChargeFromDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.chargeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useRemoveChargeFromDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, chargeId }) => { - checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId } )); - return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetDetail` - * @summary Get invoice details - * @permission Requires `canUseGetDetail` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, default] - */ -export const useGetDetail = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDetail(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetDetail({ officeId } )); - return InvoicesApi.getDetail(officeId, invoiceId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update invoice details - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdate({ officeId } )); - return InvoicesApi.update(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteInvoice` - * @summary Delete invoice - * @permission Requires `canUseDeleteInvoice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteInvoice = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId } )); - return InvoicesApi.deleteInvoice(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useFix` - * @summary Fix invoice with accounting permission - * @permission Requires `canUseFix` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.FixInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useFix = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseFix({ officeId } )); - return InvoicesApi.fix(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerate` - recommended when file should not be cached - * @summary Generate an invoice PDF - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGenerate({ officeId } )); - return InvoicesApi.generate(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateIssuedVatRules` - * @summary Update VAT rules on issued invoice charges - * @permission Requires `canUseUpdateIssuedVatRules` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdateIssuedVatRules = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId } )); - return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateIssuedCharges` - * @summary Update charges on issued invoice - * @permission Requires `canUseUpdateIssuedCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdateIssuedCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId } )); - return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useIssue` - recommended when file should not be cached - * @summary Issue outgoing invoice - * @permission Requires `canUseIssue` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useIssue = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseIssue({ officeId } )); - return InvoicesApi.issue(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReportHungarian` - * @summary Report invoice to Hungarian tax authority - * @permission Requires `canUseReportHungarian` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReportHungarian = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseReportHungarian({ officeId } )); - return InvoicesApi.reportHungarian(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateIncoming` - recommended when file should not be cached - * @summary Re-Generate an invoice PDF - * @permission Requires `canUseGenerateIncoming` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGenerateIncoming = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId } )); - return InvoicesApi.generateIncoming(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRegister` - * @summary Register incoming invoice - * @permission Requires `canUseRegister` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useRegister = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseRegister({ officeId } )); - return InvoicesApi.register(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetPreview` - recommended when file should be cached - * @summary Get invoice PDF preview - * @permission Requires `canUseGetPreview` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetPreview = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getPreview(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); - return InvoicesApi.getPreview(officeId, invoiceId) }, - ...options, - }); -}; - -/** - * Mutation `useGetPreviewMutation` - recommended when file should not be cached - * @summary Get invoice PDF preview - * @permission Requires `canUseGetPreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetPreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); - return InvoicesApi.getPreview(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetInvoiceEml` - recommended when file should be cached - * @summary Get invoice as EML file with PDF attachment - * @permission Requires `canUseGetInvoiceEml` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoiceEml = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvoiceEml(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); - return InvoicesApi.getInvoiceEml(officeId, invoiceId) }, - ...options, - }); -}; - -/** - * Mutation `useGetInvoiceEmlMutation` - recommended when file should not be cached - * @summary Get invoice as EML file with PDF attachment - * @permission Requires `canUseGetInvoiceEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoiceEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); - return InvoicesApi.getInvoiceEml(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `usePrepareDocumentUpload` - * @summary Prepare for invoice document upload - * @permission Requires `canUsePrepareDocumentUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.PrepareUploadRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const usePrepareDocumentUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { - checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId } )); - const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCancel` - * @summary Cancel invoice (create draft credit note) - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseCancel({ officeId } )); - return InvoicesApi.cancel(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useIssueCreditNote` - * @summary Issue credit invoice - * @permission Requires `canUseIssueCreditNote` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useIssueCreditNote = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId } )); - return InvoicesApi.issueCreditNote(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/masterData/masterData.acl.ts b/test/generated/base/masterData/masterData.acl.ts deleted file mode 100644 index 2c0c2c9..0000000 --- a/test/generated/base/masterData/masterData.acl.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace MasterDataAcl { -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -} diff --git a/test/generated/base/masterData/masterData.api.ts b/test/generated/base/masterData/masterData.api.ts deleted file mode 100644 index 5eaf692..0000000 --- a/test/generated/base/masterData/masterData.api.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { MasterDataModels } from "./masterData.models"; - -export namespace MasterDataApi { -export const findAll = (officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string, ) => { - return AppRestClient.get( - { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, - `/offices/${officeId}/master-data/autocomplete`, - { - params: { - types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { type: "query", name: "types" }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -export const paginate = (officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, - `/offices/${officeId}/master-data/labels/paginated`, - { - params: { - types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { type: "query", name: "types" }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/base/masterData/masterData.configs.ts b/test/generated/base/masterData/masterData.configs.ts deleted file mode 100644 index 06f2f06..0000000 --- a/test/generated/base/masterData/masterData.configs.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { dynamicColumns } from "@povio/ui"; -import { MasterDataModels } from "./masterData.models"; -import { MasterDataQueries } from "./masterData.queries"; -import { MasterDataAcl } from "./masterData.acl"; - -export namespace MasterDataConfigs { -export const paginatedConfig = { - meta: { - title: "Paginated", - }, - readAll: { - acl: MasterDataAcl.canUsePaginate, - schema: MasterDataModels.MasterDataLabelResponseDTOSchema, - paginated: MasterDataQueries.usePaginate, - infinite: MasterDataQueries.usePaginateInfinite, - columns: dynamicColumns({ - schema: MasterDataModels.MasterDataLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - type: true, - }, - }, -}), - }, -}; - -} diff --git a/test/generated/base/masterData/masterData.models.ts b/test/generated/base/masterData/masterData.models.ts deleted file mode 100644 index 832cbb1..0000000 --- a/test/generated/base/masterData/masterData.models.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace MasterDataModels { -/** - * MasterDataTypeEnumSchema - * @type { enum } - */ -export const MasterDataTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "City", "Warehouse", "ContainerYard", "PortTerminal", "AirportTerminal", "Port", "Airport"]); -export type MasterDataTypeEnum = z.infer; -export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; - -/** - * MasterDataItemResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the item - * @property { string } name Name of the item - * @property { MasterDataTypeEnum } type Type of the item - */ -export const MasterDataItemResponseDTOSchema = z.object({ id: z.string(), name: z.string(), type: MasterDataTypeEnumSchema }); -export type MasterDataItemResponseDTO = z.infer; - -/** - * MasterDataItemsResponseDTOSchema - * @type { object } - * @property { MasterDataItemResponseDTO[] } items List of master data items - */ -export const MasterDataItemsResponseDTOSchema = z.object({ items: z.array(MasterDataItemResponseDTOSchema) }); -export type MasterDataItemsResponseDTO = z.infer; - -/** - * MasterDataLabelResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the item - * @property { string } label Label of the item - * @property { MasterDataTypeEnum } type Type of the item - */ -export const MasterDataLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), type: MasterDataTypeEnumSchema }); -export type MasterDataLabelResponseDTO = z.infer; - -/** - * MasterDataFindAllTypesParamSchema - * @type { array } - */ -export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema); -export type MasterDataFindAllTypesParam = z.infer; - -/** - * MasterDataPaginateTypesParamSchema - * @type { array } - */ -export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema); -export type MasterDataPaginateTypesParam = z.infer; - -/** - * MasterDataPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { MasterDataLabelResponseDTO[] } items - */ -export const MasterDataPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(MasterDataLabelResponseDTOSchema).nullable() }).partial().shape }); -export type MasterDataPaginateResponse = z.infer; - -} diff --git a/test/generated/base/masterData/masterData.queries.ts b/test/generated/base/masterData/masterData.queries.ts deleted file mode 100644 index 8fba241..0000000 --- a/test/generated/base/masterData/masterData.queries.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { MasterDataAcl } from "./masterData.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { MasterDataModels } from "./masterData.models"; -import { MasterDataApi } from "./masterData.api"; - -export namespace MasterDataQueries { -export const moduleName = QueryModule.MasterData; - -export const keys = { - all: [moduleName] as const, - findAll: (officeId: string, types?: MasterDataModels.MasterDataFindAllTypesParam, search?: string) => [...keys.all, "/offices/:officeId/master-data/autocomplete", officeId, types, search] as const, - paginate: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", officeId, types, limit, search, page, cursor] as const, - paginateInfinite: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", "infinite", officeId, types, limit, search, cursor] as const, -}; - -/** - * Query `useFindAll` - * @summary List master data based on provided type - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataFindAllTypesParam } object.types Query parameter - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ officeId, types, search }: { officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(officeId, types, search), - queryFn: () => { - checkAcl(MasterDataAcl.canUseFindAll()); - return MasterDataApi.findAll(officeId, types, search) }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate master data based on provided type - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.search Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, types, limit, search, page, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, types, limit, search, page, cursor), - queryFn: () => { - checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate master data based on provided type - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.search Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, types, limit, search, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), - queryFn: ({ pageParam }) => { - checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/base/masterDataImport/masterDataImport.acl.ts b/test/generated/base/masterDataImport/masterDataImport.acl.ts deleted file mode 100644 index 7e98741..0000000 --- a/test/generated/base/masterDataImport/masterDataImport.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace MasterDataImportAcl { -/** - * Use for `useUpload` mutation ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpload` mutation - */ -export const canUseUpload = ( - object?: { officeId: string, } -) => [ - "Import", - object ? subject("MasterData", object) : "MasterData" -] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - -/** - * Use for `usePostOfficesMasterDataImportByOfficeId` mutation ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePostOfficesMasterDataImportByOfficeId` mutation - */ -export const canUsePostOfficesMasterDataImportByOfficeId = ( - object?: { officeId: string, } -) => [ - "Import", - object ? subject("MasterData", object) : "MasterData" -] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - -/** - * Use for `useGetImportStatus` query ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetImportStatus` query - */ -export const canUseGetImportStatus = ( - object?: { officeId: string, } -) => [ - "Import", - object ? subject("MasterData", object) : "MasterData" -] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - -} diff --git a/test/generated/base/masterDataImport/masterDataImport.api.ts b/test/generated/base/masterDataImport/masterDataImport.api.ts deleted file mode 100644 index af38583..0000000 --- a/test/generated/base/masterDataImport/masterDataImport.api.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { MasterDataImportModels } from "./masterDataImport.models"; - -export namespace MasterDataImportApi { -export const upload = (officeId: string, data: MasterDataImportModels.MasterDataImportUploadRequestDto, ) => { - return AppRestClient.post( - { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, - `/offices/${officeId}/master-data/upload`, - ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), - - ) -}; -export const postOfficesMasterDataImportByOfficeId = (officeId: string, data: MasterDataImportModels.MasterDataImportRequestDto, ) => { - return AppRestClient.post( - { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, - `/offices/${officeId}/master-data/import`, - ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), - - ) -}; -export const getImportStatus = (jobId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, - `/offices/${officeId}/master-data/import/${jobId}/status`, - - ) -}; -} diff --git a/test/generated/base/masterDataImport/masterDataImport.models.ts b/test/generated/base/masterDataImport/masterDataImport.models.ts deleted file mode 100644 index a2dc56c..0000000 --- a/test/generated/base/masterDataImport/masterDataImport.models.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { z } from "zod"; - -export namespace MasterDataImportModels { -/** - * ImportStatusEnumSchema - * @type { enum } - * @description Import result status - */ -export const ImportStatusEnumSchema = z.enum(["Success", "Warning", "Error"]); -export type ImportStatusEnum = z.infer; -export const ImportStatusEnum = ImportStatusEnumSchema.enum; - -/** - * ImportTypeEnumSchema - * @type { enum } - */ -export const ImportTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Warehouse"]); -export type ImportTypeEnum = z.infer; -export const ImportTypeEnum = ImportTypeEnumSchema.enum; - -/** - * MasterDataImportRequestDtoSchema - * @type { object } - * @property { string } mediaId Media ID of the uploaded file - * @property { ImportTypeEnum } type Type of data to import - */ -export const MasterDataImportRequestDtoSchema = z.object({ mediaId: z.string(), type: ImportTypeEnumSchema }); -export type MasterDataImportRequestDto = z.infer; - -/** - * ImportResultDtoSchema - * @type { object } - * @property { string } importStatus Import result status - * @property { string } downloadUrl S3 presigned URL for result file download - * @property { string } expiresAt Download URL expiration time - * @property { string } errorCode - */ -export const ImportResultDtoSchema = z.object({ importStatus: ImportStatusEnumSchema.nullish(), downloadUrl: z.string(), expiresAt: z.iso.datetime({ offset: true }).nullish(), errorCode: z.string().nullish() }); -export type ImportResultDto = z.infer; - -/** - * ImportStatusResponseDtoSchema - * @type { object } - * @property { string } status Current job status - * @property { ImportResultDto } result Import result data when job is completed - */ -export const ImportStatusResponseDtoSchema = z.object({ status: z.string().nullable(), result: ImportResultDtoSchema.nullish() }); -export type ImportStatusResponseDto = z.infer; - -/** - * MasterDataImportUploadRequestDtoSchema - * @type { object } - * @property { string } filename File name - * @property { string } contentType Content type of the file - * @property { number } fileSize File size in bytes. Minimum: `1` - */ -export const MasterDataImportUploadRequestDtoSchema = z.object({ filename: z.string(), contentType: z.string(), fileSize: z.number().gte(1) }); -export type MasterDataImportUploadRequestDto = z.infer; - -/** - * MasterDataImportUploadResponseDtoSchema - * @type { object } - * @property { string } mediaId Media ID for the uploaded file - * @property { string } url S3 presigned upload URL - */ -export const MasterDataImportUploadResponseDtoSchema = z.object({ mediaId: z.string(), url: z.string() }); -export type MasterDataImportUploadResponseDto = z.infer; - -/** - * MasterDataImportResponseDtoSchema - * @type { object } - * @property { string } jobId PG Boss job ID - * @property { string } status Initial job status - */ -export const MasterDataImportResponseDtoSchema = z.object({ jobId: z.string(), status: z.string().nullish() }); -export type MasterDataImportResponseDto = z.infer; - -} diff --git a/test/generated/base/masterDataImport/masterDataImport.queries.ts b/test/generated/base/masterDataImport/masterDataImport.queries.ts deleted file mode 100644 index e6f857d..0000000 --- a/test/generated/base/masterDataImport/masterDataImport.queries.ts +++ /dev/null @@ -1,121 +0,0 @@ -import axios, { } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { MasterDataImportAcl } from "./masterDataImport.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { MasterDataImportModels } from "./masterDataImport.models"; -import { MasterDataImportApi } from "./masterDataImport.api"; - -export namespace MasterDataImportQueries { -export const moduleName = QueryModule.MasterDataImport; - -export const keys = { - all: [moduleName] as const, - getImportStatus: (jobId: string, officeId: string) => [...keys.all, "/offices/:officeId/master-data/import/:jobId/status", jobId, officeId] as const, -}; - -/** - * Mutation `useUpload` - * @summary Create upload instructions for master data import file - * @permission Requires `canUseUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { MasterDataImportModels.MasterDataImportUploadRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(MasterDataImportAcl.canUseUpload({ officeId } )); - const uploadInstructions = await MasterDataImportApi.upload(officeId, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `usePostOfficesMasterDataImportByOfficeId` - * @summary Start master data import process - * @permission Requires `canUsePostOfficesMasterDataImportByOfficeId` ability - * @param { string } mutation.officeId Path parameter - * @param { MasterDataImportModels.MasterDataImportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const usePostOfficesMasterDataImportByOfficeId = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId } )); - return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetImportStatus` - * @summary Get import job status - * @permission Requires `canUseGetImportStatus` ability - * @param { string } object.jobId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetImportStatus = ({ jobId, officeId }: { jobId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getImportStatus(jobId, officeId), - queryFn: () => { - checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId } )); - return MasterDataImportApi.getImportStatus(jobId, officeId) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/offices/offices.acl.ts b/test/generated/base/offices/offices.acl.ts deleted file mode 100644 index 0f81019..0000000 --- a/test/generated/base/offices/offices.acl.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace OfficesAcl { -/** - * Use for `useCreate` mutation ability. - * @description Create office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Office" -] as AbilityTuple<"Create", "Office">; - -/** - * Use for `useGet` query ability. - * @description Read office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( -) => [ - "Read", - "Office" -] as AbilityTuple<"Read", "Office">; - -/** - * Use for `useUpdate` mutation ability. - * @description Update office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Office" -] as AbilityTuple<"Update", "Office">; - -/** - * Use for `useUploadDocumentImage` mutation ability. For global ability, omit the object parameter. - * @description Upload office document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadDocumentImage` mutation - */ -export const canUseUploadDocumentImage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useCreateBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Create office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBankAccount` mutation - */ -export const canUseCreateBankAccount = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useUpdateBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Update office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBankAccount` mutation - */ -export const canUseUpdateBankAccount = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useDeleteBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Delete office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBankAccount` mutation - */ -export const canUseDeleteBankAccount = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useUploadBankAccountFooter` mutation ability. For global ability, omit the object parameter. - * @description Upload bank account footer - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadBankAccountFooter` mutation - */ -export const canUseUploadBankAccountFooter = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -} diff --git a/test/generated/base/offices/offices.api.ts b/test/generated/base/offices/offices.api.ts deleted file mode 100644 index 6e096af..0000000 --- a/test/generated/base/offices/offices.api.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { OfficesModels } from "./offices.models"; - -export namespace OfficesApi { -export const paginate = (limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: OfficesModels.OfficesPaginateResponseSchema }, - `/offices`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: OfficesModels.CreateOfficeRequest, ) => { - return AppRestClient.post( - { resSchema: OfficesModels.OfficeResponseDtoSchema }, - `/offices`, - ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), - - ) -}; -export const findAllLabels = (search?: string, ) => { - return AppRestClient.get( - { resSchema: OfficesModels.FindAllLabelsResponseSchema }, - `/offices/labels`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, - `/offices/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const get = (id: string, ) => { - return AppRestClient.get( - { resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, - `/offices/${id}`, - - ) -}; -export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, ) => { - return AppRestClient.put( - { resSchema: OfficesModels.OfficeResponseDtoSchema }, - `/offices/${id}`, - ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), - - ) -}; -export const uploadDocumentImage = (officeId: string, data: OfficesModels.UploadOfficeDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, - `/offices/${officeId}/document-image`, - ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), - - ) -}; -export const createBankAccount = (officeId: string, data: OfficesModels.CreateOfficeBankAccountDto, ) => { - return AppRestClient.post( - { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, - `/offices/${officeId}/bank-accounts`, - ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), - - ) -}; -export const updateBankAccount = (accountId: string, officeId: string, data: OfficesModels.UpdateOfficeBankAccountDto, ) => { - return AppRestClient.patch( - { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, - `/offices/${officeId}/bank-accounts/${accountId}`, - ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), - - ) -}; -export const deleteBankAccount = (accountId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/bank-accounts/${accountId}`, - - ) -}; -export const uploadBankAccountFooter = (accountId: string, officeId: string, data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, ) => { - return AppRestClient.post( - { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, - `/offices/${officeId}/bank-accounts/${accountId}/footer`, - ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/offices/offices.configs.ts b/test/generated/base/offices/offices.configs.ts deleted file mode 100644 index 07f5587..0000000 --- a/test/generated/base/offices/offices.configs.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { OfficesModels } from "./offices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { OfficesQueries } from "./offices.queries"; -import { OfficesAcl } from "./offices.acl"; - -export namespace OfficesConfigs { -export const officesConfig = { - meta: { - title: "Offices", - }, - readAll: { - schema: OfficesModels.OfficeListItemResponseSchema, - paginated: OfficesQueries.usePaginate, - infinite: OfficesQueries.usePaginateInfinite, - filters: { - schema: OfficesModels.OfficeFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: OfficesModels.OfficeFilterDtoSchema, - options: { - inputs: { - name: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: OfficesModels.OfficeListItemResponseSchema, - options: { - columns: { - id: true, - name: true, - numberOfEmployees: true, - }, - sortable: OfficesModels.OfficesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: OfficesAcl.canUseGet, - schema: OfficesModels.OfficeDetailResponseDtoSchema, - query: OfficesQueries.useGet, - }, - create: { - acl: OfficesAcl.canUseCreate, - schema: OfficesModels.CreateOfficeRequestSchema, - mutation: OfficesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: OfficesModels.CreateOfficeRequestSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: OfficesAcl.canUseUpdate, - schema: OfficesModels.UpdateOfficeRequestSchema, - mutation: OfficesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: OfficesModels.UpdateOfficeRequestSchema, - options: { - inputs: { - name: true, - symbol: true, - invoicePrefix: true, - autoClosePositionsAfterDays: true, - defaultLanguage: true, - locale: true, - vatId: true, - taxNumber: true, - termsExport: true, - termsImport: true, - showPaymentInstructions: true, - showCompanyRegistrationNumber: true, - reportInvoicesToHungarianTaxAuthority: true, - restrictPositionInvolvedParties: true, - showWatermarkOnDocuments: true, - showInvoiceVatLinesInOfficeCurrency: true, - usePartnerMatchCodes: true, - restrictFinancePartnersToRelationship: true, - costCenterId: true, - minimumOutgoingInvoiceDate: true, - minimumOutgoingInvoiceServiceDate: true, - minimumIncomingInvoiceDate: true, - minimumIncomingInvoiceServiceDate: true, - countryId: true, - defaultCurrencyId: true, - representingBusinessPartnerId: true, - availableCurrencyIds: true, - generalLedgerSystem: true, - factoringReportingEnabled: true, - bankAccountCurrencyMapping: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - schema: CommonModels.LabelResponseDTOSchema, - paginated: OfficesQueries.usePaginateLabels, - infinite: OfficesQueries.usePaginateLabelsInfinite, - filters: { - schema: OfficesModels.OfficeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: OfficesModels.OfficeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/offices/offices.models.ts b/test/generated/base/offices/offices.models.ts deleted file mode 100644 index 3083b80..0000000 --- a/test/generated/base/offices/offices.models.ts +++ /dev/null @@ -1,390 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace OfficesModels { -/** - * OfficeCurrencyResponseDtoSchema - * @type { object } - * @property { string } isoCode - * @property { string } name - */ -export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }); -export type OfficeCurrencyResponseDto = z.infer; - -/** - * OfficeBankAccountCurrencyMappingResponseDtoSchema - * @type { object } - * @property { string } currency - * @property { string } bankAccountId - * @property { string } bankAccountName - */ -export const OfficeBankAccountCurrencyMappingResponseDtoSchema = z.object({ currency: z.string(), bankAccountId: z.string(), bankAccountName: z.string() }); -export type OfficeBankAccountCurrencyMappingResponseDto = z.infer; - -/** - * OfficeBookkeepingResponseDtoSchema - * @type { object } - * @property { string } generalLedgerSystem - * @property { OfficeCurrencyResponseDto } defaultCurrency - * @property { OfficeCurrencyResponseDto[] } availableCurrencies - * @property { boolean } showPaymentInstructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { OfficeBankAccountCurrencyMappingResponseDto[] } bankAccountCurrencyMapping - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { boolean } factoringReportingEnabled - */ -export const OfficeBookkeepingResponseDtoSchema = z.object({ generalLedgerSystem: z.string(), defaultCurrency: OfficeCurrencyResponseDtoSchema.nullish(), availableCurrencies: z.array(OfficeCurrencyResponseDtoSchema), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), bankAccountCurrencyMapping: z.array(OfficeBankAccountCurrencyMappingResponseDtoSchema), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), factoringReportingEnabled: z.boolean() }); -export type OfficeBookkeepingResponseDto = z.infer; - -/** - * OfficeDocumentPartEnumSchema - * @type { enum } - */ -export const OfficeDocumentPartEnumSchema = z.enum(["DocumentFooter", "DocumentHeader", "GeneralTermsAndConditions", "BLTermsAndConditions", "FinanceDocumentFooter"]); -export type OfficeDocumentPartEnum = z.infer; -export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; - -/** - * OfficeDocumentSettingsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } mediaUrl - * @property { CommonModels.LanguageEnum } language - * @property { OfficeDocumentPartEnum } documentPart - */ -export const OfficeDocumentSettingsResponseDtoSchema = z.object({ id: z.string(), mediaUrl: z.string(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }); -export type OfficeDocumentSettingsResponseDto = z.infer; - -/** - * AddressResponseDTOSchema - * @type { object } - * @property { string } id ID of the address - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } city City name - * @property { string } district District - * @property { string } isoCode2 2 letter country code - * @property { string } country Country name - * @property { string } isoCode3 3 letter country code - */ -export const AddressResponseDTOSchema = z.object({ id: z.string(), street: z.string(), secondaryStreet: z.string(), zip: z.string(), city: z.string(), district: z.string(), isoCode2: z.string(), country: z.string(), isoCode3: z.string() }); -export type AddressResponseDTO = z.infer; - -/** - * OfficeRepresentingBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string[] } types - * @property { string[] } email - * @property { string[] } phone - * @property { string } addressId - * @property { AddressResponseDTO } address - */ -export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), types: z.array(z.string()), email: z.array(z.string()).nullish(), phone: z.array(z.string()).nullish(), addressId: z.string().nullish(), address: AddressResponseDTOSchema.nullish() }); -export type OfficeRepresentingBusinessPartnerResponseDto = z.infer; - -/** - * OfficePaymentTermsResponseDtoSchema - * @type { object } - * @property { number } days - * @property { string } relativeTo - */ -export const OfficePaymentTermsResponseDtoSchema = z.object({ days: z.number().nullable(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema.nullable() }).partial(); -export type OfficePaymentTermsResponseDto = z.infer; - -/** - * OfficeCountryResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const OfficeCountryResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type OfficeCountryResponseDto = z.infer; - -/** - * OfficeBankAccountResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } bankName - * @property { string } iban - * @property { string } swiftBic - * @property { boolean } useFooterOnInvoice - * @property { object } footer - * @property { string } footer.mediaUrl - * @property { boolean } isFactoringBank - */ -export const OfficeBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string(), bankName: z.string(), iban: z.string(), swiftBic: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).nullish(), isFactoringBank: z.boolean() }); -export type OfficeBankAccountResponseDto = z.infer; - -/** - * OfficeDetailResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } symbol - * @property { number } invoicePrefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage - * @property { CommonModels.LocaleEnum } locale - * @property { string } vatId - * @property { string } taxNumber - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { OfficePaymentTermsResponseDto } termsExport - * @property { OfficePaymentTermsResponseDto } termsImport - * @property { OfficeCountryResponseDto } country - * @property { OfficeBankAccountResponseDto[] } bankAccounts - * @property { OfficeBookkeepingResponseDto } bookkeeping - * @property { OfficeDocumentSettingsResponseDto[] } documentSettings - * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner - * @property { boolean } hasInttraCredentials - */ -export const OfficeDetailResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), country: OfficeCountryResponseDtoSchema.nullable(), bankAccounts: z.array(OfficeBankAccountResponseDtoSchema), bookkeeping: OfficeBookkeepingResponseDtoSchema, documentSettings: z.array(OfficeDocumentSettingsResponseDtoSchema), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), hasInttraCredentials: z.boolean().nullish() }); -export type OfficeDetailResponseDto = z.infer; - -/** - * OfficeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } symbol - * @property { number } invoicePrefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage - * @property { CommonModels.LocaleEnum } locale - * @property { string } vatId - * @property { string } taxNumber - * @property { OfficePaymentTermsResponseDto } termsExport - * @property { OfficePaymentTermsResponseDto } termsImport - * @property { boolean } showPaymentInstructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { string } countryId - * @property { string } defaultCurrencyId - * @property { string[] } availableCurrencyIds - * @property { string } generalLedgerSystem - * @property { string } representingBusinessPartnerId - * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner - * @property { boolean } factoringReportingEnabled - */ -export const OfficeResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), countryId: z.string().nullable(), defaultCurrencyId: z.string().nullable(), availableCurrencyIds: z.array(z.string()).nullable(), generalLedgerSystem: z.string().nullable(), representingBusinessPartnerId: z.string().nullable(), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), factoringReportingEnabled: z.boolean() }); -export type OfficeResponseDto = z.infer; - -/** - * UpdateOfficePaymentTermsRequestSchema - * @type { object } - * @property { number } days - * @property { string } relativeTo - */ -export const UpdateOfficePaymentTermsRequestSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }); -export type UpdateOfficePaymentTermsRequest = z.infer; - -/** - * UpdateOfficeBankAccountCurrencyMappingSchema - * @type { object } - * @property { string } currency - * @property { string } bankAccountId - */ -export const UpdateOfficeBankAccountCurrencyMappingSchema = z.object({ currency: z.string(), bankAccountId: z.string() }); -export type UpdateOfficeBankAccountCurrencyMapping = z.infer; - -/** - * UpdateOfficeRequestSchema - * @type { object } - * @property { string } name Office Name - * @property { string } symbol Office Symbol - * @property { number } invoicePrefix Office Invoice Prefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage Office Default Language - * @property { string } locale - * @property { string } vatId Office Vat Id - * @property { string } taxNumber Office Tax Number - * @property { UpdateOfficePaymentTermsRequest } termsExport Office Terms Export - * @property { UpdateOfficePaymentTermsRequest } termsImport Office Terms Import - * @property { boolean } showPaymentInstructions Office Show Payment Instructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { string } countryId Office country id - * @property { string } defaultCurrencyId Office default currency id - * @property { string } representingBusinessPartnerId Representing business partner id - * @property { string[] } availableCurrencyIds Office availableCurrencyIds - * @property { string } generalLedgerSystem Office general ledger system - * @property { boolean } factoringReportingEnabled - * @property { UpdateOfficeBankAccountCurrencyMapping[] } bankAccountCurrencyMapping Office bank account currency mapping - */ -export const UpdateOfficeRequestSchema = z.object({ name: z.string().nullable(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullable(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullable(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), termsExport: UpdateOfficePaymentTermsRequestSchema.nullable(), termsImport: UpdateOfficePaymentTermsRequestSchema.nullable(), showPaymentInstructions: z.boolean().nullable(), showCompanyRegistrationNumber: z.boolean().nullable(), reportInvoicesToHungarianTaxAuthority: z.boolean().nullable(), restrictPositionInvolvedParties: z.boolean().nullable(), showWatermarkOnDocuments: z.boolean().nullable(), showInvoiceVatLinesInOfficeCurrency: z.boolean().nullable(), usePartnerMatchCodes: z.boolean().nullable(), restrictFinancePartnersToRelationship: z.boolean().nullable(), costCenterId: z.string().nullable(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullable(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullable(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullable(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullable(), countryId: z.string().nullable(), defaultCurrencyId: z.string().nullable(), representingBusinessPartnerId: z.string().nullable(), availableCurrencyIds: z.array(z.string()).nullable(), generalLedgerSystem: z.string().nullable(), factoringReportingEnabled: z.boolean().nullable(), bankAccountCurrencyMapping: z.array(UpdateOfficeBankAccountCurrencyMappingSchema).nullable() }).partial(); -export type UpdateOfficeRequest = z.infer; - -/** - * UploadOfficeDocumentRequestDtoSchema - * @type { object } - * @property { string } fileName File name with extension - * @property { string } mimeType MIME type of the file - * @property { number } fileSize Size of the file - * @property { string } language Language of the document - * @property { string } documentPart Part of the document this image represents - */ -export const UploadOfficeDocumentRequestDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }); -export type UploadOfficeDocumentRequestDto = z.infer; - -/** - * OfficeListItemResponseSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { number } numberOfEmployees - */ -export const OfficeListItemResponseSchema = z.object({ id: z.string(), name: z.string(), numberOfEmployees: z.number() }); -export type OfficeListItemResponse = z.infer; - -/** - * OfficeFilterDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } search - */ -export const OfficeFilterDtoSchema = z.object({ name: z.string().nullable(), search: z.string().nullable() }).partial(); -export type OfficeFilterDto = z.infer; - -/** - * OfficeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const OfficeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type OfficeLabelFilterDto = z.infer; - -/** - * CreateOfficeRequestSchema - * @type { object } - * @property { string } name - */ -export const CreateOfficeRequestSchema = z.object({ name: z.string() }); -export type CreateOfficeRequest = z.infer; - -/** - * DocumentImageUploadInstructionsDtoSchema - * @type { object } - * @property { string } method HTTP method to use for upload - * @property { string } url URL to upload the file to - * @property { string } documentId ID of the created/updated document setting - */ -export const DocumentImageUploadInstructionsDtoSchema = z.object({ method: z.string(), url: z.string(), documentId: z.string() }); -export type DocumentImageUploadInstructionsDto = z.infer; - -/** - * CreateOfficeBankAccountDtoSchema - * @type { object } - * @property { string } name Bank account name - * @property { string } bankName Bank name - * @property { string } iban IBAN - * @property { string } swiftBic SWIFT/BIC code - * @property { boolean } useFooterOnInvoice Use footer on invoice - */ -export const CreateOfficeBankAccountDtoSchema = z.object({ name: z.string().nullable(), bankName: z.string().nullable(), iban: z.string().nullable(), swiftBic: z.string().nullable(), useFooterOnInvoice: z.boolean().nullable() }).partial(); -export type CreateOfficeBankAccountDto = z.infer; - -/** - * UpdateOfficeBankAccountDtoSchema - * @type { object } - * @property { string } name Bank account name - * @property { string } bankName Bank name - * @property { string } iban IBAN - * @property { string } swiftBic SWIFT/BIC code - * @property { boolean } useFooterOnInvoice Use footer on invoice - * @property { boolean } isFactoringBank Is factoring bank - */ -export const UpdateOfficeBankAccountDtoSchema = z.object({ name: z.string().nullable(), bankName: z.string().nullable(), iban: z.string().nullable(), swiftBic: z.string().nullable(), useFooterOnInvoice: z.boolean().nullable(), isFactoringBank: z.boolean().nullable() }).partial(); -export type UpdateOfficeBankAccountDto = z.infer; - -/** - * UploadOfficeBankAccountFooterRequestDtoSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType File MIME type - * @property { number } fileSize Size of the file - */ -export const UploadOfficeBankAccountFooterRequestDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number() }); -export type UploadOfficeBankAccountFooterRequestDto = z.infer; - -/** - * OfficesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const OfficesPaginateOrderParamEnumSchema = z.enum(["name"]); -export type OfficesPaginateOrderParamEnum = z.infer; -export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema.enum; - -/** - * OfficesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficeListItemResponse[] } items - */ -export const OfficesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(OfficeListItemResponseSchema).nullable() }).partial().shape }); -export type OfficesPaginateResponse = z.infer; - -/** - * FindAllLabelsResponseSchema - * @type { array } - */ -export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type FindAllLabelsResponse = z.infer; - -/** - * OfficesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const OfficesPaginateLabelsOrderParamEnumSchema = z.enum(["name"]); -export type OfficesPaginateLabelsOrderParamEnum = z.infer; -export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * OfficesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const OfficesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type OfficesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/offices/offices.queries.ts b/test/generated/base/offices/offices.queries.ts deleted file mode 100644 index 5258732..0000000 --- a/test/generated/base/offices/offices.queries.ts +++ /dev/null @@ -1,403 +0,0 @@ -import axios, { } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { OfficesAcl } from "./offices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { OfficesModels } from "./offices.models"; -import { OfficesApi } from "./offices.api"; - -export namespace OfficesQueries { -export const moduleName = QueryModule.Offices; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string) => [...keys.all, "/offices", "infinite", limit, order, filter, cursor] as const, - findAllLabels: (search?: string) => [...keys.all, "/offices/labels", search] as const, - paginateLabels: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string) => [...keys.all, "/offices/labels/paginate", "infinite", limit, order, filter, cursor] as const, - get: (id: string) => [...keys.all, "/offices/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate offices - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => - OfficesApi.paginate(limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate offices - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - OfficesApi.paginate(limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create new office - * @permission Requires `canUseCreate` ability - * @param { OfficesModels.CreateOfficeRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(OfficesAcl.canUseCreate()); - return OfficesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindAllLabels` - * @summary List all offices with only their labels - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllLabels = ({ search }: { search?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findAllLabels(search), - queryFn: () => - OfficesApi.findAllLabels(search), - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate offices with only their labels - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => - OfficesApi.paginateLabels(limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate offices with only their labels - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGet` - * @summary Get office by id - * @permission Requires `canUseGet` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(id), - queryFn: () => { - checkAcl(OfficesAcl.canUseGet()); - return OfficesApi.get(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update office - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { OfficesModels.UpdateOfficeRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(OfficesAcl.canUseUpdate()); - return OfficesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUploadDocumentImage` - * @summary Upload document image for an office - * @permission Requires `canUseUploadDocumentImage` ability - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UploadOfficeDocumentRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUploadDocumentImage = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId } )); - const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateBankAccount` - * @summary Create office bank account - * @permission Requires `canUseCreateBankAccount` ability - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.CreateOfficeBankAccountDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId } )); - return OfficesApi.createBankAccount(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBankAccount` - * @summary Update office bank account - * @permission Requires `canUseUpdateBankAccount` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UpdateOfficeBankAccountDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ accountId, officeId, data }) => { - checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId } )); - return OfficesApi.updateBankAccount(accountId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteBankAccount` - * @summary Delete office bank account - * @permission Requires `canUseDeleteBankAccount` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ accountId, officeId }) => { - checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId } )); - return OfficesApi.deleteBankAccount(accountId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUploadBankAccountFooter` - * @summary Upload office bank account footer - * @permission Requires `canUseUploadBankAccountFooter` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UploadOfficeBankAccountFooterRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUploadBankAccountFooter = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId } )); - const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/packageTypes/packageTypes.acl.ts b/test/generated/base/packageTypes/packageTypes.acl.ts deleted file mode 100644 index f37bcb1..0000000 --- a/test/generated/base/packageTypes/packageTypes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PackageTypesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "PackageType" -] as AbilityTuple<"Read", "PackageType">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "PackageType" -] as AbilityTuple<"Create", "PackageType">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "PackageType" -] as AbilityTuple<"Read", "PackageType">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "PackageType" -] as AbilityTuple<"Read", "PackageType">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "PackageType" -] as AbilityTuple<"Update", "PackageType">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "PackageType" -] as AbilityTuple<"Archive", "PackageType">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "PackageType" -] as AbilityTuple<"Archive", "PackageType">; - -} diff --git a/test/generated/base/packageTypes/packageTypes.api.ts b/test/generated/base/packageTypes/packageTypes.api.ts deleted file mode 100644 index 72184b2..0000000 --- a/test/generated/base/packageTypes/packageTypes.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PackageTypesModels } from "./packageTypes.models"; - -export namespace PackageTypesApi { -export const paginate = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, - `/package-types`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, ) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types`, - ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, - `/package-types/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}`, - - ) -}; -export const update = (id: string, data: PackageTypesModels.UpdatePackageTypeRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}`, - ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/packageTypes/packageTypes.configs.ts b/test/generated/base/packageTypes/packageTypes.configs.ts deleted file mode 100644 index ba6aafd..0000000 --- a/test/generated/base/packageTypes/packageTypes.configs.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PackageTypesModels } from "./packageTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PackageTypesQueries } from "./packageTypes.queries"; -import { PackageTypesAcl } from "./packageTypes.acl"; - -export namespace PackageTypesConfigs { -export const packageTypesConfig = { - meta: { - title: "Package Types", - }, - readAll: { - acl: PackageTypesAcl.canUsePaginate, - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - paginated: PackageTypesQueries.usePaginate, - infinite: PackageTypesQueries.usePaginateInfinite, - filters: { - schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - length: true, - width: true, - height: true, - unit: true, - archived: true, - code: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PackageTypesAcl.canUseFindById, - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - query: PackageTypesQueries.useFindById, - }, - create: { - acl: PackageTypesAcl.canUseCreate, - schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, - mutation: PackageTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, - options: { - inputs: { - name: true, - length: true, - width: true, - height: true, - unit: true, - code: true, - }, - }, -}) - }, - update: { - acl: PackageTypesAcl.canUseUpdate, - schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, - mutation: PackageTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, - options: { - inputs: { - name: true, - length: true, - width: true, - height: true, - unit: true, - code: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: PackageTypesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PackageTypesQueries.usePaginateLabels, - infinite: PackageTypesQueries.usePaginateLabelsInfinite, - filters: { - schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/packageTypes/packageTypes.models.ts b/test/generated/base/packageTypes/packageTypes.models.ts deleted file mode 100644 index 25b4d59..0000000 --- a/test/generated/base/packageTypes/packageTypes.models.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PackageTypesModels { -/** - * PackageTypeCodeEnumSchema - * @type { enum } - */ -export const PackageTypeCodeEnumSchema = z.enum(["1A", "1B", "1D", "1F", "1G", "1W", "2C", "3A", "3H", "43", "44", "4A", "4B", "4C", "4D", "4F", "4G", "4H", "5H", "5L", "5M", "6H", "6P", "7A", "7B", "8A", "8B", "8C", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AL", "AM", "AP", "AT", "AV", "B4", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "DA", "DB", "DC", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DP", "DR", "DS", "DT", "DU", "DV", "DW", "DX", "DY", "EC", "ED", "EE", "EF", "EG", "EH", "EI", "EN", "FB", "FC", "FD", "FE", "FI", "FL", "FO", "FP", "FR", "FT", "FW", "FX", "GB", "GI", "GL", "GR", "GU", "GY", "GZ", "HA", "HB", "HC", "HG", "HN", "HR", "IA", "IB", "IC", "ID", "IE", "IF", "IG", "IH", "IK", "IL", "IN", "IZ", "JB", "JC", "JG", "JR", "JT", "JY", "KG", "KI", "LE", "LG", "LT", "LU", "LV", "LZ", "MA", "MB", "MC", "ME", "MR", "MS", "MT", "MW", "MX", "NA", "NE", "NF", "NG", "NS", "NT", "NU", "NV", "OA", "OB", "OC", "OD", "OE", "OF", "OK", "OT", "OU", "P2", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PI", "PJ", "PK", "PL", "PN", "PO", "PP", "PR", "PT", "PU", "PV", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "RD", "RG", "RJ", "RK", "RL", "RO", "RT", "RZ", "SA", "SB", "SC", "SD", "SE", "SH", "SI", "SK", "SL", "SM", "SO", "SP", "SS", "ST", "SU", "SV", "SW", "SY", "SZ", "T1", "TB", "TC", "TD", "TE", "TG", "TI", "TK", "TL", "TN", "TO", "TR", "TS", "TT", "TU", "TV", "TW", "TY", "TZ", "UC", "UN", "VA", "VG", "VI", "VK", "VL", "VO", "VP", "VQ", "VN", "VR", "VS", "VY", "WA", "WB", "WC", "WD", "WF", "WG", "WH", "WJ", "WK", "WL", "WM", "WN", "WP", "WQ", "WR", "WS", "WT", "WU", "WV", "WW", "WX", "WY", "WZ", "XA", "XB", "XC", "XD", "XF", "XG", "XH", "XJ", "XK", "YA", "YB", "YC", "YD", "YF", "YG", "YH", "YJ", "YK", "YL", "YM", "YN", "YP", "YQ", "YR", "YS", "YT", "YV", "YW", "YX", "YY", "YZ", "ZA", "ZB", "ZC", "ZD", "ZF", "ZG", "ZH", "ZJ", "ZK", "ZL", "ZM", "ZN", "ZP", "ZQ", "ZR", "ZS", "ZT", "ZU", "ZV", "ZW", "ZX", "ZY", "ZZ"]); -export type PackageTypeCodeEnum = z.infer; -export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; - -/** - * PackageTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type PackageTypeEmployeeDTO = z.infer; - -/** - * PackageTypeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the package type - * @property { string } name Unique name for the package type - * @property { number } length Length of the package type - * @property { number } width Width of the package type - * @property { number } height Height of the package type - * @property { string } unit Measurement unit for dimensions - * @property { boolean } archived Indicates if the package type is archived - * @property { PackageTypeCodeEnum } code - * @property { string } createdById - * @property { PackageTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PackageTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const PackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), unit: z.string(), archived: z.boolean(), code: PackageTypeCodeEnumSchema.nullish(), createdById: z.string().nullish(), createdBy: PackageTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PackageTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type PackageTypeResponseDTO = z.infer; - -/** - * CreatePackageTypeRequestDTOSchema - * @type { object } - * @property { string } name Unique name for the package type - * @property { number } length Length of the package type - * @property { number } width Width of the package type - * @property { number } height Height of the package type - * @property { string } unit Measurement unit for dimensions - * @property { PackageTypeCodeEnum } code - */ -export const CreatePackageTypeRequestDTOSchema = z.object({ name: z.string(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), unit: z.string(), code: PackageTypeCodeEnumSchema.nullish() }); -export type CreatePackageTypeRequestDTO = z.infer; - -/** - * UpdatePackageTypeRequestDTOSchema - * @type { object } - * @property { string } name Updated name for package type - * @property { number } length Updated length of the package type - * @property { number } width Updated width of the package type - * @property { number } height Updated height of the package type - * @property { string } unit Updated measurement unit for dimensions - * @property { PackageTypeCodeEnum } code - */ -export const UpdatePackageTypeRequestDTOSchema = z.object({ name: z.string().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), unit: z.string().nullable(), code: PackageTypeCodeEnumSchema.nullable() }).partial(); -export type UpdatePackageTypeRequestDTO = z.infer; - -/** - * PackageTypePaginationFilterDtoSchema - * @type { object } - * @property { boolean } archived Archived - * @property { string } search - */ -export const PackageTypePaginationFilterDtoSchema = z.object({ archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); -export type PackageTypePaginationFilterDto = z.infer; - -/** - * PackageTypeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const PackageTypeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type PackageTypeLabelFilterDto = z.infer; - -/** - * PackageTypesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PackageTypesPaginateOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PackageTypesPaginateOrderParamEnum = z.infer; -export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParamEnumSchema.enum; - -/** - * PackageTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PackageTypeResponseDTO[] } items - */ -export const PackageTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageTypeResponseDTOSchema).nullable() }).partial().shape }); -export type PackageTypesPaginateResponse = z.infer; - -/** - * PackageTypesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PackageTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PackageTypesPaginateLabelsOrderParamEnum = z.infer; -export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * PackageTypesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PackageTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PackageTypesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/packageTypes/packageTypes.queries.ts b/test/generated/base/packageTypes/packageTypes.queries.ts deleted file mode 100644 index 86ebe9e..0000000 --- a/test/generated/base/packageTypes/packageTypes.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PackageTypesAcl } from "./packageTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PackageTypesModels } from "./packageTypes.models"; -import { PackageTypesApi } from "./packageTypes.api"; - -export namespace PackageTypesQueries { -export const moduleName = QueryModule.PackageTypes; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string) => [...keys.all, "/package-types", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string) => [...keys.all, "/package-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/package-types/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Package Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Package Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new Package Type - * @permission Requires `canUseCreate` ability - * @param { PackageTypesModels.CreatePackageTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PackageTypesAcl.canUseCreate()); - return PackageTypesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate package type labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate package type labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get Package Type by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PackageTypesAcl.canUseFindById()); - return PackageTypesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Package Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PackageTypesModels.UpdatePackageTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PackageTypesAcl.canUseUpdate()); - return PackageTypesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Package Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PackageTypesAcl.canUseArchive()); - return PackageTypesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive Package Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PackageTypesAcl.canUseUnarchive()); - return PackageTypesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/partnerNetworks/partnerNetworks.acl.ts b/test/generated/base/partnerNetworks/partnerNetworks.acl.ts deleted file mode 100644 index b56d576..0000000 --- a/test/generated/base/partnerNetworks/partnerNetworks.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PartnerNetworksAcl { -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "PartnerNetwork" -] as AbilityTuple<"Read", "PartnerNetwork">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "PartnerNetwork" -] as AbilityTuple<"Read", "PartnerNetwork">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "PartnerNetwork" -] as AbilityTuple<"Create", "PartnerNetwork">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "PartnerNetwork" -] as AbilityTuple<"Read", "PartnerNetwork">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "PartnerNetwork" -] as AbilityTuple<"Update", "PartnerNetwork">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "PartnerNetwork" -] as AbilityTuple<"Archive", "PartnerNetwork">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "PartnerNetwork" -] as AbilityTuple<"Archive", "PartnerNetwork">; - -} diff --git a/test/generated/base/partnerNetworks/partnerNetworks.api.ts b/test/generated/base/partnerNetworks/partnerNetworks.api.ts deleted file mode 100644 index 2c6a4bf..0000000 --- a/test/generated/base/partnerNetworks/partnerNetworks.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; - -export namespace PartnerNetworksApi { -export const paginateLabels = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, - `/partner-networks/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, - `/partner-networks`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, ) => { - return AppRestClient.post( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks`, - ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}`, - - ) -}; -export const update = (id: string, data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}`, - ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/partnerNetworks/partnerNetworks.configs.ts b/test/generated/base/partnerNetworks/partnerNetworks.configs.ts deleted file mode 100644 index b9d6545..0000000 --- a/test/generated/base/partnerNetworks/partnerNetworks.configs.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PartnerNetworksQueries } from "./partnerNetworks.queries"; -import { PartnerNetworksAcl } from "./partnerNetworks.acl"; - -export namespace PartnerNetworksConfigs { -export const partnerNetworksConfig = { - meta: { - title: "Partner Networks", - }, - readAll: { - acl: PartnerNetworksAcl.canUsePaginate, - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - paginated: PartnerNetworksQueries.usePaginate, - infinite: PartnerNetworksQueries.usePaginateInfinite, - filters: { - schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PartnerNetworksAcl.canUseFindById, - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - query: PartnerNetworksQueries.useFindById, - }, - create: { - acl: PartnerNetworksAcl.canUseCreate, - schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, - mutation: PartnerNetworksQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: PartnerNetworksAcl.canUseUpdate, - schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, - mutation: PartnerNetworksQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: PartnerNetworksAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PartnerNetworksQueries.usePaginateLabels, - infinite: PartnerNetworksQueries.usePaginateLabelsInfinite, - filters: { - schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/partnerNetworks/partnerNetworks.models.ts b/test/generated/base/partnerNetworks/partnerNetworks.models.ts deleted file mode 100644 index 55c49ce..0000000 --- a/test/generated/base/partnerNetworks/partnerNetworks.models.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PartnerNetworksModels { -/** - * PartnerNetworkEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type PartnerNetworkEmployeeDTO = z.infer; - -/** - * PartnerNetworkResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the partner network - * @property { string } name Name of the partner network - * @property { boolean } archived Whether the partner network is archived - * @property { string } createdById - * @property { PartnerNetworkEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PartnerNetworkEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const PartnerNetworkResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: PartnerNetworkEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PartnerNetworkEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type PartnerNetworkResponseDTO = z.infer; - -/** - * PartnerNetworkLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const PartnerNetworkLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type PartnerNetworkLabelFilterDto = z.infer; - -/** - * PartnerNetworkPaginationFilterDtoSchema - * @type { object } - * @property { string } search Free search - * @property { boolean } archived - */ -export const PartnerNetworkPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type PartnerNetworkPaginationFilterDto = z.infer; - -/** - * CreatePartnerNetworkRequestDTOSchema - * @type { object } - * @property { string } name Name of the partner network - */ -export const CreatePartnerNetworkRequestDTOSchema = z.object({ name: z.string() }); -export type CreatePartnerNetworkRequestDTO = z.infer; - -/** - * UpdatePartnerNetworkRequestDTOSchema - * @type { object } - * @property { string } name Name of the partner network - */ -export const UpdatePartnerNetworkRequestDTOSchema = z.object({ name: z.string().nullable() }).partial(); -export type UpdatePartnerNetworkRequestDTO = z.infer; - -/** - * PartnerNetworksPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PartnerNetworksPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PartnerNetworksPaginateLabelsOrderParamEnum = z.infer; -export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPaginateLabelsOrderParamEnumSchema.enum; - -/** - * PartnerNetworksPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PartnerNetworksPaginateLabelsResponse = z.infer; - -/** - * PartnerNetworksPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PartnerNetworksPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PartnerNetworksPaginateOrderParamEnum = z.infer; -export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrderParamEnumSchema.enum; - -/** - * PartnerNetworksPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerNetworkResponseDTO[] } items - */ -export const PartnerNetworksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).nullable() }).partial().shape }); -export type PartnerNetworksPaginateResponse = z.infer; - -} diff --git a/test/generated/base/partnerNetworks/partnerNetworks.queries.ts b/test/generated/base/partnerNetworks/partnerNetworks.queries.ts deleted file mode 100644 index 75ec4c5..0000000 --- a/test/generated/base/partnerNetworks/partnerNetworks.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PartnerNetworksAcl } from "./partnerNetworks.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; -import { PartnerNetworksApi } from "./partnerNetworks.api"; - -export namespace PartnerNetworksQueries { -export const moduleName = QueryModule.PartnerNetworks; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", "infinite", limit, order, filter, cursor] as const, - paginate: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string) => [...keys.all, "/partner-networks", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/partner-networks/:id", id] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate partner networks with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate partner networks with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Partner Networks - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Partner Networks - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new Partner Network - * @permission Requires `canUseCreate` ability - * @param { PartnerNetworksModels.CreatePartnerNetworkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PartnerNetworksAcl.canUseCreate()); - return PartnerNetworksApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get Partner Network by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUseFindById()); - return PartnerNetworksApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Partner Network - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PartnerNetworksAcl.canUseUpdate()); - return PartnerNetworksApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Partner Network - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PartnerNetworksAcl.canUseArchive()); - return PartnerNetworksApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive Partner Network - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PartnerNetworksAcl.canUseUnarchive()); - return PartnerNetworksApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts deleted file mode 100644 index 2ede29d..0000000 --- a/test/generated/base/paymentConfirmations/paymentConfirmations.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PaymentConfirmationsAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read payment confirmation items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate payment confirmation document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetEml` mutation ability. For global ability, omit the object parameter. - * @description Download payment confirmation as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetEml` mutation - */ -export const canUseGetEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.api.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.api.ts deleted file mode 100644 index dd56bcd..0000000 --- a/test/generated/base/paymentConfirmations/paymentConfirmations.api.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; - -export namespace PaymentConfirmationsApi { -export const get = (officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, - `/offices/${officeId}/payment-confirmations`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const generate = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payment-confirmations/generate`, - ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getEml = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payment-confirmations/eml`, - ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts deleted file mode 100644 index af0fe49..0000000 --- a/test/generated/base/paymentConfirmations/paymentConfirmations.configs.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; -import { PaymentConfirmationsQueries } from "./paymentConfirmations.queries"; -import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; - -export namespace PaymentConfirmationsConfigs { -export const paymentConfirmationsConfig = { - meta: { - title: "Payment Confirmations", - }, - readAll: { - acl: PaymentConfirmationsAcl.canUseGet, - schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, - paginated: PaymentConfirmationsQueries.useGet, - infinite: PaymentConfirmationsQueries.useGetInfinite, - filters: { - schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, - options: { - inputs: { - businessPartnerId: true, - paymentDate: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, - options: { - columns: { - invoiceId: true, - invoiceNumber: true, - invoiceDate: true, - invoiceAmount: true, - amount: true, - currencyNotation: true, - reference: true, - position: true, - paymentDate: true, - }, - sortable: PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.models.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.models.ts deleted file mode 100644 index bdab7a3..0000000 --- a/test/generated/base/paymentConfirmations/paymentConfirmations.models.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PaymentConfirmationsModels { -/** - * PaymentConfirmationPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }); -export type PaymentConfirmationPositionDto = z.infer; - -/** - * PaymentConfirmationItemDtoSchema - * @type { object } - * @property { string } invoiceId Invoice ID - * @property { string } invoiceNumber Invoice number - * @property { string } invoiceDate Invoice date - * @property { number } invoiceAmount Invoice amount - * @property { number } amount Payment amount - * @property { string } currencyNotation Currency notation - * @property { string } reference Reference - * @property { PaymentConfirmationPositionDto } position Position information - * @property { string } paymentDate Payment date - */ -export const PaymentConfirmationItemDtoSchema = z.object({ invoiceId: z.string(), invoiceNumber: z.string(), invoiceDate: z.iso.datetime({ offset: true }), invoiceAmount: z.number(), amount: z.number(), currencyNotation: z.string(), reference: z.string().nullish(), position: PaymentConfirmationPositionDtoSchema, paymentDate: z.iso.datetime({ offset: true }) }); -export type PaymentConfirmationItemDto = z.infer; - -/** - * PaymentConfirmationItemFilterDtoSchema - * @type { object } - * @property { string } businessPartnerId Business partner ID - * @property { string } paymentDate Payment date - */ -export const PaymentConfirmationItemFilterDtoSchema = z.object({ businessPartnerId: z.string(), paymentDate: z.iso.datetime({ offset: true }) }); -export type PaymentConfirmationItemFilterDto = z.infer; - -/** - * GeneratePaymentConfirmationRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId Business partner ID - * @property { string } paymentDate Payment date - * @property { string } positionId Position ID (optional) - */ -export const GeneratePaymentConfirmationRequestDtoSchema = z.object({ businessPartnerId: z.string(), paymentDate: z.iso.datetime({ offset: true }), positionId: z.string().nullish() }); -export type GeneratePaymentConfirmationRequestDto = z.infer; - -/** - * PaymentConfirmationsGetOrderParamEnumSchema - * @type { enum } - */ -export const PaymentConfirmationsGetOrderParamEnumSchema = z.enum(["paymentDate", "invoiceNumber", "amount"]); -export type PaymentConfirmationsGetOrderParamEnum = z.infer; -export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrderParamEnumSchema.enum; - -/** - * PaymentConfirmationsGetResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PaymentConfirmationItemDto[] } items - */ -export const PaymentConfirmationsGetResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).nullable() }).partial().shape }); -export type PaymentConfirmationsGetResponse = z.infer; - -} diff --git a/test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts b/test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts deleted file mode 100644 index c780317..0000000 --- a/test/generated/base/paymentConfirmations/paymentConfirmations.queries.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; -import { PaymentConfirmationsApi } from "./paymentConfirmations.api"; - -export namespace PaymentConfirmationsQueries { -export const moduleName = QueryModule.PaymentConfirmations; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", officeId, filter, limit, order, page, cursor] as const, - getInfinite: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", "infinite", officeId, filter, limit, order, cursor] as const, -}; - -/** - * Query `useGet` - * @summary Get payment confirmation items - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, filter, limit, order, page, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, filter, limit, order, page, cursor), - queryFn: () => { - checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useGetInfinite - * @summary Get payment confirmation items - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetInfinite = ({ officeId, filter, limit, order, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useGenerate` - recommended when file should not be cached - * @summary Generate payment confirmation PDF - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId } )); - return PaymentConfirmationsApi.generate(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGetEml` - recommended when file should not be cached - * @summary Get payment confirmation as EML file with PDF attachment - * @permission Requires `canUseGetEml` ability - * @param { string } mutation.officeId Path parameter - * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId } )); - return PaymentConfirmationsApi.getEml(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/ports/ports.acl.ts b/test/generated/base/ports/ports.acl.ts deleted file mode 100644 index 9332110..0000000 --- a/test/generated/base/ports/ports.acl.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PortsAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Port" -] as AbilityTuple<"Read", "Port">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Port" -] as AbilityTuple<"Create", "Port">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Port" -] as AbilityTuple<"Read", "Port">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Port" -] as AbilityTuple<"Update", "Port">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Port" -] as AbilityTuple<"Read", "Port">; - -} diff --git a/test/generated/base/ports/ports.api.ts b/test/generated/base/ports/ports.api.ts deleted file mode 100644 index bc62d36..0000000 --- a/test/generated/base/ports/ports.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PortsModels } from "./ports.models"; - -export namespace PortsApi { -export const paginate = (limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PortsModels.PortsPaginateResponseSchema }, - `/ports`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: PortsModels.CreatePortRequestDTO, ) => { - return AppRestClient.post( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports`, - ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, - `/ports/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports/${id}`, - ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports/${id}`, - - ) -}; -} diff --git a/test/generated/base/ports/ports.configs.ts b/test/generated/base/ports/ports.configs.ts deleted file mode 100644 index 33adfc6..0000000 --- a/test/generated/base/ports/ports.configs.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PortsModels } from "./ports.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PortsQueries } from "./ports.queries"; -import { PortsAcl } from "./ports.acl"; - -export namespace PortsConfigs { -export const portsConfig = { - meta: { - title: "Ports", - }, - readAll: { - acl: PortsAcl.canUsePaginate, - schema: PortsModels.PortResponseDTOSchema, - paginated: PortsQueries.usePaginate, - infinite: PortsQueries.usePaginateInfinite, - filters: { - schema: PortsModels.PortPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PortsModels.PortPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PortsModels.PortResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - address: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PortsModels.PortsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PortsAcl.canUseFindById, - schema: PortsModels.PortResponseDTOSchema, - query: PortsQueries.useFindById, - }, - create: { - acl: PortsAcl.canUseCreate, - schema: PortsModels.CreatePortRequestDTOSchema, - mutation: PortsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PortsModels.CreatePortRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, - update: { - acl: PortsAcl.canUseUpdate, - schema: PortsModels.UpdatePortRequestDTOSchema, - mutation: PortsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PortsModels.UpdatePortRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: PortsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PortsQueries.usePaginateLabels, - infinite: PortsQueries.usePaginateLabelsInfinite, - filters: { - schema: PortsModels.PortLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PortsModels.PortLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PortsModels.PortsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/ports/ports.models.ts b/test/generated/base/ports/ports.models.ts deleted file mode 100644 index 6958ed9..0000000 --- a/test/generated/base/ports/ports.models.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PortsModels { -/** - * PortCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type PortCityDto = z.infer; - -/** - * PortCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const PortCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type PortCountryDto = z.infer; - -/** - * PortAddressDtoSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { PortCityDto } city - * @property { string } district District name - * @property { PortCountryDto } country - */ -export const PortAddressDtoSchema = z.object({ street: z.string(), zip: z.string(), city: PortCityDtoSchema.nullish(), district: z.string().nullish(), country: PortCountryDtoSchema.nullish() }); -export type PortAddressDto = z.infer; - -/** - * PortEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type PortEmployeeDTO = z.infer; - -/** - * PortResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the port - * @property { string } name Name of the port - * @property { string } matchCode Match code for the port - * @property { PortAddressDto } address Address details of the port - * @property { string } createdById - * @property { PortEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PortEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const PortResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), address: PortAddressDtoSchema, createdById: z.string().nullish(), createdBy: PortEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PortEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type PortResponseDTO = z.infer; - -/** - * PortPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter ports by name or match code - */ -export const PortPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type PortPaginationFilterDto = z.infer; - -/** - * PortLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const PortLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type PortLabelFilterDto = z.infer; - -/** - * CreatePortRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } matchCode - * @property { string } street Street address - * @property { string } secondaryStreet - * @property { string } zip ZIP / Postal code - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } district - */ -export const CreatePortRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string().nullish() }); -export type CreatePortRequestDTO = z.infer; - -/** - * UpdatePortRequestDTOSchema - * @type { object } - * @property { string } name Updated name - * @property { string } matchCode Updated match code - * @property { string } street Updated street address - * @property { string } secondaryStreet Updated secondary street - * @property { string } zip Updated ZIP/Postal code - * @property { string } cityId Updated city id - * @property { string } countryId Updated country id - * @property { string } district - */ -export const UpdatePortRequestDTOSchema = z.object({ name: z.string().nullable(), matchCode: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable() }).partial(); -export type UpdatePortRequestDTO = z.infer; - -/** - * PortsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PortsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PortsPaginateOrderParamEnum = z.infer; -export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enum; - -/** - * PortsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PortResponseDTO[] } items - */ -export const PortsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PortResponseDTOSchema).nullable() }).partial().shape }); -export type PortsPaginateResponse = z.infer; - -/** - * PortsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PortsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PortsPaginateLabelsOrderParamEnum = z.infer; -export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * PortsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PortsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PortsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/ports/ports.queries.ts b/test/generated/base/ports/ports.queries.ts deleted file mode 100644 index 7a034d1..0000000 --- a/test/generated/base/ports/ports.queries.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PortsAcl } from "./ports.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PortsModels } from "./ports.models"; -import { PortsApi } from "./ports.api"; - -export namespace PortsQueries { -export const moduleName = QueryModule.Ports; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string) => [...keys.all, "/ports", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string) => [...keys.all, "/ports/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/ports/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Ports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Ports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create port - * @permission Requires `canUseCreate` ability - * @param { PortsModels.CreatePortRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PortsAcl.canUseCreate()); - return PortsApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate ports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate ports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update port - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PortsModels.UpdatePortRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PortsAcl.canUseUpdate()); - return PortsApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get port by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PortsAcl.canUseFindById()); - return PortsApi.findById(id) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/positionAccount/positionAccount.acl.ts b/test/generated/base/positionAccount/positionAccount.acl.ts deleted file mode 100644 index f887d12..0000000 --- a/test/generated/base/positionAccount/positionAccount.acl.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionAccountAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -} diff --git a/test/generated/base/positionAccount/positionAccount.api.ts b/test/generated/base/positionAccount/positionAccount.api.ts deleted file mode 100644 index b484a7e..0000000 --- a/test/generated/base/positionAccount/positionAccount.api.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { PositionAccountModels } from "./positionAccount.models"; - -export namespace PositionAccountApi { -export const get = (positionId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/account`, - - ) -}; -} diff --git a/test/generated/base/positionAccount/positionAccount.models.ts b/test/generated/base/positionAccount/positionAccount.models.ts deleted file mode 100644 index 3c1e98c..0000000 --- a/test/generated/base/positionAccount/positionAccount.models.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionAccountModels { -/** - * PositionAccountTotalsResponseDtoSchema - * @type { object } - * @property { number } totalBuyRates Total buy rates - * @property { number } totalSellRates Total sell rates - * @property { number } totalProfit Total profit - * @property { number } margin Margin percentage - * @property { number } displayAmount Display amount - * @property { string } displayCurrencyCode Display currency code - */ -export const PositionAccountTotalsResponseDtoSchema = z.object({ totalBuyRates: z.number(), totalSellRates: z.number(), totalProfit: z.number(), margin: z.number().nullish(), displayAmount: z.number(), displayCurrencyCode: z.string() }); -export type PositionAccountTotalsResponseDto = z.infer; - -/** - * PositionAccountMasterTotalsDtoSchema - * @type { object } - * @property { PositionAccountTotalsResponseDto } totals - * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency - */ -export const PositionAccountMasterTotalsDtoSchema = z.object({ totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema) }); -export type PositionAccountMasterTotalsDto = z.infer; - -/** - * ChildPositionAccountReferenceDtoSchema - * @type { object } - * @property { string } positionId - * @property { string } positionNumber - * @property { string } accountId - */ -export const ChildPositionAccountReferenceDtoSchema = z.object({ positionId: z.string().nullish(), positionNumber: z.string(), accountId: z.string() }); -export type ChildPositionAccountReferenceDto = z.infer; - -/** - * PositionAccountResponseDtoSchema - * @type { object } - * @property { string } id Account ID - * @property { string } positionId Position ID - * @property { string } invoiceId Invoice ID - * @property { CommonModels.PositionAccountItemDtoResponse[] } items Account items - * @property { PositionAccountTotalsResponseDto } totals - * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency - * @property { PositionAccountMasterTotalsDto } masterTotals - * @property { ChildPositionAccountReferenceDto[] } childPositionAccounts - */ -export const PositionAccountResponseDtoSchema = z.object({ id: z.string(), positionId: z.string().nullish(), invoiceId: z.string().nullish(), items: z.array(CommonModels.PositionAccountItemDtoResponseSchema), totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema), masterTotals: PositionAccountMasterTotalsDtoSchema.nullish(), childPositionAccounts: z.array(ChildPositionAccountReferenceDtoSchema).nullish() }); -export type PositionAccountResponseDto = z.infer; - -} diff --git a/test/generated/base/positionAccount/positionAccount.queries.ts b/test/generated/base/positionAccount/positionAccount.queries.ts deleted file mode 100644 index c7d81b6..0000000 --- a/test/generated/base/positionAccount/positionAccount.queries.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionAccountAcl } from "./positionAccount.acl"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { PositionAccountApi } from "./positionAccount.api"; - -export namespace PositionAccountQueries { -export const moduleName = QueryModule.PositionAccount; - -export const keys = { - all: [moduleName] as const, - get: (positionId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account", positionId, officeId] as const, -}; - -/** - * Query `useGet` - * @summary Get position account details - * @permission Requires `canUseGet` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ positionId, officeId }: { positionId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(positionId, officeId), - queryFn: () => { - checkAcl(PositionAccountAcl.canUseGet({ officeId } )); - return PositionAccountApi.get(positionId, officeId) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/positionAccountItems/positionAccountItems.acl.ts b/test/generated/base/positionAccountItems/positionAccountItems.acl.ts deleted file mode 100644 index 8f2be12..0000000 --- a/test/generated/base/positionAccountItems/positionAccountItems.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionAccountItemsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useDeletePositionAccountItems` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePositionAccountItems` mutation - */ -export const canUseDeletePositionAccountItems = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ -export const canUseDuplicate = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useReassign` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReassign` mutation - */ -export const canUseReassign = ( - object?: { officeId: string, } -) => [ - "Reassign", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useReorder` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation - */ -export const canUseReorder = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -} diff --git a/test/generated/base/positionAccountItems/positionAccountItems.api.ts b/test/generated/base/positionAccountItems/positionAccountItems.api.ts deleted file mode 100644 index fbc3532..0000000 --- a/test/generated/base/positionAccountItems/positionAccountItems.api.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionAccountItemsModels } from "./positionAccountItems.models"; - -export namespace PositionAccountItemsApi { -export const create = (positionId: string, officeId: string, data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, ) => { - return AppRestClient.post( - { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), - - ) -}; -export const deletePositionAccountItems = (positionId: string, officeId: string, data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), - - ) -}; -export const update = (positionId: string, officeId: string, data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, ) => { - return AppRestClient.patch( - { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), - - ) -}; -export const duplicate = (positionId: string, officeId: string, data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, ) => { - return AppRestClient.post( - { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, - ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), - - ) -}; -export const reassign = (positionId: string, officeId: string, data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, ) => { - return AppRestClient.patch( - { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items/reassign`, - ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), - - ) -}; -export const reorder = (positionId: string, itemId: string, officeId: string, data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, - ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/positionAccountItems/positionAccountItems.models.ts b/test/generated/base/positionAccountItems/positionAccountItems.models.ts deleted file mode 100644 index 6bdc3fe..0000000 --- a/test/generated/base/positionAccountItems/positionAccountItems.models.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionAccountItemsModels { -/** - * CreatePositionChargeDataRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const CreatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); -export type CreatePositionChargeDataRequestDto = z.infer; - -/** - * CreatePositionTextDataRequestDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const CreatePositionTextDataRequestDtoSchema = z.object({ content: z.string().nullable() }).partial(); -export type CreatePositionTextDataRequestDto = z.infer; - -/** - * CreatePositionAccountItemRequestDtoSchema - * @type { object } - * @property { CommonModels.PositionAccountItemTypeEnum } type Item type - * @property { CreatePositionChargeDataRequestDto } charge Charge data if type is CHARGE - * @property { CreatePositionTextDataRequestDto } text Text data if type is TEXT - */ -export const CreatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema, charge: CreatePositionChargeDataRequestDtoSchema.nullish(), text: CreatePositionTextDataRequestDtoSchema.nullish() }); -export type CreatePositionAccountItemRequestDto = z.infer; - -/** - * CreatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { CreatePositionAccountItemRequestDto[] } items Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER) - */ -export const CreatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(CreatePositionAccountItemRequestDtoSchema) }); -export type CreatePositionAccountItemsRequestDto = z.infer; - -/** - * UpdatePositionChargeDataRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const UpdatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); -export type UpdatePositionChargeDataRequestDto = z.infer; - -/** - * UpdatePositionTextDataRequestDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const UpdatePositionTextDataRequestDtoSchema = z.object({ content: z.string() }); -export type UpdatePositionTextDataRequestDto = z.infer; - -/** - * UpdatePositionAccountItemRequestDtoSchema - * @type { object } - * @property { CommonModels.PositionAccountItemTypeEnum } type Item type - * @property { UpdatePositionChargeDataRequestDto } charge Charge data if type is CHARGE - * @property { UpdatePositionTextDataRequestDto } text Text data if type is TEXT - */ -export const UpdatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema, charge: UpdatePositionChargeDataRequestDtoSchema.nullish(), text: UpdatePositionTextDataRequestDtoSchema.nullish() }); -export type UpdatePositionAccountItemRequestDto = z.infer; - -/** - * UpdatePositionAccountItemWithIdRequestDtoSchema - * @type { object } - * @property { string } id ID of the item to update - * @property { UpdatePositionAccountItemRequestDto } data Data to update - */ -export const UpdatePositionAccountItemWithIdRequestDtoSchema = z.object({ id: z.string(), data: UpdatePositionAccountItemRequestDtoSchema }); -export type UpdatePositionAccountItemWithIdRequestDto = z.infer; - -/** - * UpdatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { UpdatePositionAccountItemWithIdRequestDto[] } items Array of items to update - */ -export const UpdatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(UpdatePositionAccountItemWithIdRequestDtoSchema) }); -export type UpdatePositionAccountItemsRequestDto = z.infer; - -/** - * DeletePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to delete - */ -export const DeletePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()) }); -export type DeletePositionAccountItemsRequestDto = z.infer; - -/** - * DuplicatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to duplicate - */ -export const DuplicatePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()) }); -export type DuplicatePositionAccountItemsRequestDto = z.infer; - -/** - * ReassignPositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to reassign - * @property { string } targetPositionId Target position ID to reassign items to - */ -export const ReassignPositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()), targetPositionId: z.string() }); -export type ReassignPositionAccountItemsRequestDto = z.infer; - -/** - * ReorderPositionAccountItemRequestDtoSchema - * @type { object } - * @property { number } orderPosition New order position for the item - */ -export const ReorderPositionAccountItemRequestDtoSchema = z.object({ orderPosition: z.number() }); -export type ReorderPositionAccountItemRequestDto = z.infer; - -/** - * PositionAccountItemsCreateResponseSchema - * @type { array } - */ -export const PositionAccountItemsCreateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); -export type PositionAccountItemsCreateResponse = z.infer; - -/** - * PositionAccountItemsUpdateResponseSchema - * @type { array } - */ -export const PositionAccountItemsUpdateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); -export type PositionAccountItemsUpdateResponse = z.infer; - -/** - * PositionAccountItemsDuplicateResponseSchema - * @type { array } - */ -export const PositionAccountItemsDuplicateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); -export type PositionAccountItemsDuplicateResponse = z.infer; - -/** - * ReassignResponseSchema - * @type { array } - */ -export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); -export type ReassignResponse = z.infer; - -} diff --git a/test/generated/base/positionAccountItems/positionAccountItems.queries.ts b/test/generated/base/positionAccountItems/positionAccountItems.queries.ts deleted file mode 100644 index a3b1ab7..0000000 --- a/test/generated/base/positionAccountItems/positionAccountItems.queries.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionAccountItemsAcl } from "./positionAccountItems.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionAccountItemsModels } from "./positionAccountItems.models"; -import { PositionAccountItemsApi } from "./positionAccountItems.api"; - -export namespace PositionAccountItemsQueries { -export const moduleName = QueryModule.PositionAccountItems; - - - -/** - * Mutation `useCreate` - * @summary Create position account items (bulk) - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId } )); - return PositionAccountItemsApi.create(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePositionAccountItems` - * @summary Delete position account items (bulk) - * @permission Requires `canUseDeletePositionAccountItems` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeletePositionAccountItems = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId } )); - return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update position account items (bulk) - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId } )); - return PositionAccountItemsApi.update(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicate` - * @summary Duplicate position account items (bulk) - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId } )); - return PositionAccountItemsApi.duplicate(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReassign` - * @summary Reassign position account items to another position (bulk) - * @permission Requires `canUseReassign` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReassign = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId } )); - return PositionAccountItemsApi.reassign(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReorder` - * @summary Reorder position account item - * @permission Requires `canUseReorder` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.ReorderPositionAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, itemId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId } )); - return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/positionCargo/positionCargo.acl.ts b/test/generated/base/positionCargo/positionCargo.acl.ts deleted file mode 100644 index f62ee50..0000000 --- a/test/generated/base/positionCargo/positionCargo.acl.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionCargoAcl { -/** - * Use for `useListCargosByPositionId` query ability. For global ability, omit the object parameter. - * @description List cargo items by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByPositionId` query - */ -export const canUseListCargosByPositionId = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useCreateCargo` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCargo` mutation - */ -export const canUseCreateCargo = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. - * @description List cargo labels by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query - */ -export const canUseListCargoLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. - * @description Get cargo summary by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query - */ -export const canUseGetCargoSummary = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. - * @description Get cargo item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query - */ -export const canUseGetCargoById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. - * @description Update cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation - */ -export const canUseUpdateCargo = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation - */ -export const canUseDeleteCargo = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation - */ -export const canUseCreateBulkCargos = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation - */ -export const canUseDuplicateCargo = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/base/positionCargo/positionCargo.api.ts b/test/generated/base/positionCargo/positionCargo.api.ts deleted file mode 100644 index a89b2ec..0000000 --- a/test/generated/base/positionCargo/positionCargo.api.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionCargoModels } from "./positionCargo.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoApi { -export const listCargosByPositionId = (officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos`, - { - params: { - order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createCargo = (officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - - ) -}; -export const listCargoLabels = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/labels`, - - ) -}; -export const getCargoSummary = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/summary`, - - ) -}; -export const getCargoById = (officeId: string, positionId: string, cargoId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - - ) -}; -export const updateCargo = (officeId: string, positionId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - - ) -}; -export const deleteCargo = (officeId: string, positionId: string, cargoId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - - ) -}; -export const createBulkCargos = (numberOfCargos: number, officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, ) => { - return AppRestClient.post( - { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - - ) -}; -export const duplicateCargo = (officeId: string, positionId: string, cargoId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, - - ) -}; -} diff --git a/test/generated/base/positionCargo/positionCargo.configs.ts b/test/generated/base/positionCargo/positionCargo.configs.ts deleted file mode 100644 index a62c692..0000000 --- a/test/generated/base/positionCargo/positionCargo.configs.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoQueries } from "./positionCargo.queries"; -import { PositionCargoAcl } from "./positionCargo.acl"; - -export namespace PositionCargoConfigs { -export const cargosConfig = { - meta: { - title: "Cargos", - }, - readAll: { - acl: PositionCargoAcl.canUseListCargosByPositionId, - schema: CommonModels.PositionCargoResponseDTOSchema, - paginated: PositionCargoQueries.useListCargosByPositionId, - infinite: PositionCargoQueries.useListCargosByPositionIdInfinite, - columns: dynamicColumns({ - schema: CommonModels.PositionCargoResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - quoteId: true, - rootFolderId: true, - cargoType: true, - autoCalculateTotals: true, - autoCalculateRates: true, - autoCalculateVgm: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - rateOptions: true, - rateClass: true, - textForCustoms: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - ratePerKg: true, - totalRate: true, - tare: true, - vgm: true, - hsCodeLabels: true, - note: true, - packages: true, - createdAt: true, - updatedAt: true, - completeWeight: true, - packageTotals: true, - }, - }, -}), - }, - read: { - acl: PositionCargoAcl.canUseGetCargoById, - schema: CommonModels.PositionCargoResponseDTOSchema, - query: PositionCargoQueries.useGetCargoById, - }, - create: { - acl: PositionCargoAcl.canUseCreateCargo, - schema: CommonModels.CreatePositionCargoDTOSchema, - mutation: PositionCargoQueries.useCreateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.CreatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, -}) - }, - update: { - acl: PositionCargoAcl.canUseUpdateCargo, - schema: CommonModels.UpdatePositionCargoDTOSchema, - mutation: PositionCargoQueries.useUpdateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.UpdatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, -}) - }, - delete: { - acl: PositionCargoAcl.canUseDeleteCargo, - mutation: PositionCargoQueries.useDeleteCargo, - }, -}; - -} diff --git a/test/generated/base/positionCargo/positionCargo.models.ts b/test/generated/base/positionCargo/positionCargo.models.ts deleted file mode 100644 index 53c8e51..0000000 --- a/test/generated/base/positionCargo/positionCargo.models.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoModels { -/** - * ListCargosByPositionIdOrderParamSchema - * @type { array } - */ -export const ListCargosByPositionIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).nullish(); -export type ListCargosByPositionIdOrderParam = z.infer; - -/** - * ListCargosByPositionIdResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.PositionCargoResponseDTO[] } items - */ -export const ListCargosByPositionIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).nullable() }).partial().shape }); -export type ListCargosByPositionIdResponse = z.infer; - -/** - * PositionCargoListCargoLabelsResponseSchema - * @type { array } - */ -export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type PositionCargoListCargoLabelsResponse = z.infer; - -/** - * PositionCargoGetCargoSummaryResponseSchema - * @type { array } - */ -export const PositionCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema); -export type PositionCargoGetCargoSummaryResponse = z.infer; - -/** - * PositionCargoCreateBulkCargosResponseSchema - * @type { array } - */ -export const PositionCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema); -export type PositionCargoCreateBulkCargosResponse = z.infer; - -} diff --git a/test/generated/base/positionCargo/positionCargo.queries.ts b/test/generated/base/positionCargo/positionCargo.queries.ts deleted file mode 100644 index 0177598..0000000 --- a/test/generated/base/positionCargo/positionCargo.queries.ts +++ /dev/null @@ -1,293 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionCargoAcl } from "./positionCargo.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionCargoModels } from "./positionCargo.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoApi } from "./positionCargo.api"; - -export namespace PositionCargoQueries { -export const moduleName = QueryModule.PositionCargo; - -export const keys = { - all: [moduleName] as const, - listCargosByPositionId: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", officeId, positionId, limit, order, page, cursor] as const, - listCargosByPositionIdInfinite: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", "infinite", officeId, positionId, limit, order, cursor] as const, - listCargoLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/labels", officeId, positionId] as const, - getCargoSummary: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/summary", officeId, positionId] as const, - getCargoById: (officeId: string, positionId: string, cargoId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/:cargoId", officeId, positionId, cargoId] as const, -}; - -/** - * Query `useListCargosByPositionId` - * @summary List all cargo items for a position - * @permission Requires `canUseListCargosByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByPositionId = ({ officeId, positionId, limit, order, page, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListCargosByPositionIdInfinite - * @summary List all cargo items for a position - * @permission Requires `canUseListCargosByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByPositionIdInfinite = ({ officeId, positionId, limit, order, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateCargo` - * @summary Create a new cargo item - * @permission Requires `canUseCreateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId } )); - return PositionCargoApi.createCargo(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListCargoLabels` - * @summary List all cargo labels for a position - * @permission Requires `canUseListCargoLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargoLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargoLabels(officeId, positionId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId } )); - return PositionCargoApi.listCargoLabels(officeId, positionId) }, - ...options, - }); -}; - -/** - * Query `useGetCargoSummary` - * @summary Get cargo summary grouped by transport unit type - * @permission Requires `canUseGetCargoSummary` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoSummary = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoSummary(officeId, positionId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId } )); - return PositionCargoApi.getCargoSummary(officeId, positionId) }, - ...options, - }); -}; - -/** - * Query `useGetCargoById` - * @summary Get a specific cargo item - * @permission Requires `canUseGetCargoById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.cargoId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoById = ({ officeId, positionId, cargoId }: { officeId: string, positionId: string, cargoId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoById(officeId, positionId, cargoId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId } )); - return PositionCargoApi.getCargoById(officeId, positionId, cargoId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCargo` - * @summary Update a cargo item - * @permission Requires `canUseUpdateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, data }) => { - checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId } )); - return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteCargo` - * @summary Delete a cargo item - * @permission Requires `canUseDeleteCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId }) => { - checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId } )); - return PositionCargoApi.deleteCargo(officeId, positionId, cargoId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateBulkCargos` - * @summary Create a new cargo item - * @permission Requires `canUseCreateBulkCargos` ability - * @param { number } mutation.numberOfCargos Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { - checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId } )); - return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicateCargo` - * @summary Duplicate a cargo item - * @permission Requires `canUseDuplicateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId }) => { - checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId } )); - return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts b/test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts deleted file mode 100644 index 552d48c..0000000 --- a/test/generated/base/positionCargoPackage/positionCargoPackage.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionCargoPackageAcl { -/** - * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. - * @description Create cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation - */ -export const canUseCreatePackage = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. - * @description Update cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation - */ -export const canUseUpdatePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation - */ -export const canUseDeletePackage = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation - */ -export const canUseDuplicatePackage = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. - * @description Move cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation - */ -export const canUseMovePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/base/positionCargoPackage/positionCargoPackage.api.ts b/test/generated/base/positionCargoPackage/positionCargoPackage.api.ts deleted file mode 100644 index 0ccfabd..0000000 --- a/test/generated/base/positionCargoPackage/positionCargoPackage.api.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoPackageApi { -export const createPackage = (officeId: string, positionId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, - ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - - ) -}; -export const updatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - - ) -}; -export const deletePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - - ) -}; -export const duplicatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - - ) -}; -export const movePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, - ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts b/test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts deleted file mode 100644 index fc4eedb..0000000 --- a/test/generated/base/positionCargoPackage/positionCargoPackage.queries.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionCargoPackageAcl } from "./positionCargoPackage.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoPackageApi } from "./positionCargoPackage.api"; - -export namespace PositionCargoPackageQueries { -export const moduleName = QueryModule.PositionCargoPackage; - - - -/** - * Mutation `useCreatePackage` - * @summary Create a new package for a cargo - * @permission Requires `canUseCreatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId } )); - return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdatePackage` - * @summary Update a package - * @permission Requires `canUseUpdatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId } )); - return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePackage` - * @summary Delete a package - * @permission Requires `canUseDeletePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId }) => { - checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId } )); - return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicatePackage` - * @summary Duplicate a package - * @permission Requires `canUseDuplicatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId }) => { - checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId } )); - return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMovePackage` - * @summary Move a package to a different cargo - * @permission Requires `canUseMovePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId } )); - return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/positionChecklist/positionChecklist.acl.ts b/test/generated/base/positionChecklist/positionChecklist.acl.ts deleted file mode 100644 index 1f8dfca..0000000 --- a/test/generated/base/positionChecklist/positionChecklist.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionChecklistAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List checklist items for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useApplyTemplates` mutation ability. For global ability, omit the object parameter. - * @description Apply checklist templates to position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useApplyTemplates` mutation - */ -export const canUseApplyTemplates = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useComplete` mutation ability. For global ability, omit the object parameter. - * @description Complete position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useComplete` mutation - */ -export const canUseComplete = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUncomplete` mutation ability. For global ability, omit the object parameter. - * @description Uncomplete position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUncomplete` mutation - */ -export const canUseUncomplete = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdateNotes` mutation ability. For global ability, omit the object parameter. - * @description Update position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateNotes` mutation - */ -export const canUseUpdateNotes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useReorder` mutation ability. For global ability, omit the object parameter. - * @description Reorder position checklist items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation - */ -export const canUseReorder = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/base/positionChecklist/positionChecklist.api.ts b/test/generated/base/positionChecklist/positionChecklist.api.ts deleted file mode 100644 index 97c694e..0000000 --- a/test/generated/base/positionChecklist/positionChecklist.api.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionChecklistModels } from "./positionChecklist.models"; - -export namespace PositionChecklistApi { -export const list = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist`, - - ) -}; -export const applyTemplates = (officeId: string, positionId: string, data: PositionChecklistModels.ApplyTemplatesRequestDto, ) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, - ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), - - ) -}; -export const complete = (officeId: string, positionId: string, itemId: string, ) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, - - ) -}; -export const uncomplete = (officeId: string, positionId: string, itemId: string, ) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, - - ) -}; -export const updateNotes = (officeId: string, positionId: string, itemId: string, data: PositionChecklistModels.UpdatePositionChecklistItemDto, ) => { - return AppRestClient.patch( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, - ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), - - ) -}; -export const reorder = (officeId: string, positionId: string, data: PositionChecklistModels.ReorderPositionChecklistDto, ) => { - return AppRestClient.put( - { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/reorder`, - ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/positionChecklist/positionChecklist.models.ts b/test/generated/base/positionChecklist/positionChecklist.models.ts deleted file mode 100644 index 98e27b8..0000000 --- a/test/generated/base/positionChecklist/positionChecklist.models.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { z } from "zod"; - -export namespace PositionChecklistModels { -/** - * PositionChecklistCompletedByResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionChecklistCompletedByResponseDtoSchema = z.object({ id: z.string(), name: z.string().nullable() }); -export type PositionChecklistCompletedByResponseDto = z.infer; - -/** - * PositionChecklistItemResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } checklistItemId - * @property { string } templateId - * @property { number } order - * @property { boolean } completed - * @property { string } completedAt - * @property { PositionChecklistCompletedByResponseDto } completedBy - * @property { string } notes - * @property { string } name - */ -export const PositionChecklistItemResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), checklistItemId: z.string(), templateId: z.string().nullable(), order: z.number(), completed: z.boolean(), completedAt: z.iso.datetime({ offset: true }).nullable(), completedBy: PositionChecklistCompletedByResponseDtoSchema.nullable(), notes: z.string().nullable(), name: z.string().nullable() }); -export type PositionChecklistItemResponseDto = z.infer; - -/** - * PositionChecklistResponseDtoSchema - * @type { object } - * @property { PositionChecklistItemResponseDto[] } items - * @property { string[] } appliedTemplateIds - */ -export const PositionChecklistResponseDtoSchema = z.object({ items: z.array(PositionChecklistItemResponseDtoSchema), appliedTemplateIds: z.array(z.string()) }); -export type PositionChecklistResponseDto = z.infer; - -/** - * ApplyTemplatesRequestDtoSchema - * @type { object } - * @property { string[] } templateIds - */ -export const ApplyTemplatesRequestDtoSchema = z.object({ templateIds: z.array(z.string()) }); -export type ApplyTemplatesRequestDto = z.infer; - -/** - * UpdatePositionChecklistItemDtoSchema - * @type { object } - * @property { string } notes Max Length: `512` - */ -export const UpdatePositionChecklistItemDtoSchema = z.object({ notes: z.string().max(512).nullable() }).partial(); -export type UpdatePositionChecklistItemDto = z.infer; - -/** - * ReorderPositionChecklistDtoSchema - * @type { object } - * @property { string[] } itemIds - */ -export const ReorderPositionChecklistDtoSchema = z.object({ itemIds: z.array(z.string()) }); -export type ReorderPositionChecklistDto = z.infer; - -/** - * ApplyTemplatesResponseSchema - * @type { array } - */ -export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema); -export type ApplyTemplatesResponse = z.infer; - -/** - * PositionChecklistReorderResponseSchema - * @type { array } - */ -export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema); -export type PositionChecklistReorderResponse = z.infer; - -} diff --git a/test/generated/base/positionChecklist/positionChecklist.queries.ts b/test/generated/base/positionChecklist/positionChecklist.queries.ts deleted file mode 100644 index d9649af..0000000 --- a/test/generated/base/positionChecklist/positionChecklist.queries.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionChecklistAcl } from "./positionChecklist.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionChecklistModels } from "./positionChecklist.models"; -import { PositionChecklistApi } from "./positionChecklist.api"; - -export namespace PositionChecklistQueries { -export const moduleName = QueryModule.PositionChecklist; - -export const keys = { - all: [moduleName] as const, - list: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/checklist", officeId, positionId] as const, -}; - -/** - * Query `useList` - * @summary Get position checklist items - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, positionId), - queryFn: () => { - checkAcl(PositionChecklistAcl.canUseList({ officeId } )); - return PositionChecklistApi.list(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useApplyTemplates` - * @summary Apply checklist templates to position - * @permission Requires `canUseApplyTemplates` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionChecklistModels.ApplyTemplatesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useApplyTemplates = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId } )); - return PositionChecklistApi.applyTemplates(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useComplete` - * @summary Complete a checklist item - * @permission Requires `canUseComplete` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useComplete = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId }) => { - checkAcl(PositionChecklistAcl.canUseComplete({ officeId } )); - return PositionChecklistApi.complete(officeId, positionId, itemId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUncomplete` - * @summary Mark checklist item as not completed - * @permission Requires `canUseUncomplete` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUncomplete = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId }) => { - checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId } )); - return PositionChecklistApi.uncomplete(officeId, positionId, itemId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateNotes` - * @summary Update checklist item notes - * @permission Requires `canUseUpdateNotes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { PositionChecklistModels.UpdatePositionChecklistItemDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateNotes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId, data }) => { - checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId } )); - return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReorder` - * @summary Reorder checklist items - * @permission Requires `canUseReorder` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionChecklistModels.ReorderPositionChecklistDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionChecklistAcl.canUseReorder({ officeId } )); - return PositionChecklistApi.reorder(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts deleted file mode 100644 index 8215460..0000000 --- a/test/generated/base/positionInvolvedParties/positionInvolvedParties.acl.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionInvolvedPartiesAcl { -/** - * Use for `useFindByPositionId` query ability. For global ability, omit the object parameter. - * @description List position involved parties - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByPositionId` query - */ -export const canUseFindByPositionId = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation ability. For global ability, omit the object parameter. - * @description Delete position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation - */ -export const canUseDeleteOfficesPositionsInvolvedPartiesByPartyId = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts deleted file mode 100644 index bed6f4b..0000000 --- a/test/generated/base/positionInvolvedParties/positionInvolvedParties.api.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionInvolvedPartiesModels } from "./positionInvolvedParties.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionInvolvedPartiesApi { -export const findByPositionId = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties`, - - ) -}; -export const create = (officeId: string, positionId: string, data: CommonModels.CreateInvolvedPartyRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties`, - ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - - ) -}; -export const update = (officeId: string, positionId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - - ) -}; -export const deleteOfficesPositionsInvolvedPartiesByPartyId = (officeId: string, positionId: string, partyId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - - ) -}; -} diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts deleted file mode 100644 index 310c296..0000000 --- a/test/generated/base/positionInvolvedParties/positionInvolvedParties.models.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionInvolvedPartiesModels { -/** - * FindByPositionIdResponseSchema - * @type { array } - */ -export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema); -export type FindByPositionIdResponse = z.infer; - -} diff --git a/test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts b/test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts deleted file mode 100644 index 17bf8f0..0000000 --- a/test/generated/base/positionInvolvedParties/positionInvolvedParties.queries.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionInvolvedPartiesAcl } from "./positionInvolvedParties.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionInvolvedPartiesApi } from "./positionInvolvedParties.api"; - -export namespace PositionInvolvedPartiesQueries { -export const moduleName = QueryModule.PositionInvolvedParties; - -export const keys = { - all: [moduleName] as const, - findByPositionId: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/involved-parties", officeId, positionId] as const, -}; - -/** - * Query `useFindByPositionId` - * @summary List position involved parties - * @permission Requires `canUseFindByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindByPositionId = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findByPositionId(officeId, positionId), - queryFn: () => { - checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId } )); - return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create position involved party - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId } )); - return PositionInvolvedPartiesApi.create(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update position involved party - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, partyId, data }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId } )); - return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteOfficesPositionsInvolvedPartiesByPartyId` - * @summary Delete position involved party - * @permission Requires `canUseDeleteOfficesPositionsInvolvedPartiesByPartyId` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, partyId }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId } )); - return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId(officeId, positionId, partyId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts deleted file mode 100644 index 41a91df..0000000 --- a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionProfitChangeTrackingAcl { -/** - * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. - * @description List position profit change groups - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.positionId positionId from positionId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query - */ -export const canUseFindProfitChangeGroups = ( - object?: { officeId: string, positionId: string, } -) => [ - "Read", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; - -/** - * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. - * @description Get position profit change group details - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.positionId positionId from positionId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query - */ -export const canUseFindProfitChangeGroupDetail = ( - object?: { officeId: string, positionId: string, } -) => [ - "Read", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; - -} diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts deleted file mode 100644 index fa66351..0000000 --- a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.api.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; - -export namespace PositionProfitChangeTrackingApi { -export const findProfitChangeGroups = (officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findProfitChangeGroupDetail = (groupId: string, officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, - `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, - - ) -}; -} diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts deleted file mode 100644 index a7c8680..0000000 --- a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; -import { PositionProfitChangeTrackingQueries } from "./positionProfitChangeTracking.queries"; -import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; - -export namespace PositionProfitChangeTrackingConfigs { -export const profitChangeGroupsConfig = { - meta: { - title: "Profit Change Groups", - }, - readAll: { - acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups, - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, - paginated: PositionProfitChangeTrackingQueries.useFindProfitChangeGroups, - infinite: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, - filters: { - schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, - options: { - inputs: { - userId: true, - dateFrom: true, - dateTo: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, - options: { - columns: { - id: true, - timestamp: true, - users: true, - profit: true, - changeCount: true, - }, - sortable: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema, - query: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, - }, -}; - -} diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts deleted file mode 100644 index c953904..0000000 --- a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.models.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionProfitChangeTrackingModels { -/** - * PositionAccountProfitChangeGroupDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto[] } users - * @property { object } profit - * @property { number } profit.amount - * @property { string } profit.currencyCode - * @property { number } changeCount - */ -export const PositionAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema), profit: z.object({ amount: z.number(), currencyCode: z.string() }), changeCount: z.number() }); -export type PositionAccountProfitChangeGroupDto = z.infer; - -/** - * PositionAccountProfitChangeEntryDtoSchema - * @type { object } - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto } user - * @property { number } changeNumber - * @property { number } oldProfit - * @property { number } newProfit - * @property { string } currencyCode - */ -export const PositionAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }); -export type PositionAccountProfitChangeEntryDto = z.infer; - -/** - * PositionAccountProfitChangeGroupDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { string } currencyCode - * @property { PositionAccountProfitChangeEntryDto[] } entries - */ -export const PositionAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(PositionAccountProfitChangeEntryDtoSchema) }); -export type PositionAccountProfitChangeGroupDetailDto = z.infer; - -/** - * PositionProfitChangeTrackingFilterDtoSchema - * @type { object } - * @property { string } userId User IDs who made the changes - * @property { string } dateFrom Date range start - * @property { string } dateTo Date range end - */ -export const PositionProfitChangeTrackingFilterDtoSchema = z.object({ userId: z.string().nullable(), dateFrom: z.string().nullable(), dateTo: z.string().nullable() }).partial(); -export type PositionProfitChangeTrackingFilterDto = z.infer; - -/** - * PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema - * @type { enum } - */ -export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema = z.enum(["timestamp", "profitAmount", "changeCount"]); -export type PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = z.infer; -export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema.enum; - -/** - * PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionAccountProfitChangeGroupDto[] } items - */ -export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).nullable() }).partial().shape }); -export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; - -} diff --git a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts b/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts deleted file mode 100644 index 7c55275..0000000 --- a/test/generated/base/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; -import { PositionProfitChangeTrackingApi } from "./positionProfitChangeTracking.api"; - -export namespace PositionProfitChangeTrackingQueries { -export const moduleName = QueryModule.PositionProfitChangeTracking; - -export const keys = { - all: [moduleName] as const, - findProfitChangeGroups: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", officeId, positionId, limit, order, filter, page, cursor] as const, - findProfitChangeGroupsInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", "infinite", officeId, positionId, limit, order, filter, cursor] as const, - findProfitChangeGroupDetail: (groupId: string, officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups/:groupId", groupId, officeId, positionId] as const, -}; - -/** - * Query `useFindProfitChangeGroups` - * @summary List position profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` - * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroups = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindProfitChangeGroupsInfinite - * @summary List position profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` - * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupsInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindProfitChangeGroupDetail` - * @summary Get position profit change group details - * @permission Requires `canUseFindProfitChangeGroupDetail` ability - * @param { string } object.groupId Path parameter - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupDetail = ({ groupId, officeId, positionId }: { groupId: string, officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), - queryFn: () => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/positionRoutes/positionRoutes.acl.ts b/test/generated/base/positionRoutes/positionRoutes.acl.ts deleted file mode 100644 index 7cd4cb8..0000000 --- a/test/generated/base/positionRoutes/positionRoutes.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionRoutesAcl { -/** - * Use for `useListRoutes` query ability. For global ability, omit the object parameter. - * @description List position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query - */ -export const canUseListRoutes = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Create position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation - */ -export const canUseCreateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Update position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation - */ -export const canUseUpdateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Delete position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation - */ -export const canUseDeleteRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. - * @description Split position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation - */ -export const canUseSplitRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. - * @description Merge position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation - */ -export const canUseMergeRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. - * @description Copy position route - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation - */ -export const canUseCopyRoute = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/base/positionRoutes/positionRoutes.api.ts b/test/generated/base/positionRoutes/positionRoutes.api.ts deleted file mode 100644 index 27b8e55..0000000 --- a/test/generated/base/positionRoutes/positionRoutes.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionRoutesApi { -export const listRoutes = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.RouteListResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes`, - - ) -}; -export const createRoutePoint = (officeId: string, positionId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, - ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - - ) -}; -export const updateRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - - ) -}; -export const deleteRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - - ) -}; -export const splitRoutes = (officeId: string, positionId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/split`, - - ) -}; -export const mergeRoutes = (officeId: string, positionId: string, data: CommonModels.MergeRoutesRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/merge`, - ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - - ) -}; -export const copyRoute = (officeId: string, positionId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, - ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/positionRoutes/positionRoutes.queries.ts b/test/generated/base/positionRoutes/positionRoutes.queries.ts deleted file mode 100644 index b9544be..0000000 --- a/test/generated/base/positionRoutes/positionRoutes.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionRoutesAcl } from "./positionRoutes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionRoutesApi } from "./positionRoutes.api"; - -export namespace PositionRoutesQueries { -export const moduleName = QueryModule.PositionRoutes; - -export const keys = { - all: [moduleName] as const, - listRoutes: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes", officeId, positionId] as const, -}; - -/** - * Query `useListRoutes` - * @summary List routes with points for a position (unified for sea/air/road) - * @permission Requires `canUseListRoutes` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoutes = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoutes(officeId, positionId), - queryFn: () => { - checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId } )); - return PositionRoutesApi.listRoutes(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateRoutePoint` - * @summary Create a route point - * @permission Requires `canUseCreateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, data }) => { - checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId } )); - return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateRoutePoint` - * @summary Update a route point - * @permission Requires `canUseUpdateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { - checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId } )); - return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRoutePoint` - * @summary Delete a route point - * @permission Requires `canUseDeleteRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, pointId }) => { - checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId } )); - return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useSplitRoutes` - * @summary Split routes by cargo (sea positions only) - * @permission Requires `canUseSplitRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId } )); - return PositionRoutesApi.splitRoutes(officeId, positionId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMergeRoutes` - * @summary Merge routes (sea positions only) - * @permission Requires `canUseMergeRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId } )); - return PositionRoutesApi.mergeRoutes(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopyRoute` - * @summary Copy route points to another route (sea positions only) - * @permission Requires `canUseCopyRoute` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, data }) => { - checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId } )); - return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/positions/positions.acl.ts b/test/generated/base/positions/positions.acl.ts deleted file mode 100644 index 002471f..0000000 --- a/test/generated/base/positions/positions.acl.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionsAcl { -/** - * Use for `useFindAll` query ability. For global ability, omit the object parameter. - * @description List position labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useTotalProfit` query ability. For global ability, omit the object parameter. - * @description Fake endpoint - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTotalProfit` query - */ -export const canUseTotalProfit = ( - object?: { officeId: string, } -) => [ - "TotalProfitView", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ -export const canUseListAvailablePartnersFor = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useExportPositions` mutation ability. For global ability, omit the object parameter. - * @description Export positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportPositions` mutation - */ -export const canUseExportPositions = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Export", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useListRouteLabels` query ability. For global ability, omit the object parameter. - * @description List route labels for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRouteLabels` query - */ -export const canUseListRouteLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useGetDuplicateDefaultParameters` query ability. For global ability, omit the object parameter. - * @description Read position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDuplicateDefaultParameters` query - */ -export const canUseGetDuplicateDefaultParameters = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ -export const canUseDuplicate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ -export const canUseCancel = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useRevertCancel` mutation ability. For global ability, omit the object parameter. - * @description Revert cancelled position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertCancel` mutation - */ -export const canUseRevertCancel = ( - object?: { officeId: string, } -) => [ - "RevertCancel", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useLinkChild` mutation ability. For global ability, omit the object parameter. - * @description Link positions to parent - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLinkChild` mutation - */ -export const canUseLinkChild = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUnlinkChild` mutation ability. For global ability, omit the object parameter. - * @description Link positions to parent - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlinkChild` mutation - */ -export const canUseUnlinkChild = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useListChild` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListChild` query - */ -export const canUseListChild = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/base/positions/positions.api.ts b/test/generated/base/positions/positions.api.ts deleted file mode 100644 index 35825af..0000000 --- a/test/generated/base/positions/positions.api.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionsApi { -export const findAll = (officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsFindAllResponseSchema }, - `/offices/${officeId}/positions/labels`, - { - params: { - filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsPaginateResponseSchema }, - `/offices/${officeId}/positions`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: PositionsModels.CreatePositionRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions`, - ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), - - ) -}; -export const totalProfit = (officeId: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.TotalProfitResponseSchema }, - `/offices/${officeId}/positions/fake-total-profit`, - - ) -}; -export const listAvailablePartnersFor = (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/positions/${positionId}/available-partners`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), - }, - } - ) -}; -export const exportPositions = (officeId: string, data: PositionsModels.PositionExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/exports`, - ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const get = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}`, - - ) -}; -export const update = (officeId: string, positionId: string, data: PositionsModels.UpdatePositionDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}`, - ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), - - ) -}; -export const listRouteLabels = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/routes/labels`, - - ) -}; -export const getDuplicateDefaultParameters = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, - - ) -}; -export const duplicate = (officeId: string, positionId: string, data: PositionsModels.DuplicatePositionRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/duplicate`, - ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), - - ) -}; -export const cancel = (officeId: string, positionId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/cancel`, - - ) -}; -export const revertCancel = (officeId: string, positionId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/uncancel`, - - ) -}; -export const linkChild = (officeId: string, positionId: string, data: PositionsModels.LinkChildPositionsRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/children`, - ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), - - ) -}; -export const unlinkChild = (officeId: string, positionId: string, data: PositionsModels.UnlinkChildPositionsRequestDto, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/children`, - ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), - - ) -}; -export const listChild = (officeId: string, positionId: string, limit: number, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.ListChildResponseSchema }, - `/offices/${officeId}/positions/${positionId}/children`, - { - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/base/positions/positions.configs.ts b/test/generated/base/positions/positions.configs.ts deleted file mode 100644 index 0e9cfce..0000000 --- a/test/generated/base/positions/positions.configs.ts +++ /dev/null @@ -1,259 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionsQueries } from "./positions.queries"; -import { PositionsAcl } from "./positions.acl"; - -export namespace PositionsConfigs { -export const positionsConfig = { - meta: { - title: "Positions", - }, - readAll: { - acl: PositionsAcl.canUsePaginate, - schema: PositionsModels.PositionPreviewResponseDtoSchema, - paginated: PositionsQueries.usePaginate, - infinite: PositionsQueries.usePaginateInfinite, - filters: { - schema: PositionsModels.PositionFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionsModels.PositionFilterDtoSchema, - options: { - inputs: { - transportMode: true, - customerId: true, - carrierId: true, - consigneeId: true, - isCancelled: true, - status: true, - number: true, - direction: true, - loadType: true, - serviceType: true, - employee: true, - searchQuery: true, - externalSystemId: true, - createdAt: true, - serviceDate: true, - departureDate: true, - arrivalDate: true, - blfromCostumerDate: true, - blfromCarrierDate: true, - customsDate: true, - vgmCustomerDate: true, - partnerNetworkId: true, - projectLiteId: true, - checklistItemsDone: true, - checklistItemsNotDone: true, - routing: true, - isExcludedFromStatistics: true, - isMasterPosition: true, - loadingPortId: true, - dischargePortId: true, - customerReference: true, - carrierReference: true, - consigneeReference: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PositionsModels.PositionPreviewResponseDtoSchema, - options: { - columns: { - id: true, - externalSystemId: true, - transportMode: true, - direction: true, - loadType: true, - createdAt: true, - number: true, - isCancelled: true, - customer: true, - customerReference: true, - consignee: true, - consigneeReference: true, - carrier: true, - carrierReference: true, - positionNumber: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - origin: true, - loadDate: true, - loadingPort: true, - dischargePort: true, - destination: true, - deliveryDate: true, - equipment: true, - serviceType: true, - destinationOffice: true, - currency: true, - profit: true, - margin: true, - employee: true, - project: true, - serviceDate: true, - departureDate: true, - arrivalDate: true, - blfromCostumerDate: true, - blfromCarrierDate: true, - customsDate: true, - vgmCustomerDate: true, - routing: true, - notes: true, - isMasterPosition: true, - hasInvoices: true, - parentPosition: true, - }, - sortable: PositionsModels.PositionsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PositionsAcl.canUseGet, - schema: CommonModels.PositionCoreResponseDtoSchema, - query: PositionsQueries.useGet, - }, - create: { - acl: PositionsAcl.canUseCreate, - schema: PositionsModels.CreatePositionRequestDtoSchema, - mutation: PositionsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PositionsModels.CreatePositionRequestDtoSchema, - options: { - inputs: { - section: true, - direction: true, - transportMode: true, - loadType: true, - serviceType: true, - estimatedServiceDate: true, - customerBusinessPartnerId: true, - }, - }, -}) - }, - update: { - acl: PositionsAcl.canUseUpdate, - schema: PositionsModels.UpdatePositionDtoSchema, - mutation: PositionsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PositionsModels.UpdatePositionDtoSchema, - options: { - inputs: { - externalSystemId: true, - statusDate: true, - status: true, - loadType: true, - incoterms: true, - secondIncoterms: true, - fillingCompany: true, - sellingContract: true, - fillingScacCode: true, - serviceValidity: true, - ratesValidity: true, - serviceType: true, - buyRateReference: true, - frequency: true, - isParentPosition: true, - isExcludedFromStatistics: true, - team: true, - salesRepId: true, - responsibleEmployeeId: true, - receivedByEmployeeId: true, - originOfficeId: true, - projectLiteId: true, - notes: true, - inttraTypeOfMove: true, - volumetricWeightModifier: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: PositionsAcl.canUseFindAll, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PositionsQueries.useFindAll, - infinite: PositionsQueries.useFindAllInfinite, - filters: { - schema: PositionsModels.PositionLabelsFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionsModels.PositionLabelsFilterDtoSchema, - options: { - inputs: { - search: true, - isParentPosition: true, - isLinkedPosition: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - }, -}), - }, -}; - -export const childrenConfig = { - meta: { - title: "Children", - }, - readAll: { - acl: PositionsAcl.canUseListChild, - schema: PositionsModels.ChildPositionResponseDtoSchema, - paginated: PositionsQueries.useListChild, - infinite: PositionsQueries.useListChildInfinite, - columns: dynamicColumns({ - schema: PositionsModels.ChildPositionResponseDtoSchema, - options: { - columns: { - id: true, - number: true, - packages: true, - weight: true, - volume: true, - customer: true, - profit: true, - }, - }, -}), - }, - create: { - acl: PositionsAcl.canUseLinkChild, - schema: PositionsModels.LinkChildPositionsRequestDtoSchema, - mutation: PositionsQueries.useLinkChild, - inputDefs: dynamicInputs({ - schema: PositionsModels.LinkChildPositionsRequestDtoSchema, - options: { - inputs: { - childPositionIds: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/base/positions/positions.models.ts b/test/generated/base/positions/positions.models.ts deleted file mode 100644 index 9c02819..0000000 --- a/test/generated/base/positions/positions.models.ts +++ /dev/null @@ -1,501 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionsModels { -/** - * PositionPreviewResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } externalSystemId - * @property { CommonModels.TransportModeEnum } transportMode - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { string } createdAt - * @property { string } number - * @property { boolean } isCancelled - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { string } customer.phone - * @property { string } customer.email - * @property { string } customerReference - * @property { object } consignee - * @property { string } consignee.id - * @property { string } consignee.name - * @property { string } consignee.matchCode - * @property { string } consignee.label - * @property { string } consigneeReference - * @property { object } carrier - * @property { string } carrier.id - * @property { string } carrier.name - * @property { string } carrier.matchCode - * @property { string } carrier.label - * @property { string } carrierReference - * @property { number } positionNumber - * @property { string } hblNumber - * @property { string } mblNumber - * @property { string } bookingNumber - * @property { string } vessel - * @property { string } voyage - * @property { string } vesselCarrier Carrier name from route point (sea positions only) - * @property { object } origin - * @property { string } origin.id - * @property { string } origin.name - * @property { string } loadDate - * @property { object } loadingPort - * @property { string } loadingPort.id - * @property { string } loadingPort.name - * @property { object } dischargePort - * @property { string } dischargePort.id - * @property { string } dischargePort.name - * @property { object } destination - * @property { string } destination.id - * @property { string } destination.name - * @property { string } deliveryDate - * @property { string } equipment - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { object } destinationOffice - * @property { string } destinationOffice.id - * @property { string } destinationOffice.name - * @property { string } currency - * @property { number } profit - * @property { number } margin - * @property { object } employee - * @property { string } employee.id - * @property { string } employee.name - * @property { object } project - * @property { string } project.id - * @property { string } project.name - * @property { string } serviceDate - * @property { string } departureDate - * @property { string } arrivalDate - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.EditorContentResponseDto } notes Notes - * @property { boolean } isMasterPosition - * @property { boolean } hasInvoices Whether this position has at least one invoice - * @property { object } parentPosition - * @property { string } parentPosition.id - * @property { string } parentPosition.number - */ -export const PositionPreviewResponseDtoSchema = z.object({ id: z.string(), externalSystemId: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), number: z.string(), isCancelled: z.boolean(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }), customerReference: z.string().nullish(), consignee: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).nullish(), consigneeReference: z.string().nullish(), carrier: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).nullish(), carrierReference: z.string().nullish(), positionNumber: z.number().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vesselCarrier: z.string().nullish(), origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), loadDate: z.iso.datetime({ offset: true }).nullish(), loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), deliveryDate: z.iso.datetime({ offset: true }).nullish(), equipment: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), currency: z.string().nullish(), profit: z.number().nullish(), margin: z.number().nullish(), employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), departureDate: z.iso.datetime({ offset: true }).nullish(), arrivalDate: z.iso.datetime({ offset: true }).nullish(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), notes: CommonModels.EditorContentResponseDtoSchema.nullish(), isMasterPosition: z.boolean(), hasInvoices: z.boolean().nullish(), parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).nullish() }); -export type PositionPreviewResponseDto = z.infer; - -/** - * PositionFilterDtoSchema - * @type { object } - * @property { CommonModels.TransportModeEnum } transportMode - * @property { string[] } customerId - * @property { string[] } carrierId Filter positions by carrier IDs - * @property { string[] } consigneeId Filter positions by consignee IDs - * @property { boolean } isCancelled - * @property { CommonModels.PositionStatusEnum } status - * @property { string } number - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } employee Filter positions by employee IDs - * @property { string } searchQuery - * @property { string } externalSystemId Filter positions by external system ID (substring match) - * @property { CommonModels.DateRangeDto } createdAt - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.DateRangeDto } departureDate - * @property { CommonModels.DateRangeDto } arrivalDate - * @property { CommonModels.DateRangeDto } blfromCostumerDate - * @property { CommonModels.DateRangeDto } blfromCarrierDate - * @property { CommonModels.DateRangeDto } customsDate - * @property { CommonModels.DateRangeDto } vgmCustomerDate - * @property { string } partnerNetworkId Filter positions by partner network ID - * @property { string[] } projectLiteId Filter positions by project IDs - * @property { string[] } checklistItemsDone Checklist item ids that must be completed - * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics - * @property { boolean } isMasterPosition - * @property { string[] } loadingPortId Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure) - * @property { string[] } dischargePortId Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport) - * @property { string } customerReference Filter positions by customer reference - * @property { string } carrierReference Filter positions by carrier reference - * @property { string } consigneeReference Filter positions by consignee reference - * @property { string } hblNumber Filter positions by HBL/HAWB number - * @property { string } mblNumber Filter positions by MBL/MAWB number - * @property { string } bookingNumber Filter positions by booking number - * @property { string } vessel Filter positions by vessel name - * @property { string } voyage Filter positions by voyage number - * @property { string } vesselCarrier Filter positions by vessel or carrier name - */ -export const PositionFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema.nullable(), customerId: z.array(z.string()).nullable(), carrierId: z.array(z.string()).nullable(), consigneeId: z.array(z.string()).nullable(), isCancelled: z.boolean().nullable(), status: CommonModels.PositionStatusEnumSchema.nullable(), number: z.string().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), employee: z.array(z.string()).nullable(), searchQuery: z.string().nullable(), externalSystemId: z.string().nullable(), createdAt: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), departureDate: CommonModels.DateRangeDtoSchema.nullable(), arrivalDate: CommonModels.DateRangeDtoSchema.nullable(), blfromCostumerDate: CommonModels.DateRangeDtoSchema.nullable(), blfromCarrierDate: CommonModels.DateRangeDtoSchema.nullable(), customsDate: CommonModels.DateRangeDtoSchema.nullable(), vgmCustomerDate: CommonModels.DateRangeDtoSchema.nullable(), partnerNetworkId: z.string().nullable(), projectLiteId: z.array(z.string()).nullable(), checklistItemsDone: z.array(z.string()).nullable(), checklistItemsNotDone: z.array(z.string()).nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable(), isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isMasterPosition: z.boolean().nullable(), loadingPortId: z.array(z.string()).nullable(), dischargePortId: z.array(z.string()).nullable(), customerReference: z.string().nullable(), carrierReference: z.string().nullable(), consigneeReference: z.string().nullable(), hblNumber: z.string().nullable(), mblNumber: z.string().nullable(), bookingNumber: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), vesselCarrier: z.string().nullable() }).partial(); -export type PositionFilterDto = z.infer; - -/** - * PositionExportFilterDtoSchema - * @type { object } - * @property { CommonModels.TransportModeEnum } transportMode - * @property { string[] } customerId - * @property { boolean } isCancelled - * @property { CommonModels.PositionStatusEnum } status - * @property { string } number - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } responsibleEmployee Filter positions by responsible employee IDs - * @property { string } searchQuery - * @property { string } externalSystemId Filter positions by external system ID (substring match) - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.DateRangeDto } dateOfDeparture - * @property { CommonModels.DateRangeDto } dateOfArrival - * @property { CommonModels.DateRangeDto } blfromCostumerDate - * @property { CommonModels.DateRangeDto } blfromCarrierDate - * @property { CommonModels.DateRangeDto } customsDate - * @property { CommonModels.DateRangeDto } vgmCustomerDate - * @property { string } partnerNetworkId Filter positions by partner network ID - * @property { string[] } projectLiteId Filter positions by project IDs - * @property { string[] } checklistItemsDone Checklist item ids that must be completed - * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics - */ -export const PositionExportFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema.nullable(), customerId: z.array(z.string()).nullable(), isCancelled: z.boolean().nullable(), status: CommonModels.PositionStatusEnumSchema.nullable(), number: z.string().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), responsibleEmployee: z.array(z.string()).nullable(), searchQuery: z.string().nullable(), externalSystemId: z.string().nullable(), statusDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), dateOfDeparture: CommonModels.DateRangeDtoSchema.nullable(), dateOfArrival: CommonModels.DateRangeDtoSchema.nullable(), blfromCostumerDate: CommonModels.DateRangeDtoSchema.nullable(), blfromCarrierDate: CommonModels.DateRangeDtoSchema.nullable(), customsDate: CommonModels.DateRangeDtoSchema.nullable(), vgmCustomerDate: CommonModels.DateRangeDtoSchema.nullable(), partnerNetworkId: z.string().nullable(), projectLiteId: z.array(z.string()).nullable(), checklistItemsDone: z.array(z.string()).nullable(), checklistItemsNotDone: z.array(z.string()).nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable(), isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).nullable() }).partial(); -export type PositionExportFilterDto = z.infer; - -/** - * PositionExportColumnSchema - * @type { enum } - */ -export const PositionExportColumnSchema = z.enum(["id", "externalSystemId", "transportMode", "direction", "loadType", "createdAt", "number", "isCancelled", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeName", "consigneeReference", "carrierName", "carrierReference", "positionNumber", "hblNumber", "mblNumber", "bookingNumber", "vessel", "voyage", "originName", "loadDate", "loadingPortName", "dischargePortName", "destinationName", "deliveryDate", "equipment", "serviceTypeName", "departureDate", "arrivalDate", "destinationOfficeName", "currency", "profit", "margin", "employeeName", "projectName", "serviceDate", "routing", "notes", "blFromCustomerDate", "blFromCarrierDate", "customsDate", "vgmCustomerDate", "isMasterPosition", "parentPositionId", "parentPositionNumber"]); -export type PositionExportColumn = z.infer; -export const PositionExportColumn = PositionExportColumnSchema.enum; - -/** - * PositionExportRequestDtoSchema - * @type { object } - * @property { string } order Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @property { PositionExportColumn[] } columns Min Items: `1` - * @property { PositionExportFilterDto } filter - */ -export const PositionExportRequestDtoSchema = z.object({ order: z.string().nullable(), columns: z.array(PositionExportColumnSchema).min(1).nullable(), filter: PositionExportFilterDtoSchema.nullable() }).partial(); -export type PositionExportRequestDto = z.infer; - -/** - * CreatePositionRequestDtoSchema - * @type { object } - * @property { CommonModels.SectionEnum } section - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum } transportMode - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } estimatedServiceDate - * @property { string } customerBusinessPartnerId - */ -export const CreatePositionRequestDtoSchema = z.object({ section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, estimatedServiceDate: z.iso.datetime({ offset: true }), customerBusinessPartnerId: z.string() }); -export type CreatePositionRequestDto = z.infer; - -/** - * DuplicatePositionPackageInformationParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } packageType - * @property { boolean } packageQuantity - * @property { boolean } packageDescription - * @property { boolean } packageHsCodes - * @property { boolean } packageNetWeight - * @property { boolean } packageGrossWeight - * @property { boolean } packageCaseMark - * @property { boolean } packageNote - * @property { boolean } packageCustomsMark - */ -export const DuplicatePositionPackageInformationParametersDtoSchema = z.object({ enabled: z.boolean(), packageType: z.boolean(), packageQuantity: z.boolean(), packageDescription: z.boolean(), packageHsCodes: z.boolean(), packageNetWeight: z.boolean(), packageGrossWeight: z.boolean(), packageCaseMark: z.boolean(), packageNote: z.boolean(), packageCustomsMark: z.boolean() }); -export type DuplicatePositionPackageInformationParametersDto = z.infer; - -/** - * DuplicatePositionCargoParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { DuplicatePositionPackageInformationParametersDto } packageInformation - */ -export const DuplicatePositionCargoParametersDtoSchema = z.object({ enabled: z.boolean(), packageInformation: DuplicatePositionPackageInformationParametersDtoSchema }); -export type DuplicatePositionCargoParametersDto = z.infer; - -/** - * DuplicatePositionOverviewParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } quoteReference - */ -export const DuplicatePositionOverviewParametersDtoSchema = z.object({ enabled: z.boolean(), quoteReference: z.boolean() }); -export type DuplicatePositionOverviewParametersDto = z.infer; - -/** - * DuplicatePositionInvolvedPartiesParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } involvedPartySection - */ -export const DuplicatePositionInvolvedPartiesParametersDtoSchema = z.object({ enabled: z.boolean(), involvedPartySection: z.boolean() }); -export type DuplicatePositionInvolvedPartiesParametersDto = z.infer; - -/** - * DuplicatePositionRoutesParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } routeDates - * @property { boolean } routeLocation - */ -export const DuplicatePositionRoutesParametersDtoSchema = z.object({ enabled: z.boolean(), routeDates: z.boolean(), routeLocation: z.boolean() }); -export type DuplicatePositionRoutesParametersDto = z.infer; - -/** - * DuplicatePositionFinanceAccountParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } exchangeRate - */ -export const DuplicatePositionFinanceAccountParametersDtoSchema = z.object({ enabled: z.boolean(), exchangeRate: z.boolean() }); -export type DuplicatePositionFinanceAccountParametersDto = z.infer; - -/** - * DuplicatePositionDocumentsParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } hblWorkingDocument - * @property { boolean } siWorkingDocument - */ -export const DuplicatePositionDocumentsParametersDtoSchema = z.object({ enabled: z.boolean(), hblWorkingDocument: z.boolean(), siWorkingDocument: z.boolean() }); -export type DuplicatePositionDocumentsParametersDto = z.infer; - -/** - * DuplicatePositionParametersDtoSchema - * @type { object } - * @property { DuplicatePositionOverviewParametersDto } overview - * @property { DuplicatePositionInvolvedPartiesParametersDto } involvedParties - * @property { DuplicatePositionCargoParametersDto } cargo - * @property { DuplicatePositionRoutesParametersDto } routes - * @property { DuplicatePositionFinanceAccountParametersDto } financeAccount - * @property { DuplicatePositionDocumentsParametersDto } documents - */ -export const DuplicatePositionParametersDtoSchema = z.object({ overview: DuplicatePositionOverviewParametersDtoSchema, involvedParties: DuplicatePositionInvolvedPartiesParametersDtoSchema, cargo: DuplicatePositionCargoParametersDtoSchema, routes: DuplicatePositionRoutesParametersDtoSchema, financeAccount: DuplicatePositionFinanceAccountParametersDtoSchema, documents: DuplicatePositionDocumentsParametersDtoSchema }); -export type DuplicatePositionParametersDto = z.infer; - -/** - * DuplicatePositionDefaultParametersResponseDtoSchema - * @type { object } - * @property { string } estimatedServiceDate Suggested estimated service date for the duplicated position (ISO 8601) - * @property { DuplicatePositionParametersDto } parameters Default duplication parameters with section and sub-parameter flags - */ -export const DuplicatePositionDefaultParametersResponseDtoSchema = z.object({ estimatedServiceDate: z.string(), parameters: DuplicatePositionParametersDtoSchema }); -export type DuplicatePositionDefaultParametersResponseDto = z.infer; - -/** - * PositionSectionEnumSchema - * @type { enum } - */ -export const PositionSectionEnumSchema = z.enum(["overview", "involvedParties", "cargo", "financeAccount", "routes", "routeDates", "documents"]); -export type PositionSectionEnum = z.infer; -export const PositionSectionEnum = PositionSectionEnumSchema.enum; - -/** - * DuplicatePositionRequestDtoSchema - * @type { object } - * @property { PositionSectionEnum[] } sections Legacy: sections to duplicate. Ignored when parameters is provided. - * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. - * @property { string } estimatedServiceDate - */ -export const DuplicatePositionRequestDtoSchema = z.object({ sections: z.array(PositionSectionEnumSchema).nullish(), parameters: DuplicatePositionParametersDtoSchema.nullish(), estimatedServiceDate: z.iso.datetime({ offset: true }) }); -export type DuplicatePositionRequestDto = z.infer; - -/** - * UpdatePositionDtoSchema - * @type { object } - * @property { string } externalSystemId - * @property { string } statusDate - * @property { CommonModels.PositionStatusEnum } status - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.IncotermsEnum } incoterms - * @property { CommonModels.IncotermsEnum } secondIncoterms - * @property { string } fillingCompany - * @property { string } sellingContract - * @property { string } fillingScacCode - * @property { string } serviceValidity - * @property { string } ratesValidity - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } buyRateReference - * @property { CommonModels.FrequencyEnum } frequency - * @property { boolean } isParentPosition - * @property { boolean } isExcludedFromStatistics - * @property { string } team - * @property { string } salesRepId - * @property { string } responsibleEmployeeId - * @property { string } receivedByEmployeeId - * @property { string } originOfficeId - * @property { string } projectLiteId - * @property { CommonModels.EditorContentUpdateDto } notes Notes - * @property { CommonModels.MovementTypeEnum } inttraTypeOfMove - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const UpdatePositionDtoSchema = z.object({ externalSystemId: z.string().nullable(), statusDate: z.iso.datetime({ offset: true }).nullable(), status: CommonModels.PositionStatusEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), incoterms: CommonModels.IncotermsEnumSchema.nullable(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullable(), fillingCompany: z.string().nullable(), sellingContract: z.string().nullable(), fillingScacCode: z.string().nullable(), serviceValidity: z.iso.datetime({ offset: true }).nullable(), ratesValidity: z.iso.datetime({ offset: true }).nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), buyRateReference: z.string().nullable(), frequency: CommonModels.FrequencyEnumSchema.nullable(), isParentPosition: z.boolean().nullable(), isExcludedFromStatistics: z.boolean().nullable(), team: z.string().nullable(), salesRepId: z.string().nullable(), responsibleEmployeeId: z.string().nullable(), receivedByEmployeeId: z.string().nullable(), originOfficeId: z.string().nullable(), projectLiteId: z.string().nullable(), notes: CommonModels.EditorContentUpdateDtoSchema.nullable(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullable(), volumetricWeightModifier: z.number().nullable() }).partial(); -export type UpdatePositionDto = z.infer; - -/** - * ChildPositionCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type ChildPositionCustomerDto = z.infer; - -/** - * ChildPositionProfitDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currency - */ -export const ChildPositionProfitDtoSchema = z.object({ amount: z.number(), currency: z.string() }); -export type ChildPositionProfitDto = z.infer; - -/** - * ChildPositionResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { number } packages - * @property { number } weight - * @property { number } volume - * @property { ChildPositionCustomerDto } customer - * @property { ChildPositionProfitDto } profit - */ -export const ChildPositionResponseDtoSchema = z.object({ id: z.string(), number: z.string(), packages: z.number(), weight: z.number(), volume: z.number(), customer: ChildPositionCustomerDtoSchema, profit: ChildPositionProfitDtoSchema }); -export type ChildPositionResponseDto = z.infer; - -/** - * PositionLabelsFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } isParentPosition - * @property { boolean } isLinkedPosition - */ -export const PositionLabelsFilterDtoSchema = z.object({ search: z.string().nullable(), isParentPosition: z.boolean().nullable(), isLinkedPosition: z.boolean().nullable() }).partial(); -export type PositionLabelsFilterDto = z.infer; - -/** - * PositionListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const PositionListResponseDtoSchema = z.object({ items: z.array(z.string()), totalProfit: z.number(), profitPerPosition: z.number(), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type PositionListResponseDto = z.infer; - -/** - * LinkChildPositionsRequestDtoSchema - * @type { object } - * @property { string[] } childPositionIds - */ -export const LinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()) }); -export type LinkChildPositionsRequestDto = z.infer; - -/** - * UnlinkChildPositionsRequestDtoSchema - * @type { object } - * @property { string[] } childPositionIds - */ -export const UnlinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()) }); -export type UnlinkChildPositionsRequestDto = z.infer; - -/** - * PositionsFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PositionsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PositionsFindAllResponse = z.infer; - -/** - * PositionsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PositionsPaginateOrderParamEnumSchema = z.enum(["number", "transportMode", "isCancelled", "direction", "loadType", "serviceDate", "createdAt", "departureDate", "arrivalDate", "blfromCostumerDate", "blfromCarrierDate", "customsDate", "vgmCustomerDate", "serviceType", "externalSystemId", "employee", "project", "profit", "margin", "isMasterPosition"]); -export type PositionsPaginateOrderParamEnum = z.infer; -export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSchema.enum; - -/** - * PositionsPaginateResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionPreviewResponseDto[] } items - */ -export const PositionsPaginateResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).nullable() }).partial().shape }); -export type PositionsPaginateResponse = z.infer; - -/** - * TotalProfitResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionPreviewResponseDto[] } items - */ -export const TotalProfitResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).nullable() }).partial().shape }); -export type TotalProfitResponse = z.infer; - -/** - * PositionsListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ -export const PositionsListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).nullable() }).partial().shape }); -export type PositionsListAvailablePartnersForResponse = z.infer; - -/** - * ListRouteLabelsResponseSchema - * @type { array } - */ -export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type ListRouteLabelsResponse = z.infer; - -/** - * ListChildResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChildPositionResponseDto[] } items - */ -export const ListChildResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChildPositionResponseDtoSchema).nullable() }).partial().shape }); -export type ListChildResponse = z.infer; - -} diff --git a/test/generated/base/positions/positions.queries.ts b/test/generated/base/positions/positions.queries.ts deleted file mode 100644 index 3b89435..0000000 --- a/test/generated/base/positions/positions.queries.ts +++ /dev/null @@ -1,535 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionsAcl } from "./positions.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionsApi } from "./positions.api"; - -export namespace PositionsQueries { -export const moduleName = QueryModule.Positions; - -export const keys = { - all: [moduleName] as const, - findAll: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", officeId, limit, filter, page, cursor] as const, - findAllInfinite: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", "infinite", officeId, limit, filter, cursor] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions", "infinite", officeId, limit, order, filter, cursor] as const, - totalProfit: (officeId: string) => [...keys.all, "/offices/:officeId/positions/fake-total-profit", officeId] as const, - listAvailablePartnersFor: (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/positions/:positionId/available-partners", officeId, positionId, search, useCase] as const, - get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId", officeId, positionId] as const, - listRouteLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes/labels", officeId, positionId] as const, - getDuplicateDefaultParameters: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/duplicate/default-parameters", officeId, positionId] as const, - listChild: (officeId: string, positionId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", officeId, positionId, limit, page, cursor] as const, - listChildInfinite: (officeId: string, positionId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", "infinite", officeId, positionId, limit, cursor] as const, -}; - -/** - * Query `useFindAll` - * @summary List all positions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ officeId, limit, filter, page, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(officeId, limit, filter, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUseFindAll({ officeId } )); - return PositionsApi.findAll(officeId, limit, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @summary List all positions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ officeId, limit, filter, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUseFindAll({ officeId } )); - return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary List positions - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @param { PositionsModels.PositionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUsePaginate({ officeId } )); - return PositionsApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary List positions - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @param { PositionsModels.PositionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUsePaginate({ officeId } )); - return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create position - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { PositionsModels.CreatePositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position created successfully - * @statusCodes [201, 400, 401, 404] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PositionsAcl.canUseCreate({ officeId } )); - return PositionsApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useTotalProfit` - * @summary List positions - * @permission Requires `canUseTotalProfit` ability - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useTotalProfit = ({ officeId }: { officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.totalProfit(officeId), - queryFn: () => { - checkAcl(PositionsAcl.canUseTotalProfit({ officeId } )); - return PositionsApi.totalProfit(officeId) }, - ...options, - }); -}; - -/** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for a position - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListAvailablePartnersFor = ({ officeId, positionId, search, useCase }: { officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), - queryFn: () => { - checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId } )); - return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase) }, - ...options, - }); -}; - -/** - * Mutation `useExportPositions` - recommended when file should not be cached - * @summary Export positions to Excel - * @permission Requires `canUseExportPositions` ability - * @param { string } mutation.officeId Path parameter - * @param { PositionsModels.PositionExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportPositions = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PositionsAcl.canUseExportPositions({ officeId } )); - return PositionsApi.exportPositions(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGet` - * @summary Get position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Position retrieved successfully - * @statusCodes [200, 401, 403, 404] - */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseGet({ officeId } )); - return PositionsApi.get(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.UpdatePositionDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position updated successfully - * @statusCodes [200, 400, 401, 404] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseUpdate({ officeId } )); - return PositionsApi.update(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListRouteLabels` - * @summary List all route labels for a position - * @permission Requires `canUseListRouteLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRouteLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRouteLabels(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseListRouteLabels({ officeId } )); - return PositionsApi.listRouteLabels(officeId, positionId) }, - ...options, - }); -}; - -/** - * Query `useGetDuplicateDefaultParameters` - * @summary Get default duplication parameters for a position - * @permission Requires `canUseGetDuplicateDefaultParameters` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Default parameters and suggested estimated service date - * @statusCodes [200, 401, 404] - */ -export const useGetDuplicateDefaultParameters = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId } )); - return PositionsApi.getDuplicateDefaultParameters(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useDuplicate` - * @summary Duplicate position - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.DuplicatePositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position duplicated successfully - * @statusCodes [201, 400, 401, 404] - */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseDuplicate({ officeId } )); - return PositionsApi.duplicate(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCancel` - * @summary Cancel position - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position cancelled successfully - * @statusCodes [200, 400, 401, 403, 404] - */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionsAcl.canUseCancel({ officeId } )); - return PositionsApi.cancel(officeId, positionId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRevertCancel` - * @summary Revert cancelled position (accounting) - * @permission Requires `canUseRevertCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position reverted successfully - * @statusCodes [200, 400, 401, 403, 404] - */ -export const useRevertCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionsAcl.canUseRevertCancel({ officeId } )); - return PositionsApi.revertCancel(officeId, positionId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useLinkChild` - * @summary Link child positions to parent - * @permission Requires `canUseLinkChild` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.LinkChildPositionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useLinkChild = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseLinkChild({ officeId } )); - return PositionsApi.linkChild(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnlinkChild` - * @summary Unlink child positions from parent - * @permission Requires `canUseUnlinkChild` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.UnlinkChildPositionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnlinkChild = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseUnlinkChild({ officeId } )); - return PositionsApi.unlinkChild(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListChild` - * @summary Get child positions for parent - * @permission Requires `canUseListChild` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListChild = ({ officeId, positionId, limit, page, cursor }: { officeId: string, positionId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listChild(officeId, positionId, limit, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUseListChild({ officeId } )); - return PositionsApi.listChild(officeId, positionId, limit, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListChildInfinite - * @summary Get child positions for parent - * @permission Requires `canUseListChild` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListChildInfinite = ({ officeId, positionId, limit, cursor }: { officeId: string, positionId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUseListChild({ officeId } )); - return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/base/projectLite/projectLite.acl.ts b/test/generated/base/projectLite/projectLite.acl.ts deleted file mode 100644 index 00ccf56..0000000 --- a/test/generated/base/projectLite/projectLite.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ProjectLiteAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create project in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Create", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List projects for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `usePaginateProjectLabels` query ability. For global ability, omit the object parameter. - * @description Paginate project labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateProjectLabels` query - */ -export const canUsePaginateProjectLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get project by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Update", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -} diff --git a/test/generated/base/projectLite/projectLite.api.ts b/test/generated/base/projectLite/projectLite.api.ts deleted file mode 100644 index 3bb49bc..0000000 --- a/test/generated/base/projectLite/projectLite.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ProjectLiteModels } from "./projectLite.models"; - -export namespace ProjectLiteApi { -export const create = (officeId: string, data: ProjectLiteModels.CreateProjectLiteRequestDTO, ) => { - return AppRestClient.post( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite`, - ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), - - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, - `/offices/${officeId}/project-lite`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateProjectLabels = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, - `/offices/${officeId}/project-lite/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: ProjectLiteModels.UpdateProjectLiteRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite/${id}`, - ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/project-lite/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/project-lite/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/projectLite/projectLite.configs.ts b/test/generated/base/projectLite/projectLite.configs.ts deleted file mode 100644 index 5981c30..0000000 --- a/test/generated/base/projectLite/projectLite.configs.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ProjectLiteModels } from "./projectLite.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ProjectLiteQueries } from "./projectLite.queries"; -import { ProjectLiteAcl } from "./projectLite.acl"; - -export namespace ProjectLiteConfigs { -export const projectLiteConfig = { - meta: { - title: "Project Lite", - }, - readAll: { - acl: ProjectLiteAcl.canUsePaginate, - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - paginated: ProjectLiteQueries.usePaginate, - infinite: ProjectLiteQueries.usePaginateInfinite, - filters: { - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ProjectLiteAcl.canUseFindById, - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - query: ProjectLiteQueries.useFindById, - }, - create: { - acl: ProjectLiteAcl.canUseCreate, - schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, - mutation: ProjectLiteQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: ProjectLiteAcl.canUseUpdate, - schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, - mutation: ProjectLiteQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: ProjectLiteAcl.canUsePaginateProjectLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ProjectLiteQueries.usePaginateProjectLabels, - infinite: ProjectLiteQueries.usePaginateProjectLabelsInfinite, - filters: { - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/projectLite/projectLite.models.ts b/test/generated/base/projectLite/projectLite.models.ts deleted file mode 100644 index a40cc28..0000000 --- a/test/generated/base/projectLite/projectLite.models.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ProjectLiteModels { -/** - * ProjectLiteEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ProjectLiteEmployeeDTO = z.infer; - -/** - * ProjectLiteResponseDTOSchema - * @type { object } - * @property { string } id Project ID - * @property { string } name Project name - * @property { string } officeId Office ID - * @property { boolean } archived Is archived - * @property { string } createdById ID of the employee who created this project - * @property { ProjectLiteEmployeeDTO } createdBy Employee who created this project - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this project - * @property { ProjectLiteEmployeeDTO } updatedBy Employee who last updated this project - * @property { string } updatedAt Updated at - */ -export const ProjectLiteResponseDTOSchema = z.object({ id: z.string(), name: z.string(), officeId: z.string(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: ProjectLiteEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ProjectLiteEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type ProjectLiteResponseDTO = z.infer; - -/** - * CreateProjectLiteRequestDTOSchema - * @type { object } - * @property { string } name Project name - */ -export const CreateProjectLiteRequestDTOSchema = z.object({ name: z.string() }); -export type CreateProjectLiteRequestDTO = z.infer; - -/** - * ProjectLiteFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ProjectLiteFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type ProjectLiteFilterDto = z.infer; - -/** - * UpdateProjectLiteRequestDTOSchema - * @type { object } - * @property { string } name Project name - */ -export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().nullable() }).partial(); -export type UpdateProjectLiteRequestDTO = z.infer; - -/** - * ProjectLitePaginateOrderParamEnumSchema - * @type { enum } - */ -export const ProjectLitePaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ProjectLitePaginateOrderParamEnum = z.infer; -export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEnumSchema.enum; - -/** - * ProjectLitePaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ProjectLiteResponseDTO[] } items - */ -export const ProjectLitePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).nullable() }).partial().shape }); -export type ProjectLitePaginateResponse = z.infer; - -/** - * PaginateProjectLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateProjectLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateProjectLabelsOrderParamEnum = z.infer; -export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderParamEnumSchema.enum; - -/** - * PaginateProjectLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateProjectLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PaginateProjectLabelsResponse = z.infer; - -} diff --git a/test/generated/base/projectLite/projectLite.queries.ts b/test/generated/base/projectLite/projectLite.queries.ts deleted file mode 100644 index 52d1c07..0000000 --- a/test/generated/base/projectLite/projectLite.queries.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ProjectLiteAcl } from "./projectLite.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ProjectLiteModels } from "./projectLite.models"; -import { ProjectLiteApi } from "./projectLite.api"; - -export namespace ProjectLiteQueries { -export const moduleName = QueryModule.ProjectLite; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", "infinite", officeId, limit, order, filter, cursor] as const, - paginateProjectLabels: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", officeId, limit, order, filter, page, cursor] as const, - paginateProjectLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/project-lite/:id", id, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create project - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ProjectLiteModels.CreateProjectLiteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ProjectLiteAcl.canUseCreate({ officeId } )); - return ProjectLiteApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated projects - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); - return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated projects - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); - return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateProjectLabels` - * @summary Paginate project labels - * @permission Requires `canUsePaginateProjectLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateProjectLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateProjectLabelsInfinite - * @summary Paginate project labels - * @permission Requires `canUsePaginateProjectLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateProjectLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get project by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUseFindById({ officeId } )); - return ProjectLiteApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update project - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ProjectLiteModels.UpdateProjectLiteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ProjectLiteAcl.canUseUpdate({ officeId } )); - return ProjectLiteApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive project - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ProjectLiteAcl.canUseArchive({ officeId } )); - return ProjectLiteApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive project - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId } )); - return ProjectLiteApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/queryModules.ts b/test/generated/base/queryModules.ts deleted file mode 100644 index 2daa74a..0000000 --- a/test/generated/base/queryModules.ts +++ /dev/null @@ -1,96 +0,0 @@ -export const enum QueryModule { - WorkingDocuments = "WorkingDocumentsQueries", - Offices = "OfficesQueries", - BankAccounts = "BankAccountsQueries", - Currencies = "CurrenciesQueries", - Countries = "CountriesQueries", - Folders = "FoldersQueries", - Files = "FilesQueries", - WorkingDocumentsTemplatedDocument = "WorkingDocumentsTemplatedDocumentQueries", - BusinessPartners = "BusinessPartnersQueries", - BusinessPartnerBookkeepingMappings = "BusinessPartnerBookkeepingMappingsQueries", - BusinessPartnerContacts = "BusinessPartnerContactsQueries", - Cities = "CitiesQueries", - Depots = "DepotsQueries", - PartnerNetworks = "PartnerNetworksQueries", - Warehouses = "WarehousesQueries", - UserActivity = "UserActivityQueries", - DocumentTemplates = "DocumentTemplatesQueries", - HsCodes = "HsCodesQueries", - CargoTypes = "CargoTypesQueries", - SeaPositions = "SeaPositionsQueries", - Terminals = "TerminalsQueries", - Airports = "AirportsQueries", - Ports = "PortsQueries", - ContainerYards = "ContainerYardsQueries", - PositionInvolvedParties = "PositionInvolvedPartiesQueries", - PositionRoutes = "PositionRoutesQueries", - AirPositions = "AirPositionsQueries", - PositionAccount = "PositionAccountQueries", - PositionAccountItems = "PositionAccountItemsQueries", - PositionProfitChangeTracking = "PositionProfitChangeTrackingQueries", - WorkingDocumentsExportDeclaration = "WorkingDocumentsExportDeclarationQueries", - PositionCargo = "PositionCargoQueries", - PositionCargoPackage = "PositionCargoPackageQueries", - PackageTypes = "PackageTypesQueries", - WorkingDocumentsHouseBl = "WorkingDocumentsHouseBlQueries", - WorkingDocumentsBlInstructions = "WorkingDocumentsBlInstructionsQueries", - WorkingDocumentsAmsInstructions = "WorkingDocumentsAmsInstructionsQueries", - WorkingDocumentsHouseAwb = "WorkingDocumentsHouseAwbQueries", - ChargeTypes = "ChargeTypesQueries", - WorkingDocumentsMasterAwb = "WorkingDocumentsMasterAwbQueries", - WorkingDocumentsCmrForm = "WorkingDocumentsCmrFormQueries", - WorkingDocumentsIsfForm = "WorkingDocumentsIsfFormQueries", - WorkingDocumentsFcrForm = "WorkingDocumentsFcrFormQueries", - ShippingInstructions = "ShippingInstructionsQueries", - EmployeeAccount = "EmployeeAccountQueries", - EmployeeSettings = "EmployeeSettingsQueries", - EmployeeRoles = "EmployeeRolesQueries", - EmployeePermissions = "EmployeePermissionsQueries", - EmployeeProfile = "EmployeeProfileQueries", - Employee = "EmployeeQueries", - Employment = "EmploymentQueries", - CustomerAccount = "CustomerAccountQueries", - Customers = "CustomersQueries", - Quotes = "QuotesQueries", - QuoteAccount = "QuoteAccountQueries", - QuoteProfitChangeTracking = "QuoteProfitChangeTrackingQueries", - SeaQuotes = "SeaQuotesQueries", - RoadQuotes = "RoadQuotesQueries", - QuoteDocument = "QuoteDocumentQueries", - QuoteCargo = "QuoteCargoQueries", - QuoteCargoPackage = "QuoteCargoPackageQueries", - QuoteRoutes = "QuoteRoutesQueries", - DunningManagement = "DunningManagementQueries", - DunningPartnerOutstandingInvoices = "DunningPartnerOutstandingInvoicesQueries", - DunningLevels = "DunningLevelsQueries", - DunningSystems = "DunningSystemsQueries", - DunningAccountStatement = "DunningAccountStatementQueries", - Positions = "PositionsQueries", - QuoteConversion = "QuoteConversionQueries", - Invoices = "InvoicesQueries", - VatRules = "VatRulesQueries", - InvoicePayments = "InvoicePaymentsQueries", - PaymentConfirmations = "PaymentConfirmationsQueries", - ProjectLite = "ProjectLiteQueries", - PositionChecklist = "PositionChecklistQueries", - ChecklistTemplates = "ChecklistTemplatesQueries", - BookkeepingExport = "BookkeepingExportQueries", - FactoringExport = "FactoringExportQueries", - FactoringMerge = "FactoringMergeQueries", - AWBStocks = "AWBStocksQueries", - MasterData = "MasterDataQueries", - ChecklistItems = "ChecklistItemsQueries", - MasterDataImport = "MasterDataImportQueries", - RemarkTemplates = "RemarkTemplatesQueries", - IntegrationChannels = "IntegrationChannelsQueries", - ControlTowerBookings = "ControlTowerBookingsQueries", - ControlTowerPackages = "ControlTowerPackagesQueries", - ControlTowerContainers = "ControlTowerContainersQueries", - ControlTowerAuth = "ControlTowerAuthQueries", - ControlTowerMe = "ControlTowerMeQueries", - ControlTowerSearch = "ControlTowerSearchQueries", - ControlTowerCalendar = "ControlTowerCalendarQueries", - InttraShippingInstructionMessages = "InttraShippingInstructionMessagesQueries", - InttraOfficeIntegration = "InttraOfficeIntegrationQueries", -} \ No newline at end of file diff --git a/test/generated/base/quoteAccount/quoteAccount.acl.ts b/test/generated/base/quoteAccount/quoteAccount.acl.ts deleted file mode 100644 index 5a12701..0000000 --- a/test/generated/base/quoteAccount/quoteAccount.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteAccountAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description List quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateItem` mutation - */ -export const canUseCreateItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDeleteItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteItem` mutation - */ -export const canUseDeleteItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateItem` mutation - */ -export const canUseUpdateItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDuplicateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateItem` mutation - */ -export const canUseDuplicateItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/base/quoteAccount/quoteAccount.api.ts b/test/generated/base/quoteAccount/quoteAccount.api.ts deleted file mode 100644 index f29e866..0000000 --- a/test/generated/base/quoteAccount/quoteAccount.api.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteAccountModels } from "./quoteAccount.models"; - -export namespace QuoteAccountApi { -export const get = (quoteId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/account`, - - ) -}; -export const createItem = (quoteId: string, officeId: string, data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, ) => { - return AppRestClient.post( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items`, - ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), - - ) -}; -export const deleteItem = (quoteId: string, itemId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - - ) -}; -export const updateItem = (quoteId: string, itemId: string, officeId: string, data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, ) => { - return AppRestClient.patch( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), - - ) -}; -export const duplicateItem = (quoteId: string, itemId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, - - ) -}; -} diff --git a/test/generated/base/quoteAccount/quoteAccount.models.ts b/test/generated/base/quoteAccount/quoteAccount.models.ts deleted file mode 100644 index cdc459b..0000000 --- a/test/generated/base/quoteAccount/quoteAccount.models.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { z } from "zod"; - -export namespace QuoteAccountModels { -/** - * QuoteAccountItemTypeEnumSchema - * @type { enum } - */ -export const QuoteAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); -export type QuoteAccountItemTypeEnum = z.infer; -export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; - -/** - * QuoteChargeDtoResponseSchema - * @type { object } - * @property { object } chargeType - * @property { string } chargeType.id - * @property { string } chargeType.name - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { object } buyVatRule - * @property { string } buyVatRule.id - * @property { string } buyVatRule.name - * @property { string } buyVatRule.matchcode - * @property { string } buyVatRule.printCode - * @property { object } vendor - * @property { string } vendor.id - * @property { string } vendor.name - * @property { string } vendor.matchCode - * @property { string } vendor.label - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { object } sellVatRule - * @property { string } sellVatRule.id - * @property { string } sellVatRule.name - * @property { string } sellVatRule.matchcode - * @property { string } sellVatRule.printCode - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - * @property { number } profit Profit amount - */ -export const QuoteChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }), additionalText: z.string(), quantity: z.number().nullish(), buyRate: z.number().nullish(), buyCurrencyCode: z.string(), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }), buyExchangeRate: z.number().nullish(), sellRate: z.number().nullish(), sellCurrencyCode: z.string(), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }), sellExchangeRate: z.number().nullish(), profit: z.number().nullish() }); -export type QuoteChargeDtoResponse = z.infer; - -/** - * QuoteTextDtoResponseSchema - * @type { object } - * @property { string } content Text content - */ -export const QuoteTextDtoResponseSchema = z.object({ content: z.string() }); -export type QuoteTextDtoResponse = z.infer; - -/** - * QuoteAccountItemDtoResponseSchema - * @type { object } - * @property { string } id Item ID - * @property { QuoteAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE - * @property { QuoteTextDtoResponse } text Text data if type is TEXT - */ -export const QuoteAccountItemDtoResponseSchema = z.object({ id: z.string(), type: QuoteAccountItemTypeEnumSchema, orderPosition: z.number(), charge: QuoteChargeDtoResponseSchema.nullish(), text: QuoteTextDtoResponseSchema.nullish() }); -export type QuoteAccountItemDtoResponse = z.infer; - -/** - * QuoteAccountResponseDtoSchema - * @type { object } - * @property { string } id Account ID - * @property { string } quoteId Quote ID - * @property { QuoteAccountItemDtoResponse[] } items Account items - * @property { object } totals Account totals - * @property { number } totals.totalBuyRates - * @property { number } totals.totalSellRates - * @property { number } totals.totalProfit - * @property { number } totals.displayAmount - * @property { string } totals.displayCurrencyCode - * @property { object[] } totalsPerCurrency Account totals per currency - * @property { number } totalsPerCurrency.[0].totalBuyRates - * @property { number } totalsPerCurrency.[0].totalSellRates - * @property { number } totalsPerCurrency.[0].totalProfit - * @property { number } totalsPerCurrency.[0].displayAmount - * @property { string } totalsPerCurrency.[0].displayCurrencyCode - */ -export const QuoteAccountResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), items: z.array(QuoteAccountItemDtoResponseSchema), totals: z.object({ totalBuyRates: z.number().nullable(), totalSellRates: z.number().nullable(), totalProfit: z.number().nullable(), displayAmount: z.number().nullable(), displayCurrencyCode: z.string().nullable() }).partial(), totalsPerCurrency: z.array(z.object({ totalBuyRates: z.number().nullable(), totalSellRates: z.number().nullable(), totalProfit: z.number().nullable(), displayAmount: z.number().nullable(), displayCurrencyCode: z.string().nullable() }).partial()) }); -export type QuoteAccountResponseDto = z.infer; - -/** - * CreateQuoteChargeDataDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1`. Default: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code. Default: `EUR` - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code. Default: `EUR` - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const CreateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable().default(1), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable().default("EUR"), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable().default("EUR"), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); -export type CreateQuoteChargeDataDto = z.infer; - -/** - * CreateQuoteTextDataDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const CreateQuoteTextDataDtoSchema = z.object({ content: z.string().nullable() }).partial(); -export type CreateQuoteTextDataDto = z.infer; - -/** - * CreateQuoteAccountItemRequestDtoSchema - * @type { object } - * @property { QuoteAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { CreateQuoteChargeDataDto } charge Charge data if type is CHARGE - * @property { CreateQuoteTextDataDto } text Text data if type is TEXT - */ -export const CreateQuoteAccountItemRequestDtoSchema = z.object({ type: QuoteAccountItemTypeEnumSchema, orderPosition: z.number().nullish(), charge: CreateQuoteChargeDataDtoSchema.nullish(), text: CreateQuoteTextDataDtoSchema.nullish() }); -export type CreateQuoteAccountItemRequestDto = z.infer; - -/** - * UpdateQuoteChargeDataDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const UpdateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); -export type UpdateQuoteChargeDataDto = z.infer; - -/** - * UpdateQuoteTextDataDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const UpdateQuoteTextDataDtoSchema = z.object({ content: z.string().nullable() }).partial(); -export type UpdateQuoteTextDataDto = z.infer; - -/** - * UpdateQuoteAccountItemRequestDtoSchema - * @type { object } - * @property { number } orderPosition Order position of the item - * @property { UpdateQuoteChargeDataDto } charge Charge data if type is CHARGE - * @property { UpdateQuoteTextDataDto } text Text data if type is TEXT - */ -export const UpdateQuoteAccountItemRequestDtoSchema = z.object({ orderPosition: z.number().nullable(), charge: UpdateQuoteChargeDataDtoSchema.nullable(), text: UpdateQuoteTextDataDtoSchema.nullable() }).partial(); -export type UpdateQuoteAccountItemRequestDto = z.infer; - -} diff --git a/test/generated/base/quoteAccount/quoteAccount.queries.ts b/test/generated/base/quoteAccount/quoteAccount.queries.ts deleted file mode 100644 index eeba0f1..0000000 --- a/test/generated/base/quoteAccount/quoteAccount.queries.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteAccountAcl } from "./quoteAccount.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteAccountModels } from "./quoteAccount.models"; -import { QuoteAccountApi } from "./quoteAccount.api"; - -export namespace QuoteAccountQueries { -export const moduleName = QueryModule.QuoteAccount; - -export const keys = { - all: [moduleName] as const, - get: (quoteId: string, officeId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account", quoteId, officeId] as const, -}; - -/** - * Query `useGet` - * @summary Get quote account details - * @permission Requires `canUseGet` ability - * @param { string } object.quoteId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ quoteId, officeId }: { quoteId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(quoteId, officeId), - queryFn: () => { - checkAcl(QuoteAccountAcl.canUseGet({ officeId } )); - return QuoteAccountApi.get(quoteId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateItem` - * @summary Create quote account item - * @permission Requires `canUseCreateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { QuoteAccountModels.CreateQuoteAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, officeId, data }) => { - checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId } )); - return QuoteAccountApi.createItem(quoteId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteItem` - * @summary Delete quote account item - * @permission Requires `canUseDeleteItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteItem = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId }) => { - checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId } )); - return QuoteAccountApi.deleteItem(quoteId, itemId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateItem` - * @summary Update quote account item - * @permission Requires `canUseUpdateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { QuoteAccountModels.UpdateQuoteAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId, data }) => { - checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId } )); - return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicateItem` - * @summary Duplicate quote account item - * @permission Requires `canUseDuplicateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId }) => { - checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId } )); - return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/quoteCargo/quoteCargo.acl.ts b/test/generated/base/quoteCargo/quoteCargo.acl.ts deleted file mode 100644 index 38031c0..0000000 --- a/test/generated/base/quoteCargo/quoteCargo.acl.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteCargoAcl { -/** - * Use for `useListCargosByQuoteId` query ability. For global ability, omit the object parameter. - * @description List cargo items by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByQuoteId` query - */ -export const canUseListCargosByQuoteId = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. - * @description List cargo labels by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query - */ -export const canUseListCargoLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. - * @description Get cargo summary by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query - */ -export const canUseGetCargoSummary = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. - * @description Get cargo item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query - */ -export const canUseGetCargoById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. - * @description Update cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation - */ -export const canUseUpdateCargo = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation - */ -export const canUseDeleteCargo = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation - */ -export const canUseCreateBulkCargos = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation - */ -export const canUseDuplicateCargo = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/base/quoteCargo/quoteCargo.api.ts b/test/generated/base/quoteCargo/quoteCargo.api.ts deleted file mode 100644 index 3d52cf1..0000000 --- a/test/generated/base/quoteCargo/quoteCargo.api.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteCargoModels } from "./quoteCargo.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoApi { -export const listCargosByQuoteId = (officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos`, - { - params: { - order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listCargoLabels = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, - - ) -}; -export const getCargoSummary = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, - - ) -}; -export const getCargoById = (officeId: string, quoteId: string, cargoId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - - ) -}; -export const updateCargo = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - - ) -}; -export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - - ) -}; -export const createBulkCargos = (numberOfCargos: number, officeId: string, quoteId: string, data: CommonModels.CreatePositionCargoDTO, ) => { - return AppRestClient.post( - { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - - ) -}; -export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, - - ) -}; -} diff --git a/test/generated/base/quoteCargo/quoteCargo.configs.ts b/test/generated/base/quoteCargo/quoteCargo.configs.ts deleted file mode 100644 index bbd862c..0000000 --- a/test/generated/base/quoteCargo/quoteCargo.configs.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoQueries } from "./quoteCargo.queries"; -import { QuoteCargoAcl } from "./quoteCargo.acl"; - -export namespace QuoteCargoConfigs { -export const cargosConfig = { - meta: { - title: "Cargos", - }, - readAll: { - acl: QuoteCargoAcl.canUseListCargosByQuoteId, - schema: CommonModels.PositionCargoResponseDTOSchema, - paginated: QuoteCargoQueries.useListCargosByQuoteId, - infinite: QuoteCargoQueries.useListCargosByQuoteIdInfinite, - columns: dynamicColumns({ - schema: CommonModels.PositionCargoResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - quoteId: true, - rootFolderId: true, - cargoType: true, - autoCalculateTotals: true, - autoCalculateRates: true, - autoCalculateVgm: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - rateOptions: true, - rateClass: true, - textForCustoms: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - ratePerKg: true, - totalRate: true, - tare: true, - vgm: true, - hsCodeLabels: true, - note: true, - packages: true, - createdAt: true, - updatedAt: true, - completeWeight: true, - packageTotals: true, - }, - }, -}), - }, - read: { - acl: QuoteCargoAcl.canUseGetCargoById, - schema: CommonModels.PositionCargoResponseDTOSchema, - query: QuoteCargoQueries.useGetCargoById, - }, - update: { - acl: QuoteCargoAcl.canUseUpdateCargo, - schema: CommonModels.UpdatePositionCargoDTOSchema, - mutation: QuoteCargoQueries.useUpdateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.UpdatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, -}) - }, - delete: { - acl: QuoteCargoAcl.canUseDeleteCargo, - mutation: QuoteCargoQueries.useDeleteCargo, - }, -}; - -} diff --git a/test/generated/base/quoteCargo/quoteCargo.models.ts b/test/generated/base/quoteCargo/quoteCargo.models.ts deleted file mode 100644 index 8d7a3a0..0000000 --- a/test/generated/base/quoteCargo/quoteCargo.models.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoModels { -/** - * ListCargosByQuoteIdOrderParamSchema - * @type { array } - */ -export const ListCargosByQuoteIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).nullish(); -export type ListCargosByQuoteIdOrderParam = z.infer; - -/** - * ListCargosByQuoteIdResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.PositionCargoResponseDTO[] } items - */ -export const ListCargosByQuoteIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).nullable() }).partial().shape }); -export type ListCargosByQuoteIdResponse = z.infer; - -/** - * QuoteCargoListCargoLabelsResponseSchema - * @type { array } - */ -export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type QuoteCargoListCargoLabelsResponse = z.infer; - -/** - * QuoteCargoGetCargoSummaryResponseSchema - * @type { array } - */ -export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema); -export type QuoteCargoGetCargoSummaryResponse = z.infer; - -/** - * QuoteCargoCreateBulkCargosResponseSchema - * @type { array } - */ -export const QuoteCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema); -export type QuoteCargoCreateBulkCargosResponse = z.infer; - -} diff --git a/test/generated/base/quoteCargo/quoteCargo.queries.ts b/test/generated/base/quoteCargo/quoteCargo.queries.ts deleted file mode 100644 index 3156a3e..0000000 --- a/test/generated/base/quoteCargo/quoteCargo.queries.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteCargoAcl } from "./quoteCargo.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteCargoModels } from "./quoteCargo.models"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoApi } from "./quoteCargo.api"; - -export namespace QuoteCargoQueries { -export const moduleName = QueryModule.QuoteCargo; - -export const keys = { - all: [moduleName] as const, - listCargosByQuoteId: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", officeId, quoteId, limit, order, page, cursor] as const, - listCargosByQuoteIdInfinite: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", "infinite", officeId, quoteId, limit, order, cursor] as const, - listCargoLabels: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/labels", officeId, quoteId] as const, - getCargoSummary: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/summary", officeId, quoteId] as const, - getCargoById: (officeId: string, quoteId: string, cargoId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/:cargoId", officeId, quoteId, cargoId] as const, -}; - -/** - * Query `useListCargosByQuoteId` - * @summary List all cargo items for a quote - * @permission Requires `canUseListCargosByQuoteId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByQuoteId = ({ officeId, quoteId, limit, order, page, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListCargosByQuoteIdInfinite - * @summary List all cargo items for a quote - * @permission Requires `canUseListCargosByQuoteId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByQuoteIdInfinite = ({ officeId, quoteId, limit, order, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListCargoLabels` - * @summary List all cargo labels for a quote - * @permission Requires `canUseListCargoLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargoLabels = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargoLabels(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId } )); - return QuoteCargoApi.listCargoLabels(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Query `useGetCargoSummary` - * @summary Get cargo summary grouped by transport unit type - * @permission Requires `canUseGetCargoSummary` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoSummary = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoSummary(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId } )); - return QuoteCargoApi.getCargoSummary(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Query `useGetCargoById` - * @summary Get a specific cargo item - * @permission Requires `canUseGetCargoById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { string } object.cargoId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoById = ({ officeId, quoteId, cargoId }: { officeId: string, quoteId: string, cargoId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoById(officeId, quoteId, cargoId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId } )); - return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCargo` - * @summary Update a cargo item - * @permission Requires `canUseUpdateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, data }) => { - checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId } )); - return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteCargo` - * @summary Delete a cargo item - * @permission Requires `canUseDeleteCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId }) => { - checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId } )); - return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateBulkCargos` - * @summary Create a new cargo item - * @permission Requires `canUseCreateBulkCargos` ability - * @param { number } mutation.numberOfCargos Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { - checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId } )); - return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicateCargo` - * @summary Duplicate a cargo item - * @permission Requires `canUseDuplicateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId }) => { - checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId } )); - return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts b/test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts deleted file mode 100644 index da1d43f..0000000 --- a/test/generated/base/quoteCargoPackage/quoteCargoPackage.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteCargoPackageAcl { -/** - * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. - * @description Create cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation - */ -export const canUseCreatePackage = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. - * @description Update cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation - */ -export const canUseUpdatePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation - */ -export const canUseDeletePackage = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation - */ -export const canUseDuplicatePackage = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. - * @description Move cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation - */ -export const canUseMovePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts b/test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts deleted file mode 100644 index f399bc6..0000000 --- a/test/generated/base/quoteCargoPackage/quoteCargoPackage.api.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoPackageApi { -export const createPackage = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, - ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - - ) -}; -export const updatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - - ) -}; -export const deletePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - - ) -}; -export const duplicatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - - ) -}; -export const movePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, - ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts b/test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts deleted file mode 100644 index 8556a3a..0000000 --- a/test/generated/base/quoteCargoPackage/quoteCargoPackage.queries.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteCargoPackageAcl } from "./quoteCargoPackage.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoPackageApi } from "./quoteCargoPackage.api"; - -export namespace QuoteCargoPackageQueries { -export const moduleName = QueryModule.QuoteCargoPackage; - - - -/** - * Mutation `useCreatePackage` - * @summary Create a new package for a cargo - * @permission Requires `canUseCreatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId } )); - return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdatePackage` - * @summary Update a package - * @permission Requires `canUseUpdatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId } )); - return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePackage` - * @summary Delete a package - * @permission Requires `canUseDeletePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { - checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId } )); - return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicatePackage` - * @summary Duplicate a package - * @permission Requires `canUseDuplicatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { - checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId } )); - return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMovePackage` - * @summary Move a package to a different cargo - * @permission Requires `canUseMovePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId } )); - return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/quoteConversion/quoteConversion.acl.ts b/test/generated/base/quoteConversion/quoteConversion.acl.ts deleted file mode 100644 index 8c0f3c4..0000000 --- a/test/generated/base/quoteConversion/quoteConversion.acl.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteConversionAcl { -/** - * Use for `useConvertQuoteToPosition` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useConvertQuoteToPosition` mutation - */ -export const canUseConvertQuoteToPosition = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/base/quoteConversion/quoteConversion.api.ts b/test/generated/base/quoteConversion/quoteConversion.api.ts deleted file mode 100644 index ecf19cc..0000000 --- a/test/generated/base/quoteConversion/quoteConversion.api.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteConversionModels } from "./quoteConversion.models"; - -export namespace QuoteConversionApi { -export const convertQuoteToPosition = (officeId: string, quoteId: string, data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/convert`, - ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/quoteConversion/quoteConversion.models.ts b/test/generated/base/quoteConversion/quoteConversion.models.ts deleted file mode 100644 index ccca298..0000000 --- a/test/generated/base/quoteConversion/quoteConversion.models.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { z } from "zod"; - -export namespace QuoteConversionModels { -/** - * ConvertQuoteToPositionRequestDtoSchema - * @type { object } - * @property { string } estimatedServiceDate - */ -export const ConvertQuoteToPositionRequestDtoSchema = z.object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }); -export type ConvertQuoteToPositionRequestDto = z.infer; - -} diff --git a/test/generated/base/quoteConversion/quoteConversion.queries.ts b/test/generated/base/quoteConversion/quoteConversion.queries.ts deleted file mode 100644 index bfba951..0000000 --- a/test/generated/base/quoteConversion/quoteConversion.queries.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteConversionAcl } from "./quoteConversion.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteConversionModels } from "./quoteConversion.models"; -import { QuoteConversionApi } from "./quoteConversion.api"; - -export namespace QuoteConversionQueries { -export const moduleName = QueryModule.QuoteConversion; - - - -/** - * Mutation `useConvertQuoteToPosition` - * @summary Convert quote to position - * @permission Requires `canUseConvertQuoteToPosition` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteConversionModels.ConvertQuoteToPositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Quote converted to position successfully - * @statusCodes [201, 400, 401, 404] - */ -export const useConvertQuoteToPosition = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId } )); - return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/quoteDocument/quoteDocument.acl.ts b/test/generated/base/quoteDocument/quoteDocument.acl.ts deleted file mode 100644 index 43dec1f..0000000 --- a/test/generated/base/quoteDocument/quoteDocument.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteDocumentAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGetPreview` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` mutation - */ -export const canUseGetPreview = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGenerateEml` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateEml` mutation - */ -export const canUseGenerateEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/base/quoteDocument/quoteDocument.api.ts b/test/generated/base/quoteDocument/quoteDocument.api.ts deleted file mode 100644 index 9c7c296..0000000 --- a/test/generated/base/quoteDocument/quoteDocument.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteDocumentModels } from "./quoteDocument.models"; - -export namespace QuoteDocumentApi { -export const get = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/document`, - - ) -}; -export const update = (officeId: string, quoteId: string, data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/document`, - ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), - - ) -}; -export const getPreview = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/${quoteId}/document/preview`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generate = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/document/generate`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - - ) -}; -export const generateEml = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/${quoteId}/document/eml`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/base/quoteDocument/quoteDocument.models.ts b/test/generated/base/quoteDocument/quoteDocument.models.ts deleted file mode 100644 index 73bb8da..0000000 --- a/test/generated/base/quoteDocument/quoteDocument.models.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteDocumentModels { -/** - * QuoteDocumentDataDtoSchema - * @type { object } - * @property { CommonModels.RouteTableBlockResponseDto } routeTable - * @property { CommonModels.CargoTableBlockDto } cargoTable - * @property { CommonModels.FinanceTableBlockDto } financeTable - */ -export const QuoteDocumentDataDtoSchema = z.object({ routeTable: CommonModels.RouteTableBlockResponseDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockDtoSchema.nullable() }).partial(); -export type QuoteDocumentDataDto = z.infer; - -/** - * QuoteDocumentConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl - * @property { string } headerImageUrl - * @property { string } termsAndConditionsImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ -export const QuoteDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), termsAndConditionsImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); -export type QuoteDocumentConfigDto = z.infer; - -/** - * CustomerDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - */ -export const CustomerDtoSchema = z.object({ name: z.string(), address: z.string() }); -export type CustomerDto = z.infer; - -/** - * ContactDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } phone - * @property { string } date - * @property { string } validFrom - * @property { string } validUntil - */ -export const ContactDtoSchema = z.object({ name: z.string(), email: z.string(), phone: z.string(), date: z.iso.datetime({ offset: true }), validFrom: z.iso.datetime({ offset: true }).nullish(), validUntil: z.iso.datetime({ offset: true }).nullish() }); -export type ContactDto = z.infer; - -/** - * QuoteDocumentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } quoteId - * @property { string } quoteNumber - * @property { CommonModels.TransportModeEnum } quoteTransportMode Mode of transport - * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote - * @property { string } transitDurationInDays Transit duration in days - * @property { CustomerDto } customer - * @property { ContactDto } contact - * @property { QuoteDocumentDataDto } data - * @property { boolean } suspendCargoTable - * @property { boolean } suspendFinanceTable - * @property { CommonModels.EditorContentResponseDto } bodyRemarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks - * @property { boolean } isIssued - * @property { number } version - * @property { QuoteDocumentConfigDto } config - * @property { string } issuedAt - */ -export const QuoteDocumentResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), quoteNumber: z.string(), quoteTransportMode: CommonModels.TransportModeEnumSchema, frequency: CommonModels.FrequencyEnumSchema.nullish(), transitDurationInDays: z.string().nullish(), customer: CustomerDtoSchema, contact: ContactDtoSchema, data: QuoteDocumentDataDtoSchema.nullish(), suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), isIssued: z.boolean(), version: z.number(), config: QuoteDocumentConfigDtoSchema.nullish(), issuedAt: z.iso.datetime({ offset: true }).nullish() }); -export type QuoteDocumentResponseDto = z.infer; - -/** - * QuoteDocumentDataUpdateDtoSchema - * @type { object } - * @property { CommonModels.RouteTableUpdateBlockDto } routeTable - * @property { CommonModels.CargoTableBlockUpdateDto } cargoTable - * @property { CommonModels.FinanceTableBlockUpdateDto } financeTable - */ -export const QuoteDocumentDataUpdateDtoSchema = z.object({ routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.nullable() }).partial(); -export type QuoteDocumentDataUpdateDto = z.infer; - -/** - * CustomerUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - */ -export const CustomerUpdateDtoSchema = z.object({ name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type CustomerUpdateDto = z.infer; - -/** - * ContactUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } phone - * @property { string } date - */ -export const ContactUpdateDtoSchema = z.object({ name: z.string().nullable(), email: z.email().nullable(), phone: z.string().nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type ContactUpdateDto = z.infer; - -/** - * UpdateQuoteDocumentRequestDtoSchema - * @type { object } - * @property { CustomerUpdateDto } customer - * @property { ContactUpdateDto } contact - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks - * @property { boolean } suspendCargoTable - * @property { boolean } suspendFinanceTable - * @property { QuoteDocumentDataUpdateDto } data - */ -export const UpdateQuoteDocumentRequestDtoSchema = z.object({ customer: CustomerUpdateDtoSchema.nullable(), contact: ContactUpdateDtoSchema.nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), suspendCargoTable: z.boolean().nullable(), suspendFinanceTable: z.boolean().nullable(), data: QuoteDocumentDataUpdateDtoSchema.nullable() }).partial(); -export type UpdateQuoteDocumentRequestDto = z.infer; - -/** - * GenerateQuoteDocumentPreviewRequestDtoSchema - * @type { object } - * @property { string } issuedAt - */ -export const GenerateQuoteDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type GenerateQuoteDocumentPreviewRequestDto = z.infer; - -/** - * GenerateQuoteDocumentRequestDtoSchema - * @type { object } - * @property { string } issuedAt - * @property { string } fileName - */ -export const GenerateQuoteDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }); -export type GenerateQuoteDocumentRequestDto = z.infer; - -} diff --git a/test/generated/base/quoteDocument/quoteDocument.queries.ts b/test/generated/base/quoteDocument/quoteDocument.queries.ts deleted file mode 100644 index c9b50a2..0000000 --- a/test/generated/base/quoteDocument/quoteDocument.queries.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteDocumentAcl } from "./quoteDocument.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteDocumentModels } from "./quoteDocument.models"; -import { QuoteDocumentApi } from "./quoteDocument.api"; - -export namespace QuoteDocumentQueries { -export const moduleName = QueryModule.QuoteDocument; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/document", officeId, quoteId] as const, -}; - -/** - * Query `useGet` - * @summary Get quote document - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteDocumentAcl.canUseGet({ officeId } )); - return QuoteDocumentApi.get(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update quote document - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.UpdateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId } )); - return QuoteDocumentApi.update(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGetPreview` - recommended when file should not be cached - * @summary Get quote document pdf preview - * @permission Requires `canUseGetPreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGetPreview = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId } )); - return QuoteDocumentApi.getPreview(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerate` - * @summary Get quote document pdf preview - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId } )); - return QuoteDocumentApi.generate(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateEml` - recommended when file should not be cached - * @summary Generate quote document and return EML file - * @permission Requires `canUseGenerateEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId } )); - return QuoteDocumentApi.generateEml(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts deleted file mode 100644 index 24ebb81..0000000 --- a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteProfitChangeTrackingAcl { -/** - * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. - * @description List quote profit change groups - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.quoteId quoteId from quoteId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query - */ -export const canUseFindProfitChangeGroups = ( - object?: { officeId: string, quoteId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; - -/** - * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. - * @description Get quote profit change group details - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.quoteId quoteId from quoteId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query - */ -export const canUseFindProfitChangeGroupDetail = ( - object?: { officeId: string, quoteId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; - -} diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts deleted file mode 100644 index 2991187..0000000 --- a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; - -export namespace QuoteProfitChangeTrackingApi { -export const findProfitChangeGroups = (officeId: string, quoteId: string, limit: number, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, - { - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findProfitChangeGroupDetail = (groupId: string, officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, - - ) -}; -} diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts deleted file mode 100644 index 169ba81..0000000 --- a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { dynamicColumns } from "@povio/ui"; -import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; -import { QuoteProfitChangeTrackingQueries } from "./quoteProfitChangeTracking.queries"; -import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; - -export namespace QuoteProfitChangeTrackingConfigs { -export const profitChangeGroupsConfig = { - meta: { - title: "Profit Change Groups", - }, - readAll: { - acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups, - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, - paginated: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroups, - infinite: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, - columns: dynamicColumns({ - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, - options: { - columns: { - id: true, - timestamp: true, - users: true, - profit: true, - changeCount: true, - }, - }, -}), - }, - read: { - acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema, - query: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, - }, -}; - -} diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts deleted file mode 100644 index 9067c50..0000000 --- a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteProfitChangeTrackingModels { -/** - * QuoteAccountProfitChangeGroupDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto[] } users - * @property { object } profit - * @property { number } profit.amount - * @property { string } profit.currencyCode - * @property { number } changeCount - */ -export const QuoteAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema), profit: z.object({ amount: z.number(), currencyCode: z.string() }), changeCount: z.number() }); -export type QuoteAccountProfitChangeGroupDto = z.infer; - -/** - * QuoteAccountProfitChangeEntryDtoSchema - * @type { object } - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto } user - * @property { number } changeNumber - * @property { number } oldProfit - * @property { number } newProfit - * @property { string } currencyCode - */ -export const QuoteAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }); -export type QuoteAccountProfitChangeEntryDto = z.infer; - -/** - * QuoteAccountProfitChangeGroupDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { string } currencyCode - * @property { QuoteAccountProfitChangeEntryDto[] } entries - */ -export const QuoteAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(QuoteAccountProfitChangeEntryDtoSchema) }); -export type QuoteAccountProfitChangeGroupDetailDto = z.infer; - -/** - * QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { QuoteAccountProfitChangeGroupDto[] } items - */ -export const QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(QuoteAccountProfitChangeGroupDtoSchema).nullable() }).partial().shape }); -export type QuoteProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; - -} diff --git a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts b/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts deleted file mode 100644 index 9388eba..0000000 --- a/test/generated/base/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { QuoteProfitChangeTrackingApi } from "./quoteProfitChangeTracking.api"; - -export namespace QuoteProfitChangeTrackingQueries { -export const moduleName = QueryModule.QuoteProfitChangeTracking; - -export const keys = { - all: [moduleName] as const, - findProfitChangeGroups: (officeId: string, quoteId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", officeId, quoteId, limit, page, cursor] as const, - findProfitChangeGroupsInfinite: (officeId: string, quoteId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", "infinite", officeId, quoteId, limit, cursor] as const, - findProfitChangeGroupDetail: (groupId: string, officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups/:groupId", groupId, officeId, quoteId] as const, -}; - -/** - * Query `useFindProfitChangeGroups` - * @summary List quote profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroups = ({ officeId, quoteId, limit, page, cursor }: { officeId: string, quoteId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), - queryFn: () => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindProfitChangeGroupsInfinite - * @summary List quote profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupsInfinite = ({ officeId, quoteId, limit, cursor }: { officeId: string, quoteId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindProfitChangeGroupDetail` - * @summary Get quote profit change group details - * @permission Requires `canUseFindProfitChangeGroupDetail` ability - * @param { string } object.groupId Path parameter - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupDetail = ({ groupId, officeId, quoteId }: { groupId: string, officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), - queryFn: () => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/quoteRoutes/quoteRoutes.acl.ts b/test/generated/base/quoteRoutes/quoteRoutes.acl.ts deleted file mode 100644 index 23e12ea..0000000 --- a/test/generated/base/quoteRoutes/quoteRoutes.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteRoutesAcl { -/** - * Use for `useListRoutes` query ability. For global ability, omit the object parameter. - * @description List quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query - */ -export const canUseListRoutes = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Create quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation - */ -export const canUseCreateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Update quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation - */ -export const canUseUpdateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Delete quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation - */ -export const canUseDeleteRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. - * @description Split quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation - */ -export const canUseSplitRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. - * @description Merge quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation - */ -export const canUseMergeRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. - * @description Copy quote route points - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation - */ -export const canUseCopyRoute = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/base/quoteRoutes/quoteRoutes.api.ts b/test/generated/base/quoteRoutes/quoteRoutes.api.ts deleted file mode 100644 index 8688bde..0000000 --- a/test/generated/base/quoteRoutes/quoteRoutes.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteRoutesApi { -export const listRoutes = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.RouteListResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes`, - - ) -}; -export const createRoutePoint = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, - ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - - ) -}; -export const updateRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - - ) -}; -export const deleteRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - - ) -}; -export const splitRoutes = (officeId: string, quoteId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/split`, - - ) -}; -export const mergeRoutes = (officeId: string, quoteId: string, data: CommonModels.MergeRoutesRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/merge`, - ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - - ) -}; -export const copyRoute = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, - ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/quoteRoutes/quoteRoutes.queries.ts b/test/generated/base/quoteRoutes/quoteRoutes.queries.ts deleted file mode 100644 index 04ed45f..0000000 --- a/test/generated/base/quoteRoutes/quoteRoutes.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteRoutesAcl } from "./quoteRoutes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteRoutesApi } from "./quoteRoutes.api"; - -export namespace QuoteRoutesQueries { -export const moduleName = QueryModule.QuoteRoutes; - -export const keys = { - all: [moduleName] as const, - listRoutes: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/routes", officeId, quoteId] as const, -}; - -/** - * Query `useListRoutes` - * @summary List routes with points for a quote - * @permission Requires `canUseListRoutes` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoutes = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoutes(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId } )); - return QuoteRoutesApi.listRoutes(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateRoutePoint` - * @summary Create a route point for a quote route - * @permission Requires `canUseCreateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, data }) => { - checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId } )); - return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateRoutePoint` - * @summary Update a route point for a quote route - * @permission Requires `canUseUpdateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { - checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId } )); - return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRoutePoint` - * @summary Delete a route point from a quote route - * @permission Requires `canUseDeleteRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, pointId }) => { - checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId } )); - return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useSplitRoutes` - * @summary Split quote routes by cargo (sea only) - * @permission Requires `canUseSplitRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId }) => { - checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId } )); - return QuoteRoutesApi.splitRoutes(officeId, quoteId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMergeRoutes` - * @summary Merge quote cargo routes into single route (sea only) - * @permission Requires `canUseMergeRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId } )); - return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopyRoute` - * @summary Copy route points from one route to another (sea only) - * @permission Requires `canUseCopyRoute` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, data }) => { - checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId } )); - return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/quotes/quotes.acl.ts b/test/generated/base/quotes/quotes.acl.ts deleted file mode 100644 index d7f98e9..0000000 --- a/test/generated/base/quotes/quotes.acl.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuotesAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ -export const canUseListAvailablePartnersFor = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useExportQuotes` mutation ability. For global ability, omit the object parameter. - * @description Export quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportQuotes` mutation - */ -export const canUseExportQuotes = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Get quote by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ -export const canUseCancel = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Duplicate quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ -export const canUseDuplicate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGetInvolvedParties` query ability. For global ability, omit the object parameter. - * @description Get involved parties for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvolvedParties` query - */ -export const canUseGetInvolvedParties = ( - object?: { officeId: string, } -) => [ - "ReadInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreateInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Create involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateInvolvedParty` mutation - */ -export const canUseCreateInvolvedParty = ( - object?: { officeId: string, } -) => [ - "CreateInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdateInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Update involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateInvolvedParty` mutation - */ -export const canUseUpdateInvolvedParty = ( - object?: { officeId: string, } -) => [ - "UpdateInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDeleteInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Delete involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvolvedParty` mutation - */ -export const canUseDeleteInvolvedParty = ( - object?: { officeId: string, } -) => [ - "DeleteInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/base/quotes/quotes.api.ts b/test/generated/base/quotes/quotes.api.ts deleted file mode 100644 index 53ffe08..0000000 --- a/test/generated/base/quotes/quotes.api.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuotesModels } from "./quotes.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuotesApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuotesPaginateResponseSchema }, - `/offices/${officeId}/quotes`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, ) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes`, - ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), - - ) -}; -export const listAvailablePartnersFor = (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/available-partners`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), - }, - } - ) -}; -export const exportQuotes = (officeId: string, data: QuotesModels.QuoteExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/exports`, - ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getById = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}`, - - ) -}; -export const update = (officeId: string, quoteId: string, data: QuotesModels.UpdateQuoteRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}`, - ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), - - ) -}; -export const cancel = (officeId: string, quoteId: string, ) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cancel`, - - ) -}; -export const duplicate = (officeId: string, quoteId: string, data: QuotesModels.DuplicateQuoteRequestDto, ) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/duplicate`, - ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), - - ) -}; -export const getInvolvedParties = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - - ) -}; -export const createInvolvedParty = (officeId: string, quoteId: string, data: CommonModels.CreateInvolvedPartyRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - - ) -}; -export const updateInvolvedParty = (officeId: string, quoteId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - - ) -}; -export const deleteInvolvedParty = (officeId: string, quoteId: string, partyId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - - ) -}; -} diff --git a/test/generated/base/quotes/quotes.configs.ts b/test/generated/base/quotes/quotes.configs.ts deleted file mode 100644 index e288ac4..0000000 --- a/test/generated/base/quotes/quotes.configs.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { QuotesModels } from "./quotes.models"; -import { QuotesQueries } from "./quotes.queries"; -import { QuotesAcl } from "./quotes.acl"; - -export namespace QuotesConfigs { -export const quotesConfig = { - meta: { - title: "Quotes", - }, - readAll: { - acl: QuotesAcl.canUsePaginate, - schema: QuotesModels.QuotePreviewResponseDTOSchema, - paginated: QuotesQueries.usePaginate, - infinite: QuotesQueries.usePaginateInfinite, - filters: { - schema: QuotesModels.QuoteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: QuotesModels.QuoteFilterDtoSchema, - options: { - inputs: { - statusDate: true, - transportMode: true, - status: true, - direction: true, - loadType: true, - serviceType: true, - carrierId: true, - consigneeId: true, - employee: true, - routing: true, - number: true, - createdAt: true, - vesselCarrier: true, - searchQuery: true, - customer: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: QuotesModels.QuotePreviewResponseDTOSchema, - options: { - columns: { - id: true, - transportMode: true, - statusDate: true, - createdAt: true, - number: true, - status: true, - direction: true, - loadType: true, - customer: true, - customerReference: true, - consignee: true, - consigneeReference: true, - carrier: true, - carrierReference: true, - employee: true, - origin: true, - destination: true, - portOfLoading: true, - dischargePort: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - equipment: true, - serviceType: true, - currency: true, - profit: true, - margin: true, - numberOfConvertedPositions: true, - departureDate: true, - arrivalDate: true, - routing: true, - }, - sortable: QuotesModels.QuotesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: QuotesAcl.canUseGetById, - schema: QuotesModels.QuoteCoreResponseDTOSchema, - query: QuotesQueries.useGetById, - }, - create: { - acl: QuotesAcl.canUseCreate, - schema: QuotesModels.CreateQuoteRequestDTOSchema, - mutation: QuotesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: QuotesModels.CreateQuoteRequestDTOSchema, - options: { - inputs: { - section: true, - direction: true, - transportMode: true, - loadType: true, - serviceType: true, - customerBusinessPartnerId: true, - }, - }, -}) - }, - update: { - acl: QuotesAcl.canUseUpdate, - schema: QuotesModels.UpdateQuoteRequestDTOSchema, - mutation: QuotesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: QuotesModels.UpdateQuoteRequestDTOSchema, - options: { - inputs: { - number: true, - statusDate: true, - cargoType: true, - loadType: true, - incoterms: true, - secondIncoterms: true, - serviceType: true, - buyRateReference: true, - frequency: true, - transitDurationInDays: true, - quoteType: true, - defaultCurrencyId: true, - salesRepId: true, - responsibleEmployeeId: true, - receivedByEmployeeId: true, - team: true, - volumetricWeightModifier: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/base/quotes/quotes.models.ts b/test/generated/base/quotes/quotes.models.ts deleted file mode 100644 index 47c00a5..0000000 --- a/test/generated/base/quotes/quotes.models.ts +++ /dev/null @@ -1,322 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuotesModels { -/** - * QuoteStatusEnumSchema - * @type { enum } - */ -export const QuoteStatusEnumSchema = z.enum(["Pending", "Cancelled", "Converted"]); -export type QuoteStatusEnum = z.infer; -export const QuoteStatusEnum = QuoteStatusEnumSchema.enum; - -/** - * QuoteCustomerResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { string } phone The phone number of the customer - * @property { string } email The email of the customer - */ -export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }); -export type QuoteCustomerResponseDto = z.infer; - -/** - * QuoteNamedReferenceResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the entity - * @property { string } name Name of the entity - * @property { string } matchCode - * @property { string } label Display label (name or match code depending on office settings) - */ -export const QuoteNamedReferenceResponseDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).partial(); -export type QuoteNamedReferenceResponseDto = z.infer; - -/** - * QuotePreviewResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the quote - * @property { CommonModels.TransportModeEnum } transportMode Transport mode - * @property { string } statusDate The date of the quote status - * @property { string } createdAt The date when the quote was created - * @property { string } number The quote number - * @property { QuoteStatusEnum } status Status of the quote - * @property { CommonModels.DirectionEnum } direction Direction of the quote - * @property { CommonModels.LoadTypeEnum } loadType Load type - * @property { QuoteCustomerResponseDto } customer The customer information - * @property { string } customerReference Customer reference number - * @property { QuoteNamedReferenceResponseDto } consignee Consignee information - * @property { string } consigneeReference Consignee reference number - * @property { QuoteNamedReferenceResponseDto } carrier The carrier - * @property { string } carrierReference Carrier reference number - * @property { QuoteNamedReferenceResponseDto } employee Responsible employee - * @property { QuoteNamedReferenceResponseDto } origin Origin location - * @property { QuoteNamedReferenceResponseDto } destination Destination location - * @property { QuoteNamedReferenceResponseDto } portOfLoading Port of loading - * @property { QuoteNamedReferenceResponseDto } dischargePort Discharge port - * @property { string } bookingNumber Booking reference number - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } vesselCarrier Carrier name from route point (sea positions only) - * @property { string } equipment Equipment summary (e.g., "2x20DC, 1x40HC") - * @property { CommonModels.ServiceTypeEnum } serviceType Service type - * @property { string } currency Currency code - * @property { number } profit Total profit - * @property { number } margin Profit margin percentage - * @property { number } numberOfConvertedPositions Number of positions converted from this quote - * @property { string } departureDate Departure date - * @property { string } arrivalDate Arrival date - * @property { CommonModels.SeaRoutingEnum } routing Sea routing type - */ -export const QuotePreviewResponseDTOSchema = z.object({ id: z.string(), transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }).nullable(), createdAt: z.iso.datetime({ offset: true }), number: z.string(), status: QuoteStatusEnumSchema, direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema.nullish(), customer: QuoteCustomerResponseDtoSchema, customerReference: z.string().nullish(), consignee: QuoteNamedReferenceResponseDtoSchema.nullish(), consigneeReference: z.string().nullish(), carrier: QuoteNamedReferenceResponseDtoSchema.nullish(), carrierReference: z.string().nullish(), employee: QuoteNamedReferenceResponseDtoSchema.nullish(), origin: QuoteNamedReferenceResponseDtoSchema, destination: QuoteNamedReferenceResponseDtoSchema, portOfLoading: QuoteNamedReferenceResponseDtoSchema.nullish(), dischargePort: QuoteNamedReferenceResponseDtoSchema.nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vesselCarrier: z.string().nullish(), equipment: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), currency: z.string().nullish(), profit: z.number().nullish(), margin: z.number().nullish(), numberOfConvertedPositions: z.number(), departureDate: z.iso.datetime({ offset: true }).nullish(), arrivalDate: z.iso.datetime({ offset: true }).nullish(), routing: CommonModels.SeaRoutingEnumSchema.nullish() }); -export type QuotePreviewResponseDTO = z.infer; - -/** - * QuoteFilterDtoSchema - * @type { object } - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.TransportModeEnum } transportMode - * @property { QuoteStatusEnum[] } status - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } carrierId Filter quotes by carrier IDs - * @property { string[] } consigneeId Filter quotes by consignee IDs - * @property { string[] } employee Filter quotes by employee IDs - * @property { CommonModels.SeaRoutingEnum } routing - * @property { string } number Filter quotes by quote number - * @property { CommonModels.DateRangeDto } createdAt - * @property { string } vesselCarrier Filter quotes by carrier name from route point - * @property { string } searchQuery - * @property { string[] } customer - */ -export const QuoteFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema.nullable(), transportMode: CommonModels.TransportModeEnumSchema.nullable(), status: z.array(QuoteStatusEnumSchema).nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), carrierId: z.array(z.string()).nullable(), consigneeId: z.array(z.string()).nullable(), employee: z.array(z.string()).nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable(), number: z.string().nullable(), createdAt: CommonModels.DateRangeDtoSchema.nullable(), vesselCarrier: z.string().nullable(), searchQuery: z.string().nullable(), customer: z.array(z.string()).nullable() }).partial(); -export type QuoteFilterDto = z.infer; - -/** - * QuoteExportFilterDtoSchema - * @type { object } - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.TransportModeEnum } transportMode - * @property { QuoteStatusEnum[] } status - * @property { CommonModels.DirectionEnum } direction - * @property { string } searchQuery - * @property { string[] } customer - */ -export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema.nullable(), transportMode: CommonModels.TransportModeEnumSchema.nullable(), status: z.array(QuoteStatusEnumSchema).nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), searchQuery: z.string().nullable(), customer: z.array(z.string()).nullable() }).partial(); -export type QuoteExportFilterDto = z.infer; - -/** - * QuoteExportColumnSchema - * @type { enum } - */ -export const QuoteExportColumnSchema = z.enum(["id", "transportMode", "statusDate", "createdAt", "number", "status", "direction", "loadType", "serviceType", "customerId", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeId", "consigneeName", "consigneeReference", "carrierId", "carrierName", "carrierReference", "responsibleEmployeeName", "originLocationId", "originLocationName", "destinationLocationId", "destinationLocationName", "portOfLoadingId", "portOfLoadingName", "dischargePortId", "dischargePortName", "bookingNumber", "vessel", "voyage", "equipment", "departureDate", "arrivalDate", "routing", "currency", "profit", "margin"]); -export type QuoteExportColumn = z.infer; -export const QuoteExportColumn = QuoteExportColumnSchema.enum; - -/** - * QuoteExportRequestDtoSchema - * @type { object } - * @property { QuoteExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { QuoteExportFilterDto } filter - */ -export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: QuoteExportFilterDtoSchema.nullable() }).partial(); -export type QuoteExportRequestDto = z.infer; - -/** - * CreateQuoteRequestDTOSchema - * @type { object } - * @property { CommonModels.SectionEnum } section The section of the quote - * @property { CommonModels.DirectionEnum } direction The direction of the quote - * @property { CommonModels.TransportModeEnum } transportMode The mode of transport for the quote - * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote - * @property { CommonModels.ServiceTypeEnum } serviceType The service type for the quote - * @property { string } customerBusinessPartnerId The ID of the business partner that is the customer - */ -export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, customerBusinessPartnerId: z.string() }); -export type CreateQuoteRequestDTO = z.infer; - -/** - * QuoteCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type QuoteCustomerDto = z.infer; - -/** - * QuoteEmployeeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the employee - * @property { string } name Name of the employee - */ -export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type QuoteEmployeeResponseDTO = z.infer; - -/** - * CargoTypeEnumSchema - * @type { enum } - */ -export const CargoTypeEnumSchema = z.enum(["Trailer", "Container", "BreakBulk", "Roro", "Project"]); -export type CargoTypeEnum = z.infer; -export const CargoTypeEnum = CargoTypeEnumSchema.enum; - -/** - * QuoteTypeEnumSchema - * @type { enum } - */ -export const QuoteTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); -export type QuoteTypeEnum = z.infer; -export const QuoteTypeEnum = QuoteTypeEnumSchema.enum; - -/** - * QuoteConvertedPositionDtoSchema - * @type { object } - * @property { string } positionId - * @property { string } positionNumber - */ -export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }); -export type QuoteConvertedPositionDto = z.infer; - -/** - * QuoteCoreResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the quote - * @property { string } rootFolderId Root folder identifier bound to this quote - * @property { QuoteCustomerDto } customer - * @property { QuoteStatusEnum } status Current status of the quote - * @property { string } responsibleEmployeeId Unique identifier of the responsible employee - * @property { string } receivedByEmployeeId Unique identifier of the employee receiving the quote - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } salesRepId Unique identifier of the sales rep - * @property { QuoteEmployeeResponseDTO } responsibleEmployee The responsible employee - * @property { QuoteEmployeeResponseDTO } receivedByEmployee The employee who received the quote - * @property { string } owningOfficeId ID of the office owning the quote - * @property { string } name Name of the quote - * @property { string } number Quote number - * @property { CommonModels.SectionEnum } section Section of the quote - * @property { CommonModels.DirectionEnum } direction Direction of the quote - * @property { CommonModels.TransportModeEnum } transportMode Mode of transport - * @property { string } statusDate Date of the quote status - * @property { CargoTypeEnum } cargoType Type of cargo - * @property { CommonModels.IncotermsEnum } incoterms Incoterms for the quote - * @property { CommonModels.IncotermsEnum } secondIncoterms Second incoterms for the quote - * @property { string } buyRateReference Reference for buy rate - * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote - * @property { string } transitDurationInDays Transit duration in days - * @property { QuoteTypeEnum } quoteType Type of quote - * @property { string } defaultCurrencyId Default currency - * @property { QuoteEmployeeResponseDTO } salesRep The sales rep for the quote - * @property { string } team Team - * @property { string } createdAt - * @property { string } updatedAt - * @property { QuoteConvertedPositionDto[] } convertedPositions Positions converted from this quote. Default: `` - * @property { CommonModels.LoadTypeEnum } loadType Load type of quote - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const QuoteCoreResponseDTOSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), customer: QuoteCustomerDtoSchema.nullish(), status: QuoteStatusEnumSchema, responsibleEmployeeId: z.string().nullish(), receivedByEmployeeId: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesRepId: z.string().nullish(), responsibleEmployee: QuoteEmployeeResponseDTOSchema.nullish(), receivedByEmployee: QuoteEmployeeResponseDTOSchema.nullish(), owningOfficeId: z.string(), name: z.string(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), cargoType: CargoTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), transitDurationInDays: z.string().nullish(), quoteType: QuoteTypeEnumSchema.nullish(), defaultCurrencyId: z.string().nullish(), salesRep: QuoteEmployeeResponseDTOSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), convertedPositions: z.array(QuoteConvertedPositionDtoSchema).default([]), loadType: CommonModels.LoadTypeEnumSchema.nullish(), volumetricWeightModifier: z.number().nullish() }); -export type QuoteCoreResponseDTO = z.infer; - -/** - * UpdateQuoteRequestDTOSchema - * @type { object } - * @property { string } number The quote number - * @property { string } statusDate The date of the quote status - * @property { CargoTypeEnum } cargoType The type of cargo for the quote - * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote - * @property { CommonModels.IncotermsEnum } incoterms The incoterms for the quote - * @property { CommonModels.IncotermsEnum } secondIncoterms The second incoterms for the quote - * @property { CommonModels.ServiceTypeEnum } serviceType The type of service for the quote - * @property { string } buyRateReference The reference for the buy rate - * @property { CommonModels.FrequencyEnum } frequency The frequency of the quote - * @property { string } transitDurationInDays The transit duration in days - * @property { QuoteTypeEnum } quoteType The type of quote - * @property { string } defaultCurrencyId The default currency for the quote - * @property { string } salesRepId The sales representative for the quote - * @property { string } responsibleEmployeeId The responsible employee for the quote - * @property { string } receivedByEmployeeId The employee who receieved the quote - * @property { string } team The team responsible for the quote - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().nullable(), statusDate: z.iso.datetime({ offset: true }).nullable(), cargoType: CargoTypeEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), incoterms: CommonModels.IncotermsEnumSchema.nullable(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), buyRateReference: z.string().nullable(), frequency: CommonModels.FrequencyEnumSchema.nullable(), transitDurationInDays: z.string().nullable(), quoteType: QuoteTypeEnumSchema.nullable(), defaultCurrencyId: z.string().nullable(), salesRepId: z.string().nullable(), responsibleEmployeeId: z.string().nullable(), receivedByEmployeeId: z.string().nullable(), team: z.string().nullable(), volumetricWeightModifier: z.number().nullable() }).partial(); -export type UpdateQuoteRequestDTO = z.infer; - -/** - * QuoteSectionEnumSchema - * @type { enum } - */ -export const QuoteSectionEnumSchema = z.enum(["Customer", "Overview", "Cargo", "Finances", "Documents"]); -export type QuoteSectionEnum = z.infer; -export const QuoteSectionEnum = QuoteSectionEnumSchema.enum; - -/** - * DuplicateQuoteRequestDtoSchema - * @type { object } - * @property { QuoteSectionEnum[] } sections The sections to duplicate. Min Items: `1` - */ -export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).min(1) }); -export type DuplicateQuoteRequestDto = z.infer; - -/** - * QuoteListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalProfit - * @property { number } profitPerQuote - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const QuoteListResponseDtoSchema = z.object({ items: z.array(z.string()), totalProfit: z.number(), profitPerQuote: z.number(), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type QuoteListResponseDto = z.infer; - -/** - * QuotesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const QuotesPaginateOrderParamEnumSchema = z.enum(["number", "statusDate", "transportMode", "status", "direction", "loadType", "serviceType", "createdAt", "employee", "profit"]); -export type QuotesPaginateOrderParamEnum = z.infer; -export const QuotesPaginateOrderParamEnum = QuotesPaginateOrderParamEnumSchema.enum; - -/** - * QuotesPaginateResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerQuote - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { QuotePreviewResponseDTO[] } items - */ -export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).nullable() }).partial().shape }); -export type QuotesPaginateResponse = z.infer; - -/** - * QuotesListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ -export const QuotesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).nullable() }).partial().shape }); -export type QuotesListAvailablePartnersForResponse = z.infer; - -/** - * GetInvolvedPartiesResponseSchema - * @type { array } - */ -export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema); -export type GetInvolvedPartiesResponse = z.infer; - -} diff --git a/test/generated/base/quotes/quotes.queries.ts b/test/generated/base/quotes/quotes.queries.ts deleted file mode 100644 index 42b6e3c..0000000 --- a/test/generated/base/quotes/quotes.queries.ts +++ /dev/null @@ -1,376 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuotesAcl } from "./quotes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuotesModels } from "./quotes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { QuotesApi } from "./quotes.api"; - -export namespace QuotesQueries { -export const moduleName = QueryModule.Quotes; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", "infinite", officeId, limit, order, filter, cursor] as const, - listAvailablePartnersFor: (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/quotes/:quoteId/available-partners", officeId, quoteId, search, useCase] as const, - getById: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId", officeId, quoteId] as const, - getInvolvedParties: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/involved-parties", officeId, quoteId] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Quotes - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` - * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(QuotesAcl.canUsePaginate({ officeId } )); - return QuotesApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Quotes - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` - * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuotesAcl.canUsePaginate({ officeId } )); - return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Quote - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { QuotesModels.CreateQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(QuotesAcl.canUseCreate({ officeId } )); - return QuotesApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for a quote - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListAvailablePartnersFor = ({ officeId, quoteId, search, useCase }: { officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), - queryFn: () => { - checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId } )); - return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase) }, - ...options, - }); -}; - -/** - * Mutation `useExportQuotes` - recommended when file should not be cached - * @summary Export quotes to Excel - * @permission Requires `canUseExportQuotes` ability - * @param { string } mutation.officeId Path parameter - * @param { QuotesModels.QuoteExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportQuotes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(QuotesAcl.canUseExportQuotes({ officeId } )); - return QuotesApi.exportQuotes(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetById` - * @summary Get quote by id - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, quoteId), - queryFn: () => { - checkAcl(QuotesAcl.canUseGetById({ officeId } )); - return QuotesApi.getById(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuotesModels.UpdateQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseUpdate({ officeId } )); - return QuotesApi.update(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCancel` - * @summary Cancel quote - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId }) => { - checkAcl(QuotesAcl.canUseCancel({ officeId } )); - return QuotesApi.cancel(officeId, quoteId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicate` - * @summary Duplicate quote - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuotesModels.DuplicateQuoteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseDuplicate({ officeId } )); - return QuotesApi.duplicate(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetInvolvedParties` - * @summary Get involved parties for quote - * @permission Requires `canUseGetInvolvedParties` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetInvolvedParties = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvolvedParties(officeId, quoteId), - queryFn: () => { - checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId } )); - return QuotesApi.getInvolvedParties(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateInvolvedParty` - * @summary Create involved party for quote - * @permission Requires `canUseCreateInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId } )); - return QuotesApi.createInvolvedParty(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateInvolvedParty` - * @summary Update involved party for quote - * @permission Requires `canUseUpdateInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, partyId, data }) => { - checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId } )); - return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteInvolvedParty` - * @summary Delete involved party for quote - * @permission Requires `canUseDeleteInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, partyId }) => { - checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId } )); - return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/remarkTemplates/remarkTemplates.acl.ts b/test/generated/base/remarkTemplates/remarkTemplates.acl.ts deleted file mode 100644 index b194325..0000000 --- a/test/generated/base/remarkTemplates/remarkTemplates.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace RemarkTemplatesAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List remark template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List remark templates - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Create", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get remark template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update remark template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Update", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Archive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Unarchive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -} diff --git a/test/generated/base/remarkTemplates/remarkTemplates.api.ts b/test/generated/base/remarkTemplates/remarkTemplates.api.ts deleted file mode 100644 index f4ba6d9..0000000 --- a/test/generated/base/remarkTemplates/remarkTemplates.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; - -export namespace RemarkTemplatesApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/remark-templates/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, - `/offices/${officeId}/remark-templates`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, ) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates`, - ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}`, - ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/remarkTemplates/remarkTemplates.configs.ts b/test/generated/base/remarkTemplates/remarkTemplates.configs.ts deleted file mode 100644 index 616b1f4..0000000 --- a/test/generated/base/remarkTemplates/remarkTemplates.configs.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; -import { RemarkTemplatesQueries } from "./remarkTemplates.queries"; -import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; - -export namespace RemarkTemplatesConfigs { -export const remarkTemplatesConfig = { - meta: { - title: "Remark Templates", - }, - readAll: { - acl: RemarkTemplatesAcl.canUseList, - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - paginated: RemarkTemplatesQueries.useList, - infinite: RemarkTemplatesQueries.useListInfinite, - filters: { - schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - onlyUsedFor: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - content: true, - onlyUsedFor: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: RemarkTemplatesAcl.canUseFindById, - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - query: RemarkTemplatesQueries.useFindById, - }, - create: { - acl: RemarkTemplatesAcl.canUseCreate, - schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, - mutation: RemarkTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - content: true, - onlyUsedFor: true, - }, - }, -}) - }, - update: { - acl: RemarkTemplatesAcl.canUseUpdate, - schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, - mutation: RemarkTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - content: true, - onlyUsedFor: true, - archived: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: RemarkTemplatesAcl.canUsePaginateLabels, - schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, - paginated: RemarkTemplatesQueries.usePaginateLabels, - infinite: RemarkTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - content: true, - }, - sortable: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/remarkTemplates/remarkTemplates.models.ts b/test/generated/base/remarkTemplates/remarkTemplates.models.ts deleted file mode 100644 index 265dd7f..0000000 --- a/test/generated/base/remarkTemplates/remarkTemplates.models.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace RemarkTemplatesModels { -/** - * RemarkTemplateLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { CommonModels.EditorContentResponseDto } content Remark template content - */ -export const RemarkTemplateLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), content: CommonModels.EditorContentResponseDtoSchema }); -export type RemarkTemplateLabelResponseDTO = z.infer; - -/** - * RemarkTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const RemarkTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type RemarkTemplateEmployeeDTO = z.infer; - -/** - * OnlyUsedForEnumSchema - * @type { enum } - */ -export const OnlyUsedForEnumSchema = z.enum(["transport-order", "export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "invoice", "quote-document", "shipping-instructions", "position-office-notes", "invoice-body-remarks", "business-partner-office-notes"]); -export type OnlyUsedForEnum = z.infer; -export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; - -/** - * RemarkTemplateResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name Template name - * @property { CommonModels.EditorContentResponseDto } content Template content - * @property { string[] } onlyUsedFor Restrict template usage to specific document types - * @property { boolean } archived - * @property { string } createdById - * @property { RemarkTemplateEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { RemarkTemplateEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const RemarkTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), content: CommonModels.EditorContentResponseDtoSchema, onlyUsedFor: z.array(OnlyUsedForEnumSchema).nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type RemarkTemplateResponseDTO = z.infer; - -/** - * CreateRemarkTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { CommonModels.EditorContentUpdateDto } content Template content - * @property { OnlyUsedForEnum[] } onlyUsedFor Restrict template usage to specific document types - */ -export const CreateRemarkTemplateRequestDTOSchema = z.object({ name: z.string(), content: CommonModels.EditorContentUpdateDtoSchema, onlyUsedFor: z.array(OnlyUsedForEnumSchema).nullish() }); -export type CreateRemarkTemplateRequestDTO = z.infer; - -/** - * UpdateRemarkTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { CommonModels.EditorContentUpdateDto } content Template content - * @property { string[] } onlyUsedFor Restrict template usage to specific document types - * @property { boolean } archived Archive status - */ -export const UpdateRemarkTemplateRequestDTOSchema = z.object({ name: z.string().nullable(), content: CommonModels.EditorContentUpdateDtoSchema.nullable(), onlyUsedFor: z.array(OnlyUsedForEnumSchema).nullable(), archived: z.boolean().nullable() }).partial(); -export type UpdateRemarkTemplateRequestDTO = z.infer; - -/** - * RemarkTemplateFilterDtoSchema - * @type { object } - * @property { boolean } archived - * @property { string } search - * @property { string } onlyUsedFor Filter by document type - */ -export const RemarkTemplateFilterDtoSchema = z.object({ archived: z.boolean().nullable(), search: z.string().nullable(), onlyUsedFor: OnlyUsedForEnumSchema.nullable() }).partial(); -export type RemarkTemplateFilterDto = z.infer; - -/** - * RemarkTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const RemarkTemplateLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type RemarkTemplateLabelFilterDto = z.infer; - -/** - * RemarkTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const RemarkTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type RemarkTemplatesPaginateLabelsOrderParamEnum = z.infer; -export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * RemarkTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { RemarkTemplateLabelResponseDTO[] } items - */ -export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).nullable() }).partial().shape }); -export type RemarkTemplatesPaginateLabelsResponse = z.infer; - -/** - * RemarkTemplatesListOrderParamEnumSchema - * @type { enum } - */ -export const RemarkTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type RemarkTemplatesListOrderParamEnum = z.infer; -export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEnumSchema.enum; - -/** - * RemarkTemplatesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { RemarkTemplateResponseDTO[] } items - */ -export const RemarkTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).nullable() }).partial().shape }); -export type RemarkTemplatesListResponse = z.infer; - -} diff --git a/test/generated/base/remarkTemplates/remarkTemplates.queries.ts b/test/generated/base/remarkTemplates/remarkTemplates.queries.ts deleted file mode 100644 index aa1b35b..0000000 --- a/test/generated/base/remarkTemplates/remarkTemplates.queries.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; -import { RemarkTemplatesApi } from "./remarkTemplates.api"; - -export namespace RemarkTemplatesQueries { -export const moduleName = QueryModule.RemarkTemplates; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/remark-templates/:id", id, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate remark template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate remark template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List remark templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); - return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List remark templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); - return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new remark template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId } )); - return RemarkTemplatesApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get remark template by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId } )); - return RemarkTemplatesApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update remark template by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId } )); - return RemarkTemplatesApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive remark template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId } )); - return RemarkTemplatesApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive remark template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId } )); - return RemarkTemplatesApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/roadQuotes/roadQuotes.acl.ts b/test/generated/base/roadQuotes/roadQuotes.acl.ts deleted file mode 100644 index edf7693..0000000 --- a/test/generated/base/roadQuotes/roadQuotes.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace RoadQuotesAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get road quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update road quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/base/roadQuotes/roadQuotes.api.ts b/test/generated/base/roadQuotes/roadQuotes.api.ts deleted file mode 100644 index 38a1126..0000000 --- a/test/generated/base/roadQuotes/roadQuotes.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { RoadQuotesModels } from "./roadQuotes.models"; - -export namespace RoadQuotesApi { -export const get = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/road-quote`, - - ) -}; -export const update = (officeId: string, quoteId: string, data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/road-quote`, - ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/roadQuotes/roadQuotes.models.ts b/test/generated/base/roadQuotes/roadQuotes.models.ts deleted file mode 100644 index 9008738..0000000 --- a/test/generated/base/roadQuotes/roadQuotes.models.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { z } from "zod"; - -export namespace RoadQuotesModels { -/** - * RoadQuoteResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the road quote - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - */ -export const RoadQuoteResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string(), sellServiceContract: z.string() }); -export type RoadQuoteResponseDTO = z.infer; - -/** - * UpdateRoadQuoteRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - */ -export const UpdateRoadQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), sellServiceContract: z.string().nullable() }).partial(); -export type UpdateRoadQuoteRequestDTO = z.infer; - -} diff --git a/test/generated/base/roadQuotes/roadQuotes.queries.ts b/test/generated/base/roadQuotes/roadQuotes.queries.ts deleted file mode 100644 index b7d125e..0000000 --- a/test/generated/base/roadQuotes/roadQuotes.queries.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { RoadQuotesAcl } from "./roadQuotes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { RoadQuotesModels } from "./roadQuotes.models"; -import { RoadQuotesApi } from "./roadQuotes.api"; - -export namespace RoadQuotesQueries { -export const moduleName = QueryModule.RoadQuotes; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/road-quote", officeId, quoteId] as const, -}; - -/** - * Query `useGet` - * @summary Get road quote by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(RoadQuotesAcl.canUseGet({ officeId } )); - return RoadQuotesApi.get(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update road quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { RoadQuotesModels.UpdateRoadQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(RoadQuotesAcl.canUseUpdate({ officeId } )); - return RoadQuotesApi.update(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.get(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/seaPositions/seaPositions.acl.ts b/test/generated/base/seaPositions/seaPositions.acl.ts deleted file mode 100644 index 1040161..0000000 --- a/test/generated/base/seaPositions/seaPositions.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace SeaPositionsAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get sea position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update sea position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/base/seaPositions/seaPositions.api.ts b/test/generated/base/seaPositions/seaPositions.api.ts deleted file mode 100644 index 022e8b7..0000000 --- a/test/generated/base/seaPositions/seaPositions.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { SeaPositionsModels } from "./seaPositions.models"; - -export namespace SeaPositionsApi { -export const get = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/sea-position`, - - ) -}; -export const update = (officeId: string, positionId: string, data: SeaPositionsModels.UpdateSeaPositionRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/sea-position`, - ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/seaPositions/seaPositions.models.ts b/test/generated/base/seaPositions/seaPositions.models.ts deleted file mode 100644 index 90db05a..0000000 --- a/test/generated/base/seaPositions/seaPositions.models.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace SeaPositionsModels { -/** - * SeaPositionResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } bookingMatchingCode - * @property { string } houseBillOfLadingNumber - * @property { string } masterBillOfLadingNumber - * @property { boolean } hblRequired - * @property { boolean } mblRequired - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { string } buyServiceContract - * @property { string } sellServiceContract - * @property { string } quoteReference - * @property { string } createdAt - * @property { string } updatedAt - * @property { CommonModels.SeaRoutingEnum } routing - * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route - */ -export const SeaPositionResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterBillOfLadingNumber: z.string().nullish(), hblRequired: z.boolean(), mblRequired: z.boolean(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), buyServiceContract: z.string().nullish(), sellServiceContract: z.string().nullish(), quoteReference: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), routing: CommonModels.SeaRoutingEnumSchema.nullish(), defaultBookingNumber: z.string().nullish() }); -export type SeaPositionResponseDTO = z.infer; - -/** - * UpdateSeaPositionRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode - * @property { string } houseBillOfLadingNumber - * @property { boolean } mblRequired - * @property { boolean } hblRequired - * @property { string } masterBillOfLadingNumber - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { string } buyServiceContract - * @property { string } quoteReference - * @property { string } sellServiceContract - * @property { CommonModels.SeaRoutingEnum } routing - */ -export const UpdateSeaPositionRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), houseBillOfLadingNumber: z.string().nullable(), mblRequired: z.boolean().nullable(), hblRequired: z.boolean().nullable(), masterBillOfLadingNumber: z.string().nullable(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullable(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullable(), customsDate: z.iso.datetime({ offset: true }).nullable(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), quoteReference: z.string().nullable(), sellServiceContract: z.string().nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable() }).partial(); -export type UpdateSeaPositionRequestDTO = z.infer; - -} diff --git a/test/generated/base/seaPositions/seaPositions.queries.ts b/test/generated/base/seaPositions/seaPositions.queries.ts deleted file mode 100644 index 3652d69..0000000 --- a/test/generated/base/seaPositions/seaPositions.queries.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { SeaPositionsAcl } from "./seaPositions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { SeaPositionsModels } from "./seaPositions.models"; -import { SeaPositionsApi } from "./seaPositions.api"; - -export namespace SeaPositionsQueries { -export const moduleName = QueryModule.SeaPositions; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/sea-position", officeId, positionId] as const, -}; - -/** - * Query `useGet` - * @summary Get sea position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(SeaPositionsAcl.canUseGet({ officeId } )); - return SeaPositionsApi.get(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update sea position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { SeaPositionsModels.UpdateSeaPositionRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(SeaPositionsAcl.canUseUpdate({ officeId } )); - return SeaPositionsApi.update(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/seaQuotes/seaQuotes.acl.ts b/test/generated/base/seaQuotes/seaQuotes.acl.ts deleted file mode 100644 index ca36ff7..0000000 --- a/test/generated/base/seaQuotes/seaQuotes.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace SeaQuotesAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get sea quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update sea quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/base/seaQuotes/seaQuotes.api.ts b/test/generated/base/seaQuotes/seaQuotes.api.ts deleted file mode 100644 index 6b3d574..0000000 --- a/test/generated/base/seaQuotes/seaQuotes.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { SeaQuotesModels } from "./seaQuotes.models"; - -export namespace SeaQuotesApi { -export const get = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - - ) -}; -export const update = (officeId: string, quoteId: string, data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/base/seaQuotes/seaQuotes.models.ts b/test/generated/base/seaQuotes/seaQuotes.models.ts deleted file mode 100644 index 2617ee7..0000000 --- a/test/generated/base/seaQuotes/seaQuotes.models.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace SeaQuotesModels { -/** - * SeaQuoteResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the sea quote - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - * @property { CommonModels.SeaRoutingEnum } routing - * @property { boolean } splitRoute Indicates if the route is split - */ -export const SeaQuoteResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string(), sellServiceContract: z.string(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), splitRoute: z.boolean().nullish() }); -export type SeaQuoteResponseDTO = z.infer; - -/** - * UpdateSeaQuoteRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - * @property { CommonModels.SeaRoutingEnum } routing - */ -export const UpdateSeaQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), sellServiceContract: z.string().nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable() }).partial(); -export type UpdateSeaQuoteRequestDTO = z.infer; - -} diff --git a/test/generated/base/seaQuotes/seaQuotes.queries.ts b/test/generated/base/seaQuotes/seaQuotes.queries.ts deleted file mode 100644 index 0efd079..0000000 --- a/test/generated/base/seaQuotes/seaQuotes.queries.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { SeaQuotesAcl } from "./seaQuotes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { SeaQuotesModels } from "./seaQuotes.models"; -import { SeaQuotesApi } from "./seaQuotes.api"; - -export namespace SeaQuotesQueries { -export const moduleName = QueryModule.SeaQuotes; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/sea-quote", officeId, quoteId] as const, -}; - -/** - * Query `useGet` - * @summary Get sea quote by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(SeaQuotesAcl.canUseGet({ officeId } )); - return SeaQuotesApi.get(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update sea quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { SeaQuotesModels.UpdateSeaQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(SeaQuotesAcl.canUseUpdate({ officeId } )); - return SeaQuotesApi.update(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.get(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/shippingInstructions/shippingInstructions.acl.ts b/test/generated/base/shippingInstructions/shippingInstructions.acl.ts deleted file mode 100644 index 2eae90a..0000000 --- a/test/generated/base/shippingInstructions/shippingInstructions.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ShippingInstructionsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useDeleteOfficesPositionsShippingInstructionsById` mutation ability. For global ability, omit the object parameter. - * @description Delete shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsShippingInstructionsById` mutation - */ -export const canUseDeleteOfficesPositionsShippingInstructionsById = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `usePreview` query or `usePreviewMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreview` query or `usePreviewMutation` mutation - */ -export const canUsePreview = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/base/shippingInstructions/shippingInstructions.api.ts b/test/generated/base/shippingInstructions/shippingInstructions.api.ts deleted file mode 100644 index e435f26..0000000 --- a/test/generated/base/shippingInstructions/shippingInstructions.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ShippingInstructionsModels } from "./shippingInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ShippingInstructionsApi { -export const create = (officeId: string, positionId: string, ) => { - return AppRestClient.post( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions`, - - ) -}; -export const get = (officeId: string, positionId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - - ) -}; -export const update = (officeId: string, positionId: string, id: string, data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, ) => { - return AppRestClient.patch( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), - - ) -}; -export const deleteOfficesPositionsShippingInstructionsById = (officeId: string, positionId: string, id: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - - ) -}; -export const preview = (officeId: string, positionId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generate = (officeId: string, positionId: string, id: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/shippingInstructions/shippingInstructions.models.ts b/test/generated/base/shippingInstructions/shippingInstructions.models.ts deleted file mode 100644 index b15692a..0000000 --- a/test/generated/base/shippingInstructions/shippingInstructions.models.ts +++ /dev/null @@ -1,510 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ShippingInstructionsModels { -/** - * EnsDeclarationEnumSchema - * @type { enum } - * @description ENS declaration - */ -export const EnsDeclarationEnumSchema = z.enum(["Carrier", "Self"]); -export type EnsDeclarationEnum = z.infer; -export const EnsDeclarationEnum = EnsDeclarationEnumSchema.enum; - -/** - * IssuedHouseBillsEnumSchema - * @type { enum } - * @description Issued house bills - */ -export const IssuedHouseBillsEnumSchema = z.enum(["None", "One", "Multiple"]); -export type IssuedHouseBillsEnum = z.infer; -export const IssuedHouseBillsEnum = IssuedHouseBillsEnumSchema.enum; - -/** - * WoodDeclarationEnumSchema - * @type { enum } - * @description Wood declaration - */ -export const WoodDeclarationEnumSchema = z.enum(["NoWood", "TreatedAndCertified", "NotTreatedAndNotCertified", "Processed"]); -export type WoodDeclarationEnum = z.infer; -export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; - -/** - * ShippingInstructionsPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } addressLine1 - * @property { string } addressLine2 - * @property { string } city - * @property { string } postalCode - * @property { string } state - * @property { string } countryCode - * @property { string } contactName - * @property { string } contactPhone - * @property { string } contactEmail - */ -export const ShippingInstructionsPartnerResponseDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), addressLine1: z.string().nullable(), addressLine2: z.string().nullable(), city: z.string().nullable(), postalCode: z.string().nullable(), state: z.string().nullable(), countryCode: z.string().nullable(), contactName: z.string().nullable(), contactPhone: z.string().nullable(), contactEmail: z.string().nullable() }).partial(); -export type ShippingInstructionsPartnerResponseDto = z.infer; - -/** - * ShippingInstructionsGeneralDetailsDtoSchema - * @type { object } - * @property { ShippingInstructionsPartnerResponseDto } shipper - * @property { ShippingInstructionsPartnerResponseDto } consignee - * @property { ShippingInstructionsPartnerResponseDto } freightForwarder - * @property { ShippingInstructionsPartnerResponseDto } notifyParty - * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty1 - * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty2 - * @property { ShippingInstructionsPartnerResponseDto } contractParty - * @property { ShippingInstructionsPartnerResponseDto } manufacturer - * @property { ShippingInstructionsPartnerResponseDto } consolidator - * @property { ShippingInstructionsPartnerResponseDto } importer - * @property { ShippingInstructionsPartnerResponseDto } warehouseKeeper - */ -export const ShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: ShippingInstructionsPartnerResponseDtoSchema.nullable(), consignee: ShippingInstructionsPartnerResponseDtoSchema.nullable(), freightForwarder: ShippingInstructionsPartnerResponseDtoSchema.nullable(), notifyParty: ShippingInstructionsPartnerResponseDtoSchema.nullable(), additionalNotifyParty1: ShippingInstructionsPartnerResponseDtoSchema.nullable(), additionalNotifyParty2: ShippingInstructionsPartnerResponseDtoSchema.nullable(), contractParty: ShippingInstructionsPartnerResponseDtoSchema.nullable(), manufacturer: ShippingInstructionsPartnerResponseDtoSchema.nullable(), consolidator: ShippingInstructionsPartnerResponseDtoSchema.nullable(), importer: ShippingInstructionsPartnerResponseDtoSchema.nullable(), warehouseKeeper: ShippingInstructionsPartnerResponseDtoSchema.nullable() }).partial(); -export type ShippingInstructionsGeneralDetailsDto = z.infer; - -/** - * ShippingInstructionsLocationResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } code - * @property { string } countryCode - * @property { string } eta - * @property { string } vessel - * @property { string } voyage - */ -export const ShippingInstructionsLocationResponseDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), code: z.string().nullable(), countryCode: z.string().nullable(), eta: z.iso.datetime({ offset: true }).nullable(), vessel: z.string().nullable(), voyage: z.string().nullable() }).partial(); -export type ShippingInstructionsLocationResponseDto = z.infer; - -/** - * SIMoveTypeEnumSchema - * @type { enum } - */ -export const SIMoveTypeEnumSchema = z.enum(["DoorToDoor", "DoorToPort", "PortToDoor", "PortToPort"]); -export type SIMoveTypeEnum = z.infer; -export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; - -/** - * ShippingInstructionsTransportDtoSchema - * @type { object } - * @property { string } vessel - * @property { string } voyage - * @property { string } imo - * @property { ShippingInstructionsLocationResponseDto } placeOfReceipt - * @property { ShippingInstructionsLocationResponseDto } portOfLoading - * @property { ShippingInstructionsLocationResponseDto } portOfDischarge - * @property { ShippingInstructionsLocationResponseDto } placeOfDelivery - * @property { SIMoveTypeEnum } moveType - * @property { string } shipmentType - */ -export const ShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string().nullable(), voyage: z.string().nullable(), imo: z.string().nullable(), placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema.nullable(), portOfLoading: ShippingInstructionsLocationResponseDtoSchema.nullable(), portOfDischarge: ShippingInstructionsLocationResponseDtoSchema.nullable(), placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema.nullable(), moveType: SIMoveTypeEnumSchema.nullable(), shipmentType: z.string().nullable() }).partial(); -export type ShippingInstructionsTransportDto = z.infer; - -/** - * ShippingInstructionsHazardousDtoSchema - * @type { object } - * @property { string } IMOClass - * @property { string } UNDGNumber - * @property { string } contact - */ -export const ShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string().nullable(), UNDGNumber: z.string().nullable(), contact: z.string().nullable() }).partial(); -export type ShippingInstructionsHazardousDto = z.infer; - -/** - * ShippingInstructionsPackageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { number } quantity - * @property { string } packageType - * @property { string } packageTypeDescription - * @property { string } packageDescription - * @property { string } hsCode - * @property { number } volume - * @property { number } grossWeight - * @property { string } caseMarks - * @property { ShippingInstructionsHazardousDto } hazardous - * @property { string } ncmCodes - * @property { string } cusCode - */ -export const ShippingInstructionsPackageResponseDtoSchema = z.object({ id: z.string().nullable(), quantity: z.number().nullable(), packageType: z.string().nullable(), packageTypeDescription: z.string().nullable(), packageDescription: z.string().nullable(), hsCode: z.string().nullable(), volume: z.number().nullable(), grossWeight: z.number().nullable(), caseMarks: z.string().nullable(), hazardous: ShippingInstructionsHazardousDtoSchema.nullable(), ncmCodes: z.string().nullable(), cusCode: z.string().nullable() }).partial(); -export type ShippingInstructionsPackageResponseDto = z.infer; - -/** - * ShippingInstructionsCargoResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } transportUnitNumber - * @property { string } transportUnitType - * @property { string } transportUnitDescription - * @property { string } containerSupplier - * @property { number } grossWeight - * @property { number } tare - * @property { number } volume - * @property { string } seal1 - * @property { string } seal2 - * @property { string } woodDeclaration - * @property { ShippingInstructionsPackageResponseDto[] } packages - */ -export const ShippingInstructionsCargoResponseDtoSchema = z.object({ id: z.string().nullish(), transportUnitNumber: z.string().nullish(), transportUnitType: z.string().nullish(), transportUnitDescription: z.string().nullish(), containerSupplier: z.string().nullish(), grossWeight: z.number().nullish(), tare: z.number().nullish(), volume: z.number().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), woodDeclaration: WoodDeclarationEnumSchema.nullish(), packages: z.array(ShippingInstructionsPackageResponseDtoSchema) }); -export type ShippingInstructionsCargoResponseDto = z.infer; - -/** - * ShippingInstructionsHeaderDtoSchema - * @type { object } - * @property { string } name - * @property { string } nameSuffix - * @property { number } versionNumber - * @property { string } shippingInstructionNumber - * @property { string } carrierScac - * @property { string } carrierBookingNumber - */ -export const ShippingInstructionsHeaderDtoSchema = z.object({ name: z.string(), nameSuffix: z.string().nullish(), versionNumber: z.number(), shippingInstructionNumber: z.string().nullish(), carrierScac: z.string().nullish(), carrierBookingNumber: z.string().nullish() }); -export type ShippingInstructionsHeaderDto = z.infer; - -/** - * ShippingInstructionsReferencesDtoSchema - * @type { object } - * @property { string } shipperReference - * @property { string } forwarderReference - * @property { string } transactionReferenceNumber - * @property { string } blReferenceNumber - * @property { string } uniqueConsignmentReference - * @property { string } purchaseOrderNumber - * @property { string } contractReferenceNumber - * @property { string } rucNumber - * @property { string } consigneeOrderNumber - * @property { string } invoiceReferenceNumber - * @property { string } letterOfCreditReference - * @property { string } customsHouseBrokerReference - * @property { string } fmcNumber - * @property { string } exportLicenseNumber - */ -export const ShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string().nullable(), forwarderReference: z.string().nullable(), transactionReferenceNumber: z.string().nullable(), blReferenceNumber: z.string().nullable(), uniqueConsignmentReference: z.string().nullable(), purchaseOrderNumber: z.string().nullable(), contractReferenceNumber: z.string().nullable(), rucNumber: z.string().nullable(), consigneeOrderNumber: z.string().nullable(), invoiceReferenceNumber: z.string().nullable(), letterOfCreditReference: z.string().nullable(), customsHouseBrokerReference: z.string().nullable(), fmcNumber: z.string().nullable(), exportLicenseNumber: z.string().nullable() }).partial(); -export type ShippingInstructionsReferencesDto = z.infer; - -/** - * ShippingInstructionsCustomsComplianceDtoSchema - * @type { object } - * @property { string } shipperTaxId - * @property { string } shipperEORI - * @property { string } consigneeTaxId - * @property { string } consigneeEORI - * @property { string } notifyPartyTaxId - * @property { string } notifyPartyEORI - */ -export const ShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string().nullable(), shipperEORI: z.string().nullable(), consigneeTaxId: z.string().nullable(), consigneeEORI: z.string().nullable(), notifyPartyTaxId: z.string().nullable(), notifyPartyEORI: z.string().nullable() }).partial(); -export type ShippingInstructionsCustomsComplianceDto = z.infer; - -/** - * ShippingInstructionsIcs2DtoSchema - * @type { object } - * @property { boolean } goodsDeliveredInEu - * @property { string } ensDeclaration - * @property { string } issuedHouseBills - */ -export const ShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean().nullable(), ensDeclaration: EnsDeclarationEnumSchema.nullable(), issuedHouseBills: IssuedHouseBillsEnumSchema.nullable() }).partial(); -export type ShippingInstructionsIcs2Dto = z.infer; - -/** - * ShippingInstructionsCargoIdentificationNumbersDtoSchema - * @type { object } - * @property { string } PCINNumber - * @property { string } CSNNumber - * @property { string } MCINNumber - */ -export const ShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string().nullable(), CSNNumber: z.string().nullable(), MCINNumber: z.string().nullable() }).partial(); -export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer; - -/** - * ShippingInstructionsControlTotalsDtoSchema - * @type { object } - * @property { number } totalNumberOfContainers - * @property { number } totalNumberOfPackages - * @property { number } totalShipmentWeight - * @property { number } totalShipmentVolume - */ -export const ShippingInstructionsControlTotalsDtoSchema = z.object({ totalNumberOfContainers: z.number().nullable(), totalNumberOfPackages: z.number().nullable(), totalShipmentWeight: z.number().nullable(), totalShipmentVolume: z.number().nullable() }).partial(); -export type ShippingInstructionsControlTotalsDto = z.infer; - -/** - * FreightChargesDtoSchema - * @type { object } - * @property { string } freightPayer - * @property { string } freightTerm - */ -export const FreightChargesDtoSchema = z.object({ freightPayer: z.string().nullable(), freightTerm: CommonModels.ChargePaymentEnumSchema.nullable() }).partial(); -export type FreightChargesDto = z.infer; - -/** - * ShippingInstructionsShippersDeclaredValueDtoSchema - * @type { object } - * @property { string } currency - * @property { number } shipperDeclaredValue - */ -export const ShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string().nullable(), shipperDeclaredValue: z.number().nullable() }).partial(); -export type ShippingInstructionsShippersDeclaredValueDto = z.infer; - -/** - * ShippingInstructionsNotificationEmailsDtoSchema - * @type { object } - * @property { string } siRequestorEmails - */ -export const ShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string().nullable() }).partial(); -export type ShippingInstructionsNotificationEmailsDto = z.infer; - -/** - * ShippingInstructionsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } name - * @property { string } nameSuffix - * @property { string } date - * @property { string } createdAt - * @property { string } updatedAt - * @property { number } versionNumber - * @property { ShippingInstructionsHeaderDto } header - * @property { ShippingInstructionsGeneralDetailsDto } generalDetails - * @property { ShippingInstructionsReferencesDto } references - * @property { ShippingInstructionsTransportDto } transport - * @property { ShippingInstructionsCustomsComplianceDto } customsCompliance - * @property { ShippingInstructionsIcs2Dto } ics2 - * @property { ShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers - * @property { ShippingInstructionsCargoResponseDto[] } cargo - * @property { ShippingInstructionsControlTotalsDto } controlTotals - * @property { FreightChargesDto } freightCharges - * @property { ShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue - * @property { ShippingInstructionsNotificationEmailsDto } notificationEmails - * @property { string } defaultFileName - */ -export const ShippingInstructionsResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), date: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), versionNumber: z.number(), header: ShippingInstructionsHeaderDtoSchema, generalDetails: ShippingInstructionsGeneralDetailsDtoSchema, references: ShippingInstructionsReferencesDtoSchema, transport: ShippingInstructionsTransportDtoSchema, customsCompliance: ShippingInstructionsCustomsComplianceDtoSchema, ics2: ShippingInstructionsIcs2DtoSchema, cargoIdentificationNumbers: ShippingInstructionsCargoIdentificationNumbersDtoSchema, cargo: z.array(ShippingInstructionsCargoResponseDtoSchema).nullish(), controlTotals: ShippingInstructionsControlTotalsDtoSchema, freightCharges: FreightChargesDtoSchema, shippersDeclaredValue: ShippingInstructionsShippersDeclaredValueDtoSchema, notificationEmails: ShippingInstructionsNotificationEmailsDtoSchema, defaultFileName: z.string() }); -export type ShippingInstructionsResponseDto = z.infer; - -/** - * UpdateShippingInstructionsPartnerDtoSchema - * @type { object } - * @property { string } id Partner id - * @property { string } name Partner name - * @property { string } addressLine1 Address line 1 - * @property { string } addressLine2 Address line 2 - * @property { string } city City - * @property { string } postalCode Postal code - * @property { string } state State - * @property { string } countryCode Country code - * @property { string } taxId Tax ID - * @property { string } contactName Contact name - * @property { string } contactPhone Contact phone - * @property { string } contactEmail Contact email - */ -export const UpdateShippingInstructionsPartnerDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), addressLine1: z.string().nullable(), addressLine2: z.string().nullable(), city: z.string().nullable(), postalCode: z.string().nullable(), state: z.string().nullable(), countryCode: z.string().nullable(), taxId: z.string().nullable(), contactName: z.string().nullable(), contactPhone: z.string().nullable(), contactEmail: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsPartnerDto = z.infer; - -/** - * UpdateShippingInstructionsGeneralDetailsDtoSchema - * @type { object } - * @property { UpdateShippingInstructionsPartnerDto } shipper Shipper - * @property { UpdateShippingInstructionsPartnerDto } consignee Consignee - * @property { UpdateShippingInstructionsPartnerDto } freightForwarder Freight forwarder - * @property { UpdateShippingInstructionsPartnerDto } notifyParty Notify party - * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty1 Additional notify party 1 - * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty2 Additional notify party 2 - * @property { UpdateShippingInstructionsPartnerDto } contractParty Contract party - * @property { UpdateShippingInstructionsPartnerDto } manufacturer Manufacturer - * @property { UpdateShippingInstructionsPartnerDto } consolidator Consolidator - * @property { UpdateShippingInstructionsPartnerDto } importer Importer - * @property { UpdateShippingInstructionsPartnerDto } warehouseKeeper Warehouse keeper - */ -export const UpdateShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: UpdateShippingInstructionsPartnerDtoSchema.nullable(), consignee: UpdateShippingInstructionsPartnerDtoSchema.nullable(), freightForwarder: UpdateShippingInstructionsPartnerDtoSchema.nullable(), notifyParty: UpdateShippingInstructionsPartnerDtoSchema.nullable(), additionalNotifyParty1: UpdateShippingInstructionsPartnerDtoSchema.nullable(), additionalNotifyParty2: UpdateShippingInstructionsPartnerDtoSchema.nullable(), contractParty: UpdateShippingInstructionsPartnerDtoSchema.nullable(), manufacturer: UpdateShippingInstructionsPartnerDtoSchema.nullable(), consolidator: UpdateShippingInstructionsPartnerDtoSchema.nullable(), importer: UpdateShippingInstructionsPartnerDtoSchema.nullable(), warehouseKeeper: UpdateShippingInstructionsPartnerDtoSchema.nullable() }).partial(); -export type UpdateShippingInstructionsGeneralDetailsDto = z.infer; - -/** - * UpdateShippingInstructionsLocationDtoSchema - * @type { object } - * @property { string } id Location id - * @property { string } name Location name - * @property { string } code Location code - * @property { string } countryCode Country code - */ -export const UpdateShippingInstructionsLocationDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), code: z.string().nullable(), countryCode: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsLocationDto = z.infer; - -/** - * UpdateShippingInstructionsTransportDtoSchema - * @type { object } - * @property { string } vessel Vessel - * @property { string } voyage Voyage - * @property { string } imo IMO - * @property { UpdateShippingInstructionsLocationDto } placeOfReceipt Place of receipt - * @property { UpdateShippingInstructionsLocationDto } portOfLoading Port of loading - * @property { UpdateShippingInstructionsLocationDto } portOfDischarge Port of discharge - * @property { UpdateShippingInstructionsLocationDto } placeOfDelivery Place of delivery - * @property { SIMoveTypeEnum } moveType Move type - * @property { string } shipmentType Shipment type - */ -export const UpdateShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string().nullable(), voyage: z.string().nullable(), imo: z.string().nullable(), placeOfReceipt: UpdateShippingInstructionsLocationDtoSchema.nullable(), portOfLoading: UpdateShippingInstructionsLocationDtoSchema.nullable(), portOfDischarge: UpdateShippingInstructionsLocationDtoSchema.nullable(), placeOfDelivery: UpdateShippingInstructionsLocationDtoSchema.nullable(), moveType: SIMoveTypeEnumSchema.nullable(), shipmentType: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsTransportDto = z.infer; - -/** - * UpdateShippingInstructionsHazardousDtoSchema - * @type { object } - * @property { string } IMOClass IMO class - * @property { string } UNDGNumber UNDG number - * @property { string } contact Contact - */ -export const UpdateShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string().nullable(), UNDGNumber: z.string().nullable(), contact: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsHazardousDto = z.infer; - -/** - * UpdateShippingInstructionsPackageDtoSchema - * @type { object } - * @property { string } id Package id - * @property { number } quantity Quantity - * @property { string } packageType Package type - * @property { string } packageTypeDescription Package type description - * @property { string } packageDescription Package description - * @property { string } hsCode HS code - * @property { number } volume Volume - * @property { number } grossWeight Gross weight - * @property { string } caseMarks Case marks - * @property { UpdateShippingInstructionsHazardousDto } hazardous Hazardous - * @property { string } ncmCodes NCM codes - * @property { string } cusCode CUS code - */ -export const UpdateShippingInstructionsPackageDtoSchema = z.object({ id: z.string().nullable(), quantity: z.number().nullable(), packageType: z.string().nullable(), packageTypeDescription: z.string().nullable(), packageDescription: z.string().nullable(), hsCode: z.string().nullable(), volume: z.number().nullable(), grossWeight: z.number().nullable(), caseMarks: z.string().nullable(), hazardous: UpdateShippingInstructionsHazardousDtoSchema.nullable(), ncmCodes: z.string().nullable(), cusCode: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsPackageDto = z.infer; - -/** - * UpdateShippingInstructionsCargoDtoSchema - * @type { object } - * @property { string } id Cargo id - * @property { string } transportUnitNumber Transport unit number - * @property { string } transportUnitType Transport unit type - * @property { string } transportUnitDescription Transport unit description - * @property { string } containerSupplier Container supplier - * @property { number } grossWeight Gross weight - * @property { number } tare Tare - * @property { number } volume Volume - * @property { string } seal1 Seal 1 - * @property { string } seal2 Seal 2 - * @property { string } woodDeclaration Wood declaration - * @property { UpdateShippingInstructionsPackageDto[] } packages Packages - */ -export const UpdateShippingInstructionsCargoDtoSchema = z.object({ id: z.string().nullable(), transportUnitNumber: z.string().nullable(), transportUnitType: z.string().nullable(), transportUnitDescription: z.string().nullable(), containerSupplier: z.string().nullable(), grossWeight: z.number().nullable(), tare: z.number().nullable(), volume: z.number().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), woodDeclaration: WoodDeclarationEnumSchema.nullable(), packages: z.array(UpdateShippingInstructionsPackageDtoSchema).nullable() }).partial(); -export type UpdateShippingInstructionsCargoDto = z.infer; - -/** - * UpdateShippingInstructionsHeaderDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } nameSuffix Name suffix - * @property { number } versionNumber Version number - * @property { string } shippingInstructionNumber Shipping instruction number - * @property { string } carrierScac Carrier SCAC - * @property { string } carrierBookingNumber Carrier booking number - */ -export const UpdateShippingInstructionsHeaderDtoSchema = z.object({ name: z.string().nullable(), nameSuffix: z.string().nullable(), versionNumber: z.number().nullable(), shippingInstructionNumber: z.string().nullable(), carrierScac: z.string().nullable(), carrierBookingNumber: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsHeaderDto = z.infer; - -/** - * UpdateShippingInstructionsReferencesDtoSchema - * @type { object } - * @property { string } shipperReference Shipper reference - * @property { string } forwarderReference Forwarder reference - * @property { string } transactionReferenceNumber Transaction reference number - * @property { string } blReferenceNumber BL reference number - * @property { string } uniqueConsignmentReference Unique consignment reference - * @property { string } purchaseOrderNumber Purchase order number - * @property { string } contractReferenceNumber Contract reference number - * @property { string } rucNumber RUC number - * @property { string } consigneeOrderNumber Consignee order number - * @property { string } invoiceReferenceNumber Invoice reference number - * @property { string } letterOfCreditReference Letter of credit reference - * @property { string } customsHouseBrokerReference Customs house broker reference - * @property { string } fmcNumber FMC number - * @property { string } exportLicenseNumber Export license number - */ -export const UpdateShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string().nullable(), forwarderReference: z.string().nullable(), transactionReferenceNumber: z.string().nullable(), blReferenceNumber: z.string().nullable(), uniqueConsignmentReference: z.string().nullable(), purchaseOrderNumber: z.string().nullable(), contractReferenceNumber: z.string().nullable(), rucNumber: z.string().nullable(), consigneeOrderNumber: z.string().nullable(), invoiceReferenceNumber: z.string().nullable(), letterOfCreditReference: z.string().nullable(), customsHouseBrokerReference: z.string().nullable(), fmcNumber: z.string().nullable(), exportLicenseNumber: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsReferencesDto = z.infer; - -/** - * UpdateShippingInstructionsCustomsComplianceDtoSchema - * @type { object } - * @property { string } shipperTaxId Shipper tax ID - * @property { string } shipperEORI Shipper EORI - * @property { string } consigneeTaxId Consignee tax ID - * @property { string } consigneeEORI Consignee EORI - * @property { string } notifyPartyTaxId Notify party tax ID - * @property { string } notifyPartyEORI Notify party EORI - */ -export const UpdateShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string().nullable(), shipperEORI: z.string().nullable(), consigneeTaxId: z.string().nullable(), consigneeEORI: z.string().nullable(), notifyPartyTaxId: z.string().nullable(), notifyPartyEORI: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsCustomsComplianceDto = z.infer; - -/** - * UpdateShippingInstructionsIcs2DtoSchema - * @type { object } - * @property { boolean } goodsDeliveredInEu Goods delivered in EU - * @property { string } ensDeclaration ENS declaration - * @property { string } issuedHouseBills Issued house bills - */ -export const UpdateShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean().nullable(), ensDeclaration: EnsDeclarationEnumSchema.nullable(), issuedHouseBills: IssuedHouseBillsEnumSchema.nullable() }).partial(); -export type UpdateShippingInstructionsIcs2Dto = z.infer; - -/** - * UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema - * @type { object } - * @property { string } PCINNumber PCIN number - * @property { string } CSNNumber CSN number - * @property { string } MCINNumber MCIN number - */ -export const UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string().nullable(), CSNNumber: z.string().nullable(), MCINNumber: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer; - -/** - * UpdateFreightChargesDtoSchema - * @type { object } - * @property { string } freightPayer - * @property { string } freightTerm - */ -export const UpdateFreightChargesDtoSchema = z.object({ freightPayer: z.string().nullable(), freightTerm: CommonModels.ChargePaymentEnumSchema.nullable() }).partial(); -export type UpdateFreightChargesDto = z.infer; - -/** - * UpdateShippingInstructionsShippersDeclaredValueDtoSchema - * @type { object } - * @property { string } currency Currency - * @property { number } shipperDeclaredValue Shipper declared value - */ -export const UpdateShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string().nullable(), shipperDeclaredValue: z.number().nullable() }).partial(); -export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer; - -/** - * UpdateShippingInstructionsNotificationEmailsDtoSchema - * @type { object } - * @property { string } siRequestorEmails SI requestor emails - */ -export const UpdateShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsNotificationEmailsDto = z.infer; - -/** - * UpdateShippingInstructionsRequestDtoSchema - * @type { object } - * @property { string } date Date - * @property { UpdateShippingInstructionsHeaderDto } header Header - * @property { UpdateShippingInstructionsGeneralDetailsDto } generalDetails General details - * @property { UpdateShippingInstructionsReferencesDto } references References - * @property { UpdateShippingInstructionsTransportDto } transport Transport - * @property { UpdateShippingInstructionsCustomsComplianceDto } customsCompliance Customs compliance - * @property { UpdateShippingInstructionsIcs2Dto } ics2 ICS2 - * @property { UpdateShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers Cargo identification numbers - * @property { UpdateShippingInstructionsCargoDto[] } cargo Cargo - * @property { UpdateFreightChargesDto } freightCharges - * @property { UpdateShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue Shipper's declared value - * @property { UpdateShippingInstructionsNotificationEmailsDto } notificationEmails Notification emails - */ -export const UpdateShippingInstructionsRequestDtoSchema = z.object({ date: z.iso.datetime({ offset: true }).nullable(), header: UpdateShippingInstructionsHeaderDtoSchema.nullable(), generalDetails: UpdateShippingInstructionsGeneralDetailsDtoSchema.nullable(), references: UpdateShippingInstructionsReferencesDtoSchema.nullable(), transport: UpdateShippingInstructionsTransportDtoSchema.nullable(), customsCompliance: UpdateShippingInstructionsCustomsComplianceDtoSchema.nullable(), ics2: UpdateShippingInstructionsIcs2DtoSchema.nullable(), cargoIdentificationNumbers: UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema.nullable(), cargo: z.array(UpdateShippingInstructionsCargoDtoSchema).nullable(), freightCharges: UpdateFreightChargesDtoSchema.nullable(), shippersDeclaredValue: UpdateShippingInstructionsShippersDeclaredValueDtoSchema.nullable(), notificationEmails: UpdateShippingInstructionsNotificationEmailsDtoSchema.nullable() }).partial(); -export type UpdateShippingInstructionsRequestDto = z.infer; - -} diff --git a/test/generated/base/shippingInstructions/shippingInstructions.queries.ts b/test/generated/base/shippingInstructions/shippingInstructions.queries.ts deleted file mode 100644 index 4514025..0000000 --- a/test/generated/base/shippingInstructions/shippingInstructions.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ShippingInstructionsAcl } from "./shippingInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ShippingInstructionsModels } from "./shippingInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ShippingInstructionsApi } from "./shippingInstructions.api"; - -export namespace ShippingInstructionsQueries { -export const moduleName = QueryModule.ShippingInstructions; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id", officeId, positionId, id] as const, - preview: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id/preview", officeId, positionId, id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create shipping instructions - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId } )); - return ShippingInstructionsApi.create(officeId, positionId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGet` - * @summary Get shipping instructions data - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId, id), - queryFn: () => { - checkAcl(ShippingInstructionsAcl.canUseGet({ officeId } )); - return ShippingInstructionsApi.get(officeId, positionId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update shipping instructions - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { ShippingInstructionsModels.UpdateShippingInstructionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Shipping instructions updated successfully - * @statusCodes [200, 401, 404] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id, data }) => { - checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId } )); - return ShippingInstructionsApi.update(officeId, positionId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, id } = variables; - const updateKeys = [keys.get(officeId, positionId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteOfficesPositionsShippingInstructionsById` - * @summary Delete shipping instructions - * @permission Requires `canUseDeleteOfficesPositionsShippingInstructionsById` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Shipping instructions deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteOfficesPositionsShippingInstructionsById = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id }) => { - checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId } )); - return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreview` - recommended when file should be cached - * @summary Preview shipping instructions document - * @permission Requires `canUsePreview` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreview = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.preview(officeId, positionId, id), - queryFn: () => { - checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); - return ShippingInstructionsApi.preview(officeId, positionId, id) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewMutation` - recommended when file should not be cached - * @summary Preview shipping instructions document - * @permission Requires `canUsePreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id }) => { - checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); - return ShippingInstructionsApi.preview(officeId, positionId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, id } = variables; - const updateKeys = [keys.preview(officeId, positionId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerate` - * @summary Generate shipping instructions document - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id, data }) => { - checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId } )); - return ShippingInstructionsApi.generate(officeId, positionId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/terminals/terminals.acl.ts b/test/generated/base/terminals/terminals.acl.ts deleted file mode 100644 index d29c8a0..0000000 --- a/test/generated/base/terminals/terminals.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace TerminalsAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Terminal" -] as AbilityTuple<"Create", "Terminal">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Terminal" -] as AbilityTuple<"Read", "Terminal">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Terminal" -] as AbilityTuple<"Read", "Terminal">; - -/** - * Use for `useGetById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( -) => [ - "Read", - "Terminal" -] as AbilityTuple<"Read", "Terminal">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Terminal" -] as AbilityTuple<"Update", "Terminal">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Terminal" -] as AbilityTuple<"Archive", "Terminal">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Unarchive", - "Terminal" -] as AbilityTuple<"Unarchive", "Terminal">; - -} diff --git a/test/generated/base/terminals/terminals.api.ts b/test/generated/base/terminals/terminals.api.ts deleted file mode 100644 index 4e021f0..0000000 --- a/test/generated/base/terminals/terminals.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { TerminalsModels } from "./terminals.models"; - -export namespace TerminalsApi { -export const create = (data: TerminalsModels.CreateTerminalRequestDTO, ) => { - return AppRestClient.post( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals`, - ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), - - ) -}; -export const paginate = (limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, - `/terminals`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, - `/terminals/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getById = (id: string, ) => { - return AppRestClient.get( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals/${id}`, - - ) -}; -export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals/${id}`, - ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/terminals/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/terminals/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/terminals/terminals.configs.ts b/test/generated/base/terminals/terminals.configs.ts deleted file mode 100644 index 36d2f2c..0000000 --- a/test/generated/base/terminals/terminals.configs.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { TerminalsModels } from "./terminals.models"; -import { CommonModels } from "@/data/common/common.models"; -import { TerminalsQueries } from "./terminals.queries"; -import { TerminalsAcl } from "./terminals.acl"; - -export namespace TerminalsConfigs { -export const terminalsConfig = { - meta: { - title: "Terminals", - }, - readAll: { - acl: TerminalsAcl.canUsePaginate, - schema: TerminalsModels.TerminalResponseDTOSchema, - paginated: TerminalsQueries.usePaginate, - infinite: TerminalsQueries.usePaginateInfinite, - filters: { - schema: TerminalsModels.TerminalPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: TerminalsModels.TerminalPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - type: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: TerminalsModels.TerminalResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - name: true, - type: true, - airport: true, - port: true, - archived: true, - shortName: true, - address: true, - additionalInformation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: TerminalsModels.TerminalsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: TerminalsAcl.canUseGetById, - schema: TerminalsModels.TerminalResponseDTOSchema, - query: TerminalsQueries.useGetById, - }, - create: { - acl: TerminalsAcl.canUseCreate, - schema: TerminalsModels.CreateTerminalRequestDTOSchema, - mutation: TerminalsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: TerminalsModels.CreateTerminalRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - type: true, - portId: true, - airportId: true, - street: true, - secondaryStreet: true, - zip: true, - district: true, - cityId: true, - countryId: true, - additionalInformation: true, - }, - }, -}) - }, - update: { - acl: TerminalsAcl.canUseUpdate, - schema: TerminalsModels.UpdateTerminalRequestDTOSchema, - mutation: TerminalsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: TerminalsModels.UpdateTerminalRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - type: true, - portId: true, - airportId: true, - street: true, - secondaryStreet: true, - zip: true, - district: true, - cityId: true, - countryId: true, - additionalInformation: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: TerminalsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: TerminalsQueries.usePaginateLabels, - infinite: TerminalsQueries.usePaginateLabelsInfinite, - filters: { - schema: TerminalsModels.TerminalLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: TerminalsModels.TerminalLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/terminals/terminals.models.ts b/test/generated/base/terminals/terminals.models.ts deleted file mode 100644 index 2ee003e..0000000 --- a/test/generated/base/terminals/terminals.models.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace TerminalsModels { -/** - * TerminalTypeSchema - * @type { enum } - */ -export const TerminalTypeSchema = z.enum(["port", "airport"]); -export type TerminalType = z.infer; -export const TerminalType = TerminalTypeSchema.enum; - -/** - * CreateTerminalRequestDTOSchema - * @type { object } - * @property { string } matchCode Unique identifier code for the terminal - * @property { string } shortName Optional short name for the terminal - * @property { string } name Full name of the terminal - * @property { TerminalType } type Type of the terminal - * @property { string } portId ID of associated port, required if type is port - * @property { string } airportId ID of associated airport, required if type is airport - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP / Postal code - * @property { string } district District - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } additionalInformation Additional information - */ -export const CreateTerminalRequestDTOSchema = z.object({ matchCode: z.string(), shortName: z.string().nullish(), name: z.string(), type: TerminalTypeSchema, portId: z.string().nullish(), airportId: z.string().nullish(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), district: z.string().nullish(), cityId: z.string(), countryId: z.string(), additionalInformation: z.string().nullish() }); -export type CreateTerminalRequestDTO = z.infer; - -/** - * TerminalCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const TerminalCityDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type TerminalCityDto = z.infer; - -/** - * TerminalCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const TerminalCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type TerminalCountryDto = z.infer; - -/** - * TerminalAddressDTOSchema - * @type { object } - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP/Postal code - * @property { TerminalCityDto } city - * @property { string } district District name - * @property { TerminalCountryDto } country - */ -export const TerminalAddressDTOSchema = z.object({ street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), city: TerminalCityDtoSchema.nullish(), district: z.string().nullish(), country: TerminalCountryDtoSchema.nullish() }); -export type TerminalAddressDTO = z.infer; - -/** - * AirportReferenceDTOSchema - * @type { object } - * @property { string } id Unique identifier of the airport - * @property { string } name Name of the airport - */ -export const AirportReferenceDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type AirportReferenceDTO = z.infer; - -/** - * PortReferenceDTOSchema - * @type { object } - * @property { string } id Unique identifier of the port - * @property { string } name Name of the port - */ -export const PortReferenceDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type PortReferenceDTO = z.infer; - -/** - * TerminalEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type TerminalEmployeeDTO = z.infer; - -/** - * TerminalResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the terminal - * @property { string } matchCode Match code for the terminal - * @property { string } name Name of the terminal - * @property { TerminalType } type Type of the terminal - * @property { AirportReferenceDTO } airport Associated airport information if terminal type is airport - * @property { PortReferenceDTO } port Associated port information if terminal type is port - * @property { boolean } archived Archived status of the terminal - * @property { string } shortName Short name of the terminal - * @property { TerminalAddressDTO } address Address of the terminal - * @property { string } additionalInformation Additional information - * @property { string } createdById - * @property { TerminalEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { TerminalEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const TerminalResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string(), type: TerminalTypeSchema.nullish(), airport: AirportReferenceDTOSchema.nullish(), port: PortReferenceDTOSchema.nullish(), archived: z.boolean(), shortName: z.string().nullish(), address: TerminalAddressDTOSchema.nullish(), additionalInformation: z.string().nullish(), createdById: z.string().nullish(), createdBy: TerminalEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: TerminalEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type TerminalResponseDTO = z.infer; - -/** - * UpdateTerminalRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code for the terminal - * @property { string } shortName Updated short name - * @property { string } name Updated name - * @property { TerminalType } type Type of the terminal - * @property { string } portId ID of associated port, required if type is port - * @property { string } airportId ID of associated airport, required if type is airport - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP / Postal code - * @property { string } district District - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } additionalInformation Additional information - */ -export const UpdateTerminalRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), name: z.string().nullable(), type: TerminalTypeSchema.nullable(), portId: z.string().nullable(), airportId: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), district: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), additionalInformation: z.string().nullable() }).partial(); -export type UpdateTerminalRequestDTO = z.infer; - -/** - * TerminalPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter terminals by matchCode, shortName, or name - * @property { boolean } archived - * @property { string } type - */ -export const TerminalPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable(), type: TerminalTypeSchema.nullable() }).partial(); -export type TerminalPaginationFilterDto = z.infer; - -/** - * TerminalLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const TerminalLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type TerminalLabelFilterDto = z.infer; - -/** - * TerminalsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const TerminalsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type TerminalsPaginateOrderParamEnum = z.infer; -export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSchema.enum; - -/** - * TerminalsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { TerminalResponseDTO[] } items - */ -export const TerminalsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(TerminalResponseDTOSchema).nullable() }).partial().shape }); -export type TerminalsPaginateResponse = z.infer; - -/** - * TerminalsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const TerminalsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type TerminalsPaginateLabelsOrderParamEnum = z.infer; -export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * TerminalsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const TerminalsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type TerminalsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/terminals/terminals.queries.ts b/test/generated/base/terminals/terminals.queries.ts deleted file mode 100644 index b752c33..0000000 --- a/test/generated/base/terminals/terminals.queries.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { TerminalsAcl } from "./terminals.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { TerminalsModels } from "./terminals.models"; -import { TerminalsApi } from "./terminals.api"; - -export namespace TerminalsQueries { -export const moduleName = QueryModule.Terminals; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string) => [...keys.all, "/terminals", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string) => [...keys.all, "/terminals/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getById: (id: string) => [...keys.all, "/terminals/:id", id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a new terminal - * @permission Requires `canUseCreate` ability - * @param { TerminalsModels.CreateTerminalRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(TerminalsAcl.canUseCreate()); - return TerminalsApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Terminals - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Terminals - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate terminals with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate terminals with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetById` - * @summary Get terminal details by ID - * @permission Requires `canUseGetById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(id), - queryFn: () => { - checkAcl(TerminalsAcl.canUseGetById()); - return TerminalsApi.getById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update terminal details - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { TerminalsModels.UpdateTerminalRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(TerminalsAcl.canUseUpdate()); - return TerminalsApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.getById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a terminal - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(TerminalsAcl.canUseArchive()); - return TerminalsApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a terminal - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(TerminalsAcl.canUseUnarchive()); - return TerminalsApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/useCrossTabQueryInvalidation.ts b/test/generated/base/useCrossTabQueryInvalidation.ts deleted file mode 100644 index d74d707..0000000 --- a/test/generated/base/useCrossTabQueryInvalidation.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { QueryClient, QueryKey } from "@tanstack/react-query"; - -const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; - -/** - * Broadcasts a query invalidation event to all other open tabs via localStorage. - * - * @param queryKeys - An array of query keys to invalidate (array of arrays). - * - * NOTE: The `storage` event only fires in *other* tabs — the calling tab - * must invalidate its own queryClient separately if needed. - */ -export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { - localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); -}; - -/** - * Registers a one-time global `storage` event listener that reacts to - * cross-tab invalidation broadcasts. Safe to call from multiple hooks — - * only the first call sets up the listener. - */ -let isListenerSetUp = false; - -export const setupCrossTabListener = (queryClient: QueryClient) => { - if (isListenerSetUp) return; - isListenerSetUp = true; - - window.addEventListener("storage", (e: StorageEvent) => { - if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; - - try { - const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; - for (const queryKey of keys) { - queryClient.invalidateQueries({ queryKey }); - } - } catch { - // Ignore malformed payloads - } - }); -}; diff --git a/test/generated/base/useMutationEffects.ts b/test/generated/base/useMutationEffects.ts deleted file mode 100644 index ed61406..0000000 --- a/test/generated/base/useMutationEffects.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { useCallback, useEffect } from "react"; - -import { QueryKey, useQueryClient } from "@tanstack/react-query"; -import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; -import { QueryModule } from "./queryModules"; -import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; - -export interface MutationEffectsOptions { - invalidateCurrentModule?: boolean; - crossTabInvalidation?: boolean; - invalidationMap?: InvalidationMap; - invalidateModules?: QueryModule[]; - invalidateKeys?: QueryKey[]; - preferUpdate?: boolean; -} - -export interface UseMutationEffectsProps { - currentModule: QueryModule; -} - -export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { - const queryClient = useQueryClient(); - const config = OpenApiQueryConfig.useConfig(); - - useEffect(() => { - if (!config.crossTabInvalidation) return; - setupCrossTabListener(queryClient); - }, [queryClient, config.crossTabInvalidation]); - - const runMutationEffects = useCallback( - async ( - data: TData, - variables: TVariables, - options: MutationEffectsOptions = {}, - updateKeys?: QueryKey[], - ) => { - const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; - const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; - const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; - - const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => - keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); - const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => - prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); - const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); - - const shouldInvalidateQuery = (queryKey: QueryKey) => { - const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); - if (shouldUpdate && isUpdateKey) { - return false; - } - - const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; - const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); - const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - const isMappedKey = - !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - - return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; - }; - - const invalidatedQueryKeys: QueryKey[] = []; - - queryClient.invalidateQueries({ - predicate: ({ queryKey }) => { - const shouldInvalidate = shouldInvalidateQuery(queryKey); - - if (shouldInvalidate && config.crossTabInvalidation) { - invalidatedQueryKeys.push([...queryKey]); - } - - return shouldInvalidate; - }, - }); - - if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { - broadcastQueryInvalidation(invalidatedQueryKeys); - } - - if (shouldUpdate && updateKeys) { - updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); - } - }, - [ - queryClient, - currentModule, - config.preferUpdate, - config.invalidateCurrentModule, - config.invalidationMap, - config.crossTabInvalidation, - ], - ); - - return { runMutationEffects }; -} diff --git a/test/generated/base/userActivity/userActivity.api.ts b/test/generated/base/userActivity/userActivity.api.ts deleted file mode 100644 index e1a978e..0000000 --- a/test/generated/base/userActivity/userActivity.api.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { UserActivityModels } from "./userActivity.models"; - -export namespace UserActivityApi { -export const get = (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number, ) => { - return AppRestClient.get( - { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, - `/offices/${officeId}/${entityType}/${entityId}/activity`, - { - params: { - activeThresholdMinutes: ZodExtended.parse(z.number().gte(1).nullish(), activeThresholdMinutes, { type: "query", name: "activeThresholdMinutes" }), - }, - } - ) -}; -} diff --git a/test/generated/base/userActivity/userActivity.models.ts b/test/generated/base/userActivity/userActivity.models.ts deleted file mode 100644 index dfe9552..0000000 --- a/test/generated/base/userActivity/userActivity.models.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { z } from "zod"; - -export namespace UserActivityModels { -/** - * ActivityTypeEnumSchema - * @type { enum } - */ -export const ActivityTypeEnumSchema = z.enum(["View", "Modify"]); -export type ActivityTypeEnum = z.infer; -export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; - -/** - * UserSectionActivityDtoSchema - * @type { object } - * @property { string } section Section name - * @property { ActivityTypeEnum } activityType Type of activity - * @property { string } lastSeen Last seen timestamp - */ -export const UserSectionActivityDtoSchema = z.object({ section: z.string(), activityType: ActivityTypeEnumSchema, lastSeen: z.iso.datetime({ offset: true }) }); -export type UserSectionActivityDto = z.infer; - -/** - * ActiveUserDtoSchema - * @type { object } - * @property { string } userId User ID - * @property { string } firstName User first name - * @property { string } lastName User last name - * @property { string } userAvatar User avatar URL - * @property { UserSectionActivityDto } section User section activity - * @property { string } lastSeen Last seen timestamp - * @property { boolean } isCurrentlyActive Is currently active - */ -export const ActiveUserDtoSchema = z.object({ userId: z.string(), firstName: z.string(), lastName: z.string(), userAvatar: z.string().nullish(), section: UserSectionActivityDtoSchema, lastSeen: z.iso.datetime({ offset: true }), isCurrentlyActive: z.boolean() }); -export type ActiveUserDto = z.infer; - -/** - * ActivityEntityTypeEnumSchema - * @type { enum } - */ -export const ActivityEntityTypeEnumSchema = z.enum(["Position", "Invoice", "BusinessPartner", "Quote"]); -export type ActivityEntityTypeEnum = z.infer; -export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; - -/** - * ActivityMetadataDtoSchema - * @type { object } - * @property { number } totalActiveUsers Total number of active users - * @property { string } entityId Entity ID - * @property { ActivityEntityTypeEnum } entityType Entity type - * @property { number } activeThresholdMinutes Active threshold in minutes - */ -export const ActivityMetadataDtoSchema = z.object({ totalActiveUsers: z.number(), entityId: z.string(), entityType: ActivityEntityTypeEnumSchema, activeThresholdMinutes: z.number() }); -export type ActivityMetadataDto = z.infer; - -/** - * UserActivityResponseDtoSchema - * @type { object } - * @property { ActiveUserDto[] } activeUsers List of active users - * @property { ActivityMetadataDto } metadata Activity metadata - */ -export const UserActivityResponseDtoSchema = z.object({ activeUsers: z.array(ActiveUserDtoSchema), metadata: ActivityMetadataDtoSchema }); -export type UserActivityResponseDto = z.infer; - -} diff --git a/test/generated/base/userActivity/userActivity.queries.ts b/test/generated/base/userActivity/userActivity.queries.ts deleted file mode 100644 index b9e1bad..0000000 --- a/test/generated/base/userActivity/userActivity.queries.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { UserActivityApi } from "./userActivity.api"; - -export namespace UserActivityQueries { -export const moduleName = QueryModule.UserActivity; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number) => [...keys.all, "/offices/:officeId/:entityType/:entityId/activity", officeId, entityType, entityId, activeThresholdMinutes] as const, -}; - -/** - * Query `useGet` - * @summary Get user activity for an entity - * @param { string } object.officeId Path parameter - * @param { string } object.entityType Path parameter - * @param { string } object.entityId Path parameter - * @param { number } object.activeThresholdMinutes Query parameter. Active threshold in minutes. Minimum: `1` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, entityType, entityId, activeThresholdMinutes }: { officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), - queryFn: () => - UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes), - ...options, - }); -}; - -} diff --git a/test/generated/base/vatRules/vatRules.acl.ts b/test/generated/base/vatRules/vatRules.acl.ts deleted file mode 100644 index 827096c..0000000 --- a/test/generated/base/vatRules/vatRules.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace VatRulesAcl { -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "VatRule" -] as AbilityTuple<"Read", "VatRule">; - -/** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( -) => [ - "Read", - "VatRule" -] as AbilityTuple<"Read", "VatRule">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "VatRule" -] as AbilityTuple<"Create", "VatRule">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "VatRule" -] as AbilityTuple<"Read", "VatRule">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "VatRule" -] as AbilityTuple<"Update", "VatRule">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Update", - "VatRule" -] as AbilityTuple<"Update", "VatRule">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Update", - "VatRule" -] as AbilityTuple<"Update", "VatRule">; - -} diff --git a/test/generated/base/vatRules/vatRules.api.ts b/test/generated/base/vatRules/vatRules.api.ts deleted file mode 100644 index ce19db0..0000000 --- a/test/generated/base/vatRules/vatRules.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { VatRulesModels } from "./vatRules.models"; - -export namespace VatRulesApi { -export const paginateLabels = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, - `/vat-rules/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: VatRulesModels.VatRulesListResponseSchema }, - `/vat-rules`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, ) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules`, - ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}`, - - ) -}; -export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}`, - ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/vatRules/vatRules.configs.ts b/test/generated/base/vatRules/vatRules.configs.ts deleted file mode 100644 index 092a685..0000000 --- a/test/generated/base/vatRules/vatRules.configs.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { VatRulesModels } from "./vatRules.models"; -import { CommonModels } from "@/data/common/common.models"; -import { VatRulesQueries } from "./vatRules.queries"; -import { VatRulesAcl } from "./vatRules.acl"; - -export namespace VatRulesConfigs { -export const vatRulesConfig = { - meta: { - title: "Vat Rules", - }, - readAll: { - acl: VatRulesAcl.canUseList, - schema: VatRulesModels.VatRuleResponseDTOSchema, - paginated: VatRulesQueries.useList, - infinite: VatRulesQueries.useListInfinite, - filters: { - schema: VatRulesModels.VatRuleFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: VatRulesModels.VatRuleFilterDtoSchema, - options: { - inputs: { - matchcode: true, - name: true, - type: true, - officeId: true, - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: VatRulesModels.VatRuleResponseDTOSchema, - options: { - columns: { - id: true, - matchcode: true, - name: true, - vatPercentage: true, - vatNumber: true, - noTax: true, - type: true, - archived: true, - isReverseCharge: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - officeId: true, - office: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - sortable: VatRulesModels.VatRulesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: VatRulesAcl.canUseFindById, - schema: VatRulesModels.VatRuleResponseDTOSchema, - query: VatRulesQueries.useFindById, - }, - create: { - acl: VatRulesAcl.canUseCreate, - schema: VatRulesModels.CreateVatRuleRequestDTOSchema, - mutation: VatRulesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: VatRulesModels.CreateVatRuleRequestDTOSchema, - options: { - inputs: { - matchcode: true, - name: true, - noTax: true, - vatPercentage: true, - vatNumber: true, - type: true, - officeId: true, - isReverseCharge: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - }, -}) - }, - update: { - acl: VatRulesAcl.canUseUpdate, - schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, - mutation: VatRulesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, - options: { - inputs: { - matchcode: true, - name: true, - noTax: true, - vatPercentage: true, - vatNumber: true, - type: true, - officeId: true, - isReverseCharge: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: VatRulesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: VatRulesQueries.usePaginateLabels, - infinite: VatRulesQueries.usePaginateLabelsInfinite, - filters: { - schema: VatRulesModels.VatRuleFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: VatRulesModels.VatRuleFilterDtoSchema, - options: { - inputs: { - matchcode: true, - name: true, - type: true, - officeId: true, - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/vatRules/vatRules.models.ts b/test/generated/base/vatRules/vatRules.models.ts deleted file mode 100644 index f9ef2d5..0000000 --- a/test/generated/base/vatRules/vatRules.models.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace VatRulesModels { -/** - * VatRuleTypeEnumSchema - * @type { enum } - */ -export const VatRuleTypeEnumSchema = z.enum(["Outgoing", "Incoming"]); -export type VatRuleTypeEnum = z.infer; -export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; - -/** - * VatRuleFilterDtoSchema - * @type { object } - * @property { string } matchcode Matchcode to filter by - * @property { string } name Name to filter by - * @property { VatRuleTypeEnum } type - * @property { string } officeId Office ID to filter by - * @property { boolean } archived Filter by archived status - * @property { string } search Search to filter by - */ -export const VatRuleFilterDtoSchema = z.object({ matchcode: z.string().nullable(), name: z.string().nullable(), type: VatRuleTypeEnumSchema.nullable(), officeId: z.string().nullable(), archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); -export type VatRuleFilterDto = z.infer; - -/** - * VatRuleEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type VatRuleEmployeeDTO = z.infer; - -/** - * VatRuleOfficeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type VatRuleOfficeDTO = z.infer; - -/** - * VatRuleResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchcode - * @property { string } name - * @property { number } vatPercentage - * @property { number } vatNumber VAT rule reference number - * @property { boolean } noTax - * @property { VatRuleTypeEnum } type - * @property { boolean } archived - * @property { boolean } isReverseCharge - * @property { string } createdById - * @property { VatRuleEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { VatRuleEmployeeDTO } updatedBy - * @property { string } updatedAt - * @property { string } officeId - * @property { VatRuleOfficeDTO } office - * @property { string } bookkeepingId - * @property { string } bookkeepingTargetAccountNumber - */ -export const VatRuleResponseDTOSchema = z.object({ id: z.string(), matchcode: z.string(), name: z.string(), vatPercentage: z.number(), vatNumber: z.number().nullish(), noTax: z.boolean().nullish(), type: VatRuleTypeEnumSchema, archived: z.boolean(), isReverseCharge: z.boolean(), createdById: z.string().nullish(), createdBy: VatRuleEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: VatRuleEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), officeId: z.string(), office: VatRuleOfficeDTOSchema.nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }); -export type VatRuleResponseDTO = z.infer; - -/** - * CreateVatRuleRequestDTOSchema - * @type { object } - * @property { string } matchcode Unique matchcode for the VAT rule - * @property { string } name Name of the VAT rule - * @property { boolean } noTax - * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` - * @property { number } vatNumber VAT rule reference number - * @property { VatRuleTypeEnum } type Type of VAT rule - * @property { string } officeId Office ID - * @property { boolean } isReverseCharge Is reverse charge VAT rule - * @property { string } bookkeepingId Bookkeeping ID - * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number - */ -export const CreateVatRuleRequestDTOSchema = z.object({ matchcode: z.string(), name: z.string(), noTax: z.boolean().nullish(), vatPercentage: z.number().gte(0).lte(100), vatNumber: z.number().nullish(), type: VatRuleTypeEnumSchema, officeId: z.string(), isReverseCharge: z.boolean().nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }); -export type CreateVatRuleRequestDTO = z.infer; - -/** - * UpdateVatRuleRequestDTOSchema - * @type { object } - * @property { string } matchcode Unique matchcode for the VAT rule - * @property { string } name Name of the VAT rule - * @property { boolean } noTax - * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` - * @property { number } vatNumber VAT rule reference number. Minimum: `0` - * @property { VatRuleTypeEnum } type Type of VAT rule - * @property { string } officeId Office ID - * @property { boolean } isReverseCharge Is reverse charge VAT rule - * @property { string } bookkeepingId Bookkeeping ID - * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number - */ -export const UpdateVatRuleRequestDTOSchema = z.object({ matchcode: z.string().nullable(), name: z.string().nullable(), noTax: z.boolean().nullable(), vatPercentage: z.number().gte(0).lte(100).nullable(), vatNumber: z.number().gte(0).nullable(), type: VatRuleTypeEnumSchema.nullable(), officeId: z.string().nullable(), isReverseCharge: z.boolean().nullable(), bookkeepingId: z.string().nullable(), bookkeepingTargetAccountNumber: z.string().nullable() }).partial(); -export type UpdateVatRuleRequestDTO = z.infer; - -/** - * VatRulesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const VatRulesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type VatRulesPaginateLabelsOrderParamEnum = z.infer; -export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * VatRulesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const VatRulesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type VatRulesPaginateLabelsResponse = z.infer; - -/** - * VatRulesListOrderParamEnumSchema - * @type { enum } - */ -export const VatRulesListOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type VatRulesListOrderParamEnum = z.infer; -export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; - -/** - * VatRulesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { VatRuleResponseDTO[] } items - */ -export const VatRulesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(VatRuleResponseDTOSchema).nullable() }).partial().shape }); -export type VatRulesListResponse = z.infer; - -} diff --git a/test/generated/base/vatRules/vatRules.queries.ts b/test/generated/base/vatRules/vatRules.queries.ts deleted file mode 100644 index f582045..0000000 --- a/test/generated/base/vatRules/vatRules.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { VatRulesAcl } from "./vatRules.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { VatRulesModels } from "./vatRules.models"; -import { VatRulesApi } from "./vatRules.api"; - -export namespace VatRulesQueries { -export const moduleName = QueryModule.VatRules; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", "infinite", limit, order, filter, cursor] as const, - list: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/vat-rules/:id", id] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate VAT rule labels (id and matchcode only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate VAT rule labels (id and matchcode only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List VAT rules - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List VAT rules - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new VAT rule - * @permission Requires `canUseCreate` ability - * @param { VatRulesModels.CreateVatRuleRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(VatRulesAcl.canUseCreate()); - return VatRulesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get VAT rule by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(VatRulesAcl.canUseFindById()); - return VatRulesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update VAT rule by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { VatRulesModels.UpdateVatRuleRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(VatRulesAcl.canUseUpdate()); - return VatRulesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive VAT rule - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(VatRulesAcl.canUseArchive()); - return VatRulesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive VAT rule - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(VatRulesAcl.canUseUnarchive()); - return VatRulesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/warehouses/warehouses.acl.ts b/test/generated/base/warehouses/warehouses.acl.ts deleted file mode 100644 index 65a76ba..0000000 --- a/test/generated/base/warehouses/warehouses.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace WarehousesAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Warehouse" -] as AbilityTuple<"Create", "Warehouse">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Warehouse" -] as AbilityTuple<"Read", "Warehouse">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Warehouse" -] as AbilityTuple<"Read", "Warehouse">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Warehouse" -] as AbilityTuple<"Read", "Warehouse">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Warehouse" -] as AbilityTuple<"Update", "Warehouse">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Warehouse" -] as AbilityTuple<"Archive", "Warehouse">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "Warehouse" -] as AbilityTuple<"Archive", "Warehouse">; - -} diff --git a/test/generated/base/warehouses/warehouses.api.ts b/test/generated/base/warehouses/warehouses.api.ts deleted file mode 100644 index bfa128b..0000000 --- a/test/generated/base/warehouses/warehouses.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WarehousesModels } from "./warehouses.models"; - -export namespace WarehousesApi { -export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, ) => { - return AppRestClient.post( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses`, - ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), - - ) -}; -export const paginate = (limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, - `/warehouses`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, - `/warehouses/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses/${id}`, - - ) -}; -export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses/${id}`, - ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/warehouses/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/warehouses/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/base/warehouses/warehouses.configs.ts b/test/generated/base/warehouses/warehouses.configs.ts deleted file mode 100644 index d53c994..0000000 --- a/test/generated/base/warehouses/warehouses.configs.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { WarehousesModels } from "./warehouses.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WarehousesQueries } from "./warehouses.queries"; -import { WarehousesAcl } from "./warehouses.acl"; - -export namespace WarehousesConfigs { -export const warehousesConfig = { - meta: { - title: "Warehouses", - }, - readAll: { - acl: WarehousesAcl.canUsePaginate, - schema: WarehousesModels.WarehouseResponseDTOSchema, - paginated: WarehousesQueries.usePaginate, - infinite: WarehousesQueries.usePaginateInfinite, - filters: { - schema: WarehousesModels.WarehouseFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WarehousesModels.WarehouseFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: WarehousesModels.WarehouseResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - city: true, - country: true, - district: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: WarehousesModels.WarehousesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: WarehousesAcl.canUseFindById, - schema: WarehousesModels.WarehouseResponseDTOSchema, - query: WarehousesQueries.useFindById, - }, - create: { - acl: WarehousesAcl.canUseCreate, - schema: WarehousesModels.CreateWarehouseRequestDTOSchema, - mutation: WarehousesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: WarehousesModels.CreateWarehouseRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, - update: { - acl: WarehousesAcl.canUseUpdate, - schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, - mutation: WarehousesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: WarehousesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: WarehousesQueries.usePaginateLabels, - infinite: WarehousesQueries.usePaginateLabelsInfinite, - filters: { - schema: WarehousesModels.WarehouseLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WarehousesModels.WarehouseLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/base/warehouses/warehouses.models.ts b/test/generated/base/warehouses/warehouses.models.ts deleted file mode 100644 index e60932b..0000000 --- a/test/generated/base/warehouses/warehouses.models.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WarehousesModels { -/** - * WarehouseCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type WarehouseCityDto = z.infer; - -/** - * WarehouseCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const WarehouseCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type WarehouseCountryDto = z.infer; - -/** - * WarehouseEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type WarehouseEmployeeDTO = z.infer; - -/** - * WarehouseResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { WarehouseCityDto } city - * @property { WarehouseCountryDto } country - * @property { string } district - * @property { boolean } archived - * @property { string } createdById - * @property { WarehouseEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { WarehouseEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const WarehouseResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: WarehouseCityDtoSchema.nullish(), country: WarehouseCountryDtoSchema.nullish(), district: z.string().nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: WarehouseEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: WarehouseEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type WarehouseResponseDTO = z.infer; - -/** - * CreateWarehouseRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } countryId - * @property { string } district - */ -export const CreateWarehouseRequestDTOSchema = z.object({ name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), cityId: z.string().nullish(), countryId: z.string().nullish(), district: z.string().nullish() }); -export type CreateWarehouseRequestDTO = z.infer; - -/** - * WarehouseLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const WarehouseLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type WarehouseLabelFilterDto = z.infer; - -/** - * WarehouseFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived Filter by archived status - */ -export const WarehouseFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type WarehouseFilterDto = z.infer; - -/** - * UpdateWarehouseRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } countryId - * @property { string } district - */ -export const UpdateWarehouseRequestDTOSchema = z.object({ name: z.string().nullable(), shortName: z.string().nullable(), additionalInformation: z.string().nullable(), matchCode: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable() }).partial(); -export type UpdateWarehouseRequestDTO = z.infer; - -/** - * WarehousesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const WarehousesPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type WarehousesPaginateOrderParamEnum = z.infer; -export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnumSchema.enum; - -/** - * WarehousesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { WarehouseResponseDTO[] } items - */ -export const WarehousesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WarehouseResponseDTOSchema).nullable() }).partial().shape }); -export type WarehousesPaginateResponse = z.infer; - -/** - * WarehousesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const WarehousesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type WarehousesPaginateLabelsOrderParamEnum = z.infer; -export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * WarehousesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const WarehousesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type WarehousesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/base/warehouses/warehouses.queries.ts b/test/generated/base/warehouses/warehouses.queries.ts deleted file mode 100644 index 5aa2949..0000000 --- a/test/generated/base/warehouses/warehouses.queries.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WarehousesAcl } from "./warehouses.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WarehousesModels } from "./warehouses.models"; -import { WarehousesApi } from "./warehouses.api"; - -export namespace WarehousesQueries { -export const moduleName = QueryModule.Warehouses; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string) => [...keys.all, "/warehouses", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/warehouses/:id", id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create warehouse - * @permission Requires `canUseCreate` ability - * @param { WarehousesModels.CreateWarehouseRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(WarehousesAcl.canUseCreate()); - return WarehousesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated warehouses - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated warehouses - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate warehouse labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate warehouse labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get warehouse by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(WarehousesAcl.canUseFindById()); - return WarehousesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update warehouse - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { WarehousesModels.UpdateWarehouseRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(WarehousesAcl.canUseUpdate()); - return WarehousesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive warehouse - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(WarehousesAcl.canUseArchive()); - return WarehousesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive warehouse - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(WarehousesAcl.canUseUnarchive()); - return WarehousesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/workingDocuments/workingDocuments.acl.ts b/test/generated/base/workingDocuments/workingDocuments.acl.ts deleted file mode 100644 index 344f8c6..0000000 --- a/test/generated/base/workingDocuments/workingDocuments.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List working documents - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument", object) : "WorkingDocument" -] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get working document by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument", object) : "WorkingDocument" -] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocuments/workingDocuments.api.ts b/test/generated/base/workingDocuments/workingDocuments.api.ts deleted file mode 100644 index 471babb..0000000 --- a/test/generated/base/workingDocuments/workingDocuments.api.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; - -export namespace WorkingDocumentsApi { -export const list = (positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, - `/offices/${officeId}/positions/${positionId}/working-documents`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (positionId: string, id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, - - ) -}; -} diff --git a/test/generated/base/workingDocuments/workingDocuments.configs.ts b/test/generated/base/workingDocuments/workingDocuments.configs.ts deleted file mode 100644 index 5e7d622..0000000 --- a/test/generated/base/workingDocuments/workingDocuments.configs.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; -import { WorkingDocumentsQueries } from "./workingDocuments.queries"; -import { WorkingDocumentsAcl } from "./workingDocuments.acl"; - -export namespace WorkingDocumentsConfigs { -export const workingDocumentsConfig = { - meta: { - title: "Working Documents", - }, - readAll: { - acl: WorkingDocumentsAcl.canUseList, - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - paginated: WorkingDocumentsQueries.useList, - infinite: WorkingDocumentsQueries.useListInfinite, - filters: { - schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, - options: { - inputs: { - search: true, - type: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - name: true, - nameSuffix: true, - type: true, - referenceTable: true, - referenceId: true, - createdById: true, - createdAt: true, - createdBy: true, - }, - sortable: WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: WorkingDocumentsAcl.canUseFindById, - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - query: WorkingDocumentsQueries.useFindById, - }, -}; - -} diff --git a/test/generated/base/workingDocuments/workingDocuments.models.ts b/test/generated/base/workingDocuments/workingDocuments.models.ts deleted file mode 100644 index 3386fdc..0000000 --- a/test/generated/base/workingDocuments/workingDocuments.models.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsModels { -/** - * TypeEnumSchema - * @type { enum } - * @description Working document type - */ -export const TypeEnumSchema = z.enum(["export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "shipping-instructions"]); -export type TypeEnum = z.infer; -export const TypeEnum = TypeEnumSchema.enum; - -/** - * WorkingDocumentCreatedByResponseDTOSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } name Employee name - */ -export const WorkingDocumentCreatedByResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullable() }); -export type WorkingDocumentCreatedByResponseDTO = z.infer; - -/** - * WorkingDocumentResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } positionId Position ID - * @property { string } name Working document name - * @property { string } nameSuffix Working document name suffix - * @property { string } type Working document type - * @property { string } referenceTable Reference table - * @property { string } referenceId Reference ID - * @property { string } createdById Created by - * @property { string } createdAt Created at - * @property { WorkingDocumentCreatedByResponseDTO } createdBy Created by - */ -export const WorkingDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), type: TypeEnumSchema, referenceTable: z.string(), referenceId: z.string(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), createdBy: WorkingDocumentCreatedByResponseDTOSchema }); -export type WorkingDocumentResponseDTO = z.infer; - -/** - * WorkingDocumentFilterDtoSchema - * @type { object } - * @property { string } search - * @property { string } type - */ -export const WorkingDocumentFilterDtoSchema = z.object({ search: z.string().nullable(), type: z.string().nullable() }).partial(); -export type WorkingDocumentFilterDto = z.infer; - -/** - * WorkingDocumentsListOrderParamEnumSchema - * @type { enum } - */ -export const WorkingDocumentsListOrderParamEnumSchema = z.enum(["NAME", "TYPE", "CREATED_AT", "UPDATED_AT"]); -export type WorkingDocumentsListOrderParamEnum = z.infer; -export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParamEnumSchema.enum; - -/** - * WorkingDocumentsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { WorkingDocumentResponseDTO[] } items - */ -export const WorkingDocumentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).nullable() }).partial().shape }); -export type WorkingDocumentsListResponse = z.infer; - -} diff --git a/test/generated/base/workingDocuments/workingDocuments.queries.ts b/test/generated/base/workingDocuments/workingDocuments.queries.ts deleted file mode 100644 index 0642218..0000000 --- a/test/generated/base/workingDocuments/workingDocuments.queries.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsAcl } from "./workingDocuments.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; -import { WorkingDocumentsApi } from "./workingDocuments.api"; - -export namespace WorkingDocumentsQueries { -export const moduleName = QueryModule.WorkingDocuments; - -export const keys = { - all: [moduleName] as const, - list: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", positionId, officeId, limit, order, filter, page, cursor] as const, - listInfinite: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", "infinite", positionId, officeId, limit, order, filter, cursor] as const, - findById: (positionId: string, id: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents/:id", positionId, id, officeId] as const, -}; - -/** - * Query `useList` - * @summary List working documents - * @permission Requires `canUseList` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` - * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ positionId, officeId, limit, order, filter, page, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List working documents - * @permission Requires `canUseList` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` - * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ positionId, officeId, limit, order, filter, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get working document by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ positionId, id, officeId }: { positionId: string, id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(positionId, id, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId } )); - return WorkingDocumentsApi.findById(positionId, id, officeId) }, - ...options, - }); -}; - -} diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts deleted file mode 100644 index 80d3476..0000000 --- a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsAmsInstructionsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Create", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useGetAMSInstructionsData` query ability. For global ability, omit the object parameter. - * @description Read AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAMSInstructionsData` query - */ -export const canUseGetAMSInstructionsData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdateAMSInstructionsData` mutation ability. For global ability, omit the object parameter. - * @description Update AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateAMSInstructionsData` mutation - */ -export const canUseUpdateAMSInstructionsData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useDeleteAMSInstructions` mutation ability. For global ability, omit the object parameter. - * @description Delete AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteAMSInstructions` mutation - */ -export const canUseDeleteAMSInstructions = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Delete", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation - */ -export const canUsePreviewAMSInstructions = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerateAMSInstructions` mutation ability. For global ability, omit the object parameter. - * @description Generate AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAMSInstructions` mutation - */ -export const canUseGenerateAMSInstructions = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts deleted file mode 100644 index 1cd287a..0000000 --- a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsAmsInstructionsApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions`, - - ) -}; -export const getAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - - ) -}; -export const updateAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), - - ) -}; -export const deleteAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - - ) -}; -export const previewAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts deleted file mode 100644 index 9f5e94c..0000000 --- a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsAmsInstructionsModels { -/** - * AMSInstructionsDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ -export const AMSInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type AMSInstructionsDocumentPortResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentCityResponseDTOSchema - * @type { object } - * @property { string } id ID of the city - * @property { string } name Name of the city - */ -export const AMSInstructionsDocumentCityResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type AMSInstructionsDocumentCityResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentSignedByResponseDTOSchema - * @type { object } - * @property { string } id ID of the employee - * @property { string } name Name of the employee - */ -export const AMSInstructionsDocumentSignedByResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type AMSInstructionsDocumentSignedByResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const AMSInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentCargoDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { string } containerNumber Container number of the cargo - * @property { number } nrOfPackages Number of packages in the cargo - * @property { string } description Description of the cargo - * @property { number } weight Weight of the cargo - * @property { number } volume Volume of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - */ -export const AMSInstructionsDocumentCargoDTOSchema = z.object({ caseMarks: z.string().nullable(), containerNumber: z.string().nullable(), nrOfPackages: z.number().nullable(), description: z.string().nullable(), weight: z.number().nullable(), volume: z.number().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable() }).partial(); -export type AMSInstructionsDocumentCargoDTO = z.infer; - -/** - * AMSInstructionsDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the AMS Instructions document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the AMS Instructions document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } date Date of the AMS Instructions document - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { CommonModels.EditorContentResponseDto } additionalAMSText Additional AMS text - * @property { string } principalName Principal name - * @property { string } blNumber Bill of lading number - * @property { string } vessel Vessel - * @property { AMSInstructionsDocumentPortResponseDTO } portOfLoading Port of loading - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfDelivery Port of delivery - * @property { AMSInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfIssue Place of issue - * @property { string } dateOfIssue Date of issue - * @property { AMSInstructionsDocumentSignedByResponseDTO } signedBy Signed by - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } deliveryBusinessPartner Delivery business partner - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfAcceptance Port of acceptance - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Also notify party - * @property { string } applyTo Apply to - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string[] } availableContainerNumbers Available container numbers - * @property { string[] } selectedContainerNumbers Selected container numbers - * @property { string[] } selectedContainerLabels Selected container labels - * @property { AMSInstructionsDocumentCargoDTO[] } cargo Cargo information - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - */ -export const AMSInstructionsDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), versionNumber: z.number(), additionalAMSText: CommonModels.EditorContentResponseDtoSchema.nullish(), principalName: z.string().nullish(), blNumber: z.string().nullish(), vessel: z.string().nullish(), portOfLoading: AMSInstructionsDocumentPortResponseDTOSchema.nullish(), placeOfDelivery: AMSInstructionsDocumentCityResponseDTOSchema.nullish(), portOfDischarge: AMSInstructionsDocumentPortResponseDTOSchema.nullish(), placeOfIssue: AMSInstructionsDocumentCityResponseDTOSchema.nullish(), dateOfIssue: z.iso.datetime({ offset: true }).nullish(), signedBy: AMSInstructionsDocumentSignedByResponseDTOSchema.nullish(), deliveryBusinessPartner: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), placeOfAcceptance: AMSInstructionsDocumentCityResponseDTOSchema.nullish(), consignee: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), notify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), alsoNotify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), applyTo: z.string().nullish(), suppressWeight: z.boolean().nullish(), suppressMeasurement: z.boolean().nullish(), availableContainerNumbers: z.array(z.string()).nullish(), selectedContainerNumbers: z.array(z.string()).nullish(), selectedContainerLabels: z.array(z.string()).nullish(), cargo: z.array(AMSInstructionsDocumentCargoDTOSchema).nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.DocumentConfigDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), updatedAt: z.iso.datetime({ offset: true }).nullish() }); -export type AMSInstructionsDocumentResponseDTO = z.infer; - -/** - * UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateAMSInstructionsDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { CommonModels.EditorContentUpdateDto } additionalAMSText Additional AMS text - * @property { string } principalName Principal name - * @property { string } blNumber Bill of lading number - * @property { string } vessel Vessel - * @property { string } portOfLoadingId Port of loading id - * @property { string } placeOfDeliveryId Place of delivery id - * @property { string } portOfDischargeId Port of discharge id - * @property { string } placeOfIssueId Place of issue - * @property { string } dateOfIssue Date of issue - * @property { string } signedById Signed by employee ID - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } deliveryBusinessPartner Delivery business partner - * @property { string } placeOfAcceptanceId Port of acceptance - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party - * @property { string } applyTo Apply to - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string[] } selectedContainerNumbers Selected container numbers - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { string } date Date of the AMS Instructions document - */ -export const UpdateAMSInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), additionalAMSText: CommonModels.EditorContentUpdateDtoSchema.nullable(), principalName: z.string().nullable(), blNumber: z.string().nullable(), vessel: z.string().nullable(), portOfLoadingId: z.string().nullable(), placeOfDeliveryId: z.string().nullable(), portOfDischargeId: z.string().nullable(), placeOfIssueId: z.string().nullable(), dateOfIssue: z.iso.datetime({ offset: true }).nullable(), signedById: z.string().nullable(), deliveryBusinessPartner: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), placeOfAcceptanceId: z.string().nullable(), consignee: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), notify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), alsoNotify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), applyTo: z.string().nullable(), suppressWeight: z.boolean().nullable(), suppressMeasurement: z.boolean().nullable(), selectedContainerNumbers: z.array(z.string()).nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type UpdateAMSInstructionsDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts b/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts deleted file mode 100644 index 7af1284..0000000 --- a/test/generated/base/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsAmsInstructionsAcl } from "./workingDocumentsAmsInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsAmsInstructionsApi } from "./workingDocumentsAmsInstructions.api"; - -export namespace WorkingDocumentsAmsInstructionsQueries { -export const moduleName = QueryModule.WorkingDocumentsAmsInstructions; - -export const keys = { - all: [moduleName] as const, - getAMSInstructionsData: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId", positionId, amsInstructionsId, officeId] as const, - previewAMSInstructions: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId/preview", positionId, amsInstructionsId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an AMS Instructions document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetAMSInstructionsData` - * @summary Get AMS Instructions document data - * @permission Requires `canUseGetAMSInstructionsData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.amsInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetAMSInstructionsData = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData(positionId, amsInstructionsId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateAMSInstructionsData` - * @summary Update AMS Instructions document data - * @permission Requires `canUseUpdateAMSInstructionsData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateAMSInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData(positionId, amsInstructionsId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, amsInstructionsId, officeId } = variables; - const updateKeys = [keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteAMSInstructions` - * @summary Delete AMS Instructions document - * @permission Requires `canUseDeleteAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } AMS Instructions document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions(positionId, amsInstructionsId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewAMSInstructions` - recommended when file should be cached - * @summary Preview AMS Instructions document - * @permission Requires `canUsePreviewAMSInstructions` ability - * @param { string } object.positionId Path parameter - * @param { string } object.amsInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewAMSInstructions = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewAMSInstructionsMutation` - recommended when file should not be cached - * @summary Preview AMS Instructions document - * @permission Requires `canUsePreviewAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewAMSInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, amsInstructionsId, officeId } = variables; - const updateKeys = [keys.previewAMSInstructions(positionId, amsInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateAMSInstructions` - * @summary Generate AMS Instructions document - * @permission Requires `canUseGenerateAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions(positionId, amsInstructionsId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts deleted file mode 100644 index a026b68..0000000 --- a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsBlInstructionsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGetBlInstructionsData` query ability. For global ability, omit the object parameter. - * @description Read BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBlInstructionsData` query - */ -export const canUseGetBlInstructionsData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdateBlInstructionsData` mutation ability. For global ability, omit the object parameter. - * @description Update BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBlInstructionsData` mutation - */ -export const canUseUpdateBlInstructionsData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useDeleteBlInstructions` mutation ability. For global ability, omit the object parameter. - * @description Delete BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBlInstructions` mutation - */ -export const canUseDeleteBlInstructions = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation - */ -export const canUsePreviewBlInstructions = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerateBlInstructions` mutation ability. For global ability, omit the object parameter. - * @description Generate BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateBlInstructions` mutation - */ -export const canUseGenerateBlInstructions = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate BL Instructions document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ -export const canUseGenerateDocumentEml = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts deleted file mode 100644 index 38303db..0000000 --- a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsBlInstructionsApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions`, - - ) -}; -export const getBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - - ) -}; -export const updateBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), - - ) -}; -export const deleteBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - - ) -}; -export const previewBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -export const generateDocumentEml = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts deleted file mode 100644 index cfea1e8..0000000 --- a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsBlInstructionsModels { -/** - * BlInstructionsDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { string } date Date - * @property { string } location Location - * @property { string } signer Siger - */ -export const BlInstructionsDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), date: z.iso.datetime({ offset: true }).nullable(), location: z.string().nullable(), signer: z.string().nullable() }).partial(); -export type BlInstructionsDocumentSettingsDtoDTO = z.infer; - -/** - * BlInstructionsDocumentCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ -export const BlInstructionsDocumentCountryResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type BlInstructionsDocumentCountryResponseDTO = z.infer; - -/** - * BlInstructionsDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - * @property { string } eori EORI number of the business partner - * @property { string } vatNumber VAT number of the business partner - */ -export const BlInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable(), eori: z.string().nullable(), vatNumber: z.string().nullable() }).partial(); -export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * BlInstructionsDocumentPlaceResponseDTOSchema - * @type { object } - * @property { string } id ID of the place - * @property { string } name Name of the place - */ -export const BlInstructionsDocumentPlaceResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type BlInstructionsDocumentPlaceResponseDTO = z.infer; - -/** - * AllChargesEnumSchema - * @type { enum } - */ -export const AllChargesEnumSchema = z.enum(["Prepaid", "Collect", "Automatic", "Detailed"]); -export type AllChargesEnum = z.infer; -export const AllChargesEnum = AllChargesEnumSchema.enum; - -/** - * BlInstructionsDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - * @property { string } countryCode Country ISO2 code of the port - */ -export const BlInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), countryCode: z.string().nullable() }).partial(); -export type BlInstructionsDocumentPortResponseDTO = z.infer; - -/** - * RequestedDocumentTypeEnumSchema - * @type { enum } - */ -export const RequestedDocumentTypeEnumSchema = z.enum(["SeawayBill", "Original"]); -export type RequestedDocumentTypeEnum = z.infer; -export const RequestedDocumentTypeEnum = RequestedDocumentTypeEnumSchema.enum; - -/** - * ManifestFilerStatusEnumSchema - * @type { enum } - */ -export const ManifestFilerStatusEnumSchema = z.enum(["Self", "Carrier"]); -export type ManifestFilerStatusEnum = z.infer; -export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; - -/** - * BlInstructionsDocumentCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type BlInstructionsDocumentCountryDto = z.infer; - -/** - * BlInstructionsDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the BL Instructions document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the BL Instructions document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } date Date of the BL Instructions document - * @property { string } blNumber Bill of lading number - * @property { string } exportReference Export reference number - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { BlInstructionsDocumentCountryResponseDTO } originCountry Origin country - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } additionalText Additional text for the document - * @property { number } versionNumber Version number of the document - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } buyer Buyer information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } seller Seller information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } forwarder Forwarder party information - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information - * @property { BlInstructionsDocumentPlaceResponseDTO } stowedIntoContainerCity Stowed into container city information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfAcceptanceCity Place of acceptance city information - * @property { BlInstructionsDocumentPlaceResponseDTO } originalsToBeReleasedAt - * @property { string } originalsToBeReleasedAtText - * @property { BlInstructionsDocumentPlaceResponseDTO } loadingPierTerminal - * @property { string } loadingPierTerminalText - * @property { string } precarriageByText - * @property { string } placeOfReceiptText - * @property { string } portOfLoadingText - * @property { string } portOfDischargeText - * @property { string } placeOfDeliveryText - * @property { string } vessel Name of the vessel - * @property { string } voyage Name of the vessel - * @property { CommonModels.MovementTypeEnum } movementType - * @property { string } carrierBookingNumber - * @property { string } csnNumber - * @property { string } mcinNumber - * @property { string } pcinNumber - * @property { string } dueNumber - * @property { boolean } goodsDeliveredInEu - * @property { string } rucNumber - * @property { number } shipmentDeclaredValue - * @property { string } shipmentDeclaredValueCurrency - * @property { AllChargesEnum } allCharges Base freight payment term - * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term - * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term - * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term - * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term - * @property { string } shippingInstructionsComments Free-text shipping instructions comments - * @property { string } chargePayerId Charge payer business partner ID - * @property { string } chargePayLocationId Charge pay location ID - * @property { BlInstructionsDocumentPortResponseDTO } portOfLoading Port of loading information - * @property { BlInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information - * @property { BlInstructionsDocumentSettingsDtoDTO } settings Settings for the BL Instructions document - * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data - * @property { CommonModels.CargoTableBlockDto } cargo Cargo table block (identical to House BL cargo) - * @property { string } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document - * @property { RequestedDocumentTypeEnum } requestedDocumentType - * @property { boolean } requestedDocumentFreighted - * @property { number } requestedDocumentQuantity - * @property { ManifestFilerStatusEnum } manifestFilerStatus - * @property { string } manifestFilerIdentifier - * @property { BlInstructionsDocumentCountryDto } manifestFilingCountry - */ -export const BlInstructionsDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).nullish(), blNumber: z.string().nullish(), exportReference: z.string().nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), originCountry: BlInstructionsDocumentCountryResponseDTOSchema.nullish(), useLatterOfCredit: z.boolean().nullish(), additionalText: z.string().nullish(), versionNumber: z.number(), buyer: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), seller: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, shipper: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, notify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, alsoNotify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, forwarder: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, precarriageBy: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), placeOfReceipt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), stowedIntoContainerCity: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), placeOfAcceptanceCity: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAtText: z.string().nullish(), loadingPierTerminal: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), loadingPierTerminalText: z.string().nullish(), precarriageByText: z.string().nullish(), placeOfReceiptText: z.string().nullish(), portOfLoadingText: z.string().nullish(), portOfDischargeText: z.string().nullish(), placeOfDeliveryText: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), movementType: CommonModels.MovementTypeEnumSchema.nullish(), carrierBookingNumber: z.string().nullish(), csnNumber: z.string().nullish(), mcinNumber: z.string().nullish(), pcinNumber: z.string().nullish(), dueNumber: z.string().nullish(), goodsDeliveredInEu: z.boolean().nullish(), rucNumber: z.string().nullish(), shipmentDeclaredValue: z.number().nullish(), shipmentDeclaredValueCurrency: z.string().nullish(), allCharges: AllChargesEnumSchema.nullish(), baseFreight: CommonModels.ChargePaymentEnumSchema.nullish(), additionalCharges: CommonModels.ChargePaymentEnumSchema.nullish(), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullish(), originPortCharges: CommonModels.ChargePaymentEnumSchema.nullish(), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.nullish(), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullish(), shippingInstructionsComments: z.string().nullish(), chargePayerId: z.string().nullish(), chargePayLocationId: z.string().nullish(), portOfLoading: BlInstructionsDocumentPortResponseDTOSchema.nullish(), portOfDischarge: BlInstructionsDocumentPortResponseDTOSchema.nullish(), placeOfDelivery: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), settings: BlInstructionsDocumentSettingsDtoDTOSchema.nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.nullish(), cargo: CommonModels.CargoTableBlockDtoSchema.nullish(), bodyRemarks: z.string().nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.DocumentConfigDTOSchema, requestedDocumentType: RequestedDocumentTypeEnumSchema.nullish(), requestedDocumentFreighted: z.boolean().nullish(), requestedDocumentQuantity: z.number().nullish(), manifestFilerStatus: ManifestFilerStatusEnumSchema.nullish(), manifestFilerIdentifier: z.string().nullish(), manifestFilingCountry: BlInstructionsDocumentCountryDtoSchema.nullish() }); -export type BlInstructionsDocumentResponseDTO = z.infer; - -/** - * UpdateBlInstructionsDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { string } blNumber BL number - * @property { string } exportReference Export reference number - * @property { string } location Location - * @property { string } signer Signer - * @property { string } date Date - */ -export const UpdateBlInstructionsDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), blNumber: z.string().nullable(), exportReference: z.string().nullable(), location: z.string().nullable(), signer: z.string().nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer; - -/** - * UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateBlInstructionsDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } blNumber Bill of lading number - * @property { string } exportReference Export reference number - * @property { string } csnNumber - * @property { string } mcinNumber - * @property { string } pcinNumber - * @property { string } dueNumber - * @property { boolean } goodsDeliveredInEu - * @property { string } rucNumber - * @property { string } shipmentDeclaredValueCurrency - * @property { number } shipmentDeclaredValue - * @property { AllChargesEnum } allCharges All charges payment term - * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term - * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term - * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term - * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term - * @property { string } originCountryId Origin country ID - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } additionalText Additional text - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } buyer Buyer information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } seller Seller information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } forwarder Forwarder information - * @property { string } originalsToBeReleasedAtId Originals to be released at ID - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information - * @property { string } shippingInstructionsComments Shipping instructions free-text comments - * @property { string } chargePayerId Charge payer business partner ID - * @property { string } chargePayLocationId Charge pay location ID - * @property { string } precarriageById Pre-carriage by ID - * @property { string } placeOfReceiptId Place of receipt ID - * @property { string } stowedIntoContainerCityId Stowed into container city ID - * @property { string } loadingPierTerminalId Loading pier/terminal ID - * @property { string } loadingPierTerminalText - * @property { string } placeOfAcceptanceCityId Place of acceptance city ID - * @property { string } vessel Vessel name - * @property { string } voyage Vessel name - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } portOfLoadingId Port of loading ID - * @property { string } portOfDischargeId Port of discharge ID - * @property { string } placeOfDeliveryId Place of delivery ID - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { string } date Date of the BL Instructions document - * @property { UpdateBlInstructionsDocumentSettingsRequestDTO } settings Settings - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data - * @property { RequestedDocumentTypeEnum } requestedDocumentType - * @property { boolean } requestedDocumentFreighted - * @property { number } requestedDocumentQuantity - * @property { string } precarriageByText - * @property { string } placeOfReceiptText - * @property { string } portOfLoadingText - * @property { string } portOfDischargeText - * @property { string } placeOfDeliveryText - * @property { ManifestFilerStatusEnum } manifestFilerStatus - * @property { string } manifestFilingCountryId - * @property { string } manifestFilerIdentifier - */ -export const UpdateBlInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), blNumber: z.string().nullable(), exportReference: z.string().nullable(), csnNumber: z.string().nullable(), mcinNumber: z.string().nullable(), pcinNumber: z.string().nullable(), dueNumber: z.string().nullable(), goodsDeliveredInEu: z.boolean().nullable(), rucNumber: z.string().nullable(), shipmentDeclaredValueCurrency: z.string().nullable(), shipmentDeclaredValue: z.number().nullable(), allCharges: AllChargesEnumSchema.nullable(), baseFreight: CommonModels.ChargePaymentEnumSchema.nullable(), additionalCharges: CommonModels.ChargePaymentEnumSchema.nullable(), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullable(), originPortCharges: CommonModels.ChargePaymentEnumSchema.nullable(), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.nullable(), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullable(), originCountryId: z.string().nullable(), useLatterOfCredit: z.boolean().nullable(), additionalText: z.string().nullable(), consignee: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), buyer: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), seller: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), forwarder: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), originalsToBeReleasedAtId: z.string().nullable(), originalsToBeReleasedAtText: z.string().nullable(), notify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), alsoNotify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), shippingInstructionsComments: z.string().nullable(), chargePayerId: z.string().nullable(), chargePayLocationId: z.string().nullable(), precarriageById: z.string().nullable(), placeOfReceiptId: z.string().nullable(), stowedIntoContainerCityId: z.string().nullable(), loadingPierTerminalId: z.string().nullable(), loadingPierTerminalText: z.string().nullable(), placeOfAcceptanceCityId: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), carrierBookingNumber: z.string().nullable(), portOfLoadingId: z.string().nullable(), portOfDischargeId: z.string().nullable(), placeOfDeliveryId: z.string().nullable(), suppressWeight: z.boolean().nullable(), suppressMeasurement: z.boolean().nullable(), bodyRemarks: z.string().nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), date: z.iso.datetime({ offset: true }).nullable(), settings: UpdateBlInstructionsDocumentSettingsRequestDTOSchema.nullable(), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.nullable(), requestedDocumentType: RequestedDocumentTypeEnumSchema.nullable(), requestedDocumentFreighted: z.boolean().nullable(), requestedDocumentQuantity: z.number().nullable(), precarriageByText: z.string().nullable(), placeOfReceiptText: z.string().nullable(), portOfLoadingText: z.string().nullable(), portOfDischargeText: z.string().nullable(), placeOfDeliveryText: z.string().nullable(), manifestFilerStatus: ManifestFilerStatusEnumSchema.nullable(), manifestFilingCountryId: z.string().nullable(), manifestFilerIdentifier: z.string().nullable() }).partial(); -export type UpdateBlInstructionsDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts b/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts deleted file mode 100644 index fcc46e2..0000000 --- a/test/generated/base/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsBlInstructionsAcl } from "./workingDocumentsBlInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsBlInstructionsApi } from "./workingDocumentsBlInstructions.api"; - -export namespace WorkingDocumentsBlInstructionsQueries { -export const moduleName = QueryModule.WorkingDocumentsBlInstructions; - -export const keys = { - all: [moduleName] as const, - getBlInstructionsData: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId", positionId, blInstructionsId, officeId] as const, - previewBlInstructions: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId/preview", positionId, blInstructionsId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a BL Instructions document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId } )); - return WorkingDocumentsBlInstructionsApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetBlInstructionsData` - * @summary Get BL Instructions document data - * @permission Requires `canUseGetBlInstructionsData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.blInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBlInstructionsData = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId } )); - return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateBlInstructionsData` - * @summary Update BL Instructions document data - * @permission Requires `canUseUpdateBlInstructionsData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBlInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId } )); - return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData(positionId, blInstructionsId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.getBlInstructionsData(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteBlInstructions` - * @summary Delete BL Instructions document - * @permission Requires `canUseDeleteBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } BL Instructions document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewBlInstructions` - recommended when file should be cached - * @summary Preview BL Instructions document - * @permission Requires `canUsePreviewBlInstructions` ability - * @param { string } object.positionId Path parameter - * @param { string } object.blInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewBlInstructions = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewBlInstructionsMutation` - recommended when file should not be cached - * @summary Preview BL Instructions document - * @permission Requires `canUsePreviewBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewBlInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateBlInstructions` - * @summary Generate BL Instructions document - * @permission Requires `canUseGenerateBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.generateBlInstructions(positionId, blInstructionsId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate BL Instructions document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsBlInstructionsApi.generateDocumentEml(positionId, blInstructionsId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts deleted file mode 100644 index 0454eb2..0000000 --- a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsCmrFormAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Create", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useGetCmrData` query ability. For global ability, omit the object parameter. - * @description Read CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCmrData` query - */ -export const canUseGetCmrData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useUpdateCmrData` mutation ability. For global ability, omit the object parameter. - * @description Update CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCmrData` mutation - */ -export const canUseUpdateCmrData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useDeleteCmr` mutation ability. For global ability, omit the object parameter. - * @description Delete CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCmr` mutation - */ -export const canUseDeleteCmr = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Delete", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `usePreviewCmr` query or `usePreviewCmrMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewCmr` query or `usePreviewCmrMutation` mutation - */ -export const canUsePreviewCmr = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useGenerateCmr` mutation ability. For global ability, omit the object parameter. - * @description Generate CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateCmr` mutation - */ -export const canUseGenerateCmr = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts deleted file mode 100644 index 2dc6978..0000000 --- a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsCmrFormApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs`, - - ) -}; -export const getCmrData = (positionId: string, cmrId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - - ) -}; -export const updateCmrData = (positionId: string, cmrId: string, officeId: string, data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), - - ) -}; -export const deleteCmr = (positionId: string, cmrId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - - ) -}; -export const previewCmr = (positionId: string, cmrId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateCmr = (positionId: string, cmrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts deleted file mode 100644 index c49f127..0000000 --- a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsCmrFormModels { -/** - * CmrDocumentLanguageSchema - * @type { enum } - */ -export const CmrDocumentLanguageSchema = z.enum(["en", "fr", "de"]); -export type CmrDocumentLanguage = z.infer; -export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; - -/** - * CmrDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CmrDocumentLanguage } primaryLanguage Primary language - * @property { CmrDocumentLanguage } secondaryLanguage Secondary language - */ -export const CmrDocumentSettingsDtoDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.nullable(), secondaryLanguage: CmrDocumentLanguageSchema.nullable() }).partial(); -export type CmrDocumentSettingsDtoDTO = z.infer; - -/** - * CmrDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const CmrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type CmrDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * CmrDocumentCityResponseDTOSchema - * @type { object } - * @property { string } cityId ID of the city - * @property { string } cityName Name of the city - * @property { string } date Date of delivery/takeover - * @property { string } countryName Country name - */ -export const CmrDocumentCityResponseDTOSchema = z.object({ cityId: z.string(), cityName: z.string(), date: z.iso.datetime({ offset: true }).nullish(), countryName: z.string().nullish() }); -export type CmrDocumentCityResponseDTO = z.infer; - -/** - * CmrDocumentCostsResponseDTOSchema - * @type { object } - * @property { number } carriageCharges Carriage charges - * @property { number } reductions Reductions - * @property { number } balance Balance - * @property { number } supplements Supplements - * @property { number } miscellaneous Miscellaneous charges - * @property { number } total Total amount - */ -export const CmrDocumentCostsResponseDTOSchema = z.object({ carriageCharges: z.number().nullable(), reductions: z.number().nullable(), balance: z.number().nullable(), supplements: z.number().nullable(), miscellaneous: z.number().nullable(), total: z.number().nullable() }).partial(); -export type CmrDocumentCostsResponseDTO = z.infer; - -/** - * CmrDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { number } quantity Quantity of packages - * @property { string } description Description of the cargo - * @property { string } packageType - * @property { string } statisticNumber - * @property { string } positionNumber Position number of the cargo - * @property { number } grossWeight Gross weight of the cargo - * @property { number } volume Volume of the cargo - * @property { string } containerNumber Container number of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - */ -export const CmrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().nullable(), quantity: z.number().nullable(), description: z.string().nullable(), packageType: z.string().nullable(), statisticNumber: z.string().nullable(), positionNumber: z.string().nullable(), grossWeight: z.number().nullable(), volume: z.number().nullable(), containerNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable() }).partial(); -export type CmrDocumentCargoResponseDTO = z.infer; - -/** - * CmrDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } positionNumber Position number - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { number } versionNumber Version number of the document - * @property { string } cmrNumber CMR number - * @property { CmrDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { CmrDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { CmrDocumentBusinessPartnerResponseDTO } carrier Carrier information - * @property { CmrDocumentBusinessPartnerResponseDTO } successiveCarrier Successive carrier information - * @property { CmrDocumentCityResponseDTO } delivery Delivery information - * @property { CmrDocumentCityResponseDTO } takeover Takeover information - * @property { string } annexedDocuments Annexed documents - * @property { string } carriersObservations Carriers observations - * @property { string } senderInstructions Sender instructions - * @property { string } reimbursement Reimbursement information - * @property { string } specialAgreements Special agreements - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { boolean } freightPaid Whether freight is paid - * @property { boolean } freightToBePaid Whether freight is to be paid - * @property { string } creationPlace Place of creation - * @property { string } creationDate Date of creation - * @property { CmrDocumentCostsResponseDTO } costsForShipper Costs for shipper - * @property { CmrDocumentCostsResponseDTO } costsForConsignee Costs for consignee - * @property { string[] } selectedCargoIds List of selected cargo IDs - * @property { CmrDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CmrDocumentSettingsDtoDTO } settings Settings for the BL Instructions document - */ -export const CmrDocumentResponseDTOSchema = z.object({ id: z.string(), name: z.string(), positionNumber: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), positionId: z.string(), versionNumber: z.number(), cmrNumber: z.string().nullish(), consignee: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), carrier: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), successiveCarrier: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), delivery: CmrDocumentCityResponseDTOSchema.nullish(), takeover: CmrDocumentCityResponseDTOSchema.nullish(), annexedDocuments: z.string().nullish(), carriersObservations: z.string().nullish(), senderInstructions: z.string().nullish(), reimbursement: z.string().nullish(), specialAgreements: z.string().nullish(), suppressWeight: z.boolean(), suppressMeasurement: z.boolean(), freightPaid: z.boolean(), freightToBePaid: z.boolean(), creationPlace: z.string(), creationDate: z.string(), costsForShipper: CmrDocumentCostsResponseDTOSchema.nullish(), costsForConsignee: CmrDocumentCostsResponseDTOSchema.nullish(), selectedCargoIds: z.array(z.string()), cargo: z.array(CmrDocumentCargoResponseDTOSchema).nullish(), config: CommonModels.HBLDocumentConfigDtoSchema, bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), settings: CmrDocumentSettingsDtoDTOSchema.nullish() }); -export type CmrDocumentResponseDTO = z.infer; - -/** - * UpdateCmrDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CmrDocumentLanguage } primaryLanguage Primary language - * @property { CmrDocumentLanguage } secondaryLanguage Secondary language - */ -export const UpdateCmrDocumentSettingsRequestDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.nullable(), secondaryLanguage: CmrDocumentLanguageSchema.nullable() }).partial(); -export type UpdateCmrDocumentSettingsRequestDTO = z.infer; - -/** - * UpdateCmrDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateCmrDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateCmrDocumentDeliveryRequestDTOSchema - * @type { object } - * @property { string } cityId City ID - * @property { string } cityName City name - * @property { string } date Date - */ -export const UpdateCmrDocumentDeliveryRequestDTOSchema = z.object({ cityId: z.string().nullable(), cityName: z.string().nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; - -/** - * UpdateCmrDocumentCostsRequestDTOSchema - * @type { object } - * @property { number } carriageCharges Carriage charges - * @property { number } reductions Reductions - * @property { number } balance Balance - * @property { number } supplements Supplements - * @property { number } miscellaneous Miscellaneous - * @property { number } total Total - */ -export const UpdateCmrDocumentCostsRequestDTOSchema = z.object({ carriageCharges: z.number().nullable(), reductions: z.number().nullable(), balance: z.number().nullable(), supplements: z.number().nullable(), miscellaneous: z.number().nullable(), total: z.number().nullable() }).partial(); -export type UpdateCmrDocumentCostsRequestDTO = z.infer; - -/** - * UpdateCmrDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } cmrNumber CMR number - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } carrier Carrier information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } successiveCarrier Successive carrier information - * @property { UpdateCmrDocumentDeliveryRequestDTO } delivery Delivery information - * @property { UpdateCmrDocumentDeliveryRequestDTO } takeover Takeover information - * @property { string } annexedDocuments Annexed documents - * @property { string } carriersObservations Carriers observations - * @property { string } senderInstructions Sender instructions - * @property { string } reimbursement Reimbursement - * @property { string } specialAgreements Special agreements - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { boolean } freightPaid Whether freight is paid - * @property { boolean } freightToBePaid Whether freight is to be paid - * @property { string } creationPlace Place of creation - * @property { string } creationDate Date of creation - * @property { UpdateCmrDocumentCostsRequestDTO } costsForShipper Costs for shipper - * @property { UpdateCmrDocumentCostsRequestDTO } costsForConsignee Costs for consignee - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { UpdateCmrDocumentSettingsRequestDTO } settings Settings - */ -export const UpdateCmrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), cmrNumber: z.string().nullable(), consignee: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), carrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), successiveCarrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), delivery: UpdateCmrDocumentDeliveryRequestDTOSchema.nullable(), takeover: UpdateCmrDocumentDeliveryRequestDTOSchema.nullable(), annexedDocuments: z.string().nullable(), carriersObservations: z.string().nullable(), senderInstructions: z.string().nullable(), reimbursement: z.string().nullable(), specialAgreements: z.string().nullable(), suppressWeight: z.boolean().nullable(), suppressMeasurement: z.boolean().nullable(), freightPaid: z.boolean().nullable(), freightToBePaid: z.boolean().nullable(), creationPlace: z.string().nullable(), creationDate: z.string().nullable(), costsForShipper: UpdateCmrDocumentCostsRequestDTOSchema.nullable(), costsForConsignee: UpdateCmrDocumentCostsRequestDTOSchema.nullable(), selectedCargoIds: z.array(z.string()).nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), settings: UpdateCmrDocumentSettingsRequestDTOSchema.nullable() }).partial(); -export type UpdateCmrDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts b/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts deleted file mode 100644 index 15d2a7c..0000000 --- a/test/generated/base/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsCmrFormAcl } from "./workingDocumentsCmrForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsCmrFormApi } from "./workingDocumentsCmrForm.api"; - -export namespace WorkingDocumentsCmrFormQueries { -export const moduleName = QueryModule.WorkingDocumentsCmrForm; - -export const keys = { - all: [moduleName] as const, - getCmrData: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId", positionId, cmrId, officeId] as const, - previewCmr: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId/preview", positionId, cmrId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a CMR document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsCmrFormApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetCmrData` - * @summary Get CMR document data - * @permission Requires `canUseGetCmrData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.cmrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCmrData = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCmrData(positionId, cmrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId } )); - return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCmrData` - * @summary Update CMR document data - * @permission Requires `canUseUpdateCmrData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCmrData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId, data }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId } )); - return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, cmrId, officeId } = variables; - const updateKeys = [keys.getCmrData(positionId, cmrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteCmr` - * @summary Delete CMR document - * @permission Requires `canUseDeleteCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } CMR document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteCmr = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewCmr` - recommended when file should be cached - * @summary Preview CMR document - * @permission Requires `canUsePreviewCmr` ability - * @param { string } object.positionId Path parameter - * @param { string } object.cmrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewCmr = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewCmr(positionId, cmrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewCmrMutation` - recommended when file should not be cached - * @summary Preview CMR document - * @permission Requires `canUsePreviewCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewCmrMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, cmrId, officeId } = variables; - const updateKeys = [keys.previewCmr(positionId, cmrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateCmr` - * @summary Generate CMR document - * @permission Requires `canUseGenerateCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateCmr = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId, data }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts deleted file mode 100644 index bd69b52..0000000 --- a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsExportDeclarationAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Create", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useGetExportDeclarationData` query ability. For global ability, omit the object parameter. - * @description Read export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetExportDeclarationData` query - */ -export const canUseGetExportDeclarationData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useUpdateExportDeclarationData` mutation ability. For global ability, omit the object parameter. - * @description Update export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateExportDeclarationData` mutation - */ -export const canUseUpdateExportDeclarationData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useDeleteExportDeclaration` mutation ability. For global ability, omit the object parameter. - * @description Delete export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteExportDeclaration` mutation - */ -export const canUseDeleteExportDeclaration = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Delete", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation - */ -export const canUsePreviewExportDeclaration = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useGenerateExportDeclaration` mutation ability. For global ability, omit the object parameter. - * @description Generate export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateExportDeclaration` mutation - */ -export const canUseGenerateExportDeclaration = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts deleted file mode 100644 index 2b577d4..0000000 --- a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsExportDeclarationApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations`, - - ) -}; -export const getExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - - ) -}; -export const updateExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), - - ) -}; -export const deleteExportDeclaration = (positionId: string, exportDeclarationId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - - ) -}; -export const previewExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts deleted file mode 100644 index 4394ac8..0000000 --- a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsExportDeclarationModels { -/** - * ExportDeclarationDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * ExportDeclarationDocumentCargoResponseDTOSchema - * @type { object } - * @property { number } quantity Quantity of packages - * @property { number } weight Weight of the cargo - * @property { number } length Length of the cargo - * @property { number } width Width of the cargo - * @property { number } height Height of the cargo - * @property { string } packageType Type of package - * @property { string } positionNumber Position number - */ -export const ExportDeclarationDocumentCargoResponseDTOSchema = z.object({ quantity: z.number(), weight: z.number(), length: z.number(), width: z.number(), height: z.number(), packageType: z.string(), positionNumber: z.string() }); -export type ExportDeclarationDocumentCargoResponseDTO = z.infer; - -/** - * ExportDeclarationDocumentRouteResponseDTOSchema - * @type { object } - * @property { string } pickupDate Pickup date - * @property { string } deliveryDate Delivery date - * @property { string } pickupCity Pickup city - * @property { string } deliveryCity Delivery city - */ -export const ExportDeclarationDocumentRouteResponseDTOSchema = z.object({ pickupDate: z.string(), deliveryDate: z.string(), pickupCity: z.string(), deliveryCity: z.string() }); -export type ExportDeclarationDocumentRouteResponseDTO = z.infer; - -/** - * ExportDeclarationDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the export declaration document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the export declaration document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } dateOfHandover Date when the goods are handed over for export - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { string } issuerName Name of the issuer - * @property { string } issuerAddress Address of the issuer - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } customer Customer information - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { string } selectedCargoId ID of the selected cargo - * @property { ExportDeclarationDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { ExportDeclarationDocumentRouteResponseDTO } route Route information - * @property { string } signingPlace Place where the document is signed - * @property { string } signingDate Date when the document is signed - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } signedBy Information about who signed the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ -export const ExportDeclarationDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), dateOfHandover: z.iso.datetime({ offset: true }).nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), versionNumber: z.number(), issuerName: z.string().nullish(), issuerAddress: z.string().nullish(), customer: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), selectedCargoId: z.string().nullish(), cargo: z.array(ExportDeclarationDocumentCargoResponseDTOSchema).nullish(), route: ExportDeclarationDocumentRouteResponseDTOSchema.nullish(), signingPlace: z.string().nullish(), signingDate: z.iso.datetime({ offset: true }).nullish(), signedBy: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.nullish() }); -export type ExportDeclarationDocumentResponseDTO = z.infer; - -/** - * UpdateExportDeclarationDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } dateOfHandover Date when goods are handed over for export - * @property { string } issuerName Name of the issuer - * @property { string } issuerAddress Address of the issuer - * @property { string } customerId Customer ID - * @property { string } customerAddress Customer address - * @property { string } shipperId Shipper ID - * @property { string } shipperAddress Shipper address - * @property { string } consigneeId Consignee ID - * @property { string } consigneeAddress Consignee address - * @property { string } selectedCargoId Selected cargo ID - * @property { string } signingPlace Place where the document is signed - * @property { string } signingDate Date when the document is signed - * @property { string } signedByEmployeeId ID of the employee who signed the document - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateExportDeclarationDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), dateOfHandover: z.iso.datetime({ offset: true }).nullable(), issuerName: z.string().nullable(), issuerAddress: z.string().nullable(), customerId: z.string().nullable(), customerAddress: z.string().nullable(), shipperId: z.string().nullable(), shipperAddress: z.string().nullable(), consigneeId: z.string().nullable(), consigneeAddress: z.string().nullable(), selectedCargoId: z.string().nullable(), signingPlace: z.string().nullable(), signingDate: z.iso.datetime({ offset: true }).nullable(), signedByEmployeeId: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateExportDeclarationDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts b/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts deleted file mode 100644 index 802056c..0000000 --- a/test/generated/base/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsExportDeclarationAcl } from "./workingDocumentsExportDeclaration.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsExportDeclarationApi } from "./workingDocumentsExportDeclaration.api"; - -export namespace WorkingDocumentsExportDeclarationQueries { -export const moduleName = QueryModule.WorkingDocumentsExportDeclaration; - -export const keys = { - all: [moduleName] as const, - getExportDeclarationData: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId", officeId, positionId, exportDeclarationId] as const, - previewExportDeclaration: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId/preview", officeId, positionId, exportDeclarationId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an export declaration document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId } )); - return WorkingDocumentsExportDeclarationApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetExportDeclarationData` - * @summary Get export declaration document data - * @permission Requires `canUseGetExportDeclarationData` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.exportDeclarationId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetExportDeclarationData = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), - queryFn: () => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId } )); - return WorkingDocumentsExportDeclarationApi.getExportDeclarationData(officeId, positionId, exportDeclarationId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateExportDeclarationData` - * @summary Update export declaration document data - * @permission Requires `canUseUpdateExportDeclarationData` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateExportDeclarationData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId } )); - return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData(officeId, positionId, exportDeclarationId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, exportDeclarationId } = variables; - const updateKeys = [keys.getExportDeclarationData(officeId, positionId, exportDeclarationId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteExportDeclaration` - * @summary Delete export declaration document - * @permission Requires `canUseDeleteExportDeclaration` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Export declaration document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, exportDeclarationId, officeId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration(positionId, exportDeclarationId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewExportDeclaration` - recommended when file should be cached - * @summary Preview export declaration document - * @permission Requires `canUsePreviewExportDeclaration` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.exportDeclarationId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewExportDeclaration = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), - queryFn: () => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewExportDeclarationMutation` - recommended when file should not be cached - * @summary Preview export declaration document - * @permission Requires `canUsePreviewExportDeclaration` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewExportDeclarationMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, exportDeclarationId } = variables; - const updateKeys = [keys.previewExportDeclaration(officeId, positionId, exportDeclarationId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateExportDeclaration` - * @summary Generate export declaration document - * @permission Requires `canUseGenerateExportDeclaration` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.generateExportDeclaration(officeId, positionId, exportDeclarationId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts deleted file mode 100644 index 9c5da4d..0000000 --- a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsFcrFormAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Create", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useGetFcrData` query ability. For global ability, omit the object parameter. - * @description Read FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetFcrData` query - */ -export const canUseGetFcrData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useUpdateFcrData` mutation ability. For global ability, omit the object parameter. - * @description Update FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateFcrData` mutation - */ -export const canUseUpdateFcrData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useDeleteFcr` mutation ability. For global ability, omit the object parameter. - * @description Delete FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteFcr` mutation - */ -export const canUseDeleteFcr = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Delete", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `usePreviewFcr` query or `usePreviewFcrMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewFcr` query or `usePreviewFcrMutation` mutation - */ -export const canUsePreviewFcr = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useGenerateFcr` mutation ability. For global ability, omit the object parameter. - * @description Generate FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateFcr` mutation - */ -export const canUseGenerateFcr = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts deleted file mode 100644 index 3cc1061..0000000 --- a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsFcrFormApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs`, - - ) -}; -export const getFcrData = (positionId: string, fcrId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - - ) -}; -export const updateFcrData = (positionId: string, fcrId: string, officeId: string, data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), - - ) -}; -export const deleteFcr = (positionId: string, fcrId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - - ) -}; -export const previewFcr = (positionId: string, fcrId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateFcr = (positionId: string, fcrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts deleted file mode 100644 index 4979e6e..0000000 --- a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsFcrFormModels { -/** - * FcrDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const FcrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type FcrDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * FcrDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { string } containerNumber Container number - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - * @property { number } quantity Quantity of the cargo - * @property { string } description Description of the cargo - * @property { number } weight Weight of the cargo - * @property { number } volume Volume of the cargo - */ -export const FcrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().nullable(), containerNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), quantity: z.number().nullable(), description: z.string().nullable(), weight: z.number().nullable(), volume: z.number().nullable() }).partial(); -export type FcrDocumentCargoResponseDTO = z.infer; - -/** - * FcrDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { number } versionNumber Version number of the document - * @property { string } fcrNumber FCR number - * @property { string } edvNumber EDV number - * @property { number } numberOfOriginals Number of originals - * @property { string } placeOfLoading Place of loading - * @property { string } dateOfLoading Date of loading - * @property { string } viaCity Via city - * @property { string } toDestination To destination - * @property { string } transportMode Transport mode - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } issuePlace Issue place - * @property { string } issueDate Issue date - * @property { string } deliveryTerms Delivery terms - * @property { FcrDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { FcrDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { FcrDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ -export const FcrDocumentResponseDTOSchema = z.object({ id: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), positionId: z.string(), positionNumber: z.string(), versionNumber: z.number(), fcrNumber: z.string().nullish(), edvNumber: z.string().nullish(), numberOfOriginals: z.number(), placeOfLoading: z.string().nullish(), dateOfLoading: z.iso.datetime({ offset: true }).nullish(), viaCity: z.string().nullish(), toDestination: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), issuePlace: z.string().nullish(), issueDate: z.iso.datetime({ offset: true }).nullish(), deliveryTerms: z.string().nullish(), shipper: FcrDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: FcrDocumentBusinessPartnerResponseDTOSchema.nullish(), cargo: z.array(FcrDocumentCargoResponseDTOSchema).nullish(), config: CommonModels.HBLDocumentConfigDtoSchema }); -export type FcrDocumentResponseDTO = z.infer; - -/** - * UpdateFcrDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } fcrNumber FCR number - * @property { string } edvNumber EDV number - * @property { number } numberOfOriginals Number of originals - * @property { string } placeOfLoading Place of loading - * @property { string } dateOfLoading Date of loading - * @property { string } viaCity Via city - * @property { string } toDestination To destination - * @property { string } transportMode Transport mode - * @property { string } issuePlace Issue place - * @property { string } issueDate Issue date - * @property { string } deliveryTerms Delivery terms - * @property { string } shipperId Shipper ID - * @property { string } shipperAddress Shipper address - * @property { string } consigneeId Consignee ID - * @property { string } consigneeAddress Consignee address - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateFcrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), fcrNumber: z.string().nullable(), edvNumber: z.string().nullable(), numberOfOriginals: z.number().nullable(), placeOfLoading: z.string().nullable(), dateOfLoading: z.iso.datetime({ offset: true }).nullable(), viaCity: z.string().nullable(), toDestination: z.string().nullable(), transportMode: z.string().nullable(), issuePlace: z.string().nullable(), issueDate: z.iso.datetime({ offset: true }).nullable(), deliveryTerms: z.string().nullable(), shipperId: z.string().nullable(), shipperAddress: z.string().nullable(), consigneeId: z.string().nullable(), consigneeAddress: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateFcrDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts b/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts deleted file mode 100644 index 1e532d0..0000000 --- a/test/generated/base/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsFcrFormAcl } from "./workingDocumentsFcrForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsFcrFormApi } from "./workingDocumentsFcrForm.api"; - -export namespace WorkingDocumentsFcrFormQueries { -export const moduleName = QueryModule.WorkingDocumentsFcrForm; - -export const keys = { - all: [moduleName] as const, - getFcrData: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId", positionId, fcrId, officeId] as const, - previewFcr: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId/preview", positionId, fcrId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an FCR document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsFcrFormApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetFcrData` - * @summary Get FCR document data - * @permission Requires `canUseGetFcrData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.fcrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetFcrData = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getFcrData(positionId, fcrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId } )); - return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateFcrData` - * @summary Update FCR document data - * @permission Requires `canUseUpdateFcrData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateFcrData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId, data }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId } )); - return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, fcrId, officeId } = variables; - const updateKeys = [keys.getFcrData(positionId, fcrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteFcr` - * @summary Delete FCR document - * @permission Requires `canUseDeleteFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } FCR document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteFcr = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewFcr` - recommended when file should be cached - * @summary Preview FCR document - * @permission Requires `canUsePreviewFcr` ability - * @param { string } object.positionId Path parameter - * @param { string } object.fcrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewFcr = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewFcr(positionId, fcrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewFcrMutation` - recommended when file should not be cached - * @summary Preview FCR document - * @permission Requires `canUsePreviewFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewFcrMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, fcrId, officeId } = variables; - const updateKeys = [keys.previewFcr(positionId, fcrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateFcr` - * @summary Generate FCR document - * @permission Requires `canUseGenerateFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateFcr = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId, data }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts deleted file mode 100644 index a7c5b44..0000000 --- a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsHouseAwbAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Create", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useGetHouseAwbData` query ability. For global ability, omit the object parameter. - * @description Read House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseAwbData` query - */ -export const canUseGetHouseAwbData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useUpdateHouseAwbData` mutation ability. For global ability, omit the object parameter. - * @description Update House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseAwbData` mutation - */ -export const canUseUpdateHouseAwbData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useDeleteHouseAwb` mutation ability. For global ability, omit the object parameter. - * @description Delete House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseAwb` mutation - */ -export const canUseDeleteHouseAwb = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Delete", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation - */ -export const canUsePreviewHouseAwb = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useGenerateHouseAwb` mutation ability. For global ability, omit the object parameter. - * @description Generate House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseAwb` mutation - */ -export const canUseGenerateHouseAwb = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts deleted file mode 100644 index 11a3a68..0000000 --- a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseAwbApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs`, - - ) -}; -export const getHouseAwbData = (positionId: string, hawbId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - - ) -}; -export const updateHouseAwbData = (positionId: string, hawbId: string, officeId: string, data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), - - ) -}; -export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - - ) -}; -export const previewHouseAwb = (positionId: string, hawbId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateHouseAwb = (positionId: string, hawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts deleted file mode 100644 index 505f711..0000000 --- a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseAwbModels { -/** - * HouseAwbDocumentOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - * @property { string } name Name - */ -export const HouseAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullish(), sellRate: z.number(), name: z.string().nullish() }); -export type HouseAwbDocumentOtherChargeDTO = z.infer; - -/** - * HouseAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { number } totalOtherCharges Total other charges - * @property { number } total Total - * @property { HouseAwbDocumentOtherChargeDTO[] } otherCharges Other charges - */ -export const HouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number(), totalOtherCharges: z.number(), total: z.number(), otherCharges: z.array(HouseAwbDocumentOtherChargeDTOSchema) }); -export type HouseAwbDocumentChargesDTO = z.infer; - -/** - * HouseAwbDocumentCargoDTOSchema - * @type { object } - * @property { number } quantity Quantity - * @property { number } grossWeight Gross weight - * @property { string } rateClass Rate class - * @property { string } commodityItemNo Commodity item number - * @property { number } rateOrCharge Rate or charge - * @property { number } total Total - * @property { string } description Description - */ -export const HouseAwbDocumentCargoDTOSchema = z.object({ quantity: z.number(), grossWeight: z.number().nullish(), rateClass: z.string().nullish(), commodityItemNo: z.string().nullish(), rateOrCharge: z.number().nullish(), total: z.number().nullish(), description: z.string().nullish() }); -export type HouseAwbDocumentCargoDTO = z.infer; - -/** - * HouseAwbDocumentRouteDTOSchema - * @type { object } - * @property { string } airportOfDeparture Airport of departure - * @property { string } airportOfDestination Airport of destination - * @property { string } toAirport1 To airport 1 - * @property { string } byCarrier1 By carrier 1 - * @property { string } toAirport2 To airport 2 - * @property { string } byCarrier2 By carrier 2 - * @property { string } toAirport3 To airport 3 - * @property { string } byCarrier3 By carrier 3 - * @property { string } flightNumber1 Flight number 1 - * @property { string } flightDay1 Flight day 1 - * @property { string } flightNumber2 Flight number 2 - * @property { string } flightDay2 Flight day 2 - */ -export const HouseAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string(), airportOfDestination: z.string(), toAirport1: z.string().nullish(), byCarrier1: z.string().nullish(), toAirport2: z.string().nullish(), byCarrier2: z.string().nullish(), toAirport3: z.string().nullish(), byCarrier3: z.string().nullish(), flightNumber1: z.string().nullish(), flightDay1: z.string().nullish(), flightNumber2: z.string().nullish(), flightDay2: z.string().nullish() }); -export type HouseAwbDocumentRouteDTO = z.infer; - -/** - * HouseAwbDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const HouseAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * HouseAwbDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the House AWB document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the House AWB document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } currency Currency - * @property { number } versionNumber Version number of the document - * @property { string } hawbNumber HAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { HouseAwbDocumentCargoDTO[] } cargo Cargo packages - * @property { HouseAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } signingLocation Signing location - * @property { string } issuerIataCode Issuer IATA code - * @property { HouseAwbDocumentRouteDTO } route Route - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } issuer Issuer - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { CommonModels.DocumentConfigDTO } config Config - */ -export const HouseAwbDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), currency: z.string().nullish(), versionNumber: z.number(), hawbNumber: z.string().nullish(), sciReference: z.string().nullish(), reference1: z.string().nullish(), reference2: z.string().nullish(), reference3: z.string().nullish(), exchangeRate: z.number().nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.nullish(), handlingInstructions: z.string().nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.nullish(), additionalAccountingNotes: z.string().nullish(), isSecured: z.boolean(), suppressContainerWeight: z.boolean(), suppressCargoMeasurement: z.boolean(), cargo: z.array(HouseAwbDocumentCargoDTOSchema).nullish(), charges: HouseAwbDocumentChargesDTOSchema.nullish(), shipperSigner: z.string().nullish(), shipperSignerUserName: z.string().nullish(), signer: z.string().nullish(), signingDate: z.iso.datetime({ offset: true }).nullish(), signingLocation: z.string().nullish(), issuerIataCode: z.string().nullish(), route: HouseAwbDocumentRouteDTOSchema.nullish(), issuer: HouseAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: HouseAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: HouseAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), config: CommonModels.DocumentConfigDTOSchema.nullish() }); -export type HouseAwbDocumentResponseDTO = z.infer; - -/** - * UpdateHouseAwbDocumentChargesOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - */ -export const UpdateHouseAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullable(), sellRate: z.number().nullable() }).partial(); -export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer; - -/** - * UpdateHouseAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { UpdateHouseAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges - */ -export const UpdateHouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().nullable(), otherCharges: z.array(UpdateHouseAwbDocumentChargesOtherChargeDTOSchema).nullable() }).partial(); -export type UpdateHouseAwbDocumentChargesDTO = z.infer; - -/** - * UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateHouseAwbDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } hawbNumber HAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { UpdateHouseAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } issuerId Issuer ID - * @property { string } issuerName Issuer name - * @property { string } issuerAddress Issuer address - * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateHouseAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), hawbNumber: z.string().nullable(), sciReference: z.string().nullable(), reference1: z.string().nullable(), reference2: z.string().nullable(), reference3: z.string().nullable(), exchangeRate: z.number().nullable(), additionalText: CommonModels.EditorContentUpdateDtoSchema.nullable(), handlingInstructions: z.string().nullable(), accountInformation: CommonModels.AccountInformationEnumSchema.nullable(), additionalAccountingNotes: z.string().nullable(), isSecured: z.boolean().nullable(), suppressContainerWeight: z.boolean().nullable(), suppressCargoMeasurement: z.boolean().nullable(), charges: UpdateHouseAwbDocumentChargesDTOSchema.nullable(), shipperSigner: z.string().nullable(), shipperSignerUserName: z.string().nullable(), signer: z.string().nullable(), signingDate: z.iso.datetime({ offset: true }).nullable(), issuerId: z.string().nullable(), issuerName: z.string().nullable(), issuerAddress: z.string().nullable(), consignee: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateHouseAwbDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts b/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts deleted file mode 100644 index 2cb6a5e..0000000 --- a/test/generated/base/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsHouseAwbAcl } from "./workingDocumentsHouseAwb.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsHouseAwbApi } from "./workingDocumentsHouseAwb.api"; - -export namespace WorkingDocumentsHouseAwbQueries { -export const moduleName = QueryModule.WorkingDocumentsHouseAwb; - -export const keys = { - all: [moduleName] as const, - getHouseAwbData: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId", positionId, hawbId, officeId] as const, - previewHouseAwb: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId/preview", positionId, hawbId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a House AWB document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId } )); - return WorkingDocumentsHouseAwbApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetHouseAwbData` - * @summary Get House AWB document data - * @permission Requires `canUseGetHouseAwbData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.hawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetHouseAwbData = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId } )); - return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateHouseAwbData` - * @summary Update House AWB document data - * @permission Requires `canUseUpdateHouseAwbData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateHouseAwbData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId } )); - return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, hawbId, officeId } = variables; - const updateKeys = [keys.getHouseAwbData(positionId, hawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteHouseAwb` - * @summary Delete House AWB document - * @permission Requires `canUseDeleteHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } House AWB document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewHouseAwb` - recommended when file should be cached - * @summary Preview House AWB document - * @permission Requires `canUsePreviewHouseAwb` ability - * @param { string } object.positionId Path parameter - * @param { string } object.hawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseAwb = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewHouseAwbMutation` - recommended when file should not be cached - * @summary Preview House AWB document - * @permission Requires `canUsePreviewHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, hawbId, officeId } = variables; - const updateKeys = [keys.previewHouseAwb(positionId, hawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateHouseAwb` - * @summary Generate House AWB document - * @permission Requires `canUseGenerateHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts deleted file mode 100644 index 7e3bdd2..0000000 --- a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsHouseBlAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Create", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useGetHouseBlData` query ability. For global ability, omit the object parameter. - * @description Read house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseBlData` query - */ -export const canUseGetHouseBlData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useUpdateHouseBlData` mutation ability. For global ability, omit the object parameter. - * @description Update house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseBlData` mutation - */ -export const canUseUpdateHouseBlData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useDeleteHouseBl` mutation ability. For global ability, omit the object parameter. - * @description Delete house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseBl` mutation - */ -export const canUseDeleteHouseBl = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Delete", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation - */ -export const canUsePreviewHouseBl = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview house BL document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation - */ -export const canUsePreviewHouseBlEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useGenerateHouseBl` mutation ability. For global ability, omit the object parameter. - * @description Generate house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseBl` mutation - */ -export const canUseGenerateHouseBl = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate house BL document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ -export const canUseGenerateDocumentEml = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts deleted file mode 100644 index 7f9ed62..0000000 --- a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseBlApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls`, - - ) -}; -export const getHouseBlData = (positionId: string, houseBlId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - - ) -}; -export const updateHouseBlData = (positionId: string, houseBlId: string, officeId: string, data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), - - ) -}; -export const deleteHouseBl = (positionId: string, houseBlId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - - ) -}; -export const previewHouseBl = (positionId: string, houseBlId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const previewHouseBlEml = (positionId: string, houseBlId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateHouseBl = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -export const generateDocumentEml = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts deleted file mode 100644 index cd3e571..0000000 --- a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseBlModels { -/** - * HouseBlDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { number } quantityOfCopies Quantity of copies - * @property { string } date Date - * @property { string } location Location - * @property { string } signer Signer - * @property { boolean } hideSignature Hide signature - * @property { boolean } capsLock Render issuer/signer in caps lock - * @property { string } documentTitle Document title - */ -export const HouseBlDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), quantityOfCopies: z.number().nullable(), date: z.iso.datetime({ offset: true }).nullable(), location: z.string().nullable(), signer: z.string().nullable(), hideSignature: z.boolean().nullable(), capsLock: z.boolean().nullable(), documentTitle: z.string().nullable() }).partial(); -export type HouseBlDocumentSettingsDtoDTO = z.infer; - -/** - * HouseBlDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const HouseBlDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * HouseBlDocumentCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ -export const HouseBlDocumentCountryResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type HouseBlDocumentCountryResponseDTO = z.infer; - -/** - * HouseBlDocumentPlaceResponseDTOSchema - * @type { object } - * @property { string } id ID of the place - * @property { string } name Name of the place - */ -export const HouseBlDocumentPlaceResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type HouseBlDocumentPlaceResponseDTO = z.infer; - -/** - * HouseBlDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ -export const HouseBlDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type HouseBlDocumentPortResponseDTO = z.infer; - -/** - * HouseBlDocumentTerminalResponseDTOSchema - * @type { object } - * @property { string } id ID of the terminal - * @property { string } name Name of the terminal - */ -export const HouseBlDocumentTerminalResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type HouseBlDocumentTerminalResponseDTO = z.infer; - -/** - * HouseBlDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the house BL document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the house BL document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } blNumber Bill of lading number - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } exportReference Export reference number - * @property { HouseBlDocumentBusinessPartnerResponseDTO } forwarder Forwarder information for the shipment - * @property { HouseBlDocumentCountryResponseDTO } originCountry Origin country - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { CommonModels.EditorContentResponseDto } additionalTextTop Additional text for the document - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { HouseBlDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } cargoReleaseBy Delivery agent information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information - * @property { HouseBlDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information - * @property { string } precarriageByText Pre-carriage by free-text override - * @property { HouseBlDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information - * @property { string } placeOfReceiptText Place of receipt free-text override - * @property { string } vessel Name of the vessel - * @property { string } voyage Voyage number of the vessel - * @property { string } declaredValue Declared value of the shipment - * @property { number } rateOfExchange Rate of exchange of the shipment - * @property { string } currency Currency of the shipment - * @property { string } freightPayable Freight payable of the shipment - * @property { string } issuer Issuer - * @property { HouseBlDocumentPortResponseDTO } portOfLoading Port of loading information - * @property { string } portOfLoadingText Port of loading free-text override - * @property { HouseBlDocumentTerminalResponseDTO } loadingPierTerminal Loading pier/terminal information - * @property { string } loadingPierTerminalText Loading pier/terminal free-text override - * @property { HouseBlDocumentPortResponseDTO } portOfDischarge Port of discharge information - * @property { string } portOfDischargeText Port of discharge free-text override - * @property { HouseBlDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information - * @property { string } placeOfDeliveryText Place of delivery free-text override - * @property { HouseBlDocumentPlaceResponseDTO } originalsToBeReleasedAt Originals to be released at information - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { string } typeOfMove Type of move - * @property { string } placeOfIssue - * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data - * @property { HouseBlDocumentSettingsDtoDTO } settings Settings for the House BL document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ -export const HouseBlDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), blNumber: z.string().nullish(), carrierBookingNumber: z.string().nullish(), exportReference: z.string().nullish(), forwarder: HouseBlDocumentBusinessPartnerResponseDTOSchema.nullish(), originCountry: HouseBlDocumentCountryResponseDTOSchema.nullish(), useLatterOfCredit: z.boolean().nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.nullish(), additionalTextTop: CommonModels.EditorContentResponseDtoSchema.nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), versionNumber: z.number(), consignee: HouseBlDocumentBusinessPartnerResponseDTOSchema, shipper: HouseBlDocumentBusinessPartnerResponseDTOSchema, cargoReleaseBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.nullish(), notify: HouseBlDocumentBusinessPartnerResponseDTOSchema, alsoNotify: HouseBlDocumentBusinessPartnerResponseDTOSchema, precarriageBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.nullish(), precarriageByText: z.string().nullish(), placeOfReceipt: HouseBlDocumentPlaceResponseDTOSchema.nullish(), placeOfReceiptText: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), declaredValue: z.string().nullish(), rateOfExchange: z.number().nullish(), currency: z.string().nullish(), freightPayable: z.string().nullish(), issuer: z.string().nullish(), portOfLoading: HouseBlDocumentPortResponseDTOSchema.nullish(), portOfLoadingText: z.string().nullish(), loadingPierTerminal: HouseBlDocumentTerminalResponseDTOSchema.nullish(), loadingPierTerminalText: z.string().nullish(), portOfDischarge: HouseBlDocumentPortResponseDTOSchema.nullish(), portOfDischargeText: z.string().nullish(), placeOfDelivery: HouseBlDocumentPlaceResponseDTOSchema.nullish(), placeOfDeliveryText: z.string().nullish(), originalsToBeReleasedAt: HouseBlDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAtText: z.string().nullish(), typeOfMove: z.string().nullish(), placeOfIssue: z.string().nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.nullish(), settings: HouseBlDocumentSettingsDtoDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.HBLDocumentConfigDtoSchema }); -export type HouseBlDocumentResponseDTO = z.infer; - -/** - * UpdateHouseBlDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { number } quantityOfCopies Quantity of copies - * @property { string } blNumber BL number - * @property { string } exportReference Export reference number - * @property { string } location Location - * @property { string } signer Signer - * @property { boolean } hideSignature Hide signature - * @property { boolean } capsLock Render issuer/signer in caps lock - * @property { string } date Date - * @property { string } documentTitle Document title - */ -export const UpdateHouseBlDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), quantityOfCopies: z.number().nullable(), blNumber: z.string().nullable(), exportReference: z.string().nullable(), location: z.string().nullable(), signer: z.string().nullable(), hideSignature: z.boolean().nullable(), capsLock: z.boolean().nullable(), date: z.iso.datetime({ offset: true }).nullable(), documentTitle: z.string().nullable() }).partial(); -export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; - -/** - * UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateHouseBlDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } blNumber Bill of lading number - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } exportReference Export reference number - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } forwarder Forwarder information - * @property { string } originCountryId Origin country ID - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } declaredValue Declared value - * @property { number } rateOfExchange Rate of exchange - * @property { string } freightPayable Freight payable - * @property { string } issuer Issuer - * @property { string } placeOfIssue Place of issue - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text - * @property { CommonModels.EditorContentUpdateDto } additionalTextTop Additional text top - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } notify Notify party information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } cargoReleaseBy Cargo release party information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information - * @property { string } precarriageById Pre-carriage by ID - * @property { string } precarriageByText Pre-carriage by free-text override - * @property { string } placeOfReceiptId Place of receipt ID - * @property { string } placeOfReceiptText Place of receipt free-text override - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } portOfLoadingId Port of loading ID - * @property { string } portOfLoadingText Port of loading free-text override - * @property { string } loadingPierTerminalId Loading pier/terminal ID - * @property { string } loadingPierTerminalText Loading pier/terminal free-text override - * @property { string } portOfDischargeId Port of discharge ID - * @property { string } portOfDischargeText Port of discharge free-text override - * @property { string } placeOfDeliveryId Place of delivery ID - * @property { string } placeOfDeliveryText Place of delivery free-text override - * @property { string } originalsToBeReleasedAtId Originals to be released at ID - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { string } typeOfMove Type of move - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { UpdateHouseBlDocumentSettingsRequestDTO } settings Settings - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data - */ -export const UpdateHouseBlDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), blNumber: z.string().nullable(), carrierBookingNumber: z.string().nullable(), exportReference: z.string().nullable(), forwarder: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), originCountryId: z.string().nullable(), useLatterOfCredit: z.boolean().nullable(), declaredValue: z.string().nullable(), rateOfExchange: z.number().nullable(), freightPayable: z.string().nullable(), issuer: z.string().nullable(), placeOfIssue: z.string().nullable(), additionalText: CommonModels.EditorContentUpdateDtoSchema.nullable(), additionalTextTop: CommonModels.EditorContentUpdateDtoSchema.nullable(), consignee: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), notify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), cargoReleaseBy: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), alsoNotify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), precarriageById: z.string().nullable(), precarriageByText: z.string().nullable(), placeOfReceiptId: z.string().nullable(), placeOfReceiptText: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), portOfLoadingId: z.string().nullable(), portOfLoadingText: z.string().nullable(), loadingPierTerminalId: z.string().nullable(), loadingPierTerminalText: z.string().nullable(), portOfDischargeId: z.string().nullable(), portOfDischargeText: z.string().nullable(), placeOfDeliveryId: z.string().nullable(), placeOfDeliveryText: z.string().nullable(), originalsToBeReleasedAtId: z.string().nullable(), originalsToBeReleasedAtText: z.string().nullable(), typeOfMove: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), settings: UpdateHouseBlDocumentSettingsRequestDTOSchema.nullable(), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.nullable() }).partial(); -export type UpdateHouseBlDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts b/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts deleted file mode 100644 index 17f207b..0000000 --- a/test/generated/base/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts +++ /dev/null @@ -1,296 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsHouseBlAcl } from "./workingDocumentsHouseBl.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsHouseBlApi } from "./workingDocumentsHouseBl.api"; - -export namespace WorkingDocumentsHouseBlQueries { -export const moduleName = QueryModule.WorkingDocumentsHouseBl; - -export const keys = { - all: [moduleName] as const, - getHouseBlData: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId", positionId, houseBlId, officeId] as const, - previewHouseBl: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview", positionId, houseBlId, officeId] as const, - previewHouseBlEml: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview/eml", positionId, houseBlId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a house BL document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId } )); - return WorkingDocumentsHouseBlApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetHouseBlData` - * @summary Get house BL document data - * @permission Requires `canUseGetHouseBlData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetHouseBlData = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId } )); - return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateHouseBlData` - * @summary Update house BL document data - * @permission Requires `canUseUpdateHouseBlData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateHouseBlData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId } )); - return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.getHouseBlData(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteHouseBl` - * @summary Delete house BL document - * @permission Requires `canUseDeleteHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } House BL document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteHouseBl = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewHouseBl` - recommended when file should be cached - * @summary Preview house BL document - * @permission Requires `canUsePreviewHouseBl` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBl = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewHouseBlMutation` - recommended when file should not be cached - * @summary Preview house BL document - * @permission Requires `canUsePreviewHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewHouseBlEml` - recommended when file should be cached - * @summary Preview house BL document and return EML file - * @permission Requires `canUsePreviewHouseBlEml` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBlEml = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewHouseBlEmlMutation` - recommended when file should not be cached - * @summary Preview house BL document and return EML file - * @permission Requires `canUsePreviewHouseBlEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBlEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateHouseBl` - * @summary Generate house BL document - * @permission Requires `canUseGenerateHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateHouseBl = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate house BL document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts deleted file mode 100644 index 99aadd5..0000000 --- a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsIsfFormAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Create", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useGetIsfData` query ability. For global ability, omit the object parameter. - * @description Read ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetIsfData` query - */ -export const canUseGetIsfData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useUpdateIsfData` mutation ability. For global ability, omit the object parameter. - * @description Update ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIsfData` mutation - */ -export const canUseUpdateIsfData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useDeleteIsf` mutation ability. For global ability, omit the object parameter. - * @description Delete ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteIsf` mutation - */ -export const canUseDeleteIsf = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Delete", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `usePreviewIsf` query or `usePreviewIsfMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewIsf` query or `usePreviewIsfMutation` mutation - */ -export const canUsePreviewIsf = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useGenerateIsf` mutation ability. For global ability, omit the object parameter. - * @description Generate ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIsf` mutation - */ -export const canUseGenerateIsf = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts deleted file mode 100644 index ca27547..0000000 --- a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsIsfFormApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs`, - - ) -}; -export const getIsfData = (positionId: string, isfId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - - ) -}; -export const updateIsfData = (positionId: string, isfId: string, officeId: string, data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), - - ) -}; -export const deleteIsf = (positionId: string, isfId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - - ) -}; -export const previewIsf = (positionId: string, isfId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateIsf = (positionId: string, isfId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts deleted file mode 100644 index 2133bc5..0000000 --- a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsIsfFormModels { -/** - * IsfDocumentCargoCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ -export const IsfDocumentCargoCountryResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type IsfDocumentCargoCountryResponseDTO = z.infer; - -/** - * IsfDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } productCode Product code of the cargo - * @property { string } descriptionOfGoods Description of goods - * @property { string } htsCode HTS code of the cargo - * @property { string } manufacturerSupplier Manufacturer supplier of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - * @property { IsfDocumentCargoCountryResponseDTO } countryOfOrigin Country of origin of the cargo - */ -export const IsfDocumentCargoResponseDTOSchema = z.object({ productCode: z.string().nullable(), descriptionOfGoods: z.string().nullable(), htsCode: z.string().nullable(), manufacturerSupplier: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), countryOfOrigin: IsfDocumentCargoCountryResponseDTOSchema.nullable() }).partial(); -export type IsfDocumentCargoResponseDTO = z.infer; - -/** - * IsfDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ -export const IsfDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type IsfDocumentPortResponseDTO = z.infer; - -/** - * IsfDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - * @property { string } number Number of the business partner - */ -export const IsfDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable(), number: z.string().nullable() }).partial(); -export type IsfDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * IsfDocumentContainerLocationResponseDTOSchema - * @type { object } - * @property { string } id ID of the container location - * @property { string } name Name of the container location - * @property { string } address Address of the container location - */ -export const IsfDocumentContainerLocationResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type IsfDocumentContainerLocationResponseDTO = z.infer; - -/** - * IsfDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { number } versionNumber Version number of the document - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } hBLNumber HBL number - * @property { string } mBLNumber MBL number - * @property { string } scacCodeHBL SCAC code for HBL - * @property { string } scacCodeMBL SCAC code for MBL - * @property { IsfDocumentPortResponseDTO } portOfDischarge Port of discharge - * @property { string } issueLocation Issue location - * @property { string } issueDate Issue date - * @property { string } companyName Company name - * @property { object } completedBy - * @property { string } completedBy.name - * @property { string } completedBy.email - * @property { object } container - * @property { string } container.id - * @property { string } container.name - * @property { IsfDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { IsfDocumentBusinessPartnerResponseDTO } manufacturer Manufacturer information - * @property { IsfDocumentBusinessPartnerResponseDTO } seller Seller information - * @property { IsfDocumentBusinessPartnerResponseDTO } buyer Buyer information - * @property { IsfDocumentBusinessPartnerResponseDTO } consolidator Consolidator information - * @property { IsfDocumentContainerLocationResponseDTO } containerLocation Container location information - * @property { IsfDocumentBusinessPartnerResponseDTO } shipTo Ship to information - * @property { IsfDocumentBusinessPartnerResponseDTO } importer Importer information - * @property { IsfDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - */ -export const IsfDocumentResponseDTOSchema = z.object({ id: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), positionId: z.string(), positionNumber: z.string(), versionNumber: z.number(), vessel: z.string().nullish(), voyage: z.string().nullish(), hBLNumber: z.string().nullish(), mBLNumber: z.string().nullish(), scacCodeHBL: z.string().nullish(), scacCodeMBL: z.string().nullish(), portOfDischarge: IsfDocumentPortResponseDTOSchema.nullish(), issueLocation: z.string().nullish(), issueDate: z.iso.datetime({ offset: true }).nullish(), companyName: z.string().nullish(), completedBy: z.object({ name: z.string(), email: z.string() }).nullish(), container: z.object({ id: z.string(), name: z.string() }).nullish(), consignee: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), manufacturer: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), seller: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), buyer: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), consolidator: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), containerLocation: IsfDocumentContainerLocationResponseDTOSchema.nullish(), shipTo: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), importer: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), cargo: z.array(IsfDocumentCargoResponseDTOSchema).nullish(), config: CommonModels.HBLDocumentConfigDtoSchema, bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish() }); -export type IsfDocumentResponseDTO = z.infer; - -/** - * UpdateIsfDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - * @property { string } number Business partner number - */ -export const UpdateIsfDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable(), number: z.string().nullable() }).partial(); -export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateIsfDocumentCargoRequestDTOSchema - * @type { object } - * @property { string } productCode Product code - * @property { string } descriptionOfGoods Description of goods - * @property { string } htsCode HTS code - * @property { string } manufacturerSupplier Manufacturer supplier - * @property { string } countryOfOriginId Country of origin ID - */ -export const UpdateIsfDocumentCargoRequestDTOSchema = z.object({ productCode: z.string().nullable(), descriptionOfGoods: z.string().nullable(), htsCode: z.string().nullable(), manufacturerSupplier: z.string().nullable(), countryOfOriginId: z.string().nullable() }).partial(); -export type UpdateIsfDocumentCargoRequestDTO = z.infer; - -/** - * UpdateIsfDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } hBLNumber HBL number - * @property { string } mBLNumber MBL number - * @property { string } scacCodeHBL SCAC code for HBL - * @property { string } scacCodeMBL SCAC code for MBL - * @property { string } portOfDischargeId Port of discharge Id - * @property { string } issueLocation Issue location - * @property { string } issueDate Issue date - * @property { string } companyName Company name - * @property { string } completedByName Completed by name - * @property { string } completedByEmail Completed by email - * @property { string } containerId Container ID - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } manufacturer Manufacturer information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } seller Seller information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } buyer Buyer information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consolidator Consolidator information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } containerLocation Container location information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } shipTo Ship to information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } importer Importer information - * @property { UpdateIsfDocumentCargoRequestDTO[] } cargo Cargo information - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateIsfDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), hBLNumber: z.string().nullable(), mBLNumber: z.string().nullable(), scacCodeHBL: z.string().nullable(), scacCodeMBL: z.string().nullable(), portOfDischargeId: z.string().nullable(), issueLocation: z.string().nullable(), issueDate: z.iso.datetime({ offset: true }).nullable(), companyName: z.string().nullable(), completedByName: z.string().nullable(), completedByEmail: z.string().nullable(), containerId: z.string().nullable(), consignee: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), manufacturer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), seller: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), buyer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), consolidator: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), containerLocation: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), shipTo: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), importer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), cargo: z.array(UpdateIsfDocumentCargoRequestDTOSchema).nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateIsfDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts b/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts deleted file mode 100644 index c190b46..0000000 --- a/test/generated/base/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsIsfFormAcl } from "./workingDocumentsIsfForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsIsfFormApi } from "./workingDocumentsIsfForm.api"; - -export namespace WorkingDocumentsIsfFormQueries { -export const moduleName = QueryModule.WorkingDocumentsIsfForm; - -export const keys = { - all: [moduleName] as const, - getIsfData: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId", positionId, isfId, officeId] as const, - previewIsf: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId/preview", positionId, isfId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an ISF document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsIsfFormApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetIsfData` - * @summary Get ISF document data - * @permission Requires `canUseGetIsfData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.isfId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetIsfData = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getIsfData(positionId, isfId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId } )); - return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateIsfData` - * @summary Update ISF document data - * @permission Requires `canUseUpdateIsfData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateIsfData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId, data }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId } )); - return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, isfId, officeId } = variables; - const updateKeys = [keys.getIsfData(positionId, isfId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteIsf` - * @summary Delete ISF document - * @permission Requires `canUseDeleteIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } ISF document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteIsf = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewIsf` - recommended when file should be cached - * @summary Preview ISF document - * @permission Requires `canUsePreviewIsf` ability - * @param { string } object.positionId Path parameter - * @param { string } object.isfId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewIsf = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewIsf(positionId, isfId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewIsfMutation` - recommended when file should not be cached - * @summary Preview ISF document - * @permission Requires `canUsePreviewIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewIsfMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, isfId, officeId } = variables; - const updateKeys = [keys.previewIsf(positionId, isfId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateIsf` - * @summary Generate ISF document - * @permission Requires `canUseGenerateIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateIsf = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId, data }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts deleted file mode 100644 index 10d4871..0000000 --- a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsMasterAwbAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Create", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useGetMasterAwbData` query ability. For global ability, omit the object parameter. - * @description Read Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMasterAwbData` query - */ -export const canUseGetMasterAwbData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useUpdateMasterAwbData` mutation ability. For global ability, omit the object parameter. - * @description Update Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateMasterAwbData` mutation - */ -export const canUseUpdateMasterAwbData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useDeleteMasterAwb` mutation ability. For global ability, omit the object parameter. - * @description Delete Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteMasterAwb` mutation - */ -export const canUseDeleteMasterAwb = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Delete", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation - */ -export const canUsePreviewMasterAwb = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useGenerateMasterAwb` mutation ability. For global ability, omit the object parameter. - * @description Generate Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateMasterAwb` mutation - */ -export const canUseGenerateMasterAwb = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts deleted file mode 100644 index 274642e..0000000 --- a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsMasterAwbApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs`, - - ) -}; -export const getMasterAwbData = (positionId: string, mawbId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - - ) -}; -export const updateMasterAwbData = (positionId: string, mawbId: string, officeId: string, data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), - - ) -}; -export const deleteMasterAwb = (positionId: string, mawbId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - - ) -}; -export const previewMasterAwb = (positionId: string, mawbId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateMasterAwb = (positionId: string, mawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts deleted file mode 100644 index 02909ab..0000000 --- a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsMasterAwbModels { -/** - * MasterAwbDocumentOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - * @property { string } name Name - */ -export const MasterAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullish(), sellRate: z.number(), name: z.string().nullish() }); -export type MasterAwbDocumentOtherChargeDTO = z.infer; - -/** - * MasterAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { number } totalOtherCharges Total other charges - * @property { number } total Total - * @property { MasterAwbDocumentOtherChargeDTO[] } otherCharges Other charges - */ -export const MasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number(), totalOtherCharges: z.number(), total: z.number(), otherCharges: z.array(MasterAwbDocumentOtherChargeDTOSchema) }); -export type MasterAwbDocumentChargesDTO = z.infer; - -/** - * MasterAwbDocumentCargoDTOSchema - * @type { object } - * @property { number } quantity Quantity - * @property { number } grossWeight Gross weight - * @property { string } rateClass Rate class - * @property { string } commodityItemNo Commodity item number - * @property { number } rateOrCharge Rate or charge - * @property { number } total Total - * @property { string } description Description - */ -export const MasterAwbDocumentCargoDTOSchema = z.object({ quantity: z.number(), grossWeight: z.number().nullish(), rateClass: z.string().nullish(), commodityItemNo: z.string().nullish(), rateOrCharge: z.number().nullish(), total: z.number().nullish(), description: z.string().nullish() }); -export type MasterAwbDocumentCargoDTO = z.infer; - -/** - * MasterAwbDocumentRouteDTOSchema - * @type { object } - * @property { string } airportOfDeparture Airport of departure - * @property { string } airportOfDestination Airport of destination - * @property { string } toAirport1 To airport 1 - * @property { string } byCarrier1 By carrier 1 - * @property { string } toAirport2 To airport 2 - * @property { string } byCarrier2 By carrier 2 - * @property { string } toAirport3 To airport 3 - * @property { string } byCarrier3 By carrier 3 - * @property { string } flightNumber1 Flight number 1 - * @property { string } flightDay1 Flight day 1 - * @property { string } flightNumber2 Flight number 2 - * @property { string } flightDay2 Flight day 2 - */ -export const MasterAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string(), airportOfDestination: z.string(), toAirport1: z.string().nullish(), byCarrier1: z.string().nullish(), toAirport2: z.string().nullish(), byCarrier2: z.string().nullish(), toAirport3: z.string().nullish(), byCarrier3: z.string().nullish(), flightNumber1: z.string().nullish(), flightDay1: z.string().nullish(), flightNumber2: z.string().nullish(), flightDay2: z.string().nullish() }); -export type MasterAwbDocumentRouteDTO = z.infer; - -/** - * MasterAwbDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const MasterAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * MasterAwbDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the Master AWB document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the Master AWB document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } currency Currency - * @property { number } versionNumber Version number of the document - * @property { string } mawbNumber MAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { MasterAwbDocumentCargoDTO[] } cargo Cargo packages - * @property { MasterAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } signingLocation Signing location - * @property { string } issuerIataCode Issuer IATA code - * @property { number } exchangeRate Exchange rate - * @property { MasterAwbDocumentRouteDTO } route Route - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } issuer Issuer - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { CommonModels.DocumentConfigDTO } config Config - */ -export const MasterAwbDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), currency: z.string().nullish(), versionNumber: z.number(), mawbNumber: z.string().nullish(), sciReference: z.string().nullish(), reference1: z.string().nullish(), reference2: z.string().nullish(), reference3: z.string().nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.nullish(), handlingInstructions: z.string().nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.nullish(), additionalAccountingNotes: z.string().nullish(), isSecured: z.boolean(), suppressContainerWeight: z.boolean(), suppressCargoMeasurement: z.boolean(), cargo: z.array(MasterAwbDocumentCargoDTOSchema).nullish(), charges: MasterAwbDocumentChargesDTOSchema.nullish(), shipperSigner: z.string().nullish(), shipperSignerUserName: z.string().nullish(), signer: z.string().nullish(), signingDate: z.iso.datetime({ offset: true }).nullish(), signingLocation: z.string().nullish(), issuerIataCode: z.string().nullish(), exchangeRate: z.number().nullish(), route: MasterAwbDocumentRouteDTOSchema.nullish(), consignee: MasterAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: MasterAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), issuer: MasterAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), config: CommonModels.DocumentConfigDTOSchema.nullish() }); -export type MasterAwbDocumentResponseDTO = z.infer; - -/** - * UpdateMasterAwbDocumentChargesOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - */ -export const UpdateMasterAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullable(), sellRate: z.number().nullable() }).partial(); -export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer; - -/** - * UpdateMasterAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { UpdateMasterAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges - */ -export const UpdateMasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().nullable(), otherCharges: z.array(UpdateMasterAwbDocumentChargesOtherChargeDTOSchema).nullable() }).partial(); -export type UpdateMasterAwbDocumentChargesDTO = z.infer; - -/** - * UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateMasterAwbDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } mawbNumber MAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { UpdateMasterAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } issuerId Issuer ID - * @property { string } issuerName Issuer name - * @property { string } issuerAddress Issuer address - * @property { string } issuerCity Issuer city - * @property { string } issuerIataCode Issuer IATA code - * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateMasterAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), mawbNumber: z.string().nullable(), sciReference: z.string().nullable(), reference1: z.string().nullable(), reference2: z.string().nullable(), reference3: z.string().nullable(), additionalText: CommonModels.EditorContentUpdateDtoSchema.nullable(), handlingInstructions: z.string().nullable(), accountInformation: CommonModels.AccountInformationEnumSchema.nullable(), additionalAccountingNotes: z.string().nullable(), isSecured: z.boolean().nullable(), suppressContainerWeight: z.boolean().nullable(), suppressCargoMeasurement: z.boolean().nullable(), charges: UpdateMasterAwbDocumentChargesDTOSchema.nullable(), shipperSigner: z.string().nullable(), shipperSignerUserName: z.string().nullable(), signer: z.string().nullable(), signingDate: z.iso.datetime({ offset: true }).nullable(), issuerId: z.string().nullable(), issuerName: z.string().nullable(), issuerAddress: z.string().nullable(), issuerCity: z.string().nullable(), issuerIataCode: z.string().nullable(), consignee: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), exchangeRate: z.number().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateMasterAwbDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts b/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts deleted file mode 100644 index 57207fc..0000000 --- a/test/generated/base/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsMasterAwbAcl } from "./workingDocumentsMasterAwb.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsMasterAwbApi } from "./workingDocumentsMasterAwb.api"; - -export namespace WorkingDocumentsMasterAwbQueries { -export const moduleName = QueryModule.WorkingDocumentsMasterAwb; - -export const keys = { - all: [moduleName] as const, - getMasterAwbData: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId", positionId, mawbId, officeId] as const, - previewMasterAwb: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId/preview", positionId, mawbId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a Master AWB document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId } )); - return WorkingDocumentsMasterAwbApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetMasterAwbData` - * @summary Get Master AWB document data - * @permission Requires `canUseGetMasterAwbData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.mawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetMasterAwbData = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId } )); - return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateMasterAwbData` - * @summary Update Master AWB document data - * @permission Requires `canUseUpdateMasterAwbData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateMasterAwbData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId, data }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId } )); - return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, mawbId, officeId } = variables; - const updateKeys = [keys.getMasterAwbData(positionId, mawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteMasterAwb` - * @summary Delete Master AWB document - * @permission Requires `canUseDeleteMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Master AWB document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewMasterAwb` - recommended when file should be cached - * @summary Preview Master AWB document - * @permission Requires `canUsePreviewMasterAwb` ability - * @param { string } object.positionId Path parameter - * @param { string } object.mawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewMasterAwb = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewMasterAwbMutation` - recommended when file should not be cached - * @summary Preview Master AWB document - * @permission Requires `canUsePreviewMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewMasterAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, mawbId, officeId } = variables; - const updateKeys = [keys.previewMasterAwb(positionId, mawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateMasterAwb` - * @summary Generate Master AWB document - * @permission Requires `canUseGenerateMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId, data }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts deleted file mode 100644 index ccebdd8..0000000 --- a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsTemplatedDocumentAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Create", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useGetTemplatedDocument` query ability. For global ability, omit the object parameter. - * @description Read templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetTemplatedDocument` query - */ -export const canUseGetTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useUpdateTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Update templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateTemplatedDocument` mutation - */ -export const canUseUpdateTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useDeleteTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Delete templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteTemplatedDocument` mutation - */ -export const canUseDeleteTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `usePreviewTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Preview templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewTemplatedDocument` mutation - */ -export const canUsePreviewTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useIssueTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Issue templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueTemplatedDocument` mutation - */ -export const canUseIssueTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate templated document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ -export const canUseGenerateDocumentEml = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -} diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts deleted file mode 100644 index bcde97f..0000000 --- a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsTemplatedDocumentApi { -export const create = (positionId: string, officeId: string, data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), - - ) -}; -export const getTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - - ) -}; -export const updateTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), - - ) -}; -export const deleteTemplatedDocument = (positionId: string, templatedDocumentId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - - ) -}; -export const previewTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const issueTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -export const generateDocumentEml = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts deleted file mode 100644 index b8a732e..0000000 --- a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsTemplatedDocumentModels { -/** - * TemplatedDocumentBlueprintDtoSchema - * @type { object } - * @property { string } templateId - * @property { string } templateName - * @property { string } capturedAt - * @property { CommonModels.TemplateBlocksResponseDTO } blocks - */ -export const TemplatedDocumentBlueprintDtoSchema = z.object({ templateId: z.string(), templateName: z.string(), capturedAt: z.string(), blocks: CommonModels.TemplateBlocksResponseDTOSchema }); -export type TemplatedDocumentBlueprintDto = z.infer; - -/** - * TemplatedDocumentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } officeId - * @property { string } name - * @property { string } nameSuffix - * @property { string } defaultFileName - * @property { number } versionNumber - * @property { TemplatedDocumentBlueprintDto } blueprint Captured template blueprint - * @property { CommonModels.TemplatedDocumentDataDto } data Document data - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } issuedAt - */ -export const TemplatedDocumentResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), officeId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), versionNumber: z.number(), blueprint: TemplatedDocumentBlueprintDtoSchema, data: CommonModels.TemplatedDocumentDataDtoSchema, createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), issuedAt: z.iso.datetime({ offset: true }).nullish() }); -export type TemplatedDocumentResponseDto = z.infer; - -/** - * UpdateTemplatedDocumentRequestDtoSchema - * @type { object } - * @property { string } nameSuffix Optional suffix for the document name - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data Partial document data to update - */ -export const UpdateTemplatedDocumentRequestDtoSchema = z.object({ nameSuffix: z.string().nullable(), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.nullable() }).partial(); -export type UpdateTemplatedDocumentRequestDto = z.infer; - -/** - * CreateTemplatedDocumentRequestDtoSchema - * @type { object } - * @property { string } templateId Template ID to use for creating the document - * @property { string } nameSuffix Optional suffix for the document name - */ -export const CreateTemplatedDocumentRequestDtoSchema = z.object({ templateId: z.string(), nameSuffix: z.string().nullish() }); -export type CreateTemplatedDocumentRequestDto = z.infer; - -/** - * GenerateWorkingDocumentPreviewRequestDtoSchema - * @type { object } - * @property { string } issuedAt - */ -export const GenerateWorkingDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type GenerateWorkingDocumentPreviewRequestDto = z.infer; - -} diff --git a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts b/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts deleted file mode 100644 index 948d434..0000000 --- a/test/generated/base/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsTemplatedDocumentAcl } from "./workingDocumentsTemplatedDocument.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsTemplatedDocumentApi } from "./workingDocumentsTemplatedDocument.api"; - -export namespace WorkingDocumentsTemplatedDocumentQueries { -export const moduleName = QueryModule.WorkingDocumentsTemplatedDocument; - -export const keys = { - all: [moduleName] as const, - getTemplatedDocument: (officeId: string, positionId: string, templatedDocumentId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/templated-documents/:templatedDocumentId", officeId, positionId, templatedDocumentId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a templated document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetTemplatedDocument` - * @summary Get templated document data - * @permission Requires `canUseGetTemplatedDocument` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.templatedDocumentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetTemplatedDocument = ({ officeId, positionId, templatedDocumentId }: { officeId: string, positionId: string, templatedDocumentId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), - queryFn: () => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument(officeId, positionId, templatedDocumentId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateTemplatedDocument` - * @summary Update templated document data - * @permission Requires `canUseUpdateTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument(officeId, positionId, templatedDocumentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, templatedDocumentId } = variables; - const updateKeys = [keys.getTemplatedDocument(officeId, positionId, templatedDocumentId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteTemplatedDocument` - * @summary Delete templated document - * @permission Requires `canUseDeleteTemplatedDocument` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Templated document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, templatedDocumentId, officeId }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument(positionId, templatedDocumentId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `usePreviewTemplatedDocument` - recommended when file should not be cached - * @summary Preview templated document - * @permission Requires `canUsePreviewTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const usePreviewTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument(officeId, positionId, templatedDocumentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useIssueTemplatedDocument` - * @summary Issue templated document (generate final PDF) - * @permission Requires `canUseIssueTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useIssueTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument(officeId, positionId, templatedDocumentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate templated document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml(officeId, positionId, templatedDocumentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/base/zod.extended.ts b/test/generated/base/zod.extended.ts deleted file mode 100644 index 81e1e02..0000000 --- a/test/generated/base/zod.extended.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from "zod"; -import { ErrorHandler, SharedErrorHandler } from ""; - -export namespace ZodExtended { - interface ParseOptions { - type: "body" | "query"; - name?: string; - errorHandler?: ErrorHandler; - } - - export function parse( - schema: z.ZodType, - data: unknown, - { type, name, errorHandler }: ParseOptions = { type: "body" }, - ) { - try { - return schema.parse(data); - } catch (e) { - if (e instanceof z.ZodError) { - e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; - } - (errorHandler ?? SharedErrorHandler).rethrowError(e); - throw e; - } - } - - function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { - if (data === undefined || data === "" || enumSchema.options.length === 0) { - return true; - } - - const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; - const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; - return new RegExp(`^${commaSeparatedOptions}$`).test(data); - } - - export const sortExp = (enumSchema: z.ZodEnum) => - z.string().superRefine((arg, ctx) => { - if (!isSortExpValid(enumSchema, arg)) { - ctx.addIssue({ - code: "invalid_value", - message: "Invalid sorting string.", - values: [], - }); - } - }); -} diff --git a/test/generated/dist/aWBStocks/aWBStocks.acl.ts b/test/generated/dist/aWBStocks/aWBStocks.acl.ts deleted file mode 100644 index aae7050..0000000 --- a/test/generated/dist/aWBStocks/aWBStocks.acl.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace AWBStocksAcl { - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List AWB stocks - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Read", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Create", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; - - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get AWB stock details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Read", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Update", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Update", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Update", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; - - /** - * Use for `useGenerateNextNumber` mutation ability. For global ability, omit the object parameter. - * @description Generate next AWB number - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateNextNumber` mutation - */ - export const canUseGenerateNextNumber = (object?: { officeId: string }) => - ["Update", object ? subject("AWBStock", object) : "AWBStock"] as AbilityTuple< - "Update", - "AWBStock" | (ForcedSubject<"AWBStock"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/aWBStocks/aWBStocks.api.ts b/test/generated/dist/aWBStocks/aWBStocks.api.ts deleted file mode 100644 index ae8ee09..0000000 --- a/test/generated/dist/aWBStocks/aWBStocks.api.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { AWBStocksModels } from "./aWBStocks.models"; - -export namespace AWBStocksApi { - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: AWBStocksModels.AWBStockFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, - `/offices/${officeId}/awb-stocks`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = ( - officeId: string, - data: AWBStocksModels.CreateAWBStockRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks`, - ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), - config, - ); - }; - export const findById = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}`, - config, - ); - }; - export const update = ( - stockId: string, - officeId: string, - data: AWBStocksModels.UpdateAWBStockRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}`, - ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), - config, - ); - }; - export const archive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}/archive`, - undefined, - config, - ); - }; - export const unarchive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, - undefined, - config, - ); - }; - export const generateNextNumber = ( - officeId: string, - data: AWBStocksModels.GenerateAWBNumberRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/generate-number`, - ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/aWBStocks/aWBStocks.configs.ts b/test/generated/dist/aWBStocks/aWBStocks.configs.ts deleted file mode 100644 index 4317f98..0000000 --- a/test/generated/dist/aWBStocks/aWBStocks.configs.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { AWBStocksModels } from "./aWBStocks.models"; -import { AWBStocksQueries } from "./aWBStocks.queries"; -import { AWBStocksAcl } from "./aWBStocks.acl"; - -export namespace AWBStocksConfigs { - export const awbStocksConfig = { - meta: { - title: "Awb Stocks", - }, - readAll: { - acl: AWBStocksAcl.canUsePaginate, - schema: AWBStocksModels.AWBStockResponseDTOSchema, - paginated: AWBStocksQueries.usePaginate, - infinite: AWBStocksQueries.usePaginateInfinite, - filters: { - schema: AWBStocksModels.AWBStockFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AWBStocksModels.AWBStockFilterDtoSchema, - options: { - inputs: { - archived: true, - carrierId: true, - searchQuery: true, - used: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: AWBStocksModels.AWBStockResponseDTOSchema, - options: { - columns: { - id: true, - carrier: true, - startNumber: true, - lastUsedNumber: true, - stock: true, - usedCodes: true, - priority: true, - archived: true, - comments: true, - createdAt: true, - updatedAt: true, - createdBy: true, - updatedBy: true, - officeId: true, - }, - sortable: AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: AWBStocksAcl.canUseFindById, - schema: AWBStocksModels.AWBStockResponseDTOSchema, - query: AWBStocksQueries.useFindById, - }, - create: { - acl: AWBStocksAcl.canUseCreate, - schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, - mutation: AWBStocksQueries.useCreate, - inputDefs: dynamicInputs({ - schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, - options: { - inputs: { - carrierId: true, - startNumber: true, - stock: true, - priority: true, - comments: true, - officeId: true, - }, - }, - }), - }, - update: { - acl: AWBStocksAcl.canUseUpdate, - schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, - mutation: AWBStocksQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, - options: { - inputs: { - comments: true, - }, - }, - }), - }, - }; -} diff --git a/test/generated/dist/aWBStocks/aWBStocks.models.ts b/test/generated/dist/aWBStocks/aWBStocks.models.ts deleted file mode 100644 index e8fe89f..0000000 --- a/test/generated/dist/aWBStocks/aWBStocks.models.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace AWBStocksModels { - /** - * AWBStockBusinessPartnerPreviewDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } name Business partner name - * @property { string } carrierPrefix Carrier prefix (3 digits) - */ - export const AWBStockBusinessPartnerPreviewDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - name: z.string().describe("Business partner name"), - carrierPrefix: z.string().describe("Carrier prefix (3 digits)"), - }) - .readonly(); - export type AWBStockBusinessPartnerPreviewDTO = z.infer; - - /** - * AWBStockEmployeePreviewDTOSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Employee email - */ - export const AWBStockEmployeePreviewDTOSchema = z - .object({ id: z.string().describe("Employee ID"), email: z.string().describe("Employee email") }) - .readonly(); - export type AWBStockEmployeePreviewDTO = z.infer; - - /** - * AWBStockResponseDTOSchema - * @type { object } - * @property { string } id AWB stock ID - * @property { AWBStockBusinessPartnerPreviewDTO } carrier Carrier business partner - * @property { number } startNumber Start number - * @property { number } lastUsedNumber Last used number - * @property { number } stock Stock size - * @property { number } usedCodes Used codes count - * @property { number } priority Priority - * @property { boolean } archived Is archived - * @property { string } comments Comments - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { AWBStockEmployeePreviewDTO } createdBy User who created the stock - * @property { AWBStockEmployeePreviewDTO } updatedBy User who updated the stock - * @property { string } officeId Office ID - */ - export const AWBStockResponseDTOSchema = z - .object({ - id: z.string().describe("AWB stock ID"), - carrier: AWBStockBusinessPartnerPreviewDTOSchema.describe("Carrier business partner"), - startNumber: z.number().describe("Start number"), - lastUsedNumber: z.number().describe("Last used number").nullish(), - stock: z.number().describe("Stock size"), - usedCodes: z.number().describe("Used codes count"), - priority: z.number().describe("Priority"), - archived: z.boolean().describe("Is archived"), - comments: z.string().describe("Comments").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - createdBy: AWBStockEmployeePreviewDTOSchema.describe("User who created the stock"), - updatedBy: AWBStockEmployeePreviewDTOSchema.describe("User who updated the stock").nullish(), - officeId: z.string().describe("Office ID"), - }) - .readonly(); - export type AWBStockResponseDTO = z.infer; - - /** - * AWBStockFilterDtoSchema - * @type { object } - * @property { boolean } archived - * @property { string } carrierId - * @property { string } searchQuery - * @property { boolean } used - */ - export const AWBStockFilterDtoSchema = z - .object({ archived: z.boolean(), carrierId: z.string(), searchQuery: z.string(), used: z.boolean() }) - .readonly(); - export type AWBStockFilterDto = z.infer; - - /** - * CreateAWBStockRequestDTOSchema - * @type { object } - * @property { string } carrierId Carrier business partner ID - * @property { number } startNumber Start number. Minimum: `0` - * @property { number } stock Stock size - * @property { number } priority Priority - * @property { string } comments Comments - * @property { string } officeId Office ID - */ - export const CreateAWBStockRequestDTOSchema = z - .object({ - carrierId: z.string().describe("Carrier business partner ID"), - startNumber: z.number().gte(0).describe("Start number"), - stock: z.number().describe("Stock size"), - priority: z.number().describe("Priority"), - comments: z.string().describe("Comments").nullish(), - officeId: z.string().describe("Office ID"), - }) - .readonly(); - export type CreateAWBStockRequestDTO = z.infer; - - /** - * GenerateAWBNumberRequestDTOSchema - * @type { object } - * @property { string } carrierId Carrier ID. Example: `e847c7dd-a364-4488-bed6-1e5878aff022` - */ - export const GenerateAWBNumberRequestDTOSchema = z - .object({ carrierId: z.string().describe("Carrier ID") }) - .readonly(); - export type GenerateAWBNumberRequestDTO = z.infer; - - /** - * GenerateAWBNumberResponseDTOSchema - * @type { object } - * @property { string } formattedAwbNumber Generated AWB number. Example: `123-45678901` - */ - export const GenerateAWBNumberResponseDTOSchema = z - .object({ formattedAwbNumber: z.string().describe("Generated AWB number") }) - .readonly(); - export type GenerateAWBNumberResponseDTO = z.infer; - - /** - * UpdateAWBStockRequestDTOSchema - * @type { object } - * @property { string } comments Comments - */ - export const UpdateAWBStockRequestDTOSchema = z.object({ comments: z.string().describe("Comments") }).readonly(); - export type UpdateAWBStockRequestDTO = z.infer; - - /** - * AWBStocksPaginateOrderParamEnumSchema - * @type { enum } - */ - export const AWBStocksPaginateOrderParamEnumSchema = z.enum([ - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "carrierName", - "startNumber", - "priority", - ]); - export type AWBStocksPaginateOrderParamEnum = z.infer; - export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSchema.enum; - - /** - * AWBStocksPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { AWBStockResponseDTO[] } items - */ - export const AWBStocksPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(AWBStockResponseDTOSchema).readonly() }).readonly().shape, - }); - export type AWBStocksPaginateResponse = z.infer; -} diff --git a/test/generated/dist/aWBStocks/aWBStocks.queries.ts b/test/generated/dist/aWBStocks/aWBStocks.queries.ts deleted file mode 100644 index 1731fbc..0000000 --- a/test/generated/dist/aWBStocks/aWBStocks.queries.ts +++ /dev/null @@ -1,319 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AWBStocksAcl } from "./aWBStocks.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AWBStocksModels } from "./aWBStocks.models"; -import { AWBStocksApi } from "./aWBStocks.api"; - -export namespace AWBStocksQueries { - export const moduleName = QueryModule.AWBStocks; - - export const keys = { - all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: AWBStocksModels.AWBStockFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/awb-stocks", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: AWBStocksModels.AWBStockFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/awb-stocks", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (stockId: string, officeId: string) => - [...keys.all, "/offices/:officeId/awb-stocks/:stockId", stockId, officeId] as const, - }; - - /** - * Query `usePaginate` - * @summary List AWB stocks - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` - * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: AWBStocksModels.AWBStockFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AWBStocksAcl.canUsePaginate({ officeId })); - return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary List AWB stocks - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` - * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { officeId: string; limit: number; order?: string; filter?: AWBStocksModels.AWBStockFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AWBStocksAcl.canUsePaginate({ officeId })); - return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create AWB stock - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.CreateAWBStockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof AWBStocksApi.create, - { officeId: string; data: AWBStocksModels.CreateAWBStockRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(AWBStocksAcl.canUseCreate({ officeId })); - return AWBStocksApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get AWB stock details - * @permission Requires `canUseFindById` ability - * @param { string } object.stockId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { stockId, officeId }: { stockId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(stockId, officeId), - queryFn: () => { - checkAcl(AWBStocksAcl.canUseFindById({ officeId })); - return AWBStocksApi.findById(stockId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update AWB stock comments - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.UpdateAWBStockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof AWBStocksApi.update, - { stockId: string; officeId: string; data: AWBStocksModels.UpdateAWBStockRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId, data }) => { - checkAcl(AWBStocksAcl.canUseUpdate({ officeId })); - return AWBStocksApi.update(stockId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive AWB stock - * @permission Requires `canUseArchive` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId }) => { - checkAcl(AWBStocksAcl.canUseArchive({ officeId })); - return AWBStocksApi.archive(stockId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive AWB stock - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId }) => { - checkAcl(AWBStocksAcl.canUseUnarchive({ officeId })); - return AWBStocksApi.unarchive(stockId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateNextNumber` - * @summary Generate next AWB number for carrier - * @permission Requires `canUseGenerateNextNumber` ability - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.GenerateAWBNumberRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateNextNumber = ( - options?: AppMutationOptions< - typeof AWBStocksApi.generateNextNumber, - { officeId: string; data: AWBStocksModels.GenerateAWBNumberRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId })); - return AWBStocksApi.generateNextNumber(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/acl/app.ability.ts b/test/generated/dist/acl/app.ability.ts deleted file mode 100644 index 3aad6f4..0000000 --- a/test/generated/dist/acl/app.ability.ts +++ /dev/null @@ -1,387 +0,0 @@ -import { PureAbility, AbilityTuple, ForcedSubject } from "@casl/ability"; - -export type AppAbilities = - | AbilityTuple< - "Read", - | "WorkingDocument" - | (ForcedSubject<"WorkingDocument"> & { officeId: string }) - | "Office" - | "Currency" - | "Country" - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - | "BusinessPartner" - | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - | "City" - | "Depot" - | "PartnerNetwork" - | "Warehouse" - | "DocumentTemplate" - | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - | "HsCode" - | "CargoType" - | "Position" - | (ForcedSubject<"Position"> & { officeId: string }) - | "Terminal" - | "Airport" - | "Port" - | "ContainerYard" - | "PositionAccount" - | (ForcedSubject<"PositionAccount"> & { officeId: string }) - | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - | "PositionCargo" - | (ForcedSubject<"PositionCargo"> & { officeId: string }) - | "PackageType" - | "WorkingDocument-house-bl" - | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - | "WorkingDocument-bl-instructions" - | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - | "WorkingDocument-ams-instructions" - | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - | "WorkingDocument-house-awb" - | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - | "ChargeType" - | "WorkingDocument-master-awb" - | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - | "WorkingDocument-cmr-form" - | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - | "WorkingDocument-isf-form" - | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - | "WorkingDocument-fcr-form" - | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - | "Role" - | (ForcedSubject<"Role"> & { context?: string }) - | "Permission" - | "Employee" - | (ForcedSubject<"Employee"> & { officeId?: string }) - | (ForcedSubject<"Employee"> & { officeId: string }) - | "Employment" - | (ForcedSubject<"Employment"> & { officeId?: string }) - | "Customer" - | "Quote" - | (ForcedSubject<"Quote"> & { officeId: string }) - | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) - | "QuoteCargo" - | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - | "Dunning" - | (ForcedSubject<"Dunning"> & { officeId: string }) - | "PositionInvoice" - | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - | "DunningLevel" - | (ForcedSubject<"DunningLevel"> & { officeId: string }) - | "DunningSystem" - | (ForcedSubject<"DunningSystem"> & { officeId: string }) - | "VatRule" - | "ProjectLite" - | (ForcedSubject<"ProjectLite"> & { officeId: string }) - | "ChecklistTemplate" - | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - | "BookkeepingExportBatch" - | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - | "FactoringExport" - | (ForcedSubject<"FactoringExport"> & { officeId: string }) - | "AWBStock" - | (ForcedSubject<"AWBStock"> & { officeId: string }) - | "ChecklistItem" - | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - | "RemarkTemplate" - | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - | "IntegrationChannel" - | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - | "IntegrationMessage" - | (ForcedSubject<"IntegrationMessage"> & { officeId: string }) - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - | (ForcedSubject<"Office"> & { officeId: string }) - > - | AbilityTuple< - "Create", - | "Office" - | "Currency" - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - | "BusinessPartner" - | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - | "City" - | "Depot" - | "PartnerNetwork" - | "Warehouse" - | "DocumentTemplate" - | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - | "HsCode" - | "CargoType" - | "Terminal" - | "Airport" - | "Port" - | "ContainerYard" - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - | "PositionCargo" - | (ForcedSubject<"PositionCargo"> & { officeId: string }) - | "PackageType" - | "WorkingDocument-house-bl" - | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - | "WorkingDocument-bl-instructions" - | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - | "WorkingDocument-ams-instructions" - | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - | "WorkingDocument-house-awb" - | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - | "ChargeType" - | "WorkingDocument-master-awb" - | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - | "WorkingDocument-cmr-form" - | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - | "WorkingDocument-isf-form" - | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - | "WorkingDocument-fcr-form" - | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - | "Role" - | "Employee" - | (ForcedSubject<"Employee"> & { officeId?: string }) - | (ForcedSubject<"Employee"> & { officeId: string }) - | "Employment" - | (ForcedSubject<"Employment"> & { officeId: string }) - | "Customer" - | "Quote" - | (ForcedSubject<"Quote"> & { officeId: string }) - | "QuoteCargo" - | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - | "Dunning" - | (ForcedSubject<"Dunning"> & { officeId: string }) - | "DunningLevel" - | (ForcedSubject<"DunningLevel"> & { officeId: string }) - | "DunningSystem" - | (ForcedSubject<"DunningSystem"> & { officeId: string }) - | "Position" - | (ForcedSubject<"Position"> & { officeId: string }) - | "PositionInvoice" - | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - | "VatRule" - | "ProjectLite" - | (ForcedSubject<"ProjectLite"> & { officeId: string }) - | "ChecklistTemplate" - | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - | "BookkeepingExportBatch" - | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - | "FactoringExport" - | (ForcedSubject<"FactoringExport"> & { officeId: string }) - | "AWBStock" - | (ForcedSubject<"AWBStock"> & { officeId: string }) - | "ChecklistItem" - | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - | "RemarkTemplate" - | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - | "IntegrationChannel" - | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - > - | AbilityTuple< - "Update", - | "Office" - | (ForcedSubject<"Office"> & { officeId: string }) - | "Currency" - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - | "BusinessPartner" - | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - | "BusinessPartnerBasicTab" - | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) - | "BusinessPartnerBookkeeping" - | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - | "City" - | "Depot" - | "PartnerNetwork" - | "Warehouse" - | "DocumentTemplate" - | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - | "HsCode" - | "CargoType" - | "Position" - | (ForcedSubject<"Position"> & { officeId: string }) - | "Terminal" - | "Airport" - | "Port" - | "ContainerYard" - | "PositionAccount" - | (ForcedSubject<"PositionAccount"> & { officeId: string }) - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - | "PositionCargo" - | (ForcedSubject<"PositionCargo"> & { officeId: string }) - | "PackageType" - | "WorkingDocument-house-bl" - | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - | "WorkingDocument-bl-instructions" - | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - | "WorkingDocument-ams-instructions" - | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - | "WorkingDocument-house-awb" - | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - | "ChargeType" - | "WorkingDocument-master-awb" - | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - | "WorkingDocument-cmr-form" - | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - | "WorkingDocument-isf-form" - | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - | "WorkingDocument-fcr-form" - | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - | "Role" - | "Employee" - | (ForcedSubject<"Employee"> & { officeId: string }) - | "Customer" - | "Quote" - | (ForcedSubject<"Quote"> & { officeId: string }) - | "QuoteCargo" - | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - | "DunningLevel" - | (ForcedSubject<"DunningLevel"> & { officeId: string }) - | "DunningSystem" - | (ForcedSubject<"DunningSystem"> & { officeId: string }) - | "PositionInvoice" - | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - | "VatRule" - | "ProjectLite" - | (ForcedSubject<"ProjectLite"> & { officeId: string }) - | "ChecklistTemplate" - | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - | "BookkeepingExportBatch" - | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - | "FactoringExport" - | (ForcedSubject<"FactoringExport"> & { officeId: string }) - | "AWBStock" - | (ForcedSubject<"AWBStock"> & { officeId: string }) - | "ChecklistItem" - | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - | "RemarkTemplate" - | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - | "IntegrationChannel" - | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - > - | AbilityTuple< - "Delete", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - | "BusinessPartnerBookkeeping" - | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - | "PositionCargo" - | (ForcedSubject<"PositionCargo"> & { officeId: string }) - | "WorkingDocument-house-bl" - | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - | "WorkingDocument-bl-instructions" - | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - | "WorkingDocument-ams-instructions" - | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - | "WorkingDocument-house-awb" - | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - | "WorkingDocument-master-awb" - | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - | "WorkingDocument-cmr-form" - | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - | "WorkingDocument-isf-form" - | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - | "WorkingDocument-fcr-form" - | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - | "Role" - | "QuoteCargo" - | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - | "PositionInvoice" - | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - > - | AbilityTuple< - "Archive", - | "BusinessPartner" - | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - | "City" - | "Depot" - | "PartnerNetwork" - | "Warehouse" - | "DocumentTemplate" - | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - | "HsCode" - | "CargoType" - | "Terminal" - | "PackageType" - | "ChargeType" - | "Employee" - | "Employment" - | (ForcedSubject<"Employment"> & { officeId: string }) - | "DunningLevel" - | (ForcedSubject<"DunningLevel"> & { officeId: string }) - | "DunningSystem" - | (ForcedSubject<"DunningSystem"> & { officeId: string }) - | "ProjectLite" - | (ForcedSubject<"ProjectLite"> & { officeId: string }) - | "ChecklistTemplate" - | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - | "ChecklistItem" - | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - | "RemarkTemplate" - | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - | "IntegrationChannel" - | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - > - | AbilityTuple<"ReadRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> - | AbilityTuple<"CreateRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> - | AbilityTuple<"UpdateRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> - | AbilityTuple<"DeleteRemark", "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string })> - | AbilityTuple< - "Unarchive", - | "DocumentTemplate" - | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - | "Terminal" - | "Employee" - | "Employment" - | (ForcedSubject<"Employment"> & { officeId: string }) - | "DunningLevel" - | (ForcedSubject<"DunningLevel"> & { officeId: string }) - | "RemarkTemplate" - | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - > - | AbilityTuple< - "Duplicate", - | "PositionAccount" - | (ForcedSubject<"PositionAccount"> & { officeId: string }) - | "PositionCargo" - | (ForcedSubject<"PositionCargo"> & { officeId: string }) - | "QuoteCargo" - | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - > - | AbilityTuple<"Reassign", "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string })> - | AbilityTuple<"ListRoles", "Employee" | "Employment" | (ForcedSubject<"Employment"> & { officeId: string })> - | AbilityTuple<"UpdateRoles", "Employee" | "Employment" | (ForcedSubject<"Employment"> & { officeId: string })> - | AbilityTuple<"Deactivate", "Customer"> - | AbilityTuple<"Reactivate", "Customer"> - | AbilityTuple< - "Export", - | "Quote" - | (ForcedSubject<"Quote"> & { officeId: string }) - | "Position" - | (ForcedSubject<"Position"> & { officeId: string }) - | "PositionInvoice" - | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - | "UninvoicedCharge" - | (ForcedSubject<"UninvoicedCharge"> & { officeId: string }) - | "InvoicePayment" - | (ForcedSubject<"InvoicePayment"> & { officeId: string }) - | "BookkeepingExportBatch" - | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - > - | AbilityTuple<"ReadInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> - | AbilityTuple<"CreateInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> - | AbilityTuple<"UpdateInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> - | AbilityTuple<"DeleteInvolvedParties", "Quote" | (ForcedSubject<"Quote"> & { officeId: string })> - | AbilityTuple<"TotalProfitView", "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string })> - | AbilityTuple<"RevertCancel", "Position" | (ForcedSubject<"Position"> & { officeId: string })> - | AbilityTuple<"Fix", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> - | AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> - | AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string })> - | AbilityTuple<"Import", "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string })>; - -export type AppAbility = PureAbility; diff --git a/test/generated/dist/acl/useAclCheck.ts b/test/generated/dist/acl/useAclCheck.ts deleted file mode 100644 index 40d64ad..0000000 --- a/test/generated/dist/acl/useAclCheck.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; -import { type ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; -import { AbilityContext } from "@povio/openapi-codegen-cli/acl"; -import { useCallback } from "react"; -import { AppAbilities } from "@/data/acl/app.ability"; - -interface UseAclCheckProps { - errorHandler?: ErrorHandler; -} - -export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { - const ability = AbilityContext.useAbility(); - - const checkAcl = useCallback( - (appAbility: AppAbilities) => { - if (!ability.can(...(appAbility as AbilityTuple))) { - (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); - } - }, - [ability, errorHandler], - ); - - return { checkAcl }; -} diff --git a/test/generated/dist/airPositions/airPositions.acl.ts b/test/generated/dist/airPositions/airPositions.acl.ts deleted file mode 100644 index 10a4dc7..0000000 --- a/test/generated/dist/airPositions/airPositions.acl.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace AirPositionsAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get air position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update air position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/airPositions/airPositions.api.ts b/test/generated/dist/airPositions/airPositions.api.ts deleted file mode 100644 index 172bf2e..0000000 --- a/test/generated/dist/airPositions/airPositions.api.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { AirPositionsModels } from "./airPositions.models"; - -export namespace AirPositionsApi { - export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/air-position`, - config, - ); - }; - export const update = ( - officeId: string, - positionId: string, - data: AirPositionsModels.UpdateAirPositionRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/air-position`, - ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/airPositions/airPositions.models.ts b/test/generated/dist/airPositions/airPositions.models.ts deleted file mode 100644 index a3dd669..0000000 --- a/test/generated/dist/airPositions/airPositions.models.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { z } from "zod"; - -export namespace AirPositionsModels { - /** - * AirPositionCustomsStatusTypeEnumSchema - * @type { enum } - */ - export const AirPositionCustomsStatusTypeEnumSchema = z.enum(["Other", "X", "C", "TD", "T1"]); - export type AirPositionCustomsStatusTypeEnum = z.infer; - export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnumSchema.enum; - - /** - * AirPositionResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } hawbNumber - * @property { string } mawbNumber - * @property { string } airlineDeadline - * @property { string } customsStatus - * @property { AirPositionCustomsStatusTypeEnum } customsStatusType - * @property { boolean } hawbRequired - * @property { boolean } mawbRequired - * @property { string } mrnT1Number - * @property { boolean } isCourier - * @property { string } deliveryToConsignee - * @property { string } createdAt - * @property { string } updatedAt - */ - export const AirPositionResponseDTOSchema = z - .object({ - id: z.string(), - hawbNumber: z.string().nullish(), - mawbNumber: z.string().nullish(), - airlineDeadline: z.iso.datetime({ offset: true }).nullish(), - customsStatus: z.string().nullish(), - customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), - hawbRequired: z.boolean(), - mawbRequired: z.boolean(), - mrnT1Number: z.string().nullish(), - isCourier: z.boolean().nullish(), - deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type AirPositionResponseDTO = z.infer; - - /** - * UpdateAirPositionRequestDTOSchema - * @type { object } - * @property { string } hawbNumber - * @property { string } mawbNumber - * @property { string } airlineDeadline - * @property { string } customsStatus - * @property { AirPositionCustomsStatusTypeEnum } customsStatusType - * @property { string } mrnT1Number - * @property { boolean } hawbRequired - * @property { boolean } mawbRequired - * @property { boolean } isCourier - * @property { string } deliveryToConsignee - */ - export const UpdateAirPositionRequestDTOSchema = z - .object({ - hawbNumber: z.string(), - mawbNumber: z.string(), - airlineDeadline: z.iso.datetime({ offset: true }), - customsStatus: z.string(), - customsStatusType: AirPositionCustomsStatusTypeEnumSchema, - mrnT1Number: z.string(), - hawbRequired: z.boolean(), - mawbRequired: z.boolean(), - isCourier: z.boolean(), - deliveryToConsignee: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type UpdateAirPositionRequestDTO = z.infer; -} diff --git a/test/generated/dist/airPositions/airPositions.queries.ts b/test/generated/dist/airPositions/airPositions.queries.ts deleted file mode 100644 index 3cddf4f..0000000 --- a/test/generated/dist/airPositions/airPositions.queries.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AirPositionsAcl } from "./airPositions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AirPositionsModels } from "./airPositions.models"; -import { AirPositionsApi } from "./airPositions.api"; - -export namespace AirPositionsQueries { - export const moduleName = QueryModule.AirPositions; - - export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/air-position", officeId, positionId] as const, - }; - - /** - * Query `useGet` - * @summary Get air position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(AirPositionsAcl.canUseGet({ officeId })); - return AirPositionsApi.get(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update air position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AirPositionsModels.UpdateAirPositionRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof AirPositionsApi.update, - { officeId: string; positionId: string; data: AirPositionsModels.UpdateAirPositionRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(AirPositionsAcl.canUseUpdate({ officeId })); - return AirPositionsApi.update(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/airports/airports.acl.ts b/test/generated/dist/airports/airports.acl.ts deleted file mode 100644 index 5ec8aa1..0000000 --- a/test/generated/dist/airports/airports.acl.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace AirportsAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Airport"] as AbilityTuple<"Create", "Airport">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Airport"] as AbilityTuple<"Update", "Airport">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "Airport"] as AbilityTuple<"Read", "Airport">; -} diff --git a/test/generated/dist/airports/airports.api.ts b/test/generated/dist/airports/airports.api.ts deleted file mode 100644 index 0ea10f9..0000000 --- a/test/generated/dist/airports/airports.api.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { AirportsModels } from "./airports.models"; - -export namespace AirportsApi { - export const paginate = ( - limit: number, - order?: string, - filter?: AirportsModels.AirportPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: AirportsModels.AirportsPaginateResponseSchema }, `/airports`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: AirportsModels.CreateAirportRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports`, - ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), - config, - ); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: AirportsModels.AirportLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, - `/airports/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports/${id}`, - ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), - config, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: AirportsModels.AirportResponseDTOSchema }, `/airports/${id}`, config); - }; -} diff --git a/test/generated/dist/airports/airports.configs.ts b/test/generated/dist/airports/airports.configs.ts deleted file mode 100644 index 477cb42..0000000 --- a/test/generated/dist/airports/airports.configs.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { AirportsModels } from "./airports.models"; -import { CommonModels } from "@/data/common/common.models"; -import { AirportsQueries } from "./airports.queries"; -import { AirportsAcl } from "./airports.acl"; - -export namespace AirportsConfigs { - export const airportsConfig = { - meta: { - title: "Airports", - }, - readAll: { - acl: AirportsAcl.canUsePaginate, - schema: AirportsModels.AirportResponseDTOSchema, - paginated: AirportsQueries.usePaginate, - infinite: AirportsQueries.usePaginateInfinite, - filters: { - schema: AirportsModels.AirportPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AirportsModels.AirportPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: AirportsModels.AirportResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - iataCode: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: AirportsModels.AirportsPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: AirportsAcl.canUseFindById, - schema: AirportsModels.AirportResponseDTOSchema, - query: AirportsQueries.useFindById, - }, - create: { - acl: AirportsAcl.canUseCreate, - schema: AirportsModels.CreateAirportRequestDTOSchema, - mutation: AirportsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: AirportsModels.CreateAirportRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - iataCode: true, - }, - }, - }), - }, - update: { - acl: AirportsAcl.canUseUpdate, - schema: AirportsModels.UpdateAirportRequestDTOSchema, - mutation: AirportsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: AirportsModels.UpdateAirportRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - iataCode: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: AirportsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: AirportsQueries.usePaginateLabels, - infinite: AirportsQueries.usePaginateLabelsInfinite, - filters: { - schema: AirportsModels.AirportLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AirportsModels.AirportLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/airports/airports.models.ts b/test/generated/dist/airports/airports.models.ts deleted file mode 100644 index 790cc10..0000000 --- a/test/generated/dist/airports/airports.models.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace AirportsModels { - /** - * AirportEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type AirportEmployeeDTO = z.infer; - - /** - * AirportResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the airport - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - * @property { string } createdById - * @property { AirportEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { AirportEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const AirportResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the airport"), - name: z.string().describe("Name of the airport"), - matchCode: z.string().describe("Match code for the airport"), - iataCode: z.string().describe("IATA code of the airport"), - createdById: z.string().nullish(), - createdBy: AirportEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: AirportEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type AirportResponseDTO = z.infer; - - /** - * AirportPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter airports by name, match code or IATA code - */ - export const AirportPaginationFilterDtoSchema = z - .object({ search: z.string().describe("Search term to filter airports by name, match code or IATA code") }) - .readonly(); - export type AirportPaginationFilterDto = z.infer; - - /** - * AirportLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const AirportLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type AirportLabelFilterDto = z.infer; - - /** - * CreateAirportRequestDTOSchema - * @type { object } - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - */ - export const CreateAirportRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the airport"), - matchCode: z.string().describe("Match code for the airport"), - iataCode: z.string().describe("IATA code of the airport"), - }) - .readonly(); - export type CreateAirportRequestDTO = z.infer; - - /** - * UpdateAirportRequestDTOSchema - * @type { object } - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - */ - export const UpdateAirportRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the airport"), - matchCode: z.string().describe("Match code for the airport"), - iataCode: z.string().describe("IATA code of the airport"), - }) - .readonly(); - export type UpdateAirportRequestDTO = z.infer; - - /** - * AirportsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const AirportsPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "iataCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type AirportsPaginateOrderParamEnum = z.infer; - export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSchema.enum; - - /** - * AirportsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { AirportResponseDTO[] } items - */ - export const AirportsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(AirportResponseDTOSchema).readonly() }).readonly().shape, - }); - export type AirportsPaginateResponse = z.infer; - - /** - * AirportsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const AirportsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "iataCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type AirportsPaginateLabelsOrderParamEnum = z.infer; - export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderParamEnumSchema.enum; - - /** - * AirportsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const AirportsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type AirportsPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/airports/airports.queries.ts b/test/generated/dist/airports/airports.queries.ts deleted file mode 100644 index 3f6c5b9..0000000 --- a/test/generated/dist/airports/airports.queries.ts +++ /dev/null @@ -1,294 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AirportsAcl } from "./airports.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AirportsModels } from "./airports.models"; -import { AirportsApi } from "./airports.api"; - -export namespace AirportsQueries { - export const moduleName = QueryModule.Airports; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: AirportsModels.AirportPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/airports", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: AirportsModels.AirportPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/airports", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: AirportsModels.AirportLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/airports/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: AirportsModels.AirportLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/airports/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/airports/:id", id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Airports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: AirportsModels.AirportPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Airports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: AirportsModels.AirportPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create airport - * @permission Requires `canUseCreate` ability - * @param { AirportsModels.CreateAirportRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(AirportsAcl.canUseCreate()); - return AirportsApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate airports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: AirportsModels.AirportLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate airports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: AirportsModels.AirportLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update airport - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { AirportsModels.UpdateAirportRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof AirportsApi.update, - { id: string; data: AirportsModels.UpdateAirportRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(AirportsAcl.canUseUpdate()); - return AirportsApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get airport - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(AirportsAcl.canUseFindById()); - return AirportsApi.findById(id, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/app-rest-client.ts b/test/generated/dist/app-rest-client.ts deleted file mode 100644 index 389b1f4..0000000 --- a/test/generated/dist/app-rest-client.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RestClient } from "@povio/openapi-codegen-cli"; - -export const AppRestClient = new RestClient({ - config: { - baseURL: "http://localhost:4000", - }, -}); diff --git a/test/generated/dist/bankAccounts/bankAccounts.acl.ts b/test/generated/dist/bankAccounts/bankAccounts.acl.ts deleted file mode 100644 index d8024f8..0000000 --- a/test/generated/dist/bankAccounts/bankAccounts.acl.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace BankAccountsAcl { - /** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; -} diff --git a/test/generated/dist/bankAccounts/bankAccounts.api.ts b/test/generated/dist/bankAccounts/bankAccounts.api.ts deleted file mode 100644 index bd4a5d1..0000000 --- a/test/generated/dist/bankAccounts/bankAccounts.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BankAccountsModels } from "./bankAccounts.models"; - -export namespace BankAccountsApi { - export const findAll = (search?: string, officeId?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, - `/bank-accounts/labels`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), - }, - }, - ); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: BankAccountsModels.BankAccountFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, - `/bank-accounts/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; -} diff --git a/test/generated/dist/bankAccounts/bankAccounts.configs.ts b/test/generated/dist/bankAccounts/bankAccounts.configs.ts deleted file mode 100644 index 2659ac4..0000000 --- a/test/generated/dist/bankAccounts/bankAccounts.configs.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { BankAccountsModels } from "./bankAccounts.models"; -import { BankAccountsQueries } from "./bankAccounts.queries"; -import { BankAccountsAcl } from "./bankAccounts.acl"; - -export namespace BankAccountsConfigs { - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: BankAccountsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: BankAccountsQueries.usePaginateLabels, - infinite: BankAccountsQueries.usePaginateLabelsInfinite, - filters: { - schema: BankAccountsModels.BankAccountFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BankAccountsModels.BankAccountFilterDtoSchema, - options: { - inputs: { - search: true, - officeId: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/bankAccounts/bankAccounts.models.ts b/test/generated/dist/bankAccounts/bankAccounts.models.ts deleted file mode 100644 index 8c8b664..0000000 --- a/test/generated/dist/bankAccounts/bankAccounts.models.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BankAccountsModels { - /** - * BankAccountFilterDtoSchema - * @type { object } - * @property { string } search Search by name or bank name - * @property { string } officeId Office ID to filter by - */ - export const BankAccountFilterDtoSchema = z - .object({ - search: z.string().describe("Search by name or bank name"), - officeId: z.string().describe("Office ID to filter by"), - }) - .readonly(); - export type BankAccountFilterDto = z.infer; - - /** - * BankAccountsFindAllResponseSchema - * @type { array } - */ - export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type BankAccountsFindAllResponse = z.infer; - - /** - * BankAccountsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const BankAccountsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "bankName", "createdAt", "updatedAt"]); - export type BankAccountsPaginateLabelsOrderParamEnum = z.infer; - export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabelsOrderParamEnumSchema.enum; - - /** - * BankAccountsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const BankAccountsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type BankAccountsPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/bankAccounts/bankAccounts.queries.ts b/test/generated/dist/bankAccounts/bankAccounts.queries.ts deleted file mode 100644 index 5ac3804..0000000 --- a/test/generated/dist/bankAccounts/bankAccounts.queries.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BankAccountsAcl } from "./bankAccounts.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { BankAccountsModels } from "./bankAccounts.models"; -import { BankAccountsApi } from "./bankAccounts.api"; - -export namespace BankAccountsQueries { - export const moduleName = QueryModule.BankAccounts; - - export const keys = { - all: [moduleName] as const, - findAll: (search?: string, officeId?: string) => [...keys.all, "/bank-accounts/labels", search, officeId] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: BankAccountsModels.BankAccountFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/bank-accounts/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: BankAccountsModels.BankAccountFilterDto, - cursor?: string, - ) => [...keys.all, "/bank-accounts/labels/paginate", "infinite", limit, order, filter, cursor] as const, - }; - - /** - * Query `useFindAll` - * @summary List all bank accounts with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { string } object.officeId Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { search, officeId }: { search?: string; officeId?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search, officeId), - queryFn: () => { - checkAcl(BankAccountsAcl.canUseFindAll()); - return BankAccountsApi.findAll(search, officeId, config); - }, - ...options, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate bank account labels (id and name only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` - * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: BankAccountsModels.BankAccountFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate bank account labels (id and name only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` - * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: BankAccountsModels.BankAccountFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/bookkeepingExport/bookkeepingExport.acl.ts b/test/generated/dist/bookkeepingExport/bookkeepingExport.acl.ts deleted file mode 100644 index 7fa63b1..0000000 --- a/test/generated/dist/bookkeepingExport/bookkeepingExport.acl.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BookkeepingExportAcl { - /** - * Use for `useCreateBatch` mutation ability. For global ability, omit the object parameter. - * @description Create bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBatch` mutation - */ - export const canUseCreateBatch = (object?: { officeId: string }) => - ["Create", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Create", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; - - /** - * Use for `usePaginateBatches` query ability. For global ability, omit the object parameter. - * @description List bookkeeping export batches - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatches` query - */ - export const canUsePaginateBatches = (object?: { officeId: string }) => - ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Read", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; - - /** - * Use for `useGetBatch` query ability. For global ability, omit the object parameter. - * @description Get bookkeeping export batch details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query - */ - export const canUseGetBatch = (object?: { officeId: string }) => - ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Read", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; - - /** - * Use for `useUpdateBatchFormat` mutation ability. For global ability, omit the object parameter. - * @description Update bookkeeping export batch format - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchFormat` mutation - */ - export const canUseUpdateBatchFormat = (object?: { officeId: string }) => - ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Update", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; - - /** - * Use for `useUpdateBatchItem` mutation ability. For global ability, omit the object parameter. - * @description Update bookkeeping export batch item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchItem` mutation - */ - export const canUseUpdateBatchItem = (object?: { officeId: string }) => - ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Update", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; - - /** - * Use for `usePaginateBatchItems` query ability. For global ability, omit the object parameter. - * @description List batch items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatchItems` query - */ - export const canUsePaginateBatchItems = (object?: { officeId: string }) => - ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Read", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; - - /** - * Use for `useValidateBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Export bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useValidateBookkeepingBatch` mutation - */ - export const canUseValidateBookkeepingBatch = (object?: { officeId: string }) => - ["Export", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Export", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; - - /** - * Use for `useExportBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Export bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportBookkeepingBatch` mutation - */ - export const canUseExportBookkeepingBatch = (object?: { officeId: string }) => - ["Export", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Export", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; - - /** - * Use for `useRevertBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Revert bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertBookkeepingBatch` mutation - */ - export const canUseRevertBookkeepingBatch = (object?: { officeId: string }) => - ["Update", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Update", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; - - /** - * Use for `useGetVatLineItems` query ability. For global ability, omit the object parameter. - * @description Get VAT line items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetVatLineItems` query - */ - export const canUseGetVatLineItems = (object?: { officeId: string }) => - ["Read", object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch"] as AbilityTuple< - "Read", - "BookkeepingExportBatch" | (ForcedSubject<"BookkeepingExportBatch"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/bookkeepingExport/bookkeepingExport.api.ts b/test/generated/dist/bookkeepingExport/bookkeepingExport.api.ts deleted file mode 100644 index e6b7a21..0000000 --- a/test/generated/dist/bookkeepingExport/bookkeepingExport.api.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; - -export namespace BookkeepingExportApi { - export const createBatch = ( - officeId: string, - data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, - `/offices/${officeId}/bookkeeping-exports`, - ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), - config, - ); - }; - export const paginateBatches = ( - officeId: string, - limit: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, - `/offices/${officeId}/bookkeeping-exports`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const getBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, - `/offices/${officeId}/bookkeeping-exports/${batchId}`, - config, - ); - }; - export const updateBatchFormat = ( - officeId: string, - batchId: string, - data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, - `/offices/${officeId}/bookkeeping-exports/${batchId}`, - ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), - config, - ); - }; - export const updateBatchItem = ( - officeId: string, - batchId: string, - data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, - ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), - config, - ); - }; - export const paginateBatchItems = ( - officeId: string, - batchId: string, - limit: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, - `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const validateBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, - undefined, - config, - ); - }; - export const exportBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, - undefined, - config, - ); - }; - export const revertBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, - undefined, - config, - ); - }; - export const getVatLineItems = (officeId: string, batchId: string, order?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, - `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - }, - }, - ); - }; -} diff --git a/test/generated/dist/bookkeepingExport/bookkeepingExport.configs.ts b/test/generated/dist/bookkeepingExport/bookkeepingExport.configs.ts deleted file mode 100644 index da4a913..0000000 --- a/test/generated/dist/bookkeepingExport/bookkeepingExport.configs.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; -import { BookkeepingExportQueries } from "./bookkeepingExport.queries"; -import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; - -export namespace BookkeepingExportConfigs { - export const bookkeepingExportsConfig = { - meta: { - title: "Bookkeeping Exports", - }, - readAll: { - acl: BookkeepingExportAcl.canUsePaginateBatches, - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, - paginated: BookkeepingExportQueries.usePaginateBatches, - infinite: BookkeepingExportQueries.usePaginateBatchesInfinite, - filters: { - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, - options: { - inputs: { - createdDate: true, - status: true, - format: true, - createdBy: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, - options: { - columns: { - id: true, - format: true, - status: true, - totalInvoiceCount: true, - exportedInvoiceCount: true, - createdBy: true, - createdAt: true, - exportedAt: true, - revertedAt: true, - files: true, - }, - sortable: BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema, - }, - }), - }, - read: { - acl: BookkeepingExportAcl.canUseGetBatch, - schema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema, - query: BookkeepingExportQueries.useGetBatch, - }, - create: { - acl: BookkeepingExportAcl.canUseCreateBatch, - schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, - mutation: BookkeepingExportQueries.useCreateBatch, - inputDefs: dynamicInputs({ - schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, - options: { - inputs: { - format: true, - invoiceFilters: true, - }, - }, - }), - }, - update: { - acl: BookkeepingExportAcl.canUseUpdateBatchFormat, - schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, - mutation: BookkeepingExportQueries.useUpdateBatchFormat, - inputDefs: dynamicInputs({ - schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, - options: { - inputs: { - format: true, - }, - }, - }), - }, - }; - - export const itemsConfig = { - meta: { - title: "Items", - }, - readAll: { - acl: BookkeepingExportAcl.canUsePaginateBatchItems, - schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, - paginated: BookkeepingExportQueries.usePaginateBatchItems, - infinite: BookkeepingExportQueries.usePaginateBatchItemsInfinite, - filters: { - schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, - options: { - inputs: { - status: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, - options: { - columns: { - id: true, - invoiceId: true, - status: true, - includedInExport: true, - validationIssues: true, - invoice: true, - receiver: true, - comments: true, - }, - sortable: BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/bookkeepingExport/bookkeepingExport.models.ts b/test/generated/dist/bookkeepingExport/bookkeepingExport.models.ts deleted file mode 100644 index 98765c8..0000000 --- a/test/generated/dist/bookkeepingExport/bookkeepingExport.models.ts +++ /dev/null @@ -1,466 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BookkeepingExportModels { - /** - * BookkeepingExportFormatEnumSchema - * @type { enum } - */ - export const BookkeepingExportFormatEnumSchema = z.enum(["Bmd", "BmdWithoutCost", "BmdHamburg", "Abra", "Pantheon"]); - export type BookkeepingExportFormatEnum = z.infer; - export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enum; - - /** - * CreateBookkeepingExportBatchRequestDtoSchema - * @type { object } - * @property { BookkeepingExportFormatEnum } format - * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters - */ - export const CreateBookkeepingExportBatchRequestDtoSchema = z - .object({ - format: BookkeepingExportFormatEnumSchema.nullish(), - invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema, - }) - .readonly(); - export type CreateBookkeepingExportBatchRequestDto = z.infer; - - /** - * BookkeepingExportFileTypeEnumSchema - * @type { enum } - */ - export const BookkeepingExportFileTypeEnumSchema = z.enum([ - "Invoices", - "BusinessPartners", - "Report", - "AbraAddressBook", - "AbraIssuedInvoices", - "AbraIssuedInvoiceItems", - "AbraReceivedInvoices", - "AbraReceivedInvoiceItems", - "PantheonInvoicesOutgoingEur", - "PantheonInvoicesOutgoingUsd", - "PantheonInvoicesIncomingEur", - "PantheonInvoicesIncomingUsd", - "PantheonCostCenters", - ]); - export type BookkeepingExportFileTypeEnum = z.infer; - export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema.enum; - - /** - * BookkeepingExportFileDtoSchema - * @type { object } - * @property { BookkeepingExportFileTypeEnum } variant - * @property { string } downloadUrl - * @property { string } fileName - */ - export const BookkeepingExportFileDtoSchema = z - .object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }) - .readonly(); - export type BookkeepingExportFileDto = z.infer; - - /** - * BookkeepingExportBatchStatusEnumSchema - * @type { enum } - */ - export const BookkeepingExportBatchStatusEnumSchema = z.enum([ - "Initializing", - "Preparing", - "Exported", - "Reverted", - "Failed", - ]); - export type BookkeepingExportBatchStatusEnum = z.infer; - export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnumSchema.enum; - - /** - * BookkeepingExportBatchSummaryDtoSchema - * @type { object } - * @property { number } totalCount - * @property { number } needsReviewCount - * @property { number } readyForExportCount - * @property { number } excludedCount - * @property { object } invoiceNumberRange - * @property { string } invoiceNumberRange.from - * @property { string } invoiceNumberRange.to - * @property { object } dateRange - * @property { string } dateRange.from - * @property { string } dateRange.to - */ - export const BookkeepingExportBatchSummaryDtoSchema = z - .object({ - totalCount: z.number(), - needsReviewCount: z.number(), - readyForExportCount: z.number(), - excludedCount: z.number(), - invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).readonly().nullish(), - dateRange: z - .object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }) - .readonly() - .nullish(), - }) - .readonly(); - export type BookkeepingExportBatchSummaryDto = z.infer; - - /** - * BookkeepingExportBatchDetailsDtoSchema - * @type { object } - * @property { string } id - * @property { BookkeepingExportFormatEnum } format - * @property { BookkeepingExportBatchStatusEnum } status - * @property { number } totalInvoiceCount - * @property { number } exportedInvoiceCount - * @property { object } createdBy - * @property { string } createdBy.id - * @property { string } createdBy.fullName - * @property { string } createdBy.email - * @property { string } createdAt - * @property { string } exportedAt - * @property { string } revertedAt - * @property { object } revertedBy - * @property { string } revertedBy.id - * @property { string } revertedBy.fullName - * @property { string } revertedBy.email - * @property { BookkeepingExportBatchSummaryDto } summary - * @property { BookkeepingExportFileDto[] } files - */ - export const BookkeepingExportBatchDetailsDtoSchema = z - .object({ - id: z.string(), - format: BookkeepingExportFormatEnumSchema, - status: BookkeepingExportBatchStatusEnumSchema, - totalInvoiceCount: z.number(), - exportedInvoiceCount: z.number(), - createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), - createdAt: z.iso.datetime({ offset: true }), - exportedAt: z.iso.datetime({ offset: true }).nullish(), - revertedAt: z.iso.datetime({ offset: true }).nullish(), - revertedBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly().nullish(), - summary: BookkeepingExportBatchSummaryDtoSchema, - files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish(), - }) - .readonly(); - export type BookkeepingExportBatchDetailsDto = z.infer; - - /** - * UpdateBookkeepingExportBatchRequestDtoSchema - * @type { object } - * @property { BookkeepingExportFormatEnum } format - */ - export const UpdateBookkeepingExportBatchRequestDtoSchema = z - .object({ format: BookkeepingExportFormatEnumSchema }) - .readonly(); - export type UpdateBookkeepingExportBatchRequestDto = z.infer; - - /** - * BookkeepingExportBatchPreviewDtoSchema - * @type { object } - * @property { string } id - * @property { BookkeepingExportFormatEnum } format - * @property { BookkeepingExportBatchStatusEnum } status - * @property { number } totalInvoiceCount - * @property { number } exportedInvoiceCount - * @property { object } createdBy - * @property { string } createdBy.id - * @property { string } createdBy.fullName - * @property { string } createdBy.email - * @property { string } createdAt - * @property { string } exportedAt - * @property { string } revertedAt - * @property { BookkeepingExportFileDto[] } files - */ - export const BookkeepingExportBatchPreviewDtoSchema = z - .object({ - id: z.string(), - format: BookkeepingExportFormatEnumSchema, - status: BookkeepingExportBatchStatusEnumSchema, - totalInvoiceCount: z.number(), - exportedInvoiceCount: z.number(), - createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), - createdAt: z.iso.datetime({ offset: true }), - exportedAt: z.iso.datetime({ offset: true }).nullish(), - revertedAt: z.iso.datetime({ offset: true }).nullish(), - files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish(), - }) - .readonly(); - export type BookkeepingExportBatchPreviewDto = z.infer; - - /** - * DateRangeSchema - * @type { object } - * @property { string } from - * @property { string } to - */ - export const DateRangeSchema = z - .object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }) - .readonly(); - export type DateRange = z.infer; - - /** - * BookkeepingExportBatchPreviewFilterDtoSchema - * @type { object } - * @property { DateRange } createdDate - * @property { BookkeepingExportBatchStatusEnum[] } status - * @property { BookkeepingExportFormatEnum[] } format - * @property { string[] } createdBy - */ - export const BookkeepingExportBatchPreviewFilterDtoSchema = z - .object({ - createdDate: DateRangeSchema, - status: z.array(BookkeepingExportBatchStatusEnumSchema).readonly(), - format: z.array(BookkeepingExportFormatEnumSchema).readonly(), - createdBy: z.array(z.string()).readonly(), - }) - .readonly(); - export type BookkeepingExportBatchPreviewFilterDto = z.infer; - - /** - * BookkeepingExportBatchItemStatusEnumSchema - * @type { enum } - */ - export const BookkeepingExportBatchItemStatusEnumSchema = z.enum([ - "Selected", - "NeedsReview", - "ReadyForExport", - "Exported", - "Excluded", - ]); - export type BookkeepingExportBatchItemStatusEnum = z.infer; - export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemStatusEnumSchema.enum; - - /** - * BookkeepingExportItemDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } invoiceId - * @property { BookkeepingExportBatchItemStatusEnum } status - * @property { boolean } includedInExport - * @property { string[] } validationIssues - * @property { object } invoice - * @property { string } invoice.invoiceNumber - * @property { string } invoice.issuingDate - * @property { string } invoice.currency - * @property { number } invoice.amount - * @property { number } invoice.tax - * @property { string[] } invoice.vatRules - * @property { object } receiver - * @property { string } receiver.id - * @property { string } receiver.name - * @property { string } receiver.matchCode - * @property { string } receiver.label - * @property { string } receiver.account - * @property { string } receiver.contraAccount - * @property { string } comments - */ - export const BookkeepingExportItemDetailDtoSchema = z - .object({ - id: z.string(), - invoiceId: z.string(), - status: BookkeepingExportBatchItemStatusEnumSchema, - includedInExport: z.boolean(), - validationIssues: z.array(z.string()).readonly().nullish(), - invoice: z - .object({ - invoiceNumber: z.string(), - issuingDate: z.iso.datetime({ offset: true }), - currency: z.string(), - amount: z.number(), - tax: z.number(), - vatRules: z.array(z.string()).readonly(), - }) - .readonly(), - receiver: z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string(), - account: z.string(), - contraAccount: z.string(), - }) - .readonly(), - comments: z.string().nullish(), - }) - .readonly(); - export type BookkeepingExportItemDetailDto = z.infer; - - /** - * BookkeepingExportItemDetailFilterDtoSchema - * @type { object } - * @property { BookkeepingExportBatchItemStatusEnum[] } status - */ - export const BookkeepingExportItemDetailFilterDtoSchema = z - .object({ status: z.array(BookkeepingExportBatchItemStatusEnumSchema).readonly() }) - .readonly(); - export type BookkeepingExportItemDetailFilterDto = z.infer; - - /** - * BookkeepingExportVatLineItemDtoSchema - * @type { object } - * @property { string } invoiceId - * @property { string } batchId - * @property { string } batchItemId - * @property { BookkeepingExportBatchItemStatusEnum } status - * @property { boolean } includedInExport - * @property { string[] } validationIssues - * @property { object } invoice - * @property { string } invoice.invoiceNumber - * @property { string } invoice.issuingDate - * @property { string } invoice.currency - * @property { number } invoice.amount - * @property { number } invoice.tax - * @property { string } invoice.comments - * @property { object } receiver - * @property { string } receiver.id - * @property { string } receiver.name - * @property { string } receiver.matchCode - * @property { string } receiver.label - * @property { string } receiver.account - * @property { string } receiver.contraAccount - * @property { number } vatPercentage - * @property { string } vatRule - * @property { number } netAmount - * @property { number } vatAmount - * @property { number } grossAmount - * @property { number } vatAmountInOfficeCurrency - * @property { number } netAmountInOfficeCurrency - * @property { number } grossAmountInOfficeCurrency - * @property { string } officeCurrency - */ - export const BookkeepingExportVatLineItemDtoSchema = z - .object({ - invoiceId: z.string(), - batchId: z.string(), - batchItemId: z.string(), - status: BookkeepingExportBatchItemStatusEnumSchema, - includedInExport: z.boolean(), - validationIssues: z.array(z.string()).readonly().nullish(), - invoice: z - .object({ - invoiceNumber: z.string(), - issuingDate: z.iso.datetime({ offset: true }), - currency: z.string(), - amount: z.number(), - tax: z.number(), - comments: z.string().nullish(), - }) - .readonly(), - receiver: z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string(), - account: z.string(), - contraAccount: z.string(), - }) - .readonly(), - vatPercentage: z.number(), - vatRule: z.string(), - netAmount: z.number(), - vatAmount: z.number(), - grossAmount: z.number(), - vatAmountInOfficeCurrency: z.number().nullish(), - netAmountInOfficeCurrency: z.number().nullish(), - grossAmountInOfficeCurrency: z.number().nullish(), - officeCurrency: z.string(), - }) - .readonly(); - export type BookkeepingExportVatLineItemDto = z.infer; - - /** - * CreateBookkeepingExportBatchResponseDtoSchema - * @type { object } - * @property { string } batchId - */ - export const CreateBookkeepingExportBatchResponseDtoSchema = z.object({ batchId: z.string() }).readonly(); - export type CreateBookkeepingExportBatchResponseDto = z.infer; - - /** - * UpdateBookkeepingExportBatchItemRequestDtoSchema - * @type { object } - * @property { boolean } includedInExport Whether the item should be included in the export - * @property { string[] } itemIds Min Items: `0` - * @property { boolean } vatOk - * @property { boolean } invoiceOk - */ - export const UpdateBookkeepingExportBatchItemRequestDtoSchema = z - .object({ - includedInExport: z.boolean().describe("Whether the item should be included in the export").nullish(), - itemIds: z.array(z.string()).readonly(), - vatOk: z.boolean().nullish(), - invoiceOk: z.boolean().nullish(), - }) - .readonly(); - export type UpdateBookkeepingExportBatchItemRequestDto = z.infer< - typeof UpdateBookkeepingExportBatchItemRequestDtoSchema - >; - - /** - * PaginateBatchesOrderParamEnumSchema - * @type { enum } - */ - export const PaginateBatchesOrderParamEnumSchema = z.enum(["createdAt", "status", "format", "totalInvoiceCount"]); - export type PaginateBatchesOrderParamEnum = z.infer; - export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema.enum; - - /** - * PaginateBatchesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookkeepingExportBatchPreviewDto[] } items - */ - export const PaginateBatchesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).readonly() }).readonly().shape, - }); - export type PaginateBatchesResponse = z.infer; - - /** - * PaginateBatchItemsOrderParamEnumSchema - * @type { enum } - */ - export const PaginateBatchItemsOrderParamEnumSchema = z.enum(["issuingDate"]); - export type PaginateBatchItemsOrderParamEnum = z.infer; - export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnumSchema.enum; - - /** - * PaginateBatchItemsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookkeepingExportItemDetailDto[] } items - */ - export const PaginateBatchItemsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).readonly() }).readonly().shape, - }); - export type PaginateBatchItemsResponse = z.infer; - - /** - * GetVatLineItemsOrderParamEnumSchema - * @type { enum } - */ - export const GetVatLineItemsOrderParamEnumSchema = z.enum([ - "account", - "contraAccount", - "issuingDate", - "invoiceNumber", - "receiver", - ]); - export type GetVatLineItemsOrderParamEnum = z.infer; - export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema.enum; - - /** - * GetVatLineItemsResponseSchema - * @type { array } - */ - export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema).readonly(); - export type GetVatLineItemsResponse = z.infer; -} diff --git a/test/generated/dist/bookkeepingExport/bookkeepingExport.queries.ts b/test/generated/dist/bookkeepingExport/bookkeepingExport.queries.ts deleted file mode 100644 index c7faed1..0000000 --- a/test/generated/dist/bookkeepingExport/bookkeepingExport.queries.ts +++ /dev/null @@ -1,555 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; -import { BookkeepingExportApi } from "./bookkeepingExport.api"; - -export namespace BookkeepingExportQueries { - export const moduleName = QueryModule.BookkeepingExport; - - export const keys = { - all: [moduleName] as const, - paginateBatches: ( - officeId: string, - limit?: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/bookkeeping-exports", officeId, limit, order, filter, page, cursor] as const, - paginateBatchesInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/bookkeeping-exports", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - getBatch: (officeId: string, batchId: string) => - [...keys.all, "/offices/:officeId/bookkeeping-exports/:batchId", officeId, batchId] as const, - paginateBatchItems: ( - officeId: string, - batchId: string, - limit?: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", - officeId, - batchId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateBatchItemsInfinite: ( - officeId: string, - batchId: string, - limit?: number, - order?: string, - filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", - "infinite", - officeId, - batchId, - limit, - order, - filter, - cursor, - ] as const, - getVatLineItems: (officeId: string, batchId: string, order?: string) => - [ - ...keys.all, - "/offices/:officeId/bookkeeping-exports/batches/:batchId/vat-line-items", - officeId, - batchId, - order, - ] as const, - }; - - /** - * Mutation `useCreateBatch` - * @summary Create bookkeeping export batch - * @permission Requires `canUseCreateBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateBatch = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.createBatch, - { officeId: string; data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId })); - return BookkeepingExportApi.createBatch(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateBatches` - * @summary List bookkeeping export batches - * @permission Requires `canUsePaginateBatches` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` - * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateBatches = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId })); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateBatchesInfinite - * @summary List bookkeeping export batches - * @permission Requires `canUsePaginateBatches` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` - * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateBatchesInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId })); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useGetBatch` - * @summary Get bookkeeping export batch details - * @permission Requires `canUseGetBatch` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetBatch = ( - { officeId, batchId }: { officeId: string; batchId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBatch(officeId, batchId), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId })); - return BookkeepingExportApi.getBatch(officeId, batchId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateBatchFormat` - * @summary Update bookkeeping export batch format - * @permission Requires `canUseUpdateBatchFormat` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBatchFormat = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.updateBatchFormat, - { officeId: string; batchId: string; data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId, data }) => { - checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId })); - return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, batchId } = variables; - const updateKeys = [keys.getBatch(officeId, batchId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateBatchItem` - * @summary Update bookkeeping export batch item inclusion - * @permission Requires `canUseUpdateBatchItem` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBatchItem = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.updateBatchItem, - { officeId: string; batchId: string; data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId, data }) => { - checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId })); - return BookkeepingExportApi.updateBatchItem(officeId, batchId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateBatchItems` - * @summary List batch items with filters and pagination - * @permission Requires `canUsePaginateBatchItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` - * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateBatchItems = ( - { - officeId, - batchId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - batchId: string; - limit: number; - order?: string; - filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId })); - return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateBatchItemsInfinite - * @summary List batch items with filters and pagination - * @permission Requires `canUsePaginateBatchItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` - * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateBatchItemsInfinite = ( - { - officeId, - batchId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - batchId: string; - limit: number; - order?: string; - filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId })); - return BookkeepingExportApi.paginateBatchItems( - officeId, - batchId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useValidateBookkeepingBatch` - * @summary Validate bookkeeping batch - * @permission Requires `canUseValidateBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useValidateBookkeepingBatch = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.validateBookkeepingBatch, - { officeId: string; batchId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId })); - return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useExportBookkeepingBatch` - * @summary Export bookkeeping batch - * @permission Requires `canUseExportBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useExportBookkeepingBatch = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.exportBookkeepingBatch, - { officeId: string; batchId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId })); - return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useRevertBookkeepingBatch` - * @summary Revert bookkeeping export batch - * @permission Requires `canUseRevertBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useRevertBookkeepingBatch = ( - options?: AppMutationOptions< - typeof BookkeepingExportApi.revertBookkeepingBatch, - { officeId: string; batchId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId })); - return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetVatLineItems` - * @summary Get VAT line items for bookkeeping export batch - * @permission Requires `canUseGetVatLineItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): account, contraAccount, issuingDate, invoiceNumber, receiver. Example: `account` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetVatLineItems = ( - { officeId, batchId, order }: { officeId: string; batchId: string; order?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getVatLineItems(officeId, batchId, order), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId })); - return BookkeepingExportApi.getVatLineItems(officeId, batchId, order, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts deleted file mode 100644 index 016a650..0000000 --- a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnerBookkeepingMappingsAcl { - /** - * Use for `useGetBookkeepingMappings` query ability. For global ability, omit the object parameter. - * @description List business partner bookkeeping mappings - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBookkeepingMappings` query - */ - export const canUseGetBookkeepingMappings = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useCreateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Create business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBookkeepingMapping` mutation - */ - export const canUseCreateBookkeepingMapping = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< - "Update", - "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - >; - - /** - * Use for `useUpdateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Update business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMapping` mutation - */ - export const canUseUpdateBookkeepingMapping = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< - "Update", - "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - >; - - /** - * Use for `useUpdateBookkeepingMappingById` mutation ability. For global ability, omit the object parameter. - * @description Update business partner bookkeeping mapping by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMappingById` mutation - */ - export const canUseUpdateBookkeepingMappingById = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< - "Update", - "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - >; - - /** - * Use for `useDeleteBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBookkeepingMapping` mutation - */ - export const canUseDeleteBookkeepingMapping = (object?: { officeId: string }) => - ["Delete", object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping"] as AbilityTuple< - "Delete", - "BusinessPartnerBookkeeping" | (ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts deleted file mode 100644 index 716e4e0..0000000 --- a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; - -export namespace BusinessPartnerBookkeepingMappingsApi { - export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - config, - ); - }; - export const createBookkeepingMapping = ( - officeId: string, - businessPartnerId: string, - data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), - config, - ); - }; - export const updateBookkeepingMapping = ( - officeId: string, - businessPartnerId: string, - data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), - config, - ); - }; - export const updateBookkeepingMappingById = ( - officeId: string, - businessPartnerId: string, - id: string, - data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), - config, - ); - }; - export const deleteBookkeepingMapping = ( - officeId: string, - businessPartnerId: string, - id: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts deleted file mode 100644 index 93818c1..0000000 --- a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { z } from "zod"; - -export namespace BusinessPartnerBookkeepingMappingsModels { - /** - * BusinessPartnerBookkeepingMappingResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { string } businessPartnerId - * @property { boolean } paysTaxInEurForFactoring - */ - export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z - .object({ - id: z.string(), - debtorId: z.string().nullish(), - creditorId: z.string().nullish(), - currencyNotation: z.string().nullish(), - businessPartnerId: z.string(), - paysTaxInEurForFactoring: z.boolean().nullish(), - }) - .readonly(); - export type BusinessPartnerBookkeepingMappingResponseDto = z.infer< - typeof BusinessPartnerBookkeepingMappingResponseDtoSchema - >; - - /** - * BusinessPartnerBookkeepingMappingsResponseDtoSchema - * @type { object } - * @property { BusinessPartnerBookkeepingMappingResponseDto[] } bookkeepingMappings - */ - export const BusinessPartnerBookkeepingMappingsResponseDtoSchema = z - .object({ bookkeepingMappings: z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly() }) - .readonly(); - export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer< - typeof BusinessPartnerBookkeepingMappingsResponseDtoSchema - >; - - /** - * UpdateBookkeepingMappingDtoSchema - * @type { object } - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) - */ - export const UpdateBookkeepingMappingDtoSchema = z - .object({ - debtorId: z.string(), - creditorId: z.string(), - currencyNotation: z.string(), - paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)"), - }) - .readonly(); - export type UpdateBookkeepingMappingDto = z.infer; - - /** - * UpdateBookkeepingMappingRequestDtoSchema - * @type { object } - * @property { UpdateBookkeepingMappingDto[] } bookkeepingMappings - */ - export const UpdateBookkeepingMappingRequestDtoSchema = z - .object({ bookkeepingMappings: z.array(UpdateBookkeepingMappingDtoSchema).readonly() }) - .readonly(); - export type UpdateBookkeepingMappingRequestDto = z.infer; - - /** - * CreateBookkeepingMappingDtoSchema - * @type { object } - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) - */ - export const CreateBookkeepingMappingDtoSchema = z - .object({ - debtorId: z.string(), - creditorId: z.string(), - currencyNotation: z.string(), - paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)"), - }) - .readonly(); - export type CreateBookkeepingMappingDto = z.infer; - - /** - * UpdateBookkeepingMappingResponseSchema - * @type { array } - */ - export const UpdateBookkeepingMappingResponseSchema = z - .array(BusinessPartnerBookkeepingMappingResponseDtoSchema) - .readonly(); - export type UpdateBookkeepingMappingResponse = z.infer; -} diff --git a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts b/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts deleted file mode 100644 index 8b15dfc..0000000 --- a/test/generated/dist/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnerBookkeepingMappingsAcl } from "./businessPartnerBookkeepingMappings.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; -import { BusinessPartnerBookkeepingMappingsApi } from "./businessPartnerBookkeepingMappings.api"; - -export namespace BusinessPartnerBookkeepingMappingsQueries { - export const moduleName = QueryModule.BusinessPartnerBookkeepingMappings; - - export const keys = { - all: [moduleName] as const, - getBookkeepingMappings: (officeId: string, businessPartnerId: string) => - [ - ...keys.all, - "/offices/:officeId/business-partners/:businessPartnerId/bookkeeping-mappings", - officeId, - businessPartnerId, - ] as const, - }; - - /** - * Query `useGetBookkeepingMappings` - * @summary Fetch all bookkeeping mappings for a business partner - * @permission Requires `canUseGetBookkeepingMappings` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetBookkeepingMappings = ( - { officeId, businessPartnerId }: { officeId: string; businessPartnerId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), - queryFn: () => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId })); - return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreateBookkeepingMapping` - * @summary Create a bookkeeping mapping for a business partner - * @permission Requires `canUseCreateBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateBookkeepingMapping = ( - options?: AppMutationOptions< - typeof BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping, - { - officeId: string; - businessPartnerId: string; - data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId })); - return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping( - officeId, - businessPartnerId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateBookkeepingMapping` - * @summary Update an existing bookkeeping mapping for a business partner - * @permission Requires `canUseUpdateBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBookkeepingMapping = ( - options?: AppMutationOptions< - typeof BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping, - { - officeId: string; - businessPartnerId: string; - data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId })); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping( - officeId, - businessPartnerId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateBookkeepingMappingById` - * @summary Update a specific bookkeeping mapping by ID for a business partner - * @permission Requires `canUseUpdateBookkeepingMappingById` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBookkeepingMappingById = ( - options?: AppMutationOptions< - typeof BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById, - { - officeId: string; - businessPartnerId: string; - id: string; - data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, id, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId })); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById( - officeId, - businessPartnerId, - id, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteBookkeepingMapping` - * @summary Delete an existing bookkeeping mapping for a business partner - * @permission Requires `canUseDeleteBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteBookkeepingMapping = ( - options?: AppMutationOptions< - typeof BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping, - { officeId: string; businessPartnerId: string; id: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, id }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId })); - return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.acl.ts b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.acl.ts deleted file mode 100644 index 908af98..0000000 --- a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.acl.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnerContactsAcl { - /** - * Use for `useGetContacts` query ability. For global ability, omit the object parameter. - * @description List business partner contacts - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetContacts` query - */ - export const canUseGetContacts = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useCreateContact` mutation ability. For global ability, omit the object parameter. - * @description Create business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateContact` mutation - */ - export const canUseCreateContact = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `usePaginateContactLabels` query ability. For global ability, omit the object parameter. - * @description Paginate business partner contact labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateContactLabels` query - */ - export const canUsePaginateContactLabels = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdateContact` mutation ability. For global ability, omit the object parameter. - * @description Update business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateContact` mutation - */ - export const canUseUpdateContact = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useDeleteContact` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteContact` mutation - */ - export const canUseDeleteContact = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.api.ts b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.api.ts deleted file mode 100644 index edc4612..0000000 --- a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.api.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; - -export namespace BusinessPartnerContactsApi { - export const getContacts = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - config, - ); - }; - export const createContact = ( - officeId: string, - businessPartnerId: string, - data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), - config, - ); - }; - export const paginateContactLabels = ( - officeId: string, - businessPartnerId: string, - limit: number, - order?: string, - filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const updateContact = ( - contactId: string, - officeId: string, - businessPartnerId: string, - data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), - config, - ); - }; - export const deleteContact = ( - contactId: string, - officeId: string, - businessPartnerId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.configs.ts b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.configs.ts deleted file mode 100644 index cf71eb6..0000000 --- a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.configs.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; -import { BusinessPartnerContactsQueries } from "./businessPartnerContacts.queries"; -import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; - -export namespace BusinessPartnerContactsConfigs { - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: BusinessPartnerContactsAcl.canUsePaginateContactLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: BusinessPartnerContactsQueries.usePaginateContactLabels, - infinite: BusinessPartnerContactsQueries.usePaginateContactLabelsInfinite, - filters: { - schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.models.ts b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.models.ts deleted file mode 100644 index 875a0ca..0000000 --- a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.models.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BusinessPartnerContactsModels { - /** - * BusinessPartnerContactRoleEnumSchema - * @type { enum } - */ - export const BusinessPartnerContactRoleEnumSchema = z.enum([ - "General", - "CommercialManager", - "SystemEngineer", - "TechnicalEngineer", - "Logistics", - "Operations", - "Sales", - "Accounting", - "Invoice", - "Dunnings", - "Reclamations", - "Management", - ]); - export type BusinessPartnerContactRoleEnum = z.infer; - export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSchema.enum; - - /** - * BusinessPartnerContactResponseDTOSchema - * @type { object } - * @property { string } id Contact ID - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ - export const BusinessPartnerContactResponseDTOSchema = z - .object({ - id: z.string().describe("Contact ID"), - role: BusinessPartnerContactRoleEnumSchema.nullish(), - name: z.string().describe("Contact name").nullish(), - email: z.string().describe("Contact email").nullish(), - phone: z.string().describe("Contact phone").nullish(), - }) - .readonly(); - export type BusinessPartnerContactResponseDTO = z.infer; - - /** - * BusinessPartnerContactListResponseDTOSchema - * @type { object } - * @property { BusinessPartnerContactResponseDTO[] } contacts List of contacts - */ - export const BusinessPartnerContactListResponseDTOSchema = z - .object({ contacts: z.array(BusinessPartnerContactResponseDTOSchema).readonly().describe("List of contacts") }) - .readonly(); - export type BusinessPartnerContactListResponseDTO = z.infer; - - /** - * CreateBusinessPartnerContactRequestDTOSchema - * @type { object } - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ - export const CreateBusinessPartnerContactRequestDTOSchema = z - .object({ - role: BusinessPartnerContactRoleEnumSchema, - name: z.string().describe("Contact name"), - email: z.string().describe("Contact email"), - phone: z.string().describe("Contact phone"), - }) - .readonly(); - export type CreateBusinessPartnerContactRequestDTO = z.infer; - - /** - * UpdateBusinessPartnerContactRequestDTOSchema - * @type { object } - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ - export const UpdateBusinessPartnerContactRequestDTOSchema = z - .object({ - role: BusinessPartnerContactRoleEnumSchema, - name: z.string().describe("Contact name"), - email: z.string().describe("Contact email"), - phone: z.string().describe("Contact phone"), - }) - .readonly(); - export type UpdateBusinessPartnerContactRequestDTO = z.infer; - - /** - * BusinessPartnerContactFilterDtoSchema - * @type { object } - * @property { string } search Search by name, email, or phone - */ - export const BusinessPartnerContactFilterDtoSchema = z - .object({ search: z.string().describe("Search by name, email, or phone") }) - .readonly(); - export type BusinessPartnerContactFilterDto = z.infer; - - /** - * PaginateContactLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PaginateContactLabelsOrderParamEnumSchema = z.enum(["name", "role", "email", "createdAt", "updatedAt"]); - export type PaginateContactLabelsOrderParamEnum = z.infer; - export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderParamEnumSchema.enum; - - /** - * PaginateContactLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PaginateContactLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PaginateContactLabelsResponse = z.infer; -} diff --git a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.queries.ts b/test/generated/dist/businessPartnerContacts/businessPartnerContacts.queries.ts deleted file mode 100644 index a29ac21..0000000 --- a/test/generated/dist/businessPartnerContacts/businessPartnerContacts.queries.ts +++ /dev/null @@ -1,321 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; -import { BusinessPartnerContactsApi } from "./businessPartnerContacts.api"; - -export namespace BusinessPartnerContactsQueries { - export const moduleName = QueryModule.BusinessPartnerContacts; - - export const keys = { - all: [moduleName] as const, - getContacts: (officeId: string, businessPartnerId: string) => - [ - ...keys.all, - "/offices/:officeId/business-partners/:businessPartnerId/contacts", - officeId, - businessPartnerId, - ] as const, - paginateContactLabels: ( - officeId: string, - businessPartnerId: string, - limit?: number, - order?: string, - filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", - officeId, - businessPartnerId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateContactLabelsInfinite: ( - officeId: string, - businessPartnerId: string, - limit?: number, - order?: string, - filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", - "infinite", - officeId, - businessPartnerId, - limit, - order, - filter, - cursor, - ] as const, - }; - - /** - * Query `useGetContacts` - * @summary Get all contacts for a business partner - * @permission Requires `canUseGetContacts` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetContacts = ( - { officeId, businessPartnerId }: { officeId: string; businessPartnerId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getContacts(officeId, businessPartnerId), - queryFn: () => { - checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId })); - return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreateContact` - * @summary Create a new contact for a business partner - * @permission Requires `canUseCreateContact` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateContact = ( - options?: AppMutationOptions< - typeof BusinessPartnerContactsApi.createContact, - { - officeId: string; - businessPartnerId: string; - data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId })); - return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateContactLabels` - * @summary Paginate business partner contact labels (id and name only) - * @permission Requires `canUsePaginateContactLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` - * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateContactLabels = ( - { - officeId, - businessPartnerId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - businessPartnerId: string; - limit: number; - order?: string; - filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId })); - return BusinessPartnerContactsApi.paginateContactLabels( - officeId, - businessPartnerId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateContactLabelsInfinite - * @summary Paginate business partner contact labels (id and name only) - * @permission Requires `canUsePaginateContactLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` - * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateContactLabelsInfinite = ( - { - officeId, - businessPartnerId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - businessPartnerId: string; - limit: number; - order?: string; - filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId })); - return BusinessPartnerContactsApi.paginateContactLabels( - officeId, - businessPartnerId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateContact` - * @summary Update a business partner contact - * @permission Requires `canUseUpdateContact` ability - * @param { string } mutation.contactId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateContact = ( - options?: AppMutationOptions< - typeof BusinessPartnerContactsApi.updateContact, - { - contactId: string; - officeId: string; - businessPartnerId: string; - data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId })); - return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteContact` - * @permission Requires `canUseDeleteContact` ability - * @param { string } mutation.contactId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 204, 401] - */ - export const useDeleteContact = ( - options?: AppMutationOptions< - typeof BusinessPartnerContactsApi.deleteContact, - { contactId: string; officeId: string; businessPartnerId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ contactId, officeId, businessPartnerId }) => { - checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId })); - return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/businessPartners/businessPartners.acl.ts b/test/generated/dist/businessPartners/businessPartners.acl.ts deleted file mode 100644 index 3139313..0000000 --- a/test/generated/dist/businessPartners/businessPartners.acl.ts +++ /dev/null @@ -1,243 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnersAcl { - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List business partners - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Create", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Paginate business partner labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Read business partner details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ - export const canUseGetById = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Archive", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Archive", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useLock` mutation ability. For global ability, omit the object parameter. - * @description Lock business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLock` mutation - */ - export const canUseLock = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUnlock` mutation ability. For global ability, omit the object parameter. - * @description Unlock business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlock` mutation - */ - export const canUseUnlock = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useGetRemarks` query ability. For global ability, omit the object parameter. - * @description List business partner remarks - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetRemarks` query - */ - export const canUseGetRemarks = (object?: { officeId: string }) => - ["ReadRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "ReadRemark", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useCreateRemark` mutation ability. For global ability, omit the object parameter. - * @description Create business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRemark` mutation - */ - export const canUseCreateRemark = (object?: { officeId: string }) => - ["CreateRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "CreateRemark", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdateRemark` mutation ability. For global ability, omit the object parameter. - * @description Update business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRemark` mutation - */ - export const canUseUpdateRemark = (object?: { officeId: string }) => - ["UpdateRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "UpdateRemark", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useDeleteRemark` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemark` mutation - */ - export const canUseDeleteRemark = (object?: { officeId: string }) => - ["DeleteRemark", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "DeleteRemark", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useGetBasicInfo` query ability. For global ability, omit the object parameter. - * @description Read business partner basic info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBasicInfo` query - */ - export const canUseGetBasicInfo = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdateBasicInfo` mutation ability. For global ability, omit the object parameter. - * @description Update business partner basic info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBasicInfo` mutation - */ - export const canUseUpdateBasicInfo = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab"] as AbilityTuple< - "Update", - "BusinessPartnerBasicTab" | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) - >; - - /** - * Use for `useCreateSignatureUploadInstructions` mutation ability. For global ability, omit the object parameter. - * @description Create business partner signature upload instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateSignatureUploadInstructions` mutation - */ - export const canUseCreateSignatureUploadInstructions = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab"] as AbilityTuple< - "Update", - "BusinessPartnerBasicTab" | (ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string }) - >; - - /** - * Use for `useGetCargoAgentInfo` query ability. For global ability, omit the object parameter. - * @description Read business partner cargo agent info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoAgentInfo` query - */ - export const canUseGetCargoAgentInfo = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdateCargoAgent` mutation ability. For global ability, omit the object parameter. - * @description Update business partner cargo agent info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargoAgent` mutation - */ - export const canUseUpdateCargoAgent = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useGetCarrierInformation` query ability. For global ability, omit the object parameter. - * @description Read business partner carrier info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCarrierInformation` query - */ - export const canUseGetCarrierInformation = (object?: { officeId: string }) => - ["Read", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Read", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; - - /** - * Use for `useUpdateCarrier` mutation ability. For global ability, omit the object parameter. - * @description Update business partner carrier info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCarrier` mutation - */ - export const canUseUpdateCarrier = (object?: { officeId: string }) => - ["Update", object ? subject("BusinessPartner", object) : "BusinessPartner"] as AbilityTuple< - "Update", - "BusinessPartner" | (ForcedSubject<"BusinessPartner"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/businessPartners/businessPartners.api.ts b/test/generated/dist/businessPartners/businessPartners.api.ts deleted file mode 100644 index 21d03e5..0000000 --- a/test/generated/dist/businessPartners/businessPartners.api.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnersModels } from "./businessPartners.models"; - -export namespace BusinessPartnersApi { - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, - `/offices/${officeId}/business-partners`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = ( - officeId: string, - data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, - `/offices/${officeId}/business-partners`, - ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), - config, - ); - }; - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, - `/offices/${officeId}/business-partners/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const getById = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}`, - config, - ); - }; - export const update = ( - officeId: string, - id: string, - data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), - config, - ); - }; - export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/unarchive`, - undefined, - config, - ); - }; - export const lock = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/lock`, - undefined, - config, - ); - }; - export const unlock = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/unlock`, - undefined, - config, - ); - }; - export const getRemarks = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, - `/offices/${officeId}/business-partners/${id}/remarks`, - config, - ); - }; - export const createRemark = ( - officeId: string, - id: string, - data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/remarks`, - ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), - config, - ); - }; - export const updateRemark = ( - officeId: string, - id: string, - remarkId: string, - data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), - config, - ); - }; - export const deleteRemark = (officeId: string, id: string, remarkId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - undefined, - config, - ); - }; - export const getBasicInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic`, - config, - ); - }; - export const updateBasicInfo = ( - officeId: string, - id: string, - data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), - config, - ); - }; - export const createSignatureUploadInstructions = ( - officeId: string, - id: string, - data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, - ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), - config, - ); - }; - export const getCargoAgentInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/cargo-agent`, - config, - ); - }; - export const updateCargoAgent = ( - officeId: string, - id: string, - data: BusinessPartnersModels.UpdateCargoAgentDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/cargo-agent`, - ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), - config, - ); - }; - export const getCarrierInformation = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/carrier`, - config, - ); - }; - export const updateCarrier = ( - officeId: string, - id: string, - data: BusinessPartnersModels.UpdateCarrierDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/carrier`, - ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/businessPartners/businessPartners.configs.ts b/test/generated/dist/businessPartners/businessPartners.configs.ts deleted file mode 100644 index 3ba3ac7..0000000 --- a/test/generated/dist/businessPartners/businessPartners.configs.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { BusinessPartnersModels } from "./businessPartners.models"; -import { BusinessPartnersQueries } from "./businessPartners.queries"; -import { BusinessPartnersAcl } from "./businessPartners.acl"; - -export namespace BusinessPartnersConfigs { - export const businessPartnersConfig = { - meta: { - title: "Business Partners", - }, - readAll: { - acl: BusinessPartnersAcl.canUsePaginate, - schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, - paginated: BusinessPartnersQueries.usePaginate, - infinite: BusinessPartnersQueries.usePaginateInfinite, - filters: { - schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, - options: { - inputs: { - search: true, - types: true, - shortName: true, - name: true, - vat: true, - debtorId: true, - creditorId: true, - matchCode: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - address: true, - types: true, - archived: true, - shortName: true, - vat: true, - debtorId: true, - creditorId: true, - locked: true, - currency: true, - remarks: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: BusinessPartnersAcl.canUseGetById, - schema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema, - query: BusinessPartnersQueries.useGetById, - }, - create: { - acl: BusinessPartnersAcl.canUseCreate, - schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, - mutation: BusinessPartnersQueries.useCreate, - inputDefs: dynamicInputs({ - schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, - options: { - inputs: { - name: true, - secondaryName: true, - types: true, - matchCode: true, - shortName: true, - address: true, - }, - }, - }), - }, - update: { - acl: BusinessPartnersAcl.canUseUpdate, - schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, - mutation: BusinessPartnersQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - secondaryName: true, - types: true, - address: true, - blAddress: true, - belongsToId: true, - salesRepId: true, - operationsId: true, - addressIsDifferentForBl: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: BusinessPartnersAcl.canUsePaginateLabels, - schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, - paginated: BusinessPartnersQueries.usePaginateLabels, - infinite: BusinessPartnersQueries.usePaginateLabelsInfinite, - filters: { - schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, - options: { - inputs: { - search: true, - ids: true, - types: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - types: true, - }, - sortable: BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/businessPartners/businessPartners.models.ts b/test/generated/dist/businessPartners/businessPartners.models.ts deleted file mode 100644 index c247589..0000000 --- a/test/generated/dist/businessPartners/businessPartners.models.ts +++ /dev/null @@ -1,814 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BusinessPartnersModels { - /** - * RemarkVisibilitySchema - * @type { enum } - */ - export const RemarkVisibilitySchema = z.enum(["internal", "popup"]); - export type RemarkVisibility = z.infer; - export const RemarkVisibility = RemarkVisibilitySchema.enum; - - /** - * RemarkTypeSchema - * @type { enum } - */ - export const RemarkTypeSchema = z.enum(["INFORMATIONAL", "WARNING"]); - export type RemarkType = z.infer; - export const RemarkType = RemarkTypeSchema.enum; - - /** - * BusinessPartnerRemarkResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the remark - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of the remark - */ - export const BusinessPartnerRemarkResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the remark"), - visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), - content: z.string().describe("Content of the remark"), - type: RemarkTypeSchema.describe("Type of the remark"), - }) - .readonly(); - export type BusinessPartnerRemarkResponseDTO = z.infer; - - /** - * BusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { string } city City name - * @property { string } isoCode Country code - */ - export const BusinessPartnerAddressDtoSchema = z - .object({ - street: z.string().describe("Street address"), - zip: z.string().describe("ZIP/Postal code"), - city: z.string().describe("City name"), - isoCode: z.string().describe("Country code"), - }) - .readonly(); - export type BusinessPartnerAddressDto = z.infer; - - /** - * BusinessPartnerEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const BusinessPartnerEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type BusinessPartnerEmployeeDTO = z.infer; - - /** - * BusinessPartnerListResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - * @property { string } matchCode Match code of the business partner - * @property { BusinessPartnerAddressDto } address Address information - * @property { CommonModels.BusinessPartnerType[] } types List of business partner types - * @property { boolean } archived Archive status - * @property { string } shortName Short name of the business partner - * @property { string } vat VAT number of the business partner - * @property { string } debtorId Debtor ID for the local currency - * @property { string } creditorId Creditor ID for the local currency - * @property { boolean } locked Whether the business partner is locked - * @property { string } currency Currency (invoice currency) - * @property { BusinessPartnerRemarkResponseDTO[] } remarks Remarks for the business partner - * @property { string } createdById ID of the employee who created this business partner - * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this business partner - * @property { string } createdAt Date when the business partner was created - * @property { string } updatedById ID of the employee who last updated this business partner - * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this business partner - * @property { string } updatedAt Date when the business partner was last updated - */ - export const BusinessPartnerListResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the business partner"), - name: z.string().describe("Name of the business partner"), - matchCode: z.string().describe("Match code of the business partner"), - address: BusinessPartnerAddressDtoSchema.describe("Address information"), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), - archived: z.boolean().describe("Archive status"), - shortName: z.string().describe("Short name of the business partner").nullish(), - vat: z.string().describe("VAT number of the business partner").nullish(), - debtorId: z.string().describe("Debtor ID for the local currency").nullish(), - creditorId: z.string().describe("Creditor ID for the local currency").nullish(), - locked: z.boolean().describe("Whether the business partner is locked"), - currency: z.string().describe("Currency (invoice currency)").nullish(), - remarks: z.array(BusinessPartnerRemarkResponseDTOSchema).readonly().describe("Remarks for the business partner"), - createdById: z.string().describe("ID of the employee who created this business partner").nullish(), - createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this business partner").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was created"), - updatedById: z.string().describe("ID of the employee who last updated this business partner").nullish(), - updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this business partner").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was last updated"), - }) - .readonly(); - export type BusinessPartnerListResponseDTO = z.infer; - - /** - * BusinessPartnerFilterDtoSchema - * @type { object } - * @property { string } search - * @property { CommonModels.BusinessPartnerType[] } types - * @property { string } shortName - * @property { string } name - * @property { string } vat - * @property { string } debtorId - * @property { string } creditorId - * @property { string } matchCode - * @property { boolean } archived Filter by archived status - */ - export const BusinessPartnerFilterDtoSchema = z - .object({ - search: z.string(), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly(), - shortName: z.string(), - name: z.string(), - vat: z.string(), - debtorId: z.string(), - creditorId: z.string(), - matchCode: z.string(), - archived: z.boolean().describe("Filter by archived status"), - }) - .readonly(); - export type BusinessPartnerFilterDto = z.infer; - - /** - * BusinessPartnerPaginatedLabelResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } label Label of the business partner - * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types - */ - export const BusinessPartnerPaginatedLabelResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the business partner"), - label: z.string().describe("Label of the business partner"), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types"), - }) - .readonly(); - export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; - - /** - * BusinessPartnerLabelsFilterDtoSchema - * @type { object } - * @property { string } search - * @property { string[] } ids Business partner ids to filter by - * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types to filter by - * @property { boolean } archived Filter by archived status - */ - export const BusinessPartnerLabelsFilterDtoSchema = z - .object({ - search: z.string(), - ids: z.array(z.string()).readonly().describe("Business partner ids to filter by"), - types: z - .array(CommonModels.BusinessPartnerTypeSchema) - .readonly() - .describe("Array of business partner types to filter by"), - archived: z.boolean().describe("Filter by archived status"), - }) - .readonly(); - export type BusinessPartnerLabelsFilterDto = z.infer; - - /** - * CreateBusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } district - * @property { string } countryId - */ - export const CreateBusinessPartnerAddressDtoSchema = z - .object({ - street: z.string(), - secondaryStreet: z.string(), - zip: z.string(), - cityId: z.string(), - district: z.string(), - countryId: z.string(), - }) - .readonly(); - export type CreateBusinessPartnerAddressDto = z.infer; - - /** - * CreateBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } name Full name of the business partner. Min Length: `3` - * @property { string } secondaryName Full name of the business partner. Min Length: `3` - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { string } matchCode Unique identifier code - * @property { string } shortName Short name for the business partner - * @property { CreateBusinessPartnerAddressDto } address Address information - */ - export const CreateBusinessPartnerRequestDTOSchema = z - .object({ - name: z.string().min(3).describe("Full name of the business partner"), - secondaryName: z.string().min(3).describe("Full name of the business partner").nullish(), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), - matchCode: z.string().describe("Unique identifier code").nullish(), - shortName: z.string().describe("Short name for the business partner").nullish(), - address: CreateBusinessPartnerAddressDtoSchema.describe("Address information").nullish(), - }) - .readonly(); - export type CreateBusinessPartnerRequestDTO = z.infer; - - /** - * BusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { string } rootFolderId Root folder identifier associated with this business partner - */ - export const BusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the business partner"), - name: z.string().describe("Name of the business partner"), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), - rootFolderId: z.string().describe("Root folder identifier associated with this business partner").nullish(), - }) - .readonly(); - export type BusinessPartnerResponseDTO = z.infer; - - /** - * BusinessPartnerLabelResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - */ - export const BusinessPartnerLabelResponseDtoSchema = z - .object({ - id: z.string().describe("Unique identifier of the business partner"), - name: z.string().describe("Name of the business partner"), - }) - .readonly(); - export type BusinessPartnerLabelResponseDto = z.infer; - - /** - * ContactResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the contact - * @property { string } name Name of the contact - */ - export const ContactResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the contact"), - name: z.string().describe("Name of the contact"), - }) - .readonly(); - export type ContactResponseDTO = z.infer; - - /** - * BusinessPartnerDetailResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } createdById ID of the employee who created this record - * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this record - * @property { string } createdAt Creation timestamp - * @property { string } updatedById ID of the employee who last updated this record - * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this record - * @property { string } updatedAt Last update timestamp - * @property { string } matchCode Match code of the business partner - * @property { string } shortName Short name - * @property { string } name Full name - * @property { string } secondaryName Secondary name - * @property { CommonModels.BusinessPartnerType[] } types List of business partner types - * @property { boolean } archived Archived status - * @property { CommonModels.BusinessPartnerAddressResponseDTO } address Main address information - * @property { CommonModels.BusinessPartnerAddressResponseDTO } blAddress BL address information - * @property { BusinessPartnerLabelResponseDto[] } similar Similar named business partners - * @property { boolean } locked - * @property { boolean } addressIsDifferentForBl - * @property { string } lockedById Unique identifier of the employee who locked the business partner - * @property { string } lockedByName - * @property { string } lockedAt Unique identifier of the employee who locked the business partner - * @property { ContactResponseDTO } belongsTo Parent business partner - * @property { ContactResponseDTO } salesRep Sales representative - * @property { ContactResponseDTO } operations Operations contact - */ - export const BusinessPartnerDetailResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the business partner"), - createdById: z.string().describe("ID of the employee who created this record").nullish(), - createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this record").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Creation timestamp"), - updatedById: z.string().describe("ID of the employee who last updated this record").nullish(), - updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this record").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Last update timestamp"), - matchCode: z.string().describe("Match code of the business partner"), - shortName: z.string().describe("Short name"), - name: z.string().describe("Full name"), - secondaryName: z.string().describe("Secondary name"), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), - archived: z.boolean().describe("Archived status"), - address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information"), - blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("BL address information"), - similar: z - .array(BusinessPartnerLabelResponseDtoSchema) - .readonly() - .describe("Similar named business partners") - .nullish(), - locked: z.boolean(), - addressIsDifferentForBl: z.boolean(), - lockedById: z.string().describe("Unique identifier of the employee who locked the business partner").nullish(), - lockedByName: z.string().nullish(), - lockedAt: z.iso - .datetime({ offset: true }) - .describe("Unique identifier of the employee who locked the business partner") - .nullish(), - belongsTo: ContactResponseDTOSchema.describe("Parent business partner"), - salesRep: ContactResponseDTOSchema.describe("Sales representative"), - operations: ContactResponseDTOSchema.describe("Operations contact"), - }) - .readonly(); - export type BusinessPartnerDetailResponseDTO = z.infer; - - /** - * UpdateBusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } district - * @property { string } countryId - */ - export const UpdateBusinessPartnerAddressDtoSchema = z - .object({ - street: z.string(), - secondaryStreet: z.string(), - zip: z.string(), - cityId: z.string().nullable(), - district: z.string(), - countryId: z.string(), - }) - .readonly(); - export type UpdateBusinessPartnerAddressDto = z.infer; - - /** - * UpdateBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code - * @property { string } shortName Updated short name - * @property { string } name Updated full name - * @property { string } secondaryName Updated secondary name - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { UpdateBusinessPartnerAddressDto } address Address information - * @property { UpdateBusinessPartnerAddressDto } blAddress Bl address information - * @property { string } belongsToId Parent business partner - * @property { string } salesRepId Sales representative - * @property { string } operationsId Operations contact - * @property { boolean } addressIsDifferentForBl Different address for BL - */ - export const UpdateBusinessPartnerRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Updated match code"), - shortName: z.string().describe("Updated short name"), - name: z.string().describe("Updated full name"), - secondaryName: z.string().describe("Updated secondary name"), - types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), - address: UpdateBusinessPartnerAddressDtoSchema.describe("Address information"), - blAddress: UpdateBusinessPartnerAddressDtoSchema.describe("Bl address information"), - belongsToId: z.string().describe("Parent business partner"), - salesRepId: z.string().describe("Sales representative"), - operationsId: z.string().describe("Operations contact"), - addressIsDifferentForBl: z.boolean().describe("Different address for BL"), - }) - .readonly(); - export type UpdateBusinessPartnerRequestDTO = z.infer; - - /** - * CreateBusinessPartnerRemarkRequestDTOSchema - * @type { object } - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of remark - */ - export const CreateBusinessPartnerRemarkRequestDTOSchema = z - .object({ - visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), - content: z.string().describe("Content of the remark"), - type: RemarkTypeSchema.describe("Type of remark"), - }) - .readonly(); - export type CreateBusinessPartnerRemarkRequestDTO = z.infer; - - /** - * UpdateBusinessPartnerRemarkRequestDtoSchema - * @type { object } - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of remark - */ - export const UpdateBusinessPartnerRemarkRequestDtoSchema = z - .object({ - visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), - content: z.string().describe("Content of the remark"), - type: RemarkTypeSchema.describe("Type of remark"), - }) - .readonly(); - export type UpdateBusinessPartnerRemarkRequestDto = z.infer; - - /** - * AccountTypeEnumSchema - * @type { enum } - */ - export const AccountTypeEnumSchema = z.enum([ - "Direct Account", - "Logistic Provider / Forwarder", - "4PL/NVOCC", - "LLP", - "Carrier", - "Service Provider (other)", - "Strategic", - "Key Account", - "Transactional", - "Agent", - "Other", - ]); - export type AccountTypeEnum = z.infer; - export const AccountTypeEnum = AccountTypeEnumSchema.enum; - - /** - * BusinessPartnerAuthorizationSchema - * @type { enum } - */ - export const BusinessPartnerAuthorizationSchema = z.enum(["requiresApproval", "blocked", "regularBusinessPartner"]); - export type BusinessPartnerAuthorization = z.infer; - export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.enum; - - /** - * BusinessPartnerPaymentTermsResponseDtoSchema - * @type { object } - * @property { string } relativeTo - * @property { number } days Minimum: `0` - */ - export const BusinessPartnerPaymentTermsResponseDtoSchema = z - .object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }) - .readonly(); - export type BusinessPartnerPaymentTermsResponseDto = z.infer; - - /** - * BusinessPartnerBankAccountResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const BusinessPartnerBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type BusinessPartnerBankAccountResponseDto = z.infer; - - /** - * PartnerNetworkInfoDtoSchema - * @type { object } - * @property { string } id Partner network ID - * @property { string } name Partner network name - */ - export const PartnerNetworkInfoDtoSchema = z - .object({ id: z.string().describe("Partner network ID"), name: z.string().describe("Partner network name") }) - .readonly(); - export type PartnerNetworkInfoDto = z.infer; - - /** - * BusinessPartnerBasicResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Reference to the business partner - * @property { string[] } relationship List of relationships - * @property { AccountTypeEnum } accountType - * @property { string } vat VAT number - * @property { string } legacySystemId Legacy system (move) id - * @property { string } registrationNumber - * @property { string } eori EORI number - * @property { BusinessPartnerAuthorization } authorization Authorization status - * @property { number } creditLimit Credit limit - * @property { string } invoiceLanguage Invoice language - * @property { string } invoiceCurrency Invoice currency - * @property { string } iban IBAN - * @property { string } bankNumber Bank number - * @property { string } bankAccountNumber Bank account number - * @property { BusinessPartnerPaymentTermsResponseDto } termsExport - * @property { BusinessPartnerPaymentTermsResponseDto } termsImport - * @property { CommonModels.EditorContentResponseDto } notes Notes - * @property { string } bankAccountId - * @property { BusinessPartnerBankAccountResponseDto } bankAccount - * @property { PartnerNetworkInfoDto[] } partnerNetworks Partner networks - * @property { string } dunningSystemId - * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem - * @property { string } hblIssuerSigner HBL issuer/signer prefill - * @property { string } signatureFileAttachmentId Signature file attachment ID - * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment - */ - export const BusinessPartnerBasicResponseDTOSchema = z - .object({ - businessPartnerId: z.string().describe("Reference to the business partner"), - relationship: z.array(z.string()).readonly().describe("List of relationships"), - accountType: AccountTypeEnumSchema.nullish(), - vat: z.string().describe("VAT number"), - legacySystemId: z.string().describe("Legacy system (move) id").nullish(), - registrationNumber: z.string().nullish(), - eori: z.string().describe("EORI number"), - authorization: BusinessPartnerAuthorizationSchema.describe("Authorization status").nullable(), - creditLimit: z.number().describe("Credit limit"), - invoiceLanguage: z.string().describe("Invoice language"), - invoiceCurrency: z.string().describe("Invoice currency"), - iban: z.string().describe("IBAN"), - bankNumber: z.string().describe("Bank number"), - bankAccountNumber: z.string().describe("Bank account number"), - termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, - termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, - notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), - bankAccountId: z.string().nullish(), - bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), - partnerNetworks: z.array(PartnerNetworkInfoDtoSchema).readonly().describe("Partner networks"), - dunningSystemId: z.string().nullish(), - dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), - hblIssuerSigner: z.string().describe("HBL issuer/signer prefill"), - signatureFileAttachmentId: z.string().describe("Signature file attachment ID"), - signatureFileAttachmentUrl: z.string().describe("Signed URL for signature file attachment").nullish(), - }) - .readonly(); - export type BusinessPartnerBasicResponseDTO = z.infer; - - /** - * UpdateBusinessPartnerPaymentTermsDtoSchema - * @type { object } - * @property { string } relativeTo - * @property { number } days Minimum: `0` - */ - export const UpdateBusinessPartnerPaymentTermsDtoSchema = z - .object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }) - .readonly(); - export type UpdateBusinessPartnerPaymentTermsDto = z.infer; - - /** - * UpdateBusinessPartnerBasicRequestDTOSchema - * @type { object } - * @property { string[] } relationship Updated relationships - * @property { string } vat Updated VAT number - * @property { string } eori Updated EORI number - * @property { AccountTypeEnum } accountType - * @property { BusinessPartnerAuthorization } authorization Updated authorization status - * @property { number } creditLimit Updated credit limit - * @property { string } invoiceLanguage Invoice language - * @property { string } invoiceCurrency Invoice currency - * @property { string } iban IBAN - * @property { string } bankNumber Bank number - * @property { string } bankAccountNumber Bank account number - * @property { string } legacySystemId Legacy system (move) id - * @property { string } registrationNumber - * @property { UpdateBusinessPartnerPaymentTermsDto } termsExport - * @property { UpdateBusinessPartnerPaymentTermsDto } termsImport - * @property { CommonModels.EditorContentUpdateDto } notes Notes - * @property { string } bankAccountId - * @property { string[] } partnerNetworkIds Partner network IDs - * @property { string } dunningSystemId Dunning system ID - * @property { string } hblIssuerSigner HBL issuer/signer prefill - * @property { string } signatureFileAttachmentId Signature file attachment ID - */ - export const UpdateBusinessPartnerBasicRequestDTOSchema = z - .object({ - relationship: z.array(z.string()).readonly().describe("Updated relationships"), - vat: z.string().describe("Updated VAT number"), - eori: z.string().describe("Updated EORI number"), - accountType: AccountTypeEnumSchema, - authorization: BusinessPartnerAuthorizationSchema.describe("Updated authorization status"), - creditLimit: z.number().describe("Updated credit limit"), - invoiceLanguage: z.string().describe("Invoice language"), - invoiceCurrency: z.string().describe("Invoice currency"), - iban: z.string().describe("IBAN"), - bankNumber: z.string().describe("Bank number"), - bankAccountNumber: z.string().describe("Bank account number"), - legacySystemId: z.string().describe("Legacy system (move) id"), - registrationNumber: z.string(), - termsExport: UpdateBusinessPartnerPaymentTermsDtoSchema, - termsImport: UpdateBusinessPartnerPaymentTermsDtoSchema, - notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), - bankAccountId: z.string().nullable(), - partnerNetworkIds: z.array(z.string()).readonly().describe("Partner network IDs"), - dunningSystemId: z.string().describe("Dunning system ID").nullable(), - hblIssuerSigner: z.string().describe("HBL issuer/signer prefill").nullable(), - signatureFileAttachmentId: z.string().describe("Signature file attachment ID").nullable(), - }) - .readonly(); - export type UpdateBusinessPartnerBasicRequestDTO = z.infer; - - /** - * BusinessPartnerSignatureUploadRequestDTOSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType Mime type - * @property { number } fileSize File size in bytes. Minimum: `1` - */ - export const BusinessPartnerSignatureUploadRequestDTOSchema = z - .object({ - fileName: z.string().describe("File name"), - mimeType: z.string().describe("Mime type"), - fileSize: z.number().gte(1).describe("File size in bytes"), - }) - .readonly(); - export type BusinessPartnerSignatureUploadRequestDTO = z.infer; - - /** - * BusinessPartnerSignatureUploadResponseDTOSchema - * @type { object } - * @property { string } mediaId Media ID for the uploaded signature - * @property { string } method HTTP method to use for upload - * @property { string } url URL to upload the file to - */ - export const BusinessPartnerSignatureUploadResponseDTOSchema = z - .object({ - mediaId: z.string().describe("Media ID for the uploaded signature"), - method: z.string().describe("HTTP method to use for upload"), - url: z.string().describe("URL to upload the file to"), - }) - .readonly(); - export type BusinessPartnerSignatureUploadResponseDTO = z.infer< - typeof BusinessPartnerSignatureUploadResponseDTOSchema - >; - - /** - * CargoAgentResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Business partner identifier - * @property { string } portOfHamburgAccountNumber Port of Hamburg account number - * @property { string } iataAccountNumber IATA account number - * @property { string } regulatedAgentCode Regulated agent code - */ - export const CargoAgentResponseDTOSchema = z - .object({ - businessPartnerId: z.string().describe("Business partner identifier"), - portOfHamburgAccountNumber: z.string().describe("Port of Hamburg account number"), - iataAccountNumber: z.string().describe("IATA account number"), - regulatedAgentCode: z.string().describe("Regulated agent code"), - }) - .readonly(); - export type CargoAgentResponseDTO = z.infer; - - /** - * UpdateCargoAgentDTOSchema - * @type { object } - * @property { string } portOfHamburgAccountNumber Hamburg port account number - * @property { string } iataAccountNumber IATA account number - * @property { string } regulatedAgentCode Regulated agent code - */ - export const UpdateCargoAgentDTOSchema = z - .object({ - portOfHamburgAccountNumber: z.string().describe("Hamburg port account number"), - iataAccountNumber: z.string().describe("IATA account number"), - regulatedAgentCode: z.string().describe("Regulated agent code"), - }) - .readonly(); - export type UpdateCargoAgentDTO = z.infer; - - /** - * CarrierResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Business partner identifier - * @property { string } scac SCAC code - * @property { string } iataAirlinePrefix IATA airline prefix - * @property { string } iataCode IATA code - * @property { string } registrationAddress Registration address - * @property { string } masterBlSuffix Master BL suffix - * @property { string } houseBlSuffix House BL suffix - * @property { string } airWaybillSuffix Air waybill suffix - * @property { string } cargoManifestSuffix Cargo manifest suffix - * @property { string } fundReportSuffix Fund report suffix - * @property { string } invoiceSuffix Invoice suffix - */ - export const CarrierResponseDTOSchema = z - .object({ - businessPartnerId: z.string().describe("Business partner identifier"), - scac: z.string().describe("SCAC code"), - iataAirlinePrefix: z.string().describe("IATA airline prefix"), - iataCode: z.string().describe("IATA code"), - registrationAddress: z.string().describe("Registration address"), - masterBlSuffix: z.string().describe("Master BL suffix"), - houseBlSuffix: z.string().describe("House BL suffix"), - airWaybillSuffix: z.string().describe("Air waybill suffix"), - cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), - fundReportSuffix: z.string().describe("Fund report suffix"), - invoiceSuffix: z.string().describe("Invoice suffix"), - }) - .readonly(); - export type CarrierResponseDTO = z.infer; - - /** - * UpdateCarrierDTOSchema - * @type { object } - * @property { string } scac SCAC code - * @property { string } iataAirlinePrefix IATA airline prefix - * @property { string } iataCode IATA code - * @property { string } registrationAddress Registration address - * @property { string } masterBlSuffix Master BL suffix - * @property { string } houseBlSuffix House BL suffix - * @property { string } airWaybillSuffix Air waybill suffix - * @property { string } cargoManifestSuffix Cargo manifest suffix - * @property { string } fundReportSuffix Fund report suffix - * @property { string } invoiceSuffix Invoice suffix - */ - export const UpdateCarrierDTOSchema = z - .object({ - scac: z.string().describe("SCAC code"), - iataAirlinePrefix: z.string().describe("IATA airline prefix"), - iataCode: z.string().describe("IATA code"), - registrationAddress: z.string().describe("Registration address"), - masterBlSuffix: z.string().describe("Master BL suffix"), - houseBlSuffix: z.string().describe("House BL suffix"), - airWaybillSuffix: z.string().describe("Air waybill suffix"), - cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), - fundReportSuffix: z.string().describe("Fund report suffix"), - invoiceSuffix: z.string().describe("Invoice suffix"), - }) - .readonly(); - export type UpdateCarrierDTO = z.infer; - - /** - * BusinessPartnersPaginateOrderParamEnumSchema - * @type { enum } - */ - export const BusinessPartnersPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "vat", - "shortName", - "address", - "locked", - "currency", - "archived", - ]); - export type BusinessPartnersPaginateOrderParamEnum = z.infer; - export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOrderParamEnumSchema.enum; - - /** - * BusinessPartnersPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BusinessPartnerListResponseDTO[] } items - */ - export const BusinessPartnersPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).readonly() }).readonly().shape, - }); - export type BusinessPartnersPaginateResponse = z.infer; - - /** - * BusinessPartnersPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const BusinessPartnersPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "vat", - "shortName", - "address", - "locked", - "currency", - "archived", - ]); - export type BusinessPartnersPaginateLabelsOrderParamEnum = z.infer< - typeof BusinessPartnersPaginateLabelsOrderParamEnumSchema - >; - export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPaginateLabelsOrderParamEnumSchema.enum; - - /** - * BusinessPartnersPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items - */ - export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type BusinessPartnersPaginateLabelsResponse = z.infer; - - /** - * GetRemarksResponseSchema - * @type { array } - */ - export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema).readonly(); - export type GetRemarksResponse = z.infer; -} diff --git a/test/generated/dist/businessPartners/businessPartners.queries.ts b/test/generated/dist/businessPartners/businessPartners.queries.ts deleted file mode 100644 index 330f8f0..0000000 --- a/test/generated/dist/businessPartners/businessPartners.queries.ts +++ /dev/null @@ -1,895 +0,0 @@ -import axios, { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnersAcl } from "./businessPartners.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnersModels } from "./businessPartners.models"; -import { BusinessPartnersApi } from "./businessPartners.api"; - -export namespace BusinessPartnersQueries { - export const moduleName = QueryModule.BusinessPartners; - - export const keys = { - all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/business-partners", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/business-partners", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/business-partners/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/business-partners/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - getById: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/business-partners/:id", officeId, id] as const, - getRemarks: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/business-partners/:id/remarks", officeId, id] as const, - getBasicInfo: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/business-partners/:id/basic", officeId, id] as const, - getCargoAgentInfo: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/business-partners/:id/cargo-agent", officeId, id] as const, - getCarrierInformation: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/business-partners/:id/carrier", officeId, id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate business partners - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BusinessPartnersModels.BusinessPartnerFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId })); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate business partners - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BusinessPartnersModels.BusinessPartnerFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId })); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create business partner - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { BusinessPartnersModels.CreateBusinessPartnerRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.create, - { officeId: string; data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(BusinessPartnersAcl.canUseCreate({ officeId })); - return BusinessPartnersApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateLabels` - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId })); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId })); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useGetById` - * @summary Get business partner by ID - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetById = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetById({ officeId })); - return BusinessPartnersApi.getById(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update business partner - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.update, - { officeId: string; id: string; data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId })); - return BusinessPartnersApi.update(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive business partner - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseArchive({ officeId })); - return BusinessPartnersApi.archive(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive business partner - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId })); - return BusinessPartnersApi.unarchive(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useLock` - * @summary Lock business partner - * @permission Requires `canUseLock` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useLock = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseLock({ officeId })); - return BusinessPartnersApi.lock(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnlock` - * @summary Unlock business partner - * @permission Requires `canUseUnlock` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnlock = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId })); - return BusinessPartnersApi.unlock(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetRemarks` - * @summary Get business partner remarks - * @permission Requires `canUseGetRemarks` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetRemarks = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getRemarks(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId })); - return BusinessPartnersApi.getRemarks(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreateRemark` - * @summary Create business partner remark - * @permission Requires `canUseCreateRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateRemark = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.createRemark, - { officeId: string; id: string; data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId })); - return BusinessPartnersApi.createRemark(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateRemark` - * @permission Requires `canUseUpdateRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { string } mutation.remarkId Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateRemark = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.updateRemark, - { - officeId: string; - id: string; - remarkId: string; - data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, remarkId, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId })); - return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteRemark` - * @summary Delete business partner remark - * @permission Requires `canUseDeleteRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { string } mutation.remarkId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteRemark = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.deleteRemark, - { officeId: string; id: string; remarkId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, remarkId }) => { - checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId })); - return BusinessPartnersApi.deleteRemark(officeId, id, remarkId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetBasicInfo` - * @summary Get business partner basic info - * @permission Requires `canUseGetBasicInfo` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetBasicInfo = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBasicInfo(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId })); - return BusinessPartnersApi.getBasicInfo(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateBasicInfo` - * @summary Update business partner basic info - * @permission Requires `canUseUpdateBasicInfo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBasicInfo = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.updateBasicInfo, - { officeId: string; id: string; data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId })); - return BusinessPartnersApi.updateBasicInfo(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getBasicInfo(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCreateSignatureUploadInstructions` - * @summary Create upload instructions for business partner signature - * @permission Requires `canUseCreateSignatureUploadInstructions` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateSignatureUploadInstructions = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.createSignatureUploadInstructions, - { - officeId: string; - id: string; - data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { - checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId })); - const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions( - officeId, - id, - data, - config, - ); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetCargoAgentInfo` - * @summary Get cargo agent information for business partner - * @permission Requires `canUseGetCargoAgentInfo` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCargoAgentInfo = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoAgentInfo(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId })); - return BusinessPartnersApi.getCargoAgentInfo(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateCargoAgent` - * @summary Update cargo agent information for business partner - * @permission Requires `canUseUpdateCargoAgent` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateCargoAgentDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCargoAgent = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.updateCargoAgent, - { officeId: string; id: string; data: BusinessPartnersModels.UpdateCargoAgentDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId })); - return BusinessPartnersApi.updateCargoAgent(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getCargoAgentInfo(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetCarrierInformation` - * @summary Get carrier information for business partner - * @permission Requires `canUseGetCarrierInformation` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCarrierInformation = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCarrierInformation(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId })); - return BusinessPartnersApi.getCarrierInformation(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateCarrier` - * @summary Update carrier information for business partner - * @permission Requires `canUseUpdateCarrier` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateCarrierDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCarrier = ( - options?: AppMutationOptions< - typeof BusinessPartnersApi.updateCarrier, - { officeId: string; id: string; data: BusinessPartnersModels.UpdateCarrierDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId })); - return BusinessPartnersApi.updateCarrier(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getCarrierInformation(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/cargoTypes/cargoTypes.acl.ts b/test/generated/dist/cargoTypes/cargoTypes.acl.ts deleted file mode 100644 index 342fe0d..0000000 --- a/test/generated/dist/cargoTypes/cargoTypes.acl.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CargoTypesAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "CargoType"] as AbilityTuple<"Create", "CargoType">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "CargoType"] as AbilityTuple<"Read", "CargoType">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "CargoType"] as AbilityTuple<"Update", "CargoType">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "CargoType"] as AbilityTuple<"Archive", "CargoType">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "CargoType"] as AbilityTuple<"Archive", "CargoType">; -} diff --git a/test/generated/dist/cargoTypes/cargoTypes.api.ts b/test/generated/dist/cargoTypes/cargoTypes.api.ts deleted file mode 100644 index 0772804..0000000 --- a/test/generated/dist/cargoTypes/cargoTypes.api.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CargoTypesModels } from "./cargoTypes.models"; - -export namespace CargoTypesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: CargoTypesModels.CargoTypePaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, `/cargo-types`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types`, - ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), - config, - ); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: CargoTypesModels.CargoTypeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, - `/cargo-types/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, `/cargo-types/${id}`, config); - }; - export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}`, - ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/cargoTypes/cargoTypes.configs.ts b/test/generated/dist/cargoTypes/cargoTypes.configs.ts deleted file mode 100644 index c2d613d..0000000 --- a/test/generated/dist/cargoTypes/cargoTypes.configs.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CargoTypesModels } from "./cargoTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CargoTypesQueries } from "./cargoTypes.queries"; -import { CargoTypesAcl } from "./cargoTypes.acl"; - -export namespace CargoTypesConfigs { - export const cargoTypesConfig = { - meta: { - title: "Cargo Types", - }, - readAll: { - acl: CargoTypesAcl.canUsePaginate, - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - paginated: CargoTypesQueries.usePaginate, - infinite: CargoTypesQueries.usePaginateInfinite, - filters: { - schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, - options: { - inputs: { - module: true, - archived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - shortName: true, - length: true, - width: true, - height: true, - unit: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - modules: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: CargoTypesAcl.canUseFindById, - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - query: CargoTypesQueries.useFindById, - }, - create: { - acl: CargoTypesAcl.canUseCreate, - schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, - mutation: CargoTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - length: true, - width: true, - height: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - unit: true, - modules: true, - }, - }, - }), - }, - update: { - acl: CargoTypesAcl.canUseUpdate, - schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, - mutation: CargoTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - length: true, - width: true, - height: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - unit: true, - modules: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CargoTypesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CargoTypesQueries.usePaginateLabels, - infinite: CargoTypesQueries.usePaginateLabelsInfinite, - filters: { - schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/cargoTypes/cargoTypes.models.ts b/test/generated/dist/cargoTypes/cargoTypes.models.ts deleted file mode 100644 index bf04326..0000000 --- a/test/generated/dist/cargoTypes/cargoTypes.models.ts +++ /dev/null @@ -1,224 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CargoTypesModels { - /** - * CargoTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CargoTypeEmployeeDTO = z.infer; - - /** - * CargoTypeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the cargo type - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { string } unit Measurement unit for dimensions - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type - * @property { boolean } archived Indicates if the cargo type is archived - * @property { string } createdById - * @property { CargoTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CargoTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const CargoTypeResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier for the cargo type"), - name: z.string().describe("Name of the cargo type"), - shortName: z.string().describe("Short name of the cargo type").nullish(), - length: z.number().describe("Length of the cargo type").nullish(), - width: z.number().describe("Width of the cargo type").nullish(), - height: z.number().describe("Height of the cargo type").nullish(), - unit: z.string().describe("Measurement unit for dimensions"), - emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), - containerIsoCode: z.string().describe("Container ISO code").nullish(), - isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), - modules: z - .array(CommonModels.TransportModeEnumSchema) - .readonly() - .describe("Transport modules applicable to the cargo type"), - archived: z.boolean().describe("Indicates if the cargo type is archived"), - createdById: z.string().nullish(), - createdBy: CargoTypeEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: CargoTypeEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type CargoTypeResponseDTO = z.infer; - - /** - * TransportModuleEnumSchema - * @type { enum } - */ - export const TransportModuleEnumSchema = z.enum(["Air", "Sea", "Road"]); - export type TransportModuleEnum = z.infer; - export const TransportModuleEnum = TransportModuleEnumSchema.enum; - - /** - * CargoTypePaginationFilterDtoSchema - * @type { object } - * @property { TransportModuleEnum } module - * @property { boolean } archived Archived status filter - * @property { string } search - */ - export const CargoTypePaginationFilterDtoSchema = z - .object({ - module: TransportModuleEnumSchema, - archived: z.boolean().describe("Archived status filter"), - search: z.string(), - }) - .readonly(); - export type CargoTypePaginationFilterDto = z.infer; - - /** - * CreateCargoTypeRequestDTOSchema - * @type { object } - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { string } unit Measurement unit for dimensions - * @property { CommonModels.TransportModeEnum[] } modules Transport modes applicable to the cargo type - */ - export const CreateCargoTypeRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the cargo type"), - shortName: z.string().describe("Short name of the cargo type").nullish(), - length: z.number().describe("Length of the cargo type").nullish(), - width: z.number().describe("Width of the cargo type").nullish(), - height: z.number().describe("Height of the cargo type").nullish(), - emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), - containerIsoCode: z.string().describe("Container ISO code").nullish(), - isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), - unit: z.string().describe("Measurement unit for dimensions"), - modules: z - .array(CommonModels.TransportModeEnumSchema) - .readonly() - .describe("Transport modes applicable to the cargo type"), - }) - .readonly(); - export type CreateCargoTypeRequestDTO = z.infer; - - /** - * UpdateCargoTypeRequestDTOSchema - * @type { object } - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { string } unit Measurement unit for dimensions - * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type - */ - export const UpdateCargoTypeRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the cargo type"), - shortName: z.string().describe("Short name of the cargo type"), - length: z.number().describe("Length of the cargo type").nullable(), - width: z.number().describe("Width of the cargo type").nullable(), - height: z.number().describe("Height of the cargo type").nullable(), - emptyWeight: z.number().describe("Empty weight of the cargo container").nullable(), - containerIsoCode: z.string().describe("Container ISO code").nullable(), - isContainer: z.boolean().describe("Whether this cargo type is a container").nullable(), - unit: z.string().describe("Measurement unit for dimensions"), - modules: z - .array(CommonModels.TransportModeEnumSchema) - .readonly() - .describe("Transport modules applicable to the cargo type"), - }) - .readonly(); - export type UpdateCargoTypeRequestDTO = z.infer; - - /** - * CargoTypeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const CargoTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type CargoTypeLabelFilterDto = z.infer; - - /** - * CargoTypesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const CargoTypesPaginateOrderParamEnumSchema = z.enum([ - "matchcode", - "description", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "name", - ]); - export type CargoTypesPaginateOrderParamEnum = z.infer; - export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnumSchema.enum; - - /** - * CargoTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CargoTypeResponseDTO[] } items - */ - export const CargoTypesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CargoTypeResponseDTOSchema).readonly() }).readonly().shape, - }); - export type CargoTypesPaginateResponse = z.infer; - - /** - * CargoTypesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const CargoTypesPaginateLabelsOrderParamEnumSchema = z.enum([ - "matchcode", - "description", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "name", - ]); - export type CargoTypesPaginateLabelsOrderParamEnum = z.infer; - export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOrderParamEnumSchema.enum; - - /** - * CargoTypesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const CargoTypesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type CargoTypesPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/cargoTypes/cargoTypes.queries.ts b/test/generated/dist/cargoTypes/cargoTypes.queries.ts deleted file mode 100644 index 483b369..0000000 --- a/test/generated/dist/cargoTypes/cargoTypes.queries.ts +++ /dev/null @@ -1,362 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CargoTypesAcl } from "./cargoTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CargoTypesModels } from "./cargoTypes.models"; -import { CargoTypesApi } from "./cargoTypes.api"; - -export namespace CargoTypesQueries { - export const moduleName = QueryModule.CargoTypes; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: CargoTypesModels.CargoTypePaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/cargo-types", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: CargoTypesModels.CargoTypePaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/cargo-types", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: CargoTypesModels.CargoTypeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/cargo-types/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: CargoTypesModels.CargoTypeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/cargo-types/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/cargo-types/:id", id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Cargo Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CargoTypesModels.CargoTypePaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Cargo Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CargoTypesModels.CargoTypePaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create Cargo Type - * @permission Requires `canUseCreate` ability - * @param { CargoTypesModels.CreateCargoTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CargoTypesAcl.canUseCreate()); - return CargoTypesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate cargo types with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CargoTypesModels.CargoTypeLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate cargo types with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CargoTypesModels.CargoTypeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get Cargo Type by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(CargoTypesAcl.canUseFindById()); - return CargoTypesApi.findById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update Cargo Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { CargoTypesModels.UpdateCargoTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof CargoTypesApi.update, - { id: string; data: CargoTypesModels.UpdateCargoTypeRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(CargoTypesAcl.canUseUpdate()); - return CargoTypesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive Cargo Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CargoTypesAcl.canUseArchive()); - return CargoTypesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive Cargo Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CargoTypesAcl.canUseUnarchive()); - return CargoTypesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/chargeTypes/chargeTypes.acl.ts b/test/generated/dist/chargeTypes/chargeTypes.acl.ts deleted file mode 100644 index a76453f..0000000 --- a/test/generated/dist/chargeTypes/chargeTypes.acl.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace ChargeTypesAcl { - /** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "ChargeType"] as AbilityTuple<"Create", "ChargeType">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "ChargeType"] as AbilityTuple<"Read", "ChargeType">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "ChargeType"] as AbilityTuple<"Update", "ChargeType">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "ChargeType"] as AbilityTuple<"Archive", "ChargeType">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "ChargeType"] as AbilityTuple<"Archive", "ChargeType">; -} diff --git a/test/generated/dist/chargeTypes/chargeTypes.api.ts b/test/generated/dist/chargeTypes/chargeTypes.api.ts deleted file mode 100644 index 53f6e68..0000000 --- a/test/generated/dist/chargeTypes/chargeTypes.api.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChargeTypesModels } from "./chargeTypes.models"; - -export namespace ChargeTypesApi { - export const findAll = ( - limit: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, - `/charge-types/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const paginate = ( - limit: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, `/charge-types`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types`, - ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), - config, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}`, - config, - ); - }; - export const update = ( - id: string, - data: ChargeTypesModels.UpdateChargeTypeRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}`, - ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/chargeTypes/chargeTypes.configs.ts b/test/generated/dist/chargeTypes/chargeTypes.configs.ts deleted file mode 100644 index 2aab959..0000000 --- a/test/generated/dist/chargeTypes/chargeTypes.configs.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChargeTypesModels } from "./chargeTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChargeTypesQueries } from "./chargeTypes.queries"; -import { ChargeTypesAcl } from "./chargeTypes.acl"; - -export namespace ChargeTypesConfigs { - export const chargeTypesConfig = { - meta: { - title: "Charge Types", - }, - readAll: { - acl: ChargeTypesAcl.canUsePaginate, - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - paginated: ChargeTypesQueries.usePaginate, - infinite: ChargeTypesQueries.usePaginateInfinite, - filters: { - schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, - options: { - inputs: { - name: true, - search: true, - archived: true, - direction: true, - transportModes: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: ChargeTypesAcl.canUseFindById, - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - query: ChargeTypesQueries.useFindById, - }, - create: { - acl: ChargeTypesAcl.canUseCreate, - schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, - mutation: ChargeTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, - options: { - inputs: { - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - }, - }, - }), - }, - update: { - acl: ChargeTypesAcl.canUseUpdate, - schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, - mutation: ChargeTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, - options: { - inputs: { - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ChargeTypesAcl.canUseFindAll, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChargeTypesQueries.useFindAll, - infinite: ChargeTypesQueries.useFindAllInfinite, - filters: { - schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, - options: { - inputs: { - direction: true, - transportModes: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/chargeTypes/chargeTypes.models.ts b/test/generated/dist/chargeTypes/chargeTypes.models.ts deleted file mode 100644 index 688b640..0000000 --- a/test/generated/dist/chargeTypes/chargeTypes.models.ts +++ /dev/null @@ -1,230 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChargeTypesModels { - /** - * ChargeTypeLabelFilterDtoSchema - * @type { object } - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum[] } transportModes - * @property { string } search - */ - export const ChargeTypeLabelFilterDtoSchema = z - .object({ - direction: CommonModels.DirectionEnumSchema, - transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), - search: z.string(), - }) - .readonly(); - export type ChargeTypeLabelFilterDto = z.infer; - - /** - * ChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ - export const ChargeTypeTranslationDtoSchema = z - .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) - .readonly(); - export type ChargeTypeTranslationDto = z.infer; - - /** - * ChargeTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ChargeTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ChargeTypeEmployeeDTO = z.infer; - - /** - * ChargeTypeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { ChargeTypeTranslationDto[] } translations - * @property { string } createdById - * @property { ChargeTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { ChargeTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const ChargeTypeResponseDTOSchema = z - .object({ - id: z.string(), - matchCode: z.string(), - englishName: z.string(), - archived: z.boolean(), - description: z.string().nullish(), - modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), - directions: z.array(CommonModels.DirectionEnumSchema).readonly(), - translations: z.array(ChargeTypeTranslationDtoSchema).readonly(), - createdById: z.string().nullish(), - createdBy: ChargeTypeEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type ChargeTypeResponseDTO = z.infer; - - /** - * ChargeTypePaginationFilterDtoSchema - * @type { object } - * @property { string } name - * @property { string } search - * @property { boolean } archived - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum[] } transportModes - */ - export const ChargeTypePaginationFilterDtoSchema = z - .object({ - name: z.string(), - search: z.string(), - archived: z.boolean(), - direction: CommonModels.DirectionEnumSchema, - transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), - }) - .readonly(); - export type ChargeTypePaginationFilterDto = z.infer; - - /** - * CreateChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ - export const CreateChargeTypeTranslationDtoSchema = z - .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) - .readonly(); - export type CreateChargeTypeTranslationDto = z.infer; - - /** - * CreateChargeTypeRequestDTOSchema - * @type { object } - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { CreateChargeTypeTranslationDto[] } translations - */ - export const CreateChargeTypeRequestDTOSchema = z - .object({ - matchCode: z.string(), - englishName: z.string().nullish(), - archived: z.boolean().nullish(), - description: z.string().nullish(), - modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), - directions: z.array(CommonModels.DirectionEnumSchema).readonly(), - translations: z.array(CreateChargeTypeTranslationDtoSchema).readonly().nullish(), - }) - .readonly(); - export type CreateChargeTypeRequestDTO = z.infer; - - /** - * UpdateChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ - export const UpdateChargeTypeTranslationDtoSchema = z - .object({ language: CommonModels.LanguageEnumSchema, value: z.string() }) - .readonly(); - export type UpdateChargeTypeTranslationDto = z.infer; - - /** - * UpdateChargeTypeRequestDTOSchema - * @type { object } - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { UpdateChargeTypeTranslationDto[] } translations - */ - export const UpdateChargeTypeRequestDTOSchema = z - .object({ - matchCode: z.string(), - englishName: z.string(), - archived: z.boolean(), - description: z.string(), - modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), - directions: z.array(CommonModels.DirectionEnumSchema).readonly(), - translations: z.array(UpdateChargeTypeTranslationDtoSchema).readonly(), - }) - .readonly(); - export type UpdateChargeTypeRequestDTO = z.infer; - - /** - * ChargeTypesFindAllOrderParamEnumSchema - * @type { enum } - */ - export const ChargeTypesFindAllOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "englishName", - ]); - export type ChargeTypesFindAllOrderParamEnum = z.infer; - export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnumSchema.enum; - - /** - * ChargeTypesFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const ChargeTypesFindAllResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChargeTypesFindAllResponse = z.infer; - - /** - * ChargeTypesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const ChargeTypesPaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "englishName", - ]); - export type ChargeTypesPaginateOrderParamEnum = z.infer; - export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEnumSchema.enum; - - /** - * ChargeTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChargeTypeResponseDTO[] } items - */ - export const ChargeTypesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChargeTypesPaginateResponse = z.infer; -} diff --git a/test/generated/dist/chargeTypes/chargeTypes.queries.ts b/test/generated/dist/chargeTypes/chargeTypes.queries.ts deleted file mode 100644 index 1613130..0000000 --- a/test/generated/dist/chargeTypes/chargeTypes.queries.ts +++ /dev/null @@ -1,362 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChargeTypesAcl } from "./chargeTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChargeTypesModels } from "./chargeTypes.models"; -import { ChargeTypesApi } from "./chargeTypes.api"; - -export namespace ChargeTypesQueries { - export const moduleName = QueryModule.ChargeTypes; - - export const keys = { - all: [moduleName] as const, - findAll: ( - limit?: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/charge-types/paginate/labels", limit, order, filter, page, cursor] as const, - findAllInfinite: ( - limit?: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/charge-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, - paginate: ( - limit?: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/charge-types", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/charge-types", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/charge-types/:id", id] as const, - }; - - /** - * Query `useFindAll` - * @summary Paginate charge types with only their labels - * @permission Requires `canUseFindAll` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ChargeTypesModels.ChargeTypeLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useFindAllInfinite - * @summary Paginate charge types with only their labels - * @permission Requires `canUseFindAll` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ChargeTypesModels.ChargeTypeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginate` - * @summary Paginate Charge Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ChargeTypesModels.ChargeTypePaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Charge Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ChargeTypesModels.ChargeTypePaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create a new Charge Type - * @permission Requires `canUseCreate` ability - * @param { ChargeTypesModels.CreateChargeTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(ChargeTypesAcl.canUseCreate()); - return ChargeTypesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get Charge Type Details by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUseFindById()); - return ChargeTypesApi.findById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update an existing Charge Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { ChargeTypesModels.UpdateChargeTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ChargeTypesApi.update, - { id: string; data: ChargeTypesModels.UpdateChargeTypeRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(ChargeTypesAcl.canUseUpdate()); - return ChargeTypesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive a Charge Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ChargeTypesAcl.canUseArchive()); - return ChargeTypesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive a Charge Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ChargeTypesAcl.canUseUnarchive()); - return ChargeTypesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/checklistItems/checklistItems.acl.ts b/test/generated/dist/checklistItems/checklistItems.acl.ts deleted file mode 100644 index 01dc0d4..0000000 --- a/test/generated/dist/checklistItems/checklistItems.acl.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ChecklistItemsAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create checklist item in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Create", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; - - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List checklist items for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Read", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; - - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Paginate checklist item labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Read", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; - - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get checklist item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Read", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Update", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Archive", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ChecklistItem", object) : "ChecklistItem"] as AbilityTuple< - "Archive", - "ChecklistItem" | (ForcedSubject<"ChecklistItem"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/checklistItems/checklistItems.api.ts b/test/generated/dist/checklistItems/checklistItems.api.ts deleted file mode 100644 index 3891cc6..0000000 --- a/test/generated/dist/checklistItems/checklistItems.api.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChecklistItemsModels } from "./checklistItems.models"; - -export namespace ChecklistItemsApi { - export const create = ( - officeId: string, - data: ChecklistItemsModels.CreateChecklistItemRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items`, - ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), - config, - ); - }; - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, - `/offices/${officeId}/checklist-items`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, - `/offices/${officeId}/checklist-items/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items/${id}`, - config, - ); - }; - export const update = ( - id: string, - officeId: string, - data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items/${id}`, - ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-items/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-items/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/checklistItems/checklistItems.configs.ts b/test/generated/dist/checklistItems/checklistItems.configs.ts deleted file mode 100644 index 014d56c..0000000 --- a/test/generated/dist/checklistItems/checklistItems.configs.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChecklistItemsModels } from "./checklistItems.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChecklistItemsQueries } from "./checklistItems.queries"; -import { ChecklistItemsAcl } from "./checklistItems.acl"; - -export namespace ChecklistItemsConfigs { - export const checklistItemsConfig = { - meta: { - title: "Checklist Items", - }, - readAll: { - acl: ChecklistItemsAcl.canUsePaginate, - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - paginated: ChecklistItemsQueries.usePaginate, - infinite: ChecklistItemsQueries.usePaginateInfinite, - filters: { - schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: ChecklistItemsAcl.canUseFindById, - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - query: ChecklistItemsQueries.useFindById, - }, - create: { - acl: ChecklistItemsAcl.canUseCreate, - schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, - mutation: ChecklistItemsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), - }, - update: { - acl: ChecklistItemsAcl.canUseUpdate, - schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, - mutation: ChecklistItemsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: ChecklistItemsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChecklistItemsQueries.usePaginateLabels, - infinite: ChecklistItemsQueries.usePaginateLabelsInfinite, - filters: { - schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/checklistItems/checklistItems.models.ts b/test/generated/dist/checklistItems/checklistItems.models.ts deleted file mode 100644 index 0951314..0000000 --- a/test/generated/dist/checklistItems/checklistItems.models.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChecklistItemsModels { - /** - * ChecklistItemEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ChecklistItemEmployeeDTO = z.infer; - - /** - * ChecklistItemResponseDTOSchema - * @type { object } - * @property { string } id Checklist item ID - * @property { string } name Checklist item name - * @property { string } officeId Office ID - * @property { boolean } archived Is archived - * @property { string } archivedAt Archived at - * @property { string } createdById ID of the employee who created this checklist item - * @property { ChecklistItemEmployeeDTO } createdBy Employee who created this checklist item - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this checklist item - * @property { ChecklistItemEmployeeDTO } updatedBy Employee who last updated this checklist item - * @property { string } updatedAt Updated at - */ - export const ChecklistItemResponseDTOSchema = z - .object({ - id: z.string().describe("Checklist item ID"), - name: z.string().describe("Checklist item name"), - officeId: z.string().describe("Office ID"), - archived: z.boolean().describe("Is archived"), - archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), - createdById: z.string().describe("ID of the employee who created this checklist item").nullish(), - createdBy: ChecklistItemEmployeeDTOSchema.describe("Employee who created this checklist item").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedById: z.string().describe("ID of the employee who last updated this checklist item").nullish(), - updatedBy: ChecklistItemEmployeeDTOSchema.describe("Employee who last updated this checklist item").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - }) - .readonly(); - export type ChecklistItemResponseDTO = z.infer; - - /** - * CreateChecklistItemRequestDTOSchema - * @type { object } - * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` - */ - export const CreateChecklistItemRequestDTOSchema = z - .object({ name: z.string().min(3).max(256).describe("Checklist item name") }) - .readonly(); - export type CreateChecklistItemRequestDTO = z.infer; - - /** - * ChecklistItemLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const ChecklistItemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type ChecklistItemLabelFilterDto = z.infer; - - /** - * ChecklistItemFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ - export const ChecklistItemFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); - export type ChecklistItemFilterDto = z.infer; - - /** - * UpdateChecklistItemRequestDTOSchema - * @type { object } - * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` - */ - export const UpdateChecklistItemRequestDTOSchema = z - .object({ name: z.string().min(3).max(256).describe("Checklist item name") }) - .readonly(); - export type UpdateChecklistItemRequestDTO = z.infer; - - /** - * ChecklistItemsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const ChecklistItemsPaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ChecklistItemsPaginateOrderParamEnum = z.infer; - export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderParamEnumSchema.enum; - - /** - * ChecklistItemsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChecklistItemResponseDTO[] } items - */ - export const ChecklistItemsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChecklistItemsPaginateResponse = z.infer; - - /** - * ChecklistItemsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const ChecklistItemsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ChecklistItemsPaginateLabelsOrderParamEnum = z.infer< - typeof ChecklistItemsPaginateLabelsOrderParamEnumSchema - >; - export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginateLabelsOrderParamEnumSchema.enum; - - /** - * ChecklistItemsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChecklistItemsPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/checklistItems/checklistItems.queries.ts b/test/generated/dist/checklistItems/checklistItems.queries.ts deleted file mode 100644 index 2b1dfcc..0000000 --- a/test/generated/dist/checklistItems/checklistItems.queries.ts +++ /dev/null @@ -1,416 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChecklistItemsAcl } from "./checklistItems.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChecklistItemsModels } from "./checklistItems.models"; -import { ChecklistItemsApi } from "./checklistItems.api"; - -export namespace ChecklistItemsQueries { - export const moduleName = QueryModule.ChecklistItems; - - export const keys = { - all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/checklist-items", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemFilterDto, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/checklist-items", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/checklist-items/labels/paginate", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/checklist-items/labels/paginate", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/checklist-items/:id", id, officeId] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create checklist item - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ChecklistItemsModels.CreateChecklistItemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof ChecklistItemsApi.create, - { officeId: string; data: ChecklistItemsModels.CreateChecklistItemRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ChecklistItemsAcl.canUseCreate({ officeId })); - return ChecklistItemsApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Get paginated checklist items - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistItemsModels.ChecklistItemFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId })); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Get paginated checklist items - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistItemsModels.ChecklistItemFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId })); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate checklist item labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId })); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate checklist item labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId })); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get checklist item by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUseFindById({ officeId })); - return ChecklistItemsApi.findById(id, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update checklist item - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ChecklistItemsModels.UpdateChecklistItemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ChecklistItemsApi.update, - { id: string; officeId: string; data: ChecklistItemsModels.UpdateChecklistItemRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId })); - return ChecklistItemsApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive checklist item - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistItemsAcl.canUseArchive({ officeId })); - return ChecklistItemsApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive checklist item - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId })); - return ChecklistItemsApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/checklistTemplates/checklistTemplates.acl.ts b/test/generated/dist/checklistTemplates/checklistTemplates.acl.ts deleted file mode 100644 index 7f4682b..0000000 --- a/test/generated/dist/checklistTemplates/checklistTemplates.acl.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ChecklistTemplatesAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create checklist template in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Create", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; - - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List checklist templates for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Read", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; - - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Get checklist template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Read", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; - - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get checklist template by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Read", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Update", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Archive", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ChecklistTemplate", object) : "ChecklistTemplate"] as AbilityTuple< - "Archive", - "ChecklistTemplate" | (ForcedSubject<"ChecklistTemplate"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/checklistTemplates/checklistTemplates.api.ts b/test/generated/dist/checklistTemplates/checklistTemplates.api.ts deleted file mode 100644 index cc79cfc..0000000 --- a/test/generated/dist/checklistTemplates/checklistTemplates.api.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; - -export namespace ChecklistTemplatesApi { - export const create = ( - officeId: string, - data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates`, - ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), - config, - ); - }; - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, - `/offices/${officeId}/checklist-templates`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/checklist-templates/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates/${id}`, - config, - ); - }; - export const update = ( - id: string, - officeId: string, - data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.put( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates/${id}`, - ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-templates/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-templates/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/checklistTemplates/checklistTemplates.configs.ts b/test/generated/dist/checklistTemplates/checklistTemplates.configs.ts deleted file mode 100644 index 0c9d106..0000000 --- a/test/generated/dist/checklistTemplates/checklistTemplates.configs.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChecklistTemplatesQueries } from "./checklistTemplates.queries"; -import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; - -export namespace ChecklistTemplatesConfigs { - export const checklistTemplatesConfig = { - meta: { - title: "Checklist Templates", - }, - readAll: { - acl: ChecklistTemplatesAcl.canUsePaginate, - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - paginated: ChecklistTemplatesQueries.usePaginate, - infinite: ChecklistTemplatesQueries.usePaginateInfinite, - filters: { - schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - items: true, - }, - sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: ChecklistTemplatesAcl.canUseFindById, - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - query: ChecklistTemplatesQueries.useFindById, - }, - create: { - acl: ChecklistTemplatesAcl.canUseCreate, - schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, - mutation: ChecklistTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), - }, - update: { - acl: ChecklistTemplatesAcl.canUseUpdate, - schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, - mutation: ChecklistTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - items: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ChecklistTemplatesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChecklistTemplatesQueries.usePaginateLabels, - infinite: ChecklistTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/checklistTemplates/checklistTemplates.models.ts b/test/generated/dist/checklistTemplates/checklistTemplates.models.ts deleted file mode 100644 index e8309ff..0000000 --- a/test/generated/dist/checklistTemplates/checklistTemplates.models.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChecklistTemplatesModels { - /** - * ChecklistTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ChecklistTemplateEmployeeDTO = z.infer; - - /** - * ChecklistTemplateItemResponseDTOSchema - * @type { object } - * @property { string } checklistItemId Checklist item id - * @property { number } order Order index - * @property { string } name Checklist item name - */ - export const ChecklistTemplateItemResponseDTOSchema = z - .object({ - checklistItemId: z.string().describe("Checklist item id"), - order: z.number().describe("Order index"), - name: z.string().describe("Checklist item name").nullish(), - }) - .readonly(); - export type ChecklistTemplateItemResponseDTO = z.infer; - - /** - * ChecklistTemplateResponseDTOSchema - * @type { object } - * @property { string } id Template id - * @property { string } name Template name - * @property { string } officeId Office id - * @property { boolean } archived Is archived - * @property { string } archivedAt Archived at - * @property { string } createdById ID of the employee who created this template - * @property { ChecklistTemplateEmployeeDTO } createdBy Employee who created this template - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this template - * @property { ChecklistTemplateEmployeeDTO } updatedBy Employee who last updated this template - * @property { string } updatedAt Updated at - * @property { ChecklistTemplateItemResponseDTO[] } items Ordered items - */ - export const ChecklistTemplateResponseDTOSchema = z - .object({ - id: z.string().describe("Template id"), - name: z.string().describe("Template name"), - officeId: z.string().describe("Office id"), - archived: z.boolean().describe("Is archived"), - archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), - createdById: z.string().describe("ID of the employee who created this template").nullish(), - createdBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), - updatedBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - items: z.array(ChecklistTemplateItemResponseDTOSchema).readonly().describe("Ordered items"), - }) - .readonly(); - export type ChecklistTemplateResponseDTO = z.infer; - - /** - * CreateChecklistTemplateRequestDTOSchema - * @type { object } - * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` - */ - export const CreateChecklistTemplateRequestDTOSchema = z - .object({ name: z.string().min(3).max(120).describe("Checklist template name") }) - .readonly(); - export type CreateChecklistTemplateRequestDTO = z.infer; - - /** - * ChecklistTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const ChecklistTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type ChecklistTemplateLabelFilterDto = z.infer; - - /** - * ChecklistTemplateFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ - export const ChecklistTemplateFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); - export type ChecklistTemplateFilterDto = z.infer; - - /** - * UpdateChecklistTemplateRequestDTOSchema - * @type { object } - * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` - * @property { string[] } items Ordered checklist item ids - */ - export const UpdateChecklistTemplateRequestDTOSchema = z - .object({ - name: z.string().min(3).max(120).describe("Checklist template name"), - items: z.array(z.uuid()).readonly().describe("Ordered checklist item ids"), - }) - .readonly(); - export type UpdateChecklistTemplateRequestDTO = z.infer; - - /** - * ChecklistTemplatesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const ChecklistTemplatesPaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ChecklistTemplatesPaginateOrderParamEnum = z.infer; - export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPaginateOrderParamEnumSchema.enum; - - /** - * ChecklistTemplatesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChecklistTemplateResponseDTO[] } items - */ - export const ChecklistTemplatesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChecklistTemplatesPaginateResponse = z.infer; - - /** - * ChecklistTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const ChecklistTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ChecklistTemplatesPaginateLabelsOrderParamEnum = z.infer< - typeof ChecklistTemplatesPaginateLabelsOrderParamEnumSchema - >; - export const ChecklistTemplatesPaginateLabelsOrderParamEnum = - ChecklistTemplatesPaginateLabelsOrderParamEnumSchema.enum; - - /** - * ChecklistTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ChecklistTemplatesPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/checklistTemplates/checklistTemplates.queries.ts b/test/generated/dist/checklistTemplates/checklistTemplates.queries.ts deleted file mode 100644 index 9baea8c..0000000 --- a/test/generated/dist/checklistTemplates/checklistTemplates.queries.ts +++ /dev/null @@ -1,425 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; -import { ChecklistTemplatesApi } from "./checklistTemplates.api"; - -export namespace ChecklistTemplatesQueries { - export const moduleName = QueryModule.ChecklistTemplates; - - export const keys = { - all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/checklist-templates", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/checklist-templates", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/checklist-templates/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/checklist-templates/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/checklist-templates/:id", id, officeId] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create checklist template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof ChecklistTemplatesApi.create, - { officeId: string; data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId })); - return ChecklistTemplatesApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Get paginated checklist templates - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId })); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Get paginated checklist templates - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId })); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate checklist template labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId })); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate checklist template labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId })); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get checklist template by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId })); - return ChecklistTemplatesApi.findById(id, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Replace checklist template - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ChecklistTemplatesApi.update, - { id: string; officeId: string; data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId })); - return ChecklistTemplatesApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive checklist template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId })); - return ChecklistTemplatesApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive checklist template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId })); - return ChecklistTemplatesApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/cities/cities.acl.ts b/test/generated/dist/cities/cities.acl.ts deleted file mode 100644 index 1511597..0000000 --- a/test/generated/dist/cities/cities.acl.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CitiesAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "City"] as AbilityTuple<"Read", "City">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "City"] as AbilityTuple<"Create", "City">; - - /** - * Use for `useListCityLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCityLabels` query - */ - export const canUseListCityLabels = () => ["Read", "City"] as AbilityTuple<"Read", "City">; - - /** - * Use for `useGetCityLabelById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCityLabelById` query - */ - export const canUseGetCityLabelById = () => ["Read", "City"] as AbilityTuple<"Read", "City">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "City"] as AbilityTuple<"Read", "City">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "City"] as AbilityTuple<"Update", "City">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "City"] as AbilityTuple<"Archive", "City">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "City"] as AbilityTuple<"Archive", "City">; -} diff --git a/test/generated/dist/cities/cities.api.ts b/test/generated/dist/cities/cities.api.ts deleted file mode 100644 index 63d76eb..0000000 --- a/test/generated/dist/cities/cities.api.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CitiesModels } from "./cities.models"; - -export namespace CitiesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: CitiesModels.CityPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CitiesModels.CitiesPaginateResponseSchema }, `/cities`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: CitiesModels.CreateCityRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities`, - ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), - config, - ); - }; - export const listCityLabels = ( - limit: number, - order?: string, - filter?: CitiesModels.CityLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CitiesModels.ListCityLabelsResponseSchema }, `/cities/paginate/labels`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const getCityLabelById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: CitiesModels.CityLabelResponseDTOSchema }, `/cities/${id}/labels`, config); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: CitiesModels.CityResponseDTOSchema }, `/cities/${id}`, config); - }; - export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities/${id}`, - ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/cities/${id}/archive`, undefined, config); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/cities/${id}/unarchive`, undefined, config); - }; -} diff --git a/test/generated/dist/cities/cities.configs.ts b/test/generated/dist/cities/cities.configs.ts deleted file mode 100644 index 5498521..0000000 --- a/test/generated/dist/cities/cities.configs.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CitiesModels } from "./cities.models"; -import { CitiesQueries } from "./cities.queries"; -import { CitiesAcl } from "./cities.acl"; - -export namespace CitiesConfigs { - export const citiesConfig = { - meta: { - title: "Cities", - }, - readAll: { - acl: CitiesAcl.canUsePaginate, - schema: CitiesModels.CityResponseDTOSchema, - paginated: CitiesQueries.usePaginate, - infinite: CitiesQueries.usePaginateInfinite, - filters: { - schema: CitiesModels.CityPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CitiesModels.CityPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CitiesModels.CityResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - isoCode: true, - stateCode: true, - archived: true, - countryId: true, - country: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CitiesModels.CitiesPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: CitiesAcl.canUseFindById, - schema: CitiesModels.CityResponseDTOSchema, - query: CitiesQueries.useFindById, - }, - create: { - acl: CitiesAcl.canUseCreate, - schema: CitiesModels.CreateCityRequestDTOSchema, - mutation: CitiesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CitiesModels.CreateCityRequestDTOSchema, - options: { - inputs: { - name: true, - isoCode: true, - stateCode: true, - countryId: true, - }, - }, - }), - }, - update: { - acl: CitiesAcl.canUseUpdate, - schema: CitiesModels.UpdateCityRequestDTOSchema, - mutation: CitiesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CitiesModels.UpdateCityRequestDTOSchema, - options: { - inputs: { - name: true, - isoCode: true, - stateCode: true, - countryId: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: CitiesAcl.canUseListCityLabels, - schema: CitiesModels.CityLabelResponseDTOSchema, - paginated: CitiesQueries.useListCityLabels, - infinite: CitiesQueries.useListCityLabelsInfinite, - filters: { - schema: CitiesModels.CityLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CitiesModels.CityLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CitiesModels.CityLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - country: true, - }, - sortable: CitiesModels.ListCityLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/cities/cities.models.ts b/test/generated/dist/cities/cities.models.ts deleted file mode 100644 index 6fc2ac8..0000000 --- a/test/generated/dist/cities/cities.models.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CitiesModels { - /** - * CityCountryDtoSchema - * @type { object } - * @property { string } id Unique identifier of the country - * @property { string } name Name of the country - * @property { string } isoCode2 2 character iso code of the country - * @property { string } isoCode3 3 character iso code of the country - */ - export const CityCountryDtoSchema = z - .object({ - id: z.string().describe("Unique identifier of the country"), - name: z.string().describe("Name of the country"), - isoCode2: z.string().describe("2 character iso code of the country"), - isoCode3: z.string().describe("3 character iso code of the country"), - }) - .readonly(); - export type CityCountryDto = z.infer; - - /** - * CityEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CityEmployeeDTO = z.infer; - - /** - * CityResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the city - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { boolean } archived Whether the city is archived - * @property { string } countryId Country ID - * @property { CityCountryDto } country - * @property { string } createdById - * @property { CityEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CityEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const CityResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the city"), - name: z.string().describe("Name of the city"), - isoCode: z.string().describe("ISO code of the city").nullish(), - stateCode: z.string().describe("State code of the city").nullish(), - archived: z.boolean().describe("Whether the city is archived").nullish(), - countryId: z.string().describe("Country ID").nullish(), - country: CityCountryDtoSchema.nullish(), - createdById: z.string().nullish(), - createdBy: CityEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: CityEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type CityResponseDTO = z.infer; - - /** - * CityLabelCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CityLabelCountryDto = z.infer; - - /** - * CityLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { CityLabelCountryDto } country - */ - export const CityLabelResponseDTOSchema = z - .object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }) - .readonly(); - export type CityLabelResponseDTO = z.infer; - - /** - * CityPaginationFilterDtoSchema - * @type { object } - * @property { string } search Free search - * @property { boolean } archived - */ - export const CityPaginationFilterDtoSchema = z - .object({ search: z.string().describe("Free search"), archived: z.boolean() }) - .readonly(); - export type CityPaginationFilterDto = z.infer; - - /** - * CityLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const CityLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type CityLabelFilterDto = z.infer; - - /** - * CreateCityRequestDTOSchema - * @type { object } - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { string } countryId Country ID - */ - export const CreateCityRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the city"), - isoCode: z.string().describe("ISO code of the city").nullish(), - stateCode: z.string().describe("State code of the city").nullish(), - countryId: z.string().describe("Country ID"), - }) - .readonly(); - export type CreateCityRequestDTO = z.infer; - - /** - * UpdateCityRequestDTOSchema - * @type { object } - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { string } countryId Country ID - */ - export const UpdateCityRequestDTOSchema = z - .object({ - name: z.string().describe("Name of the city"), - isoCode: z.string().describe("ISO code of the city"), - stateCode: z.string().describe("State code of the city"), - countryId: z.string().describe("Country ID"), - }) - .readonly(); - export type UpdateCityRequestDTO = z.infer; - - /** - * CitiesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const CitiesPaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type CitiesPaginateOrderParamEnum = z.infer; - export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.enum; - - /** - * CitiesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CityResponseDTO[] } items - */ - export const CitiesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CityResponseDTOSchema).readonly() }).readonly().shape, - }); - export type CitiesPaginateResponse = z.infer; - - /** - * ListCityLabelsOrderParamEnumSchema - * @type { enum } - */ - export const ListCityLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ListCityLabelsOrderParamEnum = z.infer; - export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.enum; - - /** - * ListCityLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CityLabelResponseDTO[] } items - */ - export const ListCityLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CityLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ListCityLabelsResponse = z.infer; -} diff --git a/test/generated/dist/cities/cities.queries.ts b/test/generated/dist/cities/cities.queries.ts deleted file mode 100644 index 1ea1e83..0000000 --- a/test/generated/dist/cities/cities.queries.ts +++ /dev/null @@ -1,370 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CitiesAcl } from "./cities.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CitiesModels } from "./cities.models"; -import { CitiesApi } from "./cities.api"; - -export namespace CitiesQueries { - export const moduleName = QueryModule.Cities; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: CitiesModels.CityPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/cities", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: CitiesModels.CityPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/cities", "infinite", limit, order, filter, cursor] as const, - listCityLabels: ( - limit?: number, - order?: string, - filter?: CitiesModels.CityLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/cities/paginate/labels", limit, order, filter, page, cursor] as const, - listCityLabelsInfinite: ( - limit?: number, - order?: string, - filter?: CitiesModels.CityLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/cities/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getCityLabelById: (id: string) => [...keys.all, "/cities/:id/labels", id] as const, - findById: (id: string) => [...keys.all, "/cities/:id", id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Cities - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: CitiesModels.CityPaginationFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Cities - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CitiesModels.CityPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create city - * @permission Requires `canUseCreate` ability - * @param { CitiesModels.CreateCityRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CitiesAcl.canUseCreate()); - return CitiesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useListCityLabels` - * @summary Paginate cities with only their labels (id and name) and country information - * @permission Requires `canUseListCityLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListCityLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: CitiesModels.CityLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCityLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListCityLabelsInfinite - * @summary Paginate cities with only their labels (id and name) and country information - * @permission Requires `canUseListCityLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListCityLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CitiesModels.CityLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useGetCityLabelById` - * @summary Get city by ID with label format (id and formatted name) and country information - * @permission Requires `canUseGetCityLabelById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCityLabelById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCityLabelById(id), - queryFn: () => { - checkAcl(CitiesAcl.canUseGetCityLabelById()); - return CitiesApi.getCityLabelById(id, config); - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get city by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(CitiesAcl.canUseFindById()); - return CitiesApi.findById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update city - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { CitiesModels.UpdateCityRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(CitiesAcl.canUseUpdate()); - return CitiesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive city - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CitiesAcl.canUseArchive()); - return CitiesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive city - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CitiesAcl.canUseUnarchive()); - return CitiesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/common/common.models.ts b/test/generated/dist/common/common.models.ts deleted file mode 100644 index 42415c1..0000000 --- a/test/generated/dist/common/common.models.ts +++ /dev/null @@ -1,1860 +0,0 @@ -import { z } from "zod"; - -export namespace CommonModels { -/** - * PositionCargoPackageEnumSchema - * @type { enum } - */ -export const PositionCargoPackageEnumSchema = z.enum(["Hazardous", "NonStackable", "TemperatureControlled", "OversizedCargo", "DiplomaticCargo"]); -export type PositionCargoPackageEnum = z.infer; -export const PositionCargoPackageEnum = PositionCargoPackageEnumSchema.enum; - -/** - * HazardousSpecialtyEnumSchema - * @type { enum } - */ -export const HazardousSpecialtyEnumSchema = z.enum(["Explosives", "FlammableGas", "NonToxicAndFlammableGas", "PoisonGases", "FlammableLiquid", "FlammableSolid", "SpontaneouslyCombustible", "DangerousWhenWet", "Oxidizers", "OrganicPeroxides", "Poison", "InfectiousSubstances", "Radioactive", "Corrosive", "MiscellaneousDangerousSubstances"]); -export type HazardousSpecialtyEnum = z.infer; -export const HazardousSpecialtyEnum = HazardousSpecialtyEnumSchema.enum; - -/** - * RateOptionsEnumSchema - * @type { enum } - */ -export const RateOptionsEnumSchema = z.enum(["AsAgreed", "SpotRate"]); -export type RateOptionsEnum = z.infer; -export const RateOptionsEnum = RateOptionsEnumSchema.enum; - -/** - * RateClassEnumSchema - * @type { enum } - */ -export const RateClassEnumSchema = z.enum(["MinimumCharge", "NormalRate", "QuantityRate"]); -export type RateClassEnum = z.infer; -export const RateClassEnum = RateClassEnumSchema.enum; - -/** - * AccountInformationEnumSchema - * @type { enum } - * @description Account information - */ -export const AccountInformationEnumSchema = z.enum(["FreightCollect", "FreightPrepaid"]); -export type AccountInformationEnum = z.infer; -export const AccountInformationEnum = AccountInformationEnumSchema.enum; - -/** - * LanguageEnumSchema - * @type { enum } - */ -export const LanguageEnumSchema = z.enum(["English", "German", "Hungarian", "Czech", "Turkish", "Slovenian"]); -export type LanguageEnum = z.infer; -export const LanguageEnum = LanguageEnumSchema.enum; - -/** - * LocaleEnumSchema - * @type { enum } - */ -export const LocaleEnumSchema = z.enum(["en-US", "de-DE", "cs-CZ", "sl-SI", "tr-TR", "hu-HU"]); -export type LocaleEnum = z.infer; -export const LocaleEnum = LocaleEnumSchema.enum; - -/** - * OfficePaymentTermsDateTypeSchema - * @type { enum } - */ -export const OfficePaymentTermsDateTypeSchema = z.enum(["InvoiceDate", "ServiceDate"]); -export type OfficePaymentTermsDateType = z.infer; -export const OfficePaymentTermsDateType = OfficePaymentTermsDateTypeSchema.enum; - -/** - * FolderEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type FolderEmployeeDTO = z.infer; - -/** - * FileResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } archived - * @property { boolean } isSystem - * @property { string } createdAt - * @property { string } updatedAt - * @property { FolderEmployeeDTO } createdBy - * @property { FolderEmployeeDTO } updatedBy - * @property { string } downloadUrl - */ -export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }).readonly(); -export type FileResponseDTO = z.infer; - -/** - * EditorContentUpdateDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const EditorContentUpdateDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); -export type EditorContentUpdateDto = z.infer; - -/** - * RemarkBlockDTOSchema - * @type { object } - * @property { string } id - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { EditorContentUpdateDto } content - */ -export const RemarkBlockDTOSchema = z.object({ id: z.string(), enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), content: CommonModels.EditorContentUpdateDtoSchema }).readonly(); -export type RemarkBlockDTO = z.infer; - -/** - * TitleBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { string } defaultTitle - * @property { boolean } includePositionNumber - * @property { boolean } allowManualOverride - */ -export const TitleBlockDTOSchema = z.object({ enabled: z.boolean(), defaultTitle: z.string(), includePositionNumber: z.boolean(), allowManualOverride: z.boolean() }).readonly(); -export type TitleBlockDTO = z.infer; - -/** - * PositionInvolvedPartyTypeEnumSchema - * @type { enum } - */ -export const PositionInvolvedPartyTypeEnumSchema = z.enum(["Customer", "Notify", "AlsoNotify", "FOBForwarder", "RoutingAgent", "DeliveryAgent", "TransportProvider", "OceanCarrier", "OriginServiceProvider", "DestinationServiceProvider", "InsuranceProvider", "OriginCustomsAgent", "DestinationCustomsAgent", "StuffingProvider", "StrippingProvider", "Shipper", "Consignee", "CustomsBroker", "Courier", "Trucker", "Airline", "DestinationAgent", "OriginAgent"]); -export type PositionInvolvedPartyTypeEnum = z.infer; -export const PositionInvolvedPartyTypeEnum = PositionInvolvedPartyTypeEnumSchema.enum; - -/** - * ReceiverBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { string } defaultRole - */ -export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema }).readonly(); -export type ReceiverBlockDTO = z.infer; - -/** - * OurInformationBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } showName - * @property { boolean } showPhone - * @property { boolean } showDate - * @property { boolean } showBookingNumber - * @property { boolean } showCustomerReference - * @property { boolean } showMasterBillOfLadingNumber - * @property { boolean } showHouseBillOfLadingNumber - */ -export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean(), showName: z.boolean(), showPhone: z.boolean(), showDate: z.boolean(), showBookingNumber: z.boolean(), showCustomerReference: z.boolean(), showMasterBillOfLadingNumber: z.boolean(), showHouseBillOfLadingNumber: z.boolean() }).readonly(); -export type OurInformationBlockDTO = z.infer; - -/** - * RouteTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } showDate - * @property { boolean } showLocation - * @property { boolean } showType - * @property { boolean } showReference - * @property { boolean } showVesselVoyage - * @property { boolean } showAddress - * @property { boolean } showProvider - */ -export const RouteTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showDate: z.boolean(), showLocation: z.boolean(), showType: z.boolean(), showReference: z.boolean(), showVesselVoyage: z.boolean(), showAddress: z.boolean(), showProvider: z.boolean() }).readonly(); -export type RouteTableBlockDTO = z.infer; - -/** - * CargoTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - */ -export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); -export type CargoTableBlockDTO = z.infer; - -/** - * CargoSummaryBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - */ -export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); -export type CargoSummaryBlockDTO = z.infer; - -/** - * FinanceTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } showOnlyForReceiver - * @property { boolean } showVendor - * @property { boolean } showBuyRate - * @property { boolean } showCustomer - * @property { boolean } showSellRate - * @property { boolean } showGrid - * @property { boolean } showCharges - * @property { boolean } showAdditionalText - * @property { boolean } showQuantity - * @property { boolean } showProfit - * @property { boolean } showTotalsByCurrency - * @property { boolean } includeSubPositions - * @property { boolean } subPositionTotals - * @property { boolean } showBuyRateExchangeRates - * @property { boolean } showSellRateExchangeRates - * @property { boolean } showTotal - */ -export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showOnlyForReceiver: z.boolean(), showVendor: z.boolean(), showBuyRate: z.boolean(), showCustomer: z.boolean(), showSellRate: z.boolean(), showGrid: z.boolean(), showCharges: z.boolean(), showAdditionalText: z.boolean(), showQuantity: z.boolean(), showProfit: z.boolean(), showTotalsByCurrency: z.boolean(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean(), showSellRateExchangeRates: z.boolean(), showTotal: z.boolean() }).readonly(); -export type FinanceTableBlockDTO = z.infer; - -/** - * FooterBlockDTOSchema - * @type { object } - * @property { boolean } enabled - */ -export const FooterBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); -export type FooterBlockDTO = z.infer; - -/** - * TermsBlockDTOSchema - * @type { object } - * @property { boolean } enabled - */ -export const TermsBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); -export type TermsBlockDTO = z.infer; - -/** - * CutOffDatesBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } billOfLadingFromCustomer - * @property { boolean } billOfLadingToCarrier - * @property { boolean } customsAMS - * @property { boolean } vgmCustomer - */ -export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), billOfLadingFromCustomer: z.boolean(), billOfLadingToCarrier: z.boolean(), customsAMS: z.boolean(), vgmCustomer: z.boolean() }).readonly(); -export type CutOffDatesBlockDTO = z.infer; - -/** - * TemplateBlocksResponseDTOSchema - * @type { object } - * @property { TitleBlockDTO } titleBlock - * @property { ReceiverBlockDTO } receiverBlock - * @property { OurInformationBlockDTO } ourInformationBlock - * @property { RouteTableBlockDTO } routeTableBlock - * @property { CargoTableBlockDTO } cargoTableBlock - * @property { CargoSummaryBlockDTO } cargoSummaryBlock - * @property { FinanceTableBlockDTO } financeTableBlock - * @property { RemarkBlockDTO[] } remarkBlocks - * @property { FooterBlockDTO } footerBlock - * @property { TermsBlockDTO } termsBlock - * @property { CutOffDatesBlockDTO } cutOffDatesBlock - */ -export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); -export type TemplateBlocksResponseDTO = z.infer; - -/** - * RouteTableProviderDtoSchema - * @type { object } - * @property { string } id Provider ID - * @property { string } name Provider name - */ -export const RouteTableProviderDtoSchema = z.object({ id: z.string().describe("Provider ID"), name: z.string().describe("Provider name") }).readonly(); -export type RouteTableProviderDto = z.infer; - -/** - * RouteTablePointDtoSchema - * @type { object } - * @property { string } id Route point ID - * @property { string } type Route point type - * @property { string } datetime Route point datetime - * @property { string } secondaryDatetime Route point secondary datetime - * @property { string } address Route point address - * @property { string } name Route point address name - * @property { string } reference Route point reference - * @property { RouteTableProviderDto } provider Route point provider - * @property { string } vessel Vessel information - * @property { string } voyage Voyage information - * @property { string } carrier Carrier name - */ -export const RouteTablePointDtoSchema = z.object({ id: z.string().describe("Route point ID"), type: z.string().describe("Route point type"), datetime: z.string().describe("Route point datetime").nullish(), secondaryDatetime: z.string().describe("Route point secondary datetime").nullish(), address: z.string().describe("Route point address").nullish(), name: z.string().describe("Route point address name").nullish(), reference: z.string().describe("Route point reference").nullish(), provider: CommonModels.RouteTableProviderDtoSchema.describe("Route point provider").nullish(), vessel: z.string().describe("Vessel information").nullish(), voyage: z.string().describe("Voyage information").nullish(), carrier: z.string().describe("Carrier name").nullish() }).readonly(); -export type RouteTablePointDto = z.infer; - -/** - * RouteTableBlockResponseDtoSchema - * @type { object } - * @property { string } selectedRouteId Selected route ID - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { boolean } showReference Show reference column - * @property { boolean } showVesselVoyage Show vessel/voyage column - * @property { boolean } showProvider Show provider column - * @property { RouteTablePointDto[] } points Route points - * @property { boolean } showAddress Show address - * @property { boolean } showDates Show dates - * @property { boolean } showType Show type - * @property { boolean } showLocation Show location - * @property { boolean } showGrid Show grid - * @property { boolean } suppressRoute Suppress route - */ -export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID").nullish(), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish(), showAddress: z.boolean().describe("Show address").nullish(), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); -export type RouteTableBlockResponseDto = z.infer; - -/** - * CargoSpecialtyDtoSchema - * @type { object } - * @property { string } name - * @property { string } unNumber UN number for hazardous specialty - * @property { string } IMOClass IMO class for hazardous specialty - * @property { number } temperatureFrom Temperature from (°C) for temperature-controlled specialty - * @property { number } temperatureUntil Temperature until (°C) for temperature-controlled specialty - */ -export const CargoSpecialtyDtoSchema = z.object({ name: CommonModels.PositionCargoPackageEnumSchema, unNumber: z.string().describe("UN number for hazardous specialty").nullish(), IMOClass: z.string().describe("IMO class for hazardous specialty").nullish(), temperatureFrom: z.number().describe("Temperature from (°C) for temperature-controlled specialty").nullish(), temperatureUntil: z.number().describe("Temperature until (°C) for temperature-controlled specialty").nullish() }).readonly(); -export type CargoSpecialtyDto = z.infer; - -/** - * CargoPackageDtoSchema - * @type { object } - * @property { string } id Package ID - * @property { string } description Package description - * @property { string } weight Weight - * @property { string } hsCodes HS codes (numeric only) - * @property { number } quantity Quantity - * @property { number } width Width (cm) - * @property { number } length Length (cm) - * @property { number } height Height (cm) - * @property { number } volume Total volume in m3 for this package group - * @property { string } packageType Package type name - * @property { string } caseMarks Case marks - * @property { CargoSpecialtyDto[] } specialties Package specialties - * @property { number } chargeableWeight Chargeable weight in kg - * @property { number } volumetricWeight Volumetric weight in kg - */ -export const CargoPackageDtoSchema = z.object({ id: z.string().describe("Package ID"), description: z.string().describe("Package description").nullish(), weight: z.string().describe("Weight").nullish(), hsCodes: z.string().describe("HS codes (numeric only)").nullish(), quantity: z.number().describe("Quantity").nullish(), width: z.number().describe("Width (cm)").nullish(), length: z.number().describe("Length (cm)").nullish(), height: z.number().describe("Height (cm)").nullish(), volume: z.number().describe("Total volume in m3 for this package group").nullish(), packageType: z.string().describe("Package type name").nullish(), caseMarks: z.string().describe("Case marks").nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).readonly().describe("Package specialties").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg").nullish() }).readonly(); -export type CargoPackageDto = z.infer; - -/** - * CargoItemRouteDtoSchema - * @type { object } - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { RouteTablePointDto[] } points Route points - */ -export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish() }).readonly(); -export type CargoItemRouteDto = z.infer; - -/** - * CargoItemDtoSchema - * @type { object } - * @property { string } cargoId Cargo ID - * @property { string } cargoType Cargo type - * @property { string } containerNumber Container number - * @property { string } seal1 First seal (sea cargo only) - * @property { string } seal2 Second seal (sea cargo only) - * @property { string } vgm Verified gross mass (VGM) for container, sea cargo only - * @property { number } totalGrossWeight Total gross weight from cargo details - * @property { number } totalVolume Total volume (m3) calculated from cargo packages - * @property { number } chargeableWeight Chargeable weight in kg for transport unit - * @property { number } volumetricWeight Volumetric weight in kg for transport unit - * @property { CargoPackageDto[] } packages Cargo packages - * @property { string[] } selectedPackageIds Selected cargo package IDs - * @property { CargoItemRouteDto } route Cargo route (when routes are split) - */ -export const CargoItemDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID"), cargoType: z.string().describe("Cargo type"), containerNumber: z.string().describe("Container number").nullish(), seal1: z.string().describe("First seal (sea cargo only)").nullish(), seal2: z.string().describe("Second seal (sea cargo only)").nullish(), vgm: z.string().describe("Verified gross mass (VGM) for container, sea cargo only").nullish(), totalGrossWeight: z.number().describe("Total gross weight from cargo details").nullish(), totalVolume: z.number().describe("Total volume (m3) calculated from cargo packages").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg for transport unit").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg for transport unit").nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema).readonly().describe("Cargo packages"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteDtoSchema.describe("Cargo route (when routes are split)").nullish() }).readonly(); -export type CargoItemDto = z.infer; - -/** - * CargoTableBlockDtoSchema - * @type { object } - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { boolean } suppressWeight Suppress weight column display - * @property { boolean } showGrid Show grid borders in cargo table - * @property { boolean } suppressVolume Suppress volume column display - * @property { boolean } suppressSpecialities Suppress specialities column display - * @property { boolean } suppressDimensions Suppress dimensions column display - * @property { boolean } suppressPackageVolume Suppress package volume column display - * @property { boolean } suppressPackageWeight Suppress package weight column display - * @property { boolean } showGrandTotal Show grand total - * @property { boolean } showTransportUnitTotal Show transport unit total - * @property { boolean } showRoute Show route information (only applicable when routes are split) - * @property { boolean } suppressCargo Suppress cargo table display - * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units - * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units - * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages - * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages - * @property { boolean } showPackageHSCodes Show HS codes for packages - * @property { boolean } showPackageType Show package type for packages - * @property { boolean } showPackageQuantity Show quantity for packages - * @property { boolean } showPackageDescription Show description for packages - * @property { boolean } showPackageCaseMarks Show case marks for packages - * @property { boolean } showTransportUnitNumber Show transport unit number - * @property { boolean } showTransportUnitType Show transport unit type - * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 - * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 - * @property { CargoItemDto[] } items Cargo items - */ -export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs").nullish(), suppressWeight: z.boolean().describe("Suppress weight column display").nullish(), showGrid: z.boolean().describe("Show grid borders in cargo table").nullish(), suppressVolume: z.boolean().describe("Suppress volume column display").nullish(), suppressSpecialities: z.boolean().describe("Suppress specialities column display").nullish(), suppressDimensions: z.boolean().describe("Suppress dimensions column display").nullish(), suppressPackageVolume: z.boolean().describe("Suppress package volume column display").nullish(), suppressPackageWeight: z.boolean().describe("Suppress package weight column display").nullish(), showGrandTotal: z.boolean().describe("Show grand total").nullish(), showTransportUnitTotal: z.boolean().describe("Show transport unit total").nullish(), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullish(), suppressCargo: z.boolean().describe("Suppress cargo table display").nullish(), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units").nullish(), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units").nullish(), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages").nullish(), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages").nullish(), showPackageHSCodes: z.boolean().describe("Show HS codes for packages").nullish(), showPackageType: z.boolean().describe("Show package type for packages").nullish(), showPackageQuantity: z.boolean().describe("Show quantity for packages").nullish(), showPackageDescription: z.boolean().describe("Show description for packages").nullish(), showPackageCaseMarks: z.boolean().describe("Show case marks for packages").nullish(), showTransportUnitNumber: z.boolean().describe("Show transport unit number").nullish(), showTransportUnitType: z.boolean().describe("Show transport unit type").nullish(), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1").nullish(), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2").nullish(), items: z.array(CommonModels.CargoItemDtoSchema).readonly().describe("Cargo items") }).readonly(); -export type CargoTableBlockDto = z.infer; - -/** - * SummaryCargoItemDtoSchema - * @type { object } - * @property { string } transportUnitType Cargo type name (transport unit type) - * @property { number } quantity Count of cargos for this type - * @property { string } description Comma-joined transport unit numbers or custom description - */ -export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), quantity: z.number().describe("Count of cargos for this type"), description: z.string().describe("Comma-joined transport unit numbers or custom description") }).readonly(); -export type SummaryCargoItemDto = z.infer; - -/** - * SummaryCargoBlockResponseDtoSchema - * @type { object } - * @property { SummaryCargoItemDto[] } items - */ -export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema).readonly() }).readonly(); -export type SummaryCargoBlockResponseDto = z.infer; - -/** - * PositionAccountItemTypeEnumSchema - * @type { enum } - */ -export const PositionAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); -export type PositionAccountItemTypeEnum = z.infer; -export const PositionAccountItemTypeEnum = PositionAccountItemTypeEnumSchema.enum; - -/** - * FinanceRowDtoSchema - * @type { object } - * @property { string } id Finance row ID - * @property { PositionAccountItemTypeEnum } type Item type - * @property { string } chargeType Charge type - * @property { string } additionalText Additional text - * @property { string } text Text content - * @property { number } buyAmount Buy amount - * @property { string } buyCurrencyNotation Buy currency notation - * @property { number } sellAmount Sell amount - * @property { string } sellCurrencyNotation Sell currency notation - * @property { string } buyBPName Buy business partner name - * @property { string } sellBPName Sell business partner name - * @property { number } sellExchangeRate Sell exchange rate - * @property { number } buyExchangeRate Buy exchange rate - * @property { number } quantity Quantity - */ -export const FinanceRowDtoSchema = z.object({ id: z.string().describe("Finance row ID"), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), chargeType: z.string().describe("Charge type").nullish(), additionalText: z.string().describe("Additional text").nullish(), text: z.string().describe("Text content").nullish(), buyAmount: z.number().describe("Buy amount").nullish(), buyCurrencyNotation: z.string().describe("Buy currency notation").nullish(), sellAmount: z.number().describe("Sell amount").nullish(), sellCurrencyNotation: z.string().describe("Sell currency notation").nullish(), buyBPName: z.string().describe("Buy business partner name").nullish(), sellBPName: z.string().describe("Sell business partner name").nullish(), sellExchangeRate: z.number().describe("Sell exchange rate").nullish(), buyExchangeRate: z.number().describe("Buy exchange rate").nullish(), quantity: z.number().describe("Quantity").nullish() }).readonly(); -export type FinanceRowDto = z.infer; - -/** - * FinanceTotalsDtoSchema - * @type { object } - * @property { number } customerTotal Customer total - * @property { number } vendorTotal Vendor total - * @property { number } combinedTotal Combined total - * @property { string } currencyNotation Currency notation - */ -export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().describe("Customer total"), vendorTotal: z.number().describe("Vendor total"), combinedTotal: z.number().describe("Combined total"), currencyNotation: z.string().describe("Currency notation") }).readonly(); -export type FinanceTotalsDto = z.infer; - -/** - * FinanceTotalsByCurrencyDtoSchema - * @type { object } - * @property { string } currencyNotation Currency notation - * @property { number } vendorTotal Total for vendor side in this currency - * @property { number } customerTotal Total for customer side in this currency - */ -export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string().describe("Currency notation"), vendorTotal: z.number().describe("Total for vendor side in this currency").nullish(), customerTotal: z.number().describe("Total for customer side in this currency").nullish() }).readonly(); -export type FinanceTotalsByCurrencyDto = z.infer; - -/** - * FinanceTablePositionDtoSchema - * @type { object } - * @property { FinanceRowDto[] } rows Finance rows - * @property { FinanceTotalsDto } totals Finance totals - * @property { string[] } selectedFinanceRowIds Selected finance row IDs - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency - */ -export const FinanceTablePositionDtoSchema = z.object({ rows: z.array(CommonModels.FinanceRowDtoSchema).readonly().describe("Finance rows"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); -export type FinanceTablePositionDto = z.infer; - -/** - * FinanceTableBlockDtoSchema - * @type { object } - * @property { string } selectedBpId Selected business partner ID - * @property { boolean } showVendor Show vendor - * @property { boolean } showBuyRate Show buy rate - * @property { boolean } showCustomer Show customer - * @property { boolean } showSellRate Show sell rate - * @property { boolean } showGrid Show grid - * @property { boolean } showCharges Show charges - * @property { boolean } showAdditionalText Show additional text - * @property { boolean } showQuantity Show quantity - * @property { boolean } showTotalsByCurrency Show totals grouped by currency - * @property { boolean } suppressFinances Suppress finances from output - * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero - * @property { boolean } showTotal Show total from output - * @property { boolean } showProfit Show profit from output - * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output - * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output - * @property { boolean } includeSubPositions Include sub-positions - * @property { boolean } subPositionTotals Show sub-position totals - * @property { FinanceTablePositionDto[] } positions Finance positions - * @property { FinanceTotalsDto } totals Finance totals - * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency - */ -export const FinanceTableBlockDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionDtoSchema).readonly().describe("Finance positions"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); -export type FinanceTableBlockDto = z.infer; - -/** - * RemarkBlockDtoSchema - * @type { object } - * @property { string } id - * @property { number } position Minimum: `1` - * @property { EditorContentUpdateDto } content - * @property { boolean } enabled - */ -export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }).readonly(); -export type RemarkBlockDto = z.infer; - -/** - * ConfigBlockDtoSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - * @property { boolean } showWatermarkOnDocuments Show watermark on documents - * @property { LocaleEnum } locale - */ -export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), showWatermarkOnDocuments: z.boolean().describe("Show watermark on documents"), locale: CommonModels.LocaleEnumSchema }).readonly(); -export type ConfigBlockDto = z.infer; - -/** - * TitleBlockUpdateDtoSchema - * @type { object } - * @property { string } value Title value - */ -export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().describe("Title value") }).readonly(); -export type TitleBlockUpdateDto = z.infer; - -/** - * ReceiverBlockUpdateDtoSchema - * @type { object } - * @property { string } selectedBpId Receiver business partner ID - * @property { string } address Receiver address - */ -export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Receiver business partner ID"), address: z.string().describe("Receiver address") }).readonly(); -export type ReceiverBlockUpdateDto = z.infer; - -/** - * OurInformationBlockUpdateDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } phone Phone number - * @property { string } date Date - * @property { string } bookingNumber Booking number - * @property { string } customerReference Customer reference - * @property { string } masterBillOfLadingNumber Master bill of lading number - * @property { string } houseBillOfLadingNumber House bill of lading number - * @property { string } positionNumber Position number - */ -export const OurInformationBlockUpdateDtoSchema = z.object({ name: z.string().describe("Name"), phone: z.string().describe("Phone number"), date: z.string().describe("Date"), bookingNumber: z.string().describe("Booking number"), customerReference: z.string().describe("Customer reference"), masterBillOfLadingNumber: z.string().describe("Master bill of lading number"), houseBillOfLadingNumber: z.string().describe("House bill of lading number"), positionNumber: z.string().describe("Position number") }).readonly(); -export type OurInformationBlockUpdateDto = z.infer; - -/** - * TermsBlockDtoSchema - * @type { object } - * @property { string } termsImageUrl Terms image URL - */ -export const TermsBlockDtoSchema = z.object({ termsImageUrl: z.string().describe("Terms image URL") }).readonly(); -export type TermsBlockDto = z.infer; - -/** - * CutOffDatesBlockUpdateDtoSchema - * @type { object } - * @property { string } billOfLadingFromCustomer Bill of lading from customer date - * @property { string } billOfLadingToCarrier Bill of lading to carrier date - * @property { string } customsAMS Customs AMS date - * @property { string } vgmCustomer VGM customer date - */ -export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().describe("Bill of lading from customer date"), billOfLadingToCarrier: z.string().describe("Bill of lading to carrier date"), customsAMS: z.string().describe("Customs AMS date"), vgmCustomer: z.string().describe("VGM customer date") }).readonly(); -export type CutOffDatesBlockUpdateDto = z.infer; - -/** - * TemplatedDocumentDataDtoSchema - * @type { object } - * @property { TitleBlockUpdateDto } title Title block data - * @property { ReceiverBlockUpdateDto } receiver Receiver block data - * @property { OurInformationBlockUpdateDto } ourInformation Our information block data - * @property { RouteTableBlockResponseDto } routeTable Route table block data - * @property { CargoTableBlockDto } cargoTable Cargo table block data - * @property { SummaryCargoBlockResponseDto } summaryCargo Summary cargo block data - * @property { FinanceTableBlockDto } financeTable Finance table block data - * @property { RemarkBlockDto[] } remarks Remark blocks - * @property { TermsBlockDto } terms Terms block data - * @property { ConfigBlockDto } config Config block data - * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data - */ -export const TemplatedDocumentDataDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableBlockResponseDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockResponseDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockDtoSchema).readonly().describe("Remark blocks"), terms: CommonModels.TermsBlockDtoSchema.describe("Terms block data"), config: CommonModels.ConfigBlockDtoSchema.describe("Config block data"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); -export type TemplatedDocumentDataDto = z.infer; - -/** - * RouteTableUpdateBlockDtoSchema - * @type { object } - * @property { string } selectedRouteId Selected route ID - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { boolean } showReference Show reference column - * @property { boolean } showVesselVoyage Show vessel/voyage column - * @property { boolean } showProvider Show provider column - * @property { RouteTablePointDto[] } points Route points - * @property { boolean } showAddress Show address - * @property { boolean } showDates Show dates - * @property { boolean } showType Show type - * @property { boolean } showLocation Show location - * @property { boolean } showGrid Show grid - * @property { boolean } suppressRoute Suppress route - */ -export const RouteTableUpdateBlockDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID"), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points"), showAddress: z.boolean().describe("Show address"), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); -export type RouteTableUpdateBlockDto = z.infer; - -/** - * CargoItemRouteUpdateDtoSchema - * @type { object } - * @property { string[] } selectedRoutePointIds Selected route point IDs - */ -export const CargoItemRouteUpdateDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs") }).readonly(); -export type CargoItemRouteUpdateDto = z.infer; - -/** - * CargoItemUpdateDtoSchema - * @type { object } - * @property { string } cargoId Cargo ID to update packages for - * @property { string[] } selectedPackageIds Selected cargo package IDs - * @property { CargoItemRouteUpdateDto } route Cargo route (when routes are split) - */ -export const CargoItemUpdateDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID to update packages for"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteUpdateDtoSchema.describe("Cargo route (when routes are split)") }).readonly(); -export type CargoItemUpdateDto = z.infer; - -/** - * CargoTableBlockUpdateDtoSchema - * @type { object } - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { CargoItemUpdateDto[] } items Cargo items for package updates - * @property { boolean } suppressWeight Suppress weight column display - * @property { boolean } showGrid Show grid borders in cargo table - * @property { boolean } suppressVolume Suppress volume column display - * @property { boolean } suppressSpecialities Suppress specialities column display - * @property { boolean } suppressDimensions Suppress dimensions column display - * @property { boolean } suppressPackageVolume Suppress package volume column display - * @property { boolean } suppressPackageWeight Suppress package weight column display - * @property { boolean } showRoute Show route information (only applicable when routes are split) - * @property { boolean } showGrandTotal Show grand total - * @property { boolean } showTransportUnitTotal Show transport unit total - * @property { boolean } suppressCargo Suppress cargo table display - * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units - * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units - * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages - * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages - * @property { boolean } showPackageHSCodes Show HS codes for packages - * @property { boolean } showPackageType Show package type for packages - * @property { boolean } showPackageQuantity Show quantity for packages - * @property { boolean } showPackageDescription Show description for packages - * @property { boolean } showPackageCaseMarks Show case marks for packages - * @property { boolean } showTransportUnitNumber Show transport unit number - * @property { boolean } showTransportUnitType Show transport unit type - * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 - * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 - */ -export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), items: z.array(CommonModels.CargoItemUpdateDtoSchema).readonly().describe("Cargo items for package updates"), suppressWeight: z.boolean().describe("Suppress weight column display"), showGrid: z.boolean().describe("Show grid borders in cargo table"), suppressVolume: z.boolean().describe("Suppress volume column display"), suppressSpecialities: z.boolean().describe("Suppress specialities column display"), suppressDimensions: z.boolean().describe("Suppress dimensions column display"), suppressPackageVolume: z.boolean().describe("Suppress package volume column display"), suppressPackageWeight: z.boolean().describe("Suppress package weight column display"), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullable(), showGrandTotal: z.boolean().describe("Show grand total"), showTransportUnitTotal: z.boolean().describe("Show transport unit total"), suppressCargo: z.boolean().describe("Suppress cargo table display"), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units"), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units"), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages"), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages"), showPackageHSCodes: z.boolean().describe("Show HS codes for packages"), showPackageType: z.boolean().describe("Show package type for packages"), showPackageQuantity: z.boolean().describe("Show quantity for packages"), showPackageDescription: z.boolean().describe("Show description for packages"), showPackageCaseMarks: z.boolean().describe("Show case marks for packages"), showTransportUnitNumber: z.boolean().describe("Show transport unit number"), showTransportUnitType: z.boolean().describe("Show transport unit type"), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1"), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2") }).readonly(); -export type CargoTableBlockUpdateDto = z.infer; - -/** - * SummaryCargoItemUpdateDtoSchema - * @type { object } - * @property { string } transportUnitType Cargo type name (transport unit type) - * @property { string } description Updated description for this cargo type - */ -export const SummaryCargoItemUpdateDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), description: z.string().describe("Updated description for this cargo type") }).readonly(); -export type SummaryCargoItemUpdateDto = z.infer; - -/** - * SummaryCargoBlockUpdateDtoSchema - * @type { object } - * @property { SummaryCargoItemUpdateDto[] } items - */ -export const SummaryCargoBlockUpdateDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemUpdateDtoSchema).readonly() }).readonly(); -export type SummaryCargoBlockUpdateDto = z.infer; - -/** - * FinanceTablePositionUpdateDtoSchema - * @type { object } - * @property { string[] } selectedFinanceRowIds Selected finance row IDs - * @property { string } positionId Position ID - */ -export const FinanceTablePositionUpdateDtoSchema = z.object({ selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID") }).readonly(); -export type FinanceTablePositionUpdateDto = z.infer; - -/** - * FinanceTableBlockUpdateDtoSchema - * @type { object } - * @property { string } selectedBpId Selected business partner ID - * @property { boolean } showVendor Show vendor - * @property { boolean } showBuyRate Show buy rate - * @property { boolean } showCustomer Show customer - * @property { boolean } showSellRate Show sell rate - * @property { boolean } showGrid Show grid - * @property { boolean } showCharges Show charges - * @property { boolean } showAdditionalText Show additional text - * @property { boolean } showQuantity Show quantity - * @property { boolean } showTotalsByCurrency Show totals grouped by currency - * @property { boolean } suppressFinances Suppress finances from output - * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero - * @property { boolean } showTotal Show total from output - * @property { boolean } showProfit Show profit from output - * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output - * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output - * @property { boolean } includeSubPositions Include sub-positions - * @property { boolean } subPositionTotals Show sub-position totals - * @property { FinanceTablePositionUpdateDto[] } positions Finance positions - */ -export const FinanceTableBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionUpdateDtoSchema).readonly().describe("Finance positions") }).readonly(); -export type FinanceTableBlockUpdateDto = z.infer; - -/** - * RemarkBlockUpdateDtoSchema - * @type { object } - * @property { string } id - * @property { number } position Minimum: `1` - * @property { EditorContentUpdateDto } content - * @property { boolean } enabled - */ -export const RemarkBlockUpdateDtoSchema = z.object({ id: z.string(), position: z.number().gte(1).nullish(), content: CommonModels.EditorContentUpdateDtoSchema.nullish(), enabled: z.boolean().nullish() }).readonly(); -export type RemarkBlockUpdateDto = z.infer; - -/** - * TemplatedDocumentDataUpdateDtoSchema - * @type { object } - * @property { TitleBlockUpdateDto } title Title block data - * @property { ReceiverBlockUpdateDto } receiver Receiver block data - * @property { OurInformationBlockUpdateDto } ourInformation Our information block data - * @property { RouteTableUpdateBlockDto } routeTable Route table block data - * @property { CargoTableBlockUpdateDto } cargoTable Cargo table block data - * @property { SummaryCargoBlockUpdateDto } summaryCargo Summary cargo block data - * @property { FinanceTableBlockUpdateDto } financeTable Finance table block data - * @property { RemarkBlockUpdateDto[] } remarks Remark blocks - * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data - */ -export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).readonly().describe("Remark blocks"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); -export type TemplatedDocumentDataUpdateDto = z.infer; - -/** - * BusinessPartnerTypeSchema - * @type { enum } - */ -export const BusinessPartnerTypeSchema = z.enum(["businessPartner", "destinationAgent", "oceanCarrier", "office", "customsAgent", "stuffingStrippingProvider", "shipper", "fobForwarder", "routingAgent", "transportProvider", "originServiceProvider", "insuranceProvider", "consignee", "courier", "trucker", "airline", "originAgent"]); -export type BusinessPartnerType = z.infer; -export const BusinessPartnerType = BusinessPartnerTypeSchema.enum; - -/** - * BusinessPartnerAddressCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type BusinessPartnerAddressCityDto = z.infer; - -/** - * BusinessPartnerAddressCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const BusinessPartnerAddressCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); -export type BusinessPartnerAddressCountryDto = z.infer; - -/** - * BusinessPartnerAddressResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the address - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street information - * @property { string } zip ZIP/Postal code - * @property { BusinessPartnerAddressCityDto } city Country data - * @property { string } district District information - * @property { BusinessPartnerAddressCountryDto } country Country data - */ -export const BusinessPartnerAddressResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the address"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street information"), zip: z.string().describe("ZIP/Postal code"), city: CommonModels.BusinessPartnerAddressCityDtoSchema.describe("Country data"), district: z.string().describe("District information"), country: CommonModels.BusinessPartnerAddressCountryDtoSchema.describe("Country data") }).readonly(); -export type BusinessPartnerAddressResponseDTO = z.infer; - -/** - * EditorContentResponseDtoSchema - * @type { object } - * @property { string } html HTML content - * @property { object } json JSON content - * @property { any } json.[key] - */ -export const EditorContentResponseDtoSchema = z.object({ html: z.string().describe("HTML content"), json: z.object({}).catchall(z.any()).readonly().describe("JSON content") }).readonly(); -export type EditorContentResponseDto = z.infer; - -/** - * DunningSystemReferenceDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } isDefault - */ -export const DunningSystemReferenceDTOSchema = z.object({ id: z.string(), name: z.string(), isDefault: z.boolean() }).readonly(); -export type DunningSystemReferenceDTO = z.infer; - -/** - * TransportModeEnumSchema - * @type { enum } - */ -export const TransportModeEnumSchema = z.enum(["Air", "Sea", "Road"]); -export type TransportModeEnum = z.infer; -export const TransportModeEnum = TransportModeEnumSchema.enum; - -/** - * SeaRoutingEnumSchema - * @type { enum } - */ -export const SeaRoutingEnumSchema = z.enum(["Direct", "Transhipment"]); -export type SeaRoutingEnum = z.infer; -export const SeaRoutingEnum = SeaRoutingEnumSchema.enum; - -/** - * InvolvedPartyBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { BusinessPartnerAddressResponseDTO } address Main address information - */ -export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information").nullish() }).readonly(); -export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; - -/** - * InvolvedPartyContactResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvolvedPartyContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type InvolvedPartyContactResponseDTO = z.infer; - -/** - * InvolvedPartyResponseDtoSchema - * @type { object } - * @property { string } id - * @property { PositionInvolvedPartyTypeEnum } type - * @property { string } reference - * @property { InvolvedPartyBusinessPartnerResponseDTO } businessPartner - * @property { InvolvedPartyContactResponseDTO } contact - */ -export const InvolvedPartyResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionInvolvedPartyTypeEnumSchema, reference: z.string().nullish(), businessPartner: CommonModels.InvolvedPartyBusinessPartnerResponseDTOSchema.nullish(), contact: CommonModels.InvolvedPartyContactResponseDTOSchema.nullish() }).readonly(); -export type InvolvedPartyResponseDto = z.infer; - -/** - * CreateInvolvedPartyRequestDtoSchema - * @type { object } - * @property { PositionInvolvedPartyTypeEnum } type Type of the involved party to create - */ -export const CreateInvolvedPartyRequestDtoSchema = z.object({ type: CommonModels.PositionInvolvedPartyTypeEnumSchema.describe("Type of the involved party to create") }).readonly(); -export type CreateInvolvedPartyRequestDto = z.infer; - -/** - * RouteLocationTypeEnumSchema - * @type { enum } - */ -export const RouteLocationTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Port", "Terminal", "City", "Warehouse", "ContainerYard", "Airport"]); -export type RouteLocationTypeEnum = z.infer; -export const RouteLocationTypeEnum = RouteLocationTypeEnumSchema.enum; - -/** - * RoutePointLocationResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { RouteLocationTypeEnum } type - */ -export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }).readonly(); -export type RoutePointLocationResponseDto = z.infer; - -/** - * RoutePointTypeEnumSchema - * @type { enum } - */ -export const RoutePointTypeEnumSchema = z.enum(["EmptyContainerDepot", "LoadingAddress", "Stop", "FumigationStop", "OriginCustomsStop", "StuffingLocation", "PortTerminal", "PortOfLoading", "TransshipmentPort", "PortOfDischarge", "StrippingLocation", "ContainerYard", "DestinationCustomsStop", "FinalDestination", "EmptyContainerReturn", "OriginAgent", "HandlingAgent", "XRay", "CustomsBroker", "AirportOfDeparture", "StopAirport", "DestinationAirport", "CustomsStop", "DestinationAgent", "DeliveryAddress", "Courier", "PickupAddress", "StopAddress"]); -export type RoutePointTypeEnum = z.infer; -export const RoutePointTypeEnum = RoutePointTypeEnumSchema.enum; - -/** - * IncotermsEnumSchema - * @type { enum } - */ -export const IncotermsEnumSchema = z.enum(["EXW", "FCA", "CPT", "CIP", "DAP", "DPU", "DDP", "FAS", "FOB", "CFR", "CIF"]); -export type IncotermsEnum = z.infer; -export const IncotermsEnum = IncotermsEnumSchema.enum; - -/** - * PositionRouteTransportModeEnumSchema - * @type { enum } - */ -export const PositionRouteTransportModeEnumSchema = z.enum(["Truck", "Rail/Truck", "Rail", "Barge"]); -export type PositionRouteTransportModeEnum = z.infer; -export const PositionRouteTransportModeEnum = PositionRouteTransportModeEnumSchema.enum; - -/** - * RoutePointProviderResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type RoutePointProviderResponseDto = z.infer; - -/** - * RoutePointResponseDtoSchema - * @type { object } - * @property { string } id - * @property { RoutePointTypeEnum } type - * @property { string } name - * @property { number } sequenceNumber - * @property { RoutePointLocationResponseDto } location - * @property { string } estimatedTime - * @property { string } secondaryEstimatedTime Secondary estimated time (sea positions only) - * @property { string } reference - * @property { string } secondaryReference - * @property { IncotermsEnum } incoterm - * @property { PositionRouteTransportModeEnum } transportMode - * @property { RoutePointProviderResponseDto } provider - * @property { string } vessel Vessel name (sea positions only) - * @property { string } voyage Voyage number (sea positions only) - * @property { string } carrier Carrier name (sea positions only) - */ -export const RoutePointResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.RoutePointTypeEnumSchema, name: z.string(), sequenceNumber: z.number(), location: CommonModels.RoutePointLocationResponseDtoSchema.nullish(), estimatedTime: z.iso.datetime({ offset: true }).nullish(), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time (sea positions only)").nullish(), reference: z.string().nullish(), secondaryReference: z.string().nullish(), incoterm: CommonModels.IncotermsEnumSchema.nullish(), transportMode: CommonModels.PositionRouteTransportModeEnumSchema.nullish(), provider: CommonModels.RoutePointProviderResponseDtoSchema.nullish(), vessel: z.string().describe("Vessel name (sea positions only)").nullish(), voyage: z.string().describe("Voyage number (sea positions only)").nullish(), carrier: z.string().describe("Carrier name (sea positions only)").nullish() }).readonly(); -export type RoutePointResponseDto = z.infer; - -/** - * RouteResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } cargoId Cargo ID (sea positions only) - * @property { string } cargoNumber Cargo number (sea positions only) - * @property { RoutePointResponseDto[] } points - */ -export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().describe("Cargo ID (sea positions only)").nullish(), cargoNumber: z.string().describe("Cargo number (sea positions only)").nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema).readonly() }).readonly(); -export type RouteResponseDto = z.infer; - -/** - * RouteListResponseDtoSchema - * @type { object } - * @property { RouteResponseDto[] } routes - * @property { boolean } splitRoute Whether the position routes are split by cargo (sea positions only) - */ -export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema).readonly(), splitRoute: z.boolean().describe("Whether the position routes are split by cargo (sea positions only)") }).readonly(); -export type RouteListResponseDto = z.infer; - -/** - * CreateRoutePointRequestDtoSchema - * @type { object } - * @property { RoutePointTypeEnum } type - */ -export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }).readonly(); -export type CreateRoutePointRequestDto = z.infer; - -/** - * UpdateRoutePointRequestDtoSchema - * @type { object } - * @property { string } locationId Location ID for the route point - * @property { RouteLocationTypeEnum } locationType Type of location - * @property { string } estimatedTime Updated estimated time for the route point - * @property { string } secondaryEstimatedTime Secondary estimated time for the route point (sea positions only) - * @property { string } reference Reference for the route point - * @property { string } secondaryReference Secondary reference for the route point - * @property { IncotermsEnum } incoterm - * @property { PositionRouteTransportModeEnum } transportMode - * @property { string } providerId - * @property { string } vessel Vessel name (sea positions only) - * @property { string } voyage Voyage number (sea positions only) - * @property { string } carrier Carrier name (sea positions only) - */ -export const UpdateRoutePointRequestDtoSchema = z.object({ locationId: z.string().describe("Location ID for the route point").nullable(), locationType: CommonModels.RouteLocationTypeEnumSchema.describe("Type of location").nullable(), estimatedTime: z.iso.datetime({ offset: true }).describe("Updated estimated time for the route point"), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time for the route point (sea positions only)"), reference: z.string().describe("Reference for the route point"), secondaryReference: z.string().describe("Secondary reference for the route point"), incoterm: CommonModels.IncotermsEnumSchema, transportMode: CommonModels.PositionRouteTransportModeEnumSchema, providerId: z.string(), vessel: z.string().describe("Vessel name (sea positions only)"), voyage: z.string().describe("Voyage number (sea positions only)"), carrier: z.string().describe("Carrier name (sea positions only)") }).readonly(); -export type UpdateRoutePointRequestDto = z.infer; - -/** - * PositionChargeDtoResponseSchema - * @type { object } - * @property { object } chargeType - * @property { string } chargeType.id - * @property { string } chargeType.name - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { object } buyVatRule - * @property { string } buyVatRule.id - * @property { string } buyVatRule.name - * @property { string } buyVatRule.matchcode - * @property { object } vendor - * @property { string } vendor.id - * @property { string } vendor.name - * @property { string } vendor.matchCode - * @property { string } vendor.label - * @property { string } vendor.debtorId - * @property { string } vendor.creditorId - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { object } sellVatRule - * @property { string } sellVatRule.id - * @property { string } sellVatRule.name - * @property { string } sellVatRule.matchcode - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { string } customer.debtorId - * @property { string } customer.creditorId - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - * @property { number } profit Profit amount - * @property { string } profitCurrencyCode Profit currency code - */ -export const PositionChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge").nullish(), buyRate: z.number().describe("Buy rate amount").nullish(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), sellRate: z.number().describe("Sell rate amount").nullish(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), profit: z.number().describe("Profit amount").nullish(), profitCurrencyCode: z.string().describe("Profit currency code").nullish() }).readonly(); -export type PositionChargeDtoResponse = z.infer; - -/** - * PositionTextDtoResponseSchema - * @type { object } - * @property { string } content Text content - */ -export const PositionTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); -export type PositionTextDtoResponse = z.infer; - -/** - * PositionAccountItemDtoResponseSchema - * @type { object } - * @property { string } id Item ID - * @property { string } outgoingInvoiceId - * @property { string } registeredInvoiceId - * @property { PositionAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { PositionChargeDtoResponse } charge Charge data if type is CHARGE - * @property { PositionTextDtoResponse } text Text data if type is TEXT - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - */ -export const PositionAccountItemDtoResponseSchema = z.object({ id: z.string().describe("Item ID"), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish(), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item"), charge: CommonModels.PositionChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), text: CommonModels.PositionTextDtoResponseSchema.describe("Text data if type is TEXT").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); -export type PositionAccountItemDtoResponse = z.infer; - -/** - * UserPreviewDtoSchema - * @type { object } - * @property { string } userId - * @property { string } name - */ -export const UserPreviewDtoSchema = z.object({ userId: z.string(), name: z.string() }).readonly(); -export type UserPreviewDto = z.infer; - -/** - * HBLDocumentConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - * @property { string } blTermsAndConditionsImageUrl BL terms and conditions image URL - * @property { string } signatureImageUrl Signature image URL - * @property { boolean } hasSignatureImage Whether office has a signature image configured - */ -export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), blTermsAndConditionsImageUrl: z.string().describe("BL terms and conditions image URL"), signatureImageUrl: z.string().describe("Signature image URL"), hasSignatureImage: z.boolean().describe("Whether office has a signature image configured") }).readonly(); -export type HBLDocumentConfigDto = z.infer; - -/** - * DirectionEnumSchema - * @type { enum } - */ -export const DirectionEnumSchema = z.enum(["Import", "Export"]); -export type DirectionEnum = z.infer; -export const DirectionEnum = DirectionEnumSchema.enum; - -/** - * HazardousPackingGroupEnumSchema - * @type { enum } - */ -export const HazardousPackingGroupEnumSchema = z.enum(["PG I", "PG II", "PG III"]); -export type HazardousPackingGroupEnum = z.infer; -export const HazardousPackingGroupEnum = HazardousPackingGroupEnumSchema.enum; - -/** - * PositionCargoPackageHazardousSpecialtyResponseDTOSchema - * @type { object } - * @property { number } totalLength - * @property { number } totalWidth - * @property { number } temperature - * @property { string } unNumber - * @property { string } IMOClass - * @property { string } shippingName - * @property { string } technicalName - * @property { HazardousPackingGroupEnum } packagingGroup - * @property { number } netWeight - * @property { number } flashpoint - * @property { string[] } properties - * @property { string } acceptanceNumber - * @property { string } medGuide - * @property { string } emergencyPhone - * @property { string } emergencySchedule - */ -export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number(), totalWidth: z.number(), temperature: z.number(), unNumber: z.string(), IMOClass: z.string(), shippingName: z.string(), technicalName: z.string(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema, netWeight: z.number(), flashpoint: z.number(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly(), acceptanceNumber: z.string(), medGuide: z.string(), emergencyPhone: z.string(), emergencySchedule: z.string() }).readonly(); -export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; - -/** - * PositionCargoPackageTypeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionCargoPackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PositionCargoPackageTypeResponseDTO = z.infer; - -/** - * HsCodeLabelDtoSchema - * @type { object } - * @property { string } id - * @property { string } label - */ -export const HsCodeLabelDtoSchema = z.object({ id: z.string(), label: z.string() }).readonly(); -export type HsCodeLabelDto = z.infer; - -/** - * PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema - * @type { object } - * @property { number } temperatureFrom - * @property { number } temperatureUntil - */ -export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); -export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.infer; - -/** - * PositionCargoSourcePackageResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } positionNumber - */ -export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }).readonly(); -export type PositionCargoSourcePackageResponseDTO = z.infer; - -/** - * PositionCargoPackageResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } cargoId - * @property { string } rootFolderId - * @property { number } quantity - * @property { string } packageTypeId - * @property { PositionCargoPackageTypeResponseDTO } packageType - * @property { number } length - * @property { number } width - * @property { number } height - * @property { number } netWeight - * @property { number } grossWeight - * @property { number } chargeableWeight - * @property { string } note - * @property { string } name - * @property { number } orderNumber - * @property { number } volume - * @property { number } volumetricWeight - * @property { string } caseMarks - * @property { string } description - * @property { string[] } hsCodes - * @property { HsCodeLabelDto[] } hsCodeLabels HS code details - * @property { string } customsRemarks - * @property { number } loadMeter - * @property { string[] } specialties - * @property { PositionCargoPackageHazardousSpecialtyResponseDTO } hazardousSpecialty - * @property { PositionCargoPackageTemperatureControlledSpecialtyResponseDto } temperatureControlledSpecialty - * @property { PositionCargoSourcePackageResponseDTO } sourcePackage - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const PositionCargoPackageResponseDTOSchema = z.object({ id: z.string(), cargoId: z.string(), rootFolderId: z.string().nullish(), quantity: z.number().nullish(), packageTypeId: z.string().nullish(), packageType: CommonModels.PositionCargoPackageTypeResponseDTOSchema.nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), netWeight: z.number().nullish(), grossWeight: z.number().nullish(), chargeableWeight: z.number().nullish(), note: z.string().nullish(), name: z.string().nullish(), orderNumber: z.number().nullish(), volume: z.number().nullish(), volumetricWeight: z.number().nullish(), caseMarks: z.string().nullish(), description: z.string().nullish(), hsCodes: z.array(z.string()).readonly().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), customsRemarks: z.string().nullish(), loadMeter: z.number().nullish(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.PositionCargoPackageHazardousSpecialtyResponseDTOSchema.nullish(), temperatureControlledSpecialty: CommonModels.PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema.nullish(), sourcePackage: CommonModels.PositionCargoSourcePackageResponseDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), mrn: z.string().describe("MRN (Movement Reference Number)").nullish(), exportPortFilling: z.string().describe("Export port filling").nullish(), customsReleased: z.boolean().describe("Customs released status").nullish(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullish(), portCustomsNumber: z.string().describe("Port customs number").nullish() }).readonly(); -export type PositionCargoPackageResponseDTO = z.infer; - -/** - * PackageTotalsDtoSchema - * @type { object } - * @property { number } quantity - * @property { number } weightPerPiece - * @property { number } volume - * @property { number } chargeableWeight - * @property { number } loadMeter - */ -export const PackageTotalsDtoSchema = z.object({ quantity: z.number(), weightPerPiece: z.number(), volume: z.number(), chargeableWeight: z.number().nullish(), loadMeter: z.number().nullish() }).readonly(); -export type PackageTotalsDto = z.infer; - -/** - * PackageSpecialtyTotalsResponseDtoSchema - * @type { object } - * @property { PackageTotalsDto } noSpecialties - * @property { PackageTotalsDto } hazardous - * @property { PackageTotalsDto } nonStackable - * @property { PackageTotalsDto } temperatureControlled - * @property { PackageTotalsDto } diplomatic - * @property { PackageTotalsDto } oversized - * @property { PackageTotalsDto } total - */ -export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }).readonly(); -export type PackageSpecialtyTotalsResponseDto = z.infer; - -/** - * PositionCargoCargoTypeResponseDTOSchema - * @type { object } - * @property { string } id Cargo type ID. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } name Cargo type name. Example: `Electronics` - * @property { string } shortName Cargo type short name. Example: `ELEC` - */ -export const PositionCargoCargoTypeResponseDTOSchema = z.object({ id: z.string().describe("Cargo type ID"), name: z.string().describe("Cargo type name"), shortName: z.string().describe("Cargo type short name").nullish() }).readonly(); -export type PositionCargoCargoTypeResponseDTO = z.infer; - -/** - * PositionCargoResponseDTOSchema - * @type { object } - * @property { string } id Cargo ID. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } positionId Position ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } quoteId Quote ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } rootFolderId Folder id bound to this cargo. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { PositionCargoCargoTypeResponseDTO } cargoType Cargo type - * @property { boolean } autoCalculateTotals - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { string } rateOptions - * @property { string } rateClass - * @property { string } textForCustoms - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { number } ratePerKg - * @property { number } totalRate - * @property { number } tare - * @property { number } vgm - * @property { HsCodeLabelDto[] } hsCodeLabels HS code details - * @property { string } note - * @property { PositionCargoPackageResponseDTO[] } packages Packages for the cargo - * @property { string } createdAt Creation date. Example: `2023-04-09T12:00:00Z` - * @property { string } updatedAt Last update date. Example: `2023-04-09T12:00:00Z` - * @property { number } completeWeight - * @property { PackageSpecialtyTotalsResponseDto } packageTotals - */ -export const PositionCargoResponseDTOSchema = z.object({ id: z.string().describe("Cargo ID"), positionId: z.string().describe("Position ID this cargo belongs to").nullish(), quoteId: z.string().describe("Quote ID this cargo belongs to").nullish(), rootFolderId: z.string().describe("Folder id bound to this cargo").nullish(), cargoType: CommonModels.PositionCargoCargoTypeResponseDTOSchema.describe("Cargo type").nullish(), autoCalculateTotals: z.boolean(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean(), transportUnitNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), rateOptions: z.string().nullish(), rateClass: z.string().nullish(), textForCustoms: z.string().nullish(), totalVolume: z.number().nullish(), totalGrossWeight: z.number().nullish(), totalNetWeight: z.number().nullish(), totalVolumetricWeight: z.number().nullish(), totalChargeableWeight: z.number().nullish(), totalLoadMeter: z.number().nullish(), ratePerKg: z.number().nullish(), totalRate: z.number().nullish(), tare: z.number().nullish(), vgm: z.number().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), note: z.string().nullish(), packages: z.array(CommonModels.PositionCargoPackageResponseDTOSchema).readonly().describe("Packages for the cargo").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Creation date"), updatedAt: z.iso.datetime({ offset: true }).describe("Last update date"), completeWeight: z.number().nullish(), packageTotals: CommonModels.PackageSpecialtyTotalsResponseDtoSchema.nullish() }).readonly(); -export type PositionCargoResponseDTO = z.infer; - -/** - * HazardousSpecialtyDTOSchema - * @type { object } - * @property { number } totalLength Total length - * @property { number } totalWidth Total width - * @property { number } temperature Temperature - * @property { string } unNumber UN number - * @property { string } IMOClass IMOClass - * @property { string } shippingName Shipping name - * @property { string } technicalName Technical name - * @property { HazardousPackingGroupEnum } packagingGroup Packaging - * @property { number } netWeight Net weight - * @property { number } flashpoint Flashpoint - * @property { string[] } properties Properties - * @property { string } acceptanceNumber Acceptance number - * @property { string } medGuide Medical guide - * @property { string } emergencyPhone Emergency phone - * @property { string } emergencySchedule Emergency schedule - */ -export const HazardousSpecialtyDTOSchema = z.object({ totalLength: z.number().describe("Total length"), totalWidth: z.number().describe("Total width"), temperature: z.number().describe("Temperature"), unNumber: z.string().describe("UN number"), IMOClass: z.string().describe("IMOClass"), shippingName: z.string().describe("Shipping name"), technicalName: z.string().describe("Technical name"), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.describe("Packaging"), netWeight: z.number().describe("Net weight"), flashpoint: z.number().describe("Flashpoint"), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly().describe("Properties"), acceptanceNumber: z.string().describe("Acceptance number"), medGuide: z.string().describe("Medical guide"), emergencyPhone: z.string().describe("Emergency phone"), emergencySchedule: z.string().describe("Emergency schedule") }).readonly(); -export type HazardousSpecialtyDTO = z.infer; - -/** - * TemperatureControlledSpecialtyDtoSchema - * @type { object } - * @property { number } temperatureFrom - * @property { number } temperatureUntil - */ -export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); -export type TemperatureControlledSpecialtyDto = z.infer; - -/** - * CreatePositionCargoPackageDTOSchema - * @type { object } - * @property { number } quantity Package quantity - * @property { string } packageTypeId Package type ID - * @property { number } length Package length - * @property { number } width Package width - * @property { number } height Package height - * @property { number } netWeight Package net weight - * @property { number } grossWeight Package gross weight - * @property { number } loadMeter Package load meter - * @property { number } chargeableWeight Package chargeable weight - * @property { number } volume Package volume - * @property { number } volumetricWeight Package volumetric weight - * @property { string } caseMarks Package case marks - * @property { string } note Package note - * @property { string } description Package description - * @property { string[] } hsCodes Package HS codes - * @property { string } customsRemarks Text for customs - * @property { string[] } specialties - * @property { HazardousSpecialtyDTO } hazardousSpecialty - * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const CreatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity"), packageTypeId: z.string().describe("Package type ID"), length: z.number().describe("Package length"), width: z.number().describe("Package width"), height: z.number().describe("Package height"), netWeight: z.number().describe("Package net weight"), grossWeight: z.number().describe("Package gross weight"), loadMeter: z.number().describe("Package load meter"), chargeableWeight: z.number().describe("Package chargeable weight"), volume: z.number().describe("Package volume"), volumetricWeight: z.number().describe("Package volumetric weight"), caseMarks: z.string().describe("Package case marks"), note: z.string().describe("Package note"), description: z.string().describe("Package description"), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs"), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema, temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)"), exportPortFilling: z.string().describe("Export port filling"), customsReleased: z.boolean().describe("Customs released status"), importCustomsReleaseNumber: z.string().describe("Import customs release number"), portCustomsNumber: z.string().describe("Port customs number") }).readonly(); -export type CreatePositionCargoPackageDTO = z.infer; - -/** - * UpdatePositionCargoPackageDTOSchema - * @type { object } - * @property { number } quantity Package quantity - * @property { string } packageTypeId Package type ID - * @property { number } length Package length - * @property { number } width Package width - * @property { number } height Package height - * @property { number } netWeight Package net weight - * @property { number } grossWeight Package gross weight - * @property { number } chargeableWeight Package chargeable weight - * @property { string } note Package case marks - * @property { number } volume Package volume - * @property { number } volumetricWeight Package volumetric weight - * @property { number } orderNumber Package order number - * @property { string } caseMarks Package case marks - * @property { string } description Package description - * @property { string[] } hsCodes Package HS codes - * @property { string } customsRemarks Text for customs - * @property { number } loadMeter Load meter - * @property { string[] } specialties Package specialties - * @property { HazardousSpecialtyDTO } hazardousSpecialty Hazardous specialty details - * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const UpdatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity").nullable(), packageTypeId: z.string().describe("Package type ID").nullable(), length: z.number().describe("Package length").nullable(), width: z.number().describe("Package width").nullable(), height: z.number().describe("Package height").nullable(), netWeight: z.number().describe("Package net weight").nullable(), grossWeight: z.number().describe("Package gross weight").nullable(), chargeableWeight: z.number().describe("Package chargeable weight").nullable(), note: z.string().describe("Package case marks").nullable(), volume: z.number().describe("Package volume").nullable(), volumetricWeight: z.number().describe("Package volumetric weight").nullable(), orderNumber: z.number().describe("Package order number"), caseMarks: z.string().describe("Package case marks").nullable(), description: z.string().describe("Package description").nullable(), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs").nullable(), loadMeter: z.number().describe("Load meter").nullable(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly().describe("Package specialties"), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema.describe("Hazardous specialty details"), temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)").nullable(), exportPortFilling: z.string().describe("Export port filling").nullable(), customsReleased: z.boolean().describe("Customs released status").nullable(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullable(), portCustomsNumber: z.string().describe("Port customs number").nullable() }).readonly(); -export type UpdatePositionCargoPackageDTO = z.infer; - -/** - * QuantityOfOriginalBlDocumentsEnumSchema - * @type { enum } - */ -export const QuantityOfOriginalBlDocumentsEnumSchema = z.enum(["ZERO", "ONE", "TWO", "THREE"]); -export type QuantityOfOriginalBlDocumentsEnum = z.infer; -export const QuantityOfOriginalBlDocumentsEnum = QuantityOfOriginalBlDocumentsEnumSchema.enum; - -/** - * MovementTypeEnumSchema - * @type { enum } - */ -export const MovementTypeEnumSchema = z.enum(["DoorToDoor", "PortToPort", "PortToDoor", "DoorToPort"]); -export type MovementTypeEnum = z.infer; -export const MovementTypeEnum = MovementTypeEnumSchema.enum; - -/** - * ChargePaymentEnumSchema - * @type { enum } - */ -export const ChargePaymentEnumSchema = z.enum(["Prepaid", "Collect", "PayableElsewhere"]); -export type ChargePaymentEnum = z.infer; -export const ChargePaymentEnum = ChargePaymentEnumSchema.enum; - -/** - * DocumentConfigDTOSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - */ -export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL") }).readonly(); -export type DocumentConfigDTO = z.infer; - -/** - * EmployeeRoleContextSchema - * @type { enum } - */ -export const EmployeeRoleContextSchema = z.enum(["global", "office"]); -export type EmployeeRoleContext = z.infer; -export const EmployeeRoleContext = EmployeeRoleContextSchema.enum; - -/** - * EmployeeRoleResponseSchema - * @type { object } - * @property { string } id Unique identifier of the role - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string } context Role context - * @property { string[] } permissions Permissions associated with the role - */ -export const EmployeeRoleResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); -export type EmployeeRoleResponse = z.infer; - -/** - * EmploymentEmployeeResponseSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { boolean } archived Archived - * @property { EmployeeRoleResponse[] } roles Global Roles - */ -export const EmploymentEmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish() }).readonly(); -export type EmploymentEmployeeResponse = z.infer; - -/** - * EmployeeOfficeResponseSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const EmployeeOfficeResponseSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type EmployeeOfficeResponse = z.infer; - -/** - * EmploymentResponseSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { EmployeeOfficeResponse } office - * @property { string } employeeId - * @property { EmploymentEmployeeResponse } employee - * @property { boolean } archived - * @property { string } costCenter - * @property { EmployeeRoleResponse[] } roles Employment Roles - */ -export const EmploymentResponseSchema = z.object({ id: z.string(), officeId: z.string(), office: CommonModels.EmployeeOfficeResponseSchema.nullish(), employeeId: z.string(), employee: CommonModels.EmploymentEmployeeResponseSchema.nullish(), archived: z.boolean(), costCenter: z.string().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Employment Roles").nullish() }).readonly(); -export type EmploymentResponse = z.infer; - -/** - * LoadTypeEnumSchema - * @type { enum } - */ -export const LoadTypeEnumSchema = z.enum(["LCL", "FCL", "Trailer", "Container", "BreakBulk", "Roro", "MAFI", "LTL_ROAD", "FTL_ROAD", "Standard"]); -export type LoadTypeEnum = z.infer; -export const LoadTypeEnum = LoadTypeEnumSchema.enum; - -/** - * ServiceTypeEnumSchema - * @type { enum } - */ -export const ServiceTypeEnumSchema = z.enum(["InlandTransport", "DoorToPortOfDischarge", "PortOfLoadingToDoor", "DoorToDoor", "PortToPort", "DoorToAirport", "AirportToAirport", "AirportToDoor", "PortOfDischargeRampToDoor"]); -export type ServiceTypeEnum = z.infer; -export const ServiceTypeEnum = ServiceTypeEnumSchema.enum; - -/** - * DateRangeDtoSchema - * @type { object } - * @property { string } start - * @property { string } end - */ -export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }), end: z.iso.datetime({ offset: true }) }).readonly(); -export type DateRangeDto = z.infer; - -/** - * BusinessPartnerLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { BusinessPartnerType[] } types Array of business partner types - */ -export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); -export type BusinessPartnerLabelResponseDTO = z.infer; - -/** - * SectionEnumSchema - * @type { enum } - */ -export const SectionEnumSchema = z.enum(["Logistics"]); -export type SectionEnum = z.infer; -export const SectionEnum = SectionEnumSchema.enum; - -/** - * FrequencyEnumSchema - * @type { enum } - */ -export const FrequencyEnumSchema = z.enum(["Daily", "Weekly", "Monthly"]); -export type FrequencyEnum = z.infer; -export const FrequencyEnum = FrequencyEnumSchema.enum; - -/** - * InvoiceDirectionEnumSchema - * @type { enum } - */ -export const InvoiceDirectionEnumSchema = z.enum(["Incoming", "Outgoing"]); -export type InvoiceDirectionEnum = z.infer; -export const InvoiceDirectionEnum = InvoiceDirectionEnumSchema.enum; - -/** - * InvoiceTypeEnumSchema - * @type { enum } - */ -export const InvoiceTypeEnumSchema = z.enum(["CreditNote", "Invoice", "CollectiveInvoice", "ProForma", "PartialCreditNote", "DirectInvoice"]); -export type InvoiceTypeEnum = z.infer; -export const InvoiceTypeEnum = InvoiceTypeEnumSchema.enum; - -/** - * BooleanFilterEnumSchema - * @type { enum } - */ -export const BooleanFilterEnumSchema = z.enum(["Yes", "No"]); -export type BooleanFilterEnum = z.infer; -export const BooleanFilterEnum = BooleanFilterEnumSchema.enum; - -/** - * InvoiceStatusEnumSchema - * @type { enum } - */ -export const InvoiceStatusEnumSchema = z.enum(["Credited", "Draft", "Overpaid", "PartiallyPaid", "Outstanding", "Paid", "CreditNote", "ProForma"]); -export type InvoiceStatusEnum = z.infer; -export const InvoiceStatusEnum = InvoiceStatusEnumSchema.enum; - -/** - * OfficeInvoiceFilterDtoSchema - * @type { object } - * @property { string } search - * @property { DateRangeDto } issuingDate - * @property { DateRangeDto } serviceDate - * @property { InvoiceDirectionEnum[] } invoiceDirection - * @property { InvoiceTypeEnum[] } invoiceType - * @property { BooleanFilterEnum[] } collective - * @property { number } amountMin - * @property { number } amountMax - * @property { string[] } currencyNotation - * @property { string[] } vatRule - * @property { DateRangeDto } dueDate - * @property { InvoiceStatusEnum[] } status - * @property { string[] } receiver Filter by invoice receiver/customer IDs (UUID) - * @property { string[] } receiverCountry Filter by invoice receiver/customer country IDs - * @property { string[] } salesRep Filter by sales rep id - * @property { string } positionNumbersString - * @property { string[] } positionNumbers - * @property { string } invoiceNumbersString - * @property { string[] } invoiceNumbers - * @property { BooleanFilterEnum[] } bookkeepingExportStatus - * @property { BooleanFilterEnum[] } dunningBlock - * @property { BooleanFilterEnum[] } invoiceInReview - * @property { BooleanFilterEnum[] } isInvoiceOk - * @property { BooleanFilterEnum[] } isVatOk - * @property { number } invoiceNumberMin - * @property { number } invoiceNumberMax - * @property { number } internalNumberMin - * @property { number } internalNumberMax - * @property { string } externalSystemId Filter invoices by position external system ID (substring match) - * @property { string } hblNumber Filter invoices by HBL/HAWB (substring match) - * @property { string } mblNumber Filter invoices by MBL/MAWB (substring match) - * @property { string } bookingNumber Filter invoices by booking number (substring match) - * @property { string } vessel Filter invoices by vessel name (substring match) - * @property { string } voyage Filter invoices by voyage number (substring match) - * @property { string } creditorId Filter invoices by creditor ID (substring match) - * @property { string } debtorId Filter invoices by debtor ID (substring match) - */ -export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), vatRule: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer IDs (UUID)"), receiverCountry: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer country IDs"), salesRep: z.array(z.string()).readonly().describe("Filter by sales rep id"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number(), externalSystemId: z.string().describe("Filter invoices by position external system ID (substring match)"), hblNumber: z.string().describe("Filter invoices by HBL/HAWB (substring match)"), mblNumber: z.string().describe("Filter invoices by MBL/MAWB (substring match)"), bookingNumber: z.string().describe("Filter invoices by booking number (substring match)"), vessel: z.string().describe("Filter invoices by vessel name (substring match)"), voyage: z.string().describe("Filter invoices by voyage number (substring match)"), creditorId: z.string().describe("Filter invoices by creditor ID (substring match)"), debtorId: z.string().describe("Filter invoices by debtor ID (substring match)") }).readonly(); -export type OfficeInvoiceFilterDto = z.infer; - -/** - * PositionStatusEnumSchema - * @type { enum } - */ -export const PositionStatusEnumSchema = z.enum(["Preparing", "NeedsDocumentation", "Executing", "Done"]); -export type PositionStatusEnum = z.infer; -export const PositionStatusEnum = PositionStatusEnumSchema.enum; - -/** - * PositionCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PositionCustomerDto = z.infer; - -/** - * PositionQuoteDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); -export type PositionQuoteDto = z.infer; - -/** - * ParentPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); -export type ParentPositionDto = z.infer; - -/** - * PositionTypeEnumSchema - * @type { enum } - */ -export const PositionTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); -export type PositionTypeEnum = z.infer; -export const PositionTypeEnum = PositionTypeEnumSchema.enum; - -/** - * PositionProjectLiteDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PositionProjectLiteDto = z.infer; - -/** - * EmployeeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const EmployeeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type EmployeeDto = z.infer; - -/** - * PositionCoreResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } rootFolderId - * @property { string } externalSystemId - * @property { MovementTypeEnum } inttraTypeOfMove - * @property { PositionCustomerDto } customer - * @property { boolean } isCancelled - * @property { string } owningOfficeId - * @property { string } originOfficeId - * @property { PositionQuoteDto } quote - * @property { string } number - * @property { SectionEnum } section - * @property { DirectionEnum } direction - * @property { TransportModeEnum } transportMode - * @property { string } statusDate - * @property { string } serviceDate - * @property { string } dateOfDeparture - * @property { string } dateOfArrival - * @property { PositionStatusEnum } status - * @property { LoadTypeEnum } loadType - * @property { IncotermsEnum } incoterms - * @property { IncotermsEnum } secondIncoterms - * @property { ServiceTypeEnum } serviceType - * @property { ParentPositionDto } parentPosition - * @property { string } buyRateReference - * @property { FrequencyEnum } frequency - * @property { PositionTypeEnum } positionType - * @property { boolean } isParentPosition - * @property { boolean } hasParentPosition - * @property { boolean } hasChildPositions - * @property { PositionProjectLiteDto } projectLite - * @property { boolean } isExcludedFromStatistics - * @property { EmployeeDto } salesRep - * @property { string } fillingCompany - * @property { string } sellingContract - * @property { string } fillingScacCode - * @property { string } serviceValidity - * @property { string } ratesValidity - * @property { EmployeeDto } responsibleEmployee - * @property { EmployeeDto } receivedByEmployee - * @property { string } team - * @property { string } createdAt - * @property { string } updatedAt - * @property { EditorContentResponseDto } notes Notes - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); -export type PositionCoreResponseDto = z.infer; - -/** - * VesselDtoSchema - * @type { object } - * @property { string } name - * @property { number } imo - * @property { number } mmsi - */ -export const VesselDtoSchema = z.object({ name: z.string(), imo: z.number().nullish(), mmsi: z.number().nullish() }).readonly(); -export type VesselDto = z.infer; - -/** - * StatusResponseDtoSchema - * @type { object } - * @property { string } status Status - * @property { string } message Message - * @property { string } code Alphanumeric code of the message type - */ -export const StatusResponseDtoSchema = z.object({ status: z.string().describe("Status"), message: z.string().describe("Message"), code: z.string().describe("Alphanumeric code of the message type") }).readonly(); -export type StatusResponseDto = z.infer; - -/** - * PaginationDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const PaginationDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); -export type PaginationDto = z.infer; - -/** - * LabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - */ -export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }).readonly(); -export type LabelResponseDTO = z.infer; - -/** - * GenerateWorkingDocumentRequestDtoSchema - * @type { object } - * @property { string } issuedAt - * @property { string } fileName - */ -export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); -export type GenerateWorkingDocumentRequestDto = z.infer; - -/** - * UpdateInvolvedPartyDtoSchema - * @type { object } - * @property { string } reference - * @property { string } businessPartnerId - * @property { string } contactId - */ -export const UpdateInvolvedPartyDtoSchema = z.object({ reference: z.string(), businessPartnerId: z.string(), contactId: z.string() }).readonly(); -export type UpdateInvolvedPartyDto = z.infer; - -/** - * MergeRoutesRequestDtoSchema - * @type { object } - * @property { string } sourceCargoId Source cargo ID to merge from (sea positions only) - */ -export const MergeRoutesRequestDtoSchema = z.object({ sourceCargoId: z.string().describe("Source cargo ID to merge from (sea positions only)").nullable() }).readonly(); -export type MergeRoutesRequestDto = z.infer; - -/** - * CopyRouteRequestDtoSchema - * @type { object } - * @property { string } targetCargoId Target cargo ID to copy to (sea positions only) - */ -export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to copy to (sea positions only)").nullable() }).readonly(); -export type CopyRouteRequestDto = z.infer; - -/** - * CargoSummaryResponseDTOSchema - * @type { object } - * @property { string } transportUnitTypeName Transport unit type name (e.g., "40' DRY", "20'") - * @property { number } quantity Total quantity of this transport unit type - */ -export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string().describe("Transport unit type name (e.g., "40' DRY", "20'")"), quantity: z.number().describe("Total quantity of this transport unit type") }).readonly(); -export type CargoSummaryResponseDTO = z.infer; - -/** - * CreatePositionCargoDTOSchema - * @type { object } - * @property { string } cargoTypeId Cargo type ID - * @property { string } note - * @property { boolean } autoCalculateTotals - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { string } rateOptions - * @property { string } rateClass - * @property { number } ratePerKg - * @property { number } totalRate - * @property { string } textForCustoms - * @property { number } tare - * @property { number } vgm - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - */ -export const CreatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); -export type CreatePositionCargoDTO = z.infer; - -/** - * UpdatePositionCargoDTOSchema - * @type { object } - * @property { string } cargoTypeId Cargo type ID - * @property { string } note - * @property { boolean } autoCalculateTotals - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { string } rateOptions - * @property { string } rateClass - * @property { number } ratePerKg - * @property { number } totalRate - * @property { string } textForCustoms - * @property { number } tare - * @property { number } vgm - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - */ -export const UpdatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); -export type UpdatePositionCargoDTO = z.infer; - -/** - * MovePositionCargoPackageRequestDTOSchema - * @type { object } - * @property { string } targetCargoId Target cargo ID to move the package to - */ -export const MovePositionCargoPackageRequestDTOSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to move the package to") }).readonly(); -export type MovePositionCargoPackageRequestDTO = z.infer; - -/** - * PositionCargoPaginationOrderFieldSchema - * @type { enum } - */ -export const PositionCargoPaginationOrderFieldSchema = z.enum(["createdAt", "updatedAt"]); -export type PositionCargoPaginationOrderField = z.infer; -export const PositionCargoPaginationOrderField = PositionCargoPaginationOrderFieldSchema.enum; - -/** - * PositionAvailablePartnersUseCaseSchema - * @type { enum } - */ -export const PositionAvailablePartnersUseCaseSchema = z.enum(["financeCustomer", "financeVendor"]); -export type PositionAvailablePartnersUseCase = z.infer; -export const PositionAvailablePartnersUseCase = PositionAvailablePartnersUseCaseSchema.enum; - -} diff --git a/test/generated/dist/containerYards/containerYards.acl.ts b/test/generated/dist/containerYards/containerYards.acl.ts deleted file mode 100644 index daa83f7..0000000 --- a/test/generated/dist/containerYards/containerYards.acl.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace ContainerYardsAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "ContainerYard"] as AbilityTuple<"Create", "ContainerYard">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; - - /** - * Use for `useGetLabelById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetLabelById` query - */ - export const canUseGetLabelById = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "ContainerYard"] as AbilityTuple<"Update", "ContainerYard">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "ContainerYard"] as AbilityTuple<"Read", "ContainerYard">; -} diff --git a/test/generated/dist/containerYards/containerYards.api.ts b/test/generated/dist/containerYards/containerYards.api.ts deleted file mode 100644 index 3b95a41..0000000 --- a/test/generated/dist/containerYards/containerYards.api.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ContainerYardsModels } from "./containerYards.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ContainerYardsApi { - export const paginate = ( - limit: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, - `/container-yards`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards`, - ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), - config, - ); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, - `/container-yards/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const getLabelById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.LabelResponseDTOSchema }, - `/container-yards/${id}/labels`, - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}/unarchive`, - undefined, - config, - ); - }; - export const update = ( - id: string, - data: ContainerYardsModels.UpdateContainerYardRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}`, - ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), - config, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}`, - config, - ); - }; -} diff --git a/test/generated/dist/containerYards/containerYards.configs.ts b/test/generated/dist/containerYards/containerYards.configs.ts deleted file mode 100644 index 62b81ca..0000000 --- a/test/generated/dist/containerYards/containerYards.configs.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ContainerYardsModels } from "./containerYards.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ContainerYardsQueries } from "./containerYards.queries"; -import { ContainerYardsAcl } from "./containerYards.acl"; - -export namespace ContainerYardsConfigs { - export const containerYardsConfig = { - meta: { - title: "Container Yards", - }, - readAll: { - acl: ContainerYardsAcl.canUsePaginate, - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - paginated: ContainerYardsQueries.usePaginate, - infinite: ContainerYardsQueries.usePaginateInfinite, - filters: { - schema: ContainerYardsModels.ContainerYardFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ContainerYardsModels.ContainerYardFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - shortName: true, - name: true, - archived: true, - street: true, - secondaryStreet: true, - zip: true, - city: true, - country: true, - district: true, - additionalInformation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: ContainerYardsAcl.canUseFindById, - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - query: ContainerYardsQueries.useFindById, - }, - create: { - acl: ContainerYardsAcl.canUseCreate, - schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, - mutation: ContainerYardsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, - options: { - inputs: { - matchCode: true, - name: true, - shortName: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - additionalInformation: true, - }, - }, - }), - }, - update: { - acl: ContainerYardsAcl.canUseUpdate, - schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, - mutation: ContainerYardsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, - options: { - inputs: { - matchCode: true, - name: true, - shortName: true, - addressId: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - additionalInformation: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ContainerYardsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ContainerYardsQueries.usePaginateLabels, - infinite: ContainerYardsQueries.usePaginateLabelsInfinite, - filters: { - schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/containerYards/containerYards.models.ts b/test/generated/dist/containerYards/containerYards.models.ts deleted file mode 100644 index 7deddd9..0000000 --- a/test/generated/dist/containerYards/containerYards.models.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ContainerYardsModels { - /** - * ContainerYardEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ContainerYardEmployeeDTO = z.infer; - - /** - * ContainerYardResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchCode Container yard match code - * @property { string } shortName Container yard short name - * @property { string } name Container yard name - * @property { boolean } archived Whether the container yard is archived - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { object } city - * @property { string } city.id - * @property { string } city.name - * @property { object } country - * @property { string } country.id - * @property { string } country.name - * @property { string } country.isoCode2 - * @property { string } country.isoCode3 - * @property { string } district District - * @property { string } additionalInformation Additional information - * @property { string } createdById - * @property { ContainerYardEmployeeDTO } createdBy - * @property { string } createdAt Date when the container yard was created - * @property { string } updatedById - * @property { ContainerYardEmployeeDTO } updatedBy - * @property { string } updatedAt Date when the container yard was last updated - */ - export const ContainerYardResponseDTOSchema = z - .object({ - id: z.string(), - matchCode: z.string().describe("Container yard match code"), - shortName: z.string().describe("Container yard short name").nullish(), - name: z.string().describe("Container yard name"), - archived: z.boolean().describe("Whether the container yard is archived"), - street: z.string().describe("Street address").nullish(), - secondaryStreet: z.string().describe("Secondary street address").nullish(), - zip: z.string().describe("ZIP/Postal code").nullish(), - city: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), - country: z - .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) - .readonly() - .nullish(), - district: z.string().describe("District").nullish(), - additionalInformation: z.string().describe("Additional information").nullish(), - createdById: z.string().nullish(), - createdBy: ContainerYardEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was created"), - updatedById: z.string().nullish(), - updatedBy: ContainerYardEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was last updated"), - }) - .readonly(); - export type ContainerYardResponseDTO = z.infer; - - /** - * ContainerYardFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ - export const ContainerYardFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); - export type ContainerYardFilterDto = z.infer; - - /** - * ContainerYardLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const ContainerYardLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type ContainerYardLabelFilterDto = z.infer; - - /** - * CreateContainerYardRequestDTOSchema - * @type { object } - * @property { string } matchCode Match code - * @property { string } name Name - * @property { string } shortName Short name - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } cityId City ID - * @property { string } countryId Country ID - * @property { string } district District - * @property { string } additionalInformation Additional information - */ - export const CreateContainerYardRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Match code"), - name: z.string().describe("Name"), - shortName: z.string().describe("Short name").nullish(), - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street address").nullish(), - zip: z.string().describe("ZIP/Postal code"), - cityId: z.string().describe("City ID"), - countryId: z.string().describe("Country ID"), - district: z.string().describe("District").nullish(), - additionalInformation: z.string().describe("Additional information").nullish(), - }) - .readonly(); - export type CreateContainerYardRequestDTO = z.infer; - - /** - * UpdateContainerYardRequestDTOSchema - * @type { object } - * @property { string } matchCode Match code - * @property { string } name Name - * @property { string } shortName Short name - * @property { string } addressId Address ID - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } cityId City ID - * @property { string } countryId Country ID - * @property { string } district District - * @property { string } additionalInformation Additional information - */ - export const UpdateContainerYardRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Match code"), - name: z.string().describe("Name"), - shortName: z.string().describe("Short name"), - addressId: z.string().describe("Address ID"), - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street address"), - zip: z.string().describe("ZIP/Postal code"), - cityId: z.string().describe("City ID"), - countryId: z.string().describe("Country ID"), - district: z.string().describe("District"), - additionalInformation: z.string().describe("Additional information"), - }) - .readonly(); - export type UpdateContainerYardRequestDTO = z.infer; - - /** - * ContainerYardsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const ContainerYardsPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ContainerYardsPaginateOrderParamEnum = z.infer; - export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderParamEnumSchema.enum; - - /** - * ContainerYardsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ContainerYardResponseDTO[] } items - */ - export const ContainerYardsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ContainerYardResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ContainerYardsPaginateResponse = z.infer; - - /** - * ContainerYardsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const ContainerYardsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ContainerYardsPaginateLabelsOrderParamEnum = z.infer< - typeof ContainerYardsPaginateLabelsOrderParamEnumSchema - >; - export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginateLabelsOrderParamEnumSchema.enum; - - /** - * ContainerYardsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const ContainerYardsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ContainerYardsPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/containerYards/containerYards.queries.ts b/test/generated/dist/containerYards/containerYards.queries.ts deleted file mode 100644 index 1f81835..0000000 --- a/test/generated/dist/containerYards/containerYards.queries.ts +++ /dev/null @@ -1,392 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ContainerYardsAcl } from "./containerYards.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ContainerYardsModels } from "./containerYards.models"; -import { ContainerYardsApi } from "./containerYards.api"; - -export namespace ContainerYardsQueries { - export const moduleName = QueryModule.ContainerYards; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/container-yards", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardFilterDto, - cursor?: string, - ) => [...keys.all, "/container-yards", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/container-yards/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: ContainerYardsModels.ContainerYardLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/container-yards/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getLabelById: (id: string) => [...keys.all, "/container-yards/:id/labels", id] as const, - findById: (id: string) => [...keys.all, "/container-yards/:id", id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Container Yards - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ContainerYardsModels.ContainerYardFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Container Yards - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ContainerYardsModels.ContainerYardFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create container yard - * @permission Requires `canUseCreate` ability - * @param { ContainerYardsModels.CreateContainerYardRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof ContainerYardsApi.create, - { data: ContainerYardsModels.CreateContainerYardRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(ContainerYardsAcl.canUseCreate()); - return ContainerYardsApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate container yard labels (id and name) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ContainerYardsModels.ContainerYardLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate container yard labels (id and name) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ContainerYardsModels.ContainerYardLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useGetLabelById` - * @summary Get container yard by ID with label format (id and formatted name) - * @permission Requires `canUseGetLabelById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetLabelById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getLabelById(id), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUseGetLabelById()); - return ContainerYardsApi.getLabelById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive container yard - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ContainerYardsAcl.canUseArchive()); - return ContainerYardsApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive container yard - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ContainerYardsAcl.canUseUnarchive()); - return ContainerYardsApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update container yard - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { ContainerYardsModels.UpdateContainerYardRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ContainerYardsApi.update, - { id: string; data: ContainerYardsModels.UpdateContainerYardRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(ContainerYardsAcl.canUseUpdate()); - return ContainerYardsApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get container yard - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUseFindById()); - return ContainerYardsApi.findById(id, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/controlTowerAuth/controlTowerAuth.api.ts b/test/generated/dist/controlTowerAuth/controlTowerAuth.api.ts deleted file mode 100644 index 301befe..0000000 --- a/test/generated/dist/controlTowerAuth/controlTowerAuth.api.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerAuthModels } from "./controlTowerAuth.models"; - -export namespace ControlTowerAuthApi { - export const login = (data: ControlTowerAuthModels.LoginRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, - `/auth/move/login`, - ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), - config, - ); - }; - export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, - `/auth/reset-password`, - ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/controlTowerAuth/controlTowerAuth.models.ts b/test/generated/dist/controlTowerAuth/controlTowerAuth.models.ts deleted file mode 100644 index 797b408..0000000 --- a/test/generated/dist/controlTowerAuth/controlTowerAuth.models.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerAuthModels { - /** - * LoginRequestDtoSchema - * @type { object } - * @property { string } username - * @property { string } password - */ - export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }).readonly(); - export type LoginRequestDto = z.infer; - - /** - * LoginResponseDtoSchema - * @type { object } - * @property { string } accessToken - * @property { boolean } resetPasswordRequired - * @property { string } passwordResetToken - * @property { string } username - */ - export const LoginResponseDtoSchema = z - .object({ - accessToken: z.string().nullable(), - resetPasswordRequired: z.boolean().nullish(), - passwordResetToken: z.string().nullish(), - username: z.string().nullish(), - }) - .readonly(); - export type LoginResponseDto = z.infer; - - /** - * PasswordResetDtoSchema - * @type { object } - * @property { string } password - * @property { string } username - * @property { string } token - */ - export const PasswordResetDtoSchema = z - .object({ password: z.string(), username: z.string(), token: z.string() }) - .readonly(); - export type PasswordResetDto = z.infer; -} diff --git a/test/generated/dist/controlTowerAuth/controlTowerAuth.queries.ts b/test/generated/dist/controlTowerAuth/controlTowerAuth.queries.ts deleted file mode 100644 index db1fe88..0000000 --- a/test/generated/dist/controlTowerAuth/controlTowerAuth.queries.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerAuthModels } from "./controlTowerAuth.models"; -import { ControlTowerAuthApi } from "./controlTowerAuth.api"; - -export namespace ControlTowerAuthQueries { - export const moduleName = QueryModule.ControlTowerAuth; - - /** - * Mutation `useLogin` - * @description Returns an access token to authenticate for protected endpoints - * @param { ControlTowerAuthModels.LoginRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 400, 401] - */ - export const useLogin = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => ControlTowerAuthApi.login(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useResetPassword` - * @description Resets the password for the requesting user - * @param { ControlTowerAuthModels.PasswordResetDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 400, 401] - */ - export const useResetPassword = ( - options?: AppMutationOptions< - typeof ControlTowerAuthApi.resetPassword, - { data: ControlTowerAuthModels.PasswordResetDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => ControlTowerAuthApi.resetPassword(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/controlTowerBookings/controlTowerBookings.api.ts b/test/generated/dist/controlTowerBookings/controlTowerBookings.api.ts deleted file mode 100644 index 25bc9dd..0000000 --- a/test/generated/dist/controlTowerBookings/controlTowerBookings.api.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; - -export namespace ControlTowerBookingsApi { - export const findAll = ( - limit: number, - order?: string, - filter?: ControlTowerBookingsModels.BookingFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, - `/bookings`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, - `/bookings/${id}`, - config, - ); - }; - export const findPackageById = (packageId: string, bookingId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, - `/bookings/${bookingId}/packages/${packageId}`, - config, - ); - }; -} diff --git a/test/generated/dist/controlTowerBookings/controlTowerBookings.configs.ts b/test/generated/dist/controlTowerBookings/controlTowerBookings.configs.ts deleted file mode 100644 index 93c0533..0000000 --- a/test/generated/dist/controlTowerBookings/controlTowerBookings.configs.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; -import { ControlTowerBookingsQueries } from "./controlTowerBookings.queries"; - -export namespace ControlTowerBookingsConfigs { - export const bookingsConfig = { - meta: { - title: "Bookings", - }, - readAll: { - schema: ControlTowerBookingsModels.BookingListItemDtoSchema, - paginated: ControlTowerBookingsQueries.useFindAll, - infinite: ControlTowerBookingsQueries.useFindAllInfinite, - filters: { - schema: ControlTowerBookingsModels.BookingFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerBookingsModels.BookingFilterDtoSchema, - options: { - inputs: { - projectId: true, - search: true, - companyIds: true, - purchaseOrderId: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: ControlTowerBookingsModels.BookingListItemDtoSchema, - options: { - columns: { - id: true, - bookingNumber: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema, - }, - }), - }, - read: { - schema: ControlTowerBookingsModels.BookingResponseDtoSchema, - query: ControlTowerBookingsQueries.useFindById, - }, - }; -} diff --git a/test/generated/dist/controlTowerBookings/controlTowerBookings.models.ts b/test/generated/dist/controlTowerBookings/controlTowerBookings.models.ts deleted file mode 100644 index 011e334..0000000 --- a/test/generated/dist/controlTowerBookings/controlTowerBookings.models.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerBookingsModels { - /** - * BookingListItemDtoSchema - * @type { object } - * @property { string } id - * @property { string } bookingNumber - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ - export const BookingListItemDtoSchema = z - .object({ - id: z.string(), - bookingNumber: z.string().nullable(), - ets: z.iso.datetime({ offset: true }).nullable(), - eta: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - }) - .readonly(); - export type BookingListItemDto = z.infer; - - /** - * BookingContainerDtoSchema - * @type { object } - * @property { string } id - * @property { string } containerNumber - * @property { string } type - * @property { string } loadType - * @property { string } stuffedInContainer - * @property { string[] } hsCode - * @property { number } noS - * @property { number } weight - * @property { string } lastEventLocation - * @property { string } lastEventName - * @property { string } lastEventDate - * @property { string } seals - */ - export const BookingContainerDtoSchema = z - .object({ - id: z.string(), - containerNumber: z.string().nullable(), - type: z.string().nullable(), - loadType: z.string().nullable(), - stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), - hsCode: z.array(z.string()).readonly().nullable(), - noS: z.number().nullable(), - weight: z.number().nullable(), - lastEventLocation: z.string().nullable(), - lastEventName: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - seals: z.string().nullable(), - }) - .readonly(); - export type BookingContainerDto = z.infer; - - /** - * BookingPackageDtoSchema - * @type { object } - * @property { string } id - * @property { string } packageNumber - * @property { string } containerNumber - * @property { string } type - * @property { string } description - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - */ - export const BookingPackageDtoSchema = z - .object({ - id: z.string(), - packageNumber: z.string(), - containerNumber: z.string().nullable(), - type: z.string().nullable(), - description: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - }) - .readonly(); - export type BookingPackageDto = z.infer; - - /** - * BookingResponseDtoSchema - * @type { object } - * @property { string } bookingNumber - * @property { string } ets - * @property { string } etaPod - * @property { string } etaFinalDeliveryPlace - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } destination - * @property { string } lastEvent - * @property { string[] } files - * @property { string } poNumber - * @property { string } blNumber - * @property { BookingContainerDto[] } containers - * @property { BookingPackageDto[] } packages - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - * @property { string } id - */ - export const BookingResponseDtoSchema = z - .object({ - bookingNumber: z.string().nullable(), - ets: z.iso.datetime({ offset: true }).nullable(), - etaPod: z.iso.datetime({ offset: true }).nullable(), - etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - destination: z.string().nullable(), - lastEvent: z.string().nullable(), - files: z.array(z.string()).readonly().nullable(), - poNumber: z.string().nullable(), - blNumber: z.string().nullable(), - containers: z.array(BookingContainerDtoSchema).readonly().nullish(), - packages: z.array(BookingPackageDtoSchema).readonly().nullish(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - id: z.string(), - }) - .readonly(); - export type BookingResponseDto = z.infer; - - /** - * PackageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } poNumber - * @property { string } bookingNumber - * @property { string } blNumber - * @property { string } containerNumber - * @property { string } packageNumber - * @property { string } description - * @property { number } netWeight - * @property { number } grossWeight - * @property { number } length - * @property { number } width - * @property { number } height - * @property { number } volume - * @property { string } storageInstruction - * @property { string } destination - * @property { string[] } files - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ - export const PackageResponseDtoSchema = z - .object({ - id: z.string(), - poNumber: z.string().nullable(), - bookingNumber: z.string().nullable(), - blNumber: z.string().nullable(), - containerNumber: z.string().nullable(), - packageNumber: z.string().nullable(), - description: z.string().nullable(), - netWeight: z.number().nullable(), - grossWeight: z.number().nullable(), - length: z.number().nullable(), - width: z.number().nullable(), - height: z.number().nullable(), - volume: z.number().nullable(), - storageInstruction: z.string().nullable(), - destination: z.string().nullable(), - files: z.array(z.string()).readonly().nullable(), - ets: z.iso.datetime({ offset: true }).nullable(), - eta: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - }) - .readonly(); - export type PackageResponseDto = z.infer; - - /** - * BookingFilterDtoSchema - * @type { object } - * @property { string } projectId - * @property { string } search Min Length: `1` - * @property { string[] } companyIds - * @property { string } purchaseOrderId - */ - export const BookingFilterDtoSchema = z - .object({ - projectId: z.string(), - search: z.string().min(1), - companyIds: z.array(z.string()).readonly(), - purchaseOrderId: z.string(), - }) - .readonly(); - export type BookingFilterDto = z.infer; - - /** - * ControlTowerBookingsFindAllOrderParamEnumSchema - * @type { enum } - */ - export const ControlTowerBookingsFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); - export type ControlTowerBookingsFindAllOrderParamEnum = z.infer< - typeof ControlTowerBookingsFindAllOrderParamEnumSchema - >; - export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFindAllOrderParamEnumSchema.enum; - - /** - * ControlTowerBookingsFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookingListItemDto[] } items - */ - export const ControlTowerBookingsFindAllResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(BookingListItemDtoSchema).readonly() }).readonly().shape, - }); - export type ControlTowerBookingsFindAllResponse = z.infer; -} diff --git a/test/generated/dist/controlTowerBookings/controlTowerBookings.queries.ts b/test/generated/dist/controlTowerBookings/controlTowerBookings.queries.ts deleted file mode 100644 index 491a3af..0000000 --- a/test/generated/dist/controlTowerBookings/controlTowerBookings.queries.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; -import { ControlTowerBookingsApi } from "./controlTowerBookings.api"; - -export namespace ControlTowerBookingsQueries { - export const moduleName = QueryModule.ControlTowerBookings; - - export const keys = { - all: [moduleName] as const, - findAll: ( - limit?: number, - order?: string, - filter?: ControlTowerBookingsModels.BookingFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/bookings", limit, order, filter, page, cursor] as const, - findAllInfinite: ( - limit?: number, - order?: string, - filter?: ControlTowerBookingsModels.BookingFilterDto, - cursor?: string, - ) => [...keys.all, "/bookings", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/bookings/:id", id] as const, - findPackageById: (packageId: string, bookingId: string) => - [...keys.all, "/bookings/:bookingId/packages/:packageId", packageId, bookingId] as const, - }; - - /** - * Query `useFindAll` - * @summary Get all accessible bookings for the customer - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ControlTowerBookingsModels.BookingFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor, config), - ...options, - }); - }; - - /** - * Infinite query `useFindAllInfinite - * @summary Get all accessible bookings for the customer - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ControlTowerBookingsModels.BookingFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @description Returns a booking with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => ControlTowerBookingsApi.findById(id, config), - ...options, - }); - }; - - /** - * Query `useFindPackageById` - * @description Returns a package with the specified id - * @param { string } object.packageId Path parameter - * @param { string } object.bookingId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindPackageById = ( - { packageId, bookingId }: { packageId: string; bookingId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findPackageById(packageId, bookingId), - queryFn: () => ControlTowerBookingsApi.findPackageById(packageId, bookingId, config), - ...options, - }); - }; -} diff --git a/test/generated/dist/controlTowerCalendar/controlTowerCalendar.api.ts b/test/generated/dist/controlTowerCalendar/controlTowerCalendar.api.ts deleted file mode 100644 index 5889980..0000000 --- a/test/generated/dist/controlTowerCalendar/controlTowerCalendar.api.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; - -export namespace ControlTowerCalendarApi { - export const getCalendar = ( - from: string, - to: string, - type: ControlTowerCalendarModels.CalendarTypeEnum, - search?: string, - poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, - containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, - bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, `/calendar`, { - ...config, - params: { - from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), - to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), - type: ZodExtended.parse(ControlTowerCalendarModels.CalendarTypeEnumSchema, type, { - type: "query", - name: "type", - }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - poNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarPoNumbersParamSchema.optional(), poNumbers, { - type: "query", - name: "poNumbers", - }), - containerNumbers: ZodExtended.parse( - ControlTowerCalendarModels.GetCalendarContainerNumbersParamSchema.optional(), - containerNumbers, - { type: "query", name: "containerNumbers" }, - ), - bookingNumbers: ZodExtended.parse( - ControlTowerCalendarModels.GetCalendarBookingNumbersParamSchema.optional(), - bookingNumbers, - { type: "query", name: "bookingNumbers" }, - ), - }, - }); - }; -} diff --git a/test/generated/dist/controlTowerCalendar/controlTowerCalendar.models.ts b/test/generated/dist/controlTowerCalendar/controlTowerCalendar.models.ts deleted file mode 100644 index 9659a01..0000000 --- a/test/generated/dist/controlTowerCalendar/controlTowerCalendar.models.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerCalendarModels { - /** - * EventRelationTypeEnumSchema - * @type { enum } - */ - export const EventRelationTypeEnumSchema = z.enum(["Booking", "Container", "PurchaseOrder"]); - export type EventRelationTypeEnum = z.infer; - export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; - - /** - * CalendarEventRelationDtoSchema - * @type { object } - * @property { EventRelationTypeEnum } type - * @property { string } id - * @property { string } number - */ - export const CalendarEventRelationDtoSchema = z - .object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }) - .readonly(); - export type CalendarEventRelationDto = z.infer; - - /** - * CalendarTypeEnumSchema - * @type { enum } - */ - export const CalendarTypeEnumSchema = z.enum(["PurchaseOrder", "Booking", "Container", "Package"]); - export type CalendarTypeEnum = z.infer; - export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; - - /** - * CalendarEventDtoSchema - * @type { object } - * @property { string } entityId - * @property { string } entityNumber - * @property { CalendarTypeEnum } entityType - * @property { string } date - * @property { string } title - * @property { CalendarEventRelationDto[] } relations - */ - export const CalendarEventDtoSchema = z - .object({ - entityId: z.string(), - entityNumber: z.string(), - entityType: CalendarTypeEnumSchema, - date: z.iso.datetime({ offset: true }), - title: z.string(), - relations: z.array(CalendarEventRelationDtoSchema).readonly(), - }) - .readonly(); - export type CalendarEventDto = z.infer; - - /** - * FiltersDtoSchema - * @type { object } - * @property { string[] } poNumbers - * @property { string[] } bookingNumbers - * @property { string[] } containerNumbers - */ - export const FiltersDtoSchema = z - .object({ - poNumbers: z.array(z.string()).readonly(), - bookingNumbers: z.array(z.string()).readonly(), - containerNumbers: z.array(z.string()).readonly(), - }) - .readonly(); - export type FiltersDto = z.infer; - - /** - * CalendarDtoSchema - * @type { object } - * @property { CalendarEventDto[] } events - * @property { FiltersDto } filters - */ - export const CalendarDtoSchema = z - .object({ events: z.array(CalendarEventDtoSchema).readonly(), filters: FiltersDtoSchema }) - .readonly(); - export type CalendarDto = z.infer; - - /** - * CalendarResponseDtoSchema - * @type { object } - * @property { CalendarDto } data - */ - export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }).readonly(); - export type CalendarResponseDto = z.infer; - - /** - * GetCalendarPoNumbersParamSchema - * @type { array } - */ - export const GetCalendarPoNumbersParamSchema = z.array(z.string()).readonly().nullish(); - export type GetCalendarPoNumbersParam = z.infer; - - /** - * GetCalendarContainerNumbersParamSchema - * @type { array } - */ - export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).readonly().nullish(); - export type GetCalendarContainerNumbersParam = z.infer; - - /** - * GetCalendarBookingNumbersParamSchema - * @type { array } - */ - export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).readonly().nullish(); - export type GetCalendarBookingNumbersParam = z.infer; -} diff --git a/test/generated/dist/controlTowerCalendar/controlTowerCalendar.queries.ts b/test/generated/dist/controlTowerCalendar/controlTowerCalendar.queries.ts deleted file mode 100644 index e49a9d2..0000000 --- a/test/generated/dist/controlTowerCalendar/controlTowerCalendar.queries.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; -import { ControlTowerCalendarApi } from "./controlTowerCalendar.api"; - -export namespace ControlTowerCalendarQueries { - export const moduleName = QueryModule.ControlTowerCalendar; - - export const keys = { - all: [moduleName] as const, - getCalendar: ( - from?: string, - to?: string, - type?: ControlTowerCalendarModels.CalendarTypeEnum, - search?: string, - poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, - containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, - bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, - ) => [...keys.all, "/calendar", from, to, type, search, poNumbers, containerNumbers, bookingNumbers] as const, - }; - - /** - * Query `useGetCalendar` - * @param { string } object.from Query parameter - * @param { string } object.to Query parameter - * @param { ControlTowerCalendarModels.CalendarTypeEnum } object.type Query parameter - * @param { string } object.search Query parameter - * @param { ControlTowerCalendarModels.GetCalendarPoNumbersParam } object.poNumbers Query parameter - * @param { ControlTowerCalendarModels.GetCalendarContainerNumbersParam } object.containerNumbers Query parameter - * @param { ControlTowerCalendarModels.GetCalendarBookingNumbersParam } object.bookingNumbers Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCalendar = ( - { - from, - to, - type, - search, - poNumbers, - containerNumbers, - bookingNumbers, - }: { - from: string; - to: string; - type: ControlTowerCalendarModels.CalendarTypeEnum; - search?: string; - poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam; - containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam; - bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), - queryFn: () => - ControlTowerCalendarApi.getCalendar( - from, - to, - type, - search, - poNumbers, - containerNumbers, - bookingNumbers, - config, - ), - ...options, - }); - }; -} diff --git a/test/generated/dist/controlTowerContainers/controlTowerContainers.api.ts b/test/generated/dist/controlTowerContainers/controlTowerContainers.api.ts deleted file mode 100644 index 444147a..0000000 --- a/test/generated/dist/controlTowerContainers/controlTowerContainers.api.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; - -export namespace ControlTowerContainersApi { - export const findAll = ( - limit: number, - order?: string, - filter?: ControlTowerContainersModels.ContainerFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, - `/containers`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, - `/containers/${id}`, - config, - ); - }; - export const getJourney = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, - `/containers/${id}/journey`, - config, - ); - }; -} diff --git a/test/generated/dist/controlTowerContainers/controlTowerContainers.configs.ts b/test/generated/dist/controlTowerContainers/controlTowerContainers.configs.ts deleted file mode 100644 index 79e4a85..0000000 --- a/test/generated/dist/controlTowerContainers/controlTowerContainers.configs.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; -import { ControlTowerContainersQueries } from "./controlTowerContainers.queries"; - -export namespace ControlTowerContainersConfigs { - export const containersConfig = { - meta: { - title: "Containers", - }, - readAll: { - schema: ControlTowerContainersModels.ContainerListItemDtoSchema, - paginated: ControlTowerContainersQueries.useFindAll, - infinite: ControlTowerContainersQueries.useFindAllInfinite, - filters: { - schema: ControlTowerContainersModels.ContainerFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerContainersModels.ContainerFilterDtoSchema, - options: { - inputs: { - companyIds: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: ControlTowerContainersModels.ContainerListItemDtoSchema, - options: { - columns: { - containerNumber: true, - id: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, - }, - }), - }, - read: { - schema: ControlTowerContainersModels.ContainerResponseDtoSchema, - query: ControlTowerContainersQueries.useFindById, - }, - }; -} diff --git a/test/generated/dist/controlTowerContainers/controlTowerContainers.models.ts b/test/generated/dist/controlTowerContainers/controlTowerContainers.models.ts deleted file mode 100644 index 8b5f4ff..0000000 --- a/test/generated/dist/controlTowerContainers/controlTowerContainers.models.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerContainersModels { - /** - * ContainerListItemDtoSchema - * @type { object } - * @property { string } containerNumber - * @property { string } id - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ - export const ContainerListItemDtoSchema = z - .object({ - containerNumber: z.string().nullable(), - id: z.string(), - ets: z.iso.datetime({ offset: true }).nullable(), - eta: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - }) - .readonly(); - export type ContainerListItemDto = z.infer; - - /** - * ContainerEventDtoSchema - * @type { object } - * @property { CommonModels.VesselDto } vessel - * @property { string } name - * @property { string } date - * @property { boolean } checkedIn - */ - export const ContainerEventDtoSchema = z - .object({ - vessel: CommonModels.VesselDtoSchema.nullable(), - name: z.string(), - date: z.iso.datetime({ offset: true }).nullable(), - checkedIn: z.boolean(), - }) - .readonly(); - export type ContainerEventDto = z.infer; - - /** - * ContainerJourneyDtoSchema - * @type { object } - * @property { string } id - * @property { string } country - * @property { string } terminal - * @property { boolean } checkedIn - * @property { ContainerEventDto[] } events - */ - export const ContainerJourneyDtoSchema = z - .object({ - id: z.string(), - country: z.string().nullable(), - terminal: z.string().nullable(), - checkedIn: z.boolean(), - events: z.array(ContainerEventDtoSchema).readonly(), - }) - .readonly(); - export type ContainerJourneyDto = z.infer; - - /** - * PackageNumberDtoSchema - * @type { object } - * @property { string } id - * @property { string } type - * @property { string } description - */ - export const PackageNumberDtoSchema = z - .object({ id: z.string(), type: z.string().nullable(), description: z.string() }) - .readonly(); - export type PackageNumberDto = z.infer; - - /** - * ContainerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } containerNumber - * @property { string } poNumber - * @property { string } bookingNumber - * @property { string } blNumber - * @property { string } stuffedInContainer - * @property { string } containerType - * @property { string } loadType - * @property { string[] } hsCode - * @property { number } totalVolume - * @property { number } totalWeight - * @property { string } cargoDescription - * @property { number } noS - * @property { ContainerJourneyDto[] } journeys - * @property { PackageNumberDto[] } packages - * @property { string } bookingId - * @property { string } destination - * @property { string[] } files - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ - export const ContainerResponseDtoSchema = z - .object({ - id: z.string(), - containerNumber: z.string().nullable(), - poNumber: z.string().nullable(), - bookingNumber: z.string().nullable(), - blNumber: z.string().nullable(), - stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), - containerType: z.string().nullable(), - loadType: z.string().nullable(), - hsCode: z.array(z.string()).readonly().nullable(), - totalVolume: z.number().nullable(), - totalWeight: z.number().nullable(), - cargoDescription: z.string().nullable(), - noS: z.number().nullable(), - journeys: z.array(ContainerJourneyDtoSchema).readonly().nullish(), - packages: z.array(PackageNumberDtoSchema).readonly().nullish(), - bookingId: z.string().nullable(), - destination: z.string().nullable(), - files: z.array(z.string()).readonly().nullable(), - ets: z.iso.datetime({ offset: true }).nullable(), - eta: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - }) - .readonly(); - export type ContainerResponseDto = z.infer; - - /** - * ContainerJourneyResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { ContainerJourneyDto[] } journeys - * @property { string[] } packageNumbers - */ - export const ContainerJourneyResponseDtoSchema = z - .object({ - id: z.string(), - number: z.string(), - journeys: z.array(ContainerJourneyDtoSchema).readonly(), - packageNumbers: z.array(z.string()).readonly(), - }) - .readonly(); - export type ContainerJourneyResponseDto = z.infer; - - /** - * ContainerFilterDtoSchema - * @type { object } - * @property { number[] } companyIds - * @property { string } search - */ - export const ContainerFilterDtoSchema = z - .object({ companyIds: z.array(z.number()).readonly(), search: z.string() }) - .readonly(); - export type ContainerFilterDto = z.infer; - - /** - * ControlTowerContainersFindAllOrderParamEnumSchema - * @type { enum } - */ - export const ControlTowerContainersFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); - export type ControlTowerContainersFindAllOrderParamEnum = z.infer< - typeof ControlTowerContainersFindAllOrderParamEnumSchema - >; - export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainersFindAllOrderParamEnumSchema.enum; - - /** - * ControlTowerContainersFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ContainerListItemDto[] } items - */ - export const ControlTowerContainersFindAllResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ContainerListItemDtoSchema).readonly() }).readonly().shape, - }); - export type ControlTowerContainersFindAllResponse = z.infer; -} diff --git a/test/generated/dist/controlTowerContainers/controlTowerContainers.queries.ts b/test/generated/dist/controlTowerContainers/controlTowerContainers.queries.ts deleted file mode 100644 index 138e21d..0000000 --- a/test/generated/dist/controlTowerContainers/controlTowerContainers.queries.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; -import { ControlTowerContainersApi } from "./controlTowerContainers.api"; - -export namespace ControlTowerContainersQueries { - export const moduleName = QueryModule.ControlTowerContainers; - - export const keys = { - all: [moduleName] as const, - findAll: ( - limit?: number, - order?: string, - filter?: ControlTowerContainersModels.ContainerFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/containers", limit, order, filter, page, cursor] as const, - findAllInfinite: ( - limit?: number, - order?: string, - filter?: ControlTowerContainersModels.ContainerFilterDto, - cursor?: string, - ) => [...keys.all, "/containers", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/containers/:id", id] as const, - getJourney: (id: string) => [...keys.all, "/containers/:id/journey", id] as const, - }; - - /** - * Query `useFindAll` - * @description Lists containers - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ControlTowerContainersModels.ContainerFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => ControlTowerContainersApi.findAll(limit, order, filter, page, cursor, config), - ...options, - }); - }; - - /** - * Infinite query `useFindAllInfinite - * @description Lists containers - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ControlTowerContainersModels.ContainerFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @description Returns a container with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => ControlTowerContainersApi.findById(id, config), - ...options, - }); - }; - - /** - * Query `useGetJourney` - * @description Returns the journey and package numbers of a container with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetJourney = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getJourney(id), - queryFn: () => ControlTowerContainersApi.getJourney(id, config), - ...options, - }); - }; -} diff --git a/test/generated/dist/controlTowerMe/controlTowerMe.api.ts b/test/generated/dist/controlTowerMe/controlTowerMe.api.ts deleted file mode 100644 index 07b2631..0000000 --- a/test/generated/dist/controlTowerMe/controlTowerMe.api.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerMeModels } from "./controlTowerMe.models"; - -export namespace ControlTowerMeApi { - export const getUserProfile = (config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, `/me`, config); - }; - export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, - `/me`, - ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), - config, - ); - }; - export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, - `/me/basic`, - ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), - config, - ); - }; - export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/password`, - ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), - config, - ); - }; - export const updateEmailPreferences = ( - data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/email-preferences`, - ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), - config, - ); - }; - export const updateProjectAccess = (config?: AxiosRequestConfig) => { - return AppRestClient.put({ resSchema: z.void() }, `/me/access`, undefined, config); - }; -} diff --git a/test/generated/dist/controlTowerMe/controlTowerMe.models.ts b/test/generated/dist/controlTowerMe/controlTowerMe.models.ts deleted file mode 100644 index 9b37d77..0000000 --- a/test/generated/dist/controlTowerMe/controlTowerMe.models.ts +++ /dev/null @@ -1,225 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerMeModels { - /** - * LinksDtoSchema - * @type { object } - * @property { string } self - * @property { string } related - */ - export const LinksDtoSchema = z.object({ self: z.string(), related: z.string() }).readonly(); - export type LinksDto = z.infer; - - /** - * ApiResponseDataDtoSchema - * @type { object } - * @property { string } type - * @property { string } id - * @property { object } attributes - * @property { object } relationships - * @property { LinksDto } links - */ - export const ApiResponseDataDtoSchema = z - .object({ - type: z.string(), - id: z.string(), - attributes: z.object({}).readonly().nullish(), - relationships: z.object({}).readonly().nullish(), - links: LinksDtoSchema.nullish(), - }) - .readonly(); - export type ApiResponseDataDto = z.infer; - - /** - * PaginationLinksDtoSchema - * @type { object } - * @property { string } next - * @property { string } self - * @property { string } last - */ - export const PaginationLinksDtoSchema = z.object({ next: z.string(), self: z.string(), last: z.string() }).readonly(); - export type PaginationLinksDto = z.infer; - - /** - * ApiResponseDtoSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - */ - export const ApiResponseDtoSchema = z - .object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }) - .readonly(); - export type ApiResponseDto = z.infer; - - /** - * DelayNotificationEnumSchema - * @type { enum } - */ - export const DelayNotificationEnumSchema = z.enum(["EveryDelay", "LongerThan24Hours", "LongerThan3Days"]); - export type DelayNotificationEnum = z.infer; - export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; - - /** - * UserEmailPreferencesDtoSchema - * @type { object } - * @property { boolean } originDeparture - * @property { boolean } loadedOnVessel - * @property { boolean } destinationArrival - * @property { boolean } onsiteDelivery - * @property { DelayNotificationEnum } delay - */ - export const UserEmailPreferencesDtoSchema = z - .object({ - originDeparture: z.boolean(), - loadedOnVessel: z.boolean(), - destinationArrival: z.boolean(), - onsiteDelivery: z.boolean(), - delay: DelayNotificationEnumSchema, - }) - .readonly(); - export type UserEmailPreferencesDto = z.infer; - - /** - * UserProjectAccessDtoSchema - * @type { object } - * @property { string[] } projectIds - */ - export const UserProjectAccessDtoSchema = z.object({ projectIds: z.array(z.string()).readonly() }).readonly(); - export type UserProjectAccessDto = z.infer; - - /** - * UserRoleEnumSchema - * @type { enum } - */ - export const UserRoleEnumSchema = z.enum(["User", "Admin"]); - export type UserRoleEnum = z.infer; - export const UserRoleEnum = UserRoleEnumSchema.enum; - - /** - * UserDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } name Min Length: `3` - * @property { string } email - * @property { UserEmailPreferencesDto } emailPreferences - * @property { UserProjectAccessDto } projectAccess - * @property { UserRoleEnum } role - * @property { boolean } isAdmin - */ - export const UserDetailDtoSchema = z - .object({ - id: z.string(), - name: z.string().min(3), - email: z.email(), - emailPreferences: UserEmailPreferencesDtoSchema.nullable(), - projectAccess: UserProjectAccessDtoSchema.nullable(), - role: UserRoleEnumSchema.nullable(), - isAdmin: z.boolean(), - }) - .readonly(); - export type UserDetailDto = z.infer; - - /** - * UserEmailPreferencesUpdateDtoSchema - * @type { object } - * @property { boolean } originDeparture - * @property { boolean } loadedOnVessel - * @property { boolean } destinationArrival - * @property { boolean } onsiteDelivery - * @property { DelayNotificationEnum } delay - */ - export const UserEmailPreferencesUpdateDtoSchema = z - .object({ - originDeparture: z.boolean(), - loadedOnVessel: z.boolean(), - destinationArrival: z.boolean(), - onsiteDelivery: z.boolean(), - delay: DelayNotificationEnumSchema, - }) - .readonly(); - export type UserEmailPreferencesUpdateDto = z.infer; - - /** - * UserProjectAccessUpdateDtoSchema - * @type { object } - * @property { number[] } projectIds - */ - export const UserProjectAccessUpdateDtoSchema = z.object({ projectIds: z.array(z.number()).readonly() }).readonly(); - export type UserProjectAccessUpdateDto = z.infer; - - /** - * UserUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } password - * @property { UserEmailPreferencesUpdateDto } emailPreferences - * @property { UserProjectAccessUpdateDto } projectAccess - */ - export const UserUpdateDtoSchema = z - .object({ - name: z.string(), - email: z.email(), - password: z.string(), - emailPreferences: UserEmailPreferencesUpdateDtoSchema, - projectAccess: UserProjectAccessUpdateDtoSchema, - }) - .readonly(); - export type UserUpdateDto = z.infer; - - /** - * UserBasicUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - */ - export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }).readonly(); - export type UserBasicUpdateDto = z.infer; - - /** - * UserPasswordUpdateDtoSchema - * @type { object } - * @property { string } password - */ - export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }).readonly(); - export type UserPasswordUpdateDto = z.infer; - - /** - * GetUserProfileResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ - export const GetUserProfileResponseSchema = z.object({ - ...ApiResponseDtoSchema.shape, - ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, - }); - export type GetUserProfileResponse = z.infer; - - /** - * UpdateUserDataResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ - export const UpdateUserDataResponseSchema = z.object({ - ...ApiResponseDtoSchema.shape, - ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, - }); - export type UpdateUserDataResponse = z.infer; - - /** - * UpdateUserProfileResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ - export const UpdateUserProfileResponseSchema = z.object({ - ...ApiResponseDtoSchema.shape, - ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape, - }); - export type UpdateUserProfileResponse = z.infer; -} diff --git a/test/generated/dist/controlTowerMe/controlTowerMe.queries.ts b/test/generated/dist/controlTowerMe/controlTowerMe.queries.ts deleted file mode 100644 index 9b5825c..0000000 --- a/test/generated/dist/controlTowerMe/controlTowerMe.queries.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerMeModels } from "./controlTowerMe.models"; -import { ControlTowerMeApi } from "./controlTowerMe.api"; - -export namespace ControlTowerMeQueries { - export const moduleName = QueryModule.ControlTowerMe; - - export const keys = { - all: [moduleName] as const, - getUserProfile: () => [...keys.all, "/me"] as const, - }; - - /** - * Query `useGetUserProfile` - * @description Get basic user profile data - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200] - */ - export const useGetUserProfile = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getUserProfile(), - queryFn: () => ControlTowerMeApi.getUserProfile(config), - ...options, - }); - }; - - /** - * Mutation `useUpdateUserData` - * @description Update user data - * @param { ControlTowerMeModels.UserUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ - export const useUpdateUserData = ( - options?: AppMutationOptions< - typeof ControlTowerMeApi.updateUserData, - { data: ControlTowerMeModels.UserUpdateDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => ControlTowerMeApi.updateUserData(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateUserProfile` - * @description Update basic user profile data - * @param { ControlTowerMeModels.UserBasicUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ - export const useUpdateUserProfile = ( - options?: AppMutationOptions< - typeof ControlTowerMeApi.updateUserProfile, - { data: ControlTowerMeModels.UserBasicUpdateDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => ControlTowerMeApi.updateUserProfile(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdatePassword` - * @description Update user password - * @param { ControlTowerMeModels.UserPasswordUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ - export const useUpdatePassword = ( - options?: AppMutationOptions< - typeof ControlTowerMeApi.updatePassword, - { data: ControlTowerMeModels.UserPasswordUpdateDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => ControlTowerMeApi.updatePassword(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateEmailPreferences` - * @description Update user email notification preferences - * @param { ControlTowerMeModels.UserEmailPreferencesUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ - export const useUpdateEmailPreferences = ( - options?: AppMutationOptions< - typeof ControlTowerMeApi.updateEmailPreferences, - { data: ControlTowerMeModels.UserEmailPreferencesUpdateDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => ControlTowerMeApi.updateEmailPreferences(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateProjectAccess` - * @description Update user project access - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ - export const useUpdateProjectAccess = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: () => ControlTowerMeApi.updateProjectAccess(config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/controlTowerPackages/controlTowerPackages.api.ts b/test/generated/dist/controlTowerPackages/controlTowerPackages.api.ts deleted file mode 100644 index c98ec95..0000000 --- a/test/generated/dist/controlTowerPackages/controlTowerPackages.api.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; - -export namespace ControlTowerPackagesApi { - export const findAll = ( - limit: number, - order?: string, - filter?: ControlTowerPackagesModels.PackageFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, - `/packages`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; -} diff --git a/test/generated/dist/controlTowerPackages/controlTowerPackages.configs.ts b/test/generated/dist/controlTowerPackages/controlTowerPackages.configs.ts deleted file mode 100644 index ae15a46..0000000 --- a/test/generated/dist/controlTowerPackages/controlTowerPackages.configs.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; -import { ControlTowerPackagesQueries } from "./controlTowerPackages.queries"; - -export namespace ControlTowerPackagesConfigs { - export const packagesConfig = { - meta: { - title: "Packages", - }, - readAll: { - schema: ControlTowerPackagesModels.PackageListItemDtoSchema, - paginated: ControlTowerPackagesQueries.useFindAll, - infinite: ControlTowerPackagesQueries.useFindAllInfinite, - filters: { - schema: ControlTowerPackagesModels.PackageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerPackagesModels.PackageFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: ControlTowerPackagesModels.PackageListItemDtoSchema, - options: { - columns: { - packageNumber: true, - bookingId: true, - id: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/controlTowerPackages/controlTowerPackages.models.ts b/test/generated/dist/controlTowerPackages/controlTowerPackages.models.ts deleted file mode 100644 index d5f8c5a..0000000 --- a/test/generated/dist/controlTowerPackages/controlTowerPackages.models.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerPackagesModels { - /** - * PackageListItemDtoSchema - * @type { object } - * @property { string } packageNumber - * @property { string } bookingId - * @property { string } id - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ - export const PackageListItemDtoSchema = z - .object({ - packageNumber: z.string(), - bookingId: z.string(), - id: z.string(), - ets: z.iso.datetime({ offset: true }).nullable(), - eta: z.iso.datetime({ offset: true }).nullable(), - supplierName: z.string().nullable(), - supplierAddress: z.string().nullable(), - lastEvent: z.string().nullable(), - lastEventLocation: z.string().nullable(), - lastEventDate: z.iso.datetime({ offset: true }).nullable(), - journeyFrom: z.string().nullable(), - journeyTo: z.string().nullable(), - vessel: CommonModels.VesselDtoSchema.nullable(), - }) - .readonly(); - export type PackageListItemDto = z.infer; - - /** - * PackageFilterDtoSchema - * @type { object } - * @property { string } search Min Length: `1` - */ - export const PackageFilterDtoSchema = z.object({ search: z.string().min(1) }).readonly(); - export type PackageFilterDto = z.infer; - - /** - * ControlTowerPackagesFindAllOrderParamEnumSchema - * @type { enum } - */ - export const ControlTowerPackagesFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); - export type ControlTowerPackagesFindAllOrderParamEnum = z.infer< - typeof ControlTowerPackagesFindAllOrderParamEnumSchema - >; - export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFindAllOrderParamEnumSchema.enum; - - /** - * ControlTowerPackagesFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PackageListItemDto[] } items - */ - export const ControlTowerPackagesFindAllResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PackageListItemDtoSchema).readonly() }).readonly().shape, - }); - export type ControlTowerPackagesFindAllResponse = z.infer; -} diff --git a/test/generated/dist/controlTowerPackages/controlTowerPackages.queries.ts b/test/generated/dist/controlTowerPackages/controlTowerPackages.queries.ts deleted file mode 100644 index 9db4707..0000000 --- a/test/generated/dist/controlTowerPackages/controlTowerPackages.queries.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; -import { ControlTowerPackagesApi } from "./controlTowerPackages.api"; - -export namespace ControlTowerPackagesQueries { - export const moduleName = QueryModule.ControlTowerPackages; - - export const keys = { - all: [moduleName] as const, - findAll: ( - limit?: number, - order?: string, - filter?: ControlTowerPackagesModels.PackageFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/packages", limit, order, filter, page, cursor] as const, - findAllInfinite: ( - limit?: number, - order?: string, - filter?: ControlTowerPackagesModels.PackageFilterDto, - cursor?: string, - ) => [...keys.all, "/packages", "infinite", limit, order, filter, cursor] as const, - }; - - /** - * Query `useFindAll` - * @description Lists packages - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: ControlTowerPackagesModels.PackageFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor, config), - ...options, - }); - }; - - /** - * Infinite query `useFindAllInfinite - * @description Lists packages - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: ControlTowerPackagesModels.PackageFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/controlTowerSearch/controlTowerSearch.api.ts b/test/generated/dist/controlTowerSearch/controlTowerSearch.api.ts deleted file mode 100644 index 862a8ac..0000000 --- a/test/generated/dist/controlTowerSearch/controlTowerSearch.api.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerSearchModels } from "./controlTowerSearch.models"; - -export namespace ControlTowerSearchApi { - export const search = ( - data: ControlTowerSearchModels.SearchRequestDto, - type?: ControlTowerSearchModels.SearchItemTypeEnum, - limit?: number, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, - `/search`, - ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), - { - ...config, - params: { - type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { - type: "query", - name: "type", - }), - limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), - }, - }, - ); - }; -} diff --git a/test/generated/dist/controlTowerSearch/controlTowerSearch.models.ts b/test/generated/dist/controlTowerSearch/controlTowerSearch.models.ts deleted file mode 100644 index c66a4c7..0000000 --- a/test/generated/dist/controlTowerSearch/controlTowerSearch.models.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerSearchModels { - /** - * SearchItemTypeEnumSchema - * @type { enum } - */ - export const SearchItemTypeEnumSchema = z.enum(["Project", "Booking", "Container"]); - export type SearchItemTypeEnum = z.infer; - export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; - - /** - * SearchItemDtoSchema - * @type { object } - * @property { SearchItemTypeEnum } type - * @property { string } id - * @property { string } label - */ - export const SearchItemDtoSchema = z - .object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }) - .readonly(); - export type SearchItemDto = z.infer; - - /** - * SearchResponseDtoSchema - * @type { object } - * @property { SearchItemDto[] } items - * @property { number } projectsCount - * @property { number } bookingsCount - * @property { number } containersCount - * @property { number } totalCount - */ - export const SearchResponseDtoSchema = z - .object({ - items: z.array(SearchItemDtoSchema).readonly(), - projectsCount: z.number(), - bookingsCount: z.number(), - containersCount: z.number(), - totalCount: z.number(), - }) - .readonly(); - export type SearchResponseDto = z.infer; - - /** - * SearchRequestDtoSchema - * @type { object } - * @property { string } search - */ - export const SearchRequestDtoSchema = z.object({ search: z.string() }).readonly(); - export type SearchRequestDto = z.infer; -} diff --git a/test/generated/dist/controlTowerSearch/controlTowerSearch.queries.ts b/test/generated/dist/controlTowerSearch/controlTowerSearch.queries.ts deleted file mode 100644 index 2ee15d8..0000000 --- a/test/generated/dist/controlTowerSearch/controlTowerSearch.queries.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerSearchModels } from "./controlTowerSearch.models"; -import { ControlTowerSearchApi } from "./controlTowerSearch.api"; - -export namespace ControlTowerSearchQueries { - export const moduleName = QueryModule.ControlTowerSearch; - - /** - * Mutation `useSearch` - * @param { ControlTowerSearchModels.SearchRequestDto } mutation.data Body parameter - * @param { ControlTowerSearchModels.SearchItemTypeEnum } mutation.type Query parameter - * @param { number } mutation.limit Query parameter. Minimum: `1` - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useSearch = ( - options?: AppMutationOptions< - typeof ControlTowerSearchApi.search, - { - data: ControlTowerSearchModels.SearchRequestDto; - type?: ControlTowerSearchModels.SearchItemTypeEnum; - limit?: number; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data, type, limit }) => ControlTowerSearchApi.search(data, type, limit, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/countries/countries.acl.ts b/test/generated/dist/countries/countries.acl.ts deleted file mode 100644 index f8322d8..0000000 --- a/test/generated/dist/countries/countries.acl.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CountriesAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; - - /** - * Use for `usePaginateCountryLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCountryLabels` query - */ - export const canUsePaginateCountryLabels = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; - - /** - * Use for `useGetCountryById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCountryById` query - */ - export const canUseGetCountryById = () => ["Read", "Country"] as AbilityTuple<"Read", "Country">; -} diff --git a/test/generated/dist/countries/countries.api.ts b/test/generated/dist/countries/countries.api.ts deleted file mode 100644 index 4782b3e..0000000 --- a/test/generated/dist/countries/countries.api.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CountriesModels } from "./countries.models"; - -export namespace CountriesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CountriesModels.CountriesPaginateResponseSchema }, `/countries/paginate`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const paginateCountryLabels = ( - limit: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, - `/countries/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const getCountryById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: CountriesModels.CountryResponseDTOSchema }, `/countries/${id}`, config); - }; -} diff --git a/test/generated/dist/countries/countries.configs.ts b/test/generated/dist/countries/countries.configs.ts deleted file mode 100644 index 44ddf5b..0000000 --- a/test/generated/dist/countries/countries.configs.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CountriesModels } from "./countries.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CountriesQueries } from "./countries.queries"; -import { CountriesAcl } from "./countries.acl"; - -export namespace CountriesConfigs { - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CountriesAcl.canUsePaginate, - schema: CountriesModels.CountryResponseDTOSchema, - paginated: CountriesQueries.usePaginate, - infinite: CountriesQueries.usePaginateInfinite, - filters: { - schema: CountriesModels.CountryPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CountriesModels.CountryPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CountriesModels.CountryResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - isoCode2: true, - isoCode3: true, - currencyNotation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CountriesModels.CountriesPaginateOrderParamEnumSchema, - }, - }), - }, - }; - - export const labelsPaginateConfig = { - meta: { - title: "Labels Paginate", - }, - readAll: { - acl: CountriesAcl.canUsePaginateCountryLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CountriesQueries.usePaginateCountryLabels, - infinite: CountriesQueries.usePaginateCountryLabelsInfinite, - filters: { - schema: CountriesModels.CountryPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CountriesModels.CountryPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CountriesModels.PaginateCountryLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/countries/countries.models.ts b/test/generated/dist/countries/countries.models.ts deleted file mode 100644 index 50d14ae..0000000 --- a/test/generated/dist/countries/countries.models.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CountriesModels { - /** - * CountryEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CountryEmployeeDTO = z.infer; - - /** - * CountryResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the country - * @property { string } name Name of the country - * @property { string } isoCode2 ISO 2-letter code - * @property { string } isoCode3 ISO 3-letter code - * @property { string } currencyNotation Currency notation - * @property { string } createdById - * @property { CountryEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CountryEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const CountryResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the country"), - name: z.string().describe("Name of the country"), - isoCode2: z.string().describe("ISO 2-letter code"), - isoCode3: z.string().describe("ISO 3-letter code"), - currencyNotation: z.string().describe("Currency notation"), - createdById: z.string().nullish(), - createdBy: CountryEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: CountryEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type CountryResponseDTO = z.infer; - - /** - * CountryPaginationFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const CountryPaginationFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type CountryPaginationFilterDto = z.infer; - - /** - * CountriesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const CountriesPaginateOrderParamEnumSchema = z.enum([ - "name", - "isoCode2", - "isoCode3", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type CountriesPaginateOrderParamEnum = z.infer; - export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSchema.enum; - - /** - * CountriesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CountryResponseDTO[] } items - */ - export const CountriesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CountryResponseDTOSchema).readonly() }).readonly().shape, - }); - export type CountriesPaginateResponse = z.infer; - - /** - * PaginateCountryLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PaginateCountryLabelsOrderParamEnumSchema = z.enum([ - "name", - "isoCode2", - "isoCode3", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PaginateCountryLabelsOrderParamEnum = z.infer; - export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderParamEnumSchema.enum; - - /** - * PaginateCountryLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PaginateCountryLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PaginateCountryLabelsResponse = z.infer; -} diff --git a/test/generated/dist/countries/countries.queries.ts b/test/generated/dist/countries/countries.queries.ts deleted file mode 100644 index 437d0c0..0000000 --- a/test/generated/dist/countries/countries.queries.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CountriesAcl } from "./countries.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { CountriesModels } from "./countries.models"; -import { CountriesApi } from "./countries.api"; - -export namespace CountriesQueries { - export const moduleName = QueryModule.Countries; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/countries/paginate", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/countries/paginate", "infinite", limit, order, filter, cursor] as const, - paginateCountryLabels: ( - limit?: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/countries/labels/paginate", limit, order, filter, page, cursor] as const, - paginateCountryLabelsInfinite: ( - limit?: number, - order?: string, - filter?: CountriesModels.CountryPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/countries/labels/paginate", "infinite", limit, order, filter, cursor] as const, - getCountryById: (id: string) => [...keys.all, "/countries/:id", id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Countries - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CountriesModels.CountryPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Countries - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CountriesModels.CountryPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginateCountryLabels` - * @summary Paginate country labels (id and name only) - * @permission Requires `canUsePaginateCountryLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCountryLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CountriesModels.CountryPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateCountryLabelsInfinite - * @summary Paginate country labels (id and name only) - * @permission Requires `canUsePaginateCountryLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCountryLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CountriesModels.CountryPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useGetCountryById` - * @summary Get country by ID with complete details - * @permission Requires `canUseGetCountryById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCountryById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCountryById(id), - queryFn: () => { - checkAcl(CountriesAcl.canUseGetCountryById()); - return CountriesApi.getCountryById(id, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/currencies/currencies.acl.ts b/test/generated/dist/currencies/currencies.acl.ts deleted file mode 100644 index 6756e17..0000000 --- a/test/generated/dist/currencies/currencies.acl.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CurrenciesAcl { - /** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; - - /** - * Use for `useCreateCurrency` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCurrency` mutation - */ - export const canUseCreateCurrency = () => ["Create", "Currency"] as AbilityTuple<"Create", "Currency">; - - /** - * Use for `usePaginateCurrencyLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabels` query - */ - export const canUsePaginateCurrencyLabels = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; - - /** - * Use for `useGetCurrencyById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCurrencyById` query - */ - export const canUseGetCurrencyById = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; - - /** - * Use for `useUpdateCurrency` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCurrency` mutation - */ - export const canUseUpdateCurrency = () => ["Update", "Currency"] as AbilityTuple<"Update", "Currency">; - - /** - * Use for `usePaginateCurrencyLabelsByOffice` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabelsByOffice` query - */ - export const canUsePaginateCurrencyLabelsByOffice = () => ["Read", "Currency"] as AbilityTuple<"Read", "Currency">; -} diff --git a/test/generated/dist/currencies/currencies.api.ts b/test/generated/dist/currencies/currencies.api.ts deleted file mode 100644 index 80a7d39..0000000 --- a/test/generated/dist/currencies/currencies.api.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CurrenciesModels } from "./currencies.models"; - -export namespace CurrenciesApi { - export const list = ( - limit: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CurrenciesModels.CurrenciesListResponseSchema }, `/currencies`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies`, - ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), - config, - ); - }; - export const paginateCurrencyLabels = ( - limit: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, - `/currencies/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const getCurrencyById = (isoCode: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies/${isoCode}`, - config, - ); - }; - export const updateCurrency = ( - isoCode: string, - data: CurrenciesModels.UpdateCurrencyRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies/${isoCode}`, - ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), - config, - ); - }; - export const paginateCurrencyLabelsByOffice = ( - officeId: string, - limit: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, - `/offices/${officeId}/currencies/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; -} diff --git a/test/generated/dist/currencies/currencies.configs.ts b/test/generated/dist/currencies/currencies.configs.ts deleted file mode 100644 index 0496bec..0000000 --- a/test/generated/dist/currencies/currencies.configs.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CurrenciesModels } from "./currencies.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CurrenciesQueries } from "./currencies.queries"; -import { CurrenciesAcl } from "./currencies.acl"; - -export namespace CurrenciesConfigs { - export const currenciesConfig = { - meta: { - title: "Currencies", - }, - readAll: { - acl: CurrenciesAcl.canUseList, - schema: CurrenciesModels.CurrencyResponseDtoSchema, - paginated: CurrenciesQueries.useList, - infinite: CurrenciesQueries.useListInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CurrenciesModels.CurrencyResponseDtoSchema, - options: { - columns: { - isoCode: true, - name: true, - symbol: true, - alignment: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CurrenciesModels.CurrenciesListOrderParamEnumSchema, - }, - }), - }, - read: { - acl: CurrenciesAcl.canUseGetCurrencyById, - schema: CurrenciesModels.CurrencyResponseDtoSchema, - query: CurrenciesQueries.useGetCurrencyById, - }, - create: { - acl: CurrenciesAcl.canUseCreateCurrency, - schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, - mutation: CurrenciesQueries.useCreateCurrency, - inputDefs: dynamicInputs({ - schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, - options: { - inputs: { - isoCode: true, - name: true, - symbol: true, - alignment: true, - }, - }, - }), - }, - update: { - acl: CurrenciesAcl.canUseUpdateCurrency, - schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, - mutation: CurrenciesQueries.useUpdateCurrency, - inputDefs: dynamicInputs({ - schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CurrenciesAcl.canUsePaginateCurrencyLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CurrenciesQueries.usePaginateCurrencyLabels, - infinite: CurrenciesQueries.usePaginateCurrencyLabelsInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema, - }, - }), - }, - }; - - export const labelsPaginateConfig = { - meta: { - title: "Labels Paginate", - }, - readAll: { - acl: CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CurrenciesQueries.usePaginateCurrencyLabelsByOffice, - infinite: CurrenciesQueries.usePaginateCurrencyLabelsByOfficeInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/currencies/currencies.models.ts b/test/generated/dist/currencies/currencies.models.ts deleted file mode 100644 index 7330e3c..0000000 --- a/test/generated/dist/currencies/currencies.models.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CurrenciesModels { - /** - * CurrencyEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CurrencyEmployeeDTO = z.infer; - - /** - * CurrencyResponseDtoSchema - * @type { object } - * @property { string } isoCode isoCode of the currency - * @property { string } name Name of the currency - * @property { string } symbol Symbol of the currency - * @property { string } alignment Alignment of the currency - * @property { string } createdById ID of the employee who created this currency - * @property { CurrencyEmployeeDTO } createdBy Employee who created this currency - * @property { string } createdAt Date when the currency was created - * @property { string } updatedById ID of the employee who last updated this currency - * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency - * @property { string } updatedAt Date when the currency was last updated - */ - export const CurrencyResponseDtoSchema = z - .object({ - isoCode: z.string().describe("isoCode of the currency"), - name: z.string().describe("Name of the currency"), - symbol: z.string().describe("Symbol of the currency").nullish(), - alignment: z.string().describe("Alignment of the currency").nullish(), - createdById: z.string().describe("ID of the employee who created this currency").nullish(), - createdBy: CurrencyEmployeeDTOSchema.describe("Employee who created this currency").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Date when the currency was created"), - updatedById: z.string().describe("ID of the employee who last updated this currency").nullish(), - updatedBy: CurrencyEmployeeDTOSchema.describe("Employee who last updated this currency").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Date when the currency was last updated"), - }) - .readonly(); - export type CurrencyResponseDto = z.infer; - - /** - * CurrencyPaginationFilterDtoSchema - * @type { object } - * @property { string } officeId - * @property { string } search - */ - export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string(), search: z.string() }).readonly(); - export type CurrencyPaginationFilterDto = z.infer; - - /** - * CreateCurrencyRequestDTOSchema - * @type { object } - * @property { string } isoCode Unique identifier for the currency - * @property { string } name Name of the currency - * @property { string } symbol Symbol of the currency - * @property { string } alignment Alignment of the currency - */ - export const CreateCurrencyRequestDTOSchema = z - .object({ - isoCode: z.string().describe("Unique identifier for the currency"), - name: z.string().describe("Name of the currency"), - symbol: z.string().describe("Symbol of the currency"), - alignment: z.string().describe("Alignment of the currency"), - }) - .readonly(); - export type CreateCurrencyRequestDTO = z.infer; - - /** - * UpdateCurrencyRequestDTOSchema - * @type { object } - * @property { string } name Name of the currency - */ - export const UpdateCurrencyRequestDTOSchema = z - .object({ name: z.string().describe("Name of the currency") }) - .readonly(); - export type UpdateCurrencyRequestDTO = z.infer; - - /** - * CurrenciesListOrderParamEnumSchema - * @type { enum } - */ - export const CurrenciesListOrderParamEnumSchema = z.enum([ - "isoCode", - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type CurrenciesListOrderParamEnum = z.infer; - export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.enum; - - /** - * CurrenciesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CurrencyResponseDto[] } items - */ - export const CurrenciesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CurrencyResponseDtoSchema).readonly() }).readonly().shape, - }); - export type CurrenciesListResponse = z.infer; - - /** - * PaginateCurrencyLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PaginateCurrencyLabelsOrderParamEnumSchema = z.enum([ - "isoCode", - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PaginateCurrencyLabelsOrderParamEnum = z.infer; - export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderParamEnumSchema.enum; - - /** - * PaginateCurrencyLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PaginateCurrencyLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PaginateCurrencyLabelsResponse = z.infer; - - /** - * PaginateCurrencyLabelsByOfficeOrderParamEnumSchema - * @type { enum } - */ - export const PaginateCurrencyLabelsByOfficeOrderParamEnumSchema = z.enum([ - "isoCode", - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PaginateCurrencyLabelsByOfficeOrderParamEnum = z.infer< - typeof PaginateCurrencyLabelsByOfficeOrderParamEnumSchema - >; - export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabelsByOfficeOrderParamEnumSchema.enum; - - /** - * PaginateCurrencyLabelsByOfficeResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PaginateCurrencyLabelsByOfficeResponse = z.infer; -} diff --git a/test/generated/dist/currencies/currencies.queries.ts b/test/generated/dist/currencies/currencies.queries.ts deleted file mode 100644 index 6845288..0000000 --- a/test/generated/dist/currencies/currencies.queries.ts +++ /dev/null @@ -1,431 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CurrenciesAcl } from "./currencies.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CurrenciesModels } from "./currencies.models"; -import { CurrenciesApi } from "./currencies.api"; - -export namespace CurrenciesQueries { - export const moduleName = QueryModule.Currencies; - - export const keys = { - all: [moduleName] as const, - list: ( - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/currencies", limit, order, filter, page, cursor] as const, - listInfinite: ( - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/currencies", "infinite", limit, order, filter, cursor] as const, - paginateCurrencyLabels: ( - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/currencies/labels/paginate", limit, order, filter, page, cursor] as const, - paginateCurrencyLabelsInfinite: ( - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/currencies/labels/paginate", "infinite", limit, order, filter, cursor] as const, - getCurrencyById: (isoCode: string) => [...keys.all, "/currencies/:isoCode", isoCode] as const, - paginateCurrencyLabelsByOffice: ( - officeId: string, - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/currencies/labels/paginate", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateCurrencyLabelsByOfficeInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: CurrenciesModels.CurrencyPaginationFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/currencies/labels/paginate", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - }; - - /** - * Query `useList` - * @summary List Currencies - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CurrenciesModels.CurrencyPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List Currencies - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CurrenciesModels.CurrencyPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreateCurrency` - * @summary Create Currency - * @permission Requires `canUseCreateCurrency` ability - * @param { CurrenciesModels.CreateCurrencyRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateCurrency = ( - options?: AppMutationOptions< - typeof CurrenciesApi.createCurrency, - { data: CurrenciesModels.CreateCurrencyRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CurrenciesAcl.canUseCreateCurrency()); - return CurrenciesApi.createCurrency(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateCurrencyLabels` - * @summary Paginate Currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCurrencyLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CurrenciesModels.CurrencyPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateCurrencyLabelsInfinite - * @summary Paginate Currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCurrencyLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CurrenciesModels.CurrencyPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useGetCurrencyById` - * @summary Get Currency by iso code - * @permission Requires `canUseGetCurrencyById` ability - * @param { string } object.isoCode Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCurrencyById = ( - { isoCode }: { isoCode: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCurrencyById(isoCode), - queryFn: () => { - checkAcl(CurrenciesAcl.canUseGetCurrencyById()); - return CurrenciesApi.getCurrencyById(isoCode, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateCurrency` - * @summary Update Currency - * @permission Requires `canUseUpdateCurrency` ability - * @param { string } mutation.isoCode Path parameter - * @param { CurrenciesModels.UpdateCurrencyRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCurrency = ( - options?: AppMutationOptions< - typeof CurrenciesApi.updateCurrency, - { isoCode: string; data: CurrenciesModels.UpdateCurrencyRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ isoCode, data }) => { - checkAcl(CurrenciesAcl.canUseUpdateCurrency()); - return CurrenciesApi.updateCurrency(isoCode, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { isoCode } = variables; - const updateKeys = [keys.getCurrencyById(isoCode)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateCurrencyLabelsByOffice` - * @summary Paginate office currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCurrencyLabelsByOffice = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CurrenciesModels.CurrencyPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateCurrencyLabelsByOfficeInfinite - * @summary Paginate office currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateCurrencyLabelsByOfficeInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CurrenciesModels.CurrencyPaginationFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/customerAccount/customerAccount.api.ts b/test/generated/dist/customerAccount/customerAccount.api.ts deleted file mode 100644 index f109278..0000000 --- a/test/generated/dist/customerAccount/customerAccount.api.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { CustomerAccountModels } from "./customerAccount.models"; - -export namespace CustomerAccountApi { - export const get = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, - `/customers/account`, - config, - ); - }; -} diff --git a/test/generated/dist/customerAccount/customerAccount.models.ts b/test/generated/dist/customerAccount/customerAccount.models.ts deleted file mode 100644 index c89279e..0000000 --- a/test/generated/dist/customerAccount/customerAccount.models.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { z } from "zod"; - -export namespace CustomerAccountModels { - /** - * CustomerCompanyDtoSchema - * @type { object } - * @property { string } id Company ID - * @property { string } name Company name - */ - export const CustomerCompanyDtoSchema = z - .object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name").nullish() }) - .readonly(); - export type CustomerCompanyDto = z.infer; - - /** - * CustomerBusinessPartnerDtoSchema - * @type { object } - * @property { string } id Company ID - * @property { string } name Company name - */ - export const CustomerBusinessPartnerDtoSchema = z - .object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name") }) - .readonly(); - export type CustomerBusinessPartnerDto = z.infer; - - /** - * CustomerAccountDtoSchema - * @type { object } - * @property { array[] } aclRules Can hold any type of value - * @property { string } id Customer ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { CustomerCompanyDto } company Company - * @property { CustomerBusinessPartnerDto } businessPartner - */ - export const CustomerAccountDtoSchema = z - .object({ - aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), - id: z.string().describe("Customer ID"), - email: z.email().describe("Email"), - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - phone: z.string().describe("Phone number").nullish(), - company: CustomerCompanyDtoSchema.describe("Company").nullish(), - businessPartner: CustomerBusinessPartnerDtoSchema.nullish(), - }) - .readonly(); - export type CustomerAccountDto = z.infer; -} diff --git a/test/generated/dist/customerAccount/customerAccount.queries.ts b/test/generated/dist/customerAccount/customerAccount.queries.ts deleted file mode 100644 index fbe2767..0000000 --- a/test/generated/dist/customerAccount/customerAccount.queries.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { CustomerAccountApi } from "./customerAccount.api"; - -export namespace CustomerAccountQueries { - export const moduleName = QueryModule.CustomerAccount; - - export const keys = { - all: [moduleName] as const, - get: () => [...keys.all, "/customers/account"] as const, - }; - - /** - * Query `useGet` - * @summary Get profile of logged-in user - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.get(), - queryFn: () => CustomerAccountApi.get(config), - ...options, - }); - }; -} diff --git a/test/generated/dist/customers/customers.acl.ts b/test/generated/dist/customers/customers.acl.ts deleted file mode 100644 index 2e7c40d..0000000 --- a/test/generated/dist/customers/customers.acl.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CustomersAcl { - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Customer"] as AbilityTuple<"Create", "Customer">; - - /** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = () => ["Read", "Customer"] as AbilityTuple<"Read", "Customer">; - - /** - * Use for `useFindById` query ability. - * @description Read a customer with id - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "Customer"] as AbilityTuple<"Read", "Customer">; - - /** - * Use for `useUpdate` mutation ability. - * @description Update Customer - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Customer"] as AbilityTuple<"Update", "Customer">; - - /** - * Use for `useDeactivate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeactivate` mutation - */ - export const canUseDeactivate = () => ["Deactivate", "Customer"] as AbilityTuple<"Deactivate", "Customer">; - - /** - * Use for `useReactivate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReactivate` mutation - */ - export const canUseReactivate = () => ["Reactivate", "Customer"] as AbilityTuple<"Reactivate", "Customer">; -} diff --git a/test/generated/dist/customers/customers.api.ts b/test/generated/dist/customers/customers.api.ts deleted file mode 100644 index 075b13e..0000000 --- a/test/generated/dist/customers/customers.api.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CustomersModels } from "./customers.models"; - -export namespace CustomersApi { - export const findProfile = (config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, `/customers/me`, config); - }; - export const create = (data: CustomersModels.CreateCustomerDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers`, - ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), - config, - ); - }; - export const list = ( - limit: number, - order?: string, - filter?: CustomersModels.CustomerPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: CustomersModels.CustomersListResponseSchema }, `/customers`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const findById = (customerId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${customerId}`, - config, - ); - }; - export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${customerId}`, - ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), - config, - ); - }; - export const deactivate = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${id}/deactivate`, - undefined, - config, - ); - }; - export const reactivate = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${id}/reactivate`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/customers/customers.configs.ts b/test/generated/dist/customers/customers.configs.ts deleted file mode 100644 index d9a2643..0000000 --- a/test/generated/dist/customers/customers.configs.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CustomersModels } from "./customers.models"; -import { CustomersQueries } from "./customers.queries"; -import { CustomersAcl } from "./customers.acl"; - -export namespace CustomersConfigs { - export const customersConfig = { - meta: { - title: "Customers", - }, - readAll: { - acl: CustomersAcl.canUseList, - schema: CustomersModels.CustomerListItemDTOSchema, - paginated: CustomersQueries.useList, - infinite: CustomersQueries.useListInfinite, - filters: { - schema: CustomersModels.CustomerPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CustomersModels.CustomerPaginationFilterDtoSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - companyId: true, - businessPartnerId: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CustomersModels.CustomerListItemDTOSchema, - options: { - columns: { - id: true, - firstName: true, - lastName: true, - email: true, - phone: true, - companyId: true, - businessPartnerId: true, - businessPartner: true, - }, - sortable: CustomersModels.CustomersListOrderParamEnumSchema, - }, - }), - }, - read: { - acl: CustomersAcl.canUseFindById, - schema: CustomersModels.CustomerResponseDTOSchema, - query: CustomersQueries.useFindById, - }, - create: { - acl: CustomersAcl.canUseCreate, - schema: CustomersModels.CreateCustomerDTOSchema, - mutation: CustomersQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CustomersModels.CreateCustomerDTOSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - phone: true, - companyId: true, - businessPartnerId: true, - }, - }, - }), - }, - update: { - acl: CustomersAcl.canUseUpdate, - schema: CustomersModels.UpdateCustomerDTOSchema, - mutation: CustomersQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CustomersModels.UpdateCustomerDTOSchema, - options: { - inputs: { - firstName: true, - lastName: true, - phone: true, - companyId: true, - businessPartnerId: true, - }, - }, - }), - }, - }; -} diff --git a/test/generated/dist/customers/customers.models.ts b/test/generated/dist/customers/customers.models.ts deleted file mode 100644 index cc1328f..0000000 --- a/test/generated/dist/customers/customers.models.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CustomersModels { - /** - * CustomerProfileBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CustomerProfileBusinessPartnerDto = z.infer; - - /** - * CustomerProfileResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - * @property { CustomerProfileBusinessPartnerDto } businessPartner - */ - export const CustomerProfileResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the customer"), - firstName: z.string().describe("First name of the customer"), - lastName: z.string().describe("Last name of the customer"), - email: z.email().describe("Email of the customer"), - phone: z.string().describe("Phone number of the customer"), - companyId: z.string().describe("Company id of the customer").nullish(), - businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), - businessPartner: CustomerProfileBusinessPartnerDtoSchema.nullish(), - }) - .readonly(); - export type CustomerProfileResponseDTO = z.infer; - - /** - * CustomerBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CustomerBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CustomerBusinessPartnerResponseDto = z.infer; - - /** - * CustomerResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company Id of the customer - * @property { string } businessPartnerId Business partner Id of the customer - * @property { boolean } archived Wether the customer is archived - * @property { CustomerBusinessPartnerResponseDto } businessPartner - */ - export const CustomerResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the customer"), - firstName: z.string().describe("First name of the customer"), - lastName: z.string().describe("Last name of the customer"), - email: z.email().describe("Email of the customer"), - phone: z.string().describe("Phone number of the customer"), - companyId: z.string().describe("Company Id of the customer").nullish(), - businessPartnerId: z.string().describe("Business partner Id of the customer").nullish(), - archived: z.boolean().describe("Wether the customer is archived"), - businessPartner: CustomerBusinessPartnerResponseDtoSchema.nullish(), - }) - .readonly(); - export type CustomerResponseDTO = z.infer; - - /** - * CustomerListItemBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type CustomerListItemBusinessPartnerDto = z.infer; - - /** - * CustomerListItemDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - * @property { CustomerListItemBusinessPartnerDto } businessPartner - */ - export const CustomerListItemDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the customer"), - firstName: z.string().describe("First name of the customer"), - lastName: z.string().describe("Last name of the customer"), - email: z.string().describe("Email of the customer"), - phone: z.string().describe("Phone number of the customer"), - companyId: z.string().describe("Company id of the customer").nullish(), - businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), - businessPartner: CustomerListItemBusinessPartnerDtoSchema.nullish(), - }) - .readonly(); - export type CustomerListItemDTO = z.infer; - - /** - * CreateCustomerDTOSchema - * @type { object } - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - */ - export const CreateCustomerDTOSchema = z - .object({ - firstName: z.string().describe("First name of the customer"), - lastName: z.string().describe("Last name of the customer"), - email: z.email().describe("Email of the customer"), - phone: z.string().describe("Phone number of the customer").nullish(), - companyId: z.string().describe("Company id of the customer").nullish(), - businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), - }) - .readonly(); - export type CreateCustomerDTO = z.infer; - - /** - * CustomerPaginationFilterDtoSchema - * @type { object } - * @property { string } firstName - * @property { string } lastName - * @property { string } email - * @property { string } companyId - * @property { string } businessPartnerId - * @property { string } search - */ - export const CustomerPaginationFilterDtoSchema = z - .object({ - firstName: z.string(), - lastName: z.string(), - email: z.string(), - companyId: z.string(), - businessPartnerId: z.string(), - search: z.string(), - }) - .readonly(); - export type CustomerPaginationFilterDto = z.infer; - - /** - * UpdateCustomerDTOSchema - * @type { object } - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - */ - export const UpdateCustomerDTOSchema = z - .object({ - firstName: z.string().describe("First name of the customer"), - lastName: z.string().describe("Last name of the customer"), - phone: z.string().describe("Phone number of the customer"), - companyId: z.string().describe("Company id of the customer"), - businessPartnerId: z.string().describe("Business partner id of the customer"), - }) - .readonly(); - export type UpdateCustomerDTO = z.infer; - - /** - * CustomersListOrderParamEnumSchema - * @type { enum } - */ - export const CustomersListOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "createdAt"]); - export type CustomersListOrderParamEnum = z.infer; - export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enum; - - /** - * CustomersListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CustomerListItemDTO[] } items - */ - export const CustomersListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CustomerListItemDTOSchema).readonly() }).readonly().shape, - }); - export type CustomersListResponse = z.infer; -} diff --git a/test/generated/dist/customers/customers.queries.ts b/test/generated/dist/customers/customers.queries.ts deleted file mode 100644 index c617a48..0000000 --- a/test/generated/dist/customers/customers.queries.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CustomersAcl } from "./customers.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CustomersModels } from "./customers.models"; -import { CustomersApi } from "./customers.api"; - -export namespace CustomersQueries { - export const moduleName = QueryModule.Customers; - - export const keys = { - all: [moduleName] as const, - findProfile: () => [...keys.all, "/customers/me"] as const, - list: ( - limit?: number, - order?: string, - filter?: CustomersModels.CustomerPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/customers", limit, order, filter, page, cursor] as const, - listInfinite: ( - limit?: number, - order?: string, - filter?: CustomersModels.CustomerPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/customers", "infinite", limit, order, filter, cursor] as const, - findById: (customerId: string) => [...keys.all, "/customers/:customerId", customerId] as const, - }; - - /** - * Query `useFindProfile` - * @summary Get customer by id - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfile = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findProfile(), - queryFn: () => CustomersApi.findProfile(config), - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create new customer - * @permission Requires `canUseCreate` ability - * @param { CustomersModels.CreateCustomerDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CustomersAcl.canUseCreate()); - return CustomersApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useList` - * @summary List customers - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` - * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: CustomersModels.CustomerPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List customers - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` - * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: CustomersModels.CustomerPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get customer by id - * @permission Requires `canUseFindById` ability - * @param { string } object.customerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { customerId }: { customerId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(customerId), - queryFn: () => { - checkAcl(CustomersAcl.canUseFindById()); - return CustomersApi.findById(customerId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update customer - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.customerId Path parameter - * @param { CustomersModels.UpdateCustomerDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof CustomersApi.update, - { customerId: string; data: CustomersModels.UpdateCustomerDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ customerId, data }) => { - checkAcl(CustomersAcl.canUseUpdate()); - return CustomersApi.update(customerId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { customerId } = variables; - const updateKeys = [keys.findById(customerId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeactivate` - * @summary Deactivate customer - * @permission Requires `canUseDeactivate` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeactivate = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CustomersAcl.canUseDeactivate()); - return CustomersApi.deactivate(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useReactivate` - * @summary Reactivate customer - * @permission Requires `canUseReactivate` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useReactivate = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CustomersAcl.canUseReactivate()); - return CustomersApi.reactivate(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/depots/depots.acl.ts b/test/generated/dist/depots/depots.acl.ts deleted file mode 100644 index 58d424a..0000000 --- a/test/generated/dist/depots/depots.acl.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace DepotsAcl { - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Depot"] as AbilityTuple<"Create", "Depot">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Depot"] as AbilityTuple<"Update", "Depot">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "Depot"] as AbilityTuple<"Archive", "Depot">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "Depot"] as AbilityTuple<"Archive", "Depot">; -} diff --git a/test/generated/dist/depots/depots.api.ts b/test/generated/dist/depots/depots.api.ts deleted file mode 100644 index da2d019..0000000 --- a/test/generated/dist/depots/depots.api.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DepotsModels } from "./depots.models"; - -export namespace DepotsApi { - export const create = (data: DepotsModels.CreateDepotRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots`, - ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), - config, - ); - }; - export const paginate = ( - limit: number, - order?: string, - filter?: DepotsModels.DepotPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: DepotsModels.DepotsPaginateResponseSchema }, `/depots`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: DepotsModels.DepotLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, - `/depots/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: DepotsModels.DepotResponseDTOSchema }, `/depots/${id}`, config); - }; - export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots/${id}`, - ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/depots/${id}/archive`, undefined, config); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/depots/${id}/unarchive`, undefined, config); - }; -} diff --git a/test/generated/dist/depots/depots.configs.ts b/test/generated/dist/depots/depots.configs.ts deleted file mode 100644 index 0eb5ea1..0000000 --- a/test/generated/dist/depots/depots.configs.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DepotsModels } from "./depots.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DepotsQueries } from "./depots.queries"; -import { DepotsAcl } from "./depots.acl"; - -export namespace DepotsConfigs { - export const depotsConfig = { - meta: { - title: "Depots", - }, - readAll: { - acl: DepotsAcl.canUsePaginate, - schema: DepotsModels.DepotResponseDTOSchema, - paginated: DepotsQueries.usePaginate, - infinite: DepotsQueries.usePaginateInfinite, - filters: { - schema: DepotsModels.DepotPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DepotsModels.DepotPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: DepotsModels.DepotResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - name: true, - shortName: true, - additionalInformation: true, - address: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: DepotsModels.DepotsPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: DepotsAcl.canUseFindById, - schema: DepotsModels.DepotResponseDTOSchema, - query: DepotsQueries.useFindById, - }, - create: { - acl: DepotsAcl.canUseCreate, - schema: DepotsModels.CreateDepotRequestDTOSchema, - mutation: DepotsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DepotsModels.CreateDepotRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - additionalInformation: true, - name: true, - street: true, - zip: true, - district: true, - cityId: true, - countryId: true, - }, - }, - }), - }, - update: { - acl: DepotsAcl.canUseUpdate, - schema: DepotsModels.UpdateDepotRequestDTOSchema, - mutation: DepotsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DepotsModels.UpdateDepotRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - additionalInformation: true, - name: true, - street: true, - zip: true, - district: true, - cityId: true, - countryId: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DepotsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DepotsQueries.usePaginateLabels, - infinite: DepotsQueries.usePaginateLabelsInfinite, - filters: { - schema: DepotsModels.DepotLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DepotsModels.DepotLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/depots/depots.models.ts b/test/generated/dist/depots/depots.models.ts deleted file mode 100644 index f10cf95..0000000 --- a/test/generated/dist/depots/depots.models.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DepotsModels { - /** - * DepotCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DepotCityDto = z.infer; - - /** - * DepotCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ - export const DepotCountryDtoSchema = z - .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) - .readonly(); - export type DepotCountryDto = z.infer; - - /** - * AddressDTOSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { DepotCityDto } city - * @property { string } district District name - * @property { DepotCountryDto } country - */ - export const AddressDTOSchema = z - .object({ - street: z.string().describe("Street address"), - zip: z.string().describe("ZIP/Postal code"), - city: DepotCityDtoSchema.nullish(), - district: z.string().describe("District name").nullish(), - country: DepotCountryDtoSchema.nullish(), - }) - .readonly(); - export type AddressDTO = z.infer; - - /** - * DepotEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DepotEmployeeDTO = z.infer; - - /** - * DepotResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the depot - * @property { string } matchCode Match code for the depot - * @property { string } name Name of the depot - * @property { string } shortName Short name of the depot - * @property { string } additionalInformation Additional info of the depot - * @property { AddressDTO } address Address details of the depot - * @property { boolean } archived - * @property { string } createdById - * @property { DepotEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DepotEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const DepotResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the depot"), - matchCode: z.string().describe("Match code for the depot"), - name: z.string().describe("Name of the depot"), - shortName: z.string().describe("Short name of the depot").nullish(), - additionalInformation: z.string().describe("Additional info of the depot").nullish(), - address: AddressDTOSchema.describe("Address details of the depot"), - archived: z.boolean(), - createdById: z.string().nullish(), - createdBy: DepotEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: DepotEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type DepotResponseDTO = z.infer; - - /** - * CreateDepotRequestDTOSchema - * @type { object } - * @property { string } matchCode Unique identifier code for the depot - * @property { string } shortName Optional short name for the depot - * @property { string } additionalInformation - * @property { string } name Full name of the depot - * @property { string } street Street address of the depot - * @property { string } zip ZIP/Postal code - * @property { string } district District information - * @property { string } cityId City id - * @property { string } countryId Country code - */ - export const CreateDepotRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Unique identifier code for the depot"), - shortName: z.string().describe("Optional short name for the depot").nullish(), - additionalInformation: z.string().nullish(), - name: z.string().describe("Full name of the depot"), - street: z.string().describe("Street address of the depot"), - zip: z.string().describe("ZIP/Postal code"), - district: z.string().describe("District information").nullish(), - cityId: z.string().describe("City id"), - countryId: z.string().describe("Country code"), - }) - .readonly(); - export type CreateDepotRequestDTO = z.infer; - - /** - * DepotPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter depots by name, matchCode, or shortName - * @property { boolean } archived - */ - export const DepotPaginationFilterDtoSchema = z - .object({ - search: z.string().describe("Search term to filter depots by name, matchCode, or shortName"), - archived: z.boolean(), - }) - .readonly(); - export type DepotPaginationFilterDto = z.infer; - - /** - * DepotLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const DepotLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type DepotLabelFilterDto = z.infer; - - /** - * UpdateDepotRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code for the depot - * @property { string } shortName Updated short name - * @property { string } additionalInformation Updated short name - * @property { string } name Updated full name - * @property { string } street Updated street address - * @property { string } zip Updated ZIP/Postal code - * @property { string } district Updated district information - * @property { string } cityId Updated city id - * @property { string } countryId Updated country code - */ - export const UpdateDepotRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Updated match code for the depot"), - shortName: z.string().describe("Updated short name"), - additionalInformation: z.string().describe("Updated short name"), - name: z.string().describe("Updated full name"), - street: z.string().describe("Updated street address"), - zip: z.string().describe("Updated ZIP/Postal code"), - district: z.string().describe("Updated district information"), - cityId: z.string().describe("Updated city id"), - countryId: z.string().describe("Updated country code"), - }) - .readonly(); - export type UpdateDepotRequestDTO = z.infer; - - /** - * DepotsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const DepotsPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DepotsPaginateOrderParamEnum = z.infer; - export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.enum; - - /** - * DepotsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DepotResponseDTO[] } items - */ - export const DepotsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(DepotResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DepotsPaginateResponse = z.infer; - - /** - * DepotsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const DepotsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DepotsPaginateLabelsOrderParamEnum = z.infer; - export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParamEnumSchema.enum; - - /** - * DepotsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const DepotsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DepotsPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/depots/depots.queries.ts b/test/generated/dist/depots/depots.queries.ts deleted file mode 100644 index dc58f63..0000000 --- a/test/generated/dist/depots/depots.queries.ts +++ /dev/null @@ -1,349 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DepotsAcl } from "./depots.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DepotsModels } from "./depots.models"; -import { DepotsApi } from "./depots.api"; - -export namespace DepotsQueries { - export const moduleName = QueryModule.Depots; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: DepotsModels.DepotPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/depots", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: DepotsModels.DepotPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/depots", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: DepotsModels.DepotLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/depots/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: DepotsModels.DepotLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/depots/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/depots/:id", id] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create a new depot - * @permission Requires `canUseCreate` ability - * @param { DepotsModels.CreateDepotRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(DepotsAcl.canUseCreate()); - return DepotsApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Paginate Depots - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: DepotsModels.DepotPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Depots - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: DepotsModels.DepotPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate depots with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: DepotsModels.DepotLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate depots with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: DepotsModels.DepotLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Fetch depot by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(DepotsAcl.canUseFindById()); - return DepotsApi.findById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update a depot - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { DepotsModels.UpdateDepotRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(DepotsAcl.canUseUpdate()); - return DepotsApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive a depot - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(DepotsAcl.canUseArchive()); - return DepotsApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive a depot - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(DepotsAcl.canUseUnarchive()); - return DepotsApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/documentTemplates/documentTemplates.acl.ts b/test/generated/dist/documentTemplates/documentTemplates.acl.ts deleted file mode 100644 index 299eec8..0000000 --- a/test/generated/dist/documentTemplates/documentTemplates.acl.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DocumentTemplatesAcl { - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List document template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Read", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; - - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List document templates - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Read", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Create", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; - - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get document template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Read", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update document template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Update", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; - - /** - * Use for `useAddRemarkBlock` mutation ability. For global ability, omit the object parameter. - * @description Add remark block to document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddRemarkBlock` mutation - */ - export const canUseAddRemarkBlock = (object?: { officeId: string }) => - ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Update", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; - - /** - * Use for `useDeleteRemarkBlock` mutation ability. For global ability, omit the object parameter. - * @description Delete remark block from document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemarkBlock` mutation - */ - export const canUseDeleteRemarkBlock = (object?: { officeId: string }) => - ["Update", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Update", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Archive", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Unarchive", object ? subject("DocumentTemplate", object) : "DocumentTemplate"] as AbilityTuple< - "Unarchive", - "DocumentTemplate" | (ForcedSubject<"DocumentTemplate"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/documentTemplates/documentTemplates.api.ts b/test/generated/dist/documentTemplates/documentTemplates.api.ts deleted file mode 100644 index cd84ccd..0000000 --- a/test/generated/dist/documentTemplates/documentTemplates.api.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; - -export namespace DocumentTemplatesApi { - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/document-templates/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const list = ( - officeId: string, - limit: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, - `/offices/${officeId}/document-templates`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = ( - officeId: string, - data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates`, - ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), - config, - ); - }; - export const findById = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}`, - config, - ); - }; - export const update = ( - documentTemplateId: string, - officeId: string, - data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}`, - ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), - config, - ); - }; - export const addRemarkBlock = ( - documentTemplateId: string, - officeId: string, - data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, - ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), - config, - ); - }; - export const deleteRemarkBlock = ( - documentTemplateId: string, - remarkBlockId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, - undefined, - config, - ); - }; - export const archive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, - undefined, - config, - ); - }; - export const unarchive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/documentTemplates/documentTemplates.configs.ts b/test/generated/dist/documentTemplates/documentTemplates.configs.ts deleted file mode 100644 index 291245b..0000000 --- a/test/generated/dist/documentTemplates/documentTemplates.configs.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DocumentTemplatesQueries } from "./documentTemplates.queries"; -import { DocumentTemplatesAcl } from "./documentTemplates.acl"; - -export namespace DocumentTemplatesConfigs { - export const documentTemplatesConfig = { - meta: { - title: "Document Templates", - }, - readAll: { - acl: DocumentTemplatesAcl.canUseList, - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - paginated: DocumentTemplatesQueries.useList, - infinite: DocumentTemplatesQueries.useListInfinite, - filters: { - schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, - options: { - inputs: { - isArchived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - isArchived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - blocks: true, - }, - sortable: DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema, - }, - }), - }, - read: { - acl: DocumentTemplatesAcl.canUseFindById, - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - query: DocumentTemplatesQueries.useFindById, - }, - create: { - acl: DocumentTemplatesAcl.canUseCreate, - schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, - mutation: DocumentTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - blocks: true, - }, - }, - }), - }, - update: { - acl: DocumentTemplatesAcl.canUseUpdate, - schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, - mutation: DocumentTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - isArchived: true, - blocks: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DocumentTemplatesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DocumentTemplatesQueries.usePaginateLabels, - infinite: DocumentTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/documentTemplates/documentTemplates.models.ts b/test/generated/dist/documentTemplates/documentTemplates.models.ts deleted file mode 100644 index 1841a56..0000000 --- a/test/generated/dist/documentTemplates/documentTemplates.models.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DocumentTemplatesModels { - /** - * DocumentTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DocumentTemplateEmployeeDTO = z.infer; - - /** - * DocumentTemplateResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name - * @property { boolean } isArchived - * @property { string } createdById ID of the employee who created this template - * @property { DocumentTemplateEmployeeDTO } createdBy Employee who created this template - * @property { string } createdAt - * @property { string } updatedById ID of the employee who last updated this template - * @property { DocumentTemplateEmployeeDTO } updatedBy Employee who last updated this template - * @property { string } updatedAt - * @property { CommonModels.TemplateBlocksResponseDTO } blocks - */ - export const DocumentTemplateResponseDTOSchema = z - .object({ - id: z.string(), - officeId: z.string(), - name: z.string(), - isArchived: z.boolean(), - createdById: z.string().describe("ID of the employee who created this template").nullish(), - createdBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), - updatedBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), - updatedAt: z.iso.datetime({ offset: true }), - blocks: CommonModels.TemplateBlocksResponseDTOSchema, - }) - .readonly(); - export type DocumentTemplateResponseDTO = z.infer; - - /** - * TemplateBlocksDTOSchema - * @type { object } - * @property { CommonModels.TitleBlockDTO } titleBlock - * @property { CommonModels.ReceiverBlockDTO } receiverBlock - * @property { CommonModels.OurInformationBlockDTO } ourInformationBlock - * @property { CommonModels.RouteTableBlockDTO } routeTableBlock - * @property { CommonModels.CargoTableBlockDTO } cargoTableBlock - * @property { CommonModels.CargoSummaryBlockDTO } cargoSummaryBlock - * @property { CommonModels.FinanceTableBlockDTO } financeTableBlock - * @property { CommonModels.RemarkBlockDTO[] } remarkBlocks - * @property { CommonModels.FooterBlockDTO } footerBlock - * @property { CommonModels.TermsBlockDTO } termsBlock - * @property { CommonModels.CutOffDatesBlockDTO } cutOffDatesBlock - */ - export const TemplateBlocksDTOSchema = z - .object({ - titleBlock: CommonModels.TitleBlockDTOSchema, - receiverBlock: CommonModels.ReceiverBlockDTOSchema, - ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, - routeTableBlock: CommonModels.RouteTableBlockDTOSchema, - cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, - cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, - financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, - remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), - footerBlock: CommonModels.FooterBlockDTOSchema, - termsBlock: CommonModels.TermsBlockDTOSchema, - cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema, - }) - .readonly(); - export type TemplateBlocksDTO = z.infer; - - /** - * CreateDocumentTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { TemplateBlocksDTO } blocks - */ - export const CreateDocumentTemplateRequestDTOSchema = z - .object({ name: z.string().describe("Template name"), blocks: TemplateBlocksDTOSchema.nullish() }) - .readonly(); - export type CreateDocumentTemplateRequestDTO = z.infer; - - /** - * UpdateDocumentTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { boolean } isArchived - * @property { TemplateBlocksDTO } blocks - */ - export const UpdateDocumentTemplateRequestDTOSchema = z - .object({ name: z.string().describe("Template name"), isArchived: z.boolean(), blocks: TemplateBlocksDTOSchema }) - .readonly(); - export type UpdateDocumentTemplateRequestDTO = z.infer; - - /** - * CreateRemarkBlockRequestDTOSchema - * @type { object } - * @property { CommonModels.EditorContentUpdateDto } content - * @property { number } position 1-based position of the remark block. Minimum: `1` - * @property { boolean } enabled - */ - export const CreateRemarkBlockRequestDTOSchema = z - .object({ - content: CommonModels.EditorContentUpdateDtoSchema, - position: z.number().gte(1).describe("1-based position of the remark block").nullish(), - enabled: z.boolean().nullish(), - }) - .readonly(); - export type CreateRemarkBlockRequestDTO = z.infer; - - /** - * DocumentTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const DocumentTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type DocumentTemplateLabelFilterDto = z.infer; - - /** - * DocumentTemplateFilterDtoSchema - * @type { object } - * @property { boolean } isArchived - * @property { string } search - */ - export const DocumentTemplateFilterDtoSchema = z.object({ isArchived: z.boolean(), search: z.string() }).readonly(); - export type DocumentTemplateFilterDto = z.infer; - - /** - * DocumentTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const DocumentTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DocumentTemplatesPaginateLabelsOrderParamEnum = z.infer< - typeof DocumentTemplatesPaginateLabelsOrderParamEnumSchema - >; - export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPaginateLabelsOrderParamEnumSchema.enum; - - /** - * DocumentTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DocumentTemplatesPaginateLabelsResponse = z.infer; - - /** - * DocumentTemplatesListOrderParamEnumSchema - * @type { enum } - */ - export const DocumentTemplatesListOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DocumentTemplatesListOrderParamEnum = z.infer; - export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderParamEnumSchema.enum; - - /** - * DocumentTemplatesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DocumentTemplateResponseDTO[] } items - */ - export const DocumentTemplatesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DocumentTemplatesListResponse = z.infer; -} diff --git a/test/generated/dist/documentTemplates/documentTemplates.queries.ts b/test/generated/dist/documentTemplates/documentTemplates.queries.ts deleted file mode 100644 index 6b47315..0000000 --- a/test/generated/dist/documentTemplates/documentTemplates.queries.ts +++ /dev/null @@ -1,509 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DocumentTemplatesAcl } from "./documentTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; -import { DocumentTemplatesApi } from "./documentTemplates.api"; - -export namespace DocumentTemplatesQueries { - export const moduleName = QueryModule.DocumentTemplates; - - export const keys = { - all: [moduleName] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/document-templates/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/document-templates/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - list: ( - officeId: string, - limit?: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/document-templates", officeId, limit, order, filter, page, cursor] as const, - listInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/document-templates", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (documentTemplateId: string, officeId: string) => - [...keys.all, "/offices/:officeId/document-templates/:documentTemplateId", documentTemplateId, officeId] as const, - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate document template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId })); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate document template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId })); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useList` - * @summary List document templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DocumentTemplatesModels.DocumentTemplateFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUseList({ officeId })); - return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List document templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DocumentTemplatesModels.DocumentTemplateFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DocumentTemplatesAcl.canUseList({ officeId })); - return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create a new document template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.create, - { officeId: string; data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId })); - return DocumentTemplatesApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get document template by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.documentTemplateId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ - export const useFindById = ( - { documentTemplateId, officeId }: { documentTemplateId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(documentTemplateId, officeId), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId })); - return DocumentTemplatesApi.findById(documentTemplateId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update document template by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.update, - { documentTemplateId: string; officeId: string; data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId })); - return DocumentTemplatesApi.update(documentTemplateId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useAddRemarkBlock` - * @summary Add a remark block to a document template - * @permission Requires `canUseAddRemarkBlock` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.CreateRemarkBlockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useAddRemarkBlock = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.addRemarkBlock, - { documentTemplateId: string; officeId: string; data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId })); - return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteRemarkBlock` - * @summary Delete a remark block from a document template - * @permission Requires `canUseDeleteRemarkBlock` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.remarkBlockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteRemarkBlock = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.deleteRemarkBlock, - { documentTemplateId: string; remarkBlockId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId })); - return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive document template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useArchive = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.archive, - { documentTemplateId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId })); - return DocumentTemplatesApi.archive(documentTemplateId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive document template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUnarchive = ( - options?: AppMutationOptions< - typeof DocumentTemplatesApi.unarchive, - { documentTemplateId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId })); - return DocumentTemplatesApi.unarchive(documentTemplateId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.acl.ts b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.acl.ts deleted file mode 100644 index cd053fc..0000000 --- a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.acl.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningAccountStatementAcl { - /** - * Use for `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation ability. For global ability, omit the object parameter. - * @description Generate account statement - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation - */ - export const canUseGenerateAccountStatement = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetAccountStatementEml` mutation ability. For global ability, omit the object parameter. - * @description Download account statement as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAccountStatementEml` mutation - */ - export const canUseGetAccountStatementEml = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.api.ts b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.api.ts deleted file mode 100644 index 0475302..0000000 --- a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.api.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningAccountStatementApi { - export const dataGenFake = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, - `/data-gen-fake/account-statement`, - config, - ); - }; - export const generateAccountStatement = ( - officeId: string, - limit: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/account-statement`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }); - }; - export const getAccountStatementEml = ( - officeId: string, - data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/account-statement/eml`, - ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; -} diff --git a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.models.ts b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.models.ts deleted file mode 100644 index 1a07b4f..0000000 --- a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.models.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningAccountStatementModels { - /** - * AccountStatementPdfPayloadInvoiceDtoSchema - * @type { object } - * @property { string } number - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } dueDays - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - */ - export const AccountStatementPdfPayloadInvoiceDtoSchema = z - .object({ - number: z.string(), - issuingDate: z.iso.datetime({ offset: true }), - dueDate: z.iso.datetime({ offset: true }), - dueDays: z.number(), - invoiceAmount: z.number(), - outstandingAmount: z.number(), - currencyNotation: z.string(), - }) - .readonly(); - export type AccountStatementPdfPayloadInvoiceDto = z.infer; - - /** - * AccountStatementInvoicesByCurrencyAndDirectionDtoSchema - * @type { object } - * @property { string } direction - * @property { string } currency - * @property { AccountStatementPdfPayloadInvoiceDto[] } invoices - * @property { number } totalOutstandingAmount - */ - export const AccountStatementInvoicesByCurrencyAndDirectionDtoSchema = z - .object({ - direction: CommonModels.InvoiceDirectionEnumSchema, - currency: z.string(), - invoices: z.array(AccountStatementPdfPayloadInvoiceDtoSchema).readonly(), - totalOutstandingAmount: z.number(), - }) - .readonly(); - export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer< - typeof AccountStatementInvoicesByCurrencyAndDirectionDtoSchema - >; - - /** - * AccountStatementPdfPayloadBusinessPartnerDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - * @property { string } referenceNumber - */ - export const AccountStatementPdfPayloadBusinessPartnerDtoSchema = z - .object({ name: z.string(), address: z.string().nullish(), referenceNumber: z.string().nullish() }) - .readonly(); - export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer< - typeof AccountStatementPdfPayloadBusinessPartnerDtoSchema - >; - - /** - * AccountStatementPdfPayloadBankAccountDtoSchema - * @type { object } - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - */ - export const AccountStatementPdfPayloadBankAccountDtoSchema = z - .object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }) - .readonly(); - export type AccountStatementPdfPayloadBankAccountDto = z.infer; - - /** - * AccountStatementPdfPayloadDTOSchema - * @type { object } - * @property { AccountStatementPdfPayloadBusinessPartnerDto } businessPartner - * @property { AccountStatementInvoicesByCurrencyAndDirectionDto[] } invoicesByCurrencyAndDirection - * @property { AccountStatementPdfPayloadBankAccountDto } bankAccount - * @property { string } employeeName - * @property { CommonModels.ConfigBlockDto } config - */ - export const AccountStatementPdfPayloadDTOSchema = z - .object({ - businessPartner: AccountStatementPdfPayloadBusinessPartnerDtoSchema, - invoicesByCurrencyAndDirection: z.array(AccountStatementInvoicesByCurrencyAndDirectionDtoSchema).readonly(), - bankAccount: AccountStatementPdfPayloadBankAccountDtoSchema, - employeeName: z.string().nullable(), - config: CommonModels.ConfigBlockDtoSchema, - }) - .readonly(); - export type AccountStatementPdfPayloadDTO = z.infer; - - /** - * OfficeInvoiceListQueryDtoSchema - * @type { object } - * @property { string } order Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @property { CommonModels.OfficeInvoiceFilterDto } filter - * @property { number } limit Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - */ - export const OfficeInvoiceListQueryDtoSchema = z - .object({ - order: z - .string() - .describe( - "Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId", - ) - .nullish(), - filter: CommonModels.OfficeInvoiceFilterDtoSchema.nullish(), - limit: z.number().gte(1).lte(100).describe("Items per response").default(20), - page: z.number().describe("1-indexed page number to begin from").nullish(), - cursor: z.string().describe("ID of item to start after").nullish(), - }) - .readonly(); - export type OfficeInvoiceListQueryDto = z.infer; - - /** - * GenerateAccountStatementOrderParamEnumSchema - * @type { enum } - */ - export const GenerateAccountStatementOrderParamEnumSchema = z.enum([ - "invoiceNumber", - "issuingDate", - "invoiceType", - "amount", - "netAmount", - "currencyNotation", - "dueDate", - "status", - "paidOn", - "serviceDate", - "internalNumber", - "positionNumber", - "invoiceDirection", - "receiver", - "receiverCountry", - "paidAmount", - "totalVat", - "dunningBlock", - "invoiceInReview", - "isInvoiceOk", - "isVatOk", - "comments", - "salesRepName", - "isExportedToBookkeeping", - "createdAt", - "customerReferenceOverride", - "externalSystemId", - ]); - export type GenerateAccountStatementOrderParamEnum = z.infer; - export const GenerateAccountStatementOrderParamEnum = GenerateAccountStatementOrderParamEnumSchema.enum; -} diff --git a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.queries.ts b/test/generated/dist/dunningAccountStatement/dunningAccountStatement.queries.ts deleted file mode 100644 index 9697954..0000000 --- a/test/generated/dist/dunningAccountStatement/dunningAccountStatement.queries.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningAccountStatementAcl } from "./dunningAccountStatement.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; -import { DunningAccountStatementApi } from "./dunningAccountStatement.api"; - -export namespace DunningAccountStatementQueries { - export const moduleName = QueryModule.DunningAccountStatement; - - export const keys = { - all: [moduleName] as const, - dataGenFake: () => [...keys.all, "/data-gen-fake/account-statement"] as const, - generateAccountStatement: ( - officeId: string, - limit?: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/invoices/account-statement", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - generateAccountStatementInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/invoices/account-statement", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - }; - - /** - * Query `useDataGenFake` - * @summary Expose account statement PDF payload DTO for model generation - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useDataGenFake = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.dataGenFake(), - queryFn: () => DunningAccountStatementApi.dataGenFake(config), - ...options, - }); - }; - - /** - * Query `useGenerateAccountStatement` - recommended when file should be cached - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const useGenerateAccountStatement = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CommonModels.OfficeInvoiceFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); - return DunningAccountStatementApi.generateAccountStatement( - officeId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `useGenerateAccountStatementMutation` - recommended when file should not be cached - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } mutation.officeId Path parameter - * @param { number } mutation.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } mutation.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } mutation.filter Query parameter - * @param { number } mutation.page Query parameter. 1-indexed page number to begin from - * @param { string } mutation.cursor Query parameter. ID of item to start after - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGenerateAccountStatementMutation = ( - options?: AppMutationOptions< - typeof DunningAccountStatementApi.generateAccountStatement, - { - officeId: string; - limit: number; - order?: string; - filter?: CommonModels.OfficeInvoiceFilterDto; - page?: number; - cursor?: string; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); - return DunningAccountStatementApi.generateAccountStatement( - officeId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, limit } = variables; - const updateKeys = [keys.generateAccountStatement(officeId, limit)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Infinite query `useGenerateAccountStatementInfinite - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useGenerateAccountStatementInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CommonModels.OfficeInvoiceFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId })); - return DunningAccountStatementApi.generateAccountStatement( - officeId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useGetAccountStatementEml` - recommended when file should not be cached - * @summary Get account statement as EML file with PDF attachment - * @permission Requires `canUseGetAccountStatementEml` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningAccountStatementModels.OfficeInvoiceListQueryDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useGetAccountStatementEml = ( - options?: AppMutationOptions< - typeof DunningAccountStatementApi.getAccountStatementEml, - { officeId: string; data: DunningAccountStatementModels.OfficeInvoiceListQueryDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId })); - return DunningAccountStatementApi.getAccountStatementEml(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/dunningLevels/dunningLevels.acl.ts b/test/generated/dist/dunningLevels/dunningLevels.acl.ts deleted file mode 100644 index 55850c2..0000000 --- a/test/generated/dist/dunningLevels/dunningLevels.acl.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningLevelsAcl { - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List dunning level labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Read", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; - - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List dunning levels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Read", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Create", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; - - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get dunning level by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Read", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Update", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive a dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Archive", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive a dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Unarchive", object ? subject("DunningLevel", object) : "DunningLevel"] as AbilityTuple< - "Unarchive", - "DunningLevel" | (ForcedSubject<"DunningLevel"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/dunningLevels/dunningLevels.api.ts b/test/generated/dist/dunningLevels/dunningLevels.api.ts deleted file mode 100644 index 8a08b80..0000000 --- a/test/generated/dist/dunningLevels/dunningLevels.api.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningLevelsModels } from "./dunningLevels.models"; - -export namespace DunningLevelsApi { - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, - `/offices/${officeId}/dunning-levels/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const list = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, - `/offices/${officeId}/dunning-levels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = ( - officeId: string, - data: DunningLevelsModels.CreateDunningLevelRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels`, - ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), - config, - ); - }; - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}`, - config, - ); - }; - export const update = ( - id: string, - officeId: string, - data: DunningLevelsModels.UpdateDunningLevelRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}`, - ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/dunningLevels/dunningLevels.configs.ts b/test/generated/dist/dunningLevels/dunningLevels.configs.ts deleted file mode 100644 index 73a46f7..0000000 --- a/test/generated/dist/dunningLevels/dunningLevels.configs.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningLevelsModels } from "./dunningLevels.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningLevelsQueries } from "./dunningLevels.queries"; -import { DunningLevelsAcl } from "./dunningLevels.acl"; - -export namespace DunningLevelsConfigs { - export const dunningLevelsConfig = { - meta: { - title: "Dunning Levels", - }, - readAll: { - acl: DunningLevelsAcl.canUseList, - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - paginated: DunningLevelsQueries.useList, - infinite: DunningLevelsQueries.useListInfinite, - filters: { - schema: DunningLevelsModels.DunningLevelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningLevelsModels.DunningLevelFilterDtoSchema, - options: { - inputs: { - dunningSystemId: true, - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - options: { - columns: { - id: true, - level: true, - daysOverdue: true, - dunningFee: true, - interestRate: true, - usedInOfficeId: true, - usedInOffice: true, - dunningSystem: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - archived: true, - bodyRemarks: true, - footerRemarks: true, - }, - sortable: DunningLevelsModels.DunningLevelsListOrderParamEnumSchema, - }, - }), - }, - read: { - acl: DunningLevelsAcl.canUseFindById, - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - query: DunningLevelsQueries.useFindById, - }, - create: { - acl: DunningLevelsAcl.canUseCreate, - schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, - mutation: DunningLevelsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, - options: { - inputs: { - level: true, - daysOverdue: true, - dunningFee: true, - dunningSystemId: true, - interestRate: true, - bodyRemarks: true, - footerRemarks: true, - }, - }, - }), - }, - update: { - acl: DunningLevelsAcl.canUseUpdate, - schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, - mutation: DunningLevelsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, - options: { - inputs: { - level: true, - daysOverdue: true, - dunningFee: true, - interestRate: true, - dunningSystemId: true, - bodyRemarks: true, - footerRemarks: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DunningLevelsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DunningLevelsQueries.usePaginateLabels, - infinite: DunningLevelsQueries.usePaginateLabelsInfinite, - filters: { - schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/dunningLevels/dunningLevels.models.ts b/test/generated/dist/dunningLevels/dunningLevels.models.ts deleted file mode 100644 index 2046ede..0000000 --- a/test/generated/dist/dunningLevels/dunningLevels.models.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningLevelsModels { - /** - * DunningLevelOfficeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } currencyNotation - */ - export const DunningLevelOfficeDTOSchema = z - .object({ id: z.string(), name: z.string(), currencyNotation: z.string() }) - .readonly(); - export type DunningLevelOfficeDTO = z.infer; - - /** - * DunningLevelEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DunningLevelEmployeeDTO = z.infer; - - /** - * DunningLevelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { number } level - * @property { number } daysOverdue - * @property { number } dunningFee - * @property { number } interestRate - * @property { string } usedInOfficeId - * @property { DunningLevelOfficeDTO } usedInOffice - * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem - * @property { string } createdById - * @property { DunningLevelEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DunningLevelEmployeeDTO } updatedBy - * @property { string } updatedAt - * @property { boolean } archived - * @property { CommonModels.EditorContentResponseDto } bodyRemarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks - */ - export const DunningLevelResponseDTOSchema = z - .object({ - id: z.string(), - level: z.number(), - daysOverdue: z.number(), - dunningFee: z.number(), - interestRate: z.number().nullish(), - usedInOfficeId: z.string(), - usedInOffice: DunningLevelOfficeDTOSchema.nullish(), - dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), - createdById: z.string().nullish(), - createdBy: DunningLevelEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: DunningLevelEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - archived: z.boolean(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), - }) - .readonly(); - export type DunningLevelResponseDTO = z.infer; - - /** - * CreateDunningLevelRequestDTOSchema - * @type { object } - * @property { number } level Dunning level number. Minimum: `1` - * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` - * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` - * @property { string } dunningSystemId Dunning system ID - * @property { number } interestRate Minimum: `0`. Maximum: `100` - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const CreateDunningLevelRequestDTOSchema = z - .object({ - level: z.number().gte(1).describe("Dunning level number"), - daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), - dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), - dunningSystemId: z.string().describe("Dunning system ID").nullish(), - interestRate: z.number().gte(0).lte(100).nullish(), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks").nullish(), - }) - .readonly(); - export type CreateDunningLevelRequestDTO = z.infer; - - /** - * UpdateDunningLevelRequestDTOSchema - * @type { object } - * @property { number } level Dunning level number. Minimum: `1` - * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` - * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` - * @property { number } interestRate Minimum: `0`. Maximum: `100` - * @property { string } dunningSystemId Dunning system ID - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateDunningLevelRequestDTOSchema = z - .object({ - level: z.number().gte(1).describe("Dunning level number"), - daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), - dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), - interestRate: z.number().gte(0).lte(100), - dunningSystemId: z.string().describe("Dunning system ID"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateDunningLevelRequestDTO = z.infer; - - /** - * DunningLevelLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const DunningLevelLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type DunningLevelLabelFilterDto = z.infer; - - /** - * DunningLevelFilterDtoSchema - * @type { object } - * @property { string } dunningSystemId Dunning system ID to filter by - * @property { string } search Search to filter by - * @property { boolean } archived Filter by archived status - */ - export const DunningLevelFilterDtoSchema = z - .object({ - dunningSystemId: z.string().describe("Dunning system ID to filter by"), - search: z.string().describe("Search to filter by"), - archived: z.boolean().describe("Filter by archived status"), - }) - .readonly(); - export type DunningLevelFilterDto = z.infer; - - /** - * DunningLevelsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const DunningLevelsPaginateLabelsOrderParamEnumSchema = z.enum([ - "level", - "daysOverdue", - "dunningFee", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DunningLevelsPaginateLabelsOrderParamEnum = z.infer< - typeof DunningLevelsPaginateLabelsOrderParamEnumSchema - >; - export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLabelsOrderParamEnumSchema.enum; - - /** - * DunningLevelsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const DunningLevelsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DunningLevelsPaginateLabelsResponse = z.infer; - - /** - * DunningLevelsListOrderParamEnumSchema - * @type { enum } - */ - export const DunningLevelsListOrderParamEnumSchema = z.enum([ - "level", - "daysOverdue", - "dunningFee", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type DunningLevelsListOrderParamEnum = z.infer; - export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSchema.enum; - - /** - * DunningLevelsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningLevelResponseDTO[] } items - */ - export const DunningLevelsListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(DunningLevelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DunningLevelsListResponse = z.infer; -} diff --git a/test/generated/dist/dunningLevels/dunningLevels.queries.ts b/test/generated/dist/dunningLevels/dunningLevels.queries.ts deleted file mode 100644 index 9792c9b..0000000 --- a/test/generated/dist/dunningLevels/dunningLevels.queries.ts +++ /dev/null @@ -1,420 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningLevelsAcl } from "./dunningLevels.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningLevelsModels } from "./dunningLevels.models"; -import { DunningLevelsApi } from "./dunningLevels.api"; - -export namespace DunningLevelsQueries { - export const moduleName = QueryModule.DunningLevels; - - export const keys = { - all: [moduleName] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/dunning-levels/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/dunning-levels/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - list: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/dunning-levels", officeId, limit, order, filter, page, cursor] as const, - listInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningLevelsModels.DunningLevelFilterDto, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/dunning-levels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/dunning-levels/:id", id, officeId] as const, - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate dunning level labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningLevelsModels.DunningLevelLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId })); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate dunning level labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningLevelsModels.DunningLevelLabelFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId })); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useList` - * @summary List dunning levels - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningLevelsModels.DunningLevelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUseList({ officeId })); - return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List dunning levels - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningLevelsModels.DunningLevelFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningLevelsAcl.canUseList({ officeId })); - return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create dunning level - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningLevelsModels.CreateDunningLevelRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof DunningLevelsApi.create, - { officeId: string; data: DunningLevelsModels.CreateDunningLevelRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningLevelsAcl.canUseCreate({ officeId })); - return DunningLevelsApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get dunning level by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUseFindById({ officeId })); - return DunningLevelsApi.findById(id, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update dunning level - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningLevelsModels.UpdateDunningLevelRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof DunningLevelsApi.update, - { id: string; officeId: string; data: DunningLevelsModels.UpdateDunningLevelRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(DunningLevelsAcl.canUseUpdate({ officeId })); - return DunningLevelsApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive a dunning level - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningLevelsAcl.canUseArchive({ officeId })); - return DunningLevelsApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive a dunning level - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId })); - return DunningLevelsApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/dunningManagement/dunningManagement.acl.ts b/test/generated/dist/dunningManagement/dunningManagement.acl.ts deleted file mode 100644 index 6e5c932..0000000 --- a/test/generated/dist/dunningManagement/dunningManagement.acl.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningManagementAcl { - /** - * Use for `useListDunnings` query ability. For global ability, omit the object parameter. - * @description List dunnings - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListDunnings` query - */ - export const canUseListDunnings = (object?: { officeId: string }) => - ["Read", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< - "Read", - "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) - >; - - /** - * Use for `useCreateDunningWithInvoices` mutation ability. For global ability, omit the object parameter. - * @description Create dunning - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDunningWithInvoices` mutation - */ - export const canUseCreateDunningWithInvoices = (object?: { officeId: string }) => - ["Create", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< - "Create", - "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) - >; - - /** - * Use for `useGetDunningEml` query or `useGetDunningEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download dunning as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDunningEml` query or `useGetDunningEmlMutation` mutation - */ - export const canUseGetDunningEml = (object?: { officeId: string }) => - ["Read", object ? subject("Dunning", object) : "Dunning"] as AbilityTuple< - "Read", - "Dunning" | (ForcedSubject<"Dunning"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/dunningManagement/dunningManagement.api.ts b/test/generated/dist/dunningManagement/dunningManagement.api.ts deleted file mode 100644 index 57126e1..0000000 --- a/test/generated/dist/dunningManagement/dunningManagement.api.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningManagementModels } from "./dunningManagement.models"; - -export namespace DunningManagementApi { - export const listDunnings = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningManagementModels.DunningFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: DunningManagementModels.ListDunningsResponseSchema }, - `/offices/${officeId}/dunnings`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const createDunningWithInvoices = ( - partnerId: string, - officeId: string, - data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: DunningManagementModels.DunningResponseDtoSchema }, - `/offices/${officeId}/partners/${partnerId}/dunnings`, - ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), - config, - ); - }; - export const dataGenFake = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, - `/data-gen-fake`, - config, - ); - }; - export const getDunningEml = (officeId: string, dunningId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/dunnings/${dunningId}/eml`, { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }); - }; -} diff --git a/test/generated/dist/dunningManagement/dunningManagement.configs.ts b/test/generated/dist/dunningManagement/dunningManagement.configs.ts deleted file mode 100644 index 6c13fc7..0000000 --- a/test/generated/dist/dunningManagement/dunningManagement.configs.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningManagementModels } from "./dunningManagement.models"; -import { DunningManagementQueries } from "./dunningManagement.queries"; -import { DunningManagementAcl } from "./dunningManagement.acl"; - -export namespace DunningManagementConfigs { - export const dunningsConfig = { - meta: { - title: "Dunnings", - }, - readAll: { - acl: DunningManagementAcl.canUseListDunnings, - schema: DunningManagementModels.DunningResponseDtoSchema, - paginated: DunningManagementQueries.useListDunnings, - infinite: DunningManagementQueries.useListDunningsInfinite, - filters: { - schema: DunningManagementModels.DunningFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningManagementModels.DunningFilterDtoSchema, - options: { - inputs: { - status: true, - partnerId: true, - level: true, - outstandingAmountMin: true, - outstandingAmountMax: true, - createdFrom: true, - createdTo: true, - confirmedBy: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: DunningManagementModels.DunningResponseDtoSchema, - options: { - columns: { - id: true, - partner: true, - level: true, - dunningLevelId: true, - status: true, - invoiceCount: true, - outstandingAmount: true, - currencyNotation: true, - daysOverdue: true, - dunningFee: true, - createdAt: true, - statusChangedOn: true, - confirmedBy: true, - documentUrl: true, - }, - sortable: DunningManagementModels.ListDunningsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/dunningManagement/dunningManagement.models.ts b/test/generated/dist/dunningManagement/dunningManagement.models.ts deleted file mode 100644 index 1e56fe9..0000000 --- a/test/generated/dist/dunningManagement/dunningManagement.models.ts +++ /dev/null @@ -1,299 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningManagementModels { - /** - * DunningPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ - export const DunningPartnerDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), - }) - .readonly(); - export type DunningPartnerDto = z.infer; - - /** - * DunningConfirmedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DunningConfirmedByDto = z.infer; - - /** - * DunningStatusSchema - * @type { enum } - */ - export const DunningStatusSchema = z.enum(["PREPARED", "ISSUED"]); - export type DunningStatus = z.infer; - export const DunningStatus = DunningStatusSchema.enum; - - /** - * DunningResponseDtoSchema - * @type { object } - * @property { string } id - * @property { DunningPartnerDto } partner - * @property { number } level - * @property { string } dunningLevelId - * @property { string } status - * @property { number } invoiceCount - * @property { number } outstandingAmount - * @property { string } currencyNotation - * @property { number } daysOverdue - * @property { number } dunningFee - * @property { string } createdAt - * @property { string } statusChangedOn - * @property { DunningConfirmedByDto } confirmedBy - * @property { string } documentUrl - */ - export const DunningResponseDtoSchema = z - .object({ - id: z.string(), - partner: DunningPartnerDtoSchema, - level: z.number(), - dunningLevelId: z.string().nullish(), - status: DunningStatusSchema, - invoiceCount: z.number(), - outstandingAmount: z.number(), - currencyNotation: z.string(), - daysOverdue: z.number(), - dunningFee: z.number(), - createdAt: z.iso.datetime({ offset: true }), - statusChangedOn: z.iso.datetime({ offset: true }), - confirmedBy: DunningConfirmedByDtoSchema.nullish(), - documentUrl: z.string().nullish(), - }) - .readonly(); - export type DunningResponseDto = z.infer; - - /** - * DunningFilterDtoSchema - * @type { object } - * @property { DunningStatus[] } status - * @property { string } partnerId Partner ID to filter by - * @property { array[] } level Dunning level(s) to filter by - * @property { number } outstandingAmountMin Minimum outstanding amount - * @property { number } outstandingAmountMax Maximum outstanding amount - * @property { string } createdFrom Created from (ISO date string) - * @property { string } createdTo Created to (ISO date string) - * @property { string } confirmedBy Confirmed by employee ID - */ - export const DunningFilterDtoSchema = z - .object({ - status: z.array(DunningStatusSchema).readonly(), - partnerId: z.string().describe("Partner ID to filter by"), - level: z.array(z.array(z.any()).readonly()).readonly().describe("Dunning level(s) to filter by"), - outstandingAmountMin: z.number().describe("Minimum outstanding amount"), - outstandingAmountMax: z.number().describe("Maximum outstanding amount"), - createdFrom: z.iso.datetime({ offset: true }).describe("Created from (ISO date string)"), - createdTo: z.iso.datetime({ offset: true }).describe("Created to (ISO date string)"), - confirmedBy: z.string().describe("Confirmed by employee ID"), - }) - .readonly(); - export type DunningFilterDto = z.infer; - - /** - * DunningPdfConfigDTOSchema - * @type { object } - * @property { string } headerImageUrl - * @property { string } footerImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ - export const DunningPdfConfigDTOSchema = z - .object({ - headerImageUrl: z.string(), - footerImageUrl: z.string(), - showWatermarkOnDocuments: z.boolean(), - locale: CommonModels.LocaleEnumSchema.nullish(), - }) - .readonly(); - export type DunningPdfConfigDTO = z.infer; - - /** - * DunningPdfBusinessPartnerDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } address - * @property { string } referenceNumber - */ - export const DunningPdfBusinessPartnerDTOSchema = z - .object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }) - .readonly(); - export type DunningPdfBusinessPartnerDTO = z.infer; - - /** - * DunningPdfInvoiceDTOSchema - * @type { object } - * @property { string } invoiceNumber - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } daysOverdue - * @property { number } dunningLevel - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - * @property { number } interest - */ - export const DunningPdfInvoiceDTOSchema = z - .object({ - invoiceNumber: z.string(), - issuingDate: z.iso.datetime({ offset: true }), - dueDate: z.iso.datetime({ offset: true }).nullish(), - daysOverdue: z.number(), - dunningLevel: z.number(), - invoiceAmount: z.number(), - outstandingAmount: z.number(), - currencyNotation: z.string(), - interest: z.number().nullish(), - }) - .readonly(); - export type DunningPdfInvoiceDTO = z.infer; - - /** - * DunningPdfTotalDTOSchema - * @type { object } - * @property { number } invoicesSum - * @property { number } dunningFee - * @property { number } interest - * @property { string } currencyNotation - */ - export const DunningPdfTotalDTOSchema = z - .object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }) - .readonly(); - export type DunningPdfTotalDTO = z.infer; - - /** - * DunningPdfBankAccountDTOSchema - * @type { object } - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - */ - export const DunningPdfBankAccountDTOSchema = z - .object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }) - .readonly(); - export type DunningPdfBankAccountDTO = z.infer; - - /** - * DunningPdfUpcomingInvoiceDTOSchema - * @type { object } - * @property { string } number - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } dueDays - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - */ - export const DunningPdfUpcomingInvoiceDTOSchema = z - .object({ - number: z.string(), - issuingDate: z.iso.datetime({ offset: true }).nullish(), - dueDate: z.iso.datetime({ offset: true }).nullish(), - dueDays: z.number().nullish(), - invoiceAmount: z.number().nullish(), - outstandingAmount: z.number().nullish(), - currencyNotation: z.string().nullish(), - }) - .readonly(); - export type DunningPdfUpcomingInvoiceDTO = z.infer; - - /** - * DunningPdfPayloadDTOSchema - * @type { object } - * @property { string } dunningId - * @property { number } dunningLevel - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { DunningPdfBusinessPartnerDTO } businessPartner - * @property { DunningPdfInvoiceDTO[] } invoices - * @property { DunningPdfTotalDTO } total - * @property { DunningPdfBankAccountDTO } bankAccount - * @property { string } employeeName - * @property { DunningPdfConfigDTO } config - * @property { CommonModels.LanguageEnum } language - * @property { DunningPdfUpcomingInvoiceDTO[] } upcomingInvoices - */ - export const DunningPdfPayloadDTOSchema = z - .object({ - dunningId: z.string(), - dunningLevel: z.number(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - businessPartner: DunningPdfBusinessPartnerDTOSchema, - invoices: z.array(DunningPdfInvoiceDTOSchema).readonly(), - total: DunningPdfTotalDTOSchema, - bankAccount: DunningPdfBankAccountDTOSchema, - employeeName: z.string().nullable(), - config: DunningPdfConfigDTOSchema, - language: CommonModels.LanguageEnumSchema.nullish(), - upcomingInvoices: z.array(DunningPdfUpcomingInvoiceDTOSchema).readonly().nullish(), - }) - .readonly(); - export type DunningPdfPayloadDTO = z.infer; - - /** - * CreateDunningWithInvoicesRequestDTOSchema - * @type { object } - * @property { string[] } invoiceIds Array of outstanding invoice IDs to include in the dunning. Example: `123e4567-e89b-12d3-a456-426614174000,123e4567-e89b-12d3-a456-426614174001` - * @property { string } dunningLevelId The ID of the dunning level to use for this dunning. Example: `123e4567-e89b-12d3-a456-426614174002` - * @property { number } dunningFee Optional dunning fee to use. If not provided, the fee from the dunning level will be used. Minimum: `0`. Example: `25.5` - * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` - * @property { boolean } includeUpcomingInvoices - */ - export const CreateDunningWithInvoicesRequestDTOSchema = z - .object({ - invoiceIds: z.array(z.string()).readonly().describe("Array of outstanding invoice IDs to include in the dunning"), - dunningLevelId: z.string().describe("The ID of the dunning level to use for this dunning"), - dunningFee: z - .number() - .gte(0) - .describe("Optional dunning fee to use. If not provided, the fee from the dunning level will be used") - .nullish(), - interestRate: z.number().gte(0).lte(100).nullish(), - includeUpcomingInvoices: z.boolean().nullish(), - }) - .readonly(); - export type CreateDunningWithInvoicesRequestDTO = z.infer; - - /** - * ListDunningsOrderParamEnumSchema - * @type { enum } - */ - export const ListDunningsOrderParamEnumSchema = z.enum([ - "createdAt", - "level", - "outstandingAmount", - "statusChangedOn", - ]); - export type ListDunningsOrderParamEnum = z.infer; - export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; - - /** - * ListDunningsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningResponseDto[] } items - */ - export const ListDunningsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(DunningResponseDtoSchema).readonly() }).readonly().shape, - }); - export type ListDunningsResponse = z.infer; -} diff --git a/test/generated/dist/dunningManagement/dunningManagement.queries.ts b/test/generated/dist/dunningManagement/dunningManagement.queries.ts deleted file mode 100644 index 270d1d2..0000000 --- a/test/generated/dist/dunningManagement/dunningManagement.queries.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningManagementAcl } from "./dunningManagement.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningManagementModels } from "./dunningManagement.models"; -import { DunningManagementApi } from "./dunningManagement.api"; - -export namespace DunningManagementQueries { - export const moduleName = QueryModule.DunningManagement; - - export const keys = { - all: [moduleName] as const, - listDunnings: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningManagementModels.DunningFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/dunnings", officeId, limit, order, filter, page, cursor] as const, - listDunningsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningManagementModels.DunningFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/dunnings", "infinite", officeId, limit, order, filter, cursor] as const, - dataGenFake: () => [...keys.all, "/data-gen-fake"] as const, - getDunningEml: (officeId: string, dunningId: string) => - [...keys.all, "/offices/:officeId/dunnings/:dunningId/eml", officeId, dunningId] as const, - }; - - /** - * Query `useListDunnings` - * @summary List dunnings for an office - * @permission Requires `canUseListDunnings` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` - * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListDunnings = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningManagementModels.DunningFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningManagementAcl.canUseListDunnings({ officeId })); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListDunningsInfinite - * @summary List dunnings for an office - * @permission Requires `canUseListDunnings` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` - * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListDunningsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningManagementModels.DunningFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningManagementAcl.canUseListDunnings({ officeId })); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreateDunningWithInvoices` - * @summary Create a dunning with outstanding invoices - * @permission Requires `canUseCreateDunningWithInvoices` ability - * @param { string } mutation.partnerId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningManagementModels.CreateDunningWithInvoicesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateDunningWithInvoices = ( - options?: AppMutationOptions< - typeof DunningManagementApi.createDunningWithInvoices, - { partnerId: string; officeId: string; data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ partnerId, officeId, data }) => { - checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId })); - return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useDataGenFake` - * @summary Expose dunning PDF payload DTO for model generation - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useDataGenFake = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.dataGenFake(), - queryFn: () => DunningManagementApi.dataGenFake(config), - ...options, - }); - }; - - /** - * Query `useGetDunningEml` - recommended when file should be cached - * @summary Get dunning as EML file with PDF attachment - * @permission Requires `canUseGetDunningEml` ability - * @param { string } object.officeId Path parameter - * @param { string } object.dunningId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const useGetDunningEml = ( - { officeId, dunningId }: { officeId: string; dunningId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDunningEml(officeId, dunningId), - queryFn: () => { - checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId })); - return DunningManagementApi.getDunningEml(officeId, dunningId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useGetDunningEmlMutation` - recommended when file should not be cached - * @summary Get dunning as EML file with PDF attachment - * @permission Requires `canUseGetDunningEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.dunningId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGetDunningEmlMutation = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, dunningId }) => { - checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId })); - return DunningManagementApi.getDunningEml(officeId, dunningId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, dunningId } = variables; - const updateKeys = [keys.getDunningEml(officeId, dunningId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts deleted file mode 100644 index 48fca0f..0000000 --- a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningPartnerOutstandingInvoicesAcl { - /** - * Use for `useListPartnerOutstandingInvoiceSummaries` query ability. For global ability, omit the object parameter. - * @description List office outstanding invoice summaries per partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoiceSummaries` query - */ - export const canUseListPartnerOutstandingInvoiceSummaries = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useListPartnerOutstandingInvoices` query ability. For global ability, omit the object parameter. - * @description List partner outstanding invoices - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoices` query - */ - export const canUseListPartnerOutstandingInvoices = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useListRecommendedDunningLevels` mutation ability. For global ability, omit the object parameter. - * @description List recommended dunning levels for a partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRecommendedDunningLevels` mutation - */ - export const canUseListRecommendedDunningLevels = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts deleted file mode 100644 index 68e22c8..0000000 --- a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; - -export namespace DunningPartnerOutstandingInvoicesApi { - export const listPartnerOutstandingInvoiceSummaries = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, - `/offices/${officeId}/partner-outstanding-invoices`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const listPartnerOutstandingInvoices = ( - partnerId: string, - officeId: string, - limit: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, - `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const listRecommendedDunningLevels = ( - partnerId: string, - officeId: string, - data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, - `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, - ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts deleted file mode 100644 index 66cb46a..0000000 --- a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; -import { DunningPartnerOutstandingInvoicesQueries } from "./dunningPartnerOutstandingInvoices.queries"; -import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; - -export namespace DunningPartnerOutstandingInvoicesConfigs { - export const partnerOutstandingInvoicesConfig = { - meta: { - title: "Partner Outstanding Invoices", - }, - readAll: { - acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries, - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, - paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummaries, - infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummariesInfinite, - filters: { - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, - options: { - inputs: { - search: true, - daysOverdueMin: true, - partnerId: true, - outstandingAmountMin: true, - currency: true, - dunningSystemId: true, - lastDunningDate: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, - options: { - columns: { - partnerId: true, - partnerName: true, - partnerCountry: true, - dunningSystemId: true, - dunningSystemName: true, - invoiceCount: true, - daysOverdue: true, - outstandingAmount: true, - currencyNotation: true, - lastDunningDate: true, - }, - sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, - }, - }), - }, - }; - - export const outstandingInvoicesConfig = { - meta: { - title: "Outstanding Invoices", - }, - readAll: { - acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices, - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, - paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoices, - infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoicesInfinite, - filters: { - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, - options: { - inputs: { - partnerId: true, - currency: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, - options: { - columns: { - invoiceId: true, - invoiceNumber: true, - invoiceDate: true, - invoiceAmount: true, - owedAmount: true, - currencyNotation: true, - daysOverdue: true, - dueDate: true, - invoiceInReview: true, - dunningBlock: true, - }, - sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts deleted file mode 100644 index 23aa85a..0000000 --- a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningPartnerOutstandingInvoicesModels { - /** - * PartnerOutstandingInvoiceSummaryFilterDtoSchema - * @type { object } - * @property { string } search Search string (partner name) - * @property { number } daysOverdueMin Minimum days overdue - * @property { string } partnerId Partner ID - * @property { number } outstandingAmountMin Minimum outstanding amount - * @property { string } currency Currency - * @property { string } dunningSystemId Dunning system ID - * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range - */ - export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z - .object({ - search: z.string().describe("Search string (partner name)"), - daysOverdueMin: z.number().describe("Minimum days overdue"), - partnerId: z.string().describe("Partner ID"), - outstandingAmountMin: z.number().describe("Minimum outstanding amount"), - currency: z.string().describe("Currency"), - dunningSystemId: z.string().describe("Dunning system ID"), - lastDunningDate: CommonModels.DateRangeDtoSchema.describe("Last dunning date range"), - }) - .readonly(); - export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer< - typeof PartnerOutstandingInvoiceSummaryFilterDtoSchema - >; - - /** - * PartnerOutstandingInvoiceSummaryResponseDtoSchema - * @type { object } - * @property { string } partnerId Business partner ID - * @property { string } partnerName Business partner name - * @property { string } partnerCountry Business partner country - * @property { string } dunningSystemId Dunning system ID - * @property { string } dunningSystemName Dunning system name - * @property { number } invoiceCount Number of outstanding invoices - * @property { number } daysOverdue Maximum days overdue across all partner invoices - * @property { number } outstandingAmount Total outstanding amount - * @property { string } currencyNotation Currency of partner invoices - * @property { string } lastDunningDate Date of the most recent issued dunning document - */ - export const PartnerOutstandingInvoiceSummaryResponseDtoSchema = z - .object({ - partnerId: z.string().describe("Business partner ID"), - partnerName: z.string().describe("Business partner name"), - partnerCountry: z.string().describe("Business partner country").nullish(), - dunningSystemId: z.string().describe("Dunning system ID"), - dunningSystemName: z.string().describe("Dunning system name"), - invoiceCount: z.number().describe("Number of outstanding invoices"), - daysOverdue: z.number().describe("Maximum days overdue across all partner invoices").nullish(), - outstandingAmount: z.number().describe("Total outstanding amount"), - currencyNotation: z.string().describe("Currency of partner invoices"), - lastDunningDate: z.iso - .datetime({ offset: true }) - .describe("Date of the most recent issued dunning document") - .nullish(), - }) - .readonly(); - export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer< - typeof PartnerOutstandingInvoiceSummaryResponseDtoSchema - >; - - /** - * PartnerOutstandingInvoiceResponseDtoSchema - * @type { object } - * @property { string } invoiceId Invoice ID - * @property { string } invoiceNumber Invoice number - * @property { string } invoiceDate Invoice date - * @property { number } invoiceAmount Invoice amount - * @property { number } owedAmount Owed amount - * @property { string } currencyNotation Currency notation - * @property { number } daysOverdue Days overdue - * @property { string } dueDate Due date - * @property { boolean } invoiceInReview - * @property { boolean } dunningBlock - */ - export const PartnerOutstandingInvoiceResponseDtoSchema = z - .object({ - invoiceId: z.string().describe("Invoice ID"), - invoiceNumber: z.string().describe("Invoice number").nullish(), - invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date").nullish(), - invoiceAmount: z.number().describe("Invoice amount"), - owedAmount: z.number().describe("Owed amount"), - currencyNotation: z.string().describe("Currency notation"), - daysOverdue: z.number().describe("Days overdue").nullish(), - dueDate: z.iso.datetime({ offset: true }).describe("Due date").nullish(), - invoiceInReview: z.boolean().nullish(), - dunningBlock: z.boolean().nullish(), - }) - .readonly(); - export type PartnerOutstandingInvoiceResponseDto = z.infer; - - /** - * PartnerOutstandingInvoiceFilterDtoSchema - * @type { object } - * @property { string } partnerId Partner ID to filter by - * @property { string } currency Invoice currency notation to filter by - */ - export const PartnerOutstandingInvoiceFilterDtoSchema = z - .object({ - partnerId: z.string().describe("Partner ID to filter by"), - currency: z.string().describe("Invoice currency notation to filter by"), - }) - .readonly(); - export type PartnerOutstandingInvoiceFilterDto = z.infer; - - /** - * RecommendedDunningLevelsRequestDtoSchema - * @type { object } - * @property { string[] } invoiceIds Invoice IDs used to calculate the recommended dunning level. Min Items: `1`. Example: `123e4567-e89b-12d3-a456-426614174000` - */ - export const RecommendedDunningLevelsRequestDtoSchema = z - .object({ - invoiceIds: z - .array(z.string()) - .readonly() - .min(1) - .describe("Invoice IDs used to calculate the recommended dunning level"), - }) - .readonly(); - export type RecommendedDunningLevelsRequestDto = z.infer; - - /** - * RecommendedLabelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { boolean } isRecommended - */ - export const RecommendedLabelResponseDtoSchema = z - .object({ id: z.string(), label: z.string(), isRecommended: z.boolean() }) - .readonly(); - export type RecommendedLabelResponseDto = z.infer; - - /** - * ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema - * @type { enum } - */ - export const ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema = z.enum([ - "outstandingAmount", - "daysOverdue", - "lastDunningDate", - "invoiceCount", - "partnerCountry", - "partnerName", - "dunningSystemName", - ]); - export type ListPartnerOutstandingInvoiceSummariesOrderParamEnum = z.infer< - typeof ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema - >; - export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = - ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema.enum; - - /** - * ListPartnerOutstandingInvoiceSummariesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items - */ - export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).readonly() }).readonly().shape, - }); - export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer< - typeof ListPartnerOutstandingInvoiceSummariesResponseSchema - >; - - /** - * ListPartnerOutstandingInvoicesOrderParamEnumSchema - * @type { enum } - */ - export const ListPartnerOutstandingInvoicesOrderParamEnumSchema = z.enum(["dueDate", "invoiceDate", "owedAmount"]); - export type ListPartnerOutstandingInvoicesOrderParamEnum = z.infer< - typeof ListPartnerOutstandingInvoicesOrderParamEnumSchema - >; - export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandingInvoicesOrderParamEnumSchema.enum; - - /** - * ListPartnerOutstandingInvoicesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerOutstandingInvoiceResponseDto[] } items - */ - export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).readonly() }).readonly().shape, - }); - export type ListPartnerOutstandingInvoicesResponse = z.infer; - - /** - * ListRecommendedDunningLevelsResponseSchema - * @type { array } - */ - export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema).readonly(); - export type ListRecommendedDunningLevelsResponse = z.infer; -} diff --git a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts b/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts deleted file mode 100644 index 5719173..0000000 --- a/test/generated/dist/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts +++ /dev/null @@ -1,365 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; -import { DunningPartnerOutstandingInvoicesApi } from "./dunningPartnerOutstandingInvoices.api"; - -export namespace DunningPartnerOutstandingInvoicesQueries { - export const moduleName = QueryModule.DunningPartnerOutstandingInvoices; - - export const keys = { - all: [moduleName] as const, - listPartnerOutstandingInvoiceSummaries: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/partner-outstanding-invoices", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - listPartnerOutstandingInvoiceSummariesInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/partner-outstanding-invoices", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - listPartnerOutstandingInvoices: ( - partnerId: string, - officeId: string, - limit?: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/partners/:partnerId/outstanding-invoices", - partnerId, - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - listPartnerOutstandingInvoicesInfinite: ( - partnerId: string, - officeId: string, - limit?: number, - order?: string, - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/partners/:partnerId/outstanding-invoices", - "infinite", - partnerId, - officeId, - limit, - order, - filter, - cursor, - ] as const, - }; - - /** - * Query `useListPartnerOutstandingInvoiceSummaries` - * @summary List office outstanding invoice summaries per partner - * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListPartnerOutstandingInvoiceSummaries = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions< - typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries, - TData - >, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId })); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries( - officeId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - }); - }; - - /** - * Infinite query `useListPartnerOutstandingInvoiceSummariesInfinite - * @summary List office outstanding invoice summaries per partner - * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListPartnerOutstandingInvoiceSummariesInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions< - typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries, - TData - >, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId })); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries( - officeId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useListPartnerOutstandingInvoices` - * @summary List outstanding invoices for a specific partner - * @permission Requires `canUseListPartnerOutstandingInvoices` ability - * @param { string } object.partnerId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListPartnerOutstandingInvoices = ( - { - partnerId, - officeId, - limit, - order, - filter, - page, - cursor, - }: { - partnerId: string; - officeId: string; - limit: number; - order?: string; - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId })); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices( - partnerId, - officeId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - }); - }; - - /** - * Infinite query `useListPartnerOutstandingInvoicesInfinite - * @summary List outstanding invoices for a specific partner - * @permission Requires `canUseListPartnerOutstandingInvoices` ability - * @param { string } object.partnerId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListPartnerOutstandingInvoicesInfinite = ( - { - partnerId, - officeId, - limit, - order, - filter, - cursor, - }: { - partnerId: string; - officeId: string; - limit: number; - order?: string; - filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions< - typeof DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices, - TData - >, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId })); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices( - partnerId, - officeId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useListRecommendedDunningLevels` - * @summary List recommended dunning levels for a partner - * @permission Requires `canUseListRecommendedDunningLevels` ability - * @param { string } mutation.partnerId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useListRecommendedDunningLevels = ( - options?: AppMutationOptions< - typeof DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels, - { - partnerId: string; - officeId: string; - data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ partnerId, officeId, data }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId })); - return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/dunningSystems/dunningSystems.acl.ts b/test/generated/dist/dunningSystems/dunningSystems.acl.ts deleted file mode 100644 index 2074067..0000000 --- a/test/generated/dist/dunningSystems/dunningSystems.acl.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningSystemsAcl { - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List dunning system labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Read", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; - - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List dunning systems - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Read", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Create", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; - - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get dunning system by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Read", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Update", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Archive", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("DunningSystem", object) : "DunningSystem"] as AbilityTuple< - "Archive", - "DunningSystem" | (ForcedSubject<"DunningSystem"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/dunningSystems/dunningSystems.api.ts b/test/generated/dist/dunningSystems/dunningSystems.api.ts deleted file mode 100644 index 684714b..0000000 --- a/test/generated/dist/dunningSystems/dunningSystems.api.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningSystemsModels } from "./dunningSystems.models"; - -export namespace DunningSystemsApi { - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, - `/offices/${officeId}/dunning-systems/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, - `/offices/${officeId}/dunning-systems`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = ( - officeId: string, - data: DunningSystemsModels.CreateDunningSystemRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems`, - ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), - config, - ); - }; - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}`, - config, - ); - }; - export const update = ( - id: string, - officeId: string, - data: DunningSystemsModels.UpdateDunningSystemRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}`, - ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/dunningSystems/dunningSystems.configs.ts b/test/generated/dist/dunningSystems/dunningSystems.configs.ts deleted file mode 100644 index 4928e9a..0000000 --- a/test/generated/dist/dunningSystems/dunningSystems.configs.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningSystemsModels } from "./dunningSystems.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningSystemsQueries } from "./dunningSystems.queries"; -import { DunningSystemsAcl } from "./dunningSystems.acl"; - -export namespace DunningSystemsConfigs { - export const dunningSystemsConfig = { - meta: { - title: "Dunning Systems", - }, - readAll: { - acl: DunningSystemsAcl.canUsePaginate, - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - paginated: DunningSystemsQueries.usePaginate, - infinite: DunningSystemsQueries.usePaginateInfinite, - filters: { - schema: DunningSystemsModels.DunningSystemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningSystemsModels.DunningSystemFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - isDefault: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - isDefault: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: DunningSystemsAcl.canUseFindById, - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - query: DunningSystemsQueries.useFindById, - }, - create: { - acl: DunningSystemsAcl.canUseCreate, - schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, - mutation: DunningSystemsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, - options: { - inputs: { - name: true, - isDefault: true, - }, - }, - }), - }, - update: { - acl: DunningSystemsAcl.canUseUpdate, - schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, - mutation: DunningSystemsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, - options: { - inputs: { - name: true, - isDefault: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DunningSystemsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DunningSystemsQueries.usePaginateLabels, - infinite: DunningSystemsQueries.usePaginateLabelsInfinite, - filters: { - schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/dunningSystems/dunningSystems.models.ts b/test/generated/dist/dunningSystems/dunningSystems.models.ts deleted file mode 100644 index f3465f1..0000000 --- a/test/generated/dist/dunningSystems/dunningSystems.models.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningSystemsModels { - /** - * DunningSystemEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type DunningSystemEmployeeDTO = z.infer; - - /** - * DunningSystemResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name - * @property { boolean } isDefault - * @property { boolean } archived - * @property { string } archivedAt - * @property { string } createdById - * @property { DunningSystemEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DunningSystemEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const DunningSystemResponseDTOSchema = z - .object({ - id: z.string(), - officeId: z.string(), - name: z.string(), - isDefault: z.boolean(), - archived: z.boolean(), - archivedAt: z.iso.datetime({ offset: true }).nullish(), - createdById: z.string().nullish(), - createdBy: DunningSystemEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: DunningSystemEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type DunningSystemResponseDTO = z.infer; - - /** - * DunningSystemLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const DunningSystemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type DunningSystemLabelFilterDto = z.infer; - - /** - * DunningSystemFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - * @property { boolean } isDefault - */ - export const DunningSystemFilterDtoSchema = z - .object({ search: z.string(), archived: z.boolean(), isDefault: z.boolean() }) - .readonly(); - export type DunningSystemFilterDto = z.infer; - - /** - * CreateDunningSystemRequestDTOSchema - * @type { object } - * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` - * @property { boolean } isDefault Is default dunning system - */ - export const CreateDunningSystemRequestDTOSchema = z - .object({ - name: z.string().min(3).max(100).describe("Dunning system name"), - isDefault: z.boolean().describe("Is default dunning system").nullish(), - }) - .readonly(); - export type CreateDunningSystemRequestDTO = z.infer; - - /** - * UpdateDunningSystemRequestDTOSchema - * @type { object } - * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` - * @property { boolean } isDefault Is default dunning system - */ - export const UpdateDunningSystemRequestDTOSchema = z - .object({ - name: z.string().min(3).max(100).describe("Dunning system name"), - isDefault: z.boolean().describe("Is default dunning system"), - }) - .readonly(); - export type UpdateDunningSystemRequestDTO = z.infer; - - /** - * DunningSystemsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const DunningSystemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); - export type DunningSystemsPaginateLabelsOrderParamEnum = z.infer< - typeof DunningSystemsPaginateLabelsOrderParamEnumSchema - >; - export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginateLabelsOrderParamEnumSchema.enum; - - /** - * DunningSystemsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const DunningSystemsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DunningSystemsPaginateLabelsResponse = z.infer; - - /** - * DunningSystemsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const DunningSystemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); - export type DunningSystemsPaginateOrderParamEnum = z.infer; - export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderParamEnumSchema.enum; - - /** - * DunningSystemsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningSystemResponseDTO[] } items - */ - export const DunningSystemsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(DunningSystemResponseDTOSchema).readonly() }).readonly().shape, - }); - export type DunningSystemsPaginateResponse = z.infer; -} diff --git a/test/generated/dist/dunningSystems/dunningSystems.queries.ts b/test/generated/dist/dunningSystems/dunningSystems.queries.ts deleted file mode 100644 index acd8234..0000000 --- a/test/generated/dist/dunningSystems/dunningSystems.queries.ts +++ /dev/null @@ -1,420 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningSystemsAcl } from "./dunningSystems.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningSystemsModels } from "./dunningSystems.models"; -import { DunningSystemsApi } from "./dunningSystems.api"; - -export namespace DunningSystemsQueries { - export const moduleName = QueryModule.DunningSystems; - - export const keys = { - all: [moduleName] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/dunning-systems/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/dunning-systems/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/dunning-systems", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: DunningSystemsModels.DunningSystemFilterDto, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/dunning-systems", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/dunning-systems/:id", id, officeId] as const, - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate dunning system labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningSystemsModels.DunningSystemLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId })); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate dunning system labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningSystemsModels.DunningSystemLabelFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId })); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginate` - * @summary List dunning systems - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningSystemsModels.DunningSystemFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUsePaginate({ officeId })); - return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary List dunning systems - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: DunningSystemsModels.DunningSystemFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningSystemsAcl.canUsePaginate({ officeId })); - return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create dunning system - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningSystemsModels.CreateDunningSystemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof DunningSystemsApi.create, - { officeId: string; data: DunningSystemsModels.CreateDunningSystemRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningSystemsAcl.canUseCreate({ officeId })); - return DunningSystemsApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get dunning system by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUseFindById({ officeId })); - return DunningSystemsApi.findById(id, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update dunning system - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningSystemsModels.UpdateDunningSystemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof DunningSystemsApi.update, - { id: string; officeId: string; data: DunningSystemsModels.UpdateDunningSystemRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(DunningSystemsAcl.canUseUpdate({ officeId })); - return DunningSystemsApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive dunning system - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningSystemsAcl.canUseArchive({ officeId })); - return DunningSystemsApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive dunning system - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId })); - return DunningSystemsApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/employee/employee.acl.ts b/test/generated/dist/employee/employee.acl.ts deleted file mode 100644 index 29c1627..0000000 --- a/test/generated/dist/employee/employee.acl.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmployeeAcl { - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List employees - * @param { string } object.officeId officeId from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId?: string }) => - ["Read", object ? subject("Employee", object) : "Employee"] as AbilityTuple< - "Read", - "Employee" | (ForcedSubject<"Employee"> & { officeId?: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new employee - * @param { string } object.officeId officeId from mutation data - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId?: string }) => - ["Create", object ? subject("Employee", object) : "Employee"] as AbilityTuple< - "Create", - "Employee" | (ForcedSubject<"Employee"> & { officeId?: string }) - >; - - /** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; - - /** - * Use for `useResendOnboardingWithOffice` mutation ability. For global ability, omit the object parameter. - * @description Resend employee onboarding email - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useResendOnboardingWithOffice` mutation - */ - export const canUseResendOnboardingWithOffice = (object?: { officeId: string }) => - ["Create", object ? subject("Employee", object) : "Employee"] as AbilityTuple< - "Create", - "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) - >; - - /** - * Use for `useGet` query ability. - * @description Read Office Employee - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = () => ["Read", "Employee"] as AbilityTuple<"Read", "Employee">; - - /** - * Use for `useUpdate` mutation ability. - * @description Update Office Employee - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Employee"] as AbilityTuple<"Update", "Employee">; - - /** - * Use for `useGetWithOffice` query ability. For global ability, omit the object parameter. - * @description Read Office Employee - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetWithOffice` query - */ - export const canUseGetWithOffice = (object?: { officeId: string }) => - ["Read", object ? subject("Employee", object) : "Employee"] as AbilityTuple< - "Read", - "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) - >; - - /** - * Use for `useUpdateWithOffice` mutation ability. For global ability, omit the object parameter. - * @description Update Office Employee - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateWithOffice` mutation - */ - export const canUseUpdateWithOffice = (object?: { officeId: string }) => - ["Update", object ? subject("Employee", object) : "Employee"] as AbilityTuple< - "Update", - "Employee" | (ForcedSubject<"Employee"> & { officeId: string }) - >; - - /** - * Use for `useListRoles` query ability. - * @description List employee (global) roles - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query - */ - export const canUseListRoles = () => ["ListRoles", "Employee"] as AbilityTuple<"ListRoles", "Employee">; - - /** - * Use for `useUpdateRoles` mutation ability. - * @description Update employee (global) roles - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation - */ - export const canUseUpdateRoles = () => ["UpdateRoles", "Employee"] as AbilityTuple<"UpdateRoles", "Employee">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "Employee"] as AbilityTuple<"Archive", "Employee">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Unarchive", "Employee"] as AbilityTuple<"Unarchive", "Employee">; -} diff --git a/test/generated/dist/employee/employee.api.ts b/test/generated/dist/employee/employee.api.ts deleted file mode 100644 index fdf9cd7..0000000 --- a/test/generated/dist/employee/employee.api.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeModels } from "./employee.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeApi { - export const paginate = ( - limit: number, - order?: string, - populate?: EmployeeModels.EmployeePaginatePopulateParam, - filter?: EmployeeModels.EmployeeFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: EmployeeModels.EmployeePaginateResponseSchema }, `/employees`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { - type: "query", - name: "populate", - }), - filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: EmployeeModels.EmployeeCreateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees`, - ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), - config, - ); - }; - export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/one-step`, - ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), - config, - ); - }; - export const findAll = (search?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, `/employees/labels`, { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - }); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: EmployeeModels.EmployeeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, - `/employees/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const resendOnboarding = (employeeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/employees/${employeeId}/resend-onboarding`, - undefined, - config, - ); - }; - export const resendOnboardingWithOffice = (officeId: string, employeeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, - undefined, - config, - ); - }; - export const get = ( - employeeId: string, - populate?: EmployeeModels.EmployeeGetPopulateParam, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: EmployeeModels.EmployeeResponseSchema }, `/employees/${employeeId}`, { - ...config, - params: { - populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { - type: "query", - name: "populate", - }), - }, - }); - }; - export const update = ( - employeeId: string, - data: EmployeeModels.EmployeeUpdateRequest, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}`, - ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - config, - ); - }; - export const getWithOffice = ( - officeId: string, - employeeId: string, - populate?: EmployeeModels.GetWithOfficePopulateParam, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/offices/${officeId}/employees/${employeeId}`, - { - ...config, - params: { - populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { - type: "query", - name: "populate", - }), - }, - }, - ); - }; - export const updateWithOffice = ( - officeId: string, - employeeId: string, - data: EmployeeModels.EmployeeUpdateRequest, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/offices/${officeId}/employees/${employeeId}`, - ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - config, - ); - }; - export const listRoles = (employeeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, - `/employees/${employeeId}/roles`, - config, - ); - }; - export const updateRoles = ( - employeeId: string, - data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, - `/employees/${employeeId}/roles`, - ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), - config, - ); - }; - export const archive = (employeeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}/archive`, - undefined, - config, - ); - }; - export const unarchive = (employeeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/employee/employee.configs.ts b/test/generated/dist/employee/employee.configs.ts deleted file mode 100644 index d2e574e..0000000 --- a/test/generated/dist/employee/employee.configs.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeeModels } from "./employee.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeQueries } from "./employee.queries"; -import { EmployeeAcl } from "./employee.acl"; - -export namespace EmployeeConfigs { - export const employeesConfig = { - meta: { - title: "Employees", - }, - readAll: { - acl: EmployeeAcl.canUsePaginate, - schema: EmployeeModels.EmployeeResponseSchema, - paginated: EmployeeQueries.usePaginate, - infinite: EmployeeQueries.usePaginateInfinite, - filters: { - schema: EmployeeModels.EmployeeFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeFilterDtoSchema, - options: { - inputs: { - office: true, - roles: true, - primaryOfficeId: true, - firstName: true, - lastName: true, - email: true, - ids: true, - archived: true, - search: true, - officeRole: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: EmployeeModels.EmployeeResponseSchema, - options: { - columns: { - id: true, - email: true, - firstName: true, - lastName: true, - locale: true, - phone: true, - archived: true, - primaryOfficeId: true, - primaryOffice: true, - employments: true, - roles: true, - createdAt: true, - updatedAt: true, - }, - sortable: EmployeeModels.EmployeePaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: EmployeeAcl.canUseGet, - schema: EmployeeModels.EmployeeResponseSchema, - query: EmployeeQueries.useGet, - }, - create: { - acl: EmployeeAcl.canUseCreate, - schema: EmployeeModels.EmployeeCreateRequestSchema, - mutation: EmployeeQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeCreateRequestSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - locale: true, - primaryOfficeId: true, - phone: true, - }, - }, - }), - }, - update: { - acl: EmployeeAcl.canUseUpdate, - schema: EmployeeModels.EmployeeUpdateRequestSchema, - mutation: EmployeeQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeUpdateRequestSchema, - options: { - inputs: { - firstName: true, - lastName: true, - phone: true, - locale: true, - primaryOfficeId: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: EmployeeAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: EmployeeQueries.usePaginateLabels, - infinite: EmployeeQueries.usePaginateLabelsInfinite, - filters: { - schema: EmployeeModels.EmployeeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/employee/employee.models.ts b/test/generated/dist/employee/employee.models.ts deleted file mode 100644 index 6aa71fa..0000000 --- a/test/generated/dist/employee/employee.models.ts +++ /dev/null @@ -1,325 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeModels { - /** - * EmployeeResponseSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { CommonModels.LocaleEnum } locale - * @property { string } phone Phone number - * @property { boolean } archived Archived - * @property { string } primaryOfficeId Primary office id - * @property { CommonModels.EmployeeOfficeResponse } primaryOffice Primary office - * @property { CommonModels.EmploymentResponse[] } employments Employments - * @property { CommonModels.EmployeeRoleResponse[] } roles Global Roles - * @property { string } createdAt - * @property { string } updatedAt - */ - export const EmployeeResponseSchema = z - .object({ - id: z.string().describe("Employee ID"), - email: z.email().describe("Email"), - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - locale: CommonModels.LocaleEnumSchema.nullish(), - phone: z.string().describe("Phone number").nullish(), - archived: z.boolean().describe("Archived").nullish(), - primaryOfficeId: z.string().describe("Primary office id").nullish(), - primaryOffice: CommonModels.EmployeeOfficeResponseSchema.describe("Primary office").nullish(), - employments: z.array(CommonModels.EmploymentResponseSchema).readonly().describe("Employments").nullish(), - roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type EmployeeResponse = z.infer; - - /** - * EmployeeCreateRequestSchema - * @type { object } - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { CommonModels.LocaleEnum } locale - * @property { string } primaryOfficeId Primary office ID - * @property { string } phone Phone number - */ - export const EmployeeCreateRequestSchema = z - .object({ - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - email: z.email().describe("Email"), - locale: CommonModels.LocaleEnumSchema.nullish(), - primaryOfficeId: z.string().describe("Primary office ID").nullish(), - phone: z.string().describe("Phone number").nullish(), - }) - .readonly(); - export type EmployeeCreateRequest = z.infer; - - /** - * EmployeeOneStepCreateEmploymentRequestSchema - * @type { object } - * @property { string } officeId - * @property { string[] } roleIds Array of office role IDs - */ - export const EmployeeOneStepCreateEmploymentRequestSchema = z - .object({ - officeId: z.string(), - roleIds: z.array(z.string()).readonly().describe("Array of office role IDs").nullish(), - }) - .readonly(); - export type EmployeeOneStepCreateEmploymentRequest = z.infer; - - /** - * EmployeeOneStepCreateRequestSchema - * @type { object } - * @property { CommonModels.LocaleEnum } locale - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { string } phone Phone number - * @property { string[] } roleIds Array of global role IDs - * @property { string } primaryOfficeId Primary office ID - * @property { EmployeeOneStepCreateEmploymentRequest[] } employments Employments. Min Items: `1` - */ - export const EmployeeOneStepCreateRequestSchema = z - .object({ - locale: CommonModels.LocaleEnumSchema.nullish(), - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - email: z.email().describe("Email"), - phone: z.string().describe("Phone number").nullish(), - roleIds: z.array(z.string()).readonly().describe("Array of global role IDs").nullish(), - primaryOfficeId: z.string().describe("Primary office ID").nullish(), - employments: z.array(EmployeeOneStepCreateEmploymentRequestSchema).readonly().min(1).describe("Employments"), - }) - .readonly(); - export type EmployeeOneStepCreateRequest = z.infer; - - /** - * EmployeeUpdateRequestSchema - * @type { object } - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number of the employee - * @property { CommonModels.LocaleEnum } locale - * @property { string } primaryOfficeId - */ - export const EmployeeUpdateRequestSchema = z - .object({ - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - phone: z.string().describe("Phone number of the employee"), - locale: CommonModels.LocaleEnumSchema, - primaryOfficeId: z.string(), - }) - .readonly(); - export type EmployeeUpdateRequest = z.infer; - - /** - * EmployeeFilterDtoSchema - * @type { object } - * @property { string } office Office ID (single select, offices the user has access to) - * @property { string[] } roles Role IDs (multiselect) - * @property { string } primaryOfficeId Primary office id - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { string[] } ids Ids - * @property { boolean } archived Archived - * set to true to only return archived employees - * does not return archived employees by default. Default: `false` - * @property { string } search Free text search multiple fields - * @property { string } officeRole Office role - */ - export const EmployeeFilterDtoSchema = z - .object({ - office: z.string().describe("Office ID (single select, offices the user has access to)"), - roles: z.array(z.string()).readonly().describe("Role IDs (multiselect)"), - primaryOfficeId: z.string().describe("Primary office id"), - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - email: z.string().describe("Email"), - ids: z.array(z.string()).readonly().describe("Ids"), - archived: z - .boolean() - .describe(`Archived - set to true to only return archived employees - does not return archived employees by default`) - .default(false), - search: z.string().describe("Free text search multiple fields"), - officeRole: z.string().describe("Office role"), - }) - .readonly(); - export type EmployeeFilterDto = z.infer; - - /** - * EmployeeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type EmployeeLabelFilterDto = z.infer; - - /** - * EmployeeRoleMemberResponseSchema - * @type { object } - * @property { string } roleId - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string[] } permissions Permissions associated with the role - */ - export const EmployeeRoleMemberResponseSchema = z - .object({ - roleId: z.string(), - name: z.string().describe("Name of the role"), - color: z.string().describe("Color associated with the role").nullish(), - description: z.string().describe("Description of the role").nullish(), - permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), - }) - .readonly(); - export type EmployeeRoleMemberResponse = z.infer; - - /** - * EmployeeRoleMembershipsUpdateRequestSchema - * @type { object } - * @property { string[] } roleIds Array of role IDs - */ - export const EmployeeRoleMembershipsUpdateRequestSchema = z - .object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }) - .readonly(); - export type EmployeeRoleMembershipsUpdateRequest = z.infer; - - /** - * EmployeePaginateOrderParamEnumSchema - * @type { enum } - */ - export const EmployeePaginateOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); - export type EmployeePaginateOrderParamEnum = z.infer; - export const EmployeePaginateOrderParamEnum = EmployeePaginateOrderParamEnumSchema.enum; - - /** - * EmployeePopulateFieldSchema - * @type { enum } - */ - export const EmployeePopulateFieldSchema = z.enum([ - "employments", - "primaryOffice", - "roles", - "employments.roles", - "employments.office", - ]); - export type EmployeePopulateField = z.infer; - export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; - - /** - * EmployeePaginatePopulateParamSchema - * @type { array } - */ - export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); - export type EmployeePaginatePopulateParam = z.infer; - - /** - * EmployeePaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeResponse[] } items - */ - export const EmployeePaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeeResponseSchema).readonly() }).readonly().shape, - }); - export type EmployeePaginateResponse = z.infer; - - /** - * EmployeeFindAllResponseSchema - * @type { array } - */ - export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type EmployeeFindAllResponse = z.infer; - - /** - * EmployeePaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const EmployeePaginateLabelsOrderParamEnumSchema = z.enum([ - "firstName", - "lastName", - "email", - "name", - "createdAt", - ]); - export type EmployeePaginateLabelsOrderParamEnum = z.infer; - export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderParamEnumSchema.enum; - - /** - * EmployeePaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const EmployeePaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type EmployeePaginateLabelsResponse = z.infer; - - /** - * EmployeeGetPopulateParamSchema - * @type { array } - */ - export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); - export type EmployeeGetPopulateParam = z.infer; - - /** - * GetWithOfficePopulateParamSchema - * @type { array } - */ - export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); - export type GetWithOfficePopulateParam = z.infer; - - /** - * EmployeeListRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleMemberResponse[] } items - */ - export const EmployeeListRolesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape, - }); - export type EmployeeListRolesResponse = z.infer; - - /** - * EmployeeUpdateRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleMemberResponse[] } items - */ - export const EmployeeUpdateRolesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape, - }); - export type EmployeeUpdateRolesResponse = z.infer; -} diff --git a/test/generated/dist/employee/employee.queries.ts b/test/generated/dist/employee/employee.queries.ts deleted file mode 100644 index ab095fe..0000000 --- a/test/generated/dist/employee/employee.queries.ts +++ /dev/null @@ -1,626 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeeAcl } from "./employee.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeModels } from "./employee.models"; -import { EmployeeApi } from "./employee.api"; - -export namespace EmployeeQueries { - export const moduleName = QueryModule.Employee; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - populate?: EmployeeModels.EmployeePaginatePopulateParam, - filter?: EmployeeModels.EmployeeFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/employees", limit, order, populate, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - populate?: EmployeeModels.EmployeePaginatePopulateParam, - filter?: EmployeeModels.EmployeeFilterDto, - cursor?: string, - ) => [...keys.all, "/employees", "infinite", limit, order, populate, filter, cursor] as const, - findAll: (search?: string) => [...keys.all, "/employees/labels", search] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: EmployeeModels.EmployeeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/employees/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: EmployeeModels.EmployeeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/employees/labels/paginate", "infinite", limit, order, filter, cursor] as const, - get: (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam) => - [...keys.all, "/employees/:employeeId", employeeId, populate] as const, - getWithOffice: (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam) => - [...keys.all, "/offices/:officeId/employees/:employeeId", officeId, employeeId, populate] as const, - listRoles: (employeeId: string) => [...keys.all, "/employees/:employeeId/roles", employeeId] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Employees - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter - * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - populate, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - populate?: EmployeeModels.EmployeePaginatePopulateParam; - filter?: EmployeeModels.EmployeeFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, populate, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Employees - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter - * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - populate, - filter, - cursor, - }: { - limit: number; - order?: string; - populate?: EmployeeModels.EmployeePaginatePopulateParam; - filter?: EmployeeModels.EmployeeFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create Employee - * @permission Requires `canUseCreate` ability - * @param { EmployeeModels.EmployeeCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmployeeAcl.canUseCreate()); - return EmployeeApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useSingeStepCreate` - * @summary Create Employee in a single step - * - requires Employee:Create for creating a global employee - * - requires Employee:Create{officeId} for creating an office employee (first office is primary) - * - requires Employment:Create{officeId} for creating office employments - * - requires Employee:UpdateRoles for setting global roles - * - requires Employee:UpdateRoles{officeId} for setting office roles - * @param { EmployeeModels.EmployeeOneStepCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useSingeStepCreate = ( - options?: AppMutationOptions< - typeof EmployeeApi.singeStepCreate, - { data: EmployeeModels.EmployeeOneStepCreateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => EmployeeApi.singeStepCreate(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindAll` - * @summary List all employees with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { search }: { search?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search), - queryFn: () => { - checkAcl(EmployeeAcl.canUseFindAll()); - return EmployeeApi.findAll(search, config); - }, - ...options, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate employees with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: EmployeeModels.EmployeeLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate employees with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: EmployeeModels.EmployeeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useResendOnboarding` - * @summary Resend Employee Onboarding Email - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useResendOnboarding = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => EmployeeApi.resendOnboarding(employeeId, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useResendOnboardingWithOffice` - * @permission Requires `canUseResendOnboardingWithOffice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useResendOnboardingWithOffice = ( - options?: AppMutationOptions< - typeof EmployeeApi.resendOnboardingWithOffice, - { officeId: string; employeeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employeeId }) => { - checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId })); - return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGet` - * @summary Get Employee - * - allow global admins and office admins of primary office - * @permission Requires `canUseGet` ability - * @param { string } object.employeeId Path parameter - * @param { EmployeeModels.EmployeeGetPopulateParam } object.populate Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { employeeId, populate }: { employeeId: string; populate?: EmployeeModels.EmployeeGetPopulateParam }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(employeeId, populate), - queryFn: () => { - checkAcl(EmployeeAcl.canUseGet()); - return EmployeeApi.get(employeeId, populate, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update Employee - * - allow global admins and office admins of primary office - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof EmployeeApi.update, - { employeeId: string; data: EmployeeModels.EmployeeUpdateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdate()); - return EmployeeApi.update(employeeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetWithOffice` - * @permission Requires `canUseGetWithOffice` ability - * @param { string } object.officeId Path parameter - * @param { string } object.employeeId Path parameter - * @param { EmployeeModels.GetWithOfficePopulateParam } object.populate Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetWithOffice = ( - { - officeId, - employeeId, - populate, - }: { officeId: string; employeeId: string; populate?: EmployeeModels.GetWithOfficePopulateParam }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getWithOffice(officeId, employeeId, populate), - queryFn: () => { - checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId })); - return EmployeeApi.getWithOffice(officeId, employeeId, populate, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateWithOffice` - * @permission Requires `canUseUpdateWithOffice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateWithOffice = ( - options?: AppMutationOptions< - typeof EmployeeApi.updateWithOffice, - { officeId: string; employeeId: string; data: EmployeeModels.EmployeeUpdateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId })); - return EmployeeApi.updateWithOffice(officeId, employeeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, employeeId } = variables; - const updateKeys = [keys.get(employeeId), keys.getWithOffice(officeId, employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useListRoles` - * @summary List Employee (global) Roles - * @permission Requires `canUseListRoles` ability - * @param { string } object.employeeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListRoles = ( - { employeeId }: { employeeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoles(employeeId), - queryFn: () => { - checkAcl(EmployeeAcl.canUseListRoles()); - return EmployeeApi.listRoles(employeeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateRoles` - * @summary Update Employee (global) Roles - * @permission Requires `canUseUpdateRoles` ability - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeRoleMembershipsUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateRoles = ( - options?: AppMutationOptions< - typeof EmployeeApi.updateRoles, - { employeeId: string; data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdateRoles()); - return EmployeeApi.updateRoles(employeeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive Employee - * @permission Requires `canUseArchive` ability - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => { - checkAcl(EmployeeAcl.canUseArchive()); - return EmployeeApi.archive(employeeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Un-archive Employee - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => { - checkAcl(EmployeeAcl.canUseUnarchive()); - return EmployeeApi.unarchive(employeeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/employeeAccount/employeeAccount.api.ts b/test/generated/dist/employeeAccount/employeeAccount.api.ts deleted file mode 100644 index e4fa223..0000000 --- a/test/generated/dist/employeeAccount/employeeAccount.api.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { EmployeeAccountModels } from "./employeeAccount.models"; - -export namespace EmployeeAccountApi { - export const get = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, - `/employees/account`, - config, - ); - }; -} diff --git a/test/generated/dist/employeeAccount/employeeAccount.models.ts b/test/generated/dist/employeeAccount/employeeAccount.models.ts deleted file mode 100644 index bedbc9f..0000000 --- a/test/generated/dist/employeeAccount/employeeAccount.models.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeAccountModels { - /** - * EmployeeAccountEmploymentDtoSchema - * @type { object } - * @property { string } officeId Office ID - * @property { string } officeName Office name - */ - export const EmployeeAccountEmploymentDtoSchema = z - .object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }) - .readonly(); - export type EmployeeAccountEmploymentDto = z.infer; - - /** - * EmployeeAccountPrimaryOfficeDtoSchema - * @type { object } - * @property { string } officeId Office ID - * @property { string } officeName Office name - */ - export const EmployeeAccountPrimaryOfficeDtoSchema = z - .object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }) - .readonly(); - export type EmployeeAccountPrimaryOfficeDto = z.infer; - - /** - * EmployeeAccountRoleDtoSchema - * @type { object } - * @property { string } name Role name - * @property { string[] } permissions Role permissions - * @property { string } officeId Office ID - */ - export const EmployeeAccountRoleDtoSchema = z - .object({ - name: z.string().describe("Role name"), - permissions: z.array(z.string()).readonly().describe("Role permissions"), - officeId: z.string().describe("Office ID").nullish(), - }) - .readonly(); - export type EmployeeAccountRoleDto = z.infer; - - /** - * EmployeeAccountDtoSchema - * @type { object } - * @property { string } defaultUrl - * @property { string } costCenter - * @property { CommonModels.LocaleEnum } locale - * @property { array[] } aclRules Can hold any type of value - * @property { object } settings Employee settings keyed by setting name - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { EmployeeAccountEmploymentDto[] } employments Employments - * @property { EmployeeAccountPrimaryOfficeDto } primaryOffice Primary office - * @property { EmployeeAccountRoleDto[] } roles Roles - */ - export const EmployeeAccountDtoSchema = z - .object({ - defaultUrl: z.string().nullish(), - costCenter: z.string().nullish(), - locale: CommonModels.LocaleEnumSchema.nullish(), - aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), - settings: z - .union([ - z.object({}).catchall(z.any()).readonly(), - z.array(z.object({}).catchall(z.any()).readonly()).readonly(), - z.string(), - z.array(z.string()).readonly(), - z.array(z.number()).readonly(), - ]) - .describe("Employee settings keyed by setting name"), - id: z.string().describe("Employee ID"), - email: z.email().describe("Email"), - firstName: z.string().describe("First name"), - lastName: z.string().describe("Last name"), - phone: z.string().describe("Phone number").nullish(), - employments: z.array(EmployeeAccountEmploymentDtoSchema).readonly().describe("Employments"), - primaryOffice: EmployeeAccountPrimaryOfficeDtoSchema.describe("Primary office"), - roles: z.array(EmployeeAccountRoleDtoSchema).readonly().describe("Roles"), - }) - .readonly(); - export type EmployeeAccountDto = z.infer; -} diff --git a/test/generated/dist/employeeAccount/employeeAccount.queries.ts b/test/generated/dist/employeeAccount/employeeAccount.queries.ts deleted file mode 100644 index becd6e1..0000000 --- a/test/generated/dist/employeeAccount/employeeAccount.queries.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeAccountApi } from "./employeeAccount.api"; - -export namespace EmployeeAccountQueries { - export const moduleName = QueryModule.EmployeeAccount; - - export const keys = { - all: [moduleName] as const, - get: () => [...keys.all, "/employees/account"] as const, - }; - - /** - * Query `useGet` - * @summary Get profile of logged-in user - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.get(), - queryFn: () => EmployeeAccountApi.get(config), - ...options, - }); - }; -} diff --git a/test/generated/dist/employeePermissions/employeePermissions.acl.ts b/test/generated/dist/employeePermissions/employeePermissions.acl.ts deleted file mode 100644 index fb09450..0000000 --- a/test/generated/dist/employeePermissions/employeePermissions.acl.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace EmployeePermissionsAcl { - /** - * Use for `usePaginatePermissions` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query - */ - export const canUsePaginatePermissions = () => ["Read", "Permission"] as AbilityTuple<"Read", "Permission">; - - /** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = () => ["Read", "Permission"] as AbilityTuple<"Read", "Permission">; -} diff --git a/test/generated/dist/employeePermissions/employeePermissions.api.ts b/test/generated/dist/employeePermissions/employeePermissions.api.ts deleted file mode 100644 index 1309156..0000000 --- a/test/generated/dist/employeePermissions/employeePermissions.api.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; - -export namespace EmployeePermissionsApi { - export const paginatePermissions = ( - limit: number, - order?: string, - filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, - `/employees/permissions`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findAll = (search?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, - `/employees/permissions/labels`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - }, - ); - }; -} diff --git a/test/generated/dist/employeePermissions/employeePermissions.configs.ts b/test/generated/dist/employeePermissions/employeePermissions.configs.ts deleted file mode 100644 index 7b89c81..0000000 --- a/test/generated/dist/employeePermissions/employeePermissions.configs.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; -import { EmployeePermissionsQueries } from "./employeePermissions.queries"; -import { EmployeePermissionsAcl } from "./employeePermissions.acl"; - -export namespace EmployeePermissionsConfigs { - export const permissionsConfig = { - meta: { - title: "Permissions", - }, - readAll: { - acl: EmployeePermissionsAcl.canUsePaginatePermissions, - schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, - paginated: EmployeePermissionsQueries.usePaginatePermissions, - infinite: EmployeePermissionsQueries.usePaginatePermissionsInfinite, - filters: { - schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, - options: { - inputs: { - context: true, - ids: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, - options: { - columns: { - id: true, - label: true, - group: true, - description: true, - context: true, - }, - sortable: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/employeePermissions/employeePermissions.models.ts b/test/generated/dist/employeePermissions/employeePermissions.models.ts deleted file mode 100644 index 08a273a..0000000 --- a/test/generated/dist/employeePermissions/employeePermissions.models.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeePermissionsModels { - /** - * EmployeePermissionResponseSchema - * @type { object } - * @property { string } id Employee Permission unique identifier - * @property { string } label - * @property { string } group - * @property { string } description - * @property { string } context Scope where this rule is applied - */ - export const EmployeePermissionResponseSchema = z - .object({ - id: z.string().describe("Employee Permission unique identifier"), - label: z.string(), - group: z.string(), - description: z.string().nullish(), - context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), - }) - .readonly(); - export type EmployeePermissionResponse = z.infer; - - /** - * EmployeePermissionFilterDtoSchema - * @type { object } - * @property { string } context Role context - * @property { string[] } ids Ids - */ - export const EmployeePermissionFilterDtoSchema = z - .object({ - context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), - ids: z.array(z.string()).readonly().describe("Ids"), - }) - .readonly(); - export type EmployeePermissionFilterDto = z.infer; - - /** - * EmployeePermissionsPaginatePermissionsOrderParamEnumSchema - * @type { enum } - */ - export const EmployeePermissionsPaginatePermissionsOrderParamEnumSchema = z.enum(["id"]); - export type EmployeePermissionsPaginatePermissionsOrderParamEnum = z.infer< - typeof EmployeePermissionsPaginatePermissionsOrderParamEnumSchema - >; - export const EmployeePermissionsPaginatePermissionsOrderParamEnum = - EmployeePermissionsPaginatePermissionsOrderParamEnumSchema.enum; - - /** - * EmployeePermissionsPaginatePermissionsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeePermissionResponse[] } items - */ - export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeePermissionResponseSchema).readonly() }).readonly().shape, - }); - export type EmployeePermissionsPaginatePermissionsResponse = z.infer< - typeof EmployeePermissionsPaginatePermissionsResponseSchema - >; - - /** - * EmployeePermissionsFindAllResponseSchema - * @type { array } - */ - export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type EmployeePermissionsFindAllResponse = z.infer; -} diff --git a/test/generated/dist/employeePermissions/employeePermissions.queries.ts b/test/generated/dist/employeePermissions/employeePermissions.queries.ts deleted file mode 100644 index cd0f4ae..0000000 --- a/test/generated/dist/employeePermissions/employeePermissions.queries.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeePermissionsAcl } from "./employeePermissions.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; -import { EmployeePermissionsApi } from "./employeePermissions.api"; - -export namespace EmployeePermissionsQueries { - export const moduleName = QueryModule.EmployeePermissions; - - export const keys = { - all: [moduleName] as const, - paginatePermissions: ( - limit?: number, - order?: string, - filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/employees/permissions", limit, order, filter, page, cursor] as const, - paginatePermissionsInfinite: ( - limit?: number, - order?: string, - filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, - cursor?: string, - ) => [...keys.all, "/employees/permissions", "infinite", limit, order, filter, cursor] as const, - findAll: (search?: string) => [...keys.all, "/employees/permissions/labels", search] as const, - }; - - /** - * Query `usePaginatePermissions` - * @permission Requires `canUsePaginatePermissions` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` - * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginatePermissions = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: EmployeePermissionsModels.EmployeePermissionFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginatePermissionsInfinite - * @permission Requires `canUsePaginatePermissions` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` - * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginatePermissionsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { - limit: number; - order?: string; - filter?: EmployeePermissionsModels.EmployeePermissionFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindAll` - * @summary List all permissions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { search }: { search?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search), - queryFn: () => { - checkAcl(EmployeePermissionsAcl.canUseFindAll()); - return EmployeePermissionsApi.findAll(search, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/employeeProfile/employeeProfile.api.ts b/test/generated/dist/employeeProfile/employeeProfile.api.ts deleted file mode 100644 index 387f220..0000000 --- a/test/generated/dist/employeeProfile/employeeProfile.api.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeProfileModels } from "./employeeProfile.models"; - -export namespace EmployeeProfileApi { - export const getProfile = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, - `/employee-profile`, - config, - ); - }; - export const updateProfile = ( - data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, - `/employee-profile`, - ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/employeeProfile/employeeProfile.models.ts b/test/generated/dist/employeeProfile/employeeProfile.models.ts deleted file mode 100644 index 019ef91..0000000 --- a/test/generated/dist/employeeProfile/employeeProfile.models.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeProfileModels { - /** - * EmployeeProfileResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } firstName Employee first name - * @property { string } lastName Employee last name - * @property { string } email Employee email - * @property { string } phone Employee phone number - * @property { string } defaultUrl Employee default URL - * @property { CommonModels.LocaleEnum } locale Employee locale - */ - export const EmployeeProfileResponseDTOSchema = z - .object({ - id: z.string(), - firstName: z.string().describe("Employee first name"), - lastName: z.string().describe("Employee last name"), - email: z.string().describe("Employee email"), - phone: z.string().describe("Employee phone number").nullish(), - defaultUrl: z.string().describe("Employee default URL").nullish(), - locale: CommonModels.LocaleEnumSchema.describe("Employee locale").nullish(), - }) - .readonly(); - export type EmployeeProfileResponseDTO = z.infer; - - /** - * UpdateEmployeeProfileRequestDTOSchema - * @type { object } - * @property { string } firstName Employee first name. Example: `John` - * @property { string } lastName Employee last name. Example: `Doe` - * @property { string } email Employee email address. Example: `john.doe@example.com` - * @property { string } phone Employee phone number. Example: `+1234567890` - * @property { string } defaultUrl Default URL for the employee profile. Example: `https://example.com` - * @property { string } costCenter Employee cost center - * @property { CommonModels.LocaleEnum } locale Employee locale preference. Example: `en-US` - */ - export const UpdateEmployeeProfileRequestDTOSchema = z - .object({ - firstName: z.string().describe("Employee first name"), - lastName: z.string().describe("Employee last name"), - email: z.email().describe("Employee email address"), - phone: z.string().describe("Employee phone number"), - defaultUrl: z.url().describe("Default URL for the employee profile"), - costCenter: z.string().describe("Employee cost center"), - locale: CommonModels.LocaleEnumSchema.describe("Employee locale preference"), - }) - .readonly(); - export type UpdateEmployeeProfileRequestDTO = z.infer; -} diff --git a/test/generated/dist/employeeProfile/employeeProfile.queries.ts b/test/generated/dist/employeeProfile/employeeProfile.queries.ts deleted file mode 100644 index 9d9e747..0000000 --- a/test/generated/dist/employeeProfile/employeeProfile.queries.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeProfileModels } from "./employeeProfile.models"; -import { EmployeeProfileApi } from "./employeeProfile.api"; - -export namespace EmployeeProfileQueries { - export const moduleName = QueryModule.EmployeeProfile; - - export const keys = { - all: [moduleName] as const, - getProfile: () => [...keys.all, "/employee-profile"] as const, - }; - - /** - * Query `useGetProfile` - * @summary Get employee profile - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetProfile = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getProfile(), - queryFn: () => EmployeeProfileApi.getProfile(config), - ...options, - }); - }; - - /** - * Mutation `useUpdateProfile` - * @summary Update employee profile - * @param { EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateProfile = ( - options?: AppMutationOptions< - typeof EmployeeProfileApi.updateProfile, - { data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => EmployeeProfileApi.updateProfile(data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.getProfile()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/employeeRoles/employeeRoles.acl.ts b/test/generated/dist/employeeRoles/employeeRoles.acl.ts deleted file mode 100644 index 79b4ce6..0000000 --- a/test/generated/dist/employeeRoles/employeeRoles.acl.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmployeeRolesAcl { - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List all possible roles - * @param { string } object.context context from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { context?: string }) => - ["Read", object ? subject("Role", object) : "Role"] as AbilityTuple< - "Read", - "Role" | (ForcedSubject<"Role"> & { context?: string }) - >; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Role"] as AbilityTuple<"Create", "Role">; - - /** - * Use for `useLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLabels` query - */ - export const canUseLabels = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; - - /** - * Use for `useFind` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query - */ - export const canUseFind = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Role"] as AbilityTuple<"Update", "Role">; - - /** - * Use for `useDeleteEmployeesRolesByRoleId` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteEmployeesRolesByRoleId` mutation - */ - export const canUseDeleteEmployeesRolesByRoleId = () => ["Delete", "Role"] as AbilityTuple<"Delete", "Role">; - - /** - * Use for `usePaginatePermissions` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query - */ - export const canUsePaginatePermissions = () => ["Read", "Role"] as AbilityTuple<"Read", "Role">; - - /** - * Use for `useTogglePermission` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTogglePermission` mutation - */ - export const canUseTogglePermission = () => ["Update", "Role"] as AbilityTuple<"Update", "Role">; - - /** - * Use for `useCopy` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopy` mutation - */ - export const canUseCopy = () => ["Create", "Role"] as AbilityTuple<"Create", "Role">; -} diff --git a/test/generated/dist/employeeRoles/employeeRoles.api.ts b/test/generated/dist/employeeRoles/employeeRoles.api.ts deleted file mode 100644 index ba16037..0000000 --- a/test/generated/dist/employeeRoles/employeeRoles.api.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeRolesApi { - export const list = ( - limit: number, - order?: string, - filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, `/employees/roles`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), - config, - ); - }; - export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: EmployeeRolesModels.LabelsResponseSchema }, `/employees/roles/labels`, { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { - type: "query", - name: "context", - }), - }, - }); - }; - export const find = (roleId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}`, - config, - ); - }; - export const update = ( - roleId: string, - data: EmployeeRolesModels.EmployeeRoleUpdateRequest, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.put( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), - config, - ); - }; - export const deleteEmployeesRolesByRoleId = (roleId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/employees/roles/${roleId}`, - undefined, - config, - ); - }; - export const paginatePermissions = (roleId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, - `/employees/roles/${roleId}/permissions`, - config, - ); - }; - export const togglePermission = ( - roleId: string, - permission: string, - data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/employees/roles/${roleId}/permissions/${permission}/toggle`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), - config, - ); - }; - export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}/copy`, - ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/employeeRoles/employeeRoles.configs.ts b/test/generated/dist/employeeRoles/employeeRoles.configs.ts deleted file mode 100644 index 56a73dd..0000000 --- a/test/generated/dist/employeeRoles/employeeRoles.configs.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeRolesQueries } from "./employeeRoles.queries"; -import { EmployeeRolesAcl } from "./employeeRoles.acl"; - -export namespace EmployeeRolesConfigs { - export const rolesConfig = { - meta: { - title: "Roles", - }, - readAll: { - acl: EmployeeRolesAcl.canUseList, - schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, - paginated: EmployeeRolesQueries.useList, - infinite: EmployeeRolesQueries.useListInfinite, - filters: { - schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, - options: { - inputs: { - name: true, - context: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, - options: { - columns: { - id: true, - name: true, - color: true, - description: true, - context: true, - permissions: true, - numberOfUsers: true, - }, - sortable: EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema, - }, - }), - }, - read: { - acl: EmployeeRolesAcl.canUseFind, - schema: CommonModels.EmployeeRoleResponseSchema, - query: EmployeeRolesQueries.useFind, - }, - create: { - acl: EmployeeRolesAcl.canUseCreate, - schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, - mutation: EmployeeRolesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, - options: { - inputs: { - name: true, - color: true, - description: true, - context: true, - permissions: true, - }, - }, - }), - }, - update: { - acl: EmployeeRolesAcl.canUseUpdate, - schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, - mutation: EmployeeRolesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, - options: { - inputs: { - name: true, - color: true, - description: true, - }, - }, - }), - }, - delete: { - acl: EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId, - mutation: EmployeeRolesQueries.useDeleteEmployeesRolesByRoleId, - }, - }; -} diff --git a/test/generated/dist/employeeRoles/employeeRoles.models.ts b/test/generated/dist/employeeRoles/employeeRoles.models.ts deleted file mode 100644 index ee2459c..0000000 --- a/test/generated/dist/employeeRoles/employeeRoles.models.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeRolesModels { - /** - * EmployeeRoleListItemResponseSchema - * @type { object } - * @property { string } id Unique identifier of the role - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string } context Role context - * @property { string[] } permissions Permissions associated with the role - * @property { number } numberOfUsers Number of users associated with the role - */ - export const EmployeeRoleListItemResponseSchema = z - .object({ - id: z.string().describe("Unique identifier of the role"), - name: z.string().describe("Name of the role"), - color: z.string().describe("Color associated with the role").nullish(), - description: z.string().describe("Description of the role").nullish(), - context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), - permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), - numberOfUsers: z.number().describe("Number of users associated with the role"), - }) - .readonly(); - export type EmployeeRoleListItemResponse = z.infer; - - /** - * EmployeeRolePaginationFilterDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } context Role context - * @property { string } search - */ - export const EmployeeRolePaginationFilterDtoSchema = z - .object({ - name: z.string().describe("Name"), - context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), - search: z.string(), - }) - .readonly(); - export type EmployeeRolePaginationFilterDto = z.infer; - - /** - * EmployeeRoleCreateRequestSchema - * @type { object } - * @property { string } name Name of the role - * @property { string } color Color of the role - * @property { string } description Color of the role - * @property { string } context Role context - * - office or global - * @property { string[] } permissions Permission IDs associated with the role - * can only be either office or global. Default: `` - */ - export const EmployeeRoleCreateRequestSchema = z - .object({ - name: z.string().describe("Name of the role"), - color: z.string().describe("Color of the role"), - description: z.string().describe("Color of the role").nullish(), - context: CommonModels.EmployeeRoleContextSchema.describe(`Role context - - office or global`), - permissions: z - .array(z.string()) - .readonly() - .describe(`Permission IDs associated with the role - can only be either office or global`) - .default([]), - }) - .readonly(); - export type EmployeeRoleCreateRequest = z.infer; - - /** - * EmployeeRolePermissionDtoSchema - * @type { object } - * @property { string } id Employee Permission unique identifier - * @property { string } label - * @property { string } group - * @property { string } description - * @property { string } context Scope where this rule is applied - * @property { boolean } enabled - */ - export const EmployeeRolePermissionDtoSchema = z - .object({ - id: z.string().describe("Employee Permission unique identifier"), - label: z.string(), - group: z.string(), - description: z.string().nullish(), - context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), - enabled: z.boolean(), - }) - .readonly(); - export type EmployeeRolePermissionDto = z.infer; - - /** - * EmployeeRoleUpdateRequestSchema - * @type { object } - * @property { string } name Role Id - * @property { string } color Role Color - * @property { string } description Role Description - */ - export const EmployeeRoleUpdateRequestSchema = z - .object({ - name: z.string().describe("Role Id"), - color: z.string().describe("Role Color"), - description: z.string().describe("Role Description"), - }) - .readonly(); - export type EmployeeRoleUpdateRequest = z.infer; - - /** - * EmployeeRoleTogglePermissionRequestSchema - * @type { object } - * @property { boolean } toggled Turn the permission on or off - */ - export const EmployeeRoleTogglePermissionRequestSchema = z - .object({ toggled: z.boolean().describe("Turn the permission on or off") }) - .readonly(); - export type EmployeeRoleTogglePermissionRequest = z.infer; - - /** - * CopyEmployeeRoleDtoSchema - * @type { object } - * @property { string } newRoleName - */ - export const CopyEmployeeRoleDtoSchema = z.object({ newRoleName: z.string() }).readonly(); - export type CopyEmployeeRoleDto = z.infer; - - /** - * EmployeeRolesListOrderParamEnumSchema - * @type { enum } - */ - export const EmployeeRolesListOrderParamEnumSchema = z.enum(["name", "numberOfUsers"]); - export type EmployeeRolesListOrderParamEnum = z.infer; - export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSchema.enum; - - /** - * EmployeeRolesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleListItemResponse[] } items - */ - export const EmployeeRolesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).readonly() }).readonly().shape, - }); - export type EmployeeRolesListResponse = z.infer; - - /** - * LabelsResponseSchema - * @type { array } - */ - export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type LabelsResponse = z.infer; - - /** - * EmployeeRolesPaginatePermissionsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRolePermissionDto[] } items - */ - export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).readonly() }).readonly().shape, - }); - export type EmployeeRolesPaginatePermissionsResponse = z.infer; -} diff --git a/test/generated/dist/employeeRoles/employeeRoles.queries.ts b/test/generated/dist/employeeRoles/employeeRoles.queries.ts deleted file mode 100644 index 68a5d1e..0000000 --- a/test/generated/dist/employeeRoles/employeeRoles.queries.ts +++ /dev/null @@ -1,368 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeeRolesAcl } from "./employeeRoles.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeRolesApi } from "./employeeRoles.api"; - -export namespace EmployeeRolesQueries { - export const moduleName = QueryModule.EmployeeRoles; - - export const keys = { - all: [moduleName] as const, - list: ( - limit?: number, - order?: string, - filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/employees/roles", limit, order, filter, page, cursor] as const, - listInfinite: ( - limit?: number, - order?: string, - filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/employees/roles", "infinite", limit, order, filter, cursor] as const, - labels: (search?: string, context?: CommonModels.EmployeeRoleContext) => - [...keys.all, "/employees/roles/labels", search, context] as const, - find: (roleId: string) => [...keys.all, "/employees/roles/:roleId", roleId] as const, - paginatePermissions: (roleId: string) => [...keys.all, "/employees/roles/:roleId/permissions", roleId] as const, - }; - - /** - * Query `useList` - * @summary Paginate Employee Role Definitions - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` - * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary Paginate Employee Role Definitions - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` - * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create Employee Role Definition - * @permission Requires `canUseCreate` ability - * @param { EmployeeRolesModels.EmployeeRoleCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof EmployeeRolesApi.create, - { data: EmployeeRolesModels.EmployeeRoleCreateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmployeeRolesAcl.canUseCreate()); - return EmployeeRolesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useLabels` - * @summary List all employee roles with only their labels - * @permission Requires `canUseLabels` ability - * @param { string } object.search Query parameter - * @param { CommonModels.EmployeeRoleContext } object.context Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useLabels = ( - { search, context }: { search?: string; context?: CommonModels.EmployeeRoleContext }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.labels(search, context), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseLabels()); - return EmployeeRolesApi.labels(search, context, config); - }, - ...options, - }); - }; - - /** - * Query `useFind` - * @summary Get Employee Role Definition - * @permission Requires `canUseFind` ability - * @param { string } object.roleId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFind = ( - { roleId }: { roleId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.find(roleId), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseFind()); - return EmployeeRolesApi.find(roleId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update Employee Role Definition - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.roleId Path parameter - * @param { EmployeeRolesModels.EmployeeRoleUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof EmployeeRolesApi.update, - { roleId: string; data: EmployeeRolesModels.EmployeeRoleUpdateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, data }) => { - checkAcl(EmployeeRolesAcl.canUseUpdate()); - return EmployeeRolesApi.update(roleId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { roleId } = variables; - const updateKeys = [keys.find(roleId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteEmployeesRolesByRoleId` - * @summary Delete Employee Role Definition - * @permission Requires `canUseDeleteEmployeesRolesByRoleId` ability - * @param { string } mutation.roleId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteEmployeesRolesByRoleId = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId }) => { - checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); - return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginatePermissions` - * @summary Get All Employee Role Definition Permissions - * - convenience endpoint to expand the permissions of a role - * - only returns the enabled permissions - * @permission Requires `canUsePaginatePermissions` ability - * @param { string } object.roleId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginatePermissions = ( - { roleId }: { roleId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginatePermissions(roleId), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); - return EmployeeRolesApi.paginatePermissions(roleId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useTogglePermission` - * @summary Toggle Employee Role Definition Permission - * @permission Requires `canUseTogglePermission` ability - * @param { string } mutation.roleId Path parameter - * @param { string } mutation.permission Path parameter - * @param { EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useTogglePermission = ( - options?: AppMutationOptions< - typeof EmployeeRolesApi.togglePermission, - { roleId: string; permission: string; data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, permission, data }) => { - checkAcl(EmployeeRolesAcl.canUseTogglePermission()); - return EmployeeRolesApi.togglePermission(roleId, permission, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCopy` - * @summary Copy Employee Role Definition - * @permission Requires `canUseCopy` ability - * @param { string } mutation.roleId Path parameter - * @param { EmployeeRolesModels.CopyEmployeeRoleDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCopy = ( - options?: AppMutationOptions< - typeof EmployeeRolesApi.copy, - { roleId: string; data: EmployeeRolesModels.CopyEmployeeRoleDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, data }) => { - checkAcl(EmployeeRolesAcl.canUseCopy()); - return EmployeeRolesApi.copy(roleId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { roleId } = variables; - const updateKeys = [keys.find(roleId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/employeeSettings/employeeSettings.api.ts b/test/generated/dist/employeeSettings/employeeSettings.api.ts deleted file mode 100644 index ee7fac4..0000000 --- a/test/generated/dist/employeeSettings/employeeSettings.api.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeSettingsModels } from "./employeeSettings.models"; - -export namespace EmployeeSettingsApi { - export const getAll = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, - `/employees/settings`, - config, - ); - }; - export const update = ( - key: string, - data: EmployeeSettingsModels.UpdateEmployeeSettingDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/employees/settings/${key}`, - ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/employeeSettings/employeeSettings.models.ts b/test/generated/dist/employeeSettings/employeeSettings.models.ts deleted file mode 100644 index 7614af9..0000000 --- a/test/generated/dist/employeeSettings/employeeSettings.models.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { z } from "zod"; - -export namespace EmployeeSettingsModels { - /** - * EmployeeSettingsResponseDtoSchema - * @type { object } - * @property { object } settings Map of all settings for the employee - */ - export const EmployeeSettingsResponseDtoSchema = z - .object({ - settings: z - .union([ - z.object({}).catchall(z.any()).readonly(), - z.array(z.object({}).catchall(z.any()).readonly()).readonly(), - z.string(), - z.array(z.string()).readonly(), - z.array(z.number()).readonly(), - ]) - .describe("Map of all settings for the employee"), - }) - .readonly(); - export type EmployeeSettingsResponseDto = z.infer; - - /** - * UpdateEmployeeSettingDtoSchema - * @type { object } - * @property { object } value The value to store for the setting. If null, the setting will be deleted. - */ - export const UpdateEmployeeSettingDtoSchema = z - .object({ - value: z - .union([ - z.object({}).catchall(z.any()).readonly(), - z.array(z.unknown()).readonly(), - z.string(), - z.number(), - z.boolean(), - ]) - .describe("The value to store for the setting. If null, the setting will be deleted.") - .nullable(), - }) - .readonly(); - export type UpdateEmployeeSettingDto = z.infer; -} diff --git a/test/generated/dist/employeeSettings/employeeSettings.queries.ts b/test/generated/dist/employeeSettings/employeeSettings.queries.ts deleted file mode 100644 index 7aff1c3..0000000 --- a/test/generated/dist/employeeSettings/employeeSettings.queries.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeSettingsModels } from "./employeeSettings.models"; -import { EmployeeSettingsApi } from "./employeeSettings.api"; - -export namespace EmployeeSettingsQueries { - export const moduleName = QueryModule.EmployeeSettings; - - export const keys = { - all: [moduleName] as const, - getAll: () => [...keys.all, "/employees/settings"] as const, - }; - - /** - * Query `useGetAll` - * @summary Get all employee settings - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetAll = ( - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getAll(), - queryFn: () => EmployeeSettingsApi.getAll(config), - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update employee setting - * @param { string } mutation.key Path parameter - * @param { EmployeeSettingsModels.UpdateEmployeeSettingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof EmployeeSettingsApi.update, - { key: string; data: EmployeeSettingsModels.UpdateEmployeeSettingDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ key, data }) => EmployeeSettingsApi.update(key, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/employment/employment.acl.ts b/test/generated/dist/employment/employment.acl.ts deleted file mode 100644 index f842629..0000000 --- a/test/generated/dist/employment/employment.acl.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmploymentAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create new employment - * @param { string } object.officeId officeId from mutation data - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "Create", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; - - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List employments - * @param { string } object.officeId officeId from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId?: string }) => - ["Read", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "Read", - "Employment" | (ForcedSubject<"Employment"> & { officeId?: string }) - >; - - /** - * Use for `useListRoles` query ability. For global ability, omit the object parameter. - * @description List employment roles - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query - */ - export const canUseListRoles = (object?: { officeId: string }) => - ["ListRoles", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "ListRoles", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; - - /** - * Use for `useUpdateRoles` mutation ability. For global ability, omit the object parameter. - * @description Update employment roles - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation - */ - export const canUseUpdateRoles = (object?: { officeId: string }) => - ["UpdateRoles", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "UpdateRoles", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Create", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "Create", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "Archive", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Unarchive", object ? subject("Employment", object) : "Employment"] as AbilityTuple< - "Unarchive", - "Employment" | (ForcedSubject<"Employment"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/employment/employment.api.ts b/test/generated/dist/employment/employment.api.ts deleted file mode 100644 index 5fa32e0..0000000 --- a/test/generated/dist/employment/employment.api.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; -import { EmploymentModels } from "./employment.models"; - -export namespace EmploymentApi { - export const create = (data: EmploymentModels.EmploymentCreateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/employees/employments`, - ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), - config, - ); - }; - export const list = ( - limit: number, - order?: string, - populate?: EmploymentModels.EmploymentListPopulateParam, - filter?: EmploymentModels.EmploymentFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: EmploymentModels.EmploymentListResponseSchema }, `/employees/employments`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { - type: "query", - name: "populate", - }), - filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const listRoles = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/roles`, - config, - ); - }; - export const updateRoles = ( - officeId: string, - employmentId: string, - data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.put( - { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/roles`, - ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), - config, - ); - }; - export const update = ( - officeId: string, - employmentId: string, - data: EmploymentModels.UpdateEmploymentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}`, - ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), - config, - ); - }; - export const archive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/archive`, - undefined, - config, - ); - }; - export const unarchive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/employment/employment.configs.ts b/test/generated/dist/employment/employment.configs.ts deleted file mode 100644 index b1b2136..0000000 --- a/test/generated/dist/employment/employment.configs.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { EmploymentModels } from "./employment.models"; -import { EmploymentQueries } from "./employment.queries"; -import { EmploymentAcl } from "./employment.acl"; - -export namespace EmploymentConfigs { - export const employmentsConfig = { - meta: { - title: "Employments", - }, - readAll: { - acl: EmploymentAcl.canUseList, - schema: CommonModels.EmploymentResponseSchema, - paginated: EmploymentQueries.useList, - infinite: EmploymentQueries.useListInfinite, - filters: { - schema: EmploymentModels.EmploymentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmploymentModels.EmploymentFilterDtoSchema, - options: { - inputs: { - officeId: true, - employeeId: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.EmploymentResponseSchema, - options: { - columns: { - id: true, - officeId: true, - office: true, - employeeId: true, - employee: true, - archived: true, - costCenter: true, - roles: true, - }, - sortable: EmploymentModels.EmploymentListOrderParamEnumSchema, - }, - }), - }, - create: { - acl: EmploymentAcl.canUseCreate, - schema: EmploymentModels.EmploymentCreateRequestSchema, - mutation: EmploymentQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmploymentModels.EmploymentCreateRequestSchema, - options: { - inputs: { - officeId: true, - employeeId: true, - }, - }, - }), - }, - }; -} diff --git a/test/generated/dist/employment/employment.models.ts b/test/generated/dist/employment/employment.models.ts deleted file mode 100644 index ceba63b..0000000 --- a/test/generated/dist/employment/employment.models.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmploymentModels { - /** - * EmploymentCreateRequestSchema - * @type { object } - * @property { string } officeId - * @property { string } employeeId - */ - export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }).readonly(); - export type EmploymentCreateRequest = z.infer; - - /** - * EmploymentFilterDtoSchema - * @type { object } - * @property { string } officeId Office IDs - * @property { string } employeeId Employee IDs - */ - export const EmploymentFilterDtoSchema = z - .object({ officeId: z.string().describe("Office IDs"), employeeId: z.string().describe("Employee IDs") }) - .readonly(); - export type EmploymentFilterDto = z.infer; - - /** - * EmploymentRoleMemberResponseSchema - * @type { object } - * @property { string } roleId - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string[] } permissions Permissions associated with the role - */ - export const EmploymentRoleMemberResponseSchema = z - .object({ - roleId: z.string(), - name: z.string().describe("Name of the role"), - color: z.string().describe("Color associated with the role").nullish(), - description: z.string().describe("Description of the role").nullish(), - permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), - }) - .readonly(); - export type EmploymentRoleMemberResponse = z.infer; - - /** - * EmploymentRoleMembershipsUpdateRequestSchema - * @type { object } - * @property { string[] } roleIds Array of role IDs - */ - export const EmploymentRoleMembershipsUpdateRequestSchema = z - .object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }) - .readonly(); - export type EmploymentRoleMembershipsUpdateRequest = z.infer; - - /** - * UpdateEmploymentRequestDtoSchema - * @type { object } - * @property { string } costCenter - * @property { string[] } roleIds - */ - export const UpdateEmploymentRequestDtoSchema = z - .object({ costCenter: z.string(), roleIds: z.array(z.string()).readonly() }) - .readonly(); - export type UpdateEmploymentRequestDto = z.infer; - - /** - * EmploymentListOrderParamEnumSchema - * @type { enum } - */ - export const EmploymentListOrderParamEnumSchema = z.enum(["officeId", "createdAt"]); - export type EmploymentListOrderParamEnum = z.infer; - export const EmploymentListOrderParamEnum = EmploymentListOrderParamEnumSchema.enum; - - /** - * EmploymentPaginationPopulateFieldsSchema - * @type { enum } - */ - export const EmploymentPaginationPopulateFieldsSchema = z.enum(["office", "employee"]); - export type EmploymentPaginationPopulateFields = z.infer; - export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFieldsSchema.enum; - - /** - * EmploymentListPopulateParamSchema - * @type { array } - */ - export const EmploymentListPopulateParamSchema = z - .array(EmploymentPaginationPopulateFieldsSchema) - .readonly() - .nullish(); - export type EmploymentListPopulateParam = z.infer; - - /** - * EmploymentListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.EmploymentResponse[] } items - */ - export const EmploymentListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.EmploymentResponseSchema).readonly() }).readonly().shape, - }); - export type EmploymentListResponse = z.infer; - - /** - * EmploymentListRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmploymentRoleMemberResponse[] } items - */ - export const EmploymentListRolesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape, - }); - export type EmploymentListRolesResponse = z.infer; - - /** - * EmploymentUpdateRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmploymentRoleMemberResponse[] } items - */ - export const EmploymentUpdateRolesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape, - }); - export type EmploymentUpdateRolesResponse = z.infer; -} diff --git a/test/generated/dist/employment/employment.queries.ts b/test/generated/dist/employment/employment.queries.ts deleted file mode 100644 index c0e6627..0000000 --- a/test/generated/dist/employment/employment.queries.ts +++ /dev/null @@ -1,315 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmploymentAcl } from "./employment.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmploymentModels } from "./employment.models"; -import { EmploymentApi } from "./employment.api"; - -export namespace EmploymentQueries { - export const moduleName = QueryModule.Employment; - - export const keys = { - all: [moduleName] as const, - list: ( - limit?: number, - order?: string, - populate?: EmploymentModels.EmploymentListPopulateParam, - filter?: EmploymentModels.EmploymentFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/employees/employments", limit, order, populate, filter, page, cursor] as const, - listInfinite: ( - limit?: number, - order?: string, - populate?: EmploymentModels.EmploymentListPopulateParam, - filter?: EmploymentModels.EmploymentFilterDto, - cursor?: string, - ) => [...keys.all, "/employees/employments", "infinite", limit, order, populate, filter, cursor] as const, - listRoles: (officeId: string, employmentId: string) => - [...keys.all, "/offices/:officeId/employments/:employmentId/roles", officeId, employmentId] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create new employment - * @permission Requires `canUseCreate` ability - * @param { EmploymentModels.EmploymentCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmploymentAcl.canUseCreate()); - return EmploymentApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useList` - * @summary List Employments - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` - * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter - * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - limit, - order, - populate, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - populate?: EmploymentModels.EmploymentListPopulateParam; - filter?: EmploymentModels.EmploymentFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, populate, filter, page, cursor), - queryFn: () => { - checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List Employments - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` - * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter - * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - limit, - order, - populate, - filter, - cursor, - }: { - limit: number; - order?: string; - populate?: EmploymentModels.EmploymentListPopulateParam; - filter?: EmploymentModels.EmploymentFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, populate, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useListRoles` - * @summary List Employments Roles - * @permission Requires `canUseListRoles` ability - * @param { string } object.officeId Path parameter - * @param { string } object.employmentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListRoles = ( - { officeId, employmentId }: { officeId: string; employmentId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoles(officeId, employmentId), - queryFn: () => { - checkAcl(EmploymentAcl.canUseListRoles({ officeId })); - return EmploymentApi.listRoles(officeId, employmentId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateRoles` - * @summary Update Employment Roles - * @permission Requires `canUseUpdateRoles` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { EmploymentModels.EmploymentRoleMembershipsUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateRoles = ( - options?: AppMutationOptions< - typeof EmploymentApi.updateRoles, - { officeId: string; employmentId: string; data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId, data }) => { - checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId })); - return EmploymentApi.updateRoles(officeId, employmentId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdate` - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { EmploymentModels.UpdateEmploymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof EmploymentApi.update, - { officeId: string; employmentId: string; data: EmploymentModels.UpdateEmploymentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId, data }) => { - checkAcl(EmploymentAcl.canUseUpdate({ officeId })); - return EmploymentApi.update(officeId, employmentId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive Employment - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId }) => { - checkAcl(EmploymentAcl.canUseArchive({ officeId })); - return EmploymentApi.archive(officeId, employmentId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Un-archive Employment - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId }) => { - checkAcl(EmploymentAcl.canUseUnarchive({ officeId })); - return EmploymentApi.unarchive(officeId, employmentId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/factoringExport/factoringExport.acl.ts b/test/generated/dist/factoringExport/factoringExport.acl.ts deleted file mode 100644 index b4cf272..0000000 --- a/test/generated/dist/factoringExport/factoringExport.acl.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace FactoringExportAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create factoring export - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< - "Create", - "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) - >; - - /** - * Use for `useGetBatch` query ability. For global ability, omit the object parameter. - * @description Read factoring export - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query - */ - export const canUseGetBatch = (object?: { officeId: string }) => - ["Read", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< - "Read", - "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/factoringExport/factoringExport.api.ts b/test/generated/dist/factoringExport/factoringExport.api.ts deleted file mode 100644 index a03108e..0000000 --- a/test/generated/dist/factoringExport/factoringExport.api.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { FactoringExportModels } from "./factoringExport.models"; - -export namespace FactoringExportApi { - export const create = ( - officeId: string, - data: FactoringExportModels.CreateFactoringExportRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-exports`, - ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), - config, - ); - }; - export const getBatch = (batchId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-exports/${batchId}`, - config, - ); - }; -} diff --git a/test/generated/dist/factoringExport/factoringExport.models.ts b/test/generated/dist/factoringExport/factoringExport.models.ts deleted file mode 100644 index 3b5ef07..0000000 --- a/test/generated/dist/factoringExport/factoringExport.models.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { z } from "zod"; - -export namespace FactoringExportModels { - /** - * FactoringExportBatchStatusEnumSchema - * @type { enum } - */ - export const FactoringExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Failed"]); - export type FactoringExportBatchStatusEnum = z.infer; - export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSchema.enum; - - /** - * FactoringExportBatchResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { FactoringExportBatchStatusEnum } status - * @property { number } totalInvoices - * @property { number } totalAmount - * @property { string } currencyNotation - * @property { string } jobId - * @property { string } eurFileUrl - * @property { string } usdFileUrl - * @property { string } createdById - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } exportedAt - */ - export const FactoringExportBatchResponseDtoSchema = z - .object({ - id: z.string(), - officeId: z.string(), - status: FactoringExportBatchStatusEnumSchema, - totalInvoices: z.number(), - totalAmount: z.number(), - currencyNotation: z.string(), - jobId: z.string().nullish(), - eurFileUrl: z.string().nullish(), - usdFileUrl: z.string().nullish(), - createdById: z.string(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - exportedAt: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type FactoringExportBatchResponseDto = z.infer; - - /** - * CreateFactoringExportRequestDtoSchema - * @type { object } - * @property { string } invoiceDateFrom Invoice date from - * @property { string } invoiceDateUntil Invoice date until - */ - export const CreateFactoringExportRequestDtoSchema = z - .object({ - invoiceDateFrom: z.iso.datetime({ offset: true }).describe("Invoice date from"), - invoiceDateUntil: z.iso.datetime({ offset: true }).describe("Invoice date until"), - }) - .readonly(); - export type CreateFactoringExportRequestDto = z.infer; -} diff --git a/test/generated/dist/factoringExport/factoringExport.queries.ts b/test/generated/dist/factoringExport/factoringExport.queries.ts deleted file mode 100644 index c2d5093..0000000 --- a/test/generated/dist/factoringExport/factoringExport.queries.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { FactoringExportAcl } from "./factoringExport.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FactoringExportModels } from "./factoringExport.models"; -import { FactoringExportApi } from "./factoringExport.api"; - -export namespace FactoringExportQueries { - export const moduleName = QueryModule.FactoringExport; - - export const keys = { - all: [moduleName] as const, - getBatch: (batchId: string, officeId: string) => - [...keys.all, "/offices/:officeId/factoring-exports/:batchId", batchId, officeId] as const, - }; - - /** - * Mutation `useCreate` - * @summary Generate factoring export files for Raiffeisen Factor Bank - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { FactoringExportModels.CreateFactoringExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof FactoringExportApi.create, - { officeId: string; data: FactoringExportModels.CreateFactoringExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(FactoringExportAcl.canUseCreate({ officeId })); - return FactoringExportApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetBatch` - * @summary Get factoring export batch status - * @permission Requires `canUseGetBatch` ability - * @param { string } object.batchId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetBatch = ( - { batchId, officeId }: { batchId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBatch(batchId, officeId), - queryFn: () => { - checkAcl(FactoringExportAcl.canUseGetBatch({ officeId })); - return FactoringExportApi.getBatch(batchId, officeId, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/factoringMerge/factoringMerge.acl.ts b/test/generated/dist/factoringMerge/factoringMerge.acl.ts deleted file mode 100644 index 7a01e13..0000000 --- a/test/generated/dist/factoringMerge/factoringMerge.acl.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace FactoringMergeAcl { - /** - * Use for `usePrepareUpload` mutation ability. For global ability, omit the object parameter. - * @description Prepare factoring merge upload - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareUpload` mutation - */ - export const canUsePrepareUpload = (object?: { officeId: string }) => - ["Update", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< - "Update", - "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) - >; - - /** - * Use for `useProcessMerge` mutation ability. For global ability, omit the object parameter. - * @description Process factoring merge - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useProcessMerge` mutation - */ - export const canUseProcessMerge = (object?: { officeId: string }) => - ["Update", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< - "Update", - "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) - >; - - /** - * Use for `useGetMergeBatch` query ability. For global ability, omit the object parameter. - * @description Read merge batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMergeBatch` query - */ - export const canUseGetMergeBatch = (object?: { officeId: string }) => - ["Read", object ? subject("FactoringExport", object) : "FactoringExport"] as AbilityTuple< - "Read", - "FactoringExport" | (ForcedSubject<"FactoringExport"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/factoringMerge/factoringMerge.api.ts b/test/generated/dist/factoringMerge/factoringMerge.api.ts deleted file mode 100644 index 8ba3ec5..0000000 --- a/test/generated/dist/factoringMerge/factoringMerge.api.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { FactoringMergeModels } from "./factoringMerge.models"; - -export namespace FactoringMergeApi { - export const prepareUpload = ( - officeId: string, - data: FactoringMergeModels.PrepareFactoringMergeRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/prepare-upload`, - ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), - config, - ); - }; - export const processMerge = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/${batchId}/process`, - undefined, - config, - ); - }; - export const getMergeBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/${batchId}`, - config, - ); - }; -} diff --git a/test/generated/dist/factoringMerge/factoringMerge.models.ts b/test/generated/dist/factoringMerge/factoringMerge.models.ts deleted file mode 100644 index 70763bd..0000000 --- a/test/generated/dist/factoringMerge/factoringMerge.models.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { z } from "zod"; - -export namespace FactoringMergeModels { - /** - * FileMetadataDtoSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType File MIME type - * @property { number } fileSize File size in bytes. Minimum: `1` - */ - export const FileMetadataDtoSchema = z - .object({ - fileName: z.string().describe("File name"), - mimeType: z.string().describe("File MIME type"), - fileSize: z.number().gte(1).describe("File size in bytes"), - }) - .readonly(); - export type FileMetadataDto = z.infer; - - /** - * PrepareFactoringMergeRequestDtoSchema - * @type { object } - * @property { FileMetadataDto } eurDebtorFile EUR debtor file metadata - * @property { FileMetadataDto } eurOperationsFile EUR operations file metadata - * @property { FileMetadataDto } eurExistingFactoringFile EUR existing factoring file metadata (optional) - * @property { FileMetadataDto } usdDebtorFile USD debtor file metadata - * @property { FileMetadataDto } usdOperationsFile USD operations file metadata - * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) - */ - export const PrepareFactoringMergeRequestDtoSchema = z - .object({ - eurDebtorFile: FileMetadataDtoSchema.describe("EUR debtor file metadata"), - eurOperationsFile: FileMetadataDtoSchema.describe("EUR operations file metadata"), - eurExistingFactoringFile: FileMetadataDtoSchema.describe( - "EUR existing factoring file metadata (optional)", - ).nullish(), - usdDebtorFile: FileMetadataDtoSchema.describe("USD debtor file metadata"), - usdOperationsFile: FileMetadataDtoSchema.describe("USD operations file metadata"), - usdExistingFactoringFile: FileMetadataDtoSchema.describe( - "USD existing factoring file metadata (optional)", - ).nullish(), - }) - .readonly(); - export type PrepareFactoringMergeRequestDto = z.infer; - - /** - * MediaUploadInstructionsDtoSchema - * @type { object } - * @property { string } id - * @property { string } method - * @property { string } url - */ - export const MediaUploadInstructionsDtoSchema = z - .object({ id: z.string(), method: z.string(), url: z.string() }) - .readonly(); - export type MediaUploadInstructionsDto = z.infer; - - /** - * FactoringMergeUploadInstructionsResponseDtoSchema - * @type { object } - * @property { string } batchId - * @property { MediaUploadInstructionsDto } eurDebtorFile - * @property { MediaUploadInstructionsDto } eurOperationsFile - * @property { MediaUploadInstructionsDto } eurExistingFactoringFile - * @property { MediaUploadInstructionsDto } usdDebtorFile - * @property { MediaUploadInstructionsDto } usdOperationsFile - * @property { MediaUploadInstructionsDto } usdExistingFactoringFile - */ - export const FactoringMergeUploadInstructionsResponseDtoSchema = z - .object({ - batchId: z.string(), - eurDebtorFile: MediaUploadInstructionsDtoSchema, - eurOperationsFile: MediaUploadInstructionsDtoSchema, - eurExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), - usdDebtorFile: MediaUploadInstructionsDtoSchema, - usdOperationsFile: MediaUploadInstructionsDtoSchema, - usdExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), - }) - .readonly(); - export type FactoringMergeUploadInstructionsResponseDto = z.infer< - typeof FactoringMergeUploadInstructionsResponseDtoSchema - >; - - /** - * FactoringMergeBatchStatusEnumSchema - * @type { enum } - */ - export const FactoringMergeBatchStatusEnumSchema = z.enum(["Initializing", "Processing", "Completed", "Failed"]); - export type FactoringMergeBatchStatusEnum = z.infer; - export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema.enum; - - /** - * FactoringMergeBatchResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { FactoringMergeBatchStatusEnum } status - * @property { string } eurDebtorFileMediaId - * @property { string } eurOperationsFileMediaId - * @property { string } eurExistingFactoringFileMediaId - * @property { string } usdDebtorFileMediaId - * @property { string } usdOperationsFileMediaId - * @property { string } usdExistingFactoringFileMediaId - * @property { string } eurResultFileMediaId - * @property { string } eurResultFileUrl - * @property { string } usdResultFileMediaId - * @property { string } usdResultFileUrl - * @property { string } jobId - * @property { string } errorMessage - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } completedAt - */ - export const FactoringMergeBatchResponseDtoSchema = z - .object({ - id: z.string(), - officeId: z.string(), - status: FactoringMergeBatchStatusEnumSchema, - eurDebtorFileMediaId: z.string(), - eurOperationsFileMediaId: z.string(), - eurExistingFactoringFileMediaId: z.string().nullish(), - usdDebtorFileMediaId: z.string(), - usdOperationsFileMediaId: z.string(), - usdExistingFactoringFileMediaId: z.string().nullish(), - eurResultFileMediaId: z.string().nullish(), - eurResultFileUrl: z.string().nullish(), - usdResultFileMediaId: z.string().nullish(), - usdResultFileUrl: z.string().nullish(), - jobId: z.string().nullish(), - errorMessage: z.string().nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - completedAt: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type FactoringMergeBatchResponseDto = z.infer; -} diff --git a/test/generated/dist/factoringMerge/factoringMerge.queries.ts b/test/generated/dist/factoringMerge/factoringMerge.queries.ts deleted file mode 100644 index 45c7497..0000000 --- a/test/generated/dist/factoringMerge/factoringMerge.queries.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { FactoringMergeAcl } from "./factoringMerge.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FactoringMergeModels } from "./factoringMerge.models"; -import { FactoringMergeApi } from "./factoringMerge.api"; - -export namespace FactoringMergeQueries { - export const moduleName = QueryModule.FactoringMerge; - - export const keys = { - all: [moduleName] as const, - getMergeBatch: (officeId: string, batchId: string) => - [...keys.all, "/offices/:officeId/factoring-merge/:batchId", officeId, batchId] as const, - }; - - /** - * Mutation `usePrepareUpload` - * @summary Prepare upload instructions for MOVE files merge - * @permission Requires `canUsePrepareUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { FactoringMergeModels.PrepareFactoringMergeRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const usePrepareUpload = ( - options?: AppMutationOptions< - typeof FactoringMergeApi.prepareUpload, - { officeId: string; data: FactoringMergeModels.PrepareFactoringMergeRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId })); - return FactoringMergeApi.prepareUpload(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useProcessMerge` - * @summary Start processing the merge batch - * @permission Requires `canUseProcessMerge` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const useProcessMerge = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId })); - return FactoringMergeApi.processMerge(officeId, batchId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, batchId } = variables; - const updateKeys = [keys.getMergeBatch(officeId, batchId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetMergeBatch` - * @summary Get merge batch status - * @permission Requires `canUseGetMergeBatch` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, default] - */ - export const useGetMergeBatch = ( - { officeId, batchId }: { officeId: string; batchId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getMergeBatch(officeId, batchId), - queryFn: () => { - checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId })); - return FactoringMergeApi.getMergeBatch(officeId, batchId, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/files/files.api.ts b/test/generated/dist/files/files.api.ts deleted file mode 100644 index c0ae919..0000000 --- a/test/generated/dist/files/files.api.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { FilesModels } from "./files.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace FilesApi { - export const createUpload = ( - officeId: string, - folderId: string, - data: FilesModels.CreateFileRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: FilesModels.FileUploadResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}/files`, - ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), - config, - ); - }; - export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/files/eml`, - ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const rename = ( - officeId: string, - fileId: string, - data: FilesModels.RenameFileRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.FileResponseDTOSchema }, - `/offices/${officeId}/files/${fileId}`, - ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), - config, - ); - }; - export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/move`, - ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - config, - ); - }; - export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/copy`, - ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - config, - ); - }; - export const archive = ( - officeId: string, - data: FilesModels.SetFilesArchivedRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/archive`, - ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - config, - ); - }; - export const unarchive = ( - officeId: string, - data: FilesModels.SetFilesArchivedRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/unarchive`, - ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/files/files.models.ts b/test/generated/dist/files/files.models.ts deleted file mode 100644 index 2f07427..0000000 --- a/test/generated/dist/files/files.models.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { z } from "zod"; - -export namespace FilesModels { - /** - * CreateFileRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } mimeType - * @property { number } fileSize Minimum: `0` - */ - export const CreateFileRequestDTOSchema = z - .object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }) - .readonly(); - export type CreateFileRequestDTO = z.infer; - - /** - * FileUploadResponseDTOSchema - * @type { object } - * @property { string } fileId - * @property { string } method - * @property { string } url - */ - export const FileUploadResponseDTOSchema = z - .object({ fileId: z.string(), method: z.string(), url: z.string() }) - .readonly(); - export type FileUploadResponseDTO = z.infer; - - /** - * GetFilesEmlRequestDTOSchema - * @type { object } - * @property { string[] } ids Min Items: `1` - */ - export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); - export type GetFilesEmlRequestDTO = z.infer; - - /** - * RenameFileRequestDTOSchema - * @type { object } - * @property { string } name - */ - export const RenameFileRequestDTOSchema = z.object({ name: z.string() }).readonly(); - export type RenameFileRequestDTO = z.infer; - - /** - * MoveFilesRequestDTOSchema - * @type { object } - * @property { string[] } fileIds Min Items: `1` - * @property { string } targetFolderId - */ - export const MoveFilesRequestDTOSchema = z - .object({ fileIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }) - .readonly(); - export type MoveFilesRequestDTO = z.infer; - - /** - * SetFilesArchivedRequestDTOSchema - * @type { object } - * @property { string[] } ids Min Items: `1` - */ - export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); - export type SetFilesArchivedRequestDTO = z.infer; -} diff --git a/test/generated/dist/files/files.queries.ts b/test/generated/dist/files/files.queries.ts deleted file mode 100644 index a37c4f3..0000000 --- a/test/generated/dist/files/files.queries.ts +++ /dev/null @@ -1,245 +0,0 @@ -import axios, { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FilesModels } from "./files.models"; -import { FilesApi } from "./files.api"; - -export namespace FilesQueries { - export const moduleName = QueryModule.Files; - - /** - * Mutation `useCreateUpload` - * @summary Create file upload instructions - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { FilesModels.CreateFileRequestDTO } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateUpload = ( - options?: AppMutationOptions< - typeof FilesApi.createUpload, - { - officeId: string; - folderId: string; - data: FilesModels.CreateFileRequestDTO; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { - const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGetEml` - recommended when file should not be cached - * @summary Get files as EML file with attachments - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.GetFilesEmlRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGetEml = ( - options?: AppMutationOptions< - typeof FilesApi.getEml, - { officeId: string; data: FilesModels.GetFilesEmlRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FilesApi.getEml(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useRename` - * @summary Rename file - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.fileId Path parameter - * @param { FilesModels.RenameFileRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useRename = ( - options?: AppMutationOptions< - typeof FilesApi.rename, - { officeId: string; fileId: string; data: FilesModels.RenameFileRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, fileId, data }) => FilesApi.rename(officeId, fileId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useMove` - * @summary Move files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useMove = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FilesApi.move(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCopy` - * @summary Copy files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useCopy = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FilesApi.copy(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useArchive = ( - options?: AppMutationOptions< - typeof FilesApi.archive, - { officeId: string; data: FilesModels.SetFilesArchivedRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FilesApi.archive(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions< - typeof FilesApi.unarchive, - { officeId: string; data: FilesModels.SetFilesArchivedRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FilesApi.unarchive(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/folders/folders.api.ts b/test/generated/dist/folders/folders.api.ts deleted file mode 100644 index 6115ad4..0000000 --- a/test/generated/dist/folders/folders.api.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { FoldersModels } from "./folders.models"; - -export namespace FoldersApi { - export const getTree = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}/tree`, - config, - ); - }; - export const getContent = ( - officeId: string, - folderId: string, - limit: number, - order?: FoldersModels.GetContentOrderParam, - filter?: FoldersModels.FolderContentFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}`, - { - ...config, - params: { - order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { - type: "query", - name: "order", - }), - filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const rename = ( - officeId: string, - folderId: string, - data: FoldersModels.RenameFolderRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}`, - ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), - config, - ); - }; - export const deleteFolder = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete({ resSchema: z.void() }, `/offices/${officeId}/folders/${folderId}`, undefined, config); - }; - export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders`, - ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), - config, - ); - }; - export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/folders/move`, - ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/folders/folders.models.ts b/test/generated/dist/folders/folders.models.ts deleted file mode 100644 index c9908a5..0000000 --- a/test/generated/dist/folders/folders.models.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace FoldersModels { - /** - * TargetEntityNameEnumSchema - * @type { enum } - */ - export const TargetEntityNameEnumSchema = z.enum(["invoice", "quote"]); - export type TargetEntityNameEnum = z.infer; - export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; - - /** - * FolderSymlinkResponseDTOSchema - * @type { object } - * @property { string } targetEntityName - * @property { string } targetEntityId - */ - export const FolderSymlinkResponseDTOSchema = z - .object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }) - .readonly(); - export type FolderSymlinkResponseDTO = z.infer; - - /** - * FolderTreeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } isSystem - * @property { boolean } isSymlink - * @property { FolderSymlinkResponseDTO } symlink - * @property { FolderTreeResponseDTO[] } folders - */ - export const FolderTreeResponseDTOSchema = z - .object({ - id: z.string(), - name: z.string(), - isSystem: z.boolean(), - isSymlink: z.boolean(), - symlink: FolderSymlinkResponseDTOSchema.nullable(), - get folders() { - return z.array(FolderTreeResponseDTOSchema).readonly(); - }, - }) - .readonly(); - export type FolderTreeResponseDTO = z.infer; - - /** - * FolderResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } archived - * @property { boolean } isSystem - * @property { boolean } isSymlink - * @property { FolderSymlinkResponseDTO } symlink - * @property { string } createdAt - * @property { string } updatedAt - * @property { CommonModels.FolderEmployeeDTO } createdBy - * @property { CommonModels.FolderEmployeeDTO } updatedBy - * @property { CommonModels.FileResponseDTO[] } files - * @property { FolderResponseDTO[] } folders - */ - export const FolderResponseDTOSchema = z - .object({ - id: z.string(), - name: z.string(), - archived: z.boolean(), - isSystem: z.boolean(), - isSymlink: z.boolean(), - symlink: FolderSymlinkResponseDTOSchema.nullable(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - createdBy: CommonModels.FolderEmployeeDTOSchema, - updatedBy: CommonModels.FolderEmployeeDTOSchema, - files: z.array(CommonModels.FileResponseDTOSchema).readonly(), - get folders() { - return z.array(FolderResponseDTOSchema).readonly(); - }, - }) - .readonly(); - export type FolderResponseDTO = z.infer; - - /** - * FolderContentFilterDtoSchema - * @type { object } - * @property { boolean } archived When omitted, both archived and unarchived files are returned. - */ - export const FolderContentFilterDtoSchema = z - .object({ archived: z.boolean().describe("When omitted, both archived and unarchived files are returned.") }) - .readonly(); - export type FolderContentFilterDto = z.infer; - - /** - * CreateFolderRequestDTOSchema - * @type { object } - * @property { string } parentFolderId - * @property { string } name - */ - export const CreateFolderRequestDTOSchema = z.object({ parentFolderId: z.string(), name: z.string() }).readonly(); - export type CreateFolderRequestDTO = z.infer; - - /** - * RenameFolderRequestDTOSchema - * @type { object } - * @property { string } name - */ - export const RenameFolderRequestDTOSchema = z.object({ name: z.string() }).readonly(); - export type RenameFolderRequestDTO = z.infer; - - /** - * MoveFoldersRequestDTOSchema - * @type { object } - * @property { string[] } folderIds Min Items: `1` - * @property { string } targetFolderId - */ - export const MoveFoldersRequestDTOSchema = z - .object({ folderIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }) - .readonly(); - export type MoveFoldersRequestDTO = z.infer; - - /** - * GetContentOrderParamSchema - * @type { array } - * @description Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - */ - export const GetContentOrderParamSchema = z - .array(z.string()) - .readonly() - .describe("Order by fields (comma separated with +/- prefix): name, createdAt") - .nullish(); - export type GetContentOrderParam = z.infer; -} diff --git a/test/generated/dist/folders/folders.queries.ts b/test/generated/dist/folders/folders.queries.ts deleted file mode 100644 index ce4299d..0000000 --- a/test/generated/dist/folders/folders.queries.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FoldersModels } from "./folders.models"; -import { FoldersApi } from "./folders.api"; - -export namespace FoldersQueries { - export const moduleName = QueryModule.Folders; - - export const keys = { - all: [moduleName] as const, - getTree: (officeId: string, folderId: string) => - [...keys.all, "/offices/:officeId/folders/:folderId/tree", officeId, folderId] as const, - getContent: ( - officeId: string, - folderId: string, - limit?: number, - order?: FoldersModels.GetContentOrderParam, - filter?: FoldersModels.FolderContentFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/folders/:folderId", - officeId, - folderId, - limit, - order, - filter, - page, - cursor, - ] as const, - getContentInfinite: ( - officeId: string, - folderId: string, - limit?: number, - order?: FoldersModels.GetContentOrderParam, - filter?: FoldersModels.FolderContentFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/folders/:folderId", - "infinite", - officeId, - folderId, - limit, - order, - filter, - cursor, - ] as const, - }; - - /** - * Query `useGetTree` - * @summary Get folder tree - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetTree = ( - { officeId, folderId }: { officeId: string; folderId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getTree(officeId, folderId), - queryFn: () => FoldersApi.getTree(officeId, folderId, config), - ...options, - }); - }; - - /** - * Query `useGetContent` - * @summary Get folder content - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetContent = ( - { - officeId, - folderId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - folderId: string; - limit: number; - order?: FoldersModels.GetContentOrderParam; - filter?: FoldersModels.FolderContentFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), - queryFn: () => FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor, config), - ...options, - }); - }; - - /** - * Infinite query `useGetContentInfinite - * @summary Get folder content - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useGetContentInfinite = ( - { - officeId, - folderId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - folderId: string; - limit: number; - order?: FoldersModels.GetContentOrderParam; - filter?: FoldersModels.FolderContentFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => - FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useRename` - * @summary Rename folder - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { FoldersModels.RenameFolderRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useRename = ( - options?: AppMutationOptions< - typeof FoldersApi.rename, - { officeId: string; folderId: string; data: FoldersModels.RenameFolderRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, folderId, data }) => FoldersApi.rename(officeId, folderId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteFolder` - * @summary Delete folder - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteFolder = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, folderId }) => FoldersApi.deleteFolder(officeId, folderId, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create folder - * @param { string } mutation.officeId Path parameter - * @param { FoldersModels.CreateFolderRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof FoldersApi.create, - { officeId: string; data: FoldersModels.CreateFolderRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FoldersApi.create(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useMove` - * @summary Move folders - * @param { string } mutation.officeId Path parameter - * @param { FoldersModels.MoveFoldersRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useMove = ( - options?: AppMutationOptions< - typeof FoldersApi.move, - { officeId: string; data: FoldersModels.MoveFoldersRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => FoldersApi.move(officeId, data, config), - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/hsCodes/hsCodes.acl.ts b/test/generated/dist/hsCodes/hsCodes.acl.ts deleted file mode 100644 index e893613..0000000 --- a/test/generated/dist/hsCodes/hsCodes.acl.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace HsCodesAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "HsCode"] as AbilityTuple<"Create", "HsCode">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "HsCode"] as AbilityTuple<"Read", "HsCode">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "HsCode"] as AbilityTuple<"Update", "HsCode">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "HsCode"] as AbilityTuple<"Archive", "HsCode">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "HsCode"] as AbilityTuple<"Archive", "HsCode">; -} diff --git a/test/generated/dist/hsCodes/hsCodes.api.ts b/test/generated/dist/hsCodes/hsCodes.api.ts deleted file mode 100644 index 8b3305c..0000000 --- a/test/generated/dist/hsCodes/hsCodes.api.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { HsCodesModels } from "./hsCodes.models"; - -export namespace HsCodesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: HsCodesModels.HsCodePaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, `/hs-codes`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes`, - ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), - config, - ); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: HsCodesModels.HsCodeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, - `/hs-codes/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: HsCodesModels.HsCodeResponseDTOSchema }, `/hs-codes/${id}`, config); - }; - export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}`, - ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/hsCodes/hsCodes.configs.ts b/test/generated/dist/hsCodes/hsCodes.configs.ts deleted file mode 100644 index a69eec4..0000000 --- a/test/generated/dist/hsCodes/hsCodes.configs.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { HsCodesModels } from "./hsCodes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { HsCodesQueries } from "./hsCodes.queries"; -import { HsCodesAcl } from "./hsCodes.acl"; - -export namespace HsCodesConfigs { - export const hsCodesConfig = { - meta: { - title: "Hs Codes", - }, - readAll: { - acl: HsCodesAcl.canUsePaginate, - schema: HsCodesModels.HsCodeResponseDTOSchema, - paginated: HsCodesQueries.usePaginate, - infinite: HsCodesQueries.usePaginateInfinite, - filters: { - schema: HsCodesModels.HsCodePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: HsCodesModels.HsCodePaginationFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: HsCodesModels.HsCodeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - description: true, - customArea: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: HsCodesModels.HsCodesPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: HsCodesAcl.canUseFindById, - schema: HsCodesModels.HsCodeResponseDTOSchema, - query: HsCodesQueries.useFindById, - }, - create: { - acl: HsCodesAcl.canUseCreate, - schema: HsCodesModels.CreateHsCodeRequestDTOSchema, - mutation: HsCodesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: HsCodesModels.CreateHsCodeRequestDTOSchema, - options: { - inputs: { - name: true, - description: true, - customArea: true, - }, - }, - }), - }, - update: { - acl: HsCodesAcl.canUseUpdate, - schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, - mutation: HsCodesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, - options: { - inputs: { - name: true, - description: true, - customArea: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: HsCodesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: HsCodesQueries.usePaginateLabels, - infinite: HsCodesQueries.usePaginateLabelsInfinite, - filters: { - schema: HsCodesModels.HsCodeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: HsCodesModels.HsCodeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/hsCodes/hsCodes.models.ts b/test/generated/dist/hsCodes/hsCodes.models.ts deleted file mode 100644 index 2631d56..0000000 --- a/test/generated/dist/hsCodes/hsCodes.models.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace HsCodesModels { - /** - * HsCodeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type HsCodeEmployeeDTO = z.infer; - - /** - * HsCodeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the HS Code - * @property { string } name Name of the HS Code - * @property { string } description Description of the HS Code - * @property { string } customArea Custom area associated with the HS Code - * @property { boolean } archived Indicates if the HS Code is archived - * @property { string } createdById - * @property { HsCodeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { HsCodeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const HsCodeResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier for the HS Code"), - name: z.string().describe("Name of the HS Code"), - description: z.string().describe("Description of the HS Code"), - customArea: z.string().describe("Custom area associated with the HS Code"), - archived: z.boolean().describe("Indicates if the HS Code is archived"), - createdById: z.string().nullish(), - createdBy: HsCodeEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: HsCodeEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type HsCodeResponseDTO = z.infer; - - /** - * HsCodePaginationFilterDtoSchema - * @type { object } - * @property { boolean } archived Archived status - * @property { string } search - */ - export const HsCodePaginationFilterDtoSchema = z - .object({ archived: z.boolean().describe("Archived status"), search: z.string() }) - .readonly(); - export type HsCodePaginationFilterDto = z.infer; - - /** - * HsCodeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const HsCodeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type HsCodeLabelFilterDto = z.infer; - - /** - * CreateHsCodeRequestDTOSchema - * @type { object } - * @property { string } name Unique name for the HS Code - * @property { string } description Description of the HS Code - * @property { string } customArea Custom area associated with the HS Code - */ - export const CreateHsCodeRequestDTOSchema = z - .object({ - name: z.string().describe("Unique name for the HS Code"), - description: z.string().describe("Description of the HS Code"), - customArea: z.string().describe("Custom area associated with the HS Code"), - }) - .readonly(); - export type CreateHsCodeRequestDTO = z.infer; - - /** - * UpdateHsCodeRequestDTOSchema - * @type { object } - * @property { string } name Updated name of the HS Code. - * @property { string } description Updated description of the HS Code. - * @property { string } customArea Updated custom area associated with the HS Code. - */ - export const UpdateHsCodeRequestDTOSchema = z - .object({ - name: z.string().describe("Updated name of the HS Code."), - description: z.string().describe("Updated description of the HS Code."), - customArea: z.string().describe("Updated custom area associated with the HS Code."), - }) - .readonly(); - export type UpdateHsCodeRequestDTO = z.infer; - - /** - * HsCodesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const HsCodesPaginateOrderParamEnumSchema = z.enum([ - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "name", - ]); - export type HsCodesPaginateOrderParamEnum = z.infer; - export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema.enum; - - /** - * HsCodesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { HsCodeResponseDTO[] } items - */ - export const HsCodesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(HsCodeResponseDTOSchema).readonly() }).readonly().shape, - }); - export type HsCodesPaginateResponse = z.infer; - - /** - * HsCodesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const HsCodesPaginateLabelsOrderParamEnumSchema = z.enum([ - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - "name", - ]); - export type HsCodesPaginateLabelsOrderParamEnum = z.infer; - export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderParamEnumSchema.enum; - - /** - * HsCodesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const HsCodesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type HsCodesPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/hsCodes/hsCodes.queries.ts b/test/generated/dist/hsCodes/hsCodes.queries.ts deleted file mode 100644 index fb9390b..0000000 --- a/test/generated/dist/hsCodes/hsCodes.queries.ts +++ /dev/null @@ -1,353 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { HsCodesAcl } from "./hsCodes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { HsCodesModels } from "./hsCodes.models"; -import { HsCodesApi } from "./hsCodes.api"; - -export namespace HsCodesQueries { - export const moduleName = QueryModule.HsCodes; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: HsCodesModels.HsCodePaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/hs-codes", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: HsCodesModels.HsCodePaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/hs-codes", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: HsCodesModels.HsCodeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/hs-codes/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: HsCodesModels.HsCodeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/hs-codes/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/hs-codes/:id", id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate HS Codes - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: HsCodesModels.HsCodePaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate HS Codes - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: HsCodesModels.HsCodePaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create a new HS Code - * @permission Requires `canUseCreate` ability - * @param { HsCodesModels.CreateHsCodeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(HsCodesAcl.canUseCreate()); - return HsCodesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate HS codes with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: HsCodesModels.HsCodeLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate HS codes with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: HsCodesModels.HsCodeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get HS Code Details by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(HsCodesAcl.canUseFindById()); - return HsCodesApi.findById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update an existing HS Code - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { HsCodesModels.UpdateHsCodeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(HsCodesAcl.canUseUpdate()); - return HsCodesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive an HS Code - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(HsCodesAcl.canUseArchive()); - return HsCodesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive an HS Code - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(HsCodesAcl.canUseUnarchive()); - return HsCodesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/integrationChannels/integrationChannels.acl.ts b/test/generated/dist/integrationChannels/integrationChannels.acl.ts deleted file mode 100644 index 497b407..0000000 --- a/test/generated/dist/integrationChannels/integrationChannels.acl.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace IntegrationChannelsAcl { - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List integration channels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Read", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Create", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; - - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Read integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Read", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Update", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Archive", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Archive", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; - - /** - * Use for `useTestConnection` mutation ability. For global ability, omit the object parameter. - * @description Test integration channel connection - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTestConnection` mutation - */ - export const canUseTestConnection = (object?: { officeId: string }) => - ["Update", object ? subject("IntegrationChannel", object) : "IntegrationChannel"] as AbilityTuple< - "Update", - "IntegrationChannel" | (ForcedSubject<"IntegrationChannel"> & { officeId: string }) - >; - - /** - * Use for `useListMessages` query ability. For global ability, omit the object parameter. - * @description List integration channel messages - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListMessages` query - */ - export const canUseListMessages = (object?: { officeId: string }) => - ["Read", object ? subject("IntegrationMessage", object) : "IntegrationMessage"] as AbilityTuple< - "Read", - "IntegrationMessage" | (ForcedSubject<"IntegrationMessage"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/integrationChannels/integrationChannels.api.ts b/test/generated/dist/integrationChannels/integrationChannels.api.ts deleted file mode 100644 index b2bb5d5..0000000 --- a/test/generated/dist/integrationChannels/integrationChannels.api.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; - -export namespace IntegrationChannelsApi { - export const list = ( - officeId: string, - limit: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, - `/offices/${officeId}/integration-channels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = ( - officeId: string, - data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels`, - ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), - config, - ); - }; - export const findById = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}`, - config, - ); - }; - export const update = ( - officeId: string, - id: string, - data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}`, - ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), - config, - ); - }; - export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/unarchive`, - undefined, - config, - ); - }; - export const testConnection = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/test-connection`, - undefined, - config, - ); - }; - export const listMessages = ( - officeId: string, - id: string, - limit: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, - `/offices/${officeId}/integration-channels/${id}/messages`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; -} diff --git a/test/generated/dist/integrationChannels/integrationChannels.configs.ts b/test/generated/dist/integrationChannels/integrationChannels.configs.ts deleted file mode 100644 index 4105a84..0000000 --- a/test/generated/dist/integrationChannels/integrationChannels.configs.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; -import { IntegrationChannelsQueries } from "./integrationChannels.queries"; -import { IntegrationChannelsAcl } from "./integrationChannels.acl"; - -export namespace IntegrationChannelsConfigs { - export const integrationChannelsConfig = { - meta: { - title: "Integration Channels", - }, - readAll: { - acl: IntegrationChannelsAcl.canUseList, - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - paginated: IntegrationChannelsQueries.useList, - infinite: IntegrationChannelsQueries.useListInfinite, - filters: { - schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - options: { - columns: { - id: true, - officeId: true, - businessPartnerId: true, - businessPartner: true, - employeeId: true, - name: true, - archived: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - lastPolledAt: true, - createdAt: true, - createdById: true, - createdBy: true, - updatedAt: true, - updatedById: true, - updatedBy: true, - }, - sortable: IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema, - }, - }), - }, - read: { - acl: IntegrationChannelsAcl.canUseFindById, - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - query: IntegrationChannelsQueries.useFindById, - }, - create: { - acl: IntegrationChannelsAcl.canUseCreate, - schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, - mutation: IntegrationChannelsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, - options: { - inputs: { - businessPartnerId: true, - employeeId: true, - name: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - sftpPassword: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - }, - }, - }), - }, - update: { - acl: IntegrationChannelsAcl.canUseUpdate, - schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, - mutation: IntegrationChannelsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, - options: { - inputs: { - businessPartnerId: true, - employeeId: true, - name: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - sftpPassword: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - }, - }, - }), - }, - }; - - export const messagesConfig = { - meta: { - title: "Messages", - }, - readAll: { - acl: IntegrationChannelsAcl.canUseListMessages, - schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, - paginated: IntegrationChannelsQueries.useListMessages, - infinite: IntegrationChannelsQueries.useListMessagesInfinite, - filters: { - schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, - options: { - inputs: { - direction: true, - format: true, - status: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, - options: { - columns: { - id: true, - integrationChannelId: true, - positionId: true, - positionNumber: true, - direction: true, - format: true, - status: true, - rawContent: true, - fileName: true, - errorMessage: true, - processedAt: true, - sentAt: true, - createdAt: true, - }, - sortable: IntegrationChannelsModels.ListMessagesOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/integrationChannels/integrationChannels.models.ts b/test/generated/dist/integrationChannels/integrationChannels.models.ts deleted file mode 100644 index cbd4d90..0000000 --- a/test/generated/dist/integrationChannels/integrationChannels.models.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace IntegrationChannelsModels { - /** - * IntegrationChannelBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const IntegrationChannelBusinessPartnerResponseDtoSchema = z - .object({ id: z.string(), name: z.string() }) - .readonly(); - export type IntegrationChannelBusinessPartnerResponseDto = z.infer< - typeof IntegrationChannelBusinessPartnerResponseDtoSchema - >; - - /** - * IntegrationChannelEmployeeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const IntegrationChannelEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type IntegrationChannelEmployeeResponseDto = z.infer; - - /** - * IntegrationChannelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } businessPartnerId - * @property { IntegrationChannelBusinessPartnerResponseDto } businessPartner - * @property { string } employeeId - * @property { string } name - * @property { boolean } archived - * @property { string } sftpHost - * @property { number } sftpPort - * @property { string } sftpUsername - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes - * @property { string } lastPolledAt - * @property { string } createdAt - * @property { string } createdById - * @property { IntegrationChannelEmployeeResponseDto } createdBy - * @property { string } updatedAt - * @property { string } updatedById - * @property { IntegrationChannelEmployeeResponseDto } updatedBy - */ - export const IntegrationChannelResponseDtoSchema = z - .object({ - id: z.string(), - officeId: z.string(), - businessPartnerId: z.string(), - businessPartner: IntegrationChannelBusinessPartnerResponseDtoSchema, - employeeId: z.string(), - name: z.string(), - archived: z.boolean(), - sftpHost: z.string(), - sftpPort: z.number(), - sftpUsername: z.string(), - inboundPath: z.string(), - outboundPath: z.string(), - pollingFrequencyMinutes: z.number(), - lastPolledAt: z.iso.datetime({ offset: true }).nullish(), - createdAt: z.iso.datetime({ offset: true }), - createdById: z.string(), - createdBy: IntegrationChannelEmployeeResponseDtoSchema, - updatedAt: z.iso.datetime({ offset: true }), - updatedById: z.string(), - updatedBy: IntegrationChannelEmployeeResponseDtoSchema, - }) - .readonly(); - export type IntegrationChannelResponseDto = z.infer; - - /** - * IntegrationMessageDirectionEnumSchema - * @type { enum } - */ - export const IntegrationMessageDirectionEnumSchema = z.enum(["Inbound", "Outbound"]); - export type IntegrationMessageDirectionEnum = z.infer; - export const IntegrationMessageDirectionEnum = IntegrationMessageDirectionEnumSchema.enum; - - /** - * IntegrationMessageFormatEnumSchema - * @type { enum } - */ - export const IntegrationMessageFormatEnumSchema = z.enum(["IFTMBF", "IFTMBC"]); - export type IntegrationMessageFormatEnum = z.infer; - export const IntegrationMessageFormatEnum = IntegrationMessageFormatEnumSchema.enum; - - /** - * IntegrationMessageStatusEnumSchema - * @type { enum } - */ - export const IntegrationMessageStatusEnumSchema = z.enum(["Received", "Processed", "Failed", "Sent"]); - export type IntegrationMessageStatusEnum = z.infer; - export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.enum; - - /** - * IntegrationMessageFilterDtoSchema - * @type { object } - * @property { IntegrationMessageDirectionEnum } direction - * @property { IntegrationMessageFormatEnum } format - * @property { IntegrationMessageStatusEnum } status - * @property { string } search - */ - export const IntegrationMessageFilterDtoSchema = z - .object({ - direction: IntegrationMessageDirectionEnumSchema, - format: IntegrationMessageFormatEnumSchema, - status: IntegrationMessageStatusEnumSchema, - search: z.string(), - }) - .readonly(); - export type IntegrationMessageFilterDto = z.infer; - - /** - * IntegrationChannelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const IntegrationChannelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type IntegrationChannelFilterDto = z.infer; - - /** - * CreateIntegrationChannelRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } employeeId - * @property { string } name - * @property { string } sftpHost - * @property { number } sftpPort Minimum: `1`. Maximum: `65535` - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes Minimum: `1` - */ - export const CreateIntegrationChannelRequestDtoSchema = z - .object({ - businessPartnerId: z.string(), - employeeId: z.string(), - name: z.string(), - sftpHost: z.string(), - sftpPort: z.number().gte(1).lte(65535), - sftpUsername: z.string(), - sftpPassword: z.string(), - inboundPath: z.string(), - outboundPath: z.string(), - pollingFrequencyMinutes: z.number().gte(1), - }) - .readonly(); - export type CreateIntegrationChannelRequestDto = z.infer; - - /** - * UpdateIntegrationChannelRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } employeeId - * @property { string } name - * @property { string } sftpHost - * @property { number } sftpPort Minimum: `1`. Maximum: `65535` - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes Minimum: `1` - */ - export const UpdateIntegrationChannelRequestDtoSchema = z - .object({ - businessPartnerId: z.string(), - employeeId: z.string(), - name: z.string(), - sftpHost: z.string(), - sftpPort: z.number().gte(1).lte(65535), - sftpUsername: z.string(), - sftpPassword: z.string(), - inboundPath: z.string(), - outboundPath: z.string(), - pollingFrequencyMinutes: z.number().gte(1), - }) - .readonly(); - export type UpdateIntegrationChannelRequestDto = z.infer; - - /** - * TestConnectionResponseDtoSchema - * @type { object } - * @property { boolean } success - */ - export const TestConnectionResponseDtoSchema = z.object({ success: z.boolean() }).readonly(); - export type TestConnectionResponseDto = z.infer; - - /** - * IntegrationMessageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } integrationChannelId - * @property { string } positionId - * @property { string } positionNumber - * @property { string } direction - * @property { string } format - * @property { string } status - * @property { string } rawContent - * @property { string } fileName - * @property { string } errorMessage - * @property { string } processedAt - * @property { string } sentAt - * @property { string } createdAt - */ - export const IntegrationMessageResponseDtoSchema = z - .object({ - id: z.string(), - integrationChannelId: z.string(), - positionId: z.string().nullish(), - positionNumber: z.string().nullish(), - direction: z.string(), - format: z.string(), - status: z.string(), - rawContent: z.string(), - fileName: z.string(), - errorMessage: z.string().nullish(), - processedAt: z.iso.datetime({ offset: true }).nullish(), - sentAt: z.iso.datetime({ offset: true }).nullish(), - createdAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type IntegrationMessageResponseDto = z.infer; - - /** - * IntegrationChannelsListOrderParamEnumSchema - * @type { enum } - */ - export const IntegrationChannelsListOrderParamEnumSchema = z.enum([ - "createdAt", - "name", - "businessPartner", - "lastPolledAt", - ]); - export type IntegrationChannelsListOrderParamEnum = z.infer; - export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrderParamEnumSchema.enum; - - /** - * IntegrationChannelsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { IntegrationChannelResponseDto[] } items - */ - export const IntegrationChannelsListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).readonly() }).readonly().shape, - }); - export type IntegrationChannelsListResponse = z.infer; - - /** - * ListMessagesOrderParamEnumSchema - * @type { enum } - */ - export const ListMessagesOrderParamEnumSchema = z.enum(["createdAt", "status", "direction", "format"]); - export type ListMessagesOrderParamEnum = z.infer; - export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; - - /** - * ListMessagesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { IntegrationMessageResponseDto[] } items - */ - export const ListMessagesResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).readonly() }).readonly().shape, - }); - export type ListMessagesResponse = z.infer; -} diff --git a/test/generated/dist/integrationChannels/integrationChannels.queries.ts b/test/generated/dist/integrationChannels/integrationChannels.queries.ts deleted file mode 100644 index 9ba5b53..0000000 --- a/test/generated/dist/integrationChannels/integrationChannels.queries.ts +++ /dev/null @@ -1,471 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { IntegrationChannelsAcl } from "./integrationChannels.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; -import { IntegrationChannelsApi } from "./integrationChannels.api"; - -export namespace IntegrationChannelsQueries { - export const moduleName = QueryModule.IntegrationChannels; - - export const keys = { - all: [moduleName] as const, - list: ( - officeId: string, - limit?: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, - page?: number, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/integration-channels", officeId, limit, order, filter, page, cursor] as const, - listInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/integration-channels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (officeId: string, id: string) => - [...keys.all, "/offices/:officeId/integration-channels/:id", officeId, id] as const, - listMessages: ( - officeId: string, - id: string, - limit?: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/integration-channels/:id/messages", - officeId, - id, - limit, - order, - filter, - page, - cursor, - ] as const, - listMessagesInfinite: ( - officeId: string, - id: string, - limit?: number, - order?: string, - filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/integration-channels/:id/messages", - "infinite", - officeId, - id, - limit, - order, - filter, - cursor, - ] as const, - }; - - /** - * Query `useList` - * @summary List integration channels for an office - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: IntegrationChannelsModels.IntegrationChannelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseList({ officeId })); - return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List integration channels for an office - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: IntegrationChannelsModels.IntegrationChannelFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(IntegrationChannelsAcl.canUseList({ officeId })); - return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create integration channel - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { IntegrationChannelsModels.CreateIntegrationChannelRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof IntegrationChannelsApi.create, - { officeId: string; data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId })); - return IntegrationChannelsApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get integration channel by id - * @permission Requires `canUseFindById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { officeId, id }: { officeId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(officeId, id), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId })); - return IntegrationChannelsApi.findById(officeId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update integration channel by id - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof IntegrationChannelsApi.update, - { officeId: string; id: string; data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId })); - return IntegrationChannelsApi.update(officeId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive integration channel by id - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId })); - return IntegrationChannelsApi.archive(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive integration channel by id - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId })); - return IntegrationChannelsApi.unarchive(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useTestConnection` - * @summary Test integration channel SFTP connection - * @permission Requires `canUseTestConnection` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useTestConnection = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId })); - return IntegrationChannelsApi.testConnection(officeId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useListMessages` - * @summary Paginate integration channel messages - * @permission Requires `canUseListMessages` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListMessages = ( - { - officeId, - id, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - id: string; - limit: number; - order?: string; - filter?: IntegrationChannelsModels.IntegrationMessageFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId })); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListMessagesInfinite - * @summary Paginate integration channel messages - * @permission Requires `canUseListMessages` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListMessagesInfinite = ( - { - officeId, - id, - limit, - order, - filter, - cursor, - }: { - officeId: string; - id: string; - limit: number; - order?: string; - filter?: IntegrationChannelsModels.IntegrationMessageFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId })); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts deleted file mode 100644 index f0a32a5..0000000 --- a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InttraOfficeIntegrationAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Read", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; - - /** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ - export const canUseGenerate = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.api.ts b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.api.ts deleted file mode 100644 index a3ee1df..0000000 --- a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.api.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; - -export namespace InttraOfficeIntegrationApi { - export const get = (officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - config, - ); - }; - export const generate = (officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - undefined, - config, - ); - }; - export const update = ( - officeId: string, - data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.models.ts b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.models.ts deleted file mode 100644 index 607c312..0000000 --- a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.models.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { z } from "zod"; - -export namespace InttraOfficeIntegrationModels { - /** - * OfficeInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } rotatedByUserId - * @property { string } officeId - * @property { string } sftpUsername - * @property { string } sftpPublicKey - * @property { string } partnerCode - * @property { string } ediId - * @property { string } notificationEmail - */ - export const OfficeInttraCredentialsResponseDtoSchema = z - .object({ - id: z.string(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - rotatedByUserId: z.string().nullish(), - officeId: z.string(), - sftpUsername: z.string().nullish(), - sftpPublicKey: z.string().nullish(), - partnerCode: z.string().nullish(), - ediId: z.string().nullish(), - notificationEmail: z.string().nullish(), - }) - .readonly(); - export type OfficeInttraCredentialsResponseDto = z.infer; - - /** - * GenerateInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } publicKey - * @property { string } rotatedAt - * @property { string } rotatedByUserId - */ - export const GenerateInttraCredentialsResponseDtoSchema = z - .object({ publicKey: z.string(), rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }) - .readonly(); - export type GenerateInttraCredentialsResponseDto = z.infer; - - /** - * UpdateInttraCredentialsRequestDtoSchema - * @type { object } - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } partnerCode - * @property { string } ediId - * @property { string } notificationEmail - */ - export const UpdateInttraCredentialsRequestDtoSchema = z - .object({ - sftpUsername: z.string(), - sftpPassword: z.string(), - partnerCode: z.string(), - ediId: z.string(), - notificationEmail: z.string(), - }) - .readonly(); - export type UpdateInttraCredentialsRequestDto = z.infer; - - /** - * UpdateInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } rotatedAt - * @property { string } rotatedByUserId - */ - export const UpdateInttraCredentialsResponseDtoSchema = z - .object({ rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }) - .readonly(); - export type UpdateInttraCredentialsResponseDto = z.infer; -} diff --git a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts b/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts deleted file mode 100644 index 39b82e3..0000000 --- a/test/generated/dist/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InttraOfficeIntegrationAcl } from "./inttraOfficeIntegration.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; -import { InttraOfficeIntegrationApi } from "./inttraOfficeIntegration.api"; - -export namespace InttraOfficeIntegrationQueries { - export const moduleName = QueryModule.InttraOfficeIntegration; - - export const keys = { - all: [moduleName] as const, - get: (officeId: string) => [...keys.all, "/offices/:officeId/inttra/credentials", officeId] as const, - }; - - /** - * Query `useGet` - * @summary Get INTTRA credentials for an office - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId }: { officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId), - queryFn: () => { - checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId })); - return InttraOfficeIntegrationApi.get(officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useGenerate` - * @summary Generate and persist INTTRA SFTP RSA key pair for an office - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useGenerate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId }) => { - checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId })); - return InttraOfficeIntegrationApi.generate(officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Manually update INTTRA credentials (username/password/passphrase) - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof InttraOfficeIntegrationApi.update, - { officeId: string; data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId })); - return InttraOfficeIntegrationApi.update(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts deleted file mode 100644 index 85c97fc..0000000 --- a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InttraShippingInstructionMessagesAcl { - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List SI messages - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", - ] as AbilityTuple< - "Read", - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create SI message - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", - ] as AbilityTuple< - "Update", - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - >; - - /** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Get SI message details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ - export const canUseGetById = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", - ] as AbilityTuple< - "Read", - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update SI message - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions", - ] as AbilityTuple< - "Update", - | "WorkingDocument-shipping-instructions" - | (ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts deleted file mode 100644 index 7af369d..0000000 --- a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; - -export namespace InttraShippingInstructionMessagesApi { - export const list = ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - limit: number, - page?: number, - cursor?: string, - filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - filter: ZodExtended.parse( - InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - }, - }, - ); - }; - export const create = ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, - ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), - config, - ); - }; - export const getById = ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - messageId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - config, - ); - }; - export const update = ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - messageId: string, - data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts deleted file mode 100644 index 7942b4b..0000000 --- a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; -import { InttraShippingInstructionMessagesQueries } from "./inttraShippingInstructionMessages.queries"; -import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; - -export namespace InttraShippingInstructionMessagesConfigs { - export const messagesConfig = { - meta: { - title: "Messages", - }, - readAll: { - acl: InttraShippingInstructionMessagesAcl.canUseList, - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, - paginated: InttraShippingInstructionMessagesQueries.useList, - infinite: InttraShippingInstructionMessagesQueries.useListInfinite, - filters: { - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, - options: { - inputs: { - status: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, - options: { - columns: { - id: true, - createdAt: true, - updatedAt: true, - shippingInstructionsId: true, - positionId: true, - createdByUserId: true, - status: true, - fileName: true, - sftpPath: true, - sentAt: true, - uploadAttemptCount: true, - lastUploadError: true, - notes: true, - contrlStatus: true, - contrlReceivedAt: true, - contrlRaw: true, - aperakStatus: true, - aperakReceivedAt: true, - aperakRaw: true, - }, - }, - }), - }, - read: { - acl: InttraShippingInstructionMessagesAcl.canUseGetById, - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema, - query: InttraShippingInstructionMessagesQueries.useGetById, - }, - create: { - acl: InttraShippingInstructionMessagesAcl.canUseCreate, - schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, - mutation: InttraShippingInstructionMessagesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, - options: { - inputs: { - isAmendment: true, - }, - }, - }), - }, - update: { - acl: InttraShippingInstructionMessagesAcl.canUseUpdate, - schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, - mutation: InttraShippingInstructionMessagesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, - options: { - inputs: { - notes: true, - }, - }, - }), - }, - }; -} diff --git a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts deleted file mode 100644 index cf33dde..0000000 --- a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InttraShippingInstructionMessagesModels { - /** - * InttraShippingInstructionStatusEnumSchema - * @type { enum } - */ - export const InttraShippingInstructionStatusEnumSchema = z.enum([ - "PendingUpload", - "Uploaded", - "ContrlAccepted", - "ContrlRejected", - "AperakAccepted", - "AperakRejected", - "FailedUpload", - ]); - export type InttraShippingInstructionStatusEnum = z.infer; - export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStatusEnumSchema.enum; - - /** - * ShippingInstructionMessageListItemResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } shippingInstructionsId - * @property { string } positionId - * @property { string } createdByUserId - * @property { InttraShippingInstructionStatusEnum } status - * @property { string } fileName - * @property { string } sftpPath - * @property { string } sentAt - * @property { number } uploadAttemptCount - * @property { string } lastUploadError - * @property { string } notes - * @property { string } contrlStatus - * @property { string } contrlReceivedAt - * @property { string } contrlRaw - * @property { string } aperakStatus - * @property { string } aperakReceivedAt - * @property { string } aperakRaw - */ - export const ShippingInstructionMessageListItemResponseDtoSchema = z - .object({ - id: z.string(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - shippingInstructionsId: z.string(), - positionId: z.string(), - createdByUserId: z.string(), - status: InttraShippingInstructionStatusEnumSchema, - fileName: z.string(), - sftpPath: z.string(), - sentAt: z.iso.datetime({ offset: true }), - uploadAttemptCount: z.number(), - lastUploadError: z.string().nullish(), - notes: z.string().nullish(), - contrlStatus: z.string().nullish(), - contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), - contrlRaw: z.string().nullish(), - aperakStatus: z.string().nullish(), - aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), - aperakRaw: z.string().nullish(), - }) - .readonly(); - export type ShippingInstructionMessageListItemResponseDto = z.infer< - typeof ShippingInstructionMessageListItemResponseDtoSchema - >; - - /** - * ShippingInstructionMessageFilterDtoSchema - * @type { object } - * @property { InttraShippingInstructionStatusEnum[] } status - */ - export const ShippingInstructionMessageFilterDtoSchema = z - .object({ status: z.array(InttraShippingInstructionStatusEnumSchema).readonly() }) - .readonly(); - export type ShippingInstructionMessageFilterDto = z.infer; - - /** - * ShippingInstructionMessageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } shippingInstructionsId - * @property { string } positionId - * @property { string } createdByUserId - * @property { InttraShippingInstructionStatusEnum } status - * @property { object } shippingInstructionSnapshot - * @property { string } renderedRequestPayload - * @property { string } fileName - * @property { string } sftpPath - * @property { string } sentAt - * @property { number } uploadAttemptCount - * @property { string } lastUploadError - * @property { string } notes - * @property { string } contrlStatus - * @property { string } contrlReceivedAt - * @property { string } contrlRaw - * @property { string } aperakStatus - * @property { string } aperakReceivedAt - * @property { string } aperakRaw - */ - export const ShippingInstructionMessageResponseDtoSchema = z - .object({ - id: z.string(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - shippingInstructionsId: z.string(), - positionId: z.string(), - createdByUserId: z.string(), - status: InttraShippingInstructionStatusEnumSchema, - shippingInstructionSnapshot: z.object({}).readonly(), - renderedRequestPayload: z.string(), - fileName: z.string(), - sftpPath: z.string(), - sentAt: z.iso.datetime({ offset: true }), - uploadAttemptCount: z.number(), - lastUploadError: z.string().nullish(), - notes: z.string().nullish(), - contrlStatus: z.string().nullish(), - contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), - contrlRaw: z.string().nullish(), - aperakStatus: z.string().nullish(), - aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), - aperakRaw: z.string().nullish(), - }) - .readonly(); - export type ShippingInstructionMessageResponseDto = z.infer; - - /** - * UpdateShippingInstructionMessageRequestDtoSchema - * @type { object } - * @property { string } notes - */ - export const UpdateShippingInstructionMessageRequestDtoSchema = z.object({ notes: z.string() }).readonly(); - export type UpdateShippingInstructionMessageRequestDto = z.infer< - typeof UpdateShippingInstructionMessageRequestDtoSchema - >; - - /** - * CreateShippingInstructionMessageRequestDtoSchema - * @type { object } - * @property { boolean } isAmendment Default: `false` - */ - export const CreateShippingInstructionMessageRequestDtoSchema = z - .object({ isAmendment: z.boolean().default(false) }) - .readonly(); - export type CreateShippingInstructionMessageRequestDto = z.infer< - typeof CreateShippingInstructionMessageRequestDtoSchema - >; - - /** - * InttraShippingInstructionMessagesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ShippingInstructionMessageListItemResponseDto[] } items - */ - export const InttraShippingInstructionMessagesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ShippingInstructionMessageListItemResponseDtoSchema).readonly() }).readonly().shape, - }); - export type InttraShippingInstructionMessagesListResponse = z.infer< - typeof InttraShippingInstructionMessagesListResponseSchema - >; -} diff --git a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts b/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts deleted file mode 100644 index cd6ec39..0000000 --- a/test/generated/dist/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts +++ /dev/null @@ -1,315 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; -import { InttraShippingInstructionMessagesApi } from "./inttraShippingInstructionMessages.api"; - -export namespace InttraShippingInstructionMessagesQueries { - export const moduleName = QueryModule.InttraShippingInstructionMessages; - - export const keys = { - all: [moduleName] as const, - list: ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - limit?: number, - page?: number, - cursor?: string, - filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", - officeId, - positionId, - shippingInstructionsId, - limit, - page, - cursor, - filter, - ] as const, - listInfinite: ( - officeId: string, - positionId: string, - shippingInstructionsId: string, - limit?: number, - cursor?: string, - filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", - "infinite", - officeId, - positionId, - shippingInstructionsId, - limit, - cursor, - filter, - ] as const, - getById: (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages/:messageId", - officeId, - positionId, - shippingInstructionsId, - messageId, - ] as const, - }; - - /** - * Query `useList` - * @summary List Inttra shipping instruction messages for a position/BL instructions - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - positionId, - shippingInstructionsId, - limit, - page, - cursor, - filter, - }: { - officeId: string; - positionId: string; - shippingInstructionsId: string; - limit: number; - page?: number; - cursor?: string; - filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), - queryFn: () => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId })); - return InttraShippingInstructionMessagesApi.list( - officeId, - positionId, - shippingInstructionsId, - limit, - page, - cursor, - filter, - config, - ); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List Inttra shipping instruction messages for a position/BL instructions - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - officeId, - positionId, - shippingInstructionsId, - limit, - cursor, - filter, - }: { - officeId: string; - positionId: string; - shippingInstructionsId: string; - limit: number; - cursor?: string; - filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), - queryFn: ({ pageParam }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId })); - return InttraShippingInstructionMessagesApi.list( - officeId, - positionId, - shippingInstructionsId, - limit, - pageParam, - cursor, - filter, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create Inttra shipping instruction message - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.shippingInstructionsId Path parameter - * @param { InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof InttraShippingInstructionMessagesApi.create, - { - officeId: string; - positionId: string; - shippingInstructionsId: string; - data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId })); - return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetById` - * @summary Get Inttra shipping instruction message details - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { string } object.messageId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetById = ( - { - officeId, - positionId, - shippingInstructionsId, - messageId, - }: { officeId: string; positionId: string; shippingInstructionsId: string; messageId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), - queryFn: () => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId })); - return InttraShippingInstructionMessagesApi.getById( - officeId, - positionId, - shippingInstructionsId, - messageId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update Inttra shipping instruction message - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.shippingInstructionsId Path parameter - * @param { string } mutation.messageId Path parameter - * @param { InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof InttraShippingInstructionMessagesApi.update, - { - officeId: string; - positionId: string; - shippingInstructionsId: string; - messageId: string; - data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId })); - return InttraShippingInstructionMessagesApi.update( - officeId, - positionId, - shippingInstructionsId, - messageId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, shippingInstructionsId, messageId } = variables; - const updateKeys = [keys.getById(officeId, positionId, shippingInstructionsId, messageId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/invoicePayments/invoicePayments.acl.ts b/test/generated/dist/invoicePayments/invoicePayments.acl.ts deleted file mode 100644 index 6abcc9b..0000000 --- a/test/generated/dist/invoicePayments/invoicePayments.acl.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InvoicePaymentsAcl { - /** - * Use for `useListOfficePayments` query ability. For global ability, omit the object parameter. - * @description List office payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListOfficePayments` query - */ - export const canUseListOfficePayments = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useBulkCreatePayments` mutation ability. For global ability, omit the object parameter. - * @description Bulk create invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useBulkCreatePayments` mutation - */ - export const canUseBulkCreatePayments = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useCalculatePayments` mutation ability. For global ability, omit the object parameter. - * @description Calculate invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCalculatePayments` mutation - */ - export const canUseCalculatePayments = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useExportOfficePayments` mutation ability. For global ability, omit the object parameter. - * @description Export office invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportOfficePayments` mutation - */ - export const canUseExportOfficePayments = (object?: { officeId: string }) => - ["Export", object ? subject("InvoicePayment", object) : "InvoicePayment"] as AbilityTuple< - "Export", - "InvoicePayment" | (ForcedSubject<"InvoicePayment"> & { officeId: string }) - >; - - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetPaymentById` query ability. For global ability, omit the object parameter. - * @description Create invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPaymentById` query - */ - export const canUseGetPaymentById = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useDeleteInvoicePayment` mutation ability. For global ability, omit the object parameter. - * @description Delete invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoicePayment` mutation - */ - export const canUseDeleteInvoicePayment = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/invoicePayments/invoicePayments.api.ts b/test/generated/dist/invoicePayments/invoicePayments.api.ts deleted file mode 100644 index 820c5fd..0000000 --- a/test/generated/dist/invoicePayments/invoicePayments.api.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; - -export namespace InvoicePaymentsApi { - export const listOfficePayments = ( - officeId: string, - limit: number, - order?: string, - filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, - `/offices/${officeId}/payments`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const bulkCreatePayments = ( - officeId: string, - data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, - `/offices/${officeId}/payments`, - ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), - config, - ); - }; - export const calculatePayments = ( - officeId: string, - data: InvoicePaymentsModels.CalculatePaymentsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, - `/offices/${officeId}/payments/calculate`, - ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), - config, - ); - }; - export const exportOfficePayments = ( - officeId: string, - data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payments/exports`, - ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const list = ( - officeId: string, - invoiceId: string, - limit: number, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = ( - officeId: string, - invoiceId: string, - data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments`, - ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), - config, - ); - }; - export const getPaymentById = ( - officeId: string, - invoiceId: string, - paymentId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - config, - ); - }; - export const update = ( - officeId: string, - invoiceId: string, - paymentId: string, - data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), - config, - ); - }; - export const deleteInvoicePayment = ( - officeId: string, - invoiceId: string, - paymentId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/invoicePayments/invoicePayments.configs.ts b/test/generated/dist/invoicePayments/invoicePayments.configs.ts deleted file mode 100644 index a5d2a8d..0000000 --- a/test/generated/dist/invoicePayments/invoicePayments.configs.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; -import { InvoicePaymentsQueries } from "./invoicePayments.queries"; -import { InvoicePaymentsAcl } from "./invoicePayments.acl"; - -export namespace InvoicePaymentsConfigs { - export const paymentsConfig = { - meta: { - title: "Payments", - }, - readAll: { - acl: InvoicePaymentsAcl.canUseListOfficePayments, - schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, - paginated: InvoicePaymentsQueries.useListOfficePayments, - infinite: InvoicePaymentsQueries.useListOfficePaymentsInfinite, - filters: { - schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, - options: { - inputs: { - search: true, - paymentDate: true, - invoiceIssuingDate: true, - invoiceDirection: true, - createdBy: true, - businessPartner: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, - options: { - columns: { - id: true, - amount: true, - positionNumber: true, - currencyNotation: true, - paymentDate: true, - paymentMethod: true, - comment: true, - createdAt: true, - updatedAt: true, - createdBy: true, - invoice: true, - businessPartner: true, - }, - sortable: InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema, - }, - }), - }, - create: { - acl: InvoicePaymentsAcl.canUseBulkCreatePayments, - schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, - mutation: InvoicePaymentsQueries.useBulkCreatePayments, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, - options: { - inputs: { - paymentDate: true, - invoiceIds: true, - comment: true, - }, - }, - }), - }, - }; - - export const invoicesPaymentsConfig = { - meta: { - title: "Invoices Payments", - }, - readAll: { - acl: InvoicePaymentsAcl.canUseList, - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - paginated: InvoicePaymentsQueries.useList, - infinite: InvoicePaymentsQueries.useListInfinite, - columns: dynamicColumns({ - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - options: { - columns: { - id: true, - amount: true, - currencyNotation: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - bankAccount: true, - comment: true, - createdAt: true, - updatedAt: true, - createdBy: true, - }, - }, - }), - }, - read: { - acl: InvoicePaymentsAcl.canUseGetPaymentById, - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - query: InvoicePaymentsQueries.useGetPaymentById, - }, - create: { - acl: InvoicePaymentsAcl.canUseCreate, - schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, - mutation: InvoicePaymentsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, - options: { - inputs: { - amount: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - comment: true, - }, - }, - }), - }, - update: { - acl: InvoicePaymentsAcl.canUseUpdate, - schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, - mutation: InvoicePaymentsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, - options: { - inputs: { - amount: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - comment: true, - }, - }, - }), - }, - delete: { - acl: InvoicePaymentsAcl.canUseDeleteInvoicePayment, - mutation: InvoicePaymentsQueries.useDeleteInvoicePayment, - }, - }; -} diff --git a/test/generated/dist/invoicePayments/invoicePayments.models.ts b/test/generated/dist/invoicePayments/invoicePayments.models.ts deleted file mode 100644 index 02ad0be..0000000 --- a/test/generated/dist/invoicePayments/invoicePayments.models.ts +++ /dev/null @@ -1,470 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicePaymentsModels { - /** - * OfficePaymentTotalAmountsDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ - export const OfficePaymentTotalAmountsDtoSchema = z - .object({ amount: z.number(), currencyNotation: z.string() }) - .readonly(); - export type OfficePaymentTotalAmountsDto = z.infer; - - /** - * OfficePaymentListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { OfficePaymentTotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ - export const OfficePaymentListResponseDtoSchema = z - .object({ - items: z.array(z.string()).readonly().describe("Items"), - totalAmounts: z.array(OfficePaymentTotalAmountsDtoSchema).readonly(), - page: z.number().describe("1-indexed page number to begin from").nullish(), - cursor: z.string().describe("ID of item to start after").nullish(), - nextCursor: z.string().describe("Cursor for next set of items").nullish(), - limit: z.number().describe("Items per response"), - totalItems: z.number().describe("Total available items"), - }) - .readonly(); - export type OfficePaymentListResponseDto = z.infer; - - /** - * OfficePaymentPreviewInvoiceDtoSchema - * @type { object } - * @property { string } id - * @property { string } invoiceNumber - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection - * @property { number } grossAmount - * @property { CommonModels.InvoiceStatusEnum } status - * @property { string } paidOn - * @property { string } issuingDate - */ - export const OfficePaymentPreviewInvoiceDtoSchema = z - .object({ - id: z.string(), - invoiceNumber: z.string(), - invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, - grossAmount: z.number(), - status: CommonModels.InvoiceStatusEnumSchema, - paidOn: z.iso.datetime({ offset: true }).nullable(), - issuingDate: z.iso.datetime({ offset: true }).nullable(), - }) - .readonly(); - export type OfficePaymentPreviewInvoiceDto = z.infer; - - /** - * PaymentMethodEnumSchema - * @type { enum } - */ - export const PaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); - export type PaymentMethodEnum = z.infer; - export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; - - /** - * OfficePaymentPreviewCreatedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type OfficePaymentPreviewCreatedByDto = z.infer; - - /** - * OfficePaymentBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ - export const OfficePaymentBusinessPartnerDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), - }) - .readonly(); - export type OfficePaymentBusinessPartnerDto = z.infer; - - /** - * OfficePaymentPreviewDtoSchema - * @type { object } - * @property { string } id - * @property { number } amount - * @property { string } positionNumber - * @property { string } currencyNotation - * @property { string } paymentDate - * @property { PaymentMethodEnum } paymentMethod - * @property { string } comment - * @property { string } createdAt - * @property { string } updatedAt - * @property { OfficePaymentPreviewCreatedByDto } createdBy - * @property { OfficePaymentPreviewInvoiceDto } invoice - * @property { OfficePaymentBusinessPartnerDto } businessPartner - */ - export const OfficePaymentPreviewDtoSchema = z - .object({ - id: z.string(), - amount: z.number(), - positionNumber: z.string(), - currencyNotation: z.string(), - paymentDate: z.iso.datetime({ offset: true }), - paymentMethod: PaymentMethodEnumSchema, - comment: z.string().nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - createdBy: OfficePaymentPreviewCreatedByDtoSchema, - invoice: OfficePaymentPreviewInvoiceDtoSchema, - businessPartner: OfficePaymentBusinessPartnerDtoSchema.nullish(), - }) - .readonly(); - export type OfficePaymentPreviewDto = z.infer; - - /** - * OfficeInvoicePaymentFilterDtoSchema - * @type { object } - * @property { string } search Search by invoice number - * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range - * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction - * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) - * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) - */ - export const OfficeInvoicePaymentFilterDtoSchema = z - .object({ - search: z.string().describe("Search by invoice number"), - paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), - invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), - invoiceDirection: z - .array(CommonModels.InvoiceDirectionEnumSchema) - .readonly() - .describe("Filter by invoice direction"), - createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), - businessPartner: z - .array(z.string()) - .readonly() - .describe("Filter by invoice customer/business partner (array of UUIDs)"), - }) - .readonly(); - export type OfficeInvoicePaymentFilterDto = z.infer; - - /** - * BulkCreatePaymentBusinessPartnerDtoSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } name Business partner name - * @property { string } paymentDate Payment date applied to the partner invoices - */ - export const BulkCreatePaymentBusinessPartnerDtoSchema = z - .object({ - id: z.string().describe("Business partner ID"), - name: z.string().describe("Business partner name"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date applied to the partner invoices"), - }) - .readonly(); - export type BulkCreatePaymentBusinessPartnerDto = z.infer; - - /** - * BulkCreatePaymentsResponseDtoSchema - * @type { object } - * @property { BulkCreatePaymentBusinessPartnerDto[] } businessPartners List of business partners paid in this bulk operation - */ - export const BulkCreatePaymentsResponseDtoSchema = z - .object({ - businessPartners: z - .array(BulkCreatePaymentBusinessPartnerDtoSchema) - .readonly() - .describe("List of business partners paid in this bulk operation"), - }) - .readonly(); - export type BulkCreatePaymentsResponseDto = z.infer; - - /** - * CalculatePaymentItemDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } businessPartnerName - * @property { number } amount - * @property { string } currency - */ - export const CalculatePaymentItemDtoSchema = z - .object({ - businessPartnerId: z.string(), - businessPartnerName: z.string(), - amount: z.number(), - currency: z.string(), - }) - .readonly(); - export type CalculatePaymentItemDto = z.infer; - - /** - * CalculatePaymentTotalDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currency - */ - export const CalculatePaymentTotalDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); - export type CalculatePaymentTotalDto = z.infer; - - /** - * CalculatePaymentsResponseDtoSchema - * @type { object } - * @property { CalculatePaymentItemDto[] } payments - * @property { CalculatePaymentTotalDto[] } totals - */ - export const CalculatePaymentsResponseDtoSchema = z - .object({ - payments: z.array(CalculatePaymentItemDtoSchema).readonly(), - totals: z.array(CalculatePaymentTotalDtoSchema).readonly(), - }) - .readonly(); - export type CalculatePaymentsResponseDto = z.infer; - - /** - * OfficeInvoicePaymentExportFilterDtoSchema - * @type { object } - * @property { string } search Search by invoice number - * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range - * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction - * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) - * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) - */ - export const OfficeInvoicePaymentExportFilterDtoSchema = z - .object({ - search: z.string().describe("Search by invoice number"), - paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), - invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), - invoiceDirection: z - .array(CommonModels.InvoiceDirectionEnumSchema) - .readonly() - .describe("Filter by invoice direction"), - createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), - businessPartner: z - .array(z.string()) - .readonly() - .describe("Filter by invoice customer/business partner (array of UUIDs)"), - }) - .readonly(); - export type OfficeInvoicePaymentExportFilterDto = z.infer; - - /** - * OfficeInvoicePaymentExportColumnSchema - * @type { enum } - */ - export const OfficeInvoicePaymentExportColumnSchema = z.enum([ - "amount", - "currency", - "paymentDate", - "paymentMethod", - "comment", - "positionNumber", - "invoiceNumber", - "invoiceDirection", - "invoiceStatus", - "invoiceIssuingDate", - "invoiceGrossAmount", - "invoicePaidOn", - "businessPartnerName", - "createdByName", - ]); - export type OfficeInvoicePaymentExportColumn = z.infer; - export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumnSchema.enum; - - /** - * OfficeInvoicePaymentExportRequestDtoSchema - * @type { object } - * @property { OfficeInvoicePaymentExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { OfficeInvoicePaymentExportFilterDto } filter - */ - export const OfficeInvoicePaymentExportRequestDtoSchema = z - .object({ - columns: z.array(OfficeInvoicePaymentExportColumnSchema).readonly().min(1), - order: z.array(z.string()).readonly(), - filter: OfficeInvoicePaymentExportFilterDtoSchema, - }) - .readonly(); - export type OfficeInvoicePaymentExportRequestDto = z.infer; - - /** - * PaymentCreatedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PaymentCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type PaymentCreatedByDto = z.infer; - - /** - * PaymentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { number } amount - * @property { string } currencyNotation - * @property { string } paymentDate - * @property { PaymentMethodEnum } paymentMethod - * @property { string } bankAccountId - * @property { string } bankAccount - * @property { string } comment - * @property { string } createdAt - * @property { string } updatedAt - * @property { PaymentCreatedByDto } createdBy - */ - export const PaymentResponseDtoSchema = z - .object({ - id: z.string(), - amount: z.number(), - currencyNotation: z.string(), - paymentDate: z.iso.datetime({ offset: true }), - paymentMethod: PaymentMethodEnumSchema, - bankAccountId: z.string().nullish(), - bankAccount: z.string().nullish(), - comment: z.string().nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - createdBy: PaymentCreatedByDtoSchema.nullish(), - }) - .readonly(); - export type PaymentResponseDto = z.infer; - - /** - * PositionInvoicePaymentMethodEnumSchema - * @type { enum } - */ - export const PositionInvoicePaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); - export type PositionInvoicePaymentMethodEnum = z.infer; - export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnumSchema.enum; - - /** - * CreateInvoicePaymentRequestDtoSchema - * @type { object } - * @property { number } amount Payment amount - * @property { string } paymentDate Payment date - * @property { PositionInvoicePaymentMethodEnum } paymentMethod Payment method - * @property { string } bankAccountId Bank account ID - * @property { string } comment Optional comment - */ - export const CreateInvoicePaymentRequestDtoSchema = z - .object({ - amount: z.number().describe("Payment amount"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), - paymentMethod: PositionInvoicePaymentMethodEnumSchema.describe("Payment method"), - bankAccountId: z.string().describe("Bank account ID").nullish(), - comment: z.string().describe("Optional comment").nullish(), - }) - .readonly(); - export type CreateInvoicePaymentRequestDto = z.infer; - - /** - * UpdateInvoicePaymentRequestDtoSchema - * @type { object } - * @property { number } amount Payment amount. Minimum: `0.01` - * @property { string } paymentDate Payment date - * @property { string } paymentMethod Payment method - * @property { string } bankAccountId Bank account ID - * @property { string } comment Payment comment - */ - export const UpdateInvoicePaymentRequestDtoSchema = z - .object({ - amount: z.number().gte(0.01).describe("Payment amount"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), - paymentMethod: PaymentMethodEnumSchema.describe("Payment method"), - bankAccountId: z.string().describe("Bank account ID"), - comment: z.string().describe("Payment comment"), - }) - .readonly(); - export type UpdateInvoicePaymentRequestDto = z.infer; - - /** - * BulkCreatePaymentsRequestDtoSchema - * @type { object } - * @property { string } paymentDate Payment date for all payments - * @property { string[] } invoiceIds List of invoice IDs to create payments for. Min Items: `1` - * @property { string } comment - */ - export const BulkCreatePaymentsRequestDtoSchema = z - .object({ - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date for all payments"), - invoiceIds: z.array(z.string()).readonly().min(1).describe("List of invoice IDs to create payments for"), - comment: z.string().nullish(), - }) - .readonly(); - export type BulkCreatePaymentsRequestDto = z.infer; - - /** - * CalculatePaymentsRequestDtoSchema - * @type { object } - * @property { string[] } invoiceIds Invoice IDs (UUID v4). Min Items: `1`. Max Items: `30` - */ - export const CalculatePaymentsRequestDtoSchema = z - .object({ invoiceIds: z.array(z.string()).readonly().min(1).max(30).describe("Invoice IDs (UUID v4)") }) - .readonly(); - export type CalculatePaymentsRequestDto = z.infer; - - /** - * ListOfficePaymentsOrderParamEnumSchema - * @type { enum } - */ - export const ListOfficePaymentsOrderParamEnumSchema = z.enum([ - "paymentDate", - "amount", - "paymentMethod", - "comment", - "createdAt", - "updatedAt", - "currencyNotation", - "createdByName", - "invoiceNumber", - "invoiceDirection", - "invoiceGrossAmount", - "invoiceStatus", - "invoicePaidOn", - "invoiceIssuingDate", - ]); - export type ListOfficePaymentsOrderParamEnum = z.infer; - export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnumSchema.enum; - - /** - * ListOfficePaymentsResponseSchema - * @type { object } - * @property { OfficePaymentTotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficePaymentPreviewDto[] } items - */ - export const ListOfficePaymentsResponseSchema = z.object({ - ...OfficePaymentListResponseDtoSchema.shape, - ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).readonly() }).readonly().shape, - }); - export type ListOfficePaymentsResponse = z.infer; - - /** - * InvoicePaymentsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PaymentResponseDto[] } items - */ - export const InvoicePaymentsListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PaymentResponseDtoSchema).readonly() }).readonly().shape, - }); - export type InvoicePaymentsListResponse = z.infer; -} diff --git a/test/generated/dist/invoicePayments/invoicePayments.queries.ts b/test/generated/dist/invoicePayments/invoicePayments.queries.ts deleted file mode 100644 index 2616d8a..0000000 --- a/test/generated/dist/invoicePayments/invoicePayments.queries.ts +++ /dev/null @@ -1,467 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InvoicePaymentsAcl } from "./invoicePayments.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; -import { InvoicePaymentsApi } from "./invoicePayments.api"; - -export namespace InvoicePaymentsQueries { - export const moduleName = QueryModule.InvoicePayments; - - export const keys = { - all: [moduleName] as const, - listOfficePayments: ( - officeId: string, - limit?: number, - order?: string, - filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/payments", officeId, limit, order, filter, page, cursor] as const, - listOfficePaymentsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/payments", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, invoiceId: string, limit?: number, page?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/invoices/:invoiceId/payments", - officeId, - invoiceId, - limit, - page, - cursor, - ] as const, - listInfinite: (officeId: string, invoiceId: string, limit?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/invoices/:invoiceId/payments", - "infinite", - officeId, - invoiceId, - limit, - cursor, - ] as const, - getPaymentById: (officeId: string, invoiceId: string, paymentId: string) => - [ - ...keys.all, - "/offices/:officeId/invoices/:invoiceId/payments/:paymentId", - officeId, - invoiceId, - paymentId, - ] as const, - }; - - /** - * Query `useListOfficePayments` - * @summary List all payments for an office - * @permission Requires `canUseListOfficePayments` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` - * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListOfficePayments = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId })); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListOfficePaymentsInfinite - * @summary List all payments for an office - * @permission Requires `canUseListOfficePayments` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` - * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListOfficePaymentsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId })); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useBulkCreatePayments` - * @summary Bulk create payments for multiple invoices - * @permission Requires `canUseBulkCreatePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.BulkCreatePaymentsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useBulkCreatePayments = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.bulkCreatePayments, - { officeId: string; data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId })); - return InvoicePaymentsApi.bulkCreatePayments(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCalculatePayments` - * @summary Calculate grouped payments for provided invoices - * @permission Requires `canUseCalculatePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.CalculatePaymentsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useCalculatePayments = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.calculatePayments, - { officeId: string; data: InvoicePaymentsModels.CalculatePaymentsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId })); - return InvoicePaymentsApi.calculatePayments(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useExportOfficePayments` - recommended when file should not be cached - * @summary Export office invoice payments to Excel - * @permission Requires `canUseExportOfficePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportOfficePayments = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.exportOfficePayments, - { officeId: string; data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId })); - return InvoicePaymentsApi.exportOfficePayments(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useList` - * @summary List payments for an invoice - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - invoiceId, - limit, - page, - cursor, - }: { officeId: string; invoiceId: string; limit: number; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, invoiceId, limit, page, cursor), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseList({ officeId })); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List payments for an invoice - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { officeId, invoiceId, limit, cursor }: { officeId: string; invoiceId: string; limit: number; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicePaymentsAcl.canUseList({ officeId })); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create a payment for an invoice - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicePaymentsModels.CreateInvoicePaymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.create, - { officeId: string; invoiceId: string; data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId })); - return InvoicePaymentsApi.create(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetPaymentById` - * @summary Get a payment by ID - * @permission Requires `canUseGetPaymentById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { string } object.paymentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetPaymentById = ( - { officeId, invoiceId, paymentId }: { officeId: string; invoiceId: string; paymentId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId })); - return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update a payment - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.paymentId Path parameter - * @param { InvoicePaymentsModels.UpdateInvoicePaymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.update, - { - officeId: string; - invoiceId: string; - paymentId: string; - data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, paymentId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId })); - return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId, paymentId } = variables; - const updateKeys = [keys.getPaymentById(officeId, invoiceId, paymentId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteInvoicePayment` - * @summary Delete a payment - * @permission Requires `canUseDeleteInvoicePayment` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.paymentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteInvoicePayment = ( - options?: AppMutationOptions< - typeof InvoicePaymentsApi.deleteInvoicePayment, - { officeId: string; invoiceId: string; paymentId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, paymentId }) => { - checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId })); - return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/invoices/invoices.acl.ts b/test/generated/dist/invoices/invoices.acl.ts deleted file mode 100644 index c9eae2a..0000000 --- a/test/generated/dist/invoices/invoices.acl.ts +++ /dev/null @@ -1,375 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InvoicesAcl { - /** - * Use for `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download invoices as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation - */ - export const canUseGetInvoicesEml = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useFind` query ability. For global ability, omit the object parameter. - * @description List invoices for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query - */ - export const canUseFind = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useChangeIncomingCustomer` mutation ability. For global ability, omit the object parameter. - * @description PositionInvoice Fix - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useChangeIncomingCustomer` mutation - */ - export const canUseChangeIncomingCustomer = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useFindByOffice` query ability. For global ability, omit the object parameter. - * @description List invoices for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByOffice` query - */ - export const canUseFindByOffice = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useCreateDraft` mutation ability. For global ability, omit the object parameter. - * @description Create invoice for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDraft` mutation - */ - export const canUseCreateDraft = (object?: { officeId: string }) => - ["Create", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Create", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useExportInvoices` mutation ability. For global ability, omit the object parameter. - * @description Export invoices for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportInvoices` mutation - */ - export const canUseExportInvoices = (object?: { officeId: string }) => - ["Export", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Export", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useExportCharges` mutation ability. For global ability, omit the object parameter. - * @description Export invoice charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportCharges` mutation - */ - export const canUseExportCharges = (object?: { officeId: string }) => - ["Export", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Export", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetUnCharges` query ability. For global ability, omit the object parameter. - * @description List uninvoiced charges for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetUnCharges` query - */ - export const canUseGetUnCharges = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ - export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetOfficeUnCharges` query ability. For global ability, omit the object parameter. - * @description List uninvoiced charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetOfficeUnCharges` query - */ - export const canUseGetOfficeUnCharges = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useExportUnCharges` mutation ability. For global ability, omit the object parameter. - * @description Export uninvoiced charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportUnCharges` mutation - */ - export const canUseExportUnCharges = (object?: { officeId: string }) => - ["Export", object ? subject("UninvoicedCharge", object) : "UninvoicedCharge"] as AbilityTuple< - "Export", - "UninvoicedCharge" | (ForcedSubject<"UninvoicedCharge"> & { officeId: string }) - >; - - /** - * Use for `useCreateDirect` mutation ability. For global ability, omit the object parameter. - * @description Create direct invoice for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDirect` mutation - */ - export const canUseCreateDirect = (object?: { officeId: string }) => - ["CreateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "CreateDirectInvoice", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useAddChargeToDirect` mutation ability. For global ability, omit the object parameter. - * @description Add charge to direct invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddChargeToDirect` mutation - */ - export const canUseAddChargeToDirect = (object?: { officeId: string }) => - ["UpdateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "UpdateDirectInvoice", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useUpdateCharges` mutation ability. For global ability, omit the object parameter. - * @description Update invoice charges - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCharges` mutation - */ - export const canUseUpdateCharges = (object?: { officeId: string }) => - ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Update", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; - - /** - * Use for `useRemoveChargeFromDirect` mutation ability. For global ability, omit the object parameter. - * @description Remove charge from direct invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRemoveChargeFromDirect` mutation - */ - export const canUseRemoveChargeFromDirect = (object?: { officeId: string }) => - ["UpdateDirectInvoice", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "UpdateDirectInvoice", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetDetail` query ability. For global ability, omit the object parameter. - * @description Read invoice details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDetail` query - */ - export const canUseGetDetail = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useDeleteInvoice` mutation ability. For global ability, omit the object parameter. - * @description Delete invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoice` mutation - */ - export const canUseDeleteInvoice = (object?: { officeId: string }) => - ["Delete", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Delete", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useFix` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice accounting issues - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFix` mutation - */ - export const canUseFix = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ - export const canUseGenerate = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useUpdateIssuedVatRules` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice VAT rules - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedVatRules` mutation - */ - export const canUseUpdateIssuedVatRules = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useUpdateIssuedCharges` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice charges - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedCharges` mutation - */ - export const canUseUpdateIssuedCharges = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useIssue` mutation ability. For global ability, omit the object parameter. - * @description Issue invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssue` mutation - */ - export const canUseIssue = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useReportHungarian` mutation ability. For global ability, omit the object parameter. - * @description Report invoice to Hungarian tax authority - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReportHungarian` mutation - */ - export const canUseReportHungarian = (object?: { officeId: string }) => - ["Fix", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Fix", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGenerateIncoming` mutation ability. For global ability, omit the object parameter. - * @description Generate incoming invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIncoming` mutation - */ - export const canUseGenerateIncoming = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useRegister` mutation ability. For global ability, omit the object parameter. - * @description Register invoice for bookkeeping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRegister` mutation - */ - export const canUseRegister = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetPreview` query or `useGetPreviewMutation` mutation ability. For global ability, omit the object parameter. - * @description View invoice preview - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` query or `useGetPreviewMutation` mutation - */ - export const canUseGetPreview = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download invoice as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation - */ - export const canUseGetInvoiceEml = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `usePrepareDocumentUpload` mutation ability. For global ability, omit the object parameter. - * @description Upload invoice document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareDocumentUpload` mutation - */ - export const canUsePrepareDocumentUpload = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ - export const canUseCancel = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useIssueCreditNote` mutation ability. For global ability, omit the object parameter. - * @description Issue credit note invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueCreditNote` mutation - */ - export const canUseIssueCreditNote = (object?: { officeId: string }) => - ["Update", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Update", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/invoices/invoices.api.ts b/test/generated/dist/invoices/invoices.api.ts deleted file mode 100644 index e861953..0000000 --- a/test/generated/dist/invoices/invoices.api.ts +++ /dev/null @@ -1,507 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicesApi { - export const getInvoicesEml = ( - officeId: string, - invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/eml`, { - ...config, - params: { - invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { - type: "query", - name: "invoiceIds", - }), - }, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }); - }; - export const find = ( - officeId: string, - positionId: string, - limit: number, - order?: string, - filter?: InvoicesModels.InvoiceFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoicesFindResponseSchema }, - `/offices/${officeId}/positions/${positionId}/invoices`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const changeIncomingCustomer = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.ChangeInvoiceCustomerRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/customer`, - ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), - config, - ); - }; - export const findByOffice = ( - officeId: string, - limit: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.FindByOfficeResponseSchema }, - `/offices/${officeId}/invoices`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const createDraft = ( - officeId: string, - data: InvoicesModels.CreateDraftInvoiceRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices`, - ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), - config, - ); - }; - export const exportInvoices = ( - officeId: string, - data: InvoicesModels.InvoiceExportRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/exports`, - ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const exportCharges = ( - officeId: string, - data: InvoicesModels.InvoiceExportRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/charges/exports`, - ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const getUnCharges = ( - officeId: string, - positionId: string, - limit: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargePaginationDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.GetUnChargesResponseSchema }, - `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const listAvailablePartnersFor = ( - officeId: string, - invoiceId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/invoices/${invoiceId}/available-partners`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { - type: "query", - name: "useCase", - }), - }, - }, - ); - }; - export const getOfficeUnCharges = ( - officeId: string, - limit: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargesFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, - `/offices/${officeId}/uninvoiced-charges`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const exportUnCharges = ( - officeId: string, - data: InvoicesModels.UninvoicedChargesExportRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/uninvoiced-charges/exports`, - ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const createDirect = (officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/offices/${officeId}/direct-invoices`, undefined, config); - }; - export const addChargeToDirect = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges`, - ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), - config, - ); - }; - export const updateCharges = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.UpdateInvoiceChargesRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges`, - ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), - config, - ); - }; - export const removeChargeFromDirect = ( - officeId: string, - invoiceId: string, - chargeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, - undefined, - config, - ); - }; - export const getDetail = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}`, - config, - ); - }; - export const update = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.UpdateInvoiceRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}`, - ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), - config, - ); - }; - export const deleteInvoice = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}`, - undefined, - config, - ); - }; - export const fix = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.FixInvoiceRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix`, - ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), - config, - ); - }; - export const generate = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/document`, - undefined, - config, - ); - }; - export const updateIssuedVatRules = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, - ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), - config, - ); - }; - export const updateIssuedCharges = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, - ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), - config, - ); - }; - export const issue = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/issue`, - undefined, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const reportHungarian = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, - undefined, - config, - ); - }; - export const generateIncoming = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, - undefined, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const register = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/register`, - undefined, - config, - ); - }; - export const getPreview = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/preview`, { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }); - }; - export const getInvoiceEml = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: z.instanceof(Blob) }, `/offices/${officeId}/invoices/${invoiceId}/eml`, { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }); - }; - export const prepareDocumentUpload = ( - officeId: string, - invoiceId: string, - data: InvoicesModels.PrepareUploadRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/upload-document`, - ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), - config, - ); - }; - export const cancel = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/cancel`, - undefined, - config, - ); - }; - export const issueCreditNote = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/invoices/invoices.configs.ts b/test/generated/dist/invoices/invoices.configs.ts deleted file mode 100644 index ced8ba2..0000000 --- a/test/generated/dist/invoices/invoices.configs.ts +++ /dev/null @@ -1,321 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { InvoicesQueries } from "./invoices.queries"; -import { InvoicesAcl } from "./invoices.acl"; - -export namespace InvoicesConfigs { - export const invoicesConfig = { - meta: { - title: "Invoices", - }, - readAll: { - acl: InvoicesAcl.canUseFindByOffice, - schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, - paginated: InvoicesQueries.useFindByOffice, - infinite: InvoicesQueries.useFindByOfficeInfinite, - filters: { - schema: CommonModels.OfficeInvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CommonModels.OfficeInvoiceFilterDtoSchema, - options: { - inputs: { - search: true, - issuingDate: true, - serviceDate: true, - invoiceDirection: true, - invoiceType: true, - collective: true, - amountMin: true, - amountMax: true, - currencyNotation: true, - vatRule: true, - dueDate: true, - status: true, - receiver: true, - receiverCountry: true, - salesRep: true, - positionNumbersString: true, - positionNumbers: true, - invoiceNumbersString: true, - invoiceNumbers: true, - bookkeepingExportStatus: true, - dunningBlock: true, - invoiceInReview: true, - isInvoiceOk: true, - isVatOk: true, - invoiceNumberMin: true, - invoiceNumberMax: true, - internalNumberMin: true, - internalNumberMax: true, - externalSystemId: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - creditorId: true, - debtorId: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, - options: { - columns: { - id: true, - createdAt: true, - invoiceNumber: true, - invoiceDirection: true, - issuingDate: true, - invoiceType: true, - collective: true, - serviceDate: true, - internalNumber: true, - reference: true, - amount: true, - netAmount: true, - tax: true, - currency: true, - dueDate: true, - status: true, - payDate: true, - paidAmount: true, - position: true, - receiver: true, - receiverCountry: true, - clerk: true, - cancelled: true, - ok: true, - isExportedToBookkeeping: true, - dunningBlock: true, - invoiceInReview: true, - vatOk: true, - comments: true, - paymentComment: true, - creditorId: true, - debtorId: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vatRules: true, - }, - sortable: InvoicesModels.FindByOfficeOrderParamEnumSchema, - }, - }), - }, - read: { - acl: InvoicesAcl.canUseGetDetail, - schema: InvoicesModels.InvoiceDetailDtoSchema, - query: InvoicesQueries.useGetDetail, - }, - create: { - acl: InvoicesAcl.canUseCreateDraft, - schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, - mutation: InvoicesQueries.useCreateDraft, - inputDefs: dynamicInputs({ - schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, - options: { - inputs: { - chargeItemIds: true, - invoiceType: true, - customerId: true, - direction: true, - }, - }, - }), - }, - update: { - acl: InvoicesAcl.canUseUpdate, - schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, - mutation: InvoicesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, - options: { - inputs: { - issuingDate: true, - receiptDate: true, - serviceDate: true, - serviceDateUntil: true, - dueDate: true, - invoiceNumber: true, - internalNumber: true, - paymentTermDays: true, - paymentTermType: true, - serviceRecipientId: true, - bankAccountId: true, - remarks: true, - language: true, - showPaymentInstructions: true, - customer: true, - salesRepId: true, - currencyNotation: true, - exchangeRate: true, - }, - }, - }), - }, - delete: { - acl: InvoicesAcl.canUseDeleteInvoice, - mutation: InvoicesQueries.useDeleteInvoice, - }, - }; - - export const uninvoicedChargesConfig = { - meta: { - title: "Uninvoiced Charges", - }, - readAll: { - acl: InvoicesAcl.canUseGetOfficeUnCharges, - schema: InvoicesModels.UninvoicedChargeDtoSchema, - paginated: InvoicesQueries.useGetOfficeUnCharges, - infinite: InvoicesQueries.useGetOfficeUnChargesInfinite, - filters: { - schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, - options: { - inputs: { - direction: true, - chargeItemId: true, - receiverIds: true, - positionIds: true, - chargeTypeIds: true, - serviceDate: true, - currencies: true, - vatRuleIds: true, - employeeIds: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: InvoicesModels.UninvoicedChargeDtoSchema, - options: { - columns: { - chargeItemId: true, - invoiceDirection: true, - receiver: true, - position: true, - chargeType: true, - currencyNotation: true, - amount: true, - amountInOfficeCurrency: true, - officeCurrency: true, - exchangeRate: true, - vatRule: true, - serviceDate: true, - status: true, - missingInformation: true, - employee: true, - }, - sortable: InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema, - }, - }), - }, - }; - - export const positionsInvoicesConfig = { - meta: { - title: "Positions Invoices", - }, - readAll: { - acl: InvoicesAcl.canUseFind, - schema: InvoicesModels.InvoicePreviewDtoSchema, - paginated: InvoicesQueries.useFind, - infinite: InvoicesQueries.useFindInfinite, - filters: { - schema: InvoicesModels.InvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.InvoiceFilterDtoSchema, - options: { - inputs: { - status: true, - direction: true, - receiver: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: InvoicesModels.InvoicePreviewDtoSchema, - options: { - columns: { - id: true, - invoiceDirection: true, - invoiceType: true, - invoiceNumber: true, - issuingDate: true, - amount: true, - currencyNotation: true, - status: true, - isExportedToBookkeeping: true, - internalNumber: true, - receiver: true, - representative: true, - collective: true, - creditNote: true, - cancelledInvoice: true, - }, - sortable: InvoicesModels.InvoicesFindOrderParamEnumSchema, - }, - }), - }, - }; - - export const positionsUninvoicedChargesConfig = { - meta: { - title: "Positions Uninvoiced Charges", - }, - readAll: { - acl: InvoicesAcl.canUseGetUnCharges, - schema: InvoicesModels.UninvoicedChargeDtoSchema, - paginated: InvoicesQueries.useGetUnCharges, - infinite: InvoicesQueries.useGetUnChargesInfinite, - filters: { - schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, - options: { - inputs: { - direction: true, - chargeItemId: true, - receiverId: true, - chargeTypeId: true, - serviceDate: true, - currency: true, - vatRuleId: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: InvoicesModels.UninvoicedChargeDtoSchema, - options: { - columns: { - chargeItemId: true, - invoiceDirection: true, - receiver: true, - position: true, - chargeType: true, - currencyNotation: true, - amount: true, - amountInOfficeCurrency: true, - officeCurrency: true, - exchangeRate: true, - vatRule: true, - serviceDate: true, - status: true, - missingInformation: true, - employee: true, - }, - sortable: InvoicesModels.GetUnChargesOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/invoices/invoices.models.ts b/test/generated/dist/invoices/invoices.models.ts deleted file mode 100644 index 6d1207e..0000000 --- a/test/generated/dist/invoices/invoices.models.ts +++ /dev/null @@ -1,1605 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicesModels { - /** - * InvoiceBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - */ - export const InvoiceBusinessPartnerResponseDtoSchema = z - .object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }) - .readonly(); - export type InvoiceBusinessPartnerResponseDto = z.infer; - - /** - * InvoiceEmployeeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const InvoiceEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type InvoiceEmployeeResponseDto = z.infer; - - /** - * InvoiceRelatedInvoiceResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } internalNumber - */ - export const InvoiceRelatedInvoiceResponseDtoSchema = z - .object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }) - .readonly(); - export type InvoiceRelatedInvoiceResponseDto = z.infer; - - /** - * InvoicePreviewDtoSchema - * @type { object } - * @property { string } id - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection - * @property { CommonModels.InvoiceTypeEnum } invoiceType - * @property { string } invoiceNumber - * @property { string } issuingDate - * @property { number } amount - * @property { string } currencyNotation - * @property { CommonModels.InvoiceStatusEnum } status - * @property { boolean } isExportedToBookkeeping - * @property { string } internalNumber - * @property { InvoiceBusinessPartnerResponseDto } receiver - * @property { InvoiceEmployeeResponseDto } representative - * @property { boolean } collective - * @property { InvoiceRelatedInvoiceResponseDto } creditNote - * @property { InvoiceRelatedInvoiceResponseDto } cancelledInvoice - */ - export const InvoicePreviewDtoSchema = z - .object({ - id: z.string(), - invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, - invoiceType: CommonModels.InvoiceTypeEnumSchema, - invoiceNumber: z.string().nullable(), - issuingDate: z.iso.datetime({ offset: true }).nullish(), - amount: z.number(), - currencyNotation: z.string(), - status: CommonModels.InvoiceStatusEnumSchema, - isExportedToBookkeeping: z.boolean(), - internalNumber: z.string().nullish(), - receiver: InvoiceBusinessPartnerResponseDtoSchema.nullish(), - representative: InvoiceEmployeeResponseDtoSchema.nullish(), - collective: z.boolean(), - creditNote: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), - cancelledInvoice: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), - }) - .readonly(); - export type InvoicePreviewDto = z.infer; - - /** - * InvoicePartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ - export const InvoicePartnerDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), - }) - .readonly(); - export type InvoicePartnerDto = z.infer; - - /** - * InvoicePositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } transportType - * @property { string } ourReference - * @property { string } finalDestination - * @property { InvoicePartnerDto } shipper - * @property { InvoicePartnerDto } consignee - * @property { string } vessel - * @property { string } emptyPickup - * @property { string } loadingAddress - * @property { string } portOfLoading - * @property { string } portOfDischarge - * @property { string } carrierBl - * @property { string } houseBillOfLadingNumber - * @property { string } masterAWB - * @property { string } hawbNumber - * @property { string } flightNo - * @property { string } pickupAddress - * @property { string } originAirport - * @property { string } destinationAirport - * @property { string } originLocation - * @property { string } destinationLocation - * @property { string } dateOfDeparture - * @property { string } dateOfArrival - */ - export const InvoicePositionDtoSchema = z - .object({ - id: z.string(), - number: z.string(), - transportType: z.string(), - ourReference: z.string().nullish(), - finalDestination: z.string().nullish(), - shipper: InvoicePartnerDtoSchema.nullish(), - consignee: InvoicePartnerDtoSchema.nullish(), - vessel: z.string().nullish(), - emptyPickup: z.string().nullish(), - loadingAddress: z.string().nullish(), - portOfLoading: z.string().nullish(), - portOfDischarge: z.string().nullish(), - carrierBl: z.string().nullish(), - houseBillOfLadingNumber: z.string().nullish(), - masterAWB: z.string().nullish(), - hawbNumber: z.string().nullish(), - flightNo: z.string().nullish(), - pickupAddress: z.string().nullish(), - originAirport: z.string().nullish(), - destinationAirport: z.string().nullish(), - originLocation: z.string().nullish(), - destinationLocation: z.string().nullish(), - dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), - dateOfArrival: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type InvoicePositionDto = z.infer; - - /** - * InvoiceChargeTypeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type InvoiceChargeTypeDto = z.infer; - - /** - * InvoiceVatRuleDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { number } rate - */ - export const InvoiceVatRuleDtoSchema = z - .object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }) - .readonly(); - export type InvoiceVatRuleDto = z.infer; - - /** - * InvoiceFinanceLineDtoSchema - * @type { object } - * @property { string } positionChargeItemId - * @property { InvoiceChargeTypeDto } chargeType - * @property { string } additionalText - * @property { number } quantity - * @property { number } netAmount - * @property { number } grossAmount - * @property { number } sumInInvoiceCurrency - * @property { number } sumInOfficeCurrency - * @property { string } currencyNotation - * @property { number } exchangeRate - * @property { InvoiceVatRuleDto } vatRule - * @property { number } exchangedNetAmount - * @property { string } positionNumber - * @property { string } positionId - * @property { string } outgoingInvoiceId - * @property { string } registeredInvoiceId - */ - export const InvoiceFinanceLineDtoSchema = z - .object({ - positionChargeItemId: z.string(), - chargeType: InvoiceChargeTypeDtoSchema, - additionalText: z.string(), - quantity: z.number(), - netAmount: z.number(), - grossAmount: z.number(), - sumInInvoiceCurrency: z.number().nullish(), - sumInOfficeCurrency: z.number().nullish(), - currencyNotation: z.string(), - exchangeRate: z.number().nullish(), - vatRule: InvoiceVatRuleDtoSchema, - exchangedNetAmount: z.number().nullish(), - positionNumber: z.string().nullish(), - positionId: z.string().nullish(), - outgoingInvoiceId: z.string().nullish(), - registeredInvoiceId: z.string().nullish(), - }) - .readonly(); - export type InvoiceFinanceLineDto = z.infer; - - /** - * InvoiceConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl - * @property { string } headerImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ - export const InvoiceConfigDtoSchema = z - .object({ - footerImageUrl: z.string().nullish(), - headerImageUrl: z.string().nullish(), - showWatermarkOnDocuments: z.boolean(), - locale: CommonModels.LocaleEnumSchema.nullish(), - }) - .readonly(); - export type InvoiceConfigDto = z.infer; - - /** - * InvoiceCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { string } address - * @property { string } vatNumber - * @property { string } reference - * @property { string } contact - * @property { string } partnerRegistrationNumber - */ - export const InvoiceCustomerDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string().nullish(), - label: z.string().nullish(), - address: z.string().nullish(), - vatNumber: z.string(), - reference: z.string().nullish(), - contact: z.string().nullish(), - partnerRegistrationNumber: z.string().nullish(), - }) - .readonly(); - export type InvoiceCustomerDto = z.infer; - - /** - * InvoiceOfficeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type InvoiceOfficeDto = z.infer; - - /** - * InvoiceSalesRepDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } phoneNumber - */ - export const InvoiceSalesRepDtoSchema = z - .object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }) - .readonly(); - export type InvoiceSalesRepDto = z.infer; - - /** - * InvoiceServiceRecipientDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } address - * @property { string } vatNumber - * @property { string } partnerRegistrationNumber - */ - export const InvoiceServiceRecipientDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - address: z.string().nullish(), - vatNumber: z.string(), - partnerRegistrationNumber: z.string().nullish(), - }) - .readonly(); - export type InvoiceServiceRecipientDto = z.infer; - - /** - * InvoiceBankAccountDtoSchema - * @type { object } - * @property { string } id - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - * @property { string } name - * @property { boolean } useFooterOnInvoice - * @property { object } footer - * @property { string } footer.mediaUrl - */ - export const InvoiceBankAccountDtoSchema = z - .object({ - id: z.string(), - displayValue: z.string(), - iban: z.string(), - bankName: z.string(), - swiftBic: z.string(), - name: z.string(), - useFooterOnInvoice: z.boolean(), - footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), - }) - .readonly(); - export type InvoiceBankAccountDto = z.infer; - - /** - * InvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ - export const InvoiceRemarksDtoSchema = z - .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) - .readonly(); - export type InvoiceRemarksDto = z.infer; - - /** - * InvoiceVatLineDtoSchema - * @type { object } - * @property { string } vatRuleId ID of the VAT rule - * @property { string } name Name of the VAT rule - * @property { string } printNumber Reference numerical string for vat rules - * @property { string } matchCode Match code of the VAT rule - * @property { number } vatPercentage The actual VAT rate (e.g., 19 for 19%) - * @property { number } netAmount Sum of net amounts from financeLines using this vatRuleId - * @property { number } vatAmount Calculated total VAT for this rate (netAmount * vatPercentage / 100) - * @property { number } grossAmount Sum of netAmount + vatAmount for this rate - * @property { number } vatAmountInOfficeCurrency - * @property { number } netAmountInOfficeCurrency - * @property { number } grossAmountInOfficeCurrency - */ - export const InvoiceVatLineDtoSchema = z - .object({ - vatRuleId: z.string().describe("ID of the VAT rule"), - name: z.string().describe("Name of the VAT rule"), - printNumber: z.string().describe("Reference numerical string for vat rules"), - matchCode: z.string().describe("Match code of the VAT rule"), - vatPercentage: z.number().describe("The actual VAT rate (e.g., 19 for 19%)"), - netAmount: z.number().describe("Sum of net amounts from financeLines using this vatRuleId"), - vatAmount: z.number().describe("Calculated total VAT for this rate (netAmount * vatPercentage / 100)"), - grossAmount: z.number().describe("Sum of netAmount + vatAmount for this rate"), - vatAmountInOfficeCurrency: z.number().nullish(), - netAmountInOfficeCurrency: z.number().nullish(), - grossAmountInOfficeCurrency: z.number().nullish(), - }) - .readonly(); - export type InvoiceVatLineDto = z.infer; - - /** - * RelatedInvoiceDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } internalNumber - */ - export const RelatedInvoiceDetailDtoSchema = z - .object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }) - .readonly(); - export type RelatedInvoiceDetailDto = z.infer; - - /** - * InvoiceLanguageEnumSchema - * @type { enum } - */ - export const InvoiceLanguageEnumSchema = z.enum(["en", "de", "sl", "hu", "cs"]); - export type InvoiceLanguageEnum = z.infer; - export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; - - /** - * InvoiceDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } rootFolderId - * @property { string } invoiceDirection - * @property { string } invoiceType - * @property { string } invoiceNumber - * @property { string } costCenter - * @property { string } status - * @property { string } language - * @property { boolean } isVatOk - * @property { boolean } isInvoiceOk - * @property { string } issuingDate - * @property { string } receiptDate - * @property { string } serviceDate - * @property { string } serviceDateUntil - * @property { string } dueDate - * @property { string } internalNumber - * @property { boolean } isExportedToBookkeeping - * @property { string } sentAt - * @property { string } creditNoteId - * @property { string } draftCreditNoteId - * @property { string } cancelledInvoiceId - * @property { string } uploadedDocumentUrl - * @property { InvoiceCustomerDto } customer - * @property { string } customerNumber - * @property { string } customerNameOverride - * @property { string } customerReferenceOverride - * @property { string } customerContactOverride - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { InvoicePositionDto } position - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { InvoiceOfficeDto } salesOffice - * @property { InvoiceSalesRepDto } salesRep - * @property { number } totalNet - * @property { number } totalVat - * @property { number } totalGross - * @property { string } currencyNotation - * @property { number } exchangeRate - * @property { number } paymentTermDays - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { InvoiceServiceRecipientDto } serviceRecipient - * @property { boolean } showPaymentInstructions - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { string } comments - * @property { InvoiceBankAccountDto } bankAccount - * @property { InvoiceFinanceLineDto[] } financeLines - * @property { InvoiceRemarksDto } remarks - * @property { InvoiceVatLineDto[] } vatLines - * @property { InvoiceConfigDto } config - * @property { RelatedInvoiceDetailDto } creditNote - * @property { RelatedInvoiceDetailDto } draftCreditNote - * @property { RelatedInvoiceDetailDto } cancelledInvoice - * @property { string } officeCurrencyNotation - * @property { string } inverseCurrencyNotation - * @property { number } inverseExchangeRate - * @property { boolean } requiresSpecialTablePresentation - * @property { number } paidAmount - * @property { number } outstandingAmount - * @property { string } paidOn - * @property { boolean } isIssued - * @property { number } grossAmountInOfficeCurrency - * @property { string } createdAt - */ - export const InvoiceDetailDtoSchema = z - .object({ - id: z.string(), - rootFolderId: z.string().nullish(), - invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, - invoiceType: CommonModels.InvoiceTypeEnumSchema, - invoiceNumber: z.string().nullish(), - costCenter: z.string().nullish(), - status: CommonModels.InvoiceStatusEnumSchema, - language: InvoiceLanguageEnumSchema, - isVatOk: z.boolean(), - isInvoiceOk: z.boolean(), - issuingDate: z.iso.datetime({ offset: true }).nullish(), - receiptDate: z.iso.datetime({ offset: true }).nullish(), - serviceDate: z.iso.datetime({ offset: true }).nullish(), - serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), - dueDate: z.iso.datetime({ offset: true }).nullish(), - internalNumber: z.string().nullish(), - isExportedToBookkeeping: z.boolean(), - sentAt: z.iso.datetime({ offset: true }).nullish(), - creditNoteId: z.string().nullish(), - draftCreditNoteId: z.string().nullish(), - cancelledInvoiceId: z.string().nullish(), - uploadedDocumentUrl: z.string().nullish(), - customer: InvoiceCustomerDtoSchema.nullish(), - customerNumber: z.string().nullish(), - customerNameOverride: z.string().nullish(), - customerReferenceOverride: z.string().nullish(), - customerContactOverride: z.string().nullish(), - showInvoiceVatLinesInOfficeCurrency: z.boolean(), - position: InvoicePositionDtoSchema.nullish(), - serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), - salesOffice: InvoiceOfficeDtoSchema, - salesRep: InvoiceSalesRepDtoSchema, - totalNet: z.number(), - totalVat: z.number().nullish(), - totalGross: z.number(), - currencyNotation: z.string(), - exchangeRate: z.number().nullish(), - paymentTermDays: z.number().nullish(), - paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), - serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), - showPaymentInstructions: z.boolean().nullish(), - dunningBlock: z.boolean().nullish(), - invoiceInReview: z.boolean().nullish(), - comments: z.string().nullish(), - bankAccount: InvoiceBankAccountDtoSchema.nullish(), - financeLines: z.array(InvoiceFinanceLineDtoSchema).readonly(), - remarks: InvoiceRemarksDtoSchema.nullish(), - vatLines: z.array(InvoiceVatLineDtoSchema).readonly(), - config: InvoiceConfigDtoSchema.nullish(), - creditNote: RelatedInvoiceDetailDtoSchema.nullish(), - draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), - cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), - officeCurrencyNotation: z.string().nullish(), - inverseCurrencyNotation: z.string().nullish(), - inverseExchangeRate: z.number().nullish(), - requiresSpecialTablePresentation: z.boolean().nullish(), - paidAmount: z.number(), - outstandingAmount: z.number(), - paidOn: z.iso.datetime({ offset: true }).nullish(), - isIssued: z.boolean(), - grossAmountInOfficeCurrency: z.number().nullish(), - createdAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type InvoiceDetailDto = z.infer; - - /** - * TotalAmountsDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ - export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); - export type TotalAmountsDto = z.infer; - - /** - * OfficeInvoiceListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalAmountInDefaultCurrency - * @property { string } defaultCurrencyNotation - * @property { TotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ - export const OfficeInvoiceListResponseDtoSchema = z - .object({ - items: z.array(z.string()).readonly().describe("Items"), - totalAmountInDefaultCurrency: z.number().nullish(), - defaultCurrencyNotation: z.string().nullish(), - totalAmounts: z.array(TotalAmountsDtoSchema).readonly(), - page: z.number().describe("1-indexed page number to begin from").nullish(), - cursor: z.string().describe("ID of item to start after").nullish(), - nextCursor: z.string().describe("Cursor for next set of items").nullish(), - limit: z.number().describe("Items per response"), - totalItems: z.number().describe("Total available items"), - }) - .readonly(); - export type OfficeInvoiceListResponseDto = z.infer; - - /** - * InvoicePreviewPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } externalSystemId - */ - export const InvoicePreviewPositionDtoSchema = z - .object({ id: z.string(), number: z.string(), externalSystemId: z.string().nullish() }) - .readonly(); - export type InvoicePreviewPositionDto = z.infer; - - /** - * InvoicePreviewReceiverDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - */ - export const InvoicePreviewReceiverDtoSchema = z - .object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }) - .readonly(); - export type InvoicePreviewReceiverDto = z.infer; - - /** - * InvoicePreviewReceiverCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const InvoicePreviewReceiverCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type InvoicePreviewReceiverCountryDto = z.infer; - - /** - * InvoicePreviewClerkDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const InvoicePreviewClerkDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type InvoicePreviewClerkDto = z.infer; - - /** - * VatRuleLabelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } matchCode - * @property { string } name - */ - export const VatRuleLabelResponseDtoSchema = z - .object({ id: z.string(), matchCode: z.string(), name: z.string() }) - .readonly(); - export type VatRuleLabelResponseDto = z.infer; - - /** - * OfficeInvoicePreviewDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } invoiceNumber - * @property { string } invoiceDirection - * @property { string } issuingDate - * @property { CommonModels.InvoiceTypeEnum } invoiceType - * @property { boolean } collective - * @property { string } serviceDate - * @property { string } internalNumber - * @property { string } reference - * @property { number } amount - * @property { number } netAmount - * @property { number } tax - * @property { string } currency - * @property { string } dueDate - * @property { CommonModels.InvoiceStatusEnum } status - * @property { string } payDate - * @property { number } paidAmount - * @property { InvoicePreviewPositionDto } position - * @property { InvoicePreviewReceiverDto } receiver - * @property { InvoicePreviewReceiverCountryDto } receiverCountry - * @property { InvoicePreviewClerkDto } clerk - * @property { boolean } cancelled - * @property { boolean } ok - * @property { boolean } isExportedToBookkeeping - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { boolean } vatOk - * @property { string } comments - * @property { string } paymentComment - * @property { string } creditorId - * @property { string } debtorId - * @property { string } hblNumber - * @property { string } mblNumber - * @property { string } bookingNumber - * @property { string } vessel - * @property { string } voyage - * @property { VatRuleLabelResponseDto[] } vatRules - */ - export const OfficeInvoicePreviewDtoSchema = z - .object({ - id: z.string(), - createdAt: z.iso.datetime({ offset: true }), - invoiceNumber: z.string().nullish(), - invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, - issuingDate: z.iso.datetime({ offset: true }).nullish(), - invoiceType: CommonModels.InvoiceTypeEnumSchema, - collective: z.boolean(), - serviceDate: z.iso.datetime({ offset: true }).nullish(), - internalNumber: z.string().nullish(), - reference: z.string().nullish(), - amount: z.number(), - netAmount: z.number(), - tax: z.number(), - currency: z.string(), - dueDate: z.iso.datetime({ offset: true }).nullish(), - status: CommonModels.InvoiceStatusEnumSchema, - payDate: z.iso.datetime({ offset: true }).nullish(), - paidAmount: z.number().nullish(), - position: InvoicePreviewPositionDtoSchema.nullish(), - receiver: InvoicePreviewReceiverDtoSchema.nullish(), - receiverCountry: InvoicePreviewReceiverCountryDtoSchema.nullish(), - clerk: InvoicePreviewClerkDtoSchema.nullish(), - cancelled: z.boolean(), - ok: z.boolean(), - isExportedToBookkeeping: z.boolean(), - dunningBlock: z.boolean(), - invoiceInReview: z.boolean(), - vatOk: z.boolean(), - comments: z.string().nullish(), - paymentComment: z.string().nullish(), - creditorId: z.string().nullish(), - debtorId: z.string().nullish(), - hblNumber: z.string().nullish(), - mblNumber: z.string().nullish(), - bookingNumber: z.string().nullish(), - vessel: z.string().nullish(), - voyage: z.string().nullish(), - vatRules: z.array(VatRuleLabelResponseDtoSchema).readonly().nullish(), - }) - .readonly(); - export type OfficeInvoicePreviewDto = z.infer; - - /** - * InvoiceExportFilterDtoSchema - * @type { object } - * @property { string } search - * @property { CommonModels.DateRangeDto } issuingDate - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection - * @property { CommonModels.InvoiceTypeEnum[] } invoiceType - * @property { CommonModels.BooleanFilterEnum[] } collective - * @property { number } amountMin - * @property { number } amountMax - * @property { string[] } currencyNotation - * @property { CommonModels.DateRangeDto } dueDate - * @property { CommonModels.InvoiceStatusEnum[] } status - * @property { string[] } receiver Filter by invoice receiver/customer ID (UUID) - * @property { string } positionNumbersString - * @property { string[] } positionNumbers - * @property { string } invoiceNumbersString - * @property { string[] } invoiceNumbers - * @property { CommonModels.BooleanFilterEnum[] } bookkeepingExportStatus - * @property { CommonModels.BooleanFilterEnum[] } dunningBlock - * @property { CommonModels.BooleanFilterEnum[] } invoiceInReview - * @property { CommonModels.BooleanFilterEnum[] } isInvoiceOk - * @property { CommonModels.BooleanFilterEnum[] } isVatOk - * @property { number } invoiceNumberMin - * @property { number } invoiceNumberMax - * @property { number } internalNumberMin - * @property { number } internalNumberMax - */ - export const InvoiceExportFilterDtoSchema = z - .object({ - search: z.string(), - issuingDate: CommonModels.DateRangeDtoSchema, - serviceDate: CommonModels.DateRangeDtoSchema, - invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), - invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), - collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - amountMin: z.number(), - amountMax: z.number(), - currencyNotation: z.array(z.string()).readonly(), - dueDate: CommonModels.DateRangeDtoSchema, - status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), - receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer ID (UUID)"), - positionNumbersString: z.string(), - positionNumbers: z.array(z.string()).readonly(), - invoiceNumbersString: z.string(), - invoiceNumbers: z.array(z.string()).readonly(), - bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - invoiceNumberMin: z.number(), - invoiceNumberMax: z.number(), - internalNumberMin: z.number(), - internalNumberMax: z.number(), - }) - .readonly(); - export type InvoiceExportFilterDto = z.infer; - - /** - * InvoiceExportColumnSchema - * @type { enum } - */ - export const InvoiceExportColumnSchema = z.enum([ - "invoiceNumber", - "invoiceDirection", - "issuingDate", - "invoiceType", - "collective", - "serviceDate", - "internalNumber", - "reference", - "totalGross", - "totalNet", - "totalVat", - "currency", - "dueDate", - "status", - "payDate", - "paidAmount", - "positionNumber", - "hblHawb", - "mblMawb", - "bookingNumber", - "vessel", - "voyage", - "receiverName", - "receiverCountry", - "clerkName", - "cancelled", - "ok", - "vatOk", - "dunningBlock", - "invoiceInReview", - "exportedToBookkeeping", - "comments", - "paymentComment", - "vatRuleIds", - "creditorId", - "debtorId", - "createdAt", - ]); - export type InvoiceExportColumn = z.infer; - export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; - - /** - * InvoiceExportRequestDtoSchema - * @type { object } - * @property { InvoiceExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { InvoiceExportFilterDto } filter - */ - export const InvoiceExportRequestDtoSchema = z - .object({ - columns: z.array(InvoiceExportColumnSchema).readonly().min(1), - order: z.array(z.string()).readonly(), - filter: InvoiceExportFilterDtoSchema, - }) - .readonly(); - export type InvoiceExportRequestDto = z.infer; - - /** - * UninvoicedChargeTotalAmountDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ - export const UninvoicedChargeTotalAmountDtoSchema = z - .object({ amount: z.number(), currencyNotation: z.string() }) - .readonly(); - export type UninvoicedChargeTotalAmountDto = z.infer; - - /** - * UninvoicedChargeListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ - export const UninvoicedChargeListResponseDtoSchema = z - .object({ - items: z.array(z.string()).readonly().describe("Items"), - totalAmounts: z.array(UninvoicedChargeTotalAmountDtoSchema).readonly(), - page: z.number().describe("1-indexed page number to begin from").nullish(), - cursor: z.string().describe("ID of item to start after").nullish(), - nextCursor: z.string().describe("Cursor for next set of items").nullish(), - limit: z.number().describe("Items per response"), - totalItems: z.number().describe("Total available items"), - }) - .readonly(); - export type UninvoicedChargeListResponseDto = z.infer; - - /** - * ReceiverDtoSchema - * @type { object } - * @property { string } id Business Partner ID (Customer or Vendor) - * @property { string } name Business Partner name - * @property { string } matchCode Business Partner match code - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ - export const ReceiverDtoSchema = z - .object({ - id: z.string().describe("Business Partner ID (Customer or Vendor)"), - name: z.string().describe("Business Partner name"), - matchCode: z.string().describe("Business Partner match code"), - label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name"), - }) - .readonly(); - export type ReceiverDto = z.infer; - - /** - * UninvoicedChargePositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ - export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); - export type UninvoicedChargePositionDto = z.infer; - - /** - * UninvoicedChargeChargeTypeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const UninvoicedChargeChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type UninvoicedChargeChargeTypeDto = z.infer; - - /** - * UninvoicedChargeVatRuleDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchcode - */ - export const UninvoicedChargeVatRuleDtoSchema = z - .object({ id: z.string(), name: z.string(), matchcode: z.string() }) - .readonly(); - export type UninvoicedChargeVatRuleDto = z.infer; - - /** - * UninvoicedChargeGroupStatusEnumSchema - * @type { enum } - */ - export const UninvoicedChargeGroupStatusEnumSchema = z.enum(["ReadyForInvoice", "MissingInformation"]); - export type UninvoicedChargeGroupStatusEnum = z.infer; - export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSchema.enum; - - /** - * UninvoicedChargeEmployeeDtoSchema - * @type { object } - * @property { string } id - * @property { string } firstName - * @property { string } lastName - * @property { string } fullName - */ - export const UninvoicedChargeEmployeeDtoSchema = z - .object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }) - .readonly(); - export type UninvoicedChargeEmployeeDto = z.infer; - - /** - * UninvoicedChargeDtoSchema - * @type { object } - * @property { string } chargeItemId - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection Invoice direction (Incoming or Outgoing) - * @property { ReceiverDto } receiver Business Partner receiving the invoice - * @property { UninvoicedChargePositionDto } position - * @property { UninvoicedChargeChargeTypeDto } chargeType - * @property { string } currencyNotation ISO 4217 currency code - * @property { number } amount Charge amount in charge currency - * @property { number } amountInOfficeCurrency Charge amount in office currency - * @property { string } officeCurrency Office currency code - * @property { number } exchangeRate - * @property { UninvoicedChargeVatRuleDto } vatRule - * @property { string } serviceDate - * @property { UninvoicedChargeGroupStatusEnum } status Status of charge group - * @property { string[] } missingInformation Missing fields required for invoicing this charge - * @property { UninvoicedChargeEmployeeDto } employee - */ - export const UninvoicedChargeDtoSchema = z - .object({ - chargeItemId: z.string(), - invoiceDirection: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction (Incoming or Outgoing)"), - receiver: ReceiverDtoSchema.describe("Business Partner receiving the invoice"), - position: UninvoicedChargePositionDtoSchema, - chargeType: UninvoicedChargeChargeTypeDtoSchema.nullish(), - currencyNotation: z.string().describe("ISO 4217 currency code"), - amount: z.number().describe("Charge amount in charge currency"), - amountInOfficeCurrency: z.number().describe("Charge amount in office currency"), - officeCurrency: z.string().describe("Office currency code"), - exchangeRate: z.number().nullish(), - vatRule: UninvoicedChargeVatRuleDtoSchema.nullish(), - serviceDate: z.iso.datetime({ offset: true }).nullish(), - status: UninvoicedChargeGroupStatusEnumSchema.describe("Status of charge group"), - missingInformation: z - .array(z.string()) - .readonly() - .describe("Missing fields required for invoicing this charge") - .nullish(), - employee: UninvoicedChargeEmployeeDtoSchema.nullish(), - }) - .readonly(); - export type UninvoicedChargeDto = z.infer; - - /** - * UninvoicedChargePaginationDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string } receiverId - * @property { string } chargeTypeId - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currency - * @property { string } vatRuleId - */ - export const UninvoicedChargePaginationDtoSchema = z - .object({ - direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), - chargeItemId: z.string(), - receiverId: z.string(), - chargeTypeId: z.string(), - serviceDate: CommonModels.DateRangeDtoSchema, - currency: z.array(z.string()).readonly(), - vatRuleId: z.string(), - }) - .readonly(); - export type UninvoicedChargePaginationDto = z.infer; - - /** - * UninvoicedChargesFilterDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string[] } receiverIds - * @property { string[] } positionIds - * @property { string[] } chargeTypeIds - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currencies - * @property { string[] } vatRuleIds - * @property { string[] } employeeIds - */ - export const UninvoicedChargesFilterDtoSchema = z - .object({ - direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), - chargeItemId: z.string(), - receiverIds: z.array(z.string()).readonly(), - positionIds: z.array(z.string()).readonly(), - chargeTypeIds: z.array(z.string()).readonly(), - serviceDate: CommonModels.DateRangeDtoSchema, - currencies: z.array(z.string()).readonly(), - vatRuleIds: z.array(z.string()).readonly(), - employeeIds: z.array(z.string()).readonly(), - }) - .readonly(); - export type UninvoicedChargesFilterDto = z.infer; - - /** - * UninvoicedChargesExportFilterDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string[] } receiverIds - * @property { string[] } positionIds - * @property { string[] } chargeTypeIds - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currencies - * @property { string[] } vatRuleIds - */ - export const UninvoicedChargesExportFilterDtoSchema = z - .object({ - direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), - chargeItemId: z.string(), - receiverIds: z.array(z.string()).readonly(), - positionIds: z.array(z.string()).readonly(), - chargeTypeIds: z.array(z.string()).readonly(), - serviceDate: CommonModels.DateRangeDtoSchema, - currencies: z.array(z.string()).readonly(), - vatRuleIds: z.array(z.string()).readonly(), - }) - .readonly(); - export type UninvoicedChargesExportFilterDto = z.infer; - - /** - * UninvoicedChargeExportColumnSchema - * @type { enum } - */ - export const UninvoicedChargeExportColumnSchema = z.enum([ - "chargeItemId", - "invoiceDirection", - "status", - "receiverName", - "positionNumber", - "serviceDate", - "employee", - "chargeTypeName", - "amount", - "currency", - "exchangeRate", - "amountInOfficeCurrency", - "officeCurrency", - "vatRule", - ]); - export type UninvoicedChargeExportColumn = z.infer; - export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.enum; - - /** - * UninvoicedChargesExportRequestDtoSchema - * @type { object } - * @property { UninvoicedChargeExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { UninvoicedChargesExportFilterDto } filter - */ - export const UninvoicedChargesExportRequestDtoSchema = z - .object({ - columns: z.array(UninvoicedChargeExportColumnSchema).readonly().min(1), - order: z.array(z.string()).readonly(), - filter: UninvoicedChargesExportFilterDtoSchema, - }) - .readonly(); - export type UninvoicedChargesExportRequestDto = z.infer; - - /** - * CreateDraftInvoiceRequestDtoSchema - * @type { object } - * @property { string[] } chargeItemIds Charge item IDs to include in the invoice. Min Items: `1` - * @property { CommonModels.InvoiceTypeEnum } invoiceType Type of invoice - * @property { string } customerId Customer ID (required for outgoing invoices) - * @property { CommonModels.InvoiceDirectionEnum } direction Invoice direction - */ - export const CreateDraftInvoiceRequestDtoSchema = z - .object({ - chargeItemIds: z - .array(z.string()) - .readonly() - .min(1) - .describe("Charge item IDs to include in the invoice") - .nullish(), - invoiceType: CommonModels.InvoiceTypeEnumSchema.describe("Type of invoice"), - customerId: z.string().describe("Customer ID (required for outgoing invoices)"), - direction: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction"), - }) - .readonly(); - export type CreateDraftInvoiceRequestDto = z.infer; - - /** - * UpdateInvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ - export const UpdateInvoiceRemarksDtoSchema = z - .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) - .readonly(); - export type UpdateInvoiceRemarksDto = z.infer; - - /** - * UpdateInvoiceCustomerDtoSchema - * @type { object } - * @property { string } name - * @property { string } reference - * @property { string } contact - */ - export const UpdateInvoiceCustomerDtoSchema = z - .object({ name: z.string(), reference: z.string(), contact: z.string() }) - .readonly(); - export type UpdateInvoiceCustomerDto = z.infer; - - /** - * UpdateInvoiceRequestDtoSchema - * @type { object } - * @property { string } issuingDate Invoice date in ISO format - * @property { string } receiptDate Receipt date in ISO format - * @property { string } serviceDate Service date in ISO format - * @property { string } serviceDateUntil Service end date in ISO format - * @property { string } dueDate Due date in ISO format - * @property { string } invoiceNumber Invoice number - * @property { string } internalNumber Internal reference number - * @property { number } paymentTermDays Payment term in days - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { string } serviceRecipientId Service recipient ID - * @property { string } bankAccountId Bank account ID - * @property { UpdateInvoiceRemarksDto } remarks Additional remarks - * @property { InvoiceLanguageEnum } language Invoice language - * @property { boolean } showPaymentInstructions - * @property { UpdateInvoiceCustomerDto } customer - * @property { string } salesRepId - * @property { string } currencyNotation - * @property { number } exchangeRate Invoice exchange rate - */ - export const UpdateInvoiceRequestDtoSchema = z - .object({ - issuingDate: z.iso.datetime({ offset: true }).describe("Invoice date in ISO format"), - receiptDate: z.iso.datetime({ offset: true }).describe("Receipt date in ISO format"), - serviceDate: z.iso.datetime({ offset: true }).describe("Service date in ISO format"), - serviceDateUntil: z.iso.datetime({ offset: true }).describe("Service end date in ISO format"), - dueDate: z.iso.datetime({ offset: true }).describe("Due date in ISO format").nullable(), - invoiceNumber: z.string().describe("Invoice number").nullable(), - internalNumber: z.string().describe("Internal reference number").nullable(), - paymentTermDays: z.number().describe("Payment term in days").nullable(), - paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, - serviceRecipientId: z.string().describe("Service recipient ID").nullable(), - bankAccountId: z.string().describe("Bank account ID").nullable(), - remarks: UpdateInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), - language: InvoiceLanguageEnumSchema.describe("Invoice language"), - showPaymentInstructions: z.boolean(), - customer: UpdateInvoiceCustomerDtoSchema, - salesRepId: z.string(), - currencyNotation: z.string(), - exchangeRate: z.number().describe("Invoice exchange rate").nullable(), - }) - .readonly(); - export type UpdateInvoiceRequestDto = z.infer; - - /** - * FixInvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ - export const FixInvoiceRemarksDtoSchema = z - .object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }) - .readonly(); - export type FixInvoiceRemarksDto = z.infer; - - /** - * FixInvoiceCustomerDtoSchema - * @type { object } - * @property { string } reference Customer reference number - */ - export const FixInvoiceCustomerDtoSchema = z - .object({ reference: z.string().describe("Customer reference number") }) - .readonly(); - export type FixInvoiceCustomerDto = z.infer; - - /** - * FixInvoiceRequestDtoSchema - * @type { object } - * @property { string } currencyNotation Invoice currency (incoming invoices only) - * @property { string } issuingDate Update invoice date in ISO format - * @property { string } dueDate Update invoice due date in ISO format - * @property { number } exchangeRate Invoice exchange rate - * @property { number } paymentTermDays Payment term in days - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { string } receiptDate Update receipt date in ISO format - * @property { string } serviceDate Update service date in ISO format - * @property { string } serviceDateUntil Update service end date in ISO format - * @property { boolean } isVatOk Mark VAT as checked/OK by accounting - * @property { boolean } isInvoiceOk Mark overall invoice as checked/OK by accounting - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { string } comments - * @property { FixInvoiceRemarksDto } remarks Additional remarks - * @property { string } invoiceNumber Invoice number (incoming invoices only) - * @property { string } bankAccountId Bank account ID - * @property { string } serviceRecipientId Service recipient ID - * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) - */ - export const FixInvoiceRequestDtoSchema = z - .object({ - currencyNotation: z.string().describe("Invoice currency (incoming invoices only)"), - issuingDate: z.iso.datetime({ offset: true }).describe("Update invoice date in ISO format"), - dueDate: z.iso.datetime({ offset: true }).describe("Update invoice due date in ISO format"), - exchangeRate: z.number().describe("Invoice exchange rate").nullable(), - paymentTermDays: z.number().describe("Payment term in days").nullable(), - paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, - receiptDate: z.iso.datetime({ offset: true }).describe("Update receipt date in ISO format"), - serviceDate: z.iso.datetime({ offset: true }).describe("Update service date in ISO format").nullable(), - serviceDateUntil: z.iso.datetime({ offset: true }).describe("Update service end date in ISO format"), - isVatOk: z.boolean().describe("Mark VAT as checked/OK by accounting"), - isInvoiceOk: z.boolean().describe("Mark overall invoice as checked/OK by accounting"), - dunningBlock: z.boolean(), - invoiceInReview: z.boolean(), - comments: z.string(), - remarks: FixInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), - invoiceNumber: z.string().describe("Invoice number (incoming invoices only)").nullable(), - bankAccountId: z.string().describe("Bank account ID").nullable(), - serviceRecipientId: z.string().describe("Service recipient ID").nullable(), - customer: FixInvoiceCustomerDtoSchema.describe("Customer reference (incoming invoices only)"), - }) - .readonly(); - export type FixInvoiceRequestDto = z.infer; - - /** - * UpdateIssuedInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity. Minimum: `0` - * @property { number } amount Amount (must be positive). Minimum: `0.01` - * @property { string } vatRuleId VAT rule ID - * @property { number } exchangeRate Charge exchange rate (incoming invoices only) - * @property { string } currencyNotation - */ - export const UpdateIssuedInvoiceChargeRequestDtoSchema = z - .object({ - positionChargeItemId: z.string().describe("Position charge item ID"), - chargeTypeId: z.string().describe("Charge type ID").nullish(), - additionalText: z.string().describe("Additional text for the charge").nullish(), - quantity: z.number().gte(0).describe("Quantity").nullish(), - amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), - vatRuleId: z.string().describe("VAT rule ID").nullish(), - exchangeRate: z.number().describe("Charge exchange rate (incoming invoices only)").nullish(), - currencyNotation: z.string().nullish(), - }) - .readonly(); - export type UpdateIssuedInvoiceChargeRequestDto = z.infer; - - /** - * UpdateIssuedInvoiceChargesRequestDtoSchema - * @type { object } - * @property { UpdateIssuedInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` - */ - export const UpdateIssuedInvoiceChargesRequestDtoSchema = z - .object({ - charges: z.array(UpdateIssuedInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates"), - }) - .readonly(); - export type UpdateIssuedInvoiceChargesRequestDto = z.infer; - - /** - * UpdateInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity. Minimum: `0` - * @property { number } amount Amount (must be positive). Minimum: `0.01` - * @property { string } vatRuleId VAT rule ID - * @property { number } exchangeRate - * @property { string } currencyNotation - */ - export const UpdateInvoiceChargeRequestDtoSchema = z - .object({ - positionChargeItemId: z.string().describe("Position charge item ID"), - chargeTypeId: z.string().describe("Charge type ID").nullish(), - additionalText: z.string().describe("Additional text for the charge").nullish(), - quantity: z.number().gte(0).describe("Quantity").nullish(), - amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), - vatRuleId: z.string().describe("VAT rule ID").nullish(), - exchangeRate: z.number().nullish(), - currencyNotation: z.string().nullish(), - }) - .readonly(); - export type UpdateInvoiceChargeRequestDto = z.infer; - - /** - * UpdateInvoiceChargesRequestDtoSchema - * @type { object } - * @property { UpdateInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` - */ - export const UpdateInvoiceChargesRequestDtoSchema = z - .object({ - charges: z.array(UpdateInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates"), - }) - .readonly(); - export type UpdateInvoiceChargesRequestDto = z.infer; - - /** - * InvoiceFilterDtoSchema - * @type { object } - * @property { string[] } status - * @property { string } direction - * @property { string } receiver Filter by invoice receiver/customer ID (UUID) - */ - export const InvoiceFilterDtoSchema = z - .object({ - status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), - direction: CommonModels.InvoiceDirectionEnumSchema, - receiver: z.string().describe("Filter by invoice receiver/customer ID (UUID)"), - }) - .readonly(); - export type InvoiceFilterDto = z.infer; - - /** - * ChangeInvoiceCustomerRequestDtoSchema - * @type { object } - * @property { string } newCustomerId - */ - export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }).readonly(); - export type ChangeInvoiceCustomerRequestDto = z.infer; - - /** - * CreateDirectInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ - export const CreateDirectInvoiceChargeRequestDtoSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID"), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().describe("Quantity of the charge"), - buyRate: z.number().describe("Buy rate amount"), - buyCurrencyCode: z.string().describe("Buy rate currency code"), - buyVatRuleId: z.string().describe("Buy VAT rule ID"), - vendorId: z.string().describe("Vendor ID"), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), - sellRate: z.number().describe("Sell rate amount"), - sellCurrencyCode: z.string().describe("Sell rate currency code"), - sellVatRuleId: z.string().describe("Sell VAT rule ID"), - customerId: z.string().describe("Customer ID"), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), - }) - .readonly(); - export type CreateDirectInvoiceChargeRequestDto = z.infer; - - /** - * UpdateIssuedInvoiceVatRulesRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } vatRuleId VAT rule ID - */ - export const UpdateIssuedInvoiceVatRulesRequestDtoSchema = z - .object({ - positionChargeItemId: z.string().describe("Position charge item ID"), - vatRuleId: z.string().describe("VAT rule ID"), - }) - .readonly(); - export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; - - /** - * PrepareUploadRequestDtoSchema - * @type { object } - * @property { string } filename - * @property { string } mimeType - * @property { number } fileSize - */ - export const PrepareUploadRequestDtoSchema = z - .object({ filename: z.string().nullish(), mimeType: z.string(), fileSize: z.number() }) - .readonly(); - export type PrepareUploadRequestDto = z.infer; - - /** - * InvoiceUploadInstructionsDtoSchema - * @type { object } - * @property { string } url Pre-signed URL for the PUT request to storage - * @property { string } method HTTP method to use for upload - */ - export const InvoiceUploadInstructionsDtoSchema = z - .object({ - url: z.string().describe("Pre-signed URL for the PUT request to storage"), - method: z.string().describe("HTTP method to use for upload"), - }) - .readonly(); - export type InvoiceUploadInstructionsDto = z.infer; - - /** - * GetInvoicesEmlInvoiceIdsParamSchema - * @type { array } - * @description Invoice IDs - */ - export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).readonly().describe("Invoice IDs").nullish(); - export type GetInvoicesEmlInvoiceIdsParam = z.infer; - - /** - * InvoicesFindOrderParamEnumSchema - * @type { enum } - */ - export const InvoicesFindOrderParamEnumSchema = z.enum(["status", "createdAt", "serviceDate"]); - export type InvoicesFindOrderParamEnum = z.infer; - export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; - - /** - * InvoicesFindResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { InvoicePreviewDto[] } items - */ - export const InvoicesFindResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(InvoicePreviewDtoSchema).readonly() }).readonly().shape, - }); - export type InvoicesFindResponse = z.infer; - - /** - * FindByOfficeOrderParamEnumSchema - * @type { enum } - */ - export const FindByOfficeOrderParamEnumSchema = z.enum([ - "invoiceNumber", - "issuingDate", - "invoiceType", - "amount", - "netAmount", - "currencyNotation", - "dueDate", - "status", - "paidOn", - "serviceDate", - "internalNumber", - "positionNumber", - "invoiceDirection", - "receiver", - "receiverCountry", - "paidAmount", - "totalVat", - "dunningBlock", - "invoiceInReview", - "isInvoiceOk", - "isVatOk", - "comments", - "salesRepName", - "isExportedToBookkeeping", - "createdAt", - "customerReferenceOverride", - "externalSystemId", - ]); - export type FindByOfficeOrderParamEnum = z.infer; - export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; - - /** - * FindByOfficeResponseSchema - * @type { object } - * @property { number } totalAmountInDefaultCurrency - * @property { string } defaultCurrencyNotation - * @property { TotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficeInvoicePreviewDto[] } items - */ - export const FindByOfficeResponseSchema = z.object({ - ...OfficeInvoiceListResponseDtoSchema.shape, - ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).readonly() }).readonly().shape, - }); - export type FindByOfficeResponse = z.infer; - - /** - * GetUnChargesOrderParamEnumSchema - * @type { enum } - */ - export const GetUnChargesOrderParamEnumSchema = z.enum([ - "chargeItemId", - "orderPosition", - "serviceDate", - "receiverId", - "positionNumber", - "chargeTypeId", - "currency", - "vatRuleId", - ]); - export type GetUnChargesOrderParamEnum = z.infer; - export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; - - /** - * GetUnChargesResponseSchema - * @type { object } - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { UninvoicedChargeDto[] } items - */ - export const GetUnChargesResponseSchema = z.object({ - ...UninvoicedChargeListResponseDtoSchema.shape, - ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape, - }); - export type GetUnChargesResponse = z.infer; - - /** - * InvoicesListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ - export const InvoicesListAvailablePartnersForResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type InvoicesListAvailablePartnersForResponse = z.infer; - - /** - * GetOfficeUnChargesOrderParamEnumSchema - * @type { enum } - */ - export const GetOfficeUnChargesOrderParamEnumSchema = z.enum([ - "chargeItemId", - "orderPosition", - "serviceDate", - "receiverId", - "positionNumber", - "chargeTypeId", - "currency", - "vatRuleId", - ]); - export type GetOfficeUnChargesOrderParamEnum = z.infer; - export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnumSchema.enum; - - /** - * GetOfficeUnChargesResponseSchema - * @type { object } - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { UninvoicedChargeDto[] } items - */ - export const GetOfficeUnChargesResponseSchema = z.object({ - ...UninvoicedChargeListResponseDtoSchema.shape, - ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape, - }); - export type GetOfficeUnChargesResponse = z.infer; -} diff --git a/test/generated/dist/invoices/invoices.queries.ts b/test/generated/dist/invoices/invoices.queries.ts deleted file mode 100644 index 5aa63ba..0000000 --- a/test/generated/dist/invoices/invoices.queries.ts +++ /dev/null @@ -1,1600 +0,0 @@ -import axios, { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InvoicesAcl } from "./invoices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { InvoicesApi } from "./invoices.api"; - -export namespace InvoicesQueries { - export const moduleName = QueryModule.Invoices; - - export const keys = { - all: [moduleName] as const, - getInvoicesEml: (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam) => - [...keys.all, "/offices/:officeId/invoices/eml", officeId, invoiceIds] as const, - find: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.InvoiceFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/invoices", - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - ] as const, - findInfinite: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.InvoiceFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/invoices", - "infinite", - officeId, - positionId, - limit, - order, - filter, - cursor, - ] as const, - findByOffice: ( - officeId: string, - limit?: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/invoices", officeId, limit, order, filter, page, cursor] as const, - findByOfficeInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: CommonModels.OfficeInvoiceFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/invoices", "infinite", officeId, limit, order, filter, cursor] as const, - getUnCharges: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargePaginationDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/uninvoiced-charges", - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - ] as const, - getUnChargesInfinite: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargePaginationDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/uninvoiced-charges", - "infinite", - officeId, - positionId, - limit, - order, - filter, - cursor, - ] as const, - listAvailablePartnersFor: ( - officeId: string, - invoiceId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - ) => - [ - ...keys.all, - "/offices/:officeId/invoices/:invoiceId/available-partners", - officeId, - invoiceId, - search, - useCase, - ] as const, - getOfficeUnCharges: ( - officeId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargesFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/uninvoiced-charges", officeId, limit, order, filter, page, cursor] as const, - getOfficeUnChargesInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: InvoicesModels.UninvoicedChargesFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/uninvoiced-charges", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - getDetail: (officeId: string, invoiceId: string) => - [...keys.all, "/offices/:officeId/invoices/:invoiceId", officeId, invoiceId] as const, - getPreview: (officeId: string, invoiceId: string) => - [...keys.all, "/offices/:officeId/invoices/:invoiceId/preview", officeId, invoiceId] as const, - getInvoiceEml: (officeId: string, invoiceId: string) => - [...keys.all, "/offices/:officeId/invoices/:invoiceId/eml", officeId, invoiceId] as const, - }; - - /** - * Query `useGetInvoicesEml` - recommended when file should be cached - * @summary Get invoices as EML file with PDF attachments - * @permission Requires `canUseGetInvoicesEml` ability - * @param { string } object.officeId Path parameter - * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } object.invoiceIds Query parameter. Invoice IDs - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const useGetInvoicesEml = ( - { officeId, invoiceIds }: { officeId: string; invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvoicesEml(officeId, invoiceIds), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId })); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config); - }, - ...options, - }); - }; - - /** - * Mutation `useGetInvoicesEmlMutation` - recommended when file should not be cached - * @summary Get invoices as EML file with PDF attachments - * @permission Requires `canUseGetInvoicesEml` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } mutation.invoiceIds Query parameter. Invoice IDs - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGetInvoicesEmlMutation = ( - options?: AppMutationOptions< - typeof InvoicesApi.getInvoicesEml, - { officeId: string; invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceIds }) => { - checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId })); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFind` - * @summary List invoices for a position - * @permission Requires `canUseFind` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` - * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFind = ( - { - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: InvoicesModels.InvoiceFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseFind({ officeId })); - return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useFindInfinite - * @summary List invoices for a position - * @permission Requires `canUseFind` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` - * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindInfinite = ( - { - officeId, - positionId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: InvoicesModels.InvoiceFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseFind({ officeId })); - return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useChangeIncomingCustomer` - * @summary Change incoming invoice customer and update vendors on registered charges - * @permission Requires `canUseChangeIncomingCustomer` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.ChangeInvoiceCustomerRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useChangeIncomingCustomer = ( - options?: AppMutationOptions< - typeof InvoicesApi.changeIncomingCustomer, - { officeId: string; invoiceId: string; data: InvoicesModels.ChangeInvoiceCustomerRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId })); - return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindByOffice` - * @summary List invoices for an office - * @permission Requires `canUseFindByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindByOffice = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CommonModels.OfficeInvoiceFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseFindByOffice({ officeId })); - return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useFindByOfficeInfinite - * @summary List invoices for an office - * @permission Requires `canUseFindByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindByOfficeInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: CommonModels.OfficeInvoiceFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseFindByOffice({ officeId })); - return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreateDraft` - * @summary Create a draft invoice from charge items - * @permission Requires `canUseCreateDraft` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.CreateDraftInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const useCreateDraft = ( - options?: AppMutationOptions< - typeof InvoicesApi.createDraft, - { officeId: string; data: InvoicesModels.CreateDraftInvoiceRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseCreateDraft({ officeId })); - return InvoicesApi.createDraft(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useExportInvoices` - recommended when file should not be cached - * @summary Export invoices to Excel - * @permission Requires `canUseExportInvoices` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportInvoices = ( - options?: AppMutationOptions< - typeof InvoicesApi.exportInvoices, - { officeId: string; data: InvoicesModels.InvoiceExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportInvoices({ officeId })); - return InvoicesApi.exportInvoices(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useExportCharges` - recommended when file should not be cached - * @summary Export invoice charges as Excel file - * @permission Requires `canUseExportCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportCharges = ( - options?: AppMutationOptions< - typeof InvoicesApi.exportCharges, - { officeId: string; data: InvoicesModels.InvoiceExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportCharges({ officeId })); - return InvoicesApi.exportCharges(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetUnCharges` - * @summary Get uninvoiced charges for a position - * @permission Requires `canUseGetUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetUnCharges = ( - { - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: InvoicesModels.UninvoicedChargePaginationDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId })); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useGetUnChargesInfinite - * @summary Get uninvoiced charges for a position - * @permission Requires `canUseGetUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useGetUnChargesInfinite = ( - { - officeId, - positionId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: InvoicesModels.UninvoicedChargePaginationDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId })); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for an invoice (union of position involved parties) - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListAvailablePartnersFor = ( - { - officeId, - invoiceId, - search, - useCase, - }: { - officeId: string; - invoiceId: string; - search?: string; - useCase?: CommonModels.PositionAvailablePartnersUseCase; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), - queryFn: () => { - checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId })); - return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase, config); - }, - ...options, - }); - }; - - /** - * Query `useGetOfficeUnCharges` - * @summary Get uninvoiced charges for all positions in an office - * @permission Requires `canUseGetOfficeUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetOfficeUnCharges = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: InvoicesModels.UninvoicedChargesFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId })); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useGetOfficeUnChargesInfinite - * @summary Get uninvoiced charges for all positions in an office - * @permission Requires `canUseGetOfficeUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useGetOfficeUnChargesInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: InvoicesModels.UninvoicedChargesFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId })); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useExportUnCharges` - recommended when file should not be cached - * @summary Export uninvoiced charges as Excel file - * @permission Requires `canUseExportUnCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.UninvoicedChargesExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportUnCharges = ( - options?: AppMutationOptions< - typeof InvoicesApi.exportUnCharges, - { officeId: string; data: InvoicesModels.UninvoicedChargesExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId })); - return InvoicesApi.exportUnCharges(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCreateDirect` - * @summary Dummy endpoint to expose direct invoice permission to FE - * @permission Requires `canUseCreateDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const useCreateDirect = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId }) => { - checkAcl(InvoicesAcl.canUseCreateDirect({ officeId })); - return InvoicesApi.createDirect(officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useAddChargeToDirect` - * @summary Add a charge to a direct invoice - * @permission Requires `canUseAddChargeToDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.CreateDirectInvoiceChargeRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const useAddChargeToDirect = ( - options?: AppMutationOptions< - typeof InvoicesApi.addChargeToDirect, - { officeId: string; invoiceId: string; data: InvoicesModels.CreateDirectInvoiceChargeRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId })); - return InvoicesApi.addChargeToDirect(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateCharges` - * @summary Update charges on a draft invoice - * @permission Requires `canUseUpdateCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateInvoiceChargesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useUpdateCharges = ( - options?: AppMutationOptions< - typeof InvoicesApi.updateCharges, - { officeId: string; invoiceId: string; data: InvoicesModels.UpdateInvoiceChargesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId })); - return InvoicesApi.updateCharges(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useRemoveChargeFromDirect` - * @summary Remove a charge from a direct invoice - * @permission Requires `canUseRemoveChargeFromDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.chargeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useRemoveChargeFromDirect = ( - options?: AppMutationOptions< - typeof InvoicesApi.removeChargeFromDirect, - { officeId: string; invoiceId: string; chargeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, chargeId }) => { - checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId })); - return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetDetail` - * @summary Get invoice details - * @permission Requires `canUseGetDetail` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, default] - */ - export const useGetDetail = ( - { officeId, invoiceId }: { officeId: string; invoiceId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDetail(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetDetail({ officeId })); - return InvoicesApi.getDetail(officeId, invoiceId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update invoice details - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof InvoicesApi.update, - { officeId: string; invoiceId: string; data: InvoicesModels.UpdateInvoiceRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdate({ officeId })); - return InvoicesApi.update(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteInvoice` - * @summary Delete invoice - * @permission Requires `canUseDeleteInvoice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteInvoice = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId })); - return InvoicesApi.deleteInvoice(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useFix` - * @summary Fix invoice with accounting permission - * @permission Requires `canUseFix` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.FixInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useFix = ( - options?: AppMutationOptions< - typeof InvoicesApi.fix, - { officeId: string; invoiceId: string; data: InvoicesModels.FixInvoiceRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseFix({ officeId })); - return InvoicesApi.fix(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerate` - recommended when file should not be cached - * @summary Generate an invoice PDF - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [201, 401] - */ - export const useGenerate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGenerate({ officeId })); - return InvoicesApi.generate(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateIssuedVatRules` - * @summary Update VAT rules on issued invoice charges - * @permission Requires `canUseUpdateIssuedVatRules` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useUpdateIssuedVatRules = ( - options?: AppMutationOptions< - typeof InvoicesApi.updateIssuedVatRules, - { officeId: string; invoiceId: string; data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId })); - return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateIssuedCharges` - * @summary Update charges on issued invoice - * @permission Requires `canUseUpdateIssuedCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useUpdateIssuedCharges = ( - options?: AppMutationOptions< - typeof InvoicesApi.updateIssuedCharges, - { officeId: string; invoiceId: string; data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId })); - return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useIssue` - recommended when file should not be cached - * @summary Issue outgoing invoice - * @permission Requires `canUseIssue` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useIssue = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseIssue({ officeId })); - return InvoicesApi.issue(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [ - keys.getInvoicesEml(officeId), - keys.getPreview(officeId, invoiceId), - keys.getInvoiceEml(officeId, invoiceId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useReportHungarian` - * @summary Report invoice to Hungarian tax authority - * @permission Requires `canUseReportHungarian` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useReportHungarian = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseReportHungarian({ officeId })); - return InvoicesApi.reportHungarian(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateIncoming` - recommended when file should not be cached - * @summary Re-Generate an invoice PDF - * @permission Requires `canUseGenerateIncoming` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useGenerateIncoming = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId })); - return InvoicesApi.generateIncoming(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [ - keys.getInvoicesEml(officeId), - keys.getPreview(officeId, invoiceId), - keys.getInvoiceEml(officeId, invoiceId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useRegister` - * @summary Register incoming invoice - * @permission Requires `canUseRegister` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useRegister = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseRegister({ officeId })); - return InvoicesApi.register(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetPreview` - recommended when file should be cached - * @summary Get invoice PDF preview - * @permission Requires `canUseGetPreview` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const useGetPreview = ( - { officeId, invoiceId }: { officeId: string; invoiceId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getPreview(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetPreview({ officeId })); - return InvoicesApi.getPreview(officeId, invoiceId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useGetPreviewMutation` - recommended when file should not be cached - * @summary Get invoice PDF preview - * @permission Requires `canUseGetPreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGetPreviewMutation = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGetPreview({ officeId })); - return InvoicesApi.getPreview(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [ - keys.getInvoicesEml(officeId), - keys.getPreview(officeId, invoiceId), - keys.getInvoiceEml(officeId, invoiceId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetInvoiceEml` - recommended when file should be cached - * @summary Get invoice as EML file with PDF attachment - * @permission Requires `canUseGetInvoiceEml` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const useGetInvoiceEml = ( - { officeId, invoiceId }: { officeId: string; invoiceId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvoiceEml(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId })); - return InvoicesApi.getInvoiceEml(officeId, invoiceId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useGetInvoiceEmlMutation` - recommended when file should not be cached - * @summary Get invoice as EML file with PDF attachment - * @permission Requires `canUseGetInvoiceEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGetInvoiceEmlMutation = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId })); - return InvoicesApi.getInvoiceEml(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [ - keys.getInvoicesEml(officeId), - keys.getPreview(officeId, invoiceId), - keys.getInvoiceEml(officeId, invoiceId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `usePrepareDocumentUpload` - * @summary Prepare for invoice document upload - * @permission Requires `canUsePrepareDocumentUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.PrepareUploadRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const usePrepareDocumentUpload = ( - options?: AppMutationOptions< - typeof InvoicesApi.prepareDocumentUpload, - { - officeId: string; - invoiceId: string; - data: InvoicesModels.PrepareUploadRequestDto; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { - checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId })); - const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCancel` - * @summary Cancel invoice (create draft credit note) - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ - export const useCancel = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseCancel({ officeId })); - return InvoicesApi.cancel(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useIssueCreditNote` - * @summary Issue credit invoice - * @permission Requires `canUseIssueCreditNote` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ - export const useIssueCreditNote = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId })); - return InvoicesApi.issueCreditNote(officeId, invoiceId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/masterData/masterData.acl.ts b/test/generated/dist/masterData/masterData.acl.ts deleted file mode 100644 index 90517a8..0000000 --- a/test/generated/dist/masterData/masterData.acl.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace MasterDataAcl { - /** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Depot"] as AbilityTuple<"Read", "Depot">; -} diff --git a/test/generated/dist/masterData/masterData.api.ts b/test/generated/dist/masterData/masterData.api.ts deleted file mode 100644 index d1bc569..0000000 --- a/test/generated/dist/masterData/masterData.api.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { MasterDataModels } from "./masterData.models"; - -export namespace MasterDataApi { - export const findAll = ( - officeId: string, - types: MasterDataModels.MasterDataFindAllTypesParam, - search?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, - `/offices/${officeId}/master-data/autocomplete`, - { - ...config, - params: { - types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { - type: "query", - name: "types", - }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - }, - ); - }; - export const paginate = ( - officeId: string, - types: MasterDataModels.MasterDataPaginateTypesParam, - limit: number, - search?: string, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, - `/offices/${officeId}/master-data/labels/paginated`, - { - ...config, - params: { - types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { - type: "query", - name: "types", - }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; -} diff --git a/test/generated/dist/masterData/masterData.configs.ts b/test/generated/dist/masterData/masterData.configs.ts deleted file mode 100644 index 3f2dbff..0000000 --- a/test/generated/dist/masterData/masterData.configs.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { dynamicColumns } from "@povio/ui"; -import { MasterDataModels } from "./masterData.models"; -import { MasterDataQueries } from "./masterData.queries"; -import { MasterDataAcl } from "./masterData.acl"; - -export namespace MasterDataConfigs { - export const paginatedConfig = { - meta: { - title: "Paginated", - }, - readAll: { - acl: MasterDataAcl.canUsePaginate, - schema: MasterDataModels.MasterDataLabelResponseDTOSchema, - paginated: MasterDataQueries.usePaginate, - infinite: MasterDataQueries.usePaginateInfinite, - columns: dynamicColumns({ - schema: MasterDataModels.MasterDataLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - type: true, - }, - }, - }), - }, - }; -} diff --git a/test/generated/dist/masterData/masterData.models.ts b/test/generated/dist/masterData/masterData.models.ts deleted file mode 100644 index 3a0dfae..0000000 --- a/test/generated/dist/masterData/masterData.models.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace MasterDataModels { - /** - * MasterDataTypeEnumSchema - * @type { enum } - */ - export const MasterDataTypeEnumSchema = z.enum([ - "BusinessPartner", - "Depot", - "City", - "Warehouse", - "ContainerYard", - "PortTerminal", - "AirportTerminal", - "Port", - "Airport", - ]); - export type MasterDataTypeEnum = z.infer; - export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; - - /** - * MasterDataItemResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the item - * @property { string } name Name of the item - * @property { MasterDataTypeEnum } type Type of the item - */ - export const MasterDataItemResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the item"), - name: z.string().describe("Name of the item"), - type: MasterDataTypeEnumSchema.describe("Type of the item"), - }) - .readonly(); - export type MasterDataItemResponseDTO = z.infer; - - /** - * MasterDataItemsResponseDTOSchema - * @type { object } - * @property { MasterDataItemResponseDTO[] } items List of master data items - */ - export const MasterDataItemsResponseDTOSchema = z - .object({ items: z.array(MasterDataItemResponseDTOSchema).readonly().describe("List of master data items") }) - .readonly(); - export type MasterDataItemsResponseDTO = z.infer; - - /** - * MasterDataLabelResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the item - * @property { string } label Label of the item - * @property { MasterDataTypeEnum } type Type of the item - */ - export const MasterDataLabelResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the item"), - label: z.string().describe("Label of the item"), - type: MasterDataTypeEnumSchema.describe("Type of the item"), - }) - .readonly(); - export type MasterDataLabelResponseDTO = z.infer; - - /** - * MasterDataFindAllTypesParamSchema - * @type { array } - */ - export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); - export type MasterDataFindAllTypesParam = z.infer; - - /** - * MasterDataPaginateTypesParamSchema - * @type { array } - */ - export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); - export type MasterDataPaginateTypesParam = z.infer; - - /** - * MasterDataPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { MasterDataLabelResponseDTO[] } items - */ - export const MasterDataPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(MasterDataLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type MasterDataPaginateResponse = z.infer; -} diff --git a/test/generated/dist/masterData/masterData.queries.ts b/test/generated/dist/masterData/masterData.queries.ts deleted file mode 100644 index 7ba7283..0000000 --- a/test/generated/dist/masterData/masterData.queries.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { MasterDataAcl } from "./masterData.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { MasterDataModels } from "./masterData.models"; -import { MasterDataApi } from "./masterData.api"; - -export namespace MasterDataQueries { - export const moduleName = QueryModule.MasterData; - - export const keys = { - all: [moduleName] as const, - findAll: (officeId: string, types?: MasterDataModels.MasterDataFindAllTypesParam, search?: string) => - [...keys.all, "/offices/:officeId/master-data/autocomplete", officeId, types, search] as const, - paginate: ( - officeId: string, - types?: MasterDataModels.MasterDataPaginateTypesParam, - limit?: number, - search?: string, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/master-data/labels/paginated", - officeId, - types, - limit, - search, - page, - cursor, - ] as const, - paginateInfinite: ( - officeId: string, - types?: MasterDataModels.MasterDataPaginateTypesParam, - limit?: number, - search?: string, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/master-data/labels/paginated", - "infinite", - officeId, - types, - limit, - search, - cursor, - ] as const, - }; - - /** - * Query `useFindAll` - * @summary List master data based on provided type - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataFindAllTypesParam } object.types Query parameter - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - officeId, - types, - search, - }: { officeId: string; types: MasterDataModels.MasterDataFindAllTypesParam; search?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(officeId, types, search), - queryFn: () => { - checkAcl(MasterDataAcl.canUseFindAll()); - return MasterDataApi.findAll(officeId, types, search, config); - }, - ...options, - }); - }; - - /** - * Query `usePaginate` - * @summary Paginate master data based on provided type - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.search Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - types, - limit, - search, - page, - cursor, - }: { - officeId: string; - types: MasterDataModels.MasterDataPaginateTypesParam; - limit: number; - search?: string; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, types, limit, search, page, cursor), - queryFn: () => { - checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate master data based on provided type - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.search Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - types, - limit, - search, - cursor, - }: { - officeId: string; - types: MasterDataModels.MasterDataPaginateTypesParam; - limit: number; - search?: string; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), - queryFn: ({ pageParam }) => { - checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/masterDataImport/masterDataImport.acl.ts b/test/generated/dist/masterDataImport/masterDataImport.acl.ts deleted file mode 100644 index 6146a3a..0000000 --- a/test/generated/dist/masterDataImport/masterDataImport.acl.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace MasterDataImportAcl { - /** - * Use for `useUpload` mutation ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpload` mutation - */ - export const canUseUpload = (object?: { officeId: string }) => - ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< - "Import", - "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) - >; - - /** - * Use for `usePostOfficesMasterDataImportByOfficeId` mutation ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePostOfficesMasterDataImportByOfficeId` mutation - */ - export const canUsePostOfficesMasterDataImportByOfficeId = (object?: { officeId: string }) => - ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< - "Import", - "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) - >; - - /** - * Use for `useGetImportStatus` query ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetImportStatus` query - */ - export const canUseGetImportStatus = (object?: { officeId: string }) => - ["Import", object ? subject("MasterData", object) : "MasterData"] as AbilityTuple< - "Import", - "MasterData" | (ForcedSubject<"MasterData"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/masterDataImport/masterDataImport.api.ts b/test/generated/dist/masterDataImport/masterDataImport.api.ts deleted file mode 100644 index e2040f1..0000000 --- a/test/generated/dist/masterDataImport/masterDataImport.api.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { MasterDataImportModels } from "./masterDataImport.models"; - -export namespace MasterDataImportApi { - export const upload = ( - officeId: string, - data: MasterDataImportModels.MasterDataImportUploadRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, - `/offices/${officeId}/master-data/upload`, - ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), - config, - ); - }; - export const postOfficesMasterDataImportByOfficeId = ( - officeId: string, - data: MasterDataImportModels.MasterDataImportRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, - `/offices/${officeId}/master-data/import`, - ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), - config, - ); - }; - export const getImportStatus = (jobId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, - `/offices/${officeId}/master-data/import/${jobId}/status`, - config, - ); - }; -} diff --git a/test/generated/dist/masterDataImport/masterDataImport.models.ts b/test/generated/dist/masterDataImport/masterDataImport.models.ts deleted file mode 100644 index 27c6a3e..0000000 --- a/test/generated/dist/masterDataImport/masterDataImport.models.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { z } from "zod"; - -export namespace MasterDataImportModels { - /** - * ImportStatusEnumSchema - * @type { enum } - * @description Import result status - */ - export const ImportStatusEnumSchema = z.enum(["Success", "Warning", "Error"]); - export type ImportStatusEnum = z.infer; - export const ImportStatusEnum = ImportStatusEnumSchema.enum; - - /** - * ImportTypeEnumSchema - * @type { enum } - */ - export const ImportTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Warehouse"]); - export type ImportTypeEnum = z.infer; - export const ImportTypeEnum = ImportTypeEnumSchema.enum; - - /** - * MasterDataImportRequestDtoSchema - * @type { object } - * @property { string } mediaId Media ID of the uploaded file - * @property { ImportTypeEnum } type Type of data to import - */ - export const MasterDataImportRequestDtoSchema = z - .object({ - mediaId: z.string().describe("Media ID of the uploaded file"), - type: ImportTypeEnumSchema.describe("Type of data to import"), - }) - .readonly(); - export type MasterDataImportRequestDto = z.infer; - - /** - * ImportResultDtoSchema - * @type { object } - * @property { string } importStatus Import result status - * @property { string } downloadUrl S3 presigned URL for result file download - * @property { string } expiresAt Download URL expiration time - * @property { string } errorCode - */ - export const ImportResultDtoSchema = z - .object({ - importStatus: ImportStatusEnumSchema.describe("Import result status").nullish(), - downloadUrl: z.string().describe("S3 presigned URL for result file download"), - expiresAt: z.iso.datetime({ offset: true }).describe("Download URL expiration time").nullish(), - errorCode: z.string().nullish(), - }) - .readonly(); - export type ImportResultDto = z.infer; - - /** - * ImportStatusResponseDtoSchema - * @type { object } - * @property { string } status Current job status - * @property { ImportResultDto } result Import result data when job is completed - */ - export const ImportStatusResponseDtoSchema = z - .object({ - status: z.string().describe("Current job status").nullable(), - result: ImportResultDtoSchema.describe("Import result data when job is completed").nullish(), - }) - .readonly(); - export type ImportStatusResponseDto = z.infer; - - /** - * MasterDataImportUploadRequestDtoSchema - * @type { object } - * @property { string } filename File name - * @property { string } contentType Content type of the file - * @property { number } fileSize File size in bytes. Minimum: `1` - */ - export const MasterDataImportUploadRequestDtoSchema = z - .object({ - filename: z.string().describe("File name"), - contentType: z.string().describe("Content type of the file"), - fileSize: z.number().gte(1).describe("File size in bytes"), - }) - .readonly(); - export type MasterDataImportUploadRequestDto = z.infer; - - /** - * MasterDataImportUploadResponseDtoSchema - * @type { object } - * @property { string } mediaId Media ID for the uploaded file - * @property { string } url S3 presigned upload URL - */ - export const MasterDataImportUploadResponseDtoSchema = z - .object({ - mediaId: z.string().describe("Media ID for the uploaded file"), - url: z.string().describe("S3 presigned upload URL"), - }) - .readonly(); - export type MasterDataImportUploadResponseDto = z.infer; - - /** - * MasterDataImportResponseDtoSchema - * @type { object } - * @property { string } jobId PG Boss job ID - * @property { string } status Initial job status - */ - export const MasterDataImportResponseDtoSchema = z - .object({ - jobId: z.string().describe("PG Boss job ID"), - status: z.string().describe("Initial job status").nullish(), - }) - .readonly(); - export type MasterDataImportResponseDto = z.infer; -} diff --git a/test/generated/dist/masterDataImport/masterDataImport.queries.ts b/test/generated/dist/masterDataImport/masterDataImport.queries.ts deleted file mode 100644 index 60d6af7..0000000 --- a/test/generated/dist/masterDataImport/masterDataImport.queries.ts +++ /dev/null @@ -1,146 +0,0 @@ -import axios, { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { MasterDataImportAcl } from "./masterDataImport.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { MasterDataImportModels } from "./masterDataImport.models"; -import { MasterDataImportApi } from "./masterDataImport.api"; - -export namespace MasterDataImportQueries { - export const moduleName = QueryModule.MasterDataImport; - - export const keys = { - all: [moduleName] as const, - getImportStatus: (jobId: string, officeId: string) => - [...keys.all, "/offices/:officeId/master-data/import/:jobId/status", jobId, officeId] as const, - }; - - /** - * Mutation `useUpload` - * @summary Create upload instructions for master data import file - * @permission Requires `canUseUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { MasterDataImportModels.MasterDataImportUploadRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useUpload = ( - options?: AppMutationOptions< - typeof MasterDataImportApi.upload, - { - officeId: string; - data: MasterDataImportModels.MasterDataImportUploadRequestDto; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(MasterDataImportAcl.canUseUpload({ officeId })); - const uploadInstructions = await MasterDataImportApi.upload(officeId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `usePostOfficesMasterDataImportByOfficeId` - * @summary Start master data import process - * @permission Requires `canUsePostOfficesMasterDataImportByOfficeId` ability - * @param { string } mutation.officeId Path parameter - * @param { MasterDataImportModels.MasterDataImportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const usePostOfficesMasterDataImportByOfficeId = ( - options?: AppMutationOptions< - typeof MasterDataImportApi.postOfficesMasterDataImportByOfficeId, - { officeId: string; data: MasterDataImportModels.MasterDataImportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId })); - return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetImportStatus` - * @summary Get import job status - * @permission Requires `canUseGetImportStatus` ability - * @param { string } object.jobId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetImportStatus = ( - { jobId, officeId }: { jobId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getImportStatus(jobId, officeId), - queryFn: () => { - checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId })); - return MasterDataImportApi.getImportStatus(jobId, officeId, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/offices/offices.acl.ts b/test/generated/dist/offices/offices.acl.ts deleted file mode 100644 index aec8ce6..0000000 --- a/test/generated/dist/offices/offices.acl.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace OfficesAcl { - /** - * Use for `useCreate` mutation ability. - * @description Create office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Office"] as AbilityTuple<"Create", "Office">; - - /** - * Use for `useGet` query ability. - * @description Read office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = () => ["Read", "Office"] as AbilityTuple<"Read", "Office">; - - /** - * Use for `useUpdate` mutation ability. - * @description Update office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Office"] as AbilityTuple<"Update", "Office">; - - /** - * Use for `useUploadDocumentImage` mutation ability. For global ability, omit the object parameter. - * @description Upload office document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadDocumentImage` mutation - */ - export const canUseUploadDocumentImage = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; - - /** - * Use for `useCreateBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Create office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBankAccount` mutation - */ - export const canUseCreateBankAccount = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; - - /** - * Use for `useUpdateBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Update office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBankAccount` mutation - */ - export const canUseUpdateBankAccount = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; - - /** - * Use for `useDeleteBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Delete office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBankAccount` mutation - */ - export const canUseDeleteBankAccount = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; - - /** - * Use for `useUploadBankAccountFooter` mutation ability. For global ability, omit the object parameter. - * @description Upload bank account footer - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadBankAccountFooter` mutation - */ - export const canUseUploadBankAccountFooter = (object?: { officeId: string }) => - ["Update", object ? subject("Office", object) : "Office"] as AbilityTuple< - "Update", - "Office" | (ForcedSubject<"Office"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/offices/offices.api.ts b/test/generated/dist/offices/offices.api.ts deleted file mode 100644 index 2368933..0000000 --- a/test/generated/dist/offices/offices.api.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { OfficesModels } from "./offices.models"; - -export namespace OfficesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: OfficesModels.OfficeFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: OfficesModels.OfficesPaginateResponseSchema }, `/offices`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: OfficesModels.CreateOfficeRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: OfficesModels.OfficeResponseDtoSchema }, - `/offices`, - ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), - config, - ); - }; - export const findAllLabels = (search?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: OfficesModels.FindAllLabelsResponseSchema }, `/offices/labels`, { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - }); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: OfficesModels.OfficeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, - `/offices/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const get = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, `/offices/${id}`, config); - }; - export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: OfficesModels.OfficeResponseDtoSchema }, - `/offices/${id}`, - ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), - config, - ); - }; - export const uploadDocumentImage = ( - officeId: string, - data: OfficesModels.UploadOfficeDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, - `/offices/${officeId}/document-image`, - ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), - config, - ); - }; - export const createBankAccount = ( - officeId: string, - data: OfficesModels.CreateOfficeBankAccountDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, - `/offices/${officeId}/bank-accounts`, - ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), - config, - ); - }; - export const updateBankAccount = ( - accountId: string, - officeId: string, - data: OfficesModels.UpdateOfficeBankAccountDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, - `/offices/${officeId}/bank-accounts/${accountId}`, - ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), - config, - ); - }; - export const deleteBankAccount = (accountId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/bank-accounts/${accountId}`, - undefined, - config, - ); - }; - export const uploadBankAccountFooter = ( - accountId: string, - officeId: string, - data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, - `/offices/${officeId}/bank-accounts/${accountId}/footer`, - ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/offices/offices.configs.ts b/test/generated/dist/offices/offices.configs.ts deleted file mode 100644 index c595c05..0000000 --- a/test/generated/dist/offices/offices.configs.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { OfficesModels } from "./offices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { OfficesQueries } from "./offices.queries"; -import { OfficesAcl } from "./offices.acl"; - -export namespace OfficesConfigs { - export const officesConfig = { - meta: { - title: "Offices", - }, - readAll: { - schema: OfficesModels.OfficeListItemResponseSchema, - paginated: OfficesQueries.usePaginate, - infinite: OfficesQueries.usePaginateInfinite, - filters: { - schema: OfficesModels.OfficeFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: OfficesModels.OfficeFilterDtoSchema, - options: { - inputs: { - name: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: OfficesModels.OfficeListItemResponseSchema, - options: { - columns: { - id: true, - name: true, - numberOfEmployees: true, - }, - sortable: OfficesModels.OfficesPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: OfficesAcl.canUseGet, - schema: OfficesModels.OfficeDetailResponseDtoSchema, - query: OfficesQueries.useGet, - }, - create: { - acl: OfficesAcl.canUseCreate, - schema: OfficesModels.CreateOfficeRequestSchema, - mutation: OfficesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: OfficesModels.CreateOfficeRequestSchema, - options: { - inputs: { - name: true, - }, - }, - }), - }, - update: { - acl: OfficesAcl.canUseUpdate, - schema: OfficesModels.UpdateOfficeRequestSchema, - mutation: OfficesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: OfficesModels.UpdateOfficeRequestSchema, - options: { - inputs: { - name: true, - symbol: true, - invoicePrefix: true, - autoClosePositionsAfterDays: true, - defaultLanguage: true, - locale: true, - vatId: true, - taxNumber: true, - termsExport: true, - termsImport: true, - showPaymentInstructions: true, - showCompanyRegistrationNumber: true, - reportInvoicesToHungarianTaxAuthority: true, - restrictPositionInvolvedParties: true, - showWatermarkOnDocuments: true, - showInvoiceVatLinesInOfficeCurrency: true, - usePartnerMatchCodes: true, - restrictFinancePartnersToRelationship: true, - costCenterId: true, - minimumOutgoingInvoiceDate: true, - minimumOutgoingInvoiceServiceDate: true, - minimumIncomingInvoiceDate: true, - minimumIncomingInvoiceServiceDate: true, - countryId: true, - defaultCurrencyId: true, - representingBusinessPartnerId: true, - availableCurrencyIds: true, - generalLedgerSystem: true, - factoringReportingEnabled: true, - bankAccountCurrencyMapping: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - schema: CommonModels.LabelResponseDTOSchema, - paginated: OfficesQueries.usePaginateLabels, - infinite: OfficesQueries.usePaginateLabelsInfinite, - filters: { - schema: OfficesModels.OfficeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: OfficesModels.OfficeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/offices/offices.models.ts b/test/generated/dist/offices/offices.models.ts deleted file mode 100644 index ca066ec..0000000 --- a/test/generated/dist/offices/offices.models.ts +++ /dev/null @@ -1,603 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace OfficesModels { - /** - * OfficeCurrencyResponseDtoSchema - * @type { object } - * @property { string } isoCode - * @property { string } name - */ - export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }).readonly(); - export type OfficeCurrencyResponseDto = z.infer; - - /** - * OfficeBankAccountCurrencyMappingResponseDtoSchema - * @type { object } - * @property { string } currency - * @property { string } bankAccountId - * @property { string } bankAccountName - */ - export const OfficeBankAccountCurrencyMappingResponseDtoSchema = z - .object({ currency: z.string(), bankAccountId: z.string(), bankAccountName: z.string() }) - .readonly(); - export type OfficeBankAccountCurrencyMappingResponseDto = z.infer< - typeof OfficeBankAccountCurrencyMappingResponseDtoSchema - >; - - /** - * OfficeBookkeepingResponseDtoSchema - * @type { object } - * @property { string } generalLedgerSystem - * @property { OfficeCurrencyResponseDto } defaultCurrency - * @property { OfficeCurrencyResponseDto[] } availableCurrencies - * @property { boolean } showPaymentInstructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { OfficeBankAccountCurrencyMappingResponseDto[] } bankAccountCurrencyMapping - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { boolean } factoringReportingEnabled - */ - export const OfficeBookkeepingResponseDtoSchema = z - .object({ - generalLedgerSystem: z.string(), - defaultCurrency: OfficeCurrencyResponseDtoSchema.nullish(), - availableCurrencies: z.array(OfficeCurrencyResponseDtoSchema).readonly(), - showPaymentInstructions: z.boolean(), - showCompanyRegistrationNumber: z.boolean(), - showInvoiceVatLinesInOfficeCurrency: z.boolean(), - reportInvoicesToHungarianTaxAuthority: z.boolean(), - bankAccountCurrencyMapping: z.array(OfficeBankAccountCurrencyMappingResponseDtoSchema).readonly(), - costCenterId: z.string().nullish(), - minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), - factoringReportingEnabled: z.boolean(), - }) - .readonly(); - export type OfficeBookkeepingResponseDto = z.infer; - - /** - * OfficeDocumentPartEnumSchema - * @type { enum } - */ - export const OfficeDocumentPartEnumSchema = z.enum([ - "DocumentFooter", - "DocumentHeader", - "GeneralTermsAndConditions", - "BLTermsAndConditions", - "FinanceDocumentFooter", - ]); - export type OfficeDocumentPartEnum = z.infer; - export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; - - /** - * OfficeDocumentSettingsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } mediaUrl - * @property { CommonModels.LanguageEnum } language - * @property { OfficeDocumentPartEnum } documentPart - */ - export const OfficeDocumentSettingsResponseDtoSchema = z - .object({ - id: z.string(), - mediaUrl: z.string(), - language: CommonModels.LanguageEnumSchema, - documentPart: OfficeDocumentPartEnumSchema, - }) - .readonly(); - export type OfficeDocumentSettingsResponseDto = z.infer; - - /** - * AddressResponseDTOSchema - * @type { object } - * @property { string } id ID of the address - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } city City name - * @property { string } district District - * @property { string } isoCode2 2 letter country code - * @property { string } country Country name - * @property { string } isoCode3 3 letter country code - */ - export const AddressResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the address"), - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street address"), - zip: z.string().describe("ZIP/Postal code"), - city: z.string().describe("City name"), - district: z.string().describe("District"), - isoCode2: z.string().describe("2 letter country code"), - country: z.string().describe("Country name"), - isoCode3: z.string().describe("3 letter country code"), - }) - .readonly(); - export type AddressResponseDTO = z.infer; - - /** - * OfficeRepresentingBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string[] } types - * @property { string[] } email - * @property { string[] } phone - * @property { string } addressId - * @property { AddressResponseDTO } address - */ - export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - types: z.array(z.string()).readonly(), - email: z.array(z.string()).readonly().nullish(), - phone: z.array(z.string()).readonly().nullish(), - addressId: z.string().nullish(), - address: AddressResponseDTOSchema.nullish(), - }) - .readonly(); - export type OfficeRepresentingBusinessPartnerResponseDto = z.infer< - typeof OfficeRepresentingBusinessPartnerResponseDtoSchema - >; - - /** - * OfficePaymentTermsResponseDtoSchema - * @type { object } - * @property { number } days - * @property { string } relativeTo - */ - export const OfficePaymentTermsResponseDtoSchema = z - .object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }) - .readonly(); - export type OfficePaymentTermsResponseDto = z.infer; - - /** - * OfficeCountryResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const OfficeCountryResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type OfficeCountryResponseDto = z.infer; - - /** - * OfficeBankAccountResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } bankName - * @property { string } iban - * @property { string } swiftBic - * @property { boolean } useFooterOnInvoice - * @property { object } footer - * @property { string } footer.mediaUrl - * @property { boolean } isFactoringBank - */ - export const OfficeBankAccountResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - bankName: z.string(), - iban: z.string(), - swiftBic: z.string(), - useFooterOnInvoice: z.boolean(), - footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), - isFactoringBank: z.boolean(), - }) - .readonly(); - export type OfficeBankAccountResponseDto = z.infer; - - /** - * OfficeDetailResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } symbol - * @property { number } invoicePrefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage - * @property { CommonModels.LocaleEnum } locale - * @property { string } vatId - * @property { string } taxNumber - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { OfficePaymentTermsResponseDto } termsExport - * @property { OfficePaymentTermsResponseDto } termsImport - * @property { OfficeCountryResponseDto } country - * @property { OfficeBankAccountResponseDto[] } bankAccounts - * @property { OfficeBookkeepingResponseDto } bookkeeping - * @property { OfficeDocumentSettingsResponseDto[] } documentSettings - * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner - * @property { boolean } hasInttraCredentials - */ - export const OfficeDetailResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - symbol: z.string().nullable(), - invoicePrefix: z.number().nullable(), - autoClosePositionsAfterDays: z.number().nullish(), - defaultLanguage: z.string().nullable(), - locale: CommonModels.LocaleEnumSchema.nullish(), - vatId: z.string().nullable(), - taxNumber: z.string().nullable(), - restrictPositionInvolvedParties: z.boolean(), - showWatermarkOnDocuments: z.boolean(), - usePartnerMatchCodes: z.boolean(), - restrictFinancePartnersToRelationship: z.boolean(), - termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), - termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), - country: OfficeCountryResponseDtoSchema.nullable(), - bankAccounts: z.array(OfficeBankAccountResponseDtoSchema).readonly(), - bookkeeping: OfficeBookkeepingResponseDtoSchema, - documentSettings: z.array(OfficeDocumentSettingsResponseDtoSchema).readonly(), - representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), - hasInttraCredentials: z.boolean().nullish(), - }) - .readonly(); - export type OfficeDetailResponseDto = z.infer; - - /** - * OfficeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } symbol - * @property { number } invoicePrefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage - * @property { CommonModels.LocaleEnum } locale - * @property { string } vatId - * @property { string } taxNumber - * @property { OfficePaymentTermsResponseDto } termsExport - * @property { OfficePaymentTermsResponseDto } termsImport - * @property { boolean } showPaymentInstructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { string } countryId - * @property { string } defaultCurrencyId - * @property { string[] } availableCurrencyIds - * @property { string } generalLedgerSystem - * @property { string } representingBusinessPartnerId - * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner - * @property { boolean } factoringReportingEnabled - */ - export const OfficeResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - symbol: z.string().nullable(), - invoicePrefix: z.number().nullable(), - autoClosePositionsAfterDays: z.number().nullish(), - defaultLanguage: z.string().nullable(), - locale: CommonModels.LocaleEnumSchema.nullish(), - vatId: z.string().nullable(), - taxNumber: z.string().nullable(), - termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), - termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), - showPaymentInstructions: z.boolean(), - showCompanyRegistrationNumber: z.boolean(), - restrictPositionInvolvedParties: z.boolean(), - showWatermarkOnDocuments: z.boolean(), - showInvoiceVatLinesInOfficeCurrency: z.boolean(), - usePartnerMatchCodes: z.boolean(), - restrictFinancePartnersToRelationship: z.boolean(), - reportInvoicesToHungarianTaxAuthority: z.boolean(), - costCenterId: z.string().nullish(), - minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), - minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), - countryId: z.string().nullable(), - defaultCurrencyId: z.string().nullable(), - availableCurrencyIds: z.array(z.string()).readonly().nullable(), - generalLedgerSystem: z.string().nullable(), - representingBusinessPartnerId: z.string().nullable(), - representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), - factoringReportingEnabled: z.boolean(), - }) - .readonly(); - export type OfficeResponseDto = z.infer; - - /** - * UpdateOfficePaymentTermsRequestSchema - * @type { object } - * @property { number } days - * @property { string } relativeTo - */ - export const UpdateOfficePaymentTermsRequestSchema = z - .object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }) - .readonly(); - export type UpdateOfficePaymentTermsRequest = z.infer; - - /** - * UpdateOfficeBankAccountCurrencyMappingSchema - * @type { object } - * @property { string } currency - * @property { string } bankAccountId - */ - export const UpdateOfficeBankAccountCurrencyMappingSchema = z - .object({ currency: z.string(), bankAccountId: z.string() }) - .readonly(); - export type UpdateOfficeBankAccountCurrencyMapping = z.infer; - - /** - * UpdateOfficeRequestSchema - * @type { object } - * @property { string } name Office Name - * @property { string } symbol Office Symbol - * @property { number } invoicePrefix Office Invoice Prefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage Office Default Language - * @property { string } locale - * @property { string } vatId Office Vat Id - * @property { string } taxNumber Office Tax Number - * @property { UpdateOfficePaymentTermsRequest } termsExport Office Terms Export - * @property { UpdateOfficePaymentTermsRequest } termsImport Office Terms Import - * @property { boolean } showPaymentInstructions Office Show Payment Instructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { string } countryId Office country id - * @property { string } defaultCurrencyId Office default currency id - * @property { string } representingBusinessPartnerId Representing business partner id - * @property { string[] } availableCurrencyIds Office availableCurrencyIds - * @property { string } generalLedgerSystem Office general ledger system - * @property { boolean } factoringReportingEnabled - * @property { UpdateOfficeBankAccountCurrencyMapping[] } bankAccountCurrencyMapping Office bank account currency mapping - */ - export const UpdateOfficeRequestSchema = z - .object({ - name: z.string().describe("Office Name"), - symbol: z.string().describe("Office Symbol"), - invoicePrefix: z.number().describe("Office Invoice Prefix"), - autoClosePositionsAfterDays: z.number(), - defaultLanguage: z.string().describe("Office Default Language"), - locale: CommonModels.LocaleEnumSchema, - vatId: z.string().describe("Office Vat Id"), - taxNumber: z.string().describe("Office Tax Number"), - termsExport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Export"), - termsImport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Import"), - showPaymentInstructions: z.boolean().describe("Office Show Payment Instructions"), - showCompanyRegistrationNumber: z.boolean(), - reportInvoicesToHungarianTaxAuthority: z.boolean(), - restrictPositionInvolvedParties: z.boolean(), - showWatermarkOnDocuments: z.boolean(), - showInvoiceVatLinesInOfficeCurrency: z.boolean(), - usePartnerMatchCodes: z.boolean(), - restrictFinancePartnersToRelationship: z.boolean(), - costCenterId: z.string(), - minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }), - minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }), - minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }), - minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }), - countryId: z.string().describe("Office country id"), - defaultCurrencyId: z.string().describe("Office default currency id"), - representingBusinessPartnerId: z.string().describe("Representing business partner id"), - availableCurrencyIds: z.array(z.string()).readonly().describe("Office availableCurrencyIds"), - generalLedgerSystem: z.string().describe("Office general ledger system"), - factoringReportingEnabled: z.boolean(), - bankAccountCurrencyMapping: z - .array(UpdateOfficeBankAccountCurrencyMappingSchema) - .readonly() - .describe("Office bank account currency mapping"), - }) - .readonly(); - export type UpdateOfficeRequest = z.infer; - - /** - * UploadOfficeDocumentRequestDtoSchema - * @type { object } - * @property { string } fileName File name with extension - * @property { string } mimeType MIME type of the file - * @property { number } fileSize Size of the file - * @property { string } language Language of the document - * @property { string } documentPart Part of the document this image represents - */ - export const UploadOfficeDocumentRequestDtoSchema = z - .object({ - fileName: z.string().describe("File name with extension"), - mimeType: z.string().describe("MIME type of the file"), - fileSize: z.number().describe("Size of the file"), - language: CommonModels.LanguageEnumSchema.describe("Language of the document"), - documentPart: OfficeDocumentPartEnumSchema.describe("Part of the document this image represents"), - }) - .readonly(); - export type UploadOfficeDocumentRequestDto = z.infer; - - /** - * OfficeListItemResponseSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { number } numberOfEmployees - */ - export const OfficeListItemResponseSchema = z - .object({ id: z.string(), name: z.string(), numberOfEmployees: z.number() }) - .readonly(); - export type OfficeListItemResponse = z.infer; - - /** - * OfficeFilterDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } search - */ - export const OfficeFilterDtoSchema = z.object({ name: z.string().describe("Name"), search: z.string() }).readonly(); - export type OfficeFilterDto = z.infer; - - /** - * OfficeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const OfficeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type OfficeLabelFilterDto = z.infer; - - /** - * CreateOfficeRequestSchema - * @type { object } - * @property { string } name - */ - export const CreateOfficeRequestSchema = z.object({ name: z.string() }).readonly(); - export type CreateOfficeRequest = z.infer; - - /** - * DocumentImageUploadInstructionsDtoSchema - * @type { object } - * @property { string } method HTTP method to use for upload - * @property { string } url URL to upload the file to - * @property { string } documentId ID of the created/updated document setting - */ - export const DocumentImageUploadInstructionsDtoSchema = z - .object({ - method: z.string().describe("HTTP method to use for upload"), - url: z.string().describe("URL to upload the file to"), - documentId: z.string().describe("ID of the created/updated document setting"), - }) - .readonly(); - export type DocumentImageUploadInstructionsDto = z.infer; - - /** - * CreateOfficeBankAccountDtoSchema - * @type { object } - * @property { string } name Bank account name - * @property { string } bankName Bank name - * @property { string } iban IBAN - * @property { string } swiftBic SWIFT/BIC code - * @property { boolean } useFooterOnInvoice Use footer on invoice - */ - export const CreateOfficeBankAccountDtoSchema = z - .object({ - name: z.string().describe("Bank account name"), - bankName: z.string().describe("Bank name"), - iban: z.string().describe("IBAN"), - swiftBic: z.string().describe("SWIFT/BIC code"), - useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), - }) - .readonly(); - export type CreateOfficeBankAccountDto = z.infer; - - /** - * UpdateOfficeBankAccountDtoSchema - * @type { object } - * @property { string } name Bank account name - * @property { string } bankName Bank name - * @property { string } iban IBAN - * @property { string } swiftBic SWIFT/BIC code - * @property { boolean } useFooterOnInvoice Use footer on invoice - * @property { boolean } isFactoringBank Is factoring bank - */ - export const UpdateOfficeBankAccountDtoSchema = z - .object({ - name: z.string().describe("Bank account name"), - bankName: z.string().describe("Bank name"), - iban: z.string().describe("IBAN"), - swiftBic: z.string().describe("SWIFT/BIC code"), - useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), - isFactoringBank: z.boolean().describe("Is factoring bank"), - }) - .readonly(); - export type UpdateOfficeBankAccountDto = z.infer; - - /** - * UploadOfficeBankAccountFooterRequestDtoSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType File MIME type - * @property { number } fileSize Size of the file - */ - export const UploadOfficeBankAccountFooterRequestDtoSchema = z - .object({ - fileName: z.string().describe("File name"), - mimeType: z.string().describe("File MIME type"), - fileSize: z.number().describe("Size of the file"), - }) - .readonly(); - export type UploadOfficeBankAccountFooterRequestDto = z.infer; - - /** - * OfficesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const OfficesPaginateOrderParamEnumSchema = z.enum(["name"]); - export type OfficesPaginateOrderParamEnum = z.infer; - export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema.enum; - - /** - * OfficesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficeListItemResponse[] } items - */ - export const OfficesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(OfficeListItemResponseSchema).readonly() }).readonly().shape, - }); - export type OfficesPaginateResponse = z.infer; - - /** - * FindAllLabelsResponseSchema - * @type { array } - */ - export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type FindAllLabelsResponse = z.infer; - - /** - * OfficesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const OfficesPaginateLabelsOrderParamEnumSchema = z.enum(["name"]); - export type OfficesPaginateLabelsOrderParamEnum = z.infer; - export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderParamEnumSchema.enum; - - /** - * OfficesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const OfficesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type OfficesPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/offices/offices.queries.ts b/test/generated/dist/offices/offices.queries.ts deleted file mode 100644 index a752a7b..0000000 --- a/test/generated/dist/offices/offices.queries.ts +++ /dev/null @@ -1,510 +0,0 @@ -import axios, { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { OfficesAcl } from "./offices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { OfficesModels } from "./offices.models"; -import { OfficesApi } from "./offices.api"; - -export namespace OfficesQueries { - export const moduleName = QueryModule.Offices; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: OfficesModels.OfficeFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string) => - [...keys.all, "/offices", "infinite", limit, order, filter, cursor] as const, - findAllLabels: (search?: string) => [...keys.all, "/offices/labels", search] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: OfficesModels.OfficeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: OfficesModels.OfficeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/labels/paginate", "infinite", limit, order, filter, cursor] as const, - get: (id: string) => [...keys.all, "/offices/:id", id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate offices - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: OfficesModels.OfficeFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => OfficesApi.paginate(limit, order, filter, page, cursor, config), - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate offices - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: OfficesModels.OfficeFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => OfficesApi.paginate(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create new office - * @permission Requires `canUseCreate` ability - * @param { OfficesModels.CreateOfficeRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(OfficesAcl.canUseCreate()); - return OfficesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindAllLabels` - * @summary List all offices with only their labels - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllLabels = ( - { search }: { search?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.findAllLabels(search), - queryFn: () => OfficesApi.findAllLabels(search, config), - ...options, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate offices with only their labels - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: OfficesModels.OfficeLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => OfficesApi.paginateLabels(limit, order, filter, page, cursor, config), - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate offices with only their labels - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: OfficesModels.OfficeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useGet` - * @summary Get office by id - * @permission Requires `canUseGet` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(id), - queryFn: () => { - checkAcl(OfficesAcl.canUseGet()); - return OfficesApi.get(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update office - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { OfficesModels.UpdateOfficeRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(OfficesAcl.canUseUpdate()); - return OfficesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUploadDocumentImage` - * @summary Upload document image for an office - * @permission Requires `canUseUploadDocumentImage` ability - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UploadOfficeDocumentRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useUploadDocumentImage = ( - options?: AppMutationOptions< - typeof OfficesApi.uploadDocumentImage, - { - officeId: string; - data: OfficesModels.UploadOfficeDocumentRequestDto; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId })); - const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCreateBankAccount` - * @summary Create office bank account - * @permission Requires `canUseCreateBankAccount` ability - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.CreateOfficeBankAccountDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateBankAccount = ( - options?: AppMutationOptions< - typeof OfficesApi.createBankAccount, - { officeId: string; data: OfficesModels.CreateOfficeBankAccountDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId })); - return OfficesApi.createBankAccount(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateBankAccount` - * @summary Update office bank account - * @permission Requires `canUseUpdateBankAccount` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UpdateOfficeBankAccountDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBankAccount = ( - options?: AppMutationOptions< - typeof OfficesApi.updateBankAccount, - { accountId: string; officeId: string; data: OfficesModels.UpdateOfficeBankAccountDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ accountId, officeId, data }) => { - checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId })); - return OfficesApi.updateBankAccount(accountId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteBankAccount` - * @summary Delete office bank account - * @permission Requires `canUseDeleteBankAccount` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteBankAccount = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ accountId, officeId }) => { - checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId })); - return OfficesApi.deleteBankAccount(accountId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUploadBankAccountFooter` - * @summary Upload office bank account footer - * @permission Requires `canUseUploadBankAccountFooter` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UploadOfficeBankAccountFooterRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useUploadBankAccountFooter = ( - options?: AppMutationOptions< - typeof OfficesApi.uploadBankAccountFooter, - { - accountId: string; - officeId: string; - data: OfficesModels.UploadOfficeBankAccountFooterRequestDto; - file?: File; - abortController?: AbortController; - onUploadProgress?: (progress: { loaded: number; total: number }) => void; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId })); - const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/packageTypes/packageTypes.acl.ts b/test/generated/dist/packageTypes/packageTypes.acl.ts deleted file mode 100644 index 625e4db..0000000 --- a/test/generated/dist/packageTypes/packageTypes.acl.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PackageTypesAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "PackageType"] as AbilityTuple<"Create", "PackageType">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "PackageType"] as AbilityTuple<"Read", "PackageType">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "PackageType"] as AbilityTuple<"Update", "PackageType">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "PackageType"] as AbilityTuple<"Archive", "PackageType">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "PackageType"] as AbilityTuple<"Archive", "PackageType">; -} diff --git a/test/generated/dist/packageTypes/packageTypes.api.ts b/test/generated/dist/packageTypes/packageTypes.api.ts deleted file mode 100644 index 802998e..0000000 --- a/test/generated/dist/packageTypes/packageTypes.api.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PackageTypesModels } from "./packageTypes.models"; - -export namespace PackageTypesApi { - export const paginate = ( - limit: number, - order?: string, - filter?: PackageTypesModels.PackageTypePaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, `/package-types`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types`, - ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), - config, - ); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: PackageTypesModels.PackageTypeLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, - `/package-types/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}`, - config, - ); - }; - export const update = ( - id: string, - data: PackageTypesModels.UpdatePackageTypeRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}`, - ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/packageTypes/packageTypes.configs.ts b/test/generated/dist/packageTypes/packageTypes.configs.ts deleted file mode 100644 index 786762d..0000000 --- a/test/generated/dist/packageTypes/packageTypes.configs.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PackageTypesModels } from "./packageTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PackageTypesQueries } from "./packageTypes.queries"; -import { PackageTypesAcl } from "./packageTypes.acl"; - -export namespace PackageTypesConfigs { - export const packageTypesConfig = { - meta: { - title: "Package Types", - }, - readAll: { - acl: PackageTypesAcl.canUsePaginate, - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - paginated: PackageTypesQueries.usePaginate, - infinite: PackageTypesQueries.usePaginateInfinite, - filters: { - schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - length: true, - width: true, - height: true, - unit: true, - archived: true, - code: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: PackageTypesAcl.canUseFindById, - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - query: PackageTypesQueries.useFindById, - }, - create: { - acl: PackageTypesAcl.canUseCreate, - schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, - mutation: PackageTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, - options: { - inputs: { - name: true, - length: true, - width: true, - height: true, - unit: true, - code: true, - }, - }, - }), - }, - update: { - acl: PackageTypesAcl.canUseUpdate, - schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, - mutation: PackageTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, - options: { - inputs: { - name: true, - length: true, - width: true, - height: true, - unit: true, - code: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: PackageTypesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PackageTypesQueries.usePaginateLabels, - infinite: PackageTypesQueries.usePaginateLabelsInfinite, - filters: { - schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/packageTypes/packageTypes.models.ts b/test/generated/dist/packageTypes/packageTypes.models.ts deleted file mode 100644 index ab3d38c..0000000 --- a/test/generated/dist/packageTypes/packageTypes.models.ts +++ /dev/null @@ -1,572 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PackageTypesModels { - /** - * PackageTypeCodeEnumSchema - * @type { enum } - */ - export const PackageTypeCodeEnumSchema = z.enum([ - "1A", - "1B", - "1D", - "1F", - "1G", - "1W", - "2C", - "3A", - "3H", - "43", - "44", - "4A", - "4B", - "4C", - "4D", - "4F", - "4G", - "4H", - "5H", - "5L", - "5M", - "6H", - "6P", - "7A", - "7B", - "8A", - "8B", - "8C", - "AA", - "AB", - "AC", - "AD", - "AE", - "AF", - "AG", - "AH", - "AI", - "AJ", - "AL", - "AM", - "AP", - "AT", - "AV", - "B4", - "BA", - "BB", - "BC", - "BD", - "BE", - "BF", - "BG", - "BH", - "BI", - "BJ", - "BK", - "BL", - "BM", - "BN", - "BO", - "BP", - "BQ", - "BR", - "BS", - "BT", - "BU", - "BV", - "BW", - "BX", - "BY", - "BZ", - "CA", - "CB", - "CC", - "CD", - "CE", - "CF", - "CG", - "CH", - "CI", - "CJ", - "CK", - "CL", - "CM", - "CN", - "CO", - "CP", - "CQ", - "CR", - "CS", - "CT", - "CU", - "CV", - "CW", - "CX", - "CY", - "CZ", - "DA", - "DB", - "DC", - "DG", - "DH", - "DI", - "DJ", - "DK", - "DL", - "DM", - "DN", - "DP", - "DR", - "DS", - "DT", - "DU", - "DV", - "DW", - "DX", - "DY", - "EC", - "ED", - "EE", - "EF", - "EG", - "EH", - "EI", - "EN", - "FB", - "FC", - "FD", - "FE", - "FI", - "FL", - "FO", - "FP", - "FR", - "FT", - "FW", - "FX", - "GB", - "GI", - "GL", - "GR", - "GU", - "GY", - "GZ", - "HA", - "HB", - "HC", - "HG", - "HN", - "HR", - "IA", - "IB", - "IC", - "ID", - "IE", - "IF", - "IG", - "IH", - "IK", - "IL", - "IN", - "IZ", - "JB", - "JC", - "JG", - "JR", - "JT", - "JY", - "KG", - "KI", - "LE", - "LG", - "LT", - "LU", - "LV", - "LZ", - "MA", - "MB", - "MC", - "ME", - "MR", - "MS", - "MT", - "MW", - "MX", - "NA", - "NE", - "NF", - "NG", - "NS", - "NT", - "NU", - "NV", - "OA", - "OB", - "OC", - "OD", - "OE", - "OF", - "OK", - "OT", - "OU", - "P2", - "PA", - "PB", - "PC", - "PD", - "PE", - "PF", - "PG", - "PH", - "PI", - "PJ", - "PK", - "PL", - "PN", - "PO", - "PP", - "PR", - "PT", - "PU", - "PV", - "PX", - "PY", - "PZ", - "QA", - "QB", - "QC", - "QD", - "QF", - "QG", - "QH", - "QJ", - "QK", - "QL", - "QM", - "QN", - "QP", - "QQ", - "QR", - "QS", - "RD", - "RG", - "RJ", - "RK", - "RL", - "RO", - "RT", - "RZ", - "SA", - "SB", - "SC", - "SD", - "SE", - "SH", - "SI", - "SK", - "SL", - "SM", - "SO", - "SP", - "SS", - "ST", - "SU", - "SV", - "SW", - "SY", - "SZ", - "T1", - "TB", - "TC", - "TD", - "TE", - "TG", - "TI", - "TK", - "TL", - "TN", - "TO", - "TR", - "TS", - "TT", - "TU", - "TV", - "TW", - "TY", - "TZ", - "UC", - "UN", - "VA", - "VG", - "VI", - "VK", - "VL", - "VO", - "VP", - "VQ", - "VN", - "VR", - "VS", - "VY", - "WA", - "WB", - "WC", - "WD", - "WF", - "WG", - "WH", - "WJ", - "WK", - "WL", - "WM", - "WN", - "WP", - "WQ", - "WR", - "WS", - "WT", - "WU", - "WV", - "WW", - "WX", - "WY", - "WZ", - "XA", - "XB", - "XC", - "XD", - "XF", - "XG", - "XH", - "XJ", - "XK", - "YA", - "YB", - "YC", - "YD", - "YF", - "YG", - "YH", - "YJ", - "YK", - "YL", - "YM", - "YN", - "YP", - "YQ", - "YR", - "YS", - "YT", - "YV", - "YW", - "YX", - "YY", - "YZ", - "ZA", - "ZB", - "ZC", - "ZD", - "ZF", - "ZG", - "ZH", - "ZJ", - "ZK", - "ZL", - "ZM", - "ZN", - "ZP", - "ZQ", - "ZR", - "ZS", - "ZT", - "ZU", - "ZV", - "ZW", - "ZX", - "ZY", - "ZZ", - ]); - export type PackageTypeCodeEnum = z.infer; - export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; - - /** - * PackageTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type PackageTypeEmployeeDTO = z.infer; - - /** - * PackageTypeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the package type - * @property { string } name Unique name for the package type - * @property { number } length Length of the package type - * @property { number } width Width of the package type - * @property { number } height Height of the package type - * @property { string } unit Measurement unit for dimensions - * @property { boolean } archived Indicates if the package type is archived - * @property { PackageTypeCodeEnum } code - * @property { string } createdById - * @property { PackageTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PackageTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const PackageTypeResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier for the package type"), - name: z.string().describe("Unique name for the package type"), - length: z.number().describe("Length of the package type").nullish(), - width: z.number().describe("Width of the package type").nullish(), - height: z.number().describe("Height of the package type").nullish(), - unit: z.string().describe("Measurement unit for dimensions"), - archived: z.boolean().describe("Indicates if the package type is archived"), - code: PackageTypeCodeEnumSchema.nullish(), - createdById: z.string().nullish(), - createdBy: PackageTypeEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: PackageTypeEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type PackageTypeResponseDTO = z.infer; - - /** - * CreatePackageTypeRequestDTOSchema - * @type { object } - * @property { string } name Unique name for the package type - * @property { number } length Length of the package type - * @property { number } width Width of the package type - * @property { number } height Height of the package type - * @property { string } unit Measurement unit for dimensions - * @property { PackageTypeCodeEnum } code - */ - export const CreatePackageTypeRequestDTOSchema = z - .object({ - name: z.string().describe("Unique name for the package type"), - length: z.number().describe("Length of the package type").nullish(), - width: z.number().describe("Width of the package type").nullish(), - height: z.number().describe("Height of the package type").nullish(), - unit: z.string().describe("Measurement unit for dimensions"), - code: PackageTypeCodeEnumSchema.nullish(), - }) - .readonly(); - export type CreatePackageTypeRequestDTO = z.infer; - - /** - * UpdatePackageTypeRequestDTOSchema - * @type { object } - * @property { string } name Updated name for package type - * @property { number } length Updated length of the package type - * @property { number } width Updated width of the package type - * @property { number } height Updated height of the package type - * @property { string } unit Updated measurement unit for dimensions - * @property { PackageTypeCodeEnum } code - */ - export const UpdatePackageTypeRequestDTOSchema = z - .object({ - name: z.string().describe("Updated name for package type"), - length: z.number().describe("Updated length of the package type").nullable(), - width: z.number().describe("Updated width of the package type").nullable(), - height: z.number().describe("Updated height of the package type").nullable(), - unit: z.string().describe("Updated measurement unit for dimensions"), - code: PackageTypeCodeEnumSchema, - }) - .readonly(); - export type UpdatePackageTypeRequestDTO = z.infer; - - /** - * PackageTypePaginationFilterDtoSchema - * @type { object } - * @property { boolean } archived Archived - * @property { string } search - */ - export const PackageTypePaginationFilterDtoSchema = z - .object({ archived: z.boolean().describe("Archived"), search: z.string() }) - .readonly(); - export type PackageTypePaginationFilterDto = z.infer; - - /** - * PackageTypeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const PackageTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type PackageTypeLabelFilterDto = z.infer; - - /** - * PackageTypesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const PackageTypesPaginateOrderParamEnumSchema = z.enum([ - "matchCode", - "description", - "length", - "width", - "height", - "unit", - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PackageTypesPaginateOrderParamEnum = z.infer; - export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParamEnumSchema.enum; - - /** - * PackageTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PackageTypeResponseDTO[] } items - */ - export const PackageTypesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PackageTypeResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PackageTypesPaginateResponse = z.infer; - - /** - * PackageTypesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PackageTypesPaginateLabelsOrderParamEnumSchema = z.enum([ - "matchCode", - "description", - "length", - "width", - "height", - "unit", - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PackageTypesPaginateLabelsOrderParamEnum = z.infer; - export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabelsOrderParamEnumSchema.enum; - - /** - * PackageTypesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PackageTypesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PackageTypesPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/packageTypes/packageTypes.queries.ts b/test/generated/dist/packageTypes/packageTypes.queries.ts deleted file mode 100644 index 2550517..0000000 --- a/test/generated/dist/packageTypes/packageTypes.queries.ts +++ /dev/null @@ -1,365 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PackageTypesAcl } from "./packageTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PackageTypesModels } from "./packageTypes.models"; -import { PackageTypesApi } from "./packageTypes.api"; - -export namespace PackageTypesQueries { - export const moduleName = QueryModule.PackageTypes; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: PackageTypesModels.PackageTypePaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/package-types", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: PackageTypesModels.PackageTypePaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/package-types", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: PackageTypesModels.PackageTypeLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/package-types/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: PackageTypesModels.PackageTypeLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/package-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/package-types/:id", id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Package Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: PackageTypesModels.PackageTypePaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Package Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: PackageTypesModels.PackageTypePaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create a new Package Type - * @permission Requires `canUseCreate` ability - * @param { PackageTypesModels.CreatePackageTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof PackageTypesApi.create, - { data: PackageTypesModels.CreatePackageTypeRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PackageTypesAcl.canUseCreate()); - return PackageTypesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate package type labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: PackageTypesModels.PackageTypeLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate package type labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: PackageTypesModels.PackageTypeLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get Package Type by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PackageTypesAcl.canUseFindById()); - return PackageTypesApi.findById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update Package Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PackageTypesModels.UpdatePackageTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof PackageTypesApi.update, - { id: string; data: PackageTypesModels.UpdatePackageTypeRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PackageTypesAcl.canUseUpdate()); - return PackageTypesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive Package Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PackageTypesAcl.canUseArchive()); - return PackageTypesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive Package Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PackageTypesAcl.canUseUnarchive()); - return PackageTypesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/partnerNetworks/partnerNetworks.acl.ts b/test/generated/dist/partnerNetworks/partnerNetworks.acl.ts deleted file mode 100644 index ff36863..0000000 --- a/test/generated/dist/partnerNetworks/partnerNetworks.acl.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PartnerNetworksAcl { - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "PartnerNetwork"] as AbilityTuple<"Create", "PartnerNetwork">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "PartnerNetwork"] as AbilityTuple<"Read", "PartnerNetwork">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "PartnerNetwork"] as AbilityTuple<"Update", "PartnerNetwork">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "PartnerNetwork"] as AbilityTuple<"Archive", "PartnerNetwork">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "PartnerNetwork"] as AbilityTuple<"Archive", "PartnerNetwork">; -} diff --git a/test/generated/dist/partnerNetworks/partnerNetworks.api.ts b/test/generated/dist/partnerNetworks/partnerNetworks.api.ts deleted file mode 100644 index 060f922..0000000 --- a/test/generated/dist/partnerNetworks/partnerNetworks.api.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; - -export namespace PartnerNetworksApi { - export const paginateLabels = ( - limit: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, - `/partner-networks/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const paginate = ( - limit: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, - `/partner-networks`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks`, - ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), - config, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}`, - config, - ); - }; - export const update = ( - id: string, - data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}`, - ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/partnerNetworks/partnerNetworks.configs.ts b/test/generated/dist/partnerNetworks/partnerNetworks.configs.ts deleted file mode 100644 index 1f87ddf..0000000 --- a/test/generated/dist/partnerNetworks/partnerNetworks.configs.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PartnerNetworksQueries } from "./partnerNetworks.queries"; -import { PartnerNetworksAcl } from "./partnerNetworks.acl"; - -export namespace PartnerNetworksConfigs { - export const partnerNetworksConfig = { - meta: { - title: "Partner Networks", - }, - readAll: { - acl: PartnerNetworksAcl.canUsePaginate, - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - paginated: PartnerNetworksQueries.usePaginate, - infinite: PartnerNetworksQueries.usePaginateInfinite, - filters: { - schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: PartnerNetworksAcl.canUseFindById, - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - query: PartnerNetworksQueries.useFindById, - }, - create: { - acl: PartnerNetworksAcl.canUseCreate, - schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, - mutation: PartnerNetworksQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), - }, - update: { - acl: PartnerNetworksAcl.canUseUpdate, - schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, - mutation: PartnerNetworksQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: PartnerNetworksAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PartnerNetworksQueries.usePaginateLabels, - infinite: PartnerNetworksQueries.usePaginateLabelsInfinite, - filters: { - schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/partnerNetworks/partnerNetworks.models.ts b/test/generated/dist/partnerNetworks/partnerNetworks.models.ts deleted file mode 100644 index 694c1ed..0000000 --- a/test/generated/dist/partnerNetworks/partnerNetworks.models.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PartnerNetworksModels { - /** - * PartnerNetworkEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type PartnerNetworkEmployeeDTO = z.infer; - - /** - * PartnerNetworkResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the partner network - * @property { string } name Name of the partner network - * @property { boolean } archived Whether the partner network is archived - * @property { string } createdById - * @property { PartnerNetworkEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PartnerNetworkEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const PartnerNetworkResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the partner network"), - name: z.string().describe("Name of the partner network"), - archived: z.boolean().describe("Whether the partner network is archived"), - createdById: z.string().nullish(), - createdBy: PartnerNetworkEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: PartnerNetworkEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type PartnerNetworkResponseDTO = z.infer; - - /** - * PartnerNetworkLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const PartnerNetworkLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type PartnerNetworkLabelFilterDto = z.infer; - - /** - * PartnerNetworkPaginationFilterDtoSchema - * @type { object } - * @property { string } search Free search - * @property { boolean } archived - */ - export const PartnerNetworkPaginationFilterDtoSchema = z - .object({ search: z.string().describe("Free search"), archived: z.boolean() }) - .readonly(); - export type PartnerNetworkPaginationFilterDto = z.infer; - - /** - * CreatePartnerNetworkRequestDTOSchema - * @type { object } - * @property { string } name Name of the partner network - */ - export const CreatePartnerNetworkRequestDTOSchema = z - .object({ name: z.string().describe("Name of the partner network") }) - .readonly(); - export type CreatePartnerNetworkRequestDTO = z.infer; - - /** - * UpdatePartnerNetworkRequestDTOSchema - * @type { object } - * @property { string } name Name of the partner network - */ - export const UpdatePartnerNetworkRequestDTOSchema = z - .object({ name: z.string().describe("Name of the partner network") }) - .readonly(); - export type UpdatePartnerNetworkRequestDTO = z.infer; - - /** - * PartnerNetworksPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PartnerNetworksPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PartnerNetworksPaginateLabelsOrderParamEnum = z.infer< - typeof PartnerNetworksPaginateLabelsOrderParamEnumSchema - >; - export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPaginateLabelsOrderParamEnumSchema.enum; - - /** - * PartnerNetworksPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PartnerNetworksPaginateLabelsResponse = z.infer; - - /** - * PartnerNetworksPaginateOrderParamEnumSchema - * @type { enum } - */ - export const PartnerNetworksPaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PartnerNetworksPaginateOrderParamEnum = z.infer; - export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrderParamEnumSchema.enum; - - /** - * PartnerNetworksPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerNetworkResponseDTO[] } items - */ - export const PartnerNetworksPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PartnerNetworksPaginateResponse = z.infer; -} diff --git a/test/generated/dist/partnerNetworks/partnerNetworks.queries.ts b/test/generated/dist/partnerNetworks/partnerNetworks.queries.ts deleted file mode 100644 index cd0e2ae..0000000 --- a/test/generated/dist/partnerNetworks/partnerNetworks.queries.ts +++ /dev/null @@ -1,370 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PartnerNetworksAcl } from "./partnerNetworks.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; -import { PartnerNetworksApi } from "./partnerNetworks.api"; - -export namespace PartnerNetworksQueries { - export const moduleName = QueryModule.PartnerNetworks; - - export const keys = { - all: [moduleName] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/partner-networks/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/partner-networks/labels/paginate", "infinite", limit, order, filter, cursor] as const, - paginate: ( - limit?: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/partner-networks", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/partner-networks", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/partner-networks/:id", id] as const, - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate partner networks with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate partner networks with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginate` - * @summary Paginate Partner Networks - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Partner Networks - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { - limit: number; - order?: string; - filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create a new Partner Network - * @permission Requires `canUseCreate` ability - * @param { PartnerNetworksModels.CreatePartnerNetworkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof PartnerNetworksApi.create, - { data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PartnerNetworksAcl.canUseCreate()); - return PartnerNetworksApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get Partner Network by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUseFindById()); - return PartnerNetworksApi.findById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update Partner Network - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof PartnerNetworksApi.update, - { id: string; data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PartnerNetworksAcl.canUseUpdate()); - return PartnerNetworksApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive Partner Network - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PartnerNetworksAcl.canUseArchive()); - return PartnerNetworksApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive Partner Network - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PartnerNetworksAcl.canUseUnarchive()); - return PartnerNetworksApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/paymentConfirmations/paymentConfirmations.acl.ts b/test/generated/dist/paymentConfirmations/paymentConfirmations.acl.ts deleted file mode 100644 index 972a857..0000000 --- a/test/generated/dist/paymentConfirmations/paymentConfirmations.acl.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PaymentConfirmationsAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read payment confirmation items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate payment confirmation document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ - export const canUseGenerate = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; - - /** - * Use for `useGetEml` mutation ability. For global ability, omit the object parameter. - * @description Download payment confirmation as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetEml` mutation - */ - export const canUseGetEml = (object?: { officeId: string }) => - ["Read", object ? subject("PositionInvoice", object) : "PositionInvoice"] as AbilityTuple< - "Read", - "PositionInvoice" | (ForcedSubject<"PositionInvoice"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/paymentConfirmations/paymentConfirmations.api.ts b/test/generated/dist/paymentConfirmations/paymentConfirmations.api.ts deleted file mode 100644 index 2f69bde..0000000 --- a/test/generated/dist/paymentConfirmations/paymentConfirmations.api.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; - -export namespace PaymentConfirmationsApi { - export const get = ( - officeId: string, - filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, - limit: number, - order?: string, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, - `/offices/${officeId}/payment-confirmations`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const generate = ( - officeId: string, - data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payment-confirmations/generate`, - ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const getEml = ( - officeId: string, - data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payment-confirmations/eml`, - ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; -} diff --git a/test/generated/dist/paymentConfirmations/paymentConfirmations.configs.ts b/test/generated/dist/paymentConfirmations/paymentConfirmations.configs.ts deleted file mode 100644 index 79c3145..0000000 --- a/test/generated/dist/paymentConfirmations/paymentConfirmations.configs.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; -import { PaymentConfirmationsQueries } from "./paymentConfirmations.queries"; -import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; - -export namespace PaymentConfirmationsConfigs { - export const paymentConfirmationsConfig = { - meta: { - title: "Payment Confirmations", - }, - readAll: { - acl: PaymentConfirmationsAcl.canUseGet, - schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, - paginated: PaymentConfirmationsQueries.useGet, - infinite: PaymentConfirmationsQueries.useGetInfinite, - filters: { - schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, - options: { - inputs: { - businessPartnerId: true, - paymentDate: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, - options: { - columns: { - invoiceId: true, - invoiceNumber: true, - invoiceDate: true, - invoiceAmount: true, - amount: true, - currencyNotation: true, - reference: true, - position: true, - paymentDate: true, - }, - sortable: PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/paymentConfirmations/paymentConfirmations.models.ts b/test/generated/dist/paymentConfirmations/paymentConfirmations.models.ts deleted file mode 100644 index f7c4296..0000000 --- a/test/generated/dist/paymentConfirmations/paymentConfirmations.models.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PaymentConfirmationsModels { - /** - * PaymentConfirmationPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ - export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); - export type PaymentConfirmationPositionDto = z.infer; - - /** - * PaymentConfirmationItemDtoSchema - * @type { object } - * @property { string } invoiceId Invoice ID - * @property { string } invoiceNumber Invoice number - * @property { string } invoiceDate Invoice date - * @property { number } invoiceAmount Invoice amount - * @property { number } amount Payment amount - * @property { string } currencyNotation Currency notation - * @property { string } reference Reference - * @property { PaymentConfirmationPositionDto } position Position information - * @property { string } paymentDate Payment date - */ - export const PaymentConfirmationItemDtoSchema = z - .object({ - invoiceId: z.string().describe("Invoice ID"), - invoiceNumber: z.string().describe("Invoice number"), - invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date"), - invoiceAmount: z.number().describe("Invoice amount"), - amount: z.number().describe("Payment amount"), - currencyNotation: z.string().describe("Currency notation"), - reference: z.string().describe("Reference").nullish(), - position: PaymentConfirmationPositionDtoSchema.describe("Position information"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), - }) - .readonly(); - export type PaymentConfirmationItemDto = z.infer; - - /** - * PaymentConfirmationItemFilterDtoSchema - * @type { object } - * @property { string } businessPartnerId Business partner ID - * @property { string } paymentDate Payment date - */ - export const PaymentConfirmationItemFilterDtoSchema = z - .object({ - businessPartnerId: z.string().describe("Business partner ID"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), - }) - .readonly(); - export type PaymentConfirmationItemFilterDto = z.infer; - - /** - * GeneratePaymentConfirmationRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId Business partner ID - * @property { string } paymentDate Payment date - * @property { string } positionId Position ID (optional) - */ - export const GeneratePaymentConfirmationRequestDtoSchema = z - .object({ - businessPartnerId: z.string().describe("Business partner ID"), - paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), - positionId: z.string().describe("Position ID (optional)").nullish(), - }) - .readonly(); - export type GeneratePaymentConfirmationRequestDto = z.infer; - - /** - * PaymentConfirmationsGetOrderParamEnumSchema - * @type { enum } - */ - export const PaymentConfirmationsGetOrderParamEnumSchema = z.enum(["paymentDate", "invoiceNumber", "amount"]); - export type PaymentConfirmationsGetOrderParamEnum = z.infer; - export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrderParamEnumSchema.enum; - - /** - * PaymentConfirmationsGetResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PaymentConfirmationItemDto[] } items - */ - export const PaymentConfirmationsGetResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).readonly() }).readonly().shape, - }); - export type PaymentConfirmationsGetResponse = z.infer; -} diff --git a/test/generated/dist/paymentConfirmations/paymentConfirmations.queries.ts b/test/generated/dist/paymentConfirmations/paymentConfirmations.queries.ts deleted file mode 100644 index 265dcc4..0000000 --- a/test/generated/dist/paymentConfirmations/paymentConfirmations.queries.ts +++ /dev/null @@ -1,204 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; -import { PaymentConfirmationsApi } from "./paymentConfirmations.api"; - -export namespace PaymentConfirmationsQueries { - export const moduleName = QueryModule.PaymentConfirmations; - - export const keys = { - all: [moduleName] as const, - get: ( - officeId: string, - filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, - limit?: number, - order?: string, - page?: number, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/payment-confirmations", officeId, filter, limit, order, page, cursor] as const, - getInfinite: ( - officeId: string, - filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, - limit?: number, - order?: string, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/payment-confirmations", - "infinite", - officeId, - filter, - limit, - order, - cursor, - ] as const, - }; - - /** - * Query `useGet` - * @summary Get payment confirmation items - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { - officeId, - filter, - limit, - order, - page, - cursor, - }: { - officeId: string; - filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto; - limit: number; - order?: string; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, filter, limit, order, page, cursor), - queryFn: () => { - checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId })); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useGetInfinite - * @summary Get payment confirmation items - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useGetInfinite = ( - { - officeId, - filter, - limit, - order, - cursor, - }: { - officeId: string; - filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto; - limit: number; - order?: string; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId })); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useGenerate` - recommended when file should not be cached - * @summary Generate payment confirmation PDF - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useGenerate = ( - options?: AppMutationOptions< - typeof PaymentConfirmationsApi.generate, - { officeId: string; data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId })); - return PaymentConfirmationsApi.generate(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGetEml` - recommended when file should not be cached - * @summary Get payment confirmation as EML file with PDF attachment - * @permission Requires `canUseGetEml` ability - * @param { string } mutation.officeId Path parameter - * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useGetEml = ( - options?: AppMutationOptions< - typeof PaymentConfirmationsApi.getEml, - { officeId: string; data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId })); - return PaymentConfirmationsApi.getEml(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/ports/ports.acl.ts b/test/generated/dist/ports/ports.acl.ts deleted file mode 100644 index 41bc6d7..0000000 --- a/test/generated/dist/ports/ports.acl.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PortsAcl { - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Port"] as AbilityTuple<"Create", "Port">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Port"] as AbilityTuple<"Update", "Port">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "Port"] as AbilityTuple<"Read", "Port">; -} diff --git a/test/generated/dist/ports/ports.api.ts b/test/generated/dist/ports/ports.api.ts deleted file mode 100644 index 46b8eac..0000000 --- a/test/generated/dist/ports/ports.api.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PortsModels } from "./ports.models"; - -export namespace PortsApi { - export const paginate = ( - limit: number, - order?: string, - filter?: PortsModels.PortPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: PortsModels.PortsPaginateResponseSchema }, `/ports`, { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { - type: "query", - name: "order", - }), - filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: PortsModels.CreatePortRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports`, - ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), - config, - ); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: PortsModels.PortLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, `/ports/labels/paginate`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports/${id}`, - ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), - config, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: PortsModels.PortResponseDTOSchema }, `/ports/${id}`, config); - }; -} diff --git a/test/generated/dist/ports/ports.configs.ts b/test/generated/dist/ports/ports.configs.ts deleted file mode 100644 index de7e09d..0000000 --- a/test/generated/dist/ports/ports.configs.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PortsModels } from "./ports.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PortsQueries } from "./ports.queries"; -import { PortsAcl } from "./ports.acl"; - -export namespace PortsConfigs { - export const portsConfig = { - meta: { - title: "Ports", - }, - readAll: { - acl: PortsAcl.canUsePaginate, - schema: PortsModels.PortResponseDTOSchema, - paginated: PortsQueries.usePaginate, - infinite: PortsQueries.usePaginateInfinite, - filters: { - schema: PortsModels.PortPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PortsModels.PortPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: PortsModels.PortResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - address: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PortsModels.PortsPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: PortsAcl.canUseFindById, - schema: PortsModels.PortResponseDTOSchema, - query: PortsQueries.useFindById, - }, - create: { - acl: PortsAcl.canUseCreate, - schema: PortsModels.CreatePortRequestDTOSchema, - mutation: PortsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PortsModels.CreatePortRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, - }), - }, - update: { - acl: PortsAcl.canUseUpdate, - schema: PortsModels.UpdatePortRequestDTOSchema, - mutation: PortsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PortsModels.UpdatePortRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: PortsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PortsQueries.usePaginateLabels, - infinite: PortsQueries.usePaginateLabelsInfinite, - filters: { - schema: PortsModels.PortLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PortsModels.PortLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PortsModels.PortsPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/ports/ports.models.ts b/test/generated/dist/ports/ports.models.ts deleted file mode 100644 index caec629..0000000 --- a/test/generated/dist/ports/ports.models.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PortsModels { - /** - * PortCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type PortCityDto = z.infer; - - /** - * PortCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ - export const PortCountryDtoSchema = z - .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) - .readonly(); - export type PortCountryDto = z.infer; - - /** - * PortAddressDtoSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { PortCityDto } city - * @property { string } district District name - * @property { PortCountryDto } country - */ - export const PortAddressDtoSchema = z - .object({ - street: z.string().describe("Street address"), - zip: z.string().describe("ZIP/Postal code"), - city: PortCityDtoSchema.nullish(), - district: z.string().describe("District name").nullish(), - country: PortCountryDtoSchema.nullish(), - }) - .readonly(); - export type PortAddressDto = z.infer; - - /** - * PortEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type PortEmployeeDTO = z.infer; - - /** - * PortResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the port - * @property { string } name Name of the port - * @property { string } matchCode Match code for the port - * @property { PortAddressDto } address Address details of the port - * @property { string } createdById - * @property { PortEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PortEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const PortResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the port"), - name: z.string().describe("Name of the port"), - matchCode: z.string().describe("Match code for the port"), - address: PortAddressDtoSchema.describe("Address details of the port"), - createdById: z.string().nullish(), - createdBy: PortEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: PortEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type PortResponseDTO = z.infer; - - /** - * PortPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter ports by name or match code - */ - export const PortPaginationFilterDtoSchema = z - .object({ search: z.string().describe("Search term to filter ports by name or match code") }) - .readonly(); - export type PortPaginationFilterDto = z.infer; - - /** - * PortLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const PortLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type PortLabelFilterDto = z.infer; - - /** - * CreatePortRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } matchCode - * @property { string } street Street address - * @property { string } secondaryStreet - * @property { string } zip ZIP / Postal code - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } district - */ - export const CreatePortRequestDTOSchema = z - .object({ - name: z.string(), - matchCode: z.string(), - street: z.string().describe("Street address"), - secondaryStreet: z.string().nullish(), - zip: z.string().describe("ZIP / Postal code"), - cityId: z.string().describe("City id"), - countryId: z.string().describe("Country id"), - district: z.string().nullish(), - }) - .readonly(); - export type CreatePortRequestDTO = z.infer; - - /** - * UpdatePortRequestDTOSchema - * @type { object } - * @property { string } name Updated name - * @property { string } matchCode Updated match code - * @property { string } street Updated street address - * @property { string } secondaryStreet Updated secondary street - * @property { string } zip Updated ZIP/Postal code - * @property { string } cityId Updated city id - * @property { string } countryId Updated country id - * @property { string } district - */ - export const UpdatePortRequestDTOSchema = z - .object({ - name: z.string().describe("Updated name"), - matchCode: z.string().describe("Updated match code"), - street: z.string().describe("Updated street address"), - secondaryStreet: z.string().describe("Updated secondary street"), - zip: z.string().describe("Updated ZIP/Postal code"), - cityId: z.string().describe("Updated city id"), - countryId: z.string().describe("Updated country id"), - district: z.string(), - }) - .readonly(); - export type UpdatePortRequestDTO = z.infer; - - /** - * PortsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const PortsPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PortsPaginateOrderParamEnum = z.infer; - export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enum; - - /** - * PortsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PortResponseDTO[] } items - */ - export const PortsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PortResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PortsPaginateResponse = z.infer; - - /** - * PortsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PortsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PortsPaginateLabelsOrderParamEnum = z.infer; - export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEnumSchema.enum; - - /** - * PortsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PortsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PortsPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/ports/ports.queries.ts b/test/generated/dist/ports/ports.queries.ts deleted file mode 100644 index 41a7842..0000000 --- a/test/generated/dist/ports/ports.queries.ts +++ /dev/null @@ -1,281 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PortsAcl } from "./ports.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PortsModels } from "./ports.models"; -import { PortsApi } from "./ports.api"; - -export namespace PortsQueries { - export const moduleName = QueryModule.Ports; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: PortsModels.PortPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/ports", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string) => - [...keys.all, "/ports", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: PortsModels.PortLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/ports/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: PortsModels.PortLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/ports/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/ports/:id", id] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Ports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: PortsModels.PortPaginationFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Ports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: PortsModels.PortPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create port - * @permission Requires `canUseCreate` ability - * @param { PortsModels.CreatePortRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PortsAcl.canUseCreate()); - return PortsApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate ports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: PortsModels.PortLabelFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate ports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: PortsModels.PortLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update port - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PortsModels.UpdatePortRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PortsAcl.canUseUpdate()); - return PortsApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get port by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PortsAcl.canUseFindById()); - return PortsApi.findById(id, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/positionAccount/positionAccount.acl.ts b/test/generated/dist/positionAccount/positionAccount.acl.ts deleted file mode 100644 index b5691fd..0000000 --- a/test/generated/dist/positionAccount/positionAccount.acl.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionAccountAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Read", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/positionAccount/positionAccount.api.ts b/test/generated/dist/positionAccount/positionAccount.api.ts deleted file mode 100644 index 817f5b6..0000000 --- a/test/generated/dist/positionAccount/positionAccount.api.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { PositionAccountModels } from "./positionAccount.models"; - -export namespace PositionAccountApi { - export const get = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/account`, - config, - ); - }; -} diff --git a/test/generated/dist/positionAccount/positionAccount.models.ts b/test/generated/dist/positionAccount/positionAccount.models.ts deleted file mode 100644 index c4b204a..0000000 --- a/test/generated/dist/positionAccount/positionAccount.models.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionAccountModels { - /** - * PositionAccountTotalsResponseDtoSchema - * @type { object } - * @property { number } totalBuyRates Total buy rates - * @property { number } totalSellRates Total sell rates - * @property { number } totalProfit Total profit - * @property { number } margin Margin percentage - * @property { number } displayAmount Display amount - * @property { string } displayCurrencyCode Display currency code - */ - export const PositionAccountTotalsResponseDtoSchema = z - .object({ - totalBuyRates: z.number().describe("Total buy rates"), - totalSellRates: z.number().describe("Total sell rates"), - totalProfit: z.number().describe("Total profit"), - margin: z.number().describe("Margin percentage").nullish(), - displayAmount: z.number().describe("Display amount"), - displayCurrencyCode: z.string().describe("Display currency code"), - }) - .readonly(); - export type PositionAccountTotalsResponseDto = z.infer; - - /** - * PositionAccountMasterTotalsDtoSchema - * @type { object } - * @property { PositionAccountTotalsResponseDto } totals - * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency - */ - export const PositionAccountMasterTotalsDtoSchema = z - .object({ - totals: PositionAccountTotalsResponseDtoSchema, - totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), - }) - .readonly(); - export type PositionAccountMasterTotalsDto = z.infer; - - /** - * ChildPositionAccountReferenceDtoSchema - * @type { object } - * @property { string } positionId - * @property { string } positionNumber - * @property { string } accountId - */ - export const ChildPositionAccountReferenceDtoSchema = z - .object({ positionId: z.string().nullish(), positionNumber: z.string(), accountId: z.string() }) - .readonly(); - export type ChildPositionAccountReferenceDto = z.infer; - - /** - * PositionAccountResponseDtoSchema - * @type { object } - * @property { string } id Account ID - * @property { string } positionId Position ID - * @property { string } invoiceId Invoice ID - * @property { CommonModels.PositionAccountItemDtoResponse[] } items Account items - * @property { PositionAccountTotalsResponseDto } totals - * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency - * @property { PositionAccountMasterTotalsDto } masterTotals - * @property { ChildPositionAccountReferenceDto[] } childPositionAccounts - */ - export const PositionAccountResponseDtoSchema = z - .object({ - id: z.string().describe("Account ID"), - positionId: z.string().describe("Position ID").nullish(), - invoiceId: z.string().describe("Invoice ID").nullish(), - items: z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly().describe("Account items"), - totals: PositionAccountTotalsResponseDtoSchema, - totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), - masterTotals: PositionAccountMasterTotalsDtoSchema.nullish(), - childPositionAccounts: z.array(ChildPositionAccountReferenceDtoSchema).readonly().nullish(), - }) - .readonly(); - export type PositionAccountResponseDto = z.infer; -} diff --git a/test/generated/dist/positionAccount/positionAccount.queries.ts b/test/generated/dist/positionAccount/positionAccount.queries.ts deleted file mode 100644 index ed77533..0000000 --- a/test/generated/dist/positionAccount/positionAccount.queries.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionAccountAcl } from "./positionAccount.acl"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { PositionAccountApi } from "./positionAccount.api"; - -export namespace PositionAccountQueries { - export const moduleName = QueryModule.PositionAccount; - - export const keys = { - all: [moduleName] as const, - get: (positionId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/account", positionId, officeId] as const, - }; - - /** - * Query `useGet` - * @summary Get position account details - * @permission Requires `canUseGet` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { positionId, officeId }: { positionId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(positionId, officeId), - queryFn: () => { - checkAcl(PositionAccountAcl.canUseGet({ officeId })); - return PositionAccountApi.get(positionId, officeId, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/positionAccountItems/positionAccountItems.acl.ts b/test/generated/dist/positionAccountItems/positionAccountItems.acl.ts deleted file mode 100644 index 8602826..0000000 --- a/test/generated/dist/positionAccountItems/positionAccountItems.acl.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionAccountItemsAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Update", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; - - /** - * Use for `useDeletePositionAccountItems` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePositionAccountItems` mutation - */ - export const canUseDeletePositionAccountItems = (object?: { officeId: string }) => - ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Update", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Update", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; - - /** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ - export const canUseDuplicate = (object?: { officeId: string }) => - ["Duplicate", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Duplicate", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; - - /** - * Use for `useReassign` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReassign` mutation - */ - export const canUseReassign = (object?: { officeId: string }) => - ["Reassign", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Reassign", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; - - /** - * Use for `useReorder` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation - */ - export const canUseReorder = (object?: { officeId: string }) => - ["Update", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Update", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/positionAccountItems/positionAccountItems.api.ts b/test/generated/dist/positionAccountItems/positionAccountItems.api.ts deleted file mode 100644 index c4f0ecf..0000000 --- a/test/generated/dist/positionAccountItems/positionAccountItems.api.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionAccountItemsModels } from "./positionAccountItems.models"; - -export namespace PositionAccountItemsApi { - export const create = ( - positionId: string, - officeId: string, - data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), - config, - ); - }; - export const deletePositionAccountItems = ( - positionId: string, - officeId: string, - data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), - config, - ); - }; - export const update = ( - positionId: string, - officeId: string, - data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), - config, - ); - }; - export const duplicate = ( - positionId: string, - officeId: string, - data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, - ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), - config, - ); - }; - export const reassign = ( - positionId: string, - officeId: string, - data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items/reassign`, - ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), - config, - ); - }; - export const reorder = ( - positionId: string, - itemId: string, - officeId: string, - data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, - ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/positionAccountItems/positionAccountItems.models.ts b/test/generated/dist/positionAccountItems/positionAccountItems.models.ts deleted file mode 100644 index 3d0aeb7..0000000 --- a/test/generated/dist/positionAccountItems/positionAccountItems.models.ts +++ /dev/null @@ -1,251 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionAccountItemsModels { - /** - * CreatePositionChargeDataRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ - export const CreatePositionChargeDataRequestDtoSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID"), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().gte(1).describe("Quantity of the charge"), - buyRate: z.number().describe("Buy rate amount"), - buyCurrencyCode: z.string().describe("Buy rate currency code"), - buyVatRuleId: z.string().describe("Buy VAT rule ID"), - vendorId: z.string().describe("Vendor ID"), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), - sellRate: z.number().describe("Sell rate amount"), - sellCurrencyCode: z.string().describe("Sell rate currency code"), - sellVatRuleId: z.string().describe("Sell VAT rule ID"), - customerId: z.string().describe("Customer ID"), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), - }) - .readonly(); - export type CreatePositionChargeDataRequestDto = z.infer; - - /** - * CreatePositionTextDataRequestDtoSchema - * @type { object } - * @property { string } content Text content - */ - export const CreatePositionTextDataRequestDtoSchema = z - .object({ content: z.string().describe("Text content") }) - .readonly(); - export type CreatePositionTextDataRequestDto = z.infer; - - /** - * CreatePositionAccountItemRequestDtoSchema - * @type { object } - * @property { CommonModels.PositionAccountItemTypeEnum } type Item type - * @property { CreatePositionChargeDataRequestDto } charge Charge data if type is CHARGE - * @property { CreatePositionTextDataRequestDto } text Text data if type is TEXT - */ - export const CreatePositionAccountItemRequestDtoSchema = z - .object({ - type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), - charge: CreatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), - text: CreatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish(), - }) - .readonly(); - export type CreatePositionAccountItemRequestDto = z.infer; - - /** - * CreatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { CreatePositionAccountItemRequestDto[] } items Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER) - */ - export const CreatePositionAccountItemsRequestDtoSchema = z - .object({ - items: z - .array(CreatePositionAccountItemRequestDtoSchema) - .readonly() - .describe( - "Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER)", - ), - }) - .readonly(); - export type CreatePositionAccountItemsRequestDto = z.infer; - - /** - * UpdatePositionChargeDataRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ - export const UpdatePositionChargeDataRequestDtoSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID"), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().gte(1).describe("Quantity of the charge"), - buyRate: z.number().describe("Buy rate amount").nullable(), - buyCurrencyCode: z.string().describe("Buy rate currency code"), - buyVatRuleId: z.string().describe("Buy VAT rule ID"), - vendorId: z.string().describe("Vendor ID"), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), - sellRate: z.number().describe("Sell rate amount").nullable(), - sellCurrencyCode: z.string().describe("Sell rate currency code"), - sellVatRuleId: z.string().describe("Sell VAT rule ID"), - customerId: z.string().describe("Customer ID"), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), - }) - .readonly(); - export type UpdatePositionChargeDataRequestDto = z.infer; - - /** - * UpdatePositionTextDataRequestDtoSchema - * @type { object } - * @property { string } content Text content - */ - export const UpdatePositionTextDataRequestDtoSchema = z - .object({ content: z.string().describe("Text content") }) - .readonly(); - export type UpdatePositionTextDataRequestDto = z.infer; - - /** - * UpdatePositionAccountItemRequestDtoSchema - * @type { object } - * @property { CommonModels.PositionAccountItemTypeEnum } type Item type - * @property { UpdatePositionChargeDataRequestDto } charge Charge data if type is CHARGE - * @property { UpdatePositionTextDataRequestDto } text Text data if type is TEXT - */ - export const UpdatePositionAccountItemRequestDtoSchema = z - .object({ - type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), - charge: UpdatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), - text: UpdatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish(), - }) - .readonly(); - export type UpdatePositionAccountItemRequestDto = z.infer; - - /** - * UpdatePositionAccountItemWithIdRequestDtoSchema - * @type { object } - * @property { string } id ID of the item to update - * @property { UpdatePositionAccountItemRequestDto } data Data to update - */ - export const UpdatePositionAccountItemWithIdRequestDtoSchema = z - .object({ - id: z.string().describe("ID of the item to update"), - data: UpdatePositionAccountItemRequestDtoSchema.describe("Data to update"), - }) - .readonly(); - export type UpdatePositionAccountItemWithIdRequestDto = z.infer< - typeof UpdatePositionAccountItemWithIdRequestDtoSchema - >; - - /** - * UpdatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { UpdatePositionAccountItemWithIdRequestDto[] } items Array of items to update - */ - export const UpdatePositionAccountItemsRequestDtoSchema = z - .object({ - items: z.array(UpdatePositionAccountItemWithIdRequestDtoSchema).readonly().describe("Array of items to update"), - }) - .readonly(); - export type UpdatePositionAccountItemsRequestDto = z.infer; - - /** - * DeletePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to delete - */ - export const DeletePositionAccountItemsRequestDtoSchema = z - .object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to delete") }) - .readonly(); - export type DeletePositionAccountItemsRequestDto = z.infer; - - /** - * DuplicatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to duplicate - */ - export const DuplicatePositionAccountItemsRequestDtoSchema = z - .object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to duplicate") }) - .readonly(); - export type DuplicatePositionAccountItemsRequestDto = z.infer; - - /** - * ReassignPositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to reassign - * @property { string } targetPositionId Target position ID to reassign items to - */ - export const ReassignPositionAccountItemsRequestDtoSchema = z - .object({ - ids: z.array(z.string()).readonly().describe("Array of item IDs to reassign"), - targetPositionId: z.string().describe("Target position ID to reassign items to"), - }) - .readonly(); - export type ReassignPositionAccountItemsRequestDto = z.infer; - - /** - * ReorderPositionAccountItemRequestDtoSchema - * @type { object } - * @property { number } orderPosition New order position for the item - */ - export const ReorderPositionAccountItemRequestDtoSchema = z - .object({ orderPosition: z.number().describe("New order position for the item") }) - .readonly(); - export type ReorderPositionAccountItemRequestDto = z.infer; - - /** - * PositionAccountItemsCreateResponseSchema - * @type { array } - */ - export const PositionAccountItemsCreateResponseSchema = z - .array(CommonModels.PositionAccountItemDtoResponseSchema) - .readonly(); - export type PositionAccountItemsCreateResponse = z.infer; - - /** - * PositionAccountItemsUpdateResponseSchema - * @type { array } - */ - export const PositionAccountItemsUpdateResponseSchema = z - .array(CommonModels.PositionAccountItemDtoResponseSchema) - .readonly(); - export type PositionAccountItemsUpdateResponse = z.infer; - - /** - * PositionAccountItemsDuplicateResponseSchema - * @type { array } - */ - export const PositionAccountItemsDuplicateResponseSchema = z - .array(CommonModels.PositionAccountItemDtoResponseSchema) - .readonly(); - export type PositionAccountItemsDuplicateResponse = z.infer; - - /** - * ReassignResponseSchema - * @type { array } - */ - export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); - export type ReassignResponse = z.infer; -} diff --git a/test/generated/dist/positionAccountItems/positionAccountItems.queries.ts b/test/generated/dist/positionAccountItems/positionAccountItems.queries.ts deleted file mode 100644 index 909d03c..0000000 --- a/test/generated/dist/positionAccountItems/positionAccountItems.queries.ts +++ /dev/null @@ -1,229 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionAccountItemsAcl } from "./positionAccountItems.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionAccountItemsModels } from "./positionAccountItems.models"; -import { PositionAccountItemsApi } from "./positionAccountItems.api"; - -export namespace PositionAccountItemsQueries { - export const moduleName = QueryModule.PositionAccountItems; - - /** - * Mutation `useCreate` - * @summary Create position account items (bulk) - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.create, - { positionId: string; officeId: string; data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId })); - return PositionAccountItemsApi.create(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeletePositionAccountItems` - * @summary Delete position account items (bulk) - * @permission Requires `canUseDeletePositionAccountItems` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeletePositionAccountItems = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.deletePositionAccountItems, - { positionId: string; officeId: string; data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId })); - return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update position account items (bulk) - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.update, - { positionId: string; officeId: string; data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId })); - return PositionAccountItemsApi.update(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDuplicate` - * @summary Duplicate position account items (bulk) - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicate = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.duplicate, - { positionId: string; officeId: string; data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId })); - return PositionAccountItemsApi.duplicate(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useReassign` - * @summary Reassign position account items to another position (bulk) - * @permission Requires `canUseReassign` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useReassign = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.reassign, - { positionId: string; officeId: string; data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId })); - return PositionAccountItemsApi.reassign(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useReorder` - * @summary Reorder position account item - * @permission Requires `canUseReorder` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.ReorderPositionAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useReorder = ( - options?: AppMutationOptions< - typeof PositionAccountItemsApi.reorder, - { - positionId: string; - itemId: string; - officeId: string; - data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, itemId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId })); - return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/positionCargo/positionCargo.acl.ts b/test/generated/dist/positionCargo/positionCargo.acl.ts deleted file mode 100644 index 3be8f2a..0000000 --- a/test/generated/dist/positionCargo/positionCargo.acl.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionCargoAcl { - /** - * Use for `useListCargosByPositionId` query ability. For global ability, omit the object parameter. - * @description List cargo items by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByPositionId` query - */ - export const canUseListCargosByPositionId = (object?: { officeId: string }) => - ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Read", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useCreateCargo` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCargo` mutation - */ - export const canUseCreateCargo = (object?: { officeId: string }) => - ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Create", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. - * @description List cargo labels by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query - */ - export const canUseListCargoLabels = (object?: { officeId: string }) => - ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Read", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. - * @description Get cargo summary by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query - */ - export const canUseGetCargoSummary = (object?: { officeId: string }) => - ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Read", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. - * @description Get cargo item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query - */ - export const canUseGetCargoById = (object?: { officeId: string }) => - ["Read", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Read", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. - * @description Update cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation - */ - export const canUseUpdateCargo = (object?: { officeId: string }) => - ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Update", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation - */ - export const canUseDeleteCargo = (object?: { officeId: string }) => - ["Delete", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Delete", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation - */ - export const canUseCreateBulkCargos = (object?: { officeId: string }) => - ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Create", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation - */ - export const canUseDuplicateCargo = (object?: { officeId: string }) => - ["Duplicate", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Duplicate", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/positionCargo/positionCargo.api.ts b/test/generated/dist/positionCargo/positionCargo.api.ts deleted file mode 100644 index d692a24..0000000 --- a/test/generated/dist/positionCargo/positionCargo.api.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionCargoModels } from "./positionCargo.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoApi { - export const listCargosByPositionId = ( - officeId: string, - positionId: string, - limit: number, - order?: PositionCargoModels.ListCargosByPositionIdOrderParam, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos`, - { - ...config, - params: { - order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { - type: "query", - name: "order", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const createCargo = ( - officeId: string, - positionId: string, - data: CommonModels.CreatePositionCargoDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config, - ); - }; - export const listCargoLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/labels`, - config, - ); - }; - export const getCargoSummary = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/summary`, - config, - ); - }; - export const getCargoById = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - config, - ); - }; - export const updateCargo = ( - officeId: string, - positionId: string, - cargoId: string, - data: CommonModels.UpdatePositionCargoDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - config, - ); - }; - export const deleteCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - undefined, - config, - ); - }; - export const createBulkCargos = ( - numberOfCargos: number, - officeId: string, - positionId: string, - data: CommonModels.CreatePositionCargoDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config, - ); - }; - export const duplicateCargo = ( - officeId: string, - positionId: string, - cargoId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/positionCargo/positionCargo.configs.ts b/test/generated/dist/positionCargo/positionCargo.configs.ts deleted file mode 100644 index 318b8e9..0000000 --- a/test/generated/dist/positionCargo/positionCargo.configs.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoQueries } from "./positionCargo.queries"; -import { PositionCargoAcl } from "./positionCargo.acl"; - -export namespace PositionCargoConfigs { - export const cargosConfig = { - meta: { - title: "Cargos", - }, - readAll: { - acl: PositionCargoAcl.canUseListCargosByPositionId, - schema: CommonModels.PositionCargoResponseDTOSchema, - paginated: PositionCargoQueries.useListCargosByPositionId, - infinite: PositionCargoQueries.useListCargosByPositionIdInfinite, - columns: dynamicColumns({ - schema: CommonModels.PositionCargoResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - quoteId: true, - rootFolderId: true, - cargoType: true, - autoCalculateTotals: true, - autoCalculateRates: true, - autoCalculateVgm: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - rateOptions: true, - rateClass: true, - textForCustoms: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - ratePerKg: true, - totalRate: true, - tare: true, - vgm: true, - hsCodeLabels: true, - note: true, - packages: true, - createdAt: true, - updatedAt: true, - completeWeight: true, - packageTotals: true, - }, - }, - }), - }, - read: { - acl: PositionCargoAcl.canUseGetCargoById, - schema: CommonModels.PositionCargoResponseDTOSchema, - query: PositionCargoQueries.useGetCargoById, - }, - create: { - acl: PositionCargoAcl.canUseCreateCargo, - schema: CommonModels.CreatePositionCargoDTOSchema, - mutation: PositionCargoQueries.useCreateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.CreatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, - }), - }, - update: { - acl: PositionCargoAcl.canUseUpdateCargo, - schema: CommonModels.UpdatePositionCargoDTOSchema, - mutation: PositionCargoQueries.useUpdateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.UpdatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, - }), - }, - delete: { - acl: PositionCargoAcl.canUseDeleteCargo, - mutation: PositionCargoQueries.useDeleteCargo, - }, - }; -} diff --git a/test/generated/dist/positionCargo/positionCargo.models.ts b/test/generated/dist/positionCargo/positionCargo.models.ts deleted file mode 100644 index 5649851..0000000 --- a/test/generated/dist/positionCargo/positionCargo.models.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoModels { - /** - * ListCargosByPositionIdOrderParamSchema - * @type { array } - * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - */ - export const ListCargosByPositionIdOrderParamSchema = z - .array(CommonModels.PositionCargoPaginationOrderFieldSchema) - .readonly() - .describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt") - .nullish(); - export type ListCargosByPositionIdOrderParam = z.infer; - - /** - * ListCargosByPositionIdResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.PositionCargoResponseDTO[] } items - */ - export const ListCargosByPositionIdResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ListCargosByPositionIdResponse = z.infer; - - /** - * PositionCargoListCargoLabelsResponseSchema - * @type { array } - */ - export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type PositionCargoListCargoLabelsResponse = z.infer; - - /** - * PositionCargoGetCargoSummaryResponseSchema - * @type { array } - */ - export const PositionCargoGetCargoSummaryResponseSchema = z - .array(CommonModels.CargoSummaryResponseDTOSchema) - .readonly(); - export type PositionCargoGetCargoSummaryResponse = z.infer; - - /** - * PositionCargoCreateBulkCargosResponseSchema - * @type { array } - */ - export const PositionCargoCreateBulkCargosResponseSchema = z - .array(CommonModels.PositionCargoResponseDTOSchema) - .readonly(); - export type PositionCargoCreateBulkCargosResponse = z.infer; -} diff --git a/test/generated/dist/positionCargo/positionCargo.queries.ts b/test/generated/dist/positionCargo/positionCargo.queries.ts deleted file mode 100644 index 4c2f731..0000000 --- a/test/generated/dist/positionCargo/positionCargo.queries.ts +++ /dev/null @@ -1,415 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionCargoAcl } from "./positionCargo.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionCargoModels } from "./positionCargo.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoApi } from "./positionCargo.api"; - -export namespace PositionCargoQueries { - export const moduleName = QueryModule.PositionCargo; - - export const keys = { - all: [moduleName] as const, - listCargosByPositionId: ( - officeId: string, - positionId: string, - limit?: number, - order?: PositionCargoModels.ListCargosByPositionIdOrderParam, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/cargos", - officeId, - positionId, - limit, - order, - page, - cursor, - ] as const, - listCargosByPositionIdInfinite: ( - officeId: string, - positionId: string, - limit?: number, - order?: PositionCargoModels.ListCargosByPositionIdOrderParam, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/cargos", - "infinite", - officeId, - positionId, - limit, - order, - cursor, - ] as const, - listCargoLabels: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/cargos/labels", officeId, positionId] as const, - getCargoSummary: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/cargos/summary", officeId, positionId] as const, - getCargoById: (officeId: string, positionId: string, cargoId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/cargos/:cargoId", officeId, positionId, cargoId] as const, - }; - - /** - * Query `useListCargosByPositionId` - * @summary List all cargo items for a position - * @permission Requires `canUseListCargosByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargosByPositionId = ( - { - officeId, - positionId, - limit, - order, - page, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: PositionCargoModels.ListCargosByPositionIdOrderParam; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId })); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListCargosByPositionIdInfinite - * @summary List all cargo items for a position - * @permission Requires `canUseListCargosByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargosByPositionIdInfinite = ( - { - officeId, - positionId, - limit, - order, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: PositionCargoModels.ListCargosByPositionIdOrderParam; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId })); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreateCargo` - * @summary Create a new cargo item - * @permission Requires `canUseCreateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateCargo = ( - options?: AppMutationOptions< - typeof PositionCargoApi.createCargo, - { officeId: string; positionId: string; data: CommonModels.CreatePositionCargoDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId })); - return PositionCargoApi.createCargo(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useListCargoLabels` - * @summary List all cargo labels for a position - * @permission Requires `canUseListCargoLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargoLabels = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargoLabels(officeId, positionId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId })); - return PositionCargoApi.listCargoLabels(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Query `useGetCargoSummary` - * @summary Get cargo summary grouped by transport unit type - * @permission Requires `canUseGetCargoSummary` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCargoSummary = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoSummary(officeId, positionId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId })); - return PositionCargoApi.getCargoSummary(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Query `useGetCargoById` - * @summary Get a specific cargo item - * @permission Requires `canUseGetCargoById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.cargoId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCargoById = ( - { officeId, positionId, cargoId }: { officeId: string; positionId: string; cargoId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoById(officeId, positionId, cargoId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId })); - return PositionCargoApi.getCargoById(officeId, positionId, cargoId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateCargo` - * @summary Update a cargo item - * @permission Requires `canUseUpdateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCargo = ( - options?: AppMutationOptions< - typeof PositionCargoApi.updateCargo, - { officeId: string; positionId: string; cargoId: string; data: CommonModels.UpdatePositionCargoDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, data }) => { - checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId })); - return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteCargo` - * @summary Delete a cargo item - * @permission Requires `canUseDeleteCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteCargo = ( - options?: AppMutationOptions< - typeof PositionCargoApi.deleteCargo, - { officeId: string; positionId: string; cargoId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId }) => { - checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId })); - return PositionCargoApi.deleteCargo(officeId, positionId, cargoId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCreateBulkCargos` - * @summary Create a new cargo item - * @permission Requires `canUseCreateBulkCargos` ability - * @param { number } mutation.numberOfCargos Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateBulkCargos = ( - options?: AppMutationOptions< - typeof PositionCargoApi.createBulkCargos, - { numberOfCargos: number; officeId: string; positionId: string; data: CommonModels.CreatePositionCargoDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { - checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId })); - return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDuplicateCargo` - * @summary Duplicate a cargo item - * @permission Requires `canUseDuplicateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicateCargo = ( - options?: AppMutationOptions< - typeof PositionCargoApi.duplicateCargo, - { officeId: string; positionId: string; cargoId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId }) => { - checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId })); - return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/positionCargoPackage/positionCargoPackage.acl.ts b/test/generated/dist/positionCargoPackage/positionCargoPackage.acl.ts deleted file mode 100644 index 1b45ca0..0000000 --- a/test/generated/dist/positionCargoPackage/positionCargoPackage.acl.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionCargoPackageAcl { - /** - * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. - * @description Create cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation - */ - export const canUseCreatePackage = (object?: { officeId: string }) => - ["Create", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Create", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. - * @description Update cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation - */ - export const canUseUpdatePackage = (object?: { officeId: string }) => - ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Update", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation - */ - export const canUseDeletePackage = (object?: { officeId: string }) => - ["Delete", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Delete", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation - */ - export const canUseDuplicatePackage = (object?: { officeId: string }) => - ["Duplicate", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Duplicate", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; - - /** - * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. - * @description Move cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation - */ - export const canUseMovePackage = (object?: { officeId: string }) => - ["Update", object ? subject("PositionCargo", object) : "PositionCargo"] as AbilityTuple< - "Update", - "PositionCargo" | (ForcedSubject<"PositionCargo"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/positionCargoPackage/positionCargoPackage.api.ts b/test/generated/dist/positionCargoPackage/positionCargoPackage.api.ts deleted file mode 100644 index 4357b95..0000000 --- a/test/generated/dist/positionCargoPackage/positionCargoPackage.api.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoPackageApi { - export const createPackage = ( - officeId: string, - positionId: string, - cargoId: string, - data: CommonModels.CreatePositionCargoPackageDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, - ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - config, - ); - }; - export const updatePackage = ( - officeId: string, - positionId: string, - cargoId: string, - packageId: string, - data: CommonModels.UpdatePositionCargoPackageDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - config, - ); - }; - export const deletePackage = ( - officeId: string, - positionId: string, - cargoId: string, - packageId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - undefined, - config, - ); - }; - export const duplicatePackage = ( - officeId: string, - positionId: string, - cargoId: string, - packageId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - undefined, - config, - ); - }; - export const movePackage = ( - officeId: string, - positionId: string, - cargoId: string, - packageId: string, - data: CommonModels.MovePositionCargoPackageRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, - ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/positionCargoPackage/positionCargoPackage.queries.ts b/test/generated/dist/positionCargoPackage/positionCargoPackage.queries.ts deleted file mode 100644 index 3c69275..0000000 --- a/test/generated/dist/positionCargoPackage/positionCargoPackage.queries.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionCargoPackageAcl } from "./positionCargoPackage.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoPackageApi } from "./positionCargoPackage.api"; - -export namespace PositionCargoPackageQueries { - export const moduleName = QueryModule.PositionCargoPackage; - - /** - * Mutation `useCreatePackage` - * @summary Create a new package for a cargo - * @permission Requires `canUseCreatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreatePackage = ( - options?: AppMutationOptions< - typeof PositionCargoPackageApi.createPackage, - { officeId: string; positionId: string; cargoId: string; data: CommonModels.CreatePositionCargoPackageDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId })); - return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdatePackage` - * @summary Update a package - * @permission Requires `canUseUpdatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdatePackage = ( - options?: AppMutationOptions< - typeof PositionCargoPackageApi.updatePackage, - { - officeId: string; - positionId: string; - cargoId: string; - packageId: string; - data: CommonModels.UpdatePositionCargoPackageDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId })); - return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeletePackage` - * @summary Delete a package - * @permission Requires `canUseDeletePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeletePackage = ( - options?: AppMutationOptions< - typeof PositionCargoPackageApi.deletePackage, - { officeId: string; positionId: string; cargoId: string; packageId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId }) => { - checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId })); - return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDuplicatePackage` - * @summary Duplicate a package - * @permission Requires `canUseDuplicatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicatePackage = ( - options?: AppMutationOptions< - typeof PositionCargoPackageApi.duplicatePackage, - { officeId: string; positionId: string; cargoId: string; packageId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId }) => { - checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId })); - return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useMovePackage` - * @summary Move a package to a different cargo - * @permission Requires `canUseMovePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useMovePackage = ( - options?: AppMutationOptions< - typeof PositionCargoPackageApi.movePackage, - { - officeId: string; - positionId: string; - cargoId: string; - packageId: string; - data: CommonModels.MovePositionCargoPackageRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId })); - return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/positionChecklist/positionChecklist.acl.ts b/test/generated/dist/positionChecklist/positionChecklist.acl.ts deleted file mode 100644 index 6047fe4..0000000 --- a/test/generated/dist/positionChecklist/positionChecklist.acl.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionChecklistAcl { - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List checklist items for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useApplyTemplates` mutation ability. For global ability, omit the object parameter. - * @description Apply checklist templates to position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useApplyTemplates` mutation - */ - export const canUseApplyTemplates = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useComplete` mutation ability. For global ability, omit the object parameter. - * @description Complete position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useComplete` mutation - */ - export const canUseComplete = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useUncomplete` mutation ability. For global ability, omit the object parameter. - * @description Uncomplete position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUncomplete` mutation - */ - export const canUseUncomplete = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useUpdateNotes` mutation ability. For global ability, omit the object parameter. - * @description Update position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateNotes` mutation - */ - export const canUseUpdateNotes = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useReorder` mutation ability. For global ability, omit the object parameter. - * @description Reorder position checklist items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation - */ - export const canUseReorder = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/positionChecklist/positionChecklist.api.ts b/test/generated/dist/positionChecklist/positionChecklist.api.ts deleted file mode 100644 index 28929d0..0000000 --- a/test/generated/dist/positionChecklist/positionChecklist.api.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionChecklistModels } from "./positionChecklist.models"; - -export namespace PositionChecklistApi { - export const list = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist`, - config, - ); - }; - export const applyTemplates = ( - officeId: string, - positionId: string, - data: PositionChecklistModels.ApplyTemplatesRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, - ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), - config, - ); - }; - export const complete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, - undefined, - config, - ); - }; - export const uncomplete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, - undefined, - config, - ); - }; - export const updateNotes = ( - officeId: string, - positionId: string, - itemId: string, - data: PositionChecklistModels.UpdatePositionChecklistItemDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, - ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), - config, - ); - }; - export const reorder = ( - officeId: string, - positionId: string, - data: PositionChecklistModels.ReorderPositionChecklistDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.put( - { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/reorder`, - ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/positionChecklist/positionChecklist.models.ts b/test/generated/dist/positionChecklist/positionChecklist.models.ts deleted file mode 100644 index 58a0db3..0000000 --- a/test/generated/dist/positionChecklist/positionChecklist.models.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { z } from "zod"; - -export namespace PositionChecklistModels { - /** - * PositionChecklistCompletedByResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const PositionChecklistCompletedByResponseDtoSchema = z - .object({ id: z.string(), name: z.string().nullable() }) - .readonly(); - export type PositionChecklistCompletedByResponseDto = z.infer; - - /** - * PositionChecklistItemResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } checklistItemId - * @property { string } templateId - * @property { number } order - * @property { boolean } completed - * @property { string } completedAt - * @property { PositionChecklistCompletedByResponseDto } completedBy - * @property { string } notes - * @property { string } name - */ - export const PositionChecklistItemResponseDtoSchema = z - .object({ - id: z.string(), - positionId: z.string(), - checklistItemId: z.string(), - templateId: z.string().nullable(), - order: z.number(), - completed: z.boolean(), - completedAt: z.iso.datetime({ offset: true }).nullable(), - completedBy: PositionChecklistCompletedByResponseDtoSchema.nullable(), - notes: z.string().nullable(), - name: z.string().nullable(), - }) - .readonly(); - export type PositionChecklistItemResponseDto = z.infer; - - /** - * PositionChecklistResponseDtoSchema - * @type { object } - * @property { PositionChecklistItemResponseDto[] } items - * @property { string[] } appliedTemplateIds - */ - export const PositionChecklistResponseDtoSchema = z - .object({ - items: z.array(PositionChecklistItemResponseDtoSchema).readonly(), - appliedTemplateIds: z.array(z.string()).readonly(), - }) - .readonly(); - export type PositionChecklistResponseDto = z.infer; - - /** - * ApplyTemplatesRequestDtoSchema - * @type { object } - * @property { string[] } templateIds - */ - export const ApplyTemplatesRequestDtoSchema = z.object({ templateIds: z.array(z.string()).readonly() }).readonly(); - export type ApplyTemplatesRequestDto = z.infer; - - /** - * UpdatePositionChecklistItemDtoSchema - * @type { object } - * @property { string } notes Max Length: `512` - */ - export const UpdatePositionChecklistItemDtoSchema = z.object({ notes: z.string().max(512) }).readonly(); - export type UpdatePositionChecklistItemDto = z.infer; - - /** - * ReorderPositionChecklistDtoSchema - * @type { object } - * @property { string[] } itemIds - */ - export const ReorderPositionChecklistDtoSchema = z.object({ itemIds: z.array(z.string()).readonly() }).readonly(); - export type ReorderPositionChecklistDto = z.infer; - - /** - * ApplyTemplatesResponseSchema - * @type { array } - */ - export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); - export type ApplyTemplatesResponse = z.infer; - - /** - * PositionChecklistReorderResponseSchema - * @type { array } - */ - export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); - export type PositionChecklistReorderResponse = z.infer; -} diff --git a/test/generated/dist/positionChecklist/positionChecklist.queries.ts b/test/generated/dist/positionChecklist/positionChecklist.queries.ts deleted file mode 100644 index 0309124..0000000 --- a/test/generated/dist/positionChecklist/positionChecklist.queries.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionChecklistAcl } from "./positionChecklist.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionChecklistModels } from "./positionChecklist.models"; -import { PositionChecklistApi } from "./positionChecklist.api"; - -export namespace PositionChecklistQueries { - export const moduleName = QueryModule.PositionChecklist; - - export const keys = { - all: [moduleName] as const, - list: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/checklist", officeId, positionId] as const, - }; - - /** - * Query `useList` - * @summary Get position checklist items - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, positionId), - queryFn: () => { - checkAcl(PositionChecklistAcl.canUseList({ officeId })); - return PositionChecklistApi.list(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useApplyTemplates` - * @summary Apply checklist templates to position - * @permission Requires `canUseApplyTemplates` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionChecklistModels.ApplyTemplatesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useApplyTemplates = ( - options?: AppMutationOptions< - typeof PositionChecklistApi.applyTemplates, - { officeId: string; positionId: string; data: PositionChecklistModels.ApplyTemplatesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId })); - return PositionChecklistApi.applyTemplates(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useComplete` - * @summary Complete a checklist item - * @permission Requires `canUseComplete` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useComplete = ( - options?: AppMutationOptions< - typeof PositionChecklistApi.complete, - { officeId: string; positionId: string; itemId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId }) => { - checkAcl(PositionChecklistAcl.canUseComplete({ officeId })); - return PositionChecklistApi.complete(officeId, positionId, itemId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUncomplete` - * @summary Mark checklist item as not completed - * @permission Requires `canUseUncomplete` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useUncomplete = ( - options?: AppMutationOptions< - typeof PositionChecklistApi.uncomplete, - { officeId: string; positionId: string; itemId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId }) => { - checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId })); - return PositionChecklistApi.uncomplete(officeId, positionId, itemId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateNotes` - * @summary Update checklist item notes - * @permission Requires `canUseUpdateNotes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { PositionChecklistModels.UpdatePositionChecklistItemDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateNotes = ( - options?: AppMutationOptions< - typeof PositionChecklistApi.updateNotes, - { - officeId: string; - positionId: string; - itemId: string; - data: PositionChecklistModels.UpdatePositionChecklistItemDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId, data }) => { - checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId })); - return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useReorder` - * @summary Reorder checklist items - * @permission Requires `canUseReorder` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionChecklistModels.ReorderPositionChecklistDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useReorder = ( - options?: AppMutationOptions< - typeof PositionChecklistApi.reorder, - { officeId: string; positionId: string; data: PositionChecklistModels.ReorderPositionChecklistDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionChecklistAcl.canUseReorder({ officeId })); - return PositionChecklistApi.reorder(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.acl.ts b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.acl.ts deleted file mode 100644 index 7716790..0000000 --- a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.acl.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionInvolvedPartiesAcl { - /** - * Use for `useFindByPositionId` query ability. For global ability, omit the object parameter. - * @description List position involved parties - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByPositionId` query - */ - export const canUseFindByPositionId = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation ability. For global ability, omit the object parameter. - * @description Delete position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation - */ - export const canUseDeleteOfficesPositionsInvolvedPartiesByPartyId = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.api.ts b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.api.ts deleted file mode 100644 index 63ec373..0000000 --- a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.api.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionInvolvedPartiesModels } from "./positionInvolvedParties.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionInvolvedPartiesApi { - export const findByPositionId = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties`, - config, - ); - }; - export const create = ( - officeId: string, - positionId: string, - data: CommonModels.CreateInvolvedPartyRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties`, - ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - config, - ); - }; - export const update = ( - officeId: string, - positionId: string, - partyId: string, - data: CommonModels.UpdateInvolvedPartyDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - config, - ); - }; - export const deleteOfficesPositionsInvolvedPartiesByPartyId = ( - officeId: string, - positionId: string, - partyId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.models.ts b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.models.ts deleted file mode 100644 index aeea1e4..0000000 --- a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.models.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionInvolvedPartiesModels { - /** - * FindByPositionIdResponseSchema - * @type { array } - */ - export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); - export type FindByPositionIdResponse = z.infer; -} diff --git a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.queries.ts b/test/generated/dist/positionInvolvedParties/positionInvolvedParties.queries.ts deleted file mode 100644 index ed6dde7..0000000 --- a/test/generated/dist/positionInvolvedParties/positionInvolvedParties.queries.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionInvolvedPartiesAcl } from "./positionInvolvedParties.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionInvolvedPartiesApi } from "./positionInvolvedParties.api"; - -export namespace PositionInvolvedPartiesQueries { - export const moduleName = QueryModule.PositionInvolvedParties; - - export const keys = { - all: [moduleName] as const, - findByPositionId: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/involved-parties", officeId, positionId] as const, - }; - - /** - * Query `useFindByPositionId` - * @summary List position involved parties - * @permission Requires `canUseFindByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindByPositionId = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findByPositionId(officeId, positionId), - queryFn: () => { - checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId })); - return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create position involved party - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof PositionInvolvedPartiesApi.create, - { officeId: string; positionId: string; data: CommonModels.CreateInvolvedPartyRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId })); - return PositionInvolvedPartiesApi.create(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update position involved party - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof PositionInvolvedPartiesApi.update, - { officeId: string; positionId: string; partyId: string; data: CommonModels.UpdateInvolvedPartyDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, partyId, data }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId })); - return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteOfficesPositionsInvolvedPartiesByPartyId` - * @summary Delete position involved party - * @permission Requires `canUseDeleteOfficesPositionsInvolvedPartiesByPartyId` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = ( - options?: AppMutationOptions< - typeof PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId, - { officeId: string; positionId: string; partyId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, partyId }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId })); - return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId( - officeId, - positionId, - partyId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts deleted file mode 100644 index 0060022..0000000 --- a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionProfitChangeTrackingAcl { - /** - * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. - * @description List position profit change groups - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.positionId positionId from positionId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query - */ - export const canUseFindProfitChangeGroups = (object?: { officeId: string; positionId: string }) => - ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Read", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) - >; - - /** - * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. - * @description Get position profit change group details - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.positionId positionId from positionId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query - */ - export const canUseFindProfitChangeGroupDetail = (object?: { officeId: string; positionId: string }) => - ["Read", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "Read", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string; positionId: string }) - >; -} diff --git a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.api.ts b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.api.ts deleted file mode 100644 index a8e0e88..0000000 --- a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.api.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; - -export namespace PositionProfitChangeTrackingApi { - export const findProfitChangeGroups = ( - officeId: string, - positionId: string, - limit: number, - order?: string, - filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { - resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema, - }, - `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp( - PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, - ).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse( - PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), - filter, - { type: "query", name: "filter" }, - ), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findProfitChangeGroupDetail = ( - groupId: string, - officeId: string, - positionId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, - `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, - config, - ); - }; -} diff --git a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts deleted file mode 100644 index 260a0d2..0000000 --- a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; -import { PositionProfitChangeTrackingQueries } from "./positionProfitChangeTracking.queries"; -import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; - -export namespace PositionProfitChangeTrackingConfigs { - export const profitChangeGroupsConfig = { - meta: { - title: "Profit Change Groups", - }, - readAll: { - acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups, - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, - paginated: PositionProfitChangeTrackingQueries.useFindProfitChangeGroups, - infinite: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, - filters: { - schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, - options: { - inputs: { - userId: true, - dateFrom: true, - dateTo: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, - options: { - columns: { - id: true, - timestamp: true, - users: true, - profit: true, - changeCount: true, - }, - sortable: - PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, - }, - }), - }, - read: { - acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema, - query: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, - }, - }; -} diff --git a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.models.ts b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.models.ts deleted file mode 100644 index e06233f..0000000 --- a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.models.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionProfitChangeTrackingModels { - /** - * PositionAccountProfitChangeGroupDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto[] } users - * @property { object } profit - * @property { number } profit.amount - * @property { string } profit.currencyCode - * @property { number } changeCount - */ - export const PositionAccountProfitChangeGroupDtoSchema = z - .object({ - id: z.string(), - timestamp: z.iso.datetime({ offset: true }), - users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), - profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), - changeCount: z.number(), - }) - .readonly(); - export type PositionAccountProfitChangeGroupDto = z.infer; - - /** - * PositionAccountProfitChangeEntryDtoSchema - * @type { object } - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto } user - * @property { number } changeNumber - * @property { number } oldProfit - * @property { number } newProfit - * @property { string } currencyCode - */ - export const PositionAccountProfitChangeEntryDtoSchema = z - .object({ - timestamp: z.iso.datetime({ offset: true }), - user: CommonModels.UserPreviewDtoSchema, - changeNumber: z.number(), - oldProfit: z.number(), - newProfit: z.number(), - currencyCode: z.string(), - }) - .readonly(); - export type PositionAccountProfitChangeEntryDto = z.infer; - - /** - * PositionAccountProfitChangeGroupDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { string } currencyCode - * @property { PositionAccountProfitChangeEntryDto[] } entries - */ - export const PositionAccountProfitChangeGroupDetailDtoSchema = z - .object({ - id: z.string(), - timestamp: z.iso.datetime({ offset: true }), - currencyCode: z.string(), - entries: z.array(PositionAccountProfitChangeEntryDtoSchema).readonly(), - }) - .readonly(); - export type PositionAccountProfitChangeGroupDetailDto = z.infer< - typeof PositionAccountProfitChangeGroupDetailDtoSchema - >; - - /** - * PositionProfitChangeTrackingFilterDtoSchema - * @type { object } - * @property { string } userId User IDs who made the changes - * @property { string } dateFrom Date range start - * @property { string } dateTo Date range end - */ - export const PositionProfitChangeTrackingFilterDtoSchema = z - .object({ - userId: z.string().describe("User IDs who made the changes"), - dateFrom: z.string().describe("Date range start"), - dateTo: z.string().describe("Date range end"), - }) - .readonly(); - export type PositionProfitChangeTrackingFilterDto = z.infer; - - /** - * PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema - * @type { enum } - */ - export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema = z.enum([ - "timestamp", - "profitAmount", - "changeCount", - ]); - export type PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = z.infer< - typeof PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema - >; - export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = - PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema.enum; - - /** - * PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionAccountProfitChangeGroupDto[] } items - */ - export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape, - }); - export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer< - typeof PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema - >; -} diff --git a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts b/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts deleted file mode 100644 index 313343b..0000000 --- a/test/generated/dist/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; -import { PositionProfitChangeTrackingApi } from "./positionProfitChangeTracking.api"; - -export namespace PositionProfitChangeTrackingQueries { - export const moduleName = QueryModule.PositionProfitChangeTracking; - - export const keys = { - all: [moduleName] as const, - findProfitChangeGroups: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/account/profit-change-groups", - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - ] as const, - findProfitChangeGroupsInfinite: ( - officeId: string, - positionId: string, - limit?: number, - order?: string, - filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/account/profit-change-groups", - "infinite", - officeId, - positionId, - limit, - order, - filter, - cursor, - ] as const, - findProfitChangeGroupDetail: (groupId: string, officeId: string, positionId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/account/profit-change-groups/:groupId", - groupId, - officeId, - positionId, - ] as const, - }; - - /** - * Query `useFindProfitChangeGroups` - * @summary List position profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` - * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroups = ( - { - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId })); - return PositionProfitChangeTrackingApi.findProfitChangeGroups( - officeId, - positionId, - limit, - order, - filter, - page, - cursor, - config, - ); - }, - ...options, - }); - }; - - /** - * Infinite query `useFindProfitChangeGroupsInfinite - * @summary List position profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` - * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroupsInfinite = ( - { - officeId, - positionId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - positionId: string; - limit: number; - order?: string; - filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId })); - return PositionProfitChangeTrackingApi.findProfitChangeGroups( - officeId, - positionId, - limit, - order, - filter, - pageParam, - cursor, - config, - ); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindProfitChangeGroupDetail` - * @summary Get position profit change group details - * @permission Requires `canUseFindProfitChangeGroupDetail` ability - * @param { string } object.groupId Path parameter - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroupDetail = ( - { groupId, officeId, positionId }: { groupId: string; officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), - queryFn: () => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId })); - return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/positionRoutes/positionRoutes.acl.ts b/test/generated/dist/positionRoutes/positionRoutes.acl.ts deleted file mode 100644 index 1ef520c..0000000 --- a/test/generated/dist/positionRoutes/positionRoutes.acl.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionRoutesAcl { - /** - * Use for `useListRoutes` query ability. For global ability, omit the object parameter. - * @description List position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query - */ - export const canUseListRoutes = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Create position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation - */ - export const canUseCreateRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Update position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation - */ - export const canUseUpdateRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Delete position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation - */ - export const canUseDeleteRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. - * @description Split position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation - */ - export const canUseSplitRoutes = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. - * @description Merge position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation - */ - export const canUseMergeRoutes = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. - * @description Copy position route - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation - */ - export const canUseCopyRoute = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/positionRoutes/positionRoutes.api.ts b/test/generated/dist/positionRoutes/positionRoutes.api.ts deleted file mode 100644 index 6081023..0000000 --- a/test/generated/dist/positionRoutes/positionRoutes.api.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionRoutesApi { - export const listRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.RouteListResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes`, - config, - ); - }; - export const createRoutePoint = ( - officeId: string, - positionId: string, - routeId: string, - data: CommonModels.CreateRoutePointRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, - ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - config, - ); - }; - export const updateRoutePoint = ( - officeId: string, - positionId: string, - routeId: string, - pointId: string, - data: CommonModels.UpdateRoutePointRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - config, - ); - }; - export const deleteRoutePoint = ( - officeId: string, - positionId: string, - routeId: string, - pointId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - undefined, - config, - ); - }; - export const splitRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/split`, - undefined, - config, - ); - }; - export const mergeRoutes = ( - officeId: string, - positionId: string, - data: CommonModels.MergeRoutesRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/merge`, - ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - config, - ); - }; - export const copyRoute = ( - officeId: string, - positionId: string, - routeId: string, - data: CommonModels.CopyRouteRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, - ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/positionRoutes/positionRoutes.queries.ts b/test/generated/dist/positionRoutes/positionRoutes.queries.ts deleted file mode 100644 index 78de073..0000000 --- a/test/generated/dist/positionRoutes/positionRoutes.queries.ts +++ /dev/null @@ -1,263 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionRoutesAcl } from "./positionRoutes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionRoutesApi } from "./positionRoutes.api"; - -export namespace PositionRoutesQueries { - export const moduleName = QueryModule.PositionRoutes; - - export const keys = { - all: [moduleName] as const, - listRoutes: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/routes", officeId, positionId] as const, - }; - - /** - * Query `useListRoutes` - * @summary List routes with points for a position (unified for sea/air/road) - * @permission Requires `canUseListRoutes` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListRoutes = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoutes(officeId, positionId), - queryFn: () => { - checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId })); - return PositionRoutesApi.listRoutes(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreateRoutePoint` - * @summary Create a route point - * @permission Requires `canUseCreateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateRoutePoint = ( - options?: AppMutationOptions< - typeof PositionRoutesApi.createRoutePoint, - { officeId: string; positionId: string; routeId: string; data: CommonModels.CreateRoutePointRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, data }) => { - checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId })); - return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateRoutePoint` - * @summary Update a route point - * @permission Requires `canUseUpdateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateRoutePoint = ( - options?: AppMutationOptions< - typeof PositionRoutesApi.updateRoutePoint, - { - officeId: string; - positionId: string; - routeId: string; - pointId: string; - data: CommonModels.UpdateRoutePointRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { - checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId })); - return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteRoutePoint` - * @summary Delete a route point - * @permission Requires `canUseDeleteRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteRoutePoint = ( - options?: AppMutationOptions< - typeof PositionRoutesApi.deleteRoutePoint, - { officeId: string; positionId: string; routeId: string; pointId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, pointId }) => { - checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId })); - return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useSplitRoutes` - * @summary Split routes by cargo (sea positions only) - * @permission Requires `canUseSplitRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useSplitRoutes = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId })); - return PositionRoutesApi.splitRoutes(officeId, positionId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useMergeRoutes` - * @summary Merge routes (sea positions only) - * @permission Requires `canUseMergeRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useMergeRoutes = ( - options?: AppMutationOptions< - typeof PositionRoutesApi.mergeRoutes, - { officeId: string; positionId: string; data: CommonModels.MergeRoutesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId })); - return PositionRoutesApi.mergeRoutes(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCopyRoute` - * @summary Copy route points to another route (sea positions only) - * @permission Requires `canUseCopyRoute` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useCopyRoute = ( - options?: AppMutationOptions< - typeof PositionRoutesApi.copyRoute, - { officeId: string; positionId: string; routeId: string; data: CommonModels.CopyRouteRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, data }) => { - checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId })); - return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/positions/positions.acl.ts b/test/generated/dist/positions/positions.acl.ts deleted file mode 100644 index d2624a2..0000000 --- a/test/generated/dist/positions/positions.acl.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionsAcl { - /** - * Use for `useFindAll` query ability. For global ability, omit the object parameter. - * @description List position labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ - export const canUseFindAll = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Create", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useTotalProfit` query ability. For global ability, omit the object parameter. - * @description Fake endpoint - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTotalProfit` query - */ - export const canUseTotalProfit = (object?: { officeId: string }) => - ["TotalProfitView", object ? subject("PositionAccount", object) : "PositionAccount"] as AbilityTuple< - "TotalProfitView", - "PositionAccount" | (ForcedSubject<"PositionAccount"> & { officeId: string }) - >; - - /** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ - export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useExportPositions` mutation ability. For global ability, omit the object parameter. - * @description Export positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportPositions` mutation - */ - export const canUseExportPositions = (object?: { officeId: string }) => - ["Export", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Export", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useListRouteLabels` query ability. For global ability, omit the object parameter. - * @description List route labels for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRouteLabels` query - */ - export const canUseListRouteLabels = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useGetDuplicateDefaultParameters` query ability. For global ability, omit the object parameter. - * @description Read position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDuplicateDefaultParameters` query - */ - export const canUseGetDuplicateDefaultParameters = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ - export const canUseDuplicate = (object?: { officeId: string }) => - ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Create", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ - export const canUseCancel = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useRevertCancel` mutation ability. For global ability, omit the object parameter. - * @description Revert cancelled position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertCancel` mutation - */ - export const canUseRevertCancel = (object?: { officeId: string }) => - ["RevertCancel", object ? subject("Position", object) : "Position"] as AbilityTuple< - "RevertCancel", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useLinkChild` mutation ability. For global ability, omit the object parameter. - * @description Link positions to parent - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLinkChild` mutation - */ - export const canUseLinkChild = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useUnlinkChild` mutation ability. For global ability, omit the object parameter. - * @description Link positions to parent - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlinkChild` mutation - */ - export const canUseUnlinkChild = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useListChild` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListChild` query - */ - export const canUseListChild = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/positions/positions.api.ts b/test/generated/dist/positions/positions.api.ts deleted file mode 100644 index 641e0fb..0000000 --- a/test/generated/dist/positions/positions.api.ts +++ /dev/null @@ -1,262 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionsApi { - export const findAll = ( - officeId: string, - limit: number, - filter?: PositionsModels.PositionLabelsFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsFindAllResponseSchema }, - `/offices/${officeId}/positions/labels`, - { - ...config, - params: { - filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: PositionsModels.PositionFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsPaginateResponseSchema }, - `/offices/${officeId}/positions`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = ( - officeId: string, - data: PositionsModels.CreatePositionRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions`, - ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), - config, - ); - }; - export const totalProfit = (officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionsModels.TotalProfitResponseSchema }, - `/offices/${officeId}/positions/fake-total-profit`, - config, - ); - }; - export const listAvailablePartnersFor = ( - officeId: string, - positionId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/positions/${positionId}/available-partners`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { - type: "query", - name: "useCase", - }), - }, - }, - ); - }; - export const exportPositions = ( - officeId: string, - data: PositionsModels.PositionExportRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/exports`, - ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}`, - config, - ); - }; - export const update = ( - officeId: string, - positionId: string, - data: PositionsModels.UpdatePositionDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}`, - ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), - config, - ); - }; - export const listRouteLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/routes/labels`, - config, - ); - }; - export const getDuplicateDefaultParameters = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, - config, - ); - }; - export const duplicate = ( - officeId: string, - positionId: string, - data: PositionsModels.DuplicatePositionRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/duplicate`, - ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), - config, - ); - }; - export const cancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/cancel`, - undefined, - config, - ); - }; - export const revertCancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/uncancel`, - undefined, - config, - ); - }; - export const linkChild = ( - officeId: string, - positionId: string, - data: PositionsModels.LinkChildPositionsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/children`, - ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), - config, - ); - }; - export const unlinkChild = ( - officeId: string, - positionId: string, - data: PositionsModels.UnlinkChildPositionsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/children`, - ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), - config, - ); - }; - export const listChild = ( - officeId: string, - positionId: string, - limit: number, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: PositionsModels.ListChildResponseSchema }, - `/offices/${officeId}/positions/${positionId}/children`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; -} diff --git a/test/generated/dist/positions/positions.configs.ts b/test/generated/dist/positions/positions.configs.ts deleted file mode 100644 index a75b161..0000000 --- a/test/generated/dist/positions/positions.configs.ts +++ /dev/null @@ -1,258 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionsQueries } from "./positions.queries"; -import { PositionsAcl } from "./positions.acl"; - -export namespace PositionsConfigs { - export const positionsConfig = { - meta: { - title: "Positions", - }, - readAll: { - acl: PositionsAcl.canUsePaginate, - schema: PositionsModels.PositionPreviewResponseDtoSchema, - paginated: PositionsQueries.usePaginate, - infinite: PositionsQueries.usePaginateInfinite, - filters: { - schema: PositionsModels.PositionFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionsModels.PositionFilterDtoSchema, - options: { - inputs: { - transportMode: true, - customerId: true, - carrierId: true, - consigneeId: true, - isCancelled: true, - status: true, - number: true, - direction: true, - loadType: true, - serviceType: true, - employee: true, - searchQuery: true, - externalSystemId: true, - createdAt: true, - serviceDate: true, - departureDate: true, - arrivalDate: true, - blfromCostumerDate: true, - blfromCarrierDate: true, - customsDate: true, - vgmCustomerDate: true, - partnerNetworkId: true, - projectLiteId: true, - checklistItemsDone: true, - checklistItemsNotDone: true, - routing: true, - isExcludedFromStatistics: true, - isMasterPosition: true, - loadingPortId: true, - dischargePortId: true, - customerReference: true, - carrierReference: true, - consigneeReference: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: PositionsModels.PositionPreviewResponseDtoSchema, - options: { - columns: { - id: true, - externalSystemId: true, - transportMode: true, - direction: true, - loadType: true, - createdAt: true, - number: true, - isCancelled: true, - customer: true, - customerReference: true, - consignee: true, - consigneeReference: true, - carrier: true, - carrierReference: true, - positionNumber: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - origin: true, - loadDate: true, - loadingPort: true, - dischargePort: true, - destination: true, - deliveryDate: true, - equipment: true, - serviceType: true, - destinationOffice: true, - currency: true, - profit: true, - margin: true, - employee: true, - project: true, - serviceDate: true, - departureDate: true, - arrivalDate: true, - blfromCostumerDate: true, - blfromCarrierDate: true, - customsDate: true, - vgmCustomerDate: true, - routing: true, - notes: true, - isMasterPosition: true, - hasInvoices: true, - parentPosition: true, - }, - sortable: PositionsModels.PositionsPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: PositionsAcl.canUseGet, - schema: CommonModels.PositionCoreResponseDtoSchema, - query: PositionsQueries.useGet, - }, - create: { - acl: PositionsAcl.canUseCreate, - schema: PositionsModels.CreatePositionRequestDtoSchema, - mutation: PositionsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PositionsModels.CreatePositionRequestDtoSchema, - options: { - inputs: { - section: true, - direction: true, - transportMode: true, - loadType: true, - serviceType: true, - estimatedServiceDate: true, - customerBusinessPartnerId: true, - }, - }, - }), - }, - update: { - acl: PositionsAcl.canUseUpdate, - schema: PositionsModels.UpdatePositionDtoSchema, - mutation: PositionsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PositionsModels.UpdatePositionDtoSchema, - options: { - inputs: { - externalSystemId: true, - statusDate: true, - status: true, - loadType: true, - incoterms: true, - secondIncoterms: true, - fillingCompany: true, - sellingContract: true, - fillingScacCode: true, - serviceValidity: true, - ratesValidity: true, - serviceType: true, - buyRateReference: true, - frequency: true, - isParentPosition: true, - isExcludedFromStatistics: true, - team: true, - salesRepId: true, - responsibleEmployeeId: true, - receivedByEmployeeId: true, - originOfficeId: true, - projectLiteId: true, - notes: true, - inttraTypeOfMove: true, - volumetricWeightModifier: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: PositionsAcl.canUseFindAll, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PositionsQueries.useFindAll, - infinite: PositionsQueries.useFindAllInfinite, - filters: { - schema: PositionsModels.PositionLabelsFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionsModels.PositionLabelsFilterDtoSchema, - options: { - inputs: { - search: true, - isParentPosition: true, - isLinkedPosition: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - }, - }), - }, - }; - - export const childrenConfig = { - meta: { - title: "Children", - }, - readAll: { - acl: PositionsAcl.canUseListChild, - schema: PositionsModels.ChildPositionResponseDtoSchema, - paginated: PositionsQueries.useListChild, - infinite: PositionsQueries.useListChildInfinite, - columns: dynamicColumns({ - schema: PositionsModels.ChildPositionResponseDtoSchema, - options: { - columns: { - id: true, - number: true, - packages: true, - weight: true, - volume: true, - customer: true, - profit: true, - }, - }, - }), - }, - create: { - acl: PositionsAcl.canUseLinkChild, - schema: PositionsModels.LinkChildPositionsRequestDtoSchema, - mutation: PositionsQueries.useLinkChild, - inputDefs: dynamicInputs({ - schema: PositionsModels.LinkChildPositionsRequestDtoSchema, - options: { - inputs: { - childPositionIds: true, - }, - }, - }), - }, - }; -} diff --git a/test/generated/dist/positions/positions.models.ts b/test/generated/dist/positions/positions.models.ts deleted file mode 100644 index 8949f00..0000000 --- a/test/generated/dist/positions/positions.models.ts +++ /dev/null @@ -1,888 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionsModels { - /** - * PositionPreviewResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } externalSystemId - * @property { CommonModels.TransportModeEnum } transportMode - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { string } createdAt - * @property { string } number - * @property { boolean } isCancelled - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { string } customer.phone - * @property { string } customer.email - * @property { string } customerReference - * @property { object } consignee - * @property { string } consignee.id - * @property { string } consignee.name - * @property { string } consignee.matchCode - * @property { string } consignee.label - * @property { string } consigneeReference - * @property { object } carrier - * @property { string } carrier.id - * @property { string } carrier.name - * @property { string } carrier.matchCode - * @property { string } carrier.label - * @property { string } carrierReference - * @property { number } positionNumber - * @property { string } hblNumber - * @property { string } mblNumber - * @property { string } bookingNumber - * @property { string } vessel - * @property { string } voyage - * @property { string } vesselCarrier Carrier name from route point (sea positions only) - * @property { object } origin - * @property { string } origin.id - * @property { string } origin.name - * @property { string } loadDate - * @property { object } loadingPort - * @property { string } loadingPort.id - * @property { string } loadingPort.name - * @property { object } dischargePort - * @property { string } dischargePort.id - * @property { string } dischargePort.name - * @property { object } destination - * @property { string } destination.id - * @property { string } destination.name - * @property { string } deliveryDate - * @property { string } equipment - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { object } destinationOffice - * @property { string } destinationOffice.id - * @property { string } destinationOffice.name - * @property { string } currency - * @property { number } profit - * @property { number } margin - * @property { object } employee - * @property { string } employee.id - * @property { string } employee.name - * @property { object } project - * @property { string } project.id - * @property { string } project.name - * @property { string } serviceDate - * @property { string } departureDate - * @property { string } arrivalDate - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.EditorContentResponseDto } notes Notes - * @property { boolean } isMasterPosition - * @property { boolean } hasInvoices Whether this position has at least one invoice - * @property { object } parentPosition - * @property { string } parentPosition.id - * @property { string } parentPosition.number - */ - export const PositionPreviewResponseDtoSchema = z - .object({ - id: z.string(), - externalSystemId: z.string().nullish(), - transportMode: CommonModels.TransportModeEnumSchema, - direction: CommonModels.DirectionEnumSchema, - loadType: CommonModels.LoadTypeEnumSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }).nullish(), - number: z.string(), - isCancelled: z.boolean(), - customer: z - .object({ - id: z.string(), - name: z.string(), - matchCode: z.string(), - label: z.string(), - phone: z.string().nullish(), - email: z.string().nullish(), - }) - .readonly(), - customerReference: z.string().nullish(), - consignee: z - .object({ - id: z.string().nullable(), - name: z.string().nullable(), - matchCode: z.string().nullable(), - label: z.string().nullable(), - }) - .readonly() - .nullish(), - consigneeReference: z.string().nullish(), - carrier: z - .object({ - id: z.string().nullable(), - name: z.string().nullable(), - matchCode: z.string().nullable(), - label: z.string().nullable(), - }) - .readonly() - .nullish(), - carrierReference: z.string().nullish(), - positionNumber: z.number().nullish(), - hblNumber: z.string().nullish(), - mblNumber: z.string().nullish(), - bookingNumber: z.string().nullish(), - vessel: z.string().nullish(), - voyage: z.string().nullish(), - vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), - origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - loadDate: z.iso.datetime({ offset: true }).nullish(), - loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - deliveryDate: z.iso.datetime({ offset: true }).nullish(), - equipment: z.string().nullish(), - serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), - destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - currency: z.string().nullish(), - profit: z.number().nullish(), - margin: z.number().nullish(), - employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), - serviceDate: z.iso.datetime({ offset: true }).nullish(), - departureDate: z.iso.datetime({ offset: true }).nullish(), - arrivalDate: z.iso.datetime({ offset: true }).nullish(), - blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), - blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), - customsDate: z.iso.datetime({ offset: true }).nullish(), - vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), - routing: CommonModels.SeaRoutingEnumSchema.nullish(), - notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), - isMasterPosition: z.boolean(), - hasInvoices: z.boolean().describe("Whether this position has at least one invoice").nullish(), - parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).readonly().nullish(), - }) - .readonly(); - export type PositionPreviewResponseDto = z.infer; - - /** - * PositionFilterDtoSchema - * @type { object } - * @property { CommonModels.TransportModeEnum } transportMode - * @property { string[] } customerId - * @property { string[] } carrierId Filter positions by carrier IDs - * @property { string[] } consigneeId Filter positions by consignee IDs - * @property { boolean } isCancelled - * @property { CommonModels.PositionStatusEnum } status - * @property { string } number - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } employee Filter positions by employee IDs - * @property { string } searchQuery - * @property { string } externalSystemId Filter positions by external system ID (substring match) - * @property { CommonModels.DateRangeDto } createdAt - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.DateRangeDto } departureDate - * @property { CommonModels.DateRangeDto } arrivalDate - * @property { CommonModels.DateRangeDto } blfromCostumerDate - * @property { CommonModels.DateRangeDto } blfromCarrierDate - * @property { CommonModels.DateRangeDto } customsDate - * @property { CommonModels.DateRangeDto } vgmCustomerDate - * @property { string } partnerNetworkId Filter positions by partner network ID - * @property { string[] } projectLiteId Filter positions by project IDs - * @property { string[] } checklistItemsDone Checklist item ids that must be completed - * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics - * @property { boolean } isMasterPosition - * @property { string[] } loadingPortId Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure) - * @property { string[] } dischargePortId Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport) - * @property { string } customerReference Filter positions by customer reference - * @property { string } carrierReference Filter positions by carrier reference - * @property { string } consigneeReference Filter positions by consignee reference - * @property { string } hblNumber Filter positions by HBL/HAWB number - * @property { string } mblNumber Filter positions by MBL/MAWB number - * @property { string } bookingNumber Filter positions by booking number - * @property { string } vessel Filter positions by vessel name - * @property { string } voyage Filter positions by voyage number - * @property { string } vesselCarrier Filter positions by vessel or carrier name - */ - export const PositionFilterDtoSchema = z - .object({ - transportMode: CommonModels.TransportModeEnumSchema, - customerId: z.array(z.string()).readonly(), - carrierId: z.array(z.string()).readonly().describe("Filter positions by carrier IDs"), - consigneeId: z.array(z.string()).readonly().describe("Filter positions by consignee IDs"), - isCancelled: z.boolean(), - status: CommonModels.PositionStatusEnumSchema, - number: z.string(), - direction: CommonModels.DirectionEnumSchema, - loadType: CommonModels.LoadTypeEnumSchema, - serviceType: CommonModels.ServiceTypeEnumSchema, - employee: z.array(z.string()).readonly().describe("Filter positions by employee IDs"), - searchQuery: z.string(), - externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), - createdAt: CommonModels.DateRangeDtoSchema, - serviceDate: CommonModels.DateRangeDtoSchema, - departureDate: CommonModels.DateRangeDtoSchema, - arrivalDate: CommonModels.DateRangeDtoSchema, - blfromCostumerDate: CommonModels.DateRangeDtoSchema, - blfromCarrierDate: CommonModels.DateRangeDtoSchema, - customsDate: CommonModels.DateRangeDtoSchema, - vgmCustomerDate: CommonModels.DateRangeDtoSchema, - partnerNetworkId: z.string().describe("Filter positions by partner network ID"), - projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), - checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), - checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), - routing: CommonModels.SeaRoutingEnumSchema, - isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - isMasterPosition: z.boolean(), - loadingPortId: z - .array(z.string()) - .readonly() - .describe( - "Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure)", - ), - dischargePortId: z - .array(z.string()) - .readonly() - .describe( - "Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport)", - ), - customerReference: z.string().describe("Filter positions by customer reference"), - carrierReference: z.string().describe("Filter positions by carrier reference"), - consigneeReference: z.string().describe("Filter positions by consignee reference"), - hblNumber: z.string().describe("Filter positions by HBL/HAWB number"), - mblNumber: z.string().describe("Filter positions by MBL/MAWB number"), - bookingNumber: z.string().describe("Filter positions by booking number"), - vessel: z.string().describe("Filter positions by vessel name"), - voyage: z.string().describe("Filter positions by voyage number"), - vesselCarrier: z.string().describe("Filter positions by vessel or carrier name"), - }) - .readonly(); - export type PositionFilterDto = z.infer; - - /** - * PositionExportFilterDtoSchema - * @type { object } - * @property { CommonModels.TransportModeEnum } transportMode - * @property { string[] } customerId - * @property { boolean } isCancelled - * @property { CommonModels.PositionStatusEnum } status - * @property { string } number - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } responsibleEmployee Filter positions by responsible employee IDs - * @property { string } searchQuery - * @property { string } externalSystemId Filter positions by external system ID (substring match) - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.DateRangeDto } dateOfDeparture - * @property { CommonModels.DateRangeDto } dateOfArrival - * @property { CommonModels.DateRangeDto } blfromCostumerDate - * @property { CommonModels.DateRangeDto } blfromCarrierDate - * @property { CommonModels.DateRangeDto } customsDate - * @property { CommonModels.DateRangeDto } vgmCustomerDate - * @property { string } partnerNetworkId Filter positions by partner network ID - * @property { string[] } projectLiteId Filter positions by project IDs - * @property { string[] } checklistItemsDone Checklist item ids that must be completed - * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics - */ - export const PositionExportFilterDtoSchema = z - .object({ - transportMode: CommonModels.TransportModeEnumSchema, - customerId: z.array(z.string()).readonly(), - isCancelled: z.boolean(), - status: CommonModels.PositionStatusEnumSchema, - number: z.string(), - direction: CommonModels.DirectionEnumSchema, - loadType: CommonModels.LoadTypeEnumSchema, - serviceType: CommonModels.ServiceTypeEnumSchema, - responsibleEmployee: z.array(z.string()).readonly().describe("Filter positions by responsible employee IDs"), - searchQuery: z.string(), - externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), - statusDate: CommonModels.DateRangeDtoSchema, - serviceDate: CommonModels.DateRangeDtoSchema, - dateOfDeparture: CommonModels.DateRangeDtoSchema, - dateOfArrival: CommonModels.DateRangeDtoSchema, - blfromCostumerDate: CommonModels.DateRangeDtoSchema, - blfromCarrierDate: CommonModels.DateRangeDtoSchema, - customsDate: CommonModels.DateRangeDtoSchema, - vgmCustomerDate: CommonModels.DateRangeDtoSchema, - partnerNetworkId: z.string().describe("Filter positions by partner network ID"), - projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), - checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), - checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), - routing: CommonModels.SeaRoutingEnumSchema, - isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), - }) - .readonly(); - export type PositionExportFilterDto = z.infer; - - /** - * PositionExportColumnSchema - * @type { enum } - */ - export const PositionExportColumnSchema = z.enum([ - "id", - "externalSystemId", - "transportMode", - "direction", - "loadType", - "createdAt", - "number", - "isCancelled", - "customerName", - "customerPhone", - "customerEmail", - "customerReference", - "consigneeName", - "consigneeReference", - "carrierName", - "carrierReference", - "positionNumber", - "hblNumber", - "mblNumber", - "bookingNumber", - "vessel", - "voyage", - "originName", - "loadDate", - "loadingPortName", - "dischargePortName", - "destinationName", - "deliveryDate", - "equipment", - "serviceTypeName", - "departureDate", - "arrivalDate", - "destinationOfficeName", - "currency", - "profit", - "margin", - "employeeName", - "projectName", - "serviceDate", - "routing", - "notes", - "blFromCustomerDate", - "blFromCarrierDate", - "customsDate", - "vgmCustomerDate", - "isMasterPosition", - "parentPositionId", - "parentPositionNumber", - ]); - export type PositionExportColumn = z.infer; - export const PositionExportColumn = PositionExportColumnSchema.enum; - - /** - * PositionExportRequestDtoSchema - * @type { object } - * @property { string } order Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @property { PositionExportColumn[] } columns Min Items: `1` - * @property { PositionExportFilterDto } filter - */ - export const PositionExportRequestDtoSchema = z - .object({ - order: z - .string() - .describe( - "Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition", - ), - columns: z.array(PositionExportColumnSchema).readonly().min(1), - filter: PositionExportFilterDtoSchema, - }) - .readonly(); - export type PositionExportRequestDto = z.infer; - - /** - * CreatePositionRequestDtoSchema - * @type { object } - * @property { CommonModels.SectionEnum } section - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum } transportMode - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } estimatedServiceDate - * @property { string } customerBusinessPartnerId - */ - export const CreatePositionRequestDtoSchema = z - .object({ - section: CommonModels.SectionEnumSchema, - direction: CommonModels.DirectionEnumSchema, - transportMode: CommonModels.TransportModeEnumSchema, - loadType: CommonModels.LoadTypeEnumSchema, - serviceType: CommonModels.ServiceTypeEnumSchema, - estimatedServiceDate: z.iso.datetime({ offset: true }), - customerBusinessPartnerId: z.string(), - }) - .readonly(); - export type CreatePositionRequestDto = z.infer; - - /** - * DuplicatePositionPackageInformationParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } packageType - * @property { boolean } packageQuantity - * @property { boolean } packageDescription - * @property { boolean } packageHsCodes - * @property { boolean } packageNetWeight - * @property { boolean } packageGrossWeight - * @property { boolean } packageCaseMark - * @property { boolean } packageNote - * @property { boolean } packageCustomsMark - */ - export const DuplicatePositionPackageInformationParametersDtoSchema = z - .object({ - enabled: z.boolean(), - packageType: z.boolean(), - packageQuantity: z.boolean(), - packageDescription: z.boolean(), - packageHsCodes: z.boolean(), - packageNetWeight: z.boolean(), - packageGrossWeight: z.boolean(), - packageCaseMark: z.boolean(), - packageNote: z.boolean(), - packageCustomsMark: z.boolean(), - }) - .readonly(); - export type DuplicatePositionPackageInformationParametersDto = z.infer< - typeof DuplicatePositionPackageInformationParametersDtoSchema - >; - - /** - * DuplicatePositionCargoParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { DuplicatePositionPackageInformationParametersDto } packageInformation - */ - export const DuplicatePositionCargoParametersDtoSchema = z - .object({ enabled: z.boolean(), packageInformation: DuplicatePositionPackageInformationParametersDtoSchema }) - .readonly(); - export type DuplicatePositionCargoParametersDto = z.infer; - - /** - * DuplicatePositionOverviewParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } quoteReference - */ - export const DuplicatePositionOverviewParametersDtoSchema = z - .object({ enabled: z.boolean(), quoteReference: z.boolean() }) - .readonly(); - export type DuplicatePositionOverviewParametersDto = z.infer; - - /** - * DuplicatePositionInvolvedPartiesParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } involvedPartySection - */ - export const DuplicatePositionInvolvedPartiesParametersDtoSchema = z - .object({ enabled: z.boolean(), involvedPartySection: z.boolean() }) - .readonly(); - export type DuplicatePositionInvolvedPartiesParametersDto = z.infer< - typeof DuplicatePositionInvolvedPartiesParametersDtoSchema - >; - - /** - * DuplicatePositionRoutesParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } routeDates - * @property { boolean } routeLocation - */ - export const DuplicatePositionRoutesParametersDtoSchema = z - .object({ enabled: z.boolean(), routeDates: z.boolean(), routeLocation: z.boolean() }) - .readonly(); - export type DuplicatePositionRoutesParametersDto = z.infer; - - /** - * DuplicatePositionFinanceAccountParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } exchangeRate - */ - export const DuplicatePositionFinanceAccountParametersDtoSchema = z - .object({ enabled: z.boolean(), exchangeRate: z.boolean() }) - .readonly(); - export type DuplicatePositionFinanceAccountParametersDto = z.infer< - typeof DuplicatePositionFinanceAccountParametersDtoSchema - >; - - /** - * DuplicatePositionDocumentsParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } hblWorkingDocument - * @property { boolean } siWorkingDocument - */ - export const DuplicatePositionDocumentsParametersDtoSchema = z - .object({ enabled: z.boolean(), hblWorkingDocument: z.boolean(), siWorkingDocument: z.boolean() }) - .readonly(); - export type DuplicatePositionDocumentsParametersDto = z.infer; - - /** - * DuplicatePositionParametersDtoSchema - * @type { object } - * @property { DuplicatePositionOverviewParametersDto } overview - * @property { DuplicatePositionInvolvedPartiesParametersDto } involvedParties - * @property { DuplicatePositionCargoParametersDto } cargo - * @property { DuplicatePositionRoutesParametersDto } routes - * @property { DuplicatePositionFinanceAccountParametersDto } financeAccount - * @property { DuplicatePositionDocumentsParametersDto } documents - */ - export const DuplicatePositionParametersDtoSchema = z - .object({ - overview: DuplicatePositionOverviewParametersDtoSchema, - involvedParties: DuplicatePositionInvolvedPartiesParametersDtoSchema, - cargo: DuplicatePositionCargoParametersDtoSchema, - routes: DuplicatePositionRoutesParametersDtoSchema, - financeAccount: DuplicatePositionFinanceAccountParametersDtoSchema, - documents: DuplicatePositionDocumentsParametersDtoSchema, - }) - .readonly(); - export type DuplicatePositionParametersDto = z.infer; - - /** - * DuplicatePositionDefaultParametersResponseDtoSchema - * @type { object } - * @property { string } estimatedServiceDate Suggested estimated service date for the duplicated position (ISO 8601) - * @property { DuplicatePositionParametersDto } parameters Default duplication parameters with section and sub-parameter flags - */ - export const DuplicatePositionDefaultParametersResponseDtoSchema = z - .object({ - estimatedServiceDate: z - .string() - .describe("Suggested estimated service date for the duplicated position (ISO 8601)"), - parameters: DuplicatePositionParametersDtoSchema.describe( - "Default duplication parameters with section and sub-parameter flags", - ), - }) - .readonly(); - export type DuplicatePositionDefaultParametersResponseDto = z.infer< - typeof DuplicatePositionDefaultParametersResponseDtoSchema - >; - - /** - * PositionSectionEnumSchema - * @type { enum } - */ - export const PositionSectionEnumSchema = z.enum([ - "overview", - "involvedParties", - "cargo", - "financeAccount", - "routes", - "routeDates", - "documents", - ]); - export type PositionSectionEnum = z.infer; - export const PositionSectionEnum = PositionSectionEnumSchema.enum; - - /** - * DuplicatePositionRequestDtoSchema - * @type { object } - * @property { PositionSectionEnum[] } sections Legacy: sections to duplicate. Ignored when parameters is provided. - * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. - * @property { string } estimatedServiceDate - */ - export const DuplicatePositionRequestDtoSchema = z - .object({ - sections: z - .array(PositionSectionEnumSchema) - .readonly() - .describe("Legacy: sections to duplicate. Ignored when parameters is provided.") - .nullish(), - parameters: DuplicatePositionParametersDtoSchema.describe( - "Nested parameters for duplication control. Preferred over sections.", - ).nullish(), - estimatedServiceDate: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type DuplicatePositionRequestDto = z.infer; - - /** - * UpdatePositionDtoSchema - * @type { object } - * @property { string } externalSystemId - * @property { string } statusDate - * @property { CommonModels.PositionStatusEnum } status - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.IncotermsEnum } incoterms - * @property { CommonModels.IncotermsEnum } secondIncoterms - * @property { string } fillingCompany - * @property { string } sellingContract - * @property { string } fillingScacCode - * @property { string } serviceValidity - * @property { string } ratesValidity - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } buyRateReference - * @property { CommonModels.FrequencyEnum } frequency - * @property { boolean } isParentPosition - * @property { boolean } isExcludedFromStatistics - * @property { string } team - * @property { string } salesRepId - * @property { string } responsibleEmployeeId - * @property { string } receivedByEmployeeId - * @property { string } originOfficeId - * @property { string } projectLiteId - * @property { CommonModels.EditorContentUpdateDto } notes Notes - * @property { CommonModels.MovementTypeEnum } inttraTypeOfMove - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ - export const UpdatePositionDtoSchema = z - .object({ - externalSystemId: z.string(), - statusDate: z.iso.datetime({ offset: true }), - status: CommonModels.PositionStatusEnumSchema, - loadType: CommonModels.LoadTypeEnumSchema, - incoterms: CommonModels.IncotermsEnumSchema, - secondIncoterms: CommonModels.IncotermsEnumSchema, - fillingCompany: z.string(), - sellingContract: z.string(), - fillingScacCode: z.string(), - serviceValidity: z.iso.datetime({ offset: true }), - ratesValidity: z.iso.datetime({ offset: true }), - serviceType: CommonModels.ServiceTypeEnumSchema, - buyRateReference: z.string(), - frequency: CommonModels.FrequencyEnumSchema, - isParentPosition: z.boolean(), - isExcludedFromStatistics: z.boolean(), - team: z.string(), - salesRepId: z.string(), - responsibleEmployeeId: z.string(), - receivedByEmployeeId: z.string(), - originOfficeId: z.string(), - projectLiteId: z.string(), - notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), - inttraTypeOfMove: CommonModels.MovementTypeEnumSchema, - volumetricWeightModifier: z.number().describe("Volumetric weight modifier"), - }) - .readonly(); - export type UpdatePositionDto = z.infer; - - /** - * ChildPositionCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ChildPositionCustomerDto = z.infer; - - /** - * ChildPositionProfitDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currency - */ - export const ChildPositionProfitDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); - export type ChildPositionProfitDto = z.infer; - - /** - * ChildPositionResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { number } packages - * @property { number } weight - * @property { number } volume - * @property { ChildPositionCustomerDto } customer - * @property { ChildPositionProfitDto } profit - */ - export const ChildPositionResponseDtoSchema = z - .object({ - id: z.string(), - number: z.string(), - packages: z.number(), - weight: z.number(), - volume: z.number(), - customer: ChildPositionCustomerDtoSchema, - profit: ChildPositionProfitDtoSchema, - }) - .readonly(); - export type ChildPositionResponseDto = z.infer; - - /** - * PositionLabelsFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } isParentPosition - * @property { boolean } isLinkedPosition - */ - export const PositionLabelsFilterDtoSchema = z - .object({ search: z.string(), isParentPosition: z.boolean(), isLinkedPosition: z.boolean() }) - .readonly(); - export type PositionLabelsFilterDto = z.infer; - - /** - * PositionListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ - export const PositionListResponseDtoSchema = z - .object({ - items: z.array(z.string()).readonly().describe("Items"), - totalProfit: z.number(), - profitPerPosition: z.number(), - page: z.number().describe("1-indexed page number to begin from").nullish(), - cursor: z.string().describe("ID of item to start after").nullish(), - nextCursor: z.string().describe("Cursor for next set of items").nullish(), - limit: z.number().describe("Items per response"), - totalItems: z.number().describe("Total available items"), - }) - .readonly(); - export type PositionListResponseDto = z.infer; - - /** - * LinkChildPositionsRequestDtoSchema - * @type { object } - * @property { string[] } childPositionIds - */ - export const LinkChildPositionsRequestDtoSchema = z - .object({ childPositionIds: z.array(z.string()).readonly() }) - .readonly(); - export type LinkChildPositionsRequestDto = z.infer; - - /** - * UnlinkChildPositionsRequestDtoSchema - * @type { object } - * @property { string[] } childPositionIds - */ - export const UnlinkChildPositionsRequestDtoSchema = z - .object({ childPositionIds: z.array(z.string()).readonly() }) - .readonly(); - export type UnlinkChildPositionsRequestDto = z.infer; - - /** - * PositionsFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PositionsFindAllResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PositionsFindAllResponse = z.infer; - - /** - * PositionsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const PositionsPaginateOrderParamEnumSchema = z.enum([ - "number", - "transportMode", - "isCancelled", - "direction", - "loadType", - "serviceDate", - "createdAt", - "departureDate", - "arrivalDate", - "blfromCostumerDate", - "blfromCarrierDate", - "customsDate", - "vgmCustomerDate", - "serviceType", - "externalSystemId", - "employee", - "project", - "profit", - "margin", - "isMasterPosition", - ]); - export type PositionsPaginateOrderParamEnum = z.infer; - export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSchema.enum; - - /** - * PositionsPaginateResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionPreviewResponseDto[] } items - */ - export const PositionsPaginateResponseSchema = z.object({ - ...PositionListResponseDtoSchema.shape, - ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape, - }); - export type PositionsPaginateResponse = z.infer; - - /** - * TotalProfitResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionPreviewResponseDto[] } items - */ - export const TotalProfitResponseSchema = z.object({ - ...PositionListResponseDtoSchema.shape, - ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape, - }); - export type TotalProfitResponse = z.infer; - - /** - * PositionsListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ - export const PositionsListAvailablePartnersForResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PositionsListAvailablePartnersForResponse = z.infer< - typeof PositionsListAvailablePartnersForResponseSchema - >; - - /** - * ListRouteLabelsResponseSchema - * @type { array } - */ - export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type ListRouteLabelsResponse = z.infer; - - /** - * ListChildResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChildPositionResponseDto[] } items - */ - export const ListChildResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ChildPositionResponseDtoSchema).readonly() }).readonly().shape, - }); - export type ListChildResponse = z.infer; -} diff --git a/test/generated/dist/positions/positions.queries.ts b/test/generated/dist/positions/positions.queries.ts deleted file mode 100644 index b3e5df0..0000000 --- a/test/generated/dist/positions/positions.queries.ts +++ /dev/null @@ -1,757 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionsAcl } from "./positions.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionsApi } from "./positions.api"; - -export namespace PositionsQueries { - export const moduleName = QueryModule.Positions; - - export const keys = { - all: [moduleName] as const, - findAll: ( - officeId: string, - limit?: number, - filter?: PositionsModels.PositionLabelsFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/positions/labels", officeId, limit, filter, page, cursor] as const, - findAllInfinite: ( - officeId: string, - limit?: number, - filter?: PositionsModels.PositionLabelsFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/positions/labels", "infinite", officeId, limit, filter, cursor] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: PositionsModels.PositionFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/positions", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: PositionsModels.PositionFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/positions", "infinite", officeId, limit, order, filter, cursor] as const, - totalProfit: (officeId: string) => - [...keys.all, "/offices/:officeId/positions/fake-total-profit", officeId] as const, - listAvailablePartnersFor: ( - officeId: string, - positionId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/available-partners", - officeId, - positionId, - search, - useCase, - ] as const, - get: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId", officeId, positionId] as const, - listRouteLabels: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/routes/labels", officeId, positionId] as const, - getDuplicateDefaultParameters: (officeId: string, positionId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/duplicate/default-parameters", - officeId, - positionId, - ] as const, - listChild: (officeId: string, positionId: string, limit?: number, page?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/children", - officeId, - positionId, - limit, - page, - cursor, - ] as const, - listChildInfinite: (officeId: string, positionId: string, limit?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/children", - "infinite", - officeId, - positionId, - limit, - cursor, - ] as const, - }; - - /** - * Query `useFindAll` - * @summary List all positions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAll = ( - { - officeId, - limit, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - filter?: PositionsModels.PositionLabelsFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(officeId, limit, filter, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUseFindAll({ officeId })); - return PositionsApi.findAll(officeId, limit, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useFindAllInfinite - * @summary List all positions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindAllInfinite = ( - { - officeId, - limit, - filter, - cursor, - }: { officeId: string; limit: number; filter?: PositionsModels.PositionLabelsFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUseFindAll({ officeId })); - return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginate` - * @summary List positions - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @param { PositionsModels.PositionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: PositionsModels.PositionFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUsePaginate({ officeId })); - return PositionsApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary List positions - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @param { PositionsModels.PositionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { officeId: string; limit: number; order?: string; filter?: PositionsModels.PositionFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUsePaginate({ officeId })); - return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create position - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { PositionsModels.CreatePositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position created successfully - * @statusCodes [201, 400, 401, 404] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof PositionsApi.create, - { officeId: string; data: PositionsModels.CreatePositionRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PositionsAcl.canUseCreate({ officeId })); - return PositionsApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useTotalProfit` - * @summary List positions - * @permission Requires `canUseTotalProfit` ability - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useTotalProfit = ( - { officeId }: { officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.totalProfit(officeId), - queryFn: () => { - checkAcl(PositionsAcl.canUseTotalProfit({ officeId })); - return PositionsApi.totalProfit(officeId, config); - }, - ...options, - }); - }; - - /** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for a position - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListAvailablePartnersFor = ( - { - officeId, - positionId, - search, - useCase, - }: { - officeId: string; - positionId: string; - search?: string; - useCase?: CommonModels.PositionAvailablePartnersUseCase; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), - queryFn: () => { - checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId })); - return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase, config); - }, - ...options, - }); - }; - - /** - * Mutation `useExportPositions` - recommended when file should not be cached - * @summary Export positions to Excel - * @permission Requires `canUseExportPositions` ability - * @param { string } mutation.officeId Path parameter - * @param { PositionsModels.PositionExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportPositions = ( - options?: AppMutationOptions< - typeof PositionsApi.exportPositions, - { officeId: string; data: PositionsModels.PositionExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PositionsAcl.canUseExportPositions({ officeId })); - return PositionsApi.exportPositions(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGet` - * @summary Get position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Position retrieved successfully - * @statusCodes [200, 401, 403, 404] - */ - export const useGet = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseGet({ officeId })); - return PositionsApi.get(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.UpdatePositionDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position updated successfully - * @statusCodes [200, 400, 401, 404] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof PositionsApi.update, - { officeId: string; positionId: string; data: PositionsModels.UpdatePositionDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseUpdate({ officeId })); - return PositionsApi.update(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useListRouteLabels` - * @summary List all route labels for a position - * @permission Requires `canUseListRouteLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListRouteLabels = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRouteLabels(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseListRouteLabels({ officeId })); - return PositionsApi.listRouteLabels(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Query `useGetDuplicateDefaultParameters` - * @summary Get default duplication parameters for a position - * @permission Requires `canUseGetDuplicateDefaultParameters` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Default parameters and suggested estimated service date - * @statusCodes [200, 401, 404] - */ - export const useGetDuplicateDefaultParameters = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId })); - return PositionsApi.getDuplicateDefaultParameters(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useDuplicate` - * @summary Duplicate position - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.DuplicatePositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position duplicated successfully - * @statusCodes [201, 400, 401, 404] - */ - export const useDuplicate = ( - options?: AppMutationOptions< - typeof PositionsApi.duplicate, - { officeId: string; positionId: string; data: PositionsModels.DuplicatePositionRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseDuplicate({ officeId })); - return PositionsApi.duplicate(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCancel` - * @summary Cancel position - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position cancelled successfully - * @statusCodes [200, 400, 401, 403, 404] - */ - export const useCancel = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionsAcl.canUseCancel({ officeId })); - return PositionsApi.cancel(officeId, positionId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useRevertCancel` - * @summary Revert cancelled position (accounting) - * @permission Requires `canUseRevertCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position reverted successfully - * @statusCodes [200, 400, 401, 403, 404] - */ - export const useRevertCancel = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionsAcl.canUseRevertCancel({ officeId })); - return PositionsApi.revertCancel(officeId, positionId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useLinkChild` - * @summary Link child positions to parent - * @permission Requires `canUseLinkChild` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.LinkChildPositionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useLinkChild = ( - options?: AppMutationOptions< - typeof PositionsApi.linkChild, - { officeId: string; positionId: string; data: PositionsModels.LinkChildPositionsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseLinkChild({ officeId })); - return PositionsApi.linkChild(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnlinkChild` - * @summary Unlink child positions from parent - * @permission Requires `canUseUnlinkChild` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.UnlinkChildPositionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnlinkChild = ( - options?: AppMutationOptions< - typeof PositionsApi.unlinkChild, - { officeId: string; positionId: string; data: PositionsModels.UnlinkChildPositionsRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseUnlinkChild({ officeId })); - return PositionsApi.unlinkChild(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useListChild` - * @summary Get child positions for parent - * @permission Requires `canUseListChild` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListChild = ( - { - officeId, - positionId, - limit, - page, - cursor, - }: { officeId: string; positionId: string; limit: number; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listChild(officeId, positionId, limit, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUseListChild({ officeId })); - return PositionsApi.listChild(officeId, positionId, limit, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListChildInfinite - * @summary Get child positions for parent - * @permission Requires `canUseListChild` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListChildInfinite = ( - { officeId, positionId, limit, cursor }: { officeId: string; positionId: string; limit: number; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUseListChild({ officeId })); - return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/projectLite/projectLite.acl.ts b/test/generated/dist/projectLite/projectLite.acl.ts deleted file mode 100644 index 746ff45..0000000 --- a/test/generated/dist/projectLite/projectLite.acl.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ProjectLiteAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create project in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Create", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; - - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List projects for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Read", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; - - /** - * Use for `usePaginateProjectLabels` query ability. For global ability, omit the object parameter. - * @description Paginate project labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateProjectLabels` query - */ - export const canUsePaginateProjectLabels = (object?: { officeId: string }) => - ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Read", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; - - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get project by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Read", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Update", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Archive", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Archive", object ? subject("ProjectLite", object) : "ProjectLite"] as AbilityTuple< - "Archive", - "ProjectLite" | (ForcedSubject<"ProjectLite"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/projectLite/projectLite.api.ts b/test/generated/dist/projectLite/projectLite.api.ts deleted file mode 100644 index d23da6b..0000000 --- a/test/generated/dist/projectLite/projectLite.api.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ProjectLiteModels } from "./projectLite.models"; - -export namespace ProjectLiteApi { - export const create = ( - officeId: string, - data: ProjectLiteModels.CreateProjectLiteRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite`, - ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), - config, - ); - }; - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, - `/offices/${officeId}/project-lite`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const paginateProjectLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, - `/offices/${officeId}/project-lite/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite/${id}`, - config, - ); - }; - export const update = ( - id: string, - officeId: string, - data: ProjectLiteModels.UpdateProjectLiteRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite/${id}`, - ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/project-lite/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/project-lite/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/projectLite/projectLite.configs.ts b/test/generated/dist/projectLite/projectLite.configs.ts deleted file mode 100644 index c5f3f45..0000000 --- a/test/generated/dist/projectLite/projectLite.configs.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ProjectLiteModels } from "./projectLite.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ProjectLiteQueries } from "./projectLite.queries"; -import { ProjectLiteAcl } from "./projectLite.acl"; - -export namespace ProjectLiteConfigs { - export const projectLiteConfig = { - meta: { - title: "Project Lite", - }, - readAll: { - acl: ProjectLiteAcl.canUsePaginate, - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - paginated: ProjectLiteQueries.usePaginate, - infinite: ProjectLiteQueries.usePaginateInfinite, - filters: { - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: ProjectLiteAcl.canUseFindById, - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - query: ProjectLiteQueries.useFindById, - }, - create: { - acl: ProjectLiteAcl.canUseCreate, - schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, - mutation: ProjectLiteQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), - }, - update: { - acl: ProjectLiteAcl.canUseUpdate, - schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, - mutation: ProjectLiteQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: ProjectLiteAcl.canUsePaginateProjectLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ProjectLiteQueries.usePaginateProjectLabels, - infinite: ProjectLiteQueries.usePaginateProjectLabelsInfinite, - filters: { - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/projectLite/projectLite.models.ts b/test/generated/dist/projectLite/projectLite.models.ts deleted file mode 100644 index b70c907..0000000 --- a/test/generated/dist/projectLite/projectLite.models.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ProjectLiteModels { - /** - * ProjectLiteEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type ProjectLiteEmployeeDTO = z.infer; - - /** - * ProjectLiteResponseDTOSchema - * @type { object } - * @property { string } id Project ID - * @property { string } name Project name - * @property { string } officeId Office ID - * @property { boolean } archived Is archived - * @property { string } createdById ID of the employee who created this project - * @property { ProjectLiteEmployeeDTO } createdBy Employee who created this project - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this project - * @property { ProjectLiteEmployeeDTO } updatedBy Employee who last updated this project - * @property { string } updatedAt Updated at - */ - export const ProjectLiteResponseDTOSchema = z - .object({ - id: z.string().describe("Project ID"), - name: z.string().describe("Project name"), - officeId: z.string().describe("Office ID"), - archived: z.boolean().describe("Is archived"), - createdById: z.string().describe("ID of the employee who created this project").nullish(), - createdBy: ProjectLiteEmployeeDTOSchema.describe("Employee who created this project").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedById: z.string().describe("ID of the employee who last updated this project").nullish(), - updatedBy: ProjectLiteEmployeeDTOSchema.describe("Employee who last updated this project").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - }) - .readonly(); - export type ProjectLiteResponseDTO = z.infer; - - /** - * CreateProjectLiteRequestDTOSchema - * @type { object } - * @property { string } name Project name - */ - export const CreateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); - export type CreateProjectLiteRequestDTO = z.infer; - - /** - * ProjectLiteFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ - export const ProjectLiteFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); - export type ProjectLiteFilterDto = z.infer; - - /** - * UpdateProjectLiteRequestDTOSchema - * @type { object } - * @property { string } name Project name - */ - export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); - export type UpdateProjectLiteRequestDTO = z.infer; - - /** - * ProjectLitePaginateOrderParamEnumSchema - * @type { enum } - */ - export const ProjectLitePaginateOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type ProjectLitePaginateOrderParamEnum = z.infer; - export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEnumSchema.enum; - - /** - * ProjectLitePaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ProjectLiteResponseDTO[] } items - */ - export const ProjectLitePaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ProjectLitePaginateResponse = z.infer; - - /** - * PaginateProjectLabelsOrderParamEnumSchema - * @type { enum } - */ - export const PaginateProjectLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type PaginateProjectLabelsOrderParamEnum = z.infer; - export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderParamEnumSchema.enum; - - /** - * PaginateProjectLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const PaginateProjectLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type PaginateProjectLabelsResponse = z.infer; -} diff --git a/test/generated/dist/projectLite/projectLite.queries.ts b/test/generated/dist/projectLite/projectLite.queries.ts deleted file mode 100644 index aa91db8..0000000 --- a/test/generated/dist/projectLite/projectLite.queries.ts +++ /dev/null @@ -1,415 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ProjectLiteAcl } from "./projectLite.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ProjectLiteModels } from "./projectLite.models"; -import { ProjectLiteApi } from "./projectLite.api"; - -export namespace ProjectLiteQueries { - export const moduleName = QueryModule.ProjectLite; - - export const keys = { - all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/project-lite", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/project-lite", "infinite", officeId, limit, order, filter, cursor] as const, - paginateProjectLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/project-lite/labels/paginate", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateProjectLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: ProjectLiteModels.ProjectLiteFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/project-lite/labels/paginate", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/project-lite/:id", id, officeId] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create project - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ProjectLiteModels.CreateProjectLiteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof ProjectLiteApi.create, - { officeId: string; data: ProjectLiteModels.CreateProjectLiteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ProjectLiteAcl.canUseCreate({ officeId })); - return ProjectLiteApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Get paginated projects - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ProjectLiteModels.ProjectLiteFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUsePaginate({ officeId })); - return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Get paginated projects - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ProjectLiteModels.ProjectLiteFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ProjectLiteAcl.canUsePaginate({ officeId })); - return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginateProjectLabels` - * @summary Paginate project labels - * @permission Requires `canUsePaginateProjectLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateProjectLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ProjectLiteModels.ProjectLiteFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId })); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateProjectLabelsInfinite - * @summary Paginate project labels - * @permission Requires `canUsePaginateProjectLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateProjectLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: ProjectLiteModels.ProjectLiteFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId })); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get project by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUseFindById({ officeId })); - return ProjectLiteApi.findById(id, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update project - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ProjectLiteModels.UpdateProjectLiteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ProjectLiteApi.update, - { id: string; officeId: string; data: ProjectLiteModels.UpdateProjectLiteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ProjectLiteAcl.canUseUpdate({ officeId })); - return ProjectLiteApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive project - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ProjectLiteAcl.canUseArchive({ officeId })); - return ProjectLiteApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive project - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId })); - return ProjectLiteApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/queryModules.ts b/test/generated/dist/queryModules.ts deleted file mode 100644 index cb83878..0000000 --- a/test/generated/dist/queryModules.ts +++ /dev/null @@ -1,96 +0,0 @@ -export const enum QueryModule { - WorkingDocuments = "WorkingDocumentsQueries", - Offices = "OfficesQueries", - BankAccounts = "BankAccountsQueries", - Currencies = "CurrenciesQueries", - Countries = "CountriesQueries", - Folders = "FoldersQueries", - Files = "FilesQueries", - WorkingDocumentsTemplatedDocument = "WorkingDocumentsTemplatedDocumentQueries", - BusinessPartners = "BusinessPartnersQueries", - BusinessPartnerBookkeepingMappings = "BusinessPartnerBookkeepingMappingsQueries", - BusinessPartnerContacts = "BusinessPartnerContactsQueries", - Cities = "CitiesQueries", - Depots = "DepotsQueries", - PartnerNetworks = "PartnerNetworksQueries", - Warehouses = "WarehousesQueries", - UserActivity = "UserActivityQueries", - DocumentTemplates = "DocumentTemplatesQueries", - HsCodes = "HsCodesQueries", - CargoTypes = "CargoTypesQueries", - SeaPositions = "SeaPositionsQueries", - Terminals = "TerminalsQueries", - Airports = "AirportsQueries", - Ports = "PortsQueries", - ContainerYards = "ContainerYardsQueries", - PositionInvolvedParties = "PositionInvolvedPartiesQueries", - PositionRoutes = "PositionRoutesQueries", - AirPositions = "AirPositionsQueries", - PositionAccount = "PositionAccountQueries", - PositionAccountItems = "PositionAccountItemsQueries", - PositionProfitChangeTracking = "PositionProfitChangeTrackingQueries", - WorkingDocumentsExportDeclaration = "WorkingDocumentsExportDeclarationQueries", - PositionCargo = "PositionCargoQueries", - PositionCargoPackage = "PositionCargoPackageQueries", - PackageTypes = "PackageTypesQueries", - WorkingDocumentsHouseBl = "WorkingDocumentsHouseBlQueries", - WorkingDocumentsBlInstructions = "WorkingDocumentsBlInstructionsQueries", - WorkingDocumentsAmsInstructions = "WorkingDocumentsAmsInstructionsQueries", - WorkingDocumentsHouseAwb = "WorkingDocumentsHouseAwbQueries", - ChargeTypes = "ChargeTypesQueries", - WorkingDocumentsMasterAwb = "WorkingDocumentsMasterAwbQueries", - WorkingDocumentsCmrForm = "WorkingDocumentsCmrFormQueries", - WorkingDocumentsIsfForm = "WorkingDocumentsIsfFormQueries", - WorkingDocumentsFcrForm = "WorkingDocumentsFcrFormQueries", - ShippingInstructions = "ShippingInstructionsQueries", - EmployeeAccount = "EmployeeAccountQueries", - EmployeeSettings = "EmployeeSettingsQueries", - EmployeeRoles = "EmployeeRolesQueries", - EmployeePermissions = "EmployeePermissionsQueries", - EmployeeProfile = "EmployeeProfileQueries", - Employee = "EmployeeQueries", - Employment = "EmploymentQueries", - CustomerAccount = "CustomerAccountQueries", - Customers = "CustomersQueries", - Quotes = "QuotesQueries", - QuoteAccount = "QuoteAccountQueries", - QuoteProfitChangeTracking = "QuoteProfitChangeTrackingQueries", - SeaQuotes = "SeaQuotesQueries", - RoadQuotes = "RoadQuotesQueries", - QuoteDocument = "QuoteDocumentQueries", - QuoteCargo = "QuoteCargoQueries", - QuoteCargoPackage = "QuoteCargoPackageQueries", - QuoteRoutes = "QuoteRoutesQueries", - DunningManagement = "DunningManagementQueries", - DunningPartnerOutstandingInvoices = "DunningPartnerOutstandingInvoicesQueries", - DunningLevels = "DunningLevelsQueries", - DunningSystems = "DunningSystemsQueries", - DunningAccountStatement = "DunningAccountStatementQueries", - Positions = "PositionsQueries", - QuoteConversion = "QuoteConversionQueries", - Invoices = "InvoicesQueries", - VatRules = "VatRulesQueries", - InvoicePayments = "InvoicePaymentsQueries", - PaymentConfirmations = "PaymentConfirmationsQueries", - ProjectLite = "ProjectLiteQueries", - PositionChecklist = "PositionChecklistQueries", - ChecklistTemplates = "ChecklistTemplatesQueries", - BookkeepingExport = "BookkeepingExportQueries", - FactoringExport = "FactoringExportQueries", - FactoringMerge = "FactoringMergeQueries", - AWBStocks = "AWBStocksQueries", - MasterData = "MasterDataQueries", - ChecklistItems = "ChecklistItemsQueries", - MasterDataImport = "MasterDataImportQueries", - RemarkTemplates = "RemarkTemplatesQueries", - IntegrationChannels = "IntegrationChannelsQueries", - ControlTowerBookings = "ControlTowerBookingsQueries", - ControlTowerPackages = "ControlTowerPackagesQueries", - ControlTowerContainers = "ControlTowerContainersQueries", - ControlTowerAuth = "ControlTowerAuthQueries", - ControlTowerMe = "ControlTowerMeQueries", - ControlTowerSearch = "ControlTowerSearchQueries", - ControlTowerCalendar = "ControlTowerCalendarQueries", - InttraShippingInstructionMessages = "InttraShippingInstructionMessagesQueries", - InttraOfficeIntegration = "InttraOfficeIntegrationQueries", -} diff --git a/test/generated/dist/quoteAccount/quoteAccount.acl.ts b/test/generated/dist/quoteAccount/quoteAccount.acl.ts deleted file mode 100644 index a86beb5..0000000 --- a/test/generated/dist/quoteAccount/quoteAccount.acl.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteAccountAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description List quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useCreateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateItem` mutation - */ - export const canUseCreateItem = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useDeleteItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteItem` mutation - */ - export const canUseDeleteItem = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useUpdateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateItem` mutation - */ - export const canUseUpdateItem = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useDuplicateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateItem` mutation - */ - export const canUseDuplicateItem = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/quoteAccount/quoteAccount.api.ts b/test/generated/dist/quoteAccount/quoteAccount.api.ts deleted file mode 100644 index 688dafc..0000000 --- a/test/generated/dist/quoteAccount/quoteAccount.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteAccountModels } from "./quoteAccount.models"; - -export namespace QuoteAccountApi { - export const get = (quoteId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/account`, - config, - ); - }; - export const createItem = ( - quoteId: string, - officeId: string, - data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items`, - ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), - config, - ); - }; - export const deleteItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - undefined, - config, - ); - }; - export const updateItem = ( - quoteId: string, - itemId: string, - officeId: string, - data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), - config, - ); - }; - export const duplicateItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/quoteAccount/quoteAccount.models.ts b/test/generated/dist/quoteAccount/quoteAccount.models.ts deleted file mode 100644 index cc26d54..0000000 --- a/test/generated/dist/quoteAccount/quoteAccount.models.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { z } from "zod"; - -export namespace QuoteAccountModels { - /** - * QuoteAccountItemTypeEnumSchema - * @type { enum } - */ - export const QuoteAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); - export type QuoteAccountItemTypeEnum = z.infer; - export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; - - /** - * QuoteChargeDtoResponseSchema - * @type { object } - * @property { object } chargeType - * @property { string } chargeType.id - * @property { string } chargeType.name - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { object } buyVatRule - * @property { string } buyVatRule.id - * @property { string } buyVatRule.name - * @property { string } buyVatRule.matchcode - * @property { string } buyVatRule.printCode - * @property { object } vendor - * @property { string } vendor.id - * @property { string } vendor.name - * @property { string } vendor.matchCode - * @property { string } vendor.label - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { object } sellVatRule - * @property { string } sellVatRule.id - * @property { string } sellVatRule.name - * @property { string } sellVatRule.matchcode - * @property { string } sellVatRule.printCode - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - * @property { number } profit Profit amount - */ - export const QuoteChargeDtoResponseSchema = z - .object({ - chargeType: z.object({ id: z.string(), name: z.string() }).readonly(), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().describe("Quantity of the charge").nullish(), - buyRate: z.number().describe("Buy rate amount").nullish(), - buyCurrencyCode: z.string().describe("Buy rate currency code"), - buyVatRule: z - .object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }) - .readonly(), - vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), - sellRate: z.number().describe("Sell rate amount").nullish(), - sellCurrencyCode: z.string().describe("Sell rate currency code"), - sellVatRule: z - .object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }) - .readonly(), - customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), - profit: z.number().describe("Profit amount").nullish(), - }) - .readonly(); - export type QuoteChargeDtoResponse = z.infer; - - /** - * QuoteTextDtoResponseSchema - * @type { object } - * @property { string } content Text content - */ - export const QuoteTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); - export type QuoteTextDtoResponse = z.infer; - - /** - * QuoteAccountItemDtoResponseSchema - * @type { object } - * @property { string } id Item ID - * @property { QuoteAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE - * @property { QuoteTextDtoResponse } text Text data if type is TEXT - */ - export const QuoteAccountItemDtoResponseSchema = z - .object({ - id: z.string().describe("Item ID"), - type: QuoteAccountItemTypeEnumSchema.describe("Item type"), - orderPosition: z.number().describe("Order position of the item"), - charge: QuoteChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), - text: QuoteTextDtoResponseSchema.describe("Text data if type is TEXT").nullish(), - }) - .readonly(); - export type QuoteAccountItemDtoResponse = z.infer; - - /** - * QuoteAccountResponseDtoSchema - * @type { object } - * @property { string } id Account ID - * @property { string } quoteId Quote ID - * @property { QuoteAccountItemDtoResponse[] } items Account items - * @property { object } totals Account totals - * @property { number } totals.totalBuyRates - * @property { number } totals.totalSellRates - * @property { number } totals.totalProfit - * @property { number } totals.displayAmount - * @property { string } totals.displayCurrencyCode - * @property { object[] } totalsPerCurrency Account totals per currency - * @property { number } totalsPerCurrency.[0].totalBuyRates - * @property { number } totalsPerCurrency.[0].totalSellRates - * @property { number } totalsPerCurrency.[0].totalProfit - * @property { number } totalsPerCurrency.[0].displayAmount - * @property { string } totalsPerCurrency.[0].displayCurrencyCode - */ - export const QuoteAccountResponseDtoSchema = z - .object({ - id: z.string().describe("Account ID"), - quoteId: z.string().describe("Quote ID"), - items: z.array(QuoteAccountItemDtoResponseSchema).readonly().describe("Account items"), - totals: z - .object({ - totalBuyRates: z.number(), - totalSellRates: z.number(), - totalProfit: z.number(), - displayAmount: z.number(), - displayCurrencyCode: z.string(), - }) - .readonly() - .describe("Account totals"), - totalsPerCurrency: z - .array( - z - .object({ - totalBuyRates: z.number(), - totalSellRates: z.number(), - totalProfit: z.number(), - displayAmount: z.number(), - displayCurrencyCode: z.string(), - }) - .readonly(), - ) - .readonly() - .describe("Account totals per currency"), - }) - .readonly(); - export type QuoteAccountResponseDto = z.infer; - - /** - * CreateQuoteChargeDataDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1`. Default: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code. Default: `EUR` - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code. Default: `EUR` - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ - export const CreateQuoteChargeDataDtoSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID"), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().gte(1).describe("Quantity of the charge").default(1), - buyRate: z.number().describe("Buy rate amount"), - buyCurrencyCode: z.string().describe("Buy rate currency code").default("EUR"), - buyVatRuleId: z.string().describe("Buy VAT rule ID"), - vendorId: z.string().describe("Vendor ID"), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), - sellRate: z.number().describe("Sell rate amount"), - sellCurrencyCode: z.string().describe("Sell rate currency code").default("EUR"), - sellVatRuleId: z.string().describe("Sell VAT rule ID"), - customerId: z.string().describe("Customer ID"), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), - }) - .readonly(); - export type CreateQuoteChargeDataDto = z.infer; - - /** - * CreateQuoteTextDataDtoSchema - * @type { object } - * @property { string } content Text content - */ - export const CreateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); - export type CreateQuoteTextDataDto = z.infer; - - /** - * CreateQuoteAccountItemRequestDtoSchema - * @type { object } - * @property { QuoteAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { CreateQuoteChargeDataDto } charge Charge data if type is CHARGE - * @property { CreateQuoteTextDataDto } text Text data if type is TEXT - */ - export const CreateQuoteAccountItemRequestDtoSchema = z - .object({ - type: QuoteAccountItemTypeEnumSchema.describe("Item type"), - orderPosition: z.number().describe("Order position of the item").nullish(), - charge: CreateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE").nullish(), - text: CreateQuoteTextDataDtoSchema.describe("Text data if type is TEXT").nullish(), - }) - .readonly(); - export type CreateQuoteAccountItemRequestDto = z.infer; - - /** - * UpdateQuoteChargeDataDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ - export const UpdateQuoteChargeDataDtoSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID"), - additionalText: z.string().describe("Additional text for the charge"), - quantity: z.number().gte(1).describe("Quantity of the charge"), - buyRate: z.number().describe("Buy rate amount").nullable(), - buyCurrencyCode: z.string().describe("Buy rate currency code"), - buyVatRuleId: z.string().describe("Buy VAT rule ID").nullable(), - vendorId: z.string().describe("Vendor ID").nullable(), - buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), - sellRate: z.number().describe("Sell rate amount").nullable(), - sellCurrencyCode: z.string().describe("Sell rate currency code"), - sellVatRuleId: z.string().describe("Sell VAT rule ID").nullable(), - customerId: z.string().describe("Customer ID").nullable(), - sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy"), - }) - .readonly(); - export type UpdateQuoteChargeDataDto = z.infer; - - /** - * UpdateQuoteTextDataDtoSchema - * @type { object } - * @property { string } content Text content - */ - export const UpdateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); - export type UpdateQuoteTextDataDto = z.infer; - - /** - * UpdateQuoteAccountItemRequestDtoSchema - * @type { object } - * @property { number } orderPosition Order position of the item - * @property { UpdateQuoteChargeDataDto } charge Charge data if type is CHARGE - * @property { UpdateQuoteTextDataDto } text Text data if type is TEXT - */ - export const UpdateQuoteAccountItemRequestDtoSchema = z - .object({ - orderPosition: z.number().describe("Order position of the item"), - charge: UpdateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE"), - text: UpdateQuoteTextDataDtoSchema.describe("Text data if type is TEXT"), - }) - .readonly(); - export type UpdateQuoteAccountItemRequestDto = z.infer; -} diff --git a/test/generated/dist/quoteAccount/quoteAccount.queries.ts b/test/generated/dist/quoteAccount/quoteAccount.queries.ts deleted file mode 100644 index abb1ca4..0000000 --- a/test/generated/dist/quoteAccount/quoteAccount.queries.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteAccountAcl } from "./quoteAccount.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteAccountModels } from "./quoteAccount.models"; -import { QuoteAccountApi } from "./quoteAccount.api"; - -export namespace QuoteAccountQueries { - export const moduleName = QueryModule.QuoteAccount; - - export const keys = { - all: [moduleName] as const, - get: (quoteId: string, officeId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/account", quoteId, officeId] as const, - }; - - /** - * Query `useGet` - * @summary Get quote account details - * @permission Requires `canUseGet` ability - * @param { string } object.quoteId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { quoteId, officeId }: { quoteId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(quoteId, officeId), - queryFn: () => { - checkAcl(QuoteAccountAcl.canUseGet({ officeId })); - return QuoteAccountApi.get(quoteId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreateItem` - * @summary Create quote account item - * @permission Requires `canUseCreateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { QuoteAccountModels.CreateQuoteAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateItem = ( - options?: AppMutationOptions< - typeof QuoteAccountApi.createItem, - { quoteId: string; officeId: string; data: QuoteAccountModels.CreateQuoteAccountItemRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, officeId, data }) => { - checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId })); - return QuoteAccountApi.createItem(quoteId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteItem` - * @summary Delete quote account item - * @permission Requires `canUseDeleteItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteItem = ( - options?: AppMutationOptions< - typeof QuoteAccountApi.deleteItem, - { quoteId: string; itemId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId }) => { - checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId })); - return QuoteAccountApi.deleteItem(quoteId, itemId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateItem` - * @summary Update quote account item - * @permission Requires `canUseUpdateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { QuoteAccountModels.UpdateQuoteAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateItem = ( - options?: AppMutationOptions< - typeof QuoteAccountApi.updateItem, - { quoteId: string; itemId: string; officeId: string; data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId, data }) => { - checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId })); - return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDuplicateItem` - * @summary Duplicate quote account item - * @permission Requires `canUseDuplicateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicateItem = ( - options?: AppMutationOptions< - typeof QuoteAccountApi.duplicateItem, - { quoteId: string; itemId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId }) => { - checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId })); - return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/quoteCargo/quoteCargo.acl.ts b/test/generated/dist/quoteCargo/quoteCargo.acl.ts deleted file mode 100644 index fcf6fb3..0000000 --- a/test/generated/dist/quoteCargo/quoteCargo.acl.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteCargoAcl { - /** - * Use for `useListCargosByQuoteId` query ability. For global ability, omit the object parameter. - * @description List cargo items by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByQuoteId` query - */ - export const canUseListCargosByQuoteId = (object?: { officeId: string }) => - ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Read", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. - * @description List cargo labels by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query - */ - export const canUseListCargoLabels = (object?: { officeId: string }) => - ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Read", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. - * @description Get cargo summary by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query - */ - export const canUseGetCargoSummary = (object?: { officeId: string }) => - ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Read", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. - * @description Get cargo item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query - */ - export const canUseGetCargoById = (object?: { officeId: string }) => - ["Read", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Read", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. - * @description Update cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation - */ - export const canUseUpdateCargo = (object?: { officeId: string }) => - ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Update", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation - */ - export const canUseDeleteCargo = (object?: { officeId: string }) => - ["Delete", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Delete", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation - */ - export const canUseCreateBulkCargos = (object?: { officeId: string }) => - ["Create", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Create", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation - */ - export const canUseDuplicateCargo = (object?: { officeId: string }) => - ["Duplicate", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Duplicate", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/quoteCargo/quoteCargo.api.ts b/test/generated/dist/quoteCargo/quoteCargo.api.ts deleted file mode 100644 index ccec850..0000000 --- a/test/generated/dist/quoteCargo/quoteCargo.api.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteCargoModels } from "./quoteCargo.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoApi { - export const listCargosByQuoteId = ( - officeId: string, - quoteId: string, - limit: number, - order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos`, - { - ...config, - params: { - order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { - type: "query", - name: "order", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const listCargoLabels = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, - config, - ); - }; - export const getCargoSummary = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, - config, - ); - }; - export const getCargoById = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - config, - ); - }; - export const updateCargo = ( - officeId: string, - quoteId: string, - cargoId: string, - data: CommonModels.UpdatePositionCargoDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - config, - ); - }; - export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - undefined, - config, - ); - }; - export const createBulkCargos = ( - numberOfCargos: number, - officeId: string, - quoteId: string, - data: CommonModels.CreatePositionCargoDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config, - ); - }; - export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/quoteCargo/quoteCargo.configs.ts b/test/generated/dist/quoteCargo/quoteCargo.configs.ts deleted file mode 100644 index a00a304..0000000 --- a/test/generated/dist/quoteCargo/quoteCargo.configs.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoQueries } from "./quoteCargo.queries"; -import { QuoteCargoAcl } from "./quoteCargo.acl"; - -export namespace QuoteCargoConfigs { - export const cargosConfig = { - meta: { - title: "Cargos", - }, - readAll: { - acl: QuoteCargoAcl.canUseListCargosByQuoteId, - schema: CommonModels.PositionCargoResponseDTOSchema, - paginated: QuoteCargoQueries.useListCargosByQuoteId, - infinite: QuoteCargoQueries.useListCargosByQuoteIdInfinite, - columns: dynamicColumns({ - schema: CommonModels.PositionCargoResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - quoteId: true, - rootFolderId: true, - cargoType: true, - autoCalculateTotals: true, - autoCalculateRates: true, - autoCalculateVgm: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - rateOptions: true, - rateClass: true, - textForCustoms: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - ratePerKg: true, - totalRate: true, - tare: true, - vgm: true, - hsCodeLabels: true, - note: true, - packages: true, - createdAt: true, - updatedAt: true, - completeWeight: true, - packageTotals: true, - }, - }, - }), - }, - read: { - acl: QuoteCargoAcl.canUseGetCargoById, - schema: CommonModels.PositionCargoResponseDTOSchema, - query: QuoteCargoQueries.useGetCargoById, - }, - update: { - acl: QuoteCargoAcl.canUseUpdateCargo, - schema: CommonModels.UpdatePositionCargoDTOSchema, - mutation: QuoteCargoQueries.useUpdateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.UpdatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, - }), - }, - delete: { - acl: QuoteCargoAcl.canUseDeleteCargo, - mutation: QuoteCargoQueries.useDeleteCargo, - }, - }; -} diff --git a/test/generated/dist/quoteCargo/quoteCargo.models.ts b/test/generated/dist/quoteCargo/quoteCargo.models.ts deleted file mode 100644 index 8549bbb..0000000 --- a/test/generated/dist/quoteCargo/quoteCargo.models.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoModels { - /** - * ListCargosByQuoteIdOrderParamSchema - * @type { array } - * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - */ - export const ListCargosByQuoteIdOrderParamSchema = z - .array(CommonModels.PositionCargoPaginationOrderFieldSchema) - .readonly() - .describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt") - .nullish(); - export type ListCargosByQuoteIdOrderParam = z.infer; - - /** - * ListCargosByQuoteIdResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.PositionCargoResponseDTO[] } items - */ - export const ListCargosByQuoteIdResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape, - }); - export type ListCargosByQuoteIdResponse = z.infer; - - /** - * QuoteCargoListCargoLabelsResponseSchema - * @type { array } - */ - export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); - export type QuoteCargoListCargoLabelsResponse = z.infer; - - /** - * QuoteCargoGetCargoSummaryResponseSchema - * @type { array } - */ - export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); - export type QuoteCargoGetCargoSummaryResponse = z.infer; - - /** - * QuoteCargoCreateBulkCargosResponseSchema - * @type { array } - */ - export const QuoteCargoCreateBulkCargosResponseSchema = z - .array(CommonModels.PositionCargoResponseDTOSchema) - .readonly(); - export type QuoteCargoCreateBulkCargosResponse = z.infer; -} diff --git a/test/generated/dist/quoteCargo/quoteCargo.queries.ts b/test/generated/dist/quoteCargo/quoteCargo.queries.ts deleted file mode 100644 index 4b8d52a..0000000 --- a/test/generated/dist/quoteCargo/quoteCargo.queries.ts +++ /dev/null @@ -1,380 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteCargoAcl } from "./quoteCargo.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteCargoModels } from "./quoteCargo.models"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoApi } from "./quoteCargo.api"; - -export namespace QuoteCargoQueries { - export const moduleName = QueryModule.QuoteCargo; - - export const keys = { - all: [moduleName] as const, - listCargosByQuoteId: ( - officeId: string, - quoteId: string, - limit?: number, - order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/cargos", - officeId, - quoteId, - limit, - order, - page, - cursor, - ] as const, - listCargosByQuoteIdInfinite: ( - officeId: string, - quoteId: string, - limit?: number, - order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/cargos", - "infinite", - officeId, - quoteId, - limit, - order, - cursor, - ] as const, - listCargoLabels: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/labels", officeId, quoteId] as const, - getCargoSummary: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/summary", officeId, quoteId] as const, - getCargoById: (officeId: string, quoteId: string, cargoId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/:cargoId", officeId, quoteId, cargoId] as const, - }; - - /** - * Query `useListCargosByQuoteId` - * @summary List all cargo items for a quote - * @permission Requires `canUseListCargosByQuoteId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargosByQuoteId = ( - { - officeId, - quoteId, - limit, - order, - page, - cursor, - }: { - officeId: string; - quoteId: string; - limit: number; - order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId })); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListCargosByQuoteIdInfinite - * @summary List all cargo items for a quote - * @permission Requires `canUseListCargosByQuoteId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargosByQuoteIdInfinite = ( - { - officeId, - quoteId, - limit, - order, - cursor, - }: { - officeId: string; - quoteId: string; - limit: number; - order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId })); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useListCargoLabels` - * @summary List all cargo labels for a quote - * @permission Requires `canUseListCargoLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListCargoLabels = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargoLabels(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId })); - return QuoteCargoApi.listCargoLabels(officeId, quoteId, config); - }, - ...options, - }); - }; - - /** - * Query `useGetCargoSummary` - * @summary Get cargo summary grouped by transport unit type - * @permission Requires `canUseGetCargoSummary` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCargoSummary = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoSummary(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId })); - return QuoteCargoApi.getCargoSummary(officeId, quoteId, config); - }, - ...options, - }); - }; - - /** - * Query `useGetCargoById` - * @summary Get a specific cargo item - * @permission Requires `canUseGetCargoById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { string } object.cargoId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCargoById = ( - { officeId, quoteId, cargoId }: { officeId: string; quoteId: string; cargoId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoById(officeId, quoteId, cargoId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId })); - return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateCargo` - * @summary Update a cargo item - * @permission Requires `canUseUpdateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCargo = ( - options?: AppMutationOptions< - typeof QuoteCargoApi.updateCargo, - { officeId: string; quoteId: string; cargoId: string; data: CommonModels.UpdatePositionCargoDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, data }) => { - checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId })); - return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteCargo` - * @summary Delete a cargo item - * @permission Requires `canUseDeleteCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteCargo = ( - options?: AppMutationOptions< - typeof QuoteCargoApi.deleteCargo, - { officeId: string; quoteId: string; cargoId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId }) => { - checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId })); - return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCreateBulkCargos` - * @summary Create a new cargo item - * @permission Requires `canUseCreateBulkCargos` ability - * @param { number } mutation.numberOfCargos Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateBulkCargos = ( - options?: AppMutationOptions< - typeof QuoteCargoApi.createBulkCargos, - { numberOfCargos: number; officeId: string; quoteId: string; data: CommonModels.CreatePositionCargoDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { - checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId })); - return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDuplicateCargo` - * @summary Duplicate a cargo item - * @permission Requires `canUseDuplicateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicateCargo = ( - options?: AppMutationOptions< - typeof QuoteCargoApi.duplicateCargo, - { officeId: string; quoteId: string; cargoId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId }) => { - checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId })); - return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/quoteCargoPackage/quoteCargoPackage.acl.ts b/test/generated/dist/quoteCargoPackage/quoteCargoPackage.acl.ts deleted file mode 100644 index d129f69..0000000 --- a/test/generated/dist/quoteCargoPackage/quoteCargoPackage.acl.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteCargoPackageAcl { - /** - * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. - * @description Create cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation - */ - export const canUseCreatePackage = (object?: { officeId: string }) => - ["Create", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Create", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. - * @description Update cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation - */ - export const canUseUpdatePackage = (object?: { officeId: string }) => - ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Update", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation - */ - export const canUseDeletePackage = (object?: { officeId: string }) => - ["Delete", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Delete", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation - */ - export const canUseDuplicatePackage = (object?: { officeId: string }) => - ["Duplicate", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Duplicate", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; - - /** - * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. - * @description Move cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation - */ - export const canUseMovePackage = (object?: { officeId: string }) => - ["Update", object ? subject("QuoteCargo", object) : "QuoteCargo"] as AbilityTuple< - "Update", - "QuoteCargo" | (ForcedSubject<"QuoteCargo"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/quoteCargoPackage/quoteCargoPackage.api.ts b/test/generated/dist/quoteCargoPackage/quoteCargoPackage.api.ts deleted file mode 100644 index 27ef13d..0000000 --- a/test/generated/dist/quoteCargoPackage/quoteCargoPackage.api.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoPackageApi { - export const createPackage = ( - officeId: string, - quoteId: string, - cargoId: string, - data: CommonModels.CreatePositionCargoPackageDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, - ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - config, - ); - }; - export const updatePackage = ( - officeId: string, - quoteId: string, - cargoId: string, - packageId: string, - data: CommonModels.UpdatePositionCargoPackageDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - config, - ); - }; - export const deletePackage = ( - officeId: string, - quoteId: string, - cargoId: string, - packageId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - undefined, - config, - ); - }; - export const duplicatePackage = ( - officeId: string, - quoteId: string, - cargoId: string, - packageId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - undefined, - config, - ); - }; - export const movePackage = ( - officeId: string, - quoteId: string, - cargoId: string, - packageId: string, - data: CommonModels.MovePositionCargoPackageRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, - ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/quoteCargoPackage/quoteCargoPackage.queries.ts b/test/generated/dist/quoteCargoPackage/quoteCargoPackage.queries.ts deleted file mode 100644 index 38cf1ca..0000000 --- a/test/generated/dist/quoteCargoPackage/quoteCargoPackage.queries.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteCargoPackageAcl } from "./quoteCargoPackage.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoPackageApi } from "./quoteCargoPackage.api"; - -export namespace QuoteCargoPackageQueries { - export const moduleName = QueryModule.QuoteCargoPackage; - - /** - * Mutation `useCreatePackage` - * @summary Create a new package for a cargo - * @permission Requires `canUseCreatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreatePackage = ( - options?: AppMutationOptions< - typeof QuoteCargoPackageApi.createPackage, - { officeId: string; quoteId: string; cargoId: string; data: CommonModels.CreatePositionCargoPackageDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId })); - return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdatePackage` - * @summary Update a package - * @permission Requires `canUseUpdatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdatePackage = ( - options?: AppMutationOptions< - typeof QuoteCargoPackageApi.updatePackage, - { - officeId: string; - quoteId: string; - cargoId: string; - packageId: string; - data: CommonModels.UpdatePositionCargoPackageDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId })); - return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeletePackage` - * @summary Delete a package - * @permission Requires `canUseDeletePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeletePackage = ( - options?: AppMutationOptions< - typeof QuoteCargoPackageApi.deletePackage, - { officeId: string; quoteId: string; cargoId: string; packageId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { - checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId })); - return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDuplicatePackage` - * @summary Duplicate a package - * @permission Requires `canUseDuplicatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicatePackage = ( - options?: AppMutationOptions< - typeof QuoteCargoPackageApi.duplicatePackage, - { officeId: string; quoteId: string; cargoId: string; packageId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { - checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId })); - return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useMovePackage` - * @summary Move a package to a different cargo - * @permission Requires `canUseMovePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useMovePackage = ( - options?: AppMutationOptions< - typeof QuoteCargoPackageApi.movePackage, - { - officeId: string; - quoteId: string; - cargoId: string; - packageId: string; - data: CommonModels.MovePositionCargoPackageRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId })); - return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/quoteConversion/quoteConversion.acl.ts b/test/generated/dist/quoteConversion/quoteConversion.acl.ts deleted file mode 100644 index 3c9b7f1..0000000 --- a/test/generated/dist/quoteConversion/quoteConversion.acl.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteConversionAcl { - /** - * Use for `useConvertQuoteToPosition` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useConvertQuoteToPosition` mutation - */ - export const canUseConvertQuoteToPosition = (object?: { officeId: string }) => - ["Create", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Create", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/quoteConversion/quoteConversion.api.ts b/test/generated/dist/quoteConversion/quoteConversion.api.ts deleted file mode 100644 index 7bc1111..0000000 --- a/test/generated/dist/quoteConversion/quoteConversion.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteConversionModels } from "./quoteConversion.models"; - -export namespace QuoteConversionApi { - export const convertQuoteToPosition = ( - officeId: string, - quoteId: string, - data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/convert`, - ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/quoteConversion/quoteConversion.models.ts b/test/generated/dist/quoteConversion/quoteConversion.models.ts deleted file mode 100644 index 9eab729..0000000 --- a/test/generated/dist/quoteConversion/quoteConversion.models.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { z } from "zod"; - -export namespace QuoteConversionModels { - /** - * ConvertQuoteToPositionRequestDtoSchema - * @type { object } - * @property { string } estimatedServiceDate - */ - export const ConvertQuoteToPositionRequestDtoSchema = z - .object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }) - .readonly(); - export type ConvertQuoteToPositionRequestDto = z.infer; -} diff --git a/test/generated/dist/quoteConversion/quoteConversion.queries.ts b/test/generated/dist/quoteConversion/quoteConversion.queries.ts deleted file mode 100644 index 3695789..0000000 --- a/test/generated/dist/quoteConversion/quoteConversion.queries.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteConversionAcl } from "./quoteConversion.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteConversionModels } from "./quoteConversion.models"; -import { QuoteConversionApi } from "./quoteConversion.api"; - -export namespace QuoteConversionQueries { - export const moduleName = QueryModule.QuoteConversion; - - /** - * Mutation `useConvertQuoteToPosition` - * @summary Convert quote to position - * @permission Requires `canUseConvertQuoteToPosition` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteConversionModels.ConvertQuoteToPositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Quote converted to position successfully - * @statusCodes [201, 400, 401, 404] - */ - export const useConvertQuoteToPosition = ( - options?: AppMutationOptions< - typeof QuoteConversionApi.convertQuoteToPosition, - { officeId: string; quoteId: string; data: QuoteConversionModels.ConvertQuoteToPositionRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId })); - return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/quoteDocument/quoteDocument.acl.ts b/test/generated/dist/quoteDocument/quoteDocument.acl.ts deleted file mode 100644 index bb144a6..0000000 --- a/test/generated/dist/quoteDocument/quoteDocument.acl.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteDocumentAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useGetPreview` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` mutation - */ - export const canUseGetPreview = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ - export const canUseGenerate = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useGenerateEml` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateEml` mutation - */ - export const canUseGenerateEml = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/quoteDocument/quoteDocument.api.ts b/test/generated/dist/quoteDocument/quoteDocument.api.ts deleted file mode 100644 index 0171b35..0000000 --- a/test/generated/dist/quoteDocument/quoteDocument.api.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteDocumentModels } from "./quoteDocument.models"; - -export namespace QuoteDocumentApi { - export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/document`, - config, - ); - }; - export const update = ( - officeId: string, - quoteId: string, - data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/document`, - ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), - config, - ); - }; - export const getPreview = ( - officeId: string, - quoteId: string, - data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/${quoteId}/document/preview`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generate = ( - officeId: string, - quoteId: string, - data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/document/generate`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - config, - ); - }; - export const generateEml = ( - officeId: string, - quoteId: string, - data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/${quoteId}/document/eml`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; -} diff --git a/test/generated/dist/quoteDocument/quoteDocument.models.ts b/test/generated/dist/quoteDocument/quoteDocument.models.ts deleted file mode 100644 index ea237e2..0000000 --- a/test/generated/dist/quoteDocument/quoteDocument.models.ts +++ /dev/null @@ -1,198 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteDocumentModels { - /** - * QuoteDocumentDataDtoSchema - * @type { object } - * @property { CommonModels.RouteTableBlockResponseDto } routeTable - * @property { CommonModels.CargoTableBlockDto } cargoTable - * @property { CommonModels.FinanceTableBlockDto } financeTable - */ - export const QuoteDocumentDataDtoSchema = z - .object({ - routeTable: CommonModels.RouteTableBlockResponseDtoSchema, - cargoTable: CommonModels.CargoTableBlockDtoSchema, - financeTable: CommonModels.FinanceTableBlockDtoSchema, - }) - .readonly(); - export type QuoteDocumentDataDto = z.infer; - - /** - * QuoteDocumentConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl - * @property { string } headerImageUrl - * @property { string } termsAndConditionsImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ - export const QuoteDocumentConfigDtoSchema = z - .object({ - footerImageUrl: z.string().nullish(), - headerImageUrl: z.string().nullish(), - termsAndConditionsImageUrl: z.string().nullish(), - showWatermarkOnDocuments: z.boolean(), - locale: CommonModels.LocaleEnumSchema.nullish(), - }) - .readonly(); - export type QuoteDocumentConfigDto = z.infer; - - /** - * CustomerDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - */ - export const CustomerDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); - export type CustomerDto = z.infer; - - /** - * ContactDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } phone - * @property { string } date - * @property { string } validFrom - * @property { string } validUntil - */ - export const ContactDtoSchema = z - .object({ - name: z.string(), - email: z.string(), - phone: z.string(), - date: z.iso.datetime({ offset: true }), - validFrom: z.iso.datetime({ offset: true }).nullish(), - validUntil: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type ContactDto = z.infer; - - /** - * QuoteDocumentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } quoteId - * @property { string } quoteNumber - * @property { CommonModels.TransportModeEnum } quoteTransportMode Mode of transport - * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote - * @property { string } transitDurationInDays Transit duration in days - * @property { CustomerDto } customer - * @property { ContactDto } contact - * @property { QuoteDocumentDataDto } data - * @property { boolean } suspendCargoTable - * @property { boolean } suspendFinanceTable - * @property { CommonModels.EditorContentResponseDto } bodyRemarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks - * @property { boolean } isIssued - * @property { number } version - * @property { QuoteDocumentConfigDto } config - * @property { string } issuedAt - */ - export const QuoteDocumentResponseDtoSchema = z - .object({ - id: z.string(), - quoteId: z.string(), - quoteNumber: z.string(), - quoteTransportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), - frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), - transitDurationInDays: z.string().describe("Transit duration in days").nullish(), - customer: CustomerDtoSchema, - contact: ContactDtoSchema, - data: QuoteDocumentDataDtoSchema.nullish(), - suspendCargoTable: z.boolean(), - suspendFinanceTable: z.boolean(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), - isIssued: z.boolean(), - version: z.number(), - config: QuoteDocumentConfigDtoSchema.nullish(), - issuedAt: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type QuoteDocumentResponseDto = z.infer; - - /** - * QuoteDocumentDataUpdateDtoSchema - * @type { object } - * @property { CommonModels.RouteTableUpdateBlockDto } routeTable - * @property { CommonModels.CargoTableBlockUpdateDto } cargoTable - * @property { CommonModels.FinanceTableBlockUpdateDto } financeTable - */ - export const QuoteDocumentDataUpdateDtoSchema = z - .object({ - routeTable: CommonModels.RouteTableUpdateBlockDtoSchema, - cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema, - financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema, - }) - .readonly(); - export type QuoteDocumentDataUpdateDto = z.infer; - - /** - * CustomerUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - */ - export const CustomerUpdateDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); - export type CustomerUpdateDto = z.infer; - - /** - * ContactUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } phone - * @property { string } date - */ - export const ContactUpdateDtoSchema = z - .object({ name: z.string(), email: z.email(), phone: z.string(), date: z.iso.datetime({ offset: true }) }) - .readonly(); - export type ContactUpdateDto = z.infer; - - /** - * UpdateQuoteDocumentRequestDtoSchema - * @type { object } - * @property { CustomerUpdateDto } customer - * @property { ContactUpdateDto } contact - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks - * @property { boolean } suspendCargoTable - * @property { boolean } suspendFinanceTable - * @property { QuoteDocumentDataUpdateDto } data - */ - export const UpdateQuoteDocumentRequestDtoSchema = z - .object({ - customer: CustomerUpdateDtoSchema, - contact: ContactUpdateDtoSchema, - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema, - footerRemarks: CommonModels.EditorContentUpdateDtoSchema, - suspendCargoTable: z.boolean(), - suspendFinanceTable: z.boolean(), - data: QuoteDocumentDataUpdateDtoSchema, - }) - .readonly(); - export type UpdateQuoteDocumentRequestDto = z.infer; - - /** - * GenerateQuoteDocumentPreviewRequestDtoSchema - * @type { object } - * @property { string } issuedAt - */ - export const GenerateQuoteDocumentPreviewRequestDtoSchema = z - .object({ issuedAt: z.iso.datetime({ offset: true }) }) - .readonly(); - export type GenerateQuoteDocumentPreviewRequestDto = z.infer; - - /** - * GenerateQuoteDocumentRequestDtoSchema - * @type { object } - * @property { string } issuedAt - * @property { string } fileName - */ - export const GenerateQuoteDocumentRequestDtoSchema = z - .object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }) - .readonly(); - export type GenerateQuoteDocumentRequestDto = z.infer; -} diff --git a/test/generated/dist/quoteDocument/quoteDocument.queries.ts b/test/generated/dist/quoteDocument/quoteDocument.queries.ts deleted file mode 100644 index 394be8c..0000000 --- a/test/generated/dist/quoteDocument/quoteDocument.queries.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteDocumentAcl } from "./quoteDocument.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteDocumentModels } from "./quoteDocument.models"; -import { QuoteDocumentApi } from "./quoteDocument.api"; - -export namespace QuoteDocumentQueries { - export const moduleName = QueryModule.QuoteDocument; - - export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/document", officeId, quoteId] as const, - }; - - /** - * Query `useGet` - * @summary Get quote document - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteDocumentAcl.canUseGet({ officeId })); - return QuoteDocumentApi.get(officeId, quoteId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update quote document - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.UpdateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof QuoteDocumentApi.update, - { officeId: string; quoteId: string; data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId })); - return QuoteDocumentApi.update(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGetPreview` - recommended when file should not be cached - * @summary Get quote document pdf preview - * @permission Requires `canUseGetPreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useGetPreview = ( - options?: AppMutationOptions< - typeof QuoteDocumentApi.getPreview, - { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId })); - return QuoteDocumentApi.getPreview(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerate` - * @summary Get quote document pdf preview - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerate = ( - options?: AppMutationOptions< - typeof QuoteDocumentApi.generate, - { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId })); - return QuoteDocumentApi.generate(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateEml` - recommended when file should not be cached - * @summary Generate quote document and return EML file - * @permission Requires `canUseGenerateEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGenerateEml = ( - options?: AppMutationOptions< - typeof QuoteDocumentApi.generateEml, - { officeId: string; quoteId: string; data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId })); - return QuoteDocumentApi.generateEml(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts deleted file mode 100644 index e68b397..0000000 --- a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteProfitChangeTrackingAcl { - /** - * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. - * @description List quote profit change groups - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.quoteId quoteId from quoteId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query - */ - export const canUseFindProfitChangeGroups = (object?: { officeId: string; quoteId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) - >; - - /** - * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. - * @description Get quote profit change group details - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.quoteId quoteId from quoteId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query - */ - export const canUseFindProfitChangeGroupDetail = (object?: { officeId: string; quoteId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string; quoteId: string }) - >; -} diff --git a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts deleted file mode 100644 index 9ab2130..0000000 --- a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; - -export namespace QuoteProfitChangeTrackingApi { - export const findProfitChangeGroups = ( - officeId: string, - quoteId: string, - limit: number, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findProfitChangeGroupDetail = ( - groupId: string, - officeId: string, - quoteId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, - config, - ); - }; -} diff --git a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts deleted file mode 100644 index 269b961..0000000 --- a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { dynamicColumns } from "@povio/ui"; -import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; -import { QuoteProfitChangeTrackingQueries } from "./quoteProfitChangeTracking.queries"; -import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; - -export namespace QuoteProfitChangeTrackingConfigs { - export const profitChangeGroupsConfig = { - meta: { - title: "Profit Change Groups", - }, - readAll: { - acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups, - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, - paginated: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroups, - infinite: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, - columns: dynamicColumns({ - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, - options: { - columns: { - id: true, - timestamp: true, - users: true, - profit: true, - changeCount: true, - }, - }, - }), - }, - read: { - acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema, - query: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, - }, - }; -} diff --git a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts deleted file mode 100644 index 4b453b4..0000000 --- a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteProfitChangeTrackingModels { - /** - * QuoteAccountProfitChangeGroupDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto[] } users - * @property { object } profit - * @property { number } profit.amount - * @property { string } profit.currencyCode - * @property { number } changeCount - */ - export const QuoteAccountProfitChangeGroupDtoSchema = z - .object({ - id: z.string(), - timestamp: z.iso.datetime({ offset: true }), - users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), - profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), - changeCount: z.number(), - }) - .readonly(); - export type QuoteAccountProfitChangeGroupDto = z.infer; - - /** - * QuoteAccountProfitChangeEntryDtoSchema - * @type { object } - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto } user - * @property { number } changeNumber - * @property { number } oldProfit - * @property { number } newProfit - * @property { string } currencyCode - */ - export const QuoteAccountProfitChangeEntryDtoSchema = z - .object({ - timestamp: z.iso.datetime({ offset: true }), - user: CommonModels.UserPreviewDtoSchema, - changeNumber: z.number(), - oldProfit: z.number(), - newProfit: z.number(), - currencyCode: z.string(), - }) - .readonly(); - export type QuoteAccountProfitChangeEntryDto = z.infer; - - /** - * QuoteAccountProfitChangeGroupDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { string } currencyCode - * @property { QuoteAccountProfitChangeEntryDto[] } entries - */ - export const QuoteAccountProfitChangeGroupDetailDtoSchema = z - .object({ - id: z.string(), - timestamp: z.iso.datetime({ offset: true }), - currencyCode: z.string(), - entries: z.array(QuoteAccountProfitChangeEntryDtoSchema).readonly(), - }) - .readonly(); - export type QuoteAccountProfitChangeGroupDetailDto = z.infer; - - /** - * QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { QuoteAccountProfitChangeGroupDto[] } items - */ - export const QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(QuoteAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape, - }); - export type QuoteProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer< - typeof QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema - >; -} diff --git a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts b/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts deleted file mode 100644 index d39ed96..0000000 --- a/test/generated/dist/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { QuoteProfitChangeTrackingApi } from "./quoteProfitChangeTracking.api"; - -export namespace QuoteProfitChangeTrackingQueries { - export const moduleName = QueryModule.QuoteProfitChangeTracking; - - export const keys = { - all: [moduleName] as const, - findProfitChangeGroups: (officeId: string, quoteId: string, limit?: number, page?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", - officeId, - quoteId, - limit, - page, - cursor, - ] as const, - findProfitChangeGroupsInfinite: (officeId: string, quoteId: string, limit?: number, cursor?: string) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", - "infinite", - officeId, - quoteId, - limit, - cursor, - ] as const, - findProfitChangeGroupDetail: (groupId: string, officeId: string, quoteId: string) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/account/profit-change-groups/:groupId", - groupId, - officeId, - quoteId, - ] as const, - }; - - /** - * Query `useFindProfitChangeGroups` - * @summary List quote profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroups = ( - { - officeId, - quoteId, - limit, - page, - cursor, - }: { officeId: string; quoteId: string; limit: number; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), - queryFn: () => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId })); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useFindProfitChangeGroupsInfinite - * @summary List quote profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroupsInfinite = ( - { officeId, quoteId, limit, cursor }: { officeId: string; quoteId: string; limit: number; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId })); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindProfitChangeGroupDetail` - * @summary Get quote profit change group details - * @permission Requires `canUseFindProfitChangeGroupDetail` ability - * @param { string } object.groupId Path parameter - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindProfitChangeGroupDetail = ( - { groupId, officeId, quoteId }: { groupId: string; officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), - queryFn: () => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId })); - return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/quoteRoutes/quoteRoutes.acl.ts b/test/generated/dist/quoteRoutes/quoteRoutes.acl.ts deleted file mode 100644 index ee5334d..0000000 --- a/test/generated/dist/quoteRoutes/quoteRoutes.acl.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteRoutesAcl { - /** - * Use for `useListRoutes` query ability. For global ability, omit the object parameter. - * @description List quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query - */ - export const canUseListRoutes = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Create quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation - */ - export const canUseCreateRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Update quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation - */ - export const canUseUpdateRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Delete quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation - */ - export const canUseDeleteRoutePoint = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. - * @description Split quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation - */ - export const canUseSplitRoutes = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. - * @description Merge quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation - */ - export const canUseMergeRoutes = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. - * @description Copy quote route points - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation - */ - export const canUseCopyRoute = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/quoteRoutes/quoteRoutes.api.ts b/test/generated/dist/quoteRoutes/quoteRoutes.api.ts deleted file mode 100644 index 993cf4c..0000000 --- a/test/generated/dist/quoteRoutes/quoteRoutes.api.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteRoutesApi { - export const listRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.RouteListResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes`, - config, - ); - }; - export const createRoutePoint = ( - officeId: string, - quoteId: string, - routeId: string, - data: CommonModels.CreateRoutePointRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, - ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - config, - ); - }; - export const updateRoutePoint = ( - officeId: string, - quoteId: string, - routeId: string, - pointId: string, - data: CommonModels.UpdateRoutePointRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - config, - ); - }; - export const deleteRoutePoint = ( - officeId: string, - quoteId: string, - routeId: string, - pointId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - undefined, - config, - ); - }; - export const splitRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/split`, - undefined, - config, - ); - }; - export const mergeRoutes = ( - officeId: string, - quoteId: string, - data: CommonModels.MergeRoutesRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/merge`, - ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - config, - ); - }; - export const copyRoute = ( - officeId: string, - quoteId: string, - routeId: string, - data: CommonModels.CopyRouteRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, - ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/quoteRoutes/quoteRoutes.queries.ts b/test/generated/dist/quoteRoutes/quoteRoutes.queries.ts deleted file mode 100644 index 5269238..0000000 --- a/test/generated/dist/quoteRoutes/quoteRoutes.queries.ts +++ /dev/null @@ -1,263 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteRoutesAcl } from "./quoteRoutes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteRoutesApi } from "./quoteRoutes.api"; - -export namespace QuoteRoutesQueries { - export const moduleName = QueryModule.QuoteRoutes; - - export const keys = { - all: [moduleName] as const, - listRoutes: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/routes", officeId, quoteId] as const, - }; - - /** - * Query `useListRoutes` - * @summary List routes with points for a quote - * @permission Requires `canUseListRoutes` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListRoutes = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoutes(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId })); - return QuoteRoutesApi.listRoutes(officeId, quoteId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreateRoutePoint` - * @summary Create a route point for a quote route - * @permission Requires `canUseCreateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateRoutePoint = ( - options?: AppMutationOptions< - typeof QuoteRoutesApi.createRoutePoint, - { officeId: string; quoteId: string; routeId: string; data: CommonModels.CreateRoutePointRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, data }) => { - checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId })); - return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateRoutePoint` - * @summary Update a route point for a quote route - * @permission Requires `canUseUpdateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateRoutePoint = ( - options?: AppMutationOptions< - typeof QuoteRoutesApi.updateRoutePoint, - { - officeId: string; - quoteId: string; - routeId: string; - pointId: string; - data: CommonModels.UpdateRoutePointRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { - checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId })); - return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteRoutePoint` - * @summary Delete a route point from a quote route - * @permission Requires `canUseDeleteRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useDeleteRoutePoint = ( - options?: AppMutationOptions< - typeof QuoteRoutesApi.deleteRoutePoint, - { officeId: string; quoteId: string; routeId: string; pointId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, pointId }) => { - checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId })); - return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useSplitRoutes` - * @summary Split quote routes by cargo (sea only) - * @permission Requires `canUseSplitRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useSplitRoutes = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId }) => { - checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId })); - return QuoteRoutesApi.splitRoutes(officeId, quoteId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useMergeRoutes` - * @summary Merge quote cargo routes into single route (sea only) - * @permission Requires `canUseMergeRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useMergeRoutes = ( - options?: AppMutationOptions< - typeof QuoteRoutesApi.mergeRoutes, - { officeId: string; quoteId: string; data: CommonModels.MergeRoutesRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId })); - return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCopyRoute` - * @summary Copy route points from one route to another (sea only) - * @permission Requires `canUseCopyRoute` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ - export const useCopyRoute = ( - options?: AppMutationOptions< - typeof QuoteRoutesApi.copyRoute, - { officeId: string; quoteId: string; routeId: string; data: CommonModels.CopyRouteRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, data }) => { - checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId })); - return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/quotes/quotes.acl.ts b/test/generated/dist/quotes/quotes.acl.ts deleted file mode 100644 index c9ec7f0..0000000 --- a/test/generated/dist/quotes/quotes.acl.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuotesAcl { - /** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Create", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ - export const canUseListAvailablePartnersFor = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useExportQuotes` mutation ability. For global ability, omit the object parameter. - * @description Export quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportQuotes` mutation - */ - export const canUseExportQuotes = (object?: { officeId: string }) => - ["Export", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Export", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Get quote by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ - export const canUseGetById = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ - export const canUseCancel = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Duplicate quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ - export const canUseDuplicate = (object?: { officeId: string }) => - ["Create", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Create", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useGetInvolvedParties` query ability. For global ability, omit the object parameter. - * @description Get involved parties for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvolvedParties` query - */ - export const canUseGetInvolvedParties = (object?: { officeId: string }) => - ["ReadInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "ReadInvolvedParties", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useCreateInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Create involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateInvolvedParty` mutation - */ - export const canUseCreateInvolvedParty = (object?: { officeId: string }) => - ["CreateInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "CreateInvolvedParties", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useUpdateInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Update involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateInvolvedParty` mutation - */ - export const canUseUpdateInvolvedParty = (object?: { officeId: string }) => - ["UpdateInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "UpdateInvolvedParties", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useDeleteInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Delete involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvolvedParty` mutation - */ - export const canUseDeleteInvolvedParty = (object?: { officeId: string }) => - ["DeleteInvolvedParties", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "DeleteInvolvedParties", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/quotes/quotes.api.ts b/test/generated/dist/quotes/quotes.api.ts deleted file mode 100644 index 763edb2..0000000 --- a/test/generated/dist/quotes/quotes.api.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuotesModels } from "./quotes.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuotesApi { - export const paginate = ( - officeId: string, - limit: number, - order?: string, - filter?: QuotesModels.QuoteFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: QuotesModels.QuotesPaginateResponseSchema }, `/offices/${officeId}/quotes`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes`, - ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), - config, - ); - }; - export const listAvailablePartnersFor = ( - officeId: string, - quoteId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/available-partners`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { - type: "query", - name: "useCase", - }), - }, - }, - ); - }; - export const exportQuotes = ( - officeId: string, - data: QuotesModels.QuoteExportRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/exports`, - ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const getById = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}`, - config, - ); - }; - export const update = ( - officeId: string, - quoteId: string, - data: QuotesModels.UpdateQuoteRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}`, - ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), - config, - ); - }; - export const cancel = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cancel`, - undefined, - config, - ); - }; - export const duplicate = ( - officeId: string, - quoteId: string, - data: QuotesModels.DuplicateQuoteRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/duplicate`, - ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), - config, - ); - }; - export const getInvolvedParties = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - config, - ); - }; - export const createInvolvedParty = ( - officeId: string, - quoteId: string, - data: CommonModels.CreateInvolvedPartyRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - config, - ); - }; - export const updateInvolvedParty = ( - officeId: string, - quoteId: string, - partyId: string, - data: CommonModels.UpdateInvolvedPartyDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - config, - ); - }; - export const deleteInvolvedParty = ( - officeId: string, - quoteId: string, - partyId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/quotes/quotes.configs.ts b/test/generated/dist/quotes/quotes.configs.ts deleted file mode 100644 index fa74aae..0000000 --- a/test/generated/dist/quotes/quotes.configs.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { QuotesModels } from "./quotes.models"; -import { QuotesQueries } from "./quotes.queries"; -import { QuotesAcl } from "./quotes.acl"; - -export namespace QuotesConfigs { - export const quotesConfig = { - meta: { - title: "Quotes", - }, - readAll: { - acl: QuotesAcl.canUsePaginate, - schema: QuotesModels.QuotePreviewResponseDTOSchema, - paginated: QuotesQueries.usePaginate, - infinite: QuotesQueries.usePaginateInfinite, - filters: { - schema: QuotesModels.QuoteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: QuotesModels.QuoteFilterDtoSchema, - options: { - inputs: { - statusDate: true, - transportMode: true, - status: true, - direction: true, - loadType: true, - serviceType: true, - carrierId: true, - consigneeId: true, - employee: true, - routing: true, - number: true, - createdAt: true, - vesselCarrier: true, - searchQuery: true, - customer: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: QuotesModels.QuotePreviewResponseDTOSchema, - options: { - columns: { - id: true, - transportMode: true, - statusDate: true, - createdAt: true, - number: true, - status: true, - direction: true, - loadType: true, - customer: true, - customerReference: true, - consignee: true, - consigneeReference: true, - carrier: true, - carrierReference: true, - employee: true, - origin: true, - destination: true, - portOfLoading: true, - dischargePort: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - equipment: true, - serviceType: true, - currency: true, - profit: true, - margin: true, - numberOfConvertedPositions: true, - departureDate: true, - arrivalDate: true, - routing: true, - }, - sortable: QuotesModels.QuotesPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: QuotesAcl.canUseGetById, - schema: QuotesModels.QuoteCoreResponseDTOSchema, - query: QuotesQueries.useGetById, - }, - create: { - acl: QuotesAcl.canUseCreate, - schema: QuotesModels.CreateQuoteRequestDTOSchema, - mutation: QuotesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: QuotesModels.CreateQuoteRequestDTOSchema, - options: { - inputs: { - section: true, - direction: true, - transportMode: true, - loadType: true, - serviceType: true, - customerBusinessPartnerId: true, - }, - }, - }), - }, - update: { - acl: QuotesAcl.canUseUpdate, - schema: QuotesModels.UpdateQuoteRequestDTOSchema, - mutation: QuotesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: QuotesModels.UpdateQuoteRequestDTOSchema, - options: { - inputs: { - number: true, - statusDate: true, - cargoType: true, - loadType: true, - incoterms: true, - secondIncoterms: true, - serviceType: true, - buyRateReference: true, - frequency: true, - transitDurationInDays: true, - quoteType: true, - defaultCurrencyId: true, - salesRepId: true, - responsibleEmployeeId: true, - receivedByEmployeeId: true, - team: true, - volumetricWeightModifier: true, - }, - }, - }), - }, - }; -} diff --git a/test/generated/dist/quotes/quotes.models.ts b/test/generated/dist/quotes/quotes.models.ts deleted file mode 100644 index b02bfc0..0000000 --- a/test/generated/dist/quotes/quotes.models.ts +++ /dev/null @@ -1,322 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuotesModels { -/** - * QuoteStatusEnumSchema - * @type { enum } - */ -export const QuoteStatusEnumSchema = z.enum(["Pending", "Cancelled", "Converted"]); -export type QuoteStatusEnum = z.infer; -export const QuoteStatusEnum = QuoteStatusEnumSchema.enum; - -/** - * QuoteCustomerResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { string } phone The phone number of the customer - * @property { string } email The email of the customer - */ -export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().describe("The phone number of the customer").nullish(), email: z.string().describe("The email of the customer").nullish() }).readonly(); -export type QuoteCustomerResponseDto = z.infer; - -/** - * QuoteNamedReferenceResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the entity - * @property { string } name Name of the entity - * @property { string } matchCode - * @property { string } label Display label (name or match code depending on office settings) - */ -export const QuoteNamedReferenceResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the entity").nullable(), name: z.string().describe("Name of the entity").nullable(), matchCode: z.string().nullable(), label: z.string().describe("Display label (name or match code depending on office settings)").nullable() }).readonly(); -export type QuoteNamedReferenceResponseDto = z.infer; - -/** - * QuotePreviewResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the quote - * @property { CommonModels.TransportModeEnum } transportMode Transport mode - * @property { string } statusDate The date of the quote status - * @property { string } createdAt The date when the quote was created - * @property { string } number The quote number - * @property { QuoteStatusEnum } status Status of the quote - * @property { CommonModels.DirectionEnum } direction Direction of the quote - * @property { CommonModels.LoadTypeEnum } loadType Load type - * @property { QuoteCustomerResponseDto } customer The customer information - * @property { string } customerReference Customer reference number - * @property { QuoteNamedReferenceResponseDto } consignee Consignee information - * @property { string } consigneeReference Consignee reference number - * @property { QuoteNamedReferenceResponseDto } carrier The carrier - * @property { string } carrierReference Carrier reference number - * @property { QuoteNamedReferenceResponseDto } employee Responsible employee - * @property { QuoteNamedReferenceResponseDto } origin Origin location - * @property { QuoteNamedReferenceResponseDto } destination Destination location - * @property { QuoteNamedReferenceResponseDto } portOfLoading Port of loading - * @property { QuoteNamedReferenceResponseDto } dischargePort Discharge port - * @property { string } bookingNumber Booking reference number - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } vesselCarrier Carrier name from route point (sea positions only) - * @property { string } equipment Equipment summary (e.g., "2x20DC, 1x40HC") - * @property { CommonModels.ServiceTypeEnum } serviceType Service type - * @property { string } currency Currency code - * @property { number } profit Total profit - * @property { number } margin Profit margin percentage - * @property { number } numberOfConvertedPositions Number of positions converted from this quote - * @property { string } departureDate Departure date - * @property { string } arrivalDate Arrival date - * @property { CommonModels.SeaRoutingEnum } routing Sea routing type - */ -export const QuotePreviewResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status").nullable(), createdAt: z.iso.datetime({ offset: true }).describe("The date when the quote was created"), number: z.string().describe("The quote number"), status: QuoteStatusEnumSchema.describe("Status of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type").nullish(), customer: QuoteCustomerResponseDtoSchema.describe("The customer information"), customerReference: z.string().describe("Customer reference number").nullish(), consignee: QuoteNamedReferenceResponseDtoSchema.describe("Consignee information").nullish(), consigneeReference: z.string().describe("Consignee reference number").nullish(), carrier: QuoteNamedReferenceResponseDtoSchema.describe("The carrier").nullish(), carrierReference: z.string().describe("Carrier reference number").nullish(), employee: QuoteNamedReferenceResponseDtoSchema.describe("Responsible employee").nullish(), origin: QuoteNamedReferenceResponseDtoSchema.describe("Origin location"), destination: QuoteNamedReferenceResponseDtoSchema.describe("Destination location"), portOfLoading: QuoteNamedReferenceResponseDtoSchema.describe("Port of loading").nullish(), dischargePort: QuoteNamedReferenceResponseDtoSchema.describe("Discharge port").nullish(), bookingNumber: z.string().describe("Booking reference number").nullish(), vessel: z.string().describe("Vessel name").nullish(), voyage: z.string().describe("Voyage number").nullish(), vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), equipment: z.string().describe("Equipment summary (e.g., "2x20DC, 1x40HC")").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.describe("Service type").nullish(), currency: z.string().describe("Currency code").nullish(), profit: z.number().describe("Total profit").nullish(), margin: z.number().describe("Profit margin percentage").nullish(), numberOfConvertedPositions: z.number().describe("Number of positions converted from this quote"), departureDate: z.iso.datetime({ offset: true }).describe("Departure date").nullish(), arrivalDate: z.iso.datetime({ offset: true }).describe("Arrival date").nullish(), routing: CommonModels.SeaRoutingEnumSchema.describe("Sea routing type").nullish() }).readonly(); -export type QuotePreviewResponseDTO = z.infer; - -/** - * QuoteFilterDtoSchema - * @type { object } - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.TransportModeEnum } transportMode - * @property { QuoteStatusEnum[] } status - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } carrierId Filter quotes by carrier IDs - * @property { string[] } consigneeId Filter quotes by consignee IDs - * @property { string[] } employee Filter quotes by employee IDs - * @property { CommonModels.SeaRoutingEnum } routing - * @property { string } number Filter quotes by quote number - * @property { CommonModels.DateRangeDto } createdAt - * @property { string } vesselCarrier Filter quotes by carrier name from route point - * @property { string } searchQuery - * @property { string[] } customer - */ -export const QuoteFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, carrierId: z.array(z.string()).readonly().describe("Filter quotes by carrier IDs"), consigneeId: z.array(z.string()).readonly().describe("Filter quotes by consignee IDs"), employee: z.array(z.string()).readonly().describe("Filter quotes by employee IDs"), routing: CommonModels.SeaRoutingEnumSchema, number: z.string().describe("Filter quotes by quote number"), createdAt: CommonModels.DateRangeDtoSchema, vesselCarrier: z.string().describe("Filter quotes by carrier name from route point"), searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); -export type QuoteFilterDto = z.infer; - -/** - * QuoteExportFilterDtoSchema - * @type { object } - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.TransportModeEnum } transportMode - * @property { QuoteStatusEnum[] } status - * @property { CommonModels.DirectionEnum } direction - * @property { string } searchQuery - * @property { string[] } customer - */ -export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); -export type QuoteExportFilterDto = z.infer; - -/** - * QuoteExportColumnSchema - * @type { enum } - */ -export const QuoteExportColumnSchema = z.enum(["id", "transportMode", "statusDate", "createdAt", "number", "status", "direction", "loadType", "serviceType", "customerId", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeId", "consigneeName", "consigneeReference", "carrierId", "carrierName", "carrierReference", "responsibleEmployeeName", "originLocationId", "originLocationName", "destinationLocationId", "destinationLocationName", "portOfLoadingId", "portOfLoadingName", "dischargePortId", "dischargePortName", "bookingNumber", "vessel", "voyage", "equipment", "departureDate", "arrivalDate", "routing", "currency", "profit", "margin"]); -export type QuoteExportColumn = z.infer; -export const QuoteExportColumn = QuoteExportColumnSchema.enum; - -/** - * QuoteExportRequestDtoSchema - * @type { object } - * @property { QuoteExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { QuoteExportFilterDto } filter - */ -export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: QuoteExportFilterDtoSchema }).readonly(); -export type QuoteExportRequestDto = z.infer; - -/** - * CreateQuoteRequestDTOSchema - * @type { object } - * @property { CommonModels.SectionEnum } section The section of the quote - * @property { CommonModels.DirectionEnum } direction The direction of the quote - * @property { CommonModels.TransportModeEnum } transportMode The mode of transport for the quote - * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote - * @property { CommonModels.ServiceTypeEnum } serviceType The service type for the quote - * @property { string } customerBusinessPartnerId The ID of the business partner that is the customer - */ -export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema.describe("The section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("The direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("The mode of transport for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The service type for the quote"), customerBusinessPartnerId: z.string().describe("The ID of the business partner that is the customer") }).readonly(); -export type CreateQuoteRequestDTO = z.infer; - -/** - * QuoteCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type QuoteCustomerDto = z.infer; - -/** - * QuoteEmployeeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the employee - * @property { string } name Name of the employee - */ -export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the employee"), name: z.string().describe("Name of the employee") }).readonly(); -export type QuoteEmployeeResponseDTO = z.infer; - -/** - * CargoTypeEnumSchema - * @type { enum } - */ -export const CargoTypeEnumSchema = z.enum(["Trailer", "Container", "BreakBulk", "Roro", "Project"]); -export type CargoTypeEnum = z.infer; -export const CargoTypeEnum = CargoTypeEnumSchema.enum; - -/** - * QuoteTypeEnumSchema - * @type { enum } - */ -export const QuoteTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); -export type QuoteTypeEnum = z.infer; -export const QuoteTypeEnum = QuoteTypeEnumSchema.enum; - -/** - * QuoteConvertedPositionDtoSchema - * @type { object } - * @property { string } positionId - * @property { string } positionNumber - */ -export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }).readonly(); -export type QuoteConvertedPositionDto = z.infer; - -/** - * QuoteCoreResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the quote - * @property { string } rootFolderId Root folder identifier bound to this quote - * @property { QuoteCustomerDto } customer - * @property { QuoteStatusEnum } status Current status of the quote - * @property { string } responsibleEmployeeId Unique identifier of the responsible employee - * @property { string } receivedByEmployeeId Unique identifier of the employee receiving the quote - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } salesRepId Unique identifier of the sales rep - * @property { QuoteEmployeeResponseDTO } responsibleEmployee The responsible employee - * @property { QuoteEmployeeResponseDTO } receivedByEmployee The employee who received the quote - * @property { string } owningOfficeId ID of the office owning the quote - * @property { string } name Name of the quote - * @property { string } number Quote number - * @property { CommonModels.SectionEnum } section Section of the quote - * @property { CommonModels.DirectionEnum } direction Direction of the quote - * @property { CommonModels.TransportModeEnum } transportMode Mode of transport - * @property { string } statusDate Date of the quote status - * @property { CargoTypeEnum } cargoType Type of cargo - * @property { CommonModels.IncotermsEnum } incoterms Incoterms for the quote - * @property { CommonModels.IncotermsEnum } secondIncoterms Second incoterms for the quote - * @property { string } buyRateReference Reference for buy rate - * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote - * @property { string } transitDurationInDays Transit duration in days - * @property { QuoteTypeEnum } quoteType Type of quote - * @property { string } defaultCurrencyId Default currency - * @property { QuoteEmployeeResponseDTO } salesRep The sales rep for the quote - * @property { string } team Team - * @property { string } createdAt - * @property { string } updatedAt - * @property { QuoteConvertedPositionDto[] } convertedPositions Positions converted from this quote. Default: `` - * @property { CommonModels.LoadTypeEnum } loadType Load type of quote - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const QuoteCoreResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), rootFolderId: z.string().describe("Root folder identifier bound to this quote").nullish(), customer: QuoteCustomerDtoSchema.nullish(), status: QuoteStatusEnumSchema.describe("Current status of the quote"), responsibleEmployeeId: z.string().describe("Unique identifier of the responsible employee").nullish(), receivedByEmployeeId: z.string().describe("Unique identifier of the employee receiving the quote").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesRepId: z.string().describe("Unique identifier of the sales rep").nullish(), responsibleEmployee: QuoteEmployeeResponseDTOSchema.describe("The responsible employee").nullish(), receivedByEmployee: QuoteEmployeeResponseDTOSchema.describe("The employee who received the quote").nullish(), owningOfficeId: z.string().describe("ID of the office owning the quote"), name: z.string().describe("Name of the quote"), number: z.string().describe("Quote number"), section: CommonModels.SectionEnumSchema.describe("Section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), statusDate: z.iso.datetime({ offset: true }).describe("Date of the quote status"), cargoType: CargoTypeEnumSchema.describe("Type of cargo").nullish(), incoterms: CommonModels.IncotermsEnumSchema.describe("Incoterms for the quote").nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("Second incoterms for the quote").nullish(), buyRateReference: z.string().describe("Reference for buy rate").nullish(), frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), transitDurationInDays: z.string().describe("Transit duration in days").nullish(), quoteType: QuoteTypeEnumSchema.describe("Type of quote").nullish(), defaultCurrencyId: z.string().describe("Default currency").nullish(), salesRep: QuoteEmployeeResponseDTOSchema.describe("The sales rep for the quote").nullish(), team: z.string().describe("Team").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), convertedPositions: z.array(QuoteConvertedPositionDtoSchema).readonly().describe("Positions converted from this quote").default([]), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type of quote").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); -export type QuoteCoreResponseDTO = z.infer; - -/** - * UpdateQuoteRequestDTOSchema - * @type { object } - * @property { string } number The quote number - * @property { string } statusDate The date of the quote status - * @property { CargoTypeEnum } cargoType The type of cargo for the quote - * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote - * @property { CommonModels.IncotermsEnum } incoterms The incoterms for the quote - * @property { CommonModels.IncotermsEnum } secondIncoterms The second incoterms for the quote - * @property { CommonModels.ServiceTypeEnum } serviceType The type of service for the quote - * @property { string } buyRateReference The reference for the buy rate - * @property { CommonModels.FrequencyEnum } frequency The frequency of the quote - * @property { string } transitDurationInDays The transit duration in days - * @property { QuoteTypeEnum } quoteType The type of quote - * @property { string } defaultCurrencyId The default currency for the quote - * @property { string } salesRepId The sales representative for the quote - * @property { string } responsibleEmployeeId The responsible employee for the quote - * @property { string } receivedByEmployeeId The employee who receieved the quote - * @property { string } team The team responsible for the quote - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().describe("The quote number"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status"), cargoType: CargoTypeEnumSchema.describe("The type of cargo for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), incoterms: CommonModels.IncotermsEnumSchema.describe("The incoterms for the quote"), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("The second incoterms for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The type of service for the quote"), buyRateReference: z.string().describe("The reference for the buy rate"), frequency: CommonModels.FrequencyEnumSchema.describe("The frequency of the quote"), transitDurationInDays: z.string().describe("The transit duration in days").nullable(), quoteType: QuoteTypeEnumSchema.describe("The type of quote"), defaultCurrencyId: z.string().describe("The default currency for the quote"), salesRepId: z.string().describe("The sales representative for the quote"), responsibleEmployeeId: z.string().describe("The responsible employee for the quote"), receivedByEmployeeId: z.string().describe("The employee who receieved the quote"), team: z.string().describe("The team responsible for the quote"), volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); -export type UpdateQuoteRequestDTO = z.infer; - -/** - * QuoteSectionEnumSchema - * @type { enum } - */ -export const QuoteSectionEnumSchema = z.enum(["Customer", "Overview", "Cargo", "Finances", "Documents"]); -export type QuoteSectionEnum = z.infer; -export const QuoteSectionEnum = QuoteSectionEnumSchema.enum; - -/** - * DuplicateQuoteRequestDtoSchema - * @type { object } - * @property { QuoteSectionEnum[] } sections The sections to duplicate. Min Items: `1` - */ -export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).readonly().min(1).describe("The sections to duplicate") }).readonly(); -export type DuplicateQuoteRequestDto = z.infer; - -/** - * QuoteListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalProfit - * @property { number } profitPerQuote - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const QuoteListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalProfit: z.number(), profitPerQuote: z.number(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); -export type QuoteListResponseDto = z.infer; - -/** - * QuotesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const QuotesPaginateOrderParamEnumSchema = z.enum(["number", "statusDate", "transportMode", "status", "direction", "loadType", "serviceType", "createdAt", "employee", "profit"]); -export type QuotesPaginateOrderParamEnum = z.infer; -export const QuotesPaginateOrderParamEnum = QuotesPaginateOrderParamEnumSchema.enum; - -/** - * QuotesPaginateResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerQuote - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { QuotePreviewResponseDTO[] } items - */ -export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).readonly() }).readonly().shape }); -export type QuotesPaginateResponse = z.infer; - -/** - * QuotesListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ -export const QuotesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); -export type QuotesListAvailablePartnersForResponse = z.infer; - -/** - * GetInvolvedPartiesResponseSchema - * @type { array } - */ -export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); -export type GetInvolvedPartiesResponse = z.infer; - -} diff --git a/test/generated/dist/quotes/quotes.queries.ts b/test/generated/dist/quotes/quotes.queries.ts deleted file mode 100644 index 42c7089..0000000 --- a/test/generated/dist/quotes/quotes.queries.ts +++ /dev/null @@ -1,507 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuotesAcl } from "./quotes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuotesModels } from "./quotes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { QuotesApi } from "./quotes.api"; - -export namespace QuotesQueries { - export const moduleName = QueryModule.Quotes; - - export const keys = { - all: [moduleName] as const, - paginate: ( - officeId: string, - limit?: number, - order?: string, - filter?: QuotesModels.QuoteFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/quotes", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: QuotesModels.QuoteFilterDto, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/quotes", "infinite", officeId, limit, order, filter, cursor] as const, - listAvailablePartnersFor: ( - officeId: string, - quoteId: string, - search?: string, - useCase?: CommonModels.PositionAvailablePartnersUseCase, - ) => - [ - ...keys.all, - "/offices/:officeId/quotes/:quoteId/available-partners", - officeId, - quoteId, - search, - useCase, - ] as const, - getById: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId", officeId, quoteId] as const, - getInvolvedParties: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/involved-parties", officeId, quoteId] as const, - }; - - /** - * Query `usePaginate` - * @summary Paginate Quotes - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` - * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: QuotesModels.QuoteFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(QuotesAcl.canUsePaginate({ officeId })); - return QuotesApi.paginate(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Quotes - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` - * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { officeId: string; limit: number; order?: string; filter?: QuotesModels.QuoteFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuotesAcl.canUsePaginate({ officeId })); - return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create Quote - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { QuotesModels.CreateQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof QuotesApi.create, - { officeId: string; data: QuotesModels.CreateQuoteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(QuotesAcl.canUseCreate({ officeId })); - return QuotesApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for a quote - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useListAvailablePartnersFor = ( - { - officeId, - quoteId, - search, - useCase, - }: { officeId: string; quoteId: string; search?: string; useCase?: CommonModels.PositionAvailablePartnersUseCase }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), - queryFn: () => { - checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId })); - return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase, config); - }, - ...options, - }); - }; - - /** - * Mutation `useExportQuotes` - recommended when file should not be cached - * @summary Export quotes to Excel - * @permission Requires `canUseExportQuotes` ability - * @param { string } mutation.officeId Path parameter - * @param { QuotesModels.QuoteExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const useExportQuotes = ( - options?: AppMutationOptions< - typeof QuotesApi.exportQuotes, - { officeId: string; data: QuotesModels.QuoteExportRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(QuotesAcl.canUseExportQuotes({ officeId })); - return QuotesApi.exportQuotes(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetById` - * @summary Get quote by id - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetById = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, quoteId), - queryFn: () => { - checkAcl(QuotesAcl.canUseGetById({ officeId })); - return QuotesApi.getById(officeId, quoteId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuotesModels.UpdateQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof QuotesApi.update, - { officeId: string; quoteId: string; data: QuotesModels.UpdateQuoteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseUpdate({ officeId })); - return QuotesApi.update(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useCancel` - * @summary Cancel quote - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useCancel = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId }) => { - checkAcl(QuotesAcl.canUseCancel({ officeId })); - return QuotesApi.cancel(officeId, quoteId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDuplicate` - * @summary Duplicate quote - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuotesModels.DuplicateQuoteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useDuplicate = ( - options?: AppMutationOptions< - typeof QuotesApi.duplicate, - { officeId: string; quoteId: string; data: QuotesModels.DuplicateQuoteRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseDuplicate({ officeId })); - return QuotesApi.duplicate(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetInvolvedParties` - * @summary Get involved parties for quote - * @permission Requires `canUseGetInvolvedParties` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetInvolvedParties = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvolvedParties(officeId, quoteId), - queryFn: () => { - checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId })); - return QuotesApi.getInvolvedParties(officeId, quoteId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useCreateInvolvedParty` - * @summary Create involved party for quote - * @permission Requires `canUseCreateInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreateInvolvedParty = ( - options?: AppMutationOptions< - typeof QuotesApi.createInvolvedParty, - { officeId: string; quoteId: string; data: CommonModels.CreateInvolvedPartyRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId })); - return QuotesApi.createInvolvedParty(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUpdateInvolvedParty` - * @summary Update involved party for quote - * @permission Requires `canUseUpdateInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateInvolvedParty = ( - options?: AppMutationOptions< - typeof QuotesApi.updateInvolvedParty, - { officeId: string; quoteId: string; partyId: string; data: CommonModels.UpdateInvolvedPartyDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, partyId, data }) => { - checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId })); - return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteInvolvedParty` - * @summary Delete involved party for quote - * @permission Requires `canUseDeleteInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useDeleteInvolvedParty = ( - options?: AppMutationOptions< - typeof QuotesApi.deleteInvolvedParty, - { officeId: string; quoteId: string; partyId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, partyId }) => { - checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId })); - return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/remarkTemplates/remarkTemplates.acl.ts b/test/generated/dist/remarkTemplates/remarkTemplates.acl.ts deleted file mode 100644 index d7492ee..0000000 --- a/test/generated/dist/remarkTemplates/remarkTemplates.acl.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace RemarkTemplatesAcl { - /** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List remark template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = (object?: { officeId: string }) => - ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Read", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; - - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List remark templates - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Read", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; - - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Create", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; - - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get remark template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Read", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update remark template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Update", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; - - /** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = (object?: { officeId: string }) => - ["Archive", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Archive", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; - - /** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = (object?: { officeId: string }) => - ["Unarchive", object ? subject("RemarkTemplate", object) : "RemarkTemplate"] as AbilityTuple< - "Unarchive", - "RemarkTemplate" | (ForcedSubject<"RemarkTemplate"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/remarkTemplates/remarkTemplates.api.ts b/test/generated/dist/remarkTemplates/remarkTemplates.api.ts deleted file mode 100644 index a8f13b0..0000000 --- a/test/generated/dist/remarkTemplates/remarkTemplates.api.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; - -export namespace RemarkTemplatesApi { - export const paginateLabels = ( - officeId: string, - limit: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/remark-templates/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const list = ( - officeId: string, - limit: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, - `/offices/${officeId}/remark-templates`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const create = ( - officeId: string, - data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates`, - ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), - config, - ); - }; - export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}`, - config, - ); - }; - export const update = ( - id: string, - officeId: string, - data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}`, - ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/remarkTemplates/remarkTemplates.configs.ts b/test/generated/dist/remarkTemplates/remarkTemplates.configs.ts deleted file mode 100644 index d004179..0000000 --- a/test/generated/dist/remarkTemplates/remarkTemplates.configs.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; -import { RemarkTemplatesQueries } from "./remarkTemplates.queries"; -import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; - -export namespace RemarkTemplatesConfigs { - export const remarkTemplatesConfig = { - meta: { - title: "Remark Templates", - }, - readAll: { - acl: RemarkTemplatesAcl.canUseList, - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - paginated: RemarkTemplatesQueries.useList, - infinite: RemarkTemplatesQueries.useListInfinite, - filters: { - schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - onlyUsedFor: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - content: true, - onlyUsedFor: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema, - }, - }), - }, - read: { - acl: RemarkTemplatesAcl.canUseFindById, - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - query: RemarkTemplatesQueries.useFindById, - }, - create: { - acl: RemarkTemplatesAcl.canUseCreate, - schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, - mutation: RemarkTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - content: true, - onlyUsedFor: true, - }, - }, - }), - }, - update: { - acl: RemarkTemplatesAcl.canUseUpdate, - schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, - mutation: RemarkTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - content: true, - onlyUsedFor: true, - archived: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: RemarkTemplatesAcl.canUsePaginateLabels, - schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, - paginated: RemarkTemplatesQueries.usePaginateLabels, - infinite: RemarkTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - content: true, - }, - sortable: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/remarkTemplates/remarkTemplates.models.ts b/test/generated/dist/remarkTemplates/remarkTemplates.models.ts deleted file mode 100644 index 21a682a..0000000 --- a/test/generated/dist/remarkTemplates/remarkTemplates.models.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace RemarkTemplatesModels { - /** - * RemarkTemplateLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { CommonModels.EditorContentResponseDto } content Remark template content - */ - export const RemarkTemplateLabelResponseDTOSchema = z - .object({ - id: z.string(), - label: z.string(), - content: CommonModels.EditorContentResponseDtoSchema.describe("Remark template content"), - }) - .readonly(); - export type RemarkTemplateLabelResponseDTO = z.infer; - - /** - * RemarkTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const RemarkTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type RemarkTemplateEmployeeDTO = z.infer; - - /** - * OnlyUsedForEnumSchema - * @type { enum } - */ - export const OnlyUsedForEnumSchema = z.enum([ - "transport-order", - "export-declaration", - "house-bl", - "master-bl", - "house-awb", - "master-awb", - "bl-instructions", - "ams-instructions", - "cmr-form", - "fcr-form", - "isf-form", - "templated-document", - "invoice", - "quote-document", - "shipping-instructions", - "position-office-notes", - "invoice-body-remarks", - "business-partner-office-notes", - ]); - export type OnlyUsedForEnum = z.infer; - export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; - - /** - * RemarkTemplateResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name Template name - * @property { CommonModels.EditorContentResponseDto } content Template content - * @property { string[] } onlyUsedFor Restrict template usage to specific document types - * @property { boolean } archived - * @property { string } createdById - * @property { RemarkTemplateEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { RemarkTemplateEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const RemarkTemplateResponseDTOSchema = z - .object({ - id: z.string(), - officeId: z.string(), - name: z.string().describe("Template name"), - content: CommonModels.EditorContentResponseDtoSchema.describe("Template content"), - onlyUsedFor: z - .array(OnlyUsedForEnumSchema) - .readonly() - .describe("Restrict template usage to specific document types") - .nullish(), - archived: z.boolean(), - createdById: z.string().nullish(), - createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type RemarkTemplateResponseDTO = z.infer; - - /** - * CreateRemarkTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { CommonModels.EditorContentUpdateDto } content Template content - * @property { OnlyUsedForEnum[] } onlyUsedFor Restrict template usage to specific document types - */ - export const CreateRemarkTemplateRequestDTOSchema = z - .object({ - name: z.string().describe("Template name"), - content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), - onlyUsedFor: z - .array(OnlyUsedForEnumSchema) - .readonly() - .describe("Restrict template usage to specific document types") - .nullish(), - }) - .readonly(); - export type CreateRemarkTemplateRequestDTO = z.infer; - - /** - * UpdateRemarkTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { CommonModels.EditorContentUpdateDto } content Template content - * @property { string[] } onlyUsedFor Restrict template usage to specific document types - * @property { boolean } archived Archive status - */ - export const UpdateRemarkTemplateRequestDTOSchema = z - .object({ - name: z.string().describe("Template name"), - content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), - onlyUsedFor: z - .array(OnlyUsedForEnumSchema) - .readonly() - .describe("Restrict template usage to specific document types"), - archived: z.boolean().describe("Archive status"), - }) - .readonly(); - export type UpdateRemarkTemplateRequestDTO = z.infer; - - /** - * RemarkTemplateFilterDtoSchema - * @type { object } - * @property { boolean } archived - * @property { string } search - * @property { string } onlyUsedFor Filter by document type - */ - export const RemarkTemplateFilterDtoSchema = z - .object({ - archived: z.boolean(), - search: z.string(), - onlyUsedFor: OnlyUsedForEnumSchema.describe("Filter by document type"), - }) - .readonly(); - export type RemarkTemplateFilterDto = z.infer; - - /** - * RemarkTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const RemarkTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type RemarkTemplateLabelFilterDto = z.infer; - - /** - * RemarkTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const RemarkTemplatesPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type RemarkTemplatesPaginateLabelsOrderParamEnum = z.infer< - typeof RemarkTemplatesPaginateLabelsOrderParamEnumSchema - >; - export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPaginateLabelsOrderParamEnumSchema.enum; - - /** - * RemarkTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { RemarkTemplateLabelResponseDTO[] } items - */ - export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type RemarkTemplatesPaginateLabelsResponse = z.infer; - - /** - * RemarkTemplatesListOrderParamEnumSchema - * @type { enum } - */ - export const RemarkTemplatesListOrderParamEnumSchema = z.enum([ - "name", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type RemarkTemplatesListOrderParamEnum = z.infer; - export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEnumSchema.enum; - - /** - * RemarkTemplatesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { RemarkTemplateResponseDTO[] } items - */ - export const RemarkTemplatesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).readonly() }).readonly().shape, - }); - export type RemarkTemplatesListResponse = z.infer; -} diff --git a/test/generated/dist/remarkTemplates/remarkTemplates.queries.ts b/test/generated/dist/remarkTemplates/remarkTemplates.queries.ts deleted file mode 100644 index e169038..0000000 --- a/test/generated/dist/remarkTemplates/remarkTemplates.queries.ts +++ /dev/null @@ -1,420 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; -import { RemarkTemplatesApi } from "./remarkTemplates.api"; - -export namespace RemarkTemplatesQueries { - export const moduleName = QueryModule.RemarkTemplates; - - export const keys = { - all: [moduleName] as const, - paginateLabels: ( - officeId: string, - limit?: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/remark-templates/paginate/labels", - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - paginateLabelsInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/remark-templates/paginate/labels", - "infinite", - officeId, - limit, - order, - filter, - cursor, - ] as const, - list: ( - officeId: string, - limit?: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/offices/:officeId/remark-templates", officeId, limit, order, filter, page, cursor] as const, - listInfinite: ( - officeId: string, - limit?: number, - order?: string, - filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, - cursor?: string, - ) => - [...keys.all, "/offices/:officeId/remark-templates", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => - [...keys.all, "/offices/:officeId/remark-templates/:id", id, officeId] as const, - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate remark template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId })); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate remark template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId })); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useList` - * @summary List remark templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - officeId, - limit, - order, - filter, - page, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: RemarkTemplatesModels.RemarkTemplateFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUseList({ officeId })); - return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List remark templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - officeId, - limit, - order, - filter, - cursor, - }: { - officeId: string; - limit: number; - order?: string; - filter?: RemarkTemplatesModels.RemarkTemplateFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(RemarkTemplatesAcl.canUseList({ officeId })); - return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create a new remark template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof RemarkTemplatesApi.create, - { officeId: string; data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId })); - return RemarkTemplatesApi.create(officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get remark template by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ - export const useFindById = ( - { id, officeId }: { id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId })); - return RemarkTemplatesApi.findById(id, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update remark template by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof RemarkTemplatesApi.update, - { id: string; officeId: string; data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId })); - return RemarkTemplatesApi.update(id, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive remark template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useArchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId })); - return RemarkTemplatesApi.archive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive remark template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUnarchive = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId })); - return RemarkTemplatesApi.unarchive(id, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/roadQuotes/roadQuotes.acl.ts b/test/generated/dist/roadQuotes/roadQuotes.acl.ts deleted file mode 100644 index 599c783..0000000 --- a/test/generated/dist/roadQuotes/roadQuotes.acl.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace RoadQuotesAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get road quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update road quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/roadQuotes/roadQuotes.api.ts b/test/generated/dist/roadQuotes/roadQuotes.api.ts deleted file mode 100644 index 5355e5a..0000000 --- a/test/generated/dist/roadQuotes/roadQuotes.api.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { RoadQuotesModels } from "./roadQuotes.models"; - -export namespace RoadQuotesApi { - export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/road-quote`, - config, - ); - }; - export const update = ( - officeId: string, - quoteId: string, - data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/road-quote`, - ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/roadQuotes/roadQuotes.models.ts b/test/generated/dist/roadQuotes/roadQuotes.models.ts deleted file mode 100644 index f50ac2e..0000000 --- a/test/generated/dist/roadQuotes/roadQuotes.models.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { z } from "zod"; - -export namespace RoadQuotesModels { - /** - * RoadQuoteResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the road quote - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - */ - export const RoadQuoteResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier for the road quote"), - bookingMatchingCode: z.string().describe("Code for matching bookings"), - validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), - validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), - buyServiceContract: z.string().describe("Service contract for buying"), - sellServiceContract: z.string().describe("Service contract for selling"), - }) - .readonly(); - export type RoadQuoteResponseDTO = z.infer; - - /** - * UpdateRoadQuoteRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - */ - export const UpdateRoadQuoteRequestDTOSchema = z - .object({ - bookingMatchingCode: z.string().describe("Code for matching bookings"), - validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), - validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), - buyServiceContract: z.string().describe("Service contract for buying"), - sellServiceContract: z.string().describe("Service contract for selling"), - }) - .readonly(); - export type UpdateRoadQuoteRequestDTO = z.infer; -} diff --git a/test/generated/dist/roadQuotes/roadQuotes.queries.ts b/test/generated/dist/roadQuotes/roadQuotes.queries.ts deleted file mode 100644 index ddd3e83..0000000 --- a/test/generated/dist/roadQuotes/roadQuotes.queries.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { RoadQuotesAcl } from "./roadQuotes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { RoadQuotesModels } from "./roadQuotes.models"; -import { RoadQuotesApi } from "./roadQuotes.api"; - -export namespace RoadQuotesQueries { - export const moduleName = QueryModule.RoadQuotes; - - export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/road-quote", officeId, quoteId] as const, - }; - - /** - * Query `useGet` - * @summary Get road quote by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(RoadQuotesAcl.canUseGet({ officeId })); - return RoadQuotesApi.get(officeId, quoteId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update road quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { RoadQuotesModels.UpdateRoadQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof RoadQuotesApi.update, - { officeId: string; quoteId: string; data: RoadQuotesModels.UpdateRoadQuoteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(RoadQuotesAcl.canUseUpdate({ officeId })); - return RoadQuotesApi.update(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.get(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/seaPositions/seaPositions.acl.ts b/test/generated/dist/seaPositions/seaPositions.acl.ts deleted file mode 100644 index 7b8c6cb..0000000 --- a/test/generated/dist/seaPositions/seaPositions.acl.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace SeaPositionsAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get sea position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Read", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update sea position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Position", object) : "Position"] as AbilityTuple< - "Update", - "Position" | (ForcedSubject<"Position"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/seaPositions/seaPositions.api.ts b/test/generated/dist/seaPositions/seaPositions.api.ts deleted file mode 100644 index e318757..0000000 --- a/test/generated/dist/seaPositions/seaPositions.api.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { SeaPositionsModels } from "./seaPositions.models"; - -export namespace SeaPositionsApi { - export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/sea-position`, - config, - ); - }; - export const update = ( - officeId: string, - positionId: string, - data: SeaPositionsModels.UpdateSeaPositionRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/sea-position`, - ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/seaPositions/seaPositions.models.ts b/test/generated/dist/seaPositions/seaPositions.models.ts deleted file mode 100644 index 738a8c5..0000000 --- a/test/generated/dist/seaPositions/seaPositions.models.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace SeaPositionsModels { - /** - * SeaPositionResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } bookingMatchingCode - * @property { string } houseBillOfLadingNumber - * @property { string } masterBillOfLadingNumber - * @property { boolean } hblRequired - * @property { boolean } mblRequired - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { string } buyServiceContract - * @property { string } sellServiceContract - * @property { string } quoteReference - * @property { string } createdAt - * @property { string } updatedAt - * @property { CommonModels.SeaRoutingEnum } routing - * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route - */ - export const SeaPositionResponseDTOSchema = z - .object({ - id: z.string(), - bookingMatchingCode: z.string().nullish(), - houseBillOfLadingNumber: z.string().nullish(), - masterBillOfLadingNumber: z.string().nullish(), - hblRequired: z.boolean(), - mblRequired: z.boolean(), - blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), - blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), - customsDate: z.iso.datetime({ offset: true }).nullish(), - vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), - buyServiceContract: z.string().nullish(), - sellServiceContract: z.string().nullish(), - quoteReference: z.string().nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - routing: CommonModels.SeaRoutingEnumSchema.nullish(), - defaultBookingNumber: z - .string() - .describe("Default booking number from the port of loading point of the default route") - .nullish(), - }) - .readonly(); - export type SeaPositionResponseDTO = z.infer; - - /** - * UpdateSeaPositionRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode - * @property { string } houseBillOfLadingNumber - * @property { boolean } mblRequired - * @property { boolean } hblRequired - * @property { string } masterBillOfLadingNumber - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { string } buyServiceContract - * @property { string } quoteReference - * @property { string } sellServiceContract - * @property { CommonModels.SeaRoutingEnum } routing - */ - export const UpdateSeaPositionRequestDTOSchema = z - .object({ - bookingMatchingCode: z.string(), - houseBillOfLadingNumber: z.string(), - mblRequired: z.boolean(), - hblRequired: z.boolean(), - masterBillOfLadingNumber: z.string(), - blfromCostumerDate: z.iso.datetime({ offset: true }), - blfromCarrierDate: z.iso.datetime({ offset: true }), - customsDate: z.iso.datetime({ offset: true }), - vgmCustomerDate: z.iso.datetime({ offset: true }), - buyServiceContract: z.string(), - quoteReference: z.string(), - sellServiceContract: z.string(), - routing: CommonModels.SeaRoutingEnumSchema, - }) - .readonly(); - export type UpdateSeaPositionRequestDTO = z.infer; -} diff --git a/test/generated/dist/seaPositions/seaPositions.queries.ts b/test/generated/dist/seaPositions/seaPositions.queries.ts deleted file mode 100644 index f562c59..0000000 --- a/test/generated/dist/seaPositions/seaPositions.queries.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { SeaPositionsAcl } from "./seaPositions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { SeaPositionsModels } from "./seaPositions.models"; -import { SeaPositionsApi } from "./seaPositions.api"; - -export namespace SeaPositionsQueries { - export const moduleName = QueryModule.SeaPositions; - - export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/sea-position", officeId, positionId] as const, - }; - - /** - * Query `useGet` - * @summary Get sea position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, positionId }: { officeId: string; positionId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(SeaPositionsAcl.canUseGet({ officeId })); - return SeaPositionsApi.get(officeId, positionId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update sea position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { SeaPositionsModels.UpdateSeaPositionRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof SeaPositionsApi.update, - { officeId: string; positionId: string; data: SeaPositionsModels.UpdateSeaPositionRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(SeaPositionsAcl.canUseUpdate({ officeId })); - return SeaPositionsApi.update(officeId, positionId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/seaQuotes/seaQuotes.acl.ts b/test/generated/dist/seaQuotes/seaQuotes.acl.ts deleted file mode 100644 index 4841eaf..0000000 --- a/test/generated/dist/seaQuotes/seaQuotes.acl.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace SeaQuotesAcl { - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get sea quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - ["Read", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Read", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update sea quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - ["Update", object ? subject("Quote", object) : "Quote"] as AbilityTuple< - "Update", - "Quote" | (ForcedSubject<"Quote"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/seaQuotes/seaQuotes.api.ts b/test/generated/dist/seaQuotes/seaQuotes.api.ts deleted file mode 100644 index f5efa61..0000000 --- a/test/generated/dist/seaQuotes/seaQuotes.api.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { SeaQuotesModels } from "./seaQuotes.models"; - -export namespace SeaQuotesApi { - export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - config, - ); - }; - export const update = ( - officeId: string, - quoteId: string, - data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/seaQuotes/seaQuotes.models.ts b/test/generated/dist/seaQuotes/seaQuotes.models.ts deleted file mode 100644 index f5b1795..0000000 --- a/test/generated/dist/seaQuotes/seaQuotes.models.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace SeaQuotesModels { - /** - * SeaQuoteResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the sea quote - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - * @property { CommonModels.SeaRoutingEnum } routing - * @property { boolean } splitRoute Indicates if the route is split - */ - export const SeaQuoteResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier for the sea quote"), - bookingMatchingCode: z.string().describe("Code for matching bookings"), - validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), - validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), - buyServiceContract: z.string().describe("Service contract for buying"), - sellServiceContract: z.string().describe("Service contract for selling"), - routing: CommonModels.SeaRoutingEnumSchema.nullish(), - splitRoute: z.boolean().describe("Indicates if the route is split").nullish(), - }) - .readonly(); - export type SeaQuoteResponseDTO = z.infer; - - /** - * UpdateSeaQuoteRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - * @property { CommonModels.SeaRoutingEnum } routing - */ - export const UpdateSeaQuoteRequestDTOSchema = z - .object({ - bookingMatchingCode: z.string().describe("Code for matching bookings"), - validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), - validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), - buyServiceContract: z.string().describe("Service contract for buying"), - sellServiceContract: z.string().describe("Service contract for selling"), - routing: CommonModels.SeaRoutingEnumSchema, - }) - .readonly(); - export type UpdateSeaQuoteRequestDTO = z.infer; -} diff --git a/test/generated/dist/seaQuotes/seaQuotes.queries.ts b/test/generated/dist/seaQuotes/seaQuotes.queries.ts deleted file mode 100644 index f147e95..0000000 --- a/test/generated/dist/seaQuotes/seaQuotes.queries.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { SeaQuotesAcl } from "./seaQuotes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { SeaQuotesModels } from "./seaQuotes.models"; -import { SeaQuotesApi } from "./seaQuotes.api"; - -export namespace SeaQuotesQueries { - export const moduleName = QueryModule.SeaQuotes; - - export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => - [...keys.all, "/offices/:officeId/quotes/:quoteId/sea-quote", officeId, quoteId] as const, - }; - - /** - * Query `useGet` - * @summary Get sea quote by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, quoteId }: { officeId: string; quoteId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(SeaQuotesAcl.canUseGet({ officeId })); - return SeaQuotesApi.get(officeId, quoteId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update sea quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { SeaQuotesModels.UpdateSeaQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof SeaQuotesApi.update, - { officeId: string; quoteId: string; data: SeaQuotesModels.UpdateSeaQuoteRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(SeaQuotesAcl.canUseUpdate({ officeId })); - return SeaQuotesApi.update(officeId, quoteId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.get(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/shippingInstructions/shippingInstructions.acl.ts b/test/generated/dist/shippingInstructions/shippingInstructions.acl.ts deleted file mode 100644 index b0dc4c8..0000000 --- a/test/generated/dist/shippingInstructions/shippingInstructions.acl.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ShippingInstructionsAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Create", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Create", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ - export const canUseGet = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `useDeleteOfficesPositionsShippingInstructionsById` mutation ability. For global ability, omit the object parameter. - * @description Delete shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsShippingInstructionsById` mutation - */ - export const canUseDeleteOfficesPositionsShippingInstructionsById = (object?: { officeId: string }) => - [ - "Delete", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Delete", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `usePreview` query or `usePreviewMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreview` query or `usePreviewMutation` mutation - */ - export const canUsePreview = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ - export const canUseGenerate = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/shippingInstructions/shippingInstructions.api.ts b/test/generated/dist/shippingInstructions/shippingInstructions.api.ts deleted file mode 100644 index 174b260..0000000 --- a/test/generated/dist/shippingInstructions/shippingInstructions.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ShippingInstructionsModels } from "./shippingInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ShippingInstructionsApi { - export const create = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions`, - undefined, - config, - ); - }; - export const get = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - config, - ); - }; - export const update = ( - officeId: string, - positionId: string, - id: string, - data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), - config, - ); - }; - export const deleteOfficesPositionsShippingInstructionsById = ( - officeId: string, - positionId: string, - id: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - undefined, - config, - ); - }; - export const preview = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generate = ( - officeId: string, - positionId: string, - id: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/shippingInstructions/shippingInstructions.models.ts b/test/generated/dist/shippingInstructions/shippingInstructions.models.ts deleted file mode 100644 index 50182eb..0000000 --- a/test/generated/dist/shippingInstructions/shippingInstructions.models.ts +++ /dev/null @@ -1,847 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ShippingInstructionsModels { - /** - * EnsDeclarationEnumSchema - * @type { enum } - * @description ENS declaration - */ - export const EnsDeclarationEnumSchema = z.enum(["Carrier", "Self"]); - export type EnsDeclarationEnum = z.infer; - export const EnsDeclarationEnum = EnsDeclarationEnumSchema.enum; - - /** - * IssuedHouseBillsEnumSchema - * @type { enum } - * @description Issued house bills - */ - export const IssuedHouseBillsEnumSchema = z.enum(["None", "One", "Multiple"]); - export type IssuedHouseBillsEnum = z.infer; - export const IssuedHouseBillsEnum = IssuedHouseBillsEnumSchema.enum; - - /** - * WoodDeclarationEnumSchema - * @type { enum } - * @description Wood declaration - */ - export const WoodDeclarationEnumSchema = z.enum([ - "NoWood", - "TreatedAndCertified", - "NotTreatedAndNotCertified", - "Processed", - ]); - export type WoodDeclarationEnum = z.infer; - export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; - - /** - * ShippingInstructionsPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } addressLine1 - * @property { string } addressLine2 - * @property { string } city - * @property { string } postalCode - * @property { string } state - * @property { string } countryCode - * @property { string } contactName - * @property { string } contactPhone - * @property { string } contactEmail - */ - export const ShippingInstructionsPartnerResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - addressLine1: z.string(), - addressLine2: z.string(), - city: z.string(), - postalCode: z.string(), - state: z.string(), - countryCode: z.string(), - contactName: z.string(), - contactPhone: z.string(), - contactEmail: z.string(), - }) - .readonly(); - export type ShippingInstructionsPartnerResponseDto = z.infer; - - /** - * ShippingInstructionsGeneralDetailsDtoSchema - * @type { object } - * @property { ShippingInstructionsPartnerResponseDto } shipper - * @property { ShippingInstructionsPartnerResponseDto } consignee - * @property { ShippingInstructionsPartnerResponseDto } freightForwarder - * @property { ShippingInstructionsPartnerResponseDto } notifyParty - * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty1 - * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty2 - * @property { ShippingInstructionsPartnerResponseDto } contractParty - * @property { ShippingInstructionsPartnerResponseDto } manufacturer - * @property { ShippingInstructionsPartnerResponseDto } consolidator - * @property { ShippingInstructionsPartnerResponseDto } importer - * @property { ShippingInstructionsPartnerResponseDto } warehouseKeeper - */ - export const ShippingInstructionsGeneralDetailsDtoSchema = z - .object({ - shipper: ShippingInstructionsPartnerResponseDtoSchema, - consignee: ShippingInstructionsPartnerResponseDtoSchema, - freightForwarder: ShippingInstructionsPartnerResponseDtoSchema, - notifyParty: ShippingInstructionsPartnerResponseDtoSchema, - additionalNotifyParty1: ShippingInstructionsPartnerResponseDtoSchema, - additionalNotifyParty2: ShippingInstructionsPartnerResponseDtoSchema, - contractParty: ShippingInstructionsPartnerResponseDtoSchema, - manufacturer: ShippingInstructionsPartnerResponseDtoSchema, - consolidator: ShippingInstructionsPartnerResponseDtoSchema, - importer: ShippingInstructionsPartnerResponseDtoSchema, - warehouseKeeper: ShippingInstructionsPartnerResponseDtoSchema, - }) - .readonly(); - export type ShippingInstructionsGeneralDetailsDto = z.infer; - - /** - * ShippingInstructionsLocationResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } code - * @property { string } countryCode - * @property { string } eta - * @property { string } vessel - * @property { string } voyage - */ - export const ShippingInstructionsLocationResponseDtoSchema = z - .object({ - id: z.string(), - name: z.string(), - code: z.string(), - countryCode: z.string(), - eta: z.iso.datetime({ offset: true }), - vessel: z.string(), - voyage: z.string(), - }) - .readonly(); - export type ShippingInstructionsLocationResponseDto = z.infer; - - /** - * SIMoveTypeEnumSchema - * @type { enum } - */ - export const SIMoveTypeEnumSchema = z.enum(["DoorToDoor", "DoorToPort", "PortToDoor", "PortToPort"]); - export type SIMoveTypeEnum = z.infer; - export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; - - /** - * ShippingInstructionsTransportDtoSchema - * @type { object } - * @property { string } vessel - * @property { string } voyage - * @property { string } imo - * @property { ShippingInstructionsLocationResponseDto } placeOfReceipt - * @property { ShippingInstructionsLocationResponseDto } portOfLoading - * @property { ShippingInstructionsLocationResponseDto } portOfDischarge - * @property { ShippingInstructionsLocationResponseDto } placeOfDelivery - * @property { SIMoveTypeEnum } moveType - * @property { string } shipmentType - */ - export const ShippingInstructionsTransportDtoSchema = z - .object({ - vessel: z.string(), - voyage: z.string(), - imo: z.string(), - placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema, - portOfLoading: ShippingInstructionsLocationResponseDtoSchema, - portOfDischarge: ShippingInstructionsLocationResponseDtoSchema, - placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema, - moveType: SIMoveTypeEnumSchema, - shipmentType: z.string(), - }) - .readonly(); - export type ShippingInstructionsTransportDto = z.infer; - - /** - * ShippingInstructionsHazardousDtoSchema - * @type { object } - * @property { string } IMOClass - * @property { string } UNDGNumber - * @property { string } contact - */ - export const ShippingInstructionsHazardousDtoSchema = z - .object({ IMOClass: z.string(), UNDGNumber: z.string(), contact: z.string() }) - .readonly(); - export type ShippingInstructionsHazardousDto = z.infer; - - /** - * ShippingInstructionsPackageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { number } quantity - * @property { string } packageType - * @property { string } packageTypeDescription - * @property { string } packageDescription - * @property { string } hsCode - * @property { number } volume - * @property { number } grossWeight - * @property { string } caseMarks - * @property { ShippingInstructionsHazardousDto } hazardous - * @property { string } ncmCodes - * @property { string } cusCode - */ - export const ShippingInstructionsPackageResponseDtoSchema = z - .object({ - id: z.string(), - quantity: z.number(), - packageType: z.string(), - packageTypeDescription: z.string(), - packageDescription: z.string(), - hsCode: z.string(), - volume: z.number(), - grossWeight: z.number(), - caseMarks: z.string(), - hazardous: ShippingInstructionsHazardousDtoSchema, - ncmCodes: z.string(), - cusCode: z.string(), - }) - .readonly(); - export type ShippingInstructionsPackageResponseDto = z.infer; - - /** - * ShippingInstructionsCargoResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } transportUnitNumber - * @property { string } transportUnitType - * @property { string } transportUnitDescription - * @property { string } containerSupplier - * @property { number } grossWeight - * @property { number } tare - * @property { number } volume - * @property { string } seal1 - * @property { string } seal2 - * @property { string } woodDeclaration - * @property { ShippingInstructionsPackageResponseDto[] } packages - */ - export const ShippingInstructionsCargoResponseDtoSchema = z - .object({ - id: z.string().nullish(), - transportUnitNumber: z.string().nullish(), - transportUnitType: z.string().nullish(), - transportUnitDescription: z.string().nullish(), - containerSupplier: z.string().nullish(), - grossWeight: z.number().nullish(), - tare: z.number().nullish(), - volume: z.number().nullish(), - seal1: z.string().nullish(), - seal2: z.string().nullish(), - woodDeclaration: WoodDeclarationEnumSchema.nullish(), - packages: z.array(ShippingInstructionsPackageResponseDtoSchema).readonly(), - }) - .readonly(); - export type ShippingInstructionsCargoResponseDto = z.infer; - - /** - * ShippingInstructionsHeaderDtoSchema - * @type { object } - * @property { string } name - * @property { string } nameSuffix - * @property { number } versionNumber - * @property { string } shippingInstructionNumber - * @property { string } carrierScac - * @property { string } carrierBookingNumber - */ - export const ShippingInstructionsHeaderDtoSchema = z - .object({ - name: z.string(), - nameSuffix: z.string().nullish(), - versionNumber: z.number(), - shippingInstructionNumber: z.string().nullish(), - carrierScac: z.string().nullish(), - carrierBookingNumber: z.string().nullish(), - }) - .readonly(); - export type ShippingInstructionsHeaderDto = z.infer; - - /** - * ShippingInstructionsReferencesDtoSchema - * @type { object } - * @property { string } shipperReference - * @property { string } forwarderReference - * @property { string } transactionReferenceNumber - * @property { string } blReferenceNumber - * @property { string } uniqueConsignmentReference - * @property { string } purchaseOrderNumber - * @property { string } contractReferenceNumber - * @property { string } rucNumber - * @property { string } consigneeOrderNumber - * @property { string } invoiceReferenceNumber - * @property { string } letterOfCreditReference - * @property { string } customsHouseBrokerReference - * @property { string } fmcNumber - * @property { string } exportLicenseNumber - */ - export const ShippingInstructionsReferencesDtoSchema = z - .object({ - shipperReference: z.string(), - forwarderReference: z.string(), - transactionReferenceNumber: z.string(), - blReferenceNumber: z.string(), - uniqueConsignmentReference: z.string(), - purchaseOrderNumber: z.string(), - contractReferenceNumber: z.string(), - rucNumber: z.string(), - consigneeOrderNumber: z.string(), - invoiceReferenceNumber: z.string(), - letterOfCreditReference: z.string(), - customsHouseBrokerReference: z.string(), - fmcNumber: z.string(), - exportLicenseNumber: z.string(), - }) - .readonly(); - export type ShippingInstructionsReferencesDto = z.infer; - - /** - * ShippingInstructionsCustomsComplianceDtoSchema - * @type { object } - * @property { string } shipperTaxId - * @property { string } shipperEORI - * @property { string } consigneeTaxId - * @property { string } consigneeEORI - * @property { string } notifyPartyTaxId - * @property { string } notifyPartyEORI - */ - export const ShippingInstructionsCustomsComplianceDtoSchema = z - .object({ - shipperTaxId: z.string(), - shipperEORI: z.string(), - consigneeTaxId: z.string(), - consigneeEORI: z.string(), - notifyPartyTaxId: z.string(), - notifyPartyEORI: z.string(), - }) - .readonly(); - export type ShippingInstructionsCustomsComplianceDto = z.infer; - - /** - * ShippingInstructionsIcs2DtoSchema - * @type { object } - * @property { boolean } goodsDeliveredInEu - * @property { string } ensDeclaration - * @property { string } issuedHouseBills - */ - export const ShippingInstructionsIcs2DtoSchema = z - .object({ - goodsDeliveredInEu: z.boolean(), - ensDeclaration: EnsDeclarationEnumSchema, - issuedHouseBills: IssuedHouseBillsEnumSchema, - }) - .readonly(); - export type ShippingInstructionsIcs2Dto = z.infer; - - /** - * ShippingInstructionsCargoIdentificationNumbersDtoSchema - * @type { object } - * @property { string } PCINNumber - * @property { string } CSNNumber - * @property { string } MCINNumber - */ - export const ShippingInstructionsCargoIdentificationNumbersDtoSchema = z - .object({ PCINNumber: z.string(), CSNNumber: z.string(), MCINNumber: z.string() }) - .readonly(); - export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer< - typeof ShippingInstructionsCargoIdentificationNumbersDtoSchema - >; - - /** - * ShippingInstructionsControlTotalsDtoSchema - * @type { object } - * @property { number } totalNumberOfContainers - * @property { number } totalNumberOfPackages - * @property { number } totalShipmentWeight - * @property { number } totalShipmentVolume - */ - export const ShippingInstructionsControlTotalsDtoSchema = z - .object({ - totalNumberOfContainers: z.number(), - totalNumberOfPackages: z.number(), - totalShipmentWeight: z.number(), - totalShipmentVolume: z.number(), - }) - .readonly(); - export type ShippingInstructionsControlTotalsDto = z.infer; - - /** - * FreightChargesDtoSchema - * @type { object } - * @property { string } freightPayer - * @property { string } freightTerm - */ - export const FreightChargesDtoSchema = z - .object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }) - .readonly(); - export type FreightChargesDto = z.infer; - - /** - * ShippingInstructionsShippersDeclaredValueDtoSchema - * @type { object } - * @property { string } currency - * @property { number } shipperDeclaredValue - */ - export const ShippingInstructionsShippersDeclaredValueDtoSchema = z - .object({ currency: z.string(), shipperDeclaredValue: z.number() }) - .readonly(); - export type ShippingInstructionsShippersDeclaredValueDto = z.infer< - typeof ShippingInstructionsShippersDeclaredValueDtoSchema - >; - - /** - * ShippingInstructionsNotificationEmailsDtoSchema - * @type { object } - * @property { string } siRequestorEmails - */ - export const ShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string() }).readonly(); - export type ShippingInstructionsNotificationEmailsDto = z.infer< - typeof ShippingInstructionsNotificationEmailsDtoSchema - >; - - /** - * ShippingInstructionsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } name - * @property { string } nameSuffix - * @property { string } date - * @property { string } createdAt - * @property { string } updatedAt - * @property { number } versionNumber - * @property { ShippingInstructionsHeaderDto } header - * @property { ShippingInstructionsGeneralDetailsDto } generalDetails - * @property { ShippingInstructionsReferencesDto } references - * @property { ShippingInstructionsTransportDto } transport - * @property { ShippingInstructionsCustomsComplianceDto } customsCompliance - * @property { ShippingInstructionsIcs2Dto } ics2 - * @property { ShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers - * @property { ShippingInstructionsCargoResponseDto[] } cargo - * @property { ShippingInstructionsControlTotalsDto } controlTotals - * @property { FreightChargesDto } freightCharges - * @property { ShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue - * @property { ShippingInstructionsNotificationEmailsDto } notificationEmails - * @property { string } defaultFileName - */ - export const ShippingInstructionsResponseDtoSchema = z - .object({ - id: z.string(), - positionId: z.string(), - name: z.string(), - nameSuffix: z.string().nullish(), - date: z.iso.datetime({ offset: true }).nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - versionNumber: z.number(), - header: ShippingInstructionsHeaderDtoSchema, - generalDetails: ShippingInstructionsGeneralDetailsDtoSchema, - references: ShippingInstructionsReferencesDtoSchema, - transport: ShippingInstructionsTransportDtoSchema, - customsCompliance: ShippingInstructionsCustomsComplianceDtoSchema, - ics2: ShippingInstructionsIcs2DtoSchema, - cargoIdentificationNumbers: ShippingInstructionsCargoIdentificationNumbersDtoSchema, - cargo: z.array(ShippingInstructionsCargoResponseDtoSchema).readonly().nullish(), - controlTotals: ShippingInstructionsControlTotalsDtoSchema, - freightCharges: FreightChargesDtoSchema, - shippersDeclaredValue: ShippingInstructionsShippersDeclaredValueDtoSchema, - notificationEmails: ShippingInstructionsNotificationEmailsDtoSchema, - defaultFileName: z.string(), - }) - .readonly(); - export type ShippingInstructionsResponseDto = z.infer; - - /** - * UpdateShippingInstructionsPartnerDtoSchema - * @type { object } - * @property { string } id Partner id - * @property { string } name Partner name - * @property { string } addressLine1 Address line 1 - * @property { string } addressLine2 Address line 2 - * @property { string } city City - * @property { string } postalCode Postal code - * @property { string } state State - * @property { string } countryCode Country code - * @property { string } taxId Tax ID - * @property { string } contactName Contact name - * @property { string } contactPhone Contact phone - * @property { string } contactEmail Contact email - */ - export const UpdateShippingInstructionsPartnerDtoSchema = z - .object({ - id: z.string().describe("Partner id"), - name: z.string().describe("Partner name"), - addressLine1: z.string().describe("Address line 1"), - addressLine2: z.string().describe("Address line 2"), - city: z.string().describe("City"), - postalCode: z.string().describe("Postal code"), - state: z.string().describe("State"), - countryCode: z.string().describe("Country code"), - taxId: z.string().describe("Tax ID"), - contactName: z.string().describe("Contact name"), - contactPhone: z.string().describe("Contact phone"), - contactEmail: z.string().describe("Contact email"), - }) - .readonly(); - export type UpdateShippingInstructionsPartnerDto = z.infer; - - /** - * UpdateShippingInstructionsGeneralDetailsDtoSchema - * @type { object } - * @property { UpdateShippingInstructionsPartnerDto } shipper Shipper - * @property { UpdateShippingInstructionsPartnerDto } consignee Consignee - * @property { UpdateShippingInstructionsPartnerDto } freightForwarder Freight forwarder - * @property { UpdateShippingInstructionsPartnerDto } notifyParty Notify party - * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty1 Additional notify party 1 - * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty2 Additional notify party 2 - * @property { UpdateShippingInstructionsPartnerDto } contractParty Contract party - * @property { UpdateShippingInstructionsPartnerDto } manufacturer Manufacturer - * @property { UpdateShippingInstructionsPartnerDto } consolidator Consolidator - * @property { UpdateShippingInstructionsPartnerDto } importer Importer - * @property { UpdateShippingInstructionsPartnerDto } warehouseKeeper Warehouse keeper - */ - export const UpdateShippingInstructionsGeneralDetailsDtoSchema = z - .object({ - shipper: UpdateShippingInstructionsPartnerDtoSchema.describe("Shipper"), - consignee: UpdateShippingInstructionsPartnerDtoSchema.describe("Consignee"), - freightForwarder: UpdateShippingInstructionsPartnerDtoSchema.describe("Freight forwarder"), - notifyParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Notify party"), - additionalNotifyParty1: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 1"), - additionalNotifyParty2: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 2"), - contractParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Contract party"), - manufacturer: UpdateShippingInstructionsPartnerDtoSchema.describe("Manufacturer"), - consolidator: UpdateShippingInstructionsPartnerDtoSchema.describe("Consolidator"), - importer: UpdateShippingInstructionsPartnerDtoSchema.describe("Importer"), - warehouseKeeper: UpdateShippingInstructionsPartnerDtoSchema.describe("Warehouse keeper"), - }) - .readonly(); - export type UpdateShippingInstructionsGeneralDetailsDto = z.infer< - typeof UpdateShippingInstructionsGeneralDetailsDtoSchema - >; - - /** - * UpdateShippingInstructionsLocationDtoSchema - * @type { object } - * @property { string } id Location id - * @property { string } name Location name - * @property { string } code Location code - * @property { string } countryCode Country code - */ - export const UpdateShippingInstructionsLocationDtoSchema = z - .object({ - id: z.string().describe("Location id"), - name: z.string().describe("Location name"), - code: z.string().describe("Location code"), - countryCode: z.string().describe("Country code"), - }) - .readonly(); - export type UpdateShippingInstructionsLocationDto = z.infer; - - /** - * UpdateShippingInstructionsTransportDtoSchema - * @type { object } - * @property { string } vessel Vessel - * @property { string } voyage Voyage - * @property { string } imo IMO - * @property { UpdateShippingInstructionsLocationDto } placeOfReceipt Place of receipt - * @property { UpdateShippingInstructionsLocationDto } portOfLoading Port of loading - * @property { UpdateShippingInstructionsLocationDto } portOfDischarge Port of discharge - * @property { UpdateShippingInstructionsLocationDto } placeOfDelivery Place of delivery - * @property { SIMoveTypeEnum } moveType Move type - * @property { string } shipmentType Shipment type - */ - export const UpdateShippingInstructionsTransportDtoSchema = z - .object({ - vessel: z.string().describe("Vessel"), - voyage: z.string().describe("Voyage"), - imo: z.string().describe("IMO"), - placeOfReceipt: UpdateShippingInstructionsLocationDtoSchema.describe("Place of receipt"), - portOfLoading: UpdateShippingInstructionsLocationDtoSchema.describe("Port of loading"), - portOfDischarge: UpdateShippingInstructionsLocationDtoSchema.describe("Port of discharge"), - placeOfDelivery: UpdateShippingInstructionsLocationDtoSchema.describe("Place of delivery"), - moveType: SIMoveTypeEnumSchema.describe("Move type"), - shipmentType: z.string().describe("Shipment type"), - }) - .readonly(); - export type UpdateShippingInstructionsTransportDto = z.infer; - - /** - * UpdateShippingInstructionsHazardousDtoSchema - * @type { object } - * @property { string } IMOClass IMO class - * @property { string } UNDGNumber UNDG number - * @property { string } contact Contact - */ - export const UpdateShippingInstructionsHazardousDtoSchema = z - .object({ - IMOClass: z.string().describe("IMO class"), - UNDGNumber: z.string().describe("UNDG number"), - contact: z.string().describe("Contact"), - }) - .readonly(); - export type UpdateShippingInstructionsHazardousDto = z.infer; - - /** - * UpdateShippingInstructionsPackageDtoSchema - * @type { object } - * @property { string } id Package id - * @property { number } quantity Quantity - * @property { string } packageType Package type - * @property { string } packageTypeDescription Package type description - * @property { string } packageDescription Package description - * @property { string } hsCode HS code - * @property { number } volume Volume - * @property { number } grossWeight Gross weight - * @property { string } caseMarks Case marks - * @property { UpdateShippingInstructionsHazardousDto } hazardous Hazardous - * @property { string } ncmCodes NCM codes - * @property { string } cusCode CUS code - */ - export const UpdateShippingInstructionsPackageDtoSchema = z - .object({ - id: z.string().describe("Package id"), - quantity: z.number().describe("Quantity"), - packageType: z.string().describe("Package type"), - packageTypeDescription: z.string().describe("Package type description"), - packageDescription: z.string().describe("Package description"), - hsCode: z.string().describe("HS code"), - volume: z.number().describe("Volume"), - grossWeight: z.number().describe("Gross weight"), - caseMarks: z.string().describe("Case marks"), - hazardous: UpdateShippingInstructionsHazardousDtoSchema.describe("Hazardous"), - ncmCodes: z.string().describe("NCM codes"), - cusCode: z.string().describe("CUS code"), - }) - .readonly(); - export type UpdateShippingInstructionsPackageDto = z.infer; - - /** - * UpdateShippingInstructionsCargoDtoSchema - * @type { object } - * @property { string } id Cargo id - * @property { string } transportUnitNumber Transport unit number - * @property { string } transportUnitType Transport unit type - * @property { string } transportUnitDescription Transport unit description - * @property { string } containerSupplier Container supplier - * @property { number } grossWeight Gross weight - * @property { number } tare Tare - * @property { number } volume Volume - * @property { string } seal1 Seal 1 - * @property { string } seal2 Seal 2 - * @property { string } woodDeclaration Wood declaration - * @property { UpdateShippingInstructionsPackageDto[] } packages Packages - */ - export const UpdateShippingInstructionsCargoDtoSchema = z - .object({ - id: z.string().describe("Cargo id"), - transportUnitNumber: z.string().describe("Transport unit number"), - transportUnitType: z.string().describe("Transport unit type"), - transportUnitDescription: z.string().describe("Transport unit description"), - containerSupplier: z.string().describe("Container supplier"), - grossWeight: z.number().describe("Gross weight"), - tare: z.number().describe("Tare"), - volume: z.number().describe("Volume"), - seal1: z.string().describe("Seal 1"), - seal2: z.string().describe("Seal 2"), - woodDeclaration: WoodDeclarationEnumSchema.describe("Wood declaration"), - packages: z.array(UpdateShippingInstructionsPackageDtoSchema).readonly().describe("Packages"), - }) - .readonly(); - export type UpdateShippingInstructionsCargoDto = z.infer; - - /** - * UpdateShippingInstructionsHeaderDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } nameSuffix Name suffix - * @property { number } versionNumber Version number - * @property { string } shippingInstructionNumber Shipping instruction number - * @property { string } carrierScac Carrier SCAC - * @property { string } carrierBookingNumber Carrier booking number - */ - export const UpdateShippingInstructionsHeaderDtoSchema = z - .object({ - name: z.string().describe("Name"), - nameSuffix: z.string().describe("Name suffix"), - versionNumber: z.number().describe("Version number"), - shippingInstructionNumber: z.string().describe("Shipping instruction number"), - carrierScac: z.string().describe("Carrier SCAC"), - carrierBookingNumber: z.string().describe("Carrier booking number"), - }) - .readonly(); - export type UpdateShippingInstructionsHeaderDto = z.infer; - - /** - * UpdateShippingInstructionsReferencesDtoSchema - * @type { object } - * @property { string } shipperReference Shipper reference - * @property { string } forwarderReference Forwarder reference - * @property { string } transactionReferenceNumber Transaction reference number - * @property { string } blReferenceNumber BL reference number - * @property { string } uniqueConsignmentReference Unique consignment reference - * @property { string } purchaseOrderNumber Purchase order number - * @property { string } contractReferenceNumber Contract reference number - * @property { string } rucNumber RUC number - * @property { string } consigneeOrderNumber Consignee order number - * @property { string } invoiceReferenceNumber Invoice reference number - * @property { string } letterOfCreditReference Letter of credit reference - * @property { string } customsHouseBrokerReference Customs house broker reference - * @property { string } fmcNumber FMC number - * @property { string } exportLicenseNumber Export license number - */ - export const UpdateShippingInstructionsReferencesDtoSchema = z - .object({ - shipperReference: z.string().describe("Shipper reference"), - forwarderReference: z.string().describe("Forwarder reference"), - transactionReferenceNumber: z.string().describe("Transaction reference number"), - blReferenceNumber: z.string().describe("BL reference number"), - uniqueConsignmentReference: z.string().describe("Unique consignment reference"), - purchaseOrderNumber: z.string().describe("Purchase order number"), - contractReferenceNumber: z.string().describe("Contract reference number"), - rucNumber: z.string().describe("RUC number"), - consigneeOrderNumber: z.string().describe("Consignee order number"), - invoiceReferenceNumber: z.string().describe("Invoice reference number"), - letterOfCreditReference: z.string().describe("Letter of credit reference"), - customsHouseBrokerReference: z.string().describe("Customs house broker reference"), - fmcNumber: z.string().describe("FMC number"), - exportLicenseNumber: z.string().describe("Export license number"), - }) - .readonly(); - export type UpdateShippingInstructionsReferencesDto = z.infer; - - /** - * UpdateShippingInstructionsCustomsComplianceDtoSchema - * @type { object } - * @property { string } shipperTaxId Shipper tax ID - * @property { string } shipperEORI Shipper EORI - * @property { string } consigneeTaxId Consignee tax ID - * @property { string } consigneeEORI Consignee EORI - * @property { string } notifyPartyTaxId Notify party tax ID - * @property { string } notifyPartyEORI Notify party EORI - */ - export const UpdateShippingInstructionsCustomsComplianceDtoSchema = z - .object({ - shipperTaxId: z.string().describe("Shipper tax ID"), - shipperEORI: z.string().describe("Shipper EORI"), - consigneeTaxId: z.string().describe("Consignee tax ID"), - consigneeEORI: z.string().describe("Consignee EORI"), - notifyPartyTaxId: z.string().describe("Notify party tax ID"), - notifyPartyEORI: z.string().describe("Notify party EORI"), - }) - .readonly(); - export type UpdateShippingInstructionsCustomsComplianceDto = z.infer< - typeof UpdateShippingInstructionsCustomsComplianceDtoSchema - >; - - /** - * UpdateShippingInstructionsIcs2DtoSchema - * @type { object } - * @property { boolean } goodsDeliveredInEu Goods delivered in EU - * @property { string } ensDeclaration ENS declaration - * @property { string } issuedHouseBills Issued house bills - */ - export const UpdateShippingInstructionsIcs2DtoSchema = z - .object({ - goodsDeliveredInEu: z.boolean().describe("Goods delivered in EU"), - ensDeclaration: EnsDeclarationEnumSchema.describe("ENS declaration"), - issuedHouseBills: IssuedHouseBillsEnumSchema.describe("Issued house bills"), - }) - .readonly(); - export type UpdateShippingInstructionsIcs2Dto = z.infer; - - /** - * UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema - * @type { object } - * @property { string } PCINNumber PCIN number - * @property { string } CSNNumber CSN number - * @property { string } MCINNumber MCIN number - */ - export const UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema = z - .object({ - PCINNumber: z.string().describe("PCIN number"), - CSNNumber: z.string().describe("CSN number"), - MCINNumber: z.string().describe("MCIN number"), - }) - .readonly(); - export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer< - typeof UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema - >; - - /** - * UpdateFreightChargesDtoSchema - * @type { object } - * @property { string } freightPayer - * @property { string } freightTerm - */ - export const UpdateFreightChargesDtoSchema = z - .object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }) - .readonly(); - export type UpdateFreightChargesDto = z.infer; - - /** - * UpdateShippingInstructionsShippersDeclaredValueDtoSchema - * @type { object } - * @property { string } currency Currency - * @property { number } shipperDeclaredValue Shipper declared value - */ - export const UpdateShippingInstructionsShippersDeclaredValueDtoSchema = z - .object({ - currency: z.string().describe("Currency"), - shipperDeclaredValue: z.number().describe("Shipper declared value"), - }) - .readonly(); - export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer< - typeof UpdateShippingInstructionsShippersDeclaredValueDtoSchema - >; - - /** - * UpdateShippingInstructionsNotificationEmailsDtoSchema - * @type { object } - * @property { string } siRequestorEmails SI requestor emails - */ - export const UpdateShippingInstructionsNotificationEmailsDtoSchema = z - .object({ siRequestorEmails: z.string().describe("SI requestor emails") }) - .readonly(); - export type UpdateShippingInstructionsNotificationEmailsDto = z.infer< - typeof UpdateShippingInstructionsNotificationEmailsDtoSchema - >; - - /** - * UpdateShippingInstructionsRequestDtoSchema - * @type { object } - * @property { string } date Date - * @property { UpdateShippingInstructionsHeaderDto } header Header - * @property { UpdateShippingInstructionsGeneralDetailsDto } generalDetails General details - * @property { UpdateShippingInstructionsReferencesDto } references References - * @property { UpdateShippingInstructionsTransportDto } transport Transport - * @property { UpdateShippingInstructionsCustomsComplianceDto } customsCompliance Customs compliance - * @property { UpdateShippingInstructionsIcs2Dto } ics2 ICS2 - * @property { UpdateShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers Cargo identification numbers - * @property { UpdateShippingInstructionsCargoDto[] } cargo Cargo - * @property { UpdateFreightChargesDto } freightCharges - * @property { UpdateShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue Shipper's declared value - * @property { UpdateShippingInstructionsNotificationEmailsDto } notificationEmails Notification emails - */ - export const UpdateShippingInstructionsRequestDtoSchema = z - .object({ - date: z.iso.datetime({ offset: true }).describe("Date"), - header: UpdateShippingInstructionsHeaderDtoSchema.describe("Header"), - generalDetails: UpdateShippingInstructionsGeneralDetailsDtoSchema.describe("General details"), - references: UpdateShippingInstructionsReferencesDtoSchema.describe("References"), - transport: UpdateShippingInstructionsTransportDtoSchema.describe("Transport"), - customsCompliance: UpdateShippingInstructionsCustomsComplianceDtoSchema.describe("Customs compliance"), - ics2: UpdateShippingInstructionsIcs2DtoSchema.describe("ICS2"), - cargoIdentificationNumbers: - UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema.describe("Cargo identification numbers"), - cargo: z.array(UpdateShippingInstructionsCargoDtoSchema).readonly().describe("Cargo"), - freightCharges: UpdateFreightChargesDtoSchema, - shippersDeclaredValue: - UpdateShippingInstructionsShippersDeclaredValueDtoSchema.describe("Shipper's declared value"), - notificationEmails: UpdateShippingInstructionsNotificationEmailsDtoSchema.describe("Notification emails"), - }) - .readonly(); - export type UpdateShippingInstructionsRequestDto = z.infer; -} diff --git a/test/generated/dist/shippingInstructions/shippingInstructions.queries.ts b/test/generated/dist/shippingInstructions/shippingInstructions.queries.ts deleted file mode 100644 index f8e3607..0000000 --- a/test/generated/dist/shippingInstructions/shippingInstructions.queries.ts +++ /dev/null @@ -1,272 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ShippingInstructionsAcl } from "./shippingInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ShippingInstructionsModels } from "./shippingInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ShippingInstructionsApi } from "./shippingInstructions.api"; - -export namespace ShippingInstructionsQueries { - export const moduleName = QueryModule.ShippingInstructions; - - export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string, id: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/shipping-instructions/:id", - officeId, - positionId, - id, - ] as const, - preview: (officeId: string, positionId: string, id: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/shipping-instructions/:id/preview", - officeId, - positionId, - id, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create shipping instructions - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId })); - return ShippingInstructionsApi.create(officeId, positionId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGet` - * @summary Get shipping instructions data - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { officeId, positionId, id }: { officeId: string; positionId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId, id), - queryFn: () => { - checkAcl(ShippingInstructionsAcl.canUseGet({ officeId })); - return ShippingInstructionsApi.get(officeId, positionId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update shipping instructions - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { ShippingInstructionsModels.UpdateShippingInstructionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Shipping instructions updated successfully - * @statusCodes [200, 401, 404] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof ShippingInstructionsApi.update, - { - officeId: string; - positionId: string; - id: string; - data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id, data }) => { - checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId })); - return ShippingInstructionsApi.update(officeId, positionId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, id } = variables; - const updateKeys = [keys.get(officeId, positionId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteOfficesPositionsShippingInstructionsById` - * @summary Delete shipping instructions - * @permission Requires `canUseDeleteOfficesPositionsShippingInstructionsById` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Shipping instructions deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteOfficesPositionsShippingInstructionsById = ( - options?: AppMutationOptions< - typeof ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById, - { officeId: string; positionId: string; id: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id }) => { - checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId })); - return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreview` - recommended when file should be cached - * @summary Preview shipping instructions document - * @permission Requires `canUsePreview` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreview = ( - { officeId, positionId, id }: { officeId: string; positionId: string; id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.preview(officeId, positionId, id), - queryFn: () => { - checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId })); - return ShippingInstructionsApi.preview(officeId, positionId, id, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewMutation` - recommended when file should not be cached - * @summary Preview shipping instructions document - * @permission Requires `canUsePreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewMutation = ( - options?: AppMutationOptions< - typeof ShippingInstructionsApi.preview, - { officeId: string; positionId: string; id: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id }) => { - checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId })); - return ShippingInstructionsApi.preview(officeId, positionId, id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, id } = variables; - const updateKeys = [keys.preview(officeId, positionId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerate` - * @summary Generate shipping instructions document - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerate = ( - options?: AppMutationOptions< - typeof ShippingInstructionsApi.generate, - { officeId: string; positionId: string; id: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id, data }) => { - checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId })); - return ShippingInstructionsApi.generate(officeId, positionId, id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/terminals/terminals.acl.ts b/test/generated/dist/terminals/terminals.acl.ts deleted file mode 100644 index b7aa7d6..0000000 --- a/test/generated/dist/terminals/terminals.acl.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace TerminalsAcl { - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Terminal"] as AbilityTuple<"Create", "Terminal">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; - - /** - * Use for `useGetById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ - export const canUseGetById = () => ["Read", "Terminal"] as AbilityTuple<"Read", "Terminal">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Terminal"] as AbilityTuple<"Update", "Terminal">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "Terminal"] as AbilityTuple<"Archive", "Terminal">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Unarchive", "Terminal"] as AbilityTuple<"Unarchive", "Terminal">; -} diff --git a/test/generated/dist/terminals/terminals.api.ts b/test/generated/dist/terminals/terminals.api.ts deleted file mode 100644 index 08b98f1..0000000 --- a/test/generated/dist/terminals/terminals.api.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { TerminalsModels } from "./terminals.models"; - -export namespace TerminalsApi { - export const create = (data: TerminalsModels.CreateTerminalRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals`, - ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), - config, - ); - }; - export const paginate = ( - limit: number, - order?: string, - filter?: TerminalsModels.TerminalPaginationFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, `/terminals`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: TerminalsModels.TerminalLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, - `/terminals/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const getById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: TerminalsModels.TerminalResponseDTOSchema }, `/terminals/${id}`, config); - }; - export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals/${id}`, - ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/terminals/${id}/archive`, undefined, config); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/terminals/${id}/unarchive`, undefined, config); - }; -} diff --git a/test/generated/dist/terminals/terminals.configs.ts b/test/generated/dist/terminals/terminals.configs.ts deleted file mode 100644 index ee3eb18..0000000 --- a/test/generated/dist/terminals/terminals.configs.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { TerminalsModels } from "./terminals.models"; -import { CommonModels } from "@/data/common/common.models"; -import { TerminalsQueries } from "./terminals.queries"; -import { TerminalsAcl } from "./terminals.acl"; - -export namespace TerminalsConfigs { - export const terminalsConfig = { - meta: { - title: "Terminals", - }, - readAll: { - acl: TerminalsAcl.canUsePaginate, - schema: TerminalsModels.TerminalResponseDTOSchema, - paginated: TerminalsQueries.usePaginate, - infinite: TerminalsQueries.usePaginateInfinite, - filters: { - schema: TerminalsModels.TerminalPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: TerminalsModels.TerminalPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - type: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: TerminalsModels.TerminalResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - name: true, - type: true, - airport: true, - port: true, - archived: true, - shortName: true, - address: true, - additionalInformation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: TerminalsModels.TerminalsPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: TerminalsAcl.canUseGetById, - schema: TerminalsModels.TerminalResponseDTOSchema, - query: TerminalsQueries.useGetById, - }, - create: { - acl: TerminalsAcl.canUseCreate, - schema: TerminalsModels.CreateTerminalRequestDTOSchema, - mutation: TerminalsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: TerminalsModels.CreateTerminalRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - type: true, - portId: true, - airportId: true, - street: true, - secondaryStreet: true, - zip: true, - district: true, - cityId: true, - countryId: true, - additionalInformation: true, - }, - }, - }), - }, - update: { - acl: TerminalsAcl.canUseUpdate, - schema: TerminalsModels.UpdateTerminalRequestDTOSchema, - mutation: TerminalsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: TerminalsModels.UpdateTerminalRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - type: true, - portId: true, - airportId: true, - street: true, - secondaryStreet: true, - zip: true, - district: true, - cityId: true, - countryId: true, - additionalInformation: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: TerminalsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: TerminalsQueries.usePaginateLabels, - infinite: TerminalsQueries.usePaginateLabelsInfinite, - filters: { - schema: TerminalsModels.TerminalLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: TerminalsModels.TerminalLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/terminals/terminals.models.ts b/test/generated/dist/terminals/terminals.models.ts deleted file mode 100644 index 56c6644..0000000 --- a/test/generated/dist/terminals/terminals.models.ts +++ /dev/null @@ -1,294 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace TerminalsModels { - /** - * TerminalTypeSchema - * @type { enum } - */ - export const TerminalTypeSchema = z.enum(["port", "airport"]); - export type TerminalType = z.infer; - export const TerminalType = TerminalTypeSchema.enum; - - /** - * CreateTerminalRequestDTOSchema - * @type { object } - * @property { string } matchCode Unique identifier code for the terminal - * @property { string } shortName Optional short name for the terminal - * @property { string } name Full name of the terminal - * @property { TerminalType } type Type of the terminal - * @property { string } portId ID of associated port, required if type is port - * @property { string } airportId ID of associated airport, required if type is airport - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP / Postal code - * @property { string } district District - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } additionalInformation Additional information - */ - export const CreateTerminalRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Unique identifier code for the terminal"), - shortName: z.string().describe("Optional short name for the terminal").nullish(), - name: z.string().describe("Full name of the terminal"), - type: TerminalTypeSchema.describe("Type of the terminal"), - portId: z.string().describe("ID of associated port, required if type is port").nullish(), - airportId: z.string().describe("ID of associated airport, required if type is airport").nullish(), - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street").nullish(), - zip: z.string().describe("ZIP / Postal code"), - district: z.string().describe("District").nullish(), - cityId: z.string().describe("City id"), - countryId: z.string().describe("Country id"), - additionalInformation: z.string().describe("Additional information").nullish(), - }) - .readonly(); - export type CreateTerminalRequestDTO = z.infer; - - /** - * TerminalCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const TerminalCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type TerminalCityDto = z.infer; - - /** - * TerminalCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ - export const TerminalCountryDtoSchema = z - .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) - .readonly(); - export type TerminalCountryDto = z.infer; - - /** - * TerminalAddressDTOSchema - * @type { object } - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP/Postal code - * @property { TerminalCityDto } city - * @property { string } district District name - * @property { TerminalCountryDto } country - */ - export const TerminalAddressDTOSchema = z - .object({ - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street").nullish(), - zip: z.string().describe("ZIP/Postal code"), - city: TerminalCityDtoSchema.nullish(), - district: z.string().describe("District name").nullish(), - country: TerminalCountryDtoSchema.nullish(), - }) - .readonly(); - export type TerminalAddressDTO = z.infer; - - /** - * AirportReferenceDTOSchema - * @type { object } - * @property { string } id Unique identifier of the airport - * @property { string } name Name of the airport - */ - export const AirportReferenceDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the airport"), - name: z.string().describe("Name of the airport"), - }) - .readonly(); - export type AirportReferenceDTO = z.infer; - - /** - * PortReferenceDTOSchema - * @type { object } - * @property { string } id Unique identifier of the port - * @property { string } name Name of the port - */ - export const PortReferenceDTOSchema = z - .object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port") }) - .readonly(); - export type PortReferenceDTO = z.infer; - - /** - * TerminalEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type TerminalEmployeeDTO = z.infer; - - /** - * TerminalResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the terminal - * @property { string } matchCode Match code for the terminal - * @property { string } name Name of the terminal - * @property { TerminalType } type Type of the terminal - * @property { AirportReferenceDTO } airport Associated airport information if terminal type is airport - * @property { PortReferenceDTO } port Associated port information if terminal type is port - * @property { boolean } archived Archived status of the terminal - * @property { string } shortName Short name of the terminal - * @property { TerminalAddressDTO } address Address of the terminal - * @property { string } additionalInformation Additional information - * @property { string } createdById - * @property { TerminalEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { TerminalEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const TerminalResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the terminal"), - matchCode: z.string().describe("Match code for the terminal"), - name: z.string().describe("Name of the terminal"), - type: TerminalTypeSchema.describe("Type of the terminal").nullish(), - airport: AirportReferenceDTOSchema.describe( - "Associated airport information if terminal type is airport", - ).nullish(), - port: PortReferenceDTOSchema.describe("Associated port information if terminal type is port").nullish(), - archived: z.boolean().describe("Archived status of the terminal"), - shortName: z.string().describe("Short name of the terminal").nullish(), - address: TerminalAddressDTOSchema.describe("Address of the terminal").nullish(), - additionalInformation: z.string().describe("Additional information").nullish(), - createdById: z.string().nullish(), - createdBy: TerminalEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: TerminalEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type TerminalResponseDTO = z.infer; - - /** - * UpdateTerminalRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code for the terminal - * @property { string } shortName Updated short name - * @property { string } name Updated name - * @property { TerminalType } type Type of the terminal - * @property { string } portId ID of associated port, required if type is port - * @property { string } airportId ID of associated airport, required if type is airport - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP / Postal code - * @property { string } district District - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } additionalInformation Additional information - */ - export const UpdateTerminalRequestDTOSchema = z - .object({ - matchCode: z.string().describe("Updated match code for the terminal"), - shortName: z.string().describe("Updated short name"), - name: z.string().describe("Updated name"), - type: TerminalTypeSchema.describe("Type of the terminal"), - portId: z.string().describe("ID of associated port, required if type is port"), - airportId: z.string().describe("ID of associated airport, required if type is airport"), - street: z.string().describe("Street address"), - secondaryStreet: z.string().describe("Secondary street"), - zip: z.string().describe("ZIP / Postal code"), - district: z.string().describe("District"), - cityId: z.string().describe("City id"), - countryId: z.string().describe("Country id"), - additionalInformation: z.string().describe("Additional information"), - }) - .readonly(); - export type UpdateTerminalRequestDTO = z.infer; - - /** - * TerminalPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter terminals by matchCode, shortName, or name - * @property { boolean } archived - * @property { string } type - */ - export const TerminalPaginationFilterDtoSchema = z - .object({ - search: z.string().describe("Search term to filter terminals by matchCode, shortName, or name"), - archived: z.boolean(), - type: TerminalTypeSchema, - }) - .readonly(); - export type TerminalPaginationFilterDto = z.infer; - - /** - * TerminalLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const TerminalLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type TerminalLabelFilterDto = z.infer; - - /** - * TerminalsPaginateOrderParamEnumSchema - * @type { enum } - */ - export const TerminalsPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type TerminalsPaginateOrderParamEnum = z.infer; - export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSchema.enum; - - /** - * TerminalsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { TerminalResponseDTO[] } items - */ - export const TerminalsPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(TerminalResponseDTOSchema).readonly() }).readonly().shape, - }); - export type TerminalsPaginateResponse = z.infer; - - /** - * TerminalsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const TerminalsPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type TerminalsPaginateLabelsOrderParamEnum = z.infer; - export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrderParamEnumSchema.enum; - - /** - * TerminalsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const TerminalsPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type TerminalsPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/terminals/terminals.queries.ts b/test/generated/dist/terminals/terminals.queries.ts deleted file mode 100644 index 4de8274..0000000 --- a/test/generated/dist/terminals/terminals.queries.ts +++ /dev/null @@ -1,358 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { TerminalsAcl } from "./terminals.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { TerminalsModels } from "./terminals.models"; -import { TerminalsApi } from "./terminals.api"; - -export namespace TerminalsQueries { - export const moduleName = QueryModule.Terminals; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: TerminalsModels.TerminalPaginationFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/terminals", limit, order, filter, page, cursor] as const, - paginateInfinite: ( - limit?: number, - order?: string, - filter?: TerminalsModels.TerminalPaginationFilterDto, - cursor?: string, - ) => [...keys.all, "/terminals", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: TerminalsModels.TerminalLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/terminals/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: TerminalsModels.TerminalLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/terminals/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getById: (id: string) => [...keys.all, "/terminals/:id", id] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create a new terminal - * @permission Requires `canUseCreate` ability - * @param { TerminalsModels.CreateTerminalRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(TerminalsAcl.canUseCreate()); - return TerminalsApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Paginate Terminals - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: TerminalsModels.TerminalPaginationFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Paginate Terminals - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: TerminalsModels.TerminalPaginationFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate terminals with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: TerminalsModels.TerminalLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate terminals with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: TerminalsModels.TerminalLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useGetById` - * @summary Get terminal details by ID - * @permission Requires `canUseGetById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(id), - queryFn: () => { - checkAcl(TerminalsAcl.canUseGetById()); - return TerminalsApi.getById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update terminal details - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { TerminalsModels.UpdateTerminalRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof TerminalsApi.update, - { id: string; data: TerminalsModels.UpdateTerminalRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(TerminalsAcl.canUseUpdate()); - return TerminalsApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.getById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive a terminal - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(TerminalsAcl.canUseArchive()); - return TerminalsApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive a terminal - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(TerminalsAcl.canUseUnarchive()); - return TerminalsApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/useCrossTabQueryInvalidation.ts b/test/generated/dist/useCrossTabQueryInvalidation.ts deleted file mode 100644 index d74d707..0000000 --- a/test/generated/dist/useCrossTabQueryInvalidation.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { QueryClient, QueryKey } from "@tanstack/react-query"; - -const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; - -/** - * Broadcasts a query invalidation event to all other open tabs via localStorage. - * - * @param queryKeys - An array of query keys to invalidate (array of arrays). - * - * NOTE: The `storage` event only fires in *other* tabs — the calling tab - * must invalidate its own queryClient separately if needed. - */ -export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { - localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); -}; - -/** - * Registers a one-time global `storage` event listener that reacts to - * cross-tab invalidation broadcasts. Safe to call from multiple hooks — - * only the first call sets up the listener. - */ -let isListenerSetUp = false; - -export const setupCrossTabListener = (queryClient: QueryClient) => { - if (isListenerSetUp) return; - isListenerSetUp = true; - - window.addEventListener("storage", (e: StorageEvent) => { - if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; - - try { - const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; - for (const queryKey of keys) { - queryClient.invalidateQueries({ queryKey }); - } - } catch { - // Ignore malformed payloads - } - }); -}; diff --git a/test/generated/dist/useMutationEffects.ts b/test/generated/dist/useMutationEffects.ts deleted file mode 100644 index ed61406..0000000 --- a/test/generated/dist/useMutationEffects.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { useCallback, useEffect } from "react"; - -import { QueryKey, useQueryClient } from "@tanstack/react-query"; -import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; -import { QueryModule } from "./queryModules"; -import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; - -export interface MutationEffectsOptions { - invalidateCurrentModule?: boolean; - crossTabInvalidation?: boolean; - invalidationMap?: InvalidationMap; - invalidateModules?: QueryModule[]; - invalidateKeys?: QueryKey[]; - preferUpdate?: boolean; -} - -export interface UseMutationEffectsProps { - currentModule: QueryModule; -} - -export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { - const queryClient = useQueryClient(); - const config = OpenApiQueryConfig.useConfig(); - - useEffect(() => { - if (!config.crossTabInvalidation) return; - setupCrossTabListener(queryClient); - }, [queryClient, config.crossTabInvalidation]); - - const runMutationEffects = useCallback( - async ( - data: TData, - variables: TVariables, - options: MutationEffectsOptions = {}, - updateKeys?: QueryKey[], - ) => { - const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; - const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; - const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; - - const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => - keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); - const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => - prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); - const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); - - const shouldInvalidateQuery = (queryKey: QueryKey) => { - const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); - if (shouldUpdate && isUpdateKey) { - return false; - } - - const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; - const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); - const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - const isMappedKey = - !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - - return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; - }; - - const invalidatedQueryKeys: QueryKey[] = []; - - queryClient.invalidateQueries({ - predicate: ({ queryKey }) => { - const shouldInvalidate = shouldInvalidateQuery(queryKey); - - if (shouldInvalidate && config.crossTabInvalidation) { - invalidatedQueryKeys.push([...queryKey]); - } - - return shouldInvalidate; - }, - }); - - if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { - broadcastQueryInvalidation(invalidatedQueryKeys); - } - - if (shouldUpdate && updateKeys) { - updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); - } - }, - [ - queryClient, - currentModule, - config.preferUpdate, - config.invalidateCurrentModule, - config.invalidationMap, - config.crossTabInvalidation, - ], - ); - - return { runMutationEffects }; -} diff --git a/test/generated/dist/userActivity/userActivity.api.ts b/test/generated/dist/userActivity/userActivity.api.ts deleted file mode 100644 index 94229d9..0000000 --- a/test/generated/dist/userActivity/userActivity.api.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { UserActivityModels } from "./userActivity.models"; - -export namespace UserActivityApi { - export const get = ( - officeId: string, - entityType: string, - entityId: string, - activeThresholdMinutes?: number, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, - `/offices/${officeId}/${entityType}/${entityId}/activity`, - { - ...config, - params: { - activeThresholdMinutes: ZodExtended.parse( - z.number().gte(1).describe("Active threshold in minutes").nullish(), - activeThresholdMinutes, - { type: "query", name: "activeThresholdMinutes" }, - ), - }, - }, - ); - }; -} diff --git a/test/generated/dist/userActivity/userActivity.models.ts b/test/generated/dist/userActivity/userActivity.models.ts deleted file mode 100644 index 149f572..0000000 --- a/test/generated/dist/userActivity/userActivity.models.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { z } from "zod"; - -export namespace UserActivityModels { - /** - * ActivityTypeEnumSchema - * @type { enum } - */ - export const ActivityTypeEnumSchema = z.enum(["View", "Modify"]); - export type ActivityTypeEnum = z.infer; - export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; - - /** - * UserSectionActivityDtoSchema - * @type { object } - * @property { string } section Section name - * @property { ActivityTypeEnum } activityType Type of activity - * @property { string } lastSeen Last seen timestamp - */ - export const UserSectionActivityDtoSchema = z - .object({ - section: z.string().describe("Section name"), - activityType: ActivityTypeEnumSchema.describe("Type of activity"), - lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), - }) - .readonly(); - export type UserSectionActivityDto = z.infer; - - /** - * ActiveUserDtoSchema - * @type { object } - * @property { string } userId User ID - * @property { string } firstName User first name - * @property { string } lastName User last name - * @property { string } userAvatar User avatar URL - * @property { UserSectionActivityDto } section User section activity - * @property { string } lastSeen Last seen timestamp - * @property { boolean } isCurrentlyActive Is currently active - */ - export const ActiveUserDtoSchema = z - .object({ - userId: z.string().describe("User ID"), - firstName: z.string().describe("User first name"), - lastName: z.string().describe("User last name"), - userAvatar: z.string().describe("User avatar URL").nullish(), - section: UserSectionActivityDtoSchema.describe("User section activity"), - lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), - isCurrentlyActive: z.boolean().describe("Is currently active"), - }) - .readonly(); - export type ActiveUserDto = z.infer; - - /** - * ActivityEntityTypeEnumSchema - * @type { enum } - */ - export const ActivityEntityTypeEnumSchema = z.enum(["Position", "Invoice", "BusinessPartner", "Quote"]); - export type ActivityEntityTypeEnum = z.infer; - export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; - - /** - * ActivityMetadataDtoSchema - * @type { object } - * @property { number } totalActiveUsers Total number of active users - * @property { string } entityId Entity ID - * @property { ActivityEntityTypeEnum } entityType Entity type - * @property { number } activeThresholdMinutes Active threshold in minutes - */ - export const ActivityMetadataDtoSchema = z - .object({ - totalActiveUsers: z.number().describe("Total number of active users"), - entityId: z.string().describe("Entity ID"), - entityType: ActivityEntityTypeEnumSchema.describe("Entity type"), - activeThresholdMinutes: z.number().describe("Active threshold in minutes"), - }) - .readonly(); - export type ActivityMetadataDto = z.infer; - - /** - * UserActivityResponseDtoSchema - * @type { object } - * @property { ActiveUserDto[] } activeUsers List of active users - * @property { ActivityMetadataDto } metadata Activity metadata - */ - export const UserActivityResponseDtoSchema = z - .object({ - activeUsers: z.array(ActiveUserDtoSchema).readonly().describe("List of active users"), - metadata: ActivityMetadataDtoSchema.describe("Activity metadata"), - }) - .readonly(); - export type UserActivityResponseDto = z.infer; -} diff --git a/test/generated/dist/userActivity/userActivity.queries.ts b/test/generated/dist/userActivity/userActivity.queries.ts deleted file mode 100644 index 89790ac..0000000 --- a/test/generated/dist/userActivity/userActivity.queries.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { UserActivityApi } from "./userActivity.api"; - -export namespace UserActivityQueries { - export const moduleName = QueryModule.UserActivity; - - export const keys = { - all: [moduleName] as const, - get: (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number) => - [ - ...keys.all, - "/offices/:officeId/:entityType/:entityId/activity", - officeId, - entityType, - entityId, - activeThresholdMinutes, - ] as const, - }; - - /** - * Query `useGet` - * @summary Get user activity for an entity - * @param { string } object.officeId Path parameter - * @param { string } object.entityType Path parameter - * @param { string } object.entityId Path parameter - * @param { number } object.activeThresholdMinutes Query parameter. Active threshold in minutes. Minimum: `1` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGet = ( - { - officeId, - entityType, - entityId, - activeThresholdMinutes, - }: { officeId: string; entityType: string; entityId: string; activeThresholdMinutes?: number }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - return useQuery({ - queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), - queryFn: () => UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes, config), - ...options, - }); - }; -} diff --git a/test/generated/dist/vatRules/vatRules.acl.ts b/test/generated/dist/vatRules/vatRules.acl.ts deleted file mode 100644 index 25b5cb3..0000000 --- a/test/generated/dist/vatRules/vatRules.acl.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace VatRulesAcl { - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; - - /** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; - - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "VatRule"] as AbilityTuple<"Create", "VatRule">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "VatRule"] as AbilityTuple<"Read", "VatRule">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Update", "VatRule"] as AbilityTuple<"Update", "VatRule">; -} diff --git a/test/generated/dist/vatRules/vatRules.api.ts b/test/generated/dist/vatRules/vatRules.api.ts deleted file mode 100644 index 8533205..0000000 --- a/test/generated/dist/vatRules/vatRules.api.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { VatRulesModels } from "./vatRules.models"; - -export namespace VatRulesApi { - export const paginateLabels = ( - limit: number, - order?: string, - filter?: VatRulesModels.VatRuleFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, - `/vat-rules/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const list = ( - limit: number, - order?: string, - filter?: VatRulesModels.VatRuleFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: VatRulesModels.VatRulesListResponseSchema }, `/vat-rules`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules`, - ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), - config, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: VatRulesModels.VatRuleResponseDTOSchema }, `/vat-rules/${id}`, config); - }; - export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}`, - ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}/archive`, - undefined, - config, - ); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}/unarchive`, - undefined, - config, - ); - }; -} diff --git a/test/generated/dist/vatRules/vatRules.configs.ts b/test/generated/dist/vatRules/vatRules.configs.ts deleted file mode 100644 index b822df6..0000000 --- a/test/generated/dist/vatRules/vatRules.configs.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { VatRulesModels } from "./vatRules.models"; -import { CommonModels } from "@/data/common/common.models"; -import { VatRulesQueries } from "./vatRules.queries"; -import { VatRulesAcl } from "./vatRules.acl"; - -export namespace VatRulesConfigs { - export const vatRulesConfig = { - meta: { - title: "Vat Rules", - }, - readAll: { - acl: VatRulesAcl.canUseList, - schema: VatRulesModels.VatRuleResponseDTOSchema, - paginated: VatRulesQueries.useList, - infinite: VatRulesQueries.useListInfinite, - filters: { - schema: VatRulesModels.VatRuleFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: VatRulesModels.VatRuleFilterDtoSchema, - options: { - inputs: { - matchcode: true, - name: true, - type: true, - officeId: true, - archived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: VatRulesModels.VatRuleResponseDTOSchema, - options: { - columns: { - id: true, - matchcode: true, - name: true, - vatPercentage: true, - vatNumber: true, - noTax: true, - type: true, - archived: true, - isReverseCharge: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - officeId: true, - office: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - sortable: VatRulesModels.VatRulesListOrderParamEnumSchema, - }, - }), - }, - read: { - acl: VatRulesAcl.canUseFindById, - schema: VatRulesModels.VatRuleResponseDTOSchema, - query: VatRulesQueries.useFindById, - }, - create: { - acl: VatRulesAcl.canUseCreate, - schema: VatRulesModels.CreateVatRuleRequestDTOSchema, - mutation: VatRulesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: VatRulesModels.CreateVatRuleRequestDTOSchema, - options: { - inputs: { - matchcode: true, - name: true, - noTax: true, - vatPercentage: true, - vatNumber: true, - type: true, - officeId: true, - isReverseCharge: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - }, - }), - }, - update: { - acl: VatRulesAcl.canUseUpdate, - schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, - mutation: VatRulesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, - options: { - inputs: { - matchcode: true, - name: true, - noTax: true, - vatPercentage: true, - vatNumber: true, - type: true, - officeId: true, - isReverseCharge: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - }, - }), - }, - }; - - export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: VatRulesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: VatRulesQueries.usePaginateLabels, - infinite: VatRulesQueries.usePaginateLabelsInfinite, - filters: { - schema: VatRulesModels.VatRuleFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: VatRulesModels.VatRuleFilterDtoSchema, - options: { - inputs: { - matchcode: true, - name: true, - type: true, - officeId: true, - archived: true, - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/vatRules/vatRules.models.ts b/test/generated/dist/vatRules/vatRules.models.ts deleted file mode 100644 index 5ff8a61..0000000 --- a/test/generated/dist/vatRules/vatRules.models.ts +++ /dev/null @@ -1,224 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace VatRulesModels { - /** - * VatRuleTypeEnumSchema - * @type { enum } - */ - export const VatRuleTypeEnumSchema = z.enum(["Outgoing", "Incoming"]); - export type VatRuleTypeEnum = z.infer; - export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; - - /** - * VatRuleFilterDtoSchema - * @type { object } - * @property { string } matchcode Matchcode to filter by - * @property { string } name Name to filter by - * @property { VatRuleTypeEnum } type - * @property { string } officeId Office ID to filter by - * @property { boolean } archived Filter by archived status - * @property { string } search Search to filter by - */ - export const VatRuleFilterDtoSchema = z - .object({ - matchcode: z.string().describe("Matchcode to filter by"), - name: z.string().describe("Name to filter by"), - type: VatRuleTypeEnumSchema, - officeId: z.string().describe("Office ID to filter by"), - archived: z.boolean().describe("Filter by archived status"), - search: z.string().describe("Search to filter by"), - }) - .readonly(); - export type VatRuleFilterDto = z.infer; - - /** - * VatRuleEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type VatRuleEmployeeDTO = z.infer; - - /** - * VatRuleOfficeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type VatRuleOfficeDTO = z.infer; - - /** - * VatRuleResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchcode - * @property { string } name - * @property { number } vatPercentage - * @property { number } vatNumber VAT rule reference number - * @property { boolean } noTax - * @property { VatRuleTypeEnum } type - * @property { boolean } archived - * @property { boolean } isReverseCharge - * @property { string } createdById - * @property { VatRuleEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { VatRuleEmployeeDTO } updatedBy - * @property { string } updatedAt - * @property { string } officeId - * @property { VatRuleOfficeDTO } office - * @property { string } bookkeepingId - * @property { string } bookkeepingTargetAccountNumber - */ - export const VatRuleResponseDTOSchema = z - .object({ - id: z.string(), - matchcode: z.string(), - name: z.string(), - vatPercentage: z.number(), - vatNumber: z.number().describe("VAT rule reference number").nullish(), - noTax: z.boolean().nullish(), - type: VatRuleTypeEnumSchema, - archived: z.boolean(), - isReverseCharge: z.boolean(), - createdById: z.string().nullish(), - createdBy: VatRuleEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: VatRuleEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - officeId: z.string(), - office: VatRuleOfficeDTOSchema.nullish(), - bookkeepingId: z.string().nullish(), - bookkeepingTargetAccountNumber: z.string().nullish(), - }) - .readonly(); - export type VatRuleResponseDTO = z.infer; - - /** - * CreateVatRuleRequestDTOSchema - * @type { object } - * @property { string } matchcode Unique matchcode for the VAT rule - * @property { string } name Name of the VAT rule - * @property { boolean } noTax - * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` - * @property { number } vatNumber VAT rule reference number - * @property { VatRuleTypeEnum } type Type of VAT rule - * @property { string } officeId Office ID - * @property { boolean } isReverseCharge Is reverse charge VAT rule - * @property { string } bookkeepingId Bookkeeping ID - * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number - */ - export const CreateVatRuleRequestDTOSchema = z - .object({ - matchcode: z.string().describe("Unique matchcode for the VAT rule"), - name: z.string().describe("Name of the VAT rule"), - noTax: z.boolean().nullish(), - vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), - vatNumber: z.number().describe("VAT rule reference number").nullish(), - type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), - officeId: z.string().describe("Office ID"), - isReverseCharge: z.boolean().describe("Is reverse charge VAT rule").nullish(), - bookkeepingId: z.string().describe("Bookkeeping ID").nullish(), - bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullish(), - }) - .readonly(); - export type CreateVatRuleRequestDTO = z.infer; - - /** - * UpdateVatRuleRequestDTOSchema - * @type { object } - * @property { string } matchcode Unique matchcode for the VAT rule - * @property { string } name Name of the VAT rule - * @property { boolean } noTax - * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` - * @property { number } vatNumber VAT rule reference number. Minimum: `0` - * @property { VatRuleTypeEnum } type Type of VAT rule - * @property { string } officeId Office ID - * @property { boolean } isReverseCharge Is reverse charge VAT rule - * @property { string } bookkeepingId Bookkeeping ID - * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number - */ - export const UpdateVatRuleRequestDTOSchema = z - .object({ - matchcode: z.string().describe("Unique matchcode for the VAT rule"), - name: z.string().describe("Name of the VAT rule"), - noTax: z.boolean(), - vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), - vatNumber: z.number().gte(0).describe("VAT rule reference number").nullable(), - type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), - officeId: z.string().describe("Office ID"), - isReverseCharge: z.boolean().describe("Is reverse charge VAT rule"), - bookkeepingId: z.string().describe("Bookkeeping ID").nullable(), - bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullable(), - }) - .readonly(); - export type UpdateVatRuleRequestDTO = z.infer; - - /** - * VatRulesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const VatRulesPaginateLabelsOrderParamEnumSchema = z.enum([ - "matchcode", - "name", - "type", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type VatRulesPaginateLabelsOrderParamEnum = z.infer; - export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderParamEnumSchema.enum; - - /** - * VatRulesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const VatRulesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type VatRulesPaginateLabelsResponse = z.infer; - - /** - * VatRulesListOrderParamEnumSchema - * @type { enum } - */ - export const VatRulesListOrderParamEnumSchema = z.enum([ - "matchcode", - "name", - "type", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type VatRulesListOrderParamEnum = z.infer; - export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; - - /** - * VatRulesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { VatRuleResponseDTO[] } items - */ - export const VatRulesListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(VatRuleResponseDTOSchema).readonly() }).readonly().shape, - }); - export type VatRulesListResponse = z.infer; -} diff --git a/test/generated/dist/vatRules/vatRules.queries.ts b/test/generated/dist/vatRules/vatRules.queries.ts deleted file mode 100644 index e0654f3..0000000 --- a/test/generated/dist/vatRules/vatRules.queries.ts +++ /dev/null @@ -1,341 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { VatRulesAcl } from "./vatRules.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { VatRulesModels } from "./vatRules.models"; -import { VatRulesApi } from "./vatRules.api"; - -export namespace VatRulesQueries { - export const moduleName = QueryModule.VatRules; - - export const keys = { - all: [moduleName] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: VatRulesModels.VatRuleFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/vat-rules/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: VatRulesModels.VatRuleFilterDto, - cursor?: string, - ) => [...keys.all, "/vat-rules/labels/paginate", "infinite", limit, order, filter, cursor] as const, - list: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => - [...keys.all, "/vat-rules", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => - [...keys.all, "/vat-rules", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/vat-rules/:id", id] as const, - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate VAT rule labels (id and matchcode only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate VAT rule labels (id and matchcode only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useList` - * @summary List VAT rules - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List VAT rules - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: VatRulesModels.VatRuleFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Mutation `useCreate` - * @summary Create a new VAT rule - * @permission Requires `canUseCreate` ability - * @param { VatRulesModels.CreateVatRuleRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(VatRulesAcl.canUseCreate()); - return VatRulesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useFindById` - * @summary Get VAT rule by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(VatRulesAcl.canUseFindById()); - return VatRulesApi.findById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update VAT rule by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { VatRulesModels.UpdateVatRuleRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof VatRulesApi.update, - { id: string; data: VatRulesModels.UpdateVatRuleRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(VatRulesAcl.canUseUpdate()); - return VatRulesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive VAT rule - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(VatRulesAcl.canUseArchive()); - return VatRulesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive VAT rule - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(VatRulesAcl.canUseUnarchive()); - return VatRulesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/warehouses/warehouses.acl.ts b/test/generated/dist/warehouses/warehouses.acl.ts deleted file mode 100644 index 7465f13..0000000 --- a/test/generated/dist/warehouses/warehouses.acl.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace WarehousesAcl { - /** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = () => ["Create", "Warehouse"] as AbilityTuple<"Create", "Warehouse">; - - /** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ - export const canUsePaginate = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; - - /** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ - export const canUsePaginateLabels = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; - - /** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = () => ["Read", "Warehouse"] as AbilityTuple<"Read", "Warehouse">; - - /** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ - export const canUseUpdate = () => ["Update", "Warehouse"] as AbilityTuple<"Update", "Warehouse">; - - /** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ - export const canUseArchive = () => ["Archive", "Warehouse"] as AbilityTuple<"Archive", "Warehouse">; - - /** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ - export const canUseUnarchive = () => ["Archive", "Warehouse"] as AbilityTuple<"Archive", "Warehouse">; -} diff --git a/test/generated/dist/warehouses/warehouses.api.ts b/test/generated/dist/warehouses/warehouses.api.ts deleted file mode 100644 index 0681bcb..0000000 --- a/test/generated/dist/warehouses/warehouses.api.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WarehousesModels } from "./warehouses.models"; - -export namespace WarehousesApi { - export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses`, - ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), - config, - ); - }; - export const paginate = ( - limit: number, - order?: string, - filter?: WarehousesModels.WarehouseFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get({ resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, `/warehouses`, { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }); - }; - export const paginateLabels = ( - limit: number, - order?: string, - filter?: WarehousesModels.WarehouseLabelFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, - `/warehouses/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get({ resSchema: WarehousesModels.WarehouseResponseDTOSchema }, `/warehouses/${id}`, config); - }; - export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses/${id}`, - ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), - config, - ); - }; - export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/warehouses/${id}/archive`, undefined, config); - }; - export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post({ resSchema: z.void() }, `/warehouses/${id}/unarchive`, undefined, config); - }; -} diff --git a/test/generated/dist/warehouses/warehouses.configs.ts b/test/generated/dist/warehouses/warehouses.configs.ts deleted file mode 100644 index dfcf9ed..0000000 --- a/test/generated/dist/warehouses/warehouses.configs.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { WarehousesModels } from "./warehouses.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WarehousesQueries } from "./warehouses.queries"; -import { WarehousesAcl } from "./warehouses.acl"; - -export namespace WarehousesConfigs { - export const warehousesConfig = { - meta: { - title: "Warehouses", - }, - readAll: { - acl: WarehousesAcl.canUsePaginate, - schema: WarehousesModels.WarehouseResponseDTOSchema, - paginated: WarehousesQueries.usePaginate, - infinite: WarehousesQueries.usePaginateInfinite, - filters: { - schema: WarehousesModels.WarehouseFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WarehousesModels.WarehouseFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: WarehousesModels.WarehouseResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - city: true, - country: true, - district: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: WarehousesModels.WarehousesPaginateOrderParamEnumSchema, - }, - }), - }, - read: { - acl: WarehousesAcl.canUseFindById, - schema: WarehousesModels.WarehouseResponseDTOSchema, - query: WarehousesQueries.useFindById, - }, - create: { - acl: WarehousesAcl.canUseCreate, - schema: WarehousesModels.CreateWarehouseRequestDTOSchema, - mutation: WarehousesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: WarehousesModels.CreateWarehouseRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, - }), - }, - update: { - acl: WarehousesAcl.canUseUpdate, - schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, - mutation: WarehousesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, - }), - }, - }; - - export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: WarehousesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: WarehousesQueries.usePaginateLabels, - infinite: WarehousesQueries.usePaginateLabelsInfinite, - filters: { - schema: WarehousesModels.WarehouseLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WarehousesModels.WarehouseLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema, - }, - }), - }, - }; -} diff --git a/test/generated/dist/warehouses/warehouses.models.ts b/test/generated/dist/warehouses/warehouses.models.ts deleted file mode 100644 index dfa717d..0000000 --- a/test/generated/dist/warehouses/warehouses.models.ts +++ /dev/null @@ -1,224 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WarehousesModels { - /** - * WarehouseCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type WarehouseCityDto = z.infer; - - /** - * WarehouseCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ - export const WarehouseCountryDtoSchema = z - .object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }) - .readonly(); - export type WarehouseCountryDto = z.infer; - - /** - * WarehouseEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type WarehouseEmployeeDTO = z.infer; - - /** - * WarehouseResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { WarehouseCityDto } city - * @property { WarehouseCountryDto } country - * @property { string } district - * @property { boolean } archived - * @property { string } createdById - * @property { WarehouseEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { WarehouseEmployeeDTO } updatedBy - * @property { string } updatedAt - */ - export const WarehouseResponseDTOSchema = z - .object({ - id: z.string(), - name: z.string().nullish(), - shortName: z.string().nullish(), - additionalInformation: z.string().nullish(), - matchCode: z.string(), - street: z.string().nullish(), - secondaryStreet: z.string().nullish(), - zip: z.string().nullish(), - city: WarehouseCityDtoSchema.nullish(), - country: WarehouseCountryDtoSchema.nullish(), - district: z.string().nullish(), - archived: z.boolean(), - createdById: z.string().nullish(), - createdBy: WarehouseEmployeeDTOSchema.nullish(), - createdAt: z.iso.datetime({ offset: true }), - updatedById: z.string().nullish(), - updatedBy: WarehouseEmployeeDTOSchema.nullish(), - updatedAt: z.iso.datetime({ offset: true }), - }) - .readonly(); - export type WarehouseResponseDTO = z.infer; - - /** - * CreateWarehouseRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } countryId - * @property { string } district - */ - export const CreateWarehouseRequestDTOSchema = z - .object({ - name: z.string().nullish(), - shortName: z.string().nullish(), - additionalInformation: z.string().nullish(), - matchCode: z.string(), - street: z.string().nullish(), - secondaryStreet: z.string().nullish(), - zip: z.string().nullish(), - cityId: z.string().nullish(), - countryId: z.string().nullish(), - district: z.string().nullish(), - }) - .readonly(); - export type CreateWarehouseRequestDTO = z.infer; - - /** - * WarehouseLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ - export const WarehouseLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); - export type WarehouseLabelFilterDto = z.infer; - - /** - * WarehouseFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived Filter by archived status - */ - export const WarehouseFilterDtoSchema = z - .object({ search: z.string(), archived: z.boolean().describe("Filter by archived status") }) - .readonly(); - export type WarehouseFilterDto = z.infer; - - /** - * UpdateWarehouseRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } countryId - * @property { string } district - */ - export const UpdateWarehouseRequestDTOSchema = z - .object({ - name: z.string(), - shortName: z.string(), - additionalInformation: z.string(), - matchCode: z.string(), - street: z.string(), - secondaryStreet: z.string(), - zip: z.string(), - cityId: z.string(), - countryId: z.string(), - district: z.string(), - }) - .readonly(); - export type UpdateWarehouseRequestDTO = z.infer; - - /** - * WarehousesPaginateOrderParamEnumSchema - * @type { enum } - */ - export const WarehousesPaginateOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type WarehousesPaginateOrderParamEnum = z.infer; - export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnumSchema.enum; - - /** - * WarehousesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { WarehouseResponseDTO[] } items - */ - export const WarehousesPaginateResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(WarehouseResponseDTOSchema).readonly() }).readonly().shape, - }); - export type WarehousesPaginateResponse = z.infer; - - /** - * WarehousesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ - export const WarehousesPaginateLabelsOrderParamEnumSchema = z.enum([ - "name", - "matchCode", - "shortName", - "createdAt", - "updatedAt", - "createdBy", - "updatedBy", - ]); - export type WarehousesPaginateLabelsOrderParamEnum = z.infer; - export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOrderParamEnumSchema.enum; - - /** - * WarehousesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ - export const WarehousesPaginateLabelsResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape, - }); - export type WarehousesPaginateLabelsResponse = z.infer; -} diff --git a/test/generated/dist/warehouses/warehouses.queries.ts b/test/generated/dist/warehouses/warehouses.queries.ts deleted file mode 100644 index 9fc4da2..0000000 --- a/test/generated/dist/warehouses/warehouses.queries.ts +++ /dev/null @@ -1,348 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WarehousesAcl } from "./warehouses.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WarehousesModels } from "./warehouses.models"; -import { WarehousesApi } from "./warehouses.api"; - -export namespace WarehousesQueries { - export const moduleName = QueryModule.Warehouses; - - export const keys = { - all: [moduleName] as const, - paginate: ( - limit?: number, - order?: string, - filter?: WarehousesModels.WarehouseFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/warehouses", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string) => - [...keys.all, "/warehouses", "infinite", limit, order, filter, cursor] as const, - paginateLabels: ( - limit?: number, - order?: string, - filter?: WarehousesModels.WarehouseLabelFilterDto, - page?: number, - cursor?: string, - ) => [...keys.all, "/warehouses/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: ( - limit?: number, - order?: string, - filter?: WarehousesModels.WarehouseLabelFilterDto, - cursor?: string, - ) => [...keys.all, "/warehouses/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/warehouses/:id", id] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create warehouse - * @permission Requires `canUseCreate` ability - * @param { WarehousesModels.CreateWarehouseRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(WarehousesAcl.canUseCreate()); - return WarehousesApi.create(data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePaginate` - * @summary Get paginated warehouses - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginate = ( - { - limit, - order, - filter, - page, - cursor, - }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseFilterDto; page?: number; cursor?: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateInfinite - * @summary Get paginated warehouses - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `usePaginateLabels` - * @summary Paginate warehouse labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabels = ( - { - limit, - order, - filter, - page, - cursor, - }: { - limit: number; - order?: string; - filter?: WarehousesModels.WarehouseLabelFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate warehouse labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const usePaginateLabelsInfinite = ( - { - limit, - order, - filter, - cursor, - }: { limit: number; order?: string; filter?: WarehousesModels.WarehouseLabelFilterDto; cursor?: string }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get warehouse by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useFindById = ( - { id }: { id: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(WarehousesAcl.canUseFindById()); - return WarehousesApi.findById(id, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdate` - * @summary Update warehouse - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { WarehousesModels.UpdateWarehouseRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdate = ( - options?: AppMutationOptions< - typeof WarehousesApi.update, - { id: string; data: WarehousesModels.UpdateWarehouseRequestDTO } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(WarehousesAcl.canUseUpdate()); - return WarehousesApi.update(id, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useArchive` - * @summary Archive warehouse - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useArchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(WarehousesAcl.canUseArchive()); - return WarehousesApi.archive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useUnarchive` - * @summary Unarchive warehouse - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUnarchive = ( - options?: AppMutationOptions & MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(WarehousesAcl.canUseUnarchive()); - return WarehousesApi.unarchive(id, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/workingDocuments/workingDocuments.acl.ts b/test/generated/dist/workingDocuments/workingDocuments.acl.ts deleted file mode 100644 index 5ef0f52..0000000 --- a/test/generated/dist/workingDocuments/workingDocuments.acl.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsAcl { - /** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List working documents - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ - export const canUseList = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument", object) : "WorkingDocument"] as AbilityTuple< - "Read", - "WorkingDocument" | (ForcedSubject<"WorkingDocument"> & { officeId: string }) - >; - - /** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get working document by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ - export const canUseFindById = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument", object) : "WorkingDocument"] as AbilityTuple< - "Read", - "WorkingDocument" | (ForcedSubject<"WorkingDocument"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocuments/workingDocuments.api.ts b/test/generated/dist/workingDocuments/workingDocuments.api.ts deleted file mode 100644 index d8d9903..0000000 --- a/test/generated/dist/workingDocuments/workingDocuments.api.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; - -export namespace WorkingDocumentsApi { - export const list = ( - positionId: string, - officeId: string, - limit: number, - order?: string, - filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, - page?: number, - cursor?: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, - `/offices/${officeId}/positions/${positionId}/working-documents`, - { - ...config, - params: { - order: ZodExtended.parse( - ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), - order, - { type: "query", name: "order" }, - ), - filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { - type: "query", - name: "filter", - }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { - type: "query", - name: "limit", - }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { - type: "query", - name: "page", - }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { - type: "query", - name: "cursor", - }), - }, - }, - ); - }; - export const findById = (positionId: string, id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, - config, - ); - }; -} diff --git a/test/generated/dist/workingDocuments/workingDocuments.configs.ts b/test/generated/dist/workingDocuments/workingDocuments.configs.ts deleted file mode 100644 index 041fdcc..0000000 --- a/test/generated/dist/workingDocuments/workingDocuments.configs.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; -import { WorkingDocumentsQueries } from "./workingDocuments.queries"; -import { WorkingDocumentsAcl } from "./workingDocuments.acl"; - -export namespace WorkingDocumentsConfigs { - export const workingDocumentsConfig = { - meta: { - title: "Working Documents", - }, - readAll: { - acl: WorkingDocumentsAcl.canUseList, - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - paginated: WorkingDocumentsQueries.useList, - infinite: WorkingDocumentsQueries.useListInfinite, - filters: { - schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, - options: { - inputs: { - search: true, - type: true, - }, - }, - }), - }, - columns: dynamicColumns({ - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - name: true, - nameSuffix: true, - type: true, - referenceTable: true, - referenceId: true, - createdById: true, - createdAt: true, - createdBy: true, - }, - sortable: WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema, - }, - }), - }, - read: { - acl: WorkingDocumentsAcl.canUseFindById, - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - query: WorkingDocumentsQueries.useFindById, - }, - }; -} diff --git a/test/generated/dist/workingDocuments/workingDocuments.models.ts b/test/generated/dist/workingDocuments/workingDocuments.models.ts deleted file mode 100644 index 5fc10dd..0000000 --- a/test/generated/dist/workingDocuments/workingDocuments.models.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsModels { - /** - * TypeEnumSchema - * @type { enum } - * @description Working document type - */ - export const TypeEnumSchema = z.enum([ - "export-declaration", - "house-bl", - "master-bl", - "house-awb", - "master-awb", - "bl-instructions", - "ams-instructions", - "cmr-form", - "fcr-form", - "isf-form", - "templated-document", - "shipping-instructions", - ]); - export type TypeEnum = z.infer; - export const TypeEnum = TypeEnumSchema.enum; - - /** - * WorkingDocumentCreatedByResponseDTOSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } name Employee name - */ - export const WorkingDocumentCreatedByResponseDTOSchema = z - .object({ id: z.string().describe("Employee ID"), name: z.string().describe("Employee name").nullable() }) - .readonly(); - export type WorkingDocumentCreatedByResponseDTO = z.infer; - - /** - * WorkingDocumentResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } positionId Position ID - * @property { string } name Working document name - * @property { string } nameSuffix Working document name suffix - * @property { string } type Working document type - * @property { string } referenceTable Reference table - * @property { string } referenceId Reference ID - * @property { string } createdById Created by - * @property { string } createdAt Created at - * @property { WorkingDocumentCreatedByResponseDTO } createdBy Created by - */ - export const WorkingDocumentResponseDTOSchema = z - .object({ - id: z.string(), - positionId: z.string().describe("Position ID"), - name: z.string().describe("Working document name"), - nameSuffix: z.string().describe("Working document name suffix").nullish(), - type: TypeEnumSchema.describe("Working document type"), - referenceTable: z.string().describe("Reference table"), - referenceId: z.string().describe("Reference ID"), - createdById: z.string().describe("Created by"), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - createdBy: WorkingDocumentCreatedByResponseDTOSchema.describe("Created by"), - }) - .readonly(); - export type WorkingDocumentResponseDTO = z.infer; - - /** - * WorkingDocumentFilterDtoSchema - * @type { object } - * @property { string } search - * @property { string } type - */ - export const WorkingDocumentFilterDtoSchema = z.object({ search: z.string(), type: z.string() }).readonly(); - export type WorkingDocumentFilterDto = z.infer; - - /** - * WorkingDocumentsListOrderParamEnumSchema - * @type { enum } - */ - export const WorkingDocumentsListOrderParamEnumSchema = z.enum(["NAME", "TYPE", "CREATED_AT", "UPDATED_AT"]); - export type WorkingDocumentsListOrderParamEnum = z.infer; - export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParamEnumSchema.enum; - - /** - * WorkingDocumentsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { WorkingDocumentResponseDTO[] } items - */ - export const WorkingDocumentsListResponseSchema = z.object({ - ...CommonModels.PaginationDtoSchema.shape, - ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).readonly() }).readonly().shape, - }); - export type WorkingDocumentsListResponse = z.infer; -} diff --git a/test/generated/dist/workingDocuments/workingDocuments.queries.ts b/test/generated/dist/workingDocuments/workingDocuments.queries.ts deleted file mode 100644 index 09fb3dc..0000000 --- a/test/generated/dist/workingDocuments/workingDocuments.queries.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsAcl } from "./workingDocuments.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; -import { WorkingDocumentsApi } from "./workingDocuments.api"; - -export namespace WorkingDocumentsQueries { - export const moduleName = QueryModule.WorkingDocuments; - - export const keys = { - all: [moduleName] as const, - list: ( - positionId: string, - officeId: string, - limit?: number, - order?: string, - filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, - page?: number, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/working-documents", - positionId, - officeId, - limit, - order, - filter, - page, - cursor, - ] as const, - listInfinite: ( - positionId: string, - officeId: string, - limit?: number, - order?: string, - filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, - cursor?: string, - ) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/working-documents", - "infinite", - positionId, - officeId, - limit, - order, - filter, - cursor, - ] as const, - findById: (positionId: string, id: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/working-documents/:id", - positionId, - id, - officeId, - ] as const, - }; - - /** - * Query `useList` - * @summary List working documents - * @permission Requires `canUseList` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` - * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useList = ( - { - positionId, - officeId, - limit, - order, - filter, - page, - cursor, - }: { - positionId: string; - officeId: string; - limit: number; - order?: string; - filter?: WorkingDocumentsModels.WorkingDocumentFilterDto; - page?: number; - cursor?: string; - }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WorkingDocumentsAcl.canUseList({ officeId })); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor, config); - }, - ...options, - }); - }; - - /** - * Infinite query `useListInfinite - * @summary List working documents - * @permission Requires `canUseList` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` - * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ - export const useListInfinite = ( - { - positionId, - officeId, - limit, - order, - filter, - cursor, - }: { - positionId: string; - officeId: string; - limit: number; - order?: string; - filter?: WorkingDocumentsModels.WorkingDocumentFilterDto; - cursor?: string; - }, - options?: AppInfiniteQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WorkingDocumentsAcl.canUseList({ officeId })); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor, config); - }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); - }; - - /** - * Query `useFindById` - * @summary Get working document by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ - export const useFindById = ( - { positionId, id, officeId }: { positionId: string; id: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(positionId, id, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId })); - return WorkingDocumentsApi.findById(positionId, id, officeId, config); - }, - ...options, - }); - }; -} diff --git a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts deleted file mode 100644 index 231e7ac..0000000 --- a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsAmsInstructionsAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Create", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Create", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; - - /** - * Use for `useGetAMSInstructionsData` query ability. For global ability, omit the object parameter. - * @description Read AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAMSInstructionsData` query - */ - export const canUseGetAMSInstructionsData = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; - - /** - * Use for `useUpdateAMSInstructionsData` mutation ability. For global ability, omit the object parameter. - * @description Update AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateAMSInstructionsData` mutation - */ - export const canUseUpdateAMSInstructionsData = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; - - /** - * Use for `useDeleteAMSInstructions` mutation ability. For global ability, omit the object parameter. - * @description Delete AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteAMSInstructions` mutation - */ - export const canUseDeleteAMSInstructions = (object?: { officeId: string }) => - [ - "Delete", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Delete", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; - - /** - * Use for `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation - */ - export const canUsePreviewAMSInstructions = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; - - /** - * Use for `useGenerateAMSInstructions` mutation ability. For global ability, omit the object parameter. - * @description Generate AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAMSInstructions` mutation - */ - export const canUseGenerateAMSInstructions = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-ams-instructions" | (ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts deleted file mode 100644 index 0d14f09..0000000 --- a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsAmsInstructionsApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions`, - undefined, - config, - ); - }; - export const getAMSInstructionsData = ( - positionId: string, - amsInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - config, - ); - }; - export const updateAMSInstructionsData = ( - positionId: string, - amsInstructionsId: string, - officeId: string, - data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), - config, - ); - }; - export const deleteAMSInstructions = ( - positionId: string, - amsInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - undefined, - config, - ); - }; - export const previewAMSInstructions = ( - positionId: string, - amsInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generateAMSInstructions = ( - positionId: string, - amsInstructionsId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts deleted file mode 100644 index f48fd4d..0000000 --- a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsAmsInstructionsModels { - /** - * AMSInstructionsDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ - export const AMSInstructionsDocumentPortResponseDTOSchema = z - .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) - .readonly(); - export type AMSInstructionsDocumentPortResponseDTO = z.infer; - - /** - * AMSInstructionsDocumentCityResponseDTOSchema - * @type { object } - * @property { string } id ID of the city - * @property { string } name Name of the city - */ - export const AMSInstructionsDocumentCityResponseDTOSchema = z - .object({ id: z.string().describe("ID of the city"), name: z.string().describe("Name of the city") }) - .readonly(); - export type AMSInstructionsDocumentCityResponseDTO = z.infer; - - /** - * AMSInstructionsDocumentSignedByResponseDTOSchema - * @type { object } - * @property { string } id ID of the employee - * @property { string } name Name of the employee - */ - export const AMSInstructionsDocumentSignedByResponseDTOSchema = z - .object({ id: z.string().describe("ID of the employee"), name: z.string().describe("Name of the employee") }) - .readonly(); - export type AMSInstructionsDocumentSignedByResponseDTO = z.infer< - typeof AMSInstructionsDocumentSignedByResponseDTOSchema - >; - - /** - * AMSInstructionsDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const AMSInstructionsDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer< - typeof AMSInstructionsDocumentBusinessPartnerResponseDTOSchema - >; - - /** - * AMSInstructionsDocumentCargoDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { string } containerNumber Container number of the cargo - * @property { number } nrOfPackages Number of packages in the cargo - * @property { string } description Description of the cargo - * @property { number } weight Weight of the cargo - * @property { number } volume Volume of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - */ - export const AMSInstructionsDocumentCargoDTOSchema = z - .object({ - caseMarks: z.string().describe("Case marks of the cargo"), - containerNumber: z.string().describe("Container number of the cargo"), - nrOfPackages: z.number().describe("Number of packages in the cargo"), - description: z.string().describe("Description of the cargo"), - weight: z.number().describe("Weight of the cargo"), - volume: z.number().describe("Volume of the cargo"), - seal1: z.string().describe("Seal number 1 of the cargo"), - seal2: z.string().describe("Seal number 2 of the cargo"), - }) - .readonly(); - export type AMSInstructionsDocumentCargoDTO = z.infer; - - /** - * AMSInstructionsDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the AMS Instructions document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the AMS Instructions document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } date Date of the AMS Instructions document - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { CommonModels.EditorContentResponseDto } additionalAMSText Additional AMS text - * @property { string } principalName Principal name - * @property { string } blNumber Bill of lading number - * @property { string } vessel Vessel - * @property { AMSInstructionsDocumentPortResponseDTO } portOfLoading Port of loading - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfDelivery Port of delivery - * @property { AMSInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfIssue Place of issue - * @property { string } dateOfIssue Date of issue - * @property { AMSInstructionsDocumentSignedByResponseDTO } signedBy Signed by - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } deliveryBusinessPartner Delivery business partner - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfAcceptance Port of acceptance - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Also notify party - * @property { string } applyTo Apply to - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string[] } availableContainerNumbers Available container numbers - * @property { string[] } selectedContainerNumbers Selected container numbers - * @property { string[] } selectedContainerLabels Selected container labels - * @property { AMSInstructionsDocumentCargoDTO[] } cargo Cargo information - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - */ - export const AMSInstructionsDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the AMS Instructions document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference").nullish(), - name: z.string().describe("Name of the AMS Instructions document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document").nullish(), - direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), - transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), - versionNumber: z.number().describe("Version number of the document"), - additionalAMSText: CommonModels.EditorContentResponseDtoSchema.describe("Additional AMS text").nullish(), - principalName: z.string().describe("Principal name").nullish(), - blNumber: z.string().describe("Bill of lading number").nullish(), - vessel: z.string().describe("Vessel").nullish(), - portOfLoading: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of loading").nullish(), - placeOfDelivery: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of delivery").nullish(), - portOfDischarge: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), - placeOfIssue: AMSInstructionsDocumentCityResponseDTOSchema.describe("Place of issue").nullish(), - dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue").nullish(), - signedBy: AMSInstructionsDocumentSignedByResponseDTOSchema.describe("Signed by").nullish(), - deliveryBusinessPartner: - AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Delivery business partner").nullish(), - placeOfAcceptance: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of acceptance").nullish(), - consignee: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), - shipper: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), - notify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Notify party").nullish(), - alsoNotify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Also notify party").nullish(), - applyTo: z.string().describe("Apply to").nullish(), - suppressWeight: z.boolean().describe("Whether to suppress weight information").nullish(), - suppressMeasurement: z.boolean().describe("Whether to suppress measurement information").nullish(), - availableContainerNumbers: z.array(z.string()).readonly().describe("Available container numbers").nullish(), - selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers").nullish(), - selectedContainerLabels: z.array(z.string()).readonly().describe("Selected container labels").nullish(), - cargo: z.array(AMSInstructionsDocumentCargoDTOSchema).readonly().describe("Cargo information").nullish(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at").nullish(), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at").nullish(), - }) - .readonly(); - export type AMSInstructionsDocumentResponseDTO = z.infer; - - /** - * UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema - >; - - /** - * UpdateAMSInstructionsDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { CommonModels.EditorContentUpdateDto } additionalAMSText Additional AMS text - * @property { string } principalName Principal name - * @property { string } blNumber Bill of lading number - * @property { string } vessel Vessel - * @property { string } portOfLoadingId Port of loading id - * @property { string } placeOfDeliveryId Place of delivery id - * @property { string } portOfDischargeId Port of discharge id - * @property { string } placeOfIssueId Place of issue - * @property { string } dateOfIssue Date of issue - * @property { string } signedById Signed by employee ID - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } deliveryBusinessPartner Delivery business partner - * @property { string } placeOfAcceptanceId Port of acceptance - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party - * @property { string } applyTo Apply to - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string[] } selectedContainerNumbers Selected container numbers - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { string } date Date of the AMS Instructions document - */ - export const UpdateAMSInstructionsDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Document name suffix"), - additionalAMSText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional AMS text"), - principalName: z.string().describe("Principal name"), - blNumber: z.string().describe("Bill of lading number"), - vessel: z.string().describe("Vessel"), - portOfLoadingId: z.string().describe("Port of loading id"), - placeOfDeliveryId: z.string().describe("Place of delivery id"), - portOfDischargeId: z.string().describe("Port of discharge id"), - placeOfIssueId: z.string().describe("Place of issue"), - dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue"), - signedById: z.string().describe("Signed by employee ID"), - deliveryBusinessPartner: - UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Delivery business partner"), - placeOfAcceptanceId: z.string().describe("Port of acceptance"), - consignee: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), - shipper: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), - notify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party"), - alsoNotify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party"), - applyTo: z.string().describe("Apply to"), - suppressWeight: z.boolean().describe("Whether to suppress weight information"), - suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), - selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document"), - }) - .readonly(); - export type UpdateAMSInstructionsDocumentRequestDTO = z.infer; -} diff --git a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts b/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts deleted file mode 100644 index 5337c6a..0000000 --- a/test/generated/dist/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts +++ /dev/null @@ -1,312 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsAmsInstructionsAcl } from "./workingDocumentsAmsInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsAmsInstructionsApi } from "./workingDocumentsAmsInstructions.api"; - -export namespace WorkingDocumentsAmsInstructionsQueries { - export const moduleName = QueryModule.WorkingDocumentsAmsInstructions; - - export const keys = { - all: [moduleName] as const, - getAMSInstructionsData: (positionId: string, amsInstructionsId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId", - positionId, - amsInstructionsId, - officeId, - ] as const, - previewAMSInstructions: (positionId: string, amsInstructionsId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId/preview", - positionId, - amsInstructionsId, - officeId, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create an AMS Instructions document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof WorkingDocumentsAmsInstructionsApi.create, - { positionId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId })); - return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetAMSInstructionsData` - * @summary Get AMS Instructions document data - * @permission Requires `canUseGetAMSInstructionsData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.amsInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetAMSInstructionsData = ( - { positionId, amsInstructionsId, officeId }: { positionId: string; amsInstructionsId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId })); - return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData( - positionId, - amsInstructionsId, - officeId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateAMSInstructionsData` - * @summary Update AMS Instructions document data - * @permission Requires `canUseUpdateAMSInstructionsData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateAMSInstructionsData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData, - { - positionId: string; - amsInstructionsId: string; - officeId: string; - data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId })); - return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData( - positionId, - amsInstructionsId, - officeId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, amsInstructionsId, officeId } = variables; - const updateKeys = [keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteAMSInstructions` - * @summary Delete AMS Instructions document - * @permission Requires `canUseDeleteAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } AMS Instructions document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteAMSInstructions = ( - options?: AppMutationOptions< - typeof WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions, - { positionId: string; amsInstructionsId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId })); - return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions( - positionId, - amsInstructionsId, - officeId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewAMSInstructions` - recommended when file should be cached - * @summary Preview AMS Instructions document - * @permission Requires `canUsePreviewAMSInstructions` ability - * @param { string } object.positionId Path parameter - * @param { string } object.amsInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewAMSInstructions = ( - { positionId, amsInstructionsId, officeId }: { positionId: string; amsInstructionsId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId })); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions( - positionId, - amsInstructionsId, - officeId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewAMSInstructionsMutation` - recommended when file should not be cached - * @summary Preview AMS Instructions document - * @permission Requires `canUsePreviewAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewAMSInstructionsMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsAmsInstructionsApi.previewAMSInstructions, - { positionId: string; amsInstructionsId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId })); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions( - positionId, - amsInstructionsId, - officeId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, amsInstructionsId, officeId } = variables; - const updateKeys = [keys.previewAMSInstructions(positionId, amsInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateAMSInstructions` - * @summary Generate AMS Instructions document - * @permission Requires `canUseGenerateAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateAMSInstructions = ( - options?: AppMutationOptions< - typeof WorkingDocumentsAmsInstructionsApi.generateAMSInstructions, - { - positionId: string; - amsInstructionsId: string; - officeId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId })); - return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions( - positionId, - amsInstructionsId, - officeId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts deleted file mode 100644 index 11d2d8f..0000000 --- a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsBlInstructionsAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Create", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Create", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `useGetBlInstructionsData` query ability. For global ability, omit the object parameter. - * @description Read BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBlInstructionsData` query - */ - export const canUseGetBlInstructionsData = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `useUpdateBlInstructionsData` mutation ability. For global ability, omit the object parameter. - * @description Update BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBlInstructionsData` mutation - */ - export const canUseUpdateBlInstructionsData = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `useDeleteBlInstructions` mutation ability. For global ability, omit the object parameter. - * @description Delete BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBlInstructions` mutation - */ - export const canUseDeleteBlInstructions = (object?: { officeId: string }) => - [ - "Delete", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Delete", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation - */ - export const canUsePreviewBlInstructions = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Read", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `useGenerateBlInstructions` mutation ability. For global ability, omit the object parameter. - * @description Generate BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateBlInstructions` mutation - */ - export const canUseGenerateBlInstructions = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; - - /** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate BL Instructions document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ - export const canUseGenerateDocumentEml = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions", - ] as AbilityTuple< - "Update", - "WorkingDocument-bl-instructions" | (ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts deleted file mode 100644 index b212601..0000000 --- a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsBlInstructionsApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions`, - undefined, - config, - ); - }; - export const getBlInstructionsData = ( - positionId: string, - blInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - config, - ); - }; - export const updateBlInstructionsData = ( - positionId: string, - blInstructionsId: string, - officeId: string, - data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), - config, - ); - }; - export const deleteBlInstructions = ( - positionId: string, - blInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - undefined, - config, - ); - }; - export const previewBlInstructions = ( - positionId: string, - blInstructionsId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generateBlInstructions = ( - positionId: string, - blInstructionsId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; - export const generateDocumentEml = ( - positionId: string, - blInstructionsId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; -} diff --git a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts deleted file mode 100644 index f1fe31c..0000000 --- a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts +++ /dev/null @@ -1,472 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsBlInstructionsModels { - /** - * BlInstructionsDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { string } date Date - * @property { string } location Location - * @property { string } signer Siger - */ - export const BlInstructionsDocumentSettingsDtoDTOSchema = z - .object({ - quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), - date: z.iso.datetime({ offset: true }).describe("Date"), - location: z.string().describe("Location"), - signer: z.string().describe("Siger"), - }) - .readonly(); - export type BlInstructionsDocumentSettingsDtoDTO = z.infer; - - /** - * BlInstructionsDocumentCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ - export const BlInstructionsDocumentCountryResponseDTOSchema = z - .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) - .readonly(); - export type BlInstructionsDocumentCountryResponseDTO = z.infer; - - /** - * BlInstructionsDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - * @property { string } eori EORI number of the business partner - * @property { string } vatNumber VAT number of the business partner - */ - export const BlInstructionsDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - eori: z.string().describe("EORI number of the business partner"), - vatNumber: z.string().describe("VAT number of the business partner"), - }) - .readonly(); - export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer< - typeof BlInstructionsDocumentBusinessPartnerResponseDTOSchema - >; - - /** - * BlInstructionsDocumentPlaceResponseDTOSchema - * @type { object } - * @property { string } id ID of the place - * @property { string } name Name of the place - */ - export const BlInstructionsDocumentPlaceResponseDTOSchema = z - .object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }) - .readonly(); - export type BlInstructionsDocumentPlaceResponseDTO = z.infer; - - /** - * AllChargesEnumSchema - * @type { enum } - */ - export const AllChargesEnumSchema = z.enum(["Prepaid", "Collect", "Automatic", "Detailed"]); - export type AllChargesEnum = z.infer; - export const AllChargesEnum = AllChargesEnumSchema.enum; - - /** - * BlInstructionsDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - * @property { string } countryCode Country ISO2 code of the port - */ - export const BlInstructionsDocumentPortResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the port"), - name: z.string().describe("Name of the port"), - countryCode: z.string().describe("Country ISO2 code of the port"), - }) - .readonly(); - export type BlInstructionsDocumentPortResponseDTO = z.infer; - - /** - * RequestedDocumentTypeEnumSchema - * @type { enum } - */ - export const RequestedDocumentTypeEnumSchema = z.enum(["SeawayBill", "Original"]); - export type RequestedDocumentTypeEnum = z.infer; - export const RequestedDocumentTypeEnum = RequestedDocumentTypeEnumSchema.enum; - - /** - * ManifestFilerStatusEnumSchema - * @type { enum } - */ - export const ManifestFilerStatusEnumSchema = z.enum(["Self", "Carrier"]); - export type ManifestFilerStatusEnum = z.infer; - export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; - - /** - * BlInstructionsDocumentCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ - export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); - export type BlInstructionsDocumentCountryDto = z.infer; - - /** - * BlInstructionsDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the BL Instructions document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the BL Instructions document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } date Date of the BL Instructions document - * @property { string } blNumber Bill of lading number - * @property { string } exportReference Export reference number - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { BlInstructionsDocumentCountryResponseDTO } originCountry Origin country - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } additionalText Additional text for the document - * @property { number } versionNumber Version number of the document - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } buyer Buyer information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } seller Seller information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } forwarder Forwarder party information - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information - * @property { BlInstructionsDocumentPlaceResponseDTO } stowedIntoContainerCity Stowed into container city information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfAcceptanceCity Place of acceptance city information - * @property { BlInstructionsDocumentPlaceResponseDTO } originalsToBeReleasedAt - * @property { string } originalsToBeReleasedAtText - * @property { BlInstructionsDocumentPlaceResponseDTO } loadingPierTerminal - * @property { string } loadingPierTerminalText - * @property { string } precarriageByText - * @property { string } placeOfReceiptText - * @property { string } portOfLoadingText - * @property { string } portOfDischargeText - * @property { string } placeOfDeliveryText - * @property { string } vessel Name of the vessel - * @property { string } voyage Name of the vessel - * @property { CommonModels.MovementTypeEnum } movementType - * @property { string } carrierBookingNumber - * @property { string } csnNumber - * @property { string } mcinNumber - * @property { string } pcinNumber - * @property { string } dueNumber - * @property { boolean } goodsDeliveredInEu - * @property { string } rucNumber - * @property { number } shipmentDeclaredValue - * @property { string } shipmentDeclaredValueCurrency - * @property { AllChargesEnum } allCharges Base freight payment term - * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term - * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term - * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term - * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term - * @property { string } shippingInstructionsComments Free-text shipping instructions comments - * @property { string } chargePayerId Charge payer business partner ID - * @property { string } chargePayLocationId Charge pay location ID - * @property { BlInstructionsDocumentPortResponseDTO } portOfLoading Port of loading information - * @property { BlInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information - * @property { BlInstructionsDocumentSettingsDtoDTO } settings Settings for the BL Instructions document - * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data - * @property { CommonModels.CargoTableBlockDto } cargo Cargo table block (identical to House BL cargo) - * @property { string } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document - * @property { RequestedDocumentTypeEnum } requestedDocumentType - * @property { boolean } requestedDocumentFreighted - * @property { number } requestedDocumentQuantity - * @property { ManifestFilerStatusEnum } manifestFilerStatus - * @property { string } manifestFilerIdentifier - * @property { BlInstructionsDocumentCountryDto } manifestFilingCountry - */ - export const BlInstructionsDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the BL Instructions document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference").nullish(), - name: z.string().describe("Name of the BL Instructions document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document").nullish(), - blNumber: z.string().describe("Bill of lading number").nullish(), - exportReference: z.string().describe("Export reference number").nullish(), - direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), - transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), - originCountry: BlInstructionsDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), - useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), - additionalText: z.string().describe("Additional text for the document").nullish(), - versionNumber: z.number().describe("Version number of the document"), - buyer: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( - "Buyer information for the shipment", - ).nullish(), - seller: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( - "Seller information for the shipment", - ).nullish(), - consignee: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( - "Consignee information for the shipment", - ), - shipper: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), - notify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( - "Notify party information for the shipment", - ), - alsoNotify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe( - "Additional notify party information", - ), - forwarder: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Forwarder party information"), - precarriageBy: - BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), - placeOfReceipt: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), - stowedIntoContainerCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe( - "Stowed into container city information", - ).nullish(), - placeOfAcceptanceCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe( - "Place of acceptance city information", - ).nullish(), - originalsToBeReleasedAt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), - originalsToBeReleasedAtText: z.string().nullish(), - loadingPierTerminal: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), - loadingPierTerminalText: z.string().nullish(), - precarriageByText: z.string().nullish(), - placeOfReceiptText: z.string().nullish(), - portOfLoadingText: z.string().nullish(), - portOfDischargeText: z.string().nullish(), - placeOfDeliveryText: z.string().nullish(), - vessel: z.string().describe("Name of the vessel").nullish(), - voyage: z.string().describe("Name of the vessel").nullish(), - movementType: CommonModels.MovementTypeEnumSchema.nullish(), - carrierBookingNumber: z.string().nullish(), - csnNumber: z.string().nullish(), - mcinNumber: z.string().nullish(), - pcinNumber: z.string().nullish(), - dueNumber: z.string().nullish(), - goodsDeliveredInEu: z.boolean().nullish(), - rucNumber: z.string().nullish(), - shipmentDeclaredValue: z.number().nullish(), - shipmentDeclaredValueCurrency: z.string().nullish(), - allCharges: AllChargesEnumSchema.describe("Base freight payment term").nullish(), - baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term").nullish(), - additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term").nullish(), - originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( - "Origin haulage charges payment term", - ).nullish(), - originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term").nullish(), - destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe( - "Destination port charges payment term", - ).nullish(), - destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( - "Destination haulage charges payment term", - ).nullish(), - shippingInstructionsComments: z.string().describe("Free-text shipping instructions comments").nullish(), - chargePayerId: z.string().describe("Charge payer business partner ID").nullish(), - chargePayLocationId: z.string().describe("Charge pay location ID").nullish(), - portOfLoading: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), - portOfDischarge: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), - placeOfDelivery: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), - settings: BlInstructionsDocumentSettingsDtoDTOSchema.describe( - "Settings for the BL Instructions document", - ).nullish(), - data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), - cargo: CommonModels.CargoTableBlockDtoSchema.describe( - "Cargo table block (identical to House BL cargo)", - ).nullish(), - bodyRemarks: z.string().describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document"), - requestedDocumentType: RequestedDocumentTypeEnumSchema.nullish(), - requestedDocumentFreighted: z.boolean().nullish(), - requestedDocumentQuantity: z.number().nullish(), - manifestFilerStatus: ManifestFilerStatusEnumSchema.nullish(), - manifestFilerIdentifier: z.string().nullish(), - manifestFilingCountry: BlInstructionsDocumentCountryDtoSchema.nullish(), - }) - .readonly(); - export type BlInstructionsDocumentResponseDTO = z.infer; - - /** - * UpdateBlInstructionsDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { string } blNumber BL number - * @property { string } exportReference Export reference number - * @property { string } location Location - * @property { string } signer Signer - * @property { string } date Date - */ - export const UpdateBlInstructionsDocumentSettingsRequestDTOSchema = z - .object({ - quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), - blNumber: z.string().describe("BL number"), - exportReference: z.string().describe("Export reference number"), - location: z.string().describe("Location"), - signer: z.string().describe("Signer"), - date: z.iso.datetime({ offset: true }).describe("Date"), - }) - .readonly(); - export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer< - typeof UpdateBlInstructionsDocumentSettingsRequestDTOSchema - >; - - /** - * UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema - >; - - /** - * UpdateBlInstructionsDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } blNumber Bill of lading number - * @property { string } exportReference Export reference number - * @property { string } csnNumber - * @property { string } mcinNumber - * @property { string } pcinNumber - * @property { string } dueNumber - * @property { boolean } goodsDeliveredInEu - * @property { string } rucNumber - * @property { string } shipmentDeclaredValueCurrency - * @property { number } shipmentDeclaredValue - * @property { AllChargesEnum } allCharges All charges payment term - * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term - * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term - * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term - * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term - * @property { string } originCountryId Origin country ID - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } additionalText Additional text - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } buyer Buyer information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } seller Seller information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } forwarder Forwarder information - * @property { string } originalsToBeReleasedAtId Originals to be released at ID - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information - * @property { string } shippingInstructionsComments Shipping instructions free-text comments - * @property { string } chargePayerId Charge payer business partner ID - * @property { string } chargePayLocationId Charge pay location ID - * @property { string } precarriageById Pre-carriage by ID - * @property { string } placeOfReceiptId Place of receipt ID - * @property { string } stowedIntoContainerCityId Stowed into container city ID - * @property { string } loadingPierTerminalId Loading pier/terminal ID - * @property { string } loadingPierTerminalText - * @property { string } placeOfAcceptanceCityId Place of acceptance city ID - * @property { string } vessel Vessel name - * @property { string } voyage Vessel name - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } portOfLoadingId Port of loading ID - * @property { string } portOfDischargeId Port of discharge ID - * @property { string } placeOfDeliveryId Place of delivery ID - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { string } date Date of the BL Instructions document - * @property { UpdateBlInstructionsDocumentSettingsRequestDTO } settings Settings - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data - * @property { RequestedDocumentTypeEnum } requestedDocumentType - * @property { boolean } requestedDocumentFreighted - * @property { number } requestedDocumentQuantity - * @property { string } precarriageByText - * @property { string } placeOfReceiptText - * @property { string } portOfLoadingText - * @property { string } portOfDischargeText - * @property { string } placeOfDeliveryText - * @property { ManifestFilerStatusEnum } manifestFilerStatus - * @property { string } manifestFilingCountryId - * @property { string } manifestFilerIdentifier - */ - export const UpdateBlInstructionsDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Document name suffix"), - blNumber: z.string().describe("Bill of lading number"), - exportReference: z.string().describe("Export reference number"), - csnNumber: z.string(), - mcinNumber: z.string(), - pcinNumber: z.string(), - dueNumber: z.string(), - goodsDeliveredInEu: z.boolean(), - rucNumber: z.string(), - shipmentDeclaredValueCurrency: z.string(), - shipmentDeclaredValue: z.number(), - allCharges: AllChargesEnumSchema.describe("All charges payment term"), - baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term"), - additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term"), - originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin haulage charges payment term"), - originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term"), - destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination port charges payment term"), - destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe( - "Destination haulage charges payment term", - ), - originCountryId: z.string().describe("Origin country ID"), - useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), - additionalText: z.string().describe("Additional text"), - consignee: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), - shipper: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), - buyer: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), - seller: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), - forwarder: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), - originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), - originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), - notify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), - alsoNotify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), - shippingInstructionsComments: z.string().describe("Shipping instructions free-text comments"), - chargePayerId: z.string().describe("Charge payer business partner ID"), - chargePayLocationId: z.string().describe("Charge pay location ID"), - precarriageById: z.string().describe("Pre-carriage by ID"), - placeOfReceiptId: z.string().describe("Place of receipt ID"), - stowedIntoContainerCityId: z.string().describe("Stowed into container city ID"), - loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), - loadingPierTerminalText: z.string(), - placeOfAcceptanceCityId: z.string().describe("Place of acceptance city ID"), - vessel: z.string().describe("Vessel name"), - voyage: z.string().describe("Vessel name"), - carrierBookingNumber: z.string().describe("Carrier booking number"), - portOfLoadingId: z.string().describe("Port of loading ID"), - portOfDischargeId: z.string().describe("Port of discharge ID"), - placeOfDeliveryId: z.string().describe("Place of delivery ID"), - suppressWeight: z.boolean().describe("Whether to suppress weight information"), - suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), - bodyRemarks: z.string().describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document"), - settings: UpdateBlInstructionsDocumentSettingsRequestDTOSchema.describe("Settings"), - data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), - requestedDocumentType: RequestedDocumentTypeEnumSchema, - requestedDocumentFreighted: z.boolean(), - requestedDocumentQuantity: z.number(), - precarriageByText: z.string(), - placeOfReceiptText: z.string(), - portOfLoadingText: z.string(), - portOfDischargeText: z.string(), - placeOfDeliveryText: z.string(), - manifestFilerStatus: ManifestFilerStatusEnumSchema, - manifestFilingCountryId: z.string(), - manifestFilerIdentifier: z.string(), - }) - .readonly(); - export type UpdateBlInstructionsDocumentRequestDTO = z.infer; -} diff --git a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts b/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts deleted file mode 100644 index 9736675..0000000 --- a/test/generated/dist/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts +++ /dev/null @@ -1,341 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsBlInstructionsAcl } from "./workingDocumentsBlInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsBlInstructionsApi } from "./workingDocumentsBlInstructions.api"; - -export namespace WorkingDocumentsBlInstructionsQueries { - export const moduleName = QueryModule.WorkingDocumentsBlInstructions; - - export const keys = { - all: [moduleName] as const, - getBlInstructionsData: (positionId: string, blInstructionsId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId", - positionId, - blInstructionsId, - officeId, - ] as const, - previewBlInstructions: (positionId: string, blInstructionsId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId/preview", - positionId, - blInstructionsId, - officeId, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create a BL Instructions document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.create, - { positionId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId })); - return WorkingDocumentsBlInstructionsApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetBlInstructionsData` - * @summary Get BL Instructions document data - * @permission Requires `canUseGetBlInstructionsData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.blInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetBlInstructionsData = ( - { positionId, blInstructionsId, officeId }: { positionId: string; blInstructionsId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId })); - return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateBlInstructionsData` - * @summary Update BL Instructions document data - * @permission Requires `canUseUpdateBlInstructionsData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateBlInstructionsData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.updateBlInstructionsData, - { - positionId: string; - blInstructionsId: string; - officeId: string; - data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId })); - return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData( - positionId, - blInstructionsId, - officeId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.getBlInstructionsData(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteBlInstructions` - * @summary Delete BL Instructions document - * @permission Requires `canUseDeleteBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } BL Instructions document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteBlInstructions = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.deleteBlInstructions, - { positionId: string; blInstructionsId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId })); - return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewBlInstructions` - recommended when file should be cached - * @summary Preview BL Instructions document - * @permission Requires `canUsePreviewBlInstructions` ability - * @param { string } object.positionId Path parameter - * @param { string } object.blInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewBlInstructions = ( - { positionId, blInstructionsId, officeId }: { positionId: string; blInstructionsId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId })); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewBlInstructionsMutation` - recommended when file should not be cached - * @summary Preview BL Instructions document - * @permission Requires `canUsePreviewBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewBlInstructionsMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.previewBlInstructions, - { positionId: string; blInstructionsId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId })); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateBlInstructions` - * @summary Generate BL Instructions document - * @permission Requires `canUseGenerateBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateBlInstructions = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.generateBlInstructions, - { - positionId: string; - blInstructionsId: string; - officeId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId })); - return WorkingDocumentsBlInstructionsApi.generateBlInstructions( - positionId, - blInstructionsId, - officeId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate BL Instructions document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGenerateDocumentEml = ( - options?: AppMutationOptions< - typeof WorkingDocumentsBlInstructionsApi.generateDocumentEml, - { - positionId: string; - blInstructionsId: string; - officeId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId })); - return WorkingDocumentsBlInstructionsApi.generateDocumentEml( - positionId, - blInstructionsId, - officeId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts deleted file mode 100644 index 2e1de75..0000000 --- a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsCmrFormAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Create", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; - - /** - * Use for `useGetCmrData` query ability. For global ability, omit the object parameter. - * @description Read CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCmrData` query - */ - export const canUseGetCmrData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Read", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; - - /** - * Use for `useUpdateCmrData` mutation ability. For global ability, omit the object parameter. - * @description Update CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCmrData` mutation - */ - export const canUseUpdateCmrData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Update", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; - - /** - * Use for `useDeleteCmr` mutation ability. For global ability, omit the object parameter. - * @description Delete CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCmr` mutation - */ - export const canUseDeleteCmr = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Delete", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; - - /** - * Use for `usePreviewCmr` query or `usePreviewCmrMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewCmr` query or `usePreviewCmrMutation` mutation - */ - export const canUsePreviewCmr = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Read", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; - - /** - * Use for `useGenerateCmr` mutation ability. For global ability, omit the object parameter. - * @description Generate CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateCmr` mutation - */ - export const canUseGenerateCmr = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form"] as AbilityTuple< - "Update", - "WorkingDocument-cmr-form" | (ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts deleted file mode 100644 index 9300c74..0000000 --- a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsCmrFormApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs`, - undefined, - config, - ); - }; - export const getCmrData = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - config, - ); - }; - export const updateCmrData = ( - positionId: string, - cmrId: string, - officeId: string, - data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), - config, - ); - }; - export const deleteCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - undefined, - config, - ); - }; - export const previewCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generateCmr = ( - positionId: string, - cmrId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts deleted file mode 100644 index 4cc9266..0000000 --- a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts +++ /dev/null @@ -1,320 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsCmrFormModels { - /** - * CmrDocumentLanguageSchema - * @type { enum } - */ - export const CmrDocumentLanguageSchema = z.enum(["en", "fr", "de"]); - export type CmrDocumentLanguage = z.infer; - export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; - - /** - * CmrDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CmrDocumentLanguage } primaryLanguage Primary language - * @property { CmrDocumentLanguage } secondaryLanguage Secondary language - */ - export const CmrDocumentSettingsDtoDTOSchema = z - .object({ - primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), - secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language"), - }) - .readonly(); - export type CmrDocumentSettingsDtoDTO = z.infer; - - /** - * CmrDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const CmrDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type CmrDocumentBusinessPartnerResponseDTO = z.infer; - - /** - * CmrDocumentCityResponseDTOSchema - * @type { object } - * @property { string } cityId ID of the city - * @property { string } cityName Name of the city - * @property { string } date Date of delivery/takeover - * @property { string } countryName Country name - */ - export const CmrDocumentCityResponseDTOSchema = z - .object({ - cityId: z.string().describe("ID of the city"), - cityName: z.string().describe("Name of the city"), - date: z.iso.datetime({ offset: true }).describe("Date of delivery/takeover").nullish(), - countryName: z.string().describe("Country name").nullish(), - }) - .readonly(); - export type CmrDocumentCityResponseDTO = z.infer; - - /** - * CmrDocumentCostsResponseDTOSchema - * @type { object } - * @property { number } carriageCharges Carriage charges - * @property { number } reductions Reductions - * @property { number } balance Balance - * @property { number } supplements Supplements - * @property { number } miscellaneous Miscellaneous charges - * @property { number } total Total amount - */ - export const CmrDocumentCostsResponseDTOSchema = z - .object({ - carriageCharges: z.number().describe("Carriage charges"), - reductions: z.number().describe("Reductions"), - balance: z.number().describe("Balance"), - supplements: z.number().describe("Supplements"), - miscellaneous: z.number().describe("Miscellaneous charges"), - total: z.number().describe("Total amount"), - }) - .readonly(); - export type CmrDocumentCostsResponseDTO = z.infer; - - /** - * CmrDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { number } quantity Quantity of packages - * @property { string } description Description of the cargo - * @property { string } packageType - * @property { string } statisticNumber - * @property { string } positionNumber Position number of the cargo - * @property { number } grossWeight Gross weight of the cargo - * @property { number } volume Volume of the cargo - * @property { string } containerNumber Container number of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - */ - export const CmrDocumentCargoResponseDTOSchema = z - .object({ - caseMarks: z.string().describe("Case marks of the cargo"), - quantity: z.number().describe("Quantity of packages"), - description: z.string().describe("Description of the cargo"), - packageType: z.string(), - statisticNumber: z.string(), - positionNumber: z.string().describe("Position number of the cargo"), - grossWeight: z.number().describe("Gross weight of the cargo"), - volume: z.number().describe("Volume of the cargo"), - containerNumber: z.string().describe("Container number of the cargo"), - seal1: z.string().describe("Seal number 1 of the cargo"), - seal2: z.string().describe("Seal number 2 of the cargo"), - }) - .readonly(); - export type CmrDocumentCargoResponseDTO = z.infer; - - /** - * CmrDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } positionNumber Position number - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { number } versionNumber Version number of the document - * @property { string } cmrNumber CMR number - * @property { CmrDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { CmrDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { CmrDocumentBusinessPartnerResponseDTO } carrier Carrier information - * @property { CmrDocumentBusinessPartnerResponseDTO } successiveCarrier Successive carrier information - * @property { CmrDocumentCityResponseDTO } delivery Delivery information - * @property { CmrDocumentCityResponseDTO } takeover Takeover information - * @property { string } annexedDocuments Annexed documents - * @property { string } carriersObservations Carriers observations - * @property { string } senderInstructions Sender instructions - * @property { string } reimbursement Reimbursement information - * @property { string } specialAgreements Special agreements - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { boolean } freightPaid Whether freight is paid - * @property { boolean } freightToBePaid Whether freight is to be paid - * @property { string } creationPlace Place of creation - * @property { string } creationDate Date of creation - * @property { CmrDocumentCostsResponseDTO } costsForShipper Costs for shipper - * @property { CmrDocumentCostsResponseDTO } costsForConsignee Costs for consignee - * @property { string[] } selectedCargoIds List of selected cargo IDs - * @property { CmrDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CmrDocumentSettingsDtoDTO } settings Settings for the BL Instructions document - */ - export const CmrDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the document"), - name: z.string().describe("Name of the document"), - positionNumber: z.string().describe("Position number"), - nameSuffix: z.string().describe("Name suffix of the document").nullish(), - defaultFileName: z.string(), - positionId: z.string().describe("Position ID"), - versionNumber: z.number().describe("Version number of the document"), - cmrNumber: z.string().describe("CMR number").nullish(), - consignee: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), - shipper: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), - carrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Carrier information").nullish(), - successiveCarrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe( - "Successive carrier information", - ).nullish(), - delivery: CmrDocumentCityResponseDTOSchema.describe("Delivery information").nullish(), - takeover: CmrDocumentCityResponseDTOSchema.describe("Takeover information").nullish(), - annexedDocuments: z.string().describe("Annexed documents").nullish(), - carriersObservations: z.string().describe("Carriers observations").nullish(), - senderInstructions: z.string().describe("Sender instructions").nullish(), - reimbursement: z.string().describe("Reimbursement information").nullish(), - specialAgreements: z.string().describe("Special agreements").nullish(), - suppressWeight: z.boolean().describe("Whether to suppress weight information"), - suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), - freightPaid: z.boolean().describe("Whether freight is paid"), - freightToBePaid: z.boolean().describe("Whether freight is to be paid"), - creationPlace: z.string().describe("Place of creation"), - creationDate: z.string().describe("Date of creation"), - costsForShipper: CmrDocumentCostsResponseDTOSchema.describe("Costs for shipper").nullish(), - costsForConsignee: CmrDocumentCostsResponseDTOSchema.describe("Costs for consignee").nullish(), - selectedCargoIds: z.array(z.string()).readonly().describe("List of selected cargo IDs"), - cargo: z.array(CmrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), - config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - settings: CmrDocumentSettingsDtoDTOSchema.describe("Settings for the BL Instructions document").nullish(), - }) - .readonly(); - export type CmrDocumentResponseDTO = z.infer; - - /** - * UpdateCmrDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CmrDocumentLanguage } primaryLanguage Primary language - * @property { CmrDocumentLanguage } secondaryLanguage Secondary language - */ - export const UpdateCmrDocumentSettingsRequestDTOSchema = z - .object({ - primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), - secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language"), - }) - .readonly(); - export type UpdateCmrDocumentSettingsRequestDTO = z.infer; - - /** - * UpdateCmrDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateCmrDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateCmrDocumentBusinessPartnerRequestDTOSchema - >; - - /** - * UpdateCmrDocumentDeliveryRequestDTOSchema - * @type { object } - * @property { string } cityId City ID - * @property { string } cityName City name - * @property { string } date Date - */ - export const UpdateCmrDocumentDeliveryRequestDTOSchema = z - .object({ - cityId: z.string().describe("City ID"), - cityName: z.string().describe("City name"), - date: z.iso.datetime({ offset: true }).describe("Date"), - }) - .readonly(); - export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; - - /** - * UpdateCmrDocumentCostsRequestDTOSchema - * @type { object } - * @property { number } carriageCharges Carriage charges - * @property { number } reductions Reductions - * @property { number } balance Balance - * @property { number } supplements Supplements - * @property { number } miscellaneous Miscellaneous - * @property { number } total Total - */ - export const UpdateCmrDocumentCostsRequestDTOSchema = z - .object({ - carriageCharges: z.number().describe("Carriage charges"), - reductions: z.number().describe("Reductions"), - balance: z.number().describe("Balance"), - supplements: z.number().describe("Supplements"), - miscellaneous: z.number().describe("Miscellaneous"), - total: z.number().describe("Total"), - }) - .readonly(); - export type UpdateCmrDocumentCostsRequestDTO = z.infer; - - /** - * UpdateCmrDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } cmrNumber CMR number - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } carrier Carrier information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } successiveCarrier Successive carrier information - * @property { UpdateCmrDocumentDeliveryRequestDTO } delivery Delivery information - * @property { UpdateCmrDocumentDeliveryRequestDTO } takeover Takeover information - * @property { string } annexedDocuments Annexed documents - * @property { string } carriersObservations Carriers observations - * @property { string } senderInstructions Sender instructions - * @property { string } reimbursement Reimbursement - * @property { string } specialAgreements Special agreements - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { boolean } freightPaid Whether freight is paid - * @property { boolean } freightToBePaid Whether freight is to be paid - * @property { string } creationPlace Place of creation - * @property { string } creationDate Date of creation - * @property { UpdateCmrDocumentCostsRequestDTO } costsForShipper Costs for shipper - * @property { UpdateCmrDocumentCostsRequestDTO } costsForConsignee Costs for consignee - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { UpdateCmrDocumentSettingsRequestDTO } settings Settings - */ - export const UpdateCmrDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Name suffix"), - cmrNumber: z.string().describe("CMR number"), - consignee: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), - shipper: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), - carrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Carrier information"), - successiveCarrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Successive carrier information"), - delivery: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Delivery information"), - takeover: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Takeover information"), - annexedDocuments: z.string().describe("Annexed documents"), - carriersObservations: z.string().describe("Carriers observations"), - senderInstructions: z.string().describe("Sender instructions"), - reimbursement: z.string().describe("Reimbursement"), - specialAgreements: z.string().describe("Special agreements"), - suppressWeight: z.boolean().describe("Whether to suppress weight information"), - suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), - freightPaid: z.boolean().describe("Whether freight is paid"), - freightToBePaid: z.boolean().describe("Whether freight is to be paid"), - creationPlace: z.string().describe("Place of creation"), - creationDate: z.string().describe("Date of creation"), - costsForShipper: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for shipper"), - costsForConsignee: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for consignee"), - selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - settings: UpdateCmrDocumentSettingsRequestDTOSchema.describe("Settings"), - }) - .readonly(); - export type UpdateCmrDocumentRequestDTO = z.infer; -} diff --git a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts b/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts deleted file mode 100644 index 213063b..0000000 --- a/test/generated/dist/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsCmrFormAcl } from "./workingDocumentsCmrForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsCmrFormApi } from "./workingDocumentsCmrForm.api"; - -export namespace WorkingDocumentsCmrFormQueries { - export const moduleName = QueryModule.WorkingDocumentsCmrForm; - - export const keys = { - all: [moduleName] as const, - getCmrData: (positionId: string, cmrId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId", positionId, cmrId, officeId] as const, - previewCmr: (positionId: string, cmrId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/cmrs/:cmrId/preview", - positionId, - cmrId, - officeId, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create a CMR document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId })); - return WorkingDocumentsCmrFormApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetCmrData` - * @summary Get CMR document data - * @permission Requires `canUseGetCmrData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.cmrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetCmrData = ( - { positionId, cmrId, officeId }: { positionId: string; cmrId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCmrData(positionId, cmrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId })); - return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateCmrData` - * @summary Update CMR document data - * @permission Requires `canUseUpdateCmrData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateCmrData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsCmrFormApi.updateCmrData, - { - positionId: string; - cmrId: string; - officeId: string; - data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId, data }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId })); - return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, cmrId, officeId } = variables; - const updateKeys = [keys.getCmrData(positionId, cmrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteCmr` - * @summary Delete CMR document - * @permission Requires `canUseDeleteCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } CMR document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteCmr = ( - options?: AppMutationOptions< - typeof WorkingDocumentsCmrFormApi.deleteCmr, - { positionId: string; cmrId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId })); - return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewCmr` - recommended when file should be cached - * @summary Preview CMR document - * @permission Requires `canUsePreviewCmr` ability - * @param { string } object.positionId Path parameter - * @param { string } object.cmrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewCmr = ( - { positionId, cmrId, officeId }: { positionId: string; cmrId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewCmr(positionId, cmrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId })); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewCmrMutation` - recommended when file should not be cached - * @summary Preview CMR document - * @permission Requires `canUsePreviewCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewCmrMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsCmrFormApi.previewCmr, - { positionId: string; cmrId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId })); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, cmrId, officeId } = variables; - const updateKeys = [keys.previewCmr(positionId, cmrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateCmr` - * @summary Generate CMR document - * @permission Requires `canUseGenerateCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateCmr = ( - options?: AppMutationOptions< - typeof WorkingDocumentsCmrFormApi.generateCmr, - { positionId: string; cmrId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId, data }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId })); - return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts deleted file mode 100644 index 96a5c3a..0000000 --- a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsExportDeclarationAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Create", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Create", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; - - /** - * Use for `useGetExportDeclarationData` query ability. For global ability, omit the object parameter. - * @description Read export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetExportDeclarationData` query - */ - export const canUseGetExportDeclarationData = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Read", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; - - /** - * Use for `useUpdateExportDeclarationData` mutation ability. For global ability, omit the object parameter. - * @description Update export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateExportDeclarationData` mutation - */ - export const canUseUpdateExportDeclarationData = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Update", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; - - /** - * Use for `useDeleteExportDeclaration` mutation ability. For global ability, omit the object parameter. - * @description Delete export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteExportDeclaration` mutation - */ - export const canUseDeleteExportDeclaration = (object?: { officeId: string }) => - [ - "Delete", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Delete", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; - - /** - * Use for `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation - */ - export const canUsePreviewExportDeclaration = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Read", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; - - /** - * Use for `useGenerateExportDeclaration` mutation ability. For global ability, omit the object parameter. - * @description Generate export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateExportDeclaration` mutation - */ - export const canUseGenerateExportDeclaration = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration", - ] as AbilityTuple< - "Update", - | "WorkingDocument-export-declaration" - | (ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts deleted file mode 100644 index 910ef10..0000000 --- a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsExportDeclarationApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations`, - undefined, - config, - ); - }; - export const getExportDeclarationData = ( - officeId: string, - positionId: string, - exportDeclarationId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - config, - ); - }; - export const updateExportDeclarationData = ( - officeId: string, - positionId: string, - exportDeclarationId: string, - data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), - config, - ); - }; - export const deleteExportDeclaration = ( - positionId: string, - exportDeclarationId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - undefined, - config, - ); - }; - export const previewExportDeclaration = ( - officeId: string, - positionId: string, - exportDeclarationId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generateExportDeclaration = ( - officeId: string, - positionId: string, - exportDeclarationId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts deleted file mode 100644 index 3aca835..0000000 --- a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsExportDeclarationModels { - /** - * ExportDeclarationDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer< - typeof ExportDeclarationDocumentBusinessPartnerResponseDTOSchema - >; - - /** - * ExportDeclarationDocumentCargoResponseDTOSchema - * @type { object } - * @property { number } quantity Quantity of packages - * @property { number } weight Weight of the cargo - * @property { number } length Length of the cargo - * @property { number } width Width of the cargo - * @property { number } height Height of the cargo - * @property { string } packageType Type of package - * @property { string } positionNumber Position number - */ - export const ExportDeclarationDocumentCargoResponseDTOSchema = z - .object({ - quantity: z.number().describe("Quantity of packages"), - weight: z.number().describe("Weight of the cargo"), - length: z.number().describe("Length of the cargo"), - width: z.number().describe("Width of the cargo"), - height: z.number().describe("Height of the cargo"), - packageType: z.string().describe("Type of package"), - positionNumber: z.string().describe("Position number"), - }) - .readonly(); - export type ExportDeclarationDocumentCargoResponseDTO = z.infer< - typeof ExportDeclarationDocumentCargoResponseDTOSchema - >; - - /** - * ExportDeclarationDocumentRouteResponseDTOSchema - * @type { object } - * @property { string } pickupDate Pickup date - * @property { string } deliveryDate Delivery date - * @property { string } pickupCity Pickup city - * @property { string } deliveryCity Delivery city - */ - export const ExportDeclarationDocumentRouteResponseDTOSchema = z - .object({ - pickupDate: z.string().describe("Pickup date"), - deliveryDate: z.string().describe("Delivery date"), - pickupCity: z.string().describe("Pickup city"), - deliveryCity: z.string().describe("Delivery city"), - }) - .readonly(); - export type ExportDeclarationDocumentRouteResponseDTO = z.infer< - typeof ExportDeclarationDocumentRouteResponseDTOSchema - >; - - /** - * ExportDeclarationDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the export declaration document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the export declaration document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } dateOfHandover Date when the goods are handed over for export - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { string } issuerName Name of the issuer - * @property { string } issuerAddress Address of the issuer - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } customer Customer information - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { string } selectedCargoId ID of the selected cargo - * @property { ExportDeclarationDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { ExportDeclarationDocumentRouteResponseDTO } route Route information - * @property { string } signingPlace Place where the document is signed - * @property { string } signingDate Date when the document is signed - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } signedBy Information about who signed the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ - export const ExportDeclarationDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the export declaration document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference").nullish(), - name: z.string().describe("Name of the export declaration document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - dateOfHandover: z.iso - .datetime({ offset: true }) - .describe("Date when the goods are handed over for export") - .nullish(), - direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), - transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), - versionNumber: z.number().describe("Version number of the document"), - issuerName: z.string().describe("Name of the issuer").nullish(), - issuerAddress: z.string().describe("Address of the issuer").nullish(), - customer: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Customer information").nullish(), - shipper: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), - consignee: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), - selectedCargoId: z.string().describe("ID of the selected cargo").nullish(), - cargo: z - .array(ExportDeclarationDocumentCargoResponseDTOSchema) - .readonly() - .describe("List of cargo information") - .nullish(), - route: ExportDeclarationDocumentRouteResponseDTOSchema.describe("Route information").nullish(), - signingPlace: z.string().describe("Place where the document is signed").nullish(), - signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed").nullish(), - signedBy: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe( - "Information about who signed the document", - ).nullish(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document").nullish(), - }) - .readonly(); - export type ExportDeclarationDocumentResponseDTO = z.infer; - - /** - * UpdateExportDeclarationDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } dateOfHandover Date when goods are handed over for export - * @property { string } issuerName Name of the issuer - * @property { string } issuerAddress Address of the issuer - * @property { string } customerId Customer ID - * @property { string } customerAddress Customer address - * @property { string } shipperId Shipper ID - * @property { string } shipperAddress Shipper address - * @property { string } consigneeId Consignee ID - * @property { string } consigneeAddress Consignee address - * @property { string } selectedCargoId Selected cargo ID - * @property { string } signingPlace Place where the document is signed - * @property { string } signingDate Date when the document is signed - * @property { string } signedByEmployeeId ID of the employee who signed the document - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateExportDeclarationDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Name suffix"), - dateOfHandover: z.iso.datetime({ offset: true }).describe("Date when goods are handed over for export"), - issuerName: z.string().describe("Name of the issuer"), - issuerAddress: z.string().describe("Address of the issuer"), - customerId: z.string().describe("Customer ID"), - customerAddress: z.string().describe("Customer address"), - shipperId: z.string().describe("Shipper ID"), - shipperAddress: z.string().describe("Shipper address"), - consigneeId: z.string().describe("Consignee ID"), - consigneeAddress: z.string().describe("Consignee address"), - selectedCargoId: z.string().describe("Selected cargo ID"), - signingPlace: z.string().describe("Place where the document is signed"), - signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed"), - signedByEmployeeId: z.string().describe("ID of the employee who signed the document"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateExportDeclarationDocumentRequestDTO = z.infer< - typeof UpdateExportDeclarationDocumentRequestDTOSchema - >; -} diff --git a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts b/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts deleted file mode 100644 index cd2bfa6..0000000 --- a/test/generated/dist/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts +++ /dev/null @@ -1,320 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsExportDeclarationAcl } from "./workingDocumentsExportDeclaration.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsExportDeclarationApi } from "./workingDocumentsExportDeclaration.api"; - -export namespace WorkingDocumentsExportDeclarationQueries { - export const moduleName = QueryModule.WorkingDocumentsExportDeclaration; - - export const keys = { - all: [moduleName] as const, - getExportDeclarationData: (officeId: string, positionId: string, exportDeclarationId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId", - officeId, - positionId, - exportDeclarationId, - ] as const, - previewExportDeclaration: (officeId: string, positionId: string, exportDeclarationId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId/preview", - officeId, - positionId, - exportDeclarationId, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create an export declaration document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof WorkingDocumentsExportDeclarationApi.create, - { positionId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId })); - return WorkingDocumentsExportDeclarationApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetExportDeclarationData` - * @summary Get export declaration document data - * @permission Requires `canUseGetExportDeclarationData` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.exportDeclarationId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetExportDeclarationData = ( - { - officeId, - positionId, - exportDeclarationId, - }: { officeId: string; positionId: string; exportDeclarationId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), - queryFn: () => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId })); - return WorkingDocumentsExportDeclarationApi.getExportDeclarationData( - officeId, - positionId, - exportDeclarationId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateExportDeclarationData` - * @summary Update export declaration document data - * @permission Requires `canUseUpdateExportDeclarationData` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateExportDeclarationData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsExportDeclarationApi.updateExportDeclarationData, - { - officeId: string; - positionId: string; - exportDeclarationId: string; - data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId })); - return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData( - officeId, - positionId, - exportDeclarationId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, exportDeclarationId } = variables; - const updateKeys = [keys.getExportDeclarationData(officeId, positionId, exportDeclarationId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteExportDeclaration` - * @summary Delete export declaration document - * @permission Requires `canUseDeleteExportDeclaration` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Export declaration document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteExportDeclaration = ( - options?: AppMutationOptions< - typeof WorkingDocumentsExportDeclarationApi.deleteExportDeclaration, - { positionId: string; exportDeclarationId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, exportDeclarationId, officeId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId })); - return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration( - positionId, - exportDeclarationId, - officeId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewExportDeclaration` - recommended when file should be cached - * @summary Preview export declaration document - * @permission Requires `canUsePreviewExportDeclaration` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.exportDeclarationId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewExportDeclaration = ( - { - officeId, - positionId, - exportDeclarationId, - }: { officeId: string; positionId: string; exportDeclarationId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), - queryFn: () => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId })); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration( - officeId, - positionId, - exportDeclarationId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewExportDeclarationMutation` - recommended when file should not be cached - * @summary Preview export declaration document - * @permission Requires `canUsePreviewExportDeclaration` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewExportDeclarationMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsExportDeclarationApi.previewExportDeclaration, - { officeId: string; positionId: string; exportDeclarationId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId })); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration( - officeId, - positionId, - exportDeclarationId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, exportDeclarationId } = variables; - const updateKeys = [keys.previewExportDeclaration(officeId, positionId, exportDeclarationId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateExportDeclaration` - * @summary Generate export declaration document - * @permission Requires `canUseGenerateExportDeclaration` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateExportDeclaration = ( - options?: AppMutationOptions< - typeof WorkingDocumentsExportDeclarationApi.generateExportDeclaration, - { - officeId: string; - positionId: string; - exportDeclarationId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId })); - return WorkingDocumentsExportDeclarationApi.generateExportDeclaration( - officeId, - positionId, - exportDeclarationId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts deleted file mode 100644 index 3860d00..0000000 --- a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsFcrFormAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Create", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; - - /** - * Use for `useGetFcrData` query ability. For global ability, omit the object parameter. - * @description Read FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetFcrData` query - */ - export const canUseGetFcrData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Read", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; - - /** - * Use for `useUpdateFcrData` mutation ability. For global ability, omit the object parameter. - * @description Update FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateFcrData` mutation - */ - export const canUseUpdateFcrData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Update", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; - - /** - * Use for `useDeleteFcr` mutation ability. For global ability, omit the object parameter. - * @description Delete FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteFcr` mutation - */ - export const canUseDeleteFcr = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Delete", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; - - /** - * Use for `usePreviewFcr` query or `usePreviewFcrMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewFcr` query or `usePreviewFcrMutation` mutation - */ - export const canUsePreviewFcr = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Read", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; - - /** - * Use for `useGenerateFcr` mutation ability. For global ability, omit the object parameter. - * @description Generate FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateFcr` mutation - */ - export const canUseGenerateFcr = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form"] as AbilityTuple< - "Update", - "WorkingDocument-fcr-form" | (ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts deleted file mode 100644 index 904fa2b..0000000 --- a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsFcrFormApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs`, - undefined, - config, - ); - }; - export const getFcrData = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - config, - ); - }; - export const updateFcrData = ( - positionId: string, - fcrId: string, - officeId: string, - data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), - config, - ); - }; - export const deleteFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - undefined, - config, - ); - }; - export const previewFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generateFcr = ( - positionId: string, - fcrId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts deleted file mode 100644 index ea713a5..0000000 --- a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsFcrFormModels { - /** - * FcrDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const FcrDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type FcrDocumentBusinessPartnerResponseDTO = z.infer; - - /** - * FcrDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { string } containerNumber Container number - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - * @property { number } quantity Quantity of the cargo - * @property { string } description Description of the cargo - * @property { number } weight Weight of the cargo - * @property { number } volume Volume of the cargo - */ - export const FcrDocumentCargoResponseDTOSchema = z - .object({ - caseMarks: z.string().describe("Case marks of the cargo"), - containerNumber: z.string().describe("Container number"), - seal1: z.string().describe("Seal number 1 of the cargo"), - seal2: z.string().describe("Seal number 2 of the cargo"), - quantity: z.number().describe("Quantity of the cargo"), - description: z.string().describe("Description of the cargo"), - weight: z.number().describe("Weight of the cargo"), - volume: z.number().describe("Volume of the cargo"), - }) - .readonly(); - export type FcrDocumentCargoResponseDTO = z.infer; - - /** - * FcrDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { number } versionNumber Version number of the document - * @property { string } fcrNumber FCR number - * @property { string } edvNumber EDV number - * @property { number } numberOfOriginals Number of originals - * @property { string } placeOfLoading Place of loading - * @property { string } dateOfLoading Date of loading - * @property { string } viaCity Via city - * @property { string } toDestination To destination - * @property { string } transportMode Transport mode - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } issuePlace Issue place - * @property { string } issueDate Issue date - * @property { string } deliveryTerms Delivery terms - * @property { FcrDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { FcrDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { FcrDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ - export const FcrDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the document"), - name: z.string().describe("Name of the document"), - nameSuffix: z.string().describe("Name suffix of the document").nullish(), - defaultFileName: z.string(), - positionId: z.string().describe("Position ID"), - positionNumber: z.string().describe("Position number"), - versionNumber: z.number().describe("Version number of the document"), - fcrNumber: z.string().describe("FCR number").nullish(), - edvNumber: z.string().describe("EDV number").nullish(), - numberOfOriginals: z.number().describe("Number of originals"), - placeOfLoading: z.string().describe("Place of loading").nullish(), - dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading").nullish(), - viaCity: z.string().describe("Via city").nullish(), - toDestination: z.string().describe("To destination").nullish(), - transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - issuePlace: z.string().describe("Issue place").nullish(), - issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), - deliveryTerms: z.string().describe("Delivery terms").nullish(), - shipper: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), - consignee: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), - cargo: z.array(FcrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), - config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), - }) - .readonly(); - export type FcrDocumentResponseDTO = z.infer; - - /** - * UpdateFcrDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } fcrNumber FCR number - * @property { string } edvNumber EDV number - * @property { number } numberOfOriginals Number of originals - * @property { string } placeOfLoading Place of loading - * @property { string } dateOfLoading Date of loading - * @property { string } viaCity Via city - * @property { string } toDestination To destination - * @property { string } transportMode Transport mode - * @property { string } issuePlace Issue place - * @property { string } issueDate Issue date - * @property { string } deliveryTerms Delivery terms - * @property { string } shipperId Shipper ID - * @property { string } shipperAddress Shipper address - * @property { string } consigneeId Consignee ID - * @property { string } consigneeAddress Consignee address - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateFcrDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Name suffix"), - fcrNumber: z.string().describe("FCR number"), - edvNumber: z.string().describe("EDV number"), - numberOfOriginals: z.number().describe("Number of originals"), - placeOfLoading: z.string().describe("Place of loading"), - dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading"), - viaCity: z.string().describe("Via city"), - toDestination: z.string().describe("To destination"), - transportMode: z.string().describe("Transport mode"), - issuePlace: z.string().describe("Issue place"), - issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), - deliveryTerms: z.string().describe("Delivery terms"), - shipperId: z.string().describe("Shipper ID"), - shipperAddress: z.string().describe("Shipper address"), - consigneeId: z.string().describe("Consignee ID"), - consigneeAddress: z.string().describe("Consignee address"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateFcrDocumentRequestDTO = z.infer; -} diff --git a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts b/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts deleted file mode 100644 index 7e9a7d2..0000000 --- a/test/generated/dist/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsFcrFormAcl } from "./workingDocumentsFcrForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsFcrFormApi } from "./workingDocumentsFcrForm.api"; - -export namespace WorkingDocumentsFcrFormQueries { - export const moduleName = QueryModule.WorkingDocumentsFcrForm; - - export const keys = { - all: [moduleName] as const, - getFcrData: (positionId: string, fcrId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId", positionId, fcrId, officeId] as const, - previewFcr: (positionId: string, fcrId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/fcrs/:fcrId/preview", - positionId, - fcrId, - officeId, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create an FCR document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId })); - return WorkingDocumentsFcrFormApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetFcrData` - * @summary Get FCR document data - * @permission Requires `canUseGetFcrData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.fcrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetFcrData = ( - { positionId, fcrId, officeId }: { positionId: string; fcrId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getFcrData(positionId, fcrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId })); - return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateFcrData` - * @summary Update FCR document data - * @permission Requires `canUseUpdateFcrData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateFcrData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsFcrFormApi.updateFcrData, - { - positionId: string; - fcrId: string; - officeId: string; - data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId, data }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId })); - return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, fcrId, officeId } = variables; - const updateKeys = [keys.getFcrData(positionId, fcrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteFcr` - * @summary Delete FCR document - * @permission Requires `canUseDeleteFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } FCR document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteFcr = ( - options?: AppMutationOptions< - typeof WorkingDocumentsFcrFormApi.deleteFcr, - { positionId: string; fcrId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId })); - return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewFcr` - recommended when file should be cached - * @summary Preview FCR document - * @permission Requires `canUsePreviewFcr` ability - * @param { string } object.positionId Path parameter - * @param { string } object.fcrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewFcr = ( - { positionId, fcrId, officeId }: { positionId: string; fcrId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewFcr(positionId, fcrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId })); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewFcrMutation` - recommended when file should not be cached - * @summary Preview FCR document - * @permission Requires `canUsePreviewFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewFcrMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsFcrFormApi.previewFcr, - { positionId: string; fcrId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId })); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, fcrId, officeId } = variables; - const updateKeys = [keys.previewFcr(positionId, fcrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateFcr` - * @summary Generate FCR document - * @permission Requires `canUseGenerateFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateFcr = ( - options?: AppMutationOptions< - typeof WorkingDocumentsFcrFormApi.generateFcr, - { positionId: string; fcrId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId, data }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId })); - return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts deleted file mode 100644 index 9d5e584..0000000 --- a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsHouseAwbAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Create", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; - - /** - * Use for `useGetHouseAwbData` query ability. For global ability, omit the object parameter. - * @description Read House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseAwbData` query - */ - export const canUseGetHouseAwbData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Read", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; - - /** - * Use for `useUpdateHouseAwbData` mutation ability. For global ability, omit the object parameter. - * @description Update House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseAwbData` mutation - */ - export const canUseUpdateHouseAwbData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Update", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; - - /** - * Use for `useDeleteHouseAwb` mutation ability. For global ability, omit the object parameter. - * @description Delete House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseAwb` mutation - */ - export const canUseDeleteHouseAwb = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Delete", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; - - /** - * Use for `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation - */ - export const canUsePreviewHouseAwb = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Read", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; - - /** - * Use for `useGenerateHouseAwb` mutation ability. For global ability, omit the object parameter. - * @description Generate House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseAwb` mutation - */ - export const canUseGenerateHouseAwb = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb"] as AbilityTuple< - "Update", - "WorkingDocument-house-awb" | (ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts deleted file mode 100644 index e0ad386..0000000 --- a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseAwbApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs`, - undefined, - config, - ); - }; - export const getHouseAwbData = ( - positionId: string, - hawbId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - config, - ); - }; - export const updateHouseAwbData = ( - positionId: string, - hawbId: string, - officeId: string, - data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), - config, - ); - }; - export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - undefined, - config, - ); - }; - export const previewHouseAwb = ( - positionId: string, - hawbId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generateHouseAwb = ( - positionId: string, - hawbId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts deleted file mode 100644 index e45408f..0000000 --- a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts +++ /dev/null @@ -1,307 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseAwbModels { - /** - * HouseAwbDocumentOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - * @property { string } name Name - */ - export const HouseAwbDocumentOtherChargeDTOSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID").nullish(), - sellRate: z.number().describe("Sell rate"), - name: z.string().describe("Name").nullish(), - }) - .readonly(); - export type HouseAwbDocumentOtherChargeDTO = z.infer; - - /** - * HouseAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { number } totalOtherCharges Total other charges - * @property { number } total Total - * @property { HouseAwbDocumentOtherChargeDTO[] } otherCharges Other charges - */ - export const HouseAwbDocumentChargesDTOSchema = z - .object({ - weightCharge: z.number().describe("Weight charge"), - totalOtherCharges: z.number().describe("Total other charges"), - total: z.number().describe("Total"), - otherCharges: z.array(HouseAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges"), - }) - .readonly(); - export type HouseAwbDocumentChargesDTO = z.infer; - - /** - * HouseAwbDocumentCargoDTOSchema - * @type { object } - * @property { number } quantity Quantity - * @property { number } grossWeight Gross weight - * @property { string } rateClass Rate class - * @property { string } commodityItemNo Commodity item number - * @property { number } rateOrCharge Rate or charge - * @property { number } total Total - * @property { string } description Description - */ - export const HouseAwbDocumentCargoDTOSchema = z - .object({ - quantity: z.number().describe("Quantity"), - grossWeight: z.number().describe("Gross weight").nullish(), - rateClass: z.string().describe("Rate class").nullish(), - commodityItemNo: z.string().describe("Commodity item number").nullish(), - rateOrCharge: z.number().describe("Rate or charge").nullish(), - total: z.number().describe("Total").nullish(), - description: z.string().describe("Description").nullish(), - }) - .readonly(); - export type HouseAwbDocumentCargoDTO = z.infer; - - /** - * HouseAwbDocumentRouteDTOSchema - * @type { object } - * @property { string } airportOfDeparture Airport of departure - * @property { string } airportOfDestination Airport of destination - * @property { string } toAirport1 To airport 1 - * @property { string } byCarrier1 By carrier 1 - * @property { string } toAirport2 To airport 2 - * @property { string } byCarrier2 By carrier 2 - * @property { string } toAirport3 To airport 3 - * @property { string } byCarrier3 By carrier 3 - * @property { string } flightNumber1 Flight number 1 - * @property { string } flightDay1 Flight day 1 - * @property { string } flightNumber2 Flight number 2 - * @property { string } flightDay2 Flight day 2 - */ - export const HouseAwbDocumentRouteDTOSchema = z - .object({ - airportOfDeparture: z.string().describe("Airport of departure"), - airportOfDestination: z.string().describe("Airport of destination"), - toAirport1: z.string().describe("To airport 1").nullish(), - byCarrier1: z.string().describe("By carrier 1").nullish(), - toAirport2: z.string().describe("To airport 2").nullish(), - byCarrier2: z.string().describe("By carrier 2").nullish(), - toAirport3: z.string().describe("To airport 3").nullish(), - byCarrier3: z.string().describe("By carrier 3").nullish(), - flightNumber1: z.string().describe("Flight number 1").nullish(), - flightDay1: z.string().describe("Flight day 1").nullish(), - flightNumber2: z.string().describe("Flight number 2").nullish(), - flightDay2: z.string().describe("Flight day 2").nullish(), - }) - .readonly(); - export type HouseAwbDocumentRouteDTO = z.infer; - - /** - * HouseAwbDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const HouseAwbDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer< - typeof HouseAwbDocumentBusinessPartnerResponseDTOSchema - >; - - /** - * HouseAwbDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the House AWB document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the House AWB document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } currency Currency - * @property { number } versionNumber Version number of the document - * @property { string } hawbNumber HAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { HouseAwbDocumentCargoDTO[] } cargo Cargo packages - * @property { HouseAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } signingLocation Signing location - * @property { string } issuerIataCode Issuer IATA code - * @property { HouseAwbDocumentRouteDTO } route Route - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } issuer Issuer - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { CommonModels.DocumentConfigDTO } config Config - */ - export const HouseAwbDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the House AWB document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference"), - name: z.string().describe("Name of the House AWB document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - currency: z.string().describe("Currency").nullish(), - versionNumber: z.number().describe("Version number of the document"), - hawbNumber: z.string().describe("HAWB number").nullish(), - sciReference: z.string().describe("SCI reference").nullish(), - reference1: z.string().describe("Reference 1").nullish(), - reference2: z.string().describe("Reference 2").nullish(), - reference3: z.string().describe("Reference 3").nullish(), - exchangeRate: z.number().describe("Exchange rate").nullish(), - additionalText: CommonModels.EditorContentResponseDtoSchema.describe( - "Additional text for the document", - ).nullish(), - handlingInstructions: z.string().describe("Handling instructions").nullish(), - accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), - additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), - isSecured: z.boolean().describe("Is secured"), - suppressContainerWeight: z.boolean().describe("Suppress container weight"), - suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), - cargo: z.array(HouseAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), - charges: HouseAwbDocumentChargesDTOSchema.describe("Charges").nullish(), - shipperSigner: z.string().describe("Shipper signer").nullish(), - shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), - signer: z.string().describe("Signer").nullish(), - signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), - signingLocation: z.string().describe("Signing location").nullish(), - issuerIataCode: z.string().describe("Issuer IATA code").nullish(), - route: HouseAwbDocumentRouteDTOSchema.describe("Route").nullish(), - issuer: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), - consignee: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), - shipper: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish(), - }) - .readonly(); - export type HouseAwbDocumentResponseDTO = z.infer; - - /** - * UpdateHouseAwbDocumentChargesOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - */ - export const UpdateHouseAwbDocumentChargesOtherChargeDTOSchema = z - .object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }) - .readonly(); - export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer< - typeof UpdateHouseAwbDocumentChargesOtherChargeDTOSchema - >; - - /** - * UpdateHouseAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { UpdateHouseAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges - */ - export const UpdateHouseAwbDocumentChargesDTOSchema = z - .object({ - weightCharge: z.number().describe("Weight charge"), - otherCharges: z.array(UpdateHouseAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges"), - }) - .readonly(); - export type UpdateHouseAwbDocumentChargesDTO = z.infer; - - /** - * UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema - >; - - /** - * UpdateHouseAwbDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } hawbNumber HAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { UpdateHouseAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } issuerId Issuer ID - * @property { string } issuerName Issuer name - * @property { string } issuerAddress Issuer address - * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateHouseAwbDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Document name suffix"), - hawbNumber: z.string().describe("HAWB number"), - sciReference: z.string().describe("SCI reference"), - reference1: z.string().describe("Reference 1"), - reference2: z.string().describe("Reference 2"), - reference3: z.string().describe("Reference 3"), - exchangeRate: z.number().describe("Exchange rate"), - additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), - handlingInstructions: z.string().describe("Handling instructions"), - accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), - additionalAccountingNotes: z.string().describe("Additional accounting notes"), - isSecured: z.boolean().describe("Is secured"), - suppressContainerWeight: z.boolean().describe("Suppress container weight"), - suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), - charges: UpdateHouseAwbDocumentChargesDTOSchema.describe("Charges"), - shipperSigner: z.string().describe("Shipper signer"), - shipperSignerUserName: z.string().describe("Shipper signer user name"), - signer: z.string().describe("Signer"), - signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), - issuerId: z.string().describe("Issuer ID"), - issuerName: z.string().describe("Issuer name"), - issuerAddress: z.string().describe("Issuer address"), - consignee: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), - shipper: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateHouseAwbDocumentRequestDTO = z.infer; -} diff --git a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts b/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts deleted file mode 100644 index 6f91afa..0000000 --- a/test/generated/dist/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsHouseAwbAcl } from "./workingDocumentsHouseAwb.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsHouseAwbApi } from "./workingDocumentsHouseAwb.api"; - -export namespace WorkingDocumentsHouseAwbQueries { - export const moduleName = QueryModule.WorkingDocumentsHouseAwb; - - export const keys = { - all: [moduleName] as const, - getHouseAwbData: (positionId: string, hawbId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId", positionId, hawbId, officeId] as const, - previewHouseAwb: (positionId: string, hawbId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/hawbs/:hawbId/preview", - positionId, - hawbId, - officeId, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create a House AWB document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId })); - return WorkingDocumentsHouseAwbApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetHouseAwbData` - * @summary Get House AWB document data - * @permission Requires `canUseGetHouseAwbData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.hawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetHouseAwbData = ( - { positionId, hawbId, officeId }: { positionId: string; hawbId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId })); - return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateHouseAwbData` - * @summary Update House AWB document data - * @permission Requires `canUseUpdateHouseAwbData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateHouseAwbData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseAwbApi.updateHouseAwbData, - { - positionId: string; - hawbId: string; - officeId: string; - data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId })); - return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, hawbId, officeId } = variables; - const updateKeys = [keys.getHouseAwbData(positionId, hawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteHouseAwb` - * @summary Delete House AWB document - * @permission Requires `canUseDeleteHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } House AWB document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteHouseAwb = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseAwbApi.deleteHouseAwb, - { positionId: string; hawbId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId })); - return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewHouseAwb` - recommended when file should be cached - * @summary Preview House AWB document - * @permission Requires `canUsePreviewHouseAwb` ability - * @param { string } object.positionId Path parameter - * @param { string } object.hawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseAwb = ( - { positionId, hawbId, officeId }: { positionId: string; hawbId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId })); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewHouseAwbMutation` - recommended when file should not be cached - * @summary Preview House AWB document - * @permission Requires `canUsePreviewHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseAwbMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseAwbApi.previewHouseAwb, - { positionId: string; hawbId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId })); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, hawbId, officeId } = variables; - const updateKeys = [keys.previewHouseAwb(positionId, hawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateHouseAwb` - * @summary Generate House AWB document - * @permission Requires `canUseGenerateHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateHouseAwb = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseAwbApi.generateHouseAwb, - { positionId: string; hawbId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId })); - return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts deleted file mode 100644 index d23cec5..0000000 --- a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsHouseBlAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Create", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; - - /** - * Use for `useGetHouseBlData` query ability. For global ability, omit the object parameter. - * @description Read house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseBlData` query - */ - export const canUseGetHouseBlData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Read", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; - - /** - * Use for `useUpdateHouseBlData` mutation ability. For global ability, omit the object parameter. - * @description Update house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseBlData` mutation - */ - export const canUseUpdateHouseBlData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Update", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; - - /** - * Use for `useDeleteHouseBl` mutation ability. For global ability, omit the object parameter. - * @description Delete house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseBl` mutation - */ - export const canUseDeleteHouseBl = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Delete", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; - - /** - * Use for `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation - */ - export const canUsePreviewHouseBl = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Read", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; - - /** - * Use for `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview house BL document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation - */ - export const canUsePreviewHouseBlEml = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Read", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; - - /** - * Use for `useGenerateHouseBl` mutation ability. For global ability, omit the object parameter. - * @description Generate house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseBl` mutation - */ - export const canUseGenerateHouseBl = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Update", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; - - /** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate house BL document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ - export const canUseGenerateDocumentEml = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl"] as AbilityTuple< - "Update", - "WorkingDocument-house-bl" | (ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts deleted file mode 100644 index 6880ade..0000000 --- a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseBlApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls`, - undefined, - config, - ); - }; - export const getHouseBlData = ( - positionId: string, - houseBlId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - config, - ); - }; - export const updateHouseBlData = ( - positionId: string, - houseBlId: string, - officeId: string, - data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), - config, - ); - }; - export const deleteHouseBl = ( - positionId: string, - houseBlId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - undefined, - config, - ); - }; - export const previewHouseBl = ( - positionId: string, - houseBlId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const previewHouseBlEml = ( - positionId: string, - houseBlId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generateHouseBl = ( - positionId: string, - houseBlId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; - export const generateDocumentEml = ( - positionId: string, - houseBlId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; -} diff --git a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts deleted file mode 100644 index 1feb430..0000000 --- a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts +++ /dev/null @@ -1,350 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseBlModels { - /** - * HouseBlDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { number } quantityOfCopies Quantity of copies - * @property { string } date Date - * @property { string } location Location - * @property { string } signer Signer - * @property { boolean } hideSignature Hide signature - * @property { boolean } capsLock Render issuer/signer in caps lock - * @property { string } documentTitle Document title - */ - export const HouseBlDocumentSettingsDtoDTOSchema = z - .object({ - quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), - quantityOfCopies: z.number().describe("Quantity of copies"), - date: z.iso.datetime({ offset: true }).describe("Date"), - location: z.string().describe("Location"), - signer: z.string().describe("Signer"), - hideSignature: z.boolean().describe("Hide signature"), - capsLock: z.boolean().describe("Render issuer/signer in caps lock"), - documentTitle: z.string().describe("Document title"), - }) - .readonly(); - export type HouseBlDocumentSettingsDtoDTO = z.infer; - - /** - * HouseBlDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const HouseBlDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer< - typeof HouseBlDocumentBusinessPartnerResponseDTOSchema - >; - - /** - * HouseBlDocumentCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ - export const HouseBlDocumentCountryResponseDTOSchema = z - .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) - .readonly(); - export type HouseBlDocumentCountryResponseDTO = z.infer; - - /** - * HouseBlDocumentPlaceResponseDTOSchema - * @type { object } - * @property { string } id ID of the place - * @property { string } name Name of the place - */ - export const HouseBlDocumentPlaceResponseDTOSchema = z - .object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }) - .readonly(); - export type HouseBlDocumentPlaceResponseDTO = z.infer; - - /** - * HouseBlDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ - export const HouseBlDocumentPortResponseDTOSchema = z - .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) - .readonly(); - export type HouseBlDocumentPortResponseDTO = z.infer; - - /** - * HouseBlDocumentTerminalResponseDTOSchema - * @type { object } - * @property { string } id ID of the terminal - * @property { string } name Name of the terminal - */ - export const HouseBlDocumentTerminalResponseDTOSchema = z - .object({ id: z.string().describe("ID of the terminal"), name: z.string().describe("Name of the terminal") }) - .readonly(); - export type HouseBlDocumentTerminalResponseDTO = z.infer; - - /** - * HouseBlDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the house BL document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the house BL document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } blNumber Bill of lading number - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } exportReference Export reference number - * @property { HouseBlDocumentBusinessPartnerResponseDTO } forwarder Forwarder information for the shipment - * @property { HouseBlDocumentCountryResponseDTO } originCountry Origin country - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { CommonModels.EditorContentResponseDto } additionalTextTop Additional text for the document - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { HouseBlDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } cargoReleaseBy Delivery agent information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information - * @property { HouseBlDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information - * @property { string } precarriageByText Pre-carriage by free-text override - * @property { HouseBlDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information - * @property { string } placeOfReceiptText Place of receipt free-text override - * @property { string } vessel Name of the vessel - * @property { string } voyage Voyage number of the vessel - * @property { string } declaredValue Declared value of the shipment - * @property { number } rateOfExchange Rate of exchange of the shipment - * @property { string } currency Currency of the shipment - * @property { string } freightPayable Freight payable of the shipment - * @property { string } issuer Issuer - * @property { HouseBlDocumentPortResponseDTO } portOfLoading Port of loading information - * @property { string } portOfLoadingText Port of loading free-text override - * @property { HouseBlDocumentTerminalResponseDTO } loadingPierTerminal Loading pier/terminal information - * @property { string } loadingPierTerminalText Loading pier/terminal free-text override - * @property { HouseBlDocumentPortResponseDTO } portOfDischarge Port of discharge information - * @property { string } portOfDischargeText Port of discharge free-text override - * @property { HouseBlDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information - * @property { string } placeOfDeliveryText Place of delivery free-text override - * @property { HouseBlDocumentPlaceResponseDTO } originalsToBeReleasedAt Originals to be released at information - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { string } typeOfMove Type of move - * @property { string } placeOfIssue - * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data - * @property { HouseBlDocumentSettingsDtoDTO } settings Settings for the House BL document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ - export const HouseBlDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the house BL document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference").nullish(), - name: z.string().describe("Name of the house BL document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - blNumber: z.string().describe("Bill of lading number").nullish(), - carrierBookingNumber: z.string().describe("Carrier booking number").nullish(), - exportReference: z.string().describe("Export reference number").nullish(), - forwarder: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe( - "Forwarder information for the shipment", - ).nullish(), - originCountry: HouseBlDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), - useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), - additionalText: CommonModels.EditorContentResponseDtoSchema.describe( - "Additional text for the document", - ).nullish(), - additionalTextTop: CommonModels.EditorContentResponseDtoSchema.describe( - "Additional text for the document", - ).nullish(), - direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), - transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), - versionNumber: z.number().describe("Version number of the document"), - consignee: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information for the shipment"), - shipper: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), - cargoReleaseBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe( - "Delivery agent information for the shipment", - ).nullish(), - notify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Notify party information for the shipment"), - alsoNotify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Additional notify party information"), - precarriageBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), - precarriageByText: z.string().describe("Pre-carriage by free-text override").nullish(), - placeOfReceipt: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), - placeOfReceiptText: z.string().describe("Place of receipt free-text override").nullish(), - vessel: z.string().describe("Name of the vessel").nullish(), - voyage: z.string().describe("Voyage number of the vessel").nullish(), - declaredValue: z.string().describe("Declared value of the shipment").nullish(), - rateOfExchange: z.number().describe("Rate of exchange of the shipment").nullish(), - currency: z.string().describe("Currency of the shipment").nullish(), - freightPayable: z.string().describe("Freight payable of the shipment").nullish(), - issuer: z.string().describe("Issuer").nullish(), - portOfLoading: HouseBlDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), - portOfLoadingText: z.string().describe("Port of loading free-text override").nullish(), - loadingPierTerminal: HouseBlDocumentTerminalResponseDTOSchema.describe( - "Loading pier/terminal information", - ).nullish(), - loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override").nullish(), - portOfDischarge: HouseBlDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), - portOfDischargeText: z.string().describe("Port of discharge free-text override").nullish(), - placeOfDelivery: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), - placeOfDeliveryText: z.string().describe("Place of delivery free-text override").nullish(), - originalsToBeReleasedAt: HouseBlDocumentPlaceResponseDTOSchema.describe( - "Originals to be released at information", - ).nullish(), - originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override").nullish(), - typeOfMove: z.string().describe("Type of move").nullish(), - placeOfIssue: z.string().nullish(), - data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), - settings: HouseBlDocumentSettingsDtoDTOSchema.describe("Settings for the House BL document").nullish(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), - }) - .readonly(); - export type HouseBlDocumentResponseDTO = z.infer; - - /** - * UpdateHouseBlDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { number } quantityOfCopies Quantity of copies - * @property { string } blNumber BL number - * @property { string } exportReference Export reference number - * @property { string } location Location - * @property { string } signer Signer - * @property { boolean } hideSignature Hide signature - * @property { boolean } capsLock Render issuer/signer in caps lock - * @property { string } date Date - * @property { string } documentTitle Document title - */ - export const UpdateHouseBlDocumentSettingsRequestDTOSchema = z - .object({ - quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), - quantityOfCopies: z.number().describe("Quantity of copies"), - blNumber: z.string().describe("BL number"), - exportReference: z.string().describe("Export reference number"), - location: z.string().describe("Location"), - signer: z.string().describe("Signer"), - hideSignature: z.boolean().describe("Hide signature"), - capsLock: z.boolean().describe("Render issuer/signer in caps lock"), - date: z.iso.datetime({ offset: true }).describe("Date"), - documentTitle: z.string().describe("Document title"), - }) - .readonly(); - export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; - - /** - * UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema - >; - - /** - * UpdateHouseBlDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } blNumber Bill of lading number - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } exportReference Export reference number - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } forwarder Forwarder information - * @property { string } originCountryId Origin country ID - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } declaredValue Declared value - * @property { number } rateOfExchange Rate of exchange - * @property { string } freightPayable Freight payable - * @property { string } issuer Issuer - * @property { string } placeOfIssue Place of issue - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text - * @property { CommonModels.EditorContentUpdateDto } additionalTextTop Additional text top - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } notify Notify party information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } cargoReleaseBy Cargo release party information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information - * @property { string } precarriageById Pre-carriage by ID - * @property { string } precarriageByText Pre-carriage by free-text override - * @property { string } placeOfReceiptId Place of receipt ID - * @property { string } placeOfReceiptText Place of receipt free-text override - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } portOfLoadingId Port of loading ID - * @property { string } portOfLoadingText Port of loading free-text override - * @property { string } loadingPierTerminalId Loading pier/terminal ID - * @property { string } loadingPierTerminalText Loading pier/terminal free-text override - * @property { string } portOfDischargeId Port of discharge ID - * @property { string } portOfDischargeText Port of discharge free-text override - * @property { string } placeOfDeliveryId Place of delivery ID - * @property { string } placeOfDeliveryText Place of delivery free-text override - * @property { string } originalsToBeReleasedAtId Originals to be released at ID - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { string } typeOfMove Type of move - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { UpdateHouseBlDocumentSettingsRequestDTO } settings Settings - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data - */ - export const UpdateHouseBlDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Document name suffix"), - blNumber: z.string().describe("Bill of lading number"), - carrierBookingNumber: z.string().describe("Carrier booking number"), - exportReference: z.string().describe("Export reference number"), - forwarder: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), - originCountryId: z.string().describe("Origin country ID"), - useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), - declaredValue: z.string().describe("Declared value"), - rateOfExchange: z.number().describe("Rate of exchange"), - freightPayable: z.string().describe("Freight payable"), - issuer: z.string().describe("Issuer"), - placeOfIssue: z.string().describe("Place of issue"), - additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), - additionalTextTop: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text top"), - consignee: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), - shipper: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), - notify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), - cargoReleaseBy: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Cargo release party information"), - alsoNotify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), - precarriageById: z.string().describe("Pre-carriage by ID"), - precarriageByText: z.string().describe("Pre-carriage by free-text override"), - placeOfReceiptId: z.string().describe("Place of receipt ID"), - placeOfReceiptText: z.string().describe("Place of receipt free-text override"), - vessel: z.string().describe("Vessel name"), - voyage: z.string().describe("Voyage number"), - portOfLoadingId: z.string().describe("Port of loading ID"), - portOfLoadingText: z.string().describe("Port of loading free-text override"), - loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), - loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override"), - portOfDischargeId: z.string().describe("Port of discharge ID"), - portOfDischargeText: z.string().describe("Port of discharge free-text override"), - placeOfDeliveryId: z.string().describe("Place of delivery ID"), - placeOfDeliveryText: z.string().describe("Place of delivery free-text override"), - originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), - originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), - typeOfMove: z.string().describe("Type of move"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - settings: UpdateHouseBlDocumentSettingsRequestDTOSchema.describe("Settings"), - data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), - }) - .readonly(); - export type UpdateHouseBlDocumentRequestDTO = z.infer; -} diff --git a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts b/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts deleted file mode 100644 index 37c9f40..0000000 --- a/test/generated/dist/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts +++ /dev/null @@ -1,392 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsHouseBlAcl } from "./workingDocumentsHouseBl.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsHouseBlApi } from "./workingDocumentsHouseBl.api"; - -export namespace WorkingDocumentsHouseBlQueries { - export const moduleName = QueryModule.WorkingDocumentsHouseBl; - - export const keys = { - all: [moduleName] as const, - getHouseBlData: (positionId: string, houseBlId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/house-bls/:houseBlId", - positionId, - houseBlId, - officeId, - ] as const, - previewHouseBl: (positionId: string, houseBlId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview", - positionId, - houseBlId, - officeId, - ] as const, - previewHouseBlEml: (positionId: string, houseBlId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview/eml", - positionId, - houseBlId, - officeId, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create a house BL document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId })); - return WorkingDocumentsHouseBlApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetHouseBlData` - * @summary Get house BL document data - * @permission Requires `canUseGetHouseBlData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetHouseBlData = ( - { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId })); - return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateHouseBlData` - * @summary Update house BL document data - * @permission Requires `canUseUpdateHouseBlData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateHouseBlData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.updateHouseBlData, - { - positionId: string; - houseBlId: string; - officeId: string; - data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId })); - return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.getHouseBlData(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteHouseBl` - * @summary Delete house BL document - * @permission Requires `canUseDeleteHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } House BL document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteHouseBl = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.deleteHouseBl, - { positionId: string; houseBlId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId })); - return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewHouseBl` - recommended when file should be cached - * @summary Preview house BL document - * @permission Requires `canUsePreviewHouseBl` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseBl = ( - { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId })); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewHouseBlMutation` - recommended when file should not be cached - * @summary Preview house BL document - * @permission Requires `canUsePreviewHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseBlMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.previewHouseBl, - { positionId: string; houseBlId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId })); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [ - keys.previewHouseBl(positionId, houseBlId, officeId), - keys.previewHouseBlEml(positionId, houseBlId, officeId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewHouseBlEml` - recommended when file should be cached - * @summary Preview house BL document and return EML file - * @permission Requires `canUsePreviewHouseBlEml` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseBlEml = ( - { positionId, houseBlId, officeId }: { positionId: string; houseBlId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId })); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewHouseBlEmlMutation` - recommended when file should not be cached - * @summary Preview house BL document and return EML file - * @permission Requires `canUsePreviewHouseBlEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewHouseBlEmlMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.previewHouseBlEml, - { positionId: string; houseBlId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId })); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [ - keys.previewHouseBl(positionId, houseBlId, officeId), - keys.previewHouseBlEml(positionId, houseBlId, officeId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateHouseBl` - * @summary Generate house BL document - * @permission Requires `canUseGenerateHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateHouseBl = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.generateHouseBl, - { positionId: string; houseBlId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId })); - return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate house BL document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGenerateDocumentEml = ( - options?: AppMutationOptions< - typeof WorkingDocumentsHouseBlApi.generateDocumentEml, - { positionId: string; houseBlId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId })); - return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [ - keys.previewHouseBl(positionId, houseBlId, officeId), - keys.previewHouseBlEml(positionId, houseBlId, officeId), - ]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts deleted file mode 100644 index 7d64f70..0000000 --- a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsIsfFormAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Create", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; - - /** - * Use for `useGetIsfData` query ability. For global ability, omit the object parameter. - * @description Read ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetIsfData` query - */ - export const canUseGetIsfData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Read", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; - - /** - * Use for `useUpdateIsfData` mutation ability. For global ability, omit the object parameter. - * @description Update ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIsfData` mutation - */ - export const canUseUpdateIsfData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Update", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; - - /** - * Use for `useDeleteIsf` mutation ability. For global ability, omit the object parameter. - * @description Delete ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteIsf` mutation - */ - export const canUseDeleteIsf = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Delete", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; - - /** - * Use for `usePreviewIsf` query or `usePreviewIsfMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewIsf` query or `usePreviewIsfMutation` mutation - */ - export const canUsePreviewIsf = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Read", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; - - /** - * Use for `useGenerateIsf` mutation ability. For global ability, omit the object parameter. - * @description Generate ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIsf` mutation - */ - export const canUseGenerateIsf = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form"] as AbilityTuple< - "Update", - "WorkingDocument-isf-form" | (ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts deleted file mode 100644 index 9c32533..0000000 --- a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsIsfFormApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs`, - undefined, - config, - ); - }; - export const getIsfData = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - config, - ); - }; - export const updateIsfData = ( - positionId: string, - isfId: string, - officeId: string, - data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), - config, - ); - }; - export const deleteIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - undefined, - config, - ); - }; - export const previewIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generateIsf = ( - positionId: string, - isfId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts deleted file mode 100644 index 97121fe..0000000 --- a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsIsfFormModels { - /** - * IsfDocumentCargoCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ - export const IsfDocumentCargoCountryResponseDTOSchema = z - .object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }) - .readonly(); - export type IsfDocumentCargoCountryResponseDTO = z.infer; - - /** - * IsfDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } productCode Product code of the cargo - * @property { string } descriptionOfGoods Description of goods - * @property { string } htsCode HTS code of the cargo - * @property { string } manufacturerSupplier Manufacturer supplier of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - * @property { IsfDocumentCargoCountryResponseDTO } countryOfOrigin Country of origin of the cargo - */ - export const IsfDocumentCargoResponseDTOSchema = z - .object({ - productCode: z.string().describe("Product code of the cargo"), - descriptionOfGoods: z.string().describe("Description of goods"), - htsCode: z.string().describe("HTS code of the cargo"), - manufacturerSupplier: z.string().describe("Manufacturer supplier of the cargo"), - seal1: z.string().describe("Seal number 1 of the cargo"), - seal2: z.string().describe("Seal number 2 of the cargo"), - countryOfOrigin: IsfDocumentCargoCountryResponseDTOSchema.describe("Country of origin of the cargo"), - }) - .readonly(); - export type IsfDocumentCargoResponseDTO = z.infer; - - /** - * IsfDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ - export const IsfDocumentPortResponseDTOSchema = z - .object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }) - .readonly(); - export type IsfDocumentPortResponseDTO = z.infer; - - /** - * IsfDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - * @property { string } number Number of the business partner - */ - export const IsfDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - number: z.string().describe("Number of the business partner"), - }) - .readonly(); - export type IsfDocumentBusinessPartnerResponseDTO = z.infer; - - /** - * IsfDocumentContainerLocationResponseDTOSchema - * @type { object } - * @property { string } id ID of the container location - * @property { string } name Name of the container location - * @property { string } address Address of the container location - */ - export const IsfDocumentContainerLocationResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the container location"), - name: z.string().describe("Name of the container location"), - address: z.string().describe("Address of the container location"), - }) - .readonly(); - export type IsfDocumentContainerLocationResponseDTO = z.infer; - - /** - * IsfDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { number } versionNumber Version number of the document - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } hBLNumber HBL number - * @property { string } mBLNumber MBL number - * @property { string } scacCodeHBL SCAC code for HBL - * @property { string } scacCodeMBL SCAC code for MBL - * @property { IsfDocumentPortResponseDTO } portOfDischarge Port of discharge - * @property { string } issueLocation Issue location - * @property { string } issueDate Issue date - * @property { string } companyName Company name - * @property { object } completedBy - * @property { string } completedBy.name - * @property { string } completedBy.email - * @property { object } container - * @property { string } container.id - * @property { string } container.name - * @property { IsfDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { IsfDocumentBusinessPartnerResponseDTO } manufacturer Manufacturer information - * @property { IsfDocumentBusinessPartnerResponseDTO } seller Seller information - * @property { IsfDocumentBusinessPartnerResponseDTO } buyer Buyer information - * @property { IsfDocumentBusinessPartnerResponseDTO } consolidator Consolidator information - * @property { IsfDocumentContainerLocationResponseDTO } containerLocation Container location information - * @property { IsfDocumentBusinessPartnerResponseDTO } shipTo Ship to information - * @property { IsfDocumentBusinessPartnerResponseDTO } importer Importer information - * @property { IsfDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - */ - export const IsfDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the document"), - name: z.string().describe("Name of the document"), - nameSuffix: z.string().describe("Name suffix of the document").nullish(), - defaultFileName: z.string(), - positionId: z.string().describe("Position ID"), - positionNumber: z.string().describe("Position number"), - versionNumber: z.number().describe("Version number of the document"), - vessel: z.string().describe("Vessel name").nullish(), - voyage: z.string().describe("Voyage number").nullish(), - hBLNumber: z.string().describe("HBL number").nullish(), - mBLNumber: z.string().describe("MBL number").nullish(), - scacCodeHBL: z.string().describe("SCAC code for HBL").nullish(), - scacCodeMBL: z.string().describe("SCAC code for MBL").nullish(), - portOfDischarge: IsfDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), - issueLocation: z.string().describe("Issue location").nullish(), - issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), - companyName: z.string().describe("Company name").nullish(), - completedBy: z.object({ name: z.string(), email: z.string() }).readonly().nullish(), - container: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), - consignee: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), - manufacturer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Manufacturer information").nullish(), - seller: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Seller information").nullish(), - buyer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Buyer information").nullish(), - consolidator: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consolidator information").nullish(), - containerLocation: IsfDocumentContainerLocationResponseDTOSchema.describe( - "Container location information", - ).nullish(), - shipTo: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Ship to information").nullish(), - importer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Importer information").nullish(), - cargo: z.array(IsfDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), - config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - }) - .readonly(); - export type IsfDocumentResponseDTO = z.infer; - - /** - * UpdateIsfDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - * @property { string } number Business partner number - */ - export const UpdateIsfDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - number: z.string().describe("Business partner number"), - }) - .readonly(); - export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateIsfDocumentBusinessPartnerRequestDTOSchema - >; - - /** - * UpdateIsfDocumentCargoRequestDTOSchema - * @type { object } - * @property { string } productCode Product code - * @property { string } descriptionOfGoods Description of goods - * @property { string } htsCode HTS code - * @property { string } manufacturerSupplier Manufacturer supplier - * @property { string } countryOfOriginId Country of origin ID - */ - export const UpdateIsfDocumentCargoRequestDTOSchema = z - .object({ - productCode: z.string().describe("Product code"), - descriptionOfGoods: z.string().describe("Description of goods"), - htsCode: z.string().describe("HTS code"), - manufacturerSupplier: z.string().describe("Manufacturer supplier"), - countryOfOriginId: z.string().describe("Country of origin ID"), - }) - .readonly(); - export type UpdateIsfDocumentCargoRequestDTO = z.infer; - - /** - * UpdateIsfDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } hBLNumber HBL number - * @property { string } mBLNumber MBL number - * @property { string } scacCodeHBL SCAC code for HBL - * @property { string } scacCodeMBL SCAC code for MBL - * @property { string } portOfDischargeId Port of discharge Id - * @property { string } issueLocation Issue location - * @property { string } issueDate Issue date - * @property { string } companyName Company name - * @property { string } completedByName Completed by name - * @property { string } completedByEmail Completed by email - * @property { string } containerId Container ID - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } manufacturer Manufacturer information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } seller Seller information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } buyer Buyer information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consolidator Consolidator information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } containerLocation Container location information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } shipTo Ship to information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } importer Importer information - * @property { UpdateIsfDocumentCargoRequestDTO[] } cargo Cargo information - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateIsfDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Name suffix"), - vessel: z.string().describe("Vessel name"), - voyage: z.string().describe("Voyage number"), - hBLNumber: z.string().describe("HBL number"), - mBLNumber: z.string().describe("MBL number"), - scacCodeHBL: z.string().describe("SCAC code for HBL"), - scacCodeMBL: z.string().describe("SCAC code for MBL"), - portOfDischargeId: z.string().describe("Port of discharge Id"), - issueLocation: z.string().describe("Issue location"), - issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), - companyName: z.string().describe("Company name"), - completedByName: z.string().describe("Completed by name"), - completedByEmail: z.string().describe("Completed by email"), - containerId: z.string().describe("Container ID"), - consignee: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), - manufacturer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Manufacturer information"), - seller: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), - buyer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), - consolidator: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consolidator information"), - containerLocation: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Container location information"), - shipTo: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Ship to information"), - importer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Importer information"), - cargo: z.array(UpdateIsfDocumentCargoRequestDTOSchema).readonly().describe("Cargo information"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateIsfDocumentRequestDTO = z.infer; -} diff --git a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts b/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts deleted file mode 100644 index 592b755..0000000 --- a/test/generated/dist/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsIsfFormAcl } from "./workingDocumentsIsfForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsIsfFormApi } from "./workingDocumentsIsfForm.api"; - -export namespace WorkingDocumentsIsfFormQueries { - export const moduleName = QueryModule.WorkingDocumentsIsfForm; - - export const keys = { - all: [moduleName] as const, - getIsfData: (positionId: string, isfId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId", positionId, isfId, officeId] as const, - previewIsf: (positionId: string, isfId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/isfs/:isfId/preview", - positionId, - isfId, - officeId, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create an ISF document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId })); - return WorkingDocumentsIsfFormApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetIsfData` - * @summary Get ISF document data - * @permission Requires `canUseGetIsfData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.isfId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetIsfData = ( - { positionId, isfId, officeId }: { positionId: string; isfId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getIsfData(positionId, isfId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId })); - return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateIsfData` - * @summary Update ISF document data - * @permission Requires `canUseUpdateIsfData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateIsfData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsIsfFormApi.updateIsfData, - { - positionId: string; - isfId: string; - officeId: string; - data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId, data }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId })); - return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, isfId, officeId } = variables; - const updateKeys = [keys.getIsfData(positionId, isfId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteIsf` - * @summary Delete ISF document - * @permission Requires `canUseDeleteIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } ISF document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteIsf = ( - options?: AppMutationOptions< - typeof WorkingDocumentsIsfFormApi.deleteIsf, - { positionId: string; isfId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId })); - return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewIsf` - recommended when file should be cached - * @summary Preview ISF document - * @permission Requires `canUsePreviewIsf` ability - * @param { string } object.positionId Path parameter - * @param { string } object.isfId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewIsf = ( - { positionId, isfId, officeId }: { positionId: string; isfId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewIsf(positionId, isfId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId })); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewIsfMutation` - recommended when file should not be cached - * @summary Preview ISF document - * @permission Requires `canUsePreviewIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewIsfMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsIsfFormApi.previewIsf, - { positionId: string; isfId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId })); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, isfId, officeId } = variables; - const updateKeys = [keys.previewIsf(positionId, isfId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateIsf` - * @summary Generate ISF document - * @permission Requires `canUseGenerateIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateIsf = ( - options?: AppMutationOptions< - typeof WorkingDocumentsIsfFormApi.generateIsf, - { positionId: string; isfId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId, data }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId })); - return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts deleted file mode 100644 index 6d3d1a9..0000000 --- a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsMasterAwbAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - ["Create", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Create", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; - - /** - * Use for `useGetMasterAwbData` query ability. For global ability, omit the object parameter. - * @description Read Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMasterAwbData` query - */ - export const canUseGetMasterAwbData = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Read", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; - - /** - * Use for `useUpdateMasterAwbData` mutation ability. For global ability, omit the object parameter. - * @description Update Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateMasterAwbData` mutation - */ - export const canUseUpdateMasterAwbData = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Update", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; - - /** - * Use for `useDeleteMasterAwb` mutation ability. For global ability, omit the object parameter. - * @description Delete Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteMasterAwb` mutation - */ - export const canUseDeleteMasterAwb = (object?: { officeId: string }) => - ["Delete", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Delete", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; - - /** - * Use for `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation - */ - export const canUsePreviewMasterAwb = (object?: { officeId: string }) => - ["Read", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Read", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; - - /** - * Use for `useGenerateMasterAwb` mutation ability. For global ability, omit the object parameter. - * @description Generate Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateMasterAwb` mutation - */ - export const canUseGenerateMasterAwb = (object?: { officeId: string }) => - ["Update", object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb"] as AbilityTuple< - "Update", - "WorkingDocument-master-awb" | (ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts deleted file mode 100644 index 59fe19b..0000000 --- a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsMasterAwbApi { - export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs`, - undefined, - config, - ); - }; - export const getMasterAwbData = ( - positionId: string, - mawbId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - config, - ); - }; - export const updateMasterAwbData = ( - positionId: string, - mawbId: string, - officeId: string, - data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), - config, - ); - }; - export const deleteMasterAwb = ( - positionId: string, - mawbId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - undefined, - config, - ); - }; - export const previewMasterAwb = ( - positionId: string, - mawbId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const generateMasterAwb = ( - positionId: string, - mawbId: string, - officeId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; -} diff --git a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts deleted file mode 100644 index e4e0a26..0000000 --- a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts +++ /dev/null @@ -1,311 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsMasterAwbModels { - /** - * MasterAwbDocumentOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - * @property { string } name Name - */ - export const MasterAwbDocumentOtherChargeDTOSchema = z - .object({ - chargeTypeId: z.string().describe("Charge type ID").nullish(), - sellRate: z.number().describe("Sell rate"), - name: z.string().describe("Name").nullish(), - }) - .readonly(); - export type MasterAwbDocumentOtherChargeDTO = z.infer; - - /** - * MasterAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { number } totalOtherCharges Total other charges - * @property { number } total Total - * @property { MasterAwbDocumentOtherChargeDTO[] } otherCharges Other charges - */ - export const MasterAwbDocumentChargesDTOSchema = z - .object({ - weightCharge: z.number().describe("Weight charge"), - totalOtherCharges: z.number().describe("Total other charges"), - total: z.number().describe("Total"), - otherCharges: z.array(MasterAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges"), - }) - .readonly(); - export type MasterAwbDocumentChargesDTO = z.infer; - - /** - * MasterAwbDocumentCargoDTOSchema - * @type { object } - * @property { number } quantity Quantity - * @property { number } grossWeight Gross weight - * @property { string } rateClass Rate class - * @property { string } commodityItemNo Commodity item number - * @property { number } rateOrCharge Rate or charge - * @property { number } total Total - * @property { string } description Description - */ - export const MasterAwbDocumentCargoDTOSchema = z - .object({ - quantity: z.number().describe("Quantity"), - grossWeight: z.number().describe("Gross weight").nullish(), - rateClass: z.string().describe("Rate class").nullish(), - commodityItemNo: z.string().describe("Commodity item number").nullish(), - rateOrCharge: z.number().describe("Rate or charge").nullish(), - total: z.number().describe("Total").nullish(), - description: z.string().describe("Description").nullish(), - }) - .readonly(); - export type MasterAwbDocumentCargoDTO = z.infer; - - /** - * MasterAwbDocumentRouteDTOSchema - * @type { object } - * @property { string } airportOfDeparture Airport of departure - * @property { string } airportOfDestination Airport of destination - * @property { string } toAirport1 To airport 1 - * @property { string } byCarrier1 By carrier 1 - * @property { string } toAirport2 To airport 2 - * @property { string } byCarrier2 By carrier 2 - * @property { string } toAirport3 To airport 3 - * @property { string } byCarrier3 By carrier 3 - * @property { string } flightNumber1 Flight number 1 - * @property { string } flightDay1 Flight day 1 - * @property { string } flightNumber2 Flight number 2 - * @property { string } flightDay2 Flight day 2 - */ - export const MasterAwbDocumentRouteDTOSchema = z - .object({ - airportOfDeparture: z.string().describe("Airport of departure"), - airportOfDestination: z.string().describe("Airport of destination"), - toAirport1: z.string().describe("To airport 1").nullish(), - byCarrier1: z.string().describe("By carrier 1").nullish(), - toAirport2: z.string().describe("To airport 2").nullish(), - byCarrier2: z.string().describe("By carrier 2").nullish(), - toAirport3: z.string().describe("To airport 3").nullish(), - byCarrier3: z.string().describe("By carrier 3").nullish(), - flightNumber1: z.string().describe("Flight number 1").nullish(), - flightDay1: z.string().describe("Flight day 1").nullish(), - flightNumber2: z.string().describe("Flight number 2").nullish(), - flightDay2: z.string().describe("Flight day 2").nullish(), - }) - .readonly(); - export type MasterAwbDocumentRouteDTO = z.infer; - - /** - * MasterAwbDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ - export const MasterAwbDocumentBusinessPartnerResponseDTOSchema = z - .object({ - id: z.string().describe("ID of the business partner"), - name: z.string().describe("Name of the business partner"), - address: z.string().describe("Address of the business partner"), - }) - .readonly(); - export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer< - typeof MasterAwbDocumentBusinessPartnerResponseDTOSchema - >; - - /** - * MasterAwbDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the Master AWB document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the Master AWB document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } currency Currency - * @property { number } versionNumber Version number of the document - * @property { string } mawbNumber MAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { MasterAwbDocumentCargoDTO[] } cargo Cargo packages - * @property { MasterAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } signingLocation Signing location - * @property { string } issuerIataCode Issuer IATA code - * @property { number } exchangeRate Exchange rate - * @property { MasterAwbDocumentRouteDTO } route Route - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } issuer Issuer - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { CommonModels.DocumentConfigDTO } config Config - */ - export const MasterAwbDocumentResponseDTOSchema = z - .object({ - id: z.string().describe("Unique identifier of the Master AWB document"), - positionId: z.string().describe("Unique identifier of the position this document belongs to"), - positionNumber: z.string().describe("Position number for reference"), - name: z.string().describe("Name of the Master AWB document"), - nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), - defaultFileName: z.string(), - currency: z.string().describe("Currency").nullish(), - versionNumber: z.number().describe("Version number of the document"), - mawbNumber: z.string().describe("MAWB number").nullish(), - sciReference: z.string().describe("SCI reference").nullish(), - reference1: z.string().describe("Reference 1").nullish(), - reference2: z.string().describe("Reference 2").nullish(), - reference3: z.string().describe("Reference 3").nullish(), - additionalText: CommonModels.EditorContentResponseDtoSchema.describe( - "Additional text for the document", - ).nullish(), - handlingInstructions: z.string().describe("Handling instructions").nullish(), - accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), - additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), - isSecured: z.boolean().describe("Is secured"), - suppressContainerWeight: z.boolean().describe("Suppress container weight"), - suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), - cargo: z.array(MasterAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), - charges: MasterAwbDocumentChargesDTOSchema.describe("Charges").nullish(), - shipperSigner: z.string().describe("Shipper signer").nullish(), - shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), - signer: z.string().describe("Signer").nullish(), - signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), - signingLocation: z.string().describe("Signing location").nullish(), - issuerIataCode: z.string().describe("Issuer IATA code").nullish(), - exchangeRate: z.number().describe("Exchange rate").nullish(), - route: MasterAwbDocumentRouteDTOSchema.describe("Route").nullish(), - consignee: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), - shipper: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), - issuer: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), - bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), - footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), - createdAt: z.iso.datetime({ offset: true }).describe("Created at"), - updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), - config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish(), - }) - .readonly(); - export type MasterAwbDocumentResponseDTO = z.infer; - - /** - * UpdateMasterAwbDocumentChargesOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - */ - export const UpdateMasterAwbDocumentChargesOtherChargeDTOSchema = z - .object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }) - .readonly(); - export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer< - typeof UpdateMasterAwbDocumentChargesOtherChargeDTOSchema - >; - - /** - * UpdateMasterAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { UpdateMasterAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges - */ - export const UpdateMasterAwbDocumentChargesDTOSchema = z - .object({ - weightCharge: z.number().describe("Weight charge"), - otherCharges: z.array(UpdateMasterAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges"), - }) - .readonly(); - export type UpdateMasterAwbDocumentChargesDTO = z.infer; - - /** - * UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ - export const UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema = z - .object({ - id: z.string().describe("Business partner ID"), - address: z.string().describe("Business partner address"), - }) - .readonly(); - export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer< - typeof UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema - >; - - /** - * UpdateMasterAwbDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } mawbNumber MAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { UpdateMasterAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } issuerId Issuer ID - * @property { string } issuerName Issuer name - * @property { string } issuerAddress Issuer address - * @property { string } issuerCity Issuer city - * @property { string } issuerIataCode Issuer IATA code - * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ - export const UpdateMasterAwbDocumentRequestDTOSchema = z - .object({ - nameSuffix: z.string().describe("Document name suffix"), - mawbNumber: z.string().describe("MAWB number"), - sciReference: z.string().describe("SCI reference"), - reference1: z.string().describe("Reference 1"), - reference2: z.string().describe("Reference 2"), - reference3: z.string().describe("Reference 3"), - additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text for the document"), - handlingInstructions: z.string().describe("Handling instructions"), - accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), - additionalAccountingNotes: z.string().describe("Additional accounting notes"), - isSecured: z.boolean().describe("Is secured"), - suppressContainerWeight: z.boolean().describe("Suppress container weight"), - suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), - charges: UpdateMasterAwbDocumentChargesDTOSchema.describe("Charges"), - shipperSigner: z.string().describe("Shipper signer"), - shipperSignerUserName: z.string().describe("Shipper signer user name"), - signer: z.string().describe("Signer"), - signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), - issuerId: z.string().describe("Issuer ID"), - issuerName: z.string().describe("Issuer name"), - issuerAddress: z.string().describe("Issuer address"), - issuerCity: z.string().describe("Issuer city"), - issuerIataCode: z.string().describe("Issuer IATA code"), - consignee: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), - shipper: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), - exchangeRate: z.number().describe("Exchange rate"), - bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), - footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), - }) - .readonly(); - export type UpdateMasterAwbDocumentRequestDTO = z.infer; -} diff --git a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts b/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts deleted file mode 100644 index 236a943..0000000 --- a/test/generated/dist/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsMasterAwbAcl } from "./workingDocumentsMasterAwb.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsMasterAwbApi } from "./workingDocumentsMasterAwb.api"; - -export namespace WorkingDocumentsMasterAwbQueries { - export const moduleName = QueryModule.WorkingDocumentsMasterAwb; - - export const keys = { - all: [moduleName] as const, - getMasterAwbData: (positionId: string, mawbId: string, officeId: string) => - [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId", positionId, mawbId, officeId] as const, - previewMasterAwb: (positionId: string, mawbId: string, officeId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/mawbs/:mawbId/preview", - positionId, - mawbId, - officeId, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create a Master AWB document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId })); - return WorkingDocumentsMasterAwbApi.create(positionId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetMasterAwbData` - * @summary Get Master AWB document data - * @permission Requires `canUseGetMasterAwbData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.mawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetMasterAwbData = ( - { positionId, mawbId, officeId }: { positionId: string; mawbId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId })); - return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateMasterAwbData` - * @summary Update Master AWB document data - * @permission Requires `canUseUpdateMasterAwbData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateMasterAwbData = ( - options?: AppMutationOptions< - typeof WorkingDocumentsMasterAwbApi.updateMasterAwbData, - { - positionId: string; - mawbId: string; - officeId: string; - data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId, data }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId })); - return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, mawbId, officeId } = variables; - const updateKeys = [keys.getMasterAwbData(positionId, mawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteMasterAwb` - * @summary Delete Master AWB document - * @permission Requires `canUseDeleteMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Master AWB document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteMasterAwb = ( - options?: AppMutationOptions< - typeof WorkingDocumentsMasterAwbApi.deleteMasterAwb, - { positionId: string; mawbId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId })); - return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `usePreviewMasterAwb` - recommended when file should be cached - * @summary Preview Master AWB document - * @permission Requires `canUsePreviewMasterAwb` ability - * @param { string } object.positionId Path parameter - * @param { string } object.mawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ - export const usePreviewMasterAwb = ( - { positionId, mawbId, officeId }: { positionId: string; mawbId: string; officeId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId })); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config); - }, - ...options, - }); - }; - - /** - * Mutation `usePreviewMasterAwbMutation` - recommended when file should not be cached - * @summary Preview Master AWB document - * @permission Requires `canUsePreviewMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const usePreviewMasterAwbMutation = ( - options?: AppMutationOptions< - typeof WorkingDocumentsMasterAwbApi.previewMasterAwb, - { positionId: string; mawbId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId })); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, mawbId, officeId } = variables; - const updateKeys = [keys.previewMasterAwb(positionId, mawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateMasterAwb` - * @summary Generate Master AWB document - * @permission Requires `canUseGenerateMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useGenerateMasterAwb = ( - options?: AppMutationOptions< - typeof WorkingDocumentsMasterAwbApi.generateMasterAwb, - { positionId: string; mawbId: string; officeId: string; data: CommonModels.GenerateWorkingDocumentRequestDto } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId, data }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId })); - return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts deleted file mode 100644 index 5e29a04..0000000 --- a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsTemplatedDocumentAcl { - /** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ - export const canUseCreate = (object?: { officeId: string }) => - [ - "Create", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Create", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; - - /** - * Use for `useGetTemplatedDocument` query ability. For global ability, omit the object parameter. - * @description Read templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetTemplatedDocument` query - */ - export const canUseGetTemplatedDocument = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Read", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; - - /** - * Use for `useUpdateTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Update templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateTemplatedDocument` mutation - */ - export const canUseUpdateTemplatedDocument = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Update", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; - - /** - * Use for `useDeleteTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Delete templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteTemplatedDocument` mutation - */ - export const canUseDeleteTemplatedDocument = (object?: { officeId: string }) => - [ - "Delete", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Delete", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; - - /** - * Use for `usePreviewTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Preview templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewTemplatedDocument` mutation - */ - export const canUsePreviewTemplatedDocument = (object?: { officeId: string }) => - [ - "Read", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Read", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; - - /** - * Use for `useIssueTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Issue templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueTemplatedDocument` mutation - */ - export const canUseIssueTemplatedDocument = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Update", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; - - /** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate templated document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ - export const canUseGenerateDocumentEml = (object?: { officeId: string }) => - [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document", - ] as AbilityTuple< - "Update", - | "WorkingDocument-templated-document" - | (ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string }) - >; -} diff --git a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts deleted file mode 100644 index 0997d7b..0000000 --- a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsTemplatedDocumentApi { - export const create = ( - positionId: string, - officeId: string, - data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), - config, - ); - }; - export const getTemplatedDocument = ( - officeId: string, - positionId: string, - templatedDocumentId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - config, - ); - }; - export const updateTemplatedDocument = ( - officeId: string, - positionId: string, - templatedDocumentId: string, - data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), - config, - ); - }; - export const deleteTemplatedDocument = ( - positionId: string, - templatedDocumentId: string, - officeId: string, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - undefined, - config, - ); - }; - export const previewTemplatedDocument = ( - officeId: string, - positionId: string, - templatedDocumentId: string, - data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/pdf", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; - export const issueTemplatedDocument = ( - officeId: string, - positionId: string, - templatedDocumentId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config, - ); - }; - export const generateDocumentEml = ( - officeId: string, - positionId: string, - templatedDocumentId: string, - data: CommonModels.GenerateWorkingDocumentRequestDto, - config?: AxiosRequestConfig, - ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - ...config, - headers: { - Accept: "application/octet-stream", - }, - responseType: "blob", - rawResponse: true, - }, - ); - }; -} diff --git a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts deleted file mode 100644 index a2d225e..0000000 --- a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsTemplatedDocumentModels { - /** - * TemplatedDocumentBlueprintDtoSchema - * @type { object } - * @property { string } templateId - * @property { string } templateName - * @property { string } capturedAt - * @property { CommonModels.TemplateBlocksResponseDTO } blocks - */ - export const TemplatedDocumentBlueprintDtoSchema = z - .object({ - templateId: z.string(), - templateName: z.string(), - capturedAt: z.string(), - blocks: CommonModels.TemplateBlocksResponseDTOSchema, - }) - .readonly(); - export type TemplatedDocumentBlueprintDto = z.infer; - - /** - * TemplatedDocumentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } officeId - * @property { string } name - * @property { string } nameSuffix - * @property { string } defaultFileName - * @property { number } versionNumber - * @property { TemplatedDocumentBlueprintDto } blueprint Captured template blueprint - * @property { CommonModels.TemplatedDocumentDataDto } data Document data - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } issuedAt - */ - export const TemplatedDocumentResponseDtoSchema = z - .object({ - id: z.string(), - positionId: z.string(), - officeId: z.string(), - name: z.string(), - nameSuffix: z.string().nullish(), - defaultFileName: z.string(), - versionNumber: z.number(), - blueprint: TemplatedDocumentBlueprintDtoSchema.describe("Captured template blueprint"), - data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Document data"), - createdAt: z.iso.datetime({ offset: true }), - updatedAt: z.iso.datetime({ offset: true }), - issuedAt: z.iso.datetime({ offset: true }).nullish(), - }) - .readonly(); - export type TemplatedDocumentResponseDto = z.infer; - - /** - * UpdateTemplatedDocumentRequestDtoSchema - * @type { object } - * @property { string } nameSuffix Optional suffix for the document name - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data Partial document data to update - */ - export const UpdateTemplatedDocumentRequestDtoSchema = z - .object({ - nameSuffix: z.string().describe("Optional suffix for the document name"), - data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("Partial document data to update"), - }) - .readonly(); - export type UpdateTemplatedDocumentRequestDto = z.infer; - - /** - * CreateTemplatedDocumentRequestDtoSchema - * @type { object } - * @property { string } templateId Template ID to use for creating the document - * @property { string } nameSuffix Optional suffix for the document name - */ - export const CreateTemplatedDocumentRequestDtoSchema = z - .object({ - templateId: z.string().describe("Template ID to use for creating the document"), - nameSuffix: z.string().describe("Optional suffix for the document name").nullish(), - }) - .readonly(); - export type CreateTemplatedDocumentRequestDto = z.infer; - - /** - * GenerateWorkingDocumentPreviewRequestDtoSchema - * @type { object } - * @property { string } issuedAt - */ - export const GenerateWorkingDocumentPreviewRequestDtoSchema = z - .object({ issuedAt: z.iso.datetime({ offset: true }) }) - .readonly(); - export type GenerateWorkingDocumentPreviewRequestDto = z.infer; -} diff --git a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts b/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts deleted file mode 100644 index ac57ead..0000000 --- a/test/generated/dist/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts +++ /dev/null @@ -1,332 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsTemplatedDocumentAcl } from "./workingDocumentsTemplatedDocument.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsTemplatedDocumentApi } from "./workingDocumentsTemplatedDocument.api"; - -export namespace WorkingDocumentsTemplatedDocumentQueries { - export const moduleName = QueryModule.WorkingDocumentsTemplatedDocument; - - export const keys = { - all: [moduleName] as const, - getTemplatedDocument: (officeId: string, positionId: string, templatedDocumentId: string) => - [ - ...keys.all, - "/offices/:officeId/positions/:positionId/templated-documents/:templatedDocumentId", - officeId, - positionId, - templatedDocumentId, - ] as const, - }; - - /** - * Mutation `useCreate` - * @summary Create a templated document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useCreate = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.create, - { - positionId: string; - officeId: string; - data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data, config); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Query `useGetTemplatedDocument` - * @summary Get templated document data - * @permission Requires `canUseGetTemplatedDocument` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.templatedDocumentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ - export const useGetTemplatedDocument = ( - { - officeId, - positionId, - templatedDocumentId, - }: { officeId: string; positionId: string; templatedDocumentId: string }, - options?: AppQueryOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), - queryFn: () => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument( - officeId, - positionId, - templatedDocumentId, - config, - ); - }, - ...options, - }); - }; - - /** - * Mutation `useUpdateTemplatedDocument` - * @summary Update templated document data - * @permission Requires `canUseUpdateTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ - export const useUpdateTemplatedDocument = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument, - { - officeId: string; - positionId: string; - templatedDocumentId: string; - data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument( - officeId, - positionId, - templatedDocumentId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, templatedDocumentId } = variables; - const updateKeys = [keys.getTemplatedDocument(officeId, positionId, templatedDocumentId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useDeleteTemplatedDocument` - * @summary Delete templated document - * @permission Requires `canUseDeleteTemplatedDocument` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Templated document deleted - * @statusCodes [204, 401, 404] - */ - export const useDeleteTemplatedDocument = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument, - { positionId: string; templatedDocumentId: string; officeId: string } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, templatedDocumentId, officeId }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument( - positionId, - templatedDocumentId, - officeId, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `usePreviewTemplatedDocument` - recommended when file should not be cached - * @summary Preview templated document - * @permission Requires `canUsePreviewTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ - export const usePreviewTemplatedDocument = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument, - { - officeId: string; - positionId: string; - templatedDocumentId: string; - data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument( - officeId, - positionId, - templatedDocumentId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useIssueTemplatedDocument` - * @summary Issue templated document (generate final PDF) - * @permission Requires `canUseIssueTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ - export const useIssueTemplatedDocument = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument, - { - officeId: string; - positionId: string; - templatedDocumentId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument( - officeId, - positionId, - templatedDocumentId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; - - /** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate templated document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ - export const useGenerateDocumentEml = ( - options?: AppMutationOptions< - typeof WorkingDocumentsTemplatedDocumentApi.generateDocumentEml, - { - officeId: string; - positionId: string; - templatedDocumentId: string; - data: CommonModels.GenerateWorkingDocumentRequestDto; - } - > & - MutationEffectsOptions, - config?: AxiosRequestConfig, - ) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId })); - return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml( - officeId, - positionId, - templatedDocumentId, - data, - config, - ); - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); - }; -} diff --git a/test/generated/dist/zod.extended.ts b/test/generated/dist/zod.extended.ts deleted file mode 100644 index 205405c..0000000 --- a/test/generated/dist/zod.extended.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from "zod"; -import { ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; - -export namespace ZodExtended { - interface ParseOptions { - type: "body" | "query"; - name?: string; - errorHandler?: ErrorHandler; - } - - export function parse( - schema: z.ZodType, - data: unknown, - { type, name, errorHandler }: ParseOptions = { type: "body" }, - ) { - try { - return schema.parse(data); - } catch (e) { - if (e instanceof z.ZodError) { - e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; - } - (errorHandler ?? SharedErrorHandler).rethrowError(e); - throw e; - } - } - - function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { - if (data === undefined || data === "" || enumSchema.options.length === 0) { - return true; - } - - const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; - const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; - return new RegExp(`^${commaSeparatedOptions}$`).test(data); - } - - export const sortExp = (enumSchema: z.ZodEnum) => - z.string().superRefine((arg, ctx) => { - if (!isSortExpValid(enumSchema, arg)) { - ctx.addIssue({ - code: "invalid_value", - message: "Invalid sorting string.", - values: [], - }); - } - }); -} diff --git a/test/generated/full/aWBStocks/aWBStocks.acl.ts b/test/generated/full/aWBStocks/aWBStocks.acl.ts deleted file mode 100644 index ab8512e..0000000 --- a/test/generated/full/aWBStocks/aWBStocks.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace AWBStocksAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List AWB stocks - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Create", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get AWB stock details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useGenerateNextNumber` mutation ability. For global ability, omit the object parameter. - * @description Generate next AWB number - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateNextNumber` mutation - */ -export const canUseGenerateNextNumber = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -} diff --git a/test/generated/full/aWBStocks/aWBStocks.api.ts b/test/generated/full/aWBStocks/aWBStocks.api.ts deleted file mode 100644 index a71912d..0000000 --- a/test/generated/full/aWBStocks/aWBStocks.api.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { AWBStocksModels } from "./aWBStocks.models"; - -export namespace AWBStocksApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, - `/offices/${officeId}/awb-stocks`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: AWBStocksModels.CreateAWBStockRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks`, - ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), - config - ) -}; -export const findById = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}`, - config - ) -}; -export const update = (stockId: string, officeId: string, data: AWBStocksModels.UpdateAWBStockRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}`, - ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), - config - ) -}; -export const archive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}/archive`, - undefined, - config - ) -}; -export const unarchive = (stockId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, - undefined, - config - ) -}; -export const generateNextNumber = (officeId: string, data: AWBStocksModels.GenerateAWBNumberRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/generate-number`, - ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/aWBStocks/aWBStocks.configs.ts b/test/generated/full/aWBStocks/aWBStocks.configs.ts deleted file mode 100644 index 66cd58d..0000000 --- a/test/generated/full/aWBStocks/aWBStocks.configs.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { AWBStocksModels } from "./aWBStocks.models"; -import { AWBStocksQueries } from "./aWBStocks.queries"; -import { AWBStocksAcl } from "./aWBStocks.acl"; - -export namespace AWBStocksConfigs { -export const awbStocksConfig = { - meta: { - title: "Awb Stocks", - }, - readAll: { - acl: AWBStocksAcl.canUsePaginate, - schema: AWBStocksModels.AWBStockResponseDTOSchema, - paginated: AWBStocksQueries.usePaginate, - infinite: AWBStocksQueries.usePaginateInfinite, - filters: { - schema: AWBStocksModels.AWBStockFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AWBStocksModels.AWBStockFilterDtoSchema, - options: { - inputs: { - archived: true, - carrierId: true, - searchQuery: true, - used: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: AWBStocksModels.AWBStockResponseDTOSchema, - options: { - columns: { - id: true, - carrier: true, - startNumber: true, - lastUsedNumber: true, - stock: true, - usedCodes: true, - priority: true, - archived: true, - comments: true, - createdAt: true, - updatedAt: true, - createdBy: true, - updatedBy: true, - officeId: true, - }, - sortable: AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: AWBStocksAcl.canUseFindById, - schema: AWBStocksModels.AWBStockResponseDTOSchema, - query: AWBStocksQueries.useFindById, - }, - create: { - acl: AWBStocksAcl.canUseCreate, - schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, - mutation: AWBStocksQueries.useCreate, - inputDefs: dynamicInputs({ - schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, - options: { - inputs: { - carrierId: true, - startNumber: true, - stock: true, - priority: true, - comments: true, - officeId: true, - }, - }, -}) - }, - update: { - acl: AWBStocksAcl.canUseUpdate, - schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, - mutation: AWBStocksQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, - options: { - inputs: { - comments: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/full/aWBStocks/aWBStocks.models.ts b/test/generated/full/aWBStocks/aWBStocks.models.ts deleted file mode 100644 index 442057c..0000000 --- a/test/generated/full/aWBStocks/aWBStocks.models.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace AWBStocksModels { -/** - * AWBStockBusinessPartnerPreviewDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } name Business partner name - * @property { string } carrierPrefix Carrier prefix (3 digits) - */ -export const AWBStockBusinessPartnerPreviewDTOSchema = z.object({ id: z.string().describe("Business partner ID"), name: z.string().describe("Business partner name"), carrierPrefix: z.string().describe("Carrier prefix (3 digits)") }).readonly(); -export type AWBStockBusinessPartnerPreviewDTO = z.infer; - -/** - * AWBStockEmployeePreviewDTOSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Employee email - */ -export const AWBStockEmployeePreviewDTOSchema = z.object({ id: z.string().describe("Employee ID"), email: z.string().describe("Employee email") }).readonly(); -export type AWBStockEmployeePreviewDTO = z.infer; - -/** - * AWBStockResponseDTOSchema - * @type { object } - * @property { string } id AWB stock ID - * @property { AWBStockBusinessPartnerPreviewDTO } carrier Carrier business partner - * @property { number } startNumber Start number - * @property { number } lastUsedNumber Last used number - * @property { number } stock Stock size - * @property { number } usedCodes Used codes count - * @property { number } priority Priority - * @property { boolean } archived Is archived - * @property { string } comments Comments - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { AWBStockEmployeePreviewDTO } createdBy User who created the stock - * @property { AWBStockEmployeePreviewDTO } updatedBy User who updated the stock - * @property { string } officeId Office ID - */ -export const AWBStockResponseDTOSchema = z.object({ id: z.string().describe("AWB stock ID"), carrier: AWBStockBusinessPartnerPreviewDTOSchema.describe("Carrier business partner"), startNumber: z.number().describe("Start number"), lastUsedNumber: z.number().describe("Last used number").nullish(), stock: z.number().describe("Stock size"), usedCodes: z.number().describe("Used codes count"), priority: z.number().describe("Priority"), archived: z.boolean().describe("Is archived"), comments: z.string().describe("Comments").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), createdBy: AWBStockEmployeePreviewDTOSchema.describe("User who created the stock"), updatedBy: AWBStockEmployeePreviewDTOSchema.describe("User who updated the stock").nullish(), officeId: z.string().describe("Office ID") }).readonly(); -export type AWBStockResponseDTO = z.infer; - -/** - * AWBStockFilterDtoSchema - * @type { object } - * @property { boolean } archived - * @property { string } carrierId - * @property { string } searchQuery - * @property { boolean } used - */ -export const AWBStockFilterDtoSchema = z.object({ archived: z.boolean(), carrierId: z.string(), searchQuery: z.string(), used: z.boolean() }).readonly(); -export type AWBStockFilterDto = z.infer; - -/** - * CreateAWBStockRequestDTOSchema - * @type { object } - * @property { string } carrierId Carrier business partner ID - * @property { number } startNumber Start number. Minimum: `0` - * @property { number } stock Stock size - * @property { number } priority Priority - * @property { string } comments Comments - * @property { string } officeId Office ID - */ -export const CreateAWBStockRequestDTOSchema = z.object({ carrierId: z.string().describe("Carrier business partner ID"), startNumber: z.number().gte(0).describe("Start number"), stock: z.number().describe("Stock size"), priority: z.number().describe("Priority"), comments: z.string().describe("Comments").nullish(), officeId: z.string().describe("Office ID") }).readonly(); -export type CreateAWBStockRequestDTO = z.infer; - -/** - * GenerateAWBNumberRequestDTOSchema - * @type { object } - * @property { string } carrierId Carrier ID. Example: `e847c7dd-a364-4488-bed6-1e5878aff022` - */ -export const GenerateAWBNumberRequestDTOSchema = z.object({ carrierId: z.string().describe("Carrier ID") }).readonly(); -export type GenerateAWBNumberRequestDTO = z.infer; - -/** - * GenerateAWBNumberResponseDTOSchema - * @type { object } - * @property { string } formattedAwbNumber Generated AWB number. Example: `123-45678901` - */ -export const GenerateAWBNumberResponseDTOSchema = z.object({ formattedAwbNumber: z.string().describe("Generated AWB number") }).readonly(); -export type GenerateAWBNumberResponseDTO = z.infer; - -/** - * UpdateAWBStockRequestDTOSchema - * @type { object } - * @property { string } comments Comments - */ -export const UpdateAWBStockRequestDTOSchema = z.object({ comments: z.string().describe("Comments") }).readonly(); -export type UpdateAWBStockRequestDTO = z.infer; - -/** - * AWBStocksPaginateOrderParamEnumSchema - * @type { enum } - */ -export const AWBStocksPaginateOrderParamEnumSchema = z.enum(["createdAt", "updatedAt", "createdBy", "updatedBy", "carrierName", "startNumber", "priority"]); -export type AWBStocksPaginateOrderParamEnum = z.infer; -export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSchema.enum; - -/** - * AWBStocksPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { AWBStockResponseDTO[] } items - */ -export const AWBStocksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AWBStockResponseDTOSchema).readonly() }).readonly().shape }); -export type AWBStocksPaginateResponse = z.infer; - -} diff --git a/test/generated/full/aWBStocks/aWBStocks.queries.ts b/test/generated/full/aWBStocks/aWBStocks.queries.ts deleted file mode 100644 index 7c0a52a..0000000 --- a/test/generated/full/aWBStocks/aWBStocks.queries.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AWBStocksAcl } from "./aWBStocks.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AWBStocksModels } from "./aWBStocks.models"; -import { AWBStocksApi } from "./aWBStocks.api"; - -export namespace AWBStocksQueries { -export const moduleName = QueryModule.AWBStocks; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (stockId: string, officeId: string) => [...keys.all, "/offices/:officeId/awb-stocks/:stockId", stockId, officeId] as const, -}; - -/** - * Query `usePaginate` - * @summary List AWB stocks - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` - * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); - return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary List AWB stocks - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` - * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); - return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create AWB stock - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.CreateAWBStockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(AWBStocksAcl.canUseCreate({ officeId } )); - return AWBStocksApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get AWB stock details - * @permission Requires `canUseFindById` ability - * @param { string } object.stockId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ stockId, officeId }: { stockId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(stockId, officeId), - queryFn: () => { - checkAcl(AWBStocksAcl.canUseFindById({ officeId } )); - return AWBStocksApi.findById(stockId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update AWB stock comments - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.UpdateAWBStockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId, data }) => { - checkAcl(AWBStocksAcl.canUseUpdate({ officeId } )); - return AWBStocksApi.update(stockId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive AWB stock - * @permission Requires `canUseArchive` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId }) => { - checkAcl(AWBStocksAcl.canUseArchive({ officeId } )); - return AWBStocksApi.archive(stockId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive AWB stock - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId }) => { - checkAcl(AWBStocksAcl.canUseUnarchive({ officeId } )); - return AWBStocksApi.unarchive(stockId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateNextNumber` - * @summary Generate next AWB number for carrier - * @permission Requires `canUseGenerateNextNumber` ability - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.GenerateAWBNumberRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateNextNumber = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId } )); - return AWBStocksApi.generateNextNumber(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/acl/app.ability.ts b/test/generated/full/acl/app.ability.ts deleted file mode 100644 index 7b598a8..0000000 --- a/test/generated/full/acl/app.ability.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { PureAbility, AbilityTuple, ForcedSubject } from "@casl/ability"; - -export type AppAbilities = -| AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, } | "Office" | "Currency" | "Country" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | ForcedSubject<"Role"> & { context?: string, } | "Permission" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId?: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, } | ForcedSubject<"Office"> & { officeId: string, }> -| AbilityTuple<"Create", "Office" | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "Airport" | "Port" | "ContainerYard" | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> -| AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, } | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }> -| AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "PackageType" | "ChargeType" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> -| AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "Terminal" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }> -| AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }> -| AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> -| AbilityTuple<"ListRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> -| AbilityTuple<"UpdateRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> -| AbilityTuple<"Deactivate", "Customer"> -| AbilityTuple<"Reactivate", "Customer"> -| AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, } | "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }> -| AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> -| AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }> -| AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }> - -export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/full/acl/useAclCheck.ts b/test/generated/full/acl/useAclCheck.ts deleted file mode 100644 index 95b4403..0000000 --- a/test/generated/full/acl/useAclCheck.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; -import { type ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; -import { AbilityContext } from "@povio/openapi-codegen-cli/acl"; -import { useCallback } from "react"; -import { AppAbilities } from "@/data/acl/app.ability"; - -interface UseAclCheckProps { - errorHandler?: ErrorHandler; -} - -export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { - const ability = AbilityContext.useAbility(); - - const checkAcl = useCallback((appAbility: AppAbilities) => { - if (!ability.can(...(appAbility as AbilityTuple))) { - (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); - } - }, [ability, errorHandler]); - - return { checkAcl }; -} diff --git a/test/generated/full/airPositions/airPositions.acl.ts b/test/generated/full/airPositions/airPositions.acl.ts deleted file mode 100644 index 6c0afca..0000000 --- a/test/generated/full/airPositions/airPositions.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace AirPositionsAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get air position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update air position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/full/airPositions/airPositions.api.ts b/test/generated/full/airPositions/airPositions.api.ts deleted file mode 100644 index 396d280..0000000 --- a/test/generated/full/airPositions/airPositions.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { AirPositionsModels } from "./airPositions.models"; - -export namespace AirPositionsApi { -export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/air-position`, - config - ) -}; -export const update = (officeId: string, positionId: string, data: AirPositionsModels.UpdateAirPositionRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/air-position`, - ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/airPositions/airPositions.models.ts b/test/generated/full/airPositions/airPositions.models.ts deleted file mode 100644 index c2dc2e1..0000000 --- a/test/generated/full/airPositions/airPositions.models.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { z } from "zod"; - -export namespace AirPositionsModels { -/** - * AirPositionCustomsStatusTypeEnumSchema - * @type { enum } - */ -export const AirPositionCustomsStatusTypeEnumSchema = z.enum(["Other", "X", "C", "TD", "T1"]); -export type AirPositionCustomsStatusTypeEnum = z.infer; -export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnumSchema.enum; - -/** - * AirPositionResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } hawbNumber - * @property { string } mawbNumber - * @property { string } airlineDeadline - * @property { string } customsStatus - * @property { AirPositionCustomsStatusTypeEnum } customsStatusType - * @property { boolean } hawbRequired - * @property { boolean } mawbRequired - * @property { string } mrnT1Number - * @property { boolean } isCourier - * @property { string } deliveryToConsignee - * @property { string } createdAt - * @property { string } updatedAt - */ -export const AirPositionResponseDTOSchema = z.object({ id: z.string(), hawbNumber: z.string().nullish(), mawbNumber: z.string().nullish(), airlineDeadline: z.iso.datetime({ offset: true }).nullish(), customsStatus: z.string().nullish(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), mrnT1Number: z.string().nullish(), isCourier: z.boolean().nullish(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type AirPositionResponseDTO = z.infer; - -/** - * UpdateAirPositionRequestDTOSchema - * @type { object } - * @property { string } hawbNumber - * @property { string } mawbNumber - * @property { string } airlineDeadline - * @property { string } customsStatus - * @property { AirPositionCustomsStatusTypeEnum } customsStatusType - * @property { string } mrnT1Number - * @property { boolean } hawbRequired - * @property { boolean } mawbRequired - * @property { boolean } isCourier - * @property { string } deliveryToConsignee - */ -export const UpdateAirPositionRequestDTOSchema = z.object({ hawbNumber: z.string(), mawbNumber: z.string(), airlineDeadline: z.iso.datetime({ offset: true }), customsStatus: z.string(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema, mrnT1Number: z.string(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), isCourier: z.boolean(), deliveryToConsignee: z.iso.datetime({ offset: true }) }).readonly(); -export type UpdateAirPositionRequestDTO = z.infer; - -} diff --git a/test/generated/full/airPositions/airPositions.queries.ts b/test/generated/full/airPositions/airPositions.queries.ts deleted file mode 100644 index 42c382c..0000000 --- a/test/generated/full/airPositions/airPositions.queries.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AirPositionsAcl } from "./airPositions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AirPositionsModels } from "./airPositions.models"; -import { AirPositionsApi } from "./airPositions.api"; - -export namespace AirPositionsQueries { -export const moduleName = QueryModule.AirPositions; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/air-position", officeId, positionId] as const, -}; - -/** - * Query `useGet` - * @summary Get air position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(AirPositionsAcl.canUseGet({ officeId } )); - return AirPositionsApi.get(officeId, positionId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update air position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AirPositionsModels.UpdateAirPositionRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(AirPositionsAcl.canUseUpdate({ officeId } )); - return AirPositionsApi.update(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/airports/airports.acl.ts b/test/generated/full/airports/airports.acl.ts deleted file mode 100644 index 1af795c..0000000 --- a/test/generated/full/airports/airports.acl.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace AirportsAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Airport" -] as AbilityTuple<"Read", "Airport">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Airport" -] as AbilityTuple<"Create", "Airport">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Airport" -] as AbilityTuple<"Read", "Airport">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Airport" -] as AbilityTuple<"Update", "Airport">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Airport" -] as AbilityTuple<"Read", "Airport">; - -} diff --git a/test/generated/full/airports/airports.api.ts b/test/generated/full/airports/airports.api.ts deleted file mode 100644 index 13b15e1..0000000 --- a/test/generated/full/airports/airports.api.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { AirportsModels } from "./airports.models"; - -export namespace AirportsApi { -export const paginate = (limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: AirportsModels.AirportsPaginateResponseSchema }, - `/airports`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: AirportsModels.CreateAirportRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports`, - ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), - config - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, - `/airports/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports/${id}`, - ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), - config - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports/${id}`, - config - ) -}; -} diff --git a/test/generated/full/airports/airports.configs.ts b/test/generated/full/airports/airports.configs.ts deleted file mode 100644 index 9b47119..0000000 --- a/test/generated/full/airports/airports.configs.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { AirportsModels } from "./airports.models"; -import { CommonModels } from "@/data/common/common.models"; -import { AirportsQueries } from "./airports.queries"; -import { AirportsAcl } from "./airports.acl"; - -export namespace AirportsConfigs { -export const airportsConfig = { - meta: { - title: "Airports", - }, - readAll: { - acl: AirportsAcl.canUsePaginate, - schema: AirportsModels.AirportResponseDTOSchema, - paginated: AirportsQueries.usePaginate, - infinite: AirportsQueries.usePaginateInfinite, - filters: { - schema: AirportsModels.AirportPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AirportsModels.AirportPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: AirportsModels.AirportResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - iataCode: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: AirportsModels.AirportsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: AirportsAcl.canUseFindById, - schema: AirportsModels.AirportResponseDTOSchema, - query: AirportsQueries.useFindById, - }, - create: { - acl: AirportsAcl.canUseCreate, - schema: AirportsModels.CreateAirportRequestDTOSchema, - mutation: AirportsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: AirportsModels.CreateAirportRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - iataCode: true, - }, - }, -}) - }, - update: { - acl: AirportsAcl.canUseUpdate, - schema: AirportsModels.UpdateAirportRequestDTOSchema, - mutation: AirportsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: AirportsModels.UpdateAirportRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - iataCode: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: AirportsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: AirportsQueries.usePaginateLabels, - infinite: AirportsQueries.usePaginateLabelsInfinite, - filters: { - schema: AirportsModels.AirportLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AirportsModels.AirportLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/airports/airports.models.ts b/test/generated/full/airports/airports.models.ts deleted file mode 100644 index d1d7c6c..0000000 --- a/test/generated/full/airports/airports.models.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace AirportsModels { -/** - * AirportEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type AirportEmployeeDTO = z.infer; - -/** - * AirportResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the airport - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - * @property { string } createdById - * @property { AirportEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { AirportEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const AirportResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the airport"), name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport"), createdById: z.string().nullish(), createdBy: AirportEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: AirportEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type AirportResponseDTO = z.infer; - -/** - * AirportPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter airports by name, match code or IATA code - */ -export const AirportPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter airports by name, match code or IATA code") }).readonly(); -export type AirportPaginationFilterDto = z.infer; - -/** - * AirportLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const AirportLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type AirportLabelFilterDto = z.infer; - -/** - * CreateAirportRequestDTOSchema - * @type { object } - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - */ -export const CreateAirportRequestDTOSchema = z.object({ name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport") }).readonly(); -export type CreateAirportRequestDTO = z.infer; - -/** - * UpdateAirportRequestDTOSchema - * @type { object } - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - */ -export const UpdateAirportRequestDTOSchema = z.object({ name: z.string().describe("Name of the airport"), matchCode: z.string().describe("Match code for the airport"), iataCode: z.string().describe("IATA code of the airport") }).readonly(); -export type UpdateAirportRequestDTO = z.infer; - -/** - * AirportsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const AirportsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type AirportsPaginateOrderParamEnum = z.infer; -export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSchema.enum; - -/** - * AirportsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { AirportResponseDTO[] } items - */ -export const AirportsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AirportResponseDTOSchema).readonly() }).readonly().shape }); -export type AirportsPaginateResponse = z.infer; - -/** - * AirportsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const AirportsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type AirportsPaginateLabelsOrderParamEnum = z.infer; -export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * AirportsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const AirportsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type AirportsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/airports/airports.queries.ts b/test/generated/full/airports/airports.queries.ts deleted file mode 100644 index 027bf29..0000000 --- a/test/generated/full/airports/airports.queries.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AirportsAcl } from "./airports.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AirportsModels } from "./airports.models"; -import { AirportsApi } from "./airports.api"; - -export namespace AirportsQueries { -export const moduleName = QueryModule.Airports; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string) => [...keys.all, "/airports", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string) => [...keys.all, "/airports/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/airports/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Airports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Airports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create airport - * @permission Requires `canUseCreate` ability - * @param { AirportsModels.CreateAirportRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(AirportsAcl.canUseCreate()); - return AirportsApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate airports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate airports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update airport - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { AirportsModels.UpdateAirportRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(AirportsAcl.canUseUpdate()); - return AirportsApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get airport - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(AirportsAcl.canUseFindById()); - return AirportsApi.findById(id, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/app-rest-client.ts b/test/generated/full/app-rest-client.ts deleted file mode 100644 index dc174bc..0000000 --- a/test/generated/full/app-rest-client.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RestClient } from "@povio/openapi-codegen-cli"; - -export const AppRestClient = new RestClient({ - config: { - baseURL: "http://localhost:4000" - }, -}); diff --git a/test/generated/full/bankAccounts/bankAccounts.acl.ts b/test/generated/full/bankAccounts/bankAccounts.acl.ts deleted file mode 100644 index 18ce4b2..0000000 --- a/test/generated/full/bankAccounts/bankAccounts.acl.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace BankAccountsAcl { -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Office" -] as AbilityTuple<"Read", "Office">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Office" -] as AbilityTuple<"Read", "Office">; - -} diff --git a/test/generated/full/bankAccounts/bankAccounts.api.ts b/test/generated/full/bankAccounts/bankAccounts.api.ts deleted file mode 100644 index 6a4092d..0000000 --- a/test/generated/full/bankAccounts/bankAccounts.api.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BankAccountsModels } from "./bankAccounts.models"; - -export namespace BankAccountsApi { -export const findAll = (search?: string, officeId?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, - `/bank-accounts/labels`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, - `/bank-accounts/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/full/bankAccounts/bankAccounts.configs.ts b/test/generated/full/bankAccounts/bankAccounts.configs.ts deleted file mode 100644 index 23ecfc1..0000000 --- a/test/generated/full/bankAccounts/bankAccounts.configs.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { BankAccountsModels } from "./bankAccounts.models"; -import { BankAccountsQueries } from "./bankAccounts.queries"; -import { BankAccountsAcl } from "./bankAccounts.acl"; - -export namespace BankAccountsConfigs { -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: BankAccountsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: BankAccountsQueries.usePaginateLabels, - infinite: BankAccountsQueries.usePaginateLabelsInfinite, - filters: { - schema: BankAccountsModels.BankAccountFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BankAccountsModels.BankAccountFilterDtoSchema, - options: { - inputs: { - search: true, - officeId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/bankAccounts/bankAccounts.models.ts b/test/generated/full/bankAccounts/bankAccounts.models.ts deleted file mode 100644 index 2f5199f..0000000 --- a/test/generated/full/bankAccounts/bankAccounts.models.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BankAccountsModels { -/** - * BankAccountFilterDtoSchema - * @type { object } - * @property { string } search Search by name or bank name - * @property { string } officeId Office ID to filter by - */ -export const BankAccountFilterDtoSchema = z.object({ search: z.string().describe("Search by name or bank name"), officeId: z.string().describe("Office ID to filter by") }).readonly(); -export type BankAccountFilterDto = z.infer; - -/** - * BankAccountsFindAllResponseSchema - * @type { array } - */ -export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); -export type BankAccountsFindAllResponse = z.infer; - -/** - * BankAccountsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const BankAccountsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "bankName", "createdAt", "updatedAt"]); -export type BankAccountsPaginateLabelsOrderParamEnum = z.infer; -export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * BankAccountsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const BankAccountsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type BankAccountsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/bankAccounts/bankAccounts.queries.ts b/test/generated/full/bankAccounts/bankAccounts.queries.ts deleted file mode 100644 index 0fa5c5d..0000000 --- a/test/generated/full/bankAccounts/bankAccounts.queries.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BankAccountsAcl } from "./bankAccounts.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { BankAccountsModels } from "./bankAccounts.models"; -import { BankAccountsApi } from "./bankAccounts.api"; - -export namespace BankAccountsQueries { -export const moduleName = QueryModule.BankAccounts; - -export const keys = { - all: [moduleName] as const, - findAll: (search?: string, officeId?: string) => [...keys.all, "/bank-accounts/labels", search, officeId] as const, - paginateLabels: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", "infinite", limit, order, filter, cursor] as const, -}; - -/** - * Query `useFindAll` - * @summary List all bank accounts with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { string } object.officeId Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ search, officeId }: { search?: string, officeId?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search, officeId), - queryFn: () => { - checkAcl(BankAccountsAcl.canUseFindAll()); - return BankAccountsApi.findAll(search, officeId, config) }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate bank account labels (id and name only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` - * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate bank account labels (id and name only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` - * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/full/bookkeepingExport/bookkeepingExport.acl.ts b/test/generated/full/bookkeepingExport/bookkeepingExport.acl.ts deleted file mode 100644 index 055a8b8..0000000 --- a/test/generated/full/bookkeepingExport/bookkeepingExport.acl.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BookkeepingExportAcl { -/** - * Use for `useCreateBatch` mutation ability. For global ability, omit the object parameter. - * @description Create bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBatch` mutation - */ -export const canUseCreateBatch = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Create", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `usePaginateBatches` query ability. For global ability, omit the object parameter. - * @description List bookkeeping export batches - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatches` query - */ -export const canUsePaginateBatches = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useGetBatch` query ability. For global ability, omit the object parameter. - * @description Get bookkeeping export batch details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query - */ -export const canUseGetBatch = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useUpdateBatchFormat` mutation ability. For global ability, omit the object parameter. - * @description Update bookkeeping export batch format - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchFormat` mutation - */ -export const canUseUpdateBatchFormat = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useUpdateBatchItem` mutation ability. For global ability, omit the object parameter. - * @description Update bookkeeping export batch item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchItem` mutation - */ -export const canUseUpdateBatchItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `usePaginateBatchItems` query ability. For global ability, omit the object parameter. - * @description List batch items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatchItems` query - */ -export const canUsePaginateBatchItems = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useValidateBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Export bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useValidateBookkeepingBatch` mutation - */ -export const canUseValidateBookkeepingBatch = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useExportBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Export bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportBookkeepingBatch` mutation - */ -export const canUseExportBookkeepingBatch = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useRevertBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Revert bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertBookkeepingBatch` mutation - */ -export const canUseRevertBookkeepingBatch = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useGetVatLineItems` query ability. For global ability, omit the object parameter. - * @description Get VAT line items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetVatLineItems` query - */ -export const canUseGetVatLineItems = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -} diff --git a/test/generated/full/bookkeepingExport/bookkeepingExport.api.ts b/test/generated/full/bookkeepingExport/bookkeepingExport.api.ts deleted file mode 100644 index db3d8bd..0000000 --- a/test/generated/full/bookkeepingExport/bookkeepingExport.api.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; - -export namespace BookkeepingExportApi { -export const createBatch = (officeId: string, data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, - `/offices/${officeId}/bookkeeping-exports`, - ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), - config - ) -}; -export const paginateBatches = (officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, - `/offices/${officeId}/bookkeeping-exports`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, - `/offices/${officeId}/bookkeeping-exports/${batchId}`, - config - ) -}; -export const updateBatchFormat = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, - `/offices/${officeId}/bookkeeping-exports/${batchId}`, - ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), - config - ) -}; -export const updateBatchItem = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, - ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), - config - ) -}; -export const paginateBatchItems = (officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, - `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const validateBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, - undefined, - config - ) -}; -export const exportBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, - undefined, - config - ) -}; -export const revertBookkeepingBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, - undefined, - config - ) -}; -export const getVatLineItems = (officeId: string, batchId: string, order?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, - `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - }, - } - ) -}; -} diff --git a/test/generated/full/bookkeepingExport/bookkeepingExport.configs.ts b/test/generated/full/bookkeepingExport/bookkeepingExport.configs.ts deleted file mode 100644 index b28771d..0000000 --- a/test/generated/full/bookkeepingExport/bookkeepingExport.configs.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; -import { BookkeepingExportQueries } from "./bookkeepingExport.queries"; -import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; - -export namespace BookkeepingExportConfigs { -export const bookkeepingExportsConfig = { - meta: { - title: "Bookkeeping Exports", - }, - readAll: { - acl: BookkeepingExportAcl.canUsePaginateBatches, - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, - paginated: BookkeepingExportQueries.usePaginateBatches, - infinite: BookkeepingExportQueries.usePaginateBatchesInfinite, - filters: { - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, - options: { - inputs: { - createdDate: true, - status: true, - format: true, - createdBy: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, - options: { - columns: { - id: true, - format: true, - status: true, - totalInvoiceCount: true, - exportedInvoiceCount: true, - createdBy: true, - createdAt: true, - exportedAt: true, - revertedAt: true, - files: true, - }, - sortable: BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema, - }, -}), - }, - read: { - acl: BookkeepingExportAcl.canUseGetBatch, - schema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema, - query: BookkeepingExportQueries.useGetBatch, - }, - create: { - acl: BookkeepingExportAcl.canUseCreateBatch, - schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, - mutation: BookkeepingExportQueries.useCreateBatch, - inputDefs: dynamicInputs({ - schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, - options: { - inputs: { - format: true, - invoiceFilters: true, - }, - }, -}) - }, - update: { - acl: BookkeepingExportAcl.canUseUpdateBatchFormat, - schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, - mutation: BookkeepingExportQueries.useUpdateBatchFormat, - inputDefs: dynamicInputs({ - schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, - options: { - inputs: { - format: true, - }, - }, -}) - }, -}; - -export const itemsConfig = { - meta: { - title: "Items", - }, - readAll: { - acl: BookkeepingExportAcl.canUsePaginateBatchItems, - schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, - paginated: BookkeepingExportQueries.usePaginateBatchItems, - infinite: BookkeepingExportQueries.usePaginateBatchItemsInfinite, - filters: { - schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, - options: { - inputs: { - status: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, - options: { - columns: { - id: true, - invoiceId: true, - status: true, - includedInExport: true, - validationIssues: true, - invoice: true, - receiver: true, - comments: true, - }, - sortable: BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/bookkeepingExport/bookkeepingExport.models.ts b/test/generated/full/bookkeepingExport/bookkeepingExport.models.ts deleted file mode 100644 index 3d43eef..0000000 --- a/test/generated/full/bookkeepingExport/bookkeepingExport.models.ts +++ /dev/null @@ -1,293 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BookkeepingExportModels { -/** - * BookkeepingExportFormatEnumSchema - * @type { enum } - */ -export const BookkeepingExportFormatEnumSchema = z.enum(["Bmd", "BmdWithoutCost", "BmdHamburg", "Abra", "Pantheon"]); -export type BookkeepingExportFormatEnum = z.infer; -export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enum; - -/** - * CreateBookkeepingExportBatchRequestDtoSchema - * @type { object } - * @property { BookkeepingExportFormatEnum } format - * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters - */ -export const CreateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema.nullish(), invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema }).readonly(); -export type CreateBookkeepingExportBatchRequestDto = z.infer; - -/** - * BookkeepingExportFileTypeEnumSchema - * @type { enum } - */ -export const BookkeepingExportFileTypeEnumSchema = z.enum(["Invoices", "BusinessPartners", "Report", "AbraAddressBook", "AbraIssuedInvoices", "AbraIssuedInvoiceItems", "AbraReceivedInvoices", "AbraReceivedInvoiceItems", "PantheonInvoicesOutgoingEur", "PantheonInvoicesOutgoingUsd", "PantheonInvoicesIncomingEur", "PantheonInvoicesIncomingUsd", "PantheonCostCenters"]); -export type BookkeepingExportFileTypeEnum = z.infer; -export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema.enum; - -/** - * BookkeepingExportFileDtoSchema - * @type { object } - * @property { BookkeepingExportFileTypeEnum } variant - * @property { string } downloadUrl - * @property { string } fileName - */ -export const BookkeepingExportFileDtoSchema = z.object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }).readonly(); -export type BookkeepingExportFileDto = z.infer; - -/** - * BookkeepingExportBatchStatusEnumSchema - * @type { enum } - */ -export const BookkeepingExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Reverted", "Failed"]); -export type BookkeepingExportBatchStatusEnum = z.infer; -export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnumSchema.enum; - -/** - * BookkeepingExportBatchSummaryDtoSchema - * @type { object } - * @property { number } totalCount - * @property { number } needsReviewCount - * @property { number } readyForExportCount - * @property { number } excludedCount - * @property { object } invoiceNumberRange - * @property { string } invoiceNumberRange.from - * @property { string } invoiceNumberRange.to - * @property { object } dateRange - * @property { string } dateRange.from - * @property { string } dateRange.to - */ -export const BookkeepingExportBatchSummaryDtoSchema = z.object({ totalCount: z.number(), needsReviewCount: z.number(), readyForExportCount: z.number(), excludedCount: z.number(), invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).readonly().nullish(), dateRange: z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).readonly().nullish() }).readonly(); -export type BookkeepingExportBatchSummaryDto = z.infer; - -/** - * BookkeepingExportBatchDetailsDtoSchema - * @type { object } - * @property { string } id - * @property { BookkeepingExportFormatEnum } format - * @property { BookkeepingExportBatchStatusEnum } status - * @property { number } totalInvoiceCount - * @property { number } exportedInvoiceCount - * @property { object } createdBy - * @property { string } createdBy.id - * @property { string } createdBy.fullName - * @property { string } createdBy.email - * @property { string } createdAt - * @property { string } exportedAt - * @property { string } revertedAt - * @property { object } revertedBy - * @property { string } revertedBy.id - * @property { string } revertedBy.fullName - * @property { string } revertedBy.email - * @property { BookkeepingExportBatchSummaryDto } summary - * @property { BookkeepingExportFileDto[] } files - */ -export const BookkeepingExportBatchDetailsDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), revertedBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly().nullish(), summary: BookkeepingExportBatchSummaryDtoSchema, files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish() }).readonly(); -export type BookkeepingExportBatchDetailsDto = z.infer; - -/** - * UpdateBookkeepingExportBatchRequestDtoSchema - * @type { object } - * @property { BookkeepingExportFormatEnum } format - */ -export const UpdateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema }).readonly(); -export type UpdateBookkeepingExportBatchRequestDto = z.infer; - -/** - * BookkeepingExportBatchPreviewDtoSchema - * @type { object } - * @property { string } id - * @property { BookkeepingExportFormatEnum } format - * @property { BookkeepingExportBatchStatusEnum } status - * @property { number } totalInvoiceCount - * @property { number } exportedInvoiceCount - * @property { object } createdBy - * @property { string } createdBy.id - * @property { string } createdBy.fullName - * @property { string } createdBy.email - * @property { string } createdAt - * @property { string } exportedAt - * @property { string } revertedAt - * @property { BookkeepingExportFileDto[] } files - */ -export const BookkeepingExportBatchPreviewDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).readonly(), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), files: z.array(BookkeepingExportFileDtoSchema).readonly().nullish() }).readonly(); -export type BookkeepingExportBatchPreviewDto = z.infer; - -/** - * DateRangeSchema - * @type { object } - * @property { string } from - * @property { string } to - */ -export const DateRangeSchema = z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).readonly(); -export type DateRange = z.infer; - -/** - * BookkeepingExportBatchPreviewFilterDtoSchema - * @type { object } - * @property { DateRange } createdDate - * @property { BookkeepingExportBatchStatusEnum[] } status - * @property { BookkeepingExportFormatEnum[] } format - * @property { string[] } createdBy - */ -export const BookkeepingExportBatchPreviewFilterDtoSchema = z.object({ createdDate: DateRangeSchema, status: z.array(BookkeepingExportBatchStatusEnumSchema).readonly(), format: z.array(BookkeepingExportFormatEnumSchema).readonly(), createdBy: z.array(z.string()).readonly() }).readonly(); -export type BookkeepingExportBatchPreviewFilterDto = z.infer; - -/** - * BookkeepingExportBatchItemStatusEnumSchema - * @type { enum } - */ -export const BookkeepingExportBatchItemStatusEnumSchema = z.enum(["Selected", "NeedsReview", "ReadyForExport", "Exported", "Excluded"]); -export type BookkeepingExportBatchItemStatusEnum = z.infer; -export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemStatusEnumSchema.enum; - -/** - * BookkeepingExportItemDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } invoiceId - * @property { BookkeepingExportBatchItemStatusEnum } status - * @property { boolean } includedInExport - * @property { string[] } validationIssues - * @property { object } invoice - * @property { string } invoice.invoiceNumber - * @property { string } invoice.issuingDate - * @property { string } invoice.currency - * @property { number } invoice.amount - * @property { number } invoice.tax - * @property { string[] } invoice.vatRules - * @property { object } receiver - * @property { string } receiver.id - * @property { string } receiver.name - * @property { string } receiver.matchCode - * @property { string } receiver.label - * @property { string } receiver.account - * @property { string } receiver.contraAccount - * @property { string } comments - */ -export const BookkeepingExportItemDetailDtoSchema = z.object({ id: z.string(), invoiceId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).readonly().nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), vatRules: z.array(z.string()).readonly() }).readonly(), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }).readonly(), comments: z.string().nullish() }).readonly(); -export type BookkeepingExportItemDetailDto = z.infer; - -/** - * BookkeepingExportItemDetailFilterDtoSchema - * @type { object } - * @property { BookkeepingExportBatchItemStatusEnum[] } status - */ -export const BookkeepingExportItemDetailFilterDtoSchema = z.object({ status: z.array(BookkeepingExportBatchItemStatusEnumSchema).readonly() }).readonly(); -export type BookkeepingExportItemDetailFilterDto = z.infer; - -/** - * BookkeepingExportVatLineItemDtoSchema - * @type { object } - * @property { string } invoiceId - * @property { string } batchId - * @property { string } batchItemId - * @property { BookkeepingExportBatchItemStatusEnum } status - * @property { boolean } includedInExport - * @property { string[] } validationIssues - * @property { object } invoice - * @property { string } invoice.invoiceNumber - * @property { string } invoice.issuingDate - * @property { string } invoice.currency - * @property { number } invoice.amount - * @property { number } invoice.tax - * @property { string } invoice.comments - * @property { object } receiver - * @property { string } receiver.id - * @property { string } receiver.name - * @property { string } receiver.matchCode - * @property { string } receiver.label - * @property { string } receiver.account - * @property { string } receiver.contraAccount - * @property { number } vatPercentage - * @property { string } vatRule - * @property { number } netAmount - * @property { number } vatAmount - * @property { number } grossAmount - * @property { number } vatAmountInOfficeCurrency - * @property { number } netAmountInOfficeCurrency - * @property { number } grossAmountInOfficeCurrency - * @property { string } officeCurrency - */ -export const BookkeepingExportVatLineItemDtoSchema = z.object({ invoiceId: z.string(), batchId: z.string(), batchItemId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).readonly().nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), comments: z.string().nullish() }).readonly(), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }).readonly(), vatPercentage: z.number(), vatRule: z.string(), netAmount: z.number(), vatAmount: z.number(), grossAmount: z.number(), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish(), officeCurrency: z.string() }).readonly(); -export type BookkeepingExportVatLineItemDto = z.infer; - -/** - * CreateBookkeepingExportBatchResponseDtoSchema - * @type { object } - * @property { string } batchId - */ -export const CreateBookkeepingExportBatchResponseDtoSchema = z.object({ batchId: z.string() }).readonly(); -export type CreateBookkeepingExportBatchResponseDto = z.infer; - -/** - * UpdateBookkeepingExportBatchItemRequestDtoSchema - * @type { object } - * @property { boolean } includedInExport Whether the item should be included in the export - * @property { string[] } itemIds Min Items: `0` - * @property { boolean } vatOk - * @property { boolean } invoiceOk - */ -export const UpdateBookkeepingExportBatchItemRequestDtoSchema = z.object({ includedInExport: z.boolean().describe("Whether the item should be included in the export").nullish(), itemIds: z.array(z.string()).readonly(), vatOk: z.boolean().nullish(), invoiceOk: z.boolean().nullish() }).readonly(); -export type UpdateBookkeepingExportBatchItemRequestDto = z.infer; - -/** - * PaginateBatchesOrderParamEnumSchema - * @type { enum } - */ -export const PaginateBatchesOrderParamEnumSchema = z.enum(["createdAt", "status", "format", "totalInvoiceCount"]); -export type PaginateBatchesOrderParamEnum = z.infer; -export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema.enum; - -/** - * PaginateBatchesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookkeepingExportBatchPreviewDto[] } items - */ -export const PaginateBatchesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).readonly() }).readonly().shape }); -export type PaginateBatchesResponse = z.infer; - -/** - * PaginateBatchItemsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateBatchItemsOrderParamEnumSchema = z.enum(["issuingDate"]); -export type PaginateBatchItemsOrderParamEnum = z.infer; -export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnumSchema.enum; - -/** - * PaginateBatchItemsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookkeepingExportItemDetailDto[] } items - */ -export const PaginateBatchItemsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).readonly() }).readonly().shape }); -export type PaginateBatchItemsResponse = z.infer; - -/** - * GetVatLineItemsOrderParamEnumSchema - * @type { enum } - */ -export const GetVatLineItemsOrderParamEnumSchema = z.enum(["account", "contraAccount", "issuingDate", "invoiceNumber", "receiver"]); -export type GetVatLineItemsOrderParamEnum = z.infer; -export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema.enum; - -/** - * GetVatLineItemsResponseSchema - * @type { array } - */ -export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema).readonly(); -export type GetVatLineItemsResponse = z.infer; - -} diff --git a/test/generated/full/bookkeepingExport/bookkeepingExport.queries.ts b/test/generated/full/bookkeepingExport/bookkeepingExport.queries.ts deleted file mode 100644 index 5281e85..0000000 --- a/test/generated/full/bookkeepingExport/bookkeepingExport.queries.ts +++ /dev/null @@ -1,351 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; -import { BookkeepingExportApi } from "./bookkeepingExport.api"; - -export namespace BookkeepingExportQueries { -export const moduleName = QueryModule.BookkeepingExport; - -export const keys = { - all: [moduleName] as const, - paginateBatches: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", officeId, limit, order, filter, page, cursor] as const, - paginateBatchesInfinite: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", "infinite", officeId, limit, order, filter, cursor] as const, - getBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/:batchId", officeId, batchId] as const, - paginateBatchItems: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", officeId, batchId, limit, order, filter, page, cursor] as const, - paginateBatchItemsInfinite: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", "infinite", officeId, batchId, limit, order, filter, cursor] as const, - getVatLineItems: (officeId: string, batchId: string, order?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/vat-line-items", officeId, batchId, order] as const, -}; - -/** - * Mutation `useCreateBatch` - * @summary Create bookkeeping export batch - * @permission Requires `canUseCreateBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId } )); - return BookkeepingExportApi.createBatch(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateBatches` - * @summary List bookkeeping export batches - * @permission Requires `canUsePaginateBatches` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` - * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatches = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateBatchesInfinite - * @summary List bookkeeping export batches - * @permission Requires `canUsePaginateBatches` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` - * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatchesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetBatch` - * @summary Get bookkeeping export batch details - * @permission Requires `canUseGetBatch` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBatch(officeId, batchId), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId } )); - return BookkeepingExportApi.getBatch(officeId, batchId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateBatchFormat` - * @summary Update bookkeeping export batch format - * @permission Requires `canUseUpdateBatchFormat` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBatchFormat = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId, data }) => { - checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId } )); - return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, batchId } = variables; - const updateKeys = [keys.getBatch(officeId, batchId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBatchItem` - * @summary Update bookkeeping export batch item inclusion - * @permission Requires `canUseUpdateBatchItem` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBatchItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId, data }) => { - checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId } )); - return BookkeepingExportApi.updateBatchItem(officeId, batchId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateBatchItems` - * @summary List batch items with filters and pagination - * @permission Requires `canUsePaginateBatchItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` - * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatchItems = ({ officeId, batchId, limit, order, filter, page, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); - return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateBatchItemsInfinite - * @summary List batch items with filters and pagination - * @permission Requires `canUsePaginateBatchItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` - * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatchItemsInfinite = ({ officeId, batchId, limit, order, filter, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); - return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useValidateBookkeepingBatch` - * @summary Validate bookkeeping batch - * @permission Requires `canUseValidateBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useValidateBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportBookkeepingBatch` - * @summary Export bookkeeping batch - * @permission Requires `canUseExportBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useExportBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRevertBookkeepingBatch` - * @summary Revert bookkeeping export batch - * @permission Requires `canUseRevertBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useRevertBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetVatLineItems` - * @summary Get VAT line items for bookkeeping export batch - * @permission Requires `canUseGetVatLineItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): account, contraAccount, issuingDate, invoiceNumber, receiver. Example: `account` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetVatLineItems = ({ officeId, batchId, order }: { officeId: string, batchId: string, order?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getVatLineItems(officeId, batchId, order), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId } )); - return BookkeepingExportApi.getVatLineItems(officeId, batchId, order, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts deleted file mode 100644 index 1fc9403..0000000 --- a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnerBookkeepingMappingsAcl { -/** - * Use for `useGetBookkeepingMappings` query ability. For global ability, omit the object parameter. - * @description List business partner bookkeeping mappings - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBookkeepingMappings` query - */ -export const canUseGetBookkeepingMappings = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Create business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBookkeepingMapping` mutation - */ -export const canUseCreateBookkeepingMapping = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -/** - * Use for `useUpdateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Update business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMapping` mutation - */ -export const canUseUpdateBookkeepingMapping = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -/** - * Use for `useUpdateBookkeepingMappingById` mutation ability. For global ability, omit the object parameter. - * @description Update business partner bookkeeping mapping by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMappingById` mutation - */ -export const canUseUpdateBookkeepingMappingById = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -/** - * Use for `useDeleteBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBookkeepingMapping` mutation - */ -export const canUseDeleteBookkeepingMapping = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Delete", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -} diff --git a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts deleted file mode 100644 index b527abc..0000000 --- a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; - -export namespace BusinessPartnerBookkeepingMappingsApi { -export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - config - ) -}; -export const createBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), - config - ) -}; -export const updateBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), - config - ) -}; -export const updateBookkeepingMappingById = (officeId: string, businessPartnerId: string, id: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), - config - ) -}; -export const deleteBookkeepingMapping = (officeId: string, businessPartnerId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts deleted file mode 100644 index 90ad3ac..0000000 --- a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { z } from "zod"; - -export namespace BusinessPartnerBookkeepingMappingsModels { -/** - * BusinessPartnerBookkeepingMappingResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { string } businessPartnerId - * @property { boolean } paysTaxInEurForFactoring - */ -export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z.object({ id: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), currencyNotation: z.string().nullish(), businessPartnerId: z.string(), paysTaxInEurForFactoring: z.boolean().nullish() }).readonly(); -export type BusinessPartnerBookkeepingMappingResponseDto = z.infer; - -/** - * BusinessPartnerBookkeepingMappingsResponseDtoSchema - * @type { object } - * @property { BusinessPartnerBookkeepingMappingResponseDto[] } bookkeepingMappings - */ -export const BusinessPartnerBookkeepingMappingsResponseDtoSchema = z.object({ bookkeepingMappings: z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly() }).readonly(); -export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer; - -/** - * UpdateBookkeepingMappingDtoSchema - * @type { object } - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) - */ -export const UpdateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string(), creditorId: z.string(), currencyNotation: z.string(), paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)") }).readonly(); -export type UpdateBookkeepingMappingDto = z.infer; - -/** - * UpdateBookkeepingMappingRequestDtoSchema - * @type { object } - * @property { UpdateBookkeepingMappingDto[] } bookkeepingMappings - */ -export const UpdateBookkeepingMappingRequestDtoSchema = z.object({ bookkeepingMappings: z.array(UpdateBookkeepingMappingDtoSchema).readonly() }).readonly(); -export type UpdateBookkeepingMappingRequestDto = z.infer; - -/** - * CreateBookkeepingMappingDtoSchema - * @type { object } - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) - */ -export const CreateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string(), creditorId: z.string(), currencyNotation: z.string(), paysTaxInEurForFactoring: z.boolean().describe("Pays tax in EUR for factoring (Logvin case)") }).readonly(); -export type CreateBookkeepingMappingDto = z.infer; - -/** - * UpdateBookkeepingMappingResponseSchema - * @type { array } - */ -export const UpdateBookkeepingMappingResponseSchema = z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema).readonly(); -export type UpdateBookkeepingMappingResponse = z.infer; - -} diff --git a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts b/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts deleted file mode 100644 index 78fb4aa..0000000 --- a/test/generated/full/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnerBookkeepingMappingsAcl } from "./businessPartnerBookkeepingMappings.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; -import { BusinessPartnerBookkeepingMappingsApi } from "./businessPartnerBookkeepingMappings.api"; - -export namespace BusinessPartnerBookkeepingMappingsQueries { -export const moduleName = QueryModule.BusinessPartnerBookkeepingMappings; - -export const keys = { - all: [moduleName] as const, - getBookkeepingMappings: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/bookkeeping-mappings", officeId, businessPartnerId] as const, -}; - -/** - * Query `useGetBookkeepingMappings` - * @summary Fetch all bookkeeping mappings for a business partner - * @permission Requires `canUseGetBookkeepingMappings` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBookkeepingMappings = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), - queryFn: () => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId, config) }, - ...options, - }); -}; - -/** - * Mutation `useCreateBookkeepingMapping` - * @summary Create a bookkeeping mapping for a business partner - * @permission Requires `canUseCreateBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping(officeId, businessPartnerId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBookkeepingMapping` - * @summary Update an existing bookkeeping mapping for a business partner - * @permission Requires `canUseUpdateBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping(officeId, businessPartnerId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBookkeepingMappingById` - * @summary Update a specific bookkeeping mapping by ID for a business partner - * @permission Requires `canUseUpdateBookkeepingMappingById` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBookkeepingMappingById = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, id, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById(officeId, businessPartnerId, id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteBookkeepingMapping` - * @summary Delete an existing bookkeeping mapping for a business partner - * @permission Requires `canUseDeleteBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, id }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/businessPartnerContacts/businessPartnerContacts.acl.ts b/test/generated/full/businessPartnerContacts/businessPartnerContacts.acl.ts deleted file mode 100644 index ea3ab69..0000000 --- a/test/generated/full/businessPartnerContacts/businessPartnerContacts.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnerContactsAcl { -/** - * Use for `useGetContacts` query ability. For global ability, omit the object parameter. - * @description List business partner contacts - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetContacts` query - */ -export const canUseGetContacts = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreateContact` mutation ability. For global ability, omit the object parameter. - * @description Create business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateContact` mutation - */ -export const canUseCreateContact = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `usePaginateContactLabels` query ability. For global ability, omit the object parameter. - * @description Paginate business partner contact labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateContactLabels` query - */ -export const canUsePaginateContactLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateContact` mutation ability. For global ability, omit the object parameter. - * @description Update business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateContact` mutation - */ -export const canUseUpdateContact = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useDeleteContact` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteContact` mutation - */ -export const canUseDeleteContact = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -} diff --git a/test/generated/full/businessPartnerContacts/businessPartnerContacts.api.ts b/test/generated/full/businessPartnerContacts/businessPartnerContacts.api.ts deleted file mode 100644 index 45ab2f9..0000000 --- a/test/generated/full/businessPartnerContacts/businessPartnerContacts.api.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; - -export namespace BusinessPartnerContactsApi { -export const getContacts = (officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - config - ) -}; -export const createContact = (officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), - config - ) -}; -export const paginateContactLabels = (officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const updateContact = (contactId: string, officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), - config - ) -}; -export const deleteContact = (contactId: string, officeId: string, businessPartnerId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/businessPartnerContacts/businessPartnerContacts.configs.ts b/test/generated/full/businessPartnerContacts/businessPartnerContacts.configs.ts deleted file mode 100644 index 9c4ccc5..0000000 --- a/test/generated/full/businessPartnerContacts/businessPartnerContacts.configs.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; -import { BusinessPartnerContactsQueries } from "./businessPartnerContacts.queries"; -import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; - -export namespace BusinessPartnerContactsConfigs { -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: BusinessPartnerContactsAcl.canUsePaginateContactLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: BusinessPartnerContactsQueries.usePaginateContactLabels, - infinite: BusinessPartnerContactsQueries.usePaginateContactLabelsInfinite, - filters: { - schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/businessPartnerContacts/businessPartnerContacts.models.ts b/test/generated/full/businessPartnerContacts/businessPartnerContacts.models.ts deleted file mode 100644 index e2c3d48..0000000 --- a/test/generated/full/businessPartnerContacts/businessPartnerContacts.models.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BusinessPartnerContactsModels { -/** - * BusinessPartnerContactRoleEnumSchema - * @type { enum } - */ -export const BusinessPartnerContactRoleEnumSchema = z.enum(["General", "CommercialManager", "SystemEngineer", "TechnicalEngineer", "Logistics", "Operations", "Sales", "Accounting", "Invoice", "Dunnings", "Reclamations", "Management"]); -export type BusinessPartnerContactRoleEnum = z.infer; -export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSchema.enum; - -/** - * BusinessPartnerContactResponseDTOSchema - * @type { object } - * @property { string } id Contact ID - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ -export const BusinessPartnerContactResponseDTOSchema = z.object({ id: z.string().describe("Contact ID"), role: BusinessPartnerContactRoleEnumSchema.nullish(), name: z.string().describe("Contact name").nullish(), email: z.string().describe("Contact email").nullish(), phone: z.string().describe("Contact phone").nullish() }).readonly(); -export type BusinessPartnerContactResponseDTO = z.infer; - -/** - * BusinessPartnerContactListResponseDTOSchema - * @type { object } - * @property { BusinessPartnerContactResponseDTO[] } contacts List of contacts - */ -export const BusinessPartnerContactListResponseDTOSchema = z.object({ contacts: z.array(BusinessPartnerContactResponseDTOSchema).readonly().describe("List of contacts") }).readonly(); -export type BusinessPartnerContactListResponseDTO = z.infer; - -/** - * CreateBusinessPartnerContactRequestDTOSchema - * @type { object } - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ -export const CreateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema, name: z.string().describe("Contact name"), email: z.string().describe("Contact email"), phone: z.string().describe("Contact phone") }).readonly(); -export type CreateBusinessPartnerContactRequestDTO = z.infer; - -/** - * UpdateBusinessPartnerContactRequestDTOSchema - * @type { object } - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ -export const UpdateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema, name: z.string().describe("Contact name"), email: z.string().describe("Contact email"), phone: z.string().describe("Contact phone") }).readonly(); -export type UpdateBusinessPartnerContactRequestDTO = z.infer; - -/** - * BusinessPartnerContactFilterDtoSchema - * @type { object } - * @property { string } search Search by name, email, or phone - */ -export const BusinessPartnerContactFilterDtoSchema = z.object({ search: z.string().describe("Search by name, email, or phone") }).readonly(); -export type BusinessPartnerContactFilterDto = z.infer; - -/** - * PaginateContactLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateContactLabelsOrderParamEnumSchema = z.enum(["name", "role", "email", "createdAt", "updatedAt"]); -export type PaginateContactLabelsOrderParamEnum = z.infer; -export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderParamEnumSchema.enum; - -/** - * PaginateContactLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateContactLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type PaginateContactLabelsResponse = z.infer; - -} diff --git a/test/generated/full/businessPartnerContacts/businessPartnerContacts.queries.ts b/test/generated/full/businessPartnerContacts/businessPartnerContacts.queries.ts deleted file mode 100644 index 345a304..0000000 --- a/test/generated/full/businessPartnerContacts/businessPartnerContacts.queries.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; -import { BusinessPartnerContactsApi } from "./businessPartnerContacts.api"; - -export namespace BusinessPartnerContactsQueries { -export const moduleName = QueryModule.BusinessPartnerContacts; - -export const keys = { - all: [moduleName] as const, - getContacts: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts", officeId, businessPartnerId] as const, - paginateContactLabels: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", officeId, businessPartnerId, limit, order, filter, page, cursor] as const, - paginateContactLabelsInfinite: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", "infinite", officeId, businessPartnerId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useGetContacts` - * @summary Get all contacts for a business partner - * @permission Requires `canUseGetContacts` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetContacts = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getContacts(officeId, businessPartnerId), - queryFn: () => { - checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId } )); - return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId, config) }, - ...options, - }); -}; - -/** - * Mutation `useCreateContact` - * @summary Create a new contact for a business partner - * @permission Requires `canUseCreateContact` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId } )); - return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateContactLabels` - * @summary Paginate business partner contact labels (id and name only) - * @permission Requires `canUsePaginateContactLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` - * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateContactLabels = ({ officeId, businessPartnerId, limit, order, filter, page, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); - return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateContactLabelsInfinite - * @summary Paginate business partner contact labels (id and name only) - * @permission Requires `canUsePaginateContactLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` - * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateContactLabelsInfinite = ({ officeId, businessPartnerId, limit, order, filter, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); - return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useUpdateContact` - * @summary Update a business partner contact - * @permission Requires `canUseUpdateContact` ability - * @param { string } mutation.contactId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId } )); - return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteContact` - * @permission Requires `canUseDeleteContact` ability - * @param { string } mutation.contactId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 204, 401] - */ -export const useDeleteContact = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ contactId, officeId, businessPartnerId }) => { - checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId } )); - return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/businessPartners/businessPartners.acl.ts b/test/generated/full/businessPartners/businessPartners.acl.ts deleted file mode 100644 index a532e2e..0000000 --- a/test/generated/full/businessPartners/businessPartners.acl.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnersAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List business partners - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Create", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Paginate business partner labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Read business partner details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useLock` mutation ability. For global ability, omit the object parameter. - * @description Lock business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLock` mutation - */ -export const canUseLock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUnlock` mutation ability. For global ability, omit the object parameter. - * @description Unlock business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlock` mutation - */ -export const canUseUnlock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetRemarks` query ability. For global ability, omit the object parameter. - * @description List business partner remarks - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetRemarks` query - */ -export const canUseGetRemarks = ( - object?: { officeId: string, } -) => [ - "ReadRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreateRemark` mutation ability. For global ability, omit the object parameter. - * @description Create business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRemark` mutation - */ -export const canUseCreateRemark = ( - object?: { officeId: string, } -) => [ - "CreateRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateRemark` mutation ability. For global ability, omit the object parameter. - * @description Update business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRemark` mutation - */ -export const canUseUpdateRemark = ( - object?: { officeId: string, } -) => [ - "UpdateRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useDeleteRemark` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemark` mutation - */ -export const canUseDeleteRemark = ( - object?: { officeId: string, } -) => [ - "DeleteRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetBasicInfo` query ability. For global ability, omit the object parameter. - * @description Read business partner basic info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBasicInfo` query - */ -export const canUseGetBasicInfo = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateBasicInfo` mutation ability. For global ability, omit the object parameter. - * @description Update business partner basic info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBasicInfo` mutation - */ -export const canUseUpdateBasicInfo = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" -] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; - -/** - * Use for `useCreateSignatureUploadInstructions` mutation ability. For global ability, omit the object parameter. - * @description Create business partner signature upload instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateSignatureUploadInstructions` mutation - */ -export const canUseCreateSignatureUploadInstructions = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" -] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; - -/** - * Use for `useGetCargoAgentInfo` query ability. For global ability, omit the object parameter. - * @description Read business partner cargo agent info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoAgentInfo` query - */ -export const canUseGetCargoAgentInfo = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateCargoAgent` mutation ability. For global ability, omit the object parameter. - * @description Update business partner cargo agent info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargoAgent` mutation - */ -export const canUseUpdateCargoAgent = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetCarrierInformation` query ability. For global ability, omit the object parameter. - * @description Read business partner carrier info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCarrierInformation` query - */ -export const canUseGetCarrierInformation = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateCarrier` mutation ability. For global ability, omit the object parameter. - * @description Update business partner carrier info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCarrier` mutation - */ -export const canUseUpdateCarrier = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -} diff --git a/test/generated/full/businessPartners/businessPartners.api.ts b/test/generated/full/businessPartners/businessPartners.api.ts deleted file mode 100644 index 379cea4..0000000 --- a/test/generated/full/businessPartners/businessPartners.api.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnersModels } from "./businessPartners.models"; - -export namespace BusinessPartnersApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, - `/offices/${officeId}/business-partners`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, - `/offices/${officeId}/business-partners`, - ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), - config - ) -}; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, - `/offices/${officeId}/business-partners/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getById = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}`, - config - ) -}; -export const update = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), - config - ) -}; -export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/unarchive`, - undefined, - config - ) -}; -export const lock = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/lock`, - undefined, - config - ) -}; -export const unlock = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/unlock`, - undefined, - config - ) -}; -export const getRemarks = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, - `/offices/${officeId}/business-partners/${id}/remarks`, - config - ) -}; -export const createRemark = (officeId: string, id: string, data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/remarks`, - ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), - config - ) -}; -export const updateRemark = (officeId: string, id: string, remarkId: string, data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), - config - ) -}; -export const deleteRemark = (officeId: string, id: string, remarkId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - undefined, - config - ) -}; -export const getBasicInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic`, - config - ) -}; -export const updateBasicInfo = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), - config - ) -}; -export const createSignatureUploadInstructions = (officeId: string, id: string, data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, - ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), - config - ) -}; -export const getCargoAgentInfo = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/cargo-agent`, - config - ) -}; -export const updateCargoAgent = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCargoAgentDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/cargo-agent`, - ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), - config - ) -}; -export const getCarrierInformation = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/carrier`, - config - ) -}; -export const updateCarrier = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCarrierDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/carrier`, - ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/businessPartners/businessPartners.configs.ts b/test/generated/full/businessPartners/businessPartners.configs.ts deleted file mode 100644 index 971a761..0000000 --- a/test/generated/full/businessPartners/businessPartners.configs.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { BusinessPartnersModels } from "./businessPartners.models"; -import { BusinessPartnersQueries } from "./businessPartners.queries"; -import { BusinessPartnersAcl } from "./businessPartners.acl"; - -export namespace BusinessPartnersConfigs { -export const businessPartnersConfig = { - meta: { - title: "Business Partners", - }, - readAll: { - acl: BusinessPartnersAcl.canUsePaginate, - schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, - paginated: BusinessPartnersQueries.usePaginate, - infinite: BusinessPartnersQueries.usePaginateInfinite, - filters: { - schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, - options: { - inputs: { - search: true, - types: true, - shortName: true, - name: true, - vat: true, - debtorId: true, - creditorId: true, - matchCode: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - address: true, - types: true, - archived: true, - shortName: true, - vat: true, - debtorId: true, - creditorId: true, - locked: true, - currency: true, - remarks: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: BusinessPartnersAcl.canUseGetById, - schema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema, - query: BusinessPartnersQueries.useGetById, - }, - create: { - acl: BusinessPartnersAcl.canUseCreate, - schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, - mutation: BusinessPartnersQueries.useCreate, - inputDefs: dynamicInputs({ - schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, - options: { - inputs: { - name: true, - secondaryName: true, - types: true, - matchCode: true, - shortName: true, - address: true, - }, - }, -}) - }, - update: { - acl: BusinessPartnersAcl.canUseUpdate, - schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, - mutation: BusinessPartnersQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - secondaryName: true, - types: true, - address: true, - blAddress: true, - belongsToId: true, - salesRepId: true, - operationsId: true, - addressIsDifferentForBl: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: BusinessPartnersAcl.canUsePaginateLabels, - schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, - paginated: BusinessPartnersQueries.usePaginateLabels, - infinite: BusinessPartnersQueries.usePaginateLabelsInfinite, - filters: { - schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, - options: { - inputs: { - search: true, - ids: true, - types: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - types: true, - }, - sortable: BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/businessPartners/businessPartners.models.ts b/test/generated/full/businessPartners/businessPartners.models.ts deleted file mode 100644 index 75c284e..0000000 --- a/test/generated/full/businessPartners/businessPartners.models.ts +++ /dev/null @@ -1,489 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BusinessPartnersModels { -/** - * RemarkVisibilitySchema - * @type { enum } - */ -export const RemarkVisibilitySchema = z.enum(["internal", "popup"]); -export type RemarkVisibility = z.infer; -export const RemarkVisibility = RemarkVisibilitySchema.enum; - -/** - * RemarkTypeSchema - * @type { enum } - */ -export const RemarkTypeSchema = z.enum(["INFORMATIONAL", "WARNING"]); -export type RemarkType = z.infer; -export const RemarkType = RemarkTypeSchema.enum; - -/** - * BusinessPartnerRemarkResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the remark - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of the remark - */ -export const BusinessPartnerRemarkResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the remark"), visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), content: z.string().describe("Content of the remark"), type: RemarkTypeSchema.describe("Type of the remark") }).readonly(); -export type BusinessPartnerRemarkResponseDTO = z.infer; - -/** - * BusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { string } city City name - * @property { string } isoCode Country code - */ -export const BusinessPartnerAddressDtoSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: z.string().describe("City name"), isoCode: z.string().describe("Country code") }).readonly(); -export type BusinessPartnerAddressDto = z.infer; - -/** - * BusinessPartnerEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BusinessPartnerEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type BusinessPartnerEmployeeDTO = z.infer; - -/** - * BusinessPartnerListResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - * @property { string } matchCode Match code of the business partner - * @property { BusinessPartnerAddressDto } address Address information - * @property { CommonModels.BusinessPartnerType[] } types List of business partner types - * @property { boolean } archived Archive status - * @property { string } shortName Short name of the business partner - * @property { string } vat VAT number of the business partner - * @property { string } debtorId Debtor ID for the local currency - * @property { string } creditorId Creditor ID for the local currency - * @property { boolean } locked Whether the business partner is locked - * @property { string } currency Currency (invoice currency) - * @property { BusinessPartnerRemarkResponseDTO[] } remarks Remarks for the business partner - * @property { string } createdById ID of the employee who created this business partner - * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this business partner - * @property { string } createdAt Date when the business partner was created - * @property { string } updatedById ID of the employee who last updated this business partner - * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this business partner - * @property { string } updatedAt Date when the business partner was last updated - */ -export const BusinessPartnerListResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), name: z.string().describe("Name of the business partner"), matchCode: z.string().describe("Match code of the business partner"), address: BusinessPartnerAddressDtoSchema.describe("Address information"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), archived: z.boolean().describe("Archive status"), shortName: z.string().describe("Short name of the business partner").nullish(), vat: z.string().describe("VAT number of the business partner").nullish(), debtorId: z.string().describe("Debtor ID for the local currency").nullish(), creditorId: z.string().describe("Creditor ID for the local currency").nullish(), locked: z.boolean().describe("Whether the business partner is locked"), currency: z.string().describe("Currency (invoice currency)").nullish(), remarks: z.array(BusinessPartnerRemarkResponseDTOSchema).readonly().describe("Remarks for the business partner"), createdById: z.string().describe("ID of the employee who created this business partner").nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this business partner").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was created"), updatedById: z.string().describe("ID of the employee who last updated this business partner").nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this business partner").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Date when the business partner was last updated") }).readonly(); -export type BusinessPartnerListResponseDTO = z.infer; - -/** - * BusinessPartnerFilterDtoSchema - * @type { object } - * @property { string } search - * @property { CommonModels.BusinessPartnerType[] } types - * @property { string } shortName - * @property { string } name - * @property { string } vat - * @property { string } debtorId - * @property { string } creditorId - * @property { string } matchCode - * @property { boolean } archived Filter by archived status - */ -export const BusinessPartnerFilterDtoSchema = z.object({ search: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly(), shortName: z.string(), name: z.string(), vat: z.string(), debtorId: z.string(), creditorId: z.string(), matchCode: z.string(), archived: z.boolean().describe("Filter by archived status") }).readonly(); -export type BusinessPartnerFilterDto = z.infer; - -/** - * BusinessPartnerPaginatedLabelResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } label Label of the business partner - * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types - */ -export const BusinessPartnerPaginatedLabelResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), label: z.string().describe("Label of the business partner"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); -export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; - -/** - * BusinessPartnerLabelsFilterDtoSchema - * @type { object } - * @property { string } search - * @property { string[] } ids Business partner ids to filter by - * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types to filter by - * @property { boolean } archived Filter by archived status - */ -export const BusinessPartnerLabelsFilterDtoSchema = z.object({ search: z.string(), ids: z.array(z.string()).readonly().describe("Business partner ids to filter by"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types to filter by"), archived: z.boolean().describe("Filter by archived status") }).readonly(); -export type BusinessPartnerLabelsFilterDto = z.infer; - -/** - * CreateBusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } district - * @property { string } countryId - */ -export const CreateBusinessPartnerAddressDtoSchema = z.object({ street: z.string(), secondaryStreet: z.string(), zip: z.string(), cityId: z.string(), district: z.string(), countryId: z.string() }).readonly(); -export type CreateBusinessPartnerAddressDto = z.infer; - -/** - * CreateBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } name Full name of the business partner. Min Length: `3` - * @property { string } secondaryName Full name of the business partner. Min Length: `3` - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { string } matchCode Unique identifier code - * @property { string } shortName Short name for the business partner - * @property { CreateBusinessPartnerAddressDto } address Address information - */ -export const CreateBusinessPartnerRequestDTOSchema = z.object({ name: z.string().min(3).describe("Full name of the business partner"), secondaryName: z.string().min(3).describe("Full name of the business partner").nullish(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), matchCode: z.string().describe("Unique identifier code").nullish(), shortName: z.string().describe("Short name for the business partner").nullish(), address: CreateBusinessPartnerAddressDtoSchema.describe("Address information").nullish() }).readonly(); -export type CreateBusinessPartnerRequestDTO = z.infer; - -/** - * BusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { string } rootFolderId Root folder identifier associated with this business partner - */ -export const BusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), name: z.string().describe("Name of the business partner"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), rootFolderId: z.string().describe("Root folder identifier associated with this business partner").nullish() }).readonly(); -export type BusinessPartnerResponseDTO = z.infer; - -/** - * BusinessPartnerLabelResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - */ -export const BusinessPartnerLabelResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), name: z.string().describe("Name of the business partner") }).readonly(); -export type BusinessPartnerLabelResponseDto = z.infer; - -/** - * ContactResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the contact - * @property { string } name Name of the contact - */ -export const ContactResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the contact"), name: z.string().describe("Name of the contact") }).readonly(); -export type ContactResponseDTO = z.infer; - -/** - * BusinessPartnerDetailResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } createdById ID of the employee who created this record - * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this record - * @property { string } createdAt Creation timestamp - * @property { string } updatedById ID of the employee who last updated this record - * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this record - * @property { string } updatedAt Last update timestamp - * @property { string } matchCode Match code of the business partner - * @property { string } shortName Short name - * @property { string } name Full name - * @property { string } secondaryName Secondary name - * @property { CommonModels.BusinessPartnerType[] } types List of business partner types - * @property { boolean } archived Archived status - * @property { CommonModels.BusinessPartnerAddressResponseDTO } address Main address information - * @property { CommonModels.BusinessPartnerAddressResponseDTO } blAddress BL address information - * @property { BusinessPartnerLabelResponseDto[] } similar Similar named business partners - * @property { boolean } locked - * @property { boolean } addressIsDifferentForBl - * @property { string } lockedById Unique identifier of the employee who locked the business partner - * @property { string } lockedByName - * @property { string } lockedAt Unique identifier of the employee who locked the business partner - * @property { ContactResponseDTO } belongsTo Parent business partner - * @property { ContactResponseDTO } salesRep Sales representative - * @property { ContactResponseDTO } operations Operations contact - */ -export const BusinessPartnerDetailResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the business partner"), createdById: z.string().describe("ID of the employee who created this record").nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who created this record").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Creation timestamp"), updatedById: z.string().describe("ID of the employee who last updated this record").nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.describe("Employee who last updated this record").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Last update timestamp"), matchCode: z.string().describe("Match code of the business partner"), shortName: z.string().describe("Short name"), name: z.string().describe("Full name"), secondaryName: z.string().describe("Secondary name"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("List of business partner types"), archived: z.boolean().describe("Archived status"), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information"), blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("BL address information"), similar: z.array(BusinessPartnerLabelResponseDtoSchema).readonly().describe("Similar named business partners").nullish(), locked: z.boolean(), addressIsDifferentForBl: z.boolean(), lockedById: z.string().describe("Unique identifier of the employee who locked the business partner").nullish(), lockedByName: z.string().nullish(), lockedAt: z.iso.datetime({ offset: true }).describe("Unique identifier of the employee who locked the business partner").nullish(), belongsTo: ContactResponseDTOSchema.describe("Parent business partner"), salesRep: ContactResponseDTOSchema.describe("Sales representative"), operations: ContactResponseDTOSchema.describe("Operations contact") }).readonly(); -export type BusinessPartnerDetailResponseDTO = z.infer; - -/** - * UpdateBusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } district - * @property { string } countryId - */ -export const UpdateBusinessPartnerAddressDtoSchema = z.object({ street: z.string(), secondaryStreet: z.string(), zip: z.string(), cityId: z.string().nullable(), district: z.string(), countryId: z.string() }).readonly(); -export type UpdateBusinessPartnerAddressDto = z.infer; - -/** - * UpdateBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code - * @property { string } shortName Updated short name - * @property { string } name Updated full name - * @property { string } secondaryName Updated secondary name - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { UpdateBusinessPartnerAddressDto } address Address information - * @property { UpdateBusinessPartnerAddressDto } blAddress Bl address information - * @property { string } belongsToId Parent business partner - * @property { string } salesRepId Sales representative - * @property { string } operationsId Operations contact - * @property { boolean } addressIsDifferentForBl Different address for BL - */ -export const UpdateBusinessPartnerRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code"), shortName: z.string().describe("Updated short name"), name: z.string().describe("Updated full name"), secondaryName: z.string().describe("Updated secondary name"), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Types/roles of the business partner"), address: UpdateBusinessPartnerAddressDtoSchema.describe("Address information"), blAddress: UpdateBusinessPartnerAddressDtoSchema.describe("Bl address information"), belongsToId: z.string().describe("Parent business partner"), salesRepId: z.string().describe("Sales representative"), operationsId: z.string().describe("Operations contact"), addressIsDifferentForBl: z.boolean().describe("Different address for BL") }).readonly(); -export type UpdateBusinessPartnerRequestDTO = z.infer; - -/** - * CreateBusinessPartnerRemarkRequestDTOSchema - * @type { object } - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of remark - */ -export const CreateBusinessPartnerRemarkRequestDTOSchema = z.object({ visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), content: z.string().describe("Content of the remark"), type: RemarkTypeSchema.describe("Type of remark") }).readonly(); -export type CreateBusinessPartnerRemarkRequestDTO = z.infer; - -/** - * UpdateBusinessPartnerRemarkRequestDtoSchema - * @type { object } - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of remark - */ -export const UpdateBusinessPartnerRemarkRequestDtoSchema = z.object({ visibility: RemarkVisibilitySchema.describe("Visibility level of the remark"), content: z.string().describe("Content of the remark"), type: RemarkTypeSchema.describe("Type of remark") }).readonly(); -export type UpdateBusinessPartnerRemarkRequestDto = z.infer; - -/** - * AccountTypeEnumSchema - * @type { enum } - */ -export const AccountTypeEnumSchema = z.enum(["Direct Account", "Logistic Provider / Forwarder", "4PL/NVOCC", "LLP", "Carrier", "Service Provider (other)", "Strategic", "Key Account", "Transactional", "Agent", "Other"]); -export type AccountTypeEnum = z.infer; -export const AccountTypeEnum = AccountTypeEnumSchema.enum; - -/** - * BusinessPartnerAuthorizationSchema - * @type { enum } - */ -export const BusinessPartnerAuthorizationSchema = z.enum(["requiresApproval", "blocked", "regularBusinessPartner"]); -export type BusinessPartnerAuthorization = z.infer; -export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.enum; - -/** - * BusinessPartnerPaymentTermsResponseDtoSchema - * @type { object } - * @property { string } relativeTo - * @property { number } days Minimum: `0` - */ -export const BusinessPartnerPaymentTermsResponseDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }).readonly(); -export type BusinessPartnerPaymentTermsResponseDto = z.infer; - -/** - * BusinessPartnerBankAccountResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BusinessPartnerBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type BusinessPartnerBankAccountResponseDto = z.infer; - -/** - * PartnerNetworkInfoDtoSchema - * @type { object } - * @property { string } id Partner network ID - * @property { string } name Partner network name - */ -export const PartnerNetworkInfoDtoSchema = z.object({ id: z.string().describe("Partner network ID"), name: z.string().describe("Partner network name") }).readonly(); -export type PartnerNetworkInfoDto = z.infer; - -/** - * BusinessPartnerBasicResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Reference to the business partner - * @property { string[] } relationship List of relationships - * @property { AccountTypeEnum } accountType - * @property { string } vat VAT number - * @property { string } legacySystemId Legacy system (move) id - * @property { string } registrationNumber - * @property { string } eori EORI number - * @property { BusinessPartnerAuthorization } authorization Authorization status - * @property { number } creditLimit Credit limit - * @property { string } invoiceLanguage Invoice language - * @property { string } invoiceCurrency Invoice currency - * @property { string } iban IBAN - * @property { string } bankNumber Bank number - * @property { string } bankAccountNumber Bank account number - * @property { BusinessPartnerPaymentTermsResponseDto } termsExport - * @property { BusinessPartnerPaymentTermsResponseDto } termsImport - * @property { CommonModels.EditorContentResponseDto } notes Notes - * @property { string } bankAccountId - * @property { BusinessPartnerBankAccountResponseDto } bankAccount - * @property { PartnerNetworkInfoDto[] } partnerNetworks Partner networks - * @property { string } dunningSystemId - * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem - * @property { string } hblIssuerSigner HBL issuer/signer prefill - * @property { string } signatureFileAttachmentId Signature file attachment ID - * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment - */ -export const BusinessPartnerBasicResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Reference to the business partner"), relationship: z.array(z.string()).readonly().describe("List of relationships"), accountType: AccountTypeEnumSchema.nullish(), vat: z.string().describe("VAT number"), legacySystemId: z.string().describe("Legacy system (move) id").nullish(), registrationNumber: z.string().nullish(), eori: z.string().describe("EORI number"), authorization: BusinessPartnerAuthorizationSchema.describe("Authorization status").nullable(), creditLimit: z.number().describe("Credit limit"), invoiceLanguage: z.string().describe("Invoice language"), invoiceCurrency: z.string().describe("Invoice currency"), iban: z.string().describe("IBAN"), bankNumber: z.string().describe("Bank number"), bankAccountNumber: z.string().describe("Bank account number"), termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), bankAccountId: z.string().nullish(), bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), partnerNetworks: z.array(PartnerNetworkInfoDtoSchema).readonly().describe("Partner networks"), dunningSystemId: z.string().nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), hblIssuerSigner: z.string().describe("HBL issuer/signer prefill"), signatureFileAttachmentId: z.string().describe("Signature file attachment ID"), signatureFileAttachmentUrl: z.string().describe("Signed URL for signature file attachment").nullish() }).readonly(); -export type BusinessPartnerBasicResponseDTO = z.infer; - -/** - * UpdateBusinessPartnerPaymentTermsDtoSchema - * @type { object } - * @property { string } relativeTo - * @property { number } days Minimum: `0` - */ -export const UpdateBusinessPartnerPaymentTermsDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }).readonly(); -export type UpdateBusinessPartnerPaymentTermsDto = z.infer; - -/** - * UpdateBusinessPartnerBasicRequestDTOSchema - * @type { object } - * @property { string[] } relationship Updated relationships - * @property { string } vat Updated VAT number - * @property { string } eori Updated EORI number - * @property { AccountTypeEnum } accountType - * @property { BusinessPartnerAuthorization } authorization Updated authorization status - * @property { number } creditLimit Updated credit limit - * @property { string } invoiceLanguage Invoice language - * @property { string } invoiceCurrency Invoice currency - * @property { string } iban IBAN - * @property { string } bankNumber Bank number - * @property { string } bankAccountNumber Bank account number - * @property { string } legacySystemId Legacy system (move) id - * @property { string } registrationNumber - * @property { UpdateBusinessPartnerPaymentTermsDto } termsExport - * @property { UpdateBusinessPartnerPaymentTermsDto } termsImport - * @property { CommonModels.EditorContentUpdateDto } notes Notes - * @property { string } bankAccountId - * @property { string[] } partnerNetworkIds Partner network IDs - * @property { string } dunningSystemId Dunning system ID - * @property { string } hblIssuerSigner HBL issuer/signer prefill - * @property { string } signatureFileAttachmentId Signature file attachment ID - */ -export const UpdateBusinessPartnerBasicRequestDTOSchema = z.object({ relationship: z.array(z.string()).readonly().describe("Updated relationships"), vat: z.string().describe("Updated VAT number"), eori: z.string().describe("Updated EORI number"), accountType: AccountTypeEnumSchema, authorization: BusinessPartnerAuthorizationSchema.describe("Updated authorization status"), creditLimit: z.number().describe("Updated credit limit"), invoiceLanguage: z.string().describe("Invoice language"), invoiceCurrency: z.string().describe("Invoice currency"), iban: z.string().describe("IBAN"), bankNumber: z.string().describe("Bank number"), bankAccountNumber: z.string().describe("Bank account number"), legacySystemId: z.string().describe("Legacy system (move) id"), registrationNumber: z.string(), termsExport: UpdateBusinessPartnerPaymentTermsDtoSchema, termsImport: UpdateBusinessPartnerPaymentTermsDtoSchema, notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), bankAccountId: z.string().nullable(), partnerNetworkIds: z.array(z.string()).readonly().describe("Partner network IDs"), dunningSystemId: z.string().describe("Dunning system ID").nullable(), hblIssuerSigner: z.string().describe("HBL issuer/signer prefill").nullable(), signatureFileAttachmentId: z.string().describe("Signature file attachment ID").nullable() }).readonly(); -export type UpdateBusinessPartnerBasicRequestDTO = z.infer; - -/** - * BusinessPartnerSignatureUploadRequestDTOSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType Mime type - * @property { number } fileSize File size in bytes. Minimum: `1` - */ -export const BusinessPartnerSignatureUploadRequestDTOSchema = z.object({ fileName: z.string().describe("File name"), mimeType: z.string().describe("Mime type"), fileSize: z.number().gte(1).describe("File size in bytes") }).readonly(); -export type BusinessPartnerSignatureUploadRequestDTO = z.infer; - -/** - * BusinessPartnerSignatureUploadResponseDTOSchema - * @type { object } - * @property { string } mediaId Media ID for the uploaded signature - * @property { string } method HTTP method to use for upload - * @property { string } url URL to upload the file to - */ -export const BusinessPartnerSignatureUploadResponseDTOSchema = z.object({ mediaId: z.string().describe("Media ID for the uploaded signature"), method: z.string().describe("HTTP method to use for upload"), url: z.string().describe("URL to upload the file to") }).readonly(); -export type BusinessPartnerSignatureUploadResponseDTO = z.infer; - -/** - * CargoAgentResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Business partner identifier - * @property { string } portOfHamburgAccountNumber Port of Hamburg account number - * @property { string } iataAccountNumber IATA account number - * @property { string } regulatedAgentCode Regulated agent code - */ -export const CargoAgentResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Business partner identifier"), portOfHamburgAccountNumber: z.string().describe("Port of Hamburg account number"), iataAccountNumber: z.string().describe("IATA account number"), regulatedAgentCode: z.string().describe("Regulated agent code") }).readonly(); -export type CargoAgentResponseDTO = z.infer; - -/** - * UpdateCargoAgentDTOSchema - * @type { object } - * @property { string } portOfHamburgAccountNumber Hamburg port account number - * @property { string } iataAccountNumber IATA account number - * @property { string } regulatedAgentCode Regulated agent code - */ -export const UpdateCargoAgentDTOSchema = z.object({ portOfHamburgAccountNumber: z.string().describe("Hamburg port account number"), iataAccountNumber: z.string().describe("IATA account number"), regulatedAgentCode: z.string().describe("Regulated agent code") }).readonly(); -export type UpdateCargoAgentDTO = z.infer; - -/** - * CarrierResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Business partner identifier - * @property { string } scac SCAC code - * @property { string } iataAirlinePrefix IATA airline prefix - * @property { string } iataCode IATA code - * @property { string } registrationAddress Registration address - * @property { string } masterBlSuffix Master BL suffix - * @property { string } houseBlSuffix House BL suffix - * @property { string } airWaybillSuffix Air waybill suffix - * @property { string } cargoManifestSuffix Cargo manifest suffix - * @property { string } fundReportSuffix Fund report suffix - * @property { string } invoiceSuffix Invoice suffix - */ -export const CarrierResponseDTOSchema = z.object({ businessPartnerId: z.string().describe("Business partner identifier"), scac: z.string().describe("SCAC code"), iataAirlinePrefix: z.string().describe("IATA airline prefix"), iataCode: z.string().describe("IATA code"), registrationAddress: z.string().describe("Registration address"), masterBlSuffix: z.string().describe("Master BL suffix"), houseBlSuffix: z.string().describe("House BL suffix"), airWaybillSuffix: z.string().describe("Air waybill suffix"), cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), fundReportSuffix: z.string().describe("Fund report suffix"), invoiceSuffix: z.string().describe("Invoice suffix") }).readonly(); -export type CarrierResponseDTO = z.infer; - -/** - * UpdateCarrierDTOSchema - * @type { object } - * @property { string } scac SCAC code - * @property { string } iataAirlinePrefix IATA airline prefix - * @property { string } iataCode IATA code - * @property { string } registrationAddress Registration address - * @property { string } masterBlSuffix Master BL suffix - * @property { string } houseBlSuffix House BL suffix - * @property { string } airWaybillSuffix Air waybill suffix - * @property { string } cargoManifestSuffix Cargo manifest suffix - * @property { string } fundReportSuffix Fund report suffix - * @property { string } invoiceSuffix Invoice suffix - */ -export const UpdateCarrierDTOSchema = z.object({ scac: z.string().describe("SCAC code"), iataAirlinePrefix: z.string().describe("IATA airline prefix"), iataCode: z.string().describe("IATA code"), registrationAddress: z.string().describe("Registration address"), masterBlSuffix: z.string().describe("Master BL suffix"), houseBlSuffix: z.string().describe("House BL suffix"), airWaybillSuffix: z.string().describe("Air waybill suffix"), cargoManifestSuffix: z.string().describe("Cargo manifest suffix"), fundReportSuffix: z.string().describe("Fund report suffix"), invoiceSuffix: z.string().describe("Invoice suffix") }).readonly(); -export type UpdateCarrierDTO = z.infer; - -/** - * BusinessPartnersPaginateOrderParamEnumSchema - * @type { enum } - */ -export const BusinessPartnersPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); -export type BusinessPartnersPaginateOrderParamEnum = z.infer; -export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOrderParamEnumSchema.enum; - -/** - * BusinessPartnersPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BusinessPartnerListResponseDTO[] } items - */ -export const BusinessPartnersPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).readonly() }).readonly().shape }); -export type BusinessPartnersPaginateResponse = z.infer; - -/** - * BusinessPartnersPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const BusinessPartnersPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); -export type BusinessPartnersPaginateLabelsOrderParamEnum = z.infer; -export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPaginateLabelsOrderParamEnumSchema.enum; - -/** - * BusinessPartnersPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items - */ -export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).readonly() }).readonly().shape }); -export type BusinessPartnersPaginateLabelsResponse = z.infer; - -/** - * GetRemarksResponseSchema - * @type { array } - */ -export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema).readonly(); -export type GetRemarksResponse = z.infer; - -} diff --git a/test/generated/full/businessPartners/businessPartners.queries.ts b/test/generated/full/businessPartners/businessPartners.queries.ts deleted file mode 100644 index 5c7e107..0000000 --- a/test/generated/full/businessPartners/businessPartners.queries.ts +++ /dev/null @@ -1,642 +0,0 @@ -import axios, { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnersAcl } from "./businessPartners.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnersModels } from "./businessPartners.models"; -import { BusinessPartnersApi } from "./businessPartners.api"; - -export namespace BusinessPartnersQueries { -export const moduleName = QueryModule.BusinessPartners; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - getById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id", officeId, id] as const, - getRemarks: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/remarks", officeId, id] as const, - getBasicInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/basic", officeId, id] as const, - getCargoAgentInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/cargo-agent", officeId, id] as const, - getCarrierInformation: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/carrier", officeId, id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate business partners - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate business partners - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create business partner - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { BusinessPartnersModels.CreateBusinessPartnerRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(BusinessPartnersAcl.canUseCreate({ officeId } )); - return BusinessPartnersApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetById` - * @summary Get business partner by ID - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetById({ officeId } )); - return BusinessPartnersApi.getById(officeId, id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update business partner - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId } )); - return BusinessPartnersApi.update(officeId, id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive business partner - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseArchive({ officeId } )); - return BusinessPartnersApi.archive(officeId, id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive business partner - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId } )); - return BusinessPartnersApi.unarchive(officeId, id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useLock` - * @summary Lock business partner - * @permission Requires `canUseLock` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useLock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseLock({ officeId } )); - return BusinessPartnersApi.lock(officeId, id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnlock` - * @summary Unlock business partner - * @permission Requires `canUseUnlock` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId } )); - return BusinessPartnersApi.unlock(officeId, id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetRemarks` - * @summary Get business partner remarks - * @permission Requires `canUseGetRemarks` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetRemarks = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getRemarks(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId } )); - return BusinessPartnersApi.getRemarks(officeId, id, config) }, - ...options, - }); -}; - -/** - * Mutation `useCreateRemark` - * @summary Create business partner remark - * @permission Requires `canUseCreateRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId } )); - return BusinessPartnersApi.createRemark(officeId, id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateRemark` - * @permission Requires `canUseUpdateRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { string } mutation.remarkId Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, remarkId, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId } )); - return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRemark` - * @summary Delete business partner remark - * @permission Requires `canUseDeleteRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { string } mutation.remarkId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteRemark = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, remarkId }) => { - checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId } )); - return BusinessPartnersApi.deleteRemark(officeId, id, remarkId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetBasicInfo` - * @summary Get business partner basic info - * @permission Requires `canUseGetBasicInfo` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBasicInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBasicInfo(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId } )); - return BusinessPartnersApi.getBasicInfo(officeId, id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateBasicInfo` - * @summary Update business partner basic info - * @permission Requires `canUseUpdateBasicInfo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBasicInfo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId } )); - return BusinessPartnersApi.updateBasicInfo(officeId, id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getBasicInfo(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateSignatureUploadInstructions` - * @summary Create upload instructions for business partner signature - * @permission Requires `canUseCreateSignatureUploadInstructions` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateSignatureUploadInstructions = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { - checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId } )); - const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions(officeId, id, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetCargoAgentInfo` - * @summary Get cargo agent information for business partner - * @permission Requires `canUseGetCargoAgentInfo` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoAgentInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoAgentInfo(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId } )); - return BusinessPartnersApi.getCargoAgentInfo(officeId, id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCargoAgent` - * @summary Update cargo agent information for business partner - * @permission Requires `canUseUpdateCargoAgent` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateCargoAgentDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCargoAgent = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId } )); - return BusinessPartnersApi.updateCargoAgent(officeId, id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getCargoAgentInfo(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetCarrierInformation` - * @summary Get carrier information for business partner - * @permission Requires `canUseGetCarrierInformation` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCarrierInformation = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCarrierInformation(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId } )); - return BusinessPartnersApi.getCarrierInformation(officeId, id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCarrier` - * @summary Update carrier information for business partner - * @permission Requires `canUseUpdateCarrier` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateCarrierDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCarrier = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId } )); - return BusinessPartnersApi.updateCarrier(officeId, id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getCarrierInformation(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/cargoTypes/cargoTypes.acl.ts b/test/generated/full/cargoTypes/cargoTypes.acl.ts deleted file mode 100644 index 404b05b..0000000 --- a/test/generated/full/cargoTypes/cargoTypes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CargoTypesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "CargoType" -] as AbilityTuple<"Read", "CargoType">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "CargoType" -] as AbilityTuple<"Create", "CargoType">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "CargoType" -] as AbilityTuple<"Read", "CargoType">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "CargoType" -] as AbilityTuple<"Read", "CargoType">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "CargoType" -] as AbilityTuple<"Update", "CargoType">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "CargoType" -] as AbilityTuple<"Archive", "CargoType">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "CargoType" -] as AbilityTuple<"Archive", "CargoType">; - -} diff --git a/test/generated/full/cargoTypes/cargoTypes.api.ts b/test/generated/full/cargoTypes/cargoTypes.api.ts deleted file mode 100644 index 5f6ca5c..0000000 --- a/test/generated/full/cargoTypes/cargoTypes.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CargoTypesModels } from "./cargoTypes.models"; - -export namespace CargoTypesApi { -export const paginate = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, - `/cargo-types`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types`, - ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), - config - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, - `/cargo-types/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}`, - config - ) -}; -export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}`, - ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/cargoTypes/cargoTypes.configs.ts b/test/generated/full/cargoTypes/cargoTypes.configs.ts deleted file mode 100644 index 5d2769f..0000000 --- a/test/generated/full/cargoTypes/cargoTypes.configs.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CargoTypesModels } from "./cargoTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CargoTypesQueries } from "./cargoTypes.queries"; -import { CargoTypesAcl } from "./cargoTypes.acl"; - -export namespace CargoTypesConfigs { -export const cargoTypesConfig = { - meta: { - title: "Cargo Types", - }, - readAll: { - acl: CargoTypesAcl.canUsePaginate, - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - paginated: CargoTypesQueries.usePaginate, - infinite: CargoTypesQueries.usePaginateInfinite, - filters: { - schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, - options: { - inputs: { - module: true, - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - shortName: true, - length: true, - width: true, - height: true, - unit: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - modules: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CargoTypesAcl.canUseFindById, - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - query: CargoTypesQueries.useFindById, - }, - create: { - acl: CargoTypesAcl.canUseCreate, - schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, - mutation: CargoTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - length: true, - width: true, - height: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - unit: true, - modules: true, - }, - }, -}) - }, - update: { - acl: CargoTypesAcl.canUseUpdate, - schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, - mutation: CargoTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - length: true, - width: true, - height: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - unit: true, - modules: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CargoTypesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CargoTypesQueries.usePaginateLabels, - infinite: CargoTypesQueries.usePaginateLabelsInfinite, - filters: { - schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/cargoTypes/cargoTypes.models.ts b/test/generated/full/cargoTypes/cargoTypes.models.ts deleted file mode 100644 index 93eed88..0000000 --- a/test/generated/full/cargoTypes/cargoTypes.models.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CargoTypesModels { -/** - * CargoTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type CargoTypeEmployeeDTO = z.infer; - -/** - * CargoTypeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the cargo type - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { string } unit Measurement unit for dimensions - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type - * @property { boolean } archived Indicates if the cargo type is archived - * @property { string } createdById - * @property { CargoTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CargoTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const CargoTypeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the cargo type"), name: z.string().describe("Name of the cargo type"), shortName: z.string().describe("Short name of the cargo type").nullish(), length: z.number().describe("Length of the cargo type").nullish(), width: z.number().describe("Width of the cargo type").nullish(), height: z.number().describe("Height of the cargo type").nullish(), unit: z.string().describe("Measurement unit for dimensions"), emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), containerIsoCode: z.string().describe("Container ISO code").nullish(), isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly().describe("Transport modules applicable to the cargo type"), archived: z.boolean().describe("Indicates if the cargo type is archived"), createdById: z.string().nullish(), createdBy: CargoTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CargoTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type CargoTypeResponseDTO = z.infer; - -/** - * TransportModuleEnumSchema - * @type { enum } - */ -export const TransportModuleEnumSchema = z.enum(["Air", "Sea", "Road"]); -export type TransportModuleEnum = z.infer; -export const TransportModuleEnum = TransportModuleEnumSchema.enum; - -/** - * CargoTypePaginationFilterDtoSchema - * @type { object } - * @property { TransportModuleEnum } module - * @property { boolean } archived Archived status filter - * @property { string } search - */ -export const CargoTypePaginationFilterDtoSchema = z.object({ module: TransportModuleEnumSchema, archived: z.boolean().describe("Archived status filter"), search: z.string() }).readonly(); -export type CargoTypePaginationFilterDto = z.infer; - -/** - * CreateCargoTypeRequestDTOSchema - * @type { object } - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { string } unit Measurement unit for dimensions - * @property { CommonModels.TransportModeEnum[] } modules Transport modes applicable to the cargo type - */ -export const CreateCargoTypeRequestDTOSchema = z.object({ name: z.string().describe("Name of the cargo type"), shortName: z.string().describe("Short name of the cargo type").nullish(), length: z.number().describe("Length of the cargo type").nullish(), width: z.number().describe("Width of the cargo type").nullish(), height: z.number().describe("Height of the cargo type").nullish(), emptyWeight: z.number().describe("Empty weight of the cargo container").nullish(), containerIsoCode: z.string().describe("Container ISO code").nullish(), isContainer: z.boolean().describe("Whether this cargo type is a container").nullish(), unit: z.string().describe("Measurement unit for dimensions"), modules: z.array(CommonModels.TransportModeEnumSchema).readonly().describe("Transport modes applicable to the cargo type") }).readonly(); -export type CreateCargoTypeRequestDTO = z.infer; - -/** - * UpdateCargoTypeRequestDTOSchema - * @type { object } - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { string } unit Measurement unit for dimensions - * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type - */ -export const UpdateCargoTypeRequestDTOSchema = z.object({ name: z.string().describe("Name of the cargo type"), shortName: z.string().describe("Short name of the cargo type"), length: z.number().describe("Length of the cargo type").nullable(), width: z.number().describe("Width of the cargo type").nullable(), height: z.number().describe("Height of the cargo type").nullable(), emptyWeight: z.number().describe("Empty weight of the cargo container").nullable(), containerIsoCode: z.string().describe("Container ISO code").nullable(), isContainer: z.boolean().describe("Whether this cargo type is a container").nullable(), unit: z.string().describe("Measurement unit for dimensions"), modules: z.array(CommonModels.TransportModeEnumSchema).readonly().describe("Transport modules applicable to the cargo type") }).readonly(); -export type UpdateCargoTypeRequestDTO = z.infer; - -/** - * CargoTypeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const CargoTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type CargoTypeLabelFilterDto = z.infer; - -/** - * CargoTypesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const CargoTypesPaginateOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type CargoTypesPaginateOrderParamEnum = z.infer; -export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnumSchema.enum; - -/** - * CargoTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CargoTypeResponseDTO[] } items - */ -export const CargoTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CargoTypeResponseDTOSchema).readonly() }).readonly().shape }); -export type CargoTypesPaginateResponse = z.infer; - -/** - * CargoTypesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const CargoTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type CargoTypesPaginateLabelsOrderParamEnum = z.infer; -export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * CargoTypesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const CargoTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type CargoTypesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/cargoTypes/cargoTypes.queries.ts b/test/generated/full/cargoTypes/cargoTypes.queries.ts deleted file mode 100644 index 71cd268..0000000 --- a/test/generated/full/cargoTypes/cargoTypes.queries.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CargoTypesAcl } from "./cargoTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CargoTypesModels } from "./cargoTypes.models"; -import { CargoTypesApi } from "./cargoTypes.api"; - -export namespace CargoTypesQueries { -export const moduleName = QueryModule.CargoTypes; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string) => [...keys.all, "/cargo-types", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/cargo-types/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Cargo Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Cargo Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Cargo Type - * @permission Requires `canUseCreate` ability - * @param { CargoTypesModels.CreateCargoTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CargoTypesAcl.canUseCreate()); - return CargoTypesApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate cargo types with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate cargo types with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get Cargo Type by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(CargoTypesAcl.canUseFindById()); - return CargoTypesApi.findById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Cargo Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { CargoTypesModels.UpdateCargoTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(CargoTypesAcl.canUseUpdate()); - return CargoTypesApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Cargo Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CargoTypesAcl.canUseArchive()); - return CargoTypesApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive Cargo Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CargoTypesAcl.canUseUnarchive()); - return CargoTypesApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/chargeTypes/chargeTypes.acl.ts b/test/generated/full/chargeTypes/chargeTypes.acl.ts deleted file mode 100644 index 469c483..0000000 --- a/test/generated/full/chargeTypes/chargeTypes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace ChargeTypesAcl { -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "ChargeType" -] as AbilityTuple<"Read", "ChargeType">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "ChargeType" -] as AbilityTuple<"Read", "ChargeType">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "ChargeType" -] as AbilityTuple<"Create", "ChargeType">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "ChargeType" -] as AbilityTuple<"Read", "ChargeType">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "ChargeType" -] as AbilityTuple<"Update", "ChargeType">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "ChargeType" -] as AbilityTuple<"Archive", "ChargeType">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "ChargeType" -] as AbilityTuple<"Archive", "ChargeType">; - -} diff --git a/test/generated/full/chargeTypes/chargeTypes.api.ts b/test/generated/full/chargeTypes/chargeTypes.api.ts deleted file mode 100644 index b2876a9..0000000 --- a/test/generated/full/chargeTypes/chargeTypes.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChargeTypesModels } from "./chargeTypes.models"; - -export namespace ChargeTypesApi { -export const findAll = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, - `/charge-types/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, - `/charge-types`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types`, - ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), - config - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}`, - config - ) -}; -export const update = (id: string, data: ChargeTypesModels.UpdateChargeTypeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}`, - ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/chargeTypes/chargeTypes.configs.ts b/test/generated/full/chargeTypes/chargeTypes.configs.ts deleted file mode 100644 index 30d69aa..0000000 --- a/test/generated/full/chargeTypes/chargeTypes.configs.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChargeTypesModels } from "./chargeTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChargeTypesQueries } from "./chargeTypes.queries"; -import { ChargeTypesAcl } from "./chargeTypes.acl"; - -export namespace ChargeTypesConfigs { -export const chargeTypesConfig = { - meta: { - title: "Charge Types", - }, - readAll: { - acl: ChargeTypesAcl.canUsePaginate, - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - paginated: ChargeTypesQueries.usePaginate, - infinite: ChargeTypesQueries.usePaginateInfinite, - filters: { - schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, - options: { - inputs: { - name: true, - search: true, - archived: true, - direction: true, - transportModes: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ChargeTypesAcl.canUseFindById, - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - query: ChargeTypesQueries.useFindById, - }, - create: { - acl: ChargeTypesAcl.canUseCreate, - schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, - mutation: ChargeTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, - options: { - inputs: { - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - }, - }, -}) - }, - update: { - acl: ChargeTypesAcl.canUseUpdate, - schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, - mutation: ChargeTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, - options: { - inputs: { - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ChargeTypesAcl.canUseFindAll, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChargeTypesQueries.useFindAll, - infinite: ChargeTypesQueries.useFindAllInfinite, - filters: { - schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, - options: { - inputs: { - direction: true, - transportModes: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/chargeTypes/chargeTypes.models.ts b/test/generated/full/chargeTypes/chargeTypes.models.ts deleted file mode 100644 index 53f5489..0000000 --- a/test/generated/full/chargeTypes/chargeTypes.models.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChargeTypesModels { -/** - * ChargeTypeLabelFilterDtoSchema - * @type { object } - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum[] } transportModes - * @property { string } search - */ -export const ChargeTypeLabelFilterDtoSchema = z.object({ direction: CommonModels.DirectionEnumSchema, transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly(), search: z.string() }).readonly(); -export type ChargeTypeLabelFilterDto = z.infer; - -/** - * ChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ -export const ChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }).readonly(); -export type ChargeTypeTranslationDto = z.infer; - -/** - * ChargeTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChargeTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type ChargeTypeEmployeeDTO = z.infer; - -/** - * ChargeTypeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { ChargeTypeTranslationDto[] } translations - * @property { string } createdById - * @property { ChargeTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { ChargeTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const ChargeTypeResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), directions: z.array(CommonModels.DirectionEnumSchema).readonly(), translations: z.array(ChargeTypeTranslationDtoSchema).readonly(), createdById: z.string().nullish(), createdBy: ChargeTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type ChargeTypeResponseDTO = z.infer; - -/** - * ChargeTypePaginationFilterDtoSchema - * @type { object } - * @property { string } name - * @property { string } search - * @property { boolean } archived - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum[] } transportModes - */ -export const ChargeTypePaginationFilterDtoSchema = z.object({ name: z.string(), search: z.string(), archived: z.boolean(), direction: CommonModels.DirectionEnumSchema, transportModes: z.array(CommonModels.TransportModeEnumSchema).readonly() }).readonly(); -export type ChargeTypePaginationFilterDto = z.infer; - -/** - * CreateChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ -export const CreateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }).readonly(); -export type CreateChargeTypeTranslationDto = z.infer; - -/** - * CreateChargeTypeRequestDTOSchema - * @type { object } - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { CreateChargeTypeTranslationDto[] } translations - */ -export const CreateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string(), englishName: z.string().nullish(), archived: z.boolean().nullish(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), directions: z.array(CommonModels.DirectionEnumSchema).readonly(), translations: z.array(CreateChargeTypeTranslationDtoSchema).readonly().nullish() }).readonly(); -export type CreateChargeTypeRequestDTO = z.infer; - -/** - * UpdateChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ -export const UpdateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }).readonly(); -export type UpdateChargeTypeTranslationDto = z.infer; - -/** - * UpdateChargeTypeRequestDTOSchema - * @type { object } - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { UpdateChargeTypeTranslationDto[] } translations - */ -export const UpdateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string(), modules: z.array(CommonModels.TransportModeEnumSchema).readonly(), directions: z.array(CommonModels.DirectionEnumSchema).readonly(), translations: z.array(UpdateChargeTypeTranslationDtoSchema).readonly() }).readonly(); -export type UpdateChargeTypeRequestDTO = z.infer; - -/** - * ChargeTypesFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ChargeTypesFindAllOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); -export type ChargeTypesFindAllOrderParamEnum = z.infer; -export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnumSchema.enum; - -/** - * ChargeTypesFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ChargeTypesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type ChargeTypesFindAllResponse = z.infer; - -/** - * ChargeTypesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ChargeTypesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); -export type ChargeTypesPaginateOrderParamEnum = z.infer; -export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEnumSchema.enum; - -/** - * ChargeTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChargeTypeResponseDTO[] } items - */ -export const ChargeTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).readonly() }).readonly().shape }); -export type ChargeTypesPaginateResponse = z.infer; - -} diff --git a/test/generated/full/chargeTypes/chargeTypes.queries.ts b/test/generated/full/chargeTypes/chargeTypes.queries.ts deleted file mode 100644 index a91c683..0000000 --- a/test/generated/full/chargeTypes/chargeTypes.queries.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChargeTypesAcl } from "./chargeTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChargeTypesModels } from "./chargeTypes.models"; -import { ChargeTypesApi } from "./chargeTypes.api"; - -export namespace ChargeTypesQueries { -export const moduleName = QueryModule.ChargeTypes; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, - paginate: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string) => [...keys.all, "/charge-types", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/charge-types/:id", id] as const, -}; - -/** - * Query `useFindAll` - * @summary Paginate charge types with only their labels - * @permission Requires `canUseFindAll` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @summary Paginate charge types with only their labels - * @permission Requires `canUseFindAll` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Charge Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Charge Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new Charge Type - * @permission Requires `canUseCreate` ability - * @param { ChargeTypesModels.CreateChargeTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(ChargeTypesAcl.canUseCreate()); - return ChargeTypesApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get Charge Type Details by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUseFindById()); - return ChargeTypesApi.findById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update an existing Charge Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { ChargeTypesModels.UpdateChargeTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(ChargeTypesAcl.canUseUpdate()); - return ChargeTypesApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a Charge Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ChargeTypesAcl.canUseArchive()); - return ChargeTypesApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a Charge Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ChargeTypesAcl.canUseUnarchive()); - return ChargeTypesApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/checklistItems/checklistItems.acl.ts b/test/generated/full/checklistItems/checklistItems.acl.ts deleted file mode 100644 index a58bf1f..0000000 --- a/test/generated/full/checklistItems/checklistItems.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ChecklistItemsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create checklist item in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Create", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List checklist items for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Paginate checklist item labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get checklist item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Update", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -} diff --git a/test/generated/full/checklistItems/checklistItems.api.ts b/test/generated/full/checklistItems/checklistItems.api.ts deleted file mode 100644 index 36508b8..0000000 --- a/test/generated/full/checklistItems/checklistItems.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChecklistItemsModels } from "./checklistItems.models"; - -export namespace ChecklistItemsApi { -export const create = (officeId: string, data: ChecklistItemsModels.CreateChecklistItemRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items`, - ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), - config - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, - `/offices/${officeId}/checklist-items`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, - `/offices/${officeId}/checklist-items/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items/${id}`, - config - ) -}; -export const update = (id: string, officeId: string, data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items/${id}`, - ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-items/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-items/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/checklistItems/checklistItems.configs.ts b/test/generated/full/checklistItems/checklistItems.configs.ts deleted file mode 100644 index f67024d..0000000 --- a/test/generated/full/checklistItems/checklistItems.configs.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChecklistItemsModels } from "./checklistItems.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChecklistItemsQueries } from "./checklistItems.queries"; -import { ChecklistItemsAcl } from "./checklistItems.acl"; - -export namespace ChecklistItemsConfigs { -export const checklistItemsConfig = { - meta: { - title: "Checklist Items", - }, - readAll: { - acl: ChecklistItemsAcl.canUsePaginate, - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - paginated: ChecklistItemsQueries.usePaginate, - infinite: ChecklistItemsQueries.usePaginateInfinite, - filters: { - schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ChecklistItemsAcl.canUseFindById, - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - query: ChecklistItemsQueries.useFindById, - }, - create: { - acl: ChecklistItemsAcl.canUseCreate, - schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, - mutation: ChecklistItemsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: ChecklistItemsAcl.canUseUpdate, - schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, - mutation: ChecklistItemsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: ChecklistItemsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChecklistItemsQueries.usePaginateLabels, - infinite: ChecklistItemsQueries.usePaginateLabelsInfinite, - filters: { - schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/checklistItems/checklistItems.models.ts b/test/generated/full/checklistItems/checklistItems.models.ts deleted file mode 100644 index 5d31cea..0000000 --- a/test/generated/full/checklistItems/checklistItems.models.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChecklistItemsModels { -/** - * ChecklistItemEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type ChecklistItemEmployeeDTO = z.infer; - -/** - * ChecklistItemResponseDTOSchema - * @type { object } - * @property { string } id Checklist item ID - * @property { string } name Checklist item name - * @property { string } officeId Office ID - * @property { boolean } archived Is archived - * @property { string } archivedAt Archived at - * @property { string } createdById ID of the employee who created this checklist item - * @property { ChecklistItemEmployeeDTO } createdBy Employee who created this checklist item - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this checklist item - * @property { ChecklistItemEmployeeDTO } updatedBy Employee who last updated this checklist item - * @property { string } updatedAt Updated at - */ -export const ChecklistItemResponseDTOSchema = z.object({ id: z.string().describe("Checklist item ID"), name: z.string().describe("Checklist item name"), officeId: z.string().describe("Office ID"), archived: z.boolean().describe("Is archived"), archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), createdById: z.string().describe("ID of the employee who created this checklist item").nullish(), createdBy: ChecklistItemEmployeeDTOSchema.describe("Employee who created this checklist item").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedById: z.string().describe("ID of the employee who last updated this checklist item").nullish(), updatedBy: ChecklistItemEmployeeDTOSchema.describe("Employee who last updated this checklist item").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); -export type ChecklistItemResponseDTO = z.infer; - -/** - * CreateChecklistItemRequestDTOSchema - * @type { object } - * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` - */ -export const CreateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256).describe("Checklist item name") }).readonly(); -export type CreateChecklistItemRequestDTO = z.infer; - -/** - * ChecklistItemLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const ChecklistItemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type ChecklistItemLabelFilterDto = z.infer; - -/** - * ChecklistItemFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ChecklistItemFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); -export type ChecklistItemFilterDto = z.infer; - -/** - * UpdateChecklistItemRequestDTOSchema - * @type { object } - * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` - */ -export const UpdateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256).describe("Checklist item name") }).readonly(); -export type UpdateChecklistItemRequestDTO = z.infer; - -/** - * ChecklistItemsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistItemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistItemsPaginateOrderParamEnum = z.infer; -export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderParamEnumSchema.enum; - -/** - * ChecklistItemsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChecklistItemResponseDTO[] } items - */ -export const ChecklistItemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).readonly() }).readonly().shape }); -export type ChecklistItemsPaginateResponse = z.infer; - -/** - * ChecklistItemsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistItemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistItemsPaginateLabelsOrderParamEnum = z.infer; -export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * ChecklistItemsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type ChecklistItemsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/checklistItems/checklistItems.queries.ts b/test/generated/full/checklistItems/checklistItems.queries.ts deleted file mode 100644 index 4ec35c8..0000000 --- a/test/generated/full/checklistItems/checklistItems.queries.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChecklistItemsAcl } from "./checklistItems.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChecklistItemsModels } from "./checklistItems.models"; -import { ChecklistItemsApi } from "./checklistItems.api"; - -export namespace ChecklistItemsQueries { -export const moduleName = QueryModule.ChecklistItems; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-items/:id", id, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create checklist item - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ChecklistItemsModels.CreateChecklistItemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ChecklistItemsAcl.canUseCreate({ officeId } )); - return ChecklistItemsApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated checklist items - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated checklist items - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate checklist item labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate checklist item labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get checklist item by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUseFindById({ officeId } )); - return ChecklistItemsApi.findById(id, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update checklist item - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ChecklistItemsModels.UpdateChecklistItemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId } )); - return ChecklistItemsApi.update(id, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive checklist item - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistItemsAcl.canUseArchive({ officeId } )); - return ChecklistItemsApi.archive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive checklist item - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId } )); - return ChecklistItemsApi.unarchive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/checklistTemplates/checklistTemplates.acl.ts b/test/generated/full/checklistTemplates/checklistTemplates.acl.ts deleted file mode 100644 index d92f5fd..0000000 --- a/test/generated/full/checklistTemplates/checklistTemplates.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ChecklistTemplatesAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create checklist template in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Create", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List checklist templates for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Get checklist template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get checklist template by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Update", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -} diff --git a/test/generated/full/checklistTemplates/checklistTemplates.api.ts b/test/generated/full/checklistTemplates/checklistTemplates.api.ts deleted file mode 100644 index e0b177b..0000000 --- a/test/generated/full/checklistTemplates/checklistTemplates.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; - -export namespace ChecklistTemplatesApi { -export const create = (officeId: string, data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates`, - ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), - config - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, - `/offices/${officeId}/checklist-templates`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/checklist-templates/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates/${id}`, - config - ) -}; -export const update = (id: string, officeId: string, data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates/${id}`, - ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-templates/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-templates/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/checklistTemplates/checklistTemplates.configs.ts b/test/generated/full/checklistTemplates/checklistTemplates.configs.ts deleted file mode 100644 index 474d9c0..0000000 --- a/test/generated/full/checklistTemplates/checklistTemplates.configs.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChecklistTemplatesQueries } from "./checklistTemplates.queries"; -import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; - -export namespace ChecklistTemplatesConfigs { -export const checklistTemplatesConfig = { - meta: { - title: "Checklist Templates", - }, - readAll: { - acl: ChecklistTemplatesAcl.canUsePaginate, - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - paginated: ChecklistTemplatesQueries.usePaginate, - infinite: ChecklistTemplatesQueries.usePaginateInfinite, - filters: { - schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - items: true, - }, - sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ChecklistTemplatesAcl.canUseFindById, - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - query: ChecklistTemplatesQueries.useFindById, - }, - create: { - acl: ChecklistTemplatesAcl.canUseCreate, - schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, - mutation: ChecklistTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: ChecklistTemplatesAcl.canUseUpdate, - schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, - mutation: ChecklistTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - items: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ChecklistTemplatesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChecklistTemplatesQueries.usePaginateLabels, - infinite: ChecklistTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/checklistTemplates/checklistTemplates.models.ts b/test/generated/full/checklistTemplates/checklistTemplates.models.ts deleted file mode 100644 index 3c0da4d..0000000 --- a/test/generated/full/checklistTemplates/checklistTemplates.models.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChecklistTemplatesModels { -/** - * ChecklistTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type ChecklistTemplateEmployeeDTO = z.infer; - -/** - * ChecklistTemplateItemResponseDTOSchema - * @type { object } - * @property { string } checklistItemId Checklist item id - * @property { number } order Order index - * @property { string } name Checklist item name - */ -export const ChecklistTemplateItemResponseDTOSchema = z.object({ checklistItemId: z.string().describe("Checklist item id"), order: z.number().describe("Order index"), name: z.string().describe("Checklist item name").nullish() }).readonly(); -export type ChecklistTemplateItemResponseDTO = z.infer; - -/** - * ChecklistTemplateResponseDTOSchema - * @type { object } - * @property { string } id Template id - * @property { string } name Template name - * @property { string } officeId Office id - * @property { boolean } archived Is archived - * @property { string } archivedAt Archived at - * @property { string } createdById ID of the employee who created this template - * @property { ChecklistTemplateEmployeeDTO } createdBy Employee who created this template - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this template - * @property { ChecklistTemplateEmployeeDTO } updatedBy Employee who last updated this template - * @property { string } updatedAt Updated at - * @property { ChecklistTemplateItemResponseDTO[] } items Ordered items - */ -export const ChecklistTemplateResponseDTOSchema = z.object({ id: z.string().describe("Template id"), name: z.string().describe("Template name"), officeId: z.string().describe("Office id"), archived: z.boolean().describe("Is archived"), archivedAt: z.iso.datetime({ offset: true }).describe("Archived at").nullish(), createdById: z.string().describe("ID of the employee who created this template").nullish(), createdBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), updatedBy: ChecklistTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), items: z.array(ChecklistTemplateItemResponseDTOSchema).readonly().describe("Ordered items") }).readonly(); -export type ChecklistTemplateResponseDTO = z.infer; - -/** - * CreateChecklistTemplateRequestDTOSchema - * @type { object } - * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` - */ -export const CreateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120).describe("Checklist template name") }).readonly(); -export type CreateChecklistTemplateRequestDTO = z.infer; - -/** - * ChecklistTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const ChecklistTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type ChecklistTemplateLabelFilterDto = z.infer; - -/** - * ChecklistTemplateFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ChecklistTemplateFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); -export type ChecklistTemplateFilterDto = z.infer; - -/** - * UpdateChecklistTemplateRequestDTOSchema - * @type { object } - * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` - * @property { string[] } items Ordered checklist item ids - */ -export const UpdateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120).describe("Checklist template name"), items: z.array(z.uuid()).readonly().describe("Ordered checklist item ids") }).readonly(); -export type UpdateChecklistTemplateRequestDTO = z.infer; - -/** - * ChecklistTemplatesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistTemplatesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistTemplatesPaginateOrderParamEnum = z.infer; -export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPaginateOrderParamEnumSchema.enum; - -/** - * ChecklistTemplatesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChecklistTemplateResponseDTO[] } items - */ -export const ChecklistTemplatesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).readonly() }).readonly().shape }); -export type ChecklistTemplatesPaginateResponse = z.infer; - -/** - * ChecklistTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistTemplatesPaginateLabelsOrderParamEnum = z.infer; -export const ChecklistTemplatesPaginateLabelsOrderParamEnum = ChecklistTemplatesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * ChecklistTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type ChecklistTemplatesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/checklistTemplates/checklistTemplates.queries.ts b/test/generated/full/checklistTemplates/checklistTemplates.queries.ts deleted file mode 100644 index bbbf515..0000000 --- a/test/generated/full/checklistTemplates/checklistTemplates.queries.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; -import { ChecklistTemplatesApi } from "./checklistTemplates.api"; - -export namespace ChecklistTemplatesQueries { -export const moduleName = QueryModule.ChecklistTemplates; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-templates/:id", id, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create checklist template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId } )); - return ChecklistTemplatesApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated checklist templates - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated checklist templates - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate checklist template labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate checklist template labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get checklist template by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId } )); - return ChecklistTemplatesApi.findById(id, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Replace checklist template - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId } )); - return ChecklistTemplatesApi.update(id, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive checklist template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId } )); - return ChecklistTemplatesApi.archive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive checklist template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId } )); - return ChecklistTemplatesApi.unarchive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/cities/cities.acl.ts b/test/generated/full/cities/cities.acl.ts deleted file mode 100644 index 877afd1..0000000 --- a/test/generated/full/cities/cities.acl.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CitiesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "City" -] as AbilityTuple<"Create", "City">; - -/** - * Use for `useListCityLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCityLabels` query - */ -export const canUseListCityLabels = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useGetCityLabelById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCityLabelById` query - */ -export const canUseGetCityLabelById = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "City" -] as AbilityTuple<"Update", "City">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "City" -] as AbilityTuple<"Archive", "City">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "City" -] as AbilityTuple<"Archive", "City">; - -} diff --git a/test/generated/full/cities/cities.api.ts b/test/generated/full/cities/cities.api.ts deleted file mode 100644 index 17b6f45..0000000 --- a/test/generated/full/cities/cities.api.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CitiesModels } from "./cities.models"; - -export namespace CitiesApi { -export const paginate = (limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CitiesModels.CitiesPaginateResponseSchema }, - `/cities`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: CitiesModels.CreateCityRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities`, - ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), - config - ) -}; -export const listCityLabels = (limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CitiesModels.ListCityLabelsResponseSchema }, - `/cities/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getCityLabelById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CitiesModels.CityLabelResponseDTOSchema }, - `/cities/${id}/labels`, - config - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities/${id}`, - config - ) -}; -export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities/${id}`, - ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/cities/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/cities/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/cities/cities.configs.ts b/test/generated/full/cities/cities.configs.ts deleted file mode 100644 index f31740c..0000000 --- a/test/generated/full/cities/cities.configs.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CitiesModels } from "./cities.models"; -import { CitiesQueries } from "./cities.queries"; -import { CitiesAcl } from "./cities.acl"; - -export namespace CitiesConfigs { -export const citiesConfig = { - meta: { - title: "Cities", - }, - readAll: { - acl: CitiesAcl.canUsePaginate, - schema: CitiesModels.CityResponseDTOSchema, - paginated: CitiesQueries.usePaginate, - infinite: CitiesQueries.usePaginateInfinite, - filters: { - schema: CitiesModels.CityPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CitiesModels.CityPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CitiesModels.CityResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - isoCode: true, - stateCode: true, - archived: true, - countryId: true, - country: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CitiesModels.CitiesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CitiesAcl.canUseFindById, - schema: CitiesModels.CityResponseDTOSchema, - query: CitiesQueries.useFindById, - }, - create: { - acl: CitiesAcl.canUseCreate, - schema: CitiesModels.CreateCityRequestDTOSchema, - mutation: CitiesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CitiesModels.CreateCityRequestDTOSchema, - options: { - inputs: { - name: true, - isoCode: true, - stateCode: true, - countryId: true, - }, - }, -}) - }, - update: { - acl: CitiesAcl.canUseUpdate, - schema: CitiesModels.UpdateCityRequestDTOSchema, - mutation: CitiesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CitiesModels.UpdateCityRequestDTOSchema, - options: { - inputs: { - name: true, - isoCode: true, - stateCode: true, - countryId: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: CitiesAcl.canUseListCityLabels, - schema: CitiesModels.CityLabelResponseDTOSchema, - paginated: CitiesQueries.useListCityLabels, - infinite: CitiesQueries.useListCityLabelsInfinite, - filters: { - schema: CitiesModels.CityLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CitiesModels.CityLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CitiesModels.CityLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - country: true, - }, - sortable: CitiesModels.ListCityLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/cities/cities.models.ts b/test/generated/full/cities/cities.models.ts deleted file mode 100644 index 8b422a7..0000000 --- a/test/generated/full/cities/cities.models.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CitiesModels { -/** - * CityCountryDtoSchema - * @type { object } - * @property { string } id Unique identifier of the country - * @property { string } name Name of the country - * @property { string } isoCode2 2 character iso code of the country - * @property { string } isoCode3 3 character iso code of the country - */ -export const CityCountryDtoSchema = z.object({ id: z.string().describe("Unique identifier of the country"), name: z.string().describe("Name of the country"), isoCode2: z.string().describe("2 character iso code of the country"), isoCode3: z.string().describe("3 character iso code of the country") }).readonly(); -export type CityCountryDto = z.infer; - -/** - * CityEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type CityEmployeeDTO = z.infer; - -/** - * CityResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the city - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { boolean } archived Whether the city is archived - * @property { string } countryId Country ID - * @property { CityCountryDto } country - * @property { string } createdById - * @property { CityEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CityEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const CityResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the city"), name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city").nullish(), stateCode: z.string().describe("State code of the city").nullish(), archived: z.boolean().describe("Whether the city is archived").nullish(), countryId: z.string().describe("Country ID").nullish(), country: CityCountryDtoSchema.nullish(), createdById: z.string().nullish(), createdBy: CityEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CityEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type CityResponseDTO = z.infer; - -/** - * CityLabelCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type CityLabelCountryDto = z.infer; - -/** - * CityLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { CityLabelCountryDto } country - */ -export const CityLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }).readonly(); -export type CityLabelResponseDTO = z.infer; - -/** - * CityPaginationFilterDtoSchema - * @type { object } - * @property { string } search Free search - * @property { boolean } archived - */ -export const CityPaginationFilterDtoSchema = z.object({ search: z.string().describe("Free search"), archived: z.boolean() }).readonly(); -export type CityPaginationFilterDto = z.infer; - -/** - * CityLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const CityLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type CityLabelFilterDto = z.infer; - -/** - * CreateCityRequestDTOSchema - * @type { object } - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { string } countryId Country ID - */ -export const CreateCityRequestDTOSchema = z.object({ name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city").nullish(), stateCode: z.string().describe("State code of the city").nullish(), countryId: z.string().describe("Country ID") }).readonly(); -export type CreateCityRequestDTO = z.infer; - -/** - * UpdateCityRequestDTOSchema - * @type { object } - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { string } countryId Country ID - */ -export const UpdateCityRequestDTOSchema = z.object({ name: z.string().describe("Name of the city"), isoCode: z.string().describe("ISO code of the city"), stateCode: z.string().describe("State code of the city"), countryId: z.string().describe("Country ID") }).readonly(); -export type UpdateCityRequestDTO = z.infer; - -/** - * CitiesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const CitiesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type CitiesPaginateOrderParamEnum = z.infer; -export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.enum; - -/** - * CitiesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CityResponseDTO[] } items - */ -export const CitiesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityResponseDTOSchema).readonly() }).readonly().shape }); -export type CitiesPaginateResponse = z.infer; - -/** - * ListCityLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ListCityLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ListCityLabelsOrderParamEnum = z.infer; -export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.enum; - -/** - * ListCityLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CityLabelResponseDTO[] } items - */ -export const ListCityLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityLabelResponseDTOSchema).readonly() }).readonly().shape }); -export type ListCityLabelsResponse = z.infer; - -} diff --git a/test/generated/full/cities/cities.queries.ts b/test/generated/full/cities/cities.queries.ts deleted file mode 100644 index 4ed9739..0000000 --- a/test/generated/full/cities/cities.queries.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CitiesAcl } from "./cities.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CitiesModels } from "./cities.models"; -import { CitiesApi } from "./cities.api"; - -export namespace CitiesQueries { -export const moduleName = QueryModule.Cities; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string) => [...keys.all, "/cities", "infinite", limit, order, filter, cursor] as const, - listCityLabels: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities/paginate/labels", limit, order, filter, page, cursor] as const, - listCityLabelsInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string) => [...keys.all, "/cities/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getCityLabelById: (id: string) => [...keys.all, "/cities/:id/labels", id] as const, - findById: (id: string) => [...keys.all, "/cities/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Cities - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Cities - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create city - * @permission Requires `canUseCreate` ability - * @param { CitiesModels.CreateCityRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CitiesAcl.canUseCreate()); - return CitiesApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListCityLabels` - * @summary Paginate cities with only their labels (id and name) and country information - * @permission Requires `canUseListCityLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCityLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCityLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListCityLabelsInfinite - * @summary Paginate cities with only their labels (id and name) and country information - * @permission Requires `canUseListCityLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListCityLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetCityLabelById` - * @summary Get city by ID with label format (id and formatted name) and country information - * @permission Requires `canUseGetCityLabelById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCityLabelById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCityLabelById(id), - queryFn: () => { - checkAcl(CitiesAcl.canUseGetCityLabelById()); - return CitiesApi.getCityLabelById(id, config) }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get city by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(CitiesAcl.canUseFindById()); - return CitiesApi.findById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update city - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { CitiesModels.UpdateCityRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(CitiesAcl.canUseUpdate()); - return CitiesApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive city - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CitiesAcl.canUseArchive()); - return CitiesApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive city - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CitiesAcl.canUseUnarchive()); - return CitiesApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/common/common.models.ts b/test/generated/full/common/common.models.ts deleted file mode 100644 index 42415c1..0000000 --- a/test/generated/full/common/common.models.ts +++ /dev/null @@ -1,1860 +0,0 @@ -import { z } from "zod"; - -export namespace CommonModels { -/** - * PositionCargoPackageEnumSchema - * @type { enum } - */ -export const PositionCargoPackageEnumSchema = z.enum(["Hazardous", "NonStackable", "TemperatureControlled", "OversizedCargo", "DiplomaticCargo"]); -export type PositionCargoPackageEnum = z.infer; -export const PositionCargoPackageEnum = PositionCargoPackageEnumSchema.enum; - -/** - * HazardousSpecialtyEnumSchema - * @type { enum } - */ -export const HazardousSpecialtyEnumSchema = z.enum(["Explosives", "FlammableGas", "NonToxicAndFlammableGas", "PoisonGases", "FlammableLiquid", "FlammableSolid", "SpontaneouslyCombustible", "DangerousWhenWet", "Oxidizers", "OrganicPeroxides", "Poison", "InfectiousSubstances", "Radioactive", "Corrosive", "MiscellaneousDangerousSubstances"]); -export type HazardousSpecialtyEnum = z.infer; -export const HazardousSpecialtyEnum = HazardousSpecialtyEnumSchema.enum; - -/** - * RateOptionsEnumSchema - * @type { enum } - */ -export const RateOptionsEnumSchema = z.enum(["AsAgreed", "SpotRate"]); -export type RateOptionsEnum = z.infer; -export const RateOptionsEnum = RateOptionsEnumSchema.enum; - -/** - * RateClassEnumSchema - * @type { enum } - */ -export const RateClassEnumSchema = z.enum(["MinimumCharge", "NormalRate", "QuantityRate"]); -export type RateClassEnum = z.infer; -export const RateClassEnum = RateClassEnumSchema.enum; - -/** - * AccountInformationEnumSchema - * @type { enum } - * @description Account information - */ -export const AccountInformationEnumSchema = z.enum(["FreightCollect", "FreightPrepaid"]); -export type AccountInformationEnum = z.infer; -export const AccountInformationEnum = AccountInformationEnumSchema.enum; - -/** - * LanguageEnumSchema - * @type { enum } - */ -export const LanguageEnumSchema = z.enum(["English", "German", "Hungarian", "Czech", "Turkish", "Slovenian"]); -export type LanguageEnum = z.infer; -export const LanguageEnum = LanguageEnumSchema.enum; - -/** - * LocaleEnumSchema - * @type { enum } - */ -export const LocaleEnumSchema = z.enum(["en-US", "de-DE", "cs-CZ", "sl-SI", "tr-TR", "hu-HU"]); -export type LocaleEnum = z.infer; -export const LocaleEnum = LocaleEnumSchema.enum; - -/** - * OfficePaymentTermsDateTypeSchema - * @type { enum } - */ -export const OfficePaymentTermsDateTypeSchema = z.enum(["InvoiceDate", "ServiceDate"]); -export type OfficePaymentTermsDateType = z.infer; -export const OfficePaymentTermsDateType = OfficePaymentTermsDateTypeSchema.enum; - -/** - * FolderEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type FolderEmployeeDTO = z.infer; - -/** - * FileResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } archived - * @property { boolean } isSystem - * @property { string } createdAt - * @property { string } updatedAt - * @property { FolderEmployeeDTO } createdBy - * @property { FolderEmployeeDTO } updatedBy - * @property { string } downloadUrl - */ -export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }).readonly(); -export type FileResponseDTO = z.infer; - -/** - * EditorContentUpdateDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const EditorContentUpdateDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); -export type EditorContentUpdateDto = z.infer; - -/** - * RemarkBlockDTOSchema - * @type { object } - * @property { string } id - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { EditorContentUpdateDto } content - */ -export const RemarkBlockDTOSchema = z.object({ id: z.string(), enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), content: CommonModels.EditorContentUpdateDtoSchema }).readonly(); -export type RemarkBlockDTO = z.infer; - -/** - * TitleBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { string } defaultTitle - * @property { boolean } includePositionNumber - * @property { boolean } allowManualOverride - */ -export const TitleBlockDTOSchema = z.object({ enabled: z.boolean(), defaultTitle: z.string(), includePositionNumber: z.boolean(), allowManualOverride: z.boolean() }).readonly(); -export type TitleBlockDTO = z.infer; - -/** - * PositionInvolvedPartyTypeEnumSchema - * @type { enum } - */ -export const PositionInvolvedPartyTypeEnumSchema = z.enum(["Customer", "Notify", "AlsoNotify", "FOBForwarder", "RoutingAgent", "DeliveryAgent", "TransportProvider", "OceanCarrier", "OriginServiceProvider", "DestinationServiceProvider", "InsuranceProvider", "OriginCustomsAgent", "DestinationCustomsAgent", "StuffingProvider", "StrippingProvider", "Shipper", "Consignee", "CustomsBroker", "Courier", "Trucker", "Airline", "DestinationAgent", "OriginAgent"]); -export type PositionInvolvedPartyTypeEnum = z.infer; -export const PositionInvolvedPartyTypeEnum = PositionInvolvedPartyTypeEnumSchema.enum; - -/** - * ReceiverBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { string } defaultRole - */ -export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema }).readonly(); -export type ReceiverBlockDTO = z.infer; - -/** - * OurInformationBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } showName - * @property { boolean } showPhone - * @property { boolean } showDate - * @property { boolean } showBookingNumber - * @property { boolean } showCustomerReference - * @property { boolean } showMasterBillOfLadingNumber - * @property { boolean } showHouseBillOfLadingNumber - */ -export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean(), showName: z.boolean(), showPhone: z.boolean(), showDate: z.boolean(), showBookingNumber: z.boolean(), showCustomerReference: z.boolean(), showMasterBillOfLadingNumber: z.boolean(), showHouseBillOfLadingNumber: z.boolean() }).readonly(); -export type OurInformationBlockDTO = z.infer; - -/** - * RouteTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } showDate - * @property { boolean } showLocation - * @property { boolean } showType - * @property { boolean } showReference - * @property { boolean } showVesselVoyage - * @property { boolean } showAddress - * @property { boolean } showProvider - */ -export const RouteTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showDate: z.boolean(), showLocation: z.boolean(), showType: z.boolean(), showReference: z.boolean(), showVesselVoyage: z.boolean(), showAddress: z.boolean(), showProvider: z.boolean() }).readonly(); -export type RouteTableBlockDTO = z.infer; - -/** - * CargoTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - */ -export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); -export type CargoTableBlockDTO = z.infer; - -/** - * CargoSummaryBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - */ -export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document") }).readonly(); -export type CargoSummaryBlockDTO = z.infer; - -/** - * FinanceTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } showOnlyForReceiver - * @property { boolean } showVendor - * @property { boolean } showBuyRate - * @property { boolean } showCustomer - * @property { boolean } showSellRate - * @property { boolean } showGrid - * @property { boolean } showCharges - * @property { boolean } showAdditionalText - * @property { boolean } showQuantity - * @property { boolean } showProfit - * @property { boolean } showTotalsByCurrency - * @property { boolean } includeSubPositions - * @property { boolean } subPositionTotals - * @property { boolean } showBuyRateExchangeRates - * @property { boolean } showSellRateExchangeRates - * @property { boolean } showTotal - */ -export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), showOnlyForReceiver: z.boolean(), showVendor: z.boolean(), showBuyRate: z.boolean(), showCustomer: z.boolean(), showSellRate: z.boolean(), showGrid: z.boolean(), showCharges: z.boolean(), showAdditionalText: z.boolean(), showQuantity: z.boolean(), showProfit: z.boolean(), showTotalsByCurrency: z.boolean(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean(), showSellRateExchangeRates: z.boolean(), showTotal: z.boolean() }).readonly(); -export type FinanceTableBlockDTO = z.infer; - -/** - * FooterBlockDTOSchema - * @type { object } - * @property { boolean } enabled - */ -export const FooterBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); -export type FooterBlockDTO = z.infer; - -/** - * TermsBlockDTOSchema - * @type { object } - * @property { boolean } enabled - */ -export const TermsBlockDTOSchema = z.object({ enabled: z.boolean() }).readonly(); -export type TermsBlockDTO = z.infer; - -/** - * CutOffDatesBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } billOfLadingFromCustomer - * @property { boolean } billOfLadingToCarrier - * @property { boolean } customsAMS - * @property { boolean } vgmCustomer - */ -export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean(), position: z.number().gte(1).describe("1-based order in the rendered document"), billOfLadingFromCustomer: z.boolean(), billOfLadingToCarrier: z.boolean(), customsAMS: z.boolean(), vgmCustomer: z.boolean() }).readonly(); -export type CutOffDatesBlockDTO = z.infer; - -/** - * TemplateBlocksResponseDTOSchema - * @type { object } - * @property { TitleBlockDTO } titleBlock - * @property { ReceiverBlockDTO } receiverBlock - * @property { OurInformationBlockDTO } ourInformationBlock - * @property { RouteTableBlockDTO } routeTableBlock - * @property { CargoTableBlockDTO } cargoTableBlock - * @property { CargoSummaryBlockDTO } cargoSummaryBlock - * @property { FinanceTableBlockDTO } financeTableBlock - * @property { RemarkBlockDTO[] } remarkBlocks - * @property { FooterBlockDTO } footerBlock - * @property { TermsBlockDTO } termsBlock - * @property { CutOffDatesBlockDTO } cutOffDatesBlock - */ -export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); -export type TemplateBlocksResponseDTO = z.infer; - -/** - * RouteTableProviderDtoSchema - * @type { object } - * @property { string } id Provider ID - * @property { string } name Provider name - */ -export const RouteTableProviderDtoSchema = z.object({ id: z.string().describe("Provider ID"), name: z.string().describe("Provider name") }).readonly(); -export type RouteTableProviderDto = z.infer; - -/** - * RouteTablePointDtoSchema - * @type { object } - * @property { string } id Route point ID - * @property { string } type Route point type - * @property { string } datetime Route point datetime - * @property { string } secondaryDatetime Route point secondary datetime - * @property { string } address Route point address - * @property { string } name Route point address name - * @property { string } reference Route point reference - * @property { RouteTableProviderDto } provider Route point provider - * @property { string } vessel Vessel information - * @property { string } voyage Voyage information - * @property { string } carrier Carrier name - */ -export const RouteTablePointDtoSchema = z.object({ id: z.string().describe("Route point ID"), type: z.string().describe("Route point type"), datetime: z.string().describe("Route point datetime").nullish(), secondaryDatetime: z.string().describe("Route point secondary datetime").nullish(), address: z.string().describe("Route point address").nullish(), name: z.string().describe("Route point address name").nullish(), reference: z.string().describe("Route point reference").nullish(), provider: CommonModels.RouteTableProviderDtoSchema.describe("Route point provider").nullish(), vessel: z.string().describe("Vessel information").nullish(), voyage: z.string().describe("Voyage information").nullish(), carrier: z.string().describe("Carrier name").nullish() }).readonly(); -export type RouteTablePointDto = z.infer; - -/** - * RouteTableBlockResponseDtoSchema - * @type { object } - * @property { string } selectedRouteId Selected route ID - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { boolean } showReference Show reference column - * @property { boolean } showVesselVoyage Show vessel/voyage column - * @property { boolean } showProvider Show provider column - * @property { RouteTablePointDto[] } points Route points - * @property { boolean } showAddress Show address - * @property { boolean } showDates Show dates - * @property { boolean } showType Show type - * @property { boolean } showLocation Show location - * @property { boolean } showGrid Show grid - * @property { boolean } suppressRoute Suppress route - */ -export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID").nullish(), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish(), showAddress: z.boolean().describe("Show address").nullish(), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); -export type RouteTableBlockResponseDto = z.infer; - -/** - * CargoSpecialtyDtoSchema - * @type { object } - * @property { string } name - * @property { string } unNumber UN number for hazardous specialty - * @property { string } IMOClass IMO class for hazardous specialty - * @property { number } temperatureFrom Temperature from (°C) for temperature-controlled specialty - * @property { number } temperatureUntil Temperature until (°C) for temperature-controlled specialty - */ -export const CargoSpecialtyDtoSchema = z.object({ name: CommonModels.PositionCargoPackageEnumSchema, unNumber: z.string().describe("UN number for hazardous specialty").nullish(), IMOClass: z.string().describe("IMO class for hazardous specialty").nullish(), temperatureFrom: z.number().describe("Temperature from (°C) for temperature-controlled specialty").nullish(), temperatureUntil: z.number().describe("Temperature until (°C) for temperature-controlled specialty").nullish() }).readonly(); -export type CargoSpecialtyDto = z.infer; - -/** - * CargoPackageDtoSchema - * @type { object } - * @property { string } id Package ID - * @property { string } description Package description - * @property { string } weight Weight - * @property { string } hsCodes HS codes (numeric only) - * @property { number } quantity Quantity - * @property { number } width Width (cm) - * @property { number } length Length (cm) - * @property { number } height Height (cm) - * @property { number } volume Total volume in m3 for this package group - * @property { string } packageType Package type name - * @property { string } caseMarks Case marks - * @property { CargoSpecialtyDto[] } specialties Package specialties - * @property { number } chargeableWeight Chargeable weight in kg - * @property { number } volumetricWeight Volumetric weight in kg - */ -export const CargoPackageDtoSchema = z.object({ id: z.string().describe("Package ID"), description: z.string().describe("Package description").nullish(), weight: z.string().describe("Weight").nullish(), hsCodes: z.string().describe("HS codes (numeric only)").nullish(), quantity: z.number().describe("Quantity").nullish(), width: z.number().describe("Width (cm)").nullish(), length: z.number().describe("Length (cm)").nullish(), height: z.number().describe("Height (cm)").nullish(), volume: z.number().describe("Total volume in m3 for this package group").nullish(), packageType: z.string().describe("Package type name").nullish(), caseMarks: z.string().describe("Case marks").nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).readonly().describe("Package specialties").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg").nullish() }).readonly(); -export type CargoPackageDto = z.infer; - -/** - * CargoItemRouteDtoSchema - * @type { object } - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { RouteTablePointDto[] } points Route points - */ -export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points").nullish() }).readonly(); -export type CargoItemRouteDto = z.infer; - -/** - * CargoItemDtoSchema - * @type { object } - * @property { string } cargoId Cargo ID - * @property { string } cargoType Cargo type - * @property { string } containerNumber Container number - * @property { string } seal1 First seal (sea cargo only) - * @property { string } seal2 Second seal (sea cargo only) - * @property { string } vgm Verified gross mass (VGM) for container, sea cargo only - * @property { number } totalGrossWeight Total gross weight from cargo details - * @property { number } totalVolume Total volume (m3) calculated from cargo packages - * @property { number } chargeableWeight Chargeable weight in kg for transport unit - * @property { number } volumetricWeight Volumetric weight in kg for transport unit - * @property { CargoPackageDto[] } packages Cargo packages - * @property { string[] } selectedPackageIds Selected cargo package IDs - * @property { CargoItemRouteDto } route Cargo route (when routes are split) - */ -export const CargoItemDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID"), cargoType: z.string().describe("Cargo type"), containerNumber: z.string().describe("Container number").nullish(), seal1: z.string().describe("First seal (sea cargo only)").nullish(), seal2: z.string().describe("Second seal (sea cargo only)").nullish(), vgm: z.string().describe("Verified gross mass (VGM) for container, sea cargo only").nullish(), totalGrossWeight: z.number().describe("Total gross weight from cargo details").nullish(), totalVolume: z.number().describe("Total volume (m3) calculated from cargo packages").nullish(), chargeableWeight: z.number().describe("Chargeable weight in kg for transport unit").nullish(), volumetricWeight: z.number().describe("Volumetric weight in kg for transport unit").nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema).readonly().describe("Cargo packages"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteDtoSchema.describe("Cargo route (when routes are split)").nullish() }).readonly(); -export type CargoItemDto = z.infer; - -/** - * CargoTableBlockDtoSchema - * @type { object } - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { boolean } suppressWeight Suppress weight column display - * @property { boolean } showGrid Show grid borders in cargo table - * @property { boolean } suppressVolume Suppress volume column display - * @property { boolean } suppressSpecialities Suppress specialities column display - * @property { boolean } suppressDimensions Suppress dimensions column display - * @property { boolean } suppressPackageVolume Suppress package volume column display - * @property { boolean } suppressPackageWeight Suppress package weight column display - * @property { boolean } showGrandTotal Show grand total - * @property { boolean } showTransportUnitTotal Show transport unit total - * @property { boolean } showRoute Show route information (only applicable when routes are split) - * @property { boolean } suppressCargo Suppress cargo table display - * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units - * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units - * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages - * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages - * @property { boolean } showPackageHSCodes Show HS codes for packages - * @property { boolean } showPackageType Show package type for packages - * @property { boolean } showPackageQuantity Show quantity for packages - * @property { boolean } showPackageDescription Show description for packages - * @property { boolean } showPackageCaseMarks Show case marks for packages - * @property { boolean } showTransportUnitNumber Show transport unit number - * @property { boolean } showTransportUnitType Show transport unit type - * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 - * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 - * @property { CargoItemDto[] } items Cargo items - */ -export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs").nullish(), suppressWeight: z.boolean().describe("Suppress weight column display").nullish(), showGrid: z.boolean().describe("Show grid borders in cargo table").nullish(), suppressVolume: z.boolean().describe("Suppress volume column display").nullish(), suppressSpecialities: z.boolean().describe("Suppress specialities column display").nullish(), suppressDimensions: z.boolean().describe("Suppress dimensions column display").nullish(), suppressPackageVolume: z.boolean().describe("Suppress package volume column display").nullish(), suppressPackageWeight: z.boolean().describe("Suppress package weight column display").nullish(), showGrandTotal: z.boolean().describe("Show grand total").nullish(), showTransportUnitTotal: z.boolean().describe("Show transport unit total").nullish(), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullish(), suppressCargo: z.boolean().describe("Suppress cargo table display").nullish(), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units").nullish(), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units").nullish(), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages").nullish(), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages").nullish(), showPackageHSCodes: z.boolean().describe("Show HS codes for packages").nullish(), showPackageType: z.boolean().describe("Show package type for packages").nullish(), showPackageQuantity: z.boolean().describe("Show quantity for packages").nullish(), showPackageDescription: z.boolean().describe("Show description for packages").nullish(), showPackageCaseMarks: z.boolean().describe("Show case marks for packages").nullish(), showTransportUnitNumber: z.boolean().describe("Show transport unit number").nullish(), showTransportUnitType: z.boolean().describe("Show transport unit type").nullish(), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1").nullish(), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2").nullish(), items: z.array(CommonModels.CargoItemDtoSchema).readonly().describe("Cargo items") }).readonly(); -export type CargoTableBlockDto = z.infer; - -/** - * SummaryCargoItemDtoSchema - * @type { object } - * @property { string } transportUnitType Cargo type name (transport unit type) - * @property { number } quantity Count of cargos for this type - * @property { string } description Comma-joined transport unit numbers or custom description - */ -export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), quantity: z.number().describe("Count of cargos for this type"), description: z.string().describe("Comma-joined transport unit numbers or custom description") }).readonly(); -export type SummaryCargoItemDto = z.infer; - -/** - * SummaryCargoBlockResponseDtoSchema - * @type { object } - * @property { SummaryCargoItemDto[] } items - */ -export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema).readonly() }).readonly(); -export type SummaryCargoBlockResponseDto = z.infer; - -/** - * PositionAccountItemTypeEnumSchema - * @type { enum } - */ -export const PositionAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); -export type PositionAccountItemTypeEnum = z.infer; -export const PositionAccountItemTypeEnum = PositionAccountItemTypeEnumSchema.enum; - -/** - * FinanceRowDtoSchema - * @type { object } - * @property { string } id Finance row ID - * @property { PositionAccountItemTypeEnum } type Item type - * @property { string } chargeType Charge type - * @property { string } additionalText Additional text - * @property { string } text Text content - * @property { number } buyAmount Buy amount - * @property { string } buyCurrencyNotation Buy currency notation - * @property { number } sellAmount Sell amount - * @property { string } sellCurrencyNotation Sell currency notation - * @property { string } buyBPName Buy business partner name - * @property { string } sellBPName Sell business partner name - * @property { number } sellExchangeRate Sell exchange rate - * @property { number } buyExchangeRate Buy exchange rate - * @property { number } quantity Quantity - */ -export const FinanceRowDtoSchema = z.object({ id: z.string().describe("Finance row ID"), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), chargeType: z.string().describe("Charge type").nullish(), additionalText: z.string().describe("Additional text").nullish(), text: z.string().describe("Text content").nullish(), buyAmount: z.number().describe("Buy amount").nullish(), buyCurrencyNotation: z.string().describe("Buy currency notation").nullish(), sellAmount: z.number().describe("Sell amount").nullish(), sellCurrencyNotation: z.string().describe("Sell currency notation").nullish(), buyBPName: z.string().describe("Buy business partner name").nullish(), sellBPName: z.string().describe("Sell business partner name").nullish(), sellExchangeRate: z.number().describe("Sell exchange rate").nullish(), buyExchangeRate: z.number().describe("Buy exchange rate").nullish(), quantity: z.number().describe("Quantity").nullish() }).readonly(); -export type FinanceRowDto = z.infer; - -/** - * FinanceTotalsDtoSchema - * @type { object } - * @property { number } customerTotal Customer total - * @property { number } vendorTotal Vendor total - * @property { number } combinedTotal Combined total - * @property { string } currencyNotation Currency notation - */ -export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().describe("Customer total"), vendorTotal: z.number().describe("Vendor total"), combinedTotal: z.number().describe("Combined total"), currencyNotation: z.string().describe("Currency notation") }).readonly(); -export type FinanceTotalsDto = z.infer; - -/** - * FinanceTotalsByCurrencyDtoSchema - * @type { object } - * @property { string } currencyNotation Currency notation - * @property { number } vendorTotal Total for vendor side in this currency - * @property { number } customerTotal Total for customer side in this currency - */ -export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string().describe("Currency notation"), vendorTotal: z.number().describe("Total for vendor side in this currency").nullish(), customerTotal: z.number().describe("Total for customer side in this currency").nullish() }).readonly(); -export type FinanceTotalsByCurrencyDto = z.infer; - -/** - * FinanceTablePositionDtoSchema - * @type { object } - * @property { FinanceRowDto[] } rows Finance rows - * @property { FinanceTotalsDto } totals Finance totals - * @property { string[] } selectedFinanceRowIds Selected finance row IDs - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency - */ -export const FinanceTablePositionDtoSchema = z.object({ rows: z.array(CommonModels.FinanceRowDtoSchema).readonly().describe("Finance rows"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); -export type FinanceTablePositionDto = z.infer; - -/** - * FinanceTableBlockDtoSchema - * @type { object } - * @property { string } selectedBpId Selected business partner ID - * @property { boolean } showVendor Show vendor - * @property { boolean } showBuyRate Show buy rate - * @property { boolean } showCustomer Show customer - * @property { boolean } showSellRate Show sell rate - * @property { boolean } showGrid Show grid - * @property { boolean } showCharges Show charges - * @property { boolean } showAdditionalText Show additional text - * @property { boolean } showQuantity Show quantity - * @property { boolean } showTotalsByCurrency Show totals grouped by currency - * @property { boolean } suppressFinances Suppress finances from output - * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero - * @property { boolean } showTotal Show total from output - * @property { boolean } showProfit Show profit from output - * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output - * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output - * @property { boolean } includeSubPositions Include sub-positions - * @property { boolean } subPositionTotals Show sub-position totals - * @property { FinanceTablePositionDto[] } positions Finance positions - * @property { FinanceTotalsDto } totals Finance totals - * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency - */ -export const FinanceTableBlockDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionDtoSchema).readonly().describe("Finance positions"), totals: CommonModels.FinanceTotalsDtoSchema.describe("Finance totals"), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).readonly().describe("Totals grouped by currency") }).readonly(); -export type FinanceTableBlockDto = z.infer; - -/** - * RemarkBlockDtoSchema - * @type { object } - * @property { string } id - * @property { number } position Minimum: `1` - * @property { EditorContentUpdateDto } content - * @property { boolean } enabled - */ -export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }).readonly(); -export type RemarkBlockDto = z.infer; - -/** - * ConfigBlockDtoSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - * @property { boolean } showWatermarkOnDocuments Show watermark on documents - * @property { LocaleEnum } locale - */ -export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), showWatermarkOnDocuments: z.boolean().describe("Show watermark on documents"), locale: CommonModels.LocaleEnumSchema }).readonly(); -export type ConfigBlockDto = z.infer; - -/** - * TitleBlockUpdateDtoSchema - * @type { object } - * @property { string } value Title value - */ -export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().describe("Title value") }).readonly(); -export type TitleBlockUpdateDto = z.infer; - -/** - * ReceiverBlockUpdateDtoSchema - * @type { object } - * @property { string } selectedBpId Receiver business partner ID - * @property { string } address Receiver address - */ -export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Receiver business partner ID"), address: z.string().describe("Receiver address") }).readonly(); -export type ReceiverBlockUpdateDto = z.infer; - -/** - * OurInformationBlockUpdateDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } phone Phone number - * @property { string } date Date - * @property { string } bookingNumber Booking number - * @property { string } customerReference Customer reference - * @property { string } masterBillOfLadingNumber Master bill of lading number - * @property { string } houseBillOfLadingNumber House bill of lading number - * @property { string } positionNumber Position number - */ -export const OurInformationBlockUpdateDtoSchema = z.object({ name: z.string().describe("Name"), phone: z.string().describe("Phone number"), date: z.string().describe("Date"), bookingNumber: z.string().describe("Booking number"), customerReference: z.string().describe("Customer reference"), masterBillOfLadingNumber: z.string().describe("Master bill of lading number"), houseBillOfLadingNumber: z.string().describe("House bill of lading number"), positionNumber: z.string().describe("Position number") }).readonly(); -export type OurInformationBlockUpdateDto = z.infer; - -/** - * TermsBlockDtoSchema - * @type { object } - * @property { string } termsImageUrl Terms image URL - */ -export const TermsBlockDtoSchema = z.object({ termsImageUrl: z.string().describe("Terms image URL") }).readonly(); -export type TermsBlockDto = z.infer; - -/** - * CutOffDatesBlockUpdateDtoSchema - * @type { object } - * @property { string } billOfLadingFromCustomer Bill of lading from customer date - * @property { string } billOfLadingToCarrier Bill of lading to carrier date - * @property { string } customsAMS Customs AMS date - * @property { string } vgmCustomer VGM customer date - */ -export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().describe("Bill of lading from customer date"), billOfLadingToCarrier: z.string().describe("Bill of lading to carrier date"), customsAMS: z.string().describe("Customs AMS date"), vgmCustomer: z.string().describe("VGM customer date") }).readonly(); -export type CutOffDatesBlockUpdateDto = z.infer; - -/** - * TemplatedDocumentDataDtoSchema - * @type { object } - * @property { TitleBlockUpdateDto } title Title block data - * @property { ReceiverBlockUpdateDto } receiver Receiver block data - * @property { OurInformationBlockUpdateDto } ourInformation Our information block data - * @property { RouteTableBlockResponseDto } routeTable Route table block data - * @property { CargoTableBlockDto } cargoTable Cargo table block data - * @property { SummaryCargoBlockResponseDto } summaryCargo Summary cargo block data - * @property { FinanceTableBlockDto } financeTable Finance table block data - * @property { RemarkBlockDto[] } remarks Remark blocks - * @property { TermsBlockDto } terms Terms block data - * @property { ConfigBlockDto } config Config block data - * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data - */ -export const TemplatedDocumentDataDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableBlockResponseDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockResponseDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockDtoSchema).readonly().describe("Remark blocks"), terms: CommonModels.TermsBlockDtoSchema.describe("Terms block data"), config: CommonModels.ConfigBlockDtoSchema.describe("Config block data"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); -export type TemplatedDocumentDataDto = z.infer; - -/** - * RouteTableUpdateBlockDtoSchema - * @type { object } - * @property { string } selectedRouteId Selected route ID - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { boolean } showReference Show reference column - * @property { boolean } showVesselVoyage Show vessel/voyage column - * @property { boolean } showProvider Show provider column - * @property { RouteTablePointDto[] } points Route points - * @property { boolean } showAddress Show address - * @property { boolean } showDates Show dates - * @property { boolean } showType Show type - * @property { boolean } showLocation Show location - * @property { boolean } showGrid Show grid - * @property { boolean } suppressRoute Suppress route - */ -export const RouteTableUpdateBlockDtoSchema = z.object({ selectedRouteId: z.string().describe("Selected route ID"), selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs"), showReference: z.boolean().describe("Show reference column"), showVesselVoyage: z.boolean().describe("Show vessel/voyage column"), showProvider: z.boolean().describe("Show provider column"), points: z.array(CommonModels.RouteTablePointDtoSchema).readonly().describe("Route points"), showAddress: z.boolean().describe("Show address"), showDates: z.boolean().describe("Show dates"), showType: z.boolean().describe("Show type"), showLocation: z.boolean().describe("Show location"), showGrid: z.boolean().describe("Show grid"), suppressRoute: z.boolean().describe("Suppress route") }).readonly(); -export type RouteTableUpdateBlockDto = z.infer; - -/** - * CargoItemRouteUpdateDtoSchema - * @type { object } - * @property { string[] } selectedRoutePointIds Selected route point IDs - */ -export const CargoItemRouteUpdateDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()).readonly().describe("Selected route point IDs") }).readonly(); -export type CargoItemRouteUpdateDto = z.infer; - -/** - * CargoItemUpdateDtoSchema - * @type { object } - * @property { string } cargoId Cargo ID to update packages for - * @property { string[] } selectedPackageIds Selected cargo package IDs - * @property { CargoItemRouteUpdateDto } route Cargo route (when routes are split) - */ -export const CargoItemUpdateDtoSchema = z.object({ cargoId: z.string().describe("Cargo ID to update packages for"), selectedPackageIds: z.array(z.string()).readonly().describe("Selected cargo package IDs"), route: CommonModels.CargoItemRouteUpdateDtoSchema.describe("Cargo route (when routes are split)") }).readonly(); -export type CargoItemUpdateDto = z.infer; - -/** - * CargoTableBlockUpdateDtoSchema - * @type { object } - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { CargoItemUpdateDto[] } items Cargo items for package updates - * @property { boolean } suppressWeight Suppress weight column display - * @property { boolean } showGrid Show grid borders in cargo table - * @property { boolean } suppressVolume Suppress volume column display - * @property { boolean } suppressSpecialities Suppress specialities column display - * @property { boolean } suppressDimensions Suppress dimensions column display - * @property { boolean } suppressPackageVolume Suppress package volume column display - * @property { boolean } suppressPackageWeight Suppress package weight column display - * @property { boolean } showRoute Show route information (only applicable when routes are split) - * @property { boolean } showGrandTotal Show grand total - * @property { boolean } showTransportUnitTotal Show transport unit total - * @property { boolean } suppressCargo Suppress cargo table display - * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units - * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units - * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages - * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages - * @property { boolean } showPackageHSCodes Show HS codes for packages - * @property { boolean } showPackageType Show package type for packages - * @property { boolean } showPackageQuantity Show quantity for packages - * @property { boolean } showPackageDescription Show description for packages - * @property { boolean } showPackageCaseMarks Show case marks for packages - * @property { boolean } showTransportUnitNumber Show transport unit number - * @property { boolean } showTransportUnitType Show transport unit type - * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 - * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 - */ -export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), items: z.array(CommonModels.CargoItemUpdateDtoSchema).readonly().describe("Cargo items for package updates"), suppressWeight: z.boolean().describe("Suppress weight column display"), showGrid: z.boolean().describe("Show grid borders in cargo table"), suppressVolume: z.boolean().describe("Suppress volume column display"), suppressSpecialities: z.boolean().describe("Suppress specialities column display"), suppressDimensions: z.boolean().describe("Suppress dimensions column display"), suppressPackageVolume: z.boolean().describe("Suppress package volume column display"), suppressPackageWeight: z.boolean().describe("Suppress package weight column display"), showRoute: z.boolean().describe("Show route information (only applicable when routes are split)").nullable(), showGrandTotal: z.boolean().describe("Show grand total"), showTransportUnitTotal: z.boolean().describe("Show transport unit total"), suppressCargo: z.boolean().describe("Suppress cargo table display"), showTransportUnitChargeableWeight: z.boolean().describe("Show chargeable weight for transport units"), showTransportUnitVolumetricWeight: z.boolean().describe("Show volumetric weight for transport units"), showPackageChargeableWeight: z.boolean().describe("Show chargeable weight for packages"), showPackageVolumetricWeight: z.boolean().describe("Show volumetric weight for packages"), showPackageHSCodes: z.boolean().describe("Show HS codes for packages"), showPackageType: z.boolean().describe("Show package type for packages"), showPackageQuantity: z.boolean().describe("Show quantity for packages"), showPackageDescription: z.boolean().describe("Show description for packages"), showPackageCaseMarks: z.boolean().describe("Show case marks for packages"), showTransportUnitNumber: z.boolean().describe("Show transport unit number"), showTransportUnitType: z.boolean().describe("Show transport unit type"), showTransportUnitSeal1: z.boolean().describe("Show transport unit seal 1"), showTransportUnitSeal2: z.boolean().describe("Show transport unit seal 2") }).readonly(); -export type CargoTableBlockUpdateDto = z.infer; - -/** - * SummaryCargoItemUpdateDtoSchema - * @type { object } - * @property { string } transportUnitType Cargo type name (transport unit type) - * @property { string } description Updated description for this cargo type - */ -export const SummaryCargoItemUpdateDtoSchema = z.object({ transportUnitType: z.string().describe("Cargo type name (transport unit type)"), description: z.string().describe("Updated description for this cargo type") }).readonly(); -export type SummaryCargoItemUpdateDto = z.infer; - -/** - * SummaryCargoBlockUpdateDtoSchema - * @type { object } - * @property { SummaryCargoItemUpdateDto[] } items - */ -export const SummaryCargoBlockUpdateDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemUpdateDtoSchema).readonly() }).readonly(); -export type SummaryCargoBlockUpdateDto = z.infer; - -/** - * FinanceTablePositionUpdateDtoSchema - * @type { object } - * @property { string[] } selectedFinanceRowIds Selected finance row IDs - * @property { string } positionId Position ID - */ -export const FinanceTablePositionUpdateDtoSchema = z.object({ selectedFinanceRowIds: z.array(z.string()).readonly().describe("Selected finance row IDs"), positionId: z.string().describe("Position ID") }).readonly(); -export type FinanceTablePositionUpdateDto = z.infer; - -/** - * FinanceTableBlockUpdateDtoSchema - * @type { object } - * @property { string } selectedBpId Selected business partner ID - * @property { boolean } showVendor Show vendor - * @property { boolean } showBuyRate Show buy rate - * @property { boolean } showCustomer Show customer - * @property { boolean } showSellRate Show sell rate - * @property { boolean } showGrid Show grid - * @property { boolean } showCharges Show charges - * @property { boolean } showAdditionalText Show additional text - * @property { boolean } showQuantity Show quantity - * @property { boolean } showTotalsByCurrency Show totals grouped by currency - * @property { boolean } suppressFinances Suppress finances from output - * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero - * @property { boolean } showTotal Show total from output - * @property { boolean } showProfit Show profit from output - * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output - * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output - * @property { boolean } includeSubPositions Include sub-positions - * @property { boolean } subPositionTotals Show sub-position totals - * @property { FinanceTablePositionUpdateDto[] } positions Finance positions - */ -export const FinanceTableBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().describe("Selected business partner ID"), showVendor: z.boolean().describe("Show vendor"), showBuyRate: z.boolean().describe("Show buy rate"), showCustomer: z.boolean().describe("Show customer"), showSellRate: z.boolean().describe("Show sell rate"), showGrid: z.boolean().describe("Show grid"), showCharges: z.boolean().describe("Show charges"), showAdditionalText: z.boolean().describe("Show additional text"), showQuantity: z.boolean().describe("Show quantity"), showTotalsByCurrency: z.boolean().describe("Show totals grouped by currency"), suppressFinances: z.boolean().describe("Suppress finances from output"), suppressZeroLines: z.boolean().describe("Suppress rows where the amounts are zero"), showTotal: z.boolean().describe("Show total from output"), showProfit: z.boolean().describe("Show profit from output"), showBuyRateExchangeRates: z.boolean().describe("Show buy rate exchange rates from output"), showSellRateExchangeRates: z.boolean().describe("Show sell rate exchange rates from output"), includeSubPositions: z.boolean().describe("Include sub-positions").nullable(), subPositionTotals: z.boolean().describe("Show sub-position totals").nullable(), positions: z.array(CommonModels.FinanceTablePositionUpdateDtoSchema).readonly().describe("Finance positions") }).readonly(); -export type FinanceTableBlockUpdateDto = z.infer; - -/** - * RemarkBlockUpdateDtoSchema - * @type { object } - * @property { string } id - * @property { number } position Minimum: `1` - * @property { EditorContentUpdateDto } content - * @property { boolean } enabled - */ -export const RemarkBlockUpdateDtoSchema = z.object({ id: z.string(), position: z.number().gte(1).nullish(), content: CommonModels.EditorContentUpdateDtoSchema.nullish(), enabled: z.boolean().nullish() }).readonly(); -export type RemarkBlockUpdateDto = z.infer; - -/** - * TemplatedDocumentDataUpdateDtoSchema - * @type { object } - * @property { TitleBlockUpdateDto } title Title block data - * @property { ReceiverBlockUpdateDto } receiver Receiver block data - * @property { OurInformationBlockUpdateDto } ourInformation Our information block data - * @property { RouteTableUpdateBlockDto } routeTable Route table block data - * @property { CargoTableBlockUpdateDto } cargoTable Cargo table block data - * @property { SummaryCargoBlockUpdateDto } summaryCargo Summary cargo block data - * @property { FinanceTableBlockUpdateDto } financeTable Finance table block data - * @property { RemarkBlockUpdateDto[] } remarks Remark blocks - * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data - */ -export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.describe("Title block data"), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.describe("Receiver block data"), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.describe("Our information block data"), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.describe("Route table block data"), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.describe("Cargo table block data"), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.describe("Summary cargo block data"), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.describe("Finance table block data"), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).readonly().describe("Remark blocks"), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.describe("Cut off dates block data") }).readonly(); -export type TemplatedDocumentDataUpdateDto = z.infer; - -/** - * BusinessPartnerTypeSchema - * @type { enum } - */ -export const BusinessPartnerTypeSchema = z.enum(["businessPartner", "destinationAgent", "oceanCarrier", "office", "customsAgent", "stuffingStrippingProvider", "shipper", "fobForwarder", "routingAgent", "transportProvider", "originServiceProvider", "insuranceProvider", "consignee", "courier", "trucker", "airline", "originAgent"]); -export type BusinessPartnerType = z.infer; -export const BusinessPartnerType = BusinessPartnerTypeSchema.enum; - -/** - * BusinessPartnerAddressCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type BusinessPartnerAddressCityDto = z.infer; - -/** - * BusinessPartnerAddressCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const BusinessPartnerAddressCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); -export type BusinessPartnerAddressCountryDto = z.infer; - -/** - * BusinessPartnerAddressResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the address - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street information - * @property { string } zip ZIP/Postal code - * @property { BusinessPartnerAddressCityDto } city Country data - * @property { string } district District information - * @property { BusinessPartnerAddressCountryDto } country Country data - */ -export const BusinessPartnerAddressResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the address"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street information"), zip: z.string().describe("ZIP/Postal code"), city: CommonModels.BusinessPartnerAddressCityDtoSchema.describe("Country data"), district: z.string().describe("District information"), country: CommonModels.BusinessPartnerAddressCountryDtoSchema.describe("Country data") }).readonly(); -export type BusinessPartnerAddressResponseDTO = z.infer; - -/** - * EditorContentResponseDtoSchema - * @type { object } - * @property { string } html HTML content - * @property { object } json JSON content - * @property { any } json.[key] - */ -export const EditorContentResponseDtoSchema = z.object({ html: z.string().describe("HTML content"), json: z.object({}).catchall(z.any()).readonly().describe("JSON content") }).readonly(); -export type EditorContentResponseDto = z.infer; - -/** - * DunningSystemReferenceDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } isDefault - */ -export const DunningSystemReferenceDTOSchema = z.object({ id: z.string(), name: z.string(), isDefault: z.boolean() }).readonly(); -export type DunningSystemReferenceDTO = z.infer; - -/** - * TransportModeEnumSchema - * @type { enum } - */ -export const TransportModeEnumSchema = z.enum(["Air", "Sea", "Road"]); -export type TransportModeEnum = z.infer; -export const TransportModeEnum = TransportModeEnumSchema.enum; - -/** - * SeaRoutingEnumSchema - * @type { enum } - */ -export const SeaRoutingEnumSchema = z.enum(["Direct", "Transhipment"]); -export type SeaRoutingEnum = z.infer; -export const SeaRoutingEnum = SeaRoutingEnumSchema.enum; - -/** - * InvolvedPartyBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { BusinessPartnerAddressResponseDTO } address Main address information - */ -export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.describe("Main address information").nullish() }).readonly(); -export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; - -/** - * InvolvedPartyContactResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvolvedPartyContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type InvolvedPartyContactResponseDTO = z.infer; - -/** - * InvolvedPartyResponseDtoSchema - * @type { object } - * @property { string } id - * @property { PositionInvolvedPartyTypeEnum } type - * @property { string } reference - * @property { InvolvedPartyBusinessPartnerResponseDTO } businessPartner - * @property { InvolvedPartyContactResponseDTO } contact - */ -export const InvolvedPartyResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionInvolvedPartyTypeEnumSchema, reference: z.string().nullish(), businessPartner: CommonModels.InvolvedPartyBusinessPartnerResponseDTOSchema.nullish(), contact: CommonModels.InvolvedPartyContactResponseDTOSchema.nullish() }).readonly(); -export type InvolvedPartyResponseDto = z.infer; - -/** - * CreateInvolvedPartyRequestDtoSchema - * @type { object } - * @property { PositionInvolvedPartyTypeEnum } type Type of the involved party to create - */ -export const CreateInvolvedPartyRequestDtoSchema = z.object({ type: CommonModels.PositionInvolvedPartyTypeEnumSchema.describe("Type of the involved party to create") }).readonly(); -export type CreateInvolvedPartyRequestDto = z.infer; - -/** - * RouteLocationTypeEnumSchema - * @type { enum } - */ -export const RouteLocationTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Port", "Terminal", "City", "Warehouse", "ContainerYard", "Airport"]); -export type RouteLocationTypeEnum = z.infer; -export const RouteLocationTypeEnum = RouteLocationTypeEnumSchema.enum; - -/** - * RoutePointLocationResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { RouteLocationTypeEnum } type - */ -export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }).readonly(); -export type RoutePointLocationResponseDto = z.infer; - -/** - * RoutePointTypeEnumSchema - * @type { enum } - */ -export const RoutePointTypeEnumSchema = z.enum(["EmptyContainerDepot", "LoadingAddress", "Stop", "FumigationStop", "OriginCustomsStop", "StuffingLocation", "PortTerminal", "PortOfLoading", "TransshipmentPort", "PortOfDischarge", "StrippingLocation", "ContainerYard", "DestinationCustomsStop", "FinalDestination", "EmptyContainerReturn", "OriginAgent", "HandlingAgent", "XRay", "CustomsBroker", "AirportOfDeparture", "StopAirport", "DestinationAirport", "CustomsStop", "DestinationAgent", "DeliveryAddress", "Courier", "PickupAddress", "StopAddress"]); -export type RoutePointTypeEnum = z.infer; -export const RoutePointTypeEnum = RoutePointTypeEnumSchema.enum; - -/** - * IncotermsEnumSchema - * @type { enum } - */ -export const IncotermsEnumSchema = z.enum(["EXW", "FCA", "CPT", "CIP", "DAP", "DPU", "DDP", "FAS", "FOB", "CFR", "CIF"]); -export type IncotermsEnum = z.infer; -export const IncotermsEnum = IncotermsEnumSchema.enum; - -/** - * PositionRouteTransportModeEnumSchema - * @type { enum } - */ -export const PositionRouteTransportModeEnumSchema = z.enum(["Truck", "Rail/Truck", "Rail", "Barge"]); -export type PositionRouteTransportModeEnum = z.infer; -export const PositionRouteTransportModeEnum = PositionRouteTransportModeEnumSchema.enum; - -/** - * RoutePointProviderResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type RoutePointProviderResponseDto = z.infer; - -/** - * RoutePointResponseDtoSchema - * @type { object } - * @property { string } id - * @property { RoutePointTypeEnum } type - * @property { string } name - * @property { number } sequenceNumber - * @property { RoutePointLocationResponseDto } location - * @property { string } estimatedTime - * @property { string } secondaryEstimatedTime Secondary estimated time (sea positions only) - * @property { string } reference - * @property { string } secondaryReference - * @property { IncotermsEnum } incoterm - * @property { PositionRouteTransportModeEnum } transportMode - * @property { RoutePointProviderResponseDto } provider - * @property { string } vessel Vessel name (sea positions only) - * @property { string } voyage Voyage number (sea positions only) - * @property { string } carrier Carrier name (sea positions only) - */ -export const RoutePointResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.RoutePointTypeEnumSchema, name: z.string(), sequenceNumber: z.number(), location: CommonModels.RoutePointLocationResponseDtoSchema.nullish(), estimatedTime: z.iso.datetime({ offset: true }).nullish(), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time (sea positions only)").nullish(), reference: z.string().nullish(), secondaryReference: z.string().nullish(), incoterm: CommonModels.IncotermsEnumSchema.nullish(), transportMode: CommonModels.PositionRouteTransportModeEnumSchema.nullish(), provider: CommonModels.RoutePointProviderResponseDtoSchema.nullish(), vessel: z.string().describe("Vessel name (sea positions only)").nullish(), voyage: z.string().describe("Voyage number (sea positions only)").nullish(), carrier: z.string().describe("Carrier name (sea positions only)").nullish() }).readonly(); -export type RoutePointResponseDto = z.infer; - -/** - * RouteResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } cargoId Cargo ID (sea positions only) - * @property { string } cargoNumber Cargo number (sea positions only) - * @property { RoutePointResponseDto[] } points - */ -export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().describe("Cargo ID (sea positions only)").nullish(), cargoNumber: z.string().describe("Cargo number (sea positions only)").nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema).readonly() }).readonly(); -export type RouteResponseDto = z.infer; - -/** - * RouteListResponseDtoSchema - * @type { object } - * @property { RouteResponseDto[] } routes - * @property { boolean } splitRoute Whether the position routes are split by cargo (sea positions only) - */ -export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema).readonly(), splitRoute: z.boolean().describe("Whether the position routes are split by cargo (sea positions only)") }).readonly(); -export type RouteListResponseDto = z.infer; - -/** - * CreateRoutePointRequestDtoSchema - * @type { object } - * @property { RoutePointTypeEnum } type - */ -export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }).readonly(); -export type CreateRoutePointRequestDto = z.infer; - -/** - * UpdateRoutePointRequestDtoSchema - * @type { object } - * @property { string } locationId Location ID for the route point - * @property { RouteLocationTypeEnum } locationType Type of location - * @property { string } estimatedTime Updated estimated time for the route point - * @property { string } secondaryEstimatedTime Secondary estimated time for the route point (sea positions only) - * @property { string } reference Reference for the route point - * @property { string } secondaryReference Secondary reference for the route point - * @property { IncotermsEnum } incoterm - * @property { PositionRouteTransportModeEnum } transportMode - * @property { string } providerId - * @property { string } vessel Vessel name (sea positions only) - * @property { string } voyage Voyage number (sea positions only) - * @property { string } carrier Carrier name (sea positions only) - */ -export const UpdateRoutePointRequestDtoSchema = z.object({ locationId: z.string().describe("Location ID for the route point").nullable(), locationType: CommonModels.RouteLocationTypeEnumSchema.describe("Type of location").nullable(), estimatedTime: z.iso.datetime({ offset: true }).describe("Updated estimated time for the route point"), secondaryEstimatedTime: z.iso.datetime({ offset: true }).describe("Secondary estimated time for the route point (sea positions only)"), reference: z.string().describe("Reference for the route point"), secondaryReference: z.string().describe("Secondary reference for the route point"), incoterm: CommonModels.IncotermsEnumSchema, transportMode: CommonModels.PositionRouteTransportModeEnumSchema, providerId: z.string(), vessel: z.string().describe("Vessel name (sea positions only)"), voyage: z.string().describe("Voyage number (sea positions only)"), carrier: z.string().describe("Carrier name (sea positions only)") }).readonly(); -export type UpdateRoutePointRequestDto = z.infer; - -/** - * PositionChargeDtoResponseSchema - * @type { object } - * @property { object } chargeType - * @property { string } chargeType.id - * @property { string } chargeType.name - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { object } buyVatRule - * @property { string } buyVatRule.id - * @property { string } buyVatRule.name - * @property { string } buyVatRule.matchcode - * @property { object } vendor - * @property { string } vendor.id - * @property { string } vendor.name - * @property { string } vendor.matchCode - * @property { string } vendor.label - * @property { string } vendor.debtorId - * @property { string } vendor.creditorId - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { object } sellVatRule - * @property { string } sellVatRule.id - * @property { string } sellVatRule.name - * @property { string } sellVatRule.matchcode - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { string } customer.debtorId - * @property { string } customer.creditorId - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - * @property { number } profit Profit amount - * @property { string } profitCurrencyCode Profit currency code - */ -export const PositionChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge").nullish(), buyRate: z.number().describe("Buy rate amount").nullish(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), sellRate: z.number().describe("Sell rate amount").nullish(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly().nullish(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).readonly().nullish(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), profit: z.number().describe("Profit amount").nullish(), profitCurrencyCode: z.string().describe("Profit currency code").nullish() }).readonly(); -export type PositionChargeDtoResponse = z.infer; - -/** - * PositionTextDtoResponseSchema - * @type { object } - * @property { string } content Text content - */ -export const PositionTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); -export type PositionTextDtoResponse = z.infer; - -/** - * PositionAccountItemDtoResponseSchema - * @type { object } - * @property { string } id Item ID - * @property { string } outgoingInvoiceId - * @property { string } registeredInvoiceId - * @property { PositionAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { PositionChargeDtoResponse } charge Charge data if type is CHARGE - * @property { PositionTextDtoResponse } text Text data if type is TEXT - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - */ -export const PositionAccountItemDtoResponseSchema = z.object({ id: z.string().describe("Item ID"), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish(), type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item"), charge: CommonModels.PositionChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), text: CommonModels.PositionTextDtoResponseSchema.describe("Text data if type is TEXT").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); -export type PositionAccountItemDtoResponse = z.infer; - -/** - * UserPreviewDtoSchema - * @type { object } - * @property { string } userId - * @property { string } name - */ -export const UserPreviewDtoSchema = z.object({ userId: z.string(), name: z.string() }).readonly(); -export type UserPreviewDto = z.infer; - -/** - * HBLDocumentConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - * @property { string } blTermsAndConditionsImageUrl BL terms and conditions image URL - * @property { string } signatureImageUrl Signature image URL - * @property { boolean } hasSignatureImage Whether office has a signature image configured - */ -export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL"), blTermsAndConditionsImageUrl: z.string().describe("BL terms and conditions image URL"), signatureImageUrl: z.string().describe("Signature image URL"), hasSignatureImage: z.boolean().describe("Whether office has a signature image configured") }).readonly(); -export type HBLDocumentConfigDto = z.infer; - -/** - * DirectionEnumSchema - * @type { enum } - */ -export const DirectionEnumSchema = z.enum(["Import", "Export"]); -export type DirectionEnum = z.infer; -export const DirectionEnum = DirectionEnumSchema.enum; - -/** - * HazardousPackingGroupEnumSchema - * @type { enum } - */ -export const HazardousPackingGroupEnumSchema = z.enum(["PG I", "PG II", "PG III"]); -export type HazardousPackingGroupEnum = z.infer; -export const HazardousPackingGroupEnum = HazardousPackingGroupEnumSchema.enum; - -/** - * PositionCargoPackageHazardousSpecialtyResponseDTOSchema - * @type { object } - * @property { number } totalLength - * @property { number } totalWidth - * @property { number } temperature - * @property { string } unNumber - * @property { string } IMOClass - * @property { string } shippingName - * @property { string } technicalName - * @property { HazardousPackingGroupEnum } packagingGroup - * @property { number } netWeight - * @property { number } flashpoint - * @property { string[] } properties - * @property { string } acceptanceNumber - * @property { string } medGuide - * @property { string } emergencyPhone - * @property { string } emergencySchedule - */ -export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number(), totalWidth: z.number(), temperature: z.number(), unNumber: z.string(), IMOClass: z.string(), shippingName: z.string(), technicalName: z.string(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema, netWeight: z.number(), flashpoint: z.number(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly(), acceptanceNumber: z.string(), medGuide: z.string(), emergencyPhone: z.string(), emergencySchedule: z.string() }).readonly(); -export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; - -/** - * PositionCargoPackageTypeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionCargoPackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PositionCargoPackageTypeResponseDTO = z.infer; - -/** - * HsCodeLabelDtoSchema - * @type { object } - * @property { string } id - * @property { string } label - */ -export const HsCodeLabelDtoSchema = z.object({ id: z.string(), label: z.string() }).readonly(); -export type HsCodeLabelDto = z.infer; - -/** - * PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema - * @type { object } - * @property { number } temperatureFrom - * @property { number } temperatureUntil - */ -export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); -export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.infer; - -/** - * PositionCargoSourcePackageResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } positionNumber - */ -export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }).readonly(); -export type PositionCargoSourcePackageResponseDTO = z.infer; - -/** - * PositionCargoPackageResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } cargoId - * @property { string } rootFolderId - * @property { number } quantity - * @property { string } packageTypeId - * @property { PositionCargoPackageTypeResponseDTO } packageType - * @property { number } length - * @property { number } width - * @property { number } height - * @property { number } netWeight - * @property { number } grossWeight - * @property { number } chargeableWeight - * @property { string } note - * @property { string } name - * @property { number } orderNumber - * @property { number } volume - * @property { number } volumetricWeight - * @property { string } caseMarks - * @property { string } description - * @property { string[] } hsCodes - * @property { HsCodeLabelDto[] } hsCodeLabels HS code details - * @property { string } customsRemarks - * @property { number } loadMeter - * @property { string[] } specialties - * @property { PositionCargoPackageHazardousSpecialtyResponseDTO } hazardousSpecialty - * @property { PositionCargoPackageTemperatureControlledSpecialtyResponseDto } temperatureControlledSpecialty - * @property { PositionCargoSourcePackageResponseDTO } sourcePackage - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const PositionCargoPackageResponseDTOSchema = z.object({ id: z.string(), cargoId: z.string(), rootFolderId: z.string().nullish(), quantity: z.number().nullish(), packageTypeId: z.string().nullish(), packageType: CommonModels.PositionCargoPackageTypeResponseDTOSchema.nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), netWeight: z.number().nullish(), grossWeight: z.number().nullish(), chargeableWeight: z.number().nullish(), note: z.string().nullish(), name: z.string().nullish(), orderNumber: z.number().nullish(), volume: z.number().nullish(), volumetricWeight: z.number().nullish(), caseMarks: z.string().nullish(), description: z.string().nullish(), hsCodes: z.array(z.string()).readonly().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), customsRemarks: z.string().nullish(), loadMeter: z.number().nullish(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.PositionCargoPackageHazardousSpecialtyResponseDTOSchema.nullish(), temperatureControlledSpecialty: CommonModels.PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema.nullish(), sourcePackage: CommonModels.PositionCargoSourcePackageResponseDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), mrn: z.string().describe("MRN (Movement Reference Number)").nullish(), exportPortFilling: z.string().describe("Export port filling").nullish(), customsReleased: z.boolean().describe("Customs released status").nullish(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullish(), portCustomsNumber: z.string().describe("Port customs number").nullish() }).readonly(); -export type PositionCargoPackageResponseDTO = z.infer; - -/** - * PackageTotalsDtoSchema - * @type { object } - * @property { number } quantity - * @property { number } weightPerPiece - * @property { number } volume - * @property { number } chargeableWeight - * @property { number } loadMeter - */ -export const PackageTotalsDtoSchema = z.object({ quantity: z.number(), weightPerPiece: z.number(), volume: z.number(), chargeableWeight: z.number().nullish(), loadMeter: z.number().nullish() }).readonly(); -export type PackageTotalsDto = z.infer; - -/** - * PackageSpecialtyTotalsResponseDtoSchema - * @type { object } - * @property { PackageTotalsDto } noSpecialties - * @property { PackageTotalsDto } hazardous - * @property { PackageTotalsDto } nonStackable - * @property { PackageTotalsDto } temperatureControlled - * @property { PackageTotalsDto } diplomatic - * @property { PackageTotalsDto } oversized - * @property { PackageTotalsDto } total - */ -export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }).readonly(); -export type PackageSpecialtyTotalsResponseDto = z.infer; - -/** - * PositionCargoCargoTypeResponseDTOSchema - * @type { object } - * @property { string } id Cargo type ID. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } name Cargo type name. Example: `Electronics` - * @property { string } shortName Cargo type short name. Example: `ELEC` - */ -export const PositionCargoCargoTypeResponseDTOSchema = z.object({ id: z.string().describe("Cargo type ID"), name: z.string().describe("Cargo type name"), shortName: z.string().describe("Cargo type short name").nullish() }).readonly(); -export type PositionCargoCargoTypeResponseDTO = z.infer; - -/** - * PositionCargoResponseDTOSchema - * @type { object } - * @property { string } id Cargo ID. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } positionId Position ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } quoteId Quote ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } rootFolderId Folder id bound to this cargo. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { PositionCargoCargoTypeResponseDTO } cargoType Cargo type - * @property { boolean } autoCalculateTotals - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { string } rateOptions - * @property { string } rateClass - * @property { string } textForCustoms - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { number } ratePerKg - * @property { number } totalRate - * @property { number } tare - * @property { number } vgm - * @property { HsCodeLabelDto[] } hsCodeLabels HS code details - * @property { string } note - * @property { PositionCargoPackageResponseDTO[] } packages Packages for the cargo - * @property { string } createdAt Creation date. Example: `2023-04-09T12:00:00Z` - * @property { string } updatedAt Last update date. Example: `2023-04-09T12:00:00Z` - * @property { number } completeWeight - * @property { PackageSpecialtyTotalsResponseDto } packageTotals - */ -export const PositionCargoResponseDTOSchema = z.object({ id: z.string().describe("Cargo ID"), positionId: z.string().describe("Position ID this cargo belongs to").nullish(), quoteId: z.string().describe("Quote ID this cargo belongs to").nullish(), rootFolderId: z.string().describe("Folder id bound to this cargo").nullish(), cargoType: CommonModels.PositionCargoCargoTypeResponseDTOSchema.describe("Cargo type").nullish(), autoCalculateTotals: z.boolean(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean(), transportUnitNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), rateOptions: z.string().nullish(), rateClass: z.string().nullish(), textForCustoms: z.string().nullish(), totalVolume: z.number().nullish(), totalGrossWeight: z.number().nullish(), totalNetWeight: z.number().nullish(), totalVolumetricWeight: z.number().nullish(), totalChargeableWeight: z.number().nullish(), totalLoadMeter: z.number().nullish(), ratePerKg: z.number().nullish(), totalRate: z.number().nullish(), tare: z.number().nullish(), vgm: z.number().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).readonly().describe("HS code details").nullish(), note: z.string().nullish(), packages: z.array(CommonModels.PositionCargoPackageResponseDTOSchema).readonly().describe("Packages for the cargo").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Creation date"), updatedAt: z.iso.datetime({ offset: true }).describe("Last update date"), completeWeight: z.number().nullish(), packageTotals: CommonModels.PackageSpecialtyTotalsResponseDtoSchema.nullish() }).readonly(); -export type PositionCargoResponseDTO = z.infer; - -/** - * HazardousSpecialtyDTOSchema - * @type { object } - * @property { number } totalLength Total length - * @property { number } totalWidth Total width - * @property { number } temperature Temperature - * @property { string } unNumber UN number - * @property { string } IMOClass IMOClass - * @property { string } shippingName Shipping name - * @property { string } technicalName Technical name - * @property { HazardousPackingGroupEnum } packagingGroup Packaging - * @property { number } netWeight Net weight - * @property { number } flashpoint Flashpoint - * @property { string[] } properties Properties - * @property { string } acceptanceNumber Acceptance number - * @property { string } medGuide Medical guide - * @property { string } emergencyPhone Emergency phone - * @property { string } emergencySchedule Emergency schedule - */ -export const HazardousSpecialtyDTOSchema = z.object({ totalLength: z.number().describe("Total length"), totalWidth: z.number().describe("Total width"), temperature: z.number().describe("Temperature"), unNumber: z.string().describe("UN number"), IMOClass: z.string().describe("IMOClass"), shippingName: z.string().describe("Shipping name"), technicalName: z.string().describe("Technical name"), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.describe("Packaging"), netWeight: z.number().describe("Net weight"), flashpoint: z.number().describe("Flashpoint"), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).readonly().describe("Properties"), acceptanceNumber: z.string().describe("Acceptance number"), medGuide: z.string().describe("Medical guide"), emergencyPhone: z.string().describe("Emergency phone"), emergencySchedule: z.string().describe("Emergency schedule") }).readonly(); -export type HazardousSpecialtyDTO = z.infer; - -/** - * TemperatureControlledSpecialtyDtoSchema - * @type { object } - * @property { number } temperatureFrom - * @property { number } temperatureUntil - */ -export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number(), temperatureUntil: z.number() }).readonly(); -export type TemperatureControlledSpecialtyDto = z.infer; - -/** - * CreatePositionCargoPackageDTOSchema - * @type { object } - * @property { number } quantity Package quantity - * @property { string } packageTypeId Package type ID - * @property { number } length Package length - * @property { number } width Package width - * @property { number } height Package height - * @property { number } netWeight Package net weight - * @property { number } grossWeight Package gross weight - * @property { number } loadMeter Package load meter - * @property { number } chargeableWeight Package chargeable weight - * @property { number } volume Package volume - * @property { number } volumetricWeight Package volumetric weight - * @property { string } caseMarks Package case marks - * @property { string } note Package note - * @property { string } description Package description - * @property { string[] } hsCodes Package HS codes - * @property { string } customsRemarks Text for customs - * @property { string[] } specialties - * @property { HazardousSpecialtyDTO } hazardousSpecialty - * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const CreatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity"), packageTypeId: z.string().describe("Package type ID"), length: z.number().describe("Package length"), width: z.number().describe("Package width"), height: z.number().describe("Package height"), netWeight: z.number().describe("Package net weight"), grossWeight: z.number().describe("Package gross weight"), loadMeter: z.number().describe("Package load meter"), chargeableWeight: z.number().describe("Package chargeable weight"), volume: z.number().describe("Package volume"), volumetricWeight: z.number().describe("Package volumetric weight"), caseMarks: z.string().describe("Package case marks"), note: z.string().describe("Package note"), description: z.string().describe("Package description"), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs"), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly(), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema, temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)"), exportPortFilling: z.string().describe("Export port filling"), customsReleased: z.boolean().describe("Customs released status"), importCustomsReleaseNumber: z.string().describe("Import customs release number"), portCustomsNumber: z.string().describe("Port customs number") }).readonly(); -export type CreatePositionCargoPackageDTO = z.infer; - -/** - * UpdatePositionCargoPackageDTOSchema - * @type { object } - * @property { number } quantity Package quantity - * @property { string } packageTypeId Package type ID - * @property { number } length Package length - * @property { number } width Package width - * @property { number } height Package height - * @property { number } netWeight Package net weight - * @property { number } grossWeight Package gross weight - * @property { number } chargeableWeight Package chargeable weight - * @property { string } note Package case marks - * @property { number } volume Package volume - * @property { number } volumetricWeight Package volumetric weight - * @property { number } orderNumber Package order number - * @property { string } caseMarks Package case marks - * @property { string } description Package description - * @property { string[] } hsCodes Package HS codes - * @property { string } customsRemarks Text for customs - * @property { number } loadMeter Load meter - * @property { string[] } specialties Package specialties - * @property { HazardousSpecialtyDTO } hazardousSpecialty Hazardous specialty details - * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const UpdatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().describe("Package quantity").nullable(), packageTypeId: z.string().describe("Package type ID").nullable(), length: z.number().describe("Package length").nullable(), width: z.number().describe("Package width").nullable(), height: z.number().describe("Package height").nullable(), netWeight: z.number().describe("Package net weight").nullable(), grossWeight: z.number().describe("Package gross weight").nullable(), chargeableWeight: z.number().describe("Package chargeable weight").nullable(), note: z.string().describe("Package case marks").nullable(), volume: z.number().describe("Package volume").nullable(), volumetricWeight: z.number().describe("Package volumetric weight").nullable(), orderNumber: z.number().describe("Package order number"), caseMarks: z.string().describe("Package case marks").nullable(), description: z.string().describe("Package description").nullable(), hsCodes: z.array(z.string()).readonly().describe("Package HS codes"), customsRemarks: z.string().describe("Text for customs").nullable(), loadMeter: z.number().describe("Load meter").nullable(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).readonly().describe("Package specialties"), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema.describe("Hazardous specialty details"), temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema, mrn: z.string().describe("MRN (Movement Reference Number)").nullable(), exportPortFilling: z.string().describe("Export port filling").nullable(), customsReleased: z.boolean().describe("Customs released status").nullable(), importCustomsReleaseNumber: z.string().describe("Import customs release number").nullable(), portCustomsNumber: z.string().describe("Port customs number").nullable() }).readonly(); -export type UpdatePositionCargoPackageDTO = z.infer; - -/** - * QuantityOfOriginalBlDocumentsEnumSchema - * @type { enum } - */ -export const QuantityOfOriginalBlDocumentsEnumSchema = z.enum(["ZERO", "ONE", "TWO", "THREE"]); -export type QuantityOfOriginalBlDocumentsEnum = z.infer; -export const QuantityOfOriginalBlDocumentsEnum = QuantityOfOriginalBlDocumentsEnumSchema.enum; - -/** - * MovementTypeEnumSchema - * @type { enum } - */ -export const MovementTypeEnumSchema = z.enum(["DoorToDoor", "PortToPort", "PortToDoor", "DoorToPort"]); -export type MovementTypeEnum = z.infer; -export const MovementTypeEnum = MovementTypeEnumSchema.enum; - -/** - * ChargePaymentEnumSchema - * @type { enum } - */ -export const ChargePaymentEnumSchema = z.enum(["Prepaid", "Collect", "PayableElsewhere"]); -export type ChargePaymentEnum = z.infer; -export const ChargePaymentEnum = ChargePaymentEnumSchema.enum; - -/** - * DocumentConfigDTOSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - */ -export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().describe("Footer image URL"), headerImageUrl: z.string().describe("Header image URL") }).readonly(); -export type DocumentConfigDTO = z.infer; - -/** - * EmployeeRoleContextSchema - * @type { enum } - */ -export const EmployeeRoleContextSchema = z.enum(["global", "office"]); -export type EmployeeRoleContext = z.infer; -export const EmployeeRoleContext = EmployeeRoleContextSchema.enum; - -/** - * EmployeeRoleResponseSchema - * @type { object } - * @property { string } id Unique identifier of the role - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string } context Role context - * @property { string[] } permissions Permissions associated with the role - */ -export const EmployeeRoleResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); -export type EmployeeRoleResponse = z.infer; - -/** - * EmploymentEmployeeResponseSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { boolean } archived Archived - * @property { EmployeeRoleResponse[] } roles Global Roles - */ -export const EmploymentEmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish() }).readonly(); -export type EmploymentEmployeeResponse = z.infer; - -/** - * EmployeeOfficeResponseSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const EmployeeOfficeResponseSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type EmployeeOfficeResponse = z.infer; - -/** - * EmploymentResponseSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { EmployeeOfficeResponse } office - * @property { string } employeeId - * @property { EmploymentEmployeeResponse } employee - * @property { boolean } archived - * @property { string } costCenter - * @property { EmployeeRoleResponse[] } roles Employment Roles - */ -export const EmploymentResponseSchema = z.object({ id: z.string(), officeId: z.string(), office: CommonModels.EmployeeOfficeResponseSchema.nullish(), employeeId: z.string(), employee: CommonModels.EmploymentEmployeeResponseSchema.nullish(), archived: z.boolean(), costCenter: z.string().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Employment Roles").nullish() }).readonly(); -export type EmploymentResponse = z.infer; - -/** - * LoadTypeEnumSchema - * @type { enum } - */ -export const LoadTypeEnumSchema = z.enum(["LCL", "FCL", "Trailer", "Container", "BreakBulk", "Roro", "MAFI", "LTL_ROAD", "FTL_ROAD", "Standard"]); -export type LoadTypeEnum = z.infer; -export const LoadTypeEnum = LoadTypeEnumSchema.enum; - -/** - * ServiceTypeEnumSchema - * @type { enum } - */ -export const ServiceTypeEnumSchema = z.enum(["InlandTransport", "DoorToPortOfDischarge", "PortOfLoadingToDoor", "DoorToDoor", "PortToPort", "DoorToAirport", "AirportToAirport", "AirportToDoor", "PortOfDischargeRampToDoor"]); -export type ServiceTypeEnum = z.infer; -export const ServiceTypeEnum = ServiceTypeEnumSchema.enum; - -/** - * DateRangeDtoSchema - * @type { object } - * @property { string } start - * @property { string } end - */ -export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }), end: z.iso.datetime({ offset: true }) }).readonly(); -export type DateRangeDto = z.infer; - -/** - * BusinessPartnerLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { BusinessPartnerType[] } types Array of business partner types - */ -export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema).readonly().describe("Array of business partner types") }).readonly(); -export type BusinessPartnerLabelResponseDTO = z.infer; - -/** - * SectionEnumSchema - * @type { enum } - */ -export const SectionEnumSchema = z.enum(["Logistics"]); -export type SectionEnum = z.infer; -export const SectionEnum = SectionEnumSchema.enum; - -/** - * FrequencyEnumSchema - * @type { enum } - */ -export const FrequencyEnumSchema = z.enum(["Daily", "Weekly", "Monthly"]); -export type FrequencyEnum = z.infer; -export const FrequencyEnum = FrequencyEnumSchema.enum; - -/** - * InvoiceDirectionEnumSchema - * @type { enum } - */ -export const InvoiceDirectionEnumSchema = z.enum(["Incoming", "Outgoing"]); -export type InvoiceDirectionEnum = z.infer; -export const InvoiceDirectionEnum = InvoiceDirectionEnumSchema.enum; - -/** - * InvoiceTypeEnumSchema - * @type { enum } - */ -export const InvoiceTypeEnumSchema = z.enum(["CreditNote", "Invoice", "CollectiveInvoice", "ProForma", "PartialCreditNote", "DirectInvoice"]); -export type InvoiceTypeEnum = z.infer; -export const InvoiceTypeEnum = InvoiceTypeEnumSchema.enum; - -/** - * BooleanFilterEnumSchema - * @type { enum } - */ -export const BooleanFilterEnumSchema = z.enum(["Yes", "No"]); -export type BooleanFilterEnum = z.infer; -export const BooleanFilterEnum = BooleanFilterEnumSchema.enum; - -/** - * InvoiceStatusEnumSchema - * @type { enum } - */ -export const InvoiceStatusEnumSchema = z.enum(["Credited", "Draft", "Overpaid", "PartiallyPaid", "Outstanding", "Paid", "CreditNote", "ProForma"]); -export type InvoiceStatusEnum = z.infer; -export const InvoiceStatusEnum = InvoiceStatusEnumSchema.enum; - -/** - * OfficeInvoiceFilterDtoSchema - * @type { object } - * @property { string } search - * @property { DateRangeDto } issuingDate - * @property { DateRangeDto } serviceDate - * @property { InvoiceDirectionEnum[] } invoiceDirection - * @property { InvoiceTypeEnum[] } invoiceType - * @property { BooleanFilterEnum[] } collective - * @property { number } amountMin - * @property { number } amountMax - * @property { string[] } currencyNotation - * @property { string[] } vatRule - * @property { DateRangeDto } dueDate - * @property { InvoiceStatusEnum[] } status - * @property { string[] } receiver Filter by invoice receiver/customer IDs (UUID) - * @property { string[] } receiverCountry Filter by invoice receiver/customer country IDs - * @property { string[] } salesRep Filter by sales rep id - * @property { string } positionNumbersString - * @property { string[] } positionNumbers - * @property { string } invoiceNumbersString - * @property { string[] } invoiceNumbers - * @property { BooleanFilterEnum[] } bookkeepingExportStatus - * @property { BooleanFilterEnum[] } dunningBlock - * @property { BooleanFilterEnum[] } invoiceInReview - * @property { BooleanFilterEnum[] } isInvoiceOk - * @property { BooleanFilterEnum[] } isVatOk - * @property { number } invoiceNumberMin - * @property { number } invoiceNumberMax - * @property { number } internalNumberMin - * @property { number } internalNumberMax - * @property { string } externalSystemId Filter invoices by position external system ID (substring match) - * @property { string } hblNumber Filter invoices by HBL/HAWB (substring match) - * @property { string } mblNumber Filter invoices by MBL/MAWB (substring match) - * @property { string } bookingNumber Filter invoices by booking number (substring match) - * @property { string } vessel Filter invoices by vessel name (substring match) - * @property { string } voyage Filter invoices by voyage number (substring match) - * @property { string } creditorId Filter invoices by creditor ID (substring match) - * @property { string } debtorId Filter invoices by debtor ID (substring match) - */ -export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), vatRule: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer IDs (UUID)"), receiverCountry: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer country IDs"), salesRep: z.array(z.string()).readonly().describe("Filter by sales rep id"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number(), externalSystemId: z.string().describe("Filter invoices by position external system ID (substring match)"), hblNumber: z.string().describe("Filter invoices by HBL/HAWB (substring match)"), mblNumber: z.string().describe("Filter invoices by MBL/MAWB (substring match)"), bookingNumber: z.string().describe("Filter invoices by booking number (substring match)"), vessel: z.string().describe("Filter invoices by vessel name (substring match)"), voyage: z.string().describe("Filter invoices by voyage number (substring match)"), creditorId: z.string().describe("Filter invoices by creditor ID (substring match)"), debtorId: z.string().describe("Filter invoices by debtor ID (substring match)") }).readonly(); -export type OfficeInvoiceFilterDto = z.infer; - -/** - * PositionStatusEnumSchema - * @type { enum } - */ -export const PositionStatusEnumSchema = z.enum(["Preparing", "NeedsDocumentation", "Executing", "Done"]); -export type PositionStatusEnum = z.infer; -export const PositionStatusEnum = PositionStatusEnumSchema.enum; - -/** - * PositionCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PositionCustomerDto = z.infer; - -/** - * PositionQuoteDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); -export type PositionQuoteDto = z.infer; - -/** - * ParentPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); -export type ParentPositionDto = z.infer; - -/** - * PositionTypeEnumSchema - * @type { enum } - */ -export const PositionTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); -export type PositionTypeEnum = z.infer; -export const PositionTypeEnum = PositionTypeEnumSchema.enum; - -/** - * PositionProjectLiteDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PositionProjectLiteDto = z.infer; - -/** - * EmployeeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const EmployeeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type EmployeeDto = z.infer; - -/** - * PositionCoreResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } rootFolderId - * @property { string } externalSystemId - * @property { MovementTypeEnum } inttraTypeOfMove - * @property { PositionCustomerDto } customer - * @property { boolean } isCancelled - * @property { string } owningOfficeId - * @property { string } originOfficeId - * @property { PositionQuoteDto } quote - * @property { string } number - * @property { SectionEnum } section - * @property { DirectionEnum } direction - * @property { TransportModeEnum } transportMode - * @property { string } statusDate - * @property { string } serviceDate - * @property { string } dateOfDeparture - * @property { string } dateOfArrival - * @property { PositionStatusEnum } status - * @property { LoadTypeEnum } loadType - * @property { IncotermsEnum } incoterms - * @property { IncotermsEnum } secondIncoterms - * @property { ServiceTypeEnum } serviceType - * @property { ParentPositionDto } parentPosition - * @property { string } buyRateReference - * @property { FrequencyEnum } frequency - * @property { PositionTypeEnum } positionType - * @property { boolean } isParentPosition - * @property { boolean } hasParentPosition - * @property { boolean } hasChildPositions - * @property { PositionProjectLiteDto } projectLite - * @property { boolean } isExcludedFromStatistics - * @property { EmployeeDto } salesRep - * @property { string } fillingCompany - * @property { string } sellingContract - * @property { string } fillingScacCode - * @property { string } serviceValidity - * @property { string } ratesValidity - * @property { EmployeeDto } responsibleEmployee - * @property { EmployeeDto } receivedByEmployee - * @property { string } team - * @property { string } createdAt - * @property { string } updatedAt - * @property { EditorContentResponseDto } notes Notes - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); -export type PositionCoreResponseDto = z.infer; - -/** - * VesselDtoSchema - * @type { object } - * @property { string } name - * @property { number } imo - * @property { number } mmsi - */ -export const VesselDtoSchema = z.object({ name: z.string(), imo: z.number().nullish(), mmsi: z.number().nullish() }).readonly(); -export type VesselDto = z.infer; - -/** - * StatusResponseDtoSchema - * @type { object } - * @property { string } status Status - * @property { string } message Message - * @property { string } code Alphanumeric code of the message type - */ -export const StatusResponseDtoSchema = z.object({ status: z.string().describe("Status"), message: z.string().describe("Message"), code: z.string().describe("Alphanumeric code of the message type") }).readonly(); -export type StatusResponseDto = z.infer; - -/** - * PaginationDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const PaginationDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); -export type PaginationDto = z.infer; - -/** - * LabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - */ -export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }).readonly(); -export type LabelResponseDTO = z.infer; - -/** - * GenerateWorkingDocumentRequestDtoSchema - * @type { object } - * @property { string } issuedAt - * @property { string } fileName - */ -export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); -export type GenerateWorkingDocumentRequestDto = z.infer; - -/** - * UpdateInvolvedPartyDtoSchema - * @type { object } - * @property { string } reference - * @property { string } businessPartnerId - * @property { string } contactId - */ -export const UpdateInvolvedPartyDtoSchema = z.object({ reference: z.string(), businessPartnerId: z.string(), contactId: z.string() }).readonly(); -export type UpdateInvolvedPartyDto = z.infer; - -/** - * MergeRoutesRequestDtoSchema - * @type { object } - * @property { string } sourceCargoId Source cargo ID to merge from (sea positions only) - */ -export const MergeRoutesRequestDtoSchema = z.object({ sourceCargoId: z.string().describe("Source cargo ID to merge from (sea positions only)").nullable() }).readonly(); -export type MergeRoutesRequestDto = z.infer; - -/** - * CopyRouteRequestDtoSchema - * @type { object } - * @property { string } targetCargoId Target cargo ID to copy to (sea positions only) - */ -export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to copy to (sea positions only)").nullable() }).readonly(); -export type CopyRouteRequestDto = z.infer; - -/** - * CargoSummaryResponseDTOSchema - * @type { object } - * @property { string } transportUnitTypeName Transport unit type name (e.g., "40' DRY", "20'") - * @property { number } quantity Total quantity of this transport unit type - */ -export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string().describe("Transport unit type name (e.g., "40' DRY", "20'")"), quantity: z.number().describe("Total quantity of this transport unit type") }).readonly(); -export type CargoSummaryResponseDTO = z.infer; - -/** - * CreatePositionCargoDTOSchema - * @type { object } - * @property { string } cargoTypeId Cargo type ID - * @property { string } note - * @property { boolean } autoCalculateTotals - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { string } rateOptions - * @property { string } rateClass - * @property { number } ratePerKg - * @property { number } totalRate - * @property { string } textForCustoms - * @property { number } tare - * @property { number } vgm - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - */ -export const CreatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); -export type CreatePositionCargoDTO = z.infer; - -/** - * UpdatePositionCargoDTOSchema - * @type { object } - * @property { string } cargoTypeId Cargo type ID - * @property { string } note - * @property { boolean } autoCalculateTotals - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { string } rateOptions - * @property { string } rateClass - * @property { number } ratePerKg - * @property { number } totalRate - * @property { string } textForCustoms - * @property { number } tare - * @property { number } vgm - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - */ -export const UpdatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().describe("Cargo type ID"), note: z.string(), autoCalculateTotals: z.boolean(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean() }).readonly(); -export type UpdatePositionCargoDTO = z.infer; - -/** - * MovePositionCargoPackageRequestDTOSchema - * @type { object } - * @property { string } targetCargoId Target cargo ID to move the package to - */ -export const MovePositionCargoPackageRequestDTOSchema = z.object({ targetCargoId: z.string().describe("Target cargo ID to move the package to") }).readonly(); -export type MovePositionCargoPackageRequestDTO = z.infer; - -/** - * PositionCargoPaginationOrderFieldSchema - * @type { enum } - */ -export const PositionCargoPaginationOrderFieldSchema = z.enum(["createdAt", "updatedAt"]); -export type PositionCargoPaginationOrderField = z.infer; -export const PositionCargoPaginationOrderField = PositionCargoPaginationOrderFieldSchema.enum; - -/** - * PositionAvailablePartnersUseCaseSchema - * @type { enum } - */ -export const PositionAvailablePartnersUseCaseSchema = z.enum(["financeCustomer", "financeVendor"]); -export type PositionAvailablePartnersUseCase = z.infer; -export const PositionAvailablePartnersUseCase = PositionAvailablePartnersUseCaseSchema.enum; - -} diff --git a/test/generated/full/containerYards/containerYards.acl.ts b/test/generated/full/containerYards/containerYards.acl.ts deleted file mode 100644 index f4e07a4..0000000 --- a/test/generated/full/containerYards/containerYards.acl.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace ContainerYardsAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "ContainerYard" -] as AbilityTuple<"Create", "ContainerYard">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -/** - * Use for `useGetLabelById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetLabelById` query - */ -export const canUseGetLabelById = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Update", - "ContainerYard" -] as AbilityTuple<"Update", "ContainerYard">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Update", - "ContainerYard" -] as AbilityTuple<"Update", "ContainerYard">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "ContainerYard" -] as AbilityTuple<"Update", "ContainerYard">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -} diff --git a/test/generated/full/containerYards/containerYards.api.ts b/test/generated/full/containerYards/containerYards.api.ts deleted file mode 100644 index 57fbfcf..0000000 --- a/test/generated/full/containerYards/containerYards.api.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ContainerYardsModels } from "./containerYards.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ContainerYardsApi { -export const paginate = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, - `/container-yards`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards`, - ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), - config - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, - `/container-yards/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getLabelById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.LabelResponseDTOSchema }, - `/container-yards/${id}/labels`, - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}/unarchive`, - undefined, - config - ) -}; -export const update = (id: string, data: ContainerYardsModels.UpdateContainerYardRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}`, - ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), - config - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}`, - config - ) -}; -} diff --git a/test/generated/full/containerYards/containerYards.configs.ts b/test/generated/full/containerYards/containerYards.configs.ts deleted file mode 100644 index 4458f76..0000000 --- a/test/generated/full/containerYards/containerYards.configs.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ContainerYardsModels } from "./containerYards.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ContainerYardsQueries } from "./containerYards.queries"; -import { ContainerYardsAcl } from "./containerYards.acl"; - -export namespace ContainerYardsConfigs { -export const containerYardsConfig = { - meta: { - title: "Container Yards", - }, - readAll: { - acl: ContainerYardsAcl.canUsePaginate, - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - paginated: ContainerYardsQueries.usePaginate, - infinite: ContainerYardsQueries.usePaginateInfinite, - filters: { - schema: ContainerYardsModels.ContainerYardFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ContainerYardsModels.ContainerYardFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - shortName: true, - name: true, - archived: true, - street: true, - secondaryStreet: true, - zip: true, - city: true, - country: true, - district: true, - additionalInformation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ContainerYardsAcl.canUseFindById, - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - query: ContainerYardsQueries.useFindById, - }, - create: { - acl: ContainerYardsAcl.canUseCreate, - schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, - mutation: ContainerYardsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, - options: { - inputs: { - matchCode: true, - name: true, - shortName: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - additionalInformation: true, - }, - }, -}) - }, - update: { - acl: ContainerYardsAcl.canUseUpdate, - schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, - mutation: ContainerYardsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, - options: { - inputs: { - matchCode: true, - name: true, - shortName: true, - addressId: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - additionalInformation: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ContainerYardsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ContainerYardsQueries.usePaginateLabels, - infinite: ContainerYardsQueries.usePaginateLabelsInfinite, - filters: { - schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/containerYards/containerYards.models.ts b/test/generated/full/containerYards/containerYards.models.ts deleted file mode 100644 index bed80b9..0000000 --- a/test/generated/full/containerYards/containerYards.models.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ContainerYardsModels { -/** - * ContainerYardEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type ContainerYardEmployeeDTO = z.infer; - -/** - * ContainerYardResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchCode Container yard match code - * @property { string } shortName Container yard short name - * @property { string } name Container yard name - * @property { boolean } archived Whether the container yard is archived - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { object } city - * @property { string } city.id - * @property { string } city.name - * @property { object } country - * @property { string } country.id - * @property { string } country.name - * @property { string } country.isoCode2 - * @property { string } country.isoCode3 - * @property { string } district District - * @property { string } additionalInformation Additional information - * @property { string } createdById - * @property { ContainerYardEmployeeDTO } createdBy - * @property { string } createdAt Date when the container yard was created - * @property { string } updatedById - * @property { ContainerYardEmployeeDTO } updatedBy - * @property { string } updatedAt Date when the container yard was last updated - */ -export const ContainerYardResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string().describe("Container yard match code"), shortName: z.string().describe("Container yard short name").nullish(), name: z.string().describe("Container yard name"), archived: z.boolean().describe("Whether the container yard is archived"), street: z.string().describe("Street address").nullish(), secondaryStreet: z.string().describe("Secondary street address").nullish(), zip: z.string().describe("ZIP/Postal code").nullish(), city: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), country: z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly().nullish(), district: z.string().describe("District").nullish(), additionalInformation: z.string().describe("Additional information").nullish(), createdById: z.string().nullish(), createdBy: ContainerYardEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was created"), updatedById: z.string().nullish(), updatedBy: ContainerYardEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Date when the container yard was last updated") }).readonly(); -export type ContainerYardResponseDTO = z.infer; - -/** - * ContainerYardFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ContainerYardFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); -export type ContainerYardFilterDto = z.infer; - -/** - * ContainerYardLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const ContainerYardLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type ContainerYardLabelFilterDto = z.infer; - -/** - * CreateContainerYardRequestDTOSchema - * @type { object } - * @property { string } matchCode Match code - * @property { string } name Name - * @property { string } shortName Short name - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } cityId City ID - * @property { string } countryId Country ID - * @property { string } district District - * @property { string } additionalInformation Additional information - */ -export const CreateContainerYardRequestDTOSchema = z.object({ matchCode: z.string().describe("Match code"), name: z.string().describe("Name"), shortName: z.string().describe("Short name").nullish(), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street address").nullish(), zip: z.string().describe("ZIP/Postal code"), cityId: z.string().describe("City ID"), countryId: z.string().describe("Country ID"), district: z.string().describe("District").nullish(), additionalInformation: z.string().describe("Additional information").nullish() }).readonly(); -export type CreateContainerYardRequestDTO = z.infer; - -/** - * UpdateContainerYardRequestDTOSchema - * @type { object } - * @property { string } matchCode Match code - * @property { string } name Name - * @property { string } shortName Short name - * @property { string } addressId Address ID - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } cityId City ID - * @property { string } countryId Country ID - * @property { string } district District - * @property { string } additionalInformation Additional information - */ -export const UpdateContainerYardRequestDTOSchema = z.object({ matchCode: z.string().describe("Match code"), name: z.string().describe("Name"), shortName: z.string().describe("Short name"), addressId: z.string().describe("Address ID"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street address"), zip: z.string().describe("ZIP/Postal code"), cityId: z.string().describe("City ID"), countryId: z.string().describe("Country ID"), district: z.string().describe("District"), additionalInformation: z.string().describe("Additional information") }).readonly(); -export type UpdateContainerYardRequestDTO = z.infer; - -/** - * ContainerYardsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ContainerYardsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ContainerYardsPaginateOrderParamEnum = z.infer; -export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderParamEnumSchema.enum; - -/** - * ContainerYardsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ContainerYardResponseDTO[] } items - */ -export const ContainerYardsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerYardResponseDTOSchema).readonly() }).readonly().shape }); -export type ContainerYardsPaginateResponse = z.infer; - -/** - * ContainerYardsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ContainerYardsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ContainerYardsPaginateLabelsOrderParamEnum = z.infer; -export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * ContainerYardsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ContainerYardsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type ContainerYardsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/containerYards/containerYards.queries.ts b/test/generated/full/containerYards/containerYards.queries.ts deleted file mode 100644 index c737b06..0000000 --- a/test/generated/full/containerYards/containerYards.queries.ts +++ /dev/null @@ -1,287 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ContainerYardsAcl } from "./containerYards.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ContainerYardsModels } from "./containerYards.models"; -import { ContainerYardsApi } from "./containerYards.api"; - -export namespace ContainerYardsQueries { -export const moduleName = QueryModule.ContainerYards; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string) => [...keys.all, "/container-yards", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getLabelById: (id: string) => [...keys.all, "/container-yards/:id/labels", id] as const, - findById: (id: string) => [...keys.all, "/container-yards/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Container Yards - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Container Yards - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create container yard - * @permission Requires `canUseCreate` ability - * @param { ContainerYardsModels.CreateContainerYardRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(ContainerYardsAcl.canUseCreate()); - return ContainerYardsApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate container yard labels (id and name) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate container yard labels (id and name) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetLabelById` - * @summary Get container yard by ID with label format (id and formatted name) - * @permission Requires `canUseGetLabelById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetLabelById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getLabelById(id), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUseGetLabelById()); - return ContainerYardsApi.getLabelById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive container yard - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ContainerYardsAcl.canUseArchive()); - return ContainerYardsApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive container yard - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ContainerYardsAcl.canUseUnarchive()); - return ContainerYardsApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update container yard - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { ContainerYardsModels.UpdateContainerYardRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(ContainerYardsAcl.canUseUpdate()); - return ContainerYardsApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get container yard - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUseFindById()); - return ContainerYardsApi.findById(id, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/controlTowerAuth/controlTowerAuth.api.ts b/test/generated/full/controlTowerAuth/controlTowerAuth.api.ts deleted file mode 100644 index b52d90f..0000000 --- a/test/generated/full/controlTowerAuth/controlTowerAuth.api.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerAuthModels } from "./controlTowerAuth.models"; - -export namespace ControlTowerAuthApi { -export const login = (data: ControlTowerAuthModels.LoginRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, - `/auth/move/login`, - ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), - config - ) -}; -export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, - `/auth/reset-password`, - ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/controlTowerAuth/controlTowerAuth.models.ts b/test/generated/full/controlTowerAuth/controlTowerAuth.models.ts deleted file mode 100644 index 287265f..0000000 --- a/test/generated/full/controlTowerAuth/controlTowerAuth.models.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerAuthModels { -/** - * LoginRequestDtoSchema - * @type { object } - * @property { string } username - * @property { string } password - */ -export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }).readonly(); -export type LoginRequestDto = z.infer; - -/** - * LoginResponseDtoSchema - * @type { object } - * @property { string } accessToken - * @property { boolean } resetPasswordRequired - * @property { string } passwordResetToken - * @property { string } username - */ -export const LoginResponseDtoSchema = z.object({ accessToken: z.string().nullable(), resetPasswordRequired: z.boolean().nullish(), passwordResetToken: z.string().nullish(), username: z.string().nullish() }).readonly(); -export type LoginResponseDto = z.infer; - -/** - * PasswordResetDtoSchema - * @type { object } - * @property { string } password - * @property { string } username - * @property { string } token - */ -export const PasswordResetDtoSchema = z.object({ password: z.string(), username: z.string(), token: z.string() }).readonly(); -export type PasswordResetDto = z.infer; - -} diff --git a/test/generated/full/controlTowerAuth/controlTowerAuth.queries.ts b/test/generated/full/controlTowerAuth/controlTowerAuth.queries.ts deleted file mode 100644 index 37e2167..0000000 --- a/test/generated/full/controlTowerAuth/controlTowerAuth.queries.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerAuthModels } from "./controlTowerAuth.models"; -import { ControlTowerAuthApi } from "./controlTowerAuth.api"; - -export namespace ControlTowerAuthQueries { -export const moduleName = QueryModule.ControlTowerAuth; - - - -/** - * Mutation `useLogin` - * @description Returns an access token to authenticate for protected endpoints - * @param { ControlTowerAuthModels.LoginRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 400, 401] - */ -export const useLogin = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerAuthApi.login(data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useResetPassword` - * @description Resets the password for the requesting user - * @param { ControlTowerAuthModels.PasswordResetDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 400, 401] - */ -export const useResetPassword = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerAuthApi.resetPassword(data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/controlTowerBookings/controlTowerBookings.api.ts b/test/generated/full/controlTowerBookings/controlTowerBookings.api.ts deleted file mode 100644 index 2ba8093..0000000 --- a/test/generated/full/controlTowerBookings/controlTowerBookings.api.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; - -export namespace ControlTowerBookingsApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, - `/bookings`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, - `/bookings/${id}`, - config - ) -}; -export const findPackageById = (packageId: string, bookingId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, - `/bookings/${bookingId}/packages/${packageId}`, - config - ) -}; -} diff --git a/test/generated/full/controlTowerBookings/controlTowerBookings.configs.ts b/test/generated/full/controlTowerBookings/controlTowerBookings.configs.ts deleted file mode 100644 index ce75a71..0000000 --- a/test/generated/full/controlTowerBookings/controlTowerBookings.configs.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; -import { ControlTowerBookingsQueries } from "./controlTowerBookings.queries"; - -export namespace ControlTowerBookingsConfigs { -export const bookingsConfig = { - meta: { - title: "Bookings", - }, - readAll: { - schema: ControlTowerBookingsModels.BookingListItemDtoSchema, - paginated: ControlTowerBookingsQueries.useFindAll, - infinite: ControlTowerBookingsQueries.useFindAllInfinite, - filters: { - schema: ControlTowerBookingsModels.BookingFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerBookingsModels.BookingFilterDtoSchema, - options: { - inputs: { - projectId: true, - search: true, - companyIds: true, - purchaseOrderId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ControlTowerBookingsModels.BookingListItemDtoSchema, - options: { - columns: { - id: true, - bookingNumber: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema, - }, -}), - }, - read: { - schema: ControlTowerBookingsModels.BookingResponseDtoSchema, - query: ControlTowerBookingsQueries.useFindById, - }, -}; - -} diff --git a/test/generated/full/controlTowerBookings/controlTowerBookings.models.ts b/test/generated/full/controlTowerBookings/controlTowerBookings.models.ts deleted file mode 100644 index 1671d53..0000000 --- a/test/generated/full/controlTowerBookings/controlTowerBookings.models.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerBookingsModels { -/** - * BookingListItemDtoSchema - * @type { object } - * @property { string } id - * @property { string } bookingNumber - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const BookingListItemDtoSchema = z.object({ id: z.string(), bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); -export type BookingListItemDto = z.infer; - -/** - * BookingContainerDtoSchema - * @type { object } - * @property { string } id - * @property { string } containerNumber - * @property { string } type - * @property { string } loadType - * @property { string } stuffedInContainer - * @property { string[] } hsCode - * @property { number } noS - * @property { number } weight - * @property { string } lastEventLocation - * @property { string } lastEventName - * @property { string } lastEventDate - * @property { string } seals - */ -export const BookingContainerDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), loadType: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), hsCode: z.array(z.string()).readonly().nullable(), noS: z.number().nullable(), weight: z.number().nullable(), lastEventLocation: z.string().nullable(), lastEventName: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), seals: z.string().nullable() }).readonly(); -export type BookingContainerDto = z.infer; - -/** - * BookingPackageDtoSchema - * @type { object } - * @property { string } id - * @property { string } packageNumber - * @property { string } containerNumber - * @property { string } type - * @property { string } description - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - */ -export const BookingPackageDtoSchema = z.object({ id: z.string(), packageNumber: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), description: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable() }).readonly(); -export type BookingPackageDto = z.infer; - -/** - * BookingResponseDtoSchema - * @type { object } - * @property { string } bookingNumber - * @property { string } ets - * @property { string } etaPod - * @property { string } etaFinalDeliveryPlace - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } destination - * @property { string } lastEvent - * @property { string[] } files - * @property { string } poNumber - * @property { string } blNumber - * @property { BookingContainerDto[] } containers - * @property { BookingPackageDto[] } packages - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - * @property { string } id - */ -export const BookingResponseDtoSchema = z.object({ bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), etaPod: z.iso.datetime({ offset: true }).nullable(), etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), destination: z.string().nullable(), lastEvent: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), poNumber: z.string().nullable(), blNumber: z.string().nullable(), containers: z.array(BookingContainerDtoSchema).readonly().nullish(), packages: z.array(BookingPackageDtoSchema).readonly().nullish(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable(), id: z.string() }).readonly(); -export type BookingResponseDto = z.infer; - -/** - * PackageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } poNumber - * @property { string } bookingNumber - * @property { string } blNumber - * @property { string } containerNumber - * @property { string } packageNumber - * @property { string } description - * @property { number } netWeight - * @property { number } grossWeight - * @property { number } length - * @property { number } width - * @property { number } height - * @property { number } volume - * @property { string } storageInstruction - * @property { string } destination - * @property { string[] } files - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const PackageResponseDtoSchema = z.object({ id: z.string(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), containerNumber: z.string().nullable(), packageNumber: z.string().nullable(), description: z.string().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), volume: z.number().nullable(), storageInstruction: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); -export type PackageResponseDto = z.infer; - -/** - * BookingFilterDtoSchema - * @type { object } - * @property { string } projectId - * @property { string } search Min Length: `1` - * @property { string[] } companyIds - * @property { string } purchaseOrderId - */ -export const BookingFilterDtoSchema = z.object({ projectId: z.string(), search: z.string().min(1), companyIds: z.array(z.string()).readonly(), purchaseOrderId: z.string() }).readonly(); -export type BookingFilterDto = z.infer; - -/** - * ControlTowerBookingsFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ControlTowerBookingsFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); -export type ControlTowerBookingsFindAllOrderParamEnum = z.infer; -export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFindAllOrderParamEnumSchema.enum; - -/** - * ControlTowerBookingsFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookingListItemDto[] } items - */ -export const ControlTowerBookingsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookingListItemDtoSchema).readonly() }).readonly().shape }); -export type ControlTowerBookingsFindAllResponse = z.infer; - -} diff --git a/test/generated/full/controlTowerBookings/controlTowerBookings.queries.ts b/test/generated/full/controlTowerBookings/controlTowerBookings.queries.ts deleted file mode 100644 index 7ab4d73..0000000 --- a/test/generated/full/controlTowerBookings/controlTowerBookings.queries.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; -import { ControlTowerBookingsApi } from "./controlTowerBookings.api"; - -export namespace ControlTowerBookingsQueries { -export const moduleName = QueryModule.ControlTowerBookings; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string) => [...keys.all, "/bookings", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string) => [...keys.all, "/bookings", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/bookings/:id", id] as const, - findPackageById: (packageId: string, bookingId: string) => [...keys.all, "/bookings/:bookingId/packages/:packageId", packageId, bookingId] as const, -}; - -/** - * Query `useFindAll` - * @summary Get all accessible bookings for the customer - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => - ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor, config), - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @summary Get all accessible bookings for the customer - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @description Returns a booking with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => - ControlTowerBookingsApi.findById(id, config), - ...options, - }); -}; - -/** - * Query `useFindPackageById` - * @description Returns a package with the specified id - * @param { string } object.packageId Path parameter - * @param { string } object.bookingId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindPackageById = ({ packageId, bookingId }: { packageId: string, bookingId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.findPackageById(packageId, bookingId), - queryFn: () => - ControlTowerBookingsApi.findPackageById(packageId, bookingId, config), - ...options, - }); -}; - -} diff --git a/test/generated/full/controlTowerCalendar/controlTowerCalendar.api.ts b/test/generated/full/controlTowerCalendar/controlTowerCalendar.api.ts deleted file mode 100644 index 198615d..0000000 --- a/test/generated/full/controlTowerCalendar/controlTowerCalendar.api.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; - -export namespace ControlTowerCalendarApi { -export const getCalendar = (from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, - `/calendar`, - { - ...config, - params: { - from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), - to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), - type: ZodExtended.parse(ControlTowerCalendarModels.CalendarTypeEnumSchema, type, { type: "query", name: "type" }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - poNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarPoNumbersParamSchema.optional(), poNumbers, { type: "query", name: "poNumbers" }), - containerNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarContainerNumbersParamSchema.optional(), containerNumbers, { type: "query", name: "containerNumbers" }), - bookingNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarBookingNumbersParamSchema.optional(), bookingNumbers, { type: "query", name: "bookingNumbers" }), - }, - } - ) -}; -} diff --git a/test/generated/full/controlTowerCalendar/controlTowerCalendar.models.ts b/test/generated/full/controlTowerCalendar/controlTowerCalendar.models.ts deleted file mode 100644 index 5c33c81..0000000 --- a/test/generated/full/controlTowerCalendar/controlTowerCalendar.models.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerCalendarModels { -/** - * EventRelationTypeEnumSchema - * @type { enum } - */ -export const EventRelationTypeEnumSchema = z.enum(["Booking", "Container", "PurchaseOrder"]); -export type EventRelationTypeEnum = z.infer; -export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; - -/** - * CalendarEventRelationDtoSchema - * @type { object } - * @property { EventRelationTypeEnum } type - * @property { string } id - * @property { string } number - */ -export const CalendarEventRelationDtoSchema = z.object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }).readonly(); -export type CalendarEventRelationDto = z.infer; - -/** - * CalendarTypeEnumSchema - * @type { enum } - */ -export const CalendarTypeEnumSchema = z.enum(["PurchaseOrder", "Booking", "Container", "Package"]); -export type CalendarTypeEnum = z.infer; -export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; - -/** - * CalendarEventDtoSchema - * @type { object } - * @property { string } entityId - * @property { string } entityNumber - * @property { CalendarTypeEnum } entityType - * @property { string } date - * @property { string } title - * @property { CalendarEventRelationDto[] } relations - */ -export const CalendarEventDtoSchema = z.object({ entityId: z.string(), entityNumber: z.string(), entityType: CalendarTypeEnumSchema, date: z.iso.datetime({ offset: true }), title: z.string(), relations: z.array(CalendarEventRelationDtoSchema).readonly() }).readonly(); -export type CalendarEventDto = z.infer; - -/** - * FiltersDtoSchema - * @type { object } - * @property { string[] } poNumbers - * @property { string[] } bookingNumbers - * @property { string[] } containerNumbers - */ -export const FiltersDtoSchema = z.object({ poNumbers: z.array(z.string()).readonly(), bookingNumbers: z.array(z.string()).readonly(), containerNumbers: z.array(z.string()).readonly() }).readonly(); -export type FiltersDto = z.infer; - -/** - * CalendarDtoSchema - * @type { object } - * @property { CalendarEventDto[] } events - * @property { FiltersDto } filters - */ -export const CalendarDtoSchema = z.object({ events: z.array(CalendarEventDtoSchema).readonly(), filters: FiltersDtoSchema }).readonly(); -export type CalendarDto = z.infer; - -/** - * CalendarResponseDtoSchema - * @type { object } - * @property { CalendarDto } data - */ -export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }).readonly(); -export type CalendarResponseDto = z.infer; - -/** - * GetCalendarPoNumbersParamSchema - * @type { array } - */ -export const GetCalendarPoNumbersParamSchema = z.array(z.string()).readonly().nullish(); -export type GetCalendarPoNumbersParam = z.infer; - -/** - * GetCalendarContainerNumbersParamSchema - * @type { array } - */ -export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).readonly().nullish(); -export type GetCalendarContainerNumbersParam = z.infer; - -/** - * GetCalendarBookingNumbersParamSchema - * @type { array } - */ -export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).readonly().nullish(); -export type GetCalendarBookingNumbersParam = z.infer; - -} diff --git a/test/generated/full/controlTowerCalendar/controlTowerCalendar.queries.ts b/test/generated/full/controlTowerCalendar/controlTowerCalendar.queries.ts deleted file mode 100644 index 115102b..0000000 --- a/test/generated/full/controlTowerCalendar/controlTowerCalendar.queries.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; -import { ControlTowerCalendarApi } from "./controlTowerCalendar.api"; - -export namespace ControlTowerCalendarQueries { -export const moduleName = QueryModule.ControlTowerCalendar; - -export const keys = { - all: [moduleName] as const, - getCalendar: (from?: string, to?: string, type?: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam) => [...keys.all, "/calendar", from, to, type, search, poNumbers, containerNumbers, bookingNumbers] as const, -}; - -/** - * Query `useGetCalendar` - * @param { string } object.from Query parameter - * @param { string } object.to Query parameter - * @param { ControlTowerCalendarModels.CalendarTypeEnum } object.type Query parameter - * @param { string } object.search Query parameter - * @param { ControlTowerCalendarModels.GetCalendarPoNumbersParam } object.poNumbers Query parameter - * @param { ControlTowerCalendarModels.GetCalendarContainerNumbersParam } object.containerNumbers Query parameter - * @param { ControlTowerCalendarModels.GetCalendarBookingNumbersParam } object.bookingNumbers Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCalendar = ({ from, to, type, search, poNumbers, containerNumbers, bookingNumbers }: { from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), - queryFn: () => - ControlTowerCalendarApi.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers, config), - ...options, - }); -}; - -} diff --git a/test/generated/full/controlTowerContainers/controlTowerContainers.api.ts b/test/generated/full/controlTowerContainers/controlTowerContainers.api.ts deleted file mode 100644 index 4708306..0000000 --- a/test/generated/full/controlTowerContainers/controlTowerContainers.api.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; - -export namespace ControlTowerContainersApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, - `/containers`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, - `/containers/${id}`, - config - ) -}; -export const getJourney = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, - `/containers/${id}/journey`, - config - ) -}; -} diff --git a/test/generated/full/controlTowerContainers/controlTowerContainers.configs.ts b/test/generated/full/controlTowerContainers/controlTowerContainers.configs.ts deleted file mode 100644 index 98105eb..0000000 --- a/test/generated/full/controlTowerContainers/controlTowerContainers.configs.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; -import { ControlTowerContainersQueries } from "./controlTowerContainers.queries"; - -export namespace ControlTowerContainersConfigs { -export const containersConfig = { - meta: { - title: "Containers", - }, - readAll: { - schema: ControlTowerContainersModels.ContainerListItemDtoSchema, - paginated: ControlTowerContainersQueries.useFindAll, - infinite: ControlTowerContainersQueries.useFindAllInfinite, - filters: { - schema: ControlTowerContainersModels.ContainerFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerContainersModels.ContainerFilterDtoSchema, - options: { - inputs: { - companyIds: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ControlTowerContainersModels.ContainerListItemDtoSchema, - options: { - columns: { - containerNumber: true, - id: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, - }, -}), - }, - read: { - schema: ControlTowerContainersModels.ContainerResponseDtoSchema, - query: ControlTowerContainersQueries.useFindById, - }, -}; - -} diff --git a/test/generated/full/controlTowerContainers/controlTowerContainers.models.ts b/test/generated/full/controlTowerContainers/controlTowerContainers.models.ts deleted file mode 100644 index 410f1aa..0000000 --- a/test/generated/full/controlTowerContainers/controlTowerContainers.models.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerContainersModels { -/** - * ContainerListItemDtoSchema - * @type { object } - * @property { string } containerNumber - * @property { string } id - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const ContainerListItemDtoSchema = z.object({ containerNumber: z.string().nullable(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); -export type ContainerListItemDto = z.infer; - -/** - * ContainerEventDtoSchema - * @type { object } - * @property { CommonModels.VesselDto } vessel - * @property { string } name - * @property { string } date - * @property { boolean } checkedIn - */ -export const ContainerEventDtoSchema = z.object({ vessel: CommonModels.VesselDtoSchema.nullable(), name: z.string(), date: z.iso.datetime({ offset: true }).nullable(), checkedIn: z.boolean() }).readonly(); -export type ContainerEventDto = z.infer; - -/** - * ContainerJourneyDtoSchema - * @type { object } - * @property { string } id - * @property { string } country - * @property { string } terminal - * @property { boolean } checkedIn - * @property { ContainerEventDto[] } events - */ -export const ContainerJourneyDtoSchema = z.object({ id: z.string(), country: z.string().nullable(), terminal: z.string().nullable(), checkedIn: z.boolean(), events: z.array(ContainerEventDtoSchema).readonly() }).readonly(); -export type ContainerJourneyDto = z.infer; - -/** - * PackageNumberDtoSchema - * @type { object } - * @property { string } id - * @property { string } type - * @property { string } description - */ -export const PackageNumberDtoSchema = z.object({ id: z.string(), type: z.string().nullable(), description: z.string() }).readonly(); -export type PackageNumberDto = z.infer; - -/** - * ContainerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } containerNumber - * @property { string } poNumber - * @property { string } bookingNumber - * @property { string } blNumber - * @property { string } stuffedInContainer - * @property { string } containerType - * @property { string } loadType - * @property { string[] } hsCode - * @property { number } totalVolume - * @property { number } totalWeight - * @property { string } cargoDescription - * @property { number } noS - * @property { ContainerJourneyDto[] } journeys - * @property { PackageNumberDto[] } packages - * @property { string } bookingId - * @property { string } destination - * @property { string[] } files - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const ContainerResponseDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), containerType: z.string().nullable(), loadType: z.string().nullable(), hsCode: z.array(z.string()).readonly().nullable(), totalVolume: z.number().nullable(), totalWeight: z.number().nullable(), cargoDescription: z.string().nullable(), noS: z.number().nullable(), journeys: z.array(ContainerJourneyDtoSchema).readonly().nullish(), packages: z.array(PackageNumberDtoSchema).readonly().nullish(), bookingId: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).readonly().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); -export type ContainerResponseDto = z.infer; - -/** - * ContainerJourneyResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { ContainerJourneyDto[] } journeys - * @property { string[] } packageNumbers - */ -export const ContainerJourneyResponseDtoSchema = z.object({ id: z.string(), number: z.string(), journeys: z.array(ContainerJourneyDtoSchema).readonly(), packageNumbers: z.array(z.string()).readonly() }).readonly(); -export type ContainerJourneyResponseDto = z.infer; - -/** - * ContainerFilterDtoSchema - * @type { object } - * @property { number[] } companyIds - * @property { string } search - */ -export const ContainerFilterDtoSchema = z.object({ companyIds: z.array(z.number()).readonly(), search: z.string() }).readonly(); -export type ContainerFilterDto = z.infer; - -/** - * ControlTowerContainersFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ControlTowerContainersFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); -export type ControlTowerContainersFindAllOrderParamEnum = z.infer; -export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainersFindAllOrderParamEnumSchema.enum; - -/** - * ControlTowerContainersFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ContainerListItemDto[] } items - */ -export const ControlTowerContainersFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerListItemDtoSchema).readonly() }).readonly().shape }); -export type ControlTowerContainersFindAllResponse = z.infer; - -} diff --git a/test/generated/full/controlTowerContainers/controlTowerContainers.queries.ts b/test/generated/full/controlTowerContainers/controlTowerContainers.queries.ts deleted file mode 100644 index eef15d1..0000000 --- a/test/generated/full/controlTowerContainers/controlTowerContainers.queries.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; -import { ControlTowerContainersApi } from "./controlTowerContainers.api"; - -export namespace ControlTowerContainersQueries { -export const moduleName = QueryModule.ControlTowerContainers; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string) => [...keys.all, "/containers", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string) => [...keys.all, "/containers", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/containers/:id", id] as const, - getJourney: (id: string) => [...keys.all, "/containers/:id/journey", id] as const, -}; - -/** - * Query `useFindAll` - * @description Lists containers - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => - ControlTowerContainersApi.findAll(limit, order, filter, page, cursor, config), - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @description Lists containers - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @description Returns a container with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => - ControlTowerContainersApi.findById(id, config), - ...options, - }); -}; - -/** - * Query `useGetJourney` - * @description Returns the journey and package numbers of a container with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetJourney = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.getJourney(id), - queryFn: () => - ControlTowerContainersApi.getJourney(id, config), - ...options, - }); -}; - -} diff --git a/test/generated/full/controlTowerMe/controlTowerMe.api.ts b/test/generated/full/controlTowerMe/controlTowerMe.api.ts deleted file mode 100644 index 6852384..0000000 --- a/test/generated/full/controlTowerMe/controlTowerMe.api.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerMeModels } from "./controlTowerMe.models"; - -export namespace ControlTowerMeApi { -export const getUserProfile = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, - `/me`, - config - ) -}; -export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, - `/me`, - ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), - config - ) -}; -export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, - `/me/basic`, - ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), - config - ) -}; -export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/password`, - ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), - config - ) -}; -export const updateEmailPreferences = (data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/email-preferences`, - ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), - config - ) -}; -export const updateProjectAccess = (config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/access`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/controlTowerMe/controlTowerMe.models.ts b/test/generated/full/controlTowerMe/controlTowerMe.models.ts deleted file mode 100644 index df9a49b..0000000 --- a/test/generated/full/controlTowerMe/controlTowerMe.models.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerMeModels { -/** - * LinksDtoSchema - * @type { object } - * @property { string } self - * @property { string } related - */ -export const LinksDtoSchema = z.object({ self: z.string(), related: z.string() }).readonly(); -export type LinksDto = z.infer; - -/** - * ApiResponseDataDtoSchema - * @type { object } - * @property { string } type - * @property { string } id - * @property { object } attributes - * @property { object } relationships - * @property { LinksDto } links - */ -export const ApiResponseDataDtoSchema = z.object({ type: z.string(), id: z.string(), attributes: z.object({}).readonly().nullish(), relationships: z.object({}).readonly().nullish(), links: LinksDtoSchema.nullish() }).readonly(); -export type ApiResponseDataDto = z.infer; - -/** - * PaginationLinksDtoSchema - * @type { object } - * @property { string } next - * @property { string } self - * @property { string } last - */ -export const PaginationLinksDtoSchema = z.object({ next: z.string(), self: z.string(), last: z.string() }).readonly(); -export type PaginationLinksDto = z.infer; - -/** - * ApiResponseDtoSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - */ -export const ApiResponseDtoSchema = z.object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }).readonly(); -export type ApiResponseDto = z.infer; - -/** - * DelayNotificationEnumSchema - * @type { enum } - */ -export const DelayNotificationEnumSchema = z.enum(["EveryDelay", "LongerThan24Hours", "LongerThan3Days"]); -export type DelayNotificationEnum = z.infer; -export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; - -/** - * UserEmailPreferencesDtoSchema - * @type { object } - * @property { boolean } originDeparture - * @property { boolean } loadedOnVessel - * @property { boolean } destinationArrival - * @property { boolean } onsiteDelivery - * @property { DelayNotificationEnum } delay - */ -export const UserEmailPreferencesDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }).readonly(); -export type UserEmailPreferencesDto = z.infer; - -/** - * UserProjectAccessDtoSchema - * @type { object } - * @property { string[] } projectIds - */ -export const UserProjectAccessDtoSchema = z.object({ projectIds: z.array(z.string()).readonly() }).readonly(); -export type UserProjectAccessDto = z.infer; - -/** - * UserRoleEnumSchema - * @type { enum } - */ -export const UserRoleEnumSchema = z.enum(["User", "Admin"]); -export type UserRoleEnum = z.infer; -export const UserRoleEnum = UserRoleEnumSchema.enum; - -/** - * UserDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } name Min Length: `3` - * @property { string } email - * @property { UserEmailPreferencesDto } emailPreferences - * @property { UserProjectAccessDto } projectAccess - * @property { UserRoleEnum } role - * @property { boolean } isAdmin - */ -export const UserDetailDtoSchema = z.object({ id: z.string(), name: z.string().min(3), email: z.email(), emailPreferences: UserEmailPreferencesDtoSchema.nullable(), projectAccess: UserProjectAccessDtoSchema.nullable(), role: UserRoleEnumSchema.nullable(), isAdmin: z.boolean() }).readonly(); -export type UserDetailDto = z.infer; - -/** - * UserEmailPreferencesUpdateDtoSchema - * @type { object } - * @property { boolean } originDeparture - * @property { boolean } loadedOnVessel - * @property { boolean } destinationArrival - * @property { boolean } onsiteDelivery - * @property { DelayNotificationEnum } delay - */ -export const UserEmailPreferencesUpdateDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }).readonly(); -export type UserEmailPreferencesUpdateDto = z.infer; - -/** - * UserProjectAccessUpdateDtoSchema - * @type { object } - * @property { number[] } projectIds - */ -export const UserProjectAccessUpdateDtoSchema = z.object({ projectIds: z.array(z.number()).readonly() }).readonly(); -export type UserProjectAccessUpdateDto = z.infer; - -/** - * UserUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } password - * @property { UserEmailPreferencesUpdateDto } emailPreferences - * @property { UserProjectAccessUpdateDto } projectAccess - */ -export const UserUpdateDtoSchema = z.object({ name: z.string(), email: z.email(), password: z.string(), emailPreferences: UserEmailPreferencesUpdateDtoSchema, projectAccess: UserProjectAccessUpdateDtoSchema }).readonly(); -export type UserUpdateDto = z.infer; - -/** - * UserBasicUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - */ -export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }).readonly(); -export type UserBasicUpdateDto = z.infer; - -/** - * UserPasswordUpdateDtoSchema - * @type { object } - * @property { string } password - */ -export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }).readonly(); -export type UserPasswordUpdateDto = z.infer; - -/** - * GetUserProfileResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ -export const GetUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape }); -export type GetUserProfileResponse = z.infer; - -/** - * UpdateUserDataResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ -export const UpdateUserDataResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape }); -export type UpdateUserDataResponse = z.infer; - -/** - * UpdateUserProfileResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ -export const UpdateUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema }).readonly() }).readonly().shape }); -export type UpdateUserProfileResponse = z.infer; - -} diff --git a/test/generated/full/controlTowerMe/controlTowerMe.queries.ts b/test/generated/full/controlTowerMe/controlTowerMe.queries.ts deleted file mode 100644 index fa4d7c0..0000000 --- a/test/generated/full/controlTowerMe/controlTowerMe.queries.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerMeModels } from "./controlTowerMe.models"; -import { ControlTowerMeApi } from "./controlTowerMe.api"; - -export namespace ControlTowerMeQueries { -export const moduleName = QueryModule.ControlTowerMe; - -export const keys = { - all: [moduleName] as const, - getUserProfile: () => [...keys.all, "/me", ] as const, -}; - -/** - * Query `useGetUserProfile` - * @description Get basic user profile data - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200] - */ -export const useGetUserProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.getUserProfile(), - queryFn: () => - ControlTowerMeApi.getUserProfile(config), - ...options, - }); -}; - -/** - * Mutation `useUpdateUserData` - * @description Update user data - * @param { ControlTowerMeModels.UserUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateUserData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updateUserData(data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateUserProfile` - * @description Update basic user profile data - * @param { ControlTowerMeModels.UserBasicUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateUserProfile = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updateUserProfile(data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdatePassword` - * @description Update user password - * @param { ControlTowerMeModels.UserPasswordUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdatePassword = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updatePassword(data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateEmailPreferences` - * @description Update user email notification preferences - * @param { ControlTowerMeModels.UserEmailPreferencesUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateEmailPreferences = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updateEmailPreferences(data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateProjectAccess` - * @description Update user project access - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateProjectAccess = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: () => - ControlTowerMeApi.updateProjectAccess(config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/controlTowerPackages/controlTowerPackages.api.ts b/test/generated/full/controlTowerPackages/controlTowerPackages.api.ts deleted file mode 100644 index 6cab316..0000000 --- a/test/generated/full/controlTowerPackages/controlTowerPackages.api.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; - -export namespace ControlTowerPackagesApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, - `/packages`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/full/controlTowerPackages/controlTowerPackages.configs.ts b/test/generated/full/controlTowerPackages/controlTowerPackages.configs.ts deleted file mode 100644 index 17e4ee5..0000000 --- a/test/generated/full/controlTowerPackages/controlTowerPackages.configs.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; -import { ControlTowerPackagesQueries } from "./controlTowerPackages.queries"; - -export namespace ControlTowerPackagesConfigs { -export const packagesConfig = { - meta: { - title: "Packages", - }, - readAll: { - schema: ControlTowerPackagesModels.PackageListItemDtoSchema, - paginated: ControlTowerPackagesQueries.useFindAll, - infinite: ControlTowerPackagesQueries.useFindAllInfinite, - filters: { - schema: ControlTowerPackagesModels.PackageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerPackagesModels.PackageFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ControlTowerPackagesModels.PackageListItemDtoSchema, - options: { - columns: { - packageNumber: true, - bookingId: true, - id: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/controlTowerPackages/controlTowerPackages.models.ts b/test/generated/full/controlTowerPackages/controlTowerPackages.models.ts deleted file mode 100644 index 4d4fd3b..0000000 --- a/test/generated/full/controlTowerPackages/controlTowerPackages.models.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerPackagesModels { -/** - * PackageListItemDtoSchema - * @type { object } - * @property { string } packageNumber - * @property { string } bookingId - * @property { string } id - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const PackageListItemDtoSchema = z.object({ packageNumber: z.string(), bookingId: z.string(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }).readonly(); -export type PackageListItemDto = z.infer; - -/** - * PackageFilterDtoSchema - * @type { object } - * @property { string } search Min Length: `1` - */ -export const PackageFilterDtoSchema = z.object({ search: z.string().min(1) }).readonly(); -export type PackageFilterDto = z.infer; - -/** - * ControlTowerPackagesFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ControlTowerPackagesFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); -export type ControlTowerPackagesFindAllOrderParamEnum = z.infer; -export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFindAllOrderParamEnumSchema.enum; - -/** - * ControlTowerPackagesFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PackageListItemDto[] } items - */ -export const ControlTowerPackagesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageListItemDtoSchema).readonly() }).readonly().shape }); -export type ControlTowerPackagesFindAllResponse = z.infer; - -} diff --git a/test/generated/full/controlTowerPackages/controlTowerPackages.queries.ts b/test/generated/full/controlTowerPackages/controlTowerPackages.queries.ts deleted file mode 100644 index d55ee3d..0000000 --- a/test/generated/full/controlTowerPackages/controlTowerPackages.queries.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; -import { ControlTowerPackagesApi } from "./controlTowerPackages.api"; - -export namespace ControlTowerPackagesQueries { -export const moduleName = QueryModule.ControlTowerPackages; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string) => [...keys.all, "/packages", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string) => [...keys.all, "/packages", "infinite", limit, order, filter, cursor] as const, -}; - -/** - * Query `useFindAll` - * @description Lists packages - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => - ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor, config), - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @description Lists packages - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/full/controlTowerSearch/controlTowerSearch.api.ts b/test/generated/full/controlTowerSearch/controlTowerSearch.api.ts deleted file mode 100644 index 4ff685b..0000000 --- a/test/generated/full/controlTowerSearch/controlTowerSearch.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerSearchModels } from "./controlTowerSearch.models"; - -export namespace ControlTowerSearchApi { -export const search = (data: ControlTowerSearchModels.SearchRequestDto, type?: ControlTowerSearchModels.SearchItemTypeEnum, limit?: number, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, - `/search`, - ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), - { - ...config, - params: { - type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { type: "query", name: "type" }), - limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), - }, - } - ) -}; -} diff --git a/test/generated/full/controlTowerSearch/controlTowerSearch.models.ts b/test/generated/full/controlTowerSearch/controlTowerSearch.models.ts deleted file mode 100644 index 77d7c82..0000000 --- a/test/generated/full/controlTowerSearch/controlTowerSearch.models.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerSearchModels { -/** - * SearchItemTypeEnumSchema - * @type { enum } - */ -export const SearchItemTypeEnumSchema = z.enum(["Project", "Booking", "Container"]); -export type SearchItemTypeEnum = z.infer; -export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; - -/** - * SearchItemDtoSchema - * @type { object } - * @property { SearchItemTypeEnum } type - * @property { string } id - * @property { string } label - */ -export const SearchItemDtoSchema = z.object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }).readonly(); -export type SearchItemDto = z.infer; - -/** - * SearchResponseDtoSchema - * @type { object } - * @property { SearchItemDto[] } items - * @property { number } projectsCount - * @property { number } bookingsCount - * @property { number } containersCount - * @property { number } totalCount - */ -export const SearchResponseDtoSchema = z.object({ items: z.array(SearchItemDtoSchema).readonly(), projectsCount: z.number(), bookingsCount: z.number(), containersCount: z.number(), totalCount: z.number() }).readonly(); -export type SearchResponseDto = z.infer; - -/** - * SearchRequestDtoSchema - * @type { object } - * @property { string } search - */ -export const SearchRequestDtoSchema = z.object({ search: z.string() }).readonly(); -export type SearchRequestDto = z.infer; - -} diff --git a/test/generated/full/controlTowerSearch/controlTowerSearch.queries.ts b/test/generated/full/controlTowerSearch/controlTowerSearch.queries.ts deleted file mode 100644 index 11200f8..0000000 --- a/test/generated/full/controlTowerSearch/controlTowerSearch.queries.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerSearchModels } from "./controlTowerSearch.models"; -import { ControlTowerSearchApi } from "./controlTowerSearch.api"; - -export namespace ControlTowerSearchQueries { -export const moduleName = QueryModule.ControlTowerSearch; - - - -/** - * Mutation `useSearch` - * @param { ControlTowerSearchModels.SearchRequestDto } mutation.data Body parameter - * @param { ControlTowerSearchModels.SearchItemTypeEnum } mutation.type Query parameter - * @param { number } mutation.limit Query parameter. Minimum: `1` - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useSearch = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data, type, limit }) => - ControlTowerSearchApi.search(data, type, limit, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/countries/countries.acl.ts b/test/generated/full/countries/countries.acl.ts deleted file mode 100644 index 0d2de89..0000000 --- a/test/generated/full/countries/countries.acl.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CountriesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Country" -] as AbilityTuple<"Read", "Country">; - -/** - * Use for `usePaginateCountryLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCountryLabels` query - */ -export const canUsePaginateCountryLabels = ( -) => [ - "Read", - "Country" -] as AbilityTuple<"Read", "Country">; - -/** - * Use for `useGetCountryById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCountryById` query - */ -export const canUseGetCountryById = ( -) => [ - "Read", - "Country" -] as AbilityTuple<"Read", "Country">; - -} diff --git a/test/generated/full/countries/countries.api.ts b/test/generated/full/countries/countries.api.ts deleted file mode 100644 index 7363457..0000000 --- a/test/generated/full/countries/countries.api.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CountriesModels } from "./countries.models"; - -export namespace CountriesApi { -export const paginate = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CountriesModels.CountriesPaginateResponseSchema }, - `/countries/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateCountryLabels = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, - `/countries/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getCountryById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CountriesModels.CountryResponseDTOSchema }, - `/countries/${id}`, - config - ) -}; -} diff --git a/test/generated/full/countries/countries.configs.ts b/test/generated/full/countries/countries.configs.ts deleted file mode 100644 index 52d1c12..0000000 --- a/test/generated/full/countries/countries.configs.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CountriesModels } from "./countries.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CountriesQueries } from "./countries.queries"; -import { CountriesAcl } from "./countries.acl"; - -export namespace CountriesConfigs { -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CountriesAcl.canUsePaginate, - schema: CountriesModels.CountryResponseDTOSchema, - paginated: CountriesQueries.usePaginate, - infinite: CountriesQueries.usePaginateInfinite, - filters: { - schema: CountriesModels.CountryPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CountriesModels.CountryPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CountriesModels.CountryResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - isoCode2: true, - isoCode3: true, - currencyNotation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CountriesModels.CountriesPaginateOrderParamEnumSchema, - }, -}), - }, -}; - -export const labelsPaginateConfig = { - meta: { - title: "Labels Paginate", - }, - readAll: { - acl: CountriesAcl.canUsePaginateCountryLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CountriesQueries.usePaginateCountryLabels, - infinite: CountriesQueries.usePaginateCountryLabelsInfinite, - filters: { - schema: CountriesModels.CountryPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CountriesModels.CountryPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CountriesModels.PaginateCountryLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/countries/countries.models.ts b/test/generated/full/countries/countries.models.ts deleted file mode 100644 index 335259c..0000000 --- a/test/generated/full/countries/countries.models.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CountriesModels { -/** - * CountryEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type CountryEmployeeDTO = z.infer; - -/** - * CountryResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the country - * @property { string } name Name of the country - * @property { string } isoCode2 ISO 2-letter code - * @property { string } isoCode3 ISO 3-letter code - * @property { string } currencyNotation Currency notation - * @property { string } createdById - * @property { CountryEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CountryEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const CountryResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the country"), name: z.string().describe("Name of the country"), isoCode2: z.string().describe("ISO 2-letter code"), isoCode3: z.string().describe("ISO 3-letter code"), currencyNotation: z.string().describe("Currency notation"), createdById: z.string().nullish(), createdBy: CountryEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CountryEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type CountryResponseDTO = z.infer; - -/** - * CountryPaginationFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const CountryPaginationFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type CountryPaginationFilterDto = z.infer; - -/** - * CountriesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const CountriesPaginateOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type CountriesPaginateOrderParamEnum = z.infer; -export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSchema.enum; - -/** - * CountriesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CountryResponseDTO[] } items - */ -export const CountriesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CountryResponseDTOSchema).readonly() }).readonly().shape }); -export type CountriesPaginateResponse = z.infer; - -/** - * PaginateCountryLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateCountryLabelsOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateCountryLabelsOrderParamEnum = z.infer; -export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderParamEnumSchema.enum; - -/** - * PaginateCountryLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateCountryLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type PaginateCountryLabelsResponse = z.infer; - -} diff --git a/test/generated/full/countries/countries.queries.ts b/test/generated/full/countries/countries.queries.ts deleted file mode 100644 index 911e551..0000000 --- a/test/generated/full/countries/countries.queries.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CountriesAcl } from "./countries.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { CountriesModels } from "./countries.models"; -import { CountriesApi } from "./countries.api"; - -export namespace CountriesQueries { -export const moduleName = QueryModule.Countries; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/paginate", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/paginate", "infinite", limit, order, filter, cursor] as const, - paginateCountryLabels: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/labels/paginate", limit, order, filter, page, cursor] as const, - paginateCountryLabelsInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/labels/paginate", "infinite", limit, order, filter, cursor] as const, - getCountryById: (id: string) => [...keys.all, "/countries/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Countries - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Countries - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateCountryLabels` - * @summary Paginate country labels (id and name only) - * @permission Requires `canUsePaginateCountryLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCountryLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateCountryLabelsInfinite - * @summary Paginate country labels (id and name only) - * @permission Requires `canUsePaginateCountryLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCountryLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetCountryById` - * @summary Get country by ID with complete details - * @permission Requires `canUseGetCountryById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCountryById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCountryById(id), - queryFn: () => { - checkAcl(CountriesAcl.canUseGetCountryById()); - return CountriesApi.getCountryById(id, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/currencies/currencies.acl.ts b/test/generated/full/currencies/currencies.acl.ts deleted file mode 100644 index ff528da..0000000 --- a/test/generated/full/currencies/currencies.acl.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CurrenciesAcl { -/** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -/** - * Use for `useCreateCurrency` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCurrency` mutation - */ -export const canUseCreateCurrency = ( -) => [ - "Create", - "Currency" -] as AbilityTuple<"Create", "Currency">; - -/** - * Use for `usePaginateCurrencyLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabels` query - */ -export const canUsePaginateCurrencyLabels = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -/** - * Use for `useGetCurrencyById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCurrencyById` query - */ -export const canUseGetCurrencyById = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -/** - * Use for `useUpdateCurrency` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCurrency` mutation - */ -export const canUseUpdateCurrency = ( -) => [ - "Update", - "Currency" -] as AbilityTuple<"Update", "Currency">; - -/** - * Use for `usePaginateCurrencyLabelsByOffice` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabelsByOffice` query - */ -export const canUsePaginateCurrencyLabelsByOffice = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -} diff --git a/test/generated/full/currencies/currencies.api.ts b/test/generated/full/currencies/currencies.api.ts deleted file mode 100644 index 721f437..0000000 --- a/test/generated/full/currencies/currencies.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CurrenciesModels } from "./currencies.models"; - -export namespace CurrenciesApi { -export const list = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.CurrenciesListResponseSchema }, - `/currencies`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies`, - ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), - config - ) -}; -export const paginateCurrencyLabels = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, - `/currencies/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getCurrencyById = (isoCode: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies/${isoCode}`, - config - ) -}; -export const updateCurrency = (isoCode: string, data: CurrenciesModels.UpdateCurrencyRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies/${isoCode}`, - ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), - config - ) -}; -export const paginateCurrencyLabelsByOffice = (officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, - `/offices/${officeId}/currencies/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/full/currencies/currencies.configs.ts b/test/generated/full/currencies/currencies.configs.ts deleted file mode 100644 index 6d36fb1..0000000 --- a/test/generated/full/currencies/currencies.configs.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CurrenciesModels } from "./currencies.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CurrenciesQueries } from "./currencies.queries"; -import { CurrenciesAcl } from "./currencies.acl"; - -export namespace CurrenciesConfigs { -export const currenciesConfig = { - meta: { - title: "Currencies", - }, - readAll: { - acl: CurrenciesAcl.canUseList, - schema: CurrenciesModels.CurrencyResponseDtoSchema, - paginated: CurrenciesQueries.useList, - infinite: CurrenciesQueries.useListInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CurrenciesModels.CurrencyResponseDtoSchema, - options: { - columns: { - isoCode: true, - name: true, - symbol: true, - alignment: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CurrenciesModels.CurrenciesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CurrenciesAcl.canUseGetCurrencyById, - schema: CurrenciesModels.CurrencyResponseDtoSchema, - query: CurrenciesQueries.useGetCurrencyById, - }, - create: { - acl: CurrenciesAcl.canUseCreateCurrency, - schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, - mutation: CurrenciesQueries.useCreateCurrency, - inputDefs: dynamicInputs({ - schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, - options: { - inputs: { - isoCode: true, - name: true, - symbol: true, - alignment: true, - }, - }, -}) - }, - update: { - acl: CurrenciesAcl.canUseUpdateCurrency, - schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, - mutation: CurrenciesQueries.useUpdateCurrency, - inputDefs: dynamicInputs({ - schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CurrenciesAcl.canUsePaginateCurrencyLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CurrenciesQueries.usePaginateCurrencyLabels, - infinite: CurrenciesQueries.usePaginateCurrencyLabelsInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -export const labelsPaginateConfig = { - meta: { - title: "Labels Paginate", - }, - readAll: { - acl: CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CurrenciesQueries.usePaginateCurrencyLabelsByOffice, - infinite: CurrenciesQueries.usePaginateCurrencyLabelsByOfficeInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/currencies/currencies.models.ts b/test/generated/full/currencies/currencies.models.ts deleted file mode 100644 index 560fc3c..0000000 --- a/test/generated/full/currencies/currencies.models.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CurrenciesModels { -/** - * CurrencyEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type CurrencyEmployeeDTO = z.infer; - -/** - * CurrencyResponseDtoSchema - * @type { object } - * @property { string } isoCode isoCode of the currency - * @property { string } name Name of the currency - * @property { string } symbol Symbol of the currency - * @property { string } alignment Alignment of the currency - * @property { string } createdById ID of the employee who created this currency - * @property { CurrencyEmployeeDTO } createdBy Employee who created this currency - * @property { string } createdAt Date when the currency was created - * @property { string } updatedById ID of the employee who last updated this currency - * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency - * @property { string } updatedAt Date when the currency was last updated - */ -export const CurrencyResponseDtoSchema = z.object({ isoCode: z.string().describe("isoCode of the currency"), name: z.string().describe("Name of the currency"), symbol: z.string().describe("Symbol of the currency").nullish(), alignment: z.string().describe("Alignment of the currency").nullish(), createdById: z.string().describe("ID of the employee who created this currency").nullish(), createdBy: CurrencyEmployeeDTOSchema.describe("Employee who created this currency").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Date when the currency was created"), updatedById: z.string().describe("ID of the employee who last updated this currency").nullish(), updatedBy: CurrencyEmployeeDTOSchema.describe("Employee who last updated this currency").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Date when the currency was last updated") }).readonly(); -export type CurrencyResponseDto = z.infer; - -/** - * CurrencyPaginationFilterDtoSchema - * @type { object } - * @property { string } officeId - * @property { string } search - */ -export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string(), search: z.string() }).readonly(); -export type CurrencyPaginationFilterDto = z.infer; - -/** - * CreateCurrencyRequestDTOSchema - * @type { object } - * @property { string } isoCode Unique identifier for the currency - * @property { string } name Name of the currency - * @property { string } symbol Symbol of the currency - * @property { string } alignment Alignment of the currency - */ -export const CreateCurrencyRequestDTOSchema = z.object({ isoCode: z.string().describe("Unique identifier for the currency"), name: z.string().describe("Name of the currency"), symbol: z.string().describe("Symbol of the currency"), alignment: z.string().describe("Alignment of the currency") }).readonly(); -export type CreateCurrencyRequestDTO = z.infer; - -/** - * UpdateCurrencyRequestDTOSchema - * @type { object } - * @property { string } name Name of the currency - */ -export const UpdateCurrencyRequestDTOSchema = z.object({ name: z.string().describe("Name of the currency") }).readonly(); -export type UpdateCurrencyRequestDTO = z.infer; - -/** - * CurrenciesListOrderParamEnumSchema - * @type { enum } - */ -export const CurrenciesListOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type CurrenciesListOrderParamEnum = z.infer; -export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.enum; - -/** - * CurrenciesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CurrencyResponseDto[] } items - */ -export const CurrenciesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CurrencyResponseDtoSchema).readonly() }).readonly().shape }); -export type CurrenciesListResponse = z.infer; - -/** - * PaginateCurrencyLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateCurrencyLabelsOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateCurrencyLabelsOrderParamEnum = z.infer; -export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderParamEnumSchema.enum; - -/** - * PaginateCurrencyLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateCurrencyLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type PaginateCurrencyLabelsResponse = z.infer; - -/** - * PaginateCurrencyLabelsByOfficeOrderParamEnumSchema - * @type { enum } - */ -export const PaginateCurrencyLabelsByOfficeOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateCurrencyLabelsByOfficeOrderParamEnum = z.infer; -export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabelsByOfficeOrderParamEnumSchema.enum; - -/** - * PaginateCurrencyLabelsByOfficeResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type PaginateCurrencyLabelsByOfficeResponse = z.infer; - -} diff --git a/test/generated/full/currencies/currencies.queries.ts b/test/generated/full/currencies/currencies.queries.ts deleted file mode 100644 index ba31720..0000000 --- a/test/generated/full/currencies/currencies.queries.ts +++ /dev/null @@ -1,268 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CurrenciesAcl } from "./currencies.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CurrenciesModels } from "./currencies.models"; -import { CurrenciesApi } from "./currencies.api"; - -export namespace CurrenciesQueries { -export const moduleName = QueryModule.Currencies; - -export const keys = { - all: [moduleName] as const, - list: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies", "infinite", limit, order, filter, cursor] as const, - paginateCurrencyLabels: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies/labels/paginate", limit, order, filter, page, cursor] as const, - paginateCurrencyLabelsInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies/labels/paginate", "infinite", limit, order, filter, cursor] as const, - getCurrencyById: (isoCode: string) => [...keys.all, "/currencies/:isoCode", isoCode] as const, - paginateCurrencyLabelsByOffice: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", officeId, limit, order, filter, page, cursor] as const, - paginateCurrencyLabelsByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useList` - * @summary List Currencies - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List Currencies - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateCurrency` - * @summary Create Currency - * @permission Requires `canUseCreateCurrency` ability - * @param { CurrenciesModels.CreateCurrencyRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateCurrency = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CurrenciesAcl.canUseCreateCurrency()); - return CurrenciesApi.createCurrency(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateCurrencyLabels` - * @summary Paginate Currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateCurrencyLabelsInfinite - * @summary Paginate Currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetCurrencyById` - * @summary Get Currency by iso code - * @permission Requires `canUseGetCurrencyById` ability - * @param { string } object.isoCode Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCurrencyById = ({ isoCode }: { isoCode: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCurrencyById(isoCode), - queryFn: () => { - checkAcl(CurrenciesAcl.canUseGetCurrencyById()); - return CurrenciesApi.getCurrencyById(isoCode, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCurrency` - * @summary Update Currency - * @permission Requires `canUseUpdateCurrency` ability - * @param { string } mutation.isoCode Path parameter - * @param { CurrenciesModels.UpdateCurrencyRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCurrency = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ isoCode, data }) => { - checkAcl(CurrenciesAcl.canUseUpdateCurrency()); - return CurrenciesApi.updateCurrency(isoCode, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { isoCode } = variables; - const updateKeys = [keys.getCurrencyById(isoCode)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateCurrencyLabelsByOffice` - * @summary Paginate office currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabelsByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateCurrencyLabelsByOfficeInfinite - * @summary Paginate office currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabelsByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/full/customerAccount/customerAccount.api.ts b/test/generated/full/customerAccount/customerAccount.api.ts deleted file mode 100644 index 360b9b1..0000000 --- a/test/generated/full/customerAccount/customerAccount.api.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { CustomerAccountModels } from "./customerAccount.models"; - -export namespace CustomerAccountApi { -export const get = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, - `/customers/account`, - config - ) -}; -} diff --git a/test/generated/full/customerAccount/customerAccount.models.ts b/test/generated/full/customerAccount/customerAccount.models.ts deleted file mode 100644 index 4e0da5a..0000000 --- a/test/generated/full/customerAccount/customerAccount.models.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { z } from "zod"; - -export namespace CustomerAccountModels { -/** - * CustomerCompanyDtoSchema - * @type { object } - * @property { string } id Company ID - * @property { string } name Company name - */ -export const CustomerCompanyDtoSchema = z.object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name").nullish() }).readonly(); -export type CustomerCompanyDto = z.infer; - -/** - * CustomerBusinessPartnerDtoSchema - * @type { object } - * @property { string } id Company ID - * @property { string } name Company name - */ -export const CustomerBusinessPartnerDtoSchema = z.object({ id: z.string().describe("Company ID"), name: z.string().describe("Company name") }).readonly(); -export type CustomerBusinessPartnerDto = z.infer; - -/** - * CustomerAccountDtoSchema - * @type { object } - * @property { array[] } aclRules Can hold any type of value - * @property { string } id Customer ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { CustomerCompanyDto } company Company - * @property { CustomerBusinessPartnerDto } businessPartner - */ -export const CustomerAccountDtoSchema = z.object({ aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), id: z.string().describe("Customer ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), company: CustomerCompanyDtoSchema.describe("Company").nullish(), businessPartner: CustomerBusinessPartnerDtoSchema.nullish() }).readonly(); -export type CustomerAccountDto = z.infer; - -} diff --git a/test/generated/full/customerAccount/customerAccount.queries.ts b/test/generated/full/customerAccount/customerAccount.queries.ts deleted file mode 100644 index 38f8624..0000000 --- a/test/generated/full/customerAccount/customerAccount.queries.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { CustomerAccountApi } from "./customerAccount.api"; - -export namespace CustomerAccountQueries { -export const moduleName = QueryModule.CustomerAccount; - -export const keys = { - all: [moduleName] as const, - get: () => [...keys.all, "/customers/account", ] as const, -}; - -/** - * Query `useGet` - * @summary Get profile of logged-in user - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.get(), - queryFn: () => - CustomerAccountApi.get(config), - ...options, - }); -}; - -} diff --git a/test/generated/full/customers/customers.acl.ts b/test/generated/full/customers/customers.acl.ts deleted file mode 100644 index bb972e0..0000000 --- a/test/generated/full/customers/customers.acl.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CustomersAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Customer" -] as AbilityTuple<"Create", "Customer">; - -/** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( -) => [ - "Read", - "Customer" -] as AbilityTuple<"Read", "Customer">; - -/** - * Use for `useFindById` query ability. - * @description Read a customer with id - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Customer" -] as AbilityTuple<"Read", "Customer">; - -/** - * Use for `useUpdate` mutation ability. - * @description Update Customer - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Customer" -] as AbilityTuple<"Update", "Customer">; - -/** - * Use for `useDeactivate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeactivate` mutation - */ -export const canUseDeactivate = ( -) => [ - "Deactivate", - "Customer" -] as AbilityTuple<"Deactivate", "Customer">; - -/** - * Use for `useReactivate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReactivate` mutation - */ -export const canUseReactivate = ( -) => [ - "Reactivate", - "Customer" -] as AbilityTuple<"Reactivate", "Customer">; - -} diff --git a/test/generated/full/customers/customers.api.ts b/test/generated/full/customers/customers.api.ts deleted file mode 100644 index 0f87f69..0000000 --- a/test/generated/full/customers/customers.api.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CustomersModels } from "./customers.models"; - -export namespace CustomersApi { -export const findProfile = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, - `/customers/me`, - config - ) -}; -export const create = (data: CustomersModels.CreateCustomerDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers`, - ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), - config - ) -}; -export const list = (limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CustomersModels.CustomersListResponseSchema }, - `/customers`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (customerId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${customerId}`, - config - ) -}; -export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${customerId}`, - ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), - config - ) -}; -export const deactivate = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${id}/deactivate`, - undefined, - config - ) -}; -export const reactivate = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${id}/reactivate`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/customers/customers.configs.ts b/test/generated/full/customers/customers.configs.ts deleted file mode 100644 index 95eec1d..0000000 --- a/test/generated/full/customers/customers.configs.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CustomersModels } from "./customers.models"; -import { CustomersQueries } from "./customers.queries"; -import { CustomersAcl } from "./customers.acl"; - -export namespace CustomersConfigs { -export const customersConfig = { - meta: { - title: "Customers", - }, - readAll: { - acl: CustomersAcl.canUseList, - schema: CustomersModels.CustomerListItemDTOSchema, - paginated: CustomersQueries.useList, - infinite: CustomersQueries.useListInfinite, - filters: { - schema: CustomersModels.CustomerPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CustomersModels.CustomerPaginationFilterDtoSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - companyId: true, - businessPartnerId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CustomersModels.CustomerListItemDTOSchema, - options: { - columns: { - id: true, - firstName: true, - lastName: true, - email: true, - phone: true, - companyId: true, - businessPartnerId: true, - businessPartner: true, - }, - sortable: CustomersModels.CustomersListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CustomersAcl.canUseFindById, - schema: CustomersModels.CustomerResponseDTOSchema, - query: CustomersQueries.useFindById, - }, - create: { - acl: CustomersAcl.canUseCreate, - schema: CustomersModels.CreateCustomerDTOSchema, - mutation: CustomersQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CustomersModels.CreateCustomerDTOSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - phone: true, - companyId: true, - businessPartnerId: true, - }, - }, -}) - }, - update: { - acl: CustomersAcl.canUseUpdate, - schema: CustomersModels.UpdateCustomerDTOSchema, - mutation: CustomersQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CustomersModels.UpdateCustomerDTOSchema, - options: { - inputs: { - firstName: true, - lastName: true, - phone: true, - companyId: true, - businessPartnerId: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/full/customers/customers.models.ts b/test/generated/full/customers/customers.models.ts deleted file mode 100644 index e12d751..0000000 --- a/test/generated/full/customers/customers.models.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CustomersModels { -/** - * CustomerProfileBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type CustomerProfileBusinessPartnerDto = z.infer; - -/** - * CustomerProfileResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - * @property { CustomerProfileBusinessPartnerDto } businessPartner - */ -export const CustomerProfileResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.email().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), businessPartner: CustomerProfileBusinessPartnerDtoSchema.nullish() }).readonly(); -export type CustomerProfileResponseDTO = z.infer; - -/** - * CustomerBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CustomerBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type CustomerBusinessPartnerResponseDto = z.infer; - -/** - * CustomerResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company Id of the customer - * @property { string } businessPartnerId Business partner Id of the customer - * @property { boolean } archived Wether the customer is archived - * @property { CustomerBusinessPartnerResponseDto } businessPartner - */ -export const CustomerResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.email().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company Id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner Id of the customer").nullish(), archived: z.boolean().describe("Wether the customer is archived"), businessPartner: CustomerBusinessPartnerResponseDtoSchema.nullish() }).readonly(); -export type CustomerResponseDTO = z.infer; - -/** - * CustomerListItemBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type CustomerListItemBusinessPartnerDto = z.infer; - -/** - * CustomerListItemDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - * @property { CustomerListItemBusinessPartnerDto } businessPartner - */ -export const CustomerListItemDTOSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.string().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner id of the customer").nullish(), businessPartner: CustomerListItemBusinessPartnerDtoSchema.nullish() }).readonly(); -export type CustomerListItemDTO = z.infer; - -/** - * CreateCustomerDTOSchema - * @type { object } - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - */ -export const CreateCustomerDTOSchema = z.object({ firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), email: z.email().describe("Email of the customer"), phone: z.string().describe("Phone number of the customer").nullish(), companyId: z.string().describe("Company id of the customer").nullish(), businessPartnerId: z.string().describe("Business partner id of the customer").nullish() }).readonly(); -export type CreateCustomerDTO = z.infer; - -/** - * CustomerPaginationFilterDtoSchema - * @type { object } - * @property { string } firstName - * @property { string } lastName - * @property { string } email - * @property { string } companyId - * @property { string } businessPartnerId - * @property { string } search - */ -export const CustomerPaginationFilterDtoSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.string(), companyId: z.string(), businessPartnerId: z.string(), search: z.string() }).readonly(); -export type CustomerPaginationFilterDto = z.infer; - -/** - * UpdateCustomerDTOSchema - * @type { object } - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - */ -export const UpdateCustomerDTOSchema = z.object({ firstName: z.string().describe("First name of the customer"), lastName: z.string().describe("Last name of the customer"), phone: z.string().describe("Phone number of the customer"), companyId: z.string().describe("Company id of the customer"), businessPartnerId: z.string().describe("Business partner id of the customer") }).readonly(); -export type UpdateCustomerDTO = z.infer; - -/** - * CustomersListOrderParamEnumSchema - * @type { enum } - */ -export const CustomersListOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "createdAt"]); -export type CustomersListOrderParamEnum = z.infer; -export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enum; - -/** - * CustomersListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CustomerListItemDTO[] } items - */ -export const CustomersListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CustomerListItemDTOSchema).readonly() }).readonly().shape }); -export type CustomersListResponse = z.infer; - -} diff --git a/test/generated/full/customers/customers.queries.ts b/test/generated/full/customers/customers.queries.ts deleted file mode 100644 index 44fef2d..0000000 --- a/test/generated/full/customers/customers.queries.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CustomersAcl } from "./customers.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CustomersModels } from "./customers.models"; -import { CustomersApi } from "./customers.api"; - -export namespace CustomersQueries { -export const moduleName = QueryModule.Customers; - -export const keys = { - all: [moduleName] as const, - findProfile: () => [...keys.all, "/customers/me", ] as const, - list: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/customers", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string) => [...keys.all, "/customers", "infinite", limit, order, filter, cursor] as const, - findById: (customerId: string) => [...keys.all, "/customers/:customerId", customerId] as const, -}; - -/** - * Query `useFindProfile` - * @summary Get customer by id - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.findProfile(), - queryFn: () => - CustomersApi.findProfile(config), - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create new customer - * @permission Requires `canUseCreate` ability - * @param { CustomersModels.CreateCustomerDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CustomersAcl.canUseCreate()); - return CustomersApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useList` - * @summary List customers - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` - * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List customers - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` - * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get customer by id - * @permission Requires `canUseFindById` ability - * @param { string } object.customerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ customerId }: { customerId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(customerId), - queryFn: () => { - checkAcl(CustomersAcl.canUseFindById()); - return CustomersApi.findById(customerId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update customer - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.customerId Path parameter - * @param { CustomersModels.UpdateCustomerDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ customerId, data }) => { - checkAcl(CustomersAcl.canUseUpdate()); - return CustomersApi.update(customerId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { customerId } = variables; - const updateKeys = [keys.findById(customerId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeactivate` - * @summary Deactivate customer - * @permission Requires `canUseDeactivate` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeactivate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CustomersAcl.canUseDeactivate()); - return CustomersApi.deactivate(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReactivate` - * @summary Reactivate customer - * @permission Requires `canUseReactivate` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReactivate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CustomersAcl.canUseReactivate()); - return CustomersApi.reactivate(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/depots/depots.acl.ts b/test/generated/full/depots/depots.acl.ts deleted file mode 100644 index 46e2374..0000000 --- a/test/generated/full/depots/depots.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace DepotsAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Depot" -] as AbilityTuple<"Create", "Depot">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Depot" -] as AbilityTuple<"Update", "Depot">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Depot" -] as AbilityTuple<"Archive", "Depot">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "Depot" -] as AbilityTuple<"Archive", "Depot">; - -} diff --git a/test/generated/full/depots/depots.api.ts b/test/generated/full/depots/depots.api.ts deleted file mode 100644 index 0bd409f..0000000 --- a/test/generated/full/depots/depots.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DepotsModels } from "./depots.models"; - -export namespace DepotsApi { -export const create = (data: DepotsModels.CreateDepotRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots`, - ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), - config - ) -}; -export const paginate = (limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DepotsModels.DepotsPaginateResponseSchema }, - `/depots`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, - `/depots/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots/${id}`, - config - ) -}; -export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots/${id}`, - ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/depots/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/depots/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/depots/depots.configs.ts b/test/generated/full/depots/depots.configs.ts deleted file mode 100644 index 3e95aff..0000000 --- a/test/generated/full/depots/depots.configs.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DepotsModels } from "./depots.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DepotsQueries } from "./depots.queries"; -import { DepotsAcl } from "./depots.acl"; - -export namespace DepotsConfigs { -export const depotsConfig = { - meta: { - title: "Depots", - }, - readAll: { - acl: DepotsAcl.canUsePaginate, - schema: DepotsModels.DepotResponseDTOSchema, - paginated: DepotsQueries.usePaginate, - infinite: DepotsQueries.usePaginateInfinite, - filters: { - schema: DepotsModels.DepotPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DepotsModels.DepotPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DepotsModels.DepotResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - name: true, - shortName: true, - additionalInformation: true, - address: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: DepotsModels.DepotsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DepotsAcl.canUseFindById, - schema: DepotsModels.DepotResponseDTOSchema, - query: DepotsQueries.useFindById, - }, - create: { - acl: DepotsAcl.canUseCreate, - schema: DepotsModels.CreateDepotRequestDTOSchema, - mutation: DepotsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DepotsModels.CreateDepotRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - additionalInformation: true, - name: true, - street: true, - zip: true, - district: true, - cityId: true, - countryId: true, - }, - }, -}) - }, - update: { - acl: DepotsAcl.canUseUpdate, - schema: DepotsModels.UpdateDepotRequestDTOSchema, - mutation: DepotsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DepotsModels.UpdateDepotRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - additionalInformation: true, - name: true, - street: true, - zip: true, - district: true, - cityId: true, - countryId: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DepotsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DepotsQueries.usePaginateLabels, - infinite: DepotsQueries.usePaginateLabelsInfinite, - filters: { - schema: DepotsModels.DepotLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DepotsModels.DepotLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/depots/depots.models.ts b/test/generated/full/depots/depots.models.ts deleted file mode 100644 index 9ee1c5d..0000000 --- a/test/generated/full/depots/depots.models.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DepotsModels { -/** - * DepotCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type DepotCityDto = z.infer; - -/** - * DepotCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const DepotCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); -export type DepotCountryDto = z.infer; - -/** - * AddressDTOSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { DepotCityDto } city - * @property { string } district District name - * @property { DepotCountryDto } country - */ -export const AddressDTOSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: DepotCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: DepotCountryDtoSchema.nullish() }).readonly(); -export type AddressDTO = z.infer; - -/** - * DepotEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type DepotEmployeeDTO = z.infer; - -/** - * DepotResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the depot - * @property { string } matchCode Match code for the depot - * @property { string } name Name of the depot - * @property { string } shortName Short name of the depot - * @property { string } additionalInformation Additional info of the depot - * @property { AddressDTO } address Address details of the depot - * @property { boolean } archived - * @property { string } createdById - * @property { DepotEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DepotEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const DepotResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the depot"), matchCode: z.string().describe("Match code for the depot"), name: z.string().describe("Name of the depot"), shortName: z.string().describe("Short name of the depot").nullish(), additionalInformation: z.string().describe("Additional info of the depot").nullish(), address: AddressDTOSchema.describe("Address details of the depot"), archived: z.boolean(), createdById: z.string().nullish(), createdBy: DepotEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DepotEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type DepotResponseDTO = z.infer; - -/** - * CreateDepotRequestDTOSchema - * @type { object } - * @property { string } matchCode Unique identifier code for the depot - * @property { string } shortName Optional short name for the depot - * @property { string } additionalInformation - * @property { string } name Full name of the depot - * @property { string } street Street address of the depot - * @property { string } zip ZIP/Postal code - * @property { string } district District information - * @property { string } cityId City id - * @property { string } countryId Country code - */ -export const CreateDepotRequestDTOSchema = z.object({ matchCode: z.string().describe("Unique identifier code for the depot"), shortName: z.string().describe("Optional short name for the depot").nullish(), additionalInformation: z.string().nullish(), name: z.string().describe("Full name of the depot"), street: z.string().describe("Street address of the depot"), zip: z.string().describe("ZIP/Postal code"), district: z.string().describe("District information").nullish(), cityId: z.string().describe("City id"), countryId: z.string().describe("Country code") }).readonly(); -export type CreateDepotRequestDTO = z.infer; - -/** - * DepotPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter depots by name, matchCode, or shortName - * @property { boolean } archived - */ -export const DepotPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter depots by name, matchCode, or shortName"), archived: z.boolean() }).readonly(); -export type DepotPaginationFilterDto = z.infer; - -/** - * DepotLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DepotLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type DepotLabelFilterDto = z.infer; - -/** - * UpdateDepotRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code for the depot - * @property { string } shortName Updated short name - * @property { string } additionalInformation Updated short name - * @property { string } name Updated full name - * @property { string } street Updated street address - * @property { string } zip Updated ZIP/Postal code - * @property { string } district Updated district information - * @property { string } cityId Updated city id - * @property { string } countryId Updated country code - */ -export const UpdateDepotRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code for the depot"), shortName: z.string().describe("Updated short name"), additionalInformation: z.string().describe("Updated short name"), name: z.string().describe("Updated full name"), street: z.string().describe("Updated street address"), zip: z.string().describe("Updated ZIP/Postal code"), district: z.string().describe("Updated district information"), cityId: z.string().describe("Updated city id"), countryId: z.string().describe("Updated country code") }).readonly(); -export type UpdateDepotRequestDTO = z.infer; - -/** - * DepotsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const DepotsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DepotsPaginateOrderParamEnum = z.infer; -export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.enum; - -/** - * DepotsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DepotResponseDTO[] } items - */ -export const DepotsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DepotResponseDTOSchema).readonly() }).readonly().shape }); -export type DepotsPaginateResponse = z.infer; - -/** - * DepotsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DepotsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DepotsPaginateLabelsOrderParamEnum = z.infer; -export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DepotsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DepotsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type DepotsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/depots/depots.queries.ts b/test/generated/full/depots/depots.queries.ts deleted file mode 100644 index 72505fa..0000000 --- a/test/generated/full/depots/depots.queries.ts +++ /dev/null @@ -1,261 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DepotsAcl } from "./depots.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DepotsModels } from "./depots.models"; -import { DepotsApi } from "./depots.api"; - -export namespace DepotsQueries { -export const moduleName = QueryModule.Depots; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string) => [...keys.all, "/depots", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string) => [...keys.all, "/depots/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/depots/:id", id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a new depot - * @permission Requires `canUseCreate` ability - * @param { DepotsModels.CreateDepotRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(DepotsAcl.canUseCreate()); - return DepotsApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Depots - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Depots - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate depots with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate depots with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Fetch depot by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(DepotsAcl.canUseFindById()); - return DepotsApi.findById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update a depot - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { DepotsModels.UpdateDepotRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(DepotsAcl.canUseUpdate()); - return DepotsApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a depot - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(DepotsAcl.canUseArchive()); - return DepotsApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a depot - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(DepotsAcl.canUseUnarchive()); - return DepotsApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/documentTemplates/documentTemplates.acl.ts b/test/generated/full/documentTemplates/documentTemplates.acl.ts deleted file mode 100644 index 8996246..0000000 --- a/test/generated/full/documentTemplates/documentTemplates.acl.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DocumentTemplatesAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List document template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List document templates - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Create", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get document template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update document template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useAddRemarkBlock` mutation ability. For global ability, omit the object parameter. - * @description Add remark block to document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddRemarkBlock` mutation - */ -export const canUseAddRemarkBlock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useDeleteRemarkBlock` mutation ability. For global ability, omit the object parameter. - * @description Delete remark block from document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemarkBlock` mutation - */ -export const canUseDeleteRemarkBlock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Archive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -} diff --git a/test/generated/full/documentTemplates/documentTemplates.api.ts b/test/generated/full/documentTemplates/documentTemplates.api.ts deleted file mode 100644 index 496354d..0000000 --- a/test/generated/full/documentTemplates/documentTemplates.api.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; - -export namespace DocumentTemplatesApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/document-templates/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, - `/offices/${officeId}/document-templates`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates`, - ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), - config - ) -}; -export const findById = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}`, - config - ) -}; -export const update = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}`, - ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), - config - ) -}; -export const addRemarkBlock = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, - ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), - config - ) -}; -export const deleteRemarkBlock = (documentTemplateId: string, remarkBlockId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, - undefined, - config - ) -}; -export const archive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, - undefined, - config - ) -}; -export const unarchive = (documentTemplateId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/documentTemplates/documentTemplates.configs.ts b/test/generated/full/documentTemplates/documentTemplates.configs.ts deleted file mode 100644 index bb792f1..0000000 --- a/test/generated/full/documentTemplates/documentTemplates.configs.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DocumentTemplatesQueries } from "./documentTemplates.queries"; -import { DocumentTemplatesAcl } from "./documentTemplates.acl"; - -export namespace DocumentTemplatesConfigs { -export const documentTemplatesConfig = { - meta: { - title: "Document Templates", - }, - readAll: { - acl: DocumentTemplatesAcl.canUseList, - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - paginated: DocumentTemplatesQueries.useList, - infinite: DocumentTemplatesQueries.useListInfinite, - filters: { - schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, - options: { - inputs: { - isArchived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - isArchived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - blocks: true, - }, - sortable: DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DocumentTemplatesAcl.canUseFindById, - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - query: DocumentTemplatesQueries.useFindById, - }, - create: { - acl: DocumentTemplatesAcl.canUseCreate, - schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, - mutation: DocumentTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - blocks: true, - }, - }, -}) - }, - update: { - acl: DocumentTemplatesAcl.canUseUpdate, - schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, - mutation: DocumentTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - isArchived: true, - blocks: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DocumentTemplatesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DocumentTemplatesQueries.usePaginateLabels, - infinite: DocumentTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/documentTemplates/documentTemplates.models.ts b/test/generated/full/documentTemplates/documentTemplates.models.ts deleted file mode 100644 index 6916a75..0000000 --- a/test/generated/full/documentTemplates/documentTemplates.models.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DocumentTemplatesModels { -/** - * DocumentTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type DocumentTemplateEmployeeDTO = z.infer; - -/** - * DocumentTemplateResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name - * @property { boolean } isArchived - * @property { string } createdById ID of the employee who created this template - * @property { DocumentTemplateEmployeeDTO } createdBy Employee who created this template - * @property { string } createdAt - * @property { string } updatedById ID of the employee who last updated this template - * @property { DocumentTemplateEmployeeDTO } updatedBy Employee who last updated this template - * @property { string } updatedAt - * @property { CommonModels.TemplateBlocksResponseDTO } blocks - */ -export const DocumentTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isArchived: z.boolean(), createdById: z.string().describe("ID of the employee who created this template").nullish(), createdBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who created this template").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().describe("ID of the employee who last updated this template").nullish(), updatedBy: DocumentTemplateEmployeeDTOSchema.describe("Employee who last updated this template").nullish(), updatedAt: z.iso.datetime({ offset: true }), blocks: CommonModels.TemplateBlocksResponseDTOSchema }).readonly(); -export type DocumentTemplateResponseDTO = z.infer; - -/** - * TemplateBlocksDTOSchema - * @type { object } - * @property { CommonModels.TitleBlockDTO } titleBlock - * @property { CommonModels.ReceiverBlockDTO } receiverBlock - * @property { CommonModels.OurInformationBlockDTO } ourInformationBlock - * @property { CommonModels.RouteTableBlockDTO } routeTableBlock - * @property { CommonModels.CargoTableBlockDTO } cargoTableBlock - * @property { CommonModels.CargoSummaryBlockDTO } cargoSummaryBlock - * @property { CommonModels.FinanceTableBlockDTO } financeTableBlock - * @property { CommonModels.RemarkBlockDTO[] } remarkBlocks - * @property { CommonModels.FooterBlockDTO } footerBlock - * @property { CommonModels.TermsBlockDTO } termsBlock - * @property { CommonModels.CutOffDatesBlockDTO } cutOffDatesBlock - */ -export const TemplateBlocksDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema, receiverBlock: CommonModels.ReceiverBlockDTOSchema, ourInformationBlock: CommonModels.OurInformationBlockDTOSchema, routeTableBlock: CommonModels.RouteTableBlockDTOSchema, cargoTableBlock: CommonModels.CargoTableBlockDTOSchema, cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema, financeTableBlock: CommonModels.FinanceTableBlockDTOSchema, remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).readonly(), footerBlock: CommonModels.FooterBlockDTOSchema, termsBlock: CommonModels.TermsBlockDTOSchema, cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema }).readonly(); -export type TemplateBlocksDTO = z.infer; - -/** - * CreateDocumentTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { TemplateBlocksDTO } blocks - */ -export const CreateDocumentTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), blocks: TemplateBlocksDTOSchema.nullish() }).readonly(); -export type CreateDocumentTemplateRequestDTO = z.infer; - -/** - * UpdateDocumentTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { boolean } isArchived - * @property { TemplateBlocksDTO } blocks - */ -export const UpdateDocumentTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), isArchived: z.boolean(), blocks: TemplateBlocksDTOSchema }).readonly(); -export type UpdateDocumentTemplateRequestDTO = z.infer; - -/** - * CreateRemarkBlockRequestDTOSchema - * @type { object } - * @property { CommonModels.EditorContentUpdateDto } content - * @property { number } position 1-based position of the remark block. Minimum: `1` - * @property { boolean } enabled - */ -export const CreateRemarkBlockRequestDTOSchema = z.object({ content: CommonModels.EditorContentUpdateDtoSchema, position: z.number().gte(1).describe("1-based position of the remark block").nullish(), enabled: z.boolean().nullish() }).readonly(); -export type CreateRemarkBlockRequestDTO = z.infer; - -/** - * DocumentTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DocumentTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type DocumentTemplateLabelFilterDto = z.infer; - -/** - * DocumentTemplateFilterDtoSchema - * @type { object } - * @property { boolean } isArchived - * @property { string } search - */ -export const DocumentTemplateFilterDtoSchema = z.object({ isArchived: z.boolean(), search: z.string() }).readonly(); -export type DocumentTemplateFilterDto = z.infer; - -/** - * DocumentTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DocumentTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DocumentTemplatesPaginateLabelsOrderParamEnum = z.infer; -export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DocumentTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type DocumentTemplatesPaginateLabelsResponse = z.infer; - -/** - * DocumentTemplatesListOrderParamEnumSchema - * @type { enum } - */ -export const DocumentTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DocumentTemplatesListOrderParamEnum = z.infer; -export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderParamEnumSchema.enum; - -/** - * DocumentTemplatesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DocumentTemplateResponseDTO[] } items - */ -export const DocumentTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).readonly() }).readonly().shape }); -export type DocumentTemplatesListResponse = z.infer; - -} diff --git a/test/generated/full/documentTemplates/documentTemplates.queries.ts b/test/generated/full/documentTemplates/documentTemplates.queries.ts deleted file mode 100644 index 6d6f164..0000000 --- a/test/generated/full/documentTemplates/documentTemplates.queries.ts +++ /dev/null @@ -1,334 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DocumentTemplatesAcl } from "./documentTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; -import { DocumentTemplatesApi } from "./documentTemplates.api"; - -export namespace DocumentTemplatesQueries { -export const moduleName = QueryModule.DocumentTemplates; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (documentTemplateId: string, officeId: string) => [...keys.all, "/offices/:officeId/document-templates/:documentTemplateId", documentTemplateId, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate document template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate document template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List document templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); - return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List document templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); - return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new document template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId } )); - return DocumentTemplatesApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get document template by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.documentTemplateId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ documentTemplateId, officeId }: { documentTemplateId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(documentTemplateId, officeId), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId } )); - return DocumentTemplatesApi.findById(documentTemplateId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update document template by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId } )); - return DocumentTemplatesApi.update(documentTemplateId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useAddRemarkBlock` - * @summary Add a remark block to a document template - * @permission Requires `canUseAddRemarkBlock` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.CreateRemarkBlockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useAddRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId } )); - return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRemarkBlock` - * @summary Delete a remark block from a document template - * @permission Requires `canUseDeleteRemarkBlock` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.remarkBlockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId } )); - return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive document template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId } )); - return DocumentTemplatesApi.archive(documentTemplateId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive document template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId } )); - return DocumentTemplatesApi.unarchive(documentTemplateId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/dunningAccountStatement/dunningAccountStatement.acl.ts b/test/generated/full/dunningAccountStatement/dunningAccountStatement.acl.ts deleted file mode 100644 index dc538a3..0000000 --- a/test/generated/full/dunningAccountStatement/dunningAccountStatement.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningAccountStatementAcl { -/** - * Use for `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation ability. For global ability, omit the object parameter. - * @description Generate account statement - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation - */ -export const canUseGenerateAccountStatement = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetAccountStatementEml` mutation ability. For global ability, omit the object parameter. - * @description Download account statement as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAccountStatementEml` mutation - */ -export const canUseGetAccountStatementEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/full/dunningAccountStatement/dunningAccountStatement.api.ts b/test/generated/full/dunningAccountStatement/dunningAccountStatement.api.ts deleted file mode 100644 index a351427..0000000 --- a/test/generated/full/dunningAccountStatement/dunningAccountStatement.api.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningAccountStatementApi { -export const dataGenFake = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, - `/data-gen-fake/account-statement`, - config - ) -}; -export const generateAccountStatement = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/account-statement`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getAccountStatementEml = (officeId: string, data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/account-statement/eml`, - ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/full/dunningAccountStatement/dunningAccountStatement.models.ts b/test/generated/full/dunningAccountStatement/dunningAccountStatement.models.ts deleted file mode 100644 index 40e5f92..0000000 --- a/test/generated/full/dunningAccountStatement/dunningAccountStatement.models.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningAccountStatementModels { -/** - * AccountStatementPdfPayloadInvoiceDtoSchema - * @type { object } - * @property { string } number - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } dueDays - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - */ -export const AccountStatementPdfPayloadInvoiceDtoSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }), dueDays: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string() }).readonly(); -export type AccountStatementPdfPayloadInvoiceDto = z.infer; - -/** - * AccountStatementInvoicesByCurrencyAndDirectionDtoSchema - * @type { object } - * @property { string } direction - * @property { string } currency - * @property { AccountStatementPdfPayloadInvoiceDto[] } invoices - * @property { number } totalOutstandingAmount - */ -export const AccountStatementInvoicesByCurrencyAndDirectionDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema, currency: z.string(), invoices: z.array(AccountStatementPdfPayloadInvoiceDtoSchema).readonly(), totalOutstandingAmount: z.number() }).readonly(); -export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer; - -/** - * AccountStatementPdfPayloadBusinessPartnerDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - * @property { string } referenceNumber - */ -export const AccountStatementPdfPayloadBusinessPartnerDtoSchema = z.object({ name: z.string(), address: z.string().nullish(), referenceNumber: z.string().nullish() }).readonly(); -export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer; - -/** - * AccountStatementPdfPayloadBankAccountDtoSchema - * @type { object } - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - */ -export const AccountStatementPdfPayloadBankAccountDtoSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }).readonly(); -export type AccountStatementPdfPayloadBankAccountDto = z.infer; - -/** - * AccountStatementPdfPayloadDTOSchema - * @type { object } - * @property { AccountStatementPdfPayloadBusinessPartnerDto } businessPartner - * @property { AccountStatementInvoicesByCurrencyAndDirectionDto[] } invoicesByCurrencyAndDirection - * @property { AccountStatementPdfPayloadBankAccountDto } bankAccount - * @property { string } employeeName - * @property { CommonModels.ConfigBlockDto } config - */ -export const AccountStatementPdfPayloadDTOSchema = z.object({ businessPartner: AccountStatementPdfPayloadBusinessPartnerDtoSchema, invoicesByCurrencyAndDirection: z.array(AccountStatementInvoicesByCurrencyAndDirectionDtoSchema).readonly(), bankAccount: AccountStatementPdfPayloadBankAccountDtoSchema, employeeName: z.string().nullable(), config: CommonModels.ConfigBlockDtoSchema }).readonly(); -export type AccountStatementPdfPayloadDTO = z.infer; - -/** - * OfficeInvoiceListQueryDtoSchema - * @type { object } - * @property { string } order Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @property { CommonModels.OfficeInvoiceFilterDto } filter - * @property { number } limit Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - */ -export const OfficeInvoiceListQueryDtoSchema = z.object({ order: z.string().describe("Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId").nullish(), filter: CommonModels.OfficeInvoiceFilterDtoSchema.nullish(), limit: z.number().gte(1).lte(100).describe("Items per response").default(20), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish() }).readonly(); -export type OfficeInvoiceListQueryDto = z.infer; - -/** - * GenerateAccountStatementOrderParamEnumSchema - * @type { enum } - */ -export const GenerateAccountStatementOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); -export type GenerateAccountStatementOrderParamEnum = z.infer; -export const GenerateAccountStatementOrderParamEnum = GenerateAccountStatementOrderParamEnumSchema.enum; - -} diff --git a/test/generated/full/dunningAccountStatement/dunningAccountStatement.queries.ts b/test/generated/full/dunningAccountStatement/dunningAccountStatement.queries.ts deleted file mode 100644 index 6c56860..0000000 --- a/test/generated/full/dunningAccountStatement/dunningAccountStatement.queries.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningAccountStatementAcl } from "./dunningAccountStatement.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; -import { DunningAccountStatementApi } from "./dunningAccountStatement.api"; - -export namespace DunningAccountStatementQueries { -export const moduleName = QueryModule.DunningAccountStatement; - -export const keys = { - all: [moduleName] as const, - dataGenFake: () => [...keys.all, "/data-gen-fake/account-statement", ] as const, - generateAccountStatement: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", officeId, limit, order, filter, page, cursor] as const, - generateAccountStatementInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", "infinite", officeId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useDataGenFake` - * @summary Expose account statement PDF payload DTO for model generation - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useDataGenFake = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.dataGenFake(), - queryFn: () => - DunningAccountStatementApi.dataGenFake(config), - ...options, - }); -}; - -/** - * Query `useGenerateAccountStatement` - recommended when file should be cached - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGenerateAccountStatement = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Mutation `useGenerateAccountStatementMutation` - recommended when file should not be cached - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } mutation.officeId Path parameter - * @param { number } mutation.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } mutation.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } mutation.filter Query parameter - * @param { number } mutation.page Query parameter. 1-indexed page number to begin from - * @param { string } mutation.cursor Query parameter. ID of item to start after - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateAccountStatementMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, limit } = variables; - const updateKeys = [keys.generateAccountStatement(officeId, limit)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Infinite query `useGenerateAccountStatementInfinite - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGenerateAccountStatementInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useGetAccountStatementEml` - recommended when file should not be cached - * @summary Get account statement as EML file with PDF attachment - * @permission Requires `canUseGetAccountStatementEml` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningAccountStatementModels.OfficeInvoiceListQueryDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGetAccountStatementEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId } )); - return DunningAccountStatementApi.getAccountStatementEml(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/dunningLevels/dunningLevels.acl.ts b/test/generated/full/dunningLevels/dunningLevels.acl.ts deleted file mode 100644 index eb52ae7..0000000 --- a/test/generated/full/dunningLevels/dunningLevels.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningLevelsAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List dunning level labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List dunning levels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Create", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get dunning level by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Update", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive a dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Archive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive a dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Unarchive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -} diff --git a/test/generated/full/dunningLevels/dunningLevels.api.ts b/test/generated/full/dunningLevels/dunningLevels.api.ts deleted file mode 100644 index 6a93d2f..0000000 --- a/test/generated/full/dunningLevels/dunningLevels.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningLevelsModels } from "./dunningLevels.models"; - -export namespace DunningLevelsApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, - `/offices/${officeId}/dunning-levels/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, - `/offices/${officeId}/dunning-levels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: DunningLevelsModels.CreateDunningLevelRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels`, - ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), - config - ) -}; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}`, - config - ) -}; -export const update = (id: string, officeId: string, data: DunningLevelsModels.UpdateDunningLevelRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}`, - ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/dunningLevels/dunningLevels.configs.ts b/test/generated/full/dunningLevels/dunningLevels.configs.ts deleted file mode 100644 index ddfe0e9..0000000 --- a/test/generated/full/dunningLevels/dunningLevels.configs.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningLevelsModels } from "./dunningLevels.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningLevelsQueries } from "./dunningLevels.queries"; -import { DunningLevelsAcl } from "./dunningLevels.acl"; - -export namespace DunningLevelsConfigs { -export const dunningLevelsConfig = { - meta: { - title: "Dunning Levels", - }, - readAll: { - acl: DunningLevelsAcl.canUseList, - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - paginated: DunningLevelsQueries.useList, - infinite: DunningLevelsQueries.useListInfinite, - filters: { - schema: DunningLevelsModels.DunningLevelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningLevelsModels.DunningLevelFilterDtoSchema, - options: { - inputs: { - dunningSystemId: true, - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - options: { - columns: { - id: true, - level: true, - daysOverdue: true, - dunningFee: true, - interestRate: true, - usedInOfficeId: true, - usedInOffice: true, - dunningSystem: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - archived: true, - bodyRemarks: true, - footerRemarks: true, - }, - sortable: DunningLevelsModels.DunningLevelsListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DunningLevelsAcl.canUseFindById, - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - query: DunningLevelsQueries.useFindById, - }, - create: { - acl: DunningLevelsAcl.canUseCreate, - schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, - mutation: DunningLevelsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, - options: { - inputs: { - level: true, - daysOverdue: true, - dunningFee: true, - dunningSystemId: true, - interestRate: true, - bodyRemarks: true, - footerRemarks: true, - }, - }, -}) - }, - update: { - acl: DunningLevelsAcl.canUseUpdate, - schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, - mutation: DunningLevelsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, - options: { - inputs: { - level: true, - daysOverdue: true, - dunningFee: true, - interestRate: true, - dunningSystemId: true, - bodyRemarks: true, - footerRemarks: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DunningLevelsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DunningLevelsQueries.usePaginateLabels, - infinite: DunningLevelsQueries.usePaginateLabelsInfinite, - filters: { - schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/dunningLevels/dunningLevels.models.ts b/test/generated/full/dunningLevels/dunningLevels.models.ts deleted file mode 100644 index ed66cf5..0000000 --- a/test/generated/full/dunningLevels/dunningLevels.models.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningLevelsModels { -/** - * DunningLevelOfficeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } currencyNotation - */ -export const DunningLevelOfficeDTOSchema = z.object({ id: z.string(), name: z.string(), currencyNotation: z.string() }).readonly(); -export type DunningLevelOfficeDTO = z.infer; - -/** - * DunningLevelEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type DunningLevelEmployeeDTO = z.infer; - -/** - * DunningLevelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { number } level - * @property { number } daysOverdue - * @property { number } dunningFee - * @property { number } interestRate - * @property { string } usedInOfficeId - * @property { DunningLevelOfficeDTO } usedInOffice - * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem - * @property { string } createdById - * @property { DunningLevelEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DunningLevelEmployeeDTO } updatedBy - * @property { string } updatedAt - * @property { boolean } archived - * @property { CommonModels.EditorContentResponseDto } bodyRemarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks - */ -export const DunningLevelResponseDTOSchema = z.object({ id: z.string(), level: z.number(), daysOverdue: z.number(), dunningFee: z.number(), interestRate: z.number().nullish(), usedInOfficeId: z.string(), usedInOffice: DunningLevelOfficeDTOSchema.nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), createdById: z.string().nullish(), createdBy: DunningLevelEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningLevelEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), archived: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish() }).readonly(); -export type DunningLevelResponseDTO = z.infer; - -/** - * CreateDunningLevelRequestDTOSchema - * @type { object } - * @property { number } level Dunning level number. Minimum: `1` - * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` - * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` - * @property { string } dunningSystemId Dunning system ID - * @property { number } interestRate Minimum: `0`. Maximum: `100` - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const CreateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1).describe("Dunning level number"), daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), dunningSystemId: z.string().describe("Dunning system ID").nullish(), interestRate: z.number().gte(0).lte(100).nullish(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks").nullish() }).readonly(); -export type CreateDunningLevelRequestDTO = z.infer; - -/** - * UpdateDunningLevelRequestDTOSchema - * @type { object } - * @property { number } level Dunning level number. Minimum: `1` - * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` - * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` - * @property { number } interestRate Minimum: `0`. Maximum: `100` - * @property { string } dunningSystemId Dunning system ID - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1).describe("Dunning level number"), daysOverdue: z.number().gte(1).describe("Days overdue before this level applies"), dunningFee: z.number().gte(0).describe("Fee amount for this dunning level"), interestRate: z.number().gte(0).lte(100), dunningSystemId: z.string().describe("Dunning system ID"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); -export type UpdateDunningLevelRequestDTO = z.infer; - -/** - * DunningLevelLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DunningLevelLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type DunningLevelLabelFilterDto = z.infer; - -/** - * DunningLevelFilterDtoSchema - * @type { object } - * @property { string } dunningSystemId Dunning system ID to filter by - * @property { string } search Search to filter by - * @property { boolean } archived Filter by archived status - */ -export const DunningLevelFilterDtoSchema = z.object({ dunningSystemId: z.string().describe("Dunning system ID to filter by"), search: z.string().describe("Search to filter by"), archived: z.boolean().describe("Filter by archived status") }).readonly(); -export type DunningLevelFilterDto = z.infer; - -/** - * DunningLevelsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DunningLevelsPaginateLabelsOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DunningLevelsPaginateLabelsOrderParamEnum = z.infer; -export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DunningLevelsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DunningLevelsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type DunningLevelsPaginateLabelsResponse = z.infer; - -/** - * DunningLevelsListOrderParamEnumSchema - * @type { enum } - */ -export const DunningLevelsListOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DunningLevelsListOrderParamEnum = z.infer; -export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSchema.enum; - -/** - * DunningLevelsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningLevelResponseDTO[] } items - */ -export const DunningLevelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningLevelResponseDTOSchema).readonly() }).readonly().shape }); -export type DunningLevelsListResponse = z.infer; - -} diff --git a/test/generated/full/dunningLevels/dunningLevels.queries.ts b/test/generated/full/dunningLevels/dunningLevels.queries.ts deleted file mode 100644 index 98ba1a5..0000000 --- a/test/generated/full/dunningLevels/dunningLevels.queries.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningLevelsAcl } from "./dunningLevels.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningLevelsModels } from "./dunningLevels.models"; -import { DunningLevelsApi } from "./dunningLevels.api"; - -export namespace DunningLevelsQueries { -export const moduleName = QueryModule.DunningLevels; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-levels/:id", id, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate dunning level labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate dunning level labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List dunning levels - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUseList({ officeId } )); - return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List dunning levels - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningLevelsAcl.canUseList({ officeId } )); - return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create dunning level - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningLevelsModels.CreateDunningLevelRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningLevelsAcl.canUseCreate({ officeId } )); - return DunningLevelsApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get dunning level by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUseFindById({ officeId } )); - return DunningLevelsApi.findById(id, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update dunning level - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningLevelsModels.UpdateDunningLevelRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(DunningLevelsAcl.canUseUpdate({ officeId } )); - return DunningLevelsApi.update(id, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a dunning level - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningLevelsAcl.canUseArchive({ officeId } )); - return DunningLevelsApi.archive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a dunning level - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId } )); - return DunningLevelsApi.unarchive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/dunningManagement/dunningManagement.acl.ts b/test/generated/full/dunningManagement/dunningManagement.acl.ts deleted file mode 100644 index 251aea8..0000000 --- a/test/generated/full/dunningManagement/dunningManagement.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningManagementAcl { -/** - * Use for `useListDunnings` query ability. For global ability, omit the object parameter. - * @description List dunnings - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListDunnings` query - */ -export const canUseListDunnings = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Dunning", object) : "Dunning" -] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - -/** - * Use for `useCreateDunningWithInvoices` mutation ability. For global ability, omit the object parameter. - * @description Create dunning - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDunningWithInvoices` mutation - */ -export const canUseCreateDunningWithInvoices = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Dunning", object) : "Dunning" -] as AbilityTuple<"Create", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - -/** - * Use for `useGetDunningEml` query or `useGetDunningEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download dunning as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDunningEml` query or `useGetDunningEmlMutation` mutation - */ -export const canUseGetDunningEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Dunning", object) : "Dunning" -] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - -} diff --git a/test/generated/full/dunningManagement/dunningManagement.api.ts b/test/generated/full/dunningManagement/dunningManagement.api.ts deleted file mode 100644 index 7445607..0000000 --- a/test/generated/full/dunningManagement/dunningManagement.api.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningManagementModels } from "./dunningManagement.models"; - -export namespace DunningManagementApi { -export const listDunnings = (officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningManagementModels.ListDunningsResponseSchema }, - `/offices/${officeId}/dunnings`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createDunningWithInvoices = (partnerId: string, officeId: string, data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningManagementModels.DunningResponseDtoSchema }, - `/offices/${officeId}/partners/${partnerId}/dunnings`, - ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), - config - ) -}; -export const dataGenFake = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, - `/data-gen-fake`, - config - ) -}; -export const getDunningEml = (officeId: string, dunningId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/dunnings/${dunningId}/eml`, - { - ...config, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/full/dunningManagement/dunningManagement.configs.ts b/test/generated/full/dunningManagement/dunningManagement.configs.ts deleted file mode 100644 index 6c09ba7..0000000 --- a/test/generated/full/dunningManagement/dunningManagement.configs.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningManagementModels } from "./dunningManagement.models"; -import { DunningManagementQueries } from "./dunningManagement.queries"; -import { DunningManagementAcl } from "./dunningManagement.acl"; - -export namespace DunningManagementConfigs { -export const dunningsConfig = { - meta: { - title: "Dunnings", - }, - readAll: { - acl: DunningManagementAcl.canUseListDunnings, - schema: DunningManagementModels.DunningResponseDtoSchema, - paginated: DunningManagementQueries.useListDunnings, - infinite: DunningManagementQueries.useListDunningsInfinite, - filters: { - schema: DunningManagementModels.DunningFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningManagementModels.DunningFilterDtoSchema, - options: { - inputs: { - status: true, - partnerId: true, - level: true, - outstandingAmountMin: true, - outstandingAmountMax: true, - createdFrom: true, - createdTo: true, - confirmedBy: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningManagementModels.DunningResponseDtoSchema, - options: { - columns: { - id: true, - partner: true, - level: true, - dunningLevelId: true, - status: true, - invoiceCount: true, - outstandingAmount: true, - currencyNotation: true, - daysOverdue: true, - dunningFee: true, - createdAt: true, - statusChangedOn: true, - confirmedBy: true, - documentUrl: true, - }, - sortable: DunningManagementModels.ListDunningsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/dunningManagement/dunningManagement.models.ts b/test/generated/full/dunningManagement/dunningManagement.models.ts deleted file mode 100644 index 9ab47ce..0000000 --- a/test/generated/full/dunningManagement/dunningManagement.models.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningManagementModels { -/** - * DunningPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const DunningPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); -export type DunningPartnerDto = z.infer; - -/** - * DunningConfirmedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type DunningConfirmedByDto = z.infer; - -/** - * DunningStatusSchema - * @type { enum } - */ -export const DunningStatusSchema = z.enum(["PREPARED", "ISSUED"]); -export type DunningStatus = z.infer; -export const DunningStatus = DunningStatusSchema.enum; - -/** - * DunningResponseDtoSchema - * @type { object } - * @property { string } id - * @property { DunningPartnerDto } partner - * @property { number } level - * @property { string } dunningLevelId - * @property { string } status - * @property { number } invoiceCount - * @property { number } outstandingAmount - * @property { string } currencyNotation - * @property { number } daysOverdue - * @property { number } dunningFee - * @property { string } createdAt - * @property { string } statusChangedOn - * @property { DunningConfirmedByDto } confirmedBy - * @property { string } documentUrl - */ -export const DunningResponseDtoSchema = z.object({ id: z.string(), partner: DunningPartnerDtoSchema, level: z.number(), dunningLevelId: z.string().nullish(), status: DunningStatusSchema, invoiceCount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number(), dunningFee: z.number(), createdAt: z.iso.datetime({ offset: true }), statusChangedOn: z.iso.datetime({ offset: true }), confirmedBy: DunningConfirmedByDtoSchema.nullish(), documentUrl: z.string().nullish() }).readonly(); -export type DunningResponseDto = z.infer; - -/** - * DunningFilterDtoSchema - * @type { object } - * @property { DunningStatus[] } status - * @property { string } partnerId Partner ID to filter by - * @property { array[] } level Dunning level(s) to filter by - * @property { number } outstandingAmountMin Minimum outstanding amount - * @property { number } outstandingAmountMax Maximum outstanding amount - * @property { string } createdFrom Created from (ISO date string) - * @property { string } createdTo Created to (ISO date string) - * @property { string } confirmedBy Confirmed by employee ID - */ -export const DunningFilterDtoSchema = z.object({ status: z.array(DunningStatusSchema).readonly(), partnerId: z.string().describe("Partner ID to filter by"), level: z.array(z.array(z.any()).readonly()).readonly().describe("Dunning level(s) to filter by"), outstandingAmountMin: z.number().describe("Minimum outstanding amount"), outstandingAmountMax: z.number().describe("Maximum outstanding amount"), createdFrom: z.iso.datetime({ offset: true }).describe("Created from (ISO date string)"), createdTo: z.iso.datetime({ offset: true }).describe("Created to (ISO date string)"), confirmedBy: z.string().describe("Confirmed by employee ID") }).readonly(); -export type DunningFilterDto = z.infer; - -/** - * DunningPdfConfigDTOSchema - * @type { object } - * @property { string } headerImageUrl - * @property { string } footerImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ -export const DunningPdfConfigDTOSchema = z.object({ headerImageUrl: z.string(), footerImageUrl: z.string(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); -export type DunningPdfConfigDTO = z.infer; - -/** - * DunningPdfBusinessPartnerDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } address - * @property { string } referenceNumber - */ -export const DunningPdfBusinessPartnerDTOSchema = z.object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }).readonly(); -export type DunningPdfBusinessPartnerDTO = z.infer; - -/** - * DunningPdfInvoiceDTOSchema - * @type { object } - * @property { string } invoiceNumber - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } daysOverdue - * @property { number } dunningLevel - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - * @property { number } interest - */ -export const DunningPdfInvoiceDTOSchema = z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }).nullish(), daysOverdue: z.number(), dunningLevel: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), interest: z.number().nullish() }).readonly(); -export type DunningPdfInvoiceDTO = z.infer; - -/** - * DunningPdfTotalDTOSchema - * @type { object } - * @property { number } invoicesSum - * @property { number } dunningFee - * @property { number } interest - * @property { string } currencyNotation - */ -export const DunningPdfTotalDTOSchema = z.object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }).readonly(); -export type DunningPdfTotalDTO = z.infer; - -/** - * DunningPdfBankAccountDTOSchema - * @type { object } - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - */ -export const DunningPdfBankAccountDTOSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }).readonly(); -export type DunningPdfBankAccountDTO = z.infer; - -/** - * DunningPdfUpcomingInvoiceDTOSchema - * @type { object } - * @property { string } number - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } dueDays - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - */ -export const DunningPdfUpcomingInvoiceDTOSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), dueDays: z.number().nullish(), invoiceAmount: z.number().nullish(), outstandingAmount: z.number().nullish(), currencyNotation: z.string().nullish() }).readonly(); -export type DunningPdfUpcomingInvoiceDTO = z.infer; - -/** - * DunningPdfPayloadDTOSchema - * @type { object } - * @property { string } dunningId - * @property { number } dunningLevel - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { DunningPdfBusinessPartnerDTO } businessPartner - * @property { DunningPdfInvoiceDTO[] } invoices - * @property { DunningPdfTotalDTO } total - * @property { DunningPdfBankAccountDTO } bankAccount - * @property { string } employeeName - * @property { DunningPdfConfigDTO } config - * @property { CommonModels.LanguageEnum } language - * @property { DunningPdfUpcomingInvoiceDTO[] } upcomingInvoices - */ -export const DunningPdfPayloadDTOSchema = z.object({ dunningId: z.string(), dunningLevel: z.number(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), businessPartner: DunningPdfBusinessPartnerDTOSchema, invoices: z.array(DunningPdfInvoiceDTOSchema).readonly(), total: DunningPdfTotalDTOSchema, bankAccount: DunningPdfBankAccountDTOSchema, employeeName: z.string().nullable(), config: DunningPdfConfigDTOSchema, language: CommonModels.LanguageEnumSchema.nullish(), upcomingInvoices: z.array(DunningPdfUpcomingInvoiceDTOSchema).readonly().nullish() }).readonly(); -export type DunningPdfPayloadDTO = z.infer; - -/** - * CreateDunningWithInvoicesRequestDTOSchema - * @type { object } - * @property { string[] } invoiceIds Array of outstanding invoice IDs to include in the dunning. Example: `123e4567-e89b-12d3-a456-426614174000,123e4567-e89b-12d3-a456-426614174001` - * @property { string } dunningLevelId The ID of the dunning level to use for this dunning. Example: `123e4567-e89b-12d3-a456-426614174002` - * @property { number } dunningFee Optional dunning fee to use. If not provided, the fee from the dunning level will be used. Minimum: `0`. Example: `25.5` - * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` - * @property { boolean } includeUpcomingInvoices - */ -export const CreateDunningWithInvoicesRequestDTOSchema = z.object({ invoiceIds: z.array(z.string()).readonly().describe("Array of outstanding invoice IDs to include in the dunning"), dunningLevelId: z.string().describe("The ID of the dunning level to use for this dunning"), dunningFee: z.number().gte(0).describe("Optional dunning fee to use. If not provided, the fee from the dunning level will be used").nullish(), interestRate: z.number().gte(0).lte(100).nullish(), includeUpcomingInvoices: z.boolean().nullish() }).readonly(); -export type CreateDunningWithInvoicesRequestDTO = z.infer; - -/** - * ListDunningsOrderParamEnumSchema - * @type { enum } - */ -export const ListDunningsOrderParamEnumSchema = z.enum(["createdAt", "level", "outstandingAmount", "statusChangedOn"]); -export type ListDunningsOrderParamEnum = z.infer; -export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; - -/** - * ListDunningsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningResponseDto[] } items - */ -export const ListDunningsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningResponseDtoSchema).readonly() }).readonly().shape }); -export type ListDunningsResponse = z.infer; - -} diff --git a/test/generated/full/dunningManagement/dunningManagement.queries.ts b/test/generated/full/dunningManagement/dunningManagement.queries.ts deleted file mode 100644 index db162c4..0000000 --- a/test/generated/full/dunningManagement/dunningManagement.queries.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningManagementAcl } from "./dunningManagement.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningManagementModels } from "./dunningManagement.models"; -import { DunningManagementApi } from "./dunningManagement.api"; - -export namespace DunningManagementQueries { -export const moduleName = QueryModule.DunningManagement; - -export const keys = { - all: [moduleName] as const, - listDunnings: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", officeId, limit, order, filter, page, cursor] as const, - listDunningsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", "infinite", officeId, limit, order, filter, cursor] as const, - dataGenFake: () => [...keys.all, "/data-gen-fake", ] as const, - getDunningEml: (officeId: string, dunningId: string) => [...keys.all, "/offices/:officeId/dunnings/:dunningId/eml", officeId, dunningId] as const, -}; - -/** - * Query `useListDunnings` - * @summary List dunnings for an office - * @permission Requires `canUseListDunnings` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` - * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListDunnings = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListDunningsInfinite - * @summary List dunnings for an office - * @permission Requires `canUseListDunnings` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` - * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListDunningsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateDunningWithInvoices` - * @summary Create a dunning with outstanding invoices - * @permission Requires `canUseCreateDunningWithInvoices` ability - * @param { string } mutation.partnerId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningManagementModels.CreateDunningWithInvoicesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateDunningWithInvoices = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ partnerId, officeId, data }) => { - checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId } )); - return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useDataGenFake` - * @summary Expose dunning PDF payload DTO for model generation - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useDataGenFake = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.dataGenFake(), - queryFn: () => - DunningManagementApi.dataGenFake(config), - ...options, - }); -}; - -/** - * Query `useGetDunningEml` - recommended when file should be cached - * @summary Get dunning as EML file with PDF attachment - * @permission Requires `canUseGetDunningEml` ability - * @param { string } object.officeId Path parameter - * @param { string } object.dunningId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetDunningEml = ({ officeId, dunningId }: { officeId: string, dunningId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDunningEml(officeId, dunningId), - queryFn: () => { - checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); - return DunningManagementApi.getDunningEml(officeId, dunningId, config) }, - ...options, - }); -}; - -/** - * Mutation `useGetDunningEmlMutation` - recommended when file should not be cached - * @summary Get dunning as EML file with PDF attachment - * @permission Requires `canUseGetDunningEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.dunningId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetDunningEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, dunningId }) => { - checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); - return DunningManagementApi.getDunningEml(officeId, dunningId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, dunningId } = variables; - const updateKeys = [keys.getDunningEml(officeId, dunningId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts deleted file mode 100644 index 4294b32..0000000 --- a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningPartnerOutstandingInvoicesAcl { -/** - * Use for `useListPartnerOutstandingInvoiceSummaries` query ability. For global ability, omit the object parameter. - * @description List office outstanding invoice summaries per partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoiceSummaries` query - */ -export const canUseListPartnerOutstandingInvoiceSummaries = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useListPartnerOutstandingInvoices` query ability. For global ability, omit the object parameter. - * @description List partner outstanding invoices - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoices` query - */ -export const canUseListPartnerOutstandingInvoices = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useListRecommendedDunningLevels` mutation ability. For global ability, omit the object parameter. - * @description List recommended dunning levels for a partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRecommendedDunningLevels` mutation - */ -export const canUseListRecommendedDunningLevels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts deleted file mode 100644 index 1b8014c..0000000 --- a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; - -export namespace DunningPartnerOutstandingInvoicesApi { -export const listPartnerOutstandingInvoiceSummaries = (officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, - `/offices/${officeId}/partner-outstanding-invoices`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listPartnerOutstandingInvoices = (partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, - `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listRecommendedDunningLevels = (partnerId: string, officeId: string, data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, - `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, - ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts deleted file mode 100644 index 3fc3451..0000000 --- a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; -import { DunningPartnerOutstandingInvoicesQueries } from "./dunningPartnerOutstandingInvoices.queries"; -import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; - -export namespace DunningPartnerOutstandingInvoicesConfigs { -export const partnerOutstandingInvoicesConfig = { - meta: { - title: "Partner Outstanding Invoices", - }, - readAll: { - acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries, - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, - paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummaries, - infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummariesInfinite, - filters: { - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, - options: { - inputs: { - search: true, - daysOverdueMin: true, - partnerId: true, - outstandingAmountMin: true, - currency: true, - dunningSystemId: true, - lastDunningDate: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, - options: { - columns: { - partnerId: true, - partnerName: true, - partnerCountry: true, - dunningSystemId: true, - dunningSystemName: true, - invoiceCount: true, - daysOverdue: true, - outstandingAmount: true, - currencyNotation: true, - lastDunningDate: true, - }, - sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, - }, -}), - }, -}; - -export const outstandingInvoicesConfig = { - meta: { - title: "Outstanding Invoices", - }, - readAll: { - acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices, - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, - paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoices, - infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoicesInfinite, - filters: { - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, - options: { - inputs: { - partnerId: true, - currency: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, - options: { - columns: { - invoiceId: true, - invoiceNumber: true, - invoiceDate: true, - invoiceAmount: true, - owedAmount: true, - currencyNotation: true, - daysOverdue: true, - dueDate: true, - invoiceInReview: true, - dunningBlock: true, - }, - sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts deleted file mode 100644 index 7adfe1f..0000000 --- a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningPartnerOutstandingInvoicesModels { -/** - * PartnerOutstandingInvoiceSummaryFilterDtoSchema - * @type { object } - * @property { string } search Search string (partner name) - * @property { number } daysOverdueMin Minimum days overdue - * @property { string } partnerId Partner ID - * @property { number } outstandingAmountMin Minimum outstanding amount - * @property { string } currency Currency - * @property { string } dunningSystemId Dunning system ID - * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range - */ -export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z.object({ search: z.string().describe("Search string (partner name)"), daysOverdueMin: z.number().describe("Minimum days overdue"), partnerId: z.string().describe("Partner ID"), outstandingAmountMin: z.number().describe("Minimum outstanding amount"), currency: z.string().describe("Currency"), dunningSystemId: z.string().describe("Dunning system ID"), lastDunningDate: CommonModels.DateRangeDtoSchema.describe("Last dunning date range") }).readonly(); -export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer; - -/** - * PartnerOutstandingInvoiceSummaryResponseDtoSchema - * @type { object } - * @property { string } partnerId Business partner ID - * @property { string } partnerName Business partner name - * @property { string } partnerCountry Business partner country - * @property { string } dunningSystemId Dunning system ID - * @property { string } dunningSystemName Dunning system name - * @property { number } invoiceCount Number of outstanding invoices - * @property { number } daysOverdue Maximum days overdue across all partner invoices - * @property { number } outstandingAmount Total outstanding amount - * @property { string } currencyNotation Currency of partner invoices - * @property { string } lastDunningDate Date of the most recent issued dunning document - */ -export const PartnerOutstandingInvoiceSummaryResponseDtoSchema = z.object({ partnerId: z.string().describe("Business partner ID"), partnerName: z.string().describe("Business partner name"), partnerCountry: z.string().describe("Business partner country").nullish(), dunningSystemId: z.string().describe("Dunning system ID"), dunningSystemName: z.string().describe("Dunning system name"), invoiceCount: z.number().describe("Number of outstanding invoices"), daysOverdue: z.number().describe("Maximum days overdue across all partner invoices").nullish(), outstandingAmount: z.number().describe("Total outstanding amount"), currencyNotation: z.string().describe("Currency of partner invoices"), lastDunningDate: z.iso.datetime({ offset: true }).describe("Date of the most recent issued dunning document").nullish() }).readonly(); -export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer; - -/** - * PartnerOutstandingInvoiceResponseDtoSchema - * @type { object } - * @property { string } invoiceId Invoice ID - * @property { string } invoiceNumber Invoice number - * @property { string } invoiceDate Invoice date - * @property { number } invoiceAmount Invoice amount - * @property { number } owedAmount Owed amount - * @property { string } currencyNotation Currency notation - * @property { number } daysOverdue Days overdue - * @property { string } dueDate Due date - * @property { boolean } invoiceInReview - * @property { boolean } dunningBlock - */ -export const PartnerOutstandingInvoiceResponseDtoSchema = z.object({ invoiceId: z.string().describe("Invoice ID"), invoiceNumber: z.string().describe("Invoice number").nullish(), invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date").nullish(), invoiceAmount: z.number().describe("Invoice amount"), owedAmount: z.number().describe("Owed amount"), currencyNotation: z.string().describe("Currency notation"), daysOverdue: z.number().describe("Days overdue").nullish(), dueDate: z.iso.datetime({ offset: true }).describe("Due date").nullish(), invoiceInReview: z.boolean().nullish(), dunningBlock: z.boolean().nullish() }).readonly(); -export type PartnerOutstandingInvoiceResponseDto = z.infer; - -/** - * PartnerOutstandingInvoiceFilterDtoSchema - * @type { object } - * @property { string } partnerId Partner ID to filter by - * @property { string } currency Invoice currency notation to filter by - */ -export const PartnerOutstandingInvoiceFilterDtoSchema = z.object({ partnerId: z.string().describe("Partner ID to filter by"), currency: z.string().describe("Invoice currency notation to filter by") }).readonly(); -export type PartnerOutstandingInvoiceFilterDto = z.infer; - -/** - * RecommendedDunningLevelsRequestDtoSchema - * @type { object } - * @property { string[] } invoiceIds Invoice IDs used to calculate the recommended dunning level. Min Items: `1`. Example: `123e4567-e89b-12d3-a456-426614174000` - */ -export const RecommendedDunningLevelsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).readonly().min(1).describe("Invoice IDs used to calculate the recommended dunning level") }).readonly(); -export type RecommendedDunningLevelsRequestDto = z.infer; - -/** - * RecommendedLabelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { boolean } isRecommended - */ -export const RecommendedLabelResponseDtoSchema = z.object({ id: z.string(), label: z.string(), isRecommended: z.boolean() }).readonly(); -export type RecommendedLabelResponseDto = z.infer; - -/** - * ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema - * @type { enum } - */ -export const ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema = z.enum(["outstandingAmount", "daysOverdue", "lastDunningDate", "invoiceCount", "partnerCountry", "partnerName", "dunningSystemName"]); -export type ListPartnerOutstandingInvoiceSummariesOrderParamEnum = z.infer; -export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema.enum; - -/** - * ListPartnerOutstandingInvoiceSummariesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items - */ -export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).readonly() }).readonly().shape }); -export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer; - -/** - * ListPartnerOutstandingInvoicesOrderParamEnumSchema - * @type { enum } - */ -export const ListPartnerOutstandingInvoicesOrderParamEnumSchema = z.enum(["dueDate", "invoiceDate", "owedAmount"]); -export type ListPartnerOutstandingInvoicesOrderParamEnum = z.infer; -export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandingInvoicesOrderParamEnumSchema.enum; - -/** - * ListPartnerOutstandingInvoicesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerOutstandingInvoiceResponseDto[] } items - */ -export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).readonly() }).readonly().shape }); -export type ListPartnerOutstandingInvoicesResponse = z.infer; - -/** - * ListRecommendedDunningLevelsResponseSchema - * @type { array } - */ -export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema).readonly(); -export type ListRecommendedDunningLevelsResponse = z.infer; - -} diff --git a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts b/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts deleted file mode 100644 index 4a777fa..0000000 --- a/test/generated/full/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; -import { DunningPartnerOutstandingInvoicesApi } from "./dunningPartnerOutstandingInvoices.api"; - -export namespace DunningPartnerOutstandingInvoicesQueries { -export const moduleName = QueryModule.DunningPartnerOutstandingInvoices; - -export const keys = { - all: [moduleName] as const, - listPartnerOutstandingInvoiceSummaries: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", officeId, limit, order, filter, page, cursor] as const, - listPartnerOutstandingInvoiceSummariesInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", "infinite", officeId, limit, order, filter, cursor] as const, - listPartnerOutstandingInvoices: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", partnerId, officeId, limit, order, filter, page, cursor] as const, - listPartnerOutstandingInvoicesInfinite: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", "infinite", partnerId, officeId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useListPartnerOutstandingInvoiceSummaries` - * @summary List office outstanding invoice summaries per partner - * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoiceSummaries = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListPartnerOutstandingInvoiceSummariesInfinite - * @summary List office outstanding invoice summaries per partner - * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoiceSummariesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListPartnerOutstandingInvoices` - * @summary List outstanding invoices for a specific partner - * @permission Requires `canUseListPartnerOutstandingInvoices` ability - * @param { string } object.partnerId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoices = ({ partnerId, officeId, limit, order, filter, page, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListPartnerOutstandingInvoicesInfinite - * @summary List outstanding invoices for a specific partner - * @permission Requires `canUseListPartnerOutstandingInvoices` ability - * @param { string } object.partnerId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoicesInfinite = ({ partnerId, officeId, limit, order, filter, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useListRecommendedDunningLevels` - * @summary List recommended dunning levels for a partner - * @permission Requires `canUseListRecommendedDunningLevels` ability - * @param { string } mutation.partnerId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useListRecommendedDunningLevels = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ partnerId, officeId, data }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/dunningSystems/dunningSystems.acl.ts b/test/generated/full/dunningSystems/dunningSystems.acl.ts deleted file mode 100644 index 14c8307..0000000 --- a/test/generated/full/dunningSystems/dunningSystems.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningSystemsAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List dunning system labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List dunning systems - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Create", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get dunning system by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Update", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -} diff --git a/test/generated/full/dunningSystems/dunningSystems.api.ts b/test/generated/full/dunningSystems/dunningSystems.api.ts deleted file mode 100644 index 2b609b0..0000000 --- a/test/generated/full/dunningSystems/dunningSystems.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningSystemsModels } from "./dunningSystems.models"; - -export namespace DunningSystemsApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, - `/offices/${officeId}/dunning-systems/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, - `/offices/${officeId}/dunning-systems`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: DunningSystemsModels.CreateDunningSystemRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems`, - ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), - config - ) -}; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}`, - config - ) -}; -export const update = (id: string, officeId: string, data: DunningSystemsModels.UpdateDunningSystemRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}`, - ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/dunningSystems/dunningSystems.configs.ts b/test/generated/full/dunningSystems/dunningSystems.configs.ts deleted file mode 100644 index 9040265..0000000 --- a/test/generated/full/dunningSystems/dunningSystems.configs.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningSystemsModels } from "./dunningSystems.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningSystemsQueries } from "./dunningSystems.queries"; -import { DunningSystemsAcl } from "./dunningSystems.acl"; - -export namespace DunningSystemsConfigs { -export const dunningSystemsConfig = { - meta: { - title: "Dunning Systems", - }, - readAll: { - acl: DunningSystemsAcl.canUsePaginate, - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - paginated: DunningSystemsQueries.usePaginate, - infinite: DunningSystemsQueries.usePaginateInfinite, - filters: { - schema: DunningSystemsModels.DunningSystemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningSystemsModels.DunningSystemFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - isDefault: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - isDefault: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DunningSystemsAcl.canUseFindById, - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - query: DunningSystemsQueries.useFindById, - }, - create: { - acl: DunningSystemsAcl.canUseCreate, - schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, - mutation: DunningSystemsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, - options: { - inputs: { - name: true, - isDefault: true, - }, - }, -}) - }, - update: { - acl: DunningSystemsAcl.canUseUpdate, - schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, - mutation: DunningSystemsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, - options: { - inputs: { - name: true, - isDefault: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DunningSystemsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DunningSystemsQueries.usePaginateLabels, - infinite: DunningSystemsQueries.usePaginateLabelsInfinite, - filters: { - schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/dunningSystems/dunningSystems.models.ts b/test/generated/full/dunningSystems/dunningSystems.models.ts deleted file mode 100644 index df46055..0000000 --- a/test/generated/full/dunningSystems/dunningSystems.models.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningSystemsModels { -/** - * DunningSystemEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type DunningSystemEmployeeDTO = z.infer; - -/** - * DunningSystemResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name - * @property { boolean } isDefault - * @property { boolean } archived - * @property { string } archivedAt - * @property { string } createdById - * @property { DunningSystemEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DunningSystemEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const DunningSystemResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isDefault: z.boolean(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: DunningSystemEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningSystemEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type DunningSystemResponseDTO = z.infer; - -/** - * DunningSystemLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DunningSystemLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type DunningSystemLabelFilterDto = z.infer; - -/** - * DunningSystemFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - * @property { boolean } isDefault - */ -export const DunningSystemFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean(), isDefault: z.boolean() }).readonly(); -export type DunningSystemFilterDto = z.infer; - -/** - * CreateDunningSystemRequestDTOSchema - * @type { object } - * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` - * @property { boolean } isDefault Is default dunning system - */ -export const CreateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100).describe("Dunning system name"), isDefault: z.boolean().describe("Is default dunning system").nullish() }).readonly(); -export type CreateDunningSystemRequestDTO = z.infer; - -/** - * UpdateDunningSystemRequestDTOSchema - * @type { object } - * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` - * @property { boolean } isDefault Is default dunning system - */ -export const UpdateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100).describe("Dunning system name"), isDefault: z.boolean().describe("Is default dunning system") }).readonly(); -export type UpdateDunningSystemRequestDTO = z.infer; - -/** - * DunningSystemsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DunningSystemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); -export type DunningSystemsPaginateLabelsOrderParamEnum = z.infer; -export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DunningSystemsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DunningSystemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type DunningSystemsPaginateLabelsResponse = z.infer; - -/** - * DunningSystemsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const DunningSystemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); -export type DunningSystemsPaginateOrderParamEnum = z.infer; -export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderParamEnumSchema.enum; - -/** - * DunningSystemsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningSystemResponseDTO[] } items - */ -export const DunningSystemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningSystemResponseDTOSchema).readonly() }).readonly().shape }); -export type DunningSystemsPaginateResponse = z.infer; - -} diff --git a/test/generated/full/dunningSystems/dunningSystems.queries.ts b/test/generated/full/dunningSystems/dunningSystems.queries.ts deleted file mode 100644 index a25f0a7..0000000 --- a/test/generated/full/dunningSystems/dunningSystems.queries.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningSystemsAcl } from "./dunningSystems.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningSystemsModels } from "./dunningSystems.models"; -import { DunningSystemsApi } from "./dunningSystems.api"; - -export namespace DunningSystemsQueries { -export const moduleName = QueryModule.DunningSystems; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-systems/:id", id, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate dunning system labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate dunning system labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary List dunning systems - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); - return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary List dunning systems - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); - return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create dunning system - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningSystemsModels.CreateDunningSystemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningSystemsAcl.canUseCreate({ officeId } )); - return DunningSystemsApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get dunning system by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUseFindById({ officeId } )); - return DunningSystemsApi.findById(id, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update dunning system - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningSystemsModels.UpdateDunningSystemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(DunningSystemsAcl.canUseUpdate({ officeId } )); - return DunningSystemsApi.update(id, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive dunning system - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningSystemsAcl.canUseArchive({ officeId } )); - return DunningSystemsApi.archive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive dunning system - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId } )); - return DunningSystemsApi.unarchive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/employee/employee.acl.ts b/test/generated/full/employee/employee.acl.ts deleted file mode 100644 index e796e7e..0000000 --- a/test/generated/full/employee/employee.acl.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmployeeAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List employees - * @param { string } object.officeId officeId from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId?: string, } -) => [ - "Read", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new employee - * @param { string } object.officeId officeId from mutation data - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId?: string, } -) => [ - "Create", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; - -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Employee" -] as AbilityTuple<"Read", "Employee">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Employee" -] as AbilityTuple<"Read", "Employee">; - -/** - * Use for `useResendOnboardingWithOffice` mutation ability. For global ability, omit the object parameter. - * @description Resend employee onboarding email - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useResendOnboardingWithOffice` mutation - */ -export const canUseResendOnboardingWithOffice = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - -/** - * Use for `useGet` query ability. - * @description Read Office Employee - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( -) => [ - "Read", - "Employee" -] as AbilityTuple<"Read", "Employee">; - -/** - * Use for `useUpdate` mutation ability. - * @description Update Office Employee - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Employee" -] as AbilityTuple<"Update", "Employee">; - -/** - * Use for `useGetWithOffice` query ability. For global ability, omit the object parameter. - * @description Read Office Employee - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetWithOffice` query - */ -export const canUseGetWithOffice = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - -/** - * Use for `useUpdateWithOffice` mutation ability. For global ability, omit the object parameter. - * @description Update Office Employee - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateWithOffice` mutation - */ -export const canUseUpdateWithOffice = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Update", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - -/** - * Use for `useListRoles` query ability. - * @description List employee (global) roles - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query - */ -export const canUseListRoles = ( -) => [ - "ListRoles", - "Employee" -] as AbilityTuple<"ListRoles", "Employee">; - -/** - * Use for `useUpdateRoles` mutation ability. - * @description Update employee (global) roles - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation - */ -export const canUseUpdateRoles = ( -) => [ - "UpdateRoles", - "Employee" -] as AbilityTuple<"UpdateRoles", "Employee">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Employee" -] as AbilityTuple<"Archive", "Employee">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Unarchive", - "Employee" -] as AbilityTuple<"Unarchive", "Employee">; - -} diff --git a/test/generated/full/employee/employee.api.ts b/test/generated/full/employee/employee.api.ts deleted file mode 100644 index e7cb049..0000000 --- a/test/generated/full/employee/employee.api.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeModels } from "./employee.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeApi { -export const paginate = (limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeePaginateResponseSchema }, - `/employees`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: EmployeeModels.EmployeeCreateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees`, - ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), - config - ) -}; -export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/one-step`, - ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), - config - ) -}; -export const findAll = (search?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, - `/employees/labels`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, - `/employees/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const resendOnboarding = (employeeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/employees/${employeeId}/resend-onboarding`, - undefined, - config - ) -}; -export const resendOnboardingWithOffice = (officeId: string, employeeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, - undefined, - config - ) -}; -export const get = (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}`, - { - ...config, - params: { - populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - }, - } - ) -}; -export const update = (employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}`, - ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - config - ) -}; -export const getWithOffice = (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/offices/${officeId}/employees/${employeeId}`, - { - ...config, - params: { - populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - }, - } - ) -}; -export const updateWithOffice = (officeId: string, employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/offices/${officeId}/employees/${employeeId}`, - ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - config - ) -}; -export const listRoles = (employeeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, - `/employees/${employeeId}/roles`, - config - ) -}; -export const updateRoles = (employeeId: string, data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, - `/employees/${employeeId}/roles`, - ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), - config - ) -}; -export const archive = (employeeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}/archive`, - undefined, - config - ) -}; -export const unarchive = (employeeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/employee/employee.configs.ts b/test/generated/full/employee/employee.configs.ts deleted file mode 100644 index 1288db2..0000000 --- a/test/generated/full/employee/employee.configs.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeeModels } from "./employee.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeQueries } from "./employee.queries"; -import { EmployeeAcl } from "./employee.acl"; - -export namespace EmployeeConfigs { -export const employeesConfig = { - meta: { - title: "Employees", - }, - readAll: { - acl: EmployeeAcl.canUsePaginate, - schema: EmployeeModels.EmployeeResponseSchema, - paginated: EmployeeQueries.usePaginate, - infinite: EmployeeQueries.usePaginateInfinite, - filters: { - schema: EmployeeModels.EmployeeFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeFilterDtoSchema, - options: { - inputs: { - office: true, - roles: true, - primaryOfficeId: true, - firstName: true, - lastName: true, - email: true, - ids: true, - archived: true, - search: true, - officeRole: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: EmployeeModels.EmployeeResponseSchema, - options: { - columns: { - id: true, - email: true, - firstName: true, - lastName: true, - locale: true, - phone: true, - archived: true, - primaryOfficeId: true, - primaryOffice: true, - employments: true, - roles: true, - createdAt: true, - updatedAt: true, - }, - sortable: EmployeeModels.EmployeePaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: EmployeeAcl.canUseGet, - schema: EmployeeModels.EmployeeResponseSchema, - query: EmployeeQueries.useGet, - }, - create: { - acl: EmployeeAcl.canUseCreate, - schema: EmployeeModels.EmployeeCreateRequestSchema, - mutation: EmployeeQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeCreateRequestSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - locale: true, - primaryOfficeId: true, - phone: true, - }, - }, -}) - }, - update: { - acl: EmployeeAcl.canUseUpdate, - schema: EmployeeModels.EmployeeUpdateRequestSchema, - mutation: EmployeeQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeUpdateRequestSchema, - options: { - inputs: { - firstName: true, - lastName: true, - phone: true, - locale: true, - primaryOfficeId: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: EmployeeAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: EmployeeQueries.usePaginateLabels, - infinite: EmployeeQueries.usePaginateLabelsInfinite, - filters: { - schema: EmployeeModels.EmployeeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/employee/employee.models.ts b/test/generated/full/employee/employee.models.ts deleted file mode 100644 index 5c1b23d..0000000 --- a/test/generated/full/employee/employee.models.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeModels { -/** - * EmployeeResponseSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { CommonModels.LocaleEnum } locale - * @property { string } phone Phone number - * @property { boolean } archived Archived - * @property { string } primaryOfficeId Primary office id - * @property { CommonModels.EmployeeOfficeResponse } primaryOffice Primary office - * @property { CommonModels.EmploymentResponse[] } employments Employments - * @property { CommonModels.EmployeeRoleResponse[] } roles Global Roles - * @property { string } createdAt - * @property { string } updatedAt - */ -export const EmployeeResponseSchema = z.object({ id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), locale: CommonModels.LocaleEnumSchema.nullish(), phone: z.string().describe("Phone number").nullish(), archived: z.boolean().describe("Archived").nullish(), primaryOfficeId: z.string().describe("Primary office id").nullish(), primaryOffice: CommonModels.EmployeeOfficeResponseSchema.describe("Primary office").nullish(), employments: z.array(CommonModels.EmploymentResponseSchema).readonly().describe("Employments").nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).readonly().describe("Global Roles").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type EmployeeResponse = z.infer; - -/** - * EmployeeCreateRequestSchema - * @type { object } - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { CommonModels.LocaleEnum } locale - * @property { string } primaryOfficeId Primary office ID - * @property { string } phone Phone number - */ -export const EmployeeCreateRequestSchema = z.object({ firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.email().describe("Email"), locale: CommonModels.LocaleEnumSchema.nullish(), primaryOfficeId: z.string().describe("Primary office ID").nullish(), phone: z.string().describe("Phone number").nullish() }).readonly(); -export type EmployeeCreateRequest = z.infer; - -/** - * EmployeeOneStepCreateEmploymentRequestSchema - * @type { object } - * @property { string } officeId - * @property { string[] } roleIds Array of office role IDs - */ -export const EmployeeOneStepCreateEmploymentRequestSchema = z.object({ officeId: z.string(), roleIds: z.array(z.string()).readonly().describe("Array of office role IDs").nullish() }).readonly(); -export type EmployeeOneStepCreateEmploymentRequest = z.infer; - -/** - * EmployeeOneStepCreateRequestSchema - * @type { object } - * @property { CommonModels.LocaleEnum } locale - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { string } phone Phone number - * @property { string[] } roleIds Array of global role IDs - * @property { string } primaryOfficeId Primary office ID - * @property { EmployeeOneStepCreateEmploymentRequest[] } employments Employments. Min Items: `1` - */ -export const EmployeeOneStepCreateRequestSchema = z.object({ locale: CommonModels.LocaleEnumSchema.nullish(), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.email().describe("Email"), phone: z.string().describe("Phone number").nullish(), roleIds: z.array(z.string()).readonly().describe("Array of global role IDs").nullish(), primaryOfficeId: z.string().describe("Primary office ID").nullish(), employments: z.array(EmployeeOneStepCreateEmploymentRequestSchema).readonly().min(1).describe("Employments") }).readonly(); -export type EmployeeOneStepCreateRequest = z.infer; - -/** - * EmployeeUpdateRequestSchema - * @type { object } - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number of the employee - * @property { CommonModels.LocaleEnum } locale - * @property { string } primaryOfficeId - */ -export const EmployeeUpdateRequestSchema = z.object({ firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number of the employee"), locale: CommonModels.LocaleEnumSchema, primaryOfficeId: z.string() }).readonly(); -export type EmployeeUpdateRequest = z.infer; - -/** - * EmployeeFilterDtoSchema - * @type { object } - * @property { string } office Office ID (single select, offices the user has access to) - * @property { string[] } roles Role IDs (multiselect) - * @property { string } primaryOfficeId Primary office id - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { string[] } ids Ids - * @property { boolean } archived Archived - * set to true to only return archived employees - * does not return archived employees by default. Default: `false` - * @property { string } search Free text search multiple fields - * @property { string } officeRole Office role - */ -export const EmployeeFilterDtoSchema = z.object({ office: z.string().describe("Office ID (single select, offices the user has access to)"), roles: z.array(z.string()).readonly().describe("Role IDs (multiselect)"), primaryOfficeId: z.string().describe("Primary office id"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), email: z.string().describe("Email"), ids: z.array(z.string()).readonly().describe("Ids"), archived: z.boolean().describe(`Archived - set to true to only return archived employees - does not return archived employees by default`).default(false), search: z.string().describe("Free text search multiple fields"), officeRole: z.string().describe("Office role") }).readonly(); -export type EmployeeFilterDto = z.infer; - -/** - * EmployeeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type EmployeeLabelFilterDto = z.infer; - -/** - * EmployeeRoleMemberResponseSchema - * @type { object } - * @property { string } roleId - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string[] } permissions Permissions associated with the role - */ -export const EmployeeRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); -export type EmployeeRoleMemberResponse = z.infer; - -/** - * EmployeeRoleMembershipsUpdateRequestSchema - * @type { object } - * @property { string[] } roleIds Array of role IDs - */ -export const EmployeeRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }).readonly(); -export type EmployeeRoleMembershipsUpdateRequest = z.infer; - -/** - * EmployeePaginateOrderParamEnumSchema - * @type { enum } - */ -export const EmployeePaginateOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); -export type EmployeePaginateOrderParamEnum = z.infer; -export const EmployeePaginateOrderParamEnum = EmployeePaginateOrderParamEnumSchema.enum; - -/** - * EmployeePopulateFieldSchema - * @type { enum } - */ -export const EmployeePopulateFieldSchema = z.enum(["employments", "primaryOffice", "roles", "employments.roles", "employments.office"]); -export type EmployeePopulateField = z.infer; -export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; - -/** - * EmployeePaginatePopulateParamSchema - * @type { array } - */ -export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); -export type EmployeePaginatePopulateParam = z.infer; - -/** - * EmployeePaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeResponse[] } items - */ -export const EmployeePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeResponseSchema).readonly() }).readonly().shape }); -export type EmployeePaginateResponse = z.infer; - -/** - * EmployeeFindAllResponseSchema - * @type { array } - */ -export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); -export type EmployeeFindAllResponse = z.infer; - -/** - * EmployeePaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const EmployeePaginateLabelsOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); -export type EmployeePaginateLabelsOrderParamEnum = z.infer; -export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderParamEnumSchema.enum; - -/** - * EmployeePaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const EmployeePaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type EmployeePaginateLabelsResponse = z.infer; - -/** - * EmployeeGetPopulateParamSchema - * @type { array } - */ -export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); -export type EmployeeGetPopulateParam = z.infer; - -/** - * GetWithOfficePopulateParamSchema - * @type { array } - */ -export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).readonly().nullish(); -export type GetWithOfficePopulateParam = z.infer; - -/** - * EmployeeListRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleMemberResponse[] } items - */ -export const EmployeeListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape }); -export type EmployeeListRolesResponse = z.infer; - -/** - * EmployeeUpdateRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleMemberResponse[] } items - */ -export const EmployeeUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).readonly() }).readonly().shape }); -export type EmployeeUpdateRolesResponse = z.infer; - -} diff --git a/test/generated/full/employee/employee.queries.ts b/test/generated/full/employee/employee.queries.ts deleted file mode 100644 index 8881af1..0000000 --- a/test/generated/full/employee/employee.queries.ts +++ /dev/null @@ -1,470 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeeAcl } from "./employee.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeModels } from "./employee.models"; -import { EmployeeApi } from "./employee.api"; - -export namespace EmployeeQueries { -export const moduleName = QueryModule.Employee; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees", limit, order, populate, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string) => [...keys.all, "/employees", "infinite", limit, order, populate, filter, cursor] as const, - findAll: (search?: string) => [...keys.all, "/employees/labels", search] as const, - paginateLabels: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string) => [...keys.all, "/employees/labels/paginate", "infinite", limit, order, filter, cursor] as const, - get: (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam) => [...keys.all, "/employees/:employeeId", employeeId, populate] as const, - getWithOffice: (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam) => [...keys.all, "/offices/:officeId/employees/:employeeId", officeId, employeeId, populate] as const, - listRoles: (employeeId: string) => [...keys.all, "/employees/:employeeId/roles", employeeId] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Employees - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter - * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, populate, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Employees - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter - * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Employee - * @permission Requires `canUseCreate` ability - * @param { EmployeeModels.EmployeeCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmployeeAcl.canUseCreate()); - return EmployeeApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useSingeStepCreate` - * @summary Create Employee in a single step - * - requires Employee:Create for creating a global employee - * - requires Employee:Create{officeId} for creating an office employee (first office is primary) - * - requires Employment:Create{officeId} for creating office employments - * - requires Employee:UpdateRoles for setting global roles - * - requires Employee:UpdateRoles{officeId} for setting office roles - * @param { EmployeeModels.EmployeeOneStepCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useSingeStepCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - EmployeeApi.singeStepCreate(data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindAll` - * @summary List all employees with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search), - queryFn: () => { - checkAcl(EmployeeAcl.canUseFindAll()); - return EmployeeApi.findAll(search, config) }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate employees with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate employees with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useResendOnboarding` - * @summary Resend Employee Onboarding Email - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useResendOnboarding = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => - EmployeeApi.resendOnboarding(employeeId, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useResendOnboardingWithOffice` - * @permission Requires `canUseResendOnboardingWithOffice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useResendOnboardingWithOffice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employeeId }) => { - checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId } )); - return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGet` - * @summary Get Employee - * - allow global admins and office admins of primary office - * @permission Requires `canUseGet` ability - * @param { string } object.employeeId Path parameter - * @param { EmployeeModels.EmployeeGetPopulateParam } object.populate Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ employeeId, populate }: { employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(employeeId, populate), - queryFn: () => { - checkAcl(EmployeeAcl.canUseGet()); - return EmployeeApi.get(employeeId, populate, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Employee - * - allow global admins and office admins of primary office - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdate()); - return EmployeeApi.update(employeeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetWithOffice` - * @permission Requires `canUseGetWithOffice` ability - * @param { string } object.officeId Path parameter - * @param { string } object.employeeId Path parameter - * @param { EmployeeModels.GetWithOfficePopulateParam } object.populate Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetWithOffice = ({ officeId, employeeId, populate }: { officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getWithOffice(officeId, employeeId, populate), - queryFn: () => { - checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId } )); - return EmployeeApi.getWithOffice(officeId, employeeId, populate, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateWithOffice` - * @permission Requires `canUseUpdateWithOffice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateWithOffice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId } )); - return EmployeeApi.updateWithOffice(officeId, employeeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, employeeId } = variables; - const updateKeys = [keys.get(employeeId), keys.getWithOffice(officeId, employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListRoles` - * @summary List Employee (global) Roles - * @permission Requires `canUseListRoles` ability - * @param { string } object.employeeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoles = ({ employeeId }: { employeeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoles(employeeId), - queryFn: () => { - checkAcl(EmployeeAcl.canUseListRoles()); - return EmployeeApi.listRoles(employeeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateRoles` - * @summary Update Employee (global) Roles - * @permission Requires `canUseUpdateRoles` ability - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeRoleMembershipsUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdateRoles()); - return EmployeeApi.updateRoles(employeeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Employee - * @permission Requires `canUseArchive` ability - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => { - checkAcl(EmployeeAcl.canUseArchive()); - return EmployeeApi.archive(employeeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Un-archive Employee - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => { - checkAcl(EmployeeAcl.canUseUnarchive()); - return EmployeeApi.unarchive(employeeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/employeeAccount/employeeAccount.api.ts b/test/generated/full/employeeAccount/employeeAccount.api.ts deleted file mode 100644 index 7eac01c..0000000 --- a/test/generated/full/employeeAccount/employeeAccount.api.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { EmployeeAccountModels } from "./employeeAccount.models"; - -export namespace EmployeeAccountApi { -export const get = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, - `/employees/account`, - config - ) -}; -} diff --git a/test/generated/full/employeeAccount/employeeAccount.models.ts b/test/generated/full/employeeAccount/employeeAccount.models.ts deleted file mode 100644 index 4b3cb64..0000000 --- a/test/generated/full/employeeAccount/employeeAccount.models.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeAccountModels { -/** - * EmployeeAccountEmploymentDtoSchema - * @type { object } - * @property { string } officeId Office ID - * @property { string } officeName Office name - */ -export const EmployeeAccountEmploymentDtoSchema = z.object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }).readonly(); -export type EmployeeAccountEmploymentDto = z.infer; - -/** - * EmployeeAccountPrimaryOfficeDtoSchema - * @type { object } - * @property { string } officeId Office ID - * @property { string } officeName Office name - */ -export const EmployeeAccountPrimaryOfficeDtoSchema = z.object({ officeId: z.string().describe("Office ID"), officeName: z.string().describe("Office name") }).readonly(); -export type EmployeeAccountPrimaryOfficeDto = z.infer; - -/** - * EmployeeAccountRoleDtoSchema - * @type { object } - * @property { string } name Role name - * @property { string[] } permissions Role permissions - * @property { string } officeId Office ID - */ -export const EmployeeAccountRoleDtoSchema = z.object({ name: z.string().describe("Role name"), permissions: z.array(z.string()).readonly().describe("Role permissions"), officeId: z.string().describe("Office ID").nullish() }).readonly(); -export type EmployeeAccountRoleDto = z.infer; - -/** - * EmployeeAccountDtoSchema - * @type { object } - * @property { string } defaultUrl - * @property { string } costCenter - * @property { CommonModels.LocaleEnum } locale - * @property { array[] } aclRules Can hold any type of value - * @property { object } settings Employee settings keyed by setting name - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { EmployeeAccountEmploymentDto[] } employments Employments - * @property { EmployeeAccountPrimaryOfficeDto } primaryOffice Primary office - * @property { EmployeeAccountRoleDto[] } roles Roles - */ -export const EmployeeAccountDtoSchema = z.object({ defaultUrl: z.string().nullish(), costCenter: z.string().nullish(), locale: CommonModels.LocaleEnumSchema.nullish(), aclRules: z.array(z.array(z.any()).readonly()).readonly().describe("Can hold any type of value"), settings: z.union([z.object({}).catchall(z.any()).readonly(), z.array(z.object({}).catchall(z.any()).readonly()).readonly(), z.string(), z.array(z.string()).readonly(), z.array(z.number()).readonly()]).describe("Employee settings keyed by setting name"), id: z.string().describe("Employee ID"), email: z.email().describe("Email"), firstName: z.string().describe("First name"), lastName: z.string().describe("Last name"), phone: z.string().describe("Phone number").nullish(), employments: z.array(EmployeeAccountEmploymentDtoSchema).readonly().describe("Employments"), primaryOffice: EmployeeAccountPrimaryOfficeDtoSchema.describe("Primary office"), roles: z.array(EmployeeAccountRoleDtoSchema).readonly().describe("Roles") }).readonly(); -export type EmployeeAccountDto = z.infer; - -} diff --git a/test/generated/full/employeeAccount/employeeAccount.queries.ts b/test/generated/full/employeeAccount/employeeAccount.queries.ts deleted file mode 100644 index 3d5b964..0000000 --- a/test/generated/full/employeeAccount/employeeAccount.queries.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeAccountApi } from "./employeeAccount.api"; - -export namespace EmployeeAccountQueries { -export const moduleName = QueryModule.EmployeeAccount; - -export const keys = { - all: [moduleName] as const, - get: () => [...keys.all, "/employees/account", ] as const, -}; - -/** - * Query `useGet` - * @summary Get profile of logged-in user - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.get(), - queryFn: () => - EmployeeAccountApi.get(config), - ...options, - }); -}; - -} diff --git a/test/generated/full/employeePermissions/employeePermissions.acl.ts b/test/generated/full/employeePermissions/employeePermissions.acl.ts deleted file mode 100644 index 25d65ad..0000000 --- a/test/generated/full/employeePermissions/employeePermissions.acl.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace EmployeePermissionsAcl { -/** - * Use for `usePaginatePermissions` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query - */ -export const canUsePaginatePermissions = ( -) => [ - "Read", - "Permission" -] as AbilityTuple<"Read", "Permission">; - -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Permission" -] as AbilityTuple<"Read", "Permission">; - -} diff --git a/test/generated/full/employeePermissions/employeePermissions.api.ts b/test/generated/full/employeePermissions/employeePermissions.api.ts deleted file mode 100644 index 090ea01..0000000 --- a/test/generated/full/employeePermissions/employeePermissions.api.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; - -export namespace EmployeePermissionsApi { -export const paginatePermissions = (limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, - `/employees/permissions`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findAll = (search?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, - `/employees/permissions/labels`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -} diff --git a/test/generated/full/employeePermissions/employeePermissions.configs.ts b/test/generated/full/employeePermissions/employeePermissions.configs.ts deleted file mode 100644 index 50dd5bf..0000000 --- a/test/generated/full/employeePermissions/employeePermissions.configs.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; -import { EmployeePermissionsQueries } from "./employeePermissions.queries"; -import { EmployeePermissionsAcl } from "./employeePermissions.acl"; - -export namespace EmployeePermissionsConfigs { -export const permissionsConfig = { - meta: { - title: "Permissions", - }, - readAll: { - acl: EmployeePermissionsAcl.canUsePaginatePermissions, - schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, - paginated: EmployeePermissionsQueries.usePaginatePermissions, - infinite: EmployeePermissionsQueries.usePaginatePermissionsInfinite, - filters: { - schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, - options: { - inputs: { - context: true, - ids: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, - options: { - columns: { - id: true, - label: true, - group: true, - description: true, - context: true, - }, - sortable: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/employeePermissions/employeePermissions.models.ts b/test/generated/full/employeePermissions/employeePermissions.models.ts deleted file mode 100644 index efe698e..0000000 --- a/test/generated/full/employeePermissions/employeePermissions.models.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeePermissionsModels { -/** - * EmployeePermissionResponseSchema - * @type { object } - * @property { string } id Employee Permission unique identifier - * @property { string } label - * @property { string } group - * @property { string } description - * @property { string } context Scope where this rule is applied - */ -export const EmployeePermissionResponseSchema = z.object({ id: z.string().describe("Employee Permission unique identifier"), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied") }).readonly(); -export type EmployeePermissionResponse = z.infer; - -/** - * EmployeePermissionFilterDtoSchema - * @type { object } - * @property { string } context Role context - * @property { string[] } ids Ids - */ -export const EmployeePermissionFilterDtoSchema = z.object({ context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), ids: z.array(z.string()).readonly().describe("Ids") }).readonly(); -export type EmployeePermissionFilterDto = z.infer; - -/** - * EmployeePermissionsPaginatePermissionsOrderParamEnumSchema - * @type { enum } - */ -export const EmployeePermissionsPaginatePermissionsOrderParamEnumSchema = z.enum(["id"]); -export type EmployeePermissionsPaginatePermissionsOrderParamEnum = z.infer; -export const EmployeePermissionsPaginatePermissionsOrderParamEnum = EmployeePermissionsPaginatePermissionsOrderParamEnumSchema.enum; - -/** - * EmployeePermissionsPaginatePermissionsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeePermissionResponse[] } items - */ -export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeePermissionResponseSchema).readonly() }).readonly().shape }); -export type EmployeePermissionsPaginatePermissionsResponse = z.infer; - -/** - * EmployeePermissionsFindAllResponseSchema - * @type { array } - */ -export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); -export type EmployeePermissionsFindAllResponse = z.infer; - -} diff --git a/test/generated/full/employeePermissions/employeePermissions.queries.ts b/test/generated/full/employeePermissions/employeePermissions.queries.ts deleted file mode 100644 index 715d356..0000000 --- a/test/generated/full/employeePermissions/employeePermissions.queries.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeePermissionsAcl } from "./employeePermissions.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; -import { EmployeePermissionsApi } from "./employeePermissions.api"; - -export namespace EmployeePermissionsQueries { -export const moduleName = QueryModule.EmployeePermissions; - -export const keys = { - all: [moduleName] as const, - paginatePermissions: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/permissions", limit, order, filter, page, cursor] as const, - paginatePermissionsInfinite: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string) => [...keys.all, "/employees/permissions", "infinite", limit, order, filter, cursor] as const, - findAll: (search?: string) => [...keys.all, "/employees/permissions/labels", search] as const, -}; - -/** - * Query `usePaginatePermissions` - * @permission Requires `canUsePaginatePermissions` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` - * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginatePermissions = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginatePermissionsInfinite - * @permission Requires `canUsePaginatePermissions` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` - * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginatePermissionsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindAll` - * @summary List all permissions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search), - queryFn: () => { - checkAcl(EmployeePermissionsAcl.canUseFindAll()); - return EmployeePermissionsApi.findAll(search, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/employeeProfile/employeeProfile.api.ts b/test/generated/full/employeeProfile/employeeProfile.api.ts deleted file mode 100644 index 8b3c712..0000000 --- a/test/generated/full/employeeProfile/employeeProfile.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeProfileModels } from "./employeeProfile.models"; - -export namespace EmployeeProfileApi { -export const getProfile = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, - `/employee-profile`, - config - ) -}; -export const updateProfile = (data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, - `/employee-profile`, - ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/employeeProfile/employeeProfile.models.ts b/test/generated/full/employeeProfile/employeeProfile.models.ts deleted file mode 100644 index f67e1c2..0000000 --- a/test/generated/full/employeeProfile/employeeProfile.models.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeProfileModels { -/** - * EmployeeProfileResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } firstName Employee first name - * @property { string } lastName Employee last name - * @property { string } email Employee email - * @property { string } phone Employee phone number - * @property { string } defaultUrl Employee default URL - * @property { CommonModels.LocaleEnum } locale Employee locale - */ -export const EmployeeProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string().describe("Employee first name"), lastName: z.string().describe("Employee last name"), email: z.string().describe("Employee email"), phone: z.string().describe("Employee phone number").nullish(), defaultUrl: z.string().describe("Employee default URL").nullish(), locale: CommonModels.LocaleEnumSchema.describe("Employee locale").nullish() }).readonly(); -export type EmployeeProfileResponseDTO = z.infer; - -/** - * UpdateEmployeeProfileRequestDTOSchema - * @type { object } - * @property { string } firstName Employee first name. Example: `John` - * @property { string } lastName Employee last name. Example: `Doe` - * @property { string } email Employee email address. Example: `john.doe@example.com` - * @property { string } phone Employee phone number. Example: `+1234567890` - * @property { string } defaultUrl Default URL for the employee profile. Example: `https://example.com` - * @property { string } costCenter Employee cost center - * @property { CommonModels.LocaleEnum } locale Employee locale preference. Example: `en-US` - */ -export const UpdateEmployeeProfileRequestDTOSchema = z.object({ firstName: z.string().describe("Employee first name"), lastName: z.string().describe("Employee last name"), email: z.email().describe("Employee email address"), phone: z.string().describe("Employee phone number"), defaultUrl: z.url().describe("Default URL for the employee profile"), costCenter: z.string().describe("Employee cost center"), locale: CommonModels.LocaleEnumSchema.describe("Employee locale preference") }).readonly(); -export type UpdateEmployeeProfileRequestDTO = z.infer; - -} diff --git a/test/generated/full/employeeProfile/employeeProfile.queries.ts b/test/generated/full/employeeProfile/employeeProfile.queries.ts deleted file mode 100644 index a0c77f2..0000000 --- a/test/generated/full/employeeProfile/employeeProfile.queries.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeProfileModels } from "./employeeProfile.models"; -import { EmployeeProfileApi } from "./employeeProfile.api"; - -export namespace EmployeeProfileQueries { -export const moduleName = QueryModule.EmployeeProfile; - -export const keys = { - all: [moduleName] as const, - getProfile: () => [...keys.all, "/employee-profile", ] as const, -}; - -/** - * Query `useGetProfile` - * @summary Get employee profile - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetProfile = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.getProfile(), - queryFn: () => - EmployeeProfileApi.getProfile(config), - ...options, - }); -}; - -/** - * Mutation `useUpdateProfile` - * @summary Update employee profile - * @param { EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateProfile = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - EmployeeProfileApi.updateProfile(data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.getProfile()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/employeeRoles/employeeRoles.acl.ts b/test/generated/full/employeeRoles/employeeRoles.acl.ts deleted file mode 100644 index a64e698..0000000 --- a/test/generated/full/employeeRoles/employeeRoles.acl.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmployeeRolesAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List all possible roles - * @param { string } object.context context from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { context?: string, } -) => [ - "Read", - object ? subject("Role", object) : "Role" -] as AbilityTuple<"Read", "Role" | ForcedSubject<"Role"> & { context?: string, }>; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Role" -] as AbilityTuple<"Create", "Role">; - -/** - * Use for `useLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLabels` query - */ -export const canUseLabels = ( -) => [ - "Read", - "Role" -] as AbilityTuple<"Read", "Role">; - -/** - * Use for `useFind` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query - */ -export const canUseFind = ( -) => [ - "Read", - "Role" -] as AbilityTuple<"Read", "Role">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Role" -] as AbilityTuple<"Update", "Role">; - -/** - * Use for `useDeleteEmployeesRolesByRoleId` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteEmployeesRolesByRoleId` mutation - */ -export const canUseDeleteEmployeesRolesByRoleId = ( -) => [ - "Delete", - "Role" -] as AbilityTuple<"Delete", "Role">; - -/** - * Use for `usePaginatePermissions` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query - */ -export const canUsePaginatePermissions = ( -) => [ - "Read", - "Role" -] as AbilityTuple<"Read", "Role">; - -/** - * Use for `useTogglePermission` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTogglePermission` mutation - */ -export const canUseTogglePermission = ( -) => [ - "Update", - "Role" -] as AbilityTuple<"Update", "Role">; - -/** - * Use for `useCopy` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopy` mutation - */ -export const canUseCopy = ( -) => [ - "Create", - "Role" -] as AbilityTuple<"Create", "Role">; - -} diff --git a/test/generated/full/employeeRoles/employeeRoles.api.ts b/test/generated/full/employeeRoles/employeeRoles.api.ts deleted file mode 100644 index eb87de3..0000000 --- a/test/generated/full/employeeRoles/employeeRoles.api.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeRolesApi { -export const list = (limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, - `/employees/roles`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), - config - ) -}; -export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeRolesModels.LabelsResponseSchema }, - `/employees/roles/labels`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { type: "query", name: "context" }), - }, - } - ) -}; -export const find = (roleId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}`, - config - ) -}; -export const update = (roleId: string, data: EmployeeRolesModels.EmployeeRoleUpdateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), - config - ) -}; -export const deleteEmployeesRolesByRoleId = (roleId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/employees/roles/${roleId}`, - undefined, - config - ) -}; -export const paginatePermissions = (roleId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, - `/employees/roles/${roleId}/permissions`, - config - ) -}; -export const togglePermission = (roleId: string, permission: string, data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/employees/roles/${roleId}/permissions/${permission}/toggle`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), - config - ) -}; -export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}/copy`, - ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/employeeRoles/employeeRoles.configs.ts b/test/generated/full/employeeRoles/employeeRoles.configs.ts deleted file mode 100644 index 4e0b998..0000000 --- a/test/generated/full/employeeRoles/employeeRoles.configs.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeRolesQueries } from "./employeeRoles.queries"; -import { EmployeeRolesAcl } from "./employeeRoles.acl"; - -export namespace EmployeeRolesConfigs { -export const rolesConfig = { - meta: { - title: "Roles", - }, - readAll: { - acl: EmployeeRolesAcl.canUseList, - schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, - paginated: EmployeeRolesQueries.useList, - infinite: EmployeeRolesQueries.useListInfinite, - filters: { - schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, - options: { - inputs: { - name: true, - context: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, - options: { - columns: { - id: true, - name: true, - color: true, - description: true, - context: true, - permissions: true, - numberOfUsers: true, - }, - sortable: EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: EmployeeRolesAcl.canUseFind, - schema: CommonModels.EmployeeRoleResponseSchema, - query: EmployeeRolesQueries.useFind, - }, - create: { - acl: EmployeeRolesAcl.canUseCreate, - schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, - mutation: EmployeeRolesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, - options: { - inputs: { - name: true, - color: true, - description: true, - context: true, - permissions: true, - }, - }, -}) - }, - update: { - acl: EmployeeRolesAcl.canUseUpdate, - schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, - mutation: EmployeeRolesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, - options: { - inputs: { - name: true, - color: true, - description: true, - }, - }, -}) - }, - delete: { - acl: EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId, - mutation: EmployeeRolesQueries.useDeleteEmployeesRolesByRoleId, - }, -}; - -} diff --git a/test/generated/full/employeeRoles/employeeRoles.models.ts b/test/generated/full/employeeRoles/employeeRoles.models.ts deleted file mode 100644 index b0c6187..0000000 --- a/test/generated/full/employeeRoles/employeeRoles.models.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeRolesModels { -/** - * EmployeeRoleListItemResponseSchema - * @type { object } - * @property { string } id Unique identifier of the role - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string } context Role context - * @property { string[] } permissions Permissions associated with the role - * @property { number } numberOfUsers Number of users associated with the role - */ -export const EmployeeRoleListItemResponseSchema = z.object({ id: z.string().describe("Unique identifier of the role"), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Role context").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role"), numberOfUsers: z.number().describe("Number of users associated with the role") }).readonly(); -export type EmployeeRoleListItemResponse = z.infer; - -/** - * EmployeeRolePaginationFilterDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } context Role context - * @property { string } search - */ -export const EmployeeRolePaginationFilterDtoSchema = z.object({ name: z.string().describe("Name"), context: CommonModels.EmployeeRoleContextSchema.describe("Role context"), search: z.string() }).readonly(); -export type EmployeeRolePaginationFilterDto = z.infer; - -/** - * EmployeeRoleCreateRequestSchema - * @type { object } - * @property { string } name Name of the role - * @property { string } color Color of the role - * @property { string } description Color of the role - * @property { string } context Role context - * - office or global - * @property { string[] } permissions Permission IDs associated with the role - * can only be either office or global. Default: `` - */ -export const EmployeeRoleCreateRequestSchema = z.object({ name: z.string().describe("Name of the role"), color: z.string().describe("Color of the role"), description: z.string().describe("Color of the role").nullish(), context: CommonModels.EmployeeRoleContextSchema.describe(`Role context - - office or global`), permissions: z.array(z.string()).readonly().describe(`Permission IDs associated with the role - can only be either office or global`).default([]) }).readonly(); -export type EmployeeRoleCreateRequest = z.infer; - -/** - * EmployeeRolePermissionDtoSchema - * @type { object } - * @property { string } id Employee Permission unique identifier - * @property { string } label - * @property { string } group - * @property { string } description - * @property { string } context Scope where this rule is applied - * @property { boolean } enabled - */ -export const EmployeeRolePermissionDtoSchema = z.object({ id: z.string().describe("Employee Permission unique identifier"), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.describe("Scope where this rule is applied"), enabled: z.boolean() }).readonly(); -export type EmployeeRolePermissionDto = z.infer; - -/** - * EmployeeRoleUpdateRequestSchema - * @type { object } - * @property { string } name Role Id - * @property { string } color Role Color - * @property { string } description Role Description - */ -export const EmployeeRoleUpdateRequestSchema = z.object({ name: z.string().describe("Role Id"), color: z.string().describe("Role Color"), description: z.string().describe("Role Description") }).readonly(); -export type EmployeeRoleUpdateRequest = z.infer; - -/** - * EmployeeRoleTogglePermissionRequestSchema - * @type { object } - * @property { boolean } toggled Turn the permission on or off - */ -export const EmployeeRoleTogglePermissionRequestSchema = z.object({ toggled: z.boolean().describe("Turn the permission on or off") }).readonly(); -export type EmployeeRoleTogglePermissionRequest = z.infer; - -/** - * CopyEmployeeRoleDtoSchema - * @type { object } - * @property { string } newRoleName - */ -export const CopyEmployeeRoleDtoSchema = z.object({ newRoleName: z.string() }).readonly(); -export type CopyEmployeeRoleDto = z.infer; - -/** - * EmployeeRolesListOrderParamEnumSchema - * @type { enum } - */ -export const EmployeeRolesListOrderParamEnumSchema = z.enum(["name", "numberOfUsers"]); -export type EmployeeRolesListOrderParamEnum = z.infer; -export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSchema.enum; - -/** - * EmployeeRolesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleListItemResponse[] } items - */ -export const EmployeeRolesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).readonly() }).readonly().shape }); -export type EmployeeRolesListResponse = z.infer; - -/** - * LabelsResponseSchema - * @type { array } - */ -export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); -export type LabelsResponse = z.infer; - -/** - * EmployeeRolesPaginatePermissionsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRolePermissionDto[] } items - */ -export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).readonly() }).readonly().shape }); -export type EmployeeRolesPaginatePermissionsResponse = z.infer; - -} diff --git a/test/generated/full/employeeRoles/employeeRoles.queries.ts b/test/generated/full/employeeRoles/employeeRoles.queries.ts deleted file mode 100644 index b10fa5d..0000000 --- a/test/generated/full/employeeRoles/employeeRoles.queries.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeeRolesAcl } from "./employeeRoles.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeRolesApi } from "./employeeRoles.api"; - -export namespace EmployeeRolesQueries { -export const moduleName = QueryModule.EmployeeRoles; - -export const keys = { - all: [moduleName] as const, - list: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/roles", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string) => [...keys.all, "/employees/roles", "infinite", limit, order, filter, cursor] as const, - labels: (search?: string, context?: CommonModels.EmployeeRoleContext) => [...keys.all, "/employees/roles/labels", search, context] as const, - find: (roleId: string) => [...keys.all, "/employees/roles/:roleId", roleId] as const, - paginatePermissions: (roleId: string) => [...keys.all, "/employees/roles/:roleId/permissions", roleId] as const, -}; - -/** - * Query `useList` - * @summary Paginate Employee Role Definitions - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` - * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary Paginate Employee Role Definitions - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` - * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Employee Role Definition - * @permission Requires `canUseCreate` ability - * @param { EmployeeRolesModels.EmployeeRoleCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmployeeRolesAcl.canUseCreate()); - return EmployeeRolesApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useLabels` - * @summary List all employee roles with only their labels - * @permission Requires `canUseLabels` ability - * @param { string } object.search Query parameter - * @param { CommonModels.EmployeeRoleContext } object.context Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useLabels = ({ search, context }: { search?: string, context?: CommonModels.EmployeeRoleContext }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.labels(search, context), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseLabels()); - return EmployeeRolesApi.labels(search, context, config) }, - ...options, - }); -}; - -/** - * Query `useFind` - * @summary Get Employee Role Definition - * @permission Requires `canUseFind` ability - * @param { string } object.roleId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFind = ({ roleId }: { roleId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.find(roleId), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseFind()); - return EmployeeRolesApi.find(roleId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Employee Role Definition - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.roleId Path parameter - * @param { EmployeeRolesModels.EmployeeRoleUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, data }) => { - checkAcl(EmployeeRolesAcl.canUseUpdate()); - return EmployeeRolesApi.update(roleId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { roleId } = variables; - const updateKeys = [keys.find(roleId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteEmployeesRolesByRoleId` - * @summary Delete Employee Role Definition - * @permission Requires `canUseDeleteEmployeesRolesByRoleId` ability - * @param { string } mutation.roleId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteEmployeesRolesByRoleId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId }) => { - checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); - return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginatePermissions` - * @summary Get All Employee Role Definition Permissions - * - convenience endpoint to expand the permissions of a role - * - only returns the enabled permissions - * @permission Requires `canUsePaginatePermissions` ability - * @param { string } object.roleId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginatePermissions = ({ roleId }: { roleId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginatePermissions(roleId), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); - return EmployeeRolesApi.paginatePermissions(roleId, config) }, - ...options, - }); -}; - -/** - * Mutation `useTogglePermission` - * @summary Toggle Employee Role Definition Permission - * @permission Requires `canUseTogglePermission` ability - * @param { string } mutation.roleId Path parameter - * @param { string } mutation.permission Path parameter - * @param { EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useTogglePermission = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, permission, data }) => { - checkAcl(EmployeeRolesAcl.canUseTogglePermission()); - return EmployeeRolesApi.togglePermission(roleId, permission, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopy` - * @summary Copy Employee Role Definition - * @permission Requires `canUseCopy` ability - * @param { string } mutation.roleId Path parameter - * @param { EmployeeRolesModels.CopyEmployeeRoleDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, data }) => { - checkAcl(EmployeeRolesAcl.canUseCopy()); - return EmployeeRolesApi.copy(roleId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { roleId } = variables; - const updateKeys = [keys.find(roleId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/employeeSettings/employeeSettings.api.ts b/test/generated/full/employeeSettings/employeeSettings.api.ts deleted file mode 100644 index 21fa47a..0000000 --- a/test/generated/full/employeeSettings/employeeSettings.api.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeSettingsModels } from "./employeeSettings.models"; - -export namespace EmployeeSettingsApi { -export const getAll = (config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, - `/employees/settings`, - config - ) -}; -export const update = (key: string, data: EmployeeSettingsModels.UpdateEmployeeSettingDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/employees/settings/${key}`, - ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/employeeSettings/employeeSettings.models.ts b/test/generated/full/employeeSettings/employeeSettings.models.ts deleted file mode 100644 index 08b58ca..0000000 --- a/test/generated/full/employeeSettings/employeeSettings.models.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { z } from "zod"; - -export namespace EmployeeSettingsModels { -/** - * EmployeeSettingsResponseDtoSchema - * @type { object } - * @property { object } settings Map of all settings for the employee - */ -export const EmployeeSettingsResponseDtoSchema = z.object({ settings: z.union([z.object({}).catchall(z.any()).readonly(), z.array(z.object({}).catchall(z.any()).readonly()).readonly(), z.string(), z.array(z.string()).readonly(), z.array(z.number()).readonly()]).describe("Map of all settings for the employee") }).readonly(); -export type EmployeeSettingsResponseDto = z.infer; - -/** - * UpdateEmployeeSettingDtoSchema - * @type { object } - * @property { object } value The value to store for the setting. If null, the setting will be deleted. - */ -export const UpdateEmployeeSettingDtoSchema = z.object({ value: z.union([z.object({}).catchall(z.any()).readonly(), z.array(z.unknown()).readonly(), z.string(), z.number(), z.boolean()]).describe("The value to store for the setting. If null, the setting will be deleted.").nullable() }).readonly(); -export type UpdateEmployeeSettingDto = z.infer; - -} diff --git a/test/generated/full/employeeSettings/employeeSettings.queries.ts b/test/generated/full/employeeSettings/employeeSettings.queries.ts deleted file mode 100644 index 389d6e3..0000000 --- a/test/generated/full/employeeSettings/employeeSettings.queries.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeSettingsModels } from "./employeeSettings.models"; -import { EmployeeSettingsApi } from "./employeeSettings.api"; - -export namespace EmployeeSettingsQueries { -export const moduleName = QueryModule.EmployeeSettings; - -export const keys = { - all: [moduleName] as const, - getAll: () => [...keys.all, "/employees/settings", ] as const, -}; - -/** - * Query `useGetAll` - * @summary Get all employee settings - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetAll = (options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.getAll(), - queryFn: () => - EmployeeSettingsApi.getAll(config), - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update employee setting - * @param { string } mutation.key Path parameter - * @param { EmployeeSettingsModels.UpdateEmployeeSettingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ key, data }) => - EmployeeSettingsApi.update(key, data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/employment/employment.acl.ts b/test/generated/full/employment/employment.acl.ts deleted file mode 100644 index bbcaf77..0000000 --- a/test/generated/full/employment/employment.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmploymentAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create new employment - * @param { string } object.officeId officeId from mutation data - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List employments - * @param { string } object.officeId officeId from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId?: string, } -) => [ - "Read", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Read", "Employment" | ForcedSubject<"Employment"> & { officeId?: string, }>; - -/** - * Use for `useListRoles` query ability. For global ability, omit the object parameter. - * @description List employment roles - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query - */ -export const canUseListRoles = ( - object?: { officeId: string, } -) => [ - "ListRoles", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"ListRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useUpdateRoles` mutation ability. For global ability, omit the object parameter. - * @description Update employment roles - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation - */ -export const canUseUpdateRoles = ( - object?: { officeId: string, } -) => [ - "UpdateRoles", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"UpdateRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Archive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Unarchive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -} diff --git a/test/generated/full/employment/employment.api.ts b/test/generated/full/employment/employment.api.ts deleted file mode 100644 index d5718ab..0000000 --- a/test/generated/full/employment/employment.api.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; -import { EmploymentModels } from "./employment.models"; - -export namespace EmploymentApi { -export const create = (data: EmploymentModels.EmploymentCreateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/employees/employments`, - ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), - config - ) -}; -export const list = (limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmploymentModels.EmploymentListResponseSchema }, - `/employees/employments`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listRoles = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/roles`, - config - ) -}; -export const updateRoles = (officeId: string, employmentId: string, data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/roles`, - ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), - config - ) -}; -export const update = (officeId: string, employmentId: string, data: EmploymentModels.UpdateEmploymentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}`, - ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), - config - ) -}; -export const archive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/archive`, - undefined, - config - ) -}; -export const unarchive = (officeId: string, employmentId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/employment/employment.configs.ts b/test/generated/full/employment/employment.configs.ts deleted file mode 100644 index b8525a4..0000000 --- a/test/generated/full/employment/employment.configs.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { EmploymentModels } from "./employment.models"; -import { EmploymentQueries } from "./employment.queries"; -import { EmploymentAcl } from "./employment.acl"; - -export namespace EmploymentConfigs { -export const employmentsConfig = { - meta: { - title: "Employments", - }, - readAll: { - acl: EmploymentAcl.canUseList, - schema: CommonModels.EmploymentResponseSchema, - paginated: EmploymentQueries.useList, - infinite: EmploymentQueries.useListInfinite, - filters: { - schema: EmploymentModels.EmploymentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmploymentModels.EmploymentFilterDtoSchema, - options: { - inputs: { - officeId: true, - employeeId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.EmploymentResponseSchema, - options: { - columns: { - id: true, - officeId: true, - office: true, - employeeId: true, - employee: true, - archived: true, - costCenter: true, - roles: true, - }, - sortable: EmploymentModels.EmploymentListOrderParamEnumSchema, - }, -}), - }, - create: { - acl: EmploymentAcl.canUseCreate, - schema: EmploymentModels.EmploymentCreateRequestSchema, - mutation: EmploymentQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmploymentModels.EmploymentCreateRequestSchema, - options: { - inputs: { - officeId: true, - employeeId: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/full/employment/employment.models.ts b/test/generated/full/employment/employment.models.ts deleted file mode 100644 index b81dd37..0000000 --- a/test/generated/full/employment/employment.models.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmploymentModels { -/** - * EmploymentCreateRequestSchema - * @type { object } - * @property { string } officeId - * @property { string } employeeId - */ -export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }).readonly(); -export type EmploymentCreateRequest = z.infer; - -/** - * EmploymentFilterDtoSchema - * @type { object } - * @property { string } officeId Office IDs - * @property { string } employeeId Employee IDs - */ -export const EmploymentFilterDtoSchema = z.object({ officeId: z.string().describe("Office IDs"), employeeId: z.string().describe("Employee IDs") }).readonly(); -export type EmploymentFilterDto = z.infer; - -/** - * EmploymentRoleMemberResponseSchema - * @type { object } - * @property { string } roleId - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string[] } permissions Permissions associated with the role - */ -export const EmploymentRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string().describe("Name of the role"), color: z.string().describe("Color associated with the role").nullish(), description: z.string().describe("Description of the role").nullish(), permissions: z.array(z.string()).readonly().describe("Permissions associated with the role") }).readonly(); -export type EmploymentRoleMemberResponse = z.infer; - -/** - * EmploymentRoleMembershipsUpdateRequestSchema - * @type { object } - * @property { string[] } roleIds Array of role IDs - */ -export const EmploymentRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()).readonly().describe("Array of role IDs") }).readonly(); -export type EmploymentRoleMembershipsUpdateRequest = z.infer; - -/** - * UpdateEmploymentRequestDtoSchema - * @type { object } - * @property { string } costCenter - * @property { string[] } roleIds - */ -export const UpdateEmploymentRequestDtoSchema = z.object({ costCenter: z.string(), roleIds: z.array(z.string()).readonly() }).readonly(); -export type UpdateEmploymentRequestDto = z.infer; - -/** - * EmploymentListOrderParamEnumSchema - * @type { enum } - */ -export const EmploymentListOrderParamEnumSchema = z.enum(["officeId", "createdAt"]); -export type EmploymentListOrderParamEnum = z.infer; -export const EmploymentListOrderParamEnum = EmploymentListOrderParamEnumSchema.enum; - -/** - * EmploymentPaginationPopulateFieldsSchema - * @type { enum } - */ -export const EmploymentPaginationPopulateFieldsSchema = z.enum(["office", "employee"]); -export type EmploymentPaginationPopulateFields = z.infer; -export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFieldsSchema.enum; - -/** - * EmploymentListPopulateParamSchema - * @type { array } - */ -export const EmploymentListPopulateParamSchema = z.array(EmploymentPaginationPopulateFieldsSchema).readonly().nullish(); -export type EmploymentListPopulateParam = z.infer; - -/** - * EmploymentListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.EmploymentResponse[] } items - */ -export const EmploymentListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.EmploymentResponseSchema).readonly() }).readonly().shape }); -export type EmploymentListResponse = z.infer; - -/** - * EmploymentListRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmploymentRoleMemberResponse[] } items - */ -export const EmploymentListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape }); -export type EmploymentListRolesResponse = z.infer; - -/** - * EmploymentUpdateRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmploymentRoleMemberResponse[] } items - */ -export const EmploymentUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).readonly() }).readonly().shape }); -export type EmploymentUpdateRolesResponse = z.infer; - -} diff --git a/test/generated/full/employment/employment.queries.ts b/test/generated/full/employment/employment.queries.ts deleted file mode 100644 index f4556da..0000000 --- a/test/generated/full/employment/employment.queries.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmploymentAcl } from "./employment.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmploymentModels } from "./employment.models"; -import { EmploymentApi } from "./employment.api"; - -export namespace EmploymentQueries { -export const moduleName = QueryModule.Employment; - -export const keys = { - all: [moduleName] as const, - list: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/employments", limit, order, populate, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string) => [...keys.all, "/employees/employments", "infinite", limit, order, populate, filter, cursor] as const, - listRoles: (officeId: string, employmentId: string) => [...keys.all, "/offices/:officeId/employments/:employmentId/roles", officeId, employmentId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create new employment - * @permission Requires `canUseCreate` ability - * @param { EmploymentModels.EmploymentCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmploymentAcl.canUseCreate()); - return EmploymentApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useList` - * @summary List Employments - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` - * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter - * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, populate, filter, page, cursor), - queryFn: () => { - checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List Employments - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` - * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter - * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, populate, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListRoles` - * @summary List Employments Roles - * @permission Requires `canUseListRoles` ability - * @param { string } object.officeId Path parameter - * @param { string } object.employmentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoles = ({ officeId, employmentId }: { officeId: string, employmentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoles(officeId, employmentId), - queryFn: () => { - checkAcl(EmploymentAcl.canUseListRoles({ officeId } )); - return EmploymentApi.listRoles(officeId, employmentId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateRoles` - * @summary Update Employment Roles - * @permission Requires `canUseUpdateRoles` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { EmploymentModels.EmploymentRoleMembershipsUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId, data }) => { - checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId } )); - return EmploymentApi.updateRoles(officeId, employmentId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { EmploymentModels.UpdateEmploymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId, data }) => { - checkAcl(EmploymentAcl.canUseUpdate({ officeId } )); - return EmploymentApi.update(officeId, employmentId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Employment - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId }) => { - checkAcl(EmploymentAcl.canUseArchive({ officeId } )); - return EmploymentApi.archive(officeId, employmentId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Un-archive Employment - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId }) => { - checkAcl(EmploymentAcl.canUseUnarchive({ officeId } )); - return EmploymentApi.unarchive(officeId, employmentId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/factoringExport/factoringExport.acl.ts b/test/generated/full/factoringExport/factoringExport.acl.ts deleted file mode 100644 index cc07635..0000000 --- a/test/generated/full/factoringExport/factoringExport.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace FactoringExportAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create factoring export - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Create", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -/** - * Use for `useGetBatch` query ability. For global ability, omit the object parameter. - * @description Read factoring export - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query - */ -export const canUseGetBatch = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -} diff --git a/test/generated/full/factoringExport/factoringExport.api.ts b/test/generated/full/factoringExport/factoringExport.api.ts deleted file mode 100644 index 471d0ec..0000000 --- a/test/generated/full/factoringExport/factoringExport.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { FactoringExportModels } from "./factoringExport.models"; - -export namespace FactoringExportApi { -export const create = (officeId: string, data: FactoringExportModels.CreateFactoringExportRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-exports`, - ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), - config - ) -}; -export const getBatch = (batchId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-exports/${batchId}`, - config - ) -}; -} diff --git a/test/generated/full/factoringExport/factoringExport.models.ts b/test/generated/full/factoringExport/factoringExport.models.ts deleted file mode 100644 index 1135505..0000000 --- a/test/generated/full/factoringExport/factoringExport.models.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { z } from "zod"; - -export namespace FactoringExportModels { -/** - * FactoringExportBatchStatusEnumSchema - * @type { enum } - */ -export const FactoringExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Failed"]); -export type FactoringExportBatchStatusEnum = z.infer; -export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSchema.enum; - -/** - * FactoringExportBatchResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { FactoringExportBatchStatusEnum } status - * @property { number } totalInvoices - * @property { number } totalAmount - * @property { string } currencyNotation - * @property { string } jobId - * @property { string } eurFileUrl - * @property { string } usdFileUrl - * @property { string } createdById - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } exportedAt - */ -export const FactoringExportBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringExportBatchStatusEnumSchema, totalInvoices: z.number(), totalAmount: z.number(), currencyNotation: z.string(), jobId: z.string().nullish(), eurFileUrl: z.string().nullish(), usdFileUrl: z.string().nullish(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); -export type FactoringExportBatchResponseDto = z.infer; - -/** - * CreateFactoringExportRequestDtoSchema - * @type { object } - * @property { string } invoiceDateFrom Invoice date from - * @property { string } invoiceDateUntil Invoice date until - */ -export const CreateFactoringExportRequestDtoSchema = z.object({ invoiceDateFrom: z.iso.datetime({ offset: true }).describe("Invoice date from"), invoiceDateUntil: z.iso.datetime({ offset: true }).describe("Invoice date until") }).readonly(); -export type CreateFactoringExportRequestDto = z.infer; - -} diff --git a/test/generated/full/factoringExport/factoringExport.queries.ts b/test/generated/full/factoringExport/factoringExport.queries.ts deleted file mode 100644 index 5bee5fa..0000000 --- a/test/generated/full/factoringExport/factoringExport.queries.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { FactoringExportAcl } from "./factoringExport.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FactoringExportModels } from "./factoringExport.models"; -import { FactoringExportApi } from "./factoringExport.api"; - -export namespace FactoringExportQueries { -export const moduleName = QueryModule.FactoringExport; - -export const keys = { - all: [moduleName] as const, - getBatch: (batchId: string, officeId: string) => [...keys.all, "/offices/:officeId/factoring-exports/:batchId", batchId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Generate factoring export files for Raiffeisen Factor Bank - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { FactoringExportModels.CreateFactoringExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(FactoringExportAcl.canUseCreate({ officeId } )); - return FactoringExportApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetBatch` - * @summary Get factoring export batch status - * @permission Requires `canUseGetBatch` ability - * @param { string } object.batchId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBatch = ({ batchId, officeId }: { batchId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBatch(batchId, officeId), - queryFn: () => { - checkAcl(FactoringExportAcl.canUseGetBatch({ officeId } )); - return FactoringExportApi.getBatch(batchId, officeId, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/factoringMerge/factoringMerge.acl.ts b/test/generated/full/factoringMerge/factoringMerge.acl.ts deleted file mode 100644 index 208ed2f..0000000 --- a/test/generated/full/factoringMerge/factoringMerge.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace FactoringMergeAcl { -/** - * Use for `usePrepareUpload` mutation ability. For global ability, omit the object parameter. - * @description Prepare factoring merge upload - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareUpload` mutation - */ -export const canUsePrepareUpload = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -/** - * Use for `useProcessMerge` mutation ability. For global ability, omit the object parameter. - * @description Process factoring merge - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useProcessMerge` mutation - */ -export const canUseProcessMerge = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -/** - * Use for `useGetMergeBatch` query ability. For global ability, omit the object parameter. - * @description Read merge batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMergeBatch` query - */ -export const canUseGetMergeBatch = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -} diff --git a/test/generated/full/factoringMerge/factoringMerge.api.ts b/test/generated/full/factoringMerge/factoringMerge.api.ts deleted file mode 100644 index f095cec..0000000 --- a/test/generated/full/factoringMerge/factoringMerge.api.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { FactoringMergeModels } from "./factoringMerge.models"; - -export namespace FactoringMergeApi { -export const prepareUpload = (officeId: string, data: FactoringMergeModels.PrepareFactoringMergeRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/prepare-upload`, - ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), - config - ) -}; -export const processMerge = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/${batchId}/process`, - undefined, - config - ) -}; -export const getMergeBatch = (officeId: string, batchId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/${batchId}`, - config - ) -}; -} diff --git a/test/generated/full/factoringMerge/factoringMerge.models.ts b/test/generated/full/factoringMerge/factoringMerge.models.ts deleted file mode 100644 index e285edd..0000000 --- a/test/generated/full/factoringMerge/factoringMerge.models.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { z } from "zod"; - -export namespace FactoringMergeModels { -/** - * FileMetadataDtoSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType File MIME type - * @property { number } fileSize File size in bytes. Minimum: `1` - */ -export const FileMetadataDtoSchema = z.object({ fileName: z.string().describe("File name"), mimeType: z.string().describe("File MIME type"), fileSize: z.number().gte(1).describe("File size in bytes") }).readonly(); -export type FileMetadataDto = z.infer; - -/** - * PrepareFactoringMergeRequestDtoSchema - * @type { object } - * @property { FileMetadataDto } eurDebtorFile EUR debtor file metadata - * @property { FileMetadataDto } eurOperationsFile EUR operations file metadata - * @property { FileMetadataDto } eurExistingFactoringFile EUR existing factoring file metadata (optional) - * @property { FileMetadataDto } usdDebtorFile USD debtor file metadata - * @property { FileMetadataDto } usdOperationsFile USD operations file metadata - * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) - */ -export const PrepareFactoringMergeRequestDtoSchema = z.object({ eurDebtorFile: FileMetadataDtoSchema.describe("EUR debtor file metadata"), eurOperationsFile: FileMetadataDtoSchema.describe("EUR operations file metadata"), eurExistingFactoringFile: FileMetadataDtoSchema.describe("EUR existing factoring file metadata (optional)").nullish(), usdDebtorFile: FileMetadataDtoSchema.describe("USD debtor file metadata"), usdOperationsFile: FileMetadataDtoSchema.describe("USD operations file metadata"), usdExistingFactoringFile: FileMetadataDtoSchema.describe("USD existing factoring file metadata (optional)").nullish() }).readonly(); -export type PrepareFactoringMergeRequestDto = z.infer; - -/** - * MediaUploadInstructionsDtoSchema - * @type { object } - * @property { string } id - * @property { string } method - * @property { string } url - */ -export const MediaUploadInstructionsDtoSchema = z.object({ id: z.string(), method: z.string(), url: z.string() }).readonly(); -export type MediaUploadInstructionsDto = z.infer; - -/** - * FactoringMergeUploadInstructionsResponseDtoSchema - * @type { object } - * @property { string } batchId - * @property { MediaUploadInstructionsDto } eurDebtorFile - * @property { MediaUploadInstructionsDto } eurOperationsFile - * @property { MediaUploadInstructionsDto } eurExistingFactoringFile - * @property { MediaUploadInstructionsDto } usdDebtorFile - * @property { MediaUploadInstructionsDto } usdOperationsFile - * @property { MediaUploadInstructionsDto } usdExistingFactoringFile - */ -export const FactoringMergeUploadInstructionsResponseDtoSchema = z.object({ batchId: z.string(), eurDebtorFile: MediaUploadInstructionsDtoSchema, eurOperationsFile: MediaUploadInstructionsDtoSchema, eurExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), usdDebtorFile: MediaUploadInstructionsDtoSchema, usdOperationsFile: MediaUploadInstructionsDtoSchema, usdExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish() }).readonly(); -export type FactoringMergeUploadInstructionsResponseDto = z.infer; - -/** - * FactoringMergeBatchStatusEnumSchema - * @type { enum } - */ -export const FactoringMergeBatchStatusEnumSchema = z.enum(["Initializing", "Processing", "Completed", "Failed"]); -export type FactoringMergeBatchStatusEnum = z.infer; -export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema.enum; - -/** - * FactoringMergeBatchResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { FactoringMergeBatchStatusEnum } status - * @property { string } eurDebtorFileMediaId - * @property { string } eurOperationsFileMediaId - * @property { string } eurExistingFactoringFileMediaId - * @property { string } usdDebtorFileMediaId - * @property { string } usdOperationsFileMediaId - * @property { string } usdExistingFactoringFileMediaId - * @property { string } eurResultFileMediaId - * @property { string } eurResultFileUrl - * @property { string } usdResultFileMediaId - * @property { string } usdResultFileUrl - * @property { string } jobId - * @property { string } errorMessage - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } completedAt - */ -export const FactoringMergeBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringMergeBatchStatusEnumSchema, eurDebtorFileMediaId: z.string(), eurOperationsFileMediaId: z.string(), eurExistingFactoringFileMediaId: z.string().nullish(), usdDebtorFileMediaId: z.string(), usdOperationsFileMediaId: z.string(), usdExistingFactoringFileMediaId: z.string().nullish(), eurResultFileMediaId: z.string().nullish(), eurResultFileUrl: z.string().nullish(), usdResultFileMediaId: z.string().nullish(), usdResultFileUrl: z.string().nullish(), jobId: z.string().nullish(), errorMessage: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), completedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); -export type FactoringMergeBatchResponseDto = z.infer; - -} diff --git a/test/generated/full/factoringMerge/factoringMerge.queries.ts b/test/generated/full/factoringMerge/factoringMerge.queries.ts deleted file mode 100644 index 80ea921..0000000 --- a/test/generated/full/factoringMerge/factoringMerge.queries.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { FactoringMergeAcl } from "./factoringMerge.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FactoringMergeModels } from "./factoringMerge.models"; -import { FactoringMergeApi } from "./factoringMerge.api"; - -export namespace FactoringMergeQueries { -export const moduleName = QueryModule.FactoringMerge; - -export const keys = { - all: [moduleName] as const, - getMergeBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/factoring-merge/:batchId", officeId, batchId] as const, -}; - -/** - * Mutation `usePrepareUpload` - * @summary Prepare upload instructions for MOVE files merge - * @permission Requires `canUsePrepareUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { FactoringMergeModels.PrepareFactoringMergeRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const usePrepareUpload = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId } )); - return FactoringMergeApi.prepareUpload(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useProcessMerge` - * @summary Start processing the merge batch - * @permission Requires `canUseProcessMerge` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useProcessMerge = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId } )); - return FactoringMergeApi.processMerge(officeId, batchId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, batchId } = variables; - const updateKeys = [keys.getMergeBatch(officeId, batchId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetMergeBatch` - * @summary Get merge batch status - * @permission Requires `canUseGetMergeBatch` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, default] - */ -export const useGetMergeBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getMergeBatch(officeId, batchId), - queryFn: () => { - checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId } )); - return FactoringMergeApi.getMergeBatch(officeId, batchId, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/files/files.api.ts b/test/generated/full/files/files.api.ts deleted file mode 100644 index 286fe3a..0000000 --- a/test/generated/full/files/files.api.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { FilesModels } from "./files.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace FilesApi { -export const createUpload = (officeId: string, folderId: string, data: FilesModels.CreateFileRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: FilesModels.FileUploadResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}/files`, - ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), - config - ) -}; -export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/files/eml`, - ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), - { - ...config, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const rename = (officeId: string, fileId: string, data: FilesModels.RenameFileRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.FileResponseDTOSchema }, - `/offices/${officeId}/files/${fileId}`, - ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), - config - ) -}; -export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/move`, - ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - config - ) -}; -export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/copy`, - ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - config - ) -}; -export const archive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/archive`, - ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - config - ) -}; -export const unarchive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/unarchive`, - ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/files/files.models.ts b/test/generated/full/files/files.models.ts deleted file mode 100644 index c7e5145..0000000 --- a/test/generated/full/files/files.models.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { z } from "zod"; - -export namespace FilesModels { -/** - * CreateFileRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } mimeType - * @property { number } fileSize Minimum: `0` - */ -export const CreateFileRequestDTOSchema = z.object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }).readonly(); -export type CreateFileRequestDTO = z.infer; - -/** - * FileUploadResponseDTOSchema - * @type { object } - * @property { string } fileId - * @property { string } method - * @property { string } url - */ -export const FileUploadResponseDTOSchema = z.object({ fileId: z.string(), method: z.string(), url: z.string() }).readonly(); -export type FileUploadResponseDTO = z.infer; - -/** - * GetFilesEmlRequestDTOSchema - * @type { object } - * @property { string[] } ids Min Items: `1` - */ -export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); -export type GetFilesEmlRequestDTO = z.infer; - -/** - * RenameFileRequestDTOSchema - * @type { object } - * @property { string } name - */ -export const RenameFileRequestDTOSchema = z.object({ name: z.string() }).readonly(); -export type RenameFileRequestDTO = z.infer; - -/** - * MoveFilesRequestDTOSchema - * @type { object } - * @property { string[] } fileIds Min Items: `1` - * @property { string } targetFolderId - */ -export const MoveFilesRequestDTOSchema = z.object({ fileIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }).readonly(); -export type MoveFilesRequestDTO = z.infer; - -/** - * SetFilesArchivedRequestDTOSchema - * @type { object } - * @property { string[] } ids Min Items: `1` - */ -export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).readonly().min(1) }).readonly(); -export type SetFilesArchivedRequestDTO = z.infer; - -} diff --git a/test/generated/full/files/files.queries.ts b/test/generated/full/files/files.queries.ts deleted file mode 100644 index ee44a92..0000000 --- a/test/generated/full/files/files.queries.ts +++ /dev/null @@ -1,210 +0,0 @@ -import axios, { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FilesModels } from "./files.models"; -import { FilesApi } from "./files.api"; - -export namespace FilesQueries { -export const moduleName = QueryModule.Files; - - - -/** - * Mutation `useCreateUpload` - * @summary Create file upload instructions - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { FilesModels.CreateFileRequestDTO } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { - const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGetEml` - recommended when file should not be cached - * @summary Get files as EML file with attachments - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.GetFilesEmlRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.getEml(officeId, data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRename` - * @summary Rename file - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.fileId Path parameter - * @param { FilesModels.RenameFileRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useRename = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, fileId, data }) => - FilesApi.rename(officeId, fileId, data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMove` - * @summary Move files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useMove = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.move(officeId, data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopy` - * @summary Copy files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.copy(officeId, data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.archive(officeId, data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.unarchive(officeId, data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/folders/folders.api.ts b/test/generated/full/folders/folders.api.ts deleted file mode 100644 index 2644437..0000000 --- a/test/generated/full/folders/folders.api.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { FoldersModels } from "./folders.models"; - -export namespace FoldersApi { -export const getTree = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}/tree`, - config - ) -}; -export const getContent = (officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}`, - { - ...config, - params: { - order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const rename = (officeId: string, folderId: string, data: FoldersModels.RenameFolderRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}`, - ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), - config - ) -}; -export const deleteFolder = (officeId: string, folderId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/folders/${folderId}`, - undefined, - config - ) -}; -export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders`, - ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), - config - ) -}; -export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/folders/move`, - ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/folders/folders.models.ts b/test/generated/full/folders/folders.models.ts deleted file mode 100644 index 977f922..0000000 --- a/test/generated/full/folders/folders.models.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace FoldersModels { -/** - * TargetEntityNameEnumSchema - * @type { enum } - */ -export const TargetEntityNameEnumSchema = z.enum(["invoice", "quote"]); -export type TargetEntityNameEnum = z.infer; -export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; - -/** - * FolderSymlinkResponseDTOSchema - * @type { object } - * @property { string } targetEntityName - * @property { string } targetEntityId - */ -export const FolderSymlinkResponseDTOSchema = z.object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }).readonly(); -export type FolderSymlinkResponseDTO = z.infer; - -/** - * FolderTreeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } isSystem - * @property { boolean } isSymlink - * @property { FolderSymlinkResponseDTO } symlink - * @property { FolderTreeResponseDTO[] } folders - */ -export const FolderTreeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), get folders() { return z.array(FolderTreeResponseDTOSchema).readonly() } }).readonly(); -export type FolderTreeResponseDTO = z.infer; - -/** - * FolderResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } archived - * @property { boolean } isSystem - * @property { boolean } isSymlink - * @property { FolderSymlinkResponseDTO } symlink - * @property { string } createdAt - * @property { string } updatedAt - * @property { CommonModels.FolderEmployeeDTO } createdBy - * @property { CommonModels.FolderEmployeeDTO } updatedBy - * @property { CommonModels.FileResponseDTO[] } files - * @property { FolderResponseDTO[] } folders - */ -export const FolderResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, files: z.array(CommonModels.FileResponseDTOSchema).readonly(), get folders() { return z.array(FolderResponseDTOSchema).readonly() } }).readonly(); -export type FolderResponseDTO = z.infer; - -/** - * FolderContentFilterDtoSchema - * @type { object } - * @property { boolean } archived When omitted, both archived and unarchived files are returned. - */ -export const FolderContentFilterDtoSchema = z.object({ archived: z.boolean().describe("When omitted, both archived and unarchived files are returned.") }).readonly(); -export type FolderContentFilterDto = z.infer; - -/** - * CreateFolderRequestDTOSchema - * @type { object } - * @property { string } parentFolderId - * @property { string } name - */ -export const CreateFolderRequestDTOSchema = z.object({ parentFolderId: z.string(), name: z.string() }).readonly(); -export type CreateFolderRequestDTO = z.infer; - -/** - * RenameFolderRequestDTOSchema - * @type { object } - * @property { string } name - */ -export const RenameFolderRequestDTOSchema = z.object({ name: z.string() }).readonly(); -export type RenameFolderRequestDTO = z.infer; - -/** - * MoveFoldersRequestDTOSchema - * @type { object } - * @property { string[] } folderIds Min Items: `1` - * @property { string } targetFolderId - */ -export const MoveFoldersRequestDTOSchema = z.object({ folderIds: z.array(z.string()).readonly().min(1), targetFolderId: z.string() }).readonly(); -export type MoveFoldersRequestDTO = z.infer; - -/** - * GetContentOrderParamSchema - * @type { array } - * @description Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - */ -export const GetContentOrderParamSchema = z.array(z.string()).readonly().describe("Order by fields (comma separated with +/- prefix): name, createdAt").nullish(); -export type GetContentOrderParam = z.infer; - -} diff --git a/test/generated/full/folders/folders.queries.ts b/test/generated/full/folders/folders.queries.ts deleted file mode 100644 index ef642ed..0000000 --- a/test/generated/full/folders/folders.queries.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FoldersModels } from "./folders.models"; -import { FoldersApi } from "./folders.api"; - -export namespace FoldersQueries { -export const moduleName = QueryModule.Folders; - -export const keys = { - all: [moduleName] as const, - getTree: (officeId: string, folderId: string) => [...keys.all, "/offices/:officeId/folders/:folderId/tree", officeId, folderId] as const, - getContent: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", officeId, folderId, limit, order, filter, page, cursor] as const, - getContentInfinite: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", "infinite", officeId, folderId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useGetTree` - * @summary Get folder tree - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetTree = ({ officeId, folderId }: { officeId: string, folderId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.getTree(officeId, folderId), - queryFn: () => - FoldersApi.getTree(officeId, folderId, config), - ...options, - }); -}; - -/** - * Query `useGetContent` - * @summary Get folder content - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetContent = ({ officeId, folderId, limit, order, filter, page, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), - queryFn: () => - FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor, config), - ...options, - }); -}; - -/** - * Infinite query `useGetContentInfinite - * @summary Get folder content - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetContentInfinite = ({ officeId, folderId, limit, order, filter, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - - return useInfiniteQuery({ - queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => - FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useRename` - * @summary Rename folder - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { FoldersModels.RenameFolderRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useRename = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, folderId, data }) => - FoldersApi.rename(officeId, folderId, data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteFolder` - * @summary Delete folder - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteFolder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, folderId }) => - FoldersApi.deleteFolder(officeId, folderId, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create folder - * @param { string } mutation.officeId Path parameter - * @param { FoldersModels.CreateFolderRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FoldersApi.create(officeId, data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMove` - * @summary Move folders - * @param { string } mutation.officeId Path parameter - * @param { FoldersModels.MoveFoldersRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useMove = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FoldersApi.move(officeId, data, config) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/hsCodes/hsCodes.acl.ts b/test/generated/full/hsCodes/hsCodes.acl.ts deleted file mode 100644 index 3e48e9d..0000000 --- a/test/generated/full/hsCodes/hsCodes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace HsCodesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "HsCode" -] as AbilityTuple<"Read", "HsCode">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "HsCode" -] as AbilityTuple<"Create", "HsCode">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "HsCode" -] as AbilityTuple<"Read", "HsCode">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "HsCode" -] as AbilityTuple<"Read", "HsCode">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "HsCode" -] as AbilityTuple<"Update", "HsCode">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "HsCode" -] as AbilityTuple<"Archive", "HsCode">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "HsCode" -] as AbilityTuple<"Archive", "HsCode">; - -} diff --git a/test/generated/full/hsCodes/hsCodes.api.ts b/test/generated/full/hsCodes/hsCodes.api.ts deleted file mode 100644 index ec87c77..0000000 --- a/test/generated/full/hsCodes/hsCodes.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { HsCodesModels } from "./hsCodes.models"; - -export namespace HsCodesApi { -export const paginate = (limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, - `/hs-codes`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes`, - ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), - config - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, - `/hs-codes/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}`, - config - ) -}; -export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}`, - ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/hsCodes/hsCodes.configs.ts b/test/generated/full/hsCodes/hsCodes.configs.ts deleted file mode 100644 index 5b005a1..0000000 --- a/test/generated/full/hsCodes/hsCodes.configs.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { HsCodesModels } from "./hsCodes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { HsCodesQueries } from "./hsCodes.queries"; -import { HsCodesAcl } from "./hsCodes.acl"; - -export namespace HsCodesConfigs { -export const hsCodesConfig = { - meta: { - title: "Hs Codes", - }, - readAll: { - acl: HsCodesAcl.canUsePaginate, - schema: HsCodesModels.HsCodeResponseDTOSchema, - paginated: HsCodesQueries.usePaginate, - infinite: HsCodesQueries.usePaginateInfinite, - filters: { - schema: HsCodesModels.HsCodePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: HsCodesModels.HsCodePaginationFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: HsCodesModels.HsCodeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - description: true, - customArea: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: HsCodesModels.HsCodesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: HsCodesAcl.canUseFindById, - schema: HsCodesModels.HsCodeResponseDTOSchema, - query: HsCodesQueries.useFindById, - }, - create: { - acl: HsCodesAcl.canUseCreate, - schema: HsCodesModels.CreateHsCodeRequestDTOSchema, - mutation: HsCodesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: HsCodesModels.CreateHsCodeRequestDTOSchema, - options: { - inputs: { - name: true, - description: true, - customArea: true, - }, - }, -}) - }, - update: { - acl: HsCodesAcl.canUseUpdate, - schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, - mutation: HsCodesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, - options: { - inputs: { - name: true, - description: true, - customArea: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: HsCodesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: HsCodesQueries.usePaginateLabels, - infinite: HsCodesQueries.usePaginateLabelsInfinite, - filters: { - schema: HsCodesModels.HsCodeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: HsCodesModels.HsCodeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/hsCodes/hsCodes.models.ts b/test/generated/full/hsCodes/hsCodes.models.ts deleted file mode 100644 index 1861991..0000000 --- a/test/generated/full/hsCodes/hsCodes.models.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace HsCodesModels { -/** - * HsCodeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type HsCodeEmployeeDTO = z.infer; - -/** - * HsCodeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the HS Code - * @property { string } name Name of the HS Code - * @property { string } description Description of the HS Code - * @property { string } customArea Custom area associated with the HS Code - * @property { boolean } archived Indicates if the HS Code is archived - * @property { string } createdById - * @property { HsCodeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { HsCodeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const HsCodeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the HS Code"), name: z.string().describe("Name of the HS Code"), description: z.string().describe("Description of the HS Code"), customArea: z.string().describe("Custom area associated with the HS Code"), archived: z.boolean().describe("Indicates if the HS Code is archived"), createdById: z.string().nullish(), createdBy: HsCodeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: HsCodeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type HsCodeResponseDTO = z.infer; - -/** - * HsCodePaginationFilterDtoSchema - * @type { object } - * @property { boolean } archived Archived status - * @property { string } search - */ -export const HsCodePaginationFilterDtoSchema = z.object({ archived: z.boolean().describe("Archived status"), search: z.string() }).readonly(); -export type HsCodePaginationFilterDto = z.infer; - -/** - * HsCodeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const HsCodeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type HsCodeLabelFilterDto = z.infer; - -/** - * CreateHsCodeRequestDTOSchema - * @type { object } - * @property { string } name Unique name for the HS Code - * @property { string } description Description of the HS Code - * @property { string } customArea Custom area associated with the HS Code - */ -export const CreateHsCodeRequestDTOSchema = z.object({ name: z.string().describe("Unique name for the HS Code"), description: z.string().describe("Description of the HS Code"), customArea: z.string().describe("Custom area associated with the HS Code") }).readonly(); -export type CreateHsCodeRequestDTO = z.infer; - -/** - * UpdateHsCodeRequestDTOSchema - * @type { object } - * @property { string } name Updated name of the HS Code. - * @property { string } description Updated description of the HS Code. - * @property { string } customArea Updated custom area associated with the HS Code. - */ -export const UpdateHsCodeRequestDTOSchema = z.object({ name: z.string().describe("Updated name of the HS Code."), description: z.string().describe("Updated description of the HS Code."), customArea: z.string().describe("Updated custom area associated with the HS Code.") }).readonly(); -export type UpdateHsCodeRequestDTO = z.infer; - -/** - * HsCodesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const HsCodesPaginateOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type HsCodesPaginateOrderParamEnum = z.infer; -export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema.enum; - -/** - * HsCodesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { HsCodeResponseDTO[] } items - */ -export const HsCodesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(HsCodeResponseDTOSchema).readonly() }).readonly().shape }); -export type HsCodesPaginateResponse = z.infer; - -/** - * HsCodesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const HsCodesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type HsCodesPaginateLabelsOrderParamEnum = z.infer; -export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * HsCodesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const HsCodesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type HsCodesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/hsCodes/hsCodes.queries.ts b/test/generated/full/hsCodes/hsCodes.queries.ts deleted file mode 100644 index 87e8809..0000000 --- a/test/generated/full/hsCodes/hsCodes.queries.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { HsCodesAcl } from "./hsCodes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { HsCodesModels } from "./hsCodes.models"; -import { HsCodesApi } from "./hsCodes.api"; - -export namespace HsCodesQueries { -export const moduleName = QueryModule.HsCodes; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string) => [...keys.all, "/hs-codes", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/hs-codes/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate HS Codes - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate HS Codes - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new HS Code - * @permission Requires `canUseCreate` ability - * @param { HsCodesModels.CreateHsCodeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(HsCodesAcl.canUseCreate()); - return HsCodesApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate HS codes with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate HS codes with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get HS Code Details by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(HsCodesAcl.canUseFindById()); - return HsCodesApi.findById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update an existing HS Code - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { HsCodesModels.UpdateHsCodeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(HsCodesAcl.canUseUpdate()); - return HsCodesApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive an HS Code - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(HsCodesAcl.canUseArchive()); - return HsCodesApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive an HS Code - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(HsCodesAcl.canUseUnarchive()); - return HsCodesApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/integrationChannels/integrationChannels.acl.ts b/test/generated/full/integrationChannels/integrationChannels.acl.ts deleted file mode 100644 index de4ba2a..0000000 --- a/test/generated/full/integrationChannels/integrationChannels.acl.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace IntegrationChannelsAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List integration channels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Create", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Read integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useTestConnection` mutation ability. For global ability, omit the object parameter. - * @description Test integration channel connection - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTestConnection` mutation - */ -export const canUseTestConnection = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useListMessages` query ability. For global ability, omit the object parameter. - * @description List integration channel messages - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListMessages` query - */ -export const canUseListMessages = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("IntegrationMessage", object) : "IntegrationMessage" -] as AbilityTuple<"Read", "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, }>; - -} diff --git a/test/generated/full/integrationChannels/integrationChannels.api.ts b/test/generated/full/integrationChannels/integrationChannels.api.ts deleted file mode 100644 index d1996fc..0000000 --- a/test/generated/full/integrationChannels/integrationChannels.api.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; - -export namespace IntegrationChannelsApi { -export const list = (officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, - `/offices/${officeId}/integration-channels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels`, - ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), - config - ) -}; -export const findById = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}`, - config - ) -}; -export const update = (officeId: string, id: string, data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}`, - ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), - config - ) -}; -export const archive = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/unarchive`, - undefined, - config - ) -}; -export const testConnection = (officeId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/test-connection`, - undefined, - config - ) -}; -export const listMessages = (officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, - `/offices/${officeId}/integration-channels/${id}/messages`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/full/integrationChannels/integrationChannels.configs.ts b/test/generated/full/integrationChannels/integrationChannels.configs.ts deleted file mode 100644 index 1b6f063..0000000 --- a/test/generated/full/integrationChannels/integrationChannels.configs.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; -import { IntegrationChannelsQueries } from "./integrationChannels.queries"; -import { IntegrationChannelsAcl } from "./integrationChannels.acl"; - -export namespace IntegrationChannelsConfigs { -export const integrationChannelsConfig = { - meta: { - title: "Integration Channels", - }, - readAll: { - acl: IntegrationChannelsAcl.canUseList, - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - paginated: IntegrationChannelsQueries.useList, - infinite: IntegrationChannelsQueries.useListInfinite, - filters: { - schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - options: { - columns: { - id: true, - officeId: true, - businessPartnerId: true, - businessPartner: true, - employeeId: true, - name: true, - archived: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - lastPolledAt: true, - createdAt: true, - createdById: true, - createdBy: true, - updatedAt: true, - updatedById: true, - updatedBy: true, - }, - sortable: IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: IntegrationChannelsAcl.canUseFindById, - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - query: IntegrationChannelsQueries.useFindById, - }, - create: { - acl: IntegrationChannelsAcl.canUseCreate, - schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, - mutation: IntegrationChannelsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, - options: { - inputs: { - businessPartnerId: true, - employeeId: true, - name: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - sftpPassword: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - }, - }, -}) - }, - update: { - acl: IntegrationChannelsAcl.canUseUpdate, - schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, - mutation: IntegrationChannelsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, - options: { - inputs: { - businessPartnerId: true, - employeeId: true, - name: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - sftpPassword: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - }, - }, -}) - }, -}; - -export const messagesConfig = { - meta: { - title: "Messages", - }, - readAll: { - acl: IntegrationChannelsAcl.canUseListMessages, - schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, - paginated: IntegrationChannelsQueries.useListMessages, - infinite: IntegrationChannelsQueries.useListMessagesInfinite, - filters: { - schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, - options: { - inputs: { - direction: true, - format: true, - status: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, - options: { - columns: { - id: true, - integrationChannelId: true, - positionId: true, - positionNumber: true, - direction: true, - format: true, - status: true, - rawContent: true, - fileName: true, - errorMessage: true, - processedAt: true, - sentAt: true, - createdAt: true, - }, - sortable: IntegrationChannelsModels.ListMessagesOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/integrationChannels/integrationChannels.models.ts b/test/generated/full/integrationChannels/integrationChannels.models.ts deleted file mode 100644 index d3f8e74..0000000 --- a/test/generated/full/integrationChannels/integrationChannels.models.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace IntegrationChannelsModels { -/** - * IntegrationChannelBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const IntegrationChannelBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type IntegrationChannelBusinessPartnerResponseDto = z.infer; - -/** - * IntegrationChannelEmployeeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const IntegrationChannelEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type IntegrationChannelEmployeeResponseDto = z.infer; - -/** - * IntegrationChannelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } businessPartnerId - * @property { IntegrationChannelBusinessPartnerResponseDto } businessPartner - * @property { string } employeeId - * @property { string } name - * @property { boolean } archived - * @property { string } sftpHost - * @property { number } sftpPort - * @property { string } sftpUsername - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes - * @property { string } lastPolledAt - * @property { string } createdAt - * @property { string } createdById - * @property { IntegrationChannelEmployeeResponseDto } createdBy - * @property { string } updatedAt - * @property { string } updatedById - * @property { IntegrationChannelEmployeeResponseDto } updatedBy - */ -export const IntegrationChannelResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), businessPartnerId: z.string(), businessPartner: IntegrationChannelBusinessPartnerResponseDtoSchema, employeeId: z.string(), name: z.string(), archived: z.boolean(), sftpHost: z.string(), sftpPort: z.number(), sftpUsername: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number(), lastPolledAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), createdById: z.string(), createdBy: IntegrationChannelEmployeeResponseDtoSchema, updatedAt: z.iso.datetime({ offset: true }), updatedById: z.string(), updatedBy: IntegrationChannelEmployeeResponseDtoSchema }).readonly(); -export type IntegrationChannelResponseDto = z.infer; - -/** - * IntegrationMessageDirectionEnumSchema - * @type { enum } - */ -export const IntegrationMessageDirectionEnumSchema = z.enum(["Inbound", "Outbound"]); -export type IntegrationMessageDirectionEnum = z.infer; -export const IntegrationMessageDirectionEnum = IntegrationMessageDirectionEnumSchema.enum; - -/** - * IntegrationMessageFormatEnumSchema - * @type { enum } - */ -export const IntegrationMessageFormatEnumSchema = z.enum(["IFTMBF", "IFTMBC"]); -export type IntegrationMessageFormatEnum = z.infer; -export const IntegrationMessageFormatEnum = IntegrationMessageFormatEnumSchema.enum; - -/** - * IntegrationMessageStatusEnumSchema - * @type { enum } - */ -export const IntegrationMessageStatusEnumSchema = z.enum(["Received", "Processed", "Failed", "Sent"]); -export type IntegrationMessageStatusEnum = z.infer; -export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.enum; - -/** - * IntegrationMessageFilterDtoSchema - * @type { object } - * @property { IntegrationMessageDirectionEnum } direction - * @property { IntegrationMessageFormatEnum } format - * @property { IntegrationMessageStatusEnum } status - * @property { string } search - */ -export const IntegrationMessageFilterDtoSchema = z.object({ direction: IntegrationMessageDirectionEnumSchema, format: IntegrationMessageFormatEnumSchema, status: IntegrationMessageStatusEnumSchema, search: z.string() }).readonly(); -export type IntegrationMessageFilterDto = z.infer; - -/** - * IntegrationChannelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const IntegrationChannelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type IntegrationChannelFilterDto = z.infer; - -/** - * CreateIntegrationChannelRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } employeeId - * @property { string } name - * @property { string } sftpHost - * @property { number } sftpPort Minimum: `1`. Maximum: `65535` - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes Minimum: `1` - */ -export const CreateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string(), employeeId: z.string(), name: z.string(), sftpHost: z.string(), sftpPort: z.number().gte(1).lte(65535), sftpUsername: z.string(), sftpPassword: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number().gte(1) }).readonly(); -export type CreateIntegrationChannelRequestDto = z.infer; - -/** - * UpdateIntegrationChannelRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } employeeId - * @property { string } name - * @property { string } sftpHost - * @property { number } sftpPort Minimum: `1`. Maximum: `65535` - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes Minimum: `1` - */ -export const UpdateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string(), employeeId: z.string(), name: z.string(), sftpHost: z.string(), sftpPort: z.number().gte(1).lte(65535), sftpUsername: z.string(), sftpPassword: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number().gte(1) }).readonly(); -export type UpdateIntegrationChannelRequestDto = z.infer; - -/** - * TestConnectionResponseDtoSchema - * @type { object } - * @property { boolean } success - */ -export const TestConnectionResponseDtoSchema = z.object({ success: z.boolean() }).readonly(); -export type TestConnectionResponseDto = z.infer; - -/** - * IntegrationMessageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } integrationChannelId - * @property { string } positionId - * @property { string } positionNumber - * @property { string } direction - * @property { string } format - * @property { string } status - * @property { string } rawContent - * @property { string } fileName - * @property { string } errorMessage - * @property { string } processedAt - * @property { string } sentAt - * @property { string } createdAt - */ -export const IntegrationMessageResponseDtoSchema = z.object({ id: z.string(), integrationChannelId: z.string(), positionId: z.string().nullish(), positionNumber: z.string().nullish(), direction: z.string(), format: z.string(), status: z.string(), rawContent: z.string(), fileName: z.string(), errorMessage: z.string().nullish(), processedAt: z.iso.datetime({ offset: true }).nullish(), sentAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }) }).readonly(); -export type IntegrationMessageResponseDto = z.infer; - -/** - * IntegrationChannelsListOrderParamEnumSchema - * @type { enum } - */ -export const IntegrationChannelsListOrderParamEnumSchema = z.enum(["createdAt", "name", "businessPartner", "lastPolledAt"]); -export type IntegrationChannelsListOrderParamEnum = z.infer; -export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrderParamEnumSchema.enum; - -/** - * IntegrationChannelsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { IntegrationChannelResponseDto[] } items - */ -export const IntegrationChannelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).readonly() }).readonly().shape }); -export type IntegrationChannelsListResponse = z.infer; - -/** - * ListMessagesOrderParamEnumSchema - * @type { enum } - */ -export const ListMessagesOrderParamEnumSchema = z.enum(["createdAt", "status", "direction", "format"]); -export type ListMessagesOrderParamEnum = z.infer; -export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; - -/** - * ListMessagesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { IntegrationMessageResponseDto[] } items - */ -export const ListMessagesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).readonly() }).readonly().shape }); -export type ListMessagesResponse = z.infer; - -} diff --git a/test/generated/full/integrationChannels/integrationChannels.queries.ts b/test/generated/full/integrationChannels/integrationChannels.queries.ts deleted file mode 100644 index 9b9b630..0000000 --- a/test/generated/full/integrationChannels/integrationChannels.queries.ts +++ /dev/null @@ -1,303 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { IntegrationChannelsAcl } from "./integrationChannels.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; -import { IntegrationChannelsApi } from "./integrationChannels.api"; - -export namespace IntegrationChannelsQueries { -export const moduleName = QueryModule.IntegrationChannels; - -export const keys = { - all: [moduleName] as const, - list: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/integration-channels/:id", officeId, id] as const, - listMessages: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", officeId, id, limit, order, filter, page, cursor] as const, - listMessagesInfinite: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", "infinite", officeId, id, limit, order, filter, cursor] as const, -}; - -/** - * Query `useList` - * @summary List integration channels for an office - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); - return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List integration channels for an office - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); - return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create integration channel - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { IntegrationChannelsModels.CreateIntegrationChannelRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId } )); - return IntegrationChannelsApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get integration channel by id - * @permission Requires `canUseFindById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(officeId, id), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId } )); - return IntegrationChannelsApi.findById(officeId, id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update integration channel by id - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId } )); - return IntegrationChannelsApi.update(officeId, id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive integration channel by id - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId } )); - return IntegrationChannelsApi.archive(officeId, id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive integration channel by id - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId } )); - return IntegrationChannelsApi.unarchive(officeId, id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useTestConnection` - * @summary Test integration channel SFTP connection - * @permission Requires `canUseTestConnection` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useTestConnection = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId } )); - return IntegrationChannelsApi.testConnection(officeId, id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListMessages` - * @summary Paginate integration channel messages - * @permission Requires `canUseListMessages` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListMessages = ({ officeId, id, limit, order, filter, page, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListMessagesInfinite - * @summary Paginate integration channel messages - * @permission Requires `canUseListMessages` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListMessagesInfinite = ({ officeId, id, limit, order, filter, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts deleted file mode 100644 index 81c9083..0000000 --- a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InttraOfficeIntegrationAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Read", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -} diff --git a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.api.ts b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.api.ts deleted file mode 100644 index 07235c7..0000000 --- a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.api.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; - -export namespace InttraOfficeIntegrationApi { -export const get = (officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - config - ) -}; -export const generate = (officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - undefined, - config - ) -}; -export const update = (officeId: string, data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.models.ts b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.models.ts deleted file mode 100644 index fee95ed..0000000 --- a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.models.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { z } from "zod"; - -export namespace InttraOfficeIntegrationModels { -/** - * OfficeInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } rotatedByUserId - * @property { string } officeId - * @property { string } sftpUsername - * @property { string } sftpPublicKey - * @property { string } partnerCode - * @property { string } ediId - * @property { string } notificationEmail - */ -export const OfficeInttraCredentialsResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string().nullish(), officeId: z.string(), sftpUsername: z.string().nullish(), sftpPublicKey: z.string().nullish(), partnerCode: z.string().nullish(), ediId: z.string().nullish(), notificationEmail: z.string().nullish() }).readonly(); -export type OfficeInttraCredentialsResponseDto = z.infer; - -/** - * GenerateInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } publicKey - * @property { string } rotatedAt - * @property { string } rotatedByUserId - */ -export const GenerateInttraCredentialsResponseDtoSchema = z.object({ publicKey: z.string(), rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }).readonly(); -export type GenerateInttraCredentialsResponseDto = z.infer; - -/** - * UpdateInttraCredentialsRequestDtoSchema - * @type { object } - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } partnerCode - * @property { string } ediId - * @property { string } notificationEmail - */ -export const UpdateInttraCredentialsRequestDtoSchema = z.object({ sftpUsername: z.string(), sftpPassword: z.string(), partnerCode: z.string(), ediId: z.string(), notificationEmail: z.string() }).readonly(); -export type UpdateInttraCredentialsRequestDto = z.infer; - -/** - * UpdateInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } rotatedAt - * @property { string } rotatedByUserId - */ -export const UpdateInttraCredentialsResponseDtoSchema = z.object({ rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }).readonly(); -export type UpdateInttraCredentialsResponseDto = z.infer; - -} diff --git a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts b/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts deleted file mode 100644 index 384b020..0000000 --- a/test/generated/full/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InttraOfficeIntegrationAcl } from "./inttraOfficeIntegration.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; -import { InttraOfficeIntegrationApi } from "./inttraOfficeIntegration.api"; - -export namespace InttraOfficeIntegrationQueries { -export const moduleName = QueryModule.InttraOfficeIntegration; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string) => [...keys.all, "/offices/:officeId/inttra/credentials", officeId] as const, -}; - -/** - * Query `useGet` - * @summary Get INTTRA credentials for an office - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId }: { officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId), - queryFn: () => { - checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId } )); - return InttraOfficeIntegrationApi.get(officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useGenerate` - * @summary Generate and persist INTTRA SFTP RSA key pair for an office - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId }) => { - checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId } )); - return InttraOfficeIntegrationApi.generate(officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Manually update INTTRA credentials (username/password/passphrase) - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId } )); - return InttraOfficeIntegrationApi.update(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts deleted file mode 100644 index 268366c..0000000 --- a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InttraShippingInstructionMessagesAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List SI messages - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create SI message - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -/** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Get SI message details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update SI message - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts deleted file mode 100644 index 0159428..0000000 --- a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; - -export namespace InttraShippingInstructionMessagesApi { -export const list = (officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - filter: ZodExtended.parse(InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - }, - } - ) -}; -export const create = (officeId: string, positionId: string, shippingInstructionsId: string, data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, - ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), - config - ) -}; -export const getById = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - config - ) -}; -export const update = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts deleted file mode 100644 index fbb3b0b..0000000 --- a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; -import { InttraShippingInstructionMessagesQueries } from "./inttraShippingInstructionMessages.queries"; -import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; - -export namespace InttraShippingInstructionMessagesConfigs { -export const messagesConfig = { - meta: { - title: "Messages", - }, - readAll: { - acl: InttraShippingInstructionMessagesAcl.canUseList, - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, - paginated: InttraShippingInstructionMessagesQueries.useList, - infinite: InttraShippingInstructionMessagesQueries.useListInfinite, - filters: { - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, - options: { - inputs: { - status: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, - options: { - columns: { - id: true, - createdAt: true, - updatedAt: true, - shippingInstructionsId: true, - positionId: true, - createdByUserId: true, - status: true, - fileName: true, - sftpPath: true, - sentAt: true, - uploadAttemptCount: true, - lastUploadError: true, - notes: true, - contrlStatus: true, - contrlReceivedAt: true, - contrlRaw: true, - aperakStatus: true, - aperakReceivedAt: true, - aperakRaw: true, - }, - }, -}), - }, - read: { - acl: InttraShippingInstructionMessagesAcl.canUseGetById, - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema, - query: InttraShippingInstructionMessagesQueries.useGetById, - }, - create: { - acl: InttraShippingInstructionMessagesAcl.canUseCreate, - schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, - mutation: InttraShippingInstructionMessagesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, - options: { - inputs: { - isAmendment: true, - }, - }, -}) - }, - update: { - acl: InttraShippingInstructionMessagesAcl.canUseUpdate, - schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, - mutation: InttraShippingInstructionMessagesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, - options: { - inputs: { - notes: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts deleted file mode 100644 index 0537827..0000000 --- a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InttraShippingInstructionMessagesModels { -/** - * InttraShippingInstructionStatusEnumSchema - * @type { enum } - */ -export const InttraShippingInstructionStatusEnumSchema = z.enum(["PendingUpload", "Uploaded", "ContrlAccepted", "ContrlRejected", "AperakAccepted", "AperakRejected", "FailedUpload"]); -export type InttraShippingInstructionStatusEnum = z.infer; -export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStatusEnumSchema.enum; - -/** - * ShippingInstructionMessageListItemResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } shippingInstructionsId - * @property { string } positionId - * @property { string } createdByUserId - * @property { InttraShippingInstructionStatusEnum } status - * @property { string } fileName - * @property { string } sftpPath - * @property { string } sentAt - * @property { number } uploadAttemptCount - * @property { string } lastUploadError - * @property { string } notes - * @property { string } contrlStatus - * @property { string } contrlReceivedAt - * @property { string } contrlRaw - * @property { string } aperakStatus - * @property { string } aperakReceivedAt - * @property { string } aperakRaw - */ -export const ShippingInstructionMessageListItemResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }).readonly(); -export type ShippingInstructionMessageListItemResponseDto = z.infer; - -/** - * ShippingInstructionMessageFilterDtoSchema - * @type { object } - * @property { InttraShippingInstructionStatusEnum[] } status - */ -export const ShippingInstructionMessageFilterDtoSchema = z.object({ status: z.array(InttraShippingInstructionStatusEnumSchema).readonly() }).readonly(); -export type ShippingInstructionMessageFilterDto = z.infer; - -/** - * ShippingInstructionMessageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } shippingInstructionsId - * @property { string } positionId - * @property { string } createdByUserId - * @property { InttraShippingInstructionStatusEnum } status - * @property { object } shippingInstructionSnapshot - * @property { string } renderedRequestPayload - * @property { string } fileName - * @property { string } sftpPath - * @property { string } sentAt - * @property { number } uploadAttemptCount - * @property { string } lastUploadError - * @property { string } notes - * @property { string } contrlStatus - * @property { string } contrlReceivedAt - * @property { string } contrlRaw - * @property { string } aperakStatus - * @property { string } aperakReceivedAt - * @property { string } aperakRaw - */ -export const ShippingInstructionMessageResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, shippingInstructionSnapshot: z.object({}).readonly(), renderedRequestPayload: z.string(), fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }).readonly(); -export type ShippingInstructionMessageResponseDto = z.infer; - -/** - * UpdateShippingInstructionMessageRequestDtoSchema - * @type { object } - * @property { string } notes - */ -export const UpdateShippingInstructionMessageRequestDtoSchema = z.object({ notes: z.string() }).readonly(); -export type UpdateShippingInstructionMessageRequestDto = z.infer; - -/** - * CreateShippingInstructionMessageRequestDtoSchema - * @type { object } - * @property { boolean } isAmendment Default: `false` - */ -export const CreateShippingInstructionMessageRequestDtoSchema = z.object({ isAmendment: z.boolean().default(false) }).readonly(); -export type CreateShippingInstructionMessageRequestDto = z.infer; - -/** - * InttraShippingInstructionMessagesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ShippingInstructionMessageListItemResponseDto[] } items - */ -export const InttraShippingInstructionMessagesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ShippingInstructionMessageListItemResponseDtoSchema).readonly() }).readonly().shape }); -export type InttraShippingInstructionMessagesListResponse = z.infer; - -} diff --git a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts b/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts deleted file mode 100644 index f1e57ad..0000000 --- a/test/generated/full/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; -import { InttraShippingInstructionMessagesApi } from "./inttraShippingInstructionMessages.api"; - -export namespace InttraShippingInstructionMessagesQueries { -export const moduleName = QueryModule.InttraShippingInstructionMessages; - -export const keys = { - all: [moduleName] as const, - list: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", officeId, positionId, shippingInstructionsId, limit, page, cursor, filter] as const, - listInfinite: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", "infinite", officeId, positionId, shippingInstructionsId, limit, cursor, filter] as const, - getById: (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages/:messageId", officeId, positionId, shippingInstructionsId, messageId] as const, -}; - -/** - * Query `useList` - * @summary List Inttra shipping instruction messages for a position/BL instructions - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, positionId, shippingInstructionsId, limit, page, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), - queryFn: () => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); - return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List Inttra shipping instruction messages for a position/BL instructions - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, positionId, shippingInstructionsId, limit, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), - queryFn: ({ pageParam }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); - return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, pageParam, cursor, filter, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Inttra shipping instruction message - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.shippingInstructionsId Path parameter - * @param { InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId } )); - return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetById` - * @summary Get Inttra shipping instruction message details - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { string } object.messageId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ officeId, positionId, shippingInstructionsId, messageId }: { officeId: string, positionId: string, shippingInstructionsId: string, messageId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), - queryFn: () => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId } )); - return InttraShippingInstructionMessagesApi.getById(officeId, positionId, shippingInstructionsId, messageId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Inttra shipping instruction message - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.shippingInstructionsId Path parameter - * @param { string } mutation.messageId Path parameter - * @param { InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId } )); - return InttraShippingInstructionMessagesApi.update(officeId, positionId, shippingInstructionsId, messageId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, shippingInstructionsId, messageId } = variables; - const updateKeys = [keys.getById(officeId, positionId, shippingInstructionsId, messageId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/invoicePayments/invoicePayments.acl.ts b/test/generated/full/invoicePayments/invoicePayments.acl.ts deleted file mode 100644 index e3061ca..0000000 --- a/test/generated/full/invoicePayments/invoicePayments.acl.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InvoicePaymentsAcl { -/** - * Use for `useListOfficePayments` query ability. For global ability, omit the object parameter. - * @description List office payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListOfficePayments` query - */ -export const canUseListOfficePayments = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useBulkCreatePayments` mutation ability. For global ability, omit the object parameter. - * @description Bulk create invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useBulkCreatePayments` mutation - */ -export const canUseBulkCreatePayments = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCalculatePayments` mutation ability. For global ability, omit the object parameter. - * @description Calculate invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCalculatePayments` mutation - */ -export const canUseCalculatePayments = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportOfficePayments` mutation ability. For global ability, omit the object parameter. - * @description Export office invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportOfficePayments` mutation - */ -export const canUseExportOfficePayments = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("InvoicePayment", object) : "InvoicePayment" -] as AbilityTuple<"Export", "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetPaymentById` query ability. For global ability, omit the object parameter. - * @description Create invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPaymentById` query - */ -export const canUseGetPaymentById = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useDeleteInvoicePayment` mutation ability. For global ability, omit the object parameter. - * @description Delete invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoicePayment` mutation - */ -export const canUseDeleteInvoicePayment = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/full/invoicePayments/invoicePayments.api.ts b/test/generated/full/invoicePayments/invoicePayments.api.ts deleted file mode 100644 index 170e7d1..0000000 --- a/test/generated/full/invoicePayments/invoicePayments.api.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; - -export namespace InvoicePaymentsApi { -export const listOfficePayments = (officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, - `/offices/${officeId}/payments`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const bulkCreatePayments = (officeId: string, data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, - `/offices/${officeId}/payments`, - ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), - config - ) -}; -export const calculatePayments = (officeId: string, data: InvoicePaymentsModels.CalculatePaymentsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, - `/offices/${officeId}/payments/calculate`, - ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), - config - ) -}; -export const exportOfficePayments = (officeId: string, data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payments/exports`, - ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const list = (officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, invoiceId: string, data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments`, - ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), - config - ) -}; -export const getPaymentById = (officeId: string, invoiceId: string, paymentId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - config - ) -}; -export const update = (officeId: string, invoiceId: string, paymentId: string, data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), - config - ) -}; -export const deleteInvoicePayment = (officeId: string, invoiceId: string, paymentId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/invoicePayments/invoicePayments.configs.ts b/test/generated/full/invoicePayments/invoicePayments.configs.ts deleted file mode 100644 index 9f2d9ca..0000000 --- a/test/generated/full/invoicePayments/invoicePayments.configs.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; -import { InvoicePaymentsQueries } from "./invoicePayments.queries"; -import { InvoicePaymentsAcl } from "./invoicePayments.acl"; - -export namespace InvoicePaymentsConfigs { -export const paymentsConfig = { - meta: { - title: "Payments", - }, - readAll: { - acl: InvoicePaymentsAcl.canUseListOfficePayments, - schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, - paginated: InvoicePaymentsQueries.useListOfficePayments, - infinite: InvoicePaymentsQueries.useListOfficePaymentsInfinite, - filters: { - schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, - options: { - inputs: { - search: true, - paymentDate: true, - invoiceIssuingDate: true, - invoiceDirection: true, - createdBy: true, - businessPartner: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, - options: { - columns: { - id: true, - amount: true, - positionNumber: true, - currencyNotation: true, - paymentDate: true, - paymentMethod: true, - comment: true, - createdAt: true, - updatedAt: true, - createdBy: true, - invoice: true, - businessPartner: true, - }, - sortable: InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema, - }, -}), - }, - create: { - acl: InvoicePaymentsAcl.canUseBulkCreatePayments, - schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, - mutation: InvoicePaymentsQueries.useBulkCreatePayments, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, - options: { - inputs: { - paymentDate: true, - invoiceIds: true, - comment: true, - }, - }, -}) - }, -}; - -export const invoicesPaymentsConfig = { - meta: { - title: "Invoices Payments", - }, - readAll: { - acl: InvoicePaymentsAcl.canUseList, - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - paginated: InvoicePaymentsQueries.useList, - infinite: InvoicePaymentsQueries.useListInfinite, - columns: dynamicColumns({ - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - options: { - columns: { - id: true, - amount: true, - currencyNotation: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - bankAccount: true, - comment: true, - createdAt: true, - updatedAt: true, - createdBy: true, - }, - }, -}), - }, - read: { - acl: InvoicePaymentsAcl.canUseGetPaymentById, - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - query: InvoicePaymentsQueries.useGetPaymentById, - }, - create: { - acl: InvoicePaymentsAcl.canUseCreate, - schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, - mutation: InvoicePaymentsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, - options: { - inputs: { - amount: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - comment: true, - }, - }, -}) - }, - update: { - acl: InvoicePaymentsAcl.canUseUpdate, - schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, - mutation: InvoicePaymentsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, - options: { - inputs: { - amount: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - comment: true, - }, - }, -}) - }, - delete: { - acl: InvoicePaymentsAcl.canUseDeleteInvoicePayment, - mutation: InvoicePaymentsQueries.useDeleteInvoicePayment, - }, -}; - -} diff --git a/test/generated/full/invoicePayments/invoicePayments.models.ts b/test/generated/full/invoicePayments/invoicePayments.models.ts deleted file mode 100644 index 3605942..0000000 --- a/test/generated/full/invoicePayments/invoicePayments.models.ts +++ /dev/null @@ -1,292 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicePaymentsModels { -/** - * OfficePaymentTotalAmountsDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ -export const OfficePaymentTotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); -export type OfficePaymentTotalAmountsDto = z.infer; - -/** - * OfficePaymentListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { OfficePaymentTotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const OfficePaymentListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalAmounts: z.array(OfficePaymentTotalAmountsDtoSchema).readonly(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); -export type OfficePaymentListResponseDto = z.infer; - -/** - * OfficePaymentPreviewInvoiceDtoSchema - * @type { object } - * @property { string } id - * @property { string } invoiceNumber - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection - * @property { number } grossAmount - * @property { CommonModels.InvoiceStatusEnum } status - * @property { string } paidOn - * @property { string } issuingDate - */ -export const OfficePaymentPreviewInvoiceDtoSchema = z.object({ id: z.string(), invoiceNumber: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, grossAmount: z.number(), status: CommonModels.InvoiceStatusEnumSchema, paidOn: z.iso.datetime({ offset: true }).nullable(), issuingDate: z.iso.datetime({ offset: true }).nullable() }).readonly(); -export type OfficePaymentPreviewInvoiceDto = z.infer; - -/** - * PaymentMethodEnumSchema - * @type { enum } - */ -export const PaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); -export type PaymentMethodEnum = z.infer; -export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; - -/** - * OfficePaymentPreviewCreatedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type OfficePaymentPreviewCreatedByDto = z.infer; - -/** - * OfficePaymentBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const OfficePaymentBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); -export type OfficePaymentBusinessPartnerDto = z.infer; - -/** - * OfficePaymentPreviewDtoSchema - * @type { object } - * @property { string } id - * @property { number } amount - * @property { string } positionNumber - * @property { string } currencyNotation - * @property { string } paymentDate - * @property { PaymentMethodEnum } paymentMethod - * @property { string } comment - * @property { string } createdAt - * @property { string } updatedAt - * @property { OfficePaymentPreviewCreatedByDto } createdBy - * @property { OfficePaymentPreviewInvoiceDto } invoice - * @property { OfficePaymentBusinessPartnerDto } businessPartner - */ -export const OfficePaymentPreviewDtoSchema = z.object({ id: z.string(), amount: z.number(), positionNumber: z.string(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: OfficePaymentPreviewCreatedByDtoSchema, invoice: OfficePaymentPreviewInvoiceDtoSchema, businessPartner: OfficePaymentBusinessPartnerDtoSchema.nullish() }).readonly(); -export type OfficePaymentPreviewDto = z.infer; - -/** - * OfficeInvoicePaymentFilterDtoSchema - * @type { object } - * @property { string } search Search by invoice number - * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range - * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction - * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) - * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) - */ -export const OfficeInvoicePaymentFilterDtoSchema = z.object({ search: z.string().describe("Search by invoice number"), paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly().describe("Filter by invoice direction"), createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), businessPartner: z.array(z.string()).readonly().describe("Filter by invoice customer/business partner (array of UUIDs)") }).readonly(); -export type OfficeInvoicePaymentFilterDto = z.infer; - -/** - * BulkCreatePaymentBusinessPartnerDtoSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } name Business partner name - * @property { string } paymentDate Payment date applied to the partner invoices - */ -export const BulkCreatePaymentBusinessPartnerDtoSchema = z.object({ id: z.string().describe("Business partner ID"), name: z.string().describe("Business partner name"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date applied to the partner invoices") }).readonly(); -export type BulkCreatePaymentBusinessPartnerDto = z.infer; - -/** - * BulkCreatePaymentsResponseDtoSchema - * @type { object } - * @property { BulkCreatePaymentBusinessPartnerDto[] } businessPartners List of business partners paid in this bulk operation - */ -export const BulkCreatePaymentsResponseDtoSchema = z.object({ businessPartners: z.array(BulkCreatePaymentBusinessPartnerDtoSchema).readonly().describe("List of business partners paid in this bulk operation") }).readonly(); -export type BulkCreatePaymentsResponseDto = z.infer; - -/** - * CalculatePaymentItemDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } businessPartnerName - * @property { number } amount - * @property { string } currency - */ -export const CalculatePaymentItemDtoSchema = z.object({ businessPartnerId: z.string(), businessPartnerName: z.string(), amount: z.number(), currency: z.string() }).readonly(); -export type CalculatePaymentItemDto = z.infer; - -/** - * CalculatePaymentTotalDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currency - */ -export const CalculatePaymentTotalDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); -export type CalculatePaymentTotalDto = z.infer; - -/** - * CalculatePaymentsResponseDtoSchema - * @type { object } - * @property { CalculatePaymentItemDto[] } payments - * @property { CalculatePaymentTotalDto[] } totals - */ -export const CalculatePaymentsResponseDtoSchema = z.object({ payments: z.array(CalculatePaymentItemDtoSchema).readonly(), totals: z.array(CalculatePaymentTotalDtoSchema).readonly() }).readonly(); -export type CalculatePaymentsResponseDto = z.infer; - -/** - * OfficeInvoicePaymentExportFilterDtoSchema - * @type { object } - * @property { string } search Search by invoice number - * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range - * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction - * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) - * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) - */ -export const OfficeInvoicePaymentExportFilterDtoSchema = z.object({ search: z.string().describe("Search by invoice number"), paymentDate: CommonModels.DateRangeDtoSchema.describe("Filter by payment date range"), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.describe("Filter by invoice issuing date range"), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly().describe("Filter by invoice direction"), createdBy: z.array(z.string()).readonly().describe("Filter by created by employee IDs (array of UUIDs)"), businessPartner: z.array(z.string()).readonly().describe("Filter by invoice customer/business partner (array of UUIDs)") }).readonly(); -export type OfficeInvoicePaymentExportFilterDto = z.infer; - -/** - * OfficeInvoicePaymentExportColumnSchema - * @type { enum } - */ -export const OfficeInvoicePaymentExportColumnSchema = z.enum(["amount", "currency", "paymentDate", "paymentMethod", "comment", "positionNumber", "invoiceNumber", "invoiceDirection", "invoiceStatus", "invoiceIssuingDate", "invoiceGrossAmount", "invoicePaidOn", "businessPartnerName", "createdByName"]); -export type OfficeInvoicePaymentExportColumn = z.infer; -export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumnSchema.enum; - -/** - * OfficeInvoicePaymentExportRequestDtoSchema - * @type { object } - * @property { OfficeInvoicePaymentExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { OfficeInvoicePaymentExportFilterDto } filter - */ -export const OfficeInvoicePaymentExportRequestDtoSchema = z.object({ columns: z.array(OfficeInvoicePaymentExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: OfficeInvoicePaymentExportFilterDtoSchema }).readonly(); -export type OfficeInvoicePaymentExportRequestDto = z.infer; - -/** - * PaymentCreatedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PaymentCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PaymentCreatedByDto = z.infer; - -/** - * PaymentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { number } amount - * @property { string } currencyNotation - * @property { string } paymentDate - * @property { PaymentMethodEnum } paymentMethod - * @property { string } bankAccountId - * @property { string } bankAccount - * @property { string } comment - * @property { string } createdAt - * @property { string } updatedAt - * @property { PaymentCreatedByDto } createdBy - */ -export const PaymentResponseDtoSchema = z.object({ id: z.string(), amount: z.number(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, bankAccountId: z.string().nullish(), bankAccount: z.string().nullish(), comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: PaymentCreatedByDtoSchema.nullish() }).readonly(); -export type PaymentResponseDto = z.infer; - -/** - * PositionInvoicePaymentMethodEnumSchema - * @type { enum } - */ -export const PositionInvoicePaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); -export type PositionInvoicePaymentMethodEnum = z.infer; -export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnumSchema.enum; - -/** - * CreateInvoicePaymentRequestDtoSchema - * @type { object } - * @property { number } amount Payment amount - * @property { string } paymentDate Payment date - * @property { PositionInvoicePaymentMethodEnum } paymentMethod Payment method - * @property { string } bankAccountId Bank account ID - * @property { string } comment Optional comment - */ -export const CreateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number().describe("Payment amount"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), paymentMethod: PositionInvoicePaymentMethodEnumSchema.describe("Payment method"), bankAccountId: z.string().describe("Bank account ID").nullish(), comment: z.string().describe("Optional comment").nullish() }).readonly(); -export type CreateInvoicePaymentRequestDto = z.infer; - -/** - * UpdateInvoicePaymentRequestDtoSchema - * @type { object } - * @property { number } amount Payment amount. Minimum: `0.01` - * @property { string } paymentDate Payment date - * @property { string } paymentMethod Payment method - * @property { string } bankAccountId Bank account ID - * @property { string } comment Payment comment - */ -export const UpdateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number().gte(0.01).describe("Payment amount"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), paymentMethod: PaymentMethodEnumSchema.describe("Payment method"), bankAccountId: z.string().describe("Bank account ID"), comment: z.string().describe("Payment comment") }).readonly(); -export type UpdateInvoicePaymentRequestDto = z.infer; - -/** - * BulkCreatePaymentsRequestDtoSchema - * @type { object } - * @property { string } paymentDate Payment date for all payments - * @property { string[] } invoiceIds List of invoice IDs to create payments for. Min Items: `1` - * @property { string } comment - */ -export const BulkCreatePaymentsRequestDtoSchema = z.object({ paymentDate: z.iso.datetime({ offset: true }).describe("Payment date for all payments"), invoiceIds: z.array(z.string()).readonly().min(1).describe("List of invoice IDs to create payments for"), comment: z.string().nullish() }).readonly(); -export type BulkCreatePaymentsRequestDto = z.infer; - -/** - * CalculatePaymentsRequestDtoSchema - * @type { object } - * @property { string[] } invoiceIds Invoice IDs (UUID v4). Min Items: `1`. Max Items: `30` - */ -export const CalculatePaymentsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).readonly().min(1).max(30).describe("Invoice IDs (UUID v4)") }).readonly(); -export type CalculatePaymentsRequestDto = z.infer; - -/** - * ListOfficePaymentsOrderParamEnumSchema - * @type { enum } - */ -export const ListOfficePaymentsOrderParamEnumSchema = z.enum(["paymentDate", "amount", "paymentMethod", "comment", "createdAt", "updatedAt", "currencyNotation", "createdByName", "invoiceNumber", "invoiceDirection", "invoiceGrossAmount", "invoiceStatus", "invoicePaidOn", "invoiceIssuingDate"]); -export type ListOfficePaymentsOrderParamEnum = z.infer; -export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnumSchema.enum; - -/** - * ListOfficePaymentsResponseSchema - * @type { object } - * @property { OfficePaymentTotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficePaymentPreviewDto[] } items - */ -export const ListOfficePaymentsResponseSchema = z.object({ ...OfficePaymentListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).readonly() }).readonly().shape }); -export type ListOfficePaymentsResponse = z.infer; - -/** - * InvoicePaymentsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PaymentResponseDto[] } items - */ -export const InvoicePaymentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentResponseDtoSchema).readonly() }).readonly().shape }); -export type InvoicePaymentsListResponse = z.infer; - -} diff --git a/test/generated/full/invoicePayments/invoicePayments.queries.ts b/test/generated/full/invoicePayments/invoicePayments.queries.ts deleted file mode 100644 index 228c4ea..0000000 --- a/test/generated/full/invoicePayments/invoicePayments.queries.ts +++ /dev/null @@ -1,326 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InvoicePaymentsAcl } from "./invoicePayments.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; -import { InvoicePaymentsApi } from "./invoicePayments.api"; - -export namespace InvoicePaymentsQueries { -export const moduleName = QueryModule.InvoicePayments; - -export const keys = { - all: [moduleName] as const, - listOfficePayments: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payments", officeId, limit, order, filter, page, cursor] as const, - listOfficePaymentsInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/payments", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, invoiceId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", officeId, invoiceId, limit, page, cursor] as const, - listInfinite: (officeId: string, invoiceId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", "infinite", officeId, invoiceId, limit, cursor] as const, - getPaymentById: (officeId: string, invoiceId: string, paymentId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments/:paymentId", officeId, invoiceId, paymentId] as const, -}; - -/** - * Query `useListOfficePayments` - * @summary List all payments for an office - * @permission Requires `canUseListOfficePayments` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` - * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListOfficePayments = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListOfficePaymentsInfinite - * @summary List all payments for an office - * @permission Requires `canUseListOfficePayments` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` - * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListOfficePaymentsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useBulkCreatePayments` - * @summary Bulk create payments for multiple invoices - * @permission Requires `canUseBulkCreatePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.BulkCreatePaymentsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useBulkCreatePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId } )); - return InvoicePaymentsApi.bulkCreatePayments(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCalculatePayments` - * @summary Calculate grouped payments for provided invoices - * @permission Requires `canUseCalculatePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.CalculatePaymentsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useCalculatePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId } )); - return InvoicePaymentsApi.calculatePayments(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportOfficePayments` - recommended when file should not be cached - * @summary Export office invoice payments to Excel - * @permission Requires `canUseExportOfficePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportOfficePayments = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId } )); - return InvoicePaymentsApi.exportOfficePayments(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useList` - * @summary List payments for an invoice - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, invoiceId, limit, page, cursor }: { officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, invoiceId, limit, page, cursor), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List payments for an invoice - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, invoiceId, limit, cursor }: { officeId: string, invoiceId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a payment for an invoice - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicePaymentsModels.CreateInvoicePaymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId } )); - return InvoicePaymentsApi.create(officeId, invoiceId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetPaymentById` - * @summary Get a payment by ID - * @permission Requires `canUseGetPaymentById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { string } object.paymentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetPaymentById = ({ officeId, invoiceId, paymentId }: { officeId: string, invoiceId: string, paymentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId } )); - return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update a payment - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.paymentId Path parameter - * @param { InvoicePaymentsModels.UpdateInvoicePaymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, paymentId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId } )); - return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId, paymentId } = variables; - const updateKeys = [keys.getPaymentById(officeId, invoiceId, paymentId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteInvoicePayment` - * @summary Delete a payment - * @permission Requires `canUseDeleteInvoicePayment` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.paymentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteInvoicePayment = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, paymentId }) => { - checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId } )); - return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/invoices/invoices.acl.ts b/test/generated/full/invoices/invoices.acl.ts deleted file mode 100644 index 65b9c24..0000000 --- a/test/generated/full/invoices/invoices.acl.ts +++ /dev/null @@ -1,407 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InvoicesAcl { -/** - * Use for `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download invoices as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation - */ -export const canUseGetInvoicesEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useFind` query ability. For global ability, omit the object parameter. - * @description List invoices for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query - */ -export const canUseFind = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useChangeIncomingCustomer` mutation ability. For global ability, omit the object parameter. - * @description PositionInvoice Fix - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useChangeIncomingCustomer` mutation - */ -export const canUseChangeIncomingCustomer = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useFindByOffice` query ability. For global ability, omit the object parameter. - * @description List invoices for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByOffice` query - */ -export const canUseFindByOffice = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCreateDraft` mutation ability. For global ability, omit the object parameter. - * @description Create invoice for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDraft` mutation - */ -export const canUseCreateDraft = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Create", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportInvoices` mutation ability. For global ability, omit the object parameter. - * @description Export invoices for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportInvoices` mutation - */ -export const canUseExportInvoices = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportCharges` mutation ability. For global ability, omit the object parameter. - * @description Export invoice charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportCharges` mutation - */ -export const canUseExportCharges = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetUnCharges` query ability. For global ability, omit the object parameter. - * @description List uninvoiced charges for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetUnCharges` query - */ -export const canUseGetUnCharges = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ -export const canUseListAvailablePartnersFor = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetOfficeUnCharges` query ability. For global ability, omit the object parameter. - * @description List uninvoiced charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetOfficeUnCharges` query - */ -export const canUseGetOfficeUnCharges = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportUnCharges` mutation ability. For global ability, omit the object parameter. - * @description Export uninvoiced charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportUnCharges` mutation - */ -export const canUseExportUnCharges = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("UninvoicedCharge", object) : "UninvoicedCharge" -] as AbilityTuple<"Export", "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, }>; - -/** - * Use for `useCreateDirect` mutation ability. For global ability, omit the object parameter. - * @description Create direct invoice for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDirect` mutation - */ -export const canUseCreateDirect = ( - object?: { officeId: string, } -) => [ - "CreateDirectInvoice", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useAddChargeToDirect` mutation ability. For global ability, omit the object parameter. - * @description Add charge to direct invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddChargeToDirect` mutation - */ -export const canUseAddChargeToDirect = ( - object?: { officeId: string, } -) => [ - "UpdateDirectInvoice", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdateCharges` mutation ability. For global ability, omit the object parameter. - * @description Update invoice charges - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCharges` mutation - */ -export const canUseUpdateCharges = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useRemoveChargeFromDirect` mutation ability. For global ability, omit the object parameter. - * @description Remove charge from direct invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRemoveChargeFromDirect` mutation - */ -export const canUseRemoveChargeFromDirect = ( - object?: { officeId: string, } -) => [ - "UpdateDirectInvoice", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetDetail` query ability. For global ability, omit the object parameter. - * @description Read invoice details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDetail` query - */ -export const canUseGetDetail = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useDeleteInvoice` mutation ability. For global ability, omit the object parameter. - * @description Delete invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoice` mutation - */ -export const canUseDeleteInvoice = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Delete", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useFix` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice accounting issues - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFix` mutation - */ -export const canUseFix = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdateIssuedVatRules` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice VAT rules - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedVatRules` mutation - */ -export const canUseUpdateIssuedVatRules = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdateIssuedCharges` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice charges - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedCharges` mutation - */ -export const canUseUpdateIssuedCharges = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useIssue` mutation ability. For global ability, omit the object parameter. - * @description Issue invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssue` mutation - */ -export const canUseIssue = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useReportHungarian` mutation ability. For global ability, omit the object parameter. - * @description Report invoice to Hungarian tax authority - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReportHungarian` mutation - */ -export const canUseReportHungarian = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGenerateIncoming` mutation ability. For global ability, omit the object parameter. - * @description Generate incoming invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIncoming` mutation - */ -export const canUseGenerateIncoming = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useRegister` mutation ability. For global ability, omit the object parameter. - * @description Register invoice for bookkeeping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRegister` mutation - */ -export const canUseRegister = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetPreview` query or `useGetPreviewMutation` mutation ability. For global ability, omit the object parameter. - * @description View invoice preview - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` query or `useGetPreviewMutation` mutation - */ -export const canUseGetPreview = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download invoice as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation - */ -export const canUseGetInvoiceEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `usePrepareDocumentUpload` mutation ability. For global ability, omit the object parameter. - * @description Upload invoice document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareDocumentUpload` mutation - */ -export const canUsePrepareDocumentUpload = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ -export const canUseCancel = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useIssueCreditNote` mutation ability. For global ability, omit the object parameter. - * @description Issue credit note invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueCreditNote` mutation - */ -export const canUseIssueCreditNote = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/full/invoices/invoices.api.ts b/test/generated/full/invoices/invoices.api.ts deleted file mode 100644 index 336241b..0000000 --- a/test/generated/full/invoices/invoices.api.ts +++ /dev/null @@ -1,349 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicesApi { -export const getInvoicesEml = (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/eml`, - { - ...config, - params: { - invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { type: "query", name: "invoiceIds" }), - }, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const find = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoicesFindResponseSchema }, - `/offices/${officeId}/positions/${positionId}/invoices`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const changeIncomingCustomer = (officeId: string, invoiceId: string, data: InvoicesModels.ChangeInvoiceCustomerRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/customer`, - ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), - config - ) -}; -export const findByOffice = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InvoicesModels.FindByOfficeResponseSchema }, - `/offices/${officeId}/invoices`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createDraft = (officeId: string, data: InvoicesModels.CreateDraftInvoiceRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices`, - ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), - config - ) -}; -export const exportInvoices = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/exports`, - ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const exportCharges = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/charges/exports`, - ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getUnCharges = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InvoicesModels.GetUnChargesResponseSchema }, - `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listAvailablePartnersFor = (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/invoices/${invoiceId}/available-partners`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), - }, - } - ) -}; -export const getOfficeUnCharges = (officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, - `/offices/${officeId}/uninvoiced-charges`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const exportUnCharges = (officeId: string, data: InvoicesModels.UninvoicedChargesExportRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/uninvoiced-charges/exports`, - ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const createDirect = (officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/direct-invoices`, - undefined, - config - ) -}; -export const addChargeToDirect = (officeId: string, invoiceId: string, data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges`, - ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), - config - ) -}; -export const updateCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceChargesRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges`, - ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), - config - ) -}; -export const removeChargeFromDirect = (officeId: string, invoiceId: string, chargeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, - undefined, - config - ) -}; -export const getDetail = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}`, - config - ) -}; -export const update = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}`, - ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), - config - ) -}; -export const deleteInvoice = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}`, - undefined, - config - ) -}; -export const fix = (officeId: string, invoiceId: string, data: InvoicesModels.FixInvoiceRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix`, - ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), - config - ) -}; -export const generate = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/document`, - undefined, - config - ) -}; -export const updateIssuedVatRules = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, - ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), - config - ) -}; -export const updateIssuedCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, - ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), - config - ) -}; -export const issue = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/issue`, - undefined, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const reportHungarian = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, - undefined, - config - ) -}; -export const generateIncoming = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, - undefined, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const register = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/register`, - undefined, - config - ) -}; -export const getPreview = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getInvoiceEml = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/eml`, - { - ...config, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const prepareDocumentUpload = (officeId: string, invoiceId: string, data: InvoicesModels.PrepareUploadRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/upload-document`, - ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), - config - ) -}; -export const cancel = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/cancel`, - undefined, - config - ) -}; -export const issueCreditNote = (officeId: string, invoiceId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/invoices/invoices.configs.ts b/test/generated/full/invoices/invoices.configs.ts deleted file mode 100644 index 3443bf9..0000000 --- a/test/generated/full/invoices/invoices.configs.ts +++ /dev/null @@ -1,322 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { InvoicesQueries } from "./invoices.queries"; -import { InvoicesAcl } from "./invoices.acl"; - -export namespace InvoicesConfigs { -export const invoicesConfig = { - meta: { - title: "Invoices", - }, - readAll: { - acl: InvoicesAcl.canUseFindByOffice, - schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, - paginated: InvoicesQueries.useFindByOffice, - infinite: InvoicesQueries.useFindByOfficeInfinite, - filters: { - schema: CommonModels.OfficeInvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CommonModels.OfficeInvoiceFilterDtoSchema, - options: { - inputs: { - search: true, - issuingDate: true, - serviceDate: true, - invoiceDirection: true, - invoiceType: true, - collective: true, - amountMin: true, - amountMax: true, - currencyNotation: true, - vatRule: true, - dueDate: true, - status: true, - receiver: true, - receiverCountry: true, - salesRep: true, - positionNumbersString: true, - positionNumbers: true, - invoiceNumbersString: true, - invoiceNumbers: true, - bookkeepingExportStatus: true, - dunningBlock: true, - invoiceInReview: true, - isInvoiceOk: true, - isVatOk: true, - invoiceNumberMin: true, - invoiceNumberMax: true, - internalNumberMin: true, - internalNumberMax: true, - externalSystemId: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - creditorId: true, - debtorId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, - options: { - columns: { - id: true, - createdAt: true, - invoiceNumber: true, - invoiceDirection: true, - issuingDate: true, - invoiceType: true, - collective: true, - serviceDate: true, - internalNumber: true, - reference: true, - amount: true, - netAmount: true, - tax: true, - currency: true, - dueDate: true, - status: true, - payDate: true, - paidAmount: true, - position: true, - receiver: true, - receiverCountry: true, - clerk: true, - cancelled: true, - ok: true, - isExportedToBookkeeping: true, - dunningBlock: true, - invoiceInReview: true, - vatOk: true, - comments: true, - paymentComment: true, - creditorId: true, - debtorId: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vatRules: true, - }, - sortable: InvoicesModels.FindByOfficeOrderParamEnumSchema, - }, -}), - }, - read: { - acl: InvoicesAcl.canUseGetDetail, - schema: InvoicesModels.InvoiceDetailDtoSchema, - query: InvoicesQueries.useGetDetail, - }, - create: { - acl: InvoicesAcl.canUseCreateDraft, - schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, - mutation: InvoicesQueries.useCreateDraft, - inputDefs: dynamicInputs({ - schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, - options: { - inputs: { - chargeItemIds: true, - invoiceType: true, - customerId: true, - direction: true, - }, - }, -}) - }, - update: { - acl: InvoicesAcl.canUseUpdate, - schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, - mutation: InvoicesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, - options: { - inputs: { - issuingDate: true, - receiptDate: true, - serviceDate: true, - serviceDateUntil: true, - dueDate: true, - invoiceNumber: true, - internalNumber: true, - paymentTermDays: true, - paymentTermType: true, - serviceRecipientId: true, - bankAccountId: true, - remarks: true, - language: true, - showPaymentInstructions: true, - customer: true, - salesRepId: true, - currencyNotation: true, - exchangeRate: true, - }, - }, -}) - }, - delete: { - acl: InvoicesAcl.canUseDeleteInvoice, - mutation: InvoicesQueries.useDeleteInvoice, - }, -}; - -export const uninvoicedChargesConfig = { - meta: { - title: "Uninvoiced Charges", - }, - readAll: { - acl: InvoicesAcl.canUseGetOfficeUnCharges, - schema: InvoicesModels.UninvoicedChargeDtoSchema, - paginated: InvoicesQueries.useGetOfficeUnCharges, - infinite: InvoicesQueries.useGetOfficeUnChargesInfinite, - filters: { - schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, - options: { - inputs: { - direction: true, - chargeItemId: true, - receiverIds: true, - positionIds: true, - chargeTypeIds: true, - serviceDate: true, - currencies: true, - vatRuleIds: true, - employeeIds: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.UninvoicedChargeDtoSchema, - options: { - columns: { - chargeItemId: true, - invoiceDirection: true, - receiver: true, - position: true, - chargeType: true, - currencyNotation: true, - amount: true, - amountInOfficeCurrency: true, - officeCurrency: true, - exchangeRate: true, - vatRule: true, - serviceDate: true, - status: true, - missingInformation: true, - employee: true, - }, - sortable: InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema, - }, -}), - }, -}; - -export const positionsInvoicesConfig = { - meta: { - title: "Positions Invoices", - }, - readAll: { - acl: InvoicesAcl.canUseFind, - schema: InvoicesModels.InvoicePreviewDtoSchema, - paginated: InvoicesQueries.useFind, - infinite: InvoicesQueries.useFindInfinite, - filters: { - schema: InvoicesModels.InvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.InvoiceFilterDtoSchema, - options: { - inputs: { - status: true, - direction: true, - receiver: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.InvoicePreviewDtoSchema, - options: { - columns: { - id: true, - invoiceDirection: true, - invoiceType: true, - invoiceNumber: true, - issuingDate: true, - amount: true, - currencyNotation: true, - status: true, - isExportedToBookkeeping: true, - internalNumber: true, - receiver: true, - representative: true, - collective: true, - creditNote: true, - cancelledInvoice: true, - }, - sortable: InvoicesModels.InvoicesFindOrderParamEnumSchema, - }, -}), - }, -}; - -export const positionsUninvoicedChargesConfig = { - meta: { - title: "Positions Uninvoiced Charges", - }, - readAll: { - acl: InvoicesAcl.canUseGetUnCharges, - schema: InvoicesModels.UninvoicedChargeDtoSchema, - paginated: InvoicesQueries.useGetUnCharges, - infinite: InvoicesQueries.useGetUnChargesInfinite, - filters: { - schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, - options: { - inputs: { - direction: true, - chargeItemId: true, - receiverId: true, - chargeTypeId: true, - serviceDate: true, - currency: true, - vatRuleId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.UninvoicedChargeDtoSchema, - options: { - columns: { - chargeItemId: true, - invoiceDirection: true, - receiver: true, - position: true, - chargeType: true, - currencyNotation: true, - amount: true, - amountInOfficeCurrency: true, - officeCurrency: true, - exchangeRate: true, - vatRule: true, - serviceDate: true, - status: true, - missingInformation: true, - employee: true, - }, - sortable: InvoicesModels.GetUnChargesOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/invoices/invoices.models.ts b/test/generated/full/invoices/invoices.models.ts deleted file mode 100644 index 08cb405..0000000 --- a/test/generated/full/invoices/invoices.models.ts +++ /dev/null @@ -1,988 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicesModels { -/** - * InvoiceBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - */ -export const InvoiceBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(); -export type InvoiceBusinessPartnerResponseDto = z.infer; - -/** - * InvoiceEmployeeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoiceEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type InvoiceEmployeeResponseDto = z.infer; - -/** - * InvoiceRelatedInvoiceResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } internalNumber - */ -export const InvoiceRelatedInvoiceResponseDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }).readonly(); -export type InvoiceRelatedInvoiceResponseDto = z.infer; - -/** - * InvoicePreviewDtoSchema - * @type { object } - * @property { string } id - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection - * @property { CommonModels.InvoiceTypeEnum } invoiceType - * @property { string } invoiceNumber - * @property { string } issuingDate - * @property { number } amount - * @property { string } currencyNotation - * @property { CommonModels.InvoiceStatusEnum } status - * @property { boolean } isExportedToBookkeeping - * @property { string } internalNumber - * @property { InvoiceBusinessPartnerResponseDto } receiver - * @property { InvoiceEmployeeResponseDto } representative - * @property { boolean } collective - * @property { InvoiceRelatedInvoiceResponseDto } creditNote - * @property { InvoiceRelatedInvoiceResponseDto } cancelledInvoice - */ -export const InvoicePreviewDtoSchema = z.object({ id: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullable(), issuingDate: z.iso.datetime({ offset: true }).nullish(), amount: z.number(), currencyNotation: z.string(), status: CommonModels.InvoiceStatusEnumSchema, isExportedToBookkeeping: z.boolean(), internalNumber: z.string().nullish(), receiver: InvoiceBusinessPartnerResponseDtoSchema.nullish(), representative: InvoiceEmployeeResponseDtoSchema.nullish(), collective: z.boolean(), creditNote: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), cancelledInvoice: InvoiceRelatedInvoiceResponseDtoSchema.nullish() }).readonly(); -export type InvoicePreviewDto = z.infer; - -/** - * InvoicePartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const InvoicePartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); -export type InvoicePartnerDto = z.infer; - -/** - * InvoicePositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } transportType - * @property { string } ourReference - * @property { string } finalDestination - * @property { InvoicePartnerDto } shipper - * @property { InvoicePartnerDto } consignee - * @property { string } vessel - * @property { string } emptyPickup - * @property { string } loadingAddress - * @property { string } portOfLoading - * @property { string } portOfDischarge - * @property { string } carrierBl - * @property { string } houseBillOfLadingNumber - * @property { string } masterAWB - * @property { string } hawbNumber - * @property { string } flightNo - * @property { string } pickupAddress - * @property { string } originAirport - * @property { string } destinationAirport - * @property { string } originLocation - * @property { string } destinationLocation - * @property { string } dateOfDeparture - * @property { string } dateOfArrival - */ -export const InvoicePositionDtoSchema = z.object({ id: z.string(), number: z.string(), transportType: z.string(), ourReference: z.string().nullish(), finalDestination: z.string().nullish(), shipper: InvoicePartnerDtoSchema.nullish(), consignee: InvoicePartnerDtoSchema.nullish(), vessel: z.string().nullish(), emptyPickup: z.string().nullish(), loadingAddress: z.string().nullish(), portOfLoading: z.string().nullish(), portOfDischarge: z.string().nullish(), carrierBl: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterAWB: z.string().nullish(), hawbNumber: z.string().nullish(), flightNo: z.string().nullish(), pickupAddress: z.string().nullish(), originAirport: z.string().nullish(), destinationAirport: z.string().nullish(), originLocation: z.string().nullish(), destinationLocation: z.string().nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish() }).readonly(); -export type InvoicePositionDto = z.infer; - -/** - * InvoiceChargeTypeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type InvoiceChargeTypeDto = z.infer; - -/** - * InvoiceVatRuleDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { number } rate - */ -export const InvoiceVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }).readonly(); -export type InvoiceVatRuleDto = z.infer; - -/** - * InvoiceFinanceLineDtoSchema - * @type { object } - * @property { string } positionChargeItemId - * @property { InvoiceChargeTypeDto } chargeType - * @property { string } additionalText - * @property { number } quantity - * @property { number } netAmount - * @property { number } grossAmount - * @property { number } sumInInvoiceCurrency - * @property { number } sumInOfficeCurrency - * @property { string } currencyNotation - * @property { number } exchangeRate - * @property { InvoiceVatRuleDto } vatRule - * @property { number } exchangedNetAmount - * @property { string } positionNumber - * @property { string } positionId - * @property { string } outgoingInvoiceId - * @property { string } registeredInvoiceId - */ -export const InvoiceFinanceLineDtoSchema = z.object({ positionChargeItemId: z.string(), chargeType: InvoiceChargeTypeDtoSchema, additionalText: z.string(), quantity: z.number(), netAmount: z.number(), grossAmount: z.number(), sumInInvoiceCurrency: z.number().nullish(), sumInOfficeCurrency: z.number().nullish(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), vatRule: InvoiceVatRuleDtoSchema, exchangedNetAmount: z.number().nullish(), positionNumber: z.string().nullish(), positionId: z.string().nullish(), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish() }).readonly(); -export type InvoiceFinanceLineDto = z.infer; - -/** - * InvoiceConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl - * @property { string } headerImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ -export const InvoiceConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); -export type InvoiceConfigDto = z.infer; - -/** - * InvoiceCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { string } address - * @property { string } vatNumber - * @property { string } reference - * @property { string } contact - * @property { string } partnerRegistrationNumber - */ -export const InvoiceCustomerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string().nullish(), label: z.string().nullish(), address: z.string().nullish(), vatNumber: z.string(), reference: z.string().nullish(), contact: z.string().nullish(), partnerRegistrationNumber: z.string().nullish() }).readonly(); -export type InvoiceCustomerDto = z.infer; - -/** - * InvoiceOfficeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type InvoiceOfficeDto = z.infer; - -/** - * InvoiceSalesRepDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } phoneNumber - */ -export const InvoiceSalesRepDtoSchema = z.object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }).readonly(); -export type InvoiceSalesRepDto = z.infer; - -/** - * InvoiceServiceRecipientDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } address - * @property { string } vatNumber - * @property { string } partnerRegistrationNumber - */ -export const InvoiceServiceRecipientDtoSchema = z.object({ id: z.string(), name: z.string(), address: z.string().nullish(), vatNumber: z.string(), partnerRegistrationNumber: z.string().nullish() }).readonly(); -export type InvoiceServiceRecipientDto = z.infer; - -/** - * InvoiceBankAccountDtoSchema - * @type { object } - * @property { string } id - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - * @property { string } name - * @property { boolean } useFooterOnInvoice - * @property { object } footer - * @property { string } footer.mediaUrl - */ -export const InvoiceBankAccountDtoSchema = z.object({ id: z.string(), displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string(), name: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).readonly().nullish() }).readonly(); -export type InvoiceBankAccountDto = z.infer; - -/** - * InvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const InvoiceRemarksDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); -export type InvoiceRemarksDto = z.infer; - -/** - * InvoiceVatLineDtoSchema - * @type { object } - * @property { string } vatRuleId ID of the VAT rule - * @property { string } name Name of the VAT rule - * @property { string } printNumber Reference numerical string for vat rules - * @property { string } matchCode Match code of the VAT rule - * @property { number } vatPercentage The actual VAT rate (e.g., 19 for 19%) - * @property { number } netAmount Sum of net amounts from financeLines using this vatRuleId - * @property { number } vatAmount Calculated total VAT for this rate (netAmount * vatPercentage / 100) - * @property { number } grossAmount Sum of netAmount + vatAmount for this rate - * @property { number } vatAmountInOfficeCurrency - * @property { number } netAmountInOfficeCurrency - * @property { number } grossAmountInOfficeCurrency - */ -export const InvoiceVatLineDtoSchema = z.object({ vatRuleId: z.string().describe("ID of the VAT rule"), name: z.string().describe("Name of the VAT rule"), printNumber: z.string().describe("Reference numerical string for vat rules"), matchCode: z.string().describe("Match code of the VAT rule"), vatPercentage: z.number().describe("The actual VAT rate (e.g., 19 for 19%)"), netAmount: z.number().describe("Sum of net amounts from financeLines using this vatRuleId"), vatAmount: z.number().describe("Calculated total VAT for this rate (netAmount * vatPercentage / 100)"), grossAmount: z.number().describe("Sum of netAmount + vatAmount for this rate"), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish() }).readonly(); -export type InvoiceVatLineDto = z.infer; - -/** - * RelatedInvoiceDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } internalNumber - */ -export const RelatedInvoiceDetailDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }).readonly(); -export type RelatedInvoiceDetailDto = z.infer; - -/** - * InvoiceLanguageEnumSchema - * @type { enum } - */ -export const InvoiceLanguageEnumSchema = z.enum(["en", "de", "sl", "hu", "cs"]); -export type InvoiceLanguageEnum = z.infer; -export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; - -/** - * InvoiceDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } rootFolderId - * @property { string } invoiceDirection - * @property { string } invoiceType - * @property { string } invoiceNumber - * @property { string } costCenter - * @property { string } status - * @property { string } language - * @property { boolean } isVatOk - * @property { boolean } isInvoiceOk - * @property { string } issuingDate - * @property { string } receiptDate - * @property { string } serviceDate - * @property { string } serviceDateUntil - * @property { string } dueDate - * @property { string } internalNumber - * @property { boolean } isExportedToBookkeeping - * @property { string } sentAt - * @property { string } creditNoteId - * @property { string } draftCreditNoteId - * @property { string } cancelledInvoiceId - * @property { string } uploadedDocumentUrl - * @property { InvoiceCustomerDto } customer - * @property { string } customerNumber - * @property { string } customerNameOverride - * @property { string } customerReferenceOverride - * @property { string } customerContactOverride - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { InvoicePositionDto } position - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { InvoiceOfficeDto } salesOffice - * @property { InvoiceSalesRepDto } salesRep - * @property { number } totalNet - * @property { number } totalVat - * @property { number } totalGross - * @property { string } currencyNotation - * @property { number } exchangeRate - * @property { number } paymentTermDays - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { InvoiceServiceRecipientDto } serviceRecipient - * @property { boolean } showPaymentInstructions - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { string } comments - * @property { InvoiceBankAccountDto } bankAccount - * @property { InvoiceFinanceLineDto[] } financeLines - * @property { InvoiceRemarksDto } remarks - * @property { InvoiceVatLineDto[] } vatLines - * @property { InvoiceConfigDto } config - * @property { RelatedInvoiceDetailDto } creditNote - * @property { RelatedInvoiceDetailDto } draftCreditNote - * @property { RelatedInvoiceDetailDto } cancelledInvoice - * @property { string } officeCurrencyNotation - * @property { string } inverseCurrencyNotation - * @property { number } inverseExchangeRate - * @property { boolean } requiresSpecialTablePresentation - * @property { number } paidAmount - * @property { number } outstandingAmount - * @property { string } paidOn - * @property { boolean } isIssued - * @property { number } grossAmountInOfficeCurrency - * @property { string } createdAt - */ -export const InvoiceDetailDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullish(), costCenter: z.string().nullish(), status: CommonModels.InvoiceStatusEnumSchema, language: InvoiceLanguageEnumSchema, isVatOk: z.boolean(), isInvoiceOk: z.boolean(), issuingDate: z.iso.datetime({ offset: true }).nullish(), receiptDate: z.iso.datetime({ offset: true }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), isExportedToBookkeeping: z.boolean(), sentAt: z.iso.datetime({ offset: true }).nullish(), creditNoteId: z.string().nullish(), draftCreditNoteId: z.string().nullish(), cancelledInvoiceId: z.string().nullish(), uploadedDocumentUrl: z.string().nullish(), customer: InvoiceCustomerDtoSchema.nullish(), customerNumber: z.string().nullish(), customerNameOverride: z.string().nullish(), customerReferenceOverride: z.string().nullish(), customerContactOverride: z.string().nullish(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), position: InvoicePositionDtoSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesOffice: InvoiceOfficeDtoSchema, salesRep: InvoiceSalesRepDtoSchema, totalNet: z.number(), totalVat: z.number().nullish(), totalGross: z.number(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), paymentTermDays: z.number().nullish(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), showPaymentInstructions: z.boolean().nullish(), dunningBlock: z.boolean().nullish(), invoiceInReview: z.boolean().nullish(), comments: z.string().nullish(), bankAccount: InvoiceBankAccountDtoSchema.nullish(), financeLines: z.array(InvoiceFinanceLineDtoSchema).readonly(), remarks: InvoiceRemarksDtoSchema.nullish(), vatLines: z.array(InvoiceVatLineDtoSchema).readonly(), config: InvoiceConfigDtoSchema.nullish(), creditNote: RelatedInvoiceDetailDtoSchema.nullish(), draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), officeCurrencyNotation: z.string().nullish(), inverseCurrencyNotation: z.string().nullish(), inverseExchangeRate: z.number().nullish(), requiresSpecialTablePresentation: z.boolean().nullish(), paidAmount: z.number(), outstandingAmount: z.number(), paidOn: z.iso.datetime({ offset: true }).nullish(), isIssued: z.boolean(), grossAmountInOfficeCurrency: z.number().nullish(), createdAt: z.iso.datetime({ offset: true }) }).readonly(); -export type InvoiceDetailDto = z.infer; - -/** - * TotalAmountsDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ -export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); -export type TotalAmountsDto = z.infer; - -/** - * OfficeInvoiceListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalAmountInDefaultCurrency - * @property { string } defaultCurrencyNotation - * @property { TotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const OfficeInvoiceListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalAmountInDefaultCurrency: z.number().nullish(), defaultCurrencyNotation: z.string().nullish(), totalAmounts: z.array(TotalAmountsDtoSchema).readonly(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); -export type OfficeInvoiceListResponseDto = z.infer; - -/** - * InvoicePreviewPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } externalSystemId - */ -export const InvoicePreviewPositionDtoSchema = z.object({ id: z.string(), number: z.string(), externalSystemId: z.string().nullish() }).readonly(); -export type InvoicePreviewPositionDto = z.infer; - -/** - * InvoicePreviewReceiverDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - */ -export const InvoicePreviewReceiverDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(); -export type InvoicePreviewReceiverDto = z.infer; - -/** - * InvoicePreviewReceiverCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoicePreviewReceiverCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type InvoicePreviewReceiverCountryDto = z.infer; - -/** - * InvoicePreviewClerkDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoicePreviewClerkDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type InvoicePreviewClerkDto = z.infer; - -/** - * VatRuleLabelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } matchCode - * @property { string } name - */ -export const VatRuleLabelResponseDtoSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string() }).readonly(); -export type VatRuleLabelResponseDto = z.infer; - -/** - * OfficeInvoicePreviewDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } invoiceNumber - * @property { string } invoiceDirection - * @property { string } issuingDate - * @property { CommonModels.InvoiceTypeEnum } invoiceType - * @property { boolean } collective - * @property { string } serviceDate - * @property { string } internalNumber - * @property { string } reference - * @property { number } amount - * @property { number } netAmount - * @property { number } tax - * @property { string } currency - * @property { string } dueDate - * @property { CommonModels.InvoiceStatusEnum } status - * @property { string } payDate - * @property { number } paidAmount - * @property { InvoicePreviewPositionDto } position - * @property { InvoicePreviewReceiverDto } receiver - * @property { InvoicePreviewReceiverCountryDto } receiverCountry - * @property { InvoicePreviewClerkDto } clerk - * @property { boolean } cancelled - * @property { boolean } ok - * @property { boolean } isExportedToBookkeeping - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { boolean } vatOk - * @property { string } comments - * @property { string } paymentComment - * @property { string } creditorId - * @property { string } debtorId - * @property { string } hblNumber - * @property { string } mblNumber - * @property { string } bookingNumber - * @property { string } vessel - * @property { string } voyage - * @property { VatRuleLabelResponseDto[] } vatRules - */ -export const OfficeInvoicePreviewDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), invoiceNumber: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, issuingDate: z.iso.datetime({ offset: true }).nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema, collective: z.boolean(), serviceDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), reference: z.string().nullish(), amount: z.number(), netAmount: z.number(), tax: z.number(), currency: z.string(), dueDate: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.InvoiceStatusEnumSchema, payDate: z.iso.datetime({ offset: true }).nullish(), paidAmount: z.number().nullish(), position: InvoicePreviewPositionDtoSchema.nullish(), receiver: InvoicePreviewReceiverDtoSchema.nullish(), receiverCountry: InvoicePreviewReceiverCountryDtoSchema.nullish(), clerk: InvoicePreviewClerkDtoSchema.nullish(), cancelled: z.boolean(), ok: z.boolean(), isExportedToBookkeeping: z.boolean(), dunningBlock: z.boolean(), invoiceInReview: z.boolean(), vatOk: z.boolean(), comments: z.string().nullish(), paymentComment: z.string().nullish(), creditorId: z.string().nullish(), debtorId: z.string().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vatRules: z.array(VatRuleLabelResponseDtoSchema).readonly().nullish() }).readonly(); -export type OfficeInvoicePreviewDto = z.infer; - -/** - * InvoiceExportFilterDtoSchema - * @type { object } - * @property { string } search - * @property { CommonModels.DateRangeDto } issuingDate - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection - * @property { CommonModels.InvoiceTypeEnum[] } invoiceType - * @property { CommonModels.BooleanFilterEnum[] } collective - * @property { number } amountMin - * @property { number } amountMax - * @property { string[] } currencyNotation - * @property { CommonModels.DateRangeDto } dueDate - * @property { CommonModels.InvoiceStatusEnum[] } status - * @property { string[] } receiver Filter by invoice receiver/customer ID (UUID) - * @property { string } positionNumbersString - * @property { string[] } positionNumbers - * @property { string } invoiceNumbersString - * @property { string[] } invoiceNumbers - * @property { CommonModels.BooleanFilterEnum[] } bookkeepingExportStatus - * @property { CommonModels.BooleanFilterEnum[] } dunningBlock - * @property { CommonModels.BooleanFilterEnum[] } invoiceInReview - * @property { CommonModels.BooleanFilterEnum[] } isInvoiceOk - * @property { CommonModels.BooleanFilterEnum[] } isVatOk - * @property { number } invoiceNumberMin - * @property { number } invoiceNumberMax - * @property { number } internalNumberMin - * @property { number } internalNumberMax - */ -export const InvoiceExportFilterDtoSchema = z.object({ search: z.string(), issuingDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).readonly(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).readonly(), collective: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), amountMin: z.number(), amountMax: z.number(), currencyNotation: z.array(z.string()).readonly(), dueDate: CommonModels.DateRangeDtoSchema, status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), receiver: z.array(z.string()).readonly().describe("Filter by invoice receiver/customer ID (UUID)"), positionNumbersString: z.string(), positionNumbers: z.array(z.string()).readonly(), invoiceNumbersString: z.string(), invoiceNumbers: z.array(z.string()).readonly(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), invoiceNumberMin: z.number(), invoiceNumberMax: z.number(), internalNumberMin: z.number(), internalNumberMax: z.number() }).readonly(); -export type InvoiceExportFilterDto = z.infer; - -/** - * InvoiceExportColumnSchema - * @type { enum } - */ -export const InvoiceExportColumnSchema = z.enum(["invoiceNumber", "invoiceDirection", "issuingDate", "invoiceType", "collective", "serviceDate", "internalNumber", "reference", "totalGross", "totalNet", "totalVat", "currency", "dueDate", "status", "payDate", "paidAmount", "positionNumber", "hblHawb", "mblMawb", "bookingNumber", "vessel", "voyage", "receiverName", "receiverCountry", "clerkName", "cancelled", "ok", "vatOk", "dunningBlock", "invoiceInReview", "exportedToBookkeeping", "comments", "paymentComment", "vatRuleIds", "creditorId", "debtorId", "createdAt"]); -export type InvoiceExportColumn = z.infer; -export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; - -/** - * InvoiceExportRequestDtoSchema - * @type { object } - * @property { InvoiceExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { InvoiceExportFilterDto } filter - */ -export const InvoiceExportRequestDtoSchema = z.object({ columns: z.array(InvoiceExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: InvoiceExportFilterDtoSchema }).readonly(); -export type InvoiceExportRequestDto = z.infer; - -/** - * UninvoicedChargeTotalAmountDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ -export const UninvoicedChargeTotalAmountDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }).readonly(); -export type UninvoicedChargeTotalAmountDto = z.infer; - -/** - * UninvoicedChargeListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const UninvoicedChargeListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalAmounts: z.array(UninvoicedChargeTotalAmountDtoSchema).readonly(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); -export type UninvoicedChargeListResponseDto = z.infer; - -/** - * ReceiverDtoSchema - * @type { object } - * @property { string } id Business Partner ID (Customer or Vendor) - * @property { string } name Business Partner name - * @property { string } matchCode Business Partner match code - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const ReceiverDtoSchema = z.object({ id: z.string().describe("Business Partner ID (Customer or Vendor)"), name: z.string().describe("Business Partner name"), matchCode: z.string().describe("Business Partner match code"), label: z.string().describe("Display label: matchCode when office.usePartnerMatchCodes, else name") }).readonly(); -export type ReceiverDto = z.infer; - -/** - * UninvoicedChargePositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); -export type UninvoicedChargePositionDto = z.infer; - -/** - * UninvoicedChargeChargeTypeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const UninvoicedChargeChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type UninvoicedChargeChargeTypeDto = z.infer; - -/** - * UninvoicedChargeVatRuleDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchcode - */ -export const UninvoicedChargeVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).readonly(); -export type UninvoicedChargeVatRuleDto = z.infer; - -/** - * UninvoicedChargeGroupStatusEnumSchema - * @type { enum } - */ -export const UninvoicedChargeGroupStatusEnumSchema = z.enum(["ReadyForInvoice", "MissingInformation"]); -export type UninvoicedChargeGroupStatusEnum = z.infer; -export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSchema.enum; - -/** - * UninvoicedChargeEmployeeDtoSchema - * @type { object } - * @property { string } id - * @property { string } firstName - * @property { string } lastName - * @property { string } fullName - */ -export const UninvoicedChargeEmployeeDtoSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }).readonly(); -export type UninvoicedChargeEmployeeDto = z.infer; - -/** - * UninvoicedChargeDtoSchema - * @type { object } - * @property { string } chargeItemId - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection Invoice direction (Incoming or Outgoing) - * @property { ReceiverDto } receiver Business Partner receiving the invoice - * @property { UninvoicedChargePositionDto } position - * @property { UninvoicedChargeChargeTypeDto } chargeType - * @property { string } currencyNotation ISO 4217 currency code - * @property { number } amount Charge amount in charge currency - * @property { number } amountInOfficeCurrency Charge amount in office currency - * @property { string } officeCurrency Office currency code - * @property { number } exchangeRate - * @property { UninvoicedChargeVatRuleDto } vatRule - * @property { string } serviceDate - * @property { UninvoicedChargeGroupStatusEnum } status Status of charge group - * @property { string[] } missingInformation Missing fields required for invoicing this charge - * @property { UninvoicedChargeEmployeeDto } employee - */ -export const UninvoicedChargeDtoSchema = z.object({ chargeItemId: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction (Incoming or Outgoing)"), receiver: ReceiverDtoSchema.describe("Business Partner receiving the invoice"), position: UninvoicedChargePositionDtoSchema, chargeType: UninvoicedChargeChargeTypeDtoSchema.nullish(), currencyNotation: z.string().describe("ISO 4217 currency code"), amount: z.number().describe("Charge amount in charge currency"), amountInOfficeCurrency: z.number().describe("Charge amount in office currency"), officeCurrency: z.string().describe("Office currency code"), exchangeRate: z.number().nullish(), vatRule: UninvoicedChargeVatRuleDtoSchema.nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), status: UninvoicedChargeGroupStatusEnumSchema.describe("Status of charge group"), missingInformation: z.array(z.string()).readonly().describe("Missing fields required for invoicing this charge").nullish(), employee: UninvoicedChargeEmployeeDtoSchema.nullish() }).readonly(); -export type UninvoicedChargeDto = z.infer; - -/** - * UninvoicedChargePaginationDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string } receiverId - * @property { string } chargeTypeId - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currency - * @property { string } vatRuleId - */ -export const UninvoicedChargePaginationDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), chargeItemId: z.string(), receiverId: z.string(), chargeTypeId: z.string(), serviceDate: CommonModels.DateRangeDtoSchema, currency: z.array(z.string()).readonly(), vatRuleId: z.string() }).readonly(); -export type UninvoicedChargePaginationDto = z.infer; - -/** - * UninvoicedChargesFilterDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string[] } receiverIds - * @property { string[] } positionIds - * @property { string[] } chargeTypeIds - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currencies - * @property { string[] } vatRuleIds - * @property { string[] } employeeIds - */ -export const UninvoicedChargesFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), chargeItemId: z.string(), receiverIds: z.array(z.string()).readonly(), positionIds: z.array(z.string()).readonly(), chargeTypeIds: z.array(z.string()).readonly(), serviceDate: CommonModels.DateRangeDtoSchema, currencies: z.array(z.string()).readonly(), vatRuleIds: z.array(z.string()).readonly(), employeeIds: z.array(z.string()).readonly() }).readonly(); -export type UninvoicedChargesFilterDto = z.infer; - -/** - * UninvoicedChargesExportFilterDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string[] } receiverIds - * @property { string[] } positionIds - * @property { string[] } chargeTypeIds - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currencies - * @property { string[] } vatRuleIds - */ -export const UninvoicedChargesExportFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.describe("Filter by invoice direction"), chargeItemId: z.string(), receiverIds: z.array(z.string()).readonly(), positionIds: z.array(z.string()).readonly(), chargeTypeIds: z.array(z.string()).readonly(), serviceDate: CommonModels.DateRangeDtoSchema, currencies: z.array(z.string()).readonly(), vatRuleIds: z.array(z.string()).readonly() }).readonly(); -export type UninvoicedChargesExportFilterDto = z.infer; - -/** - * UninvoicedChargeExportColumnSchema - * @type { enum } - */ -export const UninvoicedChargeExportColumnSchema = z.enum(["chargeItemId", "invoiceDirection", "status", "receiverName", "positionNumber", "serviceDate", "employee", "chargeTypeName", "amount", "currency", "exchangeRate", "amountInOfficeCurrency", "officeCurrency", "vatRule"]); -export type UninvoicedChargeExportColumn = z.infer; -export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.enum; - -/** - * UninvoicedChargesExportRequestDtoSchema - * @type { object } - * @property { UninvoicedChargeExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { UninvoicedChargesExportFilterDto } filter - */ -export const UninvoicedChargesExportRequestDtoSchema = z.object({ columns: z.array(UninvoicedChargeExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: UninvoicedChargesExportFilterDtoSchema }).readonly(); -export type UninvoicedChargesExportRequestDto = z.infer; - -/** - * CreateDraftInvoiceRequestDtoSchema - * @type { object } - * @property { string[] } chargeItemIds Charge item IDs to include in the invoice. Min Items: `1` - * @property { CommonModels.InvoiceTypeEnum } invoiceType Type of invoice - * @property { string } customerId Customer ID (required for outgoing invoices) - * @property { CommonModels.InvoiceDirectionEnum } direction Invoice direction - */ -export const CreateDraftInvoiceRequestDtoSchema = z.object({ chargeItemIds: z.array(z.string()).readonly().min(1).describe("Charge item IDs to include in the invoice").nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema.describe("Type of invoice"), customerId: z.string().describe("Customer ID (required for outgoing invoices)"), direction: CommonModels.InvoiceDirectionEnumSchema.describe("Invoice direction") }).readonly(); -export type CreateDraftInvoiceRequestDto = z.infer; - -/** - * UpdateInvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const UpdateInvoiceRemarksDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); -export type UpdateInvoiceRemarksDto = z.infer; - -/** - * UpdateInvoiceCustomerDtoSchema - * @type { object } - * @property { string } name - * @property { string } reference - * @property { string } contact - */ -export const UpdateInvoiceCustomerDtoSchema = z.object({ name: z.string(), reference: z.string(), contact: z.string() }).readonly(); -export type UpdateInvoiceCustomerDto = z.infer; - -/** - * UpdateInvoiceRequestDtoSchema - * @type { object } - * @property { string } issuingDate Invoice date in ISO format - * @property { string } receiptDate Receipt date in ISO format - * @property { string } serviceDate Service date in ISO format - * @property { string } serviceDateUntil Service end date in ISO format - * @property { string } dueDate Due date in ISO format - * @property { string } invoiceNumber Invoice number - * @property { string } internalNumber Internal reference number - * @property { number } paymentTermDays Payment term in days - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { string } serviceRecipientId Service recipient ID - * @property { string } bankAccountId Bank account ID - * @property { UpdateInvoiceRemarksDto } remarks Additional remarks - * @property { InvoiceLanguageEnum } language Invoice language - * @property { boolean } showPaymentInstructions - * @property { UpdateInvoiceCustomerDto } customer - * @property { string } salesRepId - * @property { string } currencyNotation - * @property { number } exchangeRate Invoice exchange rate - */ -export const UpdateInvoiceRequestDtoSchema = z.object({ issuingDate: z.iso.datetime({ offset: true }).describe("Invoice date in ISO format"), receiptDate: z.iso.datetime({ offset: true }).describe("Receipt date in ISO format"), serviceDate: z.iso.datetime({ offset: true }).describe("Service date in ISO format"), serviceDateUntil: z.iso.datetime({ offset: true }).describe("Service end date in ISO format"), dueDate: z.iso.datetime({ offset: true }).describe("Due date in ISO format").nullable(), invoiceNumber: z.string().describe("Invoice number").nullable(), internalNumber: z.string().describe("Internal reference number").nullable(), paymentTermDays: z.number().describe("Payment term in days").nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, serviceRecipientId: z.string().describe("Service recipient ID").nullable(), bankAccountId: z.string().describe("Bank account ID").nullable(), remarks: UpdateInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), language: InvoiceLanguageEnumSchema.describe("Invoice language"), showPaymentInstructions: z.boolean(), customer: UpdateInvoiceCustomerDtoSchema, salesRepId: z.string(), currencyNotation: z.string(), exchangeRate: z.number().describe("Invoice exchange rate").nullable() }).readonly(); -export type UpdateInvoiceRequestDto = z.infer; - -/** - * FixInvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const FixInvoiceRemarksDtoSchema = z.object({ html: z.string(), json: z.object({}).catchall(z.any()).readonly() }).readonly(); -export type FixInvoiceRemarksDto = z.infer; - -/** - * FixInvoiceCustomerDtoSchema - * @type { object } - * @property { string } reference Customer reference number - */ -export const FixInvoiceCustomerDtoSchema = z.object({ reference: z.string().describe("Customer reference number") }).readonly(); -export type FixInvoiceCustomerDto = z.infer; - -/** - * FixInvoiceRequestDtoSchema - * @type { object } - * @property { string } currencyNotation Invoice currency (incoming invoices only) - * @property { string } issuingDate Update invoice date in ISO format - * @property { string } dueDate Update invoice due date in ISO format - * @property { number } exchangeRate Invoice exchange rate - * @property { number } paymentTermDays Payment term in days - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { string } receiptDate Update receipt date in ISO format - * @property { string } serviceDate Update service date in ISO format - * @property { string } serviceDateUntil Update service end date in ISO format - * @property { boolean } isVatOk Mark VAT as checked/OK by accounting - * @property { boolean } isInvoiceOk Mark overall invoice as checked/OK by accounting - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { string } comments - * @property { FixInvoiceRemarksDto } remarks Additional remarks - * @property { string } invoiceNumber Invoice number (incoming invoices only) - * @property { string } bankAccountId Bank account ID - * @property { string } serviceRecipientId Service recipient ID - * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) - */ -export const FixInvoiceRequestDtoSchema = z.object({ currencyNotation: z.string().describe("Invoice currency (incoming invoices only)"), issuingDate: z.iso.datetime({ offset: true }).describe("Update invoice date in ISO format"), dueDate: z.iso.datetime({ offset: true }).describe("Update invoice due date in ISO format"), exchangeRate: z.number().describe("Invoice exchange rate").nullable(), paymentTermDays: z.number().describe("Payment term in days").nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema, receiptDate: z.iso.datetime({ offset: true }).describe("Update receipt date in ISO format"), serviceDate: z.iso.datetime({ offset: true }).describe("Update service date in ISO format").nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).describe("Update service end date in ISO format"), isVatOk: z.boolean().describe("Mark VAT as checked/OK by accounting"), isInvoiceOk: z.boolean().describe("Mark overall invoice as checked/OK by accounting"), dunningBlock: z.boolean(), invoiceInReview: z.boolean(), comments: z.string(), remarks: FixInvoiceRemarksDtoSchema.describe("Additional remarks").nullable(), invoiceNumber: z.string().describe("Invoice number (incoming invoices only)").nullable(), bankAccountId: z.string().describe("Bank account ID").nullable(), serviceRecipientId: z.string().describe("Service recipient ID").nullable(), customer: FixInvoiceCustomerDtoSchema.describe("Customer reference (incoming invoices only)") }).readonly(); -export type FixInvoiceRequestDto = z.infer; - -/** - * UpdateIssuedInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity. Minimum: `0` - * @property { number } amount Amount (must be positive). Minimum: `0.01` - * @property { string } vatRuleId VAT rule ID - * @property { number } exchangeRate Charge exchange rate (incoming invoices only) - * @property { string } currencyNotation - */ -export const UpdateIssuedInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string().describe("Position charge item ID"), chargeTypeId: z.string().describe("Charge type ID").nullish(), additionalText: z.string().describe("Additional text for the charge").nullish(), quantity: z.number().gte(0).describe("Quantity").nullish(), amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), vatRuleId: z.string().describe("VAT rule ID").nullish(), exchangeRate: z.number().describe("Charge exchange rate (incoming invoices only)").nullish(), currencyNotation: z.string().nullish() }).readonly(); -export type UpdateIssuedInvoiceChargeRequestDto = z.infer; - -/** - * UpdateIssuedInvoiceChargesRequestDtoSchema - * @type { object } - * @property { UpdateIssuedInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` - */ -export const UpdateIssuedInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateIssuedInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates") }).readonly(); -export type UpdateIssuedInvoiceChargesRequestDto = z.infer; - -/** - * UpdateInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity. Minimum: `0` - * @property { number } amount Amount (must be positive). Minimum: `0.01` - * @property { string } vatRuleId VAT rule ID - * @property { number } exchangeRate - * @property { string } currencyNotation - */ -export const UpdateInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string().describe("Position charge item ID"), chargeTypeId: z.string().describe("Charge type ID").nullish(), additionalText: z.string().describe("Additional text for the charge").nullish(), quantity: z.number().gte(0).describe("Quantity").nullish(), amount: z.number().gte(0.01).describe("Amount (must be positive)").nullish(), vatRuleId: z.string().describe("VAT rule ID").nullish(), exchangeRate: z.number().nullish(), currencyNotation: z.string().nullish() }).readonly(); -export type UpdateInvoiceChargeRequestDto = z.infer; - -/** - * UpdateInvoiceChargesRequestDtoSchema - * @type { object } - * @property { UpdateInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` - */ -export const UpdateInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateInvoiceChargeRequestDtoSchema).readonly().min(1).describe("Array of charge updates") }).readonly(); -export type UpdateInvoiceChargesRequestDto = z.infer; - -/** - * InvoiceFilterDtoSchema - * @type { object } - * @property { string[] } status - * @property { string } direction - * @property { string } receiver Filter by invoice receiver/customer ID (UUID) - */ -export const InvoiceFilterDtoSchema = z.object({ status: z.array(CommonModels.InvoiceStatusEnumSchema).readonly(), direction: CommonModels.InvoiceDirectionEnumSchema, receiver: z.string().describe("Filter by invoice receiver/customer ID (UUID)") }).readonly(); -export type InvoiceFilterDto = z.infer; - -/** - * ChangeInvoiceCustomerRequestDtoSchema - * @type { object } - * @property { string } newCustomerId - */ -export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }).readonly(); -export type ChangeInvoiceCustomerRequestDto = z.infer; - -/** - * CreateDirectInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const CreateDirectInvoiceChargeRequestDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount"), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount"), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); -export type CreateDirectInvoiceChargeRequestDto = z.infer; - -/** - * UpdateIssuedInvoiceVatRulesRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } vatRuleId VAT rule ID - */ -export const UpdateIssuedInvoiceVatRulesRequestDtoSchema = z.object({ positionChargeItemId: z.string().describe("Position charge item ID"), vatRuleId: z.string().describe("VAT rule ID") }).readonly(); -export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; - -/** - * PrepareUploadRequestDtoSchema - * @type { object } - * @property { string } filename - * @property { string } mimeType - * @property { number } fileSize - */ -export const PrepareUploadRequestDtoSchema = z.object({ filename: z.string().nullish(), mimeType: z.string(), fileSize: z.number() }).readonly(); -export type PrepareUploadRequestDto = z.infer; - -/** - * InvoiceUploadInstructionsDtoSchema - * @type { object } - * @property { string } url Pre-signed URL for the PUT request to storage - * @property { string } method HTTP method to use for upload - */ -export const InvoiceUploadInstructionsDtoSchema = z.object({ url: z.string().describe("Pre-signed URL for the PUT request to storage"), method: z.string().describe("HTTP method to use for upload") }).readonly(); -export type InvoiceUploadInstructionsDto = z.infer; - -/** - * GetInvoicesEmlInvoiceIdsParamSchema - * @type { array } - * @description Invoice IDs - */ -export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).readonly().describe("Invoice IDs").nullish(); -export type GetInvoicesEmlInvoiceIdsParam = z.infer; - -/** - * InvoicesFindOrderParamEnumSchema - * @type { enum } - */ -export const InvoicesFindOrderParamEnumSchema = z.enum(["status", "createdAt", "serviceDate"]); -export type InvoicesFindOrderParamEnum = z.infer; -export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; - -/** - * InvoicesFindResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { InvoicePreviewDto[] } items - */ -export const InvoicesFindResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(InvoicePreviewDtoSchema).readonly() }).readonly().shape }); -export type InvoicesFindResponse = z.infer; - -/** - * FindByOfficeOrderParamEnumSchema - * @type { enum } - */ -export const FindByOfficeOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); -export type FindByOfficeOrderParamEnum = z.infer; -export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; - -/** - * FindByOfficeResponseSchema - * @type { object } - * @property { number } totalAmountInDefaultCurrency - * @property { string } defaultCurrencyNotation - * @property { TotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficeInvoicePreviewDto[] } items - */ -export const FindByOfficeResponseSchema = z.object({ ...OfficeInvoiceListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).readonly() }).readonly().shape }); -export type FindByOfficeResponse = z.infer; - -/** - * GetUnChargesOrderParamEnumSchema - * @type { enum } - */ -export const GetUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); -export type GetUnChargesOrderParamEnum = z.infer; -export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; - -/** - * GetUnChargesResponseSchema - * @type { object } - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { UninvoicedChargeDto[] } items - */ -export const GetUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape }); -export type GetUnChargesResponse = z.infer; - -/** - * InvoicesListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ -export const InvoicesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); -export type InvoicesListAvailablePartnersForResponse = z.infer; - -/** - * GetOfficeUnChargesOrderParamEnumSchema - * @type { enum } - */ -export const GetOfficeUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); -export type GetOfficeUnChargesOrderParamEnum = z.infer; -export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnumSchema.enum; - -/** - * GetOfficeUnChargesResponseSchema - * @type { object } - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { UninvoicedChargeDto[] } items - */ -export const GetOfficeUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).readonly() }).readonly().shape }); -export type GetOfficeUnChargesResponse = z.infer; - -} diff --git a/test/generated/full/invoices/invoices.queries.ts b/test/generated/full/invoices/invoices.queries.ts deleted file mode 100644 index 1046ddd..0000000 --- a/test/generated/full/invoices/invoices.queries.ts +++ /dev/null @@ -1,1123 +0,0 @@ -import axios, { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InvoicesAcl } from "./invoices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { InvoicesApi } from "./invoices.api"; - -export namespace InvoicesQueries { -export const moduleName = QueryModule.Invoices; - -export const keys = { - all: [moduleName] as const, - getInvoicesEml: (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam) => [...keys.all, "/offices/:officeId/invoices/eml", officeId, invoiceIds] as const, - find: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", officeId, positionId, limit, order, filter, page, cursor] as const, - findInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", "infinite", officeId, positionId, limit, order, filter, cursor] as const, - findByOffice: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", officeId, limit, order, filter, page, cursor] as const, - findByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", "infinite", officeId, limit, order, filter, cursor] as const, - getUnCharges: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", officeId, positionId, limit, order, filter, page, cursor] as const, - getUnChargesInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", "infinite", officeId, positionId, limit, order, filter, cursor] as const, - listAvailablePartnersFor: (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/available-partners", officeId, invoiceId, search, useCase] as const, - getOfficeUnCharges: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", officeId, limit, order, filter, page, cursor] as const, - getOfficeUnChargesInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", "infinite", officeId, limit, order, filter, cursor] as const, - getDetail: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId", officeId, invoiceId] as const, - getPreview: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/preview", officeId, invoiceId] as const, - getInvoiceEml: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/eml", officeId, invoiceId] as const, -}; - -/** - * Query `useGetInvoicesEml` - recommended when file should be cached - * @summary Get invoices as EML file with PDF attachments - * @permission Requires `canUseGetInvoicesEml` ability - * @param { string } object.officeId Path parameter - * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } object.invoiceIds Query parameter. Invoice IDs - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoicesEml = ({ officeId, invoiceIds }: { officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvoicesEml(officeId, invoiceIds), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config) }, - ...options, - }); -}; - -/** - * Mutation `useGetInvoicesEmlMutation` - recommended when file should not be cached - * @summary Get invoices as EML file with PDF attachments - * @permission Requires `canUseGetInvoicesEml` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } mutation.invoiceIds Query parameter. Invoice IDs - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoicesEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceIds }) => { - checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFind` - * @summary List invoices for a position - * @permission Requires `canUseFind` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` - * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFind = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseFind({ officeId } )); - return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useFindInfinite - * @summary List invoices for a position - * @permission Requires `canUseFind` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` - * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseFind({ officeId } )); - return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useChangeIncomingCustomer` - * @summary Change incoming invoice customer and update vendors on registered charges - * @permission Requires `canUseChangeIncomingCustomer` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.ChangeInvoiceCustomerRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useChangeIncomingCustomer = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId } )); - return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindByOffice` - * @summary List invoices for an office - * @permission Requires `canUseFindByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); - return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useFindByOfficeInfinite - * @summary List invoices for an office - * @permission Requires `canUseFindByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); - return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateDraft` - * @summary Create a draft invoice from charge items - * @permission Requires `canUseCreateDraft` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.CreateDraftInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useCreateDraft = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseCreateDraft({ officeId } )); - return InvoicesApi.createDraft(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportInvoices` - recommended when file should not be cached - * @summary Export invoices to Excel - * @permission Requires `canUseExportInvoices` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportInvoices = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportInvoices({ officeId } )); - return InvoicesApi.exportInvoices(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportCharges` - recommended when file should not be cached - * @summary Export invoice charges as Excel file - * @permission Requires `canUseExportCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportCharges({ officeId } )); - return InvoicesApi.exportCharges(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetUnCharges` - * @summary Get uninvoiced charges for a position - * @permission Requires `canUseGetUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetUnCharges = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useGetUnChargesInfinite - * @summary Get uninvoiced charges for a position - * @permission Requires `canUseGetUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetUnChargesInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for an invoice (union of position involved parties) - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListAvailablePartnersFor = ({ officeId, invoiceId, search, useCase }: { officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), - queryFn: () => { - checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId } )); - return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase, config) }, - ...options, - }); -}; - -/** - * Query `useGetOfficeUnCharges` - * @summary Get uninvoiced charges for all positions in an office - * @permission Requires `canUseGetOfficeUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetOfficeUnCharges = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useGetOfficeUnChargesInfinite - * @summary Get uninvoiced charges for all positions in an office - * @permission Requires `canUseGetOfficeUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetOfficeUnChargesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useExportUnCharges` - recommended when file should not be cached - * @summary Export uninvoiced charges as Excel file - * @permission Requires `canUseExportUnCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.UninvoicedChargesExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportUnCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId } )); - return InvoicesApi.exportUnCharges(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateDirect` - * @summary Dummy endpoint to expose direct invoice permission to FE - * @permission Requires `canUseCreateDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useCreateDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId }) => { - checkAcl(InvoicesAcl.canUseCreateDirect({ officeId } )); - return InvoicesApi.createDirect(officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useAddChargeToDirect` - * @summary Add a charge to a direct invoice - * @permission Requires `canUseAddChargeToDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.CreateDirectInvoiceChargeRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useAddChargeToDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId } )); - return InvoicesApi.addChargeToDirect(officeId, invoiceId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateCharges` - * @summary Update charges on a draft invoice - * @permission Requires `canUseUpdateCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateInvoiceChargesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdateCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId } )); - return InvoicesApi.updateCharges(officeId, invoiceId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRemoveChargeFromDirect` - * @summary Remove a charge from a direct invoice - * @permission Requires `canUseRemoveChargeFromDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.chargeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useRemoveChargeFromDirect = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, chargeId }) => { - checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId } )); - return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetDetail` - * @summary Get invoice details - * @permission Requires `canUseGetDetail` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, default] - */ -export const useGetDetail = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDetail(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetDetail({ officeId } )); - return InvoicesApi.getDetail(officeId, invoiceId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update invoice details - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdate({ officeId } )); - return InvoicesApi.update(officeId, invoiceId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteInvoice` - * @summary Delete invoice - * @permission Requires `canUseDeleteInvoice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteInvoice = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId } )); - return InvoicesApi.deleteInvoice(officeId, invoiceId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useFix` - * @summary Fix invoice with accounting permission - * @permission Requires `canUseFix` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.FixInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useFix = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseFix({ officeId } )); - return InvoicesApi.fix(officeId, invoiceId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerate` - recommended when file should not be cached - * @summary Generate an invoice PDF - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGenerate({ officeId } )); - return InvoicesApi.generate(officeId, invoiceId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateIssuedVatRules` - * @summary Update VAT rules on issued invoice charges - * @permission Requires `canUseUpdateIssuedVatRules` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdateIssuedVatRules = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId } )); - return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateIssuedCharges` - * @summary Update charges on issued invoice - * @permission Requires `canUseUpdateIssuedCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdateIssuedCharges = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId } )); - return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useIssue` - recommended when file should not be cached - * @summary Issue outgoing invoice - * @permission Requires `canUseIssue` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useIssue = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseIssue({ officeId } )); - return InvoicesApi.issue(officeId, invoiceId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReportHungarian` - * @summary Report invoice to Hungarian tax authority - * @permission Requires `canUseReportHungarian` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReportHungarian = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseReportHungarian({ officeId } )); - return InvoicesApi.reportHungarian(officeId, invoiceId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateIncoming` - recommended when file should not be cached - * @summary Re-Generate an invoice PDF - * @permission Requires `canUseGenerateIncoming` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGenerateIncoming = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId } )); - return InvoicesApi.generateIncoming(officeId, invoiceId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRegister` - * @summary Register incoming invoice - * @permission Requires `canUseRegister` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useRegister = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseRegister({ officeId } )); - return InvoicesApi.register(officeId, invoiceId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetPreview` - recommended when file should be cached - * @summary Get invoice PDF preview - * @permission Requires `canUseGetPreview` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetPreview = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getPreview(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); - return InvoicesApi.getPreview(officeId, invoiceId, config) }, - ...options, - }); -}; - -/** - * Mutation `useGetPreviewMutation` - recommended when file should not be cached - * @summary Get invoice PDF preview - * @permission Requires `canUseGetPreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetPreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); - return InvoicesApi.getPreview(officeId, invoiceId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetInvoiceEml` - recommended when file should be cached - * @summary Get invoice as EML file with PDF attachment - * @permission Requires `canUseGetInvoiceEml` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoiceEml = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvoiceEml(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); - return InvoicesApi.getInvoiceEml(officeId, invoiceId, config) }, - ...options, - }); -}; - -/** - * Mutation `useGetInvoiceEmlMutation` - recommended when file should not be cached - * @summary Get invoice as EML file with PDF attachment - * @permission Requires `canUseGetInvoiceEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoiceEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); - return InvoicesApi.getInvoiceEml(officeId, invoiceId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `usePrepareDocumentUpload` - * @summary Prepare for invoice document upload - * @permission Requires `canUsePrepareDocumentUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.PrepareUploadRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const usePrepareDocumentUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { - checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId } )); - const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCancel` - * @summary Cancel invoice (create draft credit note) - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseCancel({ officeId } )); - return InvoicesApi.cancel(officeId, invoiceId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useIssueCreditNote` - * @summary Issue credit invoice - * @permission Requires `canUseIssueCreditNote` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useIssueCreditNote = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId } )); - return InvoicesApi.issueCreditNote(officeId, invoiceId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/masterData/masterData.acl.ts b/test/generated/full/masterData/masterData.acl.ts deleted file mode 100644 index 2c0c2c9..0000000 --- a/test/generated/full/masterData/masterData.acl.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace MasterDataAcl { -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -} diff --git a/test/generated/full/masterData/masterData.api.ts b/test/generated/full/masterData/masterData.api.ts deleted file mode 100644 index 831aadf..0000000 --- a/test/generated/full/masterData/masterData.api.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { MasterDataModels } from "./masterData.models"; - -export namespace MasterDataApi { -export const findAll = (officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, - `/offices/${officeId}/master-data/autocomplete`, - { - ...config, - params: { - types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { type: "query", name: "types" }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -export const paginate = (officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, - `/offices/${officeId}/master-data/labels/paginated`, - { - ...config, - params: { - types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { type: "query", name: "types" }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/full/masterData/masterData.configs.ts b/test/generated/full/masterData/masterData.configs.ts deleted file mode 100644 index 06f2f06..0000000 --- a/test/generated/full/masterData/masterData.configs.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { dynamicColumns } from "@povio/ui"; -import { MasterDataModels } from "./masterData.models"; -import { MasterDataQueries } from "./masterData.queries"; -import { MasterDataAcl } from "./masterData.acl"; - -export namespace MasterDataConfigs { -export const paginatedConfig = { - meta: { - title: "Paginated", - }, - readAll: { - acl: MasterDataAcl.canUsePaginate, - schema: MasterDataModels.MasterDataLabelResponseDTOSchema, - paginated: MasterDataQueries.usePaginate, - infinite: MasterDataQueries.usePaginateInfinite, - columns: dynamicColumns({ - schema: MasterDataModels.MasterDataLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - type: true, - }, - }, -}), - }, -}; - -} diff --git a/test/generated/full/masterData/masterData.models.ts b/test/generated/full/masterData/masterData.models.ts deleted file mode 100644 index 018a2dc..0000000 --- a/test/generated/full/masterData/masterData.models.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace MasterDataModels { -/** - * MasterDataTypeEnumSchema - * @type { enum } - */ -export const MasterDataTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "City", "Warehouse", "ContainerYard", "PortTerminal", "AirportTerminal", "Port", "Airport"]); -export type MasterDataTypeEnum = z.infer; -export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; - -/** - * MasterDataItemResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the item - * @property { string } name Name of the item - * @property { MasterDataTypeEnum } type Type of the item - */ -export const MasterDataItemResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the item"), name: z.string().describe("Name of the item"), type: MasterDataTypeEnumSchema.describe("Type of the item") }).readonly(); -export type MasterDataItemResponseDTO = z.infer; - -/** - * MasterDataItemsResponseDTOSchema - * @type { object } - * @property { MasterDataItemResponseDTO[] } items List of master data items - */ -export const MasterDataItemsResponseDTOSchema = z.object({ items: z.array(MasterDataItemResponseDTOSchema).readonly().describe("List of master data items") }).readonly(); -export type MasterDataItemsResponseDTO = z.infer; - -/** - * MasterDataLabelResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the item - * @property { string } label Label of the item - * @property { MasterDataTypeEnum } type Type of the item - */ -export const MasterDataLabelResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the item"), label: z.string().describe("Label of the item"), type: MasterDataTypeEnumSchema.describe("Type of the item") }).readonly(); -export type MasterDataLabelResponseDTO = z.infer; - -/** - * MasterDataFindAllTypesParamSchema - * @type { array } - */ -export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); -export type MasterDataFindAllTypesParam = z.infer; - -/** - * MasterDataPaginateTypesParamSchema - * @type { array } - */ -export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema).readonly(); -export type MasterDataPaginateTypesParam = z.infer; - -/** - * MasterDataPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { MasterDataLabelResponseDTO[] } items - */ -export const MasterDataPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(MasterDataLabelResponseDTOSchema).readonly() }).readonly().shape }); -export type MasterDataPaginateResponse = z.infer; - -} diff --git a/test/generated/full/masterData/masterData.queries.ts b/test/generated/full/masterData/masterData.queries.ts deleted file mode 100644 index 444ccd6..0000000 --- a/test/generated/full/masterData/masterData.queries.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { MasterDataAcl } from "./masterData.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { MasterDataModels } from "./masterData.models"; -import { MasterDataApi } from "./masterData.api"; - -export namespace MasterDataQueries { -export const moduleName = QueryModule.MasterData; - -export const keys = { - all: [moduleName] as const, - findAll: (officeId: string, types?: MasterDataModels.MasterDataFindAllTypesParam, search?: string) => [...keys.all, "/offices/:officeId/master-data/autocomplete", officeId, types, search] as const, - paginate: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", officeId, types, limit, search, page, cursor] as const, - paginateInfinite: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", "infinite", officeId, types, limit, search, cursor] as const, -}; - -/** - * Query `useFindAll` - * @summary List master data based on provided type - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataFindAllTypesParam } object.types Query parameter - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ officeId, types, search }: { officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(officeId, types, search), - queryFn: () => { - checkAcl(MasterDataAcl.canUseFindAll()); - return MasterDataApi.findAll(officeId, types, search, config) }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate master data based on provided type - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.search Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, types, limit, search, page, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, types, limit, search, page, cursor), - queryFn: () => { - checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate master data based on provided type - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.search Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, types, limit, search, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), - queryFn: ({ pageParam }) => { - checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/full/masterDataImport/masterDataImport.acl.ts b/test/generated/full/masterDataImport/masterDataImport.acl.ts deleted file mode 100644 index 7e98741..0000000 --- a/test/generated/full/masterDataImport/masterDataImport.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace MasterDataImportAcl { -/** - * Use for `useUpload` mutation ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpload` mutation - */ -export const canUseUpload = ( - object?: { officeId: string, } -) => [ - "Import", - object ? subject("MasterData", object) : "MasterData" -] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - -/** - * Use for `usePostOfficesMasterDataImportByOfficeId` mutation ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePostOfficesMasterDataImportByOfficeId` mutation - */ -export const canUsePostOfficesMasterDataImportByOfficeId = ( - object?: { officeId: string, } -) => [ - "Import", - object ? subject("MasterData", object) : "MasterData" -] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - -/** - * Use for `useGetImportStatus` query ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetImportStatus` query - */ -export const canUseGetImportStatus = ( - object?: { officeId: string, } -) => [ - "Import", - object ? subject("MasterData", object) : "MasterData" -] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - -} diff --git a/test/generated/full/masterDataImport/masterDataImport.api.ts b/test/generated/full/masterDataImport/masterDataImport.api.ts deleted file mode 100644 index 8690f02..0000000 --- a/test/generated/full/masterDataImport/masterDataImport.api.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { MasterDataImportModels } from "./masterDataImport.models"; - -export namespace MasterDataImportApi { -export const upload = (officeId: string, data: MasterDataImportModels.MasterDataImportUploadRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, - `/offices/${officeId}/master-data/upload`, - ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), - config - ) -}; -export const postOfficesMasterDataImportByOfficeId = (officeId: string, data: MasterDataImportModels.MasterDataImportRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, - `/offices/${officeId}/master-data/import`, - ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), - config - ) -}; -export const getImportStatus = (jobId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, - `/offices/${officeId}/master-data/import/${jobId}/status`, - config - ) -}; -} diff --git a/test/generated/full/masterDataImport/masterDataImport.models.ts b/test/generated/full/masterDataImport/masterDataImport.models.ts deleted file mode 100644 index 6033091..0000000 --- a/test/generated/full/masterDataImport/masterDataImport.models.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { z } from "zod"; - -export namespace MasterDataImportModels { -/** - * ImportStatusEnumSchema - * @type { enum } - * @description Import result status - */ -export const ImportStatusEnumSchema = z.enum(["Success", "Warning", "Error"]); -export type ImportStatusEnum = z.infer; -export const ImportStatusEnum = ImportStatusEnumSchema.enum; - -/** - * ImportTypeEnumSchema - * @type { enum } - */ -export const ImportTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Warehouse"]); -export type ImportTypeEnum = z.infer; -export const ImportTypeEnum = ImportTypeEnumSchema.enum; - -/** - * MasterDataImportRequestDtoSchema - * @type { object } - * @property { string } mediaId Media ID of the uploaded file - * @property { ImportTypeEnum } type Type of data to import - */ -export const MasterDataImportRequestDtoSchema = z.object({ mediaId: z.string().describe("Media ID of the uploaded file"), type: ImportTypeEnumSchema.describe("Type of data to import") }).readonly(); -export type MasterDataImportRequestDto = z.infer; - -/** - * ImportResultDtoSchema - * @type { object } - * @property { string } importStatus Import result status - * @property { string } downloadUrl S3 presigned URL for result file download - * @property { string } expiresAt Download URL expiration time - * @property { string } errorCode - */ -export const ImportResultDtoSchema = z.object({ importStatus: ImportStatusEnumSchema.describe("Import result status").nullish(), downloadUrl: z.string().describe("S3 presigned URL for result file download"), expiresAt: z.iso.datetime({ offset: true }).describe("Download URL expiration time").nullish(), errorCode: z.string().nullish() }).readonly(); -export type ImportResultDto = z.infer; - -/** - * ImportStatusResponseDtoSchema - * @type { object } - * @property { string } status Current job status - * @property { ImportResultDto } result Import result data when job is completed - */ -export const ImportStatusResponseDtoSchema = z.object({ status: z.string().describe("Current job status").nullable(), result: ImportResultDtoSchema.describe("Import result data when job is completed").nullish() }).readonly(); -export type ImportStatusResponseDto = z.infer; - -/** - * MasterDataImportUploadRequestDtoSchema - * @type { object } - * @property { string } filename File name - * @property { string } contentType Content type of the file - * @property { number } fileSize File size in bytes. Minimum: `1` - */ -export const MasterDataImportUploadRequestDtoSchema = z.object({ filename: z.string().describe("File name"), contentType: z.string().describe("Content type of the file"), fileSize: z.number().gte(1).describe("File size in bytes") }).readonly(); -export type MasterDataImportUploadRequestDto = z.infer; - -/** - * MasterDataImportUploadResponseDtoSchema - * @type { object } - * @property { string } mediaId Media ID for the uploaded file - * @property { string } url S3 presigned upload URL - */ -export const MasterDataImportUploadResponseDtoSchema = z.object({ mediaId: z.string().describe("Media ID for the uploaded file"), url: z.string().describe("S3 presigned upload URL") }).readonly(); -export type MasterDataImportUploadResponseDto = z.infer; - -/** - * MasterDataImportResponseDtoSchema - * @type { object } - * @property { string } jobId PG Boss job ID - * @property { string } status Initial job status - */ -export const MasterDataImportResponseDtoSchema = z.object({ jobId: z.string().describe("PG Boss job ID"), status: z.string().describe("Initial job status").nullish() }).readonly(); -export type MasterDataImportResponseDto = z.infer; - -} diff --git a/test/generated/full/masterDataImport/masterDataImport.queries.ts b/test/generated/full/masterDataImport/masterDataImport.queries.ts deleted file mode 100644 index 07d3f9b..0000000 --- a/test/generated/full/masterDataImport/masterDataImport.queries.ts +++ /dev/null @@ -1,121 +0,0 @@ -import axios, { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { MasterDataImportAcl } from "./masterDataImport.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { MasterDataImportModels } from "./masterDataImport.models"; -import { MasterDataImportApi } from "./masterDataImport.api"; - -export namespace MasterDataImportQueries { -export const moduleName = QueryModule.MasterDataImport; - -export const keys = { - all: [moduleName] as const, - getImportStatus: (jobId: string, officeId: string) => [...keys.all, "/offices/:officeId/master-data/import/:jobId/status", jobId, officeId] as const, -}; - -/** - * Mutation `useUpload` - * @summary Create upload instructions for master data import file - * @permission Requires `canUseUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { MasterDataImportModels.MasterDataImportUploadRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(MasterDataImportAcl.canUseUpload({ officeId } )); - const uploadInstructions = await MasterDataImportApi.upload(officeId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `usePostOfficesMasterDataImportByOfficeId` - * @summary Start master data import process - * @permission Requires `canUsePostOfficesMasterDataImportByOfficeId` ability - * @param { string } mutation.officeId Path parameter - * @param { MasterDataImportModels.MasterDataImportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const usePostOfficesMasterDataImportByOfficeId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId } )); - return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetImportStatus` - * @summary Get import job status - * @permission Requires `canUseGetImportStatus` ability - * @param { string } object.jobId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetImportStatus = ({ jobId, officeId }: { jobId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getImportStatus(jobId, officeId), - queryFn: () => { - checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId } )); - return MasterDataImportApi.getImportStatus(jobId, officeId, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/offices/offices.acl.ts b/test/generated/full/offices/offices.acl.ts deleted file mode 100644 index 0f81019..0000000 --- a/test/generated/full/offices/offices.acl.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace OfficesAcl { -/** - * Use for `useCreate` mutation ability. - * @description Create office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Office" -] as AbilityTuple<"Create", "Office">; - -/** - * Use for `useGet` query ability. - * @description Read office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( -) => [ - "Read", - "Office" -] as AbilityTuple<"Read", "Office">; - -/** - * Use for `useUpdate` mutation ability. - * @description Update office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Office" -] as AbilityTuple<"Update", "Office">; - -/** - * Use for `useUploadDocumentImage` mutation ability. For global ability, omit the object parameter. - * @description Upload office document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadDocumentImage` mutation - */ -export const canUseUploadDocumentImage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useCreateBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Create office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBankAccount` mutation - */ -export const canUseCreateBankAccount = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useUpdateBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Update office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBankAccount` mutation - */ -export const canUseUpdateBankAccount = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useDeleteBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Delete office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBankAccount` mutation - */ -export const canUseDeleteBankAccount = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useUploadBankAccountFooter` mutation ability. For global ability, omit the object parameter. - * @description Upload bank account footer - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadBankAccountFooter` mutation - */ -export const canUseUploadBankAccountFooter = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -} diff --git a/test/generated/full/offices/offices.api.ts b/test/generated/full/offices/offices.api.ts deleted file mode 100644 index 23f37d7..0000000 --- a/test/generated/full/offices/offices.api.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { OfficesModels } from "./offices.models"; - -export namespace OfficesApi { -export const paginate = (limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: OfficesModels.OfficesPaginateResponseSchema }, - `/offices`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: OfficesModels.CreateOfficeRequest, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: OfficesModels.OfficeResponseDtoSchema }, - `/offices`, - ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), - config - ) -}; -export const findAllLabels = (search?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: OfficesModels.FindAllLabelsResponseSchema }, - `/offices/labels`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, - `/offices/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const get = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, - `/offices/${id}`, - config - ) -}; -export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: OfficesModels.OfficeResponseDtoSchema }, - `/offices/${id}`, - ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), - config - ) -}; -export const uploadDocumentImage = (officeId: string, data: OfficesModels.UploadOfficeDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, - `/offices/${officeId}/document-image`, - ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), - config - ) -}; -export const createBankAccount = (officeId: string, data: OfficesModels.CreateOfficeBankAccountDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, - `/offices/${officeId}/bank-accounts`, - ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), - config - ) -}; -export const updateBankAccount = (accountId: string, officeId: string, data: OfficesModels.UpdateOfficeBankAccountDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, - `/offices/${officeId}/bank-accounts/${accountId}`, - ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), - config - ) -}; -export const deleteBankAccount = (accountId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/bank-accounts/${accountId}`, - undefined, - config - ) -}; -export const uploadBankAccountFooter = (accountId: string, officeId: string, data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, - `/offices/${officeId}/bank-accounts/${accountId}/footer`, - ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/offices/offices.configs.ts b/test/generated/full/offices/offices.configs.ts deleted file mode 100644 index 07f5587..0000000 --- a/test/generated/full/offices/offices.configs.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { OfficesModels } from "./offices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { OfficesQueries } from "./offices.queries"; -import { OfficesAcl } from "./offices.acl"; - -export namespace OfficesConfigs { -export const officesConfig = { - meta: { - title: "Offices", - }, - readAll: { - schema: OfficesModels.OfficeListItemResponseSchema, - paginated: OfficesQueries.usePaginate, - infinite: OfficesQueries.usePaginateInfinite, - filters: { - schema: OfficesModels.OfficeFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: OfficesModels.OfficeFilterDtoSchema, - options: { - inputs: { - name: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: OfficesModels.OfficeListItemResponseSchema, - options: { - columns: { - id: true, - name: true, - numberOfEmployees: true, - }, - sortable: OfficesModels.OfficesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: OfficesAcl.canUseGet, - schema: OfficesModels.OfficeDetailResponseDtoSchema, - query: OfficesQueries.useGet, - }, - create: { - acl: OfficesAcl.canUseCreate, - schema: OfficesModels.CreateOfficeRequestSchema, - mutation: OfficesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: OfficesModels.CreateOfficeRequestSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: OfficesAcl.canUseUpdate, - schema: OfficesModels.UpdateOfficeRequestSchema, - mutation: OfficesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: OfficesModels.UpdateOfficeRequestSchema, - options: { - inputs: { - name: true, - symbol: true, - invoicePrefix: true, - autoClosePositionsAfterDays: true, - defaultLanguage: true, - locale: true, - vatId: true, - taxNumber: true, - termsExport: true, - termsImport: true, - showPaymentInstructions: true, - showCompanyRegistrationNumber: true, - reportInvoicesToHungarianTaxAuthority: true, - restrictPositionInvolvedParties: true, - showWatermarkOnDocuments: true, - showInvoiceVatLinesInOfficeCurrency: true, - usePartnerMatchCodes: true, - restrictFinancePartnersToRelationship: true, - costCenterId: true, - minimumOutgoingInvoiceDate: true, - minimumOutgoingInvoiceServiceDate: true, - minimumIncomingInvoiceDate: true, - minimumIncomingInvoiceServiceDate: true, - countryId: true, - defaultCurrencyId: true, - representingBusinessPartnerId: true, - availableCurrencyIds: true, - generalLedgerSystem: true, - factoringReportingEnabled: true, - bankAccountCurrencyMapping: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - schema: CommonModels.LabelResponseDTOSchema, - paginated: OfficesQueries.usePaginateLabels, - infinite: OfficesQueries.usePaginateLabelsInfinite, - filters: { - schema: OfficesModels.OfficeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: OfficesModels.OfficeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/offices/offices.models.ts b/test/generated/full/offices/offices.models.ts deleted file mode 100644 index c36fc5b..0000000 --- a/test/generated/full/offices/offices.models.ts +++ /dev/null @@ -1,390 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace OfficesModels { -/** - * OfficeCurrencyResponseDtoSchema - * @type { object } - * @property { string } isoCode - * @property { string } name - */ -export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }).readonly(); -export type OfficeCurrencyResponseDto = z.infer; - -/** - * OfficeBankAccountCurrencyMappingResponseDtoSchema - * @type { object } - * @property { string } currency - * @property { string } bankAccountId - * @property { string } bankAccountName - */ -export const OfficeBankAccountCurrencyMappingResponseDtoSchema = z.object({ currency: z.string(), bankAccountId: z.string(), bankAccountName: z.string() }).readonly(); -export type OfficeBankAccountCurrencyMappingResponseDto = z.infer; - -/** - * OfficeBookkeepingResponseDtoSchema - * @type { object } - * @property { string } generalLedgerSystem - * @property { OfficeCurrencyResponseDto } defaultCurrency - * @property { OfficeCurrencyResponseDto[] } availableCurrencies - * @property { boolean } showPaymentInstructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { OfficeBankAccountCurrencyMappingResponseDto[] } bankAccountCurrencyMapping - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { boolean } factoringReportingEnabled - */ -export const OfficeBookkeepingResponseDtoSchema = z.object({ generalLedgerSystem: z.string(), defaultCurrency: OfficeCurrencyResponseDtoSchema.nullish(), availableCurrencies: z.array(OfficeCurrencyResponseDtoSchema).readonly(), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), bankAccountCurrencyMapping: z.array(OfficeBankAccountCurrencyMappingResponseDtoSchema).readonly(), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), factoringReportingEnabled: z.boolean() }).readonly(); -export type OfficeBookkeepingResponseDto = z.infer; - -/** - * OfficeDocumentPartEnumSchema - * @type { enum } - */ -export const OfficeDocumentPartEnumSchema = z.enum(["DocumentFooter", "DocumentHeader", "GeneralTermsAndConditions", "BLTermsAndConditions", "FinanceDocumentFooter"]); -export type OfficeDocumentPartEnum = z.infer; -export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; - -/** - * OfficeDocumentSettingsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } mediaUrl - * @property { CommonModels.LanguageEnum } language - * @property { OfficeDocumentPartEnum } documentPart - */ -export const OfficeDocumentSettingsResponseDtoSchema = z.object({ id: z.string(), mediaUrl: z.string(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }).readonly(); -export type OfficeDocumentSettingsResponseDto = z.infer; - -/** - * AddressResponseDTOSchema - * @type { object } - * @property { string } id ID of the address - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } city City name - * @property { string } district District - * @property { string } isoCode2 2 letter country code - * @property { string } country Country name - * @property { string } isoCode3 3 letter country code - */ -export const AddressResponseDTOSchema = z.object({ id: z.string().describe("ID of the address"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street address"), zip: z.string().describe("ZIP/Postal code"), city: z.string().describe("City name"), district: z.string().describe("District"), isoCode2: z.string().describe("2 letter country code"), country: z.string().describe("Country name"), isoCode3: z.string().describe("3 letter country code") }).readonly(); -export type AddressResponseDTO = z.infer; - -/** - * OfficeRepresentingBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string[] } types - * @property { string[] } email - * @property { string[] } phone - * @property { string } addressId - * @property { AddressResponseDTO } address - */ -export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), types: z.array(z.string()).readonly(), email: z.array(z.string()).readonly().nullish(), phone: z.array(z.string()).readonly().nullish(), addressId: z.string().nullish(), address: AddressResponseDTOSchema.nullish() }).readonly(); -export type OfficeRepresentingBusinessPartnerResponseDto = z.infer; - -/** - * OfficePaymentTermsResponseDtoSchema - * @type { object } - * @property { number } days - * @property { string } relativeTo - */ -export const OfficePaymentTermsResponseDtoSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }).readonly(); -export type OfficePaymentTermsResponseDto = z.infer; - -/** - * OfficeCountryResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const OfficeCountryResponseDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type OfficeCountryResponseDto = z.infer; - -/** - * OfficeBankAccountResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } bankName - * @property { string } iban - * @property { string } swiftBic - * @property { boolean } useFooterOnInvoice - * @property { object } footer - * @property { string } footer.mediaUrl - * @property { boolean } isFactoringBank - */ -export const OfficeBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string(), bankName: z.string(), iban: z.string(), swiftBic: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).readonly().nullish(), isFactoringBank: z.boolean() }).readonly(); -export type OfficeBankAccountResponseDto = z.infer; - -/** - * OfficeDetailResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } symbol - * @property { number } invoicePrefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage - * @property { CommonModels.LocaleEnum } locale - * @property { string } vatId - * @property { string } taxNumber - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { OfficePaymentTermsResponseDto } termsExport - * @property { OfficePaymentTermsResponseDto } termsImport - * @property { OfficeCountryResponseDto } country - * @property { OfficeBankAccountResponseDto[] } bankAccounts - * @property { OfficeBookkeepingResponseDto } bookkeeping - * @property { OfficeDocumentSettingsResponseDto[] } documentSettings - * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner - * @property { boolean } hasInttraCredentials - */ -export const OfficeDetailResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), country: OfficeCountryResponseDtoSchema.nullable(), bankAccounts: z.array(OfficeBankAccountResponseDtoSchema).readonly(), bookkeeping: OfficeBookkeepingResponseDtoSchema, documentSettings: z.array(OfficeDocumentSettingsResponseDtoSchema).readonly(), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), hasInttraCredentials: z.boolean().nullish() }).readonly(); -export type OfficeDetailResponseDto = z.infer; - -/** - * OfficeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } symbol - * @property { number } invoicePrefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage - * @property { CommonModels.LocaleEnum } locale - * @property { string } vatId - * @property { string } taxNumber - * @property { OfficePaymentTermsResponseDto } termsExport - * @property { OfficePaymentTermsResponseDto } termsImport - * @property { boolean } showPaymentInstructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { string } countryId - * @property { string } defaultCurrencyId - * @property { string[] } availableCurrencyIds - * @property { string } generalLedgerSystem - * @property { string } representingBusinessPartnerId - * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner - * @property { boolean } factoringReportingEnabled - */ -export const OfficeResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), countryId: z.string().nullable(), defaultCurrencyId: z.string().nullable(), availableCurrencyIds: z.array(z.string()).readonly().nullable(), generalLedgerSystem: z.string().nullable(), representingBusinessPartnerId: z.string().nullable(), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), factoringReportingEnabled: z.boolean() }).readonly(); -export type OfficeResponseDto = z.infer; - -/** - * UpdateOfficePaymentTermsRequestSchema - * @type { object } - * @property { number } days - * @property { string } relativeTo - */ -export const UpdateOfficePaymentTermsRequestSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }).readonly(); -export type UpdateOfficePaymentTermsRequest = z.infer; - -/** - * UpdateOfficeBankAccountCurrencyMappingSchema - * @type { object } - * @property { string } currency - * @property { string } bankAccountId - */ -export const UpdateOfficeBankAccountCurrencyMappingSchema = z.object({ currency: z.string(), bankAccountId: z.string() }).readonly(); -export type UpdateOfficeBankAccountCurrencyMapping = z.infer; - -/** - * UpdateOfficeRequestSchema - * @type { object } - * @property { string } name Office Name - * @property { string } symbol Office Symbol - * @property { number } invoicePrefix Office Invoice Prefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage Office Default Language - * @property { string } locale - * @property { string } vatId Office Vat Id - * @property { string } taxNumber Office Tax Number - * @property { UpdateOfficePaymentTermsRequest } termsExport Office Terms Export - * @property { UpdateOfficePaymentTermsRequest } termsImport Office Terms Import - * @property { boolean } showPaymentInstructions Office Show Payment Instructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { string } countryId Office country id - * @property { string } defaultCurrencyId Office default currency id - * @property { string } representingBusinessPartnerId Representing business partner id - * @property { string[] } availableCurrencyIds Office availableCurrencyIds - * @property { string } generalLedgerSystem Office general ledger system - * @property { boolean } factoringReportingEnabled - * @property { UpdateOfficeBankAccountCurrencyMapping[] } bankAccountCurrencyMapping Office bank account currency mapping - */ -export const UpdateOfficeRequestSchema = z.object({ name: z.string().describe("Office Name"), symbol: z.string().describe("Office Symbol"), invoicePrefix: z.number().describe("Office Invoice Prefix"), autoClosePositionsAfterDays: z.number(), defaultLanguage: z.string().describe("Office Default Language"), locale: CommonModels.LocaleEnumSchema, vatId: z.string().describe("Office Vat Id"), taxNumber: z.string().describe("Office Tax Number"), termsExport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Export"), termsImport: UpdateOfficePaymentTermsRequestSchema.describe("Office Terms Import"), showPaymentInstructions: z.boolean().describe("Office Show Payment Instructions"), showCompanyRegistrationNumber: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), costCenterId: z.string(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }), countryId: z.string().describe("Office country id"), defaultCurrencyId: z.string().describe("Office default currency id"), representingBusinessPartnerId: z.string().describe("Representing business partner id"), availableCurrencyIds: z.array(z.string()).readonly().describe("Office availableCurrencyIds"), generalLedgerSystem: z.string().describe("Office general ledger system"), factoringReportingEnabled: z.boolean(), bankAccountCurrencyMapping: z.array(UpdateOfficeBankAccountCurrencyMappingSchema).readonly().describe("Office bank account currency mapping") }).readonly(); -export type UpdateOfficeRequest = z.infer; - -/** - * UploadOfficeDocumentRequestDtoSchema - * @type { object } - * @property { string } fileName File name with extension - * @property { string } mimeType MIME type of the file - * @property { number } fileSize Size of the file - * @property { string } language Language of the document - * @property { string } documentPart Part of the document this image represents - */ -export const UploadOfficeDocumentRequestDtoSchema = z.object({ fileName: z.string().describe("File name with extension"), mimeType: z.string().describe("MIME type of the file"), fileSize: z.number().describe("Size of the file"), language: CommonModels.LanguageEnumSchema.describe("Language of the document"), documentPart: OfficeDocumentPartEnumSchema.describe("Part of the document this image represents") }).readonly(); -export type UploadOfficeDocumentRequestDto = z.infer; - -/** - * OfficeListItemResponseSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { number } numberOfEmployees - */ -export const OfficeListItemResponseSchema = z.object({ id: z.string(), name: z.string(), numberOfEmployees: z.number() }).readonly(); -export type OfficeListItemResponse = z.infer; - -/** - * OfficeFilterDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } search - */ -export const OfficeFilterDtoSchema = z.object({ name: z.string().describe("Name"), search: z.string() }).readonly(); -export type OfficeFilterDto = z.infer; - -/** - * OfficeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const OfficeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type OfficeLabelFilterDto = z.infer; - -/** - * CreateOfficeRequestSchema - * @type { object } - * @property { string } name - */ -export const CreateOfficeRequestSchema = z.object({ name: z.string() }).readonly(); -export type CreateOfficeRequest = z.infer; - -/** - * DocumentImageUploadInstructionsDtoSchema - * @type { object } - * @property { string } method HTTP method to use for upload - * @property { string } url URL to upload the file to - * @property { string } documentId ID of the created/updated document setting - */ -export const DocumentImageUploadInstructionsDtoSchema = z.object({ method: z.string().describe("HTTP method to use for upload"), url: z.string().describe("URL to upload the file to"), documentId: z.string().describe("ID of the created/updated document setting") }).readonly(); -export type DocumentImageUploadInstructionsDto = z.infer; - -/** - * CreateOfficeBankAccountDtoSchema - * @type { object } - * @property { string } name Bank account name - * @property { string } bankName Bank name - * @property { string } iban IBAN - * @property { string } swiftBic SWIFT/BIC code - * @property { boolean } useFooterOnInvoice Use footer on invoice - */ -export const CreateOfficeBankAccountDtoSchema = z.object({ name: z.string().describe("Bank account name"), bankName: z.string().describe("Bank name"), iban: z.string().describe("IBAN"), swiftBic: z.string().describe("SWIFT/BIC code"), useFooterOnInvoice: z.boolean().describe("Use footer on invoice") }).readonly(); -export type CreateOfficeBankAccountDto = z.infer; - -/** - * UpdateOfficeBankAccountDtoSchema - * @type { object } - * @property { string } name Bank account name - * @property { string } bankName Bank name - * @property { string } iban IBAN - * @property { string } swiftBic SWIFT/BIC code - * @property { boolean } useFooterOnInvoice Use footer on invoice - * @property { boolean } isFactoringBank Is factoring bank - */ -export const UpdateOfficeBankAccountDtoSchema = z.object({ name: z.string().describe("Bank account name"), bankName: z.string().describe("Bank name"), iban: z.string().describe("IBAN"), swiftBic: z.string().describe("SWIFT/BIC code"), useFooterOnInvoice: z.boolean().describe("Use footer on invoice"), isFactoringBank: z.boolean().describe("Is factoring bank") }).readonly(); -export type UpdateOfficeBankAccountDto = z.infer; - -/** - * UploadOfficeBankAccountFooterRequestDtoSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType File MIME type - * @property { number } fileSize Size of the file - */ -export const UploadOfficeBankAccountFooterRequestDtoSchema = z.object({ fileName: z.string().describe("File name"), mimeType: z.string().describe("File MIME type"), fileSize: z.number().describe("Size of the file") }).readonly(); -export type UploadOfficeBankAccountFooterRequestDto = z.infer; - -/** - * OfficesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const OfficesPaginateOrderParamEnumSchema = z.enum(["name"]); -export type OfficesPaginateOrderParamEnum = z.infer; -export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema.enum; - -/** - * OfficesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficeListItemResponse[] } items - */ -export const OfficesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(OfficeListItemResponseSchema).readonly() }).readonly().shape }); -export type OfficesPaginateResponse = z.infer; - -/** - * FindAllLabelsResponseSchema - * @type { array } - */ -export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); -export type FindAllLabelsResponse = z.infer; - -/** - * OfficesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const OfficesPaginateLabelsOrderParamEnumSchema = z.enum(["name"]); -export type OfficesPaginateLabelsOrderParamEnum = z.infer; -export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * OfficesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const OfficesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type OfficesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/offices/offices.queries.ts b/test/generated/full/offices/offices.queries.ts deleted file mode 100644 index beb29d6..0000000 --- a/test/generated/full/offices/offices.queries.ts +++ /dev/null @@ -1,403 +0,0 @@ -import axios, { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { OfficesAcl } from "./offices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { OfficesModels } from "./offices.models"; -import { OfficesApi } from "./offices.api"; - -export namespace OfficesQueries { -export const moduleName = QueryModule.Offices; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string) => [...keys.all, "/offices", "infinite", limit, order, filter, cursor] as const, - findAllLabels: (search?: string) => [...keys.all, "/offices/labels", search] as const, - paginateLabels: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string) => [...keys.all, "/offices/labels/paginate", "infinite", limit, order, filter, cursor] as const, - get: (id: string) => [...keys.all, "/offices/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate offices - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => - OfficesApi.paginate(limit, order, filter, page, cursor, config), - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate offices - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - OfficesApi.paginate(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create new office - * @permission Requires `canUseCreate` ability - * @param { OfficesModels.CreateOfficeRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(OfficesAcl.canUseCreate()); - return OfficesApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindAllLabels` - * @summary List all offices with only their labels - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllLabels = ({ search }: { search?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.findAllLabels(search), - queryFn: () => - OfficesApi.findAllLabels(search, config), - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate offices with only their labels - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => - OfficesApi.paginateLabels(limit, order, filter, page, cursor, config), - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate offices with only their labels - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor, config), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGet` - * @summary Get office by id - * @permission Requires `canUseGet` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(id), - queryFn: () => { - checkAcl(OfficesAcl.canUseGet()); - return OfficesApi.get(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update office - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { OfficesModels.UpdateOfficeRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(OfficesAcl.canUseUpdate()); - return OfficesApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUploadDocumentImage` - * @summary Upload document image for an office - * @permission Requires `canUseUploadDocumentImage` ability - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UploadOfficeDocumentRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUploadDocumentImage = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId } )); - const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateBankAccount` - * @summary Create office bank account - * @permission Requires `canUseCreateBankAccount` ability - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.CreateOfficeBankAccountDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId } )); - return OfficesApi.createBankAccount(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBankAccount` - * @summary Update office bank account - * @permission Requires `canUseUpdateBankAccount` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UpdateOfficeBankAccountDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ accountId, officeId, data }) => { - checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId } )); - return OfficesApi.updateBankAccount(accountId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteBankAccount` - * @summary Delete office bank account - * @permission Requires `canUseDeleteBankAccount` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteBankAccount = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ accountId, officeId }) => { - checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId } )); - return OfficesApi.deleteBankAccount(accountId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUploadBankAccountFooter` - * @summary Upload office bank account footer - * @permission Requires `canUseUploadBankAccountFooter` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UploadOfficeBankAccountFooterRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUploadBankAccountFooter = (options?: AppMutationOptions void }> & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId } )); - const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data, config); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/packageTypes/packageTypes.acl.ts b/test/generated/full/packageTypes/packageTypes.acl.ts deleted file mode 100644 index f37bcb1..0000000 --- a/test/generated/full/packageTypes/packageTypes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PackageTypesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "PackageType" -] as AbilityTuple<"Read", "PackageType">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "PackageType" -] as AbilityTuple<"Create", "PackageType">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "PackageType" -] as AbilityTuple<"Read", "PackageType">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "PackageType" -] as AbilityTuple<"Read", "PackageType">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "PackageType" -] as AbilityTuple<"Update", "PackageType">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "PackageType" -] as AbilityTuple<"Archive", "PackageType">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "PackageType" -] as AbilityTuple<"Archive", "PackageType">; - -} diff --git a/test/generated/full/packageTypes/packageTypes.api.ts b/test/generated/full/packageTypes/packageTypes.api.ts deleted file mode 100644 index afa5bc0..0000000 --- a/test/generated/full/packageTypes/packageTypes.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PackageTypesModels } from "./packageTypes.models"; - -export namespace PackageTypesApi { -export const paginate = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, - `/package-types`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types`, - ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), - config - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, - `/package-types/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}`, - config - ) -}; -export const update = (id: string, data: PackageTypesModels.UpdatePackageTypeRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}`, - ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/packageTypes/packageTypes.configs.ts b/test/generated/full/packageTypes/packageTypes.configs.ts deleted file mode 100644 index ba6aafd..0000000 --- a/test/generated/full/packageTypes/packageTypes.configs.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PackageTypesModels } from "./packageTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PackageTypesQueries } from "./packageTypes.queries"; -import { PackageTypesAcl } from "./packageTypes.acl"; - -export namespace PackageTypesConfigs { -export const packageTypesConfig = { - meta: { - title: "Package Types", - }, - readAll: { - acl: PackageTypesAcl.canUsePaginate, - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - paginated: PackageTypesQueries.usePaginate, - infinite: PackageTypesQueries.usePaginateInfinite, - filters: { - schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - length: true, - width: true, - height: true, - unit: true, - archived: true, - code: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PackageTypesAcl.canUseFindById, - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - query: PackageTypesQueries.useFindById, - }, - create: { - acl: PackageTypesAcl.canUseCreate, - schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, - mutation: PackageTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, - options: { - inputs: { - name: true, - length: true, - width: true, - height: true, - unit: true, - code: true, - }, - }, -}) - }, - update: { - acl: PackageTypesAcl.canUseUpdate, - schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, - mutation: PackageTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, - options: { - inputs: { - name: true, - length: true, - width: true, - height: true, - unit: true, - code: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: PackageTypesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PackageTypesQueries.usePaginateLabels, - infinite: PackageTypesQueries.usePaginateLabelsInfinite, - filters: { - schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/packageTypes/packageTypes.models.ts b/test/generated/full/packageTypes/packageTypes.models.ts deleted file mode 100644 index f3d28da..0000000 --- a/test/generated/full/packageTypes/packageTypes.models.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PackageTypesModels { -/** - * PackageTypeCodeEnumSchema - * @type { enum } - */ -export const PackageTypeCodeEnumSchema = z.enum(["1A", "1B", "1D", "1F", "1G", "1W", "2C", "3A", "3H", "43", "44", "4A", "4B", "4C", "4D", "4F", "4G", "4H", "5H", "5L", "5M", "6H", "6P", "7A", "7B", "8A", "8B", "8C", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AL", "AM", "AP", "AT", "AV", "B4", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "DA", "DB", "DC", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DP", "DR", "DS", "DT", "DU", "DV", "DW", "DX", "DY", "EC", "ED", "EE", "EF", "EG", "EH", "EI", "EN", "FB", "FC", "FD", "FE", "FI", "FL", "FO", "FP", "FR", "FT", "FW", "FX", "GB", "GI", "GL", "GR", "GU", "GY", "GZ", "HA", "HB", "HC", "HG", "HN", "HR", "IA", "IB", "IC", "ID", "IE", "IF", "IG", "IH", "IK", "IL", "IN", "IZ", "JB", "JC", "JG", "JR", "JT", "JY", "KG", "KI", "LE", "LG", "LT", "LU", "LV", "LZ", "MA", "MB", "MC", "ME", "MR", "MS", "MT", "MW", "MX", "NA", "NE", "NF", "NG", "NS", "NT", "NU", "NV", "OA", "OB", "OC", "OD", "OE", "OF", "OK", "OT", "OU", "P2", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PI", "PJ", "PK", "PL", "PN", "PO", "PP", "PR", "PT", "PU", "PV", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "RD", "RG", "RJ", "RK", "RL", "RO", "RT", "RZ", "SA", "SB", "SC", "SD", "SE", "SH", "SI", "SK", "SL", "SM", "SO", "SP", "SS", "ST", "SU", "SV", "SW", "SY", "SZ", "T1", "TB", "TC", "TD", "TE", "TG", "TI", "TK", "TL", "TN", "TO", "TR", "TS", "TT", "TU", "TV", "TW", "TY", "TZ", "UC", "UN", "VA", "VG", "VI", "VK", "VL", "VO", "VP", "VQ", "VN", "VR", "VS", "VY", "WA", "WB", "WC", "WD", "WF", "WG", "WH", "WJ", "WK", "WL", "WM", "WN", "WP", "WQ", "WR", "WS", "WT", "WU", "WV", "WW", "WX", "WY", "WZ", "XA", "XB", "XC", "XD", "XF", "XG", "XH", "XJ", "XK", "YA", "YB", "YC", "YD", "YF", "YG", "YH", "YJ", "YK", "YL", "YM", "YN", "YP", "YQ", "YR", "YS", "YT", "YV", "YW", "YX", "YY", "YZ", "ZA", "ZB", "ZC", "ZD", "ZF", "ZG", "ZH", "ZJ", "ZK", "ZL", "ZM", "ZN", "ZP", "ZQ", "ZR", "ZS", "ZT", "ZU", "ZV", "ZW", "ZX", "ZY", "ZZ"]); -export type PackageTypeCodeEnum = z.infer; -export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; - -/** - * PackageTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PackageTypeEmployeeDTO = z.infer; - -/** - * PackageTypeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the package type - * @property { string } name Unique name for the package type - * @property { number } length Length of the package type - * @property { number } width Width of the package type - * @property { number } height Height of the package type - * @property { string } unit Measurement unit for dimensions - * @property { boolean } archived Indicates if the package type is archived - * @property { PackageTypeCodeEnum } code - * @property { string } createdById - * @property { PackageTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PackageTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const PackageTypeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the package type"), name: z.string().describe("Unique name for the package type"), length: z.number().describe("Length of the package type").nullish(), width: z.number().describe("Width of the package type").nullish(), height: z.number().describe("Height of the package type").nullish(), unit: z.string().describe("Measurement unit for dimensions"), archived: z.boolean().describe("Indicates if the package type is archived"), code: PackageTypeCodeEnumSchema.nullish(), createdById: z.string().nullish(), createdBy: PackageTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PackageTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type PackageTypeResponseDTO = z.infer; - -/** - * CreatePackageTypeRequestDTOSchema - * @type { object } - * @property { string } name Unique name for the package type - * @property { number } length Length of the package type - * @property { number } width Width of the package type - * @property { number } height Height of the package type - * @property { string } unit Measurement unit for dimensions - * @property { PackageTypeCodeEnum } code - */ -export const CreatePackageTypeRequestDTOSchema = z.object({ name: z.string().describe("Unique name for the package type"), length: z.number().describe("Length of the package type").nullish(), width: z.number().describe("Width of the package type").nullish(), height: z.number().describe("Height of the package type").nullish(), unit: z.string().describe("Measurement unit for dimensions"), code: PackageTypeCodeEnumSchema.nullish() }).readonly(); -export type CreatePackageTypeRequestDTO = z.infer; - -/** - * UpdatePackageTypeRequestDTOSchema - * @type { object } - * @property { string } name Updated name for package type - * @property { number } length Updated length of the package type - * @property { number } width Updated width of the package type - * @property { number } height Updated height of the package type - * @property { string } unit Updated measurement unit for dimensions - * @property { PackageTypeCodeEnum } code - */ -export const UpdatePackageTypeRequestDTOSchema = z.object({ name: z.string().describe("Updated name for package type"), length: z.number().describe("Updated length of the package type").nullable(), width: z.number().describe("Updated width of the package type").nullable(), height: z.number().describe("Updated height of the package type").nullable(), unit: z.string().describe("Updated measurement unit for dimensions"), code: PackageTypeCodeEnumSchema }).readonly(); -export type UpdatePackageTypeRequestDTO = z.infer; - -/** - * PackageTypePaginationFilterDtoSchema - * @type { object } - * @property { boolean } archived Archived - * @property { string } search - */ -export const PackageTypePaginationFilterDtoSchema = z.object({ archived: z.boolean().describe("Archived"), search: z.string() }).readonly(); -export type PackageTypePaginationFilterDto = z.infer; - -/** - * PackageTypeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const PackageTypeLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type PackageTypeLabelFilterDto = z.infer; - -/** - * PackageTypesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PackageTypesPaginateOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PackageTypesPaginateOrderParamEnum = z.infer; -export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParamEnumSchema.enum; - -/** - * PackageTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PackageTypeResponseDTO[] } items - */ -export const PackageTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageTypeResponseDTOSchema).readonly() }).readonly().shape }); -export type PackageTypesPaginateResponse = z.infer; - -/** - * PackageTypesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PackageTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PackageTypesPaginateLabelsOrderParamEnum = z.infer; -export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * PackageTypesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PackageTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type PackageTypesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/packageTypes/packageTypes.queries.ts b/test/generated/full/packageTypes/packageTypes.queries.ts deleted file mode 100644 index b7a20a5..0000000 --- a/test/generated/full/packageTypes/packageTypes.queries.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PackageTypesAcl } from "./packageTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PackageTypesModels } from "./packageTypes.models"; -import { PackageTypesApi } from "./packageTypes.api"; - -export namespace PackageTypesQueries { -export const moduleName = QueryModule.PackageTypes; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string) => [...keys.all, "/package-types", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string) => [...keys.all, "/package-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/package-types/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Package Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Package Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new Package Type - * @permission Requires `canUseCreate` ability - * @param { PackageTypesModels.CreatePackageTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PackageTypesAcl.canUseCreate()); - return PackageTypesApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate package type labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate package type labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get Package Type by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PackageTypesAcl.canUseFindById()); - return PackageTypesApi.findById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Package Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PackageTypesModels.UpdatePackageTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PackageTypesAcl.canUseUpdate()); - return PackageTypesApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Package Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PackageTypesAcl.canUseArchive()); - return PackageTypesApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive Package Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PackageTypesAcl.canUseUnarchive()); - return PackageTypesApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/partnerNetworks/partnerNetworks.acl.ts b/test/generated/full/partnerNetworks/partnerNetworks.acl.ts deleted file mode 100644 index b56d576..0000000 --- a/test/generated/full/partnerNetworks/partnerNetworks.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PartnerNetworksAcl { -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "PartnerNetwork" -] as AbilityTuple<"Read", "PartnerNetwork">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "PartnerNetwork" -] as AbilityTuple<"Read", "PartnerNetwork">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "PartnerNetwork" -] as AbilityTuple<"Create", "PartnerNetwork">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "PartnerNetwork" -] as AbilityTuple<"Read", "PartnerNetwork">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "PartnerNetwork" -] as AbilityTuple<"Update", "PartnerNetwork">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "PartnerNetwork" -] as AbilityTuple<"Archive", "PartnerNetwork">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "PartnerNetwork" -] as AbilityTuple<"Archive", "PartnerNetwork">; - -} diff --git a/test/generated/full/partnerNetworks/partnerNetworks.api.ts b/test/generated/full/partnerNetworks/partnerNetworks.api.ts deleted file mode 100644 index d24231a..0000000 --- a/test/generated/full/partnerNetworks/partnerNetworks.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; - -export namespace PartnerNetworksApi { -export const paginateLabels = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, - `/partner-networks/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, - `/partner-networks`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks`, - ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), - config - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}`, - config - ) -}; -export const update = (id: string, data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}`, - ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/partnerNetworks/partnerNetworks.configs.ts b/test/generated/full/partnerNetworks/partnerNetworks.configs.ts deleted file mode 100644 index b9d6545..0000000 --- a/test/generated/full/partnerNetworks/partnerNetworks.configs.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PartnerNetworksQueries } from "./partnerNetworks.queries"; -import { PartnerNetworksAcl } from "./partnerNetworks.acl"; - -export namespace PartnerNetworksConfigs { -export const partnerNetworksConfig = { - meta: { - title: "Partner Networks", - }, - readAll: { - acl: PartnerNetworksAcl.canUsePaginate, - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - paginated: PartnerNetworksQueries.usePaginate, - infinite: PartnerNetworksQueries.usePaginateInfinite, - filters: { - schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PartnerNetworksAcl.canUseFindById, - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - query: PartnerNetworksQueries.useFindById, - }, - create: { - acl: PartnerNetworksAcl.canUseCreate, - schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, - mutation: PartnerNetworksQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: PartnerNetworksAcl.canUseUpdate, - schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, - mutation: PartnerNetworksQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: PartnerNetworksAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PartnerNetworksQueries.usePaginateLabels, - infinite: PartnerNetworksQueries.usePaginateLabelsInfinite, - filters: { - schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/partnerNetworks/partnerNetworks.models.ts b/test/generated/full/partnerNetworks/partnerNetworks.models.ts deleted file mode 100644 index e87d278..0000000 --- a/test/generated/full/partnerNetworks/partnerNetworks.models.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PartnerNetworksModels { -/** - * PartnerNetworkEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PartnerNetworkEmployeeDTO = z.infer; - -/** - * PartnerNetworkResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the partner network - * @property { string } name Name of the partner network - * @property { boolean } archived Whether the partner network is archived - * @property { string } createdById - * @property { PartnerNetworkEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PartnerNetworkEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const PartnerNetworkResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the partner network"), name: z.string().describe("Name of the partner network"), archived: z.boolean().describe("Whether the partner network is archived"), createdById: z.string().nullish(), createdBy: PartnerNetworkEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PartnerNetworkEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type PartnerNetworkResponseDTO = z.infer; - -/** - * PartnerNetworkLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const PartnerNetworkLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type PartnerNetworkLabelFilterDto = z.infer; - -/** - * PartnerNetworkPaginationFilterDtoSchema - * @type { object } - * @property { string } search Free search - * @property { boolean } archived - */ -export const PartnerNetworkPaginationFilterDtoSchema = z.object({ search: z.string().describe("Free search"), archived: z.boolean() }).readonly(); -export type PartnerNetworkPaginationFilterDto = z.infer; - -/** - * CreatePartnerNetworkRequestDTOSchema - * @type { object } - * @property { string } name Name of the partner network - */ -export const CreatePartnerNetworkRequestDTOSchema = z.object({ name: z.string().describe("Name of the partner network") }).readonly(); -export type CreatePartnerNetworkRequestDTO = z.infer; - -/** - * UpdatePartnerNetworkRequestDTOSchema - * @type { object } - * @property { string } name Name of the partner network - */ -export const UpdatePartnerNetworkRequestDTOSchema = z.object({ name: z.string().describe("Name of the partner network") }).readonly(); -export type UpdatePartnerNetworkRequestDTO = z.infer; - -/** - * PartnerNetworksPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PartnerNetworksPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PartnerNetworksPaginateLabelsOrderParamEnum = z.infer; -export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPaginateLabelsOrderParamEnumSchema.enum; - -/** - * PartnerNetworksPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type PartnerNetworksPaginateLabelsResponse = z.infer; - -/** - * PartnerNetworksPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PartnerNetworksPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PartnerNetworksPaginateOrderParamEnum = z.infer; -export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrderParamEnumSchema.enum; - -/** - * PartnerNetworksPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerNetworkResponseDTO[] } items - */ -export const PartnerNetworksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).readonly() }).readonly().shape }); -export type PartnerNetworksPaginateResponse = z.infer; - -} diff --git a/test/generated/full/partnerNetworks/partnerNetworks.queries.ts b/test/generated/full/partnerNetworks/partnerNetworks.queries.ts deleted file mode 100644 index a0514a6..0000000 --- a/test/generated/full/partnerNetworks/partnerNetworks.queries.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PartnerNetworksAcl } from "./partnerNetworks.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; -import { PartnerNetworksApi } from "./partnerNetworks.api"; - -export namespace PartnerNetworksQueries { -export const moduleName = QueryModule.PartnerNetworks; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", "infinite", limit, order, filter, cursor] as const, - paginate: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string) => [...keys.all, "/partner-networks", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/partner-networks/:id", id] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate partner networks with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate partner networks with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Partner Networks - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Partner Networks - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new Partner Network - * @permission Requires `canUseCreate` ability - * @param { PartnerNetworksModels.CreatePartnerNetworkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PartnerNetworksAcl.canUseCreate()); - return PartnerNetworksApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get Partner Network by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUseFindById()); - return PartnerNetworksApi.findById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Partner Network - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PartnerNetworksAcl.canUseUpdate()); - return PartnerNetworksApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Partner Network - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PartnerNetworksAcl.canUseArchive()); - return PartnerNetworksApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive Partner Network - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PartnerNetworksAcl.canUseUnarchive()); - return PartnerNetworksApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/paymentConfirmations/paymentConfirmations.acl.ts b/test/generated/full/paymentConfirmations/paymentConfirmations.acl.ts deleted file mode 100644 index 2ede29d..0000000 --- a/test/generated/full/paymentConfirmations/paymentConfirmations.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PaymentConfirmationsAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read payment confirmation items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate payment confirmation document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetEml` mutation ability. For global ability, omit the object parameter. - * @description Download payment confirmation as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetEml` mutation - */ -export const canUseGetEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/full/paymentConfirmations/paymentConfirmations.api.ts b/test/generated/full/paymentConfirmations/paymentConfirmations.api.ts deleted file mode 100644 index 25755a1..0000000 --- a/test/generated/full/paymentConfirmations/paymentConfirmations.api.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; - -export namespace PaymentConfirmationsApi { -export const get = (officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, - `/offices/${officeId}/payment-confirmations`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const generate = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payment-confirmations/generate`, - ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getEml = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payment-confirmations/eml`, - ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/full/paymentConfirmations/paymentConfirmations.configs.ts b/test/generated/full/paymentConfirmations/paymentConfirmations.configs.ts deleted file mode 100644 index af0fe49..0000000 --- a/test/generated/full/paymentConfirmations/paymentConfirmations.configs.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; -import { PaymentConfirmationsQueries } from "./paymentConfirmations.queries"; -import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; - -export namespace PaymentConfirmationsConfigs { -export const paymentConfirmationsConfig = { - meta: { - title: "Payment Confirmations", - }, - readAll: { - acl: PaymentConfirmationsAcl.canUseGet, - schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, - paginated: PaymentConfirmationsQueries.useGet, - infinite: PaymentConfirmationsQueries.useGetInfinite, - filters: { - schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, - options: { - inputs: { - businessPartnerId: true, - paymentDate: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, - options: { - columns: { - invoiceId: true, - invoiceNumber: true, - invoiceDate: true, - invoiceAmount: true, - amount: true, - currencyNotation: true, - reference: true, - position: true, - paymentDate: true, - }, - sortable: PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/paymentConfirmations/paymentConfirmations.models.ts b/test/generated/full/paymentConfirmations/paymentConfirmations.models.ts deleted file mode 100644 index acbe59b..0000000 --- a/test/generated/full/paymentConfirmations/paymentConfirmations.models.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PaymentConfirmationsModels { -/** - * PaymentConfirmationPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }).readonly(); -export type PaymentConfirmationPositionDto = z.infer; - -/** - * PaymentConfirmationItemDtoSchema - * @type { object } - * @property { string } invoiceId Invoice ID - * @property { string } invoiceNumber Invoice number - * @property { string } invoiceDate Invoice date - * @property { number } invoiceAmount Invoice amount - * @property { number } amount Payment amount - * @property { string } currencyNotation Currency notation - * @property { string } reference Reference - * @property { PaymentConfirmationPositionDto } position Position information - * @property { string } paymentDate Payment date - */ -export const PaymentConfirmationItemDtoSchema = z.object({ invoiceId: z.string().describe("Invoice ID"), invoiceNumber: z.string().describe("Invoice number"), invoiceDate: z.iso.datetime({ offset: true }).describe("Invoice date"), invoiceAmount: z.number().describe("Invoice amount"), amount: z.number().describe("Payment amount"), currencyNotation: z.string().describe("Currency notation"), reference: z.string().describe("Reference").nullish(), position: PaymentConfirmationPositionDtoSchema.describe("Position information"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date") }).readonly(); -export type PaymentConfirmationItemDto = z.infer; - -/** - * PaymentConfirmationItemFilterDtoSchema - * @type { object } - * @property { string } businessPartnerId Business partner ID - * @property { string } paymentDate Payment date - */ -export const PaymentConfirmationItemFilterDtoSchema = z.object({ businessPartnerId: z.string().describe("Business partner ID"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date") }).readonly(); -export type PaymentConfirmationItemFilterDto = z.infer; - -/** - * GeneratePaymentConfirmationRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId Business partner ID - * @property { string } paymentDate Payment date - * @property { string } positionId Position ID (optional) - */ -export const GeneratePaymentConfirmationRequestDtoSchema = z.object({ businessPartnerId: z.string().describe("Business partner ID"), paymentDate: z.iso.datetime({ offset: true }).describe("Payment date"), positionId: z.string().describe("Position ID (optional)").nullish() }).readonly(); -export type GeneratePaymentConfirmationRequestDto = z.infer; - -/** - * PaymentConfirmationsGetOrderParamEnumSchema - * @type { enum } - */ -export const PaymentConfirmationsGetOrderParamEnumSchema = z.enum(["paymentDate", "invoiceNumber", "amount"]); -export type PaymentConfirmationsGetOrderParamEnum = z.infer; -export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrderParamEnumSchema.enum; - -/** - * PaymentConfirmationsGetResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PaymentConfirmationItemDto[] } items - */ -export const PaymentConfirmationsGetResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).readonly() }).readonly().shape }); -export type PaymentConfirmationsGetResponse = z.infer; - -} diff --git a/test/generated/full/paymentConfirmations/paymentConfirmations.queries.ts b/test/generated/full/paymentConfirmations/paymentConfirmations.queries.ts deleted file mode 100644 index 129aa28..0000000 --- a/test/generated/full/paymentConfirmations/paymentConfirmations.queries.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; -import { PaymentConfirmationsApi } from "./paymentConfirmations.api"; - -export namespace PaymentConfirmationsQueries { -export const moduleName = QueryModule.PaymentConfirmations; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", officeId, filter, limit, order, page, cursor] as const, - getInfinite: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", "infinite", officeId, filter, limit, order, cursor] as const, -}; - -/** - * Query `useGet` - * @summary Get payment confirmation items - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, filter, limit, order, page, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, filter, limit, order, page, cursor), - queryFn: () => { - checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useGetInfinite - * @summary Get payment confirmation items - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetInfinite = ({ officeId, filter, limit, order, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useGenerate` - recommended when file should not be cached - * @summary Generate payment confirmation PDF - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId } )); - return PaymentConfirmationsApi.generate(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGetEml` - recommended when file should not be cached - * @summary Get payment confirmation as EML file with PDF attachment - * @permission Requires `canUseGetEml` ability - * @param { string } mutation.officeId Path parameter - * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId } )); - return PaymentConfirmationsApi.getEml(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/ports/ports.acl.ts b/test/generated/full/ports/ports.acl.ts deleted file mode 100644 index 9332110..0000000 --- a/test/generated/full/ports/ports.acl.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PortsAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Port" -] as AbilityTuple<"Read", "Port">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Port" -] as AbilityTuple<"Create", "Port">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Port" -] as AbilityTuple<"Read", "Port">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Port" -] as AbilityTuple<"Update", "Port">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Port" -] as AbilityTuple<"Read", "Port">; - -} diff --git a/test/generated/full/ports/ports.api.ts b/test/generated/full/ports/ports.api.ts deleted file mode 100644 index 413f9ec..0000000 --- a/test/generated/full/ports/ports.api.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PortsModels } from "./ports.models"; - -export namespace PortsApi { -export const paginate = (limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PortsModels.PortsPaginateResponseSchema }, - `/ports`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: PortsModels.CreatePortRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports`, - ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), - config - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, - `/ports/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports/${id}`, - ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), - config - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports/${id}`, - config - ) -}; -} diff --git a/test/generated/full/ports/ports.configs.ts b/test/generated/full/ports/ports.configs.ts deleted file mode 100644 index 33adfc6..0000000 --- a/test/generated/full/ports/ports.configs.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PortsModels } from "./ports.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PortsQueries } from "./ports.queries"; -import { PortsAcl } from "./ports.acl"; - -export namespace PortsConfigs { -export const portsConfig = { - meta: { - title: "Ports", - }, - readAll: { - acl: PortsAcl.canUsePaginate, - schema: PortsModels.PortResponseDTOSchema, - paginated: PortsQueries.usePaginate, - infinite: PortsQueries.usePaginateInfinite, - filters: { - schema: PortsModels.PortPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PortsModels.PortPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PortsModels.PortResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - address: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PortsModels.PortsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PortsAcl.canUseFindById, - schema: PortsModels.PortResponseDTOSchema, - query: PortsQueries.useFindById, - }, - create: { - acl: PortsAcl.canUseCreate, - schema: PortsModels.CreatePortRequestDTOSchema, - mutation: PortsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PortsModels.CreatePortRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, - update: { - acl: PortsAcl.canUseUpdate, - schema: PortsModels.UpdatePortRequestDTOSchema, - mutation: PortsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PortsModels.UpdatePortRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: PortsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PortsQueries.usePaginateLabels, - infinite: PortsQueries.usePaginateLabelsInfinite, - filters: { - schema: PortsModels.PortLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PortsModels.PortLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PortsModels.PortsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/ports/ports.models.ts b/test/generated/full/ports/ports.models.ts deleted file mode 100644 index 7bb660d..0000000 --- a/test/generated/full/ports/ports.models.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PortsModels { -/** - * PortCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PortCityDto = z.infer; - -/** - * PortCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const PortCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); -export type PortCountryDto = z.infer; - -/** - * PortAddressDtoSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { PortCityDto } city - * @property { string } district District name - * @property { PortCountryDto } country - */ -export const PortAddressDtoSchema = z.object({ street: z.string().describe("Street address"), zip: z.string().describe("ZIP/Postal code"), city: PortCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: PortCountryDtoSchema.nullish() }).readonly(); -export type PortAddressDto = z.infer; - -/** - * PortEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type PortEmployeeDTO = z.infer; - -/** - * PortResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the port - * @property { string } name Name of the port - * @property { string } matchCode Match code for the port - * @property { PortAddressDto } address Address details of the port - * @property { string } createdById - * @property { PortEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PortEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const PortResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port"), matchCode: z.string().describe("Match code for the port"), address: PortAddressDtoSchema.describe("Address details of the port"), createdById: z.string().nullish(), createdBy: PortEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PortEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type PortResponseDTO = z.infer; - -/** - * PortPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter ports by name or match code - */ -export const PortPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter ports by name or match code") }).readonly(); -export type PortPaginationFilterDto = z.infer; - -/** - * PortLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const PortLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type PortLabelFilterDto = z.infer; - -/** - * CreatePortRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } matchCode - * @property { string } street Street address - * @property { string } secondaryStreet - * @property { string } zip ZIP / Postal code - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } district - */ -export const CreatePortRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), street: z.string().describe("Street address"), secondaryStreet: z.string().nullish(), zip: z.string().describe("ZIP / Postal code"), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), district: z.string().nullish() }).readonly(); -export type CreatePortRequestDTO = z.infer; - -/** - * UpdatePortRequestDTOSchema - * @type { object } - * @property { string } name Updated name - * @property { string } matchCode Updated match code - * @property { string } street Updated street address - * @property { string } secondaryStreet Updated secondary street - * @property { string } zip Updated ZIP/Postal code - * @property { string } cityId Updated city id - * @property { string } countryId Updated country id - * @property { string } district - */ -export const UpdatePortRequestDTOSchema = z.object({ name: z.string().describe("Updated name"), matchCode: z.string().describe("Updated match code"), street: z.string().describe("Updated street address"), secondaryStreet: z.string().describe("Updated secondary street"), zip: z.string().describe("Updated ZIP/Postal code"), cityId: z.string().describe("Updated city id"), countryId: z.string().describe("Updated country id"), district: z.string() }).readonly(); -export type UpdatePortRequestDTO = z.infer; - -/** - * PortsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PortsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PortsPaginateOrderParamEnum = z.infer; -export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enum; - -/** - * PortsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PortResponseDTO[] } items - */ -export const PortsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PortResponseDTOSchema).readonly() }).readonly().shape }); -export type PortsPaginateResponse = z.infer; - -/** - * PortsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PortsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PortsPaginateLabelsOrderParamEnum = z.infer; -export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * PortsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PortsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type PortsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/ports/ports.queries.ts b/test/generated/full/ports/ports.queries.ts deleted file mode 100644 index 60aaca2..0000000 --- a/test/generated/full/ports/ports.queries.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PortsAcl } from "./ports.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PortsModels } from "./ports.models"; -import { PortsApi } from "./ports.api"; - -export namespace PortsQueries { -export const moduleName = QueryModule.Ports; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string) => [...keys.all, "/ports", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string) => [...keys.all, "/ports/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/ports/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Ports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Ports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create port - * @permission Requires `canUseCreate` ability - * @param { PortsModels.CreatePortRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PortsAcl.canUseCreate()); - return PortsApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate ports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate ports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update port - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PortsModels.UpdatePortRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PortsAcl.canUseUpdate()); - return PortsApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get port by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PortsAcl.canUseFindById()); - return PortsApi.findById(id, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/positionAccount/positionAccount.acl.ts b/test/generated/full/positionAccount/positionAccount.acl.ts deleted file mode 100644 index f887d12..0000000 --- a/test/generated/full/positionAccount/positionAccount.acl.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionAccountAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -} diff --git a/test/generated/full/positionAccount/positionAccount.api.ts b/test/generated/full/positionAccount/positionAccount.api.ts deleted file mode 100644 index 50e84d6..0000000 --- a/test/generated/full/positionAccount/positionAccount.api.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { PositionAccountModels } from "./positionAccount.models"; - -export namespace PositionAccountApi { -export const get = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/account`, - config - ) -}; -} diff --git a/test/generated/full/positionAccount/positionAccount.models.ts b/test/generated/full/positionAccount/positionAccount.models.ts deleted file mode 100644 index 192acb9..0000000 --- a/test/generated/full/positionAccount/positionAccount.models.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionAccountModels { -/** - * PositionAccountTotalsResponseDtoSchema - * @type { object } - * @property { number } totalBuyRates Total buy rates - * @property { number } totalSellRates Total sell rates - * @property { number } totalProfit Total profit - * @property { number } margin Margin percentage - * @property { number } displayAmount Display amount - * @property { string } displayCurrencyCode Display currency code - */ -export const PositionAccountTotalsResponseDtoSchema = z.object({ totalBuyRates: z.number().describe("Total buy rates"), totalSellRates: z.number().describe("Total sell rates"), totalProfit: z.number().describe("Total profit"), margin: z.number().describe("Margin percentage").nullish(), displayAmount: z.number().describe("Display amount"), displayCurrencyCode: z.string().describe("Display currency code") }).readonly(); -export type PositionAccountTotalsResponseDto = z.infer; - -/** - * PositionAccountMasterTotalsDtoSchema - * @type { object } - * @property { PositionAccountTotalsResponseDto } totals - * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency - */ -export const PositionAccountMasterTotalsDtoSchema = z.object({ totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly() }).readonly(); -export type PositionAccountMasterTotalsDto = z.infer; - -/** - * ChildPositionAccountReferenceDtoSchema - * @type { object } - * @property { string } positionId - * @property { string } positionNumber - * @property { string } accountId - */ -export const ChildPositionAccountReferenceDtoSchema = z.object({ positionId: z.string().nullish(), positionNumber: z.string(), accountId: z.string() }).readonly(); -export type ChildPositionAccountReferenceDto = z.infer; - -/** - * PositionAccountResponseDtoSchema - * @type { object } - * @property { string } id Account ID - * @property { string } positionId Position ID - * @property { string } invoiceId Invoice ID - * @property { CommonModels.PositionAccountItemDtoResponse[] } items Account items - * @property { PositionAccountTotalsResponseDto } totals - * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency - * @property { PositionAccountMasterTotalsDto } masterTotals - * @property { ChildPositionAccountReferenceDto[] } childPositionAccounts - */ -export const PositionAccountResponseDtoSchema = z.object({ id: z.string().describe("Account ID"), positionId: z.string().describe("Position ID").nullish(), invoiceId: z.string().describe("Invoice ID").nullish(), items: z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly().describe("Account items"), totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema).readonly(), masterTotals: PositionAccountMasterTotalsDtoSchema.nullish(), childPositionAccounts: z.array(ChildPositionAccountReferenceDtoSchema).readonly().nullish() }).readonly(); -export type PositionAccountResponseDto = z.infer; - -} diff --git a/test/generated/full/positionAccount/positionAccount.queries.ts b/test/generated/full/positionAccount/positionAccount.queries.ts deleted file mode 100644 index cb137f9..0000000 --- a/test/generated/full/positionAccount/positionAccount.queries.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionAccountAcl } from "./positionAccount.acl"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { PositionAccountApi } from "./positionAccount.api"; - -export namespace PositionAccountQueries { -export const moduleName = QueryModule.PositionAccount; - -export const keys = { - all: [moduleName] as const, - get: (positionId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account", positionId, officeId] as const, -}; - -/** - * Query `useGet` - * @summary Get position account details - * @permission Requires `canUseGet` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ positionId, officeId }: { positionId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(positionId, officeId), - queryFn: () => { - checkAcl(PositionAccountAcl.canUseGet({ officeId } )); - return PositionAccountApi.get(positionId, officeId, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/positionAccountItems/positionAccountItems.acl.ts b/test/generated/full/positionAccountItems/positionAccountItems.acl.ts deleted file mode 100644 index 8f2be12..0000000 --- a/test/generated/full/positionAccountItems/positionAccountItems.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionAccountItemsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useDeletePositionAccountItems` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePositionAccountItems` mutation - */ -export const canUseDeletePositionAccountItems = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ -export const canUseDuplicate = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useReassign` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReassign` mutation - */ -export const canUseReassign = ( - object?: { officeId: string, } -) => [ - "Reassign", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useReorder` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation - */ -export const canUseReorder = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -} diff --git a/test/generated/full/positionAccountItems/positionAccountItems.api.ts b/test/generated/full/positionAccountItems/positionAccountItems.api.ts deleted file mode 100644 index 3813a9b..0000000 --- a/test/generated/full/positionAccountItems/positionAccountItems.api.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionAccountItemsModels } from "./positionAccountItems.models"; - -export namespace PositionAccountItemsApi { -export const create = (positionId: string, officeId: string, data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), - config - ) -}; -export const deletePositionAccountItems = (positionId: string, officeId: string, data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), - config - ) -}; -export const update = (positionId: string, officeId: string, data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), - config - ) -}; -export const duplicate = (positionId: string, officeId: string, data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, - ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), - config - ) -}; -export const reassign = (positionId: string, officeId: string, data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items/reassign`, - ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), - config - ) -}; -export const reorder = (positionId: string, itemId: string, officeId: string, data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, - ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/positionAccountItems/positionAccountItems.models.ts b/test/generated/full/positionAccountItems/positionAccountItems.models.ts deleted file mode 100644 index 3ed5734..0000000 --- a/test/generated/full/positionAccountItems/positionAccountItems.models.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionAccountItemsModels { -/** - * CreatePositionChargeDataRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const CreatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount"), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount"), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); -export type CreatePositionChargeDataRequestDto = z.infer; - -/** - * CreatePositionTextDataRequestDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const CreatePositionTextDataRequestDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); -export type CreatePositionTextDataRequestDto = z.infer; - -/** - * CreatePositionAccountItemRequestDtoSchema - * @type { object } - * @property { CommonModels.PositionAccountItemTypeEnum } type Item type - * @property { CreatePositionChargeDataRequestDto } charge Charge data if type is CHARGE - * @property { CreatePositionTextDataRequestDto } text Text data if type is TEXT - */ -export const CreatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), charge: CreatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), text: CreatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish() }).readonly(); -export type CreatePositionAccountItemRequestDto = z.infer; - -/** - * CreatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { CreatePositionAccountItemRequestDto[] } items Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER) - */ -export const CreatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(CreatePositionAccountItemRequestDtoSchema).readonly().describe("Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER)") }).readonly(); -export type CreatePositionAccountItemsRequestDto = z.infer; - -/** - * UpdatePositionChargeDataRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const UpdatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount").nullable(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount").nullable(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); -export type UpdatePositionChargeDataRequestDto = z.infer; - -/** - * UpdatePositionTextDataRequestDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const UpdatePositionTextDataRequestDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); -export type UpdatePositionTextDataRequestDto = z.infer; - -/** - * UpdatePositionAccountItemRequestDtoSchema - * @type { object } - * @property { CommonModels.PositionAccountItemTypeEnum } type Item type - * @property { UpdatePositionChargeDataRequestDto } charge Charge data if type is CHARGE - * @property { UpdatePositionTextDataRequestDto } text Text data if type is TEXT - */ -export const UpdatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema.describe("Item type"), charge: UpdatePositionChargeDataRequestDtoSchema.describe("Charge data if type is CHARGE").nullish(), text: UpdatePositionTextDataRequestDtoSchema.describe("Text data if type is TEXT").nullish() }).readonly(); -export type UpdatePositionAccountItemRequestDto = z.infer; - -/** - * UpdatePositionAccountItemWithIdRequestDtoSchema - * @type { object } - * @property { string } id ID of the item to update - * @property { UpdatePositionAccountItemRequestDto } data Data to update - */ -export const UpdatePositionAccountItemWithIdRequestDtoSchema = z.object({ id: z.string().describe("ID of the item to update"), data: UpdatePositionAccountItemRequestDtoSchema.describe("Data to update") }).readonly(); -export type UpdatePositionAccountItemWithIdRequestDto = z.infer; - -/** - * UpdatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { UpdatePositionAccountItemWithIdRequestDto[] } items Array of items to update - */ -export const UpdatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(UpdatePositionAccountItemWithIdRequestDtoSchema).readonly().describe("Array of items to update") }).readonly(); -export type UpdatePositionAccountItemsRequestDto = z.infer; - -/** - * DeletePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to delete - */ -export const DeletePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to delete") }).readonly(); -export type DeletePositionAccountItemsRequestDto = z.infer; - -/** - * DuplicatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to duplicate - */ -export const DuplicatePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to duplicate") }).readonly(); -export type DuplicatePositionAccountItemsRequestDto = z.infer; - -/** - * ReassignPositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to reassign - * @property { string } targetPositionId Target position ID to reassign items to - */ -export const ReassignPositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()).readonly().describe("Array of item IDs to reassign"), targetPositionId: z.string().describe("Target position ID to reassign items to") }).readonly(); -export type ReassignPositionAccountItemsRequestDto = z.infer; - -/** - * ReorderPositionAccountItemRequestDtoSchema - * @type { object } - * @property { number } orderPosition New order position for the item - */ -export const ReorderPositionAccountItemRequestDtoSchema = z.object({ orderPosition: z.number().describe("New order position for the item") }).readonly(); -export type ReorderPositionAccountItemRequestDto = z.infer; - -/** - * PositionAccountItemsCreateResponseSchema - * @type { array } - */ -export const PositionAccountItemsCreateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); -export type PositionAccountItemsCreateResponse = z.infer; - -/** - * PositionAccountItemsUpdateResponseSchema - * @type { array } - */ -export const PositionAccountItemsUpdateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); -export type PositionAccountItemsUpdateResponse = z.infer; - -/** - * PositionAccountItemsDuplicateResponseSchema - * @type { array } - */ -export const PositionAccountItemsDuplicateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); -export type PositionAccountItemsDuplicateResponse = z.infer; - -/** - * ReassignResponseSchema - * @type { array } - */ -export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema).readonly(); -export type ReassignResponse = z.infer; - -} diff --git a/test/generated/full/positionAccountItems/positionAccountItems.queries.ts b/test/generated/full/positionAccountItems/positionAccountItems.queries.ts deleted file mode 100644 index 25c26e1..0000000 --- a/test/generated/full/positionAccountItems/positionAccountItems.queries.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionAccountItemsAcl } from "./positionAccountItems.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionAccountItemsModels } from "./positionAccountItems.models"; -import { PositionAccountItemsApi } from "./positionAccountItems.api"; - -export namespace PositionAccountItemsQueries { -export const moduleName = QueryModule.PositionAccountItems; - - - -/** - * Mutation `useCreate` - * @summary Create position account items (bulk) - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId } )); - return PositionAccountItemsApi.create(positionId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePositionAccountItems` - * @summary Delete position account items (bulk) - * @permission Requires `canUseDeletePositionAccountItems` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeletePositionAccountItems = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId } )); - return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update position account items (bulk) - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId } )); - return PositionAccountItemsApi.update(positionId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicate` - * @summary Duplicate position account items (bulk) - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId } )); - return PositionAccountItemsApi.duplicate(positionId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReassign` - * @summary Reassign position account items to another position (bulk) - * @permission Requires `canUseReassign` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReassign = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId } )); - return PositionAccountItemsApi.reassign(positionId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReorder` - * @summary Reorder position account item - * @permission Requires `canUseReorder` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.ReorderPositionAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, itemId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId } )); - return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/positionCargo/positionCargo.acl.ts b/test/generated/full/positionCargo/positionCargo.acl.ts deleted file mode 100644 index f62ee50..0000000 --- a/test/generated/full/positionCargo/positionCargo.acl.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionCargoAcl { -/** - * Use for `useListCargosByPositionId` query ability. For global ability, omit the object parameter. - * @description List cargo items by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByPositionId` query - */ -export const canUseListCargosByPositionId = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useCreateCargo` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCargo` mutation - */ -export const canUseCreateCargo = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. - * @description List cargo labels by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query - */ -export const canUseListCargoLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. - * @description Get cargo summary by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query - */ -export const canUseGetCargoSummary = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. - * @description Get cargo item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query - */ -export const canUseGetCargoById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. - * @description Update cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation - */ -export const canUseUpdateCargo = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation - */ -export const canUseDeleteCargo = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation - */ -export const canUseCreateBulkCargos = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation - */ -export const canUseDuplicateCargo = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/full/positionCargo/positionCargo.api.ts b/test/generated/full/positionCargo/positionCargo.api.ts deleted file mode 100644 index e65a328..0000000 --- a/test/generated/full/positionCargo/positionCargo.api.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionCargoModels } from "./positionCargo.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoApi { -export const listCargosByPositionId = (officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos`, - { - ...config, - params: { - order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createCargo = (officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config - ) -}; -export const listCargoLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/labels`, - config - ) -}; -export const getCargoSummary = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/summary`, - config - ) -}; -export const getCargoById = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - config - ) -}; -export const updateCargo = (officeId: string, positionId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - config - ) -}; -export const deleteCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - undefined, - config - ) -}; -export const createBulkCargos = (numberOfCargos: number, officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config - ) -}; -export const duplicateCargo = (officeId: string, positionId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/positionCargo/positionCargo.configs.ts b/test/generated/full/positionCargo/positionCargo.configs.ts deleted file mode 100644 index a62c692..0000000 --- a/test/generated/full/positionCargo/positionCargo.configs.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoQueries } from "./positionCargo.queries"; -import { PositionCargoAcl } from "./positionCargo.acl"; - -export namespace PositionCargoConfigs { -export const cargosConfig = { - meta: { - title: "Cargos", - }, - readAll: { - acl: PositionCargoAcl.canUseListCargosByPositionId, - schema: CommonModels.PositionCargoResponseDTOSchema, - paginated: PositionCargoQueries.useListCargosByPositionId, - infinite: PositionCargoQueries.useListCargosByPositionIdInfinite, - columns: dynamicColumns({ - schema: CommonModels.PositionCargoResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - quoteId: true, - rootFolderId: true, - cargoType: true, - autoCalculateTotals: true, - autoCalculateRates: true, - autoCalculateVgm: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - rateOptions: true, - rateClass: true, - textForCustoms: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - ratePerKg: true, - totalRate: true, - tare: true, - vgm: true, - hsCodeLabels: true, - note: true, - packages: true, - createdAt: true, - updatedAt: true, - completeWeight: true, - packageTotals: true, - }, - }, -}), - }, - read: { - acl: PositionCargoAcl.canUseGetCargoById, - schema: CommonModels.PositionCargoResponseDTOSchema, - query: PositionCargoQueries.useGetCargoById, - }, - create: { - acl: PositionCargoAcl.canUseCreateCargo, - schema: CommonModels.CreatePositionCargoDTOSchema, - mutation: PositionCargoQueries.useCreateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.CreatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, -}) - }, - update: { - acl: PositionCargoAcl.canUseUpdateCargo, - schema: CommonModels.UpdatePositionCargoDTOSchema, - mutation: PositionCargoQueries.useUpdateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.UpdatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, -}) - }, - delete: { - acl: PositionCargoAcl.canUseDeleteCargo, - mutation: PositionCargoQueries.useDeleteCargo, - }, -}; - -} diff --git a/test/generated/full/positionCargo/positionCargo.models.ts b/test/generated/full/positionCargo/positionCargo.models.ts deleted file mode 100644 index 1e3b8cc..0000000 --- a/test/generated/full/positionCargo/positionCargo.models.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoModels { -/** - * ListCargosByPositionIdOrderParamSchema - * @type { array } - * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - */ -export const ListCargosByPositionIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).readonly().describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt").nullish(); -export type ListCargosByPositionIdOrderParam = z.infer; - -/** - * ListCargosByPositionIdResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.PositionCargoResponseDTO[] } items - */ -export const ListCargosByPositionIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape }); -export type ListCargosByPositionIdResponse = z.infer; - -/** - * PositionCargoListCargoLabelsResponseSchema - * @type { array } - */ -export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); -export type PositionCargoListCargoLabelsResponse = z.infer; - -/** - * PositionCargoGetCargoSummaryResponseSchema - * @type { array } - */ -export const PositionCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); -export type PositionCargoGetCargoSummaryResponse = z.infer; - -/** - * PositionCargoCreateBulkCargosResponseSchema - * @type { array } - */ -export const PositionCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema).readonly(); -export type PositionCargoCreateBulkCargosResponse = z.infer; - -} diff --git a/test/generated/full/positionCargo/positionCargo.queries.ts b/test/generated/full/positionCargo/positionCargo.queries.ts deleted file mode 100644 index bc814ea..0000000 --- a/test/generated/full/positionCargo/positionCargo.queries.ts +++ /dev/null @@ -1,294 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionCargoAcl } from "./positionCargo.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionCargoModels } from "./positionCargo.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoApi } from "./positionCargo.api"; - -export namespace PositionCargoQueries { -export const moduleName = QueryModule.PositionCargo; - -export const keys = { - all: [moduleName] as const, - listCargosByPositionId: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", officeId, positionId, limit, order, page, cursor] as const, - listCargosByPositionIdInfinite: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", "infinite", officeId, positionId, limit, order, cursor] as const, - listCargoLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/labels", officeId, positionId] as const, - getCargoSummary: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/summary", officeId, positionId] as const, - getCargoById: (officeId: string, positionId: string, cargoId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/:cargoId", officeId, positionId, cargoId] as const, -}; - -/** - * Query `useListCargosByPositionId` - * @summary List all cargo items for a position - * @permission Requires `canUseListCargosByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByPositionId = ({ officeId, positionId, limit, order, page, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListCargosByPositionIdInfinite - * @summary List all cargo items for a position - * @permission Requires `canUseListCargosByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByPositionIdInfinite = ({ officeId, positionId, limit, order, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateCargo` - * @summary Create a new cargo item - * @permission Requires `canUseCreateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId } )); - return PositionCargoApi.createCargo(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListCargoLabels` - * @summary List all cargo labels for a position - * @permission Requires `canUseListCargoLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargoLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargoLabels(officeId, positionId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId } )); - return PositionCargoApi.listCargoLabels(officeId, positionId, config) }, - ...options, - }); -}; - -/** - * Query `useGetCargoSummary` - * @summary Get cargo summary grouped by transport unit type - * @permission Requires `canUseGetCargoSummary` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoSummary = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoSummary(officeId, positionId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId } )); - return PositionCargoApi.getCargoSummary(officeId, positionId, config) }, - ...options, - }); -}; - -/** - * Query `useGetCargoById` - * @summary Get a specific cargo item - * @permission Requires `canUseGetCargoById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.cargoId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoById = ({ officeId, positionId, cargoId }: { officeId: string, positionId: string, cargoId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoById(officeId, positionId, cargoId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId } )); - return PositionCargoApi.getCargoById(officeId, positionId, cargoId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCargo` - * @summary Update a cargo item - * @permission Requires `canUseUpdateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, data }) => { - checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId } )); - return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteCargo` - * @summary Delete a cargo item - * @permission Requires `canUseDeleteCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId }) => { - checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId } )); - return PositionCargoApi.deleteCargo(officeId, positionId, cargoId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateBulkCargos` - * @summary Create a new cargo item - * @permission Requires `canUseCreateBulkCargos` ability - * @param { number } mutation.numberOfCargos Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { - checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId } )); - return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicateCargo` - * @summary Duplicate a cargo item - * @permission Requires `canUseDuplicateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId }) => { - checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId } )); - return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/positionCargoPackage/positionCargoPackage.acl.ts b/test/generated/full/positionCargoPackage/positionCargoPackage.acl.ts deleted file mode 100644 index 552d48c..0000000 --- a/test/generated/full/positionCargoPackage/positionCargoPackage.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionCargoPackageAcl { -/** - * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. - * @description Create cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation - */ -export const canUseCreatePackage = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. - * @description Update cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation - */ -export const canUseUpdatePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation - */ -export const canUseDeletePackage = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation - */ -export const canUseDuplicatePackage = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. - * @description Move cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation - */ -export const canUseMovePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/full/positionCargoPackage/positionCargoPackage.api.ts b/test/generated/full/positionCargoPackage/positionCargoPackage.api.ts deleted file mode 100644 index bc571c0..0000000 --- a/test/generated/full/positionCargoPackage/positionCargoPackage.api.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoPackageApi { -export const createPackage = (officeId: string, positionId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, - ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - config - ) -}; -export const updatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - config - ) -}; -export const deletePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - undefined, - config - ) -}; -export const duplicatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - undefined, - config - ) -}; -export const movePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, - ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/positionCargoPackage/positionCargoPackage.queries.ts b/test/generated/full/positionCargoPackage/positionCargoPackage.queries.ts deleted file mode 100644 index fc8a8bd..0000000 --- a/test/generated/full/positionCargoPackage/positionCargoPackage.queries.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionCargoPackageAcl } from "./positionCargoPackage.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoPackageApi } from "./positionCargoPackage.api"; - -export namespace PositionCargoPackageQueries { -export const moduleName = QueryModule.PositionCargoPackage; - - - -/** - * Mutation `useCreatePackage` - * @summary Create a new package for a cargo - * @permission Requires `canUseCreatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId } )); - return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdatePackage` - * @summary Update a package - * @permission Requires `canUseUpdatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId } )); - return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePackage` - * @summary Delete a package - * @permission Requires `canUseDeletePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId }) => { - checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId } )); - return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicatePackage` - * @summary Duplicate a package - * @permission Requires `canUseDuplicatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId }) => { - checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId } )); - return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMovePackage` - * @summary Move a package to a different cargo - * @permission Requires `canUseMovePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId } )); - return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/positionChecklist/positionChecklist.acl.ts b/test/generated/full/positionChecklist/positionChecklist.acl.ts deleted file mode 100644 index 1f8dfca..0000000 --- a/test/generated/full/positionChecklist/positionChecklist.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionChecklistAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List checklist items for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useApplyTemplates` mutation ability. For global ability, omit the object parameter. - * @description Apply checklist templates to position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useApplyTemplates` mutation - */ -export const canUseApplyTemplates = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useComplete` mutation ability. For global ability, omit the object parameter. - * @description Complete position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useComplete` mutation - */ -export const canUseComplete = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUncomplete` mutation ability. For global ability, omit the object parameter. - * @description Uncomplete position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUncomplete` mutation - */ -export const canUseUncomplete = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdateNotes` mutation ability. For global ability, omit the object parameter. - * @description Update position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateNotes` mutation - */ -export const canUseUpdateNotes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useReorder` mutation ability. For global ability, omit the object parameter. - * @description Reorder position checklist items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation - */ -export const canUseReorder = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/full/positionChecklist/positionChecklist.api.ts b/test/generated/full/positionChecklist/positionChecklist.api.ts deleted file mode 100644 index ff7bf54..0000000 --- a/test/generated/full/positionChecklist/positionChecklist.api.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionChecklistModels } from "./positionChecklist.models"; - -export namespace PositionChecklistApi { -export const list = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist`, - config - ) -}; -export const applyTemplates = (officeId: string, positionId: string, data: PositionChecklistModels.ApplyTemplatesRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, - ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), - config - ) -}; -export const complete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, - undefined, - config - ) -}; -export const uncomplete = (officeId: string, positionId: string, itemId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, - undefined, - config - ) -}; -export const updateNotes = (officeId: string, positionId: string, itemId: string, data: PositionChecklistModels.UpdatePositionChecklistItemDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, - ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), - config - ) -}; -export const reorder = (officeId: string, positionId: string, data: PositionChecklistModels.ReorderPositionChecklistDto, config?: AxiosRequestConfig) => { - return AppRestClient.put( - { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/reorder`, - ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/positionChecklist/positionChecklist.models.ts b/test/generated/full/positionChecklist/positionChecklist.models.ts deleted file mode 100644 index 55eb2b7..0000000 --- a/test/generated/full/positionChecklist/positionChecklist.models.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { z } from "zod"; - -export namespace PositionChecklistModels { -/** - * PositionChecklistCompletedByResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionChecklistCompletedByResponseDtoSchema = z.object({ id: z.string(), name: z.string().nullable() }).readonly(); -export type PositionChecklistCompletedByResponseDto = z.infer; - -/** - * PositionChecklistItemResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } checklistItemId - * @property { string } templateId - * @property { number } order - * @property { boolean } completed - * @property { string } completedAt - * @property { PositionChecklistCompletedByResponseDto } completedBy - * @property { string } notes - * @property { string } name - */ -export const PositionChecklistItemResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), checklistItemId: z.string(), templateId: z.string().nullable(), order: z.number(), completed: z.boolean(), completedAt: z.iso.datetime({ offset: true }).nullable(), completedBy: PositionChecklistCompletedByResponseDtoSchema.nullable(), notes: z.string().nullable(), name: z.string().nullable() }).readonly(); -export type PositionChecklistItemResponseDto = z.infer; - -/** - * PositionChecklistResponseDtoSchema - * @type { object } - * @property { PositionChecklistItemResponseDto[] } items - * @property { string[] } appliedTemplateIds - */ -export const PositionChecklistResponseDtoSchema = z.object({ items: z.array(PositionChecklistItemResponseDtoSchema).readonly(), appliedTemplateIds: z.array(z.string()).readonly() }).readonly(); -export type PositionChecklistResponseDto = z.infer; - -/** - * ApplyTemplatesRequestDtoSchema - * @type { object } - * @property { string[] } templateIds - */ -export const ApplyTemplatesRequestDtoSchema = z.object({ templateIds: z.array(z.string()).readonly() }).readonly(); -export type ApplyTemplatesRequestDto = z.infer; - -/** - * UpdatePositionChecklistItemDtoSchema - * @type { object } - * @property { string } notes Max Length: `512` - */ -export const UpdatePositionChecklistItemDtoSchema = z.object({ notes: z.string().max(512) }).readonly(); -export type UpdatePositionChecklistItemDto = z.infer; - -/** - * ReorderPositionChecklistDtoSchema - * @type { object } - * @property { string[] } itemIds - */ -export const ReorderPositionChecklistDtoSchema = z.object({ itemIds: z.array(z.string()).readonly() }).readonly(); -export type ReorderPositionChecklistDto = z.infer; - -/** - * ApplyTemplatesResponseSchema - * @type { array } - */ -export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); -export type ApplyTemplatesResponse = z.infer; - -/** - * PositionChecklistReorderResponseSchema - * @type { array } - */ -export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema).readonly(); -export type PositionChecklistReorderResponse = z.infer; - -} diff --git a/test/generated/full/positionChecklist/positionChecklist.queries.ts b/test/generated/full/positionChecklist/positionChecklist.queries.ts deleted file mode 100644 index 77020bb..0000000 --- a/test/generated/full/positionChecklist/positionChecklist.queries.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionChecklistAcl } from "./positionChecklist.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionChecklistModels } from "./positionChecklist.models"; -import { PositionChecklistApi } from "./positionChecklist.api"; - -export namespace PositionChecklistQueries { -export const moduleName = QueryModule.PositionChecklist; - -export const keys = { - all: [moduleName] as const, - list: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/checklist", officeId, positionId] as const, -}; - -/** - * Query `useList` - * @summary Get position checklist items - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, positionId), - queryFn: () => { - checkAcl(PositionChecklistAcl.canUseList({ officeId } )); - return PositionChecklistApi.list(officeId, positionId, config) }, - ...options, - }); -}; - -/** - * Mutation `useApplyTemplates` - * @summary Apply checklist templates to position - * @permission Requires `canUseApplyTemplates` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionChecklistModels.ApplyTemplatesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useApplyTemplates = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId } )); - return PositionChecklistApi.applyTemplates(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useComplete` - * @summary Complete a checklist item - * @permission Requires `canUseComplete` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useComplete = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId }) => { - checkAcl(PositionChecklistAcl.canUseComplete({ officeId } )); - return PositionChecklistApi.complete(officeId, positionId, itemId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUncomplete` - * @summary Mark checklist item as not completed - * @permission Requires `canUseUncomplete` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUncomplete = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId }) => { - checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId } )); - return PositionChecklistApi.uncomplete(officeId, positionId, itemId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateNotes` - * @summary Update checklist item notes - * @permission Requires `canUseUpdateNotes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { PositionChecklistModels.UpdatePositionChecklistItemDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateNotes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId, data }) => { - checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId } )); - return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReorder` - * @summary Reorder checklist items - * @permission Requires `canUseReorder` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionChecklistModels.ReorderPositionChecklistDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionChecklistAcl.canUseReorder({ officeId } )); - return PositionChecklistApi.reorder(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/positionInvolvedParties/positionInvolvedParties.acl.ts b/test/generated/full/positionInvolvedParties/positionInvolvedParties.acl.ts deleted file mode 100644 index 8215460..0000000 --- a/test/generated/full/positionInvolvedParties/positionInvolvedParties.acl.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionInvolvedPartiesAcl { -/** - * Use for `useFindByPositionId` query ability. For global ability, omit the object parameter. - * @description List position involved parties - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByPositionId` query - */ -export const canUseFindByPositionId = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation ability. For global ability, omit the object parameter. - * @description Delete position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation - */ -export const canUseDeleteOfficesPositionsInvolvedPartiesByPartyId = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/full/positionInvolvedParties/positionInvolvedParties.api.ts b/test/generated/full/positionInvolvedParties/positionInvolvedParties.api.ts deleted file mode 100644 index a99a8f4..0000000 --- a/test/generated/full/positionInvolvedParties/positionInvolvedParties.api.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionInvolvedPartiesModels } from "./positionInvolvedParties.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionInvolvedPartiesApi { -export const findByPositionId = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties`, - config - ) -}; -export const create = (officeId: string, positionId: string, data: CommonModels.CreateInvolvedPartyRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties`, - ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - config - ) -}; -export const update = (officeId: string, positionId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - config - ) -}; -export const deleteOfficesPositionsInvolvedPartiesByPartyId = (officeId: string, positionId: string, partyId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/positionInvolvedParties/positionInvolvedParties.models.ts b/test/generated/full/positionInvolvedParties/positionInvolvedParties.models.ts deleted file mode 100644 index eaa5fc6..0000000 --- a/test/generated/full/positionInvolvedParties/positionInvolvedParties.models.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionInvolvedPartiesModels { -/** - * FindByPositionIdResponseSchema - * @type { array } - */ -export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); -export type FindByPositionIdResponse = z.infer; - -} diff --git a/test/generated/full/positionInvolvedParties/positionInvolvedParties.queries.ts b/test/generated/full/positionInvolvedParties/positionInvolvedParties.queries.ts deleted file mode 100644 index 0190d0e..0000000 --- a/test/generated/full/positionInvolvedParties/positionInvolvedParties.queries.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionInvolvedPartiesAcl } from "./positionInvolvedParties.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionInvolvedPartiesApi } from "./positionInvolvedParties.api"; - -export namespace PositionInvolvedPartiesQueries { -export const moduleName = QueryModule.PositionInvolvedParties; - -export const keys = { - all: [moduleName] as const, - findByPositionId: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/involved-parties", officeId, positionId] as const, -}; - -/** - * Query `useFindByPositionId` - * @summary List position involved parties - * @permission Requires `canUseFindByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindByPositionId = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findByPositionId(officeId, positionId), - queryFn: () => { - checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId } )); - return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId, config) }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create position involved party - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId } )); - return PositionInvolvedPartiesApi.create(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update position involved party - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, partyId, data }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId } )); - return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteOfficesPositionsInvolvedPartiesByPartyId` - * @summary Delete position involved party - * @permission Requires `canUseDeleteOfficesPositionsInvolvedPartiesByPartyId` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, partyId }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId } )); - return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId(officeId, positionId, partyId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts deleted file mode 100644 index 41a91df..0000000 --- a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionProfitChangeTrackingAcl { -/** - * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. - * @description List position profit change groups - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.positionId positionId from positionId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query - */ -export const canUseFindProfitChangeGroups = ( - object?: { officeId: string, positionId: string, } -) => [ - "Read", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; - -/** - * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. - * @description Get position profit change group details - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.positionId positionId from positionId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query - */ -export const canUseFindProfitChangeGroupDetail = ( - object?: { officeId: string, positionId: string, } -) => [ - "Read", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; - -} diff --git a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.api.ts b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.api.ts deleted file mode 100644 index a516599..0000000 --- a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.api.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; - -export namespace PositionProfitChangeTrackingApi { -export const findProfitChangeGroups = (officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findProfitChangeGroupDetail = (groupId: string, officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, - `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, - config - ) -}; -} diff --git a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts deleted file mode 100644 index a7c8680..0000000 --- a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; -import { PositionProfitChangeTrackingQueries } from "./positionProfitChangeTracking.queries"; -import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; - -export namespace PositionProfitChangeTrackingConfigs { -export const profitChangeGroupsConfig = { - meta: { - title: "Profit Change Groups", - }, - readAll: { - acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups, - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, - paginated: PositionProfitChangeTrackingQueries.useFindProfitChangeGroups, - infinite: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, - filters: { - schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, - options: { - inputs: { - userId: true, - dateFrom: true, - dateTo: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, - options: { - columns: { - id: true, - timestamp: true, - users: true, - profit: true, - changeCount: true, - }, - sortable: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema, - query: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, - }, -}; - -} diff --git a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.models.ts b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.models.ts deleted file mode 100644 index f4040ce..0000000 --- a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.models.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionProfitChangeTrackingModels { -/** - * PositionAccountProfitChangeGroupDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto[] } users - * @property { object } profit - * @property { number } profit.amount - * @property { string } profit.currencyCode - * @property { number } changeCount - */ -export const PositionAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), changeCount: z.number() }).readonly(); -export type PositionAccountProfitChangeGroupDto = z.infer; - -/** - * PositionAccountProfitChangeEntryDtoSchema - * @type { object } - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto } user - * @property { number } changeNumber - * @property { number } oldProfit - * @property { number } newProfit - * @property { string } currencyCode - */ -export const PositionAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }).readonly(); -export type PositionAccountProfitChangeEntryDto = z.infer; - -/** - * PositionAccountProfitChangeGroupDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { string } currencyCode - * @property { PositionAccountProfitChangeEntryDto[] } entries - */ -export const PositionAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(PositionAccountProfitChangeEntryDtoSchema).readonly() }).readonly(); -export type PositionAccountProfitChangeGroupDetailDto = z.infer; - -/** - * PositionProfitChangeTrackingFilterDtoSchema - * @type { object } - * @property { string } userId User IDs who made the changes - * @property { string } dateFrom Date range start - * @property { string } dateTo Date range end - */ -export const PositionProfitChangeTrackingFilterDtoSchema = z.object({ userId: z.string().describe("User IDs who made the changes"), dateFrom: z.string().describe("Date range start"), dateTo: z.string().describe("Date range end") }).readonly(); -export type PositionProfitChangeTrackingFilterDto = z.infer; - -/** - * PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema - * @type { enum } - */ -export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema = z.enum(["timestamp", "profitAmount", "changeCount"]); -export type PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = z.infer; -export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema.enum; - -/** - * PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionAccountProfitChangeGroupDto[] } items - */ -export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape }); -export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; - -} diff --git a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts b/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts deleted file mode 100644 index 71d116b..0000000 --- a/test/generated/full/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; -import { PositionProfitChangeTrackingApi } from "./positionProfitChangeTracking.api"; - -export namespace PositionProfitChangeTrackingQueries { -export const moduleName = QueryModule.PositionProfitChangeTracking; - -export const keys = { - all: [moduleName] as const, - findProfitChangeGroups: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", officeId, positionId, limit, order, filter, page, cursor] as const, - findProfitChangeGroupsInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", "infinite", officeId, positionId, limit, order, filter, cursor] as const, - findProfitChangeGroupDetail: (groupId: string, officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups/:groupId", groupId, officeId, positionId] as const, -}; - -/** - * Query `useFindProfitChangeGroups` - * @summary List position profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` - * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroups = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useFindProfitChangeGroupsInfinite - * @summary List position profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` - * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupsInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindProfitChangeGroupDetail` - * @summary Get position profit change group details - * @permission Requires `canUseFindProfitChangeGroupDetail` ability - * @param { string } object.groupId Path parameter - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupDetail = ({ groupId, officeId, positionId }: { groupId: string, officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), - queryFn: () => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/positionRoutes/positionRoutes.acl.ts b/test/generated/full/positionRoutes/positionRoutes.acl.ts deleted file mode 100644 index 7cd4cb8..0000000 --- a/test/generated/full/positionRoutes/positionRoutes.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionRoutesAcl { -/** - * Use for `useListRoutes` query ability. For global ability, omit the object parameter. - * @description List position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query - */ -export const canUseListRoutes = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Create position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation - */ -export const canUseCreateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Update position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation - */ -export const canUseUpdateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Delete position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation - */ -export const canUseDeleteRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. - * @description Split position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation - */ -export const canUseSplitRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. - * @description Merge position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation - */ -export const canUseMergeRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. - * @description Copy position route - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation - */ -export const canUseCopyRoute = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/full/positionRoutes/positionRoutes.api.ts b/test/generated/full/positionRoutes/positionRoutes.api.ts deleted file mode 100644 index 1e0faf5..0000000 --- a/test/generated/full/positionRoutes/positionRoutes.api.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionRoutesApi { -export const listRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.RouteListResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes`, - config - ) -}; -export const createRoutePoint = (officeId: string, positionId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, - ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - config - ) -}; -export const updateRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - config - ) -}; -export const deleteRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - undefined, - config - ) -}; -export const splitRoutes = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/split`, - undefined, - config - ) -}; -export const mergeRoutes = (officeId: string, positionId: string, data: CommonModels.MergeRoutesRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/merge`, - ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - config - ) -}; -export const copyRoute = (officeId: string, positionId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, - ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/positionRoutes/positionRoutes.queries.ts b/test/generated/full/positionRoutes/positionRoutes.queries.ts deleted file mode 100644 index 8d22b16..0000000 --- a/test/generated/full/positionRoutes/positionRoutes.queries.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionRoutesAcl } from "./positionRoutes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionRoutesApi } from "./positionRoutes.api"; - -export namespace PositionRoutesQueries { -export const moduleName = QueryModule.PositionRoutes; - -export const keys = { - all: [moduleName] as const, - listRoutes: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes", officeId, positionId] as const, -}; - -/** - * Query `useListRoutes` - * @summary List routes with points for a position (unified for sea/air/road) - * @permission Requires `canUseListRoutes` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoutes = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoutes(officeId, positionId), - queryFn: () => { - checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId } )); - return PositionRoutesApi.listRoutes(officeId, positionId, config) }, - ...options, - }); -}; - -/** - * Mutation `useCreateRoutePoint` - * @summary Create a route point - * @permission Requires `canUseCreateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, data }) => { - checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId } )); - return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateRoutePoint` - * @summary Update a route point - * @permission Requires `canUseUpdateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { - checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId } )); - return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRoutePoint` - * @summary Delete a route point - * @permission Requires `canUseDeleteRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, pointId }) => { - checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId } )); - return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useSplitRoutes` - * @summary Split routes by cargo (sea positions only) - * @permission Requires `canUseSplitRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId } )); - return PositionRoutesApi.splitRoutes(officeId, positionId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMergeRoutes` - * @summary Merge routes (sea positions only) - * @permission Requires `canUseMergeRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId } )); - return PositionRoutesApi.mergeRoutes(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopyRoute` - * @summary Copy route points to another route (sea positions only) - * @permission Requires `canUseCopyRoute` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, data }) => { - checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId } )); - return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/positions/positions.acl.ts b/test/generated/full/positions/positions.acl.ts deleted file mode 100644 index 002471f..0000000 --- a/test/generated/full/positions/positions.acl.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionsAcl { -/** - * Use for `useFindAll` query ability. For global ability, omit the object parameter. - * @description List position labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useTotalProfit` query ability. For global ability, omit the object parameter. - * @description Fake endpoint - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTotalProfit` query - */ -export const canUseTotalProfit = ( - object?: { officeId: string, } -) => [ - "TotalProfitView", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ -export const canUseListAvailablePartnersFor = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useExportPositions` mutation ability. For global ability, omit the object parameter. - * @description Export positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportPositions` mutation - */ -export const canUseExportPositions = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Export", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useListRouteLabels` query ability. For global ability, omit the object parameter. - * @description List route labels for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRouteLabels` query - */ -export const canUseListRouteLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useGetDuplicateDefaultParameters` query ability. For global ability, omit the object parameter. - * @description Read position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDuplicateDefaultParameters` query - */ -export const canUseGetDuplicateDefaultParameters = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ -export const canUseDuplicate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ -export const canUseCancel = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useRevertCancel` mutation ability. For global ability, omit the object parameter. - * @description Revert cancelled position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertCancel` mutation - */ -export const canUseRevertCancel = ( - object?: { officeId: string, } -) => [ - "RevertCancel", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useLinkChild` mutation ability. For global ability, omit the object parameter. - * @description Link positions to parent - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLinkChild` mutation - */ -export const canUseLinkChild = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUnlinkChild` mutation ability. For global ability, omit the object parameter. - * @description Link positions to parent - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlinkChild` mutation - */ -export const canUseUnlinkChild = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useListChild` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListChild` query - */ -export const canUseListChild = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/full/positions/positions.api.ts b/test/generated/full/positions/positions.api.ts deleted file mode 100644 index b990f57..0000000 --- a/test/generated/full/positions/positions.api.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionsApi { -export const findAll = (officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsFindAllResponseSchema }, - `/offices/${officeId}/positions/labels`, - { - ...config, - params: { - filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsPaginateResponseSchema }, - `/offices/${officeId}/positions`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: PositionsModels.CreatePositionRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions`, - ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), - config - ) -}; -export const totalProfit = (officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionsModels.TotalProfitResponseSchema }, - `/offices/${officeId}/positions/fake-total-profit`, - config - ) -}; -export const listAvailablePartnersFor = (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/positions/${positionId}/available-partners`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), - }, - } - ) -}; -export const exportPositions = (officeId: string, data: PositionsModels.PositionExportRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/exports`, - ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}`, - config - ) -}; -export const update = (officeId: string, positionId: string, data: PositionsModels.UpdatePositionDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}`, - ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), - config - ) -}; -export const listRouteLabels = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/routes/labels`, - config - ) -}; -export const getDuplicateDefaultParameters = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, - config - ) -}; -export const duplicate = (officeId: string, positionId: string, data: PositionsModels.DuplicatePositionRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/duplicate`, - ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), - config - ) -}; -export const cancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/cancel`, - undefined, - config - ) -}; -export const revertCancel = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/uncancel`, - undefined, - config - ) -}; -export const linkChild = (officeId: string, positionId: string, data: PositionsModels.LinkChildPositionsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/children`, - ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), - config - ) -}; -export const unlinkChild = (officeId: string, positionId: string, data: PositionsModels.UnlinkChildPositionsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/children`, - ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), - config - ) -}; -export const listChild = (officeId: string, positionId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: PositionsModels.ListChildResponseSchema }, - `/offices/${officeId}/positions/${positionId}/children`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/full/positions/positions.configs.ts b/test/generated/full/positions/positions.configs.ts deleted file mode 100644 index 0e9cfce..0000000 --- a/test/generated/full/positions/positions.configs.ts +++ /dev/null @@ -1,259 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionsQueries } from "./positions.queries"; -import { PositionsAcl } from "./positions.acl"; - -export namespace PositionsConfigs { -export const positionsConfig = { - meta: { - title: "Positions", - }, - readAll: { - acl: PositionsAcl.canUsePaginate, - schema: PositionsModels.PositionPreviewResponseDtoSchema, - paginated: PositionsQueries.usePaginate, - infinite: PositionsQueries.usePaginateInfinite, - filters: { - schema: PositionsModels.PositionFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionsModels.PositionFilterDtoSchema, - options: { - inputs: { - transportMode: true, - customerId: true, - carrierId: true, - consigneeId: true, - isCancelled: true, - status: true, - number: true, - direction: true, - loadType: true, - serviceType: true, - employee: true, - searchQuery: true, - externalSystemId: true, - createdAt: true, - serviceDate: true, - departureDate: true, - arrivalDate: true, - blfromCostumerDate: true, - blfromCarrierDate: true, - customsDate: true, - vgmCustomerDate: true, - partnerNetworkId: true, - projectLiteId: true, - checklistItemsDone: true, - checklistItemsNotDone: true, - routing: true, - isExcludedFromStatistics: true, - isMasterPosition: true, - loadingPortId: true, - dischargePortId: true, - customerReference: true, - carrierReference: true, - consigneeReference: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PositionsModels.PositionPreviewResponseDtoSchema, - options: { - columns: { - id: true, - externalSystemId: true, - transportMode: true, - direction: true, - loadType: true, - createdAt: true, - number: true, - isCancelled: true, - customer: true, - customerReference: true, - consignee: true, - consigneeReference: true, - carrier: true, - carrierReference: true, - positionNumber: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - origin: true, - loadDate: true, - loadingPort: true, - dischargePort: true, - destination: true, - deliveryDate: true, - equipment: true, - serviceType: true, - destinationOffice: true, - currency: true, - profit: true, - margin: true, - employee: true, - project: true, - serviceDate: true, - departureDate: true, - arrivalDate: true, - blfromCostumerDate: true, - blfromCarrierDate: true, - customsDate: true, - vgmCustomerDate: true, - routing: true, - notes: true, - isMasterPosition: true, - hasInvoices: true, - parentPosition: true, - }, - sortable: PositionsModels.PositionsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PositionsAcl.canUseGet, - schema: CommonModels.PositionCoreResponseDtoSchema, - query: PositionsQueries.useGet, - }, - create: { - acl: PositionsAcl.canUseCreate, - schema: PositionsModels.CreatePositionRequestDtoSchema, - mutation: PositionsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PositionsModels.CreatePositionRequestDtoSchema, - options: { - inputs: { - section: true, - direction: true, - transportMode: true, - loadType: true, - serviceType: true, - estimatedServiceDate: true, - customerBusinessPartnerId: true, - }, - }, -}) - }, - update: { - acl: PositionsAcl.canUseUpdate, - schema: PositionsModels.UpdatePositionDtoSchema, - mutation: PositionsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PositionsModels.UpdatePositionDtoSchema, - options: { - inputs: { - externalSystemId: true, - statusDate: true, - status: true, - loadType: true, - incoterms: true, - secondIncoterms: true, - fillingCompany: true, - sellingContract: true, - fillingScacCode: true, - serviceValidity: true, - ratesValidity: true, - serviceType: true, - buyRateReference: true, - frequency: true, - isParentPosition: true, - isExcludedFromStatistics: true, - team: true, - salesRepId: true, - responsibleEmployeeId: true, - receivedByEmployeeId: true, - originOfficeId: true, - projectLiteId: true, - notes: true, - inttraTypeOfMove: true, - volumetricWeightModifier: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: PositionsAcl.canUseFindAll, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PositionsQueries.useFindAll, - infinite: PositionsQueries.useFindAllInfinite, - filters: { - schema: PositionsModels.PositionLabelsFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionsModels.PositionLabelsFilterDtoSchema, - options: { - inputs: { - search: true, - isParentPosition: true, - isLinkedPosition: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - }, -}), - }, -}; - -export const childrenConfig = { - meta: { - title: "Children", - }, - readAll: { - acl: PositionsAcl.canUseListChild, - schema: PositionsModels.ChildPositionResponseDtoSchema, - paginated: PositionsQueries.useListChild, - infinite: PositionsQueries.useListChildInfinite, - columns: dynamicColumns({ - schema: PositionsModels.ChildPositionResponseDtoSchema, - options: { - columns: { - id: true, - number: true, - packages: true, - weight: true, - volume: true, - customer: true, - profit: true, - }, - }, -}), - }, - create: { - acl: PositionsAcl.canUseLinkChild, - schema: PositionsModels.LinkChildPositionsRequestDtoSchema, - mutation: PositionsQueries.useLinkChild, - inputDefs: dynamicInputs({ - schema: PositionsModels.LinkChildPositionsRequestDtoSchema, - options: { - inputs: { - childPositionIds: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/full/positions/positions.models.ts b/test/generated/full/positions/positions.models.ts deleted file mode 100644 index 6f71cac..0000000 --- a/test/generated/full/positions/positions.models.ts +++ /dev/null @@ -1,501 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionsModels { -/** - * PositionPreviewResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } externalSystemId - * @property { CommonModels.TransportModeEnum } transportMode - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { string } createdAt - * @property { string } number - * @property { boolean } isCancelled - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { string } customer.phone - * @property { string } customer.email - * @property { string } customerReference - * @property { object } consignee - * @property { string } consignee.id - * @property { string } consignee.name - * @property { string } consignee.matchCode - * @property { string } consignee.label - * @property { string } consigneeReference - * @property { object } carrier - * @property { string } carrier.id - * @property { string } carrier.name - * @property { string } carrier.matchCode - * @property { string } carrier.label - * @property { string } carrierReference - * @property { number } positionNumber - * @property { string } hblNumber - * @property { string } mblNumber - * @property { string } bookingNumber - * @property { string } vessel - * @property { string } voyage - * @property { string } vesselCarrier Carrier name from route point (sea positions only) - * @property { object } origin - * @property { string } origin.id - * @property { string } origin.name - * @property { string } loadDate - * @property { object } loadingPort - * @property { string } loadingPort.id - * @property { string } loadingPort.name - * @property { object } dischargePort - * @property { string } dischargePort.id - * @property { string } dischargePort.name - * @property { object } destination - * @property { string } destination.id - * @property { string } destination.name - * @property { string } deliveryDate - * @property { string } equipment - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { object } destinationOffice - * @property { string } destinationOffice.id - * @property { string } destinationOffice.name - * @property { string } currency - * @property { number } profit - * @property { number } margin - * @property { object } employee - * @property { string } employee.id - * @property { string } employee.name - * @property { object } project - * @property { string } project.id - * @property { string } project.name - * @property { string } serviceDate - * @property { string } departureDate - * @property { string } arrivalDate - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.EditorContentResponseDto } notes Notes - * @property { boolean } isMasterPosition - * @property { boolean } hasInvoices Whether this position has at least one invoice - * @property { object } parentPosition - * @property { string } parentPosition.id - * @property { string } parentPosition.number - */ -export const PositionPreviewResponseDtoSchema = z.object({ id: z.string(), externalSystemId: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), number: z.string(), isCancelled: z.boolean(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }).readonly(), customerReference: z.string().nullish(), consignee: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).readonly().nullish(), consigneeReference: z.string().nullish(), carrier: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).readonly().nullish(), carrierReference: z.string().nullish(), positionNumber: z.number().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), loadDate: z.iso.datetime({ offset: true }).nullish(), loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), deliveryDate: z.iso.datetime({ offset: true }).nullish(), equipment: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), currency: z.string().nullish(), profit: z.number().nullish(), margin: z.number().nullish(), employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).readonly().nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), departureDate: z.iso.datetime({ offset: true }).nullish(), arrivalDate: z.iso.datetime({ offset: true }).nullish(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), notes: CommonModels.EditorContentResponseDtoSchema.describe("Notes").nullish(), isMasterPosition: z.boolean(), hasInvoices: z.boolean().describe("Whether this position has at least one invoice").nullish(), parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).readonly().nullish() }).readonly(); -export type PositionPreviewResponseDto = z.infer; - -/** - * PositionFilterDtoSchema - * @type { object } - * @property { CommonModels.TransportModeEnum } transportMode - * @property { string[] } customerId - * @property { string[] } carrierId Filter positions by carrier IDs - * @property { string[] } consigneeId Filter positions by consignee IDs - * @property { boolean } isCancelled - * @property { CommonModels.PositionStatusEnum } status - * @property { string } number - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } employee Filter positions by employee IDs - * @property { string } searchQuery - * @property { string } externalSystemId Filter positions by external system ID (substring match) - * @property { CommonModels.DateRangeDto } createdAt - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.DateRangeDto } departureDate - * @property { CommonModels.DateRangeDto } arrivalDate - * @property { CommonModels.DateRangeDto } blfromCostumerDate - * @property { CommonModels.DateRangeDto } blfromCarrierDate - * @property { CommonModels.DateRangeDto } customsDate - * @property { CommonModels.DateRangeDto } vgmCustomerDate - * @property { string } partnerNetworkId Filter positions by partner network ID - * @property { string[] } projectLiteId Filter positions by project IDs - * @property { string[] } checklistItemsDone Checklist item ids that must be completed - * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics - * @property { boolean } isMasterPosition - * @property { string[] } loadingPortId Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure) - * @property { string[] } dischargePortId Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport) - * @property { string } customerReference Filter positions by customer reference - * @property { string } carrierReference Filter positions by carrier reference - * @property { string } consigneeReference Filter positions by consignee reference - * @property { string } hblNumber Filter positions by HBL/HAWB number - * @property { string } mblNumber Filter positions by MBL/MAWB number - * @property { string } bookingNumber Filter positions by booking number - * @property { string } vessel Filter positions by vessel name - * @property { string } voyage Filter positions by voyage number - * @property { string } vesselCarrier Filter positions by vessel or carrier name - */ -export const PositionFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema, customerId: z.array(z.string()).readonly(), carrierId: z.array(z.string()).readonly().describe("Filter positions by carrier IDs"), consigneeId: z.array(z.string()).readonly().describe("Filter positions by consignee IDs"), isCancelled: z.boolean(), status: CommonModels.PositionStatusEnumSchema, number: z.string(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, employee: z.array(z.string()).readonly().describe("Filter positions by employee IDs"), searchQuery: z.string(), externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), createdAt: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, departureDate: CommonModels.DateRangeDtoSchema, arrivalDate: CommonModels.DateRangeDtoSchema, blfromCostumerDate: CommonModels.DateRangeDtoSchema, blfromCarrierDate: CommonModels.DateRangeDtoSchema, customsDate: CommonModels.DateRangeDtoSchema, vgmCustomerDate: CommonModels.DateRangeDtoSchema, partnerNetworkId: z.string().describe("Filter positions by partner network ID"), projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), routing: CommonModels.SeaRoutingEnumSchema, isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly(), isMasterPosition: z.boolean(), loadingPortId: z.array(z.string()).readonly().describe("Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure)"), dischargePortId: z.array(z.string()).readonly().describe("Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport)"), customerReference: z.string().describe("Filter positions by customer reference"), carrierReference: z.string().describe("Filter positions by carrier reference"), consigneeReference: z.string().describe("Filter positions by consignee reference"), hblNumber: z.string().describe("Filter positions by HBL/HAWB number"), mblNumber: z.string().describe("Filter positions by MBL/MAWB number"), bookingNumber: z.string().describe("Filter positions by booking number"), vessel: z.string().describe("Filter positions by vessel name"), voyage: z.string().describe("Filter positions by voyage number"), vesselCarrier: z.string().describe("Filter positions by vessel or carrier name") }).readonly(); -export type PositionFilterDto = z.infer; - -/** - * PositionExportFilterDtoSchema - * @type { object } - * @property { CommonModels.TransportModeEnum } transportMode - * @property { string[] } customerId - * @property { boolean } isCancelled - * @property { CommonModels.PositionStatusEnum } status - * @property { string } number - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } responsibleEmployee Filter positions by responsible employee IDs - * @property { string } searchQuery - * @property { string } externalSystemId Filter positions by external system ID (substring match) - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.DateRangeDto } dateOfDeparture - * @property { CommonModels.DateRangeDto } dateOfArrival - * @property { CommonModels.DateRangeDto } blfromCostumerDate - * @property { CommonModels.DateRangeDto } blfromCarrierDate - * @property { CommonModels.DateRangeDto } customsDate - * @property { CommonModels.DateRangeDto } vgmCustomerDate - * @property { string } partnerNetworkId Filter positions by partner network ID - * @property { string[] } projectLiteId Filter positions by project IDs - * @property { string[] } checklistItemsDone Checklist item ids that must be completed - * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics - */ -export const PositionExportFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema, customerId: z.array(z.string()).readonly(), isCancelled: z.boolean(), status: CommonModels.PositionStatusEnumSchema, number: z.string(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, responsibleEmployee: z.array(z.string()).readonly().describe("Filter positions by responsible employee IDs"), searchQuery: z.string(), externalSystemId: z.string().describe("Filter positions by external system ID (substring match)"), statusDate: CommonModels.DateRangeDtoSchema, serviceDate: CommonModels.DateRangeDtoSchema, dateOfDeparture: CommonModels.DateRangeDtoSchema, dateOfArrival: CommonModels.DateRangeDtoSchema, blfromCostumerDate: CommonModels.DateRangeDtoSchema, blfromCarrierDate: CommonModels.DateRangeDtoSchema, customsDate: CommonModels.DateRangeDtoSchema, vgmCustomerDate: CommonModels.DateRangeDtoSchema, partnerNetworkId: z.string().describe("Filter positions by partner network ID"), projectLiteId: z.array(z.string()).readonly().describe("Filter positions by project IDs"), checklistItemsDone: z.array(z.string()).readonly().describe("Checklist item ids that must be completed"), checklistItemsNotDone: z.array(z.string()).readonly().describe("Checklist item ids that must be not completed"), routing: CommonModels.SeaRoutingEnumSchema, isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).readonly() }).readonly(); -export type PositionExportFilterDto = z.infer; - -/** - * PositionExportColumnSchema - * @type { enum } - */ -export const PositionExportColumnSchema = z.enum(["id", "externalSystemId", "transportMode", "direction", "loadType", "createdAt", "number", "isCancelled", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeName", "consigneeReference", "carrierName", "carrierReference", "positionNumber", "hblNumber", "mblNumber", "bookingNumber", "vessel", "voyage", "originName", "loadDate", "loadingPortName", "dischargePortName", "destinationName", "deliveryDate", "equipment", "serviceTypeName", "departureDate", "arrivalDate", "destinationOfficeName", "currency", "profit", "margin", "employeeName", "projectName", "serviceDate", "routing", "notes", "blFromCustomerDate", "blFromCarrierDate", "customsDate", "vgmCustomerDate", "isMasterPosition", "parentPositionId", "parentPositionNumber"]); -export type PositionExportColumn = z.infer; -export const PositionExportColumn = PositionExportColumnSchema.enum; - -/** - * PositionExportRequestDtoSchema - * @type { object } - * @property { string } order Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @property { PositionExportColumn[] } columns Min Items: `1` - * @property { PositionExportFilterDto } filter - */ -export const PositionExportRequestDtoSchema = z.object({ order: z.string().describe("Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition"), columns: z.array(PositionExportColumnSchema).readonly().min(1), filter: PositionExportFilterDtoSchema }).readonly(); -export type PositionExportRequestDto = z.infer; - -/** - * CreatePositionRequestDtoSchema - * @type { object } - * @property { CommonModels.SectionEnum } section - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum } transportMode - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } estimatedServiceDate - * @property { string } customerBusinessPartnerId - */ -export const CreatePositionRequestDtoSchema = z.object({ section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, estimatedServiceDate: z.iso.datetime({ offset: true }), customerBusinessPartnerId: z.string() }).readonly(); -export type CreatePositionRequestDto = z.infer; - -/** - * DuplicatePositionPackageInformationParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } packageType - * @property { boolean } packageQuantity - * @property { boolean } packageDescription - * @property { boolean } packageHsCodes - * @property { boolean } packageNetWeight - * @property { boolean } packageGrossWeight - * @property { boolean } packageCaseMark - * @property { boolean } packageNote - * @property { boolean } packageCustomsMark - */ -export const DuplicatePositionPackageInformationParametersDtoSchema = z.object({ enabled: z.boolean(), packageType: z.boolean(), packageQuantity: z.boolean(), packageDescription: z.boolean(), packageHsCodes: z.boolean(), packageNetWeight: z.boolean(), packageGrossWeight: z.boolean(), packageCaseMark: z.boolean(), packageNote: z.boolean(), packageCustomsMark: z.boolean() }).readonly(); -export type DuplicatePositionPackageInformationParametersDto = z.infer; - -/** - * DuplicatePositionCargoParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { DuplicatePositionPackageInformationParametersDto } packageInformation - */ -export const DuplicatePositionCargoParametersDtoSchema = z.object({ enabled: z.boolean(), packageInformation: DuplicatePositionPackageInformationParametersDtoSchema }).readonly(); -export type DuplicatePositionCargoParametersDto = z.infer; - -/** - * DuplicatePositionOverviewParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } quoteReference - */ -export const DuplicatePositionOverviewParametersDtoSchema = z.object({ enabled: z.boolean(), quoteReference: z.boolean() }).readonly(); -export type DuplicatePositionOverviewParametersDto = z.infer; - -/** - * DuplicatePositionInvolvedPartiesParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } involvedPartySection - */ -export const DuplicatePositionInvolvedPartiesParametersDtoSchema = z.object({ enabled: z.boolean(), involvedPartySection: z.boolean() }).readonly(); -export type DuplicatePositionInvolvedPartiesParametersDto = z.infer; - -/** - * DuplicatePositionRoutesParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } routeDates - * @property { boolean } routeLocation - */ -export const DuplicatePositionRoutesParametersDtoSchema = z.object({ enabled: z.boolean(), routeDates: z.boolean(), routeLocation: z.boolean() }).readonly(); -export type DuplicatePositionRoutesParametersDto = z.infer; - -/** - * DuplicatePositionFinanceAccountParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } exchangeRate - */ -export const DuplicatePositionFinanceAccountParametersDtoSchema = z.object({ enabled: z.boolean(), exchangeRate: z.boolean() }).readonly(); -export type DuplicatePositionFinanceAccountParametersDto = z.infer; - -/** - * DuplicatePositionDocumentsParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } hblWorkingDocument - * @property { boolean } siWorkingDocument - */ -export const DuplicatePositionDocumentsParametersDtoSchema = z.object({ enabled: z.boolean(), hblWorkingDocument: z.boolean(), siWorkingDocument: z.boolean() }).readonly(); -export type DuplicatePositionDocumentsParametersDto = z.infer; - -/** - * DuplicatePositionParametersDtoSchema - * @type { object } - * @property { DuplicatePositionOverviewParametersDto } overview - * @property { DuplicatePositionInvolvedPartiesParametersDto } involvedParties - * @property { DuplicatePositionCargoParametersDto } cargo - * @property { DuplicatePositionRoutesParametersDto } routes - * @property { DuplicatePositionFinanceAccountParametersDto } financeAccount - * @property { DuplicatePositionDocumentsParametersDto } documents - */ -export const DuplicatePositionParametersDtoSchema = z.object({ overview: DuplicatePositionOverviewParametersDtoSchema, involvedParties: DuplicatePositionInvolvedPartiesParametersDtoSchema, cargo: DuplicatePositionCargoParametersDtoSchema, routes: DuplicatePositionRoutesParametersDtoSchema, financeAccount: DuplicatePositionFinanceAccountParametersDtoSchema, documents: DuplicatePositionDocumentsParametersDtoSchema }).readonly(); -export type DuplicatePositionParametersDto = z.infer; - -/** - * DuplicatePositionDefaultParametersResponseDtoSchema - * @type { object } - * @property { string } estimatedServiceDate Suggested estimated service date for the duplicated position (ISO 8601) - * @property { DuplicatePositionParametersDto } parameters Default duplication parameters with section and sub-parameter flags - */ -export const DuplicatePositionDefaultParametersResponseDtoSchema = z.object({ estimatedServiceDate: z.string().describe("Suggested estimated service date for the duplicated position (ISO 8601)"), parameters: DuplicatePositionParametersDtoSchema.describe("Default duplication parameters with section and sub-parameter flags") }).readonly(); -export type DuplicatePositionDefaultParametersResponseDto = z.infer; - -/** - * PositionSectionEnumSchema - * @type { enum } - */ -export const PositionSectionEnumSchema = z.enum(["overview", "involvedParties", "cargo", "financeAccount", "routes", "routeDates", "documents"]); -export type PositionSectionEnum = z.infer; -export const PositionSectionEnum = PositionSectionEnumSchema.enum; - -/** - * DuplicatePositionRequestDtoSchema - * @type { object } - * @property { PositionSectionEnum[] } sections Legacy: sections to duplicate. Ignored when parameters is provided. - * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. - * @property { string } estimatedServiceDate - */ -export const DuplicatePositionRequestDtoSchema = z.object({ sections: z.array(PositionSectionEnumSchema).readonly().describe("Legacy: sections to duplicate. Ignored when parameters is provided.").nullish(), parameters: DuplicatePositionParametersDtoSchema.describe("Nested parameters for duplication control. Preferred over sections.").nullish(), estimatedServiceDate: z.iso.datetime({ offset: true }) }).readonly(); -export type DuplicatePositionRequestDto = z.infer; - -/** - * UpdatePositionDtoSchema - * @type { object } - * @property { string } externalSystemId - * @property { string } statusDate - * @property { CommonModels.PositionStatusEnum } status - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.IncotermsEnum } incoterms - * @property { CommonModels.IncotermsEnum } secondIncoterms - * @property { string } fillingCompany - * @property { string } sellingContract - * @property { string } fillingScacCode - * @property { string } serviceValidity - * @property { string } ratesValidity - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } buyRateReference - * @property { CommonModels.FrequencyEnum } frequency - * @property { boolean } isParentPosition - * @property { boolean } isExcludedFromStatistics - * @property { string } team - * @property { string } salesRepId - * @property { string } responsibleEmployeeId - * @property { string } receivedByEmployeeId - * @property { string } originOfficeId - * @property { string } projectLiteId - * @property { CommonModels.EditorContentUpdateDto } notes Notes - * @property { CommonModels.MovementTypeEnum } inttraTypeOfMove - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const UpdatePositionDtoSchema = z.object({ externalSystemId: z.string(), statusDate: z.iso.datetime({ offset: true }), status: CommonModels.PositionStatusEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, incoterms: CommonModels.IncotermsEnumSchema, secondIncoterms: CommonModels.IncotermsEnumSchema, fillingCompany: z.string(), sellingContract: z.string(), fillingScacCode: z.string(), serviceValidity: z.iso.datetime({ offset: true }), ratesValidity: z.iso.datetime({ offset: true }), serviceType: CommonModels.ServiceTypeEnumSchema, buyRateReference: z.string(), frequency: CommonModels.FrequencyEnumSchema, isParentPosition: z.boolean(), isExcludedFromStatistics: z.boolean(), team: z.string(), salesRepId: z.string(), responsibleEmployeeId: z.string(), receivedByEmployeeId: z.string(), originOfficeId: z.string(), projectLiteId: z.string(), notes: CommonModels.EditorContentUpdateDtoSchema.describe("Notes"), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema, volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); -export type UpdatePositionDto = z.infer; - -/** - * ChildPositionCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type ChildPositionCustomerDto = z.infer; - -/** - * ChildPositionProfitDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currency - */ -export const ChildPositionProfitDtoSchema = z.object({ amount: z.number(), currency: z.string() }).readonly(); -export type ChildPositionProfitDto = z.infer; - -/** - * ChildPositionResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { number } packages - * @property { number } weight - * @property { number } volume - * @property { ChildPositionCustomerDto } customer - * @property { ChildPositionProfitDto } profit - */ -export const ChildPositionResponseDtoSchema = z.object({ id: z.string(), number: z.string(), packages: z.number(), weight: z.number(), volume: z.number(), customer: ChildPositionCustomerDtoSchema, profit: ChildPositionProfitDtoSchema }).readonly(); -export type ChildPositionResponseDto = z.infer; - -/** - * PositionLabelsFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } isParentPosition - * @property { boolean } isLinkedPosition - */ -export const PositionLabelsFilterDtoSchema = z.object({ search: z.string(), isParentPosition: z.boolean(), isLinkedPosition: z.boolean() }).readonly(); -export type PositionLabelsFilterDto = z.infer; - -/** - * PositionListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const PositionListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalProfit: z.number(), profitPerPosition: z.number(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); -export type PositionListResponseDto = z.infer; - -/** - * LinkChildPositionsRequestDtoSchema - * @type { object } - * @property { string[] } childPositionIds - */ -export const LinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()).readonly() }).readonly(); -export type LinkChildPositionsRequestDto = z.infer; - -/** - * UnlinkChildPositionsRequestDtoSchema - * @type { object } - * @property { string[] } childPositionIds - */ -export const UnlinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()).readonly() }).readonly(); -export type UnlinkChildPositionsRequestDto = z.infer; - -/** - * PositionsFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PositionsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type PositionsFindAllResponse = z.infer; - -/** - * PositionsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PositionsPaginateOrderParamEnumSchema = z.enum(["number", "transportMode", "isCancelled", "direction", "loadType", "serviceDate", "createdAt", "departureDate", "arrivalDate", "blfromCostumerDate", "blfromCarrierDate", "customsDate", "vgmCustomerDate", "serviceType", "externalSystemId", "employee", "project", "profit", "margin", "isMasterPosition"]); -export type PositionsPaginateOrderParamEnum = z.infer; -export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSchema.enum; - -/** - * PositionsPaginateResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionPreviewResponseDto[] } items - */ -export const PositionsPaginateResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape }); -export type PositionsPaginateResponse = z.infer; - -/** - * TotalProfitResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionPreviewResponseDto[] } items - */ -export const TotalProfitResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).readonly() }).readonly().shape }); -export type TotalProfitResponse = z.infer; - -/** - * PositionsListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ -export const PositionsListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); -export type PositionsListAvailablePartnersForResponse = z.infer; - -/** - * ListRouteLabelsResponseSchema - * @type { array } - */ -export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); -export type ListRouteLabelsResponse = z.infer; - -/** - * ListChildResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChildPositionResponseDto[] } items - */ -export const ListChildResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChildPositionResponseDtoSchema).readonly() }).readonly().shape }); -export type ListChildResponse = z.infer; - -} diff --git a/test/generated/full/positions/positions.queries.ts b/test/generated/full/positions/positions.queries.ts deleted file mode 100644 index 869e77f..0000000 --- a/test/generated/full/positions/positions.queries.ts +++ /dev/null @@ -1,536 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionsAcl } from "./positions.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionsApi } from "./positions.api"; - -export namespace PositionsQueries { -export const moduleName = QueryModule.Positions; - -export const keys = { - all: [moduleName] as const, - findAll: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", officeId, limit, filter, page, cursor] as const, - findAllInfinite: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", "infinite", officeId, limit, filter, cursor] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions", "infinite", officeId, limit, order, filter, cursor] as const, - totalProfit: (officeId: string) => [...keys.all, "/offices/:officeId/positions/fake-total-profit", officeId] as const, - listAvailablePartnersFor: (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/positions/:positionId/available-partners", officeId, positionId, search, useCase] as const, - get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId", officeId, positionId] as const, - listRouteLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes/labels", officeId, positionId] as const, - getDuplicateDefaultParameters: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/duplicate/default-parameters", officeId, positionId] as const, - listChild: (officeId: string, positionId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", officeId, positionId, limit, page, cursor] as const, - listChildInfinite: (officeId: string, positionId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", "infinite", officeId, positionId, limit, cursor] as const, -}; - -/** - * Query `useFindAll` - * @summary List all positions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ officeId, limit, filter, page, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(officeId, limit, filter, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUseFindAll({ officeId } )); - return PositionsApi.findAll(officeId, limit, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @summary List all positions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ officeId, limit, filter, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUseFindAll({ officeId } )); - return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary List positions - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @param { PositionsModels.PositionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUsePaginate({ officeId } )); - return PositionsApi.paginate(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary List positions - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @param { PositionsModels.PositionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUsePaginate({ officeId } )); - return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create position - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { PositionsModels.CreatePositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position created successfully - * @statusCodes [201, 400, 401, 404] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PositionsAcl.canUseCreate({ officeId } )); - return PositionsApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useTotalProfit` - * @summary List positions - * @permission Requires `canUseTotalProfit` ability - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useTotalProfit = ({ officeId }: { officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.totalProfit(officeId), - queryFn: () => { - checkAcl(PositionsAcl.canUseTotalProfit({ officeId } )); - return PositionsApi.totalProfit(officeId, config) }, - ...options, - }); -}; - -/** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for a position - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListAvailablePartnersFor = ({ officeId, positionId, search, useCase }: { officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), - queryFn: () => { - checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId } )); - return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase, config) }, - ...options, - }); -}; - -/** - * Mutation `useExportPositions` - recommended when file should not be cached - * @summary Export positions to Excel - * @permission Requires `canUseExportPositions` ability - * @param { string } mutation.officeId Path parameter - * @param { PositionsModels.PositionExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportPositions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PositionsAcl.canUseExportPositions({ officeId } )); - return PositionsApi.exportPositions(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGet` - * @summary Get position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Position retrieved successfully - * @statusCodes [200, 401, 403, 404] - */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseGet({ officeId } )); - return PositionsApi.get(officeId, positionId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.UpdatePositionDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position updated successfully - * @statusCodes [200, 400, 401, 404] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseUpdate({ officeId } )); - return PositionsApi.update(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListRouteLabels` - * @summary List all route labels for a position - * @permission Requires `canUseListRouteLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRouteLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRouteLabels(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseListRouteLabels({ officeId } )); - return PositionsApi.listRouteLabels(officeId, positionId, config) }, - ...options, - }); -}; - -/** - * Query `useGetDuplicateDefaultParameters` - * @summary Get default duplication parameters for a position - * @permission Requires `canUseGetDuplicateDefaultParameters` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Default parameters and suggested estimated service date - * @statusCodes [200, 401, 404] - */ -export const useGetDuplicateDefaultParameters = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId } )); - return PositionsApi.getDuplicateDefaultParameters(officeId, positionId, config) }, - ...options, - }); -}; - -/** - * Mutation `useDuplicate` - * @summary Duplicate position - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.DuplicatePositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position duplicated successfully - * @statusCodes [201, 400, 401, 404] - */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseDuplicate({ officeId } )); - return PositionsApi.duplicate(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCancel` - * @summary Cancel position - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position cancelled successfully - * @statusCodes [200, 400, 401, 403, 404] - */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionsAcl.canUseCancel({ officeId } )); - return PositionsApi.cancel(officeId, positionId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRevertCancel` - * @summary Revert cancelled position (accounting) - * @permission Requires `canUseRevertCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position reverted successfully - * @statusCodes [200, 400, 401, 403, 404] - */ -export const useRevertCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionsAcl.canUseRevertCancel({ officeId } )); - return PositionsApi.revertCancel(officeId, positionId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useLinkChild` - * @summary Link child positions to parent - * @permission Requires `canUseLinkChild` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.LinkChildPositionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useLinkChild = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseLinkChild({ officeId } )); - return PositionsApi.linkChild(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnlinkChild` - * @summary Unlink child positions from parent - * @permission Requires `canUseUnlinkChild` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.UnlinkChildPositionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnlinkChild = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseUnlinkChild({ officeId } )); - return PositionsApi.unlinkChild(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListChild` - * @summary Get child positions for parent - * @permission Requires `canUseListChild` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListChild = ({ officeId, positionId, limit, page, cursor }: { officeId: string, positionId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listChild(officeId, positionId, limit, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUseListChild({ officeId } )); - return PositionsApi.listChild(officeId, positionId, limit, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListChildInfinite - * @summary Get child positions for parent - * @permission Requires `canUseListChild` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListChildInfinite = ({ officeId, positionId, limit, cursor }: { officeId: string, positionId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUseListChild({ officeId } )); - return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/full/projectLite/projectLite.acl.ts b/test/generated/full/projectLite/projectLite.acl.ts deleted file mode 100644 index 00ccf56..0000000 --- a/test/generated/full/projectLite/projectLite.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ProjectLiteAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create project in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Create", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List projects for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `usePaginateProjectLabels` query ability. For global ability, omit the object parameter. - * @description Paginate project labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateProjectLabels` query - */ -export const canUsePaginateProjectLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get project by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Update", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -} diff --git a/test/generated/full/projectLite/projectLite.api.ts b/test/generated/full/projectLite/projectLite.api.ts deleted file mode 100644 index caa5b16..0000000 --- a/test/generated/full/projectLite/projectLite.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ProjectLiteModels } from "./projectLite.models"; - -export namespace ProjectLiteApi { -export const create = (officeId: string, data: ProjectLiteModels.CreateProjectLiteRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite`, - ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), - config - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, - `/offices/${officeId}/project-lite`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateProjectLabels = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, - `/offices/${officeId}/project-lite/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite/${id}`, - config - ) -}; -export const update = (id: string, officeId: string, data: ProjectLiteModels.UpdateProjectLiteRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite/${id}`, - ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/project-lite/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/project-lite/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/projectLite/projectLite.configs.ts b/test/generated/full/projectLite/projectLite.configs.ts deleted file mode 100644 index 5981c30..0000000 --- a/test/generated/full/projectLite/projectLite.configs.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ProjectLiteModels } from "./projectLite.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ProjectLiteQueries } from "./projectLite.queries"; -import { ProjectLiteAcl } from "./projectLite.acl"; - -export namespace ProjectLiteConfigs { -export const projectLiteConfig = { - meta: { - title: "Project Lite", - }, - readAll: { - acl: ProjectLiteAcl.canUsePaginate, - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - paginated: ProjectLiteQueries.usePaginate, - infinite: ProjectLiteQueries.usePaginateInfinite, - filters: { - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ProjectLiteAcl.canUseFindById, - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - query: ProjectLiteQueries.useFindById, - }, - create: { - acl: ProjectLiteAcl.canUseCreate, - schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, - mutation: ProjectLiteQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: ProjectLiteAcl.canUseUpdate, - schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, - mutation: ProjectLiteQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: ProjectLiteAcl.canUsePaginateProjectLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ProjectLiteQueries.usePaginateProjectLabels, - infinite: ProjectLiteQueries.usePaginateProjectLabelsInfinite, - filters: { - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/projectLite/projectLite.models.ts b/test/generated/full/projectLite/projectLite.models.ts deleted file mode 100644 index fabb95a..0000000 --- a/test/generated/full/projectLite/projectLite.models.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ProjectLiteModels { -/** - * ProjectLiteEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type ProjectLiteEmployeeDTO = z.infer; - -/** - * ProjectLiteResponseDTOSchema - * @type { object } - * @property { string } id Project ID - * @property { string } name Project name - * @property { string } officeId Office ID - * @property { boolean } archived Is archived - * @property { string } createdById ID of the employee who created this project - * @property { ProjectLiteEmployeeDTO } createdBy Employee who created this project - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this project - * @property { ProjectLiteEmployeeDTO } updatedBy Employee who last updated this project - * @property { string } updatedAt Updated at - */ -export const ProjectLiteResponseDTOSchema = z.object({ id: z.string().describe("Project ID"), name: z.string().describe("Project name"), officeId: z.string().describe("Office ID"), archived: z.boolean().describe("Is archived"), createdById: z.string().describe("ID of the employee who created this project").nullish(), createdBy: ProjectLiteEmployeeDTOSchema.describe("Employee who created this project").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedById: z.string().describe("ID of the employee who last updated this project").nullish(), updatedBy: ProjectLiteEmployeeDTOSchema.describe("Employee who last updated this project").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at") }).readonly(); -export type ProjectLiteResponseDTO = z.infer; - -/** - * CreateProjectLiteRequestDTOSchema - * @type { object } - * @property { string } name Project name - */ -export const CreateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); -export type CreateProjectLiteRequestDTO = z.infer; - -/** - * ProjectLiteFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ProjectLiteFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean() }).readonly(); -export type ProjectLiteFilterDto = z.infer; - -/** - * UpdateProjectLiteRequestDTOSchema - * @type { object } - * @property { string } name Project name - */ -export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().describe("Project name") }).readonly(); -export type UpdateProjectLiteRequestDTO = z.infer; - -/** - * ProjectLitePaginateOrderParamEnumSchema - * @type { enum } - */ -export const ProjectLitePaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ProjectLitePaginateOrderParamEnum = z.infer; -export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEnumSchema.enum; - -/** - * ProjectLitePaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ProjectLiteResponseDTO[] } items - */ -export const ProjectLitePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).readonly() }).readonly().shape }); -export type ProjectLitePaginateResponse = z.infer; - -/** - * PaginateProjectLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateProjectLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateProjectLabelsOrderParamEnum = z.infer; -export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderParamEnumSchema.enum; - -/** - * PaginateProjectLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateProjectLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type PaginateProjectLabelsResponse = z.infer; - -} diff --git a/test/generated/full/projectLite/projectLite.queries.ts b/test/generated/full/projectLite/projectLite.queries.ts deleted file mode 100644 index 43432ae..0000000 --- a/test/generated/full/projectLite/projectLite.queries.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ProjectLiteAcl } from "./projectLite.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ProjectLiteModels } from "./projectLite.models"; -import { ProjectLiteApi } from "./projectLite.api"; - -export namespace ProjectLiteQueries { -export const moduleName = QueryModule.ProjectLite; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", "infinite", officeId, limit, order, filter, cursor] as const, - paginateProjectLabels: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", officeId, limit, order, filter, page, cursor] as const, - paginateProjectLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/project-lite/:id", id, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create project - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ProjectLiteModels.CreateProjectLiteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ProjectLiteAcl.canUseCreate({ officeId } )); - return ProjectLiteApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated projects - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); - return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated projects - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); - return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateProjectLabels` - * @summary Paginate project labels - * @permission Requires `canUsePaginateProjectLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateProjectLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateProjectLabelsInfinite - * @summary Paginate project labels - * @permission Requires `canUsePaginateProjectLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateProjectLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get project by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUseFindById({ officeId } )); - return ProjectLiteApi.findById(id, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update project - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ProjectLiteModels.UpdateProjectLiteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ProjectLiteAcl.canUseUpdate({ officeId } )); - return ProjectLiteApi.update(id, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive project - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ProjectLiteAcl.canUseArchive({ officeId } )); - return ProjectLiteApi.archive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive project - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId } )); - return ProjectLiteApi.unarchive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/queryModules.ts b/test/generated/full/queryModules.ts deleted file mode 100644 index 2daa74a..0000000 --- a/test/generated/full/queryModules.ts +++ /dev/null @@ -1,96 +0,0 @@ -export const enum QueryModule { - WorkingDocuments = "WorkingDocumentsQueries", - Offices = "OfficesQueries", - BankAccounts = "BankAccountsQueries", - Currencies = "CurrenciesQueries", - Countries = "CountriesQueries", - Folders = "FoldersQueries", - Files = "FilesQueries", - WorkingDocumentsTemplatedDocument = "WorkingDocumentsTemplatedDocumentQueries", - BusinessPartners = "BusinessPartnersQueries", - BusinessPartnerBookkeepingMappings = "BusinessPartnerBookkeepingMappingsQueries", - BusinessPartnerContacts = "BusinessPartnerContactsQueries", - Cities = "CitiesQueries", - Depots = "DepotsQueries", - PartnerNetworks = "PartnerNetworksQueries", - Warehouses = "WarehousesQueries", - UserActivity = "UserActivityQueries", - DocumentTemplates = "DocumentTemplatesQueries", - HsCodes = "HsCodesQueries", - CargoTypes = "CargoTypesQueries", - SeaPositions = "SeaPositionsQueries", - Terminals = "TerminalsQueries", - Airports = "AirportsQueries", - Ports = "PortsQueries", - ContainerYards = "ContainerYardsQueries", - PositionInvolvedParties = "PositionInvolvedPartiesQueries", - PositionRoutes = "PositionRoutesQueries", - AirPositions = "AirPositionsQueries", - PositionAccount = "PositionAccountQueries", - PositionAccountItems = "PositionAccountItemsQueries", - PositionProfitChangeTracking = "PositionProfitChangeTrackingQueries", - WorkingDocumentsExportDeclaration = "WorkingDocumentsExportDeclarationQueries", - PositionCargo = "PositionCargoQueries", - PositionCargoPackage = "PositionCargoPackageQueries", - PackageTypes = "PackageTypesQueries", - WorkingDocumentsHouseBl = "WorkingDocumentsHouseBlQueries", - WorkingDocumentsBlInstructions = "WorkingDocumentsBlInstructionsQueries", - WorkingDocumentsAmsInstructions = "WorkingDocumentsAmsInstructionsQueries", - WorkingDocumentsHouseAwb = "WorkingDocumentsHouseAwbQueries", - ChargeTypes = "ChargeTypesQueries", - WorkingDocumentsMasterAwb = "WorkingDocumentsMasterAwbQueries", - WorkingDocumentsCmrForm = "WorkingDocumentsCmrFormQueries", - WorkingDocumentsIsfForm = "WorkingDocumentsIsfFormQueries", - WorkingDocumentsFcrForm = "WorkingDocumentsFcrFormQueries", - ShippingInstructions = "ShippingInstructionsQueries", - EmployeeAccount = "EmployeeAccountQueries", - EmployeeSettings = "EmployeeSettingsQueries", - EmployeeRoles = "EmployeeRolesQueries", - EmployeePermissions = "EmployeePermissionsQueries", - EmployeeProfile = "EmployeeProfileQueries", - Employee = "EmployeeQueries", - Employment = "EmploymentQueries", - CustomerAccount = "CustomerAccountQueries", - Customers = "CustomersQueries", - Quotes = "QuotesQueries", - QuoteAccount = "QuoteAccountQueries", - QuoteProfitChangeTracking = "QuoteProfitChangeTrackingQueries", - SeaQuotes = "SeaQuotesQueries", - RoadQuotes = "RoadQuotesQueries", - QuoteDocument = "QuoteDocumentQueries", - QuoteCargo = "QuoteCargoQueries", - QuoteCargoPackage = "QuoteCargoPackageQueries", - QuoteRoutes = "QuoteRoutesQueries", - DunningManagement = "DunningManagementQueries", - DunningPartnerOutstandingInvoices = "DunningPartnerOutstandingInvoicesQueries", - DunningLevels = "DunningLevelsQueries", - DunningSystems = "DunningSystemsQueries", - DunningAccountStatement = "DunningAccountStatementQueries", - Positions = "PositionsQueries", - QuoteConversion = "QuoteConversionQueries", - Invoices = "InvoicesQueries", - VatRules = "VatRulesQueries", - InvoicePayments = "InvoicePaymentsQueries", - PaymentConfirmations = "PaymentConfirmationsQueries", - ProjectLite = "ProjectLiteQueries", - PositionChecklist = "PositionChecklistQueries", - ChecklistTemplates = "ChecklistTemplatesQueries", - BookkeepingExport = "BookkeepingExportQueries", - FactoringExport = "FactoringExportQueries", - FactoringMerge = "FactoringMergeQueries", - AWBStocks = "AWBStocksQueries", - MasterData = "MasterDataQueries", - ChecklistItems = "ChecklistItemsQueries", - MasterDataImport = "MasterDataImportQueries", - RemarkTemplates = "RemarkTemplatesQueries", - IntegrationChannels = "IntegrationChannelsQueries", - ControlTowerBookings = "ControlTowerBookingsQueries", - ControlTowerPackages = "ControlTowerPackagesQueries", - ControlTowerContainers = "ControlTowerContainersQueries", - ControlTowerAuth = "ControlTowerAuthQueries", - ControlTowerMe = "ControlTowerMeQueries", - ControlTowerSearch = "ControlTowerSearchQueries", - ControlTowerCalendar = "ControlTowerCalendarQueries", - InttraShippingInstructionMessages = "InttraShippingInstructionMessagesQueries", - InttraOfficeIntegration = "InttraOfficeIntegrationQueries", -} \ No newline at end of file diff --git a/test/generated/full/quoteAccount/quoteAccount.acl.ts b/test/generated/full/quoteAccount/quoteAccount.acl.ts deleted file mode 100644 index 5a12701..0000000 --- a/test/generated/full/quoteAccount/quoteAccount.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteAccountAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description List quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateItem` mutation - */ -export const canUseCreateItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDeleteItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteItem` mutation - */ -export const canUseDeleteItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateItem` mutation - */ -export const canUseUpdateItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDuplicateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateItem` mutation - */ -export const canUseDuplicateItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/full/quoteAccount/quoteAccount.api.ts b/test/generated/full/quoteAccount/quoteAccount.api.ts deleted file mode 100644 index 0ef7323..0000000 --- a/test/generated/full/quoteAccount/quoteAccount.api.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteAccountModels } from "./quoteAccount.models"; - -export namespace QuoteAccountApi { -export const get = (quoteId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/account`, - config - ) -}; -export const createItem = (quoteId: string, officeId: string, data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items`, - ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), - config - ) -}; -export const deleteItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - undefined, - config - ) -}; -export const updateItem = (quoteId: string, itemId: string, officeId: string, data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), - config - ) -}; -export const duplicateItem = (quoteId: string, itemId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/quoteAccount/quoteAccount.models.ts b/test/generated/full/quoteAccount/quoteAccount.models.ts deleted file mode 100644 index 71ef66e..0000000 --- a/test/generated/full/quoteAccount/quoteAccount.models.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { z } from "zod"; - -export namespace QuoteAccountModels { -/** - * QuoteAccountItemTypeEnumSchema - * @type { enum } - */ -export const QuoteAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); -export type QuoteAccountItemTypeEnum = z.infer; -export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; - -/** - * QuoteChargeDtoResponseSchema - * @type { object } - * @property { object } chargeType - * @property { string } chargeType.id - * @property { string } chargeType.name - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { object } buyVatRule - * @property { string } buyVatRule.id - * @property { string } buyVatRule.name - * @property { string } buyVatRule.matchcode - * @property { string } buyVatRule.printCode - * @property { object } vendor - * @property { string } vendor.id - * @property { string } vendor.name - * @property { string } vendor.matchCode - * @property { string } vendor.label - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { object } sellVatRule - * @property { string } sellVatRule.id - * @property { string } sellVatRule.name - * @property { string } sellVatRule.matchcode - * @property { string } sellVatRule.printCode - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - * @property { number } profit Profit amount - */ -export const QuoteChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).readonly(), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().describe("Quantity of the charge").nullish(), buyRate: z.number().describe("Buy rate amount").nullish(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }).readonly(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy").nullish(), sellRate: z.number().describe("Sell rate amount").nullish(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }).readonly(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }).readonly(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy").nullish(), profit: z.number().describe("Profit amount").nullish() }).readonly(); -export type QuoteChargeDtoResponse = z.infer; - -/** - * QuoteTextDtoResponseSchema - * @type { object } - * @property { string } content Text content - */ -export const QuoteTextDtoResponseSchema = z.object({ content: z.string().describe("Text content") }).readonly(); -export type QuoteTextDtoResponse = z.infer; - -/** - * QuoteAccountItemDtoResponseSchema - * @type { object } - * @property { string } id Item ID - * @property { QuoteAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE - * @property { QuoteTextDtoResponse } text Text data if type is TEXT - */ -export const QuoteAccountItemDtoResponseSchema = z.object({ id: z.string().describe("Item ID"), type: QuoteAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item"), charge: QuoteChargeDtoResponseSchema.describe("Charge data if type is CHARGE").nullish(), text: QuoteTextDtoResponseSchema.describe("Text data if type is TEXT").nullish() }).readonly(); -export type QuoteAccountItemDtoResponse = z.infer; - -/** - * QuoteAccountResponseDtoSchema - * @type { object } - * @property { string } id Account ID - * @property { string } quoteId Quote ID - * @property { QuoteAccountItemDtoResponse[] } items Account items - * @property { object } totals Account totals - * @property { number } totals.totalBuyRates - * @property { number } totals.totalSellRates - * @property { number } totals.totalProfit - * @property { number } totals.displayAmount - * @property { string } totals.displayCurrencyCode - * @property { object[] } totalsPerCurrency Account totals per currency - * @property { number } totalsPerCurrency.[0].totalBuyRates - * @property { number } totalsPerCurrency.[0].totalSellRates - * @property { number } totalsPerCurrency.[0].totalProfit - * @property { number } totalsPerCurrency.[0].displayAmount - * @property { string } totalsPerCurrency.[0].displayCurrencyCode - */ -export const QuoteAccountResponseDtoSchema = z.object({ id: z.string().describe("Account ID"), quoteId: z.string().describe("Quote ID"), items: z.array(QuoteAccountItemDtoResponseSchema).readonly().describe("Account items"), totals: z.object({ totalBuyRates: z.number(), totalSellRates: z.number(), totalProfit: z.number(), displayAmount: z.number(), displayCurrencyCode: z.string() }).readonly().describe("Account totals"), totalsPerCurrency: z.array(z.object({ totalBuyRates: z.number(), totalSellRates: z.number(), totalProfit: z.number(), displayAmount: z.number(), displayCurrencyCode: z.string() }).readonly()).readonly().describe("Account totals per currency") }).readonly(); -export type QuoteAccountResponseDto = z.infer; - -/** - * CreateQuoteChargeDataDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1`. Default: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code. Default: `EUR` - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code. Default: `EUR` - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const CreateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge").default(1), buyRate: z.number().describe("Buy rate amount"), buyCurrencyCode: z.string().describe("Buy rate currency code").default("EUR"), buyVatRuleId: z.string().describe("Buy VAT rule ID"), vendorId: z.string().describe("Vendor ID"), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount"), sellCurrencyCode: z.string().describe("Sell rate currency code").default("EUR"), sellVatRuleId: z.string().describe("Sell VAT rule ID"), customerId: z.string().describe("Customer ID"), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); -export type CreateQuoteChargeDataDto = z.infer; - -/** - * CreateQuoteTextDataDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const CreateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); -export type CreateQuoteTextDataDto = z.infer; - -/** - * CreateQuoteAccountItemRequestDtoSchema - * @type { object } - * @property { QuoteAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { CreateQuoteChargeDataDto } charge Charge data if type is CHARGE - * @property { CreateQuoteTextDataDto } text Text data if type is TEXT - */ -export const CreateQuoteAccountItemRequestDtoSchema = z.object({ type: QuoteAccountItemTypeEnumSchema.describe("Item type"), orderPosition: z.number().describe("Order position of the item").nullish(), charge: CreateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE").nullish(), text: CreateQuoteTextDataDtoSchema.describe("Text data if type is TEXT").nullish() }).readonly(); -export type CreateQuoteAccountItemRequestDto = z.infer; - -/** - * UpdateQuoteChargeDataDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const UpdateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), additionalText: z.string().describe("Additional text for the charge"), quantity: z.number().gte(1).describe("Quantity of the charge"), buyRate: z.number().describe("Buy rate amount").nullable(), buyCurrencyCode: z.string().describe("Buy rate currency code"), buyVatRuleId: z.string().describe("Buy VAT rule ID").nullable(), vendorId: z.string().describe("Vendor ID").nullable(), buyExchangeRate: z.number().describe("Buy exchange rate with up to 4 decimal places accuracy"), sellRate: z.number().describe("Sell rate amount").nullable(), sellCurrencyCode: z.string().describe("Sell rate currency code"), sellVatRuleId: z.string().describe("Sell VAT rule ID").nullable(), customerId: z.string().describe("Customer ID").nullable(), sellExchangeRate: z.number().describe("Sell exchange rate with up to 4 decimal places accuracy") }).readonly(); -export type UpdateQuoteChargeDataDto = z.infer; - -/** - * UpdateQuoteTextDataDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const UpdateQuoteTextDataDtoSchema = z.object({ content: z.string().describe("Text content") }).readonly(); -export type UpdateQuoteTextDataDto = z.infer; - -/** - * UpdateQuoteAccountItemRequestDtoSchema - * @type { object } - * @property { number } orderPosition Order position of the item - * @property { UpdateQuoteChargeDataDto } charge Charge data if type is CHARGE - * @property { UpdateQuoteTextDataDto } text Text data if type is TEXT - */ -export const UpdateQuoteAccountItemRequestDtoSchema = z.object({ orderPosition: z.number().describe("Order position of the item"), charge: UpdateQuoteChargeDataDtoSchema.describe("Charge data if type is CHARGE"), text: UpdateQuoteTextDataDtoSchema.describe("Text data if type is TEXT") }).readonly(); -export type UpdateQuoteAccountItemRequestDto = z.infer; - -} diff --git a/test/generated/full/quoteAccount/quoteAccount.queries.ts b/test/generated/full/quoteAccount/quoteAccount.queries.ts deleted file mode 100644 index 69c6456..0000000 --- a/test/generated/full/quoteAccount/quoteAccount.queries.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteAccountAcl } from "./quoteAccount.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteAccountModels } from "./quoteAccount.models"; -import { QuoteAccountApi } from "./quoteAccount.api"; - -export namespace QuoteAccountQueries { -export const moduleName = QueryModule.QuoteAccount; - -export const keys = { - all: [moduleName] as const, - get: (quoteId: string, officeId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account", quoteId, officeId] as const, -}; - -/** - * Query `useGet` - * @summary Get quote account details - * @permission Requires `canUseGet` ability - * @param { string } object.quoteId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ quoteId, officeId }: { quoteId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(quoteId, officeId), - queryFn: () => { - checkAcl(QuoteAccountAcl.canUseGet({ officeId } )); - return QuoteAccountApi.get(quoteId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useCreateItem` - * @summary Create quote account item - * @permission Requires `canUseCreateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { QuoteAccountModels.CreateQuoteAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, officeId, data }) => { - checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId } )); - return QuoteAccountApi.createItem(quoteId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteItem` - * @summary Delete quote account item - * @permission Requires `canUseDeleteItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId }) => { - checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId } )); - return QuoteAccountApi.deleteItem(quoteId, itemId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateItem` - * @summary Update quote account item - * @permission Requires `canUseUpdateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { QuoteAccountModels.UpdateQuoteAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId, data }) => { - checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId } )); - return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicateItem` - * @summary Duplicate quote account item - * @permission Requires `canUseDuplicateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicateItem = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId }) => { - checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId } )); - return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/quoteCargo/quoteCargo.acl.ts b/test/generated/full/quoteCargo/quoteCargo.acl.ts deleted file mode 100644 index 38031c0..0000000 --- a/test/generated/full/quoteCargo/quoteCargo.acl.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteCargoAcl { -/** - * Use for `useListCargosByQuoteId` query ability. For global ability, omit the object parameter. - * @description List cargo items by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByQuoteId` query - */ -export const canUseListCargosByQuoteId = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. - * @description List cargo labels by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query - */ -export const canUseListCargoLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. - * @description Get cargo summary by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query - */ -export const canUseGetCargoSummary = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. - * @description Get cargo item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query - */ -export const canUseGetCargoById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. - * @description Update cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation - */ -export const canUseUpdateCargo = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation - */ -export const canUseDeleteCargo = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation - */ -export const canUseCreateBulkCargos = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation - */ -export const canUseDuplicateCargo = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/full/quoteCargo/quoteCargo.api.ts b/test/generated/full/quoteCargo/quoteCargo.api.ts deleted file mode 100644 index dc2e9a4..0000000 --- a/test/generated/full/quoteCargo/quoteCargo.api.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteCargoModels } from "./quoteCargo.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoApi { -export const listCargosByQuoteId = (officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos`, - { - ...config, - params: { - order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listCargoLabels = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, - config - ) -}; -export const getCargoSummary = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, - config - ) -}; -export const getCargoById = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - config - ) -}; -export const updateCargo = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - config - ) -}; -export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - undefined, - config - ) -}; -export const createBulkCargos = (numberOfCargos: number, officeId: string, quoteId: string, data: CommonModels.CreatePositionCargoDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - config - ) -}; -export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/quoteCargo/quoteCargo.configs.ts b/test/generated/full/quoteCargo/quoteCargo.configs.ts deleted file mode 100644 index bbd862c..0000000 --- a/test/generated/full/quoteCargo/quoteCargo.configs.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoQueries } from "./quoteCargo.queries"; -import { QuoteCargoAcl } from "./quoteCargo.acl"; - -export namespace QuoteCargoConfigs { -export const cargosConfig = { - meta: { - title: "Cargos", - }, - readAll: { - acl: QuoteCargoAcl.canUseListCargosByQuoteId, - schema: CommonModels.PositionCargoResponseDTOSchema, - paginated: QuoteCargoQueries.useListCargosByQuoteId, - infinite: QuoteCargoQueries.useListCargosByQuoteIdInfinite, - columns: dynamicColumns({ - schema: CommonModels.PositionCargoResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - quoteId: true, - rootFolderId: true, - cargoType: true, - autoCalculateTotals: true, - autoCalculateRates: true, - autoCalculateVgm: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - rateOptions: true, - rateClass: true, - textForCustoms: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - ratePerKg: true, - totalRate: true, - tare: true, - vgm: true, - hsCodeLabels: true, - note: true, - packages: true, - createdAt: true, - updatedAt: true, - completeWeight: true, - packageTotals: true, - }, - }, -}), - }, - read: { - acl: QuoteCargoAcl.canUseGetCargoById, - schema: CommonModels.PositionCargoResponseDTOSchema, - query: QuoteCargoQueries.useGetCargoById, - }, - update: { - acl: QuoteCargoAcl.canUseUpdateCargo, - schema: CommonModels.UpdatePositionCargoDTOSchema, - mutation: QuoteCargoQueries.useUpdateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.UpdatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, -}) - }, - delete: { - acl: QuoteCargoAcl.canUseDeleteCargo, - mutation: QuoteCargoQueries.useDeleteCargo, - }, -}; - -} diff --git a/test/generated/full/quoteCargo/quoteCargo.models.ts b/test/generated/full/quoteCargo/quoteCargo.models.ts deleted file mode 100644 index 6520815..0000000 --- a/test/generated/full/quoteCargo/quoteCargo.models.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoModels { -/** - * ListCargosByQuoteIdOrderParamSchema - * @type { array } - * @description Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - */ -export const ListCargosByQuoteIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).readonly().describe("Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt").nullish(); -export type ListCargosByQuoteIdOrderParam = z.infer; - -/** - * ListCargosByQuoteIdResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.PositionCargoResponseDTO[] } items - */ -export const ListCargosByQuoteIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).readonly() }).readonly().shape }); -export type ListCargosByQuoteIdResponse = z.infer; - -/** - * QuoteCargoListCargoLabelsResponseSchema - * @type { array } - */ -export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema).readonly(); -export type QuoteCargoListCargoLabelsResponse = z.infer; - -/** - * QuoteCargoGetCargoSummaryResponseSchema - * @type { array } - */ -export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema).readonly(); -export type QuoteCargoGetCargoSummaryResponse = z.infer; - -/** - * QuoteCargoCreateBulkCargosResponseSchema - * @type { array } - */ -export const QuoteCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema).readonly(); -export type QuoteCargoCreateBulkCargosResponse = z.infer; - -} diff --git a/test/generated/full/quoteCargo/quoteCargo.queries.ts b/test/generated/full/quoteCargo/quoteCargo.queries.ts deleted file mode 100644 index 792ae63..0000000 --- a/test/generated/full/quoteCargo/quoteCargo.queries.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteCargoAcl } from "./quoteCargo.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteCargoModels } from "./quoteCargo.models"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoApi } from "./quoteCargo.api"; - -export namespace QuoteCargoQueries { -export const moduleName = QueryModule.QuoteCargo; - -export const keys = { - all: [moduleName] as const, - listCargosByQuoteId: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", officeId, quoteId, limit, order, page, cursor] as const, - listCargosByQuoteIdInfinite: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", "infinite", officeId, quoteId, limit, order, cursor] as const, - listCargoLabels: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/labels", officeId, quoteId] as const, - getCargoSummary: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/summary", officeId, quoteId] as const, - getCargoById: (officeId: string, quoteId: string, cargoId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/:cargoId", officeId, quoteId, cargoId] as const, -}; - -/** - * Query `useListCargosByQuoteId` - * @summary List all cargo items for a quote - * @permission Requires `canUseListCargosByQuoteId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByQuoteId = ({ officeId, quoteId, limit, order, page, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListCargosByQuoteIdInfinite - * @summary List all cargo items for a quote - * @permission Requires `canUseListCargosByQuoteId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByQuoteIdInfinite = ({ officeId, quoteId, limit, order, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListCargoLabels` - * @summary List all cargo labels for a quote - * @permission Requires `canUseListCargoLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargoLabels = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargoLabels(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId } )); - return QuoteCargoApi.listCargoLabels(officeId, quoteId, config) }, - ...options, - }); -}; - -/** - * Query `useGetCargoSummary` - * @summary Get cargo summary grouped by transport unit type - * @permission Requires `canUseGetCargoSummary` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoSummary = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoSummary(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId } )); - return QuoteCargoApi.getCargoSummary(officeId, quoteId, config) }, - ...options, - }); -}; - -/** - * Query `useGetCargoById` - * @summary Get a specific cargo item - * @permission Requires `canUseGetCargoById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { string } object.cargoId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoById = ({ officeId, quoteId, cargoId }: { officeId: string, quoteId: string, cargoId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoById(officeId, quoteId, cargoId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId } )); - return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCargo` - * @summary Update a cargo item - * @permission Requires `canUseUpdateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, data }) => { - checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId } )); - return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteCargo` - * @summary Delete a cargo item - * @permission Requires `canUseDeleteCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId }) => { - checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId } )); - return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateBulkCargos` - * @summary Create a new cargo item - * @permission Requires `canUseCreateBulkCargos` ability - * @param { number } mutation.numberOfCargos Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { - checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId } )); - return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicateCargo` - * @summary Duplicate a cargo item - * @permission Requires `canUseDuplicateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId }) => { - checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId } )); - return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/quoteCargoPackage/quoteCargoPackage.acl.ts b/test/generated/full/quoteCargoPackage/quoteCargoPackage.acl.ts deleted file mode 100644 index da1d43f..0000000 --- a/test/generated/full/quoteCargoPackage/quoteCargoPackage.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteCargoPackageAcl { -/** - * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. - * @description Create cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation - */ -export const canUseCreatePackage = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. - * @description Update cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation - */ -export const canUseUpdatePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation - */ -export const canUseDeletePackage = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation - */ -export const canUseDuplicatePackage = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. - * @description Move cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation - */ -export const canUseMovePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/full/quoteCargoPackage/quoteCargoPackage.api.ts b/test/generated/full/quoteCargoPackage/quoteCargoPackage.api.ts deleted file mode 100644 index 17b3e8f..0000000 --- a/test/generated/full/quoteCargoPackage/quoteCargoPackage.api.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoPackageApi { -export const createPackage = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, - ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - config - ) -}; -export const updatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - config - ) -}; -export const deletePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - undefined, - config - ) -}; -export const duplicatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - undefined, - config - ) -}; -export const movePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, - ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/quoteCargoPackage/quoteCargoPackage.queries.ts b/test/generated/full/quoteCargoPackage/quoteCargoPackage.queries.ts deleted file mode 100644 index 722792e..0000000 --- a/test/generated/full/quoteCargoPackage/quoteCargoPackage.queries.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteCargoPackageAcl } from "./quoteCargoPackage.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoPackageApi } from "./quoteCargoPackage.api"; - -export namespace QuoteCargoPackageQueries { -export const moduleName = QueryModule.QuoteCargoPackage; - - - -/** - * Mutation `useCreatePackage` - * @summary Create a new package for a cargo - * @permission Requires `canUseCreatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId } )); - return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdatePackage` - * @summary Update a package - * @permission Requires `canUseUpdatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId } )); - return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePackage` - * @summary Delete a package - * @permission Requires `canUseDeletePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { - checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId } )); - return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicatePackage` - * @summary Duplicate a package - * @permission Requires `canUseDuplicatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { - checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId } )); - return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMovePackage` - * @summary Move a package to a different cargo - * @permission Requires `canUseMovePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId } )); - return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/quoteConversion/quoteConversion.acl.ts b/test/generated/full/quoteConversion/quoteConversion.acl.ts deleted file mode 100644 index 8c0f3c4..0000000 --- a/test/generated/full/quoteConversion/quoteConversion.acl.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteConversionAcl { -/** - * Use for `useConvertQuoteToPosition` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useConvertQuoteToPosition` mutation - */ -export const canUseConvertQuoteToPosition = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/full/quoteConversion/quoteConversion.api.ts b/test/generated/full/quoteConversion/quoteConversion.api.ts deleted file mode 100644 index 30eb85a..0000000 --- a/test/generated/full/quoteConversion/quoteConversion.api.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteConversionModels } from "./quoteConversion.models"; - -export namespace QuoteConversionApi { -export const convertQuoteToPosition = (officeId: string, quoteId: string, data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/convert`, - ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/quoteConversion/quoteConversion.models.ts b/test/generated/full/quoteConversion/quoteConversion.models.ts deleted file mode 100644 index 08987fb..0000000 --- a/test/generated/full/quoteConversion/quoteConversion.models.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { z } from "zod"; - -export namespace QuoteConversionModels { -/** - * ConvertQuoteToPositionRequestDtoSchema - * @type { object } - * @property { string } estimatedServiceDate - */ -export const ConvertQuoteToPositionRequestDtoSchema = z.object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }).readonly(); -export type ConvertQuoteToPositionRequestDto = z.infer; - -} diff --git a/test/generated/full/quoteConversion/quoteConversion.queries.ts b/test/generated/full/quoteConversion/quoteConversion.queries.ts deleted file mode 100644 index 9fbcf1d..0000000 --- a/test/generated/full/quoteConversion/quoteConversion.queries.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteConversionAcl } from "./quoteConversion.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteConversionModels } from "./quoteConversion.models"; -import { QuoteConversionApi } from "./quoteConversion.api"; - -export namespace QuoteConversionQueries { -export const moduleName = QueryModule.QuoteConversion; - - - -/** - * Mutation `useConvertQuoteToPosition` - * @summary Convert quote to position - * @permission Requires `canUseConvertQuoteToPosition` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteConversionModels.ConvertQuoteToPositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Quote converted to position successfully - * @statusCodes [201, 400, 401, 404] - */ -export const useConvertQuoteToPosition = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId } )); - return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/quoteDocument/quoteDocument.acl.ts b/test/generated/full/quoteDocument/quoteDocument.acl.ts deleted file mode 100644 index 43dec1f..0000000 --- a/test/generated/full/quoteDocument/quoteDocument.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteDocumentAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGetPreview` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` mutation - */ -export const canUseGetPreview = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGenerateEml` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateEml` mutation - */ -export const canUseGenerateEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/full/quoteDocument/quoteDocument.api.ts b/test/generated/full/quoteDocument/quoteDocument.api.ts deleted file mode 100644 index b5f9bfb..0000000 --- a/test/generated/full/quoteDocument/quoteDocument.api.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteDocumentModels } from "./quoteDocument.models"; - -export namespace QuoteDocumentApi { -export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/document`, - config - ) -}; -export const update = (officeId: string, quoteId: string, data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/document`, - ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), - config - ) -}; -export const getPreview = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/${quoteId}/document/preview`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generate = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/document/generate`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - config - ) -}; -export const generateEml = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/${quoteId}/document/eml`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/full/quoteDocument/quoteDocument.models.ts b/test/generated/full/quoteDocument/quoteDocument.models.ts deleted file mode 100644 index 8362f3f..0000000 --- a/test/generated/full/quoteDocument/quoteDocument.models.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteDocumentModels { -/** - * QuoteDocumentDataDtoSchema - * @type { object } - * @property { CommonModels.RouteTableBlockResponseDto } routeTable - * @property { CommonModels.CargoTableBlockDto } cargoTable - * @property { CommonModels.FinanceTableBlockDto } financeTable - */ -export const QuoteDocumentDataDtoSchema = z.object({ routeTable: CommonModels.RouteTableBlockResponseDtoSchema, cargoTable: CommonModels.CargoTableBlockDtoSchema, financeTable: CommonModels.FinanceTableBlockDtoSchema }).readonly(); -export type QuoteDocumentDataDto = z.infer; - -/** - * QuoteDocumentConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl - * @property { string } headerImageUrl - * @property { string } termsAndConditionsImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ -export const QuoteDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), termsAndConditionsImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }).readonly(); -export type QuoteDocumentConfigDto = z.infer; - -/** - * CustomerDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - */ -export const CustomerDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); -export type CustomerDto = z.infer; - -/** - * ContactDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } phone - * @property { string } date - * @property { string } validFrom - * @property { string } validUntil - */ -export const ContactDtoSchema = z.object({ name: z.string(), email: z.string(), phone: z.string(), date: z.iso.datetime({ offset: true }), validFrom: z.iso.datetime({ offset: true }).nullish(), validUntil: z.iso.datetime({ offset: true }).nullish() }).readonly(); -export type ContactDto = z.infer; - -/** - * QuoteDocumentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } quoteId - * @property { string } quoteNumber - * @property { CommonModels.TransportModeEnum } quoteTransportMode Mode of transport - * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote - * @property { string } transitDurationInDays Transit duration in days - * @property { CustomerDto } customer - * @property { ContactDto } contact - * @property { QuoteDocumentDataDto } data - * @property { boolean } suspendCargoTable - * @property { boolean } suspendFinanceTable - * @property { CommonModels.EditorContentResponseDto } bodyRemarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks - * @property { boolean } isIssued - * @property { number } version - * @property { QuoteDocumentConfigDto } config - * @property { string } issuedAt - */ -export const QuoteDocumentResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), quoteNumber: z.string(), quoteTransportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), transitDurationInDays: z.string().describe("Transit duration in days").nullish(), customer: CustomerDtoSchema, contact: ContactDtoSchema, data: QuoteDocumentDataDtoSchema.nullish(), suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), isIssued: z.boolean(), version: z.number(), config: QuoteDocumentConfigDtoSchema.nullish(), issuedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); -export type QuoteDocumentResponseDto = z.infer; - -/** - * QuoteDocumentDataUpdateDtoSchema - * @type { object } - * @property { CommonModels.RouteTableUpdateBlockDto } routeTable - * @property { CommonModels.CargoTableBlockUpdateDto } cargoTable - * @property { CommonModels.FinanceTableBlockUpdateDto } financeTable - */ -export const QuoteDocumentDataUpdateDtoSchema = z.object({ routeTable: CommonModels.RouteTableUpdateBlockDtoSchema, cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema, financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema }).readonly(); -export type QuoteDocumentDataUpdateDto = z.infer; - -/** - * CustomerUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - */ -export const CustomerUpdateDtoSchema = z.object({ name: z.string(), address: z.string() }).readonly(); -export type CustomerUpdateDto = z.infer; - -/** - * ContactUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } phone - * @property { string } date - */ -export const ContactUpdateDtoSchema = z.object({ name: z.string(), email: z.email(), phone: z.string(), date: z.iso.datetime({ offset: true }) }).readonly(); -export type ContactUpdateDto = z.infer; - -/** - * UpdateQuoteDocumentRequestDtoSchema - * @type { object } - * @property { CustomerUpdateDto } customer - * @property { ContactUpdateDto } contact - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks - * @property { boolean } suspendCargoTable - * @property { boolean } suspendFinanceTable - * @property { QuoteDocumentDataUpdateDto } data - */ -export const UpdateQuoteDocumentRequestDtoSchema = z.object({ customer: CustomerUpdateDtoSchema, contact: ContactUpdateDtoSchema, bodyRemarks: CommonModels.EditorContentUpdateDtoSchema, footerRemarks: CommonModels.EditorContentUpdateDtoSchema, suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), data: QuoteDocumentDataUpdateDtoSchema }).readonly(); -export type UpdateQuoteDocumentRequestDto = z.infer; - -/** - * GenerateQuoteDocumentPreviewRequestDtoSchema - * @type { object } - * @property { string } issuedAt - */ -export const GenerateQuoteDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type GenerateQuoteDocumentPreviewRequestDto = z.infer; - -/** - * GenerateQuoteDocumentRequestDtoSchema - * @type { object } - * @property { string } issuedAt - * @property { string } fileName - */ -export const GenerateQuoteDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }).readonly(); -export type GenerateQuoteDocumentRequestDto = z.infer; - -} diff --git a/test/generated/full/quoteDocument/quoteDocument.queries.ts b/test/generated/full/quoteDocument/quoteDocument.queries.ts deleted file mode 100644 index fd43c96..0000000 --- a/test/generated/full/quoteDocument/quoteDocument.queries.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteDocumentAcl } from "./quoteDocument.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteDocumentModels } from "./quoteDocument.models"; -import { QuoteDocumentApi } from "./quoteDocument.api"; - -export namespace QuoteDocumentQueries { -export const moduleName = QueryModule.QuoteDocument; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/document", officeId, quoteId] as const, -}; - -/** - * Query `useGet` - * @summary Get quote document - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteDocumentAcl.canUseGet({ officeId } )); - return QuoteDocumentApi.get(officeId, quoteId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update quote document - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.UpdateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId } )); - return QuoteDocumentApi.update(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGetPreview` - recommended when file should not be cached - * @summary Get quote document pdf preview - * @permission Requires `canUseGetPreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGetPreview = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId } )); - return QuoteDocumentApi.getPreview(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerate` - * @summary Get quote document pdf preview - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId } )); - return QuoteDocumentApi.generate(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateEml` - recommended when file should not be cached - * @summary Generate quote document and return EML file - * @permission Requires `canUseGenerateEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId } )); - return QuoteDocumentApi.generateEml(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts deleted file mode 100644 index 24ebb81..0000000 --- a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteProfitChangeTrackingAcl { -/** - * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. - * @description List quote profit change groups - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.quoteId quoteId from quoteId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query - */ -export const canUseFindProfitChangeGroups = ( - object?: { officeId: string, quoteId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; - -/** - * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. - * @description Get quote profit change group details - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.quoteId quoteId from quoteId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query - */ -export const canUseFindProfitChangeGroupDetail = ( - object?: { officeId: string, quoteId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; - -} diff --git a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts deleted file mode 100644 index aa8e7c0..0000000 --- a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; - -export namespace QuoteProfitChangeTrackingApi { -export const findProfitChangeGroups = (officeId: string, quoteId: string, limit: number, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, - { - ...config, - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findProfitChangeGroupDetail = (groupId: string, officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, - config - ) -}; -} diff --git a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts deleted file mode 100644 index 169ba81..0000000 --- a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { dynamicColumns } from "@povio/ui"; -import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; -import { QuoteProfitChangeTrackingQueries } from "./quoteProfitChangeTracking.queries"; -import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; - -export namespace QuoteProfitChangeTrackingConfigs { -export const profitChangeGroupsConfig = { - meta: { - title: "Profit Change Groups", - }, - readAll: { - acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups, - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, - paginated: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroups, - infinite: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, - columns: dynamicColumns({ - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, - options: { - columns: { - id: true, - timestamp: true, - users: true, - profit: true, - changeCount: true, - }, - }, -}), - }, - read: { - acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema, - query: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, - }, -}; - -} diff --git a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts deleted file mode 100644 index a87cf72..0000000 --- a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteProfitChangeTrackingModels { -/** - * QuoteAccountProfitChangeGroupDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto[] } users - * @property { object } profit - * @property { number } profit.amount - * @property { string } profit.currencyCode - * @property { number } changeCount - */ -export const QuoteAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema).readonly(), profit: z.object({ amount: z.number(), currencyCode: z.string() }).readonly(), changeCount: z.number() }).readonly(); -export type QuoteAccountProfitChangeGroupDto = z.infer; - -/** - * QuoteAccountProfitChangeEntryDtoSchema - * @type { object } - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto } user - * @property { number } changeNumber - * @property { number } oldProfit - * @property { number } newProfit - * @property { string } currencyCode - */ -export const QuoteAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }).readonly(); -export type QuoteAccountProfitChangeEntryDto = z.infer; - -/** - * QuoteAccountProfitChangeGroupDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { string } currencyCode - * @property { QuoteAccountProfitChangeEntryDto[] } entries - */ -export const QuoteAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(QuoteAccountProfitChangeEntryDtoSchema).readonly() }).readonly(); -export type QuoteAccountProfitChangeGroupDetailDto = z.infer; - -/** - * QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { QuoteAccountProfitChangeGroupDto[] } items - */ -export const QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(QuoteAccountProfitChangeGroupDtoSchema).readonly() }).readonly().shape }); -export type QuoteProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; - -} diff --git a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts b/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts deleted file mode 100644 index 380a658..0000000 --- a/test/generated/full/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { QuoteProfitChangeTrackingApi } from "./quoteProfitChangeTracking.api"; - -export namespace QuoteProfitChangeTrackingQueries { -export const moduleName = QueryModule.QuoteProfitChangeTracking; - -export const keys = { - all: [moduleName] as const, - findProfitChangeGroups: (officeId: string, quoteId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", officeId, quoteId, limit, page, cursor] as const, - findProfitChangeGroupsInfinite: (officeId: string, quoteId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", "infinite", officeId, quoteId, limit, cursor] as const, - findProfitChangeGroupDetail: (groupId: string, officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups/:groupId", groupId, officeId, quoteId] as const, -}; - -/** - * Query `useFindProfitChangeGroups` - * @summary List quote profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroups = ({ officeId, quoteId, limit, page, cursor }: { officeId: string, quoteId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), - queryFn: () => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useFindProfitChangeGroupsInfinite - * @summary List quote profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupsInfinite = ({ officeId, quoteId, limit, cursor }: { officeId: string, quoteId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindProfitChangeGroupDetail` - * @summary Get quote profit change group details - * @permission Requires `canUseFindProfitChangeGroupDetail` ability - * @param { string } object.groupId Path parameter - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupDetail = ({ groupId, officeId, quoteId }: { groupId: string, officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), - queryFn: () => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/quoteRoutes/quoteRoutes.acl.ts b/test/generated/full/quoteRoutes/quoteRoutes.acl.ts deleted file mode 100644 index 23e12ea..0000000 --- a/test/generated/full/quoteRoutes/quoteRoutes.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteRoutesAcl { -/** - * Use for `useListRoutes` query ability. For global ability, omit the object parameter. - * @description List quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query - */ -export const canUseListRoutes = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Create quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation - */ -export const canUseCreateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Update quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation - */ -export const canUseUpdateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Delete quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation - */ -export const canUseDeleteRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. - * @description Split quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation - */ -export const canUseSplitRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. - * @description Merge quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation - */ -export const canUseMergeRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. - * @description Copy quote route points - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation - */ -export const canUseCopyRoute = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/full/quoteRoutes/quoteRoutes.api.ts b/test/generated/full/quoteRoutes/quoteRoutes.api.ts deleted file mode 100644 index ac83816..0000000 --- a/test/generated/full/quoteRoutes/quoteRoutes.api.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteRoutesApi { -export const listRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: CommonModels.RouteListResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes`, - config - ) -}; -export const createRoutePoint = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, - ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - config - ) -}; -export const updateRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - config - ) -}; -export const deleteRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - undefined, - config - ) -}; -export const splitRoutes = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/split`, - undefined, - config - ) -}; -export const mergeRoutes = (officeId: string, quoteId: string, data: CommonModels.MergeRoutesRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/merge`, - ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - config - ) -}; -export const copyRoute = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, - ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/quoteRoutes/quoteRoutes.queries.ts b/test/generated/full/quoteRoutes/quoteRoutes.queries.ts deleted file mode 100644 index e7634ea..0000000 --- a/test/generated/full/quoteRoutes/quoteRoutes.queries.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteRoutesAcl } from "./quoteRoutes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteRoutesApi } from "./quoteRoutes.api"; - -export namespace QuoteRoutesQueries { -export const moduleName = QueryModule.QuoteRoutes; - -export const keys = { - all: [moduleName] as const, - listRoutes: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/routes", officeId, quoteId] as const, -}; - -/** - * Query `useListRoutes` - * @summary List routes with points for a quote - * @permission Requires `canUseListRoutes` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoutes = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoutes(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId } )); - return QuoteRoutesApi.listRoutes(officeId, quoteId, config) }, - ...options, - }); -}; - -/** - * Mutation `useCreateRoutePoint` - * @summary Create a route point for a quote route - * @permission Requires `canUseCreateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, data }) => { - checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId } )); - return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateRoutePoint` - * @summary Update a route point for a quote route - * @permission Requires `canUseUpdateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { - checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId } )); - return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRoutePoint` - * @summary Delete a route point from a quote route - * @permission Requires `canUseDeleteRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, pointId }) => { - checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId } )); - return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useSplitRoutes` - * @summary Split quote routes by cargo (sea only) - * @permission Requires `canUseSplitRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId }) => { - checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId } )); - return QuoteRoutesApi.splitRoutes(officeId, quoteId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMergeRoutes` - * @summary Merge quote cargo routes into single route (sea only) - * @permission Requires `canUseMergeRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId } )); - return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopyRoute` - * @summary Copy route points from one route to another (sea only) - * @permission Requires `canUseCopyRoute` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, data }) => { - checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId } )); - return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/quotes/quotes.acl.ts b/test/generated/full/quotes/quotes.acl.ts deleted file mode 100644 index d7f98e9..0000000 --- a/test/generated/full/quotes/quotes.acl.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuotesAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ -export const canUseListAvailablePartnersFor = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useExportQuotes` mutation ability. For global ability, omit the object parameter. - * @description Export quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportQuotes` mutation - */ -export const canUseExportQuotes = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Get quote by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ -export const canUseCancel = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Duplicate quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ -export const canUseDuplicate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGetInvolvedParties` query ability. For global ability, omit the object parameter. - * @description Get involved parties for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvolvedParties` query - */ -export const canUseGetInvolvedParties = ( - object?: { officeId: string, } -) => [ - "ReadInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreateInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Create involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateInvolvedParty` mutation - */ -export const canUseCreateInvolvedParty = ( - object?: { officeId: string, } -) => [ - "CreateInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdateInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Update involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateInvolvedParty` mutation - */ -export const canUseUpdateInvolvedParty = ( - object?: { officeId: string, } -) => [ - "UpdateInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDeleteInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Delete involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvolvedParty` mutation - */ -export const canUseDeleteInvolvedParty = ( - object?: { officeId: string, } -) => [ - "DeleteInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/full/quotes/quotes.api.ts b/test/generated/full/quotes/quotes.api.ts deleted file mode 100644 index 0e682d4..0000000 --- a/test/generated/full/quotes/quotes.api.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuotesModels } from "./quotes.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuotesApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuotesPaginateResponseSchema }, - `/offices/${officeId}/quotes`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes`, - ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), - config - ) -}; -export const listAvailablePartnersFor = (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/available-partners`, - { - ...config, - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), - }, - } - ) -}; -export const exportQuotes = (officeId: string, data: QuotesModels.QuoteExportRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/exports`, - ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getById = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}`, - config - ) -}; -export const update = (officeId: string, quoteId: string, data: QuotesModels.UpdateQuoteRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}`, - ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), - config - ) -}; -export const cancel = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cancel`, - undefined, - config - ) -}; -export const duplicate = (officeId: string, quoteId: string, data: QuotesModels.DuplicateQuoteRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/duplicate`, - ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), - config - ) -}; -export const getInvolvedParties = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - config - ) -}; -export const createInvolvedParty = (officeId: string, quoteId: string, data: CommonModels.CreateInvolvedPartyRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - config - ) -}; -export const updateInvolvedParty = (officeId: string, quoteId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - config - ) -}; -export const deleteInvolvedParty = (officeId: string, quoteId: string, partyId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/quotes/quotes.configs.ts b/test/generated/full/quotes/quotes.configs.ts deleted file mode 100644 index e288ac4..0000000 --- a/test/generated/full/quotes/quotes.configs.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { QuotesModels } from "./quotes.models"; -import { QuotesQueries } from "./quotes.queries"; -import { QuotesAcl } from "./quotes.acl"; - -export namespace QuotesConfigs { -export const quotesConfig = { - meta: { - title: "Quotes", - }, - readAll: { - acl: QuotesAcl.canUsePaginate, - schema: QuotesModels.QuotePreviewResponseDTOSchema, - paginated: QuotesQueries.usePaginate, - infinite: QuotesQueries.usePaginateInfinite, - filters: { - schema: QuotesModels.QuoteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: QuotesModels.QuoteFilterDtoSchema, - options: { - inputs: { - statusDate: true, - transportMode: true, - status: true, - direction: true, - loadType: true, - serviceType: true, - carrierId: true, - consigneeId: true, - employee: true, - routing: true, - number: true, - createdAt: true, - vesselCarrier: true, - searchQuery: true, - customer: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: QuotesModels.QuotePreviewResponseDTOSchema, - options: { - columns: { - id: true, - transportMode: true, - statusDate: true, - createdAt: true, - number: true, - status: true, - direction: true, - loadType: true, - customer: true, - customerReference: true, - consignee: true, - consigneeReference: true, - carrier: true, - carrierReference: true, - employee: true, - origin: true, - destination: true, - portOfLoading: true, - dischargePort: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - equipment: true, - serviceType: true, - currency: true, - profit: true, - margin: true, - numberOfConvertedPositions: true, - departureDate: true, - arrivalDate: true, - routing: true, - }, - sortable: QuotesModels.QuotesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: QuotesAcl.canUseGetById, - schema: QuotesModels.QuoteCoreResponseDTOSchema, - query: QuotesQueries.useGetById, - }, - create: { - acl: QuotesAcl.canUseCreate, - schema: QuotesModels.CreateQuoteRequestDTOSchema, - mutation: QuotesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: QuotesModels.CreateQuoteRequestDTOSchema, - options: { - inputs: { - section: true, - direction: true, - transportMode: true, - loadType: true, - serviceType: true, - customerBusinessPartnerId: true, - }, - }, -}) - }, - update: { - acl: QuotesAcl.canUseUpdate, - schema: QuotesModels.UpdateQuoteRequestDTOSchema, - mutation: QuotesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: QuotesModels.UpdateQuoteRequestDTOSchema, - options: { - inputs: { - number: true, - statusDate: true, - cargoType: true, - loadType: true, - incoterms: true, - secondIncoterms: true, - serviceType: true, - buyRateReference: true, - frequency: true, - transitDurationInDays: true, - quoteType: true, - defaultCurrencyId: true, - salesRepId: true, - responsibleEmployeeId: true, - receivedByEmployeeId: true, - team: true, - volumetricWeightModifier: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/full/quotes/quotes.models.ts b/test/generated/full/quotes/quotes.models.ts deleted file mode 100644 index b02bfc0..0000000 --- a/test/generated/full/quotes/quotes.models.ts +++ /dev/null @@ -1,322 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuotesModels { -/** - * QuoteStatusEnumSchema - * @type { enum } - */ -export const QuoteStatusEnumSchema = z.enum(["Pending", "Cancelled", "Converted"]); -export type QuoteStatusEnum = z.infer; -export const QuoteStatusEnum = QuoteStatusEnumSchema.enum; - -/** - * QuoteCustomerResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { string } phone The phone number of the customer - * @property { string } email The email of the customer - */ -export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the customer"), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().describe("The phone number of the customer").nullish(), email: z.string().describe("The email of the customer").nullish() }).readonly(); -export type QuoteCustomerResponseDto = z.infer; - -/** - * QuoteNamedReferenceResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the entity - * @property { string } name Name of the entity - * @property { string } matchCode - * @property { string } label Display label (name or match code depending on office settings) - */ -export const QuoteNamedReferenceResponseDtoSchema = z.object({ id: z.string().describe("Unique identifier of the entity").nullable(), name: z.string().describe("Name of the entity").nullable(), matchCode: z.string().nullable(), label: z.string().describe("Display label (name or match code depending on office settings)").nullable() }).readonly(); -export type QuoteNamedReferenceResponseDto = z.infer; - -/** - * QuotePreviewResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the quote - * @property { CommonModels.TransportModeEnum } transportMode Transport mode - * @property { string } statusDate The date of the quote status - * @property { string } createdAt The date when the quote was created - * @property { string } number The quote number - * @property { QuoteStatusEnum } status Status of the quote - * @property { CommonModels.DirectionEnum } direction Direction of the quote - * @property { CommonModels.LoadTypeEnum } loadType Load type - * @property { QuoteCustomerResponseDto } customer The customer information - * @property { string } customerReference Customer reference number - * @property { QuoteNamedReferenceResponseDto } consignee Consignee information - * @property { string } consigneeReference Consignee reference number - * @property { QuoteNamedReferenceResponseDto } carrier The carrier - * @property { string } carrierReference Carrier reference number - * @property { QuoteNamedReferenceResponseDto } employee Responsible employee - * @property { QuoteNamedReferenceResponseDto } origin Origin location - * @property { QuoteNamedReferenceResponseDto } destination Destination location - * @property { QuoteNamedReferenceResponseDto } portOfLoading Port of loading - * @property { QuoteNamedReferenceResponseDto } dischargePort Discharge port - * @property { string } bookingNumber Booking reference number - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } vesselCarrier Carrier name from route point (sea positions only) - * @property { string } equipment Equipment summary (e.g., "2x20DC, 1x40HC") - * @property { CommonModels.ServiceTypeEnum } serviceType Service type - * @property { string } currency Currency code - * @property { number } profit Total profit - * @property { number } margin Profit margin percentage - * @property { number } numberOfConvertedPositions Number of positions converted from this quote - * @property { string } departureDate Departure date - * @property { string } arrivalDate Arrival date - * @property { CommonModels.SeaRoutingEnum } routing Sea routing type - */ -export const QuotePreviewResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status").nullable(), createdAt: z.iso.datetime({ offset: true }).describe("The date when the quote was created"), number: z.string().describe("The quote number"), status: QuoteStatusEnumSchema.describe("Status of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type").nullish(), customer: QuoteCustomerResponseDtoSchema.describe("The customer information"), customerReference: z.string().describe("Customer reference number").nullish(), consignee: QuoteNamedReferenceResponseDtoSchema.describe("Consignee information").nullish(), consigneeReference: z.string().describe("Consignee reference number").nullish(), carrier: QuoteNamedReferenceResponseDtoSchema.describe("The carrier").nullish(), carrierReference: z.string().describe("Carrier reference number").nullish(), employee: QuoteNamedReferenceResponseDtoSchema.describe("Responsible employee").nullish(), origin: QuoteNamedReferenceResponseDtoSchema.describe("Origin location"), destination: QuoteNamedReferenceResponseDtoSchema.describe("Destination location"), portOfLoading: QuoteNamedReferenceResponseDtoSchema.describe("Port of loading").nullish(), dischargePort: QuoteNamedReferenceResponseDtoSchema.describe("Discharge port").nullish(), bookingNumber: z.string().describe("Booking reference number").nullish(), vessel: z.string().describe("Vessel name").nullish(), voyage: z.string().describe("Voyage number").nullish(), vesselCarrier: z.string().describe("Carrier name from route point (sea positions only)").nullish(), equipment: z.string().describe("Equipment summary (e.g., "2x20DC, 1x40HC")").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.describe("Service type").nullish(), currency: z.string().describe("Currency code").nullish(), profit: z.number().describe("Total profit").nullish(), margin: z.number().describe("Profit margin percentage").nullish(), numberOfConvertedPositions: z.number().describe("Number of positions converted from this quote"), departureDate: z.iso.datetime({ offset: true }).describe("Departure date").nullish(), arrivalDate: z.iso.datetime({ offset: true }).describe("Arrival date").nullish(), routing: CommonModels.SeaRoutingEnumSchema.describe("Sea routing type").nullish() }).readonly(); -export type QuotePreviewResponseDTO = z.infer; - -/** - * QuoteFilterDtoSchema - * @type { object } - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.TransportModeEnum } transportMode - * @property { QuoteStatusEnum[] } status - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } carrierId Filter quotes by carrier IDs - * @property { string[] } consigneeId Filter quotes by consignee IDs - * @property { string[] } employee Filter quotes by employee IDs - * @property { CommonModels.SeaRoutingEnum } routing - * @property { string } number Filter quotes by quote number - * @property { CommonModels.DateRangeDto } createdAt - * @property { string } vesselCarrier Filter quotes by carrier name from route point - * @property { string } searchQuery - * @property { string[] } customer - */ -export const QuoteFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, carrierId: z.array(z.string()).readonly().describe("Filter quotes by carrier IDs"), consigneeId: z.array(z.string()).readonly().describe("Filter quotes by consignee IDs"), employee: z.array(z.string()).readonly().describe("Filter quotes by employee IDs"), routing: CommonModels.SeaRoutingEnumSchema, number: z.string().describe("Filter quotes by quote number"), createdAt: CommonModels.DateRangeDtoSchema, vesselCarrier: z.string().describe("Filter quotes by carrier name from route point"), searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); -export type QuoteFilterDto = z.infer; - -/** - * QuoteExportFilterDtoSchema - * @type { object } - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.TransportModeEnum } transportMode - * @property { QuoteStatusEnum[] } status - * @property { CommonModels.DirectionEnum } direction - * @property { string } searchQuery - * @property { string[] } customer - */ -export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema, transportMode: CommonModels.TransportModeEnumSchema, status: z.array(QuoteStatusEnumSchema).readonly(), direction: CommonModels.DirectionEnumSchema, searchQuery: z.string(), customer: z.array(z.string()).readonly() }).readonly(); -export type QuoteExportFilterDto = z.infer; - -/** - * QuoteExportColumnSchema - * @type { enum } - */ -export const QuoteExportColumnSchema = z.enum(["id", "transportMode", "statusDate", "createdAt", "number", "status", "direction", "loadType", "serviceType", "customerId", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeId", "consigneeName", "consigneeReference", "carrierId", "carrierName", "carrierReference", "responsibleEmployeeName", "originLocationId", "originLocationName", "destinationLocationId", "destinationLocationName", "portOfLoadingId", "portOfLoadingName", "dischargePortId", "dischargePortName", "bookingNumber", "vessel", "voyage", "equipment", "departureDate", "arrivalDate", "routing", "currency", "profit", "margin"]); -export type QuoteExportColumn = z.infer; -export const QuoteExportColumn = QuoteExportColumnSchema.enum; - -/** - * QuoteExportRequestDtoSchema - * @type { object } - * @property { QuoteExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { QuoteExportFilterDto } filter - */ -export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).readonly().min(1), order: z.array(z.string()).readonly(), filter: QuoteExportFilterDtoSchema }).readonly(); -export type QuoteExportRequestDto = z.infer; - -/** - * CreateQuoteRequestDTOSchema - * @type { object } - * @property { CommonModels.SectionEnum } section The section of the quote - * @property { CommonModels.DirectionEnum } direction The direction of the quote - * @property { CommonModels.TransportModeEnum } transportMode The mode of transport for the quote - * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote - * @property { CommonModels.ServiceTypeEnum } serviceType The service type for the quote - * @property { string } customerBusinessPartnerId The ID of the business partner that is the customer - */ -export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema.describe("The section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("The direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("The mode of transport for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The service type for the quote"), customerBusinessPartnerId: z.string().describe("The ID of the business partner that is the customer") }).readonly(); -export type CreateQuoteRequestDTO = z.infer; - -/** - * QuoteCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type QuoteCustomerDto = z.infer; - -/** - * QuoteEmployeeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the employee - * @property { string } name Name of the employee - */ -export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the employee"), name: z.string().describe("Name of the employee") }).readonly(); -export type QuoteEmployeeResponseDTO = z.infer; - -/** - * CargoTypeEnumSchema - * @type { enum } - */ -export const CargoTypeEnumSchema = z.enum(["Trailer", "Container", "BreakBulk", "Roro", "Project"]); -export type CargoTypeEnum = z.infer; -export const CargoTypeEnum = CargoTypeEnumSchema.enum; - -/** - * QuoteTypeEnumSchema - * @type { enum } - */ -export const QuoteTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); -export type QuoteTypeEnum = z.infer; -export const QuoteTypeEnum = QuoteTypeEnumSchema.enum; - -/** - * QuoteConvertedPositionDtoSchema - * @type { object } - * @property { string } positionId - * @property { string } positionNumber - */ -export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }).readonly(); -export type QuoteConvertedPositionDto = z.infer; - -/** - * QuoteCoreResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the quote - * @property { string } rootFolderId Root folder identifier bound to this quote - * @property { QuoteCustomerDto } customer - * @property { QuoteStatusEnum } status Current status of the quote - * @property { string } responsibleEmployeeId Unique identifier of the responsible employee - * @property { string } receivedByEmployeeId Unique identifier of the employee receiving the quote - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } salesRepId Unique identifier of the sales rep - * @property { QuoteEmployeeResponseDTO } responsibleEmployee The responsible employee - * @property { QuoteEmployeeResponseDTO } receivedByEmployee The employee who received the quote - * @property { string } owningOfficeId ID of the office owning the quote - * @property { string } name Name of the quote - * @property { string } number Quote number - * @property { CommonModels.SectionEnum } section Section of the quote - * @property { CommonModels.DirectionEnum } direction Direction of the quote - * @property { CommonModels.TransportModeEnum } transportMode Mode of transport - * @property { string } statusDate Date of the quote status - * @property { CargoTypeEnum } cargoType Type of cargo - * @property { CommonModels.IncotermsEnum } incoterms Incoterms for the quote - * @property { CommonModels.IncotermsEnum } secondIncoterms Second incoterms for the quote - * @property { string } buyRateReference Reference for buy rate - * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote - * @property { string } transitDurationInDays Transit duration in days - * @property { QuoteTypeEnum } quoteType Type of quote - * @property { string } defaultCurrencyId Default currency - * @property { QuoteEmployeeResponseDTO } salesRep The sales rep for the quote - * @property { string } team Team - * @property { string } createdAt - * @property { string } updatedAt - * @property { QuoteConvertedPositionDto[] } convertedPositions Positions converted from this quote. Default: `` - * @property { CommonModels.LoadTypeEnum } loadType Load type of quote - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const QuoteCoreResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the quote"), rootFolderId: z.string().describe("Root folder identifier bound to this quote").nullish(), customer: QuoteCustomerDtoSchema.nullish(), status: QuoteStatusEnumSchema.describe("Current status of the quote"), responsibleEmployeeId: z.string().describe("Unique identifier of the responsible employee").nullish(), receivedByEmployeeId: z.string().describe("Unique identifier of the employee receiving the quote").nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesRepId: z.string().describe("Unique identifier of the sales rep").nullish(), responsibleEmployee: QuoteEmployeeResponseDTOSchema.describe("The responsible employee").nullish(), receivedByEmployee: QuoteEmployeeResponseDTOSchema.describe("The employee who received the quote").nullish(), owningOfficeId: z.string().describe("ID of the office owning the quote"), name: z.string().describe("Name of the quote"), number: z.string().describe("Quote number"), section: CommonModels.SectionEnumSchema.describe("Section of the quote"), direction: CommonModels.DirectionEnumSchema.describe("Direction of the quote"), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport"), statusDate: z.iso.datetime({ offset: true }).describe("Date of the quote status"), cargoType: CargoTypeEnumSchema.describe("Type of cargo").nullish(), incoterms: CommonModels.IncotermsEnumSchema.describe("Incoterms for the quote").nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("Second incoterms for the quote").nullish(), buyRateReference: z.string().describe("Reference for buy rate").nullish(), frequency: CommonModels.FrequencyEnumSchema.describe("Frequency of the quote").nullish(), transitDurationInDays: z.string().describe("Transit duration in days").nullish(), quoteType: QuoteTypeEnumSchema.describe("Type of quote").nullish(), defaultCurrencyId: z.string().describe("Default currency").nullish(), salesRep: QuoteEmployeeResponseDTOSchema.describe("The sales rep for the quote").nullish(), team: z.string().describe("Team").nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), convertedPositions: z.array(QuoteConvertedPositionDtoSchema).readonly().describe("Positions converted from this quote").default([]), loadType: CommonModels.LoadTypeEnumSchema.describe("Load type of quote").nullish(), volumetricWeightModifier: z.number().describe("Volumetric weight modifier").nullish() }).readonly(); -export type QuoteCoreResponseDTO = z.infer; - -/** - * UpdateQuoteRequestDTOSchema - * @type { object } - * @property { string } number The quote number - * @property { string } statusDate The date of the quote status - * @property { CargoTypeEnum } cargoType The type of cargo for the quote - * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote - * @property { CommonModels.IncotermsEnum } incoterms The incoterms for the quote - * @property { CommonModels.IncotermsEnum } secondIncoterms The second incoterms for the quote - * @property { CommonModels.ServiceTypeEnum } serviceType The type of service for the quote - * @property { string } buyRateReference The reference for the buy rate - * @property { CommonModels.FrequencyEnum } frequency The frequency of the quote - * @property { string } transitDurationInDays The transit duration in days - * @property { QuoteTypeEnum } quoteType The type of quote - * @property { string } defaultCurrencyId The default currency for the quote - * @property { string } salesRepId The sales representative for the quote - * @property { string } responsibleEmployeeId The responsible employee for the quote - * @property { string } receivedByEmployeeId The employee who receieved the quote - * @property { string } team The team responsible for the quote - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().describe("The quote number"), statusDate: z.iso.datetime({ offset: true }).describe("The date of the quote status"), cargoType: CargoTypeEnumSchema.describe("The type of cargo for the quote"), loadType: CommonModels.LoadTypeEnumSchema.describe("The load type for the quote"), incoterms: CommonModels.IncotermsEnumSchema.describe("The incoterms for the quote"), secondIncoterms: CommonModels.IncotermsEnumSchema.describe("The second incoterms for the quote"), serviceType: CommonModels.ServiceTypeEnumSchema.describe("The type of service for the quote"), buyRateReference: z.string().describe("The reference for the buy rate"), frequency: CommonModels.FrequencyEnumSchema.describe("The frequency of the quote"), transitDurationInDays: z.string().describe("The transit duration in days").nullable(), quoteType: QuoteTypeEnumSchema.describe("The type of quote"), defaultCurrencyId: z.string().describe("The default currency for the quote"), salesRepId: z.string().describe("The sales representative for the quote"), responsibleEmployeeId: z.string().describe("The responsible employee for the quote"), receivedByEmployeeId: z.string().describe("The employee who receieved the quote"), team: z.string().describe("The team responsible for the quote"), volumetricWeightModifier: z.number().describe("Volumetric weight modifier") }).readonly(); -export type UpdateQuoteRequestDTO = z.infer; - -/** - * QuoteSectionEnumSchema - * @type { enum } - */ -export const QuoteSectionEnumSchema = z.enum(["Customer", "Overview", "Cargo", "Finances", "Documents"]); -export type QuoteSectionEnum = z.infer; -export const QuoteSectionEnum = QuoteSectionEnumSchema.enum; - -/** - * DuplicateQuoteRequestDtoSchema - * @type { object } - * @property { QuoteSectionEnum[] } sections The sections to duplicate. Min Items: `1` - */ -export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).readonly().min(1).describe("The sections to duplicate") }).readonly(); -export type DuplicateQuoteRequestDto = z.infer; - -/** - * QuoteListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalProfit - * @property { number } profitPerQuote - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const QuoteListResponseDtoSchema = z.object({ items: z.array(z.string()).readonly().describe("Items"), totalProfit: z.number(), profitPerQuote: z.number(), page: z.number().describe("1-indexed page number to begin from").nullish(), cursor: z.string().describe("ID of item to start after").nullish(), nextCursor: z.string().describe("Cursor for next set of items").nullish(), limit: z.number().describe("Items per response"), totalItems: z.number().describe("Total available items") }).readonly(); -export type QuoteListResponseDto = z.infer; - -/** - * QuotesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const QuotesPaginateOrderParamEnumSchema = z.enum(["number", "statusDate", "transportMode", "status", "direction", "loadType", "serviceType", "createdAt", "employee", "profit"]); -export type QuotesPaginateOrderParamEnum = z.infer; -export const QuotesPaginateOrderParamEnum = QuotesPaginateOrderParamEnumSchema.enum; - -/** - * QuotesPaginateResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerQuote - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { QuotePreviewResponseDTO[] } items - */ -export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).readonly() }).readonly().shape }); -export type QuotesPaginateResponse = z.infer; - -/** - * QuotesListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ -export const QuotesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).readonly() }).readonly().shape }); -export type QuotesListAvailablePartnersForResponse = z.infer; - -/** - * GetInvolvedPartiesResponseSchema - * @type { array } - */ -export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema).readonly(); -export type GetInvolvedPartiesResponse = z.infer; - -} diff --git a/test/generated/full/quotes/quotes.queries.ts b/test/generated/full/quotes/quotes.queries.ts deleted file mode 100644 index 8d2f75e..0000000 --- a/test/generated/full/quotes/quotes.queries.ts +++ /dev/null @@ -1,377 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuotesAcl } from "./quotes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuotesModels } from "./quotes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { QuotesApi } from "./quotes.api"; - -export namespace QuotesQueries { -export const moduleName = QueryModule.Quotes; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", "infinite", officeId, limit, order, filter, cursor] as const, - listAvailablePartnersFor: (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/quotes/:quoteId/available-partners", officeId, quoteId, search, useCase] as const, - getById: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId", officeId, quoteId] as const, - getInvolvedParties: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/involved-parties", officeId, quoteId] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Quotes - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` - * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(QuotesAcl.canUsePaginate({ officeId } )); - return QuotesApi.paginate(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Quotes - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` - * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuotesAcl.canUsePaginate({ officeId } )); - return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Quote - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { QuotesModels.CreateQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(QuotesAcl.canUseCreate({ officeId } )); - return QuotesApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for a quote - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListAvailablePartnersFor = ({ officeId, quoteId, search, useCase }: { officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), - queryFn: () => { - checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId } )); - return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase, config) }, - ...options, - }); -}; - -/** - * Mutation `useExportQuotes` - recommended when file should not be cached - * @summary Export quotes to Excel - * @permission Requires `canUseExportQuotes` ability - * @param { string } mutation.officeId Path parameter - * @param { QuotesModels.QuoteExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportQuotes = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(QuotesAcl.canUseExportQuotes({ officeId } )); - return QuotesApi.exportQuotes(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetById` - * @summary Get quote by id - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, quoteId), - queryFn: () => { - checkAcl(QuotesAcl.canUseGetById({ officeId } )); - return QuotesApi.getById(officeId, quoteId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuotesModels.UpdateQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseUpdate({ officeId } )); - return QuotesApi.update(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCancel` - * @summary Cancel quote - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId }) => { - checkAcl(QuotesAcl.canUseCancel({ officeId } )); - return QuotesApi.cancel(officeId, quoteId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicate` - * @summary Duplicate quote - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuotesModels.DuplicateQuoteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseDuplicate({ officeId } )); - return QuotesApi.duplicate(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetInvolvedParties` - * @summary Get involved parties for quote - * @permission Requires `canUseGetInvolvedParties` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetInvolvedParties = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvolvedParties(officeId, quoteId), - queryFn: () => { - checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId } )); - return QuotesApi.getInvolvedParties(officeId, quoteId, config) }, - ...options, - }); -}; - -/** - * Mutation `useCreateInvolvedParty` - * @summary Create involved party for quote - * @permission Requires `canUseCreateInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId } )); - return QuotesApi.createInvolvedParty(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateInvolvedParty` - * @summary Update involved party for quote - * @permission Requires `canUseUpdateInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, partyId, data }) => { - checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId } )); - return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteInvolvedParty` - * @summary Delete involved party for quote - * @permission Requires `canUseDeleteInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, partyId }) => { - checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId } )); - return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/remarkTemplates/remarkTemplates.acl.ts b/test/generated/full/remarkTemplates/remarkTemplates.acl.ts deleted file mode 100644 index b194325..0000000 --- a/test/generated/full/remarkTemplates/remarkTemplates.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace RemarkTemplatesAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List remark template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List remark templates - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Create", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get remark template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update remark template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Update", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Archive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Unarchive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -} diff --git a/test/generated/full/remarkTemplates/remarkTemplates.api.ts b/test/generated/full/remarkTemplates/remarkTemplates.api.ts deleted file mode 100644 index c4f8e86..0000000 --- a/test/generated/full/remarkTemplates/remarkTemplates.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; - -export namespace RemarkTemplatesApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/remark-templates/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, - `/offices/${officeId}/remark-templates`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates`, - ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), - config - ) -}; -export const findById = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}`, - config - ) -}; -export const update = (id: string, officeId: string, data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}`, - ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/remarkTemplates/remarkTemplates.configs.ts b/test/generated/full/remarkTemplates/remarkTemplates.configs.ts deleted file mode 100644 index 616b1f4..0000000 --- a/test/generated/full/remarkTemplates/remarkTemplates.configs.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; -import { RemarkTemplatesQueries } from "./remarkTemplates.queries"; -import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; - -export namespace RemarkTemplatesConfigs { -export const remarkTemplatesConfig = { - meta: { - title: "Remark Templates", - }, - readAll: { - acl: RemarkTemplatesAcl.canUseList, - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - paginated: RemarkTemplatesQueries.useList, - infinite: RemarkTemplatesQueries.useListInfinite, - filters: { - schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - onlyUsedFor: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - content: true, - onlyUsedFor: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: RemarkTemplatesAcl.canUseFindById, - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - query: RemarkTemplatesQueries.useFindById, - }, - create: { - acl: RemarkTemplatesAcl.canUseCreate, - schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, - mutation: RemarkTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - content: true, - onlyUsedFor: true, - }, - }, -}) - }, - update: { - acl: RemarkTemplatesAcl.canUseUpdate, - schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, - mutation: RemarkTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - content: true, - onlyUsedFor: true, - archived: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: RemarkTemplatesAcl.canUsePaginateLabels, - schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, - paginated: RemarkTemplatesQueries.usePaginateLabels, - infinite: RemarkTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - content: true, - }, - sortable: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/remarkTemplates/remarkTemplates.models.ts b/test/generated/full/remarkTemplates/remarkTemplates.models.ts deleted file mode 100644 index 10f5d41..0000000 --- a/test/generated/full/remarkTemplates/remarkTemplates.models.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace RemarkTemplatesModels { -/** - * RemarkTemplateLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { CommonModels.EditorContentResponseDto } content Remark template content - */ -export const RemarkTemplateLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), content: CommonModels.EditorContentResponseDtoSchema.describe("Remark template content") }).readonly(); -export type RemarkTemplateLabelResponseDTO = z.infer; - -/** - * RemarkTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const RemarkTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type RemarkTemplateEmployeeDTO = z.infer; - -/** - * OnlyUsedForEnumSchema - * @type { enum } - */ -export const OnlyUsedForEnumSchema = z.enum(["transport-order", "export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "invoice", "quote-document", "shipping-instructions", "position-office-notes", "invoice-body-remarks", "business-partner-office-notes"]); -export type OnlyUsedForEnum = z.infer; -export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; - -/** - * RemarkTemplateResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name Template name - * @property { CommonModels.EditorContentResponseDto } content Template content - * @property { string[] } onlyUsedFor Restrict template usage to specific document types - * @property { boolean } archived - * @property { string } createdById - * @property { RemarkTemplateEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { RemarkTemplateEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const RemarkTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string().describe("Template name"), content: CommonModels.EditorContentResponseDtoSchema.describe("Template content"), onlyUsedFor: z.array(OnlyUsedForEnumSchema).readonly().describe("Restrict template usage to specific document types").nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type RemarkTemplateResponseDTO = z.infer; - -/** - * CreateRemarkTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { CommonModels.EditorContentUpdateDto } content Template content - * @property { OnlyUsedForEnum[] } onlyUsedFor Restrict template usage to specific document types - */ -export const CreateRemarkTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), onlyUsedFor: z.array(OnlyUsedForEnumSchema).readonly().describe("Restrict template usage to specific document types").nullish() }).readonly(); -export type CreateRemarkTemplateRequestDTO = z.infer; - -/** - * UpdateRemarkTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { CommonModels.EditorContentUpdateDto } content Template content - * @property { string[] } onlyUsedFor Restrict template usage to specific document types - * @property { boolean } archived Archive status - */ -export const UpdateRemarkTemplateRequestDTOSchema = z.object({ name: z.string().describe("Template name"), content: CommonModels.EditorContentUpdateDtoSchema.describe("Template content"), onlyUsedFor: z.array(OnlyUsedForEnumSchema).readonly().describe("Restrict template usage to specific document types"), archived: z.boolean().describe("Archive status") }).readonly(); -export type UpdateRemarkTemplateRequestDTO = z.infer; - -/** - * RemarkTemplateFilterDtoSchema - * @type { object } - * @property { boolean } archived - * @property { string } search - * @property { string } onlyUsedFor Filter by document type - */ -export const RemarkTemplateFilterDtoSchema = z.object({ archived: z.boolean(), search: z.string(), onlyUsedFor: OnlyUsedForEnumSchema.describe("Filter by document type") }).readonly(); -export type RemarkTemplateFilterDto = z.infer; - -/** - * RemarkTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const RemarkTemplateLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type RemarkTemplateLabelFilterDto = z.infer; - -/** - * RemarkTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const RemarkTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type RemarkTemplatesPaginateLabelsOrderParamEnum = z.infer; -export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * RemarkTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { RemarkTemplateLabelResponseDTO[] } items - */ -export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).readonly() }).readonly().shape }); -export type RemarkTemplatesPaginateLabelsResponse = z.infer; - -/** - * RemarkTemplatesListOrderParamEnumSchema - * @type { enum } - */ -export const RemarkTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type RemarkTemplatesListOrderParamEnum = z.infer; -export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEnumSchema.enum; - -/** - * RemarkTemplatesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { RemarkTemplateResponseDTO[] } items - */ -export const RemarkTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).readonly() }).readonly().shape }); -export type RemarkTemplatesListResponse = z.infer; - -} diff --git a/test/generated/full/remarkTemplates/remarkTemplates.queries.ts b/test/generated/full/remarkTemplates/remarkTemplates.queries.ts deleted file mode 100644 index 52f9b4a..0000000 --- a/test/generated/full/remarkTemplates/remarkTemplates.queries.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; -import { RemarkTemplatesApi } from "./remarkTemplates.api"; - -export namespace RemarkTemplatesQueries { -export const moduleName = QueryModule.RemarkTemplates; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/remark-templates/:id", id, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate remark template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate remark template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List remark templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); - return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List remark templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); - return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new remark template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId } )); - return RemarkTemplatesApi.create(officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get remark template by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId } )); - return RemarkTemplatesApi.findById(id, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update remark template by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId } )); - return RemarkTemplatesApi.update(id, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive remark template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId } )); - return RemarkTemplatesApi.archive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive remark template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId } )); - return RemarkTemplatesApi.unarchive(id, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/roadQuotes/roadQuotes.acl.ts b/test/generated/full/roadQuotes/roadQuotes.acl.ts deleted file mode 100644 index edf7693..0000000 --- a/test/generated/full/roadQuotes/roadQuotes.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace RoadQuotesAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get road quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update road quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/full/roadQuotes/roadQuotes.api.ts b/test/generated/full/roadQuotes/roadQuotes.api.ts deleted file mode 100644 index eb644c0..0000000 --- a/test/generated/full/roadQuotes/roadQuotes.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { RoadQuotesModels } from "./roadQuotes.models"; - -export namespace RoadQuotesApi { -export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/road-quote`, - config - ) -}; -export const update = (officeId: string, quoteId: string, data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/road-quote`, - ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/roadQuotes/roadQuotes.models.ts b/test/generated/full/roadQuotes/roadQuotes.models.ts deleted file mode 100644 index e5ae99e..0000000 --- a/test/generated/full/roadQuotes/roadQuotes.models.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { z } from "zod"; - -export namespace RoadQuotesModels { -/** - * RoadQuoteResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the road quote - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - */ -export const RoadQuoteResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the road quote"), bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling") }).readonly(); -export type RoadQuoteResponseDTO = z.infer; - -/** - * UpdateRoadQuoteRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - */ -export const UpdateRoadQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling") }).readonly(); -export type UpdateRoadQuoteRequestDTO = z.infer; - -} diff --git a/test/generated/full/roadQuotes/roadQuotes.queries.ts b/test/generated/full/roadQuotes/roadQuotes.queries.ts deleted file mode 100644 index 2740233..0000000 --- a/test/generated/full/roadQuotes/roadQuotes.queries.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { RoadQuotesAcl } from "./roadQuotes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { RoadQuotesModels } from "./roadQuotes.models"; -import { RoadQuotesApi } from "./roadQuotes.api"; - -export namespace RoadQuotesQueries { -export const moduleName = QueryModule.RoadQuotes; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/road-quote", officeId, quoteId] as const, -}; - -/** - * Query `useGet` - * @summary Get road quote by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(RoadQuotesAcl.canUseGet({ officeId } )); - return RoadQuotesApi.get(officeId, quoteId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update road quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { RoadQuotesModels.UpdateRoadQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(RoadQuotesAcl.canUseUpdate({ officeId } )); - return RoadQuotesApi.update(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.get(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/seaPositions/seaPositions.acl.ts b/test/generated/full/seaPositions/seaPositions.acl.ts deleted file mode 100644 index 1040161..0000000 --- a/test/generated/full/seaPositions/seaPositions.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace SeaPositionsAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get sea position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update sea position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/full/seaPositions/seaPositions.api.ts b/test/generated/full/seaPositions/seaPositions.api.ts deleted file mode 100644 index c617cd0..0000000 --- a/test/generated/full/seaPositions/seaPositions.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { SeaPositionsModels } from "./seaPositions.models"; - -export namespace SeaPositionsApi { -export const get = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/sea-position`, - config - ) -}; -export const update = (officeId: string, positionId: string, data: SeaPositionsModels.UpdateSeaPositionRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/sea-position`, - ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/seaPositions/seaPositions.models.ts b/test/generated/full/seaPositions/seaPositions.models.ts deleted file mode 100644 index 80dd1d9..0000000 --- a/test/generated/full/seaPositions/seaPositions.models.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace SeaPositionsModels { -/** - * SeaPositionResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } bookingMatchingCode - * @property { string } houseBillOfLadingNumber - * @property { string } masterBillOfLadingNumber - * @property { boolean } hblRequired - * @property { boolean } mblRequired - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { string } buyServiceContract - * @property { string } sellServiceContract - * @property { string } quoteReference - * @property { string } createdAt - * @property { string } updatedAt - * @property { CommonModels.SeaRoutingEnum } routing - * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route - */ -export const SeaPositionResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterBillOfLadingNumber: z.string().nullish(), hblRequired: z.boolean(), mblRequired: z.boolean(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), buyServiceContract: z.string().nullish(), sellServiceContract: z.string().nullish(), quoteReference: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), routing: CommonModels.SeaRoutingEnumSchema.nullish(), defaultBookingNumber: z.string().describe("Default booking number from the port of loading point of the default route").nullish() }).readonly(); -export type SeaPositionResponseDTO = z.infer; - -/** - * UpdateSeaPositionRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode - * @property { string } houseBillOfLadingNumber - * @property { boolean } mblRequired - * @property { boolean } hblRequired - * @property { string } masterBillOfLadingNumber - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { string } buyServiceContract - * @property { string } quoteReference - * @property { string } sellServiceContract - * @property { CommonModels.SeaRoutingEnum } routing - */ -export const UpdateSeaPositionRequestDTOSchema = z.object({ bookingMatchingCode: z.string(), houseBillOfLadingNumber: z.string(), mblRequired: z.boolean(), hblRequired: z.boolean(), masterBillOfLadingNumber: z.string(), blfromCostumerDate: z.iso.datetime({ offset: true }), blfromCarrierDate: z.iso.datetime({ offset: true }), customsDate: z.iso.datetime({ offset: true }), vgmCustomerDate: z.iso.datetime({ offset: true }), buyServiceContract: z.string(), quoteReference: z.string(), sellServiceContract: z.string(), routing: CommonModels.SeaRoutingEnumSchema }).readonly(); -export type UpdateSeaPositionRequestDTO = z.infer; - -} diff --git a/test/generated/full/seaPositions/seaPositions.queries.ts b/test/generated/full/seaPositions/seaPositions.queries.ts deleted file mode 100644 index 97e123e..0000000 --- a/test/generated/full/seaPositions/seaPositions.queries.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { SeaPositionsAcl } from "./seaPositions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { SeaPositionsModels } from "./seaPositions.models"; -import { SeaPositionsApi } from "./seaPositions.api"; - -export namespace SeaPositionsQueries { -export const moduleName = QueryModule.SeaPositions; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/sea-position", officeId, positionId] as const, -}; - -/** - * Query `useGet` - * @summary Get sea position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(SeaPositionsAcl.canUseGet({ officeId } )); - return SeaPositionsApi.get(officeId, positionId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update sea position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { SeaPositionsModels.UpdateSeaPositionRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(SeaPositionsAcl.canUseUpdate({ officeId } )); - return SeaPositionsApi.update(officeId, positionId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/seaQuotes/seaQuotes.acl.ts b/test/generated/full/seaQuotes/seaQuotes.acl.ts deleted file mode 100644 index ca36ff7..0000000 --- a/test/generated/full/seaQuotes/seaQuotes.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace SeaQuotesAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get sea quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update sea quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/full/seaQuotes/seaQuotes.api.ts b/test/generated/full/seaQuotes/seaQuotes.api.ts deleted file mode 100644 index f3ee817..0000000 --- a/test/generated/full/seaQuotes/seaQuotes.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { ZodExtended } from "@/data/zod.extended"; -import { SeaQuotesModels } from "./seaQuotes.models"; - -export namespace SeaQuotesApi { -export const get = (officeId: string, quoteId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - config - ) -}; -export const update = (officeId: string, quoteId: string, data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), - config - ) -}; -} diff --git a/test/generated/full/seaQuotes/seaQuotes.models.ts b/test/generated/full/seaQuotes/seaQuotes.models.ts deleted file mode 100644 index f03b400..0000000 --- a/test/generated/full/seaQuotes/seaQuotes.models.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace SeaQuotesModels { -/** - * SeaQuoteResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the sea quote - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - * @property { CommonModels.SeaRoutingEnum } routing - * @property { boolean } splitRoute Indicates if the route is split - */ -export const SeaQuoteResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier for the sea quote"), bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity").nullable(), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity").nullable(), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling"), routing: CommonModels.SeaRoutingEnumSchema.nullish(), splitRoute: z.boolean().describe("Indicates if the route is split").nullish() }).readonly(); -export type SeaQuoteResponseDTO = z.infer; - -/** - * UpdateSeaQuoteRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - * @property { CommonModels.SeaRoutingEnum } routing - */ -export const UpdateSeaQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().describe("Code for matching bookings"), validFrom: z.iso.datetime({ offset: true }).describe("Start date of quote validity"), validUntil: z.iso.datetime({ offset: true }).describe("End date of quote validity"), buyServiceContract: z.string().describe("Service contract for buying"), sellServiceContract: z.string().describe("Service contract for selling"), routing: CommonModels.SeaRoutingEnumSchema }).readonly(); -export type UpdateSeaQuoteRequestDTO = z.infer; - -} diff --git a/test/generated/full/seaQuotes/seaQuotes.queries.ts b/test/generated/full/seaQuotes/seaQuotes.queries.ts deleted file mode 100644 index 5949292..0000000 --- a/test/generated/full/seaQuotes/seaQuotes.queries.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { SeaQuotesAcl } from "./seaQuotes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { SeaQuotesModels } from "./seaQuotes.models"; -import { SeaQuotesApi } from "./seaQuotes.api"; - -export namespace SeaQuotesQueries { -export const moduleName = QueryModule.SeaQuotes; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/sea-quote", officeId, quoteId] as const, -}; - -/** - * Query `useGet` - * @summary Get sea quote by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(SeaQuotesAcl.canUseGet({ officeId } )); - return SeaQuotesApi.get(officeId, quoteId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update sea quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { SeaQuotesModels.UpdateSeaQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(SeaQuotesAcl.canUseUpdate({ officeId } )); - return SeaQuotesApi.update(officeId, quoteId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.get(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/shippingInstructions/shippingInstructions.acl.ts b/test/generated/full/shippingInstructions/shippingInstructions.acl.ts deleted file mode 100644 index 2eae90a..0000000 --- a/test/generated/full/shippingInstructions/shippingInstructions.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ShippingInstructionsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useDeleteOfficesPositionsShippingInstructionsById` mutation ability. For global ability, omit the object parameter. - * @description Delete shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsShippingInstructionsById` mutation - */ -export const canUseDeleteOfficesPositionsShippingInstructionsById = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `usePreview` query or `usePreviewMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreview` query or `usePreviewMutation` mutation - */ -export const canUsePreview = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/full/shippingInstructions/shippingInstructions.api.ts b/test/generated/full/shippingInstructions/shippingInstructions.api.ts deleted file mode 100644 index e535ba2..0000000 --- a/test/generated/full/shippingInstructions/shippingInstructions.api.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ShippingInstructionsModels } from "./shippingInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ShippingInstructionsApi { -export const create = (officeId: string, positionId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions`, - undefined, - config - ) -}; -export const get = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - config - ) -}; -export const update = (officeId: string, positionId: string, id: string, data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), - config - ) -}; -export const deleteOfficesPositionsShippingInstructionsById = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - undefined, - config - ) -}; -export const preview = (officeId: string, positionId: string, id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generate = (officeId: string, positionId: string, id: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/shippingInstructions/shippingInstructions.models.ts b/test/generated/full/shippingInstructions/shippingInstructions.models.ts deleted file mode 100644 index 7f8248c..0000000 --- a/test/generated/full/shippingInstructions/shippingInstructions.models.ts +++ /dev/null @@ -1,510 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ShippingInstructionsModels { -/** - * EnsDeclarationEnumSchema - * @type { enum } - * @description ENS declaration - */ -export const EnsDeclarationEnumSchema = z.enum(["Carrier", "Self"]); -export type EnsDeclarationEnum = z.infer; -export const EnsDeclarationEnum = EnsDeclarationEnumSchema.enum; - -/** - * IssuedHouseBillsEnumSchema - * @type { enum } - * @description Issued house bills - */ -export const IssuedHouseBillsEnumSchema = z.enum(["None", "One", "Multiple"]); -export type IssuedHouseBillsEnum = z.infer; -export const IssuedHouseBillsEnum = IssuedHouseBillsEnumSchema.enum; - -/** - * WoodDeclarationEnumSchema - * @type { enum } - * @description Wood declaration - */ -export const WoodDeclarationEnumSchema = z.enum(["NoWood", "TreatedAndCertified", "NotTreatedAndNotCertified", "Processed"]); -export type WoodDeclarationEnum = z.infer; -export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; - -/** - * ShippingInstructionsPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } addressLine1 - * @property { string } addressLine2 - * @property { string } city - * @property { string } postalCode - * @property { string } state - * @property { string } countryCode - * @property { string } contactName - * @property { string } contactPhone - * @property { string } contactEmail - */ -export const ShippingInstructionsPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), addressLine1: z.string(), addressLine2: z.string(), city: z.string(), postalCode: z.string(), state: z.string(), countryCode: z.string(), contactName: z.string(), contactPhone: z.string(), contactEmail: z.string() }).readonly(); -export type ShippingInstructionsPartnerResponseDto = z.infer; - -/** - * ShippingInstructionsGeneralDetailsDtoSchema - * @type { object } - * @property { ShippingInstructionsPartnerResponseDto } shipper - * @property { ShippingInstructionsPartnerResponseDto } consignee - * @property { ShippingInstructionsPartnerResponseDto } freightForwarder - * @property { ShippingInstructionsPartnerResponseDto } notifyParty - * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty1 - * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty2 - * @property { ShippingInstructionsPartnerResponseDto } contractParty - * @property { ShippingInstructionsPartnerResponseDto } manufacturer - * @property { ShippingInstructionsPartnerResponseDto } consolidator - * @property { ShippingInstructionsPartnerResponseDto } importer - * @property { ShippingInstructionsPartnerResponseDto } warehouseKeeper - */ -export const ShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: ShippingInstructionsPartnerResponseDtoSchema, consignee: ShippingInstructionsPartnerResponseDtoSchema, freightForwarder: ShippingInstructionsPartnerResponseDtoSchema, notifyParty: ShippingInstructionsPartnerResponseDtoSchema, additionalNotifyParty1: ShippingInstructionsPartnerResponseDtoSchema, additionalNotifyParty2: ShippingInstructionsPartnerResponseDtoSchema, contractParty: ShippingInstructionsPartnerResponseDtoSchema, manufacturer: ShippingInstructionsPartnerResponseDtoSchema, consolidator: ShippingInstructionsPartnerResponseDtoSchema, importer: ShippingInstructionsPartnerResponseDtoSchema, warehouseKeeper: ShippingInstructionsPartnerResponseDtoSchema }).readonly(); -export type ShippingInstructionsGeneralDetailsDto = z.infer; - -/** - * ShippingInstructionsLocationResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } code - * @property { string } countryCode - * @property { string } eta - * @property { string } vessel - * @property { string } voyage - */ -export const ShippingInstructionsLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), code: z.string(), countryCode: z.string(), eta: z.iso.datetime({ offset: true }), vessel: z.string(), voyage: z.string() }).readonly(); -export type ShippingInstructionsLocationResponseDto = z.infer; - -/** - * SIMoveTypeEnumSchema - * @type { enum } - */ -export const SIMoveTypeEnumSchema = z.enum(["DoorToDoor", "DoorToPort", "PortToDoor", "PortToPort"]); -export type SIMoveTypeEnum = z.infer; -export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; - -/** - * ShippingInstructionsTransportDtoSchema - * @type { object } - * @property { string } vessel - * @property { string } voyage - * @property { string } imo - * @property { ShippingInstructionsLocationResponseDto } placeOfReceipt - * @property { ShippingInstructionsLocationResponseDto } portOfLoading - * @property { ShippingInstructionsLocationResponseDto } portOfDischarge - * @property { ShippingInstructionsLocationResponseDto } placeOfDelivery - * @property { SIMoveTypeEnum } moveType - * @property { string } shipmentType - */ -export const ShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string(), voyage: z.string(), imo: z.string(), placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema, portOfLoading: ShippingInstructionsLocationResponseDtoSchema, portOfDischarge: ShippingInstructionsLocationResponseDtoSchema, placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema, moveType: SIMoveTypeEnumSchema, shipmentType: z.string() }).readonly(); -export type ShippingInstructionsTransportDto = z.infer; - -/** - * ShippingInstructionsHazardousDtoSchema - * @type { object } - * @property { string } IMOClass - * @property { string } UNDGNumber - * @property { string } contact - */ -export const ShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string(), UNDGNumber: z.string(), contact: z.string() }).readonly(); -export type ShippingInstructionsHazardousDto = z.infer; - -/** - * ShippingInstructionsPackageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { number } quantity - * @property { string } packageType - * @property { string } packageTypeDescription - * @property { string } packageDescription - * @property { string } hsCode - * @property { number } volume - * @property { number } grossWeight - * @property { string } caseMarks - * @property { ShippingInstructionsHazardousDto } hazardous - * @property { string } ncmCodes - * @property { string } cusCode - */ -export const ShippingInstructionsPackageResponseDtoSchema = z.object({ id: z.string(), quantity: z.number(), packageType: z.string(), packageTypeDescription: z.string(), packageDescription: z.string(), hsCode: z.string(), volume: z.number(), grossWeight: z.number(), caseMarks: z.string(), hazardous: ShippingInstructionsHazardousDtoSchema, ncmCodes: z.string(), cusCode: z.string() }).readonly(); -export type ShippingInstructionsPackageResponseDto = z.infer; - -/** - * ShippingInstructionsCargoResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } transportUnitNumber - * @property { string } transportUnitType - * @property { string } transportUnitDescription - * @property { string } containerSupplier - * @property { number } grossWeight - * @property { number } tare - * @property { number } volume - * @property { string } seal1 - * @property { string } seal2 - * @property { string } woodDeclaration - * @property { ShippingInstructionsPackageResponseDto[] } packages - */ -export const ShippingInstructionsCargoResponseDtoSchema = z.object({ id: z.string().nullish(), transportUnitNumber: z.string().nullish(), transportUnitType: z.string().nullish(), transportUnitDescription: z.string().nullish(), containerSupplier: z.string().nullish(), grossWeight: z.number().nullish(), tare: z.number().nullish(), volume: z.number().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), woodDeclaration: WoodDeclarationEnumSchema.nullish(), packages: z.array(ShippingInstructionsPackageResponseDtoSchema).readonly() }).readonly(); -export type ShippingInstructionsCargoResponseDto = z.infer; - -/** - * ShippingInstructionsHeaderDtoSchema - * @type { object } - * @property { string } name - * @property { string } nameSuffix - * @property { number } versionNumber - * @property { string } shippingInstructionNumber - * @property { string } carrierScac - * @property { string } carrierBookingNumber - */ -export const ShippingInstructionsHeaderDtoSchema = z.object({ name: z.string(), nameSuffix: z.string().nullish(), versionNumber: z.number(), shippingInstructionNumber: z.string().nullish(), carrierScac: z.string().nullish(), carrierBookingNumber: z.string().nullish() }).readonly(); -export type ShippingInstructionsHeaderDto = z.infer; - -/** - * ShippingInstructionsReferencesDtoSchema - * @type { object } - * @property { string } shipperReference - * @property { string } forwarderReference - * @property { string } transactionReferenceNumber - * @property { string } blReferenceNumber - * @property { string } uniqueConsignmentReference - * @property { string } purchaseOrderNumber - * @property { string } contractReferenceNumber - * @property { string } rucNumber - * @property { string } consigneeOrderNumber - * @property { string } invoiceReferenceNumber - * @property { string } letterOfCreditReference - * @property { string } customsHouseBrokerReference - * @property { string } fmcNumber - * @property { string } exportLicenseNumber - */ -export const ShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string(), forwarderReference: z.string(), transactionReferenceNumber: z.string(), blReferenceNumber: z.string(), uniqueConsignmentReference: z.string(), purchaseOrderNumber: z.string(), contractReferenceNumber: z.string(), rucNumber: z.string(), consigneeOrderNumber: z.string(), invoiceReferenceNumber: z.string(), letterOfCreditReference: z.string(), customsHouseBrokerReference: z.string(), fmcNumber: z.string(), exportLicenseNumber: z.string() }).readonly(); -export type ShippingInstructionsReferencesDto = z.infer; - -/** - * ShippingInstructionsCustomsComplianceDtoSchema - * @type { object } - * @property { string } shipperTaxId - * @property { string } shipperEORI - * @property { string } consigneeTaxId - * @property { string } consigneeEORI - * @property { string } notifyPartyTaxId - * @property { string } notifyPartyEORI - */ -export const ShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string(), shipperEORI: z.string(), consigneeTaxId: z.string(), consigneeEORI: z.string(), notifyPartyTaxId: z.string(), notifyPartyEORI: z.string() }).readonly(); -export type ShippingInstructionsCustomsComplianceDto = z.infer; - -/** - * ShippingInstructionsIcs2DtoSchema - * @type { object } - * @property { boolean } goodsDeliveredInEu - * @property { string } ensDeclaration - * @property { string } issuedHouseBills - */ -export const ShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean(), ensDeclaration: EnsDeclarationEnumSchema, issuedHouseBills: IssuedHouseBillsEnumSchema }).readonly(); -export type ShippingInstructionsIcs2Dto = z.infer; - -/** - * ShippingInstructionsCargoIdentificationNumbersDtoSchema - * @type { object } - * @property { string } PCINNumber - * @property { string } CSNNumber - * @property { string } MCINNumber - */ -export const ShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string(), CSNNumber: z.string(), MCINNumber: z.string() }).readonly(); -export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer; - -/** - * ShippingInstructionsControlTotalsDtoSchema - * @type { object } - * @property { number } totalNumberOfContainers - * @property { number } totalNumberOfPackages - * @property { number } totalShipmentWeight - * @property { number } totalShipmentVolume - */ -export const ShippingInstructionsControlTotalsDtoSchema = z.object({ totalNumberOfContainers: z.number(), totalNumberOfPackages: z.number(), totalShipmentWeight: z.number(), totalShipmentVolume: z.number() }).readonly(); -export type ShippingInstructionsControlTotalsDto = z.infer; - -/** - * FreightChargesDtoSchema - * @type { object } - * @property { string } freightPayer - * @property { string } freightTerm - */ -export const FreightChargesDtoSchema = z.object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }).readonly(); -export type FreightChargesDto = z.infer; - -/** - * ShippingInstructionsShippersDeclaredValueDtoSchema - * @type { object } - * @property { string } currency - * @property { number } shipperDeclaredValue - */ -export const ShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string(), shipperDeclaredValue: z.number() }).readonly(); -export type ShippingInstructionsShippersDeclaredValueDto = z.infer; - -/** - * ShippingInstructionsNotificationEmailsDtoSchema - * @type { object } - * @property { string } siRequestorEmails - */ -export const ShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string() }).readonly(); -export type ShippingInstructionsNotificationEmailsDto = z.infer; - -/** - * ShippingInstructionsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } name - * @property { string } nameSuffix - * @property { string } date - * @property { string } createdAt - * @property { string } updatedAt - * @property { number } versionNumber - * @property { ShippingInstructionsHeaderDto } header - * @property { ShippingInstructionsGeneralDetailsDto } generalDetails - * @property { ShippingInstructionsReferencesDto } references - * @property { ShippingInstructionsTransportDto } transport - * @property { ShippingInstructionsCustomsComplianceDto } customsCompliance - * @property { ShippingInstructionsIcs2Dto } ics2 - * @property { ShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers - * @property { ShippingInstructionsCargoResponseDto[] } cargo - * @property { ShippingInstructionsControlTotalsDto } controlTotals - * @property { FreightChargesDto } freightCharges - * @property { ShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue - * @property { ShippingInstructionsNotificationEmailsDto } notificationEmails - * @property { string } defaultFileName - */ -export const ShippingInstructionsResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), date: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), versionNumber: z.number(), header: ShippingInstructionsHeaderDtoSchema, generalDetails: ShippingInstructionsGeneralDetailsDtoSchema, references: ShippingInstructionsReferencesDtoSchema, transport: ShippingInstructionsTransportDtoSchema, customsCompliance: ShippingInstructionsCustomsComplianceDtoSchema, ics2: ShippingInstructionsIcs2DtoSchema, cargoIdentificationNumbers: ShippingInstructionsCargoIdentificationNumbersDtoSchema, cargo: z.array(ShippingInstructionsCargoResponseDtoSchema).readonly().nullish(), controlTotals: ShippingInstructionsControlTotalsDtoSchema, freightCharges: FreightChargesDtoSchema, shippersDeclaredValue: ShippingInstructionsShippersDeclaredValueDtoSchema, notificationEmails: ShippingInstructionsNotificationEmailsDtoSchema, defaultFileName: z.string() }).readonly(); -export type ShippingInstructionsResponseDto = z.infer; - -/** - * UpdateShippingInstructionsPartnerDtoSchema - * @type { object } - * @property { string } id Partner id - * @property { string } name Partner name - * @property { string } addressLine1 Address line 1 - * @property { string } addressLine2 Address line 2 - * @property { string } city City - * @property { string } postalCode Postal code - * @property { string } state State - * @property { string } countryCode Country code - * @property { string } taxId Tax ID - * @property { string } contactName Contact name - * @property { string } contactPhone Contact phone - * @property { string } contactEmail Contact email - */ -export const UpdateShippingInstructionsPartnerDtoSchema = z.object({ id: z.string().describe("Partner id"), name: z.string().describe("Partner name"), addressLine1: z.string().describe("Address line 1"), addressLine2: z.string().describe("Address line 2"), city: z.string().describe("City"), postalCode: z.string().describe("Postal code"), state: z.string().describe("State"), countryCode: z.string().describe("Country code"), taxId: z.string().describe("Tax ID"), contactName: z.string().describe("Contact name"), contactPhone: z.string().describe("Contact phone"), contactEmail: z.string().describe("Contact email") }).readonly(); -export type UpdateShippingInstructionsPartnerDto = z.infer; - -/** - * UpdateShippingInstructionsGeneralDetailsDtoSchema - * @type { object } - * @property { UpdateShippingInstructionsPartnerDto } shipper Shipper - * @property { UpdateShippingInstructionsPartnerDto } consignee Consignee - * @property { UpdateShippingInstructionsPartnerDto } freightForwarder Freight forwarder - * @property { UpdateShippingInstructionsPartnerDto } notifyParty Notify party - * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty1 Additional notify party 1 - * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty2 Additional notify party 2 - * @property { UpdateShippingInstructionsPartnerDto } contractParty Contract party - * @property { UpdateShippingInstructionsPartnerDto } manufacturer Manufacturer - * @property { UpdateShippingInstructionsPartnerDto } consolidator Consolidator - * @property { UpdateShippingInstructionsPartnerDto } importer Importer - * @property { UpdateShippingInstructionsPartnerDto } warehouseKeeper Warehouse keeper - */ -export const UpdateShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: UpdateShippingInstructionsPartnerDtoSchema.describe("Shipper"), consignee: UpdateShippingInstructionsPartnerDtoSchema.describe("Consignee"), freightForwarder: UpdateShippingInstructionsPartnerDtoSchema.describe("Freight forwarder"), notifyParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Notify party"), additionalNotifyParty1: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 1"), additionalNotifyParty2: UpdateShippingInstructionsPartnerDtoSchema.describe("Additional notify party 2"), contractParty: UpdateShippingInstructionsPartnerDtoSchema.describe("Contract party"), manufacturer: UpdateShippingInstructionsPartnerDtoSchema.describe("Manufacturer"), consolidator: UpdateShippingInstructionsPartnerDtoSchema.describe("Consolidator"), importer: UpdateShippingInstructionsPartnerDtoSchema.describe("Importer"), warehouseKeeper: UpdateShippingInstructionsPartnerDtoSchema.describe("Warehouse keeper") }).readonly(); -export type UpdateShippingInstructionsGeneralDetailsDto = z.infer; - -/** - * UpdateShippingInstructionsLocationDtoSchema - * @type { object } - * @property { string } id Location id - * @property { string } name Location name - * @property { string } code Location code - * @property { string } countryCode Country code - */ -export const UpdateShippingInstructionsLocationDtoSchema = z.object({ id: z.string().describe("Location id"), name: z.string().describe("Location name"), code: z.string().describe("Location code"), countryCode: z.string().describe("Country code") }).readonly(); -export type UpdateShippingInstructionsLocationDto = z.infer; - -/** - * UpdateShippingInstructionsTransportDtoSchema - * @type { object } - * @property { string } vessel Vessel - * @property { string } voyage Voyage - * @property { string } imo IMO - * @property { UpdateShippingInstructionsLocationDto } placeOfReceipt Place of receipt - * @property { UpdateShippingInstructionsLocationDto } portOfLoading Port of loading - * @property { UpdateShippingInstructionsLocationDto } portOfDischarge Port of discharge - * @property { UpdateShippingInstructionsLocationDto } placeOfDelivery Place of delivery - * @property { SIMoveTypeEnum } moveType Move type - * @property { string } shipmentType Shipment type - */ -export const UpdateShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string().describe("Vessel"), voyage: z.string().describe("Voyage"), imo: z.string().describe("IMO"), placeOfReceipt: UpdateShippingInstructionsLocationDtoSchema.describe("Place of receipt"), portOfLoading: UpdateShippingInstructionsLocationDtoSchema.describe("Port of loading"), portOfDischarge: UpdateShippingInstructionsLocationDtoSchema.describe("Port of discharge"), placeOfDelivery: UpdateShippingInstructionsLocationDtoSchema.describe("Place of delivery"), moveType: SIMoveTypeEnumSchema.describe("Move type"), shipmentType: z.string().describe("Shipment type") }).readonly(); -export type UpdateShippingInstructionsTransportDto = z.infer; - -/** - * UpdateShippingInstructionsHazardousDtoSchema - * @type { object } - * @property { string } IMOClass IMO class - * @property { string } UNDGNumber UNDG number - * @property { string } contact Contact - */ -export const UpdateShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string().describe("IMO class"), UNDGNumber: z.string().describe("UNDG number"), contact: z.string().describe("Contact") }).readonly(); -export type UpdateShippingInstructionsHazardousDto = z.infer; - -/** - * UpdateShippingInstructionsPackageDtoSchema - * @type { object } - * @property { string } id Package id - * @property { number } quantity Quantity - * @property { string } packageType Package type - * @property { string } packageTypeDescription Package type description - * @property { string } packageDescription Package description - * @property { string } hsCode HS code - * @property { number } volume Volume - * @property { number } grossWeight Gross weight - * @property { string } caseMarks Case marks - * @property { UpdateShippingInstructionsHazardousDto } hazardous Hazardous - * @property { string } ncmCodes NCM codes - * @property { string } cusCode CUS code - */ -export const UpdateShippingInstructionsPackageDtoSchema = z.object({ id: z.string().describe("Package id"), quantity: z.number().describe("Quantity"), packageType: z.string().describe("Package type"), packageTypeDescription: z.string().describe("Package type description"), packageDescription: z.string().describe("Package description"), hsCode: z.string().describe("HS code"), volume: z.number().describe("Volume"), grossWeight: z.number().describe("Gross weight"), caseMarks: z.string().describe("Case marks"), hazardous: UpdateShippingInstructionsHazardousDtoSchema.describe("Hazardous"), ncmCodes: z.string().describe("NCM codes"), cusCode: z.string().describe("CUS code") }).readonly(); -export type UpdateShippingInstructionsPackageDto = z.infer; - -/** - * UpdateShippingInstructionsCargoDtoSchema - * @type { object } - * @property { string } id Cargo id - * @property { string } transportUnitNumber Transport unit number - * @property { string } transportUnitType Transport unit type - * @property { string } transportUnitDescription Transport unit description - * @property { string } containerSupplier Container supplier - * @property { number } grossWeight Gross weight - * @property { number } tare Tare - * @property { number } volume Volume - * @property { string } seal1 Seal 1 - * @property { string } seal2 Seal 2 - * @property { string } woodDeclaration Wood declaration - * @property { UpdateShippingInstructionsPackageDto[] } packages Packages - */ -export const UpdateShippingInstructionsCargoDtoSchema = z.object({ id: z.string().describe("Cargo id"), transportUnitNumber: z.string().describe("Transport unit number"), transportUnitType: z.string().describe("Transport unit type"), transportUnitDescription: z.string().describe("Transport unit description"), containerSupplier: z.string().describe("Container supplier"), grossWeight: z.number().describe("Gross weight"), tare: z.number().describe("Tare"), volume: z.number().describe("Volume"), seal1: z.string().describe("Seal 1"), seal2: z.string().describe("Seal 2"), woodDeclaration: WoodDeclarationEnumSchema.describe("Wood declaration"), packages: z.array(UpdateShippingInstructionsPackageDtoSchema).readonly().describe("Packages") }).readonly(); -export type UpdateShippingInstructionsCargoDto = z.infer; - -/** - * UpdateShippingInstructionsHeaderDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } nameSuffix Name suffix - * @property { number } versionNumber Version number - * @property { string } shippingInstructionNumber Shipping instruction number - * @property { string } carrierScac Carrier SCAC - * @property { string } carrierBookingNumber Carrier booking number - */ -export const UpdateShippingInstructionsHeaderDtoSchema = z.object({ name: z.string().describe("Name"), nameSuffix: z.string().describe("Name suffix"), versionNumber: z.number().describe("Version number"), shippingInstructionNumber: z.string().describe("Shipping instruction number"), carrierScac: z.string().describe("Carrier SCAC"), carrierBookingNumber: z.string().describe("Carrier booking number") }).readonly(); -export type UpdateShippingInstructionsHeaderDto = z.infer; - -/** - * UpdateShippingInstructionsReferencesDtoSchema - * @type { object } - * @property { string } shipperReference Shipper reference - * @property { string } forwarderReference Forwarder reference - * @property { string } transactionReferenceNumber Transaction reference number - * @property { string } blReferenceNumber BL reference number - * @property { string } uniqueConsignmentReference Unique consignment reference - * @property { string } purchaseOrderNumber Purchase order number - * @property { string } contractReferenceNumber Contract reference number - * @property { string } rucNumber RUC number - * @property { string } consigneeOrderNumber Consignee order number - * @property { string } invoiceReferenceNumber Invoice reference number - * @property { string } letterOfCreditReference Letter of credit reference - * @property { string } customsHouseBrokerReference Customs house broker reference - * @property { string } fmcNumber FMC number - * @property { string } exportLicenseNumber Export license number - */ -export const UpdateShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string().describe("Shipper reference"), forwarderReference: z.string().describe("Forwarder reference"), transactionReferenceNumber: z.string().describe("Transaction reference number"), blReferenceNumber: z.string().describe("BL reference number"), uniqueConsignmentReference: z.string().describe("Unique consignment reference"), purchaseOrderNumber: z.string().describe("Purchase order number"), contractReferenceNumber: z.string().describe("Contract reference number"), rucNumber: z.string().describe("RUC number"), consigneeOrderNumber: z.string().describe("Consignee order number"), invoiceReferenceNumber: z.string().describe("Invoice reference number"), letterOfCreditReference: z.string().describe("Letter of credit reference"), customsHouseBrokerReference: z.string().describe("Customs house broker reference"), fmcNumber: z.string().describe("FMC number"), exportLicenseNumber: z.string().describe("Export license number") }).readonly(); -export type UpdateShippingInstructionsReferencesDto = z.infer; - -/** - * UpdateShippingInstructionsCustomsComplianceDtoSchema - * @type { object } - * @property { string } shipperTaxId Shipper tax ID - * @property { string } shipperEORI Shipper EORI - * @property { string } consigneeTaxId Consignee tax ID - * @property { string } consigneeEORI Consignee EORI - * @property { string } notifyPartyTaxId Notify party tax ID - * @property { string } notifyPartyEORI Notify party EORI - */ -export const UpdateShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string().describe("Shipper tax ID"), shipperEORI: z.string().describe("Shipper EORI"), consigneeTaxId: z.string().describe("Consignee tax ID"), consigneeEORI: z.string().describe("Consignee EORI"), notifyPartyTaxId: z.string().describe("Notify party tax ID"), notifyPartyEORI: z.string().describe("Notify party EORI") }).readonly(); -export type UpdateShippingInstructionsCustomsComplianceDto = z.infer; - -/** - * UpdateShippingInstructionsIcs2DtoSchema - * @type { object } - * @property { boolean } goodsDeliveredInEu Goods delivered in EU - * @property { string } ensDeclaration ENS declaration - * @property { string } issuedHouseBills Issued house bills - */ -export const UpdateShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean().describe("Goods delivered in EU"), ensDeclaration: EnsDeclarationEnumSchema.describe("ENS declaration"), issuedHouseBills: IssuedHouseBillsEnumSchema.describe("Issued house bills") }).readonly(); -export type UpdateShippingInstructionsIcs2Dto = z.infer; - -/** - * UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema - * @type { object } - * @property { string } PCINNumber PCIN number - * @property { string } CSNNumber CSN number - * @property { string } MCINNumber MCIN number - */ -export const UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string().describe("PCIN number"), CSNNumber: z.string().describe("CSN number"), MCINNumber: z.string().describe("MCIN number") }).readonly(); -export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer; - -/** - * UpdateFreightChargesDtoSchema - * @type { object } - * @property { string } freightPayer - * @property { string } freightTerm - */ -export const UpdateFreightChargesDtoSchema = z.object({ freightPayer: z.string(), freightTerm: CommonModels.ChargePaymentEnumSchema }).readonly(); -export type UpdateFreightChargesDto = z.infer; - -/** - * UpdateShippingInstructionsShippersDeclaredValueDtoSchema - * @type { object } - * @property { string } currency Currency - * @property { number } shipperDeclaredValue Shipper declared value - */ -export const UpdateShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string().describe("Currency"), shipperDeclaredValue: z.number().describe("Shipper declared value") }).readonly(); -export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer; - -/** - * UpdateShippingInstructionsNotificationEmailsDtoSchema - * @type { object } - * @property { string } siRequestorEmails SI requestor emails - */ -export const UpdateShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string().describe("SI requestor emails") }).readonly(); -export type UpdateShippingInstructionsNotificationEmailsDto = z.infer; - -/** - * UpdateShippingInstructionsRequestDtoSchema - * @type { object } - * @property { string } date Date - * @property { UpdateShippingInstructionsHeaderDto } header Header - * @property { UpdateShippingInstructionsGeneralDetailsDto } generalDetails General details - * @property { UpdateShippingInstructionsReferencesDto } references References - * @property { UpdateShippingInstructionsTransportDto } transport Transport - * @property { UpdateShippingInstructionsCustomsComplianceDto } customsCompliance Customs compliance - * @property { UpdateShippingInstructionsIcs2Dto } ics2 ICS2 - * @property { UpdateShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers Cargo identification numbers - * @property { UpdateShippingInstructionsCargoDto[] } cargo Cargo - * @property { UpdateFreightChargesDto } freightCharges - * @property { UpdateShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue Shipper's declared value - * @property { UpdateShippingInstructionsNotificationEmailsDto } notificationEmails Notification emails - */ -export const UpdateShippingInstructionsRequestDtoSchema = z.object({ date: z.iso.datetime({ offset: true }).describe("Date"), header: UpdateShippingInstructionsHeaderDtoSchema.describe("Header"), generalDetails: UpdateShippingInstructionsGeneralDetailsDtoSchema.describe("General details"), references: UpdateShippingInstructionsReferencesDtoSchema.describe("References"), transport: UpdateShippingInstructionsTransportDtoSchema.describe("Transport"), customsCompliance: UpdateShippingInstructionsCustomsComplianceDtoSchema.describe("Customs compliance"), ics2: UpdateShippingInstructionsIcs2DtoSchema.describe("ICS2"), cargoIdentificationNumbers: UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema.describe("Cargo identification numbers"), cargo: z.array(UpdateShippingInstructionsCargoDtoSchema).readonly().describe("Cargo"), freightCharges: UpdateFreightChargesDtoSchema, shippersDeclaredValue: UpdateShippingInstructionsShippersDeclaredValueDtoSchema.describe("Shipper's declared value"), notificationEmails: UpdateShippingInstructionsNotificationEmailsDtoSchema.describe("Notification emails") }).readonly(); -export type UpdateShippingInstructionsRequestDto = z.infer; - -} diff --git a/test/generated/full/shippingInstructions/shippingInstructions.queries.ts b/test/generated/full/shippingInstructions/shippingInstructions.queries.ts deleted file mode 100644 index a3a9034..0000000 --- a/test/generated/full/shippingInstructions/shippingInstructions.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ShippingInstructionsAcl } from "./shippingInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ShippingInstructionsModels } from "./shippingInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ShippingInstructionsApi } from "./shippingInstructions.api"; - -export namespace ShippingInstructionsQueries { -export const moduleName = QueryModule.ShippingInstructions; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id", officeId, positionId, id] as const, - preview: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id/preview", officeId, positionId, id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create shipping instructions - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId } )); - return ShippingInstructionsApi.create(officeId, positionId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGet` - * @summary Get shipping instructions data - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId, id), - queryFn: () => { - checkAcl(ShippingInstructionsAcl.canUseGet({ officeId } )); - return ShippingInstructionsApi.get(officeId, positionId, id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update shipping instructions - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { ShippingInstructionsModels.UpdateShippingInstructionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Shipping instructions updated successfully - * @statusCodes [200, 401, 404] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id, data }) => { - checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId } )); - return ShippingInstructionsApi.update(officeId, positionId, id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, id } = variables; - const updateKeys = [keys.get(officeId, positionId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteOfficesPositionsShippingInstructionsById` - * @summary Delete shipping instructions - * @permission Requires `canUseDeleteOfficesPositionsShippingInstructionsById` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Shipping instructions deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteOfficesPositionsShippingInstructionsById = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id }) => { - checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId } )); - return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreview` - recommended when file should be cached - * @summary Preview shipping instructions document - * @permission Requires `canUsePreview` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreview = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.preview(officeId, positionId, id), - queryFn: () => { - checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); - return ShippingInstructionsApi.preview(officeId, positionId, id, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewMutation` - recommended when file should not be cached - * @summary Preview shipping instructions document - * @permission Requires `canUsePreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id }) => { - checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); - return ShippingInstructionsApi.preview(officeId, positionId, id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, id } = variables; - const updateKeys = [keys.preview(officeId, positionId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerate` - * @summary Generate shipping instructions document - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id, data }) => { - checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId } )); - return ShippingInstructionsApi.generate(officeId, positionId, id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/terminals/terminals.acl.ts b/test/generated/full/terminals/terminals.acl.ts deleted file mode 100644 index d29c8a0..0000000 --- a/test/generated/full/terminals/terminals.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace TerminalsAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Terminal" -] as AbilityTuple<"Create", "Terminal">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Terminal" -] as AbilityTuple<"Read", "Terminal">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Terminal" -] as AbilityTuple<"Read", "Terminal">; - -/** - * Use for `useGetById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( -) => [ - "Read", - "Terminal" -] as AbilityTuple<"Read", "Terminal">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Terminal" -] as AbilityTuple<"Update", "Terminal">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Terminal" -] as AbilityTuple<"Archive", "Terminal">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Unarchive", - "Terminal" -] as AbilityTuple<"Unarchive", "Terminal">; - -} diff --git a/test/generated/full/terminals/terminals.api.ts b/test/generated/full/terminals/terminals.api.ts deleted file mode 100644 index 31b5d76..0000000 --- a/test/generated/full/terminals/terminals.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { TerminalsModels } from "./terminals.models"; - -export namespace TerminalsApi { -export const create = (data: TerminalsModels.CreateTerminalRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals`, - ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), - config - ) -}; -export const paginate = (limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, - `/terminals`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, - `/terminals/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals/${id}`, - config - ) -}; -export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals/${id}`, - ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/terminals/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/terminals/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/terminals/terminals.configs.ts b/test/generated/full/terminals/terminals.configs.ts deleted file mode 100644 index 36d2f2c..0000000 --- a/test/generated/full/terminals/terminals.configs.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { TerminalsModels } from "./terminals.models"; -import { CommonModels } from "@/data/common/common.models"; -import { TerminalsQueries } from "./terminals.queries"; -import { TerminalsAcl } from "./terminals.acl"; - -export namespace TerminalsConfigs { -export const terminalsConfig = { - meta: { - title: "Terminals", - }, - readAll: { - acl: TerminalsAcl.canUsePaginate, - schema: TerminalsModels.TerminalResponseDTOSchema, - paginated: TerminalsQueries.usePaginate, - infinite: TerminalsQueries.usePaginateInfinite, - filters: { - schema: TerminalsModels.TerminalPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: TerminalsModels.TerminalPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - type: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: TerminalsModels.TerminalResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - name: true, - type: true, - airport: true, - port: true, - archived: true, - shortName: true, - address: true, - additionalInformation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: TerminalsModels.TerminalsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: TerminalsAcl.canUseGetById, - schema: TerminalsModels.TerminalResponseDTOSchema, - query: TerminalsQueries.useGetById, - }, - create: { - acl: TerminalsAcl.canUseCreate, - schema: TerminalsModels.CreateTerminalRequestDTOSchema, - mutation: TerminalsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: TerminalsModels.CreateTerminalRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - type: true, - portId: true, - airportId: true, - street: true, - secondaryStreet: true, - zip: true, - district: true, - cityId: true, - countryId: true, - additionalInformation: true, - }, - }, -}) - }, - update: { - acl: TerminalsAcl.canUseUpdate, - schema: TerminalsModels.UpdateTerminalRequestDTOSchema, - mutation: TerminalsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: TerminalsModels.UpdateTerminalRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - type: true, - portId: true, - airportId: true, - street: true, - secondaryStreet: true, - zip: true, - district: true, - cityId: true, - countryId: true, - additionalInformation: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: TerminalsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: TerminalsQueries.usePaginateLabels, - infinite: TerminalsQueries.usePaginateLabelsInfinite, - filters: { - schema: TerminalsModels.TerminalLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: TerminalsModels.TerminalLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/terminals/terminals.models.ts b/test/generated/full/terminals/terminals.models.ts deleted file mode 100644 index a543664..0000000 --- a/test/generated/full/terminals/terminals.models.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace TerminalsModels { -/** - * TerminalTypeSchema - * @type { enum } - */ -export const TerminalTypeSchema = z.enum(["port", "airport"]); -export type TerminalType = z.infer; -export const TerminalType = TerminalTypeSchema.enum; - -/** - * CreateTerminalRequestDTOSchema - * @type { object } - * @property { string } matchCode Unique identifier code for the terminal - * @property { string } shortName Optional short name for the terminal - * @property { string } name Full name of the terminal - * @property { TerminalType } type Type of the terminal - * @property { string } portId ID of associated port, required if type is port - * @property { string } airportId ID of associated airport, required if type is airport - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP / Postal code - * @property { string } district District - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } additionalInformation Additional information - */ -export const CreateTerminalRequestDTOSchema = z.object({ matchCode: z.string().describe("Unique identifier code for the terminal"), shortName: z.string().describe("Optional short name for the terminal").nullish(), name: z.string().describe("Full name of the terminal"), type: TerminalTypeSchema.describe("Type of the terminal"), portId: z.string().describe("ID of associated port, required if type is port").nullish(), airportId: z.string().describe("ID of associated airport, required if type is airport").nullish(), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street").nullish(), zip: z.string().describe("ZIP / Postal code"), district: z.string().describe("District").nullish(), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), additionalInformation: z.string().describe("Additional information").nullish() }).readonly(); -export type CreateTerminalRequestDTO = z.infer; - -/** - * TerminalCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const TerminalCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type TerminalCityDto = z.infer; - -/** - * TerminalCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const TerminalCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); -export type TerminalCountryDto = z.infer; - -/** - * TerminalAddressDTOSchema - * @type { object } - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP/Postal code - * @property { TerminalCityDto } city - * @property { string } district District name - * @property { TerminalCountryDto } country - */ -export const TerminalAddressDTOSchema = z.object({ street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street").nullish(), zip: z.string().describe("ZIP/Postal code"), city: TerminalCityDtoSchema.nullish(), district: z.string().describe("District name").nullish(), country: TerminalCountryDtoSchema.nullish() }).readonly(); -export type TerminalAddressDTO = z.infer; - -/** - * AirportReferenceDTOSchema - * @type { object } - * @property { string } id Unique identifier of the airport - * @property { string } name Name of the airport - */ -export const AirportReferenceDTOSchema = z.object({ id: z.string().describe("Unique identifier of the airport"), name: z.string().describe("Name of the airport") }).readonly(); -export type AirportReferenceDTO = z.infer; - -/** - * PortReferenceDTOSchema - * @type { object } - * @property { string } id Unique identifier of the port - * @property { string } name Name of the port - */ -export const PortReferenceDTOSchema = z.object({ id: z.string().describe("Unique identifier of the port"), name: z.string().describe("Name of the port") }).readonly(); -export type PortReferenceDTO = z.infer; - -/** - * TerminalEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type TerminalEmployeeDTO = z.infer; - -/** - * TerminalResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the terminal - * @property { string } matchCode Match code for the terminal - * @property { string } name Name of the terminal - * @property { TerminalType } type Type of the terminal - * @property { AirportReferenceDTO } airport Associated airport information if terminal type is airport - * @property { PortReferenceDTO } port Associated port information if terminal type is port - * @property { boolean } archived Archived status of the terminal - * @property { string } shortName Short name of the terminal - * @property { TerminalAddressDTO } address Address of the terminal - * @property { string } additionalInformation Additional information - * @property { string } createdById - * @property { TerminalEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { TerminalEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const TerminalResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the terminal"), matchCode: z.string().describe("Match code for the terminal"), name: z.string().describe("Name of the terminal"), type: TerminalTypeSchema.describe("Type of the terminal").nullish(), airport: AirportReferenceDTOSchema.describe("Associated airport information if terminal type is airport").nullish(), port: PortReferenceDTOSchema.describe("Associated port information if terminal type is port").nullish(), archived: z.boolean().describe("Archived status of the terminal"), shortName: z.string().describe("Short name of the terminal").nullish(), address: TerminalAddressDTOSchema.describe("Address of the terminal").nullish(), additionalInformation: z.string().describe("Additional information").nullish(), createdById: z.string().nullish(), createdBy: TerminalEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: TerminalEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type TerminalResponseDTO = z.infer; - -/** - * UpdateTerminalRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code for the terminal - * @property { string } shortName Updated short name - * @property { string } name Updated name - * @property { TerminalType } type Type of the terminal - * @property { string } portId ID of associated port, required if type is port - * @property { string } airportId ID of associated airport, required if type is airport - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP / Postal code - * @property { string } district District - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } additionalInformation Additional information - */ -export const UpdateTerminalRequestDTOSchema = z.object({ matchCode: z.string().describe("Updated match code for the terminal"), shortName: z.string().describe("Updated short name"), name: z.string().describe("Updated name"), type: TerminalTypeSchema.describe("Type of the terminal"), portId: z.string().describe("ID of associated port, required if type is port"), airportId: z.string().describe("ID of associated airport, required if type is airport"), street: z.string().describe("Street address"), secondaryStreet: z.string().describe("Secondary street"), zip: z.string().describe("ZIP / Postal code"), district: z.string().describe("District"), cityId: z.string().describe("City id"), countryId: z.string().describe("Country id"), additionalInformation: z.string().describe("Additional information") }).readonly(); -export type UpdateTerminalRequestDTO = z.infer; - -/** - * TerminalPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter terminals by matchCode, shortName, or name - * @property { boolean } archived - * @property { string } type - */ -export const TerminalPaginationFilterDtoSchema = z.object({ search: z.string().describe("Search term to filter terminals by matchCode, shortName, or name"), archived: z.boolean(), type: TerminalTypeSchema }).readonly(); -export type TerminalPaginationFilterDto = z.infer; - -/** - * TerminalLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const TerminalLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type TerminalLabelFilterDto = z.infer; - -/** - * TerminalsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const TerminalsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type TerminalsPaginateOrderParamEnum = z.infer; -export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSchema.enum; - -/** - * TerminalsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { TerminalResponseDTO[] } items - */ -export const TerminalsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(TerminalResponseDTOSchema).readonly() }).readonly().shape }); -export type TerminalsPaginateResponse = z.infer; - -/** - * TerminalsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const TerminalsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type TerminalsPaginateLabelsOrderParamEnum = z.infer; -export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * TerminalsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const TerminalsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type TerminalsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/terminals/terminals.queries.ts b/test/generated/full/terminals/terminals.queries.ts deleted file mode 100644 index bec7227..0000000 --- a/test/generated/full/terminals/terminals.queries.ts +++ /dev/null @@ -1,261 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { TerminalsAcl } from "./terminals.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { TerminalsModels } from "./terminals.models"; -import { TerminalsApi } from "./terminals.api"; - -export namespace TerminalsQueries { -export const moduleName = QueryModule.Terminals; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string) => [...keys.all, "/terminals", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string) => [...keys.all, "/terminals/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getById: (id: string) => [...keys.all, "/terminals/:id", id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a new terminal - * @permission Requires `canUseCreate` ability - * @param { TerminalsModels.CreateTerminalRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(TerminalsAcl.canUseCreate()); - return TerminalsApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Terminals - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Terminals - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate terminals with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate terminals with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetById` - * @summary Get terminal details by ID - * @permission Requires `canUseGetById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(id), - queryFn: () => { - checkAcl(TerminalsAcl.canUseGetById()); - return TerminalsApi.getById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update terminal details - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { TerminalsModels.UpdateTerminalRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(TerminalsAcl.canUseUpdate()); - return TerminalsApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.getById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a terminal - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(TerminalsAcl.canUseArchive()); - return TerminalsApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a terminal - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(TerminalsAcl.canUseUnarchive()); - return TerminalsApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/useCrossTabQueryInvalidation.ts b/test/generated/full/useCrossTabQueryInvalidation.ts deleted file mode 100644 index d74d707..0000000 --- a/test/generated/full/useCrossTabQueryInvalidation.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { QueryClient, QueryKey } from "@tanstack/react-query"; - -const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; - -/** - * Broadcasts a query invalidation event to all other open tabs via localStorage. - * - * @param queryKeys - An array of query keys to invalidate (array of arrays). - * - * NOTE: The `storage` event only fires in *other* tabs — the calling tab - * must invalidate its own queryClient separately if needed. - */ -export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { - localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); -}; - -/** - * Registers a one-time global `storage` event listener that reacts to - * cross-tab invalidation broadcasts. Safe to call from multiple hooks — - * only the first call sets up the listener. - */ -let isListenerSetUp = false; - -export const setupCrossTabListener = (queryClient: QueryClient) => { - if (isListenerSetUp) return; - isListenerSetUp = true; - - window.addEventListener("storage", (e: StorageEvent) => { - if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; - - try { - const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; - for (const queryKey of keys) { - queryClient.invalidateQueries({ queryKey }); - } - } catch { - // Ignore malformed payloads - } - }); -}; diff --git a/test/generated/full/useMutationEffects.ts b/test/generated/full/useMutationEffects.ts deleted file mode 100644 index ed61406..0000000 --- a/test/generated/full/useMutationEffects.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { useCallback, useEffect } from "react"; - -import { QueryKey, useQueryClient } from "@tanstack/react-query"; -import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; -import { QueryModule } from "./queryModules"; -import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; - -export interface MutationEffectsOptions { - invalidateCurrentModule?: boolean; - crossTabInvalidation?: boolean; - invalidationMap?: InvalidationMap; - invalidateModules?: QueryModule[]; - invalidateKeys?: QueryKey[]; - preferUpdate?: boolean; -} - -export interface UseMutationEffectsProps { - currentModule: QueryModule; -} - -export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { - const queryClient = useQueryClient(); - const config = OpenApiQueryConfig.useConfig(); - - useEffect(() => { - if (!config.crossTabInvalidation) return; - setupCrossTabListener(queryClient); - }, [queryClient, config.crossTabInvalidation]); - - const runMutationEffects = useCallback( - async ( - data: TData, - variables: TVariables, - options: MutationEffectsOptions = {}, - updateKeys?: QueryKey[], - ) => { - const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; - const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; - const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; - - const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => - keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); - const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => - prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); - const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); - - const shouldInvalidateQuery = (queryKey: QueryKey) => { - const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); - if (shouldUpdate && isUpdateKey) { - return false; - } - - const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; - const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); - const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - const isMappedKey = - !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - - return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; - }; - - const invalidatedQueryKeys: QueryKey[] = []; - - queryClient.invalidateQueries({ - predicate: ({ queryKey }) => { - const shouldInvalidate = shouldInvalidateQuery(queryKey); - - if (shouldInvalidate && config.crossTabInvalidation) { - invalidatedQueryKeys.push([...queryKey]); - } - - return shouldInvalidate; - }, - }); - - if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { - broadcastQueryInvalidation(invalidatedQueryKeys); - } - - if (shouldUpdate && updateKeys) { - updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); - } - }, - [ - queryClient, - currentModule, - config.preferUpdate, - config.invalidateCurrentModule, - config.invalidationMap, - config.crossTabInvalidation, - ], - ); - - return { runMutationEffects }; -} diff --git a/test/generated/full/userActivity/userActivity.api.ts b/test/generated/full/userActivity/userActivity.api.ts deleted file mode 100644 index affc18b..0000000 --- a/test/generated/full/userActivity/userActivity.api.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { UserActivityModels } from "./userActivity.models"; - -export namespace UserActivityApi { -export const get = (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, - `/offices/${officeId}/${entityType}/${entityId}/activity`, - { - ...config, - params: { - activeThresholdMinutes: ZodExtended.parse(z.number().gte(1).describe("Active threshold in minutes").nullish(), activeThresholdMinutes, { type: "query", name: "activeThresholdMinutes" }), - }, - } - ) -}; -} diff --git a/test/generated/full/userActivity/userActivity.models.ts b/test/generated/full/userActivity/userActivity.models.ts deleted file mode 100644 index 5a79039..0000000 --- a/test/generated/full/userActivity/userActivity.models.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { z } from "zod"; - -export namespace UserActivityModels { -/** - * ActivityTypeEnumSchema - * @type { enum } - */ -export const ActivityTypeEnumSchema = z.enum(["View", "Modify"]); -export type ActivityTypeEnum = z.infer; -export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; - -/** - * UserSectionActivityDtoSchema - * @type { object } - * @property { string } section Section name - * @property { ActivityTypeEnum } activityType Type of activity - * @property { string } lastSeen Last seen timestamp - */ -export const UserSectionActivityDtoSchema = z.object({ section: z.string().describe("Section name"), activityType: ActivityTypeEnumSchema.describe("Type of activity"), lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp") }).readonly(); -export type UserSectionActivityDto = z.infer; - -/** - * ActiveUserDtoSchema - * @type { object } - * @property { string } userId User ID - * @property { string } firstName User first name - * @property { string } lastName User last name - * @property { string } userAvatar User avatar URL - * @property { UserSectionActivityDto } section User section activity - * @property { string } lastSeen Last seen timestamp - * @property { boolean } isCurrentlyActive Is currently active - */ -export const ActiveUserDtoSchema = z.object({ userId: z.string().describe("User ID"), firstName: z.string().describe("User first name"), lastName: z.string().describe("User last name"), userAvatar: z.string().describe("User avatar URL").nullish(), section: UserSectionActivityDtoSchema.describe("User section activity"), lastSeen: z.iso.datetime({ offset: true }).describe("Last seen timestamp"), isCurrentlyActive: z.boolean().describe("Is currently active") }).readonly(); -export type ActiveUserDto = z.infer; - -/** - * ActivityEntityTypeEnumSchema - * @type { enum } - */ -export const ActivityEntityTypeEnumSchema = z.enum(["Position", "Invoice", "BusinessPartner", "Quote"]); -export type ActivityEntityTypeEnum = z.infer; -export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; - -/** - * ActivityMetadataDtoSchema - * @type { object } - * @property { number } totalActiveUsers Total number of active users - * @property { string } entityId Entity ID - * @property { ActivityEntityTypeEnum } entityType Entity type - * @property { number } activeThresholdMinutes Active threshold in minutes - */ -export const ActivityMetadataDtoSchema = z.object({ totalActiveUsers: z.number().describe("Total number of active users"), entityId: z.string().describe("Entity ID"), entityType: ActivityEntityTypeEnumSchema.describe("Entity type"), activeThresholdMinutes: z.number().describe("Active threshold in minutes") }).readonly(); -export type ActivityMetadataDto = z.infer; - -/** - * UserActivityResponseDtoSchema - * @type { object } - * @property { ActiveUserDto[] } activeUsers List of active users - * @property { ActivityMetadataDto } metadata Activity metadata - */ -export const UserActivityResponseDtoSchema = z.object({ activeUsers: z.array(ActiveUserDtoSchema).readonly().describe("List of active users"), metadata: ActivityMetadataDtoSchema.describe("Activity metadata") }).readonly(); -export type UserActivityResponseDto = z.infer; - -} diff --git a/test/generated/full/userActivity/userActivity.queries.ts b/test/generated/full/userActivity/userActivity.queries.ts deleted file mode 100644 index 4e54389..0000000 --- a/test/generated/full/userActivity/userActivity.queries.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { UserActivityApi } from "./userActivity.api"; - -export namespace UserActivityQueries { -export const moduleName = QueryModule.UserActivity; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number) => [...keys.all, "/offices/:officeId/:entityType/:entityId/activity", officeId, entityType, entityId, activeThresholdMinutes] as const, -}; - -/** - * Query `useGet` - * @summary Get user activity for an entity - * @param { string } object.officeId Path parameter - * @param { string } object.entityType Path parameter - * @param { string } object.entityId Path parameter - * @param { number } object.activeThresholdMinutes Query parameter. Active threshold in minutes. Minimum: `1` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, entityType, entityId, activeThresholdMinutes }: { officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - - return useQuery({ - queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), - queryFn: () => - UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes, config), - ...options, - }); -}; - -} diff --git a/test/generated/full/vatRules/vatRules.acl.ts b/test/generated/full/vatRules/vatRules.acl.ts deleted file mode 100644 index 827096c..0000000 --- a/test/generated/full/vatRules/vatRules.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace VatRulesAcl { -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "VatRule" -] as AbilityTuple<"Read", "VatRule">; - -/** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( -) => [ - "Read", - "VatRule" -] as AbilityTuple<"Read", "VatRule">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "VatRule" -] as AbilityTuple<"Create", "VatRule">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "VatRule" -] as AbilityTuple<"Read", "VatRule">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "VatRule" -] as AbilityTuple<"Update", "VatRule">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Update", - "VatRule" -] as AbilityTuple<"Update", "VatRule">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Update", - "VatRule" -] as AbilityTuple<"Update", "VatRule">; - -} diff --git a/test/generated/full/vatRules/vatRules.api.ts b/test/generated/full/vatRules/vatRules.api.ts deleted file mode 100644 index 4280101..0000000 --- a/test/generated/full/vatRules/vatRules.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { VatRulesModels } from "./vatRules.models"; - -export namespace VatRulesApi { -export const paginateLabels = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, - `/vat-rules/labels/paginate`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: VatRulesModels.VatRulesListResponseSchema }, - `/vat-rules`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules`, - ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), - config - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}`, - config - ) -}; -export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}`, - ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/vatRules/vatRules.configs.ts b/test/generated/full/vatRules/vatRules.configs.ts deleted file mode 100644 index 092a685..0000000 --- a/test/generated/full/vatRules/vatRules.configs.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { VatRulesModels } from "./vatRules.models"; -import { CommonModels } from "@/data/common/common.models"; -import { VatRulesQueries } from "./vatRules.queries"; -import { VatRulesAcl } from "./vatRules.acl"; - -export namespace VatRulesConfigs { -export const vatRulesConfig = { - meta: { - title: "Vat Rules", - }, - readAll: { - acl: VatRulesAcl.canUseList, - schema: VatRulesModels.VatRuleResponseDTOSchema, - paginated: VatRulesQueries.useList, - infinite: VatRulesQueries.useListInfinite, - filters: { - schema: VatRulesModels.VatRuleFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: VatRulesModels.VatRuleFilterDtoSchema, - options: { - inputs: { - matchcode: true, - name: true, - type: true, - officeId: true, - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: VatRulesModels.VatRuleResponseDTOSchema, - options: { - columns: { - id: true, - matchcode: true, - name: true, - vatPercentage: true, - vatNumber: true, - noTax: true, - type: true, - archived: true, - isReverseCharge: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - officeId: true, - office: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - sortable: VatRulesModels.VatRulesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: VatRulesAcl.canUseFindById, - schema: VatRulesModels.VatRuleResponseDTOSchema, - query: VatRulesQueries.useFindById, - }, - create: { - acl: VatRulesAcl.canUseCreate, - schema: VatRulesModels.CreateVatRuleRequestDTOSchema, - mutation: VatRulesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: VatRulesModels.CreateVatRuleRequestDTOSchema, - options: { - inputs: { - matchcode: true, - name: true, - noTax: true, - vatPercentage: true, - vatNumber: true, - type: true, - officeId: true, - isReverseCharge: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - }, -}) - }, - update: { - acl: VatRulesAcl.canUseUpdate, - schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, - mutation: VatRulesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, - options: { - inputs: { - matchcode: true, - name: true, - noTax: true, - vatPercentage: true, - vatNumber: true, - type: true, - officeId: true, - isReverseCharge: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: VatRulesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: VatRulesQueries.usePaginateLabels, - infinite: VatRulesQueries.usePaginateLabelsInfinite, - filters: { - schema: VatRulesModels.VatRuleFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: VatRulesModels.VatRuleFilterDtoSchema, - options: { - inputs: { - matchcode: true, - name: true, - type: true, - officeId: true, - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/vatRules/vatRules.models.ts b/test/generated/full/vatRules/vatRules.models.ts deleted file mode 100644 index 6b65ef4..0000000 --- a/test/generated/full/vatRules/vatRules.models.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace VatRulesModels { -/** - * VatRuleTypeEnumSchema - * @type { enum } - */ -export const VatRuleTypeEnumSchema = z.enum(["Outgoing", "Incoming"]); -export type VatRuleTypeEnum = z.infer; -export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; - -/** - * VatRuleFilterDtoSchema - * @type { object } - * @property { string } matchcode Matchcode to filter by - * @property { string } name Name to filter by - * @property { VatRuleTypeEnum } type - * @property { string } officeId Office ID to filter by - * @property { boolean } archived Filter by archived status - * @property { string } search Search to filter by - */ -export const VatRuleFilterDtoSchema = z.object({ matchcode: z.string().describe("Matchcode to filter by"), name: z.string().describe("Name to filter by"), type: VatRuleTypeEnumSchema, officeId: z.string().describe("Office ID to filter by"), archived: z.boolean().describe("Filter by archived status"), search: z.string().describe("Search to filter by") }).readonly(); -export type VatRuleFilterDto = z.infer; - -/** - * VatRuleEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type VatRuleEmployeeDTO = z.infer; - -/** - * VatRuleOfficeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type VatRuleOfficeDTO = z.infer; - -/** - * VatRuleResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchcode - * @property { string } name - * @property { number } vatPercentage - * @property { number } vatNumber VAT rule reference number - * @property { boolean } noTax - * @property { VatRuleTypeEnum } type - * @property { boolean } archived - * @property { boolean } isReverseCharge - * @property { string } createdById - * @property { VatRuleEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { VatRuleEmployeeDTO } updatedBy - * @property { string } updatedAt - * @property { string } officeId - * @property { VatRuleOfficeDTO } office - * @property { string } bookkeepingId - * @property { string } bookkeepingTargetAccountNumber - */ -export const VatRuleResponseDTOSchema = z.object({ id: z.string(), matchcode: z.string(), name: z.string(), vatPercentage: z.number(), vatNumber: z.number().describe("VAT rule reference number").nullish(), noTax: z.boolean().nullish(), type: VatRuleTypeEnumSchema, archived: z.boolean(), isReverseCharge: z.boolean(), createdById: z.string().nullish(), createdBy: VatRuleEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: VatRuleEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), officeId: z.string(), office: VatRuleOfficeDTOSchema.nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }).readonly(); -export type VatRuleResponseDTO = z.infer; - -/** - * CreateVatRuleRequestDTOSchema - * @type { object } - * @property { string } matchcode Unique matchcode for the VAT rule - * @property { string } name Name of the VAT rule - * @property { boolean } noTax - * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` - * @property { number } vatNumber VAT rule reference number - * @property { VatRuleTypeEnum } type Type of VAT rule - * @property { string } officeId Office ID - * @property { boolean } isReverseCharge Is reverse charge VAT rule - * @property { string } bookkeepingId Bookkeeping ID - * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number - */ -export const CreateVatRuleRequestDTOSchema = z.object({ matchcode: z.string().describe("Unique matchcode for the VAT rule"), name: z.string().describe("Name of the VAT rule"), noTax: z.boolean().nullish(), vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), vatNumber: z.number().describe("VAT rule reference number").nullish(), type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), officeId: z.string().describe("Office ID"), isReverseCharge: z.boolean().describe("Is reverse charge VAT rule").nullish(), bookkeepingId: z.string().describe("Bookkeeping ID").nullish(), bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullish() }).readonly(); -export type CreateVatRuleRequestDTO = z.infer; - -/** - * UpdateVatRuleRequestDTOSchema - * @type { object } - * @property { string } matchcode Unique matchcode for the VAT rule - * @property { string } name Name of the VAT rule - * @property { boolean } noTax - * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` - * @property { number } vatNumber VAT rule reference number. Minimum: `0` - * @property { VatRuleTypeEnum } type Type of VAT rule - * @property { string } officeId Office ID - * @property { boolean } isReverseCharge Is reverse charge VAT rule - * @property { string } bookkeepingId Bookkeeping ID - * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number - */ -export const UpdateVatRuleRequestDTOSchema = z.object({ matchcode: z.string().describe("Unique matchcode for the VAT rule"), name: z.string().describe("Name of the VAT rule"), noTax: z.boolean(), vatPercentage: z.number().gte(0).lte(100).describe("VAT percentage (0-100)"), vatNumber: z.number().gte(0).describe("VAT rule reference number").nullable(), type: VatRuleTypeEnumSchema.describe("Type of VAT rule"), officeId: z.string().describe("Office ID"), isReverseCharge: z.boolean().describe("Is reverse charge VAT rule"), bookkeepingId: z.string().describe("Bookkeeping ID").nullable(), bookkeepingTargetAccountNumber: z.string().describe("Bookkeeping target account number").nullable() }).readonly(); -export type UpdateVatRuleRequestDTO = z.infer; - -/** - * VatRulesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const VatRulesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type VatRulesPaginateLabelsOrderParamEnum = z.infer; -export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * VatRulesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const VatRulesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type VatRulesPaginateLabelsResponse = z.infer; - -/** - * VatRulesListOrderParamEnumSchema - * @type { enum } - */ -export const VatRulesListOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type VatRulesListOrderParamEnum = z.infer; -export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; - -/** - * VatRulesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { VatRuleResponseDTO[] } items - */ -export const VatRulesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(VatRuleResponseDTOSchema).readonly() }).readonly().shape }); -export type VatRulesListResponse = z.infer; - -} diff --git a/test/generated/full/vatRules/vatRules.queries.ts b/test/generated/full/vatRules/vatRules.queries.ts deleted file mode 100644 index e0cd0f9..0000000 --- a/test/generated/full/vatRules/vatRules.queries.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { VatRulesAcl } from "./vatRules.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { VatRulesModels } from "./vatRules.models"; -import { VatRulesApi } from "./vatRules.api"; - -export namespace VatRulesQueries { -export const moduleName = QueryModule.VatRules; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", "infinite", limit, order, filter, cursor] as const, - list: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/vat-rules/:id", id] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate VAT rule labels (id and matchcode only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate VAT rule labels (id and matchcode only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List VAT rules - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List VAT rules - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new VAT rule - * @permission Requires `canUseCreate` ability - * @param { VatRulesModels.CreateVatRuleRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(VatRulesAcl.canUseCreate()); - return VatRulesApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get VAT rule by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(VatRulesAcl.canUseFindById()); - return VatRulesApi.findById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update VAT rule by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { VatRulesModels.UpdateVatRuleRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(VatRulesAcl.canUseUpdate()); - return VatRulesApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive VAT rule - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(VatRulesAcl.canUseArchive()); - return VatRulesApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive VAT rule - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(VatRulesAcl.canUseUnarchive()); - return VatRulesApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/warehouses/warehouses.acl.ts b/test/generated/full/warehouses/warehouses.acl.ts deleted file mode 100644 index 65a76ba..0000000 --- a/test/generated/full/warehouses/warehouses.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace WarehousesAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Warehouse" -] as AbilityTuple<"Create", "Warehouse">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Warehouse" -] as AbilityTuple<"Read", "Warehouse">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Warehouse" -] as AbilityTuple<"Read", "Warehouse">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Warehouse" -] as AbilityTuple<"Read", "Warehouse">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Warehouse" -] as AbilityTuple<"Update", "Warehouse">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Warehouse" -] as AbilityTuple<"Archive", "Warehouse">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "Warehouse" -] as AbilityTuple<"Archive", "Warehouse">; - -} diff --git a/test/generated/full/warehouses/warehouses.api.ts b/test/generated/full/warehouses/warehouses.api.ts deleted file mode 100644 index b2e2dc5..0000000 --- a/test/generated/full/warehouses/warehouses.api.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WarehousesModels } from "./warehouses.models"; - -export namespace WarehousesApi { -export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses`, - ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), - config - ) -}; -export const paginate = (limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, - `/warehouses`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, - `/warehouses/paginate/labels`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses/${id}`, - config - ) -}; -export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses/${id}`, - ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), - config - ) -}; -export const archive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/warehouses/${id}/archive`, - undefined, - config - ) -}; -export const unarchive = (id: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/warehouses/${id}/unarchive`, - undefined, - config - ) -}; -} diff --git a/test/generated/full/warehouses/warehouses.configs.ts b/test/generated/full/warehouses/warehouses.configs.ts deleted file mode 100644 index d53c994..0000000 --- a/test/generated/full/warehouses/warehouses.configs.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { WarehousesModels } from "./warehouses.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WarehousesQueries } from "./warehouses.queries"; -import { WarehousesAcl } from "./warehouses.acl"; - -export namespace WarehousesConfigs { -export const warehousesConfig = { - meta: { - title: "Warehouses", - }, - readAll: { - acl: WarehousesAcl.canUsePaginate, - schema: WarehousesModels.WarehouseResponseDTOSchema, - paginated: WarehousesQueries.usePaginate, - infinite: WarehousesQueries.usePaginateInfinite, - filters: { - schema: WarehousesModels.WarehouseFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WarehousesModels.WarehouseFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: WarehousesModels.WarehouseResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - city: true, - country: true, - district: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: WarehousesModels.WarehousesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: WarehousesAcl.canUseFindById, - schema: WarehousesModels.WarehouseResponseDTOSchema, - query: WarehousesQueries.useFindById, - }, - create: { - acl: WarehousesAcl.canUseCreate, - schema: WarehousesModels.CreateWarehouseRequestDTOSchema, - mutation: WarehousesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: WarehousesModels.CreateWarehouseRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, - update: { - acl: WarehousesAcl.canUseUpdate, - schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, - mutation: WarehousesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: WarehousesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: WarehousesQueries.usePaginateLabels, - infinite: WarehousesQueries.usePaginateLabelsInfinite, - filters: { - schema: WarehousesModels.WarehouseLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WarehousesModels.WarehouseLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/full/warehouses/warehouses.models.ts b/test/generated/full/warehouses/warehouses.models.ts deleted file mode 100644 index 0c5b059..0000000 --- a/test/generated/full/warehouses/warehouses.models.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WarehousesModels { -/** - * WarehouseCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type WarehouseCityDto = z.infer; - -/** - * WarehouseCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const WarehouseCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).readonly(); -export type WarehouseCountryDto = z.infer; - -/** - * WarehouseEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type WarehouseEmployeeDTO = z.infer; - -/** - * WarehouseResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { WarehouseCityDto } city - * @property { WarehouseCountryDto } country - * @property { string } district - * @property { boolean } archived - * @property { string } createdById - * @property { WarehouseEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { WarehouseEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const WarehouseResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: WarehouseCityDtoSchema.nullish(), country: WarehouseCountryDtoSchema.nullish(), district: z.string().nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: WarehouseEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: WarehouseEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type WarehouseResponseDTO = z.infer; - -/** - * CreateWarehouseRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } countryId - * @property { string } district - */ -export const CreateWarehouseRequestDTOSchema = z.object({ name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), cityId: z.string().nullish(), countryId: z.string().nullish(), district: z.string().nullish() }).readonly(); -export type CreateWarehouseRequestDTO = z.infer; - -/** - * WarehouseLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const WarehouseLabelFilterDtoSchema = z.object({ search: z.string() }).readonly(); -export type WarehouseLabelFilterDto = z.infer; - -/** - * WarehouseFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived Filter by archived status - */ -export const WarehouseFilterDtoSchema = z.object({ search: z.string(), archived: z.boolean().describe("Filter by archived status") }).readonly(); -export type WarehouseFilterDto = z.infer; - -/** - * UpdateWarehouseRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } countryId - * @property { string } district - */ -export const UpdateWarehouseRequestDTOSchema = z.object({ name: z.string(), shortName: z.string(), additionalInformation: z.string(), matchCode: z.string(), street: z.string(), secondaryStreet: z.string(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string() }).readonly(); -export type UpdateWarehouseRequestDTO = z.infer; - -/** - * WarehousesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const WarehousesPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type WarehousesPaginateOrderParamEnum = z.infer; -export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnumSchema.enum; - -/** - * WarehousesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { WarehouseResponseDTO[] } items - */ -export const WarehousesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WarehouseResponseDTOSchema).readonly() }).readonly().shape }); -export type WarehousesPaginateResponse = z.infer; - -/** - * WarehousesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const WarehousesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type WarehousesPaginateLabelsOrderParamEnum = z.infer; -export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * WarehousesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const WarehousesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).readonly() }).readonly().shape }); -export type WarehousesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/full/warehouses/warehouses.queries.ts b/test/generated/full/warehouses/warehouses.queries.ts deleted file mode 100644 index 667e346..0000000 --- a/test/generated/full/warehouses/warehouses.queries.ts +++ /dev/null @@ -1,261 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WarehousesAcl } from "./warehouses.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WarehousesModels } from "./warehouses.models"; -import { WarehousesApi } from "./warehouses.api"; - -export namespace WarehousesQueries { -export const moduleName = QueryModule.Warehouses; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string) => [...keys.all, "/warehouses", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/warehouses/:id", id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create warehouse - * @permission Requires `canUseCreate` ability - * @param { WarehousesModels.CreateWarehouseRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(WarehousesAcl.canUseCreate()); - return WarehousesApi.create(data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated warehouses - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated warehouses - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate warehouse labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate warehouse labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get warehouse by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(WarehousesAcl.canUseFindById()); - return WarehousesApi.findById(id, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update warehouse - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { WarehousesModels.UpdateWarehouseRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(WarehousesAcl.canUseUpdate()); - return WarehousesApi.update(id, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive warehouse - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(WarehousesAcl.canUseArchive()); - return WarehousesApi.archive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive warehouse - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(WarehousesAcl.canUseUnarchive()); - return WarehousesApi.unarchive(id, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/workingDocuments/workingDocuments.acl.ts b/test/generated/full/workingDocuments/workingDocuments.acl.ts deleted file mode 100644 index 344f8c6..0000000 --- a/test/generated/full/workingDocuments/workingDocuments.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List working documents - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument", object) : "WorkingDocument" -] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get working document by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument", object) : "WorkingDocument" -] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocuments/workingDocuments.api.ts b/test/generated/full/workingDocuments/workingDocuments.api.ts deleted file mode 100644 index bef7393..0000000 --- a/test/generated/full/workingDocuments/workingDocuments.api.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; - -export namespace WorkingDocumentsApi { -export const list = (positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, - `/offices/${officeId}/positions/${positionId}/working-documents`, - { - ...config, - params: { - order: ZodExtended.parse(ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).describe("Items per response").default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().describe("1-indexed page number to begin from").nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().describe("ID of item to start after").nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (positionId: string, id: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, - config - ) -}; -} diff --git a/test/generated/full/workingDocuments/workingDocuments.configs.ts b/test/generated/full/workingDocuments/workingDocuments.configs.ts deleted file mode 100644 index 5e7d622..0000000 --- a/test/generated/full/workingDocuments/workingDocuments.configs.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; -import { WorkingDocumentsQueries } from "./workingDocuments.queries"; -import { WorkingDocumentsAcl } from "./workingDocuments.acl"; - -export namespace WorkingDocumentsConfigs { -export const workingDocumentsConfig = { - meta: { - title: "Working Documents", - }, - readAll: { - acl: WorkingDocumentsAcl.canUseList, - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - paginated: WorkingDocumentsQueries.useList, - infinite: WorkingDocumentsQueries.useListInfinite, - filters: { - schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, - options: { - inputs: { - search: true, - type: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - name: true, - nameSuffix: true, - type: true, - referenceTable: true, - referenceId: true, - createdById: true, - createdAt: true, - createdBy: true, - }, - sortable: WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: WorkingDocumentsAcl.canUseFindById, - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - query: WorkingDocumentsQueries.useFindById, - }, -}; - -} diff --git a/test/generated/full/workingDocuments/workingDocuments.models.ts b/test/generated/full/workingDocuments/workingDocuments.models.ts deleted file mode 100644 index 1e946b4..0000000 --- a/test/generated/full/workingDocuments/workingDocuments.models.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsModels { -/** - * TypeEnumSchema - * @type { enum } - * @description Working document type - */ -export const TypeEnumSchema = z.enum(["export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "shipping-instructions"]); -export type TypeEnum = z.infer; -export const TypeEnum = TypeEnumSchema.enum; - -/** - * WorkingDocumentCreatedByResponseDTOSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } name Employee name - */ -export const WorkingDocumentCreatedByResponseDTOSchema = z.object({ id: z.string().describe("Employee ID"), name: z.string().describe("Employee name").nullable() }).readonly(); -export type WorkingDocumentCreatedByResponseDTO = z.infer; - -/** - * WorkingDocumentResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } positionId Position ID - * @property { string } name Working document name - * @property { string } nameSuffix Working document name suffix - * @property { string } type Working document type - * @property { string } referenceTable Reference table - * @property { string } referenceId Reference ID - * @property { string } createdById Created by - * @property { string } createdAt Created at - * @property { WorkingDocumentCreatedByResponseDTO } createdBy Created by - */ -export const WorkingDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string().describe("Position ID"), name: z.string().describe("Working document name"), nameSuffix: z.string().describe("Working document name suffix").nullish(), type: TypeEnumSchema.describe("Working document type"), referenceTable: z.string().describe("Reference table"), referenceId: z.string().describe("Reference ID"), createdById: z.string().describe("Created by"), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), createdBy: WorkingDocumentCreatedByResponseDTOSchema.describe("Created by") }).readonly(); -export type WorkingDocumentResponseDTO = z.infer; - -/** - * WorkingDocumentFilterDtoSchema - * @type { object } - * @property { string } search - * @property { string } type - */ -export const WorkingDocumentFilterDtoSchema = z.object({ search: z.string(), type: z.string() }).readonly(); -export type WorkingDocumentFilterDto = z.infer; - -/** - * WorkingDocumentsListOrderParamEnumSchema - * @type { enum } - */ -export const WorkingDocumentsListOrderParamEnumSchema = z.enum(["NAME", "TYPE", "CREATED_AT", "UPDATED_AT"]); -export type WorkingDocumentsListOrderParamEnum = z.infer; -export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParamEnumSchema.enum; - -/** - * WorkingDocumentsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { WorkingDocumentResponseDTO[] } items - */ -export const WorkingDocumentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).readonly() }).readonly().shape }); -export type WorkingDocumentsListResponse = z.infer; - -} diff --git a/test/generated/full/workingDocuments/workingDocuments.queries.ts b/test/generated/full/workingDocuments/workingDocuments.queries.ts deleted file mode 100644 index a6dbf68..0000000 --- a/test/generated/full/workingDocuments/workingDocuments.queries.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsAcl } from "./workingDocuments.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; -import { WorkingDocumentsApi } from "./workingDocuments.api"; - -export namespace WorkingDocumentsQueries { -export const moduleName = QueryModule.WorkingDocuments; - -export const keys = { - all: [moduleName] as const, - list: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", positionId, officeId, limit, order, filter, page, cursor] as const, - listInfinite: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", "infinite", positionId, officeId, limit, order, filter, cursor] as const, - findById: (positionId: string, id: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents/:id", positionId, id, officeId] as const, -}; - -/** - * Query `useList` - * @summary List working documents - * @permission Requires `canUseList` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` - * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ positionId, officeId, limit, order, filter, page, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor, config) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List working documents - * @permission Requires `canUseList` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` - * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ positionId, officeId, limit, order, filter, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor, config) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get working document by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ positionId, id, officeId }: { positionId: string, id: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(positionId, id, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId } )); - return WorkingDocumentsApi.findById(positionId, id, officeId, config) }, - ...options, - }); -}; - -} diff --git a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts deleted file mode 100644 index 80d3476..0000000 --- a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsAmsInstructionsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Create", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useGetAMSInstructionsData` query ability. For global ability, omit the object parameter. - * @description Read AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAMSInstructionsData` query - */ -export const canUseGetAMSInstructionsData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdateAMSInstructionsData` mutation ability. For global ability, omit the object parameter. - * @description Update AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateAMSInstructionsData` mutation - */ -export const canUseUpdateAMSInstructionsData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useDeleteAMSInstructions` mutation ability. For global ability, omit the object parameter. - * @description Delete AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteAMSInstructions` mutation - */ -export const canUseDeleteAMSInstructions = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Delete", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation - */ -export const canUsePreviewAMSInstructions = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerateAMSInstructions` mutation ability. For global ability, omit the object parameter. - * @description Generate AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAMSInstructions` mutation - */ -export const canUseGenerateAMSInstructions = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts deleted file mode 100644 index aa27c95..0000000 --- a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsAmsInstructionsApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions`, - undefined, - config - ) -}; -export const getAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - config - ) -}; -export const updateAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), - config - ) -}; -export const deleteAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - undefined, - config - ) -}; -export const previewAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts deleted file mode 100644 index 75d8fd8..0000000 --- a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsAmsInstructionsModels { -/** - * AMSInstructionsDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ -export const AMSInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }).readonly(); -export type AMSInstructionsDocumentPortResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentCityResponseDTOSchema - * @type { object } - * @property { string } id ID of the city - * @property { string } name Name of the city - */ -export const AMSInstructionsDocumentCityResponseDTOSchema = z.object({ id: z.string().describe("ID of the city"), name: z.string().describe("Name of the city") }).readonly(); -export type AMSInstructionsDocumentCityResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentSignedByResponseDTOSchema - * @type { object } - * @property { string } id ID of the employee - * @property { string } name Name of the employee - */ -export const AMSInstructionsDocumentSignedByResponseDTOSchema = z.object({ id: z.string().describe("ID of the employee"), name: z.string().describe("Name of the employee") }).readonly(); -export type AMSInstructionsDocumentSignedByResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const AMSInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); -export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentCargoDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { string } containerNumber Container number of the cargo - * @property { number } nrOfPackages Number of packages in the cargo - * @property { string } description Description of the cargo - * @property { number } weight Weight of the cargo - * @property { number } volume Volume of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - */ -export const AMSInstructionsDocumentCargoDTOSchema = z.object({ caseMarks: z.string().describe("Case marks of the cargo"), containerNumber: z.string().describe("Container number of the cargo"), nrOfPackages: z.number().describe("Number of packages in the cargo"), description: z.string().describe("Description of the cargo"), weight: z.number().describe("Weight of the cargo"), volume: z.number().describe("Volume of the cargo"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo") }).readonly(); -export type AMSInstructionsDocumentCargoDTO = z.infer; - -/** - * AMSInstructionsDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the AMS Instructions document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the AMS Instructions document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } date Date of the AMS Instructions document - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { CommonModels.EditorContentResponseDto } additionalAMSText Additional AMS text - * @property { string } principalName Principal name - * @property { string } blNumber Bill of lading number - * @property { string } vessel Vessel - * @property { AMSInstructionsDocumentPortResponseDTO } portOfLoading Port of loading - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfDelivery Port of delivery - * @property { AMSInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfIssue Place of issue - * @property { string } dateOfIssue Date of issue - * @property { AMSInstructionsDocumentSignedByResponseDTO } signedBy Signed by - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } deliveryBusinessPartner Delivery business partner - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfAcceptance Port of acceptance - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Also notify party - * @property { string } applyTo Apply to - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string[] } availableContainerNumbers Available container numbers - * @property { string[] } selectedContainerNumbers Selected container numbers - * @property { string[] } selectedContainerLabels Selected container labels - * @property { AMSInstructionsDocumentCargoDTO[] } cargo Cargo information - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - */ -export const AMSInstructionsDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the AMS Instructions document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the AMS Instructions document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), versionNumber: z.number().describe("Version number of the document"), additionalAMSText: CommonModels.EditorContentResponseDtoSchema.describe("Additional AMS text").nullish(), principalName: z.string().describe("Principal name").nullish(), blNumber: z.string().describe("Bill of lading number").nullish(), vessel: z.string().describe("Vessel").nullish(), portOfLoading: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of loading").nullish(), placeOfDelivery: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of delivery").nullish(), portOfDischarge: AMSInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), placeOfIssue: AMSInstructionsDocumentCityResponseDTOSchema.describe("Place of issue").nullish(), dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue").nullish(), signedBy: AMSInstructionsDocumentSignedByResponseDTOSchema.describe("Signed by").nullish(), deliveryBusinessPartner: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Delivery business partner").nullish(), placeOfAcceptance: AMSInstructionsDocumentCityResponseDTOSchema.describe("Port of acceptance").nullish(), consignee: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), shipper: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), notify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Notify party").nullish(), alsoNotify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Also notify party").nullish(), applyTo: z.string().describe("Apply to").nullish(), suppressWeight: z.boolean().describe("Whether to suppress weight information").nullish(), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information").nullish(), availableContainerNumbers: z.array(z.string()).readonly().describe("Available container numbers").nullish(), selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers").nullish(), selectedContainerLabels: z.array(z.string()).readonly().describe("Selected container labels").nullish(), cargo: z.array(AMSInstructionsDocumentCargoDTOSchema).readonly().describe("Cargo information").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at").nullish(), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at").nullish() }).readonly(); -export type AMSInstructionsDocumentResponseDTO = z.infer; - -/** - * UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); -export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateAMSInstructionsDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { CommonModels.EditorContentUpdateDto } additionalAMSText Additional AMS text - * @property { string } principalName Principal name - * @property { string } blNumber Bill of lading number - * @property { string } vessel Vessel - * @property { string } portOfLoadingId Port of loading id - * @property { string } placeOfDeliveryId Place of delivery id - * @property { string } portOfDischargeId Port of discharge id - * @property { string } placeOfIssueId Place of issue - * @property { string } dateOfIssue Date of issue - * @property { string } signedById Signed by employee ID - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } deliveryBusinessPartner Delivery business partner - * @property { string } placeOfAcceptanceId Port of acceptance - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party - * @property { string } applyTo Apply to - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string[] } selectedContainerNumbers Selected container numbers - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { string } date Date of the AMS Instructions document - */ -export const UpdateAMSInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), additionalAMSText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional AMS text"), principalName: z.string().describe("Principal name"), blNumber: z.string().describe("Bill of lading number"), vessel: z.string().describe("Vessel"), portOfLoadingId: z.string().describe("Port of loading id"), placeOfDeliveryId: z.string().describe("Place of delivery id"), portOfDischargeId: z.string().describe("Port of discharge id"), placeOfIssueId: z.string().describe("Place of issue"), dateOfIssue: z.iso.datetime({ offset: true }).describe("Date of issue"), signedById: z.string().describe("Signed by employee ID"), deliveryBusinessPartner: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Delivery business partner"), placeOfAcceptanceId: z.string().describe("Port of acceptance"), consignee: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), shipper: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), notify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party"), alsoNotify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party"), applyTo: z.string().describe("Apply to"), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), selectedContainerNumbers: z.array(z.string()).readonly().describe("Selected container numbers"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), date: z.iso.datetime({ offset: true }).describe("Date of the AMS Instructions document") }).readonly(); -export type UpdateAMSInstructionsDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts b/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts deleted file mode 100644 index aa81d88..0000000 --- a/test/generated/full/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsAmsInstructionsAcl } from "./workingDocumentsAmsInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsAmsInstructionsApi } from "./workingDocumentsAmsInstructions.api"; - -export namespace WorkingDocumentsAmsInstructionsQueries { -export const moduleName = QueryModule.WorkingDocumentsAmsInstructions; - -export const keys = { - all: [moduleName] as const, - getAMSInstructionsData: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId", positionId, amsInstructionsId, officeId] as const, - previewAMSInstructions: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId/preview", positionId, amsInstructionsId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an AMS Instructions document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetAMSInstructionsData` - * @summary Get AMS Instructions document data - * @permission Requires `canUseGetAMSInstructionsData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.amsInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetAMSInstructionsData = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData(positionId, amsInstructionsId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateAMSInstructionsData` - * @summary Update AMS Instructions document data - * @permission Requires `canUseUpdateAMSInstructionsData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateAMSInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData(positionId, amsInstructionsId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, amsInstructionsId, officeId } = variables; - const updateKeys = [keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteAMSInstructions` - * @summary Delete AMS Instructions document - * @permission Requires `canUseDeleteAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } AMS Instructions document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions(positionId, amsInstructionsId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewAMSInstructions` - recommended when file should be cached - * @summary Preview AMS Instructions document - * @permission Requires `canUsePreviewAMSInstructions` ability - * @param { string } object.positionId Path parameter - * @param { string } object.amsInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewAMSInstructions = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewAMSInstructionsMutation` - recommended when file should not be cached - * @summary Preview AMS Instructions document - * @permission Requires `canUsePreviewAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewAMSInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, amsInstructionsId, officeId } = variables; - const updateKeys = [keys.previewAMSInstructions(positionId, amsInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateAMSInstructions` - * @summary Generate AMS Instructions document - * @permission Requires `canUseGenerateAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions(positionId, amsInstructionsId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts deleted file mode 100644 index a026b68..0000000 --- a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsBlInstructionsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGetBlInstructionsData` query ability. For global ability, omit the object parameter. - * @description Read BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBlInstructionsData` query - */ -export const canUseGetBlInstructionsData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdateBlInstructionsData` mutation ability. For global ability, omit the object parameter. - * @description Update BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBlInstructionsData` mutation - */ -export const canUseUpdateBlInstructionsData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useDeleteBlInstructions` mutation ability. For global ability, omit the object parameter. - * @description Delete BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBlInstructions` mutation - */ -export const canUseDeleteBlInstructions = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation - */ -export const canUsePreviewBlInstructions = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerateBlInstructions` mutation ability. For global ability, omit the object parameter. - * @description Generate BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateBlInstructions` mutation - */ -export const canUseGenerateBlInstructions = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate BL Instructions document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ -export const canUseGenerateDocumentEml = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts deleted file mode 100644 index a9d7914..0000000 --- a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsBlInstructionsApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions`, - undefined, - config - ) -}; -export const getBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - config - ) -}; -export const updateBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), - config - ) -}; -export const deleteBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - undefined, - config - ) -}; -export const previewBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -export const generateDocumentEml = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts deleted file mode 100644 index cbf7cdd..0000000 --- a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsBlInstructionsModels { -/** - * BlInstructionsDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { string } date Date - * @property { string } location Location - * @property { string } signer Siger - */ -export const BlInstructionsDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), date: z.iso.datetime({ offset: true }).describe("Date"), location: z.string().describe("Location"), signer: z.string().describe("Siger") }).readonly(); -export type BlInstructionsDocumentSettingsDtoDTO = z.infer; - -/** - * BlInstructionsDocumentCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ -export const BlInstructionsDocumentCountryResponseDTOSchema = z.object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }).readonly(); -export type BlInstructionsDocumentCountryResponseDTO = z.infer; - -/** - * BlInstructionsDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - * @property { string } eori EORI number of the business partner - * @property { string } vatNumber VAT number of the business partner - */ -export const BlInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner"), eori: z.string().describe("EORI number of the business partner"), vatNumber: z.string().describe("VAT number of the business partner") }).readonly(); -export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * BlInstructionsDocumentPlaceResponseDTOSchema - * @type { object } - * @property { string } id ID of the place - * @property { string } name Name of the place - */ -export const BlInstructionsDocumentPlaceResponseDTOSchema = z.object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }).readonly(); -export type BlInstructionsDocumentPlaceResponseDTO = z.infer; - -/** - * AllChargesEnumSchema - * @type { enum } - */ -export const AllChargesEnumSchema = z.enum(["Prepaid", "Collect", "Automatic", "Detailed"]); -export type AllChargesEnum = z.infer; -export const AllChargesEnum = AllChargesEnumSchema.enum; - -/** - * BlInstructionsDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - * @property { string } countryCode Country ISO2 code of the port - */ -export const BlInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port"), countryCode: z.string().describe("Country ISO2 code of the port") }).readonly(); -export type BlInstructionsDocumentPortResponseDTO = z.infer; - -/** - * RequestedDocumentTypeEnumSchema - * @type { enum } - */ -export const RequestedDocumentTypeEnumSchema = z.enum(["SeawayBill", "Original"]); -export type RequestedDocumentTypeEnum = z.infer; -export const RequestedDocumentTypeEnum = RequestedDocumentTypeEnumSchema.enum; - -/** - * ManifestFilerStatusEnumSchema - * @type { enum } - */ -export const ManifestFilerStatusEnumSchema = z.enum(["Self", "Carrier"]); -export type ManifestFilerStatusEnum = z.infer; -export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; - -/** - * BlInstructionsDocumentCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }).readonly(); -export type BlInstructionsDocumentCountryDto = z.infer; - -/** - * BlInstructionsDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the BL Instructions document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the BL Instructions document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } date Date of the BL Instructions document - * @property { string } blNumber Bill of lading number - * @property { string } exportReference Export reference number - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { BlInstructionsDocumentCountryResponseDTO } originCountry Origin country - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } additionalText Additional text for the document - * @property { number } versionNumber Version number of the document - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } buyer Buyer information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } seller Seller information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } forwarder Forwarder party information - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information - * @property { BlInstructionsDocumentPlaceResponseDTO } stowedIntoContainerCity Stowed into container city information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfAcceptanceCity Place of acceptance city information - * @property { BlInstructionsDocumentPlaceResponseDTO } originalsToBeReleasedAt - * @property { string } originalsToBeReleasedAtText - * @property { BlInstructionsDocumentPlaceResponseDTO } loadingPierTerminal - * @property { string } loadingPierTerminalText - * @property { string } precarriageByText - * @property { string } placeOfReceiptText - * @property { string } portOfLoadingText - * @property { string } portOfDischargeText - * @property { string } placeOfDeliveryText - * @property { string } vessel Name of the vessel - * @property { string } voyage Name of the vessel - * @property { CommonModels.MovementTypeEnum } movementType - * @property { string } carrierBookingNumber - * @property { string } csnNumber - * @property { string } mcinNumber - * @property { string } pcinNumber - * @property { string } dueNumber - * @property { boolean } goodsDeliveredInEu - * @property { string } rucNumber - * @property { number } shipmentDeclaredValue - * @property { string } shipmentDeclaredValueCurrency - * @property { AllChargesEnum } allCharges Base freight payment term - * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term - * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term - * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term - * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term - * @property { string } shippingInstructionsComments Free-text shipping instructions comments - * @property { string } chargePayerId Charge payer business partner ID - * @property { string } chargePayLocationId Charge pay location ID - * @property { BlInstructionsDocumentPortResponseDTO } portOfLoading Port of loading information - * @property { BlInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information - * @property { BlInstructionsDocumentSettingsDtoDTO } settings Settings for the BL Instructions document - * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data - * @property { CommonModels.CargoTableBlockDto } cargo Cargo table block (identical to House BL cargo) - * @property { string } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document - * @property { RequestedDocumentTypeEnum } requestedDocumentType - * @property { boolean } requestedDocumentFreighted - * @property { number } requestedDocumentQuantity - * @property { ManifestFilerStatusEnum } manifestFilerStatus - * @property { string } manifestFilerIdentifier - * @property { BlInstructionsDocumentCountryDto } manifestFilingCountry - */ -export const BlInstructionsDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the BL Instructions document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the BL Instructions document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document").nullish(), blNumber: z.string().describe("Bill of lading number").nullish(), exportReference: z.string().describe("Export reference number").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), originCountry: BlInstructionsDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), additionalText: z.string().describe("Additional text for the document").nullish(), versionNumber: z.number().describe("Version number of the document"), buyer: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Buyer information for the shipment").nullish(), seller: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Seller information for the shipment").nullish(), consignee: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information for the shipment"), shipper: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), notify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Notify party information for the shipment"), alsoNotify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Additional notify party information"), forwarder: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Forwarder party information"), precarriageBy: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), placeOfReceipt: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), stowedIntoContainerCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Stowed into container city information").nullish(), placeOfAcceptanceCity: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of acceptance city information").nullish(), originalsToBeReleasedAt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAtText: z.string().nullish(), loadingPierTerminal: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), loadingPierTerminalText: z.string().nullish(), precarriageByText: z.string().nullish(), placeOfReceiptText: z.string().nullish(), portOfLoadingText: z.string().nullish(), portOfDischargeText: z.string().nullish(), placeOfDeliveryText: z.string().nullish(), vessel: z.string().describe("Name of the vessel").nullish(), voyage: z.string().describe("Name of the vessel").nullish(), movementType: CommonModels.MovementTypeEnumSchema.nullish(), carrierBookingNumber: z.string().nullish(), csnNumber: z.string().nullish(), mcinNumber: z.string().nullish(), pcinNumber: z.string().nullish(), dueNumber: z.string().nullish(), goodsDeliveredInEu: z.boolean().nullish(), rucNumber: z.string().nullish(), shipmentDeclaredValue: z.number().nullish(), shipmentDeclaredValueCurrency: z.string().nullish(), allCharges: AllChargesEnumSchema.describe("Base freight payment term").nullish(), baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term").nullish(), additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term").nullish(), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin haulage charges payment term").nullish(), originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term").nullish(), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination port charges payment term").nullish(), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination haulage charges payment term").nullish(), shippingInstructionsComments: z.string().describe("Free-text shipping instructions comments").nullish(), chargePayerId: z.string().describe("Charge payer business partner ID").nullish(), chargePayLocationId: z.string().describe("Charge pay location ID").nullish(), portOfLoading: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), portOfDischarge: BlInstructionsDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), placeOfDelivery: BlInstructionsDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), settings: BlInstructionsDocumentSettingsDtoDTOSchema.describe("Settings for the BL Instructions document").nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), cargo: CommonModels.CargoTableBlockDtoSchema.describe("Cargo table block (identical to House BL cargo)").nullish(), bodyRemarks: z.string().describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.DocumentConfigDTOSchema.describe("Configuration settings for the document"), requestedDocumentType: RequestedDocumentTypeEnumSchema.nullish(), requestedDocumentFreighted: z.boolean().nullish(), requestedDocumentQuantity: z.number().nullish(), manifestFilerStatus: ManifestFilerStatusEnumSchema.nullish(), manifestFilerIdentifier: z.string().nullish(), manifestFilingCountry: BlInstructionsDocumentCountryDtoSchema.nullish() }).readonly(); -export type BlInstructionsDocumentResponseDTO = z.infer; - -/** - * UpdateBlInstructionsDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { string } blNumber BL number - * @property { string } exportReference Export reference number - * @property { string } location Location - * @property { string } signer Signer - * @property { string } date Date - */ -export const UpdateBlInstructionsDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), blNumber: z.string().describe("BL number"), exportReference: z.string().describe("Export reference number"), location: z.string().describe("Location"), signer: z.string().describe("Signer"), date: z.iso.datetime({ offset: true }).describe("Date") }).readonly(); -export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer; - -/** - * UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); -export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateBlInstructionsDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } blNumber Bill of lading number - * @property { string } exportReference Export reference number - * @property { string } csnNumber - * @property { string } mcinNumber - * @property { string } pcinNumber - * @property { string } dueNumber - * @property { boolean } goodsDeliveredInEu - * @property { string } rucNumber - * @property { string } shipmentDeclaredValueCurrency - * @property { number } shipmentDeclaredValue - * @property { AllChargesEnum } allCharges All charges payment term - * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term - * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term - * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term - * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term - * @property { string } originCountryId Origin country ID - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } additionalText Additional text - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } buyer Buyer information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } seller Seller information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } forwarder Forwarder information - * @property { string } originalsToBeReleasedAtId Originals to be released at ID - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information - * @property { string } shippingInstructionsComments Shipping instructions free-text comments - * @property { string } chargePayerId Charge payer business partner ID - * @property { string } chargePayLocationId Charge pay location ID - * @property { string } precarriageById Pre-carriage by ID - * @property { string } placeOfReceiptId Place of receipt ID - * @property { string } stowedIntoContainerCityId Stowed into container city ID - * @property { string } loadingPierTerminalId Loading pier/terminal ID - * @property { string } loadingPierTerminalText - * @property { string } placeOfAcceptanceCityId Place of acceptance city ID - * @property { string } vessel Vessel name - * @property { string } voyage Vessel name - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } portOfLoadingId Port of loading ID - * @property { string } portOfDischargeId Port of discharge ID - * @property { string } placeOfDeliveryId Place of delivery ID - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { string } date Date of the BL Instructions document - * @property { UpdateBlInstructionsDocumentSettingsRequestDTO } settings Settings - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data - * @property { RequestedDocumentTypeEnum } requestedDocumentType - * @property { boolean } requestedDocumentFreighted - * @property { number } requestedDocumentQuantity - * @property { string } precarriageByText - * @property { string } placeOfReceiptText - * @property { string } portOfLoadingText - * @property { string } portOfDischargeText - * @property { string } placeOfDeliveryText - * @property { ManifestFilerStatusEnum } manifestFilerStatus - * @property { string } manifestFilingCountryId - * @property { string } manifestFilerIdentifier - */ -export const UpdateBlInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), blNumber: z.string().describe("Bill of lading number"), exportReference: z.string().describe("Export reference number"), csnNumber: z.string(), mcinNumber: z.string(), pcinNumber: z.string(), dueNumber: z.string(), goodsDeliveredInEu: z.boolean(), rucNumber: z.string(), shipmentDeclaredValueCurrency: z.string(), shipmentDeclaredValue: z.number(), allCharges: AllChargesEnumSchema.describe("All charges payment term"), baseFreight: CommonModels.ChargePaymentEnumSchema.describe("Base freight payment term"), additionalCharges: CommonModels.ChargePaymentEnumSchema.describe("Additional charges payment term"), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin haulage charges payment term"), originPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Origin port charges payment term"), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination port charges payment term"), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.describe("Destination haulage charges payment term"), originCountryId: z.string().describe("Origin country ID"), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), additionalText: z.string().describe("Additional text"), consignee: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), shipper: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), buyer: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), seller: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), forwarder: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), notify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), alsoNotify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), shippingInstructionsComments: z.string().describe("Shipping instructions free-text comments"), chargePayerId: z.string().describe("Charge payer business partner ID"), chargePayLocationId: z.string().describe("Charge pay location ID"), precarriageById: z.string().describe("Pre-carriage by ID"), placeOfReceiptId: z.string().describe("Place of receipt ID"), stowedIntoContainerCityId: z.string().describe("Stowed into container city ID"), loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), loadingPierTerminalText: z.string(), placeOfAcceptanceCityId: z.string().describe("Place of acceptance city ID"), vessel: z.string().describe("Vessel name"), voyage: z.string().describe("Vessel name"), carrierBookingNumber: z.string().describe("Carrier booking number"), portOfLoadingId: z.string().describe("Port of loading ID"), portOfDischargeId: z.string().describe("Port of discharge ID"), placeOfDeliveryId: z.string().describe("Place of delivery ID"), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), bodyRemarks: z.string().describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), date: z.iso.datetime({ offset: true }).describe("Date of the BL Instructions document"), settings: UpdateBlInstructionsDocumentSettingsRequestDTOSchema.describe("Settings"), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data"), requestedDocumentType: RequestedDocumentTypeEnumSchema, requestedDocumentFreighted: z.boolean(), requestedDocumentQuantity: z.number(), precarriageByText: z.string(), placeOfReceiptText: z.string(), portOfLoadingText: z.string(), portOfDischargeText: z.string(), placeOfDeliveryText: z.string(), manifestFilerStatus: ManifestFilerStatusEnumSchema, manifestFilingCountryId: z.string(), manifestFilerIdentifier: z.string() }).readonly(); -export type UpdateBlInstructionsDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts b/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts deleted file mode 100644 index 6131b35..0000000 --- a/test/generated/full/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts +++ /dev/null @@ -1,243 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsBlInstructionsAcl } from "./workingDocumentsBlInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsBlInstructionsApi } from "./workingDocumentsBlInstructions.api"; - -export namespace WorkingDocumentsBlInstructionsQueries { -export const moduleName = QueryModule.WorkingDocumentsBlInstructions; - -export const keys = { - all: [moduleName] as const, - getBlInstructionsData: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId", positionId, blInstructionsId, officeId] as const, - previewBlInstructions: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId/preview", positionId, blInstructionsId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a BL Instructions document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId } )); - return WorkingDocumentsBlInstructionsApi.create(positionId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetBlInstructionsData` - * @summary Get BL Instructions document data - * @permission Requires `canUseGetBlInstructionsData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.blInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBlInstructionsData = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId } )); - return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateBlInstructionsData` - * @summary Update BL Instructions document data - * @permission Requires `canUseUpdateBlInstructionsData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBlInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId } )); - return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData(positionId, blInstructionsId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.getBlInstructionsData(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteBlInstructions` - * @summary Delete BL Instructions document - * @permission Requires `canUseDeleteBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } BL Instructions document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewBlInstructions` - recommended when file should be cached - * @summary Preview BL Instructions document - * @permission Requires `canUsePreviewBlInstructions` ability - * @param { string } object.positionId Path parameter - * @param { string } object.blInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewBlInstructions = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewBlInstructionsMutation` - recommended when file should not be cached - * @summary Preview BL Instructions document - * @permission Requires `canUsePreviewBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewBlInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateBlInstructions` - * @summary Generate BL Instructions document - * @permission Requires `canUseGenerateBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.generateBlInstructions(positionId, blInstructionsId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate BL Instructions document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsBlInstructionsApi.generateDocumentEml(positionId, blInstructionsId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts deleted file mode 100644 index 0454eb2..0000000 --- a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsCmrFormAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Create", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useGetCmrData` query ability. For global ability, omit the object parameter. - * @description Read CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCmrData` query - */ -export const canUseGetCmrData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useUpdateCmrData` mutation ability. For global ability, omit the object parameter. - * @description Update CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCmrData` mutation - */ -export const canUseUpdateCmrData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useDeleteCmr` mutation ability. For global ability, omit the object parameter. - * @description Delete CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCmr` mutation - */ -export const canUseDeleteCmr = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Delete", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `usePreviewCmr` query or `usePreviewCmrMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewCmr` query or `usePreviewCmrMutation` mutation - */ -export const canUsePreviewCmr = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useGenerateCmr` mutation ability. For global ability, omit the object parameter. - * @description Generate CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateCmr` mutation - */ -export const canUseGenerateCmr = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts deleted file mode 100644 index f070e6b..0000000 --- a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsCmrFormApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs`, - undefined, - config - ) -}; -export const getCmrData = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - config - ) -}; -export const updateCmrData = (positionId: string, cmrId: string, officeId: string, data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), - config - ) -}; -export const deleteCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - undefined, - config - ) -}; -export const previewCmr = (positionId: string, cmrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateCmr = (positionId: string, cmrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts deleted file mode 100644 index a94b23e..0000000 --- a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsCmrFormModels { -/** - * CmrDocumentLanguageSchema - * @type { enum } - */ -export const CmrDocumentLanguageSchema = z.enum(["en", "fr", "de"]); -export type CmrDocumentLanguage = z.infer; -export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; - -/** - * CmrDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CmrDocumentLanguage } primaryLanguage Primary language - * @property { CmrDocumentLanguage } secondaryLanguage Secondary language - */ -export const CmrDocumentSettingsDtoDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language") }).readonly(); -export type CmrDocumentSettingsDtoDTO = z.infer; - -/** - * CmrDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const CmrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); -export type CmrDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * CmrDocumentCityResponseDTOSchema - * @type { object } - * @property { string } cityId ID of the city - * @property { string } cityName Name of the city - * @property { string } date Date of delivery/takeover - * @property { string } countryName Country name - */ -export const CmrDocumentCityResponseDTOSchema = z.object({ cityId: z.string().describe("ID of the city"), cityName: z.string().describe("Name of the city"), date: z.iso.datetime({ offset: true }).describe("Date of delivery/takeover").nullish(), countryName: z.string().describe("Country name").nullish() }).readonly(); -export type CmrDocumentCityResponseDTO = z.infer; - -/** - * CmrDocumentCostsResponseDTOSchema - * @type { object } - * @property { number } carriageCharges Carriage charges - * @property { number } reductions Reductions - * @property { number } balance Balance - * @property { number } supplements Supplements - * @property { number } miscellaneous Miscellaneous charges - * @property { number } total Total amount - */ -export const CmrDocumentCostsResponseDTOSchema = z.object({ carriageCharges: z.number().describe("Carriage charges"), reductions: z.number().describe("Reductions"), balance: z.number().describe("Balance"), supplements: z.number().describe("Supplements"), miscellaneous: z.number().describe("Miscellaneous charges"), total: z.number().describe("Total amount") }).readonly(); -export type CmrDocumentCostsResponseDTO = z.infer; - -/** - * CmrDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { number } quantity Quantity of packages - * @property { string } description Description of the cargo - * @property { string } packageType - * @property { string } statisticNumber - * @property { string } positionNumber Position number of the cargo - * @property { number } grossWeight Gross weight of the cargo - * @property { number } volume Volume of the cargo - * @property { string } containerNumber Container number of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - */ -export const CmrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().describe("Case marks of the cargo"), quantity: z.number().describe("Quantity of packages"), description: z.string().describe("Description of the cargo"), packageType: z.string(), statisticNumber: z.string(), positionNumber: z.string().describe("Position number of the cargo"), grossWeight: z.number().describe("Gross weight of the cargo"), volume: z.number().describe("Volume of the cargo"), containerNumber: z.string().describe("Container number of the cargo"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo") }).readonly(); -export type CmrDocumentCargoResponseDTO = z.infer; - -/** - * CmrDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } positionNumber Position number - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { number } versionNumber Version number of the document - * @property { string } cmrNumber CMR number - * @property { CmrDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { CmrDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { CmrDocumentBusinessPartnerResponseDTO } carrier Carrier information - * @property { CmrDocumentBusinessPartnerResponseDTO } successiveCarrier Successive carrier information - * @property { CmrDocumentCityResponseDTO } delivery Delivery information - * @property { CmrDocumentCityResponseDTO } takeover Takeover information - * @property { string } annexedDocuments Annexed documents - * @property { string } carriersObservations Carriers observations - * @property { string } senderInstructions Sender instructions - * @property { string } reimbursement Reimbursement information - * @property { string } specialAgreements Special agreements - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { boolean } freightPaid Whether freight is paid - * @property { boolean } freightToBePaid Whether freight is to be paid - * @property { string } creationPlace Place of creation - * @property { string } creationDate Date of creation - * @property { CmrDocumentCostsResponseDTO } costsForShipper Costs for shipper - * @property { CmrDocumentCostsResponseDTO } costsForConsignee Costs for consignee - * @property { string[] } selectedCargoIds List of selected cargo IDs - * @property { CmrDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CmrDocumentSettingsDtoDTO } settings Settings for the BL Instructions document - */ -export const CmrDocumentResponseDTOSchema = z.object({ id: z.string().describe("ID of the document"), name: z.string().describe("Name of the document"), positionNumber: z.string().describe("Position number"), nameSuffix: z.string().describe("Name suffix of the document").nullish(), defaultFileName: z.string(), positionId: z.string().describe("Position ID"), versionNumber: z.number().describe("Version number of the document"), cmrNumber: z.string().describe("CMR number").nullish(), consignee: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), shipper: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), carrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Carrier information").nullish(), successiveCarrier: CmrDocumentBusinessPartnerResponseDTOSchema.describe("Successive carrier information").nullish(), delivery: CmrDocumentCityResponseDTOSchema.describe("Delivery information").nullish(), takeover: CmrDocumentCityResponseDTOSchema.describe("Takeover information").nullish(), annexedDocuments: z.string().describe("Annexed documents").nullish(), carriersObservations: z.string().describe("Carriers observations").nullish(), senderInstructions: z.string().describe("Sender instructions").nullish(), reimbursement: z.string().describe("Reimbursement information").nullish(), specialAgreements: z.string().describe("Special agreements").nullish(), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), freightPaid: z.boolean().describe("Whether freight is paid"), freightToBePaid: z.boolean().describe("Whether freight is to be paid"), creationPlace: z.string().describe("Place of creation"), creationDate: z.string().describe("Date of creation"), costsForShipper: CmrDocumentCostsResponseDTOSchema.describe("Costs for shipper").nullish(), costsForConsignee: CmrDocumentCostsResponseDTOSchema.describe("Costs for consignee").nullish(), selectedCargoIds: z.array(z.string()).readonly().describe("List of selected cargo IDs"), cargo: z.array(CmrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), settings: CmrDocumentSettingsDtoDTOSchema.describe("Settings for the BL Instructions document").nullish() }).readonly(); -export type CmrDocumentResponseDTO = z.infer; - -/** - * UpdateCmrDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CmrDocumentLanguage } primaryLanguage Primary language - * @property { CmrDocumentLanguage } secondaryLanguage Secondary language - */ -export const UpdateCmrDocumentSettingsRequestDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.describe("Primary language"), secondaryLanguage: CmrDocumentLanguageSchema.describe("Secondary language") }).readonly(); -export type UpdateCmrDocumentSettingsRequestDTO = z.infer; - -/** - * UpdateCmrDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateCmrDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); -export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateCmrDocumentDeliveryRequestDTOSchema - * @type { object } - * @property { string } cityId City ID - * @property { string } cityName City name - * @property { string } date Date - */ -export const UpdateCmrDocumentDeliveryRequestDTOSchema = z.object({ cityId: z.string().describe("City ID"), cityName: z.string().describe("City name"), date: z.iso.datetime({ offset: true }).describe("Date") }).readonly(); -export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; - -/** - * UpdateCmrDocumentCostsRequestDTOSchema - * @type { object } - * @property { number } carriageCharges Carriage charges - * @property { number } reductions Reductions - * @property { number } balance Balance - * @property { number } supplements Supplements - * @property { number } miscellaneous Miscellaneous - * @property { number } total Total - */ -export const UpdateCmrDocumentCostsRequestDTOSchema = z.object({ carriageCharges: z.number().describe("Carriage charges"), reductions: z.number().describe("Reductions"), balance: z.number().describe("Balance"), supplements: z.number().describe("Supplements"), miscellaneous: z.number().describe("Miscellaneous"), total: z.number().describe("Total") }).readonly(); -export type UpdateCmrDocumentCostsRequestDTO = z.infer; - -/** - * UpdateCmrDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } cmrNumber CMR number - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } carrier Carrier information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } successiveCarrier Successive carrier information - * @property { UpdateCmrDocumentDeliveryRequestDTO } delivery Delivery information - * @property { UpdateCmrDocumentDeliveryRequestDTO } takeover Takeover information - * @property { string } annexedDocuments Annexed documents - * @property { string } carriersObservations Carriers observations - * @property { string } senderInstructions Sender instructions - * @property { string } reimbursement Reimbursement - * @property { string } specialAgreements Special agreements - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { boolean } freightPaid Whether freight is paid - * @property { boolean } freightToBePaid Whether freight is to be paid - * @property { string } creationPlace Place of creation - * @property { string } creationDate Date of creation - * @property { UpdateCmrDocumentCostsRequestDTO } costsForShipper Costs for shipper - * @property { UpdateCmrDocumentCostsRequestDTO } costsForConsignee Costs for consignee - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { UpdateCmrDocumentSettingsRequestDTO } settings Settings - */ -export const UpdateCmrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), cmrNumber: z.string().describe("CMR number"), consignee: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), shipper: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), carrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Carrier information"), successiveCarrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.describe("Successive carrier information"), delivery: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Delivery information"), takeover: UpdateCmrDocumentDeliveryRequestDTOSchema.describe("Takeover information"), annexedDocuments: z.string().describe("Annexed documents"), carriersObservations: z.string().describe("Carriers observations"), senderInstructions: z.string().describe("Sender instructions"), reimbursement: z.string().describe("Reimbursement"), specialAgreements: z.string().describe("Special agreements"), suppressWeight: z.boolean().describe("Whether to suppress weight information"), suppressMeasurement: z.boolean().describe("Whether to suppress measurement information"), freightPaid: z.boolean().describe("Whether freight is paid"), freightToBePaid: z.boolean().describe("Whether freight is to be paid"), creationPlace: z.string().describe("Place of creation"), creationDate: z.string().describe("Date of creation"), costsForShipper: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for shipper"), costsForConsignee: UpdateCmrDocumentCostsRequestDTOSchema.describe("Costs for consignee"), selectedCargoIds: z.array(z.string()).readonly().describe("Selected cargo IDs"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), settings: UpdateCmrDocumentSettingsRequestDTOSchema.describe("Settings") }).readonly(); -export type UpdateCmrDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts b/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts deleted file mode 100644 index 769f861..0000000 --- a/test/generated/full/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsCmrFormAcl } from "./workingDocumentsCmrForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsCmrFormApi } from "./workingDocumentsCmrForm.api"; - -export namespace WorkingDocumentsCmrFormQueries { -export const moduleName = QueryModule.WorkingDocumentsCmrForm; - -export const keys = { - all: [moduleName] as const, - getCmrData: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId", positionId, cmrId, officeId] as const, - previewCmr: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId/preview", positionId, cmrId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a CMR document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsCmrFormApi.create(positionId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetCmrData` - * @summary Get CMR document data - * @permission Requires `canUseGetCmrData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.cmrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCmrData = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCmrData(positionId, cmrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId } )); - return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCmrData` - * @summary Update CMR document data - * @permission Requires `canUseUpdateCmrData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCmrData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId, data }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId } )); - return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, cmrId, officeId } = variables; - const updateKeys = [keys.getCmrData(positionId, cmrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteCmr` - * @summary Delete CMR document - * @permission Requires `canUseDeleteCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } CMR document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteCmr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewCmr` - recommended when file should be cached - * @summary Preview CMR document - * @permission Requires `canUsePreviewCmr` ability - * @param { string } object.positionId Path parameter - * @param { string } object.cmrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewCmr = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewCmr(positionId, cmrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewCmrMutation` - recommended when file should not be cached - * @summary Preview CMR document - * @permission Requires `canUsePreviewCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewCmrMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, cmrId, officeId } = variables; - const updateKeys = [keys.previewCmr(positionId, cmrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateCmr` - * @summary Generate CMR document - * @permission Requires `canUseGenerateCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateCmr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId, data }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts deleted file mode 100644 index bd69b52..0000000 --- a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsExportDeclarationAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Create", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useGetExportDeclarationData` query ability. For global ability, omit the object parameter. - * @description Read export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetExportDeclarationData` query - */ -export const canUseGetExportDeclarationData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useUpdateExportDeclarationData` mutation ability. For global ability, omit the object parameter. - * @description Update export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateExportDeclarationData` mutation - */ -export const canUseUpdateExportDeclarationData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useDeleteExportDeclaration` mutation ability. For global ability, omit the object parameter. - * @description Delete export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteExportDeclaration` mutation - */ -export const canUseDeleteExportDeclaration = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Delete", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation - */ -export const canUsePreviewExportDeclaration = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useGenerateExportDeclaration` mutation ability. For global ability, omit the object parameter. - * @description Generate export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateExportDeclaration` mutation - */ -export const canUseGenerateExportDeclaration = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts deleted file mode 100644 index 9eb1a57..0000000 --- a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsExportDeclarationApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations`, - undefined, - config - ) -}; -export const getExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - config - ) -}; -export const updateExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), - config - ) -}; -export const deleteExportDeclaration = (positionId: string, exportDeclarationId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - undefined, - config - ) -}; -export const previewExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts deleted file mode 100644 index 1dc6ab5..0000000 --- a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsExportDeclarationModels { -/** - * ExportDeclarationDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); -export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * ExportDeclarationDocumentCargoResponseDTOSchema - * @type { object } - * @property { number } quantity Quantity of packages - * @property { number } weight Weight of the cargo - * @property { number } length Length of the cargo - * @property { number } width Width of the cargo - * @property { number } height Height of the cargo - * @property { string } packageType Type of package - * @property { string } positionNumber Position number - */ -export const ExportDeclarationDocumentCargoResponseDTOSchema = z.object({ quantity: z.number().describe("Quantity of packages"), weight: z.number().describe("Weight of the cargo"), length: z.number().describe("Length of the cargo"), width: z.number().describe("Width of the cargo"), height: z.number().describe("Height of the cargo"), packageType: z.string().describe("Type of package"), positionNumber: z.string().describe("Position number") }).readonly(); -export type ExportDeclarationDocumentCargoResponseDTO = z.infer; - -/** - * ExportDeclarationDocumentRouteResponseDTOSchema - * @type { object } - * @property { string } pickupDate Pickup date - * @property { string } deliveryDate Delivery date - * @property { string } pickupCity Pickup city - * @property { string } deliveryCity Delivery city - */ -export const ExportDeclarationDocumentRouteResponseDTOSchema = z.object({ pickupDate: z.string().describe("Pickup date"), deliveryDate: z.string().describe("Delivery date"), pickupCity: z.string().describe("Pickup city"), deliveryCity: z.string().describe("Delivery city") }).readonly(); -export type ExportDeclarationDocumentRouteResponseDTO = z.infer; - -/** - * ExportDeclarationDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the export declaration document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the export declaration document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } dateOfHandover Date when the goods are handed over for export - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { string } issuerName Name of the issuer - * @property { string } issuerAddress Address of the issuer - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } customer Customer information - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { string } selectedCargoId ID of the selected cargo - * @property { ExportDeclarationDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { ExportDeclarationDocumentRouteResponseDTO } route Route information - * @property { string } signingPlace Place where the document is signed - * @property { string } signingDate Date when the document is signed - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } signedBy Information about who signed the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ -export const ExportDeclarationDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the export declaration document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the export declaration document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), dateOfHandover: z.iso.datetime({ offset: true }).describe("Date when the goods are handed over for export").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), versionNumber: z.number().describe("Version number of the document"), issuerName: z.string().describe("Name of the issuer").nullish(), issuerAddress: z.string().describe("Address of the issuer").nullish(), customer: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Customer information").nullish(), shipper: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), consignee: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), selectedCargoId: z.string().describe("ID of the selected cargo").nullish(), cargo: z.array(ExportDeclarationDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), route: ExportDeclarationDocumentRouteResponseDTOSchema.describe("Route information").nullish(), signingPlace: z.string().describe("Place where the document is signed").nullish(), signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed").nullish(), signedBy: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.describe("Information about who signed the document").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document").nullish() }).readonly(); -export type ExportDeclarationDocumentResponseDTO = z.infer; - -/** - * UpdateExportDeclarationDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } dateOfHandover Date when goods are handed over for export - * @property { string } issuerName Name of the issuer - * @property { string } issuerAddress Address of the issuer - * @property { string } customerId Customer ID - * @property { string } customerAddress Customer address - * @property { string } shipperId Shipper ID - * @property { string } shipperAddress Shipper address - * @property { string } consigneeId Consignee ID - * @property { string } consigneeAddress Consignee address - * @property { string } selectedCargoId Selected cargo ID - * @property { string } signingPlace Place where the document is signed - * @property { string } signingDate Date when the document is signed - * @property { string } signedByEmployeeId ID of the employee who signed the document - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateExportDeclarationDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), dateOfHandover: z.iso.datetime({ offset: true }).describe("Date when goods are handed over for export"), issuerName: z.string().describe("Name of the issuer"), issuerAddress: z.string().describe("Address of the issuer"), customerId: z.string().describe("Customer ID"), customerAddress: z.string().describe("Customer address"), shipperId: z.string().describe("Shipper ID"), shipperAddress: z.string().describe("Shipper address"), consigneeId: z.string().describe("Consignee ID"), consigneeAddress: z.string().describe("Consignee address"), selectedCargoId: z.string().describe("Selected cargo ID"), signingPlace: z.string().describe("Place where the document is signed"), signingDate: z.iso.datetime({ offset: true }).describe("Date when the document is signed"), signedByEmployeeId: z.string().describe("ID of the employee who signed the document"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); -export type UpdateExportDeclarationDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts b/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts deleted file mode 100644 index e58dbad..0000000 --- a/test/generated/full/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsExportDeclarationAcl } from "./workingDocumentsExportDeclaration.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsExportDeclarationApi } from "./workingDocumentsExportDeclaration.api"; - -export namespace WorkingDocumentsExportDeclarationQueries { -export const moduleName = QueryModule.WorkingDocumentsExportDeclaration; - -export const keys = { - all: [moduleName] as const, - getExportDeclarationData: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId", officeId, positionId, exportDeclarationId] as const, - previewExportDeclaration: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId/preview", officeId, positionId, exportDeclarationId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an export declaration document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId } )); - return WorkingDocumentsExportDeclarationApi.create(positionId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetExportDeclarationData` - * @summary Get export declaration document data - * @permission Requires `canUseGetExportDeclarationData` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.exportDeclarationId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetExportDeclarationData = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), - queryFn: () => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId } )); - return WorkingDocumentsExportDeclarationApi.getExportDeclarationData(officeId, positionId, exportDeclarationId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateExportDeclarationData` - * @summary Update export declaration document data - * @permission Requires `canUseUpdateExportDeclarationData` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateExportDeclarationData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId } )); - return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData(officeId, positionId, exportDeclarationId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, exportDeclarationId } = variables; - const updateKeys = [keys.getExportDeclarationData(officeId, positionId, exportDeclarationId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteExportDeclaration` - * @summary Delete export declaration document - * @permission Requires `canUseDeleteExportDeclaration` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Export declaration document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, exportDeclarationId, officeId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration(positionId, exportDeclarationId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewExportDeclaration` - recommended when file should be cached - * @summary Preview export declaration document - * @permission Requires `canUsePreviewExportDeclaration` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.exportDeclarationId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewExportDeclaration = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), - queryFn: () => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewExportDeclarationMutation` - recommended when file should not be cached - * @summary Preview export declaration document - * @permission Requires `canUsePreviewExportDeclaration` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewExportDeclarationMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, exportDeclarationId } = variables; - const updateKeys = [keys.previewExportDeclaration(officeId, positionId, exportDeclarationId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateExportDeclaration` - * @summary Generate export declaration document - * @permission Requires `canUseGenerateExportDeclaration` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.generateExportDeclaration(officeId, positionId, exportDeclarationId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts deleted file mode 100644 index 9c5da4d..0000000 --- a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsFcrFormAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Create", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useGetFcrData` query ability. For global ability, omit the object parameter. - * @description Read FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetFcrData` query - */ -export const canUseGetFcrData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useUpdateFcrData` mutation ability. For global ability, omit the object parameter. - * @description Update FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateFcrData` mutation - */ -export const canUseUpdateFcrData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useDeleteFcr` mutation ability. For global ability, omit the object parameter. - * @description Delete FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteFcr` mutation - */ -export const canUseDeleteFcr = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Delete", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `usePreviewFcr` query or `usePreviewFcrMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewFcr` query or `usePreviewFcrMutation` mutation - */ -export const canUsePreviewFcr = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useGenerateFcr` mutation ability. For global ability, omit the object parameter. - * @description Generate FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateFcr` mutation - */ -export const canUseGenerateFcr = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts deleted file mode 100644 index 0c25cd4..0000000 --- a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsFcrFormApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs`, - undefined, - config - ) -}; -export const getFcrData = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - config - ) -}; -export const updateFcrData = (positionId: string, fcrId: string, officeId: string, data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), - config - ) -}; -export const deleteFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - undefined, - config - ) -}; -export const previewFcr = (positionId: string, fcrId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateFcr = (positionId: string, fcrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts deleted file mode 100644 index 3d3752b..0000000 --- a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsFcrFormModels { -/** - * FcrDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const FcrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); -export type FcrDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * FcrDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { string } containerNumber Container number - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - * @property { number } quantity Quantity of the cargo - * @property { string } description Description of the cargo - * @property { number } weight Weight of the cargo - * @property { number } volume Volume of the cargo - */ -export const FcrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().describe("Case marks of the cargo"), containerNumber: z.string().describe("Container number"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo"), quantity: z.number().describe("Quantity of the cargo"), description: z.string().describe("Description of the cargo"), weight: z.number().describe("Weight of the cargo"), volume: z.number().describe("Volume of the cargo") }).readonly(); -export type FcrDocumentCargoResponseDTO = z.infer; - -/** - * FcrDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { number } versionNumber Version number of the document - * @property { string } fcrNumber FCR number - * @property { string } edvNumber EDV number - * @property { number } numberOfOriginals Number of originals - * @property { string } placeOfLoading Place of loading - * @property { string } dateOfLoading Date of loading - * @property { string } viaCity Via city - * @property { string } toDestination To destination - * @property { string } transportMode Transport mode - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } issuePlace Issue place - * @property { string } issueDate Issue date - * @property { string } deliveryTerms Delivery terms - * @property { FcrDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { FcrDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { FcrDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ -export const FcrDocumentResponseDTOSchema = z.object({ id: z.string().describe("ID of the document"), name: z.string().describe("Name of the document"), nameSuffix: z.string().describe("Name suffix of the document").nullish(), defaultFileName: z.string(), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), versionNumber: z.number().describe("Version number of the document"), fcrNumber: z.string().describe("FCR number").nullish(), edvNumber: z.string().describe("EDV number").nullish(), numberOfOriginals: z.number().describe("Number of originals"), placeOfLoading: z.string().describe("Place of loading").nullish(), dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading").nullish(), viaCity: z.string().describe("Via city").nullish(), toDestination: z.string().describe("To destination").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Transport mode"), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), issuePlace: z.string().describe("Issue place").nullish(), issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), deliveryTerms: z.string().describe("Delivery terms").nullish(), shipper: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information").nullish(), consignee: FcrDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), cargo: z.array(FcrDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document") }).readonly(); -export type FcrDocumentResponseDTO = z.infer; - -/** - * UpdateFcrDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } fcrNumber FCR number - * @property { string } edvNumber EDV number - * @property { number } numberOfOriginals Number of originals - * @property { string } placeOfLoading Place of loading - * @property { string } dateOfLoading Date of loading - * @property { string } viaCity Via city - * @property { string } toDestination To destination - * @property { string } transportMode Transport mode - * @property { string } issuePlace Issue place - * @property { string } issueDate Issue date - * @property { string } deliveryTerms Delivery terms - * @property { string } shipperId Shipper ID - * @property { string } shipperAddress Shipper address - * @property { string } consigneeId Consignee ID - * @property { string } consigneeAddress Consignee address - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateFcrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), fcrNumber: z.string().describe("FCR number"), edvNumber: z.string().describe("EDV number"), numberOfOriginals: z.number().describe("Number of originals"), placeOfLoading: z.string().describe("Place of loading"), dateOfLoading: z.iso.datetime({ offset: true }).describe("Date of loading"), viaCity: z.string().describe("Via city"), toDestination: z.string().describe("To destination"), transportMode: z.string().describe("Transport mode"), issuePlace: z.string().describe("Issue place"), issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), deliveryTerms: z.string().describe("Delivery terms"), shipperId: z.string().describe("Shipper ID"), shipperAddress: z.string().describe("Shipper address"), consigneeId: z.string().describe("Consignee ID"), consigneeAddress: z.string().describe("Consignee address"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); -export type UpdateFcrDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts b/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts deleted file mode 100644 index 1479d71..0000000 --- a/test/generated/full/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsFcrFormAcl } from "./workingDocumentsFcrForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsFcrFormApi } from "./workingDocumentsFcrForm.api"; - -export namespace WorkingDocumentsFcrFormQueries { -export const moduleName = QueryModule.WorkingDocumentsFcrForm; - -export const keys = { - all: [moduleName] as const, - getFcrData: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId", positionId, fcrId, officeId] as const, - previewFcr: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId/preview", positionId, fcrId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an FCR document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsFcrFormApi.create(positionId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetFcrData` - * @summary Get FCR document data - * @permission Requires `canUseGetFcrData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.fcrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetFcrData = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getFcrData(positionId, fcrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId } )); - return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateFcrData` - * @summary Update FCR document data - * @permission Requires `canUseUpdateFcrData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateFcrData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId, data }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId } )); - return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, fcrId, officeId } = variables; - const updateKeys = [keys.getFcrData(positionId, fcrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteFcr` - * @summary Delete FCR document - * @permission Requires `canUseDeleteFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } FCR document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteFcr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewFcr` - recommended when file should be cached - * @summary Preview FCR document - * @permission Requires `canUsePreviewFcr` ability - * @param { string } object.positionId Path parameter - * @param { string } object.fcrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewFcr = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewFcr(positionId, fcrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewFcrMutation` - recommended when file should not be cached - * @summary Preview FCR document - * @permission Requires `canUsePreviewFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewFcrMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, fcrId, officeId } = variables; - const updateKeys = [keys.previewFcr(positionId, fcrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateFcr` - * @summary Generate FCR document - * @permission Requires `canUseGenerateFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateFcr = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId, data }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts deleted file mode 100644 index a7c5b44..0000000 --- a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsHouseAwbAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Create", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useGetHouseAwbData` query ability. For global ability, omit the object parameter. - * @description Read House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseAwbData` query - */ -export const canUseGetHouseAwbData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useUpdateHouseAwbData` mutation ability. For global ability, omit the object parameter. - * @description Update House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseAwbData` mutation - */ -export const canUseUpdateHouseAwbData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useDeleteHouseAwb` mutation ability. For global ability, omit the object parameter. - * @description Delete House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseAwb` mutation - */ -export const canUseDeleteHouseAwb = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Delete", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation - */ -export const canUsePreviewHouseAwb = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useGenerateHouseAwb` mutation ability. For global ability, omit the object parameter. - * @description Generate House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseAwb` mutation - */ -export const canUseGenerateHouseAwb = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts deleted file mode 100644 index 319c3d3..0000000 --- a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseAwbApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs`, - undefined, - config - ) -}; -export const getHouseAwbData = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - config - ) -}; -export const updateHouseAwbData = (positionId: string, hawbId: string, officeId: string, data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), - config - ) -}; -export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - undefined, - config - ) -}; -export const previewHouseAwb = (positionId: string, hawbId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateHouseAwb = (positionId: string, hawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts deleted file mode 100644 index 6428bad..0000000 --- a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseAwbModels { -/** - * HouseAwbDocumentOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - * @property { string } name Name - */ -export const HouseAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID").nullish(), sellRate: z.number().describe("Sell rate"), name: z.string().describe("Name").nullish() }).readonly(); -export type HouseAwbDocumentOtherChargeDTO = z.infer; - -/** - * HouseAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { number } totalOtherCharges Total other charges - * @property { number } total Total - * @property { HouseAwbDocumentOtherChargeDTO[] } otherCharges Other charges - */ -export const HouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), totalOtherCharges: z.number().describe("Total other charges"), total: z.number().describe("Total"), otherCharges: z.array(HouseAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); -export type HouseAwbDocumentChargesDTO = z.infer; - -/** - * HouseAwbDocumentCargoDTOSchema - * @type { object } - * @property { number } quantity Quantity - * @property { number } grossWeight Gross weight - * @property { string } rateClass Rate class - * @property { string } commodityItemNo Commodity item number - * @property { number } rateOrCharge Rate or charge - * @property { number } total Total - * @property { string } description Description - */ -export const HouseAwbDocumentCargoDTOSchema = z.object({ quantity: z.number().describe("Quantity"), grossWeight: z.number().describe("Gross weight").nullish(), rateClass: z.string().describe("Rate class").nullish(), commodityItemNo: z.string().describe("Commodity item number").nullish(), rateOrCharge: z.number().describe("Rate or charge").nullish(), total: z.number().describe("Total").nullish(), description: z.string().describe("Description").nullish() }).readonly(); -export type HouseAwbDocumentCargoDTO = z.infer; - -/** - * HouseAwbDocumentRouteDTOSchema - * @type { object } - * @property { string } airportOfDeparture Airport of departure - * @property { string } airportOfDestination Airport of destination - * @property { string } toAirport1 To airport 1 - * @property { string } byCarrier1 By carrier 1 - * @property { string } toAirport2 To airport 2 - * @property { string } byCarrier2 By carrier 2 - * @property { string } toAirport3 To airport 3 - * @property { string } byCarrier3 By carrier 3 - * @property { string } flightNumber1 Flight number 1 - * @property { string } flightDay1 Flight day 1 - * @property { string } flightNumber2 Flight number 2 - * @property { string } flightDay2 Flight day 2 - */ -export const HouseAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string().describe("Airport of departure"), airportOfDestination: z.string().describe("Airport of destination"), toAirport1: z.string().describe("To airport 1").nullish(), byCarrier1: z.string().describe("By carrier 1").nullish(), toAirport2: z.string().describe("To airport 2").nullish(), byCarrier2: z.string().describe("By carrier 2").nullish(), toAirport3: z.string().describe("To airport 3").nullish(), byCarrier3: z.string().describe("By carrier 3").nullish(), flightNumber1: z.string().describe("Flight number 1").nullish(), flightDay1: z.string().describe("Flight day 1").nullish(), flightNumber2: z.string().describe("Flight number 2").nullish(), flightDay2: z.string().describe("Flight day 2").nullish() }).readonly(); -export type HouseAwbDocumentRouteDTO = z.infer; - -/** - * HouseAwbDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const HouseAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); -export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * HouseAwbDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the House AWB document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the House AWB document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } currency Currency - * @property { number } versionNumber Version number of the document - * @property { string } hawbNumber HAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { HouseAwbDocumentCargoDTO[] } cargo Cargo packages - * @property { HouseAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } signingLocation Signing location - * @property { string } issuerIataCode Issuer IATA code - * @property { HouseAwbDocumentRouteDTO } route Route - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } issuer Issuer - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { CommonModels.DocumentConfigDTO } config Config - */ -export const HouseAwbDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the House AWB document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference"), name: z.string().describe("Name of the House AWB document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), currency: z.string().describe("Currency").nullish(), versionNumber: z.number().describe("Version number of the document"), hawbNumber: z.string().describe("HAWB number").nullish(), sciReference: z.string().describe("SCI reference").nullish(), reference1: z.string().describe("Reference 1").nullish(), reference2: z.string().describe("Reference 2").nullish(), reference3: z.string().describe("Reference 3").nullish(), exchangeRate: z.number().describe("Exchange rate").nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), handlingInstructions: z.string().describe("Handling instructions").nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), cargo: z.array(HouseAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), charges: HouseAwbDocumentChargesDTOSchema.describe("Charges").nullish(), shipperSigner: z.string().describe("Shipper signer").nullish(), shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), signer: z.string().describe("Signer").nullish(), signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), signingLocation: z.string().describe("Signing location").nullish(), issuerIataCode: z.string().describe("Issuer IATA code").nullish(), route: HouseAwbDocumentRouteDTOSchema.describe("Route").nullish(), issuer: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), consignee: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), shipper: HouseAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish() }).readonly(); -export type HouseAwbDocumentResponseDTO = z.infer; - -/** - * UpdateHouseAwbDocumentChargesOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - */ -export const UpdateHouseAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }).readonly(); -export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer; - -/** - * UpdateHouseAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { UpdateHouseAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges - */ -export const UpdateHouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), otherCharges: z.array(UpdateHouseAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); -export type UpdateHouseAwbDocumentChargesDTO = z.infer; - -/** - * UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); -export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateHouseAwbDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } hawbNumber HAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { UpdateHouseAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } issuerId Issuer ID - * @property { string } issuerName Issuer name - * @property { string } issuerAddress Issuer address - * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateHouseAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), hawbNumber: z.string().describe("HAWB number"), sciReference: z.string().describe("SCI reference"), reference1: z.string().describe("Reference 1"), reference2: z.string().describe("Reference 2"), reference3: z.string().describe("Reference 3"), exchangeRate: z.number().describe("Exchange rate"), additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), handlingInstructions: z.string().describe("Handling instructions"), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), additionalAccountingNotes: z.string().describe("Additional accounting notes"), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), charges: UpdateHouseAwbDocumentChargesDTOSchema.describe("Charges"), shipperSigner: z.string().describe("Shipper signer"), shipperSignerUserName: z.string().describe("Shipper signer user name"), signer: z.string().describe("Signer"), signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), issuerId: z.string().describe("Issuer ID"), issuerName: z.string().describe("Issuer name"), issuerAddress: z.string().describe("Issuer address"), consignee: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), shipper: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); -export type UpdateHouseAwbDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts b/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts deleted file mode 100644 index 8062a30..0000000 --- a/test/generated/full/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsHouseAwbAcl } from "./workingDocumentsHouseAwb.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsHouseAwbApi } from "./workingDocumentsHouseAwb.api"; - -export namespace WorkingDocumentsHouseAwbQueries { -export const moduleName = QueryModule.WorkingDocumentsHouseAwb; - -export const keys = { - all: [moduleName] as const, - getHouseAwbData: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId", positionId, hawbId, officeId] as const, - previewHouseAwb: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId/preview", positionId, hawbId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a House AWB document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId } )); - return WorkingDocumentsHouseAwbApi.create(positionId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetHouseAwbData` - * @summary Get House AWB document data - * @permission Requires `canUseGetHouseAwbData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.hawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetHouseAwbData = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId } )); - return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateHouseAwbData` - * @summary Update House AWB document data - * @permission Requires `canUseUpdateHouseAwbData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateHouseAwbData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId } )); - return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, hawbId, officeId } = variables; - const updateKeys = [keys.getHouseAwbData(positionId, hawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteHouseAwb` - * @summary Delete House AWB document - * @permission Requires `canUseDeleteHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } House AWB document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewHouseAwb` - recommended when file should be cached - * @summary Preview House AWB document - * @permission Requires `canUsePreviewHouseAwb` ability - * @param { string } object.positionId Path parameter - * @param { string } object.hawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseAwb = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewHouseAwbMutation` - recommended when file should not be cached - * @summary Preview House AWB document - * @permission Requires `canUsePreviewHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, hawbId, officeId } = variables; - const updateKeys = [keys.previewHouseAwb(positionId, hawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateHouseAwb` - * @summary Generate House AWB document - * @permission Requires `canUseGenerateHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts deleted file mode 100644 index 7e3bdd2..0000000 --- a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsHouseBlAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Create", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useGetHouseBlData` query ability. For global ability, omit the object parameter. - * @description Read house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseBlData` query - */ -export const canUseGetHouseBlData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useUpdateHouseBlData` mutation ability. For global ability, omit the object parameter. - * @description Update house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseBlData` mutation - */ -export const canUseUpdateHouseBlData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useDeleteHouseBl` mutation ability. For global ability, omit the object parameter. - * @description Delete house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseBl` mutation - */ -export const canUseDeleteHouseBl = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Delete", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation - */ -export const canUsePreviewHouseBl = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview house BL document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation - */ -export const canUsePreviewHouseBlEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useGenerateHouseBl` mutation ability. For global ability, omit the object parameter. - * @description Generate house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseBl` mutation - */ -export const canUseGenerateHouseBl = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate house BL document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ -export const canUseGenerateDocumentEml = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts deleted file mode 100644 index c137af4..0000000 --- a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseBlApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls`, - undefined, - config - ) -}; -export const getHouseBlData = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - config - ) -}; -export const updateHouseBlData = (positionId: string, houseBlId: string, officeId: string, data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), - config - ) -}; -export const deleteHouseBl = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - undefined, - config - ) -}; -export const previewHouseBl = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const previewHouseBlEml = (positionId: string, houseBlId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, - { - ...config, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateHouseBl = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -export const generateDocumentEml = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts deleted file mode 100644 index ad68756..0000000 --- a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseBlModels { -/** - * HouseBlDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { number } quantityOfCopies Quantity of copies - * @property { string } date Date - * @property { string } location Location - * @property { string } signer Signer - * @property { boolean } hideSignature Hide signature - * @property { boolean } capsLock Render issuer/signer in caps lock - * @property { string } documentTitle Document title - */ -export const HouseBlDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), quantityOfCopies: z.number().describe("Quantity of copies"), date: z.iso.datetime({ offset: true }).describe("Date"), location: z.string().describe("Location"), signer: z.string().describe("Signer"), hideSignature: z.boolean().describe("Hide signature"), capsLock: z.boolean().describe("Render issuer/signer in caps lock"), documentTitle: z.string().describe("Document title") }).readonly(); -export type HouseBlDocumentSettingsDtoDTO = z.infer; - -/** - * HouseBlDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const HouseBlDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); -export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * HouseBlDocumentCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ -export const HouseBlDocumentCountryResponseDTOSchema = z.object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }).readonly(); -export type HouseBlDocumentCountryResponseDTO = z.infer; - -/** - * HouseBlDocumentPlaceResponseDTOSchema - * @type { object } - * @property { string } id ID of the place - * @property { string } name Name of the place - */ -export const HouseBlDocumentPlaceResponseDTOSchema = z.object({ id: z.string().describe("ID of the place"), name: z.string().describe("Name of the place") }).readonly(); -export type HouseBlDocumentPlaceResponseDTO = z.infer; - -/** - * HouseBlDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ -export const HouseBlDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }).readonly(); -export type HouseBlDocumentPortResponseDTO = z.infer; - -/** - * HouseBlDocumentTerminalResponseDTOSchema - * @type { object } - * @property { string } id ID of the terminal - * @property { string } name Name of the terminal - */ -export const HouseBlDocumentTerminalResponseDTOSchema = z.object({ id: z.string().describe("ID of the terminal"), name: z.string().describe("Name of the terminal") }).readonly(); -export type HouseBlDocumentTerminalResponseDTO = z.infer; - -/** - * HouseBlDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the house BL document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the house BL document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } blNumber Bill of lading number - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } exportReference Export reference number - * @property { HouseBlDocumentBusinessPartnerResponseDTO } forwarder Forwarder information for the shipment - * @property { HouseBlDocumentCountryResponseDTO } originCountry Origin country - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { CommonModels.EditorContentResponseDto } additionalTextTop Additional text for the document - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { HouseBlDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } cargoReleaseBy Delivery agent information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information - * @property { HouseBlDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information - * @property { string } precarriageByText Pre-carriage by free-text override - * @property { HouseBlDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information - * @property { string } placeOfReceiptText Place of receipt free-text override - * @property { string } vessel Name of the vessel - * @property { string } voyage Voyage number of the vessel - * @property { string } declaredValue Declared value of the shipment - * @property { number } rateOfExchange Rate of exchange of the shipment - * @property { string } currency Currency of the shipment - * @property { string } freightPayable Freight payable of the shipment - * @property { string } issuer Issuer - * @property { HouseBlDocumentPortResponseDTO } portOfLoading Port of loading information - * @property { string } portOfLoadingText Port of loading free-text override - * @property { HouseBlDocumentTerminalResponseDTO } loadingPierTerminal Loading pier/terminal information - * @property { string } loadingPierTerminalText Loading pier/terminal free-text override - * @property { HouseBlDocumentPortResponseDTO } portOfDischarge Port of discharge information - * @property { string } portOfDischargeText Port of discharge free-text override - * @property { HouseBlDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information - * @property { string } placeOfDeliveryText Place of delivery free-text override - * @property { HouseBlDocumentPlaceResponseDTO } originalsToBeReleasedAt Originals to be released at information - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { string } typeOfMove Type of move - * @property { string } placeOfIssue - * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data - * @property { HouseBlDocumentSettingsDtoDTO } settings Settings for the House BL document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ -export const HouseBlDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the house BL document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference").nullish(), name: z.string().describe("Name of the house BL document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), blNumber: z.string().describe("Bill of lading number").nullish(), carrierBookingNumber: z.string().describe("Carrier booking number").nullish(), exportReference: z.string().describe("Export reference number").nullish(), forwarder: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Forwarder information for the shipment").nullish(), originCountry: HouseBlDocumentCountryResponseDTOSchema.describe("Origin country").nullish(), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit").nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), additionalTextTop: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), direction: CommonModels.DirectionEnumSchema.describe("Direction of the shipment (e.g., import/export)").nullish(), transportMode: CommonModels.TransportModeEnumSchema.describe("Mode of transport for the shipment").nullish(), versionNumber: z.number().describe("Version number of the document"), consignee: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information for the shipment"), shipper: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Shipper information for the shipment"), cargoReleaseBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Delivery agent information for the shipment").nullish(), notify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Notify party information for the shipment"), alsoNotify: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Additional notify party information"), precarriageBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.describe("Pre-carriage by information").nullish(), precarriageByText: z.string().describe("Pre-carriage by free-text override").nullish(), placeOfReceipt: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of receipt information").nullish(), placeOfReceiptText: z.string().describe("Place of receipt free-text override").nullish(), vessel: z.string().describe("Name of the vessel").nullish(), voyage: z.string().describe("Voyage number of the vessel").nullish(), declaredValue: z.string().describe("Declared value of the shipment").nullish(), rateOfExchange: z.number().describe("Rate of exchange of the shipment").nullish(), currency: z.string().describe("Currency of the shipment").nullish(), freightPayable: z.string().describe("Freight payable of the shipment").nullish(), issuer: z.string().describe("Issuer").nullish(), portOfLoading: HouseBlDocumentPortResponseDTOSchema.describe("Port of loading information").nullish(), portOfLoadingText: z.string().describe("Port of loading free-text override").nullish(), loadingPierTerminal: HouseBlDocumentTerminalResponseDTOSchema.describe("Loading pier/terminal information").nullish(), loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override").nullish(), portOfDischarge: HouseBlDocumentPortResponseDTOSchema.describe("Port of discharge information").nullish(), portOfDischargeText: z.string().describe("Port of discharge free-text override").nullish(), placeOfDelivery: HouseBlDocumentPlaceResponseDTOSchema.describe("Place of delivery information").nullish(), placeOfDeliveryText: z.string().describe("Place of delivery free-text override").nullish(), originalsToBeReleasedAt: HouseBlDocumentPlaceResponseDTOSchema.describe("Originals to be released at information").nullish(), originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override").nullish(), typeOfMove: z.string().describe("Type of move").nullish(), placeOfIssue: z.string().nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Templated document data").nullish(), settings: HouseBlDocumentSettingsDtoDTOSchema.describe("Settings for the House BL document").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document") }).readonly(); -export type HouseBlDocumentResponseDTO = z.infer; - -/** - * UpdateHouseBlDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { number } quantityOfCopies Quantity of copies - * @property { string } blNumber BL number - * @property { string } exportReference Export reference number - * @property { string } location Location - * @property { string } signer Signer - * @property { boolean } hideSignature Hide signature - * @property { boolean } capsLock Render issuer/signer in caps lock - * @property { string } date Date - * @property { string } documentTitle Document title - */ -export const UpdateHouseBlDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.describe("Quantity of originals"), quantityOfCopies: z.number().describe("Quantity of copies"), blNumber: z.string().describe("BL number"), exportReference: z.string().describe("Export reference number"), location: z.string().describe("Location"), signer: z.string().describe("Signer"), hideSignature: z.boolean().describe("Hide signature"), capsLock: z.boolean().describe("Render issuer/signer in caps lock"), date: z.iso.datetime({ offset: true }).describe("Date"), documentTitle: z.string().describe("Document title") }).readonly(); -export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; - -/** - * UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); -export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateHouseBlDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } blNumber Bill of lading number - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } exportReference Export reference number - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } forwarder Forwarder information - * @property { string } originCountryId Origin country ID - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } declaredValue Declared value - * @property { number } rateOfExchange Rate of exchange - * @property { string } freightPayable Freight payable - * @property { string } issuer Issuer - * @property { string } placeOfIssue Place of issue - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text - * @property { CommonModels.EditorContentUpdateDto } additionalTextTop Additional text top - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } notify Notify party information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } cargoReleaseBy Cargo release party information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information - * @property { string } precarriageById Pre-carriage by ID - * @property { string } precarriageByText Pre-carriage by free-text override - * @property { string } placeOfReceiptId Place of receipt ID - * @property { string } placeOfReceiptText Place of receipt free-text override - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } portOfLoadingId Port of loading ID - * @property { string } portOfLoadingText Port of loading free-text override - * @property { string } loadingPierTerminalId Loading pier/terminal ID - * @property { string } loadingPierTerminalText Loading pier/terminal free-text override - * @property { string } portOfDischargeId Port of discharge ID - * @property { string } portOfDischargeText Port of discharge free-text override - * @property { string } placeOfDeliveryId Place of delivery ID - * @property { string } placeOfDeliveryText Place of delivery free-text override - * @property { string } originalsToBeReleasedAtId Originals to be released at ID - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { string } typeOfMove Type of move - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { UpdateHouseBlDocumentSettingsRequestDTO } settings Settings - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data - */ -export const UpdateHouseBlDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), blNumber: z.string().describe("Bill of lading number"), carrierBookingNumber: z.string().describe("Carrier booking number"), exportReference: z.string().describe("Export reference number"), forwarder: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Forwarder information"), originCountryId: z.string().describe("Origin country ID"), useLatterOfCredit: z.boolean().describe("Whether to use letter of credit"), declaredValue: z.string().describe("Declared value"), rateOfExchange: z.number().describe("Rate of exchange"), freightPayable: z.string().describe("Freight payable"), issuer: z.string().describe("Issuer"), placeOfIssue: z.string().describe("Place of issue"), additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text"), additionalTextTop: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text top"), consignee: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), shipper: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Shipper information"), notify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Notify party information"), cargoReleaseBy: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Cargo release party information"), alsoNotify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.describe("Also notify party information"), precarriageById: z.string().describe("Pre-carriage by ID"), precarriageByText: z.string().describe("Pre-carriage by free-text override"), placeOfReceiptId: z.string().describe("Place of receipt ID"), placeOfReceiptText: z.string().describe("Place of receipt free-text override"), vessel: z.string().describe("Vessel name"), voyage: z.string().describe("Voyage number"), portOfLoadingId: z.string().describe("Port of loading ID"), portOfLoadingText: z.string().describe("Port of loading free-text override"), loadingPierTerminalId: z.string().describe("Loading pier/terminal ID"), loadingPierTerminalText: z.string().describe("Loading pier/terminal free-text override"), portOfDischargeId: z.string().describe("Port of discharge ID"), portOfDischargeText: z.string().describe("Port of discharge free-text override"), placeOfDeliveryId: z.string().describe("Place of delivery ID"), placeOfDeliveryText: z.string().describe("Place of delivery free-text override"), originalsToBeReleasedAtId: z.string().describe("Originals to be released at ID"), originalsToBeReleasedAtText: z.string().describe("Originals to be released at free-text override"), typeOfMove: z.string().describe("Type of move"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks"), settings: UpdateHouseBlDocumentSettingsRequestDTOSchema.describe("Settings"), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("House BL templated document data") }).readonly(); -export type UpdateHouseBlDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts b/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts deleted file mode 100644 index ea0ca6a..0000000 --- a/test/generated/full/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts +++ /dev/null @@ -1,297 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsHouseBlAcl } from "./workingDocumentsHouseBl.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsHouseBlApi } from "./workingDocumentsHouseBl.api"; - -export namespace WorkingDocumentsHouseBlQueries { -export const moduleName = QueryModule.WorkingDocumentsHouseBl; - -export const keys = { - all: [moduleName] as const, - getHouseBlData: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId", positionId, houseBlId, officeId] as const, - previewHouseBl: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview", positionId, houseBlId, officeId] as const, - previewHouseBlEml: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview/eml", positionId, houseBlId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a house BL document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId } )); - return WorkingDocumentsHouseBlApi.create(positionId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetHouseBlData` - * @summary Get house BL document data - * @permission Requires `canUseGetHouseBlData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetHouseBlData = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId } )); - return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateHouseBlData` - * @summary Update house BL document data - * @permission Requires `canUseUpdateHouseBlData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateHouseBlData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId } )); - return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.getHouseBlData(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteHouseBl` - * @summary Delete house BL document - * @permission Requires `canUseDeleteHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } House BL document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteHouseBl = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewHouseBl` - recommended when file should be cached - * @summary Preview house BL document - * @permission Requires `canUsePreviewHouseBl` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBl = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewHouseBlMutation` - recommended when file should not be cached - * @summary Preview house BL document - * @permission Requires `canUsePreviewHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewHouseBlEml` - recommended when file should be cached - * @summary Preview house BL document and return EML file - * @permission Requires `canUsePreviewHouseBlEml` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBlEml = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewHouseBlEmlMutation` - recommended when file should not be cached - * @summary Preview house BL document and return EML file - * @permission Requires `canUsePreviewHouseBlEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBlEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateHouseBl` - * @summary Generate house BL document - * @permission Requires `canUseGenerateHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateHouseBl = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate house BL document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts deleted file mode 100644 index 99aadd5..0000000 --- a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsIsfFormAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Create", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useGetIsfData` query ability. For global ability, omit the object parameter. - * @description Read ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetIsfData` query - */ -export const canUseGetIsfData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useUpdateIsfData` mutation ability. For global ability, omit the object parameter. - * @description Update ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIsfData` mutation - */ -export const canUseUpdateIsfData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useDeleteIsf` mutation ability. For global ability, omit the object parameter. - * @description Delete ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteIsf` mutation - */ -export const canUseDeleteIsf = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Delete", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `usePreviewIsf` query or `usePreviewIsfMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewIsf` query or `usePreviewIsfMutation` mutation - */ -export const canUsePreviewIsf = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useGenerateIsf` mutation ability. For global ability, omit the object parameter. - * @description Generate ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIsf` mutation - */ -export const canUseGenerateIsf = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts deleted file mode 100644 index a618bc0..0000000 --- a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsIsfFormApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs`, - undefined, - config - ) -}; -export const getIsfData = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - config - ) -}; -export const updateIsfData = (positionId: string, isfId: string, officeId: string, data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), - config - ) -}; -export const deleteIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - undefined, - config - ) -}; -export const previewIsf = (positionId: string, isfId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateIsf = (positionId: string, isfId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts deleted file mode 100644 index 7e851f1..0000000 --- a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsIsfFormModels { -/** - * IsfDocumentCargoCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ -export const IsfDocumentCargoCountryResponseDTOSchema = z.object({ id: z.string().describe("ID of the country"), name: z.string().describe("Name of the country") }).readonly(); -export type IsfDocumentCargoCountryResponseDTO = z.infer; - -/** - * IsfDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } productCode Product code of the cargo - * @property { string } descriptionOfGoods Description of goods - * @property { string } htsCode HTS code of the cargo - * @property { string } manufacturerSupplier Manufacturer supplier of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - * @property { IsfDocumentCargoCountryResponseDTO } countryOfOrigin Country of origin of the cargo - */ -export const IsfDocumentCargoResponseDTOSchema = z.object({ productCode: z.string().describe("Product code of the cargo"), descriptionOfGoods: z.string().describe("Description of goods"), htsCode: z.string().describe("HTS code of the cargo"), manufacturerSupplier: z.string().describe("Manufacturer supplier of the cargo"), seal1: z.string().describe("Seal number 1 of the cargo"), seal2: z.string().describe("Seal number 2 of the cargo"), countryOfOrigin: IsfDocumentCargoCountryResponseDTOSchema.describe("Country of origin of the cargo") }).readonly(); -export type IsfDocumentCargoResponseDTO = z.infer; - -/** - * IsfDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ -export const IsfDocumentPortResponseDTOSchema = z.object({ id: z.string().describe("ID of the port"), name: z.string().describe("Name of the port") }).readonly(); -export type IsfDocumentPortResponseDTO = z.infer; - -/** - * IsfDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - * @property { string } number Number of the business partner - */ -export const IsfDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner"), number: z.string().describe("Number of the business partner") }).readonly(); -export type IsfDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * IsfDocumentContainerLocationResponseDTOSchema - * @type { object } - * @property { string } id ID of the container location - * @property { string } name Name of the container location - * @property { string } address Address of the container location - */ -export const IsfDocumentContainerLocationResponseDTOSchema = z.object({ id: z.string().describe("ID of the container location"), name: z.string().describe("Name of the container location"), address: z.string().describe("Address of the container location") }).readonly(); -export type IsfDocumentContainerLocationResponseDTO = z.infer; - -/** - * IsfDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { number } versionNumber Version number of the document - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } hBLNumber HBL number - * @property { string } mBLNumber MBL number - * @property { string } scacCodeHBL SCAC code for HBL - * @property { string } scacCodeMBL SCAC code for MBL - * @property { IsfDocumentPortResponseDTO } portOfDischarge Port of discharge - * @property { string } issueLocation Issue location - * @property { string } issueDate Issue date - * @property { string } companyName Company name - * @property { object } completedBy - * @property { string } completedBy.name - * @property { string } completedBy.email - * @property { object } container - * @property { string } container.id - * @property { string } container.name - * @property { IsfDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { IsfDocumentBusinessPartnerResponseDTO } manufacturer Manufacturer information - * @property { IsfDocumentBusinessPartnerResponseDTO } seller Seller information - * @property { IsfDocumentBusinessPartnerResponseDTO } buyer Buyer information - * @property { IsfDocumentBusinessPartnerResponseDTO } consolidator Consolidator information - * @property { IsfDocumentContainerLocationResponseDTO } containerLocation Container location information - * @property { IsfDocumentBusinessPartnerResponseDTO } shipTo Ship to information - * @property { IsfDocumentBusinessPartnerResponseDTO } importer Importer information - * @property { IsfDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - */ -export const IsfDocumentResponseDTOSchema = z.object({ id: z.string().describe("ID of the document"), name: z.string().describe("Name of the document"), nameSuffix: z.string().describe("Name suffix of the document").nullish(), defaultFileName: z.string(), positionId: z.string().describe("Position ID"), positionNumber: z.string().describe("Position number"), versionNumber: z.number().describe("Version number of the document"), vessel: z.string().describe("Vessel name").nullish(), voyage: z.string().describe("Voyage number").nullish(), hBLNumber: z.string().describe("HBL number").nullish(), mBLNumber: z.string().describe("MBL number").nullish(), scacCodeHBL: z.string().describe("SCAC code for HBL").nullish(), scacCodeMBL: z.string().describe("SCAC code for MBL").nullish(), portOfDischarge: IsfDocumentPortResponseDTOSchema.describe("Port of discharge").nullish(), issueLocation: z.string().describe("Issue location").nullish(), issueDate: z.iso.datetime({ offset: true }).describe("Issue date").nullish(), companyName: z.string().describe("Company name").nullish(), completedBy: z.object({ name: z.string(), email: z.string() }).readonly().nullish(), container: z.object({ id: z.string(), name: z.string() }).readonly().nullish(), consignee: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consignee information").nullish(), manufacturer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Manufacturer information").nullish(), seller: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Seller information").nullish(), buyer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Buyer information").nullish(), consolidator: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Consolidator information").nullish(), containerLocation: IsfDocumentContainerLocationResponseDTOSchema.describe("Container location information").nullish(), shipTo: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Ship to information").nullish(), importer: IsfDocumentBusinessPartnerResponseDTOSchema.describe("Importer information").nullish(), cargo: z.array(IsfDocumentCargoResponseDTOSchema).readonly().describe("List of cargo information").nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.describe("Configuration settings for the document"), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish() }).readonly(); -export type IsfDocumentResponseDTO = z.infer; - -/** - * UpdateIsfDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - * @property { string } number Business partner number - */ -export const UpdateIsfDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address"), number: z.string().describe("Business partner number") }).readonly(); -export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateIsfDocumentCargoRequestDTOSchema - * @type { object } - * @property { string } productCode Product code - * @property { string } descriptionOfGoods Description of goods - * @property { string } htsCode HTS code - * @property { string } manufacturerSupplier Manufacturer supplier - * @property { string } countryOfOriginId Country of origin ID - */ -export const UpdateIsfDocumentCargoRequestDTOSchema = z.object({ productCode: z.string().describe("Product code"), descriptionOfGoods: z.string().describe("Description of goods"), htsCode: z.string().describe("HTS code"), manufacturerSupplier: z.string().describe("Manufacturer supplier"), countryOfOriginId: z.string().describe("Country of origin ID") }).readonly(); -export type UpdateIsfDocumentCargoRequestDTO = z.infer; - -/** - * UpdateIsfDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } hBLNumber HBL number - * @property { string } mBLNumber MBL number - * @property { string } scacCodeHBL SCAC code for HBL - * @property { string } scacCodeMBL SCAC code for MBL - * @property { string } portOfDischargeId Port of discharge Id - * @property { string } issueLocation Issue location - * @property { string } issueDate Issue date - * @property { string } companyName Company name - * @property { string } completedByName Completed by name - * @property { string } completedByEmail Completed by email - * @property { string } containerId Container ID - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } manufacturer Manufacturer information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } seller Seller information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } buyer Buyer information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consolidator Consolidator information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } containerLocation Container location information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } shipTo Ship to information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } importer Importer information - * @property { UpdateIsfDocumentCargoRequestDTO[] } cargo Cargo information - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateIsfDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Name suffix"), vessel: z.string().describe("Vessel name"), voyage: z.string().describe("Voyage number"), hBLNumber: z.string().describe("HBL number"), mBLNumber: z.string().describe("MBL number"), scacCodeHBL: z.string().describe("SCAC code for HBL"), scacCodeMBL: z.string().describe("SCAC code for MBL"), portOfDischargeId: z.string().describe("Port of discharge Id"), issueLocation: z.string().describe("Issue location"), issueDate: z.iso.datetime({ offset: true }).describe("Issue date"), companyName: z.string().describe("Company name"), completedByName: z.string().describe("Completed by name"), completedByEmail: z.string().describe("Completed by email"), containerId: z.string().describe("Container ID"), consignee: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consignee information"), manufacturer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Manufacturer information"), seller: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Seller information"), buyer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Buyer information"), consolidator: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Consolidator information"), containerLocation: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Container location information"), shipTo: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Ship to information"), importer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.describe("Importer information"), cargo: z.array(UpdateIsfDocumentCargoRequestDTOSchema).readonly().describe("Cargo information"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); -export type UpdateIsfDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts b/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts deleted file mode 100644 index 7974d64..0000000 --- a/test/generated/full/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsIsfFormAcl } from "./workingDocumentsIsfForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsIsfFormApi } from "./workingDocumentsIsfForm.api"; - -export namespace WorkingDocumentsIsfFormQueries { -export const moduleName = QueryModule.WorkingDocumentsIsfForm; - -export const keys = { - all: [moduleName] as const, - getIsfData: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId", positionId, isfId, officeId] as const, - previewIsf: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId/preview", positionId, isfId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an ISF document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsIsfFormApi.create(positionId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetIsfData` - * @summary Get ISF document data - * @permission Requires `canUseGetIsfData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.isfId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetIsfData = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getIsfData(positionId, isfId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId } )); - return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateIsfData` - * @summary Update ISF document data - * @permission Requires `canUseUpdateIsfData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateIsfData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId, data }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId } )); - return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, isfId, officeId } = variables; - const updateKeys = [keys.getIsfData(positionId, isfId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteIsf` - * @summary Delete ISF document - * @permission Requires `canUseDeleteIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } ISF document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteIsf = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewIsf` - recommended when file should be cached - * @summary Preview ISF document - * @permission Requires `canUsePreviewIsf` ability - * @param { string } object.positionId Path parameter - * @param { string } object.isfId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewIsf = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewIsf(positionId, isfId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewIsfMutation` - recommended when file should not be cached - * @summary Preview ISF document - * @permission Requires `canUsePreviewIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewIsfMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, isfId, officeId } = variables; - const updateKeys = [keys.previewIsf(positionId, isfId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateIsf` - * @summary Generate ISF document - * @permission Requires `canUseGenerateIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateIsf = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId, data }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts deleted file mode 100644 index 10d4871..0000000 --- a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsMasterAwbAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Create", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useGetMasterAwbData` query ability. For global ability, omit the object parameter. - * @description Read Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMasterAwbData` query - */ -export const canUseGetMasterAwbData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useUpdateMasterAwbData` mutation ability. For global ability, omit the object parameter. - * @description Update Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateMasterAwbData` mutation - */ -export const canUseUpdateMasterAwbData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useDeleteMasterAwb` mutation ability. For global ability, omit the object parameter. - * @description Delete Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteMasterAwb` mutation - */ -export const canUseDeleteMasterAwb = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Delete", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation - */ -export const canUsePreviewMasterAwb = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useGenerateMasterAwb` mutation ability. For global ability, omit the object parameter. - * @description Generate Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateMasterAwb` mutation - */ -export const canUseGenerateMasterAwb = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts deleted file mode 100644 index 905a525..0000000 --- a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsMasterAwbApi { -export const create = (positionId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs`, - undefined, - config - ) -}; -export const getMasterAwbData = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - config - ) -}; -export const updateMasterAwbData = (positionId: string, mawbId: string, officeId: string, data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), - config - ) -}; -export const deleteMasterAwb = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - undefined, - config - ) -}; -export const previewMasterAwb = (positionId: string, mawbId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateMasterAwb = (positionId: string, mawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -} diff --git a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts deleted file mode 100644 index 4483704..0000000 --- a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsMasterAwbModels { -/** - * MasterAwbDocumentOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - * @property { string } name Name - */ -export const MasterAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID").nullish(), sellRate: z.number().describe("Sell rate"), name: z.string().describe("Name").nullish() }).readonly(); -export type MasterAwbDocumentOtherChargeDTO = z.infer; - -/** - * MasterAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { number } totalOtherCharges Total other charges - * @property { number } total Total - * @property { MasterAwbDocumentOtherChargeDTO[] } otherCharges Other charges - */ -export const MasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), totalOtherCharges: z.number().describe("Total other charges"), total: z.number().describe("Total"), otherCharges: z.array(MasterAwbDocumentOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); -export type MasterAwbDocumentChargesDTO = z.infer; - -/** - * MasterAwbDocumentCargoDTOSchema - * @type { object } - * @property { number } quantity Quantity - * @property { number } grossWeight Gross weight - * @property { string } rateClass Rate class - * @property { string } commodityItemNo Commodity item number - * @property { number } rateOrCharge Rate or charge - * @property { number } total Total - * @property { string } description Description - */ -export const MasterAwbDocumentCargoDTOSchema = z.object({ quantity: z.number().describe("Quantity"), grossWeight: z.number().describe("Gross weight").nullish(), rateClass: z.string().describe("Rate class").nullish(), commodityItemNo: z.string().describe("Commodity item number").nullish(), rateOrCharge: z.number().describe("Rate or charge").nullish(), total: z.number().describe("Total").nullish(), description: z.string().describe("Description").nullish() }).readonly(); -export type MasterAwbDocumentCargoDTO = z.infer; - -/** - * MasterAwbDocumentRouteDTOSchema - * @type { object } - * @property { string } airportOfDeparture Airport of departure - * @property { string } airportOfDestination Airport of destination - * @property { string } toAirport1 To airport 1 - * @property { string } byCarrier1 By carrier 1 - * @property { string } toAirport2 To airport 2 - * @property { string } byCarrier2 By carrier 2 - * @property { string } toAirport3 To airport 3 - * @property { string } byCarrier3 By carrier 3 - * @property { string } flightNumber1 Flight number 1 - * @property { string } flightDay1 Flight day 1 - * @property { string } flightNumber2 Flight number 2 - * @property { string } flightDay2 Flight day 2 - */ -export const MasterAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string().describe("Airport of departure"), airportOfDestination: z.string().describe("Airport of destination"), toAirport1: z.string().describe("To airport 1").nullish(), byCarrier1: z.string().describe("By carrier 1").nullish(), toAirport2: z.string().describe("To airport 2").nullish(), byCarrier2: z.string().describe("By carrier 2").nullish(), toAirport3: z.string().describe("To airport 3").nullish(), byCarrier3: z.string().describe("By carrier 3").nullish(), flightNumber1: z.string().describe("Flight number 1").nullish(), flightDay1: z.string().describe("Flight day 1").nullish(), flightNumber2: z.string().describe("Flight number 2").nullish(), flightDay2: z.string().describe("Flight day 2").nullish() }).readonly(); -export type MasterAwbDocumentRouteDTO = z.infer; - -/** - * MasterAwbDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const MasterAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().describe("ID of the business partner"), name: z.string().describe("Name of the business partner"), address: z.string().describe("Address of the business partner") }).readonly(); -export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * MasterAwbDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the Master AWB document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the Master AWB document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } currency Currency - * @property { number } versionNumber Version number of the document - * @property { string } mawbNumber MAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { MasterAwbDocumentCargoDTO[] } cargo Cargo packages - * @property { MasterAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } signingLocation Signing location - * @property { string } issuerIataCode Issuer IATA code - * @property { number } exchangeRate Exchange rate - * @property { MasterAwbDocumentRouteDTO } route Route - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } issuer Issuer - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { CommonModels.DocumentConfigDTO } config Config - */ -export const MasterAwbDocumentResponseDTOSchema = z.object({ id: z.string().describe("Unique identifier of the Master AWB document"), positionId: z.string().describe("Unique identifier of the position this document belongs to"), positionNumber: z.string().describe("Position number for reference"), name: z.string().describe("Name of the Master AWB document"), nameSuffix: z.string().describe("Suffix to be added to the document name").nullish(), defaultFileName: z.string(), currency: z.string().describe("Currency").nullish(), versionNumber: z.number().describe("Version number of the document"), mawbNumber: z.string().describe("MAWB number").nullish(), sciReference: z.string().describe("SCI reference").nullish(), reference1: z.string().describe("Reference 1").nullish(), reference2: z.string().describe("Reference 2").nullish(), reference3: z.string().describe("Reference 3").nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.describe("Additional text for the document").nullish(), handlingInstructions: z.string().describe("Handling instructions").nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information").nullish(), additionalAccountingNotes: z.string().describe("Additional accounting notes").nullish(), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), cargo: z.array(MasterAwbDocumentCargoDTOSchema).readonly().describe("Cargo packages").nullish(), charges: MasterAwbDocumentChargesDTOSchema.describe("Charges").nullish(), shipperSigner: z.string().describe("Shipper signer").nullish(), shipperSignerUserName: z.string().describe("Shipper signer user name").nullish(), signer: z.string().describe("Signer").nullish(), signingDate: z.iso.datetime({ offset: true }).describe("Signing date").nullish(), signingLocation: z.string().describe("Signing location").nullish(), issuerIataCode: z.string().describe("Issuer IATA code").nullish(), exchangeRate: z.number().describe("Exchange rate").nullish(), route: MasterAwbDocumentRouteDTOSchema.describe("Route").nullish(), consignee: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Consignee").nullish(), shipper: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Shipper").nullish(), issuer: MasterAwbDocumentBusinessPartnerResponseDTOSchema.describe("Issuer").nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Body remarks").nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.describe("Footer remarks").nullish(), createdAt: z.iso.datetime({ offset: true }).describe("Created at"), updatedAt: z.iso.datetime({ offset: true }).describe("Updated at"), config: CommonModels.DocumentConfigDTOSchema.describe("Config").nullish() }).readonly(); -export type MasterAwbDocumentResponseDTO = z.infer; - -/** - * UpdateMasterAwbDocumentChargesOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - */ -export const UpdateMasterAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().describe("Charge type ID"), sellRate: z.number().describe("Sell rate") }).readonly(); -export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer; - -/** - * UpdateMasterAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { UpdateMasterAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges - */ -export const UpdateMasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().describe("Weight charge"), otherCharges: z.array(UpdateMasterAwbDocumentChargesOtherChargeDTOSchema).readonly().describe("Other charges") }).readonly(); -export type UpdateMasterAwbDocumentChargesDTO = z.infer; - -/** - * UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().describe("Business partner ID"), address: z.string().describe("Business partner address") }).readonly(); -export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateMasterAwbDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } mawbNumber MAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { UpdateMasterAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } issuerId Issuer ID - * @property { string } issuerName Issuer name - * @property { string } issuerAddress Issuer address - * @property { string } issuerCity Issuer city - * @property { string } issuerIataCode Issuer IATA code - * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateMasterAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().describe("Document name suffix"), mawbNumber: z.string().describe("MAWB number"), sciReference: z.string().describe("SCI reference"), reference1: z.string().describe("Reference 1"), reference2: z.string().describe("Reference 2"), reference3: z.string().describe("Reference 3"), additionalText: CommonModels.EditorContentUpdateDtoSchema.describe("Additional text for the document"), handlingInstructions: z.string().describe("Handling instructions"), accountInformation: CommonModels.AccountInformationEnumSchema.describe("Account information"), additionalAccountingNotes: z.string().describe("Additional accounting notes"), isSecured: z.boolean().describe("Is secured"), suppressContainerWeight: z.boolean().describe("Suppress container weight"), suppressCargoMeasurement: z.boolean().describe("Suppress cargo measurement"), charges: UpdateMasterAwbDocumentChargesDTOSchema.describe("Charges"), shipperSigner: z.string().describe("Shipper signer"), shipperSignerUserName: z.string().describe("Shipper signer user name"), signer: z.string().describe("Signer"), signingDate: z.iso.datetime({ offset: true }).describe("Signing date"), issuerId: z.string().describe("Issuer ID"), issuerName: z.string().describe("Issuer name"), issuerAddress: z.string().describe("Issuer address"), issuerCity: z.string().describe("Issuer city"), issuerIataCode: z.string().describe("Issuer IATA code"), consignee: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Consignee"), shipper: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.describe("Shipper"), exchangeRate: z.number().describe("Exchange rate"), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Body remarks"), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.describe("Footer remarks") }).readonly(); -export type UpdateMasterAwbDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts b/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts deleted file mode 100644 index 89bd2fa..0000000 --- a/test/generated/full/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsMasterAwbAcl } from "./workingDocumentsMasterAwb.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsMasterAwbApi } from "./workingDocumentsMasterAwb.api"; - -export namespace WorkingDocumentsMasterAwbQueries { -export const moduleName = QueryModule.WorkingDocumentsMasterAwb; - -export const keys = { - all: [moduleName] as const, - getMasterAwbData: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId", positionId, mawbId, officeId] as const, - previewMasterAwb: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId/preview", positionId, mawbId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a Master AWB document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId } )); - return WorkingDocumentsMasterAwbApi.create(positionId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetMasterAwbData` - * @summary Get Master AWB document data - * @permission Requires `canUseGetMasterAwbData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.mawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetMasterAwbData = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId } )); - return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateMasterAwbData` - * @summary Update Master AWB document data - * @permission Requires `canUseUpdateMasterAwbData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateMasterAwbData = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId, data }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId } )); - return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, mawbId, officeId } = variables; - const updateKeys = [keys.getMasterAwbData(positionId, mawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteMasterAwb` - * @summary Delete Master AWB document - * @permission Requires `canUseDeleteMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Master AWB document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewMasterAwb` - recommended when file should be cached - * @summary Preview Master AWB document - * @permission Requires `canUsePreviewMasterAwb` ability - * @param { string } object.positionId Path parameter - * @param { string } object.mawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewMasterAwb = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewMasterAwbMutation` - recommended when file should not be cached - * @summary Preview Master AWB document - * @permission Requires `canUsePreviewMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewMasterAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, mawbId, officeId } = variables; - const updateKeys = [keys.previewMasterAwb(positionId, mawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateMasterAwb` - * @summary Generate Master AWB document - * @permission Requires `canUseGenerateMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId, data }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts deleted file mode 100644 index ccebdd8..0000000 --- a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsTemplatedDocumentAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Create", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useGetTemplatedDocument` query ability. For global ability, omit the object parameter. - * @description Read templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetTemplatedDocument` query - */ -export const canUseGetTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useUpdateTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Update templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateTemplatedDocument` mutation - */ -export const canUseUpdateTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useDeleteTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Delete templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteTemplatedDocument` mutation - */ -export const canUseDeleteTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `usePreviewTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Preview templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewTemplatedDocument` mutation - */ -export const canUsePreviewTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useIssueTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Issue templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueTemplatedDocument` mutation - */ -export const canUseIssueTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate templated document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ -export const canUseGenerateDocumentEml = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -} diff --git a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts deleted file mode 100644 index 4d0042d..0000000 --- a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { AxiosRequestConfig } from "axios"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsTemplatedDocumentApi { -export const create = (positionId: string, officeId: string, data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), - config - ) -}; -export const getTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, config?: AxiosRequestConfig) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - config - ) -}; -export const updateTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), - config - ) -}; -export const deleteTemplatedDocument = (positionId: string, templatedDocumentId: string, officeId: string, config?: AxiosRequestConfig) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - undefined, - config - ) -}; -export const previewTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const issueTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - config - ) -}; -export const generateDocumentEml = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, config?: AxiosRequestConfig) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - ...config, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts deleted file mode 100644 index bba201a..0000000 --- a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsTemplatedDocumentModels { -/** - * TemplatedDocumentBlueprintDtoSchema - * @type { object } - * @property { string } templateId - * @property { string } templateName - * @property { string } capturedAt - * @property { CommonModels.TemplateBlocksResponseDTO } blocks - */ -export const TemplatedDocumentBlueprintDtoSchema = z.object({ templateId: z.string(), templateName: z.string(), capturedAt: z.string(), blocks: CommonModels.TemplateBlocksResponseDTOSchema }).readonly(); -export type TemplatedDocumentBlueprintDto = z.infer; - -/** - * TemplatedDocumentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } officeId - * @property { string } name - * @property { string } nameSuffix - * @property { string } defaultFileName - * @property { number } versionNumber - * @property { TemplatedDocumentBlueprintDto } blueprint Captured template blueprint - * @property { CommonModels.TemplatedDocumentDataDto } data Document data - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } issuedAt - */ -export const TemplatedDocumentResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), officeId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), versionNumber: z.number(), blueprint: TemplatedDocumentBlueprintDtoSchema.describe("Captured template blueprint"), data: CommonModels.TemplatedDocumentDataDtoSchema.describe("Document data"), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), issuedAt: z.iso.datetime({ offset: true }).nullish() }).readonly(); -export type TemplatedDocumentResponseDto = z.infer; - -/** - * UpdateTemplatedDocumentRequestDtoSchema - * @type { object } - * @property { string } nameSuffix Optional suffix for the document name - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data Partial document data to update - */ -export const UpdateTemplatedDocumentRequestDtoSchema = z.object({ nameSuffix: z.string().describe("Optional suffix for the document name"), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.describe("Partial document data to update") }).readonly(); -export type UpdateTemplatedDocumentRequestDto = z.infer; - -/** - * CreateTemplatedDocumentRequestDtoSchema - * @type { object } - * @property { string } templateId Template ID to use for creating the document - * @property { string } nameSuffix Optional suffix for the document name - */ -export const CreateTemplatedDocumentRequestDtoSchema = z.object({ templateId: z.string().describe("Template ID to use for creating the document"), nameSuffix: z.string().describe("Optional suffix for the document name").nullish() }).readonly(); -export type CreateTemplatedDocumentRequestDto = z.infer; - -/** - * GenerateWorkingDocumentPreviewRequestDtoSchema - * @type { object } - * @property { string } issuedAt - */ -export const GenerateWorkingDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }) }).readonly(); -export type GenerateWorkingDocumentPreviewRequestDto = z.infer; - -} diff --git a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts b/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts deleted file mode 100644 index 8385890..0000000 --- a/test/generated/full/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { AxiosRequestConfig } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsTemplatedDocumentAcl } from "./workingDocumentsTemplatedDocument.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsTemplatedDocumentApi } from "./workingDocumentsTemplatedDocument.api"; - -export namespace WorkingDocumentsTemplatedDocumentQueries { -export const moduleName = QueryModule.WorkingDocumentsTemplatedDocument; - -export const keys = { - all: [moduleName] as const, - getTemplatedDocument: (officeId: string, positionId: string, templatedDocumentId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/templated-documents/:templatedDocumentId", officeId, positionId, templatedDocumentId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a templated document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetTemplatedDocument` - * @summary Get templated document data - * @permission Requires `canUseGetTemplatedDocument` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.templatedDocumentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetTemplatedDocument = ({ officeId, positionId, templatedDocumentId }: { officeId: string, positionId: string, templatedDocumentId: string }, options?: AppQueryOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), - queryFn: () => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument(officeId, positionId, templatedDocumentId, config) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateTemplatedDocument` - * @summary Update templated document data - * @permission Requires `canUseUpdateTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, templatedDocumentId } = variables; - const updateKeys = [keys.getTemplatedDocument(officeId, positionId, templatedDocumentId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteTemplatedDocument` - * @summary Delete templated document - * @permission Requires `canUseDeleteTemplatedDocument` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Templated document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, templatedDocumentId, officeId }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument(positionId, templatedDocumentId, officeId, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `usePreviewTemplatedDocument` - recommended when file should not be cached - * @summary Preview templated document - * @permission Requires `canUsePreviewTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const usePreviewTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useIssueTemplatedDocument` - * @summary Issue templated document (generate final PDF) - * @permission Requires `canUseIssueTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useIssueTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument(officeId, positionId, templatedDocumentId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate templated document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions, config?: AxiosRequestConfig) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml(officeId, positionId, templatedDocumentId, data, config) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/full/zod.extended.ts b/test/generated/full/zod.extended.ts deleted file mode 100644 index 205405c..0000000 --- a/test/generated/full/zod.extended.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from "zod"; -import { ErrorHandler, SharedErrorHandler } from "@povio/openapi-codegen-cli"; - -export namespace ZodExtended { - interface ParseOptions { - type: "body" | "query"; - name?: string; - errorHandler?: ErrorHandler; - } - - export function parse( - schema: z.ZodType, - data: unknown, - { type, name, errorHandler }: ParseOptions = { type: "body" }, - ) { - try { - return schema.parse(data); - } catch (e) { - if (e instanceof z.ZodError) { - e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; - } - (errorHandler ?? SharedErrorHandler).rethrowError(e); - throw e; - } - } - - function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { - if (data === undefined || data === "" || enumSchema.options.length === 0) { - return true; - } - - const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; - const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; - return new RegExp(`^${commaSeparatedOptions}$`).test(data); - } - - export const sortExp = (enumSchema: z.ZodEnum) => - z.string().superRefine((arg, ctx) => { - if (!isSortExpValid(enumSchema, arg)) { - ctx.addIssue({ - code: "invalid_value", - message: "Invalid sorting string.", - values: [], - }); - } - }); -} diff --git a/test/generated/next/aWBStocks/aWBStocks.acl.ts b/test/generated/next/aWBStocks/aWBStocks.acl.ts deleted file mode 100644 index ab8512e..0000000 --- a/test/generated/next/aWBStocks/aWBStocks.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace AWBStocksAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List AWB stocks - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Create", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get AWB stock details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Read", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive AWB stock - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -/** - * Use for `useGenerateNextNumber` mutation ability. For global ability, omit the object parameter. - * @description Generate next AWB number - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateNextNumber` mutation - */ -export const canUseGenerateNextNumber = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("AWBStock", object) : "AWBStock" -] as AbilityTuple<"Update", "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, }>; - -} diff --git a/test/generated/next/aWBStocks/aWBStocks.api.ts b/test/generated/next/aWBStocks/aWBStocks.api.ts deleted file mode 100644 index 47097eb..0000000 --- a/test/generated/next/aWBStocks/aWBStocks.api.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { AWBStocksModels } from "./aWBStocks.models"; - -export namespace AWBStocksApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: AWBStocksModels.AWBStocksPaginateResponseSchema }, - `/offices/${officeId}/awb-stocks`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(AWBStocksModels.AWBStockFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: AWBStocksModels.CreateAWBStockRequestDTO, ) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks`, - ZodExtended.parse(AWBStocksModels.CreateAWBStockRequestDTOSchema, data), - - ) -}; -export const findById = (stockId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}`, - - ) -}; -export const update = (stockId: string, officeId: string, data: AWBStocksModels.UpdateAWBStockRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}`, - ZodExtended.parse(AWBStocksModels.UpdateAWBStockRequestDTOSchema, data), - - ) -}; -export const archive = (stockId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}/archive`, - - ) -}; -export const unarchive = (stockId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.AWBStockResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/${stockId}/unarchive`, - - ) -}; -export const generateNextNumber = (officeId: string, data: AWBStocksModels.GenerateAWBNumberRequestDTO, ) => { - return AppRestClient.post( - { resSchema: AWBStocksModels.GenerateAWBNumberResponseDTOSchema }, - `/offices/${officeId}/awb-stocks/generate-number`, - ZodExtended.parse(AWBStocksModels.GenerateAWBNumberRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/aWBStocks/aWBStocks.configs.ts b/test/generated/next/aWBStocks/aWBStocks.configs.ts deleted file mode 100644 index 66cd58d..0000000 --- a/test/generated/next/aWBStocks/aWBStocks.configs.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { AWBStocksModels } from "./aWBStocks.models"; -import { AWBStocksQueries } from "./aWBStocks.queries"; -import { AWBStocksAcl } from "./aWBStocks.acl"; - -export namespace AWBStocksConfigs { -export const awbStocksConfig = { - meta: { - title: "Awb Stocks", - }, - readAll: { - acl: AWBStocksAcl.canUsePaginate, - schema: AWBStocksModels.AWBStockResponseDTOSchema, - paginated: AWBStocksQueries.usePaginate, - infinite: AWBStocksQueries.usePaginateInfinite, - filters: { - schema: AWBStocksModels.AWBStockFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AWBStocksModels.AWBStockFilterDtoSchema, - options: { - inputs: { - archived: true, - carrierId: true, - searchQuery: true, - used: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: AWBStocksModels.AWBStockResponseDTOSchema, - options: { - columns: { - id: true, - carrier: true, - startNumber: true, - lastUsedNumber: true, - stock: true, - usedCodes: true, - priority: true, - archived: true, - comments: true, - createdAt: true, - updatedAt: true, - createdBy: true, - updatedBy: true, - officeId: true, - }, - sortable: AWBStocksModels.AWBStocksPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: AWBStocksAcl.canUseFindById, - schema: AWBStocksModels.AWBStockResponseDTOSchema, - query: AWBStocksQueries.useFindById, - }, - create: { - acl: AWBStocksAcl.canUseCreate, - schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, - mutation: AWBStocksQueries.useCreate, - inputDefs: dynamicInputs({ - schema: AWBStocksModels.CreateAWBStockRequestDTOSchema, - options: { - inputs: { - carrierId: true, - startNumber: true, - stock: true, - priority: true, - comments: true, - officeId: true, - }, - }, -}) - }, - update: { - acl: AWBStocksAcl.canUseUpdate, - schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, - mutation: AWBStocksQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: AWBStocksModels.UpdateAWBStockRequestDTOSchema, - options: { - inputs: { - comments: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/next/aWBStocks/aWBStocks.models.ts b/test/generated/next/aWBStocks/aWBStocks.models.ts deleted file mode 100644 index 2d817fa..0000000 --- a/test/generated/next/aWBStocks/aWBStocks.models.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace AWBStocksModels { -/** - * AWBStockBusinessPartnerPreviewDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } name Business partner name - * @property { string } carrierPrefix Carrier prefix (3 digits) - */ -export const AWBStockBusinessPartnerPreviewDTOSchema = z.object({ id: z.string(), name: z.string(), carrierPrefix: z.string() }); -export type AWBStockBusinessPartnerPreviewDTO = z.infer; - -/** - * AWBStockEmployeePreviewDTOSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Employee email - */ -export const AWBStockEmployeePreviewDTOSchema = z.object({ id: z.string(), email: z.string() }); -export type AWBStockEmployeePreviewDTO = z.infer; - -/** - * AWBStockResponseDTOSchema - * @type { object } - * @property { string } id AWB stock ID - * @property { AWBStockBusinessPartnerPreviewDTO } carrier Carrier business partner - * @property { number } startNumber Start number - * @property { number } lastUsedNumber Last used number - * @property { number } stock Stock size - * @property { number } usedCodes Used codes count - * @property { number } priority Priority - * @property { boolean } archived Is archived - * @property { string } comments Comments - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { AWBStockEmployeePreviewDTO } createdBy User who created the stock - * @property { AWBStockEmployeePreviewDTO } updatedBy User who updated the stock - * @property { string } officeId Office ID - */ -export const AWBStockResponseDTOSchema = z.object({ id: z.string(), carrier: AWBStockBusinessPartnerPreviewDTOSchema, startNumber: z.number(), lastUsedNumber: z.number().nullish(), stock: z.number(), usedCodes: z.number(), priority: z.number(), archived: z.boolean(), comments: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: AWBStockEmployeePreviewDTOSchema, updatedBy: AWBStockEmployeePreviewDTOSchema.nullish(), officeId: z.string() }); -export type AWBStockResponseDTO = z.infer; - -/** - * AWBStockFilterDtoSchema - * @type { object } - * @property { boolean } archived - * @property { string } carrierId - * @property { string } searchQuery - * @property { boolean } used - */ -export const AWBStockFilterDtoSchema = z.object({ archived: z.boolean().nullable(), carrierId: z.string().nullable(), searchQuery: z.string().nullable(), used: z.boolean().nullable() }).partial(); -export type AWBStockFilterDto = z.infer; - -/** - * CreateAWBStockRequestDTOSchema - * @type { object } - * @property { string } carrierId Carrier business partner ID - * @property { number } startNumber Start number. Minimum: `0` - * @property { number } stock Stock size - * @property { number } priority Priority - * @property { string } comments Comments - * @property { string } officeId Office ID - */ -export const CreateAWBStockRequestDTOSchema = z.object({ carrierId: z.string(), startNumber: z.number().gte(0), stock: z.number(), priority: z.number(), comments: z.string().nullish(), officeId: z.string() }); -export type CreateAWBStockRequestDTO = z.infer; - -/** - * GenerateAWBNumberRequestDTOSchema - * @type { object } - * @property { string } carrierId Carrier ID. Example: `e847c7dd-a364-4488-bed6-1e5878aff022` - */ -export const GenerateAWBNumberRequestDTOSchema = z.object({ carrierId: z.string() }); -export type GenerateAWBNumberRequestDTO = z.infer; - -/** - * GenerateAWBNumberResponseDTOSchema - * @type { object } - * @property { string } formattedAwbNumber Generated AWB number. Example: `123-45678901` - */ -export const GenerateAWBNumberResponseDTOSchema = z.object({ formattedAwbNumber: z.string() }); -export type GenerateAWBNumberResponseDTO = z.infer; - -/** - * UpdateAWBStockRequestDTOSchema - * @type { object } - * @property { string } comments Comments - */ -export const UpdateAWBStockRequestDTOSchema = z.object({ comments: z.string().nullable() }).partial(); -export type UpdateAWBStockRequestDTO = z.infer; - -/** - * AWBStocksPaginateOrderParamEnumSchema - * @type { enum } - */ -export const AWBStocksPaginateOrderParamEnumSchema = z.enum(["createdAt", "updatedAt", "createdBy", "updatedBy", "carrierName", "startNumber", "priority"]); -export type AWBStocksPaginateOrderParamEnum = z.infer; -export const AWBStocksPaginateOrderParamEnum = AWBStocksPaginateOrderParamEnumSchema.enum; - -/** - * AWBStocksPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { AWBStockResponseDTO[] } items - */ -export const AWBStocksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AWBStockResponseDTOSchema).nullable() }).partial().shape }); -export type AWBStocksPaginateResponse = z.infer; - -} diff --git a/test/generated/next/aWBStocks/aWBStocks.queries.ts b/test/generated/next/aWBStocks/aWBStocks.queries.ts deleted file mode 100644 index 7efe73d..0000000 --- a/test/generated/next/aWBStocks/aWBStocks.queries.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AWBStocksAcl } from "./aWBStocks.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AWBStocksModels } from "./aWBStocks.models"; -import { AWBStocksApi } from "./aWBStocks.api"; - -export namespace AWBStocksQueries { -export const moduleName = QueryModule.AWBStocks; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/awb-stocks", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (stockId: string, officeId: string) => [...keys.all, "/offices/:officeId/awb-stocks/:stockId", stockId, officeId] as const, -}; - -/** - * Query `usePaginate` - * @summary List AWB stocks - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` - * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); - return AWBStocksApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary List AWB stocks - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, updatedAt, createdBy, updatedBy, carrierName, startNumber, priority. Example: `createdAt` - * @param { AWBStocksModels.AWBStockFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: AWBStocksModels.AWBStockFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AWBStocksAcl.canUsePaginate({ officeId } )); - return AWBStocksApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create AWB stock - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.CreateAWBStockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(AWBStocksAcl.canUseCreate({ officeId } )); - return AWBStocksApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get AWB stock details - * @permission Requires `canUseFindById` ability - * @param { string } object.stockId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ stockId, officeId }: { stockId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(stockId, officeId), - queryFn: () => { - checkAcl(AWBStocksAcl.canUseFindById({ officeId } )); - return AWBStocksApi.findById(stockId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update AWB stock comments - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.UpdateAWBStockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId, data }) => { - checkAcl(AWBStocksAcl.canUseUpdate({ officeId } )); - return AWBStocksApi.update(stockId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive AWB stock - * @permission Requires `canUseArchive` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId }) => { - checkAcl(AWBStocksAcl.canUseArchive({ officeId } )); - return AWBStocksApi.archive(stockId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive AWB stock - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.stockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ stockId, officeId }) => { - checkAcl(AWBStocksAcl.canUseUnarchive({ officeId } )); - return AWBStocksApi.unarchive(stockId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { stockId, officeId } = variables; - const updateKeys = [keys.findById(stockId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateNextNumber` - * @summary Generate next AWB number for carrier - * @permission Requires `canUseGenerateNextNumber` ability - * @param { string } mutation.officeId Path parameter - * @param { AWBStocksModels.GenerateAWBNumberRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateNextNumber = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(AWBStocksAcl.canUseGenerateNextNumber({ officeId } )); - return AWBStocksApi.generateNextNumber(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/acl/app.ability.ts b/test/generated/next/acl/app.ability.ts deleted file mode 100644 index 7b598a8..0000000 --- a/test/generated/next/acl/app.ability.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { PureAbility, AbilityTuple, ForcedSubject } from "@casl/ability"; - -export type AppAbilities = -| AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, } | "Office" | "Currency" | "Country" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | ForcedSubject<"Role"> & { context?: string, } | "Permission" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId?: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, } | ForcedSubject<"Office"> & { officeId: string, }> -| AbilityTuple<"Create", "Office" | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "Airport" | "Port" | "ContainerYard" | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId?: string, } | ForcedSubject<"Employee"> & { officeId: string, } | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> -| AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, } | "Currency" | "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "Terminal" | "Airport" | "Port" | "ContainerYard" | "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "PackageType" | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "ChargeType" | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "Employee" | ForcedSubject<"Employee"> & { officeId: string, } | "Customer" | "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "VatRule" | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, } | "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, } | "AWBStock" | ForcedSubject<"AWBStock"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, } | "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }> -| AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, } | "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, } | "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, } | "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, } | "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, } | "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, } | "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, } | "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, } | "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, } | "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, } | "Role" | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, } | "City" | "Depot" | "PartnerNetwork" | "Warehouse" | "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "HsCode" | "CargoType" | "Terminal" | "PackageType" | "ChargeType" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, } | "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, } | "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, } | "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, } | "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }> -| AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }> -| AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, } | "Terminal" | "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, } | "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, } | "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }> -| AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, } | "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, } | "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }> -| AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> -| AbilityTuple<"ListRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> -| AbilityTuple<"UpdateRoles", "Employee" | "Employment" | ForcedSubject<"Employment"> & { officeId: string, }> -| AbilityTuple<"Deactivate", "Customer"> -| AbilityTuple<"Reactivate", "Customer"> -| AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, } | "Position" | ForcedSubject<"Position"> & { officeId: string, } | "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, } | "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, } | "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, } | "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }> -| AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }> -| AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }> -| AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }> -| AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }> -| AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }> - -export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/next/acl/useAclCheck.ts b/test/generated/next/acl/useAclCheck.ts deleted file mode 100644 index 723069f..0000000 --- a/test/generated/next/acl/useAclCheck.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; -import { type ErrorHandler, SharedErrorHandler } from ""; -import { AbilityContext } from ""; -import { useCallback } from "react"; -import { AppAbilities } from "@/data/acl/app.ability"; - -interface UseAclCheckProps { - errorHandler?: ErrorHandler; -} - -export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { - const ability = AbilityContext.useAbility(); - - const checkAcl = useCallback((appAbility: AppAbilities) => { - if (!ability.can(...(appAbility as AbilityTuple))) { - (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); - } - }, [ability, errorHandler]); - - return { checkAcl }; -} diff --git a/test/generated/next/airPositions/airPositions.acl.ts b/test/generated/next/airPositions/airPositions.acl.ts deleted file mode 100644 index 6c0afca..0000000 --- a/test/generated/next/airPositions/airPositions.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace AirPositionsAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get air position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update air position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/next/airPositions/airPositions.api.ts b/test/generated/next/airPositions/airPositions.api.ts deleted file mode 100644 index 5b8e89a..0000000 --- a/test/generated/next/airPositions/airPositions.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { AirPositionsModels } from "./airPositions.models"; - -export namespace AirPositionsApi { -export const get = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/air-position`, - - ) -}; -export const update = (officeId: string, positionId: string, data: AirPositionsModels.UpdateAirPositionRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: AirPositionsModels.AirPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/air-position`, - ZodExtended.parse(AirPositionsModels.UpdateAirPositionRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/airPositions/airPositions.models.ts b/test/generated/next/airPositions/airPositions.models.ts deleted file mode 100644 index bd514c5..0000000 --- a/test/generated/next/airPositions/airPositions.models.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { z } from "zod"; - -export namespace AirPositionsModels { -/** - * AirPositionCustomsStatusTypeEnumSchema - * @type { enum } - */ -export const AirPositionCustomsStatusTypeEnumSchema = z.enum(["Other", "X", "C", "TD", "T1"]); -export type AirPositionCustomsStatusTypeEnum = z.infer; -export const AirPositionCustomsStatusTypeEnum = AirPositionCustomsStatusTypeEnumSchema.enum; - -/** - * AirPositionResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } hawbNumber - * @property { string } mawbNumber - * @property { string } airlineDeadline - * @property { string } customsStatus - * @property { AirPositionCustomsStatusTypeEnum } customsStatusType - * @property { boolean } hawbRequired - * @property { boolean } mawbRequired - * @property { string } mrnT1Number - * @property { boolean } isCourier - * @property { string } deliveryToConsignee - * @property { string } createdAt - * @property { string } updatedAt - */ -export const AirPositionResponseDTOSchema = z.object({ id: z.string(), hawbNumber: z.string().nullish(), mawbNumber: z.string().nullish(), airlineDeadline: z.iso.datetime({ offset: true }).nullish(), customsStatus: z.string().nullish(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullish(), hawbRequired: z.boolean(), mawbRequired: z.boolean(), mrnT1Number: z.string().nullish(), isCourier: z.boolean().nullish(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }); -export type AirPositionResponseDTO = z.infer; - -/** - * UpdateAirPositionRequestDTOSchema - * @type { object } - * @property { string } hawbNumber - * @property { string } mawbNumber - * @property { string } airlineDeadline - * @property { string } customsStatus - * @property { AirPositionCustomsStatusTypeEnum } customsStatusType - * @property { string } mrnT1Number - * @property { boolean } hawbRequired - * @property { boolean } mawbRequired - * @property { boolean } isCourier - * @property { string } deliveryToConsignee - */ -export const UpdateAirPositionRequestDTOSchema = z.object({ hawbNumber: z.string().nullable(), mawbNumber: z.string().nullable(), airlineDeadline: z.iso.datetime({ offset: true }).nullable(), customsStatus: z.string().nullable(), customsStatusType: AirPositionCustomsStatusTypeEnumSchema.nullable(), mrnT1Number: z.string().nullable(), hawbRequired: z.boolean().nullable(), mawbRequired: z.boolean().nullable(), isCourier: z.boolean().nullable(), deliveryToConsignee: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type UpdateAirPositionRequestDTO = z.infer; - -} diff --git a/test/generated/next/airPositions/airPositions.queries.ts b/test/generated/next/airPositions/airPositions.queries.ts deleted file mode 100644 index 3671950..0000000 --- a/test/generated/next/airPositions/airPositions.queries.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AirPositionsAcl } from "./airPositions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AirPositionsModels } from "./airPositions.models"; -import { AirPositionsApi } from "./airPositions.api"; - -export namespace AirPositionsQueries { -export const moduleName = QueryModule.AirPositions; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/air-position", officeId, positionId] as const, -}; - -/** - * Query `useGet` - * @summary Get air position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(AirPositionsAcl.canUseGet({ officeId } )); - return AirPositionsApi.get(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update air position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AirPositionsModels.UpdateAirPositionRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(AirPositionsAcl.canUseUpdate({ officeId } )); - return AirPositionsApi.update(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/airports/airports.acl.ts b/test/generated/next/airports/airports.acl.ts deleted file mode 100644 index 1af795c..0000000 --- a/test/generated/next/airports/airports.acl.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace AirportsAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Airport" -] as AbilityTuple<"Read", "Airport">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Airport" -] as AbilityTuple<"Create", "Airport">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Airport" -] as AbilityTuple<"Read", "Airport">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Airport" -] as AbilityTuple<"Update", "Airport">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Airport" -] as AbilityTuple<"Read", "Airport">; - -} diff --git a/test/generated/next/airports/airports.api.ts b/test/generated/next/airports/airports.api.ts deleted file mode 100644 index efd1d01..0000000 --- a/test/generated/next/airports/airports.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { AirportsModels } from "./airports.models"; - -export namespace AirportsApi { -export const paginate = (limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: AirportsModels.AirportsPaginateResponseSchema }, - `/airports`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(AirportsModels.AirportPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: AirportsModels.CreateAirportRequestDTO, ) => { - return AppRestClient.post( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports`, - ZodExtended.parse(AirportsModels.CreateAirportRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: AirportsModels.AirportsPaginateLabelsResponseSchema }, - `/airports/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(AirportsModels.AirportLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const update = (id: string, data: AirportsModels.UpdateAirportRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports/${id}`, - ZodExtended.parse(AirportsModels.UpdateAirportRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: AirportsModels.AirportResponseDTOSchema }, - `/airports/${id}`, - - ) -}; -} diff --git a/test/generated/next/airports/airports.configs.ts b/test/generated/next/airports/airports.configs.ts deleted file mode 100644 index 9b47119..0000000 --- a/test/generated/next/airports/airports.configs.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { AirportsModels } from "./airports.models"; -import { CommonModels } from "@/data/common/common.models"; -import { AirportsQueries } from "./airports.queries"; -import { AirportsAcl } from "./airports.acl"; - -export namespace AirportsConfigs { -export const airportsConfig = { - meta: { - title: "Airports", - }, - readAll: { - acl: AirportsAcl.canUsePaginate, - schema: AirportsModels.AirportResponseDTOSchema, - paginated: AirportsQueries.usePaginate, - infinite: AirportsQueries.usePaginateInfinite, - filters: { - schema: AirportsModels.AirportPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AirportsModels.AirportPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: AirportsModels.AirportResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - iataCode: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: AirportsModels.AirportsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: AirportsAcl.canUseFindById, - schema: AirportsModels.AirportResponseDTOSchema, - query: AirportsQueries.useFindById, - }, - create: { - acl: AirportsAcl.canUseCreate, - schema: AirportsModels.CreateAirportRequestDTOSchema, - mutation: AirportsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: AirportsModels.CreateAirportRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - iataCode: true, - }, - }, -}) - }, - update: { - acl: AirportsAcl.canUseUpdate, - schema: AirportsModels.UpdateAirportRequestDTOSchema, - mutation: AirportsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: AirportsModels.UpdateAirportRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - iataCode: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: AirportsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: AirportsQueries.usePaginateLabels, - infinite: AirportsQueries.usePaginateLabelsInfinite, - filters: { - schema: AirportsModels.AirportLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: AirportsModels.AirportLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: AirportsModels.AirportsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/airports/airports.models.ts b/test/generated/next/airports/airports.models.ts deleted file mode 100644 index 6d862c1..0000000 --- a/test/generated/next/airports/airports.models.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace AirportsModels { -/** - * AirportEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const AirportEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type AirportEmployeeDTO = z.infer; - -/** - * AirportResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the airport - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - * @property { string } createdById - * @property { AirportEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { AirportEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const AirportResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), iataCode: z.string(), createdById: z.string().nullish(), createdBy: AirportEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: AirportEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type AirportResponseDTO = z.infer; - -/** - * AirportPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter airports by name, match code or IATA code - */ -export const AirportPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type AirportPaginationFilterDto = z.infer; - -/** - * AirportLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const AirportLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type AirportLabelFilterDto = z.infer; - -/** - * CreateAirportRequestDTOSchema - * @type { object } - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - */ -export const CreateAirportRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), iataCode: z.string() }); -export type CreateAirportRequestDTO = z.infer; - -/** - * UpdateAirportRequestDTOSchema - * @type { object } - * @property { string } name Name of the airport - * @property { string } matchCode Match code for the airport - * @property { string } iataCode IATA code of the airport - */ -export const UpdateAirportRequestDTOSchema = z.object({ name: z.string().nullable(), matchCode: z.string().nullable(), iataCode: z.string().nullable() }).partial(); -export type UpdateAirportRequestDTO = z.infer; - -/** - * AirportsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const AirportsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type AirportsPaginateOrderParamEnum = z.infer; -export const AirportsPaginateOrderParamEnum = AirportsPaginateOrderParamEnumSchema.enum; - -/** - * AirportsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { AirportResponseDTO[] } items - */ -export const AirportsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(AirportResponseDTOSchema).nullable() }).partial().shape }); -export type AirportsPaginateResponse = z.infer; - -/** - * AirportsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const AirportsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "iataCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type AirportsPaginateLabelsOrderParamEnum = z.infer; -export const AirportsPaginateLabelsOrderParamEnum = AirportsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * AirportsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const AirportsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type AirportsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/airports/airports.queries.ts b/test/generated/next/airports/airports.queries.ts deleted file mode 100644 index 47b06ab..0000000 --- a/test/generated/next/airports/airports.queries.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { AirportsAcl } from "./airports.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { AirportsModels } from "./airports.models"; -import { AirportsApi } from "./airports.api"; - -export namespace AirportsQueries { -export const moduleName = QueryModule.Airports; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string) => [...keys.all, "/airports", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/airports/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string) => [...keys.all, "/airports/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/airports/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Airports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Airports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AirportsAcl.canUsePaginate()); - return AirportsApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create airport - * @permission Requires `canUseCreate` ability - * @param { AirportsModels.CreateAirportRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(AirportsAcl.canUseCreate()); - return AirportsApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate airports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate airports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, iataCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { AirportsModels.AirportLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: AirportsModels.AirportLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(AirportsAcl.canUsePaginateLabels()); - return AirportsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update airport - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { AirportsModels.UpdateAirportRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(AirportsAcl.canUseUpdate()); - return AirportsApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get airport - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(AirportsAcl.canUseFindById()); - return AirportsApi.findById(id) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/app-rest-client.ts b/test/generated/next/app-rest-client.ts deleted file mode 100644 index dc174bc..0000000 --- a/test/generated/next/app-rest-client.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RestClient } from "@povio/openapi-codegen-cli"; - -export const AppRestClient = new RestClient({ - config: { - baseURL: "http://localhost:4000" - }, -}); diff --git a/test/generated/next/bankAccounts/bankAccounts.acl.ts b/test/generated/next/bankAccounts/bankAccounts.acl.ts deleted file mode 100644 index 18ce4b2..0000000 --- a/test/generated/next/bankAccounts/bankAccounts.acl.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace BankAccountsAcl { -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Office" -] as AbilityTuple<"Read", "Office">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Office" -] as AbilityTuple<"Read", "Office">; - -} diff --git a/test/generated/next/bankAccounts/bankAccounts.api.ts b/test/generated/next/bankAccounts/bankAccounts.api.ts deleted file mode 100644 index 1274ba6..0000000 --- a/test/generated/next/bankAccounts/bankAccounts.api.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BankAccountsModels } from "./bankAccounts.models"; - -export namespace BankAccountsApi { -export const findAll = (search?: string, officeId?: string, ) => { - return AppRestClient.get( - { resSchema: BankAccountsModels.BankAccountsFindAllResponseSchema }, - `/bank-accounts/labels`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - officeId: ZodExtended.parse(z.string().nullish(), officeId, { type: "query", name: "officeId" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BankAccountsModels.BankAccountsPaginateLabelsResponseSchema }, - `/bank-accounts/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BankAccountsModels.BankAccountFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/next/bankAccounts/bankAccounts.configs.ts b/test/generated/next/bankAccounts/bankAccounts.configs.ts deleted file mode 100644 index 23ecfc1..0000000 --- a/test/generated/next/bankAccounts/bankAccounts.configs.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { BankAccountsModels } from "./bankAccounts.models"; -import { BankAccountsQueries } from "./bankAccounts.queries"; -import { BankAccountsAcl } from "./bankAccounts.acl"; - -export namespace BankAccountsConfigs { -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: BankAccountsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: BankAccountsQueries.usePaginateLabels, - infinite: BankAccountsQueries.usePaginateLabelsInfinite, - filters: { - schema: BankAccountsModels.BankAccountFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BankAccountsModels.BankAccountFilterDtoSchema, - options: { - inputs: { - search: true, - officeId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: BankAccountsModels.BankAccountsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/bankAccounts/bankAccounts.models.ts b/test/generated/next/bankAccounts/bankAccounts.models.ts deleted file mode 100644 index 108934f..0000000 --- a/test/generated/next/bankAccounts/bankAccounts.models.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BankAccountsModels { -/** - * BankAccountFilterDtoSchema - * @type { object } - * @property { string } search Search by name or bank name - * @property { string } officeId Office ID to filter by - */ -export const BankAccountFilterDtoSchema = z.object({ search: z.string().nullable(), officeId: z.string().nullable() }).partial(); -export type BankAccountFilterDto = z.infer; - -/** - * BankAccountsFindAllResponseSchema - * @type { array } - */ -export const BankAccountsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type BankAccountsFindAllResponse = z.infer; - -/** - * BankAccountsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const BankAccountsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "bankName", "createdAt", "updatedAt"]); -export type BankAccountsPaginateLabelsOrderParamEnum = z.infer; -export const BankAccountsPaginateLabelsOrderParamEnum = BankAccountsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * BankAccountsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const BankAccountsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type BankAccountsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/bankAccounts/bankAccounts.queries.ts b/test/generated/next/bankAccounts/bankAccounts.queries.ts deleted file mode 100644 index 0a86f09..0000000 --- a/test/generated/next/bankAccounts/bankAccounts.queries.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BankAccountsAcl } from "./bankAccounts.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { BankAccountsModels } from "./bankAccounts.models"; -import { BankAccountsApi } from "./bankAccounts.api"; - -export namespace BankAccountsQueries { -export const moduleName = QueryModule.BankAccounts; - -export const keys = { - all: [moduleName] as const, - findAll: (search?: string, officeId?: string) => [...keys.all, "/bank-accounts/labels", search, officeId] as const, - paginateLabels: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string) => [...keys.all, "/bank-accounts/labels/paginate", "infinite", limit, order, filter, cursor] as const, -}; - -/** - * Query `useFindAll` - * @summary List all bank accounts with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { string } object.officeId Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ search, officeId }: { search?: string, officeId?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search, officeId), - queryFn: () => { - checkAcl(BankAccountsAcl.canUseFindAll()); - return BankAccountsApi.findAll(search, officeId) }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate bank account labels (id and name only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` - * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate bank account labels (id and name only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, bankName, createdAt, updatedAt. Example: `name` - * @param { BankAccountsModels.BankAccountFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: BankAccountsModels.BankAccountFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BankAccountsAcl.canUsePaginateLabels()); - return BankAccountsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.acl.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.acl.ts deleted file mode 100644 index 055a8b8..0000000 --- a/test/generated/next/bookkeepingExport/bookkeepingExport.acl.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BookkeepingExportAcl { -/** - * Use for `useCreateBatch` mutation ability. For global ability, omit the object parameter. - * @description Create bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBatch` mutation - */ -export const canUseCreateBatch = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Create", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `usePaginateBatches` query ability. For global ability, omit the object parameter. - * @description List bookkeeping export batches - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatches` query - */ -export const canUsePaginateBatches = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useGetBatch` query ability. For global ability, omit the object parameter. - * @description Get bookkeeping export batch details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query - */ -export const canUseGetBatch = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useUpdateBatchFormat` mutation ability. For global ability, omit the object parameter. - * @description Update bookkeeping export batch format - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchFormat` mutation - */ -export const canUseUpdateBatchFormat = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useUpdateBatchItem` mutation ability. For global ability, omit the object parameter. - * @description Update bookkeeping export batch item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBatchItem` mutation - */ -export const canUseUpdateBatchItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `usePaginateBatchItems` query ability. For global ability, omit the object parameter. - * @description List batch items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateBatchItems` query - */ -export const canUsePaginateBatchItems = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useValidateBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Export bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useValidateBookkeepingBatch` mutation - */ -export const canUseValidateBookkeepingBatch = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useExportBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Export bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportBookkeepingBatch` mutation - */ -export const canUseExportBookkeepingBatch = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Export", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useRevertBookkeepingBatch` mutation ability. For global ability, omit the object parameter. - * @description Revert bookkeeping export batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertBookkeepingBatch` mutation - */ -export const canUseRevertBookkeepingBatch = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Update", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -/** - * Use for `useGetVatLineItems` query ability. For global ability, omit the object parameter. - * @description Get VAT line items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetVatLineItems` query - */ -export const canUseGetVatLineItems = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BookkeepingExportBatch", object) : "BookkeepingExportBatch" -] as AbilityTuple<"Read", "BookkeepingExportBatch" | ForcedSubject<"BookkeepingExportBatch"> & { officeId: string, }>; - -} diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.api.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.api.ts deleted file mode 100644 index 75d9468..0000000 --- a/test/generated/next/bookkeepingExport/bookkeepingExport.api.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; - -export namespace BookkeepingExportApi { -export const createBatch = (officeId: string, data: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto, ) => { - return AppRestClient.post( - { resSchema: BookkeepingExportModels.CreateBookkeepingExportBatchResponseDtoSchema }, - `/offices/${officeId}/bookkeeping-exports`, - ZodExtended.parse(BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, data), - - ) -}; -export const paginateBatches = (officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.PaginateBatchesResponseSchema }, - `/offices/${officeId}/bookkeeping-exports`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getBatch = (officeId: string, batchId: string, ) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, - `/offices/${officeId}/bookkeeping-exports/${batchId}`, - - ) -}; -export const updateBatchFormat = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto, ) => { - return AppRestClient.patch( - { resSchema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema }, - `/offices/${officeId}/bookkeeping-exports/${batchId}`, - ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, data), - - ) -}; -export const updateBatchItem = (officeId: string, batchId: string, data: BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto, ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/items`, - ZodExtended.parse(BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDtoSchema, data), - - ) -}; -export const paginateBatchItems = (officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.PaginateBatchItemsResponseSchema }, - `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/items`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const validateBookkeepingBatch = (officeId: string, batchId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/validate`, - - ) -}; -export const exportBookkeepingBatch = (officeId: string, batchId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/export`, - - ) -}; -export const revertBookkeepingBatch = (officeId: string, batchId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/bookkeeping-exports/${batchId}/revert`, - - ) -}; -export const getVatLineItems = (officeId: string, batchId: string, order?: string, ) => { - return AppRestClient.get( - { resSchema: BookkeepingExportModels.GetVatLineItemsResponseSchema }, - `/offices/${officeId}/bookkeeping-exports/batches/${batchId}/vat-line-items`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BookkeepingExportModels.GetVatLineItemsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - }, - } - ) -}; -} diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.configs.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.configs.ts deleted file mode 100644 index b28771d..0000000 --- a/test/generated/next/bookkeepingExport/bookkeepingExport.configs.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; -import { BookkeepingExportQueries } from "./bookkeepingExport.queries"; -import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; - -export namespace BookkeepingExportConfigs { -export const bookkeepingExportsConfig = { - meta: { - title: "Bookkeeping Exports", - }, - readAll: { - acl: BookkeepingExportAcl.canUsePaginateBatches, - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, - paginated: BookkeepingExportQueries.usePaginateBatches, - infinite: BookkeepingExportQueries.usePaginateBatchesInfinite, - filters: { - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDtoSchema, - options: { - inputs: { - createdDate: true, - status: true, - format: true, - createdBy: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BookkeepingExportModels.BookkeepingExportBatchPreviewDtoSchema, - options: { - columns: { - id: true, - format: true, - status: true, - totalInvoiceCount: true, - exportedInvoiceCount: true, - createdBy: true, - createdAt: true, - exportedAt: true, - revertedAt: true, - files: true, - }, - sortable: BookkeepingExportModels.PaginateBatchesOrderParamEnumSchema, - }, -}), - }, - read: { - acl: BookkeepingExportAcl.canUseGetBatch, - schema: BookkeepingExportModels.BookkeepingExportBatchDetailsDtoSchema, - query: BookkeepingExportQueries.useGetBatch, - }, - create: { - acl: BookkeepingExportAcl.canUseCreateBatch, - schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, - mutation: BookkeepingExportQueries.useCreateBatch, - inputDefs: dynamicInputs({ - schema: BookkeepingExportModels.CreateBookkeepingExportBatchRequestDtoSchema, - options: { - inputs: { - format: true, - invoiceFilters: true, - }, - }, -}) - }, - update: { - acl: BookkeepingExportAcl.canUseUpdateBatchFormat, - schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, - mutation: BookkeepingExportQueries.useUpdateBatchFormat, - inputDefs: dynamicInputs({ - schema: BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDtoSchema, - options: { - inputs: { - format: true, - }, - }, -}) - }, -}; - -export const itemsConfig = { - meta: { - title: "Items", - }, - readAll: { - acl: BookkeepingExportAcl.canUsePaginateBatchItems, - schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, - paginated: BookkeepingExportQueries.usePaginateBatchItems, - infinite: BookkeepingExportQueries.usePaginateBatchItemsInfinite, - filters: { - schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BookkeepingExportModels.BookkeepingExportItemDetailFilterDtoSchema, - options: { - inputs: { - status: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BookkeepingExportModels.BookkeepingExportItemDetailDtoSchema, - options: { - columns: { - id: true, - invoiceId: true, - status: true, - includedInExport: true, - validationIssues: true, - invoice: true, - receiver: true, - comments: true, - }, - sortable: BookkeepingExportModels.PaginateBatchItemsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.models.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.models.ts deleted file mode 100644 index 4cdb0f1..0000000 --- a/test/generated/next/bookkeepingExport/bookkeepingExport.models.ts +++ /dev/null @@ -1,293 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BookkeepingExportModels { -/** - * BookkeepingExportFormatEnumSchema - * @type { enum } - */ -export const BookkeepingExportFormatEnumSchema = z.enum(["Bmd", "BmdWithoutCost", "BmdHamburg", "Abra", "Pantheon"]); -export type BookkeepingExportFormatEnum = z.infer; -export const BookkeepingExportFormatEnum = BookkeepingExportFormatEnumSchema.enum; - -/** - * CreateBookkeepingExportBatchRequestDtoSchema - * @type { object } - * @property { BookkeepingExportFormatEnum } format - * @property { CommonModels.OfficeInvoiceFilterDto } invoiceFilters - */ -export const CreateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema.nullish(), invoiceFilters: CommonModels.OfficeInvoiceFilterDtoSchema }); -export type CreateBookkeepingExportBatchRequestDto = z.infer; - -/** - * BookkeepingExportFileTypeEnumSchema - * @type { enum } - */ -export const BookkeepingExportFileTypeEnumSchema = z.enum(["Invoices", "BusinessPartners", "Report", "AbraAddressBook", "AbraIssuedInvoices", "AbraIssuedInvoiceItems", "AbraReceivedInvoices", "AbraReceivedInvoiceItems", "PantheonInvoicesOutgoingEur", "PantheonInvoicesOutgoingUsd", "PantheonInvoicesIncomingEur", "PantheonInvoicesIncomingUsd", "PantheonCostCenters"]); -export type BookkeepingExportFileTypeEnum = z.infer; -export const BookkeepingExportFileTypeEnum = BookkeepingExportFileTypeEnumSchema.enum; - -/** - * BookkeepingExportFileDtoSchema - * @type { object } - * @property { BookkeepingExportFileTypeEnum } variant - * @property { string } downloadUrl - * @property { string } fileName - */ -export const BookkeepingExportFileDtoSchema = z.object({ variant: BookkeepingExportFileTypeEnumSchema, downloadUrl: z.string().nullable(), fileName: z.string() }); -export type BookkeepingExportFileDto = z.infer; - -/** - * BookkeepingExportBatchStatusEnumSchema - * @type { enum } - */ -export const BookkeepingExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Reverted", "Failed"]); -export type BookkeepingExportBatchStatusEnum = z.infer; -export const BookkeepingExportBatchStatusEnum = BookkeepingExportBatchStatusEnumSchema.enum; - -/** - * BookkeepingExportBatchSummaryDtoSchema - * @type { object } - * @property { number } totalCount - * @property { number } needsReviewCount - * @property { number } readyForExportCount - * @property { number } excludedCount - * @property { object } invoiceNumberRange - * @property { string } invoiceNumberRange.from - * @property { string } invoiceNumberRange.to - * @property { object } dateRange - * @property { string } dateRange.from - * @property { string } dateRange.to - */ -export const BookkeepingExportBatchSummaryDtoSchema = z.object({ totalCount: z.number(), needsReviewCount: z.number(), readyForExportCount: z.number(), excludedCount: z.number(), invoiceNumberRange: z.object({ from: z.string(), to: z.string() }).nullish(), dateRange: z.object({ from: z.iso.datetime({ offset: true }), to: z.iso.datetime({ offset: true }) }).nullish() }); -export type BookkeepingExportBatchSummaryDto = z.infer; - -/** - * BookkeepingExportBatchDetailsDtoSchema - * @type { object } - * @property { string } id - * @property { BookkeepingExportFormatEnum } format - * @property { BookkeepingExportBatchStatusEnum } status - * @property { number } totalInvoiceCount - * @property { number } exportedInvoiceCount - * @property { object } createdBy - * @property { string } createdBy.id - * @property { string } createdBy.fullName - * @property { string } createdBy.email - * @property { string } createdAt - * @property { string } exportedAt - * @property { string } revertedAt - * @property { object } revertedBy - * @property { string } revertedBy.id - * @property { string } revertedBy.fullName - * @property { string } revertedBy.email - * @property { BookkeepingExportBatchSummaryDto } summary - * @property { BookkeepingExportFileDto[] } files - */ -export const BookkeepingExportBatchDetailsDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), revertedBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }).nullish(), summary: BookkeepingExportBatchSummaryDtoSchema, files: z.array(BookkeepingExportFileDtoSchema).nullish() }); -export type BookkeepingExportBatchDetailsDto = z.infer; - -/** - * UpdateBookkeepingExportBatchRequestDtoSchema - * @type { object } - * @property { BookkeepingExportFormatEnum } format - */ -export const UpdateBookkeepingExportBatchRequestDtoSchema = z.object({ format: BookkeepingExportFormatEnumSchema }); -export type UpdateBookkeepingExportBatchRequestDto = z.infer; - -/** - * BookkeepingExportBatchPreviewDtoSchema - * @type { object } - * @property { string } id - * @property { BookkeepingExportFormatEnum } format - * @property { BookkeepingExportBatchStatusEnum } status - * @property { number } totalInvoiceCount - * @property { number } exportedInvoiceCount - * @property { object } createdBy - * @property { string } createdBy.id - * @property { string } createdBy.fullName - * @property { string } createdBy.email - * @property { string } createdAt - * @property { string } exportedAt - * @property { string } revertedAt - * @property { BookkeepingExportFileDto[] } files - */ -export const BookkeepingExportBatchPreviewDtoSchema = z.object({ id: z.string(), format: BookkeepingExportFormatEnumSchema, status: BookkeepingExportBatchStatusEnumSchema, totalInvoiceCount: z.number(), exportedInvoiceCount: z.number(), createdBy: z.object({ id: z.string(), fullName: z.string(), email: z.string() }), createdAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish(), revertedAt: z.iso.datetime({ offset: true }).nullish(), files: z.array(BookkeepingExportFileDtoSchema).nullish() }); -export type BookkeepingExportBatchPreviewDto = z.infer; - -/** - * DateRangeSchema - * @type { object } - * @property { string } from - * @property { string } to - */ -export const DateRangeSchema = z.object({ from: z.iso.datetime({ offset: true }).nullable(), to: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type DateRange = z.infer; - -/** - * BookkeepingExportBatchPreviewFilterDtoSchema - * @type { object } - * @property { DateRange } createdDate - * @property { BookkeepingExportBatchStatusEnum[] } status - * @property { BookkeepingExportFormatEnum[] } format - * @property { string[] } createdBy - */ -export const BookkeepingExportBatchPreviewFilterDtoSchema = z.object({ createdDate: DateRangeSchema.nullable(), status: z.array(BookkeepingExportBatchStatusEnumSchema).nullable(), format: z.array(BookkeepingExportFormatEnumSchema).nullable(), createdBy: z.array(z.string()).nullable() }).partial(); -export type BookkeepingExportBatchPreviewFilterDto = z.infer; - -/** - * BookkeepingExportBatchItemStatusEnumSchema - * @type { enum } - */ -export const BookkeepingExportBatchItemStatusEnumSchema = z.enum(["Selected", "NeedsReview", "ReadyForExport", "Exported", "Excluded"]); -export type BookkeepingExportBatchItemStatusEnum = z.infer; -export const BookkeepingExportBatchItemStatusEnum = BookkeepingExportBatchItemStatusEnumSchema.enum; - -/** - * BookkeepingExportItemDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } invoiceId - * @property { BookkeepingExportBatchItemStatusEnum } status - * @property { boolean } includedInExport - * @property { string[] } validationIssues - * @property { object } invoice - * @property { string } invoice.invoiceNumber - * @property { string } invoice.issuingDate - * @property { string } invoice.currency - * @property { number } invoice.amount - * @property { number } invoice.tax - * @property { string[] } invoice.vatRules - * @property { object } receiver - * @property { string } receiver.id - * @property { string } receiver.name - * @property { string } receiver.matchCode - * @property { string } receiver.label - * @property { string } receiver.account - * @property { string } receiver.contraAccount - * @property { string } comments - */ -export const BookkeepingExportItemDetailDtoSchema = z.object({ id: z.string(), invoiceId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), vatRules: z.array(z.string()) }), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }), comments: z.string().nullish() }); -export type BookkeepingExportItemDetailDto = z.infer; - -/** - * BookkeepingExportItemDetailFilterDtoSchema - * @type { object } - * @property { BookkeepingExportBatchItemStatusEnum[] } status - */ -export const BookkeepingExportItemDetailFilterDtoSchema = z.object({ status: z.array(BookkeepingExportBatchItemStatusEnumSchema).nullable() }).partial(); -export type BookkeepingExportItemDetailFilterDto = z.infer; - -/** - * BookkeepingExportVatLineItemDtoSchema - * @type { object } - * @property { string } invoiceId - * @property { string } batchId - * @property { string } batchItemId - * @property { BookkeepingExportBatchItemStatusEnum } status - * @property { boolean } includedInExport - * @property { string[] } validationIssues - * @property { object } invoice - * @property { string } invoice.invoiceNumber - * @property { string } invoice.issuingDate - * @property { string } invoice.currency - * @property { number } invoice.amount - * @property { number } invoice.tax - * @property { string } invoice.comments - * @property { object } receiver - * @property { string } receiver.id - * @property { string } receiver.name - * @property { string } receiver.matchCode - * @property { string } receiver.label - * @property { string } receiver.account - * @property { string } receiver.contraAccount - * @property { number } vatPercentage - * @property { string } vatRule - * @property { number } netAmount - * @property { number } vatAmount - * @property { number } grossAmount - * @property { number } vatAmountInOfficeCurrency - * @property { number } netAmountInOfficeCurrency - * @property { number } grossAmountInOfficeCurrency - * @property { string } officeCurrency - */ -export const BookkeepingExportVatLineItemDtoSchema = z.object({ invoiceId: z.string(), batchId: z.string(), batchItemId: z.string(), status: BookkeepingExportBatchItemStatusEnumSchema, includedInExport: z.boolean(), validationIssues: z.array(z.string()).nullish(), invoice: z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), currency: z.string(), amount: z.number(), tax: z.number(), comments: z.string().nullish() }), receiver: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), account: z.string(), contraAccount: z.string() }), vatPercentage: z.number(), vatRule: z.string(), netAmount: z.number(), vatAmount: z.number(), grossAmount: z.number(), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish(), officeCurrency: z.string() }); -export type BookkeepingExportVatLineItemDto = z.infer; - -/** - * CreateBookkeepingExportBatchResponseDtoSchema - * @type { object } - * @property { string } batchId - */ -export const CreateBookkeepingExportBatchResponseDtoSchema = z.object({ batchId: z.string() }); -export type CreateBookkeepingExportBatchResponseDto = z.infer; - -/** - * UpdateBookkeepingExportBatchItemRequestDtoSchema - * @type { object } - * @property { boolean } includedInExport Whether the item should be included in the export - * @property { string[] } itemIds Min Items: `0` - * @property { boolean } vatOk - * @property { boolean } invoiceOk - */ -export const UpdateBookkeepingExportBatchItemRequestDtoSchema = z.object({ includedInExport: z.boolean().nullish(), itemIds: z.array(z.string()), vatOk: z.boolean().nullish(), invoiceOk: z.boolean().nullish() }); -export type UpdateBookkeepingExportBatchItemRequestDto = z.infer; - -/** - * PaginateBatchesOrderParamEnumSchema - * @type { enum } - */ -export const PaginateBatchesOrderParamEnumSchema = z.enum(["createdAt", "status", "format", "totalInvoiceCount"]); -export type PaginateBatchesOrderParamEnum = z.infer; -export const PaginateBatchesOrderParamEnum = PaginateBatchesOrderParamEnumSchema.enum; - -/** - * PaginateBatchesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookkeepingExportBatchPreviewDto[] } items - */ -export const PaginateBatchesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportBatchPreviewDtoSchema).nullable() }).partial().shape }); -export type PaginateBatchesResponse = z.infer; - -/** - * PaginateBatchItemsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateBatchItemsOrderParamEnumSchema = z.enum(["issuingDate"]); -export type PaginateBatchItemsOrderParamEnum = z.infer; -export const PaginateBatchItemsOrderParamEnum = PaginateBatchItemsOrderParamEnumSchema.enum; - -/** - * PaginateBatchItemsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookkeepingExportItemDetailDto[] } items - */ -export const PaginateBatchItemsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookkeepingExportItemDetailDtoSchema).nullable() }).partial().shape }); -export type PaginateBatchItemsResponse = z.infer; - -/** - * GetVatLineItemsOrderParamEnumSchema - * @type { enum } - */ -export const GetVatLineItemsOrderParamEnumSchema = z.enum(["account", "contraAccount", "issuingDate", "invoiceNumber", "receiver"]); -export type GetVatLineItemsOrderParamEnum = z.infer; -export const GetVatLineItemsOrderParamEnum = GetVatLineItemsOrderParamEnumSchema.enum; - -/** - * GetVatLineItemsResponseSchema - * @type { array } - */ -export const GetVatLineItemsResponseSchema = z.array(BookkeepingExportVatLineItemDtoSchema); -export type GetVatLineItemsResponse = z.infer; - -} diff --git a/test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts b/test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts deleted file mode 100644 index db9e500..0000000 --- a/test/generated/next/bookkeepingExport/bookkeepingExport.queries.ts +++ /dev/null @@ -1,350 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BookkeepingExportAcl } from "./bookkeepingExport.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BookkeepingExportModels } from "./bookkeepingExport.models"; -import { BookkeepingExportApi } from "./bookkeepingExport.api"; - -export namespace BookkeepingExportQueries { -export const moduleName = QueryModule.BookkeepingExport; - -export const keys = { - all: [moduleName] as const, - paginateBatches: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", officeId, limit, order, filter, page, cursor] as const, - paginateBatchesInfinite: (officeId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports", "infinite", officeId, limit, order, filter, cursor] as const, - getBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/:batchId", officeId, batchId] as const, - paginateBatchItems: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", officeId, batchId, limit, order, filter, page, cursor] as const, - paginateBatchItemsInfinite: (officeId: string, batchId: string, limit?: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/items", "infinite", officeId, batchId, limit, order, filter, cursor] as const, - getVatLineItems: (officeId: string, batchId: string, order?: string) => [...keys.all, "/offices/:officeId/bookkeeping-exports/batches/:batchId/vat-line-items", officeId, batchId, order] as const, -}; - -/** - * Mutation `useCreateBatch` - * @summary Create bookkeeping export batch - * @permission Requires `canUseCreateBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { BookkeepingExportModels.CreateBookkeepingExportBatchRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(BookkeepingExportAcl.canUseCreateBatch({ officeId } )); - return BookkeepingExportApi.createBatch(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateBatches` - * @summary List bookkeeping export batches - * @permission Requires `canUsePaginateBatches` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` - * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatches = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateBatches(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateBatchesInfinite - * @summary List bookkeeping export batches - * @permission Requires `canUsePaginateBatches` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, format, totalInvoiceCount. Example: `createdAt` - * @param { BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatchesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportBatchPreviewFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateBatchesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatches({ officeId } )); - return BookkeepingExportApi.paginateBatches(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetBatch` - * @summary Get bookkeeping export batch details - * @permission Requires `canUseGetBatch` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBatch(officeId, batchId), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUseGetBatch({ officeId } )); - return BookkeepingExportApi.getBatch(officeId, batchId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateBatchFormat` - * @summary Update bookkeeping export batch format - * @permission Requires `canUseUpdateBatchFormat` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBatchFormat = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId, data }) => { - checkAcl(BookkeepingExportAcl.canUseUpdateBatchFormat({ officeId } )); - return BookkeepingExportApi.updateBatchFormat(officeId, batchId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, batchId } = variables; - const updateKeys = [keys.getBatch(officeId, batchId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBatchItem` - * @summary Update bookkeeping export batch item inclusion - * @permission Requires `canUseUpdateBatchItem` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { BookkeepingExportModels.UpdateBookkeepingExportBatchItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBatchItem = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId, data }) => { - checkAcl(BookkeepingExportAcl.canUseUpdateBatchItem({ officeId } )); - return BookkeepingExportApi.updateBatchItem(officeId, batchId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateBatchItems` - * @summary List batch items with filters and pagination - * @permission Requires `canUsePaginateBatchItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` - * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatchItems = ({ officeId, batchId, limit, order, filter, page, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); - return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateBatchItemsInfinite - * @summary List batch items with filters and pagination - * @permission Requires `canUsePaginateBatchItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): issuingDate. Example: `issuingDate` - * @param { BookkeepingExportModels.BookkeepingExportItemDetailFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateBatchItemsInfinite = ({ officeId, batchId, limit, order, filter, cursor }: { officeId: string, batchId: string, limit: number, order?: string, filter?: BookkeepingExportModels.BookkeepingExportItemDetailFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateBatchItemsInfinite(officeId, batchId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BookkeepingExportAcl.canUsePaginateBatchItems({ officeId } )); - return BookkeepingExportApi.paginateBatchItems(officeId, batchId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useValidateBookkeepingBatch` - * @summary Validate bookkeeping batch - * @permission Requires `canUseValidateBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useValidateBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseValidateBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.validateBookkeepingBatch(officeId, batchId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportBookkeepingBatch` - * @summary Export bookkeeping batch - * @permission Requires `canUseExportBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useExportBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseExportBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.exportBookkeepingBatch(officeId, batchId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRevertBookkeepingBatch` - * @summary Revert bookkeeping export batch - * @permission Requires `canUseRevertBookkeepingBatch` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useRevertBookkeepingBatch = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(BookkeepingExportAcl.canUseRevertBookkeepingBatch({ officeId } )); - return BookkeepingExportApi.revertBookkeepingBatch(officeId, batchId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetVatLineItems` - * @summary Get VAT line items for bookkeeping export batch - * @permission Requires `canUseGetVatLineItems` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): account, contraAccount, issuingDate, invoiceNumber, receiver. Example: `account` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetVatLineItems = ({ officeId, batchId, order }: { officeId: string, batchId: string, order?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getVatLineItems(officeId, batchId, order), - queryFn: () => { - checkAcl(BookkeepingExportAcl.canUseGetVatLineItems({ officeId } )); - return BookkeepingExportApi.getVatLineItems(officeId, batchId, order) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts deleted file mode 100644 index 1fc9403..0000000 --- a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnerBookkeepingMappingsAcl { -/** - * Use for `useGetBookkeepingMappings` query ability. For global ability, omit the object parameter. - * @description List business partner bookkeeping mappings - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBookkeepingMappings` query - */ -export const canUseGetBookkeepingMappings = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Create business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBookkeepingMapping` mutation - */ -export const canUseCreateBookkeepingMapping = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -/** - * Use for `useUpdateBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Update business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMapping` mutation - */ -export const canUseUpdateBookkeepingMapping = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -/** - * Use for `useUpdateBookkeepingMappingById` mutation ability. For global ability, omit the object parameter. - * @description Update business partner bookkeeping mapping by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBookkeepingMappingById` mutation - */ -export const canUseUpdateBookkeepingMappingById = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Update", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -/** - * Use for `useDeleteBookkeepingMapping` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner bookkeeping mapping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBookkeepingMapping` mutation - */ -export const canUseDeleteBookkeepingMapping = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("BusinessPartnerBookkeeping", object) : "BusinessPartnerBookkeeping" -] as AbilityTuple<"Delete", "BusinessPartnerBookkeeping" | ForcedSubject<"BusinessPartnerBookkeeping"> & { officeId: string, }>; - -} diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts deleted file mode 100644 index 88b624e..0000000 --- a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.api.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; - -export namespace BusinessPartnerBookkeepingMappingsApi { -export const getBookkeepingMappings = (officeId: string, businessPartnerId: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingsResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - - ) -}; -export const createBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto, ) => { - return AppRestClient.post( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDtoSchema, data), - - ) -}; -export const updateBookkeepingMapping = (officeId: string, businessPartnerId: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingResponseSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDtoSchema, data), - - ) -}; -export const updateBookkeepingMappingById = (officeId: string, businessPartnerId: string, id: string, data: BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerBookkeepingMappingsModels.BusinessPartnerBookkeepingMappingResponseDtoSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - ZodExtended.parse(BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDtoSchema, data), - - ) -}; -export const deleteBookkeepingMapping = (officeId: string, businessPartnerId: string, id: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${businessPartnerId}/bookkeeping-mappings/${id}`, - - ) -}; -} diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts deleted file mode 100644 index 2bb5fda..0000000 --- a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.models.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { z } from "zod"; - -export namespace BusinessPartnerBookkeepingMappingsModels { -/** - * BusinessPartnerBookkeepingMappingResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { string } businessPartnerId - * @property { boolean } paysTaxInEurForFactoring - */ -export const BusinessPartnerBookkeepingMappingResponseDtoSchema = z.object({ id: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), currencyNotation: z.string().nullish(), businessPartnerId: z.string(), paysTaxInEurForFactoring: z.boolean().nullish() }); -export type BusinessPartnerBookkeepingMappingResponseDto = z.infer; - -/** - * BusinessPartnerBookkeepingMappingsResponseDtoSchema - * @type { object } - * @property { BusinessPartnerBookkeepingMappingResponseDto[] } bookkeepingMappings - */ -export const BusinessPartnerBookkeepingMappingsResponseDtoSchema = z.object({ bookkeepingMappings: z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema) }); -export type BusinessPartnerBookkeepingMappingsResponseDto = z.infer; - -/** - * UpdateBookkeepingMappingDtoSchema - * @type { object } - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) - */ -export const UpdateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string().nullable(), creditorId: z.string().nullable(), currencyNotation: z.string().nullable(), paysTaxInEurForFactoring: z.boolean().nullable() }).partial(); -export type UpdateBookkeepingMappingDto = z.infer; - -/** - * UpdateBookkeepingMappingRequestDtoSchema - * @type { object } - * @property { UpdateBookkeepingMappingDto[] } bookkeepingMappings - */ -export const UpdateBookkeepingMappingRequestDtoSchema = z.object({ bookkeepingMappings: z.array(UpdateBookkeepingMappingDtoSchema).nullable() }).partial(); -export type UpdateBookkeepingMappingRequestDto = z.infer; - -/** - * CreateBookkeepingMappingDtoSchema - * @type { object } - * @property { string } debtorId - * @property { string } creditorId - * @property { string } currencyNotation - * @property { boolean } paysTaxInEurForFactoring Pays tax in EUR for factoring (Logvin case) - */ -export const CreateBookkeepingMappingDtoSchema = z.object({ debtorId: z.string().nullable(), creditorId: z.string().nullable(), currencyNotation: z.string().nullable(), paysTaxInEurForFactoring: z.boolean().nullable() }).partial(); -export type CreateBookkeepingMappingDto = z.infer; - -/** - * UpdateBookkeepingMappingResponseSchema - * @type { array } - */ -export const UpdateBookkeepingMappingResponseSchema = z.array(BusinessPartnerBookkeepingMappingResponseDtoSchema); -export type UpdateBookkeepingMappingResponse = z.infer; - -} diff --git a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts b/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts deleted file mode 100644 index e176f36..0000000 --- a/test/generated/next/businessPartnerBookkeepingMappings/businessPartnerBookkeepingMappings.queries.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnerBookkeepingMappingsAcl } from "./businessPartnerBookkeepingMappings.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnerBookkeepingMappingsModels } from "./businessPartnerBookkeepingMappings.models"; -import { BusinessPartnerBookkeepingMappingsApi } from "./businessPartnerBookkeepingMappings.api"; - -export namespace BusinessPartnerBookkeepingMappingsQueries { -export const moduleName = QueryModule.BusinessPartnerBookkeepingMappings; - -export const keys = { - all: [moduleName] as const, - getBookkeepingMappings: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/bookkeeping-mappings", officeId, businessPartnerId] as const, -}; - -/** - * Query `useGetBookkeepingMappings` - * @summary Fetch all bookkeeping mappings for a business partner - * @permission Requires `canUseGetBookkeepingMappings` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBookkeepingMappings = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBookkeepingMappings(officeId, businessPartnerId), - queryFn: () => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseGetBookkeepingMappings({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.getBookkeepingMappings(officeId, businessPartnerId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateBookkeepingMapping` - * @summary Create a bookkeeping mapping for a business partner - * @permission Requires `canUseCreateBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.CreateBookkeepingMappingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseCreateBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.createBookkeepingMapping(officeId, businessPartnerId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBookkeepingMapping` - * @summary Update an existing bookkeeping mapping for a business partner - * @permission Requires `canUseUpdateBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMapping(officeId, businessPartnerId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBookkeepingMappingById` - * @summary Update a specific bookkeeping mapping by ID for a business partner - * @permission Requires `canUseUpdateBookkeepingMappingById` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnerBookkeepingMappingsModels.UpdateBookkeepingMappingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBookkeepingMappingById = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, id, data }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseUpdateBookkeepingMappingById({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.updateBookkeepingMappingById(officeId, businessPartnerId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteBookkeepingMapping` - * @summary Delete an existing bookkeeping mapping for a business partner - * @permission Requires `canUseDeleteBookkeepingMapping` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteBookkeepingMapping = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, id }) => { - checkAcl(BusinessPartnerBookkeepingMappingsAcl.canUseDeleteBookkeepingMapping({ officeId } )); - return BusinessPartnerBookkeepingMappingsApi.deleteBookkeepingMapping(officeId, businessPartnerId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.acl.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.acl.ts deleted file mode 100644 index ea3ab69..0000000 --- a/test/generated/next/businessPartnerContacts/businessPartnerContacts.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnerContactsAcl { -/** - * Use for `useGetContacts` query ability. For global ability, omit the object parameter. - * @description List business partner contacts - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetContacts` query - */ -export const canUseGetContacts = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreateContact` mutation ability. For global ability, omit the object parameter. - * @description Create business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateContact` mutation - */ -export const canUseCreateContact = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `usePaginateContactLabels` query ability. For global ability, omit the object parameter. - * @description Paginate business partner contact labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateContactLabels` query - */ -export const canUsePaginateContactLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateContact` mutation ability. For global ability, omit the object parameter. - * @description Update business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateContact` mutation - */ -export const canUseUpdateContact = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useDeleteContact` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner contact - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteContact` mutation - */ -export const canUseDeleteContact = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -} diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts deleted file mode 100644 index 60c1869..0000000 --- a/test/generated/next/businessPartnerContacts/businessPartnerContacts.api.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; - -export namespace BusinessPartnerContactsApi { -export const getContacts = (officeId: string, businessPartnerId: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactListResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - - ) -}; -export const createContact = (officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO, ) => { - return AppRestClient.post( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts`, - ZodExtended.parse(BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTOSchema, data), - - ) -}; -export const paginateContactLabels = (officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnerContactsModels.PaginateContactLabelsResponseSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const updateContact = (contactId: string, officeId: string, businessPartnerId: string, data: BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnerContactsModels.BusinessPartnerContactResponseDTOSchema }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - ZodExtended.parse(BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTOSchema, data), - - ) -}; -export const deleteContact = (contactId: string, officeId: string, businessPartnerId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${businessPartnerId}/contacts/${contactId}`, - - ) -}; -} diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.configs.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.configs.ts deleted file mode 100644 index 9c4ccc5..0000000 --- a/test/generated/next/businessPartnerContacts/businessPartnerContacts.configs.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; -import { BusinessPartnerContactsQueries } from "./businessPartnerContacts.queries"; -import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; - -export namespace BusinessPartnerContactsConfigs { -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: BusinessPartnerContactsAcl.canUsePaginateContactLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: BusinessPartnerContactsQueries.usePaginateContactLabels, - infinite: BusinessPartnerContactsQueries.usePaginateContactLabelsInfinite, - filters: { - schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnerContactsModels.BusinessPartnerContactFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: BusinessPartnerContactsModels.PaginateContactLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts deleted file mode 100644 index c9b784b..0000000 --- a/test/generated/next/businessPartnerContacts/businessPartnerContacts.models.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BusinessPartnerContactsModels { -/** - * BusinessPartnerContactRoleEnumSchema - * @type { enum } - */ -export const BusinessPartnerContactRoleEnumSchema = z.enum(["General", "CommercialManager", "SystemEngineer", "TechnicalEngineer", "Logistics", "Operations", "Sales", "Accounting", "Invoice", "Dunnings", "Reclamations", "Management"]); -export type BusinessPartnerContactRoleEnum = z.infer; -export const BusinessPartnerContactRoleEnum = BusinessPartnerContactRoleEnumSchema.enum; - -/** - * BusinessPartnerContactResponseDTOSchema - * @type { object } - * @property { string } id Contact ID - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ -export const BusinessPartnerContactResponseDTOSchema = z.object({ id: z.string(), role: BusinessPartnerContactRoleEnumSchema.nullish(), name: z.string().nullish(), email: z.string().nullish(), phone: z.string().nullish() }); -export type BusinessPartnerContactResponseDTO = z.infer; - -/** - * BusinessPartnerContactListResponseDTOSchema - * @type { object } - * @property { BusinessPartnerContactResponseDTO[] } contacts List of contacts - */ -export const BusinessPartnerContactListResponseDTOSchema = z.object({ contacts: z.array(BusinessPartnerContactResponseDTOSchema) }); -export type BusinessPartnerContactListResponseDTO = z.infer; - -/** - * CreateBusinessPartnerContactRequestDTOSchema - * @type { object } - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ -export const CreateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema.nullable(), name: z.string().nullable(), email: z.string().nullable(), phone: z.string().nullable() }).partial(); -export type CreateBusinessPartnerContactRequestDTO = z.infer; - -/** - * UpdateBusinessPartnerContactRequestDTOSchema - * @type { object } - * @property { BusinessPartnerContactRoleEnum } role - * @property { string } name Contact name - * @property { string } email Contact email - * @property { string } phone Contact phone - */ -export const UpdateBusinessPartnerContactRequestDTOSchema = z.object({ role: BusinessPartnerContactRoleEnumSchema.nullable(), name: z.string().nullable(), email: z.string().nullable(), phone: z.string().nullable() }).partial(); -export type UpdateBusinessPartnerContactRequestDTO = z.infer; - -/** - * BusinessPartnerContactFilterDtoSchema - * @type { object } - * @property { string } search Search by name, email, or phone - */ -export const BusinessPartnerContactFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type BusinessPartnerContactFilterDto = z.infer; - -/** - * PaginateContactLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateContactLabelsOrderParamEnumSchema = z.enum(["name", "role", "email", "createdAt", "updatedAt"]); -export type PaginateContactLabelsOrderParamEnum = z.infer; -export const PaginateContactLabelsOrderParamEnum = PaginateContactLabelsOrderParamEnumSchema.enum; - -/** - * PaginateContactLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateContactLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PaginateContactLabelsResponse = z.infer; - -} diff --git a/test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts b/test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts deleted file mode 100644 index 8941f35..0000000 --- a/test/generated/next/businessPartnerContacts/businessPartnerContacts.queries.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnerContactsAcl } from "./businessPartnerContacts.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnerContactsModels } from "./businessPartnerContacts.models"; -import { BusinessPartnerContactsApi } from "./businessPartnerContacts.api"; - -export namespace BusinessPartnerContactsQueries { -export const moduleName = QueryModule.BusinessPartnerContacts; - -export const keys = { - all: [moduleName] as const, - getContacts: (officeId: string, businessPartnerId: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts", officeId, businessPartnerId] as const, - paginateContactLabels: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", officeId, businessPartnerId, limit, order, filter, page, cursor] as const, - paginateContactLabelsInfinite: (officeId: string, businessPartnerId: string, limit?: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/:businessPartnerId/contacts/labels/paginate", "infinite", officeId, businessPartnerId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useGetContacts` - * @summary Get all contacts for a business partner - * @permission Requires `canUseGetContacts` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetContacts = ({ officeId, businessPartnerId }: { officeId: string, businessPartnerId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getContacts(officeId, businessPartnerId), - queryFn: () => { - checkAcl(BusinessPartnerContactsAcl.canUseGetContacts({ officeId } )); - return BusinessPartnerContactsApi.getContacts(officeId, businessPartnerId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateContact` - * @summary Create a new contact for a business partner - * @permission Requires `canUseCreateContact` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerContactsModels.CreateBusinessPartnerContactRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateContact = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerContactsAcl.canUseCreateContact({ officeId } )); - return BusinessPartnerContactsApi.createContact(officeId, businessPartnerId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateContactLabels` - * @summary Paginate business partner contact labels (id and name only) - * @permission Requires `canUsePaginateContactLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` - * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateContactLabels = ({ officeId, businessPartnerId, limit, order, filter, page, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); - return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateContactLabelsInfinite - * @summary Paginate business partner contact labels (id and name only) - * @permission Requires `canUsePaginateContactLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.businessPartnerId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, role, email, createdAt, updatedAt. Example: `name` - * @param { BusinessPartnerContactsModels.BusinessPartnerContactFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateContactLabelsInfinite = ({ officeId, businessPartnerId, limit, order, filter, cursor }: { officeId: string, businessPartnerId: string, limit: number, order?: string, filter?: BusinessPartnerContactsModels.BusinessPartnerContactFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateContactLabelsInfinite(officeId, businessPartnerId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnerContactsAcl.canUsePaginateContactLabels({ officeId } )); - return BusinessPartnerContactsApi.paginateContactLabels(officeId, businessPartnerId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useUpdateContact` - * @summary Update a business partner contact - * @permission Requires `canUseUpdateContact` ability - * @param { string } mutation.contactId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { BusinessPartnerContactsModels.UpdateBusinessPartnerContactRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateContact = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ contactId, officeId, businessPartnerId, data }) => { - checkAcl(BusinessPartnerContactsAcl.canUseUpdateContact({ officeId } )); - return BusinessPartnerContactsApi.updateContact(contactId, officeId, businessPartnerId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteContact` - * @permission Requires `canUseDeleteContact` ability - * @param { string } mutation.contactId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.businessPartnerId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 204, 401] - */ -export const useDeleteContact = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ contactId, officeId, businessPartnerId }) => { - checkAcl(BusinessPartnerContactsAcl.canUseDeleteContact({ officeId } )); - return BusinessPartnerContactsApi.deleteContact(contactId, officeId, businessPartnerId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/businessPartners/businessPartners.acl.ts b/test/generated/next/businessPartners/businessPartners.acl.ts deleted file mode 100644 index a532e2e..0000000 --- a/test/generated/next/businessPartners/businessPartners.acl.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace BusinessPartnersAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List business partners - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Create", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Paginate business partner labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Read business partner details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Archive", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useLock` mutation ability. For global ability, omit the object parameter. - * @description Lock business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLock` mutation - */ -export const canUseLock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUnlock` mutation ability. For global ability, omit the object parameter. - * @description Unlock business partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlock` mutation - */ -export const canUseUnlock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetRemarks` query ability. For global ability, omit the object parameter. - * @description List business partner remarks - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetRemarks` query - */ -export const canUseGetRemarks = ( - object?: { officeId: string, } -) => [ - "ReadRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"ReadRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useCreateRemark` mutation ability. For global ability, omit the object parameter. - * @description Create business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRemark` mutation - */ -export const canUseCreateRemark = ( - object?: { officeId: string, } -) => [ - "CreateRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"CreateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateRemark` mutation ability. For global ability, omit the object parameter. - * @description Update business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRemark` mutation - */ -export const canUseUpdateRemark = ( - object?: { officeId: string, } -) => [ - "UpdateRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"UpdateRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useDeleteRemark` mutation ability. For global ability, omit the object parameter. - * @description Delete business partner remark - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemark` mutation - */ -export const canUseDeleteRemark = ( - object?: { officeId: string, } -) => [ - "DeleteRemark", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"DeleteRemark", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetBasicInfo` query ability. For global ability, omit the object parameter. - * @description Read business partner basic info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBasicInfo` query - */ -export const canUseGetBasicInfo = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateBasicInfo` mutation ability. For global ability, omit the object parameter. - * @description Update business partner basic info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBasicInfo` mutation - */ -export const canUseUpdateBasicInfo = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" -] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; - -/** - * Use for `useCreateSignatureUploadInstructions` mutation ability. For global ability, omit the object parameter. - * @description Create business partner signature upload instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateSignatureUploadInstructions` mutation - */ -export const canUseCreateSignatureUploadInstructions = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartnerBasicTab", object) : "BusinessPartnerBasicTab" -] as AbilityTuple<"Update", "BusinessPartnerBasicTab" | ForcedSubject<"BusinessPartnerBasicTab"> & { officeId: string, }>; - -/** - * Use for `useGetCargoAgentInfo` query ability. For global ability, omit the object parameter. - * @description Read business partner cargo agent info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoAgentInfo` query - */ -export const canUseGetCargoAgentInfo = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateCargoAgent` mutation ability. For global ability, omit the object parameter. - * @description Update business partner cargo agent info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargoAgent` mutation - */ -export const canUseUpdateCargoAgent = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useGetCarrierInformation` query ability. For global ability, omit the object parameter. - * @description Read business partner carrier info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCarrierInformation` query - */ -export const canUseGetCarrierInformation = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Read", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -/** - * Use for `useUpdateCarrier` mutation ability. For global ability, omit the object parameter. - * @description Update business partner carrier info - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCarrier` mutation - */ -export const canUseUpdateCarrier = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("BusinessPartner", object) : "BusinessPartner" -] as AbilityTuple<"Update", "BusinessPartner" | ForcedSubject<"BusinessPartner"> & { officeId: string, }>; - -} diff --git a/test/generated/next/businessPartners/businessPartners.api.ts b/test/generated/next/businessPartners/businessPartners.api.ts deleted file mode 100644 index df8cc83..0000000 --- a/test/generated/next/businessPartners/businessPartners.api.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { BusinessPartnersModels } from "./businessPartners.models"; - -export namespace BusinessPartnersApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnersPaginateResponseSchema }, - `/offices/${officeId}/business-partners`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: BusinessPartnersModels.CreateBusinessPartnerRequestDTO, ) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerResponseDTOSchema }, - `/offices/${officeId}/business-partners`, - ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnersPaginateLabelsResponseSchema }, - `/offices/${officeId}/business-partners/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getById = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}`, - - ) -}; -export const update = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, data), - - ) -}; -export const archive = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/archive`, - - ) -}; -export const unarchive = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/unarchive`, - - ) -}; -export const lock = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/lock`, - - ) -}; -export const unlock = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/unlock`, - - ) -}; -export const getRemarks = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.GetRemarksResponseSchema }, - `/offices/${officeId}/business-partners/${id}/remarks`, - - ) -}; -export const createRemark = (officeId: string, id: string, data: BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO, ) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/remarks`, - ZodExtended.parse(BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTOSchema, data), - - ) -}; -export const updateRemark = (officeId: string, id: string, remarkId: string, data: BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerRemarkResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDtoSchema, data), - - ) -}; -export const deleteRemark = (officeId: string, id: string, remarkId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/business-partners/${id}/remarks/${remarkId}`, - - ) -}; -export const getBasicInfo = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic`, - - ) -}; -export const updateBasicInfo = (officeId: string, id: string, data: BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.BusinessPartnerBasicResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic`, - ZodExtended.parse(BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTOSchema, data), - - ) -}; -export const createSignatureUploadInstructions = (officeId: string, id: string, data: BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO, ) => { - return AppRestClient.post( - { resSchema: BusinessPartnersModels.BusinessPartnerSignatureUploadResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/basic/signature-upload`, - ZodExtended.parse(BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTOSchema, data), - - ) -}; -export const getCargoAgentInfo = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/cargo-agent`, - - ) -}; -export const updateCargoAgent = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCargoAgentDTO, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.CargoAgentResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/cargo-agent`, - ZodExtended.parse(BusinessPartnersModels.UpdateCargoAgentDTOSchema, data), - - ) -}; -export const getCarrierInformation = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/carrier`, - - ) -}; -export const updateCarrier = (officeId: string, id: string, data: BusinessPartnersModels.UpdateCarrierDTO, ) => { - return AppRestClient.patch( - { resSchema: BusinessPartnersModels.CarrierResponseDTOSchema }, - `/offices/${officeId}/business-partners/${id}/carrier`, - ZodExtended.parse(BusinessPartnersModels.UpdateCarrierDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/businessPartners/businessPartners.configs.ts b/test/generated/next/businessPartners/businessPartners.configs.ts deleted file mode 100644 index 971a761..0000000 --- a/test/generated/next/businessPartners/businessPartners.configs.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { BusinessPartnersModels } from "./businessPartners.models"; -import { BusinessPartnersQueries } from "./businessPartners.queries"; -import { BusinessPartnersAcl } from "./businessPartners.acl"; - -export namespace BusinessPartnersConfigs { -export const businessPartnersConfig = { - meta: { - title: "Business Partners", - }, - readAll: { - acl: BusinessPartnersAcl.canUsePaginate, - schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, - paginated: BusinessPartnersQueries.usePaginate, - infinite: BusinessPartnersQueries.usePaginateInfinite, - filters: { - schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnersModels.BusinessPartnerFilterDtoSchema, - options: { - inputs: { - search: true, - types: true, - shortName: true, - name: true, - vat: true, - debtorId: true, - creditorId: true, - matchCode: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BusinessPartnersModels.BusinessPartnerListResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - address: true, - types: true, - archived: true, - shortName: true, - vat: true, - debtorId: true, - creditorId: true, - locked: true, - currency: true, - remarks: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: BusinessPartnersModels.BusinessPartnersPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: BusinessPartnersAcl.canUseGetById, - schema: BusinessPartnersModels.BusinessPartnerDetailResponseDTOSchema, - query: BusinessPartnersQueries.useGetById, - }, - create: { - acl: BusinessPartnersAcl.canUseCreate, - schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, - mutation: BusinessPartnersQueries.useCreate, - inputDefs: dynamicInputs({ - schema: BusinessPartnersModels.CreateBusinessPartnerRequestDTOSchema, - options: { - inputs: { - name: true, - secondaryName: true, - types: true, - matchCode: true, - shortName: true, - address: true, - }, - }, -}) - }, - update: { - acl: BusinessPartnersAcl.canUseUpdate, - schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, - mutation: BusinessPartnersQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: BusinessPartnersModels.UpdateBusinessPartnerRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - secondaryName: true, - types: true, - address: true, - blAddress: true, - belongsToId: true, - salesRepId: true, - operationsId: true, - addressIsDifferentForBl: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: BusinessPartnersAcl.canUsePaginateLabels, - schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, - paginated: BusinessPartnersQueries.usePaginateLabels, - infinite: BusinessPartnersQueries.usePaginateLabelsInfinite, - filters: { - schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: BusinessPartnersModels.BusinessPartnerLabelsFilterDtoSchema, - options: { - inputs: { - search: true, - ids: true, - types: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: BusinessPartnersModels.BusinessPartnerPaginatedLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - types: true, - }, - sortable: BusinessPartnersModels.BusinessPartnersPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/businessPartners/businessPartners.models.ts b/test/generated/next/businessPartners/businessPartners.models.ts deleted file mode 100644 index b825ac4..0000000 --- a/test/generated/next/businessPartners/businessPartners.models.ts +++ /dev/null @@ -1,489 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace BusinessPartnersModels { -/** - * RemarkVisibilitySchema - * @type { enum } - */ -export const RemarkVisibilitySchema = z.enum(["internal", "popup"]); -export type RemarkVisibility = z.infer; -export const RemarkVisibility = RemarkVisibilitySchema.enum; - -/** - * RemarkTypeSchema - * @type { enum } - */ -export const RemarkTypeSchema = z.enum(["INFORMATIONAL", "WARNING"]); -export type RemarkType = z.infer; -export const RemarkType = RemarkTypeSchema.enum; - -/** - * BusinessPartnerRemarkResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the remark - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of the remark - */ -export const BusinessPartnerRemarkResponseDTOSchema = z.object({ id: z.string(), visibility: RemarkVisibilitySchema, content: z.string(), type: RemarkTypeSchema }); -export type BusinessPartnerRemarkResponseDTO = z.infer; - -/** - * BusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { string } city City name - * @property { string } isoCode Country code - */ -export const BusinessPartnerAddressDtoSchema = z.object({ street: z.string().nullable(), zip: z.string().nullable(), city: z.string().nullable(), isoCode: z.string().nullable() }).partial(); -export type BusinessPartnerAddressDto = z.infer; - -/** - * BusinessPartnerEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BusinessPartnerEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type BusinessPartnerEmployeeDTO = z.infer; - -/** - * BusinessPartnerListResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - * @property { string } matchCode Match code of the business partner - * @property { BusinessPartnerAddressDto } address Address information - * @property { CommonModels.BusinessPartnerType[] } types List of business partner types - * @property { boolean } archived Archive status - * @property { string } shortName Short name of the business partner - * @property { string } vat VAT number of the business partner - * @property { string } debtorId Debtor ID for the local currency - * @property { string } creditorId Creditor ID for the local currency - * @property { boolean } locked Whether the business partner is locked - * @property { string } currency Currency (invoice currency) - * @property { BusinessPartnerRemarkResponseDTO[] } remarks Remarks for the business partner - * @property { string } createdById ID of the employee who created this business partner - * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this business partner - * @property { string } createdAt Date when the business partner was created - * @property { string } updatedById ID of the employee who last updated this business partner - * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this business partner - * @property { string } updatedAt Date when the business partner was last updated - */ -export const BusinessPartnerListResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), address: BusinessPartnerAddressDtoSchema, types: z.array(CommonModels.BusinessPartnerTypeSchema), archived: z.boolean(), shortName: z.string().nullish(), vat: z.string().nullish(), debtorId: z.string().nullish(), creditorId: z.string().nullish(), locked: z.boolean(), currency: z.string().nullish(), remarks: z.array(BusinessPartnerRemarkResponseDTOSchema), createdById: z.string().nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type BusinessPartnerListResponseDTO = z.infer; - -/** - * BusinessPartnerFilterDtoSchema - * @type { object } - * @property { string } search - * @property { CommonModels.BusinessPartnerType[] } types - * @property { string } shortName - * @property { string } name - * @property { string } vat - * @property { string } debtorId - * @property { string } creditorId - * @property { string } matchCode - * @property { boolean } archived Filter by archived status - */ -export const BusinessPartnerFilterDtoSchema = z.object({ search: z.string().nullable(), types: z.array(CommonModels.BusinessPartnerTypeSchema).nullable(), shortName: z.string().nullable(), name: z.string().nullable(), vat: z.string().nullable(), debtorId: z.string().nullable(), creditorId: z.string().nullable(), matchCode: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type BusinessPartnerFilterDto = z.infer; - -/** - * BusinessPartnerPaginatedLabelResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } label Label of the business partner - * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types - */ -export const BusinessPartnerPaginatedLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema) }); -export type BusinessPartnerPaginatedLabelResponseDTO = z.infer; - -/** - * BusinessPartnerLabelsFilterDtoSchema - * @type { object } - * @property { string } search - * @property { string[] } ids Business partner ids to filter by - * @property { CommonModels.BusinessPartnerType[] } types Array of business partner types to filter by - * @property { boolean } archived Filter by archived status - */ -export const BusinessPartnerLabelsFilterDtoSchema = z.object({ search: z.string().nullable(), ids: z.array(z.string()).nullable(), types: z.array(CommonModels.BusinessPartnerTypeSchema).nullable(), archived: z.boolean().nullable() }).partial(); -export type BusinessPartnerLabelsFilterDto = z.infer; - -/** - * CreateBusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } district - * @property { string } countryId - */ -export const CreateBusinessPartnerAddressDtoSchema = z.object({ street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), district: z.string().nullable(), countryId: z.string().nullable() }).partial(); -export type CreateBusinessPartnerAddressDto = z.infer; - -/** - * CreateBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } name Full name of the business partner. Min Length: `3` - * @property { string } secondaryName Full name of the business partner. Min Length: `3` - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { string } matchCode Unique identifier code - * @property { string } shortName Short name for the business partner - * @property { CreateBusinessPartnerAddressDto } address Address information - */ -export const CreateBusinessPartnerRequestDTOSchema = z.object({ name: z.string().min(3), secondaryName: z.string().min(3).nullish(), types: z.array(CommonModels.BusinessPartnerTypeSchema), matchCode: z.string().nullish(), shortName: z.string().nullish(), address: CreateBusinessPartnerAddressDtoSchema.nullish() }); -export type CreateBusinessPartnerRequestDTO = z.infer; - -/** - * BusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { string } rootFolderId Root folder identifier associated with this business partner - */ -export const BusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema), rootFolderId: z.string().nullish() }); -export type BusinessPartnerResponseDTO = z.infer; - -/** - * BusinessPartnerLabelResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } name Name of the business partner - */ -export const BusinessPartnerLabelResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type BusinessPartnerLabelResponseDto = z.infer; - -/** - * ContactResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the contact - * @property { string } name Name of the contact - */ -export const ContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ContactResponseDTO = z.infer; - -/** - * BusinessPartnerDetailResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the business partner - * @property { string } createdById ID of the employee who created this record - * @property { BusinessPartnerEmployeeDTO } createdBy Employee who created this record - * @property { string } createdAt Creation timestamp - * @property { string } updatedById ID of the employee who last updated this record - * @property { BusinessPartnerEmployeeDTO } updatedBy Employee who last updated this record - * @property { string } updatedAt Last update timestamp - * @property { string } matchCode Match code of the business partner - * @property { string } shortName Short name - * @property { string } name Full name - * @property { string } secondaryName Secondary name - * @property { CommonModels.BusinessPartnerType[] } types List of business partner types - * @property { boolean } archived Archived status - * @property { CommonModels.BusinessPartnerAddressResponseDTO } address Main address information - * @property { CommonModels.BusinessPartnerAddressResponseDTO } blAddress BL address information - * @property { BusinessPartnerLabelResponseDto[] } similar Similar named business partners - * @property { boolean } locked - * @property { boolean } addressIsDifferentForBl - * @property { string } lockedById Unique identifier of the employee who locked the business partner - * @property { string } lockedByName - * @property { string } lockedAt Unique identifier of the employee who locked the business partner - * @property { ContactResponseDTO } belongsTo Parent business partner - * @property { ContactResponseDTO } salesRep Sales representative - * @property { ContactResponseDTO } operations Operations contact - */ -export const BusinessPartnerDetailResponseDTOSchema = z.object({ id: z.string(), createdById: z.string().nullish(), createdBy: BusinessPartnerEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: BusinessPartnerEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), matchCode: z.string(), shortName: z.string(), name: z.string(), secondaryName: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema), archived: z.boolean(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema, blAddress: CommonModels.BusinessPartnerAddressResponseDTOSchema, similar: z.array(BusinessPartnerLabelResponseDtoSchema).nullish(), locked: z.boolean(), addressIsDifferentForBl: z.boolean(), lockedById: z.string().nullish(), lockedByName: z.string().nullish(), lockedAt: z.iso.datetime({ offset: true }).nullish(), belongsTo: ContactResponseDTOSchema, salesRep: ContactResponseDTOSchema, operations: ContactResponseDTOSchema }); -export type BusinessPartnerDetailResponseDTO = z.infer; - -/** - * UpdateBusinessPartnerAddressDtoSchema - * @type { object } - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } district - * @property { string } countryId - */ -export const UpdateBusinessPartnerAddressDtoSchema = z.object({ street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), district: z.string().nullable(), countryId: z.string().nullable() }).partial(); -export type UpdateBusinessPartnerAddressDto = z.infer; - -/** - * UpdateBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code - * @property { string } shortName Updated short name - * @property { string } name Updated full name - * @property { string } secondaryName Updated secondary name - * @property { CommonModels.BusinessPartnerType[] } types Types/roles of the business partner - * @property { UpdateBusinessPartnerAddressDto } address Address information - * @property { UpdateBusinessPartnerAddressDto } blAddress Bl address information - * @property { string } belongsToId Parent business partner - * @property { string } salesRepId Sales representative - * @property { string } operationsId Operations contact - * @property { boolean } addressIsDifferentForBl Different address for BL - */ -export const UpdateBusinessPartnerRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), name: z.string().nullable(), secondaryName: z.string().nullable(), types: z.array(CommonModels.BusinessPartnerTypeSchema).nullable(), address: UpdateBusinessPartnerAddressDtoSchema.nullable(), blAddress: UpdateBusinessPartnerAddressDtoSchema.nullable(), belongsToId: z.string().nullable(), salesRepId: z.string().nullable(), operationsId: z.string().nullable(), addressIsDifferentForBl: z.boolean().nullable() }).partial(); -export type UpdateBusinessPartnerRequestDTO = z.infer; - -/** - * CreateBusinessPartnerRemarkRequestDTOSchema - * @type { object } - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of remark - */ -export const CreateBusinessPartnerRemarkRequestDTOSchema = z.object({ visibility: RemarkVisibilitySchema, content: z.string(), type: RemarkTypeSchema }); -export type CreateBusinessPartnerRemarkRequestDTO = z.infer; - -/** - * UpdateBusinessPartnerRemarkRequestDtoSchema - * @type { object } - * @property { RemarkVisibility } visibility Visibility level of the remark - * @property { string } content Content of the remark - * @property { RemarkType } type Type of remark - */ -export const UpdateBusinessPartnerRemarkRequestDtoSchema = z.object({ visibility: RemarkVisibilitySchema.nullable(), content: z.string().nullable(), type: RemarkTypeSchema.nullable() }).partial(); -export type UpdateBusinessPartnerRemarkRequestDto = z.infer; - -/** - * AccountTypeEnumSchema - * @type { enum } - */ -export const AccountTypeEnumSchema = z.enum(["Direct Account", "Logistic Provider / Forwarder", "4PL/NVOCC", "LLP", "Carrier", "Service Provider (other)", "Strategic", "Key Account", "Transactional", "Agent", "Other"]); -export type AccountTypeEnum = z.infer; -export const AccountTypeEnum = AccountTypeEnumSchema.enum; - -/** - * BusinessPartnerAuthorizationSchema - * @type { enum } - */ -export const BusinessPartnerAuthorizationSchema = z.enum(["requiresApproval", "blocked", "regularBusinessPartner"]); -export type BusinessPartnerAuthorization = z.infer; -export const BusinessPartnerAuthorization = BusinessPartnerAuthorizationSchema.enum; - -/** - * BusinessPartnerPaymentTermsResponseDtoSchema - * @type { object } - * @property { string } relativeTo - * @property { number } days Minimum: `0` - */ -export const BusinessPartnerPaymentTermsResponseDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema, days: z.number().gte(0) }); -export type BusinessPartnerPaymentTermsResponseDto = z.infer; - -/** - * BusinessPartnerBankAccountResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BusinessPartnerBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type BusinessPartnerBankAccountResponseDto = z.infer; - -/** - * PartnerNetworkInfoDtoSchema - * @type { object } - * @property { string } id Partner network ID - * @property { string } name Partner network name - */ -export const PartnerNetworkInfoDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type PartnerNetworkInfoDto = z.infer; - -/** - * BusinessPartnerBasicResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Reference to the business partner - * @property { string[] } relationship List of relationships - * @property { AccountTypeEnum } accountType - * @property { string } vat VAT number - * @property { string } legacySystemId Legacy system (move) id - * @property { string } registrationNumber - * @property { string } eori EORI number - * @property { BusinessPartnerAuthorization } authorization Authorization status - * @property { number } creditLimit Credit limit - * @property { string } invoiceLanguage Invoice language - * @property { string } invoiceCurrency Invoice currency - * @property { string } iban IBAN - * @property { string } bankNumber Bank number - * @property { string } bankAccountNumber Bank account number - * @property { BusinessPartnerPaymentTermsResponseDto } termsExport - * @property { BusinessPartnerPaymentTermsResponseDto } termsImport - * @property { CommonModels.EditorContentResponseDto } notes Notes - * @property { string } bankAccountId - * @property { BusinessPartnerBankAccountResponseDto } bankAccount - * @property { PartnerNetworkInfoDto[] } partnerNetworks Partner networks - * @property { string } dunningSystemId - * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem - * @property { string } hblIssuerSigner HBL issuer/signer prefill - * @property { string } signatureFileAttachmentId Signature file attachment ID - * @property { string } signatureFileAttachmentUrl Signed URL for signature file attachment - */ -export const BusinessPartnerBasicResponseDTOSchema = z.object({ businessPartnerId: z.string(), relationship: z.array(z.string()), accountType: AccountTypeEnumSchema.nullish(), vat: z.string(), legacySystemId: z.string().nullish(), registrationNumber: z.string().nullish(), eori: z.string(), authorization: BusinessPartnerAuthorizationSchema.nullable(), creditLimit: z.number(), invoiceLanguage: z.string(), invoiceCurrency: z.string(), iban: z.string(), bankNumber: z.string(), bankAccountNumber: z.string(), termsExport: BusinessPartnerPaymentTermsResponseDtoSchema, termsImport: BusinessPartnerPaymentTermsResponseDtoSchema, notes: CommonModels.EditorContentResponseDtoSchema.nullish(), bankAccountId: z.string().nullish(), bankAccount: BusinessPartnerBankAccountResponseDtoSchema.nullish(), partnerNetworks: z.array(PartnerNetworkInfoDtoSchema), dunningSystemId: z.string().nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), hblIssuerSigner: z.string(), signatureFileAttachmentId: z.string(), signatureFileAttachmentUrl: z.string().nullish() }); -export type BusinessPartnerBasicResponseDTO = z.infer; - -/** - * UpdateBusinessPartnerPaymentTermsDtoSchema - * @type { object } - * @property { string } relativeTo - * @property { number } days Minimum: `0` - */ -export const UpdateBusinessPartnerPaymentTermsDtoSchema = z.object({ relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema.nullable(), days: z.number().gte(0).nullable() }).partial(); -export type UpdateBusinessPartnerPaymentTermsDto = z.infer; - -/** - * UpdateBusinessPartnerBasicRequestDTOSchema - * @type { object } - * @property { string[] } relationship Updated relationships - * @property { string } vat Updated VAT number - * @property { string } eori Updated EORI number - * @property { AccountTypeEnum } accountType - * @property { BusinessPartnerAuthorization } authorization Updated authorization status - * @property { number } creditLimit Updated credit limit - * @property { string } invoiceLanguage Invoice language - * @property { string } invoiceCurrency Invoice currency - * @property { string } iban IBAN - * @property { string } bankNumber Bank number - * @property { string } bankAccountNumber Bank account number - * @property { string } legacySystemId Legacy system (move) id - * @property { string } registrationNumber - * @property { UpdateBusinessPartnerPaymentTermsDto } termsExport - * @property { UpdateBusinessPartnerPaymentTermsDto } termsImport - * @property { CommonModels.EditorContentUpdateDto } notes Notes - * @property { string } bankAccountId - * @property { string[] } partnerNetworkIds Partner network IDs - * @property { string } dunningSystemId Dunning system ID - * @property { string } hblIssuerSigner HBL issuer/signer prefill - * @property { string } signatureFileAttachmentId Signature file attachment ID - */ -export const UpdateBusinessPartnerBasicRequestDTOSchema = z.object({ relationship: z.array(z.string()).nullable(), vat: z.string().nullable(), eori: z.string().nullable(), accountType: AccountTypeEnumSchema.nullable(), authorization: BusinessPartnerAuthorizationSchema.nullable(), creditLimit: z.number().nullable(), invoiceLanguage: z.string().nullable(), invoiceCurrency: z.string().nullable(), iban: z.string().nullable(), bankNumber: z.string().nullable(), bankAccountNumber: z.string().nullable(), legacySystemId: z.string().nullable(), registrationNumber: z.string().nullable(), termsExport: UpdateBusinessPartnerPaymentTermsDtoSchema.nullable(), termsImport: UpdateBusinessPartnerPaymentTermsDtoSchema.nullable(), notes: CommonModels.EditorContentUpdateDtoSchema.nullable(), bankAccountId: z.string().nullable(), partnerNetworkIds: z.array(z.string()).nullable(), dunningSystemId: z.string().nullable(), hblIssuerSigner: z.string().nullable(), signatureFileAttachmentId: z.string().nullable() }).partial(); -export type UpdateBusinessPartnerBasicRequestDTO = z.infer; - -/** - * BusinessPartnerSignatureUploadRequestDTOSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType Mime type - * @property { number } fileSize File size in bytes. Minimum: `1` - */ -export const BusinessPartnerSignatureUploadRequestDTOSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number().gte(1) }); -export type BusinessPartnerSignatureUploadRequestDTO = z.infer; - -/** - * BusinessPartnerSignatureUploadResponseDTOSchema - * @type { object } - * @property { string } mediaId Media ID for the uploaded signature - * @property { string } method HTTP method to use for upload - * @property { string } url URL to upload the file to - */ -export const BusinessPartnerSignatureUploadResponseDTOSchema = z.object({ mediaId: z.string(), method: z.string(), url: z.string() }); -export type BusinessPartnerSignatureUploadResponseDTO = z.infer; - -/** - * CargoAgentResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Business partner identifier - * @property { string } portOfHamburgAccountNumber Port of Hamburg account number - * @property { string } iataAccountNumber IATA account number - * @property { string } regulatedAgentCode Regulated agent code - */ -export const CargoAgentResponseDTOSchema = z.object({ businessPartnerId: z.string(), portOfHamburgAccountNumber: z.string(), iataAccountNumber: z.string(), regulatedAgentCode: z.string() }); -export type CargoAgentResponseDTO = z.infer; - -/** - * UpdateCargoAgentDTOSchema - * @type { object } - * @property { string } portOfHamburgAccountNumber Hamburg port account number - * @property { string } iataAccountNumber IATA account number - * @property { string } regulatedAgentCode Regulated agent code - */ -export const UpdateCargoAgentDTOSchema = z.object({ portOfHamburgAccountNumber: z.string().nullable(), iataAccountNumber: z.string().nullable(), regulatedAgentCode: z.string().nullable() }).partial(); -export type UpdateCargoAgentDTO = z.infer; - -/** - * CarrierResponseDTOSchema - * @type { object } - * @property { string } businessPartnerId Business partner identifier - * @property { string } scac SCAC code - * @property { string } iataAirlinePrefix IATA airline prefix - * @property { string } iataCode IATA code - * @property { string } registrationAddress Registration address - * @property { string } masterBlSuffix Master BL suffix - * @property { string } houseBlSuffix House BL suffix - * @property { string } airWaybillSuffix Air waybill suffix - * @property { string } cargoManifestSuffix Cargo manifest suffix - * @property { string } fundReportSuffix Fund report suffix - * @property { string } invoiceSuffix Invoice suffix - */ -export const CarrierResponseDTOSchema = z.object({ businessPartnerId: z.string(), scac: z.string(), iataAirlinePrefix: z.string(), iataCode: z.string(), registrationAddress: z.string(), masterBlSuffix: z.string(), houseBlSuffix: z.string(), airWaybillSuffix: z.string(), cargoManifestSuffix: z.string(), fundReportSuffix: z.string(), invoiceSuffix: z.string() }); -export type CarrierResponseDTO = z.infer; - -/** - * UpdateCarrierDTOSchema - * @type { object } - * @property { string } scac SCAC code - * @property { string } iataAirlinePrefix IATA airline prefix - * @property { string } iataCode IATA code - * @property { string } registrationAddress Registration address - * @property { string } masterBlSuffix Master BL suffix - * @property { string } houseBlSuffix House BL suffix - * @property { string } airWaybillSuffix Air waybill suffix - * @property { string } cargoManifestSuffix Cargo manifest suffix - * @property { string } fundReportSuffix Fund report suffix - * @property { string } invoiceSuffix Invoice suffix - */ -export const UpdateCarrierDTOSchema = z.object({ scac: z.string().nullable(), iataAirlinePrefix: z.string().nullable(), iataCode: z.string().nullable(), registrationAddress: z.string().nullable(), masterBlSuffix: z.string().nullable(), houseBlSuffix: z.string().nullable(), airWaybillSuffix: z.string().nullable(), cargoManifestSuffix: z.string().nullable(), fundReportSuffix: z.string().nullable(), invoiceSuffix: z.string().nullable() }).partial(); -export type UpdateCarrierDTO = z.infer; - -/** - * BusinessPartnersPaginateOrderParamEnumSchema - * @type { enum } - */ -export const BusinessPartnersPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); -export type BusinessPartnersPaginateOrderParamEnum = z.infer; -export const BusinessPartnersPaginateOrderParamEnum = BusinessPartnersPaginateOrderParamEnumSchema.enum; - -/** - * BusinessPartnersPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BusinessPartnerListResponseDTO[] } items - */ -export const BusinessPartnersPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerListResponseDTOSchema).nullable() }).partial().shape }); -export type BusinessPartnersPaginateResponse = z.infer; - -/** - * BusinessPartnersPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const BusinessPartnersPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "vat", "shortName", "address", "locked", "currency", "archived"]); -export type BusinessPartnersPaginateLabelsOrderParamEnum = z.infer; -export const BusinessPartnersPaginateLabelsOrderParamEnum = BusinessPartnersPaginateLabelsOrderParamEnumSchema.enum; - -/** - * BusinessPartnersPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BusinessPartnerPaginatedLabelResponseDTO[] } items - */ -export const BusinessPartnersPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BusinessPartnerPaginatedLabelResponseDTOSchema).nullable() }).partial().shape }); -export type BusinessPartnersPaginateLabelsResponse = z.infer; - -/** - * GetRemarksResponseSchema - * @type { array } - */ -export const GetRemarksResponseSchema = z.array(BusinessPartnerRemarkResponseDTOSchema); -export type GetRemarksResponse = z.infer; - -} diff --git a/test/generated/next/businessPartners/businessPartners.queries.ts b/test/generated/next/businessPartners/businessPartners.queries.ts deleted file mode 100644 index 3050547..0000000 --- a/test/generated/next/businessPartners/businessPartners.queries.ts +++ /dev/null @@ -1,642 +0,0 @@ -import axios, { } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { BusinessPartnersAcl } from "./businessPartners.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { BusinessPartnersModels } from "./businessPartners.models"; -import { BusinessPartnersApi } from "./businessPartners.api"; - -export namespace BusinessPartnersQueries { -export const moduleName = QueryModule.BusinessPartners; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/business-partners/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - getById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id", officeId, id] as const, - getRemarks: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/remarks", officeId, id] as const, - getBasicInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/basic", officeId, id] as const, - getCargoAgentInfo: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/cargo-agent", officeId, id] as const, - getCarrierInformation: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/business-partners/:id/carrier", officeId, id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate business partners - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate business partners - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnersAcl.canUsePaginate({ officeId } )); - return BusinessPartnersApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create business partner - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { BusinessPartnersModels.CreateBusinessPartnerRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(BusinessPartnersAcl.canUseCreate({ officeId } )); - return BusinessPartnersApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy, vat, shortName, address, locked, currency, archived. Example: `name` - * @param { BusinessPartnersModels.BusinessPartnerLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: BusinessPartnersModels.BusinessPartnerLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(BusinessPartnersAcl.canUsePaginateLabels({ officeId } )); - return BusinessPartnersApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetById` - * @summary Get business partner by ID - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetById({ officeId } )); - return BusinessPartnersApi.getById(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update business partner - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdate({ officeId } )); - return BusinessPartnersApi.update(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive business partner - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseArchive({ officeId } )); - return BusinessPartnersApi.archive(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive business partner - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseUnarchive({ officeId } )); - return BusinessPartnersApi.unarchive(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useLock` - * @summary Lock business partner - * @permission Requires `canUseLock` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useLock = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseLock({ officeId } )); - return BusinessPartnersApi.lock(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnlock` - * @summary Unlock business partner - * @permission Requires `canUseUnlock` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnlock = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(BusinessPartnersAcl.canUseUnlock({ officeId } )); - return BusinessPartnersApi.unlock(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetRemarks` - * @summary Get business partner remarks - * @permission Requires `canUseGetRemarks` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetRemarks = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getRemarks(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetRemarks({ officeId } )); - return BusinessPartnersApi.getRemarks(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useCreateRemark` - * @summary Create business partner remark - * @permission Requires `canUseCreateRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.CreateBusinessPartnerRemarkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseCreateRemark({ officeId } )); - return BusinessPartnersApi.createRemark(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateRemark` - * @permission Requires `canUseUpdateRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { string } mutation.remarkId Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerRemarkRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, remarkId, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateRemark({ officeId } )); - return BusinessPartnersApi.updateRemark(officeId, id, remarkId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRemark` - * @summary Delete business partner remark - * @permission Requires `canUseDeleteRemark` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { string } mutation.remarkId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteRemark = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, remarkId }) => { - checkAcl(BusinessPartnersAcl.canUseDeleteRemark({ officeId } )); - return BusinessPartnersApi.deleteRemark(officeId, id, remarkId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetBasicInfo` - * @summary Get business partner basic info - * @permission Requires `canUseGetBasicInfo` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBasicInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBasicInfo(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetBasicInfo({ officeId } )); - return BusinessPartnersApi.getBasicInfo(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateBasicInfo` - * @summary Update business partner basic info - * @permission Requires `canUseUpdateBasicInfo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateBusinessPartnerBasicRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBasicInfo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateBasicInfo({ officeId } )); - return BusinessPartnersApi.updateBasicInfo(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getBasicInfo(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateSignatureUploadInstructions` - * @summary Create upload instructions for business partner signature - * @permission Requires `canUseCreateSignatureUploadInstructions` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.BusinessPartnerSignatureUploadRequestDTO } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateSignatureUploadInstructions = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, id, data, file, abortController, onUploadProgress }) => { - checkAcl(BusinessPartnersAcl.canUseCreateSignatureUploadInstructions({ officeId } )); - const uploadInstructions = await BusinessPartnersApi.createSignatureUploadInstructions(officeId, id, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetCargoAgentInfo` - * @summary Get cargo agent information for business partner - * @permission Requires `canUseGetCargoAgentInfo` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoAgentInfo = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoAgentInfo(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetCargoAgentInfo({ officeId } )); - return BusinessPartnersApi.getCargoAgentInfo(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCargoAgent` - * @summary Update cargo agent information for business partner - * @permission Requires `canUseUpdateCargoAgent` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateCargoAgentDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCargoAgent = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateCargoAgent({ officeId } )); - return BusinessPartnersApi.updateCargoAgent(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getCargoAgentInfo(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetCarrierInformation` - * @summary Get carrier information for business partner - * @permission Requires `canUseGetCarrierInformation` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCarrierInformation = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCarrierInformation(officeId, id), - queryFn: () => { - checkAcl(BusinessPartnersAcl.canUseGetCarrierInformation({ officeId } )); - return BusinessPartnersApi.getCarrierInformation(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCarrier` - * @summary Update carrier information for business partner - * @permission Requires `canUseUpdateCarrier` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { BusinessPartnersModels.UpdateCarrierDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCarrier = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(BusinessPartnersAcl.canUseUpdateCarrier({ officeId } )); - return BusinessPartnersApi.updateCarrier(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.getCarrierInformation(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/cargoTypes/cargoTypes.acl.ts b/test/generated/next/cargoTypes/cargoTypes.acl.ts deleted file mode 100644 index 404b05b..0000000 --- a/test/generated/next/cargoTypes/cargoTypes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CargoTypesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "CargoType" -] as AbilityTuple<"Read", "CargoType">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "CargoType" -] as AbilityTuple<"Create", "CargoType">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "CargoType" -] as AbilityTuple<"Read", "CargoType">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "CargoType" -] as AbilityTuple<"Read", "CargoType">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "CargoType" -] as AbilityTuple<"Update", "CargoType">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "CargoType" -] as AbilityTuple<"Archive", "CargoType">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "CargoType" -] as AbilityTuple<"Archive", "CargoType">; - -} diff --git a/test/generated/next/cargoTypes/cargoTypes.api.ts b/test/generated/next/cargoTypes/cargoTypes.api.ts deleted file mode 100644 index 48493ea..0000000 --- a/test/generated/next/cargoTypes/cargoTypes.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CargoTypesModels } from "./cargoTypes.models"; - -export namespace CargoTypesApi { -export const paginate = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypesPaginateResponseSchema }, - `/cargo-types`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CargoTypesModels.CargoTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: CargoTypesModels.CreateCargoTypeRequestDTO, ) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types`, - ZodExtended.parse(CargoTypesModels.CreateCargoTypeRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypesPaginateLabelsResponseSchema }, - `/cargo-types/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CargoTypesModels.CargoTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}`, - - ) -}; -export const update = (id: string, data: CargoTypesModels.UpdateCargoTypeRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}`, - ZodExtended.parse(CargoTypesModels.UpdateCargoTypeRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: CargoTypesModels.CargoTypeResponseDTOSchema }, - `/cargo-types/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/cargoTypes/cargoTypes.configs.ts b/test/generated/next/cargoTypes/cargoTypes.configs.ts deleted file mode 100644 index 5d2769f..0000000 --- a/test/generated/next/cargoTypes/cargoTypes.configs.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CargoTypesModels } from "./cargoTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CargoTypesQueries } from "./cargoTypes.queries"; -import { CargoTypesAcl } from "./cargoTypes.acl"; - -export namespace CargoTypesConfigs { -export const cargoTypesConfig = { - meta: { - title: "Cargo Types", - }, - readAll: { - acl: CargoTypesAcl.canUsePaginate, - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - paginated: CargoTypesQueries.usePaginate, - infinite: CargoTypesQueries.usePaginateInfinite, - filters: { - schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CargoTypesModels.CargoTypePaginationFilterDtoSchema, - options: { - inputs: { - module: true, - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - shortName: true, - length: true, - width: true, - height: true, - unit: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - modules: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CargoTypesModels.CargoTypesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CargoTypesAcl.canUseFindById, - schema: CargoTypesModels.CargoTypeResponseDTOSchema, - query: CargoTypesQueries.useFindById, - }, - create: { - acl: CargoTypesAcl.canUseCreate, - schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, - mutation: CargoTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CargoTypesModels.CreateCargoTypeRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - length: true, - width: true, - height: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - unit: true, - modules: true, - }, - }, -}) - }, - update: { - acl: CargoTypesAcl.canUseUpdate, - schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, - mutation: CargoTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CargoTypesModels.UpdateCargoTypeRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - length: true, - width: true, - height: true, - emptyWeight: true, - containerIsoCode: true, - isContainer: true, - unit: true, - modules: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CargoTypesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CargoTypesQueries.usePaginateLabels, - infinite: CargoTypesQueries.usePaginateLabelsInfinite, - filters: { - schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CargoTypesModels.CargoTypeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CargoTypesModels.CargoTypesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/cargoTypes/cargoTypes.models.ts b/test/generated/next/cargoTypes/cargoTypes.models.ts deleted file mode 100644 index 660798b..0000000 --- a/test/generated/next/cargoTypes/cargoTypes.models.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CargoTypesModels { -/** - * CargoTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CargoTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type CargoTypeEmployeeDTO = z.infer; - -/** - * CargoTypeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the cargo type - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { string } unit Measurement unit for dimensions - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type - * @property { boolean } archived Indicates if the cargo type is archived - * @property { string } createdById - * @property { CargoTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CargoTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const CargoTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), shortName: z.string().nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), unit: z.string(), emptyWeight: z.number().nullish(), containerIsoCode: z.string().nullish(), isContainer: z.boolean().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), archived: z.boolean(), createdById: z.string().nullish(), createdBy: CargoTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CargoTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type CargoTypeResponseDTO = z.infer; - -/** - * TransportModuleEnumSchema - * @type { enum } - */ -export const TransportModuleEnumSchema = z.enum(["Air", "Sea", "Road"]); -export type TransportModuleEnum = z.infer; -export const TransportModuleEnum = TransportModuleEnumSchema.enum; - -/** - * CargoTypePaginationFilterDtoSchema - * @type { object } - * @property { TransportModuleEnum } module - * @property { boolean } archived Archived status filter - * @property { string } search - */ -export const CargoTypePaginationFilterDtoSchema = z.object({ module: TransportModuleEnumSchema.nullable(), archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); -export type CargoTypePaginationFilterDto = z.infer; - -/** - * CreateCargoTypeRequestDTOSchema - * @type { object } - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { string } unit Measurement unit for dimensions - * @property { CommonModels.TransportModeEnum[] } modules Transport modes applicable to the cargo type - */ -export const CreateCargoTypeRequestDTOSchema = z.object({ name: z.string(), shortName: z.string().nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), emptyWeight: z.number().nullish(), containerIsoCode: z.string().nullish(), isContainer: z.boolean().nullish(), unit: z.string(), modules: z.array(CommonModels.TransportModeEnumSchema) }); -export type CreateCargoTypeRequestDTO = z.infer; - -/** - * UpdateCargoTypeRequestDTOSchema - * @type { object } - * @property { string } name Name of the cargo type - * @property { string } shortName Short name of the cargo type - * @property { number } length Length of the cargo type - * @property { number } width Width of the cargo type - * @property { number } height Height of the cargo type - * @property { number } emptyWeight Empty weight of the cargo container - * @property { string } containerIsoCode Container ISO code - * @property { boolean } isContainer Whether this cargo type is a container - * @property { string } unit Measurement unit for dimensions - * @property { CommonModels.TransportModeEnum[] } modules Transport modules applicable to the cargo type - */ -export const UpdateCargoTypeRequestDTOSchema = z.object({ name: z.string().nullable(), shortName: z.string().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), emptyWeight: z.number().nullable(), containerIsoCode: z.string().nullable(), isContainer: z.boolean().nullable(), unit: z.string().nullable(), modules: z.array(CommonModels.TransportModeEnumSchema).nullable() }).partial(); -export type UpdateCargoTypeRequestDTO = z.infer; - -/** - * CargoTypeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const CargoTypeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type CargoTypeLabelFilterDto = z.infer; - -/** - * CargoTypesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const CargoTypesPaginateOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type CargoTypesPaginateOrderParamEnum = z.infer; -export const CargoTypesPaginateOrderParamEnum = CargoTypesPaginateOrderParamEnumSchema.enum; - -/** - * CargoTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CargoTypeResponseDTO[] } items - */ -export const CargoTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CargoTypeResponseDTOSchema).nullable() }).partial().shape }); -export type CargoTypesPaginateResponse = z.infer; - -/** - * CargoTypesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const CargoTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "description", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type CargoTypesPaginateLabelsOrderParamEnum = z.infer; -export const CargoTypesPaginateLabelsOrderParamEnum = CargoTypesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * CargoTypesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const CargoTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type CargoTypesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/cargoTypes/cargoTypes.queries.ts b/test/generated/next/cargoTypes/cargoTypes.queries.ts deleted file mode 100644 index f0d98ae..0000000 --- a/test/generated/next/cargoTypes/cargoTypes.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CargoTypesAcl } from "./cargoTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CargoTypesModels } from "./cargoTypes.models"; -import { CargoTypesApi } from "./cargoTypes.api"; - -export namespace CargoTypesQueries { -export const moduleName = QueryModule.CargoTypes; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string) => [...keys.all, "/cargo-types", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string) => [...keys.all, "/cargo-types/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/cargo-types/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Cargo Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Cargo Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CargoTypesAcl.canUsePaginate()); - return CargoTypesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Cargo Type - * @permission Requires `canUseCreate` ability - * @param { CargoTypesModels.CreateCargoTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CargoTypesAcl.canUseCreate()); - return CargoTypesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate cargo types with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate cargo types with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, description, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchcode` - * @param { CargoTypesModels.CargoTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CargoTypesModels.CargoTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CargoTypesAcl.canUsePaginateLabels()); - return CargoTypesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get Cargo Type by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(CargoTypesAcl.canUseFindById()); - return CargoTypesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Cargo Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { CargoTypesModels.UpdateCargoTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(CargoTypesAcl.canUseUpdate()); - return CargoTypesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Cargo Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CargoTypesAcl.canUseArchive()); - return CargoTypesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive Cargo Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CargoTypesAcl.canUseUnarchive()); - return CargoTypesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/chargeTypes/chargeTypes.acl.ts b/test/generated/next/chargeTypes/chargeTypes.acl.ts deleted file mode 100644 index 469c483..0000000 --- a/test/generated/next/chargeTypes/chargeTypes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace ChargeTypesAcl { -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "ChargeType" -] as AbilityTuple<"Read", "ChargeType">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "ChargeType" -] as AbilityTuple<"Read", "ChargeType">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "ChargeType" -] as AbilityTuple<"Create", "ChargeType">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "ChargeType" -] as AbilityTuple<"Read", "ChargeType">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "ChargeType" -] as AbilityTuple<"Update", "ChargeType">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "ChargeType" -] as AbilityTuple<"Archive", "ChargeType">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "ChargeType" -] as AbilityTuple<"Archive", "ChargeType">; - -} diff --git a/test/generated/next/chargeTypes/chargeTypes.api.ts b/test/generated/next/chargeTypes/chargeTypes.api.ts deleted file mode 100644 index acbab42..0000000 --- a/test/generated/next/chargeTypes/chargeTypes.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChargeTypesModels } from "./chargeTypes.models"; - -export namespace ChargeTypesApi { -export const findAll = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypesFindAllResponseSchema }, - `/charge-types/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChargeTypesModels.ChargeTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypesPaginateResponseSchema }, - `/charge-types`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChargeTypesModels.ChargeTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: ChargeTypesModels.CreateChargeTypeRequestDTO, ) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types`, - ZodExtended.parse(ChargeTypesModels.CreateChargeTypeRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}`, - - ) -}; -export const update = (id: string, data: ChargeTypesModels.UpdateChargeTypeRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}`, - ZodExtended.parse(ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: ChargeTypesModels.ChargeTypeResponseDTOSchema }, - `/charge-types/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/chargeTypes/chargeTypes.configs.ts b/test/generated/next/chargeTypes/chargeTypes.configs.ts deleted file mode 100644 index 30d69aa..0000000 --- a/test/generated/next/chargeTypes/chargeTypes.configs.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChargeTypesModels } from "./chargeTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChargeTypesQueries } from "./chargeTypes.queries"; -import { ChargeTypesAcl } from "./chargeTypes.acl"; - -export namespace ChargeTypesConfigs { -export const chargeTypesConfig = { - meta: { - title: "Charge Types", - }, - readAll: { - acl: ChargeTypesAcl.canUsePaginate, - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - paginated: ChargeTypesQueries.usePaginate, - infinite: ChargeTypesQueries.usePaginateInfinite, - filters: { - schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChargeTypesModels.ChargeTypePaginationFilterDtoSchema, - options: { - inputs: { - name: true, - search: true, - archived: true, - direction: true, - transportModes: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ChargeTypesModels.ChargeTypesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ChargeTypesAcl.canUseFindById, - schema: ChargeTypesModels.ChargeTypeResponseDTOSchema, - query: ChargeTypesQueries.useFindById, - }, - create: { - acl: ChargeTypesAcl.canUseCreate, - schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, - mutation: ChargeTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChargeTypesModels.CreateChargeTypeRequestDTOSchema, - options: { - inputs: { - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - }, - }, -}) - }, - update: { - acl: ChargeTypesAcl.canUseUpdate, - schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, - mutation: ChargeTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChargeTypesModels.UpdateChargeTypeRequestDTOSchema, - options: { - inputs: { - matchCode: true, - englishName: true, - archived: true, - description: true, - modules: true, - directions: true, - translations: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ChargeTypesAcl.canUseFindAll, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChargeTypesQueries.useFindAll, - infinite: ChargeTypesQueries.useFindAllInfinite, - filters: { - schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChargeTypesModels.ChargeTypeLabelFilterDtoSchema, - options: { - inputs: { - direction: true, - transportModes: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChargeTypesModels.ChargeTypesFindAllOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/chargeTypes/chargeTypes.models.ts b/test/generated/next/chargeTypes/chargeTypes.models.ts deleted file mode 100644 index 2175f9b..0000000 --- a/test/generated/next/chargeTypes/chargeTypes.models.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChargeTypesModels { -/** - * ChargeTypeLabelFilterDtoSchema - * @type { object } - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum[] } transportModes - * @property { string } search - */ -export const ChargeTypeLabelFilterDtoSchema = z.object({ direction: CommonModels.DirectionEnumSchema.nullable(), transportModes: z.array(CommonModels.TransportModeEnumSchema).nullable(), search: z.string().nullable() }).partial(); -export type ChargeTypeLabelFilterDto = z.infer; - -/** - * ChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ -export const ChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }); -export type ChargeTypeTranslationDto = z.infer; - -/** - * ChargeTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChargeTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ChargeTypeEmployeeDTO = z.infer; - -/** - * ChargeTypeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { ChargeTypeTranslationDto[] } translations - * @property { string } createdById - * @property { ChargeTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { ChargeTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const ChargeTypeResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), englishName: z.string(), archived: z.boolean(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), directions: z.array(CommonModels.DirectionEnumSchema), translations: z.array(ChargeTypeTranslationDtoSchema), createdById: z.string().nullish(), createdBy: ChargeTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChargeTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type ChargeTypeResponseDTO = z.infer; - -/** - * ChargeTypePaginationFilterDtoSchema - * @type { object } - * @property { string } name - * @property { string } search - * @property { boolean } archived - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum[] } transportModes - */ -export const ChargeTypePaginationFilterDtoSchema = z.object({ name: z.string().nullable(), search: z.string().nullable(), archived: z.boolean().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), transportModes: z.array(CommonModels.TransportModeEnumSchema).nullable() }).partial(); -export type ChargeTypePaginationFilterDto = z.infer; - -/** - * CreateChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ -export const CreateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }); -export type CreateChargeTypeTranslationDto = z.infer; - -/** - * CreateChargeTypeRequestDTOSchema - * @type { object } - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { CreateChargeTypeTranslationDto[] } translations - */ -export const CreateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string(), englishName: z.string().nullish(), archived: z.boolean().nullish(), description: z.string().nullish(), modules: z.array(CommonModels.TransportModeEnumSchema), directions: z.array(CommonModels.DirectionEnumSchema), translations: z.array(CreateChargeTypeTranslationDtoSchema).nullish() }); -export type CreateChargeTypeRequestDTO = z.infer; - -/** - * UpdateChargeTypeTranslationDtoSchema - * @type { object } - * @property { CommonModels.LanguageEnum } language - * @property { string } value - */ -export const UpdateChargeTypeTranslationDtoSchema = z.object({ language: CommonModels.LanguageEnumSchema, value: z.string() }); -export type UpdateChargeTypeTranslationDto = z.infer; - -/** - * UpdateChargeTypeRequestDTOSchema - * @type { object } - * @property { string } matchCode - * @property { string } englishName - * @property { boolean } archived - * @property { string } description - * @property { CommonModels.TransportModeEnum[] } modules - * @property { CommonModels.DirectionEnum[] } directions - * @property { UpdateChargeTypeTranslationDto[] } translations - */ -export const UpdateChargeTypeRequestDTOSchema = z.object({ matchCode: z.string().nullable(), englishName: z.string().nullable(), archived: z.boolean().nullable(), description: z.string().nullable(), modules: z.array(CommonModels.TransportModeEnumSchema).nullable(), directions: z.array(CommonModels.DirectionEnumSchema).nullable(), translations: z.array(UpdateChargeTypeTranslationDtoSchema).nullable() }).partial(); -export type UpdateChargeTypeRequestDTO = z.infer; - -/** - * ChargeTypesFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ChargeTypesFindAllOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); -export type ChargeTypesFindAllOrderParamEnum = z.infer; -export const ChargeTypesFindAllOrderParamEnum = ChargeTypesFindAllOrderParamEnumSchema.enum; - -/** - * ChargeTypesFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ChargeTypesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type ChargeTypesFindAllResponse = z.infer; - -/** - * ChargeTypesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ChargeTypesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy", "englishName"]); -export type ChargeTypesPaginateOrderParamEnum = z.infer; -export const ChargeTypesPaginateOrderParamEnum = ChargeTypesPaginateOrderParamEnumSchema.enum; - -/** - * ChargeTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChargeTypeResponseDTO[] } items - */ -export const ChargeTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChargeTypeResponseDTOSchema).nullable() }).partial().shape }); -export type ChargeTypesPaginateResponse = z.infer; - -} diff --git a/test/generated/next/chargeTypes/chargeTypes.queries.ts b/test/generated/next/chargeTypes/chargeTypes.queries.ts deleted file mode 100644 index 93f7fcb..0000000 --- a/test/generated/next/chargeTypes/chargeTypes.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChargeTypesAcl } from "./chargeTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChargeTypesModels } from "./chargeTypes.models"; -import { ChargeTypesApi } from "./chargeTypes.api"; - -export namespace ChargeTypesQueries { -export const moduleName = QueryModule.ChargeTypes; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string) => [...keys.all, "/charge-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, - paginate: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/charge-types", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string) => [...keys.all, "/charge-types", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/charge-types/:id", id] as const, -}; - -/** - * Query `useFindAll` - * @summary Paginate charge types with only their labels - * @permission Requires `canUseFindAll` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @summary Paginate charge types with only their labels - * @permission Requires `canUseFindAll` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChargeTypesAcl.canUseFindAll()); - return ChargeTypesApi.findAll(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Charge Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Charge Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy, englishName. Example: `name` - * @param { ChargeTypesModels.ChargeTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ChargeTypesModels.ChargeTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChargeTypesAcl.canUsePaginate()); - return ChargeTypesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new Charge Type - * @permission Requires `canUseCreate` ability - * @param { ChargeTypesModels.CreateChargeTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(ChargeTypesAcl.canUseCreate()); - return ChargeTypesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get Charge Type Details by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(ChargeTypesAcl.canUseFindById()); - return ChargeTypesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update an existing Charge Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { ChargeTypesModels.UpdateChargeTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(ChargeTypesAcl.canUseUpdate()); - return ChargeTypesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a Charge Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ChargeTypesAcl.canUseArchive()); - return ChargeTypesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a Charge Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ChargeTypesAcl.canUseUnarchive()); - return ChargeTypesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/checklistItems/checklistItems.acl.ts b/test/generated/next/checklistItems/checklistItems.acl.ts deleted file mode 100644 index a58bf1f..0000000 --- a/test/generated/next/checklistItems/checklistItems.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ChecklistItemsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create checklist item in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Create", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List checklist items for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Paginate checklist item labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get checklist item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Read", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Update", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistItem", object) : "ChecklistItem" -] as AbilityTuple<"Archive", "ChecklistItem" | ForcedSubject<"ChecklistItem"> & { officeId: string, }>; - -} diff --git a/test/generated/next/checklistItems/checklistItems.api.ts b/test/generated/next/checklistItems/checklistItems.api.ts deleted file mode 100644 index 83ffdbe..0000000 --- a/test/generated/next/checklistItems/checklistItems.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChecklistItemsModels } from "./checklistItems.models"; - -export namespace ChecklistItemsApi { -export const create = (officeId: string, data: ChecklistItemsModels.CreateChecklistItemRequestDTO, ) => { - return AppRestClient.post( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items`, - ZodExtended.parse(ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, data), - - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemsPaginateResponseSchema }, - `/offices/${officeId}/checklist-items`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemsPaginateLabelsResponseSchema }, - `/offices/${officeId}/checklist-items/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: ChecklistItemsModels.UpdateChecklistItemRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: ChecklistItemsModels.ChecklistItemResponseDTOSchema }, - `/offices/${officeId}/checklist-items/${id}`, - ZodExtended.parse(ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-items/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-items/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/checklistItems/checklistItems.configs.ts b/test/generated/next/checklistItems/checklistItems.configs.ts deleted file mode 100644 index f67024d..0000000 --- a/test/generated/next/checklistItems/checklistItems.configs.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChecklistItemsModels } from "./checklistItems.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChecklistItemsQueries } from "./checklistItems.queries"; -import { ChecklistItemsAcl } from "./checklistItems.acl"; - -export namespace ChecklistItemsConfigs { -export const checklistItemsConfig = { - meta: { - title: "Checklist Items", - }, - readAll: { - acl: ChecklistItemsAcl.canUsePaginate, - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - paginated: ChecklistItemsQueries.usePaginate, - infinite: ChecklistItemsQueries.usePaginateInfinite, - filters: { - schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistItemsModels.ChecklistItemFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ChecklistItemsModels.ChecklistItemsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ChecklistItemsAcl.canUseFindById, - schema: ChecklistItemsModels.ChecklistItemResponseDTOSchema, - query: ChecklistItemsQueries.useFindById, - }, - create: { - acl: ChecklistItemsAcl.canUseCreate, - schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, - mutation: ChecklistItemsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChecklistItemsModels.CreateChecklistItemRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: ChecklistItemsAcl.canUseUpdate, - schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, - mutation: ChecklistItemsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChecklistItemsModels.UpdateChecklistItemRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: ChecklistItemsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChecklistItemsQueries.usePaginateLabels, - infinite: ChecklistItemsQueries.usePaginateLabelsInfinite, - filters: { - schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistItemsModels.ChecklistItemLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChecklistItemsModels.ChecklistItemsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/checklistItems/checklistItems.models.ts b/test/generated/next/checklistItems/checklistItems.models.ts deleted file mode 100644 index a5191f9..0000000 --- a/test/generated/next/checklistItems/checklistItems.models.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChecklistItemsModels { -/** - * ChecklistItemEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChecklistItemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ChecklistItemEmployeeDTO = z.infer; - -/** - * ChecklistItemResponseDTOSchema - * @type { object } - * @property { string } id Checklist item ID - * @property { string } name Checklist item name - * @property { string } officeId Office ID - * @property { boolean } archived Is archived - * @property { string } archivedAt Archived at - * @property { string } createdById ID of the employee who created this checklist item - * @property { ChecklistItemEmployeeDTO } createdBy Employee who created this checklist item - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this checklist item - * @property { ChecklistItemEmployeeDTO } updatedBy Employee who last updated this checklist item - * @property { string } updatedAt Updated at - */ -export const ChecklistItemResponseDTOSchema = z.object({ id: z.string(), name: z.string(), officeId: z.string(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: ChecklistItemEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChecklistItemEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type ChecklistItemResponseDTO = z.infer; - -/** - * CreateChecklistItemRequestDTOSchema - * @type { object } - * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` - */ -export const CreateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256) }); -export type CreateChecklistItemRequestDTO = z.infer; - -/** - * ChecklistItemLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const ChecklistItemLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type ChecklistItemLabelFilterDto = z.infer; - -/** - * ChecklistItemFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ChecklistItemFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type ChecklistItemFilterDto = z.infer; - -/** - * UpdateChecklistItemRequestDTOSchema - * @type { object } - * @property { string } name Checklist item name. Min Length: `3`. Max Length: `256` - */ -export const UpdateChecklistItemRequestDTOSchema = z.object({ name: z.string().min(3).max(256).nullable() }).partial(); -export type UpdateChecklistItemRequestDTO = z.infer; - -/** - * ChecklistItemsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistItemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistItemsPaginateOrderParamEnum = z.infer; -export const ChecklistItemsPaginateOrderParamEnum = ChecklistItemsPaginateOrderParamEnumSchema.enum; - -/** - * ChecklistItemsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChecklistItemResponseDTO[] } items - */ -export const ChecklistItemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistItemResponseDTOSchema).nullable() }).partial().shape }); -export type ChecklistItemsPaginateResponse = z.infer; - -/** - * ChecklistItemsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistItemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistItemsPaginateLabelsOrderParamEnum = z.infer; -export const ChecklistItemsPaginateLabelsOrderParamEnum = ChecklistItemsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * ChecklistItemsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ChecklistItemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type ChecklistItemsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/checklistItems/checklistItems.queries.ts b/test/generated/next/checklistItems/checklistItems.queries.ts deleted file mode 100644 index 17b4403..0000000 --- a/test/generated/next/checklistItems/checklistItems.queries.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChecklistItemsAcl } from "./checklistItems.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChecklistItemsModels } from "./checklistItems.models"; -import { ChecklistItemsApi } from "./checklistItems.api"; - -export namespace ChecklistItemsQueries { -export const moduleName = QueryModule.ChecklistItems; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-items/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-items/:id", id, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create checklist item - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ChecklistItemsModels.CreateChecklistItemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ChecklistItemsAcl.canUseCreate({ officeId } )); - return ChecklistItemsApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated checklist items - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated checklist items - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistItemsAcl.canUsePaginate({ officeId } )); - return ChecklistItemsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate checklist item labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate checklist item labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistItemsModels.ChecklistItemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistItemsModels.ChecklistItemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistItemsAcl.canUsePaginateLabels({ officeId } )); - return ChecklistItemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get checklist item by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ChecklistItemsAcl.canUseFindById({ officeId } )); - return ChecklistItemsApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update checklist item - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ChecklistItemsModels.UpdateChecklistItemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ChecklistItemsAcl.canUseUpdate({ officeId } )); - return ChecklistItemsApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive checklist item - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistItemsAcl.canUseArchive({ officeId } )); - return ChecklistItemsApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive checklist item - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistItemsAcl.canUseUnarchive({ officeId } )); - return ChecklistItemsApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/checklistTemplates/checklistTemplates.acl.ts b/test/generated/next/checklistTemplates/checklistTemplates.acl.ts deleted file mode 100644 index d92f5fd..0000000 --- a/test/generated/next/checklistTemplates/checklistTemplates.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ChecklistTemplatesAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create checklist template in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Create", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List checklist templates for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description Get checklist template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get checklist template by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Read", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Update", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive checklist template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ChecklistTemplate", object) : "ChecklistTemplate" -] as AbilityTuple<"Archive", "ChecklistTemplate" | ForcedSubject<"ChecklistTemplate"> & { officeId: string, }>; - -} diff --git a/test/generated/next/checklistTemplates/checklistTemplates.api.ts b/test/generated/next/checklistTemplates/checklistTemplates.api.ts deleted file mode 100644 index 45c958a..0000000 --- a/test/generated/next/checklistTemplates/checklistTemplates.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; - -export namespace ChecklistTemplatesApi { -export const create = (officeId: string, data: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO, ) => { - return AppRestClient.post( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates`, - ZodExtended.parse(ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, data), - - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateResponseSchema }, - `/offices/${officeId}/checklist-templates`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/checklist-templates/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO, ) => { - return AppRestClient.put( - { resSchema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema }, - `/offices/${officeId}/checklist-templates/${id}`, - ZodExtended.parse(ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-templates/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/checklist-templates/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/checklistTemplates/checklistTemplates.configs.ts b/test/generated/next/checklistTemplates/checklistTemplates.configs.ts deleted file mode 100644 index 474d9c0..0000000 --- a/test/generated/next/checklistTemplates/checklistTemplates.configs.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ChecklistTemplatesQueries } from "./checklistTemplates.queries"; -import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; - -export namespace ChecklistTemplatesConfigs { -export const checklistTemplatesConfig = { - meta: { - title: "Checklist Templates", - }, - readAll: { - acl: ChecklistTemplatesAcl.canUsePaginate, - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - paginated: ChecklistTemplatesQueries.usePaginate, - infinite: ChecklistTemplatesQueries.usePaginateInfinite, - filters: { - schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.ChecklistTemplateFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - items: true, - }, - sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ChecklistTemplatesAcl.canUseFindById, - schema: ChecklistTemplatesModels.ChecklistTemplateResponseDTOSchema, - query: ChecklistTemplatesQueries.useFindById, - }, - create: { - acl: ChecklistTemplatesAcl.canUseCreate, - schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, - mutation: ChecklistTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.CreateChecklistTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: ChecklistTemplatesAcl.canUseUpdate, - schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, - mutation: ChecklistTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - items: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ChecklistTemplatesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ChecklistTemplatesQueries.usePaginateLabels, - infinite: ChecklistTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ChecklistTemplatesModels.ChecklistTemplatesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/checklistTemplates/checklistTemplates.models.ts b/test/generated/next/checklistTemplates/checklistTemplates.models.ts deleted file mode 100644 index a26204c..0000000 --- a/test/generated/next/checklistTemplates/checklistTemplates.models.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ChecklistTemplatesModels { -/** - * ChecklistTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChecklistTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ChecklistTemplateEmployeeDTO = z.infer; - -/** - * ChecklistTemplateItemResponseDTOSchema - * @type { object } - * @property { string } checklistItemId Checklist item id - * @property { number } order Order index - * @property { string } name Checklist item name - */ -export const ChecklistTemplateItemResponseDTOSchema = z.object({ checklistItemId: z.string(), order: z.number(), name: z.string().nullish() }); -export type ChecklistTemplateItemResponseDTO = z.infer; - -/** - * ChecklistTemplateResponseDTOSchema - * @type { object } - * @property { string } id Template id - * @property { string } name Template name - * @property { string } officeId Office id - * @property { boolean } archived Is archived - * @property { string } archivedAt Archived at - * @property { string } createdById ID of the employee who created this template - * @property { ChecklistTemplateEmployeeDTO } createdBy Employee who created this template - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this template - * @property { ChecklistTemplateEmployeeDTO } updatedBy Employee who last updated this template - * @property { string } updatedAt Updated at - * @property { ChecklistTemplateItemResponseDTO[] } items Ordered items - */ -export const ChecklistTemplateResponseDTOSchema = z.object({ id: z.string(), name: z.string(), officeId: z.string(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: ChecklistTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ChecklistTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), items: z.array(ChecklistTemplateItemResponseDTOSchema) }); -export type ChecklistTemplateResponseDTO = z.infer; - -/** - * CreateChecklistTemplateRequestDTOSchema - * @type { object } - * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` - */ -export const CreateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120) }); -export type CreateChecklistTemplateRequestDTO = z.infer; - -/** - * ChecklistTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const ChecklistTemplateLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type ChecklistTemplateLabelFilterDto = z.infer; - -/** - * ChecklistTemplateFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ChecklistTemplateFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type ChecklistTemplateFilterDto = z.infer; - -/** - * UpdateChecklistTemplateRequestDTOSchema - * @type { object } - * @property { string } name Checklist template name. Min Length: `3`. Max Length: `120` - * @property { string[] } items Ordered checklist item ids - */ -export const UpdateChecklistTemplateRequestDTOSchema = z.object({ name: z.string().min(3).max(120), items: z.array(z.uuid()) }); -export type UpdateChecklistTemplateRequestDTO = z.infer; - -/** - * ChecklistTemplatesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistTemplatesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistTemplatesPaginateOrderParamEnum = z.infer; -export const ChecklistTemplatesPaginateOrderParamEnum = ChecklistTemplatesPaginateOrderParamEnumSchema.enum; - -/** - * ChecklistTemplatesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChecklistTemplateResponseDTO[] } items - */ -export const ChecklistTemplatesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChecklistTemplateResponseDTOSchema).nullable() }).partial().shape }); -export type ChecklistTemplatesPaginateResponse = z.infer; - -/** - * ChecklistTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ChecklistTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ChecklistTemplatesPaginateLabelsOrderParamEnum = z.infer; -export const ChecklistTemplatesPaginateLabelsOrderParamEnum = ChecklistTemplatesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * ChecklistTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ChecklistTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type ChecklistTemplatesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/checklistTemplates/checklistTemplates.queries.ts b/test/generated/next/checklistTemplates/checklistTemplates.queries.ts deleted file mode 100644 index 00d431f..0000000 --- a/test/generated/next/checklistTemplates/checklistTemplates.queries.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ChecklistTemplatesAcl } from "./checklistTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ChecklistTemplatesModels } from "./checklistTemplates.models"; -import { ChecklistTemplatesApi } from "./checklistTemplates.api"; - -export namespace ChecklistTemplatesQueries { -export const moduleName = QueryModule.ChecklistTemplates; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates", "infinite", officeId, limit, order, filter, cursor] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/checklist-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/checklist-templates/:id", id, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create checklist template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ChecklistTemplatesModels.CreateChecklistTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ChecklistTemplatesAcl.canUseCreate({ officeId } )); - return ChecklistTemplatesApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated checklist templates - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated checklist templates - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistTemplatesAcl.canUsePaginate({ officeId } )); - return ChecklistTemplatesApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate checklist template labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate checklist template labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ChecklistTemplatesModels.ChecklistTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ChecklistTemplatesAcl.canUsePaginateLabels({ officeId } )); - return ChecklistTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get checklist template by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ChecklistTemplatesAcl.canUseFindById({ officeId } )); - return ChecklistTemplatesApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Replace checklist template - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ChecklistTemplatesModels.UpdateChecklistTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ChecklistTemplatesAcl.canUseUpdate({ officeId } )); - return ChecklistTemplatesApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive checklist template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistTemplatesAcl.canUseArchive({ officeId } )); - return ChecklistTemplatesApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive checklist template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ChecklistTemplatesAcl.canUseUnarchive({ officeId } )); - return ChecklistTemplatesApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/cities/cities.acl.ts b/test/generated/next/cities/cities.acl.ts deleted file mode 100644 index 877afd1..0000000 --- a/test/generated/next/cities/cities.acl.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CitiesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "City" -] as AbilityTuple<"Create", "City">; - -/** - * Use for `useListCityLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCityLabels` query - */ -export const canUseListCityLabels = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useGetCityLabelById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCityLabelById` query - */ -export const canUseGetCityLabelById = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "City" -] as AbilityTuple<"Read", "City">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "City" -] as AbilityTuple<"Update", "City">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "City" -] as AbilityTuple<"Archive", "City">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "City" -] as AbilityTuple<"Archive", "City">; - -} diff --git a/test/generated/next/cities/cities.api.ts b/test/generated/next/cities/cities.api.ts deleted file mode 100644 index af80ea7..0000000 --- a/test/generated/next/cities/cities.api.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CitiesModels } from "./cities.models"; - -export namespace CitiesApi { -export const paginate = (limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CitiesModels.CitiesPaginateResponseSchema }, - `/cities`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.CitiesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CitiesModels.CityPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: CitiesModels.CreateCityRequestDTO, ) => { - return AppRestClient.post( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities`, - ZodExtended.parse(CitiesModels.CreateCityRequestDTOSchema, data), - - ) -}; -export const listCityLabels = (limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CitiesModels.ListCityLabelsResponseSchema }, - `/cities/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CitiesModels.ListCityLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CitiesModels.CityLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getCityLabelById = (id: string, ) => { - return AppRestClient.get( - { resSchema: CitiesModels.CityLabelResponseDTOSchema }, - `/cities/${id}/labels`, - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities/${id}`, - - ) -}; -export const update = (id: string, data: CitiesModels.UpdateCityRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CitiesModels.CityResponseDTOSchema }, - `/cities/${id}`, - ZodExtended.parse(CitiesModels.UpdateCityRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/cities/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/cities/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/cities/cities.configs.ts b/test/generated/next/cities/cities.configs.ts deleted file mode 100644 index f31740c..0000000 --- a/test/generated/next/cities/cities.configs.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CitiesModels } from "./cities.models"; -import { CitiesQueries } from "./cities.queries"; -import { CitiesAcl } from "./cities.acl"; - -export namespace CitiesConfigs { -export const citiesConfig = { - meta: { - title: "Cities", - }, - readAll: { - acl: CitiesAcl.canUsePaginate, - schema: CitiesModels.CityResponseDTOSchema, - paginated: CitiesQueries.usePaginate, - infinite: CitiesQueries.usePaginateInfinite, - filters: { - schema: CitiesModels.CityPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CitiesModels.CityPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CitiesModels.CityResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - isoCode: true, - stateCode: true, - archived: true, - countryId: true, - country: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CitiesModels.CitiesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CitiesAcl.canUseFindById, - schema: CitiesModels.CityResponseDTOSchema, - query: CitiesQueries.useFindById, - }, - create: { - acl: CitiesAcl.canUseCreate, - schema: CitiesModels.CreateCityRequestDTOSchema, - mutation: CitiesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CitiesModels.CreateCityRequestDTOSchema, - options: { - inputs: { - name: true, - isoCode: true, - stateCode: true, - countryId: true, - }, - }, -}) - }, - update: { - acl: CitiesAcl.canUseUpdate, - schema: CitiesModels.UpdateCityRequestDTOSchema, - mutation: CitiesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CitiesModels.UpdateCityRequestDTOSchema, - options: { - inputs: { - name: true, - isoCode: true, - stateCode: true, - countryId: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: CitiesAcl.canUseListCityLabels, - schema: CitiesModels.CityLabelResponseDTOSchema, - paginated: CitiesQueries.useListCityLabels, - infinite: CitiesQueries.useListCityLabelsInfinite, - filters: { - schema: CitiesModels.CityLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CitiesModels.CityLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CitiesModels.CityLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - country: true, - }, - sortable: CitiesModels.ListCityLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/cities/cities.models.ts b/test/generated/next/cities/cities.models.ts deleted file mode 100644 index 4fbb83e..0000000 --- a/test/generated/next/cities/cities.models.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CitiesModels { -/** - * CityCountryDtoSchema - * @type { object } - * @property { string } id Unique identifier of the country - * @property { string } name Name of the country - * @property { string } isoCode2 2 character iso code of the country - * @property { string } isoCode3 3 character iso code of the country - */ -export const CityCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type CityCountryDto = z.infer; - -/** - * CityEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CityEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type CityEmployeeDTO = z.infer; - -/** - * CityResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the city - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { boolean } archived Whether the city is archived - * @property { string } countryId Country ID - * @property { CityCountryDto } country - * @property { string } createdById - * @property { CityEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CityEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const CityResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isoCode: z.string().nullish(), stateCode: z.string().nullish(), archived: z.boolean().nullish(), countryId: z.string().nullish(), country: CityCountryDtoSchema.nullish(), createdById: z.string().nullish(), createdBy: CityEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CityEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type CityResponseDTO = z.infer; - -/** - * CityLabelCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CityLabelCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type CityLabelCountryDto = z.infer; - -/** - * CityLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { CityLabelCountryDto } country - */ -export const CityLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), country: CityLabelCountryDtoSchema.nullish() }); -export type CityLabelResponseDTO = z.infer; - -/** - * CityPaginationFilterDtoSchema - * @type { object } - * @property { string } search Free search - * @property { boolean } archived - */ -export const CityPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type CityPaginationFilterDto = z.infer; - -/** - * CityLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const CityLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type CityLabelFilterDto = z.infer; - -/** - * CreateCityRequestDTOSchema - * @type { object } - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { string } countryId Country ID - */ -export const CreateCityRequestDTOSchema = z.object({ name: z.string(), isoCode: z.string().nullish(), stateCode: z.string().nullish(), countryId: z.string() }); -export type CreateCityRequestDTO = z.infer; - -/** - * UpdateCityRequestDTOSchema - * @type { object } - * @property { string } name Name of the city - * @property { string } isoCode ISO code of the city - * @property { string } stateCode State code of the city - * @property { string } countryId Country ID - */ -export const UpdateCityRequestDTOSchema = z.object({ name: z.string().nullable(), isoCode: z.string().nullable(), stateCode: z.string().nullable(), countryId: z.string().nullable() }).partial(); -export type UpdateCityRequestDTO = z.infer; - -/** - * CitiesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const CitiesPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type CitiesPaginateOrderParamEnum = z.infer; -export const CitiesPaginateOrderParamEnum = CitiesPaginateOrderParamEnumSchema.enum; - -/** - * CitiesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CityResponseDTO[] } items - */ -export const CitiesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityResponseDTOSchema).nullable() }).partial().shape }); -export type CitiesPaginateResponse = z.infer; - -/** - * ListCityLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ListCityLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ListCityLabelsOrderParamEnum = z.infer; -export const ListCityLabelsOrderParamEnum = ListCityLabelsOrderParamEnumSchema.enum; - -/** - * ListCityLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CityLabelResponseDTO[] } items - */ -export const ListCityLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CityLabelResponseDTOSchema).nullable() }).partial().shape }); -export type ListCityLabelsResponse = z.infer; - -} diff --git a/test/generated/next/cities/cities.queries.ts b/test/generated/next/cities/cities.queries.ts deleted file mode 100644 index a8b951b..0000000 --- a/test/generated/next/cities/cities.queries.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CitiesAcl } from "./cities.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CitiesModels } from "./cities.models"; -import { CitiesApi } from "./cities.api"; - -export namespace CitiesQueries { -export const moduleName = QueryModule.Cities; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string) => [...keys.all, "/cities", "infinite", limit, order, filter, cursor] as const, - listCityLabels: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/cities/paginate/labels", limit, order, filter, page, cursor] as const, - listCityLabelsInfinite: (limit?: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string) => [...keys.all, "/cities/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getCityLabelById: (id: string) => [...keys.all, "/cities/:id/labels", id] as const, - findById: (id: string) => [...keys.all, "/cities/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Cities - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Cities - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CitiesAcl.canUsePaginate()); - return CitiesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create city - * @permission Requires `canUseCreate` ability - * @param { CitiesModels.CreateCityRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CitiesAcl.canUseCreate()); - return CitiesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListCityLabels` - * @summary Paginate cities with only their labels (id and name) and country information - * @permission Requires `canUseListCityLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCityLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCityLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListCityLabelsInfinite - * @summary Paginate cities with only their labels (id and name) and country information - * @permission Requires `canUseListCityLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CitiesModels.CityLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListCityLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CitiesModels.CityLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCityLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CitiesAcl.canUseListCityLabels()); - return CitiesApi.listCityLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetCityLabelById` - * @summary Get city by ID with label format (id and formatted name) and country information - * @permission Requires `canUseGetCityLabelById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCityLabelById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCityLabelById(id), - queryFn: () => { - checkAcl(CitiesAcl.canUseGetCityLabelById()); - return CitiesApi.getCityLabelById(id) }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get city by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(CitiesAcl.canUseFindById()); - return CitiesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update city - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { CitiesModels.UpdateCityRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(CitiesAcl.canUseUpdate()); - return CitiesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive city - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CitiesAcl.canUseArchive()); - return CitiesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive city - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CitiesAcl.canUseUnarchive()); - return CitiesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/common/common.models.ts b/test/generated/next/common/common.models.ts deleted file mode 100644 index 285ef85..0000000 --- a/test/generated/next/common/common.models.ts +++ /dev/null @@ -1,1860 +0,0 @@ -import { z } from "zod"; - -export namespace CommonModels { -/** - * PositionCargoPackageEnumSchema - * @type { enum } - */ -export const PositionCargoPackageEnumSchema = z.enum(["Hazardous", "NonStackable", "TemperatureControlled", "OversizedCargo", "DiplomaticCargo"]); -export type PositionCargoPackageEnum = z.infer; -export const PositionCargoPackageEnum = PositionCargoPackageEnumSchema.enum; - -/** - * HazardousSpecialtyEnumSchema - * @type { enum } - */ -export const HazardousSpecialtyEnumSchema = z.enum(["Explosives", "FlammableGas", "NonToxicAndFlammableGas", "PoisonGases", "FlammableLiquid", "FlammableSolid", "SpontaneouslyCombustible", "DangerousWhenWet", "Oxidizers", "OrganicPeroxides", "Poison", "InfectiousSubstances", "Radioactive", "Corrosive", "MiscellaneousDangerousSubstances"]); -export type HazardousSpecialtyEnum = z.infer; -export const HazardousSpecialtyEnum = HazardousSpecialtyEnumSchema.enum; - -/** - * RateOptionsEnumSchema - * @type { enum } - */ -export const RateOptionsEnumSchema = z.enum(["AsAgreed", "SpotRate"]); -export type RateOptionsEnum = z.infer; -export const RateOptionsEnum = RateOptionsEnumSchema.enum; - -/** - * RateClassEnumSchema - * @type { enum } - */ -export const RateClassEnumSchema = z.enum(["MinimumCharge", "NormalRate", "QuantityRate"]); -export type RateClassEnum = z.infer; -export const RateClassEnum = RateClassEnumSchema.enum; - -/** - * AccountInformationEnumSchema - * @type { enum } - * @description Account information - */ -export const AccountInformationEnumSchema = z.enum(["FreightCollect", "FreightPrepaid"]); -export type AccountInformationEnum = z.infer; -export const AccountInformationEnum = AccountInformationEnumSchema.enum; - -/** - * LanguageEnumSchema - * @type { enum } - */ -export const LanguageEnumSchema = z.enum(["English", "German", "Hungarian", "Czech", "Turkish", "Slovenian"]); -export type LanguageEnum = z.infer; -export const LanguageEnum = LanguageEnumSchema.enum; - -/** - * LocaleEnumSchema - * @type { enum } - */ -export const LocaleEnumSchema = z.enum(["en-US", "de-DE", "cs-CZ", "sl-SI", "tr-TR", "hu-HU"]); -export type LocaleEnum = z.infer; -export const LocaleEnum = LocaleEnumSchema.enum; - -/** - * OfficePaymentTermsDateTypeSchema - * @type { enum } - */ -export const OfficePaymentTermsDateTypeSchema = z.enum(["InvoiceDate", "ServiceDate"]); -export type OfficePaymentTermsDateType = z.infer; -export const OfficePaymentTermsDateType = OfficePaymentTermsDateTypeSchema.enum; - -/** - * FolderEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const FolderEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type FolderEmployeeDTO = z.infer; - -/** - * FileResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } archived - * @property { boolean } isSystem - * @property { string } createdAt - * @property { string } updatedAt - * @property { FolderEmployeeDTO } createdBy - * @property { FolderEmployeeDTO } updatedBy - * @property { string } downloadUrl - */ -export const FileResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, downloadUrl: z.string().nullish() }); -export type FileResponseDTO = z.infer; - -/** - * EditorContentUpdateDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const EditorContentUpdateDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); -export type EditorContentUpdateDto = z.infer; - -/** - * RemarkBlockDTOSchema - * @type { object } - * @property { string } id - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { EditorContentUpdateDto } content - */ -export const RemarkBlockDTOSchema = z.object({ id: z.string().nullable(), enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), content: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type RemarkBlockDTO = z.infer; - -/** - * TitleBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { string } defaultTitle - * @property { boolean } includePositionNumber - * @property { boolean } allowManualOverride - */ -export const TitleBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), defaultTitle: z.string().nullable(), includePositionNumber: z.boolean().nullable(), allowManualOverride: z.boolean().nullable() }).partial(); -export type TitleBlockDTO = z.infer; - -/** - * PositionInvolvedPartyTypeEnumSchema - * @type { enum } - */ -export const PositionInvolvedPartyTypeEnumSchema = z.enum(["Customer", "Notify", "AlsoNotify", "FOBForwarder", "RoutingAgent", "DeliveryAgent", "TransportProvider", "OceanCarrier", "OriginServiceProvider", "DestinationServiceProvider", "InsuranceProvider", "OriginCustomsAgent", "DestinationCustomsAgent", "StuffingProvider", "StrippingProvider", "Shipper", "Consignee", "CustomsBroker", "Courier", "Trucker", "Airline", "DestinationAgent", "OriginAgent"]); -export type PositionInvolvedPartyTypeEnum = z.infer; -export const PositionInvolvedPartyTypeEnum = PositionInvolvedPartyTypeEnumSchema.enum; - -/** - * ReceiverBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { string } defaultRole - */ -export const ReceiverBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), defaultRole: CommonModels.PositionInvolvedPartyTypeEnumSchema.nullable() }).partial(); -export type ReceiverBlockDTO = z.infer; - -/** - * OurInformationBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } showName - * @property { boolean } showPhone - * @property { boolean } showDate - * @property { boolean } showBookingNumber - * @property { boolean } showCustomerReference - * @property { boolean } showMasterBillOfLadingNumber - * @property { boolean } showHouseBillOfLadingNumber - */ -export const OurInformationBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), showName: z.boolean().nullable(), showPhone: z.boolean().nullable(), showDate: z.boolean().nullable(), showBookingNumber: z.boolean().nullable(), showCustomerReference: z.boolean().nullable(), showMasterBillOfLadingNumber: z.boolean().nullable(), showHouseBillOfLadingNumber: z.boolean().nullable() }).partial(); -export type OurInformationBlockDTO = z.infer; - -/** - * RouteTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } showDate - * @property { boolean } showLocation - * @property { boolean } showType - * @property { boolean } showReference - * @property { boolean } showVesselVoyage - * @property { boolean } showAddress - * @property { boolean } showProvider - */ -export const RouteTableBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), showDate: z.boolean().nullable(), showLocation: z.boolean().nullable(), showType: z.boolean().nullable(), showReference: z.boolean().nullable(), showVesselVoyage: z.boolean().nullable(), showAddress: z.boolean().nullable(), showProvider: z.boolean().nullable() }).partial(); -export type RouteTableBlockDTO = z.infer; - -/** - * CargoTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - */ -export const CargoTableBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable() }).partial(); -export type CargoTableBlockDTO = z.infer; - -/** - * CargoSummaryBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - */ -export const CargoSummaryBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable() }).partial(); -export type CargoSummaryBlockDTO = z.infer; - -/** - * FinanceTableBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } showOnlyForReceiver - * @property { boolean } showVendor - * @property { boolean } showBuyRate - * @property { boolean } showCustomer - * @property { boolean } showSellRate - * @property { boolean } showGrid - * @property { boolean } showCharges - * @property { boolean } showAdditionalText - * @property { boolean } showQuantity - * @property { boolean } showProfit - * @property { boolean } showTotalsByCurrency - * @property { boolean } includeSubPositions - * @property { boolean } subPositionTotals - * @property { boolean } showBuyRateExchangeRates - * @property { boolean } showSellRateExchangeRates - * @property { boolean } showTotal - */ -export const FinanceTableBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), showOnlyForReceiver: z.boolean().nullable(), showVendor: z.boolean().nullable(), showBuyRate: z.boolean().nullable(), showCustomer: z.boolean().nullable(), showSellRate: z.boolean().nullable(), showGrid: z.boolean().nullable(), showCharges: z.boolean().nullable(), showAdditionalText: z.boolean().nullable(), showQuantity: z.boolean().nullable(), showProfit: z.boolean().nullable(), showTotalsByCurrency: z.boolean().nullable(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean().nullable(), showSellRateExchangeRates: z.boolean().nullable(), showTotal: z.boolean().nullable() }).partial(); -export type FinanceTableBlockDTO = z.infer; - -/** - * FooterBlockDTOSchema - * @type { object } - * @property { boolean } enabled - */ -export const FooterBlockDTOSchema = z.object({ enabled: z.boolean().nullable() }).partial(); -export type FooterBlockDTO = z.infer; - -/** - * TermsBlockDTOSchema - * @type { object } - * @property { boolean } enabled - */ -export const TermsBlockDTOSchema = z.object({ enabled: z.boolean().nullable() }).partial(); -export type TermsBlockDTO = z.infer; - -/** - * CutOffDatesBlockDTOSchema - * @type { object } - * @property { boolean } enabled - * @property { number } position 1-based order in the rendered document. Minimum: `1` - * @property { boolean } billOfLadingFromCustomer - * @property { boolean } billOfLadingToCarrier - * @property { boolean } customsAMS - * @property { boolean } vgmCustomer - */ -export const CutOffDatesBlockDTOSchema = z.object({ enabled: z.boolean().nullable(), position: z.number().gte(1).nullable(), billOfLadingFromCustomer: z.boolean().nullable(), billOfLadingToCarrier: z.boolean().nullable(), customsAMS: z.boolean().nullable(), vgmCustomer: z.boolean().nullable() }).partial(); -export type CutOffDatesBlockDTO = z.infer; - -/** - * TemplateBlocksResponseDTOSchema - * @type { object } - * @property { TitleBlockDTO } titleBlock - * @property { ReceiverBlockDTO } receiverBlock - * @property { OurInformationBlockDTO } ourInformationBlock - * @property { RouteTableBlockDTO } routeTableBlock - * @property { CargoTableBlockDTO } cargoTableBlock - * @property { CargoSummaryBlockDTO } cargoSummaryBlock - * @property { FinanceTableBlockDTO } financeTableBlock - * @property { RemarkBlockDTO[] } remarkBlocks - * @property { FooterBlockDTO } footerBlock - * @property { TermsBlockDTO } termsBlock - * @property { CutOffDatesBlockDTO } cutOffDatesBlock - */ -export const TemplateBlocksResponseDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema.nullable(), receiverBlock: CommonModels.ReceiverBlockDTOSchema.nullable(), ourInformationBlock: CommonModels.OurInformationBlockDTOSchema.nullable(), routeTableBlock: CommonModels.RouteTableBlockDTOSchema.nullable(), cargoTableBlock: CommonModels.CargoTableBlockDTOSchema.nullable(), cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema.nullable(), financeTableBlock: CommonModels.FinanceTableBlockDTOSchema.nullable(), remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).nullable(), footerBlock: CommonModels.FooterBlockDTOSchema.nullable(), termsBlock: CommonModels.TermsBlockDTOSchema.nullable(), cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema.nullable() }).partial(); -export type TemplateBlocksResponseDTO = z.infer; - -/** - * RouteTableProviderDtoSchema - * @type { object } - * @property { string } id Provider ID - * @property { string } name Provider name - */ -export const RouteTableProviderDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type RouteTableProviderDto = z.infer; - -/** - * RouteTablePointDtoSchema - * @type { object } - * @property { string } id Route point ID - * @property { string } type Route point type - * @property { string } datetime Route point datetime - * @property { string } secondaryDatetime Route point secondary datetime - * @property { string } address Route point address - * @property { string } name Route point address name - * @property { string } reference Route point reference - * @property { RouteTableProviderDto } provider Route point provider - * @property { string } vessel Vessel information - * @property { string } voyage Voyage information - * @property { string } carrier Carrier name - */ -export const RouteTablePointDtoSchema = z.object({ id: z.string(), type: z.string(), datetime: z.string().nullish(), secondaryDatetime: z.string().nullish(), address: z.string().nullish(), name: z.string().nullish(), reference: z.string().nullish(), provider: CommonModels.RouteTableProviderDtoSchema.nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), carrier: z.string().nullish() }); -export type RouteTablePointDto = z.infer; - -/** - * RouteTableBlockResponseDtoSchema - * @type { object } - * @property { string } selectedRouteId Selected route ID - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { boolean } showReference Show reference column - * @property { boolean } showVesselVoyage Show vessel/voyage column - * @property { boolean } showProvider Show provider column - * @property { RouteTablePointDto[] } points Route points - * @property { boolean } showAddress Show address - * @property { boolean } showDates Show dates - * @property { boolean } showType Show type - * @property { boolean } showLocation Show location - * @property { boolean } showGrid Show grid - * @property { boolean } suppressRoute Suppress route - */ -export const RouteTableBlockResponseDtoSchema = z.object({ selectedRouteId: z.string().nullish(), selectedRoutePointIds: z.array(z.string()), showReference: z.boolean(), showVesselVoyage: z.boolean(), showProvider: z.boolean(), points: z.array(CommonModels.RouteTablePointDtoSchema).nullish(), showAddress: z.boolean().nullish(), showDates: z.boolean(), showType: z.boolean(), showLocation: z.boolean(), showGrid: z.boolean(), suppressRoute: z.boolean() }); -export type RouteTableBlockResponseDto = z.infer; - -/** - * CargoSpecialtyDtoSchema - * @type { object } - * @property { string } name - * @property { string } unNumber UN number for hazardous specialty - * @property { string } IMOClass IMO class for hazardous specialty - * @property { number } temperatureFrom Temperature from (°C) for temperature-controlled specialty - * @property { number } temperatureUntil Temperature until (°C) for temperature-controlled specialty - */ -export const CargoSpecialtyDtoSchema = z.object({ name: CommonModels.PositionCargoPackageEnumSchema, unNumber: z.string().nullish(), IMOClass: z.string().nullish(), temperatureFrom: z.number().nullish(), temperatureUntil: z.number().nullish() }); -export type CargoSpecialtyDto = z.infer; - -/** - * CargoPackageDtoSchema - * @type { object } - * @property { string } id Package ID - * @property { string } description Package description - * @property { string } weight Weight - * @property { string } hsCodes HS codes (numeric only) - * @property { number } quantity Quantity - * @property { number } width Width (cm) - * @property { number } length Length (cm) - * @property { number } height Height (cm) - * @property { number } volume Total volume in m3 for this package group - * @property { string } packageType Package type name - * @property { string } caseMarks Case marks - * @property { CargoSpecialtyDto[] } specialties Package specialties - * @property { number } chargeableWeight Chargeable weight in kg - * @property { number } volumetricWeight Volumetric weight in kg - */ -export const CargoPackageDtoSchema = z.object({ id: z.string(), description: z.string().nullish(), weight: z.string().nullish(), hsCodes: z.string().nullish(), quantity: z.number().nullish(), width: z.number().nullish(), length: z.number().nullish(), height: z.number().nullish(), volume: z.number().nullish(), packageType: z.string().nullish(), caseMarks: z.string().nullish(), specialties: z.array(CommonModels.CargoSpecialtyDtoSchema).nullish(), chargeableWeight: z.number().nullish(), volumetricWeight: z.number().nullish() }); -export type CargoPackageDto = z.infer; - -/** - * CargoItemRouteDtoSchema - * @type { object } - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { RouteTablePointDto[] } points Route points - */ -export const CargoItemRouteDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()), points: z.array(CommonModels.RouteTablePointDtoSchema).nullish() }); -export type CargoItemRouteDto = z.infer; - -/** - * CargoItemDtoSchema - * @type { object } - * @property { string } cargoId Cargo ID - * @property { string } cargoType Cargo type - * @property { string } containerNumber Container number - * @property { string } seal1 First seal (sea cargo only) - * @property { string } seal2 Second seal (sea cargo only) - * @property { string } vgm Verified gross mass (VGM) for container, sea cargo only - * @property { number } totalGrossWeight Total gross weight from cargo details - * @property { number } totalVolume Total volume (m3) calculated from cargo packages - * @property { number } chargeableWeight Chargeable weight in kg for transport unit - * @property { number } volumetricWeight Volumetric weight in kg for transport unit - * @property { CargoPackageDto[] } packages Cargo packages - * @property { string[] } selectedPackageIds Selected cargo package IDs - * @property { CargoItemRouteDto } route Cargo route (when routes are split) - */ -export const CargoItemDtoSchema = z.object({ cargoId: z.string(), cargoType: z.string(), containerNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), vgm: z.string().nullish(), totalGrossWeight: z.number().nullish(), totalVolume: z.number().nullish(), chargeableWeight: z.number().nullish(), volumetricWeight: z.number().nullish(), packages: z.array(CommonModels.CargoPackageDtoSchema), selectedPackageIds: z.array(z.string()), route: CommonModels.CargoItemRouteDtoSchema.nullish() }); -export type CargoItemDto = z.infer; - -/** - * CargoTableBlockDtoSchema - * @type { object } - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { boolean } suppressWeight Suppress weight column display - * @property { boolean } showGrid Show grid borders in cargo table - * @property { boolean } suppressVolume Suppress volume column display - * @property { boolean } suppressSpecialities Suppress specialities column display - * @property { boolean } suppressDimensions Suppress dimensions column display - * @property { boolean } suppressPackageVolume Suppress package volume column display - * @property { boolean } suppressPackageWeight Suppress package weight column display - * @property { boolean } showGrandTotal Show grand total - * @property { boolean } showTransportUnitTotal Show transport unit total - * @property { boolean } showRoute Show route information (only applicable when routes are split) - * @property { boolean } suppressCargo Suppress cargo table display - * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units - * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units - * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages - * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages - * @property { boolean } showPackageHSCodes Show HS codes for packages - * @property { boolean } showPackageType Show package type for packages - * @property { boolean } showPackageQuantity Show quantity for packages - * @property { boolean } showPackageDescription Show description for packages - * @property { boolean } showPackageCaseMarks Show case marks for packages - * @property { boolean } showTransportUnitNumber Show transport unit number - * @property { boolean } showTransportUnitType Show transport unit type - * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 - * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 - * @property { CargoItemDto[] } items Cargo items - */ -export const CargoTableBlockDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).nullish(), suppressWeight: z.boolean().nullish(), showGrid: z.boolean().nullish(), suppressVolume: z.boolean().nullish(), suppressSpecialities: z.boolean().nullish(), suppressDimensions: z.boolean().nullish(), suppressPackageVolume: z.boolean().nullish(), suppressPackageWeight: z.boolean().nullish(), showGrandTotal: z.boolean().nullish(), showTransportUnitTotal: z.boolean().nullish(), showRoute: z.boolean().nullish(), suppressCargo: z.boolean().nullish(), showTransportUnitChargeableWeight: z.boolean().nullish(), showTransportUnitVolumetricWeight: z.boolean().nullish(), showPackageChargeableWeight: z.boolean().nullish(), showPackageVolumetricWeight: z.boolean().nullish(), showPackageHSCodes: z.boolean().nullish(), showPackageType: z.boolean().nullish(), showPackageQuantity: z.boolean().nullish(), showPackageDescription: z.boolean().nullish(), showPackageCaseMarks: z.boolean().nullish(), showTransportUnitNumber: z.boolean().nullish(), showTransportUnitType: z.boolean().nullish(), showTransportUnitSeal1: z.boolean().nullish(), showTransportUnitSeal2: z.boolean().nullish(), items: z.array(CommonModels.CargoItemDtoSchema) }); -export type CargoTableBlockDto = z.infer; - -/** - * SummaryCargoItemDtoSchema - * @type { object } - * @property { string } transportUnitType Cargo type name (transport unit type) - * @property { number } quantity Count of cargos for this type - * @property { string } description Comma-joined transport unit numbers or custom description - */ -export const SummaryCargoItemDtoSchema = z.object({ transportUnitType: z.string(), quantity: z.number(), description: z.string() }); -export type SummaryCargoItemDto = z.infer; - -/** - * SummaryCargoBlockResponseDtoSchema - * @type { object } - * @property { SummaryCargoItemDto[] } items - */ -export const SummaryCargoBlockResponseDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemDtoSchema) }); -export type SummaryCargoBlockResponseDto = z.infer; - -/** - * PositionAccountItemTypeEnumSchema - * @type { enum } - */ -export const PositionAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); -export type PositionAccountItemTypeEnum = z.infer; -export const PositionAccountItemTypeEnum = PositionAccountItemTypeEnumSchema.enum; - -/** - * FinanceRowDtoSchema - * @type { object } - * @property { string } id Finance row ID - * @property { PositionAccountItemTypeEnum } type Item type - * @property { string } chargeType Charge type - * @property { string } additionalText Additional text - * @property { string } text Text content - * @property { number } buyAmount Buy amount - * @property { string } buyCurrencyNotation Buy currency notation - * @property { number } sellAmount Sell amount - * @property { string } sellCurrencyNotation Sell currency notation - * @property { string } buyBPName Buy business partner name - * @property { string } sellBPName Sell business partner name - * @property { number } sellExchangeRate Sell exchange rate - * @property { number } buyExchangeRate Buy exchange rate - * @property { number } quantity Quantity - */ -export const FinanceRowDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionAccountItemTypeEnumSchema, chargeType: z.string().nullish(), additionalText: z.string().nullish(), text: z.string().nullish(), buyAmount: z.number().nullish(), buyCurrencyNotation: z.string().nullish(), sellAmount: z.number().nullish(), sellCurrencyNotation: z.string().nullish(), buyBPName: z.string().nullish(), sellBPName: z.string().nullish(), sellExchangeRate: z.number().nullish(), buyExchangeRate: z.number().nullish(), quantity: z.number().nullish() }); -export type FinanceRowDto = z.infer; - -/** - * FinanceTotalsDtoSchema - * @type { object } - * @property { number } customerTotal Customer total - * @property { number } vendorTotal Vendor total - * @property { number } combinedTotal Combined total - * @property { string } currencyNotation Currency notation - */ -export const FinanceTotalsDtoSchema = z.object({ customerTotal: z.number().nullable(), vendorTotal: z.number().nullable(), combinedTotal: z.number().nullable(), currencyNotation: z.string().nullable() }).partial(); -export type FinanceTotalsDto = z.infer; - -/** - * FinanceTotalsByCurrencyDtoSchema - * @type { object } - * @property { string } currencyNotation Currency notation - * @property { number } vendorTotal Total for vendor side in this currency - * @property { number } customerTotal Total for customer side in this currency - */ -export const FinanceTotalsByCurrencyDtoSchema = z.object({ currencyNotation: z.string(), vendorTotal: z.number().nullish(), customerTotal: z.number().nullish() }); -export type FinanceTotalsByCurrencyDto = z.infer; - -/** - * FinanceTablePositionDtoSchema - * @type { object } - * @property { FinanceRowDto[] } rows Finance rows - * @property { FinanceTotalsDto } totals Finance totals - * @property { string[] } selectedFinanceRowIds Selected finance row IDs - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency - */ -export const FinanceTablePositionDtoSchema = z.object({ rows: z.array(CommonModels.FinanceRowDtoSchema).nullable(), totals: CommonModels.FinanceTotalsDtoSchema.nullable(), selectedFinanceRowIds: z.array(z.string()).nullable(), positionId: z.string().nullable(), positionNumber: z.string().nullable(), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).nullable() }).partial(); -export type FinanceTablePositionDto = z.infer; - -/** - * FinanceTableBlockDtoSchema - * @type { object } - * @property { string } selectedBpId Selected business partner ID - * @property { boolean } showVendor Show vendor - * @property { boolean } showBuyRate Show buy rate - * @property { boolean } showCustomer Show customer - * @property { boolean } showSellRate Show sell rate - * @property { boolean } showGrid Show grid - * @property { boolean } showCharges Show charges - * @property { boolean } showAdditionalText Show additional text - * @property { boolean } showQuantity Show quantity - * @property { boolean } showTotalsByCurrency Show totals grouped by currency - * @property { boolean } suppressFinances Suppress finances from output - * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero - * @property { boolean } showTotal Show total from output - * @property { boolean } showProfit Show profit from output - * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output - * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output - * @property { boolean } includeSubPositions Include sub-positions - * @property { boolean } subPositionTotals Show sub-position totals - * @property { FinanceTablePositionDto[] } positions Finance positions - * @property { FinanceTotalsDto } totals Finance totals - * @property { FinanceTotalsByCurrencyDto[] } totalsByCurrency Totals grouped by currency - */ -export const FinanceTableBlockDtoSchema = z.object({ selectedBpId: z.string().nullable(), showVendor: z.boolean().nullable(), showBuyRate: z.boolean().nullable(), showCustomer: z.boolean().nullable(), showSellRate: z.boolean().nullable(), showGrid: z.boolean().nullable(), showCharges: z.boolean().nullable(), showAdditionalText: z.boolean().nullable(), showQuantity: z.boolean().nullable(), showTotalsByCurrency: z.boolean().nullable(), suppressFinances: z.boolean().nullable(), suppressZeroLines: z.boolean().nullable(), showTotal: z.boolean().nullable(), showProfit: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean().nullable(), showSellRateExchangeRates: z.boolean().nullable(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), positions: z.array(CommonModels.FinanceTablePositionDtoSchema).nullable(), totals: CommonModels.FinanceTotalsDtoSchema.nullable(), totalsByCurrency: z.array(CommonModels.FinanceTotalsByCurrencyDtoSchema).nullable() }).partial(); -export type FinanceTableBlockDto = z.infer; - -/** - * RemarkBlockDtoSchema - * @type { object } - * @property { string } id - * @property { number } position Minimum: `1` - * @property { EditorContentUpdateDto } content - * @property { boolean } enabled - */ -export const RemarkBlockDtoSchema = z.object({ id: z.string(), position: z.number().gte(1), content: CommonModels.EditorContentUpdateDtoSchema, enabled: z.boolean().nullish() }); -export type RemarkBlockDto = z.infer; - -/** - * ConfigBlockDtoSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - * @property { boolean } showWatermarkOnDocuments Show watermark on documents - * @property { LocaleEnum } locale - */ -export const ConfigBlockDtoSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable(), showWatermarkOnDocuments: z.boolean().nullable(), locale: CommonModels.LocaleEnumSchema.nullable() }).partial(); -export type ConfigBlockDto = z.infer; - -/** - * TitleBlockUpdateDtoSchema - * @type { object } - * @property { string } value Title value - */ -export const TitleBlockUpdateDtoSchema = z.object({ value: z.string().nullable() }).partial(); -export type TitleBlockUpdateDto = z.infer; - -/** - * ReceiverBlockUpdateDtoSchema - * @type { object } - * @property { string } selectedBpId Receiver business partner ID - * @property { string } address Receiver address - */ -export const ReceiverBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().nullable(), address: z.string().nullable() }).partial(); -export type ReceiverBlockUpdateDto = z.infer; - -/** - * OurInformationBlockUpdateDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } phone Phone number - * @property { string } date Date - * @property { string } bookingNumber Booking number - * @property { string } customerReference Customer reference - * @property { string } masterBillOfLadingNumber Master bill of lading number - * @property { string } houseBillOfLadingNumber House bill of lading number - * @property { string } positionNumber Position number - */ -export const OurInformationBlockUpdateDtoSchema = z.object({ name: z.string().nullable(), phone: z.string().nullable(), date: z.string().nullable(), bookingNumber: z.string().nullable(), customerReference: z.string().nullable(), masterBillOfLadingNumber: z.string().nullable(), houseBillOfLadingNumber: z.string().nullable(), positionNumber: z.string().nullable() }).partial(); -export type OurInformationBlockUpdateDto = z.infer; - -/** - * TermsBlockDtoSchema - * @type { object } - * @property { string } termsImageUrl Terms image URL - */ -export const TermsBlockDtoSchema = z.object({ termsImageUrl: z.string().nullable() }).partial(); -export type TermsBlockDto = z.infer; - -/** - * CutOffDatesBlockUpdateDtoSchema - * @type { object } - * @property { string } billOfLadingFromCustomer Bill of lading from customer date - * @property { string } billOfLadingToCarrier Bill of lading to carrier date - * @property { string } customsAMS Customs AMS date - * @property { string } vgmCustomer VGM customer date - */ -export const CutOffDatesBlockUpdateDtoSchema = z.object({ billOfLadingFromCustomer: z.string().nullable(), billOfLadingToCarrier: z.string().nullable(), customsAMS: z.string().nullable(), vgmCustomer: z.string().nullable() }).partial(); -export type CutOffDatesBlockUpdateDto = z.infer; - -/** - * TemplatedDocumentDataDtoSchema - * @type { object } - * @property { TitleBlockUpdateDto } title Title block data - * @property { ReceiverBlockUpdateDto } receiver Receiver block data - * @property { OurInformationBlockUpdateDto } ourInformation Our information block data - * @property { RouteTableBlockResponseDto } routeTable Route table block data - * @property { CargoTableBlockDto } cargoTable Cargo table block data - * @property { SummaryCargoBlockResponseDto } summaryCargo Summary cargo block data - * @property { FinanceTableBlockDto } financeTable Finance table block data - * @property { RemarkBlockDto[] } remarks Remark blocks - * @property { TermsBlockDto } terms Terms block data - * @property { ConfigBlockDto } config Config block data - * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data - */ -export const TemplatedDocumentDataDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.nullable(), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.nullable(), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.nullable(), routeTable: CommonModels.RouteTableBlockResponseDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockDtoSchema.nullable(), summaryCargo: CommonModels.SummaryCargoBlockResponseDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockDtoSchema.nullable(), remarks: z.array(CommonModels.RemarkBlockDtoSchema).nullable(), terms: CommonModels.TermsBlockDtoSchema.nullable(), config: CommonModels.ConfigBlockDtoSchema.nullable(), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.nullable() }).partial(); -export type TemplatedDocumentDataDto = z.infer; - -/** - * RouteTableUpdateBlockDtoSchema - * @type { object } - * @property { string } selectedRouteId Selected route ID - * @property { string[] } selectedRoutePointIds Selected route point IDs - * @property { boolean } showReference Show reference column - * @property { boolean } showVesselVoyage Show vessel/voyage column - * @property { boolean } showProvider Show provider column - * @property { RouteTablePointDto[] } points Route points - * @property { boolean } showAddress Show address - * @property { boolean } showDates Show dates - * @property { boolean } showType Show type - * @property { boolean } showLocation Show location - * @property { boolean } showGrid Show grid - * @property { boolean } suppressRoute Suppress route - */ -export const RouteTableUpdateBlockDtoSchema = z.object({ selectedRouteId: z.string().nullable(), selectedRoutePointIds: z.array(z.string()).nullable(), showReference: z.boolean().nullable(), showVesselVoyage: z.boolean().nullable(), showProvider: z.boolean().nullable(), points: z.array(CommonModels.RouteTablePointDtoSchema).nullable(), showAddress: z.boolean().nullable(), showDates: z.boolean().nullable(), showType: z.boolean().nullable(), showLocation: z.boolean().nullable(), showGrid: z.boolean().nullable(), suppressRoute: z.boolean().nullable() }).partial(); -export type RouteTableUpdateBlockDto = z.infer; - -/** - * CargoItemRouteUpdateDtoSchema - * @type { object } - * @property { string[] } selectedRoutePointIds Selected route point IDs - */ -export const CargoItemRouteUpdateDtoSchema = z.object({ selectedRoutePointIds: z.array(z.string()) }); -export type CargoItemRouteUpdateDto = z.infer; - -/** - * CargoItemUpdateDtoSchema - * @type { object } - * @property { string } cargoId Cargo ID to update packages for - * @property { string[] } selectedPackageIds Selected cargo package IDs - * @property { CargoItemRouteUpdateDto } route Cargo route (when routes are split) - */ -export const CargoItemUpdateDtoSchema = z.object({ cargoId: z.string().nullable(), selectedPackageIds: z.array(z.string()).nullable(), route: CommonModels.CargoItemRouteUpdateDtoSchema.nullable() }).partial(); -export type CargoItemUpdateDto = z.infer; - -/** - * CargoTableBlockUpdateDtoSchema - * @type { object } - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { CargoItemUpdateDto[] } items Cargo items for package updates - * @property { boolean } suppressWeight Suppress weight column display - * @property { boolean } showGrid Show grid borders in cargo table - * @property { boolean } suppressVolume Suppress volume column display - * @property { boolean } suppressSpecialities Suppress specialities column display - * @property { boolean } suppressDimensions Suppress dimensions column display - * @property { boolean } suppressPackageVolume Suppress package volume column display - * @property { boolean } suppressPackageWeight Suppress package weight column display - * @property { boolean } showRoute Show route information (only applicable when routes are split) - * @property { boolean } showGrandTotal Show grand total - * @property { boolean } showTransportUnitTotal Show transport unit total - * @property { boolean } suppressCargo Suppress cargo table display - * @property { boolean } showTransportUnitChargeableWeight Show chargeable weight for transport units - * @property { boolean } showTransportUnitVolumetricWeight Show volumetric weight for transport units - * @property { boolean } showPackageChargeableWeight Show chargeable weight for packages - * @property { boolean } showPackageVolumetricWeight Show volumetric weight for packages - * @property { boolean } showPackageHSCodes Show HS codes for packages - * @property { boolean } showPackageType Show package type for packages - * @property { boolean } showPackageQuantity Show quantity for packages - * @property { boolean } showPackageDescription Show description for packages - * @property { boolean } showPackageCaseMarks Show case marks for packages - * @property { boolean } showTransportUnitNumber Show transport unit number - * @property { boolean } showTransportUnitType Show transport unit type - * @property { boolean } showTransportUnitSeal1 Show transport unit seal 1 - * @property { boolean } showTransportUnitSeal2 Show transport unit seal 2 - */ -export const CargoTableBlockUpdateDtoSchema = z.object({ selectedCargoIds: z.array(z.string()).nullable(), items: z.array(CommonModels.CargoItemUpdateDtoSchema).nullable(), suppressWeight: z.boolean().nullable(), showGrid: z.boolean().nullable(), suppressVolume: z.boolean().nullable(), suppressSpecialities: z.boolean().nullable(), suppressDimensions: z.boolean().nullable(), suppressPackageVolume: z.boolean().nullable(), suppressPackageWeight: z.boolean().nullable(), showRoute: z.boolean().nullable(), showGrandTotal: z.boolean().nullable(), showTransportUnitTotal: z.boolean().nullable(), suppressCargo: z.boolean().nullable(), showTransportUnitChargeableWeight: z.boolean().nullable(), showTransportUnitVolumetricWeight: z.boolean().nullable(), showPackageChargeableWeight: z.boolean().nullable(), showPackageVolumetricWeight: z.boolean().nullable(), showPackageHSCodes: z.boolean().nullable(), showPackageType: z.boolean().nullable(), showPackageQuantity: z.boolean().nullable(), showPackageDescription: z.boolean().nullable(), showPackageCaseMarks: z.boolean().nullable(), showTransportUnitNumber: z.boolean().nullable(), showTransportUnitType: z.boolean().nullable(), showTransportUnitSeal1: z.boolean().nullable(), showTransportUnitSeal2: z.boolean().nullable() }).partial(); -export type CargoTableBlockUpdateDto = z.infer; - -/** - * SummaryCargoItemUpdateDtoSchema - * @type { object } - * @property { string } transportUnitType Cargo type name (transport unit type) - * @property { string } description Updated description for this cargo type - */ -export const SummaryCargoItemUpdateDtoSchema = z.object({ transportUnitType: z.string(), description: z.string() }); -export type SummaryCargoItemUpdateDto = z.infer; - -/** - * SummaryCargoBlockUpdateDtoSchema - * @type { object } - * @property { SummaryCargoItemUpdateDto[] } items - */ -export const SummaryCargoBlockUpdateDtoSchema = z.object({ items: z.array(CommonModels.SummaryCargoItemUpdateDtoSchema) }); -export type SummaryCargoBlockUpdateDto = z.infer; - -/** - * FinanceTablePositionUpdateDtoSchema - * @type { object } - * @property { string[] } selectedFinanceRowIds Selected finance row IDs - * @property { string } positionId Position ID - */ -export const FinanceTablePositionUpdateDtoSchema = z.object({ selectedFinanceRowIds: z.array(z.string()).nullable(), positionId: z.string().nullable() }).partial(); -export type FinanceTablePositionUpdateDto = z.infer; - -/** - * FinanceTableBlockUpdateDtoSchema - * @type { object } - * @property { string } selectedBpId Selected business partner ID - * @property { boolean } showVendor Show vendor - * @property { boolean } showBuyRate Show buy rate - * @property { boolean } showCustomer Show customer - * @property { boolean } showSellRate Show sell rate - * @property { boolean } showGrid Show grid - * @property { boolean } showCharges Show charges - * @property { boolean } showAdditionalText Show additional text - * @property { boolean } showQuantity Show quantity - * @property { boolean } showTotalsByCurrency Show totals grouped by currency - * @property { boolean } suppressFinances Suppress finances from output - * @property { boolean } suppressZeroLines Suppress rows where the amounts are zero - * @property { boolean } showTotal Show total from output - * @property { boolean } showProfit Show profit from output - * @property { boolean } showBuyRateExchangeRates Show buy rate exchange rates from output - * @property { boolean } showSellRateExchangeRates Show sell rate exchange rates from output - * @property { boolean } includeSubPositions Include sub-positions - * @property { boolean } subPositionTotals Show sub-position totals - * @property { FinanceTablePositionUpdateDto[] } positions Finance positions - */ -export const FinanceTableBlockUpdateDtoSchema = z.object({ selectedBpId: z.string().nullable(), showVendor: z.boolean().nullable(), showBuyRate: z.boolean().nullable(), showCustomer: z.boolean().nullable(), showSellRate: z.boolean().nullable(), showGrid: z.boolean().nullable(), showCharges: z.boolean().nullable(), showAdditionalText: z.boolean().nullable(), showQuantity: z.boolean().nullable(), showTotalsByCurrency: z.boolean().nullable(), suppressFinances: z.boolean().nullable(), suppressZeroLines: z.boolean().nullable(), showTotal: z.boolean().nullable(), showProfit: z.boolean().nullable(), showBuyRateExchangeRates: z.boolean().nullable(), showSellRateExchangeRates: z.boolean().nullable(), includeSubPositions: z.boolean().nullable(), subPositionTotals: z.boolean().nullable(), positions: z.array(CommonModels.FinanceTablePositionUpdateDtoSchema).nullable() }).partial(); -export type FinanceTableBlockUpdateDto = z.infer; - -/** - * RemarkBlockUpdateDtoSchema - * @type { object } - * @property { string } id - * @property { number } position Minimum: `1` - * @property { EditorContentUpdateDto } content - * @property { boolean } enabled - */ -export const RemarkBlockUpdateDtoSchema = z.object({ id: z.string(), position: z.number().gte(1).nullish(), content: CommonModels.EditorContentUpdateDtoSchema.nullish(), enabled: z.boolean().nullish() }); -export type RemarkBlockUpdateDto = z.infer; - -/** - * TemplatedDocumentDataUpdateDtoSchema - * @type { object } - * @property { TitleBlockUpdateDto } title Title block data - * @property { ReceiverBlockUpdateDto } receiver Receiver block data - * @property { OurInformationBlockUpdateDto } ourInformation Our information block data - * @property { RouteTableUpdateBlockDto } routeTable Route table block data - * @property { CargoTableBlockUpdateDto } cargoTable Cargo table block data - * @property { SummaryCargoBlockUpdateDto } summaryCargo Summary cargo block data - * @property { FinanceTableBlockUpdateDto } financeTable Finance table block data - * @property { RemarkBlockUpdateDto[] } remarks Remark blocks - * @property { CutOffDatesBlockUpdateDto } cutOffDates Cut off dates block data - */ -export const TemplatedDocumentDataUpdateDtoSchema = z.object({ title: CommonModels.TitleBlockUpdateDtoSchema.nullable(), receiver: CommonModels.ReceiverBlockUpdateDtoSchema.nullable(), ourInformation: CommonModels.OurInformationBlockUpdateDtoSchema.nullable(), routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.nullable(), summaryCargo: CommonModels.SummaryCargoBlockUpdateDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.nullable(), remarks: z.array(CommonModels.RemarkBlockUpdateDtoSchema).nullable(), cutOffDates: CommonModels.CutOffDatesBlockUpdateDtoSchema.nullable() }).partial(); -export type TemplatedDocumentDataUpdateDto = z.infer; - -/** - * BusinessPartnerTypeSchema - * @type { enum } - */ -export const BusinessPartnerTypeSchema = z.enum(["businessPartner", "destinationAgent", "oceanCarrier", "office", "customsAgent", "stuffingStrippingProvider", "shipper", "fobForwarder", "routingAgent", "transportProvider", "originServiceProvider", "insuranceProvider", "consignee", "courier", "trucker", "airline", "originAgent"]); -export type BusinessPartnerType = z.infer; -export const BusinessPartnerType = BusinessPartnerTypeSchema.enum; - -/** - * BusinessPartnerAddressCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BusinessPartnerAddressCityDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type BusinessPartnerAddressCityDto = z.infer; - -/** - * BusinessPartnerAddressCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const BusinessPartnerAddressCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type BusinessPartnerAddressCountryDto = z.infer; - -/** - * BusinessPartnerAddressResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the address - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street information - * @property { string } zip ZIP/Postal code - * @property { BusinessPartnerAddressCityDto } city Country data - * @property { string } district District information - * @property { BusinessPartnerAddressCountryDto } country Country data - */ -export const BusinessPartnerAddressResponseDTOSchema = z.object({ id: z.string(), street: z.string(), secondaryStreet: z.string(), zip: z.string(), city: CommonModels.BusinessPartnerAddressCityDtoSchema, district: z.string(), country: CommonModels.BusinessPartnerAddressCountryDtoSchema }); -export type BusinessPartnerAddressResponseDTO = z.infer; - -/** - * EditorContentResponseDtoSchema - * @type { object } - * @property { string } html HTML content - * @property { object } json JSON content - * @property { any } json.[key] - */ -export const EditorContentResponseDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); -export type EditorContentResponseDto = z.infer; - -/** - * DunningSystemReferenceDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } isDefault - */ -export const DunningSystemReferenceDTOSchema = z.object({ id: z.string(), name: z.string(), isDefault: z.boolean() }); -export type DunningSystemReferenceDTO = z.infer; - -/** - * TransportModeEnumSchema - * @type { enum } - */ -export const TransportModeEnumSchema = z.enum(["Air", "Sea", "Road"]); -export type TransportModeEnum = z.infer; -export const TransportModeEnum = TransportModeEnumSchema.enum; - -/** - * SeaRoutingEnumSchema - * @type { enum } - */ -export const SeaRoutingEnumSchema = z.enum(["Direct", "Transhipment"]); -export type SeaRoutingEnum = z.infer; -export const SeaRoutingEnum = SeaRoutingEnumSchema.enum; - -/** - * InvolvedPartyBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { BusinessPartnerAddressResponseDTO } address Main address information - */ -export const InvolvedPartyBusinessPartnerResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), address: CommonModels.BusinessPartnerAddressResponseDTOSchema.nullish() }); -export type InvolvedPartyBusinessPartnerResponseDTO = z.infer; - -/** - * InvolvedPartyContactResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvolvedPartyContactResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type InvolvedPartyContactResponseDTO = z.infer; - -/** - * InvolvedPartyResponseDtoSchema - * @type { object } - * @property { string } id - * @property { PositionInvolvedPartyTypeEnum } type - * @property { string } reference - * @property { InvolvedPartyBusinessPartnerResponseDTO } businessPartner - * @property { InvolvedPartyContactResponseDTO } contact - */ -export const InvolvedPartyResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.PositionInvolvedPartyTypeEnumSchema, reference: z.string().nullish(), businessPartner: CommonModels.InvolvedPartyBusinessPartnerResponseDTOSchema.nullish(), contact: CommonModels.InvolvedPartyContactResponseDTOSchema.nullish() }); -export type InvolvedPartyResponseDto = z.infer; - -/** - * CreateInvolvedPartyRequestDtoSchema - * @type { object } - * @property { PositionInvolvedPartyTypeEnum } type Type of the involved party to create - */ -export const CreateInvolvedPartyRequestDtoSchema = z.object({ type: CommonModels.PositionInvolvedPartyTypeEnumSchema }); -export type CreateInvolvedPartyRequestDto = z.infer; - -/** - * RouteLocationTypeEnumSchema - * @type { enum } - */ -export const RouteLocationTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Port", "Terminal", "City", "Warehouse", "ContainerYard", "Airport"]); -export type RouteLocationTypeEnum = z.infer; -export const RouteLocationTypeEnum = RouteLocationTypeEnumSchema.enum; - -/** - * RoutePointLocationResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { RouteLocationTypeEnum } type - */ -export const RoutePointLocationResponseDtoSchema = z.object({ id: z.string(), name: z.string(), type: CommonModels.RouteLocationTypeEnumSchema.nullable() }); -export type RoutePointLocationResponseDto = z.infer; - -/** - * RoutePointTypeEnumSchema - * @type { enum } - */ -export const RoutePointTypeEnumSchema = z.enum(["EmptyContainerDepot", "LoadingAddress", "Stop", "FumigationStop", "OriginCustomsStop", "StuffingLocation", "PortTerminal", "PortOfLoading", "TransshipmentPort", "PortOfDischarge", "StrippingLocation", "ContainerYard", "DestinationCustomsStop", "FinalDestination", "EmptyContainerReturn", "OriginAgent", "HandlingAgent", "XRay", "CustomsBroker", "AirportOfDeparture", "StopAirport", "DestinationAirport", "CustomsStop", "DestinationAgent", "DeliveryAddress", "Courier", "PickupAddress", "StopAddress"]); -export type RoutePointTypeEnum = z.infer; -export const RoutePointTypeEnum = RoutePointTypeEnumSchema.enum; - -/** - * IncotermsEnumSchema - * @type { enum } - */ -export const IncotermsEnumSchema = z.enum(["EXW", "FCA", "CPT", "CIP", "DAP", "DPU", "DDP", "FAS", "FOB", "CFR", "CIF"]); -export type IncotermsEnum = z.infer; -export const IncotermsEnum = IncotermsEnumSchema.enum; - -/** - * PositionRouteTransportModeEnumSchema - * @type { enum } - */ -export const PositionRouteTransportModeEnumSchema = z.enum(["Truck", "Rail/Truck", "Rail", "Barge"]); -export type PositionRouteTransportModeEnum = z.infer; -export const PositionRouteTransportModeEnum = PositionRouteTransportModeEnumSchema.enum; - -/** - * RoutePointProviderResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const RoutePointProviderResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type RoutePointProviderResponseDto = z.infer; - -/** - * RoutePointResponseDtoSchema - * @type { object } - * @property { string } id - * @property { RoutePointTypeEnum } type - * @property { string } name - * @property { number } sequenceNumber - * @property { RoutePointLocationResponseDto } location - * @property { string } estimatedTime - * @property { string } secondaryEstimatedTime Secondary estimated time (sea positions only) - * @property { string } reference - * @property { string } secondaryReference - * @property { IncotermsEnum } incoterm - * @property { PositionRouteTransportModeEnum } transportMode - * @property { RoutePointProviderResponseDto } provider - * @property { string } vessel Vessel name (sea positions only) - * @property { string } voyage Voyage number (sea positions only) - * @property { string } carrier Carrier name (sea positions only) - */ -export const RoutePointResponseDtoSchema = z.object({ id: z.string(), type: CommonModels.RoutePointTypeEnumSchema, name: z.string(), sequenceNumber: z.number(), location: CommonModels.RoutePointLocationResponseDtoSchema.nullish(), estimatedTime: z.iso.datetime({ offset: true }).nullish(), secondaryEstimatedTime: z.iso.datetime({ offset: true }).nullish(), reference: z.string().nullish(), secondaryReference: z.string().nullish(), incoterm: CommonModels.IncotermsEnumSchema.nullish(), transportMode: CommonModels.PositionRouteTransportModeEnumSchema.nullish(), provider: CommonModels.RoutePointProviderResponseDtoSchema.nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), carrier: z.string().nullish() }); -export type RoutePointResponseDto = z.infer; - -/** - * RouteResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } cargoId Cargo ID (sea positions only) - * @property { string } cargoNumber Cargo number (sea positions only) - * @property { RoutePointResponseDto[] } points - */ -export const RouteResponseDtoSchema = z.object({ id: z.string(), cargoId: z.string().nullish(), cargoNumber: z.string().nullish(), points: z.array(CommonModels.RoutePointResponseDtoSchema) }); -export type RouteResponseDto = z.infer; - -/** - * RouteListResponseDtoSchema - * @type { object } - * @property { RouteResponseDto[] } routes - * @property { boolean } splitRoute Whether the position routes are split by cargo (sea positions only) - */ -export const RouteListResponseDtoSchema = z.object({ routes: z.array(CommonModels.RouteResponseDtoSchema), splitRoute: z.boolean() }); -export type RouteListResponseDto = z.infer; - -/** - * CreateRoutePointRequestDtoSchema - * @type { object } - * @property { RoutePointTypeEnum } type - */ -export const CreateRoutePointRequestDtoSchema = z.object({ type: CommonModels.RoutePointTypeEnumSchema }); -export type CreateRoutePointRequestDto = z.infer; - -/** - * UpdateRoutePointRequestDtoSchema - * @type { object } - * @property { string } locationId Location ID for the route point - * @property { RouteLocationTypeEnum } locationType Type of location - * @property { string } estimatedTime Updated estimated time for the route point - * @property { string } secondaryEstimatedTime Secondary estimated time for the route point (sea positions only) - * @property { string } reference Reference for the route point - * @property { string } secondaryReference Secondary reference for the route point - * @property { IncotermsEnum } incoterm - * @property { PositionRouteTransportModeEnum } transportMode - * @property { string } providerId - * @property { string } vessel Vessel name (sea positions only) - * @property { string } voyage Voyage number (sea positions only) - * @property { string } carrier Carrier name (sea positions only) - */ -export const UpdateRoutePointRequestDtoSchema = z.object({ locationId: z.string().nullable(), locationType: CommonModels.RouteLocationTypeEnumSchema.nullable(), estimatedTime: z.iso.datetime({ offset: true }).nullable(), secondaryEstimatedTime: z.iso.datetime({ offset: true }).nullable(), reference: z.string().nullable(), secondaryReference: z.string().nullable(), incoterm: CommonModels.IncotermsEnumSchema.nullable(), transportMode: CommonModels.PositionRouteTransportModeEnumSchema.nullable(), providerId: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), carrier: z.string().nullable() }).partial(); -export type UpdateRoutePointRequestDto = z.infer; - -/** - * PositionChargeDtoResponseSchema - * @type { object } - * @property { object } chargeType - * @property { string } chargeType.id - * @property { string } chargeType.name - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { object } buyVatRule - * @property { string } buyVatRule.id - * @property { string } buyVatRule.name - * @property { string } buyVatRule.matchcode - * @property { object } vendor - * @property { string } vendor.id - * @property { string } vendor.name - * @property { string } vendor.matchCode - * @property { string } vendor.label - * @property { string } vendor.debtorId - * @property { string } vendor.creditorId - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { object } sellVatRule - * @property { string } sellVatRule.id - * @property { string } sellVatRule.name - * @property { string } sellVatRule.matchcode - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { string } customer.debtorId - * @property { string } customer.creditorId - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - * @property { number } profit Profit amount - * @property { string } profitCurrencyCode Profit currency code - */ -export const PositionChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }).nullish(), additionalText: z.string(), quantity: z.number().nullish(), buyRate: z.number().nullish(), buyCurrencyCode: z.string(), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).nullish(), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).nullish(), buyExchangeRate: z.number().nullish(), sellRate: z.number().nullish(), sellCurrencyCode: z.string(), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string() }).nullish(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), debtorId: z.string().nullish(), creditorId: z.string().nullish() }).nullish(), sellExchangeRate: z.number().nullish(), profit: z.number().nullish(), profitCurrencyCode: z.string().nullish() }); -export type PositionChargeDtoResponse = z.infer; - -/** - * PositionTextDtoResponseSchema - * @type { object } - * @property { string } content Text content - */ -export const PositionTextDtoResponseSchema = z.object({ content: z.string() }); -export type PositionTextDtoResponse = z.infer; - -/** - * PositionAccountItemDtoResponseSchema - * @type { object } - * @property { string } id Item ID - * @property { string } outgoingInvoiceId - * @property { string } registeredInvoiceId - * @property { PositionAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { PositionChargeDtoResponse } charge Charge data if type is CHARGE - * @property { PositionTextDtoResponse } text Text data if type is TEXT - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - */ -export const PositionAccountItemDtoResponseSchema = z.object({ id: z.string(), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish(), type: CommonModels.PositionAccountItemTypeEnumSchema, orderPosition: z.number(), charge: CommonModels.PositionChargeDtoResponseSchema.nullish(), text: CommonModels.PositionTextDtoResponseSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }); -export type PositionAccountItemDtoResponse = z.infer; - -/** - * UserPreviewDtoSchema - * @type { object } - * @property { string } userId - * @property { string } name - */ -export const UserPreviewDtoSchema = z.object({ userId: z.string(), name: z.string() }); -export type UserPreviewDto = z.infer; - -/** - * HBLDocumentConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - * @property { string } blTermsAndConditionsImageUrl BL terms and conditions image URL - * @property { string } signatureImageUrl Signature image URL - * @property { boolean } hasSignatureImage Whether office has a signature image configured - */ -export const HBLDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable(), blTermsAndConditionsImageUrl: z.string().nullable(), signatureImageUrl: z.string().nullable(), hasSignatureImage: z.boolean().nullable() }).partial(); -export type HBLDocumentConfigDto = z.infer; - -/** - * DirectionEnumSchema - * @type { enum } - */ -export const DirectionEnumSchema = z.enum(["Import", "Export"]); -export type DirectionEnum = z.infer; -export const DirectionEnum = DirectionEnumSchema.enum; - -/** - * HazardousPackingGroupEnumSchema - * @type { enum } - */ -export const HazardousPackingGroupEnumSchema = z.enum(["PG I", "PG II", "PG III"]); -export type HazardousPackingGroupEnum = z.infer; -export const HazardousPackingGroupEnum = HazardousPackingGroupEnumSchema.enum; - -/** - * PositionCargoPackageHazardousSpecialtyResponseDTOSchema - * @type { object } - * @property { number } totalLength - * @property { number } totalWidth - * @property { number } temperature - * @property { string } unNumber - * @property { string } IMOClass - * @property { string } shippingName - * @property { string } technicalName - * @property { HazardousPackingGroupEnum } packagingGroup - * @property { number } netWeight - * @property { number } flashpoint - * @property { string[] } properties - * @property { string } acceptanceNumber - * @property { string } medGuide - * @property { string } emergencyPhone - * @property { string } emergencySchedule - */ -export const PositionCargoPackageHazardousSpecialtyResponseDTOSchema = z.object({ totalLength: z.number().nullable(), totalWidth: z.number().nullable(), temperature: z.number().nullable(), unNumber: z.string().nullable(), IMOClass: z.string().nullable(), shippingName: z.string().nullable(), technicalName: z.string().nullable(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.nullable(), netWeight: z.number().nullable(), flashpoint: z.number().nullable(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).nullable(), acceptanceNumber: z.string().nullable(), medGuide: z.string().nullable(), emergencyPhone: z.string().nullable(), emergencySchedule: z.string().nullable() }).partial(); -export type PositionCargoPackageHazardousSpecialtyResponseDTO = z.infer; - -/** - * PositionCargoPackageTypeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionCargoPackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type PositionCargoPackageTypeResponseDTO = z.infer; - -/** - * HsCodeLabelDtoSchema - * @type { object } - * @property { string } id - * @property { string } label - */ -export const HsCodeLabelDtoSchema = z.object({ id: z.string(), label: z.string() }); -export type HsCodeLabelDto = z.infer; - -/** - * PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema - * @type { object } - * @property { number } temperatureFrom - * @property { number } temperatureUntil - */ -export const PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema = z.object({ temperatureFrom: z.number().nullable(), temperatureUntil: z.number().nullable() }).partial(); -export type PositionCargoPackageTemperatureControlledSpecialtyResponseDto = z.infer; - -/** - * PositionCargoSourcePackageResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } positionNumber - */ -export const PositionCargoSourcePackageResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string() }); -export type PositionCargoSourcePackageResponseDTO = z.infer; - -/** - * PositionCargoPackageResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } cargoId - * @property { string } rootFolderId - * @property { number } quantity - * @property { string } packageTypeId - * @property { PositionCargoPackageTypeResponseDTO } packageType - * @property { number } length - * @property { number } width - * @property { number } height - * @property { number } netWeight - * @property { number } grossWeight - * @property { number } chargeableWeight - * @property { string } note - * @property { string } name - * @property { number } orderNumber - * @property { number } volume - * @property { number } volumetricWeight - * @property { string } caseMarks - * @property { string } description - * @property { string[] } hsCodes - * @property { HsCodeLabelDto[] } hsCodeLabels HS code details - * @property { string } customsRemarks - * @property { number } loadMeter - * @property { string[] } specialties - * @property { PositionCargoPackageHazardousSpecialtyResponseDTO } hazardousSpecialty - * @property { PositionCargoPackageTemperatureControlledSpecialtyResponseDto } temperatureControlledSpecialty - * @property { PositionCargoSourcePackageResponseDTO } sourcePackage - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const PositionCargoPackageResponseDTOSchema = z.object({ id: z.string(), cargoId: z.string(), rootFolderId: z.string().nullish(), quantity: z.number().nullish(), packageTypeId: z.string().nullish(), packageType: CommonModels.PositionCargoPackageTypeResponseDTOSchema.nullish(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), netWeight: z.number().nullish(), grossWeight: z.number().nullish(), chargeableWeight: z.number().nullish(), note: z.string().nullish(), name: z.string().nullish(), orderNumber: z.number().nullish(), volume: z.number().nullish(), volumetricWeight: z.number().nullish(), caseMarks: z.string().nullish(), description: z.string().nullish(), hsCodes: z.array(z.string()).nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).nullish(), customsRemarks: z.string().nullish(), loadMeter: z.number().nullish(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema), hazardousSpecialty: CommonModels.PositionCargoPackageHazardousSpecialtyResponseDTOSchema.nullish(), temperatureControlledSpecialty: CommonModels.PositionCargoPackageTemperatureControlledSpecialtyResponseDtoSchema.nullish(), sourcePackage: CommonModels.PositionCargoSourcePackageResponseDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), mrn: z.string().nullish(), exportPortFilling: z.string().nullish(), customsReleased: z.boolean().nullish(), importCustomsReleaseNumber: z.string().nullish(), portCustomsNumber: z.string().nullish() }); -export type PositionCargoPackageResponseDTO = z.infer; - -/** - * PackageTotalsDtoSchema - * @type { object } - * @property { number } quantity - * @property { number } weightPerPiece - * @property { number } volume - * @property { number } chargeableWeight - * @property { number } loadMeter - */ -export const PackageTotalsDtoSchema = z.object({ quantity: z.number(), weightPerPiece: z.number(), volume: z.number(), chargeableWeight: z.number().nullish(), loadMeter: z.number().nullish() }); -export type PackageTotalsDto = z.infer; - -/** - * PackageSpecialtyTotalsResponseDtoSchema - * @type { object } - * @property { PackageTotalsDto } noSpecialties - * @property { PackageTotalsDto } hazardous - * @property { PackageTotalsDto } nonStackable - * @property { PackageTotalsDto } temperatureControlled - * @property { PackageTotalsDto } diplomatic - * @property { PackageTotalsDto } oversized - * @property { PackageTotalsDto } total - */ -export const PackageSpecialtyTotalsResponseDtoSchema = z.object({ noSpecialties: CommonModels.PackageTotalsDtoSchema, hazardous: CommonModels.PackageTotalsDtoSchema, nonStackable: CommonModels.PackageTotalsDtoSchema, temperatureControlled: CommonModels.PackageTotalsDtoSchema, diplomatic: CommonModels.PackageTotalsDtoSchema, oversized: CommonModels.PackageTotalsDtoSchema, total: CommonModels.PackageTotalsDtoSchema }); -export type PackageSpecialtyTotalsResponseDto = z.infer; - -/** - * PositionCargoCargoTypeResponseDTOSchema - * @type { object } - * @property { string } id Cargo type ID. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } name Cargo type name. Example: `Electronics` - * @property { string } shortName Cargo type short name. Example: `ELEC` - */ -export const PositionCargoCargoTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), shortName: z.string().nullish() }); -export type PositionCargoCargoTypeResponseDTO = z.infer; - -/** - * PositionCargoResponseDTOSchema - * @type { object } - * @property { string } id Cargo ID. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } positionId Position ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } quoteId Quote ID this cargo belongs to. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { string } rootFolderId Folder id bound to this cargo. Example: `123e4567-e89b-12d3-a456-426614174000` - * @property { PositionCargoCargoTypeResponseDTO } cargoType Cargo type - * @property { boolean } autoCalculateTotals - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { string } rateOptions - * @property { string } rateClass - * @property { string } textForCustoms - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { number } ratePerKg - * @property { number } totalRate - * @property { number } tare - * @property { number } vgm - * @property { HsCodeLabelDto[] } hsCodeLabels HS code details - * @property { string } note - * @property { PositionCargoPackageResponseDTO[] } packages Packages for the cargo - * @property { string } createdAt Creation date. Example: `2023-04-09T12:00:00Z` - * @property { string } updatedAt Last update date. Example: `2023-04-09T12:00:00Z` - * @property { number } completeWeight - * @property { PackageSpecialtyTotalsResponseDto } packageTotals - */ -export const PositionCargoResponseDTOSchema = z.object({ id: z.string(), positionId: z.string().nullish(), quoteId: z.string().nullish(), rootFolderId: z.string().nullish(), cargoType: CommonModels.PositionCargoCargoTypeResponseDTOSchema.nullish(), autoCalculateTotals: z.boolean(), autoCalculateRates: z.boolean(), autoCalculateVgm: z.boolean(), transportUnitNumber: z.string().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), rateOptions: z.string().nullish(), rateClass: z.string().nullish(), textForCustoms: z.string().nullish(), totalVolume: z.number().nullish(), totalGrossWeight: z.number().nullish(), totalNetWeight: z.number().nullish(), totalVolumetricWeight: z.number().nullish(), totalChargeableWeight: z.number().nullish(), totalLoadMeter: z.number().nullish(), ratePerKg: z.number().nullish(), totalRate: z.number().nullish(), tare: z.number().nullish(), vgm: z.number().nullish(), hsCodeLabels: z.array(CommonModels.HsCodeLabelDtoSchema).nullish(), note: z.string().nullish(), packages: z.array(CommonModels.PositionCargoPackageResponseDTOSchema).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), completeWeight: z.number().nullish(), packageTotals: CommonModels.PackageSpecialtyTotalsResponseDtoSchema.nullish() }); -export type PositionCargoResponseDTO = z.infer; - -/** - * HazardousSpecialtyDTOSchema - * @type { object } - * @property { number } totalLength Total length - * @property { number } totalWidth Total width - * @property { number } temperature Temperature - * @property { string } unNumber UN number - * @property { string } IMOClass IMOClass - * @property { string } shippingName Shipping name - * @property { string } technicalName Technical name - * @property { HazardousPackingGroupEnum } packagingGroup Packaging - * @property { number } netWeight Net weight - * @property { number } flashpoint Flashpoint - * @property { string[] } properties Properties - * @property { string } acceptanceNumber Acceptance number - * @property { string } medGuide Medical guide - * @property { string } emergencyPhone Emergency phone - * @property { string } emergencySchedule Emergency schedule - */ -export const HazardousSpecialtyDTOSchema = z.object({ totalLength: z.number().nullable(), totalWidth: z.number().nullable(), temperature: z.number().nullable(), unNumber: z.string().nullable(), IMOClass: z.string().nullable(), shippingName: z.string().nullable(), technicalName: z.string().nullable(), packagingGroup: CommonModels.HazardousPackingGroupEnumSchema.nullable(), netWeight: z.number().nullable(), flashpoint: z.number().nullable(), properties: z.array(CommonModels.HazardousSpecialtyEnumSchema).nullable(), acceptanceNumber: z.string().nullable(), medGuide: z.string().nullable(), emergencyPhone: z.string().nullable(), emergencySchedule: z.string().nullable() }).partial(); -export type HazardousSpecialtyDTO = z.infer; - -/** - * TemperatureControlledSpecialtyDtoSchema - * @type { object } - * @property { number } temperatureFrom - * @property { number } temperatureUntil - */ -export const TemperatureControlledSpecialtyDtoSchema = z.object({ temperatureFrom: z.number().nullable(), temperatureUntil: z.number().nullable() }).partial(); -export type TemperatureControlledSpecialtyDto = z.infer; - -/** - * CreatePositionCargoPackageDTOSchema - * @type { object } - * @property { number } quantity Package quantity - * @property { string } packageTypeId Package type ID - * @property { number } length Package length - * @property { number } width Package width - * @property { number } height Package height - * @property { number } netWeight Package net weight - * @property { number } grossWeight Package gross weight - * @property { number } loadMeter Package load meter - * @property { number } chargeableWeight Package chargeable weight - * @property { number } volume Package volume - * @property { number } volumetricWeight Package volumetric weight - * @property { string } caseMarks Package case marks - * @property { string } note Package note - * @property { string } description Package description - * @property { string[] } hsCodes Package HS codes - * @property { string } customsRemarks Text for customs - * @property { string[] } specialties - * @property { HazardousSpecialtyDTO } hazardousSpecialty - * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const CreatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().nullable(), packageTypeId: z.string().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), loadMeter: z.number().nullable(), chargeableWeight: z.number().nullable(), volume: z.number().nullable(), volumetricWeight: z.number().nullable(), caseMarks: z.string().nullable(), note: z.string().nullable(), description: z.string().nullable(), hsCodes: z.array(z.string()).nullable(), customsRemarks: z.string().nullable(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).nullable(), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema.nullable(), temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema.nullable(), mrn: z.string().nullable(), exportPortFilling: z.string().nullable(), customsReleased: z.boolean().nullable(), importCustomsReleaseNumber: z.string().nullable(), portCustomsNumber: z.string().nullable() }).partial(); -export type CreatePositionCargoPackageDTO = z.infer; - -/** - * UpdatePositionCargoPackageDTOSchema - * @type { object } - * @property { number } quantity Package quantity - * @property { string } packageTypeId Package type ID - * @property { number } length Package length - * @property { number } width Package width - * @property { number } height Package height - * @property { number } netWeight Package net weight - * @property { number } grossWeight Package gross weight - * @property { number } chargeableWeight Package chargeable weight - * @property { string } note Package case marks - * @property { number } volume Package volume - * @property { number } volumetricWeight Package volumetric weight - * @property { number } orderNumber Package order number - * @property { string } caseMarks Package case marks - * @property { string } description Package description - * @property { string[] } hsCodes Package HS codes - * @property { string } customsRemarks Text for customs - * @property { number } loadMeter Load meter - * @property { string[] } specialties Package specialties - * @property { HazardousSpecialtyDTO } hazardousSpecialty Hazardous specialty details - * @property { TemperatureControlledSpecialtyDto } temperatureControlledSpecialty - * @property { string } mrn MRN (Movement Reference Number) - * @property { string } exportPortFilling Export port filling - * @property { boolean } customsReleased Customs released status - * @property { string } importCustomsReleaseNumber Import customs release number - * @property { string } portCustomsNumber Port customs number - */ -export const UpdatePositionCargoPackageDTOSchema = z.object({ quantity: z.number().nullable(), packageTypeId: z.string().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), chargeableWeight: z.number().nullable(), note: z.string().nullable(), volume: z.number().nullable(), volumetricWeight: z.number().nullable(), orderNumber: z.number().nullable(), caseMarks: z.string().nullable(), description: z.string().nullable(), hsCodes: z.array(z.string()).nullable(), customsRemarks: z.string().nullable(), loadMeter: z.number().nullable(), specialties: z.array(CommonModels.PositionCargoPackageEnumSchema).nullable(), hazardousSpecialty: CommonModels.HazardousSpecialtyDTOSchema.nullable(), temperatureControlledSpecialty: CommonModels.TemperatureControlledSpecialtyDtoSchema.nullable(), mrn: z.string().nullable(), exportPortFilling: z.string().nullable(), customsReleased: z.boolean().nullable(), importCustomsReleaseNumber: z.string().nullable(), portCustomsNumber: z.string().nullable() }).partial(); -export type UpdatePositionCargoPackageDTO = z.infer; - -/** - * QuantityOfOriginalBlDocumentsEnumSchema - * @type { enum } - */ -export const QuantityOfOriginalBlDocumentsEnumSchema = z.enum(["ZERO", "ONE", "TWO", "THREE"]); -export type QuantityOfOriginalBlDocumentsEnum = z.infer; -export const QuantityOfOriginalBlDocumentsEnum = QuantityOfOriginalBlDocumentsEnumSchema.enum; - -/** - * MovementTypeEnumSchema - * @type { enum } - */ -export const MovementTypeEnumSchema = z.enum(["DoorToDoor", "PortToPort", "PortToDoor", "DoorToPort"]); -export type MovementTypeEnum = z.infer; -export const MovementTypeEnum = MovementTypeEnumSchema.enum; - -/** - * ChargePaymentEnumSchema - * @type { enum } - */ -export const ChargePaymentEnumSchema = z.enum(["Prepaid", "Collect", "PayableElsewhere"]); -export type ChargePaymentEnum = z.infer; -export const ChargePaymentEnum = ChargePaymentEnumSchema.enum; - -/** - * DocumentConfigDTOSchema - * @type { object } - * @property { string } footerImageUrl Footer image URL - * @property { string } headerImageUrl Header image URL - */ -export const DocumentConfigDTOSchema = z.object({ footerImageUrl: z.string().nullable(), headerImageUrl: z.string().nullable() }).partial(); -export type DocumentConfigDTO = z.infer; - -/** - * EmployeeRoleContextSchema - * @type { enum } - */ -export const EmployeeRoleContextSchema = z.enum(["global", "office"]); -export type EmployeeRoleContext = z.infer; -export const EmployeeRoleContext = EmployeeRoleContextSchema.enum; - -/** - * EmployeeRoleResponseSchema - * @type { object } - * @property { string } id Unique identifier of the role - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string } context Role context - * @property { string[] } permissions Permissions associated with the role - */ -export const EmployeeRoleResponseSchema = z.object({ id: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.nullish(), permissions: z.array(z.string()) }); -export type EmployeeRoleResponse = z.infer; - -/** - * EmploymentEmployeeResponseSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { boolean } archived Archived - * @property { EmployeeRoleResponse[] } roles Global Roles - */ -export const EmploymentEmployeeResponseSchema = z.object({ id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), phone: z.string().nullish(), archived: z.boolean().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).nullish() }); -export type EmploymentEmployeeResponse = z.infer; - -/** - * EmployeeOfficeResponseSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const EmployeeOfficeResponseSchema = z.object({ id: z.string(), name: z.string() }); -export type EmployeeOfficeResponse = z.infer; - -/** - * EmploymentResponseSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { EmployeeOfficeResponse } office - * @property { string } employeeId - * @property { EmploymentEmployeeResponse } employee - * @property { boolean } archived - * @property { string } costCenter - * @property { EmployeeRoleResponse[] } roles Employment Roles - */ -export const EmploymentResponseSchema = z.object({ id: z.string(), officeId: z.string(), office: CommonModels.EmployeeOfficeResponseSchema.nullish(), employeeId: z.string(), employee: CommonModels.EmploymentEmployeeResponseSchema.nullish(), archived: z.boolean(), costCenter: z.string().nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).nullish() }); -export type EmploymentResponse = z.infer; - -/** - * LoadTypeEnumSchema - * @type { enum } - */ -export const LoadTypeEnumSchema = z.enum(["LCL", "FCL", "Trailer", "Container", "BreakBulk", "Roro", "MAFI", "LTL_ROAD", "FTL_ROAD", "Standard"]); -export type LoadTypeEnum = z.infer; -export const LoadTypeEnum = LoadTypeEnumSchema.enum; - -/** - * ServiceTypeEnumSchema - * @type { enum } - */ -export const ServiceTypeEnumSchema = z.enum(["InlandTransport", "DoorToPortOfDischarge", "PortOfLoadingToDoor", "DoorToDoor", "PortToPort", "DoorToAirport", "AirportToAirport", "AirportToDoor", "PortOfDischargeRampToDoor"]); -export type ServiceTypeEnum = z.infer; -export const ServiceTypeEnum = ServiceTypeEnumSchema.enum; - -/** - * DateRangeDtoSchema - * @type { object } - * @property { string } start - * @property { string } end - */ -export const DateRangeDtoSchema = z.object({ start: z.iso.datetime({ offset: true }).nullable(), end: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type DateRangeDto = z.infer; - -/** - * BusinessPartnerLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { BusinessPartnerType[] } types Array of business partner types - */ -export const BusinessPartnerLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), types: z.array(CommonModels.BusinessPartnerTypeSchema) }); -export type BusinessPartnerLabelResponseDTO = z.infer; - -/** - * SectionEnumSchema - * @type { enum } - */ -export const SectionEnumSchema = z.enum(["Logistics"]); -export type SectionEnum = z.infer; -export const SectionEnum = SectionEnumSchema.enum; - -/** - * FrequencyEnumSchema - * @type { enum } - */ -export const FrequencyEnumSchema = z.enum(["Daily", "Weekly", "Monthly"]); -export type FrequencyEnum = z.infer; -export const FrequencyEnum = FrequencyEnumSchema.enum; - -/** - * InvoiceDirectionEnumSchema - * @type { enum } - */ -export const InvoiceDirectionEnumSchema = z.enum(["Incoming", "Outgoing"]); -export type InvoiceDirectionEnum = z.infer; -export const InvoiceDirectionEnum = InvoiceDirectionEnumSchema.enum; - -/** - * InvoiceTypeEnumSchema - * @type { enum } - */ -export const InvoiceTypeEnumSchema = z.enum(["CreditNote", "Invoice", "CollectiveInvoice", "ProForma", "PartialCreditNote", "DirectInvoice"]); -export type InvoiceTypeEnum = z.infer; -export const InvoiceTypeEnum = InvoiceTypeEnumSchema.enum; - -/** - * BooleanFilterEnumSchema - * @type { enum } - */ -export const BooleanFilterEnumSchema = z.enum(["Yes", "No"]); -export type BooleanFilterEnum = z.infer; -export const BooleanFilterEnum = BooleanFilterEnumSchema.enum; - -/** - * InvoiceStatusEnumSchema - * @type { enum } - */ -export const InvoiceStatusEnumSchema = z.enum(["Credited", "Draft", "Overpaid", "PartiallyPaid", "Outstanding", "Paid", "CreditNote", "ProForma"]); -export type InvoiceStatusEnum = z.infer; -export const InvoiceStatusEnum = InvoiceStatusEnumSchema.enum; - -/** - * OfficeInvoiceFilterDtoSchema - * @type { object } - * @property { string } search - * @property { DateRangeDto } issuingDate - * @property { DateRangeDto } serviceDate - * @property { InvoiceDirectionEnum[] } invoiceDirection - * @property { InvoiceTypeEnum[] } invoiceType - * @property { BooleanFilterEnum[] } collective - * @property { number } amountMin - * @property { number } amountMax - * @property { string[] } currencyNotation - * @property { string[] } vatRule - * @property { DateRangeDto } dueDate - * @property { InvoiceStatusEnum[] } status - * @property { string[] } receiver Filter by invoice receiver/customer IDs (UUID) - * @property { string[] } receiverCountry Filter by invoice receiver/customer country IDs - * @property { string[] } salesRep Filter by sales rep id - * @property { string } positionNumbersString - * @property { string[] } positionNumbers - * @property { string } invoiceNumbersString - * @property { string[] } invoiceNumbers - * @property { BooleanFilterEnum[] } bookkeepingExportStatus - * @property { BooleanFilterEnum[] } dunningBlock - * @property { BooleanFilterEnum[] } invoiceInReview - * @property { BooleanFilterEnum[] } isInvoiceOk - * @property { BooleanFilterEnum[] } isVatOk - * @property { number } invoiceNumberMin - * @property { number } invoiceNumberMax - * @property { number } internalNumberMin - * @property { number } internalNumberMax - * @property { string } externalSystemId Filter invoices by position external system ID (substring match) - * @property { string } hblNumber Filter invoices by HBL/HAWB (substring match) - * @property { string } mblNumber Filter invoices by MBL/MAWB (substring match) - * @property { string } bookingNumber Filter invoices by booking number (substring match) - * @property { string } vessel Filter invoices by vessel name (substring match) - * @property { string } voyage Filter invoices by voyage number (substring match) - * @property { string } creditorId Filter invoices by creditor ID (substring match) - * @property { string } debtorId Filter invoices by debtor ID (substring match) - */ -export const OfficeInvoiceFilterDtoSchema = z.object({ search: z.string().nullable(), issuingDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).nullable(), collective: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), amountMin: z.number().nullable(), amountMax: z.number().nullable(), currencyNotation: z.array(z.string()).nullable(), vatRule: z.array(z.string()).nullable(), dueDate: CommonModels.DateRangeDtoSchema.nullable(), status: z.array(CommonModels.InvoiceStatusEnumSchema).nullable(), receiver: z.array(z.string()).nullable(), receiverCountry: z.array(z.string()).nullable(), salesRep: z.array(z.string()).nullable(), positionNumbersString: z.string().nullable(), positionNumbers: z.array(z.string()).nullable(), invoiceNumbersString: z.string().nullable(), invoiceNumbers: z.array(z.string()).nullable(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceNumberMin: z.number().nullable(), invoiceNumberMax: z.number().nullable(), internalNumberMin: z.number().nullable(), internalNumberMax: z.number().nullable(), externalSystemId: z.string().nullable(), hblNumber: z.string().nullable(), mblNumber: z.string().nullable(), bookingNumber: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), creditorId: z.string().nullable(), debtorId: z.string().nullable() }).partial(); -export type OfficeInvoiceFilterDto = z.infer; - -/** - * PositionStatusEnumSchema - * @type { enum } - */ -export const PositionStatusEnumSchema = z.enum(["Preparing", "NeedsDocumentation", "Executing", "Done"]); -export type PositionStatusEnum = z.infer; -export const PositionStatusEnum = PositionStatusEnumSchema.enum; - -/** - * PositionCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type PositionCustomerDto = z.infer; - -/** - * PositionQuoteDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const PositionQuoteDtoSchema = z.object({ id: z.string(), number: z.string() }); -export type PositionQuoteDto = z.infer; - -/** - * ParentPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const ParentPositionDtoSchema = z.object({ id: z.string(), number: z.string() }); -export type ParentPositionDto = z.infer; - -/** - * PositionTypeEnumSchema - * @type { enum } - */ -export const PositionTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); -export type PositionTypeEnum = z.infer; -export const PositionTypeEnum = PositionTypeEnumSchema.enum; - -/** - * PositionProjectLiteDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionProjectLiteDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type PositionProjectLiteDto = z.infer; - -/** - * EmployeeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const EmployeeDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type EmployeeDto = z.infer; - -/** - * PositionCoreResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } rootFolderId - * @property { string } externalSystemId - * @property { MovementTypeEnum } inttraTypeOfMove - * @property { PositionCustomerDto } customer - * @property { boolean } isCancelled - * @property { string } owningOfficeId - * @property { string } originOfficeId - * @property { PositionQuoteDto } quote - * @property { string } number - * @property { SectionEnum } section - * @property { DirectionEnum } direction - * @property { TransportModeEnum } transportMode - * @property { string } statusDate - * @property { string } serviceDate - * @property { string } dateOfDeparture - * @property { string } dateOfArrival - * @property { PositionStatusEnum } status - * @property { LoadTypeEnum } loadType - * @property { IncotermsEnum } incoterms - * @property { IncotermsEnum } secondIncoterms - * @property { ServiceTypeEnum } serviceType - * @property { ParentPositionDto } parentPosition - * @property { string } buyRateReference - * @property { FrequencyEnum } frequency - * @property { PositionTypeEnum } positionType - * @property { boolean } isParentPosition - * @property { boolean } hasParentPosition - * @property { boolean } hasChildPositions - * @property { PositionProjectLiteDto } projectLite - * @property { boolean } isExcludedFromStatistics - * @property { EmployeeDto } salesRep - * @property { string } fillingCompany - * @property { string } sellingContract - * @property { string } fillingScacCode - * @property { string } serviceValidity - * @property { string } ratesValidity - * @property { EmployeeDto } responsibleEmployee - * @property { EmployeeDto } receivedByEmployee - * @property { string } team - * @property { string } createdAt - * @property { string } updatedAt - * @property { EditorContentResponseDto } notes Notes - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const PositionCoreResponseDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), externalSystemId: z.string().nullish(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullish(), customer: CommonModels.PositionCustomerDtoSchema.nullish(), isCancelled: z.boolean(), owningOfficeId: z.string(), originOfficeId: z.string().nullish(), quote: CommonModels.PositionQuoteDtoSchema.nullish(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), serviceDate: z.iso.datetime({ offset: true }).nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.PositionStatusEnumSchema.nullish(), loadType: CommonModels.LoadTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), parentPosition: CommonModels.ParentPositionDtoSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), positionType: CommonModels.PositionTypeEnumSchema.nullish(), isParentPosition: z.boolean(), hasParentPosition: z.boolean().nullish(), hasChildPositions: z.boolean().nullish(), projectLite: CommonModels.PositionProjectLiteDtoSchema.nullish(), isExcludedFromStatistics: z.boolean(), salesRep: CommonModels.EmployeeDtoSchema.nullish(), fillingCompany: z.string().nullish(), sellingContract: z.string().nullish(), fillingScacCode: z.string().nullish(), serviceValidity: z.iso.datetime({ offset: true }).nullish(), ratesValidity: z.iso.datetime({ offset: true }).nullish(), responsibleEmployee: CommonModels.EmployeeDtoSchema.nullish(), receivedByEmployee: CommonModels.EmployeeDtoSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), notes: CommonModels.EditorContentResponseDtoSchema.nullish(), volumetricWeightModifier: z.number().nullish() }); -export type PositionCoreResponseDto = z.infer; - -/** - * VesselDtoSchema - * @type { object } - * @property { string } name - * @property { number } imo - * @property { number } mmsi - */ -export const VesselDtoSchema = z.object({ name: z.string(), imo: z.number().nullish(), mmsi: z.number().nullish() }); -export type VesselDto = z.infer; - -/** - * StatusResponseDtoSchema - * @type { object } - * @property { string } status Status - * @property { string } message Message - * @property { string } code Alphanumeric code of the message type - */ -export const StatusResponseDtoSchema = z.object({ status: z.string(), message: z.string(), code: z.string() }); -export type StatusResponseDto = z.infer; - -/** - * PaginationDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const PaginationDtoSchema = z.object({ items: z.array(z.string()), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type PaginationDto = z.infer; - -/** - * LabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - */ -export const LabelResponseDTOSchema = z.object({ id: z.string(), label: z.string() }); -export type LabelResponseDTO = z.infer; - -/** - * GenerateWorkingDocumentRequestDtoSchema - * @type { object } - * @property { string } issuedAt - * @property { string } fileName - */ -export const GenerateWorkingDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }); -export type GenerateWorkingDocumentRequestDto = z.infer; - -/** - * UpdateInvolvedPartyDtoSchema - * @type { object } - * @property { string } reference - * @property { string } businessPartnerId - * @property { string } contactId - */ -export const UpdateInvolvedPartyDtoSchema = z.object({ reference: z.string().nullable(), businessPartnerId: z.string().nullable(), contactId: z.string().nullable() }).partial(); -export type UpdateInvolvedPartyDto = z.infer; - -/** - * MergeRoutesRequestDtoSchema - * @type { object } - * @property { string } sourceCargoId Source cargo ID to merge from (sea positions only) - */ -export const MergeRoutesRequestDtoSchema = z.object({ sourceCargoId: z.string().nullable() }); -export type MergeRoutesRequestDto = z.infer; - -/** - * CopyRouteRequestDtoSchema - * @type { object } - * @property { string } targetCargoId Target cargo ID to copy to (sea positions only) - */ -export const CopyRouteRequestDtoSchema = z.object({ targetCargoId: z.string().nullable() }); -export type CopyRouteRequestDto = z.infer; - -/** - * CargoSummaryResponseDTOSchema - * @type { object } - * @property { string } transportUnitTypeName Transport unit type name (e.g., "40' DRY", "20'") - * @property { number } quantity Total quantity of this transport unit type - */ -export const CargoSummaryResponseDTOSchema = z.object({ transportUnitTypeName: z.string(), quantity: z.number() }); -export type CargoSummaryResponseDTO = z.infer; - -/** - * CreatePositionCargoDTOSchema - * @type { object } - * @property { string } cargoTypeId Cargo type ID - * @property { string } note - * @property { boolean } autoCalculateTotals - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { string } rateOptions - * @property { string } rateClass - * @property { number } ratePerKg - * @property { number } totalRate - * @property { string } textForCustoms - * @property { number } tare - * @property { number } vgm - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - */ -export const CreatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().nullable(), note: z.string().nullable(), autoCalculateTotals: z.boolean().nullable(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean().nullable(), autoCalculateVgm: z.boolean().nullable() }).partial(); -export type CreatePositionCargoDTO = z.infer; - -/** - * UpdatePositionCargoDTOSchema - * @type { object } - * @property { string } cargoTypeId Cargo type ID - * @property { string } note - * @property { boolean } autoCalculateTotals - * @property { string } transportUnitNumber - * @property { string } seal1 - * @property { string } seal2 - * @property { number } totalVolume - * @property { number } totalGrossWeight - * @property { number } totalNetWeight - * @property { number } totalVolumetricWeight - * @property { number } totalChargeableWeight - * @property { number } totalLoadMeter - * @property { string } rateOptions - * @property { string } rateClass - * @property { number } ratePerKg - * @property { number } totalRate - * @property { string } textForCustoms - * @property { number } tare - * @property { number } vgm - * @property { boolean } autoCalculateRates - * @property { boolean } autoCalculateVgm - */ -export const UpdatePositionCargoDTOSchema = z.object({ cargoTypeId: z.string().nullable(), note: z.string().nullable(), autoCalculateTotals: z.boolean().nullable(), transportUnitNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), totalVolume: z.number().nullable(), totalGrossWeight: z.number().nullable(), totalNetWeight: z.number().nullable(), totalVolumetricWeight: z.number().nullable(), totalChargeableWeight: z.number().nullable(), totalLoadMeter: z.number().nullable(), rateOptions: CommonModels.RateOptionsEnumSchema.nullable(), rateClass: CommonModels.RateClassEnumSchema.nullable(), ratePerKg: z.number().nullable(), totalRate: z.number().nullable(), textForCustoms: z.string().nullable(), tare: z.number().nullable(), vgm: z.number().nullable(), autoCalculateRates: z.boolean().nullable(), autoCalculateVgm: z.boolean().nullable() }).partial(); -export type UpdatePositionCargoDTO = z.infer; - -/** - * MovePositionCargoPackageRequestDTOSchema - * @type { object } - * @property { string } targetCargoId Target cargo ID to move the package to - */ -export const MovePositionCargoPackageRequestDTOSchema = z.object({ targetCargoId: z.string() }); -export type MovePositionCargoPackageRequestDTO = z.infer; - -/** - * PositionCargoPaginationOrderFieldSchema - * @type { enum } - */ -export const PositionCargoPaginationOrderFieldSchema = z.enum(["createdAt", "updatedAt"]); -export type PositionCargoPaginationOrderField = z.infer; -export const PositionCargoPaginationOrderField = PositionCargoPaginationOrderFieldSchema.enum; - -/** - * PositionAvailablePartnersUseCaseSchema - * @type { enum } - */ -export const PositionAvailablePartnersUseCaseSchema = z.enum(["financeCustomer", "financeVendor"]); -export type PositionAvailablePartnersUseCase = z.infer; -export const PositionAvailablePartnersUseCase = PositionAvailablePartnersUseCaseSchema.enum; - -} diff --git a/test/generated/next/containerYards/containerYards.acl.ts b/test/generated/next/containerYards/containerYards.acl.ts deleted file mode 100644 index f4e07a4..0000000 --- a/test/generated/next/containerYards/containerYards.acl.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace ContainerYardsAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "ContainerYard" -] as AbilityTuple<"Create", "ContainerYard">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -/** - * Use for `useGetLabelById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetLabelById` query - */ -export const canUseGetLabelById = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Update", - "ContainerYard" -] as AbilityTuple<"Update", "ContainerYard">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Update", - "ContainerYard" -] as AbilityTuple<"Update", "ContainerYard">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "ContainerYard" -] as AbilityTuple<"Update", "ContainerYard">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "ContainerYard" -] as AbilityTuple<"Read", "ContainerYard">; - -} diff --git a/test/generated/next/containerYards/containerYards.api.ts b/test/generated/next/containerYards/containerYards.api.ts deleted file mode 100644 index 60ae21e..0000000 --- a/test/generated/next/containerYards/containerYards.api.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ContainerYardsModels } from "./containerYards.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ContainerYardsApi { -export const paginate = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardsPaginateResponseSchema }, - `/container-yards`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ContainerYardsModels.ContainerYardFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: ContainerYardsModels.CreateContainerYardRequestDTO, ) => { - return AppRestClient.post( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards`, - ZodExtended.parse(ContainerYardsModels.CreateContainerYardRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardsPaginateLabelsResponseSchema }, - `/container-yards/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ContainerYardsModels.ContainerYardLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getLabelById = (id: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.LabelResponseDTOSchema }, - `/container-yards/${id}/labels`, - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}/unarchive`, - - ) -}; -export const update = (id: string, data: ContainerYardsModels.UpdateContainerYardRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}`, - ZodExtended.parse(ContainerYardsModels.UpdateContainerYardRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: ContainerYardsModels.ContainerYardResponseDTOSchema }, - `/container-yards/${id}`, - - ) -}; -} diff --git a/test/generated/next/containerYards/containerYards.configs.ts b/test/generated/next/containerYards/containerYards.configs.ts deleted file mode 100644 index 4458f76..0000000 --- a/test/generated/next/containerYards/containerYards.configs.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ContainerYardsModels } from "./containerYards.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ContainerYardsQueries } from "./containerYards.queries"; -import { ContainerYardsAcl } from "./containerYards.acl"; - -export namespace ContainerYardsConfigs { -export const containerYardsConfig = { - meta: { - title: "Container Yards", - }, - readAll: { - acl: ContainerYardsAcl.canUsePaginate, - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - paginated: ContainerYardsQueries.usePaginate, - infinite: ContainerYardsQueries.usePaginateInfinite, - filters: { - schema: ContainerYardsModels.ContainerYardFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ContainerYardsModels.ContainerYardFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - shortName: true, - name: true, - archived: true, - street: true, - secondaryStreet: true, - zip: true, - city: true, - country: true, - district: true, - additionalInformation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ContainerYardsModels.ContainerYardsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ContainerYardsAcl.canUseFindById, - schema: ContainerYardsModels.ContainerYardResponseDTOSchema, - query: ContainerYardsQueries.useFindById, - }, - create: { - acl: ContainerYardsAcl.canUseCreate, - schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, - mutation: ContainerYardsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ContainerYardsModels.CreateContainerYardRequestDTOSchema, - options: { - inputs: { - matchCode: true, - name: true, - shortName: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - additionalInformation: true, - }, - }, -}) - }, - update: { - acl: ContainerYardsAcl.canUseUpdate, - schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, - mutation: ContainerYardsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ContainerYardsModels.UpdateContainerYardRequestDTOSchema, - options: { - inputs: { - matchCode: true, - name: true, - shortName: true, - addressId: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - additionalInformation: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: ContainerYardsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ContainerYardsQueries.usePaginateLabels, - infinite: ContainerYardsQueries.usePaginateLabelsInfinite, - filters: { - schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ContainerYardsModels.ContainerYardLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ContainerYardsModels.ContainerYardsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/containerYards/containerYards.models.ts b/test/generated/next/containerYards/containerYards.models.ts deleted file mode 100644 index d85e878..0000000 --- a/test/generated/next/containerYards/containerYards.models.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ContainerYardsModels { -/** - * ContainerYardEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ContainerYardEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ContainerYardEmployeeDTO = z.infer; - -/** - * ContainerYardResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchCode Container yard match code - * @property { string } shortName Container yard short name - * @property { string } name Container yard name - * @property { boolean } archived Whether the container yard is archived - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { object } city - * @property { string } city.id - * @property { string } city.name - * @property { object } country - * @property { string } country.id - * @property { string } country.name - * @property { string } country.isoCode2 - * @property { string } country.isoCode3 - * @property { string } district District - * @property { string } additionalInformation Additional information - * @property { string } createdById - * @property { ContainerYardEmployeeDTO } createdBy - * @property { string } createdAt Date when the container yard was created - * @property { string } updatedById - * @property { ContainerYardEmployeeDTO } updatedBy - * @property { string } updatedAt Date when the container yard was last updated - */ -export const ContainerYardResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), shortName: z.string().nullish(), name: z.string(), archived: z.boolean(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: z.object({ id: z.string(), name: z.string() }).nullish(), country: z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }).nullish(), district: z.string().nullish(), additionalInformation: z.string().nullish(), createdById: z.string().nullish(), createdBy: ContainerYardEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ContainerYardEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type ContainerYardResponseDTO = z.infer; - -/** - * ContainerYardFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ContainerYardFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type ContainerYardFilterDto = z.infer; - -/** - * ContainerYardLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const ContainerYardLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type ContainerYardLabelFilterDto = z.infer; - -/** - * CreateContainerYardRequestDTOSchema - * @type { object } - * @property { string } matchCode Match code - * @property { string } name Name - * @property { string } shortName Short name - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } cityId City ID - * @property { string } countryId Country ID - * @property { string } district District - * @property { string } additionalInformation Additional information - */ -export const CreateContainerYardRequestDTOSchema = z.object({ matchCode: z.string(), name: z.string(), shortName: z.string().nullish(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string().nullish(), additionalInformation: z.string().nullish() }); -export type CreateContainerYardRequestDTO = z.infer; - -/** - * UpdateContainerYardRequestDTOSchema - * @type { object } - * @property { string } matchCode Match code - * @property { string } name Name - * @property { string } shortName Short name - * @property { string } addressId Address ID - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } cityId City ID - * @property { string } countryId Country ID - * @property { string } district District - * @property { string } additionalInformation Additional information - */ -export const UpdateContainerYardRequestDTOSchema = z.object({ matchCode: z.string().nullable(), name: z.string().nullable(), shortName: z.string().nullable(), addressId: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable(), additionalInformation: z.string().nullable() }).partial(); -export type UpdateContainerYardRequestDTO = z.infer; - -/** - * ContainerYardsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const ContainerYardsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ContainerYardsPaginateOrderParamEnum = z.infer; -export const ContainerYardsPaginateOrderParamEnum = ContainerYardsPaginateOrderParamEnumSchema.enum; - -/** - * ContainerYardsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ContainerYardResponseDTO[] } items - */ -export const ContainerYardsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerYardResponseDTOSchema).nullable() }).partial().shape }); -export type ContainerYardsPaginateResponse = z.infer; - -/** - * ContainerYardsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const ContainerYardsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ContainerYardsPaginateLabelsOrderParamEnum = z.infer; -export const ContainerYardsPaginateLabelsOrderParamEnum = ContainerYardsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * ContainerYardsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const ContainerYardsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type ContainerYardsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/containerYards/containerYards.queries.ts b/test/generated/next/containerYards/containerYards.queries.ts deleted file mode 100644 index 97b958b..0000000 --- a/test/generated/next/containerYards/containerYards.queries.ts +++ /dev/null @@ -1,286 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ContainerYardsAcl } from "./containerYards.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ContainerYardsModels } from "./containerYards.models"; -import { ContainerYardsApi } from "./containerYards.api"; - -export namespace ContainerYardsQueries { -export const moduleName = QueryModule.ContainerYards; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string) => [...keys.all, "/container-yards", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string) => [...keys.all, "/container-yards/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getLabelById: (id: string) => [...keys.all, "/container-yards/:id/labels", id] as const, - findById: (id: string) => [...keys.all, "/container-yards/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Container Yards - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Container Yards - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ContainerYardsAcl.canUsePaginate()); - return ContainerYardsApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create container yard - * @permission Requires `canUseCreate` ability - * @param { ContainerYardsModels.CreateContainerYardRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(ContainerYardsAcl.canUseCreate()); - return ContainerYardsApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate container yard labels (id and name) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate container yard labels (id and name) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ContainerYardsModels.ContainerYardLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ContainerYardsModels.ContainerYardLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ContainerYardsAcl.canUsePaginateLabels()); - return ContainerYardsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetLabelById` - * @summary Get container yard by ID with label format (id and formatted name) - * @permission Requires `canUseGetLabelById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetLabelById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getLabelById(id), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUseGetLabelById()); - return ContainerYardsApi.getLabelById(id) }, - ...options, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive container yard - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ContainerYardsAcl.canUseArchive()); - return ContainerYardsApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive container yard - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(ContainerYardsAcl.canUseUnarchive()); - return ContainerYardsApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update container yard - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { ContainerYardsModels.UpdateContainerYardRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(ContainerYardsAcl.canUseUpdate()); - return ContainerYardsApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get container yard - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(ContainerYardsAcl.canUseFindById()); - return ContainerYardsApi.findById(id) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/controlTowerAuth/controlTowerAuth.api.ts b/test/generated/next/controlTowerAuth/controlTowerAuth.api.ts deleted file mode 100644 index 13804d1..0000000 --- a/test/generated/next/controlTowerAuth/controlTowerAuth.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerAuthModels } from "./controlTowerAuth.models"; - -export namespace ControlTowerAuthApi { -export const login = (data: ControlTowerAuthModels.LoginRequestDto, ) => { - return AppRestClient.post( - { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, - `/auth/move/login`, - ZodExtended.parse(ControlTowerAuthModels.LoginRequestDtoSchema, data), - - ) -}; -export const resetPassword = (data: ControlTowerAuthModels.PasswordResetDto, ) => { - return AppRestClient.post( - { resSchema: ControlTowerAuthModels.LoginResponseDtoSchema }, - `/auth/reset-password`, - ZodExtended.parse(ControlTowerAuthModels.PasswordResetDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/controlTowerAuth/controlTowerAuth.models.ts b/test/generated/next/controlTowerAuth/controlTowerAuth.models.ts deleted file mode 100644 index 8cc05bd..0000000 --- a/test/generated/next/controlTowerAuth/controlTowerAuth.models.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerAuthModels { -/** - * LoginRequestDtoSchema - * @type { object } - * @property { string } username - * @property { string } password - */ -export const LoginRequestDtoSchema = z.object({ username: z.string(), password: z.string() }); -export type LoginRequestDto = z.infer; - -/** - * LoginResponseDtoSchema - * @type { object } - * @property { string } accessToken - * @property { boolean } resetPasswordRequired - * @property { string } passwordResetToken - * @property { string } username - */ -export const LoginResponseDtoSchema = z.object({ accessToken: z.string().nullable(), resetPasswordRequired: z.boolean().nullish(), passwordResetToken: z.string().nullish(), username: z.string().nullish() }); -export type LoginResponseDto = z.infer; - -/** - * PasswordResetDtoSchema - * @type { object } - * @property { string } password - * @property { string } username - * @property { string } token - */ -export const PasswordResetDtoSchema = z.object({ password: z.string(), username: z.string(), token: z.string() }); -export type PasswordResetDto = z.infer; - -} diff --git a/test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts b/test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts deleted file mode 100644 index 9fdc009..0000000 --- a/test/generated/next/controlTowerAuth/controlTowerAuth.queries.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerAuthModels } from "./controlTowerAuth.models"; -import { ControlTowerAuthApi } from "./controlTowerAuth.api"; - -export namespace ControlTowerAuthQueries { -export const moduleName = QueryModule.ControlTowerAuth; - - - -/** - * Mutation `useLogin` - * @description Returns an access token to authenticate for protected endpoints - * @param { ControlTowerAuthModels.LoginRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 400, 401] - */ -export const useLogin = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerAuthApi.login(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useResetPassword` - * @description Resets the password for the requesting user - * @param { ControlTowerAuthModels.PasswordResetDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 400, 401] - */ -export const useResetPassword = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerAuthApi.resetPassword(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.api.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.api.ts deleted file mode 100644 index ac13db5..0000000 --- a/test/generated/next/controlTowerBookings/controlTowerBookings.api.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; - -export namespace ControlTowerBookingsApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.ControlTowerBookingsFindAllResponseSchema }, - `/bookings`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ControlTowerBookingsModels.BookingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.BookingResponseDtoSchema }, - `/bookings/${id}`, - - ) -}; -export const findPackageById = (packageId: string, bookingId: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerBookingsModels.PackageResponseDtoSchema }, - `/bookings/${bookingId}/packages/${packageId}`, - - ) -}; -} diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.configs.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.configs.ts deleted file mode 100644 index ce75a71..0000000 --- a/test/generated/next/controlTowerBookings/controlTowerBookings.configs.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; -import { ControlTowerBookingsQueries } from "./controlTowerBookings.queries"; - -export namespace ControlTowerBookingsConfigs { -export const bookingsConfig = { - meta: { - title: "Bookings", - }, - readAll: { - schema: ControlTowerBookingsModels.BookingListItemDtoSchema, - paginated: ControlTowerBookingsQueries.useFindAll, - infinite: ControlTowerBookingsQueries.useFindAllInfinite, - filters: { - schema: ControlTowerBookingsModels.BookingFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerBookingsModels.BookingFilterDtoSchema, - options: { - inputs: { - projectId: true, - search: true, - companyIds: true, - purchaseOrderId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ControlTowerBookingsModels.BookingListItemDtoSchema, - options: { - columns: { - id: true, - bookingNumber: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerBookingsModels.ControlTowerBookingsFindAllOrderParamEnumSchema, - }, -}), - }, - read: { - schema: ControlTowerBookingsModels.BookingResponseDtoSchema, - query: ControlTowerBookingsQueries.useFindById, - }, -}; - -} diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.models.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.models.ts deleted file mode 100644 index 8170c63..0000000 --- a/test/generated/next/controlTowerBookings/controlTowerBookings.models.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerBookingsModels { -/** - * BookingListItemDtoSchema - * @type { object } - * @property { string } id - * @property { string } bookingNumber - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const BookingListItemDtoSchema = z.object({ id: z.string(), bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); -export type BookingListItemDto = z.infer; - -/** - * BookingContainerDtoSchema - * @type { object } - * @property { string } id - * @property { string } containerNumber - * @property { string } type - * @property { string } loadType - * @property { string } stuffedInContainer - * @property { string[] } hsCode - * @property { number } noS - * @property { number } weight - * @property { string } lastEventLocation - * @property { string } lastEventName - * @property { string } lastEventDate - * @property { string } seals - */ -export const BookingContainerDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), loadType: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), hsCode: z.array(z.string()).nullable(), noS: z.number().nullable(), weight: z.number().nullable(), lastEventLocation: z.string().nullable(), lastEventName: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), seals: z.string().nullable() }); -export type BookingContainerDto = z.infer; - -/** - * BookingPackageDtoSchema - * @type { object } - * @property { string } id - * @property { string } packageNumber - * @property { string } containerNumber - * @property { string } type - * @property { string } description - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - */ -export const BookingPackageDtoSchema = z.object({ id: z.string(), packageNumber: z.string(), containerNumber: z.string().nullable(), type: z.string().nullable(), description: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable() }); -export type BookingPackageDto = z.infer; - -/** - * BookingResponseDtoSchema - * @type { object } - * @property { string } bookingNumber - * @property { string } ets - * @property { string } etaPod - * @property { string } etaFinalDeliveryPlace - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } destination - * @property { string } lastEvent - * @property { string[] } files - * @property { string } poNumber - * @property { string } blNumber - * @property { BookingContainerDto[] } containers - * @property { BookingPackageDto[] } packages - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - * @property { string } id - */ -export const BookingResponseDtoSchema = z.object({ bookingNumber: z.string().nullable(), ets: z.iso.datetime({ offset: true }).nullable(), etaPod: z.iso.datetime({ offset: true }).nullable(), etaFinalDeliveryPlace: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), destination: z.string().nullable(), lastEvent: z.string().nullable(), files: z.array(z.string()).nullable(), poNumber: z.string().nullable(), blNumber: z.string().nullable(), containers: z.array(BookingContainerDtoSchema).nullish(), packages: z.array(BookingPackageDtoSchema).nullish(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable(), id: z.string() }); -export type BookingResponseDto = z.infer; - -/** - * PackageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } poNumber - * @property { string } bookingNumber - * @property { string } blNumber - * @property { string } containerNumber - * @property { string } packageNumber - * @property { string } description - * @property { number } netWeight - * @property { number } grossWeight - * @property { number } length - * @property { number } width - * @property { number } height - * @property { number } volume - * @property { string } storageInstruction - * @property { string } destination - * @property { string[] } files - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const PackageResponseDtoSchema = z.object({ id: z.string(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), containerNumber: z.string().nullable(), packageNumber: z.string().nullable(), description: z.string().nullable(), netWeight: z.number().nullable(), grossWeight: z.number().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), volume: z.number().nullable(), storageInstruction: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); -export type PackageResponseDto = z.infer; - -/** - * BookingFilterDtoSchema - * @type { object } - * @property { string } projectId - * @property { string } search Min Length: `1` - * @property { string[] } companyIds - * @property { string } purchaseOrderId - */ -export const BookingFilterDtoSchema = z.object({ projectId: z.string().nullable(), search: z.string().min(1).nullable(), companyIds: z.array(z.string()).nullable(), purchaseOrderId: z.string().nullable() }).partial(); -export type BookingFilterDto = z.infer; - -/** - * ControlTowerBookingsFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ControlTowerBookingsFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); -export type ControlTowerBookingsFindAllOrderParamEnum = z.infer; -export const ControlTowerBookingsFindAllOrderParamEnum = ControlTowerBookingsFindAllOrderParamEnumSchema.enum; - -/** - * ControlTowerBookingsFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { BookingListItemDto[] } items - */ -export const ControlTowerBookingsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(BookingListItemDtoSchema).nullable() }).partial().shape }); -export type ControlTowerBookingsFindAllResponse = z.infer; - -} diff --git a/test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts b/test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts deleted file mode 100644 index 0fd4b0d..0000000 --- a/test/generated/next/controlTowerBookings/controlTowerBookings.queries.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerBookingsModels } from "./controlTowerBookings.models"; -import { ControlTowerBookingsApi } from "./controlTowerBookings.api"; - -export namespace ControlTowerBookingsQueries { -export const moduleName = QueryModule.ControlTowerBookings; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string) => [...keys.all, "/bookings", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string) => [...keys.all, "/bookings", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/bookings/:id", id] as const, - findPackageById: (packageId: string, bookingId: string) => [...keys.all, "/bookings/:bookingId/packages/:packageId", packageId, bookingId] as const, -}; - -/** - * Query `useFindAll` - * @summary Get all accessible bookings for the customer - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => - ControlTowerBookingsApi.findAll(limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @summary Get all accessible bookings for the customer - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerBookingsModels.BookingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerBookingsModels.BookingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - ControlTowerBookingsApi.findAll(limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @description Returns a booking with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => - ControlTowerBookingsApi.findById(id), - ...options, - }); -}; - -/** - * Query `useFindPackageById` - * @description Returns a package with the specified id - * @param { string } object.packageId Path parameter - * @param { string } object.bookingId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindPackageById = ({ packageId, bookingId }: { packageId: string, bookingId: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findPackageById(packageId, bookingId), - queryFn: () => - ControlTowerBookingsApi.findPackageById(packageId, bookingId), - ...options, - }); -}; - -} diff --git a/test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts b/test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts deleted file mode 100644 index a35354b..0000000 --- a/test/generated/next/controlTowerCalendar/controlTowerCalendar.api.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; - -export namespace ControlTowerCalendarApi { -export const getCalendar = (from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam, ) => { - return AppRestClient.get( - { resSchema: ControlTowerCalendarModels.CalendarResponseDtoSchema }, - `/calendar`, - { - params: { - from: ZodExtended.parse(z.iso.datetime({ offset: true }), from, { type: "query", name: "from" }), - to: ZodExtended.parse(z.iso.datetime({ offset: true }), to, { type: "query", name: "to" }), - type: ZodExtended.parse(ControlTowerCalendarModels.CalendarTypeEnumSchema, type, { type: "query", name: "type" }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - poNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarPoNumbersParamSchema.optional(), poNumbers, { type: "query", name: "poNumbers" }), - containerNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarContainerNumbersParamSchema.optional(), containerNumbers, { type: "query", name: "containerNumbers" }), - bookingNumbers: ZodExtended.parse(ControlTowerCalendarModels.GetCalendarBookingNumbersParamSchema.optional(), bookingNumbers, { type: "query", name: "bookingNumbers" }), - }, - } - ) -}; -} diff --git a/test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts b/test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts deleted file mode 100644 index 43dbf63..0000000 --- a/test/generated/next/controlTowerCalendar/controlTowerCalendar.models.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerCalendarModels { -/** - * EventRelationTypeEnumSchema - * @type { enum } - */ -export const EventRelationTypeEnumSchema = z.enum(["Booking", "Container", "PurchaseOrder"]); -export type EventRelationTypeEnum = z.infer; -export const EventRelationTypeEnum = EventRelationTypeEnumSchema.enum; - -/** - * CalendarEventRelationDtoSchema - * @type { object } - * @property { EventRelationTypeEnum } type - * @property { string } id - * @property { string } number - */ -export const CalendarEventRelationDtoSchema = z.object({ type: EventRelationTypeEnumSchema, id: z.string(), number: z.string() }); -export type CalendarEventRelationDto = z.infer; - -/** - * CalendarTypeEnumSchema - * @type { enum } - */ -export const CalendarTypeEnumSchema = z.enum(["PurchaseOrder", "Booking", "Container", "Package"]); -export type CalendarTypeEnum = z.infer; -export const CalendarTypeEnum = CalendarTypeEnumSchema.enum; - -/** - * CalendarEventDtoSchema - * @type { object } - * @property { string } entityId - * @property { string } entityNumber - * @property { CalendarTypeEnum } entityType - * @property { string } date - * @property { string } title - * @property { CalendarEventRelationDto[] } relations - */ -export const CalendarEventDtoSchema = z.object({ entityId: z.string(), entityNumber: z.string(), entityType: CalendarTypeEnumSchema, date: z.iso.datetime({ offset: true }), title: z.string(), relations: z.array(CalendarEventRelationDtoSchema) }); -export type CalendarEventDto = z.infer; - -/** - * FiltersDtoSchema - * @type { object } - * @property { string[] } poNumbers - * @property { string[] } bookingNumbers - * @property { string[] } containerNumbers - */ -export const FiltersDtoSchema = z.object({ poNumbers: z.array(z.string()), bookingNumbers: z.array(z.string()), containerNumbers: z.array(z.string()) }); -export type FiltersDto = z.infer; - -/** - * CalendarDtoSchema - * @type { object } - * @property { CalendarEventDto[] } events - * @property { FiltersDto } filters - */ -export const CalendarDtoSchema = z.object({ events: z.array(CalendarEventDtoSchema), filters: FiltersDtoSchema }); -export type CalendarDto = z.infer; - -/** - * CalendarResponseDtoSchema - * @type { object } - * @property { CalendarDto } data - */ -export const CalendarResponseDtoSchema = z.object({ data: CalendarDtoSchema }); -export type CalendarResponseDto = z.infer; - -/** - * GetCalendarPoNumbersParamSchema - * @type { array } - */ -export const GetCalendarPoNumbersParamSchema = z.array(z.string()).nullish(); -export type GetCalendarPoNumbersParam = z.infer; - -/** - * GetCalendarContainerNumbersParamSchema - * @type { array } - */ -export const GetCalendarContainerNumbersParamSchema = z.array(z.string()).nullish(); -export type GetCalendarContainerNumbersParam = z.infer; - -/** - * GetCalendarBookingNumbersParamSchema - * @type { array } - */ -export const GetCalendarBookingNumbersParamSchema = z.array(z.string()).nullish(); -export type GetCalendarBookingNumbersParam = z.infer; - -} diff --git a/test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts b/test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts deleted file mode 100644 index 5e81f36..0000000 --- a/test/generated/next/controlTowerCalendar/controlTowerCalendar.queries.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerCalendarModels } from "./controlTowerCalendar.models"; -import { ControlTowerCalendarApi } from "./controlTowerCalendar.api"; - -export namespace ControlTowerCalendarQueries { -export const moduleName = QueryModule.ControlTowerCalendar; - -export const keys = { - all: [moduleName] as const, - getCalendar: (from?: string, to?: string, type?: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam) => [...keys.all, "/calendar", from, to, type, search, poNumbers, containerNumbers, bookingNumbers] as const, -}; - -/** - * Query `useGetCalendar` - * @param { string } object.from Query parameter - * @param { string } object.to Query parameter - * @param { ControlTowerCalendarModels.CalendarTypeEnum } object.type Query parameter - * @param { string } object.search Query parameter - * @param { ControlTowerCalendarModels.GetCalendarPoNumbersParam } object.poNumbers Query parameter - * @param { ControlTowerCalendarModels.GetCalendarContainerNumbersParam } object.containerNumbers Query parameter - * @param { ControlTowerCalendarModels.GetCalendarBookingNumbersParam } object.bookingNumbers Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCalendar = ({ from, to, type, search, poNumbers, containerNumbers, bookingNumbers }: { from: string, to: string, type: ControlTowerCalendarModels.CalendarTypeEnum, search?: string, poNumbers?: ControlTowerCalendarModels.GetCalendarPoNumbersParam, containerNumbers?: ControlTowerCalendarModels.GetCalendarContainerNumbersParam, bookingNumbers?: ControlTowerCalendarModels.GetCalendarBookingNumbersParam }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), - queryFn: () => - ControlTowerCalendarApi.getCalendar(from, to, type, search, poNumbers, containerNumbers, bookingNumbers), - ...options, - }); -}; - -} diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.api.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.api.ts deleted file mode 100644 index 3196fe3..0000000 --- a/test/generated/next/controlTowerContainers/controlTowerContainers.api.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; - -export namespace ControlTowerContainersApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ControlTowerContainersFindAllResponseSchema }, - `/containers`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ControlTowerContainersModels.ContainerFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ContainerResponseDtoSchema }, - `/containers/${id}`, - - ) -}; -export const getJourney = (id: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerContainersModels.ContainerJourneyResponseDtoSchema }, - `/containers/${id}/journey`, - - ) -}; -} diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.configs.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.configs.ts deleted file mode 100644 index 98105eb..0000000 --- a/test/generated/next/controlTowerContainers/controlTowerContainers.configs.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; -import { ControlTowerContainersQueries } from "./controlTowerContainers.queries"; - -export namespace ControlTowerContainersConfigs { -export const containersConfig = { - meta: { - title: "Containers", - }, - readAll: { - schema: ControlTowerContainersModels.ContainerListItemDtoSchema, - paginated: ControlTowerContainersQueries.useFindAll, - infinite: ControlTowerContainersQueries.useFindAllInfinite, - filters: { - schema: ControlTowerContainersModels.ContainerFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerContainersModels.ContainerFilterDtoSchema, - options: { - inputs: { - companyIds: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ControlTowerContainersModels.ContainerListItemDtoSchema, - options: { - columns: { - containerNumber: true, - id: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerContainersModels.ControlTowerContainersFindAllOrderParamEnumSchema, - }, -}), - }, - read: { - schema: ControlTowerContainersModels.ContainerResponseDtoSchema, - query: ControlTowerContainersQueries.useFindById, - }, -}; - -} diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.models.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.models.ts deleted file mode 100644 index e0df923..0000000 --- a/test/generated/next/controlTowerContainers/controlTowerContainers.models.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerContainersModels { -/** - * ContainerListItemDtoSchema - * @type { object } - * @property { string } containerNumber - * @property { string } id - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const ContainerListItemDtoSchema = z.object({ containerNumber: z.string().nullable(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); -export type ContainerListItemDto = z.infer; - -/** - * ContainerEventDtoSchema - * @type { object } - * @property { CommonModels.VesselDto } vessel - * @property { string } name - * @property { string } date - * @property { boolean } checkedIn - */ -export const ContainerEventDtoSchema = z.object({ vessel: CommonModels.VesselDtoSchema.nullable(), name: z.string(), date: z.iso.datetime({ offset: true }).nullable(), checkedIn: z.boolean() }); -export type ContainerEventDto = z.infer; - -/** - * ContainerJourneyDtoSchema - * @type { object } - * @property { string } id - * @property { string } country - * @property { string } terminal - * @property { boolean } checkedIn - * @property { ContainerEventDto[] } events - */ -export const ContainerJourneyDtoSchema = z.object({ id: z.string(), country: z.string().nullable(), terminal: z.string().nullable(), checkedIn: z.boolean(), events: z.array(ContainerEventDtoSchema) }); -export type ContainerJourneyDto = z.infer; - -/** - * PackageNumberDtoSchema - * @type { object } - * @property { string } id - * @property { string } type - * @property { string } description - */ -export const PackageNumberDtoSchema = z.object({ id: z.string(), type: z.string().nullable(), description: z.string() }); -export type PackageNumberDto = z.infer; - -/** - * ContainerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } containerNumber - * @property { string } poNumber - * @property { string } bookingNumber - * @property { string } blNumber - * @property { string } stuffedInContainer - * @property { string } containerType - * @property { string } loadType - * @property { string[] } hsCode - * @property { number } totalVolume - * @property { number } totalWeight - * @property { string } cargoDescription - * @property { number } noS - * @property { ContainerJourneyDto[] } journeys - * @property { PackageNumberDto[] } packages - * @property { string } bookingId - * @property { string } destination - * @property { string[] } files - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const ContainerResponseDtoSchema = z.object({ id: z.string(), containerNumber: z.string().nullable(), poNumber: z.string().nullable(), bookingNumber: z.string().nullable(), blNumber: z.string().nullable(), stuffedInContainer: z.iso.datetime({ offset: true }).nullable(), containerType: z.string().nullable(), loadType: z.string().nullable(), hsCode: z.array(z.string()).nullable(), totalVolume: z.number().nullable(), totalWeight: z.number().nullable(), cargoDescription: z.string().nullable(), noS: z.number().nullable(), journeys: z.array(ContainerJourneyDtoSchema).nullish(), packages: z.array(PackageNumberDtoSchema).nullish(), bookingId: z.string().nullable(), destination: z.string().nullable(), files: z.array(z.string()).nullable(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); -export type ContainerResponseDto = z.infer; - -/** - * ContainerJourneyResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { ContainerJourneyDto[] } journeys - * @property { string[] } packageNumbers - */ -export const ContainerJourneyResponseDtoSchema = z.object({ id: z.string(), number: z.string(), journeys: z.array(ContainerJourneyDtoSchema), packageNumbers: z.array(z.string()) }); -export type ContainerJourneyResponseDto = z.infer; - -/** - * ContainerFilterDtoSchema - * @type { object } - * @property { number[] } companyIds - * @property { string } search - */ -export const ContainerFilterDtoSchema = z.object({ companyIds: z.array(z.number()).nullable(), search: z.string().nullable() }).partial(); -export type ContainerFilterDto = z.infer; - -/** - * ControlTowerContainersFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ControlTowerContainersFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); -export type ControlTowerContainersFindAllOrderParamEnum = z.infer; -export const ControlTowerContainersFindAllOrderParamEnum = ControlTowerContainersFindAllOrderParamEnumSchema.enum; - -/** - * ControlTowerContainersFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ContainerListItemDto[] } items - */ -export const ControlTowerContainersFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ContainerListItemDtoSchema).nullable() }).partial().shape }); -export type ControlTowerContainersFindAllResponse = z.infer; - -} diff --git a/test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts b/test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts deleted file mode 100644 index ccb35ea..0000000 --- a/test/generated/next/controlTowerContainers/controlTowerContainers.queries.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerContainersModels } from "./controlTowerContainers.models"; -import { ControlTowerContainersApi } from "./controlTowerContainers.api"; - -export namespace ControlTowerContainersQueries { -export const moduleName = QueryModule.ControlTowerContainers; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string) => [...keys.all, "/containers", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string) => [...keys.all, "/containers", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/containers/:id", id] as const, - getJourney: (id: string) => [...keys.all, "/containers/:id/journey", id] as const, -}; - -/** - * Query `useFindAll` - * @description Lists containers - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => - ControlTowerContainersApi.findAll(limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @description Lists containers - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerContainersModels.ContainerFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerContainersModels.ContainerFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - ControlTowerContainersApi.findAll(limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @description Returns a container with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => - ControlTowerContainersApi.findById(id), - ...options, - }); -}; - -/** - * Query `useGetJourney` - * @description Returns the journey and package numbers of a container with the specified id - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetJourney = ({ id }: { id: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getJourney(id), - queryFn: () => - ControlTowerContainersApi.getJourney(id), - ...options, - }); -}; - -} diff --git a/test/generated/next/controlTowerMe/controlTowerMe.api.ts b/test/generated/next/controlTowerMe/controlTowerMe.api.ts deleted file mode 100644 index 91b82bc..0000000 --- a/test/generated/next/controlTowerMe/controlTowerMe.api.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerMeModels } from "./controlTowerMe.models"; - -export namespace ControlTowerMeApi { -export const getUserProfile = () => { - return AppRestClient.get( - { resSchema: ControlTowerMeModels.GetUserProfileResponseSchema }, - `/me`, - - ) -}; -export const updateUserData = (data: ControlTowerMeModels.UserUpdateDto, ) => { - return AppRestClient.put( - { resSchema: ControlTowerMeModels.UpdateUserDataResponseSchema }, - `/me`, - ZodExtended.parse(ControlTowerMeModels.UserUpdateDtoSchema, data), - - ) -}; -export const updateUserProfile = (data: ControlTowerMeModels.UserBasicUpdateDto, ) => { - return AppRestClient.put( - { resSchema: ControlTowerMeModels.UpdateUserProfileResponseSchema }, - `/me/basic`, - ZodExtended.parse(ControlTowerMeModels.UserBasicUpdateDtoSchema, data), - - ) -}; -export const updatePassword = (data: ControlTowerMeModels.UserPasswordUpdateDto, ) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/password`, - ZodExtended.parse(ControlTowerMeModels.UserPasswordUpdateDtoSchema, data), - - ) -}; -export const updateEmailPreferences = (data: ControlTowerMeModels.UserEmailPreferencesUpdateDto, ) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/email-preferences`, - ZodExtended.parse(ControlTowerMeModels.UserEmailPreferencesUpdateDtoSchema, data), - - ) -}; -export const updateProjectAccess = () => { - return AppRestClient.put( - { resSchema: z.void() }, - `/me/access`, - - ) -}; -} diff --git a/test/generated/next/controlTowerMe/controlTowerMe.models.ts b/test/generated/next/controlTowerMe/controlTowerMe.models.ts deleted file mode 100644 index e453fe6..0000000 --- a/test/generated/next/controlTowerMe/controlTowerMe.models.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerMeModels { -/** - * LinksDtoSchema - * @type { object } - * @property { string } self - * @property { string } related - */ -export const LinksDtoSchema = z.object({ self: z.string().nullable(), related: z.string().nullable() }).partial(); -export type LinksDto = z.infer; - -/** - * ApiResponseDataDtoSchema - * @type { object } - * @property { string } type - * @property { string } id - * @property { object } attributes - * @property { object } relationships - * @property { LinksDto } links - */ -export const ApiResponseDataDtoSchema = z.object({ type: z.string(), id: z.string(), attributes: z.object({}).nullish(), relationships: z.object({}).nullish(), links: LinksDtoSchema.nullish() }); -export type ApiResponseDataDto = z.infer; - -/** - * PaginationLinksDtoSchema - * @type { object } - * @property { string } next - * @property { string } self - * @property { string } last - */ -export const PaginationLinksDtoSchema = z.object({ next: z.string().nullable(), self: z.string().nullable(), last: z.string().nullable() }).partial(); -export type PaginationLinksDto = z.infer; - -/** - * ApiResponseDtoSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - */ -export const ApiResponseDtoSchema = z.object({ data: ApiResponseDataDtoSchema, links: PaginationLinksDtoSchema.nullish() }); -export type ApiResponseDto = z.infer; - -/** - * DelayNotificationEnumSchema - * @type { enum } - */ -export const DelayNotificationEnumSchema = z.enum(["EveryDelay", "LongerThan24Hours", "LongerThan3Days"]); -export type DelayNotificationEnum = z.infer; -export const DelayNotificationEnum = DelayNotificationEnumSchema.enum; - -/** - * UserEmailPreferencesDtoSchema - * @type { object } - * @property { boolean } originDeparture - * @property { boolean } loadedOnVessel - * @property { boolean } destinationArrival - * @property { boolean } onsiteDelivery - * @property { DelayNotificationEnum } delay - */ -export const UserEmailPreferencesDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }); -export type UserEmailPreferencesDto = z.infer; - -/** - * UserProjectAccessDtoSchema - * @type { object } - * @property { string[] } projectIds - */ -export const UserProjectAccessDtoSchema = z.object({ projectIds: z.array(z.string()) }); -export type UserProjectAccessDto = z.infer; - -/** - * UserRoleEnumSchema - * @type { enum } - */ -export const UserRoleEnumSchema = z.enum(["User", "Admin"]); -export type UserRoleEnum = z.infer; -export const UserRoleEnum = UserRoleEnumSchema.enum; - -/** - * UserDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } name Min Length: `3` - * @property { string } email - * @property { UserEmailPreferencesDto } emailPreferences - * @property { UserProjectAccessDto } projectAccess - * @property { UserRoleEnum } role - * @property { boolean } isAdmin - */ -export const UserDetailDtoSchema = z.object({ id: z.string(), name: z.string().min(3), email: z.email(), emailPreferences: UserEmailPreferencesDtoSchema.nullable(), projectAccess: UserProjectAccessDtoSchema.nullable(), role: UserRoleEnumSchema.nullable(), isAdmin: z.boolean() }); -export type UserDetailDto = z.infer; - -/** - * UserEmailPreferencesUpdateDtoSchema - * @type { object } - * @property { boolean } originDeparture - * @property { boolean } loadedOnVessel - * @property { boolean } destinationArrival - * @property { boolean } onsiteDelivery - * @property { DelayNotificationEnum } delay - */ -export const UserEmailPreferencesUpdateDtoSchema = z.object({ originDeparture: z.boolean(), loadedOnVessel: z.boolean(), destinationArrival: z.boolean(), onsiteDelivery: z.boolean(), delay: DelayNotificationEnumSchema }); -export type UserEmailPreferencesUpdateDto = z.infer; - -/** - * UserProjectAccessUpdateDtoSchema - * @type { object } - * @property { number[] } projectIds - */ -export const UserProjectAccessUpdateDtoSchema = z.object({ projectIds: z.array(z.number()) }); -export type UserProjectAccessUpdateDto = z.infer; - -/** - * UserUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } password - * @property { UserEmailPreferencesUpdateDto } emailPreferences - * @property { UserProjectAccessUpdateDto } projectAccess - */ -export const UserUpdateDtoSchema = z.object({ name: z.string(), email: z.email(), password: z.string(), emailPreferences: UserEmailPreferencesUpdateDtoSchema, projectAccess: UserProjectAccessUpdateDtoSchema }); -export type UserUpdateDto = z.infer; - -/** - * UserBasicUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - */ -export const UserBasicUpdateDtoSchema = z.object({ name: z.string(), email: z.email() }); -export type UserBasicUpdateDto = z.infer; - -/** - * UserPasswordUpdateDtoSchema - * @type { object } - * @property { string } password - */ -export const UserPasswordUpdateDtoSchema = z.object({ password: z.string() }); -export type UserPasswordUpdateDto = z.infer; - -/** - * GetUserProfileResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ -export const GetUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema.nullable() }).partial().nullable() }).partial().shape }); -export type GetUserProfileResponse = z.infer; - -/** - * UpdateUserDataResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ -export const UpdateUserDataResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema.nullable() }).partial().nullable() }).partial().shape }); -export type UpdateUserDataResponse = z.infer; - -/** - * UpdateUserProfileResponseSchema - * @type { object } - * @property { ApiResponseDataDto } data - * @property { PaginationLinksDto } links - * @property { UserDetailDto } data.attributes - */ -export const UpdateUserProfileResponseSchema = z.object({ ...ApiResponseDtoSchema.shape, ...z.object({ data: z.object({ attributes: UserDetailDtoSchema.nullable() }).partial().nullable() }).partial().shape }); -export type UpdateUserProfileResponse = z.infer; - -} diff --git a/test/generated/next/controlTowerMe/controlTowerMe.queries.ts b/test/generated/next/controlTowerMe/controlTowerMe.queries.ts deleted file mode 100644 index ae8316f..0000000 --- a/test/generated/next/controlTowerMe/controlTowerMe.queries.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerMeModels } from "./controlTowerMe.models"; -import { ControlTowerMeApi } from "./controlTowerMe.api"; - -export namespace ControlTowerMeQueries { -export const moduleName = QueryModule.ControlTowerMe; - -export const keys = { - all: [moduleName] as const, - getUserProfile: () => [...keys.all, "/me", ] as const, -}; - -/** - * Query `useGetUserProfile` - * @description Get basic user profile data - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200] - */ -export const useGetUserProfile = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getUserProfile(), - queryFn: ControlTowerMeApi.getUserProfile, - ...options, - }); -}; - -/** - * Mutation `useUpdateUserData` - * @description Update user data - * @param { ControlTowerMeModels.UserUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateUserData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updateUserData(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateUserProfile` - * @description Update basic user profile data - * @param { ControlTowerMeModels.UserBasicUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateUserProfile = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updateUserProfile(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdatePassword` - * @description Update user password - * @param { ControlTowerMeModels.UserPasswordUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdatePassword = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updatePassword(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateEmailPreferences` - * @description Update user email notification preferences - * @param { ControlTowerMeModels.UserEmailPreferencesUpdateDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateEmailPreferences = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - ControlTowerMeApi.updateEmailPreferences(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateProjectAccess` - * @description Update user project access - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200] - */ -export const useUpdateProjectAccess = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: () => - ControlTowerMeApi.updateProjectAccess() -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.api.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.api.ts deleted file mode 100644 index 1a72562..0000000 --- a/test/generated/next/controlTowerPackages/controlTowerPackages.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; - -export namespace ControlTowerPackagesApi { -export const findAll = (limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ControlTowerPackagesModels.ControlTowerPackagesFindAllResponseSchema }, - `/packages`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ControlTowerPackagesModels.PackageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.configs.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.configs.ts deleted file mode 100644 index 17e4ee5..0000000 --- a/test/generated/next/controlTowerPackages/controlTowerPackages.configs.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; -import { ControlTowerPackagesQueries } from "./controlTowerPackages.queries"; - -export namespace ControlTowerPackagesConfigs { -export const packagesConfig = { - meta: { - title: "Packages", - }, - readAll: { - schema: ControlTowerPackagesModels.PackageListItemDtoSchema, - paginated: ControlTowerPackagesQueries.useFindAll, - infinite: ControlTowerPackagesQueries.useFindAllInfinite, - filters: { - schema: ControlTowerPackagesModels.PackageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ControlTowerPackagesModels.PackageFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ControlTowerPackagesModels.PackageListItemDtoSchema, - options: { - columns: { - packageNumber: true, - bookingId: true, - id: true, - ets: true, - eta: true, - supplierName: true, - supplierAddress: true, - lastEvent: true, - lastEventLocation: true, - lastEventDate: true, - journeyFrom: true, - journeyTo: true, - vessel: true, - }, - sortable: ControlTowerPackagesModels.ControlTowerPackagesFindAllOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.models.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.models.ts deleted file mode 100644 index af298ca..0000000 --- a/test/generated/next/controlTowerPackages/controlTowerPackages.models.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ControlTowerPackagesModels { -/** - * PackageListItemDtoSchema - * @type { object } - * @property { string } packageNumber - * @property { string } bookingId - * @property { string } id - * @property { string } ets - * @property { string } eta - * @property { string } supplierName - * @property { string } supplierAddress - * @property { string } lastEvent - * @property { string } lastEventLocation - * @property { string } lastEventDate - * @property { string } journeyFrom - * @property { string } journeyTo - * @property { CommonModels.VesselDto } vessel - */ -export const PackageListItemDtoSchema = z.object({ packageNumber: z.string(), bookingId: z.string(), id: z.string(), ets: z.iso.datetime({ offset: true }).nullable(), eta: z.iso.datetime({ offset: true }).nullable(), supplierName: z.string().nullable(), supplierAddress: z.string().nullable(), lastEvent: z.string().nullable(), lastEventLocation: z.string().nullable(), lastEventDate: z.iso.datetime({ offset: true }).nullable(), journeyFrom: z.string().nullable(), journeyTo: z.string().nullable(), vessel: CommonModels.VesselDtoSchema.nullable() }); -export type PackageListItemDto = z.infer; - -/** - * PackageFilterDtoSchema - * @type { object } - * @property { string } search Min Length: `1` - */ -export const PackageFilterDtoSchema = z.object({ search: z.string().min(1).nullable() }).partial(); -export type PackageFilterDto = z.infer; - -/** - * ControlTowerPackagesFindAllOrderParamEnumSchema - * @type { enum } - */ -export const ControlTowerPackagesFindAllOrderParamEnumSchema = z.enum(["Eta", "createdAt"]); -export type ControlTowerPackagesFindAllOrderParamEnum = z.infer; -export const ControlTowerPackagesFindAllOrderParamEnum = ControlTowerPackagesFindAllOrderParamEnumSchema.enum; - -/** - * ControlTowerPackagesFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PackageListItemDto[] } items - */ -export const ControlTowerPackagesFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageListItemDtoSchema).nullable() }).partial().shape }); -export type ControlTowerPackagesFindAllResponse = z.infer; - -} diff --git a/test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts b/test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts deleted file mode 100644 index 006ba2a..0000000 --- a/test/generated/next/controlTowerPackages/controlTowerPackages.queries.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerPackagesModels } from "./controlTowerPackages.models"; -import { ControlTowerPackagesApi } from "./controlTowerPackages.api"; - -export namespace ControlTowerPackagesQueries { -export const moduleName = QueryModule.ControlTowerPackages; - -export const keys = { - all: [moduleName] as const, - findAll: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string) => [...keys.all, "/packages", limit, order, filter, page, cursor] as const, - findAllInfinite: (limit?: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string) => [...keys.all, "/packages", "infinite", limit, order, filter, cursor] as const, -}; - -/** - * Query `useFindAll` - * @description Lists packages - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findAll(limit, order, filter, page, cursor), - queryFn: () => - ControlTowerPackagesApi.findAll(limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @description Lists packages - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): Eta, createdAt. Example: `Eta` - * @param { ControlTowerPackagesModels.PackageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: ControlTowerPackagesModels.PackageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - ControlTowerPackagesApi.findAll(limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/next/controlTowerSearch/controlTowerSearch.api.ts b/test/generated/next/controlTowerSearch/controlTowerSearch.api.ts deleted file mode 100644 index 089524b..0000000 --- a/test/generated/next/controlTowerSearch/controlTowerSearch.api.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ControlTowerSearchModels } from "./controlTowerSearch.models"; - -export namespace ControlTowerSearchApi { -export const search = (data: ControlTowerSearchModels.SearchRequestDto, type?: ControlTowerSearchModels.SearchItemTypeEnum, limit?: number, ) => { - return AppRestClient.post( - { resSchema: ControlTowerSearchModels.SearchResponseDtoSchema }, - `/search`, - ZodExtended.parse(ControlTowerSearchModels.SearchRequestDtoSchema, data), - { - params: { - type: ZodExtended.parse(ControlTowerSearchModels.SearchItemTypeEnumSchema.optional(), type, { type: "query", name: "type" }), - limit: ZodExtended.parse(z.number().gte(1).nullish(), limit, { type: "query", name: "limit" }), - }, - } - ) -}; -} diff --git a/test/generated/next/controlTowerSearch/controlTowerSearch.models.ts b/test/generated/next/controlTowerSearch/controlTowerSearch.models.ts deleted file mode 100644 index c08141b..0000000 --- a/test/generated/next/controlTowerSearch/controlTowerSearch.models.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { z } from "zod"; - -export namespace ControlTowerSearchModels { -/** - * SearchItemTypeEnumSchema - * @type { enum } - */ -export const SearchItemTypeEnumSchema = z.enum(["Project", "Booking", "Container"]); -export type SearchItemTypeEnum = z.infer; -export const SearchItemTypeEnum = SearchItemTypeEnumSchema.enum; - -/** - * SearchItemDtoSchema - * @type { object } - * @property { SearchItemTypeEnum } type - * @property { string } id - * @property { string } label - */ -export const SearchItemDtoSchema = z.object({ type: SearchItemTypeEnumSchema, id: z.string(), label: z.string().nullable() }); -export type SearchItemDto = z.infer; - -/** - * SearchResponseDtoSchema - * @type { object } - * @property { SearchItemDto[] } items - * @property { number } projectsCount - * @property { number } bookingsCount - * @property { number } containersCount - * @property { number } totalCount - */ -export const SearchResponseDtoSchema = z.object({ items: z.array(SearchItemDtoSchema), projectsCount: z.number(), bookingsCount: z.number(), containersCount: z.number(), totalCount: z.number() }); -export type SearchResponseDto = z.infer; - -/** - * SearchRequestDtoSchema - * @type { object } - * @property { string } search - */ -export const SearchRequestDtoSchema = z.object({ search: z.string() }); -export type SearchRequestDto = z.infer; - -} diff --git a/test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts b/test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts deleted file mode 100644 index 4f95297..0000000 --- a/test/generated/next/controlTowerSearch/controlTowerSearch.queries.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ControlTowerSearchModels } from "./controlTowerSearch.models"; -import { ControlTowerSearchApi } from "./controlTowerSearch.api"; - -export namespace ControlTowerSearchQueries { -export const moduleName = QueryModule.ControlTowerSearch; - - - -/** - * Mutation `useSearch` - * @param { ControlTowerSearchModels.SearchRequestDto } mutation.data Body parameter - * @param { ControlTowerSearchModels.SearchItemTypeEnum } mutation.type Query parameter - * @param { number } mutation.limit Query parameter. Minimum: `1` - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useSearch = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data, type, limit }) => - ControlTowerSearchApi.search(data, type, limit) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/countries/countries.acl.ts b/test/generated/next/countries/countries.acl.ts deleted file mode 100644 index 0d2de89..0000000 --- a/test/generated/next/countries/countries.acl.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CountriesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Country" -] as AbilityTuple<"Read", "Country">; - -/** - * Use for `usePaginateCountryLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCountryLabels` query - */ -export const canUsePaginateCountryLabels = ( -) => [ - "Read", - "Country" -] as AbilityTuple<"Read", "Country">; - -/** - * Use for `useGetCountryById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCountryById` query - */ -export const canUseGetCountryById = ( -) => [ - "Read", - "Country" -] as AbilityTuple<"Read", "Country">; - -} diff --git a/test/generated/next/countries/countries.api.ts b/test/generated/next/countries/countries.api.ts deleted file mode 100644 index a40357c..0000000 --- a/test/generated/next/countries/countries.api.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CountriesModels } from "./countries.models"; - -export namespace CountriesApi { -export const paginate = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CountriesModels.CountriesPaginateResponseSchema }, - `/countries/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.CountriesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateCountryLabels = (limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CountriesModels.PaginateCountryLabelsResponseSchema }, - `/countries/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CountriesModels.PaginateCountryLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CountriesModels.CountryPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getCountryById = (id: string, ) => { - return AppRestClient.get( - { resSchema: CountriesModels.CountryResponseDTOSchema }, - `/countries/${id}`, - - ) -}; -} diff --git a/test/generated/next/countries/countries.configs.ts b/test/generated/next/countries/countries.configs.ts deleted file mode 100644 index 52d1c12..0000000 --- a/test/generated/next/countries/countries.configs.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CountriesModels } from "./countries.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CountriesQueries } from "./countries.queries"; -import { CountriesAcl } from "./countries.acl"; - -export namespace CountriesConfigs { -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CountriesAcl.canUsePaginate, - schema: CountriesModels.CountryResponseDTOSchema, - paginated: CountriesQueries.usePaginate, - infinite: CountriesQueries.usePaginateInfinite, - filters: { - schema: CountriesModels.CountryPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CountriesModels.CountryPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CountriesModels.CountryResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - isoCode2: true, - isoCode3: true, - currencyNotation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CountriesModels.CountriesPaginateOrderParamEnumSchema, - }, -}), - }, -}; - -export const labelsPaginateConfig = { - meta: { - title: "Labels Paginate", - }, - readAll: { - acl: CountriesAcl.canUsePaginateCountryLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CountriesQueries.usePaginateCountryLabels, - infinite: CountriesQueries.usePaginateCountryLabelsInfinite, - filters: { - schema: CountriesModels.CountryPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CountriesModels.CountryPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CountriesModels.PaginateCountryLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/countries/countries.models.ts b/test/generated/next/countries/countries.models.ts deleted file mode 100644 index 70ffc2c..0000000 --- a/test/generated/next/countries/countries.models.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CountriesModels { -/** - * CountryEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CountryEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type CountryEmployeeDTO = z.infer; - -/** - * CountryResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the country - * @property { string } name Name of the country - * @property { string } isoCode2 ISO 2-letter code - * @property { string } isoCode3 ISO 3-letter code - * @property { string } currencyNotation Currency notation - * @property { string } createdById - * @property { CountryEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { CountryEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const CountryResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string(), currencyNotation: z.string(), createdById: z.string().nullish(), createdBy: CountryEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CountryEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type CountryResponseDTO = z.infer; - -/** - * CountryPaginationFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const CountryPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type CountryPaginationFilterDto = z.infer; - -/** - * CountriesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const CountriesPaginateOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type CountriesPaginateOrderParamEnum = z.infer; -export const CountriesPaginateOrderParamEnum = CountriesPaginateOrderParamEnumSchema.enum; - -/** - * CountriesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CountryResponseDTO[] } items - */ -export const CountriesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CountryResponseDTOSchema).nullable() }).partial().shape }); -export type CountriesPaginateResponse = z.infer; - -/** - * PaginateCountryLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateCountryLabelsOrderParamEnumSchema = z.enum(["name", "isoCode2", "isoCode3", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateCountryLabelsOrderParamEnum = z.infer; -export const PaginateCountryLabelsOrderParamEnum = PaginateCountryLabelsOrderParamEnumSchema.enum; - -/** - * PaginateCountryLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateCountryLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PaginateCountryLabelsResponse = z.infer; - -} diff --git a/test/generated/next/countries/countries.queries.ts b/test/generated/next/countries/countries.queries.ts deleted file mode 100644 index e6a56f4..0000000 --- a/test/generated/next/countries/countries.queries.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CountriesAcl } from "./countries.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { CountriesModels } from "./countries.models"; -import { CountriesApi } from "./countries.api"; - -export namespace CountriesQueries { -export const moduleName = QueryModule.Countries; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/paginate", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/paginate", "infinite", limit, order, filter, cursor] as const, - paginateCountryLabels: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/countries/labels/paginate", limit, order, filter, page, cursor] as const, - paginateCountryLabelsInfinite: (limit?: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string) => [...keys.all, "/countries/labels/paginate", "infinite", limit, order, filter, cursor] as const, - getCountryById: (id: string) => [...keys.all, "/countries/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Countries - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Countries - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CountriesAcl.canUsePaginate()); - return CountriesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateCountryLabels` - * @summary Paginate country labels (id and name only) - * @permission Requires `canUsePaginateCountryLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCountryLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCountryLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateCountryLabelsInfinite - * @summary Paginate country labels (id and name only) - * @permission Requires `canUsePaginateCountryLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, isoCode2, isoCode3, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { CountriesModels.CountryPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCountryLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CountriesModels.CountryPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCountryLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CountriesAcl.canUsePaginateCountryLabels()); - return CountriesApi.paginateCountryLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetCountryById` - * @summary Get country by ID with complete details - * @permission Requires `canUseGetCountryById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCountryById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCountryById(id), - queryFn: () => { - checkAcl(CountriesAcl.canUseGetCountryById()); - return CountriesApi.getCountryById(id) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/currencies/currencies.acl.ts b/test/generated/next/currencies/currencies.acl.ts deleted file mode 100644 index ff528da..0000000 --- a/test/generated/next/currencies/currencies.acl.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CurrenciesAcl { -/** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -/** - * Use for `useCreateCurrency` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCurrency` mutation - */ -export const canUseCreateCurrency = ( -) => [ - "Create", - "Currency" -] as AbilityTuple<"Create", "Currency">; - -/** - * Use for `usePaginateCurrencyLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabels` query - */ -export const canUsePaginateCurrencyLabels = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -/** - * Use for `useGetCurrencyById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCurrencyById` query - */ -export const canUseGetCurrencyById = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -/** - * Use for `useUpdateCurrency` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCurrency` mutation - */ -export const canUseUpdateCurrency = ( -) => [ - "Update", - "Currency" -] as AbilityTuple<"Update", "Currency">; - -/** - * Use for `usePaginateCurrencyLabelsByOffice` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateCurrencyLabelsByOffice` query - */ -export const canUsePaginateCurrencyLabelsByOffice = ( -) => [ - "Read", - "Currency" -] as AbilityTuple<"Read", "Currency">; - -} diff --git a/test/generated/next/currencies/currencies.api.ts b/test/generated/next/currencies/currencies.api.ts deleted file mode 100644 index f989e32..0000000 --- a/test/generated/next/currencies/currencies.api.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CurrenciesModels } from "./currencies.models"; - -export namespace CurrenciesApi { -export const list = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.CurrenciesListResponseSchema }, - `/currencies`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.CurrenciesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createCurrency = (data: CurrenciesModels.CreateCurrencyRequestDTO, ) => { - return AppRestClient.post( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies`, - ZodExtended.parse(CurrenciesModels.CreateCurrencyRequestDTOSchema, data), - - ) -}; -export const paginateCurrencyLabels = (limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.PaginateCurrencyLabelsResponseSchema }, - `/currencies/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getCurrencyById = (isoCode: string, ) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies/${isoCode}`, - - ) -}; -export const updateCurrency = (isoCode: string, data: CurrenciesModels.UpdateCurrencyRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CurrenciesModels.CurrencyResponseDtoSchema }, - `/currencies/${isoCode}`, - ZodExtended.parse(CurrenciesModels.UpdateCurrencyRequestDTOSchema, data), - - ) -}; -export const paginateCurrencyLabelsByOffice = (officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CurrenciesModels.PaginateCurrencyLabelsByOfficeResponseSchema }, - `/offices/${officeId}/currencies/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CurrenciesModels.CurrencyPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/next/currencies/currencies.configs.ts b/test/generated/next/currencies/currencies.configs.ts deleted file mode 100644 index 6d36fb1..0000000 --- a/test/generated/next/currencies/currencies.configs.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CurrenciesModels } from "./currencies.models"; -import { CommonModels } from "@/data/common/common.models"; -import { CurrenciesQueries } from "./currencies.queries"; -import { CurrenciesAcl } from "./currencies.acl"; - -export namespace CurrenciesConfigs { -export const currenciesConfig = { - meta: { - title: "Currencies", - }, - readAll: { - acl: CurrenciesAcl.canUseList, - schema: CurrenciesModels.CurrencyResponseDtoSchema, - paginated: CurrenciesQueries.useList, - infinite: CurrenciesQueries.useListInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CurrenciesModels.CurrencyResponseDtoSchema, - options: { - columns: { - isoCode: true, - name: true, - symbol: true, - alignment: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: CurrenciesModels.CurrenciesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CurrenciesAcl.canUseGetCurrencyById, - schema: CurrenciesModels.CurrencyResponseDtoSchema, - query: CurrenciesQueries.useGetCurrencyById, - }, - create: { - acl: CurrenciesAcl.canUseCreateCurrency, - schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, - mutation: CurrenciesQueries.useCreateCurrency, - inputDefs: dynamicInputs({ - schema: CurrenciesModels.CreateCurrencyRequestDTOSchema, - options: { - inputs: { - isoCode: true, - name: true, - symbol: true, - alignment: true, - }, - }, -}) - }, - update: { - acl: CurrenciesAcl.canUseUpdateCurrency, - schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, - mutation: CurrenciesQueries.useUpdateCurrency, - inputDefs: dynamicInputs({ - schema: CurrenciesModels.UpdateCurrencyRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: CurrenciesAcl.canUsePaginateCurrencyLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CurrenciesQueries.usePaginateCurrencyLabels, - infinite: CurrenciesQueries.usePaginateCurrencyLabelsInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CurrenciesModels.PaginateCurrencyLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -export const labelsPaginateConfig = { - meta: { - title: "Labels Paginate", - }, - readAll: { - acl: CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice, - schema: CommonModels.LabelResponseDTOSchema, - paginated: CurrenciesQueries.usePaginateCurrencyLabelsByOffice, - infinite: CurrenciesQueries.usePaginateCurrencyLabelsByOfficeInfinite, - filters: { - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CurrenciesModels.CurrencyPaginationFilterDtoSchema, - options: { - inputs: { - officeId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: CurrenciesModels.PaginateCurrencyLabelsByOfficeOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/currencies/currencies.models.ts b/test/generated/next/currencies/currencies.models.ts deleted file mode 100644 index 1124eaf..0000000 --- a/test/generated/next/currencies/currencies.models.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CurrenciesModels { -/** - * CurrencyEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CurrencyEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type CurrencyEmployeeDTO = z.infer; - -/** - * CurrencyResponseDtoSchema - * @type { object } - * @property { string } isoCode isoCode of the currency - * @property { string } name Name of the currency - * @property { string } symbol Symbol of the currency - * @property { string } alignment Alignment of the currency - * @property { string } createdById ID of the employee who created this currency - * @property { CurrencyEmployeeDTO } createdBy Employee who created this currency - * @property { string } createdAt Date when the currency was created - * @property { string } updatedById ID of the employee who last updated this currency - * @property { CurrencyEmployeeDTO } updatedBy Employee who last updated this currency - * @property { string } updatedAt Date when the currency was last updated - */ -export const CurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string(), symbol: z.string().nullish(), alignment: z.string().nullish(), createdById: z.string().nullish(), createdBy: CurrencyEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: CurrencyEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type CurrencyResponseDto = z.infer; - -/** - * CurrencyPaginationFilterDtoSchema - * @type { object } - * @property { string } officeId - * @property { string } search - */ -export const CurrencyPaginationFilterDtoSchema = z.object({ officeId: z.string().nullable(), search: z.string().nullable() }).partial(); -export type CurrencyPaginationFilterDto = z.infer; - -/** - * CreateCurrencyRequestDTOSchema - * @type { object } - * @property { string } isoCode Unique identifier for the currency - * @property { string } name Name of the currency - * @property { string } symbol Symbol of the currency - * @property { string } alignment Alignment of the currency - */ -export const CreateCurrencyRequestDTOSchema = z.object({ isoCode: z.string(), name: z.string(), symbol: z.string(), alignment: z.string() }); -export type CreateCurrencyRequestDTO = z.infer; - -/** - * UpdateCurrencyRequestDTOSchema - * @type { object } - * @property { string } name Name of the currency - */ -export const UpdateCurrencyRequestDTOSchema = z.object({ name: z.string().nullable() }).partial(); -export type UpdateCurrencyRequestDTO = z.infer; - -/** - * CurrenciesListOrderParamEnumSchema - * @type { enum } - */ -export const CurrenciesListOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type CurrenciesListOrderParamEnum = z.infer; -export const CurrenciesListOrderParamEnum = CurrenciesListOrderParamEnumSchema.enum; - -/** - * CurrenciesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CurrencyResponseDto[] } items - */ -export const CurrenciesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CurrencyResponseDtoSchema).nullable() }).partial().shape }); -export type CurrenciesListResponse = z.infer; - -/** - * PaginateCurrencyLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateCurrencyLabelsOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateCurrencyLabelsOrderParamEnum = z.infer; -export const PaginateCurrencyLabelsOrderParamEnum = PaginateCurrencyLabelsOrderParamEnumSchema.enum; - -/** - * PaginateCurrencyLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateCurrencyLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PaginateCurrencyLabelsResponse = z.infer; - -/** - * PaginateCurrencyLabelsByOfficeOrderParamEnumSchema - * @type { enum } - */ -export const PaginateCurrencyLabelsByOfficeOrderParamEnumSchema = z.enum(["isoCode", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateCurrencyLabelsByOfficeOrderParamEnum = z.infer; -export const PaginateCurrencyLabelsByOfficeOrderParamEnum = PaginateCurrencyLabelsByOfficeOrderParamEnumSchema.enum; - -/** - * PaginateCurrencyLabelsByOfficeResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateCurrencyLabelsByOfficeResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PaginateCurrencyLabelsByOfficeResponse = z.infer; - -} diff --git a/test/generated/next/currencies/currencies.queries.ts b/test/generated/next/currencies/currencies.queries.ts deleted file mode 100644 index 0758b4a..0000000 --- a/test/generated/next/currencies/currencies.queries.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CurrenciesAcl } from "./currencies.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CurrenciesModels } from "./currencies.models"; -import { CurrenciesApi } from "./currencies.api"; - -export namespace CurrenciesQueries { -export const moduleName = QueryModule.Currencies; - -export const keys = { - all: [moduleName] as const, - list: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies", "infinite", limit, order, filter, cursor] as const, - paginateCurrencyLabels: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/currencies/labels/paginate", limit, order, filter, page, cursor] as const, - paginateCurrencyLabelsInfinite: (limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/currencies/labels/paginate", "infinite", limit, order, filter, cursor] as const, - getCurrencyById: (isoCode: string) => [...keys.all, "/currencies/:isoCode", isoCode] as const, - paginateCurrencyLabelsByOffice: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", officeId, limit, order, filter, page, cursor] as const, - paginateCurrencyLabelsByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/currencies/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useList` - * @summary List Currencies - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List Currencies - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUseList()); - return CurrenciesApi.list(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateCurrency` - * @summary Create Currency - * @permission Requires `canUseCreateCurrency` ability - * @param { CurrenciesModels.CreateCurrencyRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateCurrency = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CurrenciesAcl.canUseCreateCurrency()); - return CurrenciesApi.createCurrency(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateCurrencyLabels` - * @summary Paginate Currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCurrencyLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateCurrencyLabelsInfinite - * @summary Paginate Currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCurrencyLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabels()); - return CurrenciesApi.paginateCurrencyLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetCurrencyById` - * @summary Get Currency by iso code - * @permission Requires `canUseGetCurrencyById` ability - * @param { string } object.isoCode Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCurrencyById = ({ isoCode }: { isoCode: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCurrencyById(isoCode), - queryFn: () => { - checkAcl(CurrenciesAcl.canUseGetCurrencyById()); - return CurrenciesApi.getCurrencyById(isoCode) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCurrency` - * @summary Update Currency - * @permission Requires `canUseUpdateCurrency` ability - * @param { string } mutation.isoCode Path parameter - * @param { CurrenciesModels.UpdateCurrencyRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCurrency = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ isoCode, data }) => { - checkAcl(CurrenciesAcl.canUseUpdateCurrency()); - return CurrenciesApi.updateCurrency(isoCode, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { isoCode } = variables; - const updateKeys = [keys.getCurrencyById(isoCode)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateCurrencyLabelsByOffice` - * @summary Paginate office currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabelsByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateCurrencyLabelsByOfficeInfinite - * @summary Paginate office currency labels (id and name only) - * @permission Requires `canUsePaginateCurrencyLabelsByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): isoCode, name, createdAt, updatedAt, createdBy, updatedBy. Example: `isoCode` - * @param { CurrenciesModels.CurrencyPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateCurrencyLabelsByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CurrenciesModels.CurrencyPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateCurrencyLabelsByOfficeInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CurrenciesAcl.canUsePaginateCurrencyLabelsByOffice()); - return CurrenciesApi.paginateCurrencyLabelsByOffice(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/next/customerAccount/customerAccount.api.ts b/test/generated/next/customerAccount/customerAccount.api.ts deleted file mode 100644 index 6f77176..0000000 --- a/test/generated/next/customerAccount/customerAccount.api.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { CustomerAccountModels } from "./customerAccount.models"; - -export namespace CustomerAccountApi { -export const get = () => { - return AppRestClient.get( - { resSchema: CustomerAccountModels.CustomerAccountDtoSchema }, - `/customers/account`, - - ) -}; -} diff --git a/test/generated/next/customerAccount/customerAccount.models.ts b/test/generated/next/customerAccount/customerAccount.models.ts deleted file mode 100644 index 2656a0e..0000000 --- a/test/generated/next/customerAccount/customerAccount.models.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { z } from "zod"; - -export namespace CustomerAccountModels { -/** - * CustomerCompanyDtoSchema - * @type { object } - * @property { string } id Company ID - * @property { string } name Company name - */ -export const CustomerCompanyDtoSchema = z.object({ id: z.string(), name: z.string().nullish() }); -export type CustomerCompanyDto = z.infer; - -/** - * CustomerBusinessPartnerDtoSchema - * @type { object } - * @property { string } id Company ID - * @property { string } name Company name - */ -export const CustomerBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type CustomerBusinessPartnerDto = z.infer; - -/** - * CustomerAccountDtoSchema - * @type { object } - * @property { array[] } aclRules Can hold any type of value - * @property { string } id Customer ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { CustomerCompanyDto } company Company - * @property { CustomerBusinessPartnerDto } businessPartner - */ -export const CustomerAccountDtoSchema = z.object({ aclRules: z.array(z.array(z.any())), id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), phone: z.string().nullish(), company: CustomerCompanyDtoSchema.nullish(), businessPartner: CustomerBusinessPartnerDtoSchema.nullish() }); -export type CustomerAccountDto = z.infer; - -} diff --git a/test/generated/next/customerAccount/customerAccount.queries.ts b/test/generated/next/customerAccount/customerAccount.queries.ts deleted file mode 100644 index daf37c4..0000000 --- a/test/generated/next/customerAccount/customerAccount.queries.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { CustomerAccountApi } from "./customerAccount.api"; - -export namespace CustomerAccountQueries { -export const moduleName = QueryModule.CustomerAccount; - -export const keys = { - all: [moduleName] as const, - get: () => [...keys.all, "/customers/account", ] as const, -}; - -/** - * Query `useGet` - * @summary Get profile of logged-in user - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.get(), - queryFn: CustomerAccountApi.get, - ...options, - }); -}; - -} diff --git a/test/generated/next/customers/customers.acl.ts b/test/generated/next/customers/customers.acl.ts deleted file mode 100644 index bb972e0..0000000 --- a/test/generated/next/customers/customers.acl.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace CustomersAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Customer" -] as AbilityTuple<"Create", "Customer">; - -/** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( -) => [ - "Read", - "Customer" -] as AbilityTuple<"Read", "Customer">; - -/** - * Use for `useFindById` query ability. - * @description Read a customer with id - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Customer" -] as AbilityTuple<"Read", "Customer">; - -/** - * Use for `useUpdate` mutation ability. - * @description Update Customer - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Customer" -] as AbilityTuple<"Update", "Customer">; - -/** - * Use for `useDeactivate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeactivate` mutation - */ -export const canUseDeactivate = ( -) => [ - "Deactivate", - "Customer" -] as AbilityTuple<"Deactivate", "Customer">; - -/** - * Use for `useReactivate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReactivate` mutation - */ -export const canUseReactivate = ( -) => [ - "Reactivate", - "Customer" -] as AbilityTuple<"Reactivate", "Customer">; - -} diff --git a/test/generated/next/customers/customers.api.ts b/test/generated/next/customers/customers.api.ts deleted file mode 100644 index e418796..0000000 --- a/test/generated/next/customers/customers.api.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CustomersModels } from "./customers.models"; - -export namespace CustomersApi { -export const findProfile = () => { - return AppRestClient.get( - { resSchema: CustomersModels.CustomerProfileResponseDTOSchema }, - `/customers/me`, - - ) -}; -export const create = (data: CustomersModels.CreateCustomerDTO, ) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers`, - ZodExtended.parse(CustomersModels.CreateCustomerDTOSchema, data), - - ) -}; -export const list = (limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: CustomersModels.CustomersListResponseSchema }, - `/customers`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(CustomersModels.CustomersListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CustomersModels.CustomerPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (customerId: string, ) => { - return AppRestClient.get( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${customerId}`, - - ) -}; -export const update = (customerId: string, data: CustomersModels.UpdateCustomerDTO, ) => { - return AppRestClient.put( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${customerId}`, - ZodExtended.parse(CustomersModels.UpdateCustomerDTOSchema, data), - - ) -}; -export const deactivate = (id: string, ) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${id}/deactivate`, - - ) -}; -export const reactivate = (id: string, ) => { - return AppRestClient.post( - { resSchema: CustomersModels.CustomerResponseDTOSchema }, - `/customers/${id}/reactivate`, - - ) -}; -} diff --git a/test/generated/next/customers/customers.configs.ts b/test/generated/next/customers/customers.configs.ts deleted file mode 100644 index 95eec1d..0000000 --- a/test/generated/next/customers/customers.configs.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CustomersModels } from "./customers.models"; -import { CustomersQueries } from "./customers.queries"; -import { CustomersAcl } from "./customers.acl"; - -export namespace CustomersConfigs { -export const customersConfig = { - meta: { - title: "Customers", - }, - readAll: { - acl: CustomersAcl.canUseList, - schema: CustomersModels.CustomerListItemDTOSchema, - paginated: CustomersQueries.useList, - infinite: CustomersQueries.useListInfinite, - filters: { - schema: CustomersModels.CustomerPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CustomersModels.CustomerPaginationFilterDtoSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - companyId: true, - businessPartnerId: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CustomersModels.CustomerListItemDTOSchema, - options: { - columns: { - id: true, - firstName: true, - lastName: true, - email: true, - phone: true, - companyId: true, - businessPartnerId: true, - businessPartner: true, - }, - sortable: CustomersModels.CustomersListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: CustomersAcl.canUseFindById, - schema: CustomersModels.CustomerResponseDTOSchema, - query: CustomersQueries.useFindById, - }, - create: { - acl: CustomersAcl.canUseCreate, - schema: CustomersModels.CreateCustomerDTOSchema, - mutation: CustomersQueries.useCreate, - inputDefs: dynamicInputs({ - schema: CustomersModels.CreateCustomerDTOSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - phone: true, - companyId: true, - businessPartnerId: true, - }, - }, -}) - }, - update: { - acl: CustomersAcl.canUseUpdate, - schema: CustomersModels.UpdateCustomerDTOSchema, - mutation: CustomersQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: CustomersModels.UpdateCustomerDTOSchema, - options: { - inputs: { - firstName: true, - lastName: true, - phone: true, - companyId: true, - businessPartnerId: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/next/customers/customers.models.ts b/test/generated/next/customers/customers.models.ts deleted file mode 100644 index bf5e842..0000000 --- a/test/generated/next/customers/customers.models.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace CustomersModels { -/** - * CustomerProfileBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CustomerProfileBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type CustomerProfileBusinessPartnerDto = z.infer; - -/** - * CustomerProfileResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - * @property { CustomerProfileBusinessPartnerDto } businessPartner - */ -export const CustomerProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish(), businessPartner: CustomerProfileBusinessPartnerDtoSchema.nullish() }); -export type CustomerProfileResponseDTO = z.infer; - -/** - * CustomerBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CustomerBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type CustomerBusinessPartnerResponseDto = z.infer; - -/** - * CustomerResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company Id of the customer - * @property { string } businessPartnerId Business partner Id of the customer - * @property { boolean } archived Wether the customer is archived - * @property { CustomerBusinessPartnerResponseDto } businessPartner - */ -export const CustomerResponseDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish(), archived: z.boolean(), businessPartner: CustomerBusinessPartnerResponseDtoSchema.nullish() }); -export type CustomerResponseDTO = z.infer; - -/** - * CustomerListItemBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const CustomerListItemBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type CustomerListItemBusinessPartnerDto = z.infer; - -/** - * CustomerListItemDTOSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - * @property { CustomerListItemBusinessPartnerDto } businessPartner - */ -export const CustomerListItemDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.string(), phone: z.string(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish(), businessPartner: CustomerListItemBusinessPartnerDtoSchema.nullish() }); -export type CustomerListItemDTO = z.infer; - -/** - * CreateCustomerDTOSchema - * @type { object } - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } email Email of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - */ -export const CreateCustomerDTOSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string().nullish(), companyId: z.string().nullish(), businessPartnerId: z.string().nullish() }); -export type CreateCustomerDTO = z.infer; - -/** - * CustomerPaginationFilterDtoSchema - * @type { object } - * @property { string } firstName - * @property { string } lastName - * @property { string } email - * @property { string } companyId - * @property { string } businessPartnerId - * @property { string } search - */ -export const CustomerPaginationFilterDtoSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), companyId: z.string().nullable(), businessPartnerId: z.string().nullable(), search: z.string().nullable() }).partial(); -export type CustomerPaginationFilterDto = z.infer; - -/** - * UpdateCustomerDTOSchema - * @type { object } - * @property { string } firstName First name of the customer - * @property { string } lastName Last name of the customer - * @property { string } phone Phone number of the customer - * @property { string } companyId Company id of the customer - * @property { string } businessPartnerId Business partner id of the customer - */ -export const UpdateCustomerDTOSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), phone: z.string().nullable(), companyId: z.string().nullable(), businessPartnerId: z.string().nullable() }).partial(); -export type UpdateCustomerDTO = z.infer; - -/** - * CustomersListOrderParamEnumSchema - * @type { enum } - */ -export const CustomersListOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "createdAt"]); -export type CustomersListOrderParamEnum = z.infer; -export const CustomersListOrderParamEnum = CustomersListOrderParamEnumSchema.enum; - -/** - * CustomersListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CustomerListItemDTO[] } items - */ -export const CustomersListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CustomerListItemDTOSchema).nullable() }).partial().shape }); -export type CustomersListResponse = z.infer; - -} diff --git a/test/generated/next/customers/customers.queries.ts b/test/generated/next/customers/customers.queries.ts deleted file mode 100644 index e187d61..0000000 --- a/test/generated/next/customers/customers.queries.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { CustomersAcl } from "./customers.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CustomersModels } from "./customers.models"; -import { CustomersApi } from "./customers.api"; - -export namespace CustomersQueries { -export const moduleName = QueryModule.Customers; - -export const keys = { - all: [moduleName] as const, - findProfile: () => [...keys.all, "/customers/me", ] as const, - list: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/customers", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string) => [...keys.all, "/customers", "infinite", limit, order, filter, cursor] as const, - findById: (customerId: string) => [...keys.all, "/customers/:customerId", customerId] as const, -}; - -/** - * Query `useFindProfile` - * @summary Get customer by id - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfile = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findProfile(), - queryFn: CustomersApi.findProfile, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create new customer - * @permission Requires `canUseCreate` ability - * @param { CustomersModels.CreateCustomerDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(CustomersAcl.canUseCreate()); - return CustomersApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useList` - * @summary List customers - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` - * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List customers - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, createdAt. Example: `firstName` - * @param { CustomersModels.CustomerPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: CustomersModels.CustomerPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(CustomersAcl.canUseList()); - return CustomersApi.list(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get customer by id - * @permission Requires `canUseFindById` ability - * @param { string } object.customerId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ customerId }: { customerId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(customerId), - queryFn: () => { - checkAcl(CustomersAcl.canUseFindById()); - return CustomersApi.findById(customerId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update customer - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.customerId Path parameter - * @param { CustomersModels.UpdateCustomerDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ customerId, data }) => { - checkAcl(CustomersAcl.canUseUpdate()); - return CustomersApi.update(customerId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { customerId } = variables; - const updateKeys = [keys.findById(customerId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeactivate` - * @summary Deactivate customer - * @permission Requires `canUseDeactivate` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeactivate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CustomersAcl.canUseDeactivate()); - return CustomersApi.deactivate(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReactivate` - * @summary Reactivate customer - * @permission Requires `canUseReactivate` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReactivate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(CustomersAcl.canUseReactivate()); - return CustomersApi.reactivate(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/depots/depots.acl.ts b/test/generated/next/depots/depots.acl.ts deleted file mode 100644 index 46e2374..0000000 --- a/test/generated/next/depots/depots.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace DepotsAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Depot" -] as AbilityTuple<"Create", "Depot">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Depot" -] as AbilityTuple<"Update", "Depot">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Depot" -] as AbilityTuple<"Archive", "Depot">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "Depot" -] as AbilityTuple<"Archive", "Depot">; - -} diff --git a/test/generated/next/depots/depots.api.ts b/test/generated/next/depots/depots.api.ts deleted file mode 100644 index 5b6a5b3..0000000 --- a/test/generated/next/depots/depots.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DepotsModels } from "./depots.models"; - -export namespace DepotsApi { -export const create = (data: DepotsModels.CreateDepotRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots`, - ZodExtended.parse(DepotsModels.CreateDepotRequestDTOSchema, data), - - ) -}; -export const paginate = (limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DepotsModels.DepotsPaginateResponseSchema }, - `/depots`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DepotsModels.DepotPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DepotsModels.DepotsPaginateLabelsResponseSchema }, - `/depots/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DepotsModels.DepotLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots/${id}`, - - ) -}; -export const update = (id: string, data: DepotsModels.UpdateDepotRequestDTO, ) => { - return AppRestClient.put( - { resSchema: DepotsModels.DepotResponseDTOSchema }, - `/depots/${id}`, - ZodExtended.parse(DepotsModels.UpdateDepotRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/depots/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/depots/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/depots/depots.configs.ts b/test/generated/next/depots/depots.configs.ts deleted file mode 100644 index 3e95aff..0000000 --- a/test/generated/next/depots/depots.configs.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DepotsModels } from "./depots.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DepotsQueries } from "./depots.queries"; -import { DepotsAcl } from "./depots.acl"; - -export namespace DepotsConfigs { -export const depotsConfig = { - meta: { - title: "Depots", - }, - readAll: { - acl: DepotsAcl.canUsePaginate, - schema: DepotsModels.DepotResponseDTOSchema, - paginated: DepotsQueries.usePaginate, - infinite: DepotsQueries.usePaginateInfinite, - filters: { - schema: DepotsModels.DepotPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DepotsModels.DepotPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DepotsModels.DepotResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - name: true, - shortName: true, - additionalInformation: true, - address: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: DepotsModels.DepotsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DepotsAcl.canUseFindById, - schema: DepotsModels.DepotResponseDTOSchema, - query: DepotsQueries.useFindById, - }, - create: { - acl: DepotsAcl.canUseCreate, - schema: DepotsModels.CreateDepotRequestDTOSchema, - mutation: DepotsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DepotsModels.CreateDepotRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - additionalInformation: true, - name: true, - street: true, - zip: true, - district: true, - cityId: true, - countryId: true, - }, - }, -}) - }, - update: { - acl: DepotsAcl.canUseUpdate, - schema: DepotsModels.UpdateDepotRequestDTOSchema, - mutation: DepotsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DepotsModels.UpdateDepotRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - additionalInformation: true, - name: true, - street: true, - zip: true, - district: true, - cityId: true, - countryId: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DepotsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DepotsQueries.usePaginateLabels, - infinite: DepotsQueries.usePaginateLabelsInfinite, - filters: { - schema: DepotsModels.DepotLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DepotsModels.DepotLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DepotsModels.DepotsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/depots/depots.models.ts b/test/generated/next/depots/depots.models.ts deleted file mode 100644 index a7395cb..0000000 --- a/test/generated/next/depots/depots.models.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DepotsModels { -/** - * DepotCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DepotCityDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type DepotCityDto = z.infer; - -/** - * DepotCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const DepotCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type DepotCountryDto = z.infer; - -/** - * AddressDTOSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { DepotCityDto } city - * @property { string } district District name - * @property { DepotCountryDto } country - */ -export const AddressDTOSchema = z.object({ street: z.string(), zip: z.string(), city: DepotCityDtoSchema.nullish(), district: z.string().nullish(), country: DepotCountryDtoSchema.nullish() }); -export type AddressDTO = z.infer; - -/** - * DepotEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DepotEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type DepotEmployeeDTO = z.infer; - -/** - * DepotResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the depot - * @property { string } matchCode Match code for the depot - * @property { string } name Name of the depot - * @property { string } shortName Short name of the depot - * @property { string } additionalInformation Additional info of the depot - * @property { AddressDTO } address Address details of the depot - * @property { boolean } archived - * @property { string } createdById - * @property { DepotEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DepotEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const DepotResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), address: AddressDTOSchema, archived: z.boolean(), createdById: z.string().nullish(), createdBy: DepotEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DepotEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type DepotResponseDTO = z.infer; - -/** - * CreateDepotRequestDTOSchema - * @type { object } - * @property { string } matchCode Unique identifier code for the depot - * @property { string } shortName Optional short name for the depot - * @property { string } additionalInformation - * @property { string } name Full name of the depot - * @property { string } street Street address of the depot - * @property { string } zip ZIP/Postal code - * @property { string } district District information - * @property { string } cityId City id - * @property { string } countryId Country code - */ -export const CreateDepotRequestDTOSchema = z.object({ matchCode: z.string(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), name: z.string(), street: z.string(), zip: z.string(), district: z.string().nullish(), cityId: z.string(), countryId: z.string() }); -export type CreateDepotRequestDTO = z.infer; - -/** - * DepotPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter depots by name, matchCode, or shortName - * @property { boolean } archived - */ -export const DepotPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type DepotPaginationFilterDto = z.infer; - -/** - * DepotLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DepotLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type DepotLabelFilterDto = z.infer; - -/** - * UpdateDepotRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code for the depot - * @property { string } shortName Updated short name - * @property { string } additionalInformation Updated short name - * @property { string } name Updated full name - * @property { string } street Updated street address - * @property { string } zip Updated ZIP/Postal code - * @property { string } district Updated district information - * @property { string } cityId Updated city id - * @property { string } countryId Updated country code - */ -export const UpdateDepotRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), additionalInformation: z.string().nullable(), name: z.string().nullable(), street: z.string().nullable(), zip: z.string().nullable(), district: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable() }).partial(); -export type UpdateDepotRequestDTO = z.infer; - -/** - * DepotsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const DepotsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DepotsPaginateOrderParamEnum = z.infer; -export const DepotsPaginateOrderParamEnum = DepotsPaginateOrderParamEnumSchema.enum; - -/** - * DepotsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DepotResponseDTO[] } items - */ -export const DepotsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DepotResponseDTOSchema).nullable() }).partial().shape }); -export type DepotsPaginateResponse = z.infer; - -/** - * DepotsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DepotsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DepotsPaginateLabelsOrderParamEnum = z.infer; -export const DepotsPaginateLabelsOrderParamEnum = DepotsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DepotsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DepotsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type DepotsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/depots/depots.queries.ts b/test/generated/next/depots/depots.queries.ts deleted file mode 100644 index 49c639f..0000000 --- a/test/generated/next/depots/depots.queries.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DepotsAcl } from "./depots.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DepotsModels } from "./depots.models"; -import { DepotsApi } from "./depots.api"; - -export namespace DepotsQueries { -export const moduleName = QueryModule.Depots; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string) => [...keys.all, "/depots", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/depots/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string) => [...keys.all, "/depots/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/depots/:id", id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a new depot - * @permission Requires `canUseCreate` ability - * @param { DepotsModels.CreateDepotRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(DepotsAcl.canUseCreate()); - return DepotsApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Depots - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Depots - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DepotsAcl.canUsePaginate()); - return DepotsApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate depots with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate depots with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DepotsModels.DepotLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: DepotsModels.DepotLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DepotsAcl.canUsePaginateLabels()); - return DepotsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Fetch depot by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(DepotsAcl.canUseFindById()); - return DepotsApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update a depot - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { DepotsModels.UpdateDepotRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(DepotsAcl.canUseUpdate()); - return DepotsApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a depot - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(DepotsAcl.canUseArchive()); - return DepotsApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a depot - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(DepotsAcl.canUseUnarchive()); - return DepotsApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/documentTemplates/documentTemplates.acl.ts b/test/generated/next/documentTemplates/documentTemplates.acl.ts deleted file mode 100644 index 8996246..0000000 --- a/test/generated/next/documentTemplates/documentTemplates.acl.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DocumentTemplatesAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List document template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List document templates - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Create", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get document template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Read", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update document template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useAddRemarkBlock` mutation ability. For global ability, omit the object parameter. - * @description Add remark block to document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddRemarkBlock` mutation - */ -export const canUseAddRemarkBlock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useDeleteRemarkBlock` mutation ability. For global ability, omit the object parameter. - * @description Delete remark block from document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRemarkBlock` mutation - */ -export const canUseDeleteRemarkBlock = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Update", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Archive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive document template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("DocumentTemplate", object) : "DocumentTemplate" -] as AbilityTuple<"Unarchive", "DocumentTemplate" | ForcedSubject<"DocumentTemplate"> & { officeId: string, }>; - -} diff --git a/test/generated/next/documentTemplates/documentTemplates.api.ts b/test/generated/next/documentTemplates/documentTemplates.api.ts deleted file mode 100644 index 6b9a31a..0000000 --- a/test/generated/next/documentTemplates/documentTemplates.api.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; - -export namespace DocumentTemplatesApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/document-templates/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplatesListResponseSchema }, - `/offices/${officeId}/document-templates`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DocumentTemplatesModels.DocumentTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: DocumentTemplatesModels.CreateDocumentTemplateRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates`, - ZodExtended.parse(DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, data), - - ) -}; -export const findById = (documentTemplateId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}`, - - ) -}; -export const update = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}`, - ZodExtended.parse(DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, data), - - ) -}; -export const addRemarkBlock = (documentTemplateId: string, officeId: string, data: DocumentTemplatesModels.CreateRemarkBlockRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks`, - ZodExtended.parse(DocumentTemplatesModels.CreateRemarkBlockRequestDTOSchema, data), - - ) -}; -export const deleteRemarkBlock = (documentTemplateId: string, remarkBlockId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/remark-blocks/${remarkBlockId}`, - - ) -}; -export const archive = (documentTemplateId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/archive`, - - ) -}; -export const unarchive = (documentTemplateId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema }, - `/offices/${officeId}/document-templates/${documentTemplateId}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/documentTemplates/documentTemplates.configs.ts b/test/generated/next/documentTemplates/documentTemplates.configs.ts deleted file mode 100644 index bb792f1..0000000 --- a/test/generated/next/documentTemplates/documentTemplates.configs.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DocumentTemplatesQueries } from "./documentTemplates.queries"; -import { DocumentTemplatesAcl } from "./documentTemplates.acl"; - -export namespace DocumentTemplatesConfigs { -export const documentTemplatesConfig = { - meta: { - title: "Document Templates", - }, - readAll: { - acl: DocumentTemplatesAcl.canUseList, - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - paginated: DocumentTemplatesQueries.useList, - infinite: DocumentTemplatesQueries.useListInfinite, - filters: { - schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DocumentTemplatesModels.DocumentTemplateFilterDtoSchema, - options: { - inputs: { - isArchived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - isArchived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - blocks: true, - }, - sortable: DocumentTemplatesModels.DocumentTemplatesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DocumentTemplatesAcl.canUseFindById, - schema: DocumentTemplatesModels.DocumentTemplateResponseDTOSchema, - query: DocumentTemplatesQueries.useFindById, - }, - create: { - acl: DocumentTemplatesAcl.canUseCreate, - schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, - mutation: DocumentTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DocumentTemplatesModels.CreateDocumentTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - blocks: true, - }, - }, -}) - }, - update: { - acl: DocumentTemplatesAcl.canUseUpdate, - schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, - mutation: DocumentTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DocumentTemplatesModels.UpdateDocumentTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - isArchived: true, - blocks: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DocumentTemplatesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DocumentTemplatesQueries.usePaginateLabels, - infinite: DocumentTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DocumentTemplatesModels.DocumentTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DocumentTemplatesModels.DocumentTemplatesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/documentTemplates/documentTemplates.models.ts b/test/generated/next/documentTemplates/documentTemplates.models.ts deleted file mode 100644 index 5747c5c..0000000 --- a/test/generated/next/documentTemplates/documentTemplates.models.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DocumentTemplatesModels { -/** - * DocumentTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DocumentTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type DocumentTemplateEmployeeDTO = z.infer; - -/** - * DocumentTemplateResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name - * @property { boolean } isArchived - * @property { string } createdById ID of the employee who created this template - * @property { DocumentTemplateEmployeeDTO } createdBy Employee who created this template - * @property { string } createdAt - * @property { string } updatedById ID of the employee who last updated this template - * @property { DocumentTemplateEmployeeDTO } updatedBy Employee who last updated this template - * @property { string } updatedAt - * @property { CommonModels.TemplateBlocksResponseDTO } blocks - */ -export const DocumentTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isArchived: z.boolean(), createdById: z.string().nullish(), createdBy: DocumentTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DocumentTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), blocks: CommonModels.TemplateBlocksResponseDTOSchema }); -export type DocumentTemplateResponseDTO = z.infer; - -/** - * TemplateBlocksDTOSchema - * @type { object } - * @property { CommonModels.TitleBlockDTO } titleBlock - * @property { CommonModels.ReceiverBlockDTO } receiverBlock - * @property { CommonModels.OurInformationBlockDTO } ourInformationBlock - * @property { CommonModels.RouteTableBlockDTO } routeTableBlock - * @property { CommonModels.CargoTableBlockDTO } cargoTableBlock - * @property { CommonModels.CargoSummaryBlockDTO } cargoSummaryBlock - * @property { CommonModels.FinanceTableBlockDTO } financeTableBlock - * @property { CommonModels.RemarkBlockDTO[] } remarkBlocks - * @property { CommonModels.FooterBlockDTO } footerBlock - * @property { CommonModels.TermsBlockDTO } termsBlock - * @property { CommonModels.CutOffDatesBlockDTO } cutOffDatesBlock - */ -export const TemplateBlocksDTOSchema = z.object({ titleBlock: CommonModels.TitleBlockDTOSchema.nullable(), receiverBlock: CommonModels.ReceiverBlockDTOSchema.nullable(), ourInformationBlock: CommonModels.OurInformationBlockDTOSchema.nullable(), routeTableBlock: CommonModels.RouteTableBlockDTOSchema.nullable(), cargoTableBlock: CommonModels.CargoTableBlockDTOSchema.nullable(), cargoSummaryBlock: CommonModels.CargoSummaryBlockDTOSchema.nullable(), financeTableBlock: CommonModels.FinanceTableBlockDTOSchema.nullable(), remarkBlocks: z.array(CommonModels.RemarkBlockDTOSchema).nullable(), footerBlock: CommonModels.FooterBlockDTOSchema.nullable(), termsBlock: CommonModels.TermsBlockDTOSchema.nullable(), cutOffDatesBlock: CommonModels.CutOffDatesBlockDTOSchema.nullable() }).partial(); -export type TemplateBlocksDTO = z.infer; - -/** - * CreateDocumentTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { TemplateBlocksDTO } blocks - */ -export const CreateDocumentTemplateRequestDTOSchema = z.object({ name: z.string(), blocks: TemplateBlocksDTOSchema.nullish() }); -export type CreateDocumentTemplateRequestDTO = z.infer; - -/** - * UpdateDocumentTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { boolean } isArchived - * @property { TemplateBlocksDTO } blocks - */ -export const UpdateDocumentTemplateRequestDTOSchema = z.object({ name: z.string().nullable(), isArchived: z.boolean().nullable(), blocks: TemplateBlocksDTOSchema.nullable() }).partial(); -export type UpdateDocumentTemplateRequestDTO = z.infer; - -/** - * CreateRemarkBlockRequestDTOSchema - * @type { object } - * @property { CommonModels.EditorContentUpdateDto } content - * @property { number } position 1-based position of the remark block. Minimum: `1` - * @property { boolean } enabled - */ -export const CreateRemarkBlockRequestDTOSchema = z.object({ content: CommonModels.EditorContentUpdateDtoSchema, position: z.number().gte(1).nullish(), enabled: z.boolean().nullish() }); -export type CreateRemarkBlockRequestDTO = z.infer; - -/** - * DocumentTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DocumentTemplateLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type DocumentTemplateLabelFilterDto = z.infer; - -/** - * DocumentTemplateFilterDtoSchema - * @type { object } - * @property { boolean } isArchived - * @property { string } search - */ -export const DocumentTemplateFilterDtoSchema = z.object({ isArchived: z.boolean().nullable(), search: z.string().nullable() }).partial(); -export type DocumentTemplateFilterDto = z.infer; - -/** - * DocumentTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DocumentTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DocumentTemplatesPaginateLabelsOrderParamEnum = z.infer; -export const DocumentTemplatesPaginateLabelsOrderParamEnum = DocumentTemplatesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DocumentTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DocumentTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type DocumentTemplatesPaginateLabelsResponse = z.infer; - -/** - * DocumentTemplatesListOrderParamEnumSchema - * @type { enum } - */ -export const DocumentTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DocumentTemplatesListOrderParamEnum = z.infer; -export const DocumentTemplatesListOrderParamEnum = DocumentTemplatesListOrderParamEnumSchema.enum; - -/** - * DocumentTemplatesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DocumentTemplateResponseDTO[] } items - */ -export const DocumentTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DocumentTemplateResponseDTOSchema).nullable() }).partial().shape }); -export type DocumentTemplatesListResponse = z.infer; - -} diff --git a/test/generated/next/documentTemplates/documentTemplates.queries.ts b/test/generated/next/documentTemplates/documentTemplates.queries.ts deleted file mode 100644 index 1a3f849..0000000 --- a/test/generated/next/documentTemplates/documentTemplates.queries.ts +++ /dev/null @@ -1,333 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DocumentTemplatesAcl } from "./documentTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DocumentTemplatesModels } from "./documentTemplates.models"; -import { DocumentTemplatesApi } from "./documentTemplates.api"; - -export namespace DocumentTemplatesQueries { -export const moduleName = QueryModule.DocumentTemplates; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/document-templates", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (documentTemplateId: string, officeId: string) => [...keys.all, "/offices/:officeId/document-templates/:documentTemplateId", documentTemplateId, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate document template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate document template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DocumentTemplatesAcl.canUsePaginateLabels({ officeId } )); - return DocumentTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List document templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); - return DocumentTemplatesApi.list(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List document templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { DocumentTemplatesModels.DocumentTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DocumentTemplatesModels.DocumentTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DocumentTemplatesAcl.canUseList({ officeId } )); - return DocumentTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new document template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.CreateDocumentTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseCreate({ officeId } )); - return DocumentTemplatesApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get document template by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.documentTemplateId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ documentTemplateId, officeId }: { documentTemplateId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(documentTemplateId, officeId), - queryFn: () => { - checkAcl(DocumentTemplatesAcl.canUseFindById({ officeId } )); - return DocumentTemplatesApi.findById(documentTemplateId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update document template by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.UpdateDocumentTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseUpdate({ officeId } )); - return DocumentTemplatesApi.update(documentTemplateId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useAddRemarkBlock` - * @summary Add a remark block to a document template - * @permission Requires `canUseAddRemarkBlock` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DocumentTemplatesModels.CreateRemarkBlockRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useAddRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId, data }) => { - checkAcl(DocumentTemplatesAcl.canUseAddRemarkBlock({ officeId } )); - return DocumentTemplatesApi.addRemarkBlock(documentTemplateId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRemarkBlock` - * @summary Delete a remark block from a document template - * @permission Requires `canUseDeleteRemarkBlock` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.remarkBlockId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteRemarkBlock = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, remarkBlockId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseDeleteRemarkBlock({ officeId } )); - return DocumentTemplatesApi.deleteRemarkBlock(documentTemplateId, remarkBlockId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive document template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseArchive({ officeId } )); - return DocumentTemplatesApi.archive(documentTemplateId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive document template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.documentTemplateId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ documentTemplateId, officeId }) => { - checkAcl(DocumentTemplatesAcl.canUseUnarchive({ officeId } )); - return DocumentTemplatesApi.unarchive(documentTemplateId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { documentTemplateId, officeId } = variables; - const updateKeys = [keys.findById(documentTemplateId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.acl.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.acl.ts deleted file mode 100644 index dc538a3..0000000 --- a/test/generated/next/dunningAccountStatement/dunningAccountStatement.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningAccountStatementAcl { -/** - * Use for `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation ability. For global ability, omit the object parameter. - * @description Generate account statement - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAccountStatement` query or `useGenerateAccountStatementMutation` mutation - */ -export const canUseGenerateAccountStatement = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetAccountStatementEml` mutation ability. For global ability, omit the object parameter. - * @description Download account statement as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAccountStatementEml` mutation - */ -export const canUseGetAccountStatementEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts deleted file mode 100644 index 094141a..0000000 --- a/test/generated/next/dunningAccountStatement/dunningAccountStatement.api.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningAccountStatementApi { -export const dataGenFake = () => { - return AppRestClient.get( - { resSchema: DunningAccountStatementModels.AccountStatementPdfPayloadDTOSchema }, - `/data-gen-fake/account-statement`, - - ) -}; -export const generateAccountStatement = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/account-statement`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningAccountStatementModels.GenerateAccountStatementOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getAccountStatementEml = (officeId: string, data: DunningAccountStatementModels.OfficeInvoiceListQueryDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/account-statement/eml`, - ZodExtended.parse(DunningAccountStatementModels.OfficeInvoiceListQueryDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts deleted file mode 100644 index 83d04d1..0000000 --- a/test/generated/next/dunningAccountStatement/dunningAccountStatement.models.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningAccountStatementModels { -/** - * AccountStatementPdfPayloadInvoiceDtoSchema - * @type { object } - * @property { string } number - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } dueDays - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - */ -export const AccountStatementPdfPayloadInvoiceDtoSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }), dueDays: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string() }); -export type AccountStatementPdfPayloadInvoiceDto = z.infer; - -/** - * AccountStatementInvoicesByCurrencyAndDirectionDtoSchema - * @type { object } - * @property { string } direction - * @property { string } currency - * @property { AccountStatementPdfPayloadInvoiceDto[] } invoices - * @property { number } totalOutstandingAmount - */ -export const AccountStatementInvoicesByCurrencyAndDirectionDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema, currency: z.string(), invoices: z.array(AccountStatementPdfPayloadInvoiceDtoSchema), totalOutstandingAmount: z.number() }); -export type AccountStatementInvoicesByCurrencyAndDirectionDto = z.infer; - -/** - * AccountStatementPdfPayloadBusinessPartnerDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - * @property { string } referenceNumber - */ -export const AccountStatementPdfPayloadBusinessPartnerDtoSchema = z.object({ name: z.string(), address: z.string().nullish(), referenceNumber: z.string().nullish() }); -export type AccountStatementPdfPayloadBusinessPartnerDto = z.infer; - -/** - * AccountStatementPdfPayloadBankAccountDtoSchema - * @type { object } - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - */ -export const AccountStatementPdfPayloadBankAccountDtoSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }); -export type AccountStatementPdfPayloadBankAccountDto = z.infer; - -/** - * AccountStatementPdfPayloadDTOSchema - * @type { object } - * @property { AccountStatementPdfPayloadBusinessPartnerDto } businessPartner - * @property { AccountStatementInvoicesByCurrencyAndDirectionDto[] } invoicesByCurrencyAndDirection - * @property { AccountStatementPdfPayloadBankAccountDto } bankAccount - * @property { string } employeeName - * @property { CommonModels.ConfigBlockDto } config - */ -export const AccountStatementPdfPayloadDTOSchema = z.object({ businessPartner: AccountStatementPdfPayloadBusinessPartnerDtoSchema, invoicesByCurrencyAndDirection: z.array(AccountStatementInvoicesByCurrencyAndDirectionDtoSchema), bankAccount: AccountStatementPdfPayloadBankAccountDtoSchema, employeeName: z.string().nullable(), config: CommonModels.ConfigBlockDtoSchema }); -export type AccountStatementPdfPayloadDTO = z.infer; - -/** - * OfficeInvoiceListQueryDtoSchema - * @type { object } - * @property { string } order Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @property { CommonModels.OfficeInvoiceFilterDto } filter - * @property { number } limit Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - */ -export const OfficeInvoiceListQueryDtoSchema = z.object({ order: z.string().nullish(), filter: CommonModels.OfficeInvoiceFilterDtoSchema.nullish(), limit: z.number().gte(1).lte(100).default(20), page: z.number().nullish(), cursor: z.string().nullish() }); -export type OfficeInvoiceListQueryDto = z.infer; - -/** - * GenerateAccountStatementOrderParamEnumSchema - * @type { enum } - */ -export const GenerateAccountStatementOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); -export type GenerateAccountStatementOrderParamEnum = z.infer; -export const GenerateAccountStatementOrderParamEnum = GenerateAccountStatementOrderParamEnumSchema.enum; - -} diff --git a/test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts b/test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts deleted file mode 100644 index 4ac5c03..0000000 --- a/test/generated/next/dunningAccountStatement/dunningAccountStatement.queries.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningAccountStatementAcl } from "./dunningAccountStatement.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningAccountStatementModels } from "./dunningAccountStatement.models"; -import { DunningAccountStatementApi } from "./dunningAccountStatement.api"; - -export namespace DunningAccountStatementQueries { -export const moduleName = QueryModule.DunningAccountStatement; - -export const keys = { - all: [moduleName] as const, - dataGenFake: () => [...keys.all, "/data-gen-fake/account-statement", ] as const, - generateAccountStatement: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", officeId, limit, order, filter, page, cursor] as const, - generateAccountStatementInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/account-statement", "infinite", officeId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useDataGenFake` - * @summary Expose account statement PDF payload DTO for model generation - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useDataGenFake = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.dataGenFake(), - queryFn: DunningAccountStatementApi.dataGenFake, - ...options, - }); -}; - -/** - * Query `useGenerateAccountStatement` - recommended when file should be cached - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGenerateAccountStatement = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.generateAccountStatement(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Mutation `useGenerateAccountStatementMutation` - recommended when file should not be cached - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } mutation.officeId Path parameter - * @param { number } mutation.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } mutation.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } mutation.filter Query parameter - * @param { number } mutation.page Query parameter. 1-indexed page number to begin from - * @param { string } mutation.cursor Query parameter. ID of item to start after - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateAccountStatementMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, limit, order, filter, page, cursor }) => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, page, cursor) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, limit } = variables; - const updateKeys = [keys.generateAccountStatement(officeId, limit)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Infinite query `useGenerateAccountStatementInfinite - * @summary Generate account statement PDF from filtered office invoices - * @permission Requires `canUseGenerateAccountStatement` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGenerateAccountStatementInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.generateAccountStatementInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningAccountStatementAcl.canUseGenerateAccountStatement({ officeId } )); - return DunningAccountStatementApi.generateAccountStatement(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useGetAccountStatementEml` - recommended when file should not be cached - * @summary Get account statement as EML file with PDF attachment - * @permission Requires `canUseGetAccountStatementEml` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningAccountStatementModels.OfficeInvoiceListQueryDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGetAccountStatementEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningAccountStatementAcl.canUseGetAccountStatementEml({ officeId } )); - return DunningAccountStatementApi.getAccountStatementEml(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/dunningLevels/dunningLevels.acl.ts b/test/generated/next/dunningLevels/dunningLevels.acl.ts deleted file mode 100644 index eb52ae7..0000000 --- a/test/generated/next/dunningLevels/dunningLevels.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningLevelsAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List dunning level labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List dunning levels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Create", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get dunning level by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Read", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Update", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive a dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Archive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive a dunning level - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("DunningLevel", object) : "DunningLevel" -] as AbilityTuple<"Unarchive", "DunningLevel" | ForcedSubject<"DunningLevel"> & { officeId: string, }>; - -} diff --git a/test/generated/next/dunningLevels/dunningLevels.api.ts b/test/generated/next/dunningLevels/dunningLevels.api.ts deleted file mode 100644 index 9829ae1..0000000 --- a/test/generated/next/dunningLevels/dunningLevels.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningLevelsModels } from "./dunningLevels.models"; - -export namespace DunningLevelsApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelsPaginateLabelsResponseSchema }, - `/offices/${officeId}/dunning-levels/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningLevelsModels.DunningLevelLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelsListResponseSchema }, - `/offices/${officeId}/dunning-levels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningLevelsModels.DunningLevelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningLevelsModels.DunningLevelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: DunningLevelsModels.CreateDunningLevelRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels`, - ZodExtended.parse(DunningLevelsModels.CreateDunningLevelRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: DunningLevelsModels.UpdateDunningLevelRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}`, - ZodExtended.parse(DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DunningLevelsModels.DunningLevelResponseDTOSchema }, - `/offices/${officeId}/dunning-levels/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/dunningLevels/dunningLevels.configs.ts b/test/generated/next/dunningLevels/dunningLevels.configs.ts deleted file mode 100644 index ddfe0e9..0000000 --- a/test/generated/next/dunningLevels/dunningLevels.configs.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningLevelsModels } from "./dunningLevels.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningLevelsQueries } from "./dunningLevels.queries"; -import { DunningLevelsAcl } from "./dunningLevels.acl"; - -export namespace DunningLevelsConfigs { -export const dunningLevelsConfig = { - meta: { - title: "Dunning Levels", - }, - readAll: { - acl: DunningLevelsAcl.canUseList, - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - paginated: DunningLevelsQueries.useList, - infinite: DunningLevelsQueries.useListInfinite, - filters: { - schema: DunningLevelsModels.DunningLevelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningLevelsModels.DunningLevelFilterDtoSchema, - options: { - inputs: { - dunningSystemId: true, - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - options: { - columns: { - id: true, - level: true, - daysOverdue: true, - dunningFee: true, - interestRate: true, - usedInOfficeId: true, - usedInOffice: true, - dunningSystem: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - archived: true, - bodyRemarks: true, - footerRemarks: true, - }, - sortable: DunningLevelsModels.DunningLevelsListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DunningLevelsAcl.canUseFindById, - schema: DunningLevelsModels.DunningLevelResponseDTOSchema, - query: DunningLevelsQueries.useFindById, - }, - create: { - acl: DunningLevelsAcl.canUseCreate, - schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, - mutation: DunningLevelsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DunningLevelsModels.CreateDunningLevelRequestDTOSchema, - options: { - inputs: { - level: true, - daysOverdue: true, - dunningFee: true, - dunningSystemId: true, - interestRate: true, - bodyRemarks: true, - footerRemarks: true, - }, - }, -}) - }, - update: { - acl: DunningLevelsAcl.canUseUpdate, - schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, - mutation: DunningLevelsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DunningLevelsModels.UpdateDunningLevelRequestDTOSchema, - options: { - inputs: { - level: true, - daysOverdue: true, - dunningFee: true, - interestRate: true, - dunningSystemId: true, - bodyRemarks: true, - footerRemarks: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DunningLevelsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DunningLevelsQueries.usePaginateLabels, - infinite: DunningLevelsQueries.usePaginateLabelsInfinite, - filters: { - schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningLevelsModels.DunningLevelLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DunningLevelsModels.DunningLevelsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/dunningLevels/dunningLevels.models.ts b/test/generated/next/dunningLevels/dunningLevels.models.ts deleted file mode 100644 index a19a7cf..0000000 --- a/test/generated/next/dunningLevels/dunningLevels.models.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningLevelsModels { -/** - * DunningLevelOfficeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } currencyNotation - */ -export const DunningLevelOfficeDTOSchema = z.object({ id: z.string(), name: z.string(), currencyNotation: z.string() }); -export type DunningLevelOfficeDTO = z.infer; - -/** - * DunningLevelEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DunningLevelEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type DunningLevelEmployeeDTO = z.infer; - -/** - * DunningLevelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { number } level - * @property { number } daysOverdue - * @property { number } dunningFee - * @property { number } interestRate - * @property { string } usedInOfficeId - * @property { DunningLevelOfficeDTO } usedInOffice - * @property { CommonModels.DunningSystemReferenceDTO } dunningSystem - * @property { string } createdById - * @property { DunningLevelEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DunningLevelEmployeeDTO } updatedBy - * @property { string } updatedAt - * @property { boolean } archived - * @property { CommonModels.EditorContentResponseDto } bodyRemarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks - */ -export const DunningLevelResponseDTOSchema = z.object({ id: z.string(), level: z.number(), daysOverdue: z.number(), dunningFee: z.number(), interestRate: z.number().nullish(), usedInOfficeId: z.string(), usedInOffice: DunningLevelOfficeDTOSchema.nullish(), dunningSystem: CommonModels.DunningSystemReferenceDTOSchema.nullish(), createdById: z.string().nullish(), createdBy: DunningLevelEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningLevelEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), archived: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish() }); -export type DunningLevelResponseDTO = z.infer; - -/** - * CreateDunningLevelRequestDTOSchema - * @type { object } - * @property { number } level Dunning level number. Minimum: `1` - * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` - * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` - * @property { string } dunningSystemId Dunning system ID - * @property { number } interestRate Minimum: `0`. Maximum: `100` - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const CreateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1), daysOverdue: z.number().gte(1), dunningFee: z.number().gte(0), dunningSystemId: z.string().nullish(), interestRate: z.number().gte(0).lte(100).nullish(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullish() }); -export type CreateDunningLevelRequestDTO = z.infer; - -/** - * UpdateDunningLevelRequestDTOSchema - * @type { object } - * @property { number } level Dunning level number. Minimum: `1` - * @property { number } daysOverdue Days overdue before this level applies. Minimum: `1` - * @property { number } dunningFee Fee amount for this dunning level. Minimum: `0` - * @property { number } interestRate Minimum: `0`. Maximum: `100` - * @property { string } dunningSystemId Dunning system ID - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateDunningLevelRequestDTOSchema = z.object({ level: z.number().gte(1).nullable(), daysOverdue: z.number().gte(1).nullable(), dunningFee: z.number().gte(0).nullable(), interestRate: z.number().gte(0).lte(100).nullable(), dunningSystemId: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateDunningLevelRequestDTO = z.infer; - -/** - * DunningLevelLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DunningLevelLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type DunningLevelLabelFilterDto = z.infer; - -/** - * DunningLevelFilterDtoSchema - * @type { object } - * @property { string } dunningSystemId Dunning system ID to filter by - * @property { string } search Search to filter by - * @property { boolean } archived Filter by archived status - */ -export const DunningLevelFilterDtoSchema = z.object({ dunningSystemId: z.string().nullable(), search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type DunningLevelFilterDto = z.infer; - -/** - * DunningLevelsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DunningLevelsPaginateLabelsOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DunningLevelsPaginateLabelsOrderParamEnum = z.infer; -export const DunningLevelsPaginateLabelsOrderParamEnum = DunningLevelsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DunningLevelsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DunningLevelsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type DunningLevelsPaginateLabelsResponse = z.infer; - -/** - * DunningLevelsListOrderParamEnumSchema - * @type { enum } - */ -export const DunningLevelsListOrderParamEnumSchema = z.enum(["level", "daysOverdue", "dunningFee", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type DunningLevelsListOrderParamEnum = z.infer; -export const DunningLevelsListOrderParamEnum = DunningLevelsListOrderParamEnumSchema.enum; - -/** - * DunningLevelsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningLevelResponseDTO[] } items - */ -export const DunningLevelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningLevelResponseDTOSchema).nullable() }).partial().shape }); -export type DunningLevelsListResponse = z.infer; - -} diff --git a/test/generated/next/dunningLevels/dunningLevels.queries.ts b/test/generated/next/dunningLevels/dunningLevels.queries.ts deleted file mode 100644 index b75b7a0..0000000 --- a/test/generated/next/dunningLevels/dunningLevels.queries.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningLevelsAcl } from "./dunningLevels.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningLevelsModels } from "./dunningLevels.models"; -import { DunningLevelsApi } from "./dunningLevels.api"; - -export namespace DunningLevelsQueries { -export const moduleName = QueryModule.DunningLevels; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-levels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-levels/:id", id, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate dunning level labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate dunning level labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningLevelsAcl.canUsePaginateLabels({ officeId } )); - return DunningLevelsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List dunning levels - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUseList({ officeId } )); - return DunningLevelsApi.list(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List dunning levels - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): level, daysOverdue, dunningFee, createdAt, updatedAt, createdBy, updatedBy. Example: `level` - * @param { DunningLevelsModels.DunningLevelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningLevelsModels.DunningLevelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningLevelsAcl.canUseList({ officeId } )); - return DunningLevelsApi.list(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create dunning level - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningLevelsModels.CreateDunningLevelRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningLevelsAcl.canUseCreate({ officeId } )); - return DunningLevelsApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get dunning level by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(DunningLevelsAcl.canUseFindById({ officeId } )); - return DunningLevelsApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update dunning level - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningLevelsModels.UpdateDunningLevelRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(DunningLevelsAcl.canUseUpdate({ officeId } )); - return DunningLevelsApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a dunning level - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningLevelsAcl.canUseArchive({ officeId } )); - return DunningLevelsApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a dunning level - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningLevelsAcl.canUseUnarchive({ officeId } )); - return DunningLevelsApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/dunningManagement/dunningManagement.acl.ts b/test/generated/next/dunningManagement/dunningManagement.acl.ts deleted file mode 100644 index 251aea8..0000000 --- a/test/generated/next/dunningManagement/dunningManagement.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningManagementAcl { -/** - * Use for `useListDunnings` query ability. For global ability, omit the object parameter. - * @description List dunnings - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListDunnings` query - */ -export const canUseListDunnings = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Dunning", object) : "Dunning" -] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - -/** - * Use for `useCreateDunningWithInvoices` mutation ability. For global ability, omit the object parameter. - * @description Create dunning - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDunningWithInvoices` mutation - */ -export const canUseCreateDunningWithInvoices = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Dunning", object) : "Dunning" -] as AbilityTuple<"Create", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - -/** - * Use for `useGetDunningEml` query or `useGetDunningEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download dunning as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDunningEml` query or `useGetDunningEmlMutation` mutation - */ -export const canUseGetDunningEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Dunning", object) : "Dunning" -] as AbilityTuple<"Read", "Dunning" | ForcedSubject<"Dunning"> & { officeId: string, }>; - -} diff --git a/test/generated/next/dunningManagement/dunningManagement.api.ts b/test/generated/next/dunningManagement/dunningManagement.api.ts deleted file mode 100644 index 5b706b4..0000000 --- a/test/generated/next/dunningManagement/dunningManagement.api.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningManagementModels } from "./dunningManagement.models"; - -export namespace DunningManagementApi { -export const listDunnings = (officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningManagementModels.ListDunningsResponseSchema }, - `/offices/${officeId}/dunnings`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningManagementModels.ListDunningsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningManagementModels.DunningFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createDunningWithInvoices = (partnerId: string, officeId: string, data: DunningManagementModels.CreateDunningWithInvoicesRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DunningManagementModels.DunningResponseDtoSchema }, - `/offices/${officeId}/partners/${partnerId}/dunnings`, - ZodExtended.parse(DunningManagementModels.CreateDunningWithInvoicesRequestDTOSchema, data), - - ) -}; -export const dataGenFake = () => { - return AppRestClient.get( - { resSchema: DunningManagementModels.DunningPdfPayloadDTOSchema }, - `/data-gen-fake`, - - ) -}; -export const getDunningEml = (officeId: string, dunningId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/dunnings/${dunningId}/eml`, - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/next/dunningManagement/dunningManagement.configs.ts b/test/generated/next/dunningManagement/dunningManagement.configs.ts deleted file mode 100644 index 6c09ba7..0000000 --- a/test/generated/next/dunningManagement/dunningManagement.configs.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningManagementModels } from "./dunningManagement.models"; -import { DunningManagementQueries } from "./dunningManagement.queries"; -import { DunningManagementAcl } from "./dunningManagement.acl"; - -export namespace DunningManagementConfigs { -export const dunningsConfig = { - meta: { - title: "Dunnings", - }, - readAll: { - acl: DunningManagementAcl.canUseListDunnings, - schema: DunningManagementModels.DunningResponseDtoSchema, - paginated: DunningManagementQueries.useListDunnings, - infinite: DunningManagementQueries.useListDunningsInfinite, - filters: { - schema: DunningManagementModels.DunningFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningManagementModels.DunningFilterDtoSchema, - options: { - inputs: { - status: true, - partnerId: true, - level: true, - outstandingAmountMin: true, - outstandingAmountMax: true, - createdFrom: true, - createdTo: true, - confirmedBy: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningManagementModels.DunningResponseDtoSchema, - options: { - columns: { - id: true, - partner: true, - level: true, - dunningLevelId: true, - status: true, - invoiceCount: true, - outstandingAmount: true, - currencyNotation: true, - daysOverdue: true, - dunningFee: true, - createdAt: true, - statusChangedOn: true, - confirmedBy: true, - documentUrl: true, - }, - sortable: DunningManagementModels.ListDunningsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/dunningManagement/dunningManagement.models.ts b/test/generated/next/dunningManagement/dunningManagement.models.ts deleted file mode 100644 index 572426f..0000000 --- a/test/generated/next/dunningManagement/dunningManagement.models.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningManagementModels { -/** - * DunningPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const DunningPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type DunningPartnerDto = z.infer; - -/** - * DunningConfirmedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DunningConfirmedByDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type DunningConfirmedByDto = z.infer; - -/** - * DunningStatusSchema - * @type { enum } - */ -export const DunningStatusSchema = z.enum(["PREPARED", "ISSUED"]); -export type DunningStatus = z.infer; -export const DunningStatus = DunningStatusSchema.enum; - -/** - * DunningResponseDtoSchema - * @type { object } - * @property { string } id - * @property { DunningPartnerDto } partner - * @property { number } level - * @property { string } dunningLevelId - * @property { string } status - * @property { number } invoiceCount - * @property { number } outstandingAmount - * @property { string } currencyNotation - * @property { number } daysOverdue - * @property { number } dunningFee - * @property { string } createdAt - * @property { string } statusChangedOn - * @property { DunningConfirmedByDto } confirmedBy - * @property { string } documentUrl - */ -export const DunningResponseDtoSchema = z.object({ id: z.string(), partner: DunningPartnerDtoSchema, level: z.number(), dunningLevelId: z.string().nullish(), status: DunningStatusSchema, invoiceCount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number(), dunningFee: z.number(), createdAt: z.iso.datetime({ offset: true }), statusChangedOn: z.iso.datetime({ offset: true }), confirmedBy: DunningConfirmedByDtoSchema.nullish(), documentUrl: z.string().nullish() }); -export type DunningResponseDto = z.infer; - -/** - * DunningFilterDtoSchema - * @type { object } - * @property { DunningStatus[] } status - * @property { string } partnerId Partner ID to filter by - * @property { array[] } level Dunning level(s) to filter by - * @property { number } outstandingAmountMin Minimum outstanding amount - * @property { number } outstandingAmountMax Maximum outstanding amount - * @property { string } createdFrom Created from (ISO date string) - * @property { string } createdTo Created to (ISO date string) - * @property { string } confirmedBy Confirmed by employee ID - */ -export const DunningFilterDtoSchema = z.object({ status: z.array(DunningStatusSchema).nullable(), partnerId: z.string().nullable(), level: z.array(z.array(z.any())).nullable(), outstandingAmountMin: z.number().nullable(), outstandingAmountMax: z.number().nullable(), createdFrom: z.iso.datetime({ offset: true }).nullable(), createdTo: z.iso.datetime({ offset: true }).nullable(), confirmedBy: z.string().nullable() }).partial(); -export type DunningFilterDto = z.infer; - -/** - * DunningPdfConfigDTOSchema - * @type { object } - * @property { string } headerImageUrl - * @property { string } footerImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ -export const DunningPdfConfigDTOSchema = z.object({ headerImageUrl: z.string(), footerImageUrl: z.string(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); -export type DunningPdfConfigDTO = z.infer; - -/** - * DunningPdfBusinessPartnerDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } address - * @property { string } referenceNumber - */ -export const DunningPdfBusinessPartnerDTOSchema = z.object({ id: z.string(), name: z.string(), address: z.string(), referenceNumber: z.string().nullish() }); -export type DunningPdfBusinessPartnerDTO = z.infer; - -/** - * DunningPdfInvoiceDTOSchema - * @type { object } - * @property { string } invoiceNumber - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } daysOverdue - * @property { number } dunningLevel - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - * @property { number } interest - */ -export const DunningPdfInvoiceDTOSchema = z.object({ invoiceNumber: z.string(), issuingDate: z.iso.datetime({ offset: true }), dueDate: z.iso.datetime({ offset: true }).nullish(), daysOverdue: z.number(), dunningLevel: z.number(), invoiceAmount: z.number(), outstandingAmount: z.number(), currencyNotation: z.string(), interest: z.number().nullish() }); -export type DunningPdfInvoiceDTO = z.infer; - -/** - * DunningPdfTotalDTOSchema - * @type { object } - * @property { number } invoicesSum - * @property { number } dunningFee - * @property { number } interest - * @property { string } currencyNotation - */ -export const DunningPdfTotalDTOSchema = z.object({ invoicesSum: z.number(), dunningFee: z.number(), interest: z.number(), currencyNotation: z.string() }); -export type DunningPdfTotalDTO = z.infer; - -/** - * DunningPdfBankAccountDTOSchema - * @type { object } - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - */ -export const DunningPdfBankAccountDTOSchema = z.object({ displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string() }); -export type DunningPdfBankAccountDTO = z.infer; - -/** - * DunningPdfUpcomingInvoiceDTOSchema - * @type { object } - * @property { string } number - * @property { string } issuingDate - * @property { string } dueDate - * @property { number } dueDays - * @property { number } invoiceAmount - * @property { number } outstandingAmount - * @property { string } currencyNotation - */ -export const DunningPdfUpcomingInvoiceDTOSchema = z.object({ number: z.string(), issuingDate: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), dueDays: z.number().nullish(), invoiceAmount: z.number().nullish(), outstandingAmount: z.number().nullish(), currencyNotation: z.string().nullish() }); -export type DunningPdfUpcomingInvoiceDTO = z.infer; - -/** - * DunningPdfPayloadDTOSchema - * @type { object } - * @property { string } dunningId - * @property { number } dunningLevel - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { DunningPdfBusinessPartnerDTO } businessPartner - * @property { DunningPdfInvoiceDTO[] } invoices - * @property { DunningPdfTotalDTO } total - * @property { DunningPdfBankAccountDTO } bankAccount - * @property { string } employeeName - * @property { DunningPdfConfigDTO } config - * @property { CommonModels.LanguageEnum } language - * @property { DunningPdfUpcomingInvoiceDTO[] } upcomingInvoices - */ -export const DunningPdfPayloadDTOSchema = z.object({ dunningId: z.string(), dunningLevel: z.number(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), businessPartner: DunningPdfBusinessPartnerDTOSchema, invoices: z.array(DunningPdfInvoiceDTOSchema), total: DunningPdfTotalDTOSchema, bankAccount: DunningPdfBankAccountDTOSchema, employeeName: z.string().nullable(), config: DunningPdfConfigDTOSchema, language: CommonModels.LanguageEnumSchema.nullish(), upcomingInvoices: z.array(DunningPdfUpcomingInvoiceDTOSchema).nullish() }); -export type DunningPdfPayloadDTO = z.infer; - -/** - * CreateDunningWithInvoicesRequestDTOSchema - * @type { object } - * @property { string[] } invoiceIds Array of outstanding invoice IDs to include in the dunning. Example: `123e4567-e89b-12d3-a456-426614174000,123e4567-e89b-12d3-a456-426614174001` - * @property { string } dunningLevelId The ID of the dunning level to use for this dunning. Example: `123e4567-e89b-12d3-a456-426614174002` - * @property { number } dunningFee Optional dunning fee to use. If not provided, the fee from the dunning level will be used. Minimum: `0`. Example: `25.5` - * @property { number } interestRate Minimum: `0`. Maximum: `100`. Example: `25.5` - * @property { boolean } includeUpcomingInvoices - */ -export const CreateDunningWithInvoicesRequestDTOSchema = z.object({ invoiceIds: z.array(z.string()), dunningLevelId: z.string(), dunningFee: z.number().gte(0).nullish(), interestRate: z.number().gte(0).lte(100).nullish(), includeUpcomingInvoices: z.boolean().nullish() }); -export type CreateDunningWithInvoicesRequestDTO = z.infer; - -/** - * ListDunningsOrderParamEnumSchema - * @type { enum } - */ -export const ListDunningsOrderParamEnumSchema = z.enum(["createdAt", "level", "outstandingAmount", "statusChangedOn"]); -export type ListDunningsOrderParamEnum = z.infer; -export const ListDunningsOrderParamEnum = ListDunningsOrderParamEnumSchema.enum; - -/** - * ListDunningsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningResponseDto[] } items - */ -export const ListDunningsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningResponseDtoSchema).nullable() }).partial().shape }); -export type ListDunningsResponse = z.infer; - -} diff --git a/test/generated/next/dunningManagement/dunningManagement.queries.ts b/test/generated/next/dunningManagement/dunningManagement.queries.ts deleted file mode 100644 index 53428c9..0000000 --- a/test/generated/next/dunningManagement/dunningManagement.queries.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningManagementAcl } from "./dunningManagement.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningManagementModels } from "./dunningManagement.models"; -import { DunningManagementApi } from "./dunningManagement.api"; - -export namespace DunningManagementQueries { -export const moduleName = QueryModule.DunningManagement; - -export const keys = { - all: [moduleName] as const, - listDunnings: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", officeId, limit, order, filter, page, cursor] as const, - listDunningsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunnings", "infinite", officeId, limit, order, filter, cursor] as const, - dataGenFake: () => [...keys.all, "/data-gen-fake", ] as const, - getDunningEml: (officeId: string, dunningId: string) => [...keys.all, "/offices/:officeId/dunnings/:dunningId/eml", officeId, dunningId] as const, -}; - -/** - * Query `useListDunnings` - * @summary List dunnings for an office - * @permission Requires `canUseListDunnings` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` - * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListDunnings = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listDunnings(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListDunningsInfinite - * @summary List dunnings for an office - * @permission Requires `canUseListDunnings` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, level, outstandingAmount, statusChangedOn. Example: `createdAt` - * @param { DunningManagementModels.DunningFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListDunningsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningManagementModels.DunningFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listDunningsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningManagementAcl.canUseListDunnings({ officeId } )); - return DunningManagementApi.listDunnings(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateDunningWithInvoices` - * @summary Create a dunning with outstanding invoices - * @permission Requires `canUseCreateDunningWithInvoices` ability - * @param { string } mutation.partnerId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningManagementModels.CreateDunningWithInvoicesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateDunningWithInvoices = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ partnerId, officeId, data }) => { - checkAcl(DunningManagementAcl.canUseCreateDunningWithInvoices({ officeId } )); - return DunningManagementApi.createDunningWithInvoices(partnerId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useDataGenFake` - * @summary Expose dunning PDF payload DTO for model generation - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useDataGenFake = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.dataGenFake(), - queryFn: DunningManagementApi.dataGenFake, - ...options, - }); -}; - -/** - * Query `useGetDunningEml` - recommended when file should be cached - * @summary Get dunning as EML file with PDF attachment - * @permission Requires `canUseGetDunningEml` ability - * @param { string } object.officeId Path parameter - * @param { string } object.dunningId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetDunningEml = ({ officeId, dunningId }: { officeId: string, dunningId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDunningEml(officeId, dunningId), - queryFn: () => { - checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); - return DunningManagementApi.getDunningEml(officeId, dunningId) }, - ...options, - }); -}; - -/** - * Mutation `useGetDunningEmlMutation` - recommended when file should not be cached - * @summary Get dunning as EML file with PDF attachment - * @permission Requires `canUseGetDunningEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.dunningId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetDunningEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, dunningId }) => { - checkAcl(DunningManagementAcl.canUseGetDunningEml({ officeId } )); - return DunningManagementApi.getDunningEml(officeId, dunningId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, dunningId } = variables; - const updateKeys = [keys.getDunningEml(officeId, dunningId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts deleted file mode 100644 index 4294b32..0000000 --- a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningPartnerOutstandingInvoicesAcl { -/** - * Use for `useListPartnerOutstandingInvoiceSummaries` query ability. For global ability, omit the object parameter. - * @description List office outstanding invoice summaries per partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoiceSummaries` query - */ -export const canUseListPartnerOutstandingInvoiceSummaries = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useListPartnerOutstandingInvoices` query ability. For global ability, omit the object parameter. - * @description List partner outstanding invoices - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListPartnerOutstandingInvoices` query - */ -export const canUseListPartnerOutstandingInvoices = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useListRecommendedDunningLevels` mutation ability. For global ability, omit the object parameter. - * @description List recommended dunning levels for a partner - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRecommendedDunningLevels` mutation - */ -export const canUseListRecommendedDunningLevels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts deleted file mode 100644 index d7cdd8a..0000000 --- a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.api.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; - -export namespace DunningPartnerOutstandingInvoicesApi { -export const listPartnerOutstandingInvoiceSummaries = (officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesResponseSchema }, - `/offices/${officeId}/partner-outstanding-invoices`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listPartnerOutstandingInvoices = (partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesResponseSchema }, - `/offices/${officeId}/partners/${partnerId}/outstanding-invoices`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listRecommendedDunningLevels = (partnerId: string, officeId: string, data: DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto, ) => { - return AppRestClient.post( - { resSchema: DunningPartnerOutstandingInvoicesModels.ListRecommendedDunningLevelsResponseSchema }, - `/offices/${officeId}/partners/${partnerId}/recommended-dunning-levels`, - ZodExtended.parse(DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts deleted file mode 100644 index 3fc3451..0000000 --- a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.configs.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; -import { DunningPartnerOutstandingInvoicesQueries } from "./dunningPartnerOutstandingInvoices.queries"; -import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; - -export namespace DunningPartnerOutstandingInvoicesConfigs { -export const partnerOutstandingInvoicesConfig = { - meta: { - title: "Partner Outstanding Invoices", - }, - readAll: { - acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries, - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, - paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummaries, - infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoiceSummariesInfinite, - filters: { - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDtoSchema, - options: { - inputs: { - search: true, - daysOverdueMin: true, - partnerId: true, - outstandingAmountMin: true, - currency: true, - dunningSystemId: true, - lastDunningDate: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryResponseDtoSchema, - options: { - columns: { - partnerId: true, - partnerName: true, - partnerCountry: true, - dunningSystemId: true, - dunningSystemName: true, - invoiceCount: true, - daysOverdue: true, - outstandingAmount: true, - currencyNotation: true, - lastDunningDate: true, - }, - sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema, - }, -}), - }, -}; - -export const outstandingInvoicesConfig = { - meta: { - title: "Outstanding Invoices", - }, - readAll: { - acl: DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices, - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, - paginated: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoices, - infinite: DunningPartnerOutstandingInvoicesQueries.useListPartnerOutstandingInvoicesInfinite, - filters: { - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDtoSchema, - options: { - inputs: { - partnerId: true, - currency: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceResponseDtoSchema, - options: { - columns: { - invoiceId: true, - invoiceNumber: true, - invoiceDate: true, - invoiceAmount: true, - owedAmount: true, - currencyNotation: true, - daysOverdue: true, - dueDate: true, - invoiceInReview: true, - dunningBlock: true, - }, - sortable: DunningPartnerOutstandingInvoicesModels.ListPartnerOutstandingInvoicesOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts deleted file mode 100644 index b07e9f3..0000000 --- a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.models.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningPartnerOutstandingInvoicesModels { -/** - * PartnerOutstandingInvoiceSummaryFilterDtoSchema - * @type { object } - * @property { string } search Search string (partner name) - * @property { number } daysOverdueMin Minimum days overdue - * @property { string } partnerId Partner ID - * @property { number } outstandingAmountMin Minimum outstanding amount - * @property { string } currency Currency - * @property { string } dunningSystemId Dunning system ID - * @property { CommonModels.DateRangeDto } lastDunningDate Last dunning date range - */ -export const PartnerOutstandingInvoiceSummaryFilterDtoSchema = z.object({ search: z.string().nullable(), daysOverdueMin: z.number().nullable(), partnerId: z.string().nullable(), outstandingAmountMin: z.number().nullable(), currency: z.string().nullable(), dunningSystemId: z.string().nullable(), lastDunningDate: CommonModels.DateRangeDtoSchema.nullable() }).partial(); -export type PartnerOutstandingInvoiceSummaryFilterDto = z.infer; - -/** - * PartnerOutstandingInvoiceSummaryResponseDtoSchema - * @type { object } - * @property { string } partnerId Business partner ID - * @property { string } partnerName Business partner name - * @property { string } partnerCountry Business partner country - * @property { string } dunningSystemId Dunning system ID - * @property { string } dunningSystemName Dunning system name - * @property { number } invoiceCount Number of outstanding invoices - * @property { number } daysOverdue Maximum days overdue across all partner invoices - * @property { number } outstandingAmount Total outstanding amount - * @property { string } currencyNotation Currency of partner invoices - * @property { string } lastDunningDate Date of the most recent issued dunning document - */ -export const PartnerOutstandingInvoiceSummaryResponseDtoSchema = z.object({ partnerId: z.string(), partnerName: z.string(), partnerCountry: z.string().nullish(), dunningSystemId: z.string(), dunningSystemName: z.string(), invoiceCount: z.number(), daysOverdue: z.number().nullish(), outstandingAmount: z.number(), currencyNotation: z.string(), lastDunningDate: z.iso.datetime({ offset: true }).nullish() }); -export type PartnerOutstandingInvoiceSummaryResponseDto = z.infer; - -/** - * PartnerOutstandingInvoiceResponseDtoSchema - * @type { object } - * @property { string } invoiceId Invoice ID - * @property { string } invoiceNumber Invoice number - * @property { string } invoiceDate Invoice date - * @property { number } invoiceAmount Invoice amount - * @property { number } owedAmount Owed amount - * @property { string } currencyNotation Currency notation - * @property { number } daysOverdue Days overdue - * @property { string } dueDate Due date - * @property { boolean } invoiceInReview - * @property { boolean } dunningBlock - */ -export const PartnerOutstandingInvoiceResponseDtoSchema = z.object({ invoiceId: z.string(), invoiceNumber: z.string().nullish(), invoiceDate: z.iso.datetime({ offset: true }).nullish(), invoiceAmount: z.number(), owedAmount: z.number(), currencyNotation: z.string(), daysOverdue: z.number().nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), invoiceInReview: z.boolean().nullish(), dunningBlock: z.boolean().nullish() }); -export type PartnerOutstandingInvoiceResponseDto = z.infer; - -/** - * PartnerOutstandingInvoiceFilterDtoSchema - * @type { object } - * @property { string } partnerId Partner ID to filter by - * @property { string } currency Invoice currency notation to filter by - */ -export const PartnerOutstandingInvoiceFilterDtoSchema = z.object({ partnerId: z.string().nullable(), currency: z.string().nullable() }).partial(); -export type PartnerOutstandingInvoiceFilterDto = z.infer; - -/** - * RecommendedDunningLevelsRequestDtoSchema - * @type { object } - * @property { string[] } invoiceIds Invoice IDs used to calculate the recommended dunning level. Min Items: `1`. Example: `123e4567-e89b-12d3-a456-426614174000` - */ -export const RecommendedDunningLevelsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).min(1) }); -export type RecommendedDunningLevelsRequestDto = z.infer; - -/** - * RecommendedLabelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { boolean } isRecommended - */ -export const RecommendedLabelResponseDtoSchema = z.object({ id: z.string(), label: z.string(), isRecommended: z.boolean() }); -export type RecommendedLabelResponseDto = z.infer; - -/** - * ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema - * @type { enum } - */ -export const ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema = z.enum(["outstandingAmount", "daysOverdue", "lastDunningDate", "invoiceCount", "partnerCountry", "partnerName", "dunningSystemName"]); -export type ListPartnerOutstandingInvoiceSummariesOrderParamEnum = z.infer; -export const ListPartnerOutstandingInvoiceSummariesOrderParamEnum = ListPartnerOutstandingInvoiceSummariesOrderParamEnumSchema.enum; - -/** - * ListPartnerOutstandingInvoiceSummariesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerOutstandingInvoiceSummaryResponseDto[] } items - */ -export const ListPartnerOutstandingInvoiceSummariesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceSummaryResponseDtoSchema).nullable() }).partial().shape }); -export type ListPartnerOutstandingInvoiceSummariesResponse = z.infer; - -/** - * ListPartnerOutstandingInvoicesOrderParamEnumSchema - * @type { enum } - */ -export const ListPartnerOutstandingInvoicesOrderParamEnumSchema = z.enum(["dueDate", "invoiceDate", "owedAmount"]); -export type ListPartnerOutstandingInvoicesOrderParamEnum = z.infer; -export const ListPartnerOutstandingInvoicesOrderParamEnum = ListPartnerOutstandingInvoicesOrderParamEnumSchema.enum; - -/** - * ListPartnerOutstandingInvoicesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerOutstandingInvoiceResponseDto[] } items - */ -export const ListPartnerOutstandingInvoicesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerOutstandingInvoiceResponseDtoSchema).nullable() }).partial().shape }); -export type ListPartnerOutstandingInvoicesResponse = z.infer; - -/** - * ListRecommendedDunningLevelsResponseSchema - * @type { array } - */ -export const ListRecommendedDunningLevelsResponseSchema = z.array(RecommendedLabelResponseDtoSchema); -export type ListRecommendedDunningLevelsResponse = z.infer; - -} diff --git a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts b/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts deleted file mode 100644 index 5e8a555..0000000 --- a/test/generated/next/dunningPartnerOutstandingInvoices/dunningPartnerOutstandingInvoices.queries.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningPartnerOutstandingInvoicesAcl } from "./dunningPartnerOutstandingInvoices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningPartnerOutstandingInvoicesModels } from "./dunningPartnerOutstandingInvoices.models"; -import { DunningPartnerOutstandingInvoicesApi } from "./dunningPartnerOutstandingInvoices.api"; - -export namespace DunningPartnerOutstandingInvoicesQueries { -export const moduleName = QueryModule.DunningPartnerOutstandingInvoices; - -export const keys = { - all: [moduleName] as const, - listPartnerOutstandingInvoiceSummaries: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", officeId, limit, order, filter, page, cursor] as const, - listPartnerOutstandingInvoiceSummariesInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partner-outstanding-invoices", "infinite", officeId, limit, order, filter, cursor] as const, - listPartnerOutstandingInvoices: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", partnerId, officeId, limit, order, filter, page, cursor] as const, - listPartnerOutstandingInvoicesInfinite: (partnerId: string, officeId: string, limit?: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/partners/:partnerId/outstanding-invoices", "infinite", partnerId, officeId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useListPartnerOutstandingInvoiceSummaries` - * @summary List office outstanding invoice summaries per partner - * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoiceSummaries = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListPartnerOutstandingInvoiceSummariesInfinite - * @summary List office outstanding invoice summaries per partner - * @permission Requires `canUseListPartnerOutstandingInvoiceSummaries` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): outstandingAmount, daysOverdue, lastDunningDate, invoiceCount, partnerCountry, partnerName, dunningSystemName. Example: `outstandingAmount` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoiceSummariesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceSummaryFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listPartnerOutstandingInvoiceSummariesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoiceSummaries({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoiceSummaries(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListPartnerOutstandingInvoices` - * @summary List outstanding invoices for a specific partner - * @permission Requires `canUseListPartnerOutstandingInvoices` ability - * @param { string } object.partnerId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoices = ({ partnerId, officeId, limit, order, filter, page, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListPartnerOutstandingInvoicesInfinite - * @summary List outstanding invoices for a specific partner - * @permission Requires `canUseListPartnerOutstandingInvoices` ability - * @param { string } object.partnerId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): dueDate, invoiceDate, owedAmount. Example: `dueDate` - * @param { DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListPartnerOutstandingInvoicesInfinite = ({ partnerId, officeId, limit, order, filter, cursor }: { partnerId: string, officeId: string, limit: number, order?: string, filter?: DunningPartnerOutstandingInvoicesModels.PartnerOutstandingInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listPartnerOutstandingInvoicesInfinite(partnerId, officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListPartnerOutstandingInvoices({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listPartnerOutstandingInvoices(partnerId, officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useListRecommendedDunningLevels` - * @summary List recommended dunning levels for a partner - * @permission Requires `canUseListRecommendedDunningLevels` ability - * @param { string } mutation.partnerId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningPartnerOutstandingInvoicesModels.RecommendedDunningLevelsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useListRecommendedDunningLevels = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ partnerId, officeId, data }) => { - checkAcl(DunningPartnerOutstandingInvoicesAcl.canUseListRecommendedDunningLevels({ officeId } )); - return DunningPartnerOutstandingInvoicesApi.listRecommendedDunningLevels(partnerId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/dunningSystems/dunningSystems.acl.ts b/test/generated/next/dunningSystems/dunningSystems.acl.ts deleted file mode 100644 index 14c8307..0000000 --- a/test/generated/next/dunningSystems/dunningSystems.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace DunningSystemsAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List dunning system labels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List dunning systems - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Create", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get dunning system by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Read", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Update", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive dunning system - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("DunningSystem", object) : "DunningSystem" -] as AbilityTuple<"Archive", "DunningSystem" | ForcedSubject<"DunningSystem"> & { officeId: string, }>; - -} diff --git a/test/generated/next/dunningSystems/dunningSystems.api.ts b/test/generated/next/dunningSystems/dunningSystems.api.ts deleted file mode 100644 index 2d584ae..0000000 --- a/test/generated/next/dunningSystems/dunningSystems.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { DunningSystemsModels } from "./dunningSystems.models"; - -export namespace DunningSystemsApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemsPaginateLabelsResponseSchema }, - `/offices/${officeId}/dunning-systems/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningSystemsModels.DunningSystemLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemsPaginateResponseSchema }, - `/offices/${officeId}/dunning-systems`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(DunningSystemsModels.DunningSystemFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: DunningSystemsModels.CreateDunningSystemRequestDTO, ) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems`, - ZodExtended.parse(DunningSystemsModels.CreateDunningSystemRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: DunningSystemsModels.UpdateDunningSystemRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}`, - ZodExtended.parse(DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: DunningSystemsModels.DunningSystemResponseDTOSchema }, - `/offices/${officeId}/dunning-systems/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/dunningSystems/dunningSystems.configs.ts b/test/generated/next/dunningSystems/dunningSystems.configs.ts deleted file mode 100644 index 9040265..0000000 --- a/test/generated/next/dunningSystems/dunningSystems.configs.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { DunningSystemsModels } from "./dunningSystems.models"; -import { CommonModels } from "@/data/common/common.models"; -import { DunningSystemsQueries } from "./dunningSystems.queries"; -import { DunningSystemsAcl } from "./dunningSystems.acl"; - -export namespace DunningSystemsConfigs { -export const dunningSystemsConfig = { - meta: { - title: "Dunning Systems", - }, - readAll: { - acl: DunningSystemsAcl.canUsePaginate, - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - paginated: DunningSystemsQueries.usePaginate, - infinite: DunningSystemsQueries.usePaginateInfinite, - filters: { - schema: DunningSystemsModels.DunningSystemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningSystemsModels.DunningSystemFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - isDefault: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - isDefault: true, - archived: true, - archivedAt: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: DunningSystemsModels.DunningSystemsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: DunningSystemsAcl.canUseFindById, - schema: DunningSystemsModels.DunningSystemResponseDTOSchema, - query: DunningSystemsQueries.useFindById, - }, - create: { - acl: DunningSystemsAcl.canUseCreate, - schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, - mutation: DunningSystemsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: DunningSystemsModels.CreateDunningSystemRequestDTOSchema, - options: { - inputs: { - name: true, - isDefault: true, - }, - }, -}) - }, - update: { - acl: DunningSystemsAcl.canUseUpdate, - schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, - mutation: DunningSystemsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: DunningSystemsModels.UpdateDunningSystemRequestDTOSchema, - options: { - inputs: { - name: true, - isDefault: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: DunningSystemsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: DunningSystemsQueries.usePaginateLabels, - infinite: DunningSystemsQueries.usePaginateLabelsInfinite, - filters: { - schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: DunningSystemsModels.DunningSystemLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: DunningSystemsModels.DunningSystemsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/dunningSystems/dunningSystems.models.ts b/test/generated/next/dunningSystems/dunningSystems.models.ts deleted file mode 100644 index 164270a..0000000 --- a/test/generated/next/dunningSystems/dunningSystems.models.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace DunningSystemsModels { -/** - * DunningSystemEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const DunningSystemEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type DunningSystemEmployeeDTO = z.infer; - -/** - * DunningSystemResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name - * @property { boolean } isDefault - * @property { boolean } archived - * @property { string } archivedAt - * @property { string } createdById - * @property { DunningSystemEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { DunningSystemEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const DunningSystemResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), isDefault: z.boolean(), archived: z.boolean(), archivedAt: z.iso.datetime({ offset: true }).nullish(), createdById: z.string().nullish(), createdBy: DunningSystemEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: DunningSystemEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type DunningSystemResponseDTO = z.infer; - -/** - * DunningSystemLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const DunningSystemLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type DunningSystemLabelFilterDto = z.infer; - -/** - * DunningSystemFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - * @property { boolean } isDefault - */ -export const DunningSystemFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable(), isDefault: z.boolean().nullable() }).partial(); -export type DunningSystemFilterDto = z.infer; - -/** - * CreateDunningSystemRequestDTOSchema - * @type { object } - * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` - * @property { boolean } isDefault Is default dunning system - */ -export const CreateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100), isDefault: z.boolean().nullish() }); -export type CreateDunningSystemRequestDTO = z.infer; - -/** - * UpdateDunningSystemRequestDTOSchema - * @type { object } - * @property { string } name Dunning system name. Min Length: `3`. Max Length: `100` - * @property { boolean } isDefault Is default dunning system - */ -export const UpdateDunningSystemRequestDTOSchema = z.object({ name: z.string().min(3).max(100).nullable(), isDefault: z.boolean().nullable() }).partial(); -export type UpdateDunningSystemRequestDTO = z.infer; - -/** - * DunningSystemsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const DunningSystemsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); -export type DunningSystemsPaginateLabelsOrderParamEnum = z.infer; -export const DunningSystemsPaginateLabelsOrderParamEnum = DunningSystemsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * DunningSystemsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const DunningSystemsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type DunningSystemsPaginateLabelsResponse = z.infer; - -/** - * DunningSystemsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const DunningSystemsPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "isDefault"]); -export type DunningSystemsPaginateOrderParamEnum = z.infer; -export const DunningSystemsPaginateOrderParamEnum = DunningSystemsPaginateOrderParamEnumSchema.enum; - -/** - * DunningSystemsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { DunningSystemResponseDTO[] } items - */ -export const DunningSystemsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(DunningSystemResponseDTOSchema).nullable() }).partial().shape }); -export type DunningSystemsPaginateResponse = z.infer; - -} diff --git a/test/generated/next/dunningSystems/dunningSystems.queries.ts b/test/generated/next/dunningSystems/dunningSystems.queries.ts deleted file mode 100644 index 7ec4019..0000000 --- a/test/generated/next/dunningSystems/dunningSystems.queries.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { DunningSystemsAcl } from "./dunningSystems.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { DunningSystemsModels } from "./dunningSystems.models"; -import { DunningSystemsApi } from "./dunningSystems.api"; - -export namespace DunningSystemsQueries { -export const moduleName = QueryModule.DunningSystems; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/dunning-systems", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/dunning-systems/:id", id, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate dunning system labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate dunning system labels - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningSystemsAcl.canUsePaginateLabels({ officeId } )); - return DunningSystemsApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary List dunning systems - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); - return DunningSystemsApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary List dunning systems - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, isDefault. Example: `name` - * @param { DunningSystemsModels.DunningSystemFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: DunningSystemsModels.DunningSystemFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(DunningSystemsAcl.canUsePaginate({ officeId } )); - return DunningSystemsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create dunning system - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { DunningSystemsModels.CreateDunningSystemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(DunningSystemsAcl.canUseCreate({ officeId } )); - return DunningSystemsApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get dunning system by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(DunningSystemsAcl.canUseFindById({ officeId } )); - return DunningSystemsApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update dunning system - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { DunningSystemsModels.UpdateDunningSystemRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(DunningSystemsAcl.canUseUpdate({ officeId } )); - return DunningSystemsApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive dunning system - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningSystemsAcl.canUseArchive({ officeId } )); - return DunningSystemsApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive dunning system - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(DunningSystemsAcl.canUseUnarchive({ officeId } )); - return DunningSystemsApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/employee/employee.acl.ts b/test/generated/next/employee/employee.acl.ts deleted file mode 100644 index e796e7e..0000000 --- a/test/generated/next/employee/employee.acl.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmployeeAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List employees - * @param { string } object.officeId officeId from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId?: string, } -) => [ - "Read", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new employee - * @param { string } object.officeId officeId from mutation data - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId?: string, } -) => [ - "Create", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId?: string, }>; - -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Employee" -] as AbilityTuple<"Read", "Employee">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Employee" -] as AbilityTuple<"Read", "Employee">; - -/** - * Use for `useResendOnboardingWithOffice` mutation ability. For global ability, omit the object parameter. - * @description Resend employee onboarding email - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useResendOnboardingWithOffice` mutation - */ -export const canUseResendOnboardingWithOffice = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Create", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - -/** - * Use for `useGet` query ability. - * @description Read Office Employee - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( -) => [ - "Read", - "Employee" -] as AbilityTuple<"Read", "Employee">; - -/** - * Use for `useUpdate` mutation ability. - * @description Update Office Employee - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Employee" -] as AbilityTuple<"Update", "Employee">; - -/** - * Use for `useGetWithOffice` query ability. For global ability, omit the object parameter. - * @description Read Office Employee - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetWithOffice` query - */ -export const canUseGetWithOffice = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Read", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - -/** - * Use for `useUpdateWithOffice` mutation ability. For global ability, omit the object parameter. - * @description Update Office Employee - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateWithOffice` mutation - */ -export const canUseUpdateWithOffice = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Employee", object) : "Employee" -] as AbilityTuple<"Update", "Employee" | ForcedSubject<"Employee"> & { officeId: string, }>; - -/** - * Use for `useListRoles` query ability. - * @description List employee (global) roles - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query - */ -export const canUseListRoles = ( -) => [ - "ListRoles", - "Employee" -] as AbilityTuple<"ListRoles", "Employee">; - -/** - * Use for `useUpdateRoles` mutation ability. - * @description Update employee (global) roles - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation - */ -export const canUseUpdateRoles = ( -) => [ - "UpdateRoles", - "Employee" -] as AbilityTuple<"UpdateRoles", "Employee">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Employee" -] as AbilityTuple<"Archive", "Employee">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Unarchive", - "Employee" -] as AbilityTuple<"Unarchive", "Employee">; - -} diff --git a/test/generated/next/employee/employee.api.ts b/test/generated/next/employee/employee.api.ts deleted file mode 100644 index c0430ed..0000000 --- a/test/generated/next/employee/employee.api.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeModels } from "./employee.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeApi { -export const paginate = (limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeePaginateResponseSchema }, - `/employees`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - populate: ZodExtended.parse(EmployeeModels.EmployeePaginatePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - filter: ZodExtended.parse(EmployeeModels.EmployeeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: EmployeeModels.EmployeeCreateRequest, ) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees`, - ZodExtended.parse(EmployeeModels.EmployeeCreateRequestSchema, data), - - ) -}; -export const singeStepCreate = (data: EmployeeModels.EmployeeOneStepCreateRequest, ) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/one-step`, - ZodExtended.parse(EmployeeModels.EmployeeOneStepCreateRequestSchema, data), - - ) -}; -export const findAll = (search?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeFindAllResponseSchema }, - `/employees/labels`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeePaginateLabelsResponseSchema }, - `/employees/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(EmployeeModels.EmployeeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const resendOnboarding = (employeeId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/employees/${employeeId}/resend-onboarding`, - - ) -}; -export const resendOnboardingWithOffice = (officeId: string, employeeId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/offices/${officeId}/employees/${employeeId}/resend-onboarding`, - - ) -}; -export const get = (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}`, - { - params: { - populate: ZodExtended.parse(EmployeeModels.EmployeeGetPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - }, - } - ) -}; -export const update = (employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, ) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}`, - ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - - ) -}; -export const getWithOffice = (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/offices/${officeId}/employees/${employeeId}`, - { - params: { - populate: ZodExtended.parse(EmployeeModels.GetWithOfficePopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - }, - } - ) -}; -export const updateWithOffice = (officeId: string, employeeId: string, data: EmployeeModels.EmployeeUpdateRequest, ) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/offices/${officeId}/employees/${employeeId}`, - ZodExtended.parse(EmployeeModels.EmployeeUpdateRequestSchema, data), - - ) -}; -export const listRoles = (employeeId: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeModels.EmployeeListRolesResponseSchema }, - `/employees/${employeeId}/roles`, - - ) -}; -export const updateRoles = (employeeId: string, data: EmployeeModels.EmployeeRoleMembershipsUpdateRequest, ) => { - return AppRestClient.put( - { resSchema: EmployeeModels.EmployeeUpdateRolesResponseSchema }, - `/employees/${employeeId}/roles`, - ZodExtended.parse(EmployeeModels.EmployeeRoleMembershipsUpdateRequestSchema, data), - - ) -}; -export const archive = (employeeId: string, ) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}/archive`, - - ) -}; -export const unarchive = (employeeId: string, ) => { - return AppRestClient.post( - { resSchema: EmployeeModels.EmployeeResponseSchema }, - `/employees/${employeeId}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/employee/employee.configs.ts b/test/generated/next/employee/employee.configs.ts deleted file mode 100644 index 1288db2..0000000 --- a/test/generated/next/employee/employee.configs.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeeModels } from "./employee.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeQueries } from "./employee.queries"; -import { EmployeeAcl } from "./employee.acl"; - -export namespace EmployeeConfigs { -export const employeesConfig = { - meta: { - title: "Employees", - }, - readAll: { - acl: EmployeeAcl.canUsePaginate, - schema: EmployeeModels.EmployeeResponseSchema, - paginated: EmployeeQueries.usePaginate, - infinite: EmployeeQueries.usePaginateInfinite, - filters: { - schema: EmployeeModels.EmployeeFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeFilterDtoSchema, - options: { - inputs: { - office: true, - roles: true, - primaryOfficeId: true, - firstName: true, - lastName: true, - email: true, - ids: true, - archived: true, - search: true, - officeRole: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: EmployeeModels.EmployeeResponseSchema, - options: { - columns: { - id: true, - email: true, - firstName: true, - lastName: true, - locale: true, - phone: true, - archived: true, - primaryOfficeId: true, - primaryOffice: true, - employments: true, - roles: true, - createdAt: true, - updatedAt: true, - }, - sortable: EmployeeModels.EmployeePaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: EmployeeAcl.canUseGet, - schema: EmployeeModels.EmployeeResponseSchema, - query: EmployeeQueries.useGet, - }, - create: { - acl: EmployeeAcl.canUseCreate, - schema: EmployeeModels.EmployeeCreateRequestSchema, - mutation: EmployeeQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeCreateRequestSchema, - options: { - inputs: { - firstName: true, - lastName: true, - email: true, - locale: true, - primaryOfficeId: true, - phone: true, - }, - }, -}) - }, - update: { - acl: EmployeeAcl.canUseUpdate, - schema: EmployeeModels.EmployeeUpdateRequestSchema, - mutation: EmployeeQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeUpdateRequestSchema, - options: { - inputs: { - firstName: true, - lastName: true, - phone: true, - locale: true, - primaryOfficeId: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: EmployeeAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: EmployeeQueries.usePaginateLabels, - infinite: EmployeeQueries.usePaginateLabelsInfinite, - filters: { - schema: EmployeeModels.EmployeeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeModels.EmployeeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: EmployeeModels.EmployeePaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/employee/employee.models.ts b/test/generated/next/employee/employee.models.ts deleted file mode 100644 index 7e5c67a..0000000 --- a/test/generated/next/employee/employee.models.ts +++ /dev/null @@ -1,225 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeModels { -/** - * EmployeeResponseSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { CommonModels.LocaleEnum } locale - * @property { string } phone Phone number - * @property { boolean } archived Archived - * @property { string } primaryOfficeId Primary office id - * @property { CommonModels.EmployeeOfficeResponse } primaryOffice Primary office - * @property { CommonModels.EmploymentResponse[] } employments Employments - * @property { CommonModels.EmployeeRoleResponse[] } roles Global Roles - * @property { string } createdAt - * @property { string } updatedAt - */ -export const EmployeeResponseSchema = z.object({ id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), locale: CommonModels.LocaleEnumSchema.nullish(), phone: z.string().nullish(), archived: z.boolean().nullish(), primaryOfficeId: z.string().nullish(), primaryOffice: CommonModels.EmployeeOfficeResponseSchema.nullish(), employments: z.array(CommonModels.EmploymentResponseSchema).nullish(), roles: z.array(CommonModels.EmployeeRoleResponseSchema).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }) }); -export type EmployeeResponse = z.infer; - -/** - * EmployeeCreateRequestSchema - * @type { object } - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { CommonModels.LocaleEnum } locale - * @property { string } primaryOfficeId Primary office ID - * @property { string } phone Phone number - */ -export const EmployeeCreateRequestSchema = z.object({ firstName: z.string(), lastName: z.string(), email: z.email(), locale: CommonModels.LocaleEnumSchema.nullish(), primaryOfficeId: z.string().nullish(), phone: z.string().nullish() }); -export type EmployeeCreateRequest = z.infer; - -/** - * EmployeeOneStepCreateEmploymentRequestSchema - * @type { object } - * @property { string } officeId - * @property { string[] } roleIds Array of office role IDs - */ -export const EmployeeOneStepCreateEmploymentRequestSchema = z.object({ officeId: z.string(), roleIds: z.array(z.string()).nullish() }); -export type EmployeeOneStepCreateEmploymentRequest = z.infer; - -/** - * EmployeeOneStepCreateRequestSchema - * @type { object } - * @property { CommonModels.LocaleEnum } locale - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { string } phone Phone number - * @property { string[] } roleIds Array of global role IDs - * @property { string } primaryOfficeId Primary office ID - * @property { EmployeeOneStepCreateEmploymentRequest[] } employments Employments. Min Items: `1` - */ -export const EmployeeOneStepCreateRequestSchema = z.object({ locale: CommonModels.LocaleEnumSchema.nullish(), firstName: z.string(), lastName: z.string(), email: z.email(), phone: z.string().nullish(), roleIds: z.array(z.string()).nullish(), primaryOfficeId: z.string().nullish(), employments: z.array(EmployeeOneStepCreateEmploymentRequestSchema).min(1) }); -export type EmployeeOneStepCreateRequest = z.infer; - -/** - * EmployeeUpdateRequestSchema - * @type { object } - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number of the employee - * @property { CommonModels.LocaleEnum } locale - * @property { string } primaryOfficeId - */ -export const EmployeeUpdateRequestSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), phone: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullable(), primaryOfficeId: z.string().nullable() }).partial(); -export type EmployeeUpdateRequest = z.infer; - -/** - * EmployeeFilterDtoSchema - * @type { object } - * @property { string } office Office ID (single select, offices the user has access to) - * @property { string[] } roles Role IDs (multiselect) - * @property { string } primaryOfficeId Primary office id - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } email Email - * @property { string[] } ids Ids - * @property { boolean } archived Archived - * set to true to only return archived employees - * does not return archived employees by default. Default: `false` - * @property { string } search Free text search multiple fields - * @property { string } officeRole Office role - */ -export const EmployeeFilterDtoSchema = z.object({ office: z.string().nullable(), roles: z.array(z.string()).nullable(), primaryOfficeId: z.string().nullable(), firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), ids: z.array(z.string()).nullable(), archived: z.boolean().nullable().default(false), search: z.string().nullable(), officeRole: z.string().nullable() }).partial(); -export type EmployeeFilterDto = z.infer; - -/** - * EmployeeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const EmployeeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type EmployeeLabelFilterDto = z.infer; - -/** - * EmployeeRoleMemberResponseSchema - * @type { object } - * @property { string } roleId - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string[] } permissions Permissions associated with the role - */ -export const EmployeeRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), permissions: z.array(z.string()) }); -export type EmployeeRoleMemberResponse = z.infer; - -/** - * EmployeeRoleMembershipsUpdateRequestSchema - * @type { object } - * @property { string[] } roleIds Array of role IDs - */ -export const EmployeeRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()) }); -export type EmployeeRoleMembershipsUpdateRequest = z.infer; - -/** - * EmployeePaginateOrderParamEnumSchema - * @type { enum } - */ -export const EmployeePaginateOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); -export type EmployeePaginateOrderParamEnum = z.infer; -export const EmployeePaginateOrderParamEnum = EmployeePaginateOrderParamEnumSchema.enum; - -/** - * EmployeePopulateFieldSchema - * @type { enum } - */ -export const EmployeePopulateFieldSchema = z.enum(["employments", "primaryOffice", "roles", "employments.roles", "employments.office"]); -export type EmployeePopulateField = z.infer; -export const EmployeePopulateField = EmployeePopulateFieldSchema.enum; - -/** - * EmployeePaginatePopulateParamSchema - * @type { array } - */ -export const EmployeePaginatePopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); -export type EmployeePaginatePopulateParam = z.infer; - -/** - * EmployeePaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeResponse[] } items - */ -export const EmployeePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeResponseSchema).nullable() }).partial().shape }); -export type EmployeePaginateResponse = z.infer; - -/** - * EmployeeFindAllResponseSchema - * @type { array } - */ -export const EmployeeFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type EmployeeFindAllResponse = z.infer; - -/** - * EmployeePaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const EmployeePaginateLabelsOrderParamEnumSchema = z.enum(["firstName", "lastName", "email", "name", "createdAt"]); -export type EmployeePaginateLabelsOrderParamEnum = z.infer; -export const EmployeePaginateLabelsOrderParamEnum = EmployeePaginateLabelsOrderParamEnumSchema.enum; - -/** - * EmployeePaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const EmployeePaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type EmployeePaginateLabelsResponse = z.infer; - -/** - * EmployeeGetPopulateParamSchema - * @type { array } - */ -export const EmployeeGetPopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); -export type EmployeeGetPopulateParam = z.infer; - -/** - * GetWithOfficePopulateParamSchema - * @type { array } - */ -export const GetWithOfficePopulateParamSchema = z.array(EmployeePopulateFieldSchema).nullish(); -export type GetWithOfficePopulateParam = z.infer; - -/** - * EmployeeListRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleMemberResponse[] } items - */ -export const EmployeeListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).nullable() }).partial().shape }); -export type EmployeeListRolesResponse = z.infer; - -/** - * EmployeeUpdateRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleMemberResponse[] } items - */ -export const EmployeeUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleMemberResponseSchema).nullable() }).partial().shape }); -export type EmployeeUpdateRolesResponse = z.infer; - -} diff --git a/test/generated/next/employee/employee.queries.ts b/test/generated/next/employee/employee.queries.ts deleted file mode 100644 index 4d934bc..0000000 --- a/test/generated/next/employee/employee.queries.ts +++ /dev/null @@ -1,469 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeeAcl } from "./employee.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeModels } from "./employee.models"; -import { EmployeeApi } from "./employee.api"; - -export namespace EmployeeQueries { -export const moduleName = QueryModule.Employee; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees", limit, order, populate, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string) => [...keys.all, "/employees", "infinite", limit, order, populate, filter, cursor] as const, - findAll: (search?: string) => [...keys.all, "/employees/labels", search] as const, - paginateLabels: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string) => [...keys.all, "/employees/labels/paginate", "infinite", limit, order, filter, cursor] as const, - get: (employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam) => [...keys.all, "/employees/:employeeId", employeeId, populate] as const, - getWithOffice: (officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam) => [...keys.all, "/offices/:officeId/employees/:employeeId", officeId, employeeId, populate] as const, - listRoles: (employeeId: string) => [...keys.all, "/employees/:employeeId/roles", employeeId] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Employees - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter - * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, populate, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Employees - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeePaginatePopulateParam } object.populate Query parameter - * @param { EmployeeModels.EmployeeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmployeeModels.EmployeePaginatePopulateParam, filter?: EmployeeModels.EmployeeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, populate, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeAcl.canUsePaginate()); - return EmployeeApi.paginate(limit, order, populate, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Employee - * @permission Requires `canUseCreate` ability - * @param { EmployeeModels.EmployeeCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmployeeAcl.canUseCreate()); - return EmployeeApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useSingeStepCreate` - * @summary Create Employee in a single step - * - requires Employee:Create for creating a global employee - * - requires Employee:Create{officeId} for creating an office employee (first office is primary) - * - requires Employment:Create{officeId} for creating office employments - * - requires Employee:UpdateRoles for setting global roles - * - requires Employee:UpdateRoles{officeId} for setting office roles - * @param { EmployeeModels.EmployeeOneStepCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useSingeStepCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - EmployeeApi.singeStepCreate(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindAll` - * @summary List all employees with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search), - queryFn: () => { - checkAcl(EmployeeAcl.canUseFindAll()); - return EmployeeApi.findAll(search) }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate employees with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate employees with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): firstName, lastName, email, name, createdAt. Example: `firstName` - * @param { EmployeeModels.EmployeeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeModels.EmployeeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeAcl.canUsePaginateLabels()); - return EmployeeApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useResendOnboarding` - * @summary Resend Employee Onboarding Email - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useResendOnboarding = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => - EmployeeApi.resendOnboarding(employeeId) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useResendOnboardingWithOffice` - * @permission Requires `canUseResendOnboardingWithOffice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useResendOnboardingWithOffice = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employeeId }) => { - checkAcl(EmployeeAcl.canUseResendOnboardingWithOffice({ officeId } )); - return EmployeeApi.resendOnboardingWithOffice(officeId, employeeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGet` - * @summary Get Employee - * - allow global admins and office admins of primary office - * @permission Requires `canUseGet` ability - * @param { string } object.employeeId Path parameter - * @param { EmployeeModels.EmployeeGetPopulateParam } object.populate Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ employeeId, populate }: { employeeId: string, populate?: EmployeeModels.EmployeeGetPopulateParam }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(employeeId, populate), - queryFn: () => { - checkAcl(EmployeeAcl.canUseGet()); - return EmployeeApi.get(employeeId, populate) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Employee - * - allow global admins and office admins of primary office - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdate()); - return EmployeeApi.update(employeeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetWithOffice` - * @permission Requires `canUseGetWithOffice` ability - * @param { string } object.officeId Path parameter - * @param { string } object.employeeId Path parameter - * @param { EmployeeModels.GetWithOfficePopulateParam } object.populate Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetWithOffice = ({ officeId, employeeId, populate }: { officeId: string, employeeId: string, populate?: EmployeeModels.GetWithOfficePopulateParam }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getWithOffice(officeId, employeeId, populate), - queryFn: () => { - checkAcl(EmployeeAcl.canUseGetWithOffice({ officeId } )); - return EmployeeApi.getWithOffice(officeId, employeeId, populate) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateWithOffice` - * @permission Requires `canUseUpdateWithOffice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateWithOffice = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdateWithOffice({ officeId } )); - return EmployeeApi.updateWithOffice(officeId, employeeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, employeeId } = variables; - const updateKeys = [keys.get(employeeId), keys.getWithOffice(officeId, employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListRoles` - * @summary List Employee (global) Roles - * @permission Requires `canUseListRoles` ability - * @param { string } object.employeeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoles = ({ employeeId }: { employeeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoles(employeeId), - queryFn: () => { - checkAcl(EmployeeAcl.canUseListRoles()); - return EmployeeApi.listRoles(employeeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateRoles` - * @summary Update Employee (global) Roles - * @permission Requires `canUseUpdateRoles` ability - * @param { string } mutation.employeeId Path parameter - * @param { EmployeeModels.EmployeeRoleMembershipsUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId, data }) => { - checkAcl(EmployeeAcl.canUseUpdateRoles()); - return EmployeeApi.updateRoles(employeeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Employee - * @permission Requires `canUseArchive` ability - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => { - checkAcl(EmployeeAcl.canUseArchive()); - return EmployeeApi.archive(employeeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Un-archive Employee - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.employeeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ employeeId }) => { - checkAcl(EmployeeAcl.canUseUnarchive()); - return EmployeeApi.unarchive(employeeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { employeeId } = variables; - const updateKeys = [keys.get(employeeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/employeeAccount/employeeAccount.api.ts b/test/generated/next/employeeAccount/employeeAccount.api.ts deleted file mode 100644 index 22e4d03..0000000 --- a/test/generated/next/employeeAccount/employeeAccount.api.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { EmployeeAccountModels } from "./employeeAccount.models"; - -export namespace EmployeeAccountApi { -export const get = () => { - return AppRestClient.get( - { resSchema: EmployeeAccountModels.EmployeeAccountDtoSchema }, - `/employees/account`, - - ) -}; -} diff --git a/test/generated/next/employeeAccount/employeeAccount.models.ts b/test/generated/next/employeeAccount/employeeAccount.models.ts deleted file mode 100644 index 8f21c37..0000000 --- a/test/generated/next/employeeAccount/employeeAccount.models.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeAccountModels { -/** - * EmployeeAccountEmploymentDtoSchema - * @type { object } - * @property { string } officeId Office ID - * @property { string } officeName Office name - */ -export const EmployeeAccountEmploymentDtoSchema = z.object({ officeId: z.string(), officeName: z.string() }); -export type EmployeeAccountEmploymentDto = z.infer; - -/** - * EmployeeAccountPrimaryOfficeDtoSchema - * @type { object } - * @property { string } officeId Office ID - * @property { string } officeName Office name - */ -export const EmployeeAccountPrimaryOfficeDtoSchema = z.object({ officeId: z.string(), officeName: z.string() }); -export type EmployeeAccountPrimaryOfficeDto = z.infer; - -/** - * EmployeeAccountRoleDtoSchema - * @type { object } - * @property { string } name Role name - * @property { string[] } permissions Role permissions - * @property { string } officeId Office ID - */ -export const EmployeeAccountRoleDtoSchema = z.object({ name: z.string(), permissions: z.array(z.string()), officeId: z.string().nullish() }); -export type EmployeeAccountRoleDto = z.infer; - -/** - * EmployeeAccountDtoSchema - * @type { object } - * @property { string } defaultUrl - * @property { string } costCenter - * @property { CommonModels.LocaleEnum } locale - * @property { array[] } aclRules Can hold any type of value - * @property { object } settings Employee settings keyed by setting name - * @property { string } id Employee ID - * @property { string } email Email - * @property { string } firstName First name - * @property { string } lastName Last name - * @property { string } phone Phone number - * @property { EmployeeAccountEmploymentDto[] } employments Employments - * @property { EmployeeAccountPrimaryOfficeDto } primaryOffice Primary office - * @property { EmployeeAccountRoleDto[] } roles Roles - */ -export const EmployeeAccountDtoSchema = z.object({ defaultUrl: z.string().nullish(), costCenter: z.string().nullish(), locale: CommonModels.LocaleEnumSchema.nullish(), aclRules: z.array(z.array(z.any())), settings: z.union([z.object({}).catchall(z.any()), z.array(z.object({}).catchall(z.any())), z.string(), z.array(z.string()), z.array(z.number())]), id: z.string(), email: z.email(), firstName: z.string(), lastName: z.string(), phone: z.string().nullish(), employments: z.array(EmployeeAccountEmploymentDtoSchema), primaryOffice: EmployeeAccountPrimaryOfficeDtoSchema, roles: z.array(EmployeeAccountRoleDtoSchema) }); -export type EmployeeAccountDto = z.infer; - -} diff --git a/test/generated/next/employeeAccount/employeeAccount.queries.ts b/test/generated/next/employeeAccount/employeeAccount.queries.ts deleted file mode 100644 index ad8f854..0000000 --- a/test/generated/next/employeeAccount/employeeAccount.queries.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeAccountApi } from "./employeeAccount.api"; - -export namespace EmployeeAccountQueries { -export const moduleName = QueryModule.EmployeeAccount; - -export const keys = { - all: [moduleName] as const, - get: () => [...keys.all, "/employees/account", ] as const, -}; - -/** - * Query `useGet` - * @summary Get profile of logged-in user - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.get(), - queryFn: EmployeeAccountApi.get, - ...options, - }); -}; - -} diff --git a/test/generated/next/employeePermissions/employeePermissions.acl.ts b/test/generated/next/employeePermissions/employeePermissions.acl.ts deleted file mode 100644 index 25d65ad..0000000 --- a/test/generated/next/employeePermissions/employeePermissions.acl.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace EmployeePermissionsAcl { -/** - * Use for `usePaginatePermissions` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query - */ -export const canUsePaginatePermissions = ( -) => [ - "Read", - "Permission" -] as AbilityTuple<"Read", "Permission">; - -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Permission" -] as AbilityTuple<"Read", "Permission">; - -} diff --git a/test/generated/next/employeePermissions/employeePermissions.api.ts b/test/generated/next/employeePermissions/employeePermissions.api.ts deleted file mode 100644 index d5bad68..0000000 --- a/test/generated/next/employeePermissions/employeePermissions.api.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; - -export namespace EmployeePermissionsApi { -export const paginatePermissions = (limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsResponseSchema }, - `/employees/permissions`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(EmployeePermissionsModels.EmployeePermissionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findAll = (search?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeePermissionsModels.EmployeePermissionsFindAllResponseSchema }, - `/employees/permissions/labels`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -} diff --git a/test/generated/next/employeePermissions/employeePermissions.configs.ts b/test/generated/next/employeePermissions/employeePermissions.configs.ts deleted file mode 100644 index 50dd5bf..0000000 --- a/test/generated/next/employeePermissions/employeePermissions.configs.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; -import { EmployeePermissionsQueries } from "./employeePermissions.queries"; -import { EmployeePermissionsAcl } from "./employeePermissions.acl"; - -export namespace EmployeePermissionsConfigs { -export const permissionsConfig = { - meta: { - title: "Permissions", - }, - readAll: { - acl: EmployeePermissionsAcl.canUsePaginatePermissions, - schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, - paginated: EmployeePermissionsQueries.usePaginatePermissions, - infinite: EmployeePermissionsQueries.usePaginatePermissionsInfinite, - filters: { - schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeePermissionsModels.EmployeePermissionFilterDtoSchema, - options: { - inputs: { - context: true, - ids: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: EmployeePermissionsModels.EmployeePermissionResponseSchema, - options: { - columns: { - id: true, - label: true, - group: true, - description: true, - context: true, - }, - sortable: EmployeePermissionsModels.EmployeePermissionsPaginatePermissionsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/employeePermissions/employeePermissions.models.ts b/test/generated/next/employeePermissions/employeePermissions.models.ts deleted file mode 100644 index 701c149..0000000 --- a/test/generated/next/employeePermissions/employeePermissions.models.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeePermissionsModels { -/** - * EmployeePermissionResponseSchema - * @type { object } - * @property { string } id Employee Permission unique identifier - * @property { string } label - * @property { string } group - * @property { string } description - * @property { string } context Scope where this rule is applied - */ -export const EmployeePermissionResponseSchema = z.object({ id: z.string(), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema }); -export type EmployeePermissionResponse = z.infer; - -/** - * EmployeePermissionFilterDtoSchema - * @type { object } - * @property { string } context Role context - * @property { string[] } ids Ids - */ -export const EmployeePermissionFilterDtoSchema = z.object({ context: CommonModels.EmployeeRoleContextSchema.nullable(), ids: z.array(z.string()).nullable() }).partial(); -export type EmployeePermissionFilterDto = z.infer; - -/** - * EmployeePermissionsPaginatePermissionsOrderParamEnumSchema - * @type { enum } - */ -export const EmployeePermissionsPaginatePermissionsOrderParamEnumSchema = z.enum(["id"]); -export type EmployeePermissionsPaginatePermissionsOrderParamEnum = z.infer; -export const EmployeePermissionsPaginatePermissionsOrderParamEnum = EmployeePermissionsPaginatePermissionsOrderParamEnumSchema.enum; - -/** - * EmployeePermissionsPaginatePermissionsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeePermissionResponse[] } items - */ -export const EmployeePermissionsPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeePermissionResponseSchema).nullable() }).partial().shape }); -export type EmployeePermissionsPaginatePermissionsResponse = z.infer; - -/** - * EmployeePermissionsFindAllResponseSchema - * @type { array } - */ -export const EmployeePermissionsFindAllResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type EmployeePermissionsFindAllResponse = z.infer; - -} diff --git a/test/generated/next/employeePermissions/employeePermissions.queries.ts b/test/generated/next/employeePermissions/employeePermissions.queries.ts deleted file mode 100644 index 8859611..0000000 --- a/test/generated/next/employeePermissions/employeePermissions.queries.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeePermissionsAcl } from "./employeePermissions.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { EmployeePermissionsModels } from "./employeePermissions.models"; -import { EmployeePermissionsApi } from "./employeePermissions.api"; - -export namespace EmployeePermissionsQueries { -export const moduleName = QueryModule.EmployeePermissions; - -export const keys = { - all: [moduleName] as const, - paginatePermissions: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/permissions", limit, order, filter, page, cursor] as const, - paginatePermissionsInfinite: (limit?: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string) => [...keys.all, "/employees/permissions", "infinite", limit, order, filter, cursor] as const, - findAll: (search?: string) => [...keys.all, "/employees/permissions/labels", search] as const, -}; - -/** - * Query `usePaginatePermissions` - * @permission Requires `canUsePaginatePermissions` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` - * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginatePermissions = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginatePermissions(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginatePermissionsInfinite - * @permission Requires `canUsePaginatePermissions` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): id. Example: `id` - * @param { EmployeePermissionsModels.EmployeePermissionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginatePermissionsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeePermissionsModels.EmployeePermissionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginatePermissionsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeePermissionsAcl.canUsePaginatePermissions()); - return EmployeePermissionsApi.paginatePermissions(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindAll` - * @summary List all permissions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ search }: { search?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(search), - queryFn: () => { - checkAcl(EmployeePermissionsAcl.canUseFindAll()); - return EmployeePermissionsApi.findAll(search) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/employeeProfile/employeeProfile.api.ts b/test/generated/next/employeeProfile/employeeProfile.api.ts deleted file mode 100644 index 745cd77..0000000 --- a/test/generated/next/employeeProfile/employeeProfile.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeProfileModels } from "./employeeProfile.models"; - -export namespace EmployeeProfileApi { -export const getProfile = () => { - return AppRestClient.get( - { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, - `/employee-profile`, - - ) -}; -export const updateProfile = (data: EmployeeProfileModels.UpdateEmployeeProfileRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: EmployeeProfileModels.EmployeeProfileResponseDTOSchema }, - `/employee-profile`, - ZodExtended.parse(EmployeeProfileModels.UpdateEmployeeProfileRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/employeeProfile/employeeProfile.models.ts b/test/generated/next/employeeProfile/employeeProfile.models.ts deleted file mode 100644 index 7e9d93e..0000000 --- a/test/generated/next/employeeProfile/employeeProfile.models.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeProfileModels { -/** - * EmployeeProfileResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } firstName Employee first name - * @property { string } lastName Employee last name - * @property { string } email Employee email - * @property { string } phone Employee phone number - * @property { string } defaultUrl Employee default URL - * @property { CommonModels.LocaleEnum } locale Employee locale - */ -export const EmployeeProfileResponseDTOSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), email: z.string(), phone: z.string().nullish(), defaultUrl: z.string().nullish(), locale: CommonModels.LocaleEnumSchema.nullish() }); -export type EmployeeProfileResponseDTO = z.infer; - -/** - * UpdateEmployeeProfileRequestDTOSchema - * @type { object } - * @property { string } firstName Employee first name. Example: `John` - * @property { string } lastName Employee last name. Example: `Doe` - * @property { string } email Employee email address. Example: `john.doe@example.com` - * @property { string } phone Employee phone number. Example: `+1234567890` - * @property { string } defaultUrl Default URL for the employee profile. Example: `https://example.com` - * @property { string } costCenter Employee cost center - * @property { CommonModels.LocaleEnum } locale Employee locale preference. Example: `en-US` - */ -export const UpdateEmployeeProfileRequestDTOSchema = z.object({ firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.email().nullable(), phone: z.string().nullable(), defaultUrl: z.url().nullable(), costCenter: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullable() }).partial(); -export type UpdateEmployeeProfileRequestDTO = z.infer; - -} diff --git a/test/generated/next/employeeProfile/employeeProfile.queries.ts b/test/generated/next/employeeProfile/employeeProfile.queries.ts deleted file mode 100644 index bbcee98..0000000 --- a/test/generated/next/employeeProfile/employeeProfile.queries.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeProfileModels } from "./employeeProfile.models"; -import { EmployeeProfileApi } from "./employeeProfile.api"; - -export namespace EmployeeProfileQueries { -export const moduleName = QueryModule.EmployeeProfile; - -export const keys = { - all: [moduleName] as const, - getProfile: () => [...keys.all, "/employee-profile", ] as const, -}; - -/** - * Query `useGetProfile` - * @summary Get employee profile - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetProfile = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getProfile(), - queryFn: EmployeeProfileApi.getProfile, - ...options, - }); -}; - -/** - * Mutation `useUpdateProfile` - * @summary Update employee profile - * @param { EmployeeProfileModels.UpdateEmployeeProfileRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateProfile = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - EmployeeProfileApi.updateProfile(data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.getProfile()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/employeeRoles/employeeRoles.acl.ts b/test/generated/next/employeeRoles/employeeRoles.acl.ts deleted file mode 100644 index a64e698..0000000 --- a/test/generated/next/employeeRoles/employeeRoles.acl.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmployeeRolesAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List all possible roles - * @param { string } object.context context from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { context?: string, } -) => [ - "Read", - object ? subject("Role", object) : "Role" -] as AbilityTuple<"Read", "Role" | ForcedSubject<"Role"> & { context?: string, }>; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Role" -] as AbilityTuple<"Create", "Role">; - -/** - * Use for `useLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLabels` query - */ -export const canUseLabels = ( -) => [ - "Read", - "Role" -] as AbilityTuple<"Read", "Role">; - -/** - * Use for `useFind` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query - */ -export const canUseFind = ( -) => [ - "Read", - "Role" -] as AbilityTuple<"Read", "Role">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Role" -] as AbilityTuple<"Update", "Role">; - -/** - * Use for `useDeleteEmployeesRolesByRoleId` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteEmployeesRolesByRoleId` mutation - */ -export const canUseDeleteEmployeesRolesByRoleId = ( -) => [ - "Delete", - "Role" -] as AbilityTuple<"Delete", "Role">; - -/** - * Use for `usePaginatePermissions` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginatePermissions` query - */ -export const canUsePaginatePermissions = ( -) => [ - "Read", - "Role" -] as AbilityTuple<"Read", "Role">; - -/** - * Use for `useTogglePermission` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTogglePermission` mutation - */ -export const canUseTogglePermission = ( -) => [ - "Update", - "Role" -] as AbilityTuple<"Update", "Role">; - -/** - * Use for `useCopy` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopy` mutation - */ -export const canUseCopy = ( -) => [ - "Create", - "Role" -] as AbilityTuple<"Create", "Role">; - -} diff --git a/test/generated/next/employeeRoles/employeeRoles.api.ts b/test/generated/next/employeeRoles/employeeRoles.api.ts deleted file mode 100644 index 2139057..0000000 --- a/test/generated/next/employeeRoles/employeeRoles.api.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeRolesApi { -export const list = (limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeRolesModels.EmployeeRolesListResponseSchema }, - `/employees/roles`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: EmployeeRolesModels.EmployeeRoleCreateRequest, ) => { - return AppRestClient.post( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleCreateRequestSchema, data), - - ) -}; -export const labels = (search?: string, context?: CommonModels.EmployeeRoleContext, ) => { - return AppRestClient.get( - { resSchema: EmployeeRolesModels.LabelsResponseSchema }, - `/employees/roles/labels`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - context: ZodExtended.parse(CommonModels.EmployeeRoleContextSchema.optional(), context, { type: "query", name: "context" }), - }, - } - ) -}; -export const find = (roleId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}`, - - ) -}; -export const update = (roleId: string, data: EmployeeRolesModels.EmployeeRoleUpdateRequest, ) => { - return AppRestClient.put( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, data), - - ) -}; -export const deleteEmployeesRolesByRoleId = (roleId: string, ) => { - return AppRestClient.delete( - { resSchema: CommonModels.StatusResponseDtoSchema }, - `/employees/roles/${roleId}`, - - ) -}; -export const paginatePermissions = (roleId: string, ) => { - return AppRestClient.get( - { resSchema: EmployeeRolesModels.EmployeeRolesPaginatePermissionsResponseSchema }, - `/employees/roles/${roleId}/permissions`, - - ) -}; -export const togglePermission = (roleId: string, permission: string, data: EmployeeRolesModels.EmployeeRoleTogglePermissionRequest, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/employees/roles/${roleId}/permissions/${permission}/toggle`, - ZodExtended.parse(EmployeeRolesModels.EmployeeRoleTogglePermissionRequestSchema, data), - - ) -}; -export const copy = (roleId: string, data: EmployeeRolesModels.CopyEmployeeRoleDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.EmployeeRoleResponseSchema }, - `/employees/roles/${roleId}/copy`, - ZodExtended.parse(EmployeeRolesModels.CopyEmployeeRoleDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/employeeRoles/employeeRoles.configs.ts b/test/generated/next/employeeRoles/employeeRoles.configs.ts deleted file mode 100644 index 4e0b998..0000000 --- a/test/generated/next/employeeRoles/employeeRoles.configs.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeRolesQueries } from "./employeeRoles.queries"; -import { EmployeeRolesAcl } from "./employeeRoles.acl"; - -export namespace EmployeeRolesConfigs { -export const rolesConfig = { - meta: { - title: "Roles", - }, - readAll: { - acl: EmployeeRolesAcl.canUseList, - schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, - paginated: EmployeeRolesQueries.useList, - infinite: EmployeeRolesQueries.useListInfinite, - filters: { - schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRolePaginationFilterDtoSchema, - options: { - inputs: { - name: true, - context: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: EmployeeRolesModels.EmployeeRoleListItemResponseSchema, - options: { - columns: { - id: true, - name: true, - color: true, - description: true, - context: true, - permissions: true, - numberOfUsers: true, - }, - sortable: EmployeeRolesModels.EmployeeRolesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: EmployeeRolesAcl.canUseFind, - schema: CommonModels.EmployeeRoleResponseSchema, - query: EmployeeRolesQueries.useFind, - }, - create: { - acl: EmployeeRolesAcl.canUseCreate, - schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, - mutation: EmployeeRolesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRoleCreateRequestSchema, - options: { - inputs: { - name: true, - color: true, - description: true, - context: true, - permissions: true, - }, - }, -}) - }, - update: { - acl: EmployeeRolesAcl.canUseUpdate, - schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, - mutation: EmployeeRolesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: EmployeeRolesModels.EmployeeRoleUpdateRequestSchema, - options: { - inputs: { - name: true, - color: true, - description: true, - }, - }, -}) - }, - delete: { - acl: EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId, - mutation: EmployeeRolesQueries.useDeleteEmployeesRolesByRoleId, - }, -}; - -} diff --git a/test/generated/next/employeeRoles/employeeRoles.models.ts b/test/generated/next/employeeRoles/employeeRoles.models.ts deleted file mode 100644 index f7b3720..0000000 --- a/test/generated/next/employeeRoles/employeeRoles.models.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmployeeRolesModels { -/** - * EmployeeRoleListItemResponseSchema - * @type { object } - * @property { string } id Unique identifier of the role - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string } context Role context - * @property { string[] } permissions Permissions associated with the role - * @property { number } numberOfUsers Number of users associated with the role - */ -export const EmployeeRoleListItemResponseSchema = z.object({ id: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema.nullish(), permissions: z.array(z.string()), numberOfUsers: z.number() }); -export type EmployeeRoleListItemResponse = z.infer; - -/** - * EmployeeRolePaginationFilterDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } context Role context - * @property { string } search - */ -export const EmployeeRolePaginationFilterDtoSchema = z.object({ name: z.string().nullable(), context: CommonModels.EmployeeRoleContextSchema.nullable(), search: z.string().nullable() }).partial(); -export type EmployeeRolePaginationFilterDto = z.infer; - -/** - * EmployeeRoleCreateRequestSchema - * @type { object } - * @property { string } name Name of the role - * @property { string } color Color of the role - * @property { string } description Color of the role - * @property { string } context Role context - * - office or global - * @property { string[] } permissions Permission IDs associated with the role - * can only be either office or global. Default: `` - */ -export const EmployeeRoleCreateRequestSchema = z.object({ name: z.string(), color: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema, permissions: z.array(z.string()).default([]) }); -export type EmployeeRoleCreateRequest = z.infer; - -/** - * EmployeeRolePermissionDtoSchema - * @type { object } - * @property { string } id Employee Permission unique identifier - * @property { string } label - * @property { string } group - * @property { string } description - * @property { string } context Scope where this rule is applied - * @property { boolean } enabled - */ -export const EmployeeRolePermissionDtoSchema = z.object({ id: z.string(), label: z.string(), group: z.string(), description: z.string().nullish(), context: CommonModels.EmployeeRoleContextSchema, enabled: z.boolean() }); -export type EmployeeRolePermissionDto = z.infer; - -/** - * EmployeeRoleUpdateRequestSchema - * @type { object } - * @property { string } name Role Id - * @property { string } color Role Color - * @property { string } description Role Description - */ -export const EmployeeRoleUpdateRequestSchema = z.object({ name: z.string(), color: z.string(), description: z.string() }); -export type EmployeeRoleUpdateRequest = z.infer; - -/** - * EmployeeRoleTogglePermissionRequestSchema - * @type { object } - * @property { boolean } toggled Turn the permission on or off - */ -export const EmployeeRoleTogglePermissionRequestSchema = z.object({ toggled: z.boolean() }); -export type EmployeeRoleTogglePermissionRequest = z.infer; - -/** - * CopyEmployeeRoleDtoSchema - * @type { object } - * @property { string } newRoleName - */ -export const CopyEmployeeRoleDtoSchema = z.object({ newRoleName: z.string() }); -export type CopyEmployeeRoleDto = z.infer; - -/** - * EmployeeRolesListOrderParamEnumSchema - * @type { enum } - */ -export const EmployeeRolesListOrderParamEnumSchema = z.enum(["name", "numberOfUsers"]); -export type EmployeeRolesListOrderParamEnum = z.infer; -export const EmployeeRolesListOrderParamEnum = EmployeeRolesListOrderParamEnumSchema.enum; - -/** - * EmployeeRolesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRoleListItemResponse[] } items - */ -export const EmployeeRolesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRoleListItemResponseSchema).nullable() }).partial().shape }); -export type EmployeeRolesListResponse = z.infer; - -/** - * LabelsResponseSchema - * @type { array } - */ -export const LabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type LabelsResponse = z.infer; - -/** - * EmployeeRolesPaginatePermissionsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmployeeRolePermissionDto[] } items - */ -export const EmployeeRolesPaginatePermissionsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmployeeRolePermissionDtoSchema).nullable() }).partial().shape }); -export type EmployeeRolesPaginatePermissionsResponse = z.infer; - -} diff --git a/test/generated/next/employeeRoles/employeeRoles.queries.ts b/test/generated/next/employeeRoles/employeeRoles.queries.ts deleted file mode 100644 index c726a38..0000000 --- a/test/generated/next/employeeRoles/employeeRoles.queries.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmployeeRolesAcl } from "./employeeRoles.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeRolesModels } from "./employeeRoles.models"; -import { CommonModels } from "@/data/common/common.models"; -import { EmployeeRolesApi } from "./employeeRoles.api"; - -export namespace EmployeeRolesQueries { -export const moduleName = QueryModule.EmployeeRoles; - -export const keys = { - all: [moduleName] as const, - list: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/roles", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string) => [...keys.all, "/employees/roles", "infinite", limit, order, filter, cursor] as const, - labels: (search?: string, context?: CommonModels.EmployeeRoleContext) => [...keys.all, "/employees/roles/labels", search, context] as const, - find: (roleId: string) => [...keys.all, "/employees/roles/:roleId", roleId] as const, - paginatePermissions: (roleId: string) => [...keys.all, "/employees/roles/:roleId/permissions", roleId] as const, -}; - -/** - * Query `useList` - * @summary Paginate Employee Role Definitions - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` - * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary Paginate Employee Role Definitions - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, numberOfUsers. Example: `name` - * @param { EmployeeRolesModels.EmployeeRolePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: EmployeeRolesModels.EmployeeRolePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmployeeRolesAcl.canUseList()); - return EmployeeRolesApi.list(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Employee Role Definition - * @permission Requires `canUseCreate` ability - * @param { EmployeeRolesModels.EmployeeRoleCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmployeeRolesAcl.canUseCreate()); - return EmployeeRolesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useLabels` - * @summary List all employee roles with only their labels - * @permission Requires `canUseLabels` ability - * @param { string } object.search Query parameter - * @param { CommonModels.EmployeeRoleContext } object.context Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useLabels = ({ search, context }: { search?: string, context?: CommonModels.EmployeeRoleContext }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.labels(search, context), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseLabels()); - return EmployeeRolesApi.labels(search, context) }, - ...options, - }); -}; - -/** - * Query `useFind` - * @summary Get Employee Role Definition - * @permission Requires `canUseFind` ability - * @param { string } object.roleId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFind = ({ roleId }: { roleId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.find(roleId), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUseFind()); - return EmployeeRolesApi.find(roleId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Employee Role Definition - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.roleId Path parameter - * @param { EmployeeRolesModels.EmployeeRoleUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, data }) => { - checkAcl(EmployeeRolesAcl.canUseUpdate()); - return EmployeeRolesApi.update(roleId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { roleId } = variables; - const updateKeys = [keys.find(roleId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteEmployeesRolesByRoleId` - * @summary Delete Employee Role Definition - * @permission Requires `canUseDeleteEmployeesRolesByRoleId` ability - * @param { string } mutation.roleId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteEmployeesRolesByRoleId = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId }) => { - checkAcl(EmployeeRolesAcl.canUseDeleteEmployeesRolesByRoleId()); - return EmployeeRolesApi.deleteEmployeesRolesByRoleId(roleId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginatePermissions` - * @summary Get All Employee Role Definition Permissions - * - convenience endpoint to expand the permissions of a role - * - only returns the enabled permissions - * @permission Requires `canUsePaginatePermissions` ability - * @param { string } object.roleId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginatePermissions = ({ roleId }: { roleId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginatePermissions(roleId), - queryFn: () => { - checkAcl(EmployeeRolesAcl.canUsePaginatePermissions()); - return EmployeeRolesApi.paginatePermissions(roleId) }, - ...options, - }); -}; - -/** - * Mutation `useTogglePermission` - * @summary Toggle Employee Role Definition Permission - * @permission Requires `canUseTogglePermission` ability - * @param { string } mutation.roleId Path parameter - * @param { string } mutation.permission Path parameter - * @param { EmployeeRolesModels.EmployeeRoleTogglePermissionRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useTogglePermission = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, permission, data }) => { - checkAcl(EmployeeRolesAcl.canUseTogglePermission()); - return EmployeeRolesApi.togglePermission(roleId, permission, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopy` - * @summary Copy Employee Role Definition - * @permission Requires `canUseCopy` ability - * @param { string } mutation.roleId Path parameter - * @param { EmployeeRolesModels.CopyEmployeeRoleDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ roleId, data }) => { - checkAcl(EmployeeRolesAcl.canUseCopy()); - return EmployeeRolesApi.copy(roleId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { roleId } = variables; - const updateKeys = [keys.find(roleId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/employeeSettings/employeeSettings.api.ts b/test/generated/next/employeeSettings/employeeSettings.api.ts deleted file mode 100644 index 2c14abc..0000000 --- a/test/generated/next/employeeSettings/employeeSettings.api.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { EmployeeSettingsModels } from "./employeeSettings.models"; - -export namespace EmployeeSettingsApi { -export const getAll = () => { - return AppRestClient.get( - { resSchema: EmployeeSettingsModels.EmployeeSettingsResponseDtoSchema }, - `/employees/settings`, - - ) -}; -export const update = (key: string, data: EmployeeSettingsModels.UpdateEmployeeSettingDto, ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/employees/settings/${key}`, - ZodExtended.parse(EmployeeSettingsModels.UpdateEmployeeSettingDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/employeeSettings/employeeSettings.models.ts b/test/generated/next/employeeSettings/employeeSettings.models.ts deleted file mode 100644 index fd4ad3a..0000000 --- a/test/generated/next/employeeSettings/employeeSettings.models.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { z } from "zod"; - -export namespace EmployeeSettingsModels { -/** - * EmployeeSettingsResponseDtoSchema - * @type { object } - * @property { object } settings Map of all settings for the employee - */ -export const EmployeeSettingsResponseDtoSchema = z.object({ settings: z.union([z.object({}).catchall(z.any()), z.array(z.object({}).catchall(z.any())), z.string(), z.array(z.string()), z.array(z.number())]) }); -export type EmployeeSettingsResponseDto = z.infer; - -/** - * UpdateEmployeeSettingDtoSchema - * @type { object } - * @property { object } value The value to store for the setting. If null, the setting will be deleted. - */ -export const UpdateEmployeeSettingDtoSchema = z.object({ value: z.union([z.object({}).catchall(z.any()), z.array(z.unknown()), z.string(), z.number(), z.boolean()]).nullable() }).partial(); -export type UpdateEmployeeSettingDto = z.infer; - -} diff --git a/test/generated/next/employeeSettings/employeeSettings.queries.ts b/test/generated/next/employeeSettings/employeeSettings.queries.ts deleted file mode 100644 index 7d4d3a7..0000000 --- a/test/generated/next/employeeSettings/employeeSettings.queries.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmployeeSettingsModels } from "./employeeSettings.models"; -import { EmployeeSettingsApi } from "./employeeSettings.api"; - -export namespace EmployeeSettingsQueries { -export const moduleName = QueryModule.EmployeeSettings; - -export const keys = { - all: [moduleName] as const, - getAll: () => [...keys.all, "/employees/settings", ] as const, -}; - -/** - * Query `useGetAll` - * @summary Get all employee settings - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetAll = (options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getAll(), - queryFn: EmployeeSettingsApi.getAll, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update employee setting - * @param { string } mutation.key Path parameter - * @param { EmployeeSettingsModels.UpdateEmployeeSettingDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ key, data }) => - EmployeeSettingsApi.update(key, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/employment/employment.acl.ts b/test/generated/next/employment/employment.acl.ts deleted file mode 100644 index bbcaf77..0000000 --- a/test/generated/next/employment/employment.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace EmploymentAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create new employment - * @param { string } object.officeId officeId from mutation data - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List employments - * @param { string } object.officeId officeId from filter query parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId?: string, } -) => [ - "Read", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Read", "Employment" | ForcedSubject<"Employment"> & { officeId?: string, }>; - -/** - * Use for `useListRoles` query ability. For global ability, omit the object parameter. - * @description List employment roles - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoles` query - */ -export const canUseListRoles = ( - object?: { officeId: string, } -) => [ - "ListRoles", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"ListRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useUpdateRoles` mutation ability. For global ability, omit the object parameter. - * @description Update employment roles - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoles` mutation - */ -export const canUseUpdateRoles = ( - object?: { officeId: string, } -) => [ - "UpdateRoles", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"UpdateRoles", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Create", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Archive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive employment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("Employment", object) : "Employment" -] as AbilityTuple<"Unarchive", "Employment" | ForcedSubject<"Employment"> & { officeId: string, }>; - -} diff --git a/test/generated/next/employment/employment.api.ts b/test/generated/next/employment/employment.api.ts deleted file mode 100644 index f50e03e..0000000 --- a/test/generated/next/employment/employment.api.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; -import { EmploymentModels } from "./employment.models"; - -export namespace EmploymentApi { -export const create = (data: EmploymentModels.EmploymentCreateRequest, ) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/employees/employments`, - ZodExtended.parse(EmploymentModels.EmploymentCreateRequestSchema, data), - - ) -}; -export const list = (limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: EmploymentModels.EmploymentListResponseSchema }, - `/employees/employments`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(EmploymentModels.EmploymentListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - populate: ZodExtended.parse(EmploymentModels.EmploymentListPopulateParamSchema.optional(), populate, { type: "query", name: "populate" }), - filter: ZodExtended.parse(EmploymentModels.EmploymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listRoles = (officeId: string, employmentId: string, ) => { - return AppRestClient.get( - { resSchema: EmploymentModels.EmploymentListRolesResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/roles`, - - ) -}; -export const updateRoles = (officeId: string, employmentId: string, data: EmploymentModels.EmploymentRoleMembershipsUpdateRequest, ) => { - return AppRestClient.put( - { resSchema: EmploymentModels.EmploymentUpdateRolesResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/roles`, - ZodExtended.parse(EmploymentModels.EmploymentRoleMembershipsUpdateRequestSchema, data), - - ) -}; -export const update = (officeId: string, employmentId: string, data: EmploymentModels.UpdateEmploymentRequestDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}`, - ZodExtended.parse(EmploymentModels.UpdateEmploymentRequestDtoSchema, data), - - ) -}; -export const archive = (officeId: string, employmentId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/archive`, - - ) -}; -export const unarchive = (officeId: string, employmentId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.EmploymentResponseSchema }, - `/offices/${officeId}/employments/${employmentId}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/employment/employment.configs.ts b/test/generated/next/employment/employment.configs.ts deleted file mode 100644 index b8525a4..0000000 --- a/test/generated/next/employment/employment.configs.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { EmploymentModels } from "./employment.models"; -import { EmploymentQueries } from "./employment.queries"; -import { EmploymentAcl } from "./employment.acl"; - -export namespace EmploymentConfigs { -export const employmentsConfig = { - meta: { - title: "Employments", - }, - readAll: { - acl: EmploymentAcl.canUseList, - schema: CommonModels.EmploymentResponseSchema, - paginated: EmploymentQueries.useList, - infinite: EmploymentQueries.useListInfinite, - filters: { - schema: EmploymentModels.EmploymentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: EmploymentModels.EmploymentFilterDtoSchema, - options: { - inputs: { - officeId: true, - employeeId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.EmploymentResponseSchema, - options: { - columns: { - id: true, - officeId: true, - office: true, - employeeId: true, - employee: true, - archived: true, - costCenter: true, - roles: true, - }, - sortable: EmploymentModels.EmploymentListOrderParamEnumSchema, - }, -}), - }, - create: { - acl: EmploymentAcl.canUseCreate, - schema: EmploymentModels.EmploymentCreateRequestSchema, - mutation: EmploymentQueries.useCreate, - inputDefs: dynamicInputs({ - schema: EmploymentModels.EmploymentCreateRequestSchema, - options: { - inputs: { - officeId: true, - employeeId: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/next/employment/employment.models.ts b/test/generated/next/employment/employment.models.ts deleted file mode 100644 index 151a915..0000000 --- a/test/generated/next/employment/employment.models.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace EmploymentModels { -/** - * EmploymentCreateRequestSchema - * @type { object } - * @property { string } officeId - * @property { string } employeeId - */ -export const EmploymentCreateRequestSchema = z.object({ officeId: z.string(), employeeId: z.string() }); -export type EmploymentCreateRequest = z.infer; - -/** - * EmploymentFilterDtoSchema - * @type { object } - * @property { string } officeId Office IDs - * @property { string } employeeId Employee IDs - */ -export const EmploymentFilterDtoSchema = z.object({ officeId: z.string().nullable(), employeeId: z.string().nullable() }).partial(); -export type EmploymentFilterDto = z.infer; - -/** - * EmploymentRoleMemberResponseSchema - * @type { object } - * @property { string } roleId - * @property { string } name Name of the role - * @property { string } color Color associated with the role - * @property { string } description Description of the role - * @property { string[] } permissions Permissions associated with the role - */ -export const EmploymentRoleMemberResponseSchema = z.object({ roleId: z.string(), name: z.string(), color: z.string().nullish(), description: z.string().nullish(), permissions: z.array(z.string()) }); -export type EmploymentRoleMemberResponse = z.infer; - -/** - * EmploymentRoleMembershipsUpdateRequestSchema - * @type { object } - * @property { string[] } roleIds Array of role IDs - */ -export const EmploymentRoleMembershipsUpdateRequestSchema = z.object({ roleIds: z.array(z.string()) }); -export type EmploymentRoleMembershipsUpdateRequest = z.infer; - -/** - * UpdateEmploymentRequestDtoSchema - * @type { object } - * @property { string } costCenter - * @property { string[] } roleIds - */ -export const UpdateEmploymentRequestDtoSchema = z.object({ costCenter: z.string().nullable(), roleIds: z.array(z.string()).nullable() }).partial(); -export type UpdateEmploymentRequestDto = z.infer; - -/** - * EmploymentListOrderParamEnumSchema - * @type { enum } - */ -export const EmploymentListOrderParamEnumSchema = z.enum(["officeId", "createdAt"]); -export type EmploymentListOrderParamEnum = z.infer; -export const EmploymentListOrderParamEnum = EmploymentListOrderParamEnumSchema.enum; - -/** - * EmploymentPaginationPopulateFieldsSchema - * @type { enum } - */ -export const EmploymentPaginationPopulateFieldsSchema = z.enum(["office", "employee"]); -export type EmploymentPaginationPopulateFields = z.infer; -export const EmploymentPaginationPopulateFields = EmploymentPaginationPopulateFieldsSchema.enum; - -/** - * EmploymentListPopulateParamSchema - * @type { array } - */ -export const EmploymentListPopulateParamSchema = z.array(EmploymentPaginationPopulateFieldsSchema).nullish(); -export type EmploymentListPopulateParam = z.infer; - -/** - * EmploymentListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.EmploymentResponse[] } items - */ -export const EmploymentListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.EmploymentResponseSchema).nullable() }).partial().shape }); -export type EmploymentListResponse = z.infer; - -/** - * EmploymentListRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmploymentRoleMemberResponse[] } items - */ -export const EmploymentListRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).nullable() }).partial().shape }); -export type EmploymentListRolesResponse = z.infer; - -/** - * EmploymentUpdateRolesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { EmploymentRoleMemberResponse[] } items - */ -export const EmploymentUpdateRolesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(EmploymentRoleMemberResponseSchema).nullable() }).partial().shape }); -export type EmploymentUpdateRolesResponse = z.infer; - -} diff --git a/test/generated/next/employment/employment.queries.ts b/test/generated/next/employment/employment.queries.ts deleted file mode 100644 index bc84e99..0000000 --- a/test/generated/next/employment/employment.queries.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { EmploymentAcl } from "./employment.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { EmploymentModels } from "./employment.models"; -import { EmploymentApi } from "./employment.api"; - -export namespace EmploymentQueries { -export const moduleName = QueryModule.Employment; - -export const keys = { - all: [moduleName] as const, - list: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/employees/employments", limit, order, populate, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string) => [...keys.all, "/employees/employments", "infinite", limit, order, populate, filter, cursor] as const, - listRoles: (officeId: string, employmentId: string) => [...keys.all, "/offices/:officeId/employments/:employmentId/roles", officeId, employmentId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create new employment - * @permission Requires `canUseCreate` ability - * @param { EmploymentModels.EmploymentCreateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(EmploymentAcl.canUseCreate()); - return EmploymentApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useList` - * @summary List Employments - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` - * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter - * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, populate, filter, page, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, populate, filter, page, cursor), - queryFn: () => { - checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List Employments - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): officeId, createdAt. Example: `officeId` - * @param { EmploymentModels.EmploymentListPopulateParam } object.populate Query parameter - * @param { EmploymentModels.EmploymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, populate, filter, cursor }: { limit: number, order?: string, populate?: EmploymentModels.EmploymentListPopulateParam, filter?: EmploymentModels.EmploymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, populate, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(EmploymentAcl.canUseList()); - return EmploymentApi.list(limit, order, populate, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListRoles` - * @summary List Employments Roles - * @permission Requires `canUseListRoles` ability - * @param { string } object.officeId Path parameter - * @param { string } object.employmentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoles = ({ officeId, employmentId }: { officeId: string, employmentId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoles(officeId, employmentId), - queryFn: () => { - checkAcl(EmploymentAcl.canUseListRoles({ officeId } )); - return EmploymentApi.listRoles(officeId, employmentId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateRoles` - * @summary Update Employment Roles - * @permission Requires `canUseUpdateRoles` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { EmploymentModels.EmploymentRoleMembershipsUpdateRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoles = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId, data }) => { - checkAcl(EmploymentAcl.canUseUpdateRoles({ officeId } )); - return EmploymentApi.updateRoles(officeId, employmentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { EmploymentModels.UpdateEmploymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId, data }) => { - checkAcl(EmploymentAcl.canUseUpdate({ officeId } )); - return EmploymentApi.update(officeId, employmentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Employment - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId }) => { - checkAcl(EmploymentAcl.canUseArchive({ officeId } )); - return EmploymentApi.archive(officeId, employmentId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Un-archive Employment - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.employmentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, employmentId }) => { - checkAcl(EmploymentAcl.canUseUnarchive({ officeId } )); - return EmploymentApi.unarchive(officeId, employmentId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/factoringExport/factoringExport.acl.ts b/test/generated/next/factoringExport/factoringExport.acl.ts deleted file mode 100644 index cc07635..0000000 --- a/test/generated/next/factoringExport/factoringExport.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace FactoringExportAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create factoring export - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Create", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -/** - * Use for `useGetBatch` query ability. For global ability, omit the object parameter. - * @description Read factoring export - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBatch` query - */ -export const canUseGetBatch = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -} diff --git a/test/generated/next/factoringExport/factoringExport.api.ts b/test/generated/next/factoringExport/factoringExport.api.ts deleted file mode 100644 index 7ade703..0000000 --- a/test/generated/next/factoringExport/factoringExport.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { FactoringExportModels } from "./factoringExport.models"; - -export namespace FactoringExportApi { -export const create = (officeId: string, data: FactoringExportModels.CreateFactoringExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-exports`, - ZodExtended.parse(FactoringExportModels.CreateFactoringExportRequestDtoSchema, data), - - ) -}; -export const getBatch = (batchId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: FactoringExportModels.FactoringExportBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-exports/${batchId}`, - - ) -}; -} diff --git a/test/generated/next/factoringExport/factoringExport.models.ts b/test/generated/next/factoringExport/factoringExport.models.ts deleted file mode 100644 index d2b90ac..0000000 --- a/test/generated/next/factoringExport/factoringExport.models.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { z } from "zod"; - -export namespace FactoringExportModels { -/** - * FactoringExportBatchStatusEnumSchema - * @type { enum } - */ -export const FactoringExportBatchStatusEnumSchema = z.enum(["Initializing", "Preparing", "Exported", "Failed"]); -export type FactoringExportBatchStatusEnum = z.infer; -export const FactoringExportBatchStatusEnum = FactoringExportBatchStatusEnumSchema.enum; - -/** - * FactoringExportBatchResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { FactoringExportBatchStatusEnum } status - * @property { number } totalInvoices - * @property { number } totalAmount - * @property { string } currencyNotation - * @property { string } jobId - * @property { string } eurFileUrl - * @property { string } usdFileUrl - * @property { string } createdById - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } exportedAt - */ -export const FactoringExportBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringExportBatchStatusEnumSchema, totalInvoices: z.number(), totalAmount: z.number(), currencyNotation: z.string(), jobId: z.string().nullish(), eurFileUrl: z.string().nullish(), usdFileUrl: z.string().nullish(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), exportedAt: z.iso.datetime({ offset: true }).nullish() }); -export type FactoringExportBatchResponseDto = z.infer; - -/** - * CreateFactoringExportRequestDtoSchema - * @type { object } - * @property { string } invoiceDateFrom Invoice date from - * @property { string } invoiceDateUntil Invoice date until - */ -export const CreateFactoringExportRequestDtoSchema = z.object({ invoiceDateFrom: z.iso.datetime({ offset: true }), invoiceDateUntil: z.iso.datetime({ offset: true }) }); -export type CreateFactoringExportRequestDto = z.infer; - -} diff --git a/test/generated/next/factoringExport/factoringExport.queries.ts b/test/generated/next/factoringExport/factoringExport.queries.ts deleted file mode 100644 index f73fe09..0000000 --- a/test/generated/next/factoringExport/factoringExport.queries.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { FactoringExportAcl } from "./factoringExport.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FactoringExportModels } from "./factoringExport.models"; -import { FactoringExportApi } from "./factoringExport.api"; - -export namespace FactoringExportQueries { -export const moduleName = QueryModule.FactoringExport; - -export const keys = { - all: [moduleName] as const, - getBatch: (batchId: string, officeId: string) => [...keys.all, "/offices/:officeId/factoring-exports/:batchId", batchId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Generate factoring export files for Raiffeisen Factor Bank - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { FactoringExportModels.CreateFactoringExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(FactoringExportAcl.canUseCreate({ officeId } )); - return FactoringExportApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetBatch` - * @summary Get factoring export batch status - * @permission Requires `canUseGetBatch` ability - * @param { string } object.batchId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBatch = ({ batchId, officeId }: { batchId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBatch(batchId, officeId), - queryFn: () => { - checkAcl(FactoringExportAcl.canUseGetBatch({ officeId } )); - return FactoringExportApi.getBatch(batchId, officeId) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/factoringMerge/factoringMerge.acl.ts b/test/generated/next/factoringMerge/factoringMerge.acl.ts deleted file mode 100644 index 208ed2f..0000000 --- a/test/generated/next/factoringMerge/factoringMerge.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace FactoringMergeAcl { -/** - * Use for `usePrepareUpload` mutation ability. For global ability, omit the object parameter. - * @description Prepare factoring merge upload - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareUpload` mutation - */ -export const canUsePrepareUpload = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -/** - * Use for `useProcessMerge` mutation ability. For global ability, omit the object parameter. - * @description Process factoring merge - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useProcessMerge` mutation - */ -export const canUseProcessMerge = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Update", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -/** - * Use for `useGetMergeBatch` query ability. For global ability, omit the object parameter. - * @description Read merge batch - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMergeBatch` query - */ -export const canUseGetMergeBatch = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("FactoringExport", object) : "FactoringExport" -] as AbilityTuple<"Read", "FactoringExport" | ForcedSubject<"FactoringExport"> & { officeId: string, }>; - -} diff --git a/test/generated/next/factoringMerge/factoringMerge.api.ts b/test/generated/next/factoringMerge/factoringMerge.api.ts deleted file mode 100644 index 1a42dec..0000000 --- a/test/generated/next/factoringMerge/factoringMerge.api.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { FactoringMergeModels } from "./factoringMerge.models"; - -export namespace FactoringMergeApi { -export const prepareUpload = (officeId: string, data: FactoringMergeModels.PrepareFactoringMergeRequestDto, ) => { - return AppRestClient.post( - { resSchema: FactoringMergeModels.FactoringMergeUploadInstructionsResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/prepare-upload`, - ZodExtended.parse(FactoringMergeModels.PrepareFactoringMergeRequestDtoSchema, data), - - ) -}; -export const processMerge = (officeId: string, batchId: string, ) => { - return AppRestClient.post( - { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/${batchId}/process`, - - ) -}; -export const getMergeBatch = (officeId: string, batchId: string, ) => { - return AppRestClient.get( - { resSchema: FactoringMergeModels.FactoringMergeBatchResponseDtoSchema }, - `/offices/${officeId}/factoring-merge/${batchId}`, - - ) -}; -} diff --git a/test/generated/next/factoringMerge/factoringMerge.models.ts b/test/generated/next/factoringMerge/factoringMerge.models.ts deleted file mode 100644 index 9d720a4..0000000 --- a/test/generated/next/factoringMerge/factoringMerge.models.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { z } from "zod"; - -export namespace FactoringMergeModels { -/** - * FileMetadataDtoSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType File MIME type - * @property { number } fileSize File size in bytes. Minimum: `1` - */ -export const FileMetadataDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number().gte(1) }); -export type FileMetadataDto = z.infer; - -/** - * PrepareFactoringMergeRequestDtoSchema - * @type { object } - * @property { FileMetadataDto } eurDebtorFile EUR debtor file metadata - * @property { FileMetadataDto } eurOperationsFile EUR operations file metadata - * @property { FileMetadataDto } eurExistingFactoringFile EUR existing factoring file metadata (optional) - * @property { FileMetadataDto } usdDebtorFile USD debtor file metadata - * @property { FileMetadataDto } usdOperationsFile USD operations file metadata - * @property { FileMetadataDto } usdExistingFactoringFile USD existing factoring file metadata (optional) - */ -export const PrepareFactoringMergeRequestDtoSchema = z.object({ eurDebtorFile: FileMetadataDtoSchema, eurOperationsFile: FileMetadataDtoSchema, eurExistingFactoringFile: FileMetadataDtoSchema.nullish(), usdDebtorFile: FileMetadataDtoSchema, usdOperationsFile: FileMetadataDtoSchema, usdExistingFactoringFile: FileMetadataDtoSchema.nullish() }); -export type PrepareFactoringMergeRequestDto = z.infer; - -/** - * MediaUploadInstructionsDtoSchema - * @type { object } - * @property { string } id - * @property { string } method - * @property { string } url - */ -export const MediaUploadInstructionsDtoSchema = z.object({ id: z.string(), method: z.string(), url: z.string() }); -export type MediaUploadInstructionsDto = z.infer; - -/** - * FactoringMergeUploadInstructionsResponseDtoSchema - * @type { object } - * @property { string } batchId - * @property { MediaUploadInstructionsDto } eurDebtorFile - * @property { MediaUploadInstructionsDto } eurOperationsFile - * @property { MediaUploadInstructionsDto } eurExistingFactoringFile - * @property { MediaUploadInstructionsDto } usdDebtorFile - * @property { MediaUploadInstructionsDto } usdOperationsFile - * @property { MediaUploadInstructionsDto } usdExistingFactoringFile - */ -export const FactoringMergeUploadInstructionsResponseDtoSchema = z.object({ batchId: z.string(), eurDebtorFile: MediaUploadInstructionsDtoSchema, eurOperationsFile: MediaUploadInstructionsDtoSchema, eurExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish(), usdDebtorFile: MediaUploadInstructionsDtoSchema, usdOperationsFile: MediaUploadInstructionsDtoSchema, usdExistingFactoringFile: MediaUploadInstructionsDtoSchema.nullish() }); -export type FactoringMergeUploadInstructionsResponseDto = z.infer; - -/** - * FactoringMergeBatchStatusEnumSchema - * @type { enum } - */ -export const FactoringMergeBatchStatusEnumSchema = z.enum(["Initializing", "Processing", "Completed", "Failed"]); -export type FactoringMergeBatchStatusEnum = z.infer; -export const FactoringMergeBatchStatusEnum = FactoringMergeBatchStatusEnumSchema.enum; - -/** - * FactoringMergeBatchResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { FactoringMergeBatchStatusEnum } status - * @property { string } eurDebtorFileMediaId - * @property { string } eurOperationsFileMediaId - * @property { string } eurExistingFactoringFileMediaId - * @property { string } usdDebtorFileMediaId - * @property { string } usdOperationsFileMediaId - * @property { string } usdExistingFactoringFileMediaId - * @property { string } eurResultFileMediaId - * @property { string } eurResultFileUrl - * @property { string } usdResultFileMediaId - * @property { string } usdResultFileUrl - * @property { string } jobId - * @property { string } errorMessage - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } completedAt - */ -export const FactoringMergeBatchResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), status: FactoringMergeBatchStatusEnumSchema, eurDebtorFileMediaId: z.string(), eurOperationsFileMediaId: z.string(), eurExistingFactoringFileMediaId: z.string().nullish(), usdDebtorFileMediaId: z.string(), usdOperationsFileMediaId: z.string(), usdExistingFactoringFileMediaId: z.string().nullish(), eurResultFileMediaId: z.string().nullish(), eurResultFileUrl: z.string().nullish(), usdResultFileMediaId: z.string().nullish(), usdResultFileUrl: z.string().nullish(), jobId: z.string().nullish(), errorMessage: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), completedAt: z.iso.datetime({ offset: true }).nullish() }); -export type FactoringMergeBatchResponseDto = z.infer; - -} diff --git a/test/generated/next/factoringMerge/factoringMerge.queries.ts b/test/generated/next/factoringMerge/factoringMerge.queries.ts deleted file mode 100644 index 9e1e382..0000000 --- a/test/generated/next/factoringMerge/factoringMerge.queries.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { FactoringMergeAcl } from "./factoringMerge.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FactoringMergeModels } from "./factoringMerge.models"; -import { FactoringMergeApi } from "./factoringMerge.api"; - -export namespace FactoringMergeQueries { -export const moduleName = QueryModule.FactoringMerge; - -export const keys = { - all: [moduleName] as const, - getMergeBatch: (officeId: string, batchId: string) => [...keys.all, "/offices/:officeId/factoring-merge/:batchId", officeId, batchId] as const, -}; - -/** - * Mutation `usePrepareUpload` - * @summary Prepare upload instructions for MOVE files merge - * @permission Requires `canUsePrepareUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { FactoringMergeModels.PrepareFactoringMergeRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const usePrepareUpload = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(FactoringMergeAcl.canUsePrepareUpload({ officeId } )); - return FactoringMergeApi.prepareUpload(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useProcessMerge` - * @summary Start processing the merge batch - * @permission Requires `canUseProcessMerge` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.batchId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useProcessMerge = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, batchId }) => { - checkAcl(FactoringMergeAcl.canUseProcessMerge({ officeId } )); - return FactoringMergeApi.processMerge(officeId, batchId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, batchId } = variables; - const updateKeys = [keys.getMergeBatch(officeId, batchId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetMergeBatch` - * @summary Get merge batch status - * @permission Requires `canUseGetMergeBatch` ability - * @param { string } object.officeId Path parameter - * @param { string } object.batchId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, default] - */ -export const useGetMergeBatch = ({ officeId, batchId }: { officeId: string, batchId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getMergeBatch(officeId, batchId), - queryFn: () => { - checkAcl(FactoringMergeAcl.canUseGetMergeBatch({ officeId } )); - return FactoringMergeApi.getMergeBatch(officeId, batchId) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/files/files.api.ts b/test/generated/next/files/files.api.ts deleted file mode 100644 index 62289b9..0000000 --- a/test/generated/next/files/files.api.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { FilesModels } from "./files.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace FilesApi { -export const createUpload = (officeId: string, folderId: string, data: FilesModels.CreateFileRequestDTO, ) => { - return AppRestClient.post( - { resSchema: FilesModels.FileUploadResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}/files`, - ZodExtended.parse(FilesModels.CreateFileRequestDTOSchema, data), - - ) -}; -export const getEml = (officeId: string, data: FilesModels.GetFilesEmlRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/files/eml`, - ZodExtended.parse(FilesModels.GetFilesEmlRequestDTOSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const rename = (officeId: string, fileId: string, data: FilesModels.RenameFileRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.FileResponseDTOSchema }, - `/offices/${officeId}/files/${fileId}`, - ZodExtended.parse(FilesModels.RenameFileRequestDTOSchema, data), - - ) -}; -export const move = (officeId: string, data: FilesModels.MoveFilesRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/move`, - ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - - ) -}; -export const copy = (officeId: string, data: FilesModels.MoveFilesRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/copy`, - ZodExtended.parse(FilesModels.MoveFilesRequestDTOSchema, data), - - ) -}; -export const archive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/archive`, - ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - - ) -}; -export const unarchive = (officeId: string, data: FilesModels.SetFilesArchivedRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/files/unarchive`, - ZodExtended.parse(FilesModels.SetFilesArchivedRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/files/files.models.ts b/test/generated/next/files/files.models.ts deleted file mode 100644 index 2ac873f..0000000 --- a/test/generated/next/files/files.models.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { z } from "zod"; - -export namespace FilesModels { -/** - * CreateFileRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } mimeType - * @property { number } fileSize Minimum: `0` - */ -export const CreateFileRequestDTOSchema = z.object({ name: z.string(), mimeType: z.string(), fileSize: z.number().gte(0) }); -export type CreateFileRequestDTO = z.infer; - -/** - * FileUploadResponseDTOSchema - * @type { object } - * @property { string } fileId - * @property { string } method - * @property { string } url - */ -export const FileUploadResponseDTOSchema = z.object({ fileId: z.string(), method: z.string(), url: z.string() }); -export type FileUploadResponseDTO = z.infer; - -/** - * GetFilesEmlRequestDTOSchema - * @type { object } - * @property { string[] } ids Min Items: `1` - */ -export const GetFilesEmlRequestDTOSchema = z.object({ ids: z.array(z.string()).min(1) }); -export type GetFilesEmlRequestDTO = z.infer; - -/** - * RenameFileRequestDTOSchema - * @type { object } - * @property { string } name - */ -export const RenameFileRequestDTOSchema = z.object({ name: z.string() }); -export type RenameFileRequestDTO = z.infer; - -/** - * MoveFilesRequestDTOSchema - * @type { object } - * @property { string[] } fileIds Min Items: `1` - * @property { string } targetFolderId - */ -export const MoveFilesRequestDTOSchema = z.object({ fileIds: z.array(z.string()).min(1), targetFolderId: z.string() }); -export type MoveFilesRequestDTO = z.infer; - -/** - * SetFilesArchivedRequestDTOSchema - * @type { object } - * @property { string[] } ids Min Items: `1` - */ -export const SetFilesArchivedRequestDTOSchema = z.object({ ids: z.array(z.string()).min(1) }); -export type SetFilesArchivedRequestDTO = z.infer; - -} diff --git a/test/generated/next/files/files.queries.ts b/test/generated/next/files/files.queries.ts deleted file mode 100644 index 6e53863..0000000 --- a/test/generated/next/files/files.queries.ts +++ /dev/null @@ -1,210 +0,0 @@ -import axios, { } from "axios"; -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FilesModels } from "./files.models"; -import { FilesApi } from "./files.api"; - -export namespace FilesQueries { -export const moduleName = QueryModule.Files; - - - -/** - * Mutation `useCreateUpload` - * @summary Create file upload instructions - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { FilesModels.CreateFileRequestDTO } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, folderId, data, file, abortController, onUploadProgress }) => { - const uploadInstructions = await FilesApi.createUpload(officeId, folderId, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGetEml` - recommended when file should not be cached - * @summary Get files as EML file with attachments - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.GetFilesEmlRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.getEml(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRename` - * @summary Rename file - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.fileId Path parameter - * @param { FilesModels.RenameFileRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useRename = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, fileId, data }) => - FilesApi.rename(officeId, fileId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMove` - * @summary Move files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useMove = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.move(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopy` - * @summary Copy files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.MoveFilesRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useCopy = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.copy(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.archive(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive files - * @param { string } mutation.officeId Path parameter - * @param { FilesModels.SetFilesArchivedRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FilesApi.unarchive(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/folders/folders.api.ts b/test/generated/next/folders/folders.api.ts deleted file mode 100644 index b4cd844..0000000 --- a/test/generated/next/folders/folders.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { FoldersModels } from "./folders.models"; - -export namespace FoldersApi { -export const getTree = (officeId: string, folderId: string, ) => { - return AppRestClient.get( - { resSchema: FoldersModels.FolderTreeResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}/tree`, - - ) -}; -export const getContent = (officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}`, - { - params: { - order: ZodExtended.parse(FoldersModels.GetContentOrderParamSchema.optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(FoldersModels.FolderContentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const rename = (officeId: string, folderId: string, data: FoldersModels.RenameFolderRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders/${folderId}`, - ZodExtended.parse(FoldersModels.RenameFolderRequestDTOSchema, data), - - ) -}; -export const deleteFolder = (officeId: string, folderId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/folders/${folderId}`, - - ) -}; -export const create = (officeId: string, data: FoldersModels.CreateFolderRequestDTO, ) => { - return AppRestClient.post( - { resSchema: FoldersModels.FolderResponseDTOSchema }, - `/offices/${officeId}/folders`, - ZodExtended.parse(FoldersModels.CreateFolderRequestDTOSchema, data), - - ) -}; -export const move = (officeId: string, data: FoldersModels.MoveFoldersRequestDTO, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/folders/move`, - ZodExtended.parse(FoldersModels.MoveFoldersRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/folders/folders.models.ts b/test/generated/next/folders/folders.models.ts deleted file mode 100644 index 5ca5dda..0000000 --- a/test/generated/next/folders/folders.models.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace FoldersModels { -/** - * TargetEntityNameEnumSchema - * @type { enum } - */ -export const TargetEntityNameEnumSchema = z.enum(["invoice", "quote"]); -export type TargetEntityNameEnum = z.infer; -export const TargetEntityNameEnum = TargetEntityNameEnumSchema.enum; - -/** - * FolderSymlinkResponseDTOSchema - * @type { object } - * @property { string } targetEntityName - * @property { string } targetEntityId - */ -export const FolderSymlinkResponseDTOSchema = z.object({ targetEntityName: TargetEntityNameEnumSchema, targetEntityId: z.string() }); -export type FolderSymlinkResponseDTO = z.infer; - -/** - * FolderTreeResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } isSystem - * @property { boolean } isSymlink - * @property { FolderSymlinkResponseDTO } symlink - * @property { FolderTreeResponseDTO[] } folders - */ -export const FolderTreeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), get folders() { return z.array(FolderTreeResponseDTOSchema) } }); -export type FolderTreeResponseDTO = z.infer; - -/** - * FolderResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { boolean } archived - * @property { boolean } isSystem - * @property { boolean } isSymlink - * @property { FolderSymlinkResponseDTO } symlink - * @property { string } createdAt - * @property { string } updatedAt - * @property { CommonModels.FolderEmployeeDTO } createdBy - * @property { CommonModels.FolderEmployeeDTO } updatedBy - * @property { CommonModels.FileResponseDTO[] } files - * @property { FolderResponseDTO[] } folders - */ -export const FolderResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), isSystem: z.boolean(), isSymlink: z.boolean(), symlink: FolderSymlinkResponseDTOSchema.nullable(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: CommonModels.FolderEmployeeDTOSchema, updatedBy: CommonModels.FolderEmployeeDTOSchema, files: z.array(CommonModels.FileResponseDTOSchema), get folders() { return z.array(FolderResponseDTOSchema) } }); -export type FolderResponseDTO = z.infer; - -/** - * FolderContentFilterDtoSchema - * @type { object } - * @property { boolean } archived When omitted, both archived and unarchived files are returned. - */ -export const FolderContentFilterDtoSchema = z.object({ archived: z.boolean().nullable() }).partial(); -export type FolderContentFilterDto = z.infer; - -/** - * CreateFolderRequestDTOSchema - * @type { object } - * @property { string } parentFolderId - * @property { string } name - */ -export const CreateFolderRequestDTOSchema = z.object({ parentFolderId: z.string(), name: z.string() }); -export type CreateFolderRequestDTO = z.infer; - -/** - * RenameFolderRequestDTOSchema - * @type { object } - * @property { string } name - */ -export const RenameFolderRequestDTOSchema = z.object({ name: z.string() }); -export type RenameFolderRequestDTO = z.infer; - -/** - * MoveFoldersRequestDTOSchema - * @type { object } - * @property { string[] } folderIds Min Items: `1` - * @property { string } targetFolderId - */ -export const MoveFoldersRequestDTOSchema = z.object({ folderIds: z.array(z.string()).min(1), targetFolderId: z.string() }); -export type MoveFoldersRequestDTO = z.infer; - -/** - * GetContentOrderParamSchema - * @type { array } - * @description Example: `name` - */ -export const GetContentOrderParamSchema = z.array(z.string()).nullish(); -export type GetContentOrderParam = z.infer; - -} diff --git a/test/generated/next/folders/folders.queries.ts b/test/generated/next/folders/folders.queries.ts deleted file mode 100644 index 0174720..0000000 --- a/test/generated/next/folders/folders.queries.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { FoldersModels } from "./folders.models"; -import { FoldersApi } from "./folders.api"; - -export namespace FoldersQueries { -export const moduleName = QueryModule.Folders; - -export const keys = { - all: [moduleName] as const, - getTree: (officeId: string, folderId: string) => [...keys.all, "/offices/:officeId/folders/:folderId/tree", officeId, folderId] as const, - getContent: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", officeId, folderId, limit, order, filter, page, cursor] as const, - getContentInfinite: (officeId: string, folderId: string, limit?: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/folders/:folderId", "infinite", officeId, folderId, limit, order, filter, cursor] as const, -}; - -/** - * Query `useGetTree` - * @summary Get folder tree - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetTree = ({ officeId, folderId }: { officeId: string, folderId: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getTree(officeId, folderId), - queryFn: () => - FoldersApi.getTree(officeId, folderId), - ...options, - }); -}; - -/** - * Query `useGetContent` - * @summary Get folder content - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetContent = ({ officeId, folderId, limit, order, filter, page, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.getContent(officeId, folderId, limit, order, filter, page, cursor), - queryFn: () => - FoldersApi.getContent(officeId, folderId, limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `useGetContentInfinite - * @summary Get folder content - * @param { string } object.officeId Path parameter - * @param { string } object.folderId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { FoldersModels.GetContentOrderParam } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt. Example: `name` - * @param { FoldersModels.FolderContentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetContentInfinite = ({ officeId, folderId, limit, order, filter, cursor }: { officeId: string, folderId: string, limit: number, order?: FoldersModels.GetContentOrderParam, filter?: FoldersModels.FolderContentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.getContentInfinite(officeId, folderId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => - FoldersApi.getContent(officeId, folderId, limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useRename` - * @summary Rename folder - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { FoldersModels.RenameFolderRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useRename = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, folderId, data }) => - FoldersApi.rename(officeId, folderId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteFolder` - * @summary Delete folder - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.folderId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteFolder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, folderId }) => - FoldersApi.deleteFolder(officeId, folderId) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create folder - * @param { string } mutation.officeId Path parameter - * @param { FoldersModels.CreateFolderRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FoldersApi.create(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMove` - * @summary Move folders - * @param { string } mutation.officeId Path parameter - * @param { FoldersModels.MoveFoldersRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useMove = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => - FoldersApi.move(officeId, data) -, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/hsCodes/hsCodes.acl.ts b/test/generated/next/hsCodes/hsCodes.acl.ts deleted file mode 100644 index 3e48e9d..0000000 --- a/test/generated/next/hsCodes/hsCodes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace HsCodesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "HsCode" -] as AbilityTuple<"Read", "HsCode">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "HsCode" -] as AbilityTuple<"Create", "HsCode">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "HsCode" -] as AbilityTuple<"Read", "HsCode">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "HsCode" -] as AbilityTuple<"Read", "HsCode">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "HsCode" -] as AbilityTuple<"Update", "HsCode">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "HsCode" -] as AbilityTuple<"Archive", "HsCode">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "HsCode" -] as AbilityTuple<"Archive", "HsCode">; - -} diff --git a/test/generated/next/hsCodes/hsCodes.api.ts b/test/generated/next/hsCodes/hsCodes.api.ts deleted file mode 100644 index 59dece6..0000000 --- a/test/generated/next/hsCodes/hsCodes.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { HsCodesModels } from "./hsCodes.models"; - -export namespace HsCodesApi { -export const paginate = (limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: HsCodesModels.HsCodesPaginateResponseSchema }, - `/hs-codes`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(HsCodesModels.HsCodePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: HsCodesModels.CreateHsCodeRequestDTO, ) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes`, - ZodExtended.parse(HsCodesModels.CreateHsCodeRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: HsCodesModels.HsCodesPaginateLabelsResponseSchema }, - `/hs-codes/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(HsCodesModels.HsCodeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}`, - - ) -}; -export const update = (id: string, data: HsCodesModels.UpdateHsCodeRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}`, - ZodExtended.parse(HsCodesModels.UpdateHsCodeRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: HsCodesModels.HsCodeResponseDTOSchema }, - `/hs-codes/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/hsCodes/hsCodes.configs.ts b/test/generated/next/hsCodes/hsCodes.configs.ts deleted file mode 100644 index 5b005a1..0000000 --- a/test/generated/next/hsCodes/hsCodes.configs.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { HsCodesModels } from "./hsCodes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { HsCodesQueries } from "./hsCodes.queries"; -import { HsCodesAcl } from "./hsCodes.acl"; - -export namespace HsCodesConfigs { -export const hsCodesConfig = { - meta: { - title: "Hs Codes", - }, - readAll: { - acl: HsCodesAcl.canUsePaginate, - schema: HsCodesModels.HsCodeResponseDTOSchema, - paginated: HsCodesQueries.usePaginate, - infinite: HsCodesQueries.usePaginateInfinite, - filters: { - schema: HsCodesModels.HsCodePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: HsCodesModels.HsCodePaginationFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: HsCodesModels.HsCodeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - description: true, - customArea: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: HsCodesModels.HsCodesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: HsCodesAcl.canUseFindById, - schema: HsCodesModels.HsCodeResponseDTOSchema, - query: HsCodesQueries.useFindById, - }, - create: { - acl: HsCodesAcl.canUseCreate, - schema: HsCodesModels.CreateHsCodeRequestDTOSchema, - mutation: HsCodesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: HsCodesModels.CreateHsCodeRequestDTOSchema, - options: { - inputs: { - name: true, - description: true, - customArea: true, - }, - }, -}) - }, - update: { - acl: HsCodesAcl.canUseUpdate, - schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, - mutation: HsCodesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: HsCodesModels.UpdateHsCodeRequestDTOSchema, - options: { - inputs: { - name: true, - description: true, - customArea: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: HsCodesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: HsCodesQueries.usePaginateLabels, - infinite: HsCodesQueries.usePaginateLabelsInfinite, - filters: { - schema: HsCodesModels.HsCodeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: HsCodesModels.HsCodeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: HsCodesModels.HsCodesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/hsCodes/hsCodes.models.ts b/test/generated/next/hsCodes/hsCodes.models.ts deleted file mode 100644 index a2d7cf2..0000000 --- a/test/generated/next/hsCodes/hsCodes.models.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace HsCodesModels { -/** - * HsCodeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const HsCodeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type HsCodeEmployeeDTO = z.infer; - -/** - * HsCodeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the HS Code - * @property { string } name Name of the HS Code - * @property { string } description Description of the HS Code - * @property { string } customArea Custom area associated with the HS Code - * @property { boolean } archived Indicates if the HS Code is archived - * @property { string } createdById - * @property { HsCodeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { HsCodeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const HsCodeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), description: z.string(), customArea: z.string(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: HsCodeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: HsCodeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type HsCodeResponseDTO = z.infer; - -/** - * HsCodePaginationFilterDtoSchema - * @type { object } - * @property { boolean } archived Archived status - * @property { string } search - */ -export const HsCodePaginationFilterDtoSchema = z.object({ archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); -export type HsCodePaginationFilterDto = z.infer; - -/** - * HsCodeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const HsCodeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type HsCodeLabelFilterDto = z.infer; - -/** - * CreateHsCodeRequestDTOSchema - * @type { object } - * @property { string } name Unique name for the HS Code - * @property { string } description Description of the HS Code - * @property { string } customArea Custom area associated with the HS Code - */ -export const CreateHsCodeRequestDTOSchema = z.object({ name: z.string(), description: z.string(), customArea: z.string() }); -export type CreateHsCodeRequestDTO = z.infer; - -/** - * UpdateHsCodeRequestDTOSchema - * @type { object } - * @property { string } name Updated name of the HS Code. - * @property { string } description Updated description of the HS Code. - * @property { string } customArea Updated custom area associated with the HS Code. - */ -export const UpdateHsCodeRequestDTOSchema = z.object({ name: z.string().nullable(), description: z.string().nullable(), customArea: z.string().nullable() }).partial(); -export type UpdateHsCodeRequestDTO = z.infer; - -/** - * HsCodesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const HsCodesPaginateOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type HsCodesPaginateOrderParamEnum = z.infer; -export const HsCodesPaginateOrderParamEnum = HsCodesPaginateOrderParamEnumSchema.enum; - -/** - * HsCodesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { HsCodeResponseDTO[] } items - */ -export const HsCodesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(HsCodeResponseDTOSchema).nullable() }).partial().shape }); -export type HsCodesPaginateResponse = z.infer; - -/** - * HsCodesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const HsCodesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy", "name"]); -export type HsCodesPaginateLabelsOrderParamEnum = z.infer; -export const HsCodesPaginateLabelsOrderParamEnum = HsCodesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * HsCodesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const HsCodesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type HsCodesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/hsCodes/hsCodes.queries.ts b/test/generated/next/hsCodes/hsCodes.queries.ts deleted file mode 100644 index 5722f0d..0000000 --- a/test/generated/next/hsCodes/hsCodes.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { HsCodesAcl } from "./hsCodes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { HsCodesModels } from "./hsCodes.models"; -import { HsCodesApi } from "./hsCodes.api"; - -export namespace HsCodesQueries { -export const moduleName = QueryModule.HsCodes; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string) => [...keys.all, "/hs-codes", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string) => [...keys.all, "/hs-codes/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/hs-codes/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate HS Codes - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate HS Codes - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(HsCodesAcl.canUsePaginate()); - return HsCodesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new HS Code - * @permission Requires `canUseCreate` ability - * @param { HsCodesModels.CreateHsCodeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(HsCodesAcl.canUseCreate()); - return HsCodesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate HS codes with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate HS codes with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, createdAt, updatedAt, createdBy, updatedBy, name. Example: `matchCode` - * @param { HsCodesModels.HsCodeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: HsCodesModels.HsCodeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(HsCodesAcl.canUsePaginateLabels()); - return HsCodesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get HS Code Details by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(HsCodesAcl.canUseFindById()); - return HsCodesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update an existing HS Code - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { HsCodesModels.UpdateHsCodeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(HsCodesAcl.canUseUpdate()); - return HsCodesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive an HS Code - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(HsCodesAcl.canUseArchive()); - return HsCodesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive an HS Code - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(HsCodesAcl.canUseUnarchive()); - return HsCodesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/integrationChannels/integrationChannels.acl.ts b/test/generated/next/integrationChannels/integrationChannels.acl.ts deleted file mode 100644 index de4ba2a..0000000 --- a/test/generated/next/integrationChannels/integrationChannels.acl.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace IntegrationChannelsAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List integration channels - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Create", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Read integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Read", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive integration channel - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Archive", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useTestConnection` mutation ability. For global ability, omit the object parameter. - * @description Test integration channel connection - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTestConnection` mutation - */ -export const canUseTestConnection = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("IntegrationChannel", object) : "IntegrationChannel" -] as AbilityTuple<"Update", "IntegrationChannel" | ForcedSubject<"IntegrationChannel"> & { officeId: string, }>; - -/** - * Use for `useListMessages` query ability. For global ability, omit the object parameter. - * @description List integration channel messages - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListMessages` query - */ -export const canUseListMessages = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("IntegrationMessage", object) : "IntegrationMessage" -] as AbilityTuple<"Read", "IntegrationMessage" | ForcedSubject<"IntegrationMessage"> & { officeId: string, }>; - -} diff --git a/test/generated/next/integrationChannels/integrationChannels.api.ts b/test/generated/next/integrationChannels/integrationChannels.api.ts deleted file mode 100644 index 0835e70..0000000 --- a/test/generated/next/integrationChannels/integrationChannels.api.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; - -export namespace IntegrationChannelsApi { -export const list = (officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.IntegrationChannelsListResponseSchema }, - `/offices/${officeId}/integration-channels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationChannelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: IntegrationChannelsModels.CreateIntegrationChannelRequestDto, ) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels`, - ZodExtended.parse(IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, data), - - ) -}; -export const findById = (officeId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}`, - - ) -}; -export const update = (officeId: string, id: string, data: IntegrationChannelsModels.UpdateIntegrationChannelRequestDto, ) => { - return AppRestClient.patch( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}`, - ZodExtended.parse(IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, data), - - ) -}; -export const archive = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/archive`, - - ) -}; -export const unarchive = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/unarchive`, - - ) -}; -export const testConnection = (officeId: string, id: string, ) => { - return AppRestClient.post( - { resSchema: IntegrationChannelsModels.TestConnectionResponseDtoSchema }, - `/offices/${officeId}/integration-channels/${id}/test-connection`, - - ) -}; -export const listMessages = (officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: IntegrationChannelsModels.ListMessagesResponseSchema }, - `/offices/${officeId}/integration-channels/${id}/messages`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(IntegrationChannelsModels.ListMessagesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(IntegrationChannelsModels.IntegrationMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/next/integrationChannels/integrationChannels.configs.ts b/test/generated/next/integrationChannels/integrationChannels.configs.ts deleted file mode 100644 index 1b6f063..0000000 --- a/test/generated/next/integrationChannels/integrationChannels.configs.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; -import { IntegrationChannelsQueries } from "./integrationChannels.queries"; -import { IntegrationChannelsAcl } from "./integrationChannels.acl"; - -export namespace IntegrationChannelsConfigs { -export const integrationChannelsConfig = { - meta: { - title: "Integration Channels", - }, - readAll: { - acl: IntegrationChannelsAcl.canUseList, - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - paginated: IntegrationChannelsQueries.useList, - infinite: IntegrationChannelsQueries.useListInfinite, - filters: { - schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: IntegrationChannelsModels.IntegrationChannelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - options: { - columns: { - id: true, - officeId: true, - businessPartnerId: true, - businessPartner: true, - employeeId: true, - name: true, - archived: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - lastPolledAt: true, - createdAt: true, - createdById: true, - createdBy: true, - updatedAt: true, - updatedById: true, - updatedBy: true, - }, - sortable: IntegrationChannelsModels.IntegrationChannelsListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: IntegrationChannelsAcl.canUseFindById, - schema: IntegrationChannelsModels.IntegrationChannelResponseDtoSchema, - query: IntegrationChannelsQueries.useFindById, - }, - create: { - acl: IntegrationChannelsAcl.canUseCreate, - schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, - mutation: IntegrationChannelsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: IntegrationChannelsModels.CreateIntegrationChannelRequestDtoSchema, - options: { - inputs: { - businessPartnerId: true, - employeeId: true, - name: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - sftpPassword: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - }, - }, -}) - }, - update: { - acl: IntegrationChannelsAcl.canUseUpdate, - schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, - mutation: IntegrationChannelsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: IntegrationChannelsModels.UpdateIntegrationChannelRequestDtoSchema, - options: { - inputs: { - businessPartnerId: true, - employeeId: true, - name: true, - sftpHost: true, - sftpPort: true, - sftpUsername: true, - sftpPassword: true, - inboundPath: true, - outboundPath: true, - pollingFrequencyMinutes: true, - }, - }, -}) - }, -}; - -export const messagesConfig = { - meta: { - title: "Messages", - }, - readAll: { - acl: IntegrationChannelsAcl.canUseListMessages, - schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, - paginated: IntegrationChannelsQueries.useListMessages, - infinite: IntegrationChannelsQueries.useListMessagesInfinite, - filters: { - schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: IntegrationChannelsModels.IntegrationMessageFilterDtoSchema, - options: { - inputs: { - direction: true, - format: true, - status: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: IntegrationChannelsModels.IntegrationMessageResponseDtoSchema, - options: { - columns: { - id: true, - integrationChannelId: true, - positionId: true, - positionNumber: true, - direction: true, - format: true, - status: true, - rawContent: true, - fileName: true, - errorMessage: true, - processedAt: true, - sentAt: true, - createdAt: true, - }, - sortable: IntegrationChannelsModels.ListMessagesOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/integrationChannels/integrationChannels.models.ts b/test/generated/next/integrationChannels/integrationChannels.models.ts deleted file mode 100644 index 543e8a7..0000000 --- a/test/generated/next/integrationChannels/integrationChannels.models.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace IntegrationChannelsModels { -/** - * IntegrationChannelBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const IntegrationChannelBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type IntegrationChannelBusinessPartnerResponseDto = z.infer; - -/** - * IntegrationChannelEmployeeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const IntegrationChannelEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type IntegrationChannelEmployeeResponseDto = z.infer; - -/** - * IntegrationChannelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } businessPartnerId - * @property { IntegrationChannelBusinessPartnerResponseDto } businessPartner - * @property { string } employeeId - * @property { string } name - * @property { boolean } archived - * @property { string } sftpHost - * @property { number } sftpPort - * @property { string } sftpUsername - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes - * @property { string } lastPolledAt - * @property { string } createdAt - * @property { string } createdById - * @property { IntegrationChannelEmployeeResponseDto } createdBy - * @property { string } updatedAt - * @property { string } updatedById - * @property { IntegrationChannelEmployeeResponseDto } updatedBy - */ -export const IntegrationChannelResponseDtoSchema = z.object({ id: z.string(), officeId: z.string(), businessPartnerId: z.string(), businessPartner: IntegrationChannelBusinessPartnerResponseDtoSchema, employeeId: z.string(), name: z.string(), archived: z.boolean(), sftpHost: z.string(), sftpPort: z.number(), sftpUsername: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number(), lastPolledAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), createdById: z.string(), createdBy: IntegrationChannelEmployeeResponseDtoSchema, updatedAt: z.iso.datetime({ offset: true }), updatedById: z.string(), updatedBy: IntegrationChannelEmployeeResponseDtoSchema }); -export type IntegrationChannelResponseDto = z.infer; - -/** - * IntegrationMessageDirectionEnumSchema - * @type { enum } - */ -export const IntegrationMessageDirectionEnumSchema = z.enum(["Inbound", "Outbound"]); -export type IntegrationMessageDirectionEnum = z.infer; -export const IntegrationMessageDirectionEnum = IntegrationMessageDirectionEnumSchema.enum; - -/** - * IntegrationMessageFormatEnumSchema - * @type { enum } - */ -export const IntegrationMessageFormatEnumSchema = z.enum(["IFTMBF", "IFTMBC"]); -export type IntegrationMessageFormatEnum = z.infer; -export const IntegrationMessageFormatEnum = IntegrationMessageFormatEnumSchema.enum; - -/** - * IntegrationMessageStatusEnumSchema - * @type { enum } - */ -export const IntegrationMessageStatusEnumSchema = z.enum(["Received", "Processed", "Failed", "Sent"]); -export type IntegrationMessageStatusEnum = z.infer; -export const IntegrationMessageStatusEnum = IntegrationMessageStatusEnumSchema.enum; - -/** - * IntegrationMessageFilterDtoSchema - * @type { object } - * @property { IntegrationMessageDirectionEnum } direction - * @property { IntegrationMessageFormatEnum } format - * @property { IntegrationMessageStatusEnum } status - * @property { string } search - */ -export const IntegrationMessageFilterDtoSchema = z.object({ direction: IntegrationMessageDirectionEnumSchema.nullable(), format: IntegrationMessageFormatEnumSchema.nullable(), status: IntegrationMessageStatusEnumSchema.nullable(), search: z.string().nullable() }).partial(); -export type IntegrationMessageFilterDto = z.infer; - -/** - * IntegrationChannelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const IntegrationChannelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type IntegrationChannelFilterDto = z.infer; - -/** - * CreateIntegrationChannelRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } employeeId - * @property { string } name - * @property { string } sftpHost - * @property { number } sftpPort Minimum: `1`. Maximum: `65535` - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes Minimum: `1` - */ -export const CreateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string(), employeeId: z.string(), name: z.string(), sftpHost: z.string(), sftpPort: z.number().gte(1).lte(65535), sftpUsername: z.string(), sftpPassword: z.string(), inboundPath: z.string(), outboundPath: z.string(), pollingFrequencyMinutes: z.number().gte(1) }); -export type CreateIntegrationChannelRequestDto = z.infer; - -/** - * UpdateIntegrationChannelRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } employeeId - * @property { string } name - * @property { string } sftpHost - * @property { number } sftpPort Minimum: `1`. Maximum: `65535` - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } inboundPath - * @property { string } outboundPath - * @property { number } pollingFrequencyMinutes Minimum: `1` - */ -export const UpdateIntegrationChannelRequestDtoSchema = z.object({ businessPartnerId: z.string().nullable(), employeeId: z.string().nullable(), name: z.string().nullable(), sftpHost: z.string().nullable(), sftpPort: z.number().gte(1).lte(65535).nullable(), sftpUsername: z.string().nullable(), sftpPassword: z.string().nullable(), inboundPath: z.string().nullable(), outboundPath: z.string().nullable(), pollingFrequencyMinutes: z.number().gte(1).nullable() }).partial(); -export type UpdateIntegrationChannelRequestDto = z.infer; - -/** - * TestConnectionResponseDtoSchema - * @type { object } - * @property { boolean } success - */ -export const TestConnectionResponseDtoSchema = z.object({ success: z.boolean() }); -export type TestConnectionResponseDto = z.infer; - -/** - * IntegrationMessageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } integrationChannelId - * @property { string } positionId - * @property { string } positionNumber - * @property { string } direction - * @property { string } format - * @property { string } status - * @property { string } rawContent - * @property { string } fileName - * @property { string } errorMessage - * @property { string } processedAt - * @property { string } sentAt - * @property { string } createdAt - */ -export const IntegrationMessageResponseDtoSchema = z.object({ id: z.string(), integrationChannelId: z.string(), positionId: z.string().nullish(), positionNumber: z.string().nullish(), direction: z.string(), format: z.string(), status: z.string(), rawContent: z.string(), fileName: z.string(), errorMessage: z.string().nullish(), processedAt: z.iso.datetime({ offset: true }).nullish(), sentAt: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }) }); -export type IntegrationMessageResponseDto = z.infer; - -/** - * IntegrationChannelsListOrderParamEnumSchema - * @type { enum } - */ -export const IntegrationChannelsListOrderParamEnumSchema = z.enum(["createdAt", "name", "businessPartner", "lastPolledAt"]); -export type IntegrationChannelsListOrderParamEnum = z.infer; -export const IntegrationChannelsListOrderParamEnum = IntegrationChannelsListOrderParamEnumSchema.enum; - -/** - * IntegrationChannelsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { IntegrationChannelResponseDto[] } items - */ -export const IntegrationChannelsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationChannelResponseDtoSchema).nullable() }).partial().shape }); -export type IntegrationChannelsListResponse = z.infer; - -/** - * ListMessagesOrderParamEnumSchema - * @type { enum } - */ -export const ListMessagesOrderParamEnumSchema = z.enum(["createdAt", "status", "direction", "format"]); -export type ListMessagesOrderParamEnum = z.infer; -export const ListMessagesOrderParamEnum = ListMessagesOrderParamEnumSchema.enum; - -/** - * ListMessagesResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { IntegrationMessageResponseDto[] } items - */ -export const ListMessagesResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(IntegrationMessageResponseDtoSchema).nullable() }).partial().shape }); -export type ListMessagesResponse = z.infer; - -} diff --git a/test/generated/next/integrationChannels/integrationChannels.queries.ts b/test/generated/next/integrationChannels/integrationChannels.queries.ts deleted file mode 100644 index 1f37862..0000000 --- a/test/generated/next/integrationChannels/integrationChannels.queries.ts +++ /dev/null @@ -1,302 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { IntegrationChannelsAcl } from "./integrationChannels.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { IntegrationChannelsModels } from "./integrationChannels.models"; -import { IntegrationChannelsApi } from "./integrationChannels.api"; - -export namespace IntegrationChannelsQueries { -export const moduleName = QueryModule.IntegrationChannels; - -export const keys = { - all: [moduleName] as const, - list: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (officeId: string, id: string) => [...keys.all, "/offices/:officeId/integration-channels/:id", officeId, id] as const, - listMessages: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", officeId, id, limit, order, filter, page, cursor] as const, - listMessagesInfinite: (officeId: string, id: string, limit?: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/integration-channels/:id/messages", "infinite", officeId, id, limit, order, filter, cursor] as const, -}; - -/** - * Query `useList` - * @summary List integration channels for an office - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); - return IntegrationChannelsApi.list(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List integration channels for an office - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, name, businessPartner, lastPolledAt. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationChannelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationChannelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(IntegrationChannelsAcl.canUseList({ officeId } )); - return IntegrationChannelsApi.list(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create integration channel - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { IntegrationChannelsModels.CreateIntegrationChannelRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(IntegrationChannelsAcl.canUseCreate({ officeId } )); - return IntegrationChannelsApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get integration channel by id - * @permission Requires `canUseFindById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ officeId, id }: { officeId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(officeId, id), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseFindById({ officeId } )); - return IntegrationChannelsApi.findById(officeId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update integration channel by id - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { IntegrationChannelsModels.UpdateIntegrationChannelRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id, data }) => { - checkAcl(IntegrationChannelsAcl.canUseUpdate({ officeId } )); - return IntegrationChannelsApi.update(officeId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive integration channel by id - * @permission Requires `canUseArchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseArchive({ officeId } )); - return IntegrationChannelsApi.archive(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive integration channel by id - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseUnarchive({ officeId } )); - return IntegrationChannelsApi.unarchive(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, id } = variables; - const updateKeys = [keys.findById(officeId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useTestConnection` - * @summary Test integration channel SFTP connection - * @permission Requires `canUseTestConnection` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useTestConnection = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, id }) => { - checkAcl(IntegrationChannelsAcl.canUseTestConnection({ officeId } )); - return IntegrationChannelsApi.testConnection(officeId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListMessages` - * @summary Paginate integration channel messages - * @permission Requires `canUseListMessages` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListMessages = ({ officeId, id, limit, order, filter, page, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listMessages(officeId, id, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListMessagesInfinite - * @summary Paginate integration channel messages - * @permission Requires `canUseListMessages` ability - * @param { string } object.officeId Path parameter - * @param { string } object.id Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): createdAt, status, direction, format. Example: `createdAt` - * @param { IntegrationChannelsModels.IntegrationMessageFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListMessagesInfinite = ({ officeId, id, limit, order, filter, cursor }: { officeId: string, id: string, limit: number, order?: string, filter?: IntegrationChannelsModels.IntegrationMessageFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listMessagesInfinite(officeId, id, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(IntegrationChannelsAcl.canUseListMessages({ officeId } )); - return IntegrationChannelsApi.listMessages(officeId, id, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts deleted file mode 100644 index 81c9083..0000000 --- a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InttraOfficeIntegrationAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Read", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update INTTRA credentials - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -} diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts deleted file mode 100644 index 7bed21a..0000000 --- a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.api.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; - -export namespace InttraOfficeIntegrationApi { -export const get = (officeId: string, ) => { - return AppRestClient.get( - { resSchema: InttraOfficeIntegrationModels.OfficeInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - - ) -}; -export const generate = (officeId: string, ) => { - return AppRestClient.post( - { resSchema: InttraOfficeIntegrationModels.GenerateInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - - ) -}; -export const update = (officeId: string, data: InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InttraOfficeIntegrationModels.UpdateInttraCredentialsResponseDtoSchema }, - `/offices/${officeId}/inttra/credentials`, - ZodExtended.parse(InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts deleted file mode 100644 index 635c0a5..0000000 --- a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.models.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { z } from "zod"; - -export namespace InttraOfficeIntegrationModels { -/** - * OfficeInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } rotatedByUserId - * @property { string } officeId - * @property { string } sftpUsername - * @property { string } sftpPublicKey - * @property { string } partnerCode - * @property { string } ediId - * @property { string } notificationEmail - */ -export const OfficeInttraCredentialsResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string().nullish(), officeId: z.string(), sftpUsername: z.string().nullish(), sftpPublicKey: z.string().nullish(), partnerCode: z.string().nullish(), ediId: z.string().nullish(), notificationEmail: z.string().nullish() }); -export type OfficeInttraCredentialsResponseDto = z.infer; - -/** - * GenerateInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } publicKey - * @property { string } rotatedAt - * @property { string } rotatedByUserId - */ -export const GenerateInttraCredentialsResponseDtoSchema = z.object({ publicKey: z.string(), rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }); -export type GenerateInttraCredentialsResponseDto = z.infer; - -/** - * UpdateInttraCredentialsRequestDtoSchema - * @type { object } - * @property { string } sftpUsername - * @property { string } sftpPassword - * @property { string } partnerCode - * @property { string } ediId - * @property { string } notificationEmail - */ -export const UpdateInttraCredentialsRequestDtoSchema = z.object({ sftpUsername: z.string().nullable(), sftpPassword: z.string().nullable(), partnerCode: z.string().nullable(), ediId: z.string().nullable(), notificationEmail: z.string().nullable() }).partial(); -export type UpdateInttraCredentialsRequestDto = z.infer; - -/** - * UpdateInttraCredentialsResponseDtoSchema - * @type { object } - * @property { string } rotatedAt - * @property { string } rotatedByUserId - */ -export const UpdateInttraCredentialsResponseDtoSchema = z.object({ rotatedAt: z.iso.datetime({ offset: true }), rotatedByUserId: z.string() }); -export type UpdateInttraCredentialsResponseDto = z.infer; - -} diff --git a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts b/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts deleted file mode 100644 index 78b7dc4..0000000 --- a/test/generated/next/inttraOfficeIntegration/inttraOfficeIntegration.queries.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InttraOfficeIntegrationAcl } from "./inttraOfficeIntegration.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InttraOfficeIntegrationModels } from "./inttraOfficeIntegration.models"; -import { InttraOfficeIntegrationApi } from "./inttraOfficeIntegration.api"; - -export namespace InttraOfficeIntegrationQueries { -export const moduleName = QueryModule.InttraOfficeIntegration; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string) => [...keys.all, "/offices/:officeId/inttra/credentials", officeId] as const, -}; - -/** - * Query `useGet` - * @summary Get INTTRA credentials for an office - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId }: { officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId), - queryFn: () => { - checkAcl(InttraOfficeIntegrationAcl.canUseGet({ officeId } )); - return InttraOfficeIntegrationApi.get(officeId) }, - ...options, - }); -}; - -/** - * Mutation `useGenerate` - * @summary Generate and persist INTTRA SFTP RSA key pair for an office - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId }) => { - checkAcl(InttraOfficeIntegrationAcl.canUseGenerate({ officeId } )); - return InttraOfficeIntegrationApi.generate(officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Manually update INTTRA credentials (username/password/passphrase) - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { InttraOfficeIntegrationModels.UpdateInttraCredentialsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InttraOfficeIntegrationAcl.canUseUpdate({ officeId } )); - return InttraOfficeIntegrationApi.update(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts deleted file mode 100644 index 268366c..0000000 --- a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.acl.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InttraShippingInstructionMessagesAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List SI messages - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create SI message - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -/** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Get SI message details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Read", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update SI message - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-shipping-instructions", object) : "WorkingDocument-shipping-instructions" -] as AbilityTuple<"Update", "WorkingDocument-shipping-instructions" | ForcedSubject<"WorkingDocument-shipping-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts deleted file mode 100644 index 66b0aa8..0000000 --- a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.api.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; - -export namespace InttraShippingInstructionMessagesApi { -export const list = (officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto, ) => { - return AppRestClient.get( - { resSchema: InttraShippingInstructionMessagesModels.InttraShippingInstructionMessagesListResponseSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, - { - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - filter: ZodExtended.parse(InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - }, - } - ) -}; -export const create = (officeId: string, positionId: string, shippingInstructionsId: string, data: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto, ) => { - return AppRestClient.post( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages`, - ZodExtended.parse(InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, data), - - ) -}; -export const getById = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, ) => { - return AppRestClient.get( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - - ) -}; -export const update = (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string, data: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${shippingInstructionsId}/messages/${messageId}`, - ZodExtended.parse(InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts deleted file mode 100644 index fbb3b0b..0000000 --- a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.configs.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; -import { InttraShippingInstructionMessagesQueries } from "./inttraShippingInstructionMessages.queries"; -import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; - -export namespace InttraShippingInstructionMessagesConfigs { -export const messagesConfig = { - meta: { - title: "Messages", - }, - readAll: { - acl: InttraShippingInstructionMessagesAcl.canUseList, - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, - paginated: InttraShippingInstructionMessagesQueries.useList, - infinite: InttraShippingInstructionMessagesQueries.useListInfinite, - filters: { - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDtoSchema, - options: { - inputs: { - status: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageListItemResponseDtoSchema, - options: { - columns: { - id: true, - createdAt: true, - updatedAt: true, - shippingInstructionsId: true, - positionId: true, - createdByUserId: true, - status: true, - fileName: true, - sftpPath: true, - sentAt: true, - uploadAttemptCount: true, - lastUploadError: true, - notes: true, - contrlStatus: true, - contrlReceivedAt: true, - contrlRaw: true, - aperakStatus: true, - aperakReceivedAt: true, - aperakRaw: true, - }, - }, -}), - }, - read: { - acl: InttraShippingInstructionMessagesAcl.canUseGetById, - schema: InttraShippingInstructionMessagesModels.ShippingInstructionMessageResponseDtoSchema, - query: InttraShippingInstructionMessagesQueries.useGetById, - }, - create: { - acl: InttraShippingInstructionMessagesAcl.canUseCreate, - schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, - mutation: InttraShippingInstructionMessagesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDtoSchema, - options: { - inputs: { - isAmendment: true, - }, - }, -}) - }, - update: { - acl: InttraShippingInstructionMessagesAcl.canUseUpdate, - schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, - mutation: InttraShippingInstructionMessagesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDtoSchema, - options: { - inputs: { - notes: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts deleted file mode 100644 index 6e252f5..0000000 --- a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.models.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InttraShippingInstructionMessagesModels { -/** - * InttraShippingInstructionStatusEnumSchema - * @type { enum } - */ -export const InttraShippingInstructionStatusEnumSchema = z.enum(["PendingUpload", "Uploaded", "ContrlAccepted", "ContrlRejected", "AperakAccepted", "AperakRejected", "FailedUpload"]); -export type InttraShippingInstructionStatusEnum = z.infer; -export const InttraShippingInstructionStatusEnum = InttraShippingInstructionStatusEnumSchema.enum; - -/** - * ShippingInstructionMessageListItemResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } shippingInstructionsId - * @property { string } positionId - * @property { string } createdByUserId - * @property { InttraShippingInstructionStatusEnum } status - * @property { string } fileName - * @property { string } sftpPath - * @property { string } sentAt - * @property { number } uploadAttemptCount - * @property { string } lastUploadError - * @property { string } notes - * @property { string } contrlStatus - * @property { string } contrlReceivedAt - * @property { string } contrlRaw - * @property { string } aperakStatus - * @property { string } aperakReceivedAt - * @property { string } aperakRaw - */ -export const ShippingInstructionMessageListItemResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }); -export type ShippingInstructionMessageListItemResponseDto = z.infer; - -/** - * ShippingInstructionMessageFilterDtoSchema - * @type { object } - * @property { InttraShippingInstructionStatusEnum[] } status - */ -export const ShippingInstructionMessageFilterDtoSchema = z.object({ status: z.array(InttraShippingInstructionStatusEnumSchema).nullable() }).partial(); -export type ShippingInstructionMessageFilterDto = z.infer; - -/** - * ShippingInstructionMessageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } shippingInstructionsId - * @property { string } positionId - * @property { string } createdByUserId - * @property { InttraShippingInstructionStatusEnum } status - * @property { object } shippingInstructionSnapshot - * @property { string } renderedRequestPayload - * @property { string } fileName - * @property { string } sftpPath - * @property { string } sentAt - * @property { number } uploadAttemptCount - * @property { string } lastUploadError - * @property { string } notes - * @property { string } contrlStatus - * @property { string } contrlReceivedAt - * @property { string } contrlRaw - * @property { string } aperakStatus - * @property { string } aperakReceivedAt - * @property { string } aperakRaw - */ -export const ShippingInstructionMessageResponseDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), shippingInstructionsId: z.string(), positionId: z.string(), createdByUserId: z.string(), status: InttraShippingInstructionStatusEnumSchema, shippingInstructionSnapshot: z.object({}), renderedRequestPayload: z.string(), fileName: z.string(), sftpPath: z.string(), sentAt: z.iso.datetime({ offset: true }), uploadAttemptCount: z.number(), lastUploadError: z.string().nullish(), notes: z.string().nullish(), contrlStatus: z.string().nullish(), contrlReceivedAt: z.iso.datetime({ offset: true }).nullish(), contrlRaw: z.string().nullish(), aperakStatus: z.string().nullish(), aperakReceivedAt: z.iso.datetime({ offset: true }).nullish(), aperakRaw: z.string().nullish() }); -export type ShippingInstructionMessageResponseDto = z.infer; - -/** - * UpdateShippingInstructionMessageRequestDtoSchema - * @type { object } - * @property { string } notes - */ -export const UpdateShippingInstructionMessageRequestDtoSchema = z.object({ notes: z.string().nullable() }).partial(); -export type UpdateShippingInstructionMessageRequestDto = z.infer; - -/** - * CreateShippingInstructionMessageRequestDtoSchema - * @type { object } - * @property { boolean } isAmendment Default: `false` - */ -export const CreateShippingInstructionMessageRequestDtoSchema = z.object({ isAmendment: z.boolean().nullable().default(false) }).partial(); -export type CreateShippingInstructionMessageRequestDto = z.infer; - -/** - * InttraShippingInstructionMessagesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ShippingInstructionMessageListItemResponseDto[] } items - */ -export const InttraShippingInstructionMessagesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ShippingInstructionMessageListItemResponseDtoSchema).nullable() }).partial().shape }); -export type InttraShippingInstructionMessagesListResponse = z.infer; - -} diff --git a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts b/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts deleted file mode 100644 index 410de3d..0000000 --- a/test/generated/next/inttraShippingInstructionMessages/inttraShippingInstructionMessages.queries.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InttraShippingInstructionMessagesAcl } from "./inttraShippingInstructionMessages.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InttraShippingInstructionMessagesModels } from "./inttraShippingInstructionMessages.models"; -import { InttraShippingInstructionMessagesApi } from "./inttraShippingInstructionMessages.api"; - -export namespace InttraShippingInstructionMessagesQueries { -export const moduleName = QueryModule.InttraShippingInstructionMessages; - -export const keys = { - all: [moduleName] as const, - list: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", officeId, positionId, shippingInstructionsId, limit, page, cursor, filter] as const, - listInfinite: (officeId: string, positionId: string, shippingInstructionsId: string, limit?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages", "infinite", officeId, positionId, shippingInstructionsId, limit, cursor, filter] as const, - getById: (officeId: string, positionId: string, shippingInstructionsId: string, messageId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:shippingInstructionsId/messages/:messageId", officeId, positionId, shippingInstructionsId, messageId] as const, -}; - -/** - * Query `useList` - * @summary List Inttra shipping instruction messages for a position/BL instructions - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, positionId, shippingInstructionsId, limit, page, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, page?: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter), - queryFn: () => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); - return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, page, cursor, filter) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List Inttra shipping instruction messages for a position/BL instructions - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto } object.filter Query parameter - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, positionId, shippingInstructionsId, limit, cursor, filter }: { officeId: string, positionId: string, shippingInstructionsId: string, limit: number, cursor?: string, filter?: InttraShippingInstructionMessagesModels.ShippingInstructionMessageFilterDto }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, positionId, shippingInstructionsId, limit, cursor, filter), - queryFn: ({ pageParam }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseList({ officeId } )); - return InttraShippingInstructionMessagesApi.list(officeId, positionId, shippingInstructionsId, limit, pageParam, cursor, filter) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Inttra shipping instruction message - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.shippingInstructionsId Path parameter - * @param { InttraShippingInstructionMessagesModels.CreateShippingInstructionMessageRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, shippingInstructionsId, data }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseCreate({ officeId } )); - return InttraShippingInstructionMessagesApi.create(officeId, positionId, shippingInstructionsId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetById` - * @summary Get Inttra shipping instruction message details - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.shippingInstructionsId Path parameter - * @param { string } object.messageId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ officeId, positionId, shippingInstructionsId, messageId }: { officeId: string, positionId: string, shippingInstructionsId: string, messageId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, positionId, shippingInstructionsId, messageId), - queryFn: () => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseGetById({ officeId } )); - return InttraShippingInstructionMessagesApi.getById(officeId, positionId, shippingInstructionsId, messageId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Inttra shipping instruction message - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.shippingInstructionsId Path parameter - * @param { string } mutation.messageId Path parameter - * @param { InttraShippingInstructionMessagesModels.UpdateShippingInstructionMessageRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, shippingInstructionsId, messageId, data }) => { - checkAcl(InttraShippingInstructionMessagesAcl.canUseUpdate({ officeId } )); - return InttraShippingInstructionMessagesApi.update(officeId, positionId, shippingInstructionsId, messageId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, shippingInstructionsId, messageId } = variables; - const updateKeys = [keys.getById(officeId, positionId, shippingInstructionsId, messageId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/invoicePayments/invoicePayments.acl.ts b/test/generated/next/invoicePayments/invoicePayments.acl.ts deleted file mode 100644 index e3061ca..0000000 --- a/test/generated/next/invoicePayments/invoicePayments.acl.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InvoicePaymentsAcl { -/** - * Use for `useListOfficePayments` query ability. For global ability, omit the object parameter. - * @description List office payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListOfficePayments` query - */ -export const canUseListOfficePayments = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useBulkCreatePayments` mutation ability. For global ability, omit the object parameter. - * @description Bulk create invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useBulkCreatePayments` mutation - */ -export const canUseBulkCreatePayments = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCalculatePayments` mutation ability. For global ability, omit the object parameter. - * @description Calculate invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCalculatePayments` mutation - */ -export const canUseCalculatePayments = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportOfficePayments` mutation ability. For global ability, omit the object parameter. - * @description Export office invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportOfficePayments` mutation - */ -export const canUseExportOfficePayments = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("InvoicePayment", object) : "InvoicePayment" -] as AbilityTuple<"Export", "InvoicePayment" | ForcedSubject<"InvoicePayment"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List invoice payments - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetPaymentById` query ability. For global ability, omit the object parameter. - * @description Create invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPaymentById` query - */ -export const canUseGetPaymentById = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useDeleteInvoicePayment` mutation ability. For global ability, omit the object parameter. - * @description Delete invoice payment - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoicePayment` mutation - */ -export const canUseDeleteInvoicePayment = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/next/invoicePayments/invoicePayments.api.ts b/test/generated/next/invoicePayments/invoicePayments.api.ts deleted file mode 100644 index b19c0f4..0000000 --- a/test/generated/next/invoicePayments/invoicePayments.api.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; - -export namespace InvoicePaymentsApi { -export const listOfficePayments = (officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.ListOfficePaymentsResponseSchema }, - `/offices/${officeId}/payments`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const bulkCreatePayments = (officeId: string, data: InvoicePaymentsModels.BulkCreatePaymentsRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.BulkCreatePaymentsResponseDtoSchema }, - `/offices/${officeId}/payments`, - ZodExtended.parse(InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, data), - - ) -}; -export const calculatePayments = (officeId: string, data: InvoicePaymentsModels.CalculatePaymentsRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.CalculatePaymentsResponseDtoSchema }, - `/offices/${officeId}/payments/calculate`, - ZodExtended.parse(InvoicePaymentsModels.CalculatePaymentsRequestDtoSchema, data), - - ) -}; -export const exportOfficePayments = (officeId: string, data: InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payments/exports`, - ZodExtended.parse(InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const list = (officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.InvoicePaymentsListResponseSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments`, - { - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, invoiceId: string, data: InvoicePaymentsModels.CreateInvoicePaymentRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments`, - ZodExtended.parse(InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, data), - - ) -}; -export const getPaymentById = (officeId: string, invoiceId: string, paymentId: string, ) => { - return AppRestClient.get( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - - ) -}; -export const update = (officeId: string, invoiceId: string, paymentId: string, data: InvoicePaymentsModels.UpdateInvoicePaymentRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicePaymentsModels.PaymentResponseDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - ZodExtended.parse(InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, data), - - ) -}; -export const deleteInvoicePayment = (officeId: string, invoiceId: string, paymentId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/payments/${paymentId}`, - - ) -}; -} diff --git a/test/generated/next/invoicePayments/invoicePayments.configs.ts b/test/generated/next/invoicePayments/invoicePayments.configs.ts deleted file mode 100644 index 9f2d9ca..0000000 --- a/test/generated/next/invoicePayments/invoicePayments.configs.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; -import { InvoicePaymentsQueries } from "./invoicePayments.queries"; -import { InvoicePaymentsAcl } from "./invoicePayments.acl"; - -export namespace InvoicePaymentsConfigs { -export const paymentsConfig = { - meta: { - title: "Payments", - }, - readAll: { - acl: InvoicePaymentsAcl.canUseListOfficePayments, - schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, - paginated: InvoicePaymentsQueries.useListOfficePayments, - infinite: InvoicePaymentsQueries.useListOfficePaymentsInfinite, - filters: { - schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicePaymentsModels.OfficeInvoicePaymentFilterDtoSchema, - options: { - inputs: { - search: true, - paymentDate: true, - invoiceIssuingDate: true, - invoiceDirection: true, - createdBy: true, - businessPartner: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicePaymentsModels.OfficePaymentPreviewDtoSchema, - options: { - columns: { - id: true, - amount: true, - positionNumber: true, - currencyNotation: true, - paymentDate: true, - paymentMethod: true, - comment: true, - createdAt: true, - updatedAt: true, - createdBy: true, - invoice: true, - businessPartner: true, - }, - sortable: InvoicePaymentsModels.ListOfficePaymentsOrderParamEnumSchema, - }, -}), - }, - create: { - acl: InvoicePaymentsAcl.canUseBulkCreatePayments, - schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, - mutation: InvoicePaymentsQueries.useBulkCreatePayments, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.BulkCreatePaymentsRequestDtoSchema, - options: { - inputs: { - paymentDate: true, - invoiceIds: true, - comment: true, - }, - }, -}) - }, -}; - -export const invoicesPaymentsConfig = { - meta: { - title: "Invoices Payments", - }, - readAll: { - acl: InvoicePaymentsAcl.canUseList, - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - paginated: InvoicePaymentsQueries.useList, - infinite: InvoicePaymentsQueries.useListInfinite, - columns: dynamicColumns({ - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - options: { - columns: { - id: true, - amount: true, - currencyNotation: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - bankAccount: true, - comment: true, - createdAt: true, - updatedAt: true, - createdBy: true, - }, - }, -}), - }, - read: { - acl: InvoicePaymentsAcl.canUseGetPaymentById, - schema: InvoicePaymentsModels.PaymentResponseDtoSchema, - query: InvoicePaymentsQueries.useGetPaymentById, - }, - create: { - acl: InvoicePaymentsAcl.canUseCreate, - schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, - mutation: InvoicePaymentsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.CreateInvoicePaymentRequestDtoSchema, - options: { - inputs: { - amount: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - comment: true, - }, - }, -}) - }, - update: { - acl: InvoicePaymentsAcl.canUseUpdate, - schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, - mutation: InvoicePaymentsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InvoicePaymentsModels.UpdateInvoicePaymentRequestDtoSchema, - options: { - inputs: { - amount: true, - paymentDate: true, - paymentMethod: true, - bankAccountId: true, - comment: true, - }, - }, -}) - }, - delete: { - acl: InvoicePaymentsAcl.canUseDeleteInvoicePayment, - mutation: InvoicePaymentsQueries.useDeleteInvoicePayment, - }, -}; - -} diff --git a/test/generated/next/invoicePayments/invoicePayments.models.ts b/test/generated/next/invoicePayments/invoicePayments.models.ts deleted file mode 100644 index 23fae1a..0000000 --- a/test/generated/next/invoicePayments/invoicePayments.models.ts +++ /dev/null @@ -1,292 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicePaymentsModels { -/** - * OfficePaymentTotalAmountsDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ -export const OfficePaymentTotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); -export type OfficePaymentTotalAmountsDto = z.infer; - -/** - * OfficePaymentListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { OfficePaymentTotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const OfficePaymentListResponseDtoSchema = z.object({ items: z.array(z.string()), totalAmounts: z.array(OfficePaymentTotalAmountsDtoSchema), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type OfficePaymentListResponseDto = z.infer; - -/** - * OfficePaymentPreviewInvoiceDtoSchema - * @type { object } - * @property { string } id - * @property { string } invoiceNumber - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection - * @property { number } grossAmount - * @property { CommonModels.InvoiceStatusEnum } status - * @property { string } paidOn - * @property { string } issuingDate - */ -export const OfficePaymentPreviewInvoiceDtoSchema = z.object({ id: z.string(), invoiceNumber: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, grossAmount: z.number(), status: CommonModels.InvoiceStatusEnumSchema, paidOn: z.iso.datetime({ offset: true }).nullable(), issuingDate: z.iso.datetime({ offset: true }).nullable() }); -export type OfficePaymentPreviewInvoiceDto = z.infer; - -/** - * PaymentMethodEnumSchema - * @type { enum } - */ -export const PaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); -export type PaymentMethodEnum = z.infer; -export const PaymentMethodEnum = PaymentMethodEnumSchema.enum; - -/** - * OfficePaymentPreviewCreatedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const OfficePaymentPreviewCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type OfficePaymentPreviewCreatedByDto = z.infer; - -/** - * OfficePaymentBusinessPartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const OfficePaymentBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type OfficePaymentBusinessPartnerDto = z.infer; - -/** - * OfficePaymentPreviewDtoSchema - * @type { object } - * @property { string } id - * @property { number } amount - * @property { string } positionNumber - * @property { string } currencyNotation - * @property { string } paymentDate - * @property { PaymentMethodEnum } paymentMethod - * @property { string } comment - * @property { string } createdAt - * @property { string } updatedAt - * @property { OfficePaymentPreviewCreatedByDto } createdBy - * @property { OfficePaymentPreviewInvoiceDto } invoice - * @property { OfficePaymentBusinessPartnerDto } businessPartner - */ -export const OfficePaymentPreviewDtoSchema = z.object({ id: z.string(), amount: z.number(), positionNumber: z.string(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: OfficePaymentPreviewCreatedByDtoSchema, invoice: OfficePaymentPreviewInvoiceDtoSchema, businessPartner: OfficePaymentBusinessPartnerDtoSchema.nullish() }); -export type OfficePaymentPreviewDto = z.infer; - -/** - * OfficeInvoicePaymentFilterDtoSchema - * @type { object } - * @property { string } search Search by invoice number - * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range - * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction - * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) - * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) - */ -export const OfficeInvoicePaymentFilterDtoSchema = z.object({ search: z.string().nullable(), paymentDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), createdBy: z.array(z.string()).nullable(), businessPartner: z.array(z.string()).nullable() }).partial(); -export type OfficeInvoicePaymentFilterDto = z.infer; - -/** - * BulkCreatePaymentBusinessPartnerDtoSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } name Business partner name - * @property { string } paymentDate Payment date applied to the partner invoices - */ -export const BulkCreatePaymentBusinessPartnerDtoSchema = z.object({ id: z.string(), name: z.string(), paymentDate: z.iso.datetime({ offset: true }) }); -export type BulkCreatePaymentBusinessPartnerDto = z.infer; - -/** - * BulkCreatePaymentsResponseDtoSchema - * @type { object } - * @property { BulkCreatePaymentBusinessPartnerDto[] } businessPartners List of business partners paid in this bulk operation - */ -export const BulkCreatePaymentsResponseDtoSchema = z.object({ businessPartners: z.array(BulkCreatePaymentBusinessPartnerDtoSchema) }); -export type BulkCreatePaymentsResponseDto = z.infer; - -/** - * CalculatePaymentItemDtoSchema - * @type { object } - * @property { string } businessPartnerId - * @property { string } businessPartnerName - * @property { number } amount - * @property { string } currency - */ -export const CalculatePaymentItemDtoSchema = z.object({ businessPartnerId: z.string(), businessPartnerName: z.string(), amount: z.number(), currency: z.string() }); -export type CalculatePaymentItemDto = z.infer; - -/** - * CalculatePaymentTotalDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currency - */ -export const CalculatePaymentTotalDtoSchema = z.object({ amount: z.number(), currency: z.string() }); -export type CalculatePaymentTotalDto = z.infer; - -/** - * CalculatePaymentsResponseDtoSchema - * @type { object } - * @property { CalculatePaymentItemDto[] } payments - * @property { CalculatePaymentTotalDto[] } totals - */ -export const CalculatePaymentsResponseDtoSchema = z.object({ payments: z.array(CalculatePaymentItemDtoSchema), totals: z.array(CalculatePaymentTotalDtoSchema) }); -export type CalculatePaymentsResponseDto = z.infer; - -/** - * OfficeInvoicePaymentExportFilterDtoSchema - * @type { object } - * @property { string } search Search by invoice number - * @property { CommonModels.DateRangeDto } paymentDate Filter by payment date range - * @property { CommonModels.DateRangeDto } invoiceIssuingDate Filter by invoice issuing date range - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection Filter by invoice direction - * @property { string[] } createdBy Filter by created by employee IDs (array of UUIDs) - * @property { string[] } businessPartner Filter by invoice customer/business partner (array of UUIDs) - */ -export const OfficeInvoicePaymentExportFilterDtoSchema = z.object({ search: z.string().nullable(), paymentDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceIssuingDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), createdBy: z.array(z.string()).nullable(), businessPartner: z.array(z.string()).nullable() }).partial(); -export type OfficeInvoicePaymentExportFilterDto = z.infer; - -/** - * OfficeInvoicePaymentExportColumnSchema - * @type { enum } - */ -export const OfficeInvoicePaymentExportColumnSchema = z.enum(["amount", "currency", "paymentDate", "paymentMethod", "comment", "positionNumber", "invoiceNumber", "invoiceDirection", "invoiceStatus", "invoiceIssuingDate", "invoiceGrossAmount", "invoicePaidOn", "businessPartnerName", "createdByName"]); -export type OfficeInvoicePaymentExportColumn = z.infer; -export const OfficeInvoicePaymentExportColumn = OfficeInvoicePaymentExportColumnSchema.enum; - -/** - * OfficeInvoicePaymentExportRequestDtoSchema - * @type { object } - * @property { OfficeInvoicePaymentExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { OfficeInvoicePaymentExportFilterDto } filter - */ -export const OfficeInvoicePaymentExportRequestDtoSchema = z.object({ columns: z.array(OfficeInvoicePaymentExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: OfficeInvoicePaymentExportFilterDtoSchema.nullable() }).partial(); -export type OfficeInvoicePaymentExportRequestDto = z.infer; - -/** - * PaymentCreatedByDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PaymentCreatedByDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type PaymentCreatedByDto = z.infer; - -/** - * PaymentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { number } amount - * @property { string } currencyNotation - * @property { string } paymentDate - * @property { PaymentMethodEnum } paymentMethod - * @property { string } bankAccountId - * @property { string } bankAccount - * @property { string } comment - * @property { string } createdAt - * @property { string } updatedAt - * @property { PaymentCreatedByDto } createdBy - */ -export const PaymentResponseDtoSchema = z.object({ id: z.string(), amount: z.number(), currencyNotation: z.string(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PaymentMethodEnumSchema, bankAccountId: z.string().nullish(), bankAccount: z.string().nullish(), comment: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), createdBy: PaymentCreatedByDtoSchema.nullish() }); -export type PaymentResponseDto = z.infer; - -/** - * PositionInvoicePaymentMethodEnumSchema - * @type { enum } - */ -export const PositionInvoicePaymentMethodEnumSchema = z.enum(["BankTransfer", "Cash", "DirectDebit", "Other"]); -export type PositionInvoicePaymentMethodEnum = z.infer; -export const PositionInvoicePaymentMethodEnum = PositionInvoicePaymentMethodEnumSchema.enum; - -/** - * CreateInvoicePaymentRequestDtoSchema - * @type { object } - * @property { number } amount Payment amount - * @property { string } paymentDate Payment date - * @property { PositionInvoicePaymentMethodEnum } paymentMethod Payment method - * @property { string } bankAccountId Bank account ID - * @property { string } comment Optional comment - */ -export const CreateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number(), paymentDate: z.iso.datetime({ offset: true }), paymentMethod: PositionInvoicePaymentMethodEnumSchema, bankAccountId: z.string().nullish(), comment: z.string().nullish() }); -export type CreateInvoicePaymentRequestDto = z.infer; - -/** - * UpdateInvoicePaymentRequestDtoSchema - * @type { object } - * @property { number } amount Payment amount. Minimum: `0.01` - * @property { string } paymentDate Payment date - * @property { string } paymentMethod Payment method - * @property { string } bankAccountId Bank account ID - * @property { string } comment Payment comment - */ -export const UpdateInvoicePaymentRequestDtoSchema = z.object({ amount: z.number().gte(0.01).nullable(), paymentDate: z.iso.datetime({ offset: true }).nullable(), paymentMethod: PaymentMethodEnumSchema.nullable(), bankAccountId: z.string().nullable(), comment: z.string().nullable() }).partial(); -export type UpdateInvoicePaymentRequestDto = z.infer; - -/** - * BulkCreatePaymentsRequestDtoSchema - * @type { object } - * @property { string } paymentDate Payment date for all payments - * @property { string[] } invoiceIds List of invoice IDs to create payments for. Min Items: `1` - * @property { string } comment - */ -export const BulkCreatePaymentsRequestDtoSchema = z.object({ paymentDate: z.iso.datetime({ offset: true }), invoiceIds: z.array(z.string()).min(1), comment: z.string().nullish() }); -export type BulkCreatePaymentsRequestDto = z.infer; - -/** - * CalculatePaymentsRequestDtoSchema - * @type { object } - * @property { string[] } invoiceIds Invoice IDs (UUID v4). Min Items: `1`. Max Items: `30` - */ -export const CalculatePaymentsRequestDtoSchema = z.object({ invoiceIds: z.array(z.string()).min(1).max(30) }); -export type CalculatePaymentsRequestDto = z.infer; - -/** - * ListOfficePaymentsOrderParamEnumSchema - * @type { enum } - */ -export const ListOfficePaymentsOrderParamEnumSchema = z.enum(["paymentDate", "amount", "paymentMethod", "comment", "createdAt", "updatedAt", "currencyNotation", "createdByName", "invoiceNumber", "invoiceDirection", "invoiceGrossAmount", "invoiceStatus", "invoicePaidOn", "invoiceIssuingDate"]); -export type ListOfficePaymentsOrderParamEnum = z.infer; -export const ListOfficePaymentsOrderParamEnum = ListOfficePaymentsOrderParamEnumSchema.enum; - -/** - * ListOfficePaymentsResponseSchema - * @type { object } - * @property { OfficePaymentTotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficePaymentPreviewDto[] } items - */ -export const ListOfficePaymentsResponseSchema = z.object({ ...OfficePaymentListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficePaymentPreviewDtoSchema).nullable() }).partial().shape }); -export type ListOfficePaymentsResponse = z.infer; - -/** - * InvoicePaymentsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PaymentResponseDto[] } items - */ -export const InvoicePaymentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentResponseDtoSchema).nullable() }).partial().shape }); -export type InvoicePaymentsListResponse = z.infer; - -} diff --git a/test/generated/next/invoicePayments/invoicePayments.queries.ts b/test/generated/next/invoicePayments/invoicePayments.queries.ts deleted file mode 100644 index e31c011..0000000 --- a/test/generated/next/invoicePayments/invoicePayments.queries.ts +++ /dev/null @@ -1,325 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InvoicePaymentsAcl } from "./invoicePayments.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InvoicePaymentsModels } from "./invoicePayments.models"; -import { InvoicePaymentsApi } from "./invoicePayments.api"; - -export namespace InvoicePaymentsQueries { -export const moduleName = QueryModule.InvoicePayments; - -export const keys = { - all: [moduleName] as const, - listOfficePayments: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payments", officeId, limit, order, filter, page, cursor] as const, - listOfficePaymentsInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/payments", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, invoiceId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", officeId, invoiceId, limit, page, cursor] as const, - listInfinite: (officeId: string, invoiceId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments", "infinite", officeId, invoiceId, limit, cursor] as const, - getPaymentById: (officeId: string, invoiceId: string, paymentId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/payments/:paymentId", officeId, invoiceId, paymentId] as const, -}; - -/** - * Query `useListOfficePayments` - * @summary List all payments for an office - * @permission Requires `canUseListOfficePayments` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` - * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListOfficePayments = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listOfficePayments(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListOfficePaymentsInfinite - * @summary List all payments for an office - * @permission Requires `canUseListOfficePayments` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, amount, paymentMethod, comment, createdAt, updatedAt, currencyNotation, createdByName, invoiceNumber, invoiceDirection, invoiceGrossAmount, invoiceStatus, invoicePaidOn, invoiceIssuingDate. Example: `paymentDate` - * @param { InvoicePaymentsModels.OfficeInvoicePaymentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListOfficePaymentsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicePaymentsModels.OfficeInvoicePaymentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listOfficePaymentsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicePaymentsAcl.canUseListOfficePayments({ officeId } )); - return InvoicePaymentsApi.listOfficePayments(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useBulkCreatePayments` - * @summary Bulk create payments for multiple invoices - * @permission Requires `canUseBulkCreatePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.BulkCreatePaymentsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useBulkCreatePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseBulkCreatePayments({ officeId } )); - return InvoicePaymentsApi.bulkCreatePayments(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCalculatePayments` - * @summary Calculate grouped payments for provided invoices - * @permission Requires `canUseCalculatePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.CalculatePaymentsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useCalculatePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseCalculatePayments({ officeId } )); - return InvoicePaymentsApi.calculatePayments(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportOfficePayments` - recommended when file should not be cached - * @summary Export office invoice payments to Excel - * @permission Requires `canUseExportOfficePayments` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicePaymentsModels.OfficeInvoicePaymentExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportOfficePayments = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseExportOfficePayments({ officeId } )); - return InvoicePaymentsApi.exportOfficePayments(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useList` - * @summary List payments for an invoice - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, invoiceId, limit, page, cursor }: { officeId: string, invoiceId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, invoiceId, limit, page, cursor), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List payments for an invoice - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, invoiceId, limit, cursor }: { officeId: string, invoiceId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, invoiceId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicePaymentsAcl.canUseList({ officeId } )); - return InvoicePaymentsApi.list(officeId, invoiceId, limit, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a payment for an invoice - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicePaymentsModels.CreateInvoicePaymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseCreate({ officeId } )); - return InvoicePaymentsApi.create(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetPaymentById` - * @summary Get a payment by ID - * @permission Requires `canUseGetPaymentById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { string } object.paymentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetPaymentById = ({ officeId, invoiceId, paymentId }: { officeId: string, invoiceId: string, paymentId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getPaymentById(officeId, invoiceId, paymentId), - queryFn: () => { - checkAcl(InvoicePaymentsAcl.canUseGetPaymentById({ officeId } )); - return InvoicePaymentsApi.getPaymentById(officeId, invoiceId, paymentId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update a payment - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.paymentId Path parameter - * @param { InvoicePaymentsModels.UpdateInvoicePaymentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, paymentId, data }) => { - checkAcl(InvoicePaymentsAcl.canUseUpdate({ officeId } )); - return InvoicePaymentsApi.update(officeId, invoiceId, paymentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId, paymentId } = variables; - const updateKeys = [keys.getPaymentById(officeId, invoiceId, paymentId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteInvoicePayment` - * @summary Delete a payment - * @permission Requires `canUseDeleteInvoicePayment` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.paymentId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteInvoicePayment = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, paymentId }) => { - checkAcl(InvoicePaymentsAcl.canUseDeleteInvoicePayment({ officeId } )); - return InvoicePaymentsApi.deleteInvoicePayment(officeId, invoiceId, paymentId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/invoices/invoices.acl.ts b/test/generated/next/invoices/invoices.acl.ts deleted file mode 100644 index 65b9c24..0000000 --- a/test/generated/next/invoices/invoices.acl.ts +++ /dev/null @@ -1,407 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace InvoicesAcl { -/** - * Use for `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download invoices as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoicesEml` query or `useGetInvoicesEmlMutation` mutation - */ -export const canUseGetInvoicesEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useFind` query ability. For global ability, omit the object parameter. - * @description List invoices for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFind` query - */ -export const canUseFind = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useChangeIncomingCustomer` mutation ability. For global ability, omit the object parameter. - * @description PositionInvoice Fix - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useChangeIncomingCustomer` mutation - */ -export const canUseChangeIncomingCustomer = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useFindByOffice` query ability. For global ability, omit the object parameter. - * @description List invoices for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByOffice` query - */ -export const canUseFindByOffice = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCreateDraft` mutation ability. For global ability, omit the object parameter. - * @description Create invoice for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDraft` mutation - */ -export const canUseCreateDraft = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Create", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportInvoices` mutation ability. For global ability, omit the object parameter. - * @description Export invoices for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportInvoices` mutation - */ -export const canUseExportInvoices = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportCharges` mutation ability. For global ability, omit the object parameter. - * @description Export invoice charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportCharges` mutation - */ -export const canUseExportCharges = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Export", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetUnCharges` query ability. For global ability, omit the object parameter. - * @description List uninvoiced charges for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetUnCharges` query - */ -export const canUseGetUnCharges = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ -export const canUseListAvailablePartnersFor = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetOfficeUnCharges` query ability. For global ability, omit the object parameter. - * @description List uninvoiced charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetOfficeUnCharges` query - */ -export const canUseGetOfficeUnCharges = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useExportUnCharges` mutation ability. For global ability, omit the object parameter. - * @description Export uninvoiced charges for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportUnCharges` mutation - */ -export const canUseExportUnCharges = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("UninvoicedCharge", object) : "UninvoicedCharge" -] as AbilityTuple<"Export", "UninvoicedCharge" | ForcedSubject<"UninvoicedCharge"> & { officeId: string, }>; - -/** - * Use for `useCreateDirect` mutation ability. For global ability, omit the object parameter. - * @description Create direct invoice for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateDirect` mutation - */ -export const canUseCreateDirect = ( - object?: { officeId: string, } -) => [ - "CreateDirectInvoice", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"CreateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useAddChargeToDirect` mutation ability. For global ability, omit the object parameter. - * @description Add charge to direct invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useAddChargeToDirect` mutation - */ -export const canUseAddChargeToDirect = ( - object?: { officeId: string, } -) => [ - "UpdateDirectInvoice", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdateCharges` mutation ability. For global ability, omit the object parameter. - * @description Update invoice charges - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCharges` mutation - */ -export const canUseUpdateCharges = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useRemoveChargeFromDirect` mutation ability. For global ability, omit the object parameter. - * @description Remove charge from direct invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRemoveChargeFromDirect` mutation - */ -export const canUseRemoveChargeFromDirect = ( - object?: { officeId: string, } -) => [ - "UpdateDirectInvoice", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"UpdateDirectInvoice", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetDetail` query ability. For global ability, omit the object parameter. - * @description Read invoice details - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDetail` query - */ -export const canUseGetDetail = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useDeleteInvoice` mutation ability. For global ability, omit the object parameter. - * @description Delete invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvoice` mutation - */ -export const canUseDeleteInvoice = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Delete", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useFix` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice accounting issues - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFix` mutation - */ -export const canUseFix = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdateIssuedVatRules` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice VAT rules - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedVatRules` mutation - */ -export const canUseUpdateIssuedVatRules = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useUpdateIssuedCharges` mutation ability. For global ability, omit the object parameter. - * @description Fix invoice charges - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIssuedCharges` mutation - */ -export const canUseUpdateIssuedCharges = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useIssue` mutation ability. For global ability, omit the object parameter. - * @description Issue invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssue` mutation - */ -export const canUseIssue = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useReportHungarian` mutation ability. For global ability, omit the object parameter. - * @description Report invoice to Hungarian tax authority - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReportHungarian` mutation - */ -export const canUseReportHungarian = ( - object?: { officeId: string, } -) => [ - "Fix", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Fix", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGenerateIncoming` mutation ability. For global ability, omit the object parameter. - * @description Generate incoming invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIncoming` mutation - */ -export const canUseGenerateIncoming = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useRegister` mutation ability. For global ability, omit the object parameter. - * @description Register invoice for bookkeeping - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRegister` mutation - */ -export const canUseRegister = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetPreview` query or `useGetPreviewMutation` mutation ability. For global ability, omit the object parameter. - * @description View invoice preview - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` query or `useGetPreviewMutation` mutation - */ -export const canUseGetPreview = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Download invoice as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvoiceEml` query or `useGetInvoiceEmlMutation` mutation - */ -export const canUseGetInvoiceEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `usePrepareDocumentUpload` mutation ability. For global ability, omit the object parameter. - * @description Upload invoice document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePrepareDocumentUpload` mutation - */ -export const canUsePrepareDocumentUpload = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ -export const canUseCancel = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useIssueCreditNote` mutation ability. For global ability, omit the object parameter. - * @description Issue credit note invoice - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueCreditNote` mutation - */ -export const canUseIssueCreditNote = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Update", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/next/invoices/invoices.api.ts b/test/generated/next/invoices/invoices.api.ts deleted file mode 100644 index cc54d52..0000000 --- a/test/generated/next/invoices/invoices.api.ts +++ /dev/null @@ -1,327 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicesApi { -export const getInvoicesEml = (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/eml`, - { - params: { - invoiceIds: ZodExtended.parse(InvoicesModels.GetInvoicesEmlInvoiceIdsParamSchema.optional(), invoiceIds, { type: "query", name: "invoiceIds" }), - }, - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const find = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoicesFindResponseSchema }, - `/offices/${officeId}/positions/${positionId}/invoices`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.InvoicesFindOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicesModels.InvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const changeIncomingCustomer = (officeId: string, invoiceId: string, data: InvoicesModels.ChangeInvoiceCustomerRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/customer`, - ZodExtended.parse(InvoicesModels.ChangeInvoiceCustomerRequestDtoSchema, data), - - ) -}; -export const findByOffice = (officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.FindByOfficeResponseSchema }, - `/offices/${officeId}/invoices`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.FindByOfficeOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(CommonModels.OfficeInvoiceFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createDraft = (officeId: string, data: InvoicesModels.CreateDraftInvoiceRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices`, - ZodExtended.parse(InvoicesModels.CreateDraftInvoiceRequestDtoSchema, data), - - ) -}; -export const exportInvoices = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/exports`, - ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const exportCharges = (officeId: string, data: InvoicesModels.InvoiceExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/charges/exports`, - ZodExtended.parse(InvoicesModels.InvoiceExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getUnCharges = (officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.GetUnChargesResponseSchema }, - `/offices/${officeId}/positions/${positionId}/uninvoiced-charges`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicesModels.UninvoicedChargePaginationDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listAvailablePartnersFor = (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoicesListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/invoices/${invoiceId}/available-partners`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), - }, - } - ) -}; -export const getOfficeUnCharges = (officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.GetOfficeUnChargesResponseSchema }, - `/offices/${officeId}/uninvoiced-charges`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(InvoicesModels.UninvoicedChargesFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const exportUnCharges = (officeId: string, data: InvoicesModels.UninvoicedChargesExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/uninvoiced-charges/exports`, - ZodExtended.parse(InvoicesModels.UninvoicedChargesExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const createDirect = (officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/direct-invoices`, - - ) -}; -export const addChargeToDirect = (officeId: string, invoiceId: string, data: InvoicesModels.CreateDirectInvoiceChargeRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges`, - ZodExtended.parse(InvoicesModels.CreateDirectInvoiceChargeRequestDtoSchema, data), - - ) -}; -export const updateCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceChargesRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges`, - ZodExtended.parse(InvoicesModels.UpdateInvoiceChargesRequestDtoSchema, data), - - ) -}; -export const removeChargeFromDirect = (officeId: string, invoiceId: string, chargeId: string, ) => { - return AppRestClient.delete( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/charges/${chargeId}`, - - ) -}; -export const getDetail = (officeId: string, invoiceId: string, ) => { - return AppRestClient.get( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}`, - - ) -}; -export const update = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateInvoiceRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}`, - ZodExtended.parse(InvoicesModels.UpdateInvoiceRequestDtoSchema, data), - - ) -}; -export const deleteInvoice = (officeId: string, invoiceId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}`, - - ) -}; -export const fix = (officeId: string, invoiceId: string, data: InvoicesModels.FixInvoiceRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix`, - ZodExtended.parse(InvoicesModels.FixInvoiceRequestDtoSchema, data), - - ) -}; -export const generate = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/document`, - - ) -}; -export const updateIssuedVatRules = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix/charges/vat-rules`, - ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDtoSchema, data), - - ) -}; -export const updateIssuedCharges = (officeId: string, invoiceId: string, data: InvoicesModels.UpdateIssuedInvoiceChargesRequestDto, ) => { - return AppRestClient.patch( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/fix/charges`, - ZodExtended.parse(InvoicesModels.UpdateIssuedInvoiceChargesRequestDtoSchema, data), - - ) -}; -export const issue = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/issue`, - undefined, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const reportHungarian = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/invoices/${invoiceId}/hungarian-report`, - - ) -}; -export const generateIncoming = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/generate-incoming`, - undefined, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const register = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/register`, - - ) -}; -export const getPreview = (officeId: string, invoiceId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getInvoiceEml = (officeId: string, invoiceId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/invoices/${invoiceId}/eml`, - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const prepareDocumentUpload = (officeId: string, invoiceId: string, data: InvoicesModels.PrepareUploadRequestDto, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceUploadInstructionsDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/upload-document`, - ZodExtended.parse(InvoicesModels.PrepareUploadRequestDtoSchema, data), - - ) -}; -export const cancel = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/cancel`, - - ) -}; -export const issueCreditNote = (officeId: string, invoiceId: string, ) => { - return AppRestClient.post( - { resSchema: InvoicesModels.InvoiceDetailDtoSchema }, - `/offices/${officeId}/invoices/${invoiceId}/credit-note/issue`, - - ) -}; -} diff --git a/test/generated/next/invoices/invoices.configs.ts b/test/generated/next/invoices/invoices.configs.ts deleted file mode 100644 index 3443bf9..0000000 --- a/test/generated/next/invoices/invoices.configs.ts +++ /dev/null @@ -1,322 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { InvoicesQueries } from "./invoices.queries"; -import { InvoicesAcl } from "./invoices.acl"; - -export namespace InvoicesConfigs { -export const invoicesConfig = { - meta: { - title: "Invoices", - }, - readAll: { - acl: InvoicesAcl.canUseFindByOffice, - schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, - paginated: InvoicesQueries.useFindByOffice, - infinite: InvoicesQueries.useFindByOfficeInfinite, - filters: { - schema: CommonModels.OfficeInvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: CommonModels.OfficeInvoiceFilterDtoSchema, - options: { - inputs: { - search: true, - issuingDate: true, - serviceDate: true, - invoiceDirection: true, - invoiceType: true, - collective: true, - amountMin: true, - amountMax: true, - currencyNotation: true, - vatRule: true, - dueDate: true, - status: true, - receiver: true, - receiverCountry: true, - salesRep: true, - positionNumbersString: true, - positionNumbers: true, - invoiceNumbersString: true, - invoiceNumbers: true, - bookkeepingExportStatus: true, - dunningBlock: true, - invoiceInReview: true, - isInvoiceOk: true, - isVatOk: true, - invoiceNumberMin: true, - invoiceNumberMax: true, - internalNumberMin: true, - internalNumberMax: true, - externalSystemId: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - creditorId: true, - debtorId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.OfficeInvoicePreviewDtoSchema, - options: { - columns: { - id: true, - createdAt: true, - invoiceNumber: true, - invoiceDirection: true, - issuingDate: true, - invoiceType: true, - collective: true, - serviceDate: true, - internalNumber: true, - reference: true, - amount: true, - netAmount: true, - tax: true, - currency: true, - dueDate: true, - status: true, - payDate: true, - paidAmount: true, - position: true, - receiver: true, - receiverCountry: true, - clerk: true, - cancelled: true, - ok: true, - isExportedToBookkeeping: true, - dunningBlock: true, - invoiceInReview: true, - vatOk: true, - comments: true, - paymentComment: true, - creditorId: true, - debtorId: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vatRules: true, - }, - sortable: InvoicesModels.FindByOfficeOrderParamEnumSchema, - }, -}), - }, - read: { - acl: InvoicesAcl.canUseGetDetail, - schema: InvoicesModels.InvoiceDetailDtoSchema, - query: InvoicesQueries.useGetDetail, - }, - create: { - acl: InvoicesAcl.canUseCreateDraft, - schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, - mutation: InvoicesQueries.useCreateDraft, - inputDefs: dynamicInputs({ - schema: InvoicesModels.CreateDraftInvoiceRequestDtoSchema, - options: { - inputs: { - chargeItemIds: true, - invoiceType: true, - customerId: true, - direction: true, - }, - }, -}) - }, - update: { - acl: InvoicesAcl.canUseUpdate, - schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, - mutation: InvoicesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: InvoicesModels.UpdateInvoiceRequestDtoSchema, - options: { - inputs: { - issuingDate: true, - receiptDate: true, - serviceDate: true, - serviceDateUntil: true, - dueDate: true, - invoiceNumber: true, - internalNumber: true, - paymentTermDays: true, - paymentTermType: true, - serviceRecipientId: true, - bankAccountId: true, - remarks: true, - language: true, - showPaymentInstructions: true, - customer: true, - salesRepId: true, - currencyNotation: true, - exchangeRate: true, - }, - }, -}) - }, - delete: { - acl: InvoicesAcl.canUseDeleteInvoice, - mutation: InvoicesQueries.useDeleteInvoice, - }, -}; - -export const uninvoicedChargesConfig = { - meta: { - title: "Uninvoiced Charges", - }, - readAll: { - acl: InvoicesAcl.canUseGetOfficeUnCharges, - schema: InvoicesModels.UninvoicedChargeDtoSchema, - paginated: InvoicesQueries.useGetOfficeUnCharges, - infinite: InvoicesQueries.useGetOfficeUnChargesInfinite, - filters: { - schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.UninvoicedChargesFilterDtoSchema, - options: { - inputs: { - direction: true, - chargeItemId: true, - receiverIds: true, - positionIds: true, - chargeTypeIds: true, - serviceDate: true, - currencies: true, - vatRuleIds: true, - employeeIds: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.UninvoicedChargeDtoSchema, - options: { - columns: { - chargeItemId: true, - invoiceDirection: true, - receiver: true, - position: true, - chargeType: true, - currencyNotation: true, - amount: true, - amountInOfficeCurrency: true, - officeCurrency: true, - exchangeRate: true, - vatRule: true, - serviceDate: true, - status: true, - missingInformation: true, - employee: true, - }, - sortable: InvoicesModels.GetOfficeUnChargesOrderParamEnumSchema, - }, -}), - }, -}; - -export const positionsInvoicesConfig = { - meta: { - title: "Positions Invoices", - }, - readAll: { - acl: InvoicesAcl.canUseFind, - schema: InvoicesModels.InvoicePreviewDtoSchema, - paginated: InvoicesQueries.useFind, - infinite: InvoicesQueries.useFindInfinite, - filters: { - schema: InvoicesModels.InvoiceFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.InvoiceFilterDtoSchema, - options: { - inputs: { - status: true, - direction: true, - receiver: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.InvoicePreviewDtoSchema, - options: { - columns: { - id: true, - invoiceDirection: true, - invoiceType: true, - invoiceNumber: true, - issuingDate: true, - amount: true, - currencyNotation: true, - status: true, - isExportedToBookkeeping: true, - internalNumber: true, - receiver: true, - representative: true, - collective: true, - creditNote: true, - cancelledInvoice: true, - }, - sortable: InvoicesModels.InvoicesFindOrderParamEnumSchema, - }, -}), - }, -}; - -export const positionsUninvoicedChargesConfig = { - meta: { - title: "Positions Uninvoiced Charges", - }, - readAll: { - acl: InvoicesAcl.canUseGetUnCharges, - schema: InvoicesModels.UninvoicedChargeDtoSchema, - paginated: InvoicesQueries.useGetUnCharges, - infinite: InvoicesQueries.useGetUnChargesInfinite, - filters: { - schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, - filterDefs: dynamicInputs({ - schema: InvoicesModels.UninvoicedChargePaginationDtoSchema, - options: { - inputs: { - direction: true, - chargeItemId: true, - receiverId: true, - chargeTypeId: true, - serviceDate: true, - currency: true, - vatRuleId: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: InvoicesModels.UninvoicedChargeDtoSchema, - options: { - columns: { - chargeItemId: true, - invoiceDirection: true, - receiver: true, - position: true, - chargeType: true, - currencyNotation: true, - amount: true, - amountInOfficeCurrency: true, - officeCurrency: true, - exchangeRate: true, - vatRule: true, - serviceDate: true, - status: true, - missingInformation: true, - employee: true, - }, - sortable: InvoicesModels.GetUnChargesOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/invoices/invoices.models.ts b/test/generated/next/invoices/invoices.models.ts deleted file mode 100644 index f1cd629..0000000 --- a/test/generated/next/invoices/invoices.models.ts +++ /dev/null @@ -1,987 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace InvoicesModels { -/** - * InvoiceBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - */ -export const InvoiceBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type InvoiceBusinessPartnerResponseDto = z.infer; - -/** - * InvoiceEmployeeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoiceEmployeeResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type InvoiceEmployeeResponseDto = z.infer; - -/** - * InvoiceRelatedInvoiceResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } internalNumber - */ -export const InvoiceRelatedInvoiceResponseDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }); -export type InvoiceRelatedInvoiceResponseDto = z.infer; - -/** - * InvoicePreviewDtoSchema - * @type { object } - * @property { string } id - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection - * @property { CommonModels.InvoiceTypeEnum } invoiceType - * @property { string } invoiceNumber - * @property { string } issuingDate - * @property { number } amount - * @property { string } currencyNotation - * @property { CommonModels.InvoiceStatusEnum } status - * @property { boolean } isExportedToBookkeeping - * @property { string } internalNumber - * @property { InvoiceBusinessPartnerResponseDto } receiver - * @property { InvoiceEmployeeResponseDto } representative - * @property { boolean } collective - * @property { InvoiceRelatedInvoiceResponseDto } creditNote - * @property { InvoiceRelatedInvoiceResponseDto } cancelledInvoice - */ -export const InvoicePreviewDtoSchema = z.object({ id: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullable(), issuingDate: z.iso.datetime({ offset: true }).nullish(), amount: z.number(), currencyNotation: z.string(), status: CommonModels.InvoiceStatusEnumSchema, isExportedToBookkeeping: z.boolean(), internalNumber: z.string().nullish(), receiver: InvoiceBusinessPartnerResponseDtoSchema.nullish(), representative: InvoiceEmployeeResponseDtoSchema.nullish(), collective: z.boolean(), creditNote: InvoiceRelatedInvoiceResponseDtoSchema.nullish(), cancelledInvoice: InvoiceRelatedInvoiceResponseDtoSchema.nullish() }); -export type InvoicePreviewDto = z.infer; - -/** - * InvoicePartnerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const InvoicePartnerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type InvoicePartnerDto = z.infer; - -/** - * InvoicePositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } transportType - * @property { string } ourReference - * @property { string } finalDestination - * @property { InvoicePartnerDto } shipper - * @property { InvoicePartnerDto } consignee - * @property { string } vessel - * @property { string } emptyPickup - * @property { string } loadingAddress - * @property { string } portOfLoading - * @property { string } portOfDischarge - * @property { string } carrierBl - * @property { string } houseBillOfLadingNumber - * @property { string } masterAWB - * @property { string } hawbNumber - * @property { string } flightNo - * @property { string } pickupAddress - * @property { string } originAirport - * @property { string } destinationAirport - * @property { string } originLocation - * @property { string } destinationLocation - * @property { string } dateOfDeparture - * @property { string } dateOfArrival - */ -export const InvoicePositionDtoSchema = z.object({ id: z.string(), number: z.string(), transportType: z.string(), ourReference: z.string().nullish(), finalDestination: z.string().nullish(), shipper: InvoicePartnerDtoSchema.nullish(), consignee: InvoicePartnerDtoSchema.nullish(), vessel: z.string().nullish(), emptyPickup: z.string().nullish(), loadingAddress: z.string().nullish(), portOfLoading: z.string().nullish(), portOfDischarge: z.string().nullish(), carrierBl: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterAWB: z.string().nullish(), hawbNumber: z.string().nullish(), flightNo: z.string().nullish(), pickupAddress: z.string().nullish(), originAirport: z.string().nullish(), destinationAirport: z.string().nullish(), originLocation: z.string().nullish(), destinationLocation: z.string().nullish(), dateOfDeparture: z.iso.datetime({ offset: true }).nullish(), dateOfArrival: z.iso.datetime({ offset: true }).nullish() }); -export type InvoicePositionDto = z.infer; - -/** - * InvoiceChargeTypeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoiceChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type InvoiceChargeTypeDto = z.infer; - -/** - * InvoiceVatRuleDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { number } rate - */ -export const InvoiceVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), rate: z.number().nullish() }); -export type InvoiceVatRuleDto = z.infer; - -/** - * InvoiceFinanceLineDtoSchema - * @type { object } - * @property { string } positionChargeItemId - * @property { InvoiceChargeTypeDto } chargeType - * @property { string } additionalText - * @property { number } quantity - * @property { number } netAmount - * @property { number } grossAmount - * @property { number } sumInInvoiceCurrency - * @property { number } sumInOfficeCurrency - * @property { string } currencyNotation - * @property { number } exchangeRate - * @property { InvoiceVatRuleDto } vatRule - * @property { number } exchangedNetAmount - * @property { string } positionNumber - * @property { string } positionId - * @property { string } outgoingInvoiceId - * @property { string } registeredInvoiceId - */ -export const InvoiceFinanceLineDtoSchema = z.object({ positionChargeItemId: z.string(), chargeType: InvoiceChargeTypeDtoSchema, additionalText: z.string(), quantity: z.number(), netAmount: z.number(), grossAmount: z.number(), sumInInvoiceCurrency: z.number().nullish(), sumInOfficeCurrency: z.number().nullish(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), vatRule: InvoiceVatRuleDtoSchema, exchangedNetAmount: z.number().nullish(), positionNumber: z.string().nullish(), positionId: z.string().nullish(), outgoingInvoiceId: z.string().nullish(), registeredInvoiceId: z.string().nullish() }); -export type InvoiceFinanceLineDto = z.infer; - -/** - * InvoiceConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl - * @property { string } headerImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ -export const InvoiceConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); -export type InvoiceConfigDto = z.infer; - -/** - * InvoiceCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { string } address - * @property { string } vatNumber - * @property { string } reference - * @property { string } contact - * @property { string } partnerRegistrationNumber - */ -export const InvoiceCustomerDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string().nullish(), label: z.string().nullish(), address: z.string().nullish(), vatNumber: z.string(), reference: z.string().nullish(), contact: z.string().nullish(), partnerRegistrationNumber: z.string().nullish() }); -export type InvoiceCustomerDto = z.infer; - -/** - * InvoiceOfficeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoiceOfficeDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type InvoiceOfficeDto = z.infer; - -/** - * InvoiceSalesRepDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } phoneNumber - */ -export const InvoiceSalesRepDtoSchema = z.object({ id: z.string(), name: z.string(), phoneNumber: z.string().nullish() }); -export type InvoiceSalesRepDto = z.infer; - -/** - * InvoiceServiceRecipientDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } address - * @property { string } vatNumber - * @property { string } partnerRegistrationNumber - */ -export const InvoiceServiceRecipientDtoSchema = z.object({ id: z.string(), name: z.string(), address: z.string().nullish(), vatNumber: z.string(), partnerRegistrationNumber: z.string().nullish() }); -export type InvoiceServiceRecipientDto = z.infer; - -/** - * InvoiceBankAccountDtoSchema - * @type { object } - * @property { string } id - * @property { string } displayValue - * @property { string } iban - * @property { string } bankName - * @property { string } swiftBic - * @property { string } name - * @property { boolean } useFooterOnInvoice - * @property { object } footer - * @property { string } footer.mediaUrl - */ -export const InvoiceBankAccountDtoSchema = z.object({ id: z.string(), displayValue: z.string(), iban: z.string(), bankName: z.string(), swiftBic: z.string(), name: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).nullish() }); -export type InvoiceBankAccountDto = z.infer; - -/** - * InvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const InvoiceRemarksDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); -export type InvoiceRemarksDto = z.infer; - -/** - * InvoiceVatLineDtoSchema - * @type { object } - * @property { string } vatRuleId ID of the VAT rule - * @property { string } name Name of the VAT rule - * @property { string } printNumber Reference numerical string for vat rules - * @property { string } matchCode Match code of the VAT rule - * @property { number } vatPercentage The actual VAT rate (e.g., 19 for 19%) - * @property { number } netAmount Sum of net amounts from financeLines using this vatRuleId - * @property { number } vatAmount Calculated total VAT for this rate (netAmount * vatPercentage / 100) - * @property { number } grossAmount Sum of netAmount + vatAmount for this rate - * @property { number } vatAmountInOfficeCurrency - * @property { number } netAmountInOfficeCurrency - * @property { number } grossAmountInOfficeCurrency - */ -export const InvoiceVatLineDtoSchema = z.object({ vatRuleId: z.string(), name: z.string(), printNumber: z.string(), matchCode: z.string(), vatPercentage: z.number(), netAmount: z.number(), vatAmount: z.number(), grossAmount: z.number(), vatAmountInOfficeCurrency: z.number().nullish(), netAmountInOfficeCurrency: z.number().nullish(), grossAmountInOfficeCurrency: z.number().nullish() }); -export type InvoiceVatLineDto = z.infer; - -/** - * RelatedInvoiceDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } internalNumber - */ -export const RelatedInvoiceDetailDtoSchema = z.object({ id: z.string(), number: z.string().nullable(), internalNumber: z.string().nullish() }); -export type RelatedInvoiceDetailDto = z.infer; - -/** - * InvoiceLanguageEnumSchema - * @type { enum } - */ -export const InvoiceLanguageEnumSchema = z.enum(["en", "de", "sl", "hu", "cs"]); -export type InvoiceLanguageEnum = z.infer; -export const InvoiceLanguageEnum = InvoiceLanguageEnumSchema.enum; - -/** - * InvoiceDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } rootFolderId - * @property { string } invoiceDirection - * @property { string } invoiceType - * @property { string } invoiceNumber - * @property { string } costCenter - * @property { string } status - * @property { string } language - * @property { boolean } isVatOk - * @property { boolean } isInvoiceOk - * @property { string } issuingDate - * @property { string } receiptDate - * @property { string } serviceDate - * @property { string } serviceDateUntil - * @property { string } dueDate - * @property { string } internalNumber - * @property { boolean } isExportedToBookkeeping - * @property { string } sentAt - * @property { string } creditNoteId - * @property { string } draftCreditNoteId - * @property { string } cancelledInvoiceId - * @property { string } uploadedDocumentUrl - * @property { InvoiceCustomerDto } customer - * @property { string } customerNumber - * @property { string } customerNameOverride - * @property { string } customerReferenceOverride - * @property { string } customerContactOverride - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { InvoicePositionDto } position - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { InvoiceOfficeDto } salesOffice - * @property { InvoiceSalesRepDto } salesRep - * @property { number } totalNet - * @property { number } totalVat - * @property { number } totalGross - * @property { string } currencyNotation - * @property { number } exchangeRate - * @property { number } paymentTermDays - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { InvoiceServiceRecipientDto } serviceRecipient - * @property { boolean } showPaymentInstructions - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { string } comments - * @property { InvoiceBankAccountDto } bankAccount - * @property { InvoiceFinanceLineDto[] } financeLines - * @property { InvoiceRemarksDto } remarks - * @property { InvoiceVatLineDto[] } vatLines - * @property { InvoiceConfigDto } config - * @property { RelatedInvoiceDetailDto } creditNote - * @property { RelatedInvoiceDetailDto } draftCreditNote - * @property { RelatedInvoiceDetailDto } cancelledInvoice - * @property { string } officeCurrencyNotation - * @property { string } inverseCurrencyNotation - * @property { number } inverseExchangeRate - * @property { boolean } requiresSpecialTablePresentation - * @property { number } paidAmount - * @property { number } outstandingAmount - * @property { string } paidOn - * @property { boolean } isIssued - * @property { number } grossAmountInOfficeCurrency - * @property { string } createdAt - */ -export const InvoiceDetailDtoSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, invoiceType: CommonModels.InvoiceTypeEnumSchema, invoiceNumber: z.string().nullish(), costCenter: z.string().nullish(), status: CommonModels.InvoiceStatusEnumSchema, language: InvoiceLanguageEnumSchema, isVatOk: z.boolean(), isInvoiceOk: z.boolean(), issuingDate: z.iso.datetime({ offset: true }).nullish(), receiptDate: z.iso.datetime({ offset: true }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), serviceDateUntil: z.iso.datetime({ offset: true }).nullish(), dueDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), isExportedToBookkeeping: z.boolean(), sentAt: z.iso.datetime({ offset: true }).nullish(), creditNoteId: z.string().nullish(), draftCreditNoteId: z.string().nullish(), cancelledInvoiceId: z.string().nullish(), uploadedDocumentUrl: z.string().nullish(), customer: InvoiceCustomerDtoSchema.nullish(), customerNumber: z.string().nullish(), customerNameOverride: z.string().nullish(), customerReferenceOverride: z.string().nullish(), customerContactOverride: z.string().nullish(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), position: InvoicePositionDtoSchema.nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesOffice: InvoiceOfficeDtoSchema, salesRep: InvoiceSalesRepDtoSchema, totalNet: z.number(), totalVat: z.number().nullish(), totalGross: z.number(), currencyNotation: z.string(), exchangeRate: z.number().nullish(), paymentTermDays: z.number().nullish(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullish(), serviceRecipient: InvoiceServiceRecipientDtoSchema.nullish(), showPaymentInstructions: z.boolean().nullish(), dunningBlock: z.boolean().nullish(), invoiceInReview: z.boolean().nullish(), comments: z.string().nullish(), bankAccount: InvoiceBankAccountDtoSchema.nullish(), financeLines: z.array(InvoiceFinanceLineDtoSchema), remarks: InvoiceRemarksDtoSchema.nullish(), vatLines: z.array(InvoiceVatLineDtoSchema), config: InvoiceConfigDtoSchema.nullish(), creditNote: RelatedInvoiceDetailDtoSchema.nullish(), draftCreditNote: RelatedInvoiceDetailDtoSchema.nullish(), cancelledInvoice: RelatedInvoiceDetailDtoSchema.nullish(), officeCurrencyNotation: z.string().nullish(), inverseCurrencyNotation: z.string().nullish(), inverseExchangeRate: z.number().nullish(), requiresSpecialTablePresentation: z.boolean().nullish(), paidAmount: z.number(), outstandingAmount: z.number(), paidOn: z.iso.datetime({ offset: true }).nullish(), isIssued: z.boolean(), grossAmountInOfficeCurrency: z.number().nullish(), createdAt: z.iso.datetime({ offset: true }) }); -export type InvoiceDetailDto = z.infer; - -/** - * TotalAmountsDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ -export const TotalAmountsDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); -export type TotalAmountsDto = z.infer; - -/** - * OfficeInvoiceListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalAmountInDefaultCurrency - * @property { string } defaultCurrencyNotation - * @property { TotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const OfficeInvoiceListResponseDtoSchema = z.object({ items: z.array(z.string()), totalAmountInDefaultCurrency: z.number().nullish(), defaultCurrencyNotation: z.string().nullish(), totalAmounts: z.array(TotalAmountsDtoSchema), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type OfficeInvoiceListResponseDto = z.infer; - -/** - * InvoicePreviewPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { string } externalSystemId - */ -export const InvoicePreviewPositionDtoSchema = z.object({ id: z.string(), number: z.string(), externalSystemId: z.string().nullish() }); -export type InvoicePreviewPositionDto = z.infer; - -/** - * InvoicePreviewReceiverDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchCode - * @property { string } label - */ -export const InvoicePreviewReceiverDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type InvoicePreviewReceiverDto = z.infer; - -/** - * InvoicePreviewReceiverCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoicePreviewReceiverCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type InvoicePreviewReceiverCountryDto = z.infer; - -/** - * InvoicePreviewClerkDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const InvoicePreviewClerkDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type InvoicePreviewClerkDto = z.infer; - -/** - * VatRuleLabelResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } matchCode - * @property { string } name - */ -export const VatRuleLabelResponseDtoSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string() }); -export type VatRuleLabelResponseDto = z.infer; - -/** - * OfficeInvoicePreviewDtoSchema - * @type { object } - * @property { string } id - * @property { string } createdAt - * @property { string } invoiceNumber - * @property { string } invoiceDirection - * @property { string } issuingDate - * @property { CommonModels.InvoiceTypeEnum } invoiceType - * @property { boolean } collective - * @property { string } serviceDate - * @property { string } internalNumber - * @property { string } reference - * @property { number } amount - * @property { number } netAmount - * @property { number } tax - * @property { string } currency - * @property { string } dueDate - * @property { CommonModels.InvoiceStatusEnum } status - * @property { string } payDate - * @property { number } paidAmount - * @property { InvoicePreviewPositionDto } position - * @property { InvoicePreviewReceiverDto } receiver - * @property { InvoicePreviewReceiverCountryDto } receiverCountry - * @property { InvoicePreviewClerkDto } clerk - * @property { boolean } cancelled - * @property { boolean } ok - * @property { boolean } isExportedToBookkeeping - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { boolean } vatOk - * @property { string } comments - * @property { string } paymentComment - * @property { string } creditorId - * @property { string } debtorId - * @property { string } hblNumber - * @property { string } mblNumber - * @property { string } bookingNumber - * @property { string } vessel - * @property { string } voyage - * @property { VatRuleLabelResponseDto[] } vatRules - */ -export const OfficeInvoicePreviewDtoSchema = z.object({ id: z.string(), createdAt: z.iso.datetime({ offset: true }), invoiceNumber: z.string().nullish(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, issuingDate: z.iso.datetime({ offset: true }).nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema, collective: z.boolean(), serviceDate: z.iso.datetime({ offset: true }).nullish(), internalNumber: z.string().nullish(), reference: z.string().nullish(), amount: z.number(), netAmount: z.number(), tax: z.number(), currency: z.string(), dueDate: z.iso.datetime({ offset: true }).nullish(), status: CommonModels.InvoiceStatusEnumSchema, payDate: z.iso.datetime({ offset: true }).nullish(), paidAmount: z.number().nullish(), position: InvoicePreviewPositionDtoSchema.nullish(), receiver: InvoicePreviewReceiverDtoSchema.nullish(), receiverCountry: InvoicePreviewReceiverCountryDtoSchema.nullish(), clerk: InvoicePreviewClerkDtoSchema.nullish(), cancelled: z.boolean(), ok: z.boolean(), isExportedToBookkeeping: z.boolean(), dunningBlock: z.boolean(), invoiceInReview: z.boolean(), vatOk: z.boolean(), comments: z.string().nullish(), paymentComment: z.string().nullish(), creditorId: z.string().nullish(), debtorId: z.string().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vatRules: z.array(VatRuleLabelResponseDtoSchema).nullish() }); -export type OfficeInvoicePreviewDto = z.infer; - -/** - * InvoiceExportFilterDtoSchema - * @type { object } - * @property { string } search - * @property { CommonModels.DateRangeDto } issuingDate - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.InvoiceDirectionEnum[] } invoiceDirection - * @property { CommonModels.InvoiceTypeEnum[] } invoiceType - * @property { CommonModels.BooleanFilterEnum[] } collective - * @property { number } amountMin - * @property { number } amountMax - * @property { string[] } currencyNotation - * @property { CommonModels.DateRangeDto } dueDate - * @property { CommonModels.InvoiceStatusEnum[] } status - * @property { string[] } receiver Filter by invoice receiver/customer ID (UUID) - * @property { string } positionNumbersString - * @property { string[] } positionNumbers - * @property { string } invoiceNumbersString - * @property { string[] } invoiceNumbers - * @property { CommonModels.BooleanFilterEnum[] } bookkeepingExportStatus - * @property { CommonModels.BooleanFilterEnum[] } dunningBlock - * @property { CommonModels.BooleanFilterEnum[] } invoiceInReview - * @property { CommonModels.BooleanFilterEnum[] } isInvoiceOk - * @property { CommonModels.BooleanFilterEnum[] } isVatOk - * @property { number } invoiceNumberMin - * @property { number } invoiceNumberMax - * @property { number } internalNumberMin - * @property { number } internalNumberMax - */ -export const InvoiceExportFilterDtoSchema = z.object({ search: z.string().nullable(), issuingDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), invoiceDirection: z.array(CommonModels.InvoiceDirectionEnumSchema).nullable(), invoiceType: z.array(CommonModels.InvoiceTypeEnumSchema).nullable(), collective: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), amountMin: z.number().nullable(), amountMax: z.number().nullable(), currencyNotation: z.array(z.string()).nullable(), dueDate: CommonModels.DateRangeDtoSchema.nullable(), status: z.array(CommonModels.InvoiceStatusEnumSchema).nullable(), receiver: z.array(z.string()).nullable(), positionNumbersString: z.string().nullable(), positionNumbers: z.array(z.string()).nullable(), invoiceNumbersString: z.string().nullable(), invoiceNumbers: z.array(z.string()).nullable(), bookkeepingExportStatus: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), dunningBlock: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceInReview: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isInvoiceOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isVatOk: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), invoiceNumberMin: z.number().nullable(), invoiceNumberMax: z.number().nullable(), internalNumberMin: z.number().nullable(), internalNumberMax: z.number().nullable() }).partial(); -export type InvoiceExportFilterDto = z.infer; - -/** - * InvoiceExportColumnSchema - * @type { enum } - */ -export const InvoiceExportColumnSchema = z.enum(["invoiceNumber", "invoiceDirection", "issuingDate", "invoiceType", "collective", "serviceDate", "internalNumber", "reference", "totalGross", "totalNet", "totalVat", "currency", "dueDate", "status", "payDate", "paidAmount", "positionNumber", "hblHawb", "mblMawb", "bookingNumber", "vessel", "voyage", "receiverName", "receiverCountry", "clerkName", "cancelled", "ok", "vatOk", "dunningBlock", "invoiceInReview", "exportedToBookkeeping", "comments", "paymentComment", "vatRuleIds", "creditorId", "debtorId", "createdAt"]); -export type InvoiceExportColumn = z.infer; -export const InvoiceExportColumn = InvoiceExportColumnSchema.enum; - -/** - * InvoiceExportRequestDtoSchema - * @type { object } - * @property { InvoiceExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { InvoiceExportFilterDto } filter - */ -export const InvoiceExportRequestDtoSchema = z.object({ columns: z.array(InvoiceExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: InvoiceExportFilterDtoSchema.nullable() }).partial(); -export type InvoiceExportRequestDto = z.infer; - -/** - * UninvoicedChargeTotalAmountDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currencyNotation - */ -export const UninvoicedChargeTotalAmountDtoSchema = z.object({ amount: z.number(), currencyNotation: z.string() }); -export type UninvoicedChargeTotalAmountDto = z.infer; - -/** - * UninvoicedChargeListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const UninvoicedChargeListResponseDtoSchema = z.object({ items: z.array(z.string()), totalAmounts: z.array(UninvoicedChargeTotalAmountDtoSchema), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type UninvoicedChargeListResponseDto = z.infer; - -/** - * ReceiverDtoSchema - * @type { object } - * @property { string } id Business Partner ID (Customer or Vendor) - * @property { string } name Business Partner name - * @property { string } matchCode Business Partner match code - * @property { string } label Display label: matchCode when office.usePartnerMatchCodes, else name - */ -export const ReceiverDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }); -export type ReceiverDto = z.infer; - -/** - * UninvoicedChargePositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const UninvoicedChargePositionDtoSchema = z.object({ id: z.string(), number: z.string() }); -export type UninvoicedChargePositionDto = z.infer; - -/** - * UninvoicedChargeChargeTypeDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const UninvoicedChargeChargeTypeDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type UninvoicedChargeChargeTypeDto = z.infer; - -/** - * UninvoicedChargeVatRuleDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } matchcode - */ -export const UninvoicedChargeVatRuleDtoSchema = z.object({ id: z.string(), name: z.string(), matchcode: z.string() }); -export type UninvoicedChargeVatRuleDto = z.infer; - -/** - * UninvoicedChargeGroupStatusEnumSchema - * @type { enum } - */ -export const UninvoicedChargeGroupStatusEnumSchema = z.enum(["ReadyForInvoice", "MissingInformation"]); -export type UninvoicedChargeGroupStatusEnum = z.infer; -export const UninvoicedChargeGroupStatusEnum = UninvoicedChargeGroupStatusEnumSchema.enum; - -/** - * UninvoicedChargeEmployeeDtoSchema - * @type { object } - * @property { string } id - * @property { string } firstName - * @property { string } lastName - * @property { string } fullName - */ -export const UninvoicedChargeEmployeeDtoSchema = z.object({ id: z.string(), firstName: z.string(), lastName: z.string(), fullName: z.string() }); -export type UninvoicedChargeEmployeeDto = z.infer; - -/** - * UninvoicedChargeDtoSchema - * @type { object } - * @property { string } chargeItemId - * @property { CommonModels.InvoiceDirectionEnum } invoiceDirection Invoice direction (Incoming or Outgoing) - * @property { ReceiverDto } receiver Business Partner receiving the invoice - * @property { UninvoicedChargePositionDto } position - * @property { UninvoicedChargeChargeTypeDto } chargeType - * @property { string } currencyNotation ISO 4217 currency code - * @property { number } amount Charge amount in charge currency - * @property { number } amountInOfficeCurrency Charge amount in office currency - * @property { string } officeCurrency Office currency code - * @property { number } exchangeRate - * @property { UninvoicedChargeVatRuleDto } vatRule - * @property { string } serviceDate - * @property { UninvoicedChargeGroupStatusEnum } status Status of charge group - * @property { string[] } missingInformation Missing fields required for invoicing this charge - * @property { UninvoicedChargeEmployeeDto } employee - */ -export const UninvoicedChargeDtoSchema = z.object({ chargeItemId: z.string(), invoiceDirection: CommonModels.InvoiceDirectionEnumSchema, receiver: ReceiverDtoSchema, position: UninvoicedChargePositionDtoSchema, chargeType: UninvoicedChargeChargeTypeDtoSchema.nullish(), currencyNotation: z.string(), amount: z.number(), amountInOfficeCurrency: z.number(), officeCurrency: z.string(), exchangeRate: z.number().nullish(), vatRule: UninvoicedChargeVatRuleDtoSchema.nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), status: UninvoicedChargeGroupStatusEnumSchema, missingInformation: z.array(z.string()).nullish(), employee: UninvoicedChargeEmployeeDtoSchema.nullish() }); -export type UninvoicedChargeDto = z.infer; - -/** - * UninvoicedChargePaginationDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string } receiverId - * @property { string } chargeTypeId - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currency - * @property { string } vatRuleId - */ -export const UninvoicedChargePaginationDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), chargeItemId: z.string().nullable(), receiverId: z.string().nullable(), chargeTypeId: z.string().nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), currency: z.array(z.string()).nullable(), vatRuleId: z.string().nullable() }).partial(); -export type UninvoicedChargePaginationDto = z.infer; - -/** - * UninvoicedChargesFilterDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string[] } receiverIds - * @property { string[] } positionIds - * @property { string[] } chargeTypeIds - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currencies - * @property { string[] } vatRuleIds - * @property { string[] } employeeIds - */ -export const UninvoicedChargesFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), chargeItemId: z.string().nullable(), receiverIds: z.array(z.string()).nullable(), positionIds: z.array(z.string()).nullable(), chargeTypeIds: z.array(z.string()).nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), currencies: z.array(z.string()).nullable(), vatRuleIds: z.array(z.string()).nullable(), employeeIds: z.array(z.string()).nullable() }).partial(); -export type UninvoicedChargesFilterDto = z.infer; - -/** - * UninvoicedChargesExportFilterDtoSchema - * @type { object } - * @property { string } direction Filter by invoice direction - * @property { string } chargeItemId - * @property { string[] } receiverIds - * @property { string[] } positionIds - * @property { string[] } chargeTypeIds - * @property { CommonModels.DateRangeDto } serviceDate - * @property { string[] } currencies - * @property { string[] } vatRuleIds - */ -export const UninvoicedChargesExportFilterDtoSchema = z.object({ direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), chargeItemId: z.string().nullable(), receiverIds: z.array(z.string()).nullable(), positionIds: z.array(z.string()).nullable(), chargeTypeIds: z.array(z.string()).nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), currencies: z.array(z.string()).nullable(), vatRuleIds: z.array(z.string()).nullable() }).partial(); -export type UninvoicedChargesExportFilterDto = z.infer; - -/** - * UninvoicedChargeExportColumnSchema - * @type { enum } - */ -export const UninvoicedChargeExportColumnSchema = z.enum(["chargeItemId", "invoiceDirection", "status", "receiverName", "positionNumber", "serviceDate", "employee", "chargeTypeName", "amount", "currency", "exchangeRate", "amountInOfficeCurrency", "officeCurrency", "vatRule"]); -export type UninvoicedChargeExportColumn = z.infer; -export const UninvoicedChargeExportColumn = UninvoicedChargeExportColumnSchema.enum; - -/** - * UninvoicedChargesExportRequestDtoSchema - * @type { object } - * @property { UninvoicedChargeExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { UninvoicedChargesExportFilterDto } filter - */ -export const UninvoicedChargesExportRequestDtoSchema = z.object({ columns: z.array(UninvoicedChargeExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: UninvoicedChargesExportFilterDtoSchema.nullable() }).partial(); -export type UninvoicedChargesExportRequestDto = z.infer; - -/** - * CreateDraftInvoiceRequestDtoSchema - * @type { object } - * @property { string[] } chargeItemIds Charge item IDs to include in the invoice. Min Items: `1` - * @property { CommonModels.InvoiceTypeEnum } invoiceType Type of invoice - * @property { string } customerId Customer ID (required for outgoing invoices) - * @property { CommonModels.InvoiceDirectionEnum } direction Invoice direction - */ -export const CreateDraftInvoiceRequestDtoSchema = z.object({ chargeItemIds: z.array(z.string()).min(1).nullish(), invoiceType: CommonModels.InvoiceTypeEnumSchema, customerId: z.string(), direction: CommonModels.InvoiceDirectionEnumSchema }); -export type CreateDraftInvoiceRequestDto = z.infer; - -/** - * UpdateInvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const UpdateInvoiceRemarksDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); -export type UpdateInvoiceRemarksDto = z.infer; - -/** - * UpdateInvoiceCustomerDtoSchema - * @type { object } - * @property { string } name - * @property { string } reference - * @property { string } contact - */ -export const UpdateInvoiceCustomerDtoSchema = z.object({ name: z.string().nullable(), reference: z.string().nullable(), contact: z.string().nullable() }).partial(); -export type UpdateInvoiceCustomerDto = z.infer; - -/** - * UpdateInvoiceRequestDtoSchema - * @type { object } - * @property { string } issuingDate Invoice date in ISO format - * @property { string } receiptDate Receipt date in ISO format - * @property { string } serviceDate Service date in ISO format - * @property { string } serviceDateUntil Service end date in ISO format - * @property { string } dueDate Due date in ISO format - * @property { string } invoiceNumber Invoice number - * @property { string } internalNumber Internal reference number - * @property { number } paymentTermDays Payment term in days - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { string } serviceRecipientId Service recipient ID - * @property { string } bankAccountId Bank account ID - * @property { UpdateInvoiceRemarksDto } remarks Additional remarks - * @property { InvoiceLanguageEnum } language Invoice language - * @property { boolean } showPaymentInstructions - * @property { UpdateInvoiceCustomerDto } customer - * @property { string } salesRepId - * @property { string } currencyNotation - * @property { number } exchangeRate Invoice exchange rate - */ -export const UpdateInvoiceRequestDtoSchema = z.object({ issuingDate: z.iso.datetime({ offset: true }).nullable(), receiptDate: z.iso.datetime({ offset: true }).nullable(), serviceDate: z.iso.datetime({ offset: true }).nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).nullable(), dueDate: z.iso.datetime({ offset: true }).nullable(), invoiceNumber: z.string().nullable(), internalNumber: z.string().nullable(), paymentTermDays: z.number().nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullable(), serviceRecipientId: z.string().nullable(), bankAccountId: z.string().nullable(), remarks: UpdateInvoiceRemarksDtoSchema.nullable(), language: InvoiceLanguageEnumSchema.nullable(), showPaymentInstructions: z.boolean().nullable(), customer: UpdateInvoiceCustomerDtoSchema.nullable(), salesRepId: z.string().nullable(), currencyNotation: z.string().nullable(), exchangeRate: z.number().nullable() }).partial(); -export type UpdateInvoiceRequestDto = z.infer; - -/** - * FixInvoiceRemarksDtoSchema - * @type { object } - * @property { string } html - * @property { object } json - * @property { any } json.[key] - */ -export const FixInvoiceRemarksDtoSchema = z.object({ html: z.string().nullable(), json: z.object({}).catchall(z.any()).nullable() }).partial(); -export type FixInvoiceRemarksDto = z.infer; - -/** - * FixInvoiceCustomerDtoSchema - * @type { object } - * @property { string } reference Customer reference number - */ -export const FixInvoiceCustomerDtoSchema = z.object({ reference: z.string().nullable() }).partial(); -export type FixInvoiceCustomerDto = z.infer; - -/** - * FixInvoiceRequestDtoSchema - * @type { object } - * @property { string } currencyNotation Invoice currency (incoming invoices only) - * @property { string } issuingDate Update invoice date in ISO format - * @property { string } dueDate Update invoice due date in ISO format - * @property { number } exchangeRate Invoice exchange rate - * @property { number } paymentTermDays Payment term in days - * @property { CommonModels.OfficePaymentTermsDateType } paymentTermType - * @property { string } receiptDate Update receipt date in ISO format - * @property { string } serviceDate Update service date in ISO format - * @property { string } serviceDateUntil Update service end date in ISO format - * @property { boolean } isVatOk Mark VAT as checked/OK by accounting - * @property { boolean } isInvoiceOk Mark overall invoice as checked/OK by accounting - * @property { boolean } dunningBlock - * @property { boolean } invoiceInReview - * @property { string } comments - * @property { FixInvoiceRemarksDto } remarks Additional remarks - * @property { string } invoiceNumber Invoice number (incoming invoices only) - * @property { string } bankAccountId Bank account ID - * @property { string } serviceRecipientId Service recipient ID - * @property { FixInvoiceCustomerDto } customer Customer reference (incoming invoices only) - */ -export const FixInvoiceRequestDtoSchema = z.object({ currencyNotation: z.string().nullable(), issuingDate: z.iso.datetime({ offset: true }).nullable(), dueDate: z.iso.datetime({ offset: true }).nullable(), exchangeRate: z.number().nullable(), paymentTermDays: z.number().nullable(), paymentTermType: CommonModels.OfficePaymentTermsDateTypeSchema.nullable(), receiptDate: z.iso.datetime({ offset: true }).nullable(), serviceDate: z.iso.datetime({ offset: true }).nullable(), serviceDateUntil: z.iso.datetime({ offset: true }).nullable(), isVatOk: z.boolean().nullable(), isInvoiceOk: z.boolean().nullable(), dunningBlock: z.boolean().nullable(), invoiceInReview: z.boolean().nullable(), comments: z.string().nullable(), remarks: FixInvoiceRemarksDtoSchema.nullable(), invoiceNumber: z.string().nullable(), bankAccountId: z.string().nullable(), serviceRecipientId: z.string().nullable(), customer: FixInvoiceCustomerDtoSchema.nullable() }).partial(); -export type FixInvoiceRequestDto = z.infer; - -/** - * UpdateIssuedInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity. Minimum: `0` - * @property { number } amount Amount (must be positive). Minimum: `0.01` - * @property { string } vatRuleId VAT rule ID - * @property { number } exchangeRate Charge exchange rate (incoming invoices only) - * @property { string } currencyNotation - */ -export const UpdateIssuedInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string(), chargeTypeId: z.string().nullish(), additionalText: z.string().nullish(), quantity: z.number().gte(0).nullish(), amount: z.number().gte(0.01).nullish(), vatRuleId: z.string().nullish(), exchangeRate: z.number().nullish(), currencyNotation: z.string().nullish() }); -export type UpdateIssuedInvoiceChargeRequestDto = z.infer; - -/** - * UpdateIssuedInvoiceChargesRequestDtoSchema - * @type { object } - * @property { UpdateIssuedInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` - */ -export const UpdateIssuedInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateIssuedInvoiceChargeRequestDtoSchema).min(1) }); -export type UpdateIssuedInvoiceChargesRequestDto = z.infer; - -/** - * UpdateInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity. Minimum: `0` - * @property { number } amount Amount (must be positive). Minimum: `0.01` - * @property { string } vatRuleId VAT rule ID - * @property { number } exchangeRate - * @property { string } currencyNotation - */ -export const UpdateInvoiceChargeRequestDtoSchema = z.object({ positionChargeItemId: z.string(), chargeTypeId: z.string().nullish(), additionalText: z.string().nullish(), quantity: z.number().gte(0).nullish(), amount: z.number().gte(0.01).nullish(), vatRuleId: z.string().nullish(), exchangeRate: z.number().nullish(), currencyNotation: z.string().nullish() }); -export type UpdateInvoiceChargeRequestDto = z.infer; - -/** - * UpdateInvoiceChargesRequestDtoSchema - * @type { object } - * @property { UpdateInvoiceChargeRequestDto[] } charges Array of charge updates. Min Items: `1` - */ -export const UpdateInvoiceChargesRequestDtoSchema = z.object({ charges: z.array(UpdateInvoiceChargeRequestDtoSchema).min(1) }); -export type UpdateInvoiceChargesRequestDto = z.infer; - -/** - * InvoiceFilterDtoSchema - * @type { object } - * @property { string[] } status - * @property { string } direction - * @property { string } receiver Filter by invoice receiver/customer ID (UUID) - */ -export const InvoiceFilterDtoSchema = z.object({ status: z.array(CommonModels.InvoiceStatusEnumSchema).nullable(), direction: CommonModels.InvoiceDirectionEnumSchema.nullable(), receiver: z.string().nullable() }).partial(); -export type InvoiceFilterDto = z.infer; - -/** - * ChangeInvoiceCustomerRequestDtoSchema - * @type { object } - * @property { string } newCustomerId - */ -export const ChangeInvoiceCustomerRequestDtoSchema = z.object({ newCustomerId: z.uuid() }); -export type ChangeInvoiceCustomerRequestDto = z.infer; - -/** - * CreateDirectInvoiceChargeRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const CreateDirectInvoiceChargeRequestDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); -export type CreateDirectInvoiceChargeRequestDto = z.infer; - -/** - * UpdateIssuedInvoiceVatRulesRequestDtoSchema - * @type { object } - * @property { string } positionChargeItemId Position charge item ID - * @property { string } vatRuleId VAT rule ID - */ -export const UpdateIssuedInvoiceVatRulesRequestDtoSchema = z.object({ positionChargeItemId: z.string(), vatRuleId: z.string() }); -export type UpdateIssuedInvoiceVatRulesRequestDto = z.infer; - -/** - * PrepareUploadRequestDtoSchema - * @type { object } - * @property { string } filename - * @property { string } mimeType - * @property { number } fileSize - */ -export const PrepareUploadRequestDtoSchema = z.object({ filename: z.string().nullish(), mimeType: z.string(), fileSize: z.number() }); -export type PrepareUploadRequestDto = z.infer; - -/** - * InvoiceUploadInstructionsDtoSchema - * @type { object } - * @property { string } url Pre-signed URL for the PUT request to storage - * @property { string } method HTTP method to use for upload - */ -export const InvoiceUploadInstructionsDtoSchema = z.object({ url: z.string(), method: z.string() }); -export type InvoiceUploadInstructionsDto = z.infer; - -/** - * GetInvoicesEmlInvoiceIdsParamSchema - * @type { array } - */ -export const GetInvoicesEmlInvoiceIdsParamSchema = z.array(z.string()).nullish(); -export type GetInvoicesEmlInvoiceIdsParam = z.infer; - -/** - * InvoicesFindOrderParamEnumSchema - * @type { enum } - */ -export const InvoicesFindOrderParamEnumSchema = z.enum(["status", "createdAt", "serviceDate"]); -export type InvoicesFindOrderParamEnum = z.infer; -export const InvoicesFindOrderParamEnum = InvoicesFindOrderParamEnumSchema.enum; - -/** - * InvoicesFindResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { InvoicePreviewDto[] } items - */ -export const InvoicesFindResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(InvoicePreviewDtoSchema).nullable() }).partial().shape }); -export type InvoicesFindResponse = z.infer; - -/** - * FindByOfficeOrderParamEnumSchema - * @type { enum } - */ -export const FindByOfficeOrderParamEnumSchema = z.enum(["invoiceNumber", "issuingDate", "invoiceType", "amount", "netAmount", "currencyNotation", "dueDate", "status", "paidOn", "serviceDate", "internalNumber", "positionNumber", "invoiceDirection", "receiver", "receiverCountry", "paidAmount", "totalVat", "dunningBlock", "invoiceInReview", "isInvoiceOk", "isVatOk", "comments", "salesRepName", "isExportedToBookkeeping", "createdAt", "customerReferenceOverride", "externalSystemId"]); -export type FindByOfficeOrderParamEnum = z.infer; -export const FindByOfficeOrderParamEnum = FindByOfficeOrderParamEnumSchema.enum; - -/** - * FindByOfficeResponseSchema - * @type { object } - * @property { number } totalAmountInDefaultCurrency - * @property { string } defaultCurrencyNotation - * @property { TotalAmountsDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficeInvoicePreviewDto[] } items - */ -export const FindByOfficeResponseSchema = z.object({ ...OfficeInvoiceListResponseDtoSchema.shape, ...z.object({ items: z.array(OfficeInvoicePreviewDtoSchema).nullable() }).partial().shape }); -export type FindByOfficeResponse = z.infer; - -/** - * GetUnChargesOrderParamEnumSchema - * @type { enum } - */ -export const GetUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); -export type GetUnChargesOrderParamEnum = z.infer; -export const GetUnChargesOrderParamEnum = GetUnChargesOrderParamEnumSchema.enum; - -/** - * GetUnChargesResponseSchema - * @type { object } - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { UninvoicedChargeDto[] } items - */ -export const GetUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).nullable() }).partial().shape }); -export type GetUnChargesResponse = z.infer; - -/** - * InvoicesListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ -export const InvoicesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).nullable() }).partial().shape }); -export type InvoicesListAvailablePartnersForResponse = z.infer; - -/** - * GetOfficeUnChargesOrderParamEnumSchema - * @type { enum } - */ -export const GetOfficeUnChargesOrderParamEnumSchema = z.enum(["chargeItemId", "orderPosition", "serviceDate", "receiverId", "positionNumber", "chargeTypeId", "currency", "vatRuleId"]); -export type GetOfficeUnChargesOrderParamEnum = z.infer; -export const GetOfficeUnChargesOrderParamEnum = GetOfficeUnChargesOrderParamEnumSchema.enum; - -/** - * GetOfficeUnChargesResponseSchema - * @type { object } - * @property { UninvoicedChargeTotalAmountDto[] } totalAmounts - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { UninvoicedChargeDto[] } items - */ -export const GetOfficeUnChargesResponseSchema = z.object({ ...UninvoicedChargeListResponseDtoSchema.shape, ...z.object({ items: z.array(UninvoicedChargeDtoSchema).nullable() }).partial().shape }); -export type GetOfficeUnChargesResponse = z.infer; - -} diff --git a/test/generated/next/invoices/invoices.queries.ts b/test/generated/next/invoices/invoices.queries.ts deleted file mode 100644 index 528519a..0000000 --- a/test/generated/next/invoices/invoices.queries.ts +++ /dev/null @@ -1,1123 +0,0 @@ -import axios, { } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { InvoicesAcl } from "./invoices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { InvoicesModels } from "./invoices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { InvoicesApi } from "./invoices.api"; - -export namespace InvoicesQueries { -export const moduleName = QueryModule.Invoices; - -export const keys = { - all: [moduleName] as const, - getInvoicesEml: (officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam) => [...keys.all, "/offices/:officeId/invoices/eml", officeId, invoiceIds] as const, - find: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", officeId, positionId, limit, order, filter, page, cursor] as const, - findInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/invoices", "infinite", officeId, positionId, limit, order, filter, cursor] as const, - findByOffice: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", officeId, limit, order, filter, page, cursor] as const, - findByOfficeInfinite: (officeId: string, limit?: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/invoices", "infinite", officeId, limit, order, filter, cursor] as const, - getUnCharges: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", officeId, positionId, limit, order, filter, page, cursor] as const, - getUnChargesInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/uninvoiced-charges", "infinite", officeId, positionId, limit, order, filter, cursor] as const, - listAvailablePartnersFor: (officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/available-partners", officeId, invoiceId, search, useCase] as const, - getOfficeUnCharges: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", officeId, limit, order, filter, page, cursor] as const, - getOfficeUnChargesInfinite: (officeId: string, limit?: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/uninvoiced-charges", "infinite", officeId, limit, order, filter, cursor] as const, - getDetail: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId", officeId, invoiceId] as const, - getPreview: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/preview", officeId, invoiceId] as const, - getInvoiceEml: (officeId: string, invoiceId: string) => [...keys.all, "/offices/:officeId/invoices/:invoiceId/eml", officeId, invoiceId] as const, -}; - -/** - * Query `useGetInvoicesEml` - recommended when file should be cached - * @summary Get invoices as EML file with PDF attachments - * @permission Requires `canUseGetInvoicesEml` ability - * @param { string } object.officeId Path parameter - * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } object.invoiceIds Query parameter. Invoice IDs - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoicesEml = ({ officeId, invoiceIds }: { officeId: string, invoiceIds?: InvoicesModels.GetInvoicesEmlInvoiceIdsParam }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvoicesEml(officeId, invoiceIds), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds) }, - ...options, - }); -}; - -/** - * Mutation `useGetInvoicesEmlMutation` - recommended when file should not be cached - * @summary Get invoices as EML file with PDF attachments - * @permission Requires `canUseGetInvoicesEml` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.GetInvoicesEmlInvoiceIdsParam } mutation.invoiceIds Query parameter. Invoice IDs - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoicesEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceIds }) => { - checkAcl(InvoicesAcl.canUseGetInvoicesEml({ officeId } )); - return InvoicesApi.getInvoicesEml(officeId, invoiceIds) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFind` - * @summary List invoices for a position - * @permission Requires `canUseFind` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` - * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFind = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.find(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseFind({ officeId } )); - return InvoicesApi.find(officeId, positionId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindInfinite - * @summary List invoices for a position - * @permission Requires `canUseFind` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): status, createdAt, serviceDate. Example: `status` - * @param { InvoicesModels.InvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.InvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseFind({ officeId } )); - return InvoicesApi.find(officeId, positionId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useChangeIncomingCustomer` - * @summary Change incoming invoice customer and update vendors on registered charges - * @permission Requires `canUseChangeIncomingCustomer` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.ChangeInvoiceCustomerRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useChangeIncomingCustomer = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseChangeIncomingCustomer({ officeId } )); - return InvoicesApi.changeIncomingCustomer(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindByOffice` - * @summary List invoices for an office - * @permission Requires `canUseFindByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindByOffice = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findByOffice(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); - return InvoicesApi.findByOffice(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindByOfficeInfinite - * @summary List invoices for an office - * @permission Requires `canUseFindByOffice` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): invoiceNumber, issuingDate, invoiceType, amount, netAmount, currencyNotation, dueDate, status, paidOn, serviceDate, internalNumber, positionNumber, invoiceDirection, receiver, receiverCountry, paidAmount, totalVat, dunningBlock, invoiceInReview, isInvoiceOk, isVatOk, comments, salesRepName, isExportedToBookkeeping, createdAt, customerReferenceOverride, externalSystemId. Example: `invoiceNumber` - * @param { CommonModels.OfficeInvoiceFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindByOfficeInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: CommonModels.OfficeInvoiceFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findByOfficeInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseFindByOffice({ officeId } )); - return InvoicesApi.findByOffice(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateDraft` - * @summary Create a draft invoice from charge items - * @permission Requires `canUseCreateDraft` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.CreateDraftInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useCreateDraft = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseCreateDraft({ officeId } )); - return InvoicesApi.createDraft(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportInvoices` - recommended when file should not be cached - * @summary Export invoices to Excel - * @permission Requires `canUseExportInvoices` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportInvoices = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportInvoices({ officeId } )); - return InvoicesApi.exportInvoices(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useExportCharges` - recommended when file should not be cached - * @summary Export invoice charges as Excel file - * @permission Requires `canUseExportCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.InvoiceExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportCharges({ officeId } )); - return InvoicesApi.exportCharges(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetUnCharges` - * @summary Get uninvoiced charges for a position - * @permission Requires `canUseGetUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetUnCharges = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getUnCharges(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useGetUnChargesInfinite - * @summary Get uninvoiced charges for a position - * @permission Requires `canUseGetUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargePaginationDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetUnChargesInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargePaginationDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getUnChargesInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseGetUnCharges({ officeId } )); - return InvoicesApi.getUnCharges(officeId, positionId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for an invoice (union of position involved parties) - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListAvailablePartnersFor = ({ officeId, invoiceId, search, useCase }: { officeId: string, invoiceId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, invoiceId, search, useCase), - queryFn: () => { - checkAcl(InvoicesAcl.canUseListAvailablePartnersFor({ officeId } )); - return InvoicesApi.listAvailablePartnersFor(officeId, invoiceId, search, useCase) }, - ...options, - }); -}; - -/** - * Query `useGetOfficeUnCharges` - * @summary Get uninvoiced charges for all positions in an office - * @permission Requires `canUseGetOfficeUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetOfficeUnCharges = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getOfficeUnCharges(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useGetOfficeUnChargesInfinite - * @summary Get uninvoiced charges for all positions in an office - * @permission Requires `canUseGetOfficeUnCharges` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): chargeItemId, orderPosition, serviceDate, receiverId, positionNumber, chargeTypeId, currency, vatRuleId. Example: `chargeItemId` - * @param { InvoicesModels.UninvoicedChargesFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetOfficeUnChargesInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: InvoicesModels.UninvoicedChargesFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getOfficeUnChargesInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(InvoicesAcl.canUseGetOfficeUnCharges({ officeId } )); - return InvoicesApi.getOfficeUnCharges(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useExportUnCharges` - recommended when file should not be cached - * @summary Export uninvoiced charges as Excel file - * @permission Requires `canUseExportUnCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { InvoicesModels.UninvoicedChargesExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportUnCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(InvoicesAcl.canUseExportUnCharges({ officeId } )); - return InvoicesApi.exportUnCharges(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateDirect` - * @summary Dummy endpoint to expose direct invoice permission to FE - * @permission Requires `canUseCreateDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useCreateDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId }) => { - checkAcl(InvoicesAcl.canUseCreateDirect({ officeId } )); - return InvoicesApi.createDirect(officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useAddChargeToDirect` - * @summary Add a charge to a direct invoice - * @permission Requires `canUseAddChargeToDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.CreateDirectInvoiceChargeRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useAddChargeToDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseAddChargeToDirect({ officeId } )); - return InvoicesApi.addChargeToDirect(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateCharges` - * @summary Update charges on a draft invoice - * @permission Requires `canUseUpdateCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateInvoiceChargesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdateCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateCharges({ officeId } )); - return InvoicesApi.updateCharges(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRemoveChargeFromDirect` - * @summary Remove a charge from a direct invoice - * @permission Requires `canUseRemoveChargeFromDirect` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { string } mutation.chargeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useRemoveChargeFromDirect = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, chargeId }) => { - checkAcl(InvoicesAcl.canUseRemoveChargeFromDirect({ officeId } )); - return InvoicesApi.removeChargeFromDirect(officeId, invoiceId, chargeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetDetail` - * @summary Get invoice details - * @permission Requires `canUseGetDetail` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, default] - */ -export const useGetDetail = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDetail(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetDetail({ officeId } )); - return InvoicesApi.getDetail(officeId, invoiceId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update invoice details - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdate({ officeId } )); - return InvoicesApi.update(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteInvoice` - * @summary Delete invoice - * @permission Requires `canUseDeleteInvoice` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteInvoice = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseDeleteInvoice({ officeId } )); - return InvoicesApi.deleteInvoice(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useFix` - * @summary Fix invoice with accounting permission - * @permission Requires `canUseFix` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.FixInvoiceRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useFix = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseFix({ officeId } )); - return InvoicesApi.fix(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerate` - recommended when file should not be cached - * @summary Generate an invoice PDF - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGenerate({ officeId } )); - return InvoicesApi.generate(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateIssuedVatRules` - * @summary Update VAT rules on issued invoice charges - * @permission Requires `canUseUpdateIssuedVatRules` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateIssuedInvoiceVatRulesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdateIssuedVatRules = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateIssuedVatRules({ officeId } )); - return InvoicesApi.updateIssuedVatRules(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateIssuedCharges` - * @summary Update charges on issued invoice - * @permission Requires `canUseUpdateIssuedCharges` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.UpdateIssuedInvoiceChargesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useUpdateIssuedCharges = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId, data }) => { - checkAcl(InvoicesAcl.canUseUpdateIssuedCharges({ officeId } )); - return InvoicesApi.updateIssuedCharges(officeId, invoiceId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useIssue` - recommended when file should not be cached - * @summary Issue outgoing invoice - * @permission Requires `canUseIssue` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useIssue = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseIssue({ officeId } )); - return InvoicesApi.issue(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReportHungarian` - * @summary Report invoice to Hungarian tax authority - * @permission Requires `canUseReportHungarian` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReportHungarian = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseReportHungarian({ officeId } )); - return InvoicesApi.reportHungarian(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateIncoming` - recommended when file should not be cached - * @summary Re-Generate an invoice PDF - * @permission Requires `canUseGenerateIncoming` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGenerateIncoming = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGenerateIncoming({ officeId } )); - return InvoicesApi.generateIncoming(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRegister` - * @summary Register incoming invoice - * @permission Requires `canUseRegister` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useRegister = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseRegister({ officeId } )); - return InvoicesApi.register(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetPreview` - recommended when file should be cached - * @summary Get invoice PDF preview - * @permission Requires `canUseGetPreview` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetPreview = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getPreview(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); - return InvoicesApi.getPreview(officeId, invoiceId) }, - ...options, - }); -}; - -/** - * Mutation `useGetPreviewMutation` - recommended when file should not be cached - * @summary Get invoice PDF preview - * @permission Requires `canUseGetPreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetPreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGetPreview({ officeId } )); - return InvoicesApi.getPreview(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetInvoiceEml` - recommended when file should be cached - * @summary Get invoice as EML file with PDF attachment - * @permission Requires `canUseGetInvoiceEml` ability - * @param { string } object.officeId Path parameter - * @param { string } object.invoiceId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoiceEml = ({ officeId, invoiceId }: { officeId: string, invoiceId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvoiceEml(officeId, invoiceId), - queryFn: () => { - checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); - return InvoicesApi.getInvoiceEml(officeId, invoiceId) }, - ...options, - }); -}; - -/** - * Mutation `useGetInvoiceEmlMutation` - recommended when file should not be cached - * @summary Get invoice as EML file with PDF attachment - * @permission Requires `canUseGetInvoiceEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGetInvoiceEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseGetInvoiceEml({ officeId } )); - return InvoicesApi.getInvoiceEml(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getInvoicesEml(officeId), keys.getPreview(officeId, invoiceId), keys.getInvoiceEml(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `usePrepareDocumentUpload` - * @summary Prepare for invoice document upload - * @permission Requires `canUsePrepareDocumentUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { InvoicesModels.PrepareUploadRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const usePrepareDocumentUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, invoiceId, data, file, abortController, onUploadProgress }) => { - checkAcl(InvoicesAcl.canUsePrepareDocumentUpload({ officeId } )); - const uploadInstructions = await InvoicesApi.prepareDocumentUpload(officeId, invoiceId, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCancel` - * @summary Cancel invoice (create draft credit note) - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, default] - */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseCancel({ officeId } )); - return InvoicesApi.cancel(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useIssueCreditNote` - * @summary Issue credit invoice - * @permission Requires `canUseIssueCreditNote` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.invoiceId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, default] - */ -export const useIssueCreditNote = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, invoiceId }) => { - checkAcl(InvoicesAcl.canUseIssueCreditNote({ officeId } )); - return InvoicesApi.issueCreditNote(officeId, invoiceId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, invoiceId } = variables; - const updateKeys = [keys.getDetail(officeId, invoiceId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/masterData/masterData.acl.ts b/test/generated/next/masterData/masterData.acl.ts deleted file mode 100644 index 2c0c2c9..0000000 --- a/test/generated/next/masterData/masterData.acl.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace MasterDataAcl { -/** - * Use for `useFindAll` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Depot" -] as AbilityTuple<"Read", "Depot">; - -} diff --git a/test/generated/next/masterData/masterData.api.ts b/test/generated/next/masterData/masterData.api.ts deleted file mode 100644 index 5eaf692..0000000 --- a/test/generated/next/masterData/masterData.api.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { MasterDataModels } from "./masterData.models"; - -export namespace MasterDataApi { -export const findAll = (officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string, ) => { - return AppRestClient.get( - { resSchema: MasterDataModels.MasterDataItemsResponseDTOSchema }, - `/offices/${officeId}/master-data/autocomplete`, - { - params: { - types: ZodExtended.parse(MasterDataModels.MasterDataFindAllTypesParamSchema, types, { type: "query", name: "types" }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -export const paginate = (officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: MasterDataModels.MasterDataPaginateResponseSchema }, - `/offices/${officeId}/master-data/labels/paginated`, - { - params: { - types: ZodExtended.parse(MasterDataModels.MasterDataPaginateTypesParamSchema, types, { type: "query", name: "types" }), - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/next/masterData/masterData.configs.ts b/test/generated/next/masterData/masterData.configs.ts deleted file mode 100644 index 06f2f06..0000000 --- a/test/generated/next/masterData/masterData.configs.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { dynamicColumns } from "@povio/ui"; -import { MasterDataModels } from "./masterData.models"; -import { MasterDataQueries } from "./masterData.queries"; -import { MasterDataAcl } from "./masterData.acl"; - -export namespace MasterDataConfigs { -export const paginatedConfig = { - meta: { - title: "Paginated", - }, - readAll: { - acl: MasterDataAcl.canUsePaginate, - schema: MasterDataModels.MasterDataLabelResponseDTOSchema, - paginated: MasterDataQueries.usePaginate, - infinite: MasterDataQueries.usePaginateInfinite, - columns: dynamicColumns({ - schema: MasterDataModels.MasterDataLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - type: true, - }, - }, -}), - }, -}; - -} diff --git a/test/generated/next/masterData/masterData.models.ts b/test/generated/next/masterData/masterData.models.ts deleted file mode 100644 index 832cbb1..0000000 --- a/test/generated/next/masterData/masterData.models.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace MasterDataModels { -/** - * MasterDataTypeEnumSchema - * @type { enum } - */ -export const MasterDataTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "City", "Warehouse", "ContainerYard", "PortTerminal", "AirportTerminal", "Port", "Airport"]); -export type MasterDataTypeEnum = z.infer; -export const MasterDataTypeEnum = MasterDataTypeEnumSchema.enum; - -/** - * MasterDataItemResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the item - * @property { string } name Name of the item - * @property { MasterDataTypeEnum } type Type of the item - */ -export const MasterDataItemResponseDTOSchema = z.object({ id: z.string(), name: z.string(), type: MasterDataTypeEnumSchema }); -export type MasterDataItemResponseDTO = z.infer; - -/** - * MasterDataItemsResponseDTOSchema - * @type { object } - * @property { MasterDataItemResponseDTO[] } items List of master data items - */ -export const MasterDataItemsResponseDTOSchema = z.object({ items: z.array(MasterDataItemResponseDTOSchema) }); -export type MasterDataItemsResponseDTO = z.infer; - -/** - * MasterDataLabelResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the item - * @property { string } label Label of the item - * @property { MasterDataTypeEnum } type Type of the item - */ -export const MasterDataLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), type: MasterDataTypeEnumSchema }); -export type MasterDataLabelResponseDTO = z.infer; - -/** - * MasterDataFindAllTypesParamSchema - * @type { array } - */ -export const MasterDataFindAllTypesParamSchema = z.array(MasterDataTypeEnumSchema); -export type MasterDataFindAllTypesParam = z.infer; - -/** - * MasterDataPaginateTypesParamSchema - * @type { array } - */ -export const MasterDataPaginateTypesParamSchema = z.array(MasterDataTypeEnumSchema); -export type MasterDataPaginateTypesParam = z.infer; - -/** - * MasterDataPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { MasterDataLabelResponseDTO[] } items - */ -export const MasterDataPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(MasterDataLabelResponseDTOSchema).nullable() }).partial().shape }); -export type MasterDataPaginateResponse = z.infer; - -} diff --git a/test/generated/next/masterData/masterData.queries.ts b/test/generated/next/masterData/masterData.queries.ts deleted file mode 100644 index 8fba241..0000000 --- a/test/generated/next/masterData/masterData.queries.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { MasterDataAcl } from "./masterData.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { MasterDataModels } from "./masterData.models"; -import { MasterDataApi } from "./masterData.api"; - -export namespace MasterDataQueries { -export const moduleName = QueryModule.MasterData; - -export const keys = { - all: [moduleName] as const, - findAll: (officeId: string, types?: MasterDataModels.MasterDataFindAllTypesParam, search?: string) => [...keys.all, "/offices/:officeId/master-data/autocomplete", officeId, types, search] as const, - paginate: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", officeId, types, limit, search, page, cursor] as const, - paginateInfinite: (officeId: string, types?: MasterDataModels.MasterDataPaginateTypesParam, limit?: number, search?: string, cursor?: string) => [...keys.all, "/offices/:officeId/master-data/labels/paginated", "infinite", officeId, types, limit, search, cursor] as const, -}; - -/** - * Query `useFindAll` - * @summary List master data based on provided type - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataFindAllTypesParam } object.types Query parameter - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ officeId, types, search }: { officeId: string, types: MasterDataModels.MasterDataFindAllTypesParam, search?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(officeId, types, search), - queryFn: () => { - checkAcl(MasterDataAcl.canUseFindAll()); - return MasterDataApi.findAll(officeId, types, search) }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate master data based on provided type - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.search Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, types, limit, search, page, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, types, limit, search, page, cursor), - queryFn: () => { - checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate master data based on provided type - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { MasterDataModels.MasterDataPaginateTypesParam } object.types Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.search Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, types, limit, search, cursor }: { officeId: string, types: MasterDataModels.MasterDataPaginateTypesParam, limit: number, search?: string, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, types, limit, search, cursor), - queryFn: ({ pageParam }) => { - checkAcl(MasterDataAcl.canUsePaginate()); - return MasterDataApi.paginate(officeId, types, limit, search, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/next/masterDataImport/masterDataImport.acl.ts b/test/generated/next/masterDataImport/masterDataImport.acl.ts deleted file mode 100644 index 7e98741..0000000 --- a/test/generated/next/masterDataImport/masterDataImport.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace MasterDataImportAcl { -/** - * Use for `useUpload` mutation ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpload` mutation - */ -export const canUseUpload = ( - object?: { officeId: string, } -) => [ - "Import", - object ? subject("MasterData", object) : "MasterData" -] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - -/** - * Use for `usePostOfficesMasterDataImportByOfficeId` mutation ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePostOfficesMasterDataImportByOfficeId` mutation - */ -export const canUsePostOfficesMasterDataImportByOfficeId = ( - object?: { officeId: string, } -) => [ - "Import", - object ? subject("MasterData", object) : "MasterData" -] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - -/** - * Use for `useGetImportStatus` query ability. For global ability, omit the object parameter. - * @description Create upload instructions for master data import file - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetImportStatus` query - */ -export const canUseGetImportStatus = ( - object?: { officeId: string, } -) => [ - "Import", - object ? subject("MasterData", object) : "MasterData" -] as AbilityTuple<"Import", "MasterData" | ForcedSubject<"MasterData"> & { officeId: string, }>; - -} diff --git a/test/generated/next/masterDataImport/masterDataImport.api.ts b/test/generated/next/masterDataImport/masterDataImport.api.ts deleted file mode 100644 index af38583..0000000 --- a/test/generated/next/masterDataImport/masterDataImport.api.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { MasterDataImportModels } from "./masterDataImport.models"; - -export namespace MasterDataImportApi { -export const upload = (officeId: string, data: MasterDataImportModels.MasterDataImportUploadRequestDto, ) => { - return AppRestClient.post( - { resSchema: MasterDataImportModels.MasterDataImportUploadResponseDtoSchema }, - `/offices/${officeId}/master-data/upload`, - ZodExtended.parse(MasterDataImportModels.MasterDataImportUploadRequestDtoSchema, data), - - ) -}; -export const postOfficesMasterDataImportByOfficeId = (officeId: string, data: MasterDataImportModels.MasterDataImportRequestDto, ) => { - return AppRestClient.post( - { resSchema: MasterDataImportModels.MasterDataImportResponseDtoSchema }, - `/offices/${officeId}/master-data/import`, - ZodExtended.parse(MasterDataImportModels.MasterDataImportRequestDtoSchema, data), - - ) -}; -export const getImportStatus = (jobId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: MasterDataImportModels.ImportStatusResponseDtoSchema }, - `/offices/${officeId}/master-data/import/${jobId}/status`, - - ) -}; -} diff --git a/test/generated/next/masterDataImport/masterDataImport.models.ts b/test/generated/next/masterDataImport/masterDataImport.models.ts deleted file mode 100644 index a2dc56c..0000000 --- a/test/generated/next/masterDataImport/masterDataImport.models.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { z } from "zod"; - -export namespace MasterDataImportModels { -/** - * ImportStatusEnumSchema - * @type { enum } - * @description Import result status - */ -export const ImportStatusEnumSchema = z.enum(["Success", "Warning", "Error"]); -export type ImportStatusEnum = z.infer; -export const ImportStatusEnum = ImportStatusEnumSchema.enum; - -/** - * ImportTypeEnumSchema - * @type { enum } - */ -export const ImportTypeEnumSchema = z.enum(["BusinessPartner", "Depot", "Warehouse"]); -export type ImportTypeEnum = z.infer; -export const ImportTypeEnum = ImportTypeEnumSchema.enum; - -/** - * MasterDataImportRequestDtoSchema - * @type { object } - * @property { string } mediaId Media ID of the uploaded file - * @property { ImportTypeEnum } type Type of data to import - */ -export const MasterDataImportRequestDtoSchema = z.object({ mediaId: z.string(), type: ImportTypeEnumSchema }); -export type MasterDataImportRequestDto = z.infer; - -/** - * ImportResultDtoSchema - * @type { object } - * @property { string } importStatus Import result status - * @property { string } downloadUrl S3 presigned URL for result file download - * @property { string } expiresAt Download URL expiration time - * @property { string } errorCode - */ -export const ImportResultDtoSchema = z.object({ importStatus: ImportStatusEnumSchema.nullish(), downloadUrl: z.string(), expiresAt: z.iso.datetime({ offset: true }).nullish(), errorCode: z.string().nullish() }); -export type ImportResultDto = z.infer; - -/** - * ImportStatusResponseDtoSchema - * @type { object } - * @property { string } status Current job status - * @property { ImportResultDto } result Import result data when job is completed - */ -export const ImportStatusResponseDtoSchema = z.object({ status: z.string().nullable(), result: ImportResultDtoSchema.nullish() }); -export type ImportStatusResponseDto = z.infer; - -/** - * MasterDataImportUploadRequestDtoSchema - * @type { object } - * @property { string } filename File name - * @property { string } contentType Content type of the file - * @property { number } fileSize File size in bytes. Minimum: `1` - */ -export const MasterDataImportUploadRequestDtoSchema = z.object({ filename: z.string(), contentType: z.string(), fileSize: z.number().gte(1) }); -export type MasterDataImportUploadRequestDto = z.infer; - -/** - * MasterDataImportUploadResponseDtoSchema - * @type { object } - * @property { string } mediaId Media ID for the uploaded file - * @property { string } url S3 presigned upload URL - */ -export const MasterDataImportUploadResponseDtoSchema = z.object({ mediaId: z.string(), url: z.string() }); -export type MasterDataImportUploadResponseDto = z.infer; - -/** - * MasterDataImportResponseDtoSchema - * @type { object } - * @property { string } jobId PG Boss job ID - * @property { string } status Initial job status - */ -export const MasterDataImportResponseDtoSchema = z.object({ jobId: z.string(), status: z.string().nullish() }); -export type MasterDataImportResponseDto = z.infer; - -} diff --git a/test/generated/next/masterDataImport/masterDataImport.queries.ts b/test/generated/next/masterDataImport/masterDataImport.queries.ts deleted file mode 100644 index e6f857d..0000000 --- a/test/generated/next/masterDataImport/masterDataImport.queries.ts +++ /dev/null @@ -1,121 +0,0 @@ -import axios, { } from "axios"; -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { MasterDataImportAcl } from "./masterDataImport.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { MasterDataImportModels } from "./masterDataImport.models"; -import { MasterDataImportApi } from "./masterDataImport.api"; - -export namespace MasterDataImportQueries { -export const moduleName = QueryModule.MasterDataImport; - -export const keys = { - all: [moduleName] as const, - getImportStatus: (jobId: string, officeId: string) => [...keys.all, "/offices/:officeId/master-data/import/:jobId/status", jobId, officeId] as const, -}; - -/** - * Mutation `useUpload` - * @summary Create upload instructions for master data import file - * @permission Requires `canUseUpload` ability - * @param { string } mutation.officeId Path parameter - * @param { MasterDataImportModels.MasterDataImportUploadRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUpload = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(MasterDataImportAcl.canUseUpload({ officeId } )); - const uploadInstructions = await MasterDataImportApi.upload(officeId, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `usePostOfficesMasterDataImportByOfficeId` - * @summary Start master data import process - * @permission Requires `canUsePostOfficesMasterDataImportByOfficeId` ability - * @param { string } mutation.officeId Path parameter - * @param { MasterDataImportModels.MasterDataImportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const usePostOfficesMasterDataImportByOfficeId = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(MasterDataImportAcl.canUsePostOfficesMasterDataImportByOfficeId({ officeId } )); - return MasterDataImportApi.postOfficesMasterDataImportByOfficeId(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetImportStatus` - * @summary Get import job status - * @permission Requires `canUseGetImportStatus` ability - * @param { string } object.jobId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetImportStatus = ({ jobId, officeId }: { jobId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getImportStatus(jobId, officeId), - queryFn: () => { - checkAcl(MasterDataImportAcl.canUseGetImportStatus({ officeId } )); - return MasterDataImportApi.getImportStatus(jobId, officeId) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/offices/offices.acl.ts b/test/generated/next/offices/offices.acl.ts deleted file mode 100644 index 0f81019..0000000 --- a/test/generated/next/offices/offices.acl.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace OfficesAcl { -/** - * Use for `useCreate` mutation ability. - * @description Create office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Office" -] as AbilityTuple<"Create", "Office">; - -/** - * Use for `useGet` query ability. - * @description Read office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( -) => [ - "Read", - "Office" -] as AbilityTuple<"Read", "Office">; - -/** - * Use for `useUpdate` mutation ability. - * @description Update office - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Office" -] as AbilityTuple<"Update", "Office">; - -/** - * Use for `useUploadDocumentImage` mutation ability. For global ability, omit the object parameter. - * @description Upload office document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadDocumentImage` mutation - */ -export const canUseUploadDocumentImage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useCreateBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Create office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBankAccount` mutation - */ -export const canUseCreateBankAccount = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useUpdateBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Update office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBankAccount` mutation - */ -export const canUseUpdateBankAccount = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useDeleteBankAccount` mutation ability. For global ability, omit the object parameter. - * @description Delete office bank account - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBankAccount` mutation - */ -export const canUseDeleteBankAccount = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -/** - * Use for `useUploadBankAccountFooter` mutation ability. For global ability, omit the object parameter. - * @description Upload bank account footer - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUploadBankAccountFooter` mutation - */ -export const canUseUploadBankAccountFooter = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Office", object) : "Office" -] as AbilityTuple<"Update", "Office" | ForcedSubject<"Office"> & { officeId: string, }>; - -} diff --git a/test/generated/next/offices/offices.api.ts b/test/generated/next/offices/offices.api.ts deleted file mode 100644 index 6e096af..0000000 --- a/test/generated/next/offices/offices.api.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { OfficesModels } from "./offices.models"; - -export namespace OfficesApi { -export const paginate = (limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: OfficesModels.OfficesPaginateResponseSchema }, - `/offices`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(OfficesModels.OfficeFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: OfficesModels.CreateOfficeRequest, ) => { - return AppRestClient.post( - { resSchema: OfficesModels.OfficeResponseDtoSchema }, - `/offices`, - ZodExtended.parse(OfficesModels.CreateOfficeRequestSchema, data), - - ) -}; -export const findAllLabels = (search?: string, ) => { - return AppRestClient.get( - { resSchema: OfficesModels.FindAllLabelsResponseSchema }, - `/offices/labels`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: OfficesModels.OfficesPaginateLabelsResponseSchema }, - `/offices/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(OfficesModels.OfficeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const get = (id: string, ) => { - return AppRestClient.get( - { resSchema: OfficesModels.OfficeDetailResponseDtoSchema }, - `/offices/${id}`, - - ) -}; -export const update = (id: string, data: OfficesModels.UpdateOfficeRequest, ) => { - return AppRestClient.put( - { resSchema: OfficesModels.OfficeResponseDtoSchema }, - `/offices/${id}`, - ZodExtended.parse(OfficesModels.UpdateOfficeRequestSchema, data), - - ) -}; -export const uploadDocumentImage = (officeId: string, data: OfficesModels.UploadOfficeDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, - `/offices/${officeId}/document-image`, - ZodExtended.parse(OfficesModels.UploadOfficeDocumentRequestDtoSchema, data), - - ) -}; -export const createBankAccount = (officeId: string, data: OfficesModels.CreateOfficeBankAccountDto, ) => { - return AppRestClient.post( - { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, - `/offices/${officeId}/bank-accounts`, - ZodExtended.parse(OfficesModels.CreateOfficeBankAccountDtoSchema, data), - - ) -}; -export const updateBankAccount = (accountId: string, officeId: string, data: OfficesModels.UpdateOfficeBankAccountDto, ) => { - return AppRestClient.patch( - { resSchema: OfficesModels.OfficeBankAccountResponseDtoSchema }, - `/offices/${officeId}/bank-accounts/${accountId}`, - ZodExtended.parse(OfficesModels.UpdateOfficeBankAccountDtoSchema, data), - - ) -}; -export const deleteBankAccount = (accountId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/bank-accounts/${accountId}`, - - ) -}; -export const uploadBankAccountFooter = (accountId: string, officeId: string, data: OfficesModels.UploadOfficeBankAccountFooterRequestDto, ) => { - return AppRestClient.post( - { resSchema: OfficesModels.DocumentImageUploadInstructionsDtoSchema }, - `/offices/${officeId}/bank-accounts/${accountId}/footer`, - ZodExtended.parse(OfficesModels.UploadOfficeBankAccountFooterRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/offices/offices.configs.ts b/test/generated/next/offices/offices.configs.ts deleted file mode 100644 index 07f5587..0000000 --- a/test/generated/next/offices/offices.configs.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { OfficesModels } from "./offices.models"; -import { CommonModels } from "@/data/common/common.models"; -import { OfficesQueries } from "./offices.queries"; -import { OfficesAcl } from "./offices.acl"; - -export namespace OfficesConfigs { -export const officesConfig = { - meta: { - title: "Offices", - }, - readAll: { - schema: OfficesModels.OfficeListItemResponseSchema, - paginated: OfficesQueries.usePaginate, - infinite: OfficesQueries.usePaginateInfinite, - filters: { - schema: OfficesModels.OfficeFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: OfficesModels.OfficeFilterDtoSchema, - options: { - inputs: { - name: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: OfficesModels.OfficeListItemResponseSchema, - options: { - columns: { - id: true, - name: true, - numberOfEmployees: true, - }, - sortable: OfficesModels.OfficesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: OfficesAcl.canUseGet, - schema: OfficesModels.OfficeDetailResponseDtoSchema, - query: OfficesQueries.useGet, - }, - create: { - acl: OfficesAcl.canUseCreate, - schema: OfficesModels.CreateOfficeRequestSchema, - mutation: OfficesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: OfficesModels.CreateOfficeRequestSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: OfficesAcl.canUseUpdate, - schema: OfficesModels.UpdateOfficeRequestSchema, - mutation: OfficesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: OfficesModels.UpdateOfficeRequestSchema, - options: { - inputs: { - name: true, - symbol: true, - invoicePrefix: true, - autoClosePositionsAfterDays: true, - defaultLanguage: true, - locale: true, - vatId: true, - taxNumber: true, - termsExport: true, - termsImport: true, - showPaymentInstructions: true, - showCompanyRegistrationNumber: true, - reportInvoicesToHungarianTaxAuthority: true, - restrictPositionInvolvedParties: true, - showWatermarkOnDocuments: true, - showInvoiceVatLinesInOfficeCurrency: true, - usePartnerMatchCodes: true, - restrictFinancePartnersToRelationship: true, - costCenterId: true, - minimumOutgoingInvoiceDate: true, - minimumOutgoingInvoiceServiceDate: true, - minimumIncomingInvoiceDate: true, - minimumIncomingInvoiceServiceDate: true, - countryId: true, - defaultCurrencyId: true, - representingBusinessPartnerId: true, - availableCurrencyIds: true, - generalLedgerSystem: true, - factoringReportingEnabled: true, - bankAccountCurrencyMapping: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - schema: CommonModels.LabelResponseDTOSchema, - paginated: OfficesQueries.usePaginateLabels, - infinite: OfficesQueries.usePaginateLabelsInfinite, - filters: { - schema: OfficesModels.OfficeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: OfficesModels.OfficeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: OfficesModels.OfficesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/offices/offices.models.ts b/test/generated/next/offices/offices.models.ts deleted file mode 100644 index 3083b80..0000000 --- a/test/generated/next/offices/offices.models.ts +++ /dev/null @@ -1,390 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace OfficesModels { -/** - * OfficeCurrencyResponseDtoSchema - * @type { object } - * @property { string } isoCode - * @property { string } name - */ -export const OfficeCurrencyResponseDtoSchema = z.object({ isoCode: z.string(), name: z.string() }); -export type OfficeCurrencyResponseDto = z.infer; - -/** - * OfficeBankAccountCurrencyMappingResponseDtoSchema - * @type { object } - * @property { string } currency - * @property { string } bankAccountId - * @property { string } bankAccountName - */ -export const OfficeBankAccountCurrencyMappingResponseDtoSchema = z.object({ currency: z.string(), bankAccountId: z.string(), bankAccountName: z.string() }); -export type OfficeBankAccountCurrencyMappingResponseDto = z.infer; - -/** - * OfficeBookkeepingResponseDtoSchema - * @type { object } - * @property { string } generalLedgerSystem - * @property { OfficeCurrencyResponseDto } defaultCurrency - * @property { OfficeCurrencyResponseDto[] } availableCurrencies - * @property { boolean } showPaymentInstructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { OfficeBankAccountCurrencyMappingResponseDto[] } bankAccountCurrencyMapping - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { boolean } factoringReportingEnabled - */ -export const OfficeBookkeepingResponseDtoSchema = z.object({ generalLedgerSystem: z.string(), defaultCurrency: OfficeCurrencyResponseDtoSchema.nullish(), availableCurrencies: z.array(OfficeCurrencyResponseDtoSchema), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), bankAccountCurrencyMapping: z.array(OfficeBankAccountCurrencyMappingResponseDtoSchema), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), factoringReportingEnabled: z.boolean() }); -export type OfficeBookkeepingResponseDto = z.infer; - -/** - * OfficeDocumentPartEnumSchema - * @type { enum } - */ -export const OfficeDocumentPartEnumSchema = z.enum(["DocumentFooter", "DocumentHeader", "GeneralTermsAndConditions", "BLTermsAndConditions", "FinanceDocumentFooter"]); -export type OfficeDocumentPartEnum = z.infer; -export const OfficeDocumentPartEnum = OfficeDocumentPartEnumSchema.enum; - -/** - * OfficeDocumentSettingsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } mediaUrl - * @property { CommonModels.LanguageEnum } language - * @property { OfficeDocumentPartEnum } documentPart - */ -export const OfficeDocumentSettingsResponseDtoSchema = z.object({ id: z.string(), mediaUrl: z.string(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }); -export type OfficeDocumentSettingsResponseDto = z.infer; - -/** - * AddressResponseDTOSchema - * @type { object } - * @property { string } id ID of the address - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street address - * @property { string } zip ZIP/Postal code - * @property { string } city City name - * @property { string } district District - * @property { string } isoCode2 2 letter country code - * @property { string } country Country name - * @property { string } isoCode3 3 letter country code - */ -export const AddressResponseDTOSchema = z.object({ id: z.string(), street: z.string(), secondaryStreet: z.string(), zip: z.string(), city: z.string(), district: z.string(), isoCode2: z.string(), country: z.string(), isoCode3: z.string() }); -export type AddressResponseDTO = z.infer; - -/** - * OfficeRepresentingBusinessPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string[] } types - * @property { string[] } email - * @property { string[] } phone - * @property { string } addressId - * @property { AddressResponseDTO } address - */ -export const OfficeRepresentingBusinessPartnerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), types: z.array(z.string()), email: z.array(z.string()).nullish(), phone: z.array(z.string()).nullish(), addressId: z.string().nullish(), address: AddressResponseDTOSchema.nullish() }); -export type OfficeRepresentingBusinessPartnerResponseDto = z.infer; - -/** - * OfficePaymentTermsResponseDtoSchema - * @type { object } - * @property { number } days - * @property { string } relativeTo - */ -export const OfficePaymentTermsResponseDtoSchema = z.object({ days: z.number().nullable(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema.nullable() }).partial(); -export type OfficePaymentTermsResponseDto = z.infer; - -/** - * OfficeCountryResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const OfficeCountryResponseDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type OfficeCountryResponseDto = z.infer; - -/** - * OfficeBankAccountResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } bankName - * @property { string } iban - * @property { string } swiftBic - * @property { boolean } useFooterOnInvoice - * @property { object } footer - * @property { string } footer.mediaUrl - * @property { boolean } isFactoringBank - */ -export const OfficeBankAccountResponseDtoSchema = z.object({ id: z.string(), name: z.string(), bankName: z.string(), iban: z.string(), swiftBic: z.string(), useFooterOnInvoice: z.boolean(), footer: z.object({ mediaUrl: z.string() }).nullish(), isFactoringBank: z.boolean() }); -export type OfficeBankAccountResponseDto = z.infer; - -/** - * OfficeDetailResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } symbol - * @property { number } invoicePrefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage - * @property { CommonModels.LocaleEnum } locale - * @property { string } vatId - * @property { string } taxNumber - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { OfficePaymentTermsResponseDto } termsExport - * @property { OfficePaymentTermsResponseDto } termsImport - * @property { OfficeCountryResponseDto } country - * @property { OfficeBankAccountResponseDto[] } bankAccounts - * @property { OfficeBookkeepingResponseDto } bookkeeping - * @property { OfficeDocumentSettingsResponseDto[] } documentSettings - * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner - * @property { boolean } hasInttraCredentials - */ -export const OfficeDetailResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), country: OfficeCountryResponseDtoSchema.nullable(), bankAccounts: z.array(OfficeBankAccountResponseDtoSchema), bookkeeping: OfficeBookkeepingResponseDtoSchema, documentSettings: z.array(OfficeDocumentSettingsResponseDtoSchema), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), hasInttraCredentials: z.boolean().nullish() }); -export type OfficeDetailResponseDto = z.infer; - -/** - * OfficeResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } symbol - * @property { number } invoicePrefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage - * @property { CommonModels.LocaleEnum } locale - * @property { string } vatId - * @property { string } taxNumber - * @property { OfficePaymentTermsResponseDto } termsExport - * @property { OfficePaymentTermsResponseDto } termsImport - * @property { boolean } showPaymentInstructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { string } countryId - * @property { string } defaultCurrencyId - * @property { string[] } availableCurrencyIds - * @property { string } generalLedgerSystem - * @property { string } representingBusinessPartnerId - * @property { OfficeRepresentingBusinessPartnerResponseDto } representingBusinessPartner - * @property { boolean } factoringReportingEnabled - */ -export const OfficeResponseDtoSchema = z.object({ id: z.string(), name: z.string(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullish(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullish(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), termsExport: OfficePaymentTermsResponseDtoSchema.nullable(), termsImport: OfficePaymentTermsResponseDtoSchema.nullable(), showPaymentInstructions: z.boolean(), showCompanyRegistrationNumber: z.boolean(), restrictPositionInvolvedParties: z.boolean(), showWatermarkOnDocuments: z.boolean(), showInvoiceVatLinesInOfficeCurrency: z.boolean(), usePartnerMatchCodes: z.boolean(), restrictFinancePartnersToRelationship: z.boolean(), reportInvoicesToHungarianTaxAuthority: z.boolean(), costCenterId: z.string().nullish(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullish(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullish(), countryId: z.string().nullable(), defaultCurrencyId: z.string().nullable(), availableCurrencyIds: z.array(z.string()).nullable(), generalLedgerSystem: z.string().nullable(), representingBusinessPartnerId: z.string().nullable(), representingBusinessPartner: OfficeRepresentingBusinessPartnerResponseDtoSchema.nullable(), factoringReportingEnabled: z.boolean() }); -export type OfficeResponseDto = z.infer; - -/** - * UpdateOfficePaymentTermsRequestSchema - * @type { object } - * @property { number } days - * @property { string } relativeTo - */ -export const UpdateOfficePaymentTermsRequestSchema = z.object({ days: z.number(), relativeTo: CommonModels.OfficePaymentTermsDateTypeSchema }); -export type UpdateOfficePaymentTermsRequest = z.infer; - -/** - * UpdateOfficeBankAccountCurrencyMappingSchema - * @type { object } - * @property { string } currency - * @property { string } bankAccountId - */ -export const UpdateOfficeBankAccountCurrencyMappingSchema = z.object({ currency: z.string(), bankAccountId: z.string() }); -export type UpdateOfficeBankAccountCurrencyMapping = z.infer; - -/** - * UpdateOfficeRequestSchema - * @type { object } - * @property { string } name Office Name - * @property { string } symbol Office Symbol - * @property { number } invoicePrefix Office Invoice Prefix - * @property { number } autoClosePositionsAfterDays - * @property { string } defaultLanguage Office Default Language - * @property { string } locale - * @property { string } vatId Office Vat Id - * @property { string } taxNumber Office Tax Number - * @property { UpdateOfficePaymentTermsRequest } termsExport Office Terms Export - * @property { UpdateOfficePaymentTermsRequest } termsImport Office Terms Import - * @property { boolean } showPaymentInstructions Office Show Payment Instructions - * @property { boolean } showCompanyRegistrationNumber - * @property { boolean } reportInvoicesToHungarianTaxAuthority - * @property { boolean } restrictPositionInvolvedParties - * @property { boolean } showWatermarkOnDocuments - * @property { boolean } showInvoiceVatLinesInOfficeCurrency - * @property { boolean } usePartnerMatchCodes - * @property { boolean } restrictFinancePartnersToRelationship - * @property { string } costCenterId - * @property { string } minimumOutgoingInvoiceDate - * @property { string } minimumOutgoingInvoiceServiceDate - * @property { string } minimumIncomingInvoiceDate - * @property { string } minimumIncomingInvoiceServiceDate - * @property { string } countryId Office country id - * @property { string } defaultCurrencyId Office default currency id - * @property { string } representingBusinessPartnerId Representing business partner id - * @property { string[] } availableCurrencyIds Office availableCurrencyIds - * @property { string } generalLedgerSystem Office general ledger system - * @property { boolean } factoringReportingEnabled - * @property { UpdateOfficeBankAccountCurrencyMapping[] } bankAccountCurrencyMapping Office bank account currency mapping - */ -export const UpdateOfficeRequestSchema = z.object({ name: z.string().nullable(), symbol: z.string().nullable(), invoicePrefix: z.number().nullable(), autoClosePositionsAfterDays: z.number().nullable(), defaultLanguage: z.string().nullable(), locale: CommonModels.LocaleEnumSchema.nullable(), vatId: z.string().nullable(), taxNumber: z.string().nullable(), termsExport: UpdateOfficePaymentTermsRequestSchema.nullable(), termsImport: UpdateOfficePaymentTermsRequestSchema.nullable(), showPaymentInstructions: z.boolean().nullable(), showCompanyRegistrationNumber: z.boolean().nullable(), reportInvoicesToHungarianTaxAuthority: z.boolean().nullable(), restrictPositionInvolvedParties: z.boolean().nullable(), showWatermarkOnDocuments: z.boolean().nullable(), showInvoiceVatLinesInOfficeCurrency: z.boolean().nullable(), usePartnerMatchCodes: z.boolean().nullable(), restrictFinancePartnersToRelationship: z.boolean().nullable(), costCenterId: z.string().nullable(), minimumOutgoingInvoiceDate: z.iso.datetime({ offset: true }).nullable(), minimumOutgoingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullable(), minimumIncomingInvoiceDate: z.iso.datetime({ offset: true }).nullable(), minimumIncomingInvoiceServiceDate: z.iso.datetime({ offset: true }).nullable(), countryId: z.string().nullable(), defaultCurrencyId: z.string().nullable(), representingBusinessPartnerId: z.string().nullable(), availableCurrencyIds: z.array(z.string()).nullable(), generalLedgerSystem: z.string().nullable(), factoringReportingEnabled: z.boolean().nullable(), bankAccountCurrencyMapping: z.array(UpdateOfficeBankAccountCurrencyMappingSchema).nullable() }).partial(); -export type UpdateOfficeRequest = z.infer; - -/** - * UploadOfficeDocumentRequestDtoSchema - * @type { object } - * @property { string } fileName File name with extension - * @property { string } mimeType MIME type of the file - * @property { number } fileSize Size of the file - * @property { string } language Language of the document - * @property { string } documentPart Part of the document this image represents - */ -export const UploadOfficeDocumentRequestDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number(), language: CommonModels.LanguageEnumSchema, documentPart: OfficeDocumentPartEnumSchema }); -export type UploadOfficeDocumentRequestDto = z.infer; - -/** - * OfficeListItemResponseSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { number } numberOfEmployees - */ -export const OfficeListItemResponseSchema = z.object({ id: z.string(), name: z.string(), numberOfEmployees: z.number() }); -export type OfficeListItemResponse = z.infer; - -/** - * OfficeFilterDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } search - */ -export const OfficeFilterDtoSchema = z.object({ name: z.string().nullable(), search: z.string().nullable() }).partial(); -export type OfficeFilterDto = z.infer; - -/** - * OfficeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const OfficeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type OfficeLabelFilterDto = z.infer; - -/** - * CreateOfficeRequestSchema - * @type { object } - * @property { string } name - */ -export const CreateOfficeRequestSchema = z.object({ name: z.string() }); -export type CreateOfficeRequest = z.infer; - -/** - * DocumentImageUploadInstructionsDtoSchema - * @type { object } - * @property { string } method HTTP method to use for upload - * @property { string } url URL to upload the file to - * @property { string } documentId ID of the created/updated document setting - */ -export const DocumentImageUploadInstructionsDtoSchema = z.object({ method: z.string(), url: z.string(), documentId: z.string() }); -export type DocumentImageUploadInstructionsDto = z.infer; - -/** - * CreateOfficeBankAccountDtoSchema - * @type { object } - * @property { string } name Bank account name - * @property { string } bankName Bank name - * @property { string } iban IBAN - * @property { string } swiftBic SWIFT/BIC code - * @property { boolean } useFooterOnInvoice Use footer on invoice - */ -export const CreateOfficeBankAccountDtoSchema = z.object({ name: z.string().nullable(), bankName: z.string().nullable(), iban: z.string().nullable(), swiftBic: z.string().nullable(), useFooterOnInvoice: z.boolean().nullable() }).partial(); -export type CreateOfficeBankAccountDto = z.infer; - -/** - * UpdateOfficeBankAccountDtoSchema - * @type { object } - * @property { string } name Bank account name - * @property { string } bankName Bank name - * @property { string } iban IBAN - * @property { string } swiftBic SWIFT/BIC code - * @property { boolean } useFooterOnInvoice Use footer on invoice - * @property { boolean } isFactoringBank Is factoring bank - */ -export const UpdateOfficeBankAccountDtoSchema = z.object({ name: z.string().nullable(), bankName: z.string().nullable(), iban: z.string().nullable(), swiftBic: z.string().nullable(), useFooterOnInvoice: z.boolean().nullable(), isFactoringBank: z.boolean().nullable() }).partial(); -export type UpdateOfficeBankAccountDto = z.infer; - -/** - * UploadOfficeBankAccountFooterRequestDtoSchema - * @type { object } - * @property { string } fileName File name - * @property { string } mimeType File MIME type - * @property { number } fileSize Size of the file - */ -export const UploadOfficeBankAccountFooterRequestDtoSchema = z.object({ fileName: z.string(), mimeType: z.string(), fileSize: z.number() }); -export type UploadOfficeBankAccountFooterRequestDto = z.infer; - -/** - * OfficesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const OfficesPaginateOrderParamEnumSchema = z.enum(["name"]); -export type OfficesPaginateOrderParamEnum = z.infer; -export const OfficesPaginateOrderParamEnum = OfficesPaginateOrderParamEnumSchema.enum; - -/** - * OfficesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { OfficeListItemResponse[] } items - */ -export const OfficesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(OfficeListItemResponseSchema).nullable() }).partial().shape }); -export type OfficesPaginateResponse = z.infer; - -/** - * FindAllLabelsResponseSchema - * @type { array } - */ -export const FindAllLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type FindAllLabelsResponse = z.infer; - -/** - * OfficesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const OfficesPaginateLabelsOrderParamEnumSchema = z.enum(["name"]); -export type OfficesPaginateLabelsOrderParamEnum = z.infer; -export const OfficesPaginateLabelsOrderParamEnum = OfficesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * OfficesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const OfficesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type OfficesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/offices/offices.queries.ts b/test/generated/next/offices/offices.queries.ts deleted file mode 100644 index 5258732..0000000 --- a/test/generated/next/offices/offices.queries.ts +++ /dev/null @@ -1,403 +0,0 @@ -import axios, { } from "axios"; -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { OfficesAcl } from "./offices.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { OfficesModels } from "./offices.models"; -import { OfficesApi } from "./offices.api"; - -export namespace OfficesQueries { -export const moduleName = QueryModule.Offices; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string) => [...keys.all, "/offices", "infinite", limit, order, filter, cursor] as const, - findAllLabels: (search?: string) => [...keys.all, "/offices/labels", search] as const, - paginateLabels: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string) => [...keys.all, "/offices/labels/paginate", "infinite", limit, order, filter, cursor] as const, - get: (id: string) => [...keys.all, "/offices/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate offices - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => - OfficesApi.paginate(limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate offices - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - OfficesApi.paginate(limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create new office - * @permission Requires `canUseCreate` ability - * @param { OfficesModels.CreateOfficeRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(OfficesAcl.canUseCreate()); - return OfficesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindAllLabels` - * @summary List all offices with only their labels - * @param { string } object.search Query parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllLabels = ({ search }: { search?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.findAllLabels(search), - queryFn: () => - OfficesApi.findAllLabels(search), - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate offices with only their labels - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => - OfficesApi.paginateLabels(limit, order, filter, page, cursor), - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate offices with only their labels - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name. Example: `name` - * @param { OfficesModels.OfficeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: OfficesModels.OfficeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => - OfficesApi.paginateLabels(limit, order, filter, pageParam, cursor), - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGet` - * @summary Get office by id - * @permission Requires `canUseGet` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(id), - queryFn: () => { - checkAcl(OfficesAcl.canUseGet()); - return OfficesApi.get(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update office - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { OfficesModels.UpdateOfficeRequest } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(OfficesAcl.canUseUpdate()); - return OfficesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUploadDocumentImage` - * @summary Upload document image for an office - * @permission Requires `canUseUploadDocumentImage` ability - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UploadOfficeDocumentRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUploadDocumentImage = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(OfficesAcl.canUseUploadDocumentImage({ officeId } )); - const uploadInstructions = await OfficesApi.uploadDocumentImage(officeId, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateBankAccount` - * @summary Create office bank account - * @permission Requires `canUseCreateBankAccount` ability - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.CreateOfficeBankAccountDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(OfficesAcl.canUseCreateBankAccount({ officeId } )); - return OfficesApi.createBankAccount(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateBankAccount` - * @summary Update office bank account - * @permission Requires `canUseUpdateBankAccount` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UpdateOfficeBankAccountDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ accountId, officeId, data }) => { - checkAcl(OfficesAcl.canUseUpdateBankAccount({ officeId } )); - return OfficesApi.updateBankAccount(accountId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteBankAccount` - * @summary Delete office bank account - * @permission Requires `canUseDeleteBankAccount` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteBankAccount = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ accountId, officeId }) => { - checkAcl(OfficesAcl.canUseDeleteBankAccount({ officeId } )); - return OfficesApi.deleteBankAccount(accountId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUploadBankAccountFooter` - * @summary Upload office bank account footer - * @permission Requires `canUseUploadBankAccountFooter` ability - * @param { string } mutation.accountId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { OfficesModels.UploadOfficeBankAccountFooterRequestDto } mutation.data Body parameter - * @param { File } mutation.file Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUploadBankAccountFooter = (options?: AppMutationOptions void }> & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: async ({ accountId, officeId, data, file, abortController, onUploadProgress }) => { - checkAcl(OfficesAcl.canUseUploadBankAccountFooter({ officeId } )); - const uploadInstructions = await OfficesApi.uploadBankAccountFooter(accountId, officeId, data); - - if (file && uploadInstructions.url) { - const method = (data?.method?.toLowerCase() ?? "put") as "put" | "post"; - let dataToSend: File | FormData = file; - if (method === "post") { - dataToSend = new FormData(); - if (uploadInstructions.fields) { - for (const [key, value] of uploadInstructions.fields) { - dataToSend.append(key, value); - } - } - dataToSend.append("file", file); - } - await axios[method](uploadInstructions.url, dataToSend, { - headers: { - "Content-Type": file.type, - }, - signal: abortController?.signal, - onUploadProgress: onUploadProgress - ? (progressEvent) => onUploadProgress({ loaded: progressEvent.loaded, total: progressEvent.total ?? 0 }) - : undefined, - }); - } - - return uploadInstructions; - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/packageTypes/packageTypes.acl.ts b/test/generated/next/packageTypes/packageTypes.acl.ts deleted file mode 100644 index f37bcb1..0000000 --- a/test/generated/next/packageTypes/packageTypes.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PackageTypesAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "PackageType" -] as AbilityTuple<"Read", "PackageType">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "PackageType" -] as AbilityTuple<"Create", "PackageType">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "PackageType" -] as AbilityTuple<"Read", "PackageType">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "PackageType" -] as AbilityTuple<"Read", "PackageType">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "PackageType" -] as AbilityTuple<"Update", "PackageType">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "PackageType" -] as AbilityTuple<"Archive", "PackageType">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "PackageType" -] as AbilityTuple<"Archive", "PackageType">; - -} diff --git a/test/generated/next/packageTypes/packageTypes.api.ts b/test/generated/next/packageTypes/packageTypes.api.ts deleted file mode 100644 index 72184b2..0000000 --- a/test/generated/next/packageTypes/packageTypes.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PackageTypesModels } from "./packageTypes.models"; - -export namespace PackageTypesApi { -export const paginate = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypesPaginateResponseSchema }, - `/package-types`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PackageTypesModels.PackageTypePaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: PackageTypesModels.CreatePackageTypeRequestDTO, ) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types`, - ZodExtended.parse(PackageTypesModels.CreatePackageTypeRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypesPaginateLabelsResponseSchema }, - `/package-types/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PackageTypesModels.PackageTypeLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}`, - - ) -}; -export const update = (id: string, data: PackageTypesModels.UpdatePackageTypeRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}`, - ZodExtended.parse(PackageTypesModels.UpdatePackageTypeRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: PackageTypesModels.PackageTypeResponseDTOSchema }, - `/package-types/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/packageTypes/packageTypes.configs.ts b/test/generated/next/packageTypes/packageTypes.configs.ts deleted file mode 100644 index ba6aafd..0000000 --- a/test/generated/next/packageTypes/packageTypes.configs.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PackageTypesModels } from "./packageTypes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PackageTypesQueries } from "./packageTypes.queries"; -import { PackageTypesAcl } from "./packageTypes.acl"; - -export namespace PackageTypesConfigs { -export const packageTypesConfig = { - meta: { - title: "Package Types", - }, - readAll: { - acl: PackageTypesAcl.canUsePaginate, - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - paginated: PackageTypesQueries.usePaginate, - infinite: PackageTypesQueries.usePaginateInfinite, - filters: { - schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PackageTypesModels.PackageTypePaginationFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - length: true, - width: true, - height: true, - unit: true, - archived: true, - code: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PackageTypesModels.PackageTypesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PackageTypesAcl.canUseFindById, - schema: PackageTypesModels.PackageTypeResponseDTOSchema, - query: PackageTypesQueries.useFindById, - }, - create: { - acl: PackageTypesAcl.canUseCreate, - schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, - mutation: PackageTypesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PackageTypesModels.CreatePackageTypeRequestDTOSchema, - options: { - inputs: { - name: true, - length: true, - width: true, - height: true, - unit: true, - code: true, - }, - }, -}) - }, - update: { - acl: PackageTypesAcl.canUseUpdate, - schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, - mutation: PackageTypesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PackageTypesModels.UpdatePackageTypeRequestDTOSchema, - options: { - inputs: { - name: true, - length: true, - width: true, - height: true, - unit: true, - code: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: PackageTypesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PackageTypesQueries.usePaginateLabels, - infinite: PackageTypesQueries.usePaginateLabelsInfinite, - filters: { - schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PackageTypesModels.PackageTypeLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PackageTypesModels.PackageTypesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/packageTypes/packageTypes.models.ts b/test/generated/next/packageTypes/packageTypes.models.ts deleted file mode 100644 index 25b4d59..0000000 --- a/test/generated/next/packageTypes/packageTypes.models.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PackageTypesModels { -/** - * PackageTypeCodeEnumSchema - * @type { enum } - */ -export const PackageTypeCodeEnumSchema = z.enum(["1A", "1B", "1D", "1F", "1G", "1W", "2C", "3A", "3H", "43", "44", "4A", "4B", "4C", "4D", "4F", "4G", "4H", "5H", "5L", "5M", "6H", "6P", "7A", "7B", "8A", "8B", "8C", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AL", "AM", "AP", "AT", "AV", "B4", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "DA", "DB", "DC", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DP", "DR", "DS", "DT", "DU", "DV", "DW", "DX", "DY", "EC", "ED", "EE", "EF", "EG", "EH", "EI", "EN", "FB", "FC", "FD", "FE", "FI", "FL", "FO", "FP", "FR", "FT", "FW", "FX", "GB", "GI", "GL", "GR", "GU", "GY", "GZ", "HA", "HB", "HC", "HG", "HN", "HR", "IA", "IB", "IC", "ID", "IE", "IF", "IG", "IH", "IK", "IL", "IN", "IZ", "JB", "JC", "JG", "JR", "JT", "JY", "KG", "KI", "LE", "LG", "LT", "LU", "LV", "LZ", "MA", "MB", "MC", "ME", "MR", "MS", "MT", "MW", "MX", "NA", "NE", "NF", "NG", "NS", "NT", "NU", "NV", "OA", "OB", "OC", "OD", "OE", "OF", "OK", "OT", "OU", "P2", "PA", "PB", "PC", "PD", "PE", "PF", "PG", "PH", "PI", "PJ", "PK", "PL", "PN", "PO", "PP", "PR", "PT", "PU", "PV", "PX", "PY", "PZ", "QA", "QB", "QC", "QD", "QF", "QG", "QH", "QJ", "QK", "QL", "QM", "QN", "QP", "QQ", "QR", "QS", "RD", "RG", "RJ", "RK", "RL", "RO", "RT", "RZ", "SA", "SB", "SC", "SD", "SE", "SH", "SI", "SK", "SL", "SM", "SO", "SP", "SS", "ST", "SU", "SV", "SW", "SY", "SZ", "T1", "TB", "TC", "TD", "TE", "TG", "TI", "TK", "TL", "TN", "TO", "TR", "TS", "TT", "TU", "TV", "TW", "TY", "TZ", "UC", "UN", "VA", "VG", "VI", "VK", "VL", "VO", "VP", "VQ", "VN", "VR", "VS", "VY", "WA", "WB", "WC", "WD", "WF", "WG", "WH", "WJ", "WK", "WL", "WM", "WN", "WP", "WQ", "WR", "WS", "WT", "WU", "WV", "WW", "WX", "WY", "WZ", "XA", "XB", "XC", "XD", "XF", "XG", "XH", "XJ", "XK", "YA", "YB", "YC", "YD", "YF", "YG", "YH", "YJ", "YK", "YL", "YM", "YN", "YP", "YQ", "YR", "YS", "YT", "YV", "YW", "YX", "YY", "YZ", "ZA", "ZB", "ZC", "ZD", "ZF", "ZG", "ZH", "ZJ", "ZK", "ZL", "ZM", "ZN", "ZP", "ZQ", "ZR", "ZS", "ZT", "ZU", "ZV", "ZW", "ZX", "ZY", "ZZ"]); -export type PackageTypeCodeEnum = z.infer; -export const PackageTypeCodeEnum = PackageTypeCodeEnumSchema.enum; - -/** - * PackageTypeEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PackageTypeEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type PackageTypeEmployeeDTO = z.infer; - -/** - * PackageTypeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the package type - * @property { string } name Unique name for the package type - * @property { number } length Length of the package type - * @property { number } width Width of the package type - * @property { number } height Height of the package type - * @property { string } unit Measurement unit for dimensions - * @property { boolean } archived Indicates if the package type is archived - * @property { PackageTypeCodeEnum } code - * @property { string } createdById - * @property { PackageTypeEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PackageTypeEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const PackageTypeResponseDTOSchema = z.object({ id: z.string(), name: z.string(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), unit: z.string(), archived: z.boolean(), code: PackageTypeCodeEnumSchema.nullish(), createdById: z.string().nullish(), createdBy: PackageTypeEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PackageTypeEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type PackageTypeResponseDTO = z.infer; - -/** - * CreatePackageTypeRequestDTOSchema - * @type { object } - * @property { string } name Unique name for the package type - * @property { number } length Length of the package type - * @property { number } width Width of the package type - * @property { number } height Height of the package type - * @property { string } unit Measurement unit for dimensions - * @property { PackageTypeCodeEnum } code - */ -export const CreatePackageTypeRequestDTOSchema = z.object({ name: z.string(), length: z.number().nullish(), width: z.number().nullish(), height: z.number().nullish(), unit: z.string(), code: PackageTypeCodeEnumSchema.nullish() }); -export type CreatePackageTypeRequestDTO = z.infer; - -/** - * UpdatePackageTypeRequestDTOSchema - * @type { object } - * @property { string } name Updated name for package type - * @property { number } length Updated length of the package type - * @property { number } width Updated width of the package type - * @property { number } height Updated height of the package type - * @property { string } unit Updated measurement unit for dimensions - * @property { PackageTypeCodeEnum } code - */ -export const UpdatePackageTypeRequestDTOSchema = z.object({ name: z.string().nullable(), length: z.number().nullable(), width: z.number().nullable(), height: z.number().nullable(), unit: z.string().nullable(), code: PackageTypeCodeEnumSchema.nullable() }).partial(); -export type UpdatePackageTypeRequestDTO = z.infer; - -/** - * PackageTypePaginationFilterDtoSchema - * @type { object } - * @property { boolean } archived Archived - * @property { string } search - */ -export const PackageTypePaginationFilterDtoSchema = z.object({ archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); -export type PackageTypePaginationFilterDto = z.infer; - -/** - * PackageTypeLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const PackageTypeLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type PackageTypeLabelFilterDto = z.infer; - -/** - * PackageTypesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PackageTypesPaginateOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PackageTypesPaginateOrderParamEnum = z.infer; -export const PackageTypesPaginateOrderParamEnum = PackageTypesPaginateOrderParamEnumSchema.enum; - -/** - * PackageTypesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PackageTypeResponseDTO[] } items - */ -export const PackageTypesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PackageTypeResponseDTOSchema).nullable() }).partial().shape }); -export type PackageTypesPaginateResponse = z.infer; - -/** - * PackageTypesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PackageTypesPaginateLabelsOrderParamEnumSchema = z.enum(["matchCode", "description", "length", "width", "height", "unit", "name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PackageTypesPaginateLabelsOrderParamEnum = z.infer; -export const PackageTypesPaginateLabelsOrderParamEnum = PackageTypesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * PackageTypesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PackageTypesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PackageTypesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/packageTypes/packageTypes.queries.ts b/test/generated/next/packageTypes/packageTypes.queries.ts deleted file mode 100644 index 86ebe9e..0000000 --- a/test/generated/next/packageTypes/packageTypes.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PackageTypesAcl } from "./packageTypes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PackageTypesModels } from "./packageTypes.models"; -import { PackageTypesApi } from "./packageTypes.api"; - -export namespace PackageTypesQueries { -export const moduleName = QueryModule.PackageTypes; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string) => [...keys.all, "/package-types", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/package-types/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string) => [...keys.all, "/package-types/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/package-types/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Package Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Package Types - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypePaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypePaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PackageTypesAcl.canUsePaginate()); - return PackageTypesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new Package Type - * @permission Requires `canUseCreate` ability - * @param { PackageTypesModels.CreatePackageTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PackageTypesAcl.canUseCreate()); - return PackageTypesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate package type labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate package type labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchCode, description, length, width, height, unit, name, createdAt, updatedAt, createdBy, updatedBy. Example: `matchCode` - * @param { PackageTypesModels.PackageTypeLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PackageTypesModels.PackageTypeLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PackageTypesAcl.canUsePaginateLabels()); - return PackageTypesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get Package Type by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PackageTypesAcl.canUseFindById()); - return PackageTypesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Package Type - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PackageTypesModels.UpdatePackageTypeRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PackageTypesAcl.canUseUpdate()); - return PackageTypesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Package Type - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PackageTypesAcl.canUseArchive()); - return PackageTypesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive Package Type - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PackageTypesAcl.canUseUnarchive()); - return PackageTypesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/partnerNetworks/partnerNetworks.acl.ts b/test/generated/next/partnerNetworks/partnerNetworks.acl.ts deleted file mode 100644 index b56d576..0000000 --- a/test/generated/next/partnerNetworks/partnerNetworks.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PartnerNetworksAcl { -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "PartnerNetwork" -] as AbilityTuple<"Read", "PartnerNetwork">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "PartnerNetwork" -] as AbilityTuple<"Read", "PartnerNetwork">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "PartnerNetwork" -] as AbilityTuple<"Create", "PartnerNetwork">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "PartnerNetwork" -] as AbilityTuple<"Read", "PartnerNetwork">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "PartnerNetwork" -] as AbilityTuple<"Update", "PartnerNetwork">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "PartnerNetwork" -] as AbilityTuple<"Archive", "PartnerNetwork">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "PartnerNetwork" -] as AbilityTuple<"Archive", "PartnerNetwork">; - -} diff --git a/test/generated/next/partnerNetworks/partnerNetworks.api.ts b/test/generated/next/partnerNetworks/partnerNetworks.api.ts deleted file mode 100644 index 2c6a4bf..0000000 --- a/test/generated/next/partnerNetworks/partnerNetworks.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; - -export namespace PartnerNetworksApi { -export const paginateLabels = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworksPaginateLabelsResponseSchema }, - `/partner-networks/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworksPaginateResponseSchema }, - `/partner-networks`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: PartnerNetworksModels.CreatePartnerNetworkRequestDTO, ) => { - return AppRestClient.post( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks`, - ZodExtended.parse(PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}`, - - ) -}; -export const update = (id: string, data: PartnerNetworksModels.UpdatePartnerNetworkRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}`, - ZodExtended.parse(PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.patch( - { resSchema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema }, - `/partner-networks/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/partnerNetworks/partnerNetworks.configs.ts b/test/generated/next/partnerNetworks/partnerNetworks.configs.ts deleted file mode 100644 index b9d6545..0000000 --- a/test/generated/next/partnerNetworks/partnerNetworks.configs.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PartnerNetworksQueries } from "./partnerNetworks.queries"; -import { PartnerNetworksAcl } from "./partnerNetworks.acl"; - -export namespace PartnerNetworksConfigs { -export const partnerNetworksConfig = { - meta: { - title: "Partner Networks", - }, - readAll: { - acl: PartnerNetworksAcl.canUsePaginate, - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - paginated: PartnerNetworksQueries.usePaginate, - infinite: PartnerNetworksQueries.usePaginateInfinite, - filters: { - schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PartnerNetworksModels.PartnerNetworkPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PartnerNetworksModels.PartnerNetworksPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PartnerNetworksAcl.canUseFindById, - schema: PartnerNetworksModels.PartnerNetworkResponseDTOSchema, - query: PartnerNetworksQueries.useFindById, - }, - create: { - acl: PartnerNetworksAcl.canUseCreate, - schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, - mutation: PartnerNetworksQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PartnerNetworksModels.CreatePartnerNetworkRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: PartnerNetworksAcl.canUseUpdate, - schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, - mutation: PartnerNetworksQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PartnerNetworksModels.UpdatePartnerNetworkRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: PartnerNetworksAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PartnerNetworksQueries.usePaginateLabels, - infinite: PartnerNetworksQueries.usePaginateLabelsInfinite, - filters: { - schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PartnerNetworksModels.PartnerNetworkLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PartnerNetworksModels.PartnerNetworksPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/partnerNetworks/partnerNetworks.models.ts b/test/generated/next/partnerNetworks/partnerNetworks.models.ts deleted file mode 100644 index 55c49ce..0000000 --- a/test/generated/next/partnerNetworks/partnerNetworks.models.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PartnerNetworksModels { -/** - * PartnerNetworkEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PartnerNetworkEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type PartnerNetworkEmployeeDTO = z.infer; - -/** - * PartnerNetworkResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the partner network - * @property { string } name Name of the partner network - * @property { boolean } archived Whether the partner network is archived - * @property { string } createdById - * @property { PartnerNetworkEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PartnerNetworkEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const PartnerNetworkResponseDTOSchema = z.object({ id: z.string(), name: z.string(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: PartnerNetworkEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PartnerNetworkEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type PartnerNetworkResponseDTO = z.infer; - -/** - * PartnerNetworkLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const PartnerNetworkLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type PartnerNetworkLabelFilterDto = z.infer; - -/** - * PartnerNetworkPaginationFilterDtoSchema - * @type { object } - * @property { string } search Free search - * @property { boolean } archived - */ -export const PartnerNetworkPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type PartnerNetworkPaginationFilterDto = z.infer; - -/** - * CreatePartnerNetworkRequestDTOSchema - * @type { object } - * @property { string } name Name of the partner network - */ -export const CreatePartnerNetworkRequestDTOSchema = z.object({ name: z.string() }); -export type CreatePartnerNetworkRequestDTO = z.infer; - -/** - * UpdatePartnerNetworkRequestDTOSchema - * @type { object } - * @property { string } name Name of the partner network - */ -export const UpdatePartnerNetworkRequestDTOSchema = z.object({ name: z.string().nullable() }).partial(); -export type UpdatePartnerNetworkRequestDTO = z.infer; - -/** - * PartnerNetworksPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PartnerNetworksPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PartnerNetworksPaginateLabelsOrderParamEnum = z.infer; -export const PartnerNetworksPaginateLabelsOrderParamEnum = PartnerNetworksPaginateLabelsOrderParamEnumSchema.enum; - -/** - * PartnerNetworksPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PartnerNetworksPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PartnerNetworksPaginateLabelsResponse = z.infer; - -/** - * PartnerNetworksPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PartnerNetworksPaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PartnerNetworksPaginateOrderParamEnum = z.infer; -export const PartnerNetworksPaginateOrderParamEnum = PartnerNetworksPaginateOrderParamEnumSchema.enum; - -/** - * PartnerNetworksPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PartnerNetworkResponseDTO[] } items - */ -export const PartnerNetworksPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PartnerNetworkResponseDTOSchema).nullable() }).partial().shape }); -export type PartnerNetworksPaginateResponse = z.infer; - -} diff --git a/test/generated/next/partnerNetworks/partnerNetworks.queries.ts b/test/generated/next/partnerNetworks/partnerNetworks.queries.ts deleted file mode 100644 index 75ec4c5..0000000 --- a/test/generated/next/partnerNetworks/partnerNetworks.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PartnerNetworksAcl } from "./partnerNetworks.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PartnerNetworksModels } from "./partnerNetworks.models"; -import { PartnerNetworksApi } from "./partnerNetworks.api"; - -export namespace PartnerNetworksQueries { -export const moduleName = QueryModule.PartnerNetworks; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string) => [...keys.all, "/partner-networks/labels/paginate", "infinite", limit, order, filter, cursor] as const, - paginate: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/partner-networks", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string) => [...keys.all, "/partner-networks", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/partner-networks/:id", id] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate partner networks with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate partner networks with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PartnerNetworksAcl.canUsePaginateLabels()); - return PartnerNetworksApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Partner Networks - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Partner Networks - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PartnerNetworksModels.PartnerNetworkPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PartnerNetworksModels.PartnerNetworkPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PartnerNetworksAcl.canUsePaginate()); - return PartnerNetworksApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new Partner Network - * @permission Requires `canUseCreate` ability - * @param { PartnerNetworksModels.CreatePartnerNetworkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PartnerNetworksAcl.canUseCreate()); - return PartnerNetworksApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get Partner Network by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PartnerNetworksAcl.canUseFindById()); - return PartnerNetworksApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update Partner Network - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PartnerNetworksModels.UpdatePartnerNetworkRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PartnerNetworksAcl.canUseUpdate()); - return PartnerNetworksApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive Partner Network - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PartnerNetworksAcl.canUseArchive()); - return PartnerNetworksApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive Partner Network - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(PartnerNetworksAcl.canUseUnarchive()); - return PartnerNetworksApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.acl.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.acl.ts deleted file mode 100644 index 2ede29d..0000000 --- a/test/generated/next/paymentConfirmations/paymentConfirmations.acl.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PaymentConfirmationsAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read payment confirmation items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate payment confirmation document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -/** - * Use for `useGetEml` mutation ability. For global ability, omit the object parameter. - * @description Download payment confirmation as EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetEml` mutation - */ -export const canUseGetEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionInvoice", object) : "PositionInvoice" -] as AbilityTuple<"Read", "PositionInvoice" | ForcedSubject<"PositionInvoice"> & { officeId: string, }>; - -} diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.api.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.api.ts deleted file mode 100644 index dd56bcd..0000000 --- a/test/generated/next/paymentConfirmations/paymentConfirmations.api.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; - -export namespace PaymentConfirmationsApi { -export const get = (officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PaymentConfirmationsModels.PaymentConfirmationsGetResponseSchema }, - `/offices/${officeId}/payment-confirmations`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const generate = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payment-confirmations/generate`, - ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getEml = (officeId: string, data: PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/payment-confirmations/eml`, - ZodExtended.parse(PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.configs.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.configs.ts deleted file mode 100644 index af0fe49..0000000 --- a/test/generated/next/paymentConfirmations/paymentConfirmations.configs.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; -import { PaymentConfirmationsQueries } from "./paymentConfirmations.queries"; -import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; - -export namespace PaymentConfirmationsConfigs { -export const paymentConfirmationsConfig = { - meta: { - title: "Payment Confirmations", - }, - readAll: { - acl: PaymentConfirmationsAcl.canUseGet, - schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, - paginated: PaymentConfirmationsQueries.useGet, - infinite: PaymentConfirmationsQueries.useGetInfinite, - filters: { - schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PaymentConfirmationsModels.PaymentConfirmationItemFilterDtoSchema, - options: { - inputs: { - businessPartnerId: true, - paymentDate: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PaymentConfirmationsModels.PaymentConfirmationItemDtoSchema, - options: { - columns: { - invoiceId: true, - invoiceNumber: true, - invoiceDate: true, - invoiceAmount: true, - amount: true, - currencyNotation: true, - reference: true, - position: true, - paymentDate: true, - }, - sortable: PaymentConfirmationsModels.PaymentConfirmationsGetOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.models.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.models.ts deleted file mode 100644 index bdab7a3..0000000 --- a/test/generated/next/paymentConfirmations/paymentConfirmations.models.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PaymentConfirmationsModels { -/** - * PaymentConfirmationPositionDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - */ -export const PaymentConfirmationPositionDtoSchema = z.object({ id: z.string(), number: z.string() }); -export type PaymentConfirmationPositionDto = z.infer; - -/** - * PaymentConfirmationItemDtoSchema - * @type { object } - * @property { string } invoiceId Invoice ID - * @property { string } invoiceNumber Invoice number - * @property { string } invoiceDate Invoice date - * @property { number } invoiceAmount Invoice amount - * @property { number } amount Payment amount - * @property { string } currencyNotation Currency notation - * @property { string } reference Reference - * @property { PaymentConfirmationPositionDto } position Position information - * @property { string } paymentDate Payment date - */ -export const PaymentConfirmationItemDtoSchema = z.object({ invoiceId: z.string(), invoiceNumber: z.string(), invoiceDate: z.iso.datetime({ offset: true }), invoiceAmount: z.number(), amount: z.number(), currencyNotation: z.string(), reference: z.string().nullish(), position: PaymentConfirmationPositionDtoSchema, paymentDate: z.iso.datetime({ offset: true }) }); -export type PaymentConfirmationItemDto = z.infer; - -/** - * PaymentConfirmationItemFilterDtoSchema - * @type { object } - * @property { string } businessPartnerId Business partner ID - * @property { string } paymentDate Payment date - */ -export const PaymentConfirmationItemFilterDtoSchema = z.object({ businessPartnerId: z.string(), paymentDate: z.iso.datetime({ offset: true }) }); -export type PaymentConfirmationItemFilterDto = z.infer; - -/** - * GeneratePaymentConfirmationRequestDtoSchema - * @type { object } - * @property { string } businessPartnerId Business partner ID - * @property { string } paymentDate Payment date - * @property { string } positionId Position ID (optional) - */ -export const GeneratePaymentConfirmationRequestDtoSchema = z.object({ businessPartnerId: z.string(), paymentDate: z.iso.datetime({ offset: true }), positionId: z.string().nullish() }); -export type GeneratePaymentConfirmationRequestDto = z.infer; - -/** - * PaymentConfirmationsGetOrderParamEnumSchema - * @type { enum } - */ -export const PaymentConfirmationsGetOrderParamEnumSchema = z.enum(["paymentDate", "invoiceNumber", "amount"]); -export type PaymentConfirmationsGetOrderParamEnum = z.infer; -export const PaymentConfirmationsGetOrderParamEnum = PaymentConfirmationsGetOrderParamEnumSchema.enum; - -/** - * PaymentConfirmationsGetResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PaymentConfirmationItemDto[] } items - */ -export const PaymentConfirmationsGetResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PaymentConfirmationItemDtoSchema).nullable() }).partial().shape }); -export type PaymentConfirmationsGetResponse = z.infer; - -} diff --git a/test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts b/test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts deleted file mode 100644 index c780317..0000000 --- a/test/generated/next/paymentConfirmations/paymentConfirmations.queries.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PaymentConfirmationsAcl } from "./paymentConfirmations.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PaymentConfirmationsModels } from "./paymentConfirmations.models"; -import { PaymentConfirmationsApi } from "./paymentConfirmations.api"; - -export namespace PaymentConfirmationsQueries { -export const moduleName = QueryModule.PaymentConfirmations; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", officeId, filter, limit, order, page, cursor] as const, - getInfinite: (officeId: string, filter?: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit?: number, order?: string, cursor?: string) => [...keys.all, "/offices/:officeId/payment-confirmations", "infinite", officeId, filter, limit, order, cursor] as const, -}; - -/** - * Query `useGet` - * @summary Get payment confirmation items - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, filter, limit, order, page, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, filter, limit, order, page, cursor), - queryFn: () => { - checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useGetInfinite - * @summary Get payment confirmation items - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { PaymentConfirmationsModels.PaymentConfirmationItemFilterDto } object.filter Query parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): paymentDate, invoiceNumber, amount. Example: `paymentDate` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useGetInfinite = ({ officeId, filter, limit, order, cursor }: { officeId: string, filter: PaymentConfirmationsModels.PaymentConfirmationItemFilterDto, limit: number, order?: string, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.getInfinite(officeId, filter, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PaymentConfirmationsAcl.canUseGet({ officeId } )); - return PaymentConfirmationsApi.get(officeId, filter, limit, order, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useGenerate` - recommended when file should not be cached - * @summary Generate payment confirmation PDF - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PaymentConfirmationsAcl.canUseGenerate({ officeId } )); - return PaymentConfirmationsApi.generate(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGetEml` - recommended when file should not be cached - * @summary Get payment confirmation as EML file with PDF attachment - * @permission Requires `canUseGetEml` ability - * @param { string } mutation.officeId Path parameter - * @param { PaymentConfirmationsModels.GeneratePaymentConfirmationRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGetEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PaymentConfirmationsAcl.canUseGetEml({ officeId } )); - return PaymentConfirmationsApi.getEml(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/ports/ports.acl.ts b/test/generated/next/ports/ports.acl.ts deleted file mode 100644 index 9332110..0000000 --- a/test/generated/next/ports/ports.acl.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace PortsAcl { -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Port" -] as AbilityTuple<"Read", "Port">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Port" -] as AbilityTuple<"Create", "Port">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Port" -] as AbilityTuple<"Read", "Port">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Port" -] as AbilityTuple<"Update", "Port">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Port" -] as AbilityTuple<"Read", "Port">; - -} diff --git a/test/generated/next/ports/ports.api.ts b/test/generated/next/ports/ports.api.ts deleted file mode 100644 index bc62d36..0000000 --- a/test/generated/next/ports/ports.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PortsModels } from "./ports.models"; - -export namespace PortsApi { -export const paginate = (limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PortsModels.PortsPaginateResponseSchema }, - `/ports`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PortsModels.PortPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: PortsModels.CreatePortRequestDTO, ) => { - return AppRestClient.post( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports`, - ZodExtended.parse(PortsModels.CreatePortRequestDTOSchema, data), - - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PortsModels.PortsPaginateLabelsResponseSchema }, - `/ports/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PortsModels.PortsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PortsModels.PortLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const update = (id: string, data: PortsModels.UpdatePortRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports/${id}`, - ZodExtended.parse(PortsModels.UpdatePortRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: PortsModels.PortResponseDTOSchema }, - `/ports/${id}`, - - ) -}; -} diff --git a/test/generated/next/ports/ports.configs.ts b/test/generated/next/ports/ports.configs.ts deleted file mode 100644 index 33adfc6..0000000 --- a/test/generated/next/ports/ports.configs.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PortsModels } from "./ports.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PortsQueries } from "./ports.queries"; -import { PortsAcl } from "./ports.acl"; - -export namespace PortsConfigs { -export const portsConfig = { - meta: { - title: "Ports", - }, - readAll: { - acl: PortsAcl.canUsePaginate, - schema: PortsModels.PortResponseDTOSchema, - paginated: PortsQueries.usePaginate, - infinite: PortsQueries.usePaginateInfinite, - filters: { - schema: PortsModels.PortPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PortsModels.PortPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PortsModels.PortResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - matchCode: true, - address: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: PortsModels.PortsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PortsAcl.canUseFindById, - schema: PortsModels.PortResponseDTOSchema, - query: PortsQueries.useFindById, - }, - create: { - acl: PortsAcl.canUseCreate, - schema: PortsModels.CreatePortRequestDTOSchema, - mutation: PortsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PortsModels.CreatePortRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, - update: { - acl: PortsAcl.canUseUpdate, - schema: PortsModels.UpdatePortRequestDTOSchema, - mutation: PortsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PortsModels.UpdatePortRequestDTOSchema, - options: { - inputs: { - name: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: PortsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PortsQueries.usePaginateLabels, - infinite: PortsQueries.usePaginateLabelsInfinite, - filters: { - schema: PortsModels.PortLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PortsModels.PortLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: PortsModels.PortsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/ports/ports.models.ts b/test/generated/next/ports/ports.models.ts deleted file mode 100644 index 6958ed9..0000000 --- a/test/generated/next/ports/ports.models.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PortsModels { -/** - * PortCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PortCityDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type PortCityDto = z.infer; - -/** - * PortCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const PortCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type PortCountryDto = z.infer; - -/** - * PortAddressDtoSchema - * @type { object } - * @property { string } street Street address - * @property { string } zip ZIP/Postal code - * @property { PortCityDto } city - * @property { string } district District name - * @property { PortCountryDto } country - */ -export const PortAddressDtoSchema = z.object({ street: z.string(), zip: z.string(), city: PortCityDtoSchema.nullish(), district: z.string().nullish(), country: PortCountryDtoSchema.nullish() }); -export type PortAddressDto = z.infer; - -/** - * PortEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PortEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type PortEmployeeDTO = z.infer; - -/** - * PortResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the port - * @property { string } name Name of the port - * @property { string } matchCode Match code for the port - * @property { PortAddressDto } address Address details of the port - * @property { string } createdById - * @property { PortEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { PortEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const PortResponseDTOSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), address: PortAddressDtoSchema, createdById: z.string().nullish(), createdBy: PortEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: PortEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type PortResponseDTO = z.infer; - -/** - * PortPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter ports by name or match code - */ -export const PortPaginationFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type PortPaginationFilterDto = z.infer; - -/** - * PortLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const PortLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type PortLabelFilterDto = z.infer; - -/** - * CreatePortRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } matchCode - * @property { string } street Street address - * @property { string } secondaryStreet - * @property { string } zip ZIP / Postal code - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } district - */ -export const CreatePortRequestDTOSchema = z.object({ name: z.string(), matchCode: z.string(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), cityId: z.string(), countryId: z.string(), district: z.string().nullish() }); -export type CreatePortRequestDTO = z.infer; - -/** - * UpdatePortRequestDTOSchema - * @type { object } - * @property { string } name Updated name - * @property { string } matchCode Updated match code - * @property { string } street Updated street address - * @property { string } secondaryStreet Updated secondary street - * @property { string } zip Updated ZIP/Postal code - * @property { string } cityId Updated city id - * @property { string } countryId Updated country id - * @property { string } district - */ -export const UpdatePortRequestDTOSchema = z.object({ name: z.string().nullable(), matchCode: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable() }).partial(); -export type UpdatePortRequestDTO = z.infer; - -/** - * PortsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PortsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PortsPaginateOrderParamEnum = z.infer; -export const PortsPaginateOrderParamEnum = PortsPaginateOrderParamEnumSchema.enum; - -/** - * PortsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PortResponseDTO[] } items - */ -export const PortsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PortResponseDTOSchema).nullable() }).partial().shape }); -export type PortsPaginateResponse = z.infer; - -/** - * PortsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PortsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PortsPaginateLabelsOrderParamEnum = z.infer; -export const PortsPaginateLabelsOrderParamEnum = PortsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * PortsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PortsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PortsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/ports/ports.queries.ts b/test/generated/next/ports/ports.queries.ts deleted file mode 100644 index 7a034d1..0000000 --- a/test/generated/next/ports/ports.queries.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PortsAcl } from "./ports.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PortsModels } from "./ports.models"; -import { PortsApi } from "./ports.api"; - -export namespace PortsQueries { -export const moduleName = QueryModule.Ports; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string) => [...keys.all, "/ports", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/ports/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string) => [...keys.all, "/ports/labels/paginate", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/ports/:id", id] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Ports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Ports - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PortsAcl.canUsePaginate()); - return PortsApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create port - * @permission Requires `canUseCreate` ability - * @param { PortsModels.CreatePortRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(PortsAcl.canUseCreate()); - return PortsApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate ports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate ports with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { PortsModels.PortLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: PortsModels.PortLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PortsAcl.canUsePaginateLabels()); - return PortsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update port - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { PortsModels.UpdatePortRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(PortsAcl.canUseUpdate()); - return PortsApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get port by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(PortsAcl.canUseFindById()); - return PortsApi.findById(id) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/positionAccount/positionAccount.acl.ts b/test/generated/next/positionAccount/positionAccount.acl.ts deleted file mode 100644 index f887d12..0000000 --- a/test/generated/next/positionAccount/positionAccount.acl.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionAccountAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -} diff --git a/test/generated/next/positionAccount/positionAccount.api.ts b/test/generated/next/positionAccount/positionAccount.api.ts deleted file mode 100644 index b484a7e..0000000 --- a/test/generated/next/positionAccount/positionAccount.api.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { PositionAccountModels } from "./positionAccount.models"; - -export namespace PositionAccountApi { -export const get = (positionId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: PositionAccountModels.PositionAccountResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/account`, - - ) -}; -} diff --git a/test/generated/next/positionAccount/positionAccount.models.ts b/test/generated/next/positionAccount/positionAccount.models.ts deleted file mode 100644 index 3c1e98c..0000000 --- a/test/generated/next/positionAccount/positionAccount.models.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionAccountModels { -/** - * PositionAccountTotalsResponseDtoSchema - * @type { object } - * @property { number } totalBuyRates Total buy rates - * @property { number } totalSellRates Total sell rates - * @property { number } totalProfit Total profit - * @property { number } margin Margin percentage - * @property { number } displayAmount Display amount - * @property { string } displayCurrencyCode Display currency code - */ -export const PositionAccountTotalsResponseDtoSchema = z.object({ totalBuyRates: z.number(), totalSellRates: z.number(), totalProfit: z.number(), margin: z.number().nullish(), displayAmount: z.number(), displayCurrencyCode: z.string() }); -export type PositionAccountTotalsResponseDto = z.infer; - -/** - * PositionAccountMasterTotalsDtoSchema - * @type { object } - * @property { PositionAccountTotalsResponseDto } totals - * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency - */ -export const PositionAccountMasterTotalsDtoSchema = z.object({ totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema) }); -export type PositionAccountMasterTotalsDto = z.infer; - -/** - * ChildPositionAccountReferenceDtoSchema - * @type { object } - * @property { string } positionId - * @property { string } positionNumber - * @property { string } accountId - */ -export const ChildPositionAccountReferenceDtoSchema = z.object({ positionId: z.string().nullish(), positionNumber: z.string(), accountId: z.string() }); -export type ChildPositionAccountReferenceDto = z.infer; - -/** - * PositionAccountResponseDtoSchema - * @type { object } - * @property { string } id Account ID - * @property { string } positionId Position ID - * @property { string } invoiceId Invoice ID - * @property { CommonModels.PositionAccountItemDtoResponse[] } items Account items - * @property { PositionAccountTotalsResponseDto } totals - * @property { PositionAccountTotalsResponseDto[] } totalsPerCurrency - * @property { PositionAccountMasterTotalsDto } masterTotals - * @property { ChildPositionAccountReferenceDto[] } childPositionAccounts - */ -export const PositionAccountResponseDtoSchema = z.object({ id: z.string(), positionId: z.string().nullish(), invoiceId: z.string().nullish(), items: z.array(CommonModels.PositionAccountItemDtoResponseSchema), totals: PositionAccountTotalsResponseDtoSchema, totalsPerCurrency: z.array(PositionAccountTotalsResponseDtoSchema), masterTotals: PositionAccountMasterTotalsDtoSchema.nullish(), childPositionAccounts: z.array(ChildPositionAccountReferenceDtoSchema).nullish() }); -export type PositionAccountResponseDto = z.infer; - -} diff --git a/test/generated/next/positionAccount/positionAccount.queries.ts b/test/generated/next/positionAccount/positionAccount.queries.ts deleted file mode 100644 index c7d81b6..0000000 --- a/test/generated/next/positionAccount/positionAccount.queries.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionAccountAcl } from "./positionAccount.acl"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { PositionAccountApi } from "./positionAccount.api"; - -export namespace PositionAccountQueries { -export const moduleName = QueryModule.PositionAccount; - -export const keys = { - all: [moduleName] as const, - get: (positionId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account", positionId, officeId] as const, -}; - -/** - * Query `useGet` - * @summary Get position account details - * @permission Requires `canUseGet` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ positionId, officeId }: { positionId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(positionId, officeId), - queryFn: () => { - checkAcl(PositionAccountAcl.canUseGet({ officeId } )); - return PositionAccountApi.get(positionId, officeId) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/positionAccountItems/positionAccountItems.acl.ts b/test/generated/next/positionAccountItems/positionAccountItems.acl.ts deleted file mode 100644 index 8f2be12..0000000 --- a/test/generated/next/positionAccountItems/positionAccountItems.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionAccountItemsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useDeletePositionAccountItems` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePositionAccountItems` mutation - */ -export const canUseDeletePositionAccountItems = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ -export const canUseDuplicate = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Duplicate", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useReassign` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReassign` mutation - */ -export const canUseReassign = ( - object?: { officeId: string, } -) => [ - "Reassign", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Reassign", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useReorder` mutation ability. For global ability, omit the object parameter. - * @description Update positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation - */ -export const canUseReorder = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Update", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -} diff --git a/test/generated/next/positionAccountItems/positionAccountItems.api.ts b/test/generated/next/positionAccountItems/positionAccountItems.api.ts deleted file mode 100644 index fbc3532..0000000 --- a/test/generated/next/positionAccountItems/positionAccountItems.api.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionAccountItemsModels } from "./positionAccountItems.models"; - -export namespace PositionAccountItemsApi { -export const create = (positionId: string, officeId: string, data: PositionAccountItemsModels.CreatePositionAccountItemsRequestDto, ) => { - return AppRestClient.post( - { resSchema: PositionAccountItemsModels.PositionAccountItemsCreateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.CreatePositionAccountItemsRequestDtoSchema, data), - - ) -}; -export const deletePositionAccountItems = (positionId: string, officeId: string, data: PositionAccountItemsModels.DeletePositionAccountItemsRequestDto, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.DeletePositionAccountItemsRequestDtoSchema, data), - - ) -}; -export const update = (positionId: string, officeId: string, data: PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto, ) => { - return AppRestClient.patch( - { resSchema: PositionAccountItemsModels.PositionAccountItemsUpdateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items`, - ZodExtended.parse(PositionAccountItemsModels.UpdatePositionAccountItemsRequestDtoSchema, data), - - ) -}; -export const duplicate = (positionId: string, officeId: string, data: PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto, ) => { - return AppRestClient.post( - { resSchema: PositionAccountItemsModels.PositionAccountItemsDuplicateResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items/duplicate`, - ZodExtended.parse(PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDtoSchema, data), - - ) -}; -export const reassign = (positionId: string, officeId: string, data: PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto, ) => { - return AppRestClient.patch( - { resSchema: PositionAccountItemsModels.ReassignResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/items/reassign`, - ZodExtended.parse(PositionAccountItemsModels.ReassignPositionAccountItemsRequestDtoSchema, data), - - ) -}; -export const reorder = (positionId: string, itemId: string, officeId: string, data: PositionAccountItemsModels.ReorderPositionAccountItemRequestDto, ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/account/items/${itemId}/reorder`, - ZodExtended.parse(PositionAccountItemsModels.ReorderPositionAccountItemRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/positionAccountItems/positionAccountItems.models.ts b/test/generated/next/positionAccountItems/positionAccountItems.models.ts deleted file mode 100644 index 6bdc3fe..0000000 --- a/test/generated/next/positionAccountItems/positionAccountItems.models.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionAccountItemsModels { -/** - * CreatePositionChargeDataRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const CreatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); -export type CreatePositionChargeDataRequestDto = z.infer; - -/** - * CreatePositionTextDataRequestDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const CreatePositionTextDataRequestDtoSchema = z.object({ content: z.string().nullable() }).partial(); -export type CreatePositionTextDataRequestDto = z.infer; - -/** - * CreatePositionAccountItemRequestDtoSchema - * @type { object } - * @property { CommonModels.PositionAccountItemTypeEnum } type Item type - * @property { CreatePositionChargeDataRequestDto } charge Charge data if type is CHARGE - * @property { CreatePositionTextDataRequestDto } text Text data if type is TEXT - */ -export const CreatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema, charge: CreatePositionChargeDataRequestDtoSchema.nullish(), text: CreatePositionTextDataRequestDtoSchema.nullish() }); -export type CreatePositionAccountItemRequestDto = z.infer; - -/** - * CreatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { CreatePositionAccountItemRequestDto[] } items Array of items to create. All items in a single request must be of the same type (CHARGE, TEXT, or DIVIDER) - */ -export const CreatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(CreatePositionAccountItemRequestDtoSchema) }); -export type CreatePositionAccountItemsRequestDto = z.infer; - -/** - * UpdatePositionChargeDataRequestDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const UpdatePositionChargeDataRequestDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); -export type UpdatePositionChargeDataRequestDto = z.infer; - -/** - * UpdatePositionTextDataRequestDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const UpdatePositionTextDataRequestDtoSchema = z.object({ content: z.string() }); -export type UpdatePositionTextDataRequestDto = z.infer; - -/** - * UpdatePositionAccountItemRequestDtoSchema - * @type { object } - * @property { CommonModels.PositionAccountItemTypeEnum } type Item type - * @property { UpdatePositionChargeDataRequestDto } charge Charge data if type is CHARGE - * @property { UpdatePositionTextDataRequestDto } text Text data if type is TEXT - */ -export const UpdatePositionAccountItemRequestDtoSchema = z.object({ type: CommonModels.PositionAccountItemTypeEnumSchema, charge: UpdatePositionChargeDataRequestDtoSchema.nullish(), text: UpdatePositionTextDataRequestDtoSchema.nullish() }); -export type UpdatePositionAccountItemRequestDto = z.infer; - -/** - * UpdatePositionAccountItemWithIdRequestDtoSchema - * @type { object } - * @property { string } id ID of the item to update - * @property { UpdatePositionAccountItemRequestDto } data Data to update - */ -export const UpdatePositionAccountItemWithIdRequestDtoSchema = z.object({ id: z.string(), data: UpdatePositionAccountItemRequestDtoSchema }); -export type UpdatePositionAccountItemWithIdRequestDto = z.infer; - -/** - * UpdatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { UpdatePositionAccountItemWithIdRequestDto[] } items Array of items to update - */ -export const UpdatePositionAccountItemsRequestDtoSchema = z.object({ items: z.array(UpdatePositionAccountItemWithIdRequestDtoSchema) }); -export type UpdatePositionAccountItemsRequestDto = z.infer; - -/** - * DeletePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to delete - */ -export const DeletePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()) }); -export type DeletePositionAccountItemsRequestDto = z.infer; - -/** - * DuplicatePositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to duplicate - */ -export const DuplicatePositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()) }); -export type DuplicatePositionAccountItemsRequestDto = z.infer; - -/** - * ReassignPositionAccountItemsRequestDtoSchema - * @type { object } - * @property { string[] } ids Array of item IDs to reassign - * @property { string } targetPositionId Target position ID to reassign items to - */ -export const ReassignPositionAccountItemsRequestDtoSchema = z.object({ ids: z.array(z.string()), targetPositionId: z.string() }); -export type ReassignPositionAccountItemsRequestDto = z.infer; - -/** - * ReorderPositionAccountItemRequestDtoSchema - * @type { object } - * @property { number } orderPosition New order position for the item - */ -export const ReorderPositionAccountItemRequestDtoSchema = z.object({ orderPosition: z.number() }); -export type ReorderPositionAccountItemRequestDto = z.infer; - -/** - * PositionAccountItemsCreateResponseSchema - * @type { array } - */ -export const PositionAccountItemsCreateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); -export type PositionAccountItemsCreateResponse = z.infer; - -/** - * PositionAccountItemsUpdateResponseSchema - * @type { array } - */ -export const PositionAccountItemsUpdateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); -export type PositionAccountItemsUpdateResponse = z.infer; - -/** - * PositionAccountItemsDuplicateResponseSchema - * @type { array } - */ -export const PositionAccountItemsDuplicateResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); -export type PositionAccountItemsDuplicateResponse = z.infer; - -/** - * ReassignResponseSchema - * @type { array } - */ -export const ReassignResponseSchema = z.array(CommonModels.PositionAccountItemDtoResponseSchema); -export type ReassignResponse = z.infer; - -} diff --git a/test/generated/next/positionAccountItems/positionAccountItems.queries.ts b/test/generated/next/positionAccountItems/positionAccountItems.queries.ts deleted file mode 100644 index a3b1ab7..0000000 --- a/test/generated/next/positionAccountItems/positionAccountItems.queries.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionAccountItemsAcl } from "./positionAccountItems.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionAccountItemsModels } from "./positionAccountItems.models"; -import { PositionAccountItemsApi } from "./positionAccountItems.api"; - -export namespace PositionAccountItemsQueries { -export const moduleName = QueryModule.PositionAccountItems; - - - -/** - * Mutation `useCreate` - * @summary Create position account items (bulk) - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.CreatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseCreate({ officeId } )); - return PositionAccountItemsApi.create(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePositionAccountItems` - * @summary Delete position account items (bulk) - * @permission Requires `canUseDeletePositionAccountItems` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.DeletePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeletePositionAccountItems = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseDeletePositionAccountItems({ officeId } )); - return PositionAccountItemsApi.deletePositionAccountItems(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update position account items (bulk) - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.UpdatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseUpdate({ officeId } )); - return PositionAccountItemsApi.update(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicate` - * @summary Duplicate position account items (bulk) - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.DuplicatePositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseDuplicate({ officeId } )); - return PositionAccountItemsApi.duplicate(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReassign` - * @summary Reassign position account items to another position (bulk) - * @permission Requires `canUseReassign` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.ReassignPositionAccountItemsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReassign = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseReassign({ officeId } )); - return PositionAccountItemsApi.reassign(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReorder` - * @summary Reorder position account item - * @permission Requires `canUseReorder` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { PositionAccountItemsModels.ReorderPositionAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, itemId, officeId, data }) => { - checkAcl(PositionAccountItemsAcl.canUseReorder({ officeId } )); - return PositionAccountItemsApi.reorder(positionId, itemId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/positionCargo/positionCargo.acl.ts b/test/generated/next/positionCargo/positionCargo.acl.ts deleted file mode 100644 index f62ee50..0000000 --- a/test/generated/next/positionCargo/positionCargo.acl.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionCargoAcl { -/** - * Use for `useListCargosByPositionId` query ability. For global ability, omit the object parameter. - * @description List cargo items by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByPositionId` query - */ -export const canUseListCargosByPositionId = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useCreateCargo` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateCargo` mutation - */ -export const canUseCreateCargo = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. - * @description List cargo labels by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query - */ -export const canUseListCargoLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. - * @description Get cargo summary by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query - */ -export const canUseGetCargoSummary = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. - * @description Get cargo item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query - */ -export const canUseGetCargoById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Read", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. - * @description Update cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation - */ -export const canUseUpdateCargo = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation - */ -export const canUseDeleteCargo = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation - */ -export const canUseCreateBulkCargos = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation - */ -export const canUseDuplicateCargo = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/next/positionCargo/positionCargo.api.ts b/test/generated/next/positionCargo/positionCargo.api.ts deleted file mode 100644 index a89b2ec..0000000 --- a/test/generated/next/positionCargo/positionCargo.api.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionCargoModels } from "./positionCargo.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoApi { -export const listCargosByPositionId = (officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.ListCargosByPositionIdResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos`, - { - params: { - order: ZodExtended.parse(PositionCargoModels.ListCargosByPositionIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const createCargo = (officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - - ) -}; -export const listCargoLabels = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.PositionCargoListCargoLabelsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/labels`, - - ) -}; -export const getCargoSummary = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionCargoModels.PositionCargoGetCargoSummaryResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/summary`, - - ) -}; -export const getCargoById = (officeId: string, positionId: string, cargoId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - - ) -}; -export const updateCargo = (officeId: string, positionId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - - ) -}; -export const deleteCargo = (officeId: string, positionId: string, cargoId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}`, - - ) -}; -export const createBulkCargos = (numberOfCargos: number, officeId: string, positionId: string, data: CommonModels.CreatePositionCargoDTO, ) => { - return AppRestClient.post( - { resSchema: PositionCargoModels.PositionCargoCreateBulkCargosResponseSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/bulk/${numberOfCargos}`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - - ) -}; -export const duplicateCargo = (officeId: string, positionId: string, cargoId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/duplicate`, - - ) -}; -} diff --git a/test/generated/next/positionCargo/positionCargo.configs.ts b/test/generated/next/positionCargo/positionCargo.configs.ts deleted file mode 100644 index a62c692..0000000 --- a/test/generated/next/positionCargo/positionCargo.configs.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoQueries } from "./positionCargo.queries"; -import { PositionCargoAcl } from "./positionCargo.acl"; - -export namespace PositionCargoConfigs { -export const cargosConfig = { - meta: { - title: "Cargos", - }, - readAll: { - acl: PositionCargoAcl.canUseListCargosByPositionId, - schema: CommonModels.PositionCargoResponseDTOSchema, - paginated: PositionCargoQueries.useListCargosByPositionId, - infinite: PositionCargoQueries.useListCargosByPositionIdInfinite, - columns: dynamicColumns({ - schema: CommonModels.PositionCargoResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - quoteId: true, - rootFolderId: true, - cargoType: true, - autoCalculateTotals: true, - autoCalculateRates: true, - autoCalculateVgm: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - rateOptions: true, - rateClass: true, - textForCustoms: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - ratePerKg: true, - totalRate: true, - tare: true, - vgm: true, - hsCodeLabels: true, - note: true, - packages: true, - createdAt: true, - updatedAt: true, - completeWeight: true, - packageTotals: true, - }, - }, -}), - }, - read: { - acl: PositionCargoAcl.canUseGetCargoById, - schema: CommonModels.PositionCargoResponseDTOSchema, - query: PositionCargoQueries.useGetCargoById, - }, - create: { - acl: PositionCargoAcl.canUseCreateCargo, - schema: CommonModels.CreatePositionCargoDTOSchema, - mutation: PositionCargoQueries.useCreateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.CreatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, -}) - }, - update: { - acl: PositionCargoAcl.canUseUpdateCargo, - schema: CommonModels.UpdatePositionCargoDTOSchema, - mutation: PositionCargoQueries.useUpdateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.UpdatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, -}) - }, - delete: { - acl: PositionCargoAcl.canUseDeleteCargo, - mutation: PositionCargoQueries.useDeleteCargo, - }, -}; - -} diff --git a/test/generated/next/positionCargo/positionCargo.models.ts b/test/generated/next/positionCargo/positionCargo.models.ts deleted file mode 100644 index 53c8e51..0000000 --- a/test/generated/next/positionCargo/positionCargo.models.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoModels { -/** - * ListCargosByPositionIdOrderParamSchema - * @type { array } - */ -export const ListCargosByPositionIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).nullish(); -export type ListCargosByPositionIdOrderParam = z.infer; - -/** - * ListCargosByPositionIdResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.PositionCargoResponseDTO[] } items - */ -export const ListCargosByPositionIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).nullable() }).partial().shape }); -export type ListCargosByPositionIdResponse = z.infer; - -/** - * PositionCargoListCargoLabelsResponseSchema - * @type { array } - */ -export const PositionCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type PositionCargoListCargoLabelsResponse = z.infer; - -/** - * PositionCargoGetCargoSummaryResponseSchema - * @type { array } - */ -export const PositionCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema); -export type PositionCargoGetCargoSummaryResponse = z.infer; - -/** - * PositionCargoCreateBulkCargosResponseSchema - * @type { array } - */ -export const PositionCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema); -export type PositionCargoCreateBulkCargosResponse = z.infer; - -} diff --git a/test/generated/next/positionCargo/positionCargo.queries.ts b/test/generated/next/positionCargo/positionCargo.queries.ts deleted file mode 100644 index 0177598..0000000 --- a/test/generated/next/positionCargo/positionCargo.queries.ts +++ /dev/null @@ -1,293 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionCargoAcl } from "./positionCargo.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionCargoModels } from "./positionCargo.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoApi } from "./positionCargo.api"; - -export namespace PositionCargoQueries { -export const moduleName = QueryModule.PositionCargo; - -export const keys = { - all: [moduleName] as const, - listCargosByPositionId: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", officeId, positionId, limit, order, page, cursor] as const, - listCargosByPositionIdInfinite: (officeId: string, positionId: string, limit?: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos", "infinite", officeId, positionId, limit, order, cursor] as const, - listCargoLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/labels", officeId, positionId] as const, - getCargoSummary: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/summary", officeId, positionId] as const, - getCargoById: (officeId: string, positionId: string, cargoId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cargos/:cargoId", officeId, positionId, cargoId] as const, -}; - -/** - * Query `useListCargosByPositionId` - * @summary List all cargo items for a position - * @permission Requires `canUseListCargosByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByPositionId = ({ officeId, positionId, limit, order, page, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargosByPositionId(officeId, positionId, limit, order, page, cursor), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListCargosByPositionIdInfinite - * @summary List all cargo items for a position - * @permission Requires `canUseListCargosByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionCargoModels.ListCargosByPositionIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByPositionIdInfinite = ({ officeId, positionId, limit, order, cursor }: { officeId: string, positionId: string, limit: number, order?: PositionCargoModels.ListCargosByPositionIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCargosByPositionIdInfinite(officeId, positionId, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionCargoAcl.canUseListCargosByPositionId({ officeId } )); - return PositionCargoApi.listCargosByPositionId(officeId, positionId, limit, order, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreateCargo` - * @summary Create a new cargo item - * @permission Requires `canUseCreateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionCargoAcl.canUseCreateCargo({ officeId } )); - return PositionCargoApi.createCargo(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListCargoLabels` - * @summary List all cargo labels for a position - * @permission Requires `canUseListCargoLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargoLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargoLabels(officeId, positionId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseListCargoLabels({ officeId } )); - return PositionCargoApi.listCargoLabels(officeId, positionId) }, - ...options, - }); -}; - -/** - * Query `useGetCargoSummary` - * @summary Get cargo summary grouped by transport unit type - * @permission Requires `canUseGetCargoSummary` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoSummary = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoSummary(officeId, positionId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseGetCargoSummary({ officeId } )); - return PositionCargoApi.getCargoSummary(officeId, positionId) }, - ...options, - }); -}; - -/** - * Query `useGetCargoById` - * @summary Get a specific cargo item - * @permission Requires `canUseGetCargoById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.cargoId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoById = ({ officeId, positionId, cargoId }: { officeId: string, positionId: string, cargoId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoById(officeId, positionId, cargoId), - queryFn: () => { - checkAcl(PositionCargoAcl.canUseGetCargoById({ officeId } )); - return PositionCargoApi.getCargoById(officeId, positionId, cargoId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCargo` - * @summary Update a cargo item - * @permission Requires `canUseUpdateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, data }) => { - checkAcl(PositionCargoAcl.canUseUpdateCargo({ officeId } )); - return PositionCargoApi.updateCargo(officeId, positionId, cargoId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteCargo` - * @summary Delete a cargo item - * @permission Requires `canUseDeleteCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId }) => { - checkAcl(PositionCargoAcl.canUseDeleteCargo({ officeId } )); - return PositionCargoApi.deleteCargo(officeId, positionId, cargoId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateBulkCargos` - * @summary Create a new cargo item - * @permission Requires `canUseCreateBulkCargos` ability - * @param { number } mutation.numberOfCargos Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ numberOfCargos, officeId, positionId, data }) => { - checkAcl(PositionCargoAcl.canUseCreateBulkCargos({ officeId } )); - return PositionCargoApi.createBulkCargos(numberOfCargos, officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicateCargo` - * @summary Duplicate a cargo item - * @permission Requires `canUseDuplicateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId }) => { - checkAcl(PositionCargoAcl.canUseDuplicateCargo({ officeId } )); - return PositionCargoApi.duplicateCargo(officeId, positionId, cargoId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, positionId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/positionCargoPackage/positionCargoPackage.acl.ts b/test/generated/next/positionCargoPackage/positionCargoPackage.acl.ts deleted file mode 100644 index 552d48c..0000000 --- a/test/generated/next/positionCargoPackage/positionCargoPackage.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionCargoPackageAcl { -/** - * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. - * @description Create cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation - */ -export const canUseCreatePackage = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Create", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. - * @description Update cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation - */ -export const canUseUpdatePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation - */ -export const canUseDeletePackage = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Delete", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation - */ -export const canUseDuplicatePackage = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Duplicate", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -/** - * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. - * @description Move cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation - */ -export const canUseMovePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("PositionCargo", object) : "PositionCargo" -] as AbilityTuple<"Update", "PositionCargo" | ForcedSubject<"PositionCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/next/positionCargoPackage/positionCargoPackage.api.ts b/test/generated/next/positionCargoPackage/positionCargoPackage.api.ts deleted file mode 100644 index 0ccfabd..0000000 --- a/test/generated/next/positionCargoPackage/positionCargoPackage.api.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionCargoPackageApi { -export const createPackage = (officeId: string, positionId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages`, - ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - - ) -}; -export const updatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - - ) -}; -export const deletePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}`, - - ) -}; -export const duplicatePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - - ) -}; -export const movePackage = (officeId: string, positionId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cargos/${cargoId}/packages/${packageId}/move`, - ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts b/test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts deleted file mode 100644 index fc4eedb..0000000 --- a/test/generated/next/positionCargoPackage/positionCargoPackage.queries.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionCargoPackageAcl } from "./positionCargoPackage.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionCargoPackageApi } from "./positionCargoPackage.api"; - -export namespace PositionCargoPackageQueries { -export const moduleName = QueryModule.PositionCargoPackage; - - - -/** - * Mutation `useCreatePackage` - * @summary Create a new package for a cargo - * @permission Requires `canUseCreatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseCreatePackage({ officeId } )); - return PositionCargoPackageApi.createPackage(officeId, positionId, cargoId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdatePackage` - * @summary Update a package - * @permission Requires `canUseUpdatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseUpdatePackage({ officeId } )); - return PositionCargoPackageApi.updatePackage(officeId, positionId, cargoId, packageId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePackage` - * @summary Delete a package - * @permission Requires `canUseDeletePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId }) => { - checkAcl(PositionCargoPackageAcl.canUseDeletePackage({ officeId } )); - return PositionCargoPackageApi.deletePackage(officeId, positionId, cargoId, packageId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicatePackage` - * @summary Duplicate a package - * @permission Requires `canUseDuplicatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId }) => { - checkAcl(PositionCargoPackageAcl.canUseDuplicatePackage({ officeId } )); - return PositionCargoPackageApi.duplicatePackage(officeId, positionId, cargoId, packageId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMovePackage` - * @summary Move a package to a different cargo - * @permission Requires `canUseMovePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, cargoId, packageId, data }) => { - checkAcl(PositionCargoPackageAcl.canUseMovePackage({ officeId } )); - return PositionCargoPackageApi.movePackage(officeId, positionId, cargoId, packageId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/positionChecklist/positionChecklist.acl.ts b/test/generated/next/positionChecklist/positionChecklist.acl.ts deleted file mode 100644 index 1f8dfca..0000000 --- a/test/generated/next/positionChecklist/positionChecklist.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionChecklistAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List checklist items for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useApplyTemplates` mutation ability. For global ability, omit the object parameter. - * @description Apply checklist templates to position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useApplyTemplates` mutation - */ -export const canUseApplyTemplates = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useComplete` mutation ability. For global ability, omit the object parameter. - * @description Complete position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useComplete` mutation - */ -export const canUseComplete = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUncomplete` mutation ability. For global ability, omit the object parameter. - * @description Uncomplete position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUncomplete` mutation - */ -export const canUseUncomplete = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdateNotes` mutation ability. For global ability, omit the object parameter. - * @description Update position checklist item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateNotes` mutation - */ -export const canUseUpdateNotes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useReorder` mutation ability. For global ability, omit the object parameter. - * @description Reorder position checklist items - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useReorder` mutation - */ -export const canUseReorder = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/next/positionChecklist/positionChecklist.api.ts b/test/generated/next/positionChecklist/positionChecklist.api.ts deleted file mode 100644 index 97c694e..0000000 --- a/test/generated/next/positionChecklist/positionChecklist.api.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionChecklistModels } from "./positionChecklist.models"; - -export namespace PositionChecklistApi { -export const list = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionChecklistModels.PositionChecklistResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist`, - - ) -}; -export const applyTemplates = (officeId: string, positionId: string, data: PositionChecklistModels.ApplyTemplatesRequestDto, ) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.ApplyTemplatesResponseSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/apply-templates`, - ZodExtended.parse(PositionChecklistModels.ApplyTemplatesRequestDtoSchema, data), - - ) -}; -export const complete = (officeId: string, positionId: string, itemId: string, ) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/complete`, - - ) -}; -export const uncomplete = (officeId: string, positionId: string, itemId: string, ) => { - return AppRestClient.post( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}/uncomplete`, - - ) -}; -export const updateNotes = (officeId: string, positionId: string, itemId: string, data: PositionChecklistModels.UpdatePositionChecklistItemDto, ) => { - return AppRestClient.patch( - { resSchema: PositionChecklistModels.PositionChecklistItemResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/${itemId}`, - ZodExtended.parse(PositionChecklistModels.UpdatePositionChecklistItemDtoSchema, data), - - ) -}; -export const reorder = (officeId: string, positionId: string, data: PositionChecklistModels.ReorderPositionChecklistDto, ) => { - return AppRestClient.put( - { resSchema: PositionChecklistModels.PositionChecklistReorderResponseSchema }, - `/offices/${officeId}/positions/${positionId}/checklist/reorder`, - ZodExtended.parse(PositionChecklistModels.ReorderPositionChecklistDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/positionChecklist/positionChecklist.models.ts b/test/generated/next/positionChecklist/positionChecklist.models.ts deleted file mode 100644 index 98e27b8..0000000 --- a/test/generated/next/positionChecklist/positionChecklist.models.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { z } from "zod"; - -export namespace PositionChecklistModels { -/** - * PositionChecklistCompletedByResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const PositionChecklistCompletedByResponseDtoSchema = z.object({ id: z.string(), name: z.string().nullable() }); -export type PositionChecklistCompletedByResponseDto = z.infer; - -/** - * PositionChecklistItemResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } checklistItemId - * @property { string } templateId - * @property { number } order - * @property { boolean } completed - * @property { string } completedAt - * @property { PositionChecklistCompletedByResponseDto } completedBy - * @property { string } notes - * @property { string } name - */ -export const PositionChecklistItemResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), checklistItemId: z.string(), templateId: z.string().nullable(), order: z.number(), completed: z.boolean(), completedAt: z.iso.datetime({ offset: true }).nullable(), completedBy: PositionChecklistCompletedByResponseDtoSchema.nullable(), notes: z.string().nullable(), name: z.string().nullable() }); -export type PositionChecklistItemResponseDto = z.infer; - -/** - * PositionChecklistResponseDtoSchema - * @type { object } - * @property { PositionChecklistItemResponseDto[] } items - * @property { string[] } appliedTemplateIds - */ -export const PositionChecklistResponseDtoSchema = z.object({ items: z.array(PositionChecklistItemResponseDtoSchema), appliedTemplateIds: z.array(z.string()) }); -export type PositionChecklistResponseDto = z.infer; - -/** - * ApplyTemplatesRequestDtoSchema - * @type { object } - * @property { string[] } templateIds - */ -export const ApplyTemplatesRequestDtoSchema = z.object({ templateIds: z.array(z.string()) }); -export type ApplyTemplatesRequestDto = z.infer; - -/** - * UpdatePositionChecklistItemDtoSchema - * @type { object } - * @property { string } notes Max Length: `512` - */ -export const UpdatePositionChecklistItemDtoSchema = z.object({ notes: z.string().max(512).nullable() }).partial(); -export type UpdatePositionChecklistItemDto = z.infer; - -/** - * ReorderPositionChecklistDtoSchema - * @type { object } - * @property { string[] } itemIds - */ -export const ReorderPositionChecklistDtoSchema = z.object({ itemIds: z.array(z.string()) }); -export type ReorderPositionChecklistDto = z.infer; - -/** - * ApplyTemplatesResponseSchema - * @type { array } - */ -export const ApplyTemplatesResponseSchema = z.array(PositionChecklistItemResponseDtoSchema); -export type ApplyTemplatesResponse = z.infer; - -/** - * PositionChecklistReorderResponseSchema - * @type { array } - */ -export const PositionChecklistReorderResponseSchema = z.array(PositionChecklistItemResponseDtoSchema); -export type PositionChecklistReorderResponse = z.infer; - -} diff --git a/test/generated/next/positionChecklist/positionChecklist.queries.ts b/test/generated/next/positionChecklist/positionChecklist.queries.ts deleted file mode 100644 index d9649af..0000000 --- a/test/generated/next/positionChecklist/positionChecklist.queries.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionChecklistAcl } from "./positionChecklist.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionChecklistModels } from "./positionChecklist.models"; -import { PositionChecklistApi } from "./positionChecklist.api"; - -export namespace PositionChecklistQueries { -export const moduleName = QueryModule.PositionChecklist; - -export const keys = { - all: [moduleName] as const, - list: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/checklist", officeId, positionId] as const, -}; - -/** - * Query `useList` - * @summary Get position checklist items - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, positionId), - queryFn: () => { - checkAcl(PositionChecklistAcl.canUseList({ officeId } )); - return PositionChecklistApi.list(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useApplyTemplates` - * @summary Apply checklist templates to position - * @permission Requires `canUseApplyTemplates` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionChecklistModels.ApplyTemplatesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useApplyTemplates = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionChecklistAcl.canUseApplyTemplates({ officeId } )); - return PositionChecklistApi.applyTemplates(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useComplete` - * @summary Complete a checklist item - * @permission Requires `canUseComplete` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useComplete = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId }) => { - checkAcl(PositionChecklistAcl.canUseComplete({ officeId } )); - return PositionChecklistApi.complete(officeId, positionId, itemId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUncomplete` - * @summary Mark checklist item as not completed - * @permission Requires `canUseUncomplete` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useUncomplete = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId }) => { - checkAcl(PositionChecklistAcl.canUseUncomplete({ officeId } )); - return PositionChecklistApi.uncomplete(officeId, positionId, itemId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateNotes` - * @summary Update checklist item notes - * @permission Requires `canUseUpdateNotes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { PositionChecklistModels.UpdatePositionChecklistItemDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateNotes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, itemId, data }) => { - checkAcl(PositionChecklistAcl.canUseUpdateNotes({ officeId } )); - return PositionChecklistApi.updateNotes(officeId, positionId, itemId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useReorder` - * @summary Reorder checklist items - * @permission Requires `canUseReorder` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionChecklistModels.ReorderPositionChecklistDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useReorder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionChecklistAcl.canUseReorder({ officeId } )); - return PositionChecklistApi.reorder(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.acl.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.acl.ts deleted file mode 100644 index 8215460..0000000 --- a/test/generated/next/positionInvolvedParties/positionInvolvedParties.acl.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionInvolvedPartiesAcl { -/** - * Use for `useFindByPositionId` query ability. For global ability, omit the object parameter. - * @description List position involved parties - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindByPositionId` query - */ -export const canUseFindByPositionId = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation ability. For global ability, omit the object parameter. - * @description Delete position involved party - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsInvolvedPartiesByPartyId` mutation - */ -export const canUseDeleteOfficesPositionsInvolvedPartiesByPartyId = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts deleted file mode 100644 index bed6f4b..0000000 --- a/test/generated/next/positionInvolvedParties/positionInvolvedParties.api.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionInvolvedPartiesModels } from "./positionInvolvedParties.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionInvolvedPartiesApi { -export const findByPositionId = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionInvolvedPartiesModels.FindByPositionIdResponseSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties`, - - ) -}; -export const create = (officeId: string, positionId: string, data: CommonModels.CreateInvolvedPartyRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties`, - ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - - ) -}; -export const update = (officeId: string, positionId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - - ) -}; -export const deleteOfficesPositionsInvolvedPartiesByPartyId = (officeId: string, positionId: string, partyId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/involved-parties/${partyId}`, - - ) -}; -} diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts deleted file mode 100644 index 310c296..0000000 --- a/test/generated/next/positionInvolvedParties/positionInvolvedParties.models.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionInvolvedPartiesModels { -/** - * FindByPositionIdResponseSchema - * @type { array } - */ -export const FindByPositionIdResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema); -export type FindByPositionIdResponse = z.infer; - -} diff --git a/test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts b/test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts deleted file mode 100644 index 17bf8f0..0000000 --- a/test/generated/next/positionInvolvedParties/positionInvolvedParties.queries.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionInvolvedPartiesAcl } from "./positionInvolvedParties.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionInvolvedPartiesApi } from "./positionInvolvedParties.api"; - -export namespace PositionInvolvedPartiesQueries { -export const moduleName = QueryModule.PositionInvolvedParties; - -export const keys = { - all: [moduleName] as const, - findByPositionId: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/involved-parties", officeId, positionId] as const, -}; - -/** - * Query `useFindByPositionId` - * @summary List position involved parties - * @permission Requires `canUseFindByPositionId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindByPositionId = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findByPositionId(officeId, positionId), - queryFn: () => { - checkAcl(PositionInvolvedPartiesAcl.canUseFindByPositionId({ officeId } )); - return PositionInvolvedPartiesApi.findByPositionId(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create position involved party - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseCreate({ officeId } )); - return PositionInvolvedPartiesApi.create(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update position involved party - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, partyId, data }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseUpdate({ officeId } )); - return PositionInvolvedPartiesApi.update(officeId, positionId, partyId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteOfficesPositionsInvolvedPartiesByPartyId` - * @summary Delete position involved party - * @permission Requires `canUseDeleteOfficesPositionsInvolvedPartiesByPartyId` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteOfficesPositionsInvolvedPartiesByPartyId = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, partyId }) => { - checkAcl(PositionInvolvedPartiesAcl.canUseDeleteOfficesPositionsInvolvedPartiesByPartyId({ officeId } )); - return PositionInvolvedPartiesApi.deleteOfficesPositionsInvolvedPartiesByPartyId(officeId, positionId, partyId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts deleted file mode 100644 index 41a91df..0000000 --- a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.acl.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionProfitChangeTrackingAcl { -/** - * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. - * @description List position profit change groups - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.positionId positionId from positionId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query - */ -export const canUseFindProfitChangeGroups = ( - object?: { officeId: string, positionId: string, } -) => [ - "Read", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; - -/** - * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. - * @description Get position profit change group details - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.positionId positionId from positionId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query - */ -export const canUseFindProfitChangeGroupDetail = ( - object?: { officeId: string, positionId: string, } -) => [ - "Read", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"Read", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, positionId: string, }>; - -} diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts deleted file mode 100644 index fa66351..0000000 --- a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.api.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; - -export namespace PositionProfitChangeTrackingApi { -export const findProfitChangeGroups = (officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/account/profit-change-groups`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findProfitChangeGroupDetail = (groupId: string, officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema }, - `/offices/${officeId}/positions/${positionId}/account/profit-change-groups/${groupId}`, - - ) -}; -} diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts deleted file mode 100644 index a7c8680..0000000 --- a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.configs.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; -import { PositionProfitChangeTrackingQueries } from "./positionProfitChangeTracking.queries"; -import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; - -export namespace PositionProfitChangeTrackingConfigs { -export const profitChangeGroupsConfig = { - meta: { - title: "Profit Change Groups", - }, - readAll: { - acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups, - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, - paginated: PositionProfitChangeTrackingQueries.useFindProfitChangeGroups, - infinite: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, - filters: { - schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDtoSchema, - options: { - inputs: { - userId: true, - dateFrom: true, - dateTo: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDtoSchema, - options: { - columns: { - id: true, - timestamp: true, - users: true, - profit: true, - changeCount: true, - }, - sortable: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, - schema: PositionProfitChangeTrackingModels.PositionAccountProfitChangeGroupDetailDtoSchema, - query: PositionProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, - }, -}; - -} diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts deleted file mode 100644 index c953904..0000000 --- a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.models.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionProfitChangeTrackingModels { -/** - * PositionAccountProfitChangeGroupDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto[] } users - * @property { object } profit - * @property { number } profit.amount - * @property { string } profit.currencyCode - * @property { number } changeCount - */ -export const PositionAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema), profit: z.object({ amount: z.number(), currencyCode: z.string() }), changeCount: z.number() }); -export type PositionAccountProfitChangeGroupDto = z.infer; - -/** - * PositionAccountProfitChangeEntryDtoSchema - * @type { object } - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto } user - * @property { number } changeNumber - * @property { number } oldProfit - * @property { number } newProfit - * @property { string } currencyCode - */ -export const PositionAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }); -export type PositionAccountProfitChangeEntryDto = z.infer; - -/** - * PositionAccountProfitChangeGroupDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { string } currencyCode - * @property { PositionAccountProfitChangeEntryDto[] } entries - */ -export const PositionAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(PositionAccountProfitChangeEntryDtoSchema) }); -export type PositionAccountProfitChangeGroupDetailDto = z.infer; - -/** - * PositionProfitChangeTrackingFilterDtoSchema - * @type { object } - * @property { string } userId User IDs who made the changes - * @property { string } dateFrom Date range start - * @property { string } dateTo Date range end - */ -export const PositionProfitChangeTrackingFilterDtoSchema = z.object({ userId: z.string().nullable(), dateFrom: z.string().nullable(), dateTo: z.string().nullable() }).partial(); -export type PositionProfitChangeTrackingFilterDto = z.infer; - -/** - * PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema - * @type { enum } - */ -export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema = z.enum(["timestamp", "profitAmount", "changeCount"]); -export type PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = z.infer; -export const PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnum = PositionProfitChangeTrackingFindProfitChangeGroupsOrderParamEnumSchema.enum; - -/** - * PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionAccountProfitChangeGroupDto[] } items - */ -export const PositionProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(PositionAccountProfitChangeGroupDtoSchema).nullable() }).partial().shape }); -export type PositionProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; - -} diff --git a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts b/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts deleted file mode 100644 index 7c55275..0000000 --- a/test/generated/next/positionProfitChangeTracking/positionProfitChangeTracking.queries.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionProfitChangeTrackingAcl } from "./positionProfitChangeTracking.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { PositionProfitChangeTrackingModels } from "./positionProfitChangeTracking.models"; -import { PositionProfitChangeTrackingApi } from "./positionProfitChangeTracking.api"; - -export namespace PositionProfitChangeTrackingQueries { -export const moduleName = QueryModule.PositionProfitChangeTracking; - -export const keys = { - all: [moduleName] as const, - findProfitChangeGroups: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", officeId, positionId, limit, order, filter, page, cursor] as const, - findProfitChangeGroupsInfinite: (officeId: string, positionId: string, limit?: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups", "infinite", officeId, positionId, limit, order, filter, cursor] as const, - findProfitChangeGroupDetail: (groupId: string, officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/account/profit-change-groups/:groupId", groupId, officeId, positionId] as const, -}; - -/** - * Query `useFindProfitChangeGroups` - * @summary List position profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` - * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroups = ({ officeId, positionId, limit, order, filter, page, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindProfitChangeGroupsInfinite - * @summary List position profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): timestamp, profitAmount, changeCount. Example: `timestamp` - * @param { PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupsInfinite = ({ officeId, positionId, limit, order, filter, cursor }: { officeId: string, positionId: string, limit: number, order?: string, filter?: PositionProfitChangeTrackingModels.PositionProfitChangeTrackingFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findProfitChangeGroupsInfinite(officeId, positionId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroups(officeId, positionId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindProfitChangeGroupDetail` - * @summary Get position profit change group details - * @permission Requires `canUseFindProfitChangeGroupDetail` ability - * @param { string } object.groupId Path parameter - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupDetail = ({ groupId, officeId, positionId }: { groupId: string, officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, positionId), - queryFn: () => { - checkAcl(PositionProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, positionId } )); - return PositionProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, positionId) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/positionRoutes/positionRoutes.acl.ts b/test/generated/next/positionRoutes/positionRoutes.acl.ts deleted file mode 100644 index 7cd4cb8..0000000 --- a/test/generated/next/positionRoutes/positionRoutes.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionRoutesAcl { -/** - * Use for `useListRoutes` query ability. For global ability, omit the object parameter. - * @description List position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query - */ -export const canUseListRoutes = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Create position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation - */ -export const canUseCreateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Update position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation - */ -export const canUseUpdateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Delete position route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation - */ -export const canUseDeleteRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. - * @description Split position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation - */ -export const canUseSplitRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. - * @description Merge position routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation - */ -export const canUseMergeRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. - * @description Copy position route - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation - */ -export const canUseCopyRoute = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/next/positionRoutes/positionRoutes.api.ts b/test/generated/next/positionRoutes/positionRoutes.api.ts deleted file mode 100644 index 27b8e55..0000000 --- a/test/generated/next/positionRoutes/positionRoutes.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionRoutesApi { -export const listRoutes = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.RouteListResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes`, - - ) -}; -export const createRoutePoint = (officeId: string, positionId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points`, - ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - - ) -}; -export const updateRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - - ) -}; -export const deleteRoutePoint = (officeId: string, positionId: string, routeId: string, pointId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/route-points/${pointId}`, - - ) -}; -export const splitRoutes = (officeId: string, positionId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/split`, - - ) -}; -export const mergeRoutes = (officeId: string, positionId: string, data: CommonModels.MergeRoutesRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/merge`, - ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - - ) -}; -export const copyRoute = (officeId: string, positionId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/routes/${routeId}/copy`, - ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/positionRoutes/positionRoutes.queries.ts b/test/generated/next/positionRoutes/positionRoutes.queries.ts deleted file mode 100644 index b9544be..0000000 --- a/test/generated/next/positionRoutes/positionRoutes.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionRoutesAcl } from "./positionRoutes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionRoutesApi } from "./positionRoutes.api"; - -export namespace PositionRoutesQueries { -export const moduleName = QueryModule.PositionRoutes; - -export const keys = { - all: [moduleName] as const, - listRoutes: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes", officeId, positionId] as const, -}; - -/** - * Query `useListRoutes` - * @summary List routes with points for a position (unified for sea/air/road) - * @permission Requires `canUseListRoutes` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoutes = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoutes(officeId, positionId), - queryFn: () => { - checkAcl(PositionRoutesAcl.canUseListRoutes({ officeId } )); - return PositionRoutesApi.listRoutes(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateRoutePoint` - * @summary Create a route point - * @permission Requires `canUseCreateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, data }) => { - checkAcl(PositionRoutesAcl.canUseCreateRoutePoint({ officeId } )); - return PositionRoutesApi.createRoutePoint(officeId, positionId, routeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateRoutePoint` - * @summary Update a route point - * @permission Requires `canUseUpdateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, pointId, data }) => { - checkAcl(PositionRoutesAcl.canUseUpdateRoutePoint({ officeId } )); - return PositionRoutesApi.updateRoutePoint(officeId, positionId, routeId, pointId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRoutePoint` - * @summary Delete a route point - * @permission Requires `canUseDeleteRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, pointId }) => { - checkAcl(PositionRoutesAcl.canUseDeleteRoutePoint({ officeId } )); - return PositionRoutesApi.deleteRoutePoint(officeId, positionId, routeId, pointId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useSplitRoutes` - * @summary Split routes by cargo (sea positions only) - * @permission Requires `canUseSplitRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionRoutesAcl.canUseSplitRoutes({ officeId } )); - return PositionRoutesApi.splitRoutes(officeId, positionId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMergeRoutes` - * @summary Merge routes (sea positions only) - * @permission Requires `canUseMergeRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionRoutesAcl.canUseMergeRoutes({ officeId } )); - return PositionRoutesApi.mergeRoutes(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopyRoute` - * @summary Copy route points to another route (sea positions only) - * @permission Requires `canUseCopyRoute` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, routeId, data }) => { - checkAcl(PositionRoutesAcl.canUseCopyRoute({ officeId } )); - return PositionRoutesApi.copyRoute(officeId, positionId, routeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/positions/positions.acl.ts b/test/generated/next/positions/positions.acl.ts deleted file mode 100644 index 002471f..0000000 --- a/test/generated/next/positions/positions.acl.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace PositionsAcl { -/** - * Use for `useFindAll` query ability. For global ability, omit the object parameter. - * @description List position labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindAll` query - */ -export const canUseFindAll = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useTotalProfit` query ability. For global ability, omit the object parameter. - * @description Fake endpoint - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useTotalProfit` query - */ -export const canUseTotalProfit = ( - object?: { officeId: string, } -) => [ - "TotalProfitView", - object ? subject("PositionAccount", object) : "PositionAccount" -] as AbilityTuple<"TotalProfitView", "PositionAccount" | ForcedSubject<"PositionAccount"> & { officeId: string, }>; - -/** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ -export const canUseListAvailablePartnersFor = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useExportPositions` mutation ability. For global ability, omit the object parameter. - * @description Export positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportPositions` mutation - */ -export const canUseExportPositions = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Export", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useListRouteLabels` query ability. For global ability, omit the object parameter. - * @description List route labels for position - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRouteLabels` query - */ -export const canUseListRouteLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useGetDuplicateDefaultParameters` query ability. For global ability, omit the object parameter. - * @description Read position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetDuplicateDefaultParameters` query - */ -export const canUseGetDuplicateDefaultParameters = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ -export const canUseDuplicate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ -export const canUseCancel = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useRevertCancel` mutation ability. For global ability, omit the object parameter. - * @description Revert cancelled position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useRevertCancel` mutation - */ -export const canUseRevertCancel = ( - object?: { officeId: string, } -) => [ - "RevertCancel", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"RevertCancel", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useLinkChild` mutation ability. For global ability, omit the object parameter. - * @description Link positions to parent - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useLinkChild` mutation - */ -export const canUseLinkChild = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUnlinkChild` mutation ability. For global ability, omit the object parameter. - * @description Link positions to parent - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnlinkChild` mutation - */ -export const canUseUnlinkChild = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useListChild` query ability. For global ability, omit the object parameter. - * @description List positions for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListChild` query - */ -export const canUseListChild = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/next/positions/positions.api.ts b/test/generated/next/positions/positions.api.ts deleted file mode 100644 index 35825af..0000000 --- a/test/generated/next/positions/positions.api.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionsApi { -export const findAll = (officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsFindAllResponseSchema }, - `/offices/${officeId}/positions/labels`, - { - params: { - filter: ZodExtended.parse(PositionsModels.PositionLabelsFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsPaginateResponseSchema }, - `/offices/${officeId}/positions`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(PositionsModels.PositionsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(PositionsModels.PositionFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: PositionsModels.CreatePositionRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions`, - ZodExtended.parse(PositionsModels.CreatePositionRequestDtoSchema, data), - - ) -}; -export const totalProfit = (officeId: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.TotalProfitResponseSchema }, - `/offices/${officeId}/positions/fake-total-profit`, - - ) -}; -export const listAvailablePartnersFor = (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.PositionsListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/positions/${positionId}/available-partners`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), - }, - } - ) -}; -export const exportPositions = (officeId: string, data: PositionsModels.PositionExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/exports`, - ZodExtended.parse(PositionsModels.PositionExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const get = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}`, - - ) -}; -export const update = (officeId: string, positionId: string, data: PositionsModels.UpdatePositionDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}`, - ZodExtended.parse(PositionsModels.UpdatePositionDtoSchema, data), - - ) -}; -export const listRouteLabels = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.ListRouteLabelsResponseSchema }, - `/offices/${officeId}/positions/${positionId}/routes/labels`, - - ) -}; -export const getDuplicateDefaultParameters = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.DuplicatePositionDefaultParametersResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/duplicate/default-parameters`, - - ) -}; -export const duplicate = (officeId: string, positionId: string, data: PositionsModels.DuplicatePositionRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/duplicate`, - ZodExtended.parse(PositionsModels.DuplicatePositionRequestDtoSchema, data), - - ) -}; -export const cancel = (officeId: string, positionId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/cancel`, - - ) -}; -export const revertCancel = (officeId: string, positionId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/uncancel`, - - ) -}; -export const linkChild = (officeId: string, positionId: string, data: PositionsModels.LinkChildPositionsRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/children`, - ZodExtended.parse(PositionsModels.LinkChildPositionsRequestDtoSchema, data), - - ) -}; -export const unlinkChild = (officeId: string, positionId: string, data: PositionsModels.UnlinkChildPositionsRequestDto, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/children`, - ZodExtended.parse(PositionsModels.UnlinkChildPositionsRequestDtoSchema, data), - - ) -}; -export const listChild = (officeId: string, positionId: string, limit: number, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: PositionsModels.ListChildResponseSchema }, - `/offices/${officeId}/positions/${positionId}/children`, - { - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -} diff --git a/test/generated/next/positions/positions.configs.ts b/test/generated/next/positions/positions.configs.ts deleted file mode 100644 index 0e9cfce..0000000 --- a/test/generated/next/positions/positions.configs.ts +++ /dev/null @@ -1,259 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionsQueries } from "./positions.queries"; -import { PositionsAcl } from "./positions.acl"; - -export namespace PositionsConfigs { -export const positionsConfig = { - meta: { - title: "Positions", - }, - readAll: { - acl: PositionsAcl.canUsePaginate, - schema: PositionsModels.PositionPreviewResponseDtoSchema, - paginated: PositionsQueries.usePaginate, - infinite: PositionsQueries.usePaginateInfinite, - filters: { - schema: PositionsModels.PositionFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionsModels.PositionFilterDtoSchema, - options: { - inputs: { - transportMode: true, - customerId: true, - carrierId: true, - consigneeId: true, - isCancelled: true, - status: true, - number: true, - direction: true, - loadType: true, - serviceType: true, - employee: true, - searchQuery: true, - externalSystemId: true, - createdAt: true, - serviceDate: true, - departureDate: true, - arrivalDate: true, - blfromCostumerDate: true, - blfromCarrierDate: true, - customsDate: true, - vgmCustomerDate: true, - partnerNetworkId: true, - projectLiteId: true, - checklistItemsDone: true, - checklistItemsNotDone: true, - routing: true, - isExcludedFromStatistics: true, - isMasterPosition: true, - loadingPortId: true, - dischargePortId: true, - customerReference: true, - carrierReference: true, - consigneeReference: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: PositionsModels.PositionPreviewResponseDtoSchema, - options: { - columns: { - id: true, - externalSystemId: true, - transportMode: true, - direction: true, - loadType: true, - createdAt: true, - number: true, - isCancelled: true, - customer: true, - customerReference: true, - consignee: true, - consigneeReference: true, - carrier: true, - carrierReference: true, - positionNumber: true, - hblNumber: true, - mblNumber: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - origin: true, - loadDate: true, - loadingPort: true, - dischargePort: true, - destination: true, - deliveryDate: true, - equipment: true, - serviceType: true, - destinationOffice: true, - currency: true, - profit: true, - margin: true, - employee: true, - project: true, - serviceDate: true, - departureDate: true, - arrivalDate: true, - blfromCostumerDate: true, - blfromCarrierDate: true, - customsDate: true, - vgmCustomerDate: true, - routing: true, - notes: true, - isMasterPosition: true, - hasInvoices: true, - parentPosition: true, - }, - sortable: PositionsModels.PositionsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: PositionsAcl.canUseGet, - schema: CommonModels.PositionCoreResponseDtoSchema, - query: PositionsQueries.useGet, - }, - create: { - acl: PositionsAcl.canUseCreate, - schema: PositionsModels.CreatePositionRequestDtoSchema, - mutation: PositionsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: PositionsModels.CreatePositionRequestDtoSchema, - options: { - inputs: { - section: true, - direction: true, - transportMode: true, - loadType: true, - serviceType: true, - estimatedServiceDate: true, - customerBusinessPartnerId: true, - }, - }, -}) - }, - update: { - acl: PositionsAcl.canUseUpdate, - schema: PositionsModels.UpdatePositionDtoSchema, - mutation: PositionsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: PositionsModels.UpdatePositionDtoSchema, - options: { - inputs: { - externalSystemId: true, - statusDate: true, - status: true, - loadType: true, - incoterms: true, - secondIncoterms: true, - fillingCompany: true, - sellingContract: true, - fillingScacCode: true, - serviceValidity: true, - ratesValidity: true, - serviceType: true, - buyRateReference: true, - frequency: true, - isParentPosition: true, - isExcludedFromStatistics: true, - team: true, - salesRepId: true, - responsibleEmployeeId: true, - receivedByEmployeeId: true, - originOfficeId: true, - projectLiteId: true, - notes: true, - inttraTypeOfMove: true, - volumetricWeightModifier: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: PositionsAcl.canUseFindAll, - schema: CommonModels.LabelResponseDTOSchema, - paginated: PositionsQueries.useFindAll, - infinite: PositionsQueries.useFindAllInfinite, - filters: { - schema: PositionsModels.PositionLabelsFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: PositionsModels.PositionLabelsFilterDtoSchema, - options: { - inputs: { - search: true, - isParentPosition: true, - isLinkedPosition: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - }, -}), - }, -}; - -export const childrenConfig = { - meta: { - title: "Children", - }, - readAll: { - acl: PositionsAcl.canUseListChild, - schema: PositionsModels.ChildPositionResponseDtoSchema, - paginated: PositionsQueries.useListChild, - infinite: PositionsQueries.useListChildInfinite, - columns: dynamicColumns({ - schema: PositionsModels.ChildPositionResponseDtoSchema, - options: { - columns: { - id: true, - number: true, - packages: true, - weight: true, - volume: true, - customer: true, - profit: true, - }, - }, -}), - }, - create: { - acl: PositionsAcl.canUseLinkChild, - schema: PositionsModels.LinkChildPositionsRequestDtoSchema, - mutation: PositionsQueries.useLinkChild, - inputDefs: dynamicInputs({ - schema: PositionsModels.LinkChildPositionsRequestDtoSchema, - options: { - inputs: { - childPositionIds: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/next/positions/positions.models.ts b/test/generated/next/positions/positions.models.ts deleted file mode 100644 index 9c02819..0000000 --- a/test/generated/next/positions/positions.models.ts +++ /dev/null @@ -1,501 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace PositionsModels { -/** - * PositionPreviewResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } externalSystemId - * @property { CommonModels.TransportModeEnum } transportMode - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { string } createdAt - * @property { string } number - * @property { boolean } isCancelled - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { string } customer.phone - * @property { string } customer.email - * @property { string } customerReference - * @property { object } consignee - * @property { string } consignee.id - * @property { string } consignee.name - * @property { string } consignee.matchCode - * @property { string } consignee.label - * @property { string } consigneeReference - * @property { object } carrier - * @property { string } carrier.id - * @property { string } carrier.name - * @property { string } carrier.matchCode - * @property { string } carrier.label - * @property { string } carrierReference - * @property { number } positionNumber - * @property { string } hblNumber - * @property { string } mblNumber - * @property { string } bookingNumber - * @property { string } vessel - * @property { string } voyage - * @property { string } vesselCarrier Carrier name from route point (sea positions only) - * @property { object } origin - * @property { string } origin.id - * @property { string } origin.name - * @property { string } loadDate - * @property { object } loadingPort - * @property { string } loadingPort.id - * @property { string } loadingPort.name - * @property { object } dischargePort - * @property { string } dischargePort.id - * @property { string } dischargePort.name - * @property { object } destination - * @property { string } destination.id - * @property { string } destination.name - * @property { string } deliveryDate - * @property { string } equipment - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { object } destinationOffice - * @property { string } destinationOffice.id - * @property { string } destinationOffice.name - * @property { string } currency - * @property { number } profit - * @property { number } margin - * @property { object } employee - * @property { string } employee.id - * @property { string } employee.name - * @property { object } project - * @property { string } project.id - * @property { string } project.name - * @property { string } serviceDate - * @property { string } departureDate - * @property { string } arrivalDate - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.EditorContentResponseDto } notes Notes - * @property { boolean } isMasterPosition - * @property { boolean } hasInvoices Whether this position has at least one invoice - * @property { object } parentPosition - * @property { string } parentPosition.id - * @property { string } parentPosition.number - */ -export const PositionPreviewResponseDtoSchema = z.object({ id: z.string(), externalSystemId: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), number: z.string(), isCancelled: z.boolean(), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }), customerReference: z.string().nullish(), consignee: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).nullish(), consigneeReference: z.string().nullish(), carrier: z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).nullish(), carrierReference: z.string().nullish(), positionNumber: z.number().nullish(), hblNumber: z.string().nullish(), mblNumber: z.string().nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vesselCarrier: z.string().nullish(), origin: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), loadDate: z.iso.datetime({ offset: true }).nullish(), loadingPort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), dischargePort: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), destination: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), deliveryDate: z.iso.datetime({ offset: true }).nullish(), equipment: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), destinationOffice: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), currency: z.string().nullish(), profit: z.number().nullish(), margin: z.number().nullish(), employee: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), project: z.object({ id: z.string().nullable(), name: z.string().nullable() }).nullish(), serviceDate: z.iso.datetime({ offset: true }).nullish(), departureDate: z.iso.datetime({ offset: true }).nullish(), arrivalDate: z.iso.datetime({ offset: true }).nullish(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), notes: CommonModels.EditorContentResponseDtoSchema.nullish(), isMasterPosition: z.boolean(), hasInvoices: z.boolean().nullish(), parentPosition: z.object({ id: z.string().nullable(), number: z.string().nullable() }).nullish() }); -export type PositionPreviewResponseDto = z.infer; - -/** - * PositionFilterDtoSchema - * @type { object } - * @property { CommonModels.TransportModeEnum } transportMode - * @property { string[] } customerId - * @property { string[] } carrierId Filter positions by carrier IDs - * @property { string[] } consigneeId Filter positions by consignee IDs - * @property { boolean } isCancelled - * @property { CommonModels.PositionStatusEnum } status - * @property { string } number - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } employee Filter positions by employee IDs - * @property { string } searchQuery - * @property { string } externalSystemId Filter positions by external system ID (substring match) - * @property { CommonModels.DateRangeDto } createdAt - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.DateRangeDto } departureDate - * @property { CommonModels.DateRangeDto } arrivalDate - * @property { CommonModels.DateRangeDto } blfromCostumerDate - * @property { CommonModels.DateRangeDto } blfromCarrierDate - * @property { CommonModels.DateRangeDto } customsDate - * @property { CommonModels.DateRangeDto } vgmCustomerDate - * @property { string } partnerNetworkId Filter positions by partner network ID - * @property { string[] } projectLiteId Filter positions by project IDs - * @property { string[] } checklistItemsDone Checklist item ids that must be completed - * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics - * @property { boolean } isMasterPosition - * @property { string[] } loadingPortId Filter positions by loading port/airport IDs (checks both sea port of loading and air airport of departure) - * @property { string[] } dischargePortId Filter positions by discharge port/airport IDs (checks both sea port of discharge and air destination airport) - * @property { string } customerReference Filter positions by customer reference - * @property { string } carrierReference Filter positions by carrier reference - * @property { string } consigneeReference Filter positions by consignee reference - * @property { string } hblNumber Filter positions by HBL/HAWB number - * @property { string } mblNumber Filter positions by MBL/MAWB number - * @property { string } bookingNumber Filter positions by booking number - * @property { string } vessel Filter positions by vessel name - * @property { string } voyage Filter positions by voyage number - * @property { string } vesselCarrier Filter positions by vessel or carrier name - */ -export const PositionFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema.nullable(), customerId: z.array(z.string()).nullable(), carrierId: z.array(z.string()).nullable(), consigneeId: z.array(z.string()).nullable(), isCancelled: z.boolean().nullable(), status: CommonModels.PositionStatusEnumSchema.nullable(), number: z.string().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), employee: z.array(z.string()).nullable(), searchQuery: z.string().nullable(), externalSystemId: z.string().nullable(), createdAt: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), departureDate: CommonModels.DateRangeDtoSchema.nullable(), arrivalDate: CommonModels.DateRangeDtoSchema.nullable(), blfromCostumerDate: CommonModels.DateRangeDtoSchema.nullable(), blfromCarrierDate: CommonModels.DateRangeDtoSchema.nullable(), customsDate: CommonModels.DateRangeDtoSchema.nullable(), vgmCustomerDate: CommonModels.DateRangeDtoSchema.nullable(), partnerNetworkId: z.string().nullable(), projectLiteId: z.array(z.string()).nullable(), checklistItemsDone: z.array(z.string()).nullable(), checklistItemsNotDone: z.array(z.string()).nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable(), isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).nullable(), isMasterPosition: z.boolean().nullable(), loadingPortId: z.array(z.string()).nullable(), dischargePortId: z.array(z.string()).nullable(), customerReference: z.string().nullable(), carrierReference: z.string().nullable(), consigneeReference: z.string().nullable(), hblNumber: z.string().nullable(), mblNumber: z.string().nullable(), bookingNumber: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), vesselCarrier: z.string().nullable() }).partial(); -export type PositionFilterDto = z.infer; - -/** - * PositionExportFilterDtoSchema - * @type { object } - * @property { CommonModels.TransportModeEnum } transportMode - * @property { string[] } customerId - * @property { boolean } isCancelled - * @property { CommonModels.PositionStatusEnum } status - * @property { string } number - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } responsibleEmployee Filter positions by responsible employee IDs - * @property { string } searchQuery - * @property { string } externalSystemId Filter positions by external system ID (substring match) - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.DateRangeDto } serviceDate - * @property { CommonModels.DateRangeDto } dateOfDeparture - * @property { CommonModels.DateRangeDto } dateOfArrival - * @property { CommonModels.DateRangeDto } blfromCostumerDate - * @property { CommonModels.DateRangeDto } blfromCarrierDate - * @property { CommonModels.DateRangeDto } customsDate - * @property { CommonModels.DateRangeDto } vgmCustomerDate - * @property { string } partnerNetworkId Filter positions by partner network ID - * @property { string[] } projectLiteId Filter positions by project IDs - * @property { string[] } checklistItemsDone Checklist item ids that must be completed - * @property { string[] } checklistItemsNotDone Checklist item ids that must be not completed - * @property { CommonModels.SeaRoutingEnum } routing - * @property { CommonModels.BooleanFilterEnum[] } isExcludedFromStatistics - */ -export const PositionExportFilterDtoSchema = z.object({ transportMode: CommonModels.TransportModeEnumSchema.nullable(), customerId: z.array(z.string()).nullable(), isCancelled: z.boolean().nullable(), status: CommonModels.PositionStatusEnumSchema.nullable(), number: z.string().nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), responsibleEmployee: z.array(z.string()).nullable(), searchQuery: z.string().nullable(), externalSystemId: z.string().nullable(), statusDate: CommonModels.DateRangeDtoSchema.nullable(), serviceDate: CommonModels.DateRangeDtoSchema.nullable(), dateOfDeparture: CommonModels.DateRangeDtoSchema.nullable(), dateOfArrival: CommonModels.DateRangeDtoSchema.nullable(), blfromCostumerDate: CommonModels.DateRangeDtoSchema.nullable(), blfromCarrierDate: CommonModels.DateRangeDtoSchema.nullable(), customsDate: CommonModels.DateRangeDtoSchema.nullable(), vgmCustomerDate: CommonModels.DateRangeDtoSchema.nullable(), partnerNetworkId: z.string().nullable(), projectLiteId: z.array(z.string()).nullable(), checklistItemsDone: z.array(z.string()).nullable(), checklistItemsNotDone: z.array(z.string()).nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable(), isExcludedFromStatistics: z.array(CommonModels.BooleanFilterEnumSchema).nullable() }).partial(); -export type PositionExportFilterDto = z.infer; - -/** - * PositionExportColumnSchema - * @type { enum } - */ -export const PositionExportColumnSchema = z.enum(["id", "externalSystemId", "transportMode", "direction", "loadType", "createdAt", "number", "isCancelled", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeName", "consigneeReference", "carrierName", "carrierReference", "positionNumber", "hblNumber", "mblNumber", "bookingNumber", "vessel", "voyage", "originName", "loadDate", "loadingPortName", "dischargePortName", "destinationName", "deliveryDate", "equipment", "serviceTypeName", "departureDate", "arrivalDate", "destinationOfficeName", "currency", "profit", "margin", "employeeName", "projectName", "serviceDate", "routing", "notes", "blFromCustomerDate", "blFromCarrierDate", "customsDate", "vgmCustomerDate", "isMasterPosition", "parentPositionId", "parentPositionNumber"]); -export type PositionExportColumn = z.infer; -export const PositionExportColumn = PositionExportColumnSchema.enum; - -/** - * PositionExportRequestDtoSchema - * @type { object } - * @property { string } order Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @property { PositionExportColumn[] } columns Min Items: `1` - * @property { PositionExportFilterDto } filter - */ -export const PositionExportRequestDtoSchema = z.object({ order: z.string().nullable(), columns: z.array(PositionExportColumnSchema).min(1).nullable(), filter: PositionExportFilterDtoSchema.nullable() }).partial(); -export type PositionExportRequestDto = z.infer; - -/** - * CreatePositionRequestDtoSchema - * @type { object } - * @property { CommonModels.SectionEnum } section - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.TransportModeEnum } transportMode - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } estimatedServiceDate - * @property { string } customerBusinessPartnerId - */ -export const CreatePositionRequestDtoSchema = z.object({ section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, estimatedServiceDate: z.iso.datetime({ offset: true }), customerBusinessPartnerId: z.string() }); -export type CreatePositionRequestDto = z.infer; - -/** - * DuplicatePositionPackageInformationParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } packageType - * @property { boolean } packageQuantity - * @property { boolean } packageDescription - * @property { boolean } packageHsCodes - * @property { boolean } packageNetWeight - * @property { boolean } packageGrossWeight - * @property { boolean } packageCaseMark - * @property { boolean } packageNote - * @property { boolean } packageCustomsMark - */ -export const DuplicatePositionPackageInformationParametersDtoSchema = z.object({ enabled: z.boolean(), packageType: z.boolean(), packageQuantity: z.boolean(), packageDescription: z.boolean(), packageHsCodes: z.boolean(), packageNetWeight: z.boolean(), packageGrossWeight: z.boolean(), packageCaseMark: z.boolean(), packageNote: z.boolean(), packageCustomsMark: z.boolean() }); -export type DuplicatePositionPackageInformationParametersDto = z.infer; - -/** - * DuplicatePositionCargoParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { DuplicatePositionPackageInformationParametersDto } packageInformation - */ -export const DuplicatePositionCargoParametersDtoSchema = z.object({ enabled: z.boolean(), packageInformation: DuplicatePositionPackageInformationParametersDtoSchema }); -export type DuplicatePositionCargoParametersDto = z.infer; - -/** - * DuplicatePositionOverviewParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } quoteReference - */ -export const DuplicatePositionOverviewParametersDtoSchema = z.object({ enabled: z.boolean(), quoteReference: z.boolean() }); -export type DuplicatePositionOverviewParametersDto = z.infer; - -/** - * DuplicatePositionInvolvedPartiesParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } involvedPartySection - */ -export const DuplicatePositionInvolvedPartiesParametersDtoSchema = z.object({ enabled: z.boolean(), involvedPartySection: z.boolean() }); -export type DuplicatePositionInvolvedPartiesParametersDto = z.infer; - -/** - * DuplicatePositionRoutesParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } routeDates - * @property { boolean } routeLocation - */ -export const DuplicatePositionRoutesParametersDtoSchema = z.object({ enabled: z.boolean(), routeDates: z.boolean(), routeLocation: z.boolean() }); -export type DuplicatePositionRoutesParametersDto = z.infer; - -/** - * DuplicatePositionFinanceAccountParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } exchangeRate - */ -export const DuplicatePositionFinanceAccountParametersDtoSchema = z.object({ enabled: z.boolean(), exchangeRate: z.boolean() }); -export type DuplicatePositionFinanceAccountParametersDto = z.infer; - -/** - * DuplicatePositionDocumentsParametersDtoSchema - * @type { object } - * @property { boolean } enabled - * @property { boolean } hblWorkingDocument - * @property { boolean } siWorkingDocument - */ -export const DuplicatePositionDocumentsParametersDtoSchema = z.object({ enabled: z.boolean(), hblWorkingDocument: z.boolean(), siWorkingDocument: z.boolean() }); -export type DuplicatePositionDocumentsParametersDto = z.infer; - -/** - * DuplicatePositionParametersDtoSchema - * @type { object } - * @property { DuplicatePositionOverviewParametersDto } overview - * @property { DuplicatePositionInvolvedPartiesParametersDto } involvedParties - * @property { DuplicatePositionCargoParametersDto } cargo - * @property { DuplicatePositionRoutesParametersDto } routes - * @property { DuplicatePositionFinanceAccountParametersDto } financeAccount - * @property { DuplicatePositionDocumentsParametersDto } documents - */ -export const DuplicatePositionParametersDtoSchema = z.object({ overview: DuplicatePositionOverviewParametersDtoSchema, involvedParties: DuplicatePositionInvolvedPartiesParametersDtoSchema, cargo: DuplicatePositionCargoParametersDtoSchema, routes: DuplicatePositionRoutesParametersDtoSchema, financeAccount: DuplicatePositionFinanceAccountParametersDtoSchema, documents: DuplicatePositionDocumentsParametersDtoSchema }); -export type DuplicatePositionParametersDto = z.infer; - -/** - * DuplicatePositionDefaultParametersResponseDtoSchema - * @type { object } - * @property { string } estimatedServiceDate Suggested estimated service date for the duplicated position (ISO 8601) - * @property { DuplicatePositionParametersDto } parameters Default duplication parameters with section and sub-parameter flags - */ -export const DuplicatePositionDefaultParametersResponseDtoSchema = z.object({ estimatedServiceDate: z.string(), parameters: DuplicatePositionParametersDtoSchema }); -export type DuplicatePositionDefaultParametersResponseDto = z.infer; - -/** - * PositionSectionEnumSchema - * @type { enum } - */ -export const PositionSectionEnumSchema = z.enum(["overview", "involvedParties", "cargo", "financeAccount", "routes", "routeDates", "documents"]); -export type PositionSectionEnum = z.infer; -export const PositionSectionEnum = PositionSectionEnumSchema.enum; - -/** - * DuplicatePositionRequestDtoSchema - * @type { object } - * @property { PositionSectionEnum[] } sections Legacy: sections to duplicate. Ignored when parameters is provided. - * @property { DuplicatePositionParametersDto } parameters Nested parameters for duplication control. Preferred over sections. - * @property { string } estimatedServiceDate - */ -export const DuplicatePositionRequestDtoSchema = z.object({ sections: z.array(PositionSectionEnumSchema).nullish(), parameters: DuplicatePositionParametersDtoSchema.nullish(), estimatedServiceDate: z.iso.datetime({ offset: true }) }); -export type DuplicatePositionRequestDto = z.infer; - -/** - * UpdatePositionDtoSchema - * @type { object } - * @property { string } externalSystemId - * @property { string } statusDate - * @property { CommonModels.PositionStatusEnum } status - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.IncotermsEnum } incoterms - * @property { CommonModels.IncotermsEnum } secondIncoterms - * @property { string } fillingCompany - * @property { string } sellingContract - * @property { string } fillingScacCode - * @property { string } serviceValidity - * @property { string } ratesValidity - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } buyRateReference - * @property { CommonModels.FrequencyEnum } frequency - * @property { boolean } isParentPosition - * @property { boolean } isExcludedFromStatistics - * @property { string } team - * @property { string } salesRepId - * @property { string } responsibleEmployeeId - * @property { string } receivedByEmployeeId - * @property { string } originOfficeId - * @property { string } projectLiteId - * @property { CommonModels.EditorContentUpdateDto } notes Notes - * @property { CommonModels.MovementTypeEnum } inttraTypeOfMove - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const UpdatePositionDtoSchema = z.object({ externalSystemId: z.string().nullable(), statusDate: z.iso.datetime({ offset: true }).nullable(), status: CommonModels.PositionStatusEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), incoterms: CommonModels.IncotermsEnumSchema.nullable(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullable(), fillingCompany: z.string().nullable(), sellingContract: z.string().nullable(), fillingScacCode: z.string().nullable(), serviceValidity: z.iso.datetime({ offset: true }).nullable(), ratesValidity: z.iso.datetime({ offset: true }).nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), buyRateReference: z.string().nullable(), frequency: CommonModels.FrequencyEnumSchema.nullable(), isParentPosition: z.boolean().nullable(), isExcludedFromStatistics: z.boolean().nullable(), team: z.string().nullable(), salesRepId: z.string().nullable(), responsibleEmployeeId: z.string().nullable(), receivedByEmployeeId: z.string().nullable(), originOfficeId: z.string().nullable(), projectLiteId: z.string().nullable(), notes: CommonModels.EditorContentUpdateDtoSchema.nullable(), inttraTypeOfMove: CommonModels.MovementTypeEnumSchema.nullable(), volumetricWeightModifier: z.number().nullable() }).partial(); -export type UpdatePositionDto = z.infer; - -/** - * ChildPositionCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ChildPositionCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type ChildPositionCustomerDto = z.infer; - -/** - * ChildPositionProfitDtoSchema - * @type { object } - * @property { number } amount - * @property { string } currency - */ -export const ChildPositionProfitDtoSchema = z.object({ amount: z.number(), currency: z.string() }); -export type ChildPositionProfitDto = z.infer; - -/** - * ChildPositionResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } number - * @property { number } packages - * @property { number } weight - * @property { number } volume - * @property { ChildPositionCustomerDto } customer - * @property { ChildPositionProfitDto } profit - */ -export const ChildPositionResponseDtoSchema = z.object({ id: z.string(), number: z.string(), packages: z.number(), weight: z.number(), volume: z.number(), customer: ChildPositionCustomerDtoSchema, profit: ChildPositionProfitDtoSchema }); -export type ChildPositionResponseDto = z.infer; - -/** - * PositionLabelsFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } isParentPosition - * @property { boolean } isLinkedPosition - */ -export const PositionLabelsFilterDtoSchema = z.object({ search: z.string().nullable(), isParentPosition: z.boolean().nullable(), isLinkedPosition: z.boolean().nullable() }).partial(); -export type PositionLabelsFilterDto = z.infer; - -/** - * PositionListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const PositionListResponseDtoSchema = z.object({ items: z.array(z.string()), totalProfit: z.number(), profitPerPosition: z.number(), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type PositionListResponseDto = z.infer; - -/** - * LinkChildPositionsRequestDtoSchema - * @type { object } - * @property { string[] } childPositionIds - */ -export const LinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()) }); -export type LinkChildPositionsRequestDto = z.infer; - -/** - * UnlinkChildPositionsRequestDtoSchema - * @type { object } - * @property { string[] } childPositionIds - */ -export const UnlinkChildPositionsRequestDtoSchema = z.object({ childPositionIds: z.array(z.string()) }); -export type UnlinkChildPositionsRequestDto = z.infer; - -/** - * PositionsFindAllResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PositionsFindAllResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PositionsFindAllResponse = z.infer; - -/** - * PositionsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const PositionsPaginateOrderParamEnumSchema = z.enum(["number", "transportMode", "isCancelled", "direction", "loadType", "serviceDate", "createdAt", "departureDate", "arrivalDate", "blfromCostumerDate", "blfromCarrierDate", "customsDate", "vgmCustomerDate", "serviceType", "externalSystemId", "employee", "project", "profit", "margin", "isMasterPosition"]); -export type PositionsPaginateOrderParamEnum = z.infer; -export const PositionsPaginateOrderParamEnum = PositionsPaginateOrderParamEnumSchema.enum; - -/** - * PositionsPaginateResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionPreviewResponseDto[] } items - */ -export const PositionsPaginateResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).nullable() }).partial().shape }); -export type PositionsPaginateResponse = z.infer; - -/** - * TotalProfitResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerPosition - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { PositionPreviewResponseDto[] } items - */ -export const TotalProfitResponseSchema = z.object({ ...PositionListResponseDtoSchema.shape, ...z.object({ items: z.array(PositionPreviewResponseDtoSchema).nullable() }).partial().shape }); -export type TotalProfitResponse = z.infer; - -/** - * PositionsListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ -export const PositionsListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).nullable() }).partial().shape }); -export type PositionsListAvailablePartnersForResponse = z.infer; - -/** - * ListRouteLabelsResponseSchema - * @type { array } - */ -export const ListRouteLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type ListRouteLabelsResponse = z.infer; - -/** - * ListChildResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ChildPositionResponseDto[] } items - */ -export const ListChildResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ChildPositionResponseDtoSchema).nullable() }).partial().shape }); -export type ListChildResponse = z.infer; - -} diff --git a/test/generated/next/positions/positions.queries.ts b/test/generated/next/positions/positions.queries.ts deleted file mode 100644 index 3b89435..0000000 --- a/test/generated/next/positions/positions.queries.ts +++ /dev/null @@ -1,535 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { PositionsAcl } from "./positions.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PositionsModels } from "./positions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { PositionsApi } from "./positions.api"; - -export namespace PositionsQueries { -export const moduleName = QueryModule.Positions; - -export const keys = { - all: [moduleName] as const, - findAll: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", officeId, limit, filter, page, cursor] as const, - findAllInfinite: (officeId: string, limit?: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/labels", "infinite", officeId, limit, filter, cursor] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions", "infinite", officeId, limit, order, filter, cursor] as const, - totalProfit: (officeId: string) => [...keys.all, "/offices/:officeId/positions/fake-total-profit", officeId] as const, - listAvailablePartnersFor: (officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/positions/:positionId/available-partners", officeId, positionId, search, useCase] as const, - get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId", officeId, positionId] as const, - listRouteLabels: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/routes/labels", officeId, positionId] as const, - getDuplicateDefaultParameters: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/duplicate/default-parameters", officeId, positionId] as const, - listChild: (officeId: string, positionId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", officeId, positionId, limit, page, cursor] as const, - listChildInfinite: (officeId: string, positionId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/children", "infinite", officeId, positionId, limit, cursor] as const, -}; - -/** - * Query `useFindAll` - * @summary List all positions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAll = ({ officeId, limit, filter, page, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findAll(officeId, limit, filter, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUseFindAll({ officeId } )); - return PositionsApi.findAll(officeId, limit, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindAllInfinite - * @summary List all positions with only their labels - * @permission Requires `canUseFindAll` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { PositionsModels.PositionLabelsFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindAllInfinite = ({ officeId, limit, filter, cursor }: { officeId: string, limit: number, filter?: PositionsModels.PositionLabelsFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findAllInfinite(officeId, limit, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUseFindAll({ officeId } )); - return PositionsApi.findAll(officeId, limit, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginate` - * @summary List positions - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @param { PositionsModels.PositionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUsePaginate({ officeId } )); - return PositionsApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary List positions - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, transportMode, isCancelled, direction, loadType, serviceDate, createdAt, departureDate, arrivalDate, blfromCostumerDate, blfromCarrierDate, customsDate, vgmCustomerDate, serviceType, externalSystemId, employee, project, profit, margin, isMasterPosition. Example: `number` - * @param { PositionsModels.PositionFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: PositionsModels.PositionFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUsePaginate({ officeId } )); - return PositionsApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create position - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { PositionsModels.CreatePositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position created successfully - * @statusCodes [201, 400, 401, 404] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PositionsAcl.canUseCreate({ officeId } )); - return PositionsApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useTotalProfit` - * @summary List positions - * @permission Requires `canUseTotalProfit` ability - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useTotalProfit = ({ officeId }: { officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.totalProfit(officeId), - queryFn: () => { - checkAcl(PositionsAcl.canUseTotalProfit({ officeId } )); - return PositionsApi.totalProfit(officeId) }, - ...options, - }); -}; - -/** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for a position - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListAvailablePartnersFor = ({ officeId, positionId, search, useCase }: { officeId: string, positionId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, positionId, search, useCase), - queryFn: () => { - checkAcl(PositionsAcl.canUseListAvailablePartnersFor({ officeId } )); - return PositionsApi.listAvailablePartnersFor(officeId, positionId, search, useCase) }, - ...options, - }); -}; - -/** - * Mutation `useExportPositions` - recommended when file should not be cached - * @summary Export positions to Excel - * @permission Requires `canUseExportPositions` ability - * @param { string } mutation.officeId Path parameter - * @param { PositionsModels.PositionExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportPositions = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(PositionsAcl.canUseExportPositions({ officeId } )); - return PositionsApi.exportPositions(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGet` - * @summary Get position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Position retrieved successfully - * @statusCodes [200, 401, 403, 404] - */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseGet({ officeId } )); - return PositionsApi.get(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.UpdatePositionDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position updated successfully - * @statusCodes [200, 400, 401, 404] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseUpdate({ officeId } )); - return PositionsApi.update(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListRouteLabels` - * @summary List all route labels for a position - * @permission Requires `canUseListRouteLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRouteLabels = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRouteLabels(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseListRouteLabels({ officeId } )); - return PositionsApi.listRouteLabels(officeId, positionId) }, - ...options, - }); -}; - -/** - * Query `useGetDuplicateDefaultParameters` - * @summary Get default duplication parameters for a position - * @permission Requires `canUseGetDuplicateDefaultParameters` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Default parameters and suggested estimated service date - * @statusCodes [200, 401, 404] - */ -export const useGetDuplicateDefaultParameters = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getDuplicateDefaultParameters(officeId, positionId), - queryFn: () => { - checkAcl(PositionsAcl.canUseGetDuplicateDefaultParameters({ officeId } )); - return PositionsApi.getDuplicateDefaultParameters(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useDuplicate` - * @summary Duplicate position - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.DuplicatePositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position duplicated successfully - * @statusCodes [201, 400, 401, 404] - */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseDuplicate({ officeId } )); - return PositionsApi.duplicate(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCancel` - * @summary Cancel position - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position cancelled successfully - * @statusCodes [200, 400, 401, 403, 404] - */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionsAcl.canUseCancel({ officeId } )); - return PositionsApi.cancel(officeId, positionId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useRevertCancel` - * @summary Revert cancelled position (accounting) - * @permission Requires `canUseRevertCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Position reverted successfully - * @statusCodes [200, 400, 401, 403, 404] - */ -export const useRevertCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(PositionsAcl.canUseRevertCancel({ officeId } )); - return PositionsApi.revertCancel(officeId, positionId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useLinkChild` - * @summary Link child positions to parent - * @permission Requires `canUseLinkChild` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.LinkChildPositionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useLinkChild = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseLinkChild({ officeId } )); - return PositionsApi.linkChild(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnlinkChild` - * @summary Unlink child positions from parent - * @permission Requires `canUseUnlinkChild` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { PositionsModels.UnlinkChildPositionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnlinkChild = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(PositionsAcl.canUseUnlinkChild({ officeId } )); - return PositionsApi.unlinkChild(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListChild` - * @summary Get child positions for parent - * @permission Requires `canUseListChild` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListChild = ({ officeId, positionId, limit, page, cursor }: { officeId: string, positionId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listChild(officeId, positionId, limit, page, cursor), - queryFn: () => { - checkAcl(PositionsAcl.canUseListChild({ officeId } )); - return PositionsApi.listChild(officeId, positionId, limit, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListChildInfinite - * @summary Get child positions for parent - * @permission Requires `canUseListChild` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListChildInfinite = ({ officeId, positionId, limit, cursor }: { officeId: string, positionId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listChildInfinite(officeId, positionId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(PositionsAcl.canUseListChild({ officeId } )); - return PositionsApi.listChild(officeId, positionId, limit, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -} diff --git a/test/generated/next/projectLite/projectLite.acl.ts b/test/generated/next/projectLite/projectLite.acl.ts deleted file mode 100644 index 00ccf56..0000000 --- a/test/generated/next/projectLite/projectLite.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ProjectLiteAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create project in office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Create", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List projects for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `usePaginateProjectLabels` query ability. For global ability, omit the object parameter. - * @description Paginate project labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateProjectLabels` query - */ -export const canUsePaginateProjectLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get project by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Read", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Update", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive project - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("ProjectLite", object) : "ProjectLite" -] as AbilityTuple<"Archive", "ProjectLite" | ForcedSubject<"ProjectLite"> & { officeId: string, }>; - -} diff --git a/test/generated/next/projectLite/projectLite.api.ts b/test/generated/next/projectLite/projectLite.api.ts deleted file mode 100644 index 3bb49bc..0000000 --- a/test/generated/next/projectLite/projectLite.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ProjectLiteModels } from "./projectLite.models"; - -export namespace ProjectLiteApi { -export const create = (officeId: string, data: ProjectLiteModels.CreateProjectLiteRequestDTO, ) => { - return AppRestClient.post( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite`, - ZodExtended.parse(ProjectLiteModels.CreateProjectLiteRequestDTOSchema, data), - - ) -}; -export const paginate = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.ProjectLitePaginateResponseSchema }, - `/offices/${officeId}/project-lite`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateProjectLabels = (officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.PaginateProjectLabelsResponseSchema }, - `/offices/${officeId}/project-lite/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(ProjectLiteModels.ProjectLiteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: ProjectLiteModels.UpdateProjectLiteRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: ProjectLiteModels.ProjectLiteResponseDTOSchema }, - `/offices/${officeId}/project-lite/${id}`, - ZodExtended.parse(ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/project-lite/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/project-lite/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/projectLite/projectLite.configs.ts b/test/generated/next/projectLite/projectLite.configs.ts deleted file mode 100644 index 5981c30..0000000 --- a/test/generated/next/projectLite/projectLite.configs.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { ProjectLiteModels } from "./projectLite.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ProjectLiteQueries } from "./projectLite.queries"; -import { ProjectLiteAcl } from "./projectLite.acl"; - -export namespace ProjectLiteConfigs { -export const projectLiteConfig = { - meta: { - title: "Project Lite", - }, - readAll: { - acl: ProjectLiteAcl.canUsePaginate, - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - paginated: ProjectLiteQueries.usePaginate, - infinite: ProjectLiteQueries.usePaginateInfinite, - filters: { - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - officeId: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: ProjectLiteModels.ProjectLitePaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: ProjectLiteAcl.canUseFindById, - schema: ProjectLiteModels.ProjectLiteResponseDTOSchema, - query: ProjectLiteQueries.useFindById, - }, - create: { - acl: ProjectLiteAcl.canUseCreate, - schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, - mutation: ProjectLiteQueries.useCreate, - inputDefs: dynamicInputs({ - schema: ProjectLiteModels.CreateProjectLiteRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, - update: { - acl: ProjectLiteAcl.canUseUpdate, - schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, - mutation: ProjectLiteQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: ProjectLiteModels.UpdateProjectLiteRequestDTOSchema, - options: { - inputs: { - name: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: ProjectLiteAcl.canUsePaginateProjectLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: ProjectLiteQueries.usePaginateProjectLabels, - infinite: ProjectLiteQueries.usePaginateProjectLabelsInfinite, - filters: { - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: ProjectLiteModels.ProjectLiteFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: ProjectLiteModels.PaginateProjectLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/projectLite/projectLite.models.ts b/test/generated/next/projectLite/projectLite.models.ts deleted file mode 100644 index a40cc28..0000000 --- a/test/generated/next/projectLite/projectLite.models.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ProjectLiteModels { -/** - * ProjectLiteEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const ProjectLiteEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type ProjectLiteEmployeeDTO = z.infer; - -/** - * ProjectLiteResponseDTOSchema - * @type { object } - * @property { string } id Project ID - * @property { string } name Project name - * @property { string } officeId Office ID - * @property { boolean } archived Is archived - * @property { string } createdById ID of the employee who created this project - * @property { ProjectLiteEmployeeDTO } createdBy Employee who created this project - * @property { string } createdAt Created at - * @property { string } updatedById ID of the employee who last updated this project - * @property { ProjectLiteEmployeeDTO } updatedBy Employee who last updated this project - * @property { string } updatedAt Updated at - */ -export const ProjectLiteResponseDTOSchema = z.object({ id: z.string(), name: z.string(), officeId: z.string(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: ProjectLiteEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: ProjectLiteEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type ProjectLiteResponseDTO = z.infer; - -/** - * CreateProjectLiteRequestDTOSchema - * @type { object } - * @property { string } name Project name - */ -export const CreateProjectLiteRequestDTOSchema = z.object({ name: z.string() }); -export type CreateProjectLiteRequestDTO = z.infer; - -/** - * ProjectLiteFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived - */ -export const ProjectLiteFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type ProjectLiteFilterDto = z.infer; - -/** - * UpdateProjectLiteRequestDTOSchema - * @type { object } - * @property { string } name Project name - */ -export const UpdateProjectLiteRequestDTOSchema = z.object({ name: z.string().nullable() }).partial(); -export type UpdateProjectLiteRequestDTO = z.infer; - -/** - * ProjectLitePaginateOrderParamEnumSchema - * @type { enum } - */ -export const ProjectLitePaginateOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type ProjectLitePaginateOrderParamEnum = z.infer; -export const ProjectLitePaginateOrderParamEnum = ProjectLitePaginateOrderParamEnumSchema.enum; - -/** - * ProjectLitePaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { ProjectLiteResponseDTO[] } items - */ -export const ProjectLitePaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(ProjectLiteResponseDTOSchema).nullable() }).partial().shape }); -export type ProjectLitePaginateResponse = z.infer; - -/** - * PaginateProjectLabelsOrderParamEnumSchema - * @type { enum } - */ -export const PaginateProjectLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type PaginateProjectLabelsOrderParamEnum = z.infer; -export const PaginateProjectLabelsOrderParamEnum = PaginateProjectLabelsOrderParamEnumSchema.enum; - -/** - * PaginateProjectLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const PaginateProjectLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type PaginateProjectLabelsResponse = z.infer; - -} diff --git a/test/generated/next/projectLite/projectLite.queries.ts b/test/generated/next/projectLite/projectLite.queries.ts deleted file mode 100644 index 52d1c07..0000000 --- a/test/generated/next/projectLite/projectLite.queries.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ProjectLiteAcl } from "./projectLite.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ProjectLiteModels } from "./projectLite.models"; -import { ProjectLiteApi } from "./projectLite.api"; - -export namespace ProjectLiteQueries { -export const moduleName = QueryModule.ProjectLite; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite", "infinite", officeId, limit, order, filter, cursor] as const, - paginateProjectLabels: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", officeId, limit, order, filter, page, cursor] as const, - paginateProjectLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/project-lite/labels/paginate", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/project-lite/:id", id, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create project - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { ProjectLiteModels.CreateProjectLiteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(ProjectLiteAcl.canUseCreate({ officeId } )); - return ProjectLiteApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated projects - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); - return ProjectLiteApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated projects - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ProjectLiteAcl.canUsePaginate({ officeId } )); - return ProjectLiteApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateProjectLabels` - * @summary Paginate project labels - * @permission Requires `canUsePaginateProjectLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateProjectLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateProjectLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateProjectLabelsInfinite - * @summary Paginate project labels - * @permission Requires `canUsePaginateProjectLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { ProjectLiteModels.ProjectLiteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateProjectLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: ProjectLiteModels.ProjectLiteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateProjectLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(ProjectLiteAcl.canUsePaginateProjectLabels({ officeId } )); - return ProjectLiteApi.paginateProjectLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get project by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(ProjectLiteAcl.canUseFindById({ officeId } )); - return ProjectLiteApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update project - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { ProjectLiteModels.UpdateProjectLiteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(ProjectLiteAcl.canUseUpdate({ officeId } )); - return ProjectLiteApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive project - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ProjectLiteAcl.canUseArchive({ officeId } )); - return ProjectLiteApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive project - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(ProjectLiteAcl.canUseUnarchive({ officeId } )); - return ProjectLiteApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/queryModules.ts b/test/generated/next/queryModules.ts deleted file mode 100644 index 2daa74a..0000000 --- a/test/generated/next/queryModules.ts +++ /dev/null @@ -1,96 +0,0 @@ -export const enum QueryModule { - WorkingDocuments = "WorkingDocumentsQueries", - Offices = "OfficesQueries", - BankAccounts = "BankAccountsQueries", - Currencies = "CurrenciesQueries", - Countries = "CountriesQueries", - Folders = "FoldersQueries", - Files = "FilesQueries", - WorkingDocumentsTemplatedDocument = "WorkingDocumentsTemplatedDocumentQueries", - BusinessPartners = "BusinessPartnersQueries", - BusinessPartnerBookkeepingMappings = "BusinessPartnerBookkeepingMappingsQueries", - BusinessPartnerContacts = "BusinessPartnerContactsQueries", - Cities = "CitiesQueries", - Depots = "DepotsQueries", - PartnerNetworks = "PartnerNetworksQueries", - Warehouses = "WarehousesQueries", - UserActivity = "UserActivityQueries", - DocumentTemplates = "DocumentTemplatesQueries", - HsCodes = "HsCodesQueries", - CargoTypes = "CargoTypesQueries", - SeaPositions = "SeaPositionsQueries", - Terminals = "TerminalsQueries", - Airports = "AirportsQueries", - Ports = "PortsQueries", - ContainerYards = "ContainerYardsQueries", - PositionInvolvedParties = "PositionInvolvedPartiesQueries", - PositionRoutes = "PositionRoutesQueries", - AirPositions = "AirPositionsQueries", - PositionAccount = "PositionAccountQueries", - PositionAccountItems = "PositionAccountItemsQueries", - PositionProfitChangeTracking = "PositionProfitChangeTrackingQueries", - WorkingDocumentsExportDeclaration = "WorkingDocumentsExportDeclarationQueries", - PositionCargo = "PositionCargoQueries", - PositionCargoPackage = "PositionCargoPackageQueries", - PackageTypes = "PackageTypesQueries", - WorkingDocumentsHouseBl = "WorkingDocumentsHouseBlQueries", - WorkingDocumentsBlInstructions = "WorkingDocumentsBlInstructionsQueries", - WorkingDocumentsAmsInstructions = "WorkingDocumentsAmsInstructionsQueries", - WorkingDocumentsHouseAwb = "WorkingDocumentsHouseAwbQueries", - ChargeTypes = "ChargeTypesQueries", - WorkingDocumentsMasterAwb = "WorkingDocumentsMasterAwbQueries", - WorkingDocumentsCmrForm = "WorkingDocumentsCmrFormQueries", - WorkingDocumentsIsfForm = "WorkingDocumentsIsfFormQueries", - WorkingDocumentsFcrForm = "WorkingDocumentsFcrFormQueries", - ShippingInstructions = "ShippingInstructionsQueries", - EmployeeAccount = "EmployeeAccountQueries", - EmployeeSettings = "EmployeeSettingsQueries", - EmployeeRoles = "EmployeeRolesQueries", - EmployeePermissions = "EmployeePermissionsQueries", - EmployeeProfile = "EmployeeProfileQueries", - Employee = "EmployeeQueries", - Employment = "EmploymentQueries", - CustomerAccount = "CustomerAccountQueries", - Customers = "CustomersQueries", - Quotes = "QuotesQueries", - QuoteAccount = "QuoteAccountQueries", - QuoteProfitChangeTracking = "QuoteProfitChangeTrackingQueries", - SeaQuotes = "SeaQuotesQueries", - RoadQuotes = "RoadQuotesQueries", - QuoteDocument = "QuoteDocumentQueries", - QuoteCargo = "QuoteCargoQueries", - QuoteCargoPackage = "QuoteCargoPackageQueries", - QuoteRoutes = "QuoteRoutesQueries", - DunningManagement = "DunningManagementQueries", - DunningPartnerOutstandingInvoices = "DunningPartnerOutstandingInvoicesQueries", - DunningLevels = "DunningLevelsQueries", - DunningSystems = "DunningSystemsQueries", - DunningAccountStatement = "DunningAccountStatementQueries", - Positions = "PositionsQueries", - QuoteConversion = "QuoteConversionQueries", - Invoices = "InvoicesQueries", - VatRules = "VatRulesQueries", - InvoicePayments = "InvoicePaymentsQueries", - PaymentConfirmations = "PaymentConfirmationsQueries", - ProjectLite = "ProjectLiteQueries", - PositionChecklist = "PositionChecklistQueries", - ChecklistTemplates = "ChecklistTemplatesQueries", - BookkeepingExport = "BookkeepingExportQueries", - FactoringExport = "FactoringExportQueries", - FactoringMerge = "FactoringMergeQueries", - AWBStocks = "AWBStocksQueries", - MasterData = "MasterDataQueries", - ChecklistItems = "ChecklistItemsQueries", - MasterDataImport = "MasterDataImportQueries", - RemarkTemplates = "RemarkTemplatesQueries", - IntegrationChannels = "IntegrationChannelsQueries", - ControlTowerBookings = "ControlTowerBookingsQueries", - ControlTowerPackages = "ControlTowerPackagesQueries", - ControlTowerContainers = "ControlTowerContainersQueries", - ControlTowerAuth = "ControlTowerAuthQueries", - ControlTowerMe = "ControlTowerMeQueries", - ControlTowerSearch = "ControlTowerSearchQueries", - ControlTowerCalendar = "ControlTowerCalendarQueries", - InttraShippingInstructionMessages = "InttraShippingInstructionMessagesQueries", - InttraOfficeIntegration = "InttraOfficeIntegrationQueries", -} \ No newline at end of file diff --git a/test/generated/next/quoteAccount/quoteAccount.acl.ts b/test/generated/next/quoteAccount/quoteAccount.acl.ts deleted file mode 100644 index 5a12701..0000000 --- a/test/generated/next/quoteAccount/quoteAccount.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteAccountAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description List quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateItem` mutation - */ -export const canUseCreateItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDeleteItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteItem` mutation - */ -export const canUseDeleteItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateItem` mutation - */ -export const canUseUpdateItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDuplicateItem` mutation ability. For global ability, omit the object parameter. - * @description Update quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateItem` mutation - */ -export const canUseDuplicateItem = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/next/quoteAccount/quoteAccount.api.ts b/test/generated/next/quoteAccount/quoteAccount.api.ts deleted file mode 100644 index f29e866..0000000 --- a/test/generated/next/quoteAccount/quoteAccount.api.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteAccountModels } from "./quoteAccount.models"; - -export namespace QuoteAccountApi { -export const get = (quoteId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: QuoteAccountModels.QuoteAccountResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/account`, - - ) -}; -export const createItem = (quoteId: string, officeId: string, data: QuoteAccountModels.CreateQuoteAccountItemRequestDto, ) => { - return AppRestClient.post( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items`, - ZodExtended.parse(QuoteAccountModels.CreateQuoteAccountItemRequestDtoSchema, data), - - ) -}; -export const deleteItem = (quoteId: string, itemId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - - ) -}; -export const updateItem = (quoteId: string, itemId: string, officeId: string, data: QuoteAccountModels.UpdateQuoteAccountItemRequestDto, ) => { - return AppRestClient.patch( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}`, - ZodExtended.parse(QuoteAccountModels.UpdateQuoteAccountItemRequestDtoSchema, data), - - ) -}; -export const duplicateItem = (quoteId: string, itemId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: QuoteAccountModels.QuoteAccountItemDtoResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/items/${itemId}/duplicate`, - - ) -}; -} diff --git a/test/generated/next/quoteAccount/quoteAccount.models.ts b/test/generated/next/quoteAccount/quoteAccount.models.ts deleted file mode 100644 index cdc459b..0000000 --- a/test/generated/next/quoteAccount/quoteAccount.models.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { z } from "zod"; - -export namespace QuoteAccountModels { -/** - * QuoteAccountItemTypeEnumSchema - * @type { enum } - */ -export const QuoteAccountItemTypeEnumSchema = z.enum(["CHARGE", "TEXT", "DIVIDER"]); -export type QuoteAccountItemTypeEnum = z.infer; -export const QuoteAccountItemTypeEnum = QuoteAccountItemTypeEnumSchema.enum; - -/** - * QuoteChargeDtoResponseSchema - * @type { object } - * @property { object } chargeType - * @property { string } chargeType.id - * @property { string } chargeType.name - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { object } buyVatRule - * @property { string } buyVatRule.id - * @property { string } buyVatRule.name - * @property { string } buyVatRule.matchcode - * @property { string } buyVatRule.printCode - * @property { object } vendor - * @property { string } vendor.id - * @property { string } vendor.name - * @property { string } vendor.matchCode - * @property { string } vendor.label - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { object } sellVatRule - * @property { string } sellVatRule.id - * @property { string } sellVatRule.name - * @property { string } sellVatRule.matchcode - * @property { string } sellVatRule.printCode - * @property { object } customer - * @property { string } customer.id - * @property { string } customer.name - * @property { string } customer.matchCode - * @property { string } customer.label - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - * @property { number } profit Profit amount - */ -export const QuoteChargeDtoResponseSchema = z.object({ chargeType: z.object({ id: z.string(), name: z.string() }), additionalText: z.string(), quantity: z.number().nullish(), buyRate: z.number().nullish(), buyCurrencyCode: z.string(), buyVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }), vendor: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }), buyExchangeRate: z.number().nullish(), sellRate: z.number().nullish(), sellCurrencyCode: z.string(), sellVatRule: z.object({ id: z.string(), name: z.string(), matchcode: z.string(), printCode: z.string().nullish() }), customer: z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string() }), sellExchangeRate: z.number().nullish(), profit: z.number().nullish() }); -export type QuoteChargeDtoResponse = z.infer; - -/** - * QuoteTextDtoResponseSchema - * @type { object } - * @property { string } content Text content - */ -export const QuoteTextDtoResponseSchema = z.object({ content: z.string() }); -export type QuoteTextDtoResponse = z.infer; - -/** - * QuoteAccountItemDtoResponseSchema - * @type { object } - * @property { string } id Item ID - * @property { QuoteAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { QuoteChargeDtoResponse } charge Charge data if type is CHARGE - * @property { QuoteTextDtoResponse } text Text data if type is TEXT - */ -export const QuoteAccountItemDtoResponseSchema = z.object({ id: z.string(), type: QuoteAccountItemTypeEnumSchema, orderPosition: z.number(), charge: QuoteChargeDtoResponseSchema.nullish(), text: QuoteTextDtoResponseSchema.nullish() }); -export type QuoteAccountItemDtoResponse = z.infer; - -/** - * QuoteAccountResponseDtoSchema - * @type { object } - * @property { string } id Account ID - * @property { string } quoteId Quote ID - * @property { QuoteAccountItemDtoResponse[] } items Account items - * @property { object } totals Account totals - * @property { number } totals.totalBuyRates - * @property { number } totals.totalSellRates - * @property { number } totals.totalProfit - * @property { number } totals.displayAmount - * @property { string } totals.displayCurrencyCode - * @property { object[] } totalsPerCurrency Account totals per currency - * @property { number } totalsPerCurrency.[0].totalBuyRates - * @property { number } totalsPerCurrency.[0].totalSellRates - * @property { number } totalsPerCurrency.[0].totalProfit - * @property { number } totalsPerCurrency.[0].displayAmount - * @property { string } totalsPerCurrency.[0].displayCurrencyCode - */ -export const QuoteAccountResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), items: z.array(QuoteAccountItemDtoResponseSchema), totals: z.object({ totalBuyRates: z.number().nullable(), totalSellRates: z.number().nullable(), totalProfit: z.number().nullable(), displayAmount: z.number().nullable(), displayCurrencyCode: z.string().nullable() }).partial(), totalsPerCurrency: z.array(z.object({ totalBuyRates: z.number().nullable(), totalSellRates: z.number().nullable(), totalProfit: z.number().nullable(), displayAmount: z.number().nullable(), displayCurrencyCode: z.string().nullable() }).partial()) }); -export type QuoteAccountResponseDto = z.infer; - -/** - * CreateQuoteChargeDataDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1`. Default: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code. Default: `EUR` - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code. Default: `EUR` - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const CreateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable().default(1), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable().default("EUR"), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable().default("EUR"), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); -export type CreateQuoteChargeDataDto = z.infer; - -/** - * CreateQuoteTextDataDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const CreateQuoteTextDataDtoSchema = z.object({ content: z.string().nullable() }).partial(); -export type CreateQuoteTextDataDto = z.infer; - -/** - * CreateQuoteAccountItemRequestDtoSchema - * @type { object } - * @property { QuoteAccountItemTypeEnum } type Item type - * @property { number } orderPosition Order position of the item - * @property { CreateQuoteChargeDataDto } charge Charge data if type is CHARGE - * @property { CreateQuoteTextDataDto } text Text data if type is TEXT - */ -export const CreateQuoteAccountItemRequestDtoSchema = z.object({ type: QuoteAccountItemTypeEnumSchema, orderPosition: z.number().nullish(), charge: CreateQuoteChargeDataDtoSchema.nullish(), text: CreateQuoteTextDataDtoSchema.nullish() }); -export type CreateQuoteAccountItemRequestDto = z.infer; - -/** - * UpdateQuoteChargeDataDtoSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { string } additionalText Additional text for the charge - * @property { number } quantity Quantity of the charge. Minimum: `1` - * @property { number } buyRate Buy rate amount - * @property { string } buyCurrencyCode Buy rate currency code - * @property { string } buyVatRuleId Buy VAT rule ID - * @property { string } vendorId Vendor ID - * @property { number } buyExchangeRate Buy exchange rate with up to 4 decimal places accuracy - * @property { number } sellRate Sell rate amount - * @property { string } sellCurrencyCode Sell rate currency code - * @property { string } sellVatRuleId Sell VAT rule ID - * @property { string } customerId Customer ID - * @property { number } sellExchangeRate Sell exchange rate with up to 4 decimal places accuracy - */ -export const UpdateQuoteChargeDataDtoSchema = z.object({ chargeTypeId: z.string().nullable(), additionalText: z.string().nullable(), quantity: z.number().gte(1).nullable(), buyRate: z.number().nullable(), buyCurrencyCode: z.string().nullable(), buyVatRuleId: z.string().nullable(), vendorId: z.string().nullable(), buyExchangeRate: z.number().nullable(), sellRate: z.number().nullable(), sellCurrencyCode: z.string().nullable(), sellVatRuleId: z.string().nullable(), customerId: z.string().nullable(), sellExchangeRate: z.number().nullable() }).partial(); -export type UpdateQuoteChargeDataDto = z.infer; - -/** - * UpdateQuoteTextDataDtoSchema - * @type { object } - * @property { string } content Text content - */ -export const UpdateQuoteTextDataDtoSchema = z.object({ content: z.string().nullable() }).partial(); -export type UpdateQuoteTextDataDto = z.infer; - -/** - * UpdateQuoteAccountItemRequestDtoSchema - * @type { object } - * @property { number } orderPosition Order position of the item - * @property { UpdateQuoteChargeDataDto } charge Charge data if type is CHARGE - * @property { UpdateQuoteTextDataDto } text Text data if type is TEXT - */ -export const UpdateQuoteAccountItemRequestDtoSchema = z.object({ orderPosition: z.number().nullable(), charge: UpdateQuoteChargeDataDtoSchema.nullable(), text: UpdateQuoteTextDataDtoSchema.nullable() }).partial(); -export type UpdateQuoteAccountItemRequestDto = z.infer; - -} diff --git a/test/generated/next/quoteAccount/quoteAccount.queries.ts b/test/generated/next/quoteAccount/quoteAccount.queries.ts deleted file mode 100644 index eeba0f1..0000000 --- a/test/generated/next/quoteAccount/quoteAccount.queries.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteAccountAcl } from "./quoteAccount.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteAccountModels } from "./quoteAccount.models"; -import { QuoteAccountApi } from "./quoteAccount.api"; - -export namespace QuoteAccountQueries { -export const moduleName = QueryModule.QuoteAccount; - -export const keys = { - all: [moduleName] as const, - get: (quoteId: string, officeId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account", quoteId, officeId] as const, -}; - -/** - * Query `useGet` - * @summary Get quote account details - * @permission Requires `canUseGet` ability - * @param { string } object.quoteId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ quoteId, officeId }: { quoteId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(quoteId, officeId), - queryFn: () => { - checkAcl(QuoteAccountAcl.canUseGet({ officeId } )); - return QuoteAccountApi.get(quoteId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateItem` - * @summary Create quote account item - * @permission Requires `canUseCreateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { QuoteAccountModels.CreateQuoteAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, officeId, data }) => { - checkAcl(QuoteAccountAcl.canUseCreateItem({ officeId } )); - return QuoteAccountApi.createItem(quoteId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteItem` - * @summary Delete quote account item - * @permission Requires `canUseDeleteItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteItem = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId }) => { - checkAcl(QuoteAccountAcl.canUseDeleteItem({ officeId } )); - return QuoteAccountApi.deleteItem(quoteId, itemId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateItem` - * @summary Update quote account item - * @permission Requires `canUseUpdateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { QuoteAccountModels.UpdateQuoteAccountItemRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId, data }) => { - checkAcl(QuoteAccountAcl.canUseUpdateItem({ officeId } )); - return QuoteAccountApi.updateItem(quoteId, itemId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicateItem` - * @summary Duplicate quote account item - * @permission Requires `canUseDuplicateItem` ability - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.itemId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicateItem = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ quoteId, itemId, officeId }) => { - checkAcl(QuoteAccountAcl.canUseDuplicateItem({ officeId } )); - return QuoteAccountApi.duplicateItem(quoteId, itemId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/quoteCargo/quoteCargo.acl.ts b/test/generated/next/quoteCargo/quoteCargo.acl.ts deleted file mode 100644 index 38031c0..0000000 --- a/test/generated/next/quoteCargo/quoteCargo.acl.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteCargoAcl { -/** - * Use for `useListCargosByQuoteId` query ability. For global ability, omit the object parameter. - * @description List cargo items by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargosByQuoteId` query - */ -export const canUseListCargosByQuoteId = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useListCargoLabels` query ability. For global ability, omit the object parameter. - * @description List cargo labels by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListCargoLabels` query - */ -export const canUseListCargoLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoSummary` query ability. For global ability, omit the object parameter. - * @description Get cargo summary by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoSummary` query - */ -export const canUseGetCargoSummary = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useGetCargoById` query ability. For global ability, omit the object parameter. - * @description Get cargo item by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCargoById` query - */ -export const canUseGetCargoById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Read", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdateCargo` mutation ability. For global ability, omit the object parameter. - * @description Update cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCargo` mutation - */ -export const canUseUpdateCargo = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDeleteCargo` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCargo` mutation - */ -export const canUseDeleteCargo = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useCreateBulkCargos` mutation ability. For global ability, omit the object parameter. - * @description Create cargo item for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateBulkCargos` mutation - */ -export const canUseCreateBulkCargos = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicateCargo` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo item - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicateCargo` mutation - */ -export const canUseDuplicateCargo = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/next/quoteCargo/quoteCargo.api.ts b/test/generated/next/quoteCargo/quoteCargo.api.ts deleted file mode 100644 index 3d52cf1..0000000 --- a/test/generated/next/quoteCargo/quoteCargo.api.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteCargoModels } from "./quoteCargo.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoApi { -export const listCargosByQuoteId = (officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.ListCargosByQuoteIdResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos`, - { - params: { - order: ZodExtended.parse(QuoteCargoModels.ListCargosByQuoteIdOrderParamSchema.optional(), order, { type: "query", name: "order" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const listCargoLabels = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.QuoteCargoListCargoLabelsResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/labels`, - - ) -}; -export const getCargoSummary = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuoteCargoModels.QuoteCargoGetCargoSummaryResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/summary`, - - ) -}; -export const getCargoById = (officeId: string, quoteId: string, cargoId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - - ) -}; -export const updateCargo = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.UpdatePositionCargoDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoDTOSchema, data), - - ) -}; -export const deleteCargo = (officeId: string, quoteId: string, cargoId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}`, - - ) -}; -export const createBulkCargos = (numberOfCargos: number, officeId: string, quoteId: string, data: CommonModels.CreatePositionCargoDTO, ) => { - return AppRestClient.post( - { resSchema: QuoteCargoModels.QuoteCargoCreateBulkCargosResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/bulk/${numberOfCargos}`, - ZodExtended.parse(CommonModels.CreatePositionCargoDTOSchema, data), - - ) -}; -export const duplicateCargo = (officeId: string, quoteId: string, cargoId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/duplicate`, - - ) -}; -} diff --git a/test/generated/next/quoteCargo/quoteCargo.configs.ts b/test/generated/next/quoteCargo/quoteCargo.configs.ts deleted file mode 100644 index bbd862c..0000000 --- a/test/generated/next/quoteCargo/quoteCargo.configs.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoQueries } from "./quoteCargo.queries"; -import { QuoteCargoAcl } from "./quoteCargo.acl"; - -export namespace QuoteCargoConfigs { -export const cargosConfig = { - meta: { - title: "Cargos", - }, - readAll: { - acl: QuoteCargoAcl.canUseListCargosByQuoteId, - schema: CommonModels.PositionCargoResponseDTOSchema, - paginated: QuoteCargoQueries.useListCargosByQuoteId, - infinite: QuoteCargoQueries.useListCargosByQuoteIdInfinite, - columns: dynamicColumns({ - schema: CommonModels.PositionCargoResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - quoteId: true, - rootFolderId: true, - cargoType: true, - autoCalculateTotals: true, - autoCalculateRates: true, - autoCalculateVgm: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - rateOptions: true, - rateClass: true, - textForCustoms: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - ratePerKg: true, - totalRate: true, - tare: true, - vgm: true, - hsCodeLabels: true, - note: true, - packages: true, - createdAt: true, - updatedAt: true, - completeWeight: true, - packageTotals: true, - }, - }, -}), - }, - read: { - acl: QuoteCargoAcl.canUseGetCargoById, - schema: CommonModels.PositionCargoResponseDTOSchema, - query: QuoteCargoQueries.useGetCargoById, - }, - update: { - acl: QuoteCargoAcl.canUseUpdateCargo, - schema: CommonModels.UpdatePositionCargoDTOSchema, - mutation: QuoteCargoQueries.useUpdateCargo, - inputDefs: dynamicInputs({ - schema: CommonModels.UpdatePositionCargoDTOSchema, - options: { - inputs: { - cargoTypeId: true, - note: true, - autoCalculateTotals: true, - transportUnitNumber: true, - seal1: true, - seal2: true, - totalVolume: true, - totalGrossWeight: true, - totalNetWeight: true, - totalVolumetricWeight: true, - totalChargeableWeight: true, - totalLoadMeter: true, - rateOptions: true, - rateClass: true, - ratePerKg: true, - totalRate: true, - textForCustoms: true, - tare: true, - vgm: true, - autoCalculateRates: true, - autoCalculateVgm: true, - }, - }, -}) - }, - delete: { - acl: QuoteCargoAcl.canUseDeleteCargo, - mutation: QuoteCargoQueries.useDeleteCargo, - }, -}; - -} diff --git a/test/generated/next/quoteCargo/quoteCargo.models.ts b/test/generated/next/quoteCargo/quoteCargo.models.ts deleted file mode 100644 index 8d7a3a0..0000000 --- a/test/generated/next/quoteCargo/quoteCargo.models.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoModels { -/** - * ListCargosByQuoteIdOrderParamSchema - * @type { array } - */ -export const ListCargosByQuoteIdOrderParamSchema = z.array(CommonModels.PositionCargoPaginationOrderFieldSchema).nullish(); -export type ListCargosByQuoteIdOrderParam = z.infer; - -/** - * ListCargosByQuoteIdResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.PositionCargoResponseDTO[] } items - */ -export const ListCargosByQuoteIdResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.PositionCargoResponseDTOSchema).nullable() }).partial().shape }); -export type ListCargosByQuoteIdResponse = z.infer; - -/** - * QuoteCargoListCargoLabelsResponseSchema - * @type { array } - */ -export const QuoteCargoListCargoLabelsResponseSchema = z.array(CommonModels.LabelResponseDTOSchema); -export type QuoteCargoListCargoLabelsResponse = z.infer; - -/** - * QuoteCargoGetCargoSummaryResponseSchema - * @type { array } - */ -export const QuoteCargoGetCargoSummaryResponseSchema = z.array(CommonModels.CargoSummaryResponseDTOSchema); -export type QuoteCargoGetCargoSummaryResponse = z.infer; - -/** - * QuoteCargoCreateBulkCargosResponseSchema - * @type { array } - */ -export const QuoteCargoCreateBulkCargosResponseSchema = z.array(CommonModels.PositionCargoResponseDTOSchema); -export type QuoteCargoCreateBulkCargosResponse = z.infer; - -} diff --git a/test/generated/next/quoteCargo/quoteCargo.queries.ts b/test/generated/next/quoteCargo/quoteCargo.queries.ts deleted file mode 100644 index 3156a3e..0000000 --- a/test/generated/next/quoteCargo/quoteCargo.queries.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteCargoAcl } from "./quoteCargo.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteCargoModels } from "./quoteCargo.models"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoApi } from "./quoteCargo.api"; - -export namespace QuoteCargoQueries { -export const moduleName = QueryModule.QuoteCargo; - -export const keys = { - all: [moduleName] as const, - listCargosByQuoteId: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", officeId, quoteId, limit, order, page, cursor] as const, - listCargosByQuoteIdInfinite: (officeId: string, quoteId: string, limit?: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos", "infinite", officeId, quoteId, limit, order, cursor] as const, - listCargoLabels: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/labels", officeId, quoteId] as const, - getCargoSummary: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/summary", officeId, quoteId] as const, - getCargoById: (officeId: string, quoteId: string, cargoId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/cargos/:cargoId", officeId, quoteId, cargoId] as const, -}; - -/** - * Query `useListCargosByQuoteId` - * @summary List all cargo items for a quote - * @permission Requires `canUseListCargosByQuoteId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByQuoteId = ({ officeId, quoteId, limit, order, page, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListCargosByQuoteIdInfinite - * @summary List all cargo items for a quote - * @permission Requires `canUseListCargosByQuoteId` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { QuoteCargoModels.ListCargosByQuoteIdOrderParam } object.order Query parameter. Order fields. Prefix with - for descending order. Example: -createdAt,updatedAt - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargosByQuoteIdInfinite = ({ officeId, quoteId, limit, order, cursor }: { officeId: string, quoteId: string, limit: number, order?: QuoteCargoModels.ListCargosByQuoteIdOrderParam, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listCargosByQuoteIdInfinite(officeId, quoteId, limit, order, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuoteCargoAcl.canUseListCargosByQuoteId({ officeId } )); - return QuoteCargoApi.listCargosByQuoteId(officeId, quoteId, limit, order, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useListCargoLabels` - * @summary List all cargo labels for a quote - * @permission Requires `canUseListCargoLabels` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListCargoLabels = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listCargoLabels(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseListCargoLabels({ officeId } )); - return QuoteCargoApi.listCargoLabels(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Query `useGetCargoSummary` - * @summary Get cargo summary grouped by transport unit type - * @permission Requires `canUseGetCargoSummary` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoSummary = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoSummary(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseGetCargoSummary({ officeId } )); - return QuoteCargoApi.getCargoSummary(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Query `useGetCargoById` - * @summary Get a specific cargo item - * @permission Requires `canUseGetCargoById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { string } object.cargoId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCargoById = ({ officeId, quoteId, cargoId }: { officeId: string, quoteId: string, cargoId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCargoById(officeId, quoteId, cargoId), - queryFn: () => { - checkAcl(QuoteCargoAcl.canUseGetCargoById({ officeId } )); - return QuoteCargoApi.getCargoById(officeId, quoteId, cargoId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCargo` - * @summary Update a cargo item - * @permission Requires `canUseUpdateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.UpdatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, data }) => { - checkAcl(QuoteCargoAcl.canUseUpdateCargo({ officeId } )); - return QuoteCargoApi.updateCargo(officeId, quoteId, cargoId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteCargo` - * @summary Delete a cargo item - * @permission Requires `canUseDeleteCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId }) => { - checkAcl(QuoteCargoAcl.canUseDeleteCargo({ officeId } )); - return QuoteCargoApi.deleteCargo(officeId, quoteId, cargoId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateBulkCargos` - * @summary Create a new cargo item - * @permission Requires `canUseCreateBulkCargos` ability - * @param { number } mutation.numberOfCargos Path parameter - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.CreatePositionCargoDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateBulkCargos = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ numberOfCargos, officeId, quoteId, data }) => { - checkAcl(QuoteCargoAcl.canUseCreateBulkCargos({ officeId } )); - return QuoteCargoApi.createBulkCargos(numberOfCargos, officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicateCargo` - * @summary Duplicate a cargo item - * @permission Requires `canUseDuplicateCargo` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicateCargo = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId }) => { - checkAcl(QuoteCargoAcl.canUseDuplicateCargo({ officeId } )); - return QuoteCargoApi.duplicateCargo(officeId, quoteId, cargoId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId, cargoId } = variables; - const updateKeys = [keys.getCargoById(officeId, quoteId, cargoId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/quoteCargoPackage/quoteCargoPackage.acl.ts b/test/generated/next/quoteCargoPackage/quoteCargoPackage.acl.ts deleted file mode 100644 index da1d43f..0000000 --- a/test/generated/next/quoteCargoPackage/quoteCargoPackage.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteCargoPackageAcl { -/** - * Use for `useCreatePackage` mutation ability. For global ability, omit the object parameter. - * @description Create cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreatePackage` mutation - */ -export const canUseCreatePackage = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Create", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useUpdatePackage` mutation ability. For global ability, omit the object parameter. - * @description Update cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdatePackage` mutation - */ -export const canUseUpdatePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDeletePackage` mutation ability. For global ability, omit the object parameter. - * @description Delete cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeletePackage` mutation - */ -export const canUseDeletePackage = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Delete", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useDuplicatePackage` mutation ability. For global ability, omit the object parameter. - * @description Duplicate cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicatePackage` mutation - */ -export const canUseDuplicatePackage = ( - object?: { officeId: string, } -) => [ - "Duplicate", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Duplicate", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -/** - * Use for `useMovePackage` mutation ability. For global ability, omit the object parameter. - * @description Move cargo package - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMovePackage` mutation - */ -export const canUseMovePackage = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("QuoteCargo", object) : "QuoteCargo" -] as AbilityTuple<"Update", "QuoteCargo" | ForcedSubject<"QuoteCargo"> & { officeId: string, }>; - -} diff --git a/test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts b/test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts deleted file mode 100644 index f399bc6..0000000 --- a/test/generated/next/quoteCargoPackage/quoteCargoPackage.api.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteCargoPackageApi { -export const createPackage = (officeId: string, quoteId: string, cargoId: string, data: CommonModels.CreatePositionCargoPackageDTO, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages`, - ZodExtended.parse(CommonModels.CreatePositionCargoPackageDTOSchema, data), - - ) -}; -export const updatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.UpdatePositionCargoPackageDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - ZodExtended.parse(CommonModels.UpdatePositionCargoPackageDTOSchema, data), - - ) -}; -export const deletePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}`, - - ) -}; -export const duplicatePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/duplicate`, - - ) -}; -export const movePackage = (officeId: string, quoteId: string, cargoId: string, packageId: string, data: CommonModels.MovePositionCargoPackageRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.PositionCargoPackageResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cargos/${cargoId}/packages/${packageId}/move`, - ZodExtended.parse(CommonModels.MovePositionCargoPackageRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts b/test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts deleted file mode 100644 index 8556a3a..0000000 --- a/test/generated/next/quoteCargoPackage/quoteCargoPackage.queries.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteCargoPackageAcl } from "./quoteCargoPackage.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteCargoPackageApi } from "./quoteCargoPackage.api"; - -export namespace QuoteCargoPackageQueries { -export const moduleName = QueryModule.QuoteCargoPackage; - - - -/** - * Mutation `useCreatePackage` - * @summary Create a new package for a cargo - * @permission Requires `canUseCreatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { CommonModels.CreatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseCreatePackage({ officeId } )); - return QuoteCargoPackageApi.createPackage(officeId, quoteId, cargoId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdatePackage` - * @summary Update a package - * @permission Requires `canUseUpdatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.UpdatePositionCargoPackageDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseUpdatePackage({ officeId } )); - return QuoteCargoPackageApi.updatePackage(officeId, quoteId, cargoId, packageId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePackage` - * @summary Delete a package - * @permission Requires `canUseDeletePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeletePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { - checkAcl(QuoteCargoPackageAcl.canUseDeletePackage({ officeId } )); - return QuoteCargoPackageApi.deletePackage(officeId, quoteId, cargoId, packageId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicatePackage` - * @summary Duplicate a package - * @permission Requires `canUseDuplicatePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicatePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId }) => { - checkAcl(QuoteCargoPackageAcl.canUseDuplicatePackage({ officeId } )); - return QuoteCargoPackageApi.duplicatePackage(officeId, quoteId, cargoId, packageId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMovePackage` - * @summary Move a package to a different cargo - * @permission Requires `canUseMovePackage` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.cargoId Path parameter - * @param { string } mutation.packageId Path parameter - * @param { CommonModels.MovePositionCargoPackageRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useMovePackage = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, cargoId, packageId, data }) => { - checkAcl(QuoteCargoPackageAcl.canUseMovePackage({ officeId } )); - return QuoteCargoPackageApi.movePackage(officeId, quoteId, cargoId, packageId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/quoteConversion/quoteConversion.acl.ts b/test/generated/next/quoteConversion/quoteConversion.acl.ts deleted file mode 100644 index 8c0f3c4..0000000 --- a/test/generated/next/quoteConversion/quoteConversion.acl.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteConversionAcl { -/** - * Use for `useConvertQuoteToPosition` mutation ability. For global ability, omit the object parameter. - * @description Create position for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useConvertQuoteToPosition` mutation - */ -export const canUseConvertQuoteToPosition = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Create", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/next/quoteConversion/quoteConversion.api.ts b/test/generated/next/quoteConversion/quoteConversion.api.ts deleted file mode 100644 index ecf19cc..0000000 --- a/test/generated/next/quoteConversion/quoteConversion.api.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteConversionModels } from "./quoteConversion.models"; - -export namespace QuoteConversionApi { -export const convertQuoteToPosition = (officeId: string, quoteId: string, data: QuoteConversionModels.ConvertQuoteToPositionRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.PositionCoreResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/convert`, - ZodExtended.parse(QuoteConversionModels.ConvertQuoteToPositionRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/quoteConversion/quoteConversion.models.ts b/test/generated/next/quoteConversion/quoteConversion.models.ts deleted file mode 100644 index ccca298..0000000 --- a/test/generated/next/quoteConversion/quoteConversion.models.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { z } from "zod"; - -export namespace QuoteConversionModels { -/** - * ConvertQuoteToPositionRequestDtoSchema - * @type { object } - * @property { string } estimatedServiceDate - */ -export const ConvertQuoteToPositionRequestDtoSchema = z.object({ estimatedServiceDate: z.iso.datetime({ offset: true }) }); -export type ConvertQuoteToPositionRequestDto = z.infer; - -} diff --git a/test/generated/next/quoteConversion/quoteConversion.queries.ts b/test/generated/next/quoteConversion/quoteConversion.queries.ts deleted file mode 100644 index bfba951..0000000 --- a/test/generated/next/quoteConversion/quoteConversion.queries.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteConversionAcl } from "./quoteConversion.acl"; -import { AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteConversionModels } from "./quoteConversion.models"; -import { QuoteConversionApi } from "./quoteConversion.api"; - -export namespace QuoteConversionQueries { -export const moduleName = QueryModule.QuoteConversion; - - - -/** - * Mutation `useConvertQuoteToPosition` - * @summary Convert quote to position - * @permission Requires `canUseConvertQuoteToPosition` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteConversionModels.ConvertQuoteToPositionRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Quote converted to position successfully - * @statusCodes [201, 400, 401, 404] - */ -export const useConvertQuoteToPosition = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteConversionAcl.canUseConvertQuoteToPosition({ officeId } )); - return QuoteConversionApi.convertQuoteToPosition(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/quoteDocument/quoteDocument.acl.ts b/test/generated/next/quoteDocument/quoteDocument.acl.ts deleted file mode 100644 index 43dec1f..0000000 --- a/test/generated/next/quoteDocument/quoteDocument.acl.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteDocumentAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGetPreview` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetPreview` mutation - */ -export const canUseGetPreview = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGenerateEml` mutation ability. For global ability, omit the object parameter. - * @description Read quote document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateEml` mutation - */ -export const canUseGenerateEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/next/quoteDocument/quoteDocument.api.ts b/test/generated/next/quoteDocument/quoteDocument.api.ts deleted file mode 100644 index 9c7c296..0000000 --- a/test/generated/next/quoteDocument/quoteDocument.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteDocumentModels } from "./quoteDocument.models"; - -export namespace QuoteDocumentApi { -export const get = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuoteDocumentModels.QuoteDocumentResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/document`, - - ) -}; -export const update = (officeId: string, quoteId: string, data: QuoteDocumentModels.UpdateQuoteDocumentRequestDto, ) => { - return AppRestClient.patch( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/document`, - ZodExtended.parse(QuoteDocumentModels.UpdateQuoteDocumentRequestDtoSchema, data), - - ) -}; -export const getPreview = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/${quoteId}/document/preview`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generate = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/document/generate`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - - ) -}; -export const generateEml = (officeId: string, quoteId: string, data: QuoteDocumentModels.GenerateQuoteDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/${quoteId}/document/eml`, - ZodExtended.parse(QuoteDocumentModels.GenerateQuoteDocumentRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/next/quoteDocument/quoteDocument.models.ts b/test/generated/next/quoteDocument/quoteDocument.models.ts deleted file mode 100644 index 73bb8da..0000000 --- a/test/generated/next/quoteDocument/quoteDocument.models.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteDocumentModels { -/** - * QuoteDocumentDataDtoSchema - * @type { object } - * @property { CommonModels.RouteTableBlockResponseDto } routeTable - * @property { CommonModels.CargoTableBlockDto } cargoTable - * @property { CommonModels.FinanceTableBlockDto } financeTable - */ -export const QuoteDocumentDataDtoSchema = z.object({ routeTable: CommonModels.RouteTableBlockResponseDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockDtoSchema.nullable() }).partial(); -export type QuoteDocumentDataDto = z.infer; - -/** - * QuoteDocumentConfigDtoSchema - * @type { object } - * @property { string } footerImageUrl - * @property { string } headerImageUrl - * @property { string } termsAndConditionsImageUrl - * @property { boolean } showWatermarkOnDocuments - * @property { CommonModels.LocaleEnum } locale - */ -export const QuoteDocumentConfigDtoSchema = z.object({ footerImageUrl: z.string().nullish(), headerImageUrl: z.string().nullish(), termsAndConditionsImageUrl: z.string().nullish(), showWatermarkOnDocuments: z.boolean(), locale: CommonModels.LocaleEnumSchema.nullish() }); -export type QuoteDocumentConfigDto = z.infer; - -/** - * CustomerDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - */ -export const CustomerDtoSchema = z.object({ name: z.string(), address: z.string() }); -export type CustomerDto = z.infer; - -/** - * ContactDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } phone - * @property { string } date - * @property { string } validFrom - * @property { string } validUntil - */ -export const ContactDtoSchema = z.object({ name: z.string(), email: z.string(), phone: z.string(), date: z.iso.datetime({ offset: true }), validFrom: z.iso.datetime({ offset: true }).nullish(), validUntil: z.iso.datetime({ offset: true }).nullish() }); -export type ContactDto = z.infer; - -/** - * QuoteDocumentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } quoteId - * @property { string } quoteNumber - * @property { CommonModels.TransportModeEnum } quoteTransportMode Mode of transport - * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote - * @property { string } transitDurationInDays Transit duration in days - * @property { CustomerDto } customer - * @property { ContactDto } contact - * @property { QuoteDocumentDataDto } data - * @property { boolean } suspendCargoTable - * @property { boolean } suspendFinanceTable - * @property { CommonModels.EditorContentResponseDto } bodyRemarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks - * @property { boolean } isIssued - * @property { number } version - * @property { QuoteDocumentConfigDto } config - * @property { string } issuedAt - */ -export const QuoteDocumentResponseDtoSchema = z.object({ id: z.string(), quoteId: z.string(), quoteNumber: z.string(), quoteTransportMode: CommonModels.TransportModeEnumSchema, frequency: CommonModels.FrequencyEnumSchema.nullish(), transitDurationInDays: z.string().nullish(), customer: CustomerDtoSchema, contact: ContactDtoSchema, data: QuoteDocumentDataDtoSchema.nullish(), suspendCargoTable: z.boolean(), suspendFinanceTable: z.boolean(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), isIssued: z.boolean(), version: z.number(), config: QuoteDocumentConfigDtoSchema.nullish(), issuedAt: z.iso.datetime({ offset: true }).nullish() }); -export type QuoteDocumentResponseDto = z.infer; - -/** - * QuoteDocumentDataUpdateDtoSchema - * @type { object } - * @property { CommonModels.RouteTableUpdateBlockDto } routeTable - * @property { CommonModels.CargoTableBlockUpdateDto } cargoTable - * @property { CommonModels.FinanceTableBlockUpdateDto } financeTable - */ -export const QuoteDocumentDataUpdateDtoSchema = z.object({ routeTable: CommonModels.RouteTableUpdateBlockDtoSchema.nullable(), cargoTable: CommonModels.CargoTableBlockUpdateDtoSchema.nullable(), financeTable: CommonModels.FinanceTableBlockUpdateDtoSchema.nullable() }).partial(); -export type QuoteDocumentDataUpdateDto = z.infer; - -/** - * CustomerUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } address - */ -export const CustomerUpdateDtoSchema = z.object({ name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type CustomerUpdateDto = z.infer; - -/** - * ContactUpdateDtoSchema - * @type { object } - * @property { string } name - * @property { string } email - * @property { string } phone - * @property { string } date - */ -export const ContactUpdateDtoSchema = z.object({ name: z.string().nullable(), email: z.email().nullable(), phone: z.string().nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type ContactUpdateDto = z.infer; - -/** - * UpdateQuoteDocumentRequestDtoSchema - * @type { object } - * @property { CustomerUpdateDto } customer - * @property { ContactUpdateDto } contact - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks - * @property { boolean } suspendCargoTable - * @property { boolean } suspendFinanceTable - * @property { QuoteDocumentDataUpdateDto } data - */ -export const UpdateQuoteDocumentRequestDtoSchema = z.object({ customer: CustomerUpdateDtoSchema.nullable(), contact: ContactUpdateDtoSchema.nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), suspendCargoTable: z.boolean().nullable(), suspendFinanceTable: z.boolean().nullable(), data: QuoteDocumentDataUpdateDtoSchema.nullable() }).partial(); -export type UpdateQuoteDocumentRequestDto = z.infer; - -/** - * GenerateQuoteDocumentPreviewRequestDtoSchema - * @type { object } - * @property { string } issuedAt - */ -export const GenerateQuoteDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type GenerateQuoteDocumentPreviewRequestDto = z.infer; - -/** - * GenerateQuoteDocumentRequestDtoSchema - * @type { object } - * @property { string } issuedAt - * @property { string } fileName - */ -export const GenerateQuoteDocumentRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullish(), fileName: z.string() }); -export type GenerateQuoteDocumentRequestDto = z.infer; - -} diff --git a/test/generated/next/quoteDocument/quoteDocument.queries.ts b/test/generated/next/quoteDocument/quoteDocument.queries.ts deleted file mode 100644 index c9b50a2..0000000 --- a/test/generated/next/quoteDocument/quoteDocument.queries.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteDocumentAcl } from "./quoteDocument.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuoteDocumentModels } from "./quoteDocument.models"; -import { QuoteDocumentApi } from "./quoteDocument.api"; - -export namespace QuoteDocumentQueries { -export const moduleName = QueryModule.QuoteDocument; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/document", officeId, quoteId] as const, -}; - -/** - * Query `useGet` - * @summary Get quote document - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteDocumentAcl.canUseGet({ officeId } )); - return QuoteDocumentApi.get(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update quote document - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.UpdateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseUpdate({ officeId } )); - return QuoteDocumentApi.update(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGetPreview` - recommended when file should not be cached - * @summary Get quote document pdf preview - * @permission Requires `canUseGetPreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentPreviewRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useGetPreview = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGetPreview({ officeId } )); - return QuoteDocumentApi.getPreview(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerate` - * @summary Get quote document pdf preview - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGenerate({ officeId } )); - return QuoteDocumentApi.generate(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateEml` - recommended when file should not be cached - * @summary Generate quote document and return EML file - * @permission Requires `canUseGenerateEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuoteDocumentModels.GenerateQuoteDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteDocumentAcl.canUseGenerateEml({ officeId } )); - return QuoteDocumentApi.generateEml(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts deleted file mode 100644 index 24ebb81..0000000 --- a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.acl.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteProfitChangeTrackingAcl { -/** - * Use for `useFindProfitChangeGroups` query ability. For global ability, omit the object parameter. - * @description List quote profit change groups - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.quoteId quoteId from quoteId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroups` query - */ -export const canUseFindProfitChangeGroups = ( - object?: { officeId: string, quoteId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; - -/** - * Use for `useFindProfitChangeGroupDetail` query ability. For global ability, omit the object parameter. - * @description Get quote profit change group details - * @param { string } object.officeId officeId from officeId path parameter - * @param { string } object.quoteId quoteId from quoteId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindProfitChangeGroupDetail` query - */ -export const canUseFindProfitChangeGroupDetail = ( - object?: { officeId: string, quoteId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, quoteId: string, }>; - -} diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts deleted file mode 100644 index 2991187..0000000 --- a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.api.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; - -export namespace QuoteProfitChangeTrackingApi { -export const findProfitChangeGroups = (officeId: string, quoteId: string, limit: number, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: QuoteProfitChangeTrackingModels.QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups`, - { - params: { - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findProfitChangeGroupDetail = (groupId: string, officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/account/profit-change-groups/${groupId}`, - - ) -}; -} diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts deleted file mode 100644 index 169ba81..0000000 --- a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.configs.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { dynamicColumns } from "@povio/ui"; -import { QuoteProfitChangeTrackingModels } from "./quoteProfitChangeTracking.models"; -import { QuoteProfitChangeTrackingQueries } from "./quoteProfitChangeTracking.queries"; -import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; - -export namespace QuoteProfitChangeTrackingConfigs { -export const profitChangeGroupsConfig = { - meta: { - title: "Profit Change Groups", - }, - readAll: { - acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups, - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, - paginated: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroups, - infinite: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupsInfinite, - columns: dynamicColumns({ - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDtoSchema, - options: { - columns: { - id: true, - timestamp: true, - users: true, - profit: true, - changeCount: true, - }, - }, -}), - }, - read: { - acl: QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail, - schema: QuoteProfitChangeTrackingModels.QuoteAccountProfitChangeGroupDetailDtoSchema, - query: QuoteProfitChangeTrackingQueries.useFindProfitChangeGroupDetail, - }, -}; - -} diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts deleted file mode 100644 index 9067c50..0000000 --- a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.models.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteProfitChangeTrackingModels { -/** - * QuoteAccountProfitChangeGroupDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto[] } users - * @property { object } profit - * @property { number } profit.amount - * @property { string } profit.currencyCode - * @property { number } changeCount - */ -export const QuoteAccountProfitChangeGroupDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), users: z.array(CommonModels.UserPreviewDtoSchema), profit: z.object({ amount: z.number(), currencyCode: z.string() }), changeCount: z.number() }); -export type QuoteAccountProfitChangeGroupDto = z.infer; - -/** - * QuoteAccountProfitChangeEntryDtoSchema - * @type { object } - * @property { string } timestamp - * @property { CommonModels.UserPreviewDto } user - * @property { number } changeNumber - * @property { number } oldProfit - * @property { number } newProfit - * @property { string } currencyCode - */ -export const QuoteAccountProfitChangeEntryDtoSchema = z.object({ timestamp: z.iso.datetime({ offset: true }), user: CommonModels.UserPreviewDtoSchema, changeNumber: z.number(), oldProfit: z.number(), newProfit: z.number(), currencyCode: z.string() }); -export type QuoteAccountProfitChangeEntryDto = z.infer; - -/** - * QuoteAccountProfitChangeGroupDetailDtoSchema - * @type { object } - * @property { string } id - * @property { string } timestamp - * @property { string } currencyCode - * @property { QuoteAccountProfitChangeEntryDto[] } entries - */ -export const QuoteAccountProfitChangeGroupDetailDtoSchema = z.object({ id: z.string(), timestamp: z.iso.datetime({ offset: true }), currencyCode: z.string(), entries: z.array(QuoteAccountProfitChangeEntryDtoSchema) }); -export type QuoteAccountProfitChangeGroupDetailDto = z.infer; - -/** - * QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { QuoteAccountProfitChangeGroupDto[] } items - */ -export const QuoteProfitChangeTrackingFindProfitChangeGroupsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(QuoteAccountProfitChangeGroupDtoSchema).nullable() }).partial().shape }); -export type QuoteProfitChangeTrackingFindProfitChangeGroupsResponse = z.infer; - -} diff --git a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts b/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts deleted file mode 100644 index 9388eba..0000000 --- a/test/generated/next/quoteProfitChangeTracking/quoteProfitChangeTracking.queries.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteProfitChangeTrackingAcl } from "./quoteProfitChangeTracking.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { QuoteProfitChangeTrackingApi } from "./quoteProfitChangeTracking.api"; - -export namespace QuoteProfitChangeTrackingQueries { -export const moduleName = QueryModule.QuoteProfitChangeTracking; - -export const keys = { - all: [moduleName] as const, - findProfitChangeGroups: (officeId: string, quoteId: string, limit?: number, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", officeId, quoteId, limit, page, cursor] as const, - findProfitChangeGroupsInfinite: (officeId: string, quoteId: string, limit?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups", "infinite", officeId, quoteId, limit, cursor] as const, - findProfitChangeGroupDetail: (groupId: string, officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/account/profit-change-groups/:groupId", groupId, officeId, quoteId] as const, -}; - -/** - * Query `useFindProfitChangeGroups` - * @summary List quote profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroups = ({ officeId, quoteId, limit, page, cursor }: { officeId: string, quoteId: string, limit: number, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroups(officeId, quoteId, limit, page, cursor), - queryFn: () => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useFindProfitChangeGroupsInfinite - * @summary List quote profit change groups - * @permission Requires `canUseFindProfitChangeGroups` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupsInfinite = ({ officeId, quoteId, limit, cursor }: { officeId: string, quoteId: string, limit: number, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.findProfitChangeGroupsInfinite(officeId, quoteId, limit, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroups({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroups(officeId, quoteId, limit, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindProfitChangeGroupDetail` - * @summary Get quote profit change group details - * @permission Requires `canUseFindProfitChangeGroupDetail` ability - * @param { string } object.groupId Path parameter - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindProfitChangeGroupDetail = ({ groupId, officeId, quoteId }: { groupId: string, officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findProfitChangeGroupDetail(groupId, officeId, quoteId), - queryFn: () => { - checkAcl(QuoteProfitChangeTrackingAcl.canUseFindProfitChangeGroupDetail({ officeId, quoteId } )); - return QuoteProfitChangeTrackingApi.findProfitChangeGroupDetail(groupId, officeId, quoteId) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/quoteRoutes/quoteRoutes.acl.ts b/test/generated/next/quoteRoutes/quoteRoutes.acl.ts deleted file mode 100644 index 23e12ea..0000000 --- a/test/generated/next/quoteRoutes/quoteRoutes.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuoteRoutesAcl { -/** - * Use for `useListRoutes` query ability. For global ability, omit the object parameter. - * @description List quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListRoutes` query - */ -export const canUseListRoutes = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Create quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateRoutePoint` mutation - */ -export const canUseCreateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdateRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Update quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateRoutePoint` mutation - */ -export const canUseUpdateRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDeleteRoutePoint` mutation ability. For global ability, omit the object parameter. - * @description Delete quote route point - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteRoutePoint` mutation - */ -export const canUseDeleteRoutePoint = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useSplitRoutes` mutation ability. For global ability, omit the object parameter. - * @description Split quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useSplitRoutes` mutation - */ -export const canUseSplitRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useMergeRoutes` mutation ability. For global ability, omit the object parameter. - * @description Merge quote routes - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useMergeRoutes` mutation - */ -export const canUseMergeRoutes = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCopyRoute` mutation ability. For global ability, omit the object parameter. - * @description Copy quote route points - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCopyRoute` mutation - */ -export const canUseCopyRoute = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/next/quoteRoutes/quoteRoutes.api.ts b/test/generated/next/quoteRoutes/quoteRoutes.api.ts deleted file mode 100644 index 8688bde..0000000 --- a/test/generated/next/quoteRoutes/quoteRoutes.api.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuoteRoutesApi { -export const listRoutes = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: CommonModels.RouteListResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes`, - - ) -}; -export const createRoutePoint = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CreateRoutePointRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points`, - ZodExtended.parse(CommonModels.CreateRoutePointRequestDtoSchema, data), - - ) -}; -export const updateRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, data: CommonModels.UpdateRoutePointRequestDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.RoutePointResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - ZodExtended.parse(CommonModels.UpdateRoutePointRequestDtoSchema, data), - - ) -}; -export const deleteRoutePoint = (officeId: string, quoteId: string, routeId: string, pointId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/route-points/${pointId}`, - - ) -}; -export const splitRoutes = (officeId: string, quoteId: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/split`, - - ) -}; -export const mergeRoutes = (officeId: string, quoteId: string, data: CommonModels.MergeRoutesRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/merge`, - ZodExtended.parse(CommonModels.MergeRoutesRequestDtoSchema, data), - - ) -}; -export const copyRoute = (officeId: string, quoteId: string, routeId: string, data: CommonModels.CopyRouteRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/routes/${routeId}/copy`, - ZodExtended.parse(CommonModels.CopyRouteRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/quoteRoutes/quoteRoutes.queries.ts b/test/generated/next/quoteRoutes/quoteRoutes.queries.ts deleted file mode 100644 index 04ed45f..0000000 --- a/test/generated/next/quoteRoutes/quoteRoutes.queries.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuoteRoutesAcl } from "./quoteRoutes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { CommonModels } from "@/data/common/common.models"; -import { QuoteRoutesApi } from "./quoteRoutes.api"; - -export namespace QuoteRoutesQueries { -export const moduleName = QueryModule.QuoteRoutes; - -export const keys = { - all: [moduleName] as const, - listRoutes: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/routes", officeId, quoteId] as const, -}; - -/** - * Query `useListRoutes` - * @summary List routes with points for a quote - * @permission Requires `canUseListRoutes` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListRoutes = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listRoutes(officeId, quoteId), - queryFn: () => { - checkAcl(QuoteRoutesAcl.canUseListRoutes({ officeId } )); - return QuoteRoutesApi.listRoutes(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateRoutePoint` - * @summary Create a route point for a quote route - * @permission Requires `canUseCreateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CreateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, data }) => { - checkAcl(QuoteRoutesAcl.canUseCreateRoutePoint({ officeId } )); - return QuoteRoutesApi.createRoutePoint(officeId, quoteId, routeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateRoutePoint` - * @summary Update a route point for a quote route - * @permission Requires `canUseUpdateRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { CommonModels.UpdateRoutePointRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, pointId, data }) => { - checkAcl(QuoteRoutesAcl.canUseUpdateRoutePoint({ officeId } )); - return QuoteRoutesApi.updateRoutePoint(officeId, quoteId, routeId, pointId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteRoutePoint` - * @summary Delete a route point from a quote route - * @permission Requires `canUseDeleteRoutePoint` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { string } mutation.pointId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useDeleteRoutePoint = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, pointId }) => { - checkAcl(QuoteRoutesAcl.canUseDeleteRoutePoint({ officeId } )); - return QuoteRoutesApi.deleteRoutePoint(officeId, quoteId, routeId, pointId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useSplitRoutes` - * @summary Split quote routes by cargo (sea only) - * @permission Requires `canUseSplitRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useSplitRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId }) => { - checkAcl(QuoteRoutesAcl.canUseSplitRoutes({ officeId } )); - return QuoteRoutesApi.splitRoutes(officeId, quoteId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useMergeRoutes` - * @summary Merge quote cargo routes into single route (sea only) - * @permission Requires `canUseMergeRoutes` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.MergeRoutesRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useMergeRoutes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuoteRoutesAcl.canUseMergeRoutes({ officeId } )); - return QuoteRoutesApi.mergeRoutes(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCopyRoute` - * @summary Copy route points from one route to another (sea only) - * @permission Requires `canUseCopyRoute` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.routeId Path parameter - * @param { CommonModels.CopyRouteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [204, 401] - */ -export const useCopyRoute = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, routeId, data }) => { - checkAcl(QuoteRoutesAcl.canUseCopyRoute({ officeId } )); - return QuoteRoutesApi.copyRoute(officeId, quoteId, routeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/quotes/quotes.acl.ts b/test/generated/next/quotes/quotes.acl.ts deleted file mode 100644 index d7f98e9..0000000 --- a/test/generated/next/quotes/quotes.acl.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace QuotesAcl { -/** - * Use for `usePaginate` query ability. For global ability, omit the object parameter. - * @description List quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useListAvailablePartnersFor` query ability. For global ability, omit the object parameter. - * @description List available partners for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useListAvailablePartnersFor` query - */ -export const canUseListAvailablePartnersFor = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useExportQuotes` mutation ability. For global ability, omit the object parameter. - * @description Export quotes for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useExportQuotes` mutation - */ -export const canUseExportQuotes = ( - object?: { officeId: string, } -) => [ - "Export", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Export", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGetById` query ability. For global ability, omit the object parameter. - * @description Get quote by id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCancel` mutation ability. For global ability, omit the object parameter. - * @description Cancel quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCancel` mutation - */ -export const canUseCancel = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDuplicate` mutation ability. For global ability, omit the object parameter. - * @description Duplicate quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDuplicate` mutation - */ -export const canUseDuplicate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Create", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useGetInvolvedParties` query ability. For global ability, omit the object parameter. - * @description Get involved parties for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetInvolvedParties` query - */ -export const canUseGetInvolvedParties = ( - object?: { officeId: string, } -) => [ - "ReadInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"ReadInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useCreateInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Create involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreateInvolvedParty` mutation - */ -export const canUseCreateInvolvedParty = ( - object?: { officeId: string, } -) => [ - "CreateInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"CreateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdateInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Update involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateInvolvedParty` mutation - */ -export const canUseUpdateInvolvedParty = ( - object?: { officeId: string, } -) => [ - "UpdateInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"UpdateInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useDeleteInvolvedParty` mutation ability. For global ability, omit the object parameter. - * @description Delete involved party for quote - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteInvolvedParty` mutation - */ -export const canUseDeleteInvolvedParty = ( - object?: { officeId: string, } -) => [ - "DeleteInvolvedParties", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"DeleteInvolvedParties", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/next/quotes/quotes.api.ts b/test/generated/next/quotes/quotes.api.ts deleted file mode 100644 index 53ffe08..0000000 --- a/test/generated/next/quotes/quotes.api.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { QuotesModels } from "./quotes.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuotesApi { -export const paginate = (officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuotesPaginateResponseSchema }, - `/offices/${officeId}/quotes`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(QuotesModels.QuotesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(QuotesModels.QuoteFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: QuotesModels.CreateQuoteRequestDTO, ) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes`, - ZodExtended.parse(QuotesModels.CreateQuoteRequestDTOSchema, data), - - ) -}; -export const listAvailablePartnersFor = (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase, ) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuotesListAvailablePartnersForResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/available-partners`, - { - params: { - search: ZodExtended.parse(z.string().nullish(), search, { type: "query", name: "search" }), - useCase: ZodExtended.parse(CommonModels.PositionAvailablePartnersUseCaseSchema.optional(), useCase, { type: "query", name: "useCase" }), - }, - } - ) -}; -export const exportQuotes = (officeId: string, data: QuotesModels.QuoteExportRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/quotes/exports`, - ZodExtended.parse(QuotesModels.QuoteExportRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const getById = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}`, - - ) -}; -export const update = (officeId: string, quoteId: string, data: QuotesModels.UpdateQuoteRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}`, - ZodExtended.parse(QuotesModels.UpdateQuoteRequestDTOSchema, data), - - ) -}; -export const cancel = (officeId: string, quoteId: string, ) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/cancel`, - - ) -}; -export const duplicate = (officeId: string, quoteId: string, data: QuotesModels.DuplicateQuoteRequestDto, ) => { - return AppRestClient.post( - { resSchema: QuotesModels.QuoteCoreResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/duplicate`, - ZodExtended.parse(QuotesModels.DuplicateQuoteRequestDtoSchema, data), - - ) -}; -export const getInvolvedParties = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: QuotesModels.GetInvolvedPartiesResponseSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - - ) -}; -export const createInvolvedParty = (officeId: string, quoteId: string, data: CommonModels.CreateInvolvedPartyRequestDto, ) => { - return AppRestClient.post( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties`, - ZodExtended.parse(CommonModels.CreateInvolvedPartyRequestDtoSchema, data), - - ) -}; -export const updateInvolvedParty = (officeId: string, quoteId: string, partyId: string, data: CommonModels.UpdateInvolvedPartyDto, ) => { - return AppRestClient.patch( - { resSchema: CommonModels.InvolvedPartyResponseDtoSchema }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - ZodExtended.parse(CommonModels.UpdateInvolvedPartyDtoSchema, data), - - ) -}; -export const deleteInvolvedParty = (officeId: string, quoteId: string, partyId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/quotes/${quoteId}/involved-parties/${partyId}`, - - ) -}; -} diff --git a/test/generated/next/quotes/quotes.configs.ts b/test/generated/next/quotes/quotes.configs.ts deleted file mode 100644 index e288ac4..0000000 --- a/test/generated/next/quotes/quotes.configs.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { QuotesModels } from "./quotes.models"; -import { QuotesQueries } from "./quotes.queries"; -import { QuotesAcl } from "./quotes.acl"; - -export namespace QuotesConfigs { -export const quotesConfig = { - meta: { - title: "Quotes", - }, - readAll: { - acl: QuotesAcl.canUsePaginate, - schema: QuotesModels.QuotePreviewResponseDTOSchema, - paginated: QuotesQueries.usePaginate, - infinite: QuotesQueries.usePaginateInfinite, - filters: { - schema: QuotesModels.QuoteFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: QuotesModels.QuoteFilterDtoSchema, - options: { - inputs: { - statusDate: true, - transportMode: true, - status: true, - direction: true, - loadType: true, - serviceType: true, - carrierId: true, - consigneeId: true, - employee: true, - routing: true, - number: true, - createdAt: true, - vesselCarrier: true, - searchQuery: true, - customer: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: QuotesModels.QuotePreviewResponseDTOSchema, - options: { - columns: { - id: true, - transportMode: true, - statusDate: true, - createdAt: true, - number: true, - status: true, - direction: true, - loadType: true, - customer: true, - customerReference: true, - consignee: true, - consigneeReference: true, - carrier: true, - carrierReference: true, - employee: true, - origin: true, - destination: true, - portOfLoading: true, - dischargePort: true, - bookingNumber: true, - vessel: true, - voyage: true, - vesselCarrier: true, - equipment: true, - serviceType: true, - currency: true, - profit: true, - margin: true, - numberOfConvertedPositions: true, - departureDate: true, - arrivalDate: true, - routing: true, - }, - sortable: QuotesModels.QuotesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: QuotesAcl.canUseGetById, - schema: QuotesModels.QuoteCoreResponseDTOSchema, - query: QuotesQueries.useGetById, - }, - create: { - acl: QuotesAcl.canUseCreate, - schema: QuotesModels.CreateQuoteRequestDTOSchema, - mutation: QuotesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: QuotesModels.CreateQuoteRequestDTOSchema, - options: { - inputs: { - section: true, - direction: true, - transportMode: true, - loadType: true, - serviceType: true, - customerBusinessPartnerId: true, - }, - }, -}) - }, - update: { - acl: QuotesAcl.canUseUpdate, - schema: QuotesModels.UpdateQuoteRequestDTOSchema, - mutation: QuotesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: QuotesModels.UpdateQuoteRequestDTOSchema, - options: { - inputs: { - number: true, - statusDate: true, - cargoType: true, - loadType: true, - incoterms: true, - secondIncoterms: true, - serviceType: true, - buyRateReference: true, - frequency: true, - transitDurationInDays: true, - quoteType: true, - defaultCurrencyId: true, - salesRepId: true, - responsibleEmployeeId: true, - receivedByEmployeeId: true, - team: true, - volumetricWeightModifier: true, - }, - }, -}) - }, -}; - -} diff --git a/test/generated/next/quotes/quotes.models.ts b/test/generated/next/quotes/quotes.models.ts deleted file mode 100644 index 47c00a5..0000000 --- a/test/generated/next/quotes/quotes.models.ts +++ /dev/null @@ -1,322 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace QuotesModels { -/** - * QuoteStatusEnumSchema - * @type { enum } - */ -export const QuoteStatusEnumSchema = z.enum(["Pending", "Cancelled", "Converted"]); -export type QuoteStatusEnum = z.infer; -export const QuoteStatusEnum = QuoteStatusEnumSchema.enum; - -/** - * QuoteCustomerResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the customer - * @property { string } name - * @property { string } matchCode - * @property { string } label - * @property { string } phone The phone number of the customer - * @property { string } email The email of the customer - */ -export const QuoteCustomerResponseDtoSchema = z.object({ id: z.string(), name: z.string(), matchCode: z.string(), label: z.string(), phone: z.string().nullish(), email: z.string().nullish() }); -export type QuoteCustomerResponseDto = z.infer; - -/** - * QuoteNamedReferenceResponseDtoSchema - * @type { object } - * @property { string } id Unique identifier of the entity - * @property { string } name Name of the entity - * @property { string } matchCode - * @property { string } label Display label (name or match code depending on office settings) - */ -export const QuoteNamedReferenceResponseDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), matchCode: z.string().nullable(), label: z.string().nullable() }).partial(); -export type QuoteNamedReferenceResponseDto = z.infer; - -/** - * QuotePreviewResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the quote - * @property { CommonModels.TransportModeEnum } transportMode Transport mode - * @property { string } statusDate The date of the quote status - * @property { string } createdAt The date when the quote was created - * @property { string } number The quote number - * @property { QuoteStatusEnum } status Status of the quote - * @property { CommonModels.DirectionEnum } direction Direction of the quote - * @property { CommonModels.LoadTypeEnum } loadType Load type - * @property { QuoteCustomerResponseDto } customer The customer information - * @property { string } customerReference Customer reference number - * @property { QuoteNamedReferenceResponseDto } consignee Consignee information - * @property { string } consigneeReference Consignee reference number - * @property { QuoteNamedReferenceResponseDto } carrier The carrier - * @property { string } carrierReference Carrier reference number - * @property { QuoteNamedReferenceResponseDto } employee Responsible employee - * @property { QuoteNamedReferenceResponseDto } origin Origin location - * @property { QuoteNamedReferenceResponseDto } destination Destination location - * @property { QuoteNamedReferenceResponseDto } portOfLoading Port of loading - * @property { QuoteNamedReferenceResponseDto } dischargePort Discharge port - * @property { string } bookingNumber Booking reference number - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } vesselCarrier Carrier name from route point (sea positions only) - * @property { string } equipment Equipment summary (e.g., "2x20DC, 1x40HC") - * @property { CommonModels.ServiceTypeEnum } serviceType Service type - * @property { string } currency Currency code - * @property { number } profit Total profit - * @property { number } margin Profit margin percentage - * @property { number } numberOfConvertedPositions Number of positions converted from this quote - * @property { string } departureDate Departure date - * @property { string } arrivalDate Arrival date - * @property { CommonModels.SeaRoutingEnum } routing Sea routing type - */ -export const QuotePreviewResponseDTOSchema = z.object({ id: z.string(), transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }).nullable(), createdAt: z.iso.datetime({ offset: true }), number: z.string(), status: QuoteStatusEnumSchema, direction: CommonModels.DirectionEnumSchema, loadType: CommonModels.LoadTypeEnumSchema.nullish(), customer: QuoteCustomerResponseDtoSchema, customerReference: z.string().nullish(), consignee: QuoteNamedReferenceResponseDtoSchema.nullish(), consigneeReference: z.string().nullish(), carrier: QuoteNamedReferenceResponseDtoSchema.nullish(), carrierReference: z.string().nullish(), employee: QuoteNamedReferenceResponseDtoSchema.nullish(), origin: QuoteNamedReferenceResponseDtoSchema, destination: QuoteNamedReferenceResponseDtoSchema, portOfLoading: QuoteNamedReferenceResponseDtoSchema.nullish(), dischargePort: QuoteNamedReferenceResponseDtoSchema.nullish(), bookingNumber: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), vesselCarrier: z.string().nullish(), equipment: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), currency: z.string().nullish(), profit: z.number().nullish(), margin: z.number().nullish(), numberOfConvertedPositions: z.number(), departureDate: z.iso.datetime({ offset: true }).nullish(), arrivalDate: z.iso.datetime({ offset: true }).nullish(), routing: CommonModels.SeaRoutingEnumSchema.nullish() }); -export type QuotePreviewResponseDTO = z.infer; - -/** - * QuoteFilterDtoSchema - * @type { object } - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.TransportModeEnum } transportMode - * @property { QuoteStatusEnum[] } status - * @property { CommonModels.DirectionEnum } direction - * @property { CommonModels.LoadTypeEnum } loadType - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string[] } carrierId Filter quotes by carrier IDs - * @property { string[] } consigneeId Filter quotes by consignee IDs - * @property { string[] } employee Filter quotes by employee IDs - * @property { CommonModels.SeaRoutingEnum } routing - * @property { string } number Filter quotes by quote number - * @property { CommonModels.DateRangeDto } createdAt - * @property { string } vesselCarrier Filter quotes by carrier name from route point - * @property { string } searchQuery - * @property { string[] } customer - */ -export const QuoteFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema.nullable(), transportMode: CommonModels.TransportModeEnumSchema.nullable(), status: z.array(QuoteStatusEnumSchema).nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), carrierId: z.array(z.string()).nullable(), consigneeId: z.array(z.string()).nullable(), employee: z.array(z.string()).nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable(), number: z.string().nullable(), createdAt: CommonModels.DateRangeDtoSchema.nullable(), vesselCarrier: z.string().nullable(), searchQuery: z.string().nullable(), customer: z.array(z.string()).nullable() }).partial(); -export type QuoteFilterDto = z.infer; - -/** - * QuoteExportFilterDtoSchema - * @type { object } - * @property { CommonModels.DateRangeDto } statusDate - * @property { CommonModels.TransportModeEnum } transportMode - * @property { QuoteStatusEnum[] } status - * @property { CommonModels.DirectionEnum } direction - * @property { string } searchQuery - * @property { string[] } customer - */ -export const QuoteExportFilterDtoSchema = z.object({ statusDate: CommonModels.DateRangeDtoSchema.nullable(), transportMode: CommonModels.TransportModeEnumSchema.nullable(), status: z.array(QuoteStatusEnumSchema).nullable(), direction: CommonModels.DirectionEnumSchema.nullable(), searchQuery: z.string().nullable(), customer: z.array(z.string()).nullable() }).partial(); -export type QuoteExportFilterDto = z.infer; - -/** - * QuoteExportColumnSchema - * @type { enum } - */ -export const QuoteExportColumnSchema = z.enum(["id", "transportMode", "statusDate", "createdAt", "number", "status", "direction", "loadType", "serviceType", "customerId", "customerName", "customerPhone", "customerEmail", "customerReference", "consigneeId", "consigneeName", "consigneeReference", "carrierId", "carrierName", "carrierReference", "responsibleEmployeeName", "originLocationId", "originLocationName", "destinationLocationId", "destinationLocationName", "portOfLoadingId", "portOfLoadingName", "dischargePortId", "dischargePortName", "bookingNumber", "vessel", "voyage", "equipment", "departureDate", "arrivalDate", "routing", "currency", "profit", "margin"]); -export type QuoteExportColumn = z.infer; -export const QuoteExportColumn = QuoteExportColumnSchema.enum; - -/** - * QuoteExportRequestDtoSchema - * @type { object } - * @property { QuoteExportColumn[] } columns Min Items: `1` - * @property { string[] } order - * @property { QuoteExportFilterDto } filter - */ -export const QuoteExportRequestDtoSchema = z.object({ columns: z.array(QuoteExportColumnSchema).min(1).nullable(), order: z.array(z.string()).nullable(), filter: QuoteExportFilterDtoSchema.nullable() }).partial(); -export type QuoteExportRequestDto = z.infer; - -/** - * CreateQuoteRequestDTOSchema - * @type { object } - * @property { CommonModels.SectionEnum } section The section of the quote - * @property { CommonModels.DirectionEnum } direction The direction of the quote - * @property { CommonModels.TransportModeEnum } transportMode The mode of transport for the quote - * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote - * @property { CommonModels.ServiceTypeEnum } serviceType The service type for the quote - * @property { string } customerBusinessPartnerId The ID of the business partner that is the customer - */ -export const CreateQuoteRequestDTOSchema = z.object({ section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, loadType: CommonModels.LoadTypeEnumSchema, serviceType: CommonModels.ServiceTypeEnumSchema, customerBusinessPartnerId: z.string() }); -export type CreateQuoteRequestDTO = z.infer; - -/** - * QuoteCustomerDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const QuoteCustomerDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type QuoteCustomerDto = z.infer; - -/** - * QuoteEmployeeResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the employee - * @property { string } name Name of the employee - */ -export const QuoteEmployeeResponseDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type QuoteEmployeeResponseDTO = z.infer; - -/** - * CargoTypeEnumSchema - * @type { enum } - */ -export const CargoTypeEnumSchema = z.enum(["Trailer", "Container", "BreakBulk", "Roro", "Project"]); -export type CargoTypeEnum = z.infer; -export const CargoTypeEnum = CargoTypeEnumSchema.enum; - -/** - * QuoteTypeEnumSchema - * @type { enum } - */ -export const QuoteTypeEnumSchema = z.enum(["Sea", "Road", "Air"]); -export type QuoteTypeEnum = z.infer; -export const QuoteTypeEnum = QuoteTypeEnumSchema.enum; - -/** - * QuoteConvertedPositionDtoSchema - * @type { object } - * @property { string } positionId - * @property { string } positionNumber - */ -export const QuoteConvertedPositionDtoSchema = z.object({ positionId: z.string(), positionNumber: z.string() }); -export type QuoteConvertedPositionDto = z.infer; - -/** - * QuoteCoreResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the quote - * @property { string } rootFolderId Root folder identifier bound to this quote - * @property { QuoteCustomerDto } customer - * @property { QuoteStatusEnum } status Current status of the quote - * @property { string } responsibleEmployeeId Unique identifier of the responsible employee - * @property { string } receivedByEmployeeId Unique identifier of the employee receiving the quote - * @property { CommonModels.ServiceTypeEnum } serviceType - * @property { string } salesRepId Unique identifier of the sales rep - * @property { QuoteEmployeeResponseDTO } responsibleEmployee The responsible employee - * @property { QuoteEmployeeResponseDTO } receivedByEmployee The employee who received the quote - * @property { string } owningOfficeId ID of the office owning the quote - * @property { string } name Name of the quote - * @property { string } number Quote number - * @property { CommonModels.SectionEnum } section Section of the quote - * @property { CommonModels.DirectionEnum } direction Direction of the quote - * @property { CommonModels.TransportModeEnum } transportMode Mode of transport - * @property { string } statusDate Date of the quote status - * @property { CargoTypeEnum } cargoType Type of cargo - * @property { CommonModels.IncotermsEnum } incoterms Incoterms for the quote - * @property { CommonModels.IncotermsEnum } secondIncoterms Second incoterms for the quote - * @property { string } buyRateReference Reference for buy rate - * @property { CommonModels.FrequencyEnum } frequency Frequency of the quote - * @property { string } transitDurationInDays Transit duration in days - * @property { QuoteTypeEnum } quoteType Type of quote - * @property { string } defaultCurrencyId Default currency - * @property { QuoteEmployeeResponseDTO } salesRep The sales rep for the quote - * @property { string } team Team - * @property { string } createdAt - * @property { string } updatedAt - * @property { QuoteConvertedPositionDto[] } convertedPositions Positions converted from this quote. Default: `` - * @property { CommonModels.LoadTypeEnum } loadType Load type of quote - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const QuoteCoreResponseDTOSchema = z.object({ id: z.string(), rootFolderId: z.string().nullish(), customer: QuoteCustomerDtoSchema.nullish(), status: QuoteStatusEnumSchema, responsibleEmployeeId: z.string().nullish(), receivedByEmployeeId: z.string().nullish(), serviceType: CommonModels.ServiceTypeEnumSchema.nullish(), salesRepId: z.string().nullish(), responsibleEmployee: QuoteEmployeeResponseDTOSchema.nullish(), receivedByEmployee: QuoteEmployeeResponseDTOSchema.nullish(), owningOfficeId: z.string(), name: z.string(), number: z.string(), section: CommonModels.SectionEnumSchema, direction: CommonModels.DirectionEnumSchema, transportMode: CommonModels.TransportModeEnumSchema, statusDate: z.iso.datetime({ offset: true }), cargoType: CargoTypeEnumSchema.nullish(), incoterms: CommonModels.IncotermsEnumSchema.nullish(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullish(), buyRateReference: z.string().nullish(), frequency: CommonModels.FrequencyEnumSchema.nullish(), transitDurationInDays: z.string().nullish(), quoteType: QuoteTypeEnumSchema.nullish(), defaultCurrencyId: z.string().nullish(), salesRep: QuoteEmployeeResponseDTOSchema.nullish(), team: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), convertedPositions: z.array(QuoteConvertedPositionDtoSchema).default([]), loadType: CommonModels.LoadTypeEnumSchema.nullish(), volumetricWeightModifier: z.number().nullish() }); -export type QuoteCoreResponseDTO = z.infer; - -/** - * UpdateQuoteRequestDTOSchema - * @type { object } - * @property { string } number The quote number - * @property { string } statusDate The date of the quote status - * @property { CargoTypeEnum } cargoType The type of cargo for the quote - * @property { CommonModels.LoadTypeEnum } loadType The load type for the quote - * @property { CommonModels.IncotermsEnum } incoterms The incoterms for the quote - * @property { CommonModels.IncotermsEnum } secondIncoterms The second incoterms for the quote - * @property { CommonModels.ServiceTypeEnum } serviceType The type of service for the quote - * @property { string } buyRateReference The reference for the buy rate - * @property { CommonModels.FrequencyEnum } frequency The frequency of the quote - * @property { string } transitDurationInDays The transit duration in days - * @property { QuoteTypeEnum } quoteType The type of quote - * @property { string } defaultCurrencyId The default currency for the quote - * @property { string } salesRepId The sales representative for the quote - * @property { string } responsibleEmployeeId The responsible employee for the quote - * @property { string } receivedByEmployeeId The employee who receieved the quote - * @property { string } team The team responsible for the quote - * @property { number } volumetricWeightModifier Volumetric weight modifier - */ -export const UpdateQuoteRequestDTOSchema = z.object({ number: z.string().nullable(), statusDate: z.iso.datetime({ offset: true }).nullable(), cargoType: CargoTypeEnumSchema.nullable(), loadType: CommonModels.LoadTypeEnumSchema.nullable(), incoterms: CommonModels.IncotermsEnumSchema.nullable(), secondIncoterms: CommonModels.IncotermsEnumSchema.nullable(), serviceType: CommonModels.ServiceTypeEnumSchema.nullable(), buyRateReference: z.string().nullable(), frequency: CommonModels.FrequencyEnumSchema.nullable(), transitDurationInDays: z.string().nullable(), quoteType: QuoteTypeEnumSchema.nullable(), defaultCurrencyId: z.string().nullable(), salesRepId: z.string().nullable(), responsibleEmployeeId: z.string().nullable(), receivedByEmployeeId: z.string().nullable(), team: z.string().nullable(), volumetricWeightModifier: z.number().nullable() }).partial(); -export type UpdateQuoteRequestDTO = z.infer; - -/** - * QuoteSectionEnumSchema - * @type { enum } - */ -export const QuoteSectionEnumSchema = z.enum(["Customer", "Overview", "Cargo", "Finances", "Documents"]); -export type QuoteSectionEnum = z.infer; -export const QuoteSectionEnum = QuoteSectionEnumSchema.enum; - -/** - * DuplicateQuoteRequestDtoSchema - * @type { object } - * @property { QuoteSectionEnum[] } sections The sections to duplicate. Min Items: `1` - */ -export const DuplicateQuoteRequestDtoSchema = z.object({ sections: z.array(QuoteSectionEnumSchema).min(1) }); -export type DuplicateQuoteRequestDto = z.infer; - -/** - * QuoteListResponseDtoSchema - * @type { object } - * @property { string[] } items Items - * @property { number } totalProfit - * @property { number } profitPerQuote - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - */ -export const QuoteListResponseDtoSchema = z.object({ items: z.array(z.string()), totalProfit: z.number(), profitPerQuote: z.number(), page: z.number().nullish(), cursor: z.string().nullish(), nextCursor: z.string().nullish(), limit: z.number(), totalItems: z.number() }); -export type QuoteListResponseDto = z.infer; - -/** - * QuotesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const QuotesPaginateOrderParamEnumSchema = z.enum(["number", "statusDate", "transportMode", "status", "direction", "loadType", "serviceType", "createdAt", "employee", "profit"]); -export type QuotesPaginateOrderParamEnum = z.infer; -export const QuotesPaginateOrderParamEnum = QuotesPaginateOrderParamEnumSchema.enum; - -/** - * QuotesPaginateResponseSchema - * @type { object } - * @property { number } totalProfit - * @property { number } profitPerQuote - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { QuotePreviewResponseDTO[] } items - */ -export const QuotesPaginateResponseSchema = z.object({ ...QuoteListResponseDtoSchema.shape, ...z.object({ items: z.array(QuotePreviewResponseDTOSchema).nullable() }).partial().shape }); -export type QuotesPaginateResponse = z.infer; - -/** - * QuotesListAvailablePartnersForResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.BusinessPartnerLabelResponseDTO[] } items - */ -export const QuotesListAvailablePartnersForResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.BusinessPartnerLabelResponseDTOSchema).nullable() }).partial().shape }); -export type QuotesListAvailablePartnersForResponse = z.infer; - -/** - * GetInvolvedPartiesResponseSchema - * @type { array } - */ -export const GetInvolvedPartiesResponseSchema = z.array(CommonModels.InvolvedPartyResponseDtoSchema); -export type GetInvolvedPartiesResponse = z.infer; - -} diff --git a/test/generated/next/quotes/quotes.queries.ts b/test/generated/next/quotes/quotes.queries.ts deleted file mode 100644 index 42b6e3c..0000000 --- a/test/generated/next/quotes/quotes.queries.ts +++ /dev/null @@ -1,376 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { QuotesAcl } from "./quotes.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { QuotesModels } from "./quotes.models"; -import { CommonModels } from "@/data/common/common.models"; -import { QuotesApi } from "./quotes.api"; - -export namespace QuotesQueries { -export const moduleName = QueryModule.Quotes; - -export const keys = { - all: [moduleName] as const, - paginate: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", officeId, limit, order, filter, page, cursor] as const, - paginateInfinite: (officeId: string, limit?: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/quotes", "infinite", officeId, limit, order, filter, cursor] as const, - listAvailablePartnersFor: (officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase) => [...keys.all, "/offices/:officeId/quotes/:quoteId/available-partners", officeId, quoteId, search, useCase] as const, - getById: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId", officeId, quoteId] as const, - getInvolvedParties: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/involved-parties", officeId, quoteId] as const, -}; - -/** - * Query `usePaginate` - * @summary Paginate Quotes - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` - * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(QuotesAcl.canUsePaginate({ officeId } )); - return QuotesApi.paginate(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Quotes - * @permission Requires `canUsePaginate` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): number, statusDate, transportMode, status, direction, loadType, serviceType, createdAt, employee, profit. Example: `number` - * @param { QuotesModels.QuoteFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: QuotesModels.QuoteFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(QuotesAcl.canUsePaginate({ officeId } )); - return QuotesApi.paginate(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create Quote - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { QuotesModels.CreateQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(QuotesAcl.canUseCreate({ officeId } )); - return QuotesApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useListAvailablePartnersFor` - * @summary List available business partners for a quote - * @permission Requires `canUseListAvailablePartnersFor` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { string } object.search Query parameter - * @param { CommonModels.PositionAvailablePartnersUseCase } object.useCase Query parameter. When provided and office toggle is enabled, restrict available partners to finance relationships (customer/vendor). - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useListAvailablePartnersFor = ({ officeId, quoteId, search, useCase }: { officeId: string, quoteId: string, search?: string, useCase?: CommonModels.PositionAvailablePartnersUseCase }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.listAvailablePartnersFor(officeId, quoteId, search, useCase), - queryFn: () => { - checkAcl(QuotesAcl.canUseListAvailablePartnersFor({ officeId } )); - return QuotesApi.listAvailablePartnersFor(officeId, quoteId, search, useCase) }, - ...options, - }); -}; - -/** - * Mutation `useExportQuotes` - recommended when file should not be cached - * @summary Export quotes to Excel - * @permission Requires `canUseExportQuotes` ability - * @param { string } mutation.officeId Path parameter - * @param { QuotesModels.QuoteExportRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const useExportQuotes = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(QuotesAcl.canUseExportQuotes({ officeId } )); - return QuotesApi.exportQuotes(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetById` - * @summary Get quote by id - * @permission Requires `canUseGetById` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(officeId, quoteId), - queryFn: () => { - checkAcl(QuotesAcl.canUseGetById({ officeId } )); - return QuotesApi.getById(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuotesModels.UpdateQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseUpdate({ officeId } )); - return QuotesApi.update(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCancel` - * @summary Cancel quote - * @permission Requires `canUseCancel` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useCancel = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId }) => { - checkAcl(QuotesAcl.canUseCancel({ officeId } )); - return QuotesApi.cancel(officeId, quoteId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDuplicate` - * @summary Duplicate quote - * @permission Requires `canUseDuplicate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { QuotesModels.DuplicateQuoteRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useDuplicate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseDuplicate({ officeId } )); - return QuotesApi.duplicate(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.getById(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetInvolvedParties` - * @summary Get involved parties for quote - * @permission Requires `canUseGetInvolvedParties` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetInvolvedParties = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getInvolvedParties(officeId, quoteId), - queryFn: () => { - checkAcl(QuotesAcl.canUseGetInvolvedParties({ officeId } )); - return QuotesApi.getInvolvedParties(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useCreateInvolvedParty` - * @summary Create involved party for quote - * @permission Requires `canUseCreateInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { CommonModels.CreateInvolvedPartyRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(QuotesAcl.canUseCreateInvolvedParty({ officeId } )); - return QuotesApi.createInvolvedParty(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUpdateInvolvedParty` - * @summary Update involved party for quote - * @permission Requires `canUseUpdateInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { CommonModels.UpdateInvolvedPartyDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, partyId, data }) => { - checkAcl(QuotesAcl.canUseUpdateInvolvedParty({ officeId } )); - return QuotesApi.updateInvolvedParty(officeId, quoteId, partyId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteInvolvedParty` - * @summary Delete involved party for quote - * @permission Requires `canUseDeleteInvolvedParty` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { string } mutation.partyId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useDeleteInvolvedParty = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, partyId }) => { - checkAcl(QuotesAcl.canUseDeleteInvolvedParty({ officeId } )); - return QuotesApi.deleteInvolvedParty(officeId, quoteId, partyId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/remarkTemplates/remarkTemplates.acl.ts b/test/generated/next/remarkTemplates/remarkTemplates.acl.ts deleted file mode 100644 index b194325..0000000 --- a/test/generated/next/remarkTemplates/remarkTemplates.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace RemarkTemplatesAcl { -/** - * Use for `usePaginateLabels` query ability. For global ability, omit the object parameter. - * @description List remark template labels for office - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List remark templates - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create a new remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Create", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get remark template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Read", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update remark template by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Update", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useArchive` mutation ability. For global ability, omit the object parameter. - * @description Archive remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( - object?: { officeId: string, } -) => [ - "Archive", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Archive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -/** - * Use for `useUnarchive` mutation ability. For global ability, omit the object parameter. - * @description Unarchive remark template - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( - object?: { officeId: string, } -) => [ - "Unarchive", - object ? subject("RemarkTemplate", object) : "RemarkTemplate" -] as AbilityTuple<"Unarchive", "RemarkTemplate" | ForcedSubject<"RemarkTemplate"> & { officeId: string, }>; - -} diff --git a/test/generated/next/remarkTemplates/remarkTemplates.api.ts b/test/generated/next/remarkTemplates/remarkTemplates.api.ts deleted file mode 100644 index f4ba6d9..0000000 --- a/test/generated/next/remarkTemplates/remarkTemplates.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; - -export namespace RemarkTemplatesApi { -export const paginateLabels = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsResponseSchema }, - `/offices/${officeId}/remark-templates/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplatesListResponseSchema }, - `/offices/${officeId}/remark-templates`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(RemarkTemplatesModels.RemarkTemplateFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (officeId: string, data: RemarkTemplatesModels.CreateRemarkTemplateRequestDTO, ) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates`, - ZodExtended.parse(RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}`, - - ) -}; -export const update = (id: string, officeId: string, data: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}`, - ZodExtended.parse(RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}/archive`, - - ) -}; -export const unarchive = (id: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema }, - `/offices/${officeId}/remark-templates/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/remarkTemplates/remarkTemplates.configs.ts b/test/generated/next/remarkTemplates/remarkTemplates.configs.ts deleted file mode 100644 index 616b1f4..0000000 --- a/test/generated/next/remarkTemplates/remarkTemplates.configs.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; -import { RemarkTemplatesQueries } from "./remarkTemplates.queries"; -import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; - -export namespace RemarkTemplatesConfigs { -export const remarkTemplatesConfig = { - meta: { - title: "Remark Templates", - }, - readAll: { - acl: RemarkTemplatesAcl.canUseList, - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - paginated: RemarkTemplatesQueries.useList, - infinite: RemarkTemplatesQueries.useListInfinite, - filters: { - schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: RemarkTemplatesModels.RemarkTemplateFilterDtoSchema, - options: { - inputs: { - archived: true, - search: true, - onlyUsedFor: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - options: { - columns: { - id: true, - officeId: true, - name: true, - content: true, - onlyUsedFor: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: RemarkTemplatesModels.RemarkTemplatesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: RemarkTemplatesAcl.canUseFindById, - schema: RemarkTemplatesModels.RemarkTemplateResponseDTOSchema, - query: RemarkTemplatesQueries.useFindById, - }, - create: { - acl: RemarkTemplatesAcl.canUseCreate, - schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, - mutation: RemarkTemplatesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: RemarkTemplatesModels.CreateRemarkTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - content: true, - onlyUsedFor: true, - }, - }, -}) - }, - update: { - acl: RemarkTemplatesAcl.canUseUpdate, - schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, - mutation: RemarkTemplatesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: RemarkTemplatesModels.UpdateRemarkTemplateRequestDTOSchema, - options: { - inputs: { - name: true, - content: true, - onlyUsedFor: true, - archived: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: RemarkTemplatesAcl.canUsePaginateLabels, - schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, - paginated: RemarkTemplatesQueries.usePaginateLabels, - infinite: RemarkTemplatesQueries.usePaginateLabelsInfinite, - filters: { - schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: RemarkTemplatesModels.RemarkTemplateLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: RemarkTemplatesModels.RemarkTemplateLabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - content: true, - }, - sortable: RemarkTemplatesModels.RemarkTemplatesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/remarkTemplates/remarkTemplates.models.ts b/test/generated/next/remarkTemplates/remarkTemplates.models.ts deleted file mode 100644 index 265dd7f..0000000 --- a/test/generated/next/remarkTemplates/remarkTemplates.models.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace RemarkTemplatesModels { -/** - * RemarkTemplateLabelResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } label - * @property { CommonModels.EditorContentResponseDto } content Remark template content - */ -export const RemarkTemplateLabelResponseDTOSchema = z.object({ id: z.string(), label: z.string(), content: CommonModels.EditorContentResponseDtoSchema }); -export type RemarkTemplateLabelResponseDTO = z.infer; - -/** - * RemarkTemplateEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const RemarkTemplateEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type RemarkTemplateEmployeeDTO = z.infer; - -/** - * OnlyUsedForEnumSchema - * @type { enum } - */ -export const OnlyUsedForEnumSchema = z.enum(["transport-order", "export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "invoice", "quote-document", "shipping-instructions", "position-office-notes", "invoice-body-remarks", "business-partner-office-notes"]); -export type OnlyUsedForEnum = z.infer; -export const OnlyUsedForEnum = OnlyUsedForEnumSchema.enum; - -/** - * RemarkTemplateResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } officeId - * @property { string } name Template name - * @property { CommonModels.EditorContentResponseDto } content Template content - * @property { string[] } onlyUsedFor Restrict template usage to specific document types - * @property { boolean } archived - * @property { string } createdById - * @property { RemarkTemplateEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { RemarkTemplateEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const RemarkTemplateResponseDTOSchema = z.object({ id: z.string(), officeId: z.string(), name: z.string(), content: CommonModels.EditorContentResponseDtoSchema, onlyUsedFor: z.array(OnlyUsedForEnumSchema).nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: RemarkTemplateEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: RemarkTemplateEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type RemarkTemplateResponseDTO = z.infer; - -/** - * CreateRemarkTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { CommonModels.EditorContentUpdateDto } content Template content - * @property { OnlyUsedForEnum[] } onlyUsedFor Restrict template usage to specific document types - */ -export const CreateRemarkTemplateRequestDTOSchema = z.object({ name: z.string(), content: CommonModels.EditorContentUpdateDtoSchema, onlyUsedFor: z.array(OnlyUsedForEnumSchema).nullish() }); -export type CreateRemarkTemplateRequestDTO = z.infer; - -/** - * UpdateRemarkTemplateRequestDTOSchema - * @type { object } - * @property { string } name Template name - * @property { CommonModels.EditorContentUpdateDto } content Template content - * @property { string[] } onlyUsedFor Restrict template usage to specific document types - * @property { boolean } archived Archive status - */ -export const UpdateRemarkTemplateRequestDTOSchema = z.object({ name: z.string().nullable(), content: CommonModels.EditorContentUpdateDtoSchema.nullable(), onlyUsedFor: z.array(OnlyUsedForEnumSchema).nullable(), archived: z.boolean().nullable() }).partial(); -export type UpdateRemarkTemplateRequestDTO = z.infer; - -/** - * RemarkTemplateFilterDtoSchema - * @type { object } - * @property { boolean } archived - * @property { string } search - * @property { string } onlyUsedFor Filter by document type - */ -export const RemarkTemplateFilterDtoSchema = z.object({ archived: z.boolean().nullable(), search: z.string().nullable(), onlyUsedFor: OnlyUsedForEnumSchema.nullable() }).partial(); -export type RemarkTemplateFilterDto = z.infer; - -/** - * RemarkTemplateLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const RemarkTemplateLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type RemarkTemplateLabelFilterDto = z.infer; - -/** - * RemarkTemplatesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const RemarkTemplatesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type RemarkTemplatesPaginateLabelsOrderParamEnum = z.infer; -export const RemarkTemplatesPaginateLabelsOrderParamEnum = RemarkTemplatesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * RemarkTemplatesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { RemarkTemplateLabelResponseDTO[] } items - */ -export const RemarkTemplatesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateLabelResponseDTOSchema).nullable() }).partial().shape }); -export type RemarkTemplatesPaginateLabelsResponse = z.infer; - -/** - * RemarkTemplatesListOrderParamEnumSchema - * @type { enum } - */ -export const RemarkTemplatesListOrderParamEnumSchema = z.enum(["name", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type RemarkTemplatesListOrderParamEnum = z.infer; -export const RemarkTemplatesListOrderParamEnum = RemarkTemplatesListOrderParamEnumSchema.enum; - -/** - * RemarkTemplatesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { RemarkTemplateResponseDTO[] } items - */ -export const RemarkTemplatesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(RemarkTemplateResponseDTOSchema).nullable() }).partial().shape }); -export type RemarkTemplatesListResponse = z.infer; - -} diff --git a/test/generated/next/remarkTemplates/remarkTemplates.queries.ts b/test/generated/next/remarkTemplates/remarkTemplates.queries.ts deleted file mode 100644 index aa1b35b..0000000 --- a/test/generated/next/remarkTemplates/remarkTemplates.queries.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { RemarkTemplatesAcl } from "./remarkTemplates.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { RemarkTemplatesModels } from "./remarkTemplates.models"; -import { RemarkTemplatesApi } from "./remarkTemplates.api"; - -export namespace RemarkTemplatesQueries { -export const moduleName = QueryModule.RemarkTemplates; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", officeId, limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates/paginate/labels", "infinite", officeId, limit, order, filter, cursor] as const, - list: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", officeId, limit, order, filter, page, cursor] as const, - listInfinite: (officeId: string, limit?: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/remark-templates", "infinite", officeId, limit, order, filter, cursor] as const, - findById: (id: string, officeId: string) => [...keys.all, "/offices/:officeId/remark-templates/:id", id, officeId] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate remark template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate remark template labels for office - * @permission Requires `canUsePaginateLabels` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(RemarkTemplatesAcl.canUsePaginateLabels({ officeId } )); - return RemarkTemplatesApi.paginateLabels(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List remark templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ officeId, limit, order, filter, page, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); - return RemarkTemplatesApi.list(officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List remark templates - * @permission Requires `canUseList` ability - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { RemarkTemplatesModels.RemarkTemplateFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ officeId, limit, order, filter, cursor }: { officeId: string, limit: number, order?: string, filter?: RemarkTemplatesModels.RemarkTemplateFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(RemarkTemplatesAcl.canUseList({ officeId } )); - return RemarkTemplatesApi.list(officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new remark template - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { RemarkTemplatesModels.CreateRemarkTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, data }) => { - checkAcl(RemarkTemplatesAcl.canUseCreate({ officeId } )); - return RemarkTemplatesApi.create(officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get remark template by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ id, officeId }: { id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id, officeId), - queryFn: () => { - checkAcl(RemarkTemplatesAcl.canUseFindById({ officeId } )); - return RemarkTemplatesApi.findById(id, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update remark template by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { RemarkTemplatesModels.UpdateRemarkTemplateRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId, data }) => { - checkAcl(RemarkTemplatesAcl.canUseUpdate({ officeId } )); - return RemarkTemplatesApi.update(id, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive remark template - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(RemarkTemplatesAcl.canUseArchive({ officeId } )); - return RemarkTemplatesApi.archive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive remark template - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, officeId }) => { - checkAcl(RemarkTemplatesAcl.canUseUnarchive({ officeId } )); - return RemarkTemplatesApi.unarchive(id, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id, officeId } = variables; - const updateKeys = [keys.findById(id, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/roadQuotes/roadQuotes.acl.ts b/test/generated/next/roadQuotes/roadQuotes.acl.ts deleted file mode 100644 index edf7693..0000000 --- a/test/generated/next/roadQuotes/roadQuotes.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace RoadQuotesAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get road quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update road quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/next/roadQuotes/roadQuotes.api.ts b/test/generated/next/roadQuotes/roadQuotes.api.ts deleted file mode 100644 index 38a1126..0000000 --- a/test/generated/next/roadQuotes/roadQuotes.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { RoadQuotesModels } from "./roadQuotes.models"; - -export namespace RoadQuotesApi { -export const get = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/road-quote`, - - ) -}; -export const update = (officeId: string, quoteId: string, data: RoadQuotesModels.UpdateRoadQuoteRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: RoadQuotesModels.RoadQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/road-quote`, - ZodExtended.parse(RoadQuotesModels.UpdateRoadQuoteRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/roadQuotes/roadQuotes.models.ts b/test/generated/next/roadQuotes/roadQuotes.models.ts deleted file mode 100644 index 9008738..0000000 --- a/test/generated/next/roadQuotes/roadQuotes.models.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { z } from "zod"; - -export namespace RoadQuotesModels { -/** - * RoadQuoteResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the road quote - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - */ -export const RoadQuoteResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string(), sellServiceContract: z.string() }); -export type RoadQuoteResponseDTO = z.infer; - -/** - * UpdateRoadQuoteRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - */ -export const UpdateRoadQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), sellServiceContract: z.string().nullable() }).partial(); -export type UpdateRoadQuoteRequestDTO = z.infer; - -} diff --git a/test/generated/next/roadQuotes/roadQuotes.queries.ts b/test/generated/next/roadQuotes/roadQuotes.queries.ts deleted file mode 100644 index b7d125e..0000000 --- a/test/generated/next/roadQuotes/roadQuotes.queries.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { RoadQuotesAcl } from "./roadQuotes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { RoadQuotesModels } from "./roadQuotes.models"; -import { RoadQuotesApi } from "./roadQuotes.api"; - -export namespace RoadQuotesQueries { -export const moduleName = QueryModule.RoadQuotes; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/road-quote", officeId, quoteId] as const, -}; - -/** - * Query `useGet` - * @summary Get road quote by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(RoadQuotesAcl.canUseGet({ officeId } )); - return RoadQuotesApi.get(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update road quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { RoadQuotesModels.UpdateRoadQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(RoadQuotesAcl.canUseUpdate({ officeId } )); - return RoadQuotesApi.update(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.get(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/seaPositions/seaPositions.acl.ts b/test/generated/next/seaPositions/seaPositions.acl.ts deleted file mode 100644 index 1040161..0000000 --- a/test/generated/next/seaPositions/seaPositions.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace SeaPositionsAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get sea position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Read", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update sea position by position id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Position", object) : "Position" -] as AbilityTuple<"Update", "Position" | ForcedSubject<"Position"> & { officeId: string, }>; - -} diff --git a/test/generated/next/seaPositions/seaPositions.api.ts b/test/generated/next/seaPositions/seaPositions.api.ts deleted file mode 100644 index 022e8b7..0000000 --- a/test/generated/next/seaPositions/seaPositions.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { SeaPositionsModels } from "./seaPositions.models"; - -export namespace SeaPositionsApi { -export const get = (officeId: string, positionId: string, ) => { - return AppRestClient.get( - { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/sea-position`, - - ) -}; -export const update = (officeId: string, positionId: string, data: SeaPositionsModels.UpdateSeaPositionRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: SeaPositionsModels.SeaPositionResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/sea-position`, - ZodExtended.parse(SeaPositionsModels.UpdateSeaPositionRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/seaPositions/seaPositions.models.ts b/test/generated/next/seaPositions/seaPositions.models.ts deleted file mode 100644 index 90db05a..0000000 --- a/test/generated/next/seaPositions/seaPositions.models.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace SeaPositionsModels { -/** - * SeaPositionResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } bookingMatchingCode - * @property { string } houseBillOfLadingNumber - * @property { string } masterBillOfLadingNumber - * @property { boolean } hblRequired - * @property { boolean } mblRequired - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { string } buyServiceContract - * @property { string } sellServiceContract - * @property { string } quoteReference - * @property { string } createdAt - * @property { string } updatedAt - * @property { CommonModels.SeaRoutingEnum } routing - * @property { string } defaultBookingNumber Default booking number from the port of loading point of the default route - */ -export const SeaPositionResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string().nullish(), houseBillOfLadingNumber: z.string().nullish(), masterBillOfLadingNumber: z.string().nullish(), hblRequired: z.boolean(), mblRequired: z.boolean(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullish(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullish(), customsDate: z.iso.datetime({ offset: true }).nullish(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullish(), buyServiceContract: z.string().nullish(), sellServiceContract: z.string().nullish(), quoteReference: z.string().nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), routing: CommonModels.SeaRoutingEnumSchema.nullish(), defaultBookingNumber: z.string().nullish() }); -export type SeaPositionResponseDTO = z.infer; - -/** - * UpdateSeaPositionRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode - * @property { string } houseBillOfLadingNumber - * @property { boolean } mblRequired - * @property { boolean } hblRequired - * @property { string } masterBillOfLadingNumber - * @property { string } blfromCostumerDate - * @property { string } blfromCarrierDate - * @property { string } customsDate - * @property { string } vgmCustomerDate - * @property { string } buyServiceContract - * @property { string } quoteReference - * @property { string } sellServiceContract - * @property { CommonModels.SeaRoutingEnum } routing - */ -export const UpdateSeaPositionRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), houseBillOfLadingNumber: z.string().nullable(), mblRequired: z.boolean().nullable(), hblRequired: z.boolean().nullable(), masterBillOfLadingNumber: z.string().nullable(), blfromCostumerDate: z.iso.datetime({ offset: true }).nullable(), blfromCarrierDate: z.iso.datetime({ offset: true }).nullable(), customsDate: z.iso.datetime({ offset: true }).nullable(), vgmCustomerDate: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), quoteReference: z.string().nullable(), sellServiceContract: z.string().nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable() }).partial(); -export type UpdateSeaPositionRequestDTO = z.infer; - -} diff --git a/test/generated/next/seaPositions/seaPositions.queries.ts b/test/generated/next/seaPositions/seaPositions.queries.ts deleted file mode 100644 index 3652d69..0000000 --- a/test/generated/next/seaPositions/seaPositions.queries.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { SeaPositionsAcl } from "./seaPositions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { SeaPositionsModels } from "./seaPositions.models"; -import { SeaPositionsApi } from "./seaPositions.api"; - -export namespace SeaPositionsQueries { -export const moduleName = QueryModule.SeaPositions; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/sea-position", officeId, positionId] as const, -}; - -/** - * Query `useGet` - * @summary Get sea position by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, positionId }: { officeId: string, positionId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId), - queryFn: () => { - checkAcl(SeaPositionsAcl.canUseGet({ officeId } )); - return SeaPositionsApi.get(officeId, positionId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update sea position - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { SeaPositionsModels.UpdateSeaPositionRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, data }) => { - checkAcl(SeaPositionsAcl.canUseUpdate({ officeId } )); - return SeaPositionsApi.update(officeId, positionId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId } = variables; - const updateKeys = [keys.get(officeId, positionId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/seaQuotes/seaQuotes.acl.ts b/test/generated/next/seaQuotes/seaQuotes.acl.ts deleted file mode 100644 index ca36ff7..0000000 --- a/test/generated/next/seaQuotes/seaQuotes.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace SeaQuotesAcl { -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Get sea quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Read", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update sea quote by quote id - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("Quote", object) : "Quote" -] as AbilityTuple<"Update", "Quote" | ForcedSubject<"Quote"> & { officeId: string, }>; - -} diff --git a/test/generated/next/seaQuotes/seaQuotes.api.ts b/test/generated/next/seaQuotes/seaQuotes.api.ts deleted file mode 100644 index 6b3d574..0000000 --- a/test/generated/next/seaQuotes/seaQuotes.api.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { ZodExtended } from "@/data/zod.extended"; -import { SeaQuotesModels } from "./seaQuotes.models"; - -export namespace SeaQuotesApi { -export const get = (officeId: string, quoteId: string, ) => { - return AppRestClient.get( - { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - - ) -}; -export const update = (officeId: string, quoteId: string, data: SeaQuotesModels.UpdateSeaQuoteRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: SeaQuotesModels.SeaQuoteResponseDTOSchema }, - `/offices/${officeId}/quotes/${quoteId}/sea-quote`, - ZodExtended.parse(SeaQuotesModels.UpdateSeaQuoteRequestDTOSchema, data), - - ) -}; -} diff --git a/test/generated/next/seaQuotes/seaQuotes.models.ts b/test/generated/next/seaQuotes/seaQuotes.models.ts deleted file mode 100644 index 2617ee7..0000000 --- a/test/generated/next/seaQuotes/seaQuotes.models.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace SeaQuotesModels { -/** - * SeaQuoteResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier for the sea quote - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - * @property { CommonModels.SeaRoutingEnum } routing - * @property { boolean } splitRoute Indicates if the route is split - */ -export const SeaQuoteResponseDTOSchema = z.object({ id: z.string(), bookingMatchingCode: z.string(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string(), sellServiceContract: z.string(), routing: CommonModels.SeaRoutingEnumSchema.nullish(), splitRoute: z.boolean().nullish() }); -export type SeaQuoteResponseDTO = z.infer; - -/** - * UpdateSeaQuoteRequestDTOSchema - * @type { object } - * @property { string } bookingMatchingCode Code for matching bookings - * @property { string } validFrom Start date of quote validity - * @property { string } validUntil End date of quote validity - * @property { string } buyServiceContract Service contract for buying - * @property { string } sellServiceContract Service contract for selling - * @property { CommonModels.SeaRoutingEnum } routing - */ -export const UpdateSeaQuoteRequestDTOSchema = z.object({ bookingMatchingCode: z.string().nullable(), validFrom: z.iso.datetime({ offset: true }).nullable(), validUntil: z.iso.datetime({ offset: true }).nullable(), buyServiceContract: z.string().nullable(), sellServiceContract: z.string().nullable(), routing: CommonModels.SeaRoutingEnumSchema.nullable() }).partial(); -export type UpdateSeaQuoteRequestDTO = z.infer; - -} diff --git a/test/generated/next/seaQuotes/seaQuotes.queries.ts b/test/generated/next/seaQuotes/seaQuotes.queries.ts deleted file mode 100644 index 0efd079..0000000 --- a/test/generated/next/seaQuotes/seaQuotes.queries.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { SeaQuotesAcl } from "./seaQuotes.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { SeaQuotesModels } from "./seaQuotes.models"; -import { SeaQuotesApi } from "./seaQuotes.api"; - -export namespace SeaQuotesQueries { -export const moduleName = QueryModule.SeaQuotes; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, quoteId: string) => [...keys.all, "/offices/:officeId/quotes/:quoteId/sea-quote", officeId, quoteId] as const, -}; - -/** - * Query `useGet` - * @summary Get sea quote by ID - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.quoteId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, quoteId }: { officeId: string, quoteId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, quoteId), - queryFn: () => { - checkAcl(SeaQuotesAcl.canUseGet({ officeId } )); - return SeaQuotesApi.get(officeId, quoteId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update sea quote - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.quoteId Path parameter - * @param { SeaQuotesModels.UpdateSeaQuoteRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, quoteId, data }) => { - checkAcl(SeaQuotesAcl.canUseUpdate({ officeId } )); - return SeaQuotesApi.update(officeId, quoteId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, quoteId } = variables; - const updateKeys = [keys.get(officeId, quoteId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/shippingInstructions/shippingInstructions.acl.ts b/test/generated/next/shippingInstructions/shippingInstructions.acl.ts deleted file mode 100644 index 2eae90a..0000000 --- a/test/generated/next/shippingInstructions/shippingInstructions.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace ShippingInstructionsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGet` query ability. For global ability, omit the object parameter. - * @description Read shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGet` query - */ -export const canUseGet = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdate` mutation ability. For global ability, omit the object parameter. - * @description Update shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useDeleteOfficesPositionsShippingInstructionsById` mutation ability. For global ability, omit the object parameter. - * @description Delete shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteOfficesPositionsShippingInstructionsById` mutation - */ -export const canUseDeleteOfficesPositionsShippingInstructionsById = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `usePreview` query or `usePreviewMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreview` query or `usePreviewMutation` mutation - */ -export const canUsePreview = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerate` mutation ability. For global ability, omit the object parameter. - * @description Generate shipping instructions - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerate` mutation - */ -export const canUseGenerate = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/next/shippingInstructions/shippingInstructions.api.ts b/test/generated/next/shippingInstructions/shippingInstructions.api.ts deleted file mode 100644 index e435f26..0000000 --- a/test/generated/next/shippingInstructions/shippingInstructions.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { ShippingInstructionsModels } from "./shippingInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ShippingInstructionsApi { -export const create = (officeId: string, positionId: string, ) => { - return AppRestClient.post( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions`, - - ) -}; -export const get = (officeId: string, positionId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - - ) -}; -export const update = (officeId: string, positionId: string, id: string, data: ShippingInstructionsModels.UpdateShippingInstructionsRequestDto, ) => { - return AppRestClient.patch( - { resSchema: ShippingInstructionsModels.ShippingInstructionsResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - ZodExtended.parse(ShippingInstructionsModels.UpdateShippingInstructionsRequestDtoSchema, data), - - ) -}; -export const deleteOfficesPositionsShippingInstructionsById = (officeId: string, positionId: string, id: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}`, - - ) -}; -export const preview = (officeId: string, positionId: string, id: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generate = (officeId: string, positionId: string, id: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/shipping-instructions/${id}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/shippingInstructions/shippingInstructions.models.ts b/test/generated/next/shippingInstructions/shippingInstructions.models.ts deleted file mode 100644 index b15692a..0000000 --- a/test/generated/next/shippingInstructions/shippingInstructions.models.ts +++ /dev/null @@ -1,510 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace ShippingInstructionsModels { -/** - * EnsDeclarationEnumSchema - * @type { enum } - * @description ENS declaration - */ -export const EnsDeclarationEnumSchema = z.enum(["Carrier", "Self"]); -export type EnsDeclarationEnum = z.infer; -export const EnsDeclarationEnum = EnsDeclarationEnumSchema.enum; - -/** - * IssuedHouseBillsEnumSchema - * @type { enum } - * @description Issued house bills - */ -export const IssuedHouseBillsEnumSchema = z.enum(["None", "One", "Multiple"]); -export type IssuedHouseBillsEnum = z.infer; -export const IssuedHouseBillsEnum = IssuedHouseBillsEnumSchema.enum; - -/** - * WoodDeclarationEnumSchema - * @type { enum } - * @description Wood declaration - */ -export const WoodDeclarationEnumSchema = z.enum(["NoWood", "TreatedAndCertified", "NotTreatedAndNotCertified", "Processed"]); -export type WoodDeclarationEnum = z.infer; -export const WoodDeclarationEnum = WoodDeclarationEnumSchema.enum; - -/** - * ShippingInstructionsPartnerResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } addressLine1 - * @property { string } addressLine2 - * @property { string } city - * @property { string } postalCode - * @property { string } state - * @property { string } countryCode - * @property { string } contactName - * @property { string } contactPhone - * @property { string } contactEmail - */ -export const ShippingInstructionsPartnerResponseDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), addressLine1: z.string().nullable(), addressLine2: z.string().nullable(), city: z.string().nullable(), postalCode: z.string().nullable(), state: z.string().nullable(), countryCode: z.string().nullable(), contactName: z.string().nullable(), contactPhone: z.string().nullable(), contactEmail: z.string().nullable() }).partial(); -export type ShippingInstructionsPartnerResponseDto = z.infer; - -/** - * ShippingInstructionsGeneralDetailsDtoSchema - * @type { object } - * @property { ShippingInstructionsPartnerResponseDto } shipper - * @property { ShippingInstructionsPartnerResponseDto } consignee - * @property { ShippingInstructionsPartnerResponseDto } freightForwarder - * @property { ShippingInstructionsPartnerResponseDto } notifyParty - * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty1 - * @property { ShippingInstructionsPartnerResponseDto } additionalNotifyParty2 - * @property { ShippingInstructionsPartnerResponseDto } contractParty - * @property { ShippingInstructionsPartnerResponseDto } manufacturer - * @property { ShippingInstructionsPartnerResponseDto } consolidator - * @property { ShippingInstructionsPartnerResponseDto } importer - * @property { ShippingInstructionsPartnerResponseDto } warehouseKeeper - */ -export const ShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: ShippingInstructionsPartnerResponseDtoSchema.nullable(), consignee: ShippingInstructionsPartnerResponseDtoSchema.nullable(), freightForwarder: ShippingInstructionsPartnerResponseDtoSchema.nullable(), notifyParty: ShippingInstructionsPartnerResponseDtoSchema.nullable(), additionalNotifyParty1: ShippingInstructionsPartnerResponseDtoSchema.nullable(), additionalNotifyParty2: ShippingInstructionsPartnerResponseDtoSchema.nullable(), contractParty: ShippingInstructionsPartnerResponseDtoSchema.nullable(), manufacturer: ShippingInstructionsPartnerResponseDtoSchema.nullable(), consolidator: ShippingInstructionsPartnerResponseDtoSchema.nullable(), importer: ShippingInstructionsPartnerResponseDtoSchema.nullable(), warehouseKeeper: ShippingInstructionsPartnerResponseDtoSchema.nullable() }).partial(); -export type ShippingInstructionsGeneralDetailsDto = z.infer; - -/** - * ShippingInstructionsLocationResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } code - * @property { string } countryCode - * @property { string } eta - * @property { string } vessel - * @property { string } voyage - */ -export const ShippingInstructionsLocationResponseDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), code: z.string().nullable(), countryCode: z.string().nullable(), eta: z.iso.datetime({ offset: true }).nullable(), vessel: z.string().nullable(), voyage: z.string().nullable() }).partial(); -export type ShippingInstructionsLocationResponseDto = z.infer; - -/** - * SIMoveTypeEnumSchema - * @type { enum } - */ -export const SIMoveTypeEnumSchema = z.enum(["DoorToDoor", "DoorToPort", "PortToDoor", "PortToPort"]); -export type SIMoveTypeEnum = z.infer; -export const SIMoveTypeEnum = SIMoveTypeEnumSchema.enum; - -/** - * ShippingInstructionsTransportDtoSchema - * @type { object } - * @property { string } vessel - * @property { string } voyage - * @property { string } imo - * @property { ShippingInstructionsLocationResponseDto } placeOfReceipt - * @property { ShippingInstructionsLocationResponseDto } portOfLoading - * @property { ShippingInstructionsLocationResponseDto } portOfDischarge - * @property { ShippingInstructionsLocationResponseDto } placeOfDelivery - * @property { SIMoveTypeEnum } moveType - * @property { string } shipmentType - */ -export const ShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string().nullable(), voyage: z.string().nullable(), imo: z.string().nullable(), placeOfReceipt: ShippingInstructionsLocationResponseDtoSchema.nullable(), portOfLoading: ShippingInstructionsLocationResponseDtoSchema.nullable(), portOfDischarge: ShippingInstructionsLocationResponseDtoSchema.nullable(), placeOfDelivery: ShippingInstructionsLocationResponseDtoSchema.nullable(), moveType: SIMoveTypeEnumSchema.nullable(), shipmentType: z.string().nullable() }).partial(); -export type ShippingInstructionsTransportDto = z.infer; - -/** - * ShippingInstructionsHazardousDtoSchema - * @type { object } - * @property { string } IMOClass - * @property { string } UNDGNumber - * @property { string } contact - */ -export const ShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string().nullable(), UNDGNumber: z.string().nullable(), contact: z.string().nullable() }).partial(); -export type ShippingInstructionsHazardousDto = z.infer; - -/** - * ShippingInstructionsPackageResponseDtoSchema - * @type { object } - * @property { string } id - * @property { number } quantity - * @property { string } packageType - * @property { string } packageTypeDescription - * @property { string } packageDescription - * @property { string } hsCode - * @property { number } volume - * @property { number } grossWeight - * @property { string } caseMarks - * @property { ShippingInstructionsHazardousDto } hazardous - * @property { string } ncmCodes - * @property { string } cusCode - */ -export const ShippingInstructionsPackageResponseDtoSchema = z.object({ id: z.string().nullable(), quantity: z.number().nullable(), packageType: z.string().nullable(), packageTypeDescription: z.string().nullable(), packageDescription: z.string().nullable(), hsCode: z.string().nullable(), volume: z.number().nullable(), grossWeight: z.number().nullable(), caseMarks: z.string().nullable(), hazardous: ShippingInstructionsHazardousDtoSchema.nullable(), ncmCodes: z.string().nullable(), cusCode: z.string().nullable() }).partial(); -export type ShippingInstructionsPackageResponseDto = z.infer; - -/** - * ShippingInstructionsCargoResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } transportUnitNumber - * @property { string } transportUnitType - * @property { string } transportUnitDescription - * @property { string } containerSupplier - * @property { number } grossWeight - * @property { number } tare - * @property { number } volume - * @property { string } seal1 - * @property { string } seal2 - * @property { string } woodDeclaration - * @property { ShippingInstructionsPackageResponseDto[] } packages - */ -export const ShippingInstructionsCargoResponseDtoSchema = z.object({ id: z.string().nullish(), transportUnitNumber: z.string().nullish(), transportUnitType: z.string().nullish(), transportUnitDescription: z.string().nullish(), containerSupplier: z.string().nullish(), grossWeight: z.number().nullish(), tare: z.number().nullish(), volume: z.number().nullish(), seal1: z.string().nullish(), seal2: z.string().nullish(), woodDeclaration: WoodDeclarationEnumSchema.nullish(), packages: z.array(ShippingInstructionsPackageResponseDtoSchema) }); -export type ShippingInstructionsCargoResponseDto = z.infer; - -/** - * ShippingInstructionsHeaderDtoSchema - * @type { object } - * @property { string } name - * @property { string } nameSuffix - * @property { number } versionNumber - * @property { string } shippingInstructionNumber - * @property { string } carrierScac - * @property { string } carrierBookingNumber - */ -export const ShippingInstructionsHeaderDtoSchema = z.object({ name: z.string(), nameSuffix: z.string().nullish(), versionNumber: z.number(), shippingInstructionNumber: z.string().nullish(), carrierScac: z.string().nullish(), carrierBookingNumber: z.string().nullish() }); -export type ShippingInstructionsHeaderDto = z.infer; - -/** - * ShippingInstructionsReferencesDtoSchema - * @type { object } - * @property { string } shipperReference - * @property { string } forwarderReference - * @property { string } transactionReferenceNumber - * @property { string } blReferenceNumber - * @property { string } uniqueConsignmentReference - * @property { string } purchaseOrderNumber - * @property { string } contractReferenceNumber - * @property { string } rucNumber - * @property { string } consigneeOrderNumber - * @property { string } invoiceReferenceNumber - * @property { string } letterOfCreditReference - * @property { string } customsHouseBrokerReference - * @property { string } fmcNumber - * @property { string } exportLicenseNumber - */ -export const ShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string().nullable(), forwarderReference: z.string().nullable(), transactionReferenceNumber: z.string().nullable(), blReferenceNumber: z.string().nullable(), uniqueConsignmentReference: z.string().nullable(), purchaseOrderNumber: z.string().nullable(), contractReferenceNumber: z.string().nullable(), rucNumber: z.string().nullable(), consigneeOrderNumber: z.string().nullable(), invoiceReferenceNumber: z.string().nullable(), letterOfCreditReference: z.string().nullable(), customsHouseBrokerReference: z.string().nullable(), fmcNumber: z.string().nullable(), exportLicenseNumber: z.string().nullable() }).partial(); -export type ShippingInstructionsReferencesDto = z.infer; - -/** - * ShippingInstructionsCustomsComplianceDtoSchema - * @type { object } - * @property { string } shipperTaxId - * @property { string } shipperEORI - * @property { string } consigneeTaxId - * @property { string } consigneeEORI - * @property { string } notifyPartyTaxId - * @property { string } notifyPartyEORI - */ -export const ShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string().nullable(), shipperEORI: z.string().nullable(), consigneeTaxId: z.string().nullable(), consigneeEORI: z.string().nullable(), notifyPartyTaxId: z.string().nullable(), notifyPartyEORI: z.string().nullable() }).partial(); -export type ShippingInstructionsCustomsComplianceDto = z.infer; - -/** - * ShippingInstructionsIcs2DtoSchema - * @type { object } - * @property { boolean } goodsDeliveredInEu - * @property { string } ensDeclaration - * @property { string } issuedHouseBills - */ -export const ShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean().nullable(), ensDeclaration: EnsDeclarationEnumSchema.nullable(), issuedHouseBills: IssuedHouseBillsEnumSchema.nullable() }).partial(); -export type ShippingInstructionsIcs2Dto = z.infer; - -/** - * ShippingInstructionsCargoIdentificationNumbersDtoSchema - * @type { object } - * @property { string } PCINNumber - * @property { string } CSNNumber - * @property { string } MCINNumber - */ -export const ShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string().nullable(), CSNNumber: z.string().nullable(), MCINNumber: z.string().nullable() }).partial(); -export type ShippingInstructionsCargoIdentificationNumbersDto = z.infer; - -/** - * ShippingInstructionsControlTotalsDtoSchema - * @type { object } - * @property { number } totalNumberOfContainers - * @property { number } totalNumberOfPackages - * @property { number } totalShipmentWeight - * @property { number } totalShipmentVolume - */ -export const ShippingInstructionsControlTotalsDtoSchema = z.object({ totalNumberOfContainers: z.number().nullable(), totalNumberOfPackages: z.number().nullable(), totalShipmentWeight: z.number().nullable(), totalShipmentVolume: z.number().nullable() }).partial(); -export type ShippingInstructionsControlTotalsDto = z.infer; - -/** - * FreightChargesDtoSchema - * @type { object } - * @property { string } freightPayer - * @property { string } freightTerm - */ -export const FreightChargesDtoSchema = z.object({ freightPayer: z.string().nullable(), freightTerm: CommonModels.ChargePaymentEnumSchema.nullable() }).partial(); -export type FreightChargesDto = z.infer; - -/** - * ShippingInstructionsShippersDeclaredValueDtoSchema - * @type { object } - * @property { string } currency - * @property { number } shipperDeclaredValue - */ -export const ShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string().nullable(), shipperDeclaredValue: z.number().nullable() }).partial(); -export type ShippingInstructionsShippersDeclaredValueDto = z.infer; - -/** - * ShippingInstructionsNotificationEmailsDtoSchema - * @type { object } - * @property { string } siRequestorEmails - */ -export const ShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string().nullable() }).partial(); -export type ShippingInstructionsNotificationEmailsDto = z.infer; - -/** - * ShippingInstructionsResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } name - * @property { string } nameSuffix - * @property { string } date - * @property { string } createdAt - * @property { string } updatedAt - * @property { number } versionNumber - * @property { ShippingInstructionsHeaderDto } header - * @property { ShippingInstructionsGeneralDetailsDto } generalDetails - * @property { ShippingInstructionsReferencesDto } references - * @property { ShippingInstructionsTransportDto } transport - * @property { ShippingInstructionsCustomsComplianceDto } customsCompliance - * @property { ShippingInstructionsIcs2Dto } ics2 - * @property { ShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers - * @property { ShippingInstructionsCargoResponseDto[] } cargo - * @property { ShippingInstructionsControlTotalsDto } controlTotals - * @property { FreightChargesDto } freightCharges - * @property { ShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue - * @property { ShippingInstructionsNotificationEmailsDto } notificationEmails - * @property { string } defaultFileName - */ -export const ShippingInstructionsResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), date: z.iso.datetime({ offset: true }).nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), versionNumber: z.number(), header: ShippingInstructionsHeaderDtoSchema, generalDetails: ShippingInstructionsGeneralDetailsDtoSchema, references: ShippingInstructionsReferencesDtoSchema, transport: ShippingInstructionsTransportDtoSchema, customsCompliance: ShippingInstructionsCustomsComplianceDtoSchema, ics2: ShippingInstructionsIcs2DtoSchema, cargoIdentificationNumbers: ShippingInstructionsCargoIdentificationNumbersDtoSchema, cargo: z.array(ShippingInstructionsCargoResponseDtoSchema).nullish(), controlTotals: ShippingInstructionsControlTotalsDtoSchema, freightCharges: FreightChargesDtoSchema, shippersDeclaredValue: ShippingInstructionsShippersDeclaredValueDtoSchema, notificationEmails: ShippingInstructionsNotificationEmailsDtoSchema, defaultFileName: z.string() }); -export type ShippingInstructionsResponseDto = z.infer; - -/** - * UpdateShippingInstructionsPartnerDtoSchema - * @type { object } - * @property { string } id Partner id - * @property { string } name Partner name - * @property { string } addressLine1 Address line 1 - * @property { string } addressLine2 Address line 2 - * @property { string } city City - * @property { string } postalCode Postal code - * @property { string } state State - * @property { string } countryCode Country code - * @property { string } taxId Tax ID - * @property { string } contactName Contact name - * @property { string } contactPhone Contact phone - * @property { string } contactEmail Contact email - */ -export const UpdateShippingInstructionsPartnerDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), addressLine1: z.string().nullable(), addressLine2: z.string().nullable(), city: z.string().nullable(), postalCode: z.string().nullable(), state: z.string().nullable(), countryCode: z.string().nullable(), taxId: z.string().nullable(), contactName: z.string().nullable(), contactPhone: z.string().nullable(), contactEmail: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsPartnerDto = z.infer; - -/** - * UpdateShippingInstructionsGeneralDetailsDtoSchema - * @type { object } - * @property { UpdateShippingInstructionsPartnerDto } shipper Shipper - * @property { UpdateShippingInstructionsPartnerDto } consignee Consignee - * @property { UpdateShippingInstructionsPartnerDto } freightForwarder Freight forwarder - * @property { UpdateShippingInstructionsPartnerDto } notifyParty Notify party - * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty1 Additional notify party 1 - * @property { UpdateShippingInstructionsPartnerDto } additionalNotifyParty2 Additional notify party 2 - * @property { UpdateShippingInstructionsPartnerDto } contractParty Contract party - * @property { UpdateShippingInstructionsPartnerDto } manufacturer Manufacturer - * @property { UpdateShippingInstructionsPartnerDto } consolidator Consolidator - * @property { UpdateShippingInstructionsPartnerDto } importer Importer - * @property { UpdateShippingInstructionsPartnerDto } warehouseKeeper Warehouse keeper - */ -export const UpdateShippingInstructionsGeneralDetailsDtoSchema = z.object({ shipper: UpdateShippingInstructionsPartnerDtoSchema.nullable(), consignee: UpdateShippingInstructionsPartnerDtoSchema.nullable(), freightForwarder: UpdateShippingInstructionsPartnerDtoSchema.nullable(), notifyParty: UpdateShippingInstructionsPartnerDtoSchema.nullable(), additionalNotifyParty1: UpdateShippingInstructionsPartnerDtoSchema.nullable(), additionalNotifyParty2: UpdateShippingInstructionsPartnerDtoSchema.nullable(), contractParty: UpdateShippingInstructionsPartnerDtoSchema.nullable(), manufacturer: UpdateShippingInstructionsPartnerDtoSchema.nullable(), consolidator: UpdateShippingInstructionsPartnerDtoSchema.nullable(), importer: UpdateShippingInstructionsPartnerDtoSchema.nullable(), warehouseKeeper: UpdateShippingInstructionsPartnerDtoSchema.nullable() }).partial(); -export type UpdateShippingInstructionsGeneralDetailsDto = z.infer; - -/** - * UpdateShippingInstructionsLocationDtoSchema - * @type { object } - * @property { string } id Location id - * @property { string } name Location name - * @property { string } code Location code - * @property { string } countryCode Country code - */ -export const UpdateShippingInstructionsLocationDtoSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), code: z.string().nullable(), countryCode: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsLocationDto = z.infer; - -/** - * UpdateShippingInstructionsTransportDtoSchema - * @type { object } - * @property { string } vessel Vessel - * @property { string } voyage Voyage - * @property { string } imo IMO - * @property { UpdateShippingInstructionsLocationDto } placeOfReceipt Place of receipt - * @property { UpdateShippingInstructionsLocationDto } portOfLoading Port of loading - * @property { UpdateShippingInstructionsLocationDto } portOfDischarge Port of discharge - * @property { UpdateShippingInstructionsLocationDto } placeOfDelivery Place of delivery - * @property { SIMoveTypeEnum } moveType Move type - * @property { string } shipmentType Shipment type - */ -export const UpdateShippingInstructionsTransportDtoSchema = z.object({ vessel: z.string().nullable(), voyage: z.string().nullable(), imo: z.string().nullable(), placeOfReceipt: UpdateShippingInstructionsLocationDtoSchema.nullable(), portOfLoading: UpdateShippingInstructionsLocationDtoSchema.nullable(), portOfDischarge: UpdateShippingInstructionsLocationDtoSchema.nullable(), placeOfDelivery: UpdateShippingInstructionsLocationDtoSchema.nullable(), moveType: SIMoveTypeEnumSchema.nullable(), shipmentType: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsTransportDto = z.infer; - -/** - * UpdateShippingInstructionsHazardousDtoSchema - * @type { object } - * @property { string } IMOClass IMO class - * @property { string } UNDGNumber UNDG number - * @property { string } contact Contact - */ -export const UpdateShippingInstructionsHazardousDtoSchema = z.object({ IMOClass: z.string().nullable(), UNDGNumber: z.string().nullable(), contact: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsHazardousDto = z.infer; - -/** - * UpdateShippingInstructionsPackageDtoSchema - * @type { object } - * @property { string } id Package id - * @property { number } quantity Quantity - * @property { string } packageType Package type - * @property { string } packageTypeDescription Package type description - * @property { string } packageDescription Package description - * @property { string } hsCode HS code - * @property { number } volume Volume - * @property { number } grossWeight Gross weight - * @property { string } caseMarks Case marks - * @property { UpdateShippingInstructionsHazardousDto } hazardous Hazardous - * @property { string } ncmCodes NCM codes - * @property { string } cusCode CUS code - */ -export const UpdateShippingInstructionsPackageDtoSchema = z.object({ id: z.string().nullable(), quantity: z.number().nullable(), packageType: z.string().nullable(), packageTypeDescription: z.string().nullable(), packageDescription: z.string().nullable(), hsCode: z.string().nullable(), volume: z.number().nullable(), grossWeight: z.number().nullable(), caseMarks: z.string().nullable(), hazardous: UpdateShippingInstructionsHazardousDtoSchema.nullable(), ncmCodes: z.string().nullable(), cusCode: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsPackageDto = z.infer; - -/** - * UpdateShippingInstructionsCargoDtoSchema - * @type { object } - * @property { string } id Cargo id - * @property { string } transportUnitNumber Transport unit number - * @property { string } transportUnitType Transport unit type - * @property { string } transportUnitDescription Transport unit description - * @property { string } containerSupplier Container supplier - * @property { number } grossWeight Gross weight - * @property { number } tare Tare - * @property { number } volume Volume - * @property { string } seal1 Seal 1 - * @property { string } seal2 Seal 2 - * @property { string } woodDeclaration Wood declaration - * @property { UpdateShippingInstructionsPackageDto[] } packages Packages - */ -export const UpdateShippingInstructionsCargoDtoSchema = z.object({ id: z.string().nullable(), transportUnitNumber: z.string().nullable(), transportUnitType: z.string().nullable(), transportUnitDescription: z.string().nullable(), containerSupplier: z.string().nullable(), grossWeight: z.number().nullable(), tare: z.number().nullable(), volume: z.number().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), woodDeclaration: WoodDeclarationEnumSchema.nullable(), packages: z.array(UpdateShippingInstructionsPackageDtoSchema).nullable() }).partial(); -export type UpdateShippingInstructionsCargoDto = z.infer; - -/** - * UpdateShippingInstructionsHeaderDtoSchema - * @type { object } - * @property { string } name Name - * @property { string } nameSuffix Name suffix - * @property { number } versionNumber Version number - * @property { string } shippingInstructionNumber Shipping instruction number - * @property { string } carrierScac Carrier SCAC - * @property { string } carrierBookingNumber Carrier booking number - */ -export const UpdateShippingInstructionsHeaderDtoSchema = z.object({ name: z.string().nullable(), nameSuffix: z.string().nullable(), versionNumber: z.number().nullable(), shippingInstructionNumber: z.string().nullable(), carrierScac: z.string().nullable(), carrierBookingNumber: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsHeaderDto = z.infer; - -/** - * UpdateShippingInstructionsReferencesDtoSchema - * @type { object } - * @property { string } shipperReference Shipper reference - * @property { string } forwarderReference Forwarder reference - * @property { string } transactionReferenceNumber Transaction reference number - * @property { string } blReferenceNumber BL reference number - * @property { string } uniqueConsignmentReference Unique consignment reference - * @property { string } purchaseOrderNumber Purchase order number - * @property { string } contractReferenceNumber Contract reference number - * @property { string } rucNumber RUC number - * @property { string } consigneeOrderNumber Consignee order number - * @property { string } invoiceReferenceNumber Invoice reference number - * @property { string } letterOfCreditReference Letter of credit reference - * @property { string } customsHouseBrokerReference Customs house broker reference - * @property { string } fmcNumber FMC number - * @property { string } exportLicenseNumber Export license number - */ -export const UpdateShippingInstructionsReferencesDtoSchema = z.object({ shipperReference: z.string().nullable(), forwarderReference: z.string().nullable(), transactionReferenceNumber: z.string().nullable(), blReferenceNumber: z.string().nullable(), uniqueConsignmentReference: z.string().nullable(), purchaseOrderNumber: z.string().nullable(), contractReferenceNumber: z.string().nullable(), rucNumber: z.string().nullable(), consigneeOrderNumber: z.string().nullable(), invoiceReferenceNumber: z.string().nullable(), letterOfCreditReference: z.string().nullable(), customsHouseBrokerReference: z.string().nullable(), fmcNumber: z.string().nullable(), exportLicenseNumber: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsReferencesDto = z.infer; - -/** - * UpdateShippingInstructionsCustomsComplianceDtoSchema - * @type { object } - * @property { string } shipperTaxId Shipper tax ID - * @property { string } shipperEORI Shipper EORI - * @property { string } consigneeTaxId Consignee tax ID - * @property { string } consigneeEORI Consignee EORI - * @property { string } notifyPartyTaxId Notify party tax ID - * @property { string } notifyPartyEORI Notify party EORI - */ -export const UpdateShippingInstructionsCustomsComplianceDtoSchema = z.object({ shipperTaxId: z.string().nullable(), shipperEORI: z.string().nullable(), consigneeTaxId: z.string().nullable(), consigneeEORI: z.string().nullable(), notifyPartyTaxId: z.string().nullable(), notifyPartyEORI: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsCustomsComplianceDto = z.infer; - -/** - * UpdateShippingInstructionsIcs2DtoSchema - * @type { object } - * @property { boolean } goodsDeliveredInEu Goods delivered in EU - * @property { string } ensDeclaration ENS declaration - * @property { string } issuedHouseBills Issued house bills - */ -export const UpdateShippingInstructionsIcs2DtoSchema = z.object({ goodsDeliveredInEu: z.boolean().nullable(), ensDeclaration: EnsDeclarationEnumSchema.nullable(), issuedHouseBills: IssuedHouseBillsEnumSchema.nullable() }).partial(); -export type UpdateShippingInstructionsIcs2Dto = z.infer; - -/** - * UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema - * @type { object } - * @property { string } PCINNumber PCIN number - * @property { string } CSNNumber CSN number - * @property { string } MCINNumber MCIN number - */ -export const UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema = z.object({ PCINNumber: z.string().nullable(), CSNNumber: z.string().nullable(), MCINNumber: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsCargoIdentificationNumbersDto = z.infer; - -/** - * UpdateFreightChargesDtoSchema - * @type { object } - * @property { string } freightPayer - * @property { string } freightTerm - */ -export const UpdateFreightChargesDtoSchema = z.object({ freightPayer: z.string().nullable(), freightTerm: CommonModels.ChargePaymentEnumSchema.nullable() }).partial(); -export type UpdateFreightChargesDto = z.infer; - -/** - * UpdateShippingInstructionsShippersDeclaredValueDtoSchema - * @type { object } - * @property { string } currency Currency - * @property { number } shipperDeclaredValue Shipper declared value - */ -export const UpdateShippingInstructionsShippersDeclaredValueDtoSchema = z.object({ currency: z.string().nullable(), shipperDeclaredValue: z.number().nullable() }).partial(); -export type UpdateShippingInstructionsShippersDeclaredValueDto = z.infer; - -/** - * UpdateShippingInstructionsNotificationEmailsDtoSchema - * @type { object } - * @property { string } siRequestorEmails SI requestor emails - */ -export const UpdateShippingInstructionsNotificationEmailsDtoSchema = z.object({ siRequestorEmails: z.string().nullable() }).partial(); -export type UpdateShippingInstructionsNotificationEmailsDto = z.infer; - -/** - * UpdateShippingInstructionsRequestDtoSchema - * @type { object } - * @property { string } date Date - * @property { UpdateShippingInstructionsHeaderDto } header Header - * @property { UpdateShippingInstructionsGeneralDetailsDto } generalDetails General details - * @property { UpdateShippingInstructionsReferencesDto } references References - * @property { UpdateShippingInstructionsTransportDto } transport Transport - * @property { UpdateShippingInstructionsCustomsComplianceDto } customsCompliance Customs compliance - * @property { UpdateShippingInstructionsIcs2Dto } ics2 ICS2 - * @property { UpdateShippingInstructionsCargoIdentificationNumbersDto } cargoIdentificationNumbers Cargo identification numbers - * @property { UpdateShippingInstructionsCargoDto[] } cargo Cargo - * @property { UpdateFreightChargesDto } freightCharges - * @property { UpdateShippingInstructionsShippersDeclaredValueDto } shippersDeclaredValue Shipper's declared value - * @property { UpdateShippingInstructionsNotificationEmailsDto } notificationEmails Notification emails - */ -export const UpdateShippingInstructionsRequestDtoSchema = z.object({ date: z.iso.datetime({ offset: true }).nullable(), header: UpdateShippingInstructionsHeaderDtoSchema.nullable(), generalDetails: UpdateShippingInstructionsGeneralDetailsDtoSchema.nullable(), references: UpdateShippingInstructionsReferencesDtoSchema.nullable(), transport: UpdateShippingInstructionsTransportDtoSchema.nullable(), customsCompliance: UpdateShippingInstructionsCustomsComplianceDtoSchema.nullable(), ics2: UpdateShippingInstructionsIcs2DtoSchema.nullable(), cargoIdentificationNumbers: UpdateShippingInstructionsCargoIdentificationNumbersDtoSchema.nullable(), cargo: z.array(UpdateShippingInstructionsCargoDtoSchema).nullable(), freightCharges: UpdateFreightChargesDtoSchema.nullable(), shippersDeclaredValue: UpdateShippingInstructionsShippersDeclaredValueDtoSchema.nullable(), notificationEmails: UpdateShippingInstructionsNotificationEmailsDtoSchema.nullable() }).partial(); -export type UpdateShippingInstructionsRequestDto = z.infer; - -} diff --git a/test/generated/next/shippingInstructions/shippingInstructions.queries.ts b/test/generated/next/shippingInstructions/shippingInstructions.queries.ts deleted file mode 100644 index 4514025..0000000 --- a/test/generated/next/shippingInstructions/shippingInstructions.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { ShippingInstructionsAcl } from "./shippingInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { ShippingInstructionsModels } from "./shippingInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { ShippingInstructionsApi } from "./shippingInstructions.api"; - -export namespace ShippingInstructionsQueries { -export const moduleName = QueryModule.ShippingInstructions; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id", officeId, positionId, id] as const, - preview: (officeId: string, positionId: string, id: string) => [...keys.all, "/offices/:officeId/positions/:positionId/shipping-instructions/:id/preview", officeId, positionId, id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create shipping instructions - * @permission Requires `canUseCreate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId }) => { - checkAcl(ShippingInstructionsAcl.canUseCreate({ officeId } )); - return ShippingInstructionsApi.create(officeId, positionId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGet` - * @summary Get shipping instructions data - * @permission Requires `canUseGet` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.get(officeId, positionId, id), - queryFn: () => { - checkAcl(ShippingInstructionsAcl.canUseGet({ officeId } )); - return ShippingInstructionsApi.get(officeId, positionId, id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update shipping instructions - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { ShippingInstructionsModels.UpdateShippingInstructionsRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Shipping instructions updated successfully - * @statusCodes [200, 401, 404] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id, data }) => { - checkAcl(ShippingInstructionsAcl.canUseUpdate({ officeId } )); - return ShippingInstructionsApi.update(officeId, positionId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, id } = variables; - const updateKeys = [keys.get(officeId, positionId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteOfficesPositionsShippingInstructionsById` - * @summary Delete shipping instructions - * @permission Requires `canUseDeleteOfficesPositionsShippingInstructionsById` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Shipping instructions deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteOfficesPositionsShippingInstructionsById = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id }) => { - checkAcl(ShippingInstructionsAcl.canUseDeleteOfficesPositionsShippingInstructionsById({ officeId } )); - return ShippingInstructionsApi.deleteOfficesPositionsShippingInstructionsById(officeId, positionId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreview` - recommended when file should be cached - * @summary Preview shipping instructions document - * @permission Requires `canUsePreview` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreview = ({ officeId, positionId, id }: { officeId: string, positionId: string, id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.preview(officeId, positionId, id), - queryFn: () => { - checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); - return ShippingInstructionsApi.preview(officeId, positionId, id) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewMutation` - recommended when file should not be cached - * @summary Preview shipping instructions document - * @permission Requires `canUsePreview` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id }) => { - checkAcl(ShippingInstructionsAcl.canUsePreview({ officeId } )); - return ShippingInstructionsApi.preview(officeId, positionId, id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, id } = variables; - const updateKeys = [keys.preview(officeId, positionId, id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerate` - * @summary Generate shipping instructions document - * @permission Requires `canUseGenerate` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.id Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, id, data }) => { - checkAcl(ShippingInstructionsAcl.canUseGenerate({ officeId } )); - return ShippingInstructionsApi.generate(officeId, positionId, id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/terminals/terminals.acl.ts b/test/generated/next/terminals/terminals.acl.ts deleted file mode 100644 index d29c8a0..0000000 --- a/test/generated/next/terminals/terminals.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace TerminalsAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Terminal" -] as AbilityTuple<"Create", "Terminal">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Terminal" -] as AbilityTuple<"Read", "Terminal">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Terminal" -] as AbilityTuple<"Read", "Terminal">; - -/** - * Use for `useGetById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetById` query - */ -export const canUseGetById = ( -) => [ - "Read", - "Terminal" -] as AbilityTuple<"Read", "Terminal">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Terminal" -] as AbilityTuple<"Update", "Terminal">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Terminal" -] as AbilityTuple<"Archive", "Terminal">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Unarchive", - "Terminal" -] as AbilityTuple<"Unarchive", "Terminal">; - -} diff --git a/test/generated/next/terminals/terminals.api.ts b/test/generated/next/terminals/terminals.api.ts deleted file mode 100644 index 4e021f0..0000000 --- a/test/generated/next/terminals/terminals.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { TerminalsModels } from "./terminals.models"; - -export namespace TerminalsApi { -export const create = (data: TerminalsModels.CreateTerminalRequestDTO, ) => { - return AppRestClient.post( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals`, - ZodExtended.parse(TerminalsModels.CreateTerminalRequestDTOSchema, data), - - ) -}; -export const paginate = (limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: TerminalsModels.TerminalsPaginateResponseSchema }, - `/terminals`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(TerminalsModels.TerminalPaginationFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: TerminalsModels.TerminalsPaginateLabelsResponseSchema }, - `/terminals/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(TerminalsModels.TerminalLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const getById = (id: string, ) => { - return AppRestClient.get( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals/${id}`, - - ) -}; -export const update = (id: string, data: TerminalsModels.UpdateTerminalRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: TerminalsModels.TerminalResponseDTOSchema }, - `/terminals/${id}`, - ZodExtended.parse(TerminalsModels.UpdateTerminalRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/terminals/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/terminals/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/terminals/terminals.configs.ts b/test/generated/next/terminals/terminals.configs.ts deleted file mode 100644 index 36d2f2c..0000000 --- a/test/generated/next/terminals/terminals.configs.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { TerminalsModels } from "./terminals.models"; -import { CommonModels } from "@/data/common/common.models"; -import { TerminalsQueries } from "./terminals.queries"; -import { TerminalsAcl } from "./terminals.acl"; - -export namespace TerminalsConfigs { -export const terminalsConfig = { - meta: { - title: "Terminals", - }, - readAll: { - acl: TerminalsAcl.canUsePaginate, - schema: TerminalsModels.TerminalResponseDTOSchema, - paginated: TerminalsQueries.usePaginate, - infinite: TerminalsQueries.usePaginateInfinite, - filters: { - schema: TerminalsModels.TerminalPaginationFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: TerminalsModels.TerminalPaginationFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - type: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: TerminalsModels.TerminalResponseDTOSchema, - options: { - columns: { - id: true, - matchCode: true, - name: true, - type: true, - airport: true, - port: true, - archived: true, - shortName: true, - address: true, - additionalInformation: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: TerminalsModels.TerminalsPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: TerminalsAcl.canUseGetById, - schema: TerminalsModels.TerminalResponseDTOSchema, - query: TerminalsQueries.useGetById, - }, - create: { - acl: TerminalsAcl.canUseCreate, - schema: TerminalsModels.CreateTerminalRequestDTOSchema, - mutation: TerminalsQueries.useCreate, - inputDefs: dynamicInputs({ - schema: TerminalsModels.CreateTerminalRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - type: true, - portId: true, - airportId: true, - street: true, - secondaryStreet: true, - zip: true, - district: true, - cityId: true, - countryId: true, - additionalInformation: true, - }, - }, -}) - }, - update: { - acl: TerminalsAcl.canUseUpdate, - schema: TerminalsModels.UpdateTerminalRequestDTOSchema, - mutation: TerminalsQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: TerminalsModels.UpdateTerminalRequestDTOSchema, - options: { - inputs: { - matchCode: true, - shortName: true, - name: true, - type: true, - portId: true, - airportId: true, - street: true, - secondaryStreet: true, - zip: true, - district: true, - cityId: true, - countryId: true, - additionalInformation: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: TerminalsAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: TerminalsQueries.usePaginateLabels, - infinite: TerminalsQueries.usePaginateLabelsInfinite, - filters: { - schema: TerminalsModels.TerminalLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: TerminalsModels.TerminalLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: TerminalsModels.TerminalsPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/terminals/terminals.models.ts b/test/generated/next/terminals/terminals.models.ts deleted file mode 100644 index 2ee003e..0000000 --- a/test/generated/next/terminals/terminals.models.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace TerminalsModels { -/** - * TerminalTypeSchema - * @type { enum } - */ -export const TerminalTypeSchema = z.enum(["port", "airport"]); -export type TerminalType = z.infer; -export const TerminalType = TerminalTypeSchema.enum; - -/** - * CreateTerminalRequestDTOSchema - * @type { object } - * @property { string } matchCode Unique identifier code for the terminal - * @property { string } shortName Optional short name for the terminal - * @property { string } name Full name of the terminal - * @property { TerminalType } type Type of the terminal - * @property { string } portId ID of associated port, required if type is port - * @property { string } airportId ID of associated airport, required if type is airport - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP / Postal code - * @property { string } district District - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } additionalInformation Additional information - */ -export const CreateTerminalRequestDTOSchema = z.object({ matchCode: z.string(), shortName: z.string().nullish(), name: z.string(), type: TerminalTypeSchema, portId: z.string().nullish(), airportId: z.string().nullish(), street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), district: z.string().nullish(), cityId: z.string(), countryId: z.string(), additionalInformation: z.string().nullish() }); -export type CreateTerminalRequestDTO = z.infer; - -/** - * TerminalCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const TerminalCityDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type TerminalCityDto = z.infer; - -/** - * TerminalCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const TerminalCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type TerminalCountryDto = z.infer; - -/** - * TerminalAddressDTOSchema - * @type { object } - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP/Postal code - * @property { TerminalCityDto } city - * @property { string } district District name - * @property { TerminalCountryDto } country - */ -export const TerminalAddressDTOSchema = z.object({ street: z.string(), secondaryStreet: z.string().nullish(), zip: z.string(), city: TerminalCityDtoSchema.nullish(), district: z.string().nullish(), country: TerminalCountryDtoSchema.nullish() }); -export type TerminalAddressDTO = z.infer; - -/** - * AirportReferenceDTOSchema - * @type { object } - * @property { string } id Unique identifier of the airport - * @property { string } name Name of the airport - */ -export const AirportReferenceDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type AirportReferenceDTO = z.infer; - -/** - * PortReferenceDTOSchema - * @type { object } - * @property { string } id Unique identifier of the port - * @property { string } name Name of the port - */ -export const PortReferenceDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type PortReferenceDTO = z.infer; - -/** - * TerminalEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const TerminalEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type TerminalEmployeeDTO = z.infer; - -/** - * TerminalResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the terminal - * @property { string } matchCode Match code for the terminal - * @property { string } name Name of the terminal - * @property { TerminalType } type Type of the terminal - * @property { AirportReferenceDTO } airport Associated airport information if terminal type is airport - * @property { PortReferenceDTO } port Associated port information if terminal type is port - * @property { boolean } archived Archived status of the terminal - * @property { string } shortName Short name of the terminal - * @property { TerminalAddressDTO } address Address of the terminal - * @property { string } additionalInformation Additional information - * @property { string } createdById - * @property { TerminalEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { TerminalEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const TerminalResponseDTOSchema = z.object({ id: z.string(), matchCode: z.string(), name: z.string(), type: TerminalTypeSchema.nullish(), airport: AirportReferenceDTOSchema.nullish(), port: PortReferenceDTOSchema.nullish(), archived: z.boolean(), shortName: z.string().nullish(), address: TerminalAddressDTOSchema.nullish(), additionalInformation: z.string().nullish(), createdById: z.string().nullish(), createdBy: TerminalEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: TerminalEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type TerminalResponseDTO = z.infer; - -/** - * UpdateTerminalRequestDTOSchema - * @type { object } - * @property { string } matchCode Updated match code for the terminal - * @property { string } shortName Updated short name - * @property { string } name Updated name - * @property { TerminalType } type Type of the terminal - * @property { string } portId ID of associated port, required if type is port - * @property { string } airportId ID of associated airport, required if type is airport - * @property { string } street Street address - * @property { string } secondaryStreet Secondary street - * @property { string } zip ZIP / Postal code - * @property { string } district District - * @property { string } cityId City id - * @property { string } countryId Country id - * @property { string } additionalInformation Additional information - */ -export const UpdateTerminalRequestDTOSchema = z.object({ matchCode: z.string().nullable(), shortName: z.string().nullable(), name: z.string().nullable(), type: TerminalTypeSchema.nullable(), portId: z.string().nullable(), airportId: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), district: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), additionalInformation: z.string().nullable() }).partial(); -export type UpdateTerminalRequestDTO = z.infer; - -/** - * TerminalPaginationFilterDtoSchema - * @type { object } - * @property { string } search Search term to filter terminals by matchCode, shortName, or name - * @property { boolean } archived - * @property { string } type - */ -export const TerminalPaginationFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable(), type: TerminalTypeSchema.nullable() }).partial(); -export type TerminalPaginationFilterDto = z.infer; - -/** - * TerminalLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const TerminalLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type TerminalLabelFilterDto = z.infer; - -/** - * TerminalsPaginateOrderParamEnumSchema - * @type { enum } - */ -export const TerminalsPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type TerminalsPaginateOrderParamEnum = z.infer; -export const TerminalsPaginateOrderParamEnum = TerminalsPaginateOrderParamEnumSchema.enum; - -/** - * TerminalsPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { TerminalResponseDTO[] } items - */ -export const TerminalsPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(TerminalResponseDTOSchema).nullable() }).partial().shape }); -export type TerminalsPaginateResponse = z.infer; - -/** - * TerminalsPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const TerminalsPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type TerminalsPaginateLabelsOrderParamEnum = z.infer; -export const TerminalsPaginateLabelsOrderParamEnum = TerminalsPaginateLabelsOrderParamEnumSchema.enum; - -/** - * TerminalsPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const TerminalsPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type TerminalsPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/terminals/terminals.queries.ts b/test/generated/next/terminals/terminals.queries.ts deleted file mode 100644 index b752c33..0000000 --- a/test/generated/next/terminals/terminals.queries.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { TerminalsAcl } from "./terminals.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { TerminalsModels } from "./terminals.models"; -import { TerminalsApi } from "./terminals.api"; - -export namespace TerminalsQueries { -export const moduleName = QueryModule.Terminals; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string) => [...keys.all, "/terminals", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/terminals/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string) => [...keys.all, "/terminals/paginate/labels", "infinite", limit, order, filter, cursor] as const, - getById: (id: string) => [...keys.all, "/terminals/:id", id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a new terminal - * @permission Requires `canUseCreate` ability - * @param { TerminalsModels.CreateTerminalRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(TerminalsAcl.canUseCreate()); - return TerminalsApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Paginate Terminals - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Paginate Terminals - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalPaginationFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalPaginationFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(TerminalsAcl.canUsePaginate()); - return TerminalsApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate terminals with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate terminals with only their labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { TerminalsModels.TerminalLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: TerminalsModels.TerminalLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(TerminalsAcl.canUsePaginateLabels()); - return TerminalsApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useGetById` - * @summary Get terminal details by ID - * @permission Requires `canUseGetById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getById(id), - queryFn: () => { - checkAcl(TerminalsAcl.canUseGetById()); - return TerminalsApi.getById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update terminal details - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { TerminalsModels.UpdateTerminalRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(TerminalsAcl.canUseUpdate()); - return TerminalsApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.getById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive a terminal - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(TerminalsAcl.canUseArchive()); - return TerminalsApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive a terminal - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(TerminalsAcl.canUseUnarchive()); - return TerminalsApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/useCrossTabQueryInvalidation.ts b/test/generated/next/useCrossTabQueryInvalidation.ts deleted file mode 100644 index d74d707..0000000 --- a/test/generated/next/useCrossTabQueryInvalidation.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { QueryClient, QueryKey } from "@tanstack/react-query"; - -const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; - -/** - * Broadcasts a query invalidation event to all other open tabs via localStorage. - * - * @param queryKeys - An array of query keys to invalidate (array of arrays). - * - * NOTE: The `storage` event only fires in *other* tabs — the calling tab - * must invalidate its own queryClient separately if needed. - */ -export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { - localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); -}; - -/** - * Registers a one-time global `storage` event listener that reacts to - * cross-tab invalidation broadcasts. Safe to call from multiple hooks — - * only the first call sets up the listener. - */ -let isListenerSetUp = false; - -export const setupCrossTabListener = (queryClient: QueryClient) => { - if (isListenerSetUp) return; - isListenerSetUp = true; - - window.addEventListener("storage", (e: StorageEvent) => { - if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; - - try { - const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; - for (const queryKey of keys) { - queryClient.invalidateQueries({ queryKey }); - } - } catch { - // Ignore malformed payloads - } - }); -}; diff --git a/test/generated/next/useMutationEffects.ts b/test/generated/next/useMutationEffects.ts deleted file mode 100644 index ed61406..0000000 --- a/test/generated/next/useMutationEffects.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { useCallback, useEffect } from "react"; - -import { QueryKey, useQueryClient } from "@tanstack/react-query"; -import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; -import { QueryModule } from "./queryModules"; -import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; - -export interface MutationEffectsOptions { - invalidateCurrentModule?: boolean; - crossTabInvalidation?: boolean; - invalidationMap?: InvalidationMap; - invalidateModules?: QueryModule[]; - invalidateKeys?: QueryKey[]; - preferUpdate?: boolean; -} - -export interface UseMutationEffectsProps { - currentModule: QueryModule; -} - -export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { - const queryClient = useQueryClient(); - const config = OpenApiQueryConfig.useConfig(); - - useEffect(() => { - if (!config.crossTabInvalidation) return; - setupCrossTabListener(queryClient); - }, [queryClient, config.crossTabInvalidation]); - - const runMutationEffects = useCallback( - async ( - data: TData, - variables: TVariables, - options: MutationEffectsOptions = {}, - updateKeys?: QueryKey[], - ) => { - const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; - const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; - const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; - - const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => - keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); - const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => - prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); - const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); - - const shouldInvalidateQuery = (queryKey: QueryKey) => { - const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); - if (shouldUpdate && isUpdateKey) { - return false; - } - - const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; - const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); - const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - const isMappedKey = - !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - - return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; - }; - - const invalidatedQueryKeys: QueryKey[] = []; - - queryClient.invalidateQueries({ - predicate: ({ queryKey }) => { - const shouldInvalidate = shouldInvalidateQuery(queryKey); - - if (shouldInvalidate && config.crossTabInvalidation) { - invalidatedQueryKeys.push([...queryKey]); - } - - return shouldInvalidate; - }, - }); - - if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { - broadcastQueryInvalidation(invalidatedQueryKeys); - } - - if (shouldUpdate && updateKeys) { - updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); - } - }, - [ - queryClient, - currentModule, - config.preferUpdate, - config.invalidateCurrentModule, - config.invalidationMap, - config.crossTabInvalidation, - ], - ); - - return { runMutationEffects }; -} diff --git a/test/generated/next/userActivity/userActivity.api.ts b/test/generated/next/userActivity/userActivity.api.ts deleted file mode 100644 index e1a978e..0000000 --- a/test/generated/next/userActivity/userActivity.api.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { UserActivityModels } from "./userActivity.models"; - -export namespace UserActivityApi { -export const get = (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number, ) => { - return AppRestClient.get( - { resSchema: UserActivityModels.UserActivityResponseDtoSchema }, - `/offices/${officeId}/${entityType}/${entityId}/activity`, - { - params: { - activeThresholdMinutes: ZodExtended.parse(z.number().gte(1).nullish(), activeThresholdMinutes, { type: "query", name: "activeThresholdMinutes" }), - }, - } - ) -}; -} diff --git a/test/generated/next/userActivity/userActivity.models.ts b/test/generated/next/userActivity/userActivity.models.ts deleted file mode 100644 index dfe9552..0000000 --- a/test/generated/next/userActivity/userActivity.models.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { z } from "zod"; - -export namespace UserActivityModels { -/** - * ActivityTypeEnumSchema - * @type { enum } - */ -export const ActivityTypeEnumSchema = z.enum(["View", "Modify"]); -export type ActivityTypeEnum = z.infer; -export const ActivityTypeEnum = ActivityTypeEnumSchema.enum; - -/** - * UserSectionActivityDtoSchema - * @type { object } - * @property { string } section Section name - * @property { ActivityTypeEnum } activityType Type of activity - * @property { string } lastSeen Last seen timestamp - */ -export const UserSectionActivityDtoSchema = z.object({ section: z.string(), activityType: ActivityTypeEnumSchema, lastSeen: z.iso.datetime({ offset: true }) }); -export type UserSectionActivityDto = z.infer; - -/** - * ActiveUserDtoSchema - * @type { object } - * @property { string } userId User ID - * @property { string } firstName User first name - * @property { string } lastName User last name - * @property { string } userAvatar User avatar URL - * @property { UserSectionActivityDto } section User section activity - * @property { string } lastSeen Last seen timestamp - * @property { boolean } isCurrentlyActive Is currently active - */ -export const ActiveUserDtoSchema = z.object({ userId: z.string(), firstName: z.string(), lastName: z.string(), userAvatar: z.string().nullish(), section: UserSectionActivityDtoSchema, lastSeen: z.iso.datetime({ offset: true }), isCurrentlyActive: z.boolean() }); -export type ActiveUserDto = z.infer; - -/** - * ActivityEntityTypeEnumSchema - * @type { enum } - */ -export const ActivityEntityTypeEnumSchema = z.enum(["Position", "Invoice", "BusinessPartner", "Quote"]); -export type ActivityEntityTypeEnum = z.infer; -export const ActivityEntityTypeEnum = ActivityEntityTypeEnumSchema.enum; - -/** - * ActivityMetadataDtoSchema - * @type { object } - * @property { number } totalActiveUsers Total number of active users - * @property { string } entityId Entity ID - * @property { ActivityEntityTypeEnum } entityType Entity type - * @property { number } activeThresholdMinutes Active threshold in minutes - */ -export const ActivityMetadataDtoSchema = z.object({ totalActiveUsers: z.number(), entityId: z.string(), entityType: ActivityEntityTypeEnumSchema, activeThresholdMinutes: z.number() }); -export type ActivityMetadataDto = z.infer; - -/** - * UserActivityResponseDtoSchema - * @type { object } - * @property { ActiveUserDto[] } activeUsers List of active users - * @property { ActivityMetadataDto } metadata Activity metadata - */ -export const UserActivityResponseDtoSchema = z.object({ activeUsers: z.array(ActiveUserDtoSchema), metadata: ActivityMetadataDtoSchema }); -export type UserActivityResponseDto = z.infer; - -} diff --git a/test/generated/next/userActivity/userActivity.queries.ts b/test/generated/next/userActivity/userActivity.queries.ts deleted file mode 100644 index b9e1bad..0000000 --- a/test/generated/next/userActivity/userActivity.queries.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { AppQueryOptions } from "@povio/openapi-codegen-cli"; -import { UserActivityApi } from "./userActivity.api"; - -export namespace UserActivityQueries { -export const moduleName = QueryModule.UserActivity; - -export const keys = { - all: [moduleName] as const, - get: (officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number) => [...keys.all, "/offices/:officeId/:entityType/:entityId/activity", officeId, entityType, entityId, activeThresholdMinutes] as const, -}; - -/** - * Query `useGet` - * @summary Get user activity for an entity - * @param { string } object.officeId Path parameter - * @param { string } object.entityType Path parameter - * @param { string } object.entityId Path parameter - * @param { number } object.activeThresholdMinutes Query parameter. Active threshold in minutes. Minimum: `1` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGet = ({ officeId, entityType, entityId, activeThresholdMinutes }: { officeId: string, entityType: string, entityId: string, activeThresholdMinutes?: number }, options?: AppQueryOptions) => { - - return useQuery({ - queryKey: keys.get(officeId, entityType, entityId, activeThresholdMinutes), - queryFn: () => - UserActivityApi.get(officeId, entityType, entityId, activeThresholdMinutes), - ...options, - }); -}; - -} diff --git a/test/generated/next/vatRules/vatRules.acl.ts b/test/generated/next/vatRules/vatRules.acl.ts deleted file mode 100644 index 827096c..0000000 --- a/test/generated/next/vatRules/vatRules.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace VatRulesAcl { -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "VatRule" -] as AbilityTuple<"Read", "VatRule">; - -/** - * Use for `useList` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( -) => [ - "Read", - "VatRule" -] as AbilityTuple<"Read", "VatRule">; - -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "VatRule" -] as AbilityTuple<"Create", "VatRule">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "VatRule" -] as AbilityTuple<"Read", "VatRule">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "VatRule" -] as AbilityTuple<"Update", "VatRule">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Update", - "VatRule" -] as AbilityTuple<"Update", "VatRule">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Update", - "VatRule" -] as AbilityTuple<"Update", "VatRule">; - -} diff --git a/test/generated/next/vatRules/vatRules.api.ts b/test/generated/next/vatRules/vatRules.api.ts deleted file mode 100644 index ce19db0..0000000 --- a/test/generated/next/vatRules/vatRules.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { VatRulesModels } from "./vatRules.models"; - -export namespace VatRulesApi { -export const paginateLabels = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: VatRulesModels.VatRulesPaginateLabelsResponseSchema }, - `/vat-rules/labels/paginate`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const list = (limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: VatRulesModels.VatRulesListResponseSchema }, - `/vat-rules`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(VatRulesModels.VatRulesListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(VatRulesModels.VatRuleFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const create = (data: VatRulesModels.CreateVatRuleRequestDTO, ) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules`, - ZodExtended.parse(VatRulesModels.CreateVatRuleRequestDTOSchema, data), - - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}`, - - ) -}; -export const update = (id: string, data: VatRulesModels.UpdateVatRuleRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}`, - ZodExtended.parse(VatRulesModels.UpdateVatRuleRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: VatRulesModels.VatRuleResponseDTOSchema }, - `/vat-rules/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/vatRules/vatRules.configs.ts b/test/generated/next/vatRules/vatRules.configs.ts deleted file mode 100644 index 092a685..0000000 --- a/test/generated/next/vatRules/vatRules.configs.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { VatRulesModels } from "./vatRules.models"; -import { CommonModels } from "@/data/common/common.models"; -import { VatRulesQueries } from "./vatRules.queries"; -import { VatRulesAcl } from "./vatRules.acl"; - -export namespace VatRulesConfigs { -export const vatRulesConfig = { - meta: { - title: "Vat Rules", - }, - readAll: { - acl: VatRulesAcl.canUseList, - schema: VatRulesModels.VatRuleResponseDTOSchema, - paginated: VatRulesQueries.useList, - infinite: VatRulesQueries.useListInfinite, - filters: { - schema: VatRulesModels.VatRuleFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: VatRulesModels.VatRuleFilterDtoSchema, - options: { - inputs: { - matchcode: true, - name: true, - type: true, - officeId: true, - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: VatRulesModels.VatRuleResponseDTOSchema, - options: { - columns: { - id: true, - matchcode: true, - name: true, - vatPercentage: true, - vatNumber: true, - noTax: true, - type: true, - archived: true, - isReverseCharge: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - officeId: true, - office: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - sortable: VatRulesModels.VatRulesListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: VatRulesAcl.canUseFindById, - schema: VatRulesModels.VatRuleResponseDTOSchema, - query: VatRulesQueries.useFindById, - }, - create: { - acl: VatRulesAcl.canUseCreate, - schema: VatRulesModels.CreateVatRuleRequestDTOSchema, - mutation: VatRulesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: VatRulesModels.CreateVatRuleRequestDTOSchema, - options: { - inputs: { - matchcode: true, - name: true, - noTax: true, - vatPercentage: true, - vatNumber: true, - type: true, - officeId: true, - isReverseCharge: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - }, -}) - }, - update: { - acl: VatRulesAcl.canUseUpdate, - schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, - mutation: VatRulesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: VatRulesModels.UpdateVatRuleRequestDTOSchema, - options: { - inputs: { - matchcode: true, - name: true, - noTax: true, - vatPercentage: true, - vatNumber: true, - type: true, - officeId: true, - isReverseCharge: true, - bookkeepingId: true, - bookkeepingTargetAccountNumber: true, - }, - }, -}) - }, -}; - -export const paginateConfig = { - meta: { - title: "Paginate", - }, - readAll: { - acl: VatRulesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: VatRulesQueries.usePaginateLabels, - infinite: VatRulesQueries.usePaginateLabelsInfinite, - filters: { - schema: VatRulesModels.VatRuleFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: VatRulesModels.VatRuleFilterDtoSchema, - options: { - inputs: { - matchcode: true, - name: true, - type: true, - officeId: true, - archived: true, - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: VatRulesModels.VatRulesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/vatRules/vatRules.models.ts b/test/generated/next/vatRules/vatRules.models.ts deleted file mode 100644 index f9ef2d5..0000000 --- a/test/generated/next/vatRules/vatRules.models.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace VatRulesModels { -/** - * VatRuleTypeEnumSchema - * @type { enum } - */ -export const VatRuleTypeEnumSchema = z.enum(["Outgoing", "Incoming"]); -export type VatRuleTypeEnum = z.infer; -export const VatRuleTypeEnum = VatRuleTypeEnumSchema.enum; - -/** - * VatRuleFilterDtoSchema - * @type { object } - * @property { string } matchcode Matchcode to filter by - * @property { string } name Name to filter by - * @property { VatRuleTypeEnum } type - * @property { string } officeId Office ID to filter by - * @property { boolean } archived Filter by archived status - * @property { string } search Search to filter by - */ -export const VatRuleFilterDtoSchema = z.object({ matchcode: z.string().nullable(), name: z.string().nullable(), type: VatRuleTypeEnumSchema.nullable(), officeId: z.string().nullable(), archived: z.boolean().nullable(), search: z.string().nullable() }).partial(); -export type VatRuleFilterDto = z.infer; - -/** - * VatRuleEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const VatRuleEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type VatRuleEmployeeDTO = z.infer; - -/** - * VatRuleOfficeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const VatRuleOfficeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type VatRuleOfficeDTO = z.infer; - -/** - * VatRuleResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } matchcode - * @property { string } name - * @property { number } vatPercentage - * @property { number } vatNumber VAT rule reference number - * @property { boolean } noTax - * @property { VatRuleTypeEnum } type - * @property { boolean } archived - * @property { boolean } isReverseCharge - * @property { string } createdById - * @property { VatRuleEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { VatRuleEmployeeDTO } updatedBy - * @property { string } updatedAt - * @property { string } officeId - * @property { VatRuleOfficeDTO } office - * @property { string } bookkeepingId - * @property { string } bookkeepingTargetAccountNumber - */ -export const VatRuleResponseDTOSchema = z.object({ id: z.string(), matchcode: z.string(), name: z.string(), vatPercentage: z.number(), vatNumber: z.number().nullish(), noTax: z.boolean().nullish(), type: VatRuleTypeEnumSchema, archived: z.boolean(), isReverseCharge: z.boolean(), createdById: z.string().nullish(), createdBy: VatRuleEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: VatRuleEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }), officeId: z.string(), office: VatRuleOfficeDTOSchema.nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }); -export type VatRuleResponseDTO = z.infer; - -/** - * CreateVatRuleRequestDTOSchema - * @type { object } - * @property { string } matchcode Unique matchcode for the VAT rule - * @property { string } name Name of the VAT rule - * @property { boolean } noTax - * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` - * @property { number } vatNumber VAT rule reference number - * @property { VatRuleTypeEnum } type Type of VAT rule - * @property { string } officeId Office ID - * @property { boolean } isReverseCharge Is reverse charge VAT rule - * @property { string } bookkeepingId Bookkeeping ID - * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number - */ -export const CreateVatRuleRequestDTOSchema = z.object({ matchcode: z.string(), name: z.string(), noTax: z.boolean().nullish(), vatPercentage: z.number().gte(0).lte(100), vatNumber: z.number().nullish(), type: VatRuleTypeEnumSchema, officeId: z.string(), isReverseCharge: z.boolean().nullish(), bookkeepingId: z.string().nullish(), bookkeepingTargetAccountNumber: z.string().nullish() }); -export type CreateVatRuleRequestDTO = z.infer; - -/** - * UpdateVatRuleRequestDTOSchema - * @type { object } - * @property { string } matchcode Unique matchcode for the VAT rule - * @property { string } name Name of the VAT rule - * @property { boolean } noTax - * @property { number } vatPercentage VAT percentage (0-100). Minimum: `0`. Maximum: `100` - * @property { number } vatNumber VAT rule reference number. Minimum: `0` - * @property { VatRuleTypeEnum } type Type of VAT rule - * @property { string } officeId Office ID - * @property { boolean } isReverseCharge Is reverse charge VAT rule - * @property { string } bookkeepingId Bookkeeping ID - * @property { string } bookkeepingTargetAccountNumber Bookkeeping target account number - */ -export const UpdateVatRuleRequestDTOSchema = z.object({ matchcode: z.string().nullable(), name: z.string().nullable(), noTax: z.boolean().nullable(), vatPercentage: z.number().gte(0).lte(100).nullable(), vatNumber: z.number().gte(0).nullable(), type: VatRuleTypeEnumSchema.nullable(), officeId: z.string().nullable(), isReverseCharge: z.boolean().nullable(), bookkeepingId: z.string().nullable(), bookkeepingTargetAccountNumber: z.string().nullable() }).partial(); -export type UpdateVatRuleRequestDTO = z.infer; - -/** - * VatRulesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const VatRulesPaginateLabelsOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type VatRulesPaginateLabelsOrderParamEnum = z.infer; -export const VatRulesPaginateLabelsOrderParamEnum = VatRulesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * VatRulesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const VatRulesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type VatRulesPaginateLabelsResponse = z.infer; - -/** - * VatRulesListOrderParamEnumSchema - * @type { enum } - */ -export const VatRulesListOrderParamEnumSchema = z.enum(["matchcode", "name", "type", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type VatRulesListOrderParamEnum = z.infer; -export const VatRulesListOrderParamEnum = VatRulesListOrderParamEnumSchema.enum; - -/** - * VatRulesListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { VatRuleResponseDTO[] } items - */ -export const VatRulesListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(VatRuleResponseDTOSchema).nullable() }).partial().shape }); -export type VatRulesListResponse = z.infer; - -} diff --git a/test/generated/next/vatRules/vatRules.queries.ts b/test/generated/next/vatRules/vatRules.queries.ts deleted file mode 100644 index f582045..0000000 --- a/test/generated/next/vatRules/vatRules.queries.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { VatRulesAcl } from "./vatRules.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { VatRulesModels } from "./vatRules.models"; -import { VatRulesApi } from "./vatRules.api"; - -export namespace VatRulesQueries { -export const moduleName = QueryModule.VatRules; - -export const keys = { - all: [moduleName] as const, - paginateLabels: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules/labels/paginate", "infinite", limit, order, filter, cursor] as const, - list: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string) => [...keys.all, "/vat-rules", limit, order, filter, page, cursor] as const, - listInfinite: (limit?: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string) => [...keys.all, "/vat-rules", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/vat-rules/:id", id] as const, -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate VAT rule labels (id and matchcode only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate VAT rule labels (id and matchcode only) - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(VatRulesAcl.canUsePaginateLabels()); - return VatRulesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useList` - * @summary List VAT rules - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List VAT rules - * @permission Requires `canUseList` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): matchcode, name, type, createdAt, updatedAt, createdBy, updatedBy. Example: `matchcode` - * @param { VatRulesModels.VatRuleFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: VatRulesModels.VatRuleFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(VatRulesAcl.canUseList()); - return VatRulesApi.list(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Mutation `useCreate` - * @summary Create a new VAT rule - * @permission Requires `canUseCreate` ability - * @param { VatRulesModels.CreateVatRuleRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401, 409] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(VatRulesAcl.canUseCreate()); - return VatRulesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindById` - * @summary Get VAT rule by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(VatRulesAcl.canUseFindById()); - return VatRulesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update VAT rule by ID - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { VatRulesModels.UpdateVatRuleRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(VatRulesAcl.canUseUpdate()); - return VatRulesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive VAT rule - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(VatRulesAcl.canUseArchive()); - return VatRulesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive VAT rule - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401, 404, 409] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(VatRulesAcl.canUseUnarchive()); - return VatRulesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/warehouses/warehouses.acl.ts b/test/generated/next/warehouses/warehouses.acl.ts deleted file mode 100644 index 65a76ba..0000000 --- a/test/generated/next/warehouses/warehouses.acl.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; - -export namespace WarehousesAcl { -/** - * Use for `useCreate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( -) => [ - "Create", - "Warehouse" -] as AbilityTuple<"Create", "Warehouse">; - -/** - * Use for `usePaginate` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginate` query - */ -export const canUsePaginate = ( -) => [ - "Read", - "Warehouse" -] as AbilityTuple<"Read", "Warehouse">; - -/** - * Use for `usePaginateLabels` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePaginateLabels` query - */ -export const canUsePaginateLabels = ( -) => [ - "Read", - "Warehouse" -] as AbilityTuple<"Read", "Warehouse">; - -/** - * Use for `useFindById` query ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( -) => [ - "Read", - "Warehouse" -] as AbilityTuple<"Read", "Warehouse">; - -/** - * Use for `useUpdate` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdate` mutation - */ -export const canUseUpdate = ( -) => [ - "Update", - "Warehouse" -] as AbilityTuple<"Update", "Warehouse">; - -/** - * Use for `useArchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useArchive` mutation - */ -export const canUseArchive = ( -) => [ - "Archive", - "Warehouse" -] as AbilityTuple<"Archive", "Warehouse">; - -/** - * Use for `useUnarchive` mutation ability. - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUnarchive` mutation - */ -export const canUseUnarchive = ( -) => [ - "Archive", - "Warehouse" -] as AbilityTuple<"Archive", "Warehouse">; - -} diff --git a/test/generated/next/warehouses/warehouses.api.ts b/test/generated/next/warehouses/warehouses.api.ts deleted file mode 100644 index bfa128b..0000000 --- a/test/generated/next/warehouses/warehouses.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WarehousesModels } from "./warehouses.models"; - -export namespace WarehousesApi { -export const create = (data: WarehousesModels.CreateWarehouseRequestDTO, ) => { - return AppRestClient.post( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses`, - ZodExtended.parse(WarehousesModels.CreateWarehouseRequestDTOSchema, data), - - ) -}; -export const paginate = (limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: WarehousesModels.WarehousesPaginateResponseSchema }, - `/warehouses`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(WarehousesModels.WarehouseFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const paginateLabels = (limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: WarehousesModels.WarehousesPaginateLabelsResponseSchema }, - `/warehouses/paginate/labels`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(WarehousesModels.WarehouseLabelFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (id: string, ) => { - return AppRestClient.get( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses/${id}`, - - ) -}; -export const update = (id: string, data: WarehousesModels.UpdateWarehouseRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WarehousesModels.WarehouseResponseDTOSchema }, - `/warehouses/${id}`, - ZodExtended.parse(WarehousesModels.UpdateWarehouseRequestDTOSchema, data), - - ) -}; -export const archive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/warehouses/${id}/archive`, - - ) -}; -export const unarchive = (id: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/warehouses/${id}/unarchive`, - - ) -}; -} diff --git a/test/generated/next/warehouses/warehouses.configs.ts b/test/generated/next/warehouses/warehouses.configs.ts deleted file mode 100644 index d53c994..0000000 --- a/test/generated/next/warehouses/warehouses.configs.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { WarehousesModels } from "./warehouses.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WarehousesQueries } from "./warehouses.queries"; -import { WarehousesAcl } from "./warehouses.acl"; - -export namespace WarehousesConfigs { -export const warehousesConfig = { - meta: { - title: "Warehouses", - }, - readAll: { - acl: WarehousesAcl.canUsePaginate, - schema: WarehousesModels.WarehouseResponseDTOSchema, - paginated: WarehousesQueries.usePaginate, - infinite: WarehousesQueries.usePaginateInfinite, - filters: { - schema: WarehousesModels.WarehouseFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WarehousesModels.WarehouseFilterDtoSchema, - options: { - inputs: { - search: true, - archived: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: WarehousesModels.WarehouseResponseDTOSchema, - options: { - columns: { - id: true, - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - city: true, - country: true, - district: true, - archived: true, - createdById: true, - createdBy: true, - createdAt: true, - updatedById: true, - updatedBy: true, - updatedAt: true, - }, - sortable: WarehousesModels.WarehousesPaginateOrderParamEnumSchema, - }, -}), - }, - read: { - acl: WarehousesAcl.canUseFindById, - schema: WarehousesModels.WarehouseResponseDTOSchema, - query: WarehousesQueries.useFindById, - }, - create: { - acl: WarehousesAcl.canUseCreate, - schema: WarehousesModels.CreateWarehouseRequestDTOSchema, - mutation: WarehousesQueries.useCreate, - inputDefs: dynamicInputs({ - schema: WarehousesModels.CreateWarehouseRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, - update: { - acl: WarehousesAcl.canUseUpdate, - schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, - mutation: WarehousesQueries.useUpdate, - inputDefs: dynamicInputs({ - schema: WarehousesModels.UpdateWarehouseRequestDTOSchema, - options: { - inputs: { - name: true, - shortName: true, - additionalInformation: true, - matchCode: true, - street: true, - secondaryStreet: true, - zip: true, - cityId: true, - countryId: true, - district: true, - }, - }, -}) - }, -}; - -export const labelsConfig = { - meta: { - title: "Labels", - }, - readAll: { - acl: WarehousesAcl.canUsePaginateLabels, - schema: CommonModels.LabelResponseDTOSchema, - paginated: WarehousesQueries.usePaginateLabels, - infinite: WarehousesQueries.usePaginateLabelsInfinite, - filters: { - schema: WarehousesModels.WarehouseLabelFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WarehousesModels.WarehouseLabelFilterDtoSchema, - options: { - inputs: { - search: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: CommonModels.LabelResponseDTOSchema, - options: { - columns: { - id: true, - label: true, - }, - sortable: WarehousesModels.WarehousesPaginateLabelsOrderParamEnumSchema, - }, -}), - }, -}; - -} diff --git a/test/generated/next/warehouses/warehouses.models.ts b/test/generated/next/warehouses/warehouses.models.ts deleted file mode 100644 index e60932b..0000000 --- a/test/generated/next/warehouses/warehouses.models.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WarehousesModels { -/** - * WarehouseCityDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const WarehouseCityDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type WarehouseCityDto = z.infer; - -/** - * WarehouseCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } isoCode2 - * @property { string } isoCode3 - */ -export const WarehouseCountryDtoSchema = z.object({ id: z.string(), name: z.string(), isoCode2: z.string(), isoCode3: z.string() }); -export type WarehouseCountryDto = z.infer; - -/** - * WarehouseEmployeeDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const WarehouseEmployeeDTOSchema = z.object({ id: z.string(), name: z.string() }); -export type WarehouseEmployeeDTO = z.infer; - -/** - * WarehouseResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { WarehouseCityDto } city - * @property { WarehouseCountryDto } country - * @property { string } district - * @property { boolean } archived - * @property { string } createdById - * @property { WarehouseEmployeeDTO } createdBy - * @property { string } createdAt - * @property { string } updatedById - * @property { WarehouseEmployeeDTO } updatedBy - * @property { string } updatedAt - */ -export const WarehouseResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), city: WarehouseCityDtoSchema.nullish(), country: WarehouseCountryDtoSchema.nullish(), district: z.string().nullish(), archived: z.boolean(), createdById: z.string().nullish(), createdBy: WarehouseEmployeeDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedById: z.string().nullish(), updatedBy: WarehouseEmployeeDTOSchema.nullish(), updatedAt: z.iso.datetime({ offset: true }) }); -export type WarehouseResponseDTO = z.infer; - -/** - * CreateWarehouseRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } countryId - * @property { string } district - */ -export const CreateWarehouseRequestDTOSchema = z.object({ name: z.string().nullish(), shortName: z.string().nullish(), additionalInformation: z.string().nullish(), matchCode: z.string(), street: z.string().nullish(), secondaryStreet: z.string().nullish(), zip: z.string().nullish(), cityId: z.string().nullish(), countryId: z.string().nullish(), district: z.string().nullish() }); -export type CreateWarehouseRequestDTO = z.infer; - -/** - * WarehouseLabelFilterDtoSchema - * @type { object } - * @property { string } search - */ -export const WarehouseLabelFilterDtoSchema = z.object({ search: z.string().nullable() }).partial(); -export type WarehouseLabelFilterDto = z.infer; - -/** - * WarehouseFilterDtoSchema - * @type { object } - * @property { string } search - * @property { boolean } archived Filter by archived status - */ -export const WarehouseFilterDtoSchema = z.object({ search: z.string().nullable(), archived: z.boolean().nullable() }).partial(); -export type WarehouseFilterDto = z.infer; - -/** - * UpdateWarehouseRequestDTOSchema - * @type { object } - * @property { string } name - * @property { string } shortName - * @property { string } additionalInformation - * @property { string } matchCode - * @property { string } street - * @property { string } secondaryStreet - * @property { string } zip - * @property { string } cityId - * @property { string } countryId - * @property { string } district - */ -export const UpdateWarehouseRequestDTOSchema = z.object({ name: z.string().nullable(), shortName: z.string().nullable(), additionalInformation: z.string().nullable(), matchCode: z.string().nullable(), street: z.string().nullable(), secondaryStreet: z.string().nullable(), zip: z.string().nullable(), cityId: z.string().nullable(), countryId: z.string().nullable(), district: z.string().nullable() }).partial(); -export type UpdateWarehouseRequestDTO = z.infer; - -/** - * WarehousesPaginateOrderParamEnumSchema - * @type { enum } - */ -export const WarehousesPaginateOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type WarehousesPaginateOrderParamEnum = z.infer; -export const WarehousesPaginateOrderParamEnum = WarehousesPaginateOrderParamEnumSchema.enum; - -/** - * WarehousesPaginateResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { WarehouseResponseDTO[] } items - */ -export const WarehousesPaginateResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WarehouseResponseDTOSchema).nullable() }).partial().shape }); -export type WarehousesPaginateResponse = z.infer; - -/** - * WarehousesPaginateLabelsOrderParamEnumSchema - * @type { enum } - */ -export const WarehousesPaginateLabelsOrderParamEnumSchema = z.enum(["name", "matchCode", "shortName", "createdAt", "updatedAt", "createdBy", "updatedBy"]); -export type WarehousesPaginateLabelsOrderParamEnum = z.infer; -export const WarehousesPaginateLabelsOrderParamEnum = WarehousesPaginateLabelsOrderParamEnumSchema.enum; - -/** - * WarehousesPaginateLabelsResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { CommonModels.LabelResponseDTO[] } items - */ -export const WarehousesPaginateLabelsResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(CommonModels.LabelResponseDTOSchema).nullable() }).partial().shape }); -export type WarehousesPaginateLabelsResponse = z.infer; - -} diff --git a/test/generated/next/warehouses/warehouses.queries.ts b/test/generated/next/warehouses/warehouses.queries.ts deleted file mode 100644 index 5aa2949..0000000 --- a/test/generated/next/warehouses/warehouses.queries.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { useQuery, useInfiniteQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WarehousesAcl } from "./warehouses.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WarehousesModels } from "./warehouses.models"; -import { WarehousesApi } from "./warehouses.api"; - -export namespace WarehousesQueries { -export const moduleName = QueryModule.Warehouses; - -export const keys = { - all: [moduleName] as const, - paginate: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses", limit, order, filter, page, cursor] as const, - paginateInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string) => [...keys.all, "/warehouses", "infinite", limit, order, filter, cursor] as const, - paginateLabels: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", limit, order, filter, page, cursor] as const, - paginateLabelsInfinite: (limit?: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string) => [...keys.all, "/warehouses/paginate/labels", "infinite", limit, order, filter, cursor] as const, - findById: (id: string) => [...keys.all, "/warehouses/:id", id] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create warehouse - * @permission Requires `canUseCreate` ability - * @param { WarehousesModels.CreateWarehouseRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => { - checkAcl(WarehousesAcl.canUseCreate()); - return WarehousesApi.create(data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePaginate` - * @summary Get paginated warehouses - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginate = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginate(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateInfinite - * @summary Get paginated warehouses - * @permission Requires `canUsePaginate` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WarehousesAcl.canUsePaginate()); - return WarehousesApi.paginate(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `usePaginateLabels` - * @summary Paginate warehouse labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabels = ({ limit, order, filter, page, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.paginateLabels(limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `usePaginateLabelsInfinite - * @summary Paginate warehouse labels - * @permission Requires `canUsePaginateLabels` ability - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): name, matchCode, shortName, createdAt, updatedAt, createdBy, updatedBy. Example: `name` - * @param { WarehousesModels.WarehouseLabelFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const usePaginateLabelsInfinite = ({ limit, order, filter, cursor }: { limit: number, order?: string, filter?: WarehousesModels.WarehouseLabelFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.paginateLabelsInfinite(limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WarehousesAcl.canUsePaginateLabels()); - return WarehousesApi.paginateLabels(limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get warehouse by id - * @permission Requires `canUseFindById` ability - * @param { string } object.id Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useFindById = ({ id }: { id: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(id), - queryFn: () => { - checkAcl(WarehousesAcl.canUseFindById()); - return WarehousesApi.findById(id) }, - ...options, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update warehouse - * @permission Requires `canUseUpdate` ability - * @param { string } mutation.id Path parameter - * @param { WarehousesModels.UpdateWarehouseRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id, data }) => { - checkAcl(WarehousesAcl.canUseUpdate()); - return WarehousesApi.update(id, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { id } = variables; - const updateKeys = [keys.findById(id)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useArchive` - * @summary Archive warehouse - * @permission Requires `canUseArchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useArchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(WarehousesAcl.canUseArchive()); - return WarehousesApi.archive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUnarchive` - * @summary Unarchive warehouse - * @permission Requires `canUseUnarchive` ability - * @param { string } mutation.id Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUnarchive = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ id }) => { - checkAcl(WarehousesAcl.canUseUnarchive()); - return WarehousesApi.unarchive(id) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/workingDocuments/workingDocuments.acl.ts b/test/generated/next/workingDocuments/workingDocuments.acl.ts deleted file mode 100644 index 344f8c6..0000000 --- a/test/generated/next/workingDocuments/workingDocuments.acl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsAcl { -/** - * Use for `useList` query ability. For global ability, omit the object parameter. - * @description List working documents - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useList` query - */ -export const canUseList = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument", object) : "WorkingDocument" -] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; - -/** - * Use for `useFindById` query ability. For global ability, omit the object parameter. - * @description Get working document by ID - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useFindById` query - */ -export const canUseFindById = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument", object) : "WorkingDocument" -] as AbilityTuple<"Read", "WorkingDocument" | ForcedSubject<"WorkingDocument"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocuments/workingDocuments.api.ts b/test/generated/next/workingDocuments/workingDocuments.api.ts deleted file mode 100644 index 471babb..0000000 --- a/test/generated/next/workingDocuments/workingDocuments.api.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; - -export namespace WorkingDocumentsApi { -export const list = (positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsModels.WorkingDocumentsListResponseSchema }, - `/offices/${officeId}/positions/${positionId}/working-documents`, - { - params: { - order: ZodExtended.parse(ZodExtended.sortExp(WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema).optional(), order, { type: "query", name: "order" }), - filter: ZodExtended.parse(WorkingDocumentsModels.WorkingDocumentFilterDtoSchema.optional(), filter, { type: "query", name: "filter" }), - limit: ZodExtended.parse(z.number().gte(1).lte(100).default(20), limit, { type: "query", name: "limit" }), - page: ZodExtended.parse(z.number().nullish(), page, { type: "query", name: "page" }), - cursor: ZodExtended.parse(z.string().nullish(), cursor, { type: "query", name: "cursor" }), - }, - } - ) -}; -export const findById = (positionId: string, id: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/working-documents/${id}`, - - ) -}; -} diff --git a/test/generated/next/workingDocuments/workingDocuments.configs.ts b/test/generated/next/workingDocuments/workingDocuments.configs.ts deleted file mode 100644 index 5e7d622..0000000 --- a/test/generated/next/workingDocuments/workingDocuments.configs.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { dynamicInputs } from "@povio/ui"; -import { dynamicColumns } from "@povio/ui"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; -import { WorkingDocumentsQueries } from "./workingDocuments.queries"; -import { WorkingDocumentsAcl } from "./workingDocuments.acl"; - -export namespace WorkingDocumentsConfigs { -export const workingDocumentsConfig = { - meta: { - title: "Working Documents", - }, - readAll: { - acl: WorkingDocumentsAcl.canUseList, - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - paginated: WorkingDocumentsQueries.useList, - infinite: WorkingDocumentsQueries.useListInfinite, - filters: { - schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, - filterDefs: dynamicInputs({ - schema: WorkingDocumentsModels.WorkingDocumentFilterDtoSchema, - options: { - inputs: { - search: true, - type: true, - }, - }, -}) - }, - columns: dynamicColumns({ - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - options: { - columns: { - id: true, - positionId: true, - name: true, - nameSuffix: true, - type: true, - referenceTable: true, - referenceId: true, - createdById: true, - createdAt: true, - createdBy: true, - }, - sortable: WorkingDocumentsModels.WorkingDocumentsListOrderParamEnumSchema, - }, -}), - }, - read: { - acl: WorkingDocumentsAcl.canUseFindById, - schema: WorkingDocumentsModels.WorkingDocumentResponseDTOSchema, - query: WorkingDocumentsQueries.useFindById, - }, -}; - -} diff --git a/test/generated/next/workingDocuments/workingDocuments.models.ts b/test/generated/next/workingDocuments/workingDocuments.models.ts deleted file mode 100644 index 3386fdc..0000000 --- a/test/generated/next/workingDocuments/workingDocuments.models.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsModels { -/** - * TypeEnumSchema - * @type { enum } - * @description Working document type - */ -export const TypeEnumSchema = z.enum(["export-declaration", "house-bl", "master-bl", "house-awb", "master-awb", "bl-instructions", "ams-instructions", "cmr-form", "fcr-form", "isf-form", "templated-document", "shipping-instructions"]); -export type TypeEnum = z.infer; -export const TypeEnum = TypeEnumSchema.enum; - -/** - * WorkingDocumentCreatedByResponseDTOSchema - * @type { object } - * @property { string } id Employee ID - * @property { string } name Employee name - */ -export const WorkingDocumentCreatedByResponseDTOSchema = z.object({ id: z.string(), name: z.string().nullable() }); -export type WorkingDocumentCreatedByResponseDTO = z.infer; - -/** - * WorkingDocumentResponseDTOSchema - * @type { object } - * @property { string } id - * @property { string } positionId Position ID - * @property { string } name Working document name - * @property { string } nameSuffix Working document name suffix - * @property { string } type Working document type - * @property { string } referenceTable Reference table - * @property { string } referenceId Reference ID - * @property { string } createdById Created by - * @property { string } createdAt Created at - * @property { WorkingDocumentCreatedByResponseDTO } createdBy Created by - */ -export const WorkingDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), type: TypeEnumSchema, referenceTable: z.string(), referenceId: z.string(), createdById: z.string(), createdAt: z.iso.datetime({ offset: true }), createdBy: WorkingDocumentCreatedByResponseDTOSchema }); -export type WorkingDocumentResponseDTO = z.infer; - -/** - * WorkingDocumentFilterDtoSchema - * @type { object } - * @property { string } search - * @property { string } type - */ -export const WorkingDocumentFilterDtoSchema = z.object({ search: z.string().nullable(), type: z.string().nullable() }).partial(); -export type WorkingDocumentFilterDto = z.infer; - -/** - * WorkingDocumentsListOrderParamEnumSchema - * @type { enum } - */ -export const WorkingDocumentsListOrderParamEnumSchema = z.enum(["NAME", "TYPE", "CREATED_AT", "UPDATED_AT"]); -export type WorkingDocumentsListOrderParamEnum = z.infer; -export const WorkingDocumentsListOrderParamEnum = WorkingDocumentsListOrderParamEnumSchema.enum; - -/** - * WorkingDocumentsListResponseSchema - * @type { object } - * @property { number } page 1-indexed page number to begin from - * @property { string } cursor ID of item to start after - * @property { string } nextCursor Cursor for next set of items - * @property { number } limit Items per response - * @property { number } totalItems Total available items - * @property { WorkingDocumentResponseDTO[] } items - */ -export const WorkingDocumentsListResponseSchema = z.object({ ...CommonModels.PaginationDtoSchema.shape, ...z.object({ items: z.array(WorkingDocumentResponseDTOSchema).nullable() }).partial().shape }); -export type WorkingDocumentsListResponse = z.infer; - -} diff --git a/test/generated/next/workingDocuments/workingDocuments.queries.ts b/test/generated/next/workingDocuments/workingDocuments.queries.ts deleted file mode 100644 index 0642218..0000000 --- a/test/generated/next/workingDocuments/workingDocuments.queries.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { useQuery, useInfiniteQuery } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsAcl } from "./workingDocuments.acl"; -import { AppQueryOptions, AppInfiniteQueryOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsModels } from "./workingDocuments.models"; -import { WorkingDocumentsApi } from "./workingDocuments.api"; - -export namespace WorkingDocumentsQueries { -export const moduleName = QueryModule.WorkingDocuments; - -export const keys = { - all: [moduleName] as const, - list: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", positionId, officeId, limit, order, filter, page, cursor] as const, - listInfinite: (positionId: string, officeId: string, limit?: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents", "infinite", positionId, officeId, limit, order, filter, cursor] as const, - findById: (positionId: string, id: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/working-documents/:id", positionId, id, officeId] as const, -}; - -/** - * Query `useList` - * @summary List working documents - * @permission Requires `canUseList` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` - * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useList = ({ positionId, officeId, limit, order, filter, page, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, page?: number, cursor?: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.list(positionId, officeId, limit, order, filter, page, cursor), - queryFn: () => { - checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, page, cursor) }, - ...options, - }); -}; - -/** - * Infinite query `useListInfinite - * @summary List working documents - * @permission Requires `canUseList` ability - * @param { string } object.positionId Path parameter - * @param { string } object.officeId Path parameter - * @param { number } object.limit Query parameter. Items per response. Minimum: `1`. Maximum: `100`. Default: `20` - * @param { string } object.order Query parameter. Order by fields (comma separated with +/- prefix): NAME, TYPE, CREATED_AT, UPDATED_AT. Example: `NAME` - * @param { WorkingDocumentsModels.WorkingDocumentFilterDto } object.filter Query parameter - * @param { number } object.page Query parameter. 1-indexed page number to begin from - * @param { string } object.cursor Query parameter. ID of item to start after - * @param { AppInfiniteQueryOptions } options Infinite query options - * @returns { UseInfiniteQueryResult } - * @statusCodes [200, 401] - */ -export const useListInfinite = ({ positionId, officeId, limit, order, filter, cursor }: { positionId: string, officeId: string, limit: number, order?: string, filter?: WorkingDocumentsModels.WorkingDocumentFilterDto, cursor?: string }, options?: AppInfiniteQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useInfiniteQuery({ - queryKey: keys.listInfinite(positionId, officeId, limit, order, filter, cursor), - queryFn: ({ pageParam }) => { - checkAcl(WorkingDocumentsAcl.canUseList({ officeId } )); - return WorkingDocumentsApi.list(positionId, officeId, limit, order, filter, pageParam, cursor) }, - initialPageParam: 1, - getNextPageParam: ({ page, totalItems, limit: limitParam }) => { - const pageParam = page ?? 1; - return pageParam * limitParam < totalItems ? pageParam + 1 : null; - }, - ...options, - }); -}; - -/** - * Query `useFindById` - * @summary Get working document by ID - * @permission Requires `canUseFindById` ability - * @param { string } object.positionId Path parameter - * @param { string } object.id Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401, 404] - */ -export const useFindById = ({ positionId, id, officeId }: { positionId: string, id: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.findById(positionId, id, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAcl.canUseFindById({ officeId } )); - return WorkingDocumentsApi.findById(positionId, id, officeId) }, - ...options, - }); -}; - -} diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts deleted file mode 100644 index 80d3476..0000000 --- a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsAmsInstructionsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Create", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useGetAMSInstructionsData` query ability. For global ability, omit the object parameter. - * @description Read AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetAMSInstructionsData` query - */ -export const canUseGetAMSInstructionsData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdateAMSInstructionsData` mutation ability. For global ability, omit the object parameter. - * @description Update AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateAMSInstructionsData` mutation - */ -export const canUseUpdateAMSInstructionsData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useDeleteAMSInstructions` mutation ability. For global ability, omit the object parameter. - * @description Delete AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteAMSInstructions` mutation - */ -export const canUseDeleteAMSInstructions = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Delete", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewAMSInstructions` query or `usePreviewAMSInstructionsMutation` mutation - */ -export const canUsePreviewAMSInstructions = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Read", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerateAMSInstructions` mutation ability. For global ability, omit the object parameter. - * @description Generate AMS Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateAMSInstructions` mutation - */ -export const canUseGenerateAMSInstructions = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-ams-instructions", object) : "WorkingDocument-ams-instructions" -] as AbilityTuple<"Update", "WorkingDocument-ams-instructions" | ForcedSubject<"WorkingDocument-ams-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts deleted file mode 100644 index 1cd287a..0000000 --- a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsAmsInstructionsApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions`, - - ) -}; -export const getAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - - ) -}; -export const updateAMSInstructionsData = (positionId: string, amsInstructionsId: string, officeId: string, data: WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsAmsInstructionsModels.AMSInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - ZodExtended.parse(WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTOSchema, data), - - ) -}; -export const deleteAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}`, - - ) -}; -export const previewAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateAMSInstructions = (positionId: string, amsInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/ams-instructions/${amsInstructionsId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts deleted file mode 100644 index 9f5e94c..0000000 --- a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.models.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsAmsInstructionsModels { -/** - * AMSInstructionsDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ -export const AMSInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type AMSInstructionsDocumentPortResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentCityResponseDTOSchema - * @type { object } - * @property { string } id ID of the city - * @property { string } name Name of the city - */ -export const AMSInstructionsDocumentCityResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type AMSInstructionsDocumentCityResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentSignedByResponseDTOSchema - * @type { object } - * @property { string } id ID of the employee - * @property { string } name Name of the employee - */ -export const AMSInstructionsDocumentSignedByResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type AMSInstructionsDocumentSignedByResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const AMSInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type AMSInstructionsDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * AMSInstructionsDocumentCargoDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { string } containerNumber Container number of the cargo - * @property { number } nrOfPackages Number of packages in the cargo - * @property { string } description Description of the cargo - * @property { number } weight Weight of the cargo - * @property { number } volume Volume of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - */ -export const AMSInstructionsDocumentCargoDTOSchema = z.object({ caseMarks: z.string().nullable(), containerNumber: z.string().nullable(), nrOfPackages: z.number().nullable(), description: z.string().nullable(), weight: z.number().nullable(), volume: z.number().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable() }).partial(); -export type AMSInstructionsDocumentCargoDTO = z.infer; - -/** - * AMSInstructionsDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the AMS Instructions document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the AMS Instructions document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } date Date of the AMS Instructions document - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { CommonModels.EditorContentResponseDto } additionalAMSText Additional AMS text - * @property { string } principalName Principal name - * @property { string } blNumber Bill of lading number - * @property { string } vessel Vessel - * @property { AMSInstructionsDocumentPortResponseDTO } portOfLoading Port of loading - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfDelivery Port of delivery - * @property { AMSInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfIssue Place of issue - * @property { string } dateOfIssue Date of issue - * @property { AMSInstructionsDocumentSignedByResponseDTO } signedBy Signed by - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } deliveryBusinessPartner Delivery business partner - * @property { AMSInstructionsDocumentCityResponseDTO } placeOfAcceptance Port of acceptance - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party - * @property { AMSInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Also notify party - * @property { string } applyTo Apply to - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string[] } availableContainerNumbers Available container numbers - * @property { string[] } selectedContainerNumbers Selected container numbers - * @property { string[] } selectedContainerLabels Selected container labels - * @property { AMSInstructionsDocumentCargoDTO[] } cargo Cargo information - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - */ -export const AMSInstructionsDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), versionNumber: z.number(), additionalAMSText: CommonModels.EditorContentResponseDtoSchema.nullish(), principalName: z.string().nullish(), blNumber: z.string().nullish(), vessel: z.string().nullish(), portOfLoading: AMSInstructionsDocumentPortResponseDTOSchema.nullish(), placeOfDelivery: AMSInstructionsDocumentCityResponseDTOSchema.nullish(), portOfDischarge: AMSInstructionsDocumentPortResponseDTOSchema.nullish(), placeOfIssue: AMSInstructionsDocumentCityResponseDTOSchema.nullish(), dateOfIssue: z.iso.datetime({ offset: true }).nullish(), signedBy: AMSInstructionsDocumentSignedByResponseDTOSchema.nullish(), deliveryBusinessPartner: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), placeOfAcceptance: AMSInstructionsDocumentCityResponseDTOSchema.nullish(), consignee: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), notify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), alsoNotify: AMSInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), applyTo: z.string().nullish(), suppressWeight: z.boolean().nullish(), suppressMeasurement: z.boolean().nullish(), availableContainerNumbers: z.array(z.string()).nullish(), selectedContainerNumbers: z.array(z.string()).nullish(), selectedContainerLabels: z.array(z.string()).nullish(), cargo: z.array(AMSInstructionsDocumentCargoDTOSchema).nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.DocumentConfigDTOSchema.nullish(), createdAt: z.iso.datetime({ offset: true }).nullish(), updatedAt: z.iso.datetime({ offset: true }).nullish() }); -export type AMSInstructionsDocumentResponseDTO = z.infer; - -/** - * UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateAMSInstructionsDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { CommonModels.EditorContentUpdateDto } additionalAMSText Additional AMS text - * @property { string } principalName Principal name - * @property { string } blNumber Bill of lading number - * @property { string } vessel Vessel - * @property { string } portOfLoadingId Port of loading id - * @property { string } placeOfDeliveryId Place of delivery id - * @property { string } portOfDischargeId Port of discharge id - * @property { string } placeOfIssueId Place of issue - * @property { string } dateOfIssue Date of issue - * @property { string } signedById Signed by employee ID - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } deliveryBusinessPartner Delivery business partner - * @property { string } placeOfAcceptanceId Port of acceptance - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party - * @property { UpdateAMSInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party - * @property { string } applyTo Apply to - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string[] } selectedContainerNumbers Selected container numbers - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { string } date Date of the AMS Instructions document - */ -export const UpdateAMSInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), additionalAMSText: CommonModels.EditorContentUpdateDtoSchema.nullable(), principalName: z.string().nullable(), blNumber: z.string().nullable(), vessel: z.string().nullable(), portOfLoadingId: z.string().nullable(), placeOfDeliveryId: z.string().nullable(), portOfDischargeId: z.string().nullable(), placeOfIssueId: z.string().nullable(), dateOfIssue: z.iso.datetime({ offset: true }).nullable(), signedById: z.string().nullable(), deliveryBusinessPartner: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), placeOfAcceptanceId: z.string().nullable(), consignee: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), notify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), alsoNotify: UpdateAMSInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), applyTo: z.string().nullable(), suppressWeight: z.boolean().nullable(), suppressMeasurement: z.boolean().nullable(), selectedContainerNumbers: z.array(z.string()).nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type UpdateAMSInstructionsDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts b/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts deleted file mode 100644 index 7af1284..0000000 --- a/test/generated/next/workingDocumentsAmsInstructions/workingDocumentsAmsInstructions.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsAmsInstructionsAcl } from "./workingDocumentsAmsInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsAmsInstructionsModels } from "./workingDocumentsAmsInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsAmsInstructionsApi } from "./workingDocumentsAmsInstructions.api"; - -export namespace WorkingDocumentsAmsInstructionsQueries { -export const moduleName = QueryModule.WorkingDocumentsAmsInstructions; - -export const keys = { - all: [moduleName] as const, - getAMSInstructionsData: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId", positionId, amsInstructionsId, officeId] as const, - previewAMSInstructions: (positionId: string, amsInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/ams-instructions/:amsInstructionsId/preview", positionId, amsInstructionsId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an AMS Instructions document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseCreate({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetAMSInstructionsData` - * @summary Get AMS Instructions document data - * @permission Requires `canUseGetAMSInstructionsData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.amsInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetAMSInstructionsData = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGetAMSInstructionsData({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.getAMSInstructionsData(positionId, amsInstructionsId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateAMSInstructionsData` - * @summary Update AMS Instructions document data - * @permission Requires `canUseUpdateAMSInstructionsData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsAmsInstructionsModels.UpdateAMSInstructionsDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateAMSInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseUpdateAMSInstructionsData({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.updateAMSInstructionsData(positionId, amsInstructionsId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, amsInstructionsId, officeId } = variables; - const updateKeys = [keys.getAMSInstructionsData(positionId, amsInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteAMSInstructions` - * @summary Delete AMS Instructions document - * @permission Requires `canUseDeleteAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } AMS Instructions document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseDeleteAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.deleteAMSInstructions(positionId, amsInstructionsId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewAMSInstructions` - recommended when file should be cached - * @summary Preview AMS Instructions document - * @permission Requires `canUsePreviewAMSInstructions` ability - * @param { string } object.positionId Path parameter - * @param { string } object.amsInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewAMSInstructions = ({ positionId, amsInstructionsId, officeId }: { positionId: string, amsInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewAMSInstructions(positionId, amsInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewAMSInstructionsMutation` - recommended when file should not be cached - * @summary Preview AMS Instructions document - * @permission Requires `canUsePreviewAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewAMSInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUsePreviewAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.previewAMSInstructions(positionId, amsInstructionsId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, amsInstructionsId, officeId } = variables; - const updateKeys = [keys.previewAMSInstructions(positionId, amsInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateAMSInstructions` - * @summary Generate AMS Instructions document - * @permission Requires `canUseGenerateAMSInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.amsInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateAMSInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, amsInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsAmsInstructionsAcl.canUseGenerateAMSInstructions({ officeId } )); - return WorkingDocumentsAmsInstructionsApi.generateAMSInstructions(positionId, amsInstructionsId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts deleted file mode 100644 index a026b68..0000000 --- a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsBlInstructionsAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Create", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGetBlInstructionsData` query ability. For global ability, omit the object parameter. - * @description Read BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetBlInstructionsData` query - */ -export const canUseGetBlInstructionsData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useUpdateBlInstructionsData` mutation ability. For global ability, omit the object parameter. - * @description Update BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateBlInstructionsData` mutation - */ -export const canUseUpdateBlInstructionsData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useDeleteBlInstructions` mutation ability. For global ability, omit the object parameter. - * @description Delete BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteBlInstructions` mutation - */ -export const canUseDeleteBlInstructions = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Delete", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewBlInstructions` query or `usePreviewBlInstructionsMutation` mutation - */ -export const canUsePreviewBlInstructions = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Read", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerateBlInstructions` mutation ability. For global ability, omit the object parameter. - * @description Generate BL Instructions document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateBlInstructions` mutation - */ -export const canUseGenerateBlInstructions = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -/** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate BL Instructions document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ -export const canUseGenerateDocumentEml = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-bl-instructions", object) : "WorkingDocument-bl-instructions" -] as AbilityTuple<"Update", "WorkingDocument-bl-instructions" | ForcedSubject<"WorkingDocument-bl-instructions"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts deleted file mode 100644 index 38303db..0000000 --- a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.api.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsBlInstructionsApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions`, - - ) -}; -export const getBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - - ) -}; -export const updateBlInstructionsData = (positionId: string, blInstructionsId: string, officeId: string, data: WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsBlInstructionsModels.BlInstructionsDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - ZodExtended.parse(WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTOSchema, data), - - ) -}; -export const deleteBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}`, - - ) -}; -export const previewBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateBlInstructions = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -export const generateDocumentEml = (positionId: string, blInstructionsId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/bl-instructions/${blInstructionsId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts deleted file mode 100644 index cfea1e8..0000000 --- a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.models.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsBlInstructionsModels { -/** - * BlInstructionsDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { string } date Date - * @property { string } location Location - * @property { string } signer Siger - */ -export const BlInstructionsDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), date: z.iso.datetime({ offset: true }).nullable(), location: z.string().nullable(), signer: z.string().nullable() }).partial(); -export type BlInstructionsDocumentSettingsDtoDTO = z.infer; - -/** - * BlInstructionsDocumentCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ -export const BlInstructionsDocumentCountryResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type BlInstructionsDocumentCountryResponseDTO = z.infer; - -/** - * BlInstructionsDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - * @property { string } eori EORI number of the business partner - * @property { string } vatNumber VAT number of the business partner - */ -export const BlInstructionsDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable(), eori: z.string().nullable(), vatNumber: z.string().nullable() }).partial(); -export type BlInstructionsDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * BlInstructionsDocumentPlaceResponseDTOSchema - * @type { object } - * @property { string } id ID of the place - * @property { string } name Name of the place - */ -export const BlInstructionsDocumentPlaceResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type BlInstructionsDocumentPlaceResponseDTO = z.infer; - -/** - * AllChargesEnumSchema - * @type { enum } - */ -export const AllChargesEnumSchema = z.enum(["Prepaid", "Collect", "Automatic", "Detailed"]); -export type AllChargesEnum = z.infer; -export const AllChargesEnum = AllChargesEnumSchema.enum; - -/** - * BlInstructionsDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - * @property { string } countryCode Country ISO2 code of the port - */ -export const BlInstructionsDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), countryCode: z.string().nullable() }).partial(); -export type BlInstructionsDocumentPortResponseDTO = z.infer; - -/** - * RequestedDocumentTypeEnumSchema - * @type { enum } - */ -export const RequestedDocumentTypeEnumSchema = z.enum(["SeawayBill", "Original"]); -export type RequestedDocumentTypeEnum = z.infer; -export const RequestedDocumentTypeEnum = RequestedDocumentTypeEnumSchema.enum; - -/** - * ManifestFilerStatusEnumSchema - * @type { enum } - */ -export const ManifestFilerStatusEnumSchema = z.enum(["Self", "Carrier"]); -export type ManifestFilerStatusEnum = z.infer; -export const ManifestFilerStatusEnum = ManifestFilerStatusEnumSchema.enum; - -/** - * BlInstructionsDocumentCountryDtoSchema - * @type { object } - * @property { string } id - * @property { string } name - */ -export const BlInstructionsDocumentCountryDtoSchema = z.object({ id: z.string(), name: z.string() }); -export type BlInstructionsDocumentCountryDto = z.infer; - -/** - * BlInstructionsDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the BL Instructions document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the BL Instructions document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } date Date of the BL Instructions document - * @property { string } blNumber Bill of lading number - * @property { string } exportReference Export reference number - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { BlInstructionsDocumentCountryResponseDTO } originCountry Origin country - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } additionalText Additional text for the document - * @property { number } versionNumber Version number of the document - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } buyer Buyer information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } seller Seller information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } forwarder Forwarder party information - * @property { BlInstructionsDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information - * @property { BlInstructionsDocumentPlaceResponseDTO } stowedIntoContainerCity Stowed into container city information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfAcceptanceCity Place of acceptance city information - * @property { BlInstructionsDocumentPlaceResponseDTO } originalsToBeReleasedAt - * @property { string } originalsToBeReleasedAtText - * @property { BlInstructionsDocumentPlaceResponseDTO } loadingPierTerminal - * @property { string } loadingPierTerminalText - * @property { string } precarriageByText - * @property { string } placeOfReceiptText - * @property { string } portOfLoadingText - * @property { string } portOfDischargeText - * @property { string } placeOfDeliveryText - * @property { string } vessel Name of the vessel - * @property { string } voyage Name of the vessel - * @property { CommonModels.MovementTypeEnum } movementType - * @property { string } carrierBookingNumber - * @property { string } csnNumber - * @property { string } mcinNumber - * @property { string } pcinNumber - * @property { string } dueNumber - * @property { boolean } goodsDeliveredInEu - * @property { string } rucNumber - * @property { number } shipmentDeclaredValue - * @property { string } shipmentDeclaredValueCurrency - * @property { AllChargesEnum } allCharges Base freight payment term - * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term - * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term - * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term - * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term - * @property { string } shippingInstructionsComments Free-text shipping instructions comments - * @property { string } chargePayerId Charge payer business partner ID - * @property { string } chargePayLocationId Charge pay location ID - * @property { BlInstructionsDocumentPortResponseDTO } portOfLoading Port of loading information - * @property { BlInstructionsDocumentPortResponseDTO } portOfDischarge Port of discharge information - * @property { BlInstructionsDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information - * @property { BlInstructionsDocumentSettingsDtoDTO } settings Settings for the BL Instructions document - * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data - * @property { CommonModels.CargoTableBlockDto } cargo Cargo table block (identical to House BL cargo) - * @property { string } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.DocumentConfigDTO } config Configuration settings for the document - * @property { RequestedDocumentTypeEnum } requestedDocumentType - * @property { boolean } requestedDocumentFreighted - * @property { number } requestedDocumentQuantity - * @property { ManifestFilerStatusEnum } manifestFilerStatus - * @property { string } manifestFilerIdentifier - * @property { BlInstructionsDocumentCountryDto } manifestFilingCountry - */ -export const BlInstructionsDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), date: z.iso.datetime({ offset: true }).nullish(), blNumber: z.string().nullish(), exportReference: z.string().nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), originCountry: BlInstructionsDocumentCountryResponseDTOSchema.nullish(), useLatterOfCredit: z.boolean().nullish(), additionalText: z.string().nullish(), versionNumber: z.number(), buyer: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), seller: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, shipper: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, notify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, alsoNotify: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, forwarder: BlInstructionsDocumentBusinessPartnerResponseDTOSchema, precarriageBy: BlInstructionsDocumentBusinessPartnerResponseDTOSchema.nullish(), placeOfReceipt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), stowedIntoContainerCity: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), placeOfAcceptanceCity: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAt: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAtText: z.string().nullish(), loadingPierTerminal: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), loadingPierTerminalText: z.string().nullish(), precarriageByText: z.string().nullish(), placeOfReceiptText: z.string().nullish(), portOfLoadingText: z.string().nullish(), portOfDischargeText: z.string().nullish(), placeOfDeliveryText: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), movementType: CommonModels.MovementTypeEnumSchema.nullish(), carrierBookingNumber: z.string().nullish(), csnNumber: z.string().nullish(), mcinNumber: z.string().nullish(), pcinNumber: z.string().nullish(), dueNumber: z.string().nullish(), goodsDeliveredInEu: z.boolean().nullish(), rucNumber: z.string().nullish(), shipmentDeclaredValue: z.number().nullish(), shipmentDeclaredValueCurrency: z.string().nullish(), allCharges: AllChargesEnumSchema.nullish(), baseFreight: CommonModels.ChargePaymentEnumSchema.nullish(), additionalCharges: CommonModels.ChargePaymentEnumSchema.nullish(), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullish(), originPortCharges: CommonModels.ChargePaymentEnumSchema.nullish(), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.nullish(), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullish(), shippingInstructionsComments: z.string().nullish(), chargePayerId: z.string().nullish(), chargePayLocationId: z.string().nullish(), portOfLoading: BlInstructionsDocumentPortResponseDTOSchema.nullish(), portOfDischarge: BlInstructionsDocumentPortResponseDTOSchema.nullish(), placeOfDelivery: BlInstructionsDocumentPlaceResponseDTOSchema.nullish(), settings: BlInstructionsDocumentSettingsDtoDTOSchema.nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.nullish(), cargo: CommonModels.CargoTableBlockDtoSchema.nullish(), bodyRemarks: z.string().nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.DocumentConfigDTOSchema, requestedDocumentType: RequestedDocumentTypeEnumSchema.nullish(), requestedDocumentFreighted: z.boolean().nullish(), requestedDocumentQuantity: z.number().nullish(), manifestFilerStatus: ManifestFilerStatusEnumSchema.nullish(), manifestFilerIdentifier: z.string().nullish(), manifestFilingCountry: BlInstructionsDocumentCountryDtoSchema.nullish() }); -export type BlInstructionsDocumentResponseDTO = z.infer; - -/** - * UpdateBlInstructionsDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { string } blNumber BL number - * @property { string } exportReference Export reference number - * @property { string } location Location - * @property { string } signer Signer - * @property { string } date Date - */ -export const UpdateBlInstructionsDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), blNumber: z.string().nullable(), exportReference: z.string().nullable(), location: z.string().nullable(), signer: z.string().nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type UpdateBlInstructionsDocumentSettingsRequestDTO = z.infer; - -/** - * UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateBlInstructionsDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateBlInstructionsDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } blNumber Bill of lading number - * @property { string } exportReference Export reference number - * @property { string } csnNumber - * @property { string } mcinNumber - * @property { string } pcinNumber - * @property { string } dueNumber - * @property { boolean } goodsDeliveredInEu - * @property { string } rucNumber - * @property { string } shipmentDeclaredValueCurrency - * @property { number } shipmentDeclaredValue - * @property { AllChargesEnum } allCharges All charges payment term - * @property { CommonModels.ChargePaymentEnum } baseFreight Base freight payment term - * @property { CommonModels.ChargePaymentEnum } additionalCharges Additional charges payment term - * @property { CommonModels.ChargePaymentEnum } originHaulageCharges Origin haulage charges payment term - * @property { CommonModels.ChargePaymentEnum } originPortCharges Origin port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationPortCharges Destination port charges payment term - * @property { CommonModels.ChargePaymentEnum } destinationHaulageCharges Destination haulage charges payment term - * @property { string } originCountryId Origin country ID - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } additionalText Additional text - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } buyer Buyer information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } seller Seller information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } forwarder Forwarder information - * @property { string } originalsToBeReleasedAtId Originals to be released at ID - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } notify Notify party information - * @property { UpdateBlInstructionsDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information - * @property { string } shippingInstructionsComments Shipping instructions free-text comments - * @property { string } chargePayerId Charge payer business partner ID - * @property { string } chargePayLocationId Charge pay location ID - * @property { string } precarriageById Pre-carriage by ID - * @property { string } placeOfReceiptId Place of receipt ID - * @property { string } stowedIntoContainerCityId Stowed into container city ID - * @property { string } loadingPierTerminalId Loading pier/terminal ID - * @property { string } loadingPierTerminalText - * @property { string } placeOfAcceptanceCityId Place of acceptance city ID - * @property { string } vessel Vessel name - * @property { string } voyage Vessel name - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } portOfLoadingId Port of loading ID - * @property { string } portOfDischargeId Port of discharge ID - * @property { string } placeOfDeliveryId Place of delivery ID - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { string } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { string } date Date of the BL Instructions document - * @property { UpdateBlInstructionsDocumentSettingsRequestDTO } settings Settings - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data - * @property { RequestedDocumentTypeEnum } requestedDocumentType - * @property { boolean } requestedDocumentFreighted - * @property { number } requestedDocumentQuantity - * @property { string } precarriageByText - * @property { string } placeOfReceiptText - * @property { string } portOfLoadingText - * @property { string } portOfDischargeText - * @property { string } placeOfDeliveryText - * @property { ManifestFilerStatusEnum } manifestFilerStatus - * @property { string } manifestFilingCountryId - * @property { string } manifestFilerIdentifier - */ -export const UpdateBlInstructionsDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), blNumber: z.string().nullable(), exportReference: z.string().nullable(), csnNumber: z.string().nullable(), mcinNumber: z.string().nullable(), pcinNumber: z.string().nullable(), dueNumber: z.string().nullable(), goodsDeliveredInEu: z.boolean().nullable(), rucNumber: z.string().nullable(), shipmentDeclaredValueCurrency: z.string().nullable(), shipmentDeclaredValue: z.number().nullable(), allCharges: AllChargesEnumSchema.nullable(), baseFreight: CommonModels.ChargePaymentEnumSchema.nullable(), additionalCharges: CommonModels.ChargePaymentEnumSchema.nullable(), originHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullable(), originPortCharges: CommonModels.ChargePaymentEnumSchema.nullable(), destinationPortCharges: CommonModels.ChargePaymentEnumSchema.nullable(), destinationHaulageCharges: CommonModels.ChargePaymentEnumSchema.nullable(), originCountryId: z.string().nullable(), useLatterOfCredit: z.boolean().nullable(), additionalText: z.string().nullable(), consignee: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), buyer: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), seller: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), forwarder: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), originalsToBeReleasedAtId: z.string().nullable(), originalsToBeReleasedAtText: z.string().nullable(), notify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), alsoNotify: UpdateBlInstructionsDocumentBusinessPartnerRequestDTOSchema.nullable(), shippingInstructionsComments: z.string().nullable(), chargePayerId: z.string().nullable(), chargePayLocationId: z.string().nullable(), precarriageById: z.string().nullable(), placeOfReceiptId: z.string().nullable(), stowedIntoContainerCityId: z.string().nullable(), loadingPierTerminalId: z.string().nullable(), loadingPierTerminalText: z.string().nullable(), placeOfAcceptanceCityId: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), carrierBookingNumber: z.string().nullable(), portOfLoadingId: z.string().nullable(), portOfDischargeId: z.string().nullable(), placeOfDeliveryId: z.string().nullable(), suppressWeight: z.boolean().nullable(), suppressMeasurement: z.boolean().nullable(), bodyRemarks: z.string().nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), date: z.iso.datetime({ offset: true }).nullable(), settings: UpdateBlInstructionsDocumentSettingsRequestDTOSchema.nullable(), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.nullable(), requestedDocumentType: RequestedDocumentTypeEnumSchema.nullable(), requestedDocumentFreighted: z.boolean().nullable(), requestedDocumentQuantity: z.number().nullable(), precarriageByText: z.string().nullable(), placeOfReceiptText: z.string().nullable(), portOfLoadingText: z.string().nullable(), portOfDischargeText: z.string().nullable(), placeOfDeliveryText: z.string().nullable(), manifestFilerStatus: ManifestFilerStatusEnumSchema.nullable(), manifestFilingCountryId: z.string().nullable(), manifestFilerIdentifier: z.string().nullable() }).partial(); -export type UpdateBlInstructionsDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts b/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts deleted file mode 100644 index fcc46e2..0000000 --- a/test/generated/next/workingDocumentsBlInstructions/workingDocumentsBlInstructions.queries.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsBlInstructionsAcl } from "./workingDocumentsBlInstructions.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsBlInstructionsModels } from "./workingDocumentsBlInstructions.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsBlInstructionsApi } from "./workingDocumentsBlInstructions.api"; - -export namespace WorkingDocumentsBlInstructionsQueries { -export const moduleName = QueryModule.WorkingDocumentsBlInstructions; - -export const keys = { - all: [moduleName] as const, - getBlInstructionsData: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId", positionId, blInstructionsId, officeId] as const, - previewBlInstructions: (positionId: string, blInstructionsId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/bl-instructions/:blInstructionsId/preview", positionId, blInstructionsId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a BL Instructions document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseCreate({ officeId } )); - return WorkingDocumentsBlInstructionsApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetBlInstructionsData` - * @summary Get BL Instructions document data - * @permission Requires `canUseGetBlInstructionsData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.blInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetBlInstructionsData = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getBlInstructionsData(positionId, blInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGetBlInstructionsData({ officeId } )); - return WorkingDocumentsBlInstructionsApi.getBlInstructionsData(positionId, blInstructionsId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateBlInstructionsData` - * @summary Update BL Instructions document data - * @permission Requires `canUseUpdateBlInstructionsData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsBlInstructionsModels.UpdateBlInstructionsDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateBlInstructionsData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseUpdateBlInstructionsData({ officeId } )); - return WorkingDocumentsBlInstructionsApi.updateBlInstructionsData(positionId, blInstructionsId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.getBlInstructionsData(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteBlInstructions` - * @summary Delete BL Instructions document - * @permission Requires `canUseDeleteBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } BL Instructions document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseDeleteBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.deleteBlInstructions(positionId, blInstructionsId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewBlInstructions` - recommended when file should be cached - * @summary Preview BL Instructions document - * @permission Requires `canUsePreviewBlInstructions` ability - * @param { string } object.positionId Path parameter - * @param { string } object.blInstructionsId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewBlInstructions = ({ positionId, blInstructionsId, officeId }: { positionId: string, blInstructionsId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewBlInstructions(positionId, blInstructionsId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewBlInstructionsMutation` - recommended when file should not be cached - * @summary Preview BL Instructions document - * @permission Requires `canUsePreviewBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewBlInstructionsMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUsePreviewBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.previewBlInstructions(positionId, blInstructionsId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateBlInstructions` - * @summary Generate BL Instructions document - * @permission Requires `canUseGenerateBlInstructions` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateBlInstructions = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateBlInstructions({ officeId } )); - return WorkingDocumentsBlInstructionsApi.generateBlInstructions(positionId, blInstructionsId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate BL Instructions document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.blInstructionsId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, blInstructionsId, officeId, data }) => { - checkAcl(WorkingDocumentsBlInstructionsAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsBlInstructionsApi.generateDocumentEml(positionId, blInstructionsId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, blInstructionsId, officeId } = variables; - const updateKeys = [keys.previewBlInstructions(positionId, blInstructionsId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts deleted file mode 100644 index 0454eb2..0000000 --- a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsCmrFormAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Create", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useGetCmrData` query ability. For global ability, omit the object parameter. - * @description Read CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetCmrData` query - */ -export const canUseGetCmrData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useUpdateCmrData` mutation ability. For global ability, omit the object parameter. - * @description Update CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateCmrData` mutation - */ -export const canUseUpdateCmrData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useDeleteCmr` mutation ability. For global ability, omit the object parameter. - * @description Delete CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteCmr` mutation - */ -export const canUseDeleteCmr = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Delete", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `usePreviewCmr` query or `usePreviewCmrMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewCmr` query or `usePreviewCmrMutation` mutation - */ -export const canUsePreviewCmr = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Read", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -/** - * Use for `useGenerateCmr` mutation ability. For global ability, omit the object parameter. - * @description Generate CMR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateCmr` mutation - */ -export const canUseGenerateCmr = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-cmr-form", object) : "WorkingDocument-cmr-form" -] as AbilityTuple<"Update", "WorkingDocument-cmr-form" | ForcedSubject<"WorkingDocument-cmr-form"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts deleted file mode 100644 index 2dc6978..0000000 --- a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsCmrFormApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs`, - - ) -}; -export const getCmrData = (positionId: string, cmrId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - - ) -}; -export const updateCmrData = (positionId: string, cmrId: string, officeId: string, data: WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsCmrFormModels.CmrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - ZodExtended.parse(WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTOSchema, data), - - ) -}; -export const deleteCmr = (positionId: string, cmrId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}`, - - ) -}; -export const previewCmr = (positionId: string, cmrId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateCmr = (positionId: string, cmrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/cmrs/${cmrId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts deleted file mode 100644 index c49f127..0000000 --- a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.models.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsCmrFormModels { -/** - * CmrDocumentLanguageSchema - * @type { enum } - */ -export const CmrDocumentLanguageSchema = z.enum(["en", "fr", "de"]); -export type CmrDocumentLanguage = z.infer; -export const CmrDocumentLanguage = CmrDocumentLanguageSchema.enum; - -/** - * CmrDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CmrDocumentLanguage } primaryLanguage Primary language - * @property { CmrDocumentLanguage } secondaryLanguage Secondary language - */ -export const CmrDocumentSettingsDtoDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.nullable(), secondaryLanguage: CmrDocumentLanguageSchema.nullable() }).partial(); -export type CmrDocumentSettingsDtoDTO = z.infer; - -/** - * CmrDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const CmrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type CmrDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * CmrDocumentCityResponseDTOSchema - * @type { object } - * @property { string } cityId ID of the city - * @property { string } cityName Name of the city - * @property { string } date Date of delivery/takeover - * @property { string } countryName Country name - */ -export const CmrDocumentCityResponseDTOSchema = z.object({ cityId: z.string(), cityName: z.string(), date: z.iso.datetime({ offset: true }).nullish(), countryName: z.string().nullish() }); -export type CmrDocumentCityResponseDTO = z.infer; - -/** - * CmrDocumentCostsResponseDTOSchema - * @type { object } - * @property { number } carriageCharges Carriage charges - * @property { number } reductions Reductions - * @property { number } balance Balance - * @property { number } supplements Supplements - * @property { number } miscellaneous Miscellaneous charges - * @property { number } total Total amount - */ -export const CmrDocumentCostsResponseDTOSchema = z.object({ carriageCharges: z.number().nullable(), reductions: z.number().nullable(), balance: z.number().nullable(), supplements: z.number().nullable(), miscellaneous: z.number().nullable(), total: z.number().nullable() }).partial(); -export type CmrDocumentCostsResponseDTO = z.infer; - -/** - * CmrDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { number } quantity Quantity of packages - * @property { string } description Description of the cargo - * @property { string } packageType - * @property { string } statisticNumber - * @property { string } positionNumber Position number of the cargo - * @property { number } grossWeight Gross weight of the cargo - * @property { number } volume Volume of the cargo - * @property { string } containerNumber Container number of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - */ -export const CmrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().nullable(), quantity: z.number().nullable(), description: z.string().nullable(), packageType: z.string().nullable(), statisticNumber: z.string().nullable(), positionNumber: z.string().nullable(), grossWeight: z.number().nullable(), volume: z.number().nullable(), containerNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable() }).partial(); -export type CmrDocumentCargoResponseDTO = z.infer; - -/** - * CmrDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } positionNumber Position number - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { number } versionNumber Version number of the document - * @property { string } cmrNumber CMR number - * @property { CmrDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { CmrDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { CmrDocumentBusinessPartnerResponseDTO } carrier Carrier information - * @property { CmrDocumentBusinessPartnerResponseDTO } successiveCarrier Successive carrier information - * @property { CmrDocumentCityResponseDTO } delivery Delivery information - * @property { CmrDocumentCityResponseDTO } takeover Takeover information - * @property { string } annexedDocuments Annexed documents - * @property { string } carriersObservations Carriers observations - * @property { string } senderInstructions Sender instructions - * @property { string } reimbursement Reimbursement information - * @property { string } specialAgreements Special agreements - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { boolean } freightPaid Whether freight is paid - * @property { boolean } freightToBePaid Whether freight is to be paid - * @property { string } creationPlace Place of creation - * @property { string } creationDate Date of creation - * @property { CmrDocumentCostsResponseDTO } costsForShipper Costs for shipper - * @property { CmrDocumentCostsResponseDTO } costsForConsignee Costs for consignee - * @property { string[] } selectedCargoIds List of selected cargo IDs - * @property { CmrDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CmrDocumentSettingsDtoDTO } settings Settings for the BL Instructions document - */ -export const CmrDocumentResponseDTOSchema = z.object({ id: z.string(), name: z.string(), positionNumber: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), positionId: z.string(), versionNumber: z.number(), cmrNumber: z.string().nullish(), consignee: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), carrier: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), successiveCarrier: CmrDocumentBusinessPartnerResponseDTOSchema.nullish(), delivery: CmrDocumentCityResponseDTOSchema.nullish(), takeover: CmrDocumentCityResponseDTOSchema.nullish(), annexedDocuments: z.string().nullish(), carriersObservations: z.string().nullish(), senderInstructions: z.string().nullish(), reimbursement: z.string().nullish(), specialAgreements: z.string().nullish(), suppressWeight: z.boolean(), suppressMeasurement: z.boolean(), freightPaid: z.boolean(), freightToBePaid: z.boolean(), creationPlace: z.string(), creationDate: z.string(), costsForShipper: CmrDocumentCostsResponseDTOSchema.nullish(), costsForConsignee: CmrDocumentCostsResponseDTOSchema.nullish(), selectedCargoIds: z.array(z.string()), cargo: z.array(CmrDocumentCargoResponseDTOSchema).nullish(), config: CommonModels.HBLDocumentConfigDtoSchema, bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), settings: CmrDocumentSettingsDtoDTOSchema.nullish() }); -export type CmrDocumentResponseDTO = z.infer; - -/** - * UpdateCmrDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CmrDocumentLanguage } primaryLanguage Primary language - * @property { CmrDocumentLanguage } secondaryLanguage Secondary language - */ -export const UpdateCmrDocumentSettingsRequestDTOSchema = z.object({ primaryLanguage: CmrDocumentLanguageSchema.nullable(), secondaryLanguage: CmrDocumentLanguageSchema.nullable() }).partial(); -export type UpdateCmrDocumentSettingsRequestDTO = z.infer; - -/** - * UpdateCmrDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateCmrDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateCmrDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateCmrDocumentDeliveryRequestDTOSchema - * @type { object } - * @property { string } cityId City ID - * @property { string } cityName City name - * @property { string } date Date - */ -export const UpdateCmrDocumentDeliveryRequestDTOSchema = z.object({ cityId: z.string().nullable(), cityName: z.string().nullable(), date: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type UpdateCmrDocumentDeliveryRequestDTO = z.infer; - -/** - * UpdateCmrDocumentCostsRequestDTOSchema - * @type { object } - * @property { number } carriageCharges Carriage charges - * @property { number } reductions Reductions - * @property { number } balance Balance - * @property { number } supplements Supplements - * @property { number } miscellaneous Miscellaneous - * @property { number } total Total - */ -export const UpdateCmrDocumentCostsRequestDTOSchema = z.object({ carriageCharges: z.number().nullable(), reductions: z.number().nullable(), balance: z.number().nullable(), supplements: z.number().nullable(), miscellaneous: z.number().nullable(), total: z.number().nullable() }).partial(); -export type UpdateCmrDocumentCostsRequestDTO = z.infer; - -/** - * UpdateCmrDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } cmrNumber CMR number - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } carrier Carrier information - * @property { UpdateCmrDocumentBusinessPartnerRequestDTO } successiveCarrier Successive carrier information - * @property { UpdateCmrDocumentDeliveryRequestDTO } delivery Delivery information - * @property { UpdateCmrDocumentDeliveryRequestDTO } takeover Takeover information - * @property { string } annexedDocuments Annexed documents - * @property { string } carriersObservations Carriers observations - * @property { string } senderInstructions Sender instructions - * @property { string } reimbursement Reimbursement - * @property { string } specialAgreements Special agreements - * @property { boolean } suppressWeight Whether to suppress weight information - * @property { boolean } suppressMeasurement Whether to suppress measurement information - * @property { boolean } freightPaid Whether freight is paid - * @property { boolean } freightToBePaid Whether freight is to be paid - * @property { string } creationPlace Place of creation - * @property { string } creationDate Date of creation - * @property { UpdateCmrDocumentCostsRequestDTO } costsForShipper Costs for shipper - * @property { UpdateCmrDocumentCostsRequestDTO } costsForConsignee Costs for consignee - * @property { string[] } selectedCargoIds Selected cargo IDs - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { UpdateCmrDocumentSettingsRequestDTO } settings Settings - */ -export const UpdateCmrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), cmrNumber: z.string().nullable(), consignee: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), carrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), successiveCarrier: UpdateCmrDocumentBusinessPartnerRequestDTOSchema.nullable(), delivery: UpdateCmrDocumentDeliveryRequestDTOSchema.nullable(), takeover: UpdateCmrDocumentDeliveryRequestDTOSchema.nullable(), annexedDocuments: z.string().nullable(), carriersObservations: z.string().nullable(), senderInstructions: z.string().nullable(), reimbursement: z.string().nullable(), specialAgreements: z.string().nullable(), suppressWeight: z.boolean().nullable(), suppressMeasurement: z.boolean().nullable(), freightPaid: z.boolean().nullable(), freightToBePaid: z.boolean().nullable(), creationPlace: z.string().nullable(), creationDate: z.string().nullable(), costsForShipper: UpdateCmrDocumentCostsRequestDTOSchema.nullable(), costsForConsignee: UpdateCmrDocumentCostsRequestDTOSchema.nullable(), selectedCargoIds: z.array(z.string()).nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), settings: UpdateCmrDocumentSettingsRequestDTOSchema.nullable() }).partial(); -export type UpdateCmrDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts b/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts deleted file mode 100644 index 15d2a7c..0000000 --- a/test/generated/next/workingDocumentsCmrForm/workingDocumentsCmrForm.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsCmrFormAcl } from "./workingDocumentsCmrForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsCmrFormModels } from "./workingDocumentsCmrForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsCmrFormApi } from "./workingDocumentsCmrForm.api"; - -export namespace WorkingDocumentsCmrFormQueries { -export const moduleName = QueryModule.WorkingDocumentsCmrForm; - -export const keys = { - all: [moduleName] as const, - getCmrData: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId", positionId, cmrId, officeId] as const, - previewCmr: (positionId: string, cmrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/cmrs/:cmrId/preview", positionId, cmrId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a CMR document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsCmrFormApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetCmrData` - * @summary Get CMR document data - * @permission Requires `canUseGetCmrData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.cmrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetCmrData = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getCmrData(positionId, cmrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseGetCmrData({ officeId } )); - return WorkingDocumentsCmrFormApi.getCmrData(positionId, cmrId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateCmrData` - * @summary Update CMR document data - * @permission Requires `canUseUpdateCmrData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsCmrFormModels.UpdateCmrDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateCmrData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId, data }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseUpdateCmrData({ officeId } )); - return WorkingDocumentsCmrFormApi.updateCmrData(positionId, cmrId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, cmrId, officeId } = variables; - const updateKeys = [keys.getCmrData(positionId, cmrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteCmr` - * @summary Delete CMR document - * @permission Requires `canUseDeleteCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } CMR document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteCmr = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseDeleteCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.deleteCmr(positionId, cmrId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewCmr` - recommended when file should be cached - * @summary Preview CMR document - * @permission Requires `canUsePreviewCmr` ability - * @param { string } object.positionId Path parameter - * @param { string } object.cmrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewCmr = ({ positionId, cmrId, officeId }: { positionId: string, cmrId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewCmr(positionId, cmrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewCmrMutation` - recommended when file should not be cached - * @summary Preview CMR document - * @permission Requires `canUsePreviewCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewCmrMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUsePreviewCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.previewCmr(positionId, cmrId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, cmrId, officeId } = variables; - const updateKeys = [keys.previewCmr(positionId, cmrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateCmr` - * @summary Generate CMR document - * @permission Requires `canUseGenerateCmr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.cmrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateCmr = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, cmrId, officeId, data }) => { - checkAcl(WorkingDocumentsCmrFormAcl.canUseGenerateCmr({ officeId } )); - return WorkingDocumentsCmrFormApi.generateCmr(positionId, cmrId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts deleted file mode 100644 index bd69b52..0000000 --- a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsExportDeclarationAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Create", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useGetExportDeclarationData` query ability. For global ability, omit the object parameter. - * @description Read export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetExportDeclarationData` query - */ -export const canUseGetExportDeclarationData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useUpdateExportDeclarationData` mutation ability. For global ability, omit the object parameter. - * @description Update export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateExportDeclarationData` mutation - */ -export const canUseUpdateExportDeclarationData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useDeleteExportDeclaration` mutation ability. For global ability, omit the object parameter. - * @description Delete export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteExportDeclaration` mutation - */ -export const canUseDeleteExportDeclaration = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Delete", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewExportDeclaration` query or `usePreviewExportDeclarationMutation` mutation - */ -export const canUsePreviewExportDeclaration = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Read", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -/** - * Use for `useGenerateExportDeclaration` mutation ability. For global ability, omit the object parameter. - * @description Generate export declaration document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateExportDeclaration` mutation - */ -export const canUseGenerateExportDeclaration = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-export-declaration", object) : "WorkingDocument-export-declaration" -] as AbilityTuple<"Update", "WorkingDocument-export-declaration" | ForcedSubject<"WorkingDocument-export-declaration"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts deleted file mode 100644 index 2b577d4..0000000 --- a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsExportDeclarationApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations`, - - ) -}; -export const getExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - - ) -}; -export const updateExportDeclarationData = (officeId: string, positionId: string, exportDeclarationId: string, data: WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsExportDeclarationModels.ExportDeclarationDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - ZodExtended.parse(WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTOSchema, data), - - ) -}; -export const deleteExportDeclaration = (positionId: string, exportDeclarationId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}`, - - ) -}; -export const previewExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateExportDeclaration = (officeId: string, positionId: string, exportDeclarationId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/export-declarations/${exportDeclarationId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts deleted file mode 100644 index 4394ac8..0000000 --- a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.models.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsExportDeclarationModels { -/** - * ExportDeclarationDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const ExportDeclarationDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type ExportDeclarationDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * ExportDeclarationDocumentCargoResponseDTOSchema - * @type { object } - * @property { number } quantity Quantity of packages - * @property { number } weight Weight of the cargo - * @property { number } length Length of the cargo - * @property { number } width Width of the cargo - * @property { number } height Height of the cargo - * @property { string } packageType Type of package - * @property { string } positionNumber Position number - */ -export const ExportDeclarationDocumentCargoResponseDTOSchema = z.object({ quantity: z.number(), weight: z.number(), length: z.number(), width: z.number(), height: z.number(), packageType: z.string(), positionNumber: z.string() }); -export type ExportDeclarationDocumentCargoResponseDTO = z.infer; - -/** - * ExportDeclarationDocumentRouteResponseDTOSchema - * @type { object } - * @property { string } pickupDate Pickup date - * @property { string } deliveryDate Delivery date - * @property { string } pickupCity Pickup city - * @property { string } deliveryCity Delivery city - */ -export const ExportDeclarationDocumentRouteResponseDTOSchema = z.object({ pickupDate: z.string(), deliveryDate: z.string(), pickupCity: z.string(), deliveryCity: z.string() }); -export type ExportDeclarationDocumentRouteResponseDTO = z.infer; - -/** - * ExportDeclarationDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the export declaration document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the export declaration document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } dateOfHandover Date when the goods are handed over for export - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { string } issuerName Name of the issuer - * @property { string } issuerAddress Address of the issuer - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } customer Customer information - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { string } selectedCargoId ID of the selected cargo - * @property { ExportDeclarationDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { ExportDeclarationDocumentRouteResponseDTO } route Route information - * @property { string } signingPlace Place where the document is signed - * @property { string } signingDate Date when the document is signed - * @property { ExportDeclarationDocumentBusinessPartnerResponseDTO } signedBy Information about who signed the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ -export const ExportDeclarationDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), dateOfHandover: z.iso.datetime({ offset: true }).nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), versionNumber: z.number(), issuerName: z.string().nullish(), issuerAddress: z.string().nullish(), customer: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), selectedCargoId: z.string().nullish(), cargo: z.array(ExportDeclarationDocumentCargoResponseDTOSchema).nullish(), route: ExportDeclarationDocumentRouteResponseDTOSchema.nullish(), signingPlace: z.string().nullish(), signingDate: z.iso.datetime({ offset: true }).nullish(), signedBy: ExportDeclarationDocumentBusinessPartnerResponseDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.HBLDocumentConfigDtoSchema.nullish() }); -export type ExportDeclarationDocumentResponseDTO = z.infer; - -/** - * UpdateExportDeclarationDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } dateOfHandover Date when goods are handed over for export - * @property { string } issuerName Name of the issuer - * @property { string } issuerAddress Address of the issuer - * @property { string } customerId Customer ID - * @property { string } customerAddress Customer address - * @property { string } shipperId Shipper ID - * @property { string } shipperAddress Shipper address - * @property { string } consigneeId Consignee ID - * @property { string } consigneeAddress Consignee address - * @property { string } selectedCargoId Selected cargo ID - * @property { string } signingPlace Place where the document is signed - * @property { string } signingDate Date when the document is signed - * @property { string } signedByEmployeeId ID of the employee who signed the document - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateExportDeclarationDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), dateOfHandover: z.iso.datetime({ offset: true }).nullable(), issuerName: z.string().nullable(), issuerAddress: z.string().nullable(), customerId: z.string().nullable(), customerAddress: z.string().nullable(), shipperId: z.string().nullable(), shipperAddress: z.string().nullable(), consigneeId: z.string().nullable(), consigneeAddress: z.string().nullable(), selectedCargoId: z.string().nullable(), signingPlace: z.string().nullable(), signingDate: z.iso.datetime({ offset: true }).nullable(), signedByEmployeeId: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateExportDeclarationDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts b/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts deleted file mode 100644 index 802056c..0000000 --- a/test/generated/next/workingDocumentsExportDeclaration/workingDocumentsExportDeclaration.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsExportDeclarationAcl } from "./workingDocumentsExportDeclaration.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsExportDeclarationModels } from "./workingDocumentsExportDeclaration.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsExportDeclarationApi } from "./workingDocumentsExportDeclaration.api"; - -export namespace WorkingDocumentsExportDeclarationQueries { -export const moduleName = QueryModule.WorkingDocumentsExportDeclaration; - -export const keys = { - all: [moduleName] as const, - getExportDeclarationData: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId", officeId, positionId, exportDeclarationId] as const, - previewExportDeclaration: (officeId: string, positionId: string, exportDeclarationId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/export-declarations/:exportDeclarationId/preview", officeId, positionId, exportDeclarationId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an export declaration document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseCreate({ officeId } )); - return WorkingDocumentsExportDeclarationApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetExportDeclarationData` - * @summary Get export declaration document data - * @permission Requires `canUseGetExportDeclarationData` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.exportDeclarationId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetExportDeclarationData = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getExportDeclarationData(officeId, positionId, exportDeclarationId), - queryFn: () => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGetExportDeclarationData({ officeId } )); - return WorkingDocumentsExportDeclarationApi.getExportDeclarationData(officeId, positionId, exportDeclarationId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateExportDeclarationData` - * @summary Update export declaration document data - * @permission Requires `canUseUpdateExportDeclarationData` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { WorkingDocumentsExportDeclarationModels.UpdateExportDeclarationDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateExportDeclarationData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseUpdateExportDeclarationData({ officeId } )); - return WorkingDocumentsExportDeclarationApi.updateExportDeclarationData(officeId, positionId, exportDeclarationId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, exportDeclarationId } = variables; - const updateKeys = [keys.getExportDeclarationData(officeId, positionId, exportDeclarationId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteExportDeclaration` - * @summary Delete export declaration document - * @permission Requires `canUseDeleteExportDeclaration` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Export declaration document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, exportDeclarationId, officeId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseDeleteExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.deleteExportDeclaration(positionId, exportDeclarationId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewExportDeclaration` - recommended when file should be cached - * @summary Preview export declaration document - * @permission Requires `canUsePreviewExportDeclaration` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.exportDeclarationId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewExportDeclaration = ({ officeId, positionId, exportDeclarationId }: { officeId: string, positionId: string, exportDeclarationId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewExportDeclaration(officeId, positionId, exportDeclarationId), - queryFn: () => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewExportDeclarationMutation` - recommended when file should not be cached - * @summary Preview export declaration document - * @permission Requires `canUsePreviewExportDeclaration` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewExportDeclarationMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUsePreviewExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.previewExportDeclaration(officeId, positionId, exportDeclarationId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, exportDeclarationId } = variables; - const updateKeys = [keys.previewExportDeclaration(officeId, positionId, exportDeclarationId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateExportDeclaration` - * @summary Generate export declaration document - * @permission Requires `canUseGenerateExportDeclaration` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.exportDeclarationId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateExportDeclaration = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, exportDeclarationId, data }) => { - checkAcl(WorkingDocumentsExportDeclarationAcl.canUseGenerateExportDeclaration({ officeId } )); - return WorkingDocumentsExportDeclarationApi.generateExportDeclaration(officeId, positionId, exportDeclarationId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts deleted file mode 100644 index 9c5da4d..0000000 --- a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsFcrFormAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Create", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useGetFcrData` query ability. For global ability, omit the object parameter. - * @description Read FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetFcrData` query - */ -export const canUseGetFcrData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useUpdateFcrData` mutation ability. For global ability, omit the object parameter. - * @description Update FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateFcrData` mutation - */ -export const canUseUpdateFcrData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useDeleteFcr` mutation ability. For global ability, omit the object parameter. - * @description Delete FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteFcr` mutation - */ -export const canUseDeleteFcr = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Delete", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `usePreviewFcr` query or `usePreviewFcrMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewFcr` query or `usePreviewFcrMutation` mutation - */ -export const canUsePreviewFcr = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Read", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -/** - * Use for `useGenerateFcr` mutation ability. For global ability, omit the object parameter. - * @description Generate FCR document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateFcr` mutation - */ -export const canUseGenerateFcr = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-fcr-form", object) : "WorkingDocument-fcr-form" -] as AbilityTuple<"Update", "WorkingDocument-fcr-form" | ForcedSubject<"WorkingDocument-fcr-form"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts deleted file mode 100644 index 3cc1061..0000000 --- a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsFcrFormApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs`, - - ) -}; -export const getFcrData = (positionId: string, fcrId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - - ) -}; -export const updateFcrData = (positionId: string, fcrId: string, officeId: string, data: WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsFcrFormModels.FcrDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - ZodExtended.parse(WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTOSchema, data), - - ) -}; -export const deleteFcr = (positionId: string, fcrId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}`, - - ) -}; -export const previewFcr = (positionId: string, fcrId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateFcr = (positionId: string, fcrId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/fcrs/${fcrId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts deleted file mode 100644 index 4979e6e..0000000 --- a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.models.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsFcrFormModels { -/** - * FcrDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const FcrDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type FcrDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * FcrDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } caseMarks Case marks of the cargo - * @property { string } containerNumber Container number - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - * @property { number } quantity Quantity of the cargo - * @property { string } description Description of the cargo - * @property { number } weight Weight of the cargo - * @property { number } volume Volume of the cargo - */ -export const FcrDocumentCargoResponseDTOSchema = z.object({ caseMarks: z.string().nullable(), containerNumber: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), quantity: z.number().nullable(), description: z.string().nullable(), weight: z.number().nullable(), volume: z.number().nullable() }).partial(); -export type FcrDocumentCargoResponseDTO = z.infer; - -/** - * FcrDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { number } versionNumber Version number of the document - * @property { string } fcrNumber FCR number - * @property { string } edvNumber EDV number - * @property { number } numberOfOriginals Number of originals - * @property { string } placeOfLoading Place of loading - * @property { string } dateOfLoading Date of loading - * @property { string } viaCity Via city - * @property { string } toDestination To destination - * @property { string } transportMode Transport mode - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } issuePlace Issue place - * @property { string } issueDate Issue date - * @property { string } deliveryTerms Delivery terms - * @property { FcrDocumentBusinessPartnerResponseDTO } shipper Shipper information - * @property { FcrDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { FcrDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ -export const FcrDocumentResponseDTOSchema = z.object({ id: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), positionId: z.string(), positionNumber: z.string(), versionNumber: z.number(), fcrNumber: z.string().nullish(), edvNumber: z.string().nullish(), numberOfOriginals: z.number(), placeOfLoading: z.string().nullish(), dateOfLoading: z.iso.datetime({ offset: true }).nullish(), viaCity: z.string().nullish(), toDestination: z.string().nullish(), transportMode: CommonModels.TransportModeEnumSchema, bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), issuePlace: z.string().nullish(), issueDate: z.iso.datetime({ offset: true }).nullish(), deliveryTerms: z.string().nullish(), shipper: FcrDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: FcrDocumentBusinessPartnerResponseDTOSchema.nullish(), cargo: z.array(FcrDocumentCargoResponseDTOSchema).nullish(), config: CommonModels.HBLDocumentConfigDtoSchema }); -export type FcrDocumentResponseDTO = z.infer; - -/** - * UpdateFcrDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } fcrNumber FCR number - * @property { string } edvNumber EDV number - * @property { number } numberOfOriginals Number of originals - * @property { string } placeOfLoading Place of loading - * @property { string } dateOfLoading Date of loading - * @property { string } viaCity Via city - * @property { string } toDestination To destination - * @property { string } transportMode Transport mode - * @property { string } issuePlace Issue place - * @property { string } issueDate Issue date - * @property { string } deliveryTerms Delivery terms - * @property { string } shipperId Shipper ID - * @property { string } shipperAddress Shipper address - * @property { string } consigneeId Consignee ID - * @property { string } consigneeAddress Consignee address - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateFcrDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), fcrNumber: z.string().nullable(), edvNumber: z.string().nullable(), numberOfOriginals: z.number().nullable(), placeOfLoading: z.string().nullable(), dateOfLoading: z.iso.datetime({ offset: true }).nullable(), viaCity: z.string().nullable(), toDestination: z.string().nullable(), transportMode: z.string().nullable(), issuePlace: z.string().nullable(), issueDate: z.iso.datetime({ offset: true }).nullable(), deliveryTerms: z.string().nullable(), shipperId: z.string().nullable(), shipperAddress: z.string().nullable(), consigneeId: z.string().nullable(), consigneeAddress: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateFcrDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts b/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts deleted file mode 100644 index 1e532d0..0000000 --- a/test/generated/next/workingDocumentsFcrForm/workingDocumentsFcrForm.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsFcrFormAcl } from "./workingDocumentsFcrForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsFcrFormModels } from "./workingDocumentsFcrForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsFcrFormApi } from "./workingDocumentsFcrForm.api"; - -export namespace WorkingDocumentsFcrFormQueries { -export const moduleName = QueryModule.WorkingDocumentsFcrForm; - -export const keys = { - all: [moduleName] as const, - getFcrData: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId", positionId, fcrId, officeId] as const, - previewFcr: (positionId: string, fcrId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/fcrs/:fcrId/preview", positionId, fcrId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an FCR document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsFcrFormApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetFcrData` - * @summary Get FCR document data - * @permission Requires `canUseGetFcrData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.fcrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetFcrData = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getFcrData(positionId, fcrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseGetFcrData({ officeId } )); - return WorkingDocumentsFcrFormApi.getFcrData(positionId, fcrId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateFcrData` - * @summary Update FCR document data - * @permission Requires `canUseUpdateFcrData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsFcrFormModels.UpdateFcrDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateFcrData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId, data }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseUpdateFcrData({ officeId } )); - return WorkingDocumentsFcrFormApi.updateFcrData(positionId, fcrId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, fcrId, officeId } = variables; - const updateKeys = [keys.getFcrData(positionId, fcrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteFcr` - * @summary Delete FCR document - * @permission Requires `canUseDeleteFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } FCR document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteFcr = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseDeleteFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.deleteFcr(positionId, fcrId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewFcr` - recommended when file should be cached - * @summary Preview FCR document - * @permission Requires `canUsePreviewFcr` ability - * @param { string } object.positionId Path parameter - * @param { string } object.fcrId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewFcr = ({ positionId, fcrId, officeId }: { positionId: string, fcrId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewFcr(positionId, fcrId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewFcrMutation` - recommended when file should not be cached - * @summary Preview FCR document - * @permission Requires `canUsePreviewFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewFcrMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUsePreviewFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.previewFcr(positionId, fcrId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, fcrId, officeId } = variables; - const updateKeys = [keys.previewFcr(positionId, fcrId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateFcr` - * @summary Generate FCR document - * @permission Requires `canUseGenerateFcr` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.fcrId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateFcr = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, fcrId, officeId, data }) => { - checkAcl(WorkingDocumentsFcrFormAcl.canUseGenerateFcr({ officeId } )); - return WorkingDocumentsFcrFormApi.generateFcr(positionId, fcrId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts deleted file mode 100644 index a7c5b44..0000000 --- a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsHouseAwbAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Create", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useGetHouseAwbData` query ability. For global ability, omit the object parameter. - * @description Read House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseAwbData` query - */ -export const canUseGetHouseAwbData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useUpdateHouseAwbData` mutation ability. For global ability, omit the object parameter. - * @description Update House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseAwbData` mutation - */ -export const canUseUpdateHouseAwbData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useDeleteHouseAwb` mutation ability. For global ability, omit the object parameter. - * @description Delete House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseAwb` mutation - */ -export const canUseDeleteHouseAwb = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Delete", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseAwb` query or `usePreviewHouseAwbMutation` mutation - */ -export const canUsePreviewHouseAwb = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Read", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -/** - * Use for `useGenerateHouseAwb` mutation ability. For global ability, omit the object parameter. - * @description Generate House AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseAwb` mutation - */ -export const canUseGenerateHouseAwb = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-awb", object) : "WorkingDocument-house-awb" -] as AbilityTuple<"Update", "WorkingDocument-house-awb" | ForcedSubject<"WorkingDocument-house-awb"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts deleted file mode 100644 index 11a3a68..0000000 --- a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseAwbApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs`, - - ) -}; -export const getHouseAwbData = (positionId: string, hawbId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - - ) -}; -export const updateHouseAwbData = (positionId: string, hawbId: string, officeId: string, data: WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsHouseAwbModels.HouseAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - ZodExtended.parse(WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTOSchema, data), - - ) -}; -export const deleteHouseAwb = (positionId: string, hawbId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}`, - - ) -}; -export const previewHouseAwb = (positionId: string, hawbId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateHouseAwb = (positionId: string, hawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/hawbs/${hawbId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts deleted file mode 100644 index 505f711..0000000 --- a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.models.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseAwbModels { -/** - * HouseAwbDocumentOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - * @property { string } name Name - */ -export const HouseAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullish(), sellRate: z.number(), name: z.string().nullish() }); -export type HouseAwbDocumentOtherChargeDTO = z.infer; - -/** - * HouseAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { number } totalOtherCharges Total other charges - * @property { number } total Total - * @property { HouseAwbDocumentOtherChargeDTO[] } otherCharges Other charges - */ -export const HouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number(), totalOtherCharges: z.number(), total: z.number(), otherCharges: z.array(HouseAwbDocumentOtherChargeDTOSchema) }); -export type HouseAwbDocumentChargesDTO = z.infer; - -/** - * HouseAwbDocumentCargoDTOSchema - * @type { object } - * @property { number } quantity Quantity - * @property { number } grossWeight Gross weight - * @property { string } rateClass Rate class - * @property { string } commodityItemNo Commodity item number - * @property { number } rateOrCharge Rate or charge - * @property { number } total Total - * @property { string } description Description - */ -export const HouseAwbDocumentCargoDTOSchema = z.object({ quantity: z.number(), grossWeight: z.number().nullish(), rateClass: z.string().nullish(), commodityItemNo: z.string().nullish(), rateOrCharge: z.number().nullish(), total: z.number().nullish(), description: z.string().nullish() }); -export type HouseAwbDocumentCargoDTO = z.infer; - -/** - * HouseAwbDocumentRouteDTOSchema - * @type { object } - * @property { string } airportOfDeparture Airport of departure - * @property { string } airportOfDestination Airport of destination - * @property { string } toAirport1 To airport 1 - * @property { string } byCarrier1 By carrier 1 - * @property { string } toAirport2 To airport 2 - * @property { string } byCarrier2 By carrier 2 - * @property { string } toAirport3 To airport 3 - * @property { string } byCarrier3 By carrier 3 - * @property { string } flightNumber1 Flight number 1 - * @property { string } flightDay1 Flight day 1 - * @property { string } flightNumber2 Flight number 2 - * @property { string } flightDay2 Flight day 2 - */ -export const HouseAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string(), airportOfDestination: z.string(), toAirport1: z.string().nullish(), byCarrier1: z.string().nullish(), toAirport2: z.string().nullish(), byCarrier2: z.string().nullish(), toAirport3: z.string().nullish(), byCarrier3: z.string().nullish(), flightNumber1: z.string().nullish(), flightDay1: z.string().nullish(), flightNumber2: z.string().nullish(), flightDay2: z.string().nullish() }); -export type HouseAwbDocumentRouteDTO = z.infer; - -/** - * HouseAwbDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const HouseAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type HouseAwbDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * HouseAwbDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the House AWB document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the House AWB document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } currency Currency - * @property { number } versionNumber Version number of the document - * @property { string } hawbNumber HAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { HouseAwbDocumentCargoDTO[] } cargo Cargo packages - * @property { HouseAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } signingLocation Signing location - * @property { string } issuerIataCode Issuer IATA code - * @property { HouseAwbDocumentRouteDTO } route Route - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } issuer Issuer - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { HouseAwbDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { CommonModels.DocumentConfigDTO } config Config - */ -export const HouseAwbDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), currency: z.string().nullish(), versionNumber: z.number(), hawbNumber: z.string().nullish(), sciReference: z.string().nullish(), reference1: z.string().nullish(), reference2: z.string().nullish(), reference3: z.string().nullish(), exchangeRate: z.number().nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.nullish(), handlingInstructions: z.string().nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.nullish(), additionalAccountingNotes: z.string().nullish(), isSecured: z.boolean(), suppressContainerWeight: z.boolean(), suppressCargoMeasurement: z.boolean(), cargo: z.array(HouseAwbDocumentCargoDTOSchema).nullish(), charges: HouseAwbDocumentChargesDTOSchema.nullish(), shipperSigner: z.string().nullish(), shipperSignerUserName: z.string().nullish(), signer: z.string().nullish(), signingDate: z.iso.datetime({ offset: true }).nullish(), signingLocation: z.string().nullish(), issuerIataCode: z.string().nullish(), route: HouseAwbDocumentRouteDTOSchema.nullish(), issuer: HouseAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), consignee: HouseAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: HouseAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), config: CommonModels.DocumentConfigDTOSchema.nullish() }); -export type HouseAwbDocumentResponseDTO = z.infer; - -/** - * UpdateHouseAwbDocumentChargesOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - */ -export const UpdateHouseAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullable(), sellRate: z.number().nullable() }).partial(); -export type UpdateHouseAwbDocumentChargesOtherChargeDTO = z.infer; - -/** - * UpdateHouseAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { UpdateHouseAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges - */ -export const UpdateHouseAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().nullable(), otherCharges: z.array(UpdateHouseAwbDocumentChargesOtherChargeDTOSchema).nullable() }).partial(); -export type UpdateHouseAwbDocumentChargesDTO = z.infer; - -/** - * UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateHouseAwbDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateHouseAwbDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } hawbNumber HAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { UpdateHouseAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } issuerId Issuer ID - * @property { string } issuerName Issuer name - * @property { string } issuerAddress Issuer address - * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateHouseAwbDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateHouseAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), hawbNumber: z.string().nullable(), sciReference: z.string().nullable(), reference1: z.string().nullable(), reference2: z.string().nullable(), reference3: z.string().nullable(), exchangeRate: z.number().nullable(), additionalText: CommonModels.EditorContentUpdateDtoSchema.nullable(), handlingInstructions: z.string().nullable(), accountInformation: CommonModels.AccountInformationEnumSchema.nullable(), additionalAccountingNotes: z.string().nullable(), isSecured: z.boolean().nullable(), suppressContainerWeight: z.boolean().nullable(), suppressCargoMeasurement: z.boolean().nullable(), charges: UpdateHouseAwbDocumentChargesDTOSchema.nullable(), shipperSigner: z.string().nullable(), shipperSignerUserName: z.string().nullable(), signer: z.string().nullable(), signingDate: z.iso.datetime({ offset: true }).nullable(), issuerId: z.string().nullable(), issuerName: z.string().nullable(), issuerAddress: z.string().nullable(), consignee: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateHouseAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateHouseAwbDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts b/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts deleted file mode 100644 index 2cb6a5e..0000000 --- a/test/generated/next/workingDocumentsHouseAwb/workingDocumentsHouseAwb.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsHouseAwbAcl } from "./workingDocumentsHouseAwb.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsHouseAwbModels } from "./workingDocumentsHouseAwb.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsHouseAwbApi } from "./workingDocumentsHouseAwb.api"; - -export namespace WorkingDocumentsHouseAwbQueries { -export const moduleName = QueryModule.WorkingDocumentsHouseAwb; - -export const keys = { - all: [moduleName] as const, - getHouseAwbData: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId", positionId, hawbId, officeId] as const, - previewHouseAwb: (positionId: string, hawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/hawbs/:hawbId/preview", positionId, hawbId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a House AWB document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseCreate({ officeId } )); - return WorkingDocumentsHouseAwbApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetHouseAwbData` - * @summary Get House AWB document data - * @permission Requires `canUseGetHouseAwbData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.hawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetHouseAwbData = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getHouseAwbData(positionId, hawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseGetHouseAwbData({ officeId } )); - return WorkingDocumentsHouseAwbApi.getHouseAwbData(positionId, hawbId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateHouseAwbData` - * @summary Update House AWB document data - * @permission Requires `canUseUpdateHouseAwbData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsHouseAwbModels.UpdateHouseAwbDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateHouseAwbData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseUpdateHouseAwbData({ officeId } )); - return WorkingDocumentsHouseAwbApi.updateHouseAwbData(positionId, hawbId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, hawbId, officeId } = variables; - const updateKeys = [keys.getHouseAwbData(positionId, hawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteHouseAwb` - * @summary Delete House AWB document - * @permission Requires `canUseDeleteHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } House AWB document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseDeleteHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.deleteHouseAwb(positionId, hawbId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewHouseAwb` - recommended when file should be cached - * @summary Preview House AWB document - * @permission Requires `canUsePreviewHouseAwb` ability - * @param { string } object.positionId Path parameter - * @param { string } object.hawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseAwb = ({ positionId, hawbId, officeId }: { positionId: string, hawbId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseAwb(positionId, hawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewHouseAwbMutation` - recommended when file should not be cached - * @summary Preview House AWB document - * @permission Requires `canUsePreviewHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUsePreviewHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.previewHouseAwb(positionId, hawbId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, hawbId, officeId } = variables; - const updateKeys = [keys.previewHouseAwb(positionId, hawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateHouseAwb` - * @summary Generate House AWB document - * @permission Requires `canUseGenerateHouseAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.hawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateHouseAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, hawbId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseAwbAcl.canUseGenerateHouseAwb({ officeId } )); - return WorkingDocumentsHouseAwbApi.generateHouseAwb(positionId, hawbId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts deleted file mode 100644 index 7e3bdd2..0000000 --- a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.acl.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsHouseBlAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Create", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useGetHouseBlData` query ability. For global ability, omit the object parameter. - * @description Read house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetHouseBlData` query - */ -export const canUseGetHouseBlData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useUpdateHouseBlData` mutation ability. For global ability, omit the object parameter. - * @description Update house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateHouseBlData` mutation - */ -export const canUseUpdateHouseBlData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useDeleteHouseBl` mutation ability. For global ability, omit the object parameter. - * @description Delete house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteHouseBl` mutation - */ -export const canUseDeleteHouseBl = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Delete", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBl` query or `usePreviewHouseBlMutation` mutation - */ -export const canUsePreviewHouseBl = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview house BL document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewHouseBlEml` query or `usePreviewHouseBlEmlMutation` mutation - */ -export const canUsePreviewHouseBlEml = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Read", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useGenerateHouseBl` mutation ability. For global ability, omit the object parameter. - * @description Generate house BL document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateHouseBl` mutation - */ -export const canUseGenerateHouseBl = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -/** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate house BL document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ -export const canUseGenerateDocumentEml = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-house-bl", object) : "WorkingDocument-house-bl" -] as AbilityTuple<"Update", "WorkingDocument-house-bl" | ForcedSubject<"WorkingDocument-house-bl"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts deleted file mode 100644 index 7f9ed62..0000000 --- a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.api.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseBlApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls`, - - ) -}; -export const getHouseBlData = (positionId: string, houseBlId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - - ) -}; -export const updateHouseBlData = (positionId: string, houseBlId: string, officeId: string, data: WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsHouseBlModels.HouseBlDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - ZodExtended.parse(WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTOSchema, data), - - ) -}; -export const deleteHouseBl = (positionId: string, houseBlId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}`, - - ) -}; -export const previewHouseBl = (positionId: string, houseBlId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const previewHouseBlEml = (positionId: string, houseBlId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/preview/eml`, - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateHouseBl = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -export const generateDocumentEml = (positionId: string, houseBlId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/house-bls/${houseBlId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts deleted file mode 100644 index cd3e571..0000000 --- a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.models.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsHouseBlModels { -/** - * HouseBlDocumentSettingsDtoDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { number } quantityOfCopies Quantity of copies - * @property { string } date Date - * @property { string } location Location - * @property { string } signer Signer - * @property { boolean } hideSignature Hide signature - * @property { boolean } capsLock Render issuer/signer in caps lock - * @property { string } documentTitle Document title - */ -export const HouseBlDocumentSettingsDtoDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), quantityOfCopies: z.number().nullable(), date: z.iso.datetime({ offset: true }).nullable(), location: z.string().nullable(), signer: z.string().nullable(), hideSignature: z.boolean().nullable(), capsLock: z.boolean().nullable(), documentTitle: z.string().nullable() }).partial(); -export type HouseBlDocumentSettingsDtoDTO = z.infer; - -/** - * HouseBlDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const HouseBlDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type HouseBlDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * HouseBlDocumentCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ -export const HouseBlDocumentCountryResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type HouseBlDocumentCountryResponseDTO = z.infer; - -/** - * HouseBlDocumentPlaceResponseDTOSchema - * @type { object } - * @property { string } id ID of the place - * @property { string } name Name of the place - */ -export const HouseBlDocumentPlaceResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type HouseBlDocumentPlaceResponseDTO = z.infer; - -/** - * HouseBlDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ -export const HouseBlDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type HouseBlDocumentPortResponseDTO = z.infer; - -/** - * HouseBlDocumentTerminalResponseDTOSchema - * @type { object } - * @property { string } id ID of the terminal - * @property { string } name Name of the terminal - */ -export const HouseBlDocumentTerminalResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type HouseBlDocumentTerminalResponseDTO = z.infer; - -/** - * HouseBlDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the house BL document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the house BL document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } blNumber Bill of lading number - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } exportReference Export reference number - * @property { HouseBlDocumentBusinessPartnerResponseDTO } forwarder Forwarder information for the shipment - * @property { HouseBlDocumentCountryResponseDTO } originCountry Origin country - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { CommonModels.EditorContentResponseDto } additionalTextTop Additional text for the document - * @property { string } direction Direction of the shipment (e.g., import/export) - * @property { string } transportMode Mode of transport for the shipment - * @property { number } versionNumber Version number of the document - * @property { HouseBlDocumentBusinessPartnerResponseDTO } consignee Consignee information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } shipper Shipper information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } cargoReleaseBy Delivery agent information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } notify Notify party information for the shipment - * @property { HouseBlDocumentBusinessPartnerResponseDTO } alsoNotify Additional notify party information - * @property { HouseBlDocumentBusinessPartnerResponseDTO } precarriageBy Pre-carriage by information - * @property { string } precarriageByText Pre-carriage by free-text override - * @property { HouseBlDocumentPlaceResponseDTO } placeOfReceipt Place of receipt information - * @property { string } placeOfReceiptText Place of receipt free-text override - * @property { string } vessel Name of the vessel - * @property { string } voyage Voyage number of the vessel - * @property { string } declaredValue Declared value of the shipment - * @property { number } rateOfExchange Rate of exchange of the shipment - * @property { string } currency Currency of the shipment - * @property { string } freightPayable Freight payable of the shipment - * @property { string } issuer Issuer - * @property { HouseBlDocumentPortResponseDTO } portOfLoading Port of loading information - * @property { string } portOfLoadingText Port of loading free-text override - * @property { HouseBlDocumentTerminalResponseDTO } loadingPierTerminal Loading pier/terminal information - * @property { string } loadingPierTerminalText Loading pier/terminal free-text override - * @property { HouseBlDocumentPortResponseDTO } portOfDischarge Port of discharge information - * @property { string } portOfDischargeText Port of discharge free-text override - * @property { HouseBlDocumentPlaceResponseDTO } placeOfDelivery Place of delivery information - * @property { string } placeOfDeliveryText Place of delivery free-text override - * @property { HouseBlDocumentPlaceResponseDTO } originalsToBeReleasedAt Originals to be released at information - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { string } typeOfMove Type of move - * @property { string } placeOfIssue - * @property { CommonModels.TemplatedDocumentDataDto } data Templated document data - * @property { HouseBlDocumentSettingsDtoDTO } settings Settings for the House BL document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - */ -export const HouseBlDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string().nullish(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), blNumber: z.string().nullish(), carrierBookingNumber: z.string().nullish(), exportReference: z.string().nullish(), forwarder: HouseBlDocumentBusinessPartnerResponseDTOSchema.nullish(), originCountry: HouseBlDocumentCountryResponseDTOSchema.nullish(), useLatterOfCredit: z.boolean().nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.nullish(), additionalTextTop: CommonModels.EditorContentResponseDtoSchema.nullish(), direction: CommonModels.DirectionEnumSchema.nullish(), transportMode: CommonModels.TransportModeEnumSchema.nullish(), versionNumber: z.number(), consignee: HouseBlDocumentBusinessPartnerResponseDTOSchema, shipper: HouseBlDocumentBusinessPartnerResponseDTOSchema, cargoReleaseBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.nullish(), notify: HouseBlDocumentBusinessPartnerResponseDTOSchema, alsoNotify: HouseBlDocumentBusinessPartnerResponseDTOSchema, precarriageBy: HouseBlDocumentBusinessPartnerResponseDTOSchema.nullish(), precarriageByText: z.string().nullish(), placeOfReceipt: HouseBlDocumentPlaceResponseDTOSchema.nullish(), placeOfReceiptText: z.string().nullish(), vessel: z.string().nullish(), voyage: z.string().nullish(), declaredValue: z.string().nullish(), rateOfExchange: z.number().nullish(), currency: z.string().nullish(), freightPayable: z.string().nullish(), issuer: z.string().nullish(), portOfLoading: HouseBlDocumentPortResponseDTOSchema.nullish(), portOfLoadingText: z.string().nullish(), loadingPierTerminal: HouseBlDocumentTerminalResponseDTOSchema.nullish(), loadingPierTerminalText: z.string().nullish(), portOfDischarge: HouseBlDocumentPortResponseDTOSchema.nullish(), portOfDischargeText: z.string().nullish(), placeOfDelivery: HouseBlDocumentPlaceResponseDTOSchema.nullish(), placeOfDeliveryText: z.string().nullish(), originalsToBeReleasedAt: HouseBlDocumentPlaceResponseDTOSchema.nullish(), originalsToBeReleasedAtText: z.string().nullish(), typeOfMove: z.string().nullish(), placeOfIssue: z.string().nullish(), data: CommonModels.TemplatedDocumentDataDtoSchema.nullish(), settings: HouseBlDocumentSettingsDtoDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), config: CommonModels.HBLDocumentConfigDtoSchema }); -export type HouseBlDocumentResponseDTO = z.infer; - -/** - * UpdateHouseBlDocumentSettingsRequestDTOSchema - * @type { object } - * @property { CommonModels.QuantityOfOriginalBlDocumentsEnum } quantityOfOriginals Quantity of originals - * @property { number } quantityOfCopies Quantity of copies - * @property { string } blNumber BL number - * @property { string } exportReference Export reference number - * @property { string } location Location - * @property { string } signer Signer - * @property { boolean } hideSignature Hide signature - * @property { boolean } capsLock Render issuer/signer in caps lock - * @property { string } date Date - * @property { string } documentTitle Document title - */ -export const UpdateHouseBlDocumentSettingsRequestDTOSchema = z.object({ quantityOfOriginals: CommonModels.QuantityOfOriginalBlDocumentsEnumSchema.nullable(), quantityOfCopies: z.number().nullable(), blNumber: z.string().nullable(), exportReference: z.string().nullable(), location: z.string().nullable(), signer: z.string().nullable(), hideSignature: z.boolean().nullable(), capsLock: z.boolean().nullable(), date: z.iso.datetime({ offset: true }).nullable(), documentTitle: z.string().nullable() }).partial(); -export type UpdateHouseBlDocumentSettingsRequestDTO = z.infer; - -/** - * UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateHouseBlDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateHouseBlDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } blNumber Bill of lading number - * @property { string } carrierBookingNumber Carrier booking number - * @property { string } exportReference Export reference number - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } forwarder Forwarder information - * @property { string } originCountryId Origin country ID - * @property { boolean } useLatterOfCredit Whether to use letter of credit - * @property { string } declaredValue Declared value - * @property { number } rateOfExchange Rate of exchange - * @property { string } freightPayable Freight payable - * @property { string } issuer Issuer - * @property { string } placeOfIssue Place of issue - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text - * @property { CommonModels.EditorContentUpdateDto } additionalTextTop Additional text top - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } shipper Shipper information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } notify Notify party information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } cargoReleaseBy Cargo release party information - * @property { UpdateHouseBlDocumentBusinessPartnerRequestDTO } alsoNotify Also notify party information - * @property { string } precarriageById Pre-carriage by ID - * @property { string } precarriageByText Pre-carriage by free-text override - * @property { string } placeOfReceiptId Place of receipt ID - * @property { string } placeOfReceiptText Place of receipt free-text override - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } portOfLoadingId Port of loading ID - * @property { string } portOfLoadingText Port of loading free-text override - * @property { string } loadingPierTerminalId Loading pier/terminal ID - * @property { string } loadingPierTerminalText Loading pier/terminal free-text override - * @property { string } portOfDischargeId Port of discharge ID - * @property { string } portOfDischargeText Port of discharge free-text override - * @property { string } placeOfDeliveryId Place of delivery ID - * @property { string } placeOfDeliveryText Place of delivery free-text override - * @property { string } originalsToBeReleasedAtId Originals to be released at ID - * @property { string } originalsToBeReleasedAtText Originals to be released at free-text override - * @property { string } typeOfMove Type of move - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - * @property { UpdateHouseBlDocumentSettingsRequestDTO } settings Settings - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data House BL templated document data - */ -export const UpdateHouseBlDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), blNumber: z.string().nullable(), carrierBookingNumber: z.string().nullable(), exportReference: z.string().nullable(), forwarder: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), originCountryId: z.string().nullable(), useLatterOfCredit: z.boolean().nullable(), declaredValue: z.string().nullable(), rateOfExchange: z.number().nullable(), freightPayable: z.string().nullable(), issuer: z.string().nullable(), placeOfIssue: z.string().nullable(), additionalText: CommonModels.EditorContentUpdateDtoSchema.nullable(), additionalTextTop: CommonModels.EditorContentUpdateDtoSchema.nullable(), consignee: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), notify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), cargoReleaseBy: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), alsoNotify: UpdateHouseBlDocumentBusinessPartnerRequestDTOSchema.nullable(), precarriageById: z.string().nullable(), precarriageByText: z.string().nullable(), placeOfReceiptId: z.string().nullable(), placeOfReceiptText: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), portOfLoadingId: z.string().nullable(), portOfLoadingText: z.string().nullable(), loadingPierTerminalId: z.string().nullable(), loadingPierTerminalText: z.string().nullable(), portOfDischargeId: z.string().nullable(), portOfDischargeText: z.string().nullable(), placeOfDeliveryId: z.string().nullable(), placeOfDeliveryText: z.string().nullable(), originalsToBeReleasedAtId: z.string().nullable(), originalsToBeReleasedAtText: z.string().nullable(), typeOfMove: z.string().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), settings: UpdateHouseBlDocumentSettingsRequestDTOSchema.nullable(), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.nullable() }).partial(); -export type UpdateHouseBlDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts b/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts deleted file mode 100644 index 17f207b..0000000 --- a/test/generated/next/workingDocumentsHouseBl/workingDocumentsHouseBl.queries.ts +++ /dev/null @@ -1,296 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsHouseBlAcl } from "./workingDocumentsHouseBl.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsHouseBlModels } from "./workingDocumentsHouseBl.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsHouseBlApi } from "./workingDocumentsHouseBl.api"; - -export namespace WorkingDocumentsHouseBlQueries { -export const moduleName = QueryModule.WorkingDocumentsHouseBl; - -export const keys = { - all: [moduleName] as const, - getHouseBlData: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId", positionId, houseBlId, officeId] as const, - previewHouseBl: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview", positionId, houseBlId, officeId] as const, - previewHouseBlEml: (positionId: string, houseBlId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/house-bls/:houseBlId/preview/eml", positionId, houseBlId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a house BL document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseCreate({ officeId } )); - return WorkingDocumentsHouseBlApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetHouseBlData` - * @summary Get house BL document data - * @permission Requires `canUseGetHouseBlData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetHouseBlData = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getHouseBlData(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGetHouseBlData({ officeId } )); - return WorkingDocumentsHouseBlApi.getHouseBlData(positionId, houseBlId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateHouseBlData` - * @summary Update house BL document data - * @permission Requires `canUseUpdateHouseBlData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsHouseBlModels.UpdateHouseBlDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateHouseBlData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseUpdateHouseBlData({ officeId } )); - return WorkingDocumentsHouseBlApi.updateHouseBlData(positionId, houseBlId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.getHouseBlData(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteHouseBl` - * @summary Delete house BL document - * @permission Requires `canUseDeleteHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } House BL document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteHouseBl = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseDeleteHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.deleteHouseBl(positionId, houseBlId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewHouseBl` - recommended when file should be cached - * @summary Preview house BL document - * @permission Requires `canUsePreviewHouseBl` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBl = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseBl(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewHouseBlMutation` - recommended when file should not be cached - * @summary Preview house BL document - * @permission Requires `canUsePreviewHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBl(positionId, houseBlId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewHouseBlEml` - recommended when file should be cached - * @summary Preview house BL document and return EML file - * @permission Requires `canUsePreviewHouseBlEml` ability - * @param { string } object.positionId Path parameter - * @param { string } object.houseBlId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBlEml = ({ positionId, houseBlId, officeId }: { positionId: string, houseBlId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewHouseBlEml(positionId, houseBlId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewHouseBlEmlMutation` - recommended when file should not be cached - * @summary Preview house BL document and return EML file - * @permission Requires `canUsePreviewHouseBlEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewHouseBlEmlMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUsePreviewHouseBlEml({ officeId } )); - return WorkingDocumentsHouseBlApi.previewHouseBlEml(positionId, houseBlId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateHouseBl` - * @summary Generate house BL document - * @permission Requires `canUseGenerateHouseBl` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateHouseBl = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateHouseBl({ officeId } )); - return WorkingDocumentsHouseBlApi.generateHouseBl(positionId, houseBlId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate house BL document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.houseBlId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, houseBlId, officeId, data }) => { - checkAcl(WorkingDocumentsHouseBlAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsHouseBlApi.generateDocumentEml(positionId, houseBlId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, houseBlId, officeId } = variables; - const updateKeys = [keys.previewHouseBl(positionId, houseBlId, officeId), keys.previewHouseBlEml(positionId, houseBlId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts deleted file mode 100644 index 99aadd5..0000000 --- a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsIsfFormAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Create", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useGetIsfData` query ability. For global ability, omit the object parameter. - * @description Read ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetIsfData` query - */ -export const canUseGetIsfData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useUpdateIsfData` mutation ability. For global ability, omit the object parameter. - * @description Update ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateIsfData` mutation - */ -export const canUseUpdateIsfData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useDeleteIsf` mutation ability. For global ability, omit the object parameter. - * @description Delete ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteIsf` mutation - */ -export const canUseDeleteIsf = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Delete", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `usePreviewIsf` query or `usePreviewIsfMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewIsf` query or `usePreviewIsfMutation` mutation - */ -export const canUsePreviewIsf = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Read", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -/** - * Use for `useGenerateIsf` mutation ability. For global ability, omit the object parameter. - * @description Generate ISF document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateIsf` mutation - */ -export const canUseGenerateIsf = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-isf-form", object) : "WorkingDocument-isf-form" -] as AbilityTuple<"Update", "WorkingDocument-isf-form" | ForcedSubject<"WorkingDocument-isf-form"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts deleted file mode 100644 index ca27547..0000000 --- a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsIsfFormApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs`, - - ) -}; -export const getIsfData = (positionId: string, isfId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - - ) -}; -export const updateIsfData = (positionId: string, isfId: string, officeId: string, data: WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsIsfFormModels.IsfDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - ZodExtended.parse(WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTOSchema, data), - - ) -}; -export const deleteIsf = (positionId: string, isfId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}`, - - ) -}; -export const previewIsf = (positionId: string, isfId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateIsf = (positionId: string, isfId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/isfs/${isfId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts deleted file mode 100644 index 2133bc5..0000000 --- a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.models.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsIsfFormModels { -/** - * IsfDocumentCargoCountryResponseDTOSchema - * @type { object } - * @property { string } id ID of the country - * @property { string } name Name of the country - */ -export const IsfDocumentCargoCountryResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type IsfDocumentCargoCountryResponseDTO = z.infer; - -/** - * IsfDocumentCargoResponseDTOSchema - * @type { object } - * @property { string } productCode Product code of the cargo - * @property { string } descriptionOfGoods Description of goods - * @property { string } htsCode HTS code of the cargo - * @property { string } manufacturerSupplier Manufacturer supplier of the cargo - * @property { string } seal1 Seal number 1 of the cargo - * @property { string } seal2 Seal number 2 of the cargo - * @property { IsfDocumentCargoCountryResponseDTO } countryOfOrigin Country of origin of the cargo - */ -export const IsfDocumentCargoResponseDTOSchema = z.object({ productCode: z.string().nullable(), descriptionOfGoods: z.string().nullable(), htsCode: z.string().nullable(), manufacturerSupplier: z.string().nullable(), seal1: z.string().nullable(), seal2: z.string().nullable(), countryOfOrigin: IsfDocumentCargoCountryResponseDTOSchema.nullable() }).partial(); -export type IsfDocumentCargoResponseDTO = z.infer; - -/** - * IsfDocumentPortResponseDTOSchema - * @type { object } - * @property { string } id ID of the port - * @property { string } name Name of the port - */ -export const IsfDocumentPortResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable() }).partial(); -export type IsfDocumentPortResponseDTO = z.infer; - -/** - * IsfDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - * @property { string } number Number of the business partner - */ -export const IsfDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable(), number: z.string().nullable() }).partial(); -export type IsfDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * IsfDocumentContainerLocationResponseDTOSchema - * @type { object } - * @property { string } id ID of the container location - * @property { string } name Name of the container location - * @property { string } address Address of the container location - */ -export const IsfDocumentContainerLocationResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type IsfDocumentContainerLocationResponseDTO = z.infer; - -/** - * IsfDocumentResponseDTOSchema - * @type { object } - * @property { string } id ID of the document - * @property { string } name Name of the document - * @property { string } nameSuffix Name suffix of the document - * @property { string } defaultFileName - * @property { string } positionId Position ID - * @property { string } positionNumber Position number - * @property { number } versionNumber Version number of the document - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } hBLNumber HBL number - * @property { string } mBLNumber MBL number - * @property { string } scacCodeHBL SCAC code for HBL - * @property { string } scacCodeMBL SCAC code for MBL - * @property { IsfDocumentPortResponseDTO } portOfDischarge Port of discharge - * @property { string } issueLocation Issue location - * @property { string } issueDate Issue date - * @property { string } companyName Company name - * @property { object } completedBy - * @property { string } completedBy.name - * @property { string } completedBy.email - * @property { object } container - * @property { string } container.id - * @property { string } container.name - * @property { IsfDocumentBusinessPartnerResponseDTO } consignee Consignee information - * @property { IsfDocumentBusinessPartnerResponseDTO } manufacturer Manufacturer information - * @property { IsfDocumentBusinessPartnerResponseDTO } seller Seller information - * @property { IsfDocumentBusinessPartnerResponseDTO } buyer Buyer information - * @property { IsfDocumentBusinessPartnerResponseDTO } consolidator Consolidator information - * @property { IsfDocumentContainerLocationResponseDTO } containerLocation Container location information - * @property { IsfDocumentBusinessPartnerResponseDTO } shipTo Ship to information - * @property { IsfDocumentBusinessPartnerResponseDTO } importer Importer information - * @property { IsfDocumentCargoResponseDTO[] } cargo List of cargo information - * @property { CommonModels.HBLDocumentConfigDto } config Configuration settings for the document - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - */ -export const IsfDocumentResponseDTOSchema = z.object({ id: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), positionId: z.string(), positionNumber: z.string(), versionNumber: z.number(), vessel: z.string().nullish(), voyage: z.string().nullish(), hBLNumber: z.string().nullish(), mBLNumber: z.string().nullish(), scacCodeHBL: z.string().nullish(), scacCodeMBL: z.string().nullish(), portOfDischarge: IsfDocumentPortResponseDTOSchema.nullish(), issueLocation: z.string().nullish(), issueDate: z.iso.datetime({ offset: true }).nullish(), companyName: z.string().nullish(), completedBy: z.object({ name: z.string(), email: z.string() }).nullish(), container: z.object({ id: z.string(), name: z.string() }).nullish(), consignee: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), manufacturer: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), seller: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), buyer: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), consolidator: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), containerLocation: IsfDocumentContainerLocationResponseDTOSchema.nullish(), shipTo: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), importer: IsfDocumentBusinessPartnerResponseDTOSchema.nullish(), cargo: z.array(IsfDocumentCargoResponseDTOSchema).nullish(), config: CommonModels.HBLDocumentConfigDtoSchema, bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish() }); -export type IsfDocumentResponseDTO = z.infer; - -/** - * UpdateIsfDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - * @property { string } number Business partner number - */ -export const UpdateIsfDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable(), number: z.string().nullable() }).partial(); -export type UpdateIsfDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateIsfDocumentCargoRequestDTOSchema - * @type { object } - * @property { string } productCode Product code - * @property { string } descriptionOfGoods Description of goods - * @property { string } htsCode HTS code - * @property { string } manufacturerSupplier Manufacturer supplier - * @property { string } countryOfOriginId Country of origin ID - */ -export const UpdateIsfDocumentCargoRequestDTOSchema = z.object({ productCode: z.string().nullable(), descriptionOfGoods: z.string().nullable(), htsCode: z.string().nullable(), manufacturerSupplier: z.string().nullable(), countryOfOriginId: z.string().nullable() }).partial(); -export type UpdateIsfDocumentCargoRequestDTO = z.infer; - -/** - * UpdateIsfDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Name suffix - * @property { string } vessel Vessel name - * @property { string } voyage Voyage number - * @property { string } hBLNumber HBL number - * @property { string } mBLNumber MBL number - * @property { string } scacCodeHBL SCAC code for HBL - * @property { string } scacCodeMBL SCAC code for MBL - * @property { string } portOfDischargeId Port of discharge Id - * @property { string } issueLocation Issue location - * @property { string } issueDate Issue date - * @property { string } companyName Company name - * @property { string } completedByName Completed by name - * @property { string } completedByEmail Completed by email - * @property { string } containerId Container ID - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consignee Consignee information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } manufacturer Manufacturer information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } seller Seller information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } buyer Buyer information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } consolidator Consolidator information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } containerLocation Container location information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } shipTo Ship to information - * @property { UpdateIsfDocumentBusinessPartnerRequestDTO } importer Importer information - * @property { UpdateIsfDocumentCargoRequestDTO[] } cargo Cargo information - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateIsfDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), vessel: z.string().nullable(), voyage: z.string().nullable(), hBLNumber: z.string().nullable(), mBLNumber: z.string().nullable(), scacCodeHBL: z.string().nullable(), scacCodeMBL: z.string().nullable(), portOfDischargeId: z.string().nullable(), issueLocation: z.string().nullable(), issueDate: z.iso.datetime({ offset: true }).nullable(), companyName: z.string().nullable(), completedByName: z.string().nullable(), completedByEmail: z.string().nullable(), containerId: z.string().nullable(), consignee: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), manufacturer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), seller: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), buyer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), consolidator: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), containerLocation: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), shipTo: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), importer: UpdateIsfDocumentBusinessPartnerRequestDTOSchema.nullable(), cargo: z.array(UpdateIsfDocumentCargoRequestDTOSchema).nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateIsfDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts b/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts deleted file mode 100644 index c190b46..0000000 --- a/test/generated/next/workingDocumentsIsfForm/workingDocumentsIsfForm.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsIsfFormAcl } from "./workingDocumentsIsfForm.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsIsfFormModels } from "./workingDocumentsIsfForm.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsIsfFormApi } from "./workingDocumentsIsfForm.api"; - -export namespace WorkingDocumentsIsfFormQueries { -export const moduleName = QueryModule.WorkingDocumentsIsfForm; - -export const keys = { - all: [moduleName] as const, - getIsfData: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId", positionId, isfId, officeId] as const, - previewIsf: (positionId: string, isfId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/isfs/:isfId/preview", positionId, isfId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create an ISF document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseCreate({ officeId } )); - return WorkingDocumentsIsfFormApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetIsfData` - * @summary Get ISF document data - * @permission Requires `canUseGetIsfData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.isfId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetIsfData = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getIsfData(positionId, isfId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseGetIsfData({ officeId } )); - return WorkingDocumentsIsfFormApi.getIsfData(positionId, isfId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateIsfData` - * @summary Update ISF document data - * @permission Requires `canUseUpdateIsfData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsIsfFormModels.UpdateIsfDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateIsfData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId, data }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseUpdateIsfData({ officeId } )); - return WorkingDocumentsIsfFormApi.updateIsfData(positionId, isfId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, isfId, officeId } = variables; - const updateKeys = [keys.getIsfData(positionId, isfId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteIsf` - * @summary Delete ISF document - * @permission Requires `canUseDeleteIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } ISF document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteIsf = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseDeleteIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.deleteIsf(positionId, isfId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewIsf` - recommended when file should be cached - * @summary Preview ISF document - * @permission Requires `canUsePreviewIsf` ability - * @param { string } object.positionId Path parameter - * @param { string } object.isfId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewIsf = ({ positionId, isfId, officeId }: { positionId: string, isfId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewIsf(positionId, isfId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewIsfMutation` - recommended when file should not be cached - * @summary Preview ISF document - * @permission Requires `canUsePreviewIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewIsfMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUsePreviewIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.previewIsf(positionId, isfId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, isfId, officeId } = variables; - const updateKeys = [keys.previewIsf(positionId, isfId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateIsf` - * @summary Generate ISF document - * @permission Requires `canUseGenerateIsf` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.isfId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateIsf = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, isfId, officeId, data }) => { - checkAcl(WorkingDocumentsIsfFormAcl.canUseGenerateIsf({ officeId } )); - return WorkingDocumentsIsfFormApi.generateIsf(positionId, isfId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts deleted file mode 100644 index 10d4871..0000000 --- a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.acl.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsMasterAwbAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Create", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useGetMasterAwbData` query ability. For global ability, omit the object parameter. - * @description Read Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetMasterAwbData` query - */ -export const canUseGetMasterAwbData = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useUpdateMasterAwbData` mutation ability. For global ability, omit the object parameter. - * @description Update Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateMasterAwbData` mutation - */ -export const canUseUpdateMasterAwbData = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useDeleteMasterAwb` mutation ability. For global ability, omit the object parameter. - * @description Delete Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteMasterAwb` mutation - */ -export const canUseDeleteMasterAwb = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Delete", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation ability. For global ability, omit the object parameter. - * @description Preview Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewMasterAwb` query or `usePreviewMasterAwbMutation` mutation - */ -export const canUsePreviewMasterAwb = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Read", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -/** - * Use for `useGenerateMasterAwb` mutation ability. For global ability, omit the object parameter. - * @description Generate Master AWB document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateMasterAwb` mutation - */ -export const canUseGenerateMasterAwb = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-master-awb", object) : "WorkingDocument-master-awb" -] as AbilityTuple<"Update", "WorkingDocument-master-awb" | ForcedSubject<"WorkingDocument-master-awb"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts deleted file mode 100644 index 274642e..0000000 --- a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.api.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsMasterAwbApi { -export const create = (positionId: string, officeId: string, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs`, - - ) -}; -export const getMasterAwbData = (positionId: string, mawbId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - - ) -}; -export const updateMasterAwbData = (positionId: string, mawbId: string, officeId: string, data: WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsMasterAwbModels.MasterAwbDocumentResponseDTOSchema }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - ZodExtended.parse(WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTOSchema, data), - - ) -}; -export const deleteMasterAwb = (positionId: string, mawbId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}`, - - ) -}; -export const previewMasterAwb = (positionId: string, mawbId: string, officeId: string, ) => { - return AppRestClient.get( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/preview`, - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const generateMasterAwb = (positionId: string, mawbId: string, officeId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/mawbs/${mawbId}/generate`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -} diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts deleted file mode 100644 index 02909ab..0000000 --- a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.models.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsMasterAwbModels { -/** - * MasterAwbDocumentOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - * @property { string } name Name - */ -export const MasterAwbDocumentOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullish(), sellRate: z.number(), name: z.string().nullish() }); -export type MasterAwbDocumentOtherChargeDTO = z.infer; - -/** - * MasterAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { number } totalOtherCharges Total other charges - * @property { number } total Total - * @property { MasterAwbDocumentOtherChargeDTO[] } otherCharges Other charges - */ -export const MasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number(), totalOtherCharges: z.number(), total: z.number(), otherCharges: z.array(MasterAwbDocumentOtherChargeDTOSchema) }); -export type MasterAwbDocumentChargesDTO = z.infer; - -/** - * MasterAwbDocumentCargoDTOSchema - * @type { object } - * @property { number } quantity Quantity - * @property { number } grossWeight Gross weight - * @property { string } rateClass Rate class - * @property { string } commodityItemNo Commodity item number - * @property { number } rateOrCharge Rate or charge - * @property { number } total Total - * @property { string } description Description - */ -export const MasterAwbDocumentCargoDTOSchema = z.object({ quantity: z.number(), grossWeight: z.number().nullish(), rateClass: z.string().nullish(), commodityItemNo: z.string().nullish(), rateOrCharge: z.number().nullish(), total: z.number().nullish(), description: z.string().nullish() }); -export type MasterAwbDocumentCargoDTO = z.infer; - -/** - * MasterAwbDocumentRouteDTOSchema - * @type { object } - * @property { string } airportOfDeparture Airport of departure - * @property { string } airportOfDestination Airport of destination - * @property { string } toAirport1 To airport 1 - * @property { string } byCarrier1 By carrier 1 - * @property { string } toAirport2 To airport 2 - * @property { string } byCarrier2 By carrier 2 - * @property { string } toAirport3 To airport 3 - * @property { string } byCarrier3 By carrier 3 - * @property { string } flightNumber1 Flight number 1 - * @property { string } flightDay1 Flight day 1 - * @property { string } flightNumber2 Flight number 2 - * @property { string } flightDay2 Flight day 2 - */ -export const MasterAwbDocumentRouteDTOSchema = z.object({ airportOfDeparture: z.string(), airportOfDestination: z.string(), toAirport1: z.string().nullish(), byCarrier1: z.string().nullish(), toAirport2: z.string().nullish(), byCarrier2: z.string().nullish(), toAirport3: z.string().nullish(), byCarrier3: z.string().nullish(), flightNumber1: z.string().nullish(), flightDay1: z.string().nullish(), flightNumber2: z.string().nullish(), flightDay2: z.string().nullish() }); -export type MasterAwbDocumentRouteDTO = z.infer; - -/** - * MasterAwbDocumentBusinessPartnerResponseDTOSchema - * @type { object } - * @property { string } id ID of the business partner - * @property { string } name Name of the business partner - * @property { string } address Address of the business partner - */ -export const MasterAwbDocumentBusinessPartnerResponseDTOSchema = z.object({ id: z.string().nullable(), name: z.string().nullable(), address: z.string().nullable() }).partial(); -export type MasterAwbDocumentBusinessPartnerResponseDTO = z.infer; - -/** - * MasterAwbDocumentResponseDTOSchema - * @type { object } - * @property { string } id Unique identifier of the Master AWB document - * @property { string } positionId Unique identifier of the position this document belongs to - * @property { string } positionNumber Position number for reference - * @property { string } name Name of the Master AWB document - * @property { string } nameSuffix Suffix to be added to the document name - * @property { string } defaultFileName - * @property { string } currency Currency - * @property { number } versionNumber Version number of the document - * @property { string } mawbNumber MAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { CommonModels.EditorContentResponseDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { MasterAwbDocumentCargoDTO[] } cargo Cargo packages - * @property { MasterAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } signingLocation Signing location - * @property { string } issuerIataCode Issuer IATA code - * @property { number } exchangeRate Exchange rate - * @property { MasterAwbDocumentRouteDTO } route Route - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } consignee Consignee - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } shipper Shipper - * @property { MasterAwbDocumentBusinessPartnerResponseDTO } issuer Issuer - * @property { CommonModels.EditorContentResponseDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentResponseDto } footerRemarks Footer remarks - * @property { string } createdAt Created at - * @property { string } updatedAt Updated at - * @property { CommonModels.DocumentConfigDTO } config Config - */ -export const MasterAwbDocumentResponseDTOSchema = z.object({ id: z.string(), positionId: z.string(), positionNumber: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), currency: z.string().nullish(), versionNumber: z.number(), mawbNumber: z.string().nullish(), sciReference: z.string().nullish(), reference1: z.string().nullish(), reference2: z.string().nullish(), reference3: z.string().nullish(), additionalText: CommonModels.EditorContentResponseDtoSchema.nullish(), handlingInstructions: z.string().nullish(), accountInformation: CommonModels.AccountInformationEnumSchema.nullish(), additionalAccountingNotes: z.string().nullish(), isSecured: z.boolean(), suppressContainerWeight: z.boolean(), suppressCargoMeasurement: z.boolean(), cargo: z.array(MasterAwbDocumentCargoDTOSchema).nullish(), charges: MasterAwbDocumentChargesDTOSchema.nullish(), shipperSigner: z.string().nullish(), shipperSignerUserName: z.string().nullish(), signer: z.string().nullish(), signingDate: z.iso.datetime({ offset: true }).nullish(), signingLocation: z.string().nullish(), issuerIataCode: z.string().nullish(), exchangeRate: z.number().nullish(), route: MasterAwbDocumentRouteDTOSchema.nullish(), consignee: MasterAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), shipper: MasterAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), issuer: MasterAwbDocumentBusinessPartnerResponseDTOSchema.nullish(), bodyRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), footerRemarks: CommonModels.EditorContentResponseDtoSchema.nullish(), createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), config: CommonModels.DocumentConfigDTOSchema.nullish() }); -export type MasterAwbDocumentResponseDTO = z.infer; - -/** - * UpdateMasterAwbDocumentChargesOtherChargeDTOSchema - * @type { object } - * @property { string } chargeTypeId Charge type ID - * @property { number } sellRate Sell rate - */ -export const UpdateMasterAwbDocumentChargesOtherChargeDTOSchema = z.object({ chargeTypeId: z.string().nullable(), sellRate: z.number().nullable() }).partial(); -export type UpdateMasterAwbDocumentChargesOtherChargeDTO = z.infer; - -/** - * UpdateMasterAwbDocumentChargesDTOSchema - * @type { object } - * @property { number } weightCharge Weight charge - * @property { UpdateMasterAwbDocumentChargesOtherChargeDTO[] } otherCharges Other charges - */ -export const UpdateMasterAwbDocumentChargesDTOSchema = z.object({ weightCharge: z.number().nullable(), otherCharges: z.array(UpdateMasterAwbDocumentChargesOtherChargeDTOSchema).nullable() }).partial(); -export type UpdateMasterAwbDocumentChargesDTO = z.infer; - -/** - * UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema - * @type { object } - * @property { string } id Business partner ID - * @property { string } address Business partner address - */ -export const UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema = z.object({ id: z.string().nullable(), address: z.string().nullable() }).partial(); -export type UpdateMasterAwbDocumentBusinessPartnerRequestDTO = z.infer; - -/** - * UpdateMasterAwbDocumentRequestDTOSchema - * @type { object } - * @property { string } nameSuffix Document name suffix - * @property { string } mawbNumber MAWB number - * @property { string } sciReference SCI reference - * @property { string } reference1 Reference 1 - * @property { string } reference2 Reference 2 - * @property { string } reference3 Reference 3 - * @property { CommonModels.EditorContentUpdateDto } additionalText Additional text for the document - * @property { string } handlingInstructions Handling instructions - * @property { string } accountInformation Account information - * @property { string } additionalAccountingNotes Additional accounting notes - * @property { boolean } isSecured Is secured - * @property { boolean } suppressContainerWeight Suppress container weight - * @property { boolean } suppressCargoMeasurement Suppress cargo measurement - * @property { UpdateMasterAwbDocumentChargesDTO } charges Charges - * @property { string } shipperSigner Shipper signer - * @property { string } shipperSignerUserName Shipper signer user name - * @property { string } signer Signer - * @property { string } signingDate Signing date - * @property { string } issuerId Issuer ID - * @property { string } issuerName Issuer name - * @property { string } issuerAddress Issuer address - * @property { string } issuerCity Issuer city - * @property { string } issuerIataCode Issuer IATA code - * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } consignee Consignee - * @property { UpdateMasterAwbDocumentBusinessPartnerRequestDTO } shipper Shipper - * @property { number } exchangeRate Exchange rate - * @property { CommonModels.EditorContentUpdateDto } bodyRemarks Body remarks - * @property { CommonModels.EditorContentUpdateDto } footerRemarks Footer remarks - */ -export const UpdateMasterAwbDocumentRequestDTOSchema = z.object({ nameSuffix: z.string().nullable(), mawbNumber: z.string().nullable(), sciReference: z.string().nullable(), reference1: z.string().nullable(), reference2: z.string().nullable(), reference3: z.string().nullable(), additionalText: CommonModels.EditorContentUpdateDtoSchema.nullable(), handlingInstructions: z.string().nullable(), accountInformation: CommonModels.AccountInformationEnumSchema.nullable(), additionalAccountingNotes: z.string().nullable(), isSecured: z.boolean().nullable(), suppressContainerWeight: z.boolean().nullable(), suppressCargoMeasurement: z.boolean().nullable(), charges: UpdateMasterAwbDocumentChargesDTOSchema.nullable(), shipperSigner: z.string().nullable(), shipperSignerUserName: z.string().nullable(), signer: z.string().nullable(), signingDate: z.iso.datetime({ offset: true }).nullable(), issuerId: z.string().nullable(), issuerName: z.string().nullable(), issuerAddress: z.string().nullable(), issuerCity: z.string().nullable(), issuerIataCode: z.string().nullable(), consignee: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), shipper: UpdateMasterAwbDocumentBusinessPartnerRequestDTOSchema.nullable(), exchangeRate: z.number().nullable(), bodyRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable(), footerRemarks: CommonModels.EditorContentUpdateDtoSchema.nullable() }).partial(); -export type UpdateMasterAwbDocumentRequestDTO = z.infer; - -} diff --git a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts b/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts deleted file mode 100644 index 57207fc..0000000 --- a/test/generated/next/workingDocumentsMasterAwb/workingDocumentsMasterAwb.queries.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsMasterAwbAcl } from "./workingDocumentsMasterAwb.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsMasterAwbModels } from "./workingDocumentsMasterAwb.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsMasterAwbApi } from "./workingDocumentsMasterAwb.api"; - -export namespace WorkingDocumentsMasterAwbQueries { -export const moduleName = QueryModule.WorkingDocumentsMasterAwb; - -export const keys = { - all: [moduleName] as const, - getMasterAwbData: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId", positionId, mawbId, officeId] as const, - previewMasterAwb: (positionId: string, mawbId: string, officeId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/mawbs/:mawbId/preview", positionId, mawbId, officeId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a Master AWB document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseCreate({ officeId } )); - return WorkingDocumentsMasterAwbApi.create(positionId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetMasterAwbData` - * @summary Get Master AWB document data - * @permission Requires `canUseGetMasterAwbData` ability - * @param { string } object.positionId Path parameter - * @param { string } object.mawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetMasterAwbData = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getMasterAwbData(positionId, mawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseGetMasterAwbData({ officeId } )); - return WorkingDocumentsMasterAwbApi.getMasterAwbData(positionId, mawbId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateMasterAwbData` - * @summary Update Master AWB document data - * @permission Requires `canUseUpdateMasterAwbData` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsMasterAwbModels.UpdateMasterAwbDocumentRequestDTO } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateMasterAwbData = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId, data }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseUpdateMasterAwbData({ officeId } )); - return WorkingDocumentsMasterAwbApi.updateMasterAwbData(positionId, mawbId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, mawbId, officeId } = variables; - const updateKeys = [keys.getMasterAwbData(positionId, mawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteMasterAwb` - * @summary Delete Master AWB document - * @permission Requires `canUseDeleteMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Master AWB document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseDeleteMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.deleteMasterAwb(positionId, mawbId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `usePreviewMasterAwb` - recommended when file should be cached - * @summary Preview Master AWB document - * @permission Requires `canUsePreviewMasterAwb` ability - * @param { string } object.positionId Path parameter - * @param { string } object.mawbId Path parameter - * @param { string } object.officeId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult> } - * @statusCodes [200, 401] - */ -export const usePreviewMasterAwb = ({ positionId, mawbId, officeId }: { positionId: string, mawbId: string, officeId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.previewMasterAwb(positionId, mawbId, officeId), - queryFn: () => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId) }, - ...options, - }); -}; - -/** - * Mutation `usePreviewMasterAwbMutation` - recommended when file should not be cached - * @summary Preview Master AWB document - * @permission Requires `canUsePreviewMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const usePreviewMasterAwbMutation = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUsePreviewMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.previewMasterAwb(positionId, mawbId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { positionId, mawbId, officeId } = variables; - const updateKeys = [keys.previewMasterAwb(positionId, mawbId, officeId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateMasterAwb` - * @summary Generate Master AWB document - * @permission Requires `canUseGenerateMasterAwb` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.mawbId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useGenerateMasterAwb = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, mawbId, officeId, data }) => { - checkAcl(WorkingDocumentsMasterAwbAcl.canUseGenerateMasterAwb({ officeId } )); - return WorkingDocumentsMasterAwbApi.generateMasterAwb(positionId, mawbId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts deleted file mode 100644 index ccebdd8..0000000 --- a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.acl.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbilityTuple, ForcedSubject, subject } from "@casl/ability"; - -export namespace WorkingDocumentsTemplatedDocumentAcl { -/** - * Use for `useCreate` mutation ability. For global ability, omit the object parameter. - * @description Create templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useCreate` mutation - */ -export const canUseCreate = ( - object?: { officeId: string, } -) => [ - "Create", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Create", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useGetTemplatedDocument` query ability. For global ability, omit the object parameter. - * @description Read templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGetTemplatedDocument` query - */ -export const canUseGetTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useUpdateTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Update templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useUpdateTemplatedDocument` mutation - */ -export const canUseUpdateTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useDeleteTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Delete templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useDeleteTemplatedDocument` mutation - */ -export const canUseDeleteTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Delete", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Delete", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `usePreviewTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Preview templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `usePreviewTemplatedDocument` mutation - */ -export const canUsePreviewTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Read", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Read", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useIssueTemplatedDocument` mutation ability. For global ability, omit the object parameter. - * @description Issue templated document - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useIssueTemplatedDocument` mutation - */ -export const canUseIssueTemplatedDocument = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -/** - * Use for `useGenerateDocumentEml` mutation ability. For global ability, omit the object parameter. - * @description Generate templated document EML - * @param { string } object.officeId officeId from officeId path parameter - * @returns { AbilityTuple } An ability tuple indicating the user's ability to use `useGenerateDocumentEml` mutation - */ -export const canUseGenerateDocumentEml = ( - object?: { officeId: string, } -) => [ - "Update", - object ? subject("WorkingDocument-templated-document", object) : "WorkingDocument-templated-document" -] as AbilityTuple<"Update", "WorkingDocument-templated-document" | ForcedSubject<"WorkingDocument-templated-document"> & { officeId: string, }>; - -} diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts deleted file mode 100644 index bcde97f..0000000 --- a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.api.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AppRestClient } from "@/data/app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "@/data/zod.extended"; -import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsTemplatedDocumentApi { -export const create = (positionId: string, officeId: string, data: WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDtoSchema, data), - - ) -}; -export const getTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, ) => { - return AppRestClient.get( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - - ) -}; -export const updateTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto, ) => { - return AppRestClient.patch( - { resSchema: WorkingDocumentsTemplatedDocumentModels.TemplatedDocumentResponseDtoSchema }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDtoSchema, data), - - ) -}; -export const deleteTemplatedDocument = (positionId: string, templatedDocumentId: string, officeId: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}`, - - ) -}; -export const previewTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/preview`, - ZodExtended.parse(WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/pdf', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -export const issueTemplatedDocument = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/issue`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - - ) -}; -export const generateDocumentEml = (officeId: string, positionId: string, templatedDocumentId: string, data: CommonModels.GenerateWorkingDocumentRequestDto, ) => { - return AppRestClient.post( - { resSchema: z.instanceof(Blob) }, - `/offices/${officeId}/positions/${positionId}/templated-documents/${templatedDocumentId}/eml`, - ZodExtended.parse(CommonModels.GenerateWorkingDocumentRequestDtoSchema, data), - { - headers: { - 'Accept': 'application/octet-stream', - }, - responseType: "blob", - rawResponse: true, - } - ) -}; -} diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts deleted file mode 100644 index b8a732e..0000000 --- a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.models.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { z } from "zod"; -import { CommonModels } from "@/data/common/common.models"; - -export namespace WorkingDocumentsTemplatedDocumentModels { -/** - * TemplatedDocumentBlueprintDtoSchema - * @type { object } - * @property { string } templateId - * @property { string } templateName - * @property { string } capturedAt - * @property { CommonModels.TemplateBlocksResponseDTO } blocks - */ -export const TemplatedDocumentBlueprintDtoSchema = z.object({ templateId: z.string(), templateName: z.string(), capturedAt: z.string(), blocks: CommonModels.TemplateBlocksResponseDTOSchema }); -export type TemplatedDocumentBlueprintDto = z.infer; - -/** - * TemplatedDocumentResponseDtoSchema - * @type { object } - * @property { string } id - * @property { string } positionId - * @property { string } officeId - * @property { string } name - * @property { string } nameSuffix - * @property { string } defaultFileName - * @property { number } versionNumber - * @property { TemplatedDocumentBlueprintDto } blueprint Captured template blueprint - * @property { CommonModels.TemplatedDocumentDataDto } data Document data - * @property { string } createdAt - * @property { string } updatedAt - * @property { string } issuedAt - */ -export const TemplatedDocumentResponseDtoSchema = z.object({ id: z.string(), positionId: z.string(), officeId: z.string(), name: z.string(), nameSuffix: z.string().nullish(), defaultFileName: z.string(), versionNumber: z.number(), blueprint: TemplatedDocumentBlueprintDtoSchema, data: CommonModels.TemplatedDocumentDataDtoSchema, createdAt: z.iso.datetime({ offset: true }), updatedAt: z.iso.datetime({ offset: true }), issuedAt: z.iso.datetime({ offset: true }).nullish() }); -export type TemplatedDocumentResponseDto = z.infer; - -/** - * UpdateTemplatedDocumentRequestDtoSchema - * @type { object } - * @property { string } nameSuffix Optional suffix for the document name - * @property { CommonModels.TemplatedDocumentDataUpdateDto } data Partial document data to update - */ -export const UpdateTemplatedDocumentRequestDtoSchema = z.object({ nameSuffix: z.string().nullable(), data: CommonModels.TemplatedDocumentDataUpdateDtoSchema.nullable() }).partial(); -export type UpdateTemplatedDocumentRequestDto = z.infer; - -/** - * CreateTemplatedDocumentRequestDtoSchema - * @type { object } - * @property { string } templateId Template ID to use for creating the document - * @property { string } nameSuffix Optional suffix for the document name - */ -export const CreateTemplatedDocumentRequestDtoSchema = z.object({ templateId: z.string(), nameSuffix: z.string().nullish() }); -export type CreateTemplatedDocumentRequestDto = z.infer; - -/** - * GenerateWorkingDocumentPreviewRequestDtoSchema - * @type { object } - * @property { string } issuedAt - */ -export const GenerateWorkingDocumentPreviewRequestDtoSchema = z.object({ issuedAt: z.iso.datetime({ offset: true }).nullable() }).partial(); -export type GenerateWorkingDocumentPreviewRequestDto = z.infer; - -} diff --git a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts b/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts deleted file mode 100644 index 948d434..0000000 --- a/test/generated/next/workingDocumentsTemplatedDocument/workingDocumentsTemplatedDocument.queries.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "@/data/queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "@/data/useMutationEffects"; -import { useAclCheck } from "@/data/acl/useAclCheck"; -import { WorkingDocumentsTemplatedDocumentAcl } from "./workingDocumentsTemplatedDocument.acl"; -import { AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { WorkingDocumentsTemplatedDocumentModels } from "./workingDocumentsTemplatedDocument.models"; -import { CommonModels } from "@/data/common/common.models"; -import { WorkingDocumentsTemplatedDocumentApi } from "./workingDocumentsTemplatedDocument.api"; - -export namespace WorkingDocumentsTemplatedDocumentQueries { -export const moduleName = QueryModule.WorkingDocumentsTemplatedDocument; - -export const keys = { - all: [moduleName] as const, - getTemplatedDocument: (officeId: string, positionId: string, templatedDocumentId: string) => [...keys.all, "/offices/:officeId/positions/:positionId/templated-documents/:templatedDocumentId", officeId, positionId, templatedDocumentId] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create a templated document - * @permission Requires `canUseCreate` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.CreateTemplatedDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, officeId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseCreate({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.create(positionId, officeId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetTemplatedDocument` - * @summary Get templated document data - * @permission Requires `canUseGetTemplatedDocument` ability - * @param { string } object.officeId Path parameter - * @param { string } object.positionId Path parameter - * @param { string } object.templatedDocumentId Path parameter - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [200, 401] - */ -export const useGetTemplatedDocument = ({ officeId, positionId, templatedDocumentId }: { officeId: string, positionId: string, templatedDocumentId: string }, options?: AppQueryOptions) => { - const { checkAcl } = useAclCheck(); - - return useQuery({ - queryKey: keys.getTemplatedDocument(officeId, positionId, templatedDocumentId), - queryFn: () => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGetTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.getTemplatedDocument(officeId, positionId, templatedDocumentId) }, - ...options, - }); -}; - -/** - * Mutation `useUpdateTemplatedDocument` - * @summary Update templated document data - * @permission Requires `canUseUpdateTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.UpdateTemplatedDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [200, 401] - */ -export const useUpdateTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseUpdateTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.updateTemplatedDocument(officeId, positionId, templatedDocumentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - const { officeId, positionId, templatedDocumentId } = variables; - const updateKeys = [keys.getTemplatedDocument(officeId, positionId, templatedDocumentId)]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteTemplatedDocument` - * @summary Delete templated document - * @permission Requires `canUseDeleteTemplatedDocument` ability - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { string } mutation.officeId Path parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Templated document deleted - * @statusCodes [204, 401, 404] - */ -export const useDeleteTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ positionId, templatedDocumentId, officeId }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseDeleteTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.deleteTemplatedDocument(positionId, templatedDocumentId, officeId) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `usePreviewTemplatedDocument` - recommended when file should not be cached - * @summary Preview templated document - * @permission Requires `canUsePreviewTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { WorkingDocumentsTemplatedDocumentModels.GenerateWorkingDocumentPreviewRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 201, 401] - */ -export const usePreviewTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUsePreviewTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.previewTemplatedDocument(officeId, positionId, templatedDocumentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useIssueTemplatedDocument` - * @summary Issue templated document (generate final PDF) - * @permission Requires `canUseIssueTemplatedDocument` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [201, 401] - */ -export const useIssueTemplatedDocument = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseIssueTemplatedDocument({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.issueTemplatedDocument(officeId, positionId, templatedDocumentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useGenerateDocumentEml` - recommended when file should not be cached - * @summary Generate templated document and return EML file - * @permission Requires `canUseGenerateDocumentEml` ability - * @param { string } mutation.officeId Path parameter - * @param { string } mutation.positionId Path parameter - * @param { string } mutation.templatedDocumentId Path parameter - * @param { CommonModels.GenerateWorkingDocumentRequestDto } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult> } - * @statusCodes [200, 401] - */ -export const useGenerateDocumentEml = (options?: AppMutationOptions & MutationEffectsOptions) => { - const { checkAcl } = useAclCheck(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ officeId, positionId, templatedDocumentId, data }) => { - checkAcl(WorkingDocumentsTemplatedDocumentAcl.canUseGenerateDocumentEml({ officeId } )); - return WorkingDocumentsTemplatedDocumentApi.generateDocumentEml(officeId, positionId, templatedDocumentId, data) - }, - ...options, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/next/zod.extended.ts b/test/generated/next/zod.extended.ts deleted file mode 100644 index 81e1e02..0000000 --- a/test/generated/next/zod.extended.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from "zod"; -import { ErrorHandler, SharedErrorHandler } from ""; - -export namespace ZodExtended { - interface ParseOptions { - type: "body" | "query"; - name?: string; - errorHandler?: ErrorHandler; - } - - export function parse( - schema: z.ZodType, - data: unknown, - { type, name, errorHandler }: ParseOptions = { type: "body" }, - ) { - try { - return schema.parse(data); - } catch (e) { - if (e instanceof z.ZodError) { - e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; - } - (errorHandler ?? SharedErrorHandler).rethrowError(e); - throw e; - } - } - - function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { - if (data === undefined || data === "" || enumSchema.options.length === 0) { - return true; - } - - const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; - const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; - return new RegExp(`^${commaSeparatedOptions}$`).test(data); - } - - export const sortExp = (enumSchema: z.ZodEnum) => - z.string().superRefine((arg, ctx) => { - if (!isSortExpValid(enumSchema, arg)) { - ctx.addIssue({ - code: "invalid_value", - message: "Invalid sorting string.", - values: [], - }); - } - }); -} diff --git a/test/generated/tmp-models-common-v2/acl/app.ability.ts b/test/generated/tmp-models-common-v2/acl/app.ability.ts deleted file mode 100644 index 6c06fc9..0000000 --- a/test/generated/tmp-models-common-v2/acl/app.ability.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { PureAbility, AbilityTuple, Subject } from "@casl/ability"; - -export type AppAbilities = AbilityTuple; - -export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/tmp-models-common-v2/acl/useAclCheck.ts b/test/generated/tmp-models-common-v2/acl/useAclCheck.ts deleted file mode 100644 index 5e19407..0000000 --- a/test/generated/tmp-models-common-v2/acl/useAclCheck.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; -import { type ErrorHandler, SharedErrorHandler } from ""; -import { AbilityContext } from ""; -import { useCallback } from "react"; -import { AppAbilities } from "../acl/app.ability"; - -interface UseAclCheckProps { - errorHandler?: ErrorHandler; -} - -export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { - const ability = AbilityContext.useAbility(); - - const checkAcl = useCallback((appAbility: AppAbilities) => { - if (!ability.can(...(appAbility as AbilityTuple))) { - (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); - } - }, [ability, errorHandler]); - - return { checkAcl }; -} diff --git a/test/generated/tmp-models-common-v2/app-rest-client.ts b/test/generated/tmp-models-common-v2/app-rest-client.ts deleted file mode 100644 index 493b224..0000000 --- a/test/generated/tmp-models-common-v2/app-rest-client.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RestClient } from "@povio/openapi-codegen-cli"; - -export const AppRestClient = new RestClient({ - config: { - baseURL: "https://petstore3.swagger.io/api/v3" - }, -}); diff --git a/test/generated/tmp-models-common-v2/common/common.models.ts b/test/generated/tmp-models-common-v2/common/common.models.ts deleted file mode 100644 index ab3e7a4..0000000 --- a/test/generated/tmp-models-common-v2/common/common.models.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { z } from "zod"; - -export namespace CommonModels { -/** - * FindByStatusStatusEnumSchema - * @type { enum } - * @description pet status in the store. Default: `available` - */ -export const FindByStatusStatusEnumSchema = z.enum(["available", "pending", "sold"]); -export type FindByStatusStatusEnum = z.infer; -export const FindByStatusStatusEnum = FindByStatusStatusEnumSchema.enum; - -/** - * OrderStatusEnumSchema - * @type { enum } - * @description Order Status. Example: `approved` - */ -export const OrderStatusEnumSchema = z.enum(["placed", "approved", "delivered"]); -export type OrderStatusEnum = z.infer; -export const OrderStatusEnum = OrderStatusEnumSchema.enum; - -/** - * CategorySchema - * @type { object } - * @property { integer } id Example: `1` - * @property { string } name Example: `Dogs` - */ -export const CategorySchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); -export type Category = z.infer; - -/** - * TagSchema - * @type { object } - * @property { integer } id - * @property { string } name - */ -export const TagSchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); -export type Tag = z.infer; - -/** - * PetSchema - * @type { object } - * @property { integer } id Example: `10` - * @property { string } name Example: `doggie` - * @property { PetModels.Category } category - * @property { string[] } photoUrls - * @property { PetModels.Tag[] } tags - * @property { string } status pet status in the store - */ -export const PetSchema = z.object({ id: z.int().nullish(), name: z.string(), category: CategorySchema.nullish(), photoUrls: z.array(z.string()), tags: z.array(TagSchema).nullish(), status: FindByStatusStatusEnumSchema.nullish() }); -export type Pet = z.infer; - -/** - * OrderSchema - * @type { object } - * @property { integer } id Example: `10` - * @property { integer } petId Example: `198772` - * @property { integer } quantity Example: `7` - * @property { string } shipDate - * @property { string } status Order Status. Example: `approved` - * @property { boolean } complete - */ -export const OrderSchema = z.object({ id: z.int().nullable(), petId: z.int().nullable(), quantity: z.int().nullable(), shipDate: z.iso.datetime({ offset: true }).nullable(), status: OrderStatusEnumSchema.nullable(), complete: z.boolean().nullable() }).partial(); -export type Order = z.infer; - -/** - * UserSchema - * @type { object } - * @property { integer } id Example: `10` - * @property { string } username Example: `theUser` - * @property { string } firstName Example: `John` - * @property { string } lastName Example: `James` - * @property { string } email Example: `john@email.com` - * @property { string } password Example: `12345` - * @property { string } phone Example: `12345` - * @property { integer } userStatus User Status. Example: `1` - */ -export const UserSchema = z.object({ id: z.int().nullable(), username: z.string().nullable(), firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), password: z.string().nullable(), phone: z.string().nullable(), userStatus: z.int().nullable() }).partial(); -export type User = z.infer; - -/** - * ApiResponseSchema - * @type { object } - * @property { integer } code - * @property { string } type - * @property { string } message - */ -export const ApiResponseSchema = z.object({ code: z.int().nullable(), type: z.string().nullable(), message: z.string().nullable() }).partial(); -export type ApiResponse = z.infer; - -/** - * FindByStatusStatusParamSchema - * @type { string } - * @description Default: `available` - */ -export const FindByStatusStatusParamSchema = FindByStatusStatusEnumSchema.nullish().default("available"); -export type FindByStatusStatusParam = z.infer; - -/** - * FindByStatusResponseSchema - * @type { array } - */ -export const FindByStatusResponseSchema = z.array(PetSchema); -export type FindByStatusResponse = z.infer; - -/** - * FindByTagsTagsParamSchema - * @type { array } - */ -export const FindByTagsTagsParamSchema = z.array(z.string()).nullish(); -export type FindByTagsTagsParam = z.infer; - -/** - * FindByTagsResponseSchema - * @type { array } - */ -export const FindByTagsResponseSchema = z.array(PetSchema); -export type FindByTagsResponse = z.infer; - -/** - * GetInventoryResponseSchema - * @type { object } - * @property { integer } [key] - */ -export const GetInventoryResponseSchema = z.object({}).catchall(z.int()); -export type GetInventoryResponse = z.infer; - -/** - * CreateWithListInputBodySchema - * @type { array } - */ -export const CreateWithListInputBodySchema = z.array(UserSchema); -export type CreateWithListInputBody = z.infer; - -} diff --git a/test/generated/tmp-models-common-v2/pet/pet.api.ts b/test/generated/tmp-models-common-v2/pet/pet.api.ts deleted file mode 100644 index 94fd0ed..0000000 --- a/test/generated/tmp-models-common-v2/pet/pet.api.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { AppRestClient } from "../app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "../zod.extended"; -import { PetModels } from "./pet.models"; - -export namespace PetApi { -export const update = (data: PetModels.Pet, ) => { - return AppRestClient.put( - { resSchema: PetModels.PetSchema }, - `/pet`, - ZodExtended.parse(PetModels.PetSchema, data), - - ) -}; -export const add = (data: PetModels.Pet, ) => { - return AppRestClient.post( - { resSchema: PetModels.PetSchema }, - `/pet`, - ZodExtended.parse(PetModels.PetSchema, data), - - ) -}; -export const findByStatus = (status?: PetModels.FindByStatusStatusParam, ) => { - return AppRestClient.get( - { resSchema: PetModels.FindByStatusResponseSchema }, - `/pet/findByStatus`, - { - params: { - status: ZodExtended.parse(PetModels.FindByStatusStatusParamSchema.optional(), status, { type: "query", name: "status" }), - }, - } - ) -}; -export const findByTags = (tags?: PetModels.FindByTagsTagsParam, ) => { - return AppRestClient.get( - { resSchema: PetModels.FindByTagsResponseSchema }, - `/pet/findByTags`, - { - params: { - tags: ZodExtended.parse(PetModels.FindByTagsTagsParamSchema.optional(), tags, { type: "query", name: "tags" }), - }, - } - ) -}; -export const getById = (petId: number, ) => { - return AppRestClient.get( - { resSchema: PetModels.PetSchema }, - `/pet/${petId}`, - - ) -}; -export const updateWithForm = (petId: number, name: string, status: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/pet/${petId}`, - undefined, - { - params: { - name: ZodExtended.parse(z.string().nullish(), name, { type: "query", name: "name" }), - status: ZodExtended.parse(z.string().nullish(), status, { type: "query", name: "status" }), - }, - } - ) -}; -export const deletePet = (petId: number, api_key?: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/pet/${petId}`, - undefined, - { - headers: { - 'api_key': api_key, - }, - } - ) -}; -export const uploadFile = (petId: number, data: string, additionalMetadata?: string, ) => { - return AppRestClient.post( - { resSchema: PetModels.ApiResponseSchema }, - `/pet/${petId}/uploadImage`, - ZodExtended.parse(z.instanceof(Blob), data), - { - params: { - additionalMetadata: ZodExtended.parse(z.string().nullish(), additionalMetadata, { type: "query", name: "additionalMetadata" }), - }, - headers: { - 'Content-Type': 'application/octet-stream', - }, - } - ) -}; -} diff --git a/test/generated/tmp-models-common-v2/pet/pet.models.ts b/test/generated/tmp-models-common-v2/pet/pet.models.ts deleted file mode 100644 index 4047409..0000000 --- a/test/generated/tmp-models-common-v2/pet/pet.models.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { CommonModels } from "../common/common.models"; - -export namespace PetModels { - export const PetSchema = CommonModels.PetSchema; - export const FindByStatusResponseSchema = CommonModels.FindByStatusResponseSchema; - export const FindByStatusStatusParamSchema = CommonModels.FindByStatusStatusParamSchema; - export const FindByTagsResponseSchema = CommonModels.FindByTagsResponseSchema; - export const FindByTagsTagsParamSchema = CommonModels.FindByTagsTagsParamSchema; - export const ApiResponseSchema = CommonModels.ApiResponseSchema; - export const CategorySchema = CommonModels.CategorySchema; - export const TagSchema = CommonModels.TagSchema; - export const FindByStatusStatusEnumSchema = CommonModels.FindByStatusStatusEnumSchema; - export type Pet = CommonModels.Pet; - export type FindByStatusResponse = CommonModels.FindByStatusResponse; - export type FindByStatusStatusParam = CommonModels.FindByStatusStatusParam; - export type FindByTagsResponse = CommonModels.FindByTagsResponse; - export type FindByTagsTagsParam = CommonModels.FindByTagsTagsParam; - export type ApiResponse = CommonModels.ApiResponse; - export type Category = CommonModels.Category; - export type Tag = CommonModels.Tag; - export type FindByStatusStatusEnum = CommonModels.FindByStatusStatusEnum; - export const FindByStatusStatusEnum = CommonModels.FindByStatusStatusEnum; -} diff --git a/test/generated/tmp-models-common-v2/pet/pet.queries.ts b/test/generated/tmp-models-common-v2/pet/pet.queries.ts deleted file mode 100644 index b19320b..0000000 --- a/test/generated/tmp-models-common-v2/pet/pet.queries.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "../queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; -import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PetModels } from "./pet.models"; -import { PetApi } from "./pet.api"; - -export namespace PetQueries { -export const moduleName = QueryModule.pet; - -export const keys = { - all: [moduleName] as const, - findByStatus: (status?: PetModels.FindByStatusStatusParam) => [...keys.all, "/pet/findByStatus", status] as const, - findByTags: (tags?: PetModels.FindByTagsTagsParam) => [...keys.all, "/pet/findByTags", tags] as const, - getById: (petId: number) => [...keys.all, "/pet/:petId", petId] as const, -}; - -/** - * Mutation `useUpdate` - * @summary Update an existing pet - * @description Update an existing pet by Id - * @param { PetModels.Pet } mutation.data Body parameter. Update an existent pet in the store - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, 400, 404, 405] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - PetApi.update(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useAdd` - * @summary Add a new pet to the store - * @description Add a new pet to the store - * @param { PetModels.Pet } mutation.data Body parameter. Create a new pet in the store - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, 405] - */ -export const useAdd = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - PetApi.add(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindByStatus` - * @summary Finds Pets by status - * @description Multiple status values can be provided with comma separated strings - * @param { PetModels.FindByStatusStatusParam } object.status Query parameter. Status values that need to be considered for filter. Default: `available` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400] - */ -export const useFindByStatus = ({ status }: { status?: PetModels.FindByStatusStatusParam }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.findByStatus(status), - queryFn: () => - PetApi.findByStatus(status), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useFindByTags` - * @summary Finds Pets by tags - * @description Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. - * @param { PetModels.FindByTagsTagsParam } object.tags Query parameter. Tags to filter by - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400] - */ -export const useFindByTags = ({ tags }: { tags?: PetModels.FindByTagsTagsParam }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.findByTags(tags), - queryFn: () => - PetApi.findByTags(tags), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useGetById` - * @summary Find pet by ID - * @description Returns a single pet - * @param { number } object.petId Path parameter. ID of pet to return - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400, 404] - */ -export const useGetById = ({ petId }: { petId: number }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getById(petId), - queryFn: () => - PetApi.getById(petId), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `useUpdateWithForm` - * @summary Updates a pet in the store with form data - * @param { number } mutation.petId Path parameter. ID of pet that needs to be updated - * @param { string } mutation.name Query parameter. Name of pet that needs to be updated - * @param { string } mutation.status Query parameter. Status of pet that needs to be updated - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [405] - */ -export const useUpdateWithForm = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ petId, name, status }) => - PetApi.updateWithForm(petId, name, status) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePet` - * @summary Deletes a pet - * @description delete a pet - * @param { number } mutation.petId Path parameter. Pet id to delete - * @param { string } mutation.api_key Header parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [400] - */ -export const useDeletePet = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ petId, api_key }) => - PetApi.deletePet(petId, api_key) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUploadFile` - * @summary uploads an image - * @param { number } mutation.petId Path parameter. ID of pet to update - * @param { string } mutation.data Body parameter - * @param { string } mutation.additionalMetadata Query parameter. Additional Metadata - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200] - */ -export const useUploadFile = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ petId, data, additionalMetadata }) => - PetApi.uploadFile(petId, data, additionalMetadata) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/tmp-models-common-v2/queryModules.ts b/test/generated/tmp-models-common-v2/queryModules.ts deleted file mode 100644 index c815cfe..0000000 --- a/test/generated/tmp-models-common-v2/queryModules.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const enum QueryModule { - pet = "PetQueries", - store = "StoreQueries", - user = "UserQueries", -} \ No newline at end of file diff --git a/test/generated/tmp-models-common-v2/store/store.api.ts b/test/generated/tmp-models-common-v2/store/store.api.ts deleted file mode 100644 index 7a4712b..0000000 --- a/test/generated/tmp-models-common-v2/store/store.api.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AppRestClient } from "../app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "../zod.extended"; -import { StoreModels } from "./store.models"; - -export namespace StoreApi { -export const getInventory = () => { - return AppRestClient.get( - { resSchema: StoreModels.GetInventoryResponseSchema }, - `/store/inventory`, - - ) -}; -export const placeOrder = (data: StoreModels.Order, ) => { - return AppRestClient.post( - { resSchema: StoreModels.OrderSchema }, - `/store/order`, - ZodExtended.parse(StoreModels.OrderSchema.optional(), data), - - ) -}; -export const getOrderById = (orderId: number, ) => { - return AppRestClient.get( - { resSchema: StoreModels.OrderSchema }, - `/store/order/${orderId}`, - - ) -}; -export const deleteOrder = (orderId: number, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/store/order/${orderId}`, - - ) -}; -} diff --git a/test/generated/tmp-models-common-v2/store/store.models.ts b/test/generated/tmp-models-common-v2/store/store.models.ts deleted file mode 100644 index 2d9d5c7..0000000 --- a/test/generated/tmp-models-common-v2/store/store.models.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { CommonModels } from "../common/common.models"; - -export namespace StoreModels { - export const GetInventoryResponseSchema = CommonModels.GetInventoryResponseSchema; - export const OrderSchema = CommonModels.OrderSchema; - export const OrderStatusEnumSchema = CommonModels.OrderStatusEnumSchema; - export type GetInventoryResponse = CommonModels.GetInventoryResponse; - export type Order = CommonModels.Order; - export type OrderStatusEnum = CommonModels.OrderStatusEnum; - export const OrderStatusEnum = CommonModels.OrderStatusEnum; -} diff --git a/test/generated/tmp-models-common-v2/store/store.queries.ts b/test/generated/tmp-models-common-v2/store/store.queries.ts deleted file mode 100644 index 335a090..0000000 --- a/test/generated/tmp-models-common-v2/store/store.queries.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "../queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; -import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { StoreModels } from "./store.models"; -import { StoreApi } from "./store.api"; - -export namespace StoreQueries { -export const moduleName = QueryModule.store; - -export const keys = { - all: [moduleName] as const, - getInventory: () => [...keys.all, "/store/inventory", ] as const, - getOrderById: (orderId: number) => [...keys.all, "/store/order/:orderId", orderId] as const, -}; - -/** - * Query `useGetInventory` - * @summary Returns pet inventories by status - * @description Returns a map of status codes to quantities - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200] - */ -export const useGetInventory = (options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getInventory(), - queryFn: StoreApi.getInventory, - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `usePlaceOrder` - * @summary Place an order for a pet - * @description Place a new order in the store - * @param { StoreModels.Order } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, 405] - */ -export const usePlaceOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - StoreApi.placeOrder(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetOrderById` - * @summary Find purchase order by ID - * @description For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. - * @param { number } object.orderId Path parameter. ID of order that needs to be fetched - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400, 404] - */ -export const useGetOrderById = ({ orderId }: { orderId: number }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getOrderById(orderId), - queryFn: () => - StoreApi.getOrderById(orderId), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `useDeleteOrder` - * @summary Delete purchase order by ID - * @description For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors - * @param { number } mutation.orderId Path parameter. ID of the order that needs to be deleted - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [400, 404] - */ -export const useDeleteOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ orderId }) => - StoreApi.deleteOrder(orderId) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/tmp-models-common-v2/useCrossTabQueryInvalidation.ts b/test/generated/tmp-models-common-v2/useCrossTabQueryInvalidation.ts deleted file mode 100644 index d74d707..0000000 --- a/test/generated/tmp-models-common-v2/useCrossTabQueryInvalidation.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { QueryClient, QueryKey } from "@tanstack/react-query"; - -const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; - -/** - * Broadcasts a query invalidation event to all other open tabs via localStorage. - * - * @param queryKeys - An array of query keys to invalidate (array of arrays). - * - * NOTE: The `storage` event only fires in *other* tabs — the calling tab - * must invalidate its own queryClient separately if needed. - */ -export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { - localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); -}; - -/** - * Registers a one-time global `storage` event listener that reacts to - * cross-tab invalidation broadcasts. Safe to call from multiple hooks — - * only the first call sets up the listener. - */ -let isListenerSetUp = false; - -export const setupCrossTabListener = (queryClient: QueryClient) => { - if (isListenerSetUp) return; - isListenerSetUp = true; - - window.addEventListener("storage", (e: StorageEvent) => { - if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; - - try { - const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; - for (const queryKey of keys) { - queryClient.invalidateQueries({ queryKey }); - } - } catch { - // Ignore malformed payloads - } - }); -}; diff --git a/test/generated/tmp-models-common-v2/useMutationEffects.ts b/test/generated/tmp-models-common-v2/useMutationEffects.ts deleted file mode 100644 index ed61406..0000000 --- a/test/generated/tmp-models-common-v2/useMutationEffects.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { useCallback, useEffect } from "react"; - -import { QueryKey, useQueryClient } from "@tanstack/react-query"; -import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; -import { QueryModule } from "./queryModules"; -import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; - -export interface MutationEffectsOptions { - invalidateCurrentModule?: boolean; - crossTabInvalidation?: boolean; - invalidationMap?: InvalidationMap; - invalidateModules?: QueryModule[]; - invalidateKeys?: QueryKey[]; - preferUpdate?: boolean; -} - -export interface UseMutationEffectsProps { - currentModule: QueryModule; -} - -export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { - const queryClient = useQueryClient(); - const config = OpenApiQueryConfig.useConfig(); - - useEffect(() => { - if (!config.crossTabInvalidation) return; - setupCrossTabListener(queryClient); - }, [queryClient, config.crossTabInvalidation]); - - const runMutationEffects = useCallback( - async ( - data: TData, - variables: TVariables, - options: MutationEffectsOptions = {}, - updateKeys?: QueryKey[], - ) => { - const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; - const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; - const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; - - const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => - keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); - const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => - prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); - const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); - - const shouldInvalidateQuery = (queryKey: QueryKey) => { - const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); - if (shouldUpdate && isUpdateKey) { - return false; - } - - const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; - const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); - const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - const isMappedKey = - !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - - return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; - }; - - const invalidatedQueryKeys: QueryKey[] = []; - - queryClient.invalidateQueries({ - predicate: ({ queryKey }) => { - const shouldInvalidate = shouldInvalidateQuery(queryKey); - - if (shouldInvalidate && config.crossTabInvalidation) { - invalidatedQueryKeys.push([...queryKey]); - } - - return shouldInvalidate; - }, - }); - - if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { - broadcastQueryInvalidation(invalidatedQueryKeys); - } - - if (shouldUpdate && updateKeys) { - updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); - } - }, - [ - queryClient, - currentModule, - config.preferUpdate, - config.invalidateCurrentModule, - config.invalidationMap, - config.crossTabInvalidation, - ], - ); - - return { runMutationEffects }; -} diff --git a/test/generated/tmp-models-common-v2/user/user.api.ts b/test/generated/tmp-models-common-v2/user/user.api.ts deleted file mode 100644 index 69c5f69..0000000 --- a/test/generated/tmp-models-common-v2/user/user.api.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { AppRestClient } from "../app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "../zod.extended"; -import { UserModels } from "./user.models"; - -export namespace UserApi { -export const create = (data: UserModels.User, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/user`, - ZodExtended.parse(UserModels.UserSchema.optional(), data), - - ) -}; -export const createWithListInput = (data: UserModels.CreateWithListInputBody, ) => { - return AppRestClient.post( - { resSchema: UserModels.UserSchema }, - `/user/createWithList`, - ZodExtended.parse(UserModels.CreateWithListInputBodySchema.optional(), data), - - ) -}; -export const login = (username?: string, password?: string, ) => { - return AppRestClient.get( - { resSchema: z.string() }, - `/user/login`, - { - params: { - username: ZodExtended.parse(z.string().nullish(), username, { type: "query", name: "username" }), - password: ZodExtended.parse(z.string().nullish(), password, { type: "query", name: "password" }), - }, - headers: { - 'Accept': 'application/xml', - }, - } - ) -}; -export const logout = () => { - return AppRestClient.get( - { resSchema: z.void() }, - `/user/logout`, - - ) -}; -export const getByName = (username: string, ) => { - return AppRestClient.get( - { resSchema: UserModels.UserSchema }, - `/user/${username}`, - - ) -}; -export const update = (username: string, data: UserModels.User, ) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/user/${username}`, - ZodExtended.parse(UserModels.UserSchema.optional(), data), - - ) -}; -export const deleteUser = (username: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/user/${username}`, - - ) -}; -} diff --git a/test/generated/tmp-models-common-v2/user/user.models.ts b/test/generated/tmp-models-common-v2/user/user.models.ts deleted file mode 100644 index b9f893b..0000000 --- a/test/generated/tmp-models-common-v2/user/user.models.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { CommonModels } from "../common/common.models"; - -export namespace UserModels { - export const UserSchema = CommonModels.UserSchema; - export const CreateWithListInputBodySchema = CommonModels.CreateWithListInputBodySchema; - export type User = CommonModels.User; - export type CreateWithListInputBody = CommonModels.CreateWithListInputBody; -} diff --git a/test/generated/tmp-models-common-v2/user/user.queries.ts b/test/generated/tmp-models-common-v2/user/user.queries.ts deleted file mode 100644 index a3dabbc..0000000 --- a/test/generated/tmp-models-common-v2/user/user.queries.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "../queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; -import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { UserModels } from "./user.models"; -import { UserApi } from "./user.api"; - -export namespace UserQueries { -export const moduleName = QueryModule.user; - -export const keys = { - all: [moduleName] as const, - login: (username?: string, password?: string) => [...keys.all, "/user/login", username, password] as const, - logout: () => [...keys.all, "/user/logout", ] as const, - getByName: (username: string) => [...keys.all, "/user/:username", username] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create user - * @description This can only be done by the logged in user. - * @param { UserModels.User } mutation.data Body parameter. Created user object - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [default] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - UserApi.create(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.logout()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateWithListInput` - * @summary Creates list of users with given input array - * @description Creates list of users with given input array - * @param { UserModels.CreateWithListInputBody } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, default] - */ -export const useCreateWithListInput = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - UserApi.createWithListInput(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useLogin` - * @summary Logs user into the system - * @param { string } object.username Query parameter. The user name for login - * @param { string } object.password Query parameter. The password for login in clear text - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400] - */ -export const useLogin = ({ username, password }: { username?: string, password?: string }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.login(username, password), - queryFn: () => - UserApi.login(username, password), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useLogout` - * @summary Logs out current logged in user session - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [default] - */ -export const useLogout = (options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.logout(), - queryFn: UserApi.logout, - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useGetByName` - * @summary Get user by user name - * @param { string } object.username Path parameter. The name that needs to be fetched. Use user1 for testing. - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400, 404] - */ -export const useGetByName = ({ username }: { username: string }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getByName(username), - queryFn: () => - UserApi.getByName(username), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update user - * @description This can only be done by the logged in user. - * @param { string } mutation.username Path parameter. name that need to be deleted - * @param { UserModels.User } mutation.data Body parameter. Update an existent user in the store - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [default] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ username, data }) => - UserApi.update(username, data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.logout()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteUser` - * @summary Delete user - * @description This can only be done by the logged in user. - * @param { string } mutation.username Path parameter. The name that needs to be deleted - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [400, 404] - */ -export const useDeleteUser = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ username }) => - UserApi.deleteUser(username) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.logout()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/tmp-models-common-v2/zod.extended.ts b/test/generated/tmp-models-common-v2/zod.extended.ts deleted file mode 100644 index 81e1e02..0000000 --- a/test/generated/tmp-models-common-v2/zod.extended.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from "zod"; -import { ErrorHandler, SharedErrorHandler } from ""; - -export namespace ZodExtended { - interface ParseOptions { - type: "body" | "query"; - name?: string; - errorHandler?: ErrorHandler; - } - - export function parse( - schema: z.ZodType, - data: unknown, - { type, name, errorHandler }: ParseOptions = { type: "body" }, - ) { - try { - return schema.parse(data); - } catch (e) { - if (e instanceof z.ZodError) { - e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; - } - (errorHandler ?? SharedErrorHandler).rethrowError(e); - throw e; - } - } - - function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { - if (data === undefined || data === "" || enumSchema.options.length === 0) { - return true; - } - - const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; - const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; - return new RegExp(`^${commaSeparatedOptions}$`).test(data); - } - - export const sortExp = (enumSchema: z.ZodEnum) => - z.string().superRefine((arg, ctx) => { - if (!isSortExpValid(enumSchema, arg)) { - ctx.addIssue({ - code: "invalid_value", - message: "Invalid sorting string.", - values: [], - }); - } - }); -} diff --git a/test/generated/tmp-models-common/.openapi-codegen-cache.json b/test/generated/tmp-models-common/.openapi-codegen-cache.json deleted file mode 100644 index 05df273..0000000 --- a/test/generated/tmp-models-common/.openapi-codegen-cache.json +++ /dev/null @@ -1 +0,0 @@ -{"openApiHash":"bcc2bcf5","optionsHash":"fbfc5717"} \ No newline at end of file diff --git a/test/generated/tmp-models-common/acl/app.ability.ts b/test/generated/tmp-models-common/acl/app.ability.ts deleted file mode 100644 index 6c06fc9..0000000 --- a/test/generated/tmp-models-common/acl/app.ability.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { PureAbility, AbilityTuple, Subject } from "@casl/ability"; - -export type AppAbilities = AbilityTuple; - -export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/tmp-models-common/acl/useAclCheck.ts b/test/generated/tmp-models-common/acl/useAclCheck.ts deleted file mode 100644 index 5e19407..0000000 --- a/test/generated/tmp-models-common/acl/useAclCheck.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; -import { type ErrorHandler, SharedErrorHandler } from ""; -import { AbilityContext } from ""; -import { useCallback } from "react"; -import { AppAbilities } from "../acl/app.ability"; - -interface UseAclCheckProps { - errorHandler?: ErrorHandler; -} - -export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { - const ability = AbilityContext.useAbility(); - - const checkAcl = useCallback((appAbility: AppAbilities) => { - if (!ability.can(...(appAbility as AbilityTuple))) { - (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); - } - }, [ability, errorHandler]); - - return { checkAcl }; -} diff --git a/test/generated/tmp-models-common/app-rest-client.ts b/test/generated/tmp-models-common/app-rest-client.ts deleted file mode 100644 index 493b224..0000000 --- a/test/generated/tmp-models-common/app-rest-client.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RestClient } from "@povio/openapi-codegen-cli"; - -export const AppRestClient = new RestClient({ - config: { - baseURL: "https://petstore3.swagger.io/api/v3" - }, -}); diff --git a/test/generated/tmp-models-common/common/common.models.ts b/test/generated/tmp-models-common/common/common.models.ts deleted file mode 100644 index ab3e7a4..0000000 --- a/test/generated/tmp-models-common/common/common.models.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { z } from "zod"; - -export namespace CommonModels { -/** - * FindByStatusStatusEnumSchema - * @type { enum } - * @description pet status in the store. Default: `available` - */ -export const FindByStatusStatusEnumSchema = z.enum(["available", "pending", "sold"]); -export type FindByStatusStatusEnum = z.infer; -export const FindByStatusStatusEnum = FindByStatusStatusEnumSchema.enum; - -/** - * OrderStatusEnumSchema - * @type { enum } - * @description Order Status. Example: `approved` - */ -export const OrderStatusEnumSchema = z.enum(["placed", "approved", "delivered"]); -export type OrderStatusEnum = z.infer; -export const OrderStatusEnum = OrderStatusEnumSchema.enum; - -/** - * CategorySchema - * @type { object } - * @property { integer } id Example: `1` - * @property { string } name Example: `Dogs` - */ -export const CategorySchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); -export type Category = z.infer; - -/** - * TagSchema - * @type { object } - * @property { integer } id - * @property { string } name - */ -export const TagSchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); -export type Tag = z.infer; - -/** - * PetSchema - * @type { object } - * @property { integer } id Example: `10` - * @property { string } name Example: `doggie` - * @property { PetModels.Category } category - * @property { string[] } photoUrls - * @property { PetModels.Tag[] } tags - * @property { string } status pet status in the store - */ -export const PetSchema = z.object({ id: z.int().nullish(), name: z.string(), category: CategorySchema.nullish(), photoUrls: z.array(z.string()), tags: z.array(TagSchema).nullish(), status: FindByStatusStatusEnumSchema.nullish() }); -export type Pet = z.infer; - -/** - * OrderSchema - * @type { object } - * @property { integer } id Example: `10` - * @property { integer } petId Example: `198772` - * @property { integer } quantity Example: `7` - * @property { string } shipDate - * @property { string } status Order Status. Example: `approved` - * @property { boolean } complete - */ -export const OrderSchema = z.object({ id: z.int().nullable(), petId: z.int().nullable(), quantity: z.int().nullable(), shipDate: z.iso.datetime({ offset: true }).nullable(), status: OrderStatusEnumSchema.nullable(), complete: z.boolean().nullable() }).partial(); -export type Order = z.infer; - -/** - * UserSchema - * @type { object } - * @property { integer } id Example: `10` - * @property { string } username Example: `theUser` - * @property { string } firstName Example: `John` - * @property { string } lastName Example: `James` - * @property { string } email Example: `john@email.com` - * @property { string } password Example: `12345` - * @property { string } phone Example: `12345` - * @property { integer } userStatus User Status. Example: `1` - */ -export const UserSchema = z.object({ id: z.int().nullable(), username: z.string().nullable(), firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), password: z.string().nullable(), phone: z.string().nullable(), userStatus: z.int().nullable() }).partial(); -export type User = z.infer; - -/** - * ApiResponseSchema - * @type { object } - * @property { integer } code - * @property { string } type - * @property { string } message - */ -export const ApiResponseSchema = z.object({ code: z.int().nullable(), type: z.string().nullable(), message: z.string().nullable() }).partial(); -export type ApiResponse = z.infer; - -/** - * FindByStatusStatusParamSchema - * @type { string } - * @description Default: `available` - */ -export const FindByStatusStatusParamSchema = FindByStatusStatusEnumSchema.nullish().default("available"); -export type FindByStatusStatusParam = z.infer; - -/** - * FindByStatusResponseSchema - * @type { array } - */ -export const FindByStatusResponseSchema = z.array(PetSchema); -export type FindByStatusResponse = z.infer; - -/** - * FindByTagsTagsParamSchema - * @type { array } - */ -export const FindByTagsTagsParamSchema = z.array(z.string()).nullish(); -export type FindByTagsTagsParam = z.infer; - -/** - * FindByTagsResponseSchema - * @type { array } - */ -export const FindByTagsResponseSchema = z.array(PetSchema); -export type FindByTagsResponse = z.infer; - -/** - * GetInventoryResponseSchema - * @type { object } - * @property { integer } [key] - */ -export const GetInventoryResponseSchema = z.object({}).catchall(z.int()); -export type GetInventoryResponse = z.infer; - -/** - * CreateWithListInputBodySchema - * @type { array } - */ -export const CreateWithListInputBodySchema = z.array(UserSchema); -export type CreateWithListInputBody = z.infer; - -} diff --git a/test/generated/tmp-models-common/pet/pet.api.ts b/test/generated/tmp-models-common/pet/pet.api.ts deleted file mode 100644 index 94fd0ed..0000000 --- a/test/generated/tmp-models-common/pet/pet.api.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { AppRestClient } from "../app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "../zod.extended"; -import { PetModels } from "./pet.models"; - -export namespace PetApi { -export const update = (data: PetModels.Pet, ) => { - return AppRestClient.put( - { resSchema: PetModels.PetSchema }, - `/pet`, - ZodExtended.parse(PetModels.PetSchema, data), - - ) -}; -export const add = (data: PetModels.Pet, ) => { - return AppRestClient.post( - { resSchema: PetModels.PetSchema }, - `/pet`, - ZodExtended.parse(PetModels.PetSchema, data), - - ) -}; -export const findByStatus = (status?: PetModels.FindByStatusStatusParam, ) => { - return AppRestClient.get( - { resSchema: PetModels.FindByStatusResponseSchema }, - `/pet/findByStatus`, - { - params: { - status: ZodExtended.parse(PetModels.FindByStatusStatusParamSchema.optional(), status, { type: "query", name: "status" }), - }, - } - ) -}; -export const findByTags = (tags?: PetModels.FindByTagsTagsParam, ) => { - return AppRestClient.get( - { resSchema: PetModels.FindByTagsResponseSchema }, - `/pet/findByTags`, - { - params: { - tags: ZodExtended.parse(PetModels.FindByTagsTagsParamSchema.optional(), tags, { type: "query", name: "tags" }), - }, - } - ) -}; -export const getById = (petId: number, ) => { - return AppRestClient.get( - { resSchema: PetModels.PetSchema }, - `/pet/${petId}`, - - ) -}; -export const updateWithForm = (petId: number, name: string, status: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/pet/${petId}`, - undefined, - { - params: { - name: ZodExtended.parse(z.string().nullish(), name, { type: "query", name: "name" }), - status: ZodExtended.parse(z.string().nullish(), status, { type: "query", name: "status" }), - }, - } - ) -}; -export const deletePet = (petId: number, api_key?: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/pet/${petId}`, - undefined, - { - headers: { - 'api_key': api_key, - }, - } - ) -}; -export const uploadFile = (petId: number, data: string, additionalMetadata?: string, ) => { - return AppRestClient.post( - { resSchema: PetModels.ApiResponseSchema }, - `/pet/${petId}/uploadImage`, - ZodExtended.parse(z.instanceof(Blob), data), - { - params: { - additionalMetadata: ZodExtended.parse(z.string().nullish(), additionalMetadata, { type: "query", name: "additionalMetadata" }), - }, - headers: { - 'Content-Type': 'application/octet-stream', - }, - } - ) -}; -} diff --git a/test/generated/tmp-models-common/pet/pet.models.ts b/test/generated/tmp-models-common/pet/pet.models.ts deleted file mode 100644 index 4047409..0000000 --- a/test/generated/tmp-models-common/pet/pet.models.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { CommonModels } from "../common/common.models"; - -export namespace PetModels { - export const PetSchema = CommonModels.PetSchema; - export const FindByStatusResponseSchema = CommonModels.FindByStatusResponseSchema; - export const FindByStatusStatusParamSchema = CommonModels.FindByStatusStatusParamSchema; - export const FindByTagsResponseSchema = CommonModels.FindByTagsResponseSchema; - export const FindByTagsTagsParamSchema = CommonModels.FindByTagsTagsParamSchema; - export const ApiResponseSchema = CommonModels.ApiResponseSchema; - export const CategorySchema = CommonModels.CategorySchema; - export const TagSchema = CommonModels.TagSchema; - export const FindByStatusStatusEnumSchema = CommonModels.FindByStatusStatusEnumSchema; - export type Pet = CommonModels.Pet; - export type FindByStatusResponse = CommonModels.FindByStatusResponse; - export type FindByStatusStatusParam = CommonModels.FindByStatusStatusParam; - export type FindByTagsResponse = CommonModels.FindByTagsResponse; - export type FindByTagsTagsParam = CommonModels.FindByTagsTagsParam; - export type ApiResponse = CommonModels.ApiResponse; - export type Category = CommonModels.Category; - export type Tag = CommonModels.Tag; - export type FindByStatusStatusEnum = CommonModels.FindByStatusStatusEnum; - export const FindByStatusStatusEnum = CommonModels.FindByStatusStatusEnum; -} diff --git a/test/generated/tmp-models-common/pet/pet.queries.ts b/test/generated/tmp-models-common/pet/pet.queries.ts deleted file mode 100644 index b19320b..0000000 --- a/test/generated/tmp-models-common/pet/pet.queries.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "../queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; -import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PetModels } from "./pet.models"; -import { PetApi } from "./pet.api"; - -export namespace PetQueries { -export const moduleName = QueryModule.pet; - -export const keys = { - all: [moduleName] as const, - findByStatus: (status?: PetModels.FindByStatusStatusParam) => [...keys.all, "/pet/findByStatus", status] as const, - findByTags: (tags?: PetModels.FindByTagsTagsParam) => [...keys.all, "/pet/findByTags", tags] as const, - getById: (petId: number) => [...keys.all, "/pet/:petId", petId] as const, -}; - -/** - * Mutation `useUpdate` - * @summary Update an existing pet - * @description Update an existing pet by Id - * @param { PetModels.Pet } mutation.data Body parameter. Update an existent pet in the store - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, 400, 404, 405] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - PetApi.update(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useAdd` - * @summary Add a new pet to the store - * @description Add a new pet to the store - * @param { PetModels.Pet } mutation.data Body parameter. Create a new pet in the store - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, 405] - */ -export const useAdd = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - PetApi.add(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindByStatus` - * @summary Finds Pets by status - * @description Multiple status values can be provided with comma separated strings - * @param { PetModels.FindByStatusStatusParam } object.status Query parameter. Status values that need to be considered for filter. Default: `available` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400] - */ -export const useFindByStatus = ({ status }: { status?: PetModels.FindByStatusStatusParam }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.findByStatus(status), - queryFn: () => - PetApi.findByStatus(status), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useFindByTags` - * @summary Finds Pets by tags - * @description Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. - * @param { PetModels.FindByTagsTagsParam } object.tags Query parameter. Tags to filter by - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400] - */ -export const useFindByTags = ({ tags }: { tags?: PetModels.FindByTagsTagsParam }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.findByTags(tags), - queryFn: () => - PetApi.findByTags(tags), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useGetById` - * @summary Find pet by ID - * @description Returns a single pet - * @param { number } object.petId Path parameter. ID of pet to return - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400, 404] - */ -export const useGetById = ({ petId }: { petId: number }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getById(petId), - queryFn: () => - PetApi.getById(petId), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `useUpdateWithForm` - * @summary Updates a pet in the store with form data - * @param { number } mutation.petId Path parameter. ID of pet that needs to be updated - * @param { string } mutation.name Query parameter. Name of pet that needs to be updated - * @param { string } mutation.status Query parameter. Status of pet that needs to be updated - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [405] - */ -export const useUpdateWithForm = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ petId, name, status }) => - PetApi.updateWithForm(petId, name, status) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePet` - * @summary Deletes a pet - * @description delete a pet - * @param { number } mutation.petId Path parameter. Pet id to delete - * @param { string } mutation.api_key Header parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [400] - */ -export const useDeletePet = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ petId, api_key }) => - PetApi.deletePet(petId, api_key) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUploadFile` - * @summary uploads an image - * @param { number } mutation.petId Path parameter. ID of pet to update - * @param { string } mutation.data Body parameter - * @param { string } mutation.additionalMetadata Query parameter. Additional Metadata - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200] - */ -export const useUploadFile = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ petId, data, additionalMetadata }) => - PetApi.uploadFile(petId, data, additionalMetadata) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/tmp-models-common/queryModules.ts b/test/generated/tmp-models-common/queryModules.ts deleted file mode 100644 index c815cfe..0000000 --- a/test/generated/tmp-models-common/queryModules.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const enum QueryModule { - pet = "PetQueries", - store = "StoreQueries", - user = "UserQueries", -} \ No newline at end of file diff --git a/test/generated/tmp-models-common/store/store.api.ts b/test/generated/tmp-models-common/store/store.api.ts deleted file mode 100644 index 7a4712b..0000000 --- a/test/generated/tmp-models-common/store/store.api.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AppRestClient } from "../app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "../zod.extended"; -import { StoreModels } from "./store.models"; - -export namespace StoreApi { -export const getInventory = () => { - return AppRestClient.get( - { resSchema: StoreModels.GetInventoryResponseSchema }, - `/store/inventory`, - - ) -}; -export const placeOrder = (data: StoreModels.Order, ) => { - return AppRestClient.post( - { resSchema: StoreModels.OrderSchema }, - `/store/order`, - ZodExtended.parse(StoreModels.OrderSchema.optional(), data), - - ) -}; -export const getOrderById = (orderId: number, ) => { - return AppRestClient.get( - { resSchema: StoreModels.OrderSchema }, - `/store/order/${orderId}`, - - ) -}; -export const deleteOrder = (orderId: number, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/store/order/${orderId}`, - - ) -}; -} diff --git a/test/generated/tmp-models-common/store/store.models.ts b/test/generated/tmp-models-common/store/store.models.ts deleted file mode 100644 index 2d9d5c7..0000000 --- a/test/generated/tmp-models-common/store/store.models.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { CommonModels } from "../common/common.models"; - -export namespace StoreModels { - export const GetInventoryResponseSchema = CommonModels.GetInventoryResponseSchema; - export const OrderSchema = CommonModels.OrderSchema; - export const OrderStatusEnumSchema = CommonModels.OrderStatusEnumSchema; - export type GetInventoryResponse = CommonModels.GetInventoryResponse; - export type Order = CommonModels.Order; - export type OrderStatusEnum = CommonModels.OrderStatusEnum; - export const OrderStatusEnum = CommonModels.OrderStatusEnum; -} diff --git a/test/generated/tmp-models-common/store/store.queries.ts b/test/generated/tmp-models-common/store/store.queries.ts deleted file mode 100644 index 335a090..0000000 --- a/test/generated/tmp-models-common/store/store.queries.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "../queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; -import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { StoreModels } from "./store.models"; -import { StoreApi } from "./store.api"; - -export namespace StoreQueries { -export const moduleName = QueryModule.store; - -export const keys = { - all: [moduleName] as const, - getInventory: () => [...keys.all, "/store/inventory", ] as const, - getOrderById: (orderId: number) => [...keys.all, "/store/order/:orderId", orderId] as const, -}; - -/** - * Query `useGetInventory` - * @summary Returns pet inventories by status - * @description Returns a map of status codes to quantities - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200] - */ -export const useGetInventory = (options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getInventory(), - queryFn: StoreApi.getInventory, - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `usePlaceOrder` - * @summary Place an order for a pet - * @description Place a new order in the store - * @param { StoreModels.Order } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, 405] - */ -export const usePlaceOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - StoreApi.placeOrder(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetOrderById` - * @summary Find purchase order by ID - * @description For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. - * @param { number } object.orderId Path parameter. ID of order that needs to be fetched - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400, 404] - */ -export const useGetOrderById = ({ orderId }: { orderId: number }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getOrderById(orderId), - queryFn: () => - StoreApi.getOrderById(orderId), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `useDeleteOrder` - * @summary Delete purchase order by ID - * @description For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors - * @param { number } mutation.orderId Path parameter. ID of the order that needs to be deleted - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [400, 404] - */ -export const useDeleteOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ orderId }) => - StoreApi.deleteOrder(orderId) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/tmp-models-common/useCrossTabQueryInvalidation.ts b/test/generated/tmp-models-common/useCrossTabQueryInvalidation.ts deleted file mode 100644 index d74d707..0000000 --- a/test/generated/tmp-models-common/useCrossTabQueryInvalidation.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { QueryClient, QueryKey } from "@tanstack/react-query"; - -const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; - -/** - * Broadcasts a query invalidation event to all other open tabs via localStorage. - * - * @param queryKeys - An array of query keys to invalidate (array of arrays). - * - * NOTE: The `storage` event only fires in *other* tabs — the calling tab - * must invalidate its own queryClient separately if needed. - */ -export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { - localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); -}; - -/** - * Registers a one-time global `storage` event listener that reacts to - * cross-tab invalidation broadcasts. Safe to call from multiple hooks — - * only the first call sets up the listener. - */ -let isListenerSetUp = false; - -export const setupCrossTabListener = (queryClient: QueryClient) => { - if (isListenerSetUp) return; - isListenerSetUp = true; - - window.addEventListener("storage", (e: StorageEvent) => { - if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; - - try { - const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; - for (const queryKey of keys) { - queryClient.invalidateQueries({ queryKey }); - } - } catch { - // Ignore malformed payloads - } - }); -}; diff --git a/test/generated/tmp-models-common/useMutationEffects.ts b/test/generated/tmp-models-common/useMutationEffects.ts deleted file mode 100644 index ed61406..0000000 --- a/test/generated/tmp-models-common/useMutationEffects.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { useCallback, useEffect } from "react"; - -import { QueryKey, useQueryClient } from "@tanstack/react-query"; -import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; -import { QueryModule } from "./queryModules"; -import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; - -export interface MutationEffectsOptions { - invalidateCurrentModule?: boolean; - crossTabInvalidation?: boolean; - invalidationMap?: InvalidationMap; - invalidateModules?: QueryModule[]; - invalidateKeys?: QueryKey[]; - preferUpdate?: boolean; -} - -export interface UseMutationEffectsProps { - currentModule: QueryModule; -} - -export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { - const queryClient = useQueryClient(); - const config = OpenApiQueryConfig.useConfig(); - - useEffect(() => { - if (!config.crossTabInvalidation) return; - setupCrossTabListener(queryClient); - }, [queryClient, config.crossTabInvalidation]); - - const runMutationEffects = useCallback( - async ( - data: TData, - variables: TVariables, - options: MutationEffectsOptions = {}, - updateKeys?: QueryKey[], - ) => { - const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; - const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; - const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; - - const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => - keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); - const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => - prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); - const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); - - const shouldInvalidateQuery = (queryKey: QueryKey) => { - const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); - if (shouldUpdate && isUpdateKey) { - return false; - } - - const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; - const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); - const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - const isMappedKey = - !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - - return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; - }; - - const invalidatedQueryKeys: QueryKey[] = []; - - queryClient.invalidateQueries({ - predicate: ({ queryKey }) => { - const shouldInvalidate = shouldInvalidateQuery(queryKey); - - if (shouldInvalidate && config.crossTabInvalidation) { - invalidatedQueryKeys.push([...queryKey]); - } - - return shouldInvalidate; - }, - }); - - if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { - broadcastQueryInvalidation(invalidatedQueryKeys); - } - - if (shouldUpdate && updateKeys) { - updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); - } - }, - [ - queryClient, - currentModule, - config.preferUpdate, - config.invalidateCurrentModule, - config.invalidationMap, - config.crossTabInvalidation, - ], - ); - - return { runMutationEffects }; -} diff --git a/test/generated/tmp-models-common/user/user.api.ts b/test/generated/tmp-models-common/user/user.api.ts deleted file mode 100644 index 69c5f69..0000000 --- a/test/generated/tmp-models-common/user/user.api.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { AppRestClient } from "../app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "../zod.extended"; -import { UserModels } from "./user.models"; - -export namespace UserApi { -export const create = (data: UserModels.User, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/user`, - ZodExtended.parse(UserModels.UserSchema.optional(), data), - - ) -}; -export const createWithListInput = (data: UserModels.CreateWithListInputBody, ) => { - return AppRestClient.post( - { resSchema: UserModels.UserSchema }, - `/user/createWithList`, - ZodExtended.parse(UserModels.CreateWithListInputBodySchema.optional(), data), - - ) -}; -export const login = (username?: string, password?: string, ) => { - return AppRestClient.get( - { resSchema: z.string() }, - `/user/login`, - { - params: { - username: ZodExtended.parse(z.string().nullish(), username, { type: "query", name: "username" }), - password: ZodExtended.parse(z.string().nullish(), password, { type: "query", name: "password" }), - }, - headers: { - 'Accept': 'application/xml', - }, - } - ) -}; -export const logout = () => { - return AppRestClient.get( - { resSchema: z.void() }, - `/user/logout`, - - ) -}; -export const getByName = (username: string, ) => { - return AppRestClient.get( - { resSchema: UserModels.UserSchema }, - `/user/${username}`, - - ) -}; -export const update = (username: string, data: UserModels.User, ) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/user/${username}`, - ZodExtended.parse(UserModels.UserSchema.optional(), data), - - ) -}; -export const deleteUser = (username: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/user/${username}`, - - ) -}; -} diff --git a/test/generated/tmp-models-common/user/user.models.ts b/test/generated/tmp-models-common/user/user.models.ts deleted file mode 100644 index b9f893b..0000000 --- a/test/generated/tmp-models-common/user/user.models.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { CommonModels } from "../common/common.models"; - -export namespace UserModels { - export const UserSchema = CommonModels.UserSchema; - export const CreateWithListInputBodySchema = CommonModels.CreateWithListInputBodySchema; - export type User = CommonModels.User; - export type CreateWithListInputBody = CommonModels.CreateWithListInputBody; -} diff --git a/test/generated/tmp-models-common/user/user.queries.ts b/test/generated/tmp-models-common/user/user.queries.ts deleted file mode 100644 index a3dabbc..0000000 --- a/test/generated/tmp-models-common/user/user.queries.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "../queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; -import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { UserModels } from "./user.models"; -import { UserApi } from "./user.api"; - -export namespace UserQueries { -export const moduleName = QueryModule.user; - -export const keys = { - all: [moduleName] as const, - login: (username?: string, password?: string) => [...keys.all, "/user/login", username, password] as const, - logout: () => [...keys.all, "/user/logout", ] as const, - getByName: (username: string) => [...keys.all, "/user/:username", username] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create user - * @description This can only be done by the logged in user. - * @param { UserModels.User } mutation.data Body parameter. Created user object - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [default] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - UserApi.create(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.logout()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateWithListInput` - * @summary Creates list of users with given input array - * @description Creates list of users with given input array - * @param { UserModels.CreateWithListInputBody } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, default] - */ -export const useCreateWithListInput = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - UserApi.createWithListInput(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useLogin` - * @summary Logs user into the system - * @param { string } object.username Query parameter. The user name for login - * @param { string } object.password Query parameter. The password for login in clear text - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400] - */ -export const useLogin = ({ username, password }: { username?: string, password?: string }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.login(username, password), - queryFn: () => - UserApi.login(username, password), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useLogout` - * @summary Logs out current logged in user session - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [default] - */ -export const useLogout = (options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.logout(), - queryFn: UserApi.logout, - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useGetByName` - * @summary Get user by user name - * @param { string } object.username Path parameter. The name that needs to be fetched. Use user1 for testing. - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400, 404] - */ -export const useGetByName = ({ username }: { username: string }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getByName(username), - queryFn: () => - UserApi.getByName(username), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update user - * @description This can only be done by the logged in user. - * @param { string } mutation.username Path parameter. name that need to be deleted - * @param { UserModels.User } mutation.data Body parameter. Update an existent user in the store - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [default] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ username, data }) => - UserApi.update(username, data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.logout()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteUser` - * @summary Delete user - * @description This can only be done by the logged in user. - * @param { string } mutation.username Path parameter. The name that needs to be deleted - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [400, 404] - */ -export const useDeleteUser = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ username }) => - UserApi.deleteUser(username) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.logout()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/tmp-models-common/zod.extended.ts b/test/generated/tmp-models-common/zod.extended.ts deleted file mode 100644 index 81e1e02..0000000 --- a/test/generated/tmp-models-common/zod.extended.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from "zod"; -import { ErrorHandler, SharedErrorHandler } from ""; - -export namespace ZodExtended { - interface ParseOptions { - type: "body" | "query"; - name?: string; - errorHandler?: ErrorHandler; - } - - export function parse( - schema: z.ZodType, - data: unknown, - { type, name, errorHandler }: ParseOptions = { type: "body" }, - ) { - try { - return schema.parse(data); - } catch (e) { - if (e instanceof z.ZodError) { - e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; - } - (errorHandler ?? SharedErrorHandler).rethrowError(e); - throw e; - } - } - - function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { - if (data === undefined || data === "" || enumSchema.options.length === 0) { - return true; - } - - const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; - const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; - return new RegExp(`^${commaSeparatedOptions}$`).test(data); - } - - export const sortExp = (enumSchema: z.ZodEnum) => - z.string().superRefine((arg, ctx) => { - if (!isSortExpValid(enumSchema, arg)) { - ctx.addIssue({ - code: "invalid_value", - message: "Invalid sorting string.", - values: [], - }); - } - }); -} diff --git a/test/generated/tmp-onerror/.openapi-codegen-cache.json b/test/generated/tmp-onerror/.openapi-codegen-cache.json deleted file mode 100644 index 9624e8a..0000000 --- a/test/generated/tmp-onerror/.openapi-codegen-cache.json +++ /dev/null @@ -1 +0,0 @@ -{"openApiHash":"bcc2bcf5","optionsHash":"f50c4ca3"} \ No newline at end of file diff --git a/test/generated/tmp-onerror/acl/app.ability.ts b/test/generated/tmp-onerror/acl/app.ability.ts deleted file mode 100644 index 6c06fc9..0000000 --- a/test/generated/tmp-onerror/acl/app.ability.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { PureAbility, AbilityTuple, Subject } from "@casl/ability"; - -export type AppAbilities = AbilityTuple; - -export type AppAbility = PureAbility; \ No newline at end of file diff --git a/test/generated/tmp-onerror/acl/useAclCheck.ts b/test/generated/tmp-onerror/acl/useAclCheck.ts deleted file mode 100644 index 5e19407..0000000 --- a/test/generated/tmp-onerror/acl/useAclCheck.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AbilityTuple } from "@casl/ability"; -import { type ErrorHandler, SharedErrorHandler } from ""; -import { AbilityContext } from ""; -import { useCallback } from "react"; -import { AppAbilities } from "../acl/app.ability"; - -interface UseAclCheckProps { - errorHandler?: ErrorHandler; -} - -export function useAclCheck({ errorHandler }: UseAclCheckProps = {}) { - const ability = AbilityContext.useAbility(); - - const checkAcl = useCallback((appAbility: AppAbilities) => { - if (!ability.can(...(appAbility as AbilityTuple))) { - (errorHandler ?? SharedErrorHandler).rethrowError(new Error("ACL check failed")); - } - }, [ability, errorHandler]); - - return { checkAcl }; -} diff --git a/test/generated/tmp-onerror/app-rest-client.ts b/test/generated/tmp-onerror/app-rest-client.ts deleted file mode 100644 index 493b224..0000000 --- a/test/generated/tmp-onerror/app-rest-client.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { RestClient } from "@povio/openapi-codegen-cli"; - -export const AppRestClient = new RestClient({ - config: { - baseURL: "https://petstore3.swagger.io/api/v3" - }, -}); diff --git a/test/generated/tmp-onerror/pet/pet.api.ts b/test/generated/tmp-onerror/pet/pet.api.ts deleted file mode 100644 index 94fd0ed..0000000 --- a/test/generated/tmp-onerror/pet/pet.api.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { AppRestClient } from "../app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "../zod.extended"; -import { PetModels } from "./pet.models"; - -export namespace PetApi { -export const update = (data: PetModels.Pet, ) => { - return AppRestClient.put( - { resSchema: PetModels.PetSchema }, - `/pet`, - ZodExtended.parse(PetModels.PetSchema, data), - - ) -}; -export const add = (data: PetModels.Pet, ) => { - return AppRestClient.post( - { resSchema: PetModels.PetSchema }, - `/pet`, - ZodExtended.parse(PetModels.PetSchema, data), - - ) -}; -export const findByStatus = (status?: PetModels.FindByStatusStatusParam, ) => { - return AppRestClient.get( - { resSchema: PetModels.FindByStatusResponseSchema }, - `/pet/findByStatus`, - { - params: { - status: ZodExtended.parse(PetModels.FindByStatusStatusParamSchema.optional(), status, { type: "query", name: "status" }), - }, - } - ) -}; -export const findByTags = (tags?: PetModels.FindByTagsTagsParam, ) => { - return AppRestClient.get( - { resSchema: PetModels.FindByTagsResponseSchema }, - `/pet/findByTags`, - { - params: { - tags: ZodExtended.parse(PetModels.FindByTagsTagsParamSchema.optional(), tags, { type: "query", name: "tags" }), - }, - } - ) -}; -export const getById = (petId: number, ) => { - return AppRestClient.get( - { resSchema: PetModels.PetSchema }, - `/pet/${petId}`, - - ) -}; -export const updateWithForm = (petId: number, name: string, status: string, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/pet/${petId}`, - undefined, - { - params: { - name: ZodExtended.parse(z.string().nullish(), name, { type: "query", name: "name" }), - status: ZodExtended.parse(z.string().nullish(), status, { type: "query", name: "status" }), - }, - } - ) -}; -export const deletePet = (petId: number, api_key?: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/pet/${petId}`, - undefined, - { - headers: { - 'api_key': api_key, - }, - } - ) -}; -export const uploadFile = (petId: number, data: string, additionalMetadata?: string, ) => { - return AppRestClient.post( - { resSchema: PetModels.ApiResponseSchema }, - `/pet/${petId}/uploadImage`, - ZodExtended.parse(z.instanceof(Blob), data), - { - params: { - additionalMetadata: ZodExtended.parse(z.string().nullish(), additionalMetadata, { type: "query", name: "additionalMetadata" }), - }, - headers: { - 'Content-Type': 'application/octet-stream', - }, - } - ) -}; -} diff --git a/test/generated/tmp-onerror/pet/pet.models.ts b/test/generated/tmp-onerror/pet/pet.models.ts deleted file mode 100644 index 2b7a204..0000000 --- a/test/generated/tmp-onerror/pet/pet.models.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { z } from "zod"; - -export namespace PetModels { -/** - * FindByStatusStatusEnumSchema - * @type { enum } - * @description pet status in the store. Default: `available` - */ -export const FindByStatusStatusEnumSchema = z.enum(["available", "pending", "sold"]); -export type FindByStatusStatusEnum = z.infer; -export const FindByStatusStatusEnum = FindByStatusStatusEnumSchema.enum; - -/** - * CategorySchema - * @type { object } - * @property { integer } id Example: `1` - * @property { string } name Example: `Dogs` - */ -export const CategorySchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); -export type Category = z.infer; - -/** - * TagSchema - * @type { object } - * @property { integer } id - * @property { string } name - */ -export const TagSchema = z.object({ id: z.int().nullable(), name: z.string().nullable() }).partial(); -export type Tag = z.infer; - -/** - * PetSchema - * @type { object } - * @property { integer } id Example: `10` - * @property { string } name Example: `doggie` - * @property { Category } category - * @property { string[] } photoUrls - * @property { Tag[] } tags - * @property { string } status pet status in the store - */ -export const PetSchema = z.object({ id: z.int().nullish(), name: z.string(), category: CategorySchema.nullish(), photoUrls: z.array(z.string()), tags: z.array(TagSchema).nullish(), status: FindByStatusStatusEnumSchema.nullish() }); -export type Pet = z.infer; - -/** - * ApiResponseSchema - * @type { object } - * @property { integer } code - * @property { string } type - * @property { string } message - */ -export const ApiResponseSchema = z.object({ code: z.int().nullable(), type: z.string().nullable(), message: z.string().nullable() }).partial(); -export type ApiResponse = z.infer; - -/** - * FindByStatusStatusParamSchema - * @type { string } - * @description Default: `available` - */ -export const FindByStatusStatusParamSchema = FindByStatusStatusEnumSchema.nullish().default("available"); -export type FindByStatusStatusParam = z.infer; - -/** - * FindByStatusResponseSchema - * @type { array } - */ -export const FindByStatusResponseSchema = z.array(PetSchema); -export type FindByStatusResponse = z.infer; - -/** - * FindByTagsTagsParamSchema - * @type { array } - */ -export const FindByTagsTagsParamSchema = z.array(z.string()).nullish(); -export type FindByTagsTagsParam = z.infer; - -/** - * FindByTagsResponseSchema - * @type { array } - */ -export const FindByTagsResponseSchema = z.array(PetSchema); -export type FindByTagsResponse = z.infer; - -} diff --git a/test/generated/tmp-onerror/pet/pet.queries.ts b/test/generated/tmp-onerror/pet/pet.queries.ts deleted file mode 100644 index b19320b..0000000 --- a/test/generated/tmp-onerror/pet/pet.queries.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "../queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; -import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { PetModels } from "./pet.models"; -import { PetApi } from "./pet.api"; - -export namespace PetQueries { -export const moduleName = QueryModule.pet; - -export const keys = { - all: [moduleName] as const, - findByStatus: (status?: PetModels.FindByStatusStatusParam) => [...keys.all, "/pet/findByStatus", status] as const, - findByTags: (tags?: PetModels.FindByTagsTagsParam) => [...keys.all, "/pet/findByTags", tags] as const, - getById: (petId: number) => [...keys.all, "/pet/:petId", petId] as const, -}; - -/** - * Mutation `useUpdate` - * @summary Update an existing pet - * @description Update an existing pet by Id - * @param { PetModels.Pet } mutation.data Body parameter. Update an existent pet in the store - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, 400, 404, 405] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - PetApi.update(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useAdd` - * @summary Add a new pet to the store - * @description Add a new pet to the store - * @param { PetModels.Pet } mutation.data Body parameter. Create a new pet in the store - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, 405] - */ -export const useAdd = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - PetApi.add(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useFindByStatus` - * @summary Finds Pets by status - * @description Multiple status values can be provided with comma separated strings - * @param { PetModels.FindByStatusStatusParam } object.status Query parameter. Status values that need to be considered for filter. Default: `available` - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400] - */ -export const useFindByStatus = ({ status }: { status?: PetModels.FindByStatusStatusParam }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.findByStatus(status), - queryFn: () => - PetApi.findByStatus(status), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useFindByTags` - * @summary Finds Pets by tags - * @description Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. - * @param { PetModels.FindByTagsTagsParam } object.tags Query parameter. Tags to filter by - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400] - */ -export const useFindByTags = ({ tags }: { tags?: PetModels.FindByTagsTagsParam }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.findByTags(tags), - queryFn: () => - PetApi.findByTags(tags), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useGetById` - * @summary Find pet by ID - * @description Returns a single pet - * @param { number } object.petId Path parameter. ID of pet to return - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400, 404] - */ -export const useGetById = ({ petId }: { petId: number }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getById(petId), - queryFn: () => - PetApi.getById(petId), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `useUpdateWithForm` - * @summary Updates a pet in the store with form data - * @param { number } mutation.petId Path parameter. ID of pet that needs to be updated - * @param { string } mutation.name Query parameter. Name of pet that needs to be updated - * @param { string } mutation.status Query parameter. Status of pet that needs to be updated - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [405] - */ -export const useUpdateWithForm = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ petId, name, status }) => - PetApi.updateWithForm(petId, name, status) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeletePet` - * @summary Deletes a pet - * @description delete a pet - * @param { number } mutation.petId Path parameter. Pet id to delete - * @param { string } mutation.api_key Header parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [400] - */ -export const useDeletePet = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ petId, api_key }) => - PetApi.deletePet(petId, api_key) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useUploadFile` - * @summary uploads an image - * @param { number } mutation.petId Path parameter. ID of pet to update - * @param { string } mutation.data Body parameter - * @param { string } mutation.additionalMetadata Query parameter. Additional Metadata - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200] - */ -export const useUploadFile = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ petId, data, additionalMetadata }) => - PetApi.uploadFile(petId, data, additionalMetadata) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/tmp-onerror/queryModules.ts b/test/generated/tmp-onerror/queryModules.ts deleted file mode 100644 index c815cfe..0000000 --- a/test/generated/tmp-onerror/queryModules.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const enum QueryModule { - pet = "PetQueries", - store = "StoreQueries", - user = "UserQueries", -} \ No newline at end of file diff --git a/test/generated/tmp-onerror/store/store.api.ts b/test/generated/tmp-onerror/store/store.api.ts deleted file mode 100644 index 7a4712b..0000000 --- a/test/generated/tmp-onerror/store/store.api.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { AppRestClient } from "../app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "../zod.extended"; -import { StoreModels } from "./store.models"; - -export namespace StoreApi { -export const getInventory = () => { - return AppRestClient.get( - { resSchema: StoreModels.GetInventoryResponseSchema }, - `/store/inventory`, - - ) -}; -export const placeOrder = (data: StoreModels.Order, ) => { - return AppRestClient.post( - { resSchema: StoreModels.OrderSchema }, - `/store/order`, - ZodExtended.parse(StoreModels.OrderSchema.optional(), data), - - ) -}; -export const getOrderById = (orderId: number, ) => { - return AppRestClient.get( - { resSchema: StoreModels.OrderSchema }, - `/store/order/${orderId}`, - - ) -}; -export const deleteOrder = (orderId: number, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/store/order/${orderId}`, - - ) -}; -} diff --git a/test/generated/tmp-onerror/store/store.models.ts b/test/generated/tmp-onerror/store/store.models.ts deleted file mode 100644 index 3e4cc16..0000000 --- a/test/generated/tmp-onerror/store/store.models.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { z } from "zod"; - -export namespace StoreModels { -/** - * OrderStatusEnumSchema - * @type { enum } - * @description Order Status. Example: `approved` - */ -export const OrderStatusEnumSchema = z.enum(["placed", "approved", "delivered"]); -export type OrderStatusEnum = z.infer; -export const OrderStatusEnum = OrderStatusEnumSchema.enum; - -/** - * OrderSchema - * @type { object } - * @property { integer } id Example: `10` - * @property { integer } petId Example: `198772` - * @property { integer } quantity Example: `7` - * @property { string } shipDate - * @property { string } status Order Status. Example: `approved` - * @property { boolean } complete - */ -export const OrderSchema = z.object({ id: z.int().nullable(), petId: z.int().nullable(), quantity: z.int().nullable(), shipDate: z.iso.datetime({ offset: true }).nullable(), status: OrderStatusEnumSchema.nullable(), complete: z.boolean().nullable() }).partial(); -export type Order = z.infer; - -/** - * GetInventoryResponseSchema - * @type { object } - * @property { integer } [key] - */ -export const GetInventoryResponseSchema = z.object({}).catchall(z.int()); -export type GetInventoryResponse = z.infer; - -} diff --git a/test/generated/tmp-onerror/store/store.queries.ts b/test/generated/tmp-onerror/store/store.queries.ts deleted file mode 100644 index 335a090..0000000 --- a/test/generated/tmp-onerror/store/store.queries.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "../queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; -import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { StoreModels } from "./store.models"; -import { StoreApi } from "./store.api"; - -export namespace StoreQueries { -export const moduleName = QueryModule.store; - -export const keys = { - all: [moduleName] as const, - getInventory: () => [...keys.all, "/store/inventory", ] as const, - getOrderById: (orderId: number) => [...keys.all, "/store/order/:orderId", orderId] as const, -}; - -/** - * Query `useGetInventory` - * @summary Returns pet inventories by status - * @description Returns a map of status codes to quantities - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200] - */ -export const useGetInventory = (options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getInventory(), - queryFn: StoreApi.getInventory, - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `usePlaceOrder` - * @summary Place an order for a pet - * @description Place a new order in the store - * @param { StoreModels.Order } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, 405] - */ -export const usePlaceOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - StoreApi.placeOrder(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useGetOrderById` - * @summary Find purchase order by ID - * @description For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions. - * @param { number } object.orderId Path parameter. ID of order that needs to be fetched - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400, 404] - */ -export const useGetOrderById = ({ orderId }: { orderId: number }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getOrderById(orderId), - queryFn: () => - StoreApi.getOrderById(orderId), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `useDeleteOrder` - * @summary Delete purchase order by ID - * @description For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors - * @param { number } mutation.orderId Path parameter. ID of the order that needs to be deleted - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [400, 404] - */ -export const useDeleteOrder = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ orderId }) => - StoreApi.deleteOrder(orderId) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/tmp-onerror/useCrossTabQueryInvalidation.ts b/test/generated/tmp-onerror/useCrossTabQueryInvalidation.ts deleted file mode 100644 index d74d707..0000000 --- a/test/generated/tmp-onerror/useCrossTabQueryInvalidation.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { QueryClient, QueryKey } from "@tanstack/react-query"; - -const CROSS_TAB_INVALIDATE_KEY = "__rq_invalidate__"; - -/** - * Broadcasts a query invalidation event to all other open tabs via localStorage. - * - * @param queryKeys - An array of query keys to invalidate (array of arrays). - * - * NOTE: The `storage` event only fires in *other* tabs — the calling tab - * must invalidate its own queryClient separately if needed. - */ -export const broadcastQueryInvalidation = (queryKeys: QueryKey[]) => { - localStorage.setItem(CROSS_TAB_INVALIDATE_KEY, JSON.stringify({ keys: queryKeys, timestamp: Date.now() })); -}; - -/** - * Registers a one-time global `storage` event listener that reacts to - * cross-tab invalidation broadcasts. Safe to call from multiple hooks — - * only the first call sets up the listener. - */ -let isListenerSetUp = false; - -export const setupCrossTabListener = (queryClient: QueryClient) => { - if (isListenerSetUp) return; - isListenerSetUp = true; - - window.addEventListener("storage", (e: StorageEvent) => { - if (e.key !== CROSS_TAB_INVALIDATE_KEY || !e.newValue) return; - - try { - const { keys } = JSON.parse(e.newValue) as { keys: QueryKey[] }; - for (const queryKey of keys) { - queryClient.invalidateQueries({ queryKey }); - } - } catch { - // Ignore malformed payloads - } - }); -}; diff --git a/test/generated/tmp-onerror/useMutationEffects.ts b/test/generated/tmp-onerror/useMutationEffects.ts deleted file mode 100644 index ed61406..0000000 --- a/test/generated/tmp-onerror/useMutationEffects.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { useCallback, useEffect } from "react"; - -import { QueryKey, useQueryClient } from "@tanstack/react-query"; -import { OpenApiQueryConfig, InvalidationMap } from "@povio/openapi-codegen-cli"; -import { QueryModule } from "./queryModules"; -import { broadcastQueryInvalidation, setupCrossTabListener } from "./useCrossTabQueryInvalidation"; - -export interface MutationEffectsOptions { - invalidateCurrentModule?: boolean; - crossTabInvalidation?: boolean; - invalidationMap?: InvalidationMap; - invalidateModules?: QueryModule[]; - invalidateKeys?: QueryKey[]; - preferUpdate?: boolean; -} - -export interface UseMutationEffectsProps { - currentModule: QueryModule; -} - -export function useMutationEffects({ currentModule }: UseMutationEffectsProps) { - const queryClient = useQueryClient(); - const config = OpenApiQueryConfig.useConfig(); - - useEffect(() => { - if (!config.crossTabInvalidation) return; - setupCrossTabListener(queryClient); - }, [queryClient, config.crossTabInvalidation]); - - const runMutationEffects = useCallback( - async ( - data: TData, - variables: TVariables, - options: MutationEffectsOptions = {}, - updateKeys?: QueryKey[], - ) => { - const { invalidateCurrentModule, invalidateModules, invalidateKeys, preferUpdate } = options; - const shouldUpdate = preferUpdate ?? config.preferUpdate ?? false; - const shouldInvalidateCurrentModule = invalidateCurrentModule ?? config.invalidateCurrentModule ?? true; - - const isQueryKeyEqual = (keyA: QueryKey, keyB: QueryKey) => - keyA.length === keyB.length && keyA.every((item, index) => item === keyB[index]); - const isQueryKeyPrefix = (queryKey: QueryKey, prefixKey: QueryKey) => - prefixKey.length <= queryKey.length && prefixKey.every((item, index) => item === queryKey[index]); - const mappedInvalidationKeys = config.invalidationMap?.[currentModule]?.(data, variables); - - const shouldInvalidateQuery = (queryKey: QueryKey) => { - const isUpdateKey = updateKeys?.some((key) => isQueryKeyEqual(queryKey, key)); - if (shouldUpdate && isUpdateKey) { - return false; - } - - const isCurrentModule = shouldInvalidateCurrentModule && queryKey[0] === currentModule; - const isInvalidateModule = !!invalidateModules && invalidateModules.some((module) => queryKey[0] === module); - const isInvalidateKey = !!invalidateKeys && invalidateKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - const isMappedKey = - !!mappedInvalidationKeys && mappedInvalidationKeys.some((key) => isQueryKeyPrefix(queryKey, key)); - - return isCurrentModule || isInvalidateModule || isInvalidateKey || isMappedKey; - }; - - const invalidatedQueryKeys: QueryKey[] = []; - - queryClient.invalidateQueries({ - predicate: ({ queryKey }) => { - const shouldInvalidate = shouldInvalidateQuery(queryKey); - - if (shouldInvalidate && config.crossTabInvalidation) { - invalidatedQueryKeys.push([...queryKey]); - } - - return shouldInvalidate; - }, - }); - - if (config.crossTabInvalidation && invalidatedQueryKeys.length > 0) { - broadcastQueryInvalidation(invalidatedQueryKeys); - } - - if (shouldUpdate && updateKeys) { - updateKeys.map((queryKey) => queryClient.setQueryData(queryKey, data)); - } - }, - [ - queryClient, - currentModule, - config.preferUpdate, - config.invalidateCurrentModule, - config.invalidationMap, - config.crossTabInvalidation, - ], - ); - - return { runMutationEffects }; -} diff --git a/test/generated/tmp-onerror/user/user.api.ts b/test/generated/tmp-onerror/user/user.api.ts deleted file mode 100644 index 69c5f69..0000000 --- a/test/generated/tmp-onerror/user/user.api.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { AppRestClient } from "../app-rest-client"; -import { z } from "zod"; -import { ZodExtended } from "../zod.extended"; -import { UserModels } from "./user.models"; - -export namespace UserApi { -export const create = (data: UserModels.User, ) => { - return AppRestClient.post( - { resSchema: z.void() }, - `/user`, - ZodExtended.parse(UserModels.UserSchema.optional(), data), - - ) -}; -export const createWithListInput = (data: UserModels.CreateWithListInputBody, ) => { - return AppRestClient.post( - { resSchema: UserModels.UserSchema }, - `/user/createWithList`, - ZodExtended.parse(UserModels.CreateWithListInputBodySchema.optional(), data), - - ) -}; -export const login = (username?: string, password?: string, ) => { - return AppRestClient.get( - { resSchema: z.string() }, - `/user/login`, - { - params: { - username: ZodExtended.parse(z.string().nullish(), username, { type: "query", name: "username" }), - password: ZodExtended.parse(z.string().nullish(), password, { type: "query", name: "password" }), - }, - headers: { - 'Accept': 'application/xml', - }, - } - ) -}; -export const logout = () => { - return AppRestClient.get( - { resSchema: z.void() }, - `/user/logout`, - - ) -}; -export const getByName = (username: string, ) => { - return AppRestClient.get( - { resSchema: UserModels.UserSchema }, - `/user/${username}`, - - ) -}; -export const update = (username: string, data: UserModels.User, ) => { - return AppRestClient.put( - { resSchema: z.void() }, - `/user/${username}`, - ZodExtended.parse(UserModels.UserSchema.optional(), data), - - ) -}; -export const deleteUser = (username: string, ) => { - return AppRestClient.delete( - { resSchema: z.void() }, - `/user/${username}`, - - ) -}; -} diff --git a/test/generated/tmp-onerror/user/user.models.ts b/test/generated/tmp-onerror/user/user.models.ts deleted file mode 100644 index c6a09e7..0000000 --- a/test/generated/tmp-onerror/user/user.models.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { z } from "zod"; - -export namespace UserModels { -/** - * UserSchema - * @type { object } - * @property { integer } id Example: `10` - * @property { string } username Example: `theUser` - * @property { string } firstName Example: `John` - * @property { string } lastName Example: `James` - * @property { string } email Example: `john@email.com` - * @property { string } password Example: `12345` - * @property { string } phone Example: `12345` - * @property { integer } userStatus User Status. Example: `1` - */ -export const UserSchema = z.object({ id: z.int().nullable(), username: z.string().nullable(), firstName: z.string().nullable(), lastName: z.string().nullable(), email: z.string().nullable(), password: z.string().nullable(), phone: z.string().nullable(), userStatus: z.int().nullable() }).partial(); -export type User = z.infer; - -/** - * CreateWithListInputBodySchema - * @type { array } - */ -export const CreateWithListInputBodySchema = z.array(UserSchema); -export type CreateWithListInputBody = z.infer; - -} diff --git a/test/generated/tmp-onerror/user/user.queries.ts b/test/generated/tmp-onerror/user/user.queries.ts deleted file mode 100644 index a3dabbc..0000000 --- a/test/generated/tmp-onerror/user/user.queries.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; -import { QueryModule } from "../queryModules"; -import { MutationEffectsOptions, useMutationEffects } from "../useMutationEffects"; -import { OpenApiQueryConfig, AppQueryOptions, AppMutationOptions } from "@povio/openapi-codegen-cli"; -import { UserModels } from "./user.models"; -import { UserApi } from "./user.api"; - -export namespace UserQueries { -export const moduleName = QueryModule.user; - -export const keys = { - all: [moduleName] as const, - login: (username?: string, password?: string) => [...keys.all, "/user/login", username, password] as const, - logout: () => [...keys.all, "/user/logout", ] as const, - getByName: (username: string) => [...keys.all, "/user/:username", username] as const, -}; - -/** - * Mutation `useCreate` - * @summary Create user - * @description This can only be done by the logged in user. - * @param { UserModels.User } mutation.data Body parameter. Created user object - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [default] - */ -export const useCreate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - UserApi.create(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.logout()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useCreateWithListInput` - * @summary Creates list of users with given input array - * @description Creates list of users with given input array - * @param { UserModels.CreateWithListInputBody } mutation.data Body parameter - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } Successful operation - * @statusCodes [200, default] - */ -export const useCreateWithListInput = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ data }) => - UserApi.createWithListInput(data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - await runMutationEffects(resData, variables, options); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Query `useLogin` - * @summary Logs user into the system - * @param { string } object.username Query parameter. The user name for login - * @param { string } object.password Query parameter. The password for login in clear text - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400] - */ -export const useLogin = ({ username, password }: { username?: string, password?: string }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.login(username, password), - queryFn: () => - UserApi.login(username, password), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useLogout` - * @summary Logs out current logged in user session - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } - * @statusCodes [default] - */ -export const useLogout = (options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.logout(), - queryFn: UserApi.logout, - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Query `useGetByName` - * @summary Get user by user name - * @param { string } object.username Path parameter. The name that needs to be fetched. Use user1 for testing. - * @param { AppQueryOptions } options Query options - * @returns { UseQueryResult } Successful operation - * @statusCodes [200, 400, 404] - */ -export const useGetByName = ({ username }: { username: string }, options?: AppQueryOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - - return useQuery({ - queryKey: keys.getByName(username), - queryFn: () => - UserApi.getByName(username), - ...options, - onError: options?.onError ?? queryConfig.onError, - }); -}; - -/** - * Mutation `useUpdate` - * @summary Update user - * @description This can only be done by the logged in user. - * @param { string } mutation.username Path parameter. name that need to be deleted - * @param { UserModels.User } mutation.data Body parameter. Update an existent user in the store - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [default] - */ -export const useUpdate = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ username, data }) => - UserApi.update(username, data) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.logout()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -/** - * Mutation `useDeleteUser` - * @summary Delete user - * @description This can only be done by the logged in user. - * @param { string } mutation.username Path parameter. The name that needs to be deleted - * @param { AppMutationOptions & MutationEffectsOptions } options Mutation options - * @returns { UseMutationResult } - * @statusCodes [400, 404] - */ -export const useDeleteUser = (options?: AppMutationOptions & MutationEffectsOptions) => { - const queryConfig = OpenApiQueryConfig.useConfig(); - const { runMutationEffects } = useMutationEffects({ currentModule: moduleName }); - - return useMutation({ - mutationFn: ({ username }) => - UserApi.deleteUser(username) -, - ...options, - onError: options?.onError ?? queryConfig.onError, - onSuccess: async (resData, variables, onMutateResult, context) => { - const updateKeys = [keys.logout()]; - await runMutationEffects(resData, variables, options, updateKeys); - options?.onSuccess?.(resData, variables, onMutateResult, context); - }, - }); -}; - -} diff --git a/test/generated/tmp-onerror/zod.extended.ts b/test/generated/tmp-onerror/zod.extended.ts deleted file mode 100644 index 81e1e02..0000000 --- a/test/generated/tmp-onerror/zod.extended.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from "zod"; -import { ErrorHandler, SharedErrorHandler } from ""; - -export namespace ZodExtended { - interface ParseOptions { - type: "body" | "query"; - name?: string; - errorHandler?: ErrorHandler; - } - - export function parse( - schema: z.ZodType, - data: unknown, - { type, name, errorHandler }: ParseOptions = { type: "body" }, - ) { - try { - return schema.parse(data); - } catch (e) { - if (e instanceof z.ZodError) { - e.name = `FE Request ${type === "body" ? "body" : "query param"}${name ? ` ("${name}")` : ""} schema mismatch - ZodError`; - } - (errorHandler ?? SharedErrorHandler).rethrowError(e); - throw e; - } - } - - function isSortExpValid(enumSchema: z.ZodEnum, data?: string) { - if (data === undefined || data === "" || enumSchema.options.length === 0) { - return true; - } - - const prefixedEnumOptions = `([+-]?(${enumSchema.options.join("|")}))`; - const commaSeparatedOptions = `(${prefixedEnumOptions})(\s*,\s*${prefixedEnumOptions})*`; - return new RegExp(`^${commaSeparatedOptions}$`).test(data); - } - - export const sortExp = (enumSchema: z.ZodEnum) => - z.string().superRefine((arg, ctx) => { - if (!isSortExpValid(enumSchema, arg)) { - ctx.addIssue({ - code: "invalid_value", - message: "Invalid sorting string.", - values: [], - }); - } - }); -}
    2. Wu7_-DbXFE)995W@%Ng$u=^5 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 z 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

  • Wu7_-DbXFE)995W@%Ng$u=^5 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 z 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